1、二级C语言真题2006年9月答案真题 120一、选择题 下列各题A、B、C、D 四个选项中,只有一个选项是正确的。第1题:参考答案:D答案解析:良好的程序设计风格可以使程序结构清晰合理,使程序代码便于维护,因此,程序设计风格对保证程序的质量很重要。主要应注意和考虑下述些因素:1、源程序要文挡化;2、数据说明的次序要规范化;3、语句的结构应该简单直接,不应该为提高效率而把语句复杂化,避免滥用goto语句。模块设计要保证低耦合、高内聚。第2题:参考答案:A答案解析:从工程管理角度看,软件设计分为两步完成:概要设计与详细设计。概要设计(义称结构设计)将软件需求转化为软件体系结构、确定系统级接口、全局
2、数据结构或数据库模式;详细设计确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。第3题:参考答案:C答案解析:软件生命周期分为软件定义、软件开发及软件维护。其中软件开发阶段的任务中软件设计阶段可分解成概要设计阶段和详细设计骱段;软件维护不属于软件开发阶段。第4题:参考答案:B答案解析:数据库管理系统的三级模式结构由外模式、模式和内模式组成。夕模式,或子模式,或用户模式,是指数据库用户所看到的数据结构,是用户看到的数据视图。模式,或逻辑模式,是数据库中对全体数据的逻辑结构和特性的描述,是所有用户所见到的数据视图的总和。外模式是模式的部分。内模式,或存储模式,或物理模式,是
3、指数据在数据库系统内的存储介质上的表示,即对数据的物理结构和存取力式的描述。第5题:参考答案:D答案解析:数据库设计方法和步骤:需求分析、概念设计、逻辑设计和物理设计的相关策略 评析:数据库设计以下6个设计阶段:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段、实施阶段及数据库运行和维护阶段。第6题:参考答案:C答案解析:从图中可以看出,关系T是关系R和关系S的简单扩充,而扩充的符号为,所以答案为T=RS。第7题:参考答案:D答案解析:算法的复杂度主要包括时间复杂度和空间复杂度:算法在运行过程中需辅助存储空间的大小称为算法的空间复杂度;算法的时间复杂度是指执行算法所需要的计算工作量,即算
4、法执行过程中所需要的基本运算次数,为了能够比较客观地反映出个算法的效率,在度量个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。第8题:参考答案:B答案解析:在进行顺序查找过程中,如果线性表中的第1个元素就是被查找元素,则只需做次比较就查找成功,查找效率最高;但如果被查找的元素是线性表中的最后个元素,或者被查找的元素根本就不在线性表中,则为了查找这个元素需要与线性表中所有的元素进行比较,这是顺序查找的最坏情况。所以对长度为n的线性表进行顺序查找,在最坏情况下
5、需要比较n次。第9题:参考答案:B答案解析:由于数据的集成性使得数据可为多个应用所共享,特SU是在网络发达的今天,数据库与网络的结合扩大了数据关系的应用范围。数据的共享本身又可极大地减少数据冗余性,不仅减少了不必要的存储空间,更为重要的是可以避免数据的不致性。因此,数据库设计的根本目标是要解决数据共享问题。第10题:参考答案:A答案解析:二叉树的中序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。第11题:参考答案:A答案解析:一个C语言程序可以实现多种算法。个C程序可以
6、由个或多个源程序文件组成,个源程序文件由个或多个函数组成,构成C语言程序的基本单位是函数,函数也是C程序中模块化程序设计的基础,C函数可分为标准库函数和用户定义函数两类。第12题:参考答案:D答案解析:每个C程序由多个C程序文件组成,而每个C程序都必须有一个main()函数,故每个C程序文件中都必须有个main()函数的说法是错误的。在C程序中所有函数都是平行的,即在定义函数时是相互独立的,个函数并不能从属于另个函数,即函数不能嵌套定义,函数间可以相互调用,但不能调用main()函数,main()函数的位置也不是固定的。第13题:参考答案:D答案解析:C语言中用来标识变量名、符号常量名、函数名
7、、数组名、类型名、文件名的有效字符序列称为标识符,C语言规定标识符能由字母、数字和下划线三种字符组成,且第个字符必须为字母或下划线。选项D中含有“$”,故不符合标识符的定义。第14题:参考答案:A答案解析:赋值表达式的左边不能为算式,故选项B、c错误;选项D为强制类型的转换,其书写形式为:(类型名)(表达式),即正确书写应为:(double)x/10或(double)(x/10);选项A为逗号表达式符合C语言语法。第15题:参考答案:D答案解析:逻辑运算符两侧的运算对象不但可以是0和1,也可以是任意基本类型或指针类型的数据,还可以是任意合法表达式。第16题:参考答案:C答案解析:“(x-y)?
8、(x):(y)”的求解顺序是:先判断x-y的值,如果为非0(真),则执行X,从而表达式返回X的值;如果0(假),则执行y,从而表达式返回y的值。相当于“或”的关系,所以选项C正确。第17题:参考答案:C答案解析:x:表示在使用x之后,使x的值加1;y:表示在使用y之后,使y的值加1;y:表示在使用y之前,使 y的值加1。此题中执行z=x,是将x的值先赋给z,所以z=1,接下来x自行加1,其结果为2:执行y后,y=2,执行后,y=3;故答案选C。第18题:参考答案:B答案解析:对于unsigned型数据可以指定数据的输入域宽w,系统秒将自动按w值截取所需长度的数据,此题中指定输入域宽为2,所以把
9、前两个数送给a,即a=87后面的数值应送给变量b,由于6后面是空格分隔符,所以系统认为该数据到此结束,即将6赋给了b,所以答案选B。第19题:参考答案:B答案解析:在C语言中,注释是用于协助读者更好地理解程序,它不会被系统编译执行,此题中第处的注释内容包括:“/*给a赋值 b=20; 给b赋值 */”,故本题中“b=20;”在程序中不起作用,所以输出语句执行的ab的值为100的值,即输出为“ab=10”。第20题:参考答案:C答案解析:在嵌套使用if语句时,C语言规定else总是和之前与其最近的且不带else的if配对。第21题:参考答案:D答案解析:在switch语句中,break语句主要起
10、到在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行,但最后个分支(default)可以不加break语句。第22题:参考答案:A答案解析:此题中首先给k赋初值5,执行while语句:中的表达式“-k”,k先自行减1结果为4,满足while执行条件输出:k=k-3=4-3=1;此时输出结果为1。返回执行while语句,重复上面的操作,while后的表达式为0,退出循环,所以最后的输出结果为1。第23题:参考答案:C答案解析:评析:在满足for语句条件下,第个if语句的条件是指i先对5取余后,再自行加1;第二个if语句的条件是指:i=i1后,再对8取余。设可以满足
11、第个if语句的值为:x,那么可以满足第二个if语句的值为:x2,转换为方程组: 第24题:参考答案:B答案解析:0代表ASC码为48的字符,0代表ASC码为0的字符,1代表ASC码为49的字符,所以只有选项B的表达式的值为1。第25题:参考答案:C答案解析:在fun(a,b,ab),c)中,先算括号内的(a,b,ab)逗号运算,即先算出a的值,a=2;再算出b的值,b=3;最后算出ab的值,ab=23=5,整个逗号表达式的值为最后ab的值即为5;接下来调用fun函数,此时原语句变为:smn=fun(5,C);进行运算,c表示在使用c以后再将c的值加1,所以结果为:53=8。第26题:参考答案:
12、D答案解析:此题中s是个字符数组,而字符数纽是在编绎时为它分配内存单元的,即此字符数组的地址在编译时是确定的,所以对此地址变量并不能赋值,故语句“s=2;”错误,故程序出错。第27题:参考答案:B答案解析:将j和m的值带入函数fun中,第次调用完fun()后,m和i的值分别为5和3且要保留,并在第二次调用时使用,这是因为两者都是局部静态变量。所以最后的结果是5和11。第28题:参考答案:C答案解析:函数fun是个递归调用函数,首先主函数将实参7传递给函数fun中的形参x,由于70,71,不满足if条件,所以执行下面的p=x-fun(x-2);语句,此语句继续调用它本身,直到当x=1时,返回函数
13、值3代入到调用它的表达式中,依此类推,最终p的值为2。第29题:参考答案:A答案解析:题目中p=&a表示指针p指向第个元素a0,执行p是指使p指向下个数据对象的地址,也就是向高地址移了个存储单元;因为int数据占两个字节,所以p相当于向高地址移了两个字节,所以选项A错误。第30题:参考答案:C答案解析:p1=&a表示指针变量p1指向元素1的地址;p2=&b表示指针变量p2指向元素3的地址;p=&c表示指针变量p指向元素5的地址;执行*p=*p1*(*p2)=1*3=3,所以最后的结果为:3。第31题:参考答案:B答案解析:选项A:*(*w3)=*(*(w0)3)=*(w03)=w03,符合数组
14、定义的范围可以正确表示数据元素。 选项B:*(w1)4=*(*(w+1)4=*w5=w50,超出了数据定义的范围。 选项C:*(*(w1)=*w1=w10,符合数组定义的范围可以正确表示数据元素。 选项D:*(&w001);=*(w01)w01,符合数组定义的范围可以正确表示数据元素。第32题:参考答案:D答案解析:函数声明可以照写已定义的函数的首部,再加一个号就成为了对函数的声明,在函数声明中也可以不写形参名,而只写形参的类型,但要保证与函数首部写法上的致,即函数类型、函数名、参数个数、参数类型和参数顺序相同。字符数组可用指针来表示,所以选顶D正确。第33题:参考答案:B答案解析:*pk3:
15、由于比 * 优先级高,因此p先与3结合,形成p3数组,有3个元素。然后再与p前面的“*”结合,“*”表示此数组是指针类型的,每个数组元素(相当于个指针变量)都可以指向个整型变量。第34题:参考答案:A答案解析:本题考点为数组名作函数参数,当n=O时,把x0的地址传绐被调函数change,即将形参k与实参x指向同一个存储单元x0,执行被调函数后,k0=6,即x0=6:当n=1时,形参k指向x数组的第1个数组元素所在单元,即 k0与x1共用同一存储单元,执行被调函数后,k0=7,即x1=7,依次类推得出x0到x4的值分别为6、7、8、 9、10。第35题:参考答案:D答案解析:维数组的定义方式为:
16、类型说明符 数组名常量表达式;常量表达式表示元素的个数,即数组的长度。常量表达式可以包括常量和符号常量,但不能包含变量。所以选项D错误。第36题:参考答案:B答案解析:此题中“scanf(%d,xi);”相当于“scarf(%d,xi0);”。输入246,执行for语句也就是x00=2, x10=4,x20=6,其余的数组元素为0:所以x00=2,x01=0,x10=4。第37题:参考答案:B答案解析:此题中先定义一个指针变量ps,并将s的首地址赋给此指针变量,*ps4相当于先从指针变量ps指向的地址中取出相应数据“a”后,对此数据加4,a的ASC码为32,324=36,对应于字符e,所以答案
17、选B。第38题:参考答案:A答案解析:此题需要了解字符数组和字符指针变量的区别,字符数组由若干个元素组成,每个元素中放一下字符,而字符指针变量中放的是地址(字符串的首地址),决不是将字符串放到指针变量中,选项D是指在定义字符指针变量时让字符指针指向字符串“right?”的首地址;选项C是先定义字符指针数组,再让指针数纽指向字符串right?的首地址;选项B是在定义数组时将字符赋给数组,而选项A的这种先定义,再用赋值语句赋值的形式是错误的,因为数组可以在变量定义时整体赋初值,而不能在赋值语句中整体赋值。第39题:参考答案:D答案解析:选项A中x4是取字符e,也就是将字符复制到y中,strcpy实
18、现的是地址的复制所以选项A错误;选项B中y是错误的,不允许对常量进行自加运算(y是个确定的地址值),所以选项B错误;选项C指针变量s指向了y向后的第5位,则存放x时会出现越界问题,所以选项C错误;选项D中,指针变量s指向了y向后的第位,此时s可存放数据的长度为9,而地址“x1”起的字符串的地址长度也刚好为9(包括“0”),所以开始复制不会出现地址越界问题,故选项D正确。第40题:参考答案:C答案解析:此题定义了指向函数的指针变量f指向了函数add的入口地址,所以,要调用函数,可以通过函数名(选项B的形式)或函数指针变量(选项A、D的形式)调用即可,而选项C中是先进行函数调用,然后对调用后返回的
19、整型值求其指针值,事实上,对常量求指针值是不合理的,所以选项C错误。第41题:参考答案:C答案解析:main()可以带有参数,并且参数只能有两个,第一个参数(argc)类型为整型用来记下命令行的参数个数,第二个参数(argv)为个字符型指针数组,其各个元素用来记下命令行各参数字符串的首地址。此题执行时,argc的值为4,在循环中依次使用strlen()函数求出argv(1)、argv(2)、argv(3)指向的字符串(123、45、67)的长度并把他们加到变量n中,得到n的值为7。第42题:参考答案:A答案解析:本题主要是要区分全局变量和局部变量,全局变量是指在函数之外定义的变量,它的有效范围
20、是从定义变量的位置开始到本源文件结束,函数fun1中用的变量a、b就是全局变量,虽然在定义时给a、b分别赋值为A、B,但在fun1函数中对其值进行了改变,所以调用fun1后输出的a、b的值为C和D;而fun2中输出的是两个局部形参变量a、b的值,这两变量的值由主函数在调用时赋给它,故输出结果为:E、F。第43题:参考答案:B答案解析:在编译时预处理程序用“替换文本”来替换宏,并用对应的实参来替换“替换文本”。此题中的替换文本分别为: N1、(x*M)。引用带参的宏名i1=f(2),在经过宏替换后i1=2N1=251=11(注:因为对宏M的替换中N1没有加括号,所以对宏f(x)的替换文本展开后就
21、变为:x*N1形式);与上相同i2在引用带参的宏名并替换展开后变为: i2=11*N1=11*51=7,所以答案选B。第44题:参考答案:D答案解析:此题中说明了个结构体类型struct TT的同时,定义了一个结构体变量CIN,结构体变量中的各成员在内存中按说明中的顺序依次排序。第45题:参考答案:D答案解析:要给结构体成员输入数据,在scanf语句中需要使用结构体成员的地址。函数scanf是C语言的标准输入函数,其作用是在终端设备上输入数据,而且要求输入项必须是某个存储地址。选项A中是引用结构体数组s的第0个元素s0的name成员,name是包含10个元素的数组,数组名就表示数组的地址,也就
22、代表s0.name的地址,所以选项A是正确的。选项B显然也是正确的,选项C是先用指针变量引用结构体的成员sex后取它的地址,也是正确的。选项D用指针变量引用结构体的成员sex后没有再继续取其地址,所以是错误的。第46题:参考答案:B答案解析:本题定义了共用体变量x及整型变量y,需要说明的是共用体变量不能直接引用,而只能用共用体变量中的成员,故选项A、C、D均错误。第47题:参考答案:A答案解析:根据语句q=s得知指针q指向结点a;由s=s-next;p=s得知指针p和s均指向接点b;在满足while语句的情况下,抽行p=p-next;得知p现在指向结点c;由p-next=q得知p指向的结点是a
23、,a移到c的后面;由q-next=NULL得知结点a与结点b的指针断开。移动后的结构图如图所示: 第48题:参考答案:B答案解析:“”是位异或运算符,s=32=s32=3232,异或运算的规则是:参与运算数中的相应位上的二进制位上,若数相同,则该位上的结果为0,数不同则结果为1。此题中是两个相同的数字进行异或其结果为0。第49题:参考答案:D答案解析:C语言中,有两种对文件的存取方式:顺序存取和直接存取,所以选项A错误;在对文件进行读、写操作前,先要使用库函数fopen“打开”文件来实现程序中要读、写的文件与实际数据文件间的联系。在进行打开文件操作时可以指定其打开方式,如果使用“r”方式则在写
24、新数据时,只覆盖新数据所占的空间,其后的老数据并不丢失,所以选项B错误;在对文件进行操作后关闭文件是为了防止文件缓冲区中的剩余数据的丢失,所以选项D正确。第50题:参考答案:C答案解析:此题考核的是文件的读写,定义个FILE类型结构体的指针fp,以“可以由位置函数设置读和写”方式打开一个 abc.dat文件,并向文件输入数组变量ch指向的字符串,则文件内的内容为“abcd”,执行fseek函数,则文件类型指针fp指向文件尾向前移动2个字节的位置处,即指针指向“b”,所以最后的输出结果为b,答案选C。二、填空题第51题:参考答案:3详细解答:软件系统结构图的宽度:整体控制跨度(最大模块数的层)的
25、表示。第52题:参考答案:程序调试详细解答:程序调试的任务是诊断和改正程序中的错误。它与软件测试不同,软件测试是尽可能多地发现软件中的错误。先要发现软件的错误,然后借助于一定的调试工具去找出软件错误的具体位置。软件测试贯穿整个软件生命期,调试主要在开发阶段。第53题:参考答案:元组详细解答:设计数据库的目的实质上是设计出满足实际应用需求的实际关系模型;关系中的行称为元组,对应存储文件中的记录,关系中的列称为属性,对应存储文件中的字段。第54题:参考答案:栈详细解答:栈和队列都是种特殊的操作受限的线性表,只允许在端点处进行插入和删除。二者的区别是:栈只允许在表的端进行插入或删除操作,是种“先进后
26、出”的线性表;而队列只允许在表的端进行插入操作,在另端进行删除操作,是种“先进先出”的线性表。第55题:参考答案:线性结构详细解答:与栈类似,队列也是线性表,也町以采用链式存储结构。第56题:参考答案:123.460000详细解答:输出语句的表达式:(int)(x*1000.5)/100.0是指先运算表达式中的“x*1000.5”,然后将其结果强制转换为int型,即:(int)(l23.4567*100O.5)=(int)12346.17=12346,接下来进行”/100.0”的运算即:12346/100.0=123.46,原因是除运算是双目运算,当边是整型数,边是实型数时,系统自动将整型转换
27、为实型数,然后进行运算,又因为最后的的输出格式是float类型的实数,所以结果为123.460000。第57题:参考答案:10 11详细解答:此题中定义两个变量m和n,首先将一个八进制数赋给m,十进制数赋给n;在输出之前先进行运算,n:是指在输出变量m前先对其进行加1,(011)8l=(9)101=10;n:是指在进行输出操作后n再进行加1操作,所以输出时 n=11。“%d %d”表示输出的是两个带符号的十进制整型数,所以最后的输出结果为:10 11。第58题:参考答案:1详细解答:条件运算符优先于赋值运算,但低于逻辑运算、关系运算、算术运算。条件运算的一般形式为(表达式1)?(表达式2):(
28、表达式3),当(表达式1)值为真时,(表达式2)的值为整个表达式的值;当(表达式1)的值为假时,(表达式3)的值为整个表达式的值。题中执行表达式“x=(ab)?a:b”后,x=1;再执行表达式“x=(xc)?x:c”后,x=1,将此值代入后个表达式“x=(dx)?x:d”,由于“dx”值为真,故x的值为1。第59题:参考答案:1 1详细解答:此题中定义两个变量a和b并通过scanf语句对其进行赋值,当满足“a!=b”循环条件时进行其下的条件的判断,直到最外层的条件不再被满足后进行数据的输出。自先给a和b分别赋值18和11。条件:18!=11,所以执行其下的条件判断“ab”条件满足,a=a-b=
29、18-7=7,然后继续判断条件ab是否成立,此时711不成立,退出内循环中的第一个while循环,执行内循环的第二个while循环,比较其条件ba是否成立,此条件成立,所以b=b-a=4,继续判决条件 ba是否成立,若成立,则继续执行b-=a;,否则退出内循环的第二个while循环,同时继续比较外循环条件a!=b是否成立,依此类推,直到a=1,b=1条件不再被满足后进行数据的输出,所以最后的结果为:1 1。第60题:参考答案:n/=10或n=n/10或n=(n-s)/10或n=(n-n%10)/10详细解答:根据s=n%10可知:此操作可以将输入的数据n的最后位赋给s,根据题目的要求是要将输入
30、的数据逆序输出,现在已经将原数据的个位输出,在其后如果执行n/=10司将原数据的个位数去掉,满足do.while的条件继续s=n%10操作,此时可求出十位上的数进行输出,继续执行n/=10操作,与上相同最后将百位上的数进行输出,所以该题答案为: n/=10。第61题:参考答案:(x+8) sin(x)详细解答:第62题:参考答案:j1 i%2或i%2=1详细解答:根据题意i用于行判断,变量j和k是进行同行中前后列的判断,所以k=j1,题目要求隔行按升序或降序来排序,所以可以使用行下标来判断排序效果,aijaik表示当同行中前面的数据大于后面的数据时进行数据交换,题目要求偶数行的数据是按声许升序
31、排列,所以要想执行此操作必须要条件表达式中的表达式1为假,所以此处答案为:i%2或i%2=1。第63题:参考答案:s-1 *s+详细解答:复制字符串就是将t串中的字符逐个放到s所指的对应单元中(包括0),题目中定义两个指针指向对应的存储单元。while(*s=*t)实现将t中的字符串第一次复制到s中,但在字符串的复制中其结束符“0”同样被复制到s中,根据最后s所指字符串为:efghefdl的结果可以得出需要将结束符去掉,所以使用“s=s-1”来将指针指向字符h,接下来进行二次复制,和第一次复制一样,通过指针的自增来进行字符的顺序复制,所以第二个空应该填*s+。第64题:参考答案:18详细解答:
32、实参中aa2是指将数组元素3的地址传递绐形参a,应当注意点,用数纽名作函数实参时,不是把数组的值传给形参,而是把实参数组的地址传绐形参数组,两个数组共用一段内存单元。所以a=3,4,5,6,7,8,9,10),n=4,a0=3。形参中a1表示数组元素4的地址传递绐形参a,所以a0f(a1,n-1)=3f(a1),3),此时a=4,5,6,7,8,9,10),n=3,a0=4。n=3同样满足n1的条件a0f(a1,n-1)=4f(a1,2)此时a=5,67,8,9,10,n=2, a0=5。n=2同样满足n1的条件a0f(a1,n-1)=5f(a1,2)此时a=6,7,8,9,10,n=1,a0
33、=6。n=1不再满足条件返回a0=6, 6543=18,所以最后的结果为18。第65题:参考答案:16 11详细解答:在编译时预处理程序用“替换文本”来替换宏,并用刘应的实参来替换“替换文本”。此题中的替换文本分别为:x*N、(x)*M。弓,用带参的宏名i=f(11),在经过宏替换后将成为:i=(11)*M=2*8=16。与上相同j在引用带参的宏名并替换展开后变为;j=11*N=11*10=11(注:因为在对宏f2(x)的替换中x没有加括号,所以对宏f2(x)的替换文本展开后就变为:11*N形式),所以答案为16 11。第66题:参考答案:-next-data详细解答:指针处理链表 评析:自定
34、义结构体类型名为Node,并定义指向结点类型的指针*p,*q,*r。它们共有两个成员:成员data是整型,成员 next是指针类型,题目要求求结点数值域的和,也就是求p-dataq-datar-data的值,p-data表示取p所指结点的值, p-next-data表示取q指针所指结点中的值,现在p所指结点和q所指结点的值已经取到,就差r所指结点中的值,题目中已知r-next指向的是p-data,如果想得到r指针所指结点的值需要将最后的指针指向r-data,所以答案为 -next-data。第67题:参考答案:rb详细解答:fopen函数的一般调用形式为:fopen(文件名,文件使用方式)。根据题意是为读文件而打开一个名为“d1.dat”二进制文件,所以文件使用方式为:rb。更多试卷请见麦多课文库