标签:
程序设计思想
程序的主要设计思想为用字符串数组保存生成的运算题,将操作数采用单独算法处理,然后进行类型转换和操作符一起存入数组中,鉴于字符串的特性,可以对字符串的长度进行随意添加而不必考虑长度问题,最后进行字符串数组的输出产生客户要求的运算题;
源代码
#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