5.3 多分支if语句
多分支if语句又称为“if-else语句”,是由关键字if和else构成的多分支结构语句。多分支控制语句可用于更加复杂的程序结构。
5.3.1 if-else语句的结构
if-else语句的一般形式为:
if(表达式) 语句段1 else 语句段2
if-else语句的执行规则为:若表达式的值为真(非0),则执行语句段1,否则进入else分支,执行语句段2,流程图如图5-4所示。
与简单的if语句类似,当语句段中只有一条语句时,可将语句直接放在if(表达式)的右边或下边,当语句段有多条语句时,应使用大括号封装。
这里我们约定,不论语句段包含几条语句,都使用大括号封装。即if-else语句的表达形式为:
图5-4 if-else语句流程图
if(表达式) { 语句段1 } else { 语句段2 }
范例5.2 CalculateAbstract.c
CalculateAbstract.c数学计算中,绝对值使用| |表示,但C语言中,计算数据的绝对值需要分析判断来实现。本范例从键盘输入参数a的值,然后利用if-else语句实现绝对值的计算,并打印信息显示数据符号是否发生了变化。(光盘\chat5\ CalculateAbstract.c)
01 #include<stdio.h> 02 main() 03 { 04 float a=0.0; 05 printf("请输入参数a的值:\n"); 06 scanf("%f", &a); //输入a的值 07 if(0>=a) //判断a是否小于0 08 { 09 a=-a; //a为负值,需要调整 10 printf("a的值已经改变,a=%f\n", a); //打印修改信息 11 } 12 else 13 { 14 printf("a不需要改变,a=%f\n", a); //打印无修改信息 15 } 16 }
程序第7行对输入的数据a进行判断,若小于0,则通过第9行将数据改为正值,否则,直接打印出结果和信息。
程序运行时由键盘输入数据-100,按回车键。
请输入参数a的值:
-100
输出结果为:
a的值已经改变, a= 100.000000
作者心得:
C语言也提供了标准库函数用于计算变量或表达式的绝对值,函数名称为abs(表达式),这是一个数学函数,因此使用该函数前应在文件头部包含头文件math.h。
5.3.2 if-else语句的应用
if-else语句在实际应用中非常广泛。实际生活中经常需要在是与非之间进行判断,如今天是星期天,则不用上班或上学,可以按照星期天的安排生活等。
范例5.3
JudgeOddorEven.c键盘输入int型参数a的值,判断其是否为偶数,若为偶数,则打印 a 为偶数信息;若为奇数,则打印为奇数信息。利用模除(%)判断 a 值是否为偶数,使用if-else分支语句实现不同信息的输出。(光盘\chat5\ JudgeOddorEven.c)
01 #include<stdio.h> 02 main() 03 { 04 int a=0; 05 printf("请输入参数a的值:\n"); 06 scanf("%d", &a); //输入变量a的值 07 if(0==a%2) //判断a是否为偶数 08 { 09 printf("a=%d是偶数\n", a); //偶数打印 10 } 11 else 12 { 13 printf("a=%d是奇数\n", a); //奇数打印 14 } 15 }
程序第7行使用模除运算判断输入的变量是否为偶数,若为偶数,就打印偶数信息;否则,执行else部分,打印奇数信息。
程序执行时由键盘输入数值-100,按回车键。
请输入参数a的值:
-100
输出结果为:
a = -100是偶数
通常,条件运算符也可以完成简单的条件判断,但并不适合完成多语句的条件判断,如前述章节对闰年的判断,这里重新使用if-else语句进行闰年的判断。
范例5.4 JudgeLeapYearorNotWithIfElse.c
JudgeLeapYearorNotWithIfElse.c键盘输入unsigned int型年份,判断其是否为闰年,若为闰年,则打印为闰年信息;若为平年,则打印为平年信息。闰年的判断方法是:若年数能被400整除,那么该年是闰年,若能被4整除但不能被100整除,该年是闰年,其他年份都是平年。(光盘\chat5\ JudgeLeapYearorNotWithIfElse.c)
01 #include<stdio.h> 02 main() 03 { 04 unsigned int year=0; 05 printf("请输入年份:\n"); 06 scanf("%d", &year); //输入年份 07 if((0==year%4&&0! =year%100)||0==year%400) //判断输入年份是否为闰年 08 { 09 printf("%d年是闰年\n", year); //打印闰年信息 10 } 11 else 12 { 13 printf("%d年是平年\n", year); //打印平年信息 14 } 15 }
程序第7行通过逻辑运算符和关系运算符实现了对闰年和平年的判断,表达式0==year%4&& 0!=year%100用于判断该年份是否能被4整除但不能被100整除,表达式0==year%400用于判断该年份是否能被400整除。
程序执行时由键盘输入年数2010,按回车键。
请输入年份:
2010
输出结果为:
2010年是平年
5.3.3 if-else-if语句的结构及应用
前面讲述的if语句一般都用于单分支或两个分支。当有多个分支选择时,可采用if-else-if语句,这种结构可实现多分支程序流程设计。
if-else-if类型结构语句的一般形式为:
if(表达式1) 语句段1; else if(表达式2) 语句段2; else if(表达式3) 语句段3; …… else if(表达式m) 语句段m; else 语句段n;
if-else-if的执行流程为:依次判断表达式的值,当出现某个值为真时,则执行if语句对应的语句段。然后跳出整个if语句,执行if-else-if语句之外的程序。如果所有的表达式均为假,则执行语句段n,其流程图如图5-5所示。
图5-5 if-else-if流程图
范例5.5 StudentScoreSet.c
StudentScoreSet.c学生成绩分为5个等级,分别为:
A: 90<=score<=100
B: 80<=score<90
C: 70<=score<80
D: 60<=score<70
E:score<60
键盘输入某学生成绩,判断其属于哪个等级,并打印到屏幕上。使用多分支if-else-if语句实现。
(光盘\chat5\ StudentScoreSet.c)
01 #include<stdio.h> 02 main() 03 { 04 unsigned int score=0; 05 printf("请输入学生成绩:\n"); 06 scanf("%d", &score); //输入学生成绩 07 if(90<=score&&score<=100) //判断是否为A级 08 { 09 printf("该学生成绩为A: %d\n", score); 10 } 11 else if(80<=score&&score<90) //判断是否为B级 12 { 13 printf("该学生成绩为B: %d\n", score); 14 } 15 else if(70<=score&&score<80) //判断是否为C级 16 { 17 printf("该学生成绩为C: %d\n", score); 18 } 19 else if(60<=score&&score<70) //判断是否为D级 20 { 21 printf("该学生成绩为D: %d\n", score); 22 } 23 else if(score<60) //判断是否为E级 24 { 25 printf("该学生成绩为E: %d\n", score); 26 } 27 else //错误输入 28 { 29 printf("输入错误ERROR: %d\n", score); 30 } 31 }
程序第7行if语句判断分数是否属于A级,若不属于,则转入11行判断是否属于B级,若仍然不属于,则顺次判断下去,直到找到属于的范围、级别为止。程序第27行else语句用于进行保护输出,即当输入的数据不属于任何级别时,输出错误信息。
程序执行时输入数据95,按回车键。
请输入学生成绩:
95
输出结果为:
该学生成绩为A: 95
if-else-if类型语句中,else只能与上面最近的一个if语句配对构成分支,并且,在该语句中可以没有else,这种类型的语句称为嵌套的if语句,下节将对该内容作详细介绍。if-else-if语句还可用于判断键盘输入的字符类型。
范例5.6 JudgeCharacterFromKeyboard.c
JudgeCharacterFromKeyboard.c使用getchar函数接收键盘输入的一个字符,并判断该字符类型,若输入为字母,则打印字母信息;若为数字,则打印数字信息;若为控制字符,则打印控制字符信息。(光盘\chat5\ JudgeCharacterFromKeyboard.c)
01 #include<stdio.h> 02 main() 03 { 04 char c; 05 printf("请输入字符:"); 06 c=getchar(); //键盘接收字符 07 if(c>='0' &&c<='9' ) //判断是否为数字 08 { 09 printf("这是一个数字:%c\n", c); 10 } 11 else if(c>=' A' &&c<=' Z' ) //判断是否为大写字母 12 { 13 printf("这是一个大写字母:%c\n", c); 14 } 15 else if(c>=' a' &&c<=' z' ) //判断是否为小写字母 16 { 17 printf("这是一个小写字母:%c\n", c); 18 } 19 else //其他字符处理 20 { 21 printf("这是一个非字母数字字符\n"); 22 } 23 }
程序第7行判断输入的字符是否为数字,程序第11行用于判断输入的字符是否为大写字母,程序第15行判断输入的字符是否为小写字母。
程序运行时输入6,按回车键。
请输入字符:6
输出结果:
这是一个数字: 6
这三种类型的判断没有先后顺序,也可以调整它们的判断顺序。例如将大写字母的判断放到最前面,读者可修改程序验证输出结果。