首先是这样一个题目,随机出30道两位数以内的加减运算题。然后又这样几个要求:
1.可以有真分数。
2.题目尽量不能重复。
3.除数不能为零。
对于我考虑的事情就是在出随机数的时候,怎样来满足这样的要求。
我的设计思路:
大的思路就是先产生两个随机数,在产生一个随机运算符。三者结合起来便是一个运算式子。
那么我们对每一小块内容进行拆分:
第一块,产生两个随机数,随机数加一个时间种子,以免伪随机,产生相同的随机数。
第二块,随即产生一个运算符,如果是除运算,而且除数为零,则重新产生除数,直到不为零为止。其他运算没有要求。
我们随机产生四个数,比如a,b,c,d,a作为第一个数的分子,b作为第一个数的分母,a/b作为真分数的第一个分数。按照这样,给一个限定条件,就是当a<b并且c<d时,才产生真分数。
不满足真分数条件时,"a运算符b="作为整数运算的式子,给定一个条件就是当除法运算时分母不为零,其他都可以。
另外,加入满足真分数条件,但是分母为零,则回滚,重新生成四个随机数。
具体代码如下:
- /*
- 这个程序的功能是随机产生30个两位数以内的式子,可以有真分数
- 20133078
- */
- #include <iostream>
- #include <string>
- #include <time.h>//用到了time函数
- #define random(x)(rand()%x)
- #define N 30 //产生30个
- #define L 5 //控制行在每行5个式子
- using namespace std;
- void main()
- {
- double rand1[N],rand2[N],rand3[N],rand4[N];
- int i,j,k=1;
- string ch[N];
- srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
- for (j=0;j<N;j++) //先随机产生30种运算
- {
- int i=rand()%4;
- switch(i%4)
- {
- case 0:ch[j]="+";break;
- case 1:ch[j]="-";break;
- case 2:ch[j]="*";break;
- case 3:ch[j]="/";
- }
- }
- cout<<"随机产生的30个算式如下所示:";
- for(i=0;i<N;i++)
- {
- if(i%3==0) //每行控制输出3个
- cout<<endl;
- rand1[i]=random(100); //第一个数的分子
- rand2[i]=random(100); //第一个数的分母
- rand3[i]=random(100);
- rand4[i]=random(100);
- if(rand1[i]<rand2[i]&&rand3[i]<rand4[i]&&rand2[i]!=0&&rand4[i]!=0&&rand3[i]!=0) //真分数分母不为零
- cout<<" "<<rand1[i]<<"/"<<rand2[i]<<ch[i]<<rand3[i]<<"/"<<rand4[i]<<"= ";
- else if(ch[i]=="/"&&rand2[i]!=0) //除法时候分母不能为零
- cout<<" "<<rand1[i]<<ch[i]<<rand2[i]<<"= ";
- else if(ch[i]=="/"&&rand2[i]==0) //除法分母为零时,返回重新生成随机数
- i--;
- else
- cout<<" "<<rand1[i]<<ch[i]<<rand2[i]<<"= ";
- }
- cout<<endl;
- }
就这样产生30个式子后就可以了。题目虽简单,但是要考虑全面再完整的进行一次编程,感觉还是挺复杂的。