1、1,第4章 选择结构程序设计,目前我们已经讲了顺序结构程序设计,实际生活中,若需要处理事情,往往会根据不同的情况,采取相应不同的处理措施。在程序设计中,这种算法表现为根据不同的判定条件,控制执行不同的程序流程。选择结构是程序结构中很重要的一种控制结构。在程序设计时,当需要进行选择、判断和处理的时候,就要用到选择结构。,2,要设计选择结构程序,要考虑两个方面的问题:,一、在C语言中如何来表示选择的条件?,二、在C语言中实现选择结构用什么语句?,在C语言中表示条件,一般用关系表达式或逻辑表达式,实现选择结构用if语句或switch语句。,我们今天要讲的主要内容如下:,4. if语句,4. swit
2、ch语句,4. 程序举例,3,4.1.1 if语句的形式,1. 单if语句 2. if-else语句 3. if-else if-else语句,4.1 if语句,4.1.2 if语句的嵌套,4,1.单if语句,(1)语句格式: if (表达式) 语句,(2)注意: 表达式即条件,一定要有括号,可以是任意类型的表达式,值为真或假; 语句可以是单语句也可以是语句块。,5,【例4.1】求两个整数a,b中较大者。,(1)算法分析:设三个变量a,b,max。 首先假设max=a,然后判断a,b,若a=b则max=b,最后输出max。,1.单if语句,6,(2)流程图描述:,1.单if语句,#includ
3、e “stdio.h“ void main( ) int a,b,max; printf(“a,b=“); scanf(“%d,%d“, ,7,2. if-else语句,(1)语句格式:if (表达式)语句1else语句2,(2)注意: if和else同属于一个if语句; 语句1和语句2可以是单语句也可以是语句块。,8,(1)算法分析: 设3个变量a,b,max。 首先输入a,b,然后判断a,b,较大者放在max中,最后输出max。,【例4.2】用if-else语句改写例4.1。,2. if-else语句,9,(2)流程图描述:,2. if-else语句,#include “stdio.h“
4、void main( ) int a,b,max;printf(“a,b=“);scanf(“%d,%d“, ,10,3.if-else if-else语句,(1)语句格式:if (表达式1)语句1else if (表达式2)语句2else if (表达式3)语句3else语句n,11,【例4.】根据成绩打印出等级。(0-59: 60-69: 70-79:C 80-89:B 90-100:A),算法分析:设成绩为score,假设取值在0-100之间,没 有错误的输入。60score0 E70score60 D80score70 C90score80 B100score90 A,3.if-els
5、e if-else语句,12,1 #include “stdio.h“ 2 void main( ) 3 /*E:0-59 D:60-69 C:70-79 B:80-89 A:90-100*/ 4 int score; 5 printf(“score= “ ); 6 scanf( “%d“ , 17 ,问题:条件表达式可否采用更简洁的形式?,3.if-else if-else语句,13,问题:条件表达式的先后可否任意?,3.if-else if-else语句,1 #include “stdio.h“ 2 void main( ) 3 /*E:0-59 D:60-69 C:70-79 B:80-
6、89 A:90-100*/ 4 int score; 5 printf(“score=“ ); 6 scanf( “%d“ , 17 ,14,注意条件的表示形式和顺序,3.if-else if-else语句,1 #include “stdio.h“ 2 void main( ) 3 /*E:0-59 D:60-69 C:70-79 B:80-89 A:90-100*/ 4 int score; 5 printf(“score=“ ); 6 scanf( “%d“ , 17 ,15,4.1.2 if语句的嵌套,1.嵌套的概念:在if语句中又包含一个或多个if语句。,2.嵌套的形式:if语句可以内
7、嵌在if子句中,又可以内嵌在else子句中。,例如:if ( )if ( )语句1else语句2elseif ( )语句3else语句4,16,【例4.4】猜数程序,和预定的数比较,并给出相应的提示。,4.1.2 if语句的嵌套,1 #include “stdio.h“ 2 void main( ) 3 int number=200; 4 int i; 5 scanf(“%d“, 13 ,17,1 #include “stdio.h“ 2 void main( ) 3 int a,b,c,max; 4 printf(“a,b,c=“); 5 scanf(“%d,%d,%d“, 14 ,说明:内
8、嵌的if语句既可以嵌套在if部分,也可以嵌套在else部分。,4.1.2 if语句的嵌套,【例4.5】求三个整数a,b,c中的最大数。,18,3. if 与else的配对规则: else总是与它上面最近的if配对。,特别注意: (1)要采用正确的缩进格式; (2)不易弄清的地方要加上 。,例4.5: 7 if (ab) 8 if (bc) 9 max=a; 10 else 11 if (ac) 12 max=b;,4.1.2 if语句的嵌套,例4.4: 6 if (inumber) 7 printf(“Its large!“); 8 else 9 if (inumber) 10 printf(
9、“Its small!“); 11 else 12 printf(“Its right!“);,19,问题,实现多分支结构的方法有哪些?,方法一: if-else if-else语句 方法二: if语句的嵌套,20,1 #include “stdio.h“ 2 void main( ) 3 int a,b,c,max; 4 printf(“a,b,c=“); 5 scanf(“%d,%d,%d“, 14 ,用if-else if-else语句改写例4.5。,21,比较,方法一:ifelse if语句不仅要对多个条件进行并列测试,而且程序描述不够简洁。 方法二:if语句的嵌套当分支较多时,嵌套的
10、if语句层数多,程序冗长而且可读性降低。初学者要尽量避免使用if语句的嵌套来解决多分支问题。,22,4.2 switch语句,1.语句格式: switch (表达式) case 常量表达式1:语句1case 常量表达式2:语句2case 常量表达式n:语句ndefault:语句n+1 ,23,switch (表达式) case 常量表达式1:语句1case 常量表达式2:语句2case 常量表达式n:语句ndefault:语句n+1 ,注意:1. 可以是整型或字 符型表达式;2. case后面必须是常量表达 式,不能包含变量;3. 每个常量表达式的值应互 不相同;4. case语句先后顺序随意
11、;5.若从上至下没有找到与表 达式的值相匹配的case,含有 default子句时,执行语句n+1。,4.2 switch语句,24,【例4.6】输入一个星期数字,输出其对应的英文单词 。,4.2 switch语句,1 #include “stdio.h“ 2 void main() 3 int a; 4 printf(“please input a week number:“); 5 scanf(“%d“, 15 16 ,25,注意使用break语句。程序修改如下:,4.2 switch语句,1 #include “stdio.h“ 2 void main() 3 int a; 4 prin
12、tf(“please input a week number:“); 5 scanf(“%d“, 15 16 ,26,【例4.7】输入任一平年的月份,输出该月份对应的 天数。,算法分析:设月份为month,天数为daymonth=1,3,5,7,8,10,12 day=31month=4,6,9,11 day=30month=2 day=28,注意:当多个常量表达式都执行同一组语句时,可将它们集中写在一起。,问题:怎样使得 case语句数目较少?,4.2 switch语句,#include “stdio.h“void main() int month,day;printf(“please in
13、put month:“);scanf(“%d“, ,27,if-else if-else语句与switch语句的区别,if-else if-else 语句:用于多条件并列测试,从中取一的情形; switch语句:用于单条件测试,从其多种结果中取一的情形。,1 #include /*例4.7*/ 2 main() 3 int month,day; 4 printf(“ please input month: “); 5 scanf(“%d“, 15 ,1 #include “stdio.h “ /*例4.3*/ 2 void main( ) 3 int score; 5 printf(“scor
14、e=“ ); 6 scanf( “%d“ , 17 ,28,【例4.8】输入三个整数,输出最大数和最小数。,4.3 程序举例,1 #include “stdio.h“ 2 void main( ) 3 4 int a,b,c,max,min; 5 printf(“a,b,c=“); 6 scanf(“%d,%d,%d“, 17 ,29,【例4.9】计算器程序。用户输入运算数和四则运算符,输出计算结果。,4.3 程序举例,1 #include “stdio.h“ 2 void main( ) 3 4 float a,b; 5 char c; 6 printf(“请输入运算数和四则运算符如a+(-
15、,*,/)b:“); 7 scanf(“%f%c%f“, 15 16 ,30,【例4.10】求一元二次方程ax2+bx+c=0的根。,4.3 程序举例,分析:一元二次方程的根有下列情况:当a=0,b=0时,方程无解;当a=0,b0时,方程只有一个实根-c/b;当a0时,方程的根为x = 其中,当b24ac0时有两个实根;当b24ac0时有两个虚根。,31,4.3 程序举例,我们把上述描述用流程图表示,逻辑关系更为清晰。,32,4.3 程序举例,#include “stdio.h“#include “math.h“void main( ) float a,b,c,disc,x1,x2,realp
16、art,imagpart;printf(“a,b,c=“);scanf(“%f,%f,%f“, ,else realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf(“方程有两个虚根!n“); printf(“x1=%8.4f+%8.4fin“, realpart,imagpart); printf(“x2=%8.4f-%8.4fin“, realpart,imagpart); ,33,4.3 程序举例,注意: (1)disc代表b24ac,realpart代表实部,imagpart代表虚部,以增加可读性。 (2)由于a,b,disc(即b24ac)为实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:if (a=0.0) 。所以采取的办法是判别a的绝对值fabs(a)是否小于一个很小的数(如10-6),如果小于此数,就认为a=0。,