生成四则运算2
//20133059 武于微 信1301-1班 #include<iostream> #include<sstream> #include<string> #include<ctime> #include<fstream> #define size 10000 using namespace std; string num_str(int i) //将数字转换为字符串 { stringstream ss; ss<<i; return ss.str(); } int Operator(int m) //产生运算符 { int a,b; char oper; a=rand()%4; //产生随机整数用于除四取余后进行四种运算符号和四种数的选择 b=rand()%2; if(m==2) //无乘除法情况 { switch(b) //用于加减运算两种符选择 { case 0: oper='+'; break; case 1: oper='-'; break; default: break; } } if(m==1) //有乘除法情况 { switch(a) //用于四则运算四种符号的选择 { case 0: oper='+'; break; case 1: oper='-'; break; case 2: oper='*'; break; case 3: oper='/'; break; default: break; } } return oper; } int operator1(char oper) //随机生成运算符号判断 { int k; if(oper=='+') { k=1; } if(oper=='-') { k=2; } if(oper=='*') { k=3; } if(oper=='/') { k=4; } return k; } int Calculate1(int number,int value,int print) //满足最多十个数值运算,无加减负数乘除余数限制 { int i,j,num1,num2,jishu,m,n; char oper1,op1,op2; string s_num1,s_num2,s_connect[size]; ofstream outfile; //定义ofstream类即输出文件流类对象outfile srand((unsigned)time(NULL)); //通过系统时间初始化随机数种子,若不设置则每次产生随机数相同 cout<<"请选择运算是否有乘除法:1.有 2.没有"<<endl; //乘除法选择 cin>>m; if(print==2) //文件打开 { outfile.open("out.txt",ios::out); if(!outfile) //打开错误,报错 { cerr<<"open error!"<<endl; exit(0); } } for(i=0;i<number;i++) //输出运算式数量循环 { num1=rand()%value+1; num2=rand()%value+1; oper1=Operator(m); s_num1=num_str(num1); s_num2=num_str(num2); s_connect[i]=s_num1+oper1+s_num2; jishu=rand()%9+2; if(jishu>2) //对随机生成运算式里数值个数判断 { for(j=jishu;j>2;j--) //两个数值以上运算式生成 { s_num1=s_connect[i]; oper1=Operator(m); num2=rand()%value+1; s_num2=num_str(num2); s_connect[i]=s_num1+oper1+s_num2; } } if(print==2) //文件输出 { outfile<<s_connect[i]<<"="<<endl; } else { cout<<s_connect[i]<<"="<<endl; //dos界面输出 } } if(print==2) { outfile.close(); //关闭文件 } return 0; } int Calculate2(int number,int value,int print) //三个数组成的运算式,有加减负数和乘除法限制 { int i,num1,num2,num3,k1,k2,num,m,negtive,remainder; char oper1,oper2; string s_num1,s_num2,s_num3,s_connect[size]; ofstream outfile; //定义ofstream类即输出文件流类对象outfile srand((unsigned)time(NULL)); //通过系统时间初始化随机数种子,若不设置则每次产生随机数相同 cout<<"请选择运算时加减结果是否有负数:1.有 2.没有"<<endl; //加减法有无负数选择 cin>>negtive; cout<<"请选择运算是否有乘除法:1.有 2.没有"<<endl; //乘除法选择 cin>>m; if(m==1) { cout<<"请选择运算时除法是否有余数:1.有 2.没有"<<endl; //除法有无余数选择 cin>>remainder; } if(print==2) //文件打开 { outfile.open("out.txt",ios::out); if(!outfile) //打开错误,报错 { cerr<<"open error!"<<endl; exit(0); } } for(i=0;i<number;i++) //输出运算式数量循环 { num1=rand()%value+1; num2=rand()%value+1; num3=rand()%value+1; oper1=Operator(m); oper2=Operator(m); k1=operator1(oper1); k2=operator1(oper2); if(negtive==1&&m==2) //加减有负数,无乘除法 { oper1=Operator(m); oper2=Operator(m); k1=operator1(oper1); k2=operator1(oper2); } if(negtive==2&&m==2) //加减无负数,无乘除法 { oper1=Operator(m); oper2=Operator(m); k1=operator1(oper1); k2=operator1(oper2); if(k1==2) { for(;num1<num2;) { num1=rand()%value+1; } num=num1-num2; } if(k1==1) { num=num1+num2; } if(k2==2) { for(;num<num3;) { num3=rand()%value+1; } } } if(negtive==2&&m==1&&remainder==2) //加减无负数,乘除法无余数 { oper1=Operator(m); oper2=Operator(m); k1=operator1(oper1); k2=operator1(oper2); if(k1==4) { for(;num1%num2!=0;) { num1=rand()%value+1; } num=num1/num2; if(k2==2) { for(;num<num3;) { num3=rand()%value+1; } } } if(k2==4) { for(;num2%num3!=0;) { num2=rand()%value+1; } num=num2/num3; if(k1==2) { for(;num1<num;) { num1=rand()%value+1; } } } if(k1==4&&k2==4) { for(;num1%num2!=0;) { num1=rand()%value+1; } num=num1/num2; for(;num%num3!=0;) { num3=rand()%value+1; } } } if(negtive==1&&m==1&&remainder==2) //加减无负数,乘除法无余数 { if(k1==4) { for(;num1%num2!=0;) { num1=rand()%value+1; } } if(k2==4) { for(;num2%num3!=0;) { num2=rand()%value+1; } } if(k1==4&&k2==4) { for(;num1%num2!=0;) { num1=rand()%value+1; } num=num1/num2; for(;num%num3!=0;) { num3=rand()%value+1; } } } s_num1=num_str(num1); s_num2=num_str(num2); s_num3=num_str(num3); s_connect[i]=s_num1+oper1+s_num2+oper2+s_num3; if(print==2) //文件输出 { outfile<<s_connect[i]<<"="<<endl; } else { cout<<s_connect[i]<<"="<<endl; //dos界面输出 } } if(print==2) { outfile.close(); //关闭文件 } return 0; } void main() { int number,value,print,chose; cout<<"请输入运算题目数量:"<<endl; //定制运算题目数量 cin>>number; cout<<"请输入数值产生范围:"<<endl; //选择数值产生范围 cin>>value; cout<<"请选择运算题目打印方式: 1.dos界面打印 2.文件打印"<<endl; //定制运算题目打印方式 cin>>print; cout<<"请选择: 1.随机产生10个数以内的运算式,无加减负数乘除余数限制"<<endl; cout<<" 2.满足三个数值的运算式,有加减负数乘除余数限制"<<endl; cin>>chose; if(chose==1) { Calculate1(number,value,print); } if(chose==2) { Calculate2(number,value,print); } }
运行结果截图:
题目:
1.题目避免重复
2.可定制(数量/打印方式)
3.可以控制下列参数:
是否有乘除法
是否有括号(最多可以支持十个数参与计算)
数值范围
加减结果有无负数
除法结果有无余数
思路:
1.设置主函数让用户选择题目数量,打印方式,由于刚开始大方向写的不对导致时间不够只写了Calculate2函数在三个数条件下满足的加减有无负数,有乘法并满足乘法有无余数的功能,Calculate1函数满足十个数以内随机四则运算
2.写一个数字转变成字符串的num_str函数,满足函数中运算式以字符串形式输出
3.写一个随机产生运算符的Operator函数,满足随机产生运算符
4.写一个随机生成运算符号判断的operator1函数,满足Calculate2中符号判断
5.Calculate1函数实现满足十个数以内随机四则运算,通过数字转变成字符串,以字符串的形式输出
6.Calculate2函数在三个数条件下满足的加减有无负数,有乘法并满足乘法有无余数的功能,通过if-else语句判断乘除符号和加减符号位置,完成相应功能
7.通过主函数来调用Calculate1,Calculate2完成功能
个人总结:
这次程序完成的很不理想,还有非常多的缺陷,同时也意识到自己的不足和差距,由于思路上自己没有好好明确做了非常多的无用功,浪费了很多时间,程序实现的功能也有很多不足之处,课余时间还会更加努力,来提高自己的编程能力
项目计划日志(单位:h)
听课 |
编写程序 |
阅读相关书籍 |
网上查找资料 |
日总计 |
|
周一 |
2 |
0 |
1 |
0 |
3 |
周二 |
0 |
0 |
1 |
0 |
1 |
周三 |
0 |
3 |
0 |
0 |
3 |
周四 |
2 |
5 |
1 |
1 |
9 |
周五 |
0 |
8 |
1 |
1 |
10 |
周六 |
0 |
5 |
1 |
1 |
4 |
周日 |
|
|
|
|
|
周总计 |
4 |
21 |
4 |
3 |
32 |
时间记录日志:(单位:min):
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
星期一 |
14:00 |
15:50 |
10 |
100 |
听课 |
软件工程 |
|
21:00 |
22:00 |
0 |
60 |
看书 |
构建之法 |
星期二 |
19:00 |
20:00 |
0 |
60 |
看书 |
C++ |
星期三 |
14:30 |
17:30 |
0 |
180 |
编程 |
四则运算2 构建之法 |
星期四 |
19:00 |
00:20 |
0 |
320 |
编程 |
四则运算2 阅读C++ |
星期五 |
15:00 |
23:00 |
60 |
420 |
编程 |
四则运算2 阅读C++ |
星期六 |
10:00 |
18:00 |
60 |
420 |
编程和写博客 |
四则运算2 |
|
|
|
|
|
|
|