二级C语言51.docx
《二级C语言51.docx》由会员分享,可在线阅读,更多相关《二级C语言51.docx(28页珍藏版)》请在冰点文库上搜索。
![二级C语言51.docx](https://file1.bingdoc.com/fileroot1/2023-5/18/d98014b5-c53d-4529-bc4c-cc4e0ff2ded9/d98014b5-c53d-4529-bc4c-cc4e0ff2ded91.gif)
二级C语言51
二级C语言-5-1
(总分:
79.00,做题时间:
90分钟)
一、{{B}}选择题{{/B}}(总题数:
35,分数:
45.00)
1.有下列程序:
main()
{intx=5;
do
{printf("%d",x-=4);}
while(!
(--x));
}
程序的输出结果是()。
∙A.1
∙B.20
∙C.14
∙D.死循环
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]本题考查do…while循环。
①执行printf语句,x=x-41,输出1,判断while循环的控制条件,--x=0,则(!
(--x))非零,循环条件成立,执行下一次循环;②执行printf语句,x=x-4=-4,输出-4,判断while循环的控制条件,--x=-5,则(!
(--x))为零,循环条件不成立,结束循环。
2.设有如下关系表:
则下列操作中正确的是
∙A.T=R∩S
∙B.T=R∪S
∙C.T=R×S
∙D.T=R/S
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]选项A、B、C分别进行交运算、并运算,笛卡尔积运算,选项D不是关系运算。
T由属于关系R以及关系S的元组组成,简单来说,就是s和R的元组之和,是并运算,选项B正确。
3.有以下程序:
#include<stdio.h>
main()
{chara='a',b;
printf("%c,",++a);
printf(1%c/n",b=a++);
}
程序运行后的输出结果是()。
∙A.b,b
∙B.b,c
∙C.a,b
∙D.a,c
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]本题考核的知识点是运算符++的用法。
程序中的第一个输出语句输出表达式++a的值,该++a是在使用a之前,先使a的值加1,即a加1为字符b,此时a的值为b,所以第一个输出语句输出的值为b,第二个输出语句中输出的b的值,这时b的值为表达式a++的值,a++是在使用a之后(此时a的值为b,所以赋给b的值为b),使a的值加一,因此第二个输出的值也为b。
所以,4个选项中选项A)符合题意。
4.以下程序的输出结果是
#include<stdio.h>
main()
{charch[2][5]={"6937","8254"},*p[2];
inti,j,s=0;
for(i=0;i<2;i++)p[i]=ch[i];
for(i=0;i<2;i++)
for(j=0;p[i][j]>'/0';j+=2)
s=10*s+p[i][j]-'0';}
∙A.69825
∙B.63825
∙C.6385
∙D.693825
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]本题考查通过指针引用字符串数组中的元素。
通过行指针p来实现数组元素的引用。
用格式说明符%s进行整串输入与输出。
本题中,每行字符指针跳跃式右移动,隔2个移动一次,s存放处理的累计和。
第一行中:
p[0]指针第一遍6-0=6s=0+6=6p[0]指针第二遍3-0=3s=10*6+3=63指针行下标变化,转向第二行第二行中:
p[1]指针第一遍8-0=8s=10*63+8=638p[2]指针第二遍5-0=5s=10*638+5=6385得出结果s=6385。
5.有以下程序;
main()
{inty=3,x=3,z=1;
printf("%d%d/n",(++x,y++),z+2);
}
执行后的输出结果是{{U}}{{/U}}
∙A.34
∙B.42
∙C.43
∙D.33
(分数:
1.00)
A.
B.
C.
D. √
解析:
6.在C语言中,变量的隐含存储类别是
∙A.auto
∙B.static
∙C.extem
∙D.无存储类别
(分数:
2.00)
A. √
B.
C.
D.
解析:
[解析]auto变量:
无static声明的局部变量。
用auto作存储类别的声明时,可以不写auto,存储类别隐含确定为auto(自动存储类别),是动态存储方式。
大多数变量是自动变量。
用static声明的局部变量是静态局部变量。
函数调用结束后静态局部变量占据的内存存储单元空间不释放,局部变量保留原值,下次调用时可以继续使用该值。
用extern声明外部变量,外部变量即全局变量,可以用extern声明来改变全局变量的作用域,实际上,关键字“auto”可以省略,auto不写则隐含确定为“自动存储类别”,属于动态存储方式。
7.以下选项中,非法的字符常量是______。
∙A.'t/'
∙B.'/17'
∙C."/n"
∙D.'/xaa'
(分数:
2.00)
A.
B.
C. √
D.
解析:
[解析]C语言中字符常量是以单引号括起来的单个字符,或以“/”与三位八进制数值或两位十六进制数值代替单个字符。
8.设有以下语句:
charstr1[]="string"mstr2[8],*str3,*str4=="string";
则______不是对库函数的正确调用。
∙A.strcpy(str1,"HELLO1");
∙B.strcpy(str2,"HELLO2");
∙C.strcpy(str3,"HELLO3");
∙D.strcpy(str4,"HELLO4");
(分数:
2.00)
A.
B.
C. √
D.
解析:
[解析]C语言中:
strcpy(st1,st2);,其两个参数均为字符指针或字符数组,选项C中的目的串指针str3没有指向具体有效的存储单元,故是错误的调用。
9.以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是{{U}}{{/U}}。
∙A.chars[10]="abcdefg";
∙B.chart[]="abcdefg",*s=t;
∙C.chars[10];s="abcdefg";
∙D.chars[10];strcpy(s,"abcdefg");
(分数:
2.00)
A.
B.
C. √
D.
解析:
[解析]C语言中不能给数组整体赋初值,所以选项C是不正确的。
10.函数调用strcat(strcpy(str1,str2),str3)的功能是{{U}}{{/U}}。
∙A.将字符串str1复制到字符串str2中后再连接到字符串str3之后
∙B.将字符串str1连接到字符串str2之后再复制到字符串str3之后
∙C.将字符串str2复制到字符串sir1中后再将字符串str3连接到字符串str1之后
∙D.将字符串str2连接到字符串str1之后再将字符串str1复制到字符串str3中
(分数:
2.00)
A.
B.
C. √
D.
解析:
[解析]strcat(s1,s2)是把s2字符串连接到s1字符串末尾,strcpy(s1,s2)是把s2字符串复制给s1字符串,要保证s1能容纳下连接或复制后的字符串。
11.以下程序执行后x的值是{{U}}{{/U}}。
#include<stdio.h>
main()
{intx,y=252,i=386,*m=&y,*z=&i;
x=(z==m);
printf("%d",x);
}
∙A.252
∙B.1
∙C.0
∙D.运行时出错,x无定值
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]指针变量m和z分别指向整型变量y,i,所以这两个指针变量中存储的地址是不同的,变量x接受的是一个关系运算结果0(因为m和z两个地址是不同的),所以x为0。
12.sizeof(float)是{{U}}{{/U}}。
∙A.一个双精度型表达式
∙B.一个整型表达式
∙C.一种函数调用
∙D.一个不合法的表达式
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]sizeof是长度运算符,或称字节数运算符,用于计算数据类型和变量的长度。
13.下面程序的输出结果是()。
main()
{structm1{inta;intb;}en[2]={1,3,2,7);
printf("%d/n",en[0].b/en[0].a*en[1].a);
∙A.6
∙B.0
∙C.1
∙D.3
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]en[2]是结构体类型的数组,en[0].b/en[0].a*en[1].a=3/1*2=6。
14.有以下程序:
#include<stdio.h>
structord
{intx,y;}dt[2]={11,12,13,14};
main()
{
structord*p=dt;
printf("%d,",++(p->x));printf("%d/n",++(p->y));
}
程序运行后的输出结果是
∙A.11,12
∙B.12,13
∙C.13,14
∙D.14,11
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]本题中定义了一个结构体数组dt[2],其中dt[0].x=11,dt[0].y=12,dt[1].x=13,dt[1].y=14。
在main函数中指针p指向了结构体数组的第一个元素,因此p->x值为11,p->y值为12,自加运算的结果分别为12和13。
15.有以下程序:
#include<stdio.h>
#definef(x)x*x*x
main()
{
inta=3,s,t;
s=f(a+1);
t=f((a+1));
printf("%d,%d/n",s,t);
}
程序运行后的输出结果是______。
∙A.10,64
∙B.10,10
∙C.64,10
∙D.64,64
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]本题考查宏定义的用法,宏定义只是做个简单的替换,所以本题中执行f(a+1)=a+1*a+1*a+1=3*a+1=10,f((a+1))=(a+1)*(a+1)*(a+1)=64,所以答案为A选项。
16.下列关于二叉树的叙述中,正确的是{{U}}{{/U}}。
∙A.叶子结点总是比度为2的结点少一个
∙B.叶子结点总是比度为2的结点多一个
∙C.叶子结点数是度为2的结点数的两倍
∙D.度为2的结点数是度为1的结点数的两倍
(分数:
2.00)
A.
B. √
C.
D.
解析:
[解析]由二叉树的性质可以知道在二叉树中叶子结点总是比度为2的结点多一个。
17.设有以下说明语句:
typedefstruct
{intn;
charch[8];
}PER;
则下面叙述中正确的是
∙A.PER是结构体变量名
∙B.PER是结构体类型名
∙C.typedefstruct是结构体类型
∙D.struct是结构体类型名
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]本题中,typedef声明新的类型名PER来代替已有的类型名,PER代表上面指定的一个结构体类型,此时,也可以用PER来定义变量。
18.有以下程序
intb=2;
intfunc(int*A)
{b+=*a;return(B);}
main()
{inta=2,res=2;
res+=rune(&A);
printf("%d/n",res);
}
程序运行后的输出结果是{{U}}{{/U}}
∙A.4
∙B.6
∙C.8
∙D.10
(分数:
1.00)
A.
B. √
C.
D.
解析:
19.下列叙述中正确的是{{U}}{{/U}}。
∙A.break语句只能用于switch语句
∙B.在switch语句中必须使用default
∙C.break语句必须与switch语句中的case配对使用
∙D.在switch语句中,不一定使用break语句
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]break为C语言关键字,又称间断语句。
break语句的功能是跳出正在执行的条件语句或循环语句。
它可以出现在switch语句中,也可以出现在循环语句中。
default是关键字,起标号的作用,代表所有case标号之外的那些标号。
default标号可以出现在语句体中任何标号位置上。
在switch语句体中也可以没有default标号。
20.以下程序的输出结果是
longfun(intn)
{longs;
if(n==1‖n==2)s=2;
elses=n-fun(n-1);
returns;}
main()
{printf("%1d/n",fun(3));}
∙A.1
∙B.2
∙C.3
∙D.4
(分数:
2.00)
A. √
B.
C.
D.
解析:
[解析]该题考查的是递归函数的调用,题中读fun函数进行了递归调用,第1次调用:
fun(3)n=3s=3-fun
(2);第二次调用时:
fun
(2)n=2s=2返回第一次调用后,s=3-2=1。
21.以下定义语句中正确的是______。
∙A.chara='A'b='B';
∙B.floata=b=10.0;
∙C.inta=10,*b=&a;
∙D.float*a,b=&a;
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]在A选项中,定义了两个char型的变量,但是在这两个变量之间应该加上逗号;在B选项中,没有对b进行定义,只是对b进行了赋值,因此是错误的;在D选项中,把一个指针赋值给了一个float型的变量,因此是错误的。
22.以下程序的输出结果是______。
main()
{intx=5,n=3,s,j;
for(j=0;j<2;j++)
{s=fun(x,n);
printf("%d",s);
}
}
fun(inta,intb)
{staticintn=0,i=2;
i=n+1;
n=i+a-b;
return(n);
}
∙A.37
∙B.35
∙C.36
∙D.33
(分数:
1.00)
A.
B.
C. √
D.
解析:
23.以下叙述中正确的是_____。
∙A.用C程序实现的算法必须要有输入和输出操作
∙B.用C程序实现的算法可以没有输出但必须要输入
∙C.用C程序实现的算法可以没有输入但必须要有输出
∙D.用C程序实现的算法可以既没有输入也没有输出
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]算法的特性中包括“有零个或多个输入”及“有一个或多个输出”这两个特性。
一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的,所以一千算法必须至少有一个输出。
24.设a、b、c、d、m.n均为血型变量,且a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值为______。
∙A.0
∙B.1
∙C.2
∙D.3
(分数:
2.00)
A. √
B.
C.
D.
解析:
[解析]C语言中比较表达式的运算结果为0或1。
0代表不成立,1表示成立。
25.若a为int类型,且其值为3,则执行完表达式a+=a-=a*a后,a的值是______。
∙A.-3
∙B.9
∙C.-12
∙D.6
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]C语言中对赋值运算的运算的运算顺序是自右向左。
本题中,计算a*a之后,a的值依然为3,表达式a*a的值为9;a-=9,a=3-9=-6:
a+=-6,a=-6+-6=-12。
26.有三个关系R、S和T如下:
R
A
B
C
a
1
2
b
2
1
c
3
1
S
A
B
C
a
1
2
b
2
1
T
A
B
C
c
3
1
则由关系R和S得到关系T的操作是______。
∙A.自然连接
∙B.差
∙C.交
∙D.并
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]关系T中的元组是R关系中有而S关系中没有的元组的集合,所以进行的是差运算。
27.设有如下的程序段:
charstr[]="Hello";
char*ptr;
ptr=str;
执行完上面的程序段后,*(ptr+5)的值为{{U}}{{/U}}。
∙A.'o'
∙B.'/0'
∙C.不确定的值
∙D.'o'的地址
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]本题考杏字符数组的结束标志。
ptr=str是将串str的首地址赋给了指针变量ptr,所以ptr+5指向字符串str的第六个数组元素,即是串的隐含结束标志'/0',*(ptr+5)='/0',最后的结果为'/0'。
28.有以下程序:
#include<stdio.h>
intfun(intx[],intn)
{staticintsum=0,i;
for(i=0;i<n;i++)sum+=x[i];
returnsum;
}
main()
{inta[]={1,2,3,4,5},b[]={6,7,8,9},s=0;
s=fun(a,5)+fun(b,4);printf("%d/n",s);
}
程序执行后的输出结果是()。
∙A.45
∙B.50
∙C.60
∙D.55
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]函数fun的功能是求数组的n个元素之和。
fun(a,5)=15。
由于sum是静态局部变量,所以保持15不变,fun(b,4)=45,所以s=fun(a,5)+fun(b,4)=60。
29.下列能正确定义且赋初值的语句是{{U}}{{/U}}。
∙A.intn1=n2=10;
∙B.charc=32;
∙C.floatf=f+1.1;
∙D.doublex=12.3E2.5;
(分数:
2.00)
A.
B. √
C.
D.
解析:
[解析]C语言规定,可以在定义变量的同时给变量赋初值,称为变量初始化。
在选项A)中在给n1和n2进行赋初值,但变量n2没有定义;在选项C)中定义变量f时,不能在赋值表达式的右边出现变量f自身,所以选项C)错误;在选项D)用指数表达式的常量中,字母E后面的数应该为整数,而不应该为小数形式。
因此,选项B)正确。
30.有以下函数定义:
voidfun(intn,doublex){……}
若以下选项中的变量都已正确定义并赋值,则对函数fun的正确调用语句是{{U}}{{/U}}。
∙A.fun(inty,doublem);
∙B.k=fun(10,12.5);
∙C.fun(x,n);
∙D.voidfun(n,x);
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]本题考查函数调用。
函数调用时,实参前不需加类型说明,选项A)错误;题目中的函数没有返回值,所以选项B)错误;函数调用前不需要加类型说明,选项D)错误。
31.以下程序的运行结果是
#include"stdio.h"
main()
{structdate
{intyear,month,day;}today;
printf("%d/n",sizeof(structdate));}
∙A.6
∙B.8
∙C.10
∙D.12
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]在解答本题时应该考虑两个问题:
结构体变量的长度及sizeof()求字节数的运算符。
结构体变量的长度是其内部成员总长度之和,本题中,structdate中包含year,month,day三个整型变量。
一个整型变量所占的字节数为2。
32.下列叙述中正确的是()。
∙A.线性链表中的各元素在存储空间中的位置必须是连续的
∙B.线性链表中的表头元素一定存储在其他元素的前面
∙C.线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面
∙D.线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]在线性表的链式存储结构中,各数据结点的存储位置不连续,且各结点在存储空间中的位置关系与逻辑关系也不一致。
在线性链表中,各数据元素之间的前后关系是由各结点的指针域来指示的。
所以,选项D正确。
33.当变量c的值不为2、4、6时,值也为“真”的表达式是()。
∙A.(c==2)‖(c==4)‖(c==6)
∙B.(c>=2&&c<=6)‖(c!
=3)‖(c!
=5)
∙C.(c>=2&&c<-6)&&!
(c%2)
∙D.(c>=2&&c<=6)&&(c%2!
=1)
(分数:
2.00)
A.
B. √
C.
D.
解析:
[解析]逻辑或运算中,只要有一项为真,表达式的值就为真,故选项B)中c的值不为2、4、6时,表达式的值也为真。
34.有以下程序
voidfun(int*a,inti,intj)
{intt;
if(i<j)
{
t=a[i];a[i]=a[j];a[j]=t;
i++;j--;
fun(a,i,j);
}
}
main()
{intx[]={2,6,1,8},i;
fun(x,0,3);
for(i=0;i<4;i++)printf("%2d",x[i]);
printf("/n");
}
程序运行后的输出结果是
∙A.126