结对项目——四则运算总结
一、需求分析
- 能够生成n道四则运算题,n可由使用者输入来控制
- 支持整数
- 支持分数
- 生成题目中含有括号
- 可以判断正误,如果错误会输出正确答案
- 统计正确率
- 支持多种语言(简体中文,繁體中文,English)
- 处理生成题目并输出到文件,完成题目后从文件读入并判题。
二、设计思路
在第一周的基础上,主要是添加对文件的操作,以及生成语言包。对文件的操作,主要是创建第一个文件,然后用原先的程序生成题目写入到文件中,在文件中写入答案后,用StringTokenizer判断文件中的答案,将文件中的答案与程序运算出来的结果对比,输出正确或错误,最后输出正确率。
三、实现过程中的关键代码解释:
主函数,包括对文件的操作以及对语言包的调用
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")); } } 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 + " " + 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")); } }
四、测试方法
在第一周的基础上 感觉已经没有啥能测试的了。
五、运行结果截图
选择语言,并输入要生成的题目数后,将会自动生成文件夹,并在文件夹里面显示题目:
在文件里输入答案并保存后,输入Y继续,程序会自动读取文件中的答案并判题。显示正确与否,正确率:
六、代码托管
七、遇到的问题及解决办法
问题1:查重
问题1解决办法:放弃
问题2:题目的意思是如何对文件进行操作的不太理解,因为放假第十章学的一般,有些文件操作还不熟悉
问题2解决办法:参考学长的代码,也是一种学习
问题3:怎么可以支持多种语言呢,难道if(xx)用中文,else if(xx)用英文,else用繁体中文吗
问题3解决办法:在网上找方法,参考学长的代码,生成properties配置文件
八、对结对的小伙伴做出评价
相对于上周,我认为我们的合作方式是有进步的,不像上次那样让他忙活太多东西,这次我也搜了很多资料,做了很多东西,而且这次有不少东西是我们一起做的,有点那种一个驾驶员,一个领航员的意思。有时候,两个人是在一起做一件事,而不是分工做完一件事,这样合作会很好,也没有啥分歧。
九、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 |