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)队头指针可以大于队尾指针,也可以小于队尾指针(4)算法空间复杂度是指(A)A)算法在实行过程中所需要计算机存放空间B)算法所解决数据量C)算
2、法程序中语句或指令条数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)A)操作系统一部分B) 在操作系统支持下系统软件C) 一个编译系统D) 一个操作系统(9)在E-R图中,用来表达实体联络图形是(C)A) 椭圆图B) 矩形C) 菱形D) 三角形(10)有三个关系R,
3、S和T以下:其中关系T由关系R和S通过某种操作得到,该操作为(D)A) 选择B) 投影C) 交D) 并(11)以下叙述中对的是 A)程序设计任务就是编写程序代码并上机调试 B)程序设计任务就是拟定所用数据结构 C)程序设计任务就是拟定所用算法 D)以上三种说法所有不完整解析:选D。原文见高教版二级教程P2,程序设计任务包含A、B、c及相关文档。(12)以下选项中,能用作用户标记符是A)voidB)8_8C)_0_D)unsigned解析:选C。标记符由字母或下划线开头,关键字不能用作标记符。 A、D为关键字,B以数字开头,所以所有是错误。(13)阅读以下程序 #include main() i
4、nt case; float printF; printf(“请输入2个数:”); scanf(“%d %f”,&case,&pjrintF); printf(“%d %fn”,case,printF); 该程序编译时产生错误,其犯错因素是 A)定义语句犯错,case是关键字,不能用作用户自定义标记符 B)定义语句犯错,printF不能用作用户自定义标记符 C)定义语句无错,scanf不能作为输入函数使用 D)定义语句无错,printf不能输出case值解析:选A。case是关键字,关键字不能用作标记符。C语言关键字见教材附录。(注:标记符区分大小写,printf是关键字,可用作标记符,当然p
5、rintF也可以)(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作为一个整体) x=x+xxx-(x+x) xx=10(16)有以下程序 #include main() int a=1,b=0; printf(“%
6、d,”,b=a+b); printf(“%dn”,a=2*b); 程序运营后输出结果是 A)0,0 B)1,0 C)3,2 D)1,2解析:选D。考点为赋值表达式使用,赋值表达式值和变量值是同样。 printf在输出赋值表达式值时,先赋值再输出。 b=a+b=l+0=1 a=2*b=217)设有定义:int a=1,b=2,c=3;,以下语句中实行效果和其它三个不同样是 A)if(ab) c=a,a=b,b=c; B)if(ab) c=a,a=b,b=c; C)if(ab) c=a;a=b;b=c; D)if(ab) c=a;a=b;b=c;解析:选C。考点为if句和逗号表达式使用。逗号运算符
7、也称为顺序求值运算符,依次实行逗号表达式中每个表选式。逗号表达式是一个整体,复合语句也是一个整体,当ab时,A、B、D中if后语句可以作为整体被实行,把a、b值互换。C等价语句形式为: if(ab) c=a; a=b;b=c; 不能实现a、b值互换。(18)有以下程序 #include main() int c=0,k; for (k=1;kb?(bc?1:0):0;功效相同是 A)if(ab)&(bc) k=1; else k=0; B)if(ab)|(bc) k=1; else k=0; C)if(a=b) k=0; else if(bb) k=1; else if(bc) k=1; el
8、se k=0;解析:选A。考点为条件表达式使用。语句功效为: ab且bc时,k=l ab且b=e时,k=0 a=b时,k=0符合语句功效只有A。20)有以下程序 #include main() char s=“012xy”;int i,n=0; for(i=0;si!=0;i+) if(si=a&si=z) n+; printf(“%dn”,n); 程序运营后输出结果是 A)0 B)2 C)3 D)5解析:选B。考点为字符数组使用。C语言用字符数组存放字符串,用O作为结束标志。(0是ASCII码值为0字符,也即数值0)程序功效为记录字符数组s中小写字符个数,n为计数器。(21)有以下程序 #i
9、nclude main() int n=2,k=0; while(k+&n+2); printf(“%d %dn”,k,n); 程序运营后输出结果是 A)0 2 B)1 3 C)5 7 D)1 2解析:选D。考点为while语句使用。该while(k+&n+2);循环体为空语句,所以程序是输出退出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
10、 a=x2d;解析:选C。考点为字符型变量赋值和基础概念。字符型为单引号括起一个字符。A为标准字符型赋值方法,B为把一个转义字符赋值给字符变量,也是对的。C为单引号括起两个字符,不符合字符型定义。D表面看上去是错误,其实是对的,也是一个转义字符。/x2d表达ASCII码值为16进制数2d字符,即-号。(23)有以下程序#include main() char c1,c2; c1=A+8-4; c2=A+8-5; printf(“%c,%dn”,c1,c2);已知字母AASCII码为65,程序运营后输出结果是 A)E,68 B)D,69 C)E,D D)输出无定值解析:选A。考点为字符型数据使用
11、和基础知识。字符型数据在内存中存放是字符ASCII码值,可以作为整型数据来解决。英文字符和数字在ASCII码表中是按顺序排列。 c1=A+8-4=A+4=E c2=A+8-5=A+3=D(24)有以下程序 #include void fun(int p) int d=2; p=d+; printf(“%d”,p); main() int a=1; fun(a); printf(“%dn”,a); 程序运营后输出结果是 A)32 B)12 C)21 D)22解析:选C。考点为函数参数传输。c语言中函数参数传输是值传输,是把实参值传给形参,是单向传输,形参改变不会影响到实参值。程序中,把实参a值传
12、给形参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) int i,max; for(i=0;in;i+) max=MIN; if(maxxi) max=xi; return max; 导致错误因素是 A)定义语句int i,max;中max未赋初值 B)赋值语句max=MIN;中,不应给max赋MIN值 C)语句if(maxxi) m
13、ax=xi;中鉴定条件设立错误 D)赋值语句max=MIN;放错了位置解析:选D。考点为求最大值算法。max=MIN不应当放在循环内,而应当放到for循环前面。先让max取最小整数,这么第1次循环时max就可以取得第1个数组元素值,然后在循环中把后面数组元素依次和max比较,让max取大值。(26)有以下程序 #include main() int m=1,n=2,*p=&m,*q=&n,*r; r=p;p=q;q=r; printf(“%d,%d,%d,%dn”,m,n,*p,*q); 程序运营后输出结果是 A)1,2,1,2 B)1,2,2,1 C)2,1,2,1 D)2,1,1,2解析:
14、选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 a410,*p,*q4;且0i4,则错误赋值是 A)p=a B)qi=ai C)p=ai D)p=&a21解析:选A。考点为指向二维数组指针使用方法。 p为基类型为int指针,指向一个整型数据,也就可咀指向一个数组元素,所以D对的。 a是二维数组名,存放二维数组首地址,但二维数组名是一个行指针,其基类型为具有10个元素一维数组。所以A错误,两者基类型不一致(p+1指向下一个
15、元素,而a+l指向二维数组下一行)。假如p定义为int(*p)10,才可以赋值p=a。在C语言中,二维数组a410可以看做是由4个元素组成一维数组,这4个元素为a0、al、a2、a3,而其中每个元素又是由10个元素组成维数组。 在这里,ai也是一个数组名,可以表达一维数组首地址,但ai是一个列指针,基类型为int.指向一维数组第1个元素。同时,指针数组q每个数组元素qi基类型也为int,所以p、ai、qi基类型一致,选项B、C是对的。(28)有以下程序 #include #include main() char str 20=“One*World”, “One*Dream!”,*p=str1;
16、 printf(“%d,”,strlen(p);printf(“%sn”,p); 程序运营后输出结果是 A)9,One*World B)9,One*Dream C)10,One*Dream D)10,One*World解析:选C。考点为二维字符数组使用和strlen()函数使用。初始化p=strl后,p指向第二个字符串“One*Dream!”。strlen()函数计算字符串长度时不包含结束标志,所以strlen(p)=10。(29)有以下程序 #include main() int a =2,3,5,4,i; for(i=0;i4;i+) switch(i%2) case 0:switch(a
17、i%2) case 0:ai+;break; case 1:ai-; break; case 1:ai=0;for(i=0;i4;i+) printf(“%d”,ai); 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 内部switch语句也实行case 0, ai+ a0=3i=1时,实行case 1,al=0 排除法,只有C对的。i=2时,实行case 0 内部switch语句实行case 1 ai- a2=4i=3时,实行case
18、 1,a3=0 最终依次输出为:3 0 4 0(30)有以下程序 #include #include main() char a10=”abcd”; printf(“%d,%dn”,strlen(a),sizeof(a);程序运营后输出结果是 A)7,4 B)4,10 C)8,8 D)10,10解析:选B。考点为strlen()函数和sizeof()运算符使用。 strlen()函数计算字符串长度时,碰到结束标志为止,且长度不包含结束标志,所以strlen(a)=4,排除法选B。 sizeof()运算符操作数可以是类型名或变量名、数组名等,当操作数是数组名时,其结果是数组总字节数,所咀size
19、of(a)=10。(31)下面是相关C语言字符数组描述,其中错误是 A)不可以用赋值语句给字符数组名赋字符串 B)可以用输入语句把字符串整体输入给字符数组 C)字符数组中内容不一定是字符串 D)字符数组只能存放字符串解析:选D。考点为字符数组使用。字符数组名是数组首地址,是常量,不能被重新赋值,所以A对的。可以用scanf(“%s”,str)对字符串整体输入,str可以是字符数组名或字符指针,所以B对的。C和D说法对立,肯定有一个对的,用排除法A、B选项主线不用看。字符数组所有元素可以只存放一般字符,不存放结束标志。所以D错误。(32)下列函数功效是 fun(char * a,char * b
20、) while(*b=*a)!=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。(33)设有以下函数 void fun(int n,char * s)
21、 则下面对函数指针定义和赋值均是对的是 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指针。综上,所以对的答案为A。(34)有以下程序 #include int f(int n); main() int a=3,s; s=f(a);s=s+f(a);prin
22、tf(“%dn”,s); int f(int n) static int a=1; n+=a+; return n; 程序运营以后输出结果是 A)7 B)8 C)9 D)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
23、=4。第二次调用,s=s+f(a)=4+f(3)(a值为主函数中a值) f函数n=3 a=2 n=n+(a+)=5 a=3 返回n,主函数s=4+f(3)=4+5=9 最终输出s值为9。(35)有以下程序 #include #define f(x) x*x*x main() int a=3,s,t; s=f(a+1);t=f(a+1); printf(“%d,%dn,s,t); 程序运营后输出结果是 A)10,64 B)10,10 C)64,10 D)64,64解析:选A。考点为带参数宏定义。宏定义中参数授有类型,仅为字符序列,不能当作表达式运算。宏展开时,把实参字符串原样写在替换文本中。s=
24、f(a+l)=a+l*a+l*a+l=10t=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 y;int z; a;解析:选B。考点为结构体变量定义。可以先定义结构体类型,再定义结构体变量,如A。可以在定义结构体类型同时定义结构体变量,如C。可以直接定义结构体变量
25、,没有类型名,如D。B选项错误,定义结构体类型同时使用这类型。(37)设有定义:char *c;,以下选项中可以使字符型指针c对的指向一个字符串是 A)char str =”string”;c=str; B)scanf(“%s”,c); C)c=getchar(); D)*c=”string”;解析:选A。考点为字符指针使用。选项A为对的使用方法。先将字符串存于字符数组中,然后将数组名赋给字符指针。(数组名代表数组首地址,定义数组时为其分派拟定地址)选项C错误。getchar( )函数输入个字符给字符型变量,而不是字符指针。选项B和D有类似错误,两个选项并无语法错误,但运营时也许会出现问题。因
26、素:在选项B和D中,字符指针没有被赋值,是个不拟定值,指向一个不拟定内存区域,这个区域也许存放有用指令或数据。在这个不拟定区域重新存放字符串,也许会发生无法预知错误。(38)有以下程序 #include #include struct A int a; char b10; double c; struct A f(struct A t); main() struct A a=1001,”ZhangDa”,1098.0; a=f(a);jprintf(“%d,%s,%6.1fn”,a.a,a.b,a.c); struct A f(struct A t) ( t.a=1002;strcpy(t.b
27、,”ChangRong”);t.c=1202.0;return t; ) 程序运营后输出结果是 A)1001,ZhangDa,1098.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=
28、8; printf(“%dn”,r1); 输出结果是 A)16 B)8 C)4 D)2解析:选C。考点为位运算中右移运算符使用。 每右移一次,相称于除以2。本题中,r=(8)10=(0000 1000)2 r1后,r=( 0000 0100)2 =(4)10(40)下列相关C语言文献叙述中对的是 A)文献由一系列数据依次排列组成,只能组成二进制文献 B)文献由结构序列组成,可以组成二进制文献或文本文献 C)文献由数据序列组成,可以组成二进制文献或文本文献 D)文献由字符序列组成,其类型只能是文本文献解析:选C。C语言中依据数据组织形式,分为二进制文献和ASCII码文本文献。一个C文献是一个字节
29、序列或二进制序列,而不是一个记录(结构)序列。二、填空题(每空2分,共30分)(1)某二叉树有5个度为2结点和3个度为1结点,则该二叉树中共有 14 个结点。解析:度为2结点有5个,则度为0结点(叶子结点)为5+1=6个,度为1结点有3个,总结点数位5+6+3=14个。(2)程序环节图中菱形框表达是 逻辑条件 。(3)软件开发过程关键分为需求分析、设计、编码和测试四个阶段,其中 需求分析阶段产生“软件需求规格说明书。(4)在数据库技术中,实体集之间联络可以是一对一或一对多或多对多,那么“学生”和“可选课程”联络为 多对多 。解析:一个学生可以选多门功课,一门功课可以多个学生选择。(5)人员基础
30、信息通常包含:身份证号,姓名,性别,年纪等。其中可以作为主关键字是 身份证号码 。解析:关键字值不能反复,只能是唯一。(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 main() int x=20; printf(“%d”,0x20); printf(“%dn”,0x&x20); 解析:“”结合性为从左到右。计算Ox20,x=20,Ox为
31、1,然后120结果为1。关系运算符优先级大于逻辑运算符。0x&x20相称于(0x)&(x20),结果为0。(9)以下程序运营后输出结果是 5 。#include main() int a=1,b=7; do b=b/2;a+=b; while (b1); printf(“%dn”,a);解析:考点为do while语句使用方法。程序实行环节:a=l b=7实行循环体,b=b/2=3 a=4;bl条件成立,再实行循环体,b=b/2=1 a=5;此时,bl条件不成立,输出a值5。(10)有以下程序#include main() int f,f1,f2,i; f1=0;f2=1; printf(“%
32、d %d”,f1,f2); for(i=3;i=5;i+) f=f1+f2; printf(“%d”,f); f1=f2; f2=f; printf(“n”);程序运营后输出结果是 0 1 123 。解析:程序实行环节: fl=0 f2=1输出:0 1For循环变量中i只起到控制循环次数作用,循环3次。i=3 f=f1+f2=0+1=1输出1; f1=f2=1 f2=f=li=4 f=f1+f2=1+1=2输出2; f1=f2=1 f2=f=2i=5 f=f1+f2=1+2=3输出3; f1=f2=2 f2=f=3注意循环内输出格式控制符没有空格,所以123连续输出。(11)有以下程序#inc
33、lude int a=5;void fun(int b) int a=10; a+=b;printf(“%d”,a);main() int c=20; fun(c);a+=c;printf(“%dn”,a);程序运营后输出结果是 3025 。解析:考点为全局变量和局部变量使用方法。全局变量作用域为定义开始到文献结束。局部变量作用域为定义其函数内部。当局部变量和全局变量同名时,在局部变量作用域内,全局变量不起作用。程序实行环节:调用函数fun(c),实参c传给形参b,b=20,局部变量a起作用,a=10,a+=b a=a+b=10+20=30,输出a值30。返回到主函数:a+=c 此时a为全局变
34、量。a=a+c=5+20=25,输出a值25。注意格式控制符无空格,所以连续输出。(12)设有定义:struct person int ID;char name12;p;请将scanf(“%d”, &p.ID );语句补充完整,使其可认为结构体变量p成员ID对的读入数据。解析:考点为结构体成员引用方法。结构体变量成员引用方法: 结构体变量.成员名(13)有以下程序#include main() char a20=”How are you?”,b20; scanf(“%s”,b);printf(“%s %sn”,a,b);程序运营时从键盘输入:How are you?则输出结果为 How are
35、 you? How 。解析:考点为字符串输人输出。c语言中用字符数组存放字符串,此题中字符数组a赋值和输出属于正常使用方法。关键是字符数组b输入,C语言把空格作为字符串输入分隔符,所以字符数组b只能接受到How。(具体参考教材P145页)(14)有以下程序#include typedef struct int num;double sREC;void fun1( REC x )x.num=23;x.s=88.5;main() REC a=16,90.0 ; fun1(a); printf(“%dn”,a.num);程序运营后输出结果是 16 。解析:考点为函数参数传输。C语言中函数参数传输是值传输,是把实参值传给形参,是单向传输,形参改变不会影响到实参值。此程序特殊地方是实参和形参所有是结构体变量,使用方法和一般变量是同样。(15)有以下程序#include fun(int x) if(x/20) run(x/2); printf(“%d ”,x);main( ) fun(6);printf(“n”); 程序运营后输出结果是 1 3 6 。解析:考点为函数递归调用。程序实行过程是先递推、后递归过程。当x=1时,条件不成立,递归终止。