成为C++高手之while循环

我们的计算器还有好多问题,我们一个个解决。

本节解决用户输错就退出的问题。我们应该在用户输错时,提示并让其重新输入,如果一直错就一直提示,直到输对。用while循环语句做比较合适,如下:

   //提示用户输入第一个数,需循环直到用户输入正确的数:
    int r;
    while(1){
        printf("请输入第一个数:\n");
        r = scanf("%d",&number1);
        //查看Scanf是否收到了正确的数
        if(r==0){
            printf("别调皮,这样不好玩,我走了\n");

            //清空输入流。如果没有这一句,输入流中残存的字符将导致scanf不等待用户输入。
            int c;
            while ( (c = getchar()) != '\n' && c != EOF ) ;
        }else{
            //输对了,跳出循环
            break;
        }
}

这段代码会造成用户输错时,一直循环,重新让用户输入,直到输对才停止循环。

每次执行完循环体(就是大括号内的代码),都会回到while(1),重新检查条件,如果条件为真就再次进入循环体执行。while(1)这行,小括号里跟if语句一样,是条件,如果是真就执行大括号里的代码。这里永远是1,1就是是真,所以永远执行大扩号里的代码,也就是永远执行循环体。直到用户输对了,执行break时,才跳出了循环。注意是从break处直接跳出循环,break后面的代码不再执行。

while ( (c = getchar()) != ‘\n’ && c != EOF ) ; 这一句是为了清空输入流,如果用户输入的不是数字,那么其实scanf没有从输入流中将字取出,导致下一次再用scanf取时,直接返回0而不是等待用户输入。这种写法是跨平台通用的,用fflush(stdin)清空的话只能在windows下使用。

添加对第二个数和运算符的处理后,main函数是这样的:

int main(void)
{
    //保存用户输入的数
    int number1;
    int number2;
    int opt;//运算符

    //提示用户输入第一个数,需循环直到用户输入正确的数:
    int r;
    while(1){
        printf("请输入第一个数:\n");
        r = scanf("%d",&number1);
        //查看Scanf是否收到了正确的数
        if(r==0){
            printf("别调皮,这样不好玩,重来\n");

            //清空输入流。如果没有这一句,输入流中残存的字符将导致scanf不等待用户输入。
            int c;
            while ( (c = getchar()) != '\n' && c != EOF ) ;
        }else{
            //输对了,跳出循环
            break;
        }
    }

    //提示用户输入第二个数
    while(1){
        printf("请输入第二个数:\n");
        r = scanf("%d",&number2);
        //查看Scanf是否收到了正确的数
        if(r==0){
            printf("别调皮,这样不好玩,重来\n");

            //清空输入流。如果没有这一句,输入流中残存的字符将导致scanf不等待用户输入。
            int c;
            while ( (c = getchar()) != '\n' && c != EOF ) ;
        }else{
            //输对了,跳出循环
            break;
        }
    }

    int result;//存放计算结果

    //提示用户输入运算符
    while(1){
        printf("请输入运算符(%d%d%d%d分别对应加减乘除):\n",jia,jian,cheng,chu);
        r = scanf("%d",&opt);
        if(r==0){
            printf("运算符也是数字,别搞错好吗?你这样让我怎么混? 重新输入吧\n");

            //清空输入流。如果没有这一句,输入流中残存的字符将导致scanf不等待用户输入。
            int c;
            while ( (c = getchar()) != '\n' && c != EOF ) ;

            //回到循环开始
            continue;
        }


        //跟据运算符进行不同的运算
        switch(opt){
        case jia:
            //加
            result = number1+number2;
            break;
        case jian:
            //减
            result = number1-number2;
            break;
        case cheng:
            //乘
            result = number1*number2;
            break;
        case chu:
            //除,现在只能整除
            result = number1/number2;
            break;
        default:
            printf("运算符必须是1,2,3,4之一才行!重来\n");
            continue; //回到循环开始,重新来一遍
        }

        //当执行到这里时,说明运算符检查成功,应跳出while。
        break;
    }
    //输出结果
    printf("result : %d\n",number1,number2,result);
    return 0;
}

可以看到一个新东西:continue ,其作用是跳回到循环的开始,也就是while(1)这一行。重新判断条件语句,如果为真就重入执行循环体。

以上是我们的计算器程序第6版。
上一篇:成为C++高手之宏与枚举
下一篇:成为C++高手之最终版计算器

猜你喜欢

转载自blog.csdn.net/nkmnkm/article/details/51391980