C语言第2章人民邮电出版社张小东.ppt_第1页
C语言第2章人民邮电出版社张小东.ppt_第2页
C语言第2章人民邮电出版社张小东.ppt_第3页
C语言第2章人民邮电出版社张小东.ppt_第4页
C语言第2章人民邮电出版社张小东.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

1、所谓判定性问题(decision problem)就是提出一个问题,只需要给出Yes或No答案的问题,第二章 简单判定性问题求解,2.1 判定性问题及判定条件的描述,关系运算符,的优先级相同 = =、!=的优先级相同 、=高于= =、,2.1 判定性问题及判定条件的描述,关系表达式,表达式 关系运算符 表达式,a+bc-d x3/2 a+(bc) a!=(c= =d,关系表达式的值是“真”和“假”,分别用“1”和“0”表示,50 的值为“真”,即为1 (a=3)(b=5) 由于35不成立,故其值为假,即为0,2.1 判定性问题及判定条件的描述,逻辑运算符,ab c=a,运行情况为: a=9 b

2、=1 c=1,2“按位或”运算符(,1)规则 参与运算的两数(以补码出现)各对应的二进位相或(即逻辑加)。只要对应的两个二进位有一个为1时,结果位就为1,它是双目运算符。即:0|0=0;0|1=1;1|0=1;1|1=1。 例如:9|5可写算式如下:0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 | _ 0 0 0 0 1 1 0 1 (十进制为13) 可见9|5=13。 (2)特殊用途 将一个数据的某些指定的位置为1。 将该数按位或一个特定的数,该特定的数的相应位置为1,将一个数的低5位置为1。 只需将该数与“00011111”进行,运行情况为: 输入:5 a=5 b=1f

3、c=1f,3“按位异或”运算符(,1)规则 参与运算的两数(以补码出现)各对应的二进位相异或,当两对应的二进位相异时,结果为1,它是双目运算符。即:00=0;01=1;10=1;11=0。 例如:95可写成算式如下:0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 _ 0 0 0 0 1 1 0 0 (十进制为12) 可见95=12,3“按位异或”运算符(,2)特殊用途 使特定位翻转 要使哪几位翻转就将与其进行“按位异或”运算的数的相应位置为1。 使特定位保留原值 要使哪几位保留原值就将与其进行“按位异或”运算的数的相应位置为0。 交换两个值,不用临时变量,将01110001的低

4、4 位翻转,高4位保留原值。 0 1 1 1 0 0 0 1 0 0 0 0 1 1 1 1 _ 0 1 1 1 1 1 1 0 (十进制126) 程序可写为: #include stdio.h main() int a=0 x71,b=0 xf,c; c=ab; printf(a=%xnb=%xnc=%xn,a,b,c);,运行情况为: a=71 b=f c=7e,设有整型数 a=5,b=7。编写程序利用位运算,将a和b的值互换。 程序中,通过顺序使用a=ab;b=ba;a=ab;三个赋值语句将两变量a、b的值互换。具体计算过程如下: 第一步: a 0000000000000101 b 00

5、00000000000111 a=ab 0000000000000010 第二步: a 0000000000000010 b 0000000000000111 b=ba 0000000000000101 (b的值为5) 第三步: a 0000000000000010 b 0000000000000101 a=ab 0000000000000111 (a的值为7,include stdio.h main() int a=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=7 a=7

6、,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,是双目运算符。 例如:a4指把a的各二进位向左

7、移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。 (2)特殊用途 左移1位相当于该数乘以2;左移n位相当于该数乘以2n 。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。 左移比乘法运算快得多,有的C编译系统自动将乘2运算用左移一位来实现,6“右移”运算符(,1)规则 把“”左边的运算数的各二进位全部右移若干位,“”右边的数指定移动的位数。 (2)特殊用途 右移1位相当于该数除以2;右移n位相当于该数除以2n,6“右移”运算符(,3)说明 对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0

8、还是补1取决于计算机系统的规定。移入0的称为“逻辑右移”;移入1的称为“算术右移”。我们可以通过编写程序来验正所使用的系统是采用“逻辑右移”还是“算术右移”。很多系统规定为补1,即“算术右移”。 如: a: 1001011111101101 a1: 0100101111110110 ( 逻辑右移) a1: 1100101111110110 ( 算术右移,例2-1从键盘上输入1个正整数给int变量nNum,输出由811位构成的数(从低位、0号开始编号,使变量nNum右移8位,将811位移到低4位上。为确保811位精确输出,应再构造1个低4位为1、其余各位为0的整数。使其与nNum进行按位与运算,

9、从而屏蔽其高位数,例2-1从键盘上输入1个正整数给int变量nNum,输出由811位构成的数(从低位、0号开始编号,include stdio.h void main(void) int nNum, nMask; printf(Input a integer number:); scanf(%d,2.2 if-else判定性结构,If判断结构,if (条件表达式) 语句块1,例2-2 输入两个整数,输出其中的大数,例2-2 输入两个整数,输出其中的大数,include #include void main(void) int nNum1,nNum2;/* 定义两个整型变量,用于存放两个操作数

10、*/ int nMax;/* 定义中间变量,用于存放中间结果 */ printf(n input two numbers: ); scanf(%d%d,/* 输出两个整数中的大数 */,格式输入函数,格式: scanf(“格式控制串”,地址表) 功能:按指定格式从键盘读入数据,存入地址表指定的 存储单元中,并按回车键结束 返值:正常,返回输入数据个数,地址表:变量的地址,常用取地址运算符 char ch; scanf(“%d”, 执行:123 输出:x=123,ch=10,例 int x; char ch; scanf(“%d”, 执行:123 输出:x=123,ch=10,解决方法: (1)

11、用getchar()清除 (2) 用格式串中空格或“%*c”来“吃掉,例 int x; char ch; scanf(“%d,指针类型,格式: scanf(“格式控制串”,地址表,地址表:变量的地址,常用取地址运算符/* 定义两个双精度浮点型变量,用于存放两个操作数 */ /* 定义两个双精度浮点型指针,用于指向存放浮点数的内存单元 */ double *pNum1,*pNum2; pNum1=,2.2 if-else判定性结构,If判断结构,if (表达式1) 语句块1; else if (表达式2) 语句块2; else if (表达式3) 语句块3; else if (表达式n) 语句块

12、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 #include void main(void) char cLevel=0 x20; float fScore; printf(请输入成绩:); scanf(%f,找别扭,int a=1;if (a = 0)print

13、f(OK); int a=0;if (a = 0)printf(OK,int a=1;if (a = 0)printf(OK); int a=0;if (a = 0)printf(OK,一定要分清=和=,下面用法能起点小作用,int a=0;if (0 = a)printf(OK,int a=0;if (0 = a)printf(OK,编译出错,2.2 if-else判定性结构,If语句的嵌套,if (表达式) if (表达式) 语句,if (表达式) if (表达式) 语句; else if (表达式) 语句,C语言规定,else 总是与它前面最近的if配对,2.2 if-else判定性结构

14、,条件运算符和条件表达式,把a和b中的最大值放入z中 if (a b) z = a;else z = b; z = (a b) ? a : b; 此种表达式切忌用得过于繁杂,2.3 switch判定性结构,switch(表达式) case常量表达式1: 语句块1; break; case常量表达式2: 语句块2; break; case常量表达式n: 语句块n; break; default : 语句块n+1;,2.3 switch判定性结构,* purpose: 输入一个整数,转换成星期输出*/ #include #include void main(void) int a; printf(

15、input integer number: ); scanf(%d,default可以没有 不要忘记break,switch和else-if的比较,1 else-if比switch的条件控制更强大一些 else-if可以依照各种逻辑运算的结果进行流程控制 switch只能进行=判断,并且只能是整数判断 2 switch比else-if更清晰 两者都要尽量避免用得过多、过长,尤其不要嵌套得太多 它们大大增加程序的分支,使逻辑关系显得混乱,不易维护,易出错,2.4 应用实例,例2-6学生成绩管理程序。 问题描述:任意输入学生百分制的某科成绩fScore,按优、良、中、及格和不及格的等级输出,成绩是

16、实数,用switch完成时涉及到类型转换,两个同种数据类型的运算结果,还是该类型 两个不同种数据类型的运算结果,是两种类型中取值范围更大的那种 long double double float long int short char 只要两者中有一个是unsigned,就都转为unsigned再计算 把数据赋值给另外一种类型变量也会发生自动类型转换 从小到大,顺利转换 从大到小,发出警告(好的编译器会给出,2.4 应用实例,例2-5计算器程序。 问题描述:任意输入两个数,根据用户选择的功能菜单,求出它们的和、差、积、除的结果,include #include void main(void) d

17、ouble dLOper,dROper,dResult;/* 定义两个double变量,用于存放左右操作数 */ int nFun;/* 定义一个字符变量,用于存放运算符 */ 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,按优、

温馨提示

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

最新文档

评论

0/150

提交评论