结对项目
这个作业属于哪个课程 | 19网工3软工 |
---|---|
这个作业要求在哪里 | 结对项目 |
这个作业的目标 | 实现一个自动生成小学四则运算题目的命令行程序 |
队员:3119005893柯新宇(码字的),3119006062刘熠(主讲师)
1.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 15 |
· Estimate | · 估计这个任务需要多少时间 | 450 | 454 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 80 | 90 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 12 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 60 | 40 |
· Code Review | · 代码复审 | 20 | 24 |
· Test | · 测试(自我测试,修改代码,提交修改) | 70 | 80 |
Reporting | 报告 | 10 | 10 |
· Test Repor | · 测试报告 | 10 | 10 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 18 |
Total | · 合计 | 370 | 369 |
2.需求分析
-
命令实现类 Arithmetic -n [题目数量] -r [所有数字范围] -d [算式运算次数,符号数]
-d 为个人额外添加参数,用于调整题目的计算难度。
-
算式规定类 参考项目文档3.3-3.7。
-
运算表达式 对于包含括号的普通式,可以直接转成波兰式(为了代码便捷,使用逆波兰式)
-
数值随机类 需要生成1w+的算式,为了高性能考虑,使用mt19937伪随机数产生器。
3.设计实现
四则运算部分用逆波兰式表达,便于随机生成数值和符号。
例,3×(1+2)表示为 3,1,2,+, ×,可以直接解决运算次序的问题。
使用stack结构,内数值个数满足2个时,可插入运算符,再将top和次top弹出并运算,得到结果重新加入stack。
随机项自定,满足插入运算符和数值近似均等比例即可。
最后stack剩下1个数值且表达式结束即为答案。
在每次运算时,可分配元素id,构建树形结构,便于转成普通式(添加括号)cedge数组
程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目
使用hash判断并按照固定规则对运算符的左右项交换(−, ÷ 以左右项值的大小关系为第一关键字,以hash为第二关键字)。例,满足hash_left<hash_right。并将左右hash进行合并归成hash_father。得到的stack最后剩下的唯一元素的hash定为hash_total,即该表达式的hash值。可知,具有交换相等性质的不同算式会被改写成同一算式且为同一个hash值。判断hash是否一致可知是否题目重复。(理论上可采用多次hash判断减少hash冲突)
为了消除hash交换对随机性的影响,程序得到hash_total作为特征值后,对转成普通式 +, × 部分随机交换左右项。
程序开 4 倍的算式生成,补hash冲突的弃项。
4.代码说明
代码结构:
Cmaking.h为头文件,统筹结构体和全局变量。
Ccreate.cpp为生成四则运算表达式,同时得到算式的各类参数。
Main.cpp为主程序,负责算式去重,统计答案(与输入输出文件的交互)。
具体实现和解析见代码和注释。
5.运行
生成算式 Arithmetic -n (生成个数) -r (数值范围) [-d] (运算符个数)
统计答案 Arithmetic -e (exercisefile).txt -a (answerfile).txt
测试:Arithmetic -n 10000 -r 5(运行时间在1s以内)
常规测试:(生成和判断)
6.项目小结
学到许多细节处理要点。