欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

成为C++高手之while循环

程序员文章站 2022-10-23 08:10:51
我们的计算器还有好多问题,我们一个个解决。 本节解决用户输错就退出的问题。我们应该在用户输错时,提示并让其重新输入,如果一直错就一直提示,直到输对。用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)这一行。重新判断条件语句,如果为真就重入执行循环体。