在修改完善過程中博客園出現錯誤,誤刪。現在補上! 源代碼: 結果截圖: 整數部分: 分數部分: 結果分析:數據,消息都是通過通知框輸入輸出。 總結:還有功能尚未實現,而且實現的功能也不盡完美。 比如條件控制處不能夠產生負數,是利用暴力窮舉,而沒有特殊的辦法。 恢復內容結束 ...
在修改完善過程中博客園出現錯誤,誤刪。現在補上!
整體設計思想: | |
1.巨集定義兩個二維數組,作為整數和分數計算的儲存單位 | |
2.隨機生成數字,符號用0123代替。 | |
3.在進棧前先根據if條件判斷生成函數中不符合要求的各個條件,然後更新更新巨集定義下的數組。 | |
4.在shuchu函數里進行輸出。輸出具體方法就是根據奇數為符號,偶數為數字的規律數字進行直接輸出,符號通過判斷輸出 | |
5.在jieguojisuan函數中進行計算,方法為應用棧,建立兩個棧,一個為數字棧一個為符號棧,計算思想就是遇見兩個連續的加減法就計算前一個,遇見乘 | |
除法就直接計算。計算的細節就是,將數字棧的兩個數字和符號棧的一個符號出棧,然後進行計算,將結果壓回數字棧。 | |
最終版本實現的功能和實現方法如下 | |
1.能夠實現四則混合運算 | |
解決方法:將數組擴展,儲存多個計算數字。然後根據隨機生成的數字生成式子。 | |
2.能夠實現計算結果判斷 | |
解決方法:應用棧的思想,計算結果 | |
3.除法生成數字都為真分數,減法得數不能為負數 | |
解決方法:列舉出來具體情況 | |
4.生成隨機數字 | |
應用時間函數,隨機生成數字 | |
如下生成在mi在ma之間的隨機整數 | |
srand((unsigned)time(NULL)); | |
a[i+2] = rand() % ma + mi; | |
5.能夠判斷重覆 | |
只能判斷完全重覆 | |
源代碼:
1 package shizishengcheng; 2 3 import javax.swing.JOptionPane; 4 5 class MyStack 6 { 7 int top; 8 int maxSize; 9 int array[]; 10 public MyStack(int maxSize) 11 { 12 this.maxSize = maxSize; 13 array = new int[maxSize]; 14 top = 4; 15 } 16 17 public MyStack(){} 18 19 public void push(int value) 20 { 21 array[++top] = value; 22 } 23 24 public int pop() 25 { 26 27 return array[top--]; 28 29 } 30 31 public int getTopvalue() 32 { 33 return array[top]; 34 } 35 36 public int getTopvalue2() 37 { 38 int a; 39 a=top--; 40 top++;//使指針複原 41 return array[a]; 42 } 43 44 public int isEmpty() 45 { 46 return top ; 47 } 48 49 public boolean isFull() 50 { 51 return top == maxSize - 1; 52 } 53 } 54 55 public class Main 56 { 57 static int [][] z = new int[30][20];//定義二維數組 58 static int [][] x = new int[30][11];//定義二維數組 59 60 public static int output(int a,int b,int c,int d,int e)//分數輸出 61 { 62 for(int i = a;i > 1;i--) 63 { 64 if(a % i == 0 && b % i == 0) 65 { 66 a = a / i; 67 b = b / i; 68 break; 69 } 70 } 71 for(int i = c;i > 1;i--) 72 { 73 if(c%i == 0 && d % i == 0) 74 { 75 c = c / i; 76 d = d / i; 77 break; 78 } 79 } 80 switch(e) 81 { 82 case 0 : JOptionPane.showMessageDialog(null, "("+ a + "/"+ b + ")" + "+" + "(" + c + "/" + d + ")" + "=?");break; 83 case 1 : JOptionPane.showMessageDialog(null, "("+ a + "/"+ b + ")" + "-" + "(" + c + "/" + d + ")" + "=?");break; 84 case 2 : JOptionPane.showMessageDialog(null, "("+ a + "/"+ b + ")" + "*" + "(" + c + "/" + d + ")" + "=?");break; 85 case 3 : JOptionPane.showMessageDialog(null, "("+ a + "/"+ b + ")" + "/" + "(" + c + "/" + d + ")" + "=?");break; 86 } 87 return 1; 88 } 89 public static int fenshu_zhengquejieguo(int a,int b,int c,int d,int e) 90 { 91 int jieguo = 0; 92 switch(e) 93 { 94 case 0: jieguo=(a * d + c * b) / (b * d);break; 95 case 1: jieguo=(a * d - c * b) / (b * d);break; 96 case 2: jieguo=(a * c) / (b * d);break; 97 case 3: jieguo=(a * d) / (b * c);break; 98 } 99 return jieguo; 100 } 101 public static int zhengshu_zhengquejieguo(int a[]) 102 { 103 MyStack Fuhao = new MyStack(20); 104 MyStack Shuzi = new MyStack(20); 105 int e,c,p,e2,q; 106 for(int i = 6;i < 13;i++) 107 { 108 if(i%2 == 1)//如果是符號壓入符號棧 109 { 110 Fuhao.push(a[i]); 111 } 112 else//否則壓入數字棧 113 { 114 Shuzi.push(a[i]); 115 } 116 117 if(i > 7 &&Fuhao.getTopvalue() > 1 && i % 2 == 0)//如果從左向右遇見乘除法就直接執行 118 { 119 e = Fuhao.pop(); 120 c = Shuzi.pop(); 121 p = Shuzi.pop(); 122 switch(e) 123 { 124 case 2: Shuzi.push(c*p);break; 125 case 3: Shuzi.push(p/c);break; 126 } 127 } 128 if(i > 9 && Fuhao.getTopvalue() < 2 && Fuhao.getTopvalue2()< 2 && i % 2 == 0 && Fuhao.isEmpty() > 5)//如果遇見連續的兩個加減法執行第一個 129 { 130 e = Fuhao.pop(); 131 e2 = Fuhao.pop(); 132 c = Shuzi.pop(); 133 p = Shuzi.pop(); 134 q = Shuzi.pop(); 135 switch(e2) 136 { 137 case 0: Shuzi.push((q + p));break; 138 case 1: Shuzi.push((q - p));break; 139 } 140 Shuzi.push(c); 141 Fuhao.push(e); 142 } 143 } 144 145 if(Shuzi.isEmpty() > 4)//最終肯定會剩下一組數還有最後一次加減運算 146 { 147 e = Fuhao.pop(); 148 c = Shuzi.pop(); 149 p = Shuzi.pop(); 150 151 switch( e ) 152 { 153 case 0: Shuzi.push((p + c));break; 154 case 1: Shuzi.push((p - c));break; 155 } 156 } 157 158 return Shuzi.getTopvalue(); 159 160 } 161 162 public static int panduanchongfu(int a[],int ma,int mi,int y) 163 { 164 //---------------------------------------------用來判斷是不是完全相同----------------------------------------------------- 165 int m = 1; 166 while(m == 1) 167 { 168 for(int j = 0;j < y;j++) 169 { 170 if(a[0]==z[j][0]&&a[1]==z[j][1]&&a[2]==z[j][2]&&a[3]==z[j][3]&&a[4]==z[j][4]&&a[5]==z[j][5]&&a[6]==z[j][6]) 171 { 172 a[0] = mi + (int)(Math.random()*ma); 173 z[y][0] = a[0]; 174 175 a[1] = mi + (int)(Math.random()*ma); 176 z[y][1] = a[1]; 177 break; 178 } 179 180 if( j == ( y - 1 ) ) 181 { 182 m = 0; 183 } 184 } 185 } 186 //----------------------------------------------判斷加法出現時候是不是完全相同------------------------------------------------------------ 187 while(m == 1) 188 { 189 for(int j = 0;j < y;j++) 190 { 191 if(a[1]==0&&a[3]==z[j][3]&&a[4]==z[j][4]&&a[5]==z[j][5]&&a[6]==z[j][6]&&a[0]==a[2]&&a[3]<2)//加法在第一位,並且旁邊兩個數換了位置 192 { 193 a[0] = mi + (int)(Math.random()*ma); 194 z[y][0] = a[0]; 195 break; 196 } 197 198 if( j == ( y - 1 ) ) 199 { 200 m = 0; 201 } 202 } 203 } 204 //----------------------------------------------判斷乘法出現時候是不是完全相同------------------------------------------------------------ 205 /*while(m == 1) 206 { 207 for(int j = 0;j < y;j++) 208 { 209 210 211 if( j == ( y - 1 ) )需要註意,這幾種情況 一個乘號 1.在第一位 2*3 和 3*2 2.在第二位 前邊沒有乘除法 3.在第三位,第二位沒有乘除法 212 { 兩個乘號 1.在前兩個 1*2*3 和 3*2*1 和 2*3*1 等六種情況 2.在後兩個,前邊不是乘除法 213 m = 0; 三個乘號 214 } 215 } 216 }*/ 217 //---------------------------------------------加法和乘法除法相鄰出現並且重覆--------------------------- 218 /*加法連接乘除法 1+2*3 == 2*3+1 219 */ 220 return 1; 221 } 222 223 public static int tiaojianpanduan(int a[],int y,int ma,int mi)//整數輸出 224 { 225 for(int i = 6;i < 13;i++) 226 { 227 if(i%2 == 0)//挑出數字,如果直接篩選出符號那麼不能修改之前的數字 228 { 229 //--------------------------------------------------------------------------------------------------------------------------------------- 230 while(a[i] == 0)//判斷被除數為0的情況 231 { 232 while(i > 6 && a[i - 1] == 3) 233 { 234 a[i] = mi + (int)(Math.random()*ma); 235 z[y][i] = a[i];//更新原來數組 236 } 237 } 238 if(a[ i + 1 ] == 2 )//出現除法前邊有乘法的情況,首先計算出乘法的結果 239 {//並且根據概率更新除法參與運算數的情況有可能永遠不能實現結果為真分數,所以更新乘法參與運算數 240 if(a[ i + 3 ] == 3) 241 { 242 while(a[i] * a[i+2] >= a[i+4]) 243 { 244 a[i+2] = mi + (int)(Math.random()*ma); 245 z[y][i+2] = a[i+2];//更新原來數組 246 } 247 } 248 } 249 if(a[i+1] == 3 && a[i-1] != 2)//有除法,其中包括只有一個除法,還有連續好幾個除法,但是通過改變後一個數的規律可以有效的解決這個問題 250 { 251 while(a[i] >= a[i + 2]) 252 { 253 a[i+2] = mi + (int)(Math.random()*ma); 254 z[y][i+2] = a[i+2];//更新原來數組 255 } 256 } 257 //--------------------------------------此上是處理出現除法的情況,此下是減法--------------------------------------------------------------- 258 if(a[i+1]==1)//出現減法的情況 259 { 260 if(i + 1 ==11 && a[i-3]==3 && a[i-1]==2 && a[i-4]/a[i-2]*a[i] < a[i+2])//減法在最後一個符號位置,並且前邊是除法連接乘法 261 { 262 while(a[i-4]/a[i-2]*a[i]<mi)//前邊計算出來的數字之和小於隨機生成數的最小值,那麼就更新最後一個數字和乘法的後一個數字 263 { 264 a[i] = mi + (int)(Math.random()*ma); 265 a[i+2] = mi + (int)(Math.random()*ma); 266 z[y][i] = a[i];//更新原來數組 267 z[y][i+2] = a[i+2];//更新原來數組 268 269 } 270 while(a[i-4]/a[i-2]*a[i] >= mi)//如果大於最小值,那麼只需要更新減數 271 { 272 a[i+2] = mi + (int)(Math.random()*ma); 273 z[y][i+2] = a[i+2];//更新原來數組 274 } 275 } 276 if(a[i-1]==3 && i+1==9)//除法出現在減法前邊一個符號,將減法變為加法.只有減法在第二個符號時有效 277 { 278 a[i+1]=0; 279 z[y][i+1] = a[i+1];//更新原來數組 280 } 281 //此上兩種情況是處理除法和減法同時出現並且互相影響的情況 282 //減號附近有沒有乘除法,提前計算 283 switch(i+1) 284 { 285 case 7: 286 //減法在第一位的情況 287 if(a[i+3]==2 && a[i+5]<2)//- * _ 因為前一步已經將除法得數化為真分數,所以不用考慮除法的情況 288 { 289 while(a[i]-a[i+2]*a[i+4]<0) 290 { 291 a[i+2] = mi + (int)(Math.random()*ma); 292 z[y][i+2] = a[i+2];//更新原來數組 293 a[i+4] = mi + (int)(Math.random()*ma); 294 z[y][i+4] = a[i+4];//更新原來數組 295 } 296 } 297 if(a[i+3]==2 && a[i+5]==2)//- * *同上步解釋,不用考慮先乘後初的情況 298 { 299 while(a[i]-a[i+2]*a[i+4]*a[i+6]<0) 300 { 301 a[i+2] = mi + (int)(Math.random()*ma); 302 z[y][i+2] = a[i+2];//更新原來數組 303 a[i+4] = mi + (int)(Math.random()*ma); 304 z[y][i+4] = a[i+4];//更新原來數組 305 a[i+6] = mi + (int)(Math.random()*ma); 306 z[y][i+6] = a[i+6];//更新原來數組 307 } 308 } 309 if(a[i+3]==2 && a[i+5]==2)//- / * 310 { 311 while(a[i]-a[i+2]/a[i+4]*a[i+6]<0) 312 { 313 a[i+2] = mi + (int)(Math.random()*ma); 314 z[y][i+2] = a[i+2];//更新原來數組 315 a[i+4] = mi + (int)(Math.random()*ma); 316 z[y][i+4] = a[i+4];//更新原來數組 317 a[i+6] = mi + (int)(Math.random()*ma); 318 z[y][i+6] = a[i+6];//更新原來數組 319 } 320 }break; 321 case 9://減法在第二位的情況 322 if(a[i-1]==2&&a[i+3]==2)//* - * 323 { 324 while(a[i-2]*a[i]<a[i+2]*a[i+4]) 325 { 326 a[i+2] = mi + (int)(Math.random()*ma); 327 z[y][i+2] = a[i+2];//更新原來數組 328 a[i+4] = mi + (int)(Math.random()*ma); 329 z[y][i+4] = a[i+4];//更新原來數組 330 } 331 } 332 if(a[i+3]==2 && a[i-1]==0)//+ - * 333 { 334 while( ( a[i-2] + a[i] ) < ( a[i+2] * a[i+4] ) ) 335 { 336 a[i+2] = mi + (int)(Math.random()*ma); 337 z[y][i+2] = a[i+2];//更新原來數組 338 a[i+4] = mi + (int)(Math.random()*ma); 339 z[y][i+4] = a[i+4];//更新原來數組 340 } 341 } 342 if(a[i+3]==2 && a[i-1]==1)//- - * 343 { 344 while( ( a[i-2] - a[i] ) < ( a[i+2] * a[i+4] ) ) 345 { 346 a[i+2] = mi + (int)(Math.random()*ma); 347 z[y][i+2] = a[i+2];//更新原來數組 348 a[i+4] = mi + (int)(Math.random()*ma); 349 z[y][i+4] = a[i+4];//更新原來數組 350 } 351 } 352 if(a[i+3]<2 && a[i-1]==2)//* - _ 353 { 354 while(a[i-2]*a[i]<a[i+2]) 355 { 356 a[i+2] = mi + (int)(Math.random()*ma); 357 z[y][i+2] = a[i+2];//更新原來數組 358 } 359 } 360 case 11://減法在第三位的情況 361 if(a[i-3]==2&&a[i-1]==2)//* * - 362 { 363 while(a[i-4]*a[i-2]*a[i]<a[i+2]) 364 { 365 a[i+2] = mi + (int)(Math.random()*ma); 366 z[y][i+2] = a[i+2];//更新原來數組 367 a[i] = mi + (int)(Math.random()*ma); 368 z[y][i] = a[i];//更新原來數組 369 } 370 } 371 if(a[i-3]==0&&a[i-1]==2)//+ * - 372 { 373 while(a[i-4]+a[i-2]*a[i]<a[i+2]) 374 { 375 a[i+2] = mi + (int)(Math.random()*ma); 376 z[y][i+2] = a[i+2];//更新原來數組 377 a[i] = mi + (int)(Math.random()*ma); 378 z[y][i] = a[i];//更新原來數組 379 } 380 } 381 if(a[i-3]==1&&a[i-1]==2)//- * - 382 { 383 while(a[i-4]-a[i-2]*a[i]<a[i+2]) 384 { 385 a[i+2] = mi + (int)(Math.random()*ma); 386 z[y][i+2] = a[i+2];//更新原來數組 387 } 388 } 389 if(a[i-3]==0&&a[i-1]==3)//+ / - 390 { 391 while(a[i-4]+a[i-2]/a[i]<a[i+2]) 392 { 393 a[i+2] = mi + (int)(Math.random()*ma); 394 z[y][i+2] = a[i+2];//更新原來數組 395 a[i] = mi + (int)(Math.random()*ma); 396 z[y][i] = a[i];//更新原來數組 397 } 398 } 399 if(a[i-3]==1&&a[i-1]==3)//-