1、二级 C 语言笔试-11 及答案解析(总分:100.00,做题时间:90 分钟)一、B选择题/B(总题数:40,分数:70.00)1.在数据流图中,带有箭头的线段表示的是( )。(分数:2.00)A.控制流B.数据流C.模块调用D.事件驱动2.执行以下语句段后,xy 的值是( )。 int*pt,xy; xy=200; pt=B.q1=k;C.q1=q2;D.k=*q1+*q2;15.设 x 和 y 都是 int 类型,且 x=1,y=2,则 printf(“%d%d“,x,y,(x,y)的输出结果是( )。(分数:1.00)A.1 2B.1 2 2C.1,2D.输出值不确定16.下列方法中,
2、不属于软件调试方法的是( )。(分数:1.00)A.回溯法B.强行排错法C.集成测试法D.原因排除法17.下列关于栈和队列的描述中,正确的是( )。(分数:1.00)A.栈是先进先出B.队列是先进后出C.队列允许在队头删除元素D.栈在栈顶删除元素18.在一棵二叉树上,第 5 层的结点数最多是( )。(分数:1.00)A.8B.9C.15D.1619.有下列程序段: typedef struct NODE int num;struct NODE*next; OLD; 下列叙述中正确的是( )。(分数:1.00)A.以上的说明形式非法B.NODE 是一个结构体类型C.OLD 是一个结构体类型D.O
3、LD 是一个结构体变量20.有以下程序 #includestdio.h main() int b33=0,1,2,0,1,2,0,1,2,i,j,t=0; for(i=0;i3;i+) for(j=2;j=i;j-)t+=bij; printf(“%d/n“,t); 程序运行后的输出结果是( )。(分数:1.00)A.4B.3C.8D.921.下列定义变量的语句中错误的是( )。(分数:2.00)A.int_int;B.double int_;C.char For;D.float US$;22.在数据库设计中,将 E-R 图转换成关系数据模型的过程属于( )。(分数:2.00)A.需求分析阶段
4、B.概念设计阶段C.逻辑设计阶段D.物理设计阶段23.有以下程序: #includestdio.h #define N 8 void fun(int*x,int i) *x=*(x+i)+1; main() int aN=1,2,3,4,5,6,7,8,i; fun(a,2); for(i=0;iN/2;i+) printf(“%d“,ai); printf(“/n“); 程序运行后的输出结果是( )。(分数:2.00)A.1 3 1 3B.3 2 3 4C.4 2 3 4D.1 2 3 424.有以下函数定义: int fun(double a,double b) return a*b; 若
5、以下选项中所用变量都已正确定义并赋值,错误的函数调用是( )。(分数:2.00)A.if(fun(x,y)B.z=fun(fun(x,y),fun(x,y);C.z=fun(fun(x,y)x,y);D.fun(x,y);25.下面函数的功能是( )。 sss(s,t) char*s,*t; while(*s); while(*t) *(s+)=*(t+); return s; (分数:2.00)A.将字符串 s 复制到字符串 t 中B.比较两个字符串的大小C.求字符串的长度D.将字符串 t 续接到字符串 s 中26.已知二叉树后序遍历序列是 CDABE,中序遍历序列是 CADEB,它的前序遍
6、历序列是( )。(分数:2.00)A.ABCDEB.ECABDC.EACDBD.CDEAB27.下列选项中,不属于模块间耦合的是( )。(分数:2.00)A.内容耦合B.异构耦合C.控制耦合D.数据耦合28.当 a=1、b=2、c=3、d=4 时,执行下面程序段后,x 的值是( )。 if(ab) if(cd)x=1; else if(ac) if(bd)x=2: else x=3: else x=6: else x=7:(分数:2.00)A.1B.6C.3D.229.下列特征中不是面向对象方法的主要特征的是( )。(分数:2.00)A.多态性B.标识惟一性C.封装性D.耦合性30.下面程序的
7、输出结果是( )。 #includestdio.h main() char a=a,b,c,d,f,g,*p; p=a; printf(“%c/n“,*p+4); (分数:2.00)A.aB.bC.eD.f31.下列程序的运行结果是( )。 #includestdio.h void sub(int*s,int*y) static int m=4: *y=sm; m-; void main() int a=1,2,3,4,5,k,x; printf(“/n“); for(k=0;k=4;k+) sub(a, switch(b%3) default:m+; case 0:m+;break; pri
8、ntf(“%d/n“,m);(分数:2.00)A.1B.2C.3D.437.定义如下变量和数组: int i,x33=1,2,3,4,5,6,7,8,9; 则下面语句的输出结果是( )。for(i=0;i3;i+)printf(“%d“,xi2-i);(分数:2.00)A.159B.147C.357D.36938.以下有关宏替换的叙述不正确的是( )。(分数:2.00)A.使用宏定义可以嵌套B.宏定义语句不进行语法检查C.双引号中出现的宏名不替换D.宏名必须用大写字母表示39.下列有关数据库的描述,正确的是( )。(分数:2.00)A.数据库设计是指设计数据库管理系统B.数据库技术的根本目标是
9、要解决数据共享的问题C.数据库是一个独立的系统,不需要操作系统的支持D.数据库系统中,数据的物理结构必须与逻辑结构一致40.有以下程序: #includestdio.h int b=3; int fun(int*k) b=*k+b;return(b); main() int a10=1,2,3,4,5,6,7,8,i; for(i=2;i4;i+)b=fun( printf(“%d/n“,Power2(i+j); (分数:2.00)填空项 1:_49.以下程序中,fun 函数的功能足求 3 行 4 列二维数组每行尢素中的最大值。请填空。 void fun(int,int,int(*)4,int
10、*); main() int a34=12,41,36,28,19,33,15,27,3,27,19,1,b3,i; fun(3,4,a,b); for(i=0;j3;i+)printf(“%4d“,bi); printf(“/n“); void fun(int m,int n,int ar4,int*br) int i,j,x; for(i=0;im;i+) x=ari0; for(j=0;jn;j+) if(_) x=arij; bri=x; (分数:2.00)填空项 1:_50.下面程序的功能是:输出 100 以内能被 4 整除且个位数为 8 的所有整数,请填空。 main() int
11、i,j; for(i=0=_;i+) j=i*10+8; if(j%4!=0)continue; printf(“%d“,j); (分数:2.00)填空项 1:_51.以下程序的输出结果是_。 #includestdio.h fun() static int a=0; a+=3;printf(“%d“,a); main() int cc; for(cc=1;cc5;cc+)fun(); printf(“/n“); (分数:2.00)填空项 1:_52.下面程序的运行结果是_。 #includestdio.h #define SIZE 12 main() char sSIZE;int i; fo
12、r(i=0;iSIZE;i+)si=A+i+32; sub(s,5,SIZE-1); for(i=0;iSIZE;i+)printf(“%c“,si); printf(“/n“); sub(char*a,int t1,int t2) char ch; while(t1t2) ch=*(a+t1); *(a+t1)=*(a+t2); *(a+t2)=ch; t1+;t2-; (分数:2.00)填空项 1:_53.下面程序的运行结果是_。 #includestdio.h main() char a80,*p=“AbabCDcd“; int i=0,j=0; while(*(p+)!=/0) if(
13、*p=aB.q1=k; C.q1=q2;D.k=*q1+*q2;解析:解析 本题考查指针变量的赋值操作。选项 A)是将指针 q1 和 q2 所指向的变量值相乘,然后赋给k;选项 B)中,float 型数据和指引型数据之间不能进行赋值运算;选项 C)中,是两个指针变量之间的赋值;选项 D)中,是两个指针型变量所指向的两个 int 型数据相加。15.设 x 和 y 都是 int 类型,且 x=1,y=2,则 printf(“%d%d“,x,y,(x,y)的输出结果是( )。(分数:1.00)A.1 2 B.1 2 2C.1,2D.输出值不确定解析:解析 本题考查 printf 函数的格式和逗号表达
14、式。printf 函数在输出时,是根据格式说明符的个数输出的,如果函数中有有多余的项将不予输出;如果有输出项少于格式说明符,则出错,不能输出正确的结果。 本题中逗号表达式(x,y)只返回 y 的值。此时格式说明的个数是 2,而输出项的个数是 3,因此 printf 函数只输出前两项。16.下列方法中,不属于软件调试方法的是( )。(分数:1.00)A.回溯法B.强行排错法C.集成测试法 D.原因排除法解析:解析 软件调试主要采用以以三种方法: 强行排错法:作为传统的调试方法,其过程可概括为设置断点、程序暂停、观察程序状态、继续运行程序。 回溯法:该方法适合于小规模程序的排错、即一旦发现了错误,
15、先分析错误征兆,确定最先发现“症状”的位置。 原因排除法:原因排除法是通过演绎和归纳,以及二分法来实现。17.下列关于栈和队列的描述中,正确的是( )。(分数:1.00)A.栈是先进先出B.队列是先进后出C.队列允许在队头删除元素D.栈在栈顶删除元素 解析:解析 栈实际也是线性表,只不过是一种特殊的线性表。栈是只能在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶,另一端勾栈底。队列是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做队头,允许插入的一端叫做队尾。18.在一棵二叉树上,第 5 层的结点数最多是( )。(分数:1.00)A.8B.9C.15D.16 解析
16、:解析 根据二叉树的性质:二叉树第 i(i1)层上至多有 2i-1个结点。得到第 5 层的结点数最多是 16 个。19.有下列程序段: typedef struct NODE int num;struct NODE*next; OLD; 下列叙述中正确的是( )。(分数:1.00)A.以上的说明形式非法B.NODE 是一个结构体类型C.OLD 是一个结构体类型 D.OLD 是一个结构体变量解析:解析 C 语言允许用 typedef 说明一种新类型名,其一般形式为:typedef 类型名 标识符。typedef 语句的作用仅仅是使“标识符”来代表已存在的“类型名”,并未产生新的数据类型。原有类型
17、名依然有效。此题中,用使 typedef 定义了新的类型 OLD 结构,所以 OLD 为结构体类型。20.有以下程序 #includestdio.h main() int b33=0,1,2,0,1,2,0,1,2,i,j,t=0; for(i=0;i3;i+) for(j=2;j=i;j-)t+=bij; printf(“%d/n“,t); 程序运行后的输出结果是( )。(分数:1.00)A.4B.3C.8 D.9解析:解析 这道题主要考查的是二维数组的有关知识。在两层 for 循环语句中,累加上三角元素,所以程序执行的过程为 t=b00+b01+b02+b1+b12+b22=8。21.下列
18、定义变量的语句中错误的是( )。(分数:2.00)A.int_int;B.double int_;C.char For;D.float US$; 解析:解析 C 语言规定,变量的标识符只能由字母、数字和下划线 3 种字符组成,且首字符必须为字母或下划线。在 C 语言中大写字母和小写字母被认为是两个不同字符。选项 A)定义的变量标识符 int 和选项 B)定义的变量标识符 int 与 C 语言的关键字 int 是不同的,是正确的变量标识。选项 C)定义的变量标识符 For 与 C 语言中的关键字 for 是两个不同的标识符,所以选项 C)是正确的,而选项 D)包含有特殊字符$,因而其不符合 C
19、语言的变量命名规定。22.在数据库设计中,将 E-R 图转换成关系数据模型的过程属于( )。(分数:2.00)A.需求分析阶段B.概念设计阶段C.逻辑设计阶段 D.物理设计阶段解析:解析 逻辑结构设计的任务:概念结构是各种数据模型的共同基础,为了能够用某一 DBMS 实现用户需求,还必须将概念结构进一步转化为相应的数据模型,这正是数据库逻辑结构设计所要完成的任务。它包捅从 E-R 图向关系模式转换和逻辑模式规范化及调整、实现。23.有以下程序: #includestdio.h #define N 8 void fun(int*x,int i) *x=*(x+i)+1; main() int a
20、N=1,2,3,4,5,6,7,8,i; fun(a,2); for(i=0;iN/2;i+) printf(“%d“,ai); printf(“/n“); 程序运行后的输出结果是( )。(分数:2.00)A.1 3 1 3B.3 2 3 4C.4 2 3 4 D.1 2 3 4解析:解析 函数 fun(int*x,int i)的功能是把数组元素 xi的值加 1 赋给 x0。所以在主函数中执行 fun(a,2)后,数组元数 a0的值等于 4。然后在 for 循环语句中,输出数组 a 中的前 4 个元素的值,分别是 4,2,3,4。24.有以下函数定义: int fun(double a,dou
21、ble b) return a*b; 若以下选项中所用变量都已正确定义并赋值,错误的函数调用是( )。(分数:2.00)A.if(fun(x,y)B.z=fun(fun(x,y),fun(x,y);C.z=fun(fun(x,y)x,y); D.fun(x,y);解析:解析 本题考查函数调用时的参数传递。选项 C)中第一个参数的表达式不正确,因此不能得到正确的结果。25.下面函数的功能是( )。 sss(s,t) char*s,*t; while(*s); while(*t) *(s+)=*(t+); return s; (分数:2.00)A.将字符串 s 复制到字符串 t 中B.比较两个字符
22、串的大小C.求字符串的长度D.将字符串 t 续接到字符串 s 中 解析:解析 本题考查指针变量的运用。本题中的函数数实质上是将字符串 t 续接到字符串 s 中。26.已知二叉树后序遍历序列是 CDABE,中序遍历序列是 CADEB,它的前序遍历序列是( )。(分数:2.00)A.ABCDEB.ECABDC.EACDB D.CDEAB解析:解析由于后序遍历的最后一个元素为 E,所以 E 为根结点,所以它的前序遍历的首个元素为 E,故排除 A)和 D)选项。由于中序遍历中,元素 B 在元索根结点 E 的后面,所以 B 为二叉树的右子树,并且该二叉树右子树只有一个元素,所以前序遍历的最后一个元素应为
23、 B,故选项 C)为正确选项,即该二叉树的前序遍历序列是 EACDB。27.下列选项中,不属于模块间耦合的是( )。(分数:2.00)A.内容耦合B.异构耦合 C.控制耦合D.数据耦合解析:解析 耦合可以分为下列几种,它们之间的耦合度由高到低排列: 内容耦合若一个模块直接访问另一模块的内容,则这两个模块称为内容耦合。 公共耦合若组模块都访问同一全局数据结构,则称为公共耦合。 外部耦合若一组模块都访问同一全局数据项,则称为外部耦合。 控制耦合若一模块明显地把开关量、名字等信息送入另一模块,控制另一模块的功能,则称为控制耦合。 标记耦合若两个以上的模块都需要其余某一数据结构的子结构时,不使用其余全
24、局变量的方式而全使用记录传递的方式,这样的耦合称为标记耦合。 数据耦合若一个模块访问另一个模块,被访问模块的输入和输出都是数据项参数,则这两个模块为数据耦合。 非直接耦合若两个模块没有直接关系,它们之间的联系完全是通过程序的控制和调用来实现的,则称这两个模块为非直接耦合,这样的耦合独立性最强。28.当 a=1、b=2、c=3、d=4 时,执行下面程序段后,x 的值是( )。 if(ab) if(cd)x=1; else if(ac) if(bd)x=2: else x=3: else x=6: else x=7:(分数:2.00)A.1 B.6C.3D.2解析:解析 本题考查的是 if-els
25、e 语句。第一个 if 语句,先判断条件,发现 ab 条件成立,执行下面的语句。第二个 if 语句,先判断条件,发现 cd 条件成立,执行下面的语句 x=1。29.下列特征中不是面向对象方法的主要特征的是( )。(分数:2.00)A.多态性B.标识惟一性C.封装性D.耦合性 解析:解析 面向对象设计方法与面向过程设计方法有本质的不同,其基本原理是:使用现实世界的概念抽象地思考问题从而自然地解决问题。其特点包括:标识惟一性、多态性、封装性、模块独立性、继承和多态性好。30.下面程序的输出结果是( )。 #includestdio.h main() char a=a,b,c,d,f,g,*p; p
26、=a; printf(“%c/n“,*p+4); (分数:2.00)A.aB.bC.e D.f解析:解析 “*”号的优先级比“+”的优先级高,所以先执行“*p”;指针 p 指向的是数组的首地址,因此*p=a,再加 4 得e。31.下列程序的运行结果是( )。 #includestdio.h void sub(int*s,int*y) static int m=4: *y=sm; m-; void main() int a=1,2,3,4,5,k,x; printf(“/n“); for(k=0;k=4;k+) sub(a, switch(b%3) default:m+; case 0:m+;b
27、reak; printf(“%d/n“,m);(分数:2.00)A.1B.2 C.3D.4解析:解析 本题考查 switch 语句。因为 a=8,a%4=0,所以执行 case 0 后面的语句,将 m 加 1,遇到break 语句跳出 switch。37.定义如下变量和数组: int i,x33=1,2,3,4,5,6,7,8,9; 则下面语句的输出结果是( )。for(i=0;i3;i+)printf(“%d“,xi2-i);(分数:2.00)A.159B.147C.357 D.369解析:解析 本题主要考查二维数组的使用。题中利用 for 循环来输出 x 数组中的指定元素:当 j=0时,输
28、出 x02=3;当 i=1 时,输出 x115;当 i=2 时。输出 x20=7。38.以下有关宏替换的叙述不正确的是( )。(分数:2.00)A.使用宏定义可以嵌套B.宏定义语句不进行语法检查C.双引号中出现的宏名不替换D.宏名必须用大写字母表示 解析:解析 本题考查宏替换的规则。宏替换有两类:简单的字符替换和带参数的宏替换。使用宏应注意:宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查:为了区别程序中其他的标示符,宏名的定义通常用大写字母,但不是必须用大写;双引号中出现的宏名不替换;使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。39.下列有关数据库的描述,正确的是( )。(分数
29、:2.00)A.数据库设计是指设计数据库管理系统B.数据库技术的根本目标是要解决数据共享的问题 C.数据库是一个独立的系统,不需要操作系统的支持D.数据库系统中,数据的物理结构必须与逻辑结构一致解析:解析 数据库设计的目的实质上是设计出满足实际应用需求的实际关系模型。数据库技术的主要目的是有效地管理和存取大量的数据资源,包括:提高数据的共享性,使多个用户能够同时访问数据库中的数据;减小数据的冗余,以提高数据的致性和完整性;提供数据与应用程序的独立性,从而减少应用程序的开发和维护代价。40.有以下程序: #includestdio.h int b=3; int fun(int*k) b=*k+b
30、;return(b); main() int a10=1,2,3,4,5,6,7,8,i; for(i=2;i4;i+)b=fun( printf(“%d/n“,Power2(i+j); (分数:2.00)填空项 1:_ (正确答案:62)解析:解析 本题考查的是宏定义。带参数的宏定义是按#indefine 命令行中指定的字符串从左到右进行转换。本题中替换的式子为:6+8*6+8,代入 i,j 的值得到 62。49.以下程序中,fun 函数的功能足求 3 行 4 列二维数组每行尢素中的最大值。请填空。 void fun(int,int,int(*)4,int*); main() int a34
31、=12,41,36,28,19,33,15,27,3,27,19,1,b3,i; fun(3,4,a,b); for(i=0;j3;i+)printf(“%4d“,bi); printf(“/n“); void fun(int m,int n,int ar4,int*br) int i,j,x; for(i=0;im;i+) x=ari0; for(j=0;jn;j+) if(_) x=arij; bri=x; (分数:2.00)填空项 1:_ (正确答案:xarij)解析:解析 本题考查的是循环的嵌套。本题定义了二维数组 a,存放 3 行 4 列的数组元素,定义了,一维数组 b 用于存放每行
32、的最大数。存函数 fun 中,通过二重 for 循环求每行的最大数,外层 for 循环用于控制行数,内层 for 循环用于控制列数。当外层循环执行一次时,内层循环则执行 4 次,并求出了这一行的最大值 x,最后将每一行求出最大值 x 赋值给存放最大值的数组 br,故本题答案为 xarij。50.下面程序的功能是:输出 100 以内能被 4 整除且个位数为 8 的所有整数,请填空。 main() int i,j; for(i=0=_;i+) j=i*10+8; if(j%4!=0)continue; printf(“%d“,j); (分数:2.00)填空项 1:_ (正确答案:i10)解析:解析
33、 分析程序:当(i=0,1,2,)时,“j=i*10+8”语句的运行结果是(8,18,28,)个位数字为 8 的所有整数;题中要求是 100 以内的整数,所以 i10;“if(j%4!=0)continue;”语句的功能是当条件不能被 4 整除时,继续循环不执行操作,直到能被 4 整除时输出该数,所以输出的数满足条件100 以内能被 4 整除且个位数为 8。51.以下程序的输出结果是_。 #includestdio.h fun() static int a=0; a+=3;printf(“%d“,a); main() int cc; for(cc=1;cc5;cc+)fun(); printf
34、(“/n“); (分数:2.00)填空项 1:_ (正确答案:3 6 9 12)解析:解析 本题考查最基本的 for 循环。for(cc=1;cc5;cc+)规定循环次数为 4 次,每次 a+=3,即每次 a 的值增加 3,但因为 fun 函数中变量 a 为 static 类型,所以每次调用完子函数之后,变量 a 所做的改变都要保存。52.下面程序的运行结果是_。 #includestdio.h #define SIZE 12 main() char sSIZE;int i; for(i=0;iSIZE;i+)si=A+i+32; sub(s,5,SIZE-1); for(i=0;iSIZE;
35、i+)printf(“%c“,si); printf(“/n“); sub(char*a,int t1,int t2) char ch; while(t1t2) ch=*(a+t1); *(a+t1)=*(a+t2); *(a+t2)=ch; t1+;t2-; (分数:2.00)填空项 1:_ (正确答案:abcdelkjihgf)解析:解析 本题先给字符型数组 s 的 12 个元素赋值 a 到 1 的 12 个字母,函数 sub(shar*a,int t1,int t2)的功能是将数组 a 的从第 t1+1 个元素到 t2+1 个元素进行逆置,在主函数中调用sub(s,5,SIZE-1)函数
36、,是将数组 s 的第 6 个元素到第 12 个元素进行逆置,其他元素位置不变。53.下面程序的运行结果是_。 #includestdio.h main() char a80,*p=“AbabCDcd“; int i=0,j=0; while(*(p+)!=/0) if(*p=a&*p=z)ai=*p;i+; ai=/0; puts(a);(分数:2.00)填空项 1:_ (正确答案:babcd)解析:解析 C 语言中“/0”表示字符串的结束。程序将 p 指针指向字符串“AbabCDcd”的首地址,循环开始后若指针不是指向当前字符串的结束标志位,则进入循环体。循环中每次检验字符串中字母是否在a与
37、z之间,若满足则将当前值赋值给数组 a,最后给数组添加字符结束标志。此程序可以筛选出字符串中的小写字母。54.“printf(“%d/n“,strlen(“/t/“/023/xAB/nC“);”语句的输出结果是_。(分数:2.00)填空项 1:_ (正确答案:6)解析:解析 strlen()函数的作用是计算字符串的长度并作为函数的返回值,这里的长度不包括串尾的结束标志/0。 /t是转义字符,代表横向跳若干格;/“是转义字符,代表双引号:/023也只代表一个字符,而不管转义字符后面有几个符;/xAB是以两位十六进制数 AB 表示的 ASCII 码字符,只代表一个字符;/n是转义字符,代表回车换行
38、。 题中语句中的字符串有 5 个字符常量各代表一个字符,再加上字母 C,所以返回的长度是 6。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。