结对项目
| 作业的要求 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13137 |
| 我理解的作业目标 | 完成四则运算的算法完成以及软件开发到应用的实现 |
github链接
https://github.com/shishuiliuqing/project
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 25 | 5 |
Estimate | 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 50 | 60 |
Analysis | 需求分析 (包括学习新技术) | 60 | 240 |
Design Spec | 生成设计文档 | 10 | 15 |
Design Review | 设计复审 | 60 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 20 | 30 |
Coding | 具体编码 | 3天 | 3天 |
Code Review | 代码复审 | 30 | 2天 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 60 | 60 |
Test Repor | 测试报告 | 15 | 10 |
Size Measurement | 计算工作量 | 5 | 5 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 25 |
合计 | 4天 | 6天 | |
效能分析 | |||
可以看到String类的调用较多,这是将真分数转化为假分数便于计算带来的代价,同时HashMap调用也非常频繁,这是因为在大量生成题目和判题时会多次使用到哈希表,在生成题目数量巨大时,我们认为这样的消耗是可以接受的。 | |||
设计实现 | |||
本次项目满足了多项需求,包括多道题目的生成,每一道题目答案的计算,对重复题目的检查(包括对交换律等形式不同而本质一样的题目的筛查),答案的比对等需求。 | |||
其由四个类组成,分别为Main类、FileOperation类、ArithmeticExpression类、Fraction类组成。 | |||
其中Main类读取命令行参数,然后调用FileOperation类,FileOperation类中可以通过调用ArithmeticExpression类进行题目生成,然后在FileOperation类中进行题目判断。而Fraction类的功能是将数字转化为假分数进行计算,然后再将结果转化为真分数输出满足需求,其通过ArithmeticExpression类来调用。 |
具体代码设计
算术表达式的生成
生成随机不重复的算术表达式由ArithmeticExpression类完成,也是本次项目中主要的难点。为了便于查重与括号的生成,我们将一个小的算术表达式作为一个表达式的基本元素,这个元素可以是一个数字或者式子,通过递归的方法将各个小表达式组合生一个完整的表达式。在计算答案的过程中每一个元素都有着独立的优先级,相当于是自带了一个括号,然后我们再通过对题目的解析,判断是否将括号加上。其储存形式如下图,每一行都代表一个元素,先确定符号个数,再随机出每一个元素的符号个数,如果符号个数有剩,那就继续生成下一个元素。
再筛选重复题目的过程中,我们将输入一个题目,返回一个字符串数组,里面包含自身与有限交换的所有结果,以此来排查所有可能出现的重复题目。
运行结果如下:
计算生成的算术表达式
在计算的过程中,由于考虑到分数的存在,我们将所有的数字都转化成了分数的形式,用假分数的方法进行计算,然后再将其转化为标准的形式进行输出。
命令行参数读取
Main中找到命令行参数中的"-n""-r""-e",并读取其后的字符串,交给其他功能,比较简单,不再赘述。
题目判断
在FileOperation类中完成,在生成好所有的题目与答案后,从指定文件中获取答案进行比对,再将评判结果输出到指定文件,其运行结果如下:
测试运行
总结
在结对编程中,我们保持了高效的沟通,在编程过程中遇到的问题也能够及时的发现。而且思维的碰撞也可以帮助我们得到更有效的算法,在不断的讨论和优化中很快构建出程序的雏形。编程过程中,我们有时两人共同讨论难题,有时分工解决问题,使得项目的进行十分顺利,两人都得到了许多收获。