20165202 结对编程项目-四则运算 第二周

一、码云链接

二、需求分析

  • 实现一个命令行程序,要求:
  • 自动生成小学四则运算题目(加、减、乘、除)
  • 支持整数
  • 支持多运算符(比如生成包含100个运算符的题目)
  • 支持真分数
  • 统计正确率

三、设计思路(同时输出UML类图)

这周的总体设计要在上周的基础上深化,上周我们的代码没有用到中缀表达式转后缀表达式,没有用到栈,所以这周不仅要对上一周的代码进行修改,而且还要在此基础上完成更深层的对真分数的要求。

实现四则运算中后缀转换类

实现四则运算后缀表达式计算类

实现四则运算真分数计算类

实现四则运算生成题目并判断正误

- 题目生成
  - 可以独立使用
  - 可以选择生成的题目数量
- 题目运算及正误判断
  - 用到中缀表达式转后缀表达式
  - 实现四则运算真分数的计算
- 实现四则运算生成题目并判断正误
- 支持多语言系统

创建一个真分数类

创建一个后缀表达式的计算类

创建一个后缀表达式转中缀表达式的转换类

题目生成并判断正误

计算正确率

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

  • 算法(以加法为例子)
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);
        }

五、功能截图

  • 简体中文界面
  • 英文界面
  • 繁体中文界面
  • 边界值测试
  • 生成文件

六、结对感受

本周我们主要做了对上周代码的修改完善,鉴于功能不太全面我们进行了更大程度的改造。通过本周我发现结对编程时间花费比单人编程增加不少,但也会比单人编程减少不少的代码BUG。如果再算上后期代码的维护,结对编程比单人编程更有效率,还更加节省成本。

七、PSP表格

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

八、参考或引用的设计、实现

九、结对编程照片

posted @ 2018-04-22 22:26  Haimi98  阅读(182)  评论(2编辑  收藏  举报