资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,Date:,28 November 2024,Date:,28 November 2024,C语言程序设计案例教程,(二,),Date:,28 November 2024,第8次关系运算符、条件运算符,本章主要知识点,根本的数据类型,常量和变量,结构体数据类型,C语言各种运算符和表达式的应用,复习,关系运算符及表达式,条件运算符及表达式,授课要点,问题引入,星光大道评委正在给最后决赛的两名选手打分,到底谁是冠军呢?我们现在只能根据最后的总分来决定。结果由选手的成绩要进行比较得出。,问题分析,表示两个操作数或表达式的大小关系,采用,关系运算符,关系运算符及表达式举例,返回本节目录,#include,void main(),int a,b;,printf(a=);,scanf(%d,printf(b=);,scanf(%d,printf(ab:%dn,ab);,printf(ab:%dn,a=b:%dn,a=b);,printf(a=b:%dn,a = ,=,=90)?printf(,一等奖学金,):(score=88)?printf(,二等奖学金,):(score=85)?printf(,三等奖学金,):printf(,没有奖学金,);,模仿练习,使用条件表达式表示奖学金的评奖方式,学校根据同学的总评成绩评特等、一等、二等奖学金,总评成绩为,90,分及以上为特等奖学金、,88,分及以上为一等奖学金,,85,分及以上为二等奖学金。,条件运算符及表达式,总结,条件运算符是“?:,是C语言中唯一的三目运算符,用条件运算符将两个表达式连接起来的符合C语法规那么的式子称为条件表达式。,2.条件表达式的一般形式:,表达式1?表达式2:表达式3 ;,操作过程:先计算表达式1的值,假设为“真,那么计算表达式2的值,整个条件表达式的值就是表达式2的值;假设表达式1的值为“假,那么计算表达式3,整个条件表达式的值就是表达式3的值。,条件运算符优先级低于逻辑运算符,其结合性是右结合。,返回本节目录,小组讨论并总结,比较赋值运算=符和等于= =的区别,比较运算符的结果为什么?,条件运算表达式如何计算?,结论1赋值运算符和等于运算符比较,赋值运算符表示为,=,,其结果为将,=,右边的值赋给左边的变量,左边只能为变量,等于运算符表示为,=,,其结果为逻辑值真和假,不修改任何变量的值,左右两边可为常量或变量,结论2比较运算符的结果,比较运算符的结果为0假,1真,结论,3,条件运算符的运算方法,表达式1?表达式2:表达式3 ;,操作过程:先计算表达式1的值,假设为“真,那么计算表达式2的值,整个条件表达式的值就是表达式2的值;假设表达式1的值为“假,那么计算表达式3,整个条件表达式的值就是表达式3的值。,条件运算符可以嵌套,过程与上类似,学以致用,运动会上,跳高场上A同学跳的比B同学高,如何表示?,100米短跑,A同学比B同学跑得快,如何表示?,找一些生活中常见的例子,用比较运算表达式描述,作业,每人必做,1,、用条件表达式描述:取三个数的最大者。,2,、输入一名学生的某科成绩,输出等级。,成绩,85,等级:,A,成绩,70,等级:,B,成绩,60,等级:,C,成绩,60,等级:,D,作业,小组必做,学以致用:,找一些生活中常见的例子,用条件运算表达式描述,例如:某银行存款,5,万块以上可以办金卡、存款,20,万以上可以办,VIP,特种卡,其余为一般信用卡,根据存款金额判断某用户的银行卡种类。,IT Education & Training,Date:,28 November 2024,第9次逻辑运算符,本章主要知识点,根本的数据类型,常量和变量,结构体数据类型,C语言各种运算符和表达式的应用,复习,逻辑运算符及表达式,数据类型转换,授课要点,问题引入,年份,要判断该年是否为闰年?该年份能够被400整除,或者能够被4整除并且不能被100整除,问题分析,表示两个操作数或表达式能够同时满足多个条件或满足多个条件之一,采用,逻辑运算符,问题解决,返回本节目录,#include /*该程序利用逻辑表达式判断是否为闰年*/,void main(),int year;,printf(请输入年份判断是否为闰年:);,scanf(“%d,/*输入年份*/,year%400=0|(year%4=0 /*逻辑表达式*/,判断输入的年份是否为闰年?,模仿练习,1,、判断字符,ch,是否为大写字母的表达式,2,、判断字符,ch,是否为字母的表达式,逻辑表达式的结果为逻辑值,真,1,或假,0,在进行条件判断时,非,0,为真,,0,为假,其结果可以赋值给整型变量或字符型变量,注意:,逻辑运算符的运算为,短路运算,,即在,&,左边值为,0,时不再计算右边,,|,左边值为,1,时不再计算右边,如:,x=1;y=1,计算,-,x&-y,后,x,y,的值,x=1;y=1,,计算,+,x|+y,后,x,y,的值,逻辑运算符及表达式总结,三种逻辑运算符:,1 & 逻辑与 二元运算,2 | 逻辑或 二元,3 ! 逻辑非 一元,参照逻辑运算真值表,有以下运算规那么:,1.a&b 当且仅当a和b都为1值为1,否那么为0,2.a|b 当且仅当a和b都为0值为0,否那么1,3. !a 其值和a的值相反,注: &运算符优先级高于|运算符,逻辑运算符及表达式总结,运算符及表达式总结:,表达式运算顺序:先判断优先级,先按优先级高的运算符计算,如优先级相同,那么看结合性。,优先级:,括号单目运算符 算术运算符关系运算符 逻辑运算符三目运算符 赋值运算符 逗号运算符,2结合性:,所有的单目运算和三目运算符,赋值运算符为自右向左,其余为自左向右。,模仿练习,x=1,y=10,z=(,x,y,);,求,x,y,z,的值?,X=1,y=10,z=x=y;,求,x,y,z,的值?,复习,逻辑运算符及表达式,数据类型转换,授课要点,问题引入,设,x=2.5,a=7,y=4.7,求表达式的值:,x+a%3*(int)(x+y)%2/4-9,问题分析,计算上式,容易将结果误写为-6.25,编写程序,将该式在VC环境下调试,结果为-6.5,原因:a%3*(int)(x+y)%2/4局部计算的结果应为0,因为整型数和整型数运算的结果为整型,而非小数0.25。在运算过程中必须弄清不同数据类型间计算时发生的数据类型转换,数据类型转换隐式转换,自动转换条件:,不同类型数据进行混合运算自动转换,规那么如以下图:,double,float,long,unsigned,int,char,short,低,高,说明,:,必定的转换,运算对象类型不同时转换,显式转换强制转换,一般形式:,类型名表达式,有如下定义: float x,y;,( int ) (x+y);,注:得到所与类型的中间变量,原来的变,量类型不变。,较高类型向较低类型转换时可能发生精度损失,例 main(), float x;,int i;,x=9.8;,i=(int)x;,printf(“x=%f,i=%d,x,i);,结果:x=9.800000,i=9,转换规那么,1单、双浮点型整型:小数局部舍弃,,有效位截取字符型低8位,2整型浮点型:数值不变,存储到浮,点型变量中,3假设运算符两边均为整型,那么结果按整,形处理,4假设运算符一边以上为浮点型,小数,局部保存,补充:sizeof()运算符,sizeof(,类型名,/,变量名,),该函数用来得到该类型,/,该变量存储在内存中所占的字节数:,如:在,VC,环境中,,sizeof(short),的值为,2,sizeof(int ),的值为,4,如有定义,float x,y;,在,VC,环境中,,sizeof(x),的值为,4,sizeof(y),的值为,4,模仿练习,将整型数,20,转换为浮点型,如何转换?,使用,sizeof,( ),运算符求,char,、,int,、,short,、,long,、,float,、,double,、,long double,等类型在,VC,环境中的存储字节数,小组讨论并总结,逻辑运算表达式的值和算术运算表达式的值区别是什么?,&,运算符和,|,运算符什么时候出现短路运算,各逻辑运算符的优先级别讨论,结论1逻辑运算、算术运算值比较,逻辑运算结果只能为0或1,算术运算结果可为相应范围内的整型或实型值,当算术运算结果作为逻辑运算的运算对象时,非0认定为逻辑值1,否那么为0,结论,2&,运算符和,|,运算符短路运算,&,运算符的左边出现,0,|,运算符的左边出现,1,结论,3,逻辑运算符的优先级别讨论,!为单目运算符,其优先级高于所有双目运算符,&、|运算符优先级低于算术运算和比较运算符,高于条件运算符,&运算符优先级高于|运算符,学以致用,找出生活中一些满足多个条件的运算,并且用逻辑表达式表示,例如:实型变量,x1,、,x2,和,x3,中依次存放着语文、数学和外语的入学考试成绩,录取的标准是平均分及格,而且三门成绩中至少有一门超过,75,,写出判断能否录取的表达式。,作业,每人必做,1.,求表达式的值:,17,!(2sweight*1.1)|(weightsweight*1.1,输出体型偏胖,开始,weightsweight*1.1)|(weightsweight*1.1)|(weight(sweight*1.1)|(weight(sweight*0.9) /超过标重,printf(n您的体重超过正常范围,请注意改善!);,else/在正常范围内,printf(n恭喜您!您的体重很完美!);,模仿练习,根据流程图用if-else结构编写程序,【练习1】输入学生的三门课程成绩(实数,0100之间),计算平均分并判断是否及格,成绩大于等于60输出平均分及格,否那么输出平均分不及格。,复习,if,语句,使用,if,语句嵌套,switch,语句,授课要点,体重问题拓展,也许你测试的结果是:体重超标!,可是你更关心的结果是:偏瘦或偏胖?,标准体重身高1000.9单位:千克,其数值的正负10为健康。,体重问题拓展分析,(,多分支,),根据问题描述,体型的判断有三种结果:健康体型、偏胖、偏瘦,流程图描述采用两次分支结构,采用,嵌套的,if-else,结构,即可解决。,采用多分支结构多个if-else结构进行判断方式,条件,1,条件,2,A,C,B,N,Y,N,if(,条件,1), A ,else,if(,条件,2),B,else,C,A,、,B,、,C,为处理块,多分支结构流程图,N,结束,输出体重正常,weightsweight*1.1,输出体型偏胖,Y,N,嵌套的if-else局部代码,if(weight(sweight*1.1) /*,偏胖*,/,printf(“n,您的体型偏胖,请注意改善!,);,else,if(weight(sweight*0.9) /*,偏瘦*,/,printf(“n,您的体型偏瘦,请注意改善!,);,else /*,在正常范围内*,/,printf(n,恭喜您!您的体重很完美!,);,程序,sweight=(height-100)*0.9,输入身高,height,体重,weight,开始,N,结束,输出体重正常,weightsweight*1.1,输出体型偏胖,Y,N,#include ,void main()/主函数,int height;/用户身高,float stand_weight,weight;/标准体重,用户体重,printf(n请输入您的身高,以cm为单位:);,scanf(%d, /输入身高,单位为cm,printf(n请输入您的体重,以kg为单位:);,scanf(“%f,/输入体重,单位为kg,stand_weight=(height-100)*0.9;/计算标准体重,if(weight(sweight*1.1)/超重,printf(“n您的体型偏胖,请注意改善!);,else,if(weight(sweight*0.9)/偏轻,printf(“n您的体型偏瘦,请注意改善!);,else/在正常范围内,printf(n恭喜您!您的体重很完美!);,模仿练习,根据流程图用if-else嵌套结构编写程序,【练习2】输入学生的三门课程成绩(实数,0100之间),计算平均分并判断平均分属于哪种等级,85分以上:A 7085:B 6070:C 低于60:D,if,语句嵌套总结,用于表达多个判断条件,多分支结构,一般形式:,if (,表达式,1),语句,1,else if ( ),语句,2,else,语句,3,执行顺序:,先对表达式1进行判断,条件成立执行语句1,否那么对表达式2进行判断,条件成立执行语句2,否那么执行语句3,注意:,当采用省略else形式时,要注意 if 和 else 的配对规那么。用else 与前面最接近它且未配对的if 配对。,复习,if,语句,使用,if,语句嵌套,switch,语句,授课要点,问题,2:,打印课程表,假设星期一到星期五的课程各不相同,请将课程表打印出来。,判断方法:逐一用输入的星期几day和17比较,假设相同输出该天的课程,假设不相同继续比较,输入的day如果不在17之间那么显示输入错误,问题分析,从星期一到星期天共7天,假设采用if-else嵌套,层数太多,而对天数的判断条件比较简单,分支较多的多分支结构,采用switch结构最简洁合理。,1.算法描述流程图,2.采用switch结构描述流程图,1.,流程图,开始,结束,输入星期几,day,day= =1,day= =2,day= =4,day= =3,day= =5,day= =6,day= =7,输出课程,1,输出课程,2,输出课程,3,输出课程,4,输出课程,5,输出无课,显示输入错误,Y,Y,Y,Y,Y,Y,Y,N,N,N,N,N,N,N,2.,采用,switch,结构实现课程表输出,#include ,main( ),int day;,printf( please enter your day:);,scanf(%d,switch(day) /*对day进行判断*/,case 1 : printf(“n今天上课程1!);break; /*输入为1时的输出*/,case 2 : printf(“n今天上课程2!);break; /*输入为2时的输出*/,case 3: printf (“n今天上课程3!);break; /*输入为3时的输出*/,case 4 : printf (“n今天上课程4!);break; /*输入为4时的输出*/,case 5 : printf (“n今天上课程5!);break; /*输入为5时的输出*/,case 6 :,case 7 : printf(“今天无课!);break; /*输入为6、7时的输出*/,default: printf(“你输入的数不在17之间,输入错误!); /*输入1-7以外的 输出*/,模仿练习,根据流程图用switch结构编写程序,【练习3】输入学生的成绩等级字符型,AD,判断其成绩分数的范围, A : 85分以上 B: 7085 C: 6070 D :低于60,switch,语句总结,switch,语句用于实现判断条件单一,,而实现较多分支的选择结构。,一般形式:,switch(),case ,:,case ,:,case ,:,default: ,执行顺序:,先对switch后括号中的表达式进行运算,依次和常量表达式1到常量表达式n匹配,假设表达式的值与某个常量表达式的值相同,那么执行相应的语句序列,遇到break跳出switch结构,如果没有与任何常量表达式相同,那么执行default后的语句序列n+1,break,语句举例,调试以下程序,漏掉了break语句,分别输入AD,分析程序运行结果,#include ,void main(),char grade; /*grade为字符型*/,printf(n请输入等级AD:);,scanf(%c,switch(grade) /*grade判断*/,case A:printf(“85100n); /*等级A输出*/,case B:printf(“7084n); /*等级B输出*/,case C:printf(“6069n);/*等级C输出*/,case D:printf(“sweight*1.1)|(weight(sweight*1.1)|(weight(sweight*0.9) /超过标重,printf(n您的体重超过正常范围,请注意改善!);,else/在正常范围内,printf(n恭喜您!您的体重很完美!);,顺序+选择结构程序解决此问题时,蓝色局部的代码段要重复写5次。显然顺序+选择结构解决重复的相同问题并不适合,且还会随解决问题规模的增长程序逐渐增大,低效、不易修改及扩展。,循环结构实现,#include /,输入输出库函数,void main() /,主函数,int height,i; /,用户身高,float sweight,weight; /,标准体重,用户体重,for(i=1;i(sweight*1.1)|(weight(sweight*0.9) /,超过标重,printf(n,您的体重超过正常范围,请注意改善!,);,else/,在正常范围内,printf(n,恭喜您!您的体重很完美!,);,模仿练习,循环结构,for,循环结构,【,练习,1】,打印自己的名字,20,遍。,问题,2,:如何计算,1,2,3,100,?,循环结构实现,#include /,输入输出库函数,void main() /,主函数,int i,iSum=0;,for(i=1;i=100;i+),iSum+=i;,printf(1+2+3+100=%dn,iSum);,模仿练习,循环结构for循环结构,【练习2】求1100中所有偶数的和,【练习3】计算并输出1-3+5-7+-99+101的值,【练习5】计算并输出数列1 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + + 1/101,【练习6】从键盘读入一整数nn sweight*1.1)|(weight(sweight*1.1)|(weight(sweight*1.1)|(weight(sweight*0.9),printf(n,您的体重超过正常范围,请注意改善!,);,else,printf(n,恭喜您!您的体重很完美!,);,while(height!=0);,do-while,语句结构,do,循环体语句;,;, while(,条件表达式,);,模仿练习,【练习1】尝试能否用do-while结构实现:循环输入某学生的假设干门课程成绩,并计算学生的总分,当学生输入1时表示成绩输入完毕 。,【练习2】用do-while结构计算123100的值。,【练习3】求3个数的最小公倍数。,【练习4】计算正整数num的各位数字之积。,do-while 语句应注意,与while 语句的区别:,1.进入循环体后,先执行一次,再判断至少执行一次循环体。,2.判断条件次数和循环体执行次数相同。,3.while ( )后的;分号不能少,4.C语言中do-while 结构中条件表达式为真时执行循环体,否那么退出,与其他语言相区别。,选择三种循环的一般思路,如果循环次数,用for,如果循环次数未知,用while,如果循环体至少要执行一次,用do-while,只是思路,不是定律,循环语句的选择,三种结构的转化关系:,do,语句,while(,表达式,),;,表达式,1,;,While(,表达式,2),语句,表达式,3,;,for(,表达式,1,;表达式,2,;表达式,3),语句,语句,while(,表达式,),语句,循环语句的选择,三种结构的转化关系举例:,i=1;,do, printf(“i=%dn,i);,i+;,while(i5);,i=1;,while(i5), printf(“i=%dn,i);,i+;,for(i=1;i5;i+),printf(“i=%dn,i);,i=1;,while(i5), printf(“i=%dn,i);,i+;,小组讨论并总结,一般情况,如何选择采用,while,还是,for,或,do-while,结构,while,、,for,、,do-while,的一般格式有什么区别,while,和,do-while,执行过程有什么区别,结论,1,一般情况,如何选择采用,while,还是,for,或,do-while,结构,当确定需要循环时,首先要确定需要入口条件循环还是退出条件循环。,假定需要入口条件循环,在循环涉及到初始化和更新变量时使用,for,循环较为适当,而在其他条件下使用,while,循环更好些。对涉及到索引计数的循环用,for,循环是更好的选择。,对于那些至少需要执行一次循环的情况,应该把,do-while,循环做为首选。,结论,2while,、,for,、,do-while,的一般格式有什么区别,while,循环和,for,循环都是入口条件循环,执行循环之前先检查判断条件。,do-while,语句的流程是先执行,后判断。,结论,3while,和,do-while,执行过程有什么区别,while,循环是入口条件循环,在每次执行之前先检查判断条件,这样循环中的语句就有可能一次也不执行。,do-while,循环是退出条件循环,判断条件在执行循环之后进行检查,这样循环体中的语句至少被执行一次。,学以致用,寻找你身边的一个实际问题,编写解决问题的程序,用到循环结构。例如:假设你在某公司工作,老板要你打印一张表,买主可以用它来购置特定部件的费用。单个部件的价格从1元到9元不等。因此,你要打印一张像下面这样的数字表:,部件费用明细表,1 2 3 4 5 6 7 8 9,2007年4月7日,作业,每人必做,1,、,编写程序实现功能:求出,1+2+3+4+ +100,的值,并显示结果。,2,、编写程序实现功能:求出,n!,123n,的值,并显示结果。,3,、写一个小型计算器。,附:小型计算器简单介绍,附:小型计算器程序编写要求:,1,有简单运算选择界面,2,采用循环实现菜单显示,3,采用,switch,结构实现菜单的选择,4,运算对象为两个操作数,从键盘输入,5,运算结果输出,作业,小组必做,1、学以致用:寻找你身边的一个实际问题,编写解决问题的程序,用到循环结构。例如使用循环结构实现一个常用字符的ASCII码
展开阅读全文