C语言程序设计教程第4章.ppt_第1页
C语言程序设计教程第4章.ppt_第2页
C语言程序设计教程第4章.ppt_第3页
C语言程序设计教程第4章.ppt_第4页
C语言程序设计教程第4章.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计教程* 1 C语言程序设计教程* 4.1 关系运算及其表达式 所谓“关系运算”实际上就是“比较运算”,即将两个数据进行比 较,判定两个数据是否符合给定的关系。关系操作数可以是数值类 型数据和字符型数据。 一、 关系运算符及其优先次序 1关系运算符 C语言提供6种关系运算符: = = != 注意:在语言中,“等于”关系运算符是双等号“= =”,而不 是单等号“= ”(赋值运算符)。 2优先级 (1)在关系运算符中,前4个优先级相同,后2个也相同,且前4个 高于后2个。 (= )( = != ) (2)与其它种类运算符的优先级关系 关系运算符的优先级,低于算术运算符,但高于赋值运算符。 a+b b+c 等效于 (a+b)(b+c)。 (2+a)=(b-a) 等效于2+a = b-a。 2 C语言程序设计教程* 3.结合性:自左至右; 例如: int a=2,b=3,c=1; abb,值是0 , 再计算 033 ,值是1 , 再计算 1b,a+bc-d,(a=3)=b,(ab)= =(bc) 2关系表达式的值:若为真,则结果为1; 若为假,则结果为0。 由于语言没有逻辑型数据,所以用整数“”表示“逻 辑真”,用整数“”表示“逻辑假”。 3 C语言程序设计教程* 例如,假设num1=3,num2=4,num3=5,则: (1)num1num2的值=0。 (2)(num1num2)!=num3的值=1。 (3)num1=0”。如果需要 描述“x=0”、同时“x=0) float b=3.5; !a (0) !(a 3 b = 1; c = a+ 结果: a为1,b为1,c为0。 (2)a = 1; b = 1; c=0; d = -a | b- |(c = b+3 ); 结果: a为0,b为0,c为0,d为1。 (3)逻辑表达式一般用于控制语句中的条件: 例如:(1) n是小于m的偶数: n ? : 求值规则和表达式的值: 真(非0),求解表达式2 求解表达式1 条件表达式的值 假(0),求解表达式3 例如: int max,a=5;b=3; max=ab?a:b max及赋值表达式的值 均为5; a条件赋值 又如: -a = b+ ? a+ : b+ (a=a-1;)4 = 3(b=b+1;)?a+:b+ a为4 b为4 0 4(b=b+1;) 表达式值为4,b为5 a值为4,b值为5,条件表达式的值为4。 结合性:自右至左; y = x10 ? x/10 : x10 ? x/10 :(x=A else max=num2; if (num3max) max=num3; printf(“Thethreenumbersare:%d,%d,%dn“,num1,num2,num3); printf(“max=%dn“,max); 16 C语言程序设计教程* 程序运行情况如下: Please input three numbers:11,22,18 The three numbers are:11,22,18 max=22 本案例中的第1个if语句,可优化为如下不带else子句的形 式: max=num1; if(num2max) max=num2; 这种优化形式的基本思想是:首先取一个数预置为max( 最大值),然后再用max依次与其余的数逐个比较,如果发 现有比max大的,就用它给max重新赋值,比较完所有的数 后,max中的数就是最大值。这种方法,对从3个或3个以上 的数中找最大值的处理,非常有效。请读者仔细体会。 17 C语言程序设计教程* 表达式1 先判断表达式1的值 真 语句1 非0就执行下面的语句 假 表达式2 为0就执行下一个判断 表达式3 语句4语句3语句2 真 真 假 假一直这样做下去 直到得出最后结果 3阶梯式if-else-if语句 一般形式:if (表达式1) 语句1 else if (表达式2) 语句2 else (表达式3) 语句3 18 C语言程序设计教程* 案例4.3从键盘上输入一个百分制成绩score,按下列原则 输出其等级:score90,等级为A;80score0) main() int x,y; scanf(“%d”, if (x=0) if (x0) y=1; else y=0; else y=-1; printf (“x=%d,y=%dn”,x,y); main() int x,y; scanf(“%d”, if (x0) y=1; printf (“x=%d,y=%dn”,x,y); 要求:(1)用无嵌套的if语句 ; (2)用嵌套的if语句编 程。 21 C语言程序设计教程* 三、说明 (1)if语句中的“表达式”必须用“(”和“)”括起来 , “表达式”除常见的关系表达式或逻辑表达式外,也 允许是其它类型的数据,如整型、实型、字符型等。 (2)执行语句可以是一条简单语句、空语句或复合语句 ,也可以嵌套其它流程控制语句 。 务必牢记:不管是简单语句,还是复合语句中的各个语句 ,每个语句后面的分号必不可少! 例如,案例4.2中的: if (num1num2) max=num1; else max=num2;语句: if行后面的赋值语句“max=num1;”分号不能省略。但不 要误认为if和else是2个独立的语句,它们都属于if语句 中的一部分,else是if语句的子句。 22 C语言程序设计教程* (3) else子句(可选)是if语句的一部分,必须与if 配对使用,不能单独使用。 (4)if语句允许嵌套,但嵌套的层数不宜太多。在实际 编程时,应适当控制嵌套层数(23层)。 (5)if语句嵌套时,else子句与if的匹配原则:与在它 上面、距它最近、且尚未匹配的if配对。 为明确匹配关系,避免匹配错误,强烈建议:将内嵌的 if语句,一律用花括号括起来。 23 C语言程序设计教程* 案例4.5 写一程序,从键盘上输入1年份year(4位十进 制数),判断其是否闰年。闰年的条件是:能被4整除、 但不能被100整除,或者能被400整除。 算法设计要点: (1)如果能被整除,则余数为,即如果的 值等于,则表示能被整除! (2)首先将是否闰年的标志leap预置为0(非闰年), 这样仅当year为闰年时将leap置为1即可。这种处理两种状 态值的方法,对优化算法和提高程序可读性非常有效, 请读者仔细体会。参考程序如下: main() int year,leap=0;/* leap=0:预置为非闰年*/ printf(“Please input the year:“); scanf(“%d“, 24 C语言程序设计教程* if (year % 4=0) else if (year%400=0) leap=1; if (leap) printf(“%d is a leap year.n“,year); else printf(“%d is not a leap year.n“,year); 利用逻辑运算能描述复杂条件的特点,可将上述程序优化如下 : main() int year; printf(“Please input the year:“); scanf(“%d“, if (year%4=0 else printf(“%d is not a leap year.n“,year); 25 C语言程序设计教程* 4.4 switch语句 C语言提供了switch语句直接处理多分支选择。switch语 句是多分支选择结构,它与break语句配合使用可以构成 多分支开关结构。 switch(表达式) case 常量表达式1:语句组1 case 常量表达式2:语句组2 case 常量表达式n:语句组n default: 语句组n+1 26 C语言程序设计教程* 流程如图 switch 表达式求值 表达式=常量式1? 表达式=常量式2? 表达式=常量式n? 语句组n+1 语句组1 语句组2 语句组n 真 假 真 假 真 假 27 C语言程序设计教程* 如果在每个case分支的语句组之后加上一条break 语句,则就得到了多分支开关结构的switch语句,即 : switch(表达式) case 常量表达式1:语句组1 break; case 常量表达式2: 语句组2 break; case 常量表达式n: 语句组n break; default: 语句组n+1 28 C语言程序设计教程* 控制流程图 switch 表达式求值 表达式=常量式1? 表达式=常量式2? 表达式=常量式n? 语句组n+1 真 假 真 假 真 假 语句组1break 语句组2break 语句组nbreak 29 C语言程序设计教程* 执行过程 (1)当switch后面“表达式”的值,与某个case 后面的“常量表达式”的值相同时,就执行该 case后面的语句(组);当执行到break语句时, 跳出switch语句,转向执行switch语句的下一条 。 (2)如果没有任何一个case后面的“常量表达式 ”的值,与“表达式”的值匹配,则执行default 后面的语句(组)。然后,再执行switch语句的 下一条。 30 C语言程序设计教程* switch(i) case 1:printf(An); case 2:printf(Bn); case 3:printf(Cn); case 4:printf(Dn); default: printf(En); 看下面的例子: 假设i=3时,则会从i=3时 做起的语句。 运行结果为: C D E 如果给每条语句加上 break; break; break; break; break; 这样就只执行一条语 句 当表达式的值与某一个常量相等时,就执行后面的语句 ;若无break语句,执行该语句后,流程控制转移到下一 个分支: 继续执行这一个分支的语句,一至到最后下个 语句执行完。 运行结果为: C 31 C语言程序设计教程* 案例4.6 从键盘上输入一个百分制成绩score,按下列原则 输出其等级:score90,等级为A;80score1e-6) x1=(-b+sqrt(disc)/(2*a);/*求出两个不相 等的实根*/ x2=(-b-sqrt(disc)/(2*a); printf(“x1=%7.2f,x2=%7.2fn“, x1, x2); 35 C语言程序设计教程* else p=-b/(2*a);/*求出两个共轭复根*/ q=sqrt(fabs(disc)/(2*a); printf(“x1=%7.2f + %7.2f in“, p, q); /*输出两个共轭 复根*/ printf(”x2=%7.2f - %7.2f in“, p, q); 说明:由于实数在计算机中存储时,经常会有一些微 小误差,所以本案例判断disc是否为0的方法是:判断disc 的绝对值是否小于一个很小的数(例如10-6)。 36 C语言程序设计教程* 案例4.8 已知某公司员工的保底薪水为500,某月所接工程的利润 profit(整数)与利润提成的关系如下(计量单位:元): profit1000没有提成; 1000profit2000提成10%; 2000profit5000提成15%; 5000profit10000提成20%; 10000profit提成25%。 算法设计要点: 为使用switch语句,必须将利润profit与提成的关系,转换成某些整 数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍( 1000、2000、5000、),如果将利润profit整除1000,则当: profit1000对应0、1 1000profit2000对应1、2 2000profit5000对应2、3、4、5 5000profit10000对应5、6、7、8、9、10 10000profit对应10、11、12、 37 C语言程序设计教程* 为解决相邻两个区间的重叠问题,最简单的方法就是:利润 profit先减1(最小增量),然后再整除1000即可: profit1000对应0 1000profit2000对应1 2000profit5000对应2、3、4 5000profit10000对应5、6、7、8、9 10000profit对应10、11、12、 main() long profit; int grade; float salary=500; printf(“Input profit: “); scanf(“%ld“, grade= (profit 1) / 1000;/*将利润-1、再整除1000,转化成 switch语句中的case标号*/ 38 C语言程序设计教程* switch(grade) case 0: break;/*profit1000 */ case 1: salary +=

温馨提示

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

评论

0/150

提交评论