20175316与20175329 结对编程练习_四则运算(第二周)

1、需求分析

实现一个命令行程序,要求:

  • 自动生成指定数量的小学四则运算题目(加、减、乘、除)

  • 支持整数

  • 统计正确率

  • 支持多运算符

  • 题目去重

  • 支持真分数

  • 处理生成题目并输出到文件

  • 完成题目后从文件读入并判题

2、设计思路(UML类图)

3、实现过程中的关键代码解释

  • 算法(以加法为例子)
public Shu add(Shu op2)
    {
        int commonDenominator = denominator * op2.getDenominator();
        int numerator1 = numerator * op2.getDenominator();
        int numerator2 = op2.getNumerator() * denominator;
        int sum = numerator1 + numerator2;
        return new Shu (sum, commonDenominator);
    }
  • 转换为后缀
public void evaluate(String expr) {
        String token;
        StringTokenizer tokenizer = new StringTokenizer(expr);
        while (tokenizer.hasMoreTokens()) {
            token = tokenizer.nextToken();
            if (token.equals("("))
                stack1.push(token);
            else if (token.equals("+") || token.equals("-")) {
                while (!stack1.empty()){
                    if(stack1.peek().equals("(")){
                        break;
                    }else list1.add(stack1.pop());
                }
                stack1.push(token);
            }else if (token.equals("*") || token.equals("/")) {
                if(!stack1.empty()) {
                    if (stack1.peek().equals("*") || stack1.peek().equals("/")) {
                        list1.add(stack1.pop());
                        stack1.push(token);
                    } else stack1.push(token);
                }else stack1.push(token);
            }
            else if (token.equals(")")) {
                while (!stack1.peek().equals("(")) {
                    list1.add(stack1.pop());
                }
                stack1.pop();
            }else list1.add(token);
        }
        while (!stack1.empty()) {
            list1.add(stack1.pop());
        }
        ListIterator<String > li = list1.listIterator();
        while (li.hasNext()) {
            Message += li.next() + " ";
            li.remove();
        }
        message = Message;
    }
  • 判断正误
String tmp = br.readLine();
            if (tmp != null) {
                if (tmp.indexOf("=") != -1) {
                    ExpreNum++;
                    StringTokenizer tokenizer = new StringTokenizer(tmp, "=");
                    infixToSuffix.evaluate(tokenizer.nextToken());
                    list3.add(tmp);
                    if ((" " + cal.evaluate(infixToSuffix.getMessage())).equals(tokenizer.nextToken())) {
                        list3.add("正确");
                        trues++;
                    } else {
                        list3.add("错误");
                        list3.add("正确答案为" + cal.evaluate(infixToSuffix.getMessage()));
                    }
                } else list3.add(tmp);
            } else break;
  • 生成文件(.txt)
Biaodashi pra = new Biaodashi();
        try {
            pra.outFile("SIZEYUNSUAN.txt","Practice.txt");
        }catch (IOException e){
            System.out.println(e);
        }

4、运行过程截图

  • 简体中文
  • 边界值测试

5、代码

https://gitee.com/shengmaosong/java-besti-20175316/tree/master/docs7/sizeyunsuan2

6、遇到的困难及解决方法

  • 问题: 生成题目时,我输入想要做的题目难度为0,会出现错误
  • 问题解决方法: 我俩检查了代码之后发现是没有考虑边界值的问题,添加了if-else语句判断输入的值就好了,改过的代码如下:
int many = scan.nextInt();
             while (true) {
                  if (many > 0) {
                       pra.CreateExpre(Tinumber, many, language);
                       pra.showC();
                       System.out.println("\n您答对的题目数为:" + pra.getTrues());
                       double trues = (double) pra.getTrues() / Tinumber;
                       System.out.println("您的正确率为:" + nf.format(trues));
                       System.out.println("\n再来一次输入y重来输入n退出)");
                       another = scan.nextLine();
                       break;
                   } else
                       System.out.println("输入错误!请重新输入,至少为1!");
                   many = scan.nextInt();
                            }
                   break;

7、PSP

posted on 2019-04-14 22:16  20175316  阅读(143)  评论(0编辑  收藏  举报