辅助判卷程序的一些小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;

这样就可以在完成全部题目后,显示具体信息

posted @ 2016-03-12 17:34  13070035王辰成  阅读(155)  评论(0编辑  收藏  举报