美文网首页C语言C++编程学习C语言
C语言C++编程学习中多重选择else if嵌套语句详解

C语言C++编程学习中多重选择else if嵌套语句详解

作者: C语言学习 | 来源:发表于2018-05-06 14:51 被阅读0次

    多重选择else if

    在生活中,我们常常不只是在两个项目中做选择,会面对多个选择,这时候单单一个if else就不足够了。书中给出了一个计算电费的例子,电力公司在结算电费时,根据使用电的多少,不同区间的用电量,收取不同价格的电费。

    [cpp]view plaincopy

    /*electric.c -- 计算电费*/  

    #include   

    #define RATE1   0.{{13230:0}}           //首次使用360kwh的费率   

    #define RATE2   0.{{15040:0}}           //接着再使用108kwh的费率   

    #define RATE3   0.{{30025:0}}           //接着再使用252kwh的费率  

    #define RATE4   0.{{34025:0}}           //使用超过720kwh的费率  

    #define BREAK1  360.0             //费率的第1个分界点   

    #define BREAK2  468.0             //费率的第2个分界点    

    #define BREAK3  720.0             //费率的第3个分界点   

    #define BASE1   (RATE1 * BREAK1)  

    //使用360kwh的费用  

    #define BASE2   (BASE1 + (RATE2 * (BREAK2 - BREAK1)))   

    //使用468kwh的费用  

    #define BASE3   (BASE1 + BASE2 + (RATE3 * (BREAK3 - BREAK2)))  

    //使用720kwh的费用  

    int main(void)  

    {  

    double kwh;                     //使用的千瓦时   

    double bill;                    //电费  

    printf("Please enter the kwh used.\n");  

    scanf("%lf", &kwh);  

    if(kwh <= BREAK1){  

            bill = RATE1 * kwh;  

        }   

    else if(kwh <= BREAK2){  

    bill = BASE1 + (RATE2 * (kwh - BREAK1));//360-468kwh   

        }  

    else if(kwh <= BREAK3){  

    bill = BASE2 + (RATE3 * (kwh - BREAK2));//468-720kwh  

        }  

    else{  

            bill = BASE3 + (RATE4 * (kwh - BREAK3));  

        }  

    printf("The charge for %.lf kwh is $%1.2lf .\n", kwh, bill);  

    return 0;  

    }  

    Please enter the kwh used.

    580

    The charge for 580 kwh is $97.50 .

    在这个程序中,这里符号常量表示不同的费率和费率分界点,虽然在打程序的时候感觉很繁琐,但是在应用时,如果要修改数据就会很方便。这里还是要推荐下小编的C/C++学习裙:‘’六二七,零一二,四六四‘’不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2018最新的C/C++资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑

    程序根据kwh的值来选择计算公式,且只会选择一个。当kwh>=360时,程序只会达到第一个else,以此类推其他的值;当kwh  超过720时才会执行最后一个else。

    从使用的语句上看,这里的else if其实是if else的变式,如下

    [cpp]view plaincopy

            if(kwh <= BREAK1){  

            bill = RATE1 * kwh;  

        }   

    else   

    if(kwh <= BREAK2){  

    bill = BASE1 + (RATE2 * (kwh - BREAK1));//360-468kwh   

            }  

    else   

    if(kwh <= BREAK3){  

    bill = BASE2 + (RATE3 * (kwh - BREAK2));//468-720kwh  

                }  

    else{  

                    bill = BASE3 + (RATE4 * (kwh - BREAK3));  

                }  

    也就是说程序有一个if else组成,其中包含了一个if else,在其中又包含第三个。换句话说就是第三个if else嵌套在第二个if else中,第二个if else嵌套在第一个if else中,就形成了上面的样子。整个if else被视为一条语句,因此不必用花括号括起来,但括起来会使程序更清楚,增强可读性。

    if else语句有时候并不会用到else,那么问题就来了,

    [cpp]view plaincopy

    if (number > 6)  

    if (number > 12){  

    printf("You are close!");  

    else  

    printf("Sorry, you lose a turn !\n");  

    这样的情况else和那个if配对?

    根据规则,如果没有用花括号括起来,那么else就会和距离它最近的if配对,答案很明显是第二个if了

    [cpp]view plaincopy

    if (number > 6){  

    if (number > 12){  

    printf("You are close!");  

        }  

    else  

    printf("Sorry, you lose a turn !\n");  

    这样写else就和第一个if配对了。

    诸如此类的if else应用,书中还有一节标题为多重嵌套的 if 语句使用的是判断素数的例子。

    多重嵌套的 if 语句

    在写代码之前要先做好规划。首先,要总体设计程序。为了方便起见程序应该设计一个循环,让用户能够联系输入待测数据。这样测试一个新数据是不用重启程序。下面是书上给出的模型(伪代码):

    提示用户输入数据

    当scanf( )返回值为1

    分析该数字并报告结果

    提示用户继续输入

    在测试条件中使用scanf( )返回值已经使用过多次了,把读取数字和判断测试条件确定是否结束循环结合在一起。

    接下来需要考虑如何实现找出约数,也许最直接的方法是

    [cpp]view plaincopy

    for (div = 2; div < num; div++){  

    if (num % div == 0){  

    printf("%d is divisible by %d\n", num, div);  

        }  

    }  

    该循环检测2 — num之间的所有数字,测试它们是否能被num整除。但是,这个方法有点浪费时间。我们可以改进一下。例如,如果144%2得0,说明2是144的约数;如果144除以2得72,那么72也是144的一个约数。所以,num % div测试成功可以获得两个约数。为了弄清其中的原理,我们分析一下循环中得到的成对约数:2和72、3和48、4和36、6和24、8和18、9和16、12和12、16和9、18和8,等等。在12和12这对约数后,又开始得到已找到的相同约数(次序相反)。因此,不用循环到143,在达到12以后就可以停止循环。这大大的节省了循环时间!

    分析后发现,必须测试的数只要到num的平方根就可以了,不用到num。对于9这样的数字,不会节省很多时间,但对{{10000:0}}这样的数,使用哪一种方法求约数差别很大。不过,我们不用在程序中计算平方根,可以这样编写测试条件:

    [cpp]view plaincopy

    for (div = 2; (div * div) <= num; div++){  

    if(num % div == 0){  

    printf("%lu is divisible by %lu and %lu.\n", num, div, num / div);  

        }  

    }  

    如果num是144,当div = 12时停止循环。如果num是145,当div = 13是停止循环。

    不使用平方根而用这样的测试条件,有两个原因。其一整数乘法比求平方根块;其二,我们还没有正式介绍平方根函数。

    还要解决两个问题才能准备编程。

    第一个问题,如果待测试的数是一个完全平方数怎么办?报告144可以被12和12整除显得有些傻。可以使用嵌套if语句测试div是否等于num/div。如果是,程序只打印一个约数:

    [cpp]view plaincopy

    for (div = 2, isPrime = true; (div *div) <= num; div++){  

    if (num % div == 0){  

    if((div *div) != num) {  

    printf("%lu is divisible by %lu and %lu.\n", num, div, num / div);  

                    }  

    else{  

    printf("%lu is divisible by %lu.\n", num, div);  

                    }  

    isPrime =false;        //该数不是素数   

                }  

            }  

    第二个问题,如何知道一个数是素数?如果num是素数,程序流不会进入if语句。要解决这个问题,可以在外层循环把一个变量设置为某个值,然后在if语句中把该变量设置为0 。循环完成后,检查该变量是否为一,如果是,说明没有进入if语句,那么该是就是素数。这样的变量,常称为标记(flag)。

    为扩大程序的应用范围,程序用long类型,而不是int类型。

    [cpp]view plaincopy

    /*divisors.c -- 使用嵌套if语句显示一个数的约数*/  

    #include   

    #include   

    int main (void)  

    {  

    unsignedlong num;    //待测试的数  

    unsignedlong div;    //可能的约数  

    bool isPrime;         //素数标记   

    printf("Please enter an integer for analysis;\n");  

    printf("Enter q to quit.\n");  

    while(scanf("%lu", &num) == 1){  

    for (div = 2, isPrime = true; (div *div) <= num; div++){  

    if (num % div == 0){  

    if((div *div) != num) {  

    printf("%lu is divisible by %lu and %lu.\n", num, div, num / div);  

                    }  

    else{  

    printf("%lu is divisible by %lu.\n", num, div);  

                    }  

    isPrime =false;        //该数不是素数   

                }  

            }  

    if(isPrime){  

    printf("%lu is prin=me.\n");  

            }  

    printf("Please enter another integer for analysis;\n");  

    printf("Enter q to quit.\n");  

        }   

    printf("Bey.\n");  

    return 0;  

     }    

    测试一下:

    Please enter an integer for analysis;

    Enter q to quit.

    {{123456789:0}}

    {{123456789:0}} is divisible by 3 and {{41152263:0}}.

    {{123456789:0}} is divisible by 9 and {{13717421:0}}.

    {{123456789:0}} is divisible by 3607 and {{34227:0}}.

    {{123456789:0}} is divisible by 3803 and {{32463:0}}.

    {{123456789:0}} is divisible by {{10821:0}} and {{11409:0}}.

    Please enter another integer for analysis;

    Enter q to quit.

    {{48563:0}}

    {{48841:0}} is prime.

    Please enter another integer for analysis;

    Enter q to quit.

    q

    Bey.

    小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    相关文章

      网友评论

        本文标题:C语言C++编程学习中多重选择else if嵌套语句详解

        本文链接:https://www.haomeiwen.com/subject/lyrurftx.html