结对编程四则运算第三周-挑战出题
设计思路
-
1.关于题目等级类的设计(Arithmetic类): 题目类的设计中我们确定了四个等级的题目,分别是一级20(过程量)以内加减法,二级20(过程量)以内乘除法,三级20(过程量)以内加减乘除混合运算,并且实现括号的随机插入,四级题目实现分数的加减乘除。
- 在该类中调用了RationalNumber类,即分数基本内容。重新添加了一个fraction方法,让其随机输出真分数。
-
2.关于中缀表达式转后缀表达式的设计(Convert类):
- 首先,我们要清楚为什么要把中缀表达式转换为后缀表达式。
- 其实是为了计算机更好的计算。如果按照正常的运算顺序,计算机无法判断
1+2*3
优先计算哪个。所以,我们必须人为地进行优先级排序,把1+2*3
转换为123*+
这样计算机就懂了原来先做乘法哦。 - 那么,如何实现中缀表达式转换为后缀表达式呢?
- 大致的思路是这样。我们要定义一个字符串和一个栈。因为我们最后输出的东西——后缀表达式,是一个字符串。根据刚刚的例子
123*+
。我们应该能够发现,当我们判断一个中缀表达式的时候,应该把数字直接划入字符串,符号入栈,然后再依次弹出。 - 通过
StringTokenizer
类把字符串进行分割。 之后,要比较栈里面符号优先级的顺序。把后入栈的符号和栈内的符号进行比较。如果后入的优先级高,那么就入栈;反之,则弹出栈内的符号后入栈。
-
3.关于后缀表达式求值的设计(Comparision类): - 首先,我都把数字转化为Rationalnumber类型。整数就是分母为1的分数。
- 然后,通过switch语句,来分别调用Rationalnumber类的+-*/方法。
-
4.关于面向用户输出的设计(ArithmeticTest类): - 首先因为是和用户交互的类,所以引入了Scanner类。
- 其次再让用户选择其想要做的题目等级数和想要做的题目数,最后在每一次结束后询问用户是否想继续做题。
- 在实现过程中运用了swithch语句来高效定位,用which语句来创造循环来问用户还想不想继续做题;
- 运用新的convert类对象和Comparision类对象去计算随机生成的题目答案并对比用户输入的答案,提示用户正确与否,然后导入两个DecimalFormat类NumberFormat类,计算正确率并格式化输出。
- 最后写入文件的实现也是在该类中完成的,实现了将随机生成的题目和用户输入的答案写入到文件。
-
5.关于括号添加的设计和遇到的困难和解决: - 有关括号的内容我(小组成员段志轩)一开始想用ascii码和循环进行,具体步骤是先利用循环和charAt方法,找到符号的索引并存在数组里。然后通过随机数通过索引随机调用数组中的符号,然后在利用索引根据符号的相对位置插入前后括号。但是后来在运行时发现在处理两位数的时候会有错误。于是否掉了这个方案进行表示,但是后来在实际运行时发现不行。
- 于是后来改变了思路。就是在生成的计算式中的空格中做一些处理。生成计算式时在空格中设置一个随机数调用事先创建的数组。数组中只有两个元素。一个是空格,另一个就是带括号的两个随机数加和。
- 6.关于分数的设计实现理念:
- 通过
StringTokenizer
类把a/b
以/
分开。分别判断整数(分母为1)和分数的时候。
-
扩展需求
-
关于将题目写入文件: - 首先用java.io包中的FileWriter类创建一个叫xieru的对象,然后在定义两个ArrayList类;
- 然后在每一个case子句中将随机生成的题目添加到列表里面,然后再用ArrayList类的get方法找到具体对应的题目和用户输入答案,用for循环一个一个的写进去。
- 在for循环里面将两个数组按照制表符写入文件,可以排列整齐清晰。
- 关于从文件中读题:创建了一个新类ReadAndJudge想从我之前写好的文件中读题目再设计一个数组传入Convert类去将中缀表达式变成后缀表达式,然后再去计算后缀表达式,再将文件里的用户输入的答案读出,与计算结果比较,再输出正确与否和正确率最后将正确答案和正确率写入文件。
- 嗯,想的极其美好,但是因为想美观,写入的一串随机长度题目因为能力的限制,尝试了好久(Substring方法、存数组方法)都无法成功取出随机长度的题目,还没解决。
- 其中遇到的问题:遇到的问题就是最后阻挡的那个问题最严重的,其中还有只能写入用户的一个等级运行的问题,通过调试和修改达到了目的,但是忘记了错误截图。
项目的UML类图
❀❀❀我们的UML类图:※
相关测试过程截图
编写代码遇到的困难和解决办法
这周我们的错题都没有截图,具体的也记不大清,困难大概让我总结一下:如果需要具体的话可以去我们三个人前几周的博客去看。谢谢谢谢Thanks♪(・ω・)ノ
- 1.符号类型在输出中一直相同,数字在输出中也一直相同。
- 2.分数不能输出,在循环中实例化数组但没有实例化对象,因此无法调用个人faction方法。
- 3.在将中缀表达式变后缀表达式的过程中,不知道怎样把前一个类中生成的表达式用进来。
- 4.双等号错误。
- 5.“问题九”不变错误。
- 6.中缀变后缀中StringTokenizer类比String.toCharArray类好用的问题,分数不方便分割。
- 7.用ASCII码判断随机输入括号进阶到一位数到瓶颈期。
- 8.用户不知所措,哭死在不贴心的程序员面前。
项目的码云链接
小组各个成员信息
- 1.20172301郭恺同学:驾驶员 善于编程 善于理解 推动整体发展进度 帮助组员理清思路 做为编程过程的指引的领导
- 2.20172304段志轩同学:驾驶员 善于创新 善于思考 解决局部难点困点 提供可行方案和需求路径 作为编程过程中的优秀首席工作者
- 3.20172328李馨雨同学:领航员 善于提问 善于督促 督促时间有效分配 检查程序部分错误 并思考动手完善 作为后勤做的特别好的老阿姨
给出小组最终贡献度划分(按百分比给小组各成员划分贡献度,各成员贡献之和为100%)
姓名 | 郭恺 | 段志轩 | 李馨雨 |
---|---|---|---|
学号 | 20172301 | 20172304 | 20172328 |
贡献率(%) | 38% | 32% | 30% |
小组各成员项目感想
- 20172301(郭恺):总体来说难度适中,因为毕竟人多力量大,思路的碰撞可以产生很多有趣的想法,让我受益匪浅。一定程度上,锻炼了自己多角度思考问题的能力。我觉得,这个在程序设计上是十分必要的。并且,如何精简程序也是一门学问,我觉得我们应该还需要拓展自己的知识。
- 20172304(段志轩):总的来说这次是我们第一次进行的独立编程,虽然很辛苦,但是感觉到了自身的编码功力得到了很大的提高,学习java不能纸上谈兵,还需要真刀真枪的实干。纸上得来终觉浅,绝知此事要躬行。
这正是我们结对小组的真实写照。而且,在此次编程中,我确实感受到了结对编程的好处与实际的效果,团结就是力量,希望下次还有结对编程的机会。 - 20172328(李馨雨):在刚接到项目的时候感觉特别复杂,但是随着一点点剖析分解成一个个模块,一点点的去解决,发现要考虑的问题更加具化,当然,遇到的问题很多,感觉这种项目对编程能力真的很有提高。不过在编程方面,还是很佩服我们小组的其他两位成员,思路比我清晰,速度比我快。我比较适合找问题,去测试,做一些简单细致的工作。学习了中缀转后缀和后缀表达式的求值,虽然代码实现是队友实现的,但是也是学习了新知。
给出小组结对编程照片
学习过程中在微信群中热烈的讨论和留下的两张手稿
PSP时间规划
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 65 |
Estimate | 估计这个任务需要多少时间 | 3 | 2 |
Development | 开发 | 2000 | 3000 |
Analysis | 需求分析 (包括学习新技术) | 350 | 300 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 10 |
Design UML | 设计项目UML类图 | 60 | 60 |
Coding | 具体编码 | 1500 | 2000 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 300 | 300 |
Size Measurement | 计算工作量(实际时间 ) | 2 | 2 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 10 |
合计 | 4395 | 5229 |