四则运算进化版
一、题目要求:
1、题目避免重复;
2、可定制(数量/打印方式);
3、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、
否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;
二、设计思想
1、题目避免重复
(1)调用随机函数发生器,将生成的运算式用数组存储,将新的运算式与已生成式子做比较,若相同则不输出,不同则输出
2、可定制(数量/打印方式)
(1)提示用户输入题目数量,打印方式,从键盘输入
3、(1)是否有乘除法
在输入之前提示用户是否有乘除法,若没有,则只输出加减法
(2)是否有括号
(3)数值范围
由用户设置数值范围,如果输入不合法,提示输入错误,请重新输入,在随机生成数中保证随机数在用户设置的数值范围
(4)加减有无负数
如果没有负数,比较生成的两个数,保证做减法时被减数不小于减数
(5)乘除有无余数
首先判断除数是否为零,若为零则终止,若不为零则继续。对做除法的两个操作数做取余运算,若为零则没有余数
三、原程序代码
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
void display(int number,int l,int mul,int num,int neg,int remainder)//打印方式控制输出列数
{
int a[1000],b[1000],c[1000];
int m;//控制题目避免重复
int t;//中间变量
for(int i=0;i<number;i++)//随机两个生成运算操作数
{
m=1;//初始化
a[i]=rand()%num;
b[i]=rand()%num;
if(mul==0)//没有乘除法
{
c[i]=rand()%2;//随机生成0-1的数字,分别表示加减
}
if(mul==1)//有乘除法
{
c[i]=rand()%4;//随机生成0-3的数字,分别表示加减乘除
}
for(int j=0;j<i;j++)
{
if(a[j]==a[i]&&b[j]==b[i]&&c[j]==c[i])//比较新生成的操作数与原来的是否相同
{
i=i-1;
m=0;
}
}
while(m)//若不同则输出
{
switch(c[i])
{
case 0:
cout<<a[i]<<"+"<<b[i]<<"=";break;
case 1:
if(neg==0)//减法没有负数
{
if(a[i]<b[i])
{
t=a[i];
a[i]=b[i];
b[i]=t;
}
cout<<a[i]<<"-"<<b[i]<<"=";break;
}
else
{
cout<<a[i]<<"-"<<b[i]<<"=";break;
}
case 2:
cout<<a[i]<<"*"<<b[i]<<"=";break;
case 3:
if(b[i]==0)//分母为零则不计入总数
{
i=i-1;break;
}
else if(remainder==0)//除法没有余数
{
if(a[i]%b[i]==0)
{
cout<<a[i]<<"/"<<b[i]<<"=";break;
}
else
{
i=i-1;break;
}
}
else if(remainder==1)//除法有余数
{
if(a[i]%b[i]!=0)
{
cout<<a[i]<<"/"<<b[i]<<"=";break;
}
else
{
i=i-1;break;
}
}
}
if((i+1)%l==0)
{
cout<<endl;
}
else
{
cout<<"\t"<<"\t";
}
break;//跳出循环
}
}
}
void main()
{
int number;//题目数量
int l;//输出的列数
int mul;//乘除法
int num;//数值范围
int neg;//负数
int remainder;//余数
srand((unsigned) time(NULL));//调用随机函数发生器
cout<<"---------------------------------"<<endl;
cout<<" 四则运算 "<<endl;
cout<<"---------------------------------"<<endl;
cout<<"请输入要打印的题目数量:"<<endl;
cin>>number;
cout<<"请输入要输出的列数(1-10):"<<endl;
cin>>l;
cout<<"是否有乘除法(0表示没有;1表示有)"<<endl;
cin>>mul;
if(mul==1)
{
cout<<"除法有无余数(0表示没有;1表示有)"<<endl;
cin>>remainder;
}
cout<<"请输入正整数的数值范围(即最大数):"<<endl;
cin>>num;
cout<<"减法有无负数(0表示没有;1表示有)"<<endl;
cin>>neg;
display(number,l,mul,num,neg,remainder);
}
程序截图
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
void display(int number,int l,int mul,int num,int neg,int remainder)//打印方式控制输出列数
{
int a[1000],b[1000],c[1000];
int m;//控制题目避免重复
int t;//中间变量
for(int i=0;i<number;i++)//随机两个生成运算操作数
{
m=1;//初始化
a[i]=rand()%num;
b[i]=rand()%num;
if(mul==0)//没有乘除法
{
c[i]=rand()%2;//随机生成0-1的数字,分别表示加减
}
if(mul==1)//有乘除法
{
c[i]=rand()%4;//随机生成0-3的数字,分别表示加减乘除
}
for(int j=0;j<i;j++)
{
if(a[j]==a[i]&&b[j]==b[i]&&c[j]==c[i])//比较新生成的操作数与原来的是否相同
{
i=i-1;
m=0;
}
}
while(m)//若不同则输出
{
switch(c[i])
{
case 0:
cout<<a[i]<<"+"<<b[i]<<"=";break;
case 1:
if(neg==0)//减法没有负数
{
if(a[i]<b[i])
{
t=a[i];
a[i]=b[i];
b[i]=t;
}
cout<<a[i]<<"-"<<b[i]<<"=";break;
}
else
{
cout<<a[i]<<"-"<<b[i]<<"=";break;
}
case 2:
cout<<a[i]<<"*"<<b[i]<<"=";break;
case 3:
if(b[i]==0)//分母为零则不计入总数
{
i=i-1;break;
}
else if(remainder==0)//除法没有余数
{
if(a[i]%b[i]==0)
{
cout<<a[i]<<"/"<<b[i]<<"=";break;
}
else
{
i=i-1;break;
}
}
else if(remainder==1)//除法有余数
{
if(a[i]%b[i]!=0)
{
cout<<a[i]<<"/"<<b[i]<<"=";break;
}
else
{
i=i-1;break;
}
}
}
if((i+1)%l==0)
{
cout<<endl;
}
else
{
cout<<"\t"<<"\t";
}
break;//跳出循环
}
}
}
void main()
{
int number;//题目数量
int l;//输出的列数
int mul;//乘除法
int num;//数值范围
int neg;//负数
int remainder;//余数
srand((unsigned) time(NULL));//调用随机函数发生器
cout<<"---------------------------------"<<endl;
cout<<" 四则运算 "<<endl;
cout<<"---------------------------------"<<endl;
cout<<"请输入要打印的题目数量:"<<endl;
cin>>number;
cout<<"请输入要输出的列数(1-10):"<<endl;
cin>>l;
cout<<"是否有乘除法(0表示没有;1表示有)"<<endl;
cin>>mul;
if(mul==1)
{
cout<<"除法有无余数(0表示没有;1表示有)"<<endl;
cin>>remainder;
}
cout<<"请输入正整数的数值范围(即最大数):"<<endl;
cin>>num;
cout<<"减法有无负数(0表示没有;1表示有)"<<endl;
cin>>neg;
display(number,l,mul,num,neg,remainder);
}
日期 | 听课 | 编程 | 阅读资料 | 网上查找 | 总计 |
星期一 | 120 | 20 | 50 | 50 | 240 |
星期二 | 50 | 50 | 100 | ||
星期三 | |||||
星期四 | 120 | 70 | 190 | ||
星期五 | |||||
星期六 | 120 | 100 | 220 | ||
星期日 | 120 | 120 | |||
总计 | 240 |
870 |