这周老师在上周的程序基础上新加了一些要求:
1.题目避免重复
2.题目可以定制(数量/打印方式)
3.可以控制一下参数
(1)是否有乘除法
(2)是否有括号(最多可以支持十个数参与运算)
(3)数值范围
(4)加减有无负数
(5)除法有无余数
看到这些要求的时候我对比自己的程序发现需要对原来的程序做很大的改动也有了很多的想法:
1.括号不应该扩在*和/运算上
2.是否有乘除法可以把*/有+-来代替很容易解决
3.上次的算法我把取随机数包装成了一个没有形参的子函数这次有了取值范围我可以加两个形参:max,min用来保证取得的随机数在这个范围中
这次我的程序还是和上次一样用数组完成,每个参与运算的数我都会在数组上分配3个相邻的数,这3个数分别保证:1.运算符2.括号3.参与运算的数
由于时间关系,本次设计的程序要求1没有实现(思路是设计一个链用来保存已经符合要求的运算式子,把新生成的算数式子与以前的逐一验证),要求2的输出方式没有实现没有实现(思路是运用文件输入输出流)
1 #include<iostream> 2 #include<string> 3 #include<stdlib.h> 4 #include<time.h> 5 using namespace std; 6 int suiji2(int min,int max) 7 { 8 int b=-1; 9 b=rand(); 10 if(b>max||b<min) 11 { 12 b%=max;//保证b<99 13 b+=max;//防止余数为负 14 b%=max; 15 b+=1;//使得到的数在1~99之间 16 } 17 return b; 18 } 19 void main() 20 { 21 22 int a[100],b=5,c=1; 23 string str="+-/*"; 24 while(1) //总循环可以无限生成题目 25 { 26 c=1; 27 //输入生成题目的条件 28 cout<<"一共出几道题:"; 29 cin>>b; 30 cout<<"是否有乘除法(1,0):"; 31 cin>>a[98]; 32 if(a[98]==0) 33 { 34 str="+-+-"; 35 } 36 cout<<"最多几个数(10个数之间):"; 37 cin>>a[97]; 38 cout<<"数值范围: 最大值:"; 39 cin>>a[96]; 40 cout<<"最小值:"; 41 cin>>a[95]; 42 cout<<"加减有无负数(1或0)(如果输入1则默认俩则加减运算):"; 43 cin>>a[94]; 44 if(a[98]==1)//如果前面输入了不包括乘除法则此条件无意义 45 { 46 cout<<"乘除有无余数(1或0)(如果输入1则默认俩则乘除运算):"; 47 cin>>a[93]; 48 } 49 //结束输入生成题目的条件 50 while(b--) //循环一次生成一道题 51 { 52 int num=suiji2(3,a[97]);cout<<endl; 53 int i=0,j=0; 54 while(i<=num*3) // 初始化数组 55 { 56 a[i]=suiji2(a[95],a[96]); 57 i++; 58 } 59 while(j<=num*3) 60 { 61 a[j]%=4;//运算符 62 a[j+1]%=2;//括号 63 if(a[j+1]==1) 64 { 65 a[j+4]=-1; 66 } 67 j+=3; 68 } 69 cout<<""; 70 if(a[94]==1||a[93]==1) 71 { 72 num=2; 73 } 74 75 cout<<"No."<<c++<<":"; //题目计数器 76 if(num==2) //2则运算 77 { 78 79 if(a[94]==1&&a[3]==1) 80 { 81 if(a[2]<a[5]) 82 { 83 cout<<a[5]<<str[a[3]]<<a[2]; 84 } 85 else 86 cout<<a[2]<<str[a[3]]<<a[5]; 87 } 88 else if(a[3]==2&&a[93]==1) 89 { 90 if(a[2]%a[5]!=0) 91 { 92 cout<<a[2]-(a[2]%a[5])<<str[a[3]]<<a[5]; 93 } 94 else 95 cout<<a[2]<<str[a[3]]<<a[5]; 96 } 97 else cout<<a[2]<<str[a[3]]<<a[5]; 98 99 } 100 else //多则运算 101 { 102 j=1; 103 while(j<=num*3) 104 { 105 106 if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)cout<<"("; 107 cout<<a[j+1]; 108 if(a[j-3]==1&&j>3&&a[j-1]!=2&&a[j-1]!=3)cout<<")"; 109 if(j<(num*3-3))cout<<str[a[j+2]]; 110 j+=3; 111 } 112 } 113 cout<<"="<<endl; 114 } 115 } 116 }
实验结果
测试1.生成9道,不超过6个数,最大值为9,最小值为2的四则运算题:
测试2.生成6道加减无负数,乘除无余数,最大值为9,最小值为2的二则运算