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

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


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、代码托管地址

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

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

7、PSP

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

8、对结对的小伙伴做出评价(重点指出需要改进的地方)

  这次结对学习反映出了很大的问题,最重要的一点就是我们俩的时间经常错开,能坐在一起讨论的机会并不多,也只有晚上。原因是最近的事情太多了,很多事做不完,希望今后事情少的时候能多讨论交流~

9、结对编程照片

原文地址:https://www.cnblogs.com/cbmwtsl/p/8910706.html