20175314 结队编程项目——四则运算第二周
一、需求分析
实现一个命令行程序,要求:
- 自动生成小学四则运算题目(加、减、乘、除)
- 支持整数
- 支持多运算符
- 支持真分数
- 支持多语言
- 能定义四则运算中数字的上限
- 支持生成题目去重
- 能生成随机数
- 能随机产生含有括号的算式
- 要建立堆栈,进行中缀转后缀,以及后续后缀的运算
- 能输入想要产生的题目数
- 能输入用户计算的答案
- 能够比较用户输入的答案是否正确若错误则返回正确答案
- 能够统计用户答题的正确率
二、设计思路
- 利用properties实现java的多语言切换
- 通过range定义四则运算数字的上限
- 生成一个有加减乘除支持括号的算式,以字符串的形式输出
- 利用随机数random,根据随机数生成的数来对应符号与数字,从而形成算式
- 利用比较字符串String实现生成题目去重
- 使用中缀表达式转后缀表达式规则将中缀表达式形式的字符串数组以后缀表达式的形式储存在堆栈中
- 用后缀表达式计算规则进行计算,得出结果
- 得出的结果与用户输入结果进行比较
- 计算出正确率
三、实现过程中的关键代码解释
利用properties实现java的多语言切换
switch (choose){
case 0:
locale=new Locale("zh","CN");
res= ResourceBundle.getBundle("message",locale);
break;
case 1:
locale=new Locale("ft","CN");
res= ResourceBundle.getBundle("message",locale);
break;
case 2:
locale=new Locale("en","US");
res= ResourceBundle.getBundle("message",locale);
break;
default:System.out.println("选择错误!選擇錯誤!Wrong Choose!");
System.exit(0);
}
与前一道生成的题目进行比较,若与前一道题目一模一样,那么直接进行下一次循环,不输出这个题目。
String Question2="";
for (int i = 0; i < Number; i++) {
String Question = getQuestion.get();
if(Question2.equals(Question)){
i--;
continue;
}
四、测试结果
- 简体中文100%正确率:
- 繁体中文66.7%正确率:
- 英文66.7%正确率:
五、码云链接
六、UML类图
七、遇到的问题
一开始对以前没有编写实现过的功能感到不知从何处下手,比如很简单的题目去重,后来想到了数据结构中遍历的方法,是个笨方法但在随机生成的符号数字组成算式中出现相同几率几乎为零所以可以不用在意这些细节;
本来没有想做语言包功能的打算因为以前不管是C语言还是Java都没有实现过这样的功能,后来通过查找网上很多资料了解了配置properties文件的方法(竟然是从百度知道中知道方法的虽然不是很具体),然后通过case语句实现了这个功能;
后缀表达式的确很奇怪开始时无从下手,因为在第一周我们也没有实现这个功能,然后我们请教了其他小组找到了方向最后得以实现。
八、心得体会
吸取之前的经验在上周程序的基础上进行大规模的功能升级,我们的四则运算系统最终有了三个语言包和十个类,分别用于实现栈计算、随机生成运算符号、随机生成数字、生成括号、组成算式、中缀表达式转换成后缀表达式、出栈、运算系统主类、分式运算和计算正确率,这对我和我的组员来说无疑是个相当大的工程,但最终带给我们的成就感也是值得付出的,这周因有班级团日活动、团学工作和其他一众课程的实验导致完成博客时间较晚,下次一定做好规划做好提前量,使得完成作业不会紧迫,不然会让我们在编写中也出现了不少低级bug浪费时间,同时,本次完成结对任务让我体验到了开发软件工程的分工合作,对于以上一些简单到只有几行的类我们是分开完成的,如随机生成运算符号、计算正确率等,这样就像完成一块拼图,两个人分别拼出两块大件然后再进行组合和补漏,能够互相监督并高效运作。
九、Personal Software Process时间
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 50 | 14.3% |
设计 | 40 | 11.4% |
代码实现 | 180 | 51.4% |
测试 | 30 | 8.6% |
分析总结 | 50 | 14.3% |
十、点评伙伴
我的伙伴在本周完成任务的过程中可以说起到了相当大的作用,因为他的编程基础和思维比较好,系统中很多好的想法都是他提出的,我作为基础功能的实现者和代码的排查者,能在过程中多向他学习并多查阅资料,也是一种提升自我的很好办法。