您好,欢迎访问三七文档
结对开发——四则运算(三)发表日期时间:2016-03-1910:17一、题目及题目要求编程随机生成四则运算,算数包括整数和真分数1.题目避免重复2.可定制(数量/打印方式)3.可以控制下列参数:是否有乘除法;是否有括号(最多可以支持十个数参与运算);数值范围;加减有无负数;除法有无余数。4.输入结果并判断正确二、设计思路在上次程序的基础上进行修改,1.题目避免重复:为避免随机数每次相同用了srand函数。2.可定制出题数量:通过键盘输入数字,在for循环中控制循环次数。3.是否有乘除法:把算符分为两大类,利用case语句选择前四种加和减,后四种乘除。4.数值范围:在产生随机数时通过输入控制rand函数的参数,从而使运算数不超过此范围。5.加减有无负号:结果无负数,判断两操作数,第一操作数若比第二操作数小,则第二个减第一个。6.除法有无余数:除法无余数,判断第一操作数模第二操作数的结果,若为0即可输出,否则再循环一次。7.是否有括号:先随机生成一个数字,代表着生成表达式中操作数的个数。再循环生成一个数字,将其输出,然后等概率生成‘+’‘-’‘*’‘/’中的一个跟在该数字后面,输出。以一定概率生成左括号,若生成了左括号则输出,并进行计数标志当前共有多少个未完成匹配的左括号。若当前有未完成匹配的左括号,则在生成一个数字后,生成一个操作符前,以一定的概率生成右括号。在生成完毕后,生成最后一个数并将为匹配的左括号予以匹配。把产生的式子存入文件。8.输入结果并判断正确:(1)对于两个运算数的式子,把结果存入数组,调用函数与数组中的值比较。(2)对于多个运算数的式子,从文件中读取内容,利用中缀表达式转换为后缀表达式,然后就是后缀表达式的计算,最后与用户输入结果对比。三、代码#includeiostream#includectime#includestack#includefstream#definelength10000//存放答案数组长度usingnamespacestd;typedeflonglongll;ofstreamfout(equation.txt);charOp[]={'+','-','*','/'};intrights;//对题数目intwrong;//错题数目structnum{llnumerator,denominator;num(){numerator=0;denominator=1;}num(intn){numerator=n;denominator=1;}num(intn,intd){numerator=n;denominator=d;}voidoperator=(numx){numerator=x.numerator;denominator=x.denominator;}};#definemaxl1005charnifix[maxl],post[maxl];charans[maxl];intcnt_right,cnt_wrong;boolerror;numres,rst;//****分数类***//classfraction{private:intabove;//分子intbelow;//分母voidreduction();//约分fractionmakeCommond(fraction);//通分public:fraction(){//构造函数}fractionadd(fraction);//两分数相加fractionsub(fraction);//两分数相减fractionmul(fraction);//两分数相乘fractiondiv(fraction);//两分数相除intdisplay(int,int);//显示分数voidsetvalue(int,int);//存储分数};//***********分数的约分*********//voidfraction::reduction(){inti,comdiv,small,max;if(abovebelow){small=above;max=below;}else{small=below;max=above;}for(i=small;i1;i--){if((small%i==0)&(max%i==0))break;}comdiv=i;//最大公约数if(i!=0){above/=i;below/=i;}}//*************分数的通分*************//fractionfraction::makeCommond(fractionfrac){intb1=below,b2=frac.below,m,s;if(b1b2){m=b1%b2;s=b2;}else{m=b2%b1;s=b1;}while(m0){intres=s%m;s=m,m=res;}intsmall=(b1*b2)/s;above=above*(small/below);frac.above=frac.above*(small/frac.below);below=small;frac.below=small;returnfrac;}//***************分数的相加*************//fractionfraction::add(fractionfr){fractionmyFraction;myFraction.above=above*fr.below+fr.above*below;myFraction.below=below*fr.below;myFraction.reduction();returnmyFraction;}//*********************分数的相减***************//fractionfraction::sub(fractionfr){fractionmyFraction;myFraction.above=above*fr.below-fr.above*below;myFraction.below=below*fr.below;myFraction.reduction();returnmyFraction;}//*******************分数的相乘****************//fractionfraction::mul(fractionfr){fractionmyFraction;myFraction.above=above*fr.above;myFraction.below=below*fr.below;myFraction.reduction();returnmyFraction;}//******************分数的相除***********//fractionfraction::div(fractionfr){fractionmyFraction;myFraction.above=above*fr.below;myFraction.below=below*fr.above;myFraction.reduction();returnmyFraction;}//*********************分数答案的输入判断*************//intfraction::display(inta,intb){if((a==above)&&(b==below)){cout正确endl;rights=rights+1;}else{cout错误endl;wrong=wrong+1;}returnrights,wrong;}//*******************分数的赋值****************//voidfraction::setvalue(intsj1,intsj3){above=sj1;below=sj3;}//*************无分数,无余数答案判断****************//intanswer(inta[],inti){intans;cout请输入答案:endl;cinans;if(ans==a[i]){cout正确endl;rights=rights+1;}else{cout错误endl;wrong=wrong+1;}returnrights,wrong;}//*************无分数,有余数答案判断****************//intanswer_1(inta[],inti,intb[]){intans,yushu;cout请输入商:endl;cinans;cout输入余数endl;cinyushu;if((ans==a[i])&&(yushu=b[i])){cout正确endl;rights=rights+1;}else{cout错误endl;wrong=wrong+1;}returnrights,wrong;}//*************产生带括号式子****************//voidcreate(intmaxn){if(!fout)//如果打开失败,outfile返回值{cerropenerror!endl;exit(1);}//首先随机生成算式中操作数的个数,其数量必须大于1intlengt;//式子长度do{lengt=rand()%8;}while(lengt2);booldiv=false;//用来防止出现除0错误intbrack_cnt=0;//记录未匹配的左括号个数llnum,op;for(inti=1;ilengt;i++)//循环生成算式{if(div)//若此时需要生成的数字前的负号是'/',则需要特判此次生成的数字不能为0{div=false;do{num=rand()%maxn;}while(num==0);coutnum;foutnum;}else{num=rand()%maxn;foutnum;coutnum;}//否则直接生成数字输出inttmpcnt=brack_cnt;for(intj=0;jtmpcnt;j++)//若当前有未匹配的左括号,则对每一个未匹配的左括号,都有一定概率生成相应右括号。{if((rand()%5)2)//生成右括号概率为0.6{brack_cnt--;fout);cout);}}op=rand()%4;//生成运算符foutOp[op];coutOp[op];if(op==3)//若生成了除号,则需要置相应标志位div=true;if(!(rand()%3))//以一定概率生成左括号,概率为1/3{fout(;cout(;brack_cnt++;num=rand()%maxn;//生成左括号后必须生成一个数字和运算符,不然可能出现(15)这样的错误foutnum;coutnum;op=rand()%4;foutOp[op];coutOp[op];if(op==3)div=true;}}if(div)//生成最后一个数字,该数字后不需要跟运算符{div=false;do{num=rand()%maxn;}while(num==0);foutnum;coutnum;}else{num=rand()%maxn;foutnum;coutnum;}while(brack_cnt--)//补全右括号{fout);cout);}cout=;foutendl;coutendl;}boolisNum(charx)//判断是否是数字{return(x='0'&&x='9');}boolisOp(charx)//判断是否是操作符{return(x=='+'||x=='-'||x=='*'||x=='/'||x=='('||x==')');}intpriority(charx)//返回一个操作符的优先级{if(x=='-'||x=='+')ret
本文标题:四则运算三c++
链接地址:https://www.777doc.com/doc-4021201 .html