计算机二级C语言四套真题解析.docx
《计算机二级C语言四套真题解析.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言四套真题解析.docx(80页珍藏版)》请在冰豆网上搜索。
计算机二级C语言四套真题解析
2011年9月17日全国计算机等级考试C语言笔试题
一、选择题(⑴-(10)、(21)-(40)每题2分,(11)-(20)每题1分,共70分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡相应位置上,答在试卷上不得分。
(1)下列叙述中正确的是___________。
A)算法就是程序 B)设计算法时只需考虑数据结构的设计
C)设计算法时只需考虑结果的可靠性D)以上三种说法都不对
(1)D【解析】“软件的主体是程序,程序的核心是算法”,算法是解决问题的方法与步骤,采用某种程序设计语言对问题的对象和解题的步骤进行描述的是程序。
它与数据结构、运算结果的状态无关。
(2)下列关于线性链表的叙述中,正确的是___________。
A)各个数据结点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致
B)各个数据结点的存储顺序与逻辑顺序或以不一致,但它们的存储空间必须连续
C)进行插入与删除时,不需要移动表中的元素D)以上三种说法都不对
(2)C【解析】线性数据结构有线性表、栈和队列等,而线性链表是数据的存储结构,它全面地反映数据元素自身的信息和数据元素之间的关系,即每个元素存储有链接到下一个元素的信息,所以插入与删除时毋须移动表中元素。
(3)下列关于二叉树的叙述中,正确的是___________。
A)叶子结点总是比度为2的结点少一个B)叶子结点总是比度为2的结点多一个
C)叶子结点数是度为2的结点数的两倍D)度为2的结点是度为1的结点数的两倍
(3)B【解析】二叉树的结构定义:
叶子结点是指终端结点;非叶子结点是指分支结点;
二叉树的深度是指高度;若是完全二叉树,可由性质4公式计算而得;
结点的度:
二叉树结点的度数指该结点所含子树的个数;度为2就是有2个孩子结点的结点;
二叉树的四大性质:
【性质1】:
在二叉树的第i层上至多有2i-1个结点。
【性质2】:
深度为k的二叉树上至多含2k-1个结点。
【性质3】:
对任何一棵二叉树T,若它含有n0个叶子结点(0度节点)、度为2的结点数为n2,则必有:
n0=n2+1。
【性质4】:
具有n个结点的完全二叉树的深度为log2(n)+1。
例:
一棵完全二叉树共有64个结点,深度为[log2(64)]+1=7
答案根据:
叶子结点是指终端结点,当然比度为2的结点多一个
(4)软件按功能可以分为应用软件、系统软件和支撑软件(或工具软件)。
下面属于应用软件的是___________。
A)学生成绩管理系统B)C语言编译程序 C)UNIX操作系统D)数据库管理系统
(4)A【解析】系统软件包括操作系统(UNIX)、程序编译程序、数据库管理系统等三大大部份,所以学生成绩管理系统是应用软件。
(5)某系统总体结构图如下所示:
XY系统
功能3
功能2
功能1
功能2.3
功能2.2
功能2.1
该系统总体结构图的深度是___________。
A)7B)6 C)3D)2
(5)C【解析】这里的深度是指软件系统总体结构层次。
(6)程序测试的任务是___________。
A)设计测试用例B)验证程序的正确性C)发现程序中的错误D)诊断和改正程序中的错误
(6)D【解析】程序测试包括模块测试、系统测试和验收测试三大部份。
模块测试是分别测试系统中每一模块功能是否满足设计要求;系统测试是确定子系统模块在联调时,能否协调地完成预定的功能;验收测试是为系统投入前实际使用的证明。
题目所问的主要是指模块测试。
(7)下列关于数据库设计的叙述中,正确的是___________。
A)在需求分析阶段建立数据字典 B)在概念设计阶段建立数据字典
C)在逻辑设计阶段建立数据字典 D)在物理设计阶段建立数据字典
(7)正确答案为A;网上错误答案为C【解析】根据“数据库系统概论”一书称,数据字典在“数据分析”阶段中由收集到的数据着手编制数据字典。
另据南大出版社“大学计算机信息技术教程”(第三版)称,数据库设计分“系统规划”、“系统分析”、“系统设计(由概念设计、逻辑设计和物理设计组成)”和“系统实施”组成。
编制数据流图(DFD)和数据字典(DD)是属于系统分析的任务。
(8)数据库系统的三级模式不包括___________。
A)概念模式B)内模式C)外模式D)数据模式
(8)D【解析】数据库系统的三级模式结构是指数据库系统是由模式、外模式和内模式三级构成的。
其中模式也称逻辑模式或概念模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
外模式也称用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
内模式也称存储模式,一个数据库只有一个内模式。
它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式,所以正确答案为D。
(9)有三个关系R、S和T如下:
RST
A
B
C
A
B
C
A
B
C
a
1
2
a
1
2
c
3
1
b
2
1
b
2
1
C
3
1
则由关系R和S得到关系T的操作是___________。
A)自然连接B)差C)交D)并
(9)B【解析】关系运算中传统运算有并、差、交和笛卡尔积;专门关系运算有选择、投影连接和除法运算。
根据题意R关系减去S得T关系为差运算,选B。
并差交选择投影
(10)下列选项中属于面向对象设计方法主要特征的是___________。
A)继承B)自顶向下C)模块化D)逐步求精
(10)A【解析】开发信息系统有结构化生命周期法(自顶向下、逐层分解、逐步求精分析系统和分模块实施)、原型法、面向对象开发设计方法(突出的是需求分析、可维护性和可靠性有突破,主要特征是继承性)和CASE法(ComputerAidedSoftwareEngineering)。
(11)以上叙述中错误的是___________。
A)C语言编写的函数源程序,其文件名后缀可以是C
B)C语言编写的函数都可以作为一个独立的源程序文件
C)C语言编写的每个函数都可以进行独立的编译并执行
D)一个C语言程序只能有一个主函数
(11)C【解析】C语言编写的某些函数是依附于主调函数而存在的,它不能独立编译并执行的。
(12)以下选项中关于程序模块化的叙述错误的是___________。
A)把程序分成若干相对独立的模块,便于编码和调试
B)把程序分成若干相对独立、功能单一的模块,可便于重复使用这些模块
C)可采用自底向上、逐步细化的设计方法把若干独立模块组装成所要求的程序
D)可采用自顶向下、逐步细化的设计方法把若干独立模块组装成所要求的程序
(12)C【解析】根据开发软件的生命周期法原则,是采用可采用自顶向下、逐步细化的设计方法把若干独立模块组装成所要求的程序,来完成程序模块化设计的。
(13)以下选项中关于C语言常量的叙述错误的是___________。
A所谓常量,是指在程序运行过程中,其值不能被改变的量
B)'常量分为整型常量、实型常量、字符常量和字符串常量
C)常量可分为数值型常量和非数值型常量D)经常被使用的变量可以定义成常量
(13)D【解析】常量是指在程序中不变的量,既然程序中已定义为变量,则不可能再定义为常量。
(14)若有定义语句:
inta=10;doubleb=3.14;,则表达式'A'+a+b值的类型是___________。
A).charB)intC)doubleD)float
(14)C【解析】根据表达式运算规则,所有数据在混合运算中,一律向上一级换算原则。
本题最高级是双精度,所以最后表达式类型应是double。
(清华大学出版社“C程序设计”P54)
(15)若有定义语句:
intx=12,y=8,z;,在其后执行语句z=0.9+x/y;,则z的值为___________。
A)1.9B)1C)2D)2.4
(15)B【解析】如第(14)解析所述,C语言对于表达式运算0.9+x/y后的值是1.9,但给整型量z值,则去掉小数为1。
(16)若有定义:
inta,b;,通过语句scanf("%d;%d",&a,&b);,能把整数3赋给a,5赋给b的输入数据是___________。
A)35B)3,5C)3;5D)35
(16)C【解析】根据清华大学出版社“C程序设计”P84“使用scanf函数时应注意的问题
(2)规定:
如果在格式控制字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符”,所以选C。
(17)i若有定义语句:
intk1=10,k2=20;,执行表达式(k1=k1>k2)&&(k2=k2>k1)后,k1和k2的值分别为___________。
A)0和1B)0和20 C)10和1D)10和20
(17)B【解析】根据清华大学出版社“C程序设计”P94关于逻辑表达式运算规定
(1),a&&b&&c,只要a为0,则不必判别b和c;若a为1才判别b;若b为0,则不必判别c。
现题目逻辑表达式左边(k1=k1>k2)为0,右边不再判别,所以答案是a为0;b仍为原值20。
(18)有以下程序
#include
main()
{inta=1,b=0;
if(--a)b++;
elseif(a==0)b+=2;
elseb+=3;
printf("%d\n",b);
}
程序运行后的输出结果是A)0B)1C)2D)3
(18)C【解析】此题非常简单,变量a运算前自减1,变为0,所以只执行了b+=2语句就输出为2。
(19)下列条件语句中,输出结果与其他语句不同的是___________。
A)if(a)printf("%d\n",x);elseprintf("%d\n",y);
B)if(a==0)printf("%d\n",y);elseprintf("%d\n",x);
C)if(a!
=0)printf("%d\n",x);elseprintf("%d\n",y);
D)if(a==0)printf("%d\n",x);elseprintf("%d\n",y);
(19)D【解析】当a为0时A)逻辑判断值为0,输出y;B)逻辑判断值为1,输出y;C)逻辑判断值为0,输出y;D)逻辑判断值a==0为1,输出x
(20)有以下程序段
#include
main()
{inta=7;
while(a--);
printf("%d\n",a);
}
程序运行后的输出结果是___________。
A)-1B)0C)1 D)7
(20)A【解析】while(a--);是一句无执行句的循环语句,且变量a是变为0后跳出循环,并且又自减1为-1。
(21)以下不能输出字符A的语句是___________。
(注:
字符A的ASCII码值为65,字符a的ASCII码值为97)A)printf("%c\n",'a'-32);B)printf("%d\n",'A');
C)printf("%c\n",65);D)printf("%c\n",'B'-1);
(21)B【解析】输出字符取决于输出语句的格式说明符,显然B)输出是数值65。
(22)有以下程序(注:
字符a的ASCII码值为97)
#include
main()
{char*s={"abc"};
do
{printf("%d",*s%10);++s;}while(*s);
}
程序运行后的输出结果是___________。
A)abcB)789C)7890D)979899
(22)B【解析】本题是考查考生能否区别“指针变量”与“指针变量的值”。
前者是地址;后者是指针变量所指地址内的量。
此题指针变量s指向“字符串数组”的起始地址,*s是s指向的字符,例如,刚开始时*s值为字符“a”,即数值97,++s后指针移向“b”,即数值98,当s移向字符c后面一个字符为”\0”,则其值为0,退出循环结束。
(23)若有定义语句:
doublea,*p=&a;以下叙述错误的是___________。
A)定义语句:
*号是一个简址运算符B)定义语句:
*号是一个说明符
C)定义语句中的p只能存放double类型变量的地址
D)定义语句中,*p=&a把变量a的地址作为初始值赋给指针变量p
(23)A【解析】*号是一种、表示单目运算的指针运算符,简称“简接访问运算符”
(24)有以下程序
#include
doublef(doublex);
main()
{doublea=0;inti;
for(i=0;i<30;i+=10)a+=f((double)i);
printf("%5.0f\n",a);
}
doublef(doublex)
{returnx*x+1;}
程序运行后的输出结果是_______。
A)503B)401 C)500D)1404
(24)A【解析】主函数循环为1.0+101.0+401.0=503.0,即a显示为503
(25)若有定义语句:
intyear=2009,*p=&year;,以下不能使变量year中的值增至2010的语句是_______。
A)*p+=1;B)(*p)++;C)++(*p);D)*p++;
(25)D【解析】此题测试考生对运算符优先级判别和表达式运算法则中结合方向的判断:
根据运算符优先级规定,*是2级,+=j是14级;++是2级。
A)*p+=1;等效于year=year+1B)(*p)++等效于year++(“C语言程序设计”P224)
C)++(*p)等效于year++D)*p++;由于两个运算符处于同一级别,且结合方向自右而左,等效于*(p++),这样p不指向year了,year维持不变,p指向year下一个地址的值,上机调试下一个地址的值为1245120。
详见“C语言程序设计”P224。
(26)以下定义数组的语句错误的是_______。
A)intnum[]={1,2,3,4,5,6};B)intnum[][3]={{1,2},3,4,5,6};
C)intnum[2][4]={{1,2},{3,4},{5,6}};D)intnum[][4]={1,2,3,4,5,6};
(26)C【解析】首先是测试数组下标的定义正确性,应该都是正确的;其次测试对数组赋值的正确性:
A)赋值后一维数组下标自动取6;
B)赋值后二维数组下标取为3行3列{{1,2,0},{3,4,0},{5,6,0}};
C)二维数组是二行四列,但赋了三行四列的值,调试时出现如下:
errorC2078:
toomanyinitializers
D)赋值后二维数组下标取为2行4列:
{{1,2,3,4},{5,6,0,0}}是正确的。
(27)有以下程序
#include
voidfun(int*p)
{printf("%d\n",p[5]);}
main()
{inta[10]={1,2,3,4,5,6,7,8,9,10};
fun(&a[3]);
}
程序运行后的输出结果是_______。
A)5B)6C)8D)9
(27)D【解析】本题考核考核学生掌握指针变量与数组之间关系,主函数将a[3]地址传给函数fun,此时函数fun中的*p接收的是以首地址值为4的数组p[7],故p[5]数组元素值应是9。
(28)有以下程序
#include
#defineN4
voidfun(inta[][N],intb[])
{inti;
for(i=0;i}
main()
{intx[N][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},y[N],i;
fun(x,y);
for(i=0;i}
程序运行后的输出结果是__。
A)-12,-3,0.0,B)-3,-3,1,3C)0,1,2,3D)-3,-3,-3,-3
(28)B【解析】由于函数调用采用数组名为首地址共享方式,只要判别b[0]、b[3]即可确定答案:
由函数fun中b[0]=x[0][0]-x[0][3]=1-4=-3确定答案只有A和D;其次计算b[3]=x[3][3]-x[3][0]=16-13=3。
由此可知答案是B。
(29)有以下函数
intfun(char*x,char*y)
{intn=0;
while((*x==*y)&&*x!
='\0'){x++;y++;n++;}
returnn;
}
函数的功能是_______。
A)查找x和y所指字符串中有否有'\0'
B)统计x和y所指字符串中最前面连续相同的字符个数
C)将y所指字符串中赋给x所指的存储空间D)统计x和y所指字符串中相同的字符个数
(29)B【解析】循环执行只有在x和y所指字符串中最前面连续相同,并统计其个数(存放在变量n中),一旦不满足连续相同,则终止循环而函数返回相同个数n。
(30)若有定义语句:
char*s1="OK",*s2="ok";,以下选项中,能够输出"OK"的语句是_______。
A)if(strcmp(s1,s2)==0)puts(s1);B)if(strcmp(s1,s2)!
=0)puts(s2);
C)if(strcmp(s1,s2)==1)puts(s1);D)if(strcmp(s1,s2)!
=0)puts(s1);
(30)D【解析】字符串比较库函数strcmp要求两个参数是地址和设置头文件#include。
返回值:
s1s2为"1"。
且"OK"<"ok",只有A、C、D才能输出"OK",A)、C)被排除,剩下D),有可能存在关系:
s1>s2或s1严格来讲此题目应改为D)if(strcmp(s1,s2)<0)puts(s1);为妥。
(31)以下程序的主函数中调用了在其前面定义的fun函数
#include
∶
main()
{doublea[15],k;
k=fun(a);
∶
}
则以下选项中错误的fun函数的首部是_______。
A)doublefun(doublea[15])B)doublefun(double*a)
C)doublefun(doublea[])D)doublefun(doublea)
(31)D【解析】函数调用时要求数组地址共享,达到数据返回的目的。
要求主函数实参用数组名;被调函数的形参用A)doublea[15]、B)double*a、C)doublea[]均为合法。
D)形式参数是只进不出变量a。
(32)有以下程序
#include
#include
main()
{chara[5][10]={"china","beijing","you","tiananmen","welcome"};
inti,j;chart[10];
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
if(strcmp(a[i],a[j])>0)
{strcpy(t,a[i]);strcpy(a[i],a[j]);strcpy(a[j],t);}
puts(a[3]);
}
程序运行后的输出结果是___。
A)beijingB)chinaC)welcomeD)tiananmen
(32)C【解析】这是一个字符串升序排列程序,最后排成次序为:
beijingchinatiananmenwelcomeyou并存放在字符串数组a[5]中。
puts(a[3]);输出为C)welcome
(33)有以下程序
#include
intf(intm)
{staticintn=0;
n+=m;
returnn;
}
main()
{intn=0;
printf("%d,",f(++n));
printf("%d\n",f(n++));
}
程序运行后的输出结果是_______。
A)1,2B)1,1C)2,3D)3,3
(33)A【解析】所有函数中变量初始值为随机数,但含有static的变量属于静态变量,初始值为0,且主调函数调用后不释放,再次调用时能在上次调用后值的基础上,再次参加运算。
所以主函数第一次调用显示“1,”,第二次调用,由于n++,所以显示为1+1=2。
(34)有以下程序
#include
main()
{charch[3][5]={"AAAA","BBB","CC"};
printf("%s\n",ch[1]);
}
程序运行后的输出结果是_______。
A)AAAAB)CCC)BBBCCD)BBB
(34)D【解析】对于字符串二维数组,每一个字符串,均可用一维数组来表示。
即ch[0]表示AAAA;ch[1]表示BBB;ch[2]表示CC。
(35)有以下程序
#include
#include
voidfun(char*w,intm)
{chars,*p1,*p2;
p1=w;p2=w+m-1;
while(p1}
main()
{chara[]="123456";
fun(a,strlen(a));puts(a);
}
程序运行后的输出结果是______。
A)654321B)116611C)161616D)123456
(35)A【解析】被调函数是一个将共享地址的字符串变量倒序重排后返回的通用函数。
第一次s=*p1;*p1=*p2;*p2=s;是:
w数组,亦即a数组变为623451…….
(36)有以下程序
#include