《第4章选择结构程序设计》由会员分享,可在线阅读,更多相关《第4章选择结构程序设计(33页珍藏版)》请在金锄头文库上搜索。
1、第第4章章 选择结构程序设计选择结构程序设计本章要点:本章要点:if语句语句if语句的嵌套语句的嵌套条件运算符条件运算符switch语句语句选择结构程序设计选择结构程序设计学习方法建议:学习方法建议:学习本章内容应重点掌握学习本章内容应重点掌握if语句的执行过程,在此基础语句的执行过程,在此基础上,掌握上,掌握if语句、语句、switch语句格式及应用,学会编写选择结语句格式及应用,学会编写选择结构程序。本章的难点是构程序。本章的难点是if语句的嵌套和语句的嵌套和switch语句的应用。语句的应用。4.1 引例引例1问题描述问题描述学生助学金评定学生助学金评定助学金是高等院校资助贫困学生的一项
2、重要举措,助学金是高等院校资助贫困学生的一项重要举措,一般助学金的评定要参考学生的学习成绩。假定助一般助学金的评定要参考学生的学习成绩。假定助学金的评选规则为:综合平均成绩在学金的评选规则为:综合平均成绩在90分及以上的分及以上的同学可获一等助学金;在同学可获一等助学金;在 80分(包括分(包括80分)至分)至90分分之间的同学可获二等助学金;在之间的同学可获二等助学金;在60分(包括分(包括60分)分)至至80的同学可获三等助学金;的同学可获三等助学金;60分以下的同学不能分以下的同学不能获助学金。获助学金。2引例分析引例分析首先用最简单的方式处理评定结果:根据某位同学首先用最简单的方式处理
3、评定结果:根据某位同学的成绩判断他能否获取助学金,输出不获得助学金的成绩判断他能否获取助学金,输出不获得助学金的提示信息,算法的流程图如图的提示信息,算法的流程图如图4-1所示。所示。3程序代码程序代码 实现引例算法的程序代码:实现引例算法的程序代码:#includemain() int score; printf(input score:); scanf(%d,&score); if (score60) printf(No grant!n);4.2 if语句语句4.2.1 if语句语句 1第一种格式第一种格式格式:格式:if (表达式表达式) 语句语句1 ;功能:首先计算表达式的值,若值为功
4、能:首先计算表达式的值,若值为“真真”(非(非0),),则执行语句则执行语句1;表达式的值为;表达式的值为“假假”(0),则直接转),则直接转到此到此if语句的下一条语句去执行。语句的下一条语句去执行。(1)if语句中的语句中的“表达式表达式”必须用必须用“( )”括起来。括起来。(2)当)当if(表达式)后面的语句,仅由一条语句构成(表达式)后面的语句,仅由一条语句构成时,可不使用大括号时,可不使用大括号,但是语句但是语句1由两条或两条以上语由两条或两条以上语句构成句构成,就必须用大括号就必须用大括号“ ”括起来构成复合语句。括起来构成复合语句。图4-2 if4-2 if语句第一种格式流程句
5、第一种格式流程图main() int a,b,x; scanf(a=%d,b=%d,&a,&b); if (ab)x=a; a=b; b=x; /*交换交换a与与b单元的内容单元的内容*/ printf(a=%d,b=%d,a,b);第一次运行结果为:第一次运行结果为: 输入输入a=10,b=20 a=20,b=10 第二次运行结果为:第二次运行结果为: 输入输入a=30,b=5 a=30,b=5【例例4.1】比较两个数比较两个数,按由大到小输出。按由大到小输出。if(表达式表达式) 语句语句1;else 语句语句2;功能:计算表达式的值,若表达式的值为功能:计算表达式的值,若表达式的值为“真
6、真”(非(非0或或T),则),则执行语句执行语句1;表达式的值为;表达式的值为“假假”(0或或F),则执行语句),则执行语句2。2第二种格式第二种格式【例例4.2】 由由4.1节引例可知,当输入一个大于节引例可知,当输入一个大于60分的成绩,程分的成绩,程序无任何显示。因此,有必要进一步补充助学金评定结果的信息,序无任何显示。因此,有必要进一步补充助学金评定结果的信息,无论结果如何,都给出提示信息。程序代码修改如下:无论结果如何,都给出提示信息。程序代码修改如下:#includemain() int score; printf(input score:); scanf(%d,&score);
7、if (score60) printf(Sorry! You dont get a grant.n ); else printf(Congratulations! You may get grant money. n); 【例例4.3】 从两个数中找出较大的数。从两个数中找出较大的数。#includemain() int a,b,max; printf(input two scores: ); scanf(%d%d,&a,&b); if (ab) max=a; else max=b; printf(max=%dn,max); 运行结果为:Please input three numbers:6
8、 ,9 ,13max=13main() int num1,num2,num3,max; printf(Please input three numbers:); scanf(%d,%d,%d,&num1,&num2,&num3); if (num1num2) max=num1; else max=num2; if (num3max) max=num3; printf(The three numbers are:%d,%d,%dn,num1,num2,num3); printf(max=%dn,max); 【例例4.4】 输入任意三个整数输入任意三个整数num1、num2、num3,求三个数中的
9、最大值。,求三个数中的最大值。if (表达式表达式1) 语句语句1;else if (表达式表达式2) 语句语句2;else if (表达式表达式3) 语句语句3;else if (表达式表达式n) 语句语句n;else 语句语句 n+1;3第三种格式第三种格式图图4-3 if语句第三种格式流程图语句第三种格式流程图【例例4.5】 使用使用if-else语句完善了助学金评定引例,实际上引例显示的信息语句完善了助学金评定引例,实际上引例显示的信息仍然有限。我们希望依据某位同学的成绩,程序可以判断出他能否获取助学仍然有限。我们希望依据某位同学的成绩,程序可以判断出他能否获取助学金,而且还可以详细地
10、显示助学金的等级。引例的程序代码修改如下:金,而且还可以详细地显示助学金的等级。引例的程序代码修改如下:#includemain() int score; printf(input a score(0100):); scanf(%d,&score); if (score=90) /*90分及以上为一等助学金分及以上为一等助学金*/ printf(Grant grade : 1n); else if (score=80) /*80分(包括分(包括80分)至分)至90分之间为二等助学金分之间为二等助学金*/ printf(Grant grade: 2n); else if (score=60) /
11、*60分(包括分(包括60分)至分)至80为三等助学金为三等助学金*/ printf(Grant grade : 3n); else /*60分以下不能获取助学金分以下不能获取助学金*/ printf(No grant!n); 【例例4.6】 输入一个字符,判定它的类别,比如是数字、小写字母、输入一个字符,判定它的类别,比如是数字、小写字母、大写字母、控制字符或其他字符。大写字母、控制字符或其他字符。#includemain() char c; printf(input a character: ); c=getchar(); if(c=0&c=A&c=a&c=z) /*判定是否为小写字母判定
12、是否为小写字母*/ printf(This is a small lettern); else /*判定是否为其他字符判定是否为其他字符*/ printf(This is an other charactern); if语句中又包含一个或多个语句中又包含一个或多个if语句称为语句称为if语句语句的嵌套。一般形式为:的嵌套。一般形式为:if()() if()() 语句语句1; else 语句语句2 ;else if()() 语句语句3; else 语句语句4;4.2.2 if语句的嵌套语句的嵌套【例例4.7】 使用嵌套的使用嵌套的if语句实现相同的功能,首先根据成绩的取值范围语句实现相同的功能,
13、首先根据成绩的取值范围处理分为两种情况:有或者没有助学金,如果有则进一步判别等级是一等、处理分为两种情况:有或者没有助学金,如果有则进一步判别等级是一等、二等或三等助学金。二等或三等助学金。#includemain() int score; printf(input score value between 0 and 100: ); scanf(%d,&score); if (score=60) if (score80) printf(Grant grade: 3n); else if (score90) printf(Grant grade: 2n); else printf(“Grant
14、grade: 1n”); else printf(No grant!n); 【例例4.8】 if语句的嵌套应用。语句的嵌套应用。#includemain() int a,b; printf(input a,b=); scanf(%d,%d,&a,&b); if (ab) printf(ab n); else /*此此else与距离它最近的与距离它最近的if(ab)配对配对*/ if(ab) printf(ab ? a : b当当a=2 b=1 时,时,x=2 条件运算符的优先级,高于赋值运算符,但低于关系运算符条件运算符的优先级,高于赋值运算符,但低于关系运算符和算术运算符。其结合性为和算术运
15、算符。其结合性为“从右到左从右到左”(即右结合性)。(即右结合性)。例如:例如:x= ab? a : (cd ? c : d)当当a=1 b=2 c=3 d=4时时 x=44.2.3 条件运算符条件运算符【例例4.9】 从键盘上输入一个字符,如果它是大写字母,则把从键盘上输入一个字符,如果它是大写字母,则把它转换成小写字母输出;否则,直接输出。它转换成小写字母输出;否则,直接输出。#includemain() char ch; printf(Input a character: ); scanf(%c,&ch); /*输入一个字符输入一个字符*/ ch=(ch=A&ch=Z)?(ch+32):
16、ch; /*若是大写字母则若是大写字母则转换成小写字母,否则直接输出转换成小写字母,否则直接输出*/ printf(ch=%cn,ch); 4.3 switch语句语句语言还提供了另一种用于多分支选择的语言还提供了另一种用于多分支选择的switch语句,这语句,这种语句把一个表达式的值和一个整数或字符常量表中的元素逐种语句把一个表达式的值和一个整数或字符常量表中的元素逐一比较,发生匹配时,与匹配常数关联的语句被执行。一比较,发生匹配时,与匹配常数关联的语句被执行。switch语句的一般形式:语句的一般形式:switch(表达式表达式)case 常量表达式常量表达式1:语句:语句1;break;
17、 case 常量表达式常量表达式2:语句:语句2;break; . case 常量表达式:语句常量表达式:语句n;break; default:语句:语句n+1;break; 【例例4.10】 使用使用swicth语句实现语句实现“助学金评定助学金评定”引例的编程,完成助学金等级的判引例的编程,完成助学金等级的判别。别。#includemain() int score; printf(input score value between 0 and 100: ); scanf(%d, &score); switch (score/10) case 10: case 9: printf(Grant
18、 grade: 1n); break; case 8: printf(Grant grade:2n); break; case 7: case 6: printf(Grant grade 3n); break; case 5: case 4: case 3: case 2: case 1: case 0: printf(No grant!n); break; default: printf(The score is out of range!n);4.4 程序设计举例程序设计举例【例例4.11】有一函数有一函数 ,输入,输入x值,输出对应的值,输出对应的y值。值。main() int x,y;
19、printf(input x:);scanf(%d,&x);if(x1) y=x;else if(x10) /*此时此时x1在判断在判断x10则相当于满足条件则相当于满足条件(1x10)*/ y=2*x-1;else y=3*x+1; /*前面判断前面判断x不小于不小于1,也不小于也不小于10即满足条件即满足条件x10*/printf(y=%dn,y);运行结果为:运行结果为:input x:5 y=9【例例4.12】 已知三角形的三条边长已知三角形的三条边长a、b、c,求三角形面积。计算三角形面积,求三角形面积。计算三角形面积的海伦公式为:的海伦公式为: ,其中,其中s = (a+b+c)/
20、2。#include#includemain() float a,b,c,s,area; printf(Plese input three sides of triangle:n); scanf(%f,%f,%f,&a,&b,&c); /*输入三角形的三条边长输入三角形的三条边长a,b,c*/ if (a+bc & a+cb & b+ca) /*是否满足三角形的条件是否满足三角形的条件*/ s=1.0/2*(a+b+c); /*计算三角形周长的一半计算三角形周长的一半*/ area=sqrt(s*(s-a)*(s-b)*(s-c); /*利用海伦公式计算三角形面积利用海伦公式计算三角形面积*/
21、 printf(a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2fn,a,b,c,s); printf(area=%.2fn,area); /*输出三角形面积输出三角形面积*/ else /*如果不满足三角形条件,则输出三角形的边值出错如果不满足三角形条件,则输出三角形的边值出错*/ printf(The value of triangle sides error!); 【例例4.13】 输入一个数,判断它是奇数还是偶数,如果是输入一个数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为奇数则进一步判断它是否为3的倍数。的倍数。#includemain( ) int x; sc
22、anf (%d,&x); if (x%2!=0) /*判断判断x是否为奇数是否为奇数*/ printf(%d is an odd n,x) ; if (x%3=0) /*判断判断x是否是是否是3的倍数的倍数*/ printf(%d is the times of 3 n,x) ; else printf(%d is an even n,x) ; 【例例4.14】 求一元二次方程求一元二次方程ax2+bx+c=0的解(的解(a0)。)。#include#includemain() float a,b,c,disc,x1,x2,p,q; scanf(%f,%f,%f, &a, &b, &c); /
23、*输入一元二次方程的系数输入一元二次方程的系数a,b,c*/ disc=b*b-4*a*c; if (fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a); /*求出两个不相等的实根求出两个不相等的实根*/ x2=(-b-sqrt(disc)/(2*a); printf(x1=%7.2f,x2=%7.2fn, x1, x2); else p=-b/(2*a); /*求出两个共轭复根求出两个共轭复根*/ q=sqrt(fabs(disc)/(2*a); printf(x1=%7.2f + %7.2f in, p, q);/*输出两个共轭复根输出两个共轭复根*/ prin
24、tf(x2=%7.2f - %7.2f in, p, q); 能被能被4整除,但不能被整除,但不能被100整除。整除。 能被能被400整除。整除。main() int year; printf(Please input the year:); scanf(%d,&year); if (year%4=0 & year%100!=0)|(year%400=0) printf(%d is a leap year.n,year); else printf(%d is not a leap year.n,year); 【例例4.15】判别某一年是否为闰年。判断闰年的条件为下面二者之一:判别某一年是否为闰
25、年。判断闰年的条件为下面二者之一:运行结果为:运行结果为:输入输入1989 1989 is not a leap year.输入输入2000 2000 is a leap year.上机实验上机实验1熟练掌握熟练掌握if语句的基本结构;语句的基本结构;2学会利用学会利用if语句编写选择结构程序;语句编写选择结构程序;3学会利用学会利用switch语句编写选择结构语句编写选择结构程序。程序。一、实验目的一、实验目的1验证性实验验证性实验1)以下程序实现计算两个数的商,请验证程序运行结果。)以下程序实现计算两个数的商,请验证程序运行结果。#include main() int a,b; print
26、f(“Input two int number:n”); scanf(“%d%d”,&a,&b); if (b=0) printf(Divided by zeron); else printf(“%fn”,1.0*a/b); 二、实验内容二、实验内容2)程序改错)程序改错 #include main() int x,y; printf(“Input int number x:n”); scanf(“%d”,&x); if (x*x-100) y=x*x; printf(y=%dn,y); else y=-x*x; printf(y=%dn,y); x 2 (x2-100) -x2 (x2-10
27、0)y= 2设计性实验设计性实验 1)请将以下语句改写成)请将以下语句改写成switch语句。语句。 if (score=90) | score =100) grade=5; else if (score=80) grade=4; else if (score=70) grade=3; else if (score=60) grade=2; else grade=1;2)下面程序实现输入的)下面程序实现输入的3个整数按从大到小的顺序输出,程个整数按从大到小的顺序输出,程序空白的地方填上适当的语句或语句体。序空白的地方填上适当的语句或语句体。#include main() int a,b,c,t
28、; printf(“Input three integers: n”); scanf(“%d%d%d”, ); if (ab) ; /*交换交换a、b的值的值*/ if (ac) ; /*交换交换a、c的值的值*/ if (bc) ; /*交换交换b、c 的值的值*/ printf(“Big to small is %5d%5d%5d:n”,a,b,c); 3)制作学生成绩管理系统菜单)制作学生成绩管理系统菜单使用使用switch语句制作学生成绩管理系统菜单。该系统实现对某班语句制作学生成绩管理系统菜单。该系统实现对某班某门课程成绩的简单管理,基本功能有三项:录入学生成绩;统某门课程成绩的简单管理,基本功能有三项:录入学生成绩;统计平均成绩;将成绩由低到高排序。系统的操作界面用一个非常计平均成绩;将成绩由低到高排序。系统的操作界面用一个非常简朴的菜单描述,如图所示简朴的菜单描述,如图所示。