1、二级 C 语言分类模拟题 567 及答案解析(总分:46.00,做题时间:90 分钟)一、选择题(总题数:30,分数:46.00)1.若 a、b、c、d 都是 int 型变量且都已经正确赋初值,则以下不正确的赋值语句是_。(分数:2.00)A.a+d;B.a+;C.a=b=c=d=100;D.a=(b=3)+(d=5);2.有以下程序: #include stdio.h main() char ch35=“AAAA“, “BBB“, “CC“; printf(“%s/n“, ch1); 程序运行后的输出结果是_。(分数:1.00)A.AAAB.CCC.BBBCCD.BBB3.有以下程序: #i
2、nclude stdio.h #include string.h typedef struct char name9; char sex; float score2; STU; void f(STU A) STU b=“Zhao“, “m“, 85.0, 90.0; int i; strcpy(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
3、.sex, c.score0, c.score1); 程序的运行结果是_。(分数:2.00)A.Zhao,m,85,90B.Qian,m,85,90C.Zhao,f,95,92D.Qian,f,95,924.执行下面程序段后 m 的结果为_。 static int a23=1,2,3,4,5,6);int m,*ptr=a; m=(*ptr)*(*(ptr+2)*(*(ptr+4);(分数:2.50)A.15B.48C.24D.605.排序方法中,将整个无序序列分割成若干小的子序列并分别进行插入排序的方法,称为_。(分数:1.00)A.希尔排序B.冒泡排序C.插入排序D.选择排序6.排序方法中
4、,将整个无序序列分割成若干小的子序列并分别进行插入排序的方法,称为_。(分数:1.00)A.希尔排序B.冒泡排序C.插入排序D.选择排序7.下列叙述中错误的是_。(分数:2.00)A.一个 C 语言程序只能实现一种算法B.C 程序可以由多个程序文件组成C.C 程序可以由一个或多个函数组成D.一个 C 函数可以单独作为一个 C 程序文件存在8.某二叉树中有 n 个叶子节点,则该二叉树中度为 2 的节点数为_。(分数:1.00)A.n+1B.n-1C.2nD.n/29.以下选项中有语法错误的是_。(分数:1.00)A.char*str=“guest“;B.char str10=“guest“;C.
5、char*str3; strt=“guest“;D.char str310; str1=“guest“;10.关于结构化程序设计原则和方法的描述错误的是 _ 。(分数:2.00)A.选用的结构只准许有一个入口和一个出口B.复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现C.不允许使用 GOTO 语句D.语言中所没有的控制结构,应该采用前后一致的方法来模拟11.有以下程序: #include stdio.h main( ) int a=1,b=0; printf(“%d,“,b=a+b); printf(“%d/n“,a=2*b);(分数:2.00)A.1,2B.1,0C.3,2D.0,012
6、.有以下程序 #includestdio.h main() int x,y,z; x=y=1; z=x+,y+,+y; printf(“%d,%d,%d/n“,x,y,z); 程序运行后的输出结果是_。(分数:1.00)A.2,3,1B.2,3,2C.2,3,3D.2,2,113.以下函数返回 a 所指数组中最小的值所在的下标值: fun(int*a, int n) int i, j=0, p; p=j; for(i=j; in; i+) if(aiaj)_return(p); 在下划线处应填入的是_。(分数:2.50)A.i=pB.ap=aiC.p=jD.p=i14.有以下程序: #incl
7、udestdio.h int f(int, int); main() int i=2, p; p=f(i, i+1); printf(“%d/n“, p); int f(int a, int b) int c; c=a; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); 程序的输出结果是(分数:2.00)A.-1B.0C.1D.215.若有定义: int w35; 则以下不能正确表示该数组元素的表达式是_。(分数:1.00)A.*(w+1)4B.*(*w+3)C.*(*(w+1)D.*(else k=0;C.if(a=b)k=0;else
8、if(b=c)k=1;D.if(ab)k=1;else if(bc)k=1;else k=0;17.以下结构体说明和变量定义中,正确的是_。(分数:1.00)A.typedef struct abcint n;double m;ABC;ABC x,y;B.struct abcint n;double m;struct abc x,y;C.struct ABCint n;double m;struct ABC x,y;D.struct abcint n;double m;abc x,y;18.有以下程序: #include stdio.h #include stdlib.h void fun(d
9、ouble *p1,double *p2,double *s) s=(double *)calloc(1,sizeof(double); *s=*p1+*(p2+1); main( ) double a2=1.1,2.2,b2=10.0,20.0,*s=a; fun(a,b,s); printf(“%5.2f/n“, *s); 程序的输出结果是_。(分数:1.00)A.21.10B.11.10C.12.10D.1.1019.以下程序的输出结果是_。 #includestdio.h main() int a=1,b=3; if(+a0) else printf(“%d,%d/n“,b,a); (
10、分数:2.50)A.2,2B.1,3C.3,2D.3,120.为了合理组织数据,应遵循的设计原则是 _(分数:1.00)A.“一事一地”的原则,即一个表描述一个实体或实体之间的一种联系B.用外部关键字保证有关联的表之间的联系C.表中的字段必须是原始数据和基本数据元素,并避免在表之间出现重复字段D.以上各原则都包括21.若有下列定义和语句: int u=011, v=0x11, w=11; printf(“%o, %x, %d/n“, u, v, w); 则输出结果是_。(分数:2.50)A.9,17,11B.9,11,11C.11,11,11D.11,17,1122.一棵二叉树共有 25 个结
11、点,其中 5 个是叶子结点,则度为 1 的结点数为_。(分数:1.00)A.16B.10C.6D.423.已知 char*p, *q;,正确的语句是_。(分数:1.00)A.p*=3;B.p/=q;C.p+=3;D.p+=q;24.有以下定义语句,编译时会出现编译错误的是_。(分数:1.00)A.char a=“/x2d“;B.char a=“/n“;C.char a=“a“;D.char a=“aa“;25.若变量已正确定义,下列正确的程序段是 _ 。(分数:2.00)A.while(ch=getchar()=“/N“)putchar(ch);B.while(ch=getchar()=“/n
12、“)putchar(ch);C.while(ch=getchar()!=“/N“)putchar(ch);D.while(ch=getchar()!=“/n“)putchar(ch);26.若要定义一个具有 5 个元素的整型数组,以下错误的定义语句是_。(分数:1.00)A.int a5=0;B.int b=0, 0, 0, 0, 0;C.int c2+3j;D.int i=5, di;27.有以下程序 #includestdio.h main() int b33=0, 1, 2, 0, 1, 2, 0, 1, 2, i, j, t=1; for(i=0; i; i+) for(j=i; j=
13、i; j=+)t+=bibji; printf(“%d/n“, t); 程序运行后的输出结果是_。(分数:2.00)A.4B.3C.1D.928.有以下程序: #includestdio.h main( ) int k,n=0;char c,str=“teach“; for(k=0;strk;k+) c=strk; switch(k) case 1: case 3: case 5: putchar(c);printf(“%d“,+n);break; default:putchar(“N“); 序的运行结果是_。(分数:1.00)A.Ne1NNB.e1a2e3C.Ne1Nc2ND.Na1NNNN
14、29.有以下程序 #includestdio.h #define M 5 #define f(x, y) x*y+M main() int k; k=f(2, 3)*f(2, 3); printf(“%d/n“, k); 程序的运行结果是(分数:2.00)A.22B.41C.100D.12130.有以下程序: main( ) char * p10=“abc“,“aabdfg“,“dcdbe“,“abbcf“,“cd“; printf(“%d/n“,strlen(p4); 执行后的输出结果是 _。(分数:2.00)A.2B.3C.4D.5二级 C 语言分类模拟题 567 答案解析(总分:46.0
15、0,做题时间:90 分钟)一、选择题(总题数:30,分数:46.00)1.若 a、b、c、d 都是 int 型变量且都已经正确赋初值,则以下不正确的赋值语句是_。(分数:2.00)A.a+d; B.a+;C.a=b=c=d=100;D.a=(b=3)+(d=5);解析:2.有以下程序: #include stdio.h main() char ch35=“AAAA“, “BBB“, “CC“; printf(“%s/n“, ch1); 程序运行后的输出结果是_。(分数:1.00)A.AAAB.CCC.BBBCCD.BBB 解析:解析 数组的排序从 0 开始,此时输出的是 ch1,实际上输出的是
16、第二行的值,所以答案为 D。3.有以下程序: #include stdio.h #include string.h typedef struct char name9; char sex; float score2; STU; void f(STU A) STU b=“Zhao“, “m“, 85.0, 90.0; int i; strcpy(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,
17、%2.0f,%2.0f/n“, c.name, c.sex, c.score0, c.score1); 程序的运行结果是_。(分数:2.00)A.Zhao,m,85,90B.Qian,m,85,90C.Zhao,f,95,92D.Qian,f,95,92 解析:解析 本题考查结构体的相关操作以及传值、传址的区别。该题中调用 f 函数后,会生成参数 c的一个副本,而不会改变 c 的值,所以 c 值维持原值,故选项 D 正确。4.执行下面程序段后 m 的结果为_。 static int a23=1,2,3,4,5,6);int m,*ptr=a; m=(*ptr)*(*(ptr+2)*(*(ptr
18、+4);(分数:2.50)A.15 B.48C.24D.60解析:5.排序方法中,将整个无序序列分割成若干小的子序列并分别进行插入排序的方法,称为_。(分数:1.00)A.希尔排序 B.冒泡排序C.插入排序D.选择排序解析:解析 希尔排序法的基本思想是:将整个无序序列分割成若干小的子序列分别进行插入排序。6.排序方法中,将整个无序序列分割成若干小的子序列并分别进行插入排序的方法,称为_。(分数:1.00)A.希尔排序 B.冒泡排序C.插入排序D.选择排序解析:解析 希尔排序法的基本思想是:将整个无序序列分割成若干小的子序列分别进行插入排序。7.下列叙述中错误的是_。(分数:2.00)A.一个
19、C 语言程序只能实现一种算法 B.C 程序可以由多个程序文件组成C.C 程序可以由一个或多个函数组成D.一个 C 函数可以单独作为一个 C 程序文件存在解析:解析 一个 C 语言程序能实现多种算法,所以 A 错误。8.某二叉树中有 n 个叶子节点,则该二叉树中度为 2 的节点数为_。(分数:1.00)A.n+1B.n-1 C.2nD.n/2解析:解析 对任何一棵二叉树,度为 0 的节点(即叶子节点)总是比度为 2 的节点多一个。二叉树中有n 个叶子节点,则度为 2 的节点个数为 n-1,故 B 选项正确。9.以下选项中有语法错误的是_。(分数:1.00)A.char*str=“guest“;B
20、.char str10=“guest“;C.char*str3; strt=“guest“;D.char str310; str1=“guest“; 解析:解析 在 D 选项中,首先定义了一个二维数组 str,str1=“guest“,在赋值时使用一个字符串进行赋值是错误的,所以答案选择 D。10.关于结构化程序设计原则和方法的描述错误的是 _ 。(分数:2.00)A.选用的结构只准许有一个入口和一个出口B.复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现C.不允许使用 GOTO 语句 D.语言中所没有的控制结构,应该采用前后一致的方法来模拟解析:解析 限制使用 GOTO 语句是结构化程序设
21、计的原则和方法之一,但不是绝对不允许使用 GOTO 语句。其他 3 项为结构化程序设计的原则。11.有以下程序: #include stdio.h main( ) int a=1,b=0; printf(“%d,“,b=a+b); printf(“%d/n“,a=2*b);(分数:2.00)A.1,2 B.1,0C.3,2D.0,0解析:解析 首先打印 b=a+b=1+0=1 的值 1,此时已给 b 赋值为 1。然后打印 a=2*b=2*1=2 的值 2。所以结果是 1,2。12.有以下程序 #includestdio.h main() int x,y,z; x=y=1; z=x+,y+,+y
22、; printf(“%d,%d,%d/n“,x,y,z); 程序运行后的输出结果是_。(分数:1.00)A.2,3,1 B.2,3,2C.2,3,3D.2,2,1解析:解析 对于表达式“z=x+,y+,+y;”,因为赋值运算符的优先级高于逗号运算符的优先级,所以可以将上式改成“(z=x+),(y+),(+y)”。然后从左向右先计算表达式 z=x+,因为 x+先使用后自增,所以 z 的值为 1,x 的值为 2。再计算逗号表达式第二个表达式 y+,此时 y 的值为,y+的值为。最后计算第三个表达式+y,y 的值为 3。故本题答案为 A。13.以下函数返回 a 所指数组中最小的值所在的下标值: fu
23、n(int*a, int n) int i, j=0, p; p=j; for(i=j; in; i+) if(aiaj)_return(p); 在下划线处应填入的是_。(分数:2.50)A.i=pB.ap=aiC.p=jD.p=i 解析:解析 该程序先判断 aiap,如果条件为真,则 ai比当前设定的最小值小(p 保留的当前最小元素的下标),那么将 i 赋给 p,即将比较过的最小元素标保留在 p 中,作为下面判断的标准。14.有以下程序: #includestdio.h int f(int, int); main() int i=2, p; p=f(i, i+1); printf(“%d/n
24、“, p); int f(int a, int b) int c; c=a; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); 程序的输出结果是(分数:2.00)A.-1 B.0C.1D.2解析:15.若有定义: int w35; 则以下不能正确表示该数组元素的表达式是_。(分数:1.00)A.*(w+1)4 B.*(*w+3)C.*(*(w+1)D.*(else k=0;C.if(a=b)k=0;else if(b=c)k=1;D.if(ab)k=1;else if(bc)k=1;else k=0;解析:解析 本题考核的知识点是三目运算符
25、“?:”的运用。三目运算表达式的规则为如果“?”前面的表达式的值为真,则取“:”前的表达式的值,否则,取“:”后面表达式的值。分析题目中给出的表达式可知,如果 ab 和 bc 同时成立,k=1,否则 k=0。所以,4 个选项中选项 A)符合题意。17.以下结构体说明和变量定义中,正确的是_。(分数:1.00)A.typedef struct abcint n;double m;ABC;ABC x,y; B.struct abcint n;double m;struct abc x,y;C.struct ABCint n;double m;struct ABC x,y;D.struct abci
26、nt n;double m;abc x,y;解析:解析 本题考查 typedef 的使用方法,typedef 对已存在的类型使用一个新的名字,选项 A 中 ABC为新的类型别名,定义正确。18.有以下程序: #include stdio.h #include stdlib.h void fun(double *p1,double *p2,double *s) s=(double *)calloc(1,sizeof(double); *s=*p1+*(p2+1); main( ) double a2=1.1,2.2,b2=10.0,20.0,*s=a; fun(a,b,s); printf(“%
27、5.2f/n“, *s); 程序的输出结果是_。(分数:1.00)A.21.10B.11.10C.12.10D.1.10 解析:解析 本题考查把数组名作为函数参数。执行 fun 函数后,s 的值并没有发生变化,仍然是指向a,所以输出结果为 1.10,故选项 D 正确。19.以下程序的输出结果是_。 #includestdio.h main() int a=1,b=3; if(+a0) else printf(“%d,%d/n“,b,a); (分数:2.50)A.2,2B.1,3C.3,2 D.3,1解析:解析 解答本题的关键在于 if 语句条件中的表达式。初始时 a=1,b=3,所以“+a=2
28、0”,因此“+a0”为假;因为是进行逻辑与( printf(“%o, %x, %d/n“, u, v, w); 则输出结果是_。(分数:2.50)A.9,17,11B.9,11,11C.11,11,11 D.11,17,11解析:解析 “%o”表示八进制无符号型输出整型数据(即不带前导 0);“%x”表示以十六进制无符号型输出整型数据(即不带前导 0x 或 0X);“%d”表示输出带符号的十进制整型数。22.一棵二叉树共有 25 个结点,其中 5 个是叶子结点,则度为 1 的结点数为_。(分数:1.00)A.16 B.10C.6D.4解析:解析 根据二叉树的性质 3:在任意一棵二叉树中,度为
29、0 的叶子结点总是比度为 2 的结点多一个,所以本题中度为 2 的结点是 5-1=4 个,所以度为 1 的结点的个数是 25-5-4=16 个。23.已知 char*p, *q;,正确的语句是_。(分数:1.00)A.p*=3;B.p/=q;C.p+=3; D.p+=q;解析:24.有以下定义语句,编译时会出现编译错误的是_。(分数:1.00)A.char a=“/x2d“;B.char a=“/n“;C.char a=“a“;D.char a=“aa“; 解析:解析 D 选项不能将一个字符串赋值给一个字符变量,所以选择 D。25.若变量已正确定义,下列正确的程序段是 _ 。(分数:2.00)
30、A.while(ch=getchar()=“/N“)putchar(ch);B.while(ch=getchar()=“/n“)putchar(ch);C.while(ch=getchar()!=“/N“)putchar(ch);D.while(ch=getchar()!=“/n“)putchar(ch); 解析:解析 本题考查两个知识点:C 语言用“/n“这个字符常量表示换行;函数 getchar()的作用是从终端输入一个字符,当遇到换行时结束输入。26.若要定义一个具有 5 个元素的整型数组,以下错误的定义语句是_。(分数:1.00)A.int a5=0;B.int b=0, 0, 0,
31、0, 0;C.int c2+3j;D.int i=5, di; 解析:解析 选项 A 中,其他元素会自动以 0 填充。选项 C 中维数是常量表达式,故没错。27.有以下程序 #includestdio.h main() int b33=0, 1, 2, 0, 1, 2, 0, 1, 2, i, j, t=1; for(i=0; i; i+) for(j=i; j=i; j=+)t+=bibji; printf(“%d/n“, t); 程序运行后的输出结果是_。(分数:2.00)A.4 B.3C.1D.9解析:解析 每次内循环只循环一次就结束,第一次外循环时 t=t+b0b00=1+b00=1+
32、0=1;第二次外循环时 t=t+b1b11=1+b11=1+1=2;第三次外循环时 t=t+b2b22=2+b22=2+2=4。故本题答案为 A。28.有以下程序: #includestdio.h main( ) int k,n=0;char c,str=“teach“; for(k=0;strk;k+) c=strk; switch(k) case 1: case 3: case 5: putchar(c);printf(“%d“,+n);break; default:putchar(“N“); 序的运行结果是_。(分数:1.00)A.Ne1NNB.e1a2e3C.Ne1Nc2N D.Na1
33、NNNN解析:解析 程序执行过程:k=0 时,c=str0=“t“,执行 default 分支,输出 N;k=1 时,c=“e“,执行 case 1 分支,没有 break 语句,继续执行 case 3 分支,没有 break 语句,继续执行 case 5 分支,输出 e1;k=2 时,c=“a“,输出 N;k=3,c=“c“,输出 c2;k=4,c=“h“,输出 N。故程序的输出结果为Ne1Nc2N。29.有以下程序 #includestdio.h #define M 5 #define f(x, y) x*y+M main() int k; k=f(2, 3)*f(2, 3); printf(“%d/n“, k); 程序的运行结果是(分数:2.00)A.22B.41 C.100D.121解析:30.有以下程序: main( ) char * p10=“abc“,“aabdfg“,“dcdbe“,“abbcf“,“cd“; printf(“%d/n“,strlen(p4); 执行后的输出结果是 _。(分数:2.00)A.2 B.3C.4D.5解析:解析 本题中 p4=“cd“,所以 strlen(p4)=2。