二级C语言笔试386.docx
《二级C语言笔试386.docx》由会员分享,可在线阅读,更多相关《二级C语言笔试386.docx(29页珍藏版)》请在冰点文库上搜索。
二级C语言笔试386
二级C语言笔试-386
(总分:
100.00,做题时间:
90分钟)
一、选择题(总题数:
40,分数:
40.00)
1.线性表是一个()。
A)有限序列,可以为空B)有限序列,不能为空
C)无限序列,可以为空D)无限序列,不能为空
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]线性表简称为表,是零个或多个元素的有穷序列,通常可以表示成k0,k1,kn-1(n≥1),表中所含元素的个数称为表的长度,长度为零的表称为空表。
2.栈和队列的共同特点是()。
A)都是先进先出B)都是先进后出
C)只允许在端点处插入和删除元素D)没有共同点
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]考查对栈和队列概念的掌握。
栈和队列都是一种特殊的操作受限的线性表,只允许在端点处进行插入和删除。
二者的区别是:
栈只允许在表的一端进行插入或删除操作,是一种“后进先出”的线性表;而队列只允许在表的一端进行插入操作,在另一端进行删除操作,是一种“先进先出”的线性表。
3.如果进栈序列为e1,e2,e3,e4,则可能的出栈序列是()。
A)e3,e1,e4,e2B)e2,e4,e3,e1C)e3,e4,e1,e2D)任意顺序
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]由栈“后进先出”的特点可知:
A)中e1不可能比e2先出,C)中e1不可能比e2先出,D)中栈是先进后出的,所以不可能是任意顺序。
B)中出栈过程如下图所示:
4.面向对象程序设计中程序运行的最基本实体是()。
A)对象B)类C)方法D)函数
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]面向对象程序由若干个对象构成;结构化程序由数据和相应算法构成。
5.下列选项中不属于软件生命周期开发阶段任务的是()。
A)软件测试B)概要设计C)软件维护D)详细设计
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]软件生命周期由软件定义、软件开发和软件维护三个时期组成。
软件开发时期是具体设计和实现在前一时期定义的软件,它通常由下面五个阶段组成:
概要设计、详细设计、编写代码、组装测试和确认测试。
6.数据流图用于抽象描述一个软件的逻辑模型,由一些特定的图符构成。
下列图符名标识的图符不属于数据流图合法图符的是()。
A)控制流B)加工C)数据存储D)源和潭
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]数据流图中的主要图形元素有加工、数据流、存储文件、源和潭。
7.下列叙述中正确的是()。
A)软件测试应该由程序开发者来完成
B)程序经调试后一般不需要再测试
C)软件维护只包括对程序代码的维护
D)以上三种说法都不对
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]因为测试的目的在于发现错误,从心理学角度讲,由程序的编写者自己进行测试是不合适的,为了达到最好的测试效果,应该由独立的第三方进行测试工作,所以选项A)错误;程序调试,修改一个错误的同时可能引入了新的错误,解决的办法是在修改了错误之后,必须进行回归测试,所以选项B)错误;所谓软件维护,就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程,可见选项C)也是错误的。
8.VisualFoxPro关系数据库管理系统能够实现的三种基本关系运算是()。
A)索引、排序、查找B)建库、录入、排序
C)选择、投影、连接D)显示、统计、复制
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]关系数据库管理系统能够实现的三种基本关系运算是选择(从关系中找出满足给定条件的元组的操作称为选择)、投影(从关系模式中指定若干个属性组成新的关系)、连接(是关系的横向组合)。
9.单个用户使用的数据视图的描述称为()。
A)外模式B)概念模式C)内模式D)存储模式
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]选项A)正确,外模式是用户的数据视图,也就是用户所见到的数据模式;选项B)不正确,全局数据视图的描述称为概念模式,即数据库中全部数据的整体逻辑结构的描述;选项C)不正确,物理存储数据视图的描述称为内模式,即数据库在物理存储方面的描述;选项D)不正确,存储模式即为内模式。
10.数据库设计的四个阶段是:
需求分析、概念设计、逻辑设计和()。
A)编码设计B)测试阶段C)运行阶段D)物理设计
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]数据库的生命周期可以分为两个阶段:
一是数据库设计阶段;二是数据库实现阶段。
数据库的设计阶段又分为四个子阶段:
需求分析、概念设计、逻辑设计和物理设计。
因此,本题的正确答案是D)。
11.以下叙述中错误的是()。
A)C语言是一种结构化程序设计语言
B)结构化程序由顺序、分支、循环三种基本结构组成
C)使用三种基本结构构成的程序只能解决简单问题
D)结构化程序设计提倡模块化的设计方法
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]本题考查的知识点是结构化程序设计。
结构化程序由3种基本结构组成:
顺序结构、选择结构和循环结构。
已经得到证明,由3种基本结构组成的算法结构可以解决任何复杂的问题。
故本题中选项C)是错误的。
12.下列叙述中正确的是()。
A)每个C程序文件中都必须要有一个main()函数
B)在C程序中main()函数的位置是固定的
C)C程序中所有函数之间都可以相互调用,与函数所在位置无关
D)在C程序的函数中不能定义另一个函数
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]本题考查的知识点是函数。
每一个C程序中都必须有且只有一个main()函数,但一个C程序可以由多个程序文件组成,所以并非每个C程序文件中都必须要有一个main()函数,故选项A)不正确。
C语言并未对main()函数的位置作要求,因此选项B)也是错误的。
C语言中,在一个函数被调用之前一定要先声明该函数,所以定义靠后的函数若在前面没有声明该函数的原型,是不能被定义靠前的函数所调用的,即函数之间的调用并非与函数所在位置无关,所以选项C)不正确。
故本题的正确答案应该为选项D)。
13.有以下程序段:
charch;intk;
ch='a';k=12;
printf("%c,%d,",ch,ch,k);printf("k=%d/n",k);
已知字符a的ASCII十进制代码为97,则执行上述程序段后输出结果是()。
A)因变量类型与格式描述符的类型不匹配输出无定值
B)输出项与格式描述符个数不符,输出为零值或不定值
C)a,97,12k=12
D)a,97,k=12
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]本题主要考查的是标准输出函数printf。
printf函数在进行参数匹配时,并不会检查参数类型是否一一匹配,也不会检查参数个数是否一致,而是从它认为应该是第1个参数地址的内存位置开始,依次将内存中的内容逐个匹配给格式化字符串内所给定的各个类型。
因此,前一个printf调用,两个ch分别匹配给%c和%d,而参数k多余,被抛弃。
所以会输出“a,97,”(字符a的ASCII值为97)。
后一个printf很正常,这里就不解释了。
故应该选择D)。
14.设有定义:
inta;floatb;,执行scanf("%2d%f",&a,&b);语句时,若从键盘输入876543.0<回车>,a和b的值分别是()。
A)876和543.000000B)87和6.000000
C)87和543.000000D)76和543.000000
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]本题考查了格式输入函数scanf()的运用。
scanf()函数的一般形式为:
scanf格式控制,地址表列)。
其中,“格式控制”是用双引号括起来的字符串,也称“转换控制字符串”,它包括两种信息:
①格式说明,由“%”和格式字符组成;
②普通字符,即需要原样输入的字符。
“地址表列”是需要接收输入数据的一系列变量的地址。
本题中的“格式控制”是“%2d%f”,其中%2d的意思是要输入一个整数,但该整数最宽只占2个字符,而%f是要输入一个浮点数。
而题目要求输入的是876543.0,所以scanf()函数将87赋给a,6赋给b。
15.在执行下述程序日寸,若从键盘输入6和8,则结果为()。
main()
inta,b,s;
scanf("%d%d",&a,&b);
s=a;
if(a<b)
s=b;
s*-=s;
printf("%d",s);
A)36B)64C)48D)以上都不对
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]本题中a的值为6,b的值为8,最后s的值为8,s*=s等价于s=s*s。
16.下列条件语句中,功能与其他语句不同的是()。
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);
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]本题考核的知识点是if语句的用法。
选项A)、选项B)和选项C)都是在a的值为0的时候输出y,a不为0的时候输出x,而选项D)是在a为0的时候输出x,a不为0的时候输出y。
所以,4个选项中选项D)符合题意。
17.有以下程序:
main()
intk=5,n=0;
do
switch(k)
case1:
case3:
n+=1;k--;break;
default:
n=0;k--;
case2:
case4:
n+=2;k--;break;
printf("%d",n);
while(k>0&&n<5);
程序运行后的输出结果是()。
A)235B)0235C)02356D)2356
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]本题主要考查的知识点是switch语句。
因为变量的初始值分别为“k=5,n=0”,所以程序第一次进入循环时,执行default语句,这时k=4,执行“case4:
”这个分支,结果是“n=2,k=3”,打印出2;程序然后进行第二次循环,这时“n=2,k=3”,执行“case3:
”这个分支,结果是“n=3,k=2”,打印出3;程序进行第三次循环,这时“n=3,k=2”,执行“case2:
case4:
”这两个分支,结果是“n=5,k=1”,打印出5,这时因为n=5不满足n<5的循环条件,因此退出循环,程序运行结束,故输出结果为235。
18.下面的for语句:
for(intx=0,y=10;(y>0)&&(x<4);x++,y--);
则下面叙述中正确的是()。
A)是无限循环B)循环次数不定
C)循环执行4次D)循环执行三次
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]本题考查的知识点是for循环语句的应用。
本题首先要看出for循环条件的基本形式(;;),当循环执行4次时,x++使x变为4,此时不满足判断条件,结束循环。
故C)为正确答案。
19.下列选项中C语言中不合法的字符串常量的是()。
A)"/1"B)'2y1'C)"/n/n"D)"ABCD/x6d/
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]字符串常量是由双引号括起来的一串字符,其中的双引号不可缺少。
由此可知,选项A)、C)、D)都是合法的字符串常量,而选项B)是一个字符常量。
20.已知字符'A'的ASCII码值是65,字符变量c1的值是'A',c2的值是'D'。
执行语句printf("%d,%d",c1,c2-2);后,输出结果是()。
A)A,BB)A68C)65,66D)65,68
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]在C语言中,字符型数据在内存中的存储形式是ASCII码值。
当需要以整型格式输出字符时,输出的也是ASCII码值。
字符'A'和'D'的ASCII码值分别为65和68。
21.以下程序中函数f的功能是:
当flag为1时,进行由小到大排序;当flag为0时,进行由大到小排序。
#include<stdio.h>
voidf(intb[],intn,intflag)
inti,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(flag?
b[i]>b[j]:
b[i]<b[j])
t=b[i];b[i]=b[j];b[j]=t;
main()
(inta[10]=5,4,3,2,1,6,7,8,9,10,i;
f(&a[2],5,0);
f(a,5,1);
for(i=0;i<10;i++)
printf("%d,",a[i]);)
程序运行后的输出结果是()。
A)1,2,3,4,5,6,7,8,9,10,B)3,4,5,6,7,2,1,8,9,10,
C)5,4,3,2,1,6,7,8,9,10,D)10,9,8,7,6,5,4,3,2,1,
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]题目中先后两次调用了函数f()。
第1次,使用参数“&a[2],5,0”表示从数组a下标为2的元素开始,对其后的5个元素进行由大到小排序。
所以排序结果是{5,4,7,6,3,2,1,8,9,10}。
第2次,使用参数“a,5,1”表示从数组a的首元素开始,对其后5个元素进行由小到大排序。
所以排序结果是{3,4,5,6,7,2,1,8,9,10}。
故本题应该选择B)。
22.若有以下函数首部:
intfun(doublex[10],int*n)
则下面针对此函数的函数声明语句中正确的是()。
A)intfun(doublex,int*n);B)intfun(double,int);
C)intfun(double*x,intn);D)intfun(double*,int*);
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]本题考查的是函数的声明。
函数声明的一般形式为:
函数类型函数名(参数类型1[,参数名1],参数类型2[,参数名2]...);
其中,参数名也可以省略。
本题中的fun函数有两个参数,一个类型是double型一维数组,另一个是int型指针。
而在C语言中,一维数组用做函数参数和该数组元素的指针类型是等价的。
所以本题的正确答案是选项D)。
23.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是()。
main()
int*p,*q,a,b;
p=&a;
printf("inputa:
");
scanf("%d",*p);
A)*p表示的是指针变量p的地址
B)*p表示的是变量a的值,而不是变量a的地址
c)*表示的是指针变量p的值
D)*p只能用来说明p是一个指针变量
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]考查格式输入语句scanf的使用。
本题经过定义语句和赋值后,p表示的是变量a的地址,*p表示的是变量a的值。
24.有以下程序:
main()
inta[3][2]=0),(*ptr)[2],i,j;
for(i=0;i<2;i++)
pta+i;scanf("%d",ptr);ptr++;
for(i=0;i<3;i++)
for(j=0;j<2;j++)printf("%2d",a[i][j]);
printf("/n");
若运行时输入:
123<回车>,则输出结果为()。
A)产生错误信息
B)10
20
00
C)12
30
00
D)10
20
30
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]本题主要考查的是scanf()函数的输入原理。
scanf()函数执行时,先从键盘缓冲区中读取用户输入的数据,若缓冲区为空或输入数据少于所需数据,则暂停程序等待用户的输入,直到用户输入回车符,scanf()将继续到键盘缓冲区中读取输入,如此反复直到满足scanf()函数所需数据,程序才继续执行下面的语句,而scanf()没有取完的数据仍然会保存在键盘缓冲区内,到程序结束时还没取完就会被释放掉,不会影响其他的程序运行。
另外,scanf()函数将取到的数据匹配给第2个及其后面的指针参数所指的内存地址中去。
25.有以下程序:
#include<stdio.h>
voidsum(inta[])
a[0]=a[-1]+a[1];
main()
inta[10]=1,2,3,4,5,6,7,8,9,10;
sum(&a[2]);
printf("%d/n",a[2]);
程序运行后的输出结果是()。
A)6B)7C)5D)8
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]本题考查的是数组和函数。
sum()函数接收一个int型数组作参数,也可以把它看做是一个int型指针,语句a[0]=a[-1]+a[1];的意思是将参数指针指向内容的前一个元素和后一个元素的值相加放到指针所指的位置。
因此,主函数中调用sum(&a[2]);的意思就是让a[2]=a[1]+a[3];,所以最后输出的结果是6。
应该选择A)。
26.有以下程序:
#include<stdio.h>
main()
inti,s=0,t[]=1,2,3,4,5,6,7,8,9;
for(i=0;i<9;i+=2)s+=*(t+i);
printf("%d/n",s);
程序执行后的输出结果是()。
A)45B)20C)25D)36
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]本题考查的是数组名的概念。
当数组名出现在表达式中时,它类似于一个指针常量,该指针始终指向该数组第1个元素的位置,它的指向不能被改变。
但它又与普通的指针常量有所区别:
对数组名使用sizeof运算符时,得到整个数组所占内存的大小;而对于指针常量,在TC中返回的始终是2(TC中,一个指针占2个字节的内存)。
所以,要获得数组t的第i个元素的内容,既可以使用常规的t[i]表达式,也可以将数组名t看做一个指针常量,使用表达式*(t+i)来获取数组t的第i个元素的内容。
在本题中,for循环会循环5次,循环变量i从0开始每次增加2,所以s=t[0]+t[2]+t[4]+t[6]+t[8]=25。
27.有以下程序:
#include<stdio.h>
main()
inta[4][4]=1,4,3,2,(8,6,5,7),3,7,2,5,4,8,6,1,i,j,k,t;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
for(k-j+1;k<4;k++)
if(a[j][i]>a[k][i])
t=a[j][i];a[j][i]=a[k][i];a[k][i]=t;/*按列排序*/
for(i=0;i<4;i++)
printf("%d,",a[i][i]);
程序运行后的输出结果是()。
A)1,6,5,7,B)8,7,3,1,C)4,7,5,2,D)1,6,2,1,
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]题目中首先定义了一个二维数组a,并初始化为:
|1432|
|8657|
|3725|
|4861|
然后通过三重循环对数组a实行按列排序。
从if(a[j][i]>a[k][i]“当前面的元素大于后面的”则交换可以看出,排序是从小到大的,所以排序结束后,数组a的内容应该是:
|1421|小
|3632||
|4755|↓
|8867|大
最后通过一个for循环,依次输出a[0][0],a[1][1],a[2][2],a[3][3]的值,即输出1,6,5,7。
28.若有定义:
inta[2][3];,以下选项中对a数组元素正确引用的是()。
A)a[2][!
1]B)a[2][3]C)a[0][3]D)a[1>1][!
1]
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]本题主要考查的是二维数组的运用。
本题定义的二维数组a[2][3],其下标范围分别是0~1和0~2。
因此,选项A)、B)和C)都不正确。
选项D)中,表达式1>1的值是“假”,可以被看做整数“0”,表达式!
1的值也是“假”,所以整个a[1>1][!
1]就是a[0][0],这是对a数组元素的正确引用,故应该选择D)。
29.以下数组定义中错误的是()。
A)intx[][3]=0;B)intx[2][3]=1,2,3,4,5,6;
C)intx[][3]=1,2,3,4,5,6;D)intx[2][3]=1,2,3,4,5,6;
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]本题考核的知识点是二维数组的定义及初始化。
在定义一个二维数组同时初始化时,其第一维的长度可以省略。
二维数组的初始化列表可以只使