第三部分 C语言的结构语句第 4章 选择结构
4.1 if 语句
4.1.1 单分支 if语句它的一般格式如下:
if(表达式) 语句;
说明:对条件表达式进行判断,若其值为
“真(非 0)”时执行语句,若其值为“假
( 0)”时则跳过语句。其执行过程见流程图
4.1。
例如:设定学生成绩 60分为及格分数线,用单分支 if语句描述为:
if ( grade > = 60 )
printf (,passed\n,) ;
又如,x大于 y就输出 x,用单分支 if语句描述为:
if ( x > y )
printf (,%d,,x ) ;
4.1.2 双分支 if语句
它的一般格式如下:
if (表达式 ) 语句 1;
else 语句 2;
说明:与单分支 if语句不同的是在条件为“真
(非 0)”或“假( 0)”时执行指定的不同的操作。对条件表达式进行判断,若其值为
“真(非 0)”时,就执行语句 1;若其值为
“假( 0)”时,就执行语句 2。其执行过程见流程图 4.2。
例如:给学生成绩划分:成绩大于或等于 60
分时输出,passed”,成绩小于 60分时输出
,failed”。用双分支 if语句描述为:
if ( grade > = 60 )
printf (,passed\n,) ;
else
printf (,failed\n,) ;
在前面的章节还提到过与 if / else结构密切相关的条件运算符?:,它是 C语言中唯一的三目运算符(即有三个操作数)。对上面的两例用条件运算符改写为:
grade > = 60? printf (,passed\n,),printf
(,failed\n,) ;
x > y? printf (,%d,,x ),printf (,%d,,y ) ;
由此说明适当的语句修改条件运算符可以完成 if / else结构相同的功能。
说明:
1.对于单分支和双分支 if后面的“表达式”,一般为逻辑表达式或关系表达式,事实上表达式的类型不限于此,可以是任意的数值类型(包括整型、实型、
字符型、指针型数据)。只要表达式的值为非 0,
就认为它为真;只要表达式的值为 0,就认为它为假。
例如,if ( 6 ) printf (,passed\n,) ;
if (?A? ) printf (,%d,,?A? ) ;
这些都是合法的 if语句。
2.对于双分支 if语句,else子句不能作为语句单独使用,它必须是 if语句的一部分,与 if配对使用。
3.if语句后面的表达式之后不能增加分号,同时注意语句后面的分号不能遗漏。
4.在 if和 else后面可以只包括一个内嵌的操作语句,
也可以包括多个操作语句,此时务必用,{}”将几个语句括起来成为一个复合语句。
例如,if ( x > 100 )
{ x-- ; s=+x ; }
else
{ x++ ; s=+x ; }
此时又要注意:在,{}”后面不能再添加分号,因为
,{}”内是一个完整的复合语句,不需要再添加分号。
4.1.3 多分支 if语句
对于解决判断多个条件的问题,可以使用 if语句的嵌套,即在 if语句中又包括一个或多个 if语句。它的一般格式如下:
if (表达式 1)
语句 1;
else if (表达式 2)
语句 2;
else if (表达式 3)
语句 3;
┆
else if (表达式 m)
语句 m;
else
语句 n;
说明:开始执行该结构后,便依次去对多个条件进行判断测试,符合某一条件,则转去执行该条件下的操作,其它部分将被跳过;
如果无一条件为“真(非 0)”,就执行最后一个 else所指定的操作,这个 else可以看作
“其它情形”。应当特别注意 if与 else的匹配关系:规则是从最内层开始,else总是与它上面最近的(未曾配对的) if配对。其执行过程见流程图 4.3。
【 例 4-1】 编程实现给一百分制成绩,要求输出成绩等级‘ A?、‘ B?、‘ C?、‘ D?、‘ E?。
90分以上为‘ A?等,89~ 80分为‘ B?等,
79~ 70分为‘ C?等,69~ 60分为‘ D?等,60
分以下为‘ E?等。
【 源程序 】
main( )
{
int grade;
printf ( "input the grade:");
scanf ("%d",&grade);
if (grade>=90)
printf("A\n");
else if(grade>=80)
printf("B\n");
else if(grade>=70)
printf("C\n");
else if(grade>=60)
printf("D\n");
else
printf("E\n");
}
4.2 switch语句
4.2.1 switch语句
对于解决实际生活中例如人口统计分类、工资统计分类、银行存款分类等等的多分支选择问题,采用多分支 if语句(即 if语句的嵌套)
来处理固然可以,但是如果分支较多,则嵌套的 if语句层数多,程序冗长而且会导致可读性降低。 C语言提供了直接处理多分支选择的 switch语句,它的一般格式如下:
switch ( 表达式 )
{
case 常量表达式 1:语句 1;
case 常量表达式 2:语句 2;
┆
case 常量表达式 n:语句 n;
default,语句 m;
}
说明:其执行过程为进入 switch结构后,根据表达式的值从上到下去找与其相匹配的 case,以此作为入口,执行其后面的各语句。
对 【 例 4-1】 用 switch语句改写如下:
【 源程序 】
main( )
{
int grade;
printf("input the grade:");
scanf("%d",&grade);
switch(grade/10)
{
case 10:
case 9,printf("A\n");
case 8,printf("B\n");
case 7,printf("C\n");
case 6,printf("D\n");
default,printf("E\n");
}
}
【 运行结果 】
input the grade:98
A
B
C
D
E
说明:此时的结果并不是我们所希望得到的,也就是说根据 switch后面表达式的值找到了相匹配的
case分支后,就以此为入口执行后面的所有语句,
而不再进行判断了。其流程图如图 4.5。
4.2.2 break语句在 switch结构中的运用
为了正确使用 switch结构从多种结果中选择一种结果的功能,我们可以运用前面学过的
break语句来达到此目的。对流程图 4.5修改如下如图 4.6:
【 源程序 】
main( )
{
int grade;
printf("input the grade:");
scanf("%d",&grade);
switch(grade/10)
{
case 10:
case 9,printf("A\n");break;
case 8,printf("B\n");break;
case 7,printf("C\n");break;
case 6,printf("D\n");break;
default,printf("E\n");break;
}
}
说明:
1,switch结构的执行部分是一个由一些 case
子句和一个可缺省的 default子句组成的复合语句,特别注意要用一对,{}”括起来。
2,switch后面的表达式一般是整型表达式或字符型表达式,与之相对应的 case后面的常量表达式也应是一个整型表达式或字符型表达式,但要注意 case与常量表达式之间要有空格。例如,case 6+9,printf(,ok” ) ;是合法的。
3.在执行 switch语句时,根据其后表达式的值找相匹配的 case子句,要注意,case 常量表达式”只是起语句标号的作用,并不是在该处进行条件判断。当找到相匹配的 case子句即入口标号时,就从此标号开始执行后面的语句。因此,应该在执行一个 case子句后必须增加一条间断语句 break来使流程跳出
switch结构。如果未找到相匹配的 case子句就执行 default子句,若 default子句放在最后其后可以不加 break语句。
4.各个 case子句出现的次序对执行结果没任何影响,即顺序可以任意布局。
5.每一个 case能够拥有一条或多条语句,其最大的不同之处在于使用多条语句时不需要用,{}”括起来。
6.多个 case可以共用一组执行语句。例如:
┆
case?A?:
case?a?,++count ; break ;
┆
成绩为大写字母 A或小写字母 a都进行累加求和。
7,switch结构中的 case子句中的常量表达式的值不允许相同。
8,switch结构允许嵌套。
4.3 实例解析
【 例 4-2】 从键盘输入三个整数 a,b,c,输出最大的一个。
【 编程思路 】
分析:可以先找出 a与 b之间的较大者,然后再将这个较大者与 c比较找出较大者,则此数即为三个数中的最大数。
【 源程序 】
解法 1:
main()
{
int a,b,c;
printf("input a,b,c:");
scanf("%d,%d,%d",&a,&b,&c);
printf("the max is,%d
\n",c>((a>b)?a:b)?c:((a>b)?a:b));
}
解法 2:
main( )
{
int a,b,c,max;
printf("input a,b,c:");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b)
if(a>c)
max=a;
else
max=c;
else
if(b>c)
max=b;
else
max=c;
printf("the max is,%d \n",max);
}
4.4 本章小结
本章主要介绍了 if语句和 switch语句这两中分支语句。 if语句它又包括了三种类型:单分支
if语句、双分支 if语句和多分支 if语句(即 if语句的嵌套),特别注意在 if语句的嵌套中 if和
else的匹配关系; switch语句主要用于对单条件进行测试,从其多种结果中取一种的情形,
要注意在其 case分支语句中使用间断语句
break语句。在实际运用中,应根据具体的情况灵活使用这两种语句来解决问题。
4.1 if 语句
4.1.1 单分支 if语句它的一般格式如下:
if(表达式) 语句;
说明:对条件表达式进行判断,若其值为
“真(非 0)”时执行语句,若其值为“假
( 0)”时则跳过语句。其执行过程见流程图
4.1。
例如:设定学生成绩 60分为及格分数线,用单分支 if语句描述为:
if ( grade > = 60 )
printf (,passed\n,) ;
又如,x大于 y就输出 x,用单分支 if语句描述为:
if ( x > y )
printf (,%d,,x ) ;
4.1.2 双分支 if语句
它的一般格式如下:
if (表达式 ) 语句 1;
else 语句 2;
说明:与单分支 if语句不同的是在条件为“真
(非 0)”或“假( 0)”时执行指定的不同的操作。对条件表达式进行判断,若其值为
“真(非 0)”时,就执行语句 1;若其值为
“假( 0)”时,就执行语句 2。其执行过程见流程图 4.2。
例如:给学生成绩划分:成绩大于或等于 60
分时输出,passed”,成绩小于 60分时输出
,failed”。用双分支 if语句描述为:
if ( grade > = 60 )
printf (,passed\n,) ;
else
printf (,failed\n,) ;
在前面的章节还提到过与 if / else结构密切相关的条件运算符?:,它是 C语言中唯一的三目运算符(即有三个操作数)。对上面的两例用条件运算符改写为:
grade > = 60? printf (,passed\n,),printf
(,failed\n,) ;
x > y? printf (,%d,,x ),printf (,%d,,y ) ;
由此说明适当的语句修改条件运算符可以完成 if / else结构相同的功能。
说明:
1.对于单分支和双分支 if后面的“表达式”,一般为逻辑表达式或关系表达式,事实上表达式的类型不限于此,可以是任意的数值类型(包括整型、实型、
字符型、指针型数据)。只要表达式的值为非 0,
就认为它为真;只要表达式的值为 0,就认为它为假。
例如,if ( 6 ) printf (,passed\n,) ;
if (?A? ) printf (,%d,,?A? ) ;
这些都是合法的 if语句。
2.对于双分支 if语句,else子句不能作为语句单独使用,它必须是 if语句的一部分,与 if配对使用。
3.if语句后面的表达式之后不能增加分号,同时注意语句后面的分号不能遗漏。
4.在 if和 else后面可以只包括一个内嵌的操作语句,
也可以包括多个操作语句,此时务必用,{}”将几个语句括起来成为一个复合语句。
例如,if ( x > 100 )
{ x-- ; s=+x ; }
else
{ x++ ; s=+x ; }
此时又要注意:在,{}”后面不能再添加分号,因为
,{}”内是一个完整的复合语句,不需要再添加分号。
4.1.3 多分支 if语句
对于解决判断多个条件的问题,可以使用 if语句的嵌套,即在 if语句中又包括一个或多个 if语句。它的一般格式如下:
if (表达式 1)
语句 1;
else if (表达式 2)
语句 2;
else if (表达式 3)
语句 3;
┆
else if (表达式 m)
语句 m;
else
语句 n;
说明:开始执行该结构后,便依次去对多个条件进行判断测试,符合某一条件,则转去执行该条件下的操作,其它部分将被跳过;
如果无一条件为“真(非 0)”,就执行最后一个 else所指定的操作,这个 else可以看作
“其它情形”。应当特别注意 if与 else的匹配关系:规则是从最内层开始,else总是与它上面最近的(未曾配对的) if配对。其执行过程见流程图 4.3。
【 例 4-1】 编程实现给一百分制成绩,要求输出成绩等级‘ A?、‘ B?、‘ C?、‘ D?、‘ E?。
90分以上为‘ A?等,89~ 80分为‘ B?等,
79~ 70分为‘ C?等,69~ 60分为‘ D?等,60
分以下为‘ E?等。
【 源程序 】
main( )
{
int grade;
printf ( "input the grade:");
scanf ("%d",&grade);
if (grade>=90)
printf("A\n");
else if(grade>=80)
printf("B\n");
else if(grade>=70)
printf("C\n");
else if(grade>=60)
printf("D\n");
else
printf("E\n");
}
4.2 switch语句
4.2.1 switch语句
对于解决实际生活中例如人口统计分类、工资统计分类、银行存款分类等等的多分支选择问题,采用多分支 if语句(即 if语句的嵌套)
来处理固然可以,但是如果分支较多,则嵌套的 if语句层数多,程序冗长而且会导致可读性降低。 C语言提供了直接处理多分支选择的 switch语句,它的一般格式如下:
switch ( 表达式 )
{
case 常量表达式 1:语句 1;
case 常量表达式 2:语句 2;
┆
case 常量表达式 n:语句 n;
default,语句 m;
}
说明:其执行过程为进入 switch结构后,根据表达式的值从上到下去找与其相匹配的 case,以此作为入口,执行其后面的各语句。
对 【 例 4-1】 用 switch语句改写如下:
【 源程序 】
main( )
{
int grade;
printf("input the grade:");
scanf("%d",&grade);
switch(grade/10)
{
case 10:
case 9,printf("A\n");
case 8,printf("B\n");
case 7,printf("C\n");
case 6,printf("D\n");
default,printf("E\n");
}
}
【 运行结果 】
input the grade:98
A
B
C
D
E
说明:此时的结果并不是我们所希望得到的,也就是说根据 switch后面表达式的值找到了相匹配的
case分支后,就以此为入口执行后面的所有语句,
而不再进行判断了。其流程图如图 4.5。
4.2.2 break语句在 switch结构中的运用
为了正确使用 switch结构从多种结果中选择一种结果的功能,我们可以运用前面学过的
break语句来达到此目的。对流程图 4.5修改如下如图 4.6:
【 源程序 】
main( )
{
int grade;
printf("input the grade:");
scanf("%d",&grade);
switch(grade/10)
{
case 10:
case 9,printf("A\n");break;
case 8,printf("B\n");break;
case 7,printf("C\n");break;
case 6,printf("D\n");break;
default,printf("E\n");break;
}
}
说明:
1,switch结构的执行部分是一个由一些 case
子句和一个可缺省的 default子句组成的复合语句,特别注意要用一对,{}”括起来。
2,switch后面的表达式一般是整型表达式或字符型表达式,与之相对应的 case后面的常量表达式也应是一个整型表达式或字符型表达式,但要注意 case与常量表达式之间要有空格。例如,case 6+9,printf(,ok” ) ;是合法的。
3.在执行 switch语句时,根据其后表达式的值找相匹配的 case子句,要注意,case 常量表达式”只是起语句标号的作用,并不是在该处进行条件判断。当找到相匹配的 case子句即入口标号时,就从此标号开始执行后面的语句。因此,应该在执行一个 case子句后必须增加一条间断语句 break来使流程跳出
switch结构。如果未找到相匹配的 case子句就执行 default子句,若 default子句放在最后其后可以不加 break语句。
4.各个 case子句出现的次序对执行结果没任何影响,即顺序可以任意布局。
5.每一个 case能够拥有一条或多条语句,其最大的不同之处在于使用多条语句时不需要用,{}”括起来。
6.多个 case可以共用一组执行语句。例如:
┆
case?A?:
case?a?,++count ; break ;
┆
成绩为大写字母 A或小写字母 a都进行累加求和。
7,switch结构中的 case子句中的常量表达式的值不允许相同。
8,switch结构允许嵌套。
4.3 实例解析
【 例 4-2】 从键盘输入三个整数 a,b,c,输出最大的一个。
【 编程思路 】
分析:可以先找出 a与 b之间的较大者,然后再将这个较大者与 c比较找出较大者,则此数即为三个数中的最大数。
【 源程序 】
解法 1:
main()
{
int a,b,c;
printf("input a,b,c:");
scanf("%d,%d,%d",&a,&b,&c);
printf("the max is,%d
\n",c>((a>b)?a:b)?c:((a>b)?a:b));
}
解法 2:
main( )
{
int a,b,c,max;
printf("input a,b,c:");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b)
if(a>c)
max=a;
else
max=c;
else
if(b>c)
max=b;
else
max=c;
printf("the max is,%d \n",max);
}
4.4 本章小结
本章主要介绍了 if语句和 switch语句这两中分支语句。 if语句它又包括了三种类型:单分支
if语句、双分支 if语句和多分支 if语句(即 if语句的嵌套),特别注意在 if语句的嵌套中 if和
else的匹配关系; switch语句主要用于对单条件进行测试,从其多种结果中取一种的情形,
要注意在其 case分支语句中使用间断语句
break语句。在实际运用中,应根据具体的情况灵活使用这两种语句来解决问题。