二级C考前模拟试卷及答案详解
全国计算机等级考试二级笔试考前模拟试卷公共基础知识和C语言程序设计(考试时间90分钟,满分100分)一、选择题((1)—(10)、(21)—(40)每题2分,(11)—(20)每题1分,共70分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分。(1)算法的时间复杂度是指______。A)执行算法程序所需要的时间B)算法程序的长度C)算法执行过程中所需要的基本运算次数D)算法程序中的指令条数(2)以下数据结构属于非线性数据结构的是______。A)队列B)线性表C)二叉树D)栈(3)设一棵完全二叉树共有699个结点,则在该二叉树中的叶子结点数为______。A)349B)350C)255D)351(4)希尔排序法属于哪一种类型的排序法______。A)交换类排序法B)插入类排序法C)选择类排序法D)建堆排序法(5)在单链表中,增加头结点的目的是______。A)方便运算的实现B)使单链表至少有一个结点C)标识表结点中首结点的位置D)说明单链表是线性表的链式存储实现(6)下面不属于软件工程的3个要素的是______。A)工具B)过程C)方法D)环境(7)数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。下列图符名标识的图符不属于数据流图合法图符的是______。A)控制流B)加工C)数据存储D)源和潭(8)按条件F对关系R进行选择,其关系代数表达式为______。A)R|×|RB)R|×|RFC)бF(R)D)∏F(R)(9)数据库系统的核心是______。A)数据模型B)DBMSC)软件工具D)数据库(10)关系数据库管理系统能实现的专门关系运算包括______。A)排序、索引、统计B)选择、投影、连接C)关联、更新、排序D)显示、打印、制表n(11)下列叙述中正确的是______。A)C语言的源程序不必通过编译就可以直接运行B)C语言中的每条可执行语句最终都将被转换成二进制的机器指令C)C源程序经编译形成的二进制代码可以直接运行D)C语言中的函数不可以单独进行编译(12)下列语句中符合C语言语法的赋值语句是______。A)a=7+b+c=a+7B)a=a+7C)a=7+b,b++,a+7;D)a=7+b,c=a+7;(13)若有语句如下:inti=-19,j=i%4;printf(“%dn”,j);则输出结果是______。A)-4B)-4.30C)-3D)-3.00(14)请选出可用作C语言用户标识符的一组标识符______。①void②a3_b3③A23④2adefine_123_abcDOWORDIFmonth33#A)①B)②C)③D)④(15)有以下程序段intk=0;while(k=1)k++;while循环执行的次数是______。A)无限次B)有语法错,不能执行C)一次也不执行D)执行1次(16)请选出合法的C语言赋值语句______。A)a=b=58B)i++;C)a=58,b=58;D)k=int(a+b);(17)若有说明:long*p,a;则不能通过scanf语句正确给输入项读入数据的程序段是______。A)*p=&a;scanf("%ld",p);B)p=(long*)malloc(8);scanf("%ld",p);C)scanf("%ld",p=&a);D)scanf("%ld",&a);(18)若x和y都是int型变量,x=100、y=200,且有下面的程序片段printf("%d",(x,y));上面程序片段的输出结果是______。A)200B)100C)100200D)输入格式符不够,输出不确定的值(19)以下数组定义中不正确的是______。A)inta[2][3];B)intb[][3]={0,1,2};C)intc[100][100]={1};D)intd[3][]={{1,2},{1,2,3},{1,2,3,4}};(20)以下程序空格所填的内容要使得所有数组元素都能输入数据,则正确答案应为______。#include
main(){inta[10],i=0;nwhile(i<10)scanf("%d",______);::}A)a+(i++)B)&a[i+1]C)a+iD)&a[++i](21)设有说明int(*ptr)[M];,其中的标识符ptr是______。A)M个指向整型变量的指针B)指向M个整型变量的函数指针C)一个指向具有M个整型元素的一维数组的指针D)具有M个指针元素的一维指针数组,每个元素都只能指向整型变量(22)设有以下语句:charstr1[]="string",str2[8],*str3,*str4="string";则下列选项中,______不是对库函数strcpy的正确调用,此库函数用来复制字符串。A)strcpy(str1,"HELLO1");B)strcpy(str2,"HELLO2");C)strcpy(str3,"HELLO3");D)strcpy(str4,"HELLO4");(23)下面程序的输出结果是______。#includemain(){inti=2;printf("%d",f(i,i+1));}intf(inta,intb){intc;c=a;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}A)-1B)0C)1D)2(24)以下for语句构成的循环执行了______次。#include#defineN2#defineMN+1#defineNUM(M+1)*M/2main(){inti,n=0;for(i=1;i<=NUM;i++){n++;printf("%d",n);}printf("n");}A)5B)6C)8D)9(25)若有以下说明:inta[12]={1,2,3,4,5,6,7,8,9,10,11,12};charc='a',d,g;n则值为4的表达式是______。A)a[g-c]B)a[4]C)a['d'-'c']D)a['d'-c](26)有如下程序main(){inta=2,b=-1,c=2;if(amain(){inta=5,b=7,c=9;printf("%d,%d,",a,b,c);printf("%d,%d,%d",a,b);}上面程序的输出结果是______。A)5,7,9,5,7B)5,7,5,7C)5,7,不定,7,9D)5,7,5,7,不定(30)请读程序:#includefunc(inta,intb){nintc;c=a+b;returnc;}main(){intx=6,y=7,z=8,r;r=func((x--,y++,x+y),z--);printf("%dn",r);}上面程序的输出结果是______。A)11B)20C)21D)31(31)请选出以下程序的输出结果______。#includesub(x,y,z)intx,y,*z;{*z=y-x;}main(){inta,b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf("%d,%d,%dn",a,b,c);}A)5,2,3B)-5,-12,-7C)-5,-12,-17D)5,-2,-7(32)设有以下语句typedefstructS{intg;charh;}T;则下面叙述中正确的是______。A)可用S定义结构体变量B)可用T定义结构体变量C)S是struct类型的变量D)T是structS类型的变量(33)假定建立了以下链表结构,指针p、q分别指向如图所示的结点,则以下可以将q所指结点从链表中删除并释放该结点的语句组是______。A)free(q);p->next=q->next;,B)(*p).next=(*q).next;free(q);C)q=(*q).next;(*p).next=q;free(q);D)q=q->next;p->next=q;p=p->next;free(p);(34)以下程序输出正确的是______。amovep(int*p,int(*a)[3],intn){inti,j;for(i=0;i12?x+10:x=12?x=12:x=0;printf(“%dn”,y);}(8)设有以下定义和语句,则*(*(p+2)+1)的值为【8】。inta[3][2]={10,20,30,40,50,60},(*p)[2];p=a;(9)下面程序的输出是【9】。main(){intarr[10],i,k=0;for(i=0;i<10;i++)arr[i]=i;for(i=1;i<4;i++)k+=arr[i]+i;printf("%dn",k);}(10)若要使指针p指向一个double类型的动态存储单元,请填空。p=【10】malloc(sizeof(double));(11)下列程序的运行结果是【11】。main(){unionEXAMPLE{struct{intx;inty;}in;inta;intb;n}e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf("%d,%dn",e.in.x,e.in.y);}(12)在对文件进行操作的过程中,若要求文件的位置回到文件的开头,应当调用的函数是【12】函数。(13)以下程序运行后的输出结果是【13】。fun(intx){if(x/2>0)fun(x/2);printf("%d",x);}main(){fun(6);}(14)下面fun函数的功能是将形参x的值转换成二进制数,所得二进制数的每一位数放在数组中返回,二进制数的最低位放在下标为0的元素中,其它依此类推。请填空。fun(intx,intb[]){intk=0,r;do{r=x%【14】;b[k++]=r;x/=【15】;}while(x);}全国计算机等级考试二级笔试考前模拟试卷公共基础知识和C语言程序设计参考答案及评析一、选择题(1)C知识点:算法复杂度的概念。评析:算法的复杂度主要包括时间复杂度和空间复杂度。所谓算法的时间复杂度,是指执行算法所需要的计算工作量。为了能够比较客观地反映出一个算法的效率,在度量一个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。一个算法所占用的存储空间包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间。(2)Cn知识点:线性结构与非线性结构的概念。评析:根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构和非线性结构。如果一个非空的数据满足下列两个条件:一、有且只有一个根结点;二、每一个结点最多有一个前件,也最多有一个后件。则称该数据结构为线性结构,否则就是非线性结构。线性结构又称线性表。线性表、栈和队列等数据结构所表达和处理的数据以线性结构为组织形式。栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈又称后进先出(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)=‘真’}n基中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;是一个语句。可以看到,一个表达式的最后加一个分号就成了一个语句。n由于赋值语句是由赋值表达式加分号构成,而赋值表达式是赋值运算符“=”将一个变量和一个表达式连接起来的式子,所以选项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是正确的;n2、二维数组初始化方法: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知识点:条件判断语句评析:由于条件(anext赋给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函数nvoid*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;nintday;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】回溯法知识点:程序的调试评析:n调试的关键在于推断程序内部的错误位置及原因。其主要的调试方法有:强行排错法、回溯法和原因排除法。强行排错法:是传统的调试方法,其过程可概括为:设置断点、程序暂停、观察程序状态、继续运行程序。这是目前使用较多、效率较低的调试方法。回溯法:该方法适合于小规模程序的排错。即一旦发现了错误,先分析错误征兆,确定最先发现“症状”的位置。然后,从发现“症状”的地方开始,沿程序的控制流程,逆向跟踪源程序代码,直到找到错误根源或确定错误产生的原因。原因排除法:是通过演绎和归纳,以及二分法来实现的。(4)【4】数据存储知识点:数据库设计基础:数据字典的概念评析:数据字典是各类数据描述的集合,它通常包括5个部分,即数据项,是数据的最小单位;数据结构,是若干数据项有意义的集合;数据流,可以是数据项,也可以是数据结构,表示某一处理过程的输入或输出;数据存储,处理过程中存取的数据,常常是手工凭证、手工文档或计算机文件;处理过程。(5)【5】结构化设计知识点:数据库设计基础:数据库设计与管理评析:与结构化需求分析方法相对应的是结构化设计方法。结构化设计就是采用最佳的可能方法设计系统的各个组成部分以及各个成分之间的内部联系的技术。也就是说,结构化设计是这样一个过程,它决定用哪些方法把哪些部分联系起来,才能解决好某个具体且有清楚定义的问题。(6)【6】8评析:在一般16位PC机中,一个float型数据在内存中占4个字节(32位),一个double型数据占8个字节。(7)【7】12知识点:三目运算符的用法。评析:三目运算符的形式为:(表达式1)?(表达式2):(表达式3);1、条件运算符的执行顺序:先求解表达式1,若为非0(真),则求解表达式2的值,此时表达式2的值就作为整个表达式的值。若表达式1的值为0(假),则求解表达式3的值,表达式3的值就是整个条件表达式的值。2、条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给y。3、条件运算的结合方向为“自右至左”。如本题x>12?x+10:x=12?x=12:x=0;相当于x>12?x+10:(x=12?x=12:x=0);则执行结果为12。(8)【8】60知识点:指向多维数组的指针。评析:a是一个数组名,a数组包含3行,即3个元素:a[0],a[1],a[2]。而每一个元素又是一个一维数组,它包含2个元素,如a[0]所代表的一维数组包含的2个元素为:a[0][0],a[0][1]。所以a代表整个二维数组的首地址,也就是第0行的首地址。a+1代表第1行的首地址,因此a+1的含义是a[1]的地址。由于a[i]和*(a+i)等价,且本题中定义了一个一维数组指针p指向二维数组a的首行,所以*(p+2)的值是&a[2][0]。又因为*(p+2)+1的1代表1个列元素的字节数,即2个字节,所以*(p+2)+1的值是&a[2][1],*(*(p+2)+1)的值为a[2][1],即60。注:a[i]从形式一看是数组中第i个元素。如果a是一维数组名,则a[i]代表a数组第i个元素所占的内存单元。a[i]是有物理地址的,是占内存单元的。但如果a是二维数,则a[i]代表的是一维数组名。a[i]并不占用内存单元,它也不存放a数组中各元素的值。它只是一个地址(如同一个一维数组名x并不占内存单元而只代表地址一样)。a,a+i,a[i],*(a+i),*(a+i)+j,a[i]+j都是地址。*(a[i]+j),*(*(a+i)+j)是二给数组元素a[i][j]的值。(9)【9】12知识点:数组。n评析:本题通过第一个for循环将数组arr[0]-arr[9]分别赋值为0-9,通过第二个for循环的三次循环累加,求出结果为12,具体分析如下:i=1:k=0+arr[1]+1即k=2;i=2:k=2+arr[2]+2即k=6;i=3:k=6+arr[3]+3即k=12;(10)【10】(double*)知识点:处理动态表的函数。评析:malloc函数的原型为:void*malloc(unsignedintsize);其作用是在内存的动态存储区中分配一个长度为size的存储连续存储空间。此函数的值(即“返回值”)是一个指向分配域起始地址的指针(基类型为void*),所以若要使指针指向一个double类型,则必须进行类型转换,类型转换格式为:(数据类型*)。与处理动态链表相关的函数还包括:calloc和free函数。1、void*calloc(unsignedn,unsignedsize);其作用是在内存的动态区存储中分配n个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。2、voidfree(void*p);其作用是释放由p指向的内存区,使这部分内存区能被其它变量使用。此函数无返回值。(11)【11】4,8知识点:共用体。评析:共用体类型数据的特点:1、同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。也就是说,每一瞬时只有一个成员起作用,其他的成员不起作用,即不是同时都存在和起作用。2、共用体中起作用的成员是最一次存放的成员,在存入一个新的成员后原有的成员就失去作用。例如本题:在对共用体中的成员变量a赋值为1后(e.a=1;),又对成员变量b赋值为2(e.b=2;),根据以上规则,此时,成员变量a原有值就失去了作用,下次引用变量a时,它的值即为最近一次给共用体中任一成员变量所赋的值。所以执行语句e.in.x=e.a*e.b时,值为2*2=4。同理,执行语句e.in.y=e.a+e.b时,由于e.in.x和e.a、e.b占用的是同一段内存单元,所以此时的e.a、e.b的值为4,因此运算得出e.in.y的值为4+4=8。程序最后的打印结果为“4,8”。3、共用体变量的地址和它的各成员的地址都是同一地址。4、不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。(12)【12】rewind或fseek知识点:文件的定位。评析:在对文件进行操作的过程中,若要求文件的位置回到文件的开头,可以调用以下两个函数来完成:1、rewind函数;2、fseek函数;其中rewind函数的作用是将位置指针重新返回文件的开头,这个函数没有返回值;而fseek函数可以实现文件指针的定位,它的调用方式如下:fseek(文件类型,位移量,起始点),起始点用0、1、2表示,0表示“文件开始”,1表示“文件当前位置”,2表示“文件末尾”;“位移量”指以“起始点”为基点,向前移动的字节数。(13)【13】136知识点:递归运算评析:程序重点考察的是函数。在这里定义了一个fun函数,并进行了递归调用,函数里面又调用自己。程序在运行时,先把实参6传给形参。在if语句中判断条件符合后,又执行fun(x/2),即fun(3),同时输出x的值6,再判断if条件,仍然符合,再执行fun(x/2),即fun(1),同时输出x的值3,此时ifn条件不再成立了,输出1。而递归调用的输出是倒过来的。注意输出函数中%d后有空格。(14)【14】2【15】2知识点:do-while语句评析:形参x默认为十进制,要想将一个十进制的数转换成二进制,可以使用整除求余法,题中的程序段也暗示了将使用这种方法,将一个十进制的数转换成二进制要用这个十进制数不断的整除2,将每次的余数记录下来,直至无法再除,此时,整除得到的第一个元素即为二进制数的最低位,其余依次类推,所以在程序段中的两个横线处,都应当填写"2"。