结对项目:四则运算题目生成器
2024-04-09 14:33:20
这个作业属于哪个课程
软件工程2024
这个作业要求在哪里
结对项目
这个作业的目标
学会两个人合作完成一个项目,了解如何分工合作
Github地址:点击进入仓库
队员介绍
成员姓名
学号
杨文琦
3222004727
韦兰健
3222004724
一、PSP表格
PSP2.1
Personal Software Process Stages
预估耗时(分钟)
实际耗时(分钟)
Planning
计划
20
20
· Estimate
· 估计这个任务需要多少时间
20
20
Development
开发
1120
865
· Analysis
· 需求分析 (包括学习新技术)
120
60
· Design Spec
· 生成设计文档
20
15
· Design Review
· 设计复审 (和同事审核设计文档)
10
30
· Coding Standard
· 代码规范 (为目前的开发制定合适的规范)
20
20
· Design
· 具体设计
20
40
· Coding
· 具体编码
800
600
· Code Review
· 代码复审
30
40
· Test
· 测试(自我测试,修改代码,提交修改)
100
60
Reporting
报告
40
35
· Test Report
· 测试报告
20
20
· Size Measurement
· 计算工作量
10
5
· Postmortem & Process Improvement Plan
· 事后总结, 并提出过程改进计划
10
10
合计
1180
920
二、需求分析
题目:实现一个自动生成小学四则运算题目的命令行程序(也可以用图像界面,具有相似功能)
说明:
自然数:0, 1, 2, …。
真分数:1/2, 1/3, 2/3, 1/4, 1’1/2, …。
运算符:+, −, ×, ÷。
括号:(, )。
等号:=。
分隔符:空格(用于四则运算符和等号前后)。
算术表达式: e = n | e1 + e2 | e1 − e2 | e1 × e2 | e1 ÷ e2 | (e),
其中e, e1和e2为表达式,n为自然数或真分数。
四则运算题目:e = ,其中e为算术表达式。
需求:
使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 将生成10个题目。
使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围,例如 Myapp.exe -r 10 将生成10以内(不包括10)的四则运算题目。该参数可以设置为1或其他自然
数。该参数必须给定,否则程序报错并给出帮助信息。
生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1− e2的子表达式,那么e1≥ e2。
生成的题目中如果存在形如e1÷ e2的子表达式,那么其结果应是真分数。
每道题目中出现的运算符个数不超过3个。
程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8
× 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两
道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。
生成的题目存入执行程序的当前目录下的Exercises.txt文件,格式如下:
四则运算题目1
四则运算题目2
……
其中真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2’3/8。
在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:
答案1
答案2
特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。
程序应能支持一万道题目的生成。
程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,输入参数如下:
Myapp.exe -e .txt -a .txt
统计结果输出到文件Grade.txt,格式如下:
Correct: 5 (1, 3, 5, 7, 9)
Wrong: 5 (2, 4, 6, 8, 10)
其中“:”后面的数字5表示对/错的题目的数量,括号内的是对/错题目的编号。为简单起见,假设输入的题目都是按照顺序编号的符合规范的题目。
三、效能分析
性能分析图:
Memory占用图:
四、设计实现
1、类名: CalculateStack
方法
addFirstElem: 检查栈顶元素是否为+, -, *, /操作符,如果是,则弹出栈顶元素和栈顶的下一个元素,执行相应的计算,并将结果压入栈中。如果不是,则将当前元素压入栈中。
returnsCalculate: 遍历栈中的所有元素,执行相应的计算,并将结果压入栈中,返回栈顶元素的值。
calculate: 计算两个数字和一个操作符的结果
类 NumberRecord:用于处理分数加减乘除
createNumberRecord: 根据输入的字符串,创建一个NumberRecord对象,如果输入的字符串包含分隔符,则将字符串分为整数部分和分数部分,分别处理。
addNumberRecord: 计算两个NumberRecord对象的加法。
multiNumberRecord: 计算两个NumberRecord对象的乘法。
subtractionNumberRecord: 计算两个NumberRecord对象的减法。
divisionNumberRecord: 计算两个NumberRecord对象的除法。
2、TitleAnswer类:用于存储问题描述和答案
getProblemDescription:返回问题描述。
setProblemDescription:设置问题描述。
getAnswer:返回答案。
setAnswer:设置答案。
toString:返回类对象的字符串表示。
3、CheckUtils类:
readAnswersFromFile方法:用于从指定文件路径的文件中读取答案,返回答案列表
gradeWrite方法:用于将统计结果写入指定文件路径的文件中
4、MathProduceUtils类
produceMaths方法:生成指定数量和范围的数学题,并在生成完成后返回生成的题目和答案列表
produceMathsInt方法:传入的数字限制生成整数运算题目。
produceMathsModule方法:传入的数字列表生成具体的问题和答案。
produceFraction方法:传入的数字限制生成分数运算题目。
operationChoice方法:传入的随机数选择运算符。
produceMathsIntMixFraction方法:根据传入的数字限制生成一个整数运算题目,包括分数运算
operationChoice方法:根据传入的随机数选择运算符
5、main类:生成数学题并检查答案
读取用户输入的题目数量和题目大小限制,并调用produceMaths方法生成题目。
将生成的题目和答案写入文件,并提示用户输入答案。
定期检查答案文件是否有新内容输入,如果有新内容,则计算正确率和错误率,并将结果写入结果文件。
当结果文件存在且内容更新时,循环结束,程序退出。
五、测试运行
测试覆盖率:
部分结果:
10道题目
20道题目
更多题目
六、总结
杨文琦:很高兴与兰健同学完成这次的结对项目,我觉得她的闪光点是她的设计与测试。她设计的用户界面简洁明了,并且从多方面进行测试,保障程序的正确性。我们在这次合作
中,积极沟通,合作愉快。
韦兰健:我的搭档文琦同学,我觉得她的闪光点是编程能力和逻辑思维很强。我们两个都是初学Java,但是她学习能力很强,在我不懂的地方给了我很直白的讲解,并且我们两个的沟通与合作非常愉快。
总结:我们一开始先确认使用Java编写代码,以及对项目的需求进行分析,然后进行分工。在合作过程中,遇到问题我们及时相互沟通并且确定好解决方法,不懂的知识点就在网上找学习资源。但是由于我们对Java的学习还不够深入,项目完成了但还有不足之处,警示我们需要不断学习。这次的结对项目是一次很有意义的经历,我们学到了如何与他人合作,还提升了自己的沟通能力,以及编写代码的能力。
作者:小李
点赞3043
已输入3个字
全部评论
快来抢沙发


