1、二级 C 语言笔试-129 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:70.00)1.两次运行下列的程序,如果从键盘上分别输入 3 和 1,则输出结果是( )。main()int x;scanf(“%d“,的功能是使指针变量 t 指向字符串变量 s 的末尾,这时退出循环,因而语句 return(t-s);返回的就是字符串 s所指字符串的长度。26.下列程序的运行结果是( )。#includestdio.h#includestring.hmain()char*s1=“ahDuj“;char*s2=“ABdUG“:int t;t=strcmp(s1,s2
2、);printf(“%d“, t);(分数:2.00)A.正数 B.负数C.零D.不确定的值解析:解析 本题考查字符串比较函数和两个字符串比较的原则两个知识点:原则是依次比较两个字符串同位置的一对字符,若它们的 ASCII 码值相同,则继续比较下一对字符,若它们的 ASCII 码值不同则 ASCII 码值较大的字符所在的串符串较大;若所有字符相同,则两个字符串相等;若一个字符串全部 i 个字符与另一个字符串的前 i 个字符相同,则字符串较长的较大。strcmp(s1,s2)的返回值,当 str1str2 时,返回值0;当 str1=str2 时,返回值为 0;当 str1str2,返回值0。2
3、7.下列叙述中正确的是( )。(分数:2.00)A.break 语句只能用于 switch 语句体中B.continue 语句的作用是使程序的执行流程跳出包含它的所有循环C.break 语句只能用在循环体内和 switch 语句体内 D.在循环体内使用 break 语句和 continue 语句的作用相同解析:解析 只能在循环体内和 switch 语句体内使用 break 语句当 break 出现在循环体的 switch 语句体内时,其作用只是跳出该 switch 语句体,并不能中止循环体的执行。若想强行中止循环体的执行,可以在循环体中,但并不在 switch 语句中设置 break 语句,满
4、足某种条件则跳出本层循环体。28.下列程序段的输出结果为( )。#includestdio. hmain()static char a=“language“;char*p;p=a;for(p=a;pa+8;p+=2)putchar(*p);(分数:2.00)A.languageB.lnug C.有语法错误D.lang解析:解析 本程序首先定义了静态字符数组 a,然后将指针 p 指向数组 a 的首地址。第 1 次 for 循环,p=a,p 指向数组的第 1 个元素,*p 是取指针 p 所指地址的内容,输出 1;第 2 次 for循环,p=p+2,则 p 指向数组的第 3 个元素,*p 是取指针
5、p 所指地址的内容输出 n;第 3 次 for 循环,p=p+2,则 p 指向数组的第 5 个元素,*p 是取指针 p 所指地址的内容,输出 u;第 4 次 for 循环,p=p+2,则 p 指向数组的第 7 个元素,*p 是取指针 p 所指地址的内容,输出 g,结束循环。29.若有说明 int a3=0,0);,则不正确的叙述是( )。(分数:2.00)A.数组 a 的每个元素的初值都是 0B.数组 a 的第一维大小为 1C.数组 a 的行数为 1D.只有元素 a00和 a01可得到初值 0,其余元素均得不到初值 0 解析:解析 本题考查给二维数组元素赋值。给二维数组元素赋值时应注意下列两点
6、:在对二维数组元素赋初值时,可以只对部分元素赋初值,未赋初值的元素自动取 0。二维数组第一维的大小由下列规则确定:当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小;当初值的个数不能被第二维的常量表达式的值除尽时,第一维的大小=所得商数+1。30.下列程序的运行结果是( )。main()int a=-5,b=1,c=1;int x=0,Y=2,z=0;if(c0)x=x+ y;if(a=0)if(b0)if(c=0)y=x-y;else if(c0)Y=x-y;else z=y;printf(“%d,%d,%d/n“,x,y,z);(分数:2.00)A.2,2,0 B.2,
7、2,2C.0,2,0D.2,0,2解析:解析 本题考查 if else 语句的使用。 先判断第 1 个 if 语句,因为 c=10,所以 x=x+ y=0+2=2。第 1 个 if 语句,因为 a=-50,所以进入下列的复合语句。经判断发现,复合语句中第 2 个 if语句的条件均不满足,不执行任何语句退出,在这个过程中 y 和 z 的值没有发生变化。31.下列程序中 c 的二进制值是( )。char a=2,b=4,c;c=ab2:(分数:2.00)A.00000011 B.00010100C.00011100D.00011000解析:解析 本题主要考查按位异或和右移运算。b=4 的二进制为
8、00000100,b2 后为00000001,a=2 的二进制为 00000010,两者异或为 00000011。32.设有下列定义:struct skint m;float x;data,*q;若要使 q 指向 data 中的 m 域,正确的赋值语句是( )。(分数:2.00)A.q=&data.m;B.q=data.m;C.q=(struct sk*)&data.m; D.q=(struct sk*)data.m;解析:解析 利用强制类型转换(struct sk*),把整数型地址&data.m 转换成结构体变量指针赋给结构体指针变量 q。33.有下列函数定义:int fun(double
9、a,double b) return a*b;若下列选项中所用变量都己正确定义并赋值,错误的函数调用是( )。(分数:2.00)A.if(fun(x,y)B.z=fun(fun(x,y),fun(x,y);C.z=fun(fun(x,y)x,y); D.fun(x,y);解析:解析 本题考查函数调用时的参数传递。C 项中第一个参数的表达式不正确,因此不能得到正确的结果。34.源程序的文档化不包括( )。(分数:2.00)A.符号名的命名要有实际意义B.正确的文档形式 C.良好的视觉组织D.正确的程序注释解析:解析 源程序的文档化主要包括 3 点,符号名应具有一定实际的含义,便于理解程序功能;正
10、确的程序注释;良好的视觉组织(利用空格、空行、缩进等技巧使程序层次清晰)。35.下列说法不正确的是( )。A) C 程序是以函数为基本单位的,整个程序由函数组成C) C 语言程序的一条语句可以写在不同的行上B) C 程序的注释行对程序的运行功能不起任何作用,所以注释应该尽可能少写D) C 程序的每个语句都以分号结束(分数:2.00)A.B.C. D.解析:解析 本题涉及 C 语言基本的 3 个知识点:C 语言的源程序是由函数构成的,函数是其基本单位,每一个函数完成相对独立的功能,其中只能包括一个主函数;c 语言规定每个语句以分号结束,其书写格式是自由的,一条语句可以写在不同的行上,或者一行也可
11、以写多条语句;注释行虽然对程序的运行不起作用,但是它可以方便程序员阅读,提高程序的可读性和可移植性,所以书写注释行还是很有必要的。36.下列标识符不是关键字的是( )。(分数:2.00)A.breakB.charC.Switch D.retum解析:解析 break,char、return、switch 都是 C 语言中的关键字,Switch 不是。因为 C 语言区分字母的大小写。37.对长度为 n 的线性表进行顺序查找,在最坏情况下需要比较的次数为( )。(分数:2.00)A.125B.n/2C.n D.n+1解析:解析 对线性表进行顺序查找时,从表中的第一个元素开始,将给定的值与表中逐个元
12、素的关键字进行比较,直到两者相符,查找到所要找的元素为止。在最坏情况下,要查找的元素是表的量后一个元素或查找失败,这两种情况都需要将这个元素与表中的所有元素进行比较,因此比较次数为 n。38.待排序的关键码序列为(33,18,9,25,67,82,53,95,12,70),要按关键码值递增的顺序排序,采取以第一个关键码为基准元素的快速排序法,第一趟排序后关键码 33 被放到第( )个位置。(分数:2.00)A.3B.5 C.7D.9解析:解析 快速排序的基本思想是:从表中选取一个元素(如本题中的 33),将表中小于此元素的移到前面,大于此元素的移到后面,结果把线性表分割成两部分(两个子表),此
13、元素插入到其分界线的位置处。然后分别对两个子表再次分割本题中 33 作为分割的中界线,第一趟排序后捧在比它小的18、9、2,、12 后面。39.有下列二叉树,对此二叉树中序遍历的结果为( )。(分数:2.00)A.B. C.D.解析:解析 对二叉树的中序遍历是指:首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,注意依旧按照“左子树根结点右子树”的顺序。40.若 w、x、y、z、m 均为 int 型变量,则执行下列的语句后 m 的值是( )。w=2,x=3,y=4,z=5;m=(wx)?w:x;m=(mz)?m:z;m=(my)?m:y;(分数:2.00)A.2 B.3C.5
14、D.4解析:解析 条件表达式“a?b:c”的含义是:当 a 为真时,其值等于表达式 b 的值,当 a 为假时,其值等于表达式 c 的值。表达式运算过程:第 1 个表达式:w-2x=3 为真,所以返回 w 的值,即 m=w=2;第 2 个表达式;m-2z=5为真,所以返回 m 的值,即 m=2;第 3 个表达式;w=2y=4 为真,所以返回 m 的值,即 m=2。二、填空题(总题数:15,分数:30.00)41.在数据的存储结构中,不仅需要存储各数据元素的信息,还要存放各元素之间 1 的信息。(分数:2.00)填空项 1:_ (正确答案:前后件关系)解析:解析 在数据存储结构中,除了要存储数据,
15、还要存储数据的前后件关系,对于顺序存储的数据结构,前后件之间的关系,是通过存储空间的位置来实现的,而对于链式存储来说,数据元素之间的前后件关系是通过指针来实现的。42.按照“先进先出”的原则组织数据的结构是 1。(分数:2.00)填空项 1:_ (正确答案:队列)解析:解析 队列是一种特殊的线性表,只允许在表的一端插入元素,在表的另一端删除元素,插入元素的一端叫做“队尾”,删除元素的一端叫做“队头”,先插入的元素先被删除,是按先进先出的原则组织数据的。43.深度为 5 的满二叉树中,叶子结点的个数为 1。(分数:2.00)填空项 1:_ (正确答案:16)解析:解析 满二叉树的叶子结点都在最后
16、一层,即第 4 层,且第 4 层的结点达到最大数,即 25-1=16。44.在面向对象的方法中, 1 描述的是具有相似属性与操作的一组对象。(分数:2.00)填空项 1:_ (正确答案:类)解析:解析 在面向对象的方法中,把具有相同属性和方法的对象称为类,类是对象的抽象,对象是类的实例。45.Jackson 方法是一种面向 1 的结构化方法。(分数:2.00)填空项 1:_ (正确答案:数据结构)解析:解析 Jackson 方法是一种结构化分析方法,它是一种面向数据结构的结构化方法。46.若 a 是 int 型变量,则表达式(a=2*3,a*2),a+6 的值为 _。(分数:2.00)填空项
17、1:_ (正确答案:12)解析:解析 本题考查逗号表达式的运算规则。逗号表达式的基本格式为:“表达式 1,表达式 2,”,其整个表达式的结果取最后一个子表达式的值。本题中首先计算逗号表达式中的第 1 个表达式 a=2*3=6,然后计算第 2 个表达式 a*2,这时整个表达式的值为 12,但要注意,因为第 2 个表达式并没有给 a 赋值,因此 a 的值不变;接下来执行最后一个表达式a+6=12,所以整个表达式最后的值为 12。47.表达式 1/2*(int)3.7/(int)(2.4*(1.5+2.5)值的数据类型为 1。(分数:2.00)填空项 1:_ (正确答案:整型)解析:解析 上面的表达
18、式中,通过强制类型转换把最后参与运算的数据都转换成了 int 型,所以最后得到的结果也是 int 类型。48.下列程序段的输出结果是 _。int n=c:switch(n+)default:printf(“error“);break;casea:printf(“good“);break;casec:printf(“moming“);cased:printf(“class“);(分数:2.00)填空项 1:_ (正确答案:morningclass)解析:解析 本题考查了两个知识点:“+、-”运算后缀形式是先使用变量原来的值,使用完后再使其增 1 或减 1;在 switch 语句中,当 n=c时,
19、执行“casec:”,输出 morning;因为此句中没有 break 语句,因此接着执行“cased:”,输出 class,最终输出结果为 morningclass。49.写出下列程序的输出结果 _。main()int=0;while(n+=1);printf(“%d,“,n);printf(“%d“,n+);(分数:2.00)填空项 1:_ (正确答案:3,3)解析:解析 本题在 while(n+=1)语句后,直接加了分号,说明如果 while()的条件为真时,该循环什么都不做;n+是先取 n 的当前值和 I 做比较,然后再将 n 加 1。第一次循环,n=0 时,循环条件n+=0=1 成立
20、,执行循环,然后得到 n=1。第二次循环,n=1 时,循环条件 n+=1=1 成立,执行循环,然后得到 n=2。第三次循环,n=2 时,循环条件 n+=2=1 不成立,不执行循环,但在判断循环条件时仍将 n 加 1,得到 n=3。退出循环后执行 printf 语句,第二个 printf 语句输出 n+,是先输出 n 的当前值3,然后再将 n 加 1,即程序结束后得到 n=4,但输出的是 3。50.下列程序的功能是对输入的一行字符中的数字字符的字面值累加,输出此累加和,请填空。#includestdio.h#includectype.hmain()char c;int a,s=0;while(
21、_)if(isdigit(C) )a=c-0;s+=a;printf(“s=%d“,s);(分数:2.00)填空项 1:_ (正确答案:(c=getchar()!=/n)解析:解析 分析题目可知,程序中运用函数 c=getchar()从标准输入设备读取下一个字符,而且是一行的字符(即没有换行),所以条件为 (c=getchar()!=/n。51.下列程序输出的结果是_。int m=17;int fun(int x,int y)int m=3;return(x*Y-m);main()int a=5,b=7;printf(“%d/n“,fun(a,B) /m);(分数:2.00)填空项 1:_ (
22、正确答案:1)解析:解析 本题考查局部变量和全局变量的区别:局部变量是指作用域在函数级和块级的变量,全局变量是指作用域在程序级和文件级的变量。本程序首先定义了一个全局变量 m=17,m=17 的作用域在整个程序内。在 fun 函数内部定义了一个局部变量 m=3,m=3 的作用域仅在 fun 函数内部,通过 fun 函数返回两个形参的积再减 m。在主函数中,输出fun(a,b)/m=(5*7-3)/17=1。52.设有下列的程序段:char str=“Hello“;char*ptr;ptr=str;执行上面的程序段后,*(ptr+5)的值为 1。(分数:2.00)填空项 1:_ (正确答案:/0
23、)解析:解析 本题涉及字符数组和指针的两个知识点,在 C 语言中,字符型数组在存放字符串时会自动在末尾加上字符串结束标识符/0,所以题中数组 str 有 6 个元素。ptr 指向数组 str 的首地址,ptr+5 是指向 str5,*(ptr+5)是引用 str5的值,即/0。53.若有定义 int a44=1,2,3,4,0,4,6,8,10,1,3,5,7,则初始化后,a11得到的初值是 1。(分数:2.00)填空项 1:_ (正确答案:0)解析:解析 二维数组可以看成是按矩阵形式排列的,题目中给二维数组赋初值是按行分段赋值的,a44可以分解为 4 个一维数组,其数组名分别为 a0、a1、
24、a2、a3,这 4 个一维数组都有 4 个元素,a0的元素为 a00、a01、a02、a03。54.设有下列程序:#includestdio.h#includestring.hmain()int i;char s10,t10;gets(t);for(i=0;i2;i+)gets(s);if(strcmp(t,s)0)strcpy(t,s);printf(“%s/n“,t);程序运行后,从键盘上输入(CR代表回车符):CDEFCRBADEFCRQTHRGCR,则程序的输出结果是 _。(分数:2.00)填空项 1:_ (正确答案:QTHRG)解析:解析 strcmp(t,s)函数用来比较 t 和
25、s 所指字符串的大小,若 ts,则函数值大于 0;若 t=s,则函数值等于 0:若 ts,则函数值小于 0。strcpy(t,s)函数的功能是把字符数组 s 所指字符串的内容复制到字符数组 t 所指的存储空间中。本题中,t10=“CDEF“。第一次循环,s10=“BADEF“,if 语句的控制条件 strcmp(t,s)0 不成立,接着执行第二次循环s=“QTHRG“, if 语句的控制条件 strcmp(t,s)0 成立,执行下列的语句,将字符数组 s 所指字符串的内容复制到字符数组 t 所指的存储空间中,然后输出字符数组 t。55.下列程序的输出结果是 _。#define P(A) pri
26、ntf(“%d,“,(int)(A) )#define PRINT(A) P(A) ;printf(“the end“)main()int i,a=0;for(i=1;i5i+)PRINT(a+i);printf(“/n“);(分数:2.00)填空项 1:_ (正确答案:1,2,3,4,the end)解析:解析 本题考查带参数的宏的定义。第 1 次循环,i=1 时,调用 PRINT(1),P(1)输出 1;第 2 次循环,i=2 时,调用 PRINT(2),P(2)输出 2:第 3 次循环,i=3 时,调用 PRINT(3),P(3)输出 3:第 4 次循环,i=4 时,调用 PRINT(4),P(4)输出 4,the end。