2016012006小学四则运算练习软件项目报告

项目源码地址:https://git.coding.net/cuixh998/week2homework2.git

目录中的result.txt文件见测试效果。

1.需求分析

软件基本功能要求如下:

Ⅰ程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。

Ⅱ每个练习题至少要包含2种运算符。所出的练习题在运算过程中不得出现负数与非整数。

Ⅲ练习题生成好后,将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。

软件附加功能要求如下:

Ⅰ支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。

Ⅱ扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可)。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。

2.功能设计

Ⅰ基本功能:满足软件基本功能要求的前提下,实现四则运算的功能,并能够将题目输出到文本文件中。

Ⅱ扩展功能:可以生成可以真分数的运算表达式,且分数可以自动化简。

3.设计实现

编码过程中只用了一个类通过调用不同的方法处理问题,实现程序的功能。

4.算法详解

部分代码如下,加入了一些注释,主要是采用了边生成边计算的方法。

  1 flag=0;//上一个符号为乘除,赋值1
  2         temp=0;//存储乘除多项式临时结果
  3         int count=0;//目前在计算的是第count+1个多项式
  4         for(i=0;i<number-1;i++) {//第一次循环,确定乘除号两边的数字
  5             if(fh[i]==3||fh[i]==4) {
  6                 if(flag==0&&fh[i]==4) {
  7                     czs[i]=1+(int)(Math.random()*99);
  8                     while(judge(czs[i])==false){
  9                         czs[i]=1+(int)(Math.random()*99);
 10                     }
 11                     czs[i+1]=1+(int)(Math.random()*99);
 12                     while(czs[i]%czs[i+1]!=0) {
 13                         czs[i+1]=1+(int)(Math.random()*99);
 14                     }
 15                     flag=1;
 16                     temp=czs[i]/czs[i+1];
 17                 }
 18                 else if(flag==0&&fh[i]==3){
 19                     czs[i]=1+(int)(Math.random()*99);
 20                     czs[i+1]=1+(int)(Math.random()*99);
 21                     flag=1;
 22                     temp=czs[i]*czs[i+1];
 23                 }
 24                 else if(flag==1&&fh[i]==3) {
 25                     czs[i+1]=1+(int)(Math.random()*99);
 26                     temp*=czs[i+1];
 27                 }
 28                 else {
 29                     czs[i+1]=1+(int)(Math.random()*99);
 30                     while(temp%czs[i+1]!=0) {
 31                         czs[i+1]=1+(int)(Math.random()*99);
 32                     }
 33                     temp/=czs[i+1];
 34                 }
 35             }
 36             else if(flag==1&&(fh[i]==1||fh[i]==2)){//初始化
 37                 ans[count++]=temp;
 38                 flag=0;
 39                 temp=0;
 40             }
 41         }
 42         if(flag==1) {//若最后一个符号为乘除
 43             ans[count++]=temp;
 44             flag=0;
 45             temp=0;
 46         }
 47         int finans=0;//最终结果
 48         count=0;
 49         for(i=0;i<number-1;i++) {//第二次循环,确定加减号两边的数字,并计算最终结果
 50             if(fh[i]==1||fh[i]==2) {
 51                 if(i==0) {
 52                     czs[i]=1+(int)(Math.random()*99);
 53                     finans=czs[i];    
 54                 }
 55                 else if(i==number-2) {
 56                     if(fh[i-1]==1||fh[i-1]==2) {
 57                         czs[i]=1+(int)(Math.random()*99);
 58                         if(finans==0&&fh[i-1]==2) {
 59                             fh[i-1]=1;
 60                         }
 61                         finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]);
 62                         while(finans<0) {
 63                             finans=finans+czs[i]+czs[i];
 64                             czs[i]=1+(int)(Math.random()*99);
 65                             finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]);
 66                         }
 67                     }
 68                     //
 69                     czs[i+1]=1+(int)(Math.random()*99);
 70                     if(finans==0&&fh[i]==2) {
 71                         fh[i]=1;
 72                     }
 73                     finans=((fh[i]==1)?finans+czs[i+1]:finans-czs[i+1]);
 74                     while(finans<0) {
 75                         finans=finans+czs[i+1]+czs[i+1];
 76                         czs[i+1]=1+(int)(Math.random()*99);
 77                         finans=((fh[i]==1)?finans+czs[i+1]:finans-czs[i+1]);
 78                     }
 79                 }
 80                 else {
 81                     if(fh[i-1]==1||fh[i-1]==2) {
 82                         czs[i]=1+(int)(Math.random()*99);
 83                         if(finans==0&&fh[i-1]==2) {
 84                             fh[i-1]=1;
 85                         }
 86                         finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]);
 87                         while(finans<0) {
 88                             finans=finans+czs[i]+czs[i];
 89                             czs[i]=1+(int)(Math.random()*99);
 90                             finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]);
 91                         }
 92                     }
 93                 }
 94             }
 95             else {
 96                 if(i==0) {
 97                     while(fh[i+1]==3||fh[i+1]==4) {
 98                         i++;
 99                         if(i==number-2) {
100                             break;
101                         }
102                     }
103                     finans=ans[count++];
104                 }
105                 else {
106                     finans=(fh[i-1]==1)?finans+ans[count++]:finans-ans[count++];
107                     if(finans<0) {
108                         fh[i-1]=1;
109                         finans=finans+ans[count-1]+ans[count-1];
110                     }
111                     if(i>=number-2) {
112                         break;
113                     }
114                     while(fh[i+1]==3||fh[i+1]==4) {
115                         i++;
116                         if(i>=number-2) {
117                             break;
118                         }
119                     }
120                 }
121             }
122         }

 

 

 

5.测试运行

结果如图。

 

6.部分代码片段

首先是建立一个数组,其中包含0到100的所有素数,同时,通过数组满足程序基本功能的限制,即 3到5的随机数,最多5个操作数,乘除多项式结果,最多2个,最多四个运算符,符号若存在不同则改为1,并先行随机生成,再让符号保证不相同并随机替换。

 1 public static void work(int x) {
 2 //        int sushu[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
 3 //        int length=sushu.length;
 4         int number=3+(int) (Math.random()*3);
 5         int[] czs=new int[5];
 6         int[] ans=new int[2];
 7         int[] fh=new int[4];
 8         int i;
 9         int flag=0;
10         int temp;
11         for(i=0;i<number-1;i++) {
12             fh[i]=1+(int) (Math.random()*4);
13             if(fh[i]!=fh[0]) {
14                 flag=1;
15             }
16         }
17         if(flag==0) {
18             while((temp=1+(int) (Math.random()*4))!=fh[0]) {
19                 fh[(int) (Math.random()*(number-1))]=temp;
20                 break;
21             }
22         }

7.总结

编程前:因为自己的java基础不好,有一种畏难心理,小心谨慎的分析项目需求以及如何一步步去实现它,而且需要使用java语言,必须拾起课本重新走一遍,压力挺大的,总觉得自己做不好。

编程过程中:可以说是困难重重了,接二连三的问题扑面袭来,主要体现在哪里?1.编码严重不足,动手能力没有得到充分的锻炼,导致“眼高手低”。2.java基础差,不断的去翻书,去百度,去请教舍友大佬们。3.项目经验不足,不是很熟悉整个流程,仅保留在书本方面的知识。

测试阶段:一步一步去检查,测试,报错之后一点点找原因,让人头大,甚至想回炉重造,干脆重新弄算了,但也得到了舍友的很大帮助,有时就是这样,或许自己发现不了的问题,在别人眼里,一看就能看出来。怎么说呢,最终成功运行的时候挺激动的,感觉增加了自己的经验,心里边有了些自信,多了些动力,也是打算多做一些java的题来提高自己的编码能力了。

8.PSP展示

 

posted on 2018-03-25 18:07  崔啸寒  阅读(177)  评论(3编辑  收藏  举报