C语言课件谭浩强cha.ppt_第1页
C语言课件谭浩强cha.ppt_第2页
C语言课件谭浩强cha.ppt_第3页
C语言课件谭浩强cha.ppt_第4页
C语言课件谭浩强cha.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

第5章 选择结构程序设计 51 关系运算符和关系表达式 关系运算是逻辑运算中比较简单的一种。 所谓“关系运算”实际上是“比较运算”。 将两个值进行比较,判断比较的结果是否符 合给定的条件。例如,a3是一个关系表达 式,大于号()是一个关系运算符,如果a 的值为5,则满足给定的“a3”条件,因此 关系表达式的值为“真”(即“条件满足” );如果a的值为2,不满足“a3”条件, 则称关系表达式的值为“假” (即“条件不 满足”)。 5.1.1 关系运算符及其优先次序 C语言提供6种关系运算符: (1) (大于) (4) = (大于或等于) (5) = (等于) (6) != (不等于) 关于优先次序: 1前4种关系运算符(,)的优 先级别相同,后两种也相同。前4种高于后2种。例 如,“”优先于“=”。而“”与“”优先 级相同。 2关系运算符的优先级低于算术运算符。 3. 关系运算符的优先级高于赋值运算符。 高 低 算术运算符 关系运算符 赋值运算符 例如:ca+b 等效于 c(a+b) ab!=c 等效于 (ab)!=c a=b ,= 左 = ,!= 左 = 低 右 运算符的目:参与运算的操作数的个数单目、双目、三 目 除=外,奇数目运算符右结合性 偶数目运算符左结合性 5.1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或 关系表达式、逻辑表达式、赋值表达式、字符表达式 )连接起来的式子,称关系表达式。例如,下面都是 合法的关系表达式: ab, abbc,(a3)(b=5),a b,(ab)(bc) 关系表达式的值是一个逻辑值,即“真”或“假” 。例如,关系表达式“5=3”的值为“假” , “5=0”的值为“真”。C语言没有逻辑型数据( Pascal语言以True表示“真”,以Fa1se表示“假” 。PASCAL和FORTRAN等语言都有逻辑型变量和逻辑型 常量),以1代表“真”,以“0”代表“假”。 例如,若a=3,b=2,c=1,则: ab的值为”真”,表达式的值为1。 (ab)=c的值为“真”(因为ab的值 为1,等于c的值),表达式的值为1。 bca的值为“假”,表达式的值为0。 如果有以下赋值表达式: dab d的值为1。 fabc f的值为0(因为“”运 算符是自左至右的结合方向,先执行“ab” ,得值为1,再执行关系运算:“1c”得值0 ,赋给f 52逻辑运算符和逻辑表达式 用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。下面介 绍C语言中的逻辑运算符和逻辑运算。 5.2.1逻辑运算符及其优先级 C语言提供三种逻辑运算符: 1 这种if语句的执行过程见图 0 表达式 语句 1 2if(表达式) 语句1 else 语句2 例如:if(xy) printf(”d”,x); else printf(”d”,y); 见图 表达 式 语句1语句2 真假 3 if (表达式1) 语句1 else if (表达式2) 语句2 else if(表达式3) 语句3 else if (表达式m) 语句m else 语句m+1 流程图 表达式 1 F T 表达式 3 F T 表达式 2 F T 表达式 4 F T 语句4语句5 语句3语句2语句1 例如。 if (number500) cost015; else if(number300) cost=010: else if (number100) cost=0075; else if (number50) cost0.05; else cost0; 说明: 三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关 系表达式。例如,if(a=b else printf(“%f”,-x); 这是由于分号是C语句中不可缺少的部分,这个分 号是让语句中的内嵌语句所要求的。如果无此分号, 则出现语法错误。但应注意,不要误认为上面是两个 语句(if语句和else语句)。 它们都属于同一个if语句。else子句不能作为语句 单独使用,它必须是if语句的一部分,与if配对使用 。 3在if和else后面可以只含一个内嵌的操作语句 (如上例),也可以有多个操作语句,此时用花括号 “ ”将几个语句括起来成为一个复合语句(如果需要 多条语句,必须使用复合语句)。如: if (abcarea=sqrt(s*(s-a)*(s-b)*(s-c) ); printf(”area6.2f”,area); else printf (”it is not a trilateral”); 注意在 外面不需要再加分号。因为 内是一个 完整的复合语句,不需另附加分号。 例5.1输入两个实数,按代数值由小到大次序输出这两个数 。 /* example 5.1 at page 93 */ main() float a,b,t; scanf(“%f,%f“, if(ab) t=a;a=b;b=t; printf(“%5.2f,%5.2f“,a,b); 运行情况如下。 输入:3.6,-3.2 输出:-320,360 例52输入三个数,按大小顺序输出。 main() float a,b,c,t; printf(“Input a,b,cn“); scanf(“%f,%f,%f“, if(ab) t=a;a=b;b=t; if(ac) t=a;a=c;c=t; if(bc) t=b;b=c;c=t; printf(“%5.2f,%5.2f,%5.2f“,a,b,c); 运行情况如下: 3,7,1 100,300,700 5.3.2语句的嵌套 在if语句中又包含一个或多个if语句称为if 语句的嵌套。一般形式如下: if () if()语句1 else 语句2 else if ()语句3 else 语句4 应当注意if与else的配对关系。从最内层开始, else总是与它上面最近的(未曾配对的)if配对。假 如写成: if () if()语句1 else if ()语句2 else 语句3 编程序者把else写在与第一个if(外层if)同一列上 ,希望else与第一个if对应,但实际上else是与第二个if 配对,因为它们相距最近。因此最好使内嵌if语句也包 含else部分,这样if的数目和else的数目相同,从内层到 外层一一对应,不致出错。 如果if与else的数目不一样,为实现程序设计者的企图,可 以加花括弧来确定配对关系。例如: if( ) if ( )语句1 else 语句2 这时if限定了内嵌if语句的范围,因此else与第一个让配对 。 例53有一函数: -1 (x0) 编一程序,输入一个x值,输出y值。 有以下几种写法,请读者判断哪些是正确的? 程序1: main () int x,y; scanf(”d”,x); if(x=0) if(x0) y=1; else y=0; else y一1; 程序3: 将上述if语句改为: y一1; if(x!=0) if(x0) y1: else y0; 程序4: y0; if(x=0) if(x0) y1; else y-1; 只有程序1和2是正确的。一般把内嵌的if语句放在外层 的else子句中(如程序1那样),这样由于有外层的else相隔,内 嵌的else不会和外层的if配对,而只能与内嵌的让配对,从而不 致搞混,如像程序3、4那样就容易混淆。 5.3.3条件运算符 若if语句中,在表达式为“真”和“假”时,且都只执行一 个赋值语句给同一个变量赋值时,可以用简单的条件运算符来 处理。例如,若有以下if语句: if (ab) max=a; else maxb; 可以用下面的条件运算符(? :)来处理: max(ab)?a:b; 其中”(ab)?a:b”是一个“条件表达式”。它是这样 执行的。如果(ab)条件为真,则条件表式取值a,否则取值 b. 条件运算符要求有三个操作对象,称三目(元)运算符。条件 表达式的一般形式为 表达式1?表达式2:表达式3 它的执行过程见图57。 表达式 1 表达式2表达式3 T (1) F(0) 说明 1条件运算符的执行顺序:先求解表达式1,若为非0(真 )则求解表达式2,此时表达式2的值就作为整个条件表达式的 值。若表达式1的值为0(假),则求解表达式3,表达式3的值就 是整个条件表达式的值。 max(ab)?a:b 执行结果就是将条件表达式的值赋给max,也就是将a和b二 者中大者赋给max。 2条件运算符优先于赋值运算符,因此上面赋值表达式的 求解过程是先求解条件表达式,再将它的值赋给max。 条件运算符的优先级别比关系运算符和算术运算符都低。因 此, max=(ab)?a:b 括号可以不要,可写成 max=ab?a:b 如果有 ab?a:b1,相当于ab?a:(b1),而不相 当于(ab?a:b)1。 3条件运算符的结合方向为“自右至左”。如果有以 下条件表达式: ab?a:cd?c:d 相当于 ab?a:(cd?c:d) a=1,b=2,c=3,d4,则条件表达式的值等于4。 4条件表达式不能取代一般的if语句,只有在if语句 中内嵌的语句为赋值语句(且两个分支都给同一个变量赋 值)时才能代替if语句。象下面的if语句就无法用一个条 件表达式代替。 if(ab) printf(“d”,a); else printf(“d”,b); 但可以用下面语句代替: printf(”d”,ab ?a:b); 即将条件表达式的值输出。 5条件表达式中,表达式1的类型可以与表达式2和 表达式3的类型不同。 如 x?a:b x是整型变量,若x=0,则条件表达式的值为b。 表达式2和表达式3的类型也可以不同,此时条件表达 式的值的类型为二者中较高的类型。 如 xy?1:1.5 如xy值应为1 ,由于15是实型,比整型高(见第二章27),因 此,将1转换成实型值10。 6补充条件运算符如果表达式1不成立,则计算 表达式2的值,但并不计算表达式3 。 如果有以下程序: main() int a= 2,b= 1,i=3,c; c=ab?2:+i; printf(“c=%d,i=%dn“,c,i); 运行结果为 c=2,i=3 如果将c=ab?2:+i改为c=a=A imagpart=sqrt(-disc)/(2*a); printf(“has complex roots:n“); printf(“%8.4f+%8.4fin“,realpart,imagpart); printf(“%8.4f-%8.4fin“,realpart,imagpart); 程序中用disc代表b2一4ac,先计算disc的值,以减少 以后的重复计算。对于判断b2一4ac是否等于0时,要注意 一个问题:由于disc(即b2一4ac)是实数,而实数在计算 和存储时会有一些微小的误差,因此不能直接进行如下判 断:if (disc=0)。因为这样可能会出现本来是零的 量,由于上述误差而被判别为不等于零而导致结果错误。 所以采取的办法是判别disc的绝对值(fabs(disc)是 否小于一个很小的数(例如10-6),如果小于此数,就认 为disc=0。程序中以realpart代表实部p,以imagpart代表 虚部q,以增加可读性。 习题.() 给出一个不多于位的正整数,要求:)求 出它是几位数;)分别打印每一位数字;) 按逆序打印各位数字 思路:分别剥离每一个数字 如:剥离成,同时注意高位 为空和低位为的情况 解main() int n1,n2,n3,n4,n5,temp,place=0;long num; scanf(“%ld”, n5=num/10000;temp=num%10000; if(n5!=0)place=5; n4=temp/1000;temp=temp%1000; if(n5!=0 n3=temp/100;temp=temp%100; if(n3!=0 n2=temp/10;temp=temp%10; if(n2!=0 n1=temp; printf(“%d “,n1); if (place=2) printf(“%d “,n2); if (place=3) printf(“%d “,n3); if (place=4) printf(“%d “,n4); if (place=5) printf(“%d “,n5); printf(“n“); 解2 /* use loop */ #include “math.h” main() int n5,i,temp,place=5;long num; scanf(“%ld”, temp=num; for(i=4;i=0;i-) ni=temp/(int)pow(10,i); temp=temp%(int)pow(10,i); if(ni=0)place-; for(i=place;i=0,i-) printf(“%d “,ni); printf(“n“); 解3 /* use char */ main() char n1,n2,n3,n4,n5; scanf(“%c%c%c%c%c”, printf(“%c%c%c%c%c”,n5,n4,n3,n2,n1) ; printf(“n“); 解4 /* use char and loop */ main() char c5,t; int i,number=0; for(i=0;i=0i-) printf(“%c “,ci); printf(“nn“); 练习 1设有int i;则表达式i=1,+i|+i; i的值为 1) 12) 23) 34) 4 2设有int i;则表达式(i=1,i=10)?i+|+i:+i 的值为 1) 12) 23) 34) 10 5)11 3设有int i,j,k;则表达式 i=1,j=2,k=3,ielse i-;后i的值为 。 5下列程序的输出是 1) 0032) 0123) 1034) 112 main() int a=-1,b=4,k; k=(a+bc) printf(“%dn“, d); else if ( (c-1 = d) = 1) printf(“%dn“, d+1); else printf(“%dn“, d+2); 执行后输出结果是 1)2 2)3 3)4 4)编译时有错,无结果 8有以下程序(2003上半年) main() int i; for (i=0; i3; i+) switch (i) case 1: printf(“%d “, i); case 2: printf(“%d “, i); default : printf(“%d “, i); 执行后输出结果是 A)011122 B)012 C)012020 D)120 9以下程序运行后的输出结果是 。(2003下半 年) main() int i,m=0,n=0,k=0; for(i=9; i=11;i+) switch(i/10

温馨提示

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

评论

0/150

提交评论