结对项目

结对项目

软件工程 <网工1934>
作业要求:
1.在文章开头给出两位同学的姓名、学号、Github项目地址。
2.记录下估计将在程序的各个模块的开发上耗费的时间。
3.效能分析,记录你在改进程序性能上花费了多少时间,描述改进的思路,并展示一张性能分析的图。如果可能,展示程序中消耗最大的函数。
4.设计实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?
5.代码说明。展示出项目关键代码,并解释思路与注释说明。
6.测试运行。共享你对程序进行测试的至少10个测试用例,以及说明为什么你能确定你的程序是正确的。
7.在你实现完程序之后,在PSP表格记录下在程序的各个模块上实际花费的时间。
8.项目小结。结对项目总结成败得失,分享经验,总结教训。两个人共同撰写一个博客,包含上述内容的描述,同时包含结对感受,以及两个人对彼此结对中的闪光点或建议的分享。
<作业要求>
作业的目标:
实现一个自动生成小学四则运算题目的命令行程序,可以控制生成题目的个数和题目中数值的范围,以及支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计。

Github链接

陈志恒 3119005368

梁晋源 3119005380

一. PSP2.1表格

*PSP2.1* *Personal Software Process Stages* *预估耗时(分钟)* *实际耗时(分钟)*
Planning 计划
· Estimate · 估计这个任务需要多少时间 1440 1660
Development 开发
· Analysis · 需求分析 (包括学习新技术) 200 230
· Design Spec · 生成设计文档 100 100
· Design Review · 设计复审 (和同事审核设计文档) 40 50
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 40 30
· Design · 具体设计 300 300
· Coding · 具体编码 400 530
· Code Review · 代码复审 50 50
· Test · 测试(自我测试,修改代码,提交修改) 200 290
Reporting 报告
· Test Report · 测试报告 30 30
· Size Measurement · 计算工作量 20 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
合计 1410 1600

二.效能分析

生成10道题,可以发现char[]占用的内存最大

生成10道

批改10道题

批改10道

生成10000道题

生成10000道

三.设计实现过程

1.主要类(此处截图均为部分截图)

(1)数值符号类NumberAndOperator

使用List集合存储操作数和操作符,将操作数和操作符封装为NumberAndOperator类

NumberAndOperator

(2)题目类Problems(工具类)

Problems类提供了生成题目的方法

Problems

(3)检查类Check(工具类)

提供检查算式是否重复的方法

Check

(4)分数类Fraction(工具类)

提供其他类型数据转化为真分数,分数的加减乘除的方法

Fraction

(5)计算类Calculation(工具类)

提供算式计算的方法,分为带括号,不带括号,两数运算

Calculation

(6)文件操作类DocumentOperation(工具类)

提供文件的读写操作

DocumentOperation

(7)题目重复异常ProblemRepeatException和结果小于零异常ResultLessThanZeroException

ProblemRepeatException

ResultLessThanZeroException

(8)程序入口FourArithmetic

FourArithmetic

2.程序流程

流程图

四.代码说明

代码说明在具体代码中都有提及,不再赘述。此处简单分析该项目的编写思路。在这个项目中,我认为难点在于生成题目、计算以及题目查重。

(1)题目生成方面。我采用的是递归的思路,先随机生成n(n<=3)个的操作符,则会产生(n+1)个空隙用于放操作数,操作数的类型在整数、分数、子算式中随机选择,若选择到子算式,则重复“生成操作符,插入操作数”的过程,直到操作符数量等于3。

(2)计算方面。由于生成的题目中可能存在分数(真分数或带分数),而java中没有分数这种数据类型,因此在计算时全部按分数的形式来计算,若是整数则变为以1为分母的分数,带分数则化为假分数。最终结果若是假分数则化为带分数,若是以1为分母的分数则化为整数。

(3)题目查重方面。在查阅资料后,我了解到二叉树和逆波兰式都可以实现对算式的查重,但我有点看不懂,参照逆波兰式的思路,我想到一种查重的方案。造成算式重复的是“+”和“*”的交换律,但由于参与运算的操作数是相同的,因此是重复的。我的思路是:对于两个算式,①首先判断两算式的结果是否一致,若不一致,则算式肯定不同;若一致,②判断两算式的具体构成和顺序是否相同,若不一致,则算式肯定不同;若一致,③判断两算式中同一操作符对应的两个操作数是否相同,若不同,则两算式不同,若相同,则可判断这两个算式是重复的。

//操作数和操作符的填入顺序与按算式的计算顺序相同
举例:判断 3+(2+1) 和 1+2+3 是否重复
	 3+(2+1)     1+2+3
操作数   2 1 3 3     1 2 3 3
操作符   + +         + +
//两算式结果相同,操作符相同,但同一操作符对应的操作数组成也相同,因此两算式重复
    
举例:判断 1+2+3 和 3+2+1 是否重复
	 1+2+3	     3+2+1
操作数   1 2 3 3     3 2 5 1
操作符   + +         + +
//两算式结果相同,操作符相同,但同一操作符对应的操作数组成不同,因此两算式不重复    

这种查重方案可能由于某些没有考虑的情况导致误判,欢迎指正。

五.测试运行

(1)一万道题测试

10000-e

10000-e

10000-a

10000-a

(2)各种情况测试(以10道题为例)

没做的情况

没做

全对的情况

全对

全错的情况

全错

部分对的情况

部分对

六.项目小结

陈志恒:一开始听老师介绍题目的时候觉得这个项目挺简单的,在阅读项目要求后发现并不容易。共同讨论后,明确编程思路,各自负责特定的模块。在完成本次结对项目后,我发现个人项目和结对项目的差异就在于个人项目是一个人单干,遇到问题时也只能从一个人的角度去寻找解决方案,而结对项目中遇到问题时能从多角度看问题,使问题的解决变得更加容易。同时结对项目分工明确,有利于个人专注于做好自己负责的模块。

梁晋源:在本次结对项目中,与陈志恒进行了充分的沟通交流来编写代码,我认识到了每个人都有不同的编程方式和习惯,体会到了团队合作的奇妙感觉。多和队友交流沟通,能达到更好的效果。

posted @ 2021-10-25 23:36  heng0  阅读(104)  评论(0)    收藏  举报