首页 > 技术文章 > 结对作业

huangge 2018-09-18 22:49 原文

大气的名字 结对作业

张竣淇211617246 瞿煌人211606326

一、预估与实际

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

二、需求分析

  • 小学一年级
  • 使用的数字小于100且为20以内的加减法
  • 运算类型为加减且不能有负数
  • 运算类型为加减且不能有负数
  • 小学二年级
  • 使用的数字小于90
  • 乘法运算应为表内乘法
  • 除法运算的商和余数为一位数
  • 运算类型为乘除且不能有负数
  • 小学三年级
  • 运算符在2~4个,至少两个不同的运算符
  • 可以加括号
  • 减法运算的结果不能有负数
  • 除法运算除数不能为0,不能有余数

三、设计

1. 设计思路

说明你如何设计这个程序

比如:

  • 这个程序有x个类,x个函数,函数之间的调用关系是怎样的?
  • 关键函数的流程图是怎样的?
  • 算法的关键的关键是什么?
  • 这个程序有1个类,4个函数
  • 首先通过命令行接收参数
  • 然后通过函数来生成题目
  • 最后生成题目与答案文件
  • 关键函数是题目的生成函数认真构思

2. 实现方案

设计思路
生成四则运算表达式
将表达式从中缀表达式转换成后缀表达式
计算后缀表达式的值
类图

逆波兰式生成流程图

  1. 实现方案
    准备工作:先在Github上创建仓库,克隆到本地...
    技术关键点:stack()类的使用,逆波兰式的理解

四、编码

这次编程主要的难点是如何按要求生成四则表达式,只要理解了原理就能一步步写出来,但这次并没有完全实现需求,比如括号的数量以及括号中的运算符数量、不能保证运算中的减法没有负数以及除法没有余数。还有将中缀表达式转换成后缀表达式,注重细节也能写出来

逆波兰式生成

逆波兰式计算

  1. 调试日志
    这次的难点在于运算表达式的生成和逆波兰式的转换,开始打算用二叉树来生成表达式,但是未能完成

  2. 关键代码
    if (isNumber(s)) {
    stackNum.push(s);
    } else if (s.equals("(")) {
    stackOper.push(s);
    } else if (s.equals(")")){
    while (!stackOper.peek().equals("(")) {
    stackNum.push(stackOper.pop());
    }
    stackOper.pop();
    } else {
    // 当前为+-*/
    if (stackOper.empty()) {
    // 运算符栈为空
    stackOper.push(s);
    } else {
    if (stackOper.peek().equals("(")) {
    // 运算符栈顶的运算符为括号
    stackOper.push(s);
    } else {
    if (cmpOper(String.valueOf(stackOper.peek()), s) < 0) {
    // 运算符栈顶优先级小于当前符号,压栈
    stackOper.push(s);
    } else {
    stackNum.push(stackOper.pop());
    if (stackOper.empty()) {
    stackOper.push(s);
    } else {
    if (cmpOper(String.valueOf(stackOper.peek()), s) >= 0) {
    stackNum.push(stackOper.pop());
    stackOper.push(s);
    } else {
    stackOper.push(s);
    }
    }
    }
    }
    }
    }
    将中缀表达式转换成后缀表达式用于计算结果

  3. 代码规范
    第一条 类型与中括号紧挨相连来定义数组;
    第二条 采用4个空格缩进,禁止使用tab字符;
    第三条 在一个switch块内,每一个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使空代码;
    第四条 在 if/else/for/while/do 语句中必须使用大括号。即使只有一行代码,避免采用单行的编码方式:if (condition) statements;
    第五条 方法内部单行注释,在被注释语句上方另起一行,使用//珠海。方法内部多行注释使用/**/注释,注意与代码对齐;
    第六条 IDE的text file encoding设置为UTF-8;
    第七条 注释的斜线与注释内容之间有且仅有空格;
    第八条 大括号用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代块则:
    左大括号前不换行。
    左大括号后换行。
    右大括号前换行。
    右大括号后还有 lse 等代码则不换行;表示终止的右大括号后必须换行。
    第九条 if/for/while/switch/do等保留字与括号之间都必须加空格。
    PMD检查

五、测试

测试用例 | 预期结果 | 是否符合预期
参数个数有误! | 请重新运行! | 是
-n - s 参数个数有误!请重新运行! 是
-n 50 -grade 0 年级选择超出范围,请选择一二三年级。 是
-n 50 -grade h 年级选择选项非正整数!请重新运行! 是
-n -50 -grade 3 题目数量为负!请重新运行! 是
-n 0 -grade 3 请输入合适的题目数量!比如1-50 是
-n h -grade 3 题目数量选项非整数!请重新运行! 是
-n 10 -grade 2 正常运行 是
-grade 3 -n 10 正常运行 是

六、总结

队友功劳 ,我除了帅 没有别的才华。

推荐阅读