辅助判卷程序的一些小bug
首先谈一下,double类型
之前查过一些资料,double类型做==(相等)判断时候,会出现一些错误,及61.95与61.95不相等
对main函数中的部分加以改正,下面的answer为string类型,cal就是计算器类的对象
if(b){ //用户输入为小数形式 if(atof(answer.c_str())==cal.result) b=true; else b=false; }
这段代码就是获取用户输入的小数,与计算器类小数运算结果做比较,经过验证,发现基本都不对
if(b){ //用户输入为小数形式 char buf[10]; sprintf(buf,"%g",cal.result); string stemp=buf; if(answer==stemp) b=true; else b=false; }
这是经过改正的代码,就是将实数的比较转换为字符串的比较,这样就能实现正确的功能了
接下类是分数类的bug
当分数为负数时候,负号会出现在分子或者分母上,这导致了显示的不统一,也使得判断相等时出现了错误
对分数类的yuefen函数加以改正
void yuefen(){ int t; int a=fz; int b=fm; if (a < b) { t = a; a = b; b = t; } while (t = a % b) { a = b; b = t; } if(b!=1){ fz/=b; fm/=b; } }
这是原本的函数,负数不一定会出现在分子或者分母上,或者两者都会出现
void yuefen(){ int t; int a=fz; int b=fm; if (a < b) { t = a; a = b; b = t; } while (t = a % b) { a = b; b = t; } if(b!=1){ fz/=b; fm/=b; } if(fm<0){ fz=-fz; fm=-fm; } }
在结束的地方加入一个判断,即可解决问题
还有一个bug是用户输入分数结果时候,没有读取负号,导致读取结果失败
对main函数中的部分加以改正
else{ //用户输入为分数形式 stringstream sst(answer); int n1,n2; char c; sst>>n1>>c>>n2; if(c!='/'){ cout<<"输入非法"<<endl; } else{ fenshu f(n1,n2); if(f==cal.fresult) b=true; else b=false; } }
这是原本获取用户输入的分数结果部分
else{ //用户输入为分数形式 stringstream sst(answer); int n1,n2; char c; if(answer[0]=='-') sst>>c; sst>>n1>>c>>n2; if(c!='/'){ cout<<"输入非法"<<endl; } else{ if(answer[0]=='-') n1=-n1; fenshu f(n1,n2); if(f==cal.fresult) b=true; else b=false; } }
加入对负号的判断,以及读取,这样就能得到正确的结果了
最后,对程序显示部分的完善
if(b){ cout<<"答案正确"<<endl; zq++; } else{ cout<<"答案错误"<<endl; cal.printfanswer(); cw++; } cout<<endl; } cout<<"总共"<<zq+cw<<"道题,答对"<<zq<<"道,答错“<<cw<<"道";
将main函数结尾部分(in.close()之前)改成上述样子,并且,在开头定义变量int zq=0,cw=0;
这样就可以在完成全部题目后,显示具体信息