设计思路
一、题目避免重复
把题目的两个运算数和运算符号保存到三个数组里,之后每次出题依次比较运算数和运算符号是否已经储存在数组里。如果三者都相同就重新出题,如果不相同就把数据储存在数组里,继续出题。
二、可定制
设置两个变量控制数量和打印方式,由用户输入。
三、是否有乘除法
加减乘除可以取4的余数来控制,不支持乘除法可以取2的余数来控制。
四、数值范围
通过控制随机数的生成范围来决定数值的取值范围。
五、加减有无负数
通过随机产生一个数n,用(-1)的n次方来控制是否为负数,负数打印要加上括号如:1+(-3)=或者3-(-1)=。
六、除法有无余数
随机数产生后验证可以整除再打印,否则重新生成随机数。
七、是否支持分数
生成4个随机数分别表示两个分子和两个分母。
源程序代码
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void main()
{
int a,b,c,d,e,f,g,i;
char x,y;
cout<<"请输入出题数量:"<<endl;
cin>>d;
cout<<"请输入数值范围:"<<endl;
cin>>f>>g;
cout<<"请输入是否有乘除法?(Y/N)"<<endl;
cin>>x;
cout<<"请输入是否有余数?(Y/N)"<<endl;
cin>>y;
if (x=='Y') e=4;
if (x=='N') e=2;
srand(unsigned(time(0)));
for (i=0;i<d;i++)
{
a=rand()%(g-f+1)+f;
b=rand()%(g-f+1)+f;
c=rand()%100;
c=c%e;
if (b>=0)
{
if (c==0) cout<<i+1<<":"<<a<<"+"<<b<<"="<<endl;
if (c==1) cout<<i+1<<":"<<a<<"-"<<b<<"="<<endl;
if (c==2) cout<<i+1<<":"<<a<<"*"<<b<<"="<<endl;
if (c==3)
{
while(b==0)
{
b=rand()%(g-f+1)+f;
}
while(a%b!=0&&y=='N')
{
a=rand()%(g-f+1)+f;
b=rand()%(g-f+1)+f;
}
cout<<i+1<<":"<<a<<"/"<<b<<"="<<endl;
}
}
else
{
if (c==0) cout<<i+1<<":"<<a<<"+("<<b<<")="<<endl;
if (c==1) cout<<i+1<<":"<<a<<"-("<<b<<")="<<endl;
if (c==2) cout<<i+1<<":"<<a<<"*("<<b<<")="<<endl;
if (c==3)
{
while(a%b!=0&&y=='N')
{
a=rand()%(g-f+1)+f;
b=rand()%(g-f+1)+f;
}
cout<<i+1<<":"<<a<<"/("<<b<<")="<<endl;
}
}
}
}
运行结果截图
编程总结
这个程序可以自定义出题数量,通过用户输入数字来控制。提示用户输入两个数来指定出题的数值范围,根据用户需要可以选择是否有乘除法,用户输入Y就包含乘除法,用户输入N就不含乘除法,保证除数不为零。根据用户指定的数值范围来控制是否产生负数,同时还优化了出现负数时的打印格式(添加小括号)。用户也可以控制除法有无余数,若要求无余数,当程序生成有余数的除法题会舍弃数据再生成一道题,看是否满足条件,若满足就打印出来,若不满足继续生成。
时间记录日志