结对项目:四则运算题目生成器
这个作业属于哪个课程 | 软件工程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的学习还不够深入,项目完成了但还有不足之处,警示我们需要不断学习。这次的结对项目是一次很有意义的经历,我们学到了如何与他人合作,还提升了自己的沟通能力,以及编写代码的能力。