20165318 结对编程项目-四则运算 整体总结
目录
- 一、需求分析
- 二、设计思路
- 三、实现过程中的关键代码解释
- 四、测试方法
- 五、运行过程截图
- 六、代码托管
- 七、遇到的困难及解决方法
- 八、对结对小伙伴的评价
- 九、结对照片
- 十、参考代码
- 十一、PSP
- 参考资料
一、需求分析
-
能随机生成n道四则运算题目,n由使用者输入
-
支持整数和分数
-
支持多运算符
-
能够判断正误,错误时能提醒并输出正确答案
-
能计算出正确率
-
能多次生成题目,直到使用者选择退出
-
文件:
- 处理生成题目并输出到文件
- 完成题目后从文件读入并判题
二、设计思路(同时输出UML类图)
基于之前的工作,这一阶段的主要重心放在了生成txt文件,对文件进行输入输出等操作,此处设计了两个主类Questions
和Results
分别实现这两个操作。输出题目放在Exercisies.txt
中,结果放在ExercisesResults.txt
中,实现在读入程序并修改后打开txt文件用以查看程序的运行结果。
- UML图
三、实现过程中的关键代码解释
在程序中用记事本(可执行文件)打开Exercises.txt
文件
Process p=null;
try {
p=Runtime.getRuntime().exec("notepad.exe Exercises.txt");
} catch (Exception e) {
e.printStackTrace();
}
从文件读入题目并判题
Calculator jdg = new Calculator();//创建一个新的`Calculator`对象,进行计算
NifixToSuffix nts = new NifixToSuffix();//创建一个`NifixToSuffix`对象,将中缀式转换为后缀式
NumberFormat fmt = NumberFormat.getPercentInstance();//创建一个`NumberFormat`对象,将分数转换为百分数
FileInputStream fis = new FileInputStream("Exercises.txt");//创建指向`Exercises.txt`文件的输入流
InputStreamReader isr = new InputStreamReader(fis);//将isr定义为fis的上转型对象
BufferedReader in = new BufferedReader(isr);//创建 `BufferedReader`流读取文本行
StringTokenizer tokenizer1 = null, tokenizer2 = null;//创建`StringTokenizer`对象作分隔标记
String token1, token2, token3, token4;
String s1 = null;
String str;
int q = 0, count = 0;
PrintStream ps = new PrintStream("ExercisesResult.txt");//创建指向`ExercisesResult.txt`的输出流
while ((str=in.readLine()) != null) { //从`Exercises.txt`文件中读入文本行,文件中每个题目都是一行,且形式都为“题目n:表达式 =答案”。
tokenizer1 = new StringTokenizer(str, ":");//以":"作为分隔标记
token1 = tokenizer1.nextToken();//将":"前的内容赋给token1(“题目n”)
token2 = tokenizer1.nextToken();//将":"后的内容赋给token2(“表达式 =答案”)
tokenizer2 = new StringTokenizer(token2, "=");//以"="作为分隔标记
token3 = tokenizer2.nextToken();//将"="前的内容赋给token3(“表达式”)
token4 = tokenizer2.nextToken();//将"="后的内容赋给token4(“答案”)
nts.conversion(token3);//将token3转化为后缀表达式
if (token4.equals(jdg.evaluate(nts.getMessage()))) {//判断输入答案是否等于计算结果
s1 = "正确!";
q++;
} else {
s1 = "错误,正确答案为:" + jdg.evaluate(nts.getMessage());
}
String s2 = str + "
" + s1 + "
";
ps.append(s2);//将题目及判断结果写入到`ExercisesResult.txt`文件中
count++;
}
double accuracy = (double) q / count;
String s3 = "完成" + count + "道题目,答对" + q + "道题,正确率为" + fmt.format(accuracy);//计算题目数目及正确率,将正确率转化为百分数。
ps.append(s3);
四、测试方法
NifixToSuffer
类方法的测试(中缀转后缀)
Calculator
类方法的测试(四则运算)
RationalNumber
类方法的测试(有理数及真分数的计算)
五、运行过程截图
六、代码托管
七、遇到的困难及解决方法
-
Q1:在文本中计算统计正确率时,输出正确率都是0%,如下图:
-
解决方法:仔细查看代码后,我们发现,在向文本中输入题目时,会在“=”后面多加了一个空格,导致在判断输入结果与计算结果时比较出现错误,将空格去掉后,就可以正常运算了。
八、对结对的小伙伴做出评价
在这周的结对编程中,我和我的小伙伴交换了角色,这次她承担驾驶员的角色,我是领航员的角色,由于对第十章文件输入输出的内容我们掌握的都不是很牢固,因此我们一起复习巩固了一下相关内容。在这周编程的过程中,我们遇到了挺多问题,但在我们一起查阅资料的过程中一一解决,虽然我们的代码还不是很完善,但通过这周的磨合,我们的默契度有了很大的提高,思考问题的时候,能够想到一个点上,然后集中攻破。我觉得我们在一起学习,总体来说是一个相互促进的过程。
九、结对照片
十、参考代码
由于我和我的小伙伴对输入输出流的基础知识掌握的不是很牢固,在写文件输入输出时,参考了许多书上的代码,尤其是如何直接在Java中打开txt格式的文件,我们参考了如何使用java程序打开一个文件?,使生成的题目所在的txt文件可以直接在运行代码时直接打开。
十一、PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(小时) | 实际耗时(小时) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 1 | 1 |
Development | 开发 | ||
·Analysis | ·需求分析(包括学习新技术) | 1.5 | 4.5 |
·Design Spec | ·生成设计文档 | 1 | 1.2 |
·Disign Review | ·设计复审(和同事审核设计文档) | 0.5 | 0.8 |
·Code Standard | ·代码规范 | 1 | 1.5 |
·Design | ·具体设计 | 1.5 | 2.5 |
·Coding | ·具体编码 | 5 | 7 |
·Code Review | ·代码复审 | 1 | 1.5 |
·Test | ·测试(自我测试,修改代码,提交修改) | 2 | 3 |
Reporting | 报告 | ||
·Test Report | ·测试报告 | 1.5 | 2 |
·Size Measurement | ·计算工作量 | 1 | 1 |
·Postmortem&Process Improvement Plan | ·事后总结,并提出过程改进计划 | 1 | 1 |
合计 | 18 | 27 |
参考资料
2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算
结对编程项目-四则运算
现代软件工程讲义 个人项目和结对项目练习 四则运算
逆波兰算法实现四则运算
如何使用java程序打开一个文件?