计算机二级C语言模拟题1.docx
《计算机二级C语言模拟题1.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言模拟题1.docx(21页珍藏版)》请在冰豆网上搜索。
![计算机二级C语言模拟题1.docx](https://file1.bdocx.com/fileroot1/2023-2/22/db24ef6c-fbd9-430b-8eb5-7c292ef2c0ec/db24ef6c-fbd9-430b-8eb5-7c292ef2c0ec1.gif)
计算机二级C语言模拟题1
2018年计算机二级C语言模拟题1
(总分:
100.00,做题时间:
120分钟)
一、选择题
(每题1分,共40分)
(总题数:
40,分数:
40.00)
1.程序流程图中带有箭头的线段表示的是( )。
(分数:
1.00)
A.图元关系
B.数据流
C.控制流 √
D.调用关系
解析:
【解析】在数据流图中,用标有名字的带箭头线段表示数据流。
在程序流程图中,用标有名字的带箭头线段表示控制流,因此本题答案为C)。
2.结构化程序设计的基本原则不包括( )。
(分数:
1.00)
A.多态性 √
B.自顶向下
C.模块化
D.逐步求精
解析:
结构化程序设计的思想包括:
自顶向下、逐步求精、模块化、限制使用goto语句,多态性是面向对象的程序设计的思想,因此本题答案为A)。
3.软件设计中模块划分应遵循的准则是( )。
(分数:
1.00)
A.低内聚低耦合
B.高内聚低耦合 √
C.低内聚高耦合
D.高内聚高耦合
解析:
软件设计中,模块划分应遵循的准则是高内聚低耦合、模块大小规模适当、模块的依赖关系适当等。
模块的划分应遵循一定的准则,以保证模块划分合理,并进一步保证以此为依据开发出的软件系统可靠性高,易于理解和维护。
模块之间的耦合应尽可能地低,模块的内聚应尽可能地高,因此本题答案为B)。
4.算法的有穷性是指( )。
(分数:
1.00)
A.算法程序的运行时间是有限的 √
B.算法程序所处理的数据量是有限的
C.算法程序的长度是有限的
D.算法只能被有限的用户使用
解析:
算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
算法的有穷性是指算法程序的运行时间是有限的,因此本题答案为A)。
5.在软件开发中,需求分析阶段产生的主要文档是( )。
(分数:
1.00)
A.可行性分析报告
B.软件需求规格说明书 √
C.概要设计说明书
D.集成测试计划
解析:
A)错误,可行性分析阶段产生可行性分析报告。
C)错误,总体设计阶段产生概要设计说明书。
D)错误,集成测试计划是在概要设计阶段编写的文档。
B)正确,需求规格说明书是需求分析阶段产生的主要文档,是后续工作如设计、编码等需要的重要参考文档。
6.对长度为n的线性表排序,在最坏情况下,比较次数不是n(n-1)/2的排序方法是( )。
(分数:
1.00)
A.快速排序
B.冒泡排序
C.直接插入排序
D.堆排序 √
解析:
快速排序、冒泡排序和直接插入排序在最坏情况下,比较次数都是n(n-1)/2,堆排序在最坏情况下的比较次数最少,是O(log2n),因此本题答案为D)。
7.下列关于栈的叙述正确的是( )。
(分数:
1.00)
A.栈按“先进先出”组织数据
B.栈按“先进后出”组织数据 √
C.只能在栈底插人数据
D.不能删除数据
解析:
栈是只允许在同一端进行插入和删除运算的线性表,按“先进后出”组织数据,因此本题答案为B)。
8.在数据库设计中,将E-R图转换成关系数据模型的过程属于( )。
(分数:
1.00)
A.需求分析阶段
B.概念设计阶段
C.逻辑设计阶段 √
D.物理设计阶段
解析:
将E-R图转换成关系数据模型是把图形分析出来的联系反映到数据库中,即设计出表,因此属于逻辑设计阶段,答案为C)。
9.有三个关系R、S和T如下:
由关系R和S通过运算得到关系T,所使用的运算为( )。
(分数:
1.00)
A.并
B.自然连接
C.笛卡儿积
D.交 √
解析:
自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,因此B)错误。
笛卡儿积是用R集合中的元素为第一元素,S集合中的元素为第二元素构成的有序对,因此C)错误。
根据关系T可以很明显地看出是从关系R与关系S中取得相同的关系组,所以使用的是交运算,选择D)。
10.下列叙述中错误的是( )。
(分数:
1.00)
A.—个C语言程序只能实现一种算法 √
B.C程序可以由多个程序文件组成
C.C程序可以由一个或多个函数组成
D.—个C函数可以单独作为一个C程序文件存在
解析:
一个C程序可以有一个或多个程序文件,也可以有一个或多个函数,所以一个C语言程序可以实现多种算法。
11.设有表示学生选课的三张表,学生S (学号,姓名,性别,年龄,身份证号),课程C (课号,课名),选课SC(学号,课号,成绩),则表SC的关键字(键或码)为( )。
(分数:
1.00)
A.课号,成绩
B.学号,成绩
C.学号,课号 √
D.学号,姓名,成绩
解析:
学号是学生表S的主键,课号是课程表C的主键,因此选课表SC的关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号,故本题答案为C)。
12.以下选项中,能用作数据常量的是( )。
(分数:
1.00)
A.115L √
B.0118
C.1.5el.5
D.o115
解析:
选项中115L表示115是长整型数据,合法。
B)选项是八进制常量的表示方法,但是在八进制中不能含有数字8,因此B)选项错误。
C)选项中e后面应该是整数,不能是小数(1.5),因此C)选项错误。
D)选项中八进制常量应该是以数字“0”开始,而不是以字母“o”开始。
故本题答案为A)。
13.按照C语言规定的用户标识符命名规则,不能出现在标识符中的是( )。
(分数:
1.00)
A.下画线
B.大写字母
C.数字字符
D.连接符 √
解析:
C语言中标识符由字母、下画线或数字组成,且开头必须是字母或下画线。
因此D)选项中的连接符不合法。
14.设变量已正确定义并赋值,以下正确的表达式是( )。
(分数:
1.00)
A.x=y+z+5,++y √
B.int(15.8%5)
C.x=y*5=x+z
D.x=25%5.0
解析:
B)与D)选项中取模运算符%的左右两个操作数均应为整数,因此B)、D)选项错误。
C)选项中不能将x+z的值赋给表达式y*5,因此C)选项错误。
故本题答案为A)。
15.设有定义“int x=2;”,以下表达式中,值不为6的是( )。
(分数:
1.00)
A.x++,2*x
B.2*x,x+=2 √
C.x*=(l+x)
D.x*=x+1
解析:
选项B)中,2*x对x的值没有影响,x仍为2,“x+=2”执行后,表达式值为4。
故本题答案为B)。
16.有以下程序
#include
main()
{intx,y,z;
x=y=l;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z);
}
程序运行后的输出结果是( )。
(分数:
1.00)
A.2,3,1 √
B.2,3,2
C.2,3,3
D.2,2,1
解析:
对于表达式“Z=x++,y++,++y;”,因为赋值运算符的优先级高于逗号运算符的优先级,所以可以将上式改成“(z=x++),(y++),(++y)”。
然后从左向右先计算表达式z=x++,因为x++先使用后自增,所以z的值为1,x的值为2。
再计算逗号表达式第二个表达式y++,此时y的值为1,y++的值为2。
最后计算第三个表达式++y,y的值为3,故本题答案为A)。
17.有以下程序#include
main()
{charcl,c2;
c1=’A’+’8’-’4’;
c2=’A’+’8’-’5’;
printf("%c,%d\n",cl,c2);
}
已知字母A的ASCII码为65,程序运行后的输出结果是( )。
(分数:
1.00)
A.E,D
B.D,69
C.E,68 √
D.输出无定值
解析:
本题中字符变量cl是字符'A'的ASCII码加上4,即69所对应的字符'E'。
字符变量c2是字符’A'的ASCII码加上3,即68所对应的字符'D^。
但是打印输出时,C1以%c的格式输出,因此是E,c2以%d的格式输出,因此是68。
故本题答案为C)。
18.有以下程序
#include
main()
{intx=l,y=0;
if(!
x)y++;
elseif(x==0)
if(x)y+=2;
elsey+=3;
printf(“%d\n”,y);
}
程序运行后的输出结果是( )。
(分数:
1.00)
A.3
B.2
C.1
D.0 √
解析:
在ifelse语句中else总是与离它最近的if配对。
本题目中x为1,因此“!
x”为0,所以执行elseif语句中的内容,判断“x==0”是否成立,因为x为1,所以条件不成立,因此elseif内部的“if...else”语句不再执行,所以y的值还是初始值0。
19.若有定义“intx,y;”并已正确给变量赋值,则以下选项中与表达式“(x-y)?
(x++):
(y++)”中的条件表达式(x-y)等价的是( )。
(分数:
1.00)
A.(x-y0) √
B.(x-y<0)
C.(x-y>0)
D.(x-y==0)
解析:
条件表达式“x=表达式1?
表达式2:
表达式3”的含义是:
先求解表达式1,若其值为非0(真),则求解表达式2,将表达式2的值赋给x;若表达式1的值为0(假),则求解表达式3,将表达式3的值赋给x。
在本题中与表达式(x-y)等价的是“(x-y<0||x-y>0)”,A)选项正确。
20.有以下程序
#include
main()
{ inty=9;
for(;y>O;y--)
if(y%3==O)printf("%d",--y);
}
程序运行后的输出结果是( )。
(分数:
1.00)
A.852 √
B.963
C.741
D.875421
解析:
第一次执行for循环,y的值为9,y%3的值为0,满足条件打印,所以执行“--y”语句,即先减1后打印,因此打印8;第二次执行for循环,y的值为7,y%3的值为1,不执行打印语句;第三次执行for循环,y的值为6,y%3的值为0,满足条件打印,所以执行“--y”语句,即先减1后打印,因此打印5;第四次执行for循环,y的值为4,不满足if条件,不执行打印语句;第五次执行for循环,y的值为3,满足if条件,打印输出2;第六次执行for循环,y的值为1,不满足条件,不执行打印语句。
故本题答案为A)。
21.若有定义“floatx=1.5;inta=l,b=3,c=2;”,则正确的switch语句是( )。
(分数:
1.00)
A.
√
B.
C.
D.
解析:
B)选项的“switch((int)x);”语句中不应该有最后的分号。
“switch(exprl)”中的exprl不能用浮点类型或long类型,也不能是一个字符串,因此C)错误。
case后面只能是常量表达式,因此D)错误。
22.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.m=4
B.m=2
C.m=6 √
D.m=5
解析:
第一次外循环i的值为1,第一次内循环j的值为3,不满足条件,则执行"m*=i*j",即m的值为3;第二次j的值为2,不满足条件,则执行m*=i*j,即m的值为6;第三次j的值为1,不满足条件,则执行m*=i*j,即m的值仍为6。
第二次外循环i的值为2,j的值为3,满足条件,执行break语句,跳出循环。
故本题答案为C)。
23.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.6 √
B.3
C.8
D.12
解析:
本题中第一次调用为“fun(8,fun(5,6))”,因为“fun(5,6)”返回值为5,所以第二次调用为“fun(8,5)=6”,因此选择A)。
24.有以下程序
则以下函数调用语句错误的是( )。
(分数:
1.00)
A.k=f(a,b);
B.k=add(a,b);
C.k=(*f)(a,b);
D.k=*f(a,b); √
解析:
D)选项中“*f(a,b)”表示调用后返回一个指向整型数据的地址指针,即该函数的返回值为指针类型,因此不能将其赋值给整型变量k。
25.有以下程序
该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是( )。
(分数:
1.00)
A.intn,*p=NULL; √
B.*p=&n;
C.scanf(”%d”,&p)
D.printf(”%d\n”,p);
解析:
选项B)的正确写法应为“P=&n;”,选项C)的正确写法应为“scanf("%d",p);”,选项D)的正确写法应为“printf("%d\n",*p);”。
故本题答案为A)。
26.下列定义数组的语句中,正确的是( )。
(分数:
1.00)
A.
B.
√
C.intx[0..10];
D.intx[];
解析:
数组说明的一般形式为:
类型说明符数组名[常量表达式]。
A)中N是变量,不能用变量定义数组长度。
C)选项中数组长度是非法的一串数字,定义数组时必须为其指明长度。
D)选项中数组长度为空,因此非法。
故本题答案为B)。
27.以下语句中存在语法错误的是( )。
(分数:
1.00)
A.charss[6][20];ss[1]="right?
"; √
B.charss[][20]={"right?
"};
C.char*ss[6];ss[1]="right?
";
D.char*ss[]={"right?
"};
解析:
数组定义后,不能对数组整体赋值,ss是二维数组,因为ss[l]是一维字符数组,即字符串,字符串赋值可以使用“StrcPy(SS[l],"right");”的形式,而选项A)中对二维数组中的第“1”维(相当于一个一维数组)赋值,是不可以的。
选项B)和D)是在定义时对数组同时进行初始化,这是可以的。
选项C)中,将字符串在内存中的首地址赋给指针数组的一个元素,这是可以的。
故本题答案为A)。
28.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.3040 √
B.2050
C.3344
D.0304
解析:
第一次循环i为0,i%2为0,执行“switch(a[0]%2)”中的case0语句后内容即a[0]++,a[0]的值变成3;第二次循环i的值为1,i%2为1,执行“casel:
a[i]=0;”后a[l]的值变成0;第三次循环i的值为2,i%2为0,执行“switch(a[2]%2)”中的“case1:
a[2]--;”a[2]的值变成4;第四次循环i的值为3,i%2为1,执行“casel:
a[i]=0;”,因此a[3]的值变成0。
故本题答案为A)。
29.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.3
B.4 √
C.1
D.9
解析:
每次内循环只循环一次就结束,第一次外循环时“t=t+b[0][b[0][0]]=l+b[0][0]=1+0=1;”,第二次外循环时“t=t+b[1]b[l][l]]=l+b[l][l]=l+l=2;”,第三次外循环时“t=t+b[2][b[2][2]]=2+b[2][2]=2+2=4”。
故本题答案为B)。
30.以下不能将s所指字符串正确复制到t所指存储空间的是( )。
(分数:
1.00)
A.while(*t=*s){t++;s++;}
B.for(i=0;t[i】=s[i];i++);
C.do{*t++=*s++;}while(*s); √
D.for(i=0,j=0;t[i++]=s[j++];);
解析:
“do{*t++=*s++;}while(*s);”语句中,因为当“*s='\0'”时,“while(*s)”跳出循环,这样字符串结束标志'\o'没有复制给*t,造成了*t不完整。
注意,*t++=*s++是先执行t=*s,然后才进行t=t+l,s=s+l。
而选项B)、A)、D)都能将'\0',复制过去。
31.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.1bc,a23 √
B.abc,123
C.123,abc
D.321,cba
解析:
字符串是一个特殊的数组,按照数组的规则,s1应该指向的是数组的首地址,即“abc”的第一个字符的地址。
S2指向的是“123”的第一个字符的地址。
调用swap函数之后交换的是两个字符串的第一个字符'a'和'1'的内容,因此打印输出为A)。
32.有以下函数
函数的功能是( )。
(分数:
1.00)
A.统计x和y所指字符串中最前面连续相同的字符个数 √
B.查找x和y所指字符串中是否有'\0'
C.将y所指字符串赋给x所指存储空间
D.统计x和y所指字符串中相同的字符个数
解析:
本题中由循环条件可知,当遇到'\0’或“x与y所指的字符的值不相等”中的一个条件时就结束循环,因此本题函数的功能是统计x和y所指字符串中最前面连续相同的字符个数。
33.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.30
B.10
C.0
D.64 √
解析:
本题目中静态局部变量X,在静态存储区内分配存储单元,在程序整个运行期间都不释放。
因此第一次循环s的值为2;第二次循环中,返回的x的值为4,因此S的值为8;第三次循环,返回的x的值为8,因此S的值为64。
34.在一个C源程序文件中所定义的全局变量,其作用域为( )。
(分数:
1.00)
A.所在文件的全部范围
B.所在程序的全部范围
C.所在函数的全部范围
D.由具体定义位置和extern说明来决定范围 √
解析:
全局变量的作用域是从声明处到文件的结束,因此选择D)。
35.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.21 √
B.11
C.20
D.10
解析:
声明data是结构S的数组。
初始化时“data[0].a=10;data[0].b=100;data[l].a=20;data[l].b=200”。
主函数中p=data[l],即“p.a=data[l].a;p.b=data[l].b;”,执行语句“printf("%d\n”,++(p.A));”打印输出时P.a先增1再打印。
即p.a=data[l].a=20,先增1等于21,因此程序运行结果是21。
36.以下叙述中错误的是( )。
(分数:
1.00)
A.用typedef定义新的类型名后,原有类型名仍有效
B.可以用typedef将已存在的类型用一个新的名字来代表
C.可以通过typedef增加新的类型 √
D.用typedef可以为各种类型起别名,但不能为变量起别名
解析:
关键字typedef的作用只是将C语言中已有的数据类型作置换,并不是增加新的类型,因此C)错误。
37.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.31.5
B.程序有错无输出结果 √
C.7.5
D.14.0
解析:
宏定义不是C语句,末尾不需要有分号。
因此语句“printf(%4.1f\n",S(a+b));”展开后为“printf("%4.1f\n",3.5;*a+b*a+b;);”,所以程序会出现语法错误。
38.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.4 √
B.3
C.5
D.6
解析:
“&”按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
“丨”按位或,即两个相应的二进制位中只要有一个为1,该位的结果值为1。
2的二进制为00000010,4的二进制为00000100,因此做或运算结果为00000110,该数与5即00000101做与运算,结果为00000100,即4,选项A)正确。
39.有以下程序
程序运行后的输出结果是( )。
(分数:
1.00)
A.1,1,3
B.2,2,3
C.1,2,3
D.3,3,3 √
解析:
malloc函数动态分配一个整型的内存空间,然后把函数返回的地址用(int*)强制类型转换为整型指针,再把它赋给a,b,c,即让指针变量a,b,c都指向刚申请的内存空间。
因此只有最后一个赋值语句*c=3的值保留在了该空间内,因为a,b,c三个指针变量均指向该空间,所以打印该空间内的数值均为3,选项D)正确。
40.以下叙述中正确的是( )。
(分数:
1.00)
A.当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失 √
B.打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖
C.在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据
D.C语言中的文件是流式文件,因此只能顺序存取数据
解析:
B)选项中打开一个已存在的文件并进行了写操作后,原有文件中的全部数据不一定被覆盖,也可以对源文件进行追加操作等。
C)选项中在一个程序中当对文件进行了写操作后,不用先关闭该文件然后再打开,才能读到第1个数据,可以用fseek()函数进行重新定位即可。
D)选项中,C语言中的文件可以进行随机读写。
故本题答案为A)。
二、程序填空题
(总题数:
1,分数:
20.00)
函数fun的功能是进行字母转换。
若形参ch中是小写英文字母,则转换成对应的大写英文字母;若ch中是大写英文字母,则转换成对应的小写英文字母;若是其他字符则保持不变;并将转换后的结果作为函数值返回。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
(分数:
20.00)
填空项1:
__________________ (正确答案:
(1)&&
(2)'A'
(3)ch)
解析:
填空1:
if条件表达式的考查,判断ch是否为小写字母,因而本空应该填写&&。
填空2:
大小写转换的考查,大写转小写ASCII+32,因此本空应填'A' 。
填空3:
按题意若是其他字符则保持不变,并返回。
此空要表达的就是既不是大写字母也不是小写字母,因而此空应该填写ch。
三、程序改错题
(总题数:
1,分数:
20.00)
给定程序MODI1.C中函数fun的功能是:
给一维数组a输人任意4个整数,并按下例的规律输出。
例如输入1、2、3、4,程序运行后将输出以下