结对项目

结对项目

作业所属班级 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024
作业的要求 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13137
我理解的作业目标 完成四则运算的算法完成以及软件开发到应用的实现

本项目由 郭亮(学号:3122004520)、黄俊超(学号:3122004524)合作完成

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类中完成,在生成好所有的题目与答案后,从指定文件中获取答案进行比对,再将评判结果输出到指定文件,其运行结果如下:

测试运行



总结

在结对编程中,我们保持了高效的沟通,在编程过程中遇到的问题也能够及时的发现。而且思维的碰撞也可以帮助我们得到更有效的算法,在不断的讨论和优化中很快构建出程序的雏形。编程过程中,我们有时两人共同讨论难题,有时分工解决问题,使得项目的进行十分顺利,两人都得到了许多收获。

posted @ 2024-03-25 21:13  miaomiaoQAQ  阅读(33)  评论(0编辑  收藏  举报