1、二级 C 语言笔试-301 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:70.00)1.下列叙述中正确的是( )。(分数:2.00)A.C 程序由函数组成B.C 程序由主函数构成C.C 程序由函数和过程构成D.在 C 程序中无论是整数还是实数,都可以正确无误的表示出来2.数据库 DB、数据库系统 DBS、数据库管理系统 DBMS 之间的关系是( )。(分数:2.00)A.DB 包括 DBS 和 DBMSB.DBMS 包括 DB 和 DBSC.DBS 包括 DB 和 DBMSD.没有任何关系3.下列语句段中,正确的是( )。(分数:2.00)A.stre
2、etint x;float y;int a2;unsigned b3;char name 10;B.struct stuunsigned a3;unsigned b4;x;int *p=C.stmct stuint a;float x4;y=1,1.0;float data=y.x;D.struct ndint a,b;unsigned c2=5;4.下列程序的输出结果是( )。main()int a=1,b=2;printf(“%d,%d/n“,-a,+b);(分数:2.00)A.1,2B.1,3C.0,2D.0,35.下列变量声明合法的是( )。(分数:2.00)A.short a=1.4
3、e-1;B.double b=1+3e2.8;C.long do=0xfdaL;D.float2_aaa=1e-3;6.设变量已正确定义,则下列能正确计算 f=n!的程序段是( )。(分数:2.00)A.f=0;for(i=1 ;i=n;i+ +) f*=i;B.f=1;for(i=1;in;i+ +) f*=i;C.f=1;for(i=n;i1;i+ +)f*=i;D.f=1;for(i=n;i=2;i-)f*=i;7.下列程序执行的输出结果是( )。#includestdio.hmain()char a24;strcpy(a,“are“);strcpy(a1,“you“);a03=prin
4、tf(“%s/n“,(分数:2.00)A.;A) ar8.设有定义下列:int a=1,b=2,c=3,d=4,m=2,n=2;则表达式(m=ab)t=*x,*x=*y;*y=t;main( )int a8=1,2,3,4,5,6,7,8,i,*p,*q;p=a;q=while(pq)f(p,q); p+ +; q-;for (i=0;i8;i+) printf(“%d,“,ai);(分数:1.00)A.8,2,3,4,5,6,7,1B.5,6,7,8,1,2,3,4C.1,2,3,4,5,6,7,8D.8,7,6,5,4,3,2,115.运行下列程序,若从键盘输入字母“a”,则输出结果是(
5、)。char c;c=getchar();if(c=aelse if(c=gelse printf(“input error!/n“);putchar(c);(分数:1.00)A.fB.tC.eD.d16.结构化程序设计主要强调的是( )。(分数:1.00)A.程序的规模B.程序的效率C.程序设计语言的先进性D.程序的易读性17.简单的交换排序方法是( )。(分数:1.00)A.快速排序B.选择排序C.堆排序D.冒泡排序18.在 C 语言中,函数调用时( )。(分数:1.00)A.实参和形参各占独立的存储单元B.实参和形参共用存储单元C.由系统自动确定实参和形参是否共用存储单元D.由用户指定实
6、参和形参是否共用存储单元19.下列程序的输出结果是( )。#includestdio.hmain()int i;for(i=1 ;i=10; i+)if(i*i=20)printf(“%d/n“,i*i);(分数:1.00)A.49B.36C.25D.6420.有下列程序main()int t, a=1, b=5, c=-2;while(abc)t=a; a=b; b=t; c+;printf(“%d, %d, %d“, a, b, c);程序输出的结果是( )。(分数:1.00)A.1, 5, 0B.1, 5, -2C.5, 1, -1D.5, 1, -221.执行下列程序段后,变量 a,b
7、,c 的值分别是( )。int x=5,y=4;int a,b,c;a=(-x=y+)?x:+y;b=+x;c=y;(分数:2.00)A.a=5, b=5, c=5B.a=4, b=5, c=5C.a=5, b=6, c=5D.a=1, b=5, c=622.下列叙述中正确的是( )。(分数:2.00)A.在面向对象的程序设计中,各个对象之间具有密切的关系B.在面向对象的程序设计中,各个对象都是公用的C.在面向对象的程序设计中,各个对象之间相对独立,相互依赖性小D.上述 3 种说法都不对23.对两个数组 a 和 b 进行下列初始化:char m=“1234567“;char n= 1,2,3,
8、4,5,6,7;则下列叙述正确的是( )。(分数:2.00)A.数组 m 与数组 n 完全相同B.数组 m 与数组 n 长度相同C.数组 m 比数组 n 长 1D.数组 m 与数组 n 中都存放字符串24.设有定义:int n1=0,n2,*p=,下列赋值语句中与 n2=n1; 语句等价的是( )。(分数:2.00)A.*p=*q;B.p=q;C.*p=D.p=*q;25.按照“先进先出”组织数据的数据结构是( )。(分数:2.00)A.队列B.栈C.双向链表D.二叉树26.若有下列定义(设 int 类型变量占 2 个字节):floatx=123.4567;则下列语句:printf(“x=%5
9、.2f“,x);输出的结果是( )。(分数:2.00)A.x=123.46B.123.4567C.x=123.4567D.123.4627.下列程序的输出结果是( )。#includestdio.hmain()char a= a,b,c,d,e,f,/0;int i,j;i=sizeof((分数:2.00)A.;char s2=“ABC“;strcpy(s1,s2);printf(“%d“,strlen(s1);(分数:2.00)A.3B.4C.6D.533.有下列二叉树,对此二叉树前序遍历的结果为( )。(分数:2.00)A.XZCYABB.XYZABCC.XYABCZD.XYAZBC34.
10、下列叙述中正确的是( )。(分数:2.00)A.线性链表的各元素在存储空间中的位置必须是连续的B.线性链表的头元素一定存储在其他元素的前面C.线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面D.线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的35.一个源文件中的外部变量的作用域为( )。(分数:2.00)A.本文件的全部范围B.本程序的全部范围C.本函数的全部范围D.从定义该变量的位置开始到本文件结束36.下列程序的运行结果是( )。#includestdio.h#define ADD(x) x+xmain()int m=1
11、,n=2,k=3;int s=ADD(m+n)*k;printf(“s=%d“,s);(分数:2.00)A.sum=18B.sum=10C.sum=9D.sum=2537.若执行下列的程序时,从键盘上输入 1 和 2,则输出结果是( )。#includestdio.hmain()int a,b,s;scanf(“%d%d“,s=a;if(ab) s=b;S=S*S,printf(“%d/n“,s);(分数:2.00)A.1B.4C.2D.938.若有定义 float a=25,b,*p=, 则下列对赋值语句*p=a;和 p=的正确解释为( )。(分数:2.00)A.两个语句都是将变量 a 的值
12、赋予变量 pB.*p=a 是使 p 指向变量 a,而 p=int func(int*(分数:2.00)A.if(ab)if(b0) c=0;else c+;printf(“%d/n“,c);(分数:2.00)填空项 1:_49.下列程序的循环次数是_。x=2;dox=x*x;while(!x);(分数:2.00)填空项 1:_50.下列程序段的运行结果是_。int x=0,y=0;while(x15) y+,x+=+y;pfintf(“%d,%d“,y,x);(分数:2.00)填空项 1:_51.下列程序的运行结果是_。main()int s=0,i=1;while(s= 10)s=s+i*i
13、;i+;printf(“%d“,-i);(分数:2.00)填空项 1:_52.下列程序的输出结果是_。long fun5(int n)( long s;if(n=l)(n=2)s=2;elses=n+fun5(n-1);return(s);main()long x;x=fun5(4);printf(%1d/n“,x);(分数:2.00)填空项 1:_53.下列程序的输出结果是_。main()int a=2,b=4,c=6;int*p1=*(p=printf(“%d/n“,c);(分数:2.00)填空项 1:_54.下列程序运行后的输出的结果是_。#includestdio.hmain()cha
14、r s20;scanf(“%s“,s);printf(“%s“,s);运行程序,输入 HOW ARE YOU。(分数:2.00)填空项 1:_55.下列程序的运行结果是_。#define POW(r) (r)*(r)main()int x=3,y=2,t;t=POW(x+y);printf(“%d/n“,t);(分数:2.00)填空项 1:_二级 C 语言笔试-301 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:70.00)1.下列叙述中正确的是( )。(分数:2.00)A.C 程序由函数组成 B.C 程序由主函数构成C.C 程序由函数和过程构成D.在
15、C 程序中无论是整数还是实数,都可以正确无误的表示出来解析:解析 本题涉及 C 语言最基本的两个知识点:C 程序是由函数构成的,有且仅有一个主函数,也可以有其他的函数;整数在允许的范围内可以准确无误的表示出来,但计算机的存储能力有限,不能表示无限精度的实数。2.数据库 DB、数据库系统 DBS、数据库管理系统 DBMS 之间的关系是( )。(分数:2.00)A.DB 包括 DBS 和 DBMSB.DBMS 包括 DB 和 DBSC.DBS 包括 DB 和 DBMS D.没有任何关系解析:解析 数据库系统(DBS)由数据库(DBS)、数据库管理系统(DBMS)、数据库管理员、硬件平台和软件平台
16、5 个部分组成,可见 DB 和 DBMS 都是 DBS 的组成部分。3.下列语句段中,正确的是( )。(分数:2.00)A.streetint x;float y;int a2;unsigned b3;char name 10; B.struct stuunsigned a3;unsigned b4;x;int *p=C.stmct stuint a;float x4;y=1,1.0;float data=y.x;D.struct ndint a,b;unsigned c2=5;解析:解析 本题主要考查的知识点是结构类型的概念和定义,结构定义的一般形式是:struct 结构类型名称 数据类型
17、成员名 1;数据类型 成员名 2; 数据类型 成员名 n;struct 为关键字,是结构的标识符:中包围的是组成该结构的成员项;每个成员的数据类型既可以是简单的数据类型,也可以是复杂的数据类型。整个定义作为一个完整的语句,用分号结束。结构类型名称是可以省略的,此时定义的结构称为无名结构。4.下列程序的输出结果是( )。main()int a=1,b=2;printf(“%d,%d/n“,-a,+b);(分数:2.00)A.1,2B.1,3C.0,2D.0,3 解析:解析 本题主要考查自加(+)、自减(-)运算符的使用。“+i,-i”在使用 i 之前,先使 i 的值加 1 或者减 1,然后再使用
18、 i 此时的值参与运算;“i+,i-”是在使用 i 参与表达式运算之后,再使 i的值加 1 或者减 1。本题中-a 和+b 是先执行 a 减 1 和 b 加 1 操作,再输出表达式的值。5.下列变量声明合法的是( )。(分数:2.00)A.short a=1.4e-1; B.double b=1+3e2.8;C.long do=0xfdaL;D.float2_aaa=1e-3;解析:解析 解答本题需了解 3 个知识点:标识符是由字母、数字或下画线组成,并且它的第一个字符必须是字母或者下画线;do 是 C 语言中的一个关键字,不能再用做变量名和函数名;C 语言规定指数形式的实型常量 e 或 E
19、后面的指数必须是整数。6.设变量已正确定义,则下列能正确计算 f=n!的程序段是( )。(分数:2.00)A.f=0;for(i=1 ;i=n;i+ +) f*=i;B.f=1;for(i=1;in;i+ +) f*=i;C.f=1;for(i=n;i1;i+ +)f*=i;D.f=1;for(i=n;i=2;i-)f*=i; 解析:解析 要正确计算函数 f=n!,由 n!的数学定义可知 n!=n*(n-1)*(n-2)*1。在选项 A)中,由于 f 的初值为 0,在 for 循环语句中, f 依次乘以 1,2,3,n。最后计算 f=n!=O,所以选项 A)不正确。在选项 B)中,f 的初值为
20、 1,在 for 循环语句中,f 依次乘以 1,2,3,(n-1)。最后计算得到 f=(n-1)!,所以选项 B)不正确。在选项 C)中,f 的初值为 1,在 for 循环语句中,f 依次乘以n,n+1, n+2,所以选项 C)不正确。在选项 D)中,f 的初值为 1,在 for 循环语句中,f 依次乘以n,n-1,n-2,2。最后计算 f=n!,所以选项 D)正确。7.下列程序执行的输出结果是( )。#includestdio.hmain()char a24;strcpy(a,“are“);strcpy(a1,“you“);a03=printf(“%s/n“,(分数:2.00)A.;A) a
21、r 解析:解析 strcpy(a,“are“)中数组名 a 代表数组首地址的地址常量,该操作把 are 复制到 a 中,aO3=t=*x,*x=*y;*y=t;main( )int a8=1,2,3,4,5,6,7,8,i,*p,*q;p=a;q=while(pq)f(p,q); p+ +; q-;for (i=0;i8;i+) printf(“%d,“,ai);(分数:1.00)A.8,2,3,4,5,6,7,1B.5,6,7,8,1,2,3,4C.1,2,3,4,5,6,7,8D.8,7,6,5,4,3,2,1 解析:解析 函数 f()的功能是对两个数据互换。在主函数中指针变量 p 和 q
22、 分别指向数组 a8的首和尾,在 while 循环中实现从首尾开始数组元素的互换操作。15.运行下列程序,若从键盘输入字母“a”,则输出结果是( )。char c;c=getchar();if(c=aelse if(c=gelse printf(“input error!/n“);putchar(c);(分数:1.00)A.fB.tC.e D.d解析:解析 首先,getchar 函数通过键盘读入字符a,即 c=a,(其实 c 得到的是字符 a 的 ASCII 码值),然后判断 if 语句的控制条件,发现a=afor(i=1 ;i=10; i+)if(i*i=20)printf(“%d/n“,i
23、*i);(分数:1.00)A.49B.36C.25 D.64解析:解析 本题考查 if 语句。当执行到第一个满足(i*i=20)while(abc)t=a; a=b; b=t; c+;printf(“%d, %d, %d“, a, b, c);程序输出的结果是( )。(分数:1.00)A.1, 5, 0 B.1, 5, -2C.5, 1, -1D.5, 1, -2解析:解析 本题考查 while 循环。先判断 while 循环的控制表达式是否成亢,发现 abc 不成立,所以不执行循环。直接输出 a、b、c 的值。21.执行下列程序段后,变量 a,b,c 的值分别是( )。int x=5,y=4
24、;int a,b,c;a=(-x=y+)?x:+y;b=+x;c=y;(分数:2.00)A.a=5, b=5, c=5B.a=4, b=5, c=5 C.a=5, b=6, c=5D.a=1, b=5, c=6解析:解析 本题考查自加(+),自减(-)运算符的使用。“+i,-i”,在使用 i 之前,先使 i 的值加 1 或者减 1,再使用此时的表达式的值参与运算:“i+,i-”,先使用此时的 i 的值参与运算,在使用 i 之后,再使 i 的值加 1 或者减 1。对于第 1 个表达式-x=4,y+=4两者相等,-x=y+为真,所以 a=x=4,执行完此语句后 y 的值是 5。第 2 个表达式 b
25、=+x,x 的值先加 1,然后赋给 b,即 b=x+1=5;第一个表达式 c=y=5。22.下列叙述中正确的是( )。(分数:2.00)A.在面向对象的程序设计中,各个对象之间具有密切的关系B.在面向对象的程序设计中,各个对象都是公用的C.在面向对象的程序设计中,各个对象之间相对独立,相互依赖性小 D.上述 3 种说法都不对解析:解析 面向对象的程序设计是用对象模拟问题领域中的实体,各对象之间相对独立,相互依赖性小,通过消息来实现对象之间的相互联系。23.对两个数组 a 和 b 进行下列初始化:char m=“1234567“;char n= 1,2,3,4,5,6,7;则下列叙述正确的是(
26、)。(分数:2.00)A.数组 m 与数组 n 完全相同B.数组 m 与数组 n 长度相同C.数组 m 比数组 n 长 1 D.数组 m 与数组 n 中都存放字符串解析:解析 本题考查字符数组和字符串赋值给数组的些区别。语句“char m=“1234567;”定义了一个字符型数组并进行了初始化,C 语言规定,在字符串的末尾自动加上串结束标记,/0,因此数组 m 的长度是 8;而数组 n 是按照字符方式对数组进行初始化,系统不会自动加上串结束标记0,因此数组 n 的长度是 7。24.设有定义:int n1=0,n2,*p=,下列赋值语句中与 n2=n1; 语句等价的是( )。(分数:2.00)A
27、.*p=*q; B.p=q;C.*p=D.p=*q;解析:解析 在定义指针变量 p 和 q 时,分别把变量 n2 和 n1 的地址赋给了指针变量 p 和 q,所以*p 和*q 中内容就分别是变量 n2 和 n1 的值,所以语句*p=*q 与语句 n2=n1 等价。因此选项 A)正确。25.按照“先进先出”组织数据的数据结构是( )。(分数:2.00)A.队列 B.栈C.双向链表D.二叉树解析:解析 队列是一种特殊的线性表,只允许在表的一端插入元素,在表的另一端删除元素,插入元素的一端叫“队尾”,删除元素的一端叫“队头”,先插入的元素先被删除,是按“先进先出”的原则组织数据的。26.若有下列定义
28、(设 int 类型变量占 2 个字节):floatx=123.4567;则下列语句:printf(“x=%5.2f“,x);输出的结果是( )。(分数:2.00)A.x=123.46 B.123.4567C.x=123.4567D.123.46解析:解析 本题考查 printf 函数的格式。“%5.2f”格式符中的“f”表示以带小数点的形式输出单精度或者双精度数:“5”表示指定数据输出宽度为 5;“.2”表示指定输出数据小数位占 2 位数,并对截去的第一位小数做四舍五入处理。27.下列程序的输出结果是( )。#includestdio.hmain()char a= a,b,c,d,e,f,/0
29、;int i,j;i=sizeof((分数:2.00)A.;char s2=“ABC“;strcpy(s1,s2);printf(“%d“,strlen(s1);(分数:2.00)A.3 B.4C.6D.5解析:解析 头文件string.h是字符串处理函数对应的头文件,要想调用 C 语言的库函数时,都要在程序中嵌入该函数对应的头文件,否则无法使用库函数。strcpy(s1,s2)把 s2 中的字符串复制到 s1 中,所以结果就为 s2 的长度。33.有下列二叉树,对此二叉树前序遍历的结果为( )。(分数:2.00)A.XZCYABB.XYZABCC.XYABCZD.XYAZBC 解析:解析 对
30、二叉树的前序遍历是指;先访问根结点,然后访问左子树,最后访问右子树,并且,在访问左、右子树时,先访问根结点,再依次访问其左、右子树。34.下列叙述中正确的是( )。(分数:2.00)A.线性链表的各元素在存储空间中的位置必须是连续的B.线性链表的头元素一定存储在其他元素的前面C.线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面D.线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的 解析:解析 在线性链表中,各元素在存储空间中的位置是任意的,各元素的顺序也是任意的,依靠指针来实现数据元素的前后件关系。35.一个源文件中的外部变量
31、的作用域为( )。(分数:2.00)A.本文件的全部范围B.本程序的全部范围C.本函数的全部范围D.从定义该变量的位置开始到本文件结束 解析:解析 一个源文件中的外部变量的作用域是从定义该变量的位置开始到本文件结束。36.下列程序的运行结果是( )。#includestdio.h#define ADD(x) x+xmain()int m=1,n=2,k=3;int s=ADD(m+n)*k;printf(“s=%d“,s);(分数:2.00)A.sum=18B.sum=10 C.sum=9D.sum=25解析:解析 本题考查带参数的宏的定义及相关运算:s=m+n+m+n*k=1+2+1+2*3
32、=10。37.若执行下列的程序时,从键盘上输入 1 和 2,则输出结果是( )。#includestdio.hmain()int a,b,s;scanf(“%d%d“,s=a;if(ab) s=b;S=S*S,printf(“%d/n“,s);(分数:2.00)A.1B.4 C.2D.9解析:解析 本题考查 if 语句。scanf 函数通过键盘读入 a、b 的值,a=1,b=2。第一个 if 语句,先判断条件,发现 ab 条件成立,则 s=b=2, s=s*s=4。38.若有定义 float a=25,b,*p=, 则下列对赋值语句*p=a;和 p=的正确解释为( )。(分数:2.00)A.两
33、个语句都是将变量 a 的值赋予变量 pB.*p=a 是使 p 指向变量 a,而 p=int func(int*(分数:2.00)A.if(ab)if(b0) c=0;else c+;printf(“%d/n“,c);(分数:2.00)填空项 1:_ (正确答案:2)解析:解析 分析程序,a=2,b=-1,c=2 时,if 语句的表达式 ab 不成立,不再柱下判断,直接退出if 语句,执行后面的输出语句,程序结束。在这个程序中 a、b、c 的值没做任何改变。49.下列程序的循环次数是_。x=2;dox=x*x;while(!x);(分数:2.00)填空项 1:_ (正确答案:1)解析:解析 do
34、while 语句的功能是:首先执行循环体语句,然后检测循环控制条件表达式的值,若为真,则重复执行循环体语句,否则退出循环;dowhile 语句的特点是先执行后判断,因此循环体至少执行 1 次本程序中 x=2 不符合循环条件,所以只循环 1 次。50.下列程序段的运行结果是_。int x=0,y=0;while(x15) y+,x+=+y;pfintf(“%d,%d“,y,x);(分数:2.00)填空项 1:_ (正确答案:8,20)解析:解析 本题考查 while 循环和+运算符的运用。x=0 符合条件 x15,则执行 y+,x+=+y 后,y=1,x=0+2=2 后 y=2,符合条件继续循环
35、,y=3,x=x+4=6 后 y=4,再循环 y=5,x=x+6=6+6=12 后,y=6,继续循环 y=7,x=x+8=12+8=20,此时 y=8。51.下列程序的运行结果是_。main()int s=0,i=1;while(s= 10)s=s+i*i;i+;printf(“%d“,-i);(分数:2.00)填空项 1:_ (正确答案:3)解析:解析 分析程序运行过程,第 1 次循环:s=s+i*i=0+1*1=1,i=2;第 2 次循环:s=s+i*i=1+2*2=5,i=3;第 3 次循环:s=s+i*i=5+3*3=14, i=4;循环条件不成立输出 i,-i 使 i 的值减 1,轴
36、出结果为 3。52.下列程序的输出结果是_。long fun5(int n)( long s;if(n=l)(n=2)s=2;elses=n+fun5(n-1);return(s);main()long x;x=fun5(4);printf(%1d/n“,x);(分数:2.00)填空项 1:_ (正确答案:9)解析:解析 考查 if else 语句,n=4 不满足条件,所以 fun5(4)=4+fun5(3),n=3 也不满足条件,fun5(3)=3+fun5(2),n=2 满足条件 fun5(2)=2,故 x=4+3+2=9。53.下列程序的输出结果是_。main()int a=2,b=4,
37、c=6;int*p1=*(p=printf(“%d/n“,c);(分数:2.00)填空项 1:_ (正确答案:8)解析:解析 本程序定义了 3 个指针变量 p1、p2、p,并且将,、b 的地址分别赋给 P1、p2,则*p1=a=2,*p2=b=4,所以表达式*p1*(*p2)的值是 8。在赋值语句的左边是*(p=”是把整数 8 赋给了变量 c。54.下列程序运行后的输出的结果是_。#includestdio.hmain()char s20;scanf(“%s“,s);printf(“%s“,s);运行程序,输入 HOW ARE YOU。(分数:2.00)填空项 1:_ (正确答案:HOW)解析:解析 在 scanf()函数中,使用空格作为分隔符,如果输入含有空格的字符串,则不能使用scanf()函数,所以本题中输入空格就返回了/0, s 数组也就确定了,后面的输入就不再读入数组 s 中。55.下列程序的运行结果是_。#define POW(r) (r)*(r)main()int x=3,y=2,t;t=POW(x+y);printf(“%d/n“,t);(分数:2.00)填空项 1:_ (正确答案:25)解析:解析 本题考查带参数的宏的定义及相关运算。运算过程为:t=POW(x+y)=(2+3)*(2+3)=25。