20162302 - 20162319 结对编程项目-四则运算(第二周)

结对编程项目-四则运算(第二周)

  • 需求分析

1、实现真分数算式的生成
2、在运算符中增加括号
3、调用相关类进行真分数字符串,转化格式并计算
4、修改之前的代码,增加兼容性,使其支持分数
5、支持括号的运算
6、支持多语言

  • 设计思路

  • 一、分数部分

为了支持分数式的生成,首先要保证分数的生成,所以要修改NumOpeGenerator类,也就是以前的四则运算类,具体措施就是在里面加上一个生成分数的方法generateFraction()

public String generateFraction() {
        //一个生成分数的方法
        int numerator=1 , denominator=0;
        while (denominator == 0 || numerator >= denominator) {
            numerator = generateNum();
            //生成分子
            fraction = fmt.format(numerator);
            fraction = fraction.concat("/");
            denominator = generateNum();
            //生成分母
            fraction = fraction.concat(fmt.format(denominator) + " ");
        }
        return fraction;
    }

然后需要生成算式,原来的类不能直接用,所以就建立了新的FormulaGenerator_F类,类似于FormulaGenerator类。
接下来就是转制和计算部分,转制可以直接调用InfixToSuffix类,但是在计算的时候就需要专门的计算类了,计算直接引用的书上的RationalNumber类,但是两个类没有接口,不能直接连接,FractionCalculator类就起到了连接他们的作用。
通过evalSingleOp方法实现调用

private String evalSingleOp(char operation, String op1, String op2) {
        String result = null;
        String n,d;
        n = getNumer(op1);
        d = getDenom(op1);
        int n1 = Integer.parseInt(n);
        String d2 = String.valueOf(d);
        int d1 = Integer.parseInt(d2);
        RationalNumber op3 = new RationalNumber(n1, d1);
        n = getNumer(op2);
        d = getDenom(op2);
        n1 = Integer.parseInt(n);
        d2 = String.valueOf(d);
        d1 = Integer.parseInt(d2);
        RationalNumber op4 = new RationalNumber(n1, d1);

        switch (operation) {
            case ADD:
                result = (op3.add(op4)).toString();
                break;
            case SUBTRACT:
                result = (op3.subtract(op4)).toString();
                break;
            case MULTIPLY:
                result = (op3.multiply(op4)).toString();
                break;
            case DIVIDE:
                result = (op3.divide(op4)).toString();
        }

这样,分数的问题就解决了

  • 二、括号部分

生成括号虽然想起来很容易,但是在实际的操作中就会出现各种各样的问题。比如必须成对出现,左括号前和右括号后必须有运算符等。
首先我将括号作为第五种运算符生成。

public void solveOpe(int a){
        //把运算符的代号翻译成运算符并输出
        if (a==0)
            operator = "+";
        else if(a==1)
            operator = "-";
        else if (a==2)
            operator = "*";
        else if (a==3)
            operator = "/";
        else if (a==4)
            operator = bracket();
    }

为了达到成对出现的目的,设置一个direction变量,单数左括号,双数右括号,在执行的过程中符号会变化。

public String bracket (){
        //成对生成括号
        direction ++;
        if (direction % 2 ==0) {
            creativeOpe1();
            return ") "+operator1;
        }
        else {
            creativeOpe1();
            return operator1+" " +"( ";
        }
    }

还有一个问题,就是只生成左括号,没有右括号,不能成对出现,所以要对左右括号数量进行统计

public int count (String string, char operate){
        //用于统计符号出现次数
        int countNumber = 0;
        for (int i=0; i<string.length(); i++ ){
            if (operate == string.charAt(i))
                countNumber++;
        }
        return countNumber;
    }

判断并补全不足的括号

public String check(String toCheck){
        //检查左右括号数量是否相等
        int a = count(toCheck, '(');
        int b = count(toCheck, ')');
        while (a != b){
            toCheck = toCheck.concat(" )");
            a = count(toCheck, '(');
            b = count(toCheck, ')');
        }
        return toCheck;
    }
  • 三、多语言

多语言的问题就相对简单的多,直接把文字设置成变量,再选用不同的语言的时候直接赋不同的值就可以了

        System.out.print("请选择语言:简体中文(1)繁體中文(2)English(3):");
        int choice = scan2.nextInt();
        if (choice == 1) {

        } else if (choice == 2) {
            t = "是否使用分式(y/n):";
            n = "請輸入算式個數:";
            l = "請輸入算式階數:";
            an = "答案是:";
            rig = "正確率:";
        } else if (choice == 3) {
            t = "Whether the fraction is used(y/n): ";
            n = "Please enter the number of the expression: ";
            l = "Please enter the order of the expression: ";
            an = "The answer is: ";
            rig = "Correct rate: ";
        } else if (choice == 4) {
            t = "小数を使用するかどうか (y/n) : ";
            n = "数式番号を入力してください: ";
            l = "計算順序を入力してください: ";
            an = "答えは:";
            rig = "精度: ";
        } else if (choice == 5) {
            t = "следует ли использовать дробные (y/n): ";
            n = "пожалуйста, введите номер формула: ";
            l = "введите, пожалуйста, порядок вычисления: ";
            an = "Ответ заключается в: ";
            rig = "Точность: ";
        } else {
            System.out.println("没有那种语言!默认语言为简体中文,祝您愉快");
        }
  • UML图

  • 运行截图

  • 分数部分

  • 支持多运算符

  • Junit测试图

测试InfixToSuffix类转制分式成功

测试FractionCalculator类分数后缀式计算成功

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间 1000 1000
Development 开发
· Analysis · 需求分析 (包括学习新技术) 40 50
· Design Spec · 生成设计文档 40 40
· Design Review · 设计复审 (和同事审核设计文档) 30 30
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 50 60
· Design · 具体设计 100 200
· Coding · 具体编码 100 200
· Code Review · 代码复审 100 200
· Test · 测试(自我测试,修改代码,提交修改) 200 200
Reporting 报告
· Test Report · 测试报告 20 20
· Size Measurement · 计算工作量 20 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 40 20
  • 合作伙伴

  • 姓名:莫礼钟

  • 学号:20162319

  • 主要工作:构思结构,提供思路,检查错误。

  • 博客链接:点击此处→

posted @ 2017-05-21 23:24  20162302  阅读(225)  评论(14编辑  收藏  举报