• 沒有找到結果。

C语言程序设计实验与习题指导 - 万水书苑-出版资源网

N/A
N/A
Protected

Academic year: 2021

Share "C语言程序设计实验与习题指导 - 万水书苑-出版资源网"

Copied!
58
0
0

加載中.... (立即查看全文)

全文

(1)第二部分 例题解析与习题. 第1章. C 语言概述. 1.1 例题解析 【例 1】对于一个正常运行的 C 程序,以下叙述中正确的是( )。 A.程序的执行总是从 main 函数开始,在 main 函数结束 B.程序的执行总是从程序的第一个函数开始,在 main 函数结束 C.程序的执行总是从 main 函数开始,在程序的最后一个函数结束 D.程序的执行总是从程序的第一个函数开始,在程序的最后一个函数结束 【解析】在 C 语言中,所有函数的定义,包括主函数 main 在内,都是平行的。也就是说, 在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。但是函数之间允许互相调 用,也允许嵌套调用,习惯上把调用者称为主函数。调用函数还可以调用自己,称为递归调用。 main 函数是主函数,它可以调用其他函数,而不允许被其他函数调用。因此,C 程序的执行 总是从 main 函数开始,完成对其他函数的调用后返回到 main 函数,最后由 main 函数结束整 个程序。一个 C 源程序必须有也只能有一个 main 函数。 【答案】A 【例 2】下列叙述中正确的是( )。 A.每个 C 程序文件中都必须要有一个 main 函数 B.在 C 程序中 main()的位置是固定的 C.C 程序中所有函数之间都可以相互调用,与函数所在位置无关 D.在 C 程序的函数中不能定义另一个函数 【解析】C 程序中 main 函数可以放在任何位置,C 程序总是从 main 函数开始执行。函数 调用时,必须在所有函数的外部、被调用函数之前说明该函数。C 程序的函数中可以定义另一 个函数。 【答案】A 【例 3】以下关于函数的叙述中正确的是( )。 A.每个函数都可以被其他函数调用 B.每个函数都可以被单独编译 C.每个函数都可以单独运行 D.在一个函数内部可以定义另一个函数 【解析】C 语言中,除了主函数外,用户定义的函数或库函数都可以互相进行调用,甚至 可以自己调用自己。所以 A 选项错误。每个函数可以被单独编译成二进制代码,但不是所有 的函数都可以单独运行,程序的运行需要从主函数 main 开始,缺少 main,则无法运行。所以.

(2) C 语言程序设计实验与习题指导. 46. C 选项错误。C 语言规定,不能在一个函数内部再定义函数,所以 D 选项错误。 【答案】B 【例 4】以下叙述中正确的是( )。 A.C 语言程序将从源程序中第一个函数开始执行 B.可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行 C.C 语言规定必须用 main 作为主函数名,程序从此开始执行,在此结束 D.main 可作为用户标识符,用以命名任意一个函数作为主函数 【解析】程序都由一个或多个函数组成,其中必须出现的函数是 main(),它作为程序开始 运行时首先被调用的函数。不能把 main 作为变量名字,否则可能破坏编译程序的正常操作。 【答案】C 1.2 练习题 一、选择题 1.以下对 C 语言的描述中正确的是( ) 。 A.C 语言源程序中可以有重名的函数 B.C 语言源程序中要求每行只能书写一条语句 C.注释可以出现在 C 语言源程序中的任何位置 D.最小的 C 语言源程序中没有任何内容 2.下列语句中,说法正确的是( )。 A.C 程序书写格式严格,每行只能写一个语句 B.C 程序书写格式严格,每行必须有行号 C.C 程序书写格式自由,每行可以写多条语句,但之间必须用逗号隔开 D.C 程序书写格式自由,一个语句可以分写在多行 3.在 C 语言程序中,( )。 A.函数的定义可以嵌套,但函数的调用不可以嵌套 B.函数的定义不可以嵌套,但函数的调用可以嵌套 C.函数的定义和函数的调用均不可以嵌套 D.函数的定义和函数的调用均可以嵌套 4.以下说法中正确的是( ) 。 A.C 语言程序总是从第一个定义的函数开始执行 B.在 C 语言程序中,要调用的函数必须在 main()函数中定义 C.C 语言程序总是从 main()函数开始执行 D.C 语言程序中的 main()函数必须放在程序的开始部分 5.编辑程序的功能是( )。 A.建立并修改程序 B.将 C 源程序编译成目标程序 C.调试程序 D.命令计算机执行指定的操作 6.以下不是 C 语言的特点的是( )。 A.C 语言简洁、紧凑 B.能够编制出功能复杂的程序.

(3) 第二部分 例题解析与习题. 47. C.C 语言可以直接对硬件进行操作 D.C 语言移植性好 二、填空题 1.C 语言符号集包括________。 2.一个 C 程序有且仅有一个________函数。 3.C 程序的基本单位是________。 4.一个 C 程序有________个 main()函数和________个其他函数。 5.在一个 C 源程序中,注释部分两侧的分界符分别是________和________。 6.结构化设计中的三种基本结构是________。 7.在 C 语言中,输入操作是由库函数________完成的,输出操作是由库函数________完 成的。. 第2章. 数据类型、运算符和表达式. 2.1 例题解析 【例 1】按照 C 语言规定的用户标识符命名规则,不能出现在标识符中的是( ) 。 A.大写字母 B.连接符 C.数字字符 D.下划线 【解析】C 语言规定标识符只能由字母、数字和下划线 3 种字符组成,且第一个字母必须 为下划线或字母。 【答案】B 【例 2】下列定义变量的语句中错误的是( )。 A.int _int; B.double int_; C.char f_or D.float US$; 【解析】$不能用作变量名,合法的标识符只能由字母、数字和下划线 3 种字符组成。 【答案】D 【例 3】以下不合法的数值常量是( )。 A.001 B.1e1 C.8.0E0.5 D.0xabcd 【解析】A 中 001 是一个八进制整数常量,B 中 1e1 是浮点常量的科学记数法表示,而 C 中 8.0E0.5 则是错误的记法,因为 E(e)前后必须有数字,而且后面必须是整数。 【答案】C 【例 4】以下不合法的字符常量是( )。 A.'\018' B.' \" ' C.'\\' D.'\xcc' 【解析】C 语言中允许一种特殊形式的字符常量,也就是一个以“\”开头的字符序列,'\ddd' 表示八进制所代表的字符,'\xhh'表示十六进制所代表的字符,转义字符' \" '和'\\'分别表示字符" 和\。故选项 A 中数值越界。.

(4) 48. C 语言程序设计实验与习题指导. 【答案】A 【例 5】以下叙述中错误的是( )。 A.用户所定义的标识符允许使用关键字 B.用户所定义的标识符应尽量做到“见名知义” C.用户所定义的标识符必须以字母或下划线开头 D.用户所定义的标识符中,大、小写字母代表不同标识 【解析】合法的标识符只能由字母、数字和下划线 3 种字符组成,并且第一个字符必须 为字母或下划线。另外,在 C 语言中,大写字母和小写字母被认为是两个不同的字符。用户 标识符是根据需要定义的标识符,除了要遵循命名规则外,还应注意做到“见名知义”。如果 用户标识符与关键字相同,则程序在编译时将给出出错信息。所以用户所定义的标识符不允许 使用关键字。选项 A 说法错误。 【答案】A 【例 6】在 C 语言中,合法的长整型常数是( )。 A.0L B.4962710 C.3245628& D.216D 【解析】选项 A 中的表达式是正确的,以 L 或 l 结尾的整数都是长整型数。 【答案】A 【例 7】以下选项中可作为 C 语言合法常量的是( )。 A.-80 B.-080 C.-8e1.0 D.-80.0e 【解析】本题综合考查了整型数据和实型数据的表示方法,B 中出现了不合法的八进制数 字 8,C 的指数部分不是整数,D 缺少指数部分,故不合法。 【答案】A 【例 8】以下选项中,当 x 为大于 1 的奇数时,值为 0 的表达式是( ) 。 A.x%2= =1 B.x/2 C.x%2!=0 D.x%2= =0 【解析】表达式 x%2==1 是判断 x%2 的值是否等于 1;表达式 x%2!=0 是判断 x%2 是否 不等于 0。由于当 x 为大于 1 的奇数时,x%2 的值为 1,所以选项 A、D 的表达式都为 1;x/2 是整除运算,由于 x 为大于 1 的奇数,最小为 3,所以 x/2 为大于 0 的数值;x%2==0 是判断 x%2 的值是否是 0,由于 x%2 的值为 1,故关系表达式 x%2==0 为假,即表达式的值为 0,所 以正确选项为 D。 【答案】D 【例 9】表达式 3.6-5/2+1.2+5%2 的值是( )。 A.4.3 B.4.8 C.3.3 D.3.8 【解析】5/2 是整数相除,结果为 2。5%2 取模得到 1,因此,结果为 3.8。 【答案】D 【例 10】C 语言中最简单的数据类型包括( )。 A.整型、实型、逻辑型 B.整型、实型、字符型.

(5) 第二部分 例题解析与习题. 49. C.整型、字符型、逻辑型 D.整型、实型、逻辑型、字符型 【解析】本题考查的知识点为 C 语言里最基本的数据类型。在 C 语言里,没有逻辑型的 数据类型,表示逻辑关系的数据由 0 和非 0 表示,在 C 语言里,最基本的数据类型只有整型、 实型和字符型。因此本题正确答案为 B。 【答案】B 【例 11】若变量 x、y 已正确定义并赋值,以下符合 C 语言语法的表达式是( )。 A.++x,y=x--; B.x+1=y; C.x=x+10=x+y D.double(x)/10 【解析】赋值表达式形式为:变量名=表达式,选项 D 表示将变量 x 强制转换为 double 类型再除以 10。 【答案】D 2.2 练习题 一、选择题 1.C 语言提供的合法数据类型关键字是 ( )。 A.double B.short C.integer 2.对于下列各字符串,请选择正确的标识符( ) 。 A.Boo B.for C.5abc 3.下列不属于字符型常量的是( A.' A ' B."B". D.char D.I like C. )。 C.' \n'. D.' D '. 4.C 语言中的标识符只能由字母、数字和下划线 3 种字符组成,且第一个字符( )。 A.必须为字母或下划线 B.必须为下划线 C.必须为字母 D.可以是字母、数字和下划线中的任一种字符 5.下面四个选项中,均是正确的八进制数或十六进制数的选项是( ) 。 A.-10 0x8f -011 B.010 -0x11 0xf1 C.0abc -017 0xc D.0a12 -0x123 -0xa 6.若有定义:int a = 7; float x = 2.5 , y = 4.7 ; 则表达式 x + a % 3 * (int) (x + y) % 2/4 的 值是( ) 。 A.2.750000 B.0.00000 C.3.500000 D.2.500000 7.已知 ch 是字符型变量,下面不正确的赋值语句是( )。 A.ch = 5 + 9; B.ch= ' a + b '; C.ch = ' \ 0 '; D.ch= '7' + '6'; 8.正确的自定义标识符是( )。 A.a=2 B.a+b C.name D.default 9.错误的转义字符是( )。 A.'\091' B.'\\' C.'\0' D.'\'' 10.设 int a,b,c;执行表达式 a=b=1,a++,b+1,c=a+b--后,a,b 和 c 的值分别是( )。 A.2,1,2 B.2,0,3 C.2,2,3 D.2,1,3.

(6) C 语言程序设计实验与习题指导. 50. 11.在 C 语言中,错误的常数是( A.1E+0.0 B.5. 12.下列正确的标识符是( )。 A.12ab B.float. )。 C.0xaf. D.0L. C.aw~1e. D.b6ty. 13.下列运算符中优先级最高的是( )。 A.&& B. ++ C. ?: D.!= 14.以下能正确地定义整型变量 a,b 和 c 并为 c 赋初值 5 的语句是( A.int a=b=c=5; B.int a,b,c=5; C.a=5,b=5,c=5; D.a=c=b=5;. ) 。. 15.若有以下定义: char a; int b; float c; double d;. 则表达式 a*b+d-c 值的类型为( A.float B.int 16.C 语言提供的合法关键字是( A.swith B.cher. )。 C.char. D.double. C.Case. D.default. C.int. D.*p. )。. 17.下列可以用作变量名的是( A.1 B.al. )。. 18.以下定义语句中正确的是( A.char a='A'b='B'; C.int a=10,*b=&a;. )。. 19.下列选项中,不能用作标识符的是( A._1234_ B._1_2. B.float a=b=10.0; D.float *a,b=&a; )。 C.int_2_. 20.以下选项中,哪一个是 C 语言中合法的字符串常量( A.how are you B."china" C.'hello'. D.2_int_ )。 D.$abc$. 二、填空题 1.表达式 11/5 的结果是________,表达式 11%5 的结果是________。 2.设 int x;当 x 的值分别为 1、2、3、4 时.表达式(x&l==1)?1:0 的值分别是________。 3.执行下列语句后,a 的值是________。 int a=12;a+=a-=a*a; 4.若 s 是 int 型变量,且 s=6,则表达式 s%2+(s+1)%2 的值为________。 5.若 a、b 和 c 均是 int 型变量,则计算表达式 a=(b=4)+(c=2)后,a 值为________,b 值 为________,c 值为________。 6.C 语言中运算对象必须是整型的运算符是________。 7.若 x 和 n 均是 int 型变量,且 x 和 n 的初值均为 5,则计算表达式 x+=n++后,x 的值 为________,n 的值为________。 8.若有定义:int a=2,b=3;float x=3.5,y=2.5;则表达式(float)(a+b)/2+(int)x%(int)y 的值为 ________。 9.若有定义:char c='\010'; 则变量 c 中包含的字符个数为________。.

(7) 第二部分 例题解析与习题. 51. 10.假设所有变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)的值为________。 11.若 x 和 y 都是 double 型变量,且 x 的初值为 3.0,y 的初值为 2.0,则表达式 pow(y,fabs(x)) 的值为________。 12.表达式 12/3*(int)2.5/(int)(1.25*(3.7+2.3))值的数据类型为________。 13.表达式 pow(3.8,sqrt(double(x))) 值的数据类型为________。 14.设 int x=9,y=8;表达式 x==y+1 的结果是________。 15.假设 m 是一个三位数,从左到右用 a、b、c 表示各位的数字,则从左到右各个数字 是 bac 的三位数的表达式是________。. 第3章. 顺序结构. 3.1 例题解析 【例 1】以下程序的功能是:给 r 输入数据后计算半径为 r 的圆面积 s。程序在编译时出 错。出错的原因是( )。 main() /* Beginning */ {int r;float S; Scanf("%d",&r); S=π*r*r; Printf("S=%f\n",S); }. A.注释语句书写位置错误 B.存放圆半径的变量不应该定义为整型 C.输出语句中格式描述符非法 D.计算圆面积的赋值语句中使用了非法变量 【解析】程序中在计算圆面积时,语句 S=π*r*r 是错误的,因为这里的 π 没有进行定义, 正确的使用方法应该是在 main 前进行宏定义,确定 π 的值。 【答案】D 【例 2】信函的重量不超过 100g 时,每 20g 付邮资 80 分,即信函的重量不超过 20g 时, 付邮资 80 分,信函的重量超过 20g,不超过 40g 时,付邮资 160 分,编写程序输入信函的重 量,输出应付邮资(使用顺序结构)。 【解析】题目的要求是用顺序结构,那么我们来分析一下信函的重量与邮资的关系,在 信函的重量不超过 100g 的前提下,可以用下表表示信函的重量与邮资的关系。 信函的重量. 邮资. <20. 80 分. <40. 160 分. <60. 240 分. <80. 320 分. <100. 400 分.

(8) C 语言程序设计实验与习题指导. 52. 根据表中的数据,可以推断出:邮资=((信函的重量)整除 20 +1)*80 【答案】 #include <stdio.h> void main() { int weight,postage; printf("输入信函的重量:"); scanf("%d",&weight); postage=(weight/20+1)*80; printf("信函的邮资=%d\n",postage); }. 3.2 练习题 一、选择题 1.下面程序中的输出语句,a 的值是(. ) 。. main() { int a; Printf("%d\n",(a=3*5,a*4,a+5)); }. A.65 B.20 C.15 D.10 2.有定义:int x=10,y=3,z;则语句 print("%d\n",z=(x%y,x/y));的输出结果是( A.1 B.0 C.4 D.3 3.下面程序的输出结果是( )。. )。. Main() { int x=10,y=10; printf("%d%d\n",x--,--y); }. A.10 10 B.9 9 C.9 10 D.10 9 4.若要求的值分别为 10、10、A、B,正确的数据输入是( ) 。 A.10A 20B<CR> B.10 A 20 B<CR> C.10 A20B<CR> D.10A20 B<CR> 5.若 x,y 均定义为 int 型,z 定义为 double 型,以下不合法的 scanf 函数调用语句是( A.scanf("%d%d1x,%1e",&x,&y,&z); B.scanf("%2d*%d%1f",&x,&y,&z); C.scanf("%x%*d%o",&x,&Y); D.scanf("%x%o%6.2f", &x,&y,&z); 6.以下程序的执行结果是( )。. ) 。.

(9) 第二部分 例题解析与习题 #include<stdio.h> main() { int sum,gao; sum=gao=5; gao=sum++; gao++; ++gao; printf("%d\n",gao); }. A.7 B.6 C.5 D.4 7.设有如下说明,则能够正确使用 C 语言库函数的赋值语句是( )。 A.z=exp(y)+fabs(x); B.y=log10(y)+pow(y); C.z=sqrt(y-z); D.x=(int)(atan2((double)x,y)+exp(y-0.2)); 8.巳知字母 A 的 ASCII 码是 65,以下程序的执行结果是( ) 。 #include<stdio.h> main() { char c1='a',C2='Y'; printf("%d,%d\n",c1,c2);. A.A,Y B.65,65 C.65,90 D.97,89 9.设 X,Y 均为 Float 变量,则以下不合法的赋值语句是( ) 。 A.++x; B.y=(x%2)/10; C.x*=y+8; D.x=y=10; 10.以下能正确地定义整形变量 x,y,z 并为其赋初值 5 的语句是 ( ) 。 A.int x=y=z=5; B.int x,y,z=5; C.x=5,y=5,z=5; D.x=y=z=5; 11.已知 ch 是字符型变量,下面不正确的赋值语句是( )。 A.ch='a+b'; B.ich='\o'; C.ch='7'+'9'; D.ch=5+9; 12.已知 ch 是字符型变量,下面正确的赋值语句是( )。 A.ch='123'; B.ch='\xff'; C.ch='\08' D.ch="\"; 13.若有以下定义,则正确的赋值语句是( ) 。 int a,b; float x. A.a=1,b=2 B.b++; C.a=b=5 D.b=int(x); 14.设 X,Y 均为 Float 变量,则以下不合法的赋值语句是( ) 。 A.++x; B.y=(x%2)/10;. 53.

(10) C 语言程序设计实验与习题指导. 54. C.x*=y+8; D.x=y=10; 15.设 x,y,z 均为 int 变量,则执行语句 x=(y=(z=(10)+5)-5);后,x,y,z 的值是( A.x=10 y=15 z=10 B.x=10 y=10 z=10 C.x=10 y=10 z=15 D.x=10 y=5 z=10. ) 。. 二、填空题 1.假设变量 a 和 b 为整型,以下语句可以不借助任何变量把 a,b 中的值进行交换,请填 空:a+=________;b=a-________;a-=________; 2.假设变量 x 为整型变量,则执行下面语句后 x 的值为________。 x=7; x+=x-=x+x; 3.假设变量 a,b,c 为整型,以下语句借助中间变量把 a,b 和 c 中的值进行交换,把 b 的值给 a,把 c 的值给 b,把 a 的值给 c。例如,交换前,a=10,b=20,c=30,交换后 a=20, b=30,c=10。请填空: ________; a=b;b=c; ________; 4.以下程序的执行结果是________。 #include<stdio.h> main() { char c='A'+10; printf("c=%c\n",c); }. 5.以下程序输入 123456<CR>后的执行结果是________。 #include<stdio.h> main() { int a,b; scanf("%2d%3d",&a,&b); printf("a=%d,b=%d\n",a,b); }. 6.有一输入函数 scanf("%d",k);则不能使用 float 变量 k 得到正确数值的原因是________ 和________。scanf 语句的正确形式应该是:scanf("%f",&k)。 7.以下程序的输出结果为________。 main() {printf("*%f,%4.3f*\n",3.14,3.1415);} 8.以下程序的输出结果为________。 main() { int x=1,y=2; printf("x=%d y=%d*sum*=%d\n",x,y,x+y); printf("10 的平方是:%d\n",10*10); }. 9.以下程序的执行结果是_________。 #include<stdio.h> main().

(11) 第二部分 例题解析与习题. 55. { char c='A'; printf("dec:%d,oct:%O,hex:%x,ASCII:%c\n",c,c,c,c); }. 10.语句 printf("##%*d\n",i);中*的作用是________,而语句 printf("%-6d##\n",x);中-的作 用是________。 三、程序设计题 1.编写程序,从键盘输入梯形的上下底边长度和高,计算梯形的面积。 2.编写程序,从键盘上输入一行字符,并依次显示在屏幕上。 3.编写程序,从键盘上输入两个电阻的值,求它们并联和串联的电阻值,输出结果保留 两位小数。. 第4章. 选择结构. 4.1 例题解析 【例 1】下面关于逻辑运算符两侧运算对象的叙述中正确的是( )。 A.只能是整数 0 或 1 B.可以是任意合法的表达式 C.可以是结构体类型的数据 D.只能是整数 0 或非 0 整数 【解析】逻辑运算的对象可以是 C 语言中任意合法的表达式。 【答案】B 【例 2】C 语言中,switch 后的括号内表达式的值可以是( ) 。 A.只能为整型 B.只能为整型,字符型,枚举型 C.只能为整型和字符型 D.任何类型 【解析】原来的 C 标准规定:switch 后面的括号内的表达式,可以是整型、字符型或者 枚举型数据的表达式,但新的 ANSI C 标准规定上述表述式和 case 后的常量表达式的值可以是 任何类型。 【答案】D 【例 3】设有定义:“int a=2,b=3,c=4;”,则以下选项中值为 0 的表达式是( )。 A.(!a==1)&&(!b=0) B.(a>b)&&!c||1 C.a&&b D.a||(b+b)&&(c-a) 【解析】本题考查逻辑运算。根据运算符的优先级顺序,选项 A 的值为“(!2==1) &&(!3==0)=0”;选项 B 的值为“(2>3)&&!4||1=1”; 选项 C 的“2&&3=1”, 选项 D 的值为 “2||(3+3)&&(4-2)=1”;所以只有选项 A 的值为 0。 【答案】A 【例 4】有以下程序: main() { int a,b,c=25; a=c/10%9; b=a&&(-1);.

(12) C 语言程序设计实验与习题指导. 56 printf("%d,%d",a,b); }. 程序运行后输出结果是( ) 。 A.6,1 B.2,1. C.6,0. D.2,0. 【解析】本题的考点是关于 C 语言的整数运算和逻辑运算。c 的初值是“25”,“a=c/10%9” 中 c/10 整除结果是 2,再用 9 求余结果仍为 2,因此 a 的值为 2。而“b=a&&(-1)”,由于&&两 边都不为 0,所以 b=1。正确选项为 B。 【答案】B 【例 5】有以下程序: main() { int i=1,j=2,k=3; if(i++==1&&(++j==3||k++==3)) printf("%d,%d,%d\n",i,j,k); }. 程序运行后输出结果是( ) 。 A.1,2,3 B.2,3,4 C.2,2,3 D.2,3,3 【解析】本题的考点是关于 C 语言的逻辑表达式的计算规则。对于逻辑表达式“i++==1 &&(++j==3||k++==3)”,先判断“i++==1”,由于 i 为 1,“i++==1”为真,同时 i 的值加 1 为 2, &&左边一项为真,则结果取决于“++j==3||k++==3” ,这一项先判断“++j==3” ,由于 j 的初 值为 2,++j 后 j 的值为 3,“++j==3”的值为真,对于||运算符,有一边为真则为真,所以||左 边为真,就能得出“++j==3||k++==3”为真,就不用再去判断||后一项的值,也就是不会去运 算“k++==3”,故 k 的值没有变化。输出结果应该是:2,3,3。正确选项是 D。 【答案】D 【例 6】已定义“char ch="$";int i=1,j;”,执行“j=!ch&&i++”以后,i 的值为________。 【解析】用“&&”连接两个表达式时,若第一个表达式的值为假,则运算结果与第二个 表达式无关,此时第二个表达式将不再运算。本题中第一个表达式“j=!ch”的值为 0,所以第 二个表达式 i++没有进行运算,i 的值为 1。 【例 7】当 a=1,b=3,c=5,d=4 时,执行下面一段程序后,x 值为( ) if (a<b) if(c<d) x=1; else if(a<c) if(b<d) x=2; else x=3; else x=6; else x=7;. A.1 B.2 C.3 D.6 【解析】本题的难点是嵌套 if 语句中应注意 if 与 else 的配对关系,else 总是与它上面的 最近的 if 配对。 【答案】B 【例 8】有以下程序,运行后的输出结果是( )。 main().

(13) 第二部分 例题解析与习题. 57. { int a=2,b=0,c= -1; if(a=b+c) if(a>0) b=c=a; else if(a==0) a=b=c=0 else a=b=c=1 else a=b=c=-1 printf ("%d,%d,%d",a,b,c); }. A.1,1,1 C.-1,-1,-1. B.0,0,0 D.2,2,2. 【解析】此题易犯的错误是把 C 语言中的赋值号“=”理解成数学中的等号,从而选出答 案为 C。实际上第一个 if 语句中的条件表达式是一个赋值表达式,它的值也即 a 的值为-1,即 逻辑真,执行 if 后的语句,由于 a= -1,执行语句 a=b=c=1,使 a,b,c 的值均为 1。 【答案】A 【例 9】执行以下程序段后,变量 a,b,c 的值分别是( )。 int x=10,y=9; int a,b,c; a=(--x==y++)?--x:++y; b=x++; c=y;. A.a=9,b=9,c=9 B.a=8,b=8,c=10 C.a=9,b=10,c=9 D.a=1,b=11,c=10 【解析】本题主要是考查条件表达式的求解方式和同一个变量自增自减在一个表达式出 现时求该变量的值。条件表达式“a=(--x==y++)?--x:++y;”中“--x==y++”代入数据“9==9” 为真,所以条件表达式的值为?后面的“--x”(不再执行后面的++y),经过刚才那次“--x” ,x 的值为 9,再经过这次“--x”,x 的值为 8,b 的值就为 8,c 的值为 10。 【答案】B 【例 10】请读下面程序,输出结果是( )。 #include<stdio.h> main( ) { int x=1,y=0,a=0,b=0; switch(x) { case 1: switch(y) { case 0: a++;break; case 1: b++;break;} case 2: a++; b++;break; } printf ("a=%d,b=%d\n",a,b);}. A.a=2,b=1 B.a=1,b=1 C.a=1,b=0 D.a=2,b=2 【解析】在第一个 switch 语句的 case 1 子句中又是一个 switch 语句,而且第二个 switch 语句后(不是指在第二个 switch 内部)没有 break 语句,所以当 x=1 时,执行完第二个 switch.

(14) C 语言程序设计实验与习题指导. 58. 语句后,接下来会执行 case 2 子句,注意,这是解此题的关键,最终结果为 A。 【答案】A 4.2 练习题 一、选择题 1.逻辑运算符两侧运算对象的数据类型( ) 。 A.能是 0 或 1 B.只能是 0 或非 0 正数 C.只能是整型或字符型数据 D.可以是任何类型的数据 2.正确表示“当 x 的取值在[l,10]和[200,210]范围内为真,否则为假”的表达式是( )。 A.(x>=1)&&(x<=10)&&(x>=200)&&(x<=210) B.(x>=1)||(x<=10)||(x>=200)||(x<=210) C.(x>=1)&&(x<=l0)||(x>=200)&&(x<=210) D.(x>=1)||(x<=10)&&(x>=200)||(x<=210) 3.x、y 和 z 是 int 型变量,且 x=3,y=4,z=5,则下面表达式中值为 0 的是( ) 。 A.'x'&&'y' B.x<=y C.x||y+z&&y-z D.!((x<y&&!z||1) 4.判断 char 型变量 ch 是否为大写字母的正确表达式是( )。 A.'A'<=ch<='Z' B.(ch>='A')&(ch<='Z') C.(ch>='A')&&(ch<='Z') D.('A'<=ch)AND('Z'>=ch) 5.为了避免在嵌套的条件语句 if-else 中产生二义性,C 语言规定 else 子句总是与( ) 配对。 A.缩排位置相同的 if B.其之前最近的 if C.其之后最近的 if D.同一行的 if 6.若希望当 A 的值为奇数时,表达式的值为“真”,A 的值为偶数时,表达式的值为“假”。 则以下不能满足要求的表达式是( ) 。 A.if(A%2==1) B.if(!(A%2==0)) C.if(!(A%2)) D.if(A%2) 7.执行以下语句后 a 的值为(C),b 的值为( )。 int a,b,c; a=b=c=1; ++a||++b&&++c;. B.0 C.2 ① A.错误 B.2 C.错误 ② A.1 8.执行以下语句后 a 的值为(B),b 的值为( ) 。. D.1 D.0. int a=5,b=6,w=1,x=2,y=3,z=4; (a=w>x)&&(b=y>z);. B.0 C.2 D1 ① A.5 B.0 C.1 D4 ② A.6 9.已知 int x=10,y=20,z=30;以下语句执行后 x,y,z 的值是( if(x>y). ) 。.

(15) 第二部分 例题解析与习题. 59. z=x;x=y; y=z;. A.x=l0,y=20,z=30 C.x=20,y=10,z=10. B.x=20,y=30,z=30 D.x=20,y=30,z=20. 10.阅读以下程序 main() {int a=5,b=1,c=1; if(a=b+c) printf("***\n"); else printf("$$$\n"); }. 以上程序( )。 A.语法有错不能通过编译 C.输出*** 11.以下程序运行结果是( )。. B.可以通过编译但不能通过连接 D.输出$$$. main() {int m=5; if(m++>5)printf("%d\n",m); else. printf("%d\n",m--);. }. A.4. B.5. C.6. 12.当 a=1,b=3,c=5,d=4 时,执行完下面一段程序后 x 的值是(. D.7 )。. if(a<b) if(c<d) x=1; else if(a<c) if(b<d) x=2; else x=3; else x=6; else x=7;. A.1 B.2 13.以下程序的运行结果是( )。. C.3. D.6. C.1. D.0. main() {int x=2,y=-1,z=2; if(x<y) if(y<0) z=0; else z+=1; printf("%d\n",z); }. A.3 B.2 14.以下程序的运行结果是( )。 main() {int k=4,a=3,b=2,c=1; printf("\n%d\n",k<a? k:c<b? c:a); }.

(16) C 语言程序设计实验与习题指导. 60. A.4 B.3 C.2 D.1 15.执行下列程序,输入为 1 的输出结果是( ),输入为 3 的输出结果是(. ) 。. #include<stdio.h> main() { int k; scanf("%d",&k); switch(k) {case 1: printf("%d\n",k++); case 2: printf("%d\n",k++); case 3: printf("%d\n",k++); case 4: printf("%d\n",k++);break; default: printf("FULL!\n"); } }. ①A.1. ②A.3. B.2. C.2. D.1. B.4. 3 4 5 C.3. 2 3 4 D.4. 4. 5. 二、填空题 1.设 y 为 int 型变量,请写出描述“y 是奇数”的表达式_________。 2.设 x,y,z 均为 int 型变量,请写出描述“x 或 y 中有一个小于 z”的表达式_________。 3.当 m=2,n=1,a=1,b=2,c=3 时,执行完 d=(m=a!=b)&&(n=b>c)后;n 的值为_________,m 的值为_________。 4.设有变量定义:int a=10,c=9;则表达式 (--a!=c++)?--a:++c 的值是_________。 5.以下程序运行结果是_________。 main() { int x,y,z; x=1,y=2,z=3; x=y--<x+y!=z; Printf("%d,%d",x,y); }. 6.执行以下的 C 语言程序段后,a=_________,b=_________,c=_________。 int x=10,y=9; int a,b,c; a=(x--==y++)?x--:y++; b=x++;.

(17) 第二部分 例题解析与习题 c=y;. 7.以下程序段的运行结果是_________。 int x=1,y=0; switch (x) { case 1 : switch (y) { case 0 : printf("**1**"); break; case 1 : printf("**2**"); break; } case 2 : printf("**3**"); }. 8.以下程序的运行结果是_________。 main() {int a,b,c; int s,w,t; s=w=t=0; a=-1;b=3;c=3; if(c>0) s=a+b; if(a<=0) {if (b>0) if(c<=0) w=a-b;} else if(c>0) w=a-b; else t=c; printf("%d %d %d",s,w,t); }. 9.设有程序片断: switch (grade) { case 'A' : printf("85—100"); case 'B' : printf("70—84"); case 'C' : printf("60—69"); case 'D' : printf("<60"); default : printf("error! "); }. 若 grade 的值为'C',则输出结果是________。 10.以下程序的运行结果是________。 #include<stdio.h> main() {int x, y=-2, z=0; if((z=y)<0) x=4; else if(y==0) x=5; else x=6; printf("%d,%d",x, z); if(z=(y==0)) x=5; x=4;. 61.

(18) C 语言程序设计实验与习题指导. 62 printf("%d,%d",x,z); if(x=z=y)x=4; printf("%d,%d",x,z); }. 三、程序设计题 1.从键盘输入三个整数,然后按由小到大输出。 2.已知函数: x x<1 y= 2x-1 1≤x<10 3x-11 x≥10 求 y 值。 3.某单位马上要加工资,增加金额取决于工龄和现工资两个因素:对于工龄大于等于 20 年的,如果现工资高于 2000,加 200 元,否则加 180 元;对于工龄小于 20 年的,如果现工资高 于 1500,加 150 元,否则加 120 元。工龄和现工资从键盘输入,编程求加工资后的员工工资。 4.假设奖金税率如下(a 代表奖金,r 代表税率) a<500 r=0% 500≤a<1000 r=5% 1000≤a<2000 r=8% 2000≤a<3000 r=10% 3000≤a r=15% 编写一程序使输入一个奖金数,求税率和应缴税款以及实得奖金数(扣除奖金税后)。设 r 代表税率,t 代表税款,b 代表实得奖金数。. 第5章. 循环结构. 5.1 例题解析 【例 1】下面有关 for 语句的说法中,正确的是( )。 A.任何情况下,for 语句中的三个表达式一个都不能少 B.for 语句中的循环体至少会被执行一次 C.for 语句只能用于循环次数已经确定的情况下 D.for 语句中的循环体可以是复合语句 【解析】for 语句的三个表达式都可以省略,所以 A 错误。执行 for 语句时,如果初始条 件不能使第二个表达式的值为真,循环体就不会被执行,所以 B 错误。对于 for 语句,可以在 循环体内部修改循环变量,所以 C 适用于循环次数已确定的选项也是错误的。 【答案】D 【例 2】执行下列程序段后的输出是( ) 。 x=l; while(x<=3) x++,y=(x++)+x;. printf("%d,%d",x,y); A.6,10. B.5,8. C.4,6. D.3,4.

(19) 第二部分 例题解析与习题. 63. 【解析】我们可以使用逐步记录运行结果的方法来获得输出结果,记录如下:x=1,进入 循环,条件满足执行循环体:计算 x++得 x 为 2,计算 y=(x++)+x,得 y 为 4、x 为 3;继续循 环,条件满足执行循环体:计算 x++得 x 为 4,计算 y=(x++)+x,得 y 为 8、x 为 5;继续循环, 条件不满足退出循环;输出 x 和 y 的值为 5,8。 【答案】B 【例 3】下列程序段的输出结果是( )。 for( i=0; i<1;i+=l) for( j=2;j> 0;j--) printf("*");. A.**. B.***. C.****. D.******. 【解析】注意每次内层循环仅输出 1 个“*”,所以只要分析出二重循环的总次数即可。 首先分析外层循环的次数:控制变量 i 的初值为 0,终值为 0(i<1 相当于 i<=0),步长为 1(i+=l 相当于 i=i+l) ,所以外层循环次数为 1。再分析内层循环次数:控制变量 j 的初值为 2,终值 为 1(j>0 相当于 j>=1),步长为-1(j--),所以循环体一共执行的次数等于外层循环次数乘以内 层循环次数,共计为 l*2=2。 【答案】A 【例 4】下面程序退出循环后,x 的值为( )。 int x=20;. do {x/=2;} while(x--). A.0 B.0.375 C.-0.625 D.-1 【解析】显然 while(x--)每次执行时是先用 x 的原值进行逻辑真或假的判断,再将 x 的值 减去 1,由于 x 是整数变量,因此结束循环时 while(x--)中 x--值为 0,而执行 x--后 x 的值为-1。 【答案】D 【例 5】下面的程序,描述正确的是( ) 。 main() { int x=3; do { printf("%d\n",x-=2) }while(!(--x); }. A.输出的是 1 B.输出的是 1 和-2 C.输出的是 3 和 0 D.是死循环 【解析】do…while 语句的执行流程是:先执行循环体,再判断条件,循环控制条件是!(--x), 当且仅当 x=1 时,此表达式的值才为非 0 值,即 x!=1 时,将退出循环。接下来分析程序:x 初值为 3,执行循环体后,输出 x 的值为 1,然后判断循环条件,经上面分析,可知 x=1 时, 循环条件成立(此时 x 的值变为 0),继续执行循环,输出 x 的值为-2,判断循环条件为假, 退出循环。 【答案】B 【例 6】求个位数为 7,且能被 3 整除的 6 位数的个数。.

(20) C 语言程序设计实验与习题指导. 64. #include <stdio.h> main( ) { long int i; int count; count= ( ① ) ; for(i= ( ② ); i<99999;( if( ④ ) count++; printf ("count=%d\n",count);. ③. ) ). 【解析】此题使用的技巧是,注意到所有个位数为 7 的 6 位数的前 5 位的集合是全体的 5 位数,所以建立循环时用每一个 5 位数生成一个对应的个位数字为 7 的 6 位数,刚好是一一映 射的关系,比起直接建立考查每一个 6 位数的循环,再在循环体内同时判断个位是否为 7 和是 否能被 3 整除两个条件,其效率提高了 10 倍。 【答案】① 0 ② 10000 ③ i++ ④ (i*10+7)%3==0 【例 7】下列程序的主要功能是求出 3 位整数中能被 8 整除余 7,或者被 7 整除余 8 的所 有整数。请填写程序中缺少的语句。 main() { int k=100; do if(__________________) prinif("%d\n",k); while(k++<999); }. 【解析】本程序的关键是 do-while 循环。控制循环的条件是 x 当前值小于 999。从 k 所赋 予的初值看,k 是从 100 开始的,由于控制循环的条件中 k 有一个后缀的++运算,所以,最 后一次循环执行时,k 值是 999。这个循环恰好是处理了所有的 3 位整数。循环体中是单分支 语句,条件成立时则输出此时的变量 k 值,显然这个条件就是“k 能被 8 整除余 7,或者被 7 整除余 8”,因此可以写出所缺少的条件。 【答案】(k%8==7)||(k%7==8) 【例 8】运行程序段,则以下程序段的输出结果为________。 for(int i=0;i<8;i++) printf("%d",++i); printf("%d",i++);. 【解析】注意此题中的两个 printf 语句,只有前者才是循环体,而后者只在循环结束后才 执行一次。printf("%d",++i);是先将 i 自加 1,再打印出 i 的值,而 printf("%d",i++);是先打印出 i 的原值,再将 i 自加 1。相关问题:printf("%d,%d",++i,i++);语句应该如何执行(提示:printf 语句的变量列表中的表达式的执行顺序为从右向左逐一执行)? 【答案】1,3,5,7,8 【例 9】执行下列程序段后的输出是________。 x=0; while(x<3) for(;x<4;x++) {printf("%d",x++);.

(21) 第二部分 例题解析与习题. 65. if( x<3) continue; else break; printf("%1d",x);}. 【解析】我们用执行程序并记录各变量值的方法来获得程序的输出结果,记录如下:x=0; 第一次执行 while 循环,条件 x<3 成立,执行 while 的循环体(即 for 循环);第一次执行 for 循环,条件 x<4 成立,执行 for 的循环体,输出 x 的值为 0,然后 x++,x 值为 1;if-else 的条 件 x<3 成立,执行 continue,继续 for 循环,执行 x++, x 为 2;第二次执行 for 循环,条件 x<4 成立,执行 for 的循环体,输出 x 的值为 2,然后 x++,x 值为 3; if-else 的条件 x<3 不成立,执行 break,退出 for 循环,返回 while 循环;第二次执行 while 循环,条件 x<3 不成立,退出 while 循环,结束程序运行。所以,最终输出结果是两个一位整 数 0 和 2。 【答案】 0 2 【例 10】运行下面程序后,输出结果为( ) 。 # include<stdio.h> main( ) { int x,y; for(x=30,y=0; x>=10,y<20;x--,y++) {x/=2; y+=2;} printf("x=%d, y=%d/n",x,y): }. 【解析】需要注意的问题有两点: 逗号表达式 x>=10,y<20 的值,不等价于 x>=10&& y<20,也不等价于 x>=10||y<20,所 以此循环应以 y 的值是否满足条件作为循环是否结束的标准;对于整型变量 x,当 x=1 时, x/2=0,可是当 x=-1 时呢?x/2=0 还是 x/2=-1 呢?事实上,x/2=0 正确。 【答案】 x=-1,y=21 5.2 练习题 一、选择题 1.t 为 int 类型,进入下面的循环之前,t 的初值为 0。 While(t==1) {…}. 则以下叙述中正确的是( ) 。 A.循环控制表达式的值为 1 C.循环表达式不合法 2.以下 for 循环是( )。. B.循环控制表达式的值为 0 D.以上说法都不对. for(x=0,y=0;(y!=123)&&(x<4);x++);. A.无限循环 B.循环次数不定 C.执行 4 次 D.执行 3 次 3.下面有关 for 循环的正确描述是( ) 。 A.for 循环只能用于循环次数已经确定的情况.

(22) C 语言程序设计实验与习题指导. 66. B.for 循环是先执行循环体语句,后判定表达式 C.在 for 循环中,不能用 break 语句跳出循环体 D.for 循环体语句中,可以包含多条语句,但要用花括号括起来 4.对于 for(表达式 1;;表达式 3)可理解为( )。 A.for(表达式 1:1;表达式 3) B.for(表达式 1;1;表达式 3) C.for(表达式 1;表达式 1;表达式 3) D.for(表达式 1;表达式 3;表达式 3) 5.C 语言中 while 和 do-while 循环的主要区别是( )。 A.do-while 的循环体至少无条件执行一次 B.while 的循环控制条件比 do-while 的循环控制条件严格 C.do-while 允许从外部转到循环体内 D.do-while 的循环体不能是复合语句 6.若有如下语句 int x=3; do {printf("%d\n",x-=2);} while(!(--x));. 则上面程序段( ) 。 A.输出的是 1 C.输出的是 3 和 0 7.下面程序段的运行结果是(. B.输出的是 1 和-2 D.是死循环 )。. x=y=0; while(x<15) {y++; x+=++y;} printf("%d,%d",y,x);. A.20,7. B.6,12. 8.下面程序段的运行结果是(. C.20,8. D.8,20. C.4. D.有语法错. C.x=15,y=14. D.x=y=27. )。. int n=0; while(n++<=2); printf("%d",n);. A.2 B.3 9.下面程序段的运行结果是(. )。. for(y=1;y<10;) y=((x=3*y,x+1),x-1); printf("x=%d,y=%d",x,y);. A.x=27,y=27 B.x=12,y=13 10.与下面程序段等价的是( )。 for (n=100;n<=200;n++) { if(n%3==0) continue; printf("%4d",n); }. A.for(n=100;(n%3)&&n<=200;n++) printf("%4d",n); B.for(n=100;(n%3)||n<=200;n++) printf("%4d",n); C.for(n=100;n<=200;n++) if(n%3!=0) printf("%4d",n); D.for(n=100;n<=200;n++) { if(n%3) printf("%4d",n);.

(23) 第二部分 例题解析与习题. 67. else continue; break; } 11.下面程序的运行结果是(. ) 。. #include<stdio.h> main() {int num=0; while(num<=2) {num++; printf("%d\n",num); } }. A.1 B.1 2 12.下面程序的运行结果是( )。. C.1 2 3. D.1 2 3 4. C.#. D.#&. #include<stdio.h> main() {int i; for(i=1;i<=5;i++) switch(i%5) {case 0:printf("﹡");break; case 1:printf("#");break; default:printf("\n"); case 2:printf("&"); } }. A.#&&&*. B.#&. & &*. 13.下面程序的运行结果是(. & & & *. & *. )。. #include<stdio.h> main() { int k=0;char c='A'; do { switch(c++) case 'A':k++;break; case 'B':k--; case 'C':k+=2;break; case 'D':k=k%2;continue; case 'E':k=k*10;break; default:k=k/3; } k++;.

(24) C 语言程序设计实验与习题指导. 68 }while(c<'G'); pfintf("k=%d\n",k); }. A.k=3. B.k=4. 14.下面程序的运行结果是(. C.k=2. D.k=0. C.6. D.7. )。. main() { int i,j,a=0; for(i=0;i<2;i++) { for (j=0; j<4; j++) {if (j%2) break; a++; } a++; } printf("%d\n",a); }. A.4. B.5. 15.下面程序的运行结果是(. )。. #include<stdio.h> main() { int a,b; for (a=1,b=1;a<=100;a++) { if(b>=20) break; if(b%3==1) {b+=3; continue;} b-=5; } printf(“%d\n”,a); }. A.7 B.8 C.9 D.10 二、填空题 1.若 for 循环用以下形式表示: for(表达式 1;表达式 2;表达式 3) 循环体语句 则执行语句 for(i=0;i<3;i++) printf("*");时,表达式 1 执行________次,表达式 3 执行 ________次。 2.执行下面程序段后,k 值是________。 k=1;n=263; do{k*=n%10; n/=10 } while(n);. 3.下面程序段的运行结果是________。 for(a=1,i=-1;-1<=i<1;i++) {a++; printf("%2d",a);} printf("%2d",i);. 4.下列程序运行后的输出结果是________。 #include<stdio.h> main().

(25) 第二部分 例题解析与习题. 69. {int s=0,k; for(k=7;k>=0;k--) { switch(k) { case 1: case 4: case 7: s++; break; case 2; case 3; case 6; break; case 0: case 5: s+=2; break; } } printf("s=%d\n",s); }. 5.下面程序的功能是计算 1-3+5-7+……-99+101 的值,请填空。 #include<stdio.h> main() { int i,t=1,s=0; for(i=1;i<101;i+=2) {t=t*i;s=s+t; _______;} printf("%d\n",s); }. 6.下面程序的功能是从键盘输入的一组字符中统计出大写字母的个数 m 和小写字母的个 数 n,并输出 m,n 中的较大数,请填空。 #include<stdio.h> main() {int m=0,n=0; char c; while(( c=getchar())!='\n') { if(c>='A'&&c<='Z') m++; if(c>='a'&&c<='z') n++; } printf("%d\n",_____________); }. 7.下面程序的功能是从键盘输入的一批正整数中求出最大者,输入 0 结束循环。 #include<stdio.h> main().

(26) C 语言程序设计实验与习题指导. 70 {int a,max=0; scanf("%d",&a); while( __________) {if(max<a)max=a; scanf("%d",&a); } printf("%d",max); }. 8.下面程序的功能是计算正整数 2345 的各位数字平方和,请填空。 #include <stdio.h> main() { int n,sum=0; n=2345; do {sum=sum+ ______________; n=n/10; }while(n); printf("sum=%d",sum); }. 9.有一堆零件(100 到 200 之间),如果分成 4 个零件一组的若干组,则多两个零件;若 分成 7 个零件一组,则多三个零件;若分成 9 个零件一组,则多 5 个零件。下面程序是求这堆 零件的总数,请填空。 #include<stdio.h> main() {int i; for(i=100;i<200;i++) _____________________________; printf("%d",i); }. 10.下面程序的功能是利用“辗转相除法”求两个正整数的最大公约数。请填空。 #include<stdio.h> main( ) {int r,m,n; scanf("%d%d",&m,&n); if (m<n) {r=m,m=n,n=r}; r=m%n; while(__________) {m=n; n=r;} printf("%d\n",n); }. 三、程序设计题 1.一个数如果恰好等于它的因子之和,这个数就称为完数。求 100~1000 之内的所有 完数。 2.编程:求 1!+2!+3!+4!+5!+6!+7!+8!+9!+10!。.

(27) 第二部分 例题解析与习题. 71. 3.百元买百鸡问题。设有 1 百元钱,需购买 1 百只鸡,其中:公鸡 5 元一只,母鸡 3 元 1 只,小鸡 1 元 3 只,试问有几种购买方式。 4.用牛顿迭代法求方程 2X3-4X2+3X-6=0 在 1.5 附近的根。. 第6章. 数组. 6.1 例题解析 【例 1】下列程序运行结果是(. )。. main() {int z,y[3]={2,3,4};y[y[2]]=10; printf("%d",z); }. A.10 B.2 C.3 D.运行时出错,得不到值 【解析】由于元素 y[2]的值是 4,所以 y[y[2]]相当于 y[4],数组合法下标为 0、1、2,所 以访问 y[4]实际出现下标越界,所以运行出错。 【答案】D 【例 2】若有定义“char s []="good";char t[]={'g','o','o','d'};”,下列叙述正确的是( ) 。 A.s 和 t 完全相同 B.数组 s 比 t 短 C.数组 s 与 t 长度相同 D.数组 s 比 t 长 【解析】本题给出两种初始化字符数组的方式,两者产生的结果不一样,s 赋予了整个字 符串,长度为 5,其中包括字符串结束符'\0'。t 被逐个元素赋值,数组的长度是 4。 【答案】D 【例 3】以下程序输出结果是( )。 Main() {char ch[3][5]={"AAA","BBB","CC"} printf("\"%s",ch[1]); }. A."AAAA" B."BBB" C."BBBCC" D."CC" 【解析】本题是二维数组初始化和按行进行操作。二维数组每行可以当作一个一维数组 来处理。初始化时,按行赋值,将“AAA”赋给了 ch[0],将“BBB”赋给了 ch[1],将“CC” 赋给了 ch[2],输出也可按行进行,输出 ch[1]的内容,并且要将两个转义字符“\"”输出,所 以输出结果是"BBB"。 【答案】B 【例 4】下列选项中正确的语句组是( ) 。 A.char s[8]; s={"hunangongxueyuan"}; B.char *s s={"hunangongxueyuan"}; C.char s[8]; s="hunangongxueyuan"; D.char *s s="hunangongxueyuan";.

(28) C 语言程序设计实验与习题指导. 72. 【解析】数组名 s 代表数组的首地址是一个常量,不能通过赋值来改变,所以答案 A 和 C 不正确。答案 B 中是指针,不是数组,不需要使用花括号。 【答案】D 【例 5】用筛选法求 100 以内的素数。 【解析】筛选法求素数的基本思路是:判断 100 之内的每一个数,逐个找出非素数并把 它去除,最后剩下的全部是素数。 具体做法: (1)先去除 1。 (2)用 2、3、4、……、100 作为除数,去除该数以后的所有数,把该除数的倍数标注 为 0,表示该数已从数组中被去除。 (3)循环结束,数组中保留的即为 100 之内的素数。 源程序如下: main() {int i,j,a[100],n=0; for(i=2;i<100;i++) a[i]=i; for(i=2;i<100;i++) for(j=i+1;j<100;j++) if(a[i]!=0 && a[j]!=0) if(a[j]%a[i]==0) a[j]=0; for(i=2;i<100;i++) if(a[i]!=0) {printf("%4d",a[i]); n++; if(n%10==0) printf("\n"); } }. 运行结果如下:. 6.2 练习题 一、选择题 1.若有定义:“int aa[8]”,则对数组元素的正确引用是( )。 A.aa[8] B.aa[1.2] C.aa[8-7] D.aa(1.2) 2.若有定义“int a[][3]={1,2,3,4,5,6,7,8};”则 a[1][2]的值是( )。 A.4 B.5 C.6 D.7 3.若有定义“char s[20]="fg\th";”,则 strlen(s)的值是( )。.

(29) 第二部分 例题解析与习题. A.5 B.20 4.以下程序输出结果是( ) 。. C.4. 73. D.6. main() {int i,a[10]; for(i=9; i>=0; i--) a[i]=10-i; printf("%d%d%d",a[2],a[5],a[8]); }. A.258 B.741 C.852 D.369 5.以下对二维整形数组 a 进行正确初始化的语句是( )。 A.int a[2][]={{1,01},{5,2,3}}; B.int a[][3]={{1,2,3},{4,5,6}}; C.int a[2][3]={{1,2,3},{4,5},{6}}; D.int a[][3]={{1,0,1},{},{1,1}}; 6.若有说明:int a[3][4]={0};则下面正确的叙述是( )。 A.只有元素 a[0][0]可得到初值 0 B.此说明语句不正确 C.数组 a 中各元素都可得到初值,但其值不一定为 0 D.数组 a 中每个元素均可得到初值 0 7.对以下说明语句的正确理解是(. ) 。. int a[10]={6,7,8,9,10};. A.将 5 个初值依次赋给 a[1]至 a[5] B.将 5 个初值依次赋给 a[0]至 a[4] C.将 5 个初值依次赋给 a[6]至 a[10] D.因为数组长度与初值的个数不同,所以此语句不正确 8.定义如下变量和数组: int k; int a[3][3]={1,2,3,4,5,6,7,8,9};. 则下面语句的输出结果是(. )。. for (k=0;k<3;k++) printf("%d",a[k][2-k]);. A.3 5 7 9.若有以下程序段: …………. B.3 6 9. int a[]={4,0,2,3,1},I,j,t; for(I=1;I<5;I++) {t=a[I];j=I-1; while(j>=0&&t>a[j]) {a[j+I]=a[j];j--;} a[j+1]=t;} …………. 则该程序段的功能是(. )。. C.1 5 9. D.1 4 7.

(30) C 语言程序设计实验与习题指导. 74. A.对数组 a 进行插入排序(升序) C.对数组 a 进行选择排序(升序) 10.以下正确的定义语句是( )。 A.int a[1][4]={1,2,3,4,5}; C.long b[2][3]={{1},{1,2},{1,2,3}}; 11.下面程序的运行结果是( ) 。. B.对数组 a 进行插入排序(降序) D.对数组 a 进行选择排序(降序) B.float x[3][]={{1},{2},{3}}; D.double y[][3]={0};. main() {int a[6][6].i.j; for(i=1;i<6;i++) for(j=1;j<6;j++) a[i][j]=(i/j)*(j/i); for(i=1;i<6;i++) {for(j=1;j<6;j++) printf("%2d",a[i][j]); printf("\n";) } }. A.1 1 1 1 1. B.0 0 0 0 1. 11111 11111 11111 11111 C.1 0 0 0 0. 00010 00100 01000 10000 D.1 0 0 0 1. 01000 00100 00010 00001 12.下面程序的运行结果是(. 01010 00100 01010 10001 )。. main() {int a[6],i; for(i=1;i<6;i++) {a[i]=9*(i-2+4*(i>3))%5; printf("%2d",a[i]); } }. A.–4 0 4 0 4 B.–4 0 4 0 3 C.–4 0 4 4 3 二、填空题 1.下面程序将十进制整数转换成 n 进制。请填空。 main ( ) { int i=0,base,n,j,num[20]; printf("Enter data that will be converted \n"); scanf("%d", &n ) ;. D.–4 0 4 4 0.

(31) 第二部分 例题解析与习题. 75. printf("Enter base \n"); scanf("%d", &base ) ; do {i++ ; num[i]= n ① base ; n=n ② base ; }while ( n != 0 ) ; printf ("The data %d has been converted into the %d-- base data : \n ", n , base ) ; for ( ③ ) {if(num[j]>=10) {printf("%c",'A'+(num[j]-10));} else {printf("%d",num[j] ) ;} } }. 2.下面程序的功能是统计年龄在 16~31 岁之间的学生人数。请填空。 main() {int a[30],n,age,i; for(i=0;i<30;i++) a[i]=0; printf("Enter the number of the students(<30)\n"); scanf("%d",&n); printf("Enter the age of each student:\n"); for(i=0;i<n;i++) {scanf("%d",&age); ① ; } printf("the result is\n"); printf("age number\n"); for( ② ;i++) printf("%3d %6d\n",i,a[i-16]); }. 3.下面程序中的数组 a 包括 10 个整数元素,从 a 中第二个元素起,分别将后项减前项之 差存入数组 b,并按每行 3 个元素输出数组 b。请填空。 main() {int a[10],b[10],i; for(i=0;;i++) scanf("%d",&a[i]); for(i=1; ① ;i++) b[i]=a[i]-a[i-1]; for(i=1;i<10;i++) {printf("%3d",b[1]); if( ② ) printf("\n");.

(32) C 语言程序设计实验与习题指导. 76 } }. 4.下面程序的功能是将字符数组 a[6]={'a', b','c','d','e','f'}变为 a[6]={'f','a','b','c','d','e'}, 请填空: #include<stdio.h> main() { char t,a[6]={'a','b','c','d','e','f'}; int i; ① ; for(i=5;i>0;i--) ② ; a[0]=t; for(i=0;i<=5; i++) printf("%c", a[i]) ; }. 5.设数组 a 中的元素均为正数,以下程序是求 a 中偶数的个数和偶数的平均值。请填空。 main() {int a[10]={1,2,3,4,5,6,7,8,9,10}; int k,s,i; float ave; for(k=s=i=0;i<10;i++) {if(a[i]%2!=0) ① ; s+=[a[i]]; k++; } if(k!=0) { ② ; printf("%d,%f\n",k,ave); } }. 三、程序设计题 1.求矩阵下三角形元素之和。 2.青年歌手参加歌曲大奖赛,有 10 个评委对她进行打分,试编程求这位选手的平均得 分(去掉一个最高分和一个最低分)。 3.回文是从前向后和从后向前读起来都一样的句子。写一个函数,判断一个字符串是否 为回文,注意处理字符串中有中文也有西文的情况。. 第7章. 函数与变量作用域. 7.1 例题解析 【例 1】以下叙述正确的是(. ) 。.

(33) 第二部分 例题解析与习题. 77. A.全局变量的作用域一定比局部变量的作用域范围大 B.静态类别变量的生存期贯穿于整个程序运行期间 C.函数的形式参数都属于全局变量 D.未在定义语句中赋值的 auto 变量和 static 变量的初值是随机的 【解析】本题考查的是作用域。若函数内的局部变量与全局变量同名,全局变量在函数 体内不起作用,所以全局变量的作用域不一定比局部变量的作用域范围大,答案 A 错误。函 数形参是在函数被调用时分配的,函数退出时回收,所以函数的形参属于局部变量,答案 C 错误。未赋值的 auto 变量值是随机的,但未赋值的 static 变量初值是 0,答案 D 也不正确。 【答案】B 【例 2】有以下程序: int f1(int x,int y) {return x>y?x:y;} int f2(int x,int y) {return x>y?y:x;} main() { int a=4,b=3,c=5,d,e,f; d=f1(a,b);d=f1(d,c); e=f2(a,b);e=f2(e,c); f=a+b+c-d-e; printf("%d,%d,%d\n",d,f,e); }. 执行后输出结果是() 。 A.3,4,5 B.5,3,4 C.5,4,3 D.3,5,4 【解析】本题考查函数调用。f1()函数的功能是返回两个参数中较大值,f2()函数的功能 是返回两个参数中的较小值。主函数中的语句“d=f1(a,b);d=f1(d,c);”的作用是调用两次 f1(), 将 a、b、c 中的最大值返回给 d,所以 d 的返回值是 5。语句“e=f2(a,b);e=f2(e,c);”的作用是 调用两次 f2(),将 a、b、c 中的最小值返回给 e,所以 e 的返回值为 3,由此得 f 的值为 4。 【答案】C 【例 3】有如下函数调用语句: func(rec1,rec2+rec3,(rec4,rec5));. 该函数调用语句中,含有实参个数是( )。 A.3 B.4 C.5 D.有语法错误 【解析】本题考查函数的参数和逗号表达式的应用。C 程序中函数的参数可以是变量或表 达式。在本题中 rec1 是变量,可作为函数的一个参数;算数表达式可作为一个参数; (rec4, rec5)并不表示函数的两个参数,而是一个逗号表达式,只能作为函数的一个参数,所以函数 的实参为 3。 【答案】A 【例 4】以下程序输出结果是( )。 void fun() {static int a=0; a+=2;printf("%d",a);.

(34) C 语言程序设计实验与习题指导. 78 } main() {int cc; for(cc=1;cc<4;cc++) fun(); printf("\n"); }. 【解析】本题考查静态变量的使用及函数的多次调用。在 fun()函数中定义了一个静态局 部变量 a。静态局部变量的特点是:它存储在静态存储区中,函数返回时静态变量所占的内存 不会被释放,变量的值仍被保留。如果再次调用这个函数时,变量中保存的值可被再次使用, 并且静态局部变量的初值为 0。fun()函数被调用 3 次,第一次调用,a 的值由 0 变为 2,输出 值为 2,函数调用返回,但 a 所占的内存没有被回收;第二次调用,a 的值由 2 变为 4,输出 值为 4;第三次调用,a 的值由 4 变为 6,输出值为 6。 【答案】246 【例 5】写一个函数,输入一个 4 位数,要求输出这 4 个数字字符,但每两数字之间有一 个空格。如输入 1990,应输出“1 9 9 0” 。 【解析】主函数输入 4 位数后传递给 fun 函数,fun 函数的作用是将各位上的数码分离出 来,并转换为相应字符的 ASCII 码,存放在字符数组中,最后将字符数组的字符依次输出。 编写源程序如下: fun(int a) {int i=0; char c[4]; c[0]=a/1000+48; c[1]=a%1000/100+48; c[2]=a%100/10+48; c[3]=a%10+48; printf(" The result is:\n"); for(;i<4;i++) printf("%c ",c[i]); } main() { int a; printf("Input the data:"); scanf("%d",&a); if(a>=10000|| a<=999) {printf("error data!"); exit(0); } fun(a); }. 运行结果:.

(35) 第二部分 例题解析与习题. 79. 7.2 练习题 一、选择题 1.以下叙述正确的是( ) A.函数定义可以嵌套,函数调用也可以嵌套 B.函数定义不可以嵌套,函数调用可以嵌套 C.函数定义不可嵌套,函数调用也不可以嵌套 D.函数定义可以嵌套,函数调用也可以嵌套 2.C 语言中函数返回值类型由( )决定。 A.return 语句后的表达式类型 B.定义函数时所指明的返回值类型 C.实参类型 D.调用函数类型 3.如果在一个函数的复合语句中定义了一个变量,以下说法正确的是( A.该变量只在该复合语句中有效 B.在该函数中有效 C.在本程序范围内均有效 D.非法变量. )。. 4.在一个 C 源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量, 则该变量需要使用的存储类别是( )。 A.extern B.register C.auto D.static 5.若函数形参为没有指定大小的一维数组,函数实参为一维数组名,则传递给函数的是 ( )。 A.实参数组大小 B.形参数组大小 C.实参数组首地址 D.实参数组元素的值 6.有函数定义 f(int a,float b){ ……},则以下对函数 f 的函数原型说明不正确的是( )。 A.f(int a,float b) B.f(int ,float) C.f(int s,float y) D.f(int s,float) 7.若使用一维数组名作函数实参,则以下说法正确的是( ) 。 A.必须在主调函数中说明此数组的大小 B.实参数组类型与形参数组类型可以不匹配 C.在被调函数中,不需要考虑形参数组的大小 D.实参数组名与形参数组名必须一致 8.以下程序的正确运行结果是( )。 #include <stdio.h>.

(36) C 语言程序设计实验与习题指导. 80. void num() {extern int x,y;int a=15,b=10; x=a-b; y=a+b; } int x,y; main() { int a=7,b=5; x=a+b; y=a-b; num(); printf("%d,%d\n",x,y); }. A.12,2 C.5,25. B.不确定 D.1,12. 9.以下程序的正确运行结果是(. )。. main() {int a=2,I; for (I=0;I<3;I++) printf("4%d",f(a)); } f(int a) { int b=0; static int c=3; b++; c++; return(a+b+c); }. A.7 7 7 C.7 9 11 10.以下程序的正确运行结果是(. B.7 10 13 D.7 8 9 ) 。. #include<stdio.h> main() { int k=4,m=1,p; p=func(k,m);printf("%d,",p); p=func(k,m);printf("%d\n",p); } func(int a,int b) { static int m=0,i=2; i+=m+1; m=i+a+b; return(m); }. A.8,17. B.8,16. C.8,20. D.8,8.

(37) 第二部分 例题解析与习题. 81. 二、填空题 1.C 语言函数参数传递方式有 ① 和 ② 。 2.在 C 语言中,一个函数一般由两个部分组成,它们是 3.以下程序的运行结果是_________。. ①. 和. ②. 。. #include <stdio.h> main() { int a=1,b=2,c; c=max(a,b); printf("max is %d\n",c); } max(int x, int y) { int z; z=(x>y)? x:y; return(z); }. 4.以下程序的功能是根据输入的“y”(“Y”)与 “n”(“N”),在屏幕上分别显示出“This is YES.”与“This is NO.”。请填空。 #include <stdio.h> void YesNo(char ch) { switch(ch) { case'y': case'Y':printf("\nThis is YES.\n"); case'n': case'N': printf("\nThis is NO.\n") } }. ②. ;. main() {char ch; printf("\nEnter a char 'y','Y',or'n','N'"); ch= ① ; printf("ch:%c",ch); YesNo(ch); }. 5.以下 Check 函数的功能是对 value 中的值进行四舍五入计算,若计算后的值与 ponse 值相等,则显示“WELL DONE!!”,否则显示计算后的值。已有函数调用语句 Check (ponse,value),请填空。 Void Check(int ponse,float value) {int val; val= ① ; printf("计算后的值:%d",val); if( ② ) printf("\n WELL DONE!!!\n"); else printf("\nSorry the correct is %d\n",val); }.

(38) C 语言程序设计实验与习题指导. 82. 6.已有函数 pow,现要求取消变量 i 后 pow 函数的功能不变。请填空。 修改前的 pow 函数 pow(int x,int y) {int i,j=1; for(i=1;i<=y:++i) j=j*x; return(j); }. 修改后的 pow 函数 pow(int x,int y) {int j; for( ① ; j=j*x; return(j); }. ②. ;. ③. ). 三、程序设计题 1.写一个判断素数的函数,在主函数中输入一个数,输出是否是素数的消息。 2.写一个函数,使输入的一个字符串反序存放,在主函数中输入输出字符串。 3.写一个函数,使一个二维数组(3*3)转置。. 第8章. 编译预处理. 8.1 例题解析 【例 1】以下程序的输出结果是(. )。. #define MCRA(m) 2*m #define MCRB(n,m) 2*MCRA(n)+m main() {int i=2;j=3; printf("%d\n",MCRB(j,MCRA(i))); }. 【解析】本题考查带参宏定义及宏的嵌套使用。在进行宏替换时,首先将“MCRA(i)”替 换为“2*i”,然后将“MCRB(j,2*i)”替换为“2*2*j+2*i”,最终输出结果为 16。 【答案】16 【例 2】下列程序执行后输出结果是()。 #define MA(x) x*(x-1) main() {int a=1,b=2;printf("%d\n",MA(1+a+b));}. A.6 B.8 C.10 D.12 【解析】本题考查带参宏替换。替换过程是:先使用实参“1+a+b”替换宏定义的形参 x, 即变为“1+a+b*(1+a+b-1)”,再用它替换 MA(1+a+b),计算结果为 8。 【答案】B 【例 3】下列程序运行结果是( )。 #define. N. n.

(39) 第二部分 例题解析与习题. 83. main() { char a=N;printf("%d",a);}. A.n B.N C.语法错误 D.不确定 【解析】宏替换后,语句“char a=N;”变为“char a=n;”。这样一条语句在语法上是不 正确,所以编译不成功。 【答案】C 【例 4】程序中头文件 type1.h 内容是: #define N #define M1. 5; N*3. 程序如下: #include "type1.h" #define M2 N*2 main() {int i;i=M1+M2;printf("%d\n",i); }. 程序编译后运行输出结果是( )。 A.10 B.20 C.25 D.30 【解析】本题考查文件包含及宏替换。在预处理时,用 type1.h 文件中内容去替换 “#include "type1.h"”行,然后进行宏替换,“M1+M2”被替换为“5*3+5*2”,结果是 25。 【答案】C 8.2 练习题 一、选择题 1.以下叙述中不正确的是( )。 A.预处理命令行都必须以“#”号开始 B.在程序中凡是以“#”号开始的语句行都是预处理命令行 C.C 程序在执行过程中对预处理命令行进行处理 D.以下是正确的宏定义 #define. IBM-PC. 2.C 语言的编译系统对宏命令的处理是( )。 A.在程序运行时进行的 B.在程序连接时进行的 C.和 C 程序中的其他语句同时进行编译的 D.和源程序中的其他语句同时进行编译的 3.以下在任何情况下计算平方数时都不会引起二义性的宏定义是( A.#define POWER(x)x*x B.#define POWER(x)(x)*(x) C.#define POWER(x)(x*x) D.#define POWER(x)((x)*(x)) 4.C 语言提供的预处理功能包括条件编译,其基本形式为:. ) 。.

(40) C 语言程序设计实验与习题指导. 84. #XXX 标识符 程序段 1 #else 程序段 2 #endif 这里 XXX 可以是( ) 。 A.define 或 include C.ifdef 或 ifndef 或 define 5.以下程序输出结果是( ) 。. B.ifdef 或 include D.ifdef 或 ifndef 或. if. #define M(x,y,z) x*y*z main() {int a=1,b=2,c=3; printf("%d\n",M(a+b,b+c,c+a)); }. A.19 6.请读程序:. B.17. C.15. D.12. C.sum=12. D.sum=18. C.100. D.150. #define ADD(x) x+x main() { int m=1,n=2,k=3; int sum=ADD(m+n)*k; printf("sum=%d",sum); }. 上面程序的运行结果是( ) 。 A.sum=9 B.sum=10 )。. 7.以下程序的运行结果是(. #define MIN(x,y) (x)<(y)?(x):(y) main() {int i=10,j=15,k; k=10*MIN(i,j); printf("%d\n",k); }. A.10 8.若有宏定义如下: #define #define #define. B.15 X Y Z. 5 X+1 Y*X/2. 则执行以下 printf 语句后,输出结果是(. )。. int a;a=Y; printf("%d\n",Z); printf("%d\n",--a);. A.7 6. B.12 6. C.12 5. D.7 5.

(41) 第二部分 例题解析与习题. 9.对下面程序段 #define A 3 #define B(a) ((A+1)*a) x=3*(A+B(7));. 正确的判断是( ) 。 A.程序错误,不允许嵌套宏定义 B.x=93 C.x=21 D.程序错误,宏定义不允许有参数 10.请读程序 #define LETTER 0 main() {char str[20]="C Language",c; int i; i=0; while((c=str[i]!='\0') {i++; #if LETTER if(c>='a'&&c<='Z') c=c-32; #else if(c>='A'&&c<='Z') c=c+32; #endif printf("%c",c); } }. 上面程序的运行结果是( ) 。 A.C Language C.C LANGUAGE 二、填空题 1.设有以下宏定义:#define WIDTH 80. B.c language D.c LANGUAGE. #define LENGTH WIDTH+40 则执行赋值语句:v=LENGTH*20;(v 为 int 型变量)后,v 的值是________。 2.下面程序运行结果是________。 #define DOUBLE(r) r*r main() {int x=1,y=2,t; t=DOUBLE(x+y); printf("%d\n",t); }. 3.下面程序的运行结果是________。 #define MUL(z). (z)*(z). 85.

(42) C 语言程序设计实验与习题指导. 86. main() { printf("%d\n",MUL(1+2)+3); }. 4.下面程序的运行结果是________。 #define POWER(x) ((x)*(x)) main() { int i=1; while(i<=4)printf("%d\t",POWER(i++)); printf("\n"); }. 5.下面程序的运行结果是________。 #define MAX(a,b,c) ((a)>(b)? ((a)>(c)? (a):(c) ):((b)>(c)?(b):(c))) main() {int x,y,z; x =l; y=2; z=3; printf("%d,",MAX(x,y,z)); printf("%d,",MAX(x+y,y, y+x)); printf("%d、n",MAX(x,y+z,z)); }. 6.设有以下宏定义: #define MYSWAP(z,x,y) {z=x;x=y;y=z;}. 以下程序段通过宏调用实现变量 a,b 内容的交换,请填空。 float a=5,b=16,c; MYSWAP(__ __,a,b). 第9章. 指针. 9.1 例题解析 【例 1】对于类型相同的指针变量,不能进行哪种运算? A.+ B.-C.= D== 【解析】当类型相同的两个指针变量进行运算时,加法运算并无实际意义。故选 A。 【例 2】设有下面的语句和说明,则下列叙述正确的是________。 char s[]="china"; char *p;p=s;. A.s 和 p 完全相同 B.数组 s 中的内容和指针变量 p 中的内容相同 C.s 数组长度和 p 所指向的字符串长度相同 D.*p 和 s[0]相同 【答案】D 【例 3】若已定义 char s[10];则下列表达式中不能表示 s[1]的地址的是________。 A.s+1 B.S++ C.&s[0]+1 D.&s[1].

(43) 第二部分 例题解析与习题. 【答案】B 【例 4】下面说明不正确的是________。 A.char a[10]="china" C.char *a;a="china";. 87. B.char a[10],*p=a;p="china"; D.char a[10],*p;p=a="china";. 【答案】D 【例 5】若有以下定义,则对 a 数组元素的正确引用是________。 int a[5],*p=a;. A.*&a[5]. B.a+2. C.*(p+5). D.*(a+2). 【答案】D 【例 6】若有以下定义,则*(p+5)表示________。 int a[10],*p=a;. A.元素 a[5]的地址 B.元素 a[5]的值 C.元素 a[6]的地址 D.元素 a[6]的值 【答案】B 【例 7】若有以下定义,则 p+5 表示________。 int a[10],*p=a;. A.元素 a[5]的地址 C.元素 a[6]的地址 【答案】A 【例 8】设有以下程序段:. B.元素 a[5]的值 D.元素 a[6]的值. char str[4][10]={"first","second","third","fouth"},*strp[4]; int n; for(n=0;n<4;n++) strp[n]=str[n];. 若 k 为 int 型变量且 0<=k<4,则对字符串的不正确引用的是________。 A.strp B.str[k] C.strp[k] D.*strp 【答案】A 【例 9】若有函数 max(a,b),并且已使函数指针变量 p 指向函数 max,当调用该函数时。 正确的调用方法是________。 A.(*p)max(a,b) B.*pmax(a,b) C.(*p)(a,b) D.*p(a,b) 【答案】C 【例 10】若已定义 int (*p)();指针 p 可以________。 A.代表函数的返回值 B.指向函数的入口地址 C.表示函数的类型 D.表示函数返回值的类型 【答案】B 9.2 练习题 一、选择题 1.以下程序有错,错误的原因是( main() {int *p,i;char *q,ch;. ) 。.

(44) C 语言程序设计实验与习题指导. 88 p=&i; q=&ch; *p=40; *p=*q; … }. A.p 和 q 的类型不一致,不能执行*p=*q;语句 B.*p 中存放的是地址值,因此不能执行*p=40;语句 C.q 没有指向具体的存储单元,所以*q 没有实际意义 D.q 虽然指向了具体的存储单元,但该单元中没有确定的值,所以不能执行*p=*q;语句 2.已有定义 int k=2;int *ptr1,*ptr2;且 ptr1 和 ptr2 均已指向变量 k,下面不能正确执行的 赋值语句是( )。 A.k=*ptr1+*ptr2; B.ptr2=k; C.p1=*p2; D.*p1=p2; 3.变量的指针,其含义是指该变量的( )。 A.值 B.地址 C.名 D.一个标志 4.若已定义 int a=5;下面对①、②两个语句的正确解释是( ) 。 ①int *p=&a; ②*p=a; A.语句①和②中的 *p 含义相同,都表示给指针变量 p 赋值 B.①和②语句的执行结果,都是把变量 a 的地址值赋给指针变量 p C.①在对 p 进行说明的同时进行初始化,使 p 指向 a;②将变量 a 的值赋给指针变量 p D.①在对 p 进行说明的同时进行初始化,使 p 指向 a;②将变量 a 的值赋于*p 5.若有语句 int *point,a=4;和 point=&a; 下面均代表地址的一组选项是( )。 A.a,point,*&a B.&*a,&a,* point C.*&point,*point,&a D.&a,&*point,point 6.以下程序输出的结果是( )。 void main() { int a=5,*p1,**p2; p1=&a,p2=&p1; (*p1)++; printf("%d\n",**p2); }. A.5 B.4 C.6 7.若有说明:int *p,m=5,n; 以下正确的程序段是( )。 A.p=&n; B.p=&n; scanf("%d",&p); C.scanf("%d",&n);. D.不确定. scanf("%d",*p); D.p=&n;. *p=n; *p=m 8.若有说明:int *p1,*p2,m=5,n;以下均是正确赋值语句的选项是( )。 A.p1=&m;p2=&p1; B.p1=&m;p2=&n;*p1=*p2; C.p1=&m;p2=p1 D.p1=&m;*p2=*p1;.

(45) 第二部分 例题解析与习题. (. 89. 9.已有变量定义和函数调用语句:int a=25; print_value(&a);下面函数的正确输出结果是 )。 void print_value(int *t) { print("%d\n",++*x);}. A.23. B.24. C.25. D.26. 10.下面判断正确的是( ) 。 A.char * a="china";等价于 char *a;*a="china"; B.char str[10]={ "china"};等价于 char str[10];str[]={"china"}; C.char *s="china"; 等价于 char *s; s="china"; D.char c[4]= "abc",d[4]= "abc"; 等价于 char c[4]=d[4]= "abc"; 11.设 char *s="\ta\017bc"; 则指针变量 s 指向的字符串所占的字节数是( A.9 B.5 C.6 D.7 12.下面程序段中,for 循环的执行次数是( )。 char *s="\ta\018bc"; for ( ;*s! ='\0';s++). A.9. )。. printf("*");. B.5. C.6. D.7. 13.下面能正确进行字符串赋值操作的是( ) 。 A.char s[5]={"ABCDE"}; B.char s[5]={'A', B','C','D','E'}; C.char *s; s="ABCDE"; D.char *s; scanf("%s",s); 14.下面程序段的运行结果是(. )。. char *s="abcde"; s+=2; printf("%d",s);. A.cde C.字符'c'的地址. B.字符'c' D.无确定的输出结果. 15.设 p1 和 p2 是指向同一个字符串的指针变量,c 为字符变量,则以下不能正确执行的 赋值语句是( )。 A.c=*p1+p2; B.p2=c C.p1=p2 D.c=*p1*(*p2); 16.设有下面的程序段: char s[]="china"; char *p; p=s;. 则下列叙述正确的是( )。 A.s 和 p 完全相同 B.数组 s 中的内容和指针变量 p 中的内容相等 C.s 数组长度和 p 所指向的字符串长度相等 D.*p 与 s[0]相等 二、填空题 1.与 int *q[5];等价的定义语句是________。 2.下面程序段的运行结果是________。 char s[20]="abcd"; char *p=s; p++;.

(46) C 语言程序设计实验与习题指导. 90 puts(strcat(p,"ABCD"));. 3.下面程序段的运行结果是________。 char str[]="abc\0def\0gji",*p=str; printf("%s",p+5);. 4.下面程序段中,for 循环的执行次数是________。 char *s="\ta\018bc"; for ( ; *s! ='\0';s++) printf("*");. 5.下面程序的输出是________。 main() {int a[]={2,4,6},*ptr=&a[0],x=8,y,z; for(y=0;y<3;y++) z=(*ptr+y)<x?*(ptr+y):x; printf("%d\n",z);. 6.以下程序能找出数组 x 中的最大值和该值所在的元素下标,该数组元素从键盘输入。 请选择填空。 main() {int x[10], *p1, *p2,k; for(k=0;k<10;k++) scanf("%d",x+k); for(p1=x,p2=x;p1-x<10;p1++) if(*p1>*p2) p2= ① ; printf("MAX=%d,INDEX=%d\n",*p2, }. ②. );. 7.下列程序的输出结果是________。 main() {int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int (*p)[4]=a,i,j,k=0; for(i=0;i<3;i++) for(j=0;j<2;j++) k=k+*(*(p+i)+j); printf("%d\n",k); }. 8.下列程序的输出结果是________。 main() {char ch[2][5]={"6934","8254"},*p[2]; int i,j,s=0; for(i=0;i<2;i++) p[i]=ch[i]; for(i=0;i<2;i++) for(j=0;p[i][j]>'\0'&&p[i][j]<='9';j+=2) s=10*s+p[i][j]-'0'; printf("%d\n",s); }. 9.下面程序是把从终端读入的一行字符作为字符串放在字符数组中,然后输出。请填空。 #include <stdio.h>.

參考文獻

相關文件

也就是設定好間隔時間(time slice)。所有的 程序放在新進先出的佇列裡面,首先CPU

• 提供程序性指導 程序性指導 程序性指導 程序性指導(procedural facilitation),而非實 質性指導(substantive

當任何人發現有需要更改 專案原先計畫時,都要經 過一定的程序,才可以更 改。這個程序,稱為變更 控制流程 (change control p rocess).. 8-1

C-C-6 用一般語言及數學語言說明解題的過程 C-C-8 能尊重他人解決數學問題的多元想法 C-E-4 能評析解法的優缺點.

上述定理, 即 Dini, Lipschitz, Dirichlet 判别法, 给出函数能展开成 Fourier 级数的充分条件... 下面罗列几个例子,

衡量一个地区或一个国家水资源的丰歉 程度的指标:

下面我们将用 这一点将一元函数的 Taylor 展开推广到多元函数.. 我们希望借助此给出多元函数

一般说来, 对于一个区间上单调的函数的 图形都存在一个需要判别弧段位于相应的弦线