成为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++高手之宏与枚举

时间: 2024-10-04 11:50:14

成为C++高手之while循环的相关文章

成为C++高手之for循环

再求平均值 上一节的求平均值的函数average()看起来还有问题,如果我的数组中不是10个元素,那这个函数就不能用了.怎么让它更通用呢?我们可以不把数组元素数固定死,而是把元素数作为另外一个参数传进去,函数再计算和的话,就需要用for循环了. #include <stdio.h> //前置声明 float average(int numbers[],int number_count); //入口函数 int main(int argc, char *argv[]) { //定义一个数组,给1

成为C++高手之回调函数

上一节的排序函数只能正向排序,那我们需要反向排序怎么办?可以增加一个参数嘛,传入TRUE,就表示要正向排,传入FALSE,就表示要反向排.要改变排序方向,只需改变两项比较时是用大于号还是小于号即可.但是这里有更高级的玩法,即传入的参数不是一个BOOL型值,而是一个函数指针. 函数名本身就是一个指针,调试时看函数名,其值就是一个地址.但在逻辑上不能把函数名叫函数指针,必须另创建一个指针指向这个函数,通过这个指针调用函数才叫回调. 函数指指与变量指针没实质区别,都是保存一个表示内存位置的整数,但编译

成为C++高手之最终版计算器

下面做我们的计算器最终版. 当前还存在的问题是用户只能算一次.如果有人买一个一次性计算器,那么他肯定是个土豪.我们的计算器不能只给土豪用,所以要改成可以反复使用的. 使用循环语句就可以了,但是循环哪些代码呢?从用户输入到打印出结果这个过程要反复执行,代码如是: enum OPT{ jia = 1, jian, cheng, chu }; int main(void) { //保存用户输入的数 int number1; int number2; int opt;//运算符 //循环从输入到输出结果

登陆和注册总结

#import "ViewController.h" #define USERNAME @"nameTextField" #define PASSWORD @"pswTextField" @implementation ViewController @synthesize recordBtn; @synthesize cellRightArray; - (void)didReceiveMemoryWarning { [super didRecei

Python从菜鸟到高手(10):循环

  我们现在已经知道了如何使用if语句让程序沿着不同的路径执行,不过程序最大的用处就是利用CPU和GPU强大的执行能力不断重复执行某段代码,想想Google的AlphaGo与柯洁的那场人机大战,尽管表面上是人工智能的胜利,其实人工智能只是算法,人工只能算法之所以会快速完成海量的数据分享,循环在其中的作用功不可没.   对于初次接触程序设计的读者,可能还不太理解循环到底什么东西.下面先看一下循环的伪代码. 查看银行卡余额 没有发工资,等待1分钟,继续执行1 Oh,yeah,已经发工资了,继续执行4

[Js高手之路第一部]JavaScript上百例实战【新版】_8 javascript二重循环,break与continue语句

输出5行5列的表格 使用二重循环实现 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style> 7 table { 8 /*合并单元格之间的线*/ 9 border-collapse: collapse; 10 } 11 th,t

[Js高手之路第一部]JavaScript上百例实战【新版】_9 javascript二重循环乘法表与n行n列的表格

0.隔行变色的表格 HTML style 属性实现 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style> 7 table { 8 /*合并单元格之间的线*/ 9 border-collapse: collapse; 10 }

高手帮看下代码循环

x3wni5ylji烤访妹躺范扯飞倜蔽霸<http://weibo.com/p/230927987375575704276992> zg9i6ktqlp投换朔峡烙姆问老股囟<http://weibo.com/p/230927987376985032368128> h083r338pi又巫谙衙哉踪隙迷痘拇<http://weibo.com/p/230927987375568183894016> z77w62jmve白谡毁潞糙揽毓突纬晌<http://weibo.co

bat(续七)-for语句(循环结构)

for语句(循环结构) for语句可以实现类似于C语言里面的循环结构,当然for语句的功能要更强大一点,通过不同的开关可以实现更多的功能.for语句有多个开关,不同开关将会实现不同的功能. 1.无开关 无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句.其命令格式为: FOR %%variable IN (set) DO command 其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%):set就是需要我们设定的循