计算机二级C语言笔试试题及答案公布.docx
《计算机二级C语言笔试试题及答案公布.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言笔试试题及答案公布.docx(13页珍藏版)》请在冰豆网上搜索。
计算机二级C语言笔试试题及答案公布
2010年9月计算机二级C语言笔试试题及答案公布(含解析)
一、选择题
(1)答案:
(C)解析:
算法的复杂度主要包括算法的时间复杂度和算法的空间复杂度。
所谓算法的时间复杂度是指执行算法所需要的计算工作量;算法的空间复杂度一般是指执行这个算法所需要的内存空间。
(2)答案:
(B)解析:
链式存储结构克服了顺序存储结构的缺点:
它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。
故链式存储结构下的线性表便于插入和删除操作。
(3)答案:
(B)解析:
栈操作原则上“后进先出”,栈底至栈顶依次存放元素A、B、C、D,则表明这4个元素中D是最后进栈,B、C处于中间,A最早进栈。
所以出栈时一定是先出D,再出C,最后出A。
(4)答案:
(A)解析:
从平均时间性能而言,快速排序最佳,其所需时间最少,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。
当序列中的记录基本有序或元素个数较少时,冒泡排序和简单选择排序为最佳排序方法,故本题答案应该为选项A)。
(5)答案:
(D)解析:
滥用GOTO语句将使程序流程无规律,可读性差,因此A)不选;注解行有利于对程序的理解,不应减少或取消,B)也不选;程序的长短要依照实际情况而论,而不是越短越好,C)也不选。
(6)答案:
(D)解析:
软件工程包括3个要素,即方法、工具和过程。
方法是完成软件工程项目的技术手段;工具支持软件的开发、管理、文档生成;过程支持软件开发的各个环节的控制、管理。
(7)答案:
(A)解析:
软件的白盒测试方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。
(8)答案:
(C)解析:
关系模型较之格式化模型(网状模型和层次模型)有以下方面的优点,即数据结构比较简单、具有很高的数据独立性、可以直接处理多对多的联系,以及有坚实的理论基础。
(9)答案:
(C)解析:
数据库(DataBase,简称DB)是数据的集合,它具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享。
数据库中的数据具有“集成”、“共享”之特点。
(10)答案:
(C)解析:
数据模型所描述的内容有3个部分,它们是数据结构、数据操作和数据约束。
其中,数据模型中的数据结构主要描述数据的类型、内容、性质,以及数据库的联系等;数据操作主要是描述在相应数据结构上的操作类型与操作方式。
(11)答案:
(B)解析:
C程序是由函数构成的。
一个C源程序至少包括一个main函数,也可以包含一个main函数和若干个其他函数。
因此,函数是C程序的基本单位,被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编制设计的函数。
(12)答案:
(C)解析:
在C语言中,实数有两种形式表示,即十进制数形式和指数形式,在指数形式中e3,2.1e3.5,.e3,e等都是不合法的指数形式。
再如123e3或123E3都代表123乘以10的3次方。
注意,字母e的前面必须有数字,且e的后面必须是整数。
(13)答案:
(B)解析:
t=1是将t赋值为1,所以循环控制表达式的值为1,而判断t是否等于1时的语句为t==1。
注意“=”与“==”的用法。
(14)答案:
(C)解析:
选项A)中,赋值表达式左边应该是一个变量,而“a+b=b++”中赋值号左边是一个表达式;选项B)中,取余运算符“%”两侧应都是整型数据,而“((int)a+b)”是float类型;选项C)中,“%”两侧都是整型数据,所以正确;选项D)最后有一个分号,所以不是表达式,而是一条语句。
(15)答案:
(C)解析:
由于在switch语句中,没有break语句,所以当变量i的值等于case后面的常量表达式的值时,将执行此case后面的所有switch语句。
(16)答案:
(B)解析:
本题中,“!
”表示逻辑非运算符,逻辑非运算符比等于运算符的优先级低。
(17)答案:
(C)解析:
选项A)中定义函数时,形参的类型说明应该放在形参表列内说明。
老版本C语言中,对形参类型的声明是放在函数定义的第2行,也就是不在第1行的括号内指定形参的类型,而在括号外单独指定。
选项B)中return后面的值可以是一个表达式。
选项D)中实参与形参的类型应相同或赋值兼容。
如果实参为整型而形参为实型,或者相反,则按不同类型数值的赋值规则进行转换,以形参类型为准。
(18)答案:
(D)解析:
C语言在函数中说明的变量为局部变量,只在函数内起作用但不会影响到其他函数。
所以在不同的函数中使用相同的函数名不代表是同一函数。
在函数定义时声明的参数只在函数内部起作用,是函数的局部变量。
在一个函数中定义的变量是这个函数的局部变量,所以只在这个函数内起作用。
复合语句中定义的变量其作用域是这个复合语句,不会扩大到整个函数。
(19)答案:
(A)解析:
该题是if语句的嵌套,else总是与它上面最近的if配对。
因为a《p》
(20)答案:
(D)解析:
本题考查数组指针的应用。
选项D)第一层括号中为数组a中第i项元素的值,外面再加指针运算符没有意义。
(21)答案:
(C)解析:
p=&a[3]将指针指向数组a的第4个元素,p[5]指向数组a的第9个元素,而a[8]=9,所以b=9。
(22)答案:
(D)解析:
定义一个结构的一般形式为:
struct结构名
{
成员列表
};
本题中,stutype是在声明类型的同时定义的structstu类型的变量,而不是用户定义的结构体类型名。
我们需要注意以下几点:
①类型与变量是不同的概念;②对结构体中的成员,可以单独使用,它的作用与地位相当于普通变量;③成员也可以是一个结构体变量;④成员名可以与程序中的变量名相同,二者不代表同一对象。
(23)答案:
(C)解析:
最初,指针变量p和q分别指向整型变量a和b,然后借助第三个指针变量r,使p和q的内容进行交换,此时p和q分别指向整型变量b和a,而变量a和b并没有进行交换。
(24)答案:
(C)解析:
inta,b,k=4,m=6,*p1=&k,*p2=&m;声明整型变量a,b,k,m和指针p1,p2,并分别将4和6赋给k和m,将k和m的地址赋给p1和p2;a=p1==&m;等价于a=(p1==&m);将p1是否等于地址m的值(0)赋给变量a,b=(*p1)/(*p2)+7;该句的含义是将后面表达式的的值7赋给变量b。
(25)答案:
(B)解析:
本题考查函数的递归调用。
fib(3)=fib
(2)+fib
(1),而fib
(2)的返回值为2,fib
(1)的返回值也为2,故输出的fib(3)的值为4。
26)答案:
(C)解析:
由于()优先级高于*,所以void*fun()说明了一个函数,该函数的返回值是无值型的指针类型,而void(*fun)()说明指针fun指向一个函数,该函数无返回值。
(27)答案:
(B)解析:
本题考查的函数形参与实参的传递规则,当形参与实参都是简单的数据类型时,形参值的改变不能影响实参值的改变,即本题中c的值未改变,仍然是6。
(28)答案:
(B)解析:
本题中,a[1][2]是二维数组中的第6个元素,对应for循环中i的值为5,p[5]=5+1。
(29)答案:
(C)解析:
fun()函数的功能是从数组的头尾开始,将第一个元素和最后一个元素对换,将第二个元素和倒数第二个元素对换,直到数组的中间。
调用fun函数后,再将对换了元素的数组依次输出。
(30)答案:
(B)解析:
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。
它的作用是将一个变量的地址传送到另一个函数中去。
在本题解析中,我们试图将这一问题解释清楚!
大家可以考虑一下利用下面这函数可不可以实现a和b的互换。
swap(intx,inty)
{intt;
t=x;
x=y;
y=t;
}
如果在main函数中用swap(a,b),会有什么结果呢?
在函数调用开始时,a的值传送给x,b的值传递给y。
执行完swap函数后,x和y的值是互换了,但main函数中的a和b并未互换。
也就是说由于“单向传递”的“值传递”方式,形参值的改变无法传递给实参。
为了使在函数中改变了的变量值能被main函数所用,不能采取上述把要改变值的变量作为参数的办法,而应该用指针变量做函数参数。
在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化被保留下来,这样就实现了调用函数改变变量的值,在主调函数中使用这些改变了的值的目的。
swap(int*p1,int*p2)
{intp;
p=*p1;
*p1=*p2;
*p2=p;
}
注意交换*p1和*p2的值是如何实现的,如果写成下面这样就有问题了!
swap(int*p1,int*p2)
{int*p;
*p=*p1;/*此语句有问题*/
*p1=*p2;
*p2=*p;
}
*p1就是a,是整型变量。
而*p是指针变量p所指向的变量,但p中并无确切地址,用*p可能会造成破坏系统的正常工作状态。
应该将*p1的值赋给一个整型变量,用整型变量作为过渡变量实现*p1和*p2的交换。
请注意,不能企图通过改变指针形参的值而使指针实参的值也改变
swap(int*p1,int*p2)
{int*p;
p=p1;
p1=p2;
p2=p;
}
程序的原意是交换两个指针的值。
但是C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。
指针变量做函数参数也要遵循这一规则。
调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值……
(31)答案:
(A)解析:
选项A),局部静态变量的存储空间在程序整个运行期间都不释放,所以比局部动态变量的生存期长。
选项B),全局变量说明为静态存储时,作用域不会扩大。
选项C),局部静态变量未赋初值时,系统编译时会自动赋初值0或空字符。
选项D),在未调用函数时,函数的形参不占内存的存储单元,只有调用时才动态分配存储空间,所以形参不能说明为静态存储,而局部变量可以说明为静态存储。
(32)答案:
(A)解析:
在解答本题时应该考虑两个问题:
结构体变量的长度及sizeof()求字节数的运算符。
结构体变量的长度是其内部成员总长度之和,本题中,structdate中包含year,month,day三个整型变量。
一个整型变量所占的字节数为2。
(33)答案:
(B)解析:
本题中a的值为6,b的值为8,最后s的值为8,s*=s等价于s=s*s。
(34)答案:
(D)解析:
在C语言中,逻辑运算符有4个,它们分别是!
(逻辑非)、||(逻辑或)、&&(逻辑与)、^(异或)。
在位运算里面还有&(位与)、|(位或)的运算。
本题考查逻辑与运算符的用法,在表达式x=(a&&b)&&(c《′B′);中,先判断a&&b条件,逻辑与条件的两边都要保证为1,即a和b都成立,当然c《′B′是成立的,显然,该表达式的值为1。
(35)答案:
(C)解析:
*p[3]是一个指针数组,它的3个元素都是指向整型数的指针。
p[0]存放的是a[1][0]的地址,则p[0]+1存放的是a[1][1]的地址,所以*(p[0]+1)代表的元素是a[1][1]。
(36)答案:
(D)解析:
带参数的宏定义如下:
#define宏名(参数)字符串。
本题中,宏定义的作用是指定用标识符PI来代替“3.1415926”这个字符串,但宏定义不是C语句,不必在行末加分号。
(37)答案:
(D)解析:
本题中需要填空的是for循环的第3个条件,即“若分成9个零件一组,则多5个零件”,当总零件数零减去5后,并与9取余为0即可满足本题的条件。
(38)答案:
(D)解析:
运算符“%”的两侧都应该是整型数。
另外,本题需要掌握的知识点是:
x%=k,等价于x=x%k。
(39)答案:
(D)解析:
这是一个给结构体数组赋初值的问题。
它的赋初值过程与上述二维数组赋初值很相似。
只是这里的大括号中的初始值没有按行给出(即没有用大括号分开),在这种情况下,初始值将按数组的各个元素在内存中的存放次序逐个逐个地赋给各元素。
现在结构体数组的各个元素在内存中的存放次序是这样的:
class[0].name,class[0].age,class[1].name,class[1].age.。
.,由此可以知道,包含字母′M′的字符串“Mary”赋值给了元素class[2].name,则与字符′M′先对应的表达式是class[2].name[0]。
(40)答案:
(A)解析:
函数strcpy的功能是字符串拷贝,用法char*strcpy(char*str1,char*str2),作用是将字符串2复制到字符串1中去。
二维数组可以看做是一种特殊的一维数组,它的元素又是一个一维数组。
本题把arr看做是一个一维数组,它有两个元素:
arr[0],arr[1],每个元素又是一个包含4个元素的一维数组。
(41)答案:
(B)解析:
在main函数中,对f
(1)和f
(2)的值进行了累加。
f
(1)=1
f
(2)=f
(1)+1=2
最后,j的值为1+2=3
(42)答案:
(A)解析:
程序实现的功能是对数组x的前四个元素按从大到小的顺序排列,后四个元素按从小到大的顺序排列,最后将数组x输出。
(43)答案:
(B)解析:
函数的调用其形参可以是指针。
(44)答案:
(C)解析:
C语言规定,在一个函数中调用另一个函数(即被调用函数)需要具备的条件有:
①首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。
②如果使用库函数,一般还应该在本文件开头用#include命令将函数调用有关库函数时所需要到的信息“包含”到本文件中来。
③如果使用自定义函数,而且该函数与调用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。
(45)答案:
(C)解析:
使用fprintf函数输出字符串到文件fp1时,将覆盖原文件中的内容。
(46)答案:
(B)解析:
该题目测试考生对宏替换的理解。
这是一种简单的情况:
不带参数的宏。
关键要注意在对2*M+1进行宏替换时,要将宏名M原封不动地代进去,得到NUM的形式为2*N+1+1(千万不要随意给N+1加上小括号,使NUM变为2*(N+1)+1,这就是宏名和变量名之间的区别),再将N代进去,得到NUM的值为6。
(47)答案:
(B)解析:
本题考查两个知识点:
自加自减运算符和do-while循环语句。
题中b-=a等价于b=b-a;a++的含义是在使用a之后,使a的值加1;b--的含义是在使用b之后,使b的值减1。
(48)答案:
(B)解析:
该题目测试考生对宏替换的理解。
这是一种简单的情况:
不带参数的宏。
关键要注意在对2*M+1进行宏替换时,要将宏名M原封不动地代进去,得到NUM的形式为2*N+1+1(千万不要随意给N+1加上小括号,使NUM变为2*(N+1)+1,这就是宏名和变量名之间的区别),在将N代进去,得到NUM的值为6。
(49)答案:
(B)解析:
在内存中,字符数据以ASCII码存储,它的存储形式就与整数的存储形式相类似。
C语言使字符型数据和整型数据之间可以通用。
也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算,在本题中,s++相当于s=s+1,即让s指向数组中的下一个元素。
(50)答案:
(D)解析:
该题中考查的是简单的单链表,下图就是赋完值后的示意图:
容易看到p-》num=10,而q-》next就是r,所以q-》next-》num=30,故答案为40。
pqr
10next
20
30
二、填空题
(1)【1】存储结构
解析:
数据的逻辑结构是指反映数据元素之间逻辑关系的数据结构;数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式。
在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后关系的信息。
(2)【2】前件
解析:
在树形结构中,每一个节点只有一个前件,称为父节点,没有前件的节点只有一个,称为树的根节点;每一个节点可以有多个后件,它们都称为该节点的子节点。
没有后件的节点称为叶子节点。
(3)【3】继承
解析:
类是面向对象语言中必备的程序语言结构,用来实现抽象数据类型。
类与类之间的继承关系实现了类之间的共享属性和操作,一个类可以在另一个已定义的类的基础上定义,这样使该类型继承了其父类的属性和方法,当然,也可以定义自己的属性和方法。
(4)【4】降低复杂性
解析:
模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程,由此分解来降低复杂性
(5)【5】关系模型
解析:
数据库管理系统是位于用户与操作系统之间的一层系统管理软件,是一种系统软件,是用户与数据库之间的一个标准接口。
其总是基于某种数据模型,可以分为层次模型、网状模型和关系模型。
(6)【6】28
解析:
a*=16+(b++)-(++c)等价于a=a*(16+(b++)-(++c)),b++的值为3,++c的值为5,请注意前缀++和后缀++的用法。
(7)【7】5
【8】4
解析:
语句if(!
(i%))printf(“\n”);是将每5个数输出一行,因为n的值为24,所以共输出5行,最后一行有4个数。
(8)【9】voidfun(doubleb[][22])或voidfun(doubleb[10][22])
解析:
本题中,为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。
这系统就保证不使函数带回任何值,二维数组的第一维可以省略。
(9)【10】252137
解析:
a,b,c分别为十进制数、八进制数和十六进制数,都以十进制形式输出,八进制25转换为十进制是2×8+5=21,十六进制25转换为十进制是2×16+5=37。
(10)【11】24
解析:
while语句的条件是i《7,并且p[i]要是奇数,如果满足该条件,则将元素累加到变量j中,然后将i++,取下一个元素再进行条件判断。
在数组p的元素中,p[0]和p[1]满足条件,而p[2]是偶数,不满足条件,则结束while语句,最后输出变量j。
(11)【12】21
解析:
本题是switch语句的嵌套,由于x=1,则从case1开始执行,内层switch语句中,由于y=0,则从case0开始执行,a自加后变为1,遇到break语句后跳出本层switch语句,再执行外层switch语句的case2,a再自加变为2,b自加变为1,最后跳出switch语句,并输出a和b。
(12)【13】10
解析:
该for语句以i为0,j为10初始化,循环条件是i《=j,每次循环后i增1、j减1,循环体是将i与j的和赋给k。
这样变量k将保存的是最后一次赋给它的值。
一次循环后i为1、j为9,二次循环后i为2、j为8,……,五次循环后i为5、j为5,继续第六次循环,将i与j的和10存于k后,i为6、j为4,结束循环。
所以循环执行后k为10。
(13)【14】7
解析:
本题综合考查带参数的宏以及三目运算符的计算方法,“?
”运算符是一个三目运算符,其一般形式是《表达式1》?
《表达式2》:
《表达式3》。
“?
”运算符的含义是先求表达式1的值,如果为真,则求表达式2的值并把它作为整个表达式的值;如果表达式1的值为假,则求表达式3的值并把它作为整个表达式的值。
注意,在本题中宏替换时可采用逐步求解,最终为7》6?
7:
6*10,即t=7》6?
7:
60,其值为t=7。
(14)【15】60
解析:
本题中,代码定义3行2列的2维数组a,定义指向两个元素的一维数组指针p,并让p指向两维数组a的首行。
则代码*(*(p+2)+1)中的p+2指向两维数组a的第三行a[2],*(p+2)指向a[2][0],*(p+2)+1指向a[2][1],*(*(p+2)+1)是引用a[2][1],其值是60。
(15)【16】100010
解析:
对于define宏定义语句,系统会在编译前进行替换。
i2=1000/f(N)
i2=1000/f(10)
i2=1000/(10*10)
i2=10
i1=1000/s(N)
i1=1000/s(10)
i1=1000/10*10
i1=1000
(16)【17】12
解析:
函数有一个形参num,循环前变量k置1,循环中,表达式num%10是取num的个位,将num的个位值累乘于k中,然后num除以10。
循环直至num为0结束,这是逐一求出num十进制表示的各位数字,并累乘于变量k的循环,函数最后返回k。
函数fun6的功能是求整数的各位数字的积。
所以程序输出12。
(17)【18】–1
【19】*sn
解析:
C语言中实参变量和形参变量的数据传递是单向的“值传递”方式。
指针变量作函数也要遵循这一规则。
调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。
(18)【20】*ss!
=′\0′
解析:
从字符串ss中找出子字符串的方法是:
从第1个字符开始,对字符串进行遍历;若ss串的当前字符等于t串的第1个字符,两字符串的指针自动加1,继续比较下一个字符;若比较至字符串的结尾,则跳出循环;若ss串的字符和c串的字符对应不同,继续对ss串的下一个字符进行处理。
本程序是采用逐一比较的方式找出出现的次数。
循环的作用是在串中从左到右逐一走动,if(*ss==c)的作用是进行判断是否相同,若与c相同则表示又出现一次。