四则运算3
2016-03-19 17:59
211 查看
//信1301-1班 队员:武于微 张鹏宇 #include<iostream> #include<sstream> #include<string> #include<ctime> #include<time.h> #include<fstream> #define size 10000 using namespace std; class Calculator { public: Calculator() { STop=0; NTop=0; SignTemp=NULL; NumTemp=0; } string num_str(int i); // int string int Operator(int m); void compute(); //计算函数 double Run(int &i,int &length); char cal[100][100]; private: char Sign[100],SignTemp; double Num[100],NumTemp; int STop,NTop; }; 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; } void Calculator::compute() //计算 { switch (Sign[STop-1]) { case '+': Num[NTop-2]+=Num[NTop-1];//运算后将结果存入 STop--; NTop--; break; case '-': Num[NTop-2]-=Num[NTop-1]; STop--; NTop--; break; case '*': Num[NTop-2]*=Num[NTop-1]; STop--; NTop--; break; case '/': //判断除数是否为0,0的话结束 if (Num[STop-1]==0) { cout<<"data error!!"<<endl; exit(0); } else { Num[NTop-2]/=Num[NTop-1]; STop--; NTop--; break; } //其中STop--;NTop--;实现的是将数据弹出栈 case ')': STop=STop-2; break; //发现')'对上个运算符进行判断 } } double Calculator::Run(int &i,int &length) //运行函数 { char temp; int p=0; while (p<=length) //读入数据 { temp=cal[i][p]; if (temp>='0'&&temp<='9') { NumTemp=NumTemp*10+double(temp-48); } else { Sign[STop]=SignTemp; SignTemp=temp; STop++; //运算符入栈 if (Sign[STop-1]!=')' && temp!='(') //数字入栈 { Num[NTop]=NumTemp; NTop++; NumTemp=0; } switch (temp) //进行有关运算优先级别的考虑 { case '+': case '-': while(Sign[STop-1]!='(' && STop-1>0) compute(); break; //"+""-"的时候考虑"(" case '*': case '/': while( Sign[STop-1]!='(' && Sign[STop-1]!='+' && Sign[STop-1]!='-'&& STop-1>0 ) compute(); break; case '(': break; //继续读取 case ')': while(Sign[STop-1]!='(') compute(); break; default: while(STop-1>0) compute(); break; //结束 } } p++; } return Num[0]; } int main() //满足最多十个数值运算 { int num1,num2,jishu,number,value,print,m,kuohao,negative,i,j,n=0,kuo; char oper1; string s_num1,s_num2,s_connect[size],t; srand((unsigned)time(NULL)); //通过系统时间初始化随机数种子,若不设置则每次产生随机数相同 cout<<"请输入运算题目数量:"<<endl; //定制运算题目数量 cin>>number; cout<<"请输入数值产生范围:"<<endl; //选择数值产生范围 cin>>value; cout<<"请选择运算题目打印方式: 1.dos界面打印 2.文件打印"<<endl; //定制运算题目打印方式 cin>>print; cout<<"请选择运算是否有乘除法:1.有 2.没有"<<endl; //乘除法选择 cin>>m; cout<<"请选择运算是否有括号:1.有 2.没有"<<endl; //乘除法选择 cin>>kuohao; cout<<"请选择加减法运算是否有负数:1.有 2.没有"<<endl; //乘除法选择 cin>>negative; cout<<"请计算并输出结果:"<<endl; ofstream outfile; //定义ofstream类即输出文件流类对象outfile 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()%4+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); if(kuohao==1) //随机产生括号 { kuo=rand()%2; if(kuo==0) { s_num1='('+s_num1+')'; } } kuo=rand()%2; if(kuo==0) { t=s_num1; s_num1=s_num2; s_num2=t; } s_connect[i]=s_num1+oper1+s_num2; } } Calculator Ca; int L; double b; L=s_connect[i].length(); int k; for(k=0;k<L;k++) //字符串转变成char类型 { Ca.cal[i][k]=s_connect[i][k]; } double a=Ca.Run(i,L); //运算结果判断 if(negative==2&&a<0) { s_connect[i]=""; i--; } if(negative==1||(negative==2&&a>0)) { if(print==2) //文件输出 { cout<<s_connect[i]<<"="; cin>>b; if(b==a) { cout<<"恭喜你,回答正确!"<<endl; n++; } else { cout<<"很遗憾回答错误,继续努力!"<<"---"<<"正确答案为:"<<a<<endl; } outfile<<s_connect[i]<<"="<<b<<endl; if(b==a) { outfile<<"恭喜你,回答正确!"<<endl; n++; } else { outfile<<"很遗憾回答错误,继续努力!"<<"---"<<"正确答案为:"<<a<<endl; } } if(print==1) { cout<<s_connect[i]<<"="; //dos界面输出 cin>>b; if(b==a) { cout<<"恭喜你,回答正确!"<<endl; n++; } else { cout<<"很遗憾回答错误,继续努力!"<<"---"<<"正确答案为:"<<a<<endl; } } } } if(print==2) { outfile<<endl<<"本次答题共答对"<<n<<"道题!"<<endl<<endl<<endl<<endl; } else { cout<<endl<<"本次答题共答对"<<n<<"道题!"<<endl<<endl<<endl<<endl; } if(print==2) { outfile.close(); //关闭文件 } return 0; }
输出到文件:
思路:
定义Calculator类,类中的函数包括:
1,string num_str(int i)——将int整形的算式变为string型
利用stringstream函数
2,int Operator(int m)——随机产生运算符
用rand函数随机产生0-3的数
3,void compute();——计算函数
符号的选择,优先级
关于正负:若出现负数,则之前数组置空,重新生成
4,double Run(int &i,int &length);——计算并输出
char型的运算,出栈入栈
main函数:
随机产生两个操作数,操作符,整体转化为string型s_connect[i]
随机产生个数,根据个数,利用for循环,将之前s_connect[i]赋值给s_num1,并产生新的符号,变量,三者结合为新的s_connect[i]
定义变量kuohao,若kuohao=1,用rand随机赋值,随机添加括号
将string的算式转换为char型数组,赋值给Calculator类中的变量cal,调用Run()进行运算,结果判断是否为负数
将用户输入的结果和Run()运算结果比较,根据情况输出判断结果并计数
项目计划总结:
日期&&任务 | 听课 | 编写程序 | 阅读相关书籍 | 网上查找资料 | 日总计 |
周一 | 2 | 2 | 1 | 1 | 6 |
周二 | 3 | 1 | 4 | ||
周三 | 4 | 1 | 1 | 6 | |
周四 | 2 | 4 | 6 | ||
周五 | 6 | 1 | 1 | 8 | |
周六 | 4 | 4 | |||
周日 | 2 | 2 | |||
周总计 | 4 | 23 | 5 | 4 | 36 |
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/14 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
16:00 | 18:20 | 20 | 120 | 编写程序 | 合作讨论并编写四则运算3 | |
19:00 | 21:00 | 10 | 110 | 编程,网上查资料 | 合作编写四则运算3,讨论问题 | |
21:00 | 22:00 | 60 | 阅读书籍 | 《构建之法》 | ||
3/15 | 19:00 | 22:30 | 30 | 180 | 查资料,编写程序 | 合作编写四则运算3 |
3/16 | 18: 00 | 22:10 | 10 | 240 | 编写程序 | 合作编写四则运算3 |
3/17 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
19:00 | 22:30 | 20 | 160 | 查资料,编写程序 | 合作编写四则运算3,改程序错误 | |
3/18 | 14:00 | 17:30 | 10 | 200 | 编写修改程序 | 合作编写程序,查改程序错误 |
18:30 | 22:00 | 10 | 200 | 修改程序 | 修改并测试程序 | |
22:20 | 23:30 | 70 | 阅读书籍 | 《构建之法》 | ||
3/19 | 15:20 | 19:50 | 30 | 240 | 修改程序,写博客 | 测试修改程序,发表博客 |
3/20 | 19:00 | 21:00 | 20 | 100 | 阅读书籍 | 《构建之法》 |
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3/15 | 1 | 讨论思路 | 查阅资料 | 30min | ||
描述:对于产生的一个运算式用了string型不会计算,后采用产生char型运算式后再用栈的方法进行计算 | ||||||
3/16-3/17 | 2 | 编码 | 编译 | 10hour | ||
描述:随机生成的运算式转变为char型并和括号的组合出现问题 | ||||||
3/18-3/19 | 3 | 编码 | 调试 | 30min | ||
描述:修复括号随机产生,加减结果是否出现负数解决 |
结对的小伙伴博客:http://www.cnblogs.com/fooreveryu/
相关文章推荐
- Linux JDK安装及配置 (tar.gz版)
- 史上最全JS表单验证封装类
- java第六节-this关键字,java的内部类
- 笔试题(蘑菇街):最大间隔
- Memcached(4)------Memcached的删除机制和发展方向
- 基于angular的route实现单页面cnodejs
- 软件工程第三周第二次作业
- HAProxy的独门武器: 弹性二叉树ebtree
- Mysql HA
- hdu4314Save the dwarfs【dp】
- 第37讲项目4——大奖赛计分(2)
- Hibernate级联保存与删除
- [面试经历]那几个月在找工作(百度,网易游戏,华为)
- openwrt 显示当前时间及更改时区
- 第三周作业(二)
- 第三周进度条
- 构建之法阅读笔记03
- jQuery插件AjaxFileUpload实现ajax文件上传
- Java线程之间的通信-等待/通知机制
- jQuery扩展插件方法 $.extend()和$.fn.extend()