20150401 作业2 结对 四则运算(Doing)

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class SE2_1 {// Software Engineering 軟件工程 作業2
    public RN getAnswer(RN[] Operand, String[] AS) {
        ArrayList<String> A = new ArrayList<String>();
        ArrayList<RN> O = new ArrayList<RN>();
        RN temp = new RN();
        temp.setSign(0);
        System.out.println();
        for (String as : AS){
            A.add(as);
            System.out.print(as+"  ");
        }
        System.out.println();
        for (RN op : Operand) {
            O.add(op);
            System.out.print(op.getNumber()+"  ");
        }
        System.out.println();
        while (A.get(0) != "=") {
            if (A.contains("×") || A.contains("÷")) {
                if (((A.contains("×") ^ A.contains("÷")) == true ? (A
                        .contains("×") == true ? true : false) : (A
                        .indexOf("×") < A.indexOf("÷") ? true : false))) {
                    int index = A.indexOf("×");
                    System.out.print(index + " × ");
                    System.out.println(O.get(index).getNumber()
                            + "*"
                            + O.get(index + 1).getNumber()
                            + "="
                            + (O.get(index).getNumber() * O.get(index + 1)
                                    .getNumber()));
                    temp.setDecimal((O.get(index).getNumber()
                            * O.get(index + 1).getNumber()));
                    O.set(index, temp);
                    System.out.println("here set " + O.get(index).getNumber() +" at " +index);
                    System.out.println("here remove " + O.get(index+1).getNumber()+" from "+(index+1)+" and remove "+ A.get(index)+" from "+index);
                    O.remove(index + 1);
                    A.remove(index);
                } else {
                    int index = A.indexOf("÷");
                    System.out.print(index + " ÷ ");
                    System.out.println(O.get(index).getNumber()
                            + "/"
                            + O.get(index + 1).getNumber()
                            + "="
                            + (O.get(index).getNumber() / O.get(index + 1)
                                    .getNumber()));
                    temp.setDecimal((O.get(index).getNumber()
                            / O.get(index + 1).getNumber()));
                    O.set(index, temp);
                    System.out.println("here set " + O.get(index).getNumber() +" at " +index);
                    System.out.println("here remove " + O.get(index+1).getNumber()+" from "+(index+1)+" and remove "+ A.get(index)+" from "+index);
                    O.remove(index + 1);
                    A.remove(index);
                }
            } else if (A.contains("+") || A.contains("-")) {
                if (((A.contains("+") ^ A.contains("-")) == true ? (A
                        .contains("+") == true ? true : false) : (A
                        .indexOf("+") < A.indexOf("-") ? true : false))) {
                    int index = A.indexOf("+");
                    System.out.print(index + " + ");
                    System.out.println(O.get(index).getNumber()
                            + "+"
                            + O.get(index + 1).getNumber()
                            + "="
                            + (O.get(index).getNumber() + O.get(index + 1)
                                    .getNumber()));
                    temp.setDecimal((O.get(index).getNumber()
                            + O.get(index + 1).getNumber()));
                    O.set(index, temp);
                    System.out.println("here set " + O.get(index).getNumber() +" at " +index);
                    System.out.println("here remove " + O.get(index+1).getNumber()+" from "+(index+1)+" and remove "+ A.get(index)+" from "+index);
                    O.remove(index + 1);
                    A.remove(index);
                } else {
                    int index = A.indexOf("-");
                    System.out.print(index + " - ");
                    System.out.println(O.get(index).getNumber()
                            + "-"
                            + O.get(index + 1).getNumber()
                            + "="
                            + (O.get(index).getNumber() - O.get(index + 1)
                                    .getNumber()));
                    temp.setDecimal((O.get(index).getNumber()
                            - O.get(index + 1).getNumber()));
                    O.set(index, temp);
                    System.out.println("here set " + O.get(index).getNumber() +" at " +index);
                    System.out.println("here remove " + O.get(index+1).getNumber()+" from "+(index+1)+" and remove "+ A.get(index)+" from "+index);
                    O.remove(index + 1);
                    A.remove(index);
                }
            }
            // if (A.contains("×")) {
            // int index = A.indexOf("×");
            // System.out.print(index + " × ");
            // System.out.println(O.get(index).getNumber() + "*"
            // + O.get(index + 1).getNumber() + "="
            // + O.get(index).getNumber()
            // * O.get(index + 1).getNumber());
            // temp.setDecimal(O.get(index).getNumber()
            // * O.get(index + 1).getNumber());
            // temp.setSign(0);
            // O.set(index, temp);
            // O.remove(index + 1);
            // A.remove(index);
            // } else if (A.contains("÷")) {
            // int index = A.indexOf("÷");
            // System.out.print(index + " ÷ ");
            // System.out.println(O.get(index).getNumber() + "/"
            // + O.get(index + 1).getNumber() + "="
            // + O.get(index).getNumber()
            // / O.get(index + 1).getNumber());
            // temp.setDecimal(O.get(index).getNumber()
            // / O.get(index + 1).getNumber());
            // temp.setSign(0);
            // O.set(index, temp);
            // O.remove(index + 1);
            // A.remove(index);
            // }
            // else if (A.contains("+")) {
            // int index = A.indexOf("+");
            // System.out.print(index + " + ");
            // System.out.println(O.get(index).getNumber() + "+"
            // + O.get(index + 1).getNumber() + "="
            // + O.get(index).getNumber()
            // + O.get(index + 1).getNumber());
            // temp.setDecimal(O.get(index).getNumber()
            // + O.get(index + 1).getNumber());
            // temp.setSign(0);
            // O.set(index, temp);
            // O.remove(index + 1);
            // A.remove(index);
            // } else if (A.contains("-")) {
            // int index = A.indexOf("-");
            // System.out.print(index + " - ");
            // System.out.println(O.get(index).getNumber()
            // + "-"
            // + O.get(index + 1).getNumber()
            // + "="
            // + (O.get(index).getNumber() - O.get(index + 1)
            // .getNumber()));
            // temp.setDecimal(O.get(index).getNumber()
            // - O.get(index + 1).getNumber());
            // temp.setSign(0);
            // O.set(index, temp);
            // O.remove(index + 1);
            // A.remove(index);
            // }
            else
                System.out.println("error!!");
            O.trimToSize();
            A.trimToSize();
        }
        return O.get(0);
    }

    public RN GA(int number) {// Generation algorithm 生成算式
        RN[] Operand = new RN[number];
        String[] AS = new String[number];
        AS[number - 1] = "=";
        for (int i = 0; i < number; i++) {// 生成 number 个操作数
            Operand[i] = new RN();
            switch (new Random().nextInt(2) + 1) {// 這裏設置了Int(2)+1略過 小數
            // ifInt(3)就會出現小數
            case 0:// 小数[0~1.0) *100
                Operand[i]
                        .setDecimal(((int) (new Random().nextDouble() * 9900)) / 100.0 + 1);
                Operand[i].setSign(0);

                break;
            case 1:// 整数[0~n)
                Operand[i].setInteger(new Random().nextInt(99) + 1);
                Operand[i].setSign(1);
                break;
            case 2:// 分数
                Operand[i].setMolecular(new Random().nextInt(99) + 1);
                Operand[i].setDenominator(new Random().nextInt(99) + 1);
                Operand[i].setSign(2);
                break;
            default:
                System.exit(0);
            }
            if (i > 0)
                switch (new Random().nextInt(4)) {
                case 0:
                    AS[i - 1] = "+";
                    // Answer += Operand[i].getNumber();// 答案有待修改
                    break;
                case 1:
                    AS[i - 1] = "-";
                    // Answer -= Operand[i].getNumber();
                    break;
                case 2:
                    AS[i - 1] = "×";
                    // Answer *= Operand[i].getNumber();
                    break;
                case 3:
                    AS[i - 1] = "÷";
                    // Answer /= Operand[i].getNumber();
                    break;
                default:
                    System.exit(0);
                }
            // if (new Random().nextBoolean())
            // Operand[i] *= -1;
        }

        for (int i = 0; i < number; i++)
            System.out.print(Operand[i].toString() + " " + AS[i] + " ");
        return getAnswer(Operand, AS);// !!
    }

    public static void main(String[] args) {
        SE2_1 test = new SE2_1();
        Scanner in = new Scanner(System.in);
        int count = 0;
        int Num;
        do {
            System.out.println("請輸入出題的個數(不超過5):");
            Num = in.nextInt();
        } while ((Num > 5 || Num < 1) ? true : false);
        for (int i = 0; i < Num; i++) {
            RN Answer = test.GA(new Random().nextInt(4) + 2);// 确定操作数个数 1~5
            // 个RN Answer =
            System.out.println("Answer is:" + Answer.getNumber());
            double Input = in.nextDouble();
            if (Input == Answer.getNumber()
                    || Input == Math.round(Answer.getNumber() * 100) / 100.0) {
                System.out.println("答對了!");
                count++;
            } else
                System.out.println("答錯了!答案爲:"
                        + Math.round(Answer.getNumber() * 100) / 100.0);
        }
        System.out
                .println("一共" + Num + "道題,答對了" + count + "道題,答錯了"
                        + (Num - count) + "道題,正確率爲:" + (double) count * 100
                        / Num + "%");
    }

    public class F {// Fraction 分數
        int Molecular;// 分子
        int Denominator = 0;// 分母

        void setMolecular(int Molecular) {
            this.Molecular = Molecular;
        }

        int getMolecular() {
            return Molecular;
        }

        void setDenominator(int Denominator) {
            this.Denominator = Denominator;
        }

        int getDenominator() {
            return Denominator;
        }

        double getAll() {
            return (double) Molecular / Denominator;
        }

        public String toString() {
            return Molecular + "/" + Denominator;
        }
    }

    public class RN {// Random Number 隨機數
        double Decimal;// 小數
        int Integer;// 整數
        F Fraction = new F();// 分數

        int Sign;// 標誌該對象中存儲的是什麼數

        void setDecimal(double Decimal) {
            this.Decimal = Decimal;
        }

        double getDecimal() {
            return Decimal;
        }

        void setInteger(int Integer) {
            this.Integer = Integer;
        }

        int getInteger() {
            return Integer;
        }

        void setMolecular(int Molecular) {
            this.Fraction.setMolecular(Molecular);
        }

        int getMolecular() {
            return this.Fraction.getMolecular();
        }

        void setDenominator(int Denominator) {
            this.Fraction.setDenominator(Denominator);
        }

        int getDenominator() {
            return this.Fraction.getDenominator();
        }

        void setSign(int Sign) {
            this.Sign = Sign;
        }

        double getNumber() {
            switch (Sign) {
            case 0:
                return Decimal;
            case 1:
                return Integer;
            case 2:
                return Fraction.getAll();
            default:
                return -1;
            }
        }

        public String toString() {
            return Fraction.getDenominator() == 0 ? (Integer == 0 ? Decimal
                    + "" : Integer + "") : Fraction.toString();
        }
    }
}

現在只是一個過程,還不是所謂的完整版,所以,還是希望能有高人指點下.

    目前我知道存在的問題是:

      1.運算時,結果是由式子從左到用運算了,沒考慮到優先問題.例如:1+2*3=(1+2)*3=9 而真的答案是 7

        ...這個暫時想到棧處理,但是還在觀望中,看下還有沒更簡單的處理方法,我很嫌麻煩的.

    還有很多功能還沒加進來,我的做法是循序漸進,由簡至繁.如果有什麼比較高明的建議的話.請務必指導下

    已解決:

      現在已經解決上面1的問題,但是還有小錯誤.就是ArrayList set 功能感覺有點問題.還要研究下.

时间: 2024-11-08 11:24:48

20150401 作业2 结对 四则运算(Doing)的相关文章

20150401 作业2 结对 四则运算

结对 四则运算 编译环境:eclipse 开发人员:de 开发时间:2015-04-07 实现功能: 1.基本的加减乘除 2.每次出1道题目,提交后会显示是否答对,如果错了,还会出现正确答案 3.题目是随机的 4.能出于分数相关的运算以及可以输入真分数 5.可以控制题目的数量 缺点: 1.分数计算的答案输入分数格式才显示正确 2.不能用户选择做什么运算 3.还不能统计答题的时间 4.不能统计答题正确的数目 ...... 个人体会: 1.能力还是不足,一些东西想到了却不能实现 2.要多点和伙伴讨论

20150401 作业2 结对 四则运算ver 1.0

Web項目下 Tomcat服務器的路徑 /WebContant/ 目錄下 SE2_2.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "htt

作业2 结对 四则运算

开发环境:Eclipse 实现功能: 1.程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66 2.用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数 3.用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名 4.程序可以设置皮肤功能,可以改变界面的颜色即可. 结伴同学: 姓名:钟鹏昇 博客:http://www.cnblogs

作业二——结对 四则运算

开发环境: VC++6.0队员:201306114407-吴哲永     20130611410-董大为功能:  1.用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数 2.程序可以出单个整数阶乘的题目:如:4!=24 3.程序可以设置答题时间,时间设置为整数,单位为秒. 4.可以改变界面的颜色 5.程序可以出正整数四则运算,除法保留两位小数分工方面:这次我们结对并没有很明确分工,因为我们还是第一次合作,在很多方面都有不同风格,特别是在算法和传递便

结对作业——随机生成四则运算

结对作业 UI 第三组 朱池苇 PB16150206 刘鼎乾 PB16070837 Github 地址: 项目简介 这次软件工程结对项目为制作一个给小学生用的四则运算出题软件,然后我们抽到的是UI组,也就是负责人机交互--随机生成四则运算--使用Core组封装好的dll模块. 需求分析 对上述各属性参数(生成题目的数量,操作数的数量,题目及答案中的数值的范围--)进行设置 调用Core模块得到题目和运算结果,显示题目,接受输入,并能判断答案是否正确 增加"倒计时"功能,每个题目必须在2

第三次网上作业,结对编程

题目:编写一个能对0--10之间的整数进行四则运算的“软件”程序能接收用户输入的整数答案,并判断对错程序结束时,统计出答对.答错的题目数量.补充说明:0——10的整数是随机生成的用户可以用键盘输入来选择四则运算中的一种,比如输入1代表加法运算用户用键盘输入一个字符来结束程序的运行并显示统计结果,比如输入e程序结束并显示统计结果编程语言不限制,命令行输出和图像界面输出都可以.在此基础上,做增量开发.增量内容:1)处理用户的错误输入,比如输入字母或符号等,处理除法运算中分母为0的情况,处理结果为负数

软件工程第五次作业(结对作业)

软件工程第五次作业 题目 本次作业我与合作伙伴选择的是题目1:四则运算生成 能够自动生成四则运算练习题 可以定制题目数量 用户可以选择运算符 用户设置最大数(如十以内.百以内等) 用户选择是否有括号.是否有小数 用户选择输出方式(如输出到文件.打印机等) 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 角色选择 驾驶员 - 能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中 - 能够对导航员在本次编程工作中起到的作用给

作业四——结对编程四则运算

1. 结对编程项目---四则运算 此次编程项目的结队伙伴是方春阳 学号:130201129 计科13-1 博客地址 http://www.cnblogs.com/fcy29/ 根据要求我们设计了以下程序: 主界面: 在该页面下,可以看到此四则运算的主要功能,可以自行选择数的范围,系统默认值为1-100之间,超出这个范围并未得以实现,输入要生成题目的数量,然后按要求选择在算式中是否有乘除.负数.括号及真分数等功能,选择完成后,选好生成方式,点击确定.就可在框中自动生成算式.单击退出按钮便可退出该程

作业四: 结对编程项目---四则运算

队友  史劭聪 import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; im