结对项目——四则运算 整体性总结
结对项目——四则运算 整体性总结
需求分析:
上一周已经将扩展需求以外的任务完成,故而本周任务只需实现扩展需求即可。
- 生成题目后存入文件
- 完成题目后从文件读入并进行判断
- 支持
繁體中文
,简体中文
,English
设计思路:
本周的设计思路就是查阅资料、思考实现文件操作以及多种语言的支持。文件操作调用固定方法即可自不用说。多语言支持上,我开始想的是在主程序中把各语句都写在循环判断中。仔细想来未免有点太没有技术含量,经过交流得知可以通过导语言包来解决,虽然依旧简单,但感觉上操作性强了那么一点。由于我们项目主体在上次提交已近完成,没有应用好S.O.L.I.D原则,本周就先将扩充内容加到main程序中,后续会继续应用SOLID原则重新进行更良好的扩充。
关键代码:
import java.util.*;
import java.io.*;
import java.lang.*;
import static java.lang.System.out;
public class Main {
public static void main(String[] args) throws IOException {
StringTokenizer tokenizer1 = null, tokenizer2 = null;//创建`StringTokenizer`对象作分隔标记
String token1, token2, token3, token4;
String s1 = null;
String str;
int rightnum = 0, count = 0;
float rate;
int n,q = 0,choose;
String expr;
CreateQuestion creque = new CreateQuestion();
PrintStream ps = new PrintStream("Exercises.txt"); //创建`Exercises.txt`
Calculation cal = new Calculation();//创建一个Calculation的对象cal
ChangeSuffix cs = new ChangeSuffix();//创建一个ChangeSuffix的对象cs
FileInputStream fis = new FileInputStream("Exercises.txt");//创建指向`Exercises.txt`文件的输入流
InputStreamReader isr = new InputStreamReader(fis); //将isr定义为fis的上转型对象
BufferedReader in = new BufferedReader(isr); //创建BufferedReader流读取文本行
Scanner scan = new Scanner(System.in);
CreateQuestion cq = new CreateQuestion();
System.out.println("输入0为中文版~~~Input 1 is English version~~~輸入2為簡體中文");//选择语言
choose = scan.nextInt();//choose的数值对应不同的语言
Locale locale;
ResourceBundle res = null;
switch (choose){
case 0:
locale=new Locale("zh","CN");
res= ResourceBundle.getBundle("message",locale);
break;
case 1:
locale=new Locale("en","US");
res= ResourceBundle.getBundle("message",locale);
break;
case 2:
locale=new Locale("ft","CN");
res= ResourceBundle.getBundle("message",locale);
break;
default:System.out.println("选择错误!~~~Wrong Choose!~~~選擇錯誤 !");
System.exit(0);
}
while(true)
{
System.out.print(res.getString("b"));
n = scan.nextInt();
System.out.println(" ");
if (n > 0) {
for (int i = 0; i < n; i++) {
//生成题目
int a;
a = i + 1;
expr = cq.getQuestion();
String s = res.getString("c") + a + ":" + expr + " =";
System.out.println(s);
ps.println(s);
}
ps.close();
break;
} else {
System.out.println(res.getString("d"));
}
//iof.close();
//ps.close();
}
Process p=null;
try {
p=Runtime.getRuntime().exec("notepad.exe Exercises.txt");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(res.getString("e"));
String dd = scan.next();
if(dd.equals("Y")) {
PrintStream ps2 = 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(“答案”)
//cs.toSuffix(token3);//将token3转化为后缀表达式
if (token4.equals(cal.evaluate(cs.toSuffix(token3)))) {//判断输入答案是否等于计算结果
s1 = res.getString("f");
rightnum++;
} else {
s1 = res.getString("g") + cal.evaluate(cs.toSuffix(token3));
}
String s2 = str + "\n" + s1;
System.out.println(s2);
ps2.println(s2);//将题目及判断结果写入到`ExercisesResult.txt`文件中
count++;
}
rate = (float) rightnum / count * 100;
String s3 = (res.getString("h") + count + res.getString("i") + rate + "%");//计算题目数目及正确率,将正确率转化为百分数。
System.out.println(s3);
ps2.println(s3);
}
else System.out.println(res.getString("j"));
}
}
运行截图:
生成题目后,弹出txt窗口,在窗口中答题,答完后保存并关闭,在程序中确认提交,程序判断对错后回馈一个成绩单。
代码链接
psp图
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
·Estimate | · 估计这个任务需要多少时间 | 5 | 10 |
Development | 开发 | ||
·Anlaysis | · 需求分析 (包括学习新技术) | 2 | 2 |
·Design Spec | · 生成设计文档 | 5 | 5 |
·Design Review | · 设计复审 (和同事审核设计文档) | 3 | 3 |
·Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
·Design | · 具体设计 | 20 | 20 |
·Coding | · 具体编码 | 120 | 100 |
· Code Review | · 代码复审 | 10 | 10 |
· Test | · 测试(自我测试,修改代码,提交修改) | 5 | 10 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 15 | 15 |
· Size Measurement | · 计算工作量 | 15 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 220 | 205 |
对结对的小伙伴作出评价
本周的合作依然完成的很顺利,小伙伴做的非常好,他始终延续了自己的严谨作风,能够始终看到一些方面的不足,并进行改正。
遇到的问题和解决:
-
查重的实现:
老实说这个问题并没有解决。虽然其他组的小伙伴提出了一些非常精彩的思路,但是仔细研读题目扩充需求后我们发现,查重需要分级进行,0级相当于不查重,1级进行交换律的区分等等。我们经过尝试后发现当一个算式足够复杂(支持分数和括号以后产生机率还是比较大的),即使是题目中最简单的交换律都难以全面判断,目前还没有找到一个非常好的判断或是表述方式,无奈只能暂时放弃,等待新的思路产生。 -
文件操作的用意:有关文件的操作我们一直不解其意。为什么生成题和判题要由文件的写入和读取进行中转。不知以何种手段体现这步文件操作成了我们组思路的断点。直到我打开蓝墨云,看到每周都要做的章节测试,豁然开朗。我突然发现各操作都可以找到对应,运行运算系统相当于点进测试页面,页面刷新我们就能看见本周的测试题目,这一点我们可以通过让txt弹出来实现,在txt中答题就相当于我们在网页中进行每道题的作答,然后我们关上txt文件回到程序进行提交,系统反馈成绩单,虽然简陋但一步不少的模拟了这种答题过程。
项目总结:
上周我们将整个项目除了扩展需求以外的任务全部做好了,给这周留下了非常少的任务。但由于意外记错了提交时间,太晚开始进行本周的项目,差点毁掉了本周良好的开局。一些有关SOLID原则的应用也没有做到。但总体来讲还是比较成功的一次尝试。一个项目,或大或小,他的实现都是要编程者不断构思的。不管需要得到一个好的结果,过程中每一步的实现,每一点细节的完善,都需要我们不断的碰撞思维的火花,学习不断的再进行,我们可改进的空间也越来越大,昨天看起来还自觉完美的程序今天看上去就可能到处都是可以动手修改的缺陷,从一开始的厌烦,到最后只要看到一点改进的空间,就想再进行调试得到更好的结果。我们不停的在做,也不停的在学,每一点进度的累积、每一处错误的改进都或许需要新知识的支持,我想这也就是“做中学 Learning by doing”的一点体现了吧。