4-2 关系运算符+逻辑运算符+条件运算符_第1页
4-2 关系运算符+逻辑运算符+条件运算符_第2页
4-2 关系运算符+逻辑运算符+条件运算符_第3页
4-2 关系运算符+逻辑运算符+条件运算符_第4页
4-2 关系运算符+逻辑运算符+条件运算符_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第4章项目二中的选择执行设计4.1任务分析4.2关系运算符、逻辑运算符、条件运算符4.3使用if-else实现分支结构4.4使用switch语句实现分支结构4.5分支结构程序设计示例21:031【例4.1】输入三角形的三条边,判断是否能构成三角形,若能则计算并输出三角形的面积,否则给出出错提示。4.1引例#include<stdio.h>#include<math.h>intmain(){inta,b,c; floatarea; doubles; printf("请输入三角形的三条边长:");scanf("%d,%d,%d",&a,&b,&c); s=(a+b+c)/2.0;if(a+b<=c||b+c<=a||a+c<=b) printf("不构成三角形\n"); else{area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("三角形的面积是:%f\n",area); }return0;}

运行结果:请输入三角形的三条边长:3,4,5三角形的面积是:6.000000【例4.2】编写程序,输入x的值,按以下分段函数计算并输出y的值.#include<stdio.h>intmain(){intx;floaty;printf("输入x的值:");scanf("%d",&x); if(x!=0) y=1.0/x;else y=0;printf("%d,%f",x,y);return0;}

运行结果1:输入x的值:22,0.500000运行结果2:输入x的值:00,0.0000004.2.1关系运算符和关系表达式1.关系运算符用于判断两个操作数的大小关系

4.2关系运算符、逻辑运算符、条件运算符注意:关系运算符中,>、<、>=、<=的优先级相同,==、!=的优先级相同,前者的优先级高于后者,即“>=”的优先级高于“==”。关系运算符的优先级低于算术运算符,但是高于赋值运算符。关系运算符都是双目运算符,其结合方向是左结合。2.关系表达式用关系运算符将两个表达式连接起来的式子称为关系表达式。一般形式为:

表达式1关系运算符表达式2例如:“a+b>=c-d”

关系表达式中允许出现嵌套的情况,例如:“a>(b>c)”、“a!=(c==d)”等。关系表达式主要用于分支结构中的条件判断。关系表达式的结果是一个逻辑值“真”或“假”,由于C语言中没有逻辑类型的数据,因此用“1”表示“真”,“0”表示“假”。注意:在关系表达式中需注意区分“=”和“==”。对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0==1.0”的结果为0。关系表达式中可以出现赋值运算符,如“a>(b=0)”,但是不能写成“a>b=0”的形式。【例4.3】关系运算示例。#include<stdio.h>intmain(){ charc='m'; inti=10,j=20,k=30; floatx=13e+5,y=10.85;

printf("%d,%d,",'a'+5<c,-i-2*j>=k+1); printf("%d,%d,",1<j<5,x-5.25<=x+y); printf("%d,%d\n",i+j+k==-2*j,k==j==i+5); return0;}运行结果:1,0,1,1,0,0x小于10且x大于44<x<10则当x=2时,判断此表达式的结果。当x=2时,4<x<10的结果为1,显然是错误的。此时需要用到逻辑运算符将若干个关系表达式连接起来才能正确描述上述关系。4.2.2逻辑运算符和逻辑表达式1.逻辑运算符

如果写成:逻辑运算符有逻辑非(!)、逻辑与(&&)和逻辑或(||)三种xy!xx&&yx||y001000非0101非00001非0非00112.逻辑表达式用逻辑运算符将两个表达式连接起来的式子称为逻辑表达式,其中的表达式可以又是逻辑表达式,一般形式为:

表达式1逻辑运算符表达式2

逻辑运算符表达式1如:“(a&&b)||c”。逻辑表达式的结果也是一个逻辑值“真”或“假”,即为“1”或“0”。参与逻辑运算的数据可以是1和0,也可以是非零值和0,还可以是任何类型的数据,但最终都是以非0和0来判断他们是“真”或“假”。在逻辑表达式中也可以使用赋值运算符,如“a&&(b=0)”,但是不能写成“a&&b=0”的形式。短路:C语言规定,只对决定整个表达式值所需的最少数目的子表达式进行运算。即在由若干个子表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式的值时,此后就不再计算右边剩下的子表达式的值,这种情况称为“短路”。说明:①对于&&运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再进行计算;只有当“&&”左边的表达式值为真时才计算右边表达式的值。②对于||运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达式将不再进行计算;只有当“||”左边的表达式值为假时才计算右边表达式的值。【例4.5】逻辑运算示例。#include<stdio.h>intmain(){ inta=3,b=3,c=2,d; printf("%d,",!a&&!b&&c); printf("%d,",!a||!b||c); printf("%d\n",a>=b&&b>c); d=c--||(b=6)&&a++; printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); return0;}运行结果:0,1,1a=3,b=3,c=1,d=11.条件运算符条件运算符由两个符号“?”和“:”组成,用于条件求值。是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符、高于赋值运算符,它是右结合的。4.2.3条件运算符和条件表达式2.条件表达式由条件运算符将3个表达式连接起来的式子称为条件表达式,其一般形式为:表达式1?表达式2:表达式3条件表达式的执行顺序:

若表达式1的值为“真”,则条件表达式的值为表达式2,否则,条件表达式的值为表达式3条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表达式3的类型也可以不同。条件表达式中表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式,如“a>b?b=3:(c=4)”,但是不能写成“a>b?b=3:c=4”的形式。关于条件表达式的说明:条件表达式相当于一个双分支的if语句,当if语句中只给同一个变量赋值时,可以使用条件表达式代替if语句。if(a>0) y=a;

else y=-a;条件表达式允许嵌套,例如“a>3?b:c>2?1:0”,相当于“a>3?b:(c>2?1:0)”。y=(a>0)?a:(-a);【例4.6】用条件表达式求两个数中的较大数。#include<stdio.h>intmain(){ intx,y; printf("请输入两个整数:"); scanf("%d,%d",&x,&y); printf("两个整数中的最大数为:%d\n",x>y?x:y); return0;}运行结果:请输入两个整数:3,7两个整数中的最大数为:74.3使用if-else实现分支结构4.3.1if-else语句一般形式:

if(表达式)

语句1;

else

语句2;1.双分支if语句【例4.7】使用双分支if语句求两个数中较大的数。#include<stdio.h>intmain(){inta,b;printf("请输入两个整数:");scanf("%d%d",&a,&b); if(a>b) printf("两个整数中的最大数为:%d\n",a);else printf("两个整数中的最大数为:%d\n",b);return0;}运行结果1:请输入两个整数:1815两个整数中的最大数为:18运行结果2:请输入两个整数:1518两个整数中的最大数为:18【例4.8】编写一个程序,根据键盘输入的x的值,计算y的值。#include<stdio.h>#include<math.h> intmain(){doublex,y; printf("输入x的值:"); scanf("%lf",&x); if(x<=1) y=exp(x); else y=pow(x,2)-1; printf("f(%f)=%.2f\n",x,y); return0;}运行结果1:输入x的值:0.5f(0.500000)=1.65运行结果2:输入x的值:2f(2.000000)=3.00一般形式:

if(表达式)

语句;2.单分支if语句【例4.9】编写程序任意输入一个实数,输出其绝对值。#include<stdio.h>intmain(){ floatx; scanf("%f",&x); if(x<0) x=-x; printf("%f",x); return0;}【例4.10】若有如下分段函数,根据x的值,求出y的值。#include<stdio.h>intmain(){ intx,y; printf("x="); scanf("%d",&x); if(x) y=1; else y=-1; printf("y=%d",y); return0;}运行结果1:x=2y=1运行结果2:x=0y=-1【例4.11】输入3个实数,要求按从小到大的顺序输出。#include<stdio.h>intmain(){ 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\n",a,b,c); return0;}4.3.2if语句的嵌套一个if语句中又包含一个或多个if语句的现象称为if语句的嵌套。

if语句的基本形式:

if(表达式)

语句1;

else

语句2;if(表达式1) if(表达式2)

语句1;

else

语句2;else if(表达式3)

语句3;

else

语句4;语句1嵌套的if语句语句2嵌套的if语句表达式1表达式3语句4真假表达式2语句3语句1语句2真真假假图4.3if语句嵌套结构流程图在if语句嵌套的结构中一定要注意else与if之间的对应关系。例如:

if(表达式1)

if(表达式2)

语句1;

else

语句2;应该理解为?

if(表达式1)

if(表达式2)

语句1;

else

语句2;还是应理解为?

if(表达式1)

if(表达式2)

语句1;

else

语句2;为了避免这种二义性,在C语言中规定的对应原则是:e1se总是与它前面最近的一个未匹配的if相匹配。因此对上述例子应按后一种情况理解。【例4.12】输入3个任意整数,找出其中的最大值。

#include<stdio.h>intmain(){inta,b,c,max; scanf("%d%d%d",&a,&b,&c); if(a>b) if(a>c) max=a; else max=c;

elseif(b>c) max=b; else max=c;printf("max=%d\n",max);return0;}【例4.13】编写程序,输入一个x的值,按以下函数计算并输出y的值。#include<stdio.h>intmain(){ intx,y; scanf("%d",&x); if(x>0) y=1; else if(x==0) y=0; else y=-1; printf("y=%d\n",y); return0;}假假真真x>0x=0y=1y=0y=-1图4.4例4.13执行流程运行结果1:6y=1运行结果2:-3y=-1运行结果3:0y=04.3.3多分支if语句一般形式如下:if(表达式1)

语句1;elseif(表达式2)

语句2;…elseif(表达式n-1)

语句n-1;else

语句n;假表达式1表达式2语句1语句2语句n-1语句n真表达式n-1假真假假……图4.5多分支结构流程图【例4.14】编写程序,输入x的值,按以下分段函数计算并输出y的值。#include<stdio.h>#include<math.h>intmain(){floatx,y;printf("输入x的值:");scanf("%f",&x);if(x<2) y=2*x;elseif(x<=10) y=7-3*x;else y=1-cos(x);

printf("y=%0.6f\n",y);return0;}

【例4.15】编写程序由键盘输入一个字符,若该字符为小写字母,则将其转换为大写字母;若该字符为大写字母,则将其转换为小写字母;否则将其转换为ASCII码表中该字符的下一个字符。#include<stdio.h>intmain(){charc1,c2; /*定义两个字符变量*/printf("Pleaseenteracharacter:");c1=getchar(); /*键盘输入一个字符赋给变量c1*/if(c1>='a'&&c1<='z')c2=c1-32; /*转换成大写*/elseif(c1>='A'&&c1<='Z')c2=c1+32; elsec2=c1+1;putchar(c2); return0;}运行结果:请输入一个字符:Aa请输入一个字符:eEswitch语句的一般形式如下:switch(表达式){

case常量表达式1:语句1;break;

case常量表达式2:语句2;break;

case常量表达式n:语句n;break;

default:语句n+1;break;}关于switch语句的几点说明。(1)switch后的表达式可以是任何表达式,其值必须为整型,或字符型,或枚举型。(2)每个case后面的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象。(3)各个case和default的出现次序不影响执行结果。(4)可以让多个case共用一组执行语句。

(5)switch语句允许嵌套使用。4.4使用switch语句实现分支结构表达式的值=常量表达式2的值表达式语句1语句2语句n语句n+1表达式的值=常量表达式1的值表达式的值=常量表达式n的值其他breakbreakbreakbreak图3.4switch多分支结构执行流程图1.在switch语句格式中的每个语句后面都使用break语句【例4.16】编写程序,输入一个月份值,输出该月份是第几季度。#include<stdio.h>intmain(){ intmonth; printf("Entermonth:"); scanf("%d",&month); switch((month-1)/3) {case0: printf("%dmonthisfirstquarter."); break; case1: printf("%dmonthissecondquarter."); break; case2:printf("%dmonthisthirdquarter.");break;case3:printf("%dmonthisfourthquarter.");break;default:printf("Entererror.");break;}return0;}运行结果:输入月份:55月是第2季度2.在switch语句格式中的部分语句后面使用break语句【例4.17】本程序的功能是:根据键盘输入的年、月,输出该年、该月的天数。#include<stdio.h>intmain(){ intyear,month,days;

printf("请输入年,月:"); scanf("%d,%d",&year,&month); switch(month) { case1: case3: case5: case7: case8: case10: case12: days=31; break; case4:

case6: case9: case11: days=30; break; case2: if(year%400==0||year%4==0&&year%100!=0) days=29; else days=28; break;}

printf("%d年%d月的天数是%d天\n",year,month,days);return0;}运行结果:请输入年,月:2016,22016年2月的天数是29天【例4.18】使用switch语句编写例4.14的程序。#include<stdio.h>#include<math.h>intmain(){ intexpression;floatx,y; printf("输入x的值:"); scanf("%f",&x); expression=(int)(1*(x<2)+2*(x>=2&&x<=10)+3*(x>10)); switch(expression) {

case1: y=2*x; break; case2: y=7-3*x;break; case3: y=1-cos(x);break; } printf("y=%0.5f\n",y); return0;}说明:(1)变量expression用于存放构造表达式的值。(2)根据逻辑表达式的运算特点,构造出“(1*(x<2)+2*(x>=2&&x<=10)+3*(x>10))”表达式。当x<2时,表达式的值为1;当2≤x≤10时,表达式的值为2;当x>10时,表达式的值为3。3.在switch语句格式中不使用break语句switch语句中不使用break语句时,程序在执行相应语句后,不会跳出正在执行的switch语句,而会继续执行其后的所有语句。请读者删除例4.16中的所有switch语句,然后执行程序,分析其结果。4.5分支结构程序设计举例【例4.19】编写程序,输入x,计算并输出下列分段函数f(x)的值(保留2位小数),要求调用sqrt()函数求平方根,调用pow()函数求幂。

#include<stdio.h>#include<math.h> intmain(){floatx,y; scanf("%f",&x); if(x>=0)y=sqrt(x); elsey=pow(x,5)+2*x+1/x;printf("x=%.2f,y=%.2f\n",x,y);

return0;}【例4.20】编写程序,判断输入的年份是否为闰年。要求分别使用if语句的标准格式、嵌套格式及多分支格式实现。1.标准格式实现#include<stdio.h>intmain(){ intyear,leap;

printf("输入年份:");

scanf("%d",&year); if((year%4==0&&year%100!=0)||(year%400==0)) leap=1; else leap=0;if(leap)printf("%d是闰年\n",year);else

温馨提示

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

评论

0/150

提交评论