四则运算题目生成
github地址:
https://github.com/kinglc/AutoCalculator
队友blog:
http://www.cnblogs.com/linanyj/
思路:
整个项目包括生成题目、解题、GUI、倒计时、得分情况和历史记录几个部分。
生成题目要求生成1000个不重复,考虑到分数参与运算,我们设计每一个算式随机生成四个数字,并根据这四个数字生成“+ , - , * , / , ^ (**)”中的三个算符组成一个完整的算式。我们不考虑负数情形,并且不允许指数以分数形式出现,为了减少计算量降低难度,有以下设置:
①当前面出现过乘方时后面不允许出现分号和新的乘方
②当前面出现分号时后面不允许出现新的分号
③当结果为负数时重新生成
当程序开始运行或更改乘方属性时生成全部题目并保存在文件A内, 程序初始化从文件中读取第一行算式,回答问题后(时间耗尽当做已回答一次)依次从文件A中读取算式。
程序结束时将当前分数存储在另一文件B中,并读取文件B显示最近十次分数记录。
实现:
我和某J姓队友按照功能定义了四个类 Create、Calculate、Fraction、MainJF,分别进行题目的生成、运算的计算、分数的处理和GUI的实现。以下是Creat类对于生成不重复的1000道运算题目的实现。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 String[] symbol={"+","-","*","÷","/","^"}; 2 3 public Create(int power_form) { 4 this.power_form=power_form; 5 if(power_form==2)//设置两种不同的乘方符号 6 symbol[5]="**"; 7 try { 8 file=new File("formula.txt"); 9 writer =new BufferedWriter(new FileWriter(file)); 10 } catch (Exception e) { 11 e.printStackTrace(); 12 } 13 randomNum(); 14 }
随机生成运算题目:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public void randomNum(){ 2 for(int i=0;i<2000;i++)//生成两千个题目 3 { 4 formula=""; 5 int j=3; 6 boolean power=false; 7 boolean fraction=false; 8 while(j>=0)//生成四个数字 9 { 10 int num =(int)(Math.random()*500+1);//范围在1-501 11 formula=formula+num; 12 if(j>0) { 13 if((num%6==4&&(power||fraction))||(num%6==5&&power)) //已有乘方后不添加乘方,已有乘方或分数后不添加分数 14 formula = formula + symbol[(num % 6) - 3]; 15 else 16 { 17 if(num%6==4&&!fraction)fraction=true; 18 if(num%6==5&&!power)power=true; 19 formula = formula + symbol[num % 6]; 20 } 21 } 22 j--; 23 if(j==-1) 24 { 25 Calculator calculator = new Calculator(formula, power_form); 26 if(calculator.cal().equals("wrong!")) 27 { 28 calculator.cal(); 29 fraction=false; 30 power=false; 31 formula=""; 32 j=3; 33 } 34 } 35 } 36 save(formula); 37 } 38 try { 39 writer.close(); 40 } catch (IOException e) { 41 e.printStackTrace(); 42 }
//其他类的实现参考文首队友J的博客
总结:
这次和队友合作完成结对项目对我而言是个不小的考验。由于扩展要求里有一项是要求要有GUI,于是从最开始我们就在纠结是用C++、C#还是用java实现,后来J赢了我们决定用java来完成整个项目。但是我没有学习过java相关知识,于是我的主要任务就是一边给队友提供设计思路一边自学java,稍微了解一点java知识之后开始进行生成部分的实现。光是自学和实现花费的时间就已经远超预期,然而完成代码整合后进行的一系列测试和修正更是让人心力交瘁。好在我们之前就制定有代码规范,整合起来不是太过艰难,但这一次的合作的确让我感受到了和一个人做不同的感觉。我还在这次项目过程中了解了java的一些基本语法,对文件的操作等等,有很大的收获。
p2p表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 30 | 30 |
·Estimate | ·估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 2010 | 2160 |
·Analysis | ·需求分析(包括学习新技术) | 480 | 400 |
·Design Spec | ·生成设计文档 | 60 | 50 |
·Design Review | ·设计复审 | 30 | 30 |
·Coding Standard | ·代码规范 | 30 | 60 |
·Design | ·具体设计 | 240 | 300 |
·Coding | ·具体编码 | 900 | 1080 |
·Code Review | ·代码复审 | 90 | 60 |
·Test | ·测试 | 180 | 180 |
Reporting | 报告 | 70 | 70 |
·Test Report | ·测试报告 | 30 | 30 |
·Size Measurement | ·计算工作量 | 10 | 10 |
·Postmortem&Process Improvement Plan | ·事后总结并提出过程改进计划 | 30 | 30 |
合计 | 2110 | 2260 |