1、全国计算机等级考试二级 C语言真题题库 3+2014年 3月及答案解析(总分:43.00,做题时间:120 分钟)一、选择题(每小题 1分,共 40分)(总题数:40,分数:40.00)1.设某二叉树的后序序列为 CBA,中序序列为 ABC,则该二叉树的前序序列为( )。(分数:1.00)A.BCAB.CBAC.ABCD.CAB2.下列叙述中正确的是( )。(分数:1.00)A.存储空间不连续的所有链表一定是非线性结构B.节点中有多个指针域的所有链表一定是非线性结构C.能顺序存储的数据结构一定是线性结构D.带链的栈与队列是线性结构3.算法时间复杂度的度量方法是( )。(分数:1.00)A.算法
2、程序的长度B.执行算法所需要的基本运算次数C.执行算法所需要的所有运算次数D.执行算法所需要的时间4.设循环队列为 Q(1:m),初始状态为 frontrearm。现经过一系列的入队与退队运算后,frontrear1,则该循环队列中的元素个数为( )。(分数:1.00)A.1B.2C.m-1D.0或 m5.计算机软件的构成是( )。(分数:1.00)A.源代码B.程序和数据C.程序和文档D.程序、数据及相关文档6.下面不属于软件设计阶段任务的是( )。(分数:1.00)A.软件的详细设计B.软件的总体结构设计C.软件的需求分析D.软件的数据设计7.下面属于黑盒测试方法的是( )。(分数:1.0
3、0)A.边界值分析法B.基本路径测试C.条件覆盖D.条件-分支覆盖8.一名雇员就职于一家公司,一个公司有多名雇员,则实体公司和实体雇员之间的联系是( )。(分数:1.00)A.1:1 联系B.1:m 联系C.m:1 联系D.m:n 联系9.有关系 R如下,其中属性 B为主键: (分数:1.00)A.实体完整性约束B.参照完整性约束C.用户定义的完整性约束D.关系完整性约束10.在数据库系统中,用于对客观世界中复杂事物的结构及它们之间的联系进行描述的是( )。(分数:1.00)A.概念数据模型B.逻辑数据模型C.物理数据模型D.关系数据模型11.以下选项中可用作 C语言中合法用户标识符的是( )
4、。(分数:1.00)A._123B.voidC.-abcD.2a12.以下选项中合法的 C语言赋值语句是( )。(分数:1.00)A.+i;B.a=b=34C.a=3,b=9D.k=int(a+b)13.以下程序段中的变量已定义为 int类型,则 (分数:1.00)A.6B.4C.5D.714.有以下程序: (分数:1.00)A.13700000B.14000000C.15400000D.1490000015.有以下程序(字母 A的 ASCII代码为 65): (分数:1.00)A.输出格式不合法,输出出错信息B.A,YC.65,90D.65,8916.若变量已正确定义,则以下 for循环(
5、): (分数:1.00)A.执行 4次B.执行 3次C.执行次数不确定D.执行 123次17.若有说明语句:char c72;,则变量 c中存放的是( )。(分数:1.00)A.2个字符B.1个字符C.3个字符D.说明语句不合法18.以下叙述正确的是( )。(分数:1.00)A.do-while语句构成的循环,当 while语句中的表达式值为 0时结束循环B.do-while语句和 while-do构成的循环功能相同C.while-do语句构成的循环,当 while语句中的表达式值为非 0时结束循环D.do-while语句构成的循环,必须用 break语句退出循环19.有以下程序: (分数:1
6、.00)A.2,1B.6,1C.6,0D.2,020.有以下程序: (分数:1.00)A.*#*#*#$B.*#*#*$C.*#*#$D.*#*#*#*$21.若有说明语句:int*ptr10;以下叙述正确的是( )。(分数:1.00)A.Ptr是一个具有 10个指针元素的一维数组,每个元素都只能指向整型变量B.Ptr是指向整型变量的指针C.Ptr是一个指向具有 10个整型元素的一维数组的指针D.Ptr是一个指向 10个整型变量的函数指针22.有以下程序: (分数:1.00)A.0B.变量无定义,输出不确定C.-1D.123.函数调用语句:fun(exp1,exp2),(exp1,exp2,e
7、xp3);含有的实参个数是( )。(分数:1.00)A.1B.4C.5D.224.若有定义语句:int a100,1,2,3,4,5,6,7,8,9,*pa;,以下选项中错误引用 a数组元素的是(其中 0i10)( )。(分数:1.00)A.*(*(a+i)B.ap-aC.piD.*( B.a=b=34C.a=3,b=9D.k=int(a+b)解析:解析赋值语句是在赋值表达式末尾加上分号构成的。B、C 选项缺少分号,不是合法语句。D 选项为强制类型转换赋值语句,但是加缺少括号,是非法语句。+i;相当于 ii+1;,是合法赋值语句,故A选项正确。13.以下程序段中的变量已定义为 int类型,则
8、(分数:1.00)A.6B.4C.5 D.7解析:解析自增和自减运算符的两种用法:前置运算,运算符放在变量之前,规则是先伎变量的值增(或减)1,然后以变化后表达式的值参与其他运算;后置运算,运算符放在变量之后,规则是变量先参与其他运算,然后再伎变量的值增(或减)1。逗号表达式的计算过程是从左到右逐个求每个表达式的值,取最右边一个表达式的值作为该逗号表达式的值。逗号运算符的优先级低于赋值运算符。程序执行过程为:sum5,pad5;pAd5,sum6,pAd6,pAd7。输出 pad,pad5,故 C选项正确。14.有以下程序: (分数:1.00)A.13700000 B.14000000C.15
9、400000D.14900000解析:解析如果一个运算符两边的运算数类型不同,要先将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算。程序执行过程为:a+b5,522(int 类型),sqrt(y)20(double 类型),2O*12212(double 类型),z20(由 int类型自动转换成 double类型)+12+105137。故 A选项正确。15.有以下程序(字母 A的 ASCII代码为 65): (分数:1.00)A.输出格式不合法,输出出错信息B.A,YC.65,90D.65,89 解析:解析一个整数,只要它的值在 0255 范围之内,也可以用字符形式输出。输出之前
10、,系统会将该整数转化为相应的 ASCII码字符。字符也可以用整型来输出,输出的是对应的 ASCII值。A的ASCII值为 65,Y的 ASCII值为 89,故 D选项正确。16.若变量已正确定义,则以下 for循环( ): (分数:1.00)A.执行 4次 B.执行 3次C.执行次数不确定D.执行 123次解析:解析for 循环语句格式为:for(exp1;exp2;exp3)。exp1 通常用来给循环变量赋初值;exp2 通常是循环条件,以便决定是否继续执行循环体;exp3 通常用来修改循环变量的值。程序执行过程为:赋初值 x0,y0,逻辑表达式 y!123 为真,x4 为真,则整个表达式(
11、y!123)(x4)为真,循环条件成立;x1,再次判断表达式为真;x2,;直到 x4 时,y!123 为真,x4 为假,则整个表达式(y!123)(x4)为假,循环条件不成立,退出循环。for 循环执行 4次,故 A选项正确。17.若有说明语句:char c72;,则变量 c中存放的是( )。(分数:1.00)A.2个字符B.1个字符 C.3个字符D.说明语句不合法解析:解析用一对单引号括起来的单个字符为字符常量,以“”开头的转义字符也是字符常量。“”后可以为某些单个字符,也可以为八进制或十六进制数字,故变量 c中存放的是一个字符。因此 B选项正确。18.以下叙述正确的是( )。(分数:1.0
12、0)A.do-while语句构成的循环,当 while语句中的表达式值为 0时结束循环 B.do-while语句和 while-do构成的循环功能相同C.while-do语句构成的循环,当 while语句中的表达式值为非 0时结束循环D.do-while语句构成的循环,必须用 break语句退出循环解析:解析while 循环语句一般形式为:while(表达式)循环体,执行过程为:首先判断表达式,成立(非 O)则执行循环体,不成立(0)则退出循环。dowhile 循环语句一般形式为:do循环体while(表达式),执行过程为:首先执行循环体,之后判断表达式,成立(非 0)则再一次执行循环体,不成
13、立(0)则退出循环。故 A选项正确。在条件相同的情况下,dowhile 循环比 whiledo多执行一次函数体,故 B选项错误。两种循环都是在表达式为 0时结束循环,故 C选项错误。dowhile 循环由表达式真假判断是否退出循环,也可以用 break语句退出循环,故 D选项错误。19.有以下程序: (分数:1.00)A.2,1 B.6,1C.6,0D.2,0解析:解析程序前面表达式等同于 a(c100)9,程序执行过程为:c241,c1002,292,得 a2;“”优先级低于“”,非 0值为真,0 值为假,即(1)为真,逻辑与表达式(1)(1)为真,得 b1。A 选项正确。20.有以下程序:
14、 (分数:1.00)A.*#*#*#$ B.*#*#*$C.*#*#$D.*#*#*#*$解析:解析continue 语句只能用在循环结构中,其作用是结束本次循环,即不再执行循环体中continue语切之后的语句,而是立即转入对循环条件的判断与执行。本题执行过程为:i1,121,if 条件成立,输出*与#;i2,220,if 条件不成立,执行 continue结束本次循环,执行下一次循环;i3,321,输出*与#;i4,420,执行 continue,开始下一次循环;i5,521,输出*与#;i6 退出循环。最后输出$。故 A选项正确。21.若有说明语句:int*ptr10;以下叙述正确的是(
15、 )。(分数:1.00)A.Ptr是一个具有 10个指针元素的一维数组,每个元素都只能指向整型变量 B.Ptr是指向整型变量的指针C.Ptr是一个指向具有 10个整型元素的一维数组的指针D.Ptr是一个指向 10个整型变量的函数指针解析:解析int *ptr10定义一个指针数组,A 选项正确。ptr 是指针数组不是指针,B 选项错误。定义指向具有 10个整型元素的一维数组的指针格式为:int(*ptr)10,C 选项错误。函数指针是指向函数的指针,不会指向整型数组,D 选项错误。22.有以下程序: (分数:1.00)A.0 B.变量无定义,输出不确定C.-1D.1解析:解析NULL 是在 st
16、dioh 头文件中定义的预定义符,NULL 的代码值为 0,如果以整型格式输出,则输出 0。故 A选项正确。23.函数调用语句:fun(exp1,exp2),(exp1,exp2,exp3);含有的实参个数是( )。(分数:1.00)A.1B.4C.5D.2 解析:解析函数名后括号内的数据称为“函数参数”,其中列出的是各个参数的数据类型和名称。调用函数时,括号里面的实参应该与形参的个数与数据类型一致。函数 fun参数列表中有两个参数,分别是逗号表达式“(exp1,exp2)”的值与“(exp1,exp2,exp3)”的值,故 D选项正确。24.若有定义语句:int a100,1,2,3,4,5
17、,6,7,8,9,*pa;,以下选项中错误引用 a数组元素的是(其中 0i10)( )。(分数:1.00)A.*(*(a+i) B.ap-aC.piD.*(&ai)解析:解析*Pa,将数组 a的首地址赋给指针 P。a+i 表示数组 a中第 i个元素的地址,引用其中元素为*(a+i),A 选项引用错误。p-a0,B 选项引用的元素为 a0。C 选项中 pil表示 p后 i个地址的元素ai。D 选项中ai取 ai地址,*(ai)取这个地址内的元素,即为 ai。故本题选择 A选项。25.有以下程序: #include (分数:1.00)A.11,19,19B.12,20,20C.11,20,20 D
18、.12,19,20解析:解析*Pa,将数组 a的首地址赋给指针 Po P-a0,待输出变量为 a0。Pi表示 P后 i个地址的元素,待输出变量为 a9。ai取 ai地址,*(ai)取这个地址内的元素,待输出变量为 a9。最后输出为 11,20,20,故 C选项正确。26.有以下程序: (分数:1.00)A.60,20 B.10,9C.7,20D.10,10解析:解析调用函数 fun,将数组的地址、数组长度、变量 k的地址传人函数。for 函数实现查找数组中最大值,将其下标值存入变量 k标志的内存单元。输出 k6,a620,故 A选项正确。27.有以下说明语句: (分数:1.00)A.17B.1
19、5C.14 D.说明语句不合法解析:解析指针 S所指字符串的长度,可以使用丙数 strlen()来求长度。以“”开头的转义字符也是字符常量。用一对双引号括起来的多个字符为字符串。“”“”“n”为转义字符,所以字符串长度为 14,故 C选项正确。28.有以下程序: (分数:1.00)A.6 B.7C.11D.12解析:解析数组初始化时,如果存说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么 C语言将自动对余下的元素赋初值,如果为字符数组,自动赋值“o”,即 str12st,r,i,n,g,0,0,0,0,0,0。strlen 函数求字符串长度,统计长
20、度时以“0”结束,即统计到长度为6时结束,strlen 函数返回值为 6,故 A选项正确。29.有以下程序: (分数:1.00)A.ABCDEFGHIJKLMNOP B.ABCDEFGHIJKLC.ABCDD.AEIM解析:解析题目中定义了一个指针数组,并对其初始化,6 个指针分别指向 6个字符串。定义指向指针的指针,并使其指向这个指针数组。调用 printf函数打印前 4个字符串,结果为“ABCDEFGHIJKLMNOP”,故 A选项正确。30.有以下程序: (分数:1.00)A.1,6,3,1,3B.1,6,3,2,3 C.1,6,3,6,3D.1,7,3,2,3解析:解析程序执行过程为:
21、输出 i1,之后 i自增,得 i2;赋值 i0,j3,执行语句i+j*2;得 i6;输出 i6,j3;花括号内的 i与花括号外 i作用域不同,属于不同的变量。之后再输出 i2,j3。坟 B选项正确。31.有以下程序: (分数:1.00)A.8,17 B.8,16C.8,8D.8,20解析:解析static 变量又称为静态变量,编译时,将其分配在内存的静态存储区中,在整个程序运行期间都不释放这些存储单元,即使迟出闲数,下次再进入该函数时,静态局部变量仍使用原来的存储单元,值是上一次函数调用结束时的值。若定义时未赋初值,在编译时,系统自动赋初值为 0;若定义时赋初值,则仅在编译时赋初值一次,程序运
22、行后不再给变量赋初值。程序执行过程为:调用函数,m0,i2,ii+m+13,m8,返回 p8,再次调用函数,m8,i3,ii+m+112,m12+4+117,返回 p17,故 A选项正确。32.若有以下程序段: (分数:1.00)A.*strpB.strkC.strpkD.strp 解析:解析for 循环实现将每个字符串的旨地址赋给指针数组中每一个元素。strp 为指针数组首地址,不是字符串的引用。strk为第 k个字符串的地址,表示第 k个字符串的引用。strpk表示指针数组的第 k个元素,为第 k个字符串的地址,也是这个字符串的引用。*strp 取指针数组第一个元素,即为第一个字符数组的地
23、址,也即为第一个字符串的引用。故选择 D选项。33.有以下程序: (分数:1.00)A.12 B.13C.15D.11解析:解析带参数的宏的调用格式:宏名(实参表),替换过程是,用宏调用提供的实参字符串,直接置换宏定义命令行中相应形参字符串,非形参字符保持不变。将 PRINT(F(5)*2)用 PR(F(5)*2);putchar(n,)替换,将 PR(F(5)*2)用 printf(“d”,(int)(F(5)*2)替换,再将 F(5)用 284+5替换,最后替换结果为 Printf(“d”,(int)(284+5*2);putchar(n),运行结果为:12回车。放 A选项正确。34.以下
24、关于 fclose(fp)函数的叙述正确的是( )。(分数:1.00)A.当程序中对文件的所有写操作完成之后,必须调用 fclose(fp)函数关闭文件 B.当程序中对文件的所有写操作完成之后,不一定要调用 fclose(fp)函数关闭文件C.只有对文件进行输入操作之后,才需要调用 fclose(fp)函数关闭文件D.只有对文件进行输出操作之后,才能调用 fclose(fp)函数关闭文件解析:解析对一个文件操作完成后,要将该文件关闭,“关闭”就是使文件指针变量不再指向该文件。程序编写者应该在程序终止之前关闭所有文件,如果不关闭,文件将会丢失数据。因为,在向文件写数据时,是先将数据输出到缓冲区,
25、待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用 fclose函数关闭文件,可以避免这个问题,它先把缓冲区小的数据输出到磁盘文件,然后才释放文件指针变量。所以对文件的所有写操作完成之后必须要关闭文件,故 A选项正确,B 选项错误。只要对文件进行操作后,都要调用 fclose文件关闭文件,故 C、D 选项错误。35.若有以下定义和语句: (分数:1.00)A.(*p)n+B.p+-nC.p-n+D.(+p)-n 解析:解析定义指向结构体变量的指针 p,并将结构体数组首地址赋给 Po(+P)-n,p 指针白加一指向数组第二个元素,其成员 n6,D
26、选项正确。p+ -n,p 指向结构体数组第一个元素,其成员 n5。P-n+,p 指向结构体数组第一个元素,其成员 n5,由于+是后缀,先取值,所以表达式为 5,之后再白加一。(*p)n+,*p 为结构体数组第一个元素,其成员 n5,先取值,表达式为 5。故选 D36.标准库函数 fgets(s,n,f)的功能是( )。(分数:1.00)A.从文件 f中读取长度不超过 n-1的字符串存入指针 s所指的内存 B.从文件 f中读取长度为 n的字符串存入指针 s所指的内存C.从文件 f中读取 n个字符串存人指针 s所指的内存D.从文件 f中读取 n-1个字符串存人指针 s所指的内存解析:解析fgets
27、 函数功能是从 f所指文件中读人 n-1个字符放入 s为起始地址的空间内,并在尾端自动加一个结束标志“0”。同时将读写位置指针向前移动字符串长度个字节。在读出 n-1个字符之前,如遇到了换行符或 EOF,则读出结束,A 选项正确。B 选项中“读取长度为 n”错误。C 选项与 D选项中“读取 nn-1 个字符串”错误,读取的是 n-1个字符。故选 A。37.有以下程序: (分数:1.00)A.1 B.0C.2D.4解析:解析“”右移运算符每次右移一位等价于除 2,x36,执行 x2后,x9;“”逻辑与运算,先计算左表达式真假,若为假,不计算有表达式,整个逻辑表达式为假,若左表达式为真,再计算右表
28、达式,之后做逻辑与运算;x2 为真,A 的 ASCII码为 65,a 的 ASCII码为 97,ca为真,整个逻辑表达式(x2)(ca)为真,得 b1。故 A选项正确。38.有以下程序: (分数:1.00)A.printf(“cn“,stud1name1;B.printf(“cn“,stud3name3;C.printf(“cn“,stud2name2;D.printf(“cn“,stud0name3; 解析:解析stud0name3为数组 stud第一个元素的成员 name字符数组的第四个元素m。stud3name3为数组 stud第四个元素的成员 name字符数组的第四个元素 u。 stu
29、d2name2为数组 stud第三个元素的成员 name字符数组的第三个元素 u。stud1name1为数组 stud第二个元素的成员 name字符数组的第二个元素 u。故 D选项正确。39.有定义:int a64,b8;,则表达式(a&b)|(a&b)和(a|b)(a|b)的值分别为( )。(分数:1.00)A.1和 1 B.1和 0C.0和 1D.0和 0解析:解析常用的位运算符有:“”按位求反,“”右移,“”按位与,“”,按位异或,“|按位或。运算时,先将数值转化为二进制。逻辑或运算符“|”计算左表达式值,如果为真,则不计算右表达式,而整个表达式为真,若左表达式为假,再计算右表达式然后做
30、或运算。逻辑与运算符“”,计算左表达式值,如果为假则不计算右表达式,而整个表达式为假,若左表达式为真,再计算右表达式然后做与运算。a641000000B,b81000B,ab0 为假,ab 为真,(ab)|(ab)为真,值为 1。a|b1001000B 为真,a | b 为真,则(a|b)(a|b)为真,值为 1。故 A选项正确。40.有以下程序: (分数:1.00)A.21 B.6C.123456D.11解析:解析fopen 函数以一定方式打开指定文件,返回一个指向文件的文件指针。如果不能实现打开指定文件的操作,则返回一个空指针 NULL。facanf 函数从文本文件中按格式输入。fprin
31、tf 函数按照格式向文本文件中输出数据。文件定位函数 fseek,将指针由文件开头 0、当前位置 1、末尾 2移动指定字节。rewind函数功能使文件的位置指针返回到文件头。本例中,循环实现的功能是求数组的和。程序执行过程为:以激写方式建立一个新的文本文件 datadat,将 1写入文件;执行 for循环,将文件指针移到文件开头,将文件第一个数值 1赋给 k,再将指针移动到开头,向文件内输入 ai+k3。for 循环实现将a数组中元素累加,结果 21存放在文件中。调用 rewind将文件指针移动到开头,调用 fscanf函数从文件中读出数值赋予 k21,调用 fclose函数关闭文件,打印 k
32、值,故 A选项正确。二、程序填空题(总题数:1,分数:1.00)41.给定程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和 3门课的成绩。函数 fun的功能是将该学生的各科成绩都乘以一个系数 a。 请在程序的下画线处填入正确的内容井把下画线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构: 试题程序: (分数:1.00)填空项 1:_ (正确答案:-|_|-STU -|_|-scorei -|_|-&std)解析:考点分析 本题考查:数组变量赋值;函数实参定义。 解题思路 本题是利用结构体存储学生记录,对记录进行修改并由实参
33、ss返回。 填空 1:实参 ss是一个结构型指针变量,所以应填 STU。 填空 2:该学生的各科成绩都乘以一个系数 a,所以应填 scorei。 填空 3:函数的调用,由于函数定义时使用的指针结构型变量,所以应填std。三、程序修改题(总题数:1,分数:1.00)42.下列给定程序中,函数 fun的功能是:求 k!(k13),所求阶乘的值作为函数值返回。例如,若k10,则应输 出 3628800。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构! 试题程序: (分数:1.00)_正确答案:(if(k1)解析:考点分析 本题考查:i
34、f 语句,考生需要根据题意来确定 if语句是否是正确的,if 条件语句经常考,考生需掌握。 解题思路 语法错误,if 条件表达式应写在小括号内。四、程序设计题(总题数:1,分数:1.00)43.程序定义了 NN的二维数组,并在主函数中自动赋值。请编写函数 fun(int aN,int n),该函数的功能是:使数组左下半三角元素中的值乘以 n。例如,若 n的值为 3,a 数组中的值为: 则返回主程序后 a数组中的值应为: 注意:部分源程序给出如下。 清勿改动函数 ma5n和其他函数令的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: (分数:1.00)_正确答案:( )解析: 考点分析 本题的 fun的功能是使数组的左下半三角元素中的值乘以 n,因此本题需要使用双重for循环,for 循环需要注意的是: (1)循环初值,根据题意要求控制循环变量的取值范围; (2)循环条件,确定循环结束的条件,即当不满足条件时,结束循环。 解题思路 首先从数组中找出要被乘以 n的那部分元素,这一过程其实就是找出将被挑出的元素在原数组中的分布规律的过程。通过观察得出,要被处理的元素下标值的范围是每行中从第一个元素开始,直到列数等于该行行数时为止。找到这个规律后,依次从数组中取得符合要求的元素,然后乘以 n。