2008年9月全国计算机等级考试二级C语言笔试试卷及解析

更新时间:2024-07-03 09:28:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2008年9月全国计算机等级考试二级笔试试卷

C语言程序设计

(考试时间90分钟,满分100分)

1)栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次放入栈,然后再依次出栈,则元素的顺序是: A) 12345ABCDE B) EDCBA54321 C) ABCDE12345 D) 54321EDCBA 答案:B

详细解答:该知识点是考查了栈的先进后出,是我们公共基础的重点考点,在公共基础的10页纸上多次强调。栈和队列是每年必考的题目。 2)下列叙述中正确的是

A)循环队列有对头和对尾两个指针,因此,循环队列是非线性结构

B)在循环队列中,只需要队列头指针就能够反映队列中元素的动态变化情况 C)在循环队列中,只需要队列头指针就能够反映队列中元素的动态变化情况 D)循环队列中的元素的个数是有队头和队尾指针共同决定的。 答案:D

详细解答:该知识点是考查了循环队列的知识点,队列是线性结构。处理队列的话我们是有两个指针的,一个是头指针,一个是尾指针。

3) 在长度为n的有序线性表中进行二分查找,最坏的情况下需要比较的次数是 A)O(n) B)O(n2) C)O(log2n) D)O(nlog2n)

答案:C

详细解答:该知识点是考查了二分查找。二分查找:对于长度为n的线性表,在最坏情况进行 log2n次。 4)下列叙述中正确的是

A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的。

B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构。 C)顺序存储结构能存储有序表,链式存储结构不能存储有序表。 D)链式存储结构比顺序存储结构节省空间。 答案:A

详细解答:该知识点是考查了栈数据结构特点。 5)数据流图中带有箭头的线段表示的是

A)控制流 B)事件驱动 C)模块调用 D)数据流 答案:D

详细解答:该知识点是考查了数据流图中的各个知识点。 6)在软件开发中,需求分析阶段可以使用的工具是

A)N-S图 B)DFD图 C)PAD图 D)程序流程图 答案:B

7)在面向对象方法中,不属于“对象”基本特点的是

A) 一致性 B)分类性 C)多态性 D)标识一致性 答案:A

详细解答:该知识点是考查了对象的基本属性。是我们公共基础的重点考点, 8)一间宿舍可以住多个学生,则实体宿舍和学生之间的联系是 A ) 一对一 B) 一对多 C)多对一 D)多对多 答案:B

9)在数据管理技术发展的三个阶段中,数据共享最好的是 A)人工管理阶段 B)文件系统阶段 C)数据库系统阶段 D)三个阶段相同 答案:C

10)有三个关系S、R和T如下:

由关系R和S通过运算得到关系T,则所使用的运算为 A)笛卡尔积 B)交 C)并 D)自然连接 答案:D

详细解答:该知识点是考查了关系的运算,是我们公共基础的常考的题目。考试中一般比较多的是考到了笛卡尔积、交。这个地方考了自然连接的运算。 11)以下叙述中正确的是( ) A) C语言的基本组成单位是语句

B) C程序中的每一行只能写一条语句 C) 简单C语句必须以分号结束 D)C语句必须在一行内完成 答案:C

详细解答:本题考查了C语言的基本概念,基本语法,本题所有选项均可在第一分册找到原句

A)选项错误:函数是C语言的基本组成单位(第一分册P55)

B)、D)选项错误: C语言书写格式自由,一行内可以写多个语句,一个语句可以多行书写(第一分册P3)

C)选项正确:分号是语句结束的标志,任何一条语句都必须以分号结束. 把以一个分号结尾的一句话叫做一个C语言的语句(第一分册P2,P3) 12)计算机能直接执行的程序是( )

A)源程序 B)目标程序 C)汇编程序 D)可执行程序 答案:D

详细解答:根据我们上机运行的操作步骤,此题就可以选出答案

用C语言编写的程序,称之为源程序,后缀为.c,通过C语言编译,变为后缀为.obj的文件,然后链接成后缀为.exe的可执行文件,才能交给计算机执行,可见计算机能直接执行的是可执行程序。

汇编语言编写的程序,机器不能直接识别,要翻译成机器语言(可执行语言),才能执行(考生即使不知道该知识点,此题也应该选出答案) 13)以下选项中不能作为C语言合法常量的是 ( )

A) ‘cd’ B) 0.1e+6 C) “a” D)‘\\011’ 答案:A

详细解答:本题考查了字符常量,实型常量、字符串常量

字符常量是一对单引号括起来的一个字符,A选项单引号内有两个字符 注意D选项为八进制转移字符(第一分册P48) 14) 以下选项中正确的定义语句是 ( )

A)double a;b; B) double a=b=7; C) double a=7,b=7; D)double ,a,b; 答案:C

详细解答:本题考查变量的定义,以及初始化(定义变量的同时赋值,比如C选项)

A)选项错误:在同一条语句中定义多个变量,变量之间用逗号, eg:double a,b;

如果作为两条语句定义,变量类型不能省略,eg:double a;double b; B)选项错误:变量b未定义,正确格式为 double a,b;a=b=7;

D)选项错误:变量类型与变量之间不能有逗号,只能是空格 eg: double a,b; 15) 以下不能正确表示代数式 的C语言表达式是( ) A) 2*a*b/c/d B) a*b/c/d*2 C) a/c/d*b*2 D) 2*a*b/c*d 答案:D

详细解答:本题考查了代数式在C语言中的书写格式 D)选项相当于代数式

16) C源程序中不能表示的数制是 ( )

A) 二进制 B) 八进制 C) 十进制 D) 十六进制 答案:A

详细解答:本题考查了整型常量的三种表示形式

整型常量分为十进制整型常量、八进制整型常量、十六进制整型常量,唯独没有二进制整形常量,所以源程序中不能表示二进制

17) 若有表达式(w)?(--x):(++y),则其中与w等价的表达式是 ( ) A)w==1 B) w==0 C) w! =1 D) w! =0 答案:D

详细解答:本题考查了逻辑表达式的真假

题目中w为1,表达式w表示真,w为0,表达式w表示假,这类题目的做法,把1,0代入选项,找出与w真假条件相符的即可

比如:D选项, w为1时,1!=0成立,表达式值为真w为0时,0!=0部成立,表达式值为假

18) 执行以下程序段后,w的值为 ( ) int w=’A’,x=14,y=15; w=((x||y)&&(w<’a’)); A)-1 B)NULL C) 1 D)0 答案:C

详细解答:本题考查了逻辑表达式的判断

&&两边都为真,表达式才为真;||两边有一个为真就为真.(x||y)值为真,(w<’a’)成立,也为真,整个表达式((x||y)&&(w<’a’))值为1,把1赋值给w, w的值为1

19) 若变量已正确定义为int型,要通过语句scanf(“%d,%d,%d”,&a,&b,&c);给a赋值1,给b赋值2,给c赋值3,以下输入形式中错误的是(ㄩ代表一个空格符)()

A)ㄩㄩㄩ1,2,3<回车> B)1ㄩ2ㄩ3<回车> C) 1,ㄩㄩㄩ2,ㄩㄩㄩ3<回车> D)1,2,3<回车> 答案:B

详细解答:本题考查了scanf输入函数的格式说明知识

输入函数的输入控制(双引号之间的内容),除 %* 外,如果含有其它字符,则在输入数据时一定要一一对应输入这些字符,此题双引号之间含有逗号,那么输入数据之间必须输入逗号,B选项错误.此类型的题目还要注意逗号不是分隔符,如果双引号之间没有逗号,输入数据时不能用逗号 20) 有以下程序段 int a,b,c; a=10;b=50;c=30; if(a>b) a=b,b=c; c=a;

printf(“a=%d b=%d c=%d”,a,b,c); 程序的输出结果是 ( )

A)a=10 b=50 c=10 B)a=10 b=50 c=30 C) a=10 b=30 c=10 D) a=50 b=30 c=50 答案:A

详细解答:本题目学员应该注意逗号表达式语句,及if语句的结构 属于if(a>b)的只有一条语句a=b,b=c;(逗号表达式语句)

咱们强调如果含有多条语句,必须用大括号{ }括起,eg:if(a>b) { a=b,b=c; c=a;} 如果没有用 { }括起,那么只有一条语句,10>50不成立,所以a=b,b=c;不执行;执行后面的语句c=a;此时c的值变为10,所以输出为A选项 21) 若有定义语句:int

m[ ]={5,4,3,2,1},i=4;则下面对m数组元素的引用中错误的是( ) A)m[--i] B)m[2*2] C) m[m[0]] D)m[m[i]] 答案:C

详细解答:本题考查了数组的下标不能越界,数组长度由{ }中的数据个数默认为5,那含有5个数组元素分别为m[0]、m[1]、m[2]、m[3]、m[4],C)选项为m[5],下标越界

A) 选项对应m[3] B) 选项对应m[4] D)选项对应m[1] 22) 下面的函数调用语句中func函数的是实参个数是 ( ) func( f2(v1,v2)), (v3,v4,v5),(v6,max(v7,v8))); A)3 B)4 C) 5 D)8 答案:A

详细解答:函数的参数列表,不同参数之间用逗号隔开, func函数的参数个数为3,分别为f2(v1,v2)),(v3,v4,v5),(v6,max(v7,v8))。大家可以简单的理解为以外层逗号间隔为准,其中每个参数又含有函数和多个参数,超出本题查考的内容

23) 若有定义语句:double x[5]={1.0, 2..0, 3.0, 4.0, 5.0},*p=x; 则错误引用x数组元素的是 ( )

A)*p B)x[5] C)*(p+1) D)*x 答案:B

详细解答:本题考查数组的下标是否越界,以及指针对变量的引用

B)选项x[5],下标越界。一维数组名是地址常量(数组首地址),始终指向第一个数组元素,进行赋值p=x,指针变量p也指向第一个数组元素如下图:

A)选项 *p表示p所指向单元的数据即x[0] 值为1.0 C)选项 *(p+1)表示p+1所指向单元的数据即x[1] 值为2.0 D)选项 *x表示x所指向单元的数据即x[0] 值为1.0

24)若有定义语句: char s[10]=”1234567\\0\\0”; ,则strlen(s)的值是 ( ) A)7 B)8 C) 9 D)10

答案:A

详细解答:本题目考查字符串结束标志’\\0’。字符串从第一个字符开始,遇到第一个结束符’\\0’为止,注意’\\0’不占字符串长度,所以此题选A 25) 以下叙述中错误的是 ( )

A)用户定义的函数中可以没有return 语句

B) 用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值

C) 用户定义的函数中若没有return语句,则应当定义函数为void类型 D)函数的return语句中可以没有表达式 答案:B 详细解答:

1、如果函数返回值类型为void,则可以不用return语句,所以A正确; 2、如果函数没有return语句,函数返回值类型必须是void

3、如果函数没有返回值,可以用return语句,此时表达式应该为空,D正确 4、函数可以根据需要返回一个确定的值,程序中可以出现多个return语句,但当程序执行到第一个return语句时,就会结束当前函数的运行,不会执行后面的语句,所以用return语句只能返回一个函数值,B错误 26) 以下关于宏的叙述中正确的是 ( ) A)宏名必须用大写字母表示

B) 宏定义必须位于源程序中所有语句之前 C) 宏替换没有数据类型限制

D)宏调用比函数调用耗费时间 答案:C

详细解答:本题考查宏的基本定义

A) 选项错误:宏名一般习惯用大写,但可以用小写

B)选项错误:预处理命令可以出现在任何位置,但习惯上应尽可能地写在源程序的开头.

C) 选项正确:宏定义时形参不能指定类型,即没有数据类型限制

D) 选项错误:宏替换在编译时由预处理程序完成,所以宏替换不占用运行时间;而函数调用是在程序运行中处理的,要临时分配存储单元,占用一系列时间 27) 有以下程序 #iinclude main() { int i,j; for(i=3; i>=1; i--)

{ for (j=1;j<=2;j++) printf(“%d”,i+j); printf(“\\n”); } }

程序的运行结果是 ( )

A) 2 3 4 B) 4 3 2 C) 2 3 D) 4 5 3 4 5 5 4 3 3 4 3 4

4 5 2 3 答案:D

详细解答:本题考查双层for循环嵌套 i值为3时, j为1,输出4 j为2,输出5 j为3时,不满足条件 退出内层循环,执行后面的语句 换行

i值为 2时, j为1,输出3 j为2,输出4 j为3时,不满足条件 退出内层循环,执行后面的语句 换行

i值为 1时, j为1,输出2 j为2,输出3 j为3时,不满足条件 退出内层循环,执行后面的语句 换行

i值为 0时,不满足判断条件退出整个for循环 28) 有以下程序

#include main()

{ int x=1,y=2, z=3; if(x>y)

if (y

程序运行结果是

A)331 B)41 C) 2 D)1 答案:D

详细解答:本题考查if ,if-else结构

首先搞清楚此题目的结构,本题含有一个if结构,属于if的语句是一个if-else结构,if (y

else printf(“%d”,++y); 这是本题的关键

首先判断x>y不成立,那么属于if(x>y)的语句不执行,直接执行后面的语句printf(“%d\\n”,x++);输出1(本题还有一个考查点就是++在前在后的问题,如果题目改为++x,输出2) 29) 有以下程序 #include main()

{ int i=5; do

{ if (i%3= =1) if (i%5= =2)

{printf(“*%d”,i); break; } i++; }while(i!=0); printf(“\\n”); }

程序的运行结果是

A)*7 B)*3*5 C) *5 D)*2*6 答案:A

详细解答:此题头考查了break的用法,遇到break退出整个循环

明确循环体中的语句,当i的值满足(i%3= =1) 并且满足(i%5= =2)时,输出*i. 并且break;退出整个循环,如果不满足就i++

本题目题意就是:输出第一个满足(i%3= =1) 并且满足(i%5= =2)的i值 当i自加到7时,满足题目要求,输出*7,然后退出整个循环,执行后面的语句 联想此题还要注意continue的用法 30) 有以下程序 #include int fun(int a, int b)

{ if(b= =0) return a; else return(fun(--a,--b)) ; } main()

{ printf(“%d\\n”,fun(4,2); } 程序的运行结果是 A)1 B)2 C) 3 D)4 答案:B

详细解答:此题考查了函数的简单递归调用

主函数中调用fun(4,2),fun(4,2)中调用fun(3,1),fun(3,1)中调用fun(2,0) 可以总结为以下结构 main( ) àfun(4,2) ->fun(3,1) ->fun(2,0) 输出2 返回2 返回2 返回2 (31) 有如下程序: #include #include int fun(int n)

{ int *p;

p=(int *)malloc(sizeof(int)); *p=n; return *p; } main() { int a;

a=fun(10); printf(\}

程序的运行结果是

A)0 B)10 C)20 D)出错 答案:C

详细解答:该知识点考察的是函数的调用以及引用指针存储单元,也是我们平时上课强调了的知识点。在主函数调用fun函数,实参10单向值传递给形参n,在fun定义了指针变量p并用malloc函数给p分配了存储空间,然后下一条语句把n的值赋给p所指向的存储单元,最后是返回存储单元的值到主函数。所以调用fun(10)的返回值为10,a的值也为10, 选C (32)有如下程序: #include void fun(int a,int b) {

int t; t=a;a=b;b=t; } main()

{int c[10]={1,2,3,4,5,6,7,8,9,0},i;

for(i=0;k<10;i+=2) fun(c[i],c[i+1]);for(i=0;k<10;i++)printf(\\ }

程序的运行结果是

A)1,2,3,4,5,6,7,8,9,0, B)2,1,4,3,6,5,8,7,0,9, C)0,9,8,7,6,5,4,3,2,1, D)0,1,2,3,4,5,6,7,8,9, 答案:A

详细解答:该知识点考察的是函数实际参数与形式参数的传递过程,是我们上课强调的重点内容。该题没有涉及到指针,实参单向的值传递给形参,形参反过来不能传递给实参。在主函数中把数组元素作为实参进行传递给形参a和b,在fun中交换了形参a和b的值,但形参a和b值的改变并不影响实参。所以数组C中的元素没有改变。选A (33)有如下程序: #include struct st

{int x,y;} data[2]={1,10,2,20};

main()

{struct st *p=data; printf(\printf(\}

程序的运行结果是

A)10,1 B)20,1 C)10,2 D)20,2 答案:C

详细解答:该知识点考察的是结构体成员的引用,是我们上课强调的重点内容。在主函数中把一维数组名data赋给了指针变量p,则p指向数组元素data[0],且每一个数组元素含有两个成员x和y,所以表达式p->y 是引用data[0]的成员y,即等于10;(++p)->x是先让指针值自增,往下移动指向了data[1],然后引用data[1]的成员x, 即等于2。选C (34)有如下程序: #include void fun(int a[],int n) { int i,t;

for(i=0;i

{int k[10]={1,2,3,4,5,6,7,8,9,10},i;

fun(k,5);

for(i=2;i<8;i++) printf(\printf(\}

程序的运行结果是

A)345678 B)876543 C)1098765 D)321678 答案:D

详细解答:该知识点考察的是一维数组名作为实参进行参数传递,是我们上课强调的重点内容。在主函数中调用了fun函数,实参为数组名k和整数5,这样对应定义fun函数首部有三种形式(教材P84),这里采用了第二种形式。这样在fun函数对a[i]操作实际上就是对主函数中的k[i]操作,即 k[0]与k[4] 、k[1]与k[3]值交换了,所以选D (35)有如下程序: #include #define N 4

void fun(int a[][N],int b[]) { int i;

for(i=0;i

{ int x[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},y[N],i;

fun(x,y);

for(i=0;i

A)1,2,3,4, B)1,0,7,0, C)1,4,5,9, D)3,4,8,10, 答案:B

详细解答:该知识点考察的是二维数组名和一维数组名作为实参进行参数传递,是我们上课强调的重点内容。在主函数中调用了fun函数,实参为二维数组名x和一维数组名y,这样对应定义fun函数首部也有三种形式(教材P84、P86),这里采用了第二种形式。这样在fun函数对a[i][j]、b[i]进行操作实际上就是对主函数中的x[i][j]、y[i]进行操作,即把 x[0][0]、x[1][1]、x[2][2]和x[3][3]分别赋给y[0] 、y[1]、y[2]和y[3],所以选B (36)有如下程序: #include

int fun(int (*s)[4],int n,int k) { int m,i; m=s[0][k];

for(i=0;im) m=s[i][k]; return m; }

main()

{int a[4][4]={{1,2,3,4},{11,12,13,14},{21,22,23,24},{31,32,33,34}}; printf(\}程序的运行结果是

A)4 B)34 C)31 D)32 答案:C

详细解答:该知识点考察的是二维数组名作为实参进行参数传递,是我们上课强调的重点内容。在主函数中调用了fun函数,实参为二维数组名a和两个整数4、0,这样对应定义fun函数首部也有三种形式(教材P86),这里采用了第一种形式,也就是行指针。这样在fun函数对s[i][j]进行操作实际上就是对主函数中的a[i][j]进行操作,再分析fun函数的作用便可知,是求二维数组第0列中的最大那个元素,所以选C (37)有如下程序: #include main ()

{struct STU {char name[9]; char sex; double score[2];}; struct STU a={“Zhao”,’m’,85.0,90.0}, b={“Qian”,’f’,95.0,92.0}; b=a;

printf(“%s,%c,%2.0f,%2.0f\\n”,b.name,b.sex,b.score[0],b.score[1]); }

程序的运行结果是

A)Qian,f,95,92 B)Qian,m,85,90 C)Zhao,f,95,92 D)Zhao,m,85,90 答案:D

详细解答:该知识点考察的是结构体初始化赋值以及成员的引用问题,是我们上课强调的重点内容。在main中分别定义了两个结构体变量a 和b,虽然有语句b=a;但是并不影响结构体b中个成员的值,要改变成员的值必须要正确的引用成员,结构体成员的引用有三种方法(教材P115),因此选D

(38)假定已建立以下链表结构,且指针p和q已指向如图所示的结点:

则以下选项中可将q所指的结点从链表中删除并释放该结点的语句组是 A)(*p).next=(*q).next;free(p); B)p=q.>next; free(q); C)p=q;free(q); D)p->next =q->next; free(q); 答案:D

详细解答:该知识点考察的是用结构体初构成链表的相关问题,是我们上课强调的重点内容。要删除q所指向的结点,只需要把q所指向结点的next成员中的地址赋给p所指向的结点中的next成员,让p跳过q所指向的结点,直接指向下一个结点即可,因此选D (39)有如下程序: #include main() {

char a=4;

printf(\}

程序的运行结果是 A)40 B)16 C)8 D)4 答案:C

详细解答:该知识点考察的是位运算,是我们上课强调的重点必考内容。左移n位相当与乘以2n,所以4*21=8 因此选C (40)有如下程序: #include main() {

FILE *pf;

char *s1=\pf=fopen(\fwrite(s2,7,1,pf); rewind(pf); fwrite(s1,5,1,pf); fclose(pf);

} 程序的运行结果是

A)China B)Chinang C)ChinaBeijing D)BeijingChina

答案:B

详细解答:该知识点考察的是几个文件指针函数,是我们上课强调的重点内容。此题和我们的教材P133上的一道例题几乎是一样的,首先定义了2个指针字符串,fwrite(s2,7,1,pf)表示把从地址s2开始的7个字符写到pf所指的文件中,即把Beijing 写到了文件中;rewind(pf)表示把文件的位置移动到文件的开头;fwrite(s1,5,1,pf)表示把从地址s1开始的5个字符写到pf所指的文件中,即又把China写到文件中,于是覆盖了s2 所指字符串的前5个字符,所以最后文件中的内容是Chinang 选B 二、填空题目:

1) 对下列二叉树进行中序遍历的结果是:

答案:DBXEAYFZC

详细解答:该知识点考察的是二叉树的遍历,是我们上课强调的重点必考内容。二叉树的中序遍历是先访问左子树,再访问根结点,最后访问右子树。(请回顾前序和后序遍历的原则)把握了这点原则的话很容易得出答案DBXEAYFZC 2) 按照软件测试的一般步骤,集成测试应在 之后进行。 答案:单元

详细解答:该知识点考察的是软件测试的4个步骤,是我们的总结上强调内容。是软件测试的4个步骤包括单元测试、集成测试、确认测试和系统测试。所以答案为单元测试。

3)软件工程三要素方法包括工具、方法和过程,其中 支持软件开发的各个环节的控制和管理 答案:过程

详细解答:该知识点考察的是软件工程三要素的具体内容,是我们总结上强调的考试内容。在我们的教材上P26有确切的解释。工具:完成软件工程项目的技术手段;工具:支持软件的开发、管理、文档生成;过程:支持软件开发的各个环节的控制和管理

4)数据库设计包括概念设计、 和物理设计。 答案:逻辑设计

详细解答:该知识点考察的是数据库设计阶段的内容,是我们总结上强调的重点考试内容。数据库设计包括需求分析阶段、概念设计阶段、逻辑设计阶段和物理设计阶段。但题目强调的是设计包括的内容,所以答案为逻辑设计。 5) 在二维表中,元组的 不能再分成更小的数据项。 答案:分量

详细解答:该知识点考察的是元组的有关内容,是我们总结上强调的重点内容。一个实体的所有属性值叫元组,而一个元组是由n个元组分量组成的,由此可知元组的分量是不能再分成更小的数据项。

{ long n;

n=func(); printf(\}

long func() { long m;

for(m=0; getchar()!='@'; 【15】); return m; }

答案:func();m++

详细解答:函数的定义在调用之后,需先申明申明格式就是函数首部加上一个“;”。 for的循环体语句为空语句,因此字符个数的统计在for之后的圆括号的表达式3中完成,每输入一个不为@的字符,执行空语句之后,m加上1,直到输入字符@为止。

本文来源:https://www.bwwdw.com/article/tos.html

Top