计算机二级C语言模拟题3.docx
《计算机二级C语言模拟题3.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言模拟题3.docx(20页珍藏版)》请在冰豆网上搜索。
计算机二级C语言模拟题3
2018年计算机二级C语言模拟题3
(总分:
100.00,做题时间:
120分钟)
一、选择题
(每题1分,共40分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。
(总题数:
40,分数:
40.00)
1.下列叙述中正确的是( )。
(分数:
1.00)
A.栈是“先进先出”的线性表
B.队列是“先进后出”的线性表
C.循环队列是非线性结构的线性表
D.有序线性表既可以采用顺序存储结构,也可以采用链式存储结构 √
解析:
栈是先进后出的线性表,因此A错误;队列是先进先出的线性表,因此B错误;循环队列是线性结构的线性表,因此C错误,故本题答案为D。
2.支持子程序调用的数据结构是( )。
(分数:
1.00)
A.桟 √
B.树
C.队列
D.二叉树
解析:
栈支持子程序调用。
栈是一种只能在一端进行插入或删除的线性表,在主程序调用子程序时要首先保存主程序当前的状态,然后转去执行子程序,最终把子程序的执行结果返回到主程序中调用子程序的位置,然后继续向下执行,这种调用方式符合栈的特点,因此本题的答案为A。
3.某二叉树有5个度为2的结点,则该二叉树中的叶子结点数是( )。
(分数:
1.00)
A.10
B.8
C.6 √
D.4
解析:
根据二叉树的基本性质3:
在任意一棵二叉树中,度为0的叶子结点总是比度为2的结点多一个,因此本题答案是5+1=6,故选择C。
4.下列排序方法中,最坏情况下比较次数最少的是( )。
(分数:
1.00)
A.冒泡排序
B.简单选择排序
C.直接插入排序
D.堆排序 √
解析:
冒泡排序、直接插入排序与简单选择排序法在最坏情况下均需要比较n(n-1)/2次,而堆排序在最坏情况下需要比较的次数是n㏒2n,因此本题答案为D。
5.软件按功能可以分为应用软件、系统软件和支撑软件(工具软件),下面属于应用软件的是( )(分数:
1.00)
A.编译程序
B.操作系统
C.教务管理系统 √
D.汇编程序
解析:
编译程序、操作系统、汇编程序都属于系统软件,只有教务管理系统才是应用软件,因此本题答案为C。
6.下面叙述中错误的是( )。
(分数:
1.00)
A.软件测试的目的是发现错误并改正错误 √
B.对被调试的程序进行“错误定位”是程序调试的必要步骤
C.程序调试通常也称为Debug
D.软件测试应严格执行测试计划,排除测试的随意性
解析:
软件测试的目的是为了发现错误而执行程序的过程,并不涉及改正错误,因此选项A错误。
程序调试的基本步骤有:
错误定位、修改设计和代码以排除错误、进行回归测试以防止引进新的错误。
程序调试通常称为Debug,即排错。
软件测试的基本准则包括:
所有测试都应追溯到需求、严格执行测试计划,排除测试的随意性、充分注意测试中的群集现象、程序员应避免检査自己的程序、不可能实现穷举测试、妥善保存测试计划等文件。
7.耦合性和内聚性是对模块独立性度量的两个标准,下列叙述中正确的是( )(分数:
1.00)
A.提高耦合性降低内聚性有利于提高模块的独立性
B.降低耦合性提高内聚性有利于提高模块的独立性 √
C.耦合性是指一个模块内部各个元素间彼此结合的紧密程度
D.内聚性是指模块间互相连接的紧密程度
解析:
模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。
一般较优秀的软件设计应尽量做到高内聚、低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提髙模块的独立性,因此A错误,B正确。
耦合性是模块间互相连接的紧密程度的度量,内聚性是指一个模块内部各个元素间彼此结合的紧密程度,因此C与D错误。
8.下列叙述中错误的是( )。
(分数:
1.00)
A.在数据库系统中,数据的物理结构必须与逻辑结构一致 √
B.数据库技术的根本目标是要解决数据的共享问题
C.数据库设计是指在已有数据库管理系统的基础上建立数据库
D.数据库系统需要操作系统的支持
解析:
数据库应用系统中的核心问题是设计一个能满足用户需求、性能良好的数据库,这就是数据库设计,因此本题答案为A。
9.有两个关系R、S如下:
由关系R通过运算得到关系S,则所使用的运算为( )。
(分数:
1.00)
A.选择
B.投影 √
C.插入
D.连接
解析:
投影运算是从关系模式中挑选若干属性组成新的关系,这是从列的角度进行的运算,相当于对关系进行垂直分解。
本题中,S是在原有关系R的内部进行的,是由R中原有的那些域的列所组成的关系,因此选择B。
10.将E-R图转换为关系模式时,实体和联系都可以表示为( )(分数:
1.00)
A.属性
B.键
C.关系 √
D.域
解析:
从E-R图到关系模式的转换是比较直接的,实体与联系都可以表示成关系,E-R图中属性也可以转换成关系的属性,因此本题答案为C。
11.以下叙述中错误的是( )。
(分数:
1.00)
A.
C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令
√
B.
C程序经过编译、连接步骤之后才能形成一个真正可执行的二进制机器指令文件
C.
用C语言编写的程序称为源程序,它以ASCII代码形式存放在一个文本文件中
D.C语言源程序经编译后生成后缀为.obj的目标程序
解析:
C语言中的非执行语句不会被编译,不会生成二进制的机器指令,因此A选项错误。
由C语言构成的指令序列称为C源程序,C源程序经过C语言编译程序编译之后生成一个后缀为.obj的二进制文件(称为目标文件);最后要由“连接程序”把此“.obj”文件与C语言提供的各种库函数连接起来生成一个后缀为“.exe”的可执行文件。
根据上述分析可知,A选项叙述错误。
12.以下选项中,合法的一组C语言数值常量是( )(分数:
1.00)
A.12.0Xa234.5e0 √
B.028.5e-3-0xf
C..1774e1.50abc
D.0x8A10,0003.e5
解析:
C语言中八进制整型常量的开头是数字0,十六进制整型常量的开头是数字0x。
C语言中的实型常量有两种表示形式:
小数形式,小数形式表示的实型常量必须要有小数点;指数形式,以“e”或“E”后跟一个整数来表示以10为底数的幂数,且规定字母e或E之前必须要有数字,且e或E后面的指数必须为整数。
B选项中028错误,八进制中没有数字8。
C选项中“4e1.5”中e后面的指数不是整数。
D选项中“3.e5”小数点后面缺少数字。
因此本题答案为A。
13.以下选项中不合法的标识符是( )。
(分数:
1.00)
A.print
B.FOR
C.&a √
D._00
解析:
C语言中标识符由字母、下画线或数字组成,且开头必须是字母或下画线。
另外,关键字不能作为标识符。
因为C语言中区分大小写,所以B)选项中的“FOR”可以作为标识符来用。
C选项中含有非法字符&,因此选择C。
14.若有代数式
(其中e又代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是( )。
(分数:
1.00)
A.sqrt(fabs(pow(n,x)+pow(x,e))) √
B.sqrt(fabs(pow(n,x)+exp(x)))
C.sqrt(abs(n^x+e^x))
D.sqrt(fabs(pow(x,n)+exp(x)))
解析:
B选项中函数“pow(x,e)”错误,应该直接使用“exp(x)”函数。
C选项中函数“abs(n^x+e^x)”错误,应该使用“fabs()”返回浮点数的绝对值。
D选项中“pow(x,n)”参数顺序错误。
本题正确答案为A。
15.若有定义“doublea=22;inti=0,k=18;”,则不符合C语言规定的赋值语句是( )。
(分数:
1.00)
A.i=a%11;
B.i=(a+k)<=(i+k); √
C.a=a++,i++;
D.i=!
a;
解析:
取模运算符“%”为二元运算符,具有左结合性,参与运算的量应均为整型,选项B中的变量a是double型,所以选项B不符合规定。
16.有以下程序
在VC++6.0平台上编译运行,程序运行后的输出结果是( )。
(分数:
1.00)
A.4,8 √
B.4,4
C.2,4
D.10,6
解析:
C语言中利用“sizeof()”函数判断数据类型长度,在VC6平台中,整型数据int占4个字节,double型数据占8个字节。
因此本题答案为A。
17.有以下程序
当执行程序时,按下列方式输入数据(从第1列开始,代表回车,注意:
回车也是一个字符)
12
34
则输出结果是( )。
(分数:
1.00)
A.1234
B.12
C.1234
D.123 √
解析:
按照从键盘输入的数据可以判断字符1赋给了变量a,字符2赋给了变量b,字符即回车赋给了变量c,字符3赋给了变量d。
因此打印输出的结果为选项D。
18.以下关于逻辑运算符两侧运算对象的叙述中正确的是( )。
(分数:
1.00)
A.可以是任意合法的表达式 √
B.只能是整数0或非0整数
C.可以是结构体类型的数据
D.只能是整数0或1
解析:
C语言的逻辑运算符比较特别,它的操作数没有明确的数据类型,可以是任意合法的表达式,因此选择A。
19.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.编译有错 √
B.0,0,0,3
C.1,1,2,0
D.0,1,2,0
解析:
本题中“if(a=1)b=1”与“elsed=3”之间多了语句“c=2”;因此会出现else语句的位置错误的编译失败提示。
20.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.a=2,b=1 √
B.a=2,b=2
C.a=1,b=1
D.a=1,b=0
解析:
case常量表达式只是起语句标号作用,并不是该处进行条件判断。
在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从该case子句执行下去,不再进行判断,直到碰到break或语句结束为止。
因此执行内层“switch(y)”时只执行了a++,此时a的值为1,然后执行外层case2语句的“a++;b++;”,a为2,b为1。
所以结果为A。
21.以下程序段中的变量已正确定义
for(i=0;i<4;i++,i++)
for(k=1;k<3;k++);printf("*");
程序段的输出结果是( )。
(分数:
1.00)
A.**
B.***
C.* √
D.********
解析:
由于内层循环“for(k=1;k<3;k++)”后面直接跟了空语句“;”,因此在循环内部什么操作也不做,执行完内层循环后执行打印语句,所以打印了一个“*”,故本题答案C。
22.有以下程序段
以下关于程序段执行情况的叙述,正确的是( )。
(分数:
1.00)
A.当产生的随机数n为0时,结束程序运行 √
B.当产生的随机数n为4时,结束循环操作
C.当产生的随机数n为1和2时,不做任何操作
D.for循环语句固定执行8次
解析:
case常量表达式只是起语句标号作用,并不是在该处进行条件判断。
在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从该case子句执行下去,不再进行判断,直到碰到break函数结束为止。
简单地说,break是结束整个循环体,而continue是结束单次循环。
B 选项中当产生的随机数n为4时要执行打印操作。
C选项中当产生的随机数为1和2时分别执行case3与case4后面语句的内容。
由于存在break语句,因此for循环不是固定执行8次,执行次数与产生的随机数n有关系。
故本题答案为A。
23.有以下程序
程序运行后的输出结果是( )(分数:
1.00)
A.2
B.8 √
C.4
D.1
解析:
第一次调用“n=f(f(f
(1)))”,第二次为“m=f(f
(2))”,第三次为“m=f(4)”,即返回值为8,选项B正确。
24.以下叙述中错误的是( )。
(分数:
1.00)
A.当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL
B.函数可以返回地址值
C.改变函数形参的值,不会改变对应实参的值
D.可以给指针变量賦一个整数作为地址值 √
解析:
不能将一个整数直接赋给指针变量作为地址,因此D是错误的。
函数的返回值可以是地址,即指针。
函数调用中形参值的变化不会传递给实参。
故本题答案为D。
25.设已有定义“floatx;”,则以下对指针变量p进行定义且賦初值的语句中正确的是( )。
(分数:
1.00)
A.float*p=&x; √
B.int*p=(float)x;
C.floatp=&x;
D.float*p=1024;
解析:
指针是用来存放地址的变量,用“类型名*指针变量名”的形式定义。
赋值时应将某个变量地址即&x赋给指针变量,因此选择A。
26.以下数组定义中错误的是( )。
(分数:
1.00)
A.intx[][3]={{1,2,3},{4,5,6}};
B.intx[][3]={0};
C.intx[2][3]={{1,2},{3,4},{5,6}}; √
D.intx[2][3]={1,2,3,4,5,6};
解析:
C选项中x[2][3]定义的是一个2行3列的二维数组,而在给数组元素赋值时却赋成了3行,因此错误。
27.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.321678 √
B.876543
C.1098765
D.345678
解析:
本题中,函数fun()的功能是将数组k中前5个元素倒序,因此返回后数组k中的元素排列是“5,4,3,2,1,6,7,8,9,10”。
程序打印输出k[2]到k[7]元素的值,即3321678,所以选择A。
28.有以下程序
#include
#defineN4
voidfun(inta[][N],intb[])
{ inti;
for(i=0;i}
main()
{ int x[N][N]]={1,2,3,4},{5,6,7,8};{9,10,11,12},{13,14,15,16}},y[N],i;
fun(x,y);
for(i=0;i}
程序运行后的输出结果是( )。
(分数:
1.00)
A.-3-14,3, √
B.-12,-3,〇A
C.0,1,2,3,
D.-3,-3,-3,-3,
解析:
本题中由fun函数可知,b[0]=a[0][0]-a[0][3]=1-4=-3,b[1]=a[1][1]-a[1][2]=6-7=-1,b[2]=a[2][2]-a[2][1]=11-10=1,b[3]=a[3][3]-a[3][1]=16-13=3。
因此主函数中打印y数组元素的值为A选项。
29.设有定义“char s[81];int i=0;”,以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是( )。
(分数:
1.00)
A.while((s[i++]=getchar())!
='\n';
B.scanf("%s",s); √
C.gets(s);
D.do{scanf("%c",&s[i]);}while(s[i++]!
='\n');s[i]='\0'
解析:
字符串的输入不能細“scanf("%s",s)”,而应该使用“get(s)",因此选择B。
30.设有定义“charP[]={'1','2','3’},*q=p;”,以下不能计算出一个char型数据所占字节数的表达式是( )。
(分数:
1.00)
A.sizeof(p) √
B.sizeof(char)
C.sizeof(*q)
D.sizeof(p[0])
解析:
根据题目中的定义可以知道“sizeof(p)”,计算的是数组P中所有元素所占用的字节数,而不是char型数据所占字节数。
31.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.10,one*World
B.9,One*Dream!
C.9,One*World
D.10,One*Dream!
√
解析:
是指向二维字符数组第二行“〇ne*Dream!
”的数组指针,因此长度是10,打印输出的也是该字符串。
32.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.7
B.0
C.3 √
D.8
解析:
本题中遇到“\”字符循环结束,因此只统计“\”之前的数字字符,结果为3。
33.有以下程序
#include
fun(intx,inty)
{ staticintm=0,i=2;
i+=m+1; m=i+x+y; returnm;
}
main()
{ intj=1,m=1,k;
k=fun(j,m); printf("%d,",k);
k=fun(j,m); printf("%d\n",k);
}
程序运行后的输出结果是( )。
(分数:
1.00)
A.5,11 √
B.5,5
C.11,11
D.11,5
解析:
声明静态局部变量:
函数调用结束后,其占用的存储单元不释放,在下次该函数调用时,该变量保留上一次函数调用结束时的值。
本题子函数fun中的变量i和m均为静态局部变量。
因此第一次调用fun函数,返回m的值为5,第二次再调用fun函数时,i的值为3,m的值已经是5了,所以执行i+=m+1,i的值变为9,m=i+x+y=9+1+1=11,故本题答案为A。
34.在C语言中,只有在使用时才占用内存单元的变量,其存储类型是( )。
(分数:
1.00)
A.auto和register √
B.extern和register
C.auto和static
D.static和register
解析:
auto:
函数中的局部变量动态地分配存储空间,数据存储在动态存储区中,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。
register:
为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,只有局部自动变量和形式参数可以作为寄存器变量。
extern:
外部变量(全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件末尾。
static:
静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。
根据以上分析可知,故本题答案为A。
35.下面结构体的定义语句中,错误的是( )。
(分数:
1.00)
A.structord{intx;inty;intz;}structorda; √
B.structord{intx;inty;intz;};structorda;
C.structord{intx;inty;intz;}a;
D.struct{intx;inty;intz;}a;
解析:
A选项“structord{intx;inty;intz;}structorda;”错误,不能在定义结构体的同时,又用结构体类型名定义变量,应该写成B选项或者D选项的格式。
36.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.2,4
B.1,2 √
C.1,4
D.2,3
解析:
结构体变量可以作为函数的参数和返回值。
作为函数的实参时,可以实现函数的传值调用。
当使用结构体变量作为函数的形参时,实参也应该是结构体变量名以实现传值调用,实参将复制的副本传递给形参,在被调用函数中改变形参值对于调用函数中的实参没有影响。
因此本题选择B。
37.以下叙述中正确的是( )。
(分数:
1.00)
A.在C语言中,预处理命令行都以#开头 √
B.预处理命令行必须位于C源程序的起始位置
C.#include必须放在C程序的开头
D.C语言的预处理不能实现宏定义和条件编译的功能
解析:
预处理命令是以“#”号开头的命令,它们不是C语言的可执行命令,这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,因此B、C选项错误。
C语言的预处理能够实现宏定义和条件编译等功能,因此D选项错误。
故本题答案为A。
38.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.20 √
B.10
C.0
D.出错
解析:
“malloc(sizeof(int))”的作用是开辟一个长度为“sizeof(int)”的存储空间,并通过强制类型转换“(int*)”将此存储空间的地址赋给了一个整型的指针变量p。
然后执行语句*p=n,使得*p的值为10,并通过return返回此值,即a的值为10。
然后在主函数中输出a+fun(10)=10+10=20。
故本题答案为A。
39.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.32
B.16
C.1 √
D.0
解析:
无符号整型变量a的值为8,二进制表示为00001000,右移3位后为00000001,即十进制的1,因此输出1。
40.读取二进制文件的函数调用形式为“fread(buffer,size,count,fp);”,其中buffer代表的是( )(分数:
1.00)
A.—个内存块的首地址,代表读入数据存放的地址 √
B.—个整型变量,代表待读取的数据的字节数
C.一个文件指针,指向待读取的文件
D.—个内存块的字节数
解析:
“fread(void*buffer,sizet_size,sizet_count,FILE*stream)”功能是从一个文件流中读数据,读取count个元素,每个元素占size个字节,如果调用成功返回count。
buffer用于接收数据的内存地址,大小至少是size*count个字节;size是单个元素的大小,单位是字节;count是元素的