全国计算机等考试二C语言真题 - 图文

更新时间:2024-03-23 16:33:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2008年09月二级C语言真题

一、选择题

下列各题A>、B>、C>、D>四个选项中,只有一个选项是下确的。 1. —个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈则元素出栈的顺序______。 A> 12345ABCDE B> EDCBA54321

C> ABCDE12345 D> 54321EDCBA B [知识点] 栈结构的存储方式 [评析] 栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。这表明栈的运算规则是“先进后出”(或称“后进先出”>。在栈顶进行插入运算,称为进栈(或入栈>,在栈顶进行删除运算,称为退栈(或出栈>。本题中,依次进栈,即依次插入元素1、2,3、4、5、A、B、C、D、E,依次出栈,即依次删除元素,根据栈“先进后出”的规则,应该以倒序出栈。即元素出栈顺序为EDCBA54321。 2. 下列叙述中正确的是______。 A> 循环队列中有队头和卧尾两个指针,因此,循环队列是非线牲结构 B> 在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况 C> 在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况 D> 循环队列中元素的个数是由队头指针和队尾指针共同决定

D [知识点] 循环队列 [评析] 所谓循环队列,就是将队列存储空间的最后一个位置绕到第1个位置,形成逻辑上的环状空间,供队列循环使用。所以循环队列还是属于线性结构,所以选项A是错误的。循环队列的头指针front指向队列的第一个元素的前一位置,队尾指针rear指向队列的最后一个元素,循环队列的动态变化需要头尾指针共同反映,所以选项B、C是错误的。循环队列的长度是:(sq.rear-sq.front+maxsize>%maxsize,所以循环队列的长度是由队头和队尾指针共同决定的,所以选项D正确。 3. 在长度为n的有序线性表中进行二分查找,最坏情况下需要比较的次数是 A> O(n> B> O(n2>

C> O(log2n> D> O(nlog2n>

C [知识点] 二分查找法的时间复杂度 [评析] 二分法检索要求线性表结点按关键值排序且以顺序方式存储。在查找时,首先与表的中间位置上结点的关键值比较,若相等则检索成功;否则根据比较结果确定下一步在表的前半部分或后半部分继续进行。二分法检索的效率比较高,设线性表有n个元素,则最多的检索次数为大于long2n(2为底数>的最小整数,最少的检索次数为1。 4. 下列叙述中正确的是______。 A> 顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 B> 顺序存储结构只针对线性结构,链式存储结构只针对非线性结构 C> 顺序存储结构能存储有序表,链式存储结构不能存储有序表 D> 链式存储结构比顺序存储结构节省存储空间

A [知识点] 顺序存储结构和链式存储结构 1 / 15

[评析] 顺序存储结构就是用一组地址连续的存储单元依次存储该线性表中的各个元素,链式存储结构中各数据结点的存储序号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致,所以选项A是正确的。两者都可以存储线性的、有序的逻辑结构,所以选项B、C不正确。顺序结构使用的是连续物理空间,链式结构可以使用零散的物理空间存储,链式结构更灵活,不存在谁节约空间的说法,所以选项D不正确。 5. 数据流图中带有箭头的线段表示的是______。 A> 控制流 B> 事件驱动

C> 模块调用 D> 数据流

D [知识点] 数据流图的表示 [评析] 数据流图是描述数据处理过程的工具,是需求理解的逻辑模型的图形表示,它直接支持系统的功能建模。数据流图从数据传递和加工的角度,来刻画数据流从输入到输出的移动变换过程。数据流图中的主要图形元素与说明如下: 加工(转换>:输入数据经加工变换产生输出。 数据流:沿箭头方向传送数据的通道,一般在旁边标注数据流名。 存储文件(数据源>:表示处理过程中存放各种数据的文件。 源,潭:表示系统和环境的接口,属系统之外的实体。 6. 在软件开发中,需求分析阶段可使用的工具是______。 A> N-S图

C> PAD图

B> DFD图

D> 程序流程图

B [知识点] 软件开发 [评析] 软件开发阶段包括需求分析、总体设计、详细设计、编码和测试5个阶段。其中需求分析阶段常用的工具是数据流图(简称DFD>和数据字典(简称DD>。常见的详细设计的图形描述工具主要有程序硫程图、N-S结构图、问题分析图(简称PAD图>。 7. 在面向对象方法中,不属于“对象”基本特点的是______。 A> 一致性 B> 分类性

C> 多态性 D> 标识唯一性

A [知识点] 面向对象方法的基本理论 [评析] 面向对象方法中最基本的概念是对象,它的基本特点有:标识唯—性、分类性、多态性、封装性和模块独立性好。 8. 一间宿舍可住多个学生,则实体宿舍和学生之间的联系是______。 A> 一对一 B> 一对多

C> 多对一 D> 多对多

B [知识点] E-R模型的基本概念 [评析] 两个实体间的联系可以归纳为3种类型: 一对一联系:一对一的联系表现为主表中的每一条记录只与相关表中的一条记录相关联。 一对多联系或多对一:一对多的联系表现为主表中的每一条记录与相关表中的多条记录相关联。 多对多联系:多对多的联系表现为一个表中的多个记录在相关表中同样有多个记录与其匹配。 2 / 15

一间宿舍可以住多个学生,但每个学生只能住一个宿舍,所以实体宿舍和学生之间的联系为一对多的联系。 9. 在数据管理技术发展的三个阶段中,数据共享最好的是______。 A> 人工管理阶段 B> 文件系统阶段

C> 数据库系统阶段 D> 三个阶段相同 C [知识点] 数据库管理技术的发展特点 [评析] 数据库管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。 人工管理阶段的特点:数据不保存、数据不独立、数据不能共享、数据无结构,没有专门的数据管理软件。 文件系统阶段的特点:数据可以长期保存,有专门的数据管理软件——文件系统。但是数据独立性低,共享性差、冗余度大,数据记录内有结构,整体无结构。 数据库系统阶段的特点:数据结构化,数据独立性高,数据共享性高,冗余度小,易于扩充,数据库管理系统提供统一的数控制功能,包括数据安全性、完整性、并发控制和数据恢复功能。 10. 有三个关系R、S和T如下:

算得到关系T,则所使用的运算为______。 A> 笛卡尔积

C> 并

由关系R和S通过运

B> 交

D> 自然连接

D [知识点] 关系代数运算 [评析] 笛卡尔积:设关系R和S的元数分别是r和s,定义R和S的笛卡尔积是一个(r+s>元元组集合,每一个元组的前r个分量来自R的一个元组,后s个分量来自S的一个元组。若R有k1个元组,s有k2个元组,则关系R和关系S的广义笛卡尔积有k1×k2个元组。 交:设关系R和关系S具有相同的目n,且相应的属性诹自同一个域,则关系R与关系S的交由属于R又属于S的所有元组组成。 并:设关系R和关系S具有相同的目n(即两个关系都有n个属性>,且相应的属性取自同一个域,则关系R与关系S的并由属于R或属于S的元组组成。 自然连接:是一种特殊的等值连接,它要求两个关系中进行比较的分量必须有相同的属性组,并且要将结果中重复的属性去掉。 11. 以下叙述中正确的是______。 A> C程序的基本组成单位是语句 B> C程序中的每行只能写一条语句 C> 简单C语句必须以分号结束 D> C语句必须在一行内写完

1C [评析] C程序是由函数构成的。—个C源程序至少包含—个main函数,也可以包含—个main函数和若干个其他函数。因此,函数是C程序的基本单位,故选项A错误;C程序书写格式自由,—行内可以写几个语句,—个语句可以分写在多行上,故选项B,D错误;C语言规定,每个语句和数据定义的最后必须有—个分号,分号是C语句的必要组成部分,故选项C正确。 12. 计算机能直接执行的程序是______。 A> 源程序 B> 目标程序

3 / 15

C> 汇编程序

D> 可执行程序

1D [评析] 我们把由高级语言编写的程序称为“源程序”,由二进制代码表示的程序称为“目标程序”,由汇编语言编写的程序称为“汇编程序”。对于计算机本身来说,它并不能直接识别由高级语言编写的程序,只能识别和执行由0和1组成的二进制指令。为了把源程序转换成机器能接受的目标程序,软件工作者编制了一系列软件,通过这些软件可以把用户按规定语法写出的语句——翻译成二进制的机器指令,这种具有翻译功能的软件称为“编译程序”。然后将编译后的目标程序与系统的函数库和其他目标程序连接起来,形成可执行程序由计算机直接执行。 13. 以下选项中不能作为C语言合法常量的是______。 A> 'cd' B> 0.1e+6

C> \ D> '\\011'

1A [评析] C语言时常量分为整型常量、实型常量和字符型常量。用单引号(即撇号>括起来一个字符称为字符常量,由于字符常量只能包含一个字符,因此选项A错误;转义字符常量是将反斜杠(\\>后面的字符转成另外的意义,选项D表示了—个ASCII码为011的八进制数;选项B是用指数形式表示的实型常量。用“e”或“E”后的—个整数表示以10为底的幂数,以这种形式表示的实型常量需注意字母e(或E>之前必须有数字,且e后面的指数必须为整数;用一对双引号括起来的字符序列称为字符串常量,选项C就为—个正确的字符串常量。 14. 以下选项中正确的定义语句是______。 A> double a。b。 B> double.a=b=7。

C> double a=7,b=7。 D> double,a,b。 1C [评析] C语言规定,每个语句和数据定义以分号结束,则说明选项A是两条语句,前—条是对变量a作双精度型定义的语句,而后一个“b。”是一个缺少类型的不正确的定义形式,如果是定义多个变量,则应用逗号隔开;当定义多个变量赋同—个值时,不能用等式连写的方式,如选项B的“double a=b=7。”应写成“double a=7,b=7。”所以选项B错误,选项C正确;在定义语句时,类型与变量名之间应用空格分隔,而不是逗号,所以选项D错误。 15. 以下不能正确表示代数式的C语言表达式是______。 A> 2*a*b/c/d B> a*b/c/d*2

C> a/c/d*b*2 D> 2*a*b/c*d 1D [评析] 本题考查的是算术运算符的优先级。算术运算符包括:+(加法运算符,或正值运算符>、-(减法运算符,或负值运算符>、*(乘法运算符>、/(除法运算符>、%(模运算符,或称求余运算符>,其中*、/两运算符的优先组相同,所以选项D错误,它表示的是2abd/c,而不是2ab/(cd>。 16. C源程序中不能表示的数制是______。 A> 二进制 B> 八进制

C> 十进制 D> 十六进制

1A [评析] C源程序中的整形常量可用三种形式表示:①十进制数;②八进制数:以0开头的数是八进制数;③十六进制数:以4 / 15

Ox开头的数是十六进制数。 17. 若有表达(W>?(--x>:(++y>,则其中与W等价的表达式是______。 A> w=1 B> w=0

C> w!=1 D> w!=0 1D [评析] 条件表达式的一般形式为:表达式1?表达式2:表达式3,其执行顺序:先求解表达式1,若非0(真>则求解表达式2,此时表达式2的值就作为整个条件表达式的值,若表达式1的值为0(假>,则求解表达式3,此时表达式3的值就作为整个条件表达式的值。本题中相当于先判断w的值是否为非0,所以与w等价的表达式是w!=0。 18. 执行以下程序段后,W的值为______。 int w='A',x=14,y=15 w=((x‖y>&&(w<'a'>>。 A> -1 B> NULL

C> 1 D> 0

1C [评析] 本题考查的是括号与逻辑运算符的混合运算,其运算优先级为先括号,后逻辑运算符。另外注意“&&”和“||”的“短路”运算。当运算符“&&”左边表达式的值为0时,则右边表达式就不再进行运算,整个表达式的值即为0;当运算符“||”左边表达式的值为非零时,则右边表达式就不再进行运算,整个表达式的值为1。本题先运算表达式“x||y”,由于x=14、y=15均为非零,所以x||y=1。则对于与运算符“&&”,还必须运算其右边的表达式“w<'a'”,由于A的 ASCII码是65,a的ASCII码是97,所以w<'a'的值为1,故整个表达式的值为1。 19. 若变量已正确定义为int型,要通过语句scanf(\;给a赋值1、给b赋值2、给c赋值3,以下输入形式中错误的是______。(Ц代表一个空格符> A> ЦЦЦ1,2,3<回车> B>1Ц2Ц3<回车> C> 1,ЦЦЦ2,ЦЦЦ3<回车> D>1,2,3<回车> 1B [评析] scanf(>函数的—般格式:scanf(格式控制,地址列表>。在输入多个数值数据时,若“格式控制”字符串中没有非格式字符作输入数据之间的间隔,则可用空格、TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据>时即认为该数据结束。如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。本题由于格式控制符中用了逗号,所以在输入数据时,必须在输入的各数据间用逗号分隔,故选项B不正确。 20. 有以下程序段 int a,b,c。 a=10。 b=50。 c=30。 if(a>b>a=b, b=c。 c=a。 printf(\b=%d c=%d\\n\。 程序的输出结果是______。 A> a=10 b=50 c=10 B> a=10 b=50 c=30

C> a=10 b=30 c=10 D> a=50 b=30 c=50

1A [评析] 本题if条件表达式“a>b”的值为0,所以不执行其后的if语句“a-b,b=c。”,直接执行下一条语句“c=a”,故c变量的值为10,所以输出结果为“a=10 b=50 c=10”。 21. 若有定义语句:int m[]={5,4,3,2,1},i=4。,则下面对m数组元素的引用中错误的是______。 A> m[-i] B> m[2*2]

C> m[m[0]] D> m[m[i]]

5 / 15

C [评析] 一维数组的定义方式为:类型说明符 数组名[常量表达式]。其中“常量表达式”表示元素的个数,即数组长度。元素的下标从0开始,最大下标是元素个数减一。本题定义了一个由5个元素(m[0[到m[4]>组成的数组。选项A表示对m[3]的引用;选项B表示对m[4]的引用;由于m[0]的值为5,所以选项C表示m[5],但由于m数组元素的最大下标为4,所以本引用下标越界;由于m[i]即m[4]的值为1,所以选项D表示对m[1]的引用。 22. 下面的函数调用语句中,func函数的实参个数是______。 func(f2(v1,v2>,(v3,v4,v5>,(v6,max(v7,v8>>>。 A> 3 B> 4

C> 5 D> 8

A [评析] 本调用语句func中包含了3个实参,一个是对f2函数调用“f2(v1,v2>”的返回值;另一个是逗号表达式“(v3,v4,v5>”的值v5(逗号表达式的一般形式为:表达式1,表达式2,表达式3......表达式n,它的值为表达式n的值>;还有—个实参也是逗号表达式“v6,max(v7,v8>”的值,即对max函数调用的返回值。 23. 若有定义语句:double x[5]={1.0,2.0,3.0,4.0,5.0},*p=x。则错误引用x数组元素的是______。 A> *p B> x[5]

C> *(p+1> D> *x

B [评析] 本题定义了一个有5个数组元素的—维数组x和指针变量p,且将x的首地址(即x[0]>的地址>赋给了指针变量p,即p指向了x数组的第0号元素,所以*p的值为x[0]的值,选项A的引用正确;由于p+1就是x[1]的地址,所以*(p+1>所指向的数组元素为x[1],故选项C的引用正确;由于x就是数组x的首地址,所以*x即对x[0]的引用,所以选项D引用正确;由于数组最大下标是元素个数减一,所以选项B的引用越界。 24. 若有定义语句:char s[10]=\。,则strlen(s>的值是______。 A>7 B>8

C>9 D>10

A [评析] strlen(字符数组>是测试字符串的长度的函数。函数的值为字符串的实际长度,不包括'\\0'在内。 C语言中字符串是以'\\0'字符结束的,且salen(>函数计算的是'\\0'字符前的所有字符的个数,所以本题strlen(s>的值是7。需要与其区分的是sizeof(>函数,它的功能是计算变量或数组所分配到的内存空间的大小。如果本题要求计算sizeof(s>的话,则其值应为10。 25. 以下叙述中错误的是______。 A> 用户定义的函数中可以没有return语句

B> 用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值 C> 用户定义的函数中若没有return语句,则应当定义函数为void类型 D> 函数的return语句中可以没有表达式 B [评析] 本题考查的是return语句。用户定义的函数中可以没有return语句,所以选项A正确;如果被调函数中没有return语句,并不带回—个确定的、用户所希望得到的函数值,但实际上,函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值,为了明确表示“不带回值”,可以用“void”定义“无类型”,这样,系统就保证不使函数带回任何值,所以选项C正确;当函数中不需要指明返回值时,可以写成“return”,所以选项D正确;一个函数中可以有—个以上的return语句,执行到哪一个return语句,哪一个语句起作用,即返回主函数,不再执行它下面的其他语句,所以选项B错误。 6 / 15

26. 以下关于宏的叙述中正确的是______。 A> 宏名必须用大写字母表示

B> 宏定义必须位于源程序中所有语句之前 C> 宏替换没有数据类型限制 D> 宏调用比函数调用耗费时间

C [评析] 宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定,也可用小写字母,所以选项A错误;宏命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束,通常,宏命令写在文件开头,函数之前,作为文件的一部分,在此文件范围内有效,而并不必须位于源程序中所有语句之前,所以选项B错误;用宏名代替—个字符串,也就是作简单的置换,宏置换不占运行时间,只占编译时间,而日编译时并不分配内存单元,也不进行值的传递处理。而函数调用则占运行时间(分配单元、保留现场、值传递、返回>,所以选项D错误;宏替换可以代替任何数据类型,不受数据类型的限制,所以选项C正确。 27. 有以下程序#include <stdio.h>main(>{ int i,j。 for(i=3。i>=-1。i-> { for(i=1。j<=2。j++> printf(\。 printf(\。 }} 程序的运行结果是______。 A> 234 345 B> 432 543

C> 23 34 45 D> 45 34 23 D [评析] 本题考查的是for循环的嵌套。外层循环变量i从3递减到1,内层循环变量j从1递增到2,具体运行过程如下: i-3:j=1,满足条件j<=2,输出i+j=3+1=4;j=2,满足条件j<=2,输出i+j=3+2=5;j=3,不满足条件j<=2,退出内层循环,执行“printf(\。”语句,换行。执行i--,此时i=2,满足条件i>=1; i=2:j=1,满足条件j<=2,输出i+j-2+1=3:j=2,满足条件j<=2,输出i+j=2+2=4;j=3,不满足条件j<=2,退出内层循环,执行“ptintf(\\\n\。”语句,换行。执行i-,此则i=1,满足条件i>=1; i=1:j=1,满足条件j<=2,输出i+j=1+1=2;j=2,满足条件j<=2,输出i+j=1+2=3;j=3,不满足条件j<=2,退出内层循环,执行“printf(\\\n\。”语句,换行。执行i--,此时i=0,不满足条件i>=1,结束外层循环。 28. 有以下程序 #include <stdio.h> mare(> { int x=1,y=2,z=3。 if(x>y> if(y<z>

printf(\。 else printf(\。 printf(\。 } 程序的运行结果是______。 A> 331 B> 41

C> 2 D> 1

D [评析] 本题考查的是if语句的嵌套。C语言规定else总是与它上面的最近的且不带else的if配对,所以本题else与if(y<y>的条件表达式x>y,即1>2,不成立,所以不执行内嵌if,直接执行“printf(\x++表示在使用后再29. 有以下程序 #include <stdio.h> main(> { int i=5。 do { if(i%3==1> if(i%5==2> { printf\。 while(i!=0>。 printf(\。 } 程序的运行结果是______。 A> *7 B> *3*5

C> *5 D> *2*6

A [评析] do-while语句的特点是先执行循环体,然后判断循环条件是否成立,当循环条件的值为0时循环结束。break的特7 / 15

点;当break出现在循环体中,则在执行break后,跳出本层循环体。本题执行过程如下: i=5:不满足条件i%3=1,执行i++,此叫i=6; i=6:不满足条件i%3=1,执行i++,此时i=7; i=7:满足条件i%3=1,执行内嵌if,判断条件i%5=2,满足,输出“*7”,执行break,跳出do循坏体,执行“printf(\\\n\。”,结束。 30. 有以下程序 #include <stdio.h> int fun(int a, int b> { if(b==0> return a。 else return(fun(-a,-b>>。 } main(> { printf(\。 } 程序的运行结果是______。 A> 1 B> 2

C> 3 D> 4

B [评析] 在调用一个函数的过程中又出现直接或间接调用该函数本身,称为函数的递归调用。本题考查的是函数递归调用。首先当a=4,b=2时,调用fun(4,2>,不满足条件b==0,继续调用fun函数;此时a=3,b=1,即调用fun(3,1>,不满足条件b=0,继续调用fun函数;此时a=2,b=0,满足条件b=0,返回a的值2。 31. 有以下程序 #include <stdio.h> #include <stdlib.h> int fun(int n> {int *p。 p=(int*>malloc(sizeof(int>>。 *p=n。 return *p。 } { int a。 a=fun(10>。 printf(\。 } 程序的运行结果是______。 A> 0 B> 10

C> 20 D> 出错

C [评析] malloc(sizeof(int>>的作用是开辟一个长度为sizeof(int>存储空间,并通过强制类型转换(int*>将此存储空间的地址赋给了—个整型的指针变量p。然后执行语句“*p=n”,使得*p的值为10,并通过返回此值,在主函数中输出a+10的值,即输出20。 32. 有以下程序 #include<stdio.h> void fun(int a, int b> {int t。 t=a。 a=b。 } int c[10]={1,2,3,4,5,6,7,8,9,0},i。 for(i=0。i<10。i+=2> fun(c[i],c[i+1]>。 for(i=0。i<10。i++>

printf(\。 printf(\。 } 程序的运行结果是______。 A> 1,2,3,4,5,6.7,8,9,0, B> 2,1.4.3.6,5.8,7,0,9,

C> 0,9,8,7,6,5,4,3,2,1, D> 0,1,2,3,4,5,6,7,8,9,

A [评析] 本题中c[i],c[i+1]的值是实参,a,b是形参。C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。所以函数run中对a,b值的交换不影响主函数中c数组的值,故输出的c数组的值为c数组初始化时的值。 33. 有以下程序 #include <stdio.h> struct st { int x,y。}

data[2]={1,10,2,20}。 main(> { struct st *p=data。 printf(\>y>。 printf(\>x>。 } 程序的运行结果是______。 A> 10,1 B> 20,1

C> 10,2 D> 20,2

8 / 15

C [评析] 本题定义了一个包含两个元素(data[0]、data[1]>的结构体数组data,其中data[0].x=1。data[0].y=10。data[1].x=2。 data[1].y=20。在主函数中,定义了一个指向结构体数组的结构体指针变量p,使得p指向结构体数组的首地址,所以p->y访问的是第一个鲒构体数组元素的第二个值,即data[0].y;(++p>->x访问的是第二个结构体数组元素的第一个值,即 data[1].x,所以程序输出结果为10,2。 34. 有以下程序 #include <stdio.h> void fun(int a[],int n> { int i,t。 for(i=0。i<n/2。i++> {t=a[i]。 a[i]=a[n-1-i]。 a[n-1-i]=t。} } main(> {int k[10]={1,2,3,4,5,6,7,8,9,10},i。 fun(k,5>。 for(i=2。i<8。i++> printf(\。 printf(\。 } 程序的运行结果是______。 A> 345678 B> 876543

C> 1098765 D> 321678

D [评析] 在主函数中,定义了一维数组k,并通过调用fun函数将形参数组a指向实参数组k所在的存储单元,这样,a和 k共用同一存储单元,所以对数组a的元素值的改变相当于对相应数组k的元素值的改变。在fun函数中,通过for循环对数组元素a[0]与a[4]、a[1]与a[3]的值分别作了交换,也即相当于主函数中k[0]与k[4]、k[1]与k[3]的值分别作了交换,此时k中各元素的值为5,4,3,2,1,6,7,8,9,10,故输出k[2]到k[7]的值为321678。 35. 有以下程序 #include <stdio.h> #define N 4 void fun(int a[][N],int b[]> { int i。 for(i=0。i<N。i++> b[i]=a[i][i]。 } main(> {int

x[][N]={{1,2,3},{4},{5,6,7,8},{9,10} },Y[N],i。 fun(x,y>。 for(i=0。i<N。i++> printf(\。 printf(\。 } 程序的运行结果是______。 A> 1,2,3,4, B> 1,0,7,0,

C> 1,4,5,9, D> 3,4,8,10,

B [评析] 在主函数中,定义并初始化了4行4列的二维数组x。对于二维数组元素的赋值,可以只对部分元素赋初值,未赋初值的元素自动取0。x数组元素赋初值后各元素为: fun函数的作用是将二维数组a中主对角线元素赋给数组b,由于数组a与数组x共用同一存储单元,也即将数组x中主对角线元素赋给了数组b。又因为数组b与数组y共用同一存储单元,所以主函数中通过语句“printf(\为数组b中的值,所以程序运行结果为“1,0,7,0,”。 36. 有以下程序 #include <stdio.h> int fun(int (*s>[4],int n,int k> {int m,i。 m=s[0][kl。 for(i=1。i<n。i++> if(s[i][k]>m> m=s[i][k]。 return m。 } main(> { int a[4][4]={{1,2,3,4},{11,12,13,14}, {21,22,23,24},

{31,32,33,34}}。 printf(\。 } 程序的运行结果是______。 A> 4 B> 34

C> 31 D> 32

C [评析] 在主函数中,定义并初始化了4行4列的二维数组a,并通过调用fun函数,将fun函数中指向一维数组的指针变量s指同一存储单元。在fun函数中,通过for循环,求得了数组a第0列中最大的值,并赋给m返回主函数。由于数组a第0列的值9 / 15

37. 有以下程序 #include <stdio.h> main(> { struct STU{char name[9]。char sex。double score[2]a={\。 b=a。 printf(\序的运行结果是______。 A> Qian,f,95,92 B> Qian,85,90

C> Zhao,f,95,92 D> Zhao,m,85,90 D [评析] 本题定义了两个结构体变量a和b,并将结构体变量a的内容赋给了结构体变量b。对于结构体的赋值,意味这将其中的每一个元素都进行赋值,所以输出的结构体变量b中的内容即为结构体变量a中的各项内容。另外本题需要注意的是输出格式的控制,其中“%2.0f”指的是输出的数据共占2列,其中有0位小数。 38. 假定已建立以下链表结构,且指针p和q已指向如图所示的结点: 则以下选项中司将q所指结点从链表中删除并释放该结点的语句组是______。 A> (*p>.next=(*q>.next。 free(p>。 B> p=q->next。 free(q>。 C> p=q。 free(q>。 D> p->next=q->next。 free(q>。

D [评析] 本题题面要求删除q所指结点并释放该结点,而选项A中虽然是删除了q所指鲒点,但并未释放q这个结点,而释放的是p结点,所以选项A错误;选项B是将q的下一结点的地址赋值给指针变量p,这意味着p原来的成员变量内容被q的下一结点的成员变量内容所代替,即原p结点也被删除了,所以选项B错误;选项C相当于将q的所有成员变量内容代替了p的所有成员变量内容,即p结点被删除,所以错误;选项D是将q的下—结点的地址赋值给p的成员next (成员next用于存放一结点的地址>,使得p的next成员不再指向q,而是指向q的下一结点,相当于删除了q这个结点,同叫用free函数正确释放了q这一结点,所以选项D正确。 39. 有以下程序 #include <stdio.h> main(> { char a=4。 printf(\<<1>。 } 程序的运行结果是______。 A> 40 B> 16

C> 8 D> 4 C [评析] “<<”是按位左移运算符,左移一位相当于该数乘以2,左移两位相当于该数乘以2的2次方,所以本题相当于将4乘40. 有以下程序 #include <stdio.h> main(> { FILE*pf, char *s1=\。 pf=fopen(\。 fwrite(s2,7,1,pf>。 文件位置指针回到文件开头*/ fwrite(s1,5,1,pf>。 fclose(pf>。 } 以上程______。 A> China B> Chinang

C> ChinaBeijing D> BeijingChina

B [评析] fwrite(buffer,size,count,fp>。:buffer是一个指针,用于指向输出数据存放的内存区域的起始地址,size是要输出的字节数,count是要输出大小为size个字节的数据块的个数。fp是文件指针。fwrite函数的功能是对中所指向的文件存入 count次,每次存放一个大小为size的数据块,将存入的数据块存到buffer指向的内存区,如果buffer内存区有数10 / 15

据,则将其覆盖。本题中第一次调用fwrite函数是向文件中写入s2的值“Beijing”,第二次调用fwrite函数是向文件中写入s1的值“China”,并将先前的“Beijing”的前几个字符覆盖,得到“Chinang”。 二、填空题 1. 对下列二叉树进行中序遍历的结果是 【1】 。

DBXEAYFZC [知识点] 二义树中序遍历 [评析] 二叉树的中序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且遍历左,右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。因此本题中序遍历的结果为DBXEAYFZC。 2. 按照软件测试的一般步骤,集成测试应在 【2】 测试之后进行。

单元或模块 [知识点] 软件测试的基本步骤 [评析] 软件测试的过程按照四个步骤进行,即单元测试、集成测试、验收测试(确认测试>和系测试。单元测试又称模块测试,所以本题中也可以填写模块测试。 3. 软件工程三要素包括方法、工具和过程,其中, 【3】 支持软件开发的各个环节的控制和管理。

过程 [知识点] 软件工程的三要素 [评析] 软件工程包括3个要素,即方法、工具和过程。方法是完成软件工程工程的技术手段;工具支持软件的开发、管理、文档生成;过程支持软件开发的各个环节的控制、管理。 4. 数据库设计包括概念设计、 【4】 和物理设计。

逻辑设计 [知识点] 数据库设计概述 [评析] 数据库设计目前一般采用生命周期法,即将整个数据库应用系统的开发分解成目标独立的若干个骱段。它们是:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计价段、编码阶段、测试阶段、运行阶段、进一步修改阶段。在数据库设计中采用上面几个价段中的前四个阶段。 5. 在二维表中,元组的 【5】 不能再分成更小的数据项。

分量 [知识点] 二锥表的性质 [评析] 二维表一般瞒足下面7个性质: 1、二维表中元组的个数是有限的——元组个数有限性。 11 / 15

2、二维表中元组均不相同——元组的唯一性。 3、二维表中元组的次序可以任意交换——元组的次序无关性。 4、二维表中元组的分量是不可分割的基本数据项——元组分量的原子性。 5、二维表中属性名各不相同——属性名唯一性。 6、二维表中属性与次序无关,可任意交换——属性的次序无关性。 7、二维表中属性的分量具有与该属性相同的值域——分量值域的同一性。 6. 设变量a和b已正确定义并赋初值。请写出与a=a+b等价的赋值表达式 【6】 。 a=-b [评析] a-=a+b相当于a=a-(a+b>,去掉括号,即相当于a=-b。 7. 若整型变量a和b中的值分别为7和9,要求按以下格式输出a和b的值: a=7 b=9

请完成输出语句:printf(\【7】 \。。

a=%d\\nb=%d\\n或a=%d\\nb=%d 评听:在printf的格式控制符中,一般由“%”和格式字符组成,如%d等,它的作用是将输出的数据转换为指定的格式输出,格式说明总是由“%”字符开始。%d代表以整型数据的实际长度输出。格式控制符中的其他字符按原样输出。另外如果要输出回车符,则必需用\\n这个转义字符,即表示输出时换行。 8. 以下程序的输出结果是 【8】 。 #include<stdio.h> main(>

{int i,j,sum。

for(i=3。i>=-1。i-> (sum=0。

for(j=1。j<=i。j++> sum+=i*j。 }

printf(\。 }

1 [评析] 本题考查的是for循环嵌套。外循环i变量从3递减到1,内循环变量j在每轮外循环的作用下从1递增到i,并在每轮外循环结束时,通过内循环求得sum的值,但由于外循环体的第一条语句是将变量sum初始化为0,所以每轮外循环结束时求得的sum值均被下一轮外循环执行时重新初始化为0,只有在最后一轮,当i=1时,内循环求得stan=1,跳出内循环,i的值减1变为0,不满足i>=1这个条件,结束外循环,此时输出sum的值为1。 9. 以下程序的输出结果是 【9】 。 #include <stdio.h> main(>

{ int j,a[]={1,3,5,7,9,11,13,15},*P=a+5。 for(j=3。 j。j-> { switch(i>

{ case 1:

case 2: printf(\。 break。 case 3: printf(\。 } } }

12 / 15

9911 [评析] switch语句的一般格式如下: switch(表达式> {case 常量表达式 1:语句1 case 常量表达式 2:语句2 … case 常量表达式 n:语句n default:语句n+1} switch语句在执行的先计算表达式的值,当表达式的值与某—个case后面的常量表达式的值相等时,就执行此case后面的语句系列。由于“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断,所以当根据switch后面表达式的值找到匹配的入口标号时,就从此标号开始执行下去,不再进行判断,直到在执行某个case分支后,遇到break语句才会跳出switch结构,即终止switch语句的执行。 本题定义并初始化了一个一维数组a,同时将指针变量p指向了a[5]的地址。在for循环中,首先j=3,执行case3后面的语句,由于--p是将p的地址前移一位,所以*(--p>的值为a[4]的值,即输出9;当j=2时,执行case2后面的语句。由于 *p++中++与*同优先级,结合方向为自右而左,因此它等价于*(p++>,作用是先得到p指向的变量的值(即*p>,然后再使p+1赋给p,所以j=2时先输出a[4]的值9,再使得p指向a[5]的地址;当j=1时,执行case1后面的语句,由于case1后面没有终业语句,所以继续执行case2后面的语句,此时*p的值即a[5]的值,所以输出11,然后p地址后移。故本程序的输出结果为9911。 10. 以下程序的输出结果是 【10】 。 #include <stdio.h> #define N 5

int fun(int *s,int a,int n> { int j。

*s=a j=n。

while(a!=s[j]> j-。 return j。 main(>

{ int s[N+1]。 int k:

for(k=1 。k<=N。k++> s[k]=k+1: print f(\。 }

3 [评析] 本题主函数中定义了一个一维数组s,并通过for循环给s[1]到s[5]的元素分别赋值为2、3、4、5、6。然后调用 fun函数,使指针变量s与数组s共用同一存储单元。在函数fun中,a=4,n=5,所以while的条件表达式首先判断的是 4!=s[5]是否成立,由于s[5]=6,所以成立,执行j-;接着判断4!=s[4]是否成立,由于s[4]=5,所以成立,执行j-;然后判断4!=s[3]是否成立,由于s[3]=4,所以条件表达式不成立,返回j的值3。 11. 以下程序的输出结果是 【11】 。 #include <stdio.h> int fun(int x>

{ static int t=0。 return(t+=x>。 }

main(>

int s,i。

for(i=1 。i<=5。i++> s=fun(i>。 printf(\。

13 / 15

15 [评析] static类型的变量是静态变量,本题中的静态变量t为静态局部变量。静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用时的值。本题在多次调用fun函数的过程中,只在第一次调用时t的初值为0,以后每次调用函数时不再重新赋初值,而只是保留上次函数调用结束时的值,所以本程序的作用相当于将1到5数字进行累加,故输出结果为15。 12. 以下程序按下现指定的数据给x数组的下三角置数,并按如下形式输出,请填空。 4 3 7

2 6 9 1 5 8 10 #include <stdio.h> main(>

{ int x[4][4],n=0,i,j。 for(j=0。j<4。j++>

for(i=3。i>j。 【12】 > {n++。x[i][j]= 【13】 :} for(i=0。i<4。i++>

{ for(j=0。j<=i。j++> printf(\。 printf(\。 } }

4[12] i- [13] n [评析] 观察本题下三角数据可以发现,其数值是先按行(从第3行到第0行>,然后按列(从第0列到第3列>对其进行1到10的赋值的,在程序的第—组嵌套for循环中,通过外循环来控制列的变化,从第0列到第3列,通过内循环来控制行的变化,从第3行到第j行,由于行变量i是从最大行逐渐递减的,所以本题第一空应填i-或与其等效的形式。在循环体中,用变量n来控制被赋的值1到10,所以本题第二个空应填n。 13. 以下程序的功能是:通过函数func输入字符并统计输入字符的个数。输入时用字符@作为输入结束标志。请填空。 #include <stdio.h>

long 【14】 。 /*函数说明语句*/ main(> { long n。

n=func(>。 printf(\。 }

long func(> { long m。

for( m=0。getchar(>!=@ 【15】 。 return m。 }

4[14] func(> [15] m++ [评析] 函数声明的格式为: 函数类型 函数名(参数类型1,参数类型2......> 函数类型 函数名(参数类型1,参数名1,参数类型2,参数名2......> 在函数声明时,应当保证函数原型与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序必须相14 / 15

同,所以本题第一空应填写“func(>”;由于本题程序功能是输入字符并统计输入字符的个数,且在函数func中通过for循环来接受输入的若干字符(函数getchar(>的作用是从终端输入一个字符,且只能接受一个字符>,并用m作为循环变量,最终将m的值作为函数返回值,故m是用来统计输入字符个数的变量,所以在for循环中,m的值应递增,即本题第二空应填“m++”或与其等效的形式。 申明:

所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。

15 / 15

本文来源:https://www.bwwdw.com/article/tpp8.html

Top