结对编程
GitHub链接:caculation
成员列表
学号 | 姓名 |
---|---|
3218005396 | 黄若筠 |
3218005384 | 陈丽金 |
PSP表格
这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 结对项目 |
这个作业的目标 | 实现一个自动生成小学四则运算题目的命令行程序 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 60 |
Development | 开发 | 380 | 440 |
· Analysis | · 需求分析 (包括学习新技术) | 40 | 60 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
· Design | · 具体设计 | 20 | 20 |
· Coding | · 具体编码 | 180 | 300 |
· Code Review | · 代码复审 | 10 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 40 | 60 |
· Test Repor | · 测试报告 | 30 | 40 |
· Size Measurement | · 计算工作量 | 5 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 5 | 10 |
· 合计 | 450 | 560 |
设计实现过程
- 生成函数
- 得出结果函数
- 删去完全重复的式子
- 查找结果相同的式子删去
- 重新生成n(删去式子数)条式子,没生成一条都与前面的式子作比较,确保不重复再插入结果列表
- 将生成的式子数组写入文件
代码说明
- 生成式子函数
-
随机生成一个运算符数组(长度小于等于三,大于等于一)
-
定义一个数组,随机生成一个数字,加入数组中,再加入一个运算符(从运算符数组中取出),再生成一个数组,直到运算符数组中的运算符都被取出为止。
-
在生成数字的时候需要注意,如果该数字前面的运算符是除号,需要进行条件判断。
除号:因为要保证除法生成的是真分数,所以要符合一下两个条件
- 该数字生成的时候,如果是0或者比被除数小,那么需要重新生成
- 当碰到除号时,判断被除数是否为(r-1),如果为(r-1),也需要重新生成。
-
当运算符数组被取尽后,一条表达式就生成了。
-
定义一个数组excises,如果该数组为空时,就将表达式推进去,如果不为空时,后续当一条表达式生成时,就与该数组中的表达式一一比对,如果符合要求,就推入。
符合要求的条件如下:
- 新生成的表达式不能与数组里的重复。
- 该表达式的运算答案不可以小于0。
判断重复的逻辑:
- 判断结果是否相同。
- 判断操作符个数是否相同。
- 判断每个数字是否相同。
-
-
缺点:
- 判断重复的逻辑比较简单粗暴,且在逻辑上不够精确。且每次加入时都要与前面的所有表达式一一进行比对,这样效率比较低。如果生成10000条的情况下,花费差不多需要60s。在这种情况下,可以将每次生成的结果保存起来,进行哈希映射,也许能够提高效率?
- 得出结果函数
根据式子中的符号得出四种情况:加减乘除混合、只有加减、只有乘除、式子中没有运算符号
加减乘除混合:根据加减号拆分成子式,分别把子式算出结果再进行加减
只有加减:运用eval函数直接运算出结果
只有乘除:要分析是否有分数等结果,如果分数拆分出分子分母计算后再组合
式子中没有运算符号:直接返回
测试运行
试过了生成10条、100条、1000条等情况,几乎是瞬间生成,但是10000条较久,时间主要耗费在减去重复式子后每次生成一条新的式子时检查是否重复。
小结
我感觉我们的分工还是较为明确的,一开始就聚在一起共同讨论思路。一边说一边写,将可能出现的情况写下来。接着分配任务,我们很peace的,随机挑选之后就开始写了。我负责的是生成结果函数,中间可能出现的情况不少,主要是处理真假带分数的运算。其中加减乘除混合的比较复杂,采用了递归写法。但是在写报告的时候我突然想到可以利用栈结构很快解决了,嗨呀没时间啦,这算是一个能改进但是没来得及改的点,也多亏了题目规定的符号数不多才不至于出现递归溢出问题。