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

多重选择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嵌套语句详解)