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("\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

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

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

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

9、结对编程照片

posted @ 2018-04-22 23:18  磁暴魔王特斯拉  阅读(151)  评论(2编辑  收藏  举报