全国计算机二级C语言笔试模拟40Word文档格式.docx
《全国计算机二级C语言笔试模拟40Word文档格式.docx》由会员分享,可在线阅读,更多相关《全国计算机二级C语言笔试模拟40Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
[解答]结构图中用带有箭头的连线表示模块之间的调用关系。
7.下列叙述中正确的是()。
A.接口复杂的模块,其耦合程度一定低
B.耦合程度弱的模块,其内聚程度一定低
C.耦合程度弱的模块,其内聚程度一定高
D.上述三种说法都不对
[解答]模块之间的连接形式以及模块接口的复杂性,是影响模块耦合的主要因素。
接口复杂的模块,其耦合程度要比接口简单的的模块强;
耦合程度弱的模块,其内聚程度一定高。
8.在关系模型中,()。
A.为了建立一个关系,首先要构造数据的逻辑关系
B.表示关系的二维表中各元组的每一个分量还可以分成若干数据项
C.一个关系的属性名表称为关系模式
D.一个关系可以包括多个二维表
[解答]在关系模型中,只要将数据按照一定的关系存入计算机,也就是建立关系,不需要事先构造数据的逻辑关系,选项A错误;
表示关系的二维表最基本的要求是,表中元组的每一个分量必须是不可分的数据项,即不允许表中再有表,选项B和选项D错误。
9.下列关系运算中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数的是()。
A.选择
B.连接
C.投影
D.并
[解答]两个关系的笛卡尔积中的属性个数是两个原关系中的属性个数之和。
即两个关系经连接运算后得到的新关系中属性个数多于原来关系中属性个数。
10.下列关于E-R图的描述中正确的是()。
A.E-R图只能表示实体之间的联系
B.E-R图只能表示实体和属性之间的联系
C.E-R图只能表示实体和属性
D.E-R图能表示实体、属性和实体之间的联系
D
[解答]E-R图不仅可以描述实体及其相互之间的联系,还可以描述多个实体集之间的联系和一个实体集内部实体之间的联系。
11.以下选项中合法的字符常量是()。
A.“B”
B.‘\O1O’
C.68
D.D
[解答]选项A中是字符串的表示方法,选项B是一个转义字符,选项C是整型常量,选项D不是常量的表示方法。
12.在C语言中,合法的长整型常数是()。
A.OL
B.4962710
C.324562&
D.216D
[解答]长整型常数可用十进制、八进制、十六进制表示,要求在数后边加上1或L作为后缀(必须加上后缀,否则无法判断该常量是短整型、整型、无符号整型还是长整型)。
选项B、c、D中都无后缀1或L,故选项B、c、D都不足合法的长整型常数,只有选现A中有后缀L,是合法的长整型常数。
13.一个完整的C语言程序包含一个或多个函数,其中唯一不可缺少的函数是()。
A.库函数
B.scanf函数
C.main主函数
D.printf函数
[解答]一个完整的C程序有且仅有一个主函数(main()函数),主函数可以调用其他各种函数,但其他函数不能调用主函数,C程序从主函数开始执行,并在主函数中结束整个程序的运行。
故选项C正确。
14.下列程序段输出的字符串长度为()。
printf("
\\aaa\'
ccc\bddd\'
"
);
A.11
B.12
C.13
D.17
[解答]转义字符有1个\\、2个\'
、1个\b,普通字符有3个a、3个c、3个d,共13个字符。
15.设有intx=11:
表达式(x++*1/3)的值是()。
A.3
B.4
C.11
D.12
[解答]自增运算的优先级高于其他双目算术运算符,同级算术运算符结合性为自左向右。
所以表达式(x++*1/3)等价于(x++)*1/3=11*1/3=3。
16.x、y、z被定义为int型变量,若从键盘给x、y、z输入数据,正确的输入语句是()。
A.INPUTx、y、z;
B.scanf("
%d%d%d"
&
x,&
y,&
z);
C.scanf("
x,y,z);
D.read("
[解答]scanf()函数要求将输入的数据存入变量所在的地址。
选项A不是C语言中的输入语句,故选项A不正确;
选项C中输入的是变量字符串而不是地址字符串,不满足scanf()函数要求将输入的数据存入变量所在的地址,故选项C不正确;
选项D不是C语言中的输入语句,故选项D不正确:
所以,4个选项中选项B符合题意。
17.以下函数值的类型是()。
fun(floatx)
{floaty;
y=3*x-4;
returny;
}
A.int
B.不确定
C.void
D.float
[解答]函数定义时如果数据类型默认,则默认为int。
函数中如果有“retum(表达式):
”语句,表达式的类型可能与函数的类型不一致,但它并不能改变函数的类型,实际情况是把表达式转换为函数值的类型作为返回值,因此本题的函数值类型是int。
18.若有如下程序:
main()
{intx=3,y=4,z;
z=(x+(y-=X*X));
%d,%d\n"
y,z);
则程序执行后的输出结果是()。
A.-4,2
B.-5,-2
C.-5,-1
D.4,-2
[解答]因为x的初始值为3,所以x*x=9,而y的初始值为4,所以y-=9后,y为-5,z=(x+(y-=x*x))=3+(-5)=-2。
故程序执行后的输出结果是-5,-2,选项B正确。
19.下面的程序运行后输出为()。
#include<stdio.h>
#include<math.h>
{inta,b;
floatc;
b=5;
c=6;
c=b+7;
b=c+1;
a=sqrt((double)b+c);
%d,%f,%d"
a+6,C,b);
A.11.000000,12.0000000,13.000000
B.11.000000,12.000000,13
C.11.0000000,12,13
D.11,12.000000,13
[解答]输出函数中a+6,b要求按整数形式输出,所以选项D正确。
20.设有定义:
10ngx=-123456L,则以下能够正确输出变量x值的语句是()。
A.printf("
x=%d\n"
x);
B.printf("
x=%1d\n"
C.peintf("
x=%8dL\n"
D.printf('
x=%LD\n"
[解答]x为一个长整型的变量,而且是一个十进制的数,它的输出控制符是%1d,所以排除选项A和选项C;
由于C语言中是区分大小写的,1d中的d不能为大写,故排除选项D。
4个选项中B正确。
21.若有定义:
inta=8,b=4,C;
执行语句“c=a/b+0.4;
”后,c的值为()。
A.1.4
B.1
C.2.0
D.2
[解答]a、b、c为整型,赋值运算符两侧的数据类型不一致,系统先自动将右侧表达式求得的数值,按赋值号左边变量的类型进行转换,再赋值给左边的变量。
去掉右侧表达式值的小数部分变为整数赋值给变量c,c的值为2。
22.以下程序的输出结果是()。
{
inta=-1,b=4,k;
k=(++a<0)&
&
!
(b--<=0);
%d%d%d\n"
m,k,a,b);
A.104
B.103
C.003
D.004
[解答]&
的优先级高于=,先计算&
左侧的表达式++a<0。
先对a加1再与0比较大小,a=-1+1=0,++a<0为假即0,&
左侧的表达式的值为0,不再计算&
右侧的表达式的值,因此b的值不变仍然为4,整个逻辑表达式的值为0,则k被赋值为0。
输出的结果为004。
23.设有如下定义:
inta=4;
则计算表达式“a+=a-a*a”后的值是()。
A.0
B.-12
C.-24
D.-8
[解答]a+=a-a*a等价于a=a+a-a*a=4+4-4*4=-8。
24.以下选项中合法的实型常数是()。
A.5E2.0
B.E-3
C..2E0
D.1.3E
[解答]在C语言中,实数有两种表示形式:
小数形式与指数形式。
小数形式的实数由整数部分、小数点和小数部分组成(必须要有小数点)。
指数形式字母e(E)之前必须有数字,且e或E后的指数必须为整数。
选项A中,5E2.0中E后面的2.0不是整数;
选项B中,E前面没有数字;
选项D中,E后面没有数字,只有选项C正确。
25.若有以下定义:
chara;
intb;
floatc;
doubled;
则表达式“a*b+d-c”值的类型为()。
A.float
B.int
C.char
D.double
[解答]参加运算的数据类型不同,要转换为统一的数据类型,double在数据类型转换中的级别最高,其他数据类型都要转化为double,因此表达式值的类型为double。
26.若执行下述程序时,从键盘输入的数据是3和6,则程序的输出结果是()。
voidmain()
{intx,y,z;
scanf("
%d%d"
X,&
y);
z=y+x;
if(x<y)
%d"
z);
A.9
B.3
C.0
D.有语法错误
[解答]变量x得到数据3,变量y得到数据6。
z=6+3=9。
x<y即3<6关系表达式的值为1,执行z=y-x=6-3=3。
最后输出z的值为3。
27.有以下程序:
{inta=15,b=21,m=0;
switch(a%3)
{case0:
m++;
break;
case1:
switch(b%2)
{default:
case0;
%d\n"
m);
程序运行后的输出结果是()。
A.1
B.2
C.3
D.4
[解答]在switch语句中break语句的作用是退出分支语句,若没有break语句则一直向下执行。
本题中首先计算switch后面括号里的表达式a%3,即15%3为0:
执行case0:
后面的语句“m++;
”,m自加1,即m为1;
遇到break语句;
然后跳出switch语句,所以最后输出的m值为1。
所以选项A正确。
28.定义如下变量:
intn=10;
则下列循环的输出结果是()。
while(n>7)
{-n;
n);
A.1098
B.987
C.10987
D.9876
[解答]第1次循环,10>7,--n=9,输出9。
第2次循环,9>7,--n=8,输出8。
第3次循环,8>7,--n=7,输出7。
29.有以下程序:
inta=5,b=4,c=3,d=2;
if(a>b>c)
d);
elseif((c-1>=d)==1)
d+1);
else
d+2)
执行后输出结果是()。
A.2
C.4
D.编译时有错,无结果
[解答]C语言规定else总是和离它最近的if语句配对。
故第一个else和第一个if配对,第二个else和第二个if配对。
首先计算第一个if后面的表达式a>b>c,表达式a>b为1,表达式1>c为0,所以执行else后面的语句。
先执行if后面的表达式,c-1>d为真,值为1。
1=1为真,执行primf语句。
所以,B选项为所选。
30.以下程序的输出结果是()。
chara[10]={'
1'
,'
2'
3'
4'
5'
6'
7'
8'
9'
\0'
),*p;
{inti;
i=8;
p=a+i;
%s\n"
p-3);
A.6
B.6789
C.'
D.789
[解答]p被定义为指针型变量,被赋值为数组a的首地址加8,即指向元素'
。
将指针向前移3位,输出'
后的字符串,遇到'
结束输出,即6789。
31.若有如下程序:
{intx[]={14,32,65,69,78,59},*t;
t=x+5;
*-t);
A.78
B.65
D.14
[解答]执行t=x+5:
使指针指向数组元素59,运算符*和--的优先级相同,结合性为自右向左,先计算--t,对t减1,使t指向数组元素78,再计算*t,取该地址单元的值78。
32.若有如下程序:
{staticchar*a[3]={"
123"
"
456"
789"
char**b;
b=a;
++b;
%s,%s\n"
*a,*a+1);
*b,b[1]);
则程序运行后的输出结果是()。
A.123,456,
456,789
B.123,23
456,56
C.123,23
D.123,456
[解答]a为指针数组,a[0]即数组a的数组名指向字符串"
的首地址,输出*a为"
,*a+1将指针下移1个存储单元,输出字符串为”23”。
a[1]指向字符串"
的首地址,a[2]指向字符串"
的首地址。
b为指针的指针,它的值为数组a的首地址。
33.以下不正确的定义语句是()。
A.doublex[5]={2.0,4.0,6.0,8.0,10.0};
B.inty[5]={O,1,3,5,7,9};
C.charc1[]={'
'
};
D.charc2[]={'
\x10'
\xa'
\x8'
[解答]选项B中初值列表中的初值个数超过了数组包含的元素的个数。
34.若有说明:
int*p,m=5,n;
以下正确的程序段是()。
A.p=&
m;
p)
B.p=&
n;
C.scsnf("
p)
p=&
D.p=&
[解答]p为指针型变量,在输入函数的地址列表中不用&
,当给指针变量赋值时是取变量的地址赋给指针变量,&
为取地址运算符,因此只有选项D正确。
35.执行下面程序时,若输入1、-5、6,则输出结果为()。
#include<stdio.h>
#definedisc(a,b,c)b*b-4*a*c
{floatx1,x2;
inta,b,c;
%d,%d,%d"
a,&
b,&
c);
x1=(-b+sqrt(disc(a,b,c)))/(2*a);
x2=(-b-sqrt(disc(a,b,c)))/(2*a);
%5.1f.%5.1f"
x1,x2);
A.3,2
B.3.0,2.0
C.-3,-2
D.程序出错
[解答]本题是使用带参数的宏来求解一元二次方程的两个根。
表达式x1=(-b+sqrt(disc(a,b,c)))/(2*a)宏展开后为:
x1=(-b+sqrt(b*b-4*a*c))/(2*a)=(5+sqrt(25-24))/2=6/2=3。
表达式x2=(-b-sqrt(disc(a,b,c)))/(2*a)宏展开后为:
x2=(-b-sqrt(b*b-4*a*c))/(2*a)=(5-sqrt(25-24))/2=4/2=2。
所以程序输出结果为3.0,2.0,应该选择B。
36.下面程序的输出结果是()。
chars()="
ABCD"
*p;
{for(p=s;
p<s+4;
p++)printf("
p);
)
A.ABCDBCDCDD
B.ABCD
C.DCBA
D.ABCDABCABA
[解答]p为指针型变量。
第一次循环,p=s,p的值为字符数组s的首地址,输出字符串"
p++,第二次循环,p的值为字符数组s的首地址加1,输出字符串"
BCD"
p++,第三次循环,p的值为字符数组s的首地址加2,输出字符串"
CD"
p++,第4次循环,p的值为字符数组s的首地址加3,输出字符串'
D"
37.程序中头文件type1.h的内容是()。
#defineN5
#defineM1N*3
程序如下:
#define"
type1.h"
#defineM2N*2
i=M1+M2;
i);
程序编译后运行的输出结果是()。
A.10
B.20
C.25
D.30
[解答]i=M1+M2=N*3+N*2=5*3+5*2=25。
38.下面程序的输出结果是()。
{structm1{inta;
intb;
}en[2]={1,3,2,7);
en[0].b/en[0].a*en[1].a);
B.0
C.1
D.3
[解答]en[2]是结构体类型的数组,en[0].b/en[0].a*en[1].a=3/1*2=6。
39.语句“a=2;
p=&
a;
b=*p++;
”执行后的结果是()。
A.a=3b=3
B.a=2b=2
C.a=2b=1
D.a=2b=3
[解答]执行p=&
a;
,将变量a的地址赋给指针变量p,运算符*和++的优先级相同,都具有自右向左的结合性,p++是先使用p的值再对p加1,则计算*p,即取p所指向的存储单元的值2,赋值给b,再对p的值加1。
输出结果为a=2b=2。
40.设有如下定义:
structss
{charname[10];
intage;
charsex;
}std[3],*p=std;
下面各输入语句中错误的是()。
A.scanf("
(*p).age);
%s"
std.name);
%c"
std[0],sex)
D.scanf("
(p->sex));
[解答]选项A中&
(*p).age代表的是std[0].age的地址,是正确的,选项C也是正确的,选项D先用指针变量引用结构型的成员sex,然后取它的地址,也是正确的,选项B中的std.name是错误的引用,因为std是数组名,代表的是数组的首地址,地址没有成员name。
所以B选项为所选。
41.若有如下程序:
intsub(intm)
{if(m==1||m==0)return2;
elsereturn(sub(m-1)*sub(m-2));
}
{intn;