20162329 张旭升 阶段四则运算(挑战出题) 阶段编程四则运算(挑战出题)

结队成员: 刘伟康

学号: 20162329

期望分数分配: 30%刘伟康,70%张旭升

一.需求分析

1.在命令行参数中输入题目数量和等级后可将题目输出到文件中(只出题不判题)

注:该功能我们在两周之前就已经可以达到了(但是上周的结对编程四则运算中却没有给我们加这部分分值)所达到的效果如下:

20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)

2.生成题目中去除重复题目

3.(个人拓展)可以使用户在文件中作答后运行另一个程序判断正误且结果写入另一个文件

java OutputTest.java FileName1 FileName2

二.设计思路

UML类图:

20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)

这次的项目我还是在上次的四则运算的基础上完成的,因为之前就已经完成了题目输出至文件的功能,这次只需要修改其支持命令行参数和支持去重即可,具体解释如下:
对于修改命令行参数:
我设计的题目生成的方法需要传入两个int类型的参数,即题目数量和题目的题目等级(运算符号的多少),在main函数中将命令行参数中输入的第一个和第二个参数都使用Integer.parseInt()方法转化为int类型然后传给生成题目的方法。
对于题目去重(根据计算答案):
我在生成题目的方法中将生成的每一个题目都放在一个列表中,然后在每生成一个题目时就会先对题目进行计算,将计算的答案传入另一个列表,然后利用indexOf方法来判断前面放入该列表的答案是否有和该答案重复的,如果有就去掉改答案对应的题目。

三.关键代码解释

            for (String i : list1)   
                ti += i;
            StringTokenizer tokenizer = new StringTokenizer(ti);
            while (tokenizer.hasMoreTokens()) {
                char N = tokenizer.nextToken().charAt(0);
                list3.add(N);
            }
            list1.clear();
            Collections.sort(list3);
            for(char i:list3)
                Ti += i;
            list3.clear();
            ori.evaluate(ti);
            String restrult = count.evaluate(ori.getMessage());
            if (list2.indexOf(restrult) >= 0)
                if (list4.indexOf(Ti)>=0)
                    j--;
                else if(Ti.indexOf("(")>=0)
                    j--;
                else {
                    list4.add(Ti);
                    list.add(ti);
                }
            else {
                list2.add(restrult);
                list4.add(Ti);
                list.add(ti);
            }

以上代码取自src -> Practice.java -> 64行至90行


  • list中存放的是带输出的式子
  • list1中存放的是一个一个的数和运算符和括号
  • list2中存放的是答案
  • list3中存放的是排序或待排序的式子
  • list4中存放的是存放排序后不重复的式子
  • 利用简易的for循环将其中的元素取出来然后累加在一起就成为了一个完整的运算式
  • 将式子以空格为分隔符分成char类型的单字符存入list3
  • list1清空以便于下一道题目的生成,然后运用sort方法对list3进行排序
  • 遍历出list3中的元素累加后赋值给变量Ti
  • 清空list3便于下一个题目的判断
  • 将生成的题目作为参数传给后缀表达式的转换方法ori.evaluate()
  • 将该题计算的答案传入list2
  • 对答案进行判断,是否list2中已经存在该答案,如果存在的话就再判断list4中是否存在排序后依旧相同的式子,如果存在就重新出题,如果不存在就再排除掉因为不同位置加括号所以重复的题目之后将该题目加入输出列表list,如果list2中不存在相同答案就把该题目传入输出列表list等待输出。

四.测试方法


运用老师给出的测试工具测试


结果如下:
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)

五.运行过程截图

20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)
20162329 张旭升 阶段四则运算(挑战出题)
阶段编程四则运算(挑战出题)

六.代码托管

七.遇到的困难即及解决方法

问题 解决方案
问题1:因为之前我们使用的去重方法是只用答案去重,并且我们的数据中存在分数,并不满足输出需求,当将分数去掉后我们的去重方法就出现了问题,就是在测试100道一个运算符的题目时题目会不足100个导致程序会进入一个死循环,具体问题是程序将把类似3 -36-67-7等都当做一个题目,对此问题解决方案如下。 我们的具体解决方案就是对去重结构进行调整,我们在判断答案相同后会再进行一个判断,就是将题目中的元素按一定顺序排序后比较是否相同,只有题目相同,式子相同才会被当做一个题目去掉。
问题2:上一个问题解决后我们运行程序,又出现了一个问题,就是当加括号时可能会出现把4+7+6/86/8+(4+7)当做不同的题目,对此问题解决方案如下 我们又在式子判断不同的情况下又加了一个判断,是否是因为有括号而不同,就排除了因为括号而判断错误的情况!

八.对结队伙伴的评价


对于我的结队伙伴刘伟康同学,他的问题还比较多,在我看来他的很多思想都是很好的,但是他总是不去自己试着实现,有想法总是先告诉我(这一点没问题)然后我说“嗯,不错你去做出来”,他每次回答都是不会,导致许多东西都是我来做的。但是好在他写博客非常认真,这也是他每次分数都比我高的原因,因为老师最终看的只不过是我们的博客而已,代码什么的好像都无所谓。所以我也就不想说什么了。


PSP表

PSP2.1 Personal Software Process Stages 预估耗时(小时) 实际耗时(小时)
Planning 计划 1 1
· Estimate · 估计这个任务需要多少时间 20 20
· Analysis · 需求分析 (包括学习新技术) 1 3
· Design Spec · 生成设计文档 0.5 0.5
· Design Review · 设计复审 (和同事审核设计文档) 1 0.5
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 1 0.5
· Design · 具体设计 2 3
· Coding · 具体编码 2 4
· Code Review · 代码复审 2 1
· Test · 测试(自我测试,修改代码,提交修改) 2 1
·Reporting ·报告 1 1.5
· Test Report · 测试报告 2 2.5
· Size Measurement · 计算工作量 0.5 0.5
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 1 1