二级C语言 4套 选择题的副本.docx
《二级C语言 4套 选择题的副本.docx》由会员分享,可在线阅读,更多相关《二级C语言 4套 选择题的副本.docx(27页珍藏版)》请在冰点文库上搜索。
二级C语言4套选择题的副本
(1)设栈的顺序存储空间为S(0:
49),栈底指针bottom=49,栈顶指针top=30(指向栈顶元素)。
则栈中的元素个数为
A)30
B)29
C)20
D)19
答案:
C
【解析】栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。
入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。
元素依次存储在单元30:
49中,个数为
(2)下列叙述中错误的是
A)在双向链表中,可以从任何一个结点开始直接遍历到所有结点
B)在循环链表中,可以从任何一个结点开始直接遍历到所有结点
C)在线性单链表中,可以从任何一个结点开始直接遍历到所有结点
D)在二叉链表中,可以从根结点开始遍历到所有结点
答案:
C
【解析】线性单链表就是指线性表的链式存储结构,这种结构只能从一个节点遍历到其后的所有节点,故C选项叙述错误;在单链表的第一个节点前增加一个表头节点,队头指针指向表头节点,所以可以从任何一个节点开始直接遍历到所有节点,最后一个节点的指针域的值由NULL改为指向表头节点,这样的链表称为循环链表;双向链表是指链表节点含有指向前一个节点的指针和指向后一个节点的指针,所以可以从任何一个节点开始直接遍历到所有节点;二叉树链表中节点指针由父节点指向子节点,可以从根节点开始遍历到所有节点,所以选项A、B、D叙述均正确。
(3)某棵树只有度为3的结点和叶子结点,其中度为3的结点有8个,则该树中的叶子结点数为
A)15
B)16
C)17
D)不存在这样的树
答案:
C
【解析】树是一种简单的非线性结构,直观地来看,树是以分支关系定义的层次结构。
在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。
由于只有度为3的结点和叶子结点,可知最后一层都为叶子结点,倒数第二层一部分结点度为3,一部分为叶子结点,其余的结点的度均为3,计算度为3的结点总数(33-1-1)/2<8<(34-1-1)/2可知,树共有4层,前两层有度为3的结点(33-1-1)/2=4个,第三层有33=9个结点,其中4个是度为3的结点,5个是叶子结点,所以该树中的叶子结点数为4×3+5=17。
故选C选项
(4)某二叉树的前序序列为ABCDEFG,中序序列为DCBAEFG,则该二叉树的深度(根结点在第1层)为
A)2
B)3
C)4
D)5
答案:
C
【解析】深度,定义一棵树的根节点所在的层次为1,其他节点所在的层次等于它的父节点所在的层次加1,树的最大层次称为树的深度。
二叉树遍历可以分为3种:
前序遍历(访问根节点再访问左子树和访问右子树之前)、中序遍历(访问根节点在访问左子树和访问右子树两者之间)、后序遍历(访问根节点在访问左子树和访问右子树之后)。
二叉树的前序序列为ABCDEFG,A为根节点。
中序序列为DCBAEFG,可知DCB为左子树节点,EFG为右子树节点。
同理B为C父节点,C为D父节点。
同理E为F根节点,F为G根节点。
故二叉树深度为4层。
C选项正确。
(5)在长度为n的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。
A)O(n)
B)O(n2)
C)
D)
答案:
C
【解析】当有序线性表为顺序存储时才能用二分法查找。
可以证明的是对于长度为n的有序线性表,在最坏情况下,二分法查找只需要比较
次,而顺序查找需要比较n次。
(6)在最坏情况下
A)快速排序的时间复杂度比冒泡排序的时间复杂度要小
B)快速排序的时间复杂度比希尔排序的时间复杂度要小
C)希尔排序的时间复杂度比直接插入排序的时间复杂度要小
D)快速排序的时间复杂度与希尔排序的时间复杂度是一样的
答案:
C
【解析】对长度为n的线性表排序,下表为常用排序方法时间复杂度:
方法
平均时间
最坏情况时间
冒泡排序
O(n2)
O(n2)
直接插入排序
O(n2)
O(n2)
简单选择排序
O(n2)
O(n2)
快速排序
O(nlog2n)
O(n2)
堆排序
O(nlog2n)
O(nlog2n)
上表中未包括希尔排序,因为希尔排序的时间效率与所取的增量序列有关,如果增量序列为:
d1=n/2,di+1=di/2,在最坏情况下,希尔排序所需要的比较次数为O(n1.5)。
快速排序与冒泡排序的时间复杂度均为O(n2),A选项错误。
快速排序比希尔排序的时间复杂度要大(O(n2)>O(n1.5)),B选项错误。
希尔排序的时间复杂度比直接插入排序的时间复杂度要小(O(n1.5)快速排序比希尔排序的时间复杂度大(O(n2)>O(n1.5)),D选项错误。
(7)软件设计中模块划分应遵循的准则是( )。
A)低内聚低耦合
B)高内聚低耦合
C)低内聚高耦合
D)高内聚高耦合
答案:
B
【解析】软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适当、模块的依赖关系适当等。
模块的划分应遵循一定的要求,以保证模块划分合理,并进一步保证以此为依据开发出的软件系统可靠性强,易于理解和维护。
模块之间的耦合应尽可能的低,模块的内聚度应尽可能的高。
(8)下面属于白盒测试方法的是
A)等价类划分法
B)逻辑覆盖
C)边界值分析法
D)错误推测法
答案:
B
【解析】白盒测试法主要有逻辑覆盖、基本路径测试等。
逻辑覆盖测试包括语句覆盖、路径覆盖、判定覆盖、条件覆盖、判断-条件覆盖,选择B。
其余为黑盒测试法。
(9)有三个关系表R、S和T如下,其中三个关系对应的关键字分别为A,B和复合关键字(A,B)。
表T的记录项(b,q,4)违反了
A)实体完整性约束
B)参照完整性约束
C)用户定义的完整性约束
D)关系完整性约束
答案:
B
【解析】关系模型中可以有3类完整性约束:
实体完整性约束、参照完整性约束和用户定义的完整性约束。
实体完整性约束是指,若属性M是关系的主键,则属性M中的属性值不能为空值。
T中主键不为空,A选项错误。
参照完整性约束是指,若属性(或属性组)A是关系M的外键,它与关系M的主码相对应,则对于关系M中的每个元组在A上的值必须为:
要么取空值;要么等于关系M中某个元组的主码值。
属性B为关系S的外键,它与关系S的主键相对应,则T中元组在B上应该为空或者与S中主键值相等,题目中不相等,违反参照完整性约束,B选项正确。
此题关系中无语义要求,C选项错误。
(10)学生选课成绩表的关系模式是SC(S#,C#,G),其中S#为学号,C#为课号,G为成绩,检索课号为2且成绩及格的学生学号的表达式为
A)
B)
C)
D)
答案:
A
表示针对属性进行的投影运算,表示针对元组进行的选择运算,‘’表示交运算,‘’表示并运算。
要求检索结果为关系模式中的学生学号S#,首先在几种属性中选择学生学号,其次要在其中选择满足条件的元组,条件是课号为2且成绩及格,即为“”,故完整表达式为。
本题选A选项。
(11)以下叙述正确的是()。
A)计算机只接收由0和1代码组成的二进制指令或数据
B)计算机只接收由0和1代码组成的十进制指令或数据
C)计算机可直接接收并运行C源程序
D)计算机可直接接收并运行任意高级语言编写的源程序
答案:
A
【解析】计算机认识自己的母语--机器语言,即0和1代码组成的二进制指令或数据,故A选项正确,B选项错误。
C语言是一种高级语言,计算机不能直接运行C源程序和高级语言编写的源程序,C和D选项错误。
(12)在源程序的开始处加上
#include
进行文件引用的原因,以下叙述正确的是()。
A)stdio.h文件中包含标准输入输出函数的函数说明,通过引用此文件以便能正确使用printf、scanf等函数
B)将stdio.h中标准输入输出函数链接到编译生成的可执行文件中,以便能正确运行
C)将stdio.h中标准输入输出函数的源程序插入到引用处,以便进行编译链接
D)将stdio.h中标准输入输出函数的源程序插入到引用处,以便进行编译链接
答案:
A
【解析】stdio.h文件中包含标准输入输出函数的函数说明,预处理指令#include是使程序可以去该文件中找到printf,scanf等函数以便使用,因此答案为A选项。
(13)有以下程序
#include
main()
{
printf("%d\n",NULL);
}
程序运行后的输出结果是()。
A)0
B)变量无定义,输出不确定
C)-1
D)1
答案:
A
【解析】NULL是在stdio.h头文件中定义的预定义符,NULL的代码值为0,如果以整型格式输出则输出0。
A选项正确。
(14)有如下程序
#include
#include
main()
{
printf("%d\n",strlen("0\n011\1"));
}
程序运行后的输出结果是
A)6
B)8
C)9
D)4
答案:
A
【解析】由一对双引号括起来的一串字符为字符串。
字符常量是用一对单引号括起来的单个字符,还有一些特殊字符常量,即以“\”开头的转义字符。
“\”后可以为某些单个字符也可以为八进制或十六进制数字。
strlen函数统计字符串长度,遇到“\0”统计结束。
‘0’‘\n’‘0’‘1’‘1’‘\1’共6个字符,A选项正确。
(15)以下非法的定义语句是()。
A)longb=0L;
B)unsignedinta=-100u;
C)shortc2=0123;
D)intd=0x0;
答案:
B
【解析】unsigned定义的是"无符号数",则B选项定义错误,答案为B选项。
(16)不能正确表示数学式
的表达式是
A)a/c*b
B)a*b/c
C)a/b*c
D)a*(b/c)
答案:
C
【解析】/号和*号的优先级处于平级,结合性都是自左至右。所以选择C,C式子表示的是
。
(17)有以下程序
#include
main()
{
inta=2,c=5;
printf("a=%%d,b=%%d\n",a,c);
}
程序的输出结果是()。
A)a=2,b=5
B)a=%2,b=%5
C)a=%d,b=%d
D)a=%%d,b=%%d
答案:
C
【解析】C语言中用"%%"打印输出字符"%",所以%%d,输出为%d两个普通字符,而不是格式控制符"%d"的含义,所以打印结果为C。
(18)以下选项中错误的是()。
A)a&=b与a=a&b等价
B)a^=b与a=a^b等价
C)a|=b与a=a|b等价
D)a!
^=b与a=a!
^b等价
答案:
D
【解析】D选项中,a!
=b表示a不等于b时,运算结果为1,或者为0;而a=a!
b是一种语法错误,!
是非运算,且是单目运算符,只要求有一个操作数,故两者不等价,答案为D选项。
(19)有以下程序段:
#include
inta,b,c;
a=10;b=50;c=30;
if(a>b)a=b,b=c;c=a;
printf("a=%db=%dc=%d\n",a,b,c);
程序的输出结果是( )。
A)a=10b=50c=30
B)a=10b=50c=10
C)a=10b=30c=10
D)a=50b=30c=50
答案:
B
【解析】本题中a>b的条件不满足,所以不执行逗号表达式a=b,b=c;的操作,而是执行c=a操作,即c的值为10。
(20)有如下嵌套的if语句
if(a
if(aelsek=c;
else
if(belsek=c;
以下选项中与上述if语句等价的语句是
A)k=(a
((ba:
b):
((b>c)?
b:
c);
B)k=(a
((aa:
c):
((bb:
c);
C)k=(a
a:
b;k=(bb:
c;
D)k=(a
a:
b;k=(aa:
c;
答案:
B
【解析】题目中嵌套语句的含义是当a
(21)有以下程序段:
#include
inti,n;
for(i=0;i<8;i++)
{ n=rand()%5;
switch(n)
{ case1:
case3:
printf("%d\n",n);break;
case2:
case4:
printf("%d\n",n);continue;
case0:
exit(0);
}
printf("%d\n",n);
}
以下关于程序段执行情况的叙述,正确的是( )。
A)for循环语句固定执行8次
B)当产生的随机数n为4时结束循环操作
C)当产生的随机数n为1和2时不做任何操作
D)当产生的随机数n为0时结束程序运行
答案:
D
【解析】case常量表达式只是起语句标号作用,并不是该处进行条件判断。
在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不再进行判断,直到碰到break或函数结束为止。
简单的说break是结束整个循环体,而continue是结束单次循环。
B)选项中当产生的随机数n为4时要执行打印操作。
C)选项中当产生的随机数为1和2时分别执行case3与case4后面语句的内容。
由于存在break语句所以for循环不是固定执行8次,执行次数与产生的随机数n有关系。
(22)有如下程序
#include
main()
{
inti,*ptr;
intarray[3]={8,2,4};
for(ptr=array,i=0;i<2;i++)
printf("%d,",*ptr++);
printf("\n");
}
程序运行后的输出结果是()。
A)8,2,
B)8,8,
C)2,4,
D)4,8,
答案:
A
【解析】程序执行过程为:
定义指针ptr与数组array,执行for循环,使指针指向数组,i=0,输出指针指向的元素array[0]=8,然后指针加1,指向数组下一个元素;i=1,输出array[1]=2,指针指向数组下一个元素;i=2退出for循环。
程序依次输出8,2,A选项正确。
(23)有以下程序
#include
main()
{
inti,j,x=0;
for(i=0;i<2;i++)
{
x++;
for(j=0;j<=3;j++)
{
if(j%2)continue;
x++;
}
x++;
}
printf("x=%d\n",x);
}
程序执行后的输出结果是
A)x=4
B)x=8
C)x=6
D)x=12
答案:
B
【解析】coutinue的作用是跳出循环体中剩余的语句而进行下一次循环。第一次执行外循环i的值为0,执行x++,x的值变为1,第一次执行内层循环j的值为0,不满足if条件,执行x++,x的值变为2,第二次内循环j的值为1,if条件成立,跳出本次循环,第三次执行内循环j的值为2,不满足if条件,x的值变为3,第四次执行内循环j的值为3满足条件跳出本次内循环,x的值加1,即为4,第一次外循环结束。第二次执行外循环时,同理,i的值被加了,4次,变为8,所以选择B选项。
(24)设有如下程序段
inta[1]={0};
intb[]={9};
charc[3]={"A","B"};
chard="12";
以下叙述正确的是()。
A)a,b的定义合法,c,d的定义不合法
B)a,b,c,d的定义都是合法的
C)a,b,c的定义是合法的,d的定义不合法
D)只有a的定义是合法的
答案:
A
【解析】inta[1]={0}表示定义一个数组a[1]初值为0,intb[]={9},表示定义一个数组b,其中只有一个值9,系统自动识别数组有1个元素。
charc[3]={"A","B"},数组元素为字符串,需要用二维数组来表示,C选项错误;chard="12";,字符串常量不能赋值给字符变量,D选项错误;因此答案为A选项。
(25)设有定义
doublea[10],*s=a;
以下能够代表数组元素a[3]的是()。
A)(*s)[3]
B)*(s+3)
C)*s[3]
D)*s+3
答案:
B
【解析】指针的赋值首先基类型必须一致,s二维数组名,是二维数组的首地址,其基类型是一个具有10个元素的字符数组。
p是一个字符指针变量,其基类型是一个字符,k是一个行指针,其基类型是具有3个元素的字符型数组。
所以A、C、D中两项的基类型不一致。
而B选项,s[0]是二维数组s的第一个元素,其代表第一行元素构成的数组的首地址,其相当于一维数组的数组名,其基类型是一个字符类型,和p基类型一致。
因此B选项正确。
(26)#include
#defineN4
voidfun(inta[][N])
{
inti;
for(i=0;ia[0][i]+=a[N-1][N-1-i];
}
main()
{intx[N][N]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}},i;
fun(x);
for(i=0;iprintf("\n");
}
程序运行后的输出结果是()。
A)4,7,10,13,
B)1,6,11,16,
C)17,6,11,16,
D)5,13,21,29,
答案:
C
【解析】N=4,for(i=0,i17.6.11.16。
因此答案为C选项。
(27)有以下程序
#include
main()
{
charch[]="uvwxyz",*pc;
pc=ch;
printf("%c\n",*(pc+5));
}
程序运行后的输出结果是()。
A)z
B)0
C)元素ch[5]的地址
D)字符y的地址
答案:
A
【解析】语句pc=ch;使得指针变量指向字符数组ch的首地址,即指向字符'u'。
则pc+5指向的是字符向后移动5位,指向字符'z'。
所以输出的*pc+5的值即为'z'。
因此A选项正确。
(28)有以下程序
#include
#include
voidfun(char*w,intm)
{chars,*p1,*p2;
p1=w;p2=w+m-1;
while(p1{
s=*p1;*p1=*p2;*p2=s;
p1++;p2--;
}
}
main()
{chara[]="123456";
fun(a,strlen(a));puts(a);
}
程序运行后的输出结果是()。
A)123456
B)116611
C)161616
D)654321
答案:
D
【解析】主函数中调用fun(a,6)后,指针p1指向字符串中的"1"、p2指向字符串中的"6"。
While循环中,只要p1最终字符串逆序存放。
因此D选项正确。
(29)若有以下程序
#include
main()
{chara[20],b[]="Theskyisblue.";inti;
for(i=0;i<10;i++)scanf("%c",&a[i]);
a[i]='\0';
gets(b);
printf("%s%s\n",a,b);
}
执行时若输入:
Figflowerisred.<回车>
则输出结果是()。
A)Figflowerisred.isblue.
B)Figflowerisred.
C)Figflowerisred.
D)Figfloweris
答案:
B
【解析】本题考查字符数组的赋值以及字符串的处理函数,本题中输入字符串Figflowerisred时,首先是将前10个字符赋值给字符数组a,然后执行gets(b)后,将后续字符存放到b中,当输出时,首先输出字符数组a,然后输出字符串b,所以结果为B选项。
(30)有以下程序
#include
main()
{chars[]="012xy\08s34f4w2";
inti,n=0;
for(i=0;s[i]!
=0;i++)
if(s[i]>='0'&&s[i]<='9')n++;
printf("%d\n",n);
}
程序运行后的输出结果是()。
A)7
B)0
C)3
D)8
答案:
C
【解析】题意统计字符s中阿拉伯数字的个数。
chars[]='012xy\08s34f4w2';元素是字符型。
'0'=48;而'\0'=0;因此可以计算出'\0'之前阿拉伯数字的个数,由字符串s可知,有3个阿拉伯数字。
答案为C选项。
(31)若有定义语句:
char*s1="OK",*s2="ok";
以下选项中,能够输出"OK"的语句是()。
A)if(strcmp(s1,s2)!
=0)puts(s2);
B)if(strcmp(s1,s2)!
=0)puts(s1);
C)if(strcmp(s1,s2)==1)puts(s1);
D)if(strcmp(s1,s2)==0)puts(s1);
答案:
B
【解析】strcmp(s1,s2)是字符串比较函数,比较规则是两个字符串自左向右逐个字符相比(按照ASCII码值大小),以第一个不相同的字符的大小作为比较结果。
因为'OK'<'ok',所以strcmp(s1,s2)为负值,只有B选项正确。
(32)以下关于return语句的叙述中正确的是()。
A)一个自定义函数中必须有一条return语句
B)一个自定义函数中可以根据不同情况设置多条ret