c语言学习,c语言课件第04章.ppt

上传人:sccc 文档编号:5344729 上传时间:2023-06-28 格式:PPT 页数:39 大小:190.51KB
返回 下载 相关 举报
c语言学习,c语言课件第04章.ppt_第1页
第1页 / 共39页
c语言学习,c语言课件第04章.ppt_第2页
第2页 / 共39页
c语言学习,c语言课件第04章.ppt_第3页
第3页 / 共39页
c语言学习,c语言课件第04章.ppt_第4页
第4页 / 共39页
c语言学习,c语言课件第04章.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《c语言学习,c语言课件第04章.ppt》由会员分享,可在线阅读,更多相关《c语言学习,c语言课件第04章.ppt(39页珍藏版)》请在三一办公上搜索。

1、第4章 选择结构程序设计,4.1 if语句4.2 switch语句4.3 选择结构程序设计举例,本章学习目标熟悉if语句的格式及应用的几种形式掌握if语句嵌套应用的方法掌握条件运算符的应用掌握switch语句的格式及应用掌握选择结构程序的设计方法,Return,4.1 if语句,if语句又叫条件语句,它是通过判别条件是否成立,来决定程序的流程(在可能执行的两个流程中选择执行其中的一个)。1.if语句的一般格式 if(表达式)语句组1 else 语句组2如:if(a=b)printf(“%d”,a);else printf(“%d”,b);,2.if语句的三种形式形式一:(缺省else子句时)格

2、式:if(表达式)语句当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句,否则直接转向执行下一条。如图4-1所示。例如:if(xy)printf(max=%d,x);,形式二:(指定else子句时)格式:if(表达式)语句1 else 语句2当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,然后转向下一条语句;否则,执行语句组2。如图4-2所示。例如:if(xy)printf(max=%d,x);else printf(max=%d,y);,形式三:(if语句嵌套)格式:if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3.els

3、e if(表达式m)语句m else 语句n,例如:if(number500)const=0.15;else if(number300)const=0.10;else if(number100)const=0.075;else if(number50)const=0.05;else const=0;,说明:(1)if(表达式)中的“表达式”一般为逻辑表达式或关系表达式,如:if(a=b,(2)“语句组1”和“语句组2”,可以只包含一个简单语句,也可以是复合语句。复合语句须在其第一个语句前用左花括号“”开头,最后一个语句后以右花括号“”结尾,如:if(a+bc,【例4-1】输入任意三个整数,求三

4、个数中的最大值。【思路导航】定义三个变量num1、num2、num3,分别表示从键盘输入的任意三个数,再定义变量max表示三个数中的最大值。首先取一个数预置为max(最大值),然后再用max依次与其余的数逐个比较,如果发现有比max大的,就用它给max重新赋值,比较完所有的数后,max中的数就是最大值。对从3个或3个以上的数中找最大值的处理,上述方法是非常好用的。程序如下:,单击此处,/*exam4_1*/int main(void)int num1,num2,num3,max;printf(Please input three numbers:);scanf(%d,%d,%d,演示,屏幕显示

5、运行结果为:,Please input three numbers:35,100,85The three numbers are:35,100,85max=100,【例4-2】输入任意三个数num1、num2、num3,按从小到大的顺序排序输出。【思路导航】编程思路与例4-2基本上相同。不同的是:由于本例题要求将所输入的三个数按从小到大的顺序排序输出,故在比较大小时要注意小数排在前,大数排在后,位置不符时要交换两数的位置。程序如下:/*exam4_2*/int main(void)int num1,num2,num3,temp;printf(Please input three numbers

6、:);scanf(%d,%d,%d,演示,屏幕显示运行结果为:,Please input three numbers:35,100,85Three numbers after sorted:35,85,100,3if语句的嵌套 if语句允许嵌套。(1)if语句的嵌套形式 所谓if语句的嵌套是指:if语句中包含另一个if语句,即:在“语句组1”或(和)“语句组2”中,又包含有if语句的情况。if语句的嵌套的一般形式:if(表达式1)if(表达式2)语句组1/*内嵌if语句*/else 语句组2else if(表达式3)语句组3/*内嵌if语句*/else 语句组4,(2)if语句的嵌套与嵌套匹配

7、原则 if语句嵌套时,从最内层开始,else总是与它上面距它最近、且尚未匹配的if配对。为明确匹配关系,避免if与else配对错位的最佳办法是将内嵌的if语句,一律用花括号括起来。为了便于阅读,使用适当的缩进,此时大括号能保证if和else不错位配对,而且适当的缩进便于阅读程序。例如以下两组循环的嵌套因加入大括号后,所表示的含义不同。,if()if()if()语句1 if()语句1else else 语句2 语句2,加改变配对关系:,【例4-3】有一函数如下,编程实现:输入一个x值,即可输出y值。下面以if语句嵌套的不同的方法来编写程序。,方法一:/*exam431*/int main(voi

8、d)int x,y;scanf(%d,演示,屏幕显示运行结果为:,35x=35,y=1,方法二:/*exam432*/int main(void)int x,y;scanf(%d,演示,屏幕显示运行结果为:,-35x=-35,y=-1,35x=35,y=-1,0 x=0,y=0,方法三:/*exam433*/int main(void)int x,y;scanf(%d,方法四:/*exam434*/int main(void)int x,y;scanf(%d,4.条件运算符?运算符 在if语句中,当“表达式”的值为“真”和“假”时,都只执行一个赋值语句给同一个变量赋值,例如:if(ab)max

9、=a;elsemax=b;则可以用条件运算符构成 一个条件表达式来处理,如下所示:max=(ab)?a:b;其中,“(ab)?a:b”是一个条件表达式,其含义是:若条件(ab)成立,则条件表达式取值a;否则,取值b。,(1)条件表达式的一般格式:表达式1?表达式2:表达式3例如:int main(void)int x,y;x=80;y=x70?100:0;printf(y=%d,y);return 0;,注意:条件运算符要求有三个操作对象,称为“三目运算符”(它是C语言中唯一的一个三目运算符)。条件表达式中的“表达式1”、“表达式2”、“表达式3”缺一不可,其类型可以各不相同。,屏幕显示运行结

10、果为:,y=100,演示,(2)条件表达式的运算规则 如果“表达式1”的值为非0(即逻辑真),则运算结果等于“表达式2”的值;否则,运算结果等于“表达式3”的值。条件表达式的流程图如图4-4所示。,真(非0),表达式1,条件表达式取表达式2的值,假(0),条件表达式取表达式3的值,图4-4 条件表达式的流程图,条件运算符的结合方向条件运算符的结合方向为“从右到左”(即右结合性)。如:ab?a:cd?c:d 等介于:(ab)?a:(cd?c:d),if语句一般都可以用条件表达式代替。如:if(ab)printf(%d,a);else printf(%d,b);等介于:(ab)?printf(%d

11、,a):printf(%d,b);或:printf(%d,ab?a:b);,条件运算符的优先级高于赋值运算符,但低于算术运算符和关系运算符。如:max=(ab)?a:b;等介于:max=ab?a:b;ab?a:b+1 等介于:(ab)?a:(b+1),(3)说明:,演示,【例4-4】从键盘上输入一个字符,判别它是否为大写字母,如果是,则把它转换成小写字母输出;否则不转换,直接输出。,【思路导航】字符在计算机内是用ASCII表示,大写字母的ASCII值正好比相应的小写字母小32,因此,若能判断出所输入的字符为大写字母,则将该字符的ASCII值加上32后,即转换为相应的小写字母。判断字符ch是否为

12、大写字母的条件是:ch=A&ch=Z为真。,/*exam4_4*/int main(void)char ch;printf(Input a character:);scanf(%c,演示,屏幕显示运行结果为:,Input a character:Dch=d,Return,4.2 switch语句,1switch语句的一般格式:switch(表达式)case 常量表达式1:语句(组)1;break;case 常量表达式2:语句(组)2;break;.case 常量表达式:语句(组)n;break;default:语句(组)n+1;break;,C语言提供了switch语句直接处理多个分支的选择结

13、构。,例如:switch(ch)case A:printf(85100n);break;case B:printf(7084n);break;case C:printf(6069n);break;case D:printf(60n);break;default:printf(errorn);,其他,D,B,A,C,图4-5,2switch语句的功能包括以下两方面。(1)当switch后面“表达式”的值,与某个case后面的“常量表达式”的值相同时,就执行该case后面的语句(组);当执行到break语句时,则跳出switch语句,转向执行switch语句的下一条。(2)如果没有任何一个case

14、后面的“常量表达式”的值与switch后面“表达式”的值相同,则执行default 后面的语句(组)。然后,跳出switch语句,执行switch语句的下一条。,3说明:(1)switch后面的“表达式”和case后面的“常量表达式”可以是整型、字符型和枚举型中的任意一种,程序执行时将自动计算其值。(2)为了避免程序执行时出现自相矛盾的现象,对switch后面的“表达式”的值只能有一种执行方案,因此,每个case后面“常量表达式”的值,必须各不相同。(3)case后的语句中break语句不能缺。case后面的“常量表达式”仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始

15、执行,不再进行标号判断,所以在每个case的语句(组)后面必须加上break语句,以便结束switch语句。,想一想,想一想:若switch后面的“表达式”的值为B,则下面这段程序输出的结果是什么?为什么?switch(ch)case A:printf(85100n);case B:printf(7084n);case C:printf(6069n);case D:printf(60n);default:printf(errorn);,结果是,7084606960error,演示,(4)当每一个case语句后均有break语句时,各case出现的先后次序不影响执行结果。Default语句总是放

16、在所有的case语句后面,它后面不需要写break语句。(5)多个case子句,可共用同一语句(组)。如:switch(ch)case A:case B:case C:printf(60n);break;在变量ch的值为A、B、C三种情况下,均执行相同的语句组“printf(60n);break;”。(6)用switch语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实现。,【例4-5】从键盘上输入一个百分制成绩score,按下列原则输出其等级:score90,等级为A;80score90,等级为B;70score80,等级为C;60score70,等级为D;score60,等级

17、为E。,/*exam4-5*/int main(void)int score,grade;printf(“Input a score(0100):”);scanf(“%d”,case 5:case 4:case 3:case 2:case 1:case 0:printf(“grade=En”);break;default:printf(“The score is out of range!n”);return 0;,屏幕显示运行结果为:,Input a score(0100):95grade=A,演示,Return,4.3 选择结构程序设计举例,【例4-6】求任一元二次方程ax2+bx+c=0

18、的解。(a、b、c为方程的系数,其中a0)【思路导航】求解一元二次方程的根有以下几种可能性:当a=0时,不能构成一元二次方程。当b2-4ac=0时,一元二次方程有两个相等的实根。当b2-4ac0时,一元二次方程有两个不等的实根。当b2-4ac0时,一元二次方程有两个共轭复根。为了编程方便,设变量disc表示一元二次方程判别式 b2-4ac,由于实数在计算机中运算和存储时,不可避免地有会有一些微小误差,因此在判别disc(为实数)是否为零时,不能直接与零比较,正确的方法是判断其绝对值小于一个很小的常数,如采用方法:if(fabs(disc)=1E-6),而不是:if(disc=0.0)。,N-S

19、流程图如图4-7所示:,图4-7,/*exam4_6*/#include math.hint main(void)float a,b,c,disc,x1,x2,p,q;printf(Please input a,b,c=);scanf(“%f,%f,%f”,/*输出不能构成方程的信息后,退出*/else,程序如下:,disc=b*b-4*a*c;/*定义判别式*/if(fabs(disc)1e-6)/*判断0*/x1=(-b+sqrt(disc)/(2*a);/*求出两个不相等的实根*/x2=(-b-sqrt(disc)/(2*a);printf(has distinct real roots

20、:n);printf(x1=%8.2f,x2=%8.2fn,x1,x2);else,p=-b/(2*a);/*求出两个共轭复根,其中p表示实部*/q=sqrt(fabs(disc)/(2*a);/*q表示虚部*/printf(has complex roots:n);printf(“x1=%7.2f+%7.2f in“,p,q);/*输出两个共轭复根之一:x1*/printf(”x2=%7.2f-%7.2f in“,p,q);/*输出两个共轭复根之二:x2*/return 0;,运行情况,Please input a,b,c=1,6,2 The equation:1.000000 x*x+6.

21、000000 x+2.000000=0 has distinct real roots:x1=-0.35,x2=-5.56,Please input a,b,c=1,2,3 The equation:1.000000 x*x+2.000000 x+3.000000=0 has complex roots:x1=-1.00+1.41ix2=-1.00-1.41i,若从键盘上输入方程系数a、b、c分别为:1,6,2,则屏幕显示程序运行情况如下:,若从键盘上输入方程系数a、b、c分别为:1,2,3,则屏幕显示程序运行情况如下:,演示,想一想:如果将系数a、b、c定义成整数,能否直接判断一元二次方程判

22、别式disc是否等于0?,【例4-7】已知某公司员工的保底薪水salary为500,某月所接工程的利润profit(整数)与利润提成的关系如下(计量单位:元):profit1000 没有提成;1000profit2000提成10%;2000profit5000提成15%;5000profit10000提成20%;10000profit 提成25%。编程实现:统计员工实际薪水。,【思路导航】定义变量salary表示员工实际薪水,变量profit表示员工所接工程的利润,考虑到工程利润与利润提成的关系有五种情况,故采用多路分支结构编写程序。为使用switch语句,必须将利润profit与提成的关系,

23、转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、),如果将利润profit整除1000,商用变量grade表示,则当:,profit1000grade可能为0、11000profit2000grade可能为1、22000profit5000grade可能为2、3、4、55000profit10000grade可能为5、6、7、8、9、1010000profitgrade可能为10、11、12、为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit先减1(最小增量),然后再整除1000即可。,程序如下:,/*exam4_8*/int main(void)long profit;int grade;float salary=500;printf(Input profit:);,scanf(%ld,屏幕显示运行结果为:,Input profit:2600 salary=890.00,演示,作业与实验作业:习题四的填空题中选3题,选择题中选3题。上机操作:实验四,Return,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号