201571030107《小学四则运算练习软件》结对项目 201571030107/201571030121《小学四则运算练习软件》结对项目

项目合作伙伴:马思远201571030121

项目Github地址

Arithmetic-Webapp_SE

项目线上演示地址

Four arithmetic applets

1、需求分析

  • 由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分。
  • 程序为用户提供四则运算练习功能:百以内整数算式+带括号算式。
  • 程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
  • 程序记录用户答题结果,当程序退出再启动的时候,可为用户显示24小时内参与测试的成绩统计。
  • 测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
  • 该程序为Web端程序,可供用户在线使用。

2、软件设计

系统UML
201571030107《小学四则运算练习软件》结对项目
201571030107/201571030121《小学四则运算练习软件》结对项目

3、核心代码

  • 将算术表达式(中缀表达式)转换为后缀表达式:

eg. 89-(44/(56*33)) 中缀表达式转换为后缀表达式
后缀表达式:89 44 56 33 * / -,元素之间用空格隔开。
从左到右遍历中缀表达式的每一个数字和运算符
如果是数字就输出(即存入后缀表达式)
如果是右括号,则弹出左括号之前的运算符
如果优先级低于栈顶运算符,则弹出栈顶运算符加入后缀表达式,并将当前运算符加入后缀表达式
遍历结束后,将栈则剩余运算符弹出。

public static String prefixToSuffix(String express) throws Exception {

        String[] expression = express.split(",");
        StringBuffer suffixStr = new StringBuffer();
        String temp = "";

        try {
            for (int i = 0; i < expression.length; i++) {
                if (SuffixToValueUtil.isNum(expression[i])) {
                    suffixStr.append(expression[i]).append(" ");
                } else if (expression[i].equals(")")) {
                    temp = stack.pop();
                    while (!temp.equals("(")) {
                        suffixStr.append(temp).append(" ");
                        temp = stack.pop();
                    }
                } else if (expression[i].equals("(") ||
                        priority.get(expression[i]) >= priority.get(getTopOperator())) {

                    stack.push(expression[i]);
                } else {
                    temp = stack.pop();
                    suffixStr.append(temp).append(" ").append(expression[i]).append(" ");
                }

            }
        } catch (Exception e) {
            throw e;
        }
        while (stack.size() > 0) {
            suffixStr.append(stack.pop());
        }

        return suffixStr.toString();
    }
  • 根据中缀表达式计算结果

eg. 根据后缀表达式:89 44 56 33 * / - 计算结果。
从左到右遍历后缀表达式
遇到数字就进栈
遇到符号,就将栈顶的两个数字出栈运算,运算结果进栈,直到获得最终结果。

public static int compute(String expression) throws Exception {
        int numOne, numTwo;
        String temp = "";
        String[] express = expression.split(" ");
        Stack<String> stack = new Stack<>();

        for (int i = 0; i < express.length; i++){
            if (isNum(express[i])){
                stack.push(express[i]);
            }
            else
            {
                numTwo = Integer.parseInt(stack.pop());
                numOne = Integer.parseInt(stack.pop());
                temp = CalculateUtil.compute(numOne, numTwo, express[i]).toString();

                if (Integer.parseInt(temp) < 0){
                    throw new Exception("Negative numbers in operation");
                }
                stack.push(temp);
            }
        }

        return Integer.parseInt(stack.pop());
    }

4、程序运行

示例图片一
201571030107《小学四则运算练习软件》结对项目
201571030107/201571030121《小学四则运算练习软件》结对项目
示例图片二
201571030107《小学四则运算练习软件》结对项目
201571030107/201571030121《小学四则运算练习软件》结对项目
示例图片三
201571030107《小学四则运算练习软件》结对项目
201571030107/201571030121《小学四则运算练习软件》结对项目
示例图片四
201571030107《小学四则运算练习软件》结对项目
201571030107/201571030121《小学四则运算练习软件》结对项目

5、结对编程

201571030107《小学四则运算练习软件》结对项目
201571030107/201571030121《小学四则运算练习软件》结对项目

6、PSP

PSP2.1 任务内容 计划完成的时间(min) 实际完成需要的时间(min)
PLanning 计划 40 40
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 40 40
Developmet 开发 162 180
Analysis 需求分析(包括学习新技术) 12 22
Design Spec 生成设计文档 5 3
Design Revie 设计复审(和同事审核设计文档) 3 3
Coding Standard 代码规范 2 2
Design 具体设计 45 50
Coding 具体编码 75 70
Code Review 代码复审 5 5
Test 测试(自我测试,修改代码,提交修改) 15 25
Reporting 报告 30 40
Test Report 测试报告 20 30
Size Measurement 计算工作量 3 3
Postmortem & Process Improvement Plan 事后总结,并提出过程改机计划 7 7

7、使用汉堡评价法给小伙伴的一些点评

在本次项目中,我的小伙伴是马思远同学,这个项目相比于上一个项目来说主要增加了对图形用户界面的要求。刚开始思远同学建议我们采用Java的图形界面库来做软件的界面。而我又觉得那个界面有点土,我认为web界面效果会比较好。所以这里我们俩儿就起了冲突。在我向他详细介绍了采用web界面的优势后,小马同意了我的建议,在两人合作编程中,两个人有意见上的冲突,通过多交流冲突就会迎刃而解。本次项目感谢思远同学和我的默契合作。

8、结对编程的感受

首先,本次项目的规模相比于上一次大了不少。所以结队编程的好处也就是提高了编码和效率,减轻了工作量。其次两个人不一样的编码方式,思维方式和语言沟通都不相同,通过项目的磨合,增加了我们在将来实际项目中的协作能力和工作经验。