第4章 分支结构及其应用
学习目标: 掌握关系和逻辑运算,实现分支结构的语句,编写分支结构程序。
学习内容: 关系和逻辑运算符及表达式,if 语句,switch 语句,条件表达式,分支结构嵌套,分支结构程序设计方法。 4.1 一个分支结构程序实例
【例4-1】任意输入两个整数,输出其中的大数。 【程序代码】 #include main() { }
分支结构是C 语言的三种基本结构之一。分支结构有双分支int a,b,max;
printf("请输入两个数据:"); scanf("%d,%d",&a,&b); if(a>b)
max=a;
else
max=b;
printf("二者中的大数为:%d\n",max);
结构和多分支结构,双分支结构是根据条件的成立与否决定程序的执行方向,条件成立时执行一些语句,条件不成立时执行另一方向上的语句。多分支结构通常有两个以上的分支,要根据多个条件才能进行选择。
4.2 分支结构中条件的描述
分支结构把条件判断的结果作为选择的依据。通常情况下,分支结构中的条件是用关系表达式或逻辑表达式表示的。 4.2.1 关系运算符和关系表达式 1、关系运算符
关系运算符是用来比较两个运算量大小关系的。表4-1列出了关系运算符及其示例。 表4-1 关系运算符
2、关系表达式
关系表达式的形式为:
表达式1 关系运算符 表达式2
例如:a>b、a+b>c、x!=y都是合法的关系表达式。 关系表达式的值有两种情况:
(1)当关系成立时,表达式的值为逻辑真,程序中用1表示。
(2)当关系不成立时,表达式的值为逻辑假,用0来表示。 这里的0和1在程序中被看作是整型量。
例如,有关系表达式b
小测验
假设变量a=3、b=2、c=1,执行赋值语句
f=a>b>c;后,变量f 的值是多少?
4.2.2 逻辑运算符和逻辑表达式
1、逻辑运算符
C 语言的逻辑运算符有3个,见表4-2. 表4-2 逻辑运算符
其中,逻辑与(&&)和逻辑或(||)是双目运算符,逻辑非(! )是单目运算符。 2、逻辑表达式 逻辑表达式的形式为:
表达式1 && 表达式2 表达式1 || 表达式2
!表达式
与关系表达式相同,逻辑表达式的值也有两种情况:1或0。
假设用a 表示表示式1,b 表示表达式2,则逻辑表达式的运算规则见表4-3。
表4-3 逻辑运算的运算规则
对于逻辑非(!),如!a ,当a 的值为0时,!a 的值为1,当a 的值为非0时,!a 的值为0。 小测验
用关系或逻辑表达式描述下列条件: (1)判断整数x 是否为偶数。 (2)判断字符变量c 是否为英文字母。
(3)判断三个实数a 、b 、c 能否构成一个三角形。
4.3 实现分支结构的语句
一个分支结构程序的关键在于条件的描述和实现分支结构的语句。通过前面的学习,对条件描述有了一定的了解,在下面的内容中将详细介绍实现分支结构的语句。
在C 语言中,分支结构主要由if 语句和switch 语句实现。
4.3.1 if语句
C 语言的if 语句有三种形式,分别适应不同的分支结构。 1、简单if 语句 (1)一般形式:
if (表达式) {
语句 }
(2)执行过程:计算表达式的值,若值为非0(即为“真”),则执行指定语句,否则跳过if 语句而直接执行下一条语句。
例如:要实现:如果a 大于0,给b 加1,该操作用简单if 语句表示为:
if(a>0) { b++; }
注意:在简单if 语句中,当if 下的语句为一条语句时,两边的花括号“{}”可以省略不写。如果包含有多个语句时,必须要用“{}”括起来组成复合语句(注意:复合语句在语法上认为是一条语句)。
【例4-3】计算函数值。输入整数x ,根据下面的分段函数计算y
的值。
x+1 (x>0) y= x (x=0)
x−1 (x
【编程思路】x 为任意的整数,有三种取值可能,只有通过判断才能确定其具体取值情况,以便给y 赋值。本例使用3个简单的if 语句来完成x 的取值的判断。 【程序代码】 #include main() { }
2、双分支if 语句(if-else 形式) int x,y;
printf("请输入x :"); scanf("%d",&x); if(x>0)
y=x+1;
if(x==0) y=x;
if(x
printf("x=%d,y=%d\n",x,y);
简单if 语句只在条件为“真”时执行指定的操作。而双分支if 语句,在条件为“真”或为“假”时,都有要执行的操作。 (1)一般形式: if(表达式)
{语句1} else
{语句2}
(2)执行过程:计算表达式的值,若表达式的值为非0(即“真”),则选择执行语句1,否则选择执行语句2. 其执行流程如图4-3所示。
例如:以下两个操作均用if-else 语句完成。 【程序1】
if(a>0) {
b++; } else {
b--; } 【程序2】 if(i%2==0)
printf("i是偶数\n");
else
printf("i是奇数\n");
【例4-4】任意提供一个学生的成绩,判断是否及格。 【编程思路】
本题的判断条件只有两种结果:大于等于60分和小于60分,因此,使用if-else 语句实现。 【程序代码】 #include main() { }
int score;
printf("请输入成绩:"); scanf("%d",&score); if(score>=60)
printf("及格\n");
else
printf("不及格");
使用if-else 语句,应注意以下事项:
(1)if-else 语句中的else 子句可以省略,不带else 子句时就是简单if 语句。
(2)else 子句不能作为单独的语句使用,它是if 语句的一部分,必须与if 搭配使用。
(3)如果if 子句或else 子句只有一条语句时,“{}”可以省略,如例4-4,但是包含多个语句时,必须要用“{}”括起来组成复合语句。
(4)书写代码时,为了提高程序的可读性,if 与else 对齐,而子句均向右缩进。
【例4-5】火车站托运行李,从甲地到乙地,按规定每张客票托运行李不超过50千克的部分,按每千克1.35元计算运费,如超过50千克,超过的部分按每千克2.65元计算运费。编写程序计算托运费。 【程序代码】 #include main() {
float f,w;
printf("请输入行李的重量:"); scanf("%f",&w);
}
if(w
3、条件表达式
双分支结构除了用if-else 语句实现外,还可以使用条件表达式实现。
条件表达式的一般形式为:
表达式1?表达式2:表达式3
例如:a>b?a:b
条件表达式的运算过程为:先计算表达式1,如果表达式1的值为真,则计算表达式2的值,并以此作为条件表达式的值;如果表达式1的值为假,则计算表达式3的值,并以此作为条件表达式的值。
例如:
【程序段】
if(a>b) max=a;
else max=b;
可以用条件表达式描述为max=(a>b)?a:b;。条件表达式通常
用于赋值语句中。
下面用条件表达式完成例4-1中的分支判断。
【程序代码】
#include
main()
{
} int a,b,max; printf("请输入两个数据:"); scanf("%d,%d",&a,&b); max=(a>b)?a:b; printf("二者中的大数为:%d\n",max); 4、多分支if 语句(if-else-if 形式)
在实际应用中,存在大量的多分支问题。多分支if 语句就是用来实现多分支结构的语句。
(1)一般形式:
if(表达式1)
语句1
else if(表达式2)
语句2
……
else if(表达式n)
语句n
else
语句n+1
说明:多分支if 语句中,表达式1的优先级最高,表达式
2
次之,无论执行完哪个分支语句,接下来都要转到多分支if 语句的后续语句继续执行。
【例4-6】对学生的考试成绩进行等级评价,90分以上为优秀,80~90分为良好,60~80分为及格,60分以下为不及格。任意输入一个学生的成绩,判断属于哪个等级。
【程序代码】
#include
main()
{
int score; printf("请输入成绩:"); scanf("%d",&score); if(score>=90) printf("优秀\n"); else if(score>=80) printf("良好\n"); else if(score>=60) printf("及格\n",score); else printf("不及格");
}
4.3.2 switch 语句
switch 语句是又一个描述多分支结构的语句。
1、一般形式
switch(表达式)
{
case 常量表达式1: 语句1; case 常量表达式2: 语句2; ...... case 常量表达式n: 语句n;
default: 语句n+1;
}
2、执行过程
(1)先计算switch 后表达式的值。
(2)用表达式的值顺次同case 后常量表达式的值进行比较。
(3)若找到值相等的常量表达式,则执行常量表达式冒号后面的语句(这是入口)。注意,该语句执行后,程序会依次执行其后的所有冒号后面的语句。
(4)若找不到匹配的常量表达式的值,则执行default 后面的语
句。
3、switch 语句说明
(1)switch 后表达式的值的类型必须是整型或字符型;
(2)常量表达式的值也必须是整型或字符型;
(3)每个case 后常量表达式的值必须互不相同。
【例4-7】 用switch 语句处理例4-6中的问题
【程序代码】
#include
main()
{
int score,mark; printf("\n请输入成绩:"); scanf("%d",&score); mark=score/10; switch(mark) { case 10: printf("%d--------优秀\n",score); case 9: printf("%d--------优秀\n",score); case 8: printf("%d--------良好\n",score); case 7: printf("%d--------及格\n",score); case 6: printf("%d--------及格\n",score); default: printf("%d-------不及格\n\n",score);
} }
执行程序,输入95,程序输出结果为:
显然,程序的输出结果并不是预期的效果,原因是当输入95,变量mark 的取值为9,执行输出“良好”的输出语句并以此为入口,开始往下执行,直到switch 语句的结束符“}”为止,因此程序不能实现分支结构的功能。
为了得到预期的输出结果,解决方法是在switch 语句中使用break 语句。例如,在上面程序的switch 语句体中假如break 语句,用来终止switch 的顺序往下执行。
switch(mark) { case 10: printf("%d--------优秀\n",score);break; case 9: printf("%d--------优秀\n",score);break; case 8: printf("%d--------良好\n",score);break; case 7: printf("%d--------及格\n",score);break; case 6: printf("%d--------及格\n",score);break; default: printf("%d-------不及格
\n\n",score);
}
重新执行程序,输入95,程序输出结果为:
4.4 分支结构应用实例
【例4-8】输入一个常数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为5的倍数。
【程序代码】
#include
main()
{
int x; printf("Please input a number:"); scanf("%d",&x); if(x%2==0) printf("%dis an even\n",x); else { printf("%d is an odd\n",x); if(x%5==0)
printf("%d is the times of 5\n",x);
}
} else printf("%d is not the times of 5\n",x);
小测验:
当a=1、b=3、c=5、d=4时,执行完下面程序段后,变量x 的值为: 。
if(a
if(c
else x=7;
提示:在使用if 语句时,为明确关系,避免嵌套错误,书写时请将匹配的if 和else 对齐,将内嵌的if 语句缩进。
《C 语言程序设计实验教程》——习题4
第4章 分支结构及其应用
学习目标: 掌握关系和逻辑运算,实现分支结构的语句,编写分支结构程序。
学习内容: 关系和逻辑运算符及表达式,if 语句,switch 语句,条件表达式,分支结构嵌套,分支结构程序设计方法。 4.1 一个分支结构程序实例
【例4-1】任意输入两个整数,输出其中的大数。 【程序代码】 #include main() { }
分支结构是C 语言的三种基本结构之一。分支结构有双分支int a,b,max;
printf("请输入两个数据:"); scanf("%d,%d",&a,&b); if(a>b)
max=a;
else
max=b;
printf("二者中的大数为:%d\n",max);
结构和多分支结构,双分支结构是根据条件的成立与否决定程序的执行方向,条件成立时执行一些语句,条件不成立时执行另一方向上的语句。多分支结构通常有两个以上的分支,要根据多个条件才能进行选择。
4.2 分支结构中条件的描述
分支结构把条件判断的结果作为选择的依据。通常情况下,分支结构中的条件是用关系表达式或逻辑表达式表示的。 4.2.1 关系运算符和关系表达式 1、关系运算符
关系运算符是用来比较两个运算量大小关系的。表4-1列出了关系运算符及其示例。 表4-1 关系运算符
2、关系表达式
关系表达式的形式为:
表达式1 关系运算符 表达式2
例如:a>b、a+b>c、x!=y都是合法的关系表达式。 关系表达式的值有两种情况:
(1)当关系成立时,表达式的值为逻辑真,程序中用1表示。
(2)当关系不成立时,表达式的值为逻辑假,用0来表示。 这里的0和1在程序中被看作是整型量。
例如,有关系表达式b
小测验
假设变量a=3、b=2、c=1,执行赋值语句
f=a>b>c;后,变量f 的值是多少?
4.2.2 逻辑运算符和逻辑表达式
1、逻辑运算符
C 语言的逻辑运算符有3个,见表4-2. 表4-2 逻辑运算符
其中,逻辑与(&&)和逻辑或(||)是双目运算符,逻辑非(! )是单目运算符。 2、逻辑表达式 逻辑表达式的形式为:
表达式1 && 表达式2 表达式1 || 表达式2
!表达式
与关系表达式相同,逻辑表达式的值也有两种情况:1或0。
假设用a 表示表示式1,b 表示表达式2,则逻辑表达式的运算规则见表4-3。
表4-3 逻辑运算的运算规则
对于逻辑非(!),如!a ,当a 的值为0时,!a 的值为1,当a 的值为非0时,!a 的值为0。 小测验
用关系或逻辑表达式描述下列条件: (1)判断整数x 是否为偶数。 (2)判断字符变量c 是否为英文字母。
(3)判断三个实数a 、b 、c 能否构成一个三角形。
4.3 实现分支结构的语句
一个分支结构程序的关键在于条件的描述和实现分支结构的语句。通过前面的学习,对条件描述有了一定的了解,在下面的内容中将详细介绍实现分支结构的语句。
在C 语言中,分支结构主要由if 语句和switch 语句实现。
4.3.1 if语句
C 语言的if 语句有三种形式,分别适应不同的分支结构。 1、简单if 语句 (1)一般形式:
if (表达式) {
语句 }
(2)执行过程:计算表达式的值,若值为非0(即为“真”),则执行指定语句,否则跳过if 语句而直接执行下一条语句。
例如:要实现:如果a 大于0,给b 加1,该操作用简单if 语句表示为:
if(a>0) { b++; }
注意:在简单if 语句中,当if 下的语句为一条语句时,两边的花括号“{}”可以省略不写。如果包含有多个语句时,必须要用“{}”括起来组成复合语句(注意:复合语句在语法上认为是一条语句)。
【例4-3】计算函数值。输入整数x ,根据下面的分段函数计算y
的值。
x+1 (x>0) y= x (x=0)
x−1 (x
【编程思路】x 为任意的整数,有三种取值可能,只有通过判断才能确定其具体取值情况,以便给y 赋值。本例使用3个简单的if 语句来完成x 的取值的判断。 【程序代码】 #include main() { }
2、双分支if 语句(if-else 形式) int x,y;
printf("请输入x :"); scanf("%d",&x); if(x>0)
y=x+1;
if(x==0) y=x;
if(x
printf("x=%d,y=%d\n",x,y);
简单if 语句只在条件为“真”时执行指定的操作。而双分支if 语句,在条件为“真”或为“假”时,都有要执行的操作。 (1)一般形式: if(表达式)
{语句1} else
{语句2}
(2)执行过程:计算表达式的值,若表达式的值为非0(即“真”),则选择执行语句1,否则选择执行语句2. 其执行流程如图4-3所示。
例如:以下两个操作均用if-else 语句完成。 【程序1】
if(a>0) {
b++; } else {
b--; } 【程序2】 if(i%2==0)
printf("i是偶数\n");
else
printf("i是奇数\n");
【例4-4】任意提供一个学生的成绩,判断是否及格。 【编程思路】
本题的判断条件只有两种结果:大于等于60分和小于60分,因此,使用if-else 语句实现。 【程序代码】 #include main() { }
int score;
printf("请输入成绩:"); scanf("%d",&score); if(score>=60)
printf("及格\n");
else
printf("不及格");
使用if-else 语句,应注意以下事项:
(1)if-else 语句中的else 子句可以省略,不带else 子句时就是简单if 语句。
(2)else 子句不能作为单独的语句使用,它是if 语句的一部分,必须与if 搭配使用。
(3)如果if 子句或else 子句只有一条语句时,“{}”可以省略,如例4-4,但是包含多个语句时,必须要用“{}”括起来组成复合语句。
(4)书写代码时,为了提高程序的可读性,if 与else 对齐,而子句均向右缩进。
【例4-5】火车站托运行李,从甲地到乙地,按规定每张客票托运行李不超过50千克的部分,按每千克1.35元计算运费,如超过50千克,超过的部分按每千克2.65元计算运费。编写程序计算托运费。 【程序代码】 #include main() {
float f,w;
printf("请输入行李的重量:"); scanf("%f",&w);
}
if(w
3、条件表达式
双分支结构除了用if-else 语句实现外,还可以使用条件表达式实现。
条件表达式的一般形式为:
表达式1?表达式2:表达式3
例如:a>b?a:b
条件表达式的运算过程为:先计算表达式1,如果表达式1的值为真,则计算表达式2的值,并以此作为条件表达式的值;如果表达式1的值为假,则计算表达式3的值,并以此作为条件表达式的值。
例如:
【程序段】
if(a>b) max=a;
else max=b;
可以用条件表达式描述为max=(a>b)?a:b;。条件表达式通常
用于赋值语句中。
下面用条件表达式完成例4-1中的分支判断。
【程序代码】
#include
main()
{
} int a,b,max; printf("请输入两个数据:"); scanf("%d,%d",&a,&b); max=(a>b)?a:b; printf("二者中的大数为:%d\n",max); 4、多分支if 语句(if-else-if 形式)
在实际应用中,存在大量的多分支问题。多分支if 语句就是用来实现多分支结构的语句。
(1)一般形式:
if(表达式1)
语句1
else if(表达式2)
语句2
……
else if(表达式n)
语句n
else
语句n+1
说明:多分支if 语句中,表达式1的优先级最高,表达式
2
次之,无论执行完哪个分支语句,接下来都要转到多分支if 语句的后续语句继续执行。
【例4-6】对学生的考试成绩进行等级评价,90分以上为优秀,80~90分为良好,60~80分为及格,60分以下为不及格。任意输入一个学生的成绩,判断属于哪个等级。
【程序代码】
#include
main()
{
int score; printf("请输入成绩:"); scanf("%d",&score); if(score>=90) printf("优秀\n"); else if(score>=80) printf("良好\n"); else if(score>=60) printf("及格\n",score); else printf("不及格");
}
4.3.2 switch 语句
switch 语句是又一个描述多分支结构的语句。
1、一般形式
switch(表达式)
{
case 常量表达式1: 语句1; case 常量表达式2: 语句2; ...... case 常量表达式n: 语句n;
default: 语句n+1;
}
2、执行过程
(1)先计算switch 后表达式的值。
(2)用表达式的值顺次同case 后常量表达式的值进行比较。
(3)若找到值相等的常量表达式,则执行常量表达式冒号后面的语句(这是入口)。注意,该语句执行后,程序会依次执行其后的所有冒号后面的语句。
(4)若找不到匹配的常量表达式的值,则执行default 后面的语
句。
3、switch 语句说明
(1)switch 后表达式的值的类型必须是整型或字符型;
(2)常量表达式的值也必须是整型或字符型;
(3)每个case 后常量表达式的值必须互不相同。
【例4-7】 用switch 语句处理例4-6中的问题
【程序代码】
#include
main()
{
int score,mark; printf("\n请输入成绩:"); scanf("%d",&score); mark=score/10; switch(mark) { case 10: printf("%d--------优秀\n",score); case 9: printf("%d--------优秀\n",score); case 8: printf("%d--------良好\n",score); case 7: printf("%d--------及格\n",score); case 6: printf("%d--------及格\n",score); default: printf("%d-------不及格\n\n",score);
} }
执行程序,输入95,程序输出结果为:
显然,程序的输出结果并不是预期的效果,原因是当输入95,变量mark 的取值为9,执行输出“良好”的输出语句并以此为入口,开始往下执行,直到switch 语句的结束符“}”为止,因此程序不能实现分支结构的功能。
为了得到预期的输出结果,解决方法是在switch 语句中使用break 语句。例如,在上面程序的switch 语句体中假如break 语句,用来终止switch 的顺序往下执行。
switch(mark) { case 10: printf("%d--------优秀\n",score);break; case 9: printf("%d--------优秀\n",score);break; case 8: printf("%d--------良好\n",score);break; case 7: printf("%d--------及格\n",score);break; case 6: printf("%d--------及格\n",score);break; default: printf("%d-------不及格
\n\n",score);
}
重新执行程序,输入95,程序输出结果为:
4.4 分支结构应用实例
【例4-8】输入一个常数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为5的倍数。
【程序代码】
#include
main()
{
int x; printf("Please input a number:"); scanf("%d",&x); if(x%2==0) printf("%dis an even\n",x); else { printf("%d is an odd\n",x); if(x%5==0)
printf("%d is the times of 5\n",x);
}
} else printf("%d is not the times of 5\n",x);
小测验:
当a=1、b=3、c=5、d=4时,执行完下面程序段后,变量x 的值为: 。
if(a
if(c
else x=7;
提示:在使用if 语句时,为明确关系,避免嵌套错误,书写时请将匹配的if 和else 对齐,将内嵌的if 语句缩进。
《C 语言程序设计实验教程》——习题4