程序设计思想
程序的主要设计思想为用字符串数组保存生成的运算题,将操作数采用单独算法处理,然后进行类型转换和操作符一起存入数组中,鉴于字符串的特性,可以对字符串的长度进行随意添加而不必考虑长度问题,最后进行字符串数组的输出产生客户要求的运算题;
源代码
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<iostream>
#include<string>
#include<cstring>
#include<iomanip>
using namespace std;
bool IfRepeated(int CurLocation,string a[])//是否重复
{
for(int p=0;p<CurLocation;p++)
{
for(int q=0;a[p][q]!=‘\0‘ && a[CurLocation][q]!=‘\0‘;q++)
{
if(a[p][q]!=a[CurLocation][q])
p++;
if(a[p][q]==‘\0‘&&a[CurLocation][q]==‘\0‘)
return true;
}
}
return false;
}
void Digit(int i,int j,string a[],int Location,int IfDecimal,int Random)//数字转变为字符
{
if(IfDecimal==1)
{
if(Random==1)
{
a[Location]+=‘0‘;
a[Location]+=‘.‘;
a[Location]+=(char)(j%10+48);
if(j%100/10!=0)
a[Location]+=(char)(j%100/10+48);
if(j/100!=0)
a[Location]+=(char)(j/100+48);
}
else
{
if(i/100!=0)
{
a[Location]+=(char)(i/100+48);
}
if(i%100/10!=0)
{
a[Location]+=(char)(i%100/10+48);
}
a[Location]+=(char)(i%10+48);
}
}
else
{
if(i/100!=0)
{
a[Location]+=(char)(i/100+48);
}
if(i%100/10!=0)
{
a[Location]+=(char)(i%100/10+48);
}
a[Location]+=(char)(i%10+48);
}
}
void DealDigit(string a[],int p,int range,int IfNegative,int IfFraction,int x,int IfDecimal,int DecDig)
{
int RandomNum1=(int)rand()%100/50;//是否产生负数的随机数
int RandomNum2=(int)rand()%100/50;//是否产生分数的随机数
int RandomNum3=(int)rand()%DecDig;//小数的随机数
int RandomNum4=(int)rand()%100/50;//是否产生小数
x=(int)rand()%range;//分子
int z=(int)rand()%range;//分母
if(IfNegative==1)//随机生成数字
{
if(RandomNum1==1&&RandomNum2==1)//随机生成负分数
{
a[p]+=‘(‘;
a[p]+=‘-‘;
Digit(x,0,a,p,0,0);
a[p]+=‘/‘;
Digit(z,0,a,p,0,0);
a[p]+=‘)‘;
}
else if(RandomNum1==1&&RandomNum2!=1)//负数
{
a[p]+=‘(‘;
a[p]+=‘-‘;
Digit(x,RandomNum3,a,p,IfDecimal,RandomNum4);
a[p]+=‘)‘;
}
else//数字默认为正数
{
Digit(x,RandomNum3,a,p,IfDecimal,RandomNum4);
}
}
else//正数
{
if(IfFraction==1)//随机生成正分数
{
if(RandomNum2==1)
{
a[p]+=‘(‘;
Digit(x,0,a,p,0,0);
a[p]+=‘/‘;
Digit(z,0,a,p,0,0);
a[p]+=‘)‘;
}
}
else//默认为正数
{
Digit(x,RandomNum3,a,p,IfDecimal,RandomNum4);
}
}
}
/*IfIncMD是否有乘除,range数值范围,IfIncBrackets是否有括号,IfNeg加减是否允许有负数,IfRem除法是否允许有余数
IfFraction是否支持分数,IfDec是否支持小数,DecDig设置小数范围*/
void Deal(int QstNum,string a[],int IfIncMD,int range,int IfIncBrackets,int IfNegative,int IfRemainder,int IfFraction,int IfDecimal,int DecDig)
{
for(int p=0;p<QstNum;p++)
{
int count=0;
int FirstNum=0,SecNum=0;//生成的相邻的两个操作数
int RandomNum1,RandomNum2,RandomNum3,RandomNum4;
int OperandNum=(int)rand()%10/5+2;//操作数的个数,属于二元或三元运算
int Brackets=(int)rand()%100/50;//随机生成括号
int z;//分母
if(Brackets==1&&count==0&&OperandNum>2&&IfIncBrackets==1)//判断是否生成括号
{
a[p]+="(";
count++;
}
DealDigit(a,p,range,IfNegative,IfFraction,FirstNum,IfDecimal,DecDig);//生成第一个数
for(int q=1;q<OperandNum;q++)
{
int Operator=(int)rand()%100/25;//操作符的范围
if(IfIncMD==0)
Operator/=2;//操作符范围设置只有"+-";
switch(Operator)
{
case 0:
a[p]+=‘+‘;
DealDigit(a,p,range,IfNegative,IfFraction,SecNum,IfDecimal,DecDig);
break;
case 1:
a[p]+=‘-‘;
DealDigit(a,p,range,IfNegative,IfFraction,SecNum,IfDecimal,DecDig);
break;
case 2:
a[p]+=‘*‘;
DealDigit(a,p,range,IfNegative,IfFraction,SecNum,IfDecimal,DecDig);
break;
case 3:
a[p]+=‘/‘;
RandomNum1=(int)rand()%100/50;//是否产生负数的随机数
RandomNum2=(int)rand()%100/50;//是否产生分数的随机数
RandomNum4=(int)rand()%100/50;//是否产生小数的随机数
RandomNum3=(int)rand()%DecDig;//小数的随机数
SecNum=(int)rand()%range;//分子
z=(int)rand()%range;
if(IfNegative==1)//随机生成数字
{
if(RandomNum1==1&&RandomNum2==1)//随机生成负分数
{
a[p]+=‘(‘;
a[p]+=‘-‘;
Digit(SecNum,0,a,p,0,0);
a[p]+=‘/‘;
Digit(z,0,a,p,0,0);
a[p]+=‘)‘;
}
else if(RandomNum1==1&&RandomNum2!=1)//负数
{
a[p]+=‘(‘;
a[p]+=‘-‘;
Digit(SecNum,RandomNum4,a,p,IfDecimal,RandomNum3);
a[p]+=‘)‘;
}
else//数字默认为正数
{
Digit(SecNum,DecDig,a,p,0,0);
if(IfRemainder==0)
{
if(IfIncBrackets==0)//当不生成括号时
{
if(FirstNum%SecNum!=0)//除法有余数
{
Digit(SecNum,RandomNum4,a,p,IfDecimal,RandomNum3);
}
}
}
}
}
else//正数
{
if(IfFraction==1)//随机生成正分数
{
if(RandomNum2==1)
{
a[p]+=‘(‘;
Digit(SecNum,0,a,p,0,0);
a[p]+=‘/‘;
Digit(z,0,a,p,0,0);
a[p]+=‘)‘;
}
}
else//默认为正数
{
Digit(SecNum,DecDig,a,p,IfDecimal,RandomNum3);
if(IfRemainder==0)
{
if(IfIncBrackets==0)//当不生成括号时
{
if(FirstNum%SecNum!=0)//除法有余数
{
Digit(SecNum,RandomNum4,a,p,IfDecimal,RandomNum3);
}
}
}
}
}
break;
}
if(Brackets==1&&count==1&&q==1)
{
a[p]+=")";
}
FirstNum=SecNum;//将运算符左侧数置为FirstNum
}
a[p]+=‘=‘;
a[p]+=‘\0‘;
//判断是否重复,重复则重新生成
if(IfRepeated(p,a))
{
p--;
}
}
}
//输出字符串数组
void Display(int QstNum,string a[],int ColumnNum,int HSpace)
{
int count1=0;
int p;
for(p=0;p<QstNum;p++)
{
cout<<setw(HSpace)<<a[p];
count1++;
if(count1%ColumnNum==0)
cout<<endl;
else
cout<<‘\t‘;
}
}
void main()
{
srand((unsigned)time(NULL));
int p;
do
{
system("mode con: cols=100 lines=40");
system("cls");
int QstNum,ColumnNum,IfIncMD,IfIncBrackets,range,HSpace,IfNeg,IfRem,IfFraction,IfDec,DecDig=0;
string a[1000];//保存字符串的数组
cout<<"请输入生成的四则运算题个数(1-1000):";
cin>>QstNum;
while(QstNum<0&&QstNum>1000)
{
cout<<"请重新输入生成的四则运算题个数(1-1000):";
cin>>QstNum;
}
cout<<"请输入生成的列数:(1-10)";
cin>>ColumnNum;
while(ColumnNum<1||ColumnNum>10)
{
cout<<"请重新输入生成的列数:(1-10列)";
cin>>ColumnNum;
}
//是否有乘除法
cout<<"是否有乘除法:(1/0)";
cin>>IfIncMD;
while(IfIncMD>1||IfIncMD<0)
{
cin>>IfIncMD;
}
//是否允许支持小数
cout<<"是否允许支持小数(输入1则支持,0则不支持)";
cin>>IfDec;
while(IfDec!=1&&IfDec!=0)
{
cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
cin>>IfDec;
}
if(IfDec==1)
{
cout<<"小数数值范围:(精确到千分位,百分位,十分位,输入1000,100或10)";
cin>>DecDig;
while(DecDig!=10&&DecDig!=100&&DecDig!=1000)
{
cout<<"请输入10,100,或1000:";
cin>>DecDig;
}
}
//整数数值范围
cout<<"整数数值范围:(1000以内,100以内,10以内)";
cin>>range;
while(range!=10&&range!=100&&range!=1000)
{
cout<<"请输入10,100,或1000:";
cin>>range;
}
//是否支持括号
cout<<"是否随机生成括号:";
cin>>IfIncBrackets;
while(IfIncBrackets!=1&&IfIncBrackets!=0)
{
cout<<"请输入1或0:(1随机生成括号,0不随机生成括号)";
cin>>IfIncBrackets;
}
//设置运算题间距
cout<<"每行运算题的间距:(1-15)";
cin>>HSpace;
while(HSpace<1||HSpace>15)
{
cout<<"请输入数值在1-15范围内:";
cin>>HSpace;
}
//加减是否支持负数的存在
cout<<"加减是否允许有负数的存在(输入1则允许,0则不允许)";
cin>>IfNeg;
while(IfNeg!=1&&IfNeg!=0)
{
cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
cin>>IfNeg;
}
//除法是否允许有余数的存在
cout<<"除法是否允许有余数的存在(输入1则允许,0则不允许)";
cin>>IfRem;
while(IfRem!=1&&IfRem!=0)
{
cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
cin>>IfRem;
}
//整数除法是否允许有分数的存在
cout<<"整数除法是否允许有分数的存在(输入1则允许,0则不允许)";
cin>>IfFraction;
while(IfFraction!=1&&IfFraction!=0)
{
cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
cin>>IfFraction;
}
/*IfIncMD是否有乘除,range数值范围,IfIncBrackets是否有括号,IfNeg加减是否允许有负数,IfRem除法是否允许有余数
IfFraction是否支持分数,IfDec是否支持小数,DecDig设置小数范围*/
Deal(QstNum,a,IfIncMD,range,IfIncBrackets,IfNeg,IfRem,IfFraction,IfDec,DecDig);
Display(QstNum,a,ColumnNum,HSpace);
cout<<endl;
cout<<"是否继续生成运算题(输入1则生成否则不生成)";
cin>>p;
while(p!=1&&p!=0)
{
cout<<"请输入1或0(输入1则生成否则不生成)"<<endl;
cin>>p;
}
}while(1==p);
}
程序截图

实验总结
程序越到后期越难以更改,往往牵一发而动全身,由此对程序维护有了深刻的认识;编写中间到没有遇到特别的困难,但堆加功能任务令人头疼,耗时将近12个小时;此次程序还有很多不足之处,在此也希望大家能提出宝贵意见
原文:http://www.cnblogs.com/tianma-0/p/4339588.html