• 20162302


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

    • 需求分析

    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

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

    • 博客链接:点击此处→

  • 相关阅读:
    [HNOI 2009] 有趣的数列
    [HAOI2015] 树上染色
    [BZOJ 2654] tree
    【图论 搜索】bzoj1064: [Noi2008]假面舞会
    【倍增】7.11fusion
    【二分 贪心】bzoj3477: [Usaco2014 Mar]Sabotage
    【计数】7.11跳棋
    概述「贪心“反悔”策略」模型
    复习计划里的低级错误
    【模拟】bzoj1686: [Usaco2005 Open]Waves 波纹
  • 原文地址:https://www.cnblogs.com/yangjingdian/p/6886470.html
Copyright © 2020-2023  润新知