文档库 最新最全的文档下载
当前位置:文档库 › 二级笔试考点

二级笔试考点

二级公共基础知识考点分析

第1章数据结构与算法

1.1 算法和数据结构的基本概念

1.算法

(1)算法的基本概念

算法是指解题方案的准确而完整的描述。

A.算法的基本特征:①可行性;②确定性;③有穷性;④拥有足够的情报。

B.算法的基本要素:①算法中对数据的运算和操作:基本的运算和操作包括算术运算、逻辑运算、关系运算和数据

传输;②算法的控制结构:基本的控制结构包括顺序结构、选择结构、循环结构。

C.算法设计的基本方法:①列举法;②归纳法;③递推;④递归;⑤减半递推技术;⑥回溯法。

(2)算法的复杂度

算法的复杂度主要包括时间复杂度和空间复杂度。

A.算法的时间复杂度:是指执行算法所需要的计算工作量。算法的工作量用算法所执行的基本运算次数来度量,而

算法所执行的基本运算次数是问题规模的函数。即:算法的工作量=f(n)其中n是问题的规模。

B.算法的空间复杂度:一般是指执行这个算法所需要的内存空间。一个算法所占用的存储空间包括算法程序所占的

空间、输入的初始数据所占用的存储空间以及算法执行过程中所需要的额外空间。

2.数据结构的基本概念

数据结构作为计算机的一门学科,主要研究和讨论以下三个方面的问题:

①数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构;

②在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;

③对各种数据结构进行的运算。

(1)数据结构的定义

①数据结构是指相互有关联的数据元素的集合。

②数据处理是指对数据集合中的各元素以各种方式进行运算,包括插入、删除、查找、更改等运算,也包括对数据

元素进行分析。

③数据的逻辑结构是指反映数据元素之间逻辑关系的数据结构。

④数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称数据的物理结构)。常用的存储结构

有顺序、链接、索引等存储结构。

(2)数据结构的图形表示

在数据结构的图形表示中,对于数据集合D中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简称结点;为了进一步表示各数据元素之间的前后件关系,对于关系R中的每一个二元组,用一条有向线段从前件结点指

向后件结点。

(3)线性结构与非线性结构

如果一个非空的数据结构满足下列两个条件:

①有且只有一个根结点;

②每一个结点最多有一个前件,也最多有一个后件。

则称该数据结构为线性结构。如果一个数据结构不是线性结构,则称为非线性结构。

1.2 线性表和线性链表

1.线性表

(1)线性表的基本概念

线性表(Linear List)是最简单、最常用的一种数据结构。

线性表是由n(n≥0)个数据元素组成的一个有限序列,表中的每一个数据元素,除了第一个外,有且

只有一个前件,除了最后一个外,有且只有一个后件。

(2)线性表的顺序存储结构

线性表的顺序存储结构具有以下两个基本特点:

①线性表中所有元素所占的存储空间是连续的;

②线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。

(3)顺序表的插入运算

在线性表采用顺序存储结构时,如果插入运算在线性表的末尾进行,即在第n个元素之后(可以认为是在第n+1个元

素之前)插入新元素,则只要在表的末尾增加一个元素即可,不需要移动表中的元素;如果要在线性表的第1个元素之前插入一个新元素,则需要移动表中所有的元素。

(4)顺序表的删除运算

在线性表采用顺序存储结构时,如果删除运算在线性表的末尾进行,即删除第n个元素,则不需要移动表中的元素;如果要删除线性表中的第1个元素,则需要移动表中所有的元素。

2.线性链表

(1)线性链表的基本概念

在线性链表中,各数据元素之间的前后件关系是由各结点的指针域来指示的,指向线性表中第一个结点的指针HEAD 称为头指针,当HEAD=NULL(或0)时称为空表。

(2)线性链表的基本运算

线性链表的运算主要有:线性链表的插入、删除、查找、合并、分解、逆转、复制、排序等。

①在线性链表中查找指定元素

在非空线性链表中寻找包含指定元素值x的前一个结点p的基本方法如下:从头指针指向的结点开始往后沿指针进行

扫描,直到后面已没有结点或下一个结点的数据域为x为止。当线性链表中不存在包含元素x的结点时,则找到的p为线性链表中的最后一个结点号。

②线性链表的插入

为了在线性链表中插入一个新元素,首先要给该元素分配一个新结点,它可以从可利用栈中取得。然后将存放新元

素值的结点链接到线性链表中指定的位置。

③线性链表的删除

为了在线性链表中删除包含指定元素的结点,首先要在线性链表中找到这个结点,然后将要删除结点放回到可利用栈。

(3)循环链表及其基本运算

①在循环链表中增加了一个表头结点,其数据域为任意或者根据需要来设置,指针域指向线性表的第一个元素的结点。循环链表的头指针指向表头结点。

②循环链表中最后一个结点的指针域不是空,而是指向表头结点。

1.3 栈和队列

1.栈及其基本运算

栈是一种特殊的线性表,在这种线性表的结构中,一端是封闭的,不允许进行插入与删除元素;另一端是开口的,

允许插入与删除元素。在顺序存储结构下,对这种类型线性表的插入与删除运算是不需要移动表中其他数据元素的。

在栈中,允许插入与删除的一端称为栈顶,而不允许插入与删除的另一端称为栈底。栈是按照“先进后出”(FILO—First In Last Out)或“后进先出”(LIFO—Last In First Out)的原则组织数据的。栈的基本运算有三种:入栈、退栈与读栈顶元素。

2.队列及其基本运算

(1)队列(queue)是指允许在一端进行插入、而在另一端进行删除的线性表。队列又称为“先进先出”(FIFO—First

In First Out)或“后进后出”(LILO—Last In Last Out)的线性表。

(2)循环队列及其运算

在实际应用中,队列的顺序存储结构一般采用循环队列的形式。所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。循环队列主要有两种基本运算:入队运算与退队运算。

1.4 树与二叉树

1.树的基本概念

树(tree)是一种简单的非线性结构。在树这种数据结构中,所有数据元素之间的关系具有明显的层次特性。

2.二叉树的定义及其存储结构

(1)二叉树的定义

二叉树具有以下两个特点:

①非空二叉树只有一个根结点;

②每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。

(2)二叉树的存储结构

在计算机中,二叉树通常采用链式存储结构。在二叉树中,由于每一个元素可以有两个后件(即两个子结点),因此,用于存储二叉树的存储结点的指针域有两个:一个用于指向该结点的左子结点的存储地址,称为左指针域;另一个用于指向该结点的右子结点的存储地址,称为右指针域。

3.二叉树的遍历

二叉树的遍历是指不重复地访问二叉树中的所有结点。二叉树的遍历可以分为:

①前序遍历(DLR)

首先访问根结点,然后遍历左子树,最后遍历右子树;并且,在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

②中序遍历(LDR)

首先遍历左子树,然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。

③后序遍历(LRD)

首先遍历左子树,然后遍历右子树,最后访问根结点,并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。

1.5 查找技术和排序技术

1.查找技术

查找是数据处理领域中的一个重要内容,查找的效率将直接影响到数据处理的效率。

(1)顺序查找

在进行顺序查找过程中,如果线性表中的第一个元素就是被查找元素,则只需做一次比较就查找成功,查找效率最高;但如果被查的元素是线性表中的最后一个元素,或者被查元素根本不在线性表中,则为了查找这个元素需要与线性表中所有的元素进行比较,这是顺序查找的最坏情况。在平均情况下,利用顺序查找法在线性表中查找一个元素,大约要与线性表中一半的元素进行比较。

(2)二分法查找

二分法查找只适用于顺序存储的有序表。在此所说的有序表是指线性表中的元素按值非递减排列。对于长度为n的有序线性表,在最坏情况下,二分查找只需要比较次,而顺序查找需要比较n次。

2.排序技术

(1)交换类排序法

交换类排序法是指借助数据元素之间的互相交换进行排序的一种方法。冒泡排序法与快速排序法都属于交换类的排

序方法。假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后的扫描和n/2遍的从后往前的扫描,需要的比较次数为n(n-1)/2。在快速排序过程中,随着对各子表不断地进行分割,划分出的子表会越来越多,但一次又

只能对一个子表进行再分割处理,需要将暂时不分割的子表记忆起来,这就要用一个栈来实现。

(2)插入类排序法

插入排序是指将无序序列中的各元素依次插入到已经有序的线性表中。在简单插入排序法中,每一次比较后最多移

掉一个逆序,因此,这种排序方法的效率与冒泡排序法相同。在最坏情况下,简单插入排序需要n(n-1)/2次比较。

(3)选择类排序法

选择排序法的基本思想是扫描整个线性表,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置);

然后对剩下的子表采用同样的方法,直到子表空为止。简单选择排序法在最坏情况下需要比较n(n-1)/2次。

第2章程序设计基础

2.1 程序设计方法与风格

程序设计是一门技术,需要相应的理论、技术、方法和工具来支持。就程序设计方法和技术的发展而言,主要经过

了结构化程序设计和面向对象的程序设计阶段。程序设计风格是指编写程序时所表现出的特点、习惯和逻辑思路。著名

的“清晰第一,效率第二”的论点已成为当今主导的程序设计风格。要形成良好的程序设计风格,应注重和考虑这些因素:①源程序文档化;②数据说明的方法;③语句的结构;④输入和输出。

2.2 结构化程序设计

1.结构化程序设计的原则

结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句。

2.结构化程序设计的基本结构与方法的应用

结构化程序设计的三种基本结构分别是:顺序结构、选择结构和循环结构。

在结构化程序设计的具体实施中,要注意把握如下要素:①使用程序设计语言中的顺序、选择、循环等有限的控制

结构表示程序的控制逻辑;②选用的控制结构只准许有一个入口和一个出口;③程序语句组成容易识别的块,每块

只有一个入口和一个出口;④复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现;⑤语言中所没有的控制结构,

应该采用前后一致的方法来模拟;⑥严格控制goto语句的使用。

2.3 面向对象的程序设计

1.关于面向对象方法

面向对象方法的优点:①与人类习惯的思维方法一致;②稳定性好;③可重用性好;④易于开发大型软件产品;⑤

可维护性好。

2.面向对象方法的基本概念

①面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,它

由一组表示其静态特征的属性和它可执行的一组操作组成。通常把对象的操作称为方法或服务。②属性即对象所包含的

信息,它在设计对象时确定,一般只能通过执行对象的操作来改变。③对象的基本特征有:a.标识惟一性;b.分类性;c.多态性;d.封装性;e.模块独立性好。④继承是使用已有的类定义作为基础建立新类的定义技术。广义地说,继承是指

能够直接获得已有的性质和特征,而不必重复定义它们。继承分为单继承与多重继承。⑤多态性是指子类对象可以

像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。

第3章软件工程基础

3.1 软件工程基本概念

1.软件定义与软件危机

(1)软件的定义:软件是与计算机操作相关的计算机程序、规程、规则,以及可能有的文件、文档及数据。软件的

三个要素:程序、数据和文档。

(2)软件分类:软件按功能可分为应用软件、系统软件和支撑软件(或工具软件)三大类。

(3)软件危机的定义:软件危机是泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题。

2.软件工程定义与软件生命周期

(1)软件工程

定义:软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。软件工程

的三个要素:方法、工具和过程。

(2)软件生命周期

定义:软件生命周期就是软件产品从提出、实现、使用维护到停止使用退役的全过程。

软件生命周期包括软件定义、软件开发及软件维护三个阶段。软件定义阶段的任务包括可行性研究与计划制定、需

求分析;软件开发阶段的任务包括概要设计、详细设计、软件实现、软件测试;软件维护的任务包括软件的运行、维护

和退役。

3.软件开发工具与软件开发环境

(1)软件开发工具:软件开发工具的发展是从单项工具的开发逐步向集成工具发展的,软件开发工具为软件工程方

法提供了自动的或半自动的软件支撑环境。

(2)软件开发环境:软件开发环境或称软件工程环境是全面支持软件开发全过程的软件工具集合。这些软件工具按

照一定的方法或模式组合起来,支持软件生命周期内的各个阶段和各项任务的完成。

3.2 结构化分析和设计方法

1.结构化分析方法

(1)关于结构化分析方法

结构化分析方法是结构化程序设计理论在软件需求分析阶段的运用。结构化分析的常用工具有数据流图(DFD)、数

据字典(DD)、判定树和判定表。其中最重要的工具是数据流图。

(2)结构化分析的常用工具

①数据流图是描述数据处理过程的工具,是通过对需求的理解构造出逻辑模型的图形表示,它直接支持系统的功能

建模。

②数据字典是结构化分析方法的核心。数据字典是对所有与系统相关的数据元素的一个有组织的列表,以及精确的、严格的定义,使得用户和系统分析员对于输入、输出、存储成分和中间计算结果有共同的理解。

(3)软件需求规格说明书

软件需求规格说明书(SRS)是需求分析阶段的最后结果,是软件开发中的重要文档之一。

①软件需求规格说明书有以下几个作用:1)便于用户、开发人员进行理解和交流;2)反映出用户问题的结构,可

以作为软件开发工作的基础和依据;3)作为确认测试和验收的依据。

②软件需求规格说明书的内容:包括概述、数据描述、功能描述、性能描述、参考文献目录和附录。

③软件需求规格说明书的特点:软件需求规格说明书具有正确性、无歧义性、完整性、可验证性、一致性、可理解性、可修改性和可追踪性等特点。

2.结构化设计方法

(1)软件设计的基本概念

①软件设计的基础

软件设计是软件工程的重要阶段,是一个把软件需求转换为软件表示的过程。软件设计的基础目标是用比较抽象概

括的方式确定目标系统如何完成预定的任务,即软件设计是确定系统的物理模型。

软件设计的内容:从技术观点看,软件设计包括结构设计、数据设计、接口设计和过程设计。其中结构设计是定义

软件系统各主要部件之间的关系。数据设计是将分析时创建的模型转化为数据结构的定义。接口设计是描述软件内部、

软件和协作系统之间以及软件与人之间如何通信。过程设计是把系统结构部件转换成软件的过程性描述。

软件设计的一般过程是:软件设计是一个迭代的过程;先进行高层次的结构设计;后进行低层次的过程设计;穿插

进行数据设计和接口设计。

②软件设计的基本原理

软件设计遵循软件工程的基本目标和原则。

③结构化设计方法的基本思想:将软件设计成由相对独立、单一功能的模块组成的结构。为了提高模块的独立性,

应该尽量提高模块的内聚性,降低模块间的耦合性。

(2)概要设计

①概要设计的任务

概要设计的基本任务:设计软件系统结构、确定数据结构及数据库设计、编写概要设计文档、进行概要设计文档评审。软件结构设计工具——结构图(SC),也称为程序结构图。结构图是描述软件结构的图形工具。

软件设计的准则:a.提高模块独立性;b.模块规模适中;c.深度、宽度、扇出和扇入适当;d.使模块的作用域在该

模块的控制域内;e.应减少模块的接口和界面的复杂性;f.设计成单入口、单出口的模块;g.设计功能可预测的模块。

②详细设计

详细设计的任务:为软件结构图中的每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和

数据结构的细节。

过程设计的任务:对每个模块规定的功能以及算法的设计,给出适当的算法描述。

常见的过程设计工具有:

图形工具:程序流程图,N-S,PAD,HIPO。

表格工具:判定表。

语言工具:PDL(伪码)。

3.3 软件测试及程序的调试

1.软件测试

软件测试是保证软件质量的重要手段,其主要过程涵盖了整个软件生命期的过程,包括需求定义阶段的需求测试、

编码阶段的单元测试、集成测试以及后期的确认测试、系统测试、验证软件是否合格、能否交付用户使用等。

(1)软件测试的目的

软件测试是为了发现错误而执行程序的过程:

一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例;

一个成功的测试是发现了至今尚未发现的错误的测试。

(2)软件测试的准则

软件测试过程中应遵循以下准则:①所有测试都应追溯到需求;②严格执行测试计划,排除测试的随意性;③充分

注意测试中的群集现象;④程序员应避免检查自己的程序;⑤穷举测试不可能;⑥妥善保存测试计划、测试用例、出错

统计和最终分析报告。

(3)软件测试技术与方法综述

①软件测试从是否要执行被测试软件的角度可以分为静态测试和动态测试。

②软件测试按照功能划分可分为白盒测试和黑盒测试方法。

白盒测试:白盒测试又称结构测试或逻辑驱动测试,是根据软件产品的内部工作过程,检查内部成分,以确认每种

内部操作符合设计规范要求。

白盒测试的基本原则:1)保证所测模块中每一独立路径至少执行一次;2)保证所测模块所有判断的每一分支至少

执行一次;3)保证所测模块每一循环都在边界条件和一般条件下至少各执行一次;4)验证所有内部数据结构的有效性。

白盒测试的主要方法:1)逻辑覆盖测试方法:逻辑覆盖是泛指一系列以程序内部的逻辑结构为基础的测试用例设计

技术。逻辑覆盖测试方法有语句覆盖、路径覆盖、判定覆盖、条件覆盖以及判断-条件覆盖。2)基本路径测试:基本路

径测试的思想和步骤是,根据软件过程性描述中的控制流程确定程序的环路复杂性度量,用此度量定义基本路径集合,

并由此导出一组测试用例对每一条独立执行路径进行测试。

黑盒测试:黑盒测试也称功能测试或数据驱动测试,是对软件已经实现的功能是否满足需求进行测试和验证。

黑盒测试的方法:1)等价类划分法:将程序的所有可能的输入数据划分成若干部分(即若干等价类),然后从每个等价类中选取数据作为测试用例。2)边界值分析法:边界分析法是对各种输入、输出范围的边界情况设计测试用例的方法。3)错误推测法:靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的例子的方法。

(4)软件测试的实施

软件测试过程一般按4个步骤进行,即单元测试、集成测试、验收测试(确认测试)和系统测试。

①单元测试:单元测试是对软件设计的最小单位——模块进行正确性检验的测试。主要目的是发现各模块内部可能存在的各种错误。

②集成测试:集成测试是把模块在按照设计要求组装起来的同时进行测试,主要目的是发现与接口有关的错误。

③确认测试:确认测试的任务是验证软件的功能和性能及其他特性是否满足了需求规格说明中确定的各种需求,以及软件配置是否完全、正确。

④系统测试:系统测试是将通过测试确认的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、支持软件、数据和人员等其他系统元素组合在一起,在实际运行环境下对计算机系统进行一系列的集成测试和确认测试。

2.程序的调试

程序调试的任务是诊断和改正程序中的错误,它与软件测试不同,软件测试是尽可能多地发现软件中的错误。软件测试贯穿整个软件生命期,调试主要在开发阶段。

(1)基本概念

①程序调试的基本步骤:第1步:错误定位;第2步:修改设计和代码,以排除错误;第3步:进行回归测试,防止引进新的错误。

②程序调试的原则

确定错误的性质和位置时应该注意的事项有:分析思考与错误征兆相关的信息;避开死胡同;只把调试工具当作辅助手段来用;避免用试探法,最多只能把它当作最后手段。

修改错误时应遵循如下原则:在出现错误的地方,还可能有别的错误;不应只修改了错误的征兆或表现而没有修改错误本身;注意修正一个错误的同时有可能会引入新的错误;修改错误的过程将迫使人们暂时回到程序设计阶段;修改源代码程序,不要改变目标代码。

(2)软件调试方法

主要的软件调试方法有强行排错法、回溯法和原因排除法。其中强行排错法是传统的调试方法,回溯法适合于小规模程序的排错,原因排除法是通过演绎和归纳,以及二分法来实现的。

第4章数据库设计基础

4.1 数据库系统的基本概念

1.数据、数据库、数据管理系统

(1)数据(Data):数据实际上就是描述事物的符号记录。数据分为临时性数据和永久性数据。

(2)数据库(DB):数据库是数据的集合,它具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可以被各个应用程序所共享。

(3)数据库管理系统(DBMS):数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等。数据库管理系统是数据库系统的核心。

(4)数据库管理员(DBA):对数据库进行规划、维护、监视等的专业人员。主要工作:数据库设计、数据库维护和改善系统性能,提高系统效率。

(5)数据库系统(DBS):由数据库(数据)、数据库管理系统(软件)、数据库管理员(人员)、系统平台之一(硬件平台)和系统平台之二(软件平台)组成。

(6)数据库应用系统(DBAS):数据库应用系统是数据库系统再加上应用软件及应用界面这三者所组成。

2.数据库系统的发展

数据管理发展至今经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。

3.数据库系统的基本特点

(1)数据的集成性。(2)数据的高共享性与低冗余性。(3)数据独立性。(4)数据统一管理与控制。

4.数据库系统的内部结构体系

数据库系统在其内部具有三级模式及二级映射,三级模式分别是概念级模式、内部级模式与外部级模式,二级映射则分别是概念级到内部级的映射以及外部级到概念级的映射。这种三级模式与二级映射构成了数据库系统内部的抽象结构体系。

(1)数据库系统的三级模式:数据库系统提供概念模式、外模式和内模式三级数据模式。

(2)数据库的两级映射:数据库的两级映射是指概念模式到内模式的映射和外模式到概念模式的映射。

4.2 数据模型、关系代数及数据库设计与管理

1.数据模型

(1)数据模型的基本概念

数据模型是数据特征的抽象,它从抽象层次上描述了系统的静态特征、动态行为和约束条件,为数据库系统的信息表示与操作提供了一个抽象的框架。数据模型所描述的内容有三个部分:数据结构、数据操作和数据约束。数据模型按不同的应用层次分为:概念数据模型、逻辑数据模型和物理数据模型三种。

(2)E-R模型

①E-R模型的3个基本概念

实体:现实世界中的事物可以抽象为实体,实体是概念世界中的基本单位,它们是客观存在的且又能够相互区分的事物。将具有共性的实体组织成一个集合,称之为实体集。

属性:现实世界中的事物均有一些特性,这些特性可以用属性来表示。

联系:现实世界中事物间的关联称为联系。

E-R模型由实体、联系、属性三者组成。

实体与实体之间的联系:一对一(1∶1)、一对多(1∶m)和多对多(m∶n)三种。

②E-R模型三个基本概念之间的联接关系

实体集(联系)与属性间的联接关系:实体以及它的所有属性构成了实体的一个完整描述。实体和隶属于它的属性之间可以建立这么一层联接关系。实体有型和值之别,一个实体的所有属性构成了这个实体的型,实体中属性值的集合(即元组)则构成了这个实体的值。相同型的实体构成实体集。

实体(集)与联系间的联接关系:实体集间可以通过联系建立联接关系。

③E-R模型的图示法

E-R模型中用矩形表示实体集,用椭圆表示属性,用菱形表示联系,用无向线段表示实体集(联系)与属性、实体集与联系间的联接关系。

(3)基本的数据模型

数据发展过程中产生过三种基本的数据模型:层次模型、网状模型和关系模型。其中层次模型的基本结构是树形结构。网状模型的基本结构是一个不加任何限制条件的无向图。关系模型的基本结构是一张二维表。

(4)关系模型

①关系的数据结构

关系模型采用二维表来表示。二维表由表框架和表的元组组成。表框架由多个命名的表属性组成。每个属性有一个取值范围称为值域。二维表中的每一行数据称为元组。

键(或码):在二维表中能唯一标识元组的最小属性集。

候选键(或候选码):一个二维表中所有的键(或码)。

主键(或主码):从二维表的所有候选键中选取一个作为用户使用的键。主键简称键。

外键(或外码):表A的某属性集是表B的键,则称该属性集为A的外键。

②关系操纵

关系模型的数据操纵是建立在关系上的数据操纵,一般有数据查询(基本单位是元组分量)、数据删除(基本单位

是元组)、数据插入(基本单位是元组)和数据修改(基本单位是元组分量)四种操作。

③关系中的数据约束

关系模型中提供实体完整性约束、参照完整性约束和用户完整性约束三种数据约束。

2.关系代数

(1)关系模型的基本操作

关系是由若干个不同的元组所组成,因此关系可视为元组的集合。N元关系是一个n元有序组的集合。关系模型有插入、删除、修改和查询4种操作。

(2)关系模型的基本运算

由于操作是对关系的运算,而关系是有序组的集合,因此可以将操作看成是集合的运算。

①插入:设需在关系R中插入若干个元组,待插入的元组组成关系R′,则插入操作可用集合“并”运算表示为:R∪R′。

②删除:设需在关系R中删除若干个元组,待删除的元组组成关系R′,则删除操作可用集合“差”运算表示为:R-R′。

③修改:修改关系R内的元组内容可用下面的方法实现:a.设待修改的元组构成关系R′,则先做删除操作,得R-R′;

b.设修改后的元组构成关系R″,此时将其插入即得到结果(R-R′)∪R″

④查询:用于查询的3个操作无法用传统的集合运算表示,需引入一些新的运算。

A.投影(Projection)运算:对于关系内的域指定可引入新的运算叫投影运算。投影运算是一个一元运算,一个关

系通过投影运算后仍为一个关系R′。

B.选择(Selection)运算:选择运算也是一个一元运算,关系R通过选择运算(并由该运算给出所选择的逻辑条件)后仍为一个关系。这个关系是由R中那些满足逻辑条件的元组所组成。设关系的逻辑条件为F,则R满足F的选择运算可写为:σF(R)。

逻辑条件F是一个逻辑表达式,它由下面的规则组成:

它可以具有αθβ的形式,其中α,β是域(变量)或常量,但α,β又不能同为常量,θ是比较符,它可以是<,>,≤,≥,=及≠。Αθβ叫基本逻辑条件。由若干个基本逻辑条件经逻辑运算得到,逻辑运算为∧(并且)、∨(或者)及~(否)构成,称为复合逻辑条件。

C.笛卡尔积(Cartesian Product)运算:对于两个关系的合并操作可以用笛卡尔积表示。设有n元关系R及m元关系S,它们分别有p、q个元组,则关系R与S经笛卡尔积记为R×S,该关系是一个n+m元关系,元组个数是p×q,由R与S的有序组

组合而成。

(3)关系代数中的扩充运算

①交运算:关系R和S经交运算后所得到的关系是由那些既在R内、又在S内的有序组所组成,记为:R∩S。

②除运算:如果将笛卡尔积运算看作是乘运算,那么除运算就是它的逆运算。当关系T=R×S时,则可将除运算写为:T÷R=S或T/R=S其中,S称为T除以R的商。

③连接运算:连接运算又可称为θ-连接运算,这是一种二元运算,通过它可以将两个关系合并成一个关系。

3.数据库设计与管理

(1)数据库设计概述

数据库设计的基本任务是根据用户对象的信息需求、处理需求和数据库的支持环境设计出数据模式。在数据库设计

中有两种方法:一种是以信息需求为主,兼顾处理需求的面向数据的方法;另一种是以处理需求为主,兼顾信息需求的

面向过程的方法。

数据库设计目前一般采用生命周期法,将数据库应用系统的开发分解为需求分析阶段、概念设计阶段、逻辑设计阶段、

物理设计阶段、编码阶段、测试阶段、运行阶段和进一步修改阶段来完成。在数据库设计中主要采用需求分析、概念设计、逻辑设计、物理设计四个阶段。

(2)数据库设计的需求分析

需求分析阶段的任务是通过详细调查现实世界要处理的对象,充分了解原系统的工作概况,明确用户的各种需求,

然后在此基础上确定新系统的功能。需求分析调查的是用户对数据库的如下要求:①信息要求:指用户需要从数据库中

获得信息的内容与性质;②处理要求:指用户要完成什么处理功能,对处理的响应时间有何要求,处理的方式是批处理

还是联机处理;③安全性和完整性的要求。

在实际开展需求分析阶段工作时,有两点需要特别注意:

第一在需求分析阶段,一个重要而困难的任务就是收集将来应用所涉及的数据。

第二必须强调用户的参与,这是数据库应用系统设计的特点。

(3)数据库概念设计

①数据库概念设计概述

数据库概念设计的方法有以下两种:a.集中式模式设计法:集中式模式设计法是一种统一的模式设计方法,它根据需求由一个统一机构或人员设计一个综合的全局模式;b.视图集成设计法:这种方法是将一个单位分解成若干个部分,先对每个部分作局部模式设计,建立各个部分的视图,然后以各个视图为基础进行集成。

②数据库概念设计的过程

数据库概念设计的过程分为以下三个步骤:

第1步:选择局部应用;

第2步:视图设计:一般有三种设计顺序:自顶向下(从一般到具体)、自底向上(从具体到一般)、由内向外(从最基本和最明显的对象扩充到非一般、不明显的其他对象);

第3步:视图集成:将所有的局部视图统一与合并成一个完整的数据模式。

(4)数据库的逻辑设计

①从E-R图向关系模式转换

数据库逻辑设计的主要工作是将E-R图转换成指定RDBMS中的关系模式。实体集也可以转换关系。

由E-R图转换成关系模型时会遇到以下一些问题:a.命名与属性域的处理;b.非原子属性的处理;c.联系的转换。

②逻辑模式规范化及调整、实现

a.规范化:在逻辑设计中还需对关系做规范化验证;

b.RDBMS:对逻辑模式进行调整以满足RDBMS的性能、存储空间等要求,同时对模式做满足RDBMS限制条件的修改,它们包括如下内容:调整性能以减少连接运算;调整关系大小,使每个关系数量保持在合理水平,从而提高存取效率;尽量采用快照,若在应用中仅需某固定时刻的值,此时可用快照将某时刻值固定,并定期更新,此种方法可以显著提高查询速度。

③关系视图设计

关系视图能提供数据逻辑独立性,适应用户对数据的不同需求并且具有一定的数据保密功能。

(5)数据库的物理设计

数据库物理设计的主要目标是对数据库内部物理结构作调整并选择合理的存取路径,以提高数据库访问速度及有效利用存储空间。

(6)数据库管理

①数据库的建立。包括两部分的内容:数据模式的建立和数据加载。

②数据库的调整。在数据库建立并经一段时间运行后往往会产生一些不适应的情况,此时需要对其作出调整。

③数据库的重组。数据库在经过一定的时间运行后,其性能会逐步下降,下降的原因主要是由于不断的修改、删除和插入所造成的,这时需要对数据库进行重新整理,重新调整存储空间,这种工作叫数据库的重组。

④数据库安全性控制与完整性控制。数据库安全性控制和完整性控制的目的是保证数据库数据的正确性、一致性,不被没有授权的用户访问和修改。

⑤数据库的故障恢复。一旦数据库中的数据遭到破坏,需要及时进行恢复。

⑥数据库监控。DBA需随时观察数据库的动态变化,并在发生错误、故障或产生不适应情况时随时采取措施;同时还需要监视数据库的性能变化,在必要时对数据库进行调整。

二级C++语言程序设计考点分析

第1章 C++语言概述考点归纳

1.1 C++语言的发展

C++起源于C语言。1980年贝尔实验室的Bjarne Stroustrup和他的同事们开始对C语言进行改进和扩充,把Simula 67

(一种早期的面向对象语言)中类的概念引入到C语言,并将改进后的C语言称为“带类的C”(C with class)。1983年夏,“带类的C”被正式命名为“C++”,并于同年7月首次对外发表。

1.2 C++语言的特点

1.C++是一种面向对象的程序设计语言

(1)抽象数据类型。

(2)封装和信息隐藏。

(3)以继承和派生方式实现程序的重用。

(4)以运算符重载和虚函数来实现多态性。

(5)以模板来实现类型的参数化。

2.C++是程序员和软件开发者在实践中创造的

C++往往从编写实际程序的角度出发,为程序员提供了各种实用、灵活、高效的语言特性。

3.C++是C语言的超集

能够很好地兼容C语言正是C++取得成功的原因之一,这是因为:

(1)C++继承了C语言简明、高效、灵活等众多优点。

(2)以前使用C语言编写的大批软件可以不加任何修改,直接在C++开发环境下维护。

(3)C语言程序员只需要学习C++扩充的新特性,就可以很快地使用C++编写程序。

1.3 面向对象程序设计

C++是一种面向对象的程序设计语言,它充分支持面向对象思想中的三个主要特征是:

1.封装性

封装性是指将数据和算法捆绑成一个整体,这个整体就是对象,描述对象的数据被封装在其内部。如果需要存取数据,可以通过对象提供的算法来进行操作,而无需知道对象内部的数据是如何表示和存储的。这种思想被称为信息隐藏。

2.继承性

继承性是指一种事物保留了另一种事物的全部特征,并且具有自身的独有特征。

C++语言采用继承来支持重用,程序可以在现有类型的基础上扩展功能来定义新类型。新类型是从现有类型中派生出

来的,因此被称为派生类。

3.多态性

多态性是指当多种事物继承自一种事物时,同一种操作在它们之间表现出不同的行为。

C++语言中使用函数重载、模板、虚函数等概念来支持多态性。

C++语言主要包括面向过程和面向对象两部分内容。学习C++语言时,应该先学习其面向过程部分,再学习面向对象

部分。

1.4 C++语言的基本符号

C++语言中的基本符号可以分为3类:

1.字母。包括大写英文字母和小写英文字母共52个符号。

2.数字

3.特殊符号。包括:

+- * / = , . _ :;? \ ″′~|! # % & () []{}^<>和“空格”共30个符号。

这三类符号共计92个,它们组成了C++语言的基本符号集合。

1.5 C++语言的词汇

1.关键字

关键字也称为保留字,它是由C++语言本身预先定义好的一类单词。

表1ANSI C 标准规定的关键字

auto break case char

const continue default do

double else enum extern

float for goto if

int long register return

short signed sizeof static

struct switch typedef union

unsigned void volatile while

表2ANSI C++ 标准补充的关键字

bool catch class const_cast

delete dynamic_cast explicit false

friend inline mutable namespace

new operator private protected

public reinterpret_case static_cast template

this throw true try

typeid typename using virtual

wchar_t

2.标识符

标识符是用户为程序中各种需要命名的“元素”所起的名字。标识符的组成要符合一定的规则:

(1)标识符是一个以字母或下划线开头的,由字母、数字、下划线组成的字符串。

(2)标识符不能与任意一个关键字同名。

(3)标识符中的字母区分大小写。

(4)标识符不宜过长。C++语言一般设定一个标识符的有效长度为32个字符。

3.字面常量

常量是指在程序中固定不变的值。常量一般有两种表示形式,即符号常量和字面常量。C++语言中符号常量的名字就是一个标识符,而字面常量却是一类特殊的单。字面常量分为整型、浮点型、字符型和字符串型四类。

4.运算符

运算符是对程序中的数据进行操作的一类单词。C++语言中运算符的种类非常丰富,其中有:

(1)单字符组成的运算符。

(2)双字符组成的运算符。

(3)三个字符组成的运算符。

(4)关键字运算符。

5.标点符号

标点符号是在程序中起分割内容和界定范围作用的一类单词。

表3C++语言的标点符号

标点符号描述

(空格) 语句中各成分之间的分割符

; (分号) 语句的结束符

′ (单引号) 字符常量的起止标记符

″ (双引号) 字符串常量的起止标记符

# (井字号) 预处理命令的开始标记符

{ (左花括号) 复合语句的开始标记符

} (右花括号) 复合语句的结束标记符

∥ (双斜杠) 行注释的开始标记符

/* (斜杠和星号) 块注释的开始标记符

*/ (星号和斜杠) 块注释的结束标记符

1.6 C++程序的基本框架

由于C++语言既支持结构化程序设计,又支持面向对象程序设计,所以它同时具有结构化程序设计和面向对象程序设计两种基本框架。

1.结构化程序设计框架

在C++的结构化程序设计框架中,函数是程序的基本组成单元。程序的主体通常由若干函数定义构成。

函数是程序中完成一定功能的模块。各个函数之间通过参数、返回值和全局变量来进行数据通信。

当编写一个较大的程序时,可以把它按照功能逐级划分成许多相对独立的小模块。每个小模块的功能由一个函数实现,再通过适当的方法将这些函数组织在一起协同工作,就能够完成整个程序所规定的任务。这种方法体现出了结构化程序设计中“功能分解,逐步求精”的思想。

使用结构化程序设计方法编写出的C++程序包括一个主函数和若干用户定义函数。主函数由操作系统调用,它是整个程序的入口。在主函数中调用其他函数,其他函数之间也可以相互调用,并且同一个函数可以被一个或多个函数调用任意多次。在C++中一个函数被调用之前必须先被声明。函数声明和函数体放在一起组成函数定义;函数体是用花括号括起来的若干语句,它们完成了一个函数的具体功能。

一般地,一个C++程序的结构化程序设计框架可以表示为:

<函数1的声明>

<函数2的声明>

<函数n的声明>

<主函数main()>

<函数1的定义>

<函数2的定义>

<函数n的定义>

2.面向对象程序设计框架

在C++的面向对象程序设计框架中,类成为程序的基本组成单元。程序的主体通常由若干类的定义构成。

类可以把数据和函数封装在一起,用以描述事物的属性和对事物的操作。类与类之间一方面通过封装而具有明确的独立性;另一方面又通过成员、友元、参数、继承和派生等关系,达到相互通信和联络的目的,从而形成一个有机的整体。

在结构化程序设计中,除了主函数之外,所有函数之间一律“平等”,没有层次关系可言,当程序规模稍大时,就会使

整体结构变得相当混乱。相反,在面向对象程序设计中,类与类之间能够按照逻辑关系组成有条理的层次结构,从而使一个复杂程序变得有“纲”可循。这正体现出面向对象思想的优越性。

一般地,一个C++程序的面向对象程序设计框架可以表示为:

<类1的定义>

<类2的定义>

<类n的定义>

<主函数main()>

<类1的成员函数定义>

<类2的成员函数定义>

<类n的成员函数定义>

1.7 C++程序的开发过程

开发一个C++程序的过程通常包括编辑、编译、链接、运行和调试等步骤。

1.编辑

在VC6集成开发环境中,用户可以使用编辑窗口来进行C++程序的编辑工作。VC6的编辑窗口是专门为编辑C++程序而设计的,它提供了包括语法亮色、调用提示、自动缩进、查找和替换等在内的一系列功能,使用起来十分方便。

当用户完成了C++程序的编辑时,应将输入的程序文本保存为以.cpp为扩展名的文件(保存C++头文时应以.h为扩展名)。

2.编译

在VC6集成开发环境中,用户可以使用编译(Compile)命令将一个以.cpp为扩展名的C++源程序文件转换成一个以.obj 为扩展名的目标文件。如果一个C++程序由多个源程序文件组成,应将它们分别进行编译形成多个目标文件。

3.链接

在VC6集成开发环境中,用户可以使用生成(Build)命令来进行目标文件的链接工作。另外,在源程序文件没有被编译的情况下直接使用此命令,可以使编译和链接工作一起完成。

4.运行和调试

在编译和链接工作成功地完成之后可以运行得到的可执行程序,观察程序是否符合我们所期望的运行结果。在VC6集成开发环境中,用户可以使用执行(Execute)命令来运行程序。

如果程序的运行结果不是我们所期望的,说明源程序文件中存在着语义错误。这时,需要使用调试器对可执行程序进行跟踪调试来查找错误发生的原因。在VC6集成开发环境中,用户可以很方便地进入调试状态,对程序进行设置断点、单步执行、观察变量等操作。

第2章数据类型、运算符和表达式考点归纳

2.1 C++语言的数据类型

C++中的数据类型大体可以分成三类,它们是:基本类型、导出类型和用户定义类型。

1.基本类型

(1)逻辑型

逻辑型用关键字bool表示,因此又称为bool型(布尔型)。逻辑型的取值范围只包含true和false,它们都是C++关键字。

(2)字符型

字符型用关键字char表示,因此又称为char型,即把字符作为一种数据进行操作。字符型的取值范围是全部基本字符以及ASCII码集或扩充ASCII码集对应的全部符号。

(3)整型

整型用关键字int表示,因此又称为int型,它是C++中最常用的数据类型,整型数据的取值范围是计算机所能表示的

所有整数。

(4)浮点型

浮点型包括单精度型和双精度型两种,单精度型用关键字float表示,又称float型;双精度型用关键字double表示,又称double型。它们对应着数学中实数的概念,即带有小数点的数。

浮点型数据的取值范围原则上是任意大小和精度的小数,但实际上不可能是任意大小的,而是有一定范围的。C++中

的浮点数可以采用尾数加阶码的表示形式,表示的浮点数范围是:单精度型-3.4E38~3.4E38,但不能超过7位有效数字;双精度型-1.7977E308~1.7977E308 ,但不能超过15位有效数字。

(5)空值型

空值型用关键字void表示,因此又称为void型。空值型的取值为空。C++中不存在void型的常量或变量。C++语言规定,所有函数说明都必须指明返回值类型,没有返回值的函数应说明为void类型的函数;另外,void类型还可以用来声

明一个指针变量。

2.基本类型的派生类型

C++语言中,基本类型的字长及其取值范围可以放大和缩小,改变后的类型就叫做基本类型的派生类型。派生类型声

明符是由基本类型关键字char、int、float、double前面加上类型修饰符组成的。类型修饰符包括:

short 短类型,缩短字长;

long 长类型,加长字长;

signed 有符号类型,取值范围包括正负值;

unsigned 无符号类型,取值范围只包括正值;

2.2 常量

常量是指在程序执行过程中值不改变的量。常量有两种表示形式,即字面常量和符号常量。字面常量的类型是根据

书写形式来区分的,它们的类型分别为:整型、浮点型、字符型、字符串型,每个字面常量的字面本身就是它的值。符

号常量是一个标识符,在程序中必须遵循“先声明,后使用”的原则。

1.逻辑常量

逻辑常量主要用在逻辑运算中,此外,由于逻辑值对应着整数1或0,所以它也能够像其他整数一样出现在表达式中,参与各种整数运算。

2.字符常量

字符常量简称字符,它以单引号作为起止符号,中间有一个或若干个字符。这是一般意义上的字符常量;除此之外

还有一种特殊形式的字符常量,以“\”开头的包括多个字符的字符序列也是符合规定的字符常量。但是,无论字符常量包

含一个还是多个字符,每个字符常量只能表示一个字符,当字符常量的一对单引号内多于一个字符时,则将按照一定的

规则解释为一个字符。

计算机中常用的ASCII字符也是字符型的数据,因为ASCII码值在0~127之间,正好落在字符型数据的取值范围之内。ASCII字符集中的每一个显示字符(个别字符除外)都可以作为一个字符常量。但是,对于一些特殊的字符,如回车、换行

等具有控制功能的字符,或者像单引号、双引号等作为特殊标记使用的字符,就无法直接采用单引号作为起止符号来表示。C++中引入了“转义”字符的概念,其含义是:用反斜线“\”引导的下一个字符失去了原来的含义,而转义为具有某种控

制功能的字符。另外,还允许用反斜线引导一个具有1至3位的八进制整数或一个以字母x(大、小写均可)作为开始标记的

具有1至2位的十六进制整数,对应的字符就是以这个整数作为ASCII码的字符。

3.整型常量

整型常量就是整型常数,简称整数,它有十进制、八进制和十六进制3种表示。

(1)十进制整数

十进制整数以正号(+)或负号(-)开头,由首位非0的一串十进制数字组成。若以正号开头则为正数,若以负号开头则

为负数,若省略正负号,则默认为正数。

当一个十进制整数大于等于-2 147 483 648(即231),同时小于等于2 147 483 647(即-231-1)时,则被系统看作是

整型常量;当在2 147 483 648~4 294 967 295即232-1范围之内时,则被看作是无符号整型常量;当超过上述两个范围时,则无法用C++整数类型表示,只有把它用实数(即带小数点的数)表示才能够被有效地存储和处理。

(2)八进制整数

八进制整数以数字0开头,后面接若干个八进制数字(借用十进制数字中的0~7)。八进制整数前面不带正负号,全部

默认为正数。

当一个八进制整数大于等于0同时小于等于017777777777时,则称为整型常量,当大于等于020*********同时小于等

于0377********时,则称为无符号整型数量。不要使用超过上述两个范围的八进制整数,因为没有与此相对应的C++整数

类型。

(3)十六进制整数

十六进制整数以数字0和字母x(大、小写均可)开头,后面接若干个十六进制数字(借用十进制数字0~9,字母A~F或a~f)。

当一个十六进制整数大于等于0同时小于等于0x7FFFFFFF时,则称为整型常量,当大于等于0x80000000同时小于等于

0xFFFFFFFF时,则称为无符号整型常量,与八进制整数类似,超过上述两个范围的十六进制整数也没有与之相对应的C++

整数类型,所以也不能使用它们。

C++中的整型数据除了一般表示方法之外,还允许给它们添加后缀u或l。对于任一种进制的整数,若后缀为字母u(大、小写均可),则规定它为一个无符号整型(unsigned int)数,若后缀为字母l(大、小写均可),则规定它为一个长整型(long int)数。在一个整数的末尾,可以同时使用u和l,并且对排列无要求。

4.实型常量

实型常量有十进制的定点和浮点两种表示方法,但并不存在其他进制的表示,下面分别介绍这两种表示方法。

(1)定点表示

定点表示的实数简称定点数,实际上是以小数形式表示实数。定点表示的实数是由一个正号或负号(正号可以省略)

后接若干个十进制数字和一个小数点所组成,这个小数点可以处在任何一个数字位的前面或后面。

(2)浮点表示

浮点表示的实数简称浮点数,实际上是以指数形式表示实数。浮点表示的实数是由一个十进制整数或定点数后接一

个字母E(大、小写均可)和一个1至3位的十进制整数所组成,字母E之前的部分称为该浮点数的尾数,之后的部分成为该

浮点数的指数,该浮点数的值就是它的尾数乘以10的指数幂。

对于一个浮点数,若将它尾数中的小数点调整到最左边第一个非零数字的后面,则称它为规格化(或标准化)浮点数。

实型常量分为单精度(float)、双精度(double)和长双精度(long double)三类。一般float型数据在内存中占4个字节,提供7位有效数字;double型数据占8个字节,提供15位有效数字;long double型数据占10个字节,提供19位有效数字。对于一个定点数或浮点数,C++自动按一个双精度数(double型)来存储。若在一个定点数或浮点数之后加上字母F(大、小写均可),则自动按一个单精度数来存储。

5.枚举常量

枚举常量是枚举类型中定义的值,即枚举植。枚举类型属于用户定义类型,用关键字enum表示,因此又称为enum类型。用户通常利用枚举类型定义程序中需要使用的一组相关符号常量。声明枚举类型的语法格式为:

enum<类型名>{<枚举值表>};

其中,enum是关键字,指出要定义的是枚举类型。<类型名>是标识符,即由用户给出的具体枚举类型名。<枚举

值表>包含多个枚举值,它们用逗号分隔开,每个枚举值就是一个枚举常量。枚举值有两种定义形式:一是<值名>;

二是<值名>=<整型常量>。

关于enum类型有四点说明:

(1)一个enum类型实际上是int类型的一个子集,其每一个枚举值代表一个整数。

(2)n个枚举值全部未赋常量值时,它们自左至右分别与整数0,1…n-1对应。

(3)若第i个枚举值赋常量值为m,则其未赋常量值的后续枚举值分别与整数m+1,m+2…对应,直到下一个赋了值的枚

举值或结束。因此,为枚举值所赋的整型常量值应从左至右递增。

(4)枚举类型的声明也可作为成组声明若干整型符号常量的方法。也就是说,把每个要声明的符号常量作为一个枚举值,将各个枚举值合在一起定义成一个枚举类型。

由于枚举类型属于用户定义数据类型,一旦枚举类型被定义后就可以使用它来定义变量。

2.3 变量

1.变量的定义

变量的定义是通过变量声明语句来实现的,变量声明语句的一般格式为:

[<存储类>]<类型名><变量名>[=<初值表达式>],…;

<存储类>有四种,它们分别是auto、register、static、extern。

<类型名>为已存在的一种数据类型名称,如char,short,int,long,float,double等基本数据类型名,或者用

户定义的数据类型名。

<变量名>是用户定义的一个标识符,用来表示一个变量,该变量可以通过后面的可选项赋予一个值,称为给变量

赋初值,也叫做对变量进行初始化。C++中标识符是区分大小写的,也就是说,大写字母和小写字母被认为是不同的字母。

变量名的命名遵循如下规则:

(1)不能是C++关键字;

(2)第一个字符必须是字母或下划线;

(3)中间不能有空格;

(4)+ -之类的特殊符号。

实际上变量名中除了能使用26个英文大小写字母和数字外,只能使用下划线“_”。

2.变量的使用方式

(1)全局变量和局部变量

全局变量是在所有函数定义、类定义和程序块之外声明的变量。声明全局变量时如果在程序中不对它进行专门的初

始化,该变量会被系统自动初始化为0。在程序的任何一个函数、类或程序块之内均可以访问全局变量。

局部变量是在某个函数定义、类定义或程序块之内声明的变量。局部变量只能在声明它的函数、类或程序块中被访问。

(2)生存期与作用域

生存期是指从一个变量被声明且分配了内存开始,直到该变量声明语句失效,它占用的内存空间被释放为止。一个

全局变量的生存期从它被声明开始,直到程序结束;一个局部变量的生存期从它被声明开始,直到包含它的最近的一个

程序块结束。

作用域是指变量名可以代表该变量存储空间的使用范围。

一般情况下,变量的作用域与其生存期一致,但由于C++语言允许在程序的不同部分为不同变量取同一名字,因此一

个变量名的作用域可能小于其生存期。

(3)变量的存储类属性

在C++中变量还可以按存储分配方式的不同被划分为4种不同的存储类别,它们分别是:

①auto变量:用关键字auto声明的局部变量称为自动变量。Auto为变量声明时的默认存储类别,即在变量定义时,

如果不显式标明存储类别,则系统自动按auto变量处理。Auto变量所占用存储空间的分配和释放工作将由系统自动完成。

②register变量:用关键字register声明的局部变量称为寄存器变量。Register变量可能以寄存器作为其存储空间。声明寄存器变量时,关键字register的作用只能是建议(而不是强制)系统使用寄存器,原因是寄存器虽然存取速度快,但空间有限,当寄存器不够用时,该变量仍然按自动变量处理。

③static变量:用关键字static声明的变量称为静态变量。任何静态变量的生存期将延续到整个程序的终止。与全

局变量一样,为静态变量分配的存储空间在整个程序运行过程中不再被释放;如果静态变量未被赋初值,系统将自动为

其赋初值为0。

④extern变量:用关键字extern声明的变量称为外部变量。变量一旦被声明为外部变量,系统就不必像一般变量那

样为其分配内存,因为该变量已在这一局部的外面被定义。外部变量一般用于多个文件组成的程序中,有些变量在多个

文件中被声明,但却是指同一变量。标明某一变量为外部变量可以避免为其重复分配内存。

(4)typedef类型说明

使用关键字typedef可以为已有类型名定义一个新类型名。其语法格式为:

typedef<已有类型名><新类型名>

typedef类型说明并没有真正地定义新的数据类型,它只是相当于给某个已有的数据类型起了一个别名。在规模较大

的程序中为了提高代码可读性常采用这种形式。

3.符号常量声明语句

符号常量在使用之前必须先进行声明。符号常量声明语句同变量声明语句类似,其语法格式为:

const<类型名><符号常量名><初值表达式>……;

其中,关键字const指明这是一条符号常量声明语句,后面跟着符号常量的类型名,接着是符号常量名,它是一个用

户定义的标识符,符号常量名之后为一个赋值号和一个初值表达式。由此可见,必须在声明符号常量的同时为其赋初值。该语句也可以声明多个符号常量。

系统执行符号常量声明语句时,需要依次为每个符号常量分配存储单元并赋初值。一个符号常量被声明后,它的值

就是声明所赋予的初值,作为常量,这个值以后将始终保持不变,因为系统只允许读取它的值,而不允许再次向它赋值。另外,在符号常量声明语句中,若<类型名>为int,则int可省略。

符号常量声明语句既可以出现在函数体外,也可以出现在函数体内,这一点也跟变量定义语句相同。

C++关键字中的true和false就是系统预先定义的两个符号常量,它们的值分别为1和0。使用符号常量往往可以提高

程序的可读性和可维护性。由于符号常量和变量同样要求系统为其分配内存单元,所以可以把符号变量视为一种不允许

赋值改变的或只读不写的变量,称其为const变量。

4.使用#define命令定义符号常量

# define命令是一条预处理命令,也可以用它来定义符号常量。其命令格式为:

#define<符号常量名><字符序列>

<符号常量名>是用户定义的标识符,又称为宏或宏标识符;<字符序列>也是由用户给定的用来代替宏的一串字

符序列,也称为宏替换体,它可以是数值常量、可计算值的表达式或字符串。宏被该命令定义后就可以使用在其后的程

序中。当程序被编译时将把所有地方使用的宏标识符替换为对应的字符序列,并把宏命令删除掉。

2.4 运算符和表达式

1.运算符和表达式的概念

C++语言中的运算符又称为操作符,是用来对数据进行运算的符号。

C++语言中的运算符可以根据其运算分量个数的多少分为单目(或一元)运算符、双目(或二元)运算符和三目(或

三元)运算符3类。

运算符可能是一个字符,也可能由两个或三个字符组成,还有一些运算符是C++关键字。

2.运算类型与运算符

C++包含多种不同种类的运算。每一种运算与其他运算的区别在于以下3个方面:

(1)参加运算的运算分量的数量和类型;

(2)运算结果的数据类型;

(3)运算的具体操作。

3.赋值运算

赋值运算是一种双目运算,其形式为:

<变量名>=<表达式>

右运算分量为一个表达式。“=”为赋值运算符(与数学中的等号含义不同)。左运算分量为与右运算分量类型相同的变量。

赋值运算的具体操作为:先计算右端表达式的值,然后把该值赋给左端变量。

4.算术运算符和算术表达式

算术运算是指int型、float型、double(也包括char型)的数值类数据计算后,得到同一类型数据的运算。算术运

算中所使用的运算符称为算术运算符。

单目算术运算符包括:-(单减)、+ +(增量)和- -(减量)。

单减运算的格式为:-<运算分量>

单减运算相当于对运算分量取相反数,例如:-a,-(x+y)。

增量运算有两种形式。

前缀增量:++<运算分量>

后缀增量:<运算分量>++

双目算术运算符包括:+(加)、-(减)、*(乘)、/(除)和%(取余)。它们的含义与数学上相同。该类运算的

运算分量为任一种数值类型,即任一种整数类型和任一种实数类型。

由算术运算符(包括单目和双目)连接运算分量而组成的式子称为算术表达式。每个算术表达式的值为一个数值,

其类型按照以下规则确定:

(1)当参加运算的两个运算分量均为整型时(但具体类型可以不同,如一个为int型,另一个为char型),则运算结

果为int型。

(2)当参加运算的两个运算分量中至少有一个是单精度型,并且另一个不是双精度型时,则运算结果为float型。

(3)当参加运算的两个运算分量中至少有一个是双精度型时,则运算结果为双精度型。

5.关系运算符和关系表达式

C++语言提供了6种关系运算符,它们是:

<(小于)、< =(小于等于)、>(大于)、> =(大于等于)、= =(等于)、! =(不等于)

这6种运算符都是双目运算符,用来比较两个运算分量的大小,运算结果为逻辑型值true或false(它们分别对应着

整数1和0。由一个关系运算符连接前后两个数值表达式而构成的式子称为关系表达式,简称关系式。当一个关系式成立时,则计算结果为逻辑值是(true),否则为逻辑值假(false)

关系运算符的使用格式为:

<运算分量><关系运算符><运算分量>

6.逻辑运算符和逻辑表达式

C++语言提供了3种逻辑运算符,它们是:

!(逻辑非)、&&(逻辑与)、||(逻辑或)

其中,!为单目运算符,&&和||为双目运算符。

逻辑运算符的使用格式为:

<逻辑运算符!><运算分量>

<运算分量><逻辑运算符&&

(1)计算两边运算分量的值;

(2)若运算分量的值不是逻辑型,则自动转换为逻辑型,即以0值为假(即false),非0值为真(即true);

(3)按不同逻辑运算符计算返回值。

7.位运算

C++提供6种位运算符。

(1)“&”是按位与运算符,它将两个运算分量的对应二进制位进行与操作。基中,0 和0与得0,0和1与得0,1和0与得0,1和1与得1。

(2)“|”是按位或运算符,它将两个运算分量的对应二进制位进行或操作。其中,0和0或得0,0和1或得1,1和0或得1,1和1或得1。

(3)“^”是按位异或运算符,它将两个运算分量的对应二进制位进行异或操作。其中,0和0异或得0,0和1异或得1,1和0异或得1,1和1异或得0。

(4)“>>”是按位右移运算符,由于右移的位数为右边运算分量的值,所以右边运算分量的值必须是一个整数。

(5)“<<”是按位左移运算符,由于左移的位数为右边运算分量的值,所以右边运算分量的值必须是一个整数。

(6)“~”是按位取反运算符,它将运算分量的对应二进制数的每一位进行取反操作。其中,0取反得1,1取反得0。

位运算符的使用格式:

<运算分量><双目运算符><运算分量>

<单目运算符><运算分量>

8.其他运算

(1)条件运算符

条件运算是C++中唯一的三目运算,与其对应的运算符?:称为条件运算符。条件运算符的使用格式为:

<表达式1>?<表达式2>:<表达式3>

当计算有条件运算符构成的表达式时,首先计算<表达式1>,若其值非0,则计算出<表达式2>的值,并用这个值

作为整个表达式的值;若<表达式1>的值为0,则计算出<表达式3>的值,并用这个值作为整个表达式的值。

(2)逗号运算符

C++中使用逗号运算符指明对多个表达式进行顺序求值。逗号运算符的使用格式为:

<表达式1>,<表达式2>,……<表达式n>

其中,每个逗号都称为逗号运算符,整个式子称为逗号表达式。上述逗号表达式的求值步骤为:从左向右依次计算

<表达式1>、<表达式2>…<表达式n>的值;将<表达式n>(即最右端的表达式)的值作为整个逗号表达式的值。

(3)sizeof运算符

使用运算符sizeof可以进行字长提取操作,因此sizeof运算符又称为字长提取符,它的使用格式为:

sizeof(<运算分量>)

其中,sizeof为关键字;<运算分量>既可以是一个类型名,也可以是一个表达式,当作为<运算分量>的表达式

只包含一个变量名时,圆括号()可以省略。

字长提取运算的结果为一个整数,该整数表示指定的类型或变量的字节长度,即在内存中占用的字节(Byte)数。

(4)圆括号运算符

C++中不仅将圆括号()归为运算符,而且根据不同的使用方式,可以对圆括号运算符的功能作出以下3种不同的解释:

①圆括号用于函数调用。其格式为:

<函数名>(<实参表>)

②圆括号用于强制类型转换。其格式为:

(<类型名>)<表达式>

③圆括号用于类型构造。其格式为:

<类型名>(<表达式>)

类型构造是指使用圆括号中<表达式>的值来构造一个具有目标数据类型的值,要构造的目标数据类型由<类型名

>指定。

④数组下标运算符:[](下标)。

⑤指针运算符:*(取地址)和&(值引用)。

⑥动态存储分配运算符:new(分配)和delete(释放)。

⑦作用域限定运算符:::(类域或全局域)

9.优先级和结合性

相关文档
相关文档 最新文档