全国计算机二级C选择题题库第套.docx
《全国计算机二级C选择题题库第套.docx》由会员分享,可在线阅读,更多相关《全国计算机二级C选择题题库第套.docx(26页珍藏版)》请在冰豆网上搜索。
全国计算机二级C选择题题库第套
全国计算机二级C选择题题库第33套
1、下列叙述中正确的是,,
A)解决同一个问题的不同算法的时间复杂度一般是不同的
B)解决同一个问题的不同算法的时间复杂度必定是相同的
C)对同一批数据作同一种处理,如果数据存储结构不同,不同算法的时间复杂度肯定相同
D)对同一批数据作不同的处理,如果数据存储结构相同,不同算法的时间复杂度肯定相同
参考答案:
A
算法的时间复杂度是指执行算法所需要的计算工作量,而计算工作量是用算法所执行的基本运算次数来度量的。
解决同一个问题的不同算法的时间复杂度,可能相同也可能不相同。
算法的时间复杂度与数据存储结构无关,对同一批数据作同一种处理或者不同处理,数据存储结构相同或者不同,算法的时间复杂度都可能相同或者不同。
故选A选项。
2、下列处理中与队列有关的是
A)操作系统中的作业调度
B)执行程序中的过程调用
C)执行程序中的循环控制
D)二叉树的遍历
参考答案:
A
队列是指允许在一端进行插入,而在另一端进行删除的线性表。
由于最先进入队列的元素将最先出队,所以队列具有"先进先出"的特性,体现了"先来先服务"的原则。
作业调度是指根据一定信息,按照一定的算法,从外存的后备队列中选取某些作业调入内存分配资源并将新创建的进程插入就绪队列的过程。
执行程序中的过程调用一般指函数调用,需要调用时候转入被调用函数地址执行程序,与队列无关。
执行程序中的循环控制是指算法的基本控制结构,包括对循环条件的判定与执行循环体,与队列无关。
二叉树是一个有限的结点集合,二叉树的遍历是指不重复地访问二叉树中的所有结点,与队列无关。
故本题选择A选项。
3、设栈的存储空间为S(1:
m),初始状态为top=m+1。
经过一系列入栈与退栈操作后,top=1。
现又要将一个元素进栈,栈顶指针top值变为
A)发生栈满的错误
B)2
C)m
D)0
参考答案:
A
4、栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。
入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。
题目中初始状态为top=m+1,可知入栈栈顶指针top=top-1,出栈栈顶指针top=top+1,由于栈长为m,当top=1时栈满,不能再进行入栈操作。
故选A选项。
设二叉树共有150个结点,其中度为1的结点有10个,则该二叉树中的叶子结点数为
A)71
B)70
C)69
D)不可能有这样的二叉树
参考答案:
D
在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。
对任何一棵二叉树,度为0的结点总是比度为2的结点多一个。
如果有一棵二叉树,结点总数为150,假设度为0的结点个数为n,则有n+10+n-1=150,n=70.5,由于结点个数必须是整数,所以不可能有题目中这样的二叉树。
故选择D选项。
5、非空循环链表所表示的数据结构
A)有根结点也有叶子结点
B)没有根结点但有叶子结点
C)有根结点但没有叶子结点
D)没有根结点也没有叶子结点
参考答案:
A
在单链表的第一个结点前增加一个表头结点,队头指针指向表头结点,最后一个结点的指针域的值由NULL改为指向表头结点,这样的链表称为循环链表。
循环链表是线性结构,有且只有一个根结点,每一个结点最多有一个前件,也最多有一个后件。
循环链表表头结点为根结点,链表的最后一个结点为叶子节点,虽然它含有一个指向表头结点的指针,但是表头结点并不是它的一个后件。
故选择A选项
6、设二叉树中共有31个结点,其中的结点值互不相同。
如果该二叉树的后序序列与中序序列相同,则该二叉树的深度为
A)31
B)16
C)17
D)5
参考答案:
A
二叉树遍历可以分为3种:
前序遍历(访问根结点在访问左子树和访问右子树之前)、中序遍历(访问根结点在访问左子树和访问右子树两者之间)、后序遍历(访问根结点在访问左子树和访问右子树之后)。
由结点值互不相同而后序序列与中序序列相同,可知该二叉树所有的结点都没有右子树,所以31个结点的二叉树深度为31。
故选A选项。
7、在最坏情况下,堆排序的时间复杂度是
A)
B)
C)
D)
参考答案:
B
若有n个元素的序列,将元素按顺序组成一棵完全二叉树,当且仅当满足下列条件时称为堆,大根堆是指所有结点的值大于或等于左右子结点的值;小根堆是指所有结点的值小于或等于左右子结点的值。
在调整建堆的过程中,总是将根结点值与左、右子树的根结点进行比较,若不满足堆的条件,则将左、右子树根结点值中的大者与根结点值进行交换。
堆排序最坏情况需要次比较,所以时间复杂度是,B选项正确。
8、软件按功能可以分为应用软件、系统软件和支撑软件(或工具软件)。
下面属于系统软件的是
A)学籍管理系统
B)ERP系统
C)C编译程序
D)CAI软件
参考答案:
C
计算机软件按功能分为应用软件、系统软件、支撑软件(或工具软件)。
系统软件是管理计算机的资源,提高计算机的使用效率,为用户提供各种服务的软件。
应用软件是为了应用于特定的领域而开发的软件。
支撑软件介于系统软件和应用软件之间,协助用户开发软件的工具型软件,其中包括帮助程序人员开发和维护软件产品的工具软件,也包括帮助管理人员控制开发进程和项目管理的工具软件,如Dephi、PowerBuilder等。
选项C属于系统软件,选项A、B、D属于应用软件,故选C选项。
9、存储在计算机内有结构的数据集合是
A)数据库
B)数据库系统
C)数据库管理系统
D)数据结构
参考答案:
A
数据库是指长期存储在计算机内的、有组织的、可共享的数据集合。
数据库系统是由数据库及其管理软件组成的系统,是应用软件。
数据库管理系统是数据库系统的核心,它位于用户与操作系统之间,属于系统软件。
数据结构是计算机存储、组织数据的方式。
故本题选A选项。
10、在数据库技术中,为提高数据库的逻辑独立性和物理独立性,数据库的结构被划分成用户级、存储级和
A)概念级
B)外部级
C)管理员级
D)内部级
参考答案:
A
数据库系统在其内部分为三级模式,即概念模式、内模式和外模式。
概念模式是数据库系统中全局数据逻辑结构的描述,全体用户的公共数据视图。
外模式也称子模式或者用户模式,是用户的数据视图,也就是用户所能够看见和使用的局部数据的逻辑结构和特征的描述,是与某一应用有关的数据的逻辑表示。
内模式又称物理模式,是数据物理结构和存储方式的描述,是数据在数据库内部的存储方式。
所以数据库的结构被划分成用户级、存储级和概念级。
故选A选项。
11、以下是正确C语言实型常量的是
A).e-1
B)e-1
C)-1e
D)1e-1
参考答案:
D
所谓常量是指在程序运行的过程中,其值不能被改变的量。
在C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。
实型常量有两种表示形式:
十进制小数形式、指数形式。
指数形式中e后面的指数必须是整数,阶码标志e之前需要有数字,由此可知选项A,B,C错误。
答案为D选项。
12、以下是正确C语言实型常量的是
A).e-1
B)e-1
C)-1e
D)1e-1
参考答案:
D
所谓常量是指在程序运行的过程中,其值不能被改变的量。
在C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。
实型常量有两种表示形式:
十进制小数形式、指数形式。
指数形式中e后面的指数必须是整数,阶码标志e之前需要有数字,由此可知选项A,B,C错误。
答案为D选项。
13、以下叙述正确的是
A)在C语言中分号是语句的组成部分
B)C语言程序由C语句组成,可以省略main函数
C)分号是C语句之间的分隔符
D)所有程序行都必须用分号结束
参考答案:
A
C语言C程序的入口函数是main(),因此C程序中有且只有一个main函数,故选项B错误。
分号是C语言一条语句的结束标志,不是分隔符,C语言分隔符是用来分隔多个变量、数据项、表达式等的符号,包括逗号、空白符、分号和冒号等等,选项C错误。
C语言的程序不是以分号结束的,分号是C语言一条语句的结束标志,C语言是面向过程的,从main函数开始在main函数里结束,选项D错误。
故答案为A选项。
14、若有定义:
doublea,b,c;能正确给a,b,c输入数据的语句是
A)scanf("%lf%lf%lf"&a,&b,&c)
B)scanf("%f%f%f",&a,&b,&c);
C)scanf("%lf%lf%lf",a,b,c);
D)scanf("%lf%lf%lf",&a,&b,&c);
参考答案:
D
%lf,%le是针对double的,如果仅用%f,输入的数据可能不完全接收,数据的精度可能不足。
%f主要针对float类型的变量的输入,因此选项B错误。
根据题目格式可知A,C错误。
故答案为D选项。
15、有以下程序
#include
main()
{intx=0x9;
printf("%c\n",'A'+x);
}程序运行后的输出结果是
A)I
B)J
C)K
D)H
参考答案:
B
printf("%c\n",'A'+x),x=0x9(16)转为十进制x=9,,因此printf("%c\n",'A'+9),打印格式要求是%c,因此在字符A,按字母顺序向后偏移9个位置,可得结果为J。
故答案为B选项。
16、设有定义:
doublex=5.16894;,则语句printf("%lf\n",(int)(x*1000+0.5)/1000.);的输出结果是
A)5.16900
B)5.16800
C)0.00000
D)输出格式说明符与输出项不匹配,产生错误信息
参考答案:
A
(x*1000+0.5)--x移动3位小数,加0.5,也就是小数第4位加5,若这位大于等于5,则进1到个位。
5.16894*10005168.94
+0.55169.44
(int)(x*1000+0.5)强制转换为整型结果为5169
5169/1000.0)5.169,由于1000.0结果自动转换为浮点数
所以printf("%lf\n",5.169)结果是5.16900故答案为A选项。
17、有以下程序
#include
main()
{inta=0,b=0,c=0,d=0;
if(a=1)b=1;c=2;
elsed=3;
printf("%d,%d,%d,%d\n",a,b,c,d);
}
程序输出
A)编译有错
B)0,0,0,3
C)1,1,2,0
D)0,1,2,0
参考答案:
A
C语言规定else总是和之前与其最近的且不带else的if配对,题目中,if(a=1)b=1;c=2;默认省略的else已经配对了,下一句else没有匹配if为非法else。
另外if的判断条件a=1是赋值语句,不是判断语句,此处也会产生编译错误。
因此答案为A选项。
18、有以下程序
#include
main()
{inta=-2,b=2;
for(;++a&&--b;)
;
printf("%d,%d\n",a,b);
}程序运行后的输出结果是
A)0,1
B)0,0
C)1,-1
D)0,2
参考答案:
A
for(;++a&&--b;);for循环的1,3表达式缺省项,判断条件为++a&&--b;
a=-2,b=2;,第一次执行了++a和--b,,表示为真,循环条件成立,第二次执行++a为0,由于&&运算符,当第一个条件为假时,不执行第二个条件,所以b=1,发生短路,--b不执行了。
因此a,b的最终值0,1。
故答案为A选项。
19、有以下程序
#include
main()
{intt;
scanf("%d",&t);
if(t++<6)printf("%d\n",t);
elseprintf("%d\n",t--);
printf("\n");
}执行时输入:
6<回车>,则输出结果是
A)6
B)8
C)7
D)5
参考答案:
C
后置自增运算:
k++表示先运算,后自加。
if(t++<6)printf("%d\n",t);elseprintf("%d\n",t--);t的初值为6,t++<6,则条件为假,执行printf("%d\n",t--),此时t=7,,打印t值为7,之后进行自减操作t=6。
,。
因此打印的结果为7。
故答案为C选项。
20、有以下程序
#include
main()
{charch='D';
while(ch>'A')
{ch--;
putchar(ch);
if(ch=='A')break;
putchar(ch+1);
}
}
程序运行后的输出结果是
A)CB
B)BCA
C)CCBB
D)CDBCA
参考答案:
D
putchar()函数功能是输出一个字符,由whlie判断条件和ch初始值可知,,只要ch
'A',每次执行二次putchar,否则跳出。
第一次输出CD,第二次输出BC,第三次输出A,跳出循环。
因此答案为D选项。
21、以下程序拟实现计算s=1+2*2+3*3+…+n*n+…,直到s>1000为止。
#include
main()
{ints,n;
s=1;
n=1;
do
{n=n+1;s=s+n*n;}
while(s>1000);
printf("s=%d\n",s);
}
程序运行后,不能得到正确结果,以下修改方案正确的是
A)把while(s>1000);改为while(s<=1000);
B)把s=1;改为s=0;
C)把n=1;改为n=0;
D)把n=n+1;改为n=n*n;
参考答案:
A
题目中程序不能实现预期功能是因为while的循环条件错误,选项B,把s=1,改为s=0,最终的结果s=4,与题目原意不同,
选项C,把n=1;改为n=0;最终的结果s=2,与题目原意不同,
选项D,把n=n+1;改为n=n*n;最终的结果s=2,与题目原意不同
选项A,正确的修改了while循环条件,可以得到正确结果。
故答案为A选项。
22、有以下程序
#include
main()
{intm,n;
scanf("%d%d",&m,&n);
while(m!
=n)
{while(m>n){m=m-n;}
while(n>m){n=n-m;}
}
printf("%d\n",m);
}
该程序的功能是
A)计算m和n的最小公倍数
B)计算m和n的最大公约数
C)计算m和n的差值
D)找出m和n中的较大值
参考答案:
B
题目使用更相减损术求最大公约数,其思想:
1、任意给定两个正整数,判断它们是否都是偶数。
若是,则用2约简,若不是则执行第二步。
第二步:
以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。
继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
因此。
故答案为B选项。
23、有以下程序
#include
intadd(inta,intb){return(a+b);}
main()
{intk,(*f)(),a=5,b=10;
f=add;
…
}
则以下函数调用语句错误的是
A)k=f(a,b);
B)k=add(a,b);
C)k=(*f)(a,b);
D)k=*f(a,b);
参考答案:
D
*与()的优先级,()的优先级高于*,因为(*f)()是在定义函数指针。
f指向函数的指针。
f=add,将函数add()的首地址赋给指针f,所以调用函数add()可以写为f(),其返回值是整型,不是指针类型,不能用*取指针指向的内存单元的数据,故k=*f(a,b)的调用方式错误。
答案为D选项。
24、若有定义语句:
doublex,y,*px,*py;
执行
px=&x;py=&y;
正确的输入语句是
A)scanf("%lf%lf",x,y);
B)scanf("%f%f"&x,&y);
C)scanf("%f%f",x,y);
D)scanf("%lf%le",px,py);
参考答案:
D
%lf,%le是针对double的,如果仅用%f,输入的数据可能不能被完全接收,数据的精度可能不足。
%f主要针对float类型的变量的输入,选项B错误。
根据scanf(格式,变量地址),选择A,C错误。
因此,选择D。
25、以下定义数组的语句中错误的是
A)intnum[][3]={{1,2},3,4,5,6};
B)intnum[2][4]={{1,2},{3,4},{5,6}};
C)intnum[]={1,2,3,4,5,6};
D)intnum[][4]={1,2,3,4,5,6};
参考答案:
B
intnum[2][4]={{1,2},{3,4},{5,6}};定义数组是2行4列,但是初始化的结构是3行2列,因此初始化错误。
选项A,num[][3]={{1,2},3,4,5,6};定义3行3列的数组。
选项D,num[][4]={1,2,3,4,5,6},定义了2行4列数组,选项C,一维数组的定义和初始化。
故答案为B选项。
26、有以下程序
#include
voidfun(inta[],intn,intflag)
{inti=0,j,t;
for(i=0;ifor(j=i+1;jif(flag)
{if(a[i]{t=a[i];a[i]=a[j];a[j]=t;}
}
else
{if(a[i]>a[j])
{t=a[i];a[i]=a[j];a[j]=t;}
}
}
main()
{intc[10]={7,9,10,8,3,5,1,6,2,4},i;
fun(c,4,1);
fun(c+4,6,0);
for(i=0;i<10;i++)printf("%d,",c[i]);
printf("\n");
}
程序运行后的输出结果是
A)7,8,9,10,6,5,4,3,2,1
B)10,9,8,7,6,5,4,3,2,1
C)10,9,8,7,1,2,3,4,5,6,
D)1,2,3,4,5,6,7,8,9,10,
参考答案:
C
fun()函数作用冒泡法排序,flag控制升序(0)或者降序
(1)。
n为参与排序的个数。
a为数组的起始地址。
因此,fun(a,4,1),数组的前四个降序排序,fun(a+4,6,0)从数组的第四项,后六个升序排序。
故结果为10,9,8,7,1,2,3,4,5,6。
答案为C选项。
27、有以下程序
#include
main()
{inti,k=0,a[10];
for(i=0;i<10;i++)a[i]=i;
for(i=0;i<4;i++)k+=a[i]+i;
printf("%d\n",k);
}
程序运行后的输出结果是
A)10
B)16
C)6
D)12
参考答案:
D
第一个for循环对数组a赋初值,从0~9,第二个for循环数组前4项的a[i]+i的和。
0+0,1+1,2+2,3+3,经计算的结果为12,因此答案为D选项。
28、有以下程序
#include
intnew_div(doublea,doubleb)
{returna/b+0.5;}
main()
{printf("%d",new_div(7.8,3.1));}
程序运行后的输出结果是
A)1
B)2
C)3
D)0
参考答案:
C
new_div()的返回值是int类型,因此,a/b(a,b均为double类型)+0.5的小数部分被将被截断。
经计算,7.8/3.1+0.5=2.516+0.5=3.016,故打印的结果为3。
故答案为C选项。
29、函数fun的功能是在a所指的具有n个元素的数组中查找最大值并返回给调用函数,函数不完整。
intfun(int*a,intn)
{int*p,*s;
for(p=a,s=a;p-aif(__________)s=p;
return*s;
}
在if语句下划线处应填入的选项是
A)p>s
B)*p>*s
C)a[p]>a[s]
D)p-a>p-s
参考答案:
B
函数fun的功能是在a所指的具有n个元素的数组中查找最大值并返回。
通过for比较,s始终指向最大值的那个元素。
取指针的值,使用*p,因此比较使用*p和*s,又因为找最大值,当*s<*p时,修改指针s的指向,因此答案为B选项。
30、有以下程序
#include
#include
main()
{charstr[][20]={"One*World","One*Dream!
"},*p=str[1];
printf("%d,",strlen(p));printf("%s\n",p);
}
程序运行后的输出结果是
A)10,One*Dream!
B)9,One*Dream!
C)9,One*World
D)10,One*World
参考答案:
A
unsignedintstrlen(char*s);计算字符串s的(unsignedint型)长度,不包括'\0'在内;p指向数组的第二个元素,因此strlen(p)=10,并打印,故答案为A选项。
31、有以下程序
#include
#include
main()
{inti,len;
charb[]="WelcomeyoutoBeijing!
";
len=strlen(b);
for(i=0;iif(b[i]=='')
{strcpy(b,b+i+1);
i=0;
}
printf("%s\n",b);
}
程序运行后的输出结果是
A)Beijing!
B)toBeijing!
C)WelcomeyoutoBeijing!
D)youtoBeijing!
参考答案