全国计算机等级《二级C语言程序设计》考点习题测试2及答案Word文档下载推荐.docx
《全国计算机等级《二级C语言程序设计》考点习题测试2及答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《全国计算机等级《二级C语言程序设计》考点习题测试2及答案Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
if(y%3==0)printf(”%d”,——y);
)
程序的运行结果是( )。
A.741B.963C.852D.87542l
C:
C。
【解析】在for循环中,当Y的值为9、6或3时,执行输出语句,输出表达式“一一Y”的值。
y先自减1,然后再输出Y的值。
5有以下程序:
{inta[]={2,4,6,8,10},y=0,x,*p;
p=&
a[1];
for(x-:
1;
x<
3;
x++)y+=p[x];
printf(“%d\n,y”);
}
程序运行后的输出结果是( )。
A.10B.1.1C.14D.15
【解析】由题目的语句P=&
a[1]可知,P指向a数组中下标为l的元素“4”,又因为P为指针变量,所以PIx]与*(p+x)等价,因而在for循环语句中,第一次循环P[1]指向a数组中下标为2的元素“6”,第二次循环p[2]指向a数组中下标为3的元素“8”,所以y=6+8=14,因而选项c为正确答案。
6下列程序的运行结果是( )。
(intx=1,y=3,a=0;
while(x++!
=(y-=1))
{a+=1;
if(y
printf(”%d,%d,%d\n”,x,y,a);
}A.2,3,2B.2,3,1C.1,3,3D.3,1,2
【解析】本题考查while循环。
第一次循环,Y=y-1,y=2,循环条件成立,x=l,X++后值为1,x自加变成2,进入循环,a=a+1=1,判断if语句条件是否成立,y
7若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是( )。
A.bdgcefhaB.gdbeefhaC.bdgaechfD.gdbehfca
【解析】后序遍历是指首先遍历左子树或左子结点,然后遍历右子树或右子结点,最后访问根结点。
本题根据前序和中序遍历的结果确定,然后再对其进行后序遍历,正确答案为选项D。
8下列工具中为需求分析常用工具的是( )。
A.PADB.BFDC.N-SD.DFD
【解析】需求分析常用的工具有4种:
数据流图(DFD)、数据字典(DD)、判断树和判定表。
PAD(问题分析图)、PFD(程序流程图)、N~s(盒式图)都是详细设计的常用工具,不是需求分析的工具。
9对线性表进行二分法检索,其前提条件是( )。
A.线性表以顺序方式存储,并按关键码值排好序B.线性表以顺序方式存储,并按关键码的检索频率排好序C.线性表以链式方式存储,并按关键码值排好序D.线性表以链式方式存储,并按关键码的检索频率排好序
【解析】对线性表进行二分法检索,要求线性表是按顺序方式存储的,并按关键码值的大小排好序。
10下列叙述中正确的是( )。
A.用E-R图能够表示实体集之间一对一的联系、一对多的联系、多对多的联系B.用E-R图只能表示实体集之间一对一的联系C.用E-R图只能表示实体集之间一对多的联系D.用E-R图表示的概念数据模型只能转换为关系数据模型
【解析】用E—R图可以描述实体及其相互之间的联系,还可以描述多个实体集之间的联系和一个实体集内部实体之间的联系。
用E—R图表示的概念数据模型不仅能转换为关系数据模型,还可以转换为其他数据模型,如网状模型和层次模型等。
所以A的说法正确。
11有以下程序:
voidfun(char*t.char*s)
{while(*tl=0)t++;
while((*t++-*s++)!
一0);
{charssElo]=”aCC”,aaElo]=”bbxxyy”;
fun(SS,aa);
printf(”%s,%s”,SS,aa);
程序运行结果是()。
A.accxyy,bbxxyyB.acc,bbxxyyC.accxxyy,bbxxyyD.accbbxxyy,bbxxyy
【解析】主函数中语句fun(SS,aa)的功能是将字符串aa连接到字符串ss的末尾。
12下述程序的输出结果是( )。
#includedstdio.h>
{charehE2][5]={”1234”,”5678”),*p[2];
inti,j,s=0;
for(i一0;
i<
2;
i++)
pEi]=ch[i];
{s=p[i][j]-'
0'
;
printf(”%d”,s);
)
}A.6357B.6135C.37D.69j357
【解析】本题先将指针P指向二维数组eh[2]E5],相当于p[o]一”l234”,p[1]一”5678”;
通过双重for循环,将P中的字符隔一个输出一个,通过“s=p[i][i]-'
”语句将所要输出的字符转换成相应的十迸制数。
13有以下程序
{FILE*fp;
inta[10]=(1,2,3,0,0),i;
fp—fopen(”d2.dat,”wb”);
fwrite(a,sizeof(int),5,fp);
fclose(fp);
fp—fopen(”d2.dat”,”rb”);
fread(a,sizeof(int),10,fp);
for(i=0;
10;
i十f-)printf("
%d"
,a[i]);
A.1,2,3,0,0,0.0,0,0,0,B.1,2,3,1,2,3,0,0,0,0,C.123,0,0,0,0,123,0,0,O,O,D.1,2,3,0,0,1,2,3,0,0,本题共1分,参考答案:
【解析】本题程序首先用函数fopen()以“wb”的方式开打文件“d2.dat”,然后调用两次fwrite函数将数组a的5个元素,依次输出到文件fp中,共10个字节,关闭文件。
再次打开文件,使用文件指针指向文件的开头,调用head函数从文件印中读取这l0个字节的数据到数组a中。
14下列程序的输出结果是( )。
voidfun(int*x,inty)
{printf(”%d%d”,*x,”y);
*x=3;
。
y=4;
{intx=1.y=2:
fun(&
y,&
x);
printf(”%dXd”,X,y);
)A.2143B.1212C.1234D.2112
【解析】当执行fun函数时,因为参数传递时是地址传递,因此形参值的改变会影响实参中的数,在执行fun函数时先输出l2,接着把*x赋3,*Y赋4,此时带回主函数中,输出的值为34。
15有以下程序,其中函数f的功能是将多个字符串按字典顺序排序( )。
#{nc[ude%string.h>
void{(char*p[],intn)
{char*t;
inti,j;
for(i=0:
i
for(j=i+1;
j
if(strcmp(p[i],p[j]>
O){t=p[i];
p[i]=p[j];
p[j]
=t;
}
{char*P[5]={¨
abc”,”aabdfg”,”abbd”,”dcdbe”,”ed”);
f(p,5):
print[("
%d\n"
,strlen(p[1]));
A.2B.3C.6D.4
【解析】函数voidf的功能是将字符指针数组*p[]中的每个字符串按照从小到大的顺序排序。
在主函数main()中,调用f(p,5)后,字符指针数组*pE5]中的字符串按照字典顺序从小到大排列为如下形式,即*pE5]一(”aab—df9”,”abbd”,”abc”,”cd¨
,”dcdbe”),因此P[1]=”abdb”,strlen(p[1])=4。
16下面程序的功能是输m以下形式的金字塔图案:
{inti,j;
for(i-1;
-4;
i++)***
{for(j=1;
j<
=4-i;
j++)printf("
"
);
*****
for(j=1;
=________;
j++)printf(”*”);
******
printf(”\n”):
在下划线处应填入的是( )。
A.iB.2*i-1C.2*i+1D.i+2
【解析】通过观察可知图形共4行,主函数中通过一个for循环四次,输出4行。
第一行输出3个空格和l个“*”,第2行输出2个空格和3个“*”,第3行输出3个空格和5个“*”,第四行输出7个“*”,主函数中通过第二个循环控制每行的输出空格数,第三个for循环控制输出的“*”的个数,总结规律:
每行输出的“*”的个数,总比前一行的多2个,且第一行的个数为l,可以断定每行输出的“*”的个数组成了一个公差为2的等差数列,所以每行输出“*”的个数即该等差数列的通项,故该空格处应该填写2*i一1。
17设a、b和C都是int型变量。
且a=3,b=4,c=5,则以下的表达式中值为0的表达式是( )。
A.a&
&
.bB.a<
=bC.aD.E.b+c&
b-cF.!
((a
【解析】||和&
的优先级高于十和一,ll和&
的优先级相等,且是左结合的,就是从左边开始结合到右边。
按照这个规则,正确选项为D。
18下列变量声明合法的是( )。
A.shorta=1.4e-1;
B.doubleb=1+3e2.8;
C.10ngdo=0xfdaL;
D.float2_aaa=1e-3;
【解析】解答本题需了解3个知识点:
①标识符是由字母、数字或下划线组成,并且它的第一个字符必须是字母或者下划线;
②d0是C语言的一个关键字,不能再用做变量名和函数名;
③C语言规定指数形式的实型数量e或E后面的指数必须是整数。
19以下程序的输出结果是( )。
{inta=7,b=8,*p,*q,*r;
a;
q=&
b;
r=p;
p=q;
q=r;
printf(”%d,%d,%d,%d\n”,*P,*q,a,b);
)A.8,7,8,7B.7,8,7,8C.8,7,7,8D.7,8,8,7
【解析】在“r=P;
”三个语句是表示P与q交换,经过交换后P指向b的地址,q指向a的地址,因此最后输出为8,7,7,8,故选择C选项。
20有下列程序:
{inty=10
do(y--;
}while(--y);
printf(”%d\n”,--y);
当执行程序时,输出的结果是( )。
A.-1B.1C.4D.0
【解析】本题考查d0—while循环。
当--Y是0(即y是o)时结束循环,输出--y,先将y的值减1再输出Y的值。
21.若程序前面已在命令中包含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);
If(x<
0)y=sqrt(一x);
D.y=sqrt(x>
=0?
x:
-x);
【解析】选项A、C、D分别用一个ifelse语句、两
个if语句和条件表达式表达了计算公式的含义。
22当输入为"
hello?
时,下面程序的执行结果是( )。
(charC;
c=getchar();
while(c!
='
?
'
(putchar(c);
break;
}A.RvfsuB.hC.?
D.hello
【解析】本题考查getchar()函数与putchar()函
数,通过9etchar()函数读入字符,并通过putchar()函数将字符逐个输出,当用户输入“?
”时停止输出,且C是一个字符变量只占一个字节。
23下列选项中不是C语句的是( )。
A.{inti;
i++;
printf(”%d\n”,i);
)B.;
C.a=5,c=10D.{;
【解析】C项缺少分号。
因为赋值语句两个标志:
赋值(就是”=”)和语句(加上”;
”)。
24若有下列定义和语句:
intu一011,v一0x11,w一11:
printf(”%o,%x,%d\n”,u,v,w):
则输出结果是( )。
A.9,17,11B.9,11。
11C.11,11,11D.11,17。
11
【解析】“%O”表示八进制无符号型输出整型数据(即不带前导o);
“%X”表示以十六进制无符号型输出整型数据(即不带前导ox或OX);
“%d”表示输出带符号的十进制整型数。
25执行下列程序中的输出语句后,a的值是( )。
{inta;
printf(”%dkn”,(a=2*3,a*5,a+7));
)A.17B.37C.6D.13
【解析】本题考查逗号表达式。
程序输出时输出一个%d,所以输出第一个a的值与后续无关。
26下列选项中不会引起二义性的宏定义是( )。
A.#defineS(x)X*xB.#defineS(x)(x)*(x)C.#defineS(x)(x*x)D.#defineS(x)((x)*(x))
【解析】本题考查参数的宏替换。
为避免二义性有些参数表达式必须加括号,否则在实参表达式替换时,会出现错误。
例如x为(m+n)时替换A:
m+rl*m+n,所以选项D最符合条件。
27下列程序的输出结果是( )。
#include%stdio.h>
{inti;
for(i=1;
=10,i++)
fif((i*i>
=20)&
(i*i<
=100))
break;
print[(”%d\n”,i*i);
)A.49B.36C.25D.64
【解析】本题考查for循环及if语句。
当执行到第一个满足(i*i>
(i*i-<
=100)这个条件的i出现时,break跳出循环,执行下列的printf语句。
28有以下程序:
#includedstdio.h>
{charcl='
,c2='
cl=getchar():
c2=getchar();
putchar(c1);
putchar
(c2);
当程序运行时输入a<
回车>
后,下列叙述中正确的是( )。
A.变量c1被赋予字符a,c2被赋予回车符B.程序将等待用户输入第2个字符C.变量c1被赋予字符a,c2中仍是原有字符2D.变量c1被赋予字符a,c2中将无确定值
【解析】本题考查getchar()函数,从终端读入一个字符作为函数值。
在输入时,空格、回车符都将作为字符读入,而且只有在用户敲入回车键时,读入才开始执行。
所以当输入a<
后,变量cl被赋予字符a,而变量c2被赋予回车符。
29有如下程序:
(intx=1,a=O,b=0;
switch(x)
{
CgtSC0:
b++;
case1:
a++;
CaSe2:
printf(”a=%d.b=%d\n”,a.b);
该程序的输出结果是( )。
A.a=2,b=1B.a=1,b=1C.a=1,b=0D.a=2b=2
【解析】当X为1时,执行casel,a自加等于l,因为casel后没有break,接着执行case2,此时a的值为2,b自加为1,故选择A选项。
30有以下程序:
{intk=-3:
if(k<
=0)printf(”****\n”)
elseprintf(”&
\n”);
程序的输出结果是( )。
A.输出####B.输出&
C.输出####&
D.有语法错不能通过编译
【解析】{intk=一3;
if(k<
=0)printf(”*”**\n”)elseprintf(”&
)中printf(”****\rl”)缺少分号,因此会报编译错误。
31若有定义“intb[8],*p=b;
”,则p+6表示( )。
A.数组元素b[6]的值B.数组元素b[6]的地址C.数组元素bE73的地址D.数组元素hEo]的值加上6
【解析】指针中存放的是变量的地址,指针也可以进行增减运算,这时指针移动的最小单位是一个存储单元,而不是一个字节。
所以题中“P+6”指的是将指针向后移动了6个存储单元,即指向b[6],存放的是bE6]的地址。
32有下列程序:
{chars[]=”abode”;
s+=2:
printf(”%d\n”,s[o]);
执行后的结果是()。
A.输出字符a的ASCII码B.输出字符c的ASCII码C.输出字符cD.程序出错
【解析】因为字符数组s[]中的数组名s表示的是一个地址常量。
所以语句“s+一2;
”不能将指针在当前位置的基础上再向后移动两位,因而程序编译时出错。
33有以下程序:
{intw=4,x=3,y=2,z=1;
printf(”%d\n”,(w
A.1B.2C.3D.4
【解析】条件运算符具有右结合性。
当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。
w
34下列程序的运行结果是( )。
voidfun(int*s,int*p)
{staticintt=3;
*p=set];
t——:
voidmain()
{inta[]={2,3,4,5),k;
intx:
for(k=0,k<
4,k++)
{fun(a,&
.x);
printf(”%d,”,x);
}A.5,4,3,2B.2,3,4,5C.2,2,2,2D.5,5,5,5
【解析】依据fun函数,可知其要实现的功能是将S中第(t+1)个元素以前的元素逆置赋给数组p。
由于fun中函数定义了静态变量t=3,因此,main()函数中调用函数fun(a,&
x)时,就是要将数组a中前4个元素逆置赋给数X,最后输出X数组。
35若有以下程序( )。
{int**k,*j,i=100;
j=&
i;
k=&
j;
printf(”%d\n”,**k);
程序的输出结果是(>
A.运行出错B.100C.j的地址D.i的地址
【解析lint**k,*j,i=100;
j=8Li;
//一维指针j指向i的地址,所以j中存放的是i的地址,*j就是i的内容,即*j一1001k-=&
//二维指针k指向j的地址,所以k中存放的是指向i的地址的地址,*j就是i的内容,**k就是i的内容,即**k一100,printf(”%d\n”,**k);
//输出100。
36c语言中,下列不合法的字符常量是( )。
A.'
\xff'
B.'
\65'
C.'
D.'
\028'
【解析】选项A,'
\xff’中'
\X'
组合表示是一个十