C语言第2章人民邮电出版社张小东.ppt

上传人:tia****nde 文档编号:12805548 上传时间:2020-05-25 格式:PPT 页数:59 大小:892KB
返回 下载 相关 举报
C语言第2章人民邮电出版社张小东.ppt_第1页
第1页 / 共59页
C语言第2章人民邮电出版社张小东.ppt_第2页
第2页 / 共59页
C语言第2章人民邮电出版社张小东.ppt_第3页
第3页 / 共59页
点击查看更多>>
资源描述
所谓判定性问题(decisionproblem)就是提出一个问题,只需要给出Yes或No答案的问题,第二章简单判定性问题求解,2.1判定性问题及判定条件的描述,关系运算符,、=的优先级相同=、!=的优先级相同、=高于=、!=,2.1判定性问题及判定条件的描述,关系表达式,表达式关系运算符表达式,a+bc-dx3/2a+(bc)a!=(c=d),关系表达式的值是“真”和“假”,分别用“1”和“0”表示,50的值为“真”,即为1(a=3)(b=5)由于35不成立,故其值为假,即为0,2.1判定性问题及判定条件的描述,逻辑运算符,abc=a,运行情况为:a=9b=1c=1,2“按位或”运算符(|),(1)规则参与运算的两数(以补码出现)各对应的二进位相或(即逻辑加)。只要对应的两个二进位有一个为1时,结果位就为1,它是双目运算符。即:0|0=0;0|1=1;1|0=1;1|1=1。例如:9|5可写算式如下:0000100100000101|_00001101(十进制为13)可见9|5=13。(2)特殊用途将一个数据的某些指定的位置为1。将该数按位或一个特定的数,该特定的数的相应位置为1。,将一个数的低5位置为1。只需将该数与“00011111”进行,运行情况为:输入:5a=5b=1fc=1f,3“按位异或”运算符(),(1)规则参与运算的两数(以补码出现)各对应的二进位相异或,当两对应的二进位相异时,结果为1,它是双目运算符。即:00=0;01=1;10=1;11=0。例如:95可写成算式如下:0000100100000101_00001100(十进制为12)可见95=12。,3“按位异或”运算符(),(2)特殊用途使特定位翻转要使哪几位翻转就将与其进行“按位异或”运算的数的相应位置为1。使特定位保留原值要使哪几位保留原值就将与其进行“按位异或”运算的数的相应位置为0。交换两个值,不用临时变量,将01110001的低4位翻转,高4位保留原值。0111000100001111_01111110(十进制126)程序可写为:#includestdio.hmain()inta=0 x71,b=0 xf,c;c=ab;printf(a=%xnb=%xnc=%xn,a,b,c);,运行情况为:a=71b=fc=7e,设有整型数a=5,b=7。编写程序利用位运算,将a和b的值互换。程序中,通过顺序使用a=ab;b=ba;a=ab;三个赋值语句将两变量a、b的值互换。具体计算过程如下:第一步:a0000000000000101b0000000000000111a=ab0000000000000010第二步:a0000000000000010b0000000000000111b=ba0000000000000101(b的值为5)第三步:a0000000000000010b0000000000000101a=ab0000000000000111(a的值为7),#includestdio.hmain()inta=5,b=7;printf(a=%d,b=%dn,a,b);a=ab;b=ba;a=ab;printf(a=%d,b=%dn,a,b);,运行情况为:a=5,b=7a=7,b=5,设有整型数a=5,b=7。编写程序利用位运算,将a和b的值互换。,4“求反”运算符(),(1)规则对参与运算的数的各二进位按位求反,它是单目运算符,具有右结合性。即:0=1;1=0。例如:9的运算为0000000000001001_1111111111110110(2)用途适当的使用可增加程序的移植性。如要将整数a的最低位置为0,我们通常采用语句a=a来完成,因为这样对a是16位数还是32位数均不受影响。,5“左移”运算符(),(1)规则把“”左边的运算数的各二进位全部左移若干位,由“”右边的数指定移动的位数,高位丢弃,低位补0,是双目运算符。例如:a),(1)规则把“”左边的运算数的各二进位全部右移若干位,“”右边的数指定移动的位数。(2)特殊用途右移1位相当于该数除以2;右移n位相当于该数除以2n。,6“右移”运算符(),(3)说明对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0还是补1取决于计算机系统的规定。移入0的称为“逻辑右移”;移入1的称为“算术右移”。我们可以通过编写程序来验正所使用的系统是采用“逻辑右移”还是“算术右移”。很多系统规定为补1,即“算术右移”。如:a:1001011111101101a1:0100101111110110(逻辑右移)a1:1100101111110110(算术右移),例2-1从键盘上输入1个正整数给int变量nNum,输出由811位构成的数(从低位、0号开始编号)。,使变量nNum右移8位,将811位移到低4位上。为确保811位精确输出,应再构造1个低4位为1、其余各位为0的整数。使其与nNum进行按位与运算,从而屏蔽其高位数。,例2-1从键盘上输入1个正整数给int变量nNum,输出由811位构成的数(从低位、0号开始编号)。,#includestdio.hvoidmain(void)intnNum,nMask;printf(Inputaintegernumber:);scanf(%d,2.2if-else判定性结构,If判断结构,if(条件表达式)语句块1;,例2-2输入两个整数,输出其中的大数。,例2-2输入两个整数,输出其中的大数。,#include#includevoidmain(void)intnNum1,nNum2;/*定义两个整型变量,用于存放两个操作数*/intnMax;/*定义中间变量,用于存放中间结果*/printf(ninputtwonumbers:);scanf(%d%d,/*输出两个整数中的大数*/,格式输入函数,格式:scanf(“格式控制串”,地址表)功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束返值:正常,返回输入数据个数,地址表:变量的地址,常用取地址运算符charch;scanf(“%d”,执行:123输出:x=123,ch=10,例intx;charch;scanf(“%d”,执行:123输出:x=123,ch=10,解决方法:(1)用getchar()清除(2)用格式串中空格或“%*c”来“吃掉”,例intx;charch;scanf(“%d”,指针类型,格式:scanf(“格式控制串”,地址表),地址表:变量的地址,常用取地址运算符,指针变量定义的一般形式:变量类型*变量名;,指针变量赋值的一般形式:指针变量名普通变量名;,printf(“%d”,*pNum1);,printf(“%d”,nNum1);,*和/*定义两个双精度浮点型变量,用于存放两个操作数*/*定义两个双精度浮点型指针,用于指向存放浮点数的内存单元*/double*pNum1,*pNum2;pNum1=,2.2if-else判定性结构,If判断结构,if(表达式1)语句块1;elseif(表达式2)语句块2;elseif(表达式3)语句块3;elseif(表达式n)语句块n;else语句块n+1;,例2-4输入学生考试分数,按A、B、C、D、E给出成绩的等级。90分以上(包括90分)为A等,60分以下(不包括60分)为E等,中间每10分为一个等级,画出流程图。,例2-4输入学生考试分数,按A、B、C、D、E给出成绩的等级。90分以上(包括90分)为A等,60分以下(不包括60分)为E等,中间每10分为一个等级,画出流程图。,#include#includevoidmain(void)charcLevel=0 x20;floatfScore;printf(请输入成绩:);scanf(%f,找别扭,inta=1;if(a=0)printf(OK);inta=0;if(a=0)printf(OK);,inta=1;if(a=0)printf(OK);inta=0;if(a=0)printf(OK);,一定要分清=和=,下面用法能起点小作用,inta=0;if(0=a)printf(OK);,inta=0;if(0=a)printf(OK);,编译出错,2.2if-else判定性结构,If语句的嵌套,if(表达式)if(表达式)语句;,if(表达式)if(表达式)语句;elseif(表达式)语句;,C语言规定,else总是与它前面最近的if配对。,2.2if-else判定性结构,条件运算符和条件表达式,把a和b中的最大值放入z中if(ab)z=a;elsez=b;z=(ab)?a:b;此种表达式切忌用得过于繁杂,2.3switch判定性结构,switch(表达式)case常量表达式1:语句块1;break;case常量表达式2:语句块2;break;case常量表达式n:语句块n;break;default:语句块n+1;,2.3switch判定性结构,/*purpose:输入一个整数,转换成星期输出*/#include#includevoidmain(void)inta;printf(inputintegernumber:);scanf(%d,?,default可以没有不要忘记break,switch和else-if的比较,1else-if比switch的条件控制更强大一些else-if可以依照各种逻辑运算的结果进行流程控制switch只能进行=判断,并且只能是整数判断2switch比else-if更清晰两者都要尽量避免用得过多、过长,尤其不要嵌套得太多它们大大增加程序的分支,使逻辑关系显得混乱,不易维护,易出错,2.4应用实例,例2-6学生成绩管理程序。问题描述:任意输入学生百分制的某科成绩fScore,按优、良、中、及格和不及格的等级输出。,成绩是实数,用switch完成时涉及到类型转换,两个同种数据类型的运算结果,还是该类型两个不同种数据类型的运算结果,是两种类型中取值范围更大的那种longdoubledoublefloatlongintshortchar只要两者中有一个是unsigned,就都转为unsigned再计算把数据赋值给另外一种类型变量也会发生自动类型转换从小到大,顺利转换从大到小,发出警告(好的编译器会给出),2.4应用实例,例2-5计算器程序。问题描述:任意输入两个数,根据用户选择的功能菜单,求出它们的和、差、积、除的结果。,#include#includevoidmain(void)doubledLOper,dROper,dResult;/*定义两个double变量,用于存放左右操作数*/intnFun;/*定义一个字符变量,用于存放运算符*/printf(-n);/*构造功能菜单*/printf(加法运算-1n);printf(减法运算-2n);printf(除法运算-3n);printf(乘法运算-4n);printf(-n);printf(请输入功能选择:);/*在屏幕上显示提示信息*/scanf(%d,/*输出结果*/,2.4应用实例,例2-6学生成绩管理程序。问题描述:任意输入学生百分制的某科成绩fScore,按优、良、中、及格和不及格的等级输出。,成绩是实数,用switch完成时涉及到类型转换,可以通过“(类型)表达式”的方式把表达式的值转为任意类型强转时,你必须知道你在做什么强转与指针,并称C语言两大神器,用好了可以呼风唤雨,用坏了就损兵折将,屠龙刀,倚天剑,2.4应用实例,例2-6学生成绩管理程序。问题描述:任意输入学生百分制的某科成绩fScore,按优、良、中、及格和不及格的等级输出。,仅把浮点型转换成整型还不够,因从1100的数太多了。只分五等,可以采取这个的技巧:用所输入的成绩取整后减去50,再整除10,凡是得到5或4的为优秀,凡是得到3的为良好,依次类推。如,95.55045.5,取整后得45,整除于10得4,则为优秀;78.35028.5,取整后得28,整除于10得2,则为中等。,2.4应用实例,2.4应用实例,#include#includevoidmain(void)floatfScore;intnLevel;printf(请输入成绩:);scanf(%f,Theend,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!