产生30个两位数以内的式子程序

   首先是这样一个题目,随机出30道两位数以内的加减运算题。然后又这样几个要求:
   1.可以有真分数。
   2.题目尽量不能重复。
   3.除数不能为零。
   对于我考虑的事情就是在出随机数的时候,怎样来满足这样的要求。
我的设计思路:
       大的思路就是先产生两个随机数,在产生一个随机运算符。三者结合起来便是一个运算式子。
       那么我们对每一小块内容进行拆分:
       第一块,产生两个随机数,随机数加一个时间种子,以免伪随机,产生相同的随机数。
       第二块,随即产生一个运算符,如果是除运算,而且除数为零,则重新产生除数,直到不为零为止。其他运算没有要求。
       我们随机产生四个数,比如a,b,c,d,a作为第一个数的分子,b作为第一个数的分母,a/b作为真分数的第一个分数。按照这样,给一个限定条件,就是当a<b并且c<d时,才产生真分数。
       不满足真分数条件时,"a运算符b="作为整数运算的式子,给定一个条件就是当除法运算时分母不为零,其他都可以。
       另外,加入满足真分数条件,但是分母为零,则回滚,重新生成四个随机数。
   具体代码如下:

  1.  /*
  2. 这个程序的功能是随机产生30个两位数以内的式子,可以有真分数
  3. 20133078
  4. */
  5. #include <iostream>
  6. #include <string>
  7. #include <time.h>//用到了time函数
  8. #define random(x)(rand()%x)
  9. #define N 30    //产生30个
  10. #define L 5     //控制行在每行5个式子
  11. using namespace std;
  12. void main()
  13. {
  14.     double rand1[N],rand2[N],rand3[N],rand4[N];
  15.     int i,j,k=1;
  16.     string ch[N];
  17.     srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
  18.     for (j=0;j<N;j++)             //先随机产生30种运算
  19.     {
  20.         int i=rand()%4;
  21.         switch(i%4)
  22.         {
  23.         case 0:ch[j]="+";break;
  24.         case 1:ch[j]="-";break;
  25.         case 2:ch[j]="*";break;
  26.         case 3:ch[j]="/";
  27.         }
  28.     }
  29.     cout<<"随机产生的30个算式如下所示:";
  30.     for(i=0;i<N;i++)
  31.     {
  32.         if(i%3==0)    //每行控制输出3个
  33.             cout<<endl;
  34.         rand1[i]=random(100);    //第一个数的分子
  35.         rand2[i]=random(100);    //第一个数的分母
  36.         rand3[i]=random(100);
  37.         rand4[i]=random(100);
  38.         if(rand1[i]<rand2[i]&&rand3[i]<rand4[i]&&rand2[i]!=0&&rand4[i]!=0&&rand3[i]!=0)      //真分数分母不为零
  39.             cout<<" "<<rand1[i]<<"/"<<rand2[i]<<ch[i]<<rand3[i]<<"/"<<rand4[i]<<"= ";
  40.         else if(ch[i]=="/"&&rand2[i]!=0)             //除法时候分母不能为零
  41.             cout<<" "<<rand1[i]<<ch[i]<<rand2[i]<<"= ";   
  42.         else if(ch[i]=="/"&&rand2[i]==0)             //除法分母为零时,返回重新生成随机数
  43.             i--;
  44.         else
  45.             cout<<" "<<rand1[i]<<ch[i]<<rand2[i]<<"= ";  
  46.     }
  47.     cout<<endl;
  48. }

    就这样产生30个式子后就可以了。题目虽简单,但是要考虑全面再完整的进行一次编程,感觉还是挺复杂的。

原文地址:https://www.cnblogs.com/cnyulei/p/5244488.html