第5章选择分支结构-C语言程序设计(谭浩强第三版)_第1页
第5章选择分支结构-C语言程序设计(谭浩强第三版)_第2页
第5章选择分支结构-C语言程序设计(谭浩强第三版)_第3页
第5章选择分支结构-C语言程序设计(谭浩强第三版)_第4页
第5章选择分支结构-C语言程序设计(谭浩强第三版)_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

第5章选择结构程序设计

关系运算符和关系表达式逻辑运算符和逻辑表达式

if语句

switch语句程序举例引例:1/x当x≠0时

10000当x=0时y=

选择结构是3种基本结构之一,经常牵涉到:根据所指定的条件是否相同,从两组(或多组)操作中选择其一。

要考虑两个方面的问题:1、C语言中如何表示条件?一般用关系表达式或逻辑表达式2、C语言中实现选择结构用什么语句?用if语句或switch语句。if(x!=0)y=1/x;elsey=10000;此处:用if语句来表示选择结构用一个关系表达式x!=0来表示条件5.1关系运算符和表达式1、关系运算:实质是两个量“比较运算”。2、关系运算符:种类:6种<<===>=>!=结合方向:自左向右优先级别:前4种优先级相同,高于后2种由高到低:算术运算-关系运算-赋值运算<<=>>===!=优先级6(高)优先级7(低)例c>a+bc>(a+b)a>b!=c(a>b)!=ca==b<ca==(b<c)a=b>ca=(b>c)算术运算符赋值运算符关系运算符高低//表达式值1//表达式值1//表达式值0//a>b值为1,所以d=1//a>b为1,a>b>c为0,所以f=0例inta=3,b=2,c=1,d,f;

a>b(a>b)==cb+c<ad=a>bf=a>b>c3、关系表达式:用关系运算符将两个表达式连接起来式子。4、关系表达式的值:是逻辑值“真”或“假”,用1和0表示1

––

结果为真

(关系成立)0

––

结果为假

(关系不成立)注意:其中“==”表示相等,而“=”表示赋值(1)关系运算符左右两边类型不一致,自动进行类型转换,转换成两边的类型相同,然后进行比较。

例如:若a=0,b=0.5,转换成a=0.0,则a<=b的值为1

(2)应避免对实数作相等或不等的判断,而只能使用“<”和“>”,原因在于舍入误差可能造成两个逻辑上应该相等的数不相等。

例如:如果x、y均为实数,要避免使用x==y

应使用fabs(x-y)<1e-6(3)关系运算符“>=、<=、==、!=”在书写时,不要用空格将其分开,否则会产生语法错误。5、关系运算注意的问题5.2逻辑运算符和逻辑表达式有时,只用一个简单的关系表达式不能完整地表达一个条件,如:

y=其中的条件需要用逻辑表达式来表达:

x!=0&&a!=0&&就是一种逻辑运算符。1/x+1/a当x≠0,a≠0时

10000其它

1、逻辑运算符(1)种类:三种逻辑运算符

&&逻辑与(相当日常生活中:而且,并且,只在两

条件同时成立时为“真”)

||逻辑或(相当日常生活中:或,两个条件只要有

一个成立时即为“真”)

!逻辑非(条件为真,运算后为假,条件为假,运

算后为真)

“&&”,“||”是双目运算符,“!”是单目运算符。

例:a&&b若a,b为真,则a&&b为真。

a||b若a,b之一为真,则a||b为真。

!a若a为真,则!a为假。5.2逻辑运算符和逻辑表达式C语言中,运算量:0表示“假”,非0表示“真”,

运算结果:0表示“假”,1表示“真”,ab!a!ba&&ba||b真假真假假假真真真假假假假假真真假假真真真假真真(2)逻辑运算真值表!(2)&&(11)||(12)高低(3)优先级:(4)结合方向:!:从右向左&&:从左向右||:从左向右!(非)算术运算符关系运算符&&||赋值运算符=高低如:x=!a>b&&b>c+3x=(((!a)>b)&&(b>(c+3)))2、逻辑表达式和逻辑表达式的值(1)逻辑表达式:用逻辑运算符将关系表达式、逻辑量连接起来的式子。

例如:

!a&&b¦¦x>y&&c(2)逻辑表达式的值:1或0,表示逻辑值“真”或“假”例a=4;b=5;!aa&&ba||b!a||b4&&0||25>3&&8<4-!0‘c’&&‘d’值为1值为0值为1

值为1值为1值为1(5>3)&&(8<(4-(!0)))值为0在逻辑运算中,非0值参加逻辑运算时被看成1处理.(3)短路现象:一个逻辑表达式中的逻辑运算符并不一定全部执行.例如:a=1,b=2,c=3,d=4,m=1,n=1(m=a>b)&&(n=c>d)

判断m,n的值:结果m=0,n=1,表达式为0例如:a&&b&&c当a=0(假)时,

b,c不需判断。

当a=1,b=0,c不需判断。例如:a¦¦b¦¦c当a=1时,b,c均不必判别。1&&0逻辑值为08<3逻辑值为04-1值为3!0逻辑值为15>3逻辑值为1(5>3)&&(8<(4-(!0)))值为0满足下列2个条件中之一的为闰年:

年号能被4整除,但不能被100整除。

年号能被400整除。例写出判断年号是否为闰年的逻辑表达式用变量year表示年号,则逻辑表达式:(year%4==0&&year%100!=0)||year%400==0

值为1,则year为闰年;否则为非闰年。!((year%4==0&&year%100!=0)||(year%400==0))执行过程:当表达式值非0时,执行语句,

否则,不执行语句。例如:

if(x>y)printf("%d",x);形式1:

if(表达式)

语句5.3if语句(三种形式)表达式语句非0=01.if语句的三种基本形式表达式的值:1

––

结果为真

(条件成立)0

––

结果为假

(条件不成立)例2输入两个实数,按其值由小到大次序输出这两个数。表达式语句非0=0

main(){floata,b,t;scanf("%f,%f",&a,&b);if(a>b){t=a;a=b;b=t;}printf("%5.2f,%5.2f",a,b);}形式1:

if(表达式)

语句1.if语句的三种基本形式例3输入三个数,按从小到大的顺序输出。表达式语句非0=0main()

{floata,b,c,t;

scanf(“%f,%f,%f”,&a,&b,&c);

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",a,b,c);

}形式1:

if(表达式)

语句1.if语句的三种基本形式例如:

if(x>y) printf("%d",x); elseprintf("%d",y);表达式语句1语句2非0=0执行过程:

当表达式值为非0,

执行语句1;当表达式值为0,

执行语句2。形式2:

if(表达式)

语句1else语句21.if语句的三种基本形式表达式语句1语句2非0=0例4输入一个数,判断它是否能被3整除。若能,则打印“YES”,否则,打印“NO”。形式2:

if(表达式)

语句1else语句2

main(){intn;printf(“inputn:”);scanf(“%d”,&n);

if(n%3==0)printf(“YES\n”);elseprintf(“NO\n”);}1.if语句的三种基本形式执行过程:从上向下逐一对if后面的表达式进行检测。当某一个表达式的值为非0时,就执行与此有关的子句中的语句,其余部分就被越过去。如果所有表达式的值都是0,则执行最后的else子句;如果没有最后的那个else子句,那么,将不进行任何操作。形式3:if(表达式1)

语句1elseif(表达式2)

语句2elseif(表达式3)

语句3

……elseif(表达式n)语句nelse语句n+11.if语句的三种基本形式0表达式1

表达式2

表达式n语句n+100语句n

语句2

语句1

非0

非0

非0…

形式3:if(表达式1)

语句1elseif(表达式2)

语句2elseif(表达式3)

语句3

……elseif(表达式n)语句nelse语句n+1例如:if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)cost=0.075;elseif(number>50)cost=0.05;elsecost=0;0表达式1

表达式2

表达式n语句n+100语句n

语句2

语句1

非0

非0

非0…

1.if语句的三种基本形式形式3:if(表达式1)

语句1elseif(表达式2)

语句2elseif(表达式3)

语句3

……elseif(表达式n)语句nelse语句n+1例5:输入一个学生成绩,当成绩≥90时,输出

verygood,当80≤成绩<90时,输出

good,当60≤成绩<80时,输出pass,当成绩<60时,输出fail。main(){intscore;printf("Inputscore:");scanf("%d",&score);if(score>=90)printf(“verygood");elseif(score>=80)printf(“good");elseif(score>=60)printf(“pass");elseprintf(“fail");}1.if语句的三种基本形式0表达式1

表达式2

表达式n语句n+100语句n

语句2

语句1

非0

非0

非0…

例6:输入一个字符,请判断是字母、数字还是特殊字符。#include<stdio.h>main(){charch;

printf("Pleaseinputacharacter:\n");

ch=getchar();

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))printf("\n%cisaletter\n",ch);

elseif(ch>='0'&&ch<='9')printf("\n%cisanumber!\n",ch);

elseprintf("\n%cisaspecialcharacter!\n",ch);

}形式3:if(表达式1)

语句1elseif(表达式2)

语句2elseif(表达式3)

语句3

……elseif(表达式n)语句nelse语句n+1例如:if(a&&b)prinf("o.k");if(a>b)…if(3)…if('a‘+88)…

1.表达式可以是逻辑表达式、关系表达式、算术表达式。

2.语句必须以分号结束。

3.若语句不止一条,则必须用{}括起来。在{}外不加分号。注意的问题5.3if语句2、if语句的嵌套:

在if语句中,又包含一个或多个if语句。if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4内嵌if内嵌ifif(表达式1)if(表达式2)

语句1else

语句2内嵌ifif(表达式1)

{if(表达式2)

语句1}else

语句3

内嵌ifif(表达式1)

语句1elseif(表达式3)

语句3else

语句4内嵌if5.3if语句(三种形式)2、if语句的嵌套if(表达式1)

{if(表达式2)

语句1}else

语句3

内嵌ifif~else配对原则:缺省{}时,else总是和它上面离它最近的未配对的if配对。if(……)if(……)if(……)else…...else…...else…...if(表达式1)if(表达式2)

语句1else

语句3

内嵌if如果没有{}时的配对2、if语句的嵌套if~else配对原则修改:

if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);实现if~else正确配对方法:必要时,加{}例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);例7有一函数:y=–1(x<0)0(x=0)1(x>0)编一程序,输入一个x值,输出y值。有以下几种写法,请判断哪些是正确的?2、if语句的嵌套程序2:将程序1的if语句改为:

main()

{intx,y;

scanf("%d",&x);

if(x>=0)

if(x>0)

y=1;

else

y=0;

else

y=-1;

printf("x=%d,y=%d\n",x,y);

}程序1:

main()

{intx,y;

scanf("%d",&x);

if(x<0)

y=–1;

elseif(x==0)

y=0;

else

y=1;

printf("x=%d,y=%d\n",x,y);

}2、if语句的嵌套程序4:将程序1的if语句改为main(){intx,y;scanf("%d",&x);

y=0;if(x>=0)if(x>0)y=1;elsey=-1;printf("x=%d,y=%d\n",x,y);}

程序3:将程序1的if语句改为main(){intx,y;scanf("%d",&x);

y=-1;if(x!=0)if(x>0)y=1;elsey=0;printf("x=%d,y=%d\n",x,y);}2、if语句的嵌套y=0(x<0)–1(x=0)1(x>0)1.

程序1和程序2是正确的。

它们代表的函数为:2.

程序3和程序4是错误的。

它们代表的函数为:y=0(x<0)–1(x=0)1(x>0)y=–1(x<0)0(x=0)1(x>0)结论:5.3if语句

C语言提供了一个简单的条件赋值语句或条件表达式。问题:

当判断条件不论是“真”是“假”,均给同一变量赋值时简化条件语句

运算符书写方式:?:

属三目运算符。3、条件运算符5.3if语句执行过程:

先求解表达式1,若非0(真),则值为表达式2的值,否则,为表达式3的值。一般形式:表达式1

?

表达式2

:表达式3例如:max=a>b?a:b;当a>b,maxa;

否则,maxb3、条件运算符表达式1取表达式2值取表达式3值非0=05.3if语句注意:条件运算符优先于赋值运算符。

例如:max=(a>b?a:b)可去掉()条件运算符低于关系运算符和算术运算符。

例如:max=a>b?a:b+1max=a>b?a:(b+1)

而不是

max=(a>b?a:b)+1条件运算符结合性为从右至左。

例如:a>b?a:c>d?c:d

相当于

a>b?a:(c>d?c:d)条件表达式不能取代一般的if语句,只有当if的两个分支为给同一变量赋值时才可替代if.

例如:求y=a+|b|

printf(“y=%d\n”,b>0?a+b:a-b);表达式1、表达式2、表达式3的类型可以不同。

例如:x>y?1:1.53、条件运算符5.3if语句3、条件运算符例8输入一个字符,判别它是否大写字母。

如果是,将它转换成小写字母;

如果不是,不转换。

然后输出最后得到的字符。main()

{charch;

scanf("%c",&ch);

ch=(ch>='A'&&ch<='Z'?(ch+32):ch;

printf("%c",ch)

}5.3if语句switch语句是多分支选择语句,也叫开关语句一般形式:

switch(表达式){case常量表达式1:语句1[break;]case常量表达式2:语句2[break;]…case常量表达式n:语句n[break;]default:语句n+1}

5.4switch语句switch表达式语句1语句2语句n语句n+1…式1式2式ndefaultcase

执行过程:当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句。若所有的case中的常量表达式的值都没有与表达式的值匹配,则执行default后面的语句。

例9根据成绩等级,打印出成绩范围。5.4switch语句main(){chargrade;printf("Enteryourgrade\n");scanf("%c",&grade);

switch(grade){case'A':printf(“90~100\n");break;case'B':printf(“80~89\n");break;case'C':printf(“70~79\n");break;case'D':printf("60~69\n");break;case‘E':printf("<60\n");break;default:printf("error\n");}}没有break将是错误的。例如输入B,打印出:80~8970~7960~69<60error注意:case常量表达式只起语句标号作用;必须用break语句终止多个case连续执行,否则只要有一个case满足后,以下的语句全部无条件执行。除非遇到“}”或break语句来终止switch语句的执行。

例10根据成绩范围,打印出成绩等级。5.4switch语句main(){intscore,num;chargrade;scanf("%d",&score);num=score/10;

switch(num)

{case10:case9:grade='A';break;case8:grade='B‘;break;case7:grade='C';break;case6:grade='D';break;default:grade='E';}

printf("%d%c",score,grade);}鉴于上述原因,2个或多个case可以共用一组执行语句1.表达式的类型和常量表达式的类型必须一致;switch后面的表达式一般情况下是整型或字符型。2.每一个case的常量表达式的值必须互不相同。3.多个case和default的出现次序不影响执行结果。4.case常量表达式只起语句标号作用;

必须用break语句终止多个case连续执行,

否则只要有一个case满足后,以下的语句全部无条件执行。

说明:5.4switch语句

main(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;

case1:b++;break;

}case2:a++;b++;break;

case3:a++;b++;

}printf("\na=%d,b=%d",a,b);

}

switch的嵌套5.4switch语句①能够被4整除,但不能被100整除的年份;②能够被400整除的年份。

5.5程序举例例写程序,判断某一年是否闰年。闰年的算法。用一个标志leap代表闰年与否。leap=1,代表闰年,leap=0,代表非闰年。#include<stdio.h>

voidmain()

{

intyear,leap;

scanf("%d",&year);

if(year%4==0)

{if(year%100==0)

{if(year%400==0)leap=1;

elseleap=0;

}

elseleap=1;

}

elseleap=0;

if(leap)printf("%disaleapyear.\n",year);

elseprintf("%disnotaleapyear.\n",year);

}if(year%4!=0)leap=0;elseif(year%100!=0)leap=1;elseif(year%400!=0)leap=0;elseleap=1;

运行情况:1989↙1989isnotaleapyear.2000↙2000isaleapyear.

if((year%4==0&&year%100!=0)||year%400==0)

leap=1;elseleap=0;例求ax2+bx+c=0方程的解。基本的算法:①a=0,不是二次方程。②b2-4ac=0,有两个相等实根。③b2

-4ac>0,有两个不等实根。④b2

-4ac<0,有两个共轭复根。#include<stdio.h>

#include<math.h>

voidmain()

{

floata,b,c,disc,x1,x2,realpart,imagpart;

scanf(“%f,%f,%f”,&a,&b,&c);

printf(“theequation”);

if(fabs(a)<=1e-6)

printf(“isnotaquadratic\\n”);

else

{disc=b*b-4*a*c;

if(fabs(disc)<=1e-6)

printf(“hastwoequalroots:%8.4f\n”,-b/(2*a));

else

if(disc>1e-6)

{

x1=(-b+sqrt(disc))/(2*a);

x2=(-b-sqrt(disc))/(2*a);

printf(″hasdistinctrealroots:%8.4fand

%8.4f\n″,x1,x2);

}

else

{

realpart=-b/(2*a);

imagpart=sqrt(-disc)/(2*a);

printf(″hascomplexroots∶\n″);

printf(″%8.4f+%8.4fi\n″,realpart,imagpart);

printf(″%8.4f-%8.4fi\n″,realpart,imagpart);

}

}

}

例运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:

s<250km没有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为:f=p*w*s*(1-d)

分析:用ifelse分支方法,可以完成,但区间太多。用switch,寻找合适的表达式以及对应的常量

分析折扣变化的规律性:折扣的“变化点”都是250的倍数,在横轴上加一种坐标c,c的值为s/250。c代表250的倍数。c<1,

温馨提示

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

评论

0/150

提交评论