第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