1、二级C语言36二级C语言-36(总分:72.00,做题时间:90分钟)一、B选择题/B(总题数:35,分数:46.00)1.下面语句的输出结果是_。printf(%d/n,strlen(/t/065/xff/n); A. 14 B. 8 C. 5 D. 输出项不合怯,无正常输出 (分数:1.00)A.B.C.D.解析:解析 在C语言中,以“/”开头的字符均为转义字符,其中“/”后可跟13位八进制数或在“/”后跟字母x及12位十六进制数,以此来代表一个特定的字符。2.以下程序段的输出结果是 _。int a=1234;printf(% 2d/n,a); A. 12 B. 34 C. 1234 D.
2、 提示出错、无结果(分数:1.00)A.B.C.D.解析:解析 本题考查printf函数中附加格式字符的用法。本题中的“2”是附加格式字符,其作用是指定变量a的输出宽度为两列,而本题中a的值为1234,已经超过两列,所以按实际值输出,正确答案为选项C。3.已知i、j、k为血型变量,若要从键盘输入2、3、4CR,使i、j、k的值分别为2、 3、4,下列正确的输入语句是U /U。 A. scanf(%3d,%3d,%3d,&i,&j,&k); B. scan(%d,%d,%d,&i,&j,&k); C. scan(%do/od%d,&i,及j,&k); D. scanf(i%d,j%d,k%d,&
3、i,&j,&k);(分数:1.00)A.B.C.D.解析:解析 函数scan()的调用形式是:scanf(格式字符串,输入项地址表)。其中,“格式字符串”是要输入的变量的格式符:“输入项地址表”是要输入的变量的地址。 若在格式符中插入了其他字符,则在输入时要求按一一对应的位置原样输入这些字符,其中的逗号也必须输入。4.有下列程序:#include stdio.h#include string.htypedef structchar name9; char sex;float score2;STU;void f(STU A) STU b=Zhao,m,85.0,90.0; int i;strcp
4、y(a.name,b.name);a.sex=b.sex;for(i=0;i2;i+) a.scorei=b.scorei;main()STU c=Qian,f,95.0,92.0;f(C) ;printf(%s,%c,%2.0f,%2.0f/n,c.name,c.sex,c.score0,c.score1);程序的运行结果是( )。 A. Qian,f,95,92 B. Qian,m,85,90 C. Zhao,f,95,92 D. Zhao,m, 85,90(分数:2.00)A.B.C.D.解析:解析 本题考查在结构体中函数的实参和形参的传递,调用f(C)后,实参传向形参,进行f()函数功
5、能的实现,但程序中没有返回语句,故形参不能将值传回实参,它们值的传递具有不可逆性,所与printf输出的还是c中实参的值,故选项A)正确。5.若有以下说明和语句int c4)5,(*p)5;p=c;能够正确引用c数组元素的是 A. p+1 B. *(p+3) C. *(P+1)+3 D. *(p0+2)(分数:1.00)A.B.C.D.解析:解析 本题中定义了一个二维数组c和一个指针数组p并初始化让它指向 c,显然此时p中的各元素为地址,选项A中p+1,此时其中的1代表的长度是整个二维数组c的长度,故p+1将让p指向c数组后面的元素,故不能引用c数组中的成员,选项D中p0指的是指针数组中的第一
6、个元素的地址即c的首地址,此时的1的长度代表的是数组C中一行的长度,故p0+2代表的是第三行的首地址,而*(po+2)将代表第三行的第一个元素的地址。6.以下叙述中正确的是( )。 A. 预处理命令行必须位于C源程序的起始位置 B. 在C语言巾,预处理命令行都以#开头 C. 每个C程序必须在开头包含预处理命令行;#include stdio.h D. C语言的预处理不能实现宏定义和条件编译的功能(分数:1.00)A.B.C.D.解析:解析 预处理命令行可以出现在C源程序的任何位置,故选项A不正确。#includestdio.h预处理命令行的意思是将stdioh头文件插入源程序中该行命令所在的位
7、置,表示我们将在后续行中用到stdioh头文件中定义的函数或类型,若程序中没有用到这些函数或类型就可以不用包含此头文件,故选项C不正确。C提供的预处理功能主要有:宏定义、文件包含和条件编译三种功能,故选项D不正确。在C语言中,预处理命令行都以”#”开头,故应该选择B。7.下面程序的输出结果是_。main() enum team my,your=4,his,her=his+10;printf(%d %d %d %d/n,my,your,his,her); A. 0 1 2 3 B. 0 4 0 10 C. 0 4 5 15 D. 1 4 5 15(分数:1.00)A.B.C.D.解析:解析 本题
8、考查枚举型变量的定义及其赋初值。第一个变量默认为1,中间可任意赋值,赋值后其后面的变量依次加1。8.下列选项中,当x为大于1的奇数时,值为0的表达式是U /U。 A. x%2=1 B. x/2 C. x%2!=0 D. x%2=0(分数:2.00)A.B.C.D.解析:解析 因为x的值为大于1的奇数,所以x除以2的余数等于1。所以选项D)等于关系表达式的结果为假,即等于0。9.有三个关系R、S和T如下:则由关系R和S得到关系T的操作是_。 A. 自然连接 B. 交 C. 除 D. 并(分数:1.00)A.B.C.D.解析:解析 本题考查的知识点是关系运算。选项A中,自然连接的条件是两关系间有公
9、共域,通过公共域的相等值进行连接,R与S的公共域为A和B,而T中根本不存在,所以选项A错误。对于选项B,R与S进行交运算后得到的关系是由既在R内又在S内的元素组成的,显然T不在S内,所以选项B也错误。对于选项C,R与S除运算后的域由R中不出现在S中的域组成,选项C正确。对于选项D,R与S进行并运算得到的关系由属于R或属于S的元组组成,所以选项D也错误。10.若变量均已正确定义并赋值,以下合法的C语言赋值语句是U /U。 A.x=y=5; B.x=n%2.5; C.x+n=i: D.x=5=4+1;(分数:1.00)A.B.C.D.解析:解析 求余运算符“%”两侧的运算对象都应当是整型数据,所以
10、选项B错误。因为赋值运算符左侧的操作数必须是一个变量,所以选项C和D是错误的。11.以下叙述中错误的是 _。 A. 用户所定义的标识符允许使用关键字 B. 用户所定义的标识符应尽量做到“见名知意” C. 用户所定义的标识符必须以字母或下划线开头 D. 用户定义的标识符中,大、小写字母代表不同标识 (分数:1.00)A.B.C.D.解析:解析 C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。大写字母和小写字母被认为是两个不同的字符,用户在定义标识符时应做到“见名知意”,且不允许使用关键字作标识符。12.设有如下程序段:int x=2002,y=2003;p
11、rintf(%d/n,(x,y);则以下叙述中正确的是U /U。 A. 输出语句中格式说明符的个数少于输出项的个数,不能正确输出 B. 运行时产生出错信息 C. 输出值为2002 D. 输出值为2003(分数:1.00)A.B.C.D.解析:解析 本题考查逗号表达式。逗号表达式的形式为:表达式1,表达式2,其求解过程为:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。13.有以下程序#includestdio.hmain()(int x=1, y=0;if(!x) y+;else if(x=0)if(x)y+=2; else y+=3;printf(%d/n, y);程序运行
12、后的输出结果是_。 A. 3 B. 2 C. 1 D. 0(分数:1.00)A.B.C.D.解析:解析 根据在if.else语句中,else总是和最近的if配对原则,本题中的层次关系是:if(!x)与elseif(x=0)是一组,位于循环的最外层。而if(x)与else是一组,位于else if(x=0)条件的内层。由此可知条件均不成立,所以y未进行任何操作,仍为0。14.程序中头文件type1.h 的内容是#define N 5#define M1 N*3程序如下:#define type1.h#define M2 N*2main ()int i;i=M1+M2;printf(%d/n, i
13、);)程序编译后运行的输出结果是( )。 A. 10 B. 20 C. 25 D. 30(分数:1.00)A.B.C.D.解析:解析 编译预处理时,用“type1.h”中的内容替代命令#include“type1.h”。表达式“i=M1+M2” 经过宏替换为“i=5*3+5*2”即i=25,所以最后输出的i的值为25。所以4个选项中C正确。15.设有定义:int A,*pA=&A;,以下 scanf语句中能正确为变量A读入的数据是 _。 A. scanf (%d,pA) ; B. scanf (%d,A) ; C. scanf (%d,&pA) ; D. scanf (%d,*pA) ;(分数
14、:2.00)A.B.C.D.解析:解析 选项B中不是变量A的地址,错误;选项C是指针pA的地址,错误;选项D中*pA表示变量A的值,错误。16.以下程序运行后的输出结果是#include stdio.hvoid fun(int a,int b) int t;t=a; a=b; b=t;mainU /U int c10=1,2,3,4,5,6,7,8,9,0,i;for(i=0;i10;i+=2) fun(ci,ci+1);for(i=0;i10;i+) prinff(%d,ci);printf(/n); A. 1,2,3,4,5,6,7,8,9,0 B. 2,1,4,3,6,5,8,7,0,9
15、 C. 0,9,8,7,6,5,4,3,2,1 D. 0,1,2,3,4,5,6,7,8,9(分数:2.00)A.B.C.D.解析:解析 fun函数无值返回。main函数调用时数组元素作实参,形参的改变不会影响实参。因此,循环调用结束后,C数组没有任何改变。17.设x,y,z,(均为整型变量,现有如下语句x=y=z=1;t=+x+y&+z;,则执行这个语句后t的值为 A. 2 B. 1 C. 0 D. 不定值(分数:1.00)A.B.C.D.解析:解析 逻辑与(&)优先于逻辑或()优先于赋值运算符。由于逻辑运算符的结果为逻辑值,真为1,假为0,题目中的逻辑值为真。18.以下不能定义为用户标识符
16、的是U /U。 A. scanf B. Void C. _3com_ D. int(分数:1.00)A.B.C.D.解析:解析 选项D中int为C语言中的保留字,不能作为用户的标识符;选项A、B、C都为合法的标识符。所以,4个选项中选项D符合题意。19.下列程序的输出结果是U /U。#includestdio.hint b=2;int func(int*a) b+=*a;return b;main() int a=1,t=2;t+=func(&a);printf(%d/n,t); A. 4 B. 5 C. 6 D. 8(分数:2.00)A.B.C.D.解析:解析 本题考查函数调用时的参数传递。
17、在执行函数func时,由于全局定义了一个变量b,所以在函数体中执行时b=2+1=3,最终t=2+3=5。20.有下列程序:#include stdio.hvoid fun(char *a, char *B) while(*a=*)a+;while(*b=*A) b+;a+;main()char *s=*a*b*,t80;fun(s,t);puts(t);程序的运行结果是( )。 A. *a*b B. a*b C. a*b* D. ab(分数:2.00)A.B.C.D.解析:解析 主函数main()定义了指向字符串的指针和一个字符数组,接着调用fun(s,t)函数,进行实参向形参传递,函数fun
18、()第一个 while语句判断*a中的值为“*”时继续扫描,当遇到不是“*”时结束,接着第二个while循环语句,将*a中从“a”开始的后续所有字符都赋予*b,也就是t80中的内容为“a*b*”,所以此题的运行结果为选项C)。21.下面程序的输出结果为 ( )struct st int x;int *y; *p;int dt410,20,30,40;struct st aa450,&dt0,60,&dt1,70,&dt2,80,&dt3;main() paa;printf(%d/n,+p-x);printf(%d/n,(+p)-x);printf(%d/n,+(*p-y); A. 10 20
19、20 B. 50 60 21 C. 51 60 21 D. 60 70 31(分数:1.00)A.B.C.D.解析:22.有以下语句,则对a数组元素的引用不正确的是(0i9)int a10=0,1,2,3,4,5,6,7,8,9,*p=a; A. ap-a) B. *(&ai) C. pi D. *(*(a+i)(分数:1.00)A.B.C.D.解析:解析 本题考查数组指针的应用。选项 D)第一层括号中为数组a中第i项元素的值,外面再加指针运算符没有意义。23.设有如下定义:struct complexint real, unreal; data1=1, 8. data2;则以下赋值语句中错误
20、的是 A. data2=data1; B. data2=(2, 6); C. data2.real=data1.real; D. data2.real=data1.unreal;(分数:2.00)A.B.C.D.解析:解析 同类型的结构体变量之间可以相互赋值;同类型的成员间也可相互赋值。24.有以下程序:main( ) char a =a,b,c,d,e,f,g,h,/0;int i,j;i=sizeof(a);j=strlen(a);printf(%d,%d/n,i,j);程序运行后的输出结果是 A.9,9 B.8,9 C.1,8 D.9,8 (分数:1.00)A.B.C.D.解析:解析 s
21、izeof( )函数返回字符串所占字节数,strlen函数返回字符串的长度,其中/0是一个转义字符,25.以下正确的字符串常量是U /U。 A./ B.abc C.Olympic Games D.(分数:1.00)A.B.C.D.解析:解析 选项A中“/”为转义字符,故选项A错误,选项B和C显然不是字符串常量。选项D是一个字符串常量,称为空串。26.若要求从键盘读入含有空格字符的字符串,应使用函数 A. getc() B. gets() C. getchar() D. scanf()(分数:2.00)A.B.C.D.解析:解析 scanf()语句用“空格”区别不同的字符串;getc()与get
22、char()语句不能用于字符串的读入。27.有以下程序#include stdio.hint fun(char s) int n=O;while(*s=9&*s=0) n=10*n+*s-0; s+; return (n);main() char s10= 6, 1, *, 4, *, 9, *, 0, *;printf(%d/n,fun(s); A. 9 B. 61490 C. 61 D. 5(分数:1.00)A.B.C.D.解析:解析 本题考查的知识点是:while循环的简单应用。 题目fun()函数中while循环的意思是:判断s所指内容是否为数字字符,如果是数字字符,则计算表达式11=
23、10*n+*s-0;。其中。s-0的作用是将相应的数字字符转换为数值,例如字符8减去字符0后,得到的结果就是数值8了。n=10*n+的作用是将累计变量n中原来内容乘以10,然后再加上刚转换的数字字符的数值,例如原来n的值为1,*s现在的内容为2,那么执行了n=10*n+*s-0,;语句后,n的值变为12,如果接下来再来一个8字符,执行n=10*n+*s-0;语句后,n的值就是128了。故不难看出fun()函数的作用是“将数字字符串转换为相应的十进制数值,碰到非数字字符时结束”。从主函数中定义的字符数组s的初始化内容可以看出,fun()函数返回值应该是61。故应该选择C。28.有如下程序段int
24、 *p,a=10,b=1;p=&a;a=*p+b;执行该程序段后,a的值为 A. 12 B. 11 C. 10 D. 编译出错(分数:1.00)A.B.C.D.解析:解析 p=&a表达式的含义是将变量a的地址赋给指针变量p;a=*p+b表达式的含义是指针变量p所存地址对应的值与b的和赋给a。29.整型变量x和Y的值相等,且为非0值,则以下选项中结果为0的表达式是_。 A. XY B. X|Y C. X&Y D. XY(分数:2.00)A.B.C.D.解析:解析 “”为或运算符,当其左右表达式中只要一个为非零则整个表达式的值1。|是按位或,&是按位与,是按位异或,这三位运算符是按值的二进制位来比
25、较的。30.以下数组定义中错误的是_。 A. int x3=0; B. int x23=1,2,3,4,5,6; C. int x3=1,2,3,4,5,6; D. int x3=1,2,3,4,5,6;(分数:1.00)A.B.C.D.解析:评析:C语言中,二维数组中元素的排列顺序是:先按行存放,再按列存放,并且要有足够的空间来保证定义的数组长度始终大于等于需要存放的元素的长度。选项B中行数定义为2行,但实际却需要存放3行元素故不正确。31.下面宏定义正确的是 U /U A. #define S a*b B. #define PI 3.14; C. #define max(a,b) (a)
26、(b) ?(a) ;(b) ) D. #define s(x) (x)*(x);(分数:1.00)A.B.C.D.解析:32.以下程序中函数f的功能是: 当flag 为1时,进行由小到大排序;当flag 为0时,进行由大到小排序。void f(int b, int n, int flag)int i, j, t;for (i=0; in-1; i+)for (j=i+1; jn; j+)if(flag ? b!j: bibj) t=bi; bi=bj; bj=t; main () int a10=5,4,3,2,1,6,7,8,9,10, i;f(&a2, 5, 0);f(a, 5, 1),for (i=0; i10; i+)printf(%d, ai);程序运行后输出结果是U /U。 A. 1,2,3,4,5,6,7,8,9,10, B. 3,4,5,6,7,2,1,8,9,10, C. 5,4,3,2,1,