第4章选择结构程序设计_第1页
第4章选择结构程序设计_第2页
第4章选择结构程序设计_第3页
第4章选择结构程序设计_第4页
第4章选择结构程序设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第4章章 选择结构程序设计选择结构程序设计学习要求:学习要求:1. 熟悉选择控制结构熟悉选择控制结构2. 熟悉关系运算符及表达式求值、逻辑运算符及表达熟悉关系运算符及表达式求值、逻辑运算符及表达式求值式求值3. 掌握掌握ifelse语句的语法及应用语句的语法及应用4. 掌握掌握switch语句的语法及应用语句的语法及应用5. 熟悉条件运算符及表达式求值熟悉条件运算符及表达式求值5. 熟悉选择结构程序设计的典型应用熟悉选择结构程序设计的典型应用 C语言有两种选择语句语言有两种选择语句:(1)if语句语句,实现两个分支的选择结构,实现两个分支的选择结构(2)switch语句语句,实现多分支的选择

2、结构,实现多分支的选择结构 例例4.1 在例在例3.5的基础上对程序进行改进。题目要求的基础上对程序进行改进。题目要求是是求求 方程的根。方程的根。由键盘输入由键盘输入a,b,c。假设。假设a,b,c的值任意,并不保的值任意,并不保证证 。需要在程序中进行判别,如果。需要在程序中进行判别,如果 ,就,就计算并输出方程的两个实根,计算并输出方程的两个实根,否则否则就输出就输出“方程无实根方程无实根”的的信息。信息。 02cbxax042 acb042 acb 解题思路:解题思路:输入输入a,b,c计算计算discdiscb,交换交换a , b ,否则不交换,否则不交换S3: 顺序输出顺序输出a,

3、b 解题思路:解题思路:S1: if ab,a和和b对换对换 (a是是a、b中的小者)中的小者)S2: if ac,a和和c对换对换 (a是三者中最小者)是三者中最小者)S3: if bc,b和和c对换对换 (b是三者中次小者是三者中次小者)S4: 顺序输出顺序输出a,b,c 例例4.3 输入输入3个数个数a,b,c,要求按由小到大的顺,要求按由小到大的顺序输出。序输出。if语句的三种形式语句的三种形式 形式一:形式一: 格式:格式:if (表达式表达式) 语句语句 执行过程:执行过程:表达式表达式语句语句非非0=0例:例:if (xy) printf(“%d”,x);表达式表达式语句语句1语

4、句语句2非非0=0l 形式二形式二:u格式格式:if (表达式表达式) 语句语句1 else 语句语句2u执行过程:执行过程:例:例:if (xy) max=x; else max=y;4.2.2 if 语句语句形式三:形式三: 格式格式:if ( 表达式表达式1 ) 语句语句1else if (表达式表达式2 ) 语句语句2else if (表达式表达式3 ) 语句语句3. else 语句语句n expr1statemnt1非非0=0expr2expr3statemntnstatemnt3statemnt2非非0非非0=0=0u执行过程:执行过程: 例:例:if (number500) co

5、st=0.15; else if (salary300) cost=0.10; else if (salary100) cost=0.075; else if (salary50) cost=0.05; else cost=0; 说明:说明:1、if 语句后面的表达式,一般为逻辑表达式或关系表达式,但语句后面的表达式,一般为逻辑表达式或关系表达式,但 也可是任意的类型。也可是任意的类型。2、else 不能作为单独的语句使用,必须和不能作为单独的语句使用,必须和if 配对使用。配对使用。3、在、在 if 和和 else只能控制其后的一条语句,如果是多条语只能控制其后的一条语句,如果是多条语 句,

6、应句,应该用该用 括起来成为一个括起来成为一个复合语句复合语句。4、if 语句中又包含一个或多个语句中又包含一个或多个 if 语句。从最内层开始,语句。从最内层开始,else 总总是与它是与它上面最近的未曾配对的上面最近的未曾配对的 if 配对配对。5、为避免错用,最好使、为避免错用,最好使 if 和和 else 数目相同,也可用数目相同,也可用 来确定。来确定。 4.3.1关系运算符及其优先次序关系运算符及其优先次序4.3.2 关系表达式关系表达式4.4.1 逻辑运算符及其优先次序逻辑运算符及其优先次序4.4.2 逻辑表达式逻辑表达式三、条件运算符:三目运算符三、条件运算符:三目运算符 一般

7、形式:一般形式: expr1 ? expr2 : expr3 执行过程执行过程 功能:相当于条件语句,但不能取代一般功能:相当于条件语句,但不能取代一般if语句语句例例 if (ab) printf(“%d”,a); else printf(“%d”,b);printf(“%d”,ab?a:b);例例 求求 a+|b| printf(“a+|b|=%dn”,b0?a+b:a-b);expr1取取expr2值值取取expr3值值非非0=0例例 (a=b)?Y:N (x%2=1)?1:0 (x=0)?x:-x (c=a & c0?1:(xb?a:cd?c:d ab?a:(cd?c:d) 例

8、例4.4 输入一个字符,判别它是否大写字母,如输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。换。然后输出最后得到的字符。 解题思路:用条件表达式来处理,当字母是大解题思路:用条件表达式来处理,当字母是大写时,转换成小写字母,否则不转换写时,转换成小写字母,否则不转换大写转小写:大写转小写: ch=(ch=A & ch=Z)?(ch+32):ch 在在if语句中又包含一个或多个语句中又包含一个或多个if语句称为语句称为if语句语句的嵌套的嵌套 一般形式:一般形式:if( ) if( ) 语句

9、语句1 else 语句语句2 else if( ) 语句语句3 else 语句语句4 内嵌内嵌ifelse总是与它上面最总是与它上面最近的未配对的近的未配对的if配对配对 在在if语句中又包含一个或多个语句中又包含一个或多个if语句称为语句称为if语句语句的嵌套的嵌套if () if () 语句语句1 else语句语句2内嵌内嵌if 限定了内嵌限定了内嵌if范围范围例:请分析下列例:请分析下列ifelse的配对情况的配对情况 if () if () 语句语句1 elseif () 语句语句2else 语句语句3 if () if () if () 语句语句1 else 语句语句2 else语句

10、语句2规范书写后一目了然:规范书写后一目了然: if () if () 语句语句1 else if () 语句语句2 else 语句语句3 if () if () if () 语句语句1 else 语句语句2 else 语句语句2 为了使程序清晰、易读,写程序时对选择和循环结构应为了使程序清晰、易读,写程序时对选择和循环结构应采用锯齿形的缩进形式。采用锯齿形的缩进形式。 例例4.5有一函数有一函数: 编一程序编一程序,输入一个输入一个x值值,要求输出相应的要求输出相应的y值。值。)0(1)0(0)0(1xxxy 解题思路:解题思路: 用用if语句检查语句检查x的值,根据的值,根据x的值决定赋予

11、的值决定赋予y的的值值 由于由于y的可能值不是两个而是三个,因此不的可能值不是两个而是三个,因此不可能只用一个简单的可能只用一个简单的(无内嵌无内嵌if)的的if语句来实语句来实现现 解题思路:解题思路:方法方法1(1) 先后用先后用3个独立的个独立的if语句处理:语句处理:输入输入x若若 x 0, 则则y = 1输出输出x和和yscanf(%d,&x);if(x0) y = 1;printf(x=%d,y=%dn,x,y); 解题思路:解题思路:方法方法2(2) 用一个嵌套的用一个嵌套的if语句处理:语句处理:输入输入x若若x 0, 则则y = -1 否则否则 若若 x = 0, 则

12、则y = 0 否则否则 y = 1输出输出x和和yscanf(%d,&x);if(x0) y=-1;else if(x=0) y=0; else y=1;printf(x=%d,y=%dn,x,y); 解题思路:解题思路:方法方法2(2) 用一个嵌套的用一个嵌套的if语句处理:语句处理:输入输入x若若x 0, 则则y = -1 否则否则 若若 x = 0, 则则y = 0 否则否则 y = 1输出输出x和和yscanf(%d,&x);if(x=0) if (x0) y=1; else y=0;else y=-1;printf(x=%d,y=%dn,x,y);提倡提倡内嵌内嵌if

13、放在放在else中中 switch语句用来实现多分支选择结构语句用来实现多分支选择结构 学生成绩分类学生成绩分类85分以上为分以上为A等等7084分为分为B等等6069分为分为C等等 人口统计分类人口统计分类 按年龄分为老、中、青、少、儿童按年龄分为老、中、青、少、儿童 例例4.6 要求按照考试成绩的等级输出百分制分要求按照考试成绩的等级输出百分制分数段,数段,A等为等为85分以上,分以上,B等为等为7084分,分,C等为等为6069分分 ,D等为等为 60分以下分以下 。成绩的等级由键盘。成绩的等级由键盘输入。输入。 解题思路:解题思路: 判断出判断出这是一个多分支选择问题这是一个多分支选择

14、问题 根据百分制分数将学生成绩分为根据百分制分数将学生成绩分为4个等级个等级 如果用如果用if语句语句,至少要用至少要用3层嵌套的层嵌套的if,进行,进行3次检查判断次检查判断 用用switch语句进行一次检查即可得到结果语句进行一次检查即可得到结果 switch语句的作用是根据表达式的值,使流程跳转语句的作用是根据表达式的值,使流程跳转到不同的语句到不同的语句 switch语句的一般形式语句的一般形式:switch(表达式表达式) case 常量常量1 :语句:语句1 case 常量常量2 :语句:语句2 case 常量常量n :语句:语句n default : 语句语句n+1整整型或型或字

15、符型字符型常量、变量或表常量、变量或表达式达式必须为简单必须为简单整整型或型或字符型字符型的常的常量,不能是变量或表达式;各量,不能是变量或表达式;各常量必须互不相同。常量必须互不相同。 scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n

16、); scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); scanf(%c,&grade); printf(Your score:); switch(grade) case A: case B: case C: printf(

17、6069n);break; case D: printf(60n);break; default: printf(enter data error!n); 例例4.8 写一程序,判断某一年是否闰年。写一程序,判断某一年是否闰年。 解题思路:在前面已介绍过判别闰年的方法解题思路:在前面已介绍过判别闰年的方法 本例本例用不同的方法编写程序用不同的方法编写程序 用变量用变量leap代表是否闰年的信息。若闰年,令代表是否闰年的信息。若闰年,令leap=1;非闰年,;非闰年,leap=0。最后判断。最后判断leap是否为是否为(真),若是,则输出(真),若是,则输出“闰年闰年”信息信息 参见教材参见教材

18、图图4.13#include int main()int year,leap; printf(enter year:); scanf(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;标志变量标志变量与与if (leap!=0)含义相同含义相同#inc

19、lude int main()int year,leap; printf(enter year:); scanf(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;采取锯齿形式采取锯齿形式#include int main()int year,leap

20、; printf(enter year:); scanf(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;if(year%4!=0) leap=0;else if (year%100!=0) leap=1;else if(year%400!=0) l

21、eap=0;else leap=1;#include int main()int year,leap; printf(enter year:); scanf(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;if(year%4=0 & year

22、%100!=0) | (year%400=0) leap=1;else leap=0; 例例4.9 求求 方程的解。方程的解。02cbxax解题思路:解题思路:处理以下各情况处理以下各情况 ,不是二次方程,不是二次方程 ,有两个相等实根,有两个相等实根 ,有两个不等实根。,有两个不等实根。 ,有两个共轭复根。,有两个共轭复根。 应当以应当以p+qi和和p-qi的形式输出复根的形式输出复根 其中,其中,p=-b/2a,q=( )/2a参见教材参见教材图图4.14042 acb042 acb042 acbacb42例例4.10 求三角形的面积。求三角形的面积。#include #include /

23、使用数学函数时要包含头文件使用数学函数时要包含头文件math.hint main( ) double a,b,c; printf(please enter a,b,c: ); scanf(%f%f%f,&a,&b,&c); if (a+bc & b+ca & c+ab) /复合语句开始复合语句开始 double s,area; /在复合语句内定义变量在复合语句内定义变量 s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c); printf(area=%.4fn,area); /指定输出的数包含指定输出的数包含4位位小数小数

24、 /复合语句结束复合语句结束else printf(it is not a trilateral!n);return 0;例例4.12 输入两个整数,输出其中的较大数。输入两个整数,输出其中的较大数。【任务要求任务要求】掌握求最值的算法,以及掌握求最值的算法,以及if语句实现双分支结构的应用。语句实现双分支结构的应用。输入数据输入数据x,yYNxy输出输出 max 的值的值max=ymax=xNoYesxy输入输入x,y开始开始max=y输出输出max结束结束(a) 案例案例3.1的流程图的流程图(b) 案例案例3.1的的N-S图图max=x例例4.12 4.12 的算法描述的算法描述【程序详

25、解程序详解】/*ex4-12.c 求两个数的最大数求两个数的最大数 */#include void main()int x , y,max; printf(请输入两个整数请输入两个整数 :); scanf(%d%d , &x , &y );if(xy) /判断条件判断条件max=x ;elsemax=y ;printf(max is : %dn , max ); /输出输出max【思考思考】 求求3个数中的最大数个数中的最大数/最小数最小数或求或求4个数中的最大数个数中的最大数/最小数最小数如何实现?如何实现? 例例4.14 计算以下分段函数的值。计算以下分段函数的值。【目的目的】掌握掌握ifelse构造多分支选择结构的算法构造多分支选择结构的算法【算法分析算法分析】 (1 1)输入)输入x x的值的值 (2 2) if(xif(x1) , y1) , y的值为的值为x x ,执行,执行(5)(5),否则执行,否则执行(3)(3) (3 3) if(xif(x10) 10) ,y y的值为的值为2 2* *x-1x-1,执行,执行(5)(5),否则执行,否则执行(4)(4) (4 4) y y的值为的值为3 3* *x-11x-11 (5 5) 输出输出y y的值的值【程序祥解程序祥解】 /*ex4-14.c 求解分段函数求解分段函数*/# includ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论