• 20165223 结对编程之四则运算week2-整体总结


    目录

    一、结对对象

    • 担任角色(本周交换角色,流动学习)
      • 驾驶员(Driver):20165218 赵冰雨(是控制键盘输入的人)
      • 领航员(Navigator):20165223 蔡霓(起到领航、提醒的作用)
    • 搭档本次结对博客:20165218四则运算
    • 本次结对码云链接:四则运算

    返回目录

    二、需求分析

    取自《结对编程项目-四则运算》

    • 题目要求

    自动生成小学四则运算题目(加、减、乘、除)
    支持整数
    支持多运算符(比如生成包含100个运算符的题目)
    支持真分数
    统计正确率

    • 扩展要求

    处理生成题目并输出到文件
    完成题目后从文件读入并判题
    多语言支持:简体中文, 繁體中文, English
    生成题目不能去重

    去重:程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。(引用自:http://www.cnblogs.com/jiel/p/4810756.html

    返回目录

    三、设计思路

    • UML类图

    返回目录

    四、核心代码

    • 计算方法(加法为例)
    Calculator add(Calculator r){  // 加法运算
            int a = r.getNumerator();
            int b = r.getDenominator();
            int newNumerator = numerator * b + denominator * a;
            int newDenominator = denominator * b;
            Calculator result = new Calculator(newNumerator,newDenominator);
            return result;
        }
    
    
    • 随机出题(加法和减法为例)
    for (int i = 0; i < postOrder.size(); i++) {
        if (res.equals("")) {
            if (Character.isDigit(postOrder.get(i).charAt(0))) {
                stack.push(Integer.parseInt(postOrder.get(i)));
            } 
            else {
                Integer back = (Integer) stack.pop();
                Integer front = (Integer) stack.pop();
                stack.push(back);
                Calculator calculator2 = new Calculator();
                switch (postOrder.get(i).charAt(0)) {
                      case '+':
                            ……
                      case '-':
                            res = calculator2.compute(front + "/1", "-", back + "/1");
                            bufm.write(res);
                            bufm.flush();
                            bufm.newLine();
                            break;
                    ……
    
    
    • 中缀变后缀
        public static boolean compare(String peek, String cur) {
            if ("*".equals(peek) && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-".equals(cur))) {
                return true;
            } else if ("/".equals(peek) && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-".equals(cur))) {
                return true;
            } else if ("+".equals(peek) && ("+".equals(cur) || "-".equals(cur))) {
                return true;
            } else if ("-".equals(peek) && ("+".equals(cur) || "-".equals(cur))) {
                return true;
            }
            return false;
        }
        public void calc(String a) throws IOException{
            Calculater calculater = new Calculater();
            String s = a;
            ArrayList<String> result = calculater.getStringList(s);  //String转换为List
            result = calculater.getPostOrder(result);   //中缀变后缀
            calculate(result);//计算
        }
    
    
    • 测试判断
        public static String compute(String data1,String operation,String data2)throws IOException{
            String re="";
            StringTokenizer fenxi = new StringTokenizer(data1,"/");
            int data1_1 = Integer.parseInt(fenxi.nextToken());
            int data1_2 = Integer.parseInt(fenxi.nextToken());
            fenxi = new StringTokenizer(data2,"/");
            int data2_1 = Integer.parseInt(fenxi.nextToken());
            int data2_2 = Integer.parseInt(fenxi.nextToken());
            Calculator r1 = new Calculator(data1_1,data1_2);
            Calculator r2 = new Calculator(data2_1,data2_2);
            Calculator result;
            int a,b;
            if(operation.equals("+")){
                result = r1.add(r2);
                a = result.getNumerator();
                b = result.getDenominator();
                re = a + "/" + b;
            }
            if(operation.equals("-")){
                result = r1.sub(r2);
                a = result.getNumerator();
                b = result.getDenominator();
                re = a + "/" + b;
            }
            if(operation.equals("*")){
                result = r1.muti(r2);
                a = result.getNumerator();
                b = result.getDenominator();
                re = a + "/" + b;
            }
            if(operation.equals("/")){
                result = r1.div(r2);
                a = result.getNumerator();
                b = result.getDenominator();
                re = a + "/" + b;
            }
            return re;
        }
    
    

    返回目录

    五、功能截图

    返回目录

    六、结对感受

    本次结对编程中,我与搭档进行了角色互换,在上一周的代码基础上将代码进一步完善,并且添加了更多功能,使得代码能实现的操作更广泛。在上周实验中学习了JUnit单元测试,本想在结对编程中使用这个方法,但刚刚学习JUnit还未完全掌握,有些小问题还需要再讨论一阵,因此在这里就没有放出来。结对编程带给我们的是双份的收获,是两个人共同努力后的成果。

    返回目录

  • 相关阅读:
    MySQL优化点
    MySQL中lock tables和unlock tables浅析
    在深度计算框架MindSpore中如何对不持续的计算进行处理——对数据集进行一定epoch数量的训练后,进行其他工作处理,再返回来接着进行一定epoch数量的训练——单步计算
    Attributes should be specified via @SpringBootApplication
    base-package的路径不对,导致@Autowire提示trainingRepository错误。
    测试框架之-断言与预期结果 AssertJ
    无效的目标版本8 和 Unsupported major.minor version 52
    UML类图中箭头和线条的含义和用法
    苏宁乔新亮:世界上最好的研发管理十条经验
    4-8 路由实战
  • 原文地址:https://www.cnblogs.com/moddy13162201/p/8909406.html
Copyright © 2020-2023  润新知