在上一篇文章中,我们简单的了解了if的嵌套写法。
而与if类似,循环等结构同样是可以进行嵌套的,前提的你的写法符合语法
在今天的文章中,我们将继续看到if的嵌套,同时还会有while的嵌套。
首先问一个问题,你有没有坐过出租车?
大多数人的回答肯定是有呀!
那么你应该知道,出租车的计费方式是和路程等有关的。通常有一个起步价,在一定距离内,不管跑了多远都是一个价格。
当超过一定距离时将按照其他的方式收费。
今天我们就来写一个“出租车”计费的程序,输入车开的距离,算出我们需要支付的价格。
当然收费的方法是少不了的,假设某市的出租车起步价为6元,在2km内只收起步价;超出2km的,在小于10km的部分按照1.5元/km收费,大于10km的按照1元/km收费。
请首先自己尝试写出这个程序!
下面给出一个可行的例子
#include <stdio.h> #include <stdlib.h> #define FLAG_DOWN_FARE 6 //起步价6元 #define INITIATE_DISTANCE 2 //起步距离为2km #define RATE_LESS_THAN_10 1.5 //小于10km部分的费率 #define RATE_MORE_THAN_10 1 //大于10km部分的费率 int main() { double total= 0; //总价 double distance = 0; //当然是路程了 scanf("%lf", &distance); //输入总价 if(distance <= INITIATE_DISTANCE) { total = FLAG_DOWN_FARE; //小于起步距离,则只用支付起步价 } else { if(distance <= 10.0) { total = FLAG_DOWN_FARE + (distance - INITIATE_DISTANCE) * RATE_LESS_THAN_10; } else { total = FLAG_DOWN_FARE + (10.0 - INITIATE_DISTANCE) * RATE_LESS_THAN_10 + (distance - 10.0) * RATE_MORE_THAN_10; } } printf("Total: %.2f\n", total); //输出总价 return 0; }
在这个程序中,我们将起步价,费率等数字使用了宏常量的方式来替代,这是一个好的习惯。
在编程中,我们将那些直接写在源代码中的数字称为魔术数字(magic number,也译为幻数)
例如上面的代码中用于if判断的10.0就是一个魔术数字。之所以这样称呼它,是因为这样的数字较难直接看出他的含义,当别人阅读你的源代码,或者等你过一年后再去阅读你编写的源代码时,很可能完全无法弄清楚这个数字的含义!到时候你就真的只能盯着屏幕哈气了,然后感叹一句“至少程序还能用,真是一个魔术般的数字!”
使用了宏,则大大增加了程序的可读性,因此我们应该尽量减少在编程中使用魔术数字。
同样,这个程序还能写成下面这个样子:
if(distance <= INITIATE_DISTANCE) total = FLAG_DOWN_FARE; //小于起步距离,则只用支付起步价 else if(distance <= 10.0) total = FLAG_DOWN_FARE + (distance - INITIATE_DISTANCE) * RATE_LESS_THAN_10; else total = FLAG_DOWN_FARE + (10.0 - INITIATE_DISTANCE) * RATE_LESS_THAN_10 + (distance - 10.0) * RATE_MORE_THAN_10;
这个程序较为简单,我们便不再多做分析
下面我们来试一下while循环的嵌套:写一个输出0-100的素数的程序
不用我多说,你应该知道素数是什么(它的另一个称呼是质数),当前人类还没有找到一个特定的公式用于直接判断一个数是否是一个素数,唯一的方法是一个个去试,如果它无法被除自身和1以外的数整除,那么它就是一个素数。
请试着写出代码
#include <stdio.h> #include <stdlib.h> int main() { int i = 3; int j = 2; printf("2\n"); //因为2不在循环中,因此要单独输出 while(i <= 1000) { while(j < i) { if(i % j == 0) //说明被小于自身的数整除了,因此不是素书,直接跳出此层循环 break; ++j; } if(i == j) //如果两个数相等,说明无法被小于自身的数整除,因而是素书 printf("%d\n", i); ++i; j = 2; //将除数重新设为2 } return 0; }
这是一个例子,虽然它可以执行,也向我们展示了while嵌套,但是这不是一个较好的答案,因为此程序效率比较低
请自行思考如何修改这个程序使他的效率提高?
关于效率和算法的问题,我们将在后面专门的地方讨论
好了,关于嵌套的问题我们就讲到这里,剩下的就是等你去练习掌握了!