结对项目:四则运算题目生成器

这个作业属于哪个课程 软件工程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表示对/错的题目的数量,括号内的是对/错题目的编号。为简单起见,假设输入的题目都是按照顺序编号的符合规范的题目。

三、效能分析

  1. 性能分析图:

  2. Memory占用图:

四、设计实现

1、类名: CalculateStack
  1. 方法

    addFirstElem: 检查栈顶元素是否为+, -, *, /操作符,如果是,则弹出栈顶元素和栈顶的下一个元素,执行相应的计算,并将结果压入栈中。如果不是,则将当前元素压入栈中。

    returnsCalculate: 遍历栈中的所有元素,执行相应的计算,并将结果压入栈中,返回栈顶元素的值。

    calculate: 计算两个数字和一个操作符的结果

  2. 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类:生成数学题并检查答案
  1. 读取用户输入的题目数量和题目大小限制,并调用produceMaths方法生成题目。

  2. 将生成的题目和答案写入文件,并提示用户输入答案。

  3. 定期检查答案文件是否有新内容输入,如果有新内容,则计算正确率和错误率,并将结果写入结果文件。

  4. 当结果文件存在且内容更新时,循环结束,程序退出。

五、测试运行

测试覆盖率:

部分结果:

  • 10道题目

  • 20道题目

  • 更多题目

六、总结

杨文琦:很高兴与兰健同学完成这次的结对项目,我觉得她的闪光点是她的设计与测试。她设计的用户界面简洁明了,并且从多方面进行测试,保障程序的正确性。我们在这次合作
中,积极沟通,合作愉快。

韦兰健:我的搭档文琦同学,我觉得她的闪光点是编程能力和逻辑思维很强。我们两个都是初学Java,但是她学习能力很强,在我不懂的地方给了我很直白的讲解,并且我们两个的沟通与合作非常愉快。

总结:我们一开始先确认使用Java编写代码,以及对项目的需求进行分析,然后进行分工。在合作过程中,遇到问题我们及时相互沟通并且确定好解决方法,不懂的知识点就在网上找学习资源。但是由于我们对Java的学习还不够深入,项目完成了但还有不足之处,警示我们需要不断学习。这次的结对项目是一次很有意义的经历,我们学到了如何与他人合作,还提升了自己的沟通能力,以及编写代码的能力。