欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

20165218 结对编程练习-四则运算

程序员文章站 2022-06-12 22:48:16
...

20165218 结对编程练习-四则运算

一、结对对象

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

二、需求分析

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

  • 题目要求

    自动生成小学四则运算题目(加、减、乘、除)
    支持整数
    支持多运算符(比如生成包含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类图
    20165218 结对编程练习-四则运算

四、核心代码

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;
    }

五、功能截图

20165218 结对编程练习-四则运算

20165218 结对编程练习-四则运算

六、结对感受

第一次结对编程,个人体会我与搭档还不是非常默契,有时候显得有些手忙脚乱,但也体会到了更多人一起工作所带来的思路的开阔,分工后效率的提升。

项目方面,我们对Junit掌握的都不甚熟练,所以还没有写出测试代码。会继续深入学习Junit的用法,以写出测试代码。