1、二级 C 语言笔试-189 及答案解析(总分:110.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.有下列程序:main()int x=5;doprintf(“%d“,x-=4);while(!(-X);程序的输出结果是( )。(分数:2.00)A.1B.20C.1-4D.死循环2.下列特征中不是面向对象方法的主要特征的是( )。(分数:2.00)A.多态性B.继承C.封装性D.模块化3.下列选项中不会引起二义性的宏定义是( )。(分数:2.00)A.#define S(x)x*xB.#define S(x)(x)*(x)C.#define S(x)(x*x)D.
2、#define S(x)(x)*(x)4.若变量已正确定义,下列正确的程序段是( )。(分数:2.00)A.while(ch=getchar()=/N)putchar(ch);B.while(ch=getchar()=/n)putchar(ch);C.while(ch=getchar()!=/N)putchar(ch);D.while(ch=getchar()!=/n)putchar(ch);5.有下列二叉树,对此二叉树中序遍历的结果为( )。(分数:2.00)A.B.C.D.6.字符串“/“ABCDEF/“/“的长度是( )。(分数:2.00)A.15B.10C.7D.87.下列关于栈的描述
3、中错误的是( )。(分数:2.00)A.栈是先进先出的线性表B.栈只能顺序存储C.栈具有记忆作用D.对栈的插入与删除操作中,不需要改变栈底指针8.若有下列定义,则对 a 数组元素地址的正确引用是( )。int a5,*p=a;(分数:2.00)A.p+5B.*a+1C.break;case 1=m+;switch(b%2)defaut:m+;case0:m+;break;printf(“%d/n“,m);程序运行后的输出结果是( )。(分数:2.00)A.1B.2C.3D.412.表示关系 abc 的 C 语言表达式为( )。(分数:2.00)A.(a=b)”,则正确的输入语句是( )。(分数
4、:2.00)A.scanf(“%1f“,a);B.scanf(“%f“,”则对 a 数组的第 i 行第 j 列元素的正确引用为( )。(分数:2.00)A.*(*(a+i)+j)B.(a+i)jC.*(a+i+j)D.*(a+i)+j29.下列程序的输出结果是( )。#includestdio.h#includestring.hmain()char a=“/n123/“;printf(“%d,%d/n“,strlen((分数:2.00)A.,sizeof(a);30.有下列程序:#includestdio.hmain()char c1,c2,c3,c4,c5,c6;scanf(“%c%c%c%
5、c“,c6=getchar();putchar(c1);putchar(c2);printf(“%c%c/n“,c5,c6);程序运行后,若从键盘输入(从第 1 列开始):123CR45678CR则输出结果是( )。(分数:2.00)A.1267B.1256C.1278D.124531.定义下列结构体(联合)数组:struct Stchar name15;int age;a10=“ZHAO“,14,“WANG“,15,“LIU“,16,“ZHANG“,17;执行语句 printf(“%d,%c“,a2.age,*(a3.name+2)的输出结果为( )。(分数:2.00)A.15,AB.16,
6、HC.16,AD.17,H32.有下列程序:fun(int x)int p;if(x=0x=1)return(3);p=x-fun(x-2);return p;main()printf(“%d/n“,fun(7);执行后的输出结果是( )。(分数:2.00)A.7B.3C.2D.033.已有定义 int(*q)(),指针 q 可以( )。(分数:2.00)A.指向函数的入口地址B.代表函数的返回值C.表示函数的类型D.表示函数返回值的类型34.在 C 语言中,下列关于文件操作的叙述正确的是( )。(分数:2.00)A.对文件操作必须先关闭文件B.对文件操作必须先打开文件C.对文件操作顺序没有统
7、一规定D.以上全错35.若有下列说明和语句,则对结构体变量 st 中成员 i 的引用方式不正确的是( )。Struct stuint i;int name;st,*p;p=b=0;c=1;n=1;while(n=3)c=c*a;b=b+c;+n;printf(“b=%d“,b);(分数:2.00)填空项 1:_50.下列程序的输出结果是_。main()int i=0,a=0;while(i20)for(;)if(i%10)=0)break;else i-;i+=11;a+=i;printf(“%d/n“,a);(分数:2.00)填空项 1:_51.下列程序的运行结果是_。#includestd
8、io.hlong func(int x)long p;if(x=Ox=1)return(1);p=x*func(x-1);return(p);main()printf(“%d/n“,func(4);(分数:2.00)填空项 1:_52.下列程序将二维数组 a 的行和列元素互换后存放到另一个二维数组 b 中。请填空。main()int a23=1,2,3,4,5,b32,i,j;for(i=0;i2;i+)for(j=0;j3;j+)_;(分数:2.00)填空项 1:_53.下列程序的运行结果是_。#includestdio.hmain()int fun();fun();fun()static
9、int a4=1,2,3,4;int i;for(i=0;i4;i+)ai+=ai;for(i=0;i4;i+)printf(“%d,“,ai);printf(“/n“);(分数:2.00)填空项 1:_54.设有下列程序:#includestdio.h#includestring.hmain()int i;char s10,t10;gets(t);for(i=0;i2;i+)gets(s);if(strcmp(t,s)0)strcpy(t,s);printf(“%s/n“,t);程序运行后,从键盘上输入(CR代表回车符):DEFCRBADEPCRQTHRGCR,则程序的输出结果是_。(分数:
10、2.00)填空项 1:_55.下列程序的运行结果是_。#define P(a) printf(“%d“,a)main()int j,a=1,2,3,4,5,6,7,i=5;for(j=3;j1;j-)switch(j)case 1:case 2:P(ai+;break;case 3:P(a-i);(分数:2.00)填空项 1:_二级 C 语言笔试-189 答案解析(总分:110.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.有下列程序:main()int x=5;doprintf(“%d“,x-=4);while(!(-X);程序的输出结果是( )。(分数:2.0
11、0)A.1B.20C.1-4 D.死循环解析:解析 本题考查 dowhile 循环。执行 printf 语句,x=x-4=1,输出 1,判断 while 循环的控制条件, -x=0,则(!(-X)非零,循环条件成立,执行下一次循环;执行 printf 语句,x=x-4=-4,输出-4,判断 while 循环的控制条件,-X=-5,则(!(-x)为零,循环条件不成立,结束循环。2.下列特征中不是面向对象方法的主要特征的是( )。(分数:2.00)A.多态性B.继承C.封装性D.模块化 解析:解析 面向对象设计方法与面向过程设计方法有本质的不同,其基本原理是:使用现实世界的概念抽象地思考问题从而自
12、然地解决问题。其特点包括:分类性、多态性、封装性、模块独立性、继承和多态性等。模块化是结构化程序设计的特点。3.下列选项中不会引起二义性的宏定义是( )。(分数:2.00)A.#define S(x)x*xB.#define S(x)(x)*(x)C.#define S(x)(x*x)D.#define S(x)(x)*(x) 解析:解析 本题考查带参数的宏的替换。有些参数表达式必须加括号,否则,在实参表达式替换时,会出现错误。4.若变量已正确定义,下列正确的程序段是( )。(分数:2.00)A.while(ch=getchar()=/N)putchar(ch);B.while(ch=getc
13、har()=/n)putchar(ch);C.while(ch=getchar()!=/N)putchar(ch);D.while(ch=getchar()!=/n)putchar(ch); 解析:解析 本题考查两个知识点:C 语言用/n这个字符常量表示换行;函数 getchar()的作用是从终端输入一个字符,当遇到换行时结束输入。5.有下列二叉树,对此二叉树中序遍历的结果为( )。(分数:2.00)A.B. C.D.解析:解析 对二叉树的中序遍历是指首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,注意依旧按照“左子树根结点右子树”的顺序。本题的遍历顺序是这样的:首先访问左
14、子树: BDEY;在左子树 BDEY 中,也按中序遍历,先访问左子树 DY;在左子树 DY 中,也按中序遍历,先访问左子树,左子树没有,则访问根结点 D,然后访问右子树 Y;接着访问根 B,再访问右子树 E;访问左子树 BDEY 后,接着访问根结点 A,接着访问右子树 CFXZ;右子树 CFXZ 的访问顺序同理可得:FCZX。6.字符串“/“ABCDEF/“/“的长度是( )。(分数:2.00)A.15B.10 C.7D.8解析:解析 本题涉及字符串最基本的两个概念:字符串的长度是指字符串中字符的个数,但不包括字符串结束符;以反斜杠“/”开头的特殊字符序列,意思是把反斜杠后面的字符序列转换成特
15、定的含义,而不是原来的含义,不包含在字符串长度之内,“/”连同后面的字符为一个长度。7.下列关于栈的描述中错误的是( )。(分数:2.00)A.栈是先进先出的线性表B.栈只能顺序存储 C.栈具有记忆作用D.对栈的插入与删除操作中,不需要改变栈底指针解析:解析 栈是限定只能在表的一端进行插入和删除操作的线性表,入栈和出栈都是在栈顶进行,它们的操作特点是先进后出,因此具有记忆作用。栈可以采用顺序存储,也可以采用链式存储。8.若有下列定义,则对 a 数组元素地址的正确引用是( )。int a5,*p=a;(分数:2.00)A.p+5B.*a+1C.break;case 1=m+;switch(b%2
16、)defaut:m+;case0:m+;break;printf(“%d/n“,m);程序运行后的输出结果是( )。(分数:2.00)A.1B.2 C.3D.4解析:解析 本题考查 switch 语句。第一个 switch 语句,因为 a=6,a%2=0,所以执行 case0,将 m 加1,遇到 break 语句跳出 switch 语句,结束循环。12.表示关系 abc 的 C 语言表达式为( )。(分数:2.00)A.(a=b)”,则正确的输入语句是( )。(分数:2.00)A.scanf(“%1f“,a);B.scanf(“%f“,”则对 a 数组的第 i 行第 j 列元素的正确引用为(
17、)。(分数:2.00)A.*(*(a+i)+j) B.(a+i)jC.*(a+i+j)D.*(a+i)+j解析:解析 本题考查如何通过地址来引用数组元素。通过地址来引用数组元素的方法有 5 种:aij;*(ai+j);*(*(a+i)+j);*(ai)j;*(c6=getchar();putchar(c1);putchar(c2);printf(“%c%c/n“,c5,c6);程序运行后,若从键盘输入(从第 1 列开始):123CR45678CR则输出结果是( )。(分数:2.00)A.1267B.1256C.1278D.1245 解析:解析 当用 scanf 函数从键盘输入数据时,每行数据的
18、末尾按下回车键(Enter 键)之前,可以任意修改。但按下回车键 putchar(c1) (Enter 键)之后,scanf 函数即接受了这一行数据,不能再回去修改。所以本题中,当输入 123CR时,变量 c1、c2、c3 的值分别为 1、2、3,当输入 45678CR时,变量c5、c6 的值 4 和 5。所以用输出函数 putchar(c1)输出 1,putchar(c2)输出 2,printf(“%c%c/n“,c5,c6)输出 45。所以选项 D)为正确答案。31.定义下列结构体(联合)数组:struct Stchar name15;int age;a10=“ZHAO“,14,“WANG
19、“,15,“LIU“,16,“ZHANG“,17;执行语句 printf(“%d,%c“,a2.age,*(a3.name+2)的输出结果为( )。(分数:2.00)A.15,AB.16,HC.16,A D.17,H解析:解析 本题主要考查结构体数组。a2.age 为结构体 a2的 age 成员,即 16。a3.name 为指向结构体 a3的 name 成员的第一个元素的指针,即指向“Z”,(a3.name+2)将指针后移两位指向第三个元素“A”, *(a3.name+2)是取指针所指向地址的内容。32.有下列程序:fun(int x)int p;if(x=0x=1)return(3);p=x
20、-fun(x-2);return p;main()printf(“%d/n“,fun(7);执行后的输出结果是( )。(分数:2.00)A.7B.3C.2 D.0解析:解析 因为在函数 fun(int x)中,如果参数 x 等于 0 或 1 时,返回值 3。否则 p=x-fun(x-2)这是一个递归函数,所以在主函数调用 fun(7)时,其过程为:“fun(7)=7-fun(5)=7-(5-fun(3)=7-(5-(3-fun(1)=7-(5-(3-3)= 7-5=2”,所以最后的输出结果为 2。33.已有定义 int(*q)(),指针 q 可以( )。(分数:2.00)A.指向函数的入口地址
21、 B.代表函数的返回值C.表示函数的类型D.表示函数返回值的类型解析:解析 本题考查的是指向函数的指针。函数指针的定义方式:类型标识符(*指针变量名)()。其中,“类型标识符”为函数返回值的类型:“指针”指向函数的入口地址。34.在 C 语言中,下列关于文件操作的叙述正确的是( )。(分数:2.00)A.对文件操作必须先关闭文件B.对文件操作必须先打开文件 C.对文件操作顺序没有统一规定D.以上全错解析:解析 本题考查对文件的操作。文件打开后才可以对文件进行操作,使用结束后要关闭文件。对文件的操作都是顺序读写,即从文件的第一个数据开始,依次进行读写。35.若有下列说明和语句,则对结构体变量 s
22、t 中成员 i 的引用方式不正确的是( )。Struct stuint i;int name;st,*p;p=b=0;c=1;n=1;while(n=3)c=c*a;b=b+c;+n;printf(“b=%d“,b);(分数:2.00)填空项 1:_ (正确答案:b=14)解析:解析 分析程序可知,n 的初始值为 1,因此,while(n=3)循环 3 次。第 1 次:c=c*a=2;b=b+c=2; n=2。第 2 次:c=c*a=4;b=b+c=6;n=3。第 3 次:c=c*a=8;b=b+c=14。当 n=4 时,判断条件不满足,退出循环。50.下列程序的输出结果是_。main()in
23、t i=0,a=0;while(i20)for(;)if(i%10)=0)break;else i-;i+=11;a+=i;printf(“%d/n“,a);(分数:2.00)填空项 1:_ (正确答案:32)解析:解析 while(表达式)的功能是:首先计算表达式的值,若为真,则执行循环体语句,执行完毕,再计算表达式的值,若仍为真,则重复执行循环体语句,直到表达式的值为假时,结束 while 语句的执行,继续执行 while 语句后面的语句;i=0 时满足循环条件,也满足 if 的条件,执行语句得 i=11,a=11,第2 次循环不满足汀的条件,执行 i-,i=10,执行 i+=11;a+=
24、i 后,得 i=21,a=32,不满足 i20,循环结束。51.下列程序的运行结果是_。#includestdio.hlong func(int x)long p;if(x=Ox=1)return(1);p=x*func(x-1);return(p);main()printf(“%d/n“,func(4);(分数:2.00)填空项 1:_ (正确答案:24)解析:解析 本题考查函数的循环调用。p=x*func(x-1),当 x=4 时,不满足 if 语句的条件,p=4*func(3), x=3 也不满足条件,则 func(3)=3*func(2),func(2)=2*func(1),x=1 满
25、足条件 return(1),则输出结果为 4*3*2*1=24。52.下列程序将二维数组 a 的行和列元素互换后存放到另一个二维数组 b 中。请填空。main()int a23=1,2,3,4,5,b32,i,j;for(i=0;i2;i+)for(j=0;j3;j+)_;(分数:2.00)填空项 1:_ (正确答案:bji=aij)解析:解析 本题考查二维数组的基本知识。它是要将一个二维数组 a 的行和列元素互换后存放到另一个二维数组 b 中,只要将数组 a 的行标和列标互换,然后赋给数组 b 即可。53.下列程序的运行结果是_。#includestdio.hmain()int fun();
26、fun();fun()static int a4=1,2,3,4;int i;for(i=0;i4;i+)ai+=ai;for(i=0;i4;i+)printf(“%d,“,ai);printf(“/n“);(分数:2.00)填空项 1:_ (正确答案:2,4,6,8)解析:解析 子函数 fun()的功能是将数组 a 中的元素都自加一遍,然后仍然将结果存在原数组中,其实就是将数组 a 的每个元素都变为原来的 2 倍,然后输出。在主程序中首先通过 int fun()定义了子函数fun(),然后再调用 fun()。54.设有下列程序:#includestdio.h#includestring.hm
27、ain()int i;char s10,t10;gets(t);for(i=0;i2;i+)gets(s);if(strcmp(t,s)0)strcpy(t,s);printf(“%s/n“,t);程序运行后,从键盘上输入(CR代表回车符):DEFCRBADEPCRQTHRGCR,则程序的输出结果是_。(分数:2.00)填空项 1:_ (正确答案:QTHRG)解析:解析 函数 strcmp(t,s)用来比较 t 和 s 所指字符串的大小,若 ts,则函数值大于 0;若 t=s,则函数值等于 0;若 ts,则函数值小于 0。函数 strcpy(t,s)的功能:把字符数组 s 所指字符串的内容复制
28、到字符数组 t 所指存储空间中。本题中,t10=“CDEF“。第一次循环,s10=“BADEF“,if 语句的控制条件 strcmp(t,s)0 不成立,接着执行第二次循环,s=“QTHRG“,if 语句的控制条件 strcmp(t,s)0 成立,执行下列的语句,将字符数组 s 所指字符串的内容复制到字符数组 t 所指存储空间中,然后输出字符数组 t。55.下列程序的运行结果是_。#define P(a) printf(“%d“,a)main()int j,a=1,2,3,4,5,6,7,i=5;for(j=3;j1;j-)switch(j)case 1:case 2:P(ai+;break;case 3:P(a-i);(分数:2.00)填空项 1:_ (正确答案:5 5)解析:解析 分析程序执行过程,第一次循环时,j=3,i=5,因为 switch(3),所以执行 case 3,调用 P(a-i)=P(a4)=P(5),输出 5;第二次循环时,j=2,i=4,因为 switch(2),所以执行 case 2,调用P(ai+)= P(a4)=P(5),输出 5,之后 i 自加等于 5。