第3章 结构化程序设计12-07 下载本文

博学谷——让IT教学更简单,让IT学习更有效

开始 判断条件1真真假 判断条件2执行语句1假执行语句2真??假??真判断条件n假执行语句n执行语句n+1结束

图3-12 if语句嵌套流程图

为了让初学者更好的理解if语句的嵌套使用,接下来通过一个案例来学习。如例3-5所示。 例3-5

1 void main() 2 { 3 4 5 6 7 8 9 10 11 12 13 14 15 }

int a, b;

printf(\请输入a,b的值\\n\

scanf(\函数从键盘输入数据 if (a != b) { } else

printf(\if (a > b)

printf(\printf(\

else

运行结果如图3-13所示。

图3-13 运行结果

11

博学谷——让IT教学更简单,让IT学习更有效

在例3-5中,实现了从键盘输入两个数,并比较其大小的功能。第6行中,,如果判断条件a!=b

不成立,就执行else下的代码打印a=b;如果a!=b成立,就执行第6行处if下的代码;第8行中,如果判断条件a>b成立,就打印a>b,否则打印a

3.4.3 switch条件语句

switch 条件语句也是一种很常用的选择语句,和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。例如,在程序中使用数字1~7来表示星期一到星期天,如果想根据某个输入的数字来输出对应中文格式的星期值,可以通过下面的一段伪代码来描述:

用于表示星期的数字

如果等于1,则输出星期一 如果等于2,则输出星期二 如果等于3,则输出星期三 如果等于4,则输出星期四 如果等于5,则输出星期五 如果等于6,则输出星期六 如果等于7,则输出星期天

如果不是1~7,则输出此数字为非法数字

对于上面一段伪代码的描述,大家可能会立刻想到用刚学过的if…else if…else语句来实现,但是由于判断条件比较多,实现起来代码过长,不便于阅读。这时就可以使用C语言中的switch语句来实现这种需求。在switch语句中,switch关键字后面有一个表达式,case关键字后面有目标值,当表达式的值和某个目标值匹配时,会执行对应case下的语句。接下来通过一段伪代码来描述switch语句的基本语法格式,具体如下:

switch (表达式) { }

case 目标值1:

执行语句1 break;

case 目标值2: ……

case 目标值n:

执行语句n break; 执行语句2 break;

default:

执行语句n+1 break;

在上面的语法格式中,switch语句将表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,就会执行相应case后的语句,否则执行default后的语句。关于switch语句中的break关键字将在后面的小节中做具体介绍,此处,读者只需要知道break的作用是跳出switch语句即可。

switch语句的流程图如图3-14所示。

12

博学谷——让IT教学更简单,让IT学习更有效

开始值1值2??值n执行语句1执行语句2执行语句n结束

图3-14 switch语句流程图

接下来通过switch语句来实现根据数字输出中文格式的星期,如例3-6所示。 例3-6

1 #include 2 void main() 3 { 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

int week = 5; switch (week) { case 1:

printf(\星期一\break;

case 2:

printf(\星期二\break;

case 3:

printf(\星期三\break;

case 4:

printf(\星期四\break;

case 5:

printf(\星期五\break;

case 6:

printf(\星期六\break;

case 7:

printf(\星期天\break;

default: }

printf(\输入的数字不正确...\break;

13

博学谷——让IT教学更简单,让IT学习更有效

32 }

运行结果如图3-15所示。

图3-15 运行结果

例3-6中,由于变量week的值为5,整个switch语句判断的结果满足第19行的条件,因此打印“星期五”。程序中的default语句用于处理和前面的case都不匹配的情况,将第4行代码替换为int week = 8,再次运行程序,输出结果如图3-16所示。

图3-16 运行结果

在使用switch语句的过程中,如果多个case条件后面的执行语句是一样的,则该执行语句只需书写一次即可,这是一种简写的方式。例如,使用数字1~7来表示星期一到星期天,当输入的数字为1、2、3、4、5时视为工作日,否则视为休息日,这时如果需要判断一周中的某一天是否为工作日,就可以采用switch语句的简写方式,具体如例3-7所示。

例3-7

1 #include 2 void main() 3 { 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

int week = 2; switch (week) { case 1: case 2: case 3: case 4: case 5:

//当 week 满足值 1、2、3、4、5 中任意一个时,处理方式相同 printf(\今天是工作日\\n\break;

case 6: case 7:

//当 week 满足值 6、7 中任意一个时,处理方式相同 printf(\今天是休息日\\n\break;

20 default:

21 printf(\输入数字不正确\ 22 23 24 }

}

break;

运行结果如图3-17所示。

14

博学谷——让IT教学更简单,让IT学习更有效

图3-17 运行结果

例3-7中,当变量week的值为1、2、3、4、5中任意一个值时,处理方式相同,都会打印“今天是工作日”。同理,当变量week值为6、7中任意一个值时,打印“今天是休息日”。

3.4.4 if语句与switch语句的异同

上一小节中例3-6和例3-7是用switch语句实现的,其实也可以用if语句来实现。既然if语句和switch语句都用于选择条件下,那么它们又有什么不同呢,本节就来为大家总结一下。

? switch结构语句只进行相等与否的判断;而if结构语句还可以进行大小范围上的判断。 ? switch无法处理浮点数,只能进行整数的判断,case标签值必须是常量;而if语句则可以

对浮点数进行判断。

如果纯粹是数字或字符的判断,最好是使用switch,因为它只会在一开始的switch括号中取出变量值一次,然后将这个值和下面所设定的case比较,但如果使用if,每次遇到条件式时,都要取出变量值,效率的差异就在这儿。当然并不是if结构语句就没有switch好,在遇到复合条件时,switch就帮不上忙了,由于无法在switch结构语句中组合复杂的条件语句,这时就得使用if了。

在实际程序开发中,具体如何来使用if和switch语句根据实际情况而定,尽量做到物尽其用,不要因为switch语句的效率高就一味的使用,也不要因为if语句常用就不应用switch语句。要根据实际的情况,具体问题具体分析,使用最适合的条件语句。从可读性和程序效率多方面综合考虑,适当搭配两种结构,方能写出高质量的代码。

3.5 循环结构语句

在实际生活中经常会将同一件事情重复做很多次,比如走路会重复使用左右脚,打乒乓球会重复挥拍的动作等。同样在C语言中,也经常需要重复执行同一代码块,这时就需要使用循环语句。循环语句分为while循环语句、do…while循环语句和for循环语句三种。本节将针对这三种循环语句分别进行详细地讲解。

3.5.1 while循环语句

while循环语句和3.3小节讲到的条件判断语句有些相似,都是根据判断条件来决定是否执行大括号内的执行语句。区别在于,while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会一直执行,直到条件不成立,while循环才会结束。while循环语句的具体语法格式如下:

while (循环条件) { }

执行语句 ………

在上面的语法格式中,{}中的执行语句被称作循环体,循环体是否执行取决于循环条件。当循环条件的值非0时,循环体就会被执行。循环体执行完毕时会继续判断循环条件,直到循环条件的

15