学期C程序设计(第三版)教材PPT-第5章-讲课件
![学期C程序设计(第三版)教材PPT-第5章-讲课件_第1页](https://file7.zhuangpeitu.com/fileroot7/2022-5/31/9ea977bb-b8b8-425b-b038-07c90c1d30bc/9ea977bb-b8b8-425b-b038-07c90c1d30bc1.gif)
![学期C程序设计(第三版)教材PPT-第5章-讲课件_第2页](/images/s.gif)
![学期C程序设计(第三版)教材PPT-第5章-讲课件_第3页](/images/s.gif)
《学期C程序设计(第三版)教材PPT-第5章-讲课件》由会员分享,可在线阅读,更多相关《学期C程序设计(第三版)教材PPT-第5章-讲课件(41页珍藏版)》请在装配图网上搜索。
1、第五章:选择结构程序设计,5.1 关系运算符和关系表达式,,5.2 逻辑运算符和逻辑表达式,,5.3 if语句,,5.4 switch语句,,5.5 程序举例,第5章:选择结构,,三,,种,,基,,本,,结 构,,:,,1.,,顺序结构:,,2. 选择结构:,,3. 循环结构,,1.顺序结构:,3.循环结构:,2.选择结构:,5:选择结构程序设计,要设计选择结构程序,要考虑两个方面的问题:,,一.是在C语言中如何来,表示条件,,,,二.是在C语言中实现选择结构用什么,语句,。,,在C语言中表示条件,一般用,关系表达式或逻辑表达式,,实现选择结构用,if语句或switch语句,。,5:选
2、择结构程序设计,if语句的常用形式:,,if,(关系表达式)语句1,,else,,语句2,例如:,if(x>0)y=1;else y=-1;,关系表达式 ;“,>”,为关系运算符,5.1:关系运算符和关系表达式,关系运算(比较运算),:将两个值进行比较,判断其比较的结果是否符合给定的条件。,,,例如:,,a>5 --------,,为一个关系表达式,,,如果a=3,则不满足a>5这个条件,此关系表达式的值为,“假”,;,,如果a=9,则满足a>5这个条件,此关系表达式的值为,“真”,。,5.1:关系运算符和关系表达式,5.1.1 关系运算符及其优先次序,在C语言中有以下关系运算符:,,,
3、1) < 小于,,2) <= 小于或等于,,3) > 大于,,4) >= 大于或等于,,5) == 等于,,6) != 不等于,,,关系运算符都是,双目,运算符,其结合性均为,左,结合。,,关系运算符,的优先级,低于算术,运算符,,高于赋值,运算符。,,在六个关系运算符中,,>=的优先级相同,高于==和!=,==和!=的优先级相同。,,优先级相同(高),优先级相同(低),注意:在C语言中,“等于”关系运算符是双等号“= =”,而不是单等号“= ”(赋值运算符)。,5.1:关系运算符和关系表达式,例如:,,c>a+b 等效于c>(a+b),,a>b
4、==c 等效于(a>b)==c,,a==b
5、,5.1:关系运算符和关系表达式,例如,假设a=3,b=4,c=5,则:,,(1)a>b的值=>,0,。,,(2)(a>b)!=b的值=>,1,。,,(3)a,1,。,,(4)(a,6,,因为a,1,,1+5=6。,,强调:C语言用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。所以,,关系表达式的值,还可以参与其它种类的运算,,例如算术运算、逻辑运算等。,,5.2:逻辑运算符和逻辑表达式,关系表达式只能描述单一条件,例如“x>=0”。如需描述“x>=0”、同时“x<10”,就要借助,逻辑表达式,。,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。,,5.2.1 逻辑运算
6、及其优先次序,,1.逻辑运算符及其运算规则,,(1)C语言提供三种逻辑运算符:,,&& 逻辑与(相当于“同时”)双目,,|| 逻辑或(相当于“或者”)双目,,! 逻辑非(相当于“否定”)单目,,例如,下面的表达式都是逻辑表达式:,,(x>=0) && (x5) ,! (x= =0),,,(year%4==0)&&(year%100!=0)||(year%400==0),,,(2)运算规则,,1),&&,:当且仅当,两个,运算量的值,都为“真”,时,运算结果为,“真”,,否则为“假”。,,2),||,:当且仅当,两个,运算量的值,都为“假”,时,运算结果为,“假”,,否则为“真”。,,3),!
7、,:当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。,,例如,假定x=5,则(x>=0) && (x5)的值为“假”。,5.2:逻辑运算符和逻辑表达式,2.逻辑运算符的运算优先级,,(1),逻辑非,的优先级最高,,逻辑与,次之,,逻辑或,最低,即:,,!(非) → &&(与) → ||(或),,(2)与其它种类运算符的优先关系,,!→ 算术运算符→ 关系运算符→ &&→ || → 赋值运算符,,5.2.2 逻辑表达式,,1.逻辑表达式的概念,,用,逻辑运算符,将1个或多个表达式连接起来,进行逻辑运算的式子。在C中,用逻辑表达式表示多个条件的组合。,,例
8、如,(year%4==0)&&(year%100!=0)||(year%400==0)就是一个判断一个年份是否是闰年的逻辑表达式。,,逻辑表达式的值是一个逻辑值(非“真”即“假”)。,,5.2:逻辑运算符和逻辑表达式,5.2:逻辑运算符和逻辑表达式,2.逻辑量的真假判定──0和非0,,C编译系统在,给出逻辑运算结果,时用整数“1”表示“逻辑真”、用“0”表示“逻辑假”。,,但在,判断一个数据的“真”或“假”时,,却以0和非0为根据:如果为0,则判定为“逻辑假”;如果为非0,则判定为“逻辑真”。,,,例如,假设num=12,则:!num的值=0 ,num>=1 && num31的值=1。,,,5
9、.2:逻辑运算符和逻辑表达式,3.说明,,(1)逻辑运算符两侧的操作数,除可以是0和非0的整数外,也可以是其它任何类型的数据,如实型、字符型等。,,例如:,,‘c’&&’d’,的值为1 (关键看,‘c’和‘d’的ASCII码值是否为0),,如果在一个表达式中不同位置出现数值,要区分哪些是作为数值运算或关系运算的对象,那些作为逻辑运算的对象?,,例如:5>3 && 8<4-,!,0,!→ 算术运算符→ 关系运算符→ &&→ || → 赋值运算符,5.2:逻辑运算符和逻辑表达式,(2)计算逻辑表达式时,并不是所有的逻辑运算符都被执行,只有必须执行下一个逻辑运算符才能求出表达式的解时,才执行该逻辑
10、运算符。,,1)对于,逻辑与(&&),运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。,,2)对于,逻辑或(||),运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。,例如,,假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、1、1,则求解表达式“(x=n1>n2)&&(y=n3>n4)”后,,,x的值变为0,而y的值不变,仍等于1!,5.2:逻辑运算符和逻辑表达式,例如:求闰年问题!,,表示是闰年的条件可用下列逻辑表达式:,,((year%4==0)&&(year%100!=0))||(year%400==0),,表示非闰年的条件可用下列逻辑表
11、达式:,,!,(((year%4==0 )&& (year%100!=0))||(year%400==0)),,或,,(year%4!=0)||(year%100==0 && yer%400!=0),将C提供的关系运算符和逻辑运算符有效的结合使用,可编写出合适的逻辑表达式来表示一个复杂的条件!,分析:,闰年的条件是:(1),能被4整除,但不能被100整除的年份都是闰年,,如1996,2004年是闰年;(2),能被100整除,又能被400整除的年份是闰年,。如1600,2000年是闰年。不符合这两个条件的年份不是闰年。,5.3.1 if语句的三种形式,,1.if语句的一般格式:,,if(表达式
12、){语句组1;},,1)if语句中的“表达式”必须用,“(”和“)”,括起来。,,2),else,子句(,可选,)是if语句的一部分,必须与if,配对,使用,不能单独使用。,,3)当if和else下面的语句组,仅由一条语句构成时,也可不使用,复合语句形式,(即去掉花括号)。,5.3:if 语句,,if 语句,是用来判定所给的,条件,是,真,还是,假,决定执行给出的两种操作之一!,5.3:if 语句,表达式,表达式,语句,假(0),真(非0),真,语句1,语句2,假,C语句提供了三种形式的if语句:,,1.if(表达式) 语句,,if(x>y)printf(“%d”,x);,,,2.if(表达式
13、) 语句1 else 语句2,,if(x>y)printf(“%d”,x);,,else printf(“%d”,y);,5.3:if 语句,3.if(表达式1) 语句1,,else if (表达式2) 语句2,,else if (表达式3) 语句3,,,else if (表达式m) 语句m,,else 语句n,…,表达式1,表达式2,表达式3,表达式4,语句1,语句2,语句3,语句4,语句5,假,真,真,假,真,假,假,真,例如:,,if(number>500) cost=0.15;,,else if(number>300)cost=0.10;,,else if(number>
14、100)cost=0.075;,,else if(number>50)cost=0.05,,else cost=0;,5.3:if 语句,说明:,,(1)三种形式的if语句在if后都有“表达式”,一般为,逻辑表达式或关系表达式,也可为其它类型,。,,例如:if(b>3)printf(“Hello”); if(‘a’)printf(“%d”,’a’);,,(2)第二种和第三种形式的if语句中,在每个else前面有一个分号,整个语句结束处有一个分号。虽然分号是C语句的组成部分,但是,if和else同属于一个语句,。,例如:,,if(x>y)printf(“%d”,x);,,else printf(
15、“%d”,y);,(3)在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句, 此时用一对花括号“{}”将几个语句括起来成为一个,复合语句,.,,,例如:,,,if(a+b>c),,{s=0.2*(a+b);,,printf(“s=0.2*(a+b)=%f\n”,s); },,else,{ s=0.5*c;,,printf(“s=0.5*c=%f;\n”,s); },5.3:if 语句,5.3:if 语句,例5.1:输入两个实数,按代数值由小到大的次序输出这两个数,,#include ,,void main(),,{ float a,b,t;,,scanf("%f,
16、%f",,,if(a>b),,{t=a;a=b;b=t;},,printf("%5.2f,%5.2f\n",a,b);,,},运行情况:,,3.6,-3.2↙,,-3.20,空3.60,5.3:if 语句,例5.2 输入3个数a,b,c,要求按由小到大的顺序输出.,,#include ,,void,,main(),,{float a,b,c,t;,,scanf("%f,%f,%f",,,if(a>b),,{ t=a;a=b;b=t;},,if(a>c),,{ t=a;a=c;c=t;},,if(b>c),,{ t=b;b=c;c=t;},,printf("%5.2f,%5.2f,%5.2f\
17、n",a,b,c);,,},运行情况:,,3,7,1↙,,空1.00,空3.00,空7.00,5.3:if 语句,5.3.2 if 语句的嵌套,应当注意if与else的配对关系。,else总是与它上面的最近的if配对,。,在if语句中又包含一个或多个if语句称为if语句的嵌套.一般形式如下:,,if( ),,if( ) 语句1,,else 语句2,,else,,if( ) 语句3,,else 语句4,内嵌if,内嵌if,if( ),,,if( ) 语句1,,else,,if( ) 语句2,,else 语句3,内嵌if,5.3:if 语句,例5.3有一函数:,#include ,,v
18、oid main(),,{int x,y;,,scanf("%d",,,if(x<0)y=-1;,,else if(x==0)y=0;,,else y=1;,,printf("x=%d,y=%d\n",x,y);,,},-1 (x<0),y=,0 (x=0),1 (x>0),编一程序,输入一个x 值,输出y值. 程序清单如下:,,方法1:,上例中的程序段有四个,请判断哪个是正确的?,,程序1:
19、程序2:,,if(x=0),,y=-1; if(x>0) y=1;,,else else y=0;,,if(x==0) y=0; else y=-1;,,else y=1;,,程序3: 程序4:,,y=-1;
20、 y=0;,,if(x!=0) if(x>=0),,if(x>0) y=1; if(x>0) y=1;,,else y=0; else y=-1;,,5.3:if 语句,例5.3有一函数:,-1 (x<0),y=,0
21、 (x=0),1 (x>0),正,,确,正,,确,若if语句中,在表达式为“真”和“假”时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理.,,,条件运算符,要求有3个操作对象,称,三目运算符,,C中唯一的一个三目运算符.,,条件表达式,的一般形式为:,,表达式1?表达式2:表达式3,,它的执行过程如下图 :,5.3:if 语句,5.3.3 条件运算符,表达式1,条件表达式,,取表达式2的值,条件表达式,,取表达式3的值,真,假,5.3:if 语句,说明:,,(1)条件运算符的执行顺序:先求解表达式1,若为非0,则求解表
22、达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0,则求解表达式3,表达式3的值就是整个条件表达式的值。,例如:,max=(a>b)?a:b,,(2)条件运算符优先于赋值运算符,但比关系运算符和算术运算符都低。,例如:,max=a>b?a:b,,a>b?a:b+1,,(3)条件运算符的结合方向为,“,自右至左,”,,例如:a=1,b=2,c=3,d=4,a>b?a:,(,c>d,?c:d) 值为4,(4)条件表达式中“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式!,,例如:a>b?printf(“%d”,a):printf(“%d”,b);,
23、,(5)条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同,,,例如:x>y?1:,1.5,,条件表达式的值为表达式2和表达式3中较高的类型。,5.3:if 语句,5.3:if 语句,例5.4 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换.然后输出最后得到的字母.,,#include ,,void main(),,{char ch;,,scanf("%c",,,ch=(,ch>='A' && ch<='Z',)?(ch+32):ch;,,printf("%c\n",ch);,,},,运行结果:,,A↙,,a,5.4: switch 语句,,swi
24、tch语句是多分支选择语句.if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择.,,当然多分支也可以用嵌套的if语句来处理,但如果分支较多,则嵌套的if语句层数多,程序冗长而且可读性都低.C提供switch语句直接处理多分支选择,它的一般形式如下:,switch (表达式),,{case 常量表达式1: 语句1,,case 常量表达式2: 语句2,,,,case 常量表达式n: 语句n,,default : 语句n+1,,},,….,5.4: switch 语句,说明:,,(1)switch后面括弧内的“表达式”,ANSI 标准允许它为任何类型.,,(
25、2)当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句.,,(3)每一个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象.,,(4)各个case和default的出现次序不影响执行结果.,,,例:要求按照考试成绩的等级输出百分制分数段,用switch语句实现:,,switch,(grade),,{ case ′A′∶printf(″85~100\n″);,,case ′B′∶ printf (″70~84\n″);,,case ′C′∶ printf (
26、″60~69\n″);,,case ′D′∶ printf (″<60\n″);,,default∶ printf ( ″error\n″); },5.4: switch 语句,(5)执行完一个case后面的语句后,流程控制转移到下一个case继续行.“case常量表达式”只是起,语句标号作用,,并不是在该处进行条件判断.在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不在进行判断.,,(6)多个case可以共用一组执行语句.如:,,,case ‘A’:,,case ‘B’:,,case ‘C’: printf(“>60\n
27、”);break;,5.5: 程序举例,例5.5写程序,判断某一年是否闰年,,分析:以变量leap代表是否闰年的信息.若闰年,,令leap=1;非闰年,leap=0.,最后判断leap是否为1,若是,则输出“闰年”信息。,,N-S结构流程图5-13如下:,5.5: 程序举例,例5.5写程序,判断某一年是否闰年,#include void main(){int year,leap;,,scanf("%d",,,if,(year%4==0),,{,if,(year%100==0),,{,if(year%400==0) leap=1;,,else leap=0;,},,else,l
28、eap=1;},,else,leap=0;,,,if(leap) printf("%d is",year);,,else printf("%d is not",year);,,printf("a leap year.\n"); },运行情况:,,,1989↙,,,1989 is nota leap year.,,,2000↙,,,2000 is a leap year.,if(year%4!=0)leap=0;,,else if(year%100!=0),,leap=1;,,else if(year%400!=0),,leap=0;,,else leap=1;,if(
29、(year%4==0&&year%100!=0),,||(year%400==0)),,leap=1;,,else leap=0;,例5.6 求a,x,2,,+bx+c=0方程的解。,基本的算法:,,① a=0,不是二次方程。,,②,b,2,-4ac=0,有两个相等实根。,,③,b,2,-4ac >0,有两个不等实根。,,④,b,2,-4ac <0,有两个共轭复根。,5.5: 程序举例,5.5: 程序举例,#include #include void main ( ) {float a,b,c,disc,x1,x2,realpart,imagpart; scanf(“%
30、f,%f,%f”,,if,(fabs(a)<=1e-6) printf(“is not a quadratic\\n”);,else,{ disc=b*b-4*a*c;,if,(fabs(disc)<=1e-6) printf("has two equal roots:%8.4f\n",-b/(2*a));,例5.6 求a,x,2,,+bx+c=0方程的解。,5.5: 程序举例,el,se,,if,(disc>1e-6){x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a);printf(,″,has distinc
31、t real roots:%8.4fand8.4f\n,″,,x1,x2);},,else,{realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf(,″,has complex roots∶\n,″,); printf(,″,%8.4f+%8.4fi\n,″,,realpart,imagpart); printf(,″,%8.4f-%8.4fi\n,″,,realpart,imagpart); } }},5.5: 程序举例,例5.7 运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:,,s<2
32、50km 没有折扣,,250≤s<500 2%折扣,,500≤s<1000 5%折扣,,1000≤s<2000 8%折扣,,2000≤s<3000 10%折扣,,3000≤s 15%折扣,,设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费的计算公式为:,f=p*w*s*(1-d),分析:折扣的变化是有规律的,即变化点都是250的倍数。此时我们可以设一个变量c= ( s/250),其代表250的倍数。可以用switch语句来实现。程序清单如下:,#include void main( ) { int c,s; float p,w,d,f; scanf("%f,%f,%d", } f=p*w*s*(1-d/,100.0,); printf("freight=%15.4f\n",f);},5.5: 程序举例,5.5: 程序举例,5.3,,5.4,,5.5,,5.8,,5.10,作业:,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。