二级C考前复习试题答案.docx
- 文档编号:12265275
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:20
- 大小:32.67KB
二级C考前复习试题答案.docx
《二级C考前复习试题答案.docx》由会员分享,可在线阅读,更多相关《二级C考前复习试题答案.docx(20页珍藏版)》请在冰豆网上搜索。
二级C考前复习试题答案
全国计算机等级考试二级笔试考前模拟试卷
公共基础知识和C语言程序设计
参考答案及评析
一、选择题
(1)C
知识点:
算法复杂度的概念。
评析:
算法的复杂度主要包括时间复杂度和空间复杂度。
所谓算法的时间复杂度,是指执行算法所需要的计算工作量。
为了能够比较客观地反映出一个算法的效率,在度量一个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。
为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。
一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。
一个算法所占用的存储空间包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间。
(2)C
知识点:
线性结构与非线性结构的概念。
评析:
根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:
线性结构和非线性结构。
如果一个非空的数据满足下列两个条件:
一、有且只有一个根结点;二、每一个结点最多有一个前件,也最多有一个后件。
则称该数据结构为线性结构,否则就是非线性结构。
线性结构又称线性表。
线性表、栈和队列等数据结构所表达和处理的数据以线性结构为组织形式。
栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。
一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。
所以栈又称后进先出(LastInFirstOut)的线性表;队列可看作是插入在一端进行,删除在另一端进行的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。
在队列中,只能删除队头元素,队列的最后一个元素一定是最新入队的元素,因此队列又称先进先出(FirstInFirstOut)的线性表;而二叉树的数据结构是树型结构的,结构中数据元素之间存在着一个对多个的关系,因此它是一种非线性数据结构。
(3)B
知识点:
基本数据结构与算法:
完全二叉树的概念
评析:
所谓完全二叉树是指除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
具有n个结点的完全二叉树,其父结点数为int(n/2),而叶子结点数等于总结点数减去父结点数。
本题n=699,故父结点数等于int(699/2)=349,叶子结点数等于699-349=350。
(4)B
知识点:
基本数据结构与算法:
希尔排序法
评析:
希尔排序法的基本思想是:
将整个无序序列分割成若干小的子序列分别进行插入排序。
所以希尔排序法属于插入类排序,但它对简单插入排序做了很大的改进。
(5)A
知识点:
基本数据结构与算法:
线性单链表
评析:
头结点不仅标识了表中首结点的位置,而且根据单链表(包含头结点)的结构,只要掌握了表头,就能够访问整个链表,因此增加头结点目的是为了便于运算的实现。
(6)D
知识点:
软件工程的要素
评析:
软件工程包括3个要素,即方法、工具和过程。
(7)A
知识点:
数据流图的概念。
评析:
数据流图是描述数据处理过程的工具,是需求理解的逻辑模型的图形表示,它直接支持系统的功能建模。
数据流图从数据传递和加工的角度,来刻画数据流从输入到输出的移动变换过程。
数据流图中的主要图形元素与说明如下:
加工(转换):
输入数据经加工变换产生输出。
数据流:
沿箭头方向传送数据的通道,一般在旁边标注数据流名。
存储文件(数据源):
表示处理过程中存放各种数据的文件。
源和潭:
表示系统和环境的接口,属系统之外的实体。
(8)C
知识点:
关系代数的运算。
评析:
关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。
传统的集合运算是二运算,包括并、差、交、广义笛卡尔积四种运算;专门的关系运算包括选择、投影、连接、除等。
选择又称为限制,它是在关系R中选择满足给定条件的诸元素,记作:
бF(R)={t|t∈R∧F(t)=‘真’}
基中F表示选择条件,它是一个逻辑表达式,取逻辑值“真”或“假”。
它由下面的规则组成:
它可以具有αθβ的形式,其中α,β是域(变量)或常量,但α,β又不能同为常量,θ是比较符,它可以是<,>,≤,≥,=及≠。
αθβ叫基本逻辑条件。
(9)B
知识点:
数据库管理系统。
评析:
数据库管理系统(DatabaseManagementSystem,简称DBMS)是数据库的机构,它是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等。
数据库中的数据是具有海量级的数据,并且其结构复杂,因此需要提供管理工具。
数据库管理系统是数据库系统的核心,它主要有如下几方面的具体功能:
1、数据模式定义。
数据库管理系统负责为数据库构建模式,也就是为数据库构建其数据框架。
2、数据存取的物理构建。
数据库管理系统负责为数据模式的物理存取及构建提供有效的存取方法与手段。
3、数据操纵。
数据库管理系统为用户使用数据库中的数据提供方便,它一般提供查询、插入、修改以及删除数据的功能。
此外,它自身还具有做简单算术运算及统计的能力,而且还可以与某些过程性语言结合,使其具有强大的过程性操作能力。
4、数据的完整性、安全性定义与检查。
数据库中的数据具有内在语义上的关联性与一致性,它们构成了数据的完整性,数据的完整性是保证数据库中数据正确的必要条件,因此必须经常检查以维护数据的正确。
数据库中的数据具有共享性,而数据共享可能会引发数据的非法使用,因此必须要对数据正确使用作出必要的规定,并在使用时做检查,这就是数据的安全性。
数据完整性与安全性的维护是数据库管理系统的基本功能。
5、数据库的并发控制与故障恢复。
数据库是一个集成、共享的数据集合体,它能为多个应用程序服务,所以就存在着多个应用程序对数据库的并发操作。
在并发操作中如果不加控制和管理,多个应用程序间就会相互干扰,从而对数据库中的数据造成破坏。
因此,数据库管理系统必须对多个应用程序的并发操作做必要的控制以保证数据不受破坏,这就是数据库的并发控制。
数据库中的数据一旦遭受破坏,数据库管理系统必须有能力及时进行恢复,这就是数据库的故障恢复。
6、数据的服务。
数据库管理系统提供对数据库中数据的多种服务功能,如数据拷贝、转存、重组、性能监测、分析等。
(10)B
知识点:
关系的运算操作
评析:
关系数据库管理系统能实现的专门关系运算,包括选择运算、投影运算、连接运算。
(11)B
知识点:
C语言的结构。
评析:
高级语言编写的源程序必须经过编译程序编译转换成二进制的机器指令文件(目标文件为*.obj),再经过链接程序将.obj文件与C语言提供的库函数链接起来生成一个.exe的可执行文件,只有可执行文件方能被计算机执行。
由于C程序是模块化程序,一个C程序可以由若干个源程序文件(分别进行编译的文件模块)组成,一个源程序文件可以由若干个函数和预处理命令等组成,C语言中对源文件的编译是以函数为单位的,所以函数是可以进行单独编译的,但它不可以单独被执行。
(12)A
知识点:
赋值表达式。
评析:
C语言中,赋值语句具有其它高级语言的赋值语句的一切特点和功能。
但也有不同:
1)C语言中的赋值号“=”是一个运算符,在其他大多数语言中赋值号不是运算符。
2)关于“赋值表达式”这一概念,其它大多数高级语言并没有,但在C语言中必须区分:
例如:
i=i+1是一个表达式,而不是语句;i=i+1;是一个语句。
可以看到,一个表达式的最后加一个分号就成了一个语句。
由于赋值语句是由赋值表达式加分号构成,而赋值表达式是赋值运算符“=”将一个变量和一个表达式连接起来的式子,所以选项A、B均不是合法的赋值语句;选项C中,存在两种运算符:
逗号运算符和赋值运算符,其中赋值运算符的优先级高,逗号表达式“a=7+b,b++,a+7”的值就是表示式“a+7”的值,即选项C也就可以表示为:
a+7;。
由此可见,选项C也不是一个合法的赋值语句。
选项D是用逗号运算符连接的两个赋值语句。
因此符合题目要求的应该是选项D。
(13)C
知识点:
运算符及其运算对象。
评析:
算术取余运算符%只对整型数据进行运算,且运算结果的符号与%前数据的符号相同。
所以本题-19%4的值为-3。
(14)B
知识点:
C语言的标识符。
评析:
C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。
注意:
关键字不能作为标识符来使用,且C语言中大写字母和小写字母被认为是两个不同的字符。
本题①中的void和define都和C语言的关键字重名,不合法;
③中的A23由于其中空格并不能作为标识符的组成,所以不合法;
④中的2a是数字打头而且33#中的“#”并不能作为标识符的组成。
(15)A
知识点:
while循环语句。
评析:
乍一看,还以为程序要表达的意思是当k等于1的时候做k++,但是C语言里关系表达式的等于应该是"=="。
一个等于号表示赋值,即这里面重复的把1赋给k,自然表达式k=1的值总为1,while后面的表达式恒为真,则进入死循环。
(16)C
知识点:
赋值语句
评析:
本题在编译时将出现以下错误:
Statementmising;infunctionmain,这是因为在第三句的printf()函数后没有加上分号,在C语言中一定要在语句的末尾加上分号,否则编译不能通过。
(17)A
知识点:
格式输入函数scanf()的使用
评析:
scanf函数输入形式为:
scanf(格式控制,地址表列);
选项B中,p=(long*)malloc(8)是分配8个字节的long型存储单元,所以能通过scanf语句正确给输入项读入数据;
选项C中,p=&a,求出变量a的内存地址并赋给p;
选项D中,能正确给输入项读入数据;
而选项A中,选项A中将没有对指针p进行正确的初始化,它将p所指空间的内容赋值为a的地址。
所以,p记录的便是a的地址的地址,所以,选项A不能正确地读入数据。
(18)A
知识点:
逗号表达式
评析:
在(x,y)中的","是一个特殊的运算符,叫做逗号运算符,它的一般形式为:
表达式1,表达式2,求解过程为:
先求解表达式1,再求解表达式2,整个表达式的值是表达式2的值,(x,y)的值为200,所以输出结果为200。
(19)D
知识点:
C语言的数组定义与数组的初始化。
评析:
1、二维数组定义的一般形式为:
类型说明符数组名[常量表达式][常量表达式],显然选项A是正确的;
2、二维数组初始化方法:
a.分行给二维数组赋初值;b.可以将所有的数据写在一个花括弧内,按数组排列的顺序对各元素赋初值,例如:
选项B定义的是一个不确定行数但为3列的二维数组,它的行是在赋初值时确定的,把0,1,2分别赋给了b[0][0],b[0][1],b[0][2];c.可以对部分元素赋初值,例如:
选项C只对第0行的第0个元素赋初值为1,其余元素值自动为0。
另外,C中在对数组进行初始化时,如果对全部元素都赋初值(即提供全部初始数据),则定义数组时,第一维的长度可以不指定,但的不能省略第二维的长度,故选项D不正确。
(20)A
知识点:
数组元素的赋值。
评析:
本题a代表是数组a的首地址,则a+x是数组中第x个元素的地址,所以在四个选项中,选项B和C只能输入一个数据;选项D中,由于表达式为++i,输入的数据赋给的是从a[1]起的数组,从而不能给a[0]输入数据,所以不符合题意;选项A通过地址a+i输入数据,通过i++依次给数组元素a[0]-a[9]赋值。
(21)C
知识点:
指针数组的应用
评析:
根据C语言的语法规定可知,int(*ptr)[M]中的标识符ptr是一个指向具有M个整型元素的一维数组的指针。
(22)C
知识点:
strcpy()函数的应用
评析:
观察程序可以发现,除了str3其他的字符数组或字符指针都在声明时分配了内存空间,使用没有分配内存的指针是十分危险的,所以在给str3赋值之前必须为它分配内存,选项C中在没有为str3分配内存的情况下为其赋值必然是不正确。
(23)A
知识点:
函数的调用
评析:
这道题的求解方法比较简单,将i的值带入函数f(),可以发现在if判断语句中,第一次判断为假,而在else语句中的第二个判断亦为假,所以,c的值应当等于-1,最后打印结果为"-1"。
(24)C
知识点:
对C语言中宏定义的理解
评析:
分别把N,M的宏定义代入NUM的表达式中,可以得到NUM=(2+1+1)*2+1/2=8,for循环终止后,应当循环8次。
(25)D
知识点:
数组元素的引用
评析:
数值为4实际上就是a[3],而'd'的ASCII码和'a'的ASCII码刚好相差3,变量c的值为'a',所以'd'-c=3。
(26)C
知识点:
条件判断语句
评析:
由于条件(a
(27)D
知识点:
选择法的算法
评析:
函数fun用选择法选出了数组a中最小值的下标,变量p用于记录最小值数组的下标。
在for循环之前,p的初值被赋为0,也就是先假设a[0]为小的数组,然后通过for循环,找到比a[0]还小的数组值,将它的下标赋给p,即p=i,那么此时,a[p]为最小的数组值,接着再让a[p]与其它数组元素进行比较,直到比较完所有的数组元素,找出最小的数组元素下标p。
(28)B
知识点:
是do-while语句
评析:
此语句的一般形式为:
do语句
while(表达式)
其特点为:
先执行语句,后判断表达式。
它是这样执行的:
先执行一次指定的内嵌的语句,然后判别表达式,当表达式的值为非零("真")时,返回重新执行该语句,如此反复,直到表达式的值等于0为止,此时循环结束。
当n=-1时,s+=1,s=1;a=a-2=-1;a!
=n不成立,结束循环,此时s值为1,不符合题意;
当n=-3时,s+=1,s=1;a=a-2=-1;a!
=n成立,继续循环,s=s+1=2,a=a-2=-3;a!
=n不成立,此时s值为2,符合题意;
(29)D
评析:
printf函数按格式控制符的个数输出表列中对应的数据,若输出表列的个数大于格式控制符个数,则输出与格式控制符对应的输出表列的数据,输出表列中多的则省略;若格式控制符个数大于输出表列的个数,则输出与格式控制符对应的输出表列的数据,格式控制符多的部分输出的数据是随机的。
(30)C
评析:
函数func()的作用是返回两个形参的和,第一个形参是x、y分别自减和自增后的和,其中(x--,y++,x+y)是一个逗号表达式,它的值应该等于x+y,所以整个表达式(x--,y++,x+y)的值为13,而第二个形参的值为8(根据语法规则,应当先使用,后自增),所以func()的返回值为13+8=21。
(31)B
知识点:
函数的调用。
评析:
sub()函数的作用是将形参y和x的差赋给了z指向的那个内存地址,所以在sub(10,5,&a),10和5属于值传递,直接将数值10和5分别传递给了变量x和y,而对于a是属于地址传递,也就是a与z指向了同一个存储单元,在执行函数后,a的值随*z变化,但b,c值并不改变,所以此次函数被调用后,a的值为y-x=-5,同理可知,在sub(7,a,&b)后,b的值发生变化,其值为-5-7=-12,在sub(a,b,&c)后,c的值发生变化,其值为-12-(-5)=-7。
(32)B
知识点:
结构体变量的定义。
评析:
“structS{intg;charh;}”定义一个结构体类型,struct是关键字,S是结构体名(可以缺省),花括号里面的两个变量是结构体域(或结构体成员),用该结构体类型定义结构体变量格式为:
structS变量名表列。
在C语言中,可以用typedef声明新的类型名来代替已有的类型名,方法有四种:
先按定义变量的方法写出定义体;将变量名换成新类型名;在最前面加typedef;可以用新类型名去定义变量。
本题中的typedefstructS{intg;charh;}T;是将structS(结构体类型)声明为T型(即T型就是结构体类型structS),T是用户定义类型,可以用T定义结构体变量,选项A、C、D错误。
(33)B
知识点:
链表的应用。
评析:
一般要删除某个结点,分两种情况:
1、要删除的是第一个结点(p的值等于head的值,如上图所示),则应将p->next赋给head,这时head指向原来的第二个结点。
第一个结点仍存在,但它已与链表脱离,因为链表中没有一个结点或头指针指向它。
若要释放链表p所指向的内存区,则可用free函数,使这部分内存区能被其它变量使用。
2、如果要删除的不是第一个结点,则将q->next赋给p->next,p->next原来指向q指向的结点,现在p->next改为指向q->next所指向的结点,q所指向的结点不再是链表的一部分,若需要释放q所指向的内存区,同样可用free函数。
另外,C语言中,表示*p所指向的结构体变量中的成员有三种等价形式:
a.结构体变量.成员名;b.(*p).成员名;c.p->成员名;
本题考查了删除非第一个结点,所以将q->next赋给p->next,即(*p).next=(*q).next;,再用free(q);释放q结点所占的内存空间。
(34)A
知识点:
指针与数组的操作。
评析:
要解本题,需了解以下几点:
1、malloc函数
void*malloc(unsignedintsize)的作用是在内存动态存储区中分配一个长度为size的连续空间。
本题中“p=(int*)malloc(100);”分配了一个内存动态存储区中长度为100的存储空间,并将此存储区的起始地址返回给指针变量p。
2、本题“(*a)[3]”是在amovep函数参数中定义了一个指向一维数组的指针变量。
它表示a是一个指针变量,指向包含3个元素的一维数组。
(注意区别:
*a[3]是一个指针数组,表示每一个数组元素相当于一个指针变量)。
3、函数的调用
amovep(p,a,3);是将开辟的内存空间的首地址p传递给函数参数*p;将二给数组首地址a传递给指向一维数的指针变量;将二维数组行、列的长度3传递给整型变量n。
4、嵌套的for循环用于将二维数组的值赋给指针变量p所指向的存储单元。
由于数组在内存中是以行方式存储,即a[0][0]=1,a[0][1]=3,a[0][2]=5,a[1][0]=2…,且也是以行方式赋给指针变量p的,所以在内存区域中依次存放数如下:
135246,故p[2],p[5]分别为5,6。
(35)C
知识点:
文件结束符的返回值。
评析:
函数feof是用来判断文件是否已读到末尾,如果已读到末尾则返回非零值,否则返回0。
它属于文件状态函数,其它还有两个文件状态函数分别为:
ferror(),clearerr()函数。
ferror函数用于判断文件操作是否出错,若出错,则函数值为真,即非零值;否则为零。
clearerr使ferror和feof函数值置零。
(36)D
知识点:
函数的调用
评析:
将a,b代入函数得*&b=*&b+1=a+1=b,所以打印出第一个字母b;
a=a+1='A'+1='B',打印出第二个字符'B';
a='A',输出字母A;
b='a',输出字母a。
(37)C
知识点:
局部变量和全局变量
评析:
在一个函数的内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。
本题中的inta=5;只在{inta=5;s+=f(&a);}内有效。
在函数之外定义的变量称为外部变量,外部变量是全局变量。
全局变量可以为本文件中其它函数所共用。
它的有效范围为:
从定义变量的位置开始到本源文件结束。
本题的开头inta=2;即为全局变量,实际上起作用的也就是这个。
(38)B
知识点:
结构体的定义和引用
评析:
除了可以直接使用C提供的标准类型名(如int、char、float、double、long等)和自己定义的结构体、共用体、指针、枚举类型外,还可以用typedef定义新的类型名来代替已有的类型名。
如果在一个程序中,一个整型变量用来计数,可以:
typedefintCOUNT;
COUNTi,j;
即将变量i,j定义为COUNT类型,而COUNT等价于int,因此i,j是整型。
但在程序中将i、j定为COUNT类型,可以使人更一目了然地知道它们是用于计数的。
可以定义结构体类型:
typedefstruct
{intmonth;
intday;
intyear;
}DATE;
定义新类型名DATE,它代表上面定义的一个结构体类型。
这时就可以用DATE定义变量:
DATEbirthday;(不要写成structDATEbirthday;)
DATE*p;(p为指向此结构体类型数据的指针)
综上所述,结合本题可知,T是所定义的新的类型名,它代表上面定义的一个结构体类型。
这时就可以用T定义变量。
(39)D
知识点:
数组元素的引用
评析:
cp=c这个语句是将数组c的首行元素地址赋给了指针数组cp。
选项A,cp+1是指将数组c的首行地址加1,即为第二行地址;
选项B,*(cp+3)是地址,等于数组c的首地址加3的那个内存单元的内容,不是对数组元素的引用;
选项C,*(cp+1)+3是地址,等于数组c的首地址加1的那个内存单元中存放的值加3,不是对数组元素的引用。
(40)D
知识点:
文件的概念
评析:
C语言把文件看作一个字符(字节)的序列,即由一个一个字符(字节)数据顺序组成。
根据数据的组织形式,可分为ASCII码文件和二进制文件。
因此,一个C文件是一个字节流或二进制流。
它把数据看作是一连串的字符(字节)。
而不考虑记录的界限。
换句话说,C语言文件并不是由记录组成的。
二、填空题
(1)【1】中序
知识点:
二叉树的遍历
评析:
在先左后右的原则下,根据访问根结点的次序,二叉树的遍历可以分为三种:
前序遍历、中序遍历和后序遍历。
前序遍历是指在访问根结点、遍历左子树与遍历右子树这三者中,首先访问根结点,然后遍历左子树,最后遍历右子树;并且遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
中序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。
后序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历右子树,然后访问根结点,最后遍历左子树;并且遍历左、右子树时,仍然先遍历右子树,然后访问根结点,最后遍历左子树。
(2)【2】功能性
知识点:
程序设计方法与风格。
评析:
源程序文档化应考虑如下几点:
1、符号的命名:
符号名的命名应具有一定的实际含义,以便对程序功能的理解。
2、程序注释:
正确的注释能够帮助读者理解程序。
注释一般分为序言性注释和功能性注释。
序言性注释通常位于每个程序的开头部分,它给出程序的整体说明,主要描述内容可以包括:
程序标题、程序功能说明、主要算法、接口说明、程序位置、开发简历、程序设计者、复审者、复审日期、修改日期等。
功能性注释的位置一般嵌在源程序体中,主要描述其后的语句或程序做什么。
3、视觉组织:
为使程序的结构一目了然,可以在程序中利用空格、空行、缩进等技巧使程序层次清晰。
(3)【3】回溯法
知识点:
程序的调试
评析:
调试的关键在于推断程序内部的错误位置及原因。
其主要
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二级 考前 复习 试题答案
![提示](https://static.bdocx.com/images/bang_tan.gif)