C语言程序设计:第2章 简单判定性问题求解_第1页
C语言程序设计:第2章 简单判定性问题求解_第2页
C语言程序设计:第2章 简单判定性问题求解_第3页
C语言程序设计:第2章 简单判定性问题求解_第4页
C语言程序设计:第2章 简单判定性问题求解_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

1、 所谓判定性问题所谓判定性问题(decision problem)(decision problem)就是提出就是提出一个问题,只需要给出一个问题,只需要给出YesYes或或NoNo答案的问答案的问题题 第二章第二章 简单判定性问题求解简单判定性问题求解2.1 判定性问题及判定条件的描述判定性问题及判定条件的描述关系运算符关系运算符关系运算符关系运算符含义含义操作数个数操作数个数 结合性结合性 大于大于双目双目左结合左结合=大于或等于大于或等于双目双目左结合左结合 小于小于双目双目左结合左结合=小于或等于小于或等于双目双目左结合左结合= = =等于等于双目双目左结合左结合!=!=不等于不等于

2、双目双目左结合左结合赋值运算符关系运算符算术运算符优先级由低到高、=的优先级相同= =、!=的优先级相同、=高于= =、!= 2.1 判定性问题及判定条件的描述判定性问题及判定条件的描述关系表达式关系表达式表达式表达式 关系运算符关系运算符 表达式表达式a+bc-dx3/2a+(bc)a!=(c= =d)关系表达式的值是关系表达式的值是“真真”和和“假假”,分别用,分别用“1 1”和和“0 0”表示表示 50 的值为“真”,即为1(a=3)(b=5) 由于35不成立,故其值为假,即为0 2.1 判定性问题及判定条件的描述判定性问题及判定条件的描述逻辑运算符逻辑运算符逻辑运算符逻辑运算符 含义含

3、义操作数个数操作数个数 结合性结合性& 与运算与运算 双目双目左结合左结合| 或运算或运算 双目双目左结合左结合! 非运算非运算 单目单目右结合右结合赋值运算符赋值运算符 逻辑或逻辑或 逻辑与逻辑与 关系运算符关系运算符 算术运算符算术运算符 逻辑非逻辑非 优先级由低到高ab & cd等价于(ab) & (cd)2.1 判定性问题及判定条件的描述判定性问题及判定条件的描述逻辑表达式逻辑表达式表达式表达式 逻辑运算符逻辑运算符 表达式表达式逻辑运算的值为逻辑运算的值为“真真”和和“假假”,分别用,分别用“1 1”和和“0 0”表示表示 A的取值的取值B的取的取值值A&am

4、p;BA|B!A非非0非非0110非非000100非非0011000012.1 判定性问题及判定条件的描述判定性问题及判定条件的描述 思考:当思考:当i=10i=10、j=3j=3、k=0k=0时,时,i= =1&(j= =3|(k=k+1)i= =1&(j= =3|(k=k+1)的的运算次序是怎样的?表达式最终的值是多少呢?运算次序是怎样的?表达式最终的值是多少呢?k k值是多少值是多少? 在处理逻辑表达式时应注意以下两点:在处理逻辑表达式时应注意以下两点: (1 1)C C语言编译系统在给出逻辑运算结果时,以语言编译系统在给出逻辑运算结果时,以0 0代表代表“假假”,以以1

5、 1代表代表“真真”。但。但在判断一个逻辑量在判断一个逻辑量“真假真假”时时,以非,以非0 0表表示示“真真”,以,以0 0表示表示“假假”。例如:当。例如:当a=5.4,b=5,c=a=5.4,b=5,c=a a时,时,!a!a,!b!b,!c!c的值均为的值均为“假假”,即为,即为0 0。a&ca&c的值为的值为1 1,因,因为为a a和和b b均为非均为非0 0。 (2 2)在进行逻辑运算时,逻辑表达式运算到其值完全确定时)在进行逻辑运算时,逻辑表达式运算到其值完全确定时为止为止( (短路运算短路运算) )。例如:思考题中计算。例如:思考题中计算i= =1&(j=

6、 i= =1&(j= =3|k=k+1)=3|k=k+1)时,由于时,由于i= =1i= =1不成立,决定了整个表达式的值不成立,决定了整个表达式的值为为0 0,因此,因此 (j= =3|k=k+1) (j= =3|k=k+1)就不在计算了,就不在计算了,k k的值还是的值还是0 0。 2.1 判定性问题及判定条件的描述判定性问题及判定条件的描述位运算位运算 所谓位运算是指进行所谓位运算是指进行二进制位二进制位的运算。在系统软的运算。在系统软件中,常要处理二进制位的问题。件中,常要处理二进制位的问题。C语言提供了按语言提供了按位运算的功能,这使得它与其它高级语言相比,具位运算的功能,这

7、使得它与其它高级语言相比,具有很强的优越性。有很强的优越性。C语言提供了语言提供了6种位运算符。种位运算符。类类 型型运算符运算符含义含义位逻辑位逻辑运算符运算符&按位与按位与|按位或按位或按位异或按位异或取反取反移位运移位运算算 符符右移右移说明:说明:运算操作数只能是运算操作数只能是整型或字符型整型或字符型的数据,不能为实的数据,不能为实型或结构体等类型的数据。型或结构体等类型的数据。六个位运算符的优先级由六个位运算符的优先级由高到低高到低依次为:取反、左依次为:取反、左移和右移、按位与、按位异或、按位或。移和右移、按位与、按位异或、按位或。两个不同长度的数据进行位运算时,系统会将

8、二者两个不同长度的数据进行位运算时,系统会将二者按右端对齐。下面对各种位运算符介绍如下:按右端对齐。下面对各种位运算符介绍如下:2.1 判定性问题及判定条件的描述判定性问题及判定条件的描述位运算位运算1“按位与按位与”运算符(运算符(&)(1)规则:)规则:参与运算的两数(以补码方式出现)各参与运算的两数(以补码方式出现)各对应对应的二进位的二进位相与相与(即逻辑乘),只有对应的两个二进位均为(即逻辑乘),只有对应的两个二进位均为1时,时,结果位才为结果位才为1,否则为,否则为0,它是双目运算符。即:,它是双目运算符。即:0&0=0;0&1=0;1&0=0;1&

9、amp;1=1。例如:。例如:9&5可写算式如下:可写算式如下:9的二进制补码:的二进制补码: 0 0 0 0 1 0 0 15的二进制补码:的二进制补码: 0 0 0 0 0 1 0 1 & _ 0 0 0 0 0 0 0 1(1的二进制补码的二进制补码)可见可见9&5=1。1“按位与按位与”运算符(运算符(&)(2)特殊用途:)特殊用途:清零清零按位与运算通常用来对某些位清按位与运算通常用来对某些位清0。由按位与的规则可知:为。由按位与的规则可知:为了使某数的指定位清零,可将该数按位与一特定数。该数中为了使某数的指定位清零,可将该数按位与一特定数。该数中为1

10、的位,特定数中相应位应为的位,特定数中相应位应为0;该数中为;该数中为0的位,特定数中相的位,特定数中相应位可以为应位可以为0也可以为也可以为1。由此可见,。由此可见,能对某一个数的指定位清能对某一个数的指定位清零的数并不唯一零的数并不唯一。取一个数中某些位取一个数中某些位可将该数与一个特定数进行可将该数与一个特定数进行&运算,对于要取的那些位,特定运算,对于要取的那些位,特定数中相应的位设为数中相应的位设为1。取出数中某一位取出数中某一位要相将一个数的某一位保留下来,可将该数与一个特定数进行要相将一个数的某一位保留下来,可将该数与一个特定数进行&运算,特定数的相对应的那位应为

11、运算,特定数的相对应的那位应为1。对原数对原数00110110中为中为1的位清零。的位清零。原数补码:原数补码: 0 0 1 1 0 1 1 0清零的数:清零的数: 1 1 0 0 0 0 0 0 (或(或01000000、00000000等)等) & _ 0 0 0 0 0 0 0 0 程序可写为:程序可写为:#include stdio.hmain() int a=0 x36,b=0 xc0,c; c=a&b; printf(a=%xnb=%xnc=%xn,a,b,c);运行情况为:运行情况为:a=36b=c0c=0 把把a的高八位清的高八位清0,保留低八位。,保留低八位。

12、可作可作a&255运算运算(255的二进制数为的二进制数为0000000011111111)。#include stdio.hmain() int a,b=255,c; scanf(%d,&a);/*从键盘敲入从键盘敲入a,随后具体讲解,随后具体讲解scanf*/ c=a&b; printf(a=%xnb=%xnc=%xn,a,b,c); 运行情况为:运行情况为:输入:输入:920a=398b=ffc=98 编写程序将编写程序将a(=9)的最低位取出。)的最低位取出。#include stdio.hmain() int a=9,b=1,c; c=a&b; pri

13、ntf(a=%xnb=%xnc=%xn,a,b,c);运行情况为:运行情况为:a=9b=1c=12“按位或按位或”运算符(运算符(|)(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

14、(十进制为十进制为13)可见可见9|5=13。(2)特殊用途)特殊用途将一个数据的某些指定的位置为将一个数据的某些指定的位置为1。将一个数的低将一个数的低5位,置为位,置为1。只需将该数与只需将该数与“00011111”进行进行|运算。如:运算。如: # # # # # # # # (#可代表可代表0或或1) 0 0 0 1 1 1 1 1| _ # # # 1 1 1 1 1 #include stdio.hmain() int a,b=31,c;/*思考:为什么置思考:为什么置b=31?*/ scanf(%d,&a); c=a|b; printf(a=%xnb=%xnc=%xn,a

15、,b,c);运行情况为:运行情况为:输入:输入:5a=5b=1fc=1f3“按位异或按位异或”运算符(运算符()(1 1)规则)规则参与运算的两数(以补码出现)各参与运算的两数(以补码出现)各对应的二进位相异对应的二进位相异或或,当两对应的二进位相异时,结果为,当两对应的二进位相异时,结果为1 1,它是双目运,它是双目运算符。即:算符。即:00=000=0;01=101=1;10=110=1;11=011=0。例如:例如:9595可写成算式如下:可写成算式如下: 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 _

16、0 0 0 0 1 1 0 0 ( 0 0 0 0 1 1 0 0 (十进制为十进制为12) 12) 可见可见95=1295=12。3“按位异或按位异或”运算符(运算符()(2 2)特殊用途)特殊用途使特定位翻转使特定位翻转 要使哪几位翻转就将与其进行要使哪几位翻转就将与其进行“按位异或按位异或”运算的数运算的数的相应位置为的相应位置为1 1。使特定位保留原值使特定位保留原值要使哪几位保留原值就将与其进行要使哪几位保留原值就将与其进行“按位异或按位异或”运算运算的数的相应位置为的数的相应位置为0 0。交换两个值,不用临时变量交换两个值,不用临时变量将将01110001的低的低4 位翻转,高位翻

17、转,高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.hmain() int a=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;三个赋值三个赋值语句将两变量

18、语句将两变量a、b的值互换。具体计算过程如下:的值互换。具体计算过程如下:第一步:第一步: a 0000000000000101 b 0000000000000111 a=ab 0000000000000010第二步:第二步: a 0000000000000010 b 0000000000000111 b=ba 0000000000000101 (b的值为的值为5)第三步:第三步: a 0000000000000010 b 0000000000000101 a=ab 0000000000000111 ( a的值为的值为7)#include stdio.hmain() int a=5,b=7;

19、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

20、)用途)用途适当的使用可增加程序的移植性。如要将整数适当的使用可增加程序的移植性。如要将整数a的最低位置为的最低位置为0,我们通常采用语句我们通常采用语句a=a&1;来完成,因为这样对来完成,因为这样对a是是16位数还位数还是是32位数均不受影响。位数均不受影响。5“左移左移”运算符运算符() (1)规则)规则把把“”左边的运算数的左边的运算数的各二进位全部左移若干位各二进位全部左移若干位,由,由“”右边的数指定移动的位数,右边的数指定移动的位数,高位丢弃,低位补高位丢弃,低位补0,是双目运算符。是双目运算符。例 如 :例 如 : a )(1)规则)规则把把“”左边的运算数的左边的运算

21、数的各二进位全部右移若干位各二进位全部右移若干位,“”右边的数指定移动的位数。右边的数指定移动的位数。(2)特殊用途)特殊用途右移右移1位相当于该数除以位相当于该数除以2;右移;右移n位相当于该数除以位相当于该数除以2n。6“右移右移”运算符运算符()(3)说明)说明对于有符号数,在右移时,符号位将随同移动。当为对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补正数时,最高位补0;而为负数时,符号位为;而为负数时,符号位为1,最高,最高位是补位是补0还是补还是补1取决于计算机系统的规定。移入取决于计算机系统的规定。移入0的的称为称为“逻辑右移逻辑右移”;移入;移入1的称为的称为“算

22、术右移算术右移”。我。我们可以通过编写程序来验正所使用的系统是采用们可以通过编写程序来验正所使用的系统是采用“逻逻辑右移辑右移”还是还是“算术右移算术右移”。很多系统规定为补。很多系统规定为补1,即即“算术右移算术右移”。 如:如: a: 1001011111101101a1: 0100101111110110 ( 逻辑右移逻辑右移)a1: 1100101111110110 ( 算术右移算术右移)2.2 if-else判定性结构判定性结构If判断结构判断结构if (条件表达式条件表达式) 语句块语句块1;例例2-2 2-2 输入两个整数,输出其中的大数。输入两个整数,输出其中的大数。 设定变量

23、设定变量nNum1, nNum2, nMax开开 始始结束结束输入数据输入数据输出输出nMaxnMaxnNum2nMax=nNum2真真假假nMax=nNum1例例2-2 2-2 输入两个整数,输出其中的大数。输入两个整数,输出其中的大数。 #include #include void main(void) int nNum1,nNum2;/* 定义两个整型变量,用于存放两个操作数定义两个整型变量,用于存放两个操作数 */int nMax;/* 定义中间变量,用于存放中间结果定义中间变量,用于存放中间结果 */printf(n input two numbers: );scanf(%d%d,&

24、amp;nNum1,&nNum2);/* 输入两个操作数和运算符输入两个操作数和运算符 */nMax= nNum1;/* 将第一操作数赋值给中间变量将第一操作数赋值给中间变量max */ if (nMax nNum2) nMax= nNum2;/*比较大小,将大数存入比较大小,将大数存入max中中 */ printf( Max=%dn,nMax);/* 输出两个整数中的大数输出两个整数中的大数 */格式输入函数格式输入函数格式输入函数格式输入函数scanf(格式控制字符串, 地址表列);v功能:按指定格式从键盘读入数据,存入地功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中址

25、表指定的存储单元中,并按回车键结束并按回车键结束scanf(%d,%f”, &a,&b);非格式字符非格式字符格式说明格式说明地址表列地址表列scanf格式字符scanf附加格式说明符格式输入函数格式输入函数常见错误常见错误(牢记牢记)scanf(%d,%fn”,&a,&b);scanf(%d,%f”,a,b);scanf(%7.2f,&a);输入数据时,遇以下情况时输入数据时,遇以下情况时该该数据认为结束数据认为结束遇宽度:遇宽度:%3d%3d遇非法输入遇非法输入遇空格、回车、遇空格、回车、TAB TAB 键键格式输入函数#include main()

26、 int a, b; printf(Please input a and b:); scanf(%2d%*2d%2d, &a, &b); printf(a=%d, b=%d, a+b=%dn,a,b,a+b);Please input a and b:a=12, b=56, a+b=68123456 例遇宽度遇宽度格式说明符格式说明符% %* *2d2d中的中的* *为忽略输入修饰符,为忽略输入修饰符,表示对应的输入项在表示对应的输入项在读入后不赋给相应的读入后不赋给相应的变量变量#include main() int a, b; printf(Please input a a

27、nd b:); scanf(%2d,%2d, &a, &b); printf(a=%d, b=%d, a+b=%dn,a,b,a+b);Please input a and b:a=12, b=5, a+b = 1712,5a 例#include main() int a, b; printf(Please input a and b:); scanf(%2d%*2d%2d, &a, &b); printf(a=%d, b=%d, a+b=%dn,a,b,a+b);Please input a and b:a=12, b=5, a+b = 1712345a 例#

28、include main() int a, b;scanf(%d %d, &a, &b);printf(a = %d, b = %dn, a, b);问题问题1 1:当要求程序:当要求程序输出结果为为a = 12, b = 34 时,用户应该如何输入数据?时,用户应该如何输入数据? 输入数据的格式控制遇空格遇空格#include main() int a, b;scanf(%d %d, &a, &b);printf(a = %d, b = %dn, a, b);问题问题2 2:当限定用户:当限定用户输入数据以逗号为分隔符,即以逗号为分隔符,即输入数据格式为:输入

29、数据格式为:12, 34时,应修改程序中的哪条语句?怎样修改?时,应修改程序中的哪条语句?怎样修改? 输入数据的格式控制#include main() int a, b;scanf(%d %d, &a, &b);printf(a = %d, b = %dn, a, b);问题问题3 3:语句:语句scanf(%d %d, &a, &b);修改为修改为scanf(a = %d, b = %d, &a, &b);时,用户应该如何输入数据?时,用户应该如何输入数据?输入数据的格式控制#include main() int a, b;scanf(%d %

30、d, &a, &b);printf(a = %d, b = %dn, a, b); 问题问题4 4:限定用户输入数据为以下格式为:限定用户输入数据为以下格式为 1234 同时要求程序输出结果为同时要求程序输出结果为a = 12, b = 34输入数据的格式控制#include main() int a, b;scanf(%d %d, &a, &b);printf(a = %d, b = %dn, a, b); 问题问题5 5:限定用户输入数据为以下格式为:限定用户输入数据为以下格式为1234 同时要求程序输出结果为同时要求程序输出结果为a = 12, b = 3

31、4输入数据的格式控制#include main() int a, b;scanf(%d %d, &a, &b);printf(a = %d, b = %dn, a, b);问题问题6 6:设计程序使得用户可以用任意字符(回车、:设计程序使得用户可以用任意字符(回车、空格、制表符、逗号、其它)作为分隔符进行数据空格、制表符、逗号、其它)作为分隔符进行数据的输入的输入 输入数据的格式控制v说明:说明:l用用“%c”格式符时,空格和转义字符格式符时,空格和转义字符作为有效字符输入作为有效字符输入Problem:输入函数留下的输入函数留下的“垃圾垃圾”例例 int x; char ch

32、; scanf(%d,&x); ch=getchar(); printf(x=%d,ch=%dn,x,ch);执行:执行:123 输出:输出:x=123,ch=10例例 int x; char ch; scanf(%d,&x); scanf(%c,&ch); printf(x=%d,ch=%dn,x,ch);执行:执行:123 输出:输出:x=123,ch=10解决方法:解决方法:(1 1)用)用getchar()getchar()清除清除 (2) (2) 用格式串中用格式串中空格空格或或“% %* *c c”或或%1s%1s来来“吃吃掉掉”例例 int x; char

33、 ch; scanf(%d,&x); scanf( %c,&ch);或或 scanf(%*c%c,&ch);或或 scanf(%1s,&ch); 第第1 1次测试次测试C格式符存在的问题及其解决C格式符存在的问题及其解决C格式符存在的问题及其解决2007年4月份(选择题) (16)设变量均已正确定义,若要通过设变量均已正确定义,若要通过scanf(“%d%c%d%c”,&a1,&c1,&a2,&c2);语句为变量语句为变量a1和和a2赋数值赋数值10和和20,为变量,为变量c1和和c2赋字符赋字符X和和Y。以下所示的输入形式中正确

34、。以下所示的输入形式中正确的是(注:的是(注:代表空格字符)代表空格字符)( ) A)10X20Y回车回车 B)10X20Y回车回车 C)10X回车回车 D)10X回车回车 20Y回车回车 20Y回车回车答案:答案:D2006年4月(选择题) (29)有以下程序有以下程序 #include main() char c1,c2,c3,c4,c5,c6; scanf(“cccc”,&c1,&c2,&c3,&c4); c5=getchar(); c6=getchar();putchar(c1);putchar(c2);printf(ccn,c5,c6); 程序运行后,

35、若从键盘输入程序运行后,若从键盘输入(从第从第1列开始列开始)12345678则输出结果是(则输出结果是( ) A)1267 B)1256 C)1278 D)1245 答案:答案:D指针类型指针类型格式格式: scanf(“格式控制串格式控制串”,地址表,地址表)v地址表:变量的地址,常用取地址运算符或指针。地址表:变量的地址,常用取地址运算符或指针。v指针是指针是一种数据类型一种数据类型,被称为指针类型。它与加,被称为指针类型。它与加“”的变量意义相同,即表示地址。的变量意义相同,即表示地址。 新知识点地址和指针的概念地址和指针的概念1.内存地址内存地址内存中存储单元的编号内存中存储单元的编

36、号2.变量地址变量地址系统分配给变量的内存单元的起始地址系统分配给变量的内存单元的起始地址(1)计算机硬件系统的内存储器中,拥有大量的存储单元(每个存储单)计算机硬件系统的内存储器中,拥有大量的存储单元(每个存储单元容量为字节)。为了方便管理,必须为每一个存储单元编号,这个元容量为字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的编号就是存储单元的“地址地址”。每个存储单元都有一个唯一的地址。每个存储单元都有一个唯一的地址。(2)在地址所标识的存储单元中存放数据。)在地址所标识的存储单元中存放数据。 注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。注意:内存单元

37、的地址与内存单元中的数据是两个完全不同的概念。C编译程序编译到该变量定义语句时,将变量编译程序编译到该变量定义语句时,将变量nNum1登录到登录到“符号表符号表”中。符号表的关键属性有两个:一是中。符号表的关键属性有两个:一是“标识符名(标识符名(id)” ,二是该标识,二是该标识符在内存空间中的符在内存空间中的“地址(地址(addr)” 。为描述方便,假设系统分配给变量为描述方便,假设系统分配给变量nNum1的的4字节存储单元为字节存储单元为 0012FF7C, 0012FF7D, 0012FF7E和和 0012FF7F,则起始地址,则起始地址0012FF7C就是变量就是变量nNum1在内存

38、中的地址。在内存中的地址。scanf(%d,&nNum1);3.变量值的存取变量值的存取通过变量在内存中的地址进行通过变量在内存中的地址进行(1)直接访问直接访问直接利用变量的地址直接利用变量的地址进行存取进行存取地址和指针的概念地址和指针的概念scanf(%d,&nNum1); 的执行过程是这样的:用的执行过程是这样的:用变量名变量名nNum1作为索引值,检索符号表,找到作为索引值,检索符号表,找到变量变量nNum1的起始地址的起始地址0012FF7C;然后将键盘;然后将键盘输入的值(假设为)送到输入的值(假设为)送到0012FF7C起始点四起始点四个字节的内存单元中。个字节

39、的内存单元中。 (2)间接访问)间接访问通过另一变量访问该变量的值通过另一变量访问该变量的值 语言规定:在程序中可以定义一种特殊的变量(称为指语言规定:在程序中可以定义一种特殊的变量(称为指针变量),用来存放其它变量的地址。针变量),用来存放其它变量的地址。 例如,假设定义了这样一个指针变量例如,假设定义了这样一个指针变量pNum1,可通过赋值,可通过赋值语句语句“pNum1=nNum1;”让让pNum1指向指向nNum1的首地的首地址。此时,指针变量址。此时,指针变量pNum1的值就是变量的值就是变量nNum1在内存中在内存中的起始地址的起始地址0012FF7C。 pNum1的定义形式为:的

40、定义形式为:3.变量值的存取变量值的存取通过变量在内存中的地址进行通过变量在内存中的地址进行地址和指针的概念地址和指针的概念int *pNum1;指针变量指针变量定义定义的一般形式:的一般形式:变量类型变量类型 *变量名变量名;指针变量指针变量赋值赋值的一般形式:的一般形式:指针变量名普通变量名指针变量名普通变量名;printf(“%d”,*pNum1);printf(“%d”,nNum1);*和和&的含义的含义在定义变量时,在定义变量时,*的作用是指示此变量为指针类型。的作用是指示此变量为指针类型。在做双目运算符在做双目运算符(有两个操作数有两个操作数)时,时,&是按位逻辑与

41、。是按位逻辑与。在在使用使用时,时,*为取值符号为取值符号,&为取址符号为取址符号。如,。如, int a=1,b=2, *p1, *p2; p1=&a;p2=&b; 是正确的。是正确的。“&”和和“*”的优先级别相同,按自的优先级别相同,按自右而左右而左的方向结的方向结合。如,合。如, int a=1,b=2, *p1, *p2; p1=&a; p2=&b; p2=&*p1; /*相当于相当于p2=p1或或p2=&a*/ 2006年4月(选择题) (24)若有说明语句:double *p,a;则能通过scanf语句正确给输入项读

42、入数据的程序段是A)*p=&a; scanf(“1f”,p); B)*p=&a; scanf(“f”,p); C) p=&a; scanf(“1f”,*p); D) p=&a; scanf(1f,p); 答案:答案:D2007年9月(选择题)答案:答案:C2.2 if-else判定性结构判定性结构If判断结构判断结构if (表达式表达式) 语句块语句块1;else 语句块语句块2;例例2-3 输入两个实数,请用输入两个实数,请用if-else语句结构输出其中的大数。语句结构输出其中的大数。 例例2-3 输入两个实数,请用输入两个实数,请用if-else语句结构输

43、出其中的大数。语句结构输出其中的大数。 #include #include void main(void) double dNum1, dNum2;/* 定义两个双精度浮点型变量,用于存放两个操作数定义两个双精度浮点型变量,用于存放两个操作数 */ /* 定义两个双精度浮点型指针,用于指向存放浮点数的内存单元定义两个双精度浮点型指针,用于指向存放浮点数的内存单元 */ double *pNum1,*pNum2; pNum1=&dNum1;/* 用将用将fNum1地址取出来赋给指针变量地址取出来赋给指针变量pNum1 */pNum2=&dNum2;/* 用将用将fNum2地址取出

44、来赋给指针变量地址取出来赋给指针变量pNum2 */printf(n input two numbers: );scanf(%lf%lf,pNum1,pNum2);/* 输入两个操作数以指针所指向的地址输入两个操作数以指针所指向的地址 */printf( accepted two numbers: dNum1=%lf;dNum2=%lf ,*pNum1,*pNum2);if(dNum1dNum2)/* 将两个操作数比较大小,输出大数将两个操作数比较大小,输出大数 */ printf(n Max=%5.2lfn,dNum1);else printf(n Max=%5.2lfn,dNum2); 2

45、.2 if-else判定性结构判定性结构If判断结构判断结构if (表达式表达式1)语句块语句块1;else if (表达式表达式2)语句块语句块2;else if (表达式表达式3)语句块语句块3;else if (表达式表达式n)语句块语句块n;else语句块语句块n+1;例例2-4 输入学生考试分数,按输入学生考试分数,按A、B、C、D、E给出成绩的给出成绩的等级。等级。90分以上分以上(包括包括90分分)为为A等,等,60分以下分以下(不包括不包括60分分)为为E等,中间每等,中间每10分为一个等级,画出流程图。分为一个等级,画出流程图。 例例2-4 输入学生考试分数,按输入学生考试分

46、数,按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,&fScore);/*输入考试分数*/if(fScore100.0|fScore 89.99)/*分数fScore=90*/ cLevel=A;else if (fScor

47、e 79.99)/*分数90fScore=80*/ cLevel=B;else if (fScore 69.99)/*分数80fScore=70*/ cLevel=C;else if (fScore 59.99)/*分数70fScore=60*/ cLevel=D;else/*分数fScore60*/ cLevel=E;printf(该成绩的等级为:该成绩的等级为:%cn,cLevel); 找别扭int a=1;if (a = 0)printf(OK);int a=0;if (a = 0)printf(OK);int a=1;if (a = 0)printf(OK);int a=0;if (a

48、 = 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 (表达式表达式)语句;语句;elseif (表达式表达式) 语句;语句;if()if()if()else.else.else.C语言规定,语言规定,else 总是与它前面最近的总是与它前面最近的if配对配对 例:例: if (

49、a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);修改:修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);实现实现if else 正确配对方法:正确配对方法:加加 实现if else 正确配对方法2005年4月(填空题)(8)以下程序运行后的输出结果是 【8】 。 main() int a=3,b=4,c=5,t=99; if(ba & ac) t=a; a=c; c=t; if(ac & b b) z = a;else z = b;z = (a b) ? a :

50、 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(input integer number

51、: ); scanf(%d,&a); switch (a) /*判定表达式*/ case 1:printf(Mondayn); case 2:printf(Tuesdayn); case 3:printf(Wednesdayn); case 4:printf(Thursdayn); case 5:printf(Fridayn); case 6:printf(Saturdayn); case 7:printf(Sundayn); default:printf(Error!n); ?switch和和else-if的比较的比较 1 1 elseelse- -ifif比比switchswitc

52、h的条件控制更强大一些的条件控制更强大一些elseelse- -ifif可以依照各种逻辑运算的结果进行流程控制可以依照各种逻辑运算的结果进行流程控制switchswitch只能进行只能进行=判断判断,并且只能是并且只能是整数整数判断判断 2 2 switch switch比比elseelse- -ifif更清晰更清晰 两者都要尽量避免用得过多、过长,尤其不要嵌套两者都要尽量避免用得过多、过长,尤其不要嵌套得太多得太多, ,它们大大增加程序的分支,使逻辑关系显得它们大大增加程序的分支,使逻辑关系显得混乱,不易维护,易出错混乱,不易维护,易出错 两个同种数据类型的运算结果,还是该类型两个同种数据类

53、型的运算结果,还是该类型 两个不同种数据类型的运算结果,是两种类型中两个不同种数据类型的运算结果,是两种类型中取值范围更大的那种取值范围更大的那种long double double float long int short char只要两者中有一个是只要两者中有一个是unsigned,就都转为,就都转为unsigned再计算再计算 把数据赋值给另外一种类型变量也会发生自动类把数据赋值给另外一种类型变量也会发生自动类型转换型转换从小到大,顺利转换从小到大,顺利转换从大到小,发出警告(好的编译器会给出)从大到小,发出警告(好的编译器会给出)注意:新知识点2.4 应用实例应用实例例例2-5 计算器程序。计算器程序。问题描述:任意输入两个数,根据用户选择的功能菜问题描述:任意输入两个数,根据用户选择的功能菜单,求出它们的和、差、积、除的结果。单,求出它们的和、差、积、除的结果。 假假nFun =2加法运算真真设定变量开 始结束nFun =3减法运算真真nFun =4乘法运算真真除法运算输出结果输入功能选项nFun 4输入错误操作数 2=0输入错误真真打印功能菜单输入两操作数假假假假假假假假假假 #include #include void main(void) double

温馨提示

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

评论

0/150

提交评论