09计算机二级C语言笔试真题文字word版 详细答案解析.docx
《09计算机二级C语言笔试真题文字word版 详细答案解析.docx》由会员分享,可在线阅读,更多相关《09计算机二级C语言笔试真题文字word版 详细答案解析.docx(19页珍藏版)》请在冰豆网上搜索。
09计算机二级C语言笔试真题文字word版详细答案解析
二级c真题
一、选择题
在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分。
(1)下列叙述中正确的是
A)线性表的链式存储结构与顺序存储结构所需要的存储空间是相同的
B)线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构
C)线性表的链式存储结构所需要的存储空间一般要少于顺序存储结构
D)上述三种说法都不对
(1)B
线性表的顺序存储结构是把线性表中相邻的元素存放在相邻的内存单元中,而链式存储结构是用一组任意存储单元来存放表中的数据元素,为了表示出每个元素与其直接后继元素之间的关系,除了存储元素本身的信息外,还需存储一个指示其直接后继的存储位置信息。
故线性表的链式存储结构所需的存储空间一般要多于顺序存储结构,答案为B)。
(2)下列叙述中正确的是
A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化
B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化
C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化
D)上述三种说法都不对
(2)C
栈是限定在一端进行插入与删除的线性表,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。
当有新元素进栈时,栈顶指针向上移动;当有元素出栈时,栈顶指针向下移动。
在栈中栈底指针不变,栈中元素随栈顶指针的变化而动态变化,故答案为C)。
(3)软件测试的目的是
A)评估软件可靠性B)发现并改正程序中的错误
C)改正程序中的错误D)发现程序中的错误
(3)D
软件测试的目的是为了发现程序中的错误而运行程序。
(4)下面描述中,不属于软件危机表现的是
A)软件过程不规范B)软件开发生产率低
C)软件质量难以控制D)软件成本不断提高
4)A
软件危机是计算机软件在它的开发和维护过程中所遇到的一系列严重问题。
主要表现在以下几个方面:
软件需求的增长得不到满足;软件开发成本和进度无法控制;软件质量难以保证;软件可维护性差;软件的成本不断提高;软件开发生产率的提高赶不上硬件的发展和应用需求的增长。
故答案选A)。
(5)软件生命周期是指
A)软件产品从提出、实现、使用维护到停止使用退役的过程
B)软件从需求分析、设计、实现到测试完成的过程
C)软件的开发过程
D)软件的运行维护过程
(5)A
通常将软件产品从提出、实现、使用维护到使用、退役的过程称为软件生命周期。
故答案为A)。
(6)面向对象方法中,继承是指
A)一组对象所具有的相似性质B)一个对象具有另一个对象的性质
C)各对象之间的共同性质D)类之间共享属性和操作的机制
(6)D
继承是面向对象方法的一个重要特征。
广义地说,继承是指能够直接获得已有的性质和特征,不必重复定义它们。
在面向对象的软件技术中,继承是指子类自动地共享基类中定义的数据和方法的机制,故答案为D)。
(7)层次型、网状型和关系型数据库划分原则是
A)记录长度B)文件的大小
C)联系的复杂程度D)数据之间的联系方式
(7)D
数据库按数据模型分为层次型数据库、网状型数据库、关系型数据库,数据模型即数据之间的联系方式,故答案为D)。
(8)一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员
与实体计算机之间的联系是
A)一对一B)一对多C)多对多D)多对一
(8)C
两个实体间的联系可分为3种类型:
①一对一联系,表现为主表中的一条记录与相关表中的一条记录相关联;②一对多联系,表现为主表中的一条记录与相关表中的多条记录相关联;③多对多联系,表现为主表中的多条记录与相关表中的多条记录相关联。
本题中一个工作人员可以使用多台计算机,一台计算机可被多个人使用。
故答案为C)。
(9)数据库设计中反映用户对数据要求的模式是
A)内模式B)概念模式C)外模式D)设计模式
(9)C
模式的3个级别反映了模式的3个不同环境,以及对它们的不同要求。
其中,内模式处于最低层,它反映了数据在计算机物理结构中的实际存储形式,概念模式处于中层,它反映了设计者的数据全局逻辑要求,而外模式是处于最高层,反映了用户对数据的要求。
故答案选C)。
(10)有三个关系R、S和T如下:
则由关系R和S得到关系T的操作是
A)自然连接B)交C)投影D)并
(10)A
自然连接是最常用的一种连接,它满足下面的条件:
①两关系有公共域;②通过公共域的相等值进行连接,故答案为A)。
(11)以下关于结构化程序设计的叙述中正确的是
A)一个结构化程序必须同时由顺序、分支、循环三种结构组成
B)结构化程序使用goto语句会很便捷
C)在C语言中,程序的模块化是利用函数实现的
D)由三种基本结构构成的程序只能解决小规模的问题
(11)C
一个结构化程序可以由顺序、分支、循环三种结构组成,但不是必须同时都包括,可以包括其中的一个或多个,所以选项A)错误。
goto语句会破坏程序的结构性、可读性,不得以不要用,所以选项B)错误。
三种基本结构构成的程序也可以解决大规模的程序,所以选项D)错误。
在C语言中,利用函数来实现程序的模块化,C)正确。
(12)以下关于简单程序设计的步骤和顺序的说法中正确的是
A)确定算法后,整理并写出文档,最后进行编码和上机调试
B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档
C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档
D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构
(12)B
设计一个能解决实际问题的计算机程序需要经过以下几个过程:
①建立模型。
②算法设计:
给出解决问题的步骤,即算法。
③算法表达:
选择一种表达算法的工具,对算法进行清晰的表达。
④编写程序:
选择一种程序设计语言,把以上算法程序化,这称为编写程序。
⑤程序调试:
对编写好的程序进行调试,修改程序中的错误。
⑥程序文档编写与程序维护。
综上所述,B)选项是符合上述描述的,其他选项不恰当。
(13)以下叙述中错误的是
A)C程序在运行过程中所有计算都以二进制方式进行
B)C程序在运行过程中所有计算都以十进制方式进行
C)所有C程序都需要编译链接无误后才能运行
D)C程序中整型变量只能存放整数,实型变量只能存放浮点数
(13)B
C程序在运行过程中所有计算都以二进制方式进行,所以A)正确B)错误。
所有C程序先编译再链接,全都无误后才能运行。
C程序中整型变量用于存放整数,实型变量用于存放浮点数。
所以,本题答案为B)。
(14)有以下定义:
inta;longb;doublex,y;则以下选项中正确的表达式是
A)a%(int)(x-y)B)a=x!
=y;C)(a*y)%bD)y=x+y=x
(14)B
A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。
C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。
D)选项表达式本身就错误,不能给表达式赋值。
所以,本题答案为B)。
(15)以下选项中能表示合法常量的是
A)整数:
1,200B)实数:
1.5E2.0C)字符斜杠:
'\'D)字符串:
"\007"
(15)D
A)选项中1,200不能表示整数1200。
B)选项中应表示为1.5E2。
在C语言中,反斜杠是转义符,其后必须跟有其他字符,所以选项C)也是错误的。
D)选项正确。
(16)表达式a+=a-=a=9的值是
A)9B)-9C)18D)0
(16)D
题干中的表达式可以分解为以下表达式:
①a=9;②a=a-a即a=9-9,此时a的值为0;③a=a+a即a=0+0,此时a的值为0。
故本题的答案为D)。
(17)若变量已正确定义,在if(W)printf("%d\n",k);中,以下不可替代W的是
A)a<>b+cB)ch=getchar()C)a==b+cD)a++
(17)A
在C语言中,表示不等于不能用"<>",而只能使用"!
="。
其他选项均满足题目的要求。
(18)有以下程序
#include
main()
{ inta=1,b=0;
if(!
a)b++;
elseif(a==0)if(a)b+=2;
elseb+=3;
printf("%d\n",b);
}
程序运行后的输出结果是
A)0B)1C)2D)3
18)A
根据在if…else语句中,else总是和最近的if配对的原则,本题中层次关系是:
if(!
a)与elseif(a==0)是一组,在最外层。
而if(a)与else是一组,位于elseif(a==0)条件的内层。
据此所有条件均不成立,所以b未进行任何操作仍为初始值0。
(19)若有定义语句inta,b;doublex;则下列选项中没有错误的是
A)switch(x%2)B)switch((int)x/2.0)
{case0:
a++;break; {case0:
a++;break;
case1:
b++;break; case1:
b++;break;
default:
a++;b++; default:
a++;b++;
} }
C)switch((int)x%2)D)switch((int)(x)%2)
{case0:
a++;break; {case0.0:
a++;break;
case1:
b++;break; case1.0:
b++;break;
default:
a++;b++; default:
a++;b++;
} }
(19)C
switch()中括号内的变量类型应该与下面case语句后的常量保持类型一致。
使用(int)x,可以将x强制转换成整型,然后与整型2做取余运算还是整型数据。
若与数据2.0做取余运算,按照转换原理:
向高精度的数据类型进行转换,结果就变成了实型数据。
综上所述,本题C)正确,B)错误。
A),D)均不满足switch语句的原则。
(20)有以下程序
#include
main()
{ inta=l,b=2;
while(a<6){b+=a;a+=2;b%=10;}
printf("%d,%d\n",a,b);
}
程序运行后的输出结果是
A)5,11B)7,1C)7,11D)6,1
(20)B
第一次循环后b为3,a为3;第二次循环后b为6,a为5;第三次循环:
执行b+=a,所以b为11;执行a+=2所以a为7;执行b%=10,所以b为1。
(21)有以下程序
#include
main()
{inty=10;
while(y--);
printf("y=%d\n",y);
}
程序执行后的输出结果是
A)y=0B)y=-1
C)y=lD)while构成无限循环
(21)B
当y减为1时判断while(y--),此时满足条件,但是y变成0。
下次循环判断while(y--)时,因为y为0不满足条件跳出循环,但是此时也要执行y--,所以y变成了-1。
打印输出时输出-1。
(22)有以下程序
#include
main()
{chars[]="rstuv";
printf("%c\n",*s+2);
}
程序运行后的输出结果是
A)tuvB)字符t的ASCII码值
C)tD)出错
(22)C
*s+2相当于(*s)+2即先取出s所指的数据然后对其加2,s是字符串的首地址,所以*s即s[0]就是字符"r",所以在它的ASCII码上加上数字2就变成了字母"t"的ASCII码,所以以%c格式输出,即为选项C)。
(23)有以下程序
#include
#include
main()
{ charx[]="STRING";
x[0]=0;x[1]='\0';x[2]='0';
printf("%d %d\n",sizeof(x),strlen(x));
}
程序运行后的输出结果是
A)6 1B)7 0C)6 3D)7 1
(23)B
sizeof是返回字符串在内存中所占用的空间,是真正的长度。
strlen是返回字符串的长度,strlen遇到'\0'就结束,而且不包括'\0'。
(24)有以下程序
#include
intf(intX);
main()
{ intn=1,m;
m=f(f(f(n)));printf("%d\n",m);
}
intf(intx)
{ returnx*2;}
程序运行后的输出结果是
A)1B)2C)4D)8
(24)D
第一次调用的是最内层的f(n),即f
(1)返回值2。
第二次调用中间的f(f(n)),即f
(2)返回值4。
最后调用最外层的f(f(f(n))),即f(4)返回值8,最后打印输出。
(25)以下程序段完全正确的是
A)int*p;scanf("%d",&p);B)int*p;scanf("%d",p);
C)intk,*p=&k;scanf("%d",p);D)intk,*p;*p=&k;scanf("%d",p);
(25)C
A)选项输入的是指针型变量p的地址,变量一定义就已分配好了地址不能再指定了,所以A错误。
B)选项没有指定指针p应该指向的变量,没给变量赋初值。
D)选项中,p是地址,*p是地址内存放的数据,它把整型变量k的地址赋给了*p,所以错误。
(26)有定义语句:
int*p[4];以下选项中与此语句等价的是
A)intp[4];B)int**p;C)int*(p[4]);D)int(*p)[4];
(26)C
题目中声明的p表示的是有4个整数指针元素的数组。
A选项表示有四个整数元素的数组。
B选项表示一个指向整数指针的指针。
D选项声明了一个指针变量,它指向的是含4个元素一维数组。
所以本题答案为C)。
(27)下列定义数组的语句中,正确的是
A)intN=10;B)#defineN10C)intx[0..10];D)intx[];
intx[N]; intx[N];
(27)B
A)中的N是一个变量,不可以用变量来定义数组,所以选项A)错误。
C)中把所有的下标均列出不正确,此处只需指明数组长度即可。
D)中在定义时没有指明数组长度不正确,如果不指明长度就应在定义时对数组元素进行赋值,而此选项没有,所以错误。
故本题答案为B)。
(28)若要定义一个具有5个元素的整型数组,以下错误的定义语句是
A)inta[5]={0};B)intb[]={0,0,0,0,0};
C)intc[2+3];D)inti=5,d[i];
(28)D
在进行数组的定义时,不能使用变量对数组的长度进行定义。
其他选项均符合数组定义标准。
(29)有以下程序
#include
voidf(int*p);
main()
{ inta[5]={1,2,3,4,5},*r=a;
f(r);printf("%d\n",*r);
}
voidf(int*p)
{ p=p+3;printf("%d,",*p);}
程序运行后的输出结果是
A)1,4B)4,4C)3,1D)4,1
(29)D
指针r所指的位置一直是数组a的起始地址即a[0]的地址,而形参p通过传递参数开始也指向a数组起始地址,但通过p=p+3后指向了a[3]的地址,所以先打印输出a[3]中数据"4",然后返回主函数输出r所指a[0]中数据"1"。
(30)有以下程序(函数fun只对下标为偶数的元素进行操作)
#include
voidfun(int*a,intn)
{ inti,j,k,t;
for(i=0;i{ k=i;
for(j=i;ja[k])k=j;
t=a[i];a[i]=a[k];a[k]=t;
}
}
main()
{ intaa[10]={1,2,3,4,5,6,7},i;
fun(aa,7);
for(i=0;i<7;i++)printf("%d,",aa[i]);
printf("\n");
}
程序运行后的输出结果是
A)7,2,5,4,3,6,1,B)1,6,3,4,5,2,7,
C)7,6,5,4,3,2,l,D)1,7,3,5,6,2,1,
(30)A
由函数fun(int*a,intn)中语句if(a[j]>a[k])k=j;可知当前k是记录数组中较大数据值所在位置的下标变量,所以该函数的作用是对数组a中的下标为偶数位置的数据进行从大到小的排序,即对a[0],a[2],a[4],a[6]中的数据1,3,5,7进行从大到小的排序,其他位置的数据不变,所以答案为A)。
(31)下列选项中,能够满足"若字符串s1等于字符串s2,则执行ST"要求的是
A)if(strcmp(s2,s1)==0)ST;B)if(sl==s2)ST;
C)if(strcpy(s1,s2)==1)ST;D)if(sl-s2==0)ST;
31)A
函数strcmp(s2,s1)的作用是比较大小,函数strcpy(s1,s2)的作用是进行字符串复制,所以选择A)选项。
B)和D)都是比较的字符串s1与s2的地址是否一致而不是比较字符串内容是否一致。
(32)以下不能将s所指字符串正确复制到t所指存储空间的是
A)while(*t=*s){t++;s++;}B)for(i=0;t[i]=s[i];i++);
C)do{*t++=*s++;}while(*s);D)for(i=0,j=0;t[i++]=s[j++];);
(32)C
C)选项中,当复制完s所指字符串的最后一个非'\0'字符后,指针s指向了'\0',循环结束,没有将字符串结束符0复制到t中,因此C)选项是错误的。
(33)有以下程序(strcat函数用以连接两个字符串)
#include
#include
main()
{ chara[20]="ABCD\0EFG\0",b[]="IJK";
strcat(a,b);printf("%s\n",a);
}
程序运行后的输出结果是
A)ABCDE\0FG\0IJKB)ABCDIJK
C)IJKD)EFGIJK
(33)B
char*strcat(char*dest,char*src)的功能是:
把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
因为'\0'是字符串的结束标志,所以a数组中存放的字符串为"ABCD",所以将两个字符串拼接后结果为"ABCDIJK"。
(34)有以下程序,程序中库函数islower(ch)用以判断ch中的字母是否为小写字母
#include
#include
voidfun(char*p)
{ inti=0;
while(p[i])
{ if(p[i]==''&&islower(p[i-1]))p[i-1]=p[i-1]-'a'+'A';
i++;
}
}
main()
{ charsl[100]="abcdEFG!
";
fun(s1);printf("%s\n",s1);
}
程序运行后的输出结果是
A)abcdEFG!
B)AbCdEFg!
C)aBcDEFG!
D)abcdEFg!
(34)C
intislower(charch)的功能是判断字符c是否为小写英文字母,当ch为小写英文字母(a-z)时,返回非零值,否则返回零。
后面语句p[i-1]=p[i-1]-'a'+'A'的作用是把小写字母转化为大写字母。
根据判断条件可知,只有当空格字符的前一个字符为小写字符时才把该小写字符变成大写,所以选择C)。
(35)有以下程序
#include
voidfun(intx)
{ if(x/2>1)fun(x/2);
printf("%d",x);
}
main()
{ fun(7);printf("\n");}
程序运行后的输出结果是
A)137B)731C)73D)37
(35)D
本程序是一个递归函数,第一次实参为7,第二次为3,此时不满足条件,因为3/2结果为1,等于1而不大于1,所以跳过fun(x/2)语句,执行printf语句,即打印出3。
然后向上返回到第一次调用打印出7。
(36)有以下程序
#include
intfun()
{ staticintx=1;
x+=1;returnx;
}
main()
{ inti,s=1;
for(i=l;i<=5;i++)s+=fun();
printf("%d\n",s);
}
程序运行后的输出结果是
A)11B)21C)6D)120
(36)B
本题目fun()函数中定义的变量x为静态局部变量, 第一循环后x的值为2,s的值为3;第二次循环后x的值为3,s的值为6;第三次循环后x的值为4,s的值为10;第四次循环后x的值为5,s的值为15;第五次循环后x的值为6,s的值为21。
(37)有以下程序
#include
#include
main()
{ int*a,*b,*c;
a=b=c=(int*)malloc(sizeof(int));
*a=1;*b=2,*c=3;
a=b;
printf("%d,%d,%d\n",*a,*b,*c);
}
程序运行后的输出结果是
A)3,3,3B)2,2,3C)1,2,3D)l,l,3
(37)A
根据程序可以分析出系统只分配了一个整型数据的存储空间,把这个空间的地址分别赋给了指针型变量a、b和c。
程序利用指针a把数据1写入了该空间,然后利用指针b,把数据2写入该空间,所以原来的1就被覆盖掉了,最后用指针c把数据3写入该空间把数据2覆盖掉了,此空间中最后留有的数据是3。
因为3个指针都指向该空间,所以输出数据均为3。
(38)有以下程序
#include
main()
{ ints,t,A=10;doubleB=6;
s=sizeof(A);t=sizeof(B);
printf("%d,%d\n",s,t);
}
在VC6平台上编译运行,程序运行后的输出结果是
A)2,4B)4,4C)4,8D)10,6
(38)C
sizeof的作用就是返回一个对象或者类型所占的内存字节数。
在VC6中整型占4个字节,双精度实型占8个字节,所以选C)。
(39)若有以下语句
typedefstructS
{ intg;charh; }T;
以下叙述中正确的是
A)可用S定义结构体变量B)可用T定义结构体变量
C)S是struct类型的变量D)T是structS类型的变量
(39)B
此题考察的是结构体的定义方式。
S是我们定义的结构体的名字,在题目中顺