你的位置:首页 > Java教程

[Java教程]式子生成终极版(java)


在修改完善过程中博客园出现错误,误删。现在补上!

 
整体设计思想:
 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+1219     */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)//- / -400               {401                 while(a[i-4]-a[i-2]/a[i]<a[i+2])402                 {403                   a[i+2] = mi + (int)(Math.random()*ma);404                   z[y][i+2] = a[i+2];//更新原来数组405                 }406               }407           }408           while(a[i]<a[i+2])409           {410             a[i+2] = mi + (int)(Math.random()*ma);411             z[y][i+2] = a[i+2];//更新原来数组412           }413         }414       }415     }416     return 1; 417   }418 419   public static int shuchu(int a[],int y,int ma,int mi)//整数输出420   {421     String s="";422     for(int i = 6;i < 13;i++)423     {424       if(i%2 == 0)//挑出数字425       {426         s=s+a[i];427       }428       else429       {430         switch(a[i])431         {432         433           case 0: s=s+"+";break;434           case 1: s=s+"-";break;435           case 2: s=s+"*";break;436           case 3: s=s+"/";break;437         }438       }439     }440     JOptionPane.showMessageDialog(null, s);441     return 1; 442   }443   444   public static void main(String[] args)445   {446     int[] suijishu =new int [20];447     int y = 0,p = 0,m=1;448     int number_amount = 0,number_jisuanshileixing = 0,number_daduishu=0;449     int ma = 0,mi = 0;450     int tiaojian_cheng = 0,tiaojian_jia = 0;451     int kehu_jieguo = 0;452 453     number_jisuanshileixing=JOptionPane.showConfirmDialog(null,"是整数运算否?", "机智如我",JOptionPane.YES_NO_OPTION);454 455 456     if(number_jisuanshileixing == JOptionPane.YES_NO_OPTION)457     {458       String str=JOptionPane.showInputDialog("计算数最大范围是:");459       ma=Integer.parseInt(str);460       str=JOptionPane.showInputDialog("计算数最小范围是:");461       mi=Integer.parseInt(str);462       str=JOptionPane.showInputDialog("生成多少个式子?");463       number_amount=Integer.parseInt(str);464       str=JOptionPane.showInputDialog("是否有乘除法(1.可以有0.没有)");465       tiaojian_cheng=Integer.parseInt(str);466       for(int i = 0;i < number_amount;i++)467       {468         JOptionPane.showMessageDialog(null, "题目" + (i+1) +"为:");469         for(int i1 = 6 ; i1 < 13 ; i1++)//生成随机数还有符号470         {471           if(i1%2==0)472           {473             suijishu[i1]= mi + (int)(Math.random()*ma);474           }475           else476           {477             suijishu[i1]= (int)(Math.random()* 4 );//产生加减乘除四种情况478             if(tiaojian_cheng == 0)479             {480               suijishu[i1]= (int)(Math.random()* 2 );481             }482           }483           z[y][i1] = suijishu[i1];484         }485 486         tiaojianpanduan(suijishu,y,ma,mi);487 488         if(y > 0)489         {490            panduanchongfu(suijishu,ma,mi,y);491         }492 493         y++;494 495         shuchu(suijishu,y,ma,mi);496 497         str=JOptionPane.showInputDialog("请输入正确结果:");498         kehu_jieguo=Integer.parseInt(str);499         int number_jituo=zhengshu_zhengquejieguo(suijishu);500         if(kehu_jieguo == number_jituo)501         {502           number_daduishu++;503           JOptionPane.showMessageDialog(null, "输入正确!结果为" + number_jituo);504           System.out.println();505         }506         else507         {508           JOptionPane.showMessageDialog(null, "输入错误!正确结果为" + number_jituo);509           System.out.println();510         }511        }512       JOptionPane.showMessageDialog(null, "您一共答对了" + number_daduishu + "道题");513     }514     else515     {516       String str=JOptionPane.showInputDialog("生成多少个式子?");517       number_amount=Integer.parseInt(str);518       str=JOptionPane.showInputDialog("是否有乘除法(1.可以有0.没有)");519       tiaojian_cheng=Integer.parseInt(str);520       str=JOptionPane.showInputDialog("加减是否能得负数(0.不能1.能)");521       tiaojian_jia=Integer.parseInt(str);522 523       for(int i=0;i<number_amount;i++)524       {525         int frist_fenzi=(int)(Math.random()*100);526         int first_fenmu=(int)(Math.random()*100);527         int second_fenzi=(int)(Math.random()*100);528         int second_fenmu=(int)(Math.random()*100);529 530         int fuhao=(int)(Math.random()*4);531         if(p>0)532         {533           while(m==1)534           {535             for(int j=0;j<p+1;j++)536             {537               if(frist_fenzi==x[j][1]&&first_fenmu==x[j][2]&&second_fenzi==x[j][3]&&second_fenmu==x[j][3]&&fuhao==x[j][3])538               {539                 frist_fenzi=(int)(Math.random()*100);540                 second_fenzi=(int)(Math.random()*100);541                 break;542               }543               if(j==p)544               {545                 m=0;546               }547             }548            }549         }550 551         x[p][1]=frist_fenzi;552         x[p][2]=first_fenmu;553         x[p][3]=second_fenzi;554         x[p][4]=second_fenmu;555         if(tiaojian_cheng == 0)//处理有无乘除法556         {557           fuhao=(int)(Math.random()*2);558         }559 560         x[p][5]=fuhao;561 562         p++;563 564         if(first_fenmu==0)//去掉分母为零的情况565         {566         first_fenmu=(int)(Math.random()*100);567         }568         if(second_fenmu==0)569         {570          second_fenmu=(int)(Math.random()*100);571         }572 573         if(frist_fenzi>first_fenmu)//调整为真分数574         {575           int x;576           x=first_fenmu;577           first_fenmu=frist_fenzi;578           frist_fenzi=x;579         }580 581         if(second_fenzi>second_fenmu)//调整为真分数582         {583           int x;584           x=second_fenzi;585           second_fenzi=second_fenmu;586           second_fenmu=x;587         }588 589         switch(fuhao)590         {591           case 0: output(frist_fenzi,first_fenmu,second_fenzi,second_fenmu,fuhao);break;592       593           case 1: 594             if(tiaojian_jia==0)595               {596                 while(((double)(frist_fenzi/first_fenmu)-(double)(second_fenzi/second_fenmu))<0)597                 {598                  frist_fenzi=(int)(Math.random()*100);599                  second_fenzi=(int)(Math.random()*100);600                 }601               }602             output(frist_fenzi,first_fenmu,second_fenzi,second_fenmu,fuhao);break;603       604           case 2: output(frist_fenzi,first_fenmu,second_fenzi,second_fenmu,fuhao);break;605       606           case 3: output(frist_fenzi,first_fenmu,second_fenzi,second_fenmu,fuhao);break;607       608         }609         String str1=JOptionPane.showInputDialog("请输入正确结果:");610         kehu_jieguo=Integer.parseInt(str1);611         if(kehu_jieguo==fenshu_zhengquejieguo(frist_fenzi,first_fenmu,second_fenzi,second_fenmu,fuhao))612         {613           JOptionPane.showMessageDialog(null, "输入正确!");614           System.out.println();615           number_daduishu++;616           JOptionPane.showMessageDialog(null, "正确结果为" + fenshu_zhengquejieguo(frist_fenzi,first_fenmu,second_fenzi,second_fenmu,fuhao));617           System.out.println();618         }619         else620         {621           JOptionPane.showMessageDialog(null, "输入错误");622           JOptionPane.showMessageDialog(null, "正确结果为" + fenshu_zhengquejieguo(frist_fenzi,first_fenmu,second_fenzi,second_fenmu,fuhao));623         }624         System.out.println();625         m=1;626        }627       JOptionPane.showMessageDialog(null, "您一共答对了" + number_daduishu + "道题");628     }629     System.exit(0);630   }631   632 }

 

结果截图:

整数部分:

分数部分:

 

结果分析:数据,消息都是通过通知框输入输出。

 总结:还有功能尚未实现,而且实现的功能也不尽完美。

比如条件控制处不能够产生负数,是利用暴力穷举,而没有特殊的办法。


---恢复内容结束---