首页 > 代码库 > 软件工程个人作业01

软件工程个人作业01

题目:自动随机生成小学四则运算题目的 “软件”,要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性)、题目避免重复、可定制出题的数量。

思路:(1)数据来源:整数 ---> 随机数生成

                            真分数---> 分子分母都随机产生,保证分子小于分母

                   四则符号随机---> 从0 ~ 3之间随机取数,取到0 代表“+”,取到1代表“-”,取到2代表“*”,取到3代表“ / ”。

        等式左边组合方式随机---> 从0 ~ 2之间取数,取到0代表两个整数做运算,取到1代表一个整数和一个真分数做运算,取到2代表两个真分数做运算。

       (2)真分数生成逻辑:随机生成两个整数,比较大小后,大的作为分母,小的作为分子,然后约分后返回字符串类型的值以作为打印显示,分子和分母的值存在一个定义好的对象中,方便其值够的传递

       (3)题目生成逻辑:在for循环下,先随机生成两个整数,两个真分数,一个运算符号,一个等式组合方式,然后通过if.. else..判断并打印在每个运算符号下,每一个等式组合方式生成的题目。

       (4)结果计算注意点:在减法运算中要注意结果不能为负数;在除法运算中要主以被除数不能为零;在真分数参与的运算中要注意分母不为0且但分母为1时就是分子的值,当分子的值为0时,该真分数的值就是0。

       (5)判断题目是否重复的逻辑:将之前用到记录真分数分子分母的类改造,增加两个私有String成员,定义一个类数组,用来记录每次随机产生的两个整数和每次生成的两个分数,然后在每次出题之前利用for循环将当前产生的一道题与之前生成的题比较(判断等式组合方式,运算符号,等式左边的两个数是否同时出现过),如果重复,i减减操作;并结束这次循环。

源代码:

技术分享
  1 package text;
  2 import java.util.Scanner;
  3 
  4 class Transmit {
  5     private int max;
  6     private int min;
  7     private String c1;
  8     private String c2;
  9     public String getC1() {
 10         return c1;
 11     }
 12     public void setC1(String c1) {
 13         this.c1 = c1;
 14     }
 15     public String getC2() {
 16         return c2;
 17     }
 18     public void setC2(String c2) {
 19         this.c2 = c2;
 20     }
 21     public int getMax() {
 22         return max;
 23     }
 24     public void setMax(int max) {
 25         this.max = max;
 26     }
 27     public int getMin() {
 28         return min;
 29     }
 30     public void setMin(int min) {
 31         this.min = min;
 32     }
 33 
 34 }
 35 public class Random {
 36     private static int line = 10;
 37     /**
 38      * 求两个数之间的最大公约数
 39      */
 40     public int getGCD(int max, int min) {
 41         int gcd = 1;
 42         if(min >= max) {
 43             int temp = max;
 44             max = min;
 45             min = temp;
 46         }
 47         for(int i = min;i>=1;i--) {
 48             if(max % i == 0 && min % i == 0) {
 49                 gcd = i;
 50                 break;
 51             }
 52         }
 53         return gcd;
 54     }
 55 
 56     /**
 57      * 生成真分数
 58      * @return 一个真分数的字符串
 59      */
 60     public String randZ( Transmit transmit) {        
 61          while(true){
 62              int max =(int)(Math.random()* line);
 63              int min =(int)(Math.random()* line);
 64              if(max==0 || min==0 || max == min) { //如果有一个为0,或者生成的两个数相等, continue;
 65                  continue;
 66              } else {
 67                  if(max <= min ) //先保证max的值大于min的值
 68                      {
 69                          int temp=min;
 70                          min=max;
 71                          max=temp;
 72                      }
 73                  //求最大公约数
 74                  int gcd = getGCD(max, min);
 75                  max = max / gcd;
 76                  min = min / gcd;
 77                      transmit.setMax(max);
 78                      transmit.setMin(min);
 79                      return("("+min+"/"+max+")");
 80                  }
 81              }
 82     }
 83     
 84     public String getMark(int midMax, int midMin) {
 85         int gcd = getGCD(midMax, midMin);//求最大公约数
 86         midMax = midMax / gcd;
 87         midMin = midMin / gcd;
 88         return("("+midMin+"/"+midMax+")");
 89     }
 90     //求两个真分数相加
 91     public String opGrsAdd(Transmit tran1,Transmit tran2) {
 92         int midMin = tran1.getMin() * tran2.getMax() + tran1.getMax() * tran2.getMin();
 93         int midMax = tran1.getMax() *  tran2.getMax();
 94         return getMark(midMax, midMin);
 95     }
 96     
 97      //求两个真分数相乘
 98     public String opGrsMult(Transmit tran1, Transmit tran2) {
 99         int midMin = tran1.getMin() * tran2.getMin();
100         int midMax = tran1.getMax()* tran2.getMax();
101         return getMark(midMax, midMin);
102     }
103     
104      //求两个真分数相减
105     public String opGrsSubt(Transmit tran1, Transmit tran2) {
106             int midMin = tran1.getMin() * tran2.getMax() - tran1.getMax() * tran2.getMin();
107             int midMax = tran1.getMax() *  tran2.getMax();
108             return getMark(midMax, midMin);
109         }
110         
111      //求两个真分数相除
112     public String opGrsDivi(Transmit tran1, Transmit tran2) { //tran1被除数,tran2除数
113             int midMin = tran1.getMin() * tran2.getMax();
114             int midMax = tran1.getMax()* tran2.getMin();
115             int gcd = getGCD(midMax, midMin); //求最大公约数
116             midMax = midMax / gcd;
117             midMin = midMin / gcd;
118             if(midMax == 1) {
119                 return midMin+"";
120             }else {
121             return("("+midMin+"/"+midMax+")");
122             }
123         }
124     
125     //求一个整数与一个真分数相加
126     public String opGrsAddInt( int n , Transmit tran) {
127         int midMin = n * tran.getMax() +tran.getMin();
128         int midMax = tran.getMax() ;
129         return getMark(midMax, midMin);
130     }
131     
132     //求一个整数与一个真分数相减
133     public String opGrsSubInt(int n, Transmit tran) {
134         int midMin = n * tran.getMax() - tran.getMin();
135         int midMax = tran.getMax() ;
136         return getMark(midMax, midMin);
137     }
138     
139     //求一个整数与一个真分数相乘
140     public String opGrsMulInt(int n, Transmit tran) {
141         int midMin  = n * tran.getMin();
142         int midMax  = tran.getMax();
143         int gcd = getGCD(midMax, midMin);//求最大公约数
144         midMax = midMax / gcd;
145         midMin = midMin / gcd;
146         if(midMin == 0 ) {
147             return 0+"";
148         }else if (midMax == 1) {
149             return midMin+"";
150         }else{
151             return("("+midMin+"/"+midMax+")");
152         }
153     }
154     
155     //求一个整数与一个真分数相除
156     public String opGrsSDivInt(int n, Transmit tran) {
157         int midMin  = n * tran.getMax();
158         int midMax  = tran.getMin();
159         int gcd = getGCD(midMax, midMin);//求最大公约数
160         midMax = midMax / gcd;
161         midMin = midMin / gcd;
162         if(midMin == 0 ) {
163             return 0+"";
164         }else if (midMax == 1) {
165             return midMin+"";
166         }else{
167             return("("+midMin+"/"+midMax+")");
168         }
169     }
170     
171     public static void main(String[] args) {
172         Scanner input = new Scanner(System.in);
173         Random ran = new Random();
174         Transmit tran1= new Transmit();
175         Transmit tran2= new Transmit();
176         System.out.print("请输入出题数量:");
177         int Num = input.nextInt();
178         Transmit sameTran[] = new Transmit[Num+1];
179         int sameZ[] = new int[Num +1];
180         int sameSymbol[] = new int[Num +1];
181          for(int i = 1; i<= Num ;i++) {
182              
183              int a =(int)(Math.random()* line); //随机生成两个整数
184              int b =(int)(Math.random()* line); 
185              String c1 = ran.randZ(tran1); //随机生成两个真分数
186              String c2 = ran.randZ(tran2);
187              int  symbol = (int)(Math.random()*4); //生成  0~3 四个数代表四个运算符号
188              int Z = (int) (Math.random()*3);   // 题目有三种情况,(1).两个整数间运算,(2).两个真分数间的运算,(3)真分数与整数间的运算
189              sameTran[i] = new Transmit();
190              sameTran[i].setMax(a);
191              sameTran[i].setMin(b);
192              sameTran[i].setC1(c1);
193              sameTran[i].setC2(c2);
194              sameSymbol[i] = symbol;
195              sameZ[i] = Z;
196              //判断是否重复
197             for(int j = i; j <= 0; j++) {
198                 if(sameTran[i].getMax() == sameTran[j-1].getMax() && sameTran[i].getMin() ==sameTran[j-1].getMin()  
199                         && sameSymbol[i] ==sameSymbol[j-1] && sameZ[i] == sameZ[j-1]) {
200                     i--;continue;
201                 }else if(sameTran[i].getMax() ==sameTran[j-1].getMax() && sameTran[i].getC1() ==sameTran[j-1].getC1()   
202                         && sameSymbol[i] ==sameSymbol[j-1] && sameZ[i] == sameZ[j-1]) {
203                     i--;continue;
204                 }else if(sameTran[i].getC2() ==sameTran[j-1].getC2() && sameTran[i].getC1() ==sameTran[j-1].getC1()   
205                         && sameSymbol[i] ==sameSymbol[j-1] && sameZ[i] == sameZ[j-1]) {
206                     i--;continue;
207                 }
208             } 
209             
210              if(symbol ==0) { //加法
211                  System.out.print("第"+i+"题:");
212                      if(Z == 1) {
213                          System.out.println(a +" + " + b +" = " +(a+b));
214                  }else if( Z== 2) {
215                       System.out.println(a +" + " + c1 +" = " +ran.opGrsAddInt(a, tran1));
216                  }else if(Z == 0) {
217                      System.out.println(c1 +" + " + c2 +" = " + ran.opGrsAdd(tran1, tran2));
218                  }
219              }else if(symbol == 1 ){ //减法 
220                  if(Z == 1) {
221                      if((a-b) < 0 ) { 
222                          i--; continue;
223                      }else{ 
224                       System.out.print("第"+i+"题:");
225                       System.out.println(a +" - " + b +" = " +(a-b));
226                      }
227                  }else if( Z== 2) {
228                      if(( a * tran1.getMax() - tran1.getMin() ) < 0) {
229                          i--; continue;
230                      }else {
231                       System.out.print("第"+i+"题:");
232                       System.out.println(a +" - " + c1 +" = " + ran.opGrsSubInt(a, tran1));
233                      }
234                  }else if(Z == 0) {
235                      if(( tran1.getMin() * tran2.getMax() - tran1.getMax() * tran2.getMin() ) < 0 ) {
236                         i--; continue;
237                      }else{
238                          System.out.print("第"+i+"题:");
239                          if(c1.equals(c2)) {
240                              System.out.println(c1 +" - " + c2 +" = 0 ");
241                          }else{
242                             System.out.println(c1 +" - " + c2 +" = " +ran.opGrsSubt(tran1, tran2));
243                          }
244                      }
245                  }
246              }else if(symbol == 2){ //乘法
247                  System.out.print("第"+i+"题:");
248                  if(Z == 1) {
249                          System.out.println(a +" × " + b +" = " +(a * b));
250                  }else if( Z== 2) {
251                       System.out.println(a +" × " +c1 +" = " + ran.opGrsMulInt(a, tran1));
252                  }else if(Z == 0) {
253                      System.out.println(c1 +" × " + c2 +" = " +ran.opGrsMult(tran1, tran2));
254                  }
255              }else if(symbol == 3 ){ // 除法
256                  
257                  if(Z == 1 ) {
258                      if(b == 0) {
259                             i--; continue;
260                      }else if (a == 0) {
261                          System.out.print("第"+i+"题:");
262                          System.out.println(a + " ÷ " + b +" = 0" );
263                      }
264                      else {
265                              System.out.print("第"+i+"题:");
266                              int gcd = ran.getGCD(b, a);
267                              int A = a / gcd; int B = b / gcd;
268                              if(B == 1) {
269                              System.out.println(a + " ÷ " + b +" = " + A);
270                              }else{
271                                System.out.println(a + " ÷ " + b +" = " +("("+A+"/"+B+")"));
272                              }
273                         }
274                  }else if( Z== 2) {
275                      System.out.print("第"+i+"题:");
276                       System.out.println(a + " ÷ " + c1 +" = " +ran.opGrsSDivInt(a, tran1));
277                  }else if(Z == 0) {
278                      System.out.print("第"+i+"题:");
279                      System.out.println(c1 + " ÷ " + c2 +" = " +ran.opGrsDivi(tran1, tran2));
280                  }
281              }
282          }
283     }
284 }
四则运算

 

软件工程个人作业01