第3 章选择结构及其应用
3.1 基本知识提要
3.1.1 知识结构图
3.1.2 重点知识整理
1.关系运算符和关系表达式 
比较两个量的运算符称为关系运算符,C语言提供的关系运算符有6种,即<、<=、
>、>=、==、!=。关系运算符主要用于比较两个表达式的值,关系表达式的结果只有
两个:0(假)或1(真)。
说明: 
(1)C语言中的小于或等于、大于或等于、等于、不等于运算符(<=、>=、==、

C 语言程序设计习题解答与实验指导
!=)的表示与数学中的表示(≤、≥、=、≠)不同。
(2)运算符<、<=、>、>=的优先级相同,运算符==、!=的优先级相同,前4种
的优先级高于后两种。
(3)关系运算符的结合性为从左到右。
(4)C语言中==是关系运算符,用来判断两个数是否相等,请读者注意与等号=的
区别。
2.逻辑运算符和逻辑表达式
判断条件中的逻辑关系的运算符称为逻辑运算符,C语言中有3种逻辑运算符:逻
辑与(&&)、逻辑或(||)、逻辑非(!)。逻辑运算符主要用于进一步明确关系表达式之间
的关系,逻辑表达式的结果只有两个:0(假)或1(真)。
说明: 
(1)三种运算符的优先级由高到低依次为:!、&&、||。
(2)逻辑运算符中的&& 和||的结合性为从左到右,!的结合性为从右到左。
(3)关系运算符的优先级低于算术运算符,逻辑运算符中的&& 和||的优先级低于
关系运算符,!的优先级高于算术运算符。
3.if语句
(1)if分支。if分支语句的一般形式如下: 
if(表达式) 
语句1; 
其中,表达式一般为逻辑表达式或关系表达式。语句1可以是一条简单的语句或多
条语句,当为多条语句时,需要用大括号“{}”将这些语句括起来,构成复合语句。if分支
语句的运行过程是:当表达式的值为真(非0)时,运行语句1,否则直接运行if语句下面
的语句。在使用if语句时,应注意以下几点。
①if后面的表达式必须用小括号括起来。
②if后面的表达式可以为关系表达式、逻辑表达式、算术表达式等。
③ 表达式中一定要区分赋值运算符=和关系运算符==。
(2)if-else分支。if分支语句只允许在条件为真时指定要运行的语句,而if-else分支
还可在条件为假时指定要运行的语句。if-else分支语句的一般形式如下: 
if(表达式) 
语句1; 
else 
语句2; 
if-else分支语句的运行过程是:当表达式为真(非0)时,运行语句1,否则运行语
句2。
42

第3 章 选择结构及其应用
(3)嵌套的if语句。if语句嵌套常用的有以下两种形式。 
①if(表达式1) 
if(表达式2) 语句1; 
else 语句2; 
else 
if(表达式3) 语句3; 
else 语句4; 
if与else既可成对出现,也可不成对出现,且else总是与最近的if相配对。 
②if(表达式1) 语句1; 
else if(表达式2) 语句2; 
else if(表达式3) 语句3; 
… 
else if(表达式n) 语句n; 
else 语句n+1; 
此结构的程序流程是在多个分支中,仅运行表达式为真的那个elseif后面的语句。
若所有表达式的值都为0,则运行最后一个else后的语句。
4.switch语句
switch语句的一般形式如下: 
switch(表达式) 
{ 
case 常量表达式1:[语句系列1;] 
case 常量表达式2:[语句系列2;] 
… 
case 常量表达式n:[语句系列n;] 
[default :语句系列n+1;] 
} 
其中,方括号括起来的内容是可选项。
switch语句的运行过程是:首先计算switch后表达式的值,然后将其结果值与case 
后常量表达式的值依次进行比较,若此值与某个case后常量表达式的值一致,即转去运
行该case后的语句系列;若没有找到与之匹配的常量表达式,则运行default后的语句
系列。在
使用switch语句时,应注意以下几点: 
(1)switch后的表达式和case后的常量表达式可以是整型、字符型、枚举型,但不能
是实型。
(2)同一个switch语句中,各个case后的常量表达式的值必须互不相等。
43

C 语言程序设计习题解答与实验指导
(3)case后的语句系列可以是一条语句,也可以是多条语句,此时多条语句不必用大
括号括起来。
(4)default可以省略,此时如果没有与switch表达式相匹配的case常量,则不运行
任何语句,程序转到switch语句的下一条语句运行。
(5)break语句和switch最外层的右大括号是退出switch选择结构的出口,遇到第
1个break即终止运行switch语句,如果程序没有break语句,则在运行完某个case后的
语句系列后,将继续运行下一个case中的语句系列,直到遇到switch语句的右大括号为
止,因此,通常在每个case语句运行完后,增加一个break语句来达到终止switch语句运
行的目的。
(6)各个case及default的次序是任意的,default可以位于case之前。
(7)如果多种情况都运行相同的程序块,则对应的多个case可以运行同一语句系列。
5.条件运算符和条件表达式
条件表达式的一般形式为: 
表达式1? 表达式2:表达式3 
条件表达式的运行过程是:若表达式1为真,则条件表达式的值等于表达式2的值, 
否则等于表达式3的值。
(1)条件运算符的优先级低于算术运算符、关系运算符及逻辑运算符,仅高于赋值运
算符和逗号运算符。
(2)条件运算符的结合性为从右到左,当有条件运算符嵌套时,按照从右到左的顺序
依次运算。
(3)条件表达式中3个表达式的类型可以不同,其中表达式1表示条件,只能是0与
非0的结果;当表达式2与表达式3类型不同时,条件表达式值的类型为二者中较高的
类型。
3.2 主教材习题解答
一、选择题 
1.D 2.C 3.D 4.C 5.B 6.C 7.B 8.C 9.D 10.B 
二、填空题
1.yes 
no 
2.2,1 
3.d=20 
44

第3 章 选择结构及其应用
4.x=6,y=6 
5.
(1)a!=b||a<=c 
(2)x>=4||x<=-4 
(3)x>2&&x<3 
三、编程题
1. 参考代码如下: 
#include <stdio.h> 
int main() 
{ 
int x; 
printf("please input an integer:"); 
scanf("%d",&x); 
if(x%5==0&&x%7==0) 
printf("yes\n"); 
else 
printf("no\n"); 
return 0; 
} 
2. 参考代码如下: 
#include <stdio.h> 
int main() 
{ 
char ch; 
scanf("%c",&ch); 
ch=(ch>='A'&&ch<='Z'? (ch+32):ch); 
printf("%c",ch); 
return 0; 
} 
3. 参考代码如下: 
#include <stdio.h> 
int main() 
{ 
int x,y; 
scanf("%d",&x); 
if(x<20) 
{ 
y=x+100; 
printf("y=x+100\n"); 
45

C 语言程序设计习题解答与实验指导 
} 
else if(x<=100) 
{ 
y=x; 
printf("y=x\n"); 
} 
else 
{ 
y=x-100; 
printf("y=x-100\n"); 
} 
printf("y=%d",y); 
return 0; 
} 
4. 参考代码如下: 
#include <stdio.h> 
int main() 
{ 
char grade; 
scanf("%c",&grade); 
printf("Your score:"); 
switch(grade) 
{ 
case 'A':printf("85~100\n");break; 
case 'B':printf("70~84\n");break; 
case 'C':printf("60~69\n");break; 
case 'D':printf("<60\n");break; 
default:printf("Error input! \n"); 
} 
return 0; 
} 
5. 参考代码如下: 
#include <stdio.h> 
int main() 
{ 
int year,month; 
printf("please input the year and month:"); 
scanf("%d%d",&year,&month); 
switch(month) 
{ 
case 1: 
case 3: 
46

第3 章 选择结构及其应用 
case 5: 
case 7: 
case 8: 
case 10: 
case 12:printf("this month have 31 days."); 
break; 
case 4: 
case 6: 
case 9: 
case 11:printf("this month have 30 days."); 
break; 
case 2:if(year%4==0&&year%100!=0||year%400==0) 
{ 
printf("this month have 29 days."); 
break; 
} 
else 
{ 
printf("this month have 28 days."); 
break; 
} 
} 
return 0; 
} 
6. 参考代码如下: 
#include <stdio.h> 
int main() 
{ 
float money; 
int year; 
printf("\nplease input the money and the year:"); 
scanf("%f%d",&money,&year); 
if(year==1) 
money+=money*0.00315*12*year; 
if(year==2) 
money+=money*0.00330*12*year; 
if(year==3||year==4) 
money+=money*0.00345*12*year; 
if(year>=5&&year<=7) 
money+=money*0.00375*12*year; 
if(year>=8) 
money+=money*0.00420*12*year; 
printf("the money is:%f",money); 
return 0; 
} 
47

C 语言程序设计习题解答与实验指导
3.3 上机实验
3.3.1 简单选择结构程序设计
一、实验目的与要求 
(1)理解C语言中逻辑量的表示方法。
(2)学会正确使用关系运算符、关系表达式、逻辑运算符和逻辑表达式。
(3)熟练掌握并使用关系表达式或逻辑表达式来表达条件。
(4)熟练掌握并使用if分支和if-else分支来解决简单的选择问题。
二、实训内容
1.验证实验 
(1)写出下面程序的运行结果,并上机验证。 
#include <stdio.h> 
int main() 
{ 
int y=2,z=2; 
if(y-z) 
printf("####\n"); 
else 
printf("****\n"); 
return 0; 
}
运行结果: 
(2)写出下面程序的运行结果,并上机验证。 
#include <stdio.h> 
int main() 
{ 
int a,b,c=1; 
a=(-1)||(-1); 
b=(-1)&&(-1); 
if(c=-1) 
printf("a=%d;b=%d;c=%d.",a,b,c); 
else 
printf("no answer."); 
return 0; 
} 
48

第3 章 选择结构及其应用
运行结果: 
(3)写出下面程序的运行结果,并上机验证。 
#include <stdio.h> 
int main() 
{ 
int a=1,b=2,c=3,d=4,m=2,n=2; 
(m=a>b)&&(n=c>d); 
printf("%d\n",n); 
return 0; 
}
运行结果: 
2. 填空实验
(1)下面程序输出三个数中的最大值,请填空。 
#include <stdio.h> 
int main() 
{ 
int a=3,b=4,c=5; 
① 
if( ② ) 
max=a; 
else 
max=b; 
if(max<c) 
③ 
printf("the max is %d.",max); 
return 0; 
}
(2)下面程序实现输入三个整数,按从小到大的顺序进行输出,请填空。 
#include <stdio.h> 
int main() 
{ 
int a,b,c,x; 
scanf("%d %d %d",&a,&b,&c); 
if( ① ) 
{ 
x=a; 
a=b; 
b=x; 
} 
if( ② ) { 
49

C 语言程序设计习题解答与实验指导 
x=a; 
a=c; 
c=x; 
} 
if( ③ ) { 
x=b; 
b=c; 
c=x; 
} 
printf("the order is %d,%d,%d.",a,b,c); 
return 0; 
}
(3)下面程序用于判断用户输入的数是奇数还是偶数,请填空。 
#include <stdio.h> 
int main() 
{ 
int n,remainder; 
printf("Enter your number to be tested.\n"); 
scanf("%d",&n); 
remainder=n%2; 
if( ① ) 
printf("%d is even.\n",n); 
if( ② ) 
printf("%d is odd.\n",n); 
return 0; 
} 
3. 设计实验
(1)编写程序,输入一个字母,判断是否为大写字母。如果是,则提示“uppercase 
letter!”,否则提示“otherletter!”。
(2)编写程序,输入两个整数和一个字符,如果该字符是y,则进行两个数的交换并输
出交换后的结果,否则,输出字符串“Noswap!”。
提示:两个数进行交换需要引入第三个变量。
(3)有一函数
y = 
x x <0 
2x -1 0≤x <10 
3x -1 x ≥10 
ì
.
í
.. 
.. 
编程要求: 
① 输入x,数据类型为浮点型。
② 输出y值,要求屏幕打印出:x=?? 时,y=##.##(?? 表示输入值,##.## 
表示输出结果,小数部分取两位)。
50

第3 章 选择结构及其应用
③ 程序中加入三处注释,说明x取不同值时,相应的计算公式。
三、答案及参考程序
1.验证实验 
(1)程序运行结果如下: 
**** 
(2)程序运行结果如下: 
a=1;b=1;c=-1. 
(3)程序运行结果如下: 
2 
分析:首先计算m=a>b,因为关系运算符>优先级高于赋值运算符=,a>b的结
果为假(0),赋值后m 的值为0。因为C语言计算逻辑表达式0&&(n=c>d)时,已经知
道结果为0,因此就不再计算n=c>d了,n的值仍为2。
2. 填空实验
(1)①intmax; ②a>b ③ max=c; 
(2)①a>b; ②a>c ③ b>c; 
(3)①remainder==0; ②remainder!=0 
3. 设计实验
(1)参考代码如下: 
#include <stdio.h> 
int main() 
{ 
char c; 
printf("请输入一个字母:\n"); 
c=getchar(); 
if(c>=65&&c<=90) 
printf("uppercase letter! \n"); 
else 
printf("other letter! \n"); 
return 0; 
}
(2)参考代码如下: 
#include <stdio.h> 
51

C 语言程序设计习题解答与实验指导
int main() 
{ 
char ch; 
int a,b,t; 
printf("Please enter two number and a character:\n"); 
scanf("%d %d %c",&a,&b,&ch); 
printf("ch=%c,a=%d,b=%d\n",ch,a,b); 
if(ch=='y'){ 
t=a;a=b;b=t; 
printf("交换后a=%d,b=%d\n",a,b); 
} 
else 
printf("No swap! \n"); 
return 0; 
}
(3)参考代码如下: 
#include <stdio.h> 
int main() 
{ 
float x,y; 
printf("Please enter a float number :\n"); 
scanf("%f",&x); 
if(x<0) 
y=x; //x<0,y=x 
if(x>=0&&x<10) 
y=2*x-1; //0=<x<=10,y=2x-1 
if(x>=10) 
y=3*x-1; //x>10,y=3x-1 
printf("x=%f,y=%.2f\n",x,y); 
return 0; 
}
四、注意事项及小结
(1)当if语句后面的表达式的值非0时,都代表条件成立,只有为0时,条件不成立。
(2)逻辑运算符&& 只有在左边为真时,才进行右边的计算。
(3)运行复合语句时,一定要加大括号{},把要运行的语句括起来。
3.3.2 多分支选择结构与选择嵌套程序设计
一、实验目的与要求 
(1)学会使用if条件语句中的多分支形式:if-elseif-else。
52

第3 章 选择结构及其应用
(2)熟练掌握if条件语句的嵌套使用。
(3)熟练掌握switch语句。
(4)在if多分支、if嵌套和switch语句运行过程中,要注意程序段中语句的运行
过程。
二、实训内容
1.验证实验 
(1)写出下面程序的运行结果,并上机验证。
运行程序时,输入: 
3, 1<回车> 
#include <stdio.h> 
int main() 
{ 
int a,b,s,t; 
scanf("%d,%d",&a,&b); 
s=t=1; 
if(a>0) 
s=s+1; 
if(a>b) 
t=s+t; 
else if(a==b) 
t=5; 
else 
t=2*s; 
printf("s=%d,t=%d",s,t); 
return 0; 
}
运行结果: 
(2)写出下面程序的运行结果,并上机验证。 
#include <stdio.h> 
int main() 
{ 
int a=100,x=10,y=20,m=5,n=0; 
if(x<y) 
if(y!=m) 
a=1; 
else 
if(n) 
a=10; 
53

C 语言程序设计习题解答与实验指导 
a=-1; 
printf("%d\n",a); 
return 0; 
}
运行结果: 
(3)写出下面程序的运行结果,并上机验证。
运行5次,分别输入1、2、3、4、5。 
#include <stdio.h> 
int main() 
{ 
int i; 
printf("enter i:"); 
scanf("%d",&i); 
switch(i) 
{ 
case 1: 
case 2:printf("i=%d\n",i); 
case 3:printf("i=%d\n",i);break; 
default:printf("default! \n"); 
} 
return 0; 
}
运行结果: 
(4)写出下面程序的运行结果,并上机验证。 
#include <stdio.h> 
int main() 
{ 
int x=1,a=0,b=0; 
switch(x) 
{ 
case 0: b++; 
case 1: a++; 
case 2: a++;b++; 
} 
printf("a=%d,b=%d\n",a,b); 
return 0; 
}
运行结果: 
2. 填空实验
(1)根据下面函数关系,对输入的每个x值,计算相应的y值。
54

第3 章 选择结构及其应用
y= 
0 x<0 
x(x+1) 0≤x≤10 
x-1 10<x≤20 
2x x>20 
ì
.
í
... 
..
. 
#include <stdio.h> 
int main() 
{ 
int x,y; 
scanf("%d",&x); 
if( ① ) 
{ 
y=0; 
printf("x<0,y"); 
} 
else if( ② ) 
{ 
y=x*(x+1); 
printf("y=x(x+1)"); 
} 
else if( ③ ) 
{ 
y=x-1; 
printf("y=x-1"); 
} 
else 
{ 
④ ; 
printf("y=2x"); 
} 
printf("=%d",y); 
return 0; 
}
(2)下面程序的功能是计算某年某月有几天。 
#include <stdio.h> 
int main() 
{ 
int y,m,len; 
printf("year,month="); 
scanf("%d,%d",&y,&m); 
switch(m) 
{ 
case 1: 
case 3: 
55

C 语言程序设计习题解答与实验指导 
case 5: 
case 7: 
case 8: 
case 10: 
case 12: ① 
break; 
case 4: 
case 6: 
case 9: 
case 11:len=30; 
break; 
case 2: if( ② ) 
len=29; 
else 
len=28; 
③ 
default: printf("the month is error!"); 
} 
printf("the length of %d year %d month is %d\n",y,m,len); 
return 0; 
}
(3)下面程序根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的
面积及类型。 
#include <stdio.h> 
#include <math.h> 
int main() 
{ 
float a,b,c; 
float s,area; 
scanf("%f %f %f",&a,&b,&c); 
if( ① ) 
{ 
s=(a+b+c)/2; 
area=sqrt(s*(s-a)*(s-b)*(s-c)); 
printf("%f",area); 
if( ② ) 
printf("等边三角形"); 
else if( ③ ) 
printf("等腰三角形"); 
else if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(c*c+b*b==a*a)) 
printf("直角三角形"); 
else 
printf("一般三角形"); 
56

第3 章 选择结构及其应用 
} 
else 
printf("不能组成三角形"); 
return 0; 
} 
3. 设计实验
(1)从键盘输入一个字符,当该字符是+、—、*或/时,显示其对应的英文单词plus、
minus、multiplication或division。输入其他字符时,显示“Error!”。
提示:输入字符c,判断是否相等使用==字符,例如,if(c=='+')。
(2)从键盘输入一个字符,通过对ASCII码值范围的判断,输出判断结果。具体要求
如下:①
ASCII码值在65~90,输出提示信息:输入的字符是大写字母。
② ASCII码值在97~122,输出提示信息:输入的字符是小写字母。
③ ASCII码值在48~57,输出提示信息:输入的字符是数字。
④ ASCII码值不在上述范围内,输出提示信息:输入的字符是特殊字符。
(3)某地出租车的收费方法如下:起步价8元,最多可行驶3km(不包含3km);3~ 
8km(不包含8km)按1.8元/km 计算(不足1km,按1km 计算),8km 以后按2.0元/km 
计算(不足1km,按1km 计算)。编写程序,计算并输出车费。
提示:可使用if-elseif-else语句编程,根据题意计费分为三个区间,分别是(0,3)、
[3,8)和大于8。
三、答案及参考程序
1.验证实验 
(1)程序运行结果如下: 
s=2, t=3 
(2)程序运行结果如下: 
-1 
(3)程序运行结果如下: 
输入1,运行结果为 
i=1 
i=1 
输入2,运行结果为
57

C 语言程序设计习题解答与实验指导 
i=2 
i=2 
输入3,运行结果为 
i=3 
输入4,运行结果为 
default! 
输入5,运行结果为 
default! 
(4)程序运行结果如下: 
a=2, b=1 
2. 填空实验
(1)① x<0 ② x<=10 ③ x<=20 ④ y=2*x 
(2)①len=31 ② y%4==0&&y%100!=0||y%400==0 ③ break 
(3)①a+b>c&&b+c>a&&a+c>b ②a==b&&b==c ③a==b|| 
b==c||a==c 
3. 设计实验
(1)参考代码如下: 
#include <stdio.h> 
int main() 
{ 
char c; 
c=getchar(); 
if(c=='+') 
printf("plus\n"); 
else if(c=='-') 
printf("minus\n"); 
else if(c=='*') 
printf("multiplication\n"); 
else if(c=='/') 
printf("division\n"); 
else 
58

第3 章 选择结构及其应用 
printf("Error!\n"); 
return 0; 
}
(2)参考代码如下: 
#include <stdio.h> 
int main() 
{ 
char c; 
printf("请输入一个字符:\n"); 
c=getchar(); 
if(c>=65&&c<=90) 
printf("输入的字符是大写字母:\n"); 
else if(c>=97&&c<=122) 
printf("输入的字符是小写字母:\n"); 
else if(c>=48&&c<=57) 
printf("输入的字符是数字:\n"); 
else 
printf("输入的是特殊符号:\n"); 
return 0; 
}
(3)参考代码如下: 
#include <stdio.h> 
int main() 
{ 
float distance,fee; 
printf("Please enter the distance:\n"); 
scanf("%f",&distance); 
if(distance<0) 
printf("Enter error! \n"); 
else if(distance<3) 
fee=8; 
else if(distance<8) 
fee=8+(int)(distance-2)*1.8; 
else 
fee=8+5*1.8+(int)(distance-7)*2.0; 
printf("The taix fee is %.2f\n",fee); 
return 0; 
}
四、注意事项及小结
(1)关于if语句有以下几点说明: 
59

C 语言程序设计习题解答与实验指导
①else语句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。
②if语句可以嵌套使用,即在if语句中可以包含一个或多个if语句,在使用时应注
意,else总是与它前面最近未配对的if配对。
(2)关于switch语句有以下几点说明: 
① 每一个case的常量表达式的值必须互不相同,否则就会出现相互矛盾的现象。
② 各个case和default的出现次序不影响运行结果。
③ 在运行一个case分支后,如果想使流程跳出switch结构,可在相应语句后加
break来实现。最后一个default下面可以不加break语句。
3.4 拓展训练
1. 编写程序实现一个简单计算器:从键盘上输入数据并进行加、减、乘、除四则运算
(以“a运算符b”的形式输入),判断输入的数据是否可以进行计算,若能计算,则输出计算
结果。
2. 计算商品价值:某物品原有价值为p,由于使用其价值降低,价值的折扣率根据出
厂时间t(月数)确定如下: 
t<3 无折扣
3≤t<6 2%折扣
6≤t<12 5%折扣
12≤t<21 8%折扣
t≥21 10%折扣
ì
.
í
...
.
... 
编写程序,输入出厂时间和原有的价值计算物品的现有价值。
3. 简单自动售货机:设计一个自动售货机的程序,运行程序实现如下功能。
① 提示用户能够选择的商品内容及对应选项。
② 显示用户的选择结果,给出支付金额。
运行结果如图3.1所示。
图3.1 第3题运行结果
4. 编写程序,实现如下功能:一个成年人的身高与其父母的身高密切相关,根据以
60