结对项目

这个作业属于哪个课程 19网工3软工
这个作业要求在哪里 结对项目
这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序

结对项目github

队员: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.需求分析

  1. 命令实现类 Arithmetic -n [题目数量] -r [所有数字范围] -d [算式运算次数,符号数]

    -d 为个人额外添加参数,用于调整题目的计算难度。

  2. 算式规定类 参考项目文档3.3-3.7。

  3. 运算表达式 对于包含括号的普通式,可以直接转成波兰式(为了代码便捷,使用逆波兰式)

  4. 数值随机类 需要生成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为主程序,负责算式去重,统计答案(与输入输出文件的交互)。

A-program

具体实现和解析见代码和注释。

5.运行

生成算式 Arithmetic -n (生成个数) -r (数值范围) [-d] (运算符个数)

统计答案 Arithmetic -e (exercisefile).txt -a (answerfile).txt

测试:Arithmetic -n 10000 -r 5(运行时间在1s以内)

A-time

常规测试:(生成和判断)

6.项目小结

学到许多细节处理要点。

posted @ 2021-10-14 17:17  浪迹天涯_宇  阅读(225)  评论(1编辑  收藏  举报