全国计算机二级C语言模拟测试含详细解析 17.docx
《全国计算机二级C语言模拟测试含详细解析 17.docx》由会员分享,可在线阅读,更多相关《全国计算机二级C语言模拟测试含详细解析 17.docx(30页珍藏版)》请在冰豆网上搜索。
全国计算机二级C语言模拟测试含详细解析17
1.下列叙述中正确的是
A.每一个结点有两个指针域的链表一定是非线性结构
B.所有结点的指针域都为非空的链表一定是非线性结构
C.循环链表是循环队列的链式存储结构
D.线性结构的存储结点也可以有多个指针
正确答案:
D你的答案:
解析:
【解析】一个非空的数据结构如果满足以下两个条件:
有且只有一个根结点;每一个结点最多有一个前件,也最多有一个后件,则称为线性结构,在数据结构中习惯称为线性表。
双向链表结点具有两个指针域,属于线性结构,A选项错误。
循环链表所有结点的指针域都为非空,属于线性结构,B选项错误。
循环链表是链表,循环队列属于队列,队列只能在队尾入队,在排头退队,链表可以在任何位置插入、删除,C选项错误。
双向链表结点具有多个指针域,D选项正确。
2.使用白盒测试方法时,设计测试用例应根据
A.程序的内部逻辑
B.程序的复杂结构
C.程序的功能
D.使用说明书
正确答案:
A你的答案:
解析:
【解析】白盒测试又称为结构测试或逻辑驱动测试,它允许测试人员利用程序内部的逻辑结构及有关信息来设计或选择测试用例,对程序所有的逻辑路径进行测试,故A选项正确。
3.在医院,每个医生只属于某一个诊疗科,医生同一天可为多位患者看病,而一名患者可在多个科室治疗。
则实体医生和患者之间的联系是
A.多对多
B.多对一
C.一对多
D.一对一
正确答案:
A你的答案:
解析:
【解析】一般来说,实体集之间必须通过联系来建立联接关系,分为三类:
一对一联系(1:
1)、一对多联系(1:
m)、多对多联系(m:
n)。
医生可为多位患者看病,患者也可以找多位医生看病,实体医生与患者联系是多对多,A选项正确。
4.设序列长度为n,在最坏情况下,时间复杂度为
的算法是
A.二分法查找
B.顺序查找
C.分块查找
D.哈希查找
正确答案:
A你的答案:
解析:
【解析】对长度为n的线性表排序,最坏情况下时间复杂度,二分法查找为
;顺序查找法为O(n);分块查找时间复杂度与分块规则有关;哈希查找时间复杂度为O
(1),因其通过计算HashCode来定位元素位置,所以只需一次即可。
故正确答案为A选项。
5.设数据集合为D={1,3,5,7,9},D上的关系为R,下列数据结构B=(D,R)中为非线性结构的是
A.R={(5,1),(7,9),(1,7),(9,3)}
B.R={(9,7),(1,3),(7,1),(3,5)}
C.R={(1,9),(9,7),(7,5),(5,3)}
D.R={(1,3),(3,5),(5,9)}
正确答案:
D你的答案:
解析:
【解析】一个非空的数据结构如果满足以下两个条件:
有且只有一个根结点;每一个结点最多有一个前件,也最多有一个后件,则称为线性结构,在数据结构中习惯称为线性表。
A选项中,5为根结点,线性表为51793。
B选项中,9为根结点,线性表为97135。
C选项中,1为根结点,线性表为19753。
D选项,结点1与7都是根结点,属于非线性结构,故D选项正确。
6.深度为7的二叉树共有127个结点,则下列说法中错误的是
A.该二叉树有一个度为1的结点
B.该二叉树是满二叉树
C.该二叉树是完全二叉树
D.该二叉树有64个叶子结点
正确答案:
A你的答案:
解析:
【解析】在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。
完全二叉树指除最后一层外,每一层上的结点数均达到最大值,在最后一层上只缺少右边的若干结点。
满二叉树指除最后一层外,每一层上的所有结点都有两个子结点的二叉树。
深度为7的二叉树,前6层共有结点个数为26-1=63,则第7层有127-63=64个结点,即第7层结点数达到最大值,故此二叉树为满二叉树,也是完全二叉树,该二叉树没有度为1的结点,有64个叶子结点。
故正确答案为A选项。
7.某二叉树的中序序列为BDCA,后序序列为DCBA,则前序序列为
A.DCBA
B.BDCA
C.ABCD
D.BADC
正确答案:
C你的答案:
解析:
【解析】二叉树遍历可以分为3种:
前序遍历(访问根结点在访问左子树和访问右子树之前)、中序遍历(访问根结点在访问左子树和访问右子树两者之间)、后序遍历(访问根结点在访问左子树和访问右子树之后)。
本题中中序序列为BDCA,后序序列为DCBA,可知A为根结点,BDC为左侧结点,C是B右子结点,D是C右子结点,故前序序列为ABCD,C选项正确。
8.下面能作为软件需求分析工具的是
A.PAD图
B.程序流程图
C.甘特图
D.数据流程图(DFD图)
正确答案:
D你的答案:
解析:
【解析】软件需求分析方法包括结构化分析方法和面向对象的分析方法两大类,前者常用工具为数据流图(DFD)、数据字典(DD)、判定表、判定树等。
故D选项正确。
9.下面不属于对象主要特征的是
A.唯一性
B.多态性
C.可复用性
D.封装性
正确答案:
C你的答案:
解析:
【解析】对象的基本特点如下:
可知C选项正确。
10.关系R经过运算
的结果为
A.(c,c,11,4)
B.(b,b,11,4)
C.(a,a,2,4)
D.(a,a,2,4)和(e,e,6,1)
正确答案:
A你的答案:
解析:
【解析】从关系中找出满足给定条件的元组的操作称为选择,用
表示。
为交运算,它由属于前者且属于后者的元组组成。
题目为选出属于属性B,同时属性C大于4,并且属性D大于3的元组,结果为(c,c,11,4),应保留全部属性。
故A选项正确。
11.简单程序设计步骤中不包括
A.编码
B.确定算法
C.安装编译程序
D.调试
正确答案:
C你的答案:
解析:
【解析】简单程序设计步骤为:
确定数据结构、确定算法、编码、调试、整理文档,不包括安装编译程序,故答案为C选项。
12.若想给已定义为int型的变量a,b,c,d赋值为1,以下选项中错误的语句是
A.d=1,c=d,b=c,a=b;
B.a=b=c=d=1;
C.a=1,b=a,c=b,d=c;
D.a=b,b=c,c=d,d=1;
正确答案:
D你的答案:
解析:
【解析】赋值是将一个常量的值赋给一个变量,在D选项中,变量b的值相当于一个未知的数,用b对a赋值不满足,不满足题干要求的变量a、b、c、d赋值为1的条件,因此答案选D选项。
13.有C语言表达式2*3+4+15%3,关于其执行顺序,以下叙述正确的是
A.先执行2*3得6,再执行6+4得10,再执行15%3得0,最后执行10+0得10
B.先执行2*3得6,再执行15%3得5,最后执行6+4+5得15
C.先执行15%3得0,再执行2*3得6,最后执行6+4+0得10
D.先执行15%3得3,再执行4+3得7,再执行2*3得6,最后执行6+7得13
正确答案:
A你的答案:
解析:
【解析】首先运算符"*"和运算符"%"有相同优先级,并且优先级都高于运算符'+',再根据运算结合性,乘法和取余运算都满足从左到右的运算规则,C,D选项错误;因为15%3=0,排除B选项,答案为A选项。
14.若有定义:
inta;floatb;doublec;,
程序运行时输入:
1,2,3<回车>,能把1输入给变量a、2输入给变量b、3输入给变量c的输入语句是
A.scanf("%d,%f,%lf",&a,&b,&c);
B.scanf("%d%f%lf",&a,&b,&c);
C.scanf("%d,%lf,%lf",&a,&b,&c);
D.scanf("%d,%f,%f",&a,&b,&c);
正确答案:
A你的答案:
解析:
【解析】scanf()函数中,%d对应的参数是整数型地址,%f对应参数为float型地址,%lf对应参数为double型地址,因此C,D选项错误;在格式化字符串中,如果输入地址有多个,应该用逗号隔开,B选项错误,故答案为A选项。
15.以下选项中,合法的C语言实数是
A.E1
B..1e0
C.0.10E
D.2.1e0.2
正确答案:
B你的答案:
解析:
【解析】C语言的数值表示中,e和E都表示"10的幂次",后面必须接整数,排除C,D选项;e前面必须有底数,排除A选项,答案为B选项。
16.关于程序中的注释,以下叙述正确的是
A.注释的内容必须放在一对/*和*/之间
B.注释必须置于所说明的语句前或语句后
C.注释中间可以嵌套另一个注释
D.注释内容错误会导致编译出错
正确答案:
A你的答案:
解析:
【解析】程序中,注释可以出现在程序的任何位置,B选项错误;注释中间不能嵌套另一个注释,C选项错误;注释内容不影响程序编译,D选项错误,答案为A选项。
17.有以下程序
#include
main()
{
inta,b;
for(a=0;a<3;a++)
{scanf("%d",&b);
switch(b)
{default:
printf("%d,",b++);
case1:
printf("%d,",b++);
case2:
printf("%d,",b++);
}
}
}
程序运行时输入:
123<回车>,则输出结果是
A.1,2,3,2,3,3,
B.1,2,3,
C.1,2,2,3,4,5,
D.1,1,1,2,2,3
正确答案:
C你的答案:
解析:
【解析】程序在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,执行对应的case语句,之后不再进行判断,继续执行此case后面的语句,并且各个case和default的出现次序不影响执行结果,即题目中的default放在开始位置,与放在最后是一样的结果;运算符"++"放在变量后面时,表示先执行其他操作,再将变量+1。
本题,第一次循环输入b=1,执行case1,输出1,再执行case2,输出2,第二次循环输入b=2,执行case2输出2,第三次循环,输入b=3,没有case与其对应,故执行default输出b=3,接着执行case1:
,输出4,再执行case2,输出b=5,至此退出for语句。
因此,最后输出为1,2,2,3,4,5,答案为C选项。
18.以下非法的定义语句是
A.longb=0L;
B.unsignedinta=-100u;
C.shortc2=0123;
D.intd=0x0;
正确答案:
B你的答案:
解析:
【解析】unsigned定义的是"无符号数",则B选项定义错误,答案为B选项。
19.有以下程序
#include
main()
{
inta=0,b=0;
for(;a<5;a++)
{if(a%2==0)continue;
b+=a;
break;
}
printf("%d\n",b);
}
程序运行后的输出结果是
A.1
B.4
C.0
D.10
正确答案:
A你的答案:
解析:
【解析】for语句中,当a=0时,满足for循环中if语句的条件,执行continue继续下一次循环,a+1后再进入for语句循环,此时a=1不满足if语句,执行b=b+a为1,接着执行break语句,终止循环,最后输出b=1,故答案为A选项。
20.有以下程序
#include
main()
{
charc;
c=getchar();
do{
putchar(c++);
}while((c=getchar())!
='#');
}
程序运行时从第一列开始输入:
abcdefg##<回车>,则输出结果是
A.bcdefgh$
B.bcdefgh
C.abcdefg#
D.abcdefg
正确答案:
D你的答案:
解析:
【解析】运算符"++"放在变量后面时,先参与其他操作,再对变量+1。
putchar(c++)表示先输出当前c值,再对c值+1,当输入abcdef##时,在while语句中,程序输入"#",循环退出。
因此输出为abcdefg,答案为D选项。
21.有如下程序
#include
main()
{
chara='0',b='a';
inti;
for(i=0;i<4;i++)
{
if(i%3)putchar(a+i);
elseputchar(b+i);
}
}
程序运行后的输出结果是
A.a12d
B.ab3d
C.10ab
D.11ac
正确答案:
A你的答案:
解析:
【解析】if(i%3)表示i对3求余,如果不等于0,则执行putchar(a+i);否则执行putchar(b+i),可见,i=0时i%3=0执行putchar(b+i),此时b='a',以此类推,当i=1时,执行putchar(a+i),输出1;当i=2时,执行putchar(a+i),输出2;当i=3时,执行putchar(b+i)输出d,答案为A选项。
22.有以下程序
#include
main()
{
charch='M';
while(ch!
='K')
{
putchar(ch);
ch--;
}
}
程序运行后的输出结果是
A.ML
B.MK
C.OP
D.mm
正确答案:
A你的答案:
解析:
【解析】(ch!
='K')表示如果ch不等于K成立时,输出ch,再对ch进行ASCII码减一操作,循环开始时,ch='M'不等于'K'输出M,ch--表示ch='L',循环继续,输出L,ch--被执行ch='K'退出循环,答案为A选项。
23.有以下程序
#include
intk=5;
voidf(int*s)
{s=&k;
*s=k;
}
main()
{
intm=3;
f(&m);
printf("%d,%d\n",m,k);
}
程序运行后的输出结果是
A.3,3
B.5,5
C.3,5
D.5,3
正确答案:
C你的答案:
解析:
【解析】函数f()的功能是:
定义一个临时的整型指针变量s,指向全局变量k,然后用k的值对s指向的内存地址进行赋值,结果当然是k的值不变;另外在调用函数f()过程中,虽然使用m的地址初始化s,但是s在f函数内部又被指向k的地址,所以s的后续操作对m没有任何影响,因此最后输出为3,5,答案为C选项。
24.有如下程序
#include
intsum_mod(inta,intb)
{
returna+b%2;
}
main()
{
inti;
for(i=0;i<5;i++)
printf("%d",sum_mod(i,4));
printf("\n");
}
程序运行后的输出结果是
A.12345
B.01234
C.45678
D.43210
正确答案:
B你的答案:
解析:
【解析】程序的main函数中的printf输出函数,调用sum_mod函数,计算结果i+4%2;因为4%2为0,所以循环中,函数每次执行的结果都是返回i,因此答案为B选项。
25.以下对指针变量的操作中,错误的程序段是
A.intx=0,*p;*p=x;
B.intx=1,*p,*q=&x;p=q;
C.int*p,*q;q=p=NULL;
D.intp,*q;q=&p;
正确答案:
A你的答案:
解析:
【解析】定义指针p后,必须指针p进行初始化就进行赋值,故A选项程序错误,答案为A选项。
26.有如下程序段
int*p,a=1;
p=&a;
*p=10;
则变量a的值为
A.不能确定
B.1
C.10
D.11
正确答案:
C你的答案:
解析:
【解析】题中定义一个指针变量p和整数并将a赋值为1,再把a地址的值赋给指针p,最后把10赋给指针p所对应的地址单元,此时改变了a的值,a=10,答案为C选项。
27.有以下程序
#include
inta=2;
intf(intk)
{
staticintn=0;
intm=0;
n++;a++;m++;k++;
returnn+m+a+k;
}
main()
{
intk;
for(k=0;k<2;k++)
printf("%d,",f(k));
printf("\n");
}
程序运行后的输出结果是
A.6,9,
B.6,10,
C.6,6,
D.6,7,
正确答案:
A你的答案:
解析:
【解析】static定义一个静态分布变量,变量只会初始化一次,在for循环体内调用f()函数输出,f()函数是将当前n,m,a,k加1后进行累加返回主函数输出,第二次累加时,n值初始值为1,因此输出分别为6,9,答案为A选项。
28.有以下程序
#include
voidf(intx[],intn)
{
if(n>1)
{printf("%d,",x[0]);
f(&x[1],n-1);
printf("%d,",x[0]);
}
else
printf("%d,",x[0]);
}
main()
{
intz[3]={4,5,6};
f(z,3);
printf("\n");
}
程序运行后的输出结果是
A.6,5,4,6,5,4,
B.4,5,6,5,4,
C.4,5,6,4,5,6,
D.6,5,4,5,6,
正确答案:
B你的答案:
解析:
【解析】本题考查了函数的递归调用,在main函数中调用f(z,3)后,系统进入f()函数,随后进入if语句,输出x[0],再进入f()函数时,存在&x[1]函数的递归,输出x[1],再进入f函数,再进行递归,输出x[2],随后结束返回输出上一个f()函数,输出x[1],再返回第一个f()函数中,输出x[0],程序运行后的输出结果是4.5.6.5.4。
因此答案为B选项。
29.有如下程序
#include
#include
main()
{
chara[]="1234",*b="ABC";
printf("%d,%d,%d,%d\n",strlen(a),sizeof(a),strlen(b),sizeof(b));
}
程序运行后的输出结果是
A.4,5,1,3
B.4,3,2,1
C.4,5,3,3
D.4,5,3,4
正确答案:
D你的答案:
解析:
【解析】当将一个字符串存储到一个字符型数组中时,系统会在其末尾自动加上一个空字符'\0'作为结束符,strlen()函数的返回值是字符串的实际长度,不包括结束符,所以strlen(b)=3,strlen(a)=4,而sizeof()函数作用就是返回一个对象或者类型所占的内存字节数,返回值包括结束符,所以sizeof(a)=5由于一个指针在内存中占用四个字节,故sizeof(b)=4,答案为D选项。
30.有以下程序
#include
int*sum(intdata)
{
staticintinit=1;
init+=data;
return&init;
}
main()
{
inti,*p;
for(i=1;i<=3;i++)sum(i);
p=sum
(1);
printf("%d\n",*p);
}
程序运行后的输出结果是
A.8
B.9
C.10
D.7
正确答案:
A你的答案:
解析:
【解析】static定义一个静态分布变量,变量只会初始化一次。
在for函数的循环体中调用sum(i)函数,循环3次,每次都把i值累加在init中,再执行i+1操作,因此,退出循环后,init=1+1+2+3=7,再执行次sum
(1),init=8后,把init的地址赋给指针p,输出指针p指向的init的值,答案为A选项。
31.以下对C语言函数的叙述中正确的是
A.调用函数时,只能把实参的值传给形参,形参的值不能传给实参
B.函数既能嵌套定义,又能递归定义
C.函数必须有返回值,否则不能使用
D.程序中有调用关系的所有函数必须放在同一个源程序中
正确答案:
A你的答案:
解析:
【解析】C语言不能嵌套定义函数,能递归定义函数,因此B选项错误;函数可以没有返回值,没有返回值的函数返回类型为void,C选项错误;程序有调用关系的所有函数可以不放在同一源程序中,D选项错误,答案为A选项。
32.有以下程序
#include
#defineS(x)x/x*x
main()
{
intk=6,j=3;
printf("%d,%d\n",S(k+j),S(j+k));
}
程序运行后的输出结果是
A.27,27
B.9,9
C.27,29
D.29,29
正确答案:
C你的答案:
解析:
【解析】定义一个带参数的宏时,字符串内的形参通常要用圆括号括起来,以避免出错,本题中,S(k+j)相当于执行运算k+j/k+j*k+j,将k,j值代入运算后取整为27,S(j+k)同理,因此答案为C选项。
33.若有定义:
typedefint*T;
T*a[20];
则以下与上述定义中a类型完全相同的是
A.int**a[20];
B.int(*a)[20];
C.int*(*a)[20];
D.int*a[20];
正确答案:
A你的答案:
解析:
【解析】typedef类型名新类型名表示为一个已有定义的类型标识符重新定义一个类型名,题中,首先为指针类型命名为T,再通过T定义了一个数组指针*a[20],整个功能等价于int**a[20],答案为A选项。
34.设有以下程序段
structperson