四则运算题目生成

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道运算题目的实现。

 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     }
View Code

随机生成运算题目:

 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         }
View Code

//其他类的实现参考文首队友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
原文地址:https://www.cnblogs.com/shera/p/9103675.html