1、 9月全国计算机等级考试二级C语言笔试试题 一、选择题((1)—(10)、(21)—(40)每题2分,(11)—(20)每题1分,共70分) (1)下列数据结构中,属于非线性结构是(C) A)循环队列 B) 带链队列 C) 二叉树 D)带链栈 (2)下列数据结果中,可以根据“优异后出”标准存取数据是(B) A) 循环队列 B) 栈 C)队列 D)二叉树 (3)对于循环队列,下列叙述中对的是(D) A)队头指针是固定不变 B)队头指针一定大于队尾指针 C)队头指针一定小于队尾指针 D)队头指针可以大于队尾指针,也可以小于队尾指针
2、 (4)算法空间复杂度是指(A) A)算法在实行过程中所需要计算机存放空间 B)算法所解决数据量 C)算法程序中语句或指令条数 D)算法在实行过程中所需要临时工作单元数 (5)软件设计中划分模块一个准则是(B) A) 低内聚低耦合 B) 高内聚低耦合 C) 低内聚高耦合 D) 高内聚高耦合 (6)下列选项中不属于结构化程序设计标准是(A) A) 可封装 D) 自顶向下 C) 模块化 D) 逐步求精 (7)软件具体设计产生图以下: 该图是(C) A) N-S图 B) PAD图 C) 程序环节图 D) E-R图 (8)数据库管理系统是(B)
3、A)操作系统一部分 B) 在操作系统支持下系统软件 C) 一个编译系统 D) 一个操作系统 (9)在E-R图中,用来表达实体联络图形是(C) A) 椭圆图 B) 矩形 C) 菱形 D) 三角形 (10)有三个关系R,S和T以下: 其中关系T由关系R和S通过某种操作得到,该操作为(D) A) 选择 B) 投影 C) 交 D) 并 (11)以下叙述中对的是 A)程序设计任务就是编写程序代码并上机调试 B)程序设计任务就是拟定所用数据结构 C)程序设计任务就是拟定所用算法
4、D)以上三种说法所有不完整
解析:选D。原文见高教版二级教程P2,程序设计任务包含A、B、c及相关文档。
(12)以下选项中,能用作用户标记符是
A)void
B)8_8
C)_0_
D)unsigned
解析:选C。标记符由字母或下划线开头,关键字不能用作标记符。
A、D为关键字,B以数字开头,所以所有是错误。
(13)阅读以下程序
#include
5、d %f”,&case,&pjrintF); printf(“%d %f\n”,case,printF); } 该程序编译时产生错误,其犯错因素是 A)定义语句犯错,case是关键字,不能用作用户自定义标记符 B)定义语句犯错,printF不能用作用户自定义标记符 C)定义语句无错,scanf不能作为输入函数使用 D)定义语句无错,printf不能输出case值 解析:选A。case是关键字,关键字不能用作标记符。C语言关键字见教材附录。 (注:标记符区分大小写,printf是关键字,可用作标记符,当
6、然printF也可以) (14)表达式:(int)((double)9/2)-(9)%2值是 A)0 B)3 C)4 D)5 解析:选B。考点为运算符优先级。 括号>强制类型转换int>乘除>加减 (int)((double)9/2)一(9)%2=(int)(9.0/2)-(9)%2=(int)(4.5)-1=3 (15)若有定义语句:int x=10;,则表达式x-=x+x值为 A)-20 B)-10 C)0 D)10 解析:选B。考点为复合赋值运算符。(注意x+x作为一个整体
7、
x-=x+x→x=x-(x+x) →x=-x=-10
(16)有以下程序
#include
8、再输出。 b=a+b=l+0=1 a=2*b=2 17)设有定义:int a=1,b=2,c=3;,以下语句中实行效果和其它三个不同样是 A)if(a>b) c=a,a=b,b=c; B)if(a>b) {c=a,a=b,b=c;} C)if(a>b) c=a;a=b;b=c; D)if(a>b) {c=a;a=b;b=c;} 解析:选C。考点为if句和逗号表达式使用。 逗号运算符也称为顺序求值运算符,依次实行逗号表达式中每个表选式。逗号表达式是一个整体,复合语句也是一个整体,当a>b时,A、B、D中if后语句可以作为
9、整体被实行,把a、b值互换。C等价语句形式为:
if(a>b) c=a;
a=b;b=c; 不能实现a、b值互换。
(18)有以下程序
#include
10、n”,c); } 程序运营后输出结果是 A)3 B)5 C)7 D)9 解析:选A。考点为switch语句使用。 switch语句中case和default顺序可以任意,不影响程序结果。switch语句在循环中被实行2次。 k=l时, c+=k c=0+1=1 无break,继续实行 c++ c=2 有break,终止switch k=2时,c++ c=3 有break,终止switch ,循环结束,输出c。 (19)以下程序段中,和语句:k=a>b?(b>c
11、1:0):0;功效相同是 A)if((a>b)&&(b>c)) k=1; else k=0; B)if((a>b)||(b>c) k=1; else k=0; C)if(a<=b) k=0; else if(b<=c) k=1; D)if(a>b) k=1; else if(b>c) k=1; else k=0; 解析:选A。考点为条件表达式使用。 语句功效为: a>b且b>c时,k=l a>b且b<=e时,k=0 a<=b时,k=
12、0
符合语句功效只有A。
20)有以下程序
#include
13、\0是ASCII码值为0字符,也即数值0)程序功效为记录字符数组s中小写字符个数,n为计数器。
(21)有以下程序
#include
14、所以程序是输出退出while循环后k、n值。k++为先使用k值再增1。先使用k值,k=0,逻辑和结果为。,第一次实行while循环时条件就不成立,直接退出循环,k值增1,n值没有任何改变。 (22)有以下定义语句,编译时会出现编译错误是 A)char a=’a’; B)char a=’\n’; C)char a=’aa’; D)char a=’\x2d’; 解析:选C。考点为字符型变量赋值和基础概念。字符型为单引号括起一个字符。 A为标准字符型赋值方法, B为把一个转义字符赋值给字符变量,也是对的。 C为单引号括起两个字符,不符
15、合字符型定义。
D表面看上去是错误,其实是对的,也是一个转义字符。
‘/x2d’表达ASCII码值为16进制数2d字符,即‘-’号。
(23)有以下程序
#include
16、数据在内存中存放是字符ASCII码值,可以作为整型数据来解决。英文字符和数字在ASCII码表中是按顺序排列。 c1=‘A’+‘8'-‘4’=‘A’+‘4’=E c2=‘A’+‘8’-‘5’=‘A’+3=‘D’
(24)有以下程序
#include
17、程序运营后输出结果是 A)32 B)12 C)21 D)22 解析:选C。考点为函数参数传输。c语言中函数参数传输是值传输,是把实参值传给形参,是单向传输,形参改变不会影响到实参值。程序中,把实参a值传给形参p,p=1,然后p=d++,再次赋值后p=2.输出p值2。返回到主程序中,输出a值1。(形参p改变不会影响到实参a值,a值仍为1) (25)以下函数findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功效 #define MIN - int findmax (int x[],int n)
18、
{ int i,max;
for(i=0;i 19、当放在循环内,而应当放到for循环前面。先让max取最小整数,这么第1次循环时max就可以取得第1个数组元素值,然后在循环中把后面数组元素依次和max比较,让max取大值。
(26)有以下程序
#include 20、 C)2,1,2,1 D)2,1,1,2
解析:选B。考点为指针基础概念。
p、q为指针,初始化时p指向m,q指向n。实行r=p; p:q;q:r;后,p和q值互换,从而p指向n,q指向m。指针改变不会影响m、n值,最终*p和*q值为n、m值。
(27)若有定义语句:int a[4][10],*p,*q[4];且0≤i<4,则错误赋值是
A)p=a
B)q[i]=a[i]
C)p=a[i]
D)p=&a[2][1]
解析:选A。考点为指向二维数组指针使用方法。
p为基类型为int指针,指向一个整型数据,也就可咀 21、指向一个数组元素,所以D对的。 a是二维数组名,存放二维数组首地址,但二维数组名是一个行指针,其基类型为具有10个元素一维数组。所以A错误,两者基类型不一致(p+1指向下一个元素,而a+l指向二维数组下一行)。假如p定义为int(*p)[10],才可以赋值p=a。在C语言中,二维数组a[4][10]可以看做是由4个元素组成一维数组,这4个元素为a[0]、a[l]、a[2]、a[3],而其中每个元素又是由10个元素组成维数组。 在这里,a[i]也是一个数组名,可以表达一维数组首地址,但a[i]是一个列指针,基类型为int.指向一维数组第1个元素。同时,指针数组q每个数组元素q[i]基类型也为 22、int,所以p、a[i]、q[i]基类型一致,选项B、C是对的。
(28)有以下程序
#include 23、ne*Dream
D)10,One*World
解析:选C。考点为二维字符数组使用和strlen()函数使用。
初始化p=str[l]后,p指向第二个字符串“One*Dream!”。strlen()函数计算字符串长度时不包含结束标志,所以strlen(p)=10。
(29)有以下程序
#include 24、
{case 0:a[i]++;break;
case 1:a[i]--;
}break;
case 1:a[i[=0;
}
for(i=0;i<4;i++) printf(“%d”,a[i]); printf(“\n”);
}
A)3 3 4 4
B)2 0 5 0
C)3 0 4 0
D)0 3 0 4
解析:选C。考点为switch语句。
外部switch语句在循环中被实行4次。i=0时,实行case 0. 内部swit 25、ch语句也实行case 0, a[i]++ a[0]=3
i=1时,实行case 1,a[l]=0 排除法,只有C对的。
i=2时,实行case 0. 内部switch语句实行case 1. a[i]-- a[2]=4
i=3时,实行case 1,a[3]=0 最终依次输出为:3 0 4 0
(30)有以下程序
#include 26、}
程序运营后输出结果是
A)7,4 B)4,10 C)8,8 D)10,10
解析:选B。考点为strlen()函数和sizeof()运算符使用。
strlen()函数计算字符串长度时,碰到结束标志为止,且长度不包含结束标
志,所以strlen(a)=4,排除法选B。
sizeof()运算符操作数可以是类型名或变量名、数组名等,当操作数是数组名时,其结果是数组总字节数,所咀sizeof(a)=10。
(31)下面是相关C语言字符数组描述,其中错误是
A)不可以用赋值语句给字符数组名赋字符串
27、 B)可以用输入语句把字符串整体输入给字符数组
C)字符数组中内容不一定是字符串
D)字符数组只能存放字符串
解析:选D。考点为字符数组使用。
字符数组名是数组首地址,是常量,不能被重新赋值,所以A对的。可以用scanf(“%s”,str)对字符串整体输入,str可以是字符数组名或字符指针,所以B对的。C和D说法对立,肯定有一个对的,用排除法A、B选项主线不用看。字符数组所有元素可以只存放一般字符,不存放结束标志。所以D错误。
(32)下列函数功效是
fun(char * a,char * b)
{ while((*b=*a) 28、’\0’) {a++,b++;} }
A)将a所指字符串赋给b所指空间
B)使指针b指向a所指字符串
C)将a所指字符串和b所指字符串进行比较
D)检查a和b所指字符串中是否有’\0’
解析:选A。考点为指针概念及while循环。
While循环条件为:(*b=*a)!='\0’,实行时先把指针a所指向字符赋给指针b所在内存单元,假如该字符不是结束标志“\0”,实行循环体a++;b++;,指针a、b分别指向下一个字符单元。再鉴定循环条件,假如成立,继续把指针a所指向字符赋给指针b所在内存单元,直到碰到结束标志为止。所以对的答案为A。
29、
(33)设有以下函数
void fun(int n,char * s) {……}
则下面对函数指针定义和赋值均是对的是
A)void (*pf)(); pf=fun;
B)viod *pf(); pf=fun;
C)void *pf(); *pf=fun;
D)void (*pf)(int,char);pf=&fun;
解析:选A。考点为指向函数指针使用方法。
函数名代表函数入口地址。指向函数指针应当定义为void(*pf)( )。假如定义为void *pf( ),则表达函数pf返回值为一个基类型为void指 30、针。综上,所以对的答案为A。
(34)有以下程序
#include 31、10
解析:选C.考点为静态局部变量使用。
主函数和f函数中a所有为局部变量,作用域所有在本函数之内,互不影响。f函数中a为静态局部变量,占用固定内存单元,下一次调用时仍可保存上次调用时值。也就是说,假如数次调用f函数,a定义只在第一次调用时有效,从第二次调用开始,a定义相称于不存在,直接使用a值。主函数中调用了2次f(a),第一次调用,s=f(a)=f(3) f函数:n=3 a=l n=n+(a++)=4 a=2 返回n,主函数s=4。第二次调用,s=s+f(a)=4+f(3)(a值为主函数中a值) f函数n=3 a=2 n=n+(a++)=5 a=3 32、 返回n,主函数s=4+f(3)=4+5=9 最终输出s值为9。
(35)有以下程序
#include 33、授有类型,仅为字符序列,不能当作表达式运算。宏展开时,把实参字符串原样写在替换文本中。s=f(a+l)=a+l*a+l*a+l=10
t=f((a+1))=(a+1)*(a+1)*(a+1)=64
(36)下面结构体定义语句中,错误是
A)struct ord {int x;int y;int z;}; struct ord a;
B)struct ord {int x;int y;int z;} struct ord a;
C)struct ord {int x;int y;int z;} a;
D)struct {int x;int 34、 y;int z;} a;
解析:选B。考点为结构体变量定义。
可以先定义结构体类型,再定义结构体变量,如A。
可以在定义结构体类型同时定义结构体变量,如C。
可以直接定义结构体变量,没有类型名,如D。
B选项错误,定义结构体类型同时使用这类型。
(37)设有定义:char *c;,以下选项中可以使字符型指针c对的指向一个字符串是
A)char str[ ]=”string”;c=str;
B)scanf(“%s”,c);
C)c=getchar();
D)*c=”string”;
解析:选A。考点为字符指针使用。
选项A为对的使用 35、方法。先将字符串存于字符数组中,然后将数组名赋给字符指针。(数组名代表数组首地址,定义数组时为其分派拟定地址)选项C错误。getchar( )函数输入个字符给字符型变量,而不是字符指针。选项B和D有类似错误,两个选项并无语法错误,但运营时也许会出现问题。
因素:在选项B和D中,字符指针没有被赋值,是个不拟定值,指向一个不拟定内存区域,这个区域也许存放有用指令或数据。在这个不拟定区域重新存放字符串,也许会发生无法预知错误。
(38)有以下程序
#include 36、 a; char b[10]; double c;};
struct A f(struct A t);
main()
{ struct A a={1001,”ZhangDa”,1098.0};
a=f(a);jprintf(“%d,%s,%6.1f\n”,a.a,a.b,a.c);
}
struct A f(struct A t)
( t.a=1002;strcpy(t.b,”ChangRong”);t.c=1202.0;return t; )
程序运营后输出结果是
A)1001,ZhangDa,1098 37、0
B)1001,ZhangDa,1202.0
C)1001,ChangRong,1098.0
D)1001,ChangRong,1202.0
解析:选D。考点为结构体类型在函数中应用。
由于使用结构体变量,程序看似很杂乱。但在使用中,结构体变量和一般变量作用是同样。假如这么看,程序实行环节以下:函数调用f(a)将实参a传给形参t,函数内部对t重新赋值,然后返回t;主函数a=f(a),把返回值t赋给a,然后输出a,其实就是t值。
(39)若有以下程序段
int r=8;
printf(“%d\n”,r>>1);
输出结果 38、是
A)16
B)8
C)4
D)2
解析:选C。考点为位运算中右移运算符使用。
每右移一次,相称于除以2。本题中,r=(8)10=(0000 1000)2
r>>1后,r=( 0000 0100)2 =(4)10
(40)下列相关C语言文献叙述中对的是
A)文献由一系列数据依次排列组成,只能组成二进制文献
B)文献由结构序列组成,可以组成二进制文献或文本文献
C)文献由数据序列组成,可以组成二进制文献或文本文献
D)文献由字符序列组成,其类型只能是文本文献
解析:选C。C语言中依据数据组织 39、形式,分为二进制文献和ASCII码文本文献。一个C文献是一个字节序列或二进制序列,而不是一个记录(结构)序列。
二、填空题(每空2分,共30分)
(1)某二叉树有5个度为2结点和3个度为1结点,则该二叉树中共有 14 个结点。
解析:度为2结点有5个,则度为0结点(叶子结点)为5+1=6个,度为1结点有3个,总结点数位5+6+3=14个。
(2)程序环节图中菱形框表达是 逻辑条件 。
(3)软件开发过程关键分为需求分析、设计、编码和测试四个阶段,其中 需求分析阶段产生“软件需求规格说明书。
(4)在数据库技术中,实体集之间联络可以是一对一或一对多或多对多,那么“学生”和 40、可选课程”联络为 多对多 。
解析:一个学生可以选多门功课,一门功课可以多个学生选择。
(5)人员基础信息通常包含:身份证号,姓名,性别,年纪等。其中可以作为主关键字是 身份证号码 。
解析:关键字值不能反复,只能是唯一。
(6)若有定义语句:int a=5;,则表达式:a++值是 5 。
解析:a++先使用a值再增长1。
(7)若有语句double x=17;int y;,当实行y=(int)(x/5)%2;以后y值为 1 。
解析:y=(int)(3. )%2=3%2=1。
(8)以下程序运营后输出结果是 1 0 。
#include 41、dio.h>
main()
{ int x=20;
printf(“%d”,0 42、 printf(“%d\n”,a);}
解析:考点为do while语句使用方法。
程序实行环节:a=l b=7
实行循环体,b=b/2=3 a=4;b>l条件成立,再实行循环体,b=b/2=1 a=5;此时,b>l条件不成立,输出a值5。
(10)有以下程序
#include 43、 printf(“\n”);
}
程序运营后输出结果是 0 1 123 。
解析:程序实行环节:
fl=0 f2=1输出:0 1
For循环变量中i只起到控制循环次数作用,循环3次。
i=3 f=f1+f2=0+1=1输出1;
f1=f2=1 f2=f=l
i=4 f=f1+f2=1+1=2输出2;
f1=f2=1 f2=f=2
i=5 f=f1+f2=1+2=3输出3;
f1=f2=2 f2=f=3
注意循环内输出格式控制符没有空格,所以123连续输出。
(11)有以下程序
#include 44、tdio.h>
int a=5;
void fun(int b)
{ int a=10;
a+=b;printf(“%d”,a);
}
main()
{ int c=20;
fun(c);a+=c;printf(“%d\n”,a);
}
程序运营后输出结果是 3025 。
解析:考点为全局变量和局部变量使用方法。
全局变量作用域为定义开始到文献结束。局部变量作用域为定义其函数内部。当局部变量和全局变量同名时,在局部变量作用域内,全局变量不起作用。
程序实行环节:调用函数fun(c),实参c传给形参b,b=20,局部变量a起作用,a=10,a+=b a=a+b 45、10+20=30,输出a值30。返回到主函数:a+=c 此时a为全局变量。a=a+c=5+20=25,输出a值25。注意格式控制符无空格,所以连续输出。
(12)设有定义:
struct person
{ int ID;char name[12];}p;
请将scanf(“%d”, &p.ID );语句补充完整,使其可认为结构体变量p成员ID对的读入数据。
解析:考点为结构体成员引用方法。
结构体变量成员引用方法: 结构体变量.成员名
(13)有以下程序
#include 46、b[20];
scanf(“%s”,b);printf(“%s %s\n”,a,b);
}
程序运营时从键盘输入:How are you?<回车>
则输出结果为 How are you? How 。
解析:考点为字符串输人输出。
c语言中用字符数组存放字符串,此题中字符数组a赋值和输出属于正常使用方法。关键是字符数组b输入,C语言把空格作为字符串输入分隔符,所以字符数组b只能接受到How。(具体参考教材P145页)
(14)有以下程序
#include 47、d fun1( REC x ){x.num=23;x.s=88.5;}
main()
{ REC a={16,90.0 };
fun1(a);
printf(“%d\n”,a.num);}
程序运营后输出结果是 16 。
解析:考点为函数参数传输。C语言中函数参数传输是值传输,是把实参值传给形参,是单向传输,形参改变不会影响到实参值。此程序特殊地方是实参和形参所有是结构体变量,使用方法和一般变量是同样。
(15)有以下程序
#include






