四则运算2完整版
一、题目要求:
1、题目避免重复;
2、可定制(数量/打印方式);
3、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、
否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;
二、设计思想
1、题目避免重复
(1)调用随机函数发生器,将生成的运算式用数组存储,将新的运算式与已生成式子做比较,若相同则不输出,不同则输出
2、可定制(数量/打印方式)
(1)提示用户输入题目数量,打印方式,从键盘输入
3、(1)是否有乘除法
在输入之前提示用户是否有乘除法,若没有,则只输出加减法
(2)是否有括号
(3)数值范围
由用户设置数值范围,如果输入不合法,提示输入错误,请重新输入,在随机生成数中保证随机数在用户设置的数值范围
(4)加减有无负数
如果没有负数,比较生成的两个数,保证做减法时被减数不小于减数
(5)乘除有无余数
首先判断除数是否为零,若为零则终止,若不为零则继续。对做除法的两个操作数做取余运算,若为零则没有余数
三、原程序代码
1 #include<iostream.h> 2 #include<stdlib.h> 3 #include<time.h> 4 void display(int number,int l,int mul,int num,int neg,int remainder)//打印方式控制输出列数 5 { 6 int a[1000],b[1000],c[1000]; 7 int m;//控制题目避免重复 8 int t;//中间变量 9 for(int i=0;i<number;i++)//随机两个生成运算操作数 10 { 11 m=1;//初始化 12 a[i]=rand()%num; 13 b[i]=rand()%num; 14 if(mul==0)//没有乘除法 15 { 16 c[i]=rand()%2;//随机生成0-1的数字,分别表示加减 17 } 18 if(mul==1)//有乘除法 19 { 20 c[i]=rand()%4;//随机生成0-3的数字,分别表示加减乘除 21 } 22 for(int j=0;j<i;j++) 23 { 24 if(a[j]==a[i]&&b[j]==b[i]&&c[j]==c[i])//比较新生成的操作数与原来的是否相同 25 { 26 i=i-1; 27 m=0; 28 } 29 } 30 while(m)//若不同则输出 31 { 32 switch(c[i]) 33 { 34 case 0: 35 cout<<a[i]<<"+"<<b[i]<<"=";break; 36 case 1: 37 if(neg==0)//减法没有负数 38 { 39 if(a[i]<b[i]) 40 { 41 t=a[i]; 42 a[i]=b[i]; 43 b[i]=t; 44 } 45 cout<<a[i]<<"-"<<b[i]<<"=";break; 46 } 47 else 48 { 49 cout<<a[i]<<"-"<<b[i]<<"=";break; 50 } 51 case 2: 52 cout<<a[i]<<"*"<<b[i]<<"=";break; 53 case 3: 54 if(b[i]==0)//分母为零则不计入总数 55 { 56 i=i-1;break; 57 } 58 else if(remainder==0)//除法没有余数 59 { 60 if(a[i]%b[i]==0) 61 { 62 cout<<a[i]<<"/"<<b[i]<<"=";break; 63 } 64 else 65 { 66 i=i-1;break; 67 } 68 } 69 else if(remainder==1)//除法有余数 70 { 71 if(a[i]%b[i]!=0) 72 { 73 cout<<a[i]<<"/"<<b[i]<<"=";break; 74 } 75 else 76 { 77 i=i-1;break; 78 } 79 } 80 } 81 if((i+1)%l==0) 82 { 83 cout<<endl; 84 } 85 else 86 { 87 cout<<"\t"<<"\t"; 88 } 89 break;//跳出循环 90 } 91 } 92 } 93 void main() 94 { 95 int number;//题目数量 96 int l;//输出的列数 97 int mul;//乘除法 98 int num;//数值范围 99 int neg;//负数 100 int remainder;//余数 101 srand((unsigned) time(NULL));//调用随机函数发生器 102 cout<<"---------------------------------"<<endl; 103 cout<<" 四则运算 "<<endl; 104 cout<<"---------------------------------"<<endl; 105 cout<<"请输入要打印的题目数量:"<<endl; 106 cin>>number; 107 cout<<"请输入要输出的列数(1-10):"<<endl; 108 cin>>l; 109 cout<<"是否有乘除法(0表示没有;1表示有)"<<endl; 110 cin>>mul; 111 if(mul==1) 112 { 113 cout<<"除法有无余数(0表示没有;1表示有)"<<endl; 114 cin>>remainder; 115 } 116 cout<<"请输入正整数的数值范围(即最大数):"<<endl; 117 cin>>num; 118 cout<<"减法有无负数(0表示没有;1表示有)"<<endl; 119 cin>>neg; 120 display(number,l,mul,num,neg,remainder); 121 }
四、运行结果截图
五、日志记录
六、实验总结
在实验过程中遇到了一些困难,首先调用随即函数发生器不会写,通过上网查询自己解决了,在写控制题目避免重复时,while循环的位置总是不对,还是最后缺少了break终止。变量的定义范围掌握不准确。实验程序写的并不完整,是否有括号,是否支持分数、小数等功能没有实现。程序只编写了一个函数,把所有的参数都放在了里面,修改起来不方便,所以还有待改进。