当前位置:首页 >> 其它考试 >>

计算机二级常考选择题及答案


计算机二级选择题答案 考点1答案:数据结构与算法
(1)B)【解析】算法的时间复杂度是指算法在计算机内执行时所需时间的度量;与时间复杂度类似, 空间复杂度是指算法在计算机内执行时所需存储空间的度量。因此,选项B)的说法是正确的。 (2)D)【解析】时间复杂度是指一个算法执行时间的相对度量;空间复杂度是指算法在运行过程中 临时占用所需存储空间大小的度量。人们都希望选择一个既省存储空间、又省执行时间的算法。然而,有 时为了加快算法的运行速度,不得不增加空间开销;有时为了能有效地存储算法和数据,又不得不牺牲运 行时间。时间和空间的效率往往是一对矛盾体,很难做到两全。但是,这不适用于所有的情况,也就是说 时间复杂度和空间复杂度之间虽然经常矛盾,但是二者不存在必然的联系。因此,选项A)、B)、C)的说 法都是错误的。故本题的正确答案是D)。 (3)C)【解析】数据处理的最小单位是数据项;由若干数据项组成数据元素;数据是指能够被计算 机识别、存储和加工处理的信息载体;数据结构是指数据之间的相互关系和数据运算。 (4)D)【解析】一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结 构有顺序、链接、索引等。而采用不同的存储结构,其数据处理的效率是不同的。故本题答案为D)。 (5)C)【解析】数据结构概念一般包括数据的逻辑结构、存储结构及数据上的运算集合等。数据的 逻辑结构只抽象地反映数据元素之间的逻辑关系,而不管它在计算机中的存储形式。 (6)A)【解析】数据结构作为计算机的一门学科,主要研究和讨论以下三个方面的问题:① 数据集 合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构;② 在对数据进行处理时,各数据元素在计算 机中的存储关系,即数据的存储结构;③ 对各种数据结构进行的运算。 (7)A)【解析】根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大 类型:线性结构与非线性结构。 如果一个非空的数据结构满足下列两个条件:① 有且只有一个根结点;② 每一个结点最多有一个前 件,也最多有一个后件。则称该数据结构为线性结构,又称线性表。 所以线性表、栈与队列、线性链表都是线性结构,而二叉树是非线性结构。 (8)D)【解析】线性表可以为空表;第一个元素没有直接前件,最后一个元素没有直接后件;线性 表的定义中,元素的排列并没有规定大小顺序。 (9)A)【解析】如果一个非空的数据结构满足下列两个条件:第一,有且只有一个根结点;第二, 每一个结点最多有一个前件,也最多有一个后件,则称该数据结构为线性结构。线性结构又称线性表。 (10)B)【解析】顺序存储结构中,数据元素存放在一组地址连续的存储单元中,每个数据元素地址 可通过公式LOC(ai)=LOC(a1)+(i-1)L计算得到,从而实现了随机存取。对于链式存储结构,要对某结点进行 存取,都得从链的头指针指向的结点开始,这是一种顺序存取的存储结构。 (11)D)【解析】栈是限定在一端进行插入与删除的线性表。 栈是按照“先进后出”的或“后进先出”的原则组织数据的,因此,栈也被称为“先进后出”表或“后 进先出”表。 (12)B) 【解析】本题考查的是栈。栈是一种特殊的线性表,线性表可以顺序存储,也可以链式存储, 而栈是一种线性表,也可以采用链式存储结构。故本题答案为B)。 (13)B)【解析】本题主要考查对于栈的理解。栈是限定在一端进行插入与删除的线性表。在栈中, 允许插入与删除的一端称为栈顶,而不允许插入与删除的另一端称为栈底。栈顶元素总是最后被插入的元 素,从而也是最先能被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素, 即栈是按照“先进后出”或“后进先出”的原则组织数据的。 (14)A)【解析】和线性表类似,栈也有两种存储方法,一是顺序栈,二是链式栈。栈的顺序存储结

构是利用一组地址连续的存储单元一次存储自栈底到栈顶的数据元素, 同时附设指针top指示栈顶元素的位 置,由于栈的操作是线性表操作的特例,相对而言,链式栈的操作更易于实现。 (15)B)【解析】由栈“后进先出”的特点可知:A)中e1不可能比e2先出,C)中e1不可能比e2先出, D)中栈是先进后出的,所以不可能是任意顺序。B)中出栈过程如下图所示:

(16)B)【解析】栈操作原则上“后进先出”,栈底至栈顶依次存放元素A、B、C、D,则表明这4个 元素中D是最后进栈,B、C处于中间,A最早进栈,所以出栈时一定是先出D,再出C,最后出A。 (17)C)【解析】队列是一种操作受限的线性表。它只允许在线性表的一端进行插入操作,另一端进 行删除操作。其中,允许插入的一端称为队尾(rear),允许删除的一端称为队首(front)。队列具有先 进先出的特点,它是按“先进先出”的原则组织数据的。 (18)C)【解析】考查栈和队列概念的掌握。栈和队列都是一种特殊的操作受限的线性表,只允许在 端点处进行插入和删除。二者的区别是:栈只允许在表的一端进行插入或删除操作,是一种“后进先出” 的线性表;而队列只允许在表的一端进行插入操作,在另一端进行删除操作,是一种“先进先出”的线性 表。 (19)A)【解析】本题考查的是线性单链表、双向链表与循环链表的结构及其基本运算。在链式存储 结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不 一致,而数据元素之间的逻辑关系是由指针域来确定的。 故本题答案为A)。 (20)A)【解析】链式存储结构克服了顺序存储结构的缺点:它的结点空间可以动态申请和释放;它 的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。故链式存储结构下的线性表便于插入 和删除操作。本题答案为A)。 (21)A)【解析】将题中所述的树用图形表示即可得到叶子结点的数目,另外还可用公式n0<=1n2+2n3+3n4+?
+1来计算,其中n0表示叶子结点;1n2中的n2

表示度为2的结点。此题中度为1的结点有4个;度为2的结点有2个;度为3的结点有1

个;度为4的结点有1个,计算过程如下: n0=1n2+2n3+3n4+?+1 n0=1×2+2×1+3×1+1 n0=8 (22)D)【解析】具有3个结点的二叉树有以下的几种形态:

(23)D)【解析】本题考查了二叉树的基本概念。在二叉树中,叶子节点的度是1;当该二叉树为空 树时,根节点的度为0;为非空树时,根节点的度最大为2。 (24)B)【解析】本题考查二叉树的遍历。所谓二叉树的前序遍历(DLR)是指在访问根结点、遍历左 子树与遍历右子树这3者中,首先访问根结点,然后遍历左子树,最后遍历右子树,并且,在遍历左右子树 时,上述规则同样适用,即“根→左→右”,故该二叉树的前序遍历结果为“ATBZXCYP”。 (25)D)【解析】前序遍历的第一个结点a为树的根结点;中序遍历中a的左边的结点为a的左子树,a 右边的结点为a的右子树;再分别对a的左右子树进行上述两步处理,直到每个结点都找到正确的位置。 (26)B)【解析】对有序线性表进行顺序查找,首先用被查找的数据和线性表的第一个数据元素进行

比较,若相等,则查找成功;否则,继续进行比较,即和线性表的第二个数据元素进行比较。同样,若相 等,则查找成功;否则,继续进行比较。依次类推,直到在线性表中查找到该数据或查找到线性表的最后 一个元素,算法才结束。因此,在长度为64的有序线性表中进行顺序查找,最坏的情况下需要比较64次。 (27)A)【解析】二分法查找只适用于顺序存储的有序表。在此所说的有序表是指线性表中的元素按 值非递减排列(即从小到大,但允许相邻元素值相等)的。选项A)正确。 (28)A)【解析】从平均时间性能而言,快速排序最佳,其所需时间最少,但快速排序在最坏情况下 的时间性能不如堆排序和归并排序。当序列中的记录基本有序或元素个数较少时,冒泡排序和简单选择排 序为最佳排序方法。

考点2答案:程序设计基础
(1)D)【解析】结构化程序设计方法的主要原则是:自顶向下,逐步求精,模块化,限制使用goto 语句。可复用性是指软件元素不加修改和稍加修改可在不同的软件开发过程中重复使用的性质。软件可复 用性是软件工程追求的目标之一,是提高软件生产效率的最主要方法。面向对象的程序设计具有可复用性 的优点。 (2)D)【解析】滥用goto 语句将使程序流程无规律,可读性差,因此A)不选;注解行有利于对程 序的理解,不应减少或取消,B)也不选;程序的长短要依照实际情况而论,而不是越短越好,C)也不选。 (3)B)【解析】本题考查了程序的基本结构。程序由一些基本结构组成。任何一个大型的程序都由3 种基本结构组成,由这些基本结构构成一个结构化的程序。这3种基本结构为:顺序结构、选择结构和循环 结构。 (4)D)【解析】结构化程序设计方法的主要原则可以概括为自顶向下、逐步求精、模块化及限制使 用goto语句,总的来说可使程序结构良好、易读、易理解、易维护。 (5)C)【解析】面向对象的设计方法与传统的面向过程的方法有本质不同,它的基本原理是,使用 现实世界的概念抽象地思考问题从而自然地解决问题。它强调模拟现实世界中的概念而不强调算法,它鼓 励开发者在软件开发的绝大部分中都用应用领域的概念去思考。本题答案为C)。 (6)D)【解析】面向对象的世界是通过对象与对象间彼此的相互合作来推动的,对象间的这种相互 合作需要一个机制协助进行,这样的机制称为消息。消息是一个实例与另一个实例之间传递的信息,它请 求对象执行某一处理或回答某一要求的信息,它统一了数据流和控制流。本题答案为D)。 (7)D)【解析】面向对象程序设计方法并不强调自顶向下的构造程序,而常常是自底向上的,而自 顶向下、逐步求精是结构化程序设计的特点。 (8)D)【解析】面向对象思想中的三个主要特征是:封装性、继承性和多态性。 (9)A)【解析】面向对象程序由若干个对象构成;结构化程序由数据和相应算法构成。 (10)A)【解析】对象是由数据和容许的操作组成的封装体,与客观实体有直接的对应关系,对象之 间通过传递消息互相联系,从而模拟现实世界中不同事物彼此之间的联系,B)、C)、D)是正确的,对象 的思想广泛应用于C++、Java等语言中,因此A)错误。 (11)C)【解析】对象的基本特点:标识唯一性、分类性、多态性、封装性和模块独立性。 (12)C) 【解析】在面向对象程序设计中所使用的对象,其数据和操作是作为平等伙伴出现的。因此, 对象具有很强的自含性,此外,对象所固有的封装性,使得对象之间不相互影响。 (13)D)【解析】面向对象方法是一种运用对象、类、封装、继承、多态和消息等概念来构造、测试、 重构软件的方法。面向对象方法从对象出发,发展出对象、类、消息、继承等概念。

考点3答案:软件工程基础
(1)D)【解析】本题考查软件的定义。软件是计算机系统中与硬件相互依存的另一部分,它包括程

序、相关数据及其说明文档的总和。因此,本题的正确答案是选项D)。 (2)C)【解析】软件工程学是研究软件开发和维护的普遍原理与技术的一门工程学科。所谓软件工 程是指采用工程的概念、原理、技术和方法指导软件的开发与维护。软件工程学的主要研究对象包括软件 开发与维护的技术、方法、工具和管理等方面。由此可见,选项A)、选项B)和选项D)的说法均不正确, 选项C)正确。 (3)D)【解析】软件工程包括3个要素,即方法、工具和过程。 (4)C)【解析】软件工程概念的出现源自于软件危机。为了消除软件危机,通过认真研究解决软件 危机的方法,认识到软件工程是使计算机软件走向工程科学的途径,逐步形成了软件工程的概念。 (5)A)【解析】本题考核软件维护的概念。维护是软件生命周期的最后一个阶段,也是持续时间最 长、付出代价最大的阶段。在软件交付使用后,还需要进行维护。软件维护通常有以下四类:为纠正使用 中出现的错误而进行的改正性维护;为适应环境变化而进行的适应性维护;为改进原有软件而进行的完善 性维护;为将来的可维护和可靠而进行的预防性维护。软件维护不仅包括程序代码的维护,还包括文档的 维护。综上所述,本题的正确答案是选项A),其余选项的说法错误。 (6)D) 【解析】软件生命周期分为软件定义、软件开发及软件运行维护3个阶段。本题中,详细设计、 软件编码和软件测试都属于软件开发阶段;维护是软件生命周期的最后一个阶段,也是持续时间最长、花 费代价最大的一个阶段,软件工程学的一个目的就是提高软件的可维护性,降低维护的代价。 (7)A)【解析】通常将软件产品从提出、实现、使用维护到停止使用的过程称为软件生命周期。它 可以分为软件定义、软件开发及软件运行维护3个阶段。 (8)C)【解析】软件生命周期由软件定义、软件开发和软件维护3个时期组成。软件开发时期是具体 设计和实现在前一时期定义的软件,它通常由下面五个阶段组成:概要设计、详细设计、编写代码、组装 测试和确认测试。 (9)D)【解析】通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周 期。也就是说,软件产品从考虑其概念开始,到该软件产品不能使用为止的整个时期都属于软件生命周期。 软件生命周期的主要活动阶段为: ① 可行性研究和计划制定。确定待开发软件系统的开发目标和总的要求,给出它的功能、性能、可靠 性以及接口等方面的可能方案,制定完成开发任务的实施计划。 ② 需求分析。对待开发软件提出的需求进行分析并给出详细定义,即准确地确定软件系统的功能。编 写软件规格说明书及初步的用户手册,提交评审。 ③ 软件设计。系统设计人员和程序设计人员应该在反复理解软件需求的基础上,给出软件的结构、模 块的划分、功能的分配以及处理流程。 ④ 软件实现。把软件设计转换成计算机可以接受的程序代码。即完成源程序的编码,编写用户手册、 操作手册等面向用户的文档,编写单元测试计划。 ⑤ 软件测试。在设计测试用例的基础上,检验软件的各个组成部分。编写测试分析报告。 ⑥ 运行和维护。将已交付的软件投入运行,并在运行使用中不断地维护,根据新提出的需求进行必要 而且可能的扩充和删改。 (10)D)【解析】需求分析是软件定义时期的最后一个阶段,它的基本任务就是详细调查现实世界要 处理的对象(组织、部门、企业等),充分了解原系统的工作概况,明确用户的各种需求,然后在此基础 上确定新系统的功能。选项A)软件开发方法是在总体设计阶段需完成的任务;选项B)软件开发工具是在 实现阶段需完成的任务;选项C)软件开发费用是在可行性研究阶段需完成的任务。 (11)C)【解析】常见的需求分析方法有:结构化分析方法和面向对象的分析方法。结构化分析就是 使用数据流图(DFD)、数据字典(DD)、结构化语言、判定表和判定树等工具,来建立一种新的、称为结 构化规格说明的目标文档。 (12)B)【解析】软件开发阶段包括需求分析、总体设计、详细设计、编码和测试5个阶段。其中需 求分析阶段常用的工具是数据流图和数据字典。本题答案为B)。

(13)A)【解析】数据流图中的主要图形元素有加工、数据流、存储文件、源和潭。 (14)D)【解析】软件需求规格说明书(Software Requirement Specification,SRS)是需求分析 阶段的最后成果,是软件开发中的重要文档之一。它具有以下几个方面的作用:① 便于用户、开发人员进 行理解和交流;② 反映出用户问题的结构,可以作为软件开发工作的基础和依据;③ 作为确认测试和验 收的依据。 (15)B)【解析】软件设计包括软件结构设计、数据设计、接口设计和过程设计。其中,结构设计是 定义软件系统各主要部件之间的关系;数据设计是将分析时创建的模型转化为数据结构的定义;接口设计 是描述软件内部、软件和操作系统之间及软件与人之间如何通信;过程设计则是把系统结构部件转换成软 件的过程性描述。 (16)D)【解析】在结构化程序设计中,一般较优秀的软件设计尽量做到高内聚、低耦合,这样有利 于提高软件模块的独立性,也是模块划分的原则。 (17)C)【解析】软件设计遵循软件工程的基本目标和原则,建立了适用于在软件设计中应该遵循的 基本原理和与软件设计有关的概念,它们具有抽象、模块化、信息隐蔽和数据独立性。自底向上是集成测 试中增量测试的一种。 (18)C)【解析】模块的独立程序是评价设计好坏的重要度量标准。衡量软件的模块独立性使用耦合 性和内聚性两个定性的度量标准。一般较优秀的软件设计,应尽量做到高内聚,低耦合。 (19)B)【解析】系统设计的质量主要反映在模块的独立性上。评价模块独立性的主要标准有两个: 一是模块之间的耦合,它表明两个模块之间互相独立的程度;二是模块内部之间的关系是否紧密,称为内 聚。一般来说,要求模块之间的耦合尽可能地弱,即模块尽可能独立,而要求模块的内聚程度尽量地高。 综上所述,选项B)的答案正确。 (20)B)【解析】利用信息隐蔽,可以确保每一个模块的独立性。 (21)C)【解析】模块之间的耦合程度反映了模块的独立性,也反映了系统分解后的复杂程度。按照 耦合程度从强到弱分别是:内容耦合、公共耦合、外部耦合、控制耦合、标记耦合、数据耦合和非直接耦 合,没有异构耦合这种方式。 (22)C)【解析】总体设计过程通常由两个主要阶段组成:系统设计,确定系统的具体实现方案;结 构设计,确定软件结构。为确定软件结构,首先需要从实现角度把复杂的功能进一步分解。分析员结合算 法描述仔细分析数据流图中的每个处理,如果一个处理的功能过分复杂,必须把它的功能适当地分解成一 系列比较简单的功能。 (23)C)【解析】程序流程图是人们对解决问题的方法、思路或算法的一种图形方式的描述。其中, 图框表示各种操作的类型,图框中的文字和符号表示操作的内容;流程线表示操作的先后次序。带箭头的 线段在数据流程图中表示数据流;带箭头的线段在程序流程图中表示控制流。题中给出的选项中,在图元 之间用带有箭头的线段表示图元关系。在模块之间用带有箭头的线段表示调用关系。 (24)B)【解析】N-S图是由Nassi 和 Shneiderman 提出的一种符合程序化结构设计原则的图形描述 工具。它的提出是为了改进流程图在描述程序逻辑时的不灵活性。 (25)D)【解析】数据流图DFD是结构化分析方法最主要的一种图形工具,不属于过程设计工具。 (26)C)【解析】软件测试是为了发现错误而执行程序的过程,且为了达到好的测试效果,应该由独 立的第三方来构造测试,程序员应尽量避免检查自己的程序。 (27)D)【解析】使用人工或自动手段来运行或测定某个系统的过程,目的在于检验它是否满足规定 的需求或是弄清预期结果与实际结果之间的差别。软件测试是为了发现错误而执行程序的过程。测试以查 找错误为目的,而不是为了演示软件的正确功能。 (28)D)【解析】软件测试过程中,辅助资源包括测试用例(测试数据)、测试计划、出错统计和最 终分析报告等。 (29)A)【解析】确认测试的任务是验证软件的功能和性能,以及其他特性是否满足需求规格说明中 确定的各种需求;集成测试的主要目的是发现与接口有关的错误。

(30)D)【解析】因为测试的目的在于发现错误,从心理学角度讲,由程序的编写者自己进行测试是 不合适的,为了达到最好的测试效果,应该由独立的第三方进行测试工作,所以选项A)错误;程序调试, 修改一个错误的同时可能引入了新的错误,解决的办法是在修改了错误之后,必须进行回归测试,所以选 项B)错误;所谓软件维护,就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过 程,可见选项C)也是错误的。 (31)B)【解析】本题考查软件工程调试。调试与测试是两个不同的过程,有着根本的区别:调试是 一个随机的、不可重复的过程,它用于隔离和确认问题发生的原因,然后修改软件来纠正问题;测试是一 个有计划的、可以重复的过程,它的目的是为了发现软件中的问题。因此,软件调试的目的是为了改正软 件中的错误。本题的正确答案是选项B)。

考点4答案:数据库设计基础
(1)C)【解析】数据库(DataBase,DB)是数据的集合,它具有统一的结构形式并存放于统一的存 储介质内,是多种应用数据的集成,可以被各个应用程序所共享。数据库中的数据具有“集成”、“共享” 的特点。 (2)B)【解析】由于数据的集成性使得数据可被多个应用程序共享,特别是在网络发达的今天,数 据库与网络的结合扩大了数据库的应用范围,所以数据库技术的根本问题是解决数据的共享问题。 (3)B)【解析】数据库管理系统(Database Management System,DBMS)是数据库的机构,它是一 种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等,数据库管理系 统是数据库系统的核心。 (4)C)【解析】数据库管理系统DBMS是数据库系统中实现各种数据管理功能的核心软件。它负责数 据库中所有数据的存储、检索、修改以及安全保护等,数据库内的所有活动都是在其控制下进行的。所以, DBMS包含数据库DB。操作系统、数据库管理系统与应用程序在一定的硬件支持下就构成了数据库系统。所 以,DBS包含DBMS,也就包含DB。综上所述,选项C)正确。 (5)D)【解析】文件系统所管理的数据文件基本上是分散的、相互独立的,因此相对于数据库系统, 文件系统数据处理存在3个缺点,即数据冗余大、数据的不一致性、程序与数据的相互依赖(简称为数据依 赖)。 (6)C)【解析】数据库技术的主要目的是有效地管理和存取数据资源,包括提供数据的共享性,使 多个用户能够同时访问数据库中的数据;减少数据的冗余度,以提高数据的一致性和完整性;提供数据与 应用程序的独立性,从而减少应用程序的开发和维护代价。 (7)A)【解析】数据库系统的数据具有高共享性和低冗余性,但不能完全避免数据冗余;数据的一 致性是指在系统中同一数据的不同出现应保持相同的值。 (8)D)【解析】数据具有两方面的独立性:一是物理独立性,即由于数据的存储结构与逻辑结构之 间由系统提供映象,使得当数据的存储结构改变时,其逻辑结构可以不变,因此,基于逻辑结构的应用程 序不必修改;二是逻辑独立性,即由于数据的局部逻辑结构(它是总体逻辑结构的一个子集,由具体的应 用程序所确定,并且根据具体的需要可以作一定的修改)与总体逻辑结构之间也由系统提供映象,使得当 总体逻辑结构改变时,其局部逻辑结构可以不变,从而根据局部逻辑结构编写的应用程序也可以不必修改。 综上所述,本题的正确答案是D)。 (9)A)【解析】选项A)正确,外模式是用户的数据视图,也就是用户所见到的数据模式;选项B) 不正确, 全局数据视图的描述称为概念模式, 即数据库中全部数据的整体逻辑结构的描述; 选项C) 不正确, 物理存储数据视图的描述称为内模式,即数据库在物理存储方面的描述;选项D)不正确,存储模式即为内 模式。 (10)C)【解析】数据模型所描述的内容有3个部分,它们是数据结构、数据操作和数据约束。其中, 数据模型中的数据结构主要描述数据的类型、内容、性质,以及数据库的联系等;数据操作主要是描述在

相应数据结构上的操作类型与操作方式。本题答案为C)。 (11)A) 【解析】两个实体之间的联系实际上是实体集间的函数关系,这种函数关系可以有下面几种, 即一对一的联系、一对多(或多对一)的联系和多对多的联系;概念模型便于向各种模型转换。由于概念 模型不依赖于具体的数据库管理系统,因此,容易向关系模型、网状模型和层次模型等各种模型转换。 (12)A)【解析】属性(Attribute):实体所具有的某一特性称为属性。一个实体可以由若干个属性 来刻画。 (13)D)【解析】两个实体间的联系可以归纳为3种类型: 一对一联系:一对一的联系表现为主表中的每一条记录只与相关表中的一条记录相关联。 一对多联系或多对一联系:一对多的联系表现为主表中的每一条记录与相关表中的多条记录相关联。 多对多联系:多对多的联系表现为一个表中的多个记录在相关表中同样有多个记录与其匹配。 一个教师可讲授多门课程,一门课程可由多个教师讲授,所以实体教师和课程间的联系是多对多的联 系。 (14)B)【解析】实体之间的联系类型主要有一对一、一对多、多对多,按题意可知部门与职员之间 的联系类型是一对多(1:m),所以本题应选B)。 (15)A)【解析】在E-R图中,用矩形框表示实体,框内标明实体名;用椭圆框表示实体的属性,框 内标明属性名;用菱形框表示实体间的联系,框内标明联系名。 (16)B)【解析】层次模型是最早发展出来的数据库模型。它的基本结构是树形结构,这种结构方式 在现实世界中很普遍,如家族结构、行政组织机构,它们自顶向下、层次分明。 (17)C)【解析】关系模型较之格式化模型(网状模型和层次模型)有以下几方面的优点,即数据结 构比较简单、具有很高的数据独立性、可以直接处理多对多的联系,以及有坚实的理论基础。 (18)C)【解析】在关系模型数据库中,基本结构是二维表,这种二维表称为关系。关系的列称为属 性,一个具有N个属性的关系称为N元关系。 (19)A)【解析】关系表中,每一行称为一个元组,对应表中的一条记录;每一列称为一个属性,对 应表中的一个字段;在二维表中能唯一标识元组的最小属性集称为该表的键或码。 (20)A)【解析】在关系数据库中,一个表就是一个关系,关系数据库管理系统管理的关系就是多个 二维表。 (21)D)【解析】数据模型用来表示实体间的联系,但不同的数据库管理系统支持不同的数据模型。 常用的数据模型有层次模型、网状模型和关系模型,层次模型不能表示多对多联系,网状模型和关系模型 都能表示任意一种联系。 (22)C)【解析】软件开发模型包括瀑布模型、快速原型法模型和螺旋模型。 (23)A)【解析】关系运算中的选择运算是从关系中找出满足给定条件的元组的操作;投影运算是从 关系中选择若干个属性组成新的关系的操作;连接运算是关系的横向结合。 (24)B)【解析】两个相同结构关系的“并”是由属于这两个关系的元组组成的集合。 (25)C)【解析】选择运算是一个一元运算,关系R通过选择运算(并由该运算给出所选择的逻辑条 件)后仍为一个关系。这个关系是由R中那些满足逻辑条件的元组所组成。如果关系的逻辑条件为f,则R 满足f的选择运算可以写成:σ f(R)。本题答案为C)。 (26)C)【解析】关系运算分为: ① 传统的关系运算(集合运算) 进行并、差、交集合运算的两个关系必须具有相同的关系模式,即相同结构。在Access中没有提供传 统的集合运算,可以通过其他操作或编写程序来实现。 ② 专门的关系运算 选择:从关系中找出满足给定条件的元组的操作称为选择。 投影:从关系模式中指定若干个属性组成新的关系称为投影。 连接:连接是关系的横向结合。连接运算将两个关系模式拼接成一个更宽的关系模式,生成的新关系

中包含满足连接条件的元组。 (27)A)【解析】本题考查集合运算。在关系数据库理论中,两个关系的并是由属于这两个关系的元 组组成的集合,故选项A)正确。两个关系的交是由既属于一个关系又属于另一个关系的元素组成的集合, 两个集合的差运算是由从一个集合中去掉另一个集合中有的元素组成。两个集合的交运算是由既属于前一 个集合又属于后一个集合的元素组成。 (28)B)【解析】本题考查数据库的关系运算。两个关系的并运算是指将第一个关系的元组加到第二 个关系中,生成新的关系。因此,并运算不改变关系表中的属性个数,也不能减少元组个数。两个关系的 交运算是包含同时出现在第一个和第二个关系中的元组的新关系。因此,交运算不改变关系表中的属性个 数,但能减少元组个数。投影是一元关系操作。投影操作选取关系的某些属性,这个操作是对一个关系进 行垂直分割,消去某些属性,并重新安排属性的顺序,再删除重复的元组。因此,投影运算既可以减少关 系表中的属性个数,也可以减少元组个数。两个关系的笛卡儿积会增加属性个数。 (29)B) 【解析】关系数据库管理系统能实现的专门关系运算,包括选择运算、投影运算、连接运算。 (30)A)【解析】R-S表示属于R但不属于S,R-(R-S)表示既属于R又属于S,即相当于R∩S。 (31)D)【解析】关系R与S经交运算后所得到的关系T是由那些既在R内又在S内的有序元组所组成。 (32)C)【解析】对于两个关系的合并操作可以用笛卡儿积表示。设有n元关系R和m元关系S,它们分 别有p和q个元组,则R与S的笛卡儿积记为R×S,它是一个m+n元关系,元组个数是p×q,由题意可得,关系 T是由关系R与关系S进行笛卡儿积运算得到的。 (33)D) 【解析】数据库的生命周期可以分为两个阶段:一是数据库设计阶段;二是数据库实现阶段。 数据库的设计阶段又分为4个子阶段:即需求分析、概念设计、逻辑设计和物理设计。因此,本题的正确答 案是D)。 (34)A)【解析】本题考查数据库系统的基本概念和知识。数据的逻辑结构,是数据间关系的描述, 它只抽象地反映数据元素之间的逻辑关系,而不管其在计算机中的存储方式。数据的存储结构,又叫物理 结构,是逻辑结构在计算机存储器里的实现。这两者之间没有必然的联系。因此,选项A)的说法是错误的。 数据库可以看成是长期存储在计算机内的、大量的、有结构的和可共享的数据集合。因此,数据库具 有为各种用户所共享的特点。不同的用户可以使用同一个数据库,可以取出它们所需要的子集,而且容许 子集任意重叠。数据库的根本目标是要解决数据的共享问题。因此,选项B)的说法正确。 (35)C)【解析】E-R图向关系模型的转换原则: ① 一个实体型转换为一个关系模型,实体的属性就是关系的属性,实体的键就是关系的键; ② 一个联系转换为一个关系模式, 与该联系相连的每个实体型的键以及联系的属性都转换为关系的属 性。这个关系的键分为以下三种不同的情况: 若联系为1:1,则相连的每个实体型的键均是该关系模式的候选键。 若联系为1:n,则联系对应的关系模式的键取n端实体型的键。 若联系为m:n,则联系对应的关系模式的键为参加联系的诸实体型的键的组合。

考点5答案:程序设计基本概念
(1)B)【解析】本题考核的知识点是C程序的基本概念。C语言一种高级语言,C语言源程序经过C语 言编译程序编译之后,生成一个后缀为.obj的二进制文件(称为目标文件),最后还要由称为“连接程序” (Link)的软件,把此.obj文件与C语言提供的各种库函数连接在一起,生成一个后缀.exe的可执行文件。显 然C语言不能立即执行,故选项A)错误。根据以上定义,选项C)和选项D)错误,所以,4个选项中选项B) 符合题意。 (2)D)【解析】本题考查的是C程序的基本概念。C语言是一种高级语言,C语言源程序经过C语言编 译程序编译之后, 生成一个后缀为.obj的二进制文件 (称为目标程序) , 最后还要由称为 “连接程序” (Link) 的软件,把此.obj文件与C语言提供的各种库函数连接在一起,生成一个后缀.exe的可执行程序。显然C语

言源程序不能立即执行,故选项A)错误。根据以上定义,选项B)和选项C)错误。故本题应该选择D)。 (3)D)【解析】一个C 语言的源程序(后缀名为. c)在经过编译器编译后,先生成一个汇编语言程 序,然后由编译程序再将汇编语言程序翻译成机器指令程序,即目标程序(后缀为.obj),目标程序不可 以直接运行,它要和库函数或其他目标程序连接成可执行文件(后缀名为. exe)后方可运行。 (4)B)【解析】本题考查的是算法的特性。一个算法应当具有以下5个特性:有穷性;确定性;可行 性;有零个或多个输入;有一个或多个输出。简洁性不属于这5个特性,所以本题应该选择B)。 (5)B)【解析】本题考核的知识点是算法的性质。算法是为解决某个特定问题而采取的确定的且有 限的步骤,一个算法应当具有以下5个基本特性:① 有穷性,就是指一个算法应当包含有限个操作步骤。 ② 确定性,就是说算法中每一条指令必须有确切的含义,不能有二义性,对于相同的输入必能得出相同的 执行结果。③ 有零个或多个输入。④ 可行性,就是说算法中指定的操作,都可以通过已经实现的基本运 算执行有限次实现,⑤有一个或多个输出。由此可知选项B)不正确,所以,4个选项中选项B)符合题意。 (6)C)【解析】一个算法应当具有5个特性,即有穷性、确定性、可行性、有零个或多个输入以及有 一个或多个输出。算法的确定性是指:算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。 并且在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的执行结果。 (7)C)【解析】算法具有的5个特性是:有穷性;确定性;可行性;有0个或多个输入;有一个或多 个输出。所以说,用C 程序实现的算法可以没有输入但必须要有输出。 (8)A)【解析】本题考核的知识点是C程序的3种基本结构。C程序由3种基本的结构组成,分别为顺 序结构、选择结构和循环结构,这3种结构可以组成任何复杂的C程序,即可以完成任何复杂的任务,故选 项B)、选项C)和选项D)都不正确。所以,4个选项中选项A)符合题意。

考点6答案:C程序设计的初步知识
(1)D)【解析】在C 语言所有的运算符中,逗号运算符的优先级最低。C 语言中区分大小写,所以 APH 和aph 是两个不同的变量。赋值表达式a=b表示将b的值赋给a,而b 本身的值保持不变,通过键盘可以 向计算机输入允许的任何类型的数据。选项D)中当从键盘输入数据时,对于整型变量可以输入整型数值和 字符,对于实型变量可以输入实型数值和整型数值等。 (2) C) 【解析】 本题主要考查的知识点是运算符的优先级和结合性。 解本题的关键在于表达式z = x++、 y++、++y的计算,其中有三种运算符“=”、“,”和“++”,它们的优先级从高到低依次是“++”、“=” 和“,”,所以原表达式就相当于(z = (x++)), (y++), (++y)。自增运算符“++”是单目运算符,即它只 对一个运算分量起作用,根据其在运算分量的前面或后面分为前缀和后缀两种形式。两种形式的作用效果 是一样的,都是使运算分量的值加1,但是它们的表达式的值不一样,前缀形式表达式的值为运算分量加1 之后的值,后缀形式表达式的值为运算分量加1之前的值。 (3)C)【解析】求余运算符“%”两边的运算对象必须是整型,而选项B)和D)中“%”两边的运算 对象有浮点数据,所以选项B)和D)是错误的表达式。在选项A)中赋值表达式左侧要为“左值”,也是错 误的。选项C)是一个逗号表达式,所以正确答案为C)。 (4)D)【解析】考查printf 函数的相关知识。输出格式控制符%c 表示将变量以字符的形式输出; 输出格式控制符%d 表示将变量以带符号的十进制整型数输出,所以第一个输出语句输出的结果为a,97; 第二个输出语句输出的结果为k=12。所以选项D)为正确答案。 (5)D)【解析】本题主要考查的是标准输出函数printf。printf函数在进行参数匹配时,并不会检 查参数类型是否一一匹配,也不会检查参数个数是否一致,而是从它认为应该是第1个参数地址的内存位置 开始,依次将内存中的内容逐个匹配给格式化字符串内所给定的各个类型。因此,前一个printf调用,两 个ch分别匹配给%c和%d,而参数k多余,被抛弃。所以会输出“a,97,”(字符a的ASCII值为97)。后一个 printf很正常,这里就不解释了。故应该选择D)。 (6)B)【解析】本题主要考查的知识点是:整型常量。整型常量有十进制、八进制和十六进制3种表

示:十进制整数以正号(+)或负号(-)开头,由首位非0的一串十进制数字组成,正负号也可省略,表示 正整数;八进制整数以数字0开头,后面接若干个八进制数字(0~7);十六进制整数以数字0和字母x(大、 小写均可)开头,后面接若干个十六进制数字(数字0~9和字母A~F,大、小写均可)。故本题是以无符号 整数形式输出一个十六进制整数FFFF,将其转换为十进制就是65535,故本题应该选择B)。 (7)C)【解析】本题考核的知识点是输出函数printf()的应用。本题中,printf("%2d,%2d\n",x,y) 表示输出形式是十进制整数,域宽是2,而在C语言中规定:当域宽小于实际宽度时域宽不起作用,按实际 宽度输出,因此最后的输出值为102和10,所以选项C)符合题意。 (8)B)【解析】本题考核的知识点是printf()函数的简单应用。程序中的printf()函数的输出格式 部分只说明了一个%d,而输出成员列表却有a和b两个成员,在这里将只输出第一个成员a值为666,所以,4 个选项中选项B)符合题意。 (9)C)【解析】本题考查的知识点是:格式化输出的应用。 printf函数的调用形式:printf(格式控制,输出项1,输出项2,?),该题的输出项为一个逗号表 达式,该表达式的值为b的值,因此输出结果为888,故本题选C)。 (10)C)【解析】本题考查的知识点是:标准输入函数scanf()。scanf()函数要求,除了第1个参数 为格式化字符串以外,其余参数均为相应变量的地址值。本题中,只有p是地址值,故应该选择C)。 (11)B)【解析】考查格式输入函数scanf 的使用。scanf 函数的一般格式是:scanf( 格式控制,地 址表列),该格式中,地址表列中应是变量地址,而不是变量名。 (12)A)【解析】本题的考查点是格式输入函数。格式输入函数的一般形式:scanf( 格式控制,地址 表列) 。需要注意的是:如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时 应输入与这些字符相同的字符。所以输入的两个数字之间的逗号是不可少的。故本题答案为A)。 (13)B)【解析】本题考查的是输入函数scanf()基本用法。使用该语句时,要求除格式控制符以外 的字符都要原样输入,“,”为非格式符,要原样输入。选项B)中没有输入非格式符“,”,所以是不正确 的。 (14)B)【解析】本题考查了格式输入函数scanf()的运用。scanf()函数的一般形式为: scanf(格 式控制,地址表列)。其中,“格式控制”是用双引号括起来的字符串,也称“转换控制字符串”,它包括 两种信息: ① 格式说明,由“%”和格式字符组成; ② 普通字符,即需要原样输入的字符。 “地址表列”是需要接收输入数据的一系列变量的地址。本题中的“格式控制”是“%2d%f”,其中%2d 的意思是要输入一个整数, 但该整数最宽只占2个字符, 而%f是要输入一个浮点数。 而题目要求输入的是876 543.0,所以scanf()函数将87赋给a,6赋给b。 (15)B) 【解析】 本题考查通过scanf 函数输入数据时的格式控制问题。 变量j 的格式控制为 “%2d” , 即只接收输入数据的前两位,从第三位开始直到空格之间的输入都会被保存到变量y 中,因为y 为浮点型 数据,所以输出结果为选项B)。 (16)D)【解析】若在scanf 的格式化控制串中插入了其他字符,则在输入时要求按一一对应的位置 原样输入这些字符。格式化输入函数必须严格按照双引号里面的格式进行输入。在格式化输出函数中,格 式控制串中除了合法的格式说明外,可以包含任意的合法字符。 (17)D)【解析】选项D)为两条语句。

考点7答案:选择结构
(1)D)【解析】因为x 的值为大于1 的奇数,所以x 除以2 的余数等于1,因此,选项A)、C)中表 达式的结果为真,不为0;对于选项B)来说,x 除以2 的商不会等于0;选项D)中表达式的结果为假,即等 于0。

(2)D)【解析】本题考查的是判断奇偶数。选项A)、B)和C)中都是当k是奇数时表达式的值为1, 否则为0。而选项D)中因为逻辑非!运算符的优先级最高,所以当k为0的时候!k的值为1,整个表达式的值 也就是1,而当k为非0的时候!k的值为0,整个表达式的值为0。所以本题应该选择D)。 (3)B)【解析】本题主要考查的是C语言中的整除、求余以及逻辑值的概念。在C语言中,/号的两边 如果都是整数的话,返回的结果也是整数,如果除不净则舍去小数部分。%是求余运算,它的运算对象只能 是整型,运算结果是两数相除后所得的余数,当运算量为负数时,结果的符号与被除数相同。因此,执行 语句“a=d/10%9;”后,a=25/10%9=2%9=2。C语言中没有专门的逻辑值,而是用整型值来代替。当整型值作 逻辑值使用时,非零即表示“真”,零表示“假”,而逻辑值当整型值使用时,“真”等于1,“假”等于 0。因此,执行语句“b=a&&(-1);”后输出结果为2,1。 (4)C)【解析】本题考查的知识点是逻辑表达式。C语言编译系统在给出逻辑运算结果时,以数值1 代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即将 一个非零的数值认作为“真”。要让本题中的条件表达式(x-y)的结果为真,也就是要使(x-y)的值非零, 即大于0或者小于0,故等价的表达式应该是选项C)。 (5)D)【解析】本题考查的是逻辑运算符。C语言中,逻辑运算符的两个运算分量可以是任意合法的 表达式。故本题应该选择D)。 (6)B)【解析】本题主要考查的是逻辑表达式。选项A)中的表达式的意思是kk大于等于'A'且小于 等于' Z' ,因此只有当kk是一个大写字母的时候,该表达式才能被满足,所以选项A)能够判断出kk中的 值为大写字母。我们知道(kk+32)>=' a' 等价于kk>='a'-32,又因为相同的大小写字母的ASCII值,小写字 母的要比大写字母大32。所以'a'-32等于'A'。故选项C)和选项A)是等价的。isalpha()函数的功能是判 断一个参数是否为字母。又因为小写字母的ASCII值范围是97~122,大写字母的ASCII值范围是65~90,当判 断是字母且值小于91时一定是大写字母,所以选项D)能够判断出kk中的值为大写字母。 (7)C)【解析】本题考查的是逻辑表达式。在C语言中,整型值可以转换为逻辑值,规则是当整型值 为0时,它表示逻辑假;当整型值不为0时,它表示逻辑真。所以题目中的while(E)循环是当E等于0时,循 环结束,E不等于0时,继续循环。选项C)中,当E等于0时,表达式“E==0”为真继续循环,而E不等于0 时,表达式为假则循环结束,这与题目中的条件不等价,故应该选择C)。 (8)B)【解析】本题主要考查的是逻辑表达式。选项A)中表达式的意思是:当c等于2或4或6时,表 达式的值为真,否则为假。所以不满足题意。选项C)中表达式的意思是:当c大于等于2且小于等于6,并 且c不是奇数时,表达式的值为真,否则为假。这样,满足该表达式的c,只能取值为2、4、6了,所以也不 满足题意。选项D)中后面一个子表达式(c%2!=1)和选项C)中的!(c%2)是等价的。都是判断c不是奇数。因 此也不满足题意。故本题正确答案为B)。 (9)B)【解析】本题中a 的值为6,b 的值为8,最后s 的值为8,s*=s 等价于s=s*s。 (10)A)【解析】本题考查的是if语句。本题是一道陷阱题,语句if (a>b) a=b, b=c; c=a;看上去 好像a=b,b=c; c=a;都是if的子句,其实只有第1个分号及其之前的语句a=b, b=c;是if的子句,c=a;是紧 接着的语句,跟if的条件无关,始终会被运行的。题目中,a=10,b=50,所以a>b条件为假,那么a=b, b=c; 不会被执行,而c=a;会被执行。所以最终输出结果是a=10 b=50 c=10,应该选择A)。 (11)B)【解析】本题是一个陷阱题,以书写格式来考查考生对if语句的理解。if语句只对紧跟其后 的一条语句或语句块产生作用。因此,题目中两条if语句只有a=b;和c=b;是if的子句。第1条if语句中a>b 为假,所以跳过语句a=b;,执行c=a;后,a=3、b=5、c=3。第2条if语句的判断条件c!=a为假,所以跳过语 句c=b;。故最终输出的结果是:3,5,3,应该选择B)。 (12)C) 【解析】本题考查简单的if?else 语句。先执行条件if(a<b),显然不成立,再执行else 语 句。 (13)C)【解析】考查if 语句的使用。整个语句都是以a<b 为假设的,在a<b 的情况下,如果c=d, 则y=0;否则y=1。所以答案为选项C)。 (14)D)【解析】本题考核的知识点是if语句的用法。选项A)、选项B)和选项C)都是在a的值为0

的时候输出y,a不为0的时候输出x,而选项D)是在a为0的时候输出x,a不为0的时候输出y。所以,4个选 项中选项D)符合题意。 (15)C)【解析】本题考查的知识点是:if与else的配对原则。 else语句总是与前面最近的不带else的if相结合,故本题选C)。 (16)D)【解析】if?else 语句的执行过程如下,首先计算if 后面一对圆括号内表达式的值,若表 达式的值为非0,执行if 子句,然后跳过else 子句,去执行if 语句后的下一条语句;若表达式的值为0, 跳过if 子句,去执行else 子句,接着去执行if 语句后的下一条语句。C 语言的语法规定,else子句总是 与前面最近的不带else 的if 匹配, 与书写格式无关, 本题目的后一个if?else 相当于嵌套在第一个if 子 句里,相当于x<y&&y<0 时,z=0;当x<y&&y>=0 时,z=z+1。 (17)D) 【解析】本题考查的是if?else语句。C语言规定else总是与最近的if搭配,因此程序中else 与第二个if搭配。程序首先判断(x>y),为假,所以跳过后面的整个if?else语句。执行到输出语句时,x 的值仍为1,x++返回x增1之前的结果1,故应该选择D)。 (18) C) 【解析】 本题考查了if语句的嵌套。 在嵌套的if语句中, else总是与它上面最近的且不带else 的if配对。因此本题的正确答案为选项C)。 (19)C)【解析】该题目测验考生对if?else if 结构的理解,比较简单。x 的值满足x<10.0 的关 系,所以程序将执行y=1.0/ x;语句,y 的值应该等于0.5。最后,用printf 函数输出时,%f 的输出格式 为小数点后保留6 位。 (20)A)【解析】本题考查的是条件表达式的嵌套。因为条件运算符的结合方向为“自右至左”,所 以表达式a<b?a:c<d?c:d相当于a<b?a:(c<d?c:d)。由于a=1,b=4,所以a<b的结果为“真”,所以整个表达 式的值为a的值1。所以,4个选项中选项A)符合题意。 (21)B)【解析】本题考查的知识点是条件表达式。条件运算符?:是C语言中唯一的三目运算符,它 的规则是先计算左边运算分量,如果为“真”(非0),则返回中间运算分量的值,否则返回右边运算分量 的值。本题中因为a<b为“真”,所以第1个条件表达式的值为b的值2,所以k=2。然后又因为k>c为“假”, 所以第2个表达式的值为k的值2。所以本题应该选择B)。 (22)A)【解析】本题考核的知识点是三目运算符“? :”的运用。三目运算表达式的规则为如果“?” 前面的表达式的值为真,则取“:”前的表达式的值,否则,取“:”后面表达式的值。分析题目中给出 的表达式可知,如果a>b和b>c同时成立,k=1,否则k=0。所以,4个选项中选项A)符合题意。 (23)C)【解析】C 语言中,switch 语句专用于实现多分支结构程序,其特点是各分支清晰且直观。 switch 后面括号中可以是任何表达式,取其整数部分与各常量表达式进行比较。常量表达式中不能出现变 量,且类型必须是整型、字符型或枚举型,各常量表达式各不相同。 (24)A)【解析】考查switch 语句的使用。switch 语句的执行过程为:进入switch 结构后,对条件 表达式进行运算,然后从上至下去找与条件表达式值相匹配的case,以此作为入口,执行switch 结构中后 面的各语句,直到遇到break语句,则跳出switch 语句,如果各case 都不匹配时,则执行default 后面的 语句。 (25)D)【解析】本题主要考查的是switch语句的嵌套。首先看外层switch,因为x初始时为1,进入 外层case 1分支,这里又是一个switch语句。因为y初始时为0,进入内层case 0分支,执行a++; break;, 因为遇到break,所以此时应该跳出内层switch语句,跳出来后由于没有碰到break;语句,所以应执行外层 case 2分支,a++; b++; break;,此时又遇到break;所以跳出外层switch语句。由此可见,整个switch语 句中,a被增1两次,b增1一次,所以执行最后一条printf语句输出a=2,b=1。 (26)A)【解析】考查switch 语句的使用。switch 语句的条件是“a%3=15%3=0”,所以执行case 0 后面的语句,m++;m=1,然后就执行break,跳出switch 语句,所以最后输出m 的值为1。 (27)D)【解析】本题主要考查switch语句的概念。break语句除了能用于switch语句外,还可以用 于循环语句中,因此选项A)不正确。在switch语句中,可以使用default来执行所有case均失配时的分支, 也可以不使用default,此时若所有case均失配则跳出switch,因此选项B)不正确。在switch语句中,每

个case的作用就是标出一个执行的起点,当符合某个case时,程序就从该case所标出的起点处开始执行, 若没有break语句中断执行的话,程序会一直执行到switch的最后一条语句,而不是碰到下一个break才停 止执行,所以C)不正确。

考点8答案:循环结构
(1)B) 【解析】 t=1 是将t 赋值为1, 所以循环控制表达式的值为1。 判断t 是否等于1 时, 应用t==1, 注意“=”与“==”的用法。 (2)B)【解析】该题目应该根据循环体第一次和最后一次执行时的输出结果来决定哪一项是正确的。 第一次进入循环时,n 的值是9,循环体内,先经过n--运算,n 的值变为8,所以第一次的输出值是8,由 此可以排除选项A)和D)。由循环条件n>6 可以知道,最后一次循环开始时,n 的值应该为7,所以最后一 次执行循环时,输出为6,由此可以排除选项C)。 (3)B)【解析】本题中,“!”表示逻辑非运算符,“! =“表示不等于运算符,逻辑非运算符比不 等于运算符的优先级高。 (4)D)【解析】本题考查的是switch语句。switch语句中的case或default只是一种入口标号,它并 不形成一种子句的概念。当满足其中某个标号的条件而进入switch语句中时,如果没碰到break语句,将一 直执行到switch语句的结尾。题目中使用了一个while循环使k从5递减到1,当k=5或4的时候从default标号 进入switch,碰到break;语句立即跳出,没有改变n;当k=3时,执行了一次n+=k;;当k=2时,也执行了一 次n+=k;;当k=1时,执行了两次n+=k;。所以最终n的值为3+2+1+1=7。 (5)C)【解析】本题中,首先将0 赋给k,表达式变为0,跳出循环,没有执行循环体语句。解答本 题的关键是掌握while 语句。 (6)A)【解析】本题考查的是while循环和--运算符。因为在while循环的循环条件中,--运算符是 前缀形式,所以表达式--k的值是k自减之后的值。程序开始时,将k的值初始化为5,然后进入while循环, 因为--k的值为4(非零),所以执行循环体输出k-=3的值1,此时k的值也变为1。第2次执行循环条件,--k 的值为0,所以循环结束。因此最后输出的结果是1,故应该选择A)。 (7)D)【解析】本题考查switch 语句的掌握。必须掌握以下内容:首先应该明白switch 语句的语法 格式: switch 语句的语法格式为: switch(表达式) { case 常量表达式1:语句组1; case 常量表达式2:语句组2; ? case 常量表达式n:语句组n; default:语句组n+1; } 另外, 以下几点关于switch 语句的重点:① 系统在执行时计算开关表达式的值;② 根据所得的值在各 个case 标号表达式中寻找匹配,直到发现与表达式匹配的标号(本例中匹配的是case ' A' :);③ 找到匹 配后执行后面相应的语句表,顺序往下执行;④ 如果无相匹配的标号,若存在default 标号,则执行该语 句标号后面的语句表;⑤ 当不存在default 标号时,不执行switch 中的任何一个语句表。 一般而言,在多分支结构中总会出现“意外”的情况,这时均可归入default 程序段,作统一处理。 default 标号是可选性的, 不必每次都有, 视需要而定。 switch 语句中还可以包含switch 语句, 形成switch 的嵌套。 (8)A)【解析】本题主要考查的知识点是switch 语句。因为变量的初始值分别为“k=5,n=0”,所

以程序第一次进入循环时,执行default语句,这时k=4,执行“case 4:”这个分支,结果是“n=2,k=3”, 打印出2;程序然后进行第二次循环,这时“n=2,k=3”,执行“case 3:”这个分支,结果是“n=3,k=2”, 打印出3;程序进行第三次循环,这时“n=3,k=2”,执行“case 2: case 4:”这两个分支,结果是“n=5, k=1”,打印出5,这时因为n=5不满足n<5的循环条件,因此退出循环,程序运行结束,故输出结果为235。 (9)D) 【解析】本题是计算50 之内的自然数相加之和,题中if 语句括号中的条件表达式! (i%5)&&! (i%3)表明只有能同时被5 和3 整除的数才符合相加的条件,1 ~49 之间满足这个条件的只有15、30 和45, 因为s 的初始值为1,所以s=1+15+30+45=91。 (10)C)【解析】本题考查的知识点是:for循环语句的应用。本题首先要看出for循环条件的基本形 式(;;)当循环执行4次时,x++使x变为4,此时不满足判断条件,结束循环。故C)为正确答案。 (11)C)【解析】本题考核的知识点是for循环语句和switch语句嵌套使用。switch语句的执行过程 是:在switch后面的表达式的值和case后面常量表达式的值吻合时,就执行后面的语句。如果在该语句的 后面没有break语句,则继续执行下一个case,直到遇到break语句或switch多分支的结束,在switch语句 中, break语句的作用是使流程跳出switch结构, 终止switch语句的执行。 本题中在for循环中嵌套了switch 语句,每循环一次通过scanf()函数从键盘上输入一个k值,然后执行switch语句。 (12)D)【解析】本题考查的知识点是:switch语句的功能。 程序先执行case 0,输出0同时i变为1,接着执行default输出i为1,此时便可得出答案为D)。 (13)C)【解析】本题考查的知识点是:for循环、%运算符。本题首先令y为9,然后通过一个for循 环,当y还大于0则循环,每次循环让y递减1。循环体中是一条if语句,通过%运算符计算每当y能被3整除的 时候,输出--y的值,即先将y减1,然后输出y的值。故当y等于9、6、3时会输出,输出值分别为8、5、2。 所以应该选择C)。 (14)A)【解析】本题考查用于多分支选择的switch 语句, 其一般形式为: switch(表达式) { case 常量表达式1: 语句1; case 常量表达式2: 语句2; ? case 常量表达式n: 语句n; default : 语句n+1; } 其语义是:计算表达式的值,并逐个与其后的常量表达式值进行比较,当表达式的值与某个常量表达式 的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case 后的语句;如表达式的值与 所有case 后的常量表达式均不相等时,则执行default 后的语句。 (15)C)【解析】本题考核的知识点是for循环和switch语句的混合应用。程序中for循环了三次,第 一次i=0,执行switch语句中case 0:分支,直到遇到default语句,退出switch,这里共执行了三个输出 语句分别输出0,0,0,第二次循环i=1,switch语句中没有匹配的分支,故只执行default语句输出1,退 出switch语句;第三次循环i=2,从switch语句中的case 2:开始执行,共执行了两个输出语句输出2、2。 最后输出的结果为000122。所以,4个选项中选项C)符合题意。 (16)D)【解析】本题考核的知识点是for循环语句和复合赋值+=运算符的应用。本题中,i赋初值为 1,并对其每次进行加2操作,即i每次均为1~10之间的奇数,s+=i+1,即s=s+i+1,相当于s等于原来的s每 次加上 1~10 之间的偶数,直到 i<10 不成立。当 i=1 时, s=0+1+1=2 ;当 i=3 时, s=2+3+1=2+4 ;当 i=5 时, s=2+4+5+1=2+4+6;当i=7时,s=2+4+6+7+1=2+4+6+8;当i=9时,s=2+4+6+8+9+1=2+4+6+8+10;当i=11时, i<10不成立,结束循环。 (17)D)【解析】本题考查的是for循环的应用。n!表示1*2*3*?*n。因此,for循环应该遍历1(或 者2)~n的范围,而f的初始值应该为1,然后让f累乘每次循环的循环变量即可。选项A)让f初始化为0不正 确,因为0乘以任何数都为0,最后结果肯定是0;选项B)的循环变量是从1~n-1,也不对;选项C)的for

循环是一个死循环;选项D)的循环从n递减到2故满足要求,所以选D)。 (18)C)【解析】本题考查了自增运算符。自增运算符“++”分为前缀和后缀两种形式。两种形式的 作用效果是一样的,都是使运算分量的值加1,但是它们的表达式的值不一样,前缀形式表达式的值为运算 分量加1之后的值,而后缀形式表达式的值为运算分量加1之前的值。题目中使用了一个for循环,循环变量 i从1递增到40。在循环体中有两条嵌套的if语句,首先判断i++%5==0,即判断i++的值(i加1之前的值)是 否能被5整除(判断后i被加1),然后再判断++i的值(i加1之后的值)是否能被8整除(判断后i被加1),若 两个条件都满足了,就输出i的值,只有i=30时,满足i++%5==0,此时i=31, ++i%8==0成立,此时i=32。 (19)B)【解析】本题考核的知识点是C语言在生活中的简单应用。选项B)中for循环了5次,而每次 循环的时候,都将p的值重新赋值为1后,再乘以当前数字i,最后的结果为5,显然不是5!的值,同样的分 析可知选项A)、选项C)和选项D)计算的都是5!。所以,4个选项中选项B)符合题意。 (20)C)【解析】当for 循环执行到第30 次时,i 的值为30 能被5 整除,然后继续执行两次if 语 句,i 经过两次自加1 运算,值变为32,能被8 整除,故此时第一次执行“printf("%d",i);”语句,即输 出32。 (21)C)【解析】本题考查变量的自加“++”和自减“--”问题。当y 的值为9、6 或3 时,if 语句 的条件成立,执行输出语句,输出表达式--y 的值,y 的自减要先于输出语句执行,故输出结果为8 5 2。 (22)B)【解析】本题考核的知识点是break语句的应用。本题中for循环到i=3而执行break语句跳出 循环,最终只输出12。 (23)A)【解析】本题考查的是break语句。do?while循环是“先执行,后判断”,所以无论条件如 何,它都至少会执行一遍。程序首先初始化变量i为5,然后进入do?while循环体,首先判断(i%3==1),因 为5%3=2,所以if条件不满足,跳过下面的if语句,执行i++,i变为6。第1遍循环结束,判断(i!=0)为真, 继续循环。现在i%3=6%3=0,所以if语句还是不被执行,继续i++,i变为7,仍然满足(i!=0),继续循环。 第3遍循环i%3=7%3=1,满足条件(i%3==1),继续判断条件i%5==2 成立,即输出*7,然后执行break语句跳 出循环。 (24)C)【解析】本题主要考查的知识点是:break和continue语句。break语句可以用于switch或循 环体内,作用是跳出switch或循环体。continue语句只能用于循环体内,作用是结束当前循环,进入下次 循环。故本题中只有选项C)是正确的。 (25)B)【解析】本题考查的是for循环的嵌套。外循环的循环变量i从0递增到1会循环2次,内循环 的循环变量j从0递增到3会循环4次。但是内循环中有一条if语句,每当j%2为真,即j为奇数时会跳过下面 的x++;语句,所以4次内循环只有2次执行到x++;语句,再加上外循环中包含的2条x++;语句,所以每次外循 环会使x自增4次,2次外循环下来x的值为8。故应该选择B)。

考点9答案:字符型数据
(1)B)【解析】本题考查的是字符常量的概念。在C语言中,一个字符常量常常被当作一个整型常量 来参与运算,它所代表的值为该字符的ASCII码值。在ASCII码中,字符串结束符' \0' 的ASCII码为0,字 符' 0' 的ASCII码的值为48,字符' 1' 的ASCII码的值为49。由此可见,选项A)的值为-47;选项B)的值 为1;选项C)的值为49;选项D)的值为-48。故应该选择B)。 (2)A)【解析】C 语言的字符常量是用单引号(即撇号)括起来的一个字符。除此之外,在C 语言 中还允许用一个“ \”开头的字符序列来表示字符常量。其中,形式“ \ddd”表示1~3 位八 进制数所代 表的字符;形式“ \xhh”表示1~2 位十六进制数所代表的字符。在本题中,'\x13' 表示回车符,是一个字 符常量;' \081' 用八进制数所代表的字符,但形式不正确,因为八进制数所代表的字符中不会出现数字 “8”;'65'不是一个字符,而是一个十进制数字;“ \n”是用双引号括起来的一个字符,表示一个字符串, 而不是字符常量。 (3)B)【解析】本题主要考查的是字符常量。字符常量是用单引号括起来的一个字符,而以双引号

括起来的任意多个字符是字符串常量,所以本题中B)不属于字符常量。注意,选项C)和D)虽然用单引号 括起来的并不止一个字符,但它们都是以“\”开头的,都是代表一个字符的转义字符。 (4)A)【解析】C 语言的字符型常量中,允许用一种特殊形式的字符常量,就是以一个“ \”开头 的字符。其中,“ \ddd”表示用ASCII 码(八进制数)表示一个字符,本题中的char c=' \72' 即表示占 一个字符的变量c 的ASCII 码值。 (5)A)【解析】C 语言中,一个字符常量代表ASCII 字符集中的一个字符,在程序中用单引号括起 来作为字符常量,字符常量的的范围是0 ~127。由于字符常量用单引号括起来,所以选项B)、C)错误, 选项D)超过了字符常量的表示范围。 (6)A)【解析】本题考查的知识点是字符常量中的转义字符。转义字符是以一个“\”开头的字符序 列,它只代表一个字符。在选项A)中,“\”后跟着三个数字,是表示一个ASCII码值等于这三位数字所组 成的八进制数数值的字符,但是八进制数只能是由0~7这八个数字表示,而选项A)中出现了数字8,所以是 不合法的。选项B)是表示一个双引号的转义字符表示方法;选项C)表示的是一个反斜杆;选项D)表示一 个ASCII值为十六进制值cc的字符。故应该选择A)。 (7)B)【解析】字符串常量是由双引号括起来的一串字符,其中的双引号不可缺少。由此可知,选 项A)、C)、D)都是合法的字符串常量,而选项B)是一个字符常量。 (8)A)【解析】本题考查的是C语言的常量。0.1e+6是实型常量的指数形式,代表0.1×10的6次方, 所以选项B)是合法的;"\a"是合法的字符串常量,\a是一个非打印的转义字符表示响铃,所以选项C)是 合法的;' \011' 是一个字符常量,\011是一个用3位八进制表示的转义字符,所以选项D)也是合法的。 在C语言中,字符常量是用单引号括起来的一个字符,选项A)中的'cd'包含了2个字符,所以是不正确的。 (9)C)【解析】在C 语言中,字符型数据在内存中的存储形式是ASCII 码值。当需要以整型格式输 出字符时,输出的也是ASCII 码值。字符‘A’ 和‘D’ 的ASCII 码值分别为65 和68。 (10)B)【解析】在本题中,选项B)实际是先计算关系表达式“'A' <=c”的值是0 还是1,再比较 该值与字符' Z' 之间的大小关系,显然不能实现题目所要求的功能,而选项A)、C)、D)都可以。 (11)A)【解析】本题主要考查的知识点是大写字母比它对应的小写字母ASCII 码值小32,并且字符 可以看作整数进行算术运算等操作。 (12)A)【解析】本题考核的知识点是运算符++的用法。程序中的第一个输出语句输出表达式++a的 值,该++a是在使用a之前,先使a的值加1,即为a加1为字符b,此时a的值为b,所以第一个输出语句输出的 值为b,第二个输出语句中输出的b的值,这时b的值为表达式a++的值,a++是在使用a之后(此时a的值为b, 所以赋给b的值为b),使a的值加1,因此第二个输出的值也为b。所以,4个选项中选项A)符合题意。 (13)C)【解析】本题考查了字符型变量的运算及输出。在C语言中,字符型变量可以看做整型变量 来对待,与整型所不同的是字符型变量在内存中只占1个字节,而整型是2个字节。字符型变量中所存的数 值是它所表示字符的ASCII码值。ASCII码中的一些相关字符是顺序排列的,如' 0' 的ASCII码值为48,' 1' 为49,以此类推,一直到' 9' ;' A' 的ASCII码值为65,' B' 为66,以此类推,一直到' Z' 。本题程序 一开始就定义了两个字符型变量a和b,并初始化为字符' 1' 和' 2' ,由于题目已经告知' 0' 的ASCII值为48, 所以变量a、b中所存' 1' 、' 2' 的ASCII值为49和50。 (14)D)【解析】本题考查的知识点是:数据输入。scanf函数是C语言提供的标准输入函数,作用是 在终端设备(或系统隐含指定的输入设备)上输入数据。scanf()函数的一般形式为:scanf(格式控制, 输 入项表);本题中的格式控制字符串是“%d%c%d%c”,其中%d表示要输入的是整数;%c则表示输入的是字符, 且各控制符之间无任何分隔字符,故要求输入的数据之间也不能分开(若要求连续输入的都是数据类型, 则必须以空格等空白字符分隔每个数据, 因为系统不知道应该如何去分隔这一系列数据) 。 而选项A) 、 B) 、 C)在10和X之间均插入空格,所以不正确。 (15)D)【解析】本题考查的是输入输出函数。scanf()是格式化输入函数;getchar()函数从键盘缓 冲区读入下一个字符;putchar()输出一个字符;printf()函数是格式化输出函数。在题目中,程序执行到 scanf()函数时,会暂停等待用户输入4个字符,按题意输入123<回车>后,字符1~3被分别赋值到c1~c3中,

而c4会得到一个换行符' \n' 。然后执行第1个getchar()函数,由于前面的scanf()函数读完了缓冲区中的 所有字符,所以此时程序会又暂停等待用户输入,按题意输入45678<回车>后,缓冲区第一个字符4赋值到 c5,第二个字符5赋值到c6,所以本题应该选择D)。 (16)D)【解析】在格式输入中,要求给出的是变量的地址,而D)答案中给出的s[1]是一个值的表 达式。 (17)C) 【解析】本题的考查点是C语言字符数据的输入和输出。程序定义了四个字符型变量a、b、c、 d,字符型变量只能存放一个字符。getchar()函数的值就是从输入设备得到的字符,在输入时,空格、回 车符将作为字符读入,请注意,getchar()只能接收一个字符。所以变量a被赋予1,变量b被赋予2,变量c 被赋予回车符,变量d被赋予3,所以选项C)正确。故本题答案为C)。 (18)B)【解析】本题考查了C语言的一些基本概念。printf()函数可以只有控制项而没有输出项, 例如,printf("Hello!");,所以选项A)不正确。C语言中不支持整数以十二进制输出,因此选项C)不正 确。getchar()函数从键盘读入一个字符,而不管该字符为数字还是字母,因此输入ASCII码的话,只能读 到第1个数字字符,所以选项D)不正确。故应该选择B),putchar是C语言中的库函数,使用时必须包含 stdio.h。 (19)C)【解析】本题主要对switch 语句进行了考查。switch 语句的执行过程为:进入switch 结构 后, 对条件表达式进行运算, 然后从上至下去找与条件表达式值相匹配的case, 以此作为入口, 执行switch 结构中后面的各语句, 直到遇到break 语句, 则跳出switch 语句, 如果各case 都不匹配时, 则执行default 后面的语句。本题中ch 为字符' H' ,所以case ' H' 条件中的语句将被执行,由于没有break语句,所以 case ' G' 后的语句也被执行,由于同样的缺少break 语句,所以default 后的语句也被执行了。 (20)D)【解析】本题考查的知识点是:getchar函数、putchar函数和逻辑表达式的判定。 题目要求“当读入回车符时结束循环”,所以A)、B)选项不对,又由于回车符在字符输入时表示为 \n,故本题选D)。 (21)A)【解析】本题考查的是getchar()函数。getchar()函数执行时将从键盘缓冲区中读取用户的 输入,而不管输入的是否为可打印字符。所以当输入a<回车>后,键盘缓冲区被输入的实际上是两个字符: ' a' 和' \n' 。故选项A)的说法是正确的。 (22)A)【解析】本题主要考查了字符输入输出函数getchar 和putchar 的使用。getchar 函数用来 从标准输入设备上读入一个字符,putchar(c)函数是将字符变量c 中的字符输出到标准输出设备上,并且 字符可以看作整数参与运算。

考点10答案:函数
(1)C)【解析】不论main 函数在整个过程中的位置如何,一个C 程序总是从main 函数开始执行的。 (2)A)【解析】一个C 程序可以有一个或多个程序文件,也可以有一个或多个函数,所以一个C 语 言程序可以实现多种算法。 (3)B)【解析】本题考查的知识点是:大写字母的判断。大写字母从A~Z的ASCII码是连续的,所以 如果当一个字符大于等于A且小于等于Z时,那这个字符就一定是一个大写字母,故选项C)正确。C语言中 的库函数isupper()的作用也正是判断一个字符是否为大写字母的,故选项A)正确。在ASCII码中,小写字 母的编码也是连续的,对应的小写字符比大写字符的ASCII码值大32,所以选项D)经过小写字符-32后,换 算成了对应的大写字母Z和A,所得到结果和选项C)是一致的,故也是正确的。选项B)中,C语言的逻辑表 达式不能用于判断c中的字符是否为大写字母。 (4)B)【解析】本题考查函数的一些概念。main( )函数是一个程序的主函数,它由系统调用,所以 选项A)不正确。一个C语言源程序文件可以只包含一个函数,每个源文件都可以被单独编译成.obj文件, 最后链接成可执行文件。因此每个函数都可以被单独编译,选项B)正确。一个C程序必须从主函数main( ) 开始运行,其他函数只能是直接或间接被main( )函数调用才能得以运行,因此选项C)错误。C语言不支持

函数的嵌套定义,所有函数只能是全局函数,所以选项D)错误。故应该选择B)。 (5)B)【解析】本题考查的是return语句。用户定义的函数有两种:一种是没有返回值的函数,函 数类型必须为void;另一种是有返回值的函数。在没有返回值的函数中可以没有return语句,所以选项A) 和C)是正确的;在没有返回值的函数中如果有return语句,该语句必须不带任何表达式,所以选项D)也 是正确的;用户定义的函数可以有多个return语句,但是只能返回一个函数值,所以应该选择B)。 (6)A)【解析】本题考查的知识点是:函数返回类型。有返回值函数的定义形式为: <返回类型> <函数名>(<参数列表>) { <语句序列> } 其中,<返回类型>决定了最终函数返回值的类型。故本题应该选择A)。 (7)C)【解析】本题考查的知识点是逗号表达式。因为整个逗号表达式的值为其最右边一个子表达 式的值,所以程序中传递给fun()函数的第1个实参(a++,b++,a+b)的值为a+b的值。但是,在计算a+b之前, 已经先让a和b各自加1了,所以第1个实参值为(1+1)+(2+1)=5。第2个实参c++的值为变量c自增之前的值3。 所以,函数返回的值为5+3=8。故应该选择C)。 (8)D) 【解析】本题考查了函数的定义。题目中定义的函数fun()有两个参数,一个是字符型变量ch, 另一个是浮点型变量x,函数类型是void即无返回值。选项A)调用fun的第1个参数是字符串常量与字符变 量不匹配,所以不正确。选项B)是有返回值函数的调用形式,不正确。选项C)的第1个参数是错误的字符 常量,字符常量是用单引号括起来的一个字符(是转义字符可能有多个字符),故C也不正确。选项D)使 用两个整型常量调用fun这在C语言中是允许的。因为整型到字符型可以自动转换,整型到浮点型也可以自 动转换。故应该选择D)。 (9)D)【解析】本题考查的是函数的声明。函数声明的一般形式为: 函数类型 函数名(参数类型1 [,参数名1] ,参数类型2 [,参数名2]??); 其中, 参数名也可以省略。 本题中的fun函数有两个参数, 一个类型是double型一维数组, 另一个是int 型指针。而在C语言中,一维数组用作函数参数和该数组元素的指针类型是等价的。所以本题的正确答案是 选项D)。 (10)A)【解析】本题考核的知识点是函数声明的应用。函数声明是对所用到的函数的特征进行必要 的声明,编译系统以函数声明中给出的信息为依据,对调用表达式进行检测,以保证调用表达式与函数之 间的参数正确传递。函数声明的一般格式为: 类型标识符函数名(类型标识符 形参,?); 这些信息就是函数定义中的第一行的内容。这里形参的名字是不重要的,重要的是类型标识符,函数 声明中也可以不写形参名只写该形参的声明类型, 但不能只写形参名而不写该形参的类型。 本题中, 选项A) 中double myadd(double a,b),没写出形参b的类型。 (11)D)【解析】本题考核的知识点是函数的返回值以及返回值作为函数的参数。经过分析得出函数 fun()的功能是比较形参x和形参y的大小,返回较小的一个。函数fun()有两个参数。本题中,首先定义了 三个整型变量a、b和c,分别赋初值为9、8和7。然后执行函数fun(fun(a,b),fun(b,c))。在该函数中分别 将fun(a,b)和fun(b,c)函数的返回值作为该函数的两个实参。在函数fun(a,b)中,由于a>b,故返回较小值 b即8,在函数fun(b,c)中,由于b<c,故返回较小值c即7,因此调用函数fun(fun (a,b),fun(b,c))返回8、 7中较小者7。 (12)B)【解析】由于在main( )函数中,变量i=4,所以就调用fun(4),则输出“m=4 k=4”。然后 变量k增1 等于5,变量i 增1 等于5,所以main( )函数的“printf("i=%d k=%d\n",i,k);”语句输出“i=5 k=5”。 (13)A)【解析】本题考查的是函数的综合应用。程序开头定义了两个函数f1()、f2(),每个函数都 只有一条语句,在f1()中是“如果x>y则返回x否则返回y”,即返回两个参数中较大的那一个,f2()则正好

相反,返回较小的。主函数的语句e=f2(f1(a,b),f1(c,d));是使用两次调用f1()函数的返回值作为f2()函 数的参数,并将f2()的返回值赋给变量e。a、b中较大的数是a为4,c、d中较大的数是c为5,4和5中较小的 数是4,所以结果e=4。同理可以推出f=3,那么g=a+b+c+d-e-f=4+3+5+2-4-3=7。故本题应该选择A)。 (14)C)【解析】本题考查的是函数的嵌套调用。在fun1()函数中只有一条return语句,返回的是表 达式a*=a的值,该值等于a*a。但是,由于fun1()函数的返回值类型被定义为int,所以返回值被取整,即 fun1()函数实现的是求一个双精度数平方的整数部分。在fun2()函数中,分别对两个参数调用fun1()函数, 然后将两个返回值相加、取整后返回。所以,程序执行后, w中的值是[1.1 ]+[2.0 ] = 1.21+4.0 = 5.21 (int代表截尾取整)。又因为w被定义为double型,所以变量w中的值应该为一个双精度值5.0。 (15)D)【解析】本题考查的知识点是:函数的形参和实参。在定义函数时函数名后面括弧中的变量 名称为“形式参数”(简称形参),在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一 个表达式)称为“实际参数”(简称实参)。C语言规定,实参变量对形参变量的数据传递是“值传递”, 即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的 单元。故本题应该选择D)。 (16)C)【解析】本题考核的知识点是函数参数的传递。由于调用函数时是进行值传递的,即将实参 x、y、z传给形参v和w,以后形参和实参再无联系,故通过if语句调用f()函数后,x、y和z的值并没有改变。 故最后输出的x、y和z的值为1、3和2。 (17)A)【解析】本题考查的是函数的实参。函数在被调用时,传入的实参以逗号分隔,实参可以是 一个变量,也可以是一个表达式。在本题中,func()函数传入的参数是被逗号分隔的3个表达式,它们分别 是f2(v1, v2)、(v3, v4, v5)和(v6, max(v7, v8)),所以它的实参个数是3。其中,f2(v1, v2)是一个函 数调用;(v3, v4, v5)是一个逗号表达式;(v6, max(v7, v8))也是一个逗号表达式,它里面甚至还包含了 一个函数调用,但这并不影响它只代表1个实参这个事实。故本题应该选择A)。 (18)A)【解析】本题考查的是函数参数的传递。在C语言中,参数传递默认为传值,即改变函数中 的形参不会影响调用函数时传递给函数的实参。所以,题目中的fun()函数,看起来好像作用是交换两个参 数的值,其实它并不影响传递给它的任何实参,即调不调用它对程序一点也没有影响。所以主函数一开始 初始化了c[10]为{1,2,3,4,5,6,7,8,9,0},经过第1个for循环后,什么变化都没有,再经过第2个for循环 原样输出,故应该选择A)。 (19)A)【解析】函数调用相当于f(2,3),程序运算应得结果为“-1”。
2 2

考点11答案:地址和指针
(1)D)【解析】“&”是求址运算符,“*”是指变量说明符。选项A)、B)应改为scanf("%d",p); 选项C)中指针变量p未指向一确定的内存单元,不能为其赋值,并且这样做很危险,建议不使用。 (2)D)【解析】本题考查的知识点是:指针的声明及赋值。可以赋给一个指针的必须是一个和该指 针同类型的指针。所以,本题中选项A)赋给指针一个整数1024是错误的;选项B)赋给指针一个浮点型变 量也是错误的。又因为,指针声明的一般形式为:<数据类型> *<变量名>;。所以,选项C)中声明的p不是 一个指针,因此也是错误的。故本题应该选择D)。 (3)B)【解析】本题考查的是指针的运用。语句int x=0, *p=&x;定义了一个int型变量x并初始化 为0,同时还定义了一个int型指针p指向变量x。语句printf("%d\n",*p);是按十进制整数格式输出指针 p 所指向的内容,即x的值0。故本题应该选择B)。 (4)C)【解析】本题考查的知识点是:函数、指针。在C语言中,指针变量是不能直接赋给一个整数 作为地址值的。因此选项C)是错误的。故应该选择C)。 (5)C)【解析】本题考查复合的赋值表达式。指针变量m 和z 分别指向整型变量y 和i,所以这两个 指针变量中存储的地址是不同的。变量x 接受的是一个关系运算的结果,因为两个地址是不同的,所以 “z==m”的判断结果为0。故本题应选C)。

(6)A)【解析】本题考查的是指针的运算。题目中定义了两个变量n1和n2,又定义了两个指针p和q 分别指向变量n2和n1。要通过指针实现n2=n1,就是要将q所指内容赋给p所指内容,即*p=*q。所以应该选 择A)。 (7)C)【解析】本题考核的知识点是指针变量的基本应用。程序中定义了两个变量a和b,并分别赋 初值为7和8,定义了三个指针变量p、q、r,并让指针p指向变量a,让q指向变量b,然后通过一个中间指针 变量r,使指针变量p和q互换,互换后p指向q所指的内容即b,q指向开始p所指向的内容即a,因此最后输出 的*p、*q的值为8、7、a、b的值没有改变仍为7、8。所以,4个选项中选项C)符合题意。 (8)D)【解析】本题考查的是指针的运算和scanf()函数。由于&a表示变量a的地址值,所以应该直 接赋给指针变量p而不是它所指向的内容,故选项A)和B)可以排除。而scanf()函数除了第1个参数为输入 项列表外,其余参数要求为对应变量的地址值,从前一条语句可以看出,指针p中存放的为变量a的地址值, 所以直接传给scanf()函数指针变量p就可以了。故应该选择D)。 (9)A)【解析】本题考核的知识点是scanf()函数和指针类型变量的简单应用。scanf()函数的功能 是进行输入数据,它是按格式参数的要求从终端上把数据传送到地址参数所指定的内存空间中,C语言允许 程序员间接地使用内存地址,这个地址是通过对变量名“求地址”运算得到的,求地址的运算符是&,得到 的地址是一种符号地址。本题中定义了整型变量a和一个指向整型数据的指针变量pa,并定义pa是一个存放 a的地址的变量。选项B)中应该将a改为&a,故选项B)不正确;选项C)应该将&pa改为pa,因为pa已经表 示存放a的地址,故选项C)不正确;选项D)中*pa=a,而不是表示a的地址,所以选项D)不正确。 (10)B)【解析】本题考查的是指针的概念。在C语言中,指针是一种特殊的变量,它存放的值是一 个内存地址。所以一个指针变量涉及三个值:指针变量所指内容的值、指针变量中存放的值、指针变量的 地址值。它们可以分别用表达式*p、p、&p来表示。题目中fun()函数的返回表达式是*p,所以选项C)、D) 不为所选,而应该是形参p所指内容的值,因为p为int型指针,所以该值是一个整数。故应该选择B)。 (11) B) 【解析】 考查格式输入语句scanf 的使用。 本题经过定义语句和赋值后, p 表示的是变量a 的 地址,*p 表示的是变量a 的值。 (12)D)【解析】本题考查的是在链表中删除结点的操作。在本题中指针p指向结点a,q指向结点b。 要 把 结 点 b 删 除 , 就 应 该 首 先 让 结 点 a 的 指 针 域 指 向 结 点 c , 即 p->next=q->next , 也 可 以 写 成 (*p).next=(*q).next,然后释放结点b,即free(q)。所以,4个选项中,只有D)满足题意。 (13)A)【解析】本题考查的知识点是:while循环的简单应用。aaa()函数中,首先定义了一个字符 指针t指向形参s,然后通过一个while循环让指针t不断递增,直到t指向字符串结束标志处。当t指向结束 标志处时,由于后缀++运算符的原因,它还会被再递增1,所以接下来的t--;语句让它回到结束标志处。最 后返回t-s,因为s还是指向字符串第1个字符处,而t指向了字符串结尾,故返回值为字符串的长度值。 (14)C)【解析】本题主要考查的是函数参数的传递。在C语言中,函数参数的传递是“传值”的, 即复制一份实参给形参,形参和实参是完全没有关系的两个变量。所以在函数内部改变形参变量,并不会 影响到函数外部的实参。要实现“传址”调用,必须通过指针。因为将实参指针内容复制给了形参指针后, 两个指针变量虽然没有任何关系,但它们指向的却是同一个内存地址,当改变形参指针所指向的那个内存 地址的内容时,实参指针所指向的内容也就同时被改变了,从而实现了“传址”调用。但是,并不是说只 要函数参数是指针,那肯定就是“传址”调用。故选择C)。

考点12答案:数组
(1)B)【解析】选项A)中,定义的初值个数大于数组的长度;选项C)中,数组名后少了中括号;选 项D)中,整型数组不能赋予字符串。 (2)D)【解析】本题考查的是一维数组的定义。C语言规定,在定义数组时数组名后的方括号中必须 是常量表达式,不能包含变量。因此,选项D)中用变量n来定义数组的大小是错误的。故应该选择D)。 (3)A)【解析】C语言中[ ]比*优先级高,因此line 先与[5]结合,形成line[5]形式,这是数组形

式,它有5个元素,然后再与line 前面的“*”结合,表示此数组是一个指针数组,每个数组元素都是一个 基类型为char的指针变量。 (4)C)【解析】本题考查的是数组的基本概念。在C语言中,除字符数组外,一个数组不能通过数组 名对数组进行整体引用, 因此选项A) 是对的。 数组名中存放的是一个地址常量, 它代表整个数组的首地址, 因此选项B)是对的。C语言程序在运行过程中,系统不自动检验数组元素的下标是否越界,因此选项C)是 错误的。C语言规定可以通过赋初值来定义数组的大小,这时数组说明符的一对方括号中可以不指定数组的 大小,因此选项D)也是正确的。所以,4个选项中选项C)符合题意。 (5)A)【解析】函数func的功能是将第一个参数所指向的内容与6的和赋给第二个参数数组中的第一 个值。 (6)C)【解析】本题主要考查的是一维数组的定义和引用。前一个for循环,每次执行c[s[i]]++;, 它的功能就是,以数组s中的12个元素为下标,对数组c中的元素进行增1操作。s的数值中,共有4个1、3 个2、3个3和2个4。所以,循环结束后,数组c的内容是{0, 4, 3, 3, 2}。后一个for循环,从数组c下标为 1的元素开始,循环输出后面的4个元素。所以,最终输出结果是4 3 3 2,应该选择C)。 (7)D)【解析】在C语言中,定义一维数组的语句一般形式如下:类型名数组名[常量表达式];一维数 组的引用形式为:数组名[下标表达式]count 表示能被2 整除或被5 整除的个数, i 则计算有多少个数组元 素。 (8) A) 【解析】 本题考核的知识点是数组的定义、 赋初值以及函数调用的组合应用。 本题中函数sum(int *a)的作用是:将形参a所指的数组中的第二个元素的值a[1]赋给第一个元素a[0]。主函数中定义一个长度 为10的整型数组并赋初值,接着执行一个for循环,该循环共执行了3次。当i=2时,调用函数sum(&aa[2]), 主函数中将&aa[2]作为实参传给形参a, 所以此时形参a所指的数组的第一个元素和第二个元素分别为aa[2] 和aa[3], 故执行完该函数后将aa[3]的值赋给aa[2], 即aa[2]=aa[3]=4, 当i=1时, 同理aa[2]的值赋给aa[1], 即aa[1]为4,i=0时,将aa[1]的值赋给aa[0],因此应选A)。 (9)A)【解析】本题考核的知识点是一维数组的定义,初始化和数组中元素的引用。函数f()的作用 是形参a为偶数的时候返回0,主函数中首先定义了一个长度为8的一维数组,然后给它赋初值使得s[0]=1、 s[1]=3、s[2]=5、s[3]=2、s[4]=4、s[5]=6。其他没有赋值的数组元素将自动赋值为0。for循环中,当s[i] 不为偶数时, 将s[i]相加, 即当i=3时, s[i]=2为偶数, 退出循环, 此时d的值为d=s[0]+s[1]+s[2]=1+3+5=9, 因此最后输出的d的值为9。所以,4个选项中选项A)符合题意。 (10)D)【解析】主要考查了一维数组的定义、初始化及元素的引用方法。第5 行代码中scanf 输入 数据时,要求输入项为地址,而数组名即为数组的首地址,所以不应该再在前面加取地址符号&。 (11)B) 【解析】在一维数组中要注意的是作为下标表达式的常量表达式的值必须大于等于0,选项B) 中定义有5个元素,但赋值时有6个元素,所以是错误的。 (12)D)【解析】通过赋初值的方式给一维数组赋字符串,可以用给一般数组赋初值的相同方式给一 维字符数组赋字符串,也可以在赋值时直接赋字符串常量。选项B)和C)后面的'\0'是多余的,在C 语言 中,系统会自动在字符串的结尾处加上一个字符'\0' 作为串的结束标记。 (13)B)【解析】本题首先定义了一个数组a并初始化。然后用数组名a作为实参调用函数f()。在f() 中,只有一个for循环,循环变量i从0递增至4,共循环5次,而每次执行的语句是(*q)++;,即让形参q所指 内容连续增1了5次。 所以调用结束后, 数组a的第1个元素被加5, 故输出的结果为6,2,3,4,5,。 应该选择B) 。 (14)C)【解析】本题主要考查的是函数。在fun函数中,首先将形参n1和n2分别赋给局部变量i和j, 然后使用while循环,交换s[i]和s[j]的内容,并使i增1、j减1,直到i不小于j为止。所以该函数实现的功 能是:对形参指针s所指的一系列元素,从第n1位到第n2位进行逆序。主函数中,连续调用了3次fun函数, 依 次 对 数 组 a 的 第 0~3 位 、 第 4~9 位 和 第 0~9 位 进 行 了 逆 序 。 对 0~3 位 逆 序 后 , 数 组 a 的 内 容 是 {4,3,2,1,5,6,7,8,9,0} ; 再 对 4~9 位 逆 序 后 是 {4,3,2,1,0,9,8,7,6,5} ; 最 后 对 0~9 位 逆 序 后 是 {5,6,7,8,9,0,1,2,3,4}。 (15)B)【解析】本题考查的是一维数组的定义及初始化。定义并初始化一维数组的一般形式如下:

类型名

数组名[常量表达式] = {初始化列表};

当使用初始化列表初始化数组时,需要注意以下几点:初始化列表项的个数必须小于等于常量表达式 的值,因此选项A)是错误的;常量表达式可以省略,但不能省略其外面的中括号,因此选项C)是错误的; 当类型名为char时,{初始化列表}可以用一个字符串常量来代替,由于字符串常量必须以' \0' 结尾,所 以此时的初始化列表项的个数是字符串常量的长度加1, 选项D) 的类型是int, 不能使用字符串常量初始化, 所以D)错误。 (16)C)【解析】函数fun的功能是求数组的n个元素之和。fun(a,5)=15。由于sum是静态局部变量, 所以保持15不变,fun(b,4)=45,所以s=fun(a,5)+fun(b,4)=60。 (17)C)【解析】本题考查的是数组。在C语言中,数组的下标是从0开始的,所以它的上限是数组元 素个数减1。如果超过这个范围来引用数据元素就会溢出,造成运行时错误。本题的数组m有5个元素,所以 它的下标范围是0~4。选项A)--i的值为3,在范围内,不会出错;选项B)2*2的值为4,在范围内,不会出 错;选项C)m[0]等于5,超出范围,所以错误的是C);选项D)m[i]的值,也就是m[4]的值为1,在范围内 不会出错。故本题应该选择C)。 (18)B)【解析】本题考查的是标准输入函数scanf()的运用。scanf函数的第一个参数是格式控制字 符串,该字符串中所出现的格式控制符必须与scanf函数的第二个及其后面的参数一一对应。本题中4个选 项的格式控制字符串都是“%d%s”,其中包括两个格式控制符%d和%s,它们分别表示输入一个十进制整数 和输入一个字符串,其对应的参数应该分别为一个整型变量的地址和一个字符型数组的首地址。变量的地 址可以通过对变量做取地址(&)运算来得到,而字符型数组的首地址则可以直接通过数组名来得到。所以, 4个选项中选项B)符合题意。 (19)D)【解析】本题考查了数组名的概念。在C语言中,数组名类似于一个指向数组首地址的指针 常量, 一旦定义就不能修改其内容。 所以本题中的s+=2;语句让数组名s的内容加2是错误的, 编译无法通过。 故应该选择D)。 (20)D)【解析】本题考核的知识点是指针变量的赋值。本题中定义了一个整型数组a和一个整型指 针变量p。选项A)中将一个整型数赋值给一个指针变量,C语言规定,只能将地址赋给指针变量,故选项A) 不正确;选项B)中a[5]为一数组元素,同样不是一个地址,故选项B)不正确;选项C)中a[2]为一数组元 素,同样是一个整型数据,不是个地址,故选项C)不正确:选项D)中数组名a代表数组首地址加2,代表 第三个元素的地址,故选项D)正确,所以,4个选项中选项D)符合题意。 (21)B)【解析】本题考查的是通过指针引用数组元素。本题首先定义了一个包含5个double元素的 数组x,并定义了一个double指针p指向了该数组。*p表示取p所指地址的内容,即x[0]的内容,所以选项A) 正确;*(p+1)表示取p+1所指地址的内容,即x[1]的内容,所以选项C)正确;*x表示取x所指地址的内容, 在C语言中,数组名其实也是一个指针,只不过它所指向的地方不能被改变,所以*x等价于x[0],所以选项 D)也是正确的。 因为x数组包含5个元素, 所以它的下标范围是0~4, 故选项B) 的x[5]溢出了, 应该选择B) 。 (22)C)【解析】统计1~9 九个数中的奇数和,此题考查指向数组的指针。C 语言规定数组名代表数 组的首地址,也就是第一个元素的地址。因此 *(t+i) 代表数组的第 i+1 个元素。程序运行的结果是 1+3+5+7+9=25。 (23)D)【解析】在本题中,主函数在调用fun()函数进行排序时,传递的参数是c+4 和6,fun()函 数实现的功能是将数组c 的第5 个元素开始的6 个元素依次进行从大到小的顺序排列。 排序之后, 数组c 的 内容变为{1,2,3,4,9,8,7,6,5,0}。 (24)C)【解析】该题稍微难一点。主要要搞清楚以下几点:定义了一个指针数组char *p[2]后,程 序中第一个循环for(i=0;i<2;i++)p[i] =ch[i];的作用,是使指针数组的p[0]元素(它本身是一个指针) 指向了二维数组ch 的第一行字符串,并使指针数组的p[1]元素指向二维数组ch 的第二行字符串,这样, 就使指针数组p 和二维数组ch 建立起了一种对应关系, 以后对二维数组ch的某个元素的引用就有两种等价 的形式:ch[i][j]或p[i][j]。对二维数组ch 的初始化,使其第一行ch[0]中存入了字符串“6937”,第二 行ch[1]中的内容为字符串 “8254” 。 程序中第二个循环中的循环体s=s*10+p[i][j]-'0' ;的功能是这样的,

每执行一次,将s 中的值乘以10(也即将s 中的数值整体向左移动一位,并在空出来的个位上添一个0), 再将当前p[i][j]中的字符量转换为相应的数字,然后把这个数字加到s 的个位上。注意到内层循环的循环 条件p[i][j]>'\0' 是指p[i][j]中的字符只要不是字符串结束标志'\0' 就继续循环, 语句j+=2;是使下标j 每次增加2,也即一个隔一个地从p[i]所指向的字符串中取出字符。经过上述解析后,不难看出,该程序首 先从p[0]所指向的字符串“6937”中一个隔一个地取出字符,分别是'6' 和'3' ,然后从p[1]所指向的字 符串“8254”中一个隔一个地取出字符,分别是'8' 和'5' ,同时经过转换和相加运算后,结果s中的值应 该是6385。 (25)C)【解析】本题考查的是指针的运用。题目首先申请了一个整型数组a,并让一个指针变量p 指向数组的元素a[1]。然后使用一个for循环,循环变量x从1递增到2,即循环两次。在循环体中每次让y 累加p[x]的值,而p[x]写成指针形式就是*(p+x)。所以两次y加的值分别是a[2]和a[3]的值,故最终输出 6+8=14。应该选择C)。 (26)B)【解析】本题考核的知识点是函数调用中值传递和地址传递。函数间的参数的传递有两种情 况,第1种情况变量作为形参时的参数传递,变量作为形参时,要求对应的实参应为变量或表达式,变量作 为函数的参数其传递方式是“值传递”,该种情况下,形参被赋值为实参的值,然后实参与形参再无联系, 也就是说对形参的改变将不再影响实参;第2种情况是地址或数组名作为形参时的参数传递,该种情况下对 形参的改变将对实参产生影响。本题中函数swap1()是传递的地址。所以对该形参c的改变将影响实参,分 析可知该函数的作用,是使数组c的第一个元素和第二个元素的值互换,swap2()传递的是值,形参互换后 不会影响实参,所以输出结果为5 3 3 5。 (27)A)【解析】本题考查的是数组和函数。sum()函数接收一个int型数组作参数,也可以把它看做 是一个int型指针, 语句a[0]=a[-1]+a[1];的意思就是将参数指针指向内容的前一个元素和后一个元素的值 相加放到指针所指的位置。因此,主函数中调用sum(&a[2]);的意思就是让a[2]=a[1]+a[3];,所以最后输 出的结果是6。应该选择A)。 (28)C) 【解析】本题考查的是数组名的概念。当数组名出现在表达式中时,它类似于一个指针常量, 该指针始终指向该数组第1个元素的位置,它的指向不能被改变。但它又与普通的指针常量有所区别:对数 组名使用sizeof运算符时,得到整个数组所占内存的大小;而对于指针常量,在 TC中返回的始终是2(TC 中,一个指针占2个字节的内存)。所以,要获得数组t的第i个元素的内容,既可以使用常规的t[i]表达式, 也可以将数组名t看作一个指针常量,使用表达式*(t+i)来获取数组t的第i个元素的内容。在本题中,for 循环会循环5次,循环变量i从0开始每次增加2,所以s=t[0]+ t[2] + t[4] + t[6] + t[8]=25。 (29)B) 【解析】本题主要考查的是:数组名用作函数参数。数组名用作函数参数的情况类似于指针, 属于传地址,故对形参数组元素的修改会同时修改实参。本题中,f()函数通过一个for循环语句,将传入 数组的元素从下标2到下标5每个各自乘以2。因此,调用结束时,数组a中的内容为 {1,2,6,8,10,12,7,8,9,10},故本题应该选择B)。 (30)C) 【解析】本题考查的是考生的代码阅读能力。先看sort()函数,它没有返回值,有两个参数, 一个int型数组和一个int型变量。在函数中是一个二重循环,外循环变量i从0递增到n-2,内循环变量j从 i+1递增到n-1。内循环体是一条if语句“如果a[i]<a[j]就把两个值交换”。这是一个典型的从大到小选择 排序算法,排序的范围是 a[0]~a[n-1] ,一共 n 个数排序。主函数中定义了一个数组 aa[10] ,然后调用 sort(aa+2, 5);的意思是将aa[2]~aa[6]范围的5个数据从大到小排序。 (31)B)【解析】本题考核的知识点是二维数组的定义。选项A)中省略了第一维的长度,在C语言中 是不允许的,故选项A)错误;选项C)也是省略第一维的长度;选项D)中定义了一个2行3列的数组,而在 赋值的时候却赋了一个3行的值给它,显然不正确,故选项D)错误,所以,4个选项中选项B)符合题意。 (32)A)【解析】题目中首先定义了一个二维数组a,并初始化为: |1 4 3 2| |8 6 5 7| |3 7 2 5|

|4 8 6 1| 然后通过三重循环对数组a实行按列排序。从if (a[j][i]>a[k][i])“当前面的元素大于后面的”则交 换可以看出,排序是从小到大的,所以排序结束后,数组a的内容应该是: |1 4 2 1|小 |3 6 3 2|∣ |4 7 5 5|↓ |8 8 6 7|大 最后通过一个for循环,依次输出:a[0][0],a[1][1],a[2][2],a[3][3]的值,即输出1,6,5,7。 (33)D)【解析】本题主要考查的是二维数组的运用。本题定义的二维数组a[2][3],其下标范围分 别是0~1和0~2。因此,选项A)、B)和C)都不正确。选项D)中,表达式1>1的值是“假”,可以被看做整 数“0”,表达式!1的值也是“假”,所以整个a[1>1][!1]就是a[0][0],这是对a数组元素的正确引用,故 应该选择D)。 (34)D)【解析】C 语言中数组下标是从0 开始的,所以二维数组a[2][3]的第一维下标取值为0、1; 第二维的下标取值为0、1、2,因而选项A)、B)、C)都是错误的,选项D)表示数组元素a[0][0]。 (35)B)【解析】本题考查的是for循环与二维数组的定义和引用。当定义二维数组的初始化列表只 使用一重花括号时,其中的每个值依次代表从第1行的第1个元素起,直到第1行满,接着代表第2行、第3 行??的每一个元素。程序中的循环将循环3次,循环变量i的值分别是0、1、2,所以3次循环中输出的数 分别是:t[2-0][0]、t[2-1][1]、t[2-2][2],即t[2][0]、t[1][1]、t[0][2],所以最后输出的结果为3 5 7。故应该选择B)。 (36)B)【解析】本题主要考查的是scanf()函数的输入原理。scanf()函数执行时,先从键盘缓冲区 中读取用户输入的数据,若缓冲区为空或输入数据少于所需数据,则暂停程序等待用户的输入,直到用户 输入回车符,scanf()将继续到键盘缓冲区中读取输入,如此反复直到满足scanf()函数所需数据,程序才 继续执行下面的语句,而scanf()没有取完的数据仍然会保存在键盘缓冲区内,到程序结束时还没取完就会 被释放掉,不会影响其他的程序运行。另外,scanf()函数将取到的数据匹配给第2个及其后面的指针参数 所指的内存地址中。 (37)B) 【解析】本题考核的知识点是二维数组的定义及初始化。在定义一个二维数组同时初始化时, 其第一维的长度可以省略。二维数组的初始化列表可以只使用一重花括号,其中的每个值依次代表从第1 行的第1个元素起,直到第1行满,接着代表第2行、第3行??的每一个元素,若第1维长度没有省略,则这 些值总个数不得超过两个维度的乘积。故选项A)和D)是正确的。二维数组的初始化列表还可以使用二重 花括号括起来,其中每一个内花括号代表一行的值,在内花括号中值的个数不得超过数组第二维的长度, 若不足第2维长度,则该行多出部分值被初始化为0,若第一维省略,花括号的个数代表行数。B)选项第一 维为2,故只有两行,但有三个花括号超出了行的要求,所以B)错误。 (38)C)【解析】本题主要考查的是二维数组的定义和初始化。在定义多维数组时,如果有初始化列 表,则可以省略最左边的维数,而其他维数不能被省略,二维数组也不例外。因此选项C)是错误的。 (39)B)【解析】本题考核的知识点是二维数组的定义、初始化和指针的应用。本题中首先定义了一 个字符串数组并初始化,初始化后使得str[0]= "China",str[1]="Beijing",然后定义一个指针变量p并 让其指向str, 而在该二维数组中定义每个字符串的长度为10所以p+10将指向str[1], 因此最后输出*(p+10) 的值为Beijing。所以,4个选项中选项B)符合题意。 (40)B)【解析】本题考查的是二维数组的定义、赋初值和对二维数组元素的引用。分析程序可知, 函数fun()中的for循环作用, 是将数组前4行中的对角线上的元素, 即a[0][0]、 a[1][1]、 a[2][2]和a[3][3] 分别赋到 b[0] 、 b[1] 、 b[2] 、 b[3] 中。在主函数中首先定义了一个 4 行 4 列的二维数组 x ,并初始化为 {{1,2,3},{4},{5,6,7,8},{9,10}}。然后调用fun()函数,将x的对角线元素赋给一维数组y。接着通过循环 输出数组y中的值。从数组x的初始化列表中我们可以看出,这4个值依次为1,0,7,0。 (41)C)【解析】本题主要考查的是用二维数组首地址和下标来引用二维数组元素的方法。通过分析

可知,程序中的双重循环定义了一个如下的二维数组: 0 1 2 2 3 4 4 5 6 由于数组的下标是从0 开始的,所以二维数组元素a[i][j]表示的是二维数组a 的第i+1 行、第j+1 列 对应位置的元素。 (42)C)【解析】本题考查的知识点是:二维数组和指针数组。无论一个数组有多少维或者是否含指 针类型,该数组最终都可以被看做一个比较特殊的一维数组。例如本题中的int a[2][3]可以看作元素为 int[3](即包含3个int型元素的一维数组),包含2个这样元素的一维数组;而int *p[3]则可以看作元素 为int*,包含3个这样元素的一维数组。选项A)中,p为数组名,其值是不能被改变的,故非法;选项B) 中,p[0]的类型是int*,而a是二维数组名(类型为int[ ][3]),两者无法赋值,故非法;选项C)中,p[0] 为int型指针,&a[1][2]为元素a[1][2]的地址,所以选项C)符合题意。 (43)B)【解析】本题考查的是指针数组的运用。pk是指针数组名,是一个常量,不能被赋值,因此 选项A)和C)都不正确。pk中的元素是int型指针,而二维数组名是指向一维数组的指针常量,即行指针, 两者之间不可隐式转换,所以选项D)的赋值是错误的。故应该选择B)。 (44)C)【解析】本题考核的知识点是二维数组的定义和指针数组的基本概念。本题中首先定义了一 个3行2列的数组a, 一个长度为3的指针数组p, 接着把地址a[1]赋给p[0]此时p[0]为a[1][0]的地址, p[0]+1 为a[1][1]的地址,故*(p[0]+1)代表的元素为a[1][1]。所以,4个选项中选项C)符合题意。 (45)B)【解析】本题考查的是通过指针引用二维数组元素。通过一维数组名或指向一维数组元素的 指针来引用数组元素有两种写法:a[i]和*(a+i),它们是等价的。这是一种运算符之间的等价转换,就好 像a-(b-c)等价于a-b+c一样。 知道了这种转换, 我们可以将之扩展到二维数组甚至任意维数组上来。 因为[ ] 运算符的结合性是从左至右的,所以w[i][j]等价于(w[i])[j],此时可以先将任意一个[ ]运算符转换为指 针形式为:(*(w+i))[j]或*(w[i]+j),或者同时转换:*(*(w+i)+j)。上述几种形式都完全等价于w[i][j]。 (46)D)【解析】本题考核的知识点是数组指针的应用。本题中定义了一个二维数组c和一个数组指 针p并初始化让它指向c,显然此时p中的各元素为地址,选项A)中p+1,此时的1代表的长度是整个二维数 组c的长度,p+1将让p指向c数组后面的元素,故不能引用c数组中的成员,故选项A)错误;同理,选项B) 和选项C)都不正确,选项D)中p[0]+2代表的是第一行第三个元素的地址,而*( p[0]+2)将代表第一行第 三个元素的值。 (47) B) 【解析】 本题中, a[1][2]是二维数组中的第6个元素, 对应for 循环中i 的值为5, p[5] =5+1。 (48)B)【解析】若有以下定义:int a[3][4],i,j;且0<=i<3,0<=j<4,则可以有以下几种方式来引用 数组中的第i 行、第j 列的元素:a[i][j],*(a[i]+j),*(*(a+i)+j),(*(a+i))[j],*(&a[0][0]+4*i+j) 。 (49)C)【解析】本题考查的是二维数组的定义、赋初值和对二维数组元素的引用。在fun()函数中, 首先将s[0][k]的值赋给m,然后通过for循环,遍历s[1][k]~s[n-1][k]之中的数,将遇到的比m大的数保存 到m中。 很显然, 这是搜索最大值的算法, 搜索的是s[0][k]~s[n-1][k]之间的最大值。 所以, 主函数中fun(a, 4, 0)的功能就是搜索a[0][0]~a[3][0]之间的最大值,这4个值分别是1、11、21、31,所以最终输出结果 是31,应该选择C)。

考点13答案:字符串
(1)B)【解析】' \0' 作为标志占用存储空间,但是不计入串的实际长度。当给一个字符型指针赋 值时,赋给这个指针的是这个字符串的地址。 (2)C)【解析】本题考查的是字符型一维数组的初始化。对字符型一维数组在定义时初始化,既可 以使用初始化列表,也可以使用字符串常量。不过由于字符串常量会自动在结尾添加'\0'字符做结束标志, 所以用字符串常量的初始化列表项个数是字符串的长度加 1 。因此题目中的char a[ ]="xyz"; 等价于char

a[ ]={'x','y','z','\0'};,所以a数组长度大于b数组长度,应该选C)。 (3)B)【解析】在内存中,字符数据以ASCII 码存储,它的存储形式与整数的存储形式类似。C 语 言中, 字符型数据和整型数据之间可以通用, 也可以对字符型数据进行算术运算, 此时相当于对它们的ASCII 码进行算术运算,在本题中,s++相当于s= s+1,即让s 指向数组中的下一个元素。在函数SS(char *s,char t)中,当*s==t时,*s通过运算变为大写,因此答案选择B)。 (4) C) 【解析】 考查函数的调用。 函数调用的一般形式为:函数名 (实参列表) 。 首先调用函数func1(0), 输出st[0] =h。i 值变为2,并调用函数func2(2),输出st[2] =l。i 值此时变为4,又调用函数func1(4), 输出st[4]=o。此时i 值大于等于3,执行完毕,因此,输出结果为hlo。 (5)B)【解析】本题考查的知识点是指针。程序首先定义了一个字符数组s,然后让字符指针ps指向 该数组的首地址。最后按字符形式输出*ps+4的值,即s[0]+4的值,'a'+4 = 'e'。故应该选择B)。 (6) D) 【解析】 本题考核的知识点是指针的应用。 本题中首先定义一个字符数组s, 并将字符串 “ABCD” 存到数组s中,定义了一个字符指针变量p,在接下来for循环中,循环体共执行了三次,第一次p指向s[1], 所以此时输出的p所指的字符串的值为BCD;第二次循环p指向s[2],所以此时输出的p所指的字符串的值为 CD;第三次循环p指向s[3],因此此时输出的p所指的字符串的值为D。所以,4个选项中选项D)符合题意。 (7)C)【解析】选项A)和B)定义的数组空间太小,至少应该为6 个字符的长度才可以。选项D)中 的指针s 未赋初值,所以指向一个不确定的地址,因而不能用scanf 输入数据到这一指针所指向的地址中。 (8)C)【解析】本题考查的是指针的运用。首先看swap()函数,函数中定义了一个临时字符变量t, 然后将形参指针x所指内容存入t,再将形参指针y所指内容存入到x所指内容中,最后将临时变量t的内容存 入到y所指内容中。所以该函数实现的是:交换两个字符指针所指向的内容。在主函数中,首先定义了两个 字符指针s1和s2,同时用字符串“abc”和“123”来初始化它们,此时它们指向的是两个字符串的第1个字 符。所以,在调用完swap()函数后,彼此交换了两个字符串的第1个字符,最后输出结果为1bc,a23。故应 该选择C)。 (9)A)【解析】本题主要考查的是字符数组、字符串和字符指针的一些概念。数组元素个数,是在 定义数组的时候确定的,本题的s数组元素个数是20。而字符串长度,是从该字符串的第1个字符开始,一 直到' \0' 字符为止,所历经的字符个数,' \0' 不算在内。所以本题p所指字符串("Beijing")的长度为7。 因此选项B)的叙述不正确。s是数组名,而不是指针变量,因此选项C)不正确。数组s中除了包含字符串 “Beijing”外,还包含其后的20个以内字节的内容,而指针变量p中包含的只是数组s的首地址。因此选项 D)的说法也不正确。 (10)B)【解析】本题考查用字符指针引用字符数组中的字符及对字符的操作。函数_123()的for语 句执行过程是:从字符指针str所指向的字符数组的第一个元素开始,逐一判断字符是否为‘c’,若不是, 就执行一次数组元素的赋值过程,若字符为‘c’就不执行。 (11)C)【解析】考查如何用scanf 函数输入字符串。scanf 输入字符串有一点要注意的是格式控制 串必须用%s。 (12)B)【解析】本题考核的知识点是函数gets()的应用。函数gets()的调用形式为gets(str_adr); str_adr是存放字符串的起始地址。可以是字符数组名、字符指针或字符数组元素的地址。gets函数用来从 终端键盘读入字符串(包括空格符),直到读入一个换行符为止。换行符读入后,不作为字符串的内容。 本题中定义一个长度为10的字符数组和一个指针变量b,并且通过赋值让它指向数组a。选项A)、选项B)、 选项C)和选项D)中只有选项B)中gets函数的参数a[0]不能表示数组a的首地址,故选项B)不正确。所以, 4个选项中选项B)符合题意。 (13)C) 【解析】本题考查的知识点是:输入函数。C语言提供了许多输入函数,其中有:getchar(输 入字符)、scanf(格式输入)和gets( 输入字符串)等。题目要求输入的是字符串,所以可以排除getchar, 而且要求输入的字符串中包含空格, 而scanf函数默认将输入的空格字符作为分隔符, 所以空格不会被输入, 故可排除scanf。getc的作用是从文件中输入一个字符,故也不可取。gets函数可以输入一整行作为一个字 符串,其中也包括空格字符,故应该选择C)。

(14) D) 【解析】 本题主要考查的是输入函数scanf和gets。 gets()函数的原型是char *gets(char *s);。 功能是通过键盘读入一个字符串, 并放到指针参数s所指的内存地址中。 选项A) 给gets传入的实参是&s[0], 也就是数组s的第1个元素的地址,这是合法的。选项C)传入的是数组名s,它出现在表达式中表示的是数 组的首地址,所以也是合法的。scanf()函数要求输入的参数均为地址形式。选项B)中表达式s+1,表示的 是数组首地址往后移动一位的地址,所以是合法的。选项D)直接引用数组中下标为1的元素,这是不合法 的。 (15)A)【解析】本题题意要求删除所有空格,即除了空格以外的其他所有字符都要留下。由于C 语 言中没有直接删除字符的操作,所以我们对于删除字符的操作都是采用留下字符的算法,以前的题目亦是 如此。用str[i]从串头到串尾逐一走动,每走到一个字符都判断其是否为空格,若不是空格(注意在if() 的单引号之间有一个空格),则将其保存str[j]中。注意j 的下标变化、初值及最后加串结束符' \0' 。 (16)C)【解析】本题考查了一维字符数组的定义和初始化。选项C)中str[10]初始化为空,可以不 必进行类似""的空赋值,字符数组若没有进行初始化赋值,默认的字符为空,并且定义完str 数组后,应 该用“, ”分隔而不是“.”,所以选项C)正确。 (17)A)【解析】本题综合考查字符数组的赋值和strcpy 函数的用法。C 语言不允许用赋值表达式 对字符数组赋值,如下面的语句就是非法的:str1=“China”,如果想把“China”这5 个字符放到数组str1 中,除了逐个输入外,还能使用strcpy 函数,该函数的功能是将一个字符串复制到一字符数组中。例如, strcpy(str1,"China")或strcpy(str1,str2);。注意,不能企图用以下语句来实行赋值(将str2 的值传给 str1):str1=str2;不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。strcpy 函数的结 构是:strcpy(字符数组1,字符串2)。其中,需要注意的是,字符数组1 的长度不应小于字符串2 的长度, “字符数组1”必须写成数组名形式,如(str1),“字符串2”可以是字符数组名,也可以是字符串常量, 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。 (18)A)【解析】此题考查了字符串输入函数gets 和字符串比较函数strcmp,另外还有字符输出函 数putchar。gets 从标准输入设备中读入全部字符,包括空格,直到遇到回车符为止,strcmp 是字符串比 较函数,即strcmp(字符串1,字符串2),如果字符串1 = 字符串2,则函数值为0;如果字符串1>字符串2, 则函数值为一正整数;如果字符串1<字符串2,则函数值为一负整数。putchar(c)函数将字符c 输出到标准 输出设备上。 ( 19 ) D )【解析】考查通过赋值的方式给一维数组赋初值。字符串复制函数 strcpy 调用形式 为:strcpy(s1,s2),此函数用来把s2 所指字符串的内容复制到s1 所指存储空间中,函数返回s1 的值,即 目的串的首地址;求字符串长度函数strlen 的调用形式如下:strlen(s),此函数计算出以s 为起始地址的 字符串长度,并作为函数值返回。注意这一长度不包括串的结束标志。 (20)A)【解析】本题考查的是字符串的长度。字符数组中可以存放字符串,但字符数组的长度并不 是字符串的长度,字符串的长度是指字符数组中存放的有效字符个数,即' \0' 之前的字符数。字符数组s 中依次存放的字符是:1234567和2个字符串结束标记' \0' ,故字符串的长度是7,所以应该选择A)。 (21)A)【解析】本题考核的知识点是指针数组的定义和strlen()函数的应用。本题中首先定义了一 个长度为10的指针数组,并赋初值,因此执行strlen(p[4])后的返回值为字符串“cd”的长度为2。所以, 4个选项中选项A)符合题意。 (22)C)【解析】本题考查两个知识点:strlen 函数的功能是求字符串的长度,并返回字符个数,不 计最后的' \0' ,strcpy 函数的功能是把后面的字符串复制到前面字符串所指向的空间。 (23) C) 【解析】 题目中已告知函数f()的作用是将字符串从小到大排序, 因此主函数中调用完f(p,5); 后,二维数组p中的内容为{"aabdfg","abbd","abc","cd","dcdbe"}。输出的结果是strlen(p[0]),即p中 第1个字符串的长度,所以结果是6。故本题应该选择C)。 (24) C) 【解析】 考查了测字符串长度函数strlen。 如果一个字符数组中存放一个字符串, 则函数strlen 的值为“ \0”之前的全部字符个数,也包括空格在内。 (25)D)【解析】本题考核的知识点是字符串的比较。在C语言中字符串的比较用strcmp()函数,该

函数有两个参数,分别为被比较的两个字符串。如果第一个字符串大于第二个字符串返回值大于0,若小于 返回值小于0,相等返回值为0。字符串比较大小的标准是从第一个字符开始依次向右比较,遇到某一个字 符大,该字符所在的字符串就是较大的字符串,如果遇到某一个字符小,该字符所在的字符串就是较小的 字符串。本题中要求当 s1 所指字符串大于 s2 所指串时,执行语句 S ,因此应该为 strcmp(s1 , s2)>0 或者 strcmp(s2,s1)<0,所以,4个选项中D)符合题意。 (26)B)【解析】本题首先定义了3个字符数组p、q、r,并分别被初始化。数组p指定的大小为20, 初始化列表为{'a',' b','c','d'},即只指定了前4个元素的内容,根据C语言的规定,初始化列表不足时, 其余元素均自动初始化为0。然后通过strcat()函数,将字符串r连接到字符串p之后,即执行后p中的内容 为 “123d123de” 。 因为 “strlen(q)” 表示求字符串q的长度, 很明显为3, 所以语句 “strcpy(p+strlen(q),q);” 的作用就是:将字符串q复制到数组p的第4个元素位置处。 (27)C)【解析】本题主要考查的是C语言中的数组长度和字符串长度。数组长度指的是一个数组所 占内存空间的字节数,数组长度可以通过sizeof(<数组名>)来求得;字符串长度是指从指定内存地址开始 直到碰到第一个' \0' 字符为止所经过的字符数(不包括' \0' 字符),字符串长度可以通过字符串函数 strlen(<字符串首地址值>)来求得。所以本题程序运行后,变量i中是数组a的长度7,变量j中是数组a中第 一个' \0' 字符之前的字符数2。选项C)符合题意。 (28)B)【解析】p数组内有3个元素,没有字符串结束标志所以长度不确定,q字符数组只对部分元 素赋值,其余元素则自动赋值为0,所以长度为3。 (29) C) 【解析】 本题考查的重点是复制字符串——使用strcpy()函数, 该函数的调用方式是strcpy(字 符数组, 字符串),其中“字符串”可以是字符串常量,也可以是字符数组。函数的功能是:将“字符串” 完整地复制到“字符数组”中,字符数组中原有的内容被覆盖。使用该函数时注意: 字符数组必须定义得 足够大,以便容纳复制过来的字符串。复制时,连同结束标志' \0' 一起复制;不能用赋值运算符“ =”将 一个字符串直接赋值给一个字符数组, 只能用strcpy()函数处理。 另外, 本题还考查连接字符串的strcat() 函数,其调用方式是:strcat(字符数组,字符串)。功能是把“字符串”连接到“字符数组”中的字符串尾 端,并存储于“字符数组”中。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字 符串”在操作中未被修改。使用该函数时注意: 由于没有边界检查,编程者要注意保证“字符数组”定义 得足够大,以便容纳连接后的目标字符串;否则,会因长度不够而产生问题;连接前两个字符串都有结束标 志' \0' , 连接后 “字符数组” 中存储的字符串的结束标志' \0' 被舍弃, 只在目标串的最后保留一个' \0' 。 (30)B)【解析】字符串连接函数strcat 的调用形式如下:strcat(s1,s2)。此函数将s2 所指字符串 的内容连接到s1 所指的字符串后面,并自动覆盖s1 串末尾的尾标,函数返回s1 的地址值。

考点14答案:对函数的进一步讨论
(1)C)【解析】因为fun(int x)是一个递归函数,所以主函数中fun(7)经过三次递归调用,其过程 可以描述为“fun(7)= 7-fun(5)= 7-(5-fun(3))= 7-(5-(3-fun(1)))= 7-(5-(3-3))= 7-5 =2”,所以最后 的输出结果为2。 (2)B)【解析】本题考核的知识点是函数递归调用的基本概念。在C语言中所谓函数的递归是指在调 用一个函数的过程中,又出现了直接或间接地调用该函数本身,直接调用该函数本身的称为函数递归,而 间接调用该函数称为函数的间接递归调用。显然题目中所说得函数调用为函数的间接递归调用。所以,4 个选项中选项B)符合题意。 (3)B)【解析】考查函数的递归调用。n=0 或n=1 是递归的终止条件,然后利用已知值逐步递推求 出未知值。通过传送地址值,在被调用函数中直接改变调用函数中的变量的值。 (4)A)【解析】本题考查的是递归算法的分析。一个直接或间接地调用自身的算法称为递归算法。 在一个递归算法中,至少要包含一个初始值和一个递归关系。本题的fun()函数在n等于1时返回1,而在其 余情况下返回n+fun(n-1),所以本题的递归算法可以这样来表示:

fun(n)=1 (n=1) (初始值) fun(n)=n+fun(n-1) (n≠1) (递归关系) 此时不难看出,该递归算法实现的是计算1+2+3+?+n,而且n必须大于0,否则会陷入死循环。故题目 输出的结果是1+2+3+?+10 = 55,应该选择A)。 (5)A)【解析】本题主要考查了函数参数的传递方式和递归函数。参数的传递方式有两种:传值和 传地址。它们的区别主要在于:在函数体内对形参的改变,会不会同时也改变实参。本题的f()函数,第1 个参数是传值(不会改变实参);第2个参数传递的是指针,即传地址(会改变实参)。主函数中调用f() 时m为7,由于7既不能被3整除,也不能被5整除,所以执行最后一条else子句再次调用f()函数,此时n被减 1,传入的第1个参数值为6,6能被3整除,故r1=6/3=2。函数返回,并使第2个参数所指内容为2,故本题输 出的结果是2,应该选择A)。 (6) A) 【解析】 该题考查的是递归函数的调用, 题中fun 函数进行了递归调用, 第1 次调用时:fun(3)n=3 s=3-fun(2);第2次调用时:fun(2)n=2 s=2,返回第一次调用后,s=3-2 =1。 (7)C)【解析】本题考查的是递归算法的分析。一个直接或间接地调用自身的算法称为递归算法。 在一个递归算法中,至少要包含一个初始值和一个递归关系。本题的fun()函数在x等于0或1时返回3,而在 其余情况下返回x-fun(x-2),所以本题的递归算法可以这样表示: fun(x)=3 (x=0或x=1)(初始值) fun(x)=x-fun(x-2) (x≠0且x≠1)(递归关系) 在主函数中输出的结果是fun(7),而fun(7) = 7-fun(5) = 7-(5-fun(3)) = 7-(5-(3-fun(1)))。 (8)B)【解析】本题考查的是递归函数。题目中给出的fun()函数直接调用了自身,所以是一个递归 函数。其功能是,当参数b为0时,返回参数a的值;否则返回fun(--a,--b)的值。从这里可以看出,当b不 断递减时,a也不断递减,直到b为0时返回a的值,那么a递减的总值就是b原来的值。所以,整个递归函数 的作用其实是返回a-b的值,故应该选择B)。 (9)C)【解析】本题主要考查的是递归函数。题目中的f()函数直接调用了自身,是一个递归函数。 主函数中调用f()函数时传入的参数是3,所以会跳过if语句,执行y = x*x-f(x-2);,也就是y = 3*3-f(1);, 再次调用f()函数,传入参数1,此时满足if语句的条件,返回3。所以前面的y = 3*3-f(1);就等价于y = 3*3-3;,结果是6,所以返回给主函数的结果是6。故本题应该选择C)。 (10)B)【解析】在main 函数中,对f(1)和f(2)的值进行了累加。f(1)= 1,f(2)= f(1)+1 =2最后, j 的值为1+2 =3。

考点15答案:用户标识符的作用域和储存
(1)A)【解析】在C 语言中只有自动变量和寄存器变量在使用时才占用内存单元。 (2)D)【解析】在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久的存储单元, 即使退出函数以后,下次再进入该函数时,静态局部变量仍使用原来的存储单元,静态局部变量的初值是 在编译的时候赋予的,在程序执行期间不再赋予初值。本题由于连续三次调用函数fun(),三次对静态变量 x 进行操作,x 的值应依次为6,7,8。 (3)D)【解析】函数的静态局部变量在编译时就赋初值,即只赋初值一次,在程序运行时它已有初 值,以后每次调用函数时不再重新赋值,而只是保留上次函数调用结束时的值。 (4)B)【解析】本题主要考查的知识点是静态局部变量的运用。如果在定义一个局部变量时使用了 static关键字,则这个局部变量就被定义成了一个静态局部变量。一般的局部变量随着函数被调用而诞生, 在函数返回时被销毁。而静态局部变量在函数调用结束后不会被销毁,在下一次该函数被调用时,还会保 留上一次函数调用结束时的值。本题的fun()函数中定义的变量m和i就是静态局部变量,第1次调用fun() 函数时m=0、i=2,执行i+=m+1后,i的值变为3,再执行m=i+x+y后,m的值变为5,所以第1次输出的整数是5。 第2次调用fun()函数时m=5、i=3,执行i+=m+1后,i的值变为9,再执行m=i+x+y后,m的值变为11,所以第2

次输出的整数是11。 (5)C)【解析】本题主要考查的知识点是静态局部变量的运用。如果在定义一个局部变量时使用了 static关键字,则这个局部变量就被定义成了一个静态局部变量。一般的局部变量随着函数被调用而诞生, 在函数返回时被销毁。而静态局部变量在函数调用结束后不会被销毁,在下一次该函数被调用时,还会保 留上一次函数调用结束时的值。本题中fun()函数通过一个for循环来累计形参数组x的前n个元素之和。在 主函数中,第1次调用fun(a,5)时,返回的值应该是数组a的前5个元素的和,而第2次调用fun(b,4)时,返 回的值除了本次累计的数组b前4个元素和之外,还有上次累计的数组a的前5个元素的和,所以累加结果为 60。 (6)A)【解析】本题考核的知识点是变量的生成期与作用域。静态局部变量在整个程序运行期间, 静态局部变量在内存的静态存储区中占据着永久性的存储单元。由此可知静态局部变量的生存期将一直延 长到程序运行结束。 故选项A正确; 而全局变量的只有一种静态存储类别, 故全局变量说明为static存储类, 和没有说明为static存储类其生存期都是一直延长到程序运行结束,故选项B)不正确;未赋初值的auto 型变量的初值是随机的,未赋初值的static型变量的初值是0(故选项C)和选项D)不正确)。所以,4个 选项中选项A)符合题意。 (7)D)【解析】本题考查的知识点是全局变量的作用域。全局变量的有效范围是从定义变量的位置 开始到本源文件结束。如果需要在其他源文件中使用该全局变量,则可以在其他源文件中使用extern关键 字来声明该全局变量,这样该全局变量的作用域就被扩展到以extern声明了该全局变量的位置开始到此源 文件结束。故本题的正确答案为D)。 (8)B)【解析】本题考查的知识点是:局部变量的作用域。 static说明全局变量时,此变量可称为静态全局变量,静态全局变量只限于本编译单位使用,不能被 其他单位所引用, 静态局部变量在编译时赋初值, 在程序执行期间不能赋初值, 而非不能更改, 故本题选B) 。 (9)C)【解析】本题考核的知识点是局部变量和全局变量的区别。若在函数中定义与全局变量名字 相同的局部变量,则全局变量在该函数中将不起作用。本题中定义了一个全局变量a和局部变量a。在主函 数中定义一个整型变量s并赋初值为0,接着定义了一个局部变量a并赋值为5,由于该局部变量a和全局变量 a同名,故全局变量在复合语句中将不起作用,然后调用函数f(&a)(该函数的作用是返回存储变量a的空间 中的值,并让该值加1,分析程序可知返回值为5,并让a值加1变为6),并将返回值加到s中。此时s的值为5, 然后执行该复合语句外的其他语句,同样调用函数f(&a)(该函数的作用是返回存储变量a的空间中的值, 并让该值加1,分析程序此时的a是全局变量a,可知返回值为2,并让a值加1变为3)并将返回值加到s中。此 时s的值为7。 (10) A) 【解析】 auto 变量:无static 声明的局部变量。 用auto 作存储类别的声明时, 可以不写auto, 存储类别隐含确定为auto(自动存储类别),是动态存储方式。大多数变量是自动变量。用static 声明的 局部变量是静态局部变量。函数调用结束后静态局部变量占据的内存存储单元空间不释放,局部变量保留 原值,下次调用时可以继续使用该值。用extern 声明外部变量,外部变量即全局变量,可以用extern 声 明来改变全局变量的作用域,实际上,关键字“auto ”可以省略,auto 不写则隐含确定为“自动存储类 别”,属于动态存储方式。

考点16答案:编译预处理和动态储存分类
(1)C)【解析】带参数的宏定义命令行形式如下:#define 宏名(形参表)。替换文本在编译的时候 编译预处理程序用“替换文本”来替换宏,即M(n,m)被替换为n%m,之后计算,将计算的结果赋给a。注意, 宏替换是在编译时由预处理程序完成的,函数调用是在程序运行时进行的,在函数的调用过程中需要占用 一系列的处理时间。 (2)C)【解析】考查带参数的宏替换。宏替换不像函数调用要进行参数值的计算、传递等,而只是 简单按照原格式进行字符串的替换。

(3) B) 【解析】 根据宏替换的替换规则, 我们可知, f(2)= 2*N+1=2*5+1=11,f(1+1)= 1+1*N+1=1+1*5+1=7 。 (4)C)【解析】本题考查的是带参数的宏。宏替换与函数调用不同,前者是字面上的,在编译期间 完 成 , 后 者 是 内 容 上 的 , 在 运 行 期 间 才 进 行 。 题 目 中 第 1 条 要 替 换 的 语 句 i1=f(8)/f(4); 展 开 后 是 i1=(8*8)/(4*4);,结果使i1=4。而第2条语句i2=f(4+4)/f(2+2);展开后为i2=(4+4*4+4)/(2+2*2+2); ,结 果使i2=24/8=3。故应该选择C)。 (5)A)【解析】本题考核的知识点是宏定义的简单应用。本题中首先将所有的宏替换掉,则表达式 为i=4+4*4+4/2+2*2+2,故最后输出的i的值为28。所以,4个选项中选项A)符合题意。 ( 6 ) B )【解析】本题考查的是带参数的宏。在此处需要直接替换整个式子, 2*(N+Y(5)) 即为 2*(2+((2+1)*5)),可得结果为34。 (7)A) 【解析】带参数的宏定义命令行形式如下:#define 宏名(形参表) 替换文本。首先进行M 的 宏替换,之后再进行N 的宏替换,替换后的表达式为((a)*(b))/ (c)。 (8)B)【解析】考查宏替换的使用。宏替换用“#define 宏名宏体”的形式来定义。在进行编译预 处理时,将把程序中宏定义之后的所有宏名用宏体替换。宏虽然可以带参数,但宏替换过程中不像函数那 样要进行参数值的计算、传递及结果返回等操作;宏替换只是简单的字符替换,不进行计算,因而本题中的 S(a+b)进行宏替换后为PT*1+2*1+2=5.5*1+2*1+2=9.5。 (9)D)【解析】本题考查了二维数组元素引用的方法。题中用动态存储分配函数malloc 分配了一个 int 型数据长度大小的内存, 然后指针p 指向了这段内存, 函数f()中对p 所指向的数据进行了赋值, p[1][1] 为二维数组第二行第二列的元素,对应于实参a 的元素5,所以输出结果为5。 (10)C)【解析】本题考查的是动态内存分配。题目中的fun()函数,首先定义了一个int型指针变量 p,然后动态分配一个int型大小的内存空间给它,并将它初始化为参数n的值,然后返回这个值。虽然看起 来很复杂,但其实它仅仅就是将传递给它的参数保存了一份然后返回这个值。所以在主函数中,a=fun(10) 令a变为10,然后调用printf()函数输出a+fun(10)的值,也就是10+10=20,所以应该选择C)。

考点17答案:结构体、共用体和用户自定义
(1)B)【解析】本题中,typedef 声明新的类型名PER 来代替已有的类型名,PER 代表上面指定的 一个结构体类型,此时,也可以用PER 来定义变量。 (2)B)【解析】本题中,struct ex 是结构体类型名,example 是结构体变量名。 (3) C) 【解析】 本题考查的是结构体的定义与typedef的用法。 将题目中的定义语句去掉前面的typedef 和后面的OLD(分号保留),就是一条完整的结构体定义语句,其中struct是说明符,NODE是结构体名,大 括号里面的是结构体成员的定义。此时要声明该结构体变量时需要使用 struct 加结构体名一起来声明, struct NODE一起构成一个结构体类型,就好像字符类型char。若只去掉前面的typedef,就是一条结构体 定义同时声明一个结构体变量OLD的语句,因为OLD的前面部分是struct NODE的完整写法,可以看作是定义 了一个新的结构体类型名。 (4)D)【解析】结构体变量所占用内存的字节数是其所有成员所占用内存字节数之和。本题中整型 变量i 所占用的内存是2 字节,字符型变量ch 所占用的内存是1 字节,双精度型变量f 所占用的内存是8 字节,三者相加即可。 (5)B)【解析】本题的考查点是结构体变量的定义。定义一个结构体类型的变量,可采用3种方法: ① 先定义结构体类型再定义变量名;② 在定义类型的同时定义变量;③ 直接定义结构体类型变量,即不 出现结构体名;选项B)符合第三种定义方法。故本题答案为B)。 (6)B)【解析】结构体类型的变量在程序运行期间要作为一个整体占用连续的内存单元。 (7) C) 【解析】 本题考查的是结构体的定义与typedef的用法。 将题目中的定义语句去掉前面的typedef 和后面的NEW(分号保留),就是一条完整的结构体定义语句,其中struct是说明符,ST是结构体名,大括 号里面的是结构体成员的定义。 此时要声明该结构体变量时需要使用struct加结构体名一起来声明, struct

ST一起构成一个结构体类型,就好像字符类型char。若只去掉前面的typedef,就是一条结构体定义同时声 明一个结构体变量NEW的语句,因为NEW的前面部分是struct ST的完整写法,可以看作是struct ST NEW, 声明一个变量。 (8)B)【解析】本题考核的知识点是结构体类型定义和结构体的基本概念。结构体类型的定义格式 为: strcut 结构体名 结构体名 {成 {成员说明列表}; 结构体变量的定义有3种形式: 第一种: 定义结构体型的同时定义结构体变量, 如strcut 员说明列表 } 变量;第二种:先定义一个结构体类型,然后使用该类型来定义结构体变量,如 strcut student{成员说明列表};student变量;第三种:定义一个无名称的结构体类型的同时定义结构体变量, 如strcut student{成员说明列表}变量。 (9)B)【解析】考查结构体数组对结构体成员的引用。结构体数组中对结构体成员的引用要先引用 到数组元素,然后像对待普通的结构体变量一样来对待结构体数组元素。 (10)D)【解析】考查结构体成员变量的引用方法。可用结构体变量名. 数据成员名或者结构体指针 →数据成员名两种方法来引用。 (11)C) 【解析】本题主要考查了结构体变量引用成员数据的方法,主要有以下几种:结构体变量名. 成员名或结构体指针->成员名的方法来引用结构体成员。 (12)C) 【解析】考查结构体成员数据的引用方法。通过指针来引用结构体成员的方法是(指针变量) →结构体成员名。 (13)C)【解析】本题考查的是*、->和++运算符的混合运算。要计算一个复杂的表达式时,首先要 弄明白表达式中所有运算符的优先级与结合性,本题中所涉及的运算符中,->的优先级最高,*和++的优先 级相同,但其结合性为从右至左。所以选项A)等价于*(pt->y)也就是pt所指向的结构体的成员指针变量y 所指向的内容。从前面的程序段不难看出,pt指向结构体数组c的首地址,也就是指向它的第1个元素,在 它的第1个元素中,指针变量y又被初始化为指向整型数组a的首地址,即指向数组a的第1个元素。故选项A) 中的表达式的值为a[0],也就是1。pt->x的值为10。而D)选项(pt++)->x的值为20,也不正确。只有C)选 项符合题意。 (14)B)【解析】本题的考查点是结构体变量的初始化。该题是一个对外部存储类型的结构体变量进 行的初始化。初始化后,x的值为10,y的值为100。++(p→x)中首先p→x是把p指向结构体变量s中的x成员, 此++(p→x)就相当于++x,这时x先自增,再使用,所以此时x的值为11。故本题答案为B)。 (15)C)【解析】本题考查的是结构体指针。题目一开始定义了一个结构体st,并同时声明了一个包 含两个st结构的结构体数组data,且初始化为{1,10,2,20}。主函数中,首先定义了一个指向结构体st的指 针p,并初始指向data数组的首地址。然后输出p→y和(++p)→x,其实等价于输出data[0].y和data[1].x。 从初始化列表中可以看出,这两个值分别是10和2,故应该选择C)。 (16)D) 【解析】考查对结构体成员的引用方法。结构体成员的引用可以用“结构体变量名. 成员名” 或者“结构体变量指针->成员名”两种方式来引用。 (17)D)【解析】本题考查的是结构体变量赋值。在C语言中,相同类型的结构体变量可以通过等号 直接赋值,它会将对应成员一一对应赋值。所以,本题声明并初始化了两个STU结构体变量a和b,然后将a 赋给b,最后逐个输出b的各个成员,其实就是初始化a的内容,故本题应该选择D)。 (18) A) 【解析】 本题考核的知识点是结构体类型的综合应用。 本题中首先定义了一个结构体类型STU, 它由一个字符数组和一个整型变量num组成。然后定义两个函数f1和f2。其中f1是值传递的,f2是地址传递 的。主函数中定义两个结构体变量a和b并分别赋初值,接着调用函数f1(a),由于函数f1是值传递,故执行 该函数后并没有改变a的值,在接着调用函数f2(&b),由于该函数是地址传递,执行该函数后将使变量b的 值为{"SunDan",2044},故函数最后输出的a.num和b.num的值为2041和2044。所以,4个选项中选项A)正 确。

(19)D)【解析】本题主要考查的是:结构体用作函数参数。结构体变量用作函数参数时,是将实参 复制给被调用函数的形参,即传值。因此,本题中的f()函数对传入参数的修改不会影响到外面的实参,即 a的内容还是{1,2},故本题应该选择D)。 (20)A)【解析】本题考查的是结构体变量用作函数参数。结构体变量用作函数参数时是传值调用, 即在函数内部无论怎样修改形参结构体变量的内容,都不会影响到调用函数时传递给函数的实参结构体变 量。因此,本题的f()函数没有任何实际作用,它改变不了什么内容。故本题的结果是定义结构体c时给出 的初始值,应该选择A)。 (21)D)【解析】本题考查的是指针的应用。解本题的关键是理解题目中的要求“将q和r所指结点交 换前后位置,同时要保持链表的连续”。我们不妨先想想交换后的样子,应该如下例: data next data next ? → A → ↑ p C → ↑r data next B → ? ↑q

然后比较一下交换前的样子,我们会发现,其中需要改变的指针只有3个。 (22)D)【解析】本题考查的是C语言中结构体与链表。本题中是一个含有两个结点的循环链表。C 语言中结构体的定义为: struct 结构体类型名 { 成员项表; }; (23)A)【解析】本题的考查点是指向结构体变量的指针以及用指针处理链表。一个结构体变量的指 针就是该变量所占据的内存字段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指 针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组的元素。在C语言中,q→next 相当于(*q).next。即q所指向的是结构体变量中的next成员。链表是一种常见的重要的数据结构。它是动 态地进行存储分配的一种结构。它根据需要开辟内存单元。链表中的各元素在内存中可以不是连续存放的。 所以必须利用指针变量才能实现。 即一个结点中应包括一个指针变量, 用它存放下一结点的地址。 r→next=q 表示让q指向新开辟的结点,r指向链表中最后一个结点,把r所指的结点连接在q所指的结点后面。同样,p →next=r表示让r指向新开辟的结点,p指向链表中最后一个结点,把p所指的结点连接在r所指的结点后面。 那么在A中,执行r→next=q后,r→next指向了q。此时第2句相当于q→next=q;,所以q的下一个结点指向 了自己,而不是指向原来r的下一个结点。故本题答案为A)。 (24)D)【解析】选项A),共用体的每个成员的起始地址都相同;选项B),共用体变量所占的内存 长度等于最长的成员的长度;选项C )因为每个成员的起始地址相同,所以整型数 5 以浮点型输出时为 5. 000000;选项D)C 语言规定,不能把共用体变量作为函数的参数。 (25)B)【解析】本题对共用体的使用进行了考查。由于共用体所有成员共同占据一段存储空间,所 以对成员变量的赋值,后面的赋值会覆盖掉前面的赋值,因为s. income =1000;是最后一次成员变量赋值, 变量age 与变量income 共同占据一段存储空间,所以age 的值也为1000。

考点18答案:位运算
(1)C)【解析】考查位运算的运算原理。<<为左移运算符,运算符的左边是移位对象;右边是整型表 达式,代表左移的位数,左移时,右端(低位)补0;左端(高位)移出的部分舍弃。 (2)C)【解析】本题考查的是左移运算。因为计算机中的数据都是以二进制形式存放,而位移运算 其实质就是将这些二进制左移或右移若干位,如果不考虑溢出的话,每左移1位其实就等价于对原数乘以2, 右移1位就等价于对原数除以2。这就好像在现实的十进制中,如果我们将100左移1位,结果是1000,是不 是大了10倍?将100右移1位,结果是10,结果等于1/10了。所以,本题中a<<1的结果是4*2=8,因为8不会

超过char类型的表示范围,所以输出结果为8,应该选择C)。 (3)D)【解析】本题考查的是位运算。因为任何数在计算机中都是以二进制的形式存在的,而位运 算就是直接针对一个数的二进制位来进行的一些操作。题中的表达式b<<2意思是将b的二进制位往左移动2 位,b的原值为2,即二进制的00000000 00000010。往左移动2位后应该变为00000000 00001000,即十进制 8。不难看出每往左移动1位,就相当于在原值的基础上乘以1个2,但这也不一定准确,因为还要考虑往左 移出去的那些位。接下来是a^8,^是按位异或运算符,简单来说就是比较参与运算的两个数相应的二进制 位,若两个位相同则结果为0,否则其结果为1。 (4)B)【解析】本题考查的知识点是:右移运算。根据右移运算的原理,右移一位相当于操作数缩 小为原来的1/2,故本题选B)。 (5)C) 【解析】本题考查的是对位与运算符&的理解。位与运算是将两个运算分量看作两个二进制数, 然后对两个二进制数的相应位进行与运算,若同时为1则结果相应位为1,否则结果相应位为0。因此,当两 个运算分量相同时,它们的相应位肯定也相同,即不同为1就同为0。所以得到的结果和运算分量也相同。 所以,4个选项中选项C)符合题意。 (6)B)【解析】本题考查的是对位与运算符&的理解。0x13的二进制数是00010011,0x17的二进制数 是00010111,由位与运算规则,得到结果为00010011,即0x13。 (7)B)【解析】本题考查的是位与运算&,运算符的作用是:当两个运算分量的对应二进制位如果都 是1,则结果对应二进制位为1,否则为0。计算2&3的结果为2。 (8)B)【解析】本题考查两个位运算符。按位异或运算符“^”是双目运算符,其功能是参与运算的 两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。左移运算符“<<”是双目运算符,其功 能是把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃, 低位补0,并且“<<”运算符的优先级高于“^”。 (9)A)【解析】本题考查的是位运算。“^”是按位异或运算,当对应位上的二进制数值相同时,异 或的结果为0,对应位上的二进制数值不同时,异或的结果为1,因为c1、c2的值相同,所以异或的结果为0, 所以A)为正确答案。 (10)A)【解析】本题主要考查的是位运算。选项A)中“^”运算符的作用是:按位异或。即两个运 算分量的对应二进制位如果相异,则结果对应二进制位为1,否则为0。所以,01011101^11110000的结果是 10101101。选项B)中“|”运算符的作用是:按位或。即两个运算分量的对应二进制位如果有一个是1,则 结果对应二进制位为1,否则为0。所以,01011101|11110000的结果是11111101。选项C)中“&”运算符的 作用是:按位与。即两个运算分量的对应二进制位如果都是1,则结果对应二进制位为1,否则为0。所以, 01011101&1111000的结果为01010000,选项D)中“<<”运算符的作用是:左移运算符,将a左移4位,显然 不符合题意。

考点19答案:文件
(1) C) 【解析】 本题考查了C语言中文件的一些基本概念。 定义文件类型指针变量的一般形式为: FILE *指针变量名;因此选项C)是错误的,应该选择C)。 (2)D)【解析】此题考查文件打开方式对文件操作的影响。由于打开文件进行修改,可见选项A)是 错误的,因为此种方式打开时,只能读,不能写,当然无法修改;选项B)是以追加方式“ab+”打开文件读 写,以这种方式打开时,新写入的数据只能追加在文件原有内容之后,但可以对以前的数据读出。换言之, “ab+”或“a+”方式打文件后,对于写操作,文件指针只能定位在文件的原有内容之后,但对于读操作, 文件指针可以定位在全文件范围内,可见,按此种方式打开文件不能实现文件内容的修改;选项C)以“w+” 方式打开文件,此时,原文件中已存在的内容都被清除,但新写入文件的数据可以被再次读出或再次写入, 故也不能实现对文件的修改。只有以“r+”方式打开文件时,才允许将文件原来数据读出,也允许在某些 位置上再写入,从而实现对文件的修改。

(3)B)【解析】以“wt”方式写入的是字符文件,转义字符' \n' 被看做两个字符来处理。而“wb” 方式写入的是二进制文件,转义字符' \n' 是一个字符。 (4)C)【解析】本题考查的是文件指针feof的运用。当文件读到结尾时,feof(fp)为非零值,否则 为0。 (5)D)【解析】将有6个元素的整型数组分两行输出到一个文件中,因为输出的都是数字并且每行都 没有分隔符,所以当再对其进行读取操作时,每一行都会被认为是一个完整的数,而换行符则作为它们的 分隔符。 (6)B)【解析】本题主要考查的是文件的操作。程序一开始定义了一个文件指针FILE *fp;,然后通 过fopen函数以只写方式打开d1.dat文件,使用一个for循环往d1.dat文件里面依次写入数组a的三个值,再 写入一个换行符,最后通过fclose函数关闭d1.dat文件。此时,d1.dat中的内容应该是“123”。接下来又 通过fopen函数以只读方式打开d1.dat文件,使用fscanf函数读取1个整数,考生可能会认为读取的只是第1 次写入的整数1,其实它将整个123当成1个整数给读进来了,所以读取后n的值为123。 (7)B)【解析】本题主要考查的是输入输出函数。从终端输入的函数有:scanf、getchar、gets。 输出到屏幕的函数有:printf、putchar、puts。从磁盘文件输入的函数有:fscanf、fgetc、fgets、fread、 getc。输出到磁盘文件的函数有:fprintf、fputc、fputs、fwrite、putc。由此可见,选项B)的说法是 错误的。 (8)B)【解析】本题考查的是文件操作。题中“fopen(fn,"w")”的作用是打开fn所指向的文件,使 用文件方式为“写入”;“fputs(str,fp)”的作用是将字符str的值输出到fp所指向的文件中去。在程序 中,两次使用“写入”的方式打开同一个文件,在第二次打开时,文件指针指向文件头,所以此次写入的 数据覆盖了文件原有的数据,故本题中t1.dat的内容为end。故本题答案为B)。 (9) B) 【解析】 本题考查的是文件操作。 程序首先定义了一个文件指针pf, 并使用fopen()函数以 “wb+” 方式新建一个可读写的二进制文件“123.dat”。然后使用fwrite()函数写入字符串s2的前7*1个字符。现 在文件中的内容应该为:“Beijing”。接下来程序使用rewind()函数,将文件的读写指针调回起始位置。 并又调用fwrite()函数写入字符串s1的前5*1个字符。所以文件原内容“Beijing”的前5个字符被覆盖,结 果为“Chinang”,故本题应该选择B)。


相关文章:
2017最新版全国计算机二级公共基础知识常考题目+详解_...
计算机二级公共基础知识常考 120 题&详解 (1) 下面叙述正确的是___。 A. ...选择类排序法 D. 建堆排序法 5 w# i; {: P# b6 c1 ]1 s [答案]B...
全国计算机二级 常考的选择题 部分
全国计算机二级 常考选择题 部分_IT认证_资格考试/认证_教育专区。全国计算机二级 常考选择题 部分 1 假定有以下循环结构: Do Until 条件表达式 循环体 Loop...
计算机二级常考题目
国家计算机二级C语言常考题... 18页 5财富值 [含答案]二级计算机考试中... 14页 1财富值 计算机二级四级考试必备题... 8页 2财富值 计算机二级考试常考的题...
2015计算机等级考试二级MS_Office考试选择题
题答案:A。 9、 公司销售多种产品给不同的客户, 客户可选择不同的产品, ...对计算机系统具有依赖性 D、软件在使用中存在磨损、老化问题 【评析】 本题考...
2016最新版全国计算机二级公共基础知识常考题目+详解_...
计算机二级公共基础知识常考 120 题&详解 - P& D% o* E% T0 J4 e4 S9...顺序、选择、循环 (31) [答案]D" O: F5 s/ O0 I& ~$ [/ A' {8 ...
2015计算机等级考试二级真题及答案
2015计算机等级考试二级真题及答案_电脑基础知识_IT/计算机_专业资料。2015 计算机...A、19 B、20 C、m-19 D、m-20 【评析】 本题考查知识点是循环队列的...
计算机等级考试选择题附答案
计算机等级考试选择题答案 也就是计算机日常基础问题 答案仅供参考计算机等级考试...度慢、经常出现故障。 A、电子管 、 B、晶体管 、 C、中小规模集成电路 、...
计算机二级常考的138道题
计算机二级常考的138道题 隐藏>> 分享到: X 分享到: 使用一键分享,轻松赚取财富值, 了解详情 嵌入播放器: 普通尺寸(450*500pix) 较大尺寸(630*500pix)...
计算机二级考试常考选择题1
计算机二级考试选择题 13页 1下载券 计算机二级考试选择题 25页 1下载券 计算机...计​算​机​二​级​考​试​常​考​选​择​题​1 ...
2015计算机等级考试二级MS Office考试选择题大全
题答案:A。 9、公司销售多种产品给不同的客户,客户可选择不同的产品,则...对计算机系统具有依赖性 D、软件在使用中存在磨损、老化问题 【评析】 本题考...
更多相关标签: