1、二级 C语言笔试-306 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:50,分数:60.00)1.以下程序运行后,输出结果是( )。main()int y=18,i=0,j,a8;doaiy2;i+;y=y/2;while(y=1);for(j=i-1;j=0;j-)printf(“%d“,aj);printf(“/n“);(分数:1.00)A.1000B.10010C.00110D.101002.下列叙述中正确的是( )。(分数:1.00)A.用 E-R图能够表示实体集之间一对一的联系、一对多的联系、多对多的联系B.用 E-R图只能表示实体集之间一对一的联系C.
2、用 E-R图只能表示实体集之间一对多的联系D.用 E-R图表示的概念数据模型只能转换为关系数据模型3.若有如下程序:main()iht a34=l,2,3,4,5,6,7,8,9);printf(“%d%d%d/n“,a02,a13,a23);则程序运行后的输出结果是( )。(分数:1.00)A.380B.480C.160D.不定值4.函数 fun的返回值是( )。fun(char *a,char *b)int num=0,n=0;while(*(a+num)!=/0)num+;while(bn) *(a+num)=bn;num+;n+; return num;(分数:1.00)A.字符串 a
3、的长度B.字符串 b的长度C.字符串 a和 b的长度之差D.字符串 a和 b的长度之和5.设有如下变量定义:double a= 3.500000;float b=2.5;int m=2,n=3;则表达式“(float)(m+n)/2+(int)a%(int)b”的值是( )。(分数:1.00)A.2.5B.3.5C.4.5D.表达式不正确6.已知函数定义如下,函数 abed的功能是( )。abcd(char *s1,char *s2)while(*s2+=*s1+); (分数:1.00)A.串复制B.求串长C.串比较D.串反向7.下面程序的输出结果是( )。#include “stdio.h“
4、fun (xint xint y=0;static int z=5;z=x+,y+;return(Z);main()int a=4,i,j;for(i=0;i2;i+)j=fun(a+);printf(“%d“,j);(分数:1.00)A.0B.3C.4D.58.设有下列二叉树:(分数:1.00)A.B.C.D.9.若 a、b、c1、c2、x、y 均是整型变量,则正确的 switch语句是( )。(分数:1.00)A.switch(a+b); casel:y=a+b;break;case0:y=a-b;break;B.switch(a*a+b*b)case 3:case 1:y=a+b;bre
5、ak;case 3:y=b-a;break;C.switch a case c1:y=a-b;break;case c2:x=a*d;break;default:x=a+b; D.switch(a-b)default:y=a*b;break;case 3:case 4:x=a+b;break;case 10:case 11:y=ab;break;10.设有定义语句:char b=/123;则变量 b包括( )。(分数:1.00)A.4个字符B.3个字符C.2个字符D.一个字符11.执行以下程序段时,输出结果为( )。double a;a=333.721568;printf(“%-62e/n“,
6、(分数:1.00)A.;A) 输出格式描述符的域宽不够,不能输出 B) 33.721568e+01C) 3.3e+02D) -3.312. (分数:1.00)A.B.C.D.13.在长度为 n的有序线性表中进行二分查找,需要的比较次数为( )。(分数:1.00)A.log2nB.nlog2nC.n/2D.(n+1)/214.执行以下程序后 i的值为( )。main()int x,i;for(i=l,x=1;i=36;i+)if(x=20) break;if(x%5=1)x+=5;continue; x-=5;)printf(“%d“,i);(分数:1.00)A.3B.4C.5D.615.下列正
7、确的转义字符是( )。(分数:1.00)A./1234B.057C./D./06016.设有如下定义:char*aa2=“abcd“,“ABCD“,则以下说法中正确的是( )。(分数:1.00)A.aa数组中元素的值分别是“abcd“,“ABCD“;B.aa是指针变量,它指向含有两个数组元素的字符型一维数组C.aa数组的两个元素分别存放的是含有 4个字符的一维字符数组的首地址D.aa数组的两个元素中各自存放了字符a和A的地址17.在模块化程序设计中,按功能划分模块的原则是( )。(分数:1.00)A.各模块的功能尽量单一,且各模块之间的联系尽量少B.各模块的功能尽量单一,且各模块之间的联系尽量
8、紧密C.各模块应包括尽量多的功能D.各模块应包括尽量多的输入输出操作18.关于下面的程序,正确的说法是( )。int a,i=1;while(i=0)scanf(“%d“,scanf(“%d“,if(n+10) printf(“%d/n“,n);else printf(“%d/n“,n-);20.以下程序的输出结果是( )。#includestdio.hmain()printf(“%d/n“,NULL); (分数:1.00)A.不确定的值(因变量无定义)B.0C.-1D.121.若有说明语句“int a;float b;”,以下输入语句正确的是( )。(分数:1.00)A.scanf(“%f%
9、f“,则以下对 x数组元素的正确引用形式是( )。(分数:1.00)A.x+2B.while循环执行的次数是( )。(分数:2.00)A.无限次B.有语法错,不能执行C.一次也不执行D.执行 1次43.下述程序段的执行结果是( )。#include stdio.hVoid main()int x;for(x=1;x=100;x+)if(+x%3=0)if(+x%4=0)if(+x%7=0)printf(“%d“,x);(分数:2.00)A.75B.76C.77D.8444.下列程序的功能是( )。main()static int s33=1,2,3,4,5,6,7,8,9,),m,n;for(
10、m=0;m3;m+)for(n=0;n=m;n+)printf(“%d“,smn);printf(“/n);(分数:2.00)A.输出 33矩阵的下三角的元素B.输出 33矩阵的上三角的元素C.输出 33矩阵的对角线上的元素D.输出 33矩阵的元素45.若有如下程序:float sub(int a,int b)return(a*b); main()int i=1,j=2,k=3;printf(“%4.0f/n“,sub(int)sub(k+j,j),k+i);则程序运行后的输出结果是( )。(分数:2.00)A.40B.32C.16.0D.编译出错46.下面程序的输出结果是( )。main()
11、int i=1,p;p=f(i,+i);printf(“%d“,p);int f(int a, int b)int C;if(ab) C=1;else if(a=b)C=0;else C=-1;return (C);(分数:2.00)A.-1B.0C.1D.247.软件需求分析阶段的工作,可以分为 4个方面:需求获取、需求分析、编写需求规格说明书以及( )。(分数:2.00)A.阶段性报告B.需求评审C.总结D.以上都不正确48.下列程序的输出结果是( )。struct abcint a, b, C; );main()struct abc s2=1,2,3,4,5,6;int t;t=S0a+
12、S1b;printf(“%d/n“,t);(分数:2.00)A.3B.4C.5D.649.关于语句“for(表达式 1;表达式 2;表达式 3)”,下面说法中错误的是( )。(分数:2.00)A.for语句中的三个表达式不可以同时省略B.for语句可以用于循环次数不确定的情况C.for语句中表达式 2可以是关系表达式或逻辑表达式D.for语句中表达式 1和表达式 3可以是逗号表达式50.设 x、y、t 均为 int型变量,则执行语句:x=y=3;t=+x|+y;后,y 的值为( )。(分数:2.00)A.不定值B.4C.3D.1二、填空题(总题数:17,分数:40.00)51.在长度为 n的线
13、性表中查找一个表中不存在的元素,需要的比较次数为 【1】 。(分数:2.00)填空项 1:_52.在面向对象的程序设计中,用来请求对象执行某一处理或回答某些信息的要求称为 【2】 。(分数:2.00)填空项 1:_53.在结构化分析方法中,用于描述系统中所用到的全部数据和文件的文档称为 【3】 。(分数:2.00)填空项 1:_54.在数据库的概念结构设计中,常用的描述工具是 【4】 。(分数:2.00)填空项 1:_55.在关系运算中, 【5】 运算是在给定关系的某些域上进行的运算。(分数:2.00)填空项 1:_56.以下程序段的输出结果是 【6】 。int i=9;printf(“%o/
14、n“,i);(分数:2.00)填空项 1:_57.有以下语句段int n1=10,n2=20;printf(“ 【7】 “,n1,n2);要求按以下格式输出 n1和 n2的值,每个输出行从第一列开始,请填空。n1=10n2=20(分数:2.00)填空项 1:_58.以下程序运行后的输出结果是 【8】 。main()int a=l,b=3,c=5;if(C=a+b)printf(“yes/n“);else printf(“no/n“);(分数:2.00)填空项 1:_59.下面程序是计算 100以内能被 4整除且个位数为 4的所有整数,请填空。main()int m,n;for(m=0; 【9】
15、 ;m+)n=m*10+4;if( 【10】 )Continue;printf(“%d/n“,n);(分数:4.00)填空项 1:_60.设 a、b、c 为整数,且 a=2、b=3、c=4,则执行完以下语句后,a 的值是 【11】 。a*=18+(b+)-(+c);(分数:2.00)填空项 1:_61.用复合的赋值运算符将变量 x中的值增大 2的赋值表达式是 【12】 。(分数:2.00)填空项 1:_62.若有如下程序:sub(int*y)while(-(*y);printf(“%d“,(*y)-);main()int x=10;sub(break;C.switch a case c1:y=
16、a-b;break;case c2:x=a*d;break;default:x=a+b; D.switch(a-b)default:y=a*b;break;case 3:case 4:x=a+b;break;case 10:case 11:y=ab;break;解析:解析 switch 语句后不能有分号,故选项 A错误;switch 语句中的常量不能在分支重复出现,故选项 B错误;选项 C中, switch 后的表达式必须要加括号,case 后的表达式必须是常量,故选项 C错误;因此只有选项 D正确。10.设有定义语句:char b=/123;则变量 b包括( )。(分数:1.00)A.4个字
17、符B.3个字符C.2个字符D.一个字符 解析:解析 /123 为转义字符,是一个字符常量,斜线后面的是八进制数,可以由 0开头,最多由 3个八进制数组成。它只代表一个字符,此八进制数就是这个字符的代码。语句 charb=/123是给字符变量赋初值,初值为一个字符。所以,选项 D符合题意。11.执行以下程序段时,输出结果为( )。double a;a=333.721568;printf(“%-62e/n“,(分数:1.00)A.;A) 输出格式描述符的域宽不够,不能输出 B) 33.721568e+01C) 3.3e+02D) -3.3解析:解析 格式输出符为 e,数据将按科学计数形式输出。-控
18、制数据左对齐。所以,选项 C正确。12. (分数:1.00)A.B.C. D.解析:解析 在该题中,x 的 n次方应该调用函数 pow(x,n)计算,故排除选项 A、B。在选项 D中,pow(n,x)的参数写反了,故选项 C正确。13.在长度为 n的有序线性表中进行二分查找,需要的比较次数为( )。(分数:1.00)A.log2n B.nlog2nC.n/2D.(n+1)/2解析:解析 在长度为 n的有序线性表中进行二分查找,需要的比较次数为 log2(下标)n。14.执行以下程序后 i的值为( )。main()int x,i;for(i=l,x=1;i=36;i+)if(x=20) brea
19、k;if(x%5=1)x+=5;continue; x-=5;)printf(“%d“,i);(分数:1.00)A.3B.4C.5 D.6解析:解析 第 1次循环执行情况如下:i=1,x=1,判断 i=36 为真执行循环体。x=1,判断 x=20 为假。判断 x%5=1为真,执行 x+=5;x 值为 6,执行 continue;跳过本次循环余下的语句,即不执行 X-=5:。执行 i+,i=2。第 2次循环执行情况如下:i=2,判断 i=36 为真执行循环体。x=6,判断 x=20 为假。判断 x%5=1为真,执行 x+=5:x 值为 11,执行 continue;跳过本次循环余下的语句,即不执
20、行 X-=5;。执行 i+,i=3。第 3次循环执行情况如下:i=3,判断 i=36 为真执行循环体。x=11,判断 x=20 为假。判断 x%5=1为真,执行 x+=5;x 值为 16,执行 continue;跳过本次循环余下的语句,即不执行 X-=5:。执行 i+,i=4。第 4次循环执行情况如下:i=4,判断 i=36 为真执行循环体。x=16,判断 x=20 为假。判断 x%5=l为真,执行 x+=5;x 值为 21,执行 continue;跳过本次循环余下的语句,即不执行 X-=5;。执行 i+,i=5。第 5次循环执行情况如下:i=5,判断 i=36 为真执行循环体。x=21,判断
21、 x=20 为真。执行 break;,跳出循环体,即结束循环。最后 i=5,选项 C正确。15.下列正确的转义字符是( )。(分数:1.00)A./1234B.057C./ D./060解析:解析 转义字符是要用/开头的,所以选项 B不是转义字符。开头的斜杠为单斜杠,所以选项 D不是转义字符。斜杠后面可跟 1至 3位八进制数,可以由 0开头:或以 x开头的 1至 2位十六进制数,因此选项 A是错误的。/为转义字符,为单引号字符,所以选项 C符合题意。16.设有如下定义:char*aa2=“abcd“,“ABCD“,则以下说法中正确的是( )。(分数:1.00)A.aa数组中元素的值分别是“ab
22、cd“,“ABCD“;B.aa是指针变量,它指向含有两个数组元素的字符型一维数组C.aa数组的两个元素分别存放的是含有 4个字符的一维字符数组的首地址 D.aa数组的两个元素中各自存放了字符a和A的地址解析:解析 aa 数组被定义为字符型指针数组,有两个元素,分别存放字符串“abcd“和“ABCD“的首地址。17.在模块化程序设计中,按功能划分模块的原则是( )。(分数:1.00)A.各模块的功能尽量单一,且各模块之间的联系尽量少 B.各模块的功能尽量单一,且各模块之间的联系尽量紧密C.各模块应包括尽量多的功能D.各模块应包括尽量多的输入输出操作解析:解析 模块化设计是指把一个大程序按人们能理
23、解的大小规模进行分解。划分模块的基本原则是使每个模块都易于理解。按照人类思维的特点,按功能来划分模块最为自然。在按功能划分模块时,要求各模块的功能尽量单一,各模块之间的联系尽量少。所以选项 B错误;选项 C错误;选项 D错误。18.关于下面的程序,正确的说法是( )。int a,i=1;while(i=0)scanf(“%d“,scanf(“%d“,if(n+10) printf(“%d/n“,n);else printf(“%d/n“,n-);解析:解析 程序的功能是从键盘输入一个整数,然后执行 if语句的条件表达式 n+10。表达式n+10,先执行 n10,后对 n加 1。程序中从键盘输入
24、的 n值为 9,910,判断的条件为真,然后 n加 1,即 n的值变为 10,程序执行后面的 printf语句输出 n的值为 10,所以,选项 B正确。20.以下程序的输出结果是( )。#includestdio.hmain()printf(“%d/n“,NULL); (分数:1.00)A.不确定的值(因变量无定义)B.0 C.-1D.1解析:解析 在 C语言中 NULL的 ASCII码值为 0,而输出函数要求以整形格式输出,故最后的输出数0。所以,选项 B正确。21.若有说明语句“int a;float b;”,以下输入语句正确的是( )。(分数:1.00)A.scanf(“%f%f“,则以
25、下对 x数组元素的正确引用形式是( )。(分数:1.00)A.x+2B.i2;i+)pi=chi;”是将字符串“6937“和“8254“的首地址分别赋给指针数组 p的两个元素。下面的 for循环嵌套是取二维字符数组 ch偶数列上的数字字符,将它们组成一个数。所以选项 D符合题意。30.在关系数据库中,用来表示实体之间联系的是( )。(分数:1.00)A.树结构B.网结构C.线性表D.二维表 解析:解析 关系模型是用二维表格数据来表示实体本身及其相互之间的联系。31.数据结构分为逻辑结构和存储结构,下列数据结构中不属于存储结构的是( )。(分数:1.00)A.线性链表B.二叉链表C.栈与队列 D
26、.循环队列解析:解析 线性链表是线性表的链式存储结构:二叉链表是二叉树的链式存储结构;栈与队列分别是特殊的线性表;循环队列是队列的一种顺序存储结构。可知,线性链表、二叉链表、循环队列均属于存储结构,而栈与队列属于逻辑结构。32.以下程序的输出结果是( )。int a=7,b,C;b=+a;C=a+;printf(“%d,%d,%d“,a,b,C);(分数:1.00)A.7,8,9B.7,9,9C.9,8,8 D.8,7,8解析:解析 语句“b=+a:”是先执行 a加 1,a 值为 8,再赋值给 b,b 值为 8。语句“b=a+;”是先使用 a的值,即对 c赋值,c 的值为 8,再执行 a加 1
27、,a 值为 9。所以,选项 C正确。33.设有以下定义:struck skint a;float b;data;int *p;若要使 p指向 data中的 a域,正确的赋值语句是( )。(分数:1.00)A.p=while循环执行的次数是( )。(分数:2.00)A.无限次 B.有语法错,不能执行C.一次也不执行D.执行 1次解析:解析 程序中,k 的初值为 0。执行 while后面小括号中的赋值表达式 k=1,则 k的值为 1,即整个表达式的值为真。所以执行循环体,执行语句“k+;”。因为 k进行自加,不再减小,没有值为 0的可能,即 while后面小括号中的赋值表达式的值一直为真,不能退出
28、循环,因此 while循环将无限次地执行下去,所以,选项 A正确。43.下述程序段的执行结果是( )。#include stdio.hVoid main()int x;for(x=1;x=100;x+)if(+x%3=0)if(+x%4=0)if(+x%7=0)printf(“%d“,x);(分数:2.00)A.75B.76C.77D.84 解析:解析 程序段的功能是找出 100以内能同时被 3、4、7 整除的数,只有选项 D符合题意。44.下列程序的功能是( )。main()static int s33=1,2,3,4,5,6,7,8,9,),m,n;for(m=0;m3;m+)for(n=
29、0;n=m;n+)printf(“%d“,smn);printf(“/n);(分数:2.00)A.输出 33矩阵的下三角的元素 B.输出 33矩阵的上三角的元素C.输出 33矩阵的对角线上的元素D.输出 33矩阵的元素解析:解析 本题使用了一个双重 for循环,外循环变量 m的变化范围是 02,而内循环变量 n的变化范围从 0m,所以执行循环体时(m,n)的值依次为(0,0),(1,0),(1,1),(2,0),(2,1),(2,2),故输出的是 33矩阵的下三角元素。所以应该选择 A。45.若有如下程序:float sub(int a,int b)return(a*b); main()int
30、 i=1,j=2,k=3;printf(“%4.0f/n“,sub(int)sub(k+j,j),k+i);则程序运行后的输出结果是( )。(分数:2.00)A.40 B.32C.16.0D.编译出错解析:解析 因为函数 sub()只是简单地返回两个参数的乘积,所以表达式 sub(int)sub(k+j,j),k+i)展开后就是:(int)(k+j) *j)*(k+i)=(3+2)*2)*(3+1)=10*4=40。所以程序运行后的输出结果是 40,应该选择 A。46.下面程序的输出结果是( )。main()int i=1,p;p=f(i,+i);printf(“%d“,p);int f(in
31、t a, int b)int C;if(ab) C=1;else if(a=b)C=0;else C=-1;return (C);(分数:2.00)A.-1B.0 C.1D.2解析:解析 执行“p=f(i,+i):”后 i的值为 2,所以 a和 b的值都为 2,则 c=0,选项 B正确。47.软件需求分析阶段的工作,可以分为 4个方面:需求获取、需求分析、编写需求规格说明书以及( )。(分数:2.00)A.阶段性报告B.需求评审 C.总结D.以上都不正确解析:解析 需求分析阶段有 4方面的工作:需求获取、需求分析、编写需求规格说明书和需求评审。48.下列程序的输出结果是( )。struct a
32、bcint a, b, C; );main()struct abc s2=1,2,3,4,5,6;int t;t=S0a+S1b;printf(“%d/n“,t);(分数:2.00)A.3B.4C.5D.6 解析:解析 street abc s2=1,2,3,4,5,6;定义了结构型数组 s,数组元素 s0和 s1都为结构 abc型。因此 s0.a的值为 1,s1.b 的值为 5,所以 t的值为 6,选项 D正确。49.关于语句“for(表达式 1;表达式 2;表达式 3)”,下面说法中错误的是( )。(分数:2.00)A.for语句中的三个表达式不可以同时省略 B.for语句可以用于循环次数
33、不确定的情况C.for语句中表达式 2可以是关系表达式或逻辑表达式D.for语句中表达式 1和表达式 3可以是逗号表达式解析:解析 for 语句中的 3个表达式可以同时省略,但两个;不能省略。所以选项 A的说法错误。50.设 x、y、t 均为 int型变量,则执行语句:x=y=3;t=+x|+y;后,y 的值为( )。(分数:2.00)A.不定值B.4C.3 D.1解析:解析 +高于=和|,=的优先级最低。而|为自左向右的结合性,因此先计算表达式+x 的值,x的初值为 3,3+1=4,4 为非零值,不必再计算|右侧表达式的值,即可得到整个逻辑表达式的值 1,+y没有做运算,仍为原值 3,所以,
34、选项 C正确。二、填空题(总题数:17,分数:40.00)51.在长度为 n的线性表中查找一个表中不存在的元素,需要的比较次数为 【1】 。(分数:2.00)填空项 1:_ (正确答案:n)解析:解析 在长度为 n的线性表中查找一个表中不存在的元素,需要的比较次数为 n。52.在面向对象的程序设计中,用来请求对象执行某一处理或回答某些信息的要求称为 【2】 。(分数:2.00)填空项 1:_ (正确答案:消息)解析:解析 消息是一个实例与另一个实例之间传递的信息,它请求对象执行某一处理或回答某一要求的信息,它统一了数据流和控制流。53.在结构化分析方法中,用于描述系统中所用到的全部数据和文件的
35、文档称为 【3】 。(分数:2.00)填空项 1:_ (正确答案:数据字典)解析:解析 在结构化分析方法中,用于描述系统中所用到的全部数据和文件的文档称为数据字典。54.在数据库的概念结构设计中,常用的描述工具是 【4】 。(分数:2.00)填空项 1:_ (正确答案:E-R 图)解析:解析 E-R 图是设计概念模型的有力工具。55.在关系运算中, 【5】 运算是在给定关系的某些域上进行的运算。(分数:2.00)填空项 1:_ (正确答案:投影)解析:解析 在关系运算中,投影运算是在给定关系的某些域上进行的运算。56.以下程序段的输出结果是 【6】 。int i=9;printf(“%o/n“
36、,i);(分数:2.00)填空项 1:_ (正确答案:11)解析:解析 本题中定义了一个整型变量 i并赋初值为 9,然后要求以八进制输出 i的值,9 的八进制表示为 11,所以最后输出的值为 11。57.有以下语句段int n1=10,n2=20;printf(“ 【7】 “,n1,n2);要求按以下格式输出 n1和 n2的值,每个输出行从第一列开始,请填空。n1=10n2=20(分数:2.00)填空项 1:_ (正确答案:n1=%d/nn2=%d/n 或 n1=%d/nn2=%d或 n1=%2d/nn2=%2d/n或n1=%2d/nn2=%2d)解析:解析 printf 函数有两种参数,格式
37、控制参数和输出项参数。其中格式控制参数由两种成分组成:格式说明和普通字符,普通字符将被简单地复制显示,格式说明项将引起一个输出参数项的转换与显示,它是由%引出并以一个类型描述符结束的字符串。本题中,n1=和 n2=就是普通字符,可以直接输出,因为n1,n2 为整数,所以格式说明项为%d,在每行输出结束时加转义字符/n 进行换行。58.以下程序运行后的输出结果是 【8】 。main()int a=l,b=3,c=5;if(C=a+b)printf(“yes/n“);else printf(“no/n“);(分数:2.00)填空项 1:_ (正确答案:yes)解析:解析 本题中,if 后面括号里的
38、表达式为 c=a+b为真(即 c=1+3=4为真),所以,执行printf(“yes/n“),最后输出 yes。59.下面程序是计算 100以内能被 4整除且个位数为 4的所有整数,请填空。main()int m,n;for(m=0; 【9】 ;m+)n=m*10+4;if( 【10】 )Continue;printf(“%d/n“,n);(分数:4.00)填空项 1:_ (正确答案:9 m=100 10 n%4=0)解析:解析 题目要求在 100以内,for 循环是控制数据搜索的范围为小于等于 100。题目要求被 4整除所以 if语句中的判断条件判断数据是否能被 4整除。60.设 a、b、c 为整数,且 a=2、b=3、c=4,则执行完以下语句后,a 的值是 【11】 。a*=18+(b+)-(+c);(分数:2.00)