首页 > 代码库 > 软件工程个人作业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