一、设计思想
1.在结构方面,将题目拆分开来,一共有四个部分,首先是只有加减法,其次是既有加减法也有乘除法,再其次是加减乘除都有,还有括号,最后是加减乘除没有括号。
2.在功能方面
题目避免重复这部分,实现思想是当两个式子长度相同时,利用循环令第一个数字不重复,以避免式子出现重复。题目可定制部分,数量由用户自己输入,通过随机数函数实现每个式子的长短变化以及数字和符号的随机性。输出方式可分为屏幕输出和文件输出,其中文件输出需要用到ofstream输出流来实现。 数值范围部分,由用户自己规定数值范围,由随机数函数产生在这个范围内的整数或小数,来参与运算。
3.结构的四个模块具体实现如下,只有加减法:当只有加减法出现时,由随机数函数决定加减符号,在这一模块中考虑加减有无负数的问题,当出现减号时,判断两边大小关系,令左边大于右边,实现相减无负数的功能。加减乘除无括号的情况:在加减乘除无括号出现的情况下,由随机数函数决定加减乘除符号,考虑除数不为零的情况,以及除数是否有余数,没有余数时,考虑数字都是整数的情况,利用判断被除数与随机数余数是否为零来确定除数,以实现余数为零。加减乘除有括号,没有乘除有括号:左右括号相等以及括号位置出现借助于随机数来实现。
4.缺陷是只在无括号无乘除时,两数相减无负数,在其他情况下由于其它符号影响不知道怎么判断。除法没有余数的情况也是在有乘除无括号时判断,因为在有括号时要考虑优先关系,自己想不出来解决方法,所以这两个功能覆盖不全面,还有就是未能计算出结果。
二、实验代码
//HaoYing 2016.3.7 信1301-2班 20132919 //课堂实验2--四则运算2 #include<iostream> #include<stdlib.h> #include<time.h> #include<fstream> using namespace std; ofstream ofile("c:calculate.txt",ios::trunc);//若输出到文件,则输出到c:calculate.txt中 void jiajian(int type,int choose)//输出加减符号的函数 { if(choose==0) { if(type==1) { cout<<"+"; } else ofile<<"+"; } else { if(type==1) { cout<<"-"; } else ofile<<"-"; } } void chengchu(int type,int choose)//实现输出乘除符号的函数 { if(choose==0) { if(type==1) { cout<<"*"; } else ofile<<"*"; } else { if(type==1) { cout<<"/"; } else ofile<<"/"; } } void kuohao1(int type)//实现输出左括号的函数 { if(type==1) { cout<<"("; } else ofile<<"("; } void kuohao2(int type)//实现输出右括号的函数 { if(type==1) { cout<<")"; } else ofile<<")"; } void main() { double n[10];//用来存放每道题的数字 srand((int)time(NULL));//变换随机数 int next,down,up,minus,remainder,bracket,have,edg,length,length1,length2,length3,output,choose,choose1=1,p2,p1; int i,j,k,k1,k2,m;//i,j,k用于循环计数器,k1,k2分别为左括号计数器和右括号计数器,m为输出选择控制器 cout<<"请设置题数:"; cin>>next;//实现可定制功能 cout<<"请设置打印方式:1.屏幕显示 2.保存到文件夹 "; cin>>output;//实现打印方式功能 cout<<"请设置是否有乘除法:1.是 2.否 "; cin>>have;//实现是否有乘除法功能 cout<<"请设置是否有括号:1.是 2.否 "; cin>>bracket;//实现是否有括号功能 cout<<"请设置数值范围,依次输入下限和上限:"; cin>>down; cin>>up; if(have==1&&bracket==2) { cout<<"请设置除法是否有余数:1.是 2.否 "; cin>>remainder; } if(have==2&&bracket==2) { cout<<"请设置加减法是否有负数:1.是 2.否 "; cin>>minus;//实现加减法是否有负数的功能 } if(output==2) { if(!ofile.is_open()) { cout<<"打开文件失败!"<<endl; } cout<<"已经成功保存到了C盘的calculate.txt中!"<<endl; } double p[1000]; int q[1000]; for(j=0;j<next;j++)//四则运算的题数为next的值 { length=2+(rand()%100)%8; q[j]=length; length1=length-2;//括号的对儿数最大值 for(i=0;i<length;i++) { edg=(rand()%100)%2; if(remainder==2)//如果要求除法没有余数 n[i]=down+rand()%(up-down); else { if(edg==0) n[i]=down+rand()%(up-down);//随机整数范围【down,up】 else n[i]=(down+rand()%((up-1)-down))+rand()%100/100.0;//随机数范围【down,up】的随机小数 } p[j]=n[0]; } for(k=0;k<j;k++)//避免题目重复 { if(q[k]==q[j]) { if(edg==0) p[j]=down+rand()%(up-down);//随机整数范围【down,up】 else p[j]=(down+rand()%((up-1)-down))+rand()%100/100.0;//随机数范围【down,up】的随机小数 } break; } n[0]=p[j]; if(have==2&&bracket==2)//如果只有加减法 { if(output==1) { cout<<n[0]; } else ofile<<n[0]; for(i=1;i<length;i++) { choose=(rand()%100)%2; if(choose1==0) { jiajian(output,0); choose1=1; } else jiajian(output,choose); if(minus==2)//设置加减法没有负数 { if(choose==1) { if(n[i]>n[i-1]) { if(n[i-1]==down||(n[i-1]-down)<1) n[i]=down; else n[i]=down+rand()%(int(n[i-1])-down); choose1=0; } } } if(output==1) { cout<<n[i]; } else ofile<<n[i]; } if(output==1) { cout<<"="<<endl; } else ofile<<"="<<endl; } else if(have==1&&bracket==2)//有乘除无括号 { if(output==1) { cout<<n[0]; } else ofile<<n[0]; for(i=1;i<length;i++) { if((rand()%100)%2==0) { choose=(rand()%100)%2; jiajian(output,choose); } else { choose=(rand()%100)%2; chengchu(output,choose); if(n[i]==0) n[i]=1+rand()%(up-1); if(remainder==2)//如果设置除法没有余数,则令被除数为除数的整数倍即可 { if(choose==1) { if(n[i-1]==1) n[i]=1; else { p2=int(n[i-1]); p1=1+rand()%(p2-1); while(p2%p1!=0) { p1=1+rand()%(p2-1); } n[i]=p1; } } } } if(output==1) { cout<<n[i]; } else ofile<<n[i]; } if(output==1) { cout<<"="<<endl; } else ofile<<"="<<endl; } else if(have==1&&bracket==1)//有乘除有括号 { k1=0,k2=0; length2=1+rand()%(length-1);//左括号数 length3=length2;//右括号数 if((rand()%100)%2==0&&length!=2) { if(output==1) { cout<<"("<<n[0]; } else ofile<<"("<<n[0]; k1++; } else if(output==1) { cout<<n[0]; } else ofile<<n[0]; for(i=1;i<length;i++) { m=(rand()%100)%3; if((rand()%100)%2==0) { choose=(rand()%100)%2; jiajian(output,choose); } else { choose=(rand()%100)%2; chengchu(output,choose); } if(m==0&&i!=length-1) { if(k1<=length2) { if(output==1) { cout<<"("<<n[i]; } else ofile<<"("<<n[i]; k1++; } else { if(output==1) { cout<<n[i]; } else ofile<<n[i]; } } else if(m==1&&k1!=0) { if(k2<=length3) { if(output==1) { cout<<n[i]; } else ofile<<n[i]; if(k1>k2) { for(k=0;k<k1-k2;k++) { if(output==1) { cout<<")"; } else ofile<<")"; } k2=k2+k; } } else { if(output==1) { cout<<n[i]; } else ofile<<n[i]; } } else { if(output==1) { cout<<n[i]; } else ofile<<n[i]; if(k1>k2) { for(k=0;k<k1-k2;k++) { if(output==1) { cout<<")"; } else ofile<<")"; } k2=k2+k; } } } if(output==1) { cout<<"="<<endl; } else ofile<<"="<<endl; } else//没有乘除有括号 { k1=0,k2=0;//k1,k2分别为左括号计数器和右括号计数器 length2=1+rand()%(length-1);//左括号数 length3=length2;//右括号数 if((rand()%100)%2==0&&length!=2) { if(output==1) { cout<<"("<<n[0]; } else ofile<<"("<<n[0]; k1++; } else if(output==1) { cout<<n[0]; } else ofile<<n[0]; for(i=1;i<length;i++) { m=(rand()%100)%3; choose=(rand()%100)%2; jiajian(output,choose); if(m==0&&i!=length-1) { if(k1<=length2) { if(output==1) { cout<<"("<<n[i]; } else ofile<<"("<<n[i]; k1++; } else { if(output==1) { cout<<n[i]; } else ofile<<n[i]; } } else if(m==1&&k1!=0) { if(k2<=length3) { if(output==1) { cout<<n[i]; } else ofile<<n[i]; if(k1>k2) { for(k=0;k<k1-k2;k++) { if(output==1) { cout<<")"; } else ofile<<")"; } k2=k2+k; } } else { if(output==1) { cout<<n[i]; } else ofile<<n[i]; } } else { if(output==1) { cout<<n[i]; } else ofile<<n[i]; if(k1>k2) { for(k=0;k<k1-k2;k++) { if(output==1) { cout<<")"; } else ofile<<")"; } k2=k2+k; } } } if(output==1) { cout<<"="<<endl; } else ofile<<"="<<endl; } } ofile.close(); }
三、实验截图
屏幕显示时
1.有乘除无括号:有余数
2.有乘除无括号:无余数
3.无乘除有括号
4.无乘除无括号:无负数
5.无乘除无括号:有负数
输出到文件时
1.有乘除有括号
2.有乘除无括号:有余数
3.有乘除无括号:无余数
4.无乘除有括号
5.无乘除无括号:有负数
6.无乘除无括号:无负数
四、项目计划日志
五、时间记录日志
六、缺陷记录日志