第5章C程序设计----谭浩强

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

5.1关系运算符和关系表达式5.2逻辑运算符和逻辑表达式5.3if语句5.4switch语句5.5程序举例习题第5章选择结构程序设计在第3章中已介绍了选择结构,它是三种基本结构之一。在大多数程序中都会包含选择结构。它的作用是,根据所指定的条件是否满足,决定从给定的两组操作选择其一。在本章中介绍如何用c语言实现选择结构。在c语言中选择结构是用if语句实现的。if语句最常用的形式是if(关系表达式)语句1else语句2例如:if(x0)y=1;elsey=-1;其中x0是一个关系表达式。“”是一个关系运算符。5.1关系运算符和关系表达式关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。例如,a>3是一个关系表达式,大于号(>)是一个关系运算符,如果a的值为5,则满足给定的“a>3”条件,因此关系表达式的值为“真”(即“条件满足”);如果a的值为2,不满足“a>3”条件,则称关系表达式的值为“假”。5.1.1关系运算符及其优先次序C语言提供6种关系运算符:优先级相同(高):①<(小于)②<=(小于或等于)③>(大于)④>=(大于或等于)优先级相同(低):⑤==(等于)⑥!=(不等于)关于优先次序:(1)前4种关系运算符(<,<=,>,>=)的优先级别相同,后两种也相同。前4种高于后2种。例如,“>”优先于“==”。而“>”与“<”优先级相同。(2)关系运算符的优先级低于算术运算符。(3)关系运算符的优先级高于赋值运算符。以上关系见图5.1。例如:c>a+b等效于c>(a+b)a>b==c等效于(a>b)==ca==b<c等效于a==(b<c)a=b>c等效于a=(b>c)图5.15.1.2关系表达式用关系运算符将两个表达式(可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称关系表达式。例如,下面都是合法的关系表达式:a>b,a+b>b+c,(a=3)>(b=5),'a'<'b',(a>b)>(b<c)关系表达式的值是一个逻辑值,即“真”或“假”。例如,关系表达式“5==3”的值为“假”,“5>=0”的值为“真”。c语言没有逻辑型数据(Pascal语言以True表示“真”,以false表示“假”。PascaL和FORTRAN等语言都有逻辑型变量和逻辑型常量),以1代表“真”,以“0”代表“假”。例如,a=3,b=2,c=1,则:关系表达式“a>b”的值为“真”,表达式的值为1。关系表达式“(a>b)==c”的值为“真”(因为a>b的值为1,等于c的值),表达式的值为1。关系表达式“b+c<a”的值为“假”,表达式的值为0。如果有以下赋值表达式:d=a>bd的值为1。f=a>b>cf的值为0(因为“>”运算符是自左至右的结合方向,先执行“a>b”得值为1,再执行关系运算“1>c”,得值0,赋给f)。用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。在basic和Pascal语言中有以下形式的逻辑表达式(AND是逻辑运算符):(a>b)AND(x>y)如果a>b且x>y,则上述逻辑表达式的值为“真”。下面介绍c语言中的逻辑运算符和逻辑运算。5.2.1逻辑运算符及其优先次序C语言提供三种逻辑运算符:5.2逻辑运算符和逻辑表达式(1)&&逻辑与(相当于其他语言中的aND)(2)||逻辑或(相当于其他语言中的OR)(3)!逻辑非(相当于其他语言中的NOT)“&&”和“||”是“双目(元)运算符”,它要求有两个运算量(操作数),如(a>b)&&(x>y),(a>b)||(x>y)。“!”是“一目(元)运算符”,只要求有一个运算量,如(a>b)。逻辑运算举例如下:a&&b若a、b为真,则a&&b为真。a||b若a、b之一为真,则a||b为真。!a若a为真,则!a为假。在一个逻辑表达式中如果包含多个逻辑运算符,如!a&&b||x>y&&c按以下的优先次序:(1)!(非)→&&(与)→(或),即“!”为三者中最高的。(2)逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。见图5.2。图5.2例如:(a>b)&&(x>y)可写成a>b&&x>y(a==b)||(x==y)可写成a==b||x==y(!a)||(a>b)可写成!a||a>b5.2.2逻辑表达式如前所述,逻辑表达式的值应该是一个逻辑量“真”或“假”。c语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即将一个非零的数值认作为“真”。例如:(1)若a=4,则!a的值为0。因为a的值为非0,被认作“真”,对它进行“非”运算,得“假”,“假”以0代表。(2)若a=4,b=5,则a&&b的值为1。因为a和b均为非0,被认为是“真”,因此a&&b的值也为“真”,值为1。(3)a、b值同前,a||b的值为1。(4)a、b值同前,!a||b的值为1。(5)4&&0||2的值为1。通过这几个例子可以看出,由系统给出的逻辑运算结果不是0就是1,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象(操作数)可以是0(“假”)或任何非0的数值(按“真”对待)。如果在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对象。例如:5>3&&8<4-!0表达式自左至右扫描求解。首先处理“5>3”(因为关系运算符优先于&&)。在关系运算符两侧的5和3作为数值参加关系运算,“5>3”的值为1。再进行“1&&84-!0”的运算,8的左侧为“&&”,右侧为“”运算符,根据优先规则,应先进行“”的运算,即先进行“84-!0”的运算。现在4的左侧为“”,右侧为“-”运算符,而“-”优先于“”,因此应先进行“4-!0”的运算,由于“!”的级别最高,因此先进行“!0”的运算,得到结果1。然后进行“4-1”的运算,得结果3,再进行“83”的运算,得0,最后进行“1&&0”的运算,得0。实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0的整数,也可以是任何类型的数据。可以是字符型、实型或指针型等。系统最终以0和非0来判定它们属于“真”或“假”。例如'c'&&'d'的值为1(因为‘c’和‘d’的ascII值都不为0,按“真”处理)。在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。例如:(1)a&&b&&c只有a为真(非0)时,才需要判别b的值,只有a和b都为真的情况下才需要判别c的值。只要a为假,就不必判别b和c(此时整个表达式已确定为假)。如果a为真,b为假,不判别c。见图5.3。(2)a||b||c只要a为真(非0),就不必判断b和c;只有a为假,才判别b;a和b都为假才判别c。见图5.4。图5.3图5.4也就是说,对&&运算符来说,只有a≠0,才继续进行右面的运算。对运算符‖来说,只有a=0,才继续进行其右面的运算。因此,如果有下面的逻辑表达式:(m=a>b)&&(n=c>d)当a=1,b=2,c=3,d=4,m和n的原值为1时,由于“a>b”的值为0,因此m=0,而“n=c>d”不被执行,因此n的值不是0而仍保持原值1。这点请读者注意。熟练掌握c语言的关系运算符和逻辑运算符后,可以巧妙地用一个逻辑表达式来表示一个复杂的条件。例如,要判别某一年year是否闰年。闰年的条件是符合下面二者之一:①能被4整除,但不能被100整除。②能被4整除,又能被400整除。可以用一个逻辑表达式来表示:(year%4==0&&year%100!=0)||year%400==0当year为某一整数值时,如果上述表达式值为真(1),则year为闰年;否则year为非闰年。可以加一个“!”用来判别非闰年:!((year%4==0&&year%100!=0)||year%400==0)若表达式值为真(1),year为非闰年。也可以用下面逻辑表达式判别非闰年:(year%4!=0)||(year%100==0&&year%400!=0)若表达式值为真,year为非闰年。请注意表达式中右面的括弧内的不同运算符(%,!,&&0,==)的运算优先次序。5.3if语句if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。5.3.1if语句的三种形式C语言提供了三种形式的if语句:1.if(表达式)语句例如:if(x>y)printf(%d,x);这种if语句的执行过程见图5.5(a)。2.if(表达式)语句1else语句2例如:if(x>y)printf(%d,x);elseprintf(%d,y);见图5.5(b)。图5.53.if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3…elseif(表达式m)语句melse语句n流程图见图5.6。图5.6例如:if(number500)cost=0.15;elseif(number300)cost=0.10;elseif(number100)cost=0.075;elseif(number50)cost=0.05;elsecost=0;说明:(1)三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式。例如,if(a==b&&x==y)printf(“a=b,x=y”);在执行if语句时先对表达式求解,若表达式的值为0,按“假”处理,若表达式的值为非0,按“真”处理,执行指定的语句。假如有以下if语句:if(3)printf(O.k.);是合法的,执行结果输出“O.k.”,因为表达式的值为3,按“真”处理。由此可见,表达式的类型不限于逻辑表达式,可以是任意的数值类型(包括整型、实型、字符型、指针型数据)。例如,下面的if语句也是合法的:if('a')printf(%d,'a');执行结果:输出‘a’的ASCII码97。(2)第二、第三种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。例如:if(x0)Print(%f,x);else各有一个分号printf(%f,-x);这是由于分号是c语句中不可缺少的部分,这个分号是if语句中的内嵌语句所要求的。如果无此分号,则出现语法错误。但应注意,不要误认为上面是两个语句(if语句和else语句)。它们都属于同一个if语句。else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。(3)在if和else后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用花括号“{}”将几个语句括起来成为一个复合语句。如:if(a+bc&&b+c>a&&c+a>b){s=0.5*(a+b+c);area=sqrt(S*(S-a)*(S-b)*(S-c));printf(area=%6.2f,area);}elseprintf(itisnotatrilateral);注意在第3行的花括号“}”外面不需要再加分号。因为{}内是一个完整的复合语句,不需另附加分号。例5.1输入两个实数,按代数值由小到大的次序输出这两个数。这个问题的算法很简单,只需要作一次比较即可。对类似这样简单的问题可以不必先写出算法或画流程图,而直接编写程序。或者说,算法在编程者的脑子里,相当于在算术运算中对简单的问题可以“心算”而不必在纸上写出来一样。程序如下: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);}运行情况如下:3.6,-3.2-3.20,3.60例5.2输入3个数a,b,c,要求按由小到大的顺序输出。解此题的算法比上一题稍复杂一些。可以用伪代码写出算法:ifab将a和b对换(a是a,b中的小者)ifac将a和c对换(a是a,c中的小者,因此a是三者中最小者

1 / 75
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功