全国计算机二级C语言笔试模拟442.docx
《全国计算机二级C语言笔试模拟442.docx》由会员分享,可在线阅读,更多相关《全国计算机二级C语言笔试模拟442.docx(33页珍藏版)》请在冰点文库上搜索。
![全国计算机二级C语言笔试模拟442.docx](https://file1.bingdoc.com/fileroot1/2023-7/23/524d5f22-e25b-4808-9e2d-6665987a8e5c/524d5f22-e25b-4808-9e2d-6665987a8e5c1.gif)
全国计算机二级C语言笔试模拟442
二级C语言笔试模拟442
一、选择题
1.以下程序运行后的输出结果是
#include<stdio.h>
main()
{intc=0,k;
for(k=1;k<3;k++)
switch(k)
{ default:
c+=k;
case2:
c++;break;case4:
c+=2;break;
}
printf("%d\n",c);
}
A.3
B.5
C.7
D.9
答案:
A
[解答]for循环2次:
当循环变量k=1时,从default入口,执行c+=k;,再顺序执行c++;,break跳出switch结构,此时c的值为2;当循环变量k=2时,从case2入口,执行c++;,break跳出switch结构,此时c的值为3;退出循环结构,输出c值3。
2.有以下计算公式:
若程序前面已在命令行中包括math.h文件,不能够正确计算上述公式的程序是______。
A.if(x>=0)y=sqrt(x);
elsey=sqrt(-x);
B.y=sqrt(x);
if(x<0)y=sqrt(-x);
C.if(x>=0)y=sqrt(x);
D.y=sqrt(x>=0?
x:
-x);
答案:
C
[解答]本题考查的重点是分段数学公式的求解。
选项D是正确的,它是用问号表达式“exp1?
exp2:
exp3”来代替ifelse语句,其运算过程是:
先对exp1求值,如果exp1值为真时,对exp2求值并将所求结果作为整个问号表达式的值。
若exp1的值为假时,对exp3求值并将结果作为整个问号表达式的值。
因而程序“y=sqrt(x>=0:
-x)”是先判断x>=0,若为真,则计算结果为sqrt(X),否则计算结果为sqrt(-X),且该函数包含于math.h头文件中。
选项A和B也是对的,只有选项C不能正确计算上述功能。
3.与“for(i=0;i<10;i++)putchar('a'+i);”功能不同的语句是______。
A.for(i=0;i<10;)putchar('a'+(++i));
B.for(i=0;i<10;)putchar('a'+(i++));
C.for(i=0;i<10;putchar('a'+i),i++);
D.for(i=0;i<=9;i++)putchar('a'+i);
答案:
A
4.在顺序表(3,6,8,10,12,15,16,18,21,25,30)中,用二分法查找关键码值11,所需的关键码比铰次数为______。
A.2
B.3
C.4
D.5
答案:
C
[解答]二分法查找是用关键码与线性表的中间元素比较,然后根据比较结果来判断是结束查找,还是在左边或者右边子表按相同的方法继续查找。
本题中,与11比较的关键码分别为15,8,10,12四个。
5.下面程序的输出是。
main()
{intt=1;fun(fun(t));}
fun(inth)
{staticinta[3]={1,2,3};
intk;
for(k=0;k<3;k++)a[k]+=a[k]-h;
for(k=0;k<3;k++)printf("%d",a[k]);
printf("\n");
return(a[h]);}
A.1,2,3,
1,5,9,
B.1,3,5,
1,3,5,
C.1,3,5,
0,4,8,
D.1,3,5,
-1,3,7,
答案:
D
[解答]本题考查双重函数调用及for循环使用,fun函数中第一个for循环语句的作用是给数组a赋值。
当第一次调用fun函数时,把实参1传给形参,输出a数组的元素为1,3,5;第二次调用fun函数时,由于数组a为静态局部变量,故输出a数组的元素为-1,3,7。
6.若要用下面的程序片段使指针变量p指向一个存储整型变量的动态存储单元,则应填入()
int*p
p=_______malloc(sizeof(int));
A.int
B.int
C.(*int)
D.(into*)
答案:
D
7.若有语句int*point,a=4;和point=&a;下面均代表地址的一组选项是。
A.a,point,*&a
B.&*a,&a,*point
C.*&point,*point,&a
D.&a,&*point,point
答案:
D
[解答]“&”是求地址运算符,“*”是指针变量说明符,本题只有选项D)中的各项均代表地址,其中&*point等价于point。
8.C语言库函数fgets(str,n,fp)的功能是______。
A.从fp指向的文件中读取长度n的字符串存入str旨向的内存
B.从fp指向的文件中读取长度不超过n-1的字符串存入str指向的内存
C.从fb指向的文件中读取n个字符串存入str指向的内存
D.从str读取至多n个字符到文fp
答案:
B
[解答]fgets函数的作用是从指定的文件读入—个字符串。
fgets(str,n,fp);中的n为要求得到的字符的个数,但只从中指向的文件输入n-1个字符,然后在最后加—个'\0'字符,因此得到的字符串共有n个字符。
9.若有定义int*p[3];,则以下叙述中正确的是______。
A.定义了一个基类型为int的指针变量p,该变量有三个指针
B.定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
C.定义了一个名为*p的整型数组,该数组含有三个int类型元素
D.定义了一个可指向二维数组的指针变量p,所指一维数组应具有三个int类型元素
答案:
B
[解答]由于运算符[]优先级比*高,int*p[3];相当于int*(p[3]);,表示数组p的三个元素都是指针变量,且每个元素都是基类型为int的指针。
10.下列叙述中错误的是______。
A.一个C语言程序只能实现一种算法
B.C程序可以由多个程序文件组成
C.C程序可以由一个或多个函数组成
D.一个C函数可以单独作为一个C程序文件存在
答案:
A
[解答]一个C语言程序可以实现多种算法。
C程序可包含一个或多个函数,并可由多个程序文件组成。
11.在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段是()。
A.概要设计
B.详细设计
C.可行性分析
D.需求分析
答案:
D
[解答]通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。
也就是说,软件产品从考虑其概念开始,到该软件产品不能使用为止的整个时期都属于软件生命周期。
软件生命周期的主要活动阶段为:
①可行性研究和计划制定。
确定待开发软件系统的开发目标和总的要求,给出它的功能、性能、可靠性以及接口等方面的可能方案,制定完成开发任务的实施计划。
②需求分析。
对待开发软件提出的需求进行分析并给出详细定义,即准确地确定软件系统的功能。
编写软件规格说明书及初步的用户手册,提交评审。
③软件设计。
系统设计人员和程序设计人员应该在反复理解软件需求的基础上,给出软件的结构、模块的划分、功能的分配以及处理流程。
④软件实现。
把软件设计转换成计算机可以接受的程序代码。
即完成源程序的编码,编写用户手册、操作手册等面向用户的文档,编写单元测试计划。
⑤软件测试。
在设计测试用例的基础上,检验软件的各个组成部分。
编写测试分析报告。
⑥运行和维护。
将已交付的软件投入运行,并在运行使用中不断地维护,根据新提出的需求进行必要而且可能的扩充和删改。
12.请读程序:
#include<stdio.h>
main()
{
inta;floatb,c;
scanf("%2d%3f%4f",&a,&b,&c);
printf("\na=%d,b=%f,c=%f\n",a,b,c);
}
若运行时从键盘上输入9876543210,↓,则上面程序的输出络果是_______。
A.a=98,b=765,c=4321
B.a=10,b=432,c=8765
C.a=98,b=765.000000,c=4321.000000
D.a=98,b=765.0,c=4321.0
答案:
C
[解答]scanf()把用户从键盘录入的数字第1、2位存入整型变量a;把第3、4、5位存入单精度实型变量b,把第6、7、8、9位存入单精度实型变量c,用户录入的第10位被scanf()遗弃。
这时变量a、b、c的值分别为:
98、765.000000、4321.0000000。
13.有以下程序
main()
{inta=0,i;
for(i=1;i<5;i++)
{switch(i)
{case0
case3:
a+=2;
case1;
case2;a+=3;
default,a+=5;
}
}
printf("%d\n",a);
}
A.31
B.13
C.10
D.20
答案:
A
14.定义如下变量和数组:
inti;
intx[3][3]={1,2,3,4,5,6,7,8,9};
则下面语句的输出结果是
for(i=0;i<3;i++)
printf("%d",x[2-1][1]);
A.951
B.741
C.753
D.963
答案:
C
[解答]本题考查二维数组元素的引用方法。
本题通过二维数组的行、列下标来定位元素的位置,从而实现元素的引用。
15.将E-R图转换到关系模式时,实体与联系都可以表示成()。
A.属性
B.关系
C.键
D.域
答案:
B
[解答]把概念模型转换成关系数据模型就是把E-R图转换成一组关系模式,每一个实体型转换为一个关系模式,每个联系分别转换为关系模式。
16.将E-R图转换到关系模式时,实体与联系都可以表示成______。
A.属性
B.关系
C.键
D.域
答案:
B
[解答]关系是由若干个不同的元组所组成,因此关系可视为元组的集合,将E-R图转换到关系模式时,实体与联系都可以表示成关系。
17.若有定义:
inta[2][3];,以下选项中对a数组元素正确引用的是。
A.a[2][1]
B.a[2][3]
C.a[0][3]
D.a[1>2][!
1]
答案:
D
[解答]C语言中数组下标是从0开始的,所以二维数组a[2][3]的第一维下标取值为0、1;第二维的下标取值为0、1、2,因而选项A)、B)、C)都是错误的,选项D)表示数组元素a[0][0]。
18.阅读下列程序,则执行后的结果为
#include"stdio.h"
main()
{intc[][4]={1,2,3,4,5,6,7,34,213,56,62,3,23,12,34,56};
printf("%x,%x\n",c[2][2],*(*(c+1)+1));}
A.3e,6
B.62,5
C.56,5
D.3E,6
答案:
A
[解答]数组c[][4]表示一个4行4列数组,c[2][2]表示第3行第3列上的元素62,*(*(c+1)+1))表示第2行第2列上的元素6,通过十六进制输出为3e,6。
19.下列说法不正确的是。
A.C语言程序是以函数为基本单位的,整个程序由函数组成
B.C语言程序的一条语句可以写在不同的行上
C.C语言程序的注释行对程序的运行功能不起任何作用,所以注释应该尽可能少写
D.C语言程序的每个语句都以分号结束
答案:
C
[解答]本题涉及C语言的3个基本知识点:
①C语言的源程序是由函数构成的,函数是其基本单位,每一个函数完成相对独立的功能,其中只能包括一个主函数;②C语言规定每个语句以分号结束,其书写格式是自由的,一条语句可以写在不同的行上,或者一行也可以写多条语句;⑨注释行虽然对程序的运行不起作用,但是它可以方便程序员阅读,提高程序的可读性和可移植性,所以书写注释行还是很有必要的。
20.开发软件时对提高开发人员工作效率至关重要的是
A.操作系统的资源管理功能
B.先进的软件开发工具和环境
C.程序人员的数量
D.计算机的并行处理能力
答案:
B
[解答]软件工程鼓励研制和采用各种先进的软件开发方法、工具和环境。
工具和环境的使用又进一步提高了软件的开发效率、维护效率和软件质量。
21.有以下程序}
structs
{intx,y;} data[2]={10,100,20,200};}
main( )}
{structs*p=data;}
printf("%d\n",++(p->x));}
程序运行后的输出结果是
A)10
B)11
C)20
D)21
答案:
B
[解答]data数组中共有两个元素,指针变量p所指的单元为数组的第一个存储单元,该单元中存储了数组中的第一个元素。
故p->x值为10,++(p->x)值为11。
22.先用以下语句定义字符型变量:
charc;
然后要将字符a赋给变量c,则下列语句中正确的是______。
A.c='a';
B.c="a";
C.c="97";
D.c='97';
答案:
A
23.以下选项中非法的表达式是。
A.0<=x<100
B.i=j==0
C.(char)(65+3)
D.x+1=x+1
答案:
D
[解答]选项A)在C语言中是一个合法的关系表达式,但它并不代表数学式o<=x<100。
计算0<=x<100时,从左到右结合,先计算0<=x,其结果只能是0或1,然后再比较0<100或1<100。
根据运算符的优先级,选项B)先判断j==0是否成立,其结果只能是0或1,然后再将0或1赋给i。
选项C)中,(char)(65+3)为类型强制转换,将整数型数据转换为字符型。
选项D)是将一个数据赋给一个表达式,等号左边不合要求,所以错误。
24.若有运算符:
>、*=、<<、%、sizeof,则它们按优先级(由低至高)的正确排列次序为。
A.*=<<>%sizeof
B.<<*=>%sizeof
C.%=><<sizeof%
D.*=><<%sizeof
答案:
D
[解答]本题主要考查算术运算的优先级。
顺序如下;
*=、>、<<、%、sizeof的优先级依次递增。
25.为了避免嵌套的if-else的二义性,C语言规定:
else与______配对。
A.缩排位置相同的if
B.其之前最近的if
C.其之后最近的if
D.同一行上的if
答案:
B
[解答]在if语句中又包含一个或多个if语句称为if语句的嵌套。
应当注意if与else的配对关系,在C语言中,从最内层开始,else总是与它上面最近的(未曾配对的)if配对。
26.有以下程序
main()
{charch[]="uvwxyz",*pc;
pc=ch;printf("%c\n",*(pc+5));
}
程序运行后的输出结果是
A.z
B.0
C.元素ch[5]的地址
D.字符y的地址
答案:
A
[解答]将字符串的地址赋值给字符指针变量后,指针就指向了该字符串的第一个字符,即“*p='u'”,所以*(p+5)指向的字符是‘z’。
27.若指针p已正确定义,要使p指向两个连续的整型动态存储单元,则正确的语句是()。
A.p=2*(int*)malloc(sixeof(int))
B.p=(int*)calloc(2*sixeof(int))
C.p=(int*)malloc(2*sizeof(int))
D.p=2*(int*)calloc(sizeof(int))
答案:
C
[解答]malloc函数的调用形式:
malloc(size)。
malloc函数用来分配size个字节的存储区,返回一个指向存储区首地址基类型为void的地址,可以利用强制类型转换将其换成所需的类型,这里需转换为整型(int*)。
若不能确定数据类型所占的字节数,可使用sizeof运算符来求得,这里要求两个连续的整型动态存储单元即2*sizeof(int)。
4个选项中只有C符合题意。
28.若输入12345、abc,程序的输出结果为______。
main()
{inta;
charch;
scanf("%3d,%3c",&a,&ch);
printf("%d,%c",a,ch);
}
A.123,abc
B.123,4
C.123,a
D.12345,abc
答案:
B
[解答]指定输入数据所占列数之后,系统自动按它截取所需数据,无须分界符。
程序中指定整型变量a占3列,输入12345、abc后,系统自动将数据前3列123赋给变量a,而剩余的数据则根据具体情况赋给其他变量或作为多余数据处理。
因程序中还需对字符变量ch输入数据,虽然指定输入3列字符,但字符型数据只能有一个字符,因此把剩余的“45、abc”中第1个数据4赋给变量ch,故正确答案为选项B。
29.有以下程序:
#include<stdio.h>
main()
{
FILE*fp;
inti,k,n;
fp=fopen("data.dar","w+");
for(i=1;i<6;i++)
{
fprintf(fp,"%d",i);
if(i%3==0)
fprintf(fp,"\n");
}
rewind(fp);
fscanf(fp,"%d%d",&k,&n);printf("%d%d\n",k,n);
fclose(fp);
}
程序运行后的输出结果是()。
A.00
B.12345
C.14
D.12
答案:
D
[解答]程序首先定义了一个文件指针fp,并使用fopen()函数以“w+”方式新建一个可读写文件“data.dat”。
然后使用一个for循环,循环变量i从1递增到5,在循环体中每次写入循环变量i的值和4个空格,当i能被3整除的时候写入一个换行符。
所以循环结束时,文件中的内容应该为:
123
45
接下来程序使用rewind()函数,将文件的读写指针调回起始位置。
并调用fscanf()函数从文件中读取两个整数到变量k和n。
所以最终输出应该为:
12。
故本题选D。
30.下面是对宏定义的描述,不正确的是______。
A.宏不存在类型问题,宏名无类型,它的参数也无类型
B.宏替换不占用运行时间
C.宏替换时先求出实参表达式的值,然后代入形参运算求值
D.宏替换只不过是字符替代而已
答案:
C
[解答]宏替换实质上就是字符替代,它不可能进行计算,故C错误。
带参数的宏与函数相比,宏在程序编译之前已经将代码替换到程序内,执行时不会产生类似于函数调用的问题,可以说不占用运行时间。
31.有以下程序:
main()
{intc=35;printf("%d\n",c&c);}
程序运行后的输出结果是()。
A.0
B.70
C.35
D.1
答案:
C
[解答]本题考查的是对位与运算符&的理解。
位与运算是将两个运算分量看做两个二进制数,然后对两个二进制数的相应位进行与运算,若同时为1则结果相应位为1,否则结果相应位为0。
因此,当两个运算分量相同时,它们的相应位肯定也相同,即不同为1就同为0。
所以得到的结果和运算分量也相同。
所以,4个选项中选项C)符合题意。
32.若有定义语句:
intx=10;则表达式x-=x+x的值为
A.-20
B.-10
C.0
D.10
答案:
B
[解答]x-=x+x可化为:
x=x-(x+x),由于x初始值为10,所以计算后,x=10-20=-10,因此选B)。
33.设有intx=11:
表达式(x++*1/3)的值是()。
A.3
B.4
C.11
D.12
答案:
A
[解答]自增运算的优先级高于其他双目算术运算符,同级算术运算符结合性为自左向右。
所以表达式(x++*1/3)等价于(x++)*1/3=11*1/3=3。
34.若有以下程序:
#include<stdio.h>
inta[]={2,4,6,8};
main()
{inti;
int*p=a;
for(i=0;i<4;i++)a[i]=*p;
printf("%d\n",a[2]);
}
上面程序的输出结果是。
A.6
B.8
C.4
D.2
答案:
D
[解答]在C语言中,数组元素的下标是从0开始的。
for循环语句中,指针变量p始终指向数组a的首地址,因而执行循环赋值语句后数组各元素的值均变为2。
35.当a=1、b=2、c=3、d=4时,执行下面程序段后,x的值是。
if(a<b)
if(c<d)x=1;
else
if(a<c)
if(b<d)x=2:
elsex=3:
elsex=6:
elsex=7:
A.1
B.6
C.3
D.2
答案:
A
[解答]本题考查的是if-else语句。
第一个if语句,先判断条件,发现a<b条件成立,执行下面的语句。
第二个if语句,先判断条件,发现c<d条件成立,执行下面的语句x=1。
36.采用链接方式存储线性表的优点是______。
A.便于随机存取
B.花费的存储空间较顺序存储少
C.便于插入和删除操作
D.数据元素的物理顺序和逻辑顺序相同
答案:
C
37.现有如下定义语句
int*p,s[20],i;
p=s;
表示数组元素s[i]的表达式不正确的是
A.*(s+i)
B.*(p+i)
C.*(s=s+i)
D.*(p=p+i)
答案:
C
[解答]当p指向s数组的首地址时,表示数组元素s[i]的表达式应当有:
①s[i],②,(s+i),③*(p+i),④p[i]四种形式。
选项C)错误的原因是,数组的地址是不可变的,指针的地址是可以变的。
38.有以下程序
#in