多重选择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++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
网友评论