2020年下半年 数据库系统工程师 上午试卷 综合知识 软考真题【含答案和答案解析】

1. 下列属于CPU中算术逻辑单元的部件是( )。

A. 程序计数器

B. 加法器

C. 指令寄存器

D. 指令译码器

2. 在CPU和主存之间设置高速缓存Cache)的目的是为了解决( )的问题。

A. 主存容量不足

B. 主存与外存储器速度不匹配

C. 主存与CPU速度不匹配

D. 外设访问效率

Cache即高速缓冲存储器,是为了解决CPU和主存之间速度匹配问题而设置的。它是介于CPU和主存之间的小容量存储器,存取速度比主存快。其改善系统性能的依据是程序的局部性原理。

.Cache主要由两部分组成,即控制部分和存储器部分。

.Cache存储器部分用来存放主存的部分副本。

.控制部分的功能是判断CPU要访问的信息是否在Cache存储器中,若在即为命中,若不在则没有命中。

高速缓存(Cache)是位于CPU和主存之间的高速存储子系统。采用高速缓存的主要目的是提高存储器的平均访问速度,使存储器的速度与CPU的速度相匹配。Cache的存在对程序员是透明的。其地址变换和数据块的替换算法均由硬件实现。通常Cache被集成到CPU内,以提高访问速度,其主要特点是容量小、速度快、成本高。

1)Cache的组成

Cache的组成如下图所示。Cache由两部分组成,即控制部分和缓存部分。缓存部分用来存放主存的部分复制信息。控制部分的功能是:判断CPU要访问的信息是否在Cache中,若在即为命中,若不在则没有命中。命中时直接对Cache寻址;未命中时,要按照替换原则,决定主存的一块信息放到Cache的哪一块里面。

高速缓存的组成框图

2)Cache中的地址映像方法

因为处理机访问都是按主存地址访问的,而应从Cache中读写信息,因此这就需要地址映像,即把主存中的地址映射成Cache中的地址。地址映像的方法有3种,即直接映像、全相联映像和组相联映像。

(1)直接映像就是主存的块与Cache中块的对应关系是固定的。主存中的块只能存放在Cache的相同块号中。因此,只要主存地址中的主存区号与Cache中的主存区号相同,则表明访问Cache命中。一旦命中,以主存地址中的区内块号立即可得到要访问的Cache中的块。这种方式的优点是地址变换很简单,缺点是灵活性差。

(2)全相联映像允许主存的任一块可以调入Cache的任何一块的空间中。在地址变换时,利用主存地址高位表示的主存块号与Cache中的主存块号进行比较,若相同则为命中。这种方式的优点是主存的块调入Cache的位置不受限制,十分灵活;其缺点是无法从主存块号中直接获得Cache的块号,变换比较复杂,速度比较慢。

(3)组相联映像是前面两种方式的折中。具体做法是将Cache中的块再分成组。组相联映像就是规定组采用直接映像方式而块采用全相联映像方式。这种方式下,通过直接映像方式来决定组号,在一组内再用全映像方式来决定Cache中的块号。由主存地址高位决定主存区号,与Cache中区号比较可决定是否命中。主存后面的地址即为组号,但组块号要根据全相联映像方式,由记录可以决定组内块号。

3)替换算法

选择替换算法的目标是使Cache获得最高的命中率。常用的替换算法有以下几种。

(1)随机替换(RAND)算法:用随机数发生器产生一个要替换的块号,将该块替换出去。

(2)先进先出(FIFO)算法:将最先进入的Cache信息块替换出去。

(3)近期最少使用(LRU)算法:将近期最少使用的Cache中的信息块替换出去。这种算法比先进先出算法要好些,但此法也不能保证过去不常用的将来也不常用。

(4)优化替换(OPT)算法:先执行一次程序,统计Cache的替换情况。有了这样的先验信息,在第二次执行该程序时便可以用最有效的方式来替换,达到最优的目的。

4)Cache的性能分析

若H为Cache的命中率,tc为Cache的存取时间,tm为主存的访问时间,则Cache的等效访问时间ta

ta=Htc+(1-H)tm

使用Cache比不使用Cache的CPU访问存储器的速度提高的倍数r可以用下式求得,即

3. 在计算机外部设备和主存之间直接传送而不是由CPU执行程序指令进行数据传送的控制方式称为( )。

A. 程序查询方式

B. 中断方式

C. 并行控制方式

D. DMA方式

指令是指挥计算机完成各种操作的基本命令。

(1)指令格式。计算机的指令由操作码字段和操作数字段两部分组成。

(2)指令长度。指令长度有固定长度的和可变长度的两种。有些RISC的指令是固定长度的,但目前多数计算机系统的指令是可变长度的。指令长度通常取8的倍数。

(3)指令种类。指令有数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操作指令、处理器控制指令等类型。

当移动主机到达外地网络后,完成代理发现和注册后,移动主机就可以和远程主机进行通信了。下图给出了数据传送过程示意图。

数据传送过程示意图

(1)从远程主机到归属地代理。当远程主机要向移动主机发送IP报文(源IP地址是远程主机地址,目的IP地址是移动主机归属地地址)时,这个报文被归属地代理截获了,即归属代理假装是这台移动主机。上图中的路径1表示了这个步骤。

(2)从归属地代理到外地代理。归属地代理在接收到这个IP报文后,就使用隧道技术(IP in IP),将接收到的IP报文发送给外地代理。事实上,归属地代理把源IP地址是远程主机地址、目的IP地址是移动主机归属地地址的IP报文再封装成另外一个IP报文(该IP报文的源地址是归属地代理IP地址,而目的地址是外地代理的IP地址)。上图中的路径2表示了这个步骤。

(3)从外地代理到移动主机。当外地代理接收到通过隧道技术发送来的IP报文时,它首先取出原来的IP报文。但是,因为IP报文的目的地址是移动主机的归属地地址,外地代理就从注册表中找出移动主机的转交地址,然后将这个报文发送到转交地址。上图中的路径3表示了这个步骤。

(4)从移动主机到远程主机。当移动主机要发送报文到远程主机时(如远程主机对它接收到的报文进行应答),它像通常那样发送,使用的是移动主机的归属地地址。上图中的路径4表示了这个步骤。

在整个数据发送过程中,远程主机并不知道移动主机的任何移动。移动主机的移动完全是透明的,因特网上的其他路由器并不知道移动主机的移动性。

4. 以下关于磁盘碎片整理程序的描述中,正确的是( )。

A. 磁盘碎片整理程序的作用是延长磁盘的使用寿命

B. 用磁盘碎片整理程序可以修复磁盘中的坏扇区,使其可以重新使用

C. 用磁盘碎片整理程序可以对内存进行碎片整理,以提高访问内存速度

D. 用磁盘碎片整理程序对磁盘进行碎片整理,以提高访问文件的速度

本知识点的要点是掌握与磁盘相关的最重要的概念与计算公式。

磁盘是最常见的一种外部存储器,它是由一至多个圆形磁盘组成的,其常见技术指标如下。

(1)磁道数=(外半径-内半径)×道密度×记录面数

说明:硬盘的第一面与最后一面是起保护作用的,一般不用于存储数据,所以在计算的时候要减掉。例如,6个双面的盘片的有效记录面数是6×2-2=10。

(2)非格式化容量=位密度×3.14×最内圈直径×总磁道数

说明:每个磁道的位密度是不相同的,但每个磁道的容量却是相同的。一般来说,0磁道是最外面的磁道,其位密度最小。

(3)格式化容量=总磁道数×每道扇区数×扇区容量

(4)平均数据传输速率=每道扇区数×扇区容量×盘片转速

说明:盘片转速是指磁盘每秒钟转多少圈。

(5)存取时间=寻道时间+等待时间

说明:寻道时间是指磁头移动到磁道所需的时间;等待时间为等待读写的扇区转到磁头下方所用的时间。显然,寻道时间与磁盘的转速没有关系。

5. 在常见的数据结构中,(5)是只能通过访问它的端来实现数据存储和检索的一种线性数据结构,它的修改遵循先进后出的原则;(6)是一种先进先出的线性表。(7)是取值范围受限的线性表

A. 链表

B. 队列

C. 栈

D. 串

根据数据元素之间关系的不同特性,通常有下列4类基本的逻辑结构,即集合结构、线性结构、树形结构、图形结构。

1)线性结构

线性表是最常用且最简单的一种数据结构。线性表中除第一个元素外,每个元素均只有一个直接前驱;除最后一个元素外,每个元素都只有一个直接后继。

栈是限定仅在表尾进行插入或删除操作的线性表,是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。

队列是一种先进先出(FIFO)的线性表,它只允许在表的一端进行插入,而在另一端删除元素。

2)树

树是nn≥0)个互不相交的有限集,当n=0时称为空树。在一棵非空树中,有且仅有一个节点称为根节点;当n>1时,其余的节点可分为若干个不相交的集合,其中每一个集合本身又是一棵树,这些集合称为根节点的子树。

3)图

图是由两个集合VE组成的二元组,记为G=(V, E),其中V是顶点的非空有限集合,E是图中边的有限集合。

线性表的顺序存储结构

1)顺序表的概念

线性表的顺序存储结构采用一组连续的存储单元依次存储线性表中的各数据元素。建立一个数组V,线性表的长度为NV[i]表示第i个分量,第i个分量是线性表中第i个元素ai在计算机存储器中的映象,即V[i]=ai。若线性表的第一个元素的存储地址是LOC(a1),每个元素用L个存储单元,则表的第i个元素的存储地址为:LOC(ai)=LOC(a1)+(i-1)*L

假设线性表的数据元素的类型为ElemType(在实际应用中,此类型应根据实际问题中出现的数据元素的特性具体定义,如为int、float类型等),线性表的顺序表的C语言描述如下:

从中可以看出,顺序表是由数组data和len两部分组成的。为了反映data和len之间的关系,上述类型定义中将它们说明为结构体类型Sqlist的两个域。这样,Sqlist类型就完全描述了顺序表的组织。

2)基本运算在顺序表上的实现

由于C语言中数组的下标是从0开始的,所以,在逻辑上所指的"第k个位置"实际上对应的是顺序表的"第k-1个位置"。这里仅给出在顺序表上线性表的插入和删除函数。

(1)插入函数。

插入函数的语法如下:

(2)删除函数。

删除函数的语法如下:

3)插入和删除元素算法的时间复杂度分析

(1)插入算法的时间复杂度。

插入算法的时间复杂度的分析如下:

其中pi是在第i个元素前插入元素的概率,ci是在第i个元素前插入元素时元素移动次数。

(2)删除算法的时间复杂度。

删除算法的时间复杂度的分析如下:

其中pi是在第i个元素前删除元素的概率,ci是在第i个元素前删除元素时元素移动次数。

可见,插入和删除算法的时间复杂度均为On)。

线性表的单链表存储结构

单链表中的每个节点由两部分组成:数据域和指针域。节点形式如下:

其中,data部分称为数据域,用于存储线性表的一个数据元素(节点)。next部分称为指针域或链域,用于存放一个指针,该指针指向本节点所含数据域元素的直接后继所在的节点。若数据元素的类型用ElemType表示,则单链表的类型定义如下:

单链表分为带头节点(其next域指向第一个节点)和不带头节点两种类型,由于头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致,因而可简化运算的实现过程。

在单链表上实现线性表基本运算的函数如下。

1)初始化函数initlist(Slink *head)

初始化函数用于创建一个头节点,由head指向它,该节点的next域为空,data域未设定任何值。由于调用该函数时,指针head在本函数中指向的内容发生改变,为了返回改变的值,因此使用了应用型参数,其时间复杂度为O(1)。初始化函数的语法如下:

2)插入函数insert(Slink *head, int i, ElemType x)

插入函数的设计思想是:创建一个data域值为x的新节点*p,然后插入到head所指向的单链表的第i个节点之前。为保证插入正确有效,必须查找到指向第i个节点的前一个节点的指针,主要的时间耗费在查找上,因而在长度为n的线性单链表进行插入操作的时间复杂度为On)。插入函数的语法如下:

3)删除函数delete(Slink *head, int i, ElemType x)

删除函数的设计思想是:线性链表中元素的删除要修改被删除元素前驱的指针,回收被删除元素所占的空间。主要的时间耗费在查找上,因而在长度为n线性单链表进行删除操作的时间复杂度为On)。删除函数的语法如下:

4)查找函数get(Slink *head, int i)

查找函数的设计思想是:线性链表中查找元素要找元素前驱的指针。在长度为n的线性单链表进行查找操作的时间复杂度为On)。查找函数的语法如下:

5)求单链表长函数Length(Slink *head)

求单链表长函数的设计思想是:通过遍历的方法,从头数到尾,即可得到单链表长。求单链表长函数的语法如下:

带头节点的单链表和不带头节点的单链表的区别

带头节点的单链表和不带头节点的单链表的区别主要体现在其结构上和算法操作上。

在结构上,带头节点的单链表不管链表是否为空,均含有一个头节点;而不带头节点的单链表不含头节点。

在操作上,带头节点的单链表的初始化为申请一个头节点,且在任何节点位置进行的操作算法一致;而不带头节点的单链表让头指针为空,同时其他操作要特别注意空表和第一个节点的处理。下面列举带头节点的单链表插入操作和不带头节点的插入操作的区别。

定义单链表的节点类型如下:

1)带头节点的单链表插入函数insert(Slink *head, int i, ElemType x)

带头节点的单链表插入函数的设计思想是:创建一个data域值为x的新节点*p,然后插入到head所指向的单链表的第i个节点之前。为保证插入正确有效,必须查找到指向第i个节点的前一个节点的指针,主要的时间耗费在查找上,因而在长度为n的线性单链表中进行插入操作的时间复杂度为On)。

2)不带头节点的单链表插入函数insert(inti, ElemTypex

不带头节点的单链表插入函数的设计思想是:创建一个data域值为x的新节点*p,然后插入到单链表的第i个节点之前。由于不带头节点,当插入位值i=1时,其算法与i>1时有很大差别,必须单独处理。为保证插入正确有效,必须查找到指向第i个节点的前一个节点的指针,主要的时间耗费在查找上,因而在长度为n的线性单链表中进行插入操作的时间复杂度为On)。

可见,带头节点的单链表插入操作和不带头节点的插入操作在算法实现上有很大的区别,主要体现在初始化、能否插入成功的判别及插入时的操作上,在带头节点的单链表上插入在任何位置上都是相同的,而在不带头节点单链表的第一个节点和其他节点前插入操作是不同的。

对于带头节点的单链表和不带头节点的单链表在其他操作上的区别可类似得到。

链表的指针修改的次序对结果的影响

链表的指针修改必须保持其逻辑结构的次序,否则将违背线性表的特征,尤其是进行插入和删除操作。下面通过双向链表的插入操作来说明,若在如下1图所示的P所指向的节点之前插入一个S所指向的节点,则需进行指针的修改,修改指针的策略有如下2图和下3图所示两种,指针的修改次序为1, 2, 3, 4。根据线性表的性质可知,下图可保证指针修改成功;而下图中指针修改不成功,主要原因是其首先将P的前驱指向S,这样P节点的原前驱节点就不能找到了,因而指针修改步骤3和步骤4不成立。

双向链表的节点插入前

指针的修改策略1

指针的修改策略2

可见,指针的修改次序是链表插入成功与否的关键因素之一;同理,在进行节点的删除时也同样需要主要指针的次序。

顺序存储结构上的算法如何移植到链式存储结构上

很多优秀的算法都是建立在顺序存储结构上的,如何在链式存储结构上实现这些优秀算法,是考生应注意的问题。近年来,在不少程序员水平考试试题中都出现了这样的题目。这里,我们通过在顺序存储结构和链式存储结构两种存储结构上实现选择排序来说明。顺序存储结构下的算法sort的语法如下:

依据顺序存储结构下的算法sort1可以拓展到链式存储结构下的算法sort2。下面将算法sort1拓展到链式存储结构下的算法sort2,语法如下:

可见,只要充分领会顺序存储结构下的算法思想,熟悉链表存储结构就可通过掌握顺序存储结构下的算法得到链表存储结构下的相应算法。

6. 在常见的数据结构中,(5)是只能通过访问它的端来实现数据存储和检索的一种线性数据结构,它的修改遵循先进后出的原则;(6)是一种先进先出的线性表。(7)是取值范围受限的线性表。

A. 链表

B. 队列

C. 栈

D. 串

7. 在常见的数据结构中,(5)是只能通过访问它的端来实现数据存储和检索的一种线性数据结构,它的修改遵循先进后出的原则;(6)是一种先进先出的线性表。(7)是取值范围受限的线性表。

A. 链表

B. 栈

C. 栈

D. 串

8. 二叉遍历是按照某种策略访问中的每个节点,且仅访问一次。按照遍历左子要在遍历右子之前进行的原则,根据访问( )位置的不同, 可得到二叉的前序、中序和后序三种遍历方法。

A. 根节点

B. 导航节点

C. 叶子结点

D. 兄弟节点

二叉树的定义

二叉树(Binary Tree)是n(n≥0)个节点的有限集合,它或者是空树(n=0),或者是由一个根节点及两棵互不相交的、分别称为左子树和右子树的二叉树所组成。

二叉树与树的区别如下。

.二叉树的节点的子树要区分左子树和右子树,即使在节点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树。

.二叉树的节点的最大度为2,而树中不限制节点的度数。

二叉树的运算

二叉树的基本运算是遍历,其他运算可建立在遍历运算的基础上。

二叉树的性质

二叉树具有以下性质。

(1)二叉树第i层上的节点数目最多为2i-1(i≥1)个。

(2)深度为k的二叉树至多有2k-1(k≥1)个节点。

(3)在任意一棵二叉树中,若终端节点数为n0,度为2的节点数为n2,则n0=n2+1。

(4)具有n个节点的完全二叉树的深度为[log2n]+1。

(5)对一棵有n个节点的完全二叉树的节点按层次自左至右进行编号,则对任意节点i有以下性质。

.若i=1,则节点i是二叉树的根,无双亲;若i>1,则其双亲为

.若2i>n,则节点i无左孩子;否则其左孩子为2i

.若2i+1>n,则节点i无右孩子;否则其右孩子为2i+1。

若深度为k的二叉树有2k-1个节点,则称其为满二叉树。

深度为k、有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树编号从1至n的节点一一对应时,称之为完全二叉树。

二叉树的存储结构

1)顺序存储结构

用一组地址连续的存储单元存储二叉树中的数据元素,必须把节点排成一个适当的线性序列,并且节点在这个序列中的相互位置能反映出节点之间的逻辑关系。

顺序存储结构用于完全二叉树时既简单又节省空间,而对于一般二叉树则不适用。因为在顺序存储结构中,以节点在存储单元中的位置来表示节点之间的关系,那么对于一般的二叉树来说,也必须按照完全二叉树的形式存储,也就是要添上一些实际并不存在的"虚节点",这将造成空间的浪费。

2)链式存储结构

由于二叉树中的节点包含有数据元素、左子树根、右子树根及双亲等信息,因此可以用三叉链表或二叉链表来存储二叉树,链表的头指针指向二叉树的根节点。

二叉树的遍历

遍历是指按某种策略访问树中的每个节点,且仅访问一次。由于二叉树所具有的递归性质,一棵非空的二叉树可以看作由根节点、左子树和右子树三部分构成,因此若能依次遍历这三部分中的每个节点信息,也就遍历了整棵二叉树。按照遍历左子树要在遍历右子树之前进行的约定,根据访问根节点位置的不同,可得到二叉树的前序、中序和后序3种遍历方法。

遍历二叉树的基本操作就是访问节点,不论按照哪种次序遍历,对含有n个节点的二叉树,遍历算法的时间复杂度都为O(n)。在最坏情况下,二叉树是有n个节点且深度为n的单枝树,遍历算法的空间复杂度也为O(n)。

遍历二叉树的过程实质上是按一定规则,将树中的节点排成一个线性序列的过程,因此遍历操作得到的是树中节点的一个线性序列。在每一种序列中,有且仅有一个起始点和一个终节点,其余节点有且仅有唯一的直接前驱和直接后继。

对二叉树还可以进行层序遍历。层序遍历就是从树的根节点出发,首先访问第1层的树根节点,然后从左到右依次访问第2层上的节点,以此类推,自上而下、自左到右逐层访问树中各层上节点的过程。

线索二叉树

n个节点的二叉树采用链表作存储结构,则链表中含有n+1个空指针域,利用这些空指针域来存放指向节点的前驱和后继信息。线索链表的节点结构如下图所示。

线索链表的节点结构

若二叉树的二叉链表采用上图所示的节点结构,则相应的链表称为线索链表,其中指向节点前驱、后继的指针称为线索,加上线索的二叉树称为线索二叉树。对二叉树以某种次序遍历使其变为线索二叉树的过程称为线索化。

二叉树的应用:最优二叉树

霍夫曼树又称最优二叉树,是一类带权路径长度最短的树。

路径:是指从树中一个节点到另一个节点之间的通路,路径上的分支数目称为路径长度。

树的路径长度:是从树根到每一个叶子的路径长度之和。节点的带权路径长度为从该节点到树根之间的路径长度与该节点权的乘积。

树的带权路径长度:指树中所有叶子节点的带权路径长度之和,记为

式中,n为带权叶子节点的数目;wi为叶子节点的权值;li为叶子节点到根的路径长度。

霍夫曼树是指权值为w1w2,…,wnn个叶子节点的二叉树中带权路径长度最小的二叉树。

构造最优二叉树的霍夫曼算法如下。

(1)根据给定的n个权值w1w2,…,Wn构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为wi的根节点,其左右子树均空。

(2)在F中选取两棵根节点的权值最小的树作为左右子树,构造一棵新的二叉树,置新构造二叉树的根节点的权值为其左、右子树根节点的权值之和。

(3)从F中删除这两棵树,同时将新得到的二叉树加入到F中。

重复(2)、(3),直到F中只含一棵树时为止。这棵树便是霍夫曼树。

树和森林

1)树的存储结构

.树的双亲表示法:用一组地址连续的单元存储树的节点,并在每个节点中附设一个指示器,指示其双亲节点在该存储结构中的位置。显然这种表示对于求指定节点的双亲或祖先都十分方便,但对于求指定节点的孩子及后代则需要遍历整个数组。

.树的孩子表示法:在存储结构中用指针指示出节点的每个孩子,由于树中每个节点的子树数目不尽相同,因此在采用链式存储结构时可以考虑多重链表。

.树的孩子兄弟表示法:又称二叉链表表示法。在链表的节点中设置两个指针域分别指向该节点的第一个孩子和下一个兄弟。利用这种存储结构便于实现树的各种操作。

2)树和森林的遍历

(1)树的遍历。树的遍历分为先根遍历和后根遍历两种。

.先根遍历:先访问树的根节点,然后依次先根遍历根的各棵子树。对树的先根遍历等同于对转换所得的二叉树进行先序遍历。

.后根遍历:先依次后根遍历树根的各棵子树,然后访问树根节点。树的后根遍历等同于对转换所得的二叉树进行中序遍历。

(2)森林的遍历。森林的遍历分为前序遍历和后序遍历两种。

.前序遍历森林:若森林非空,访问森林中第一棵树的根节点,前序遍历第一棵子树根节点的子树森林,再前序遍历除第一棵树之外剩余的树所构成的森林。

.后序遍历森林:若森林非空,后序遍历森林中第一棵树的子树森林,访问第一棵树的根节点,后序遍历除第一棵树之外剩余的树所构成的森林。

3)树、森林与二叉树的转换

(1)树、森林转换为二叉树。利用树的孩子兄弟表示法可导出树与二叉树的对应关系,在树的孩子兄弟表示法中,从物理结构上看与二叉树的二叉链表表示法相同,因此就可以用这种同一存储结构的不同解释将一棵树转换为一棵二叉树。

将一个森林转换为一棵二叉树的方法是:先将森林中的每一棵树转换为二叉树,再将第一棵树的根作为转换后的二叉树的根,第一棵树的左子树作为转换后二叉树根的左子树,第二棵树作为转换后二叉树根的右子树,第三棵树作为转换后二叉树根的右子树的右子树,以此类推,森林就可以转换为一棵二叉树。

(2)二叉树转换为树和森林。若二叉树非空,则二叉树根及其左子树为第一棵树的二叉树形式,二叉树根的右子树又可以看作一个由森林转换后的二叉树,应用同样的方法,直到最后产生一棵没有右子树的二叉树为止,这样就得到了一个森林。为了进一步得到树,可用树的二叉链表表示的逆方法,即节点的右子树的根、右子树的右子树的根……找出原本是同一个双亲的兄弟。二叉树转换为树或森林是唯一的。

树的存储结构及遍历操作

树是非线性结构,存储树时,须把树中结点之间存在的关系反映在树的存储结构中。树有很多存储结构,这里仅介绍最常用的两种。

1)树的标准存储结构

树的标准存储结构由结点的数据和指向子结点的指针数组组成;对于度为M的树,其指针数组中的元素个数为M。

2)树的带逆存储结构

由于树的带逆存储结构需要一个从子结点指向父结点的指针,因而该结构在标准存储结构的基础上,需要在树的结点中增加一个指向其双亲结点位置的指针。

树的遍历是树的基本操作之一,也是最重要的操作之一。树的遍历含义是指:按照某种要求依次访问树中的每个结点,每个结点均被访问一次且仅被访问一次。常用的树的遍历方法可分为前序遍历、后序遍历和中序遍历。

(1)树的前序遍历。首先访问根结点,然后从左到右前序遍历根结点的各棵子树。树的前序遍历递归算法如下:

若利用栈来记录当前未访问完的子树的根结点指针,则前序遍历的非递归算法如下:

(2)树的后序遍历。树的后序遍历的基本思想是:先依次遍历每棵子树,然后访问根结点,与后序遍历二叉树相同。树的后序遍历递归算法如下:

(3)树的中序遍历。树的中序遍历的基本思想是:先左子树,遍历根结点,然后依次遍历其他各棵子树,类似二叉树的中序遍历。树的中序遍历递归算法如下:

二叉树的递归定义

二叉树是结点的集合,这个集合或者为空,或者是由一个根和两棵互不相交的被称为左子树和右子树的二叉树组成。二叉树中的每个结点至多有两棵子树,且有左右之分,次序不能颠倒。

二叉树是一种重要的树型结构,但不是树的特例,其有5种形态,分别为:空(二叉树);只有根结点;根结点和左子树;根结点和右子树;根结点和左右子树。

二叉树与树的区别:二叉树可以为空,每个结点子树不超过2个,而树至少有一个结点且结点子树无限制。

二叉树的性质及其推广

二叉树的性质如下。

性质1:在二叉树的第i层上至多有2i-1个结点(i≥1)。

性质2:深度为k的二叉树至多有2k-1个结点(k≥1)。

性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0= n2+1。

性质4:具有n个结点的完全二叉树的深度为

性质5:如果有n个结点的完全二叉树,对任一结点i(1

.如果i=1,则i为根,无双亲;若i>1,则i的双亲为

.如果2i>n,则无左孩子,否则左孩子为2i。

.如果2i+1>n,则无右孩子,否则右孩子为2i+1。

二叉树的有关性质可推广到k叉树,如:一棵含有n个结点的二叉树共含有n+1个空指针;而一棵含有n个结点的三叉树共含有2n+1个空指针。推而广之,一棵含有n个结点的k叉树共含有(k-1)n+1个空指针。

不难看出,在k叉树的第i层上至多有ki-1个结点(i≥1);深度为H的k叉树至多有(kH-1)/(k-1)个结点(H≥1)。

同理,可得含N个结点和N个叶子结点的完全三叉树的高度分别为:

其推导过程如下。

(1)设含N个结点的完全三叉树的高度为H,则1+3+…+3H-2+1≤N≤1+3+…+3H-1,3H-1≤2N-1≤3H-2,即

(2)设含N个叶子结点的完全三叉树的高度为H,则3H-2≤N≤3H-1,即

可进一步推广,含N个结点的完全k叉树的高度为

二叉树遍历的非递归

二叉树的遍历是其操作的重点,通常采用的递归算法不难实现和理解。但要实现二叉树遍历的非递归则有一定的难度,因而是理解二叉树遍历的难点。

由于很多程序员考题中都隐含地利用二叉树遍历的非递归算法,如:求二叉树中某个结点的祖先等,因而必须牢固地掌握二叉树的3种遍历的非递归算法。本质上,程序员考题中不是要考生遍历二叉树中的所有结点,而是遍历满足某种条件的结点并输出,在成功找到答案之前需要保留访问过的部分结点信息,因而须借助栈和队列等重要的数据结构。

二叉树的前序、中序和后序遍历的非递归算法分别如下所述。

二叉链表的C语言描述如下:

1)前序遍历的非递归算法

2)中序遍历的非递归调用算法

3)后序遍历的非递归调用算法

下面通过例子来说明二叉树遍历的非递归应用。

例如,在以二叉链表为存储结构的二叉树中,打印数据域值为x的结点(假定结点值不相同),并打印x的所有祖先的数据域值。

解决此问题的算法思想是:若在查找某结点的过程中,记下其祖先结点,则可以实现本问题要求。能实现这种要求的数据结构是栈,故设置一个栈用于装入x结点的所有祖先。而这种查找只有用非递归的后序遍历。

栈的元素结构说明如下:

用线索二叉树实现二叉树的非递归

以二叉链表作为存储结构时,只能找到左、右子树信息,不能直接得到结点在任一序列中的前驱和后继信息,最简单的方法是每个结点上增加两个指针域,但有点浪费。其实,n个结点的二叉链表中必定存在n+1个空链域,因此可用这些链域来存放结点的前驱和后继信息。改进后的结点结构如下。

其中,ltag=0:表示lchild域指示结点的左子树。

ltag=1:表示lchild域指示结点的前驱。

rtag=0:表示rchild域指示结点的左子树。

rtag=1:表示rchild域指示结点的前驱。

其C语言描述如下:

以这种结构构成的二叉链表叫作线索链表,其中指向结点前驱和后继的指针叫线索。加上线索的二叉树叫线索二叉树。对二叉树以某种次序遍历使其成为线索二叉树的过程叫作线索化。

对给定的线索二叉树中的某个结点p,查找结点p的后继(中序),其特点为所有叶子结点的右链直接指示了后继,所有非终端结点的后继应是其右子树中第一个中序遍历的结点。

对给定的线索二叉树中的某个结点p,查找结点p的前驱(中序),其特点为若其左标志为1,则左链为线索,指示其前驱,否则其前驱为左子树上最后遍历的一个结点。

可见,对线索二叉树进行遍历可通过线索找到相应的前驱和后继,而无须进行递归。

例如,对给定的中序线索化二叉树,查找结点*p的中序后继。在中序线索二叉树中,查找p指针的结点,其后继分为两种情况:若p->rtag=1,则p->rchild,即指向其后继结点;若p->rtag=0,则*p结点的中序后继必为其右子树中第一个中序遍历到的结点,即从*p的右子树开始,沿着左指针链向下找,直到找到一个没有左子树的结点,该结点就是*p的右子树中"最左下"的结点。其算法如下:

二叉树与树或森林转换的目的

由于树或森林可借用孩子兄弟表示法实现与二叉树的转换,所以只要研究二叉树的特性就行了,而无须对树或森林单独进行深入的讨论。

这里仅给出森林和二叉树的转换算法,树和二叉树的转换算法类似。

1)森林的二叉树表示

森林转换成二叉树的步骤如下。

设F={T1,T2,…,Tn}是森林,对应的二叉树B={root,LB,RB},则:

(1)若F为空,即n=0,则B为空。

(2)若F非空,即n>0,则二叉树的根为T1的根,其左子树是从T1中根结点的子树森林F={T11,T12,…,T1n}转换而成的二叉树;其右子树是从森林F={T2,T3,…,Tn}转换而成的二叉树。

2)二叉树转化为森林

若B是一棵二叉树,根为T,L为左子树的根,R为右子树的根,则其相应的森林F{B}由下列步骤形成。

(1)若B为空,则F为空。

(2)若B非空,则B的根结点T为{T1,T2,…,Tn}的根结点,B[L]构成了T1的不相交的子树集合{T11,T12,…,T1n};B[R]构成了森林中其他的树T2,…,Tn

建立二叉树的若干方法

建立二叉树的方法有很多,如:按完全二叉树的形式输入字符序列,其中空格表示相应的子树为空。

近年来,在程序员考试中经常出现的二叉树建立为:已知二叉树的后序序列和中序序列或已知二叉树的前序序列和中序序列,要求考生确定一棵二叉树。

例如,一棵二叉树的中序序列和后序序列分别是DCBAEFG和DCBGFEA,请给出该二叉树的前序序列。该题可通过后序遍历确定二叉树的根结点,然后找到该数据值在前序序列中的位置,并用该位置的左部序列和后序序列中的相应序列构造左子树,用该位置的右部序列和后序序列中的相应序列构造右子树,如此不断地递归构造即可得到二叉树。建立的二叉树如下图所示。

二叉树

而且,该题还可以引申到要考生证明已知二叉树的前序序列和中序序列,可唯一确定一棵二叉树;或要求考生针对已知二叉树的前序序列和中序序列,写出建立一棵二叉树的算法等。同时,要求考生证明已知二叉树的前序序列和后序序列,不能唯一确定一棵二叉树。

当然还可以通过给定的广义表建立二叉树等。可见,建立二叉树的方法很多,只要考生掌握了二叉树递归定义的本质和输入形式就可以方便地建立二叉树。

哈夫曼树的建立和哈夫曼编码的构造

1)哈夫曼树的基本概念

.路径:由从树中一个结点到另一个结点之间的分支构成两结点之间的路径。

.路径长度:路径上的分支数目。

.树的路径长度:从树根到每一个结点的路径长度之和。

.结点的带权路径长度:从结点到根之间的路径长度与结点上权的乘积WkLk

.树的带权路径长度:树中所有带权叶子结点的路径长度之和。

.哈夫曼树:假设有n个数值{W1,W2,…,Wn},试构造一棵有n个叶子结点的二叉树,结点带权为W1,带权路径长度WPL最小的二叉树称哈夫曼树。

对下图给定的两棵二叉树,它们的带权路径长度分别如下。

二叉树

(1)WPL=7*2+5*2+2*2+4*2=36。

(2)WPL=7*1+5*2+2*3+4*3=35。

2)哈夫曼树的构造

哈夫曼树的构造算法如下。

(1)根据给定的n个数值{W1,W2,…,Wn}构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为Wi的根结点,左右子树均空。

(2)在F中选取两棵根结点的数值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的数值为其左右子树上根结点的数值之和。

(3)在F中删除这两棵树,同时将新得到的二叉树加入F中。

(4)重复步骤(2)、(3),直到F只含一棵树为止。

3)哈夫曼编码

哈夫曼编码的设计思想是:若要设计长短不等的编码,则必须是任意一个字符的编码都不是另一个字符的编码的前缀,这种编码称为前缀编码。利用二叉树来设计二进制的前缀编码,设计长度最短的二进制前缀编码,以n种字符出现的频率作为权,由此得到的二进制前缀编码为哈夫曼编码。

如何利用树型结构求解集合的幂

求集合{1,2,…,n}的幂集问题是一个经典的问题。解决这个问题的最典型做法就是递归调用,传统的做法这里不再讨论。

如何利用树状结构这个参照系来设计求集合{1,2,…,n}的幂集算法是我们讨论的重点。对于给定的集合{1,2,3,4},按幂集集合中的元素个数和字典次序建立的树如下图所示。

集合{1,2,3,4}的幂集树型示意

为了保持集合中元素的字典次序,可采用两种方法来求集合{1,2,3,4}的幂集集合:①采用前序遍历树;②按层次遍历树。特别要注意的是在设计求集合的幂集时并不建立真正的树,而是在考生的心里建立这样一个虚拟的树,并以这棵树为参照系。下面给出这两种方法的算法。

方法1:前序遍历虚拟树。

方法2:按层次遍历虚拟树。

可见,灵活地应用树状结构及其遍历操作的思路,能有效地解决实际应用问题。

二叉树的应用

二叉树运算是数据结构的重要内容。为了加深对二叉树内容的理解,这里给出一些应用实例。为方便描述,二叉树的顺序存储结构用一维数组R来表示,而二叉链表的结点存储结构定义如下:

(1)以二叉链表为存储结构,写一算法用括号形式(key,LT,RT)打印二叉树,其中key是根结点数据,LT和RT分别是括号形式的左右子树。并且要求:空树不打印任何信息,一个结点x的树打印形式是x,而不应是(x,)的形式。代码如下:

(2)建立哈夫曼树和哈夫曼编码。

(3)将已知二叉树改建为中序线序树。

将已知二叉树改建为中序线序树的算法的主要思路是:对二叉树进行中序遍历,若当前被访问结点的左子结点指针为空,则让它指向当前结点的前驱结点;若其前驱结点的右子结点指针为空,则让它指向当前结点。相应的算法如下:

9. 以下有关霍夫曼的说法中,错误的是( )。

A. 霍夫曼树又被称为最优二叉树

B. 霍夫曼树是一种带 权路径长度最短的树

C. 具有n个叶子节点的权值为W1,W2, ... Wn的最优二叉树是唯一的

D. 霍夫曼树可以用来进行通信电文的编码和解码

树的存储结构及遍历操作

树是非线性结构,存储树时,须把树中结点之间存在的关系反映在树的存储结构中。树有很多存储结构,这里仅介绍最常用的两种。

1)树的标准存储结构

树的标准存储结构由结点的数据和指向子结点的指针数组组成;对于度为M的树,其指针数组中的元素个数为M。

2)树的带逆存储结构

由于树的带逆存储结构需要一个从子结点指向父结点的指针,因而该结构在标准存储结构的基础上,需要在树的结点中增加一个指向其双亲结点位置的指针。

树的遍历是树的基本操作之一,也是最重要的操作之一。树的遍历含义是指:按照某种要求依次访问树中的每个结点,每个结点均被访问一次且仅被访问一次。常用的树的遍历方法可分为前序遍历、后序遍历和中序遍历。

(1)树的前序遍历。首先访问根结点,然后从左到右前序遍历根结点的各棵子树。树的前序遍历递归算法如下:

若利用栈来记录当前未访问完的子树的根结点指针,则前序遍历的非递归算法如下:

(2)树的后序遍历。树的后序遍历的基本思想是:先依次遍历每棵子树,然后访问根结点,与后序遍历二叉树相同。树的后序遍历递归算法如下:

(3)树的中序遍历。树的中序遍历的基本思想是:先左子树,遍历根结点,然后依次遍历其他各棵子树,类似二叉树的中序遍历。树的中序遍历递归算法如下:

二叉树的递归定义

二叉树是结点的集合,这个集合或者为空,或者是由一个根和两棵互不相交的被称为左子树和右子树的二叉树组成。二叉树中的每个结点至多有两棵子树,且有左右之分,次序不能颠倒。

二叉树是一种重要的树型结构,但不是树的特例,其有5种形态,分别为:空(二叉树);只有根结点;根结点和左子树;根结点和右子树;根结点和左右子树。

二叉树与树的区别:二叉树可以为空,每个结点子树不超过2个,而树至少有一个结点且结点子树无限制。

二叉树的性质及其推广

二叉树的性质如下。

性质1:在二叉树的第i层上至多有2i-1个结点(i≥1)。

性质2:深度为k的二叉树至多有2k-1个结点(k≥1)。

性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0= n2+1。

性质4:具有n个结点的完全二叉树的深度为

性质5:如果有n个结点的完全二叉树,对任一结点i(1

.如果i=1,则i为根,无双亲;若i>1,则i的双亲为

.如果2i>n,则无左孩子,否则左孩子为2i。

.如果2i+1>n,则无右孩子,否则右孩子为2i+1。

二叉树的有关性质可推广到k叉树,如:一棵含有n个结点的二叉树共含有n+1个空指针;而一棵含有n个结点的三叉树共含有2n+1个空指针。推而广之,一棵含有n个结点的k叉树共含有(k-1)n+1个空指针。

不难看出,在k叉树的第i层上至多有ki-1个结点(i≥1);深度为H的k叉树至多有(kH-1)/(k-1)个结点(H≥1)。

同理,可得含N个结点和N个叶子结点的完全三叉树的高度分别为:

其推导过程如下。

(1)设含N个结点的完全三叉树的高度为H,则1+3+…+3H-2+1≤N≤1+3+…+3H-1,3H-1≤2N-1≤3H-2,即

(2)设含N个叶子结点的完全三叉树的高度为H,则3H-2≤N≤3H-1,即

可进一步推广,含N个结点的完全k叉树的高度为

二叉树遍历的非递归

二叉树的遍历是其操作的重点,通常采用的递归算法不难实现和理解。但要实现二叉树遍历的非递归则有一定的难度,因而是理解二叉树遍历的难点。

由于很多程序员考题中都隐含地利用二叉树遍历的非递归算法,如:求二叉树中某个结点的祖先等,因而必须牢固地掌握二叉树的3种遍历的非递归算法。本质上,程序员考题中不是要考生遍历二叉树中的所有结点,而是遍历满足某种条件的结点并输出,在成功找到答案之前需要保留访问过的部分结点信息,因而须借助栈和队列等重要的数据结构。

二叉树的前序、中序和后序遍历的非递归算法分别如下所述。

二叉链表的C语言描述如下:

1)前序遍历的非递归算法

2)中序遍历的非递归调用算法

3)后序遍历的非递归调用算法

下面通过例子来说明二叉树遍历的非递归应用。

例如,在以二叉链表为存储结构的二叉树中,打印数据域值为x的结点(假定结点值不相同),并打印x的所有祖先的数据域值。

解决此问题的算法思想是:若在查找某结点的过程中,记下其祖先结点,则可以实现本问题要求。能实现这种要求的数据结构是栈,故设置一个栈用于装入x结点的所有祖先。而这种查找只有用非递归的后序遍历。

栈的元素结构说明如下:

用线索二叉树实现二叉树的非递归

以二叉链表作为存储结构时,只能找到左、右子树信息,不能直接得到结点在任一序列中的前驱和后继信息,最简单的方法是每个结点上增加两个指针域,但有点浪费。其实,n个结点的二叉链表中必定存在n+1个空链域,因此可用这些链域来存放结点的前驱和后继信息。改进后的结点结构如下。

其中,ltag=0:表示lchild域指示结点的左子树。

ltag=1:表示lchild域指示结点的前驱。

rtag=0:表示rchild域指示结点的左子树。

rtag=1:表示rchild域指示结点的前驱。

其C语言描述如下:

以这种结构构成的二叉链表叫作线索链表,其中指向结点前驱和后继的指针叫线索。加上线索的二叉树叫线索二叉树。对二叉树以某种次序遍历使其成为线索二叉树的过程叫作线索化。

对给定的线索二叉树中的某个结点p,查找结点p的后继(中序),其特点为所有叶子结点的右链直接指示了后继,所有非终端结点的后继应是其右子树中第一个中序遍历的结点。

对给定的线索二叉树中的某个结点p,查找结点p的前驱(中序),其特点为若其左标志为1,则左链为线索,指示其前驱,否则其前驱为左子树上最后遍历的一个结点。

可见,对线索二叉树进行遍历可通过线索找到相应的前驱和后继,而无须进行递归。

例如,对给定的中序线索化二叉树,查找结点*p的中序后继。在中序线索二叉树中,查找p指针的结点,其后继分为两种情况:若p->rtag=1,则p->rchild,即指向其后继结点;若p->rtag=0,则*p结点的中序后继必为其右子树中第一个中序遍历到的结点,即从*p的右子树开始,沿着左指针链向下找,直到找到一个没有左子树的结点,该结点就是*p的右子树中"最左下"的结点。其算法如下:

二叉树与树或森林转换的目的

由于树或森林可借用孩子兄弟表示法实现与二叉树的转换,所以只要研究二叉树的特性就行了,而无须对树或森林单独进行深入的讨论。

这里仅给出森林和二叉树的转换算法,树和二叉树的转换算法类似。

1)森林的二叉树表示

森林转换成二叉树的步骤如下。

设F={T1,T2,…,Tn}是森林,对应的二叉树B={root,LB,RB},则:

(1)若F为空,即n=0,则B为空。

(2)若F非空,即n>0,则二叉树的根为T1的根,其左子树是从T1中根结点的子树森林F={T11,T12,…,T1n}转换而成的二叉树;其右子树是从森林F={T2,T3,…,Tn}转换而成的二叉树。

2)二叉树转化为森林

若B是一棵二叉树,根为T,L为左子树的根,R为右子树的根,则其相应的森林F{B}由下列步骤形成。

(1)若B为空,则F为空。

(2)若B非空,则B的根结点T为{T1,T2,…,Tn}的根结点,B[L]构成了T1的不相交的子树集合{T11,T12,…,T1n};B[R]构成了森林中其他的树T2,…,Tn

建立二叉树的若干方法

建立二叉树的方法有很多,如:按完全二叉树的形式输入字符序列,其中空格表示相应的子树为空。

近年来,在程序员考试中经常出现的二叉树建立为:已知二叉树的后序序列和中序序列或已知二叉树的前序序列和中序序列,要求考生确定一棵二叉树。

例如,一棵二叉树的中序序列和后序序列分别是DCBAEFG和DCBGFEA,请给出该二叉树的前序序列。该题可通过后序遍历确定二叉树的根结点,然后找到该数据值在前序序列中的位置,并用该位置的左部序列和后序序列中的相应序列构造左子树,用该位置的右部序列和后序序列中的相应序列构造右子树,如此不断地递归构造即可得到二叉树。建立的二叉树如下图所示。

二叉树

而且,该题还可以引申到要考生证明已知二叉树的前序序列和中序序列,可唯一确定一棵二叉树;或要求考生针对已知二叉树的前序序列和中序序列,写出建立一棵二叉树的算法等。同时,要求考生证明已知二叉树的前序序列和后序序列,不能唯一确定一棵二叉树。

当然还可以通过给定的广义表建立二叉树等。可见,建立二叉树的方法很多,只要考生掌握了二叉树递归定义的本质和输入形式就可以方便地建立二叉树。

哈夫曼树的建立和哈夫曼编码的构造

1)哈夫曼树的基本概念

.路径:由从树中一个结点到另一个结点之间的分支构成两结点之间的路径。

.路径长度:路径上的分支数目。

.树的路径长度:从树根到每一个结点的路径长度之和。

.结点的带权路径长度:从结点到根之间的路径长度与结点上权的乘积WkLk

.树的带权路径长度:树中所有带权叶子结点的路径长度之和。

.哈夫曼树:假设有n个数值{W1,W2,…,Wn},试构造一棵有n个叶子结点的二叉树,结点带权为W1,带权路径长度WPL最小的二叉树称哈夫曼树。

对下图给定的两棵二叉树,它们的带权路径长度分别如下。

二叉树

(1)WPL=7*2+5*2+2*2+4*2=36。

(2)WPL=7*1+5*2+2*3+4*3=35。

2)哈夫曼树的构造

哈夫曼树的构造算法如下。

(1)根据给定的n个数值{W1,W2,…,Wn}构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为Wi的根结点,左右子树均空。

(2)在F中选取两棵根结点的数值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的数值为其左右子树上根结点的数值之和。

(3)在F中删除这两棵树,同时将新得到的二叉树加入F中。

(4)重复步骤(2)、(3),直到F只含一棵树为止。

3)哈夫曼编码

哈夫曼编码的设计思想是:若要设计长短不等的编码,则必须是任意一个字符的编码都不是另一个字符的编码的前缀,这种编码称为前缀编码。利用二叉树来设计二进制的前缀编码,设计长度最短的二进制前缀编码,以n种字符出现的频率作为权,由此得到的二进制前缀编码为哈夫曼编码。

如何利用树型结构求解集合的幂

求集合{1,2,…,n}的幂集问题是一个经典的问题。解决这个问题的最典型做法就是递归调用,传统的做法这里不再讨论。

如何利用树状结构这个参照系来设计求集合{1,2,…,n}的幂集算法是我们讨论的重点。对于给定的集合{1,2,3,4},按幂集集合中的元素个数和字典次序建立的树如下图所示。

集合{1,2,3,4}的幂集树型示意

为了保持集合中元素的字典次序,可采用两种方法来求集合{1,2,3,4}的幂集集合:①采用前序遍历树;②按层次遍历树。特别要注意的是在设计求集合的幂集时并不建立真正的树,而是在考生的心里建立这样一个虚拟的树,并以这棵树为参照系。下面给出这两种方法的算法。

方法1:前序遍历虚拟树。

方法2:按层次遍历虚拟树。

可见,灵活地应用树状结构及其遍历操作的思路,能有效地解决实际应用问题。

二叉树的应用

二叉树运算是数据结构的重要内容。为了加深对二叉树内容的理解,这里给出一些应用实例。为方便描述,二叉树的顺序存储结构用一维数组R来表示,而二叉链表的结点存储结构定义如下:

(1)以二叉链表为存储结构,写一算法用括号形式(key,LT,RT)打印二叉树,其中key是根结点数据,LT和RT分别是括号形式的左右子树。并且要求:空树不打印任何信息,一个结点x的树打印形式是x,而不应是(x,)的形式。代码如下:

(2)建立哈夫曼树和哈夫曼编码。

(3)将已知二叉树改建为中序线序树。

将已知二叉树改建为中序线序树的算法的主要思路是:对二叉树进行中序遍历,若当前被访问结点的左子结点指针为空,则让它指向当前结点的前驱结点;若其前驱结点的右子结点指针为空,则让它指向当前结点。相应的算法如下:

10. 查找算法中,( )要求查找表进行顺序存储并且按照关键字有序排列,一般不进行表的插入删除操作。

A. 顺序查找

B. 折半查找

C. 分块查找

D. 动态查找

要在关系数据库中插入数据,可以指定被插入的元组,或者用查询语言选出一批待插入的元组。插入语句的基本格式如下。

语句格式:

1)顺序查找

顺序查找又称线性查找,顺序查找的过程是从线性表的一端开始,依次逐个与表中元素的关键字值进行比较,如果找到其关键字与给定值相等的元素,则查找成功;若表中所有元素的关键字与给定值比较都不成功,则查找失败。

2)折半查找

折半查找的过程是先将给定值与有序线性表中间位置上元素的关键字进行比较,若两者相等,则查找成功;若给定值小于该元素的关键字,那么选取中间位置元素关键字值小的那部分元素作为新的查找范围,然后继续进行折半查找;如果给定值大于该元素的关键字,那么选取比中间位置元素关键字值大的那部分元素作为新的查找范围,然后继续进行折半查找,直到找到关键字与给定值相等的元素或查找范围中的元素数量为零时结束。

3)分块查找

在分块查找过程中,首先将表分成若干块,每一块中关键字不一定有序,但块之间是有序的。此外,还建立了一个索引表,索引表按关键字有序。分块查找过程需分两步进行:先确定待查记录所在的块;然后在块中顺序查找。

4)哈希表及其查找

根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续地址集上,并以关键字在地址集中的像作为记录在表中的存储位置,这种表称为哈希表,也称散列表。这一过程所得到的存储位置称为散列地址,由此形成的查找方法称为散列查找。

静态查找表

对查找表经常要进行两种操作:查询某个特定的数据元素是否在查找表中;检索某个特定的数据元素的各种属性。通常只进行这两种操作的查找表称为静态查找表。静态查找表主要有顺序查找、折半查找和分块查找。

1)顺序查找

顺序查找,又称线性查找,顺序查找的过程是从线性表的一端开始,依次逐个与表中元素的关键字值进行比较,如果找到其关键字与给定值相等的元素,则查找成功;若表中所有元素的关键字与给定值比较都不成功,则查找失败。

在等概率的情况下,顺序查找成功的平均查找长度为:

2)折半查找

折半查找是一种采用顺序存储结构的线性表进行查找的方法,也称二分查找。在进行折半查找之前,线性表中的数据元素必须按照关键字的值升序或降序排列。

折半查找的过程是先将给定值与有序线性表中间位置上的元素的关键字进行比较,若两者相等,则查找成功;若给定值小于该元素的关键字,那么选取中间位置元素关键字值小的那部分元素作为新的查找范围,然后继续进行折半查找;如果给定值大于该元素的关键字,那么选取比中间位置元素关键字值大的那部分元素作为新的查找范围,然后继续进行折半查找,直到找到关键字与给定值相等的元素或查找范围中的元素数量为零时结束。平均查找长度为:

3)分块查找

分块查找又称索引顺序查找,是顺序查找的一种改进方法。在分块查找过程中,首先将表分成若干块,每一块中关键字不一定有序,但块之间是有序的。此外,还建立了一个索引表,索引表按关键字有序。分块查找过程需分两步进行:先确定待查记录所在的块,然后在块中顺序查找。

假设长度为n的分块表分成b块,每块中元素个数为s,又设每个元素的查找概率都相等,块间块内均采用线性查找方法,则平均查找长度为:

动态查找表

若在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,则称此类查找表为动态查找表。动态查找表的特点是表结构是动态生成的。

1)二叉排序树的定义

二叉排序树又称二叉查找树,它或者是一棵空树,或者是具有以下性质的二叉树。

.若它的左子树非空,则左子树上所有节点的值均小于根节点的值。

.若它的右子树非空,则右子树上所有节点的值均大于或等于根节点的值。

.左、右子树本身就是两棵二叉排序树。

2)二叉排序树的查找过程

若二叉树为非空,将给定值与根节点的关键字值进行比较,若相等,则查找成功;若不等,则当根节点的关键字值大于给定值时,到根的左子树中进行查找;否则到根的右子树进行查找。

3)二叉排序树中插入节点的操作

二叉排序树是通过依次输入数据元素并把它们插到二叉树的适当位置上构造起来的,具体过程如下:读入一个元素,建立一个新节点。若二叉排序树非空,则将新节点的值与根节点的值进行比较,如果小于根节点的值,则插入左子树中,否则插入右子树中;若二叉树为空,则新节点作为二叉排序树的根节点。

4)二叉排序树中删除节点的操作

在二叉排序树中删除一个节点,不能把以该节点为根的子树都删除,只能删除这个节点并仍旧保持二叉排序树的特性。

哈希表

1)哈希表的定义

根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续地址集上,并以关键字在地址集中的像作为记录在表中的存储位置,这种表称为哈希表,也称散列表。这一过程所得到的存储位置称为散列地址,由此形成的查找方法称为散列查找。当选择了某个散列函数后,不同的关键字可能与同一个散列地址相对应,这种现象称为冲突。

对于哈希表,主要考虑两个问题:一是如何构造哈希函数,二是如何解决冲突。

2)哈希函数的构造方法

常用的哈希函数的构造方法有直接定址法、数字分析法、平方取中法、折叠法、随机数法和除留余数法等。

3)处理冲突的方法

解决冲突就是为出现冲突的关键字找到另一个"空"的哈希地址。常见的冲突处理方法有:开放地址法、链地址法、再哈希法等。

隐式字典的典型压缩算法有LZ77和LZSS。显式字典的典型压缩算法有LZ78和LZW。下面介绍LZ77算法和LZSS算法。

LZ77算法

为了更好地说明LZ77算法的原理,首先介绍该算法中的几个术语。

. 输入流:要被压缩的字符序列。

. 字符:输入流中的基本数据单元。

. 编码位置:输入流中当前要编码的字符位置,指前向缓冲存储器中的开始字符。

. 前向缓存:存放从编码位置到输入流结束的字符序列。

. 窗口:包含W个字符的窗口,字符是从编码位置开始往后数的,也就是最后处理的字符数。

. 指针:指向窗口中的匹配串并包含长度的指针。

LZ77算法的核心是查找从前向缓冲存储器开始的最长的匹配串。该算法的具体执行步骤如下。

步骤1:把编码位置设置到输入流的开始位置。

步骤2:查找窗口中最长的匹配串。

步骤3:以(Pointer, Length)Characters的格式输出。其中Pointer是指向窗口中匹配串的指针,Length表示匹配字符的长度,Characters是前向缓存中不匹配的第1个字符。

步骤4:如果前向缓冲存储器不是空的,则把编码位置和窗口向前移(Length+1)个字符,然后返回步骤2。

LZSS算法

LZSS算法通过输出真实字符解决了在窗口中出现没有匹配串的问题,但这种解决方案包含冗余信息,冗余信息表现在两个方面:一是编码器的输出可能包含空指针;二是编码器可能输出额外字符,即可能包含下一个匹配串中的字符。LZSS算法以比较有效的方法解决了这个问题,它的思想是如果匹配串的长度比指针本身的长度长,就输出指针,否则就输出真实字符。由于输出数据流中包含指针和字符本身,因此为了区分它们就需要有额外的标志位,即ID位。

LZSS算法的具体执行步骤如下。

步骤1:把编码位置置于输入流的开始位置。

步骤2:在前向缓冲存储器中查找窗口中最长的匹配串。

①Pointe:匹配串指针。

②Length:匹配串长度。

步骤3:判断匹配串长度Length是否大于或等于最小匹配串长度(Length≥MIN_ LENGTH)。

是:输出指针,然后把编码位置向前移动Length个字符。

否:输出前向缓冲存储器中的第1个字符,然后把编码位置向前移动1个字符。

步骤4:如果前向缓冲存储器不是空的,则返回步骤2。

在相同的计算环境下,LZSS算法比LZ77可获得更高的压缩比,而译码同样简单。这也就是为什么这种算法成为开发新算法的基础,许多后来开发的文档压缩程序都使用了LZSS的思想,如PKZip、ARJ、LHArc和ZOO等,其差别仅仅是指针的长短和窗口的大小有所不同。

LZSS同样可以和熵编码联合使用,如ARJ就与霍夫曼编码联用,而PKZip则与Shannon-Fano联用,它的后续版本也采用霍夫曼编码。

(1)插入行或列的方法是选定与要插入的行或列数目相同的行或列,单击“表格和边框”工具栏上“插入表格”旁边的箭头,然后单击所需的“插入”命令,如下图(a)所示。如果要快速添加一行,可在表格某行的行结束标记前按Enter键。

表格插入与删除

(2)删除行、列与内容。

可以删除表格中的单个或多个单元格、行或列,也可以删除整张表格,还可以只清除单元格的内容而不删除单元格本身。

删除整个表格的方法:单击表格,执行“表格”→“删除”→“表格”命令。或者选择表格,再单击常用工具栏上的“剪切”按钮。

删除表格中的单元格、行或列:选定要删除的单元格、行或列,选择“表格”→“删除”命令,然后单击“单元格”、“行”或“列”命令,如上图(b)所示。

删除表格内容:选定要删除的表格项(单元格、行、列或整张表格),按下Delete键。

S为具有n个不同元素的n元集,从S中选取r个元素且考虑其顺序称为S的一个r排列,不同排列的总数记为,有时也用P(nr)表示。如果r=n,则称这个排列为S的全排列。从排列的定义可知,如果两个排列相同,不仅这两个排列的元素必须完全相同,而且排列的顺序也必须完全相同。

例子1:用0~9这十个数字,可以组成多少个没有重复数字的三位数?

解法1:由于百位数上的数字不能为0,因此可先考虑排百位上的数字,再排十位和个位上的数字。百位数上的数字只能从除0以外的1~9数字中任选一个,有种;十位和个位上的数字,可以从余下的9个数字中任选两个,有种。根据乘法原理,所求的三位数的个数是

解法2:可先考虑从0~9这十个数字中任取三个数字的排列数(),再减去其中以0开头的排列数()。因此,所求的三位数的个数是

解法3:符合条件的三位数可以分为三类:每一位数字都不是0的三位数有个;个位数是0的三位数有个;十位数是0的三位数有个。根据加法原理,符合条件的三位数个数是

11. 以下关于字典攻击的说法中,正确的是( )。

A. 字典攻击比暴力破解更加高效

B. 使用密码盐技术可以大大增加字典攻击的搜索空间

C. 字典攻击主要用于破解密码

D. 如果密码盐泄露,字典攻击就会和不加盐时的效果一样

12. 以下关于哈希函数的说法中,不正确的是( )。

A. 哈希表是根据键值直接访问的数据结构

B. 随机预言机是完美的哈希函数

C. 哈希函数具有单向性

D. 哈希函数把固定长度输入转换为变长输出

函数可以被看作是一个由用户定义的操作。一般来说,函数用一个名字来表示,函数的操作数称为参数(parameter),由一个位于括号中并且用逗号分隔的参数表(Parameter List)指定。函数的结果被称为返回值(Return Value),返回值的类型被称为函数返回类型(Return Type)。不产生值的函数返回类型是void,意思是什么都不返回。函数执行的动作在函数体(body)中指定。函数体包含在花括号中,有时也称为函数块(Function Block)。函数返回类型以及其后的函数名、参数表和函数体构成了函数定义。

函数是C++语言程序的基本功能单元,其重要性不言而喻。函数接口的两个要素是参数和返回值。C语言中,函数的参数和返回值的传递方式有两种:值传递(Pass By Value)和指针传递(Pass by Pointer)。C++语言中多了引用传递(Pass by Reference)。

13. 以下关于拒绝服务攻击的叙述中,不正确的是( )。

A. 拒绝服务攻击的目的是使计算机或者网络无法提供正常的服务

B. 拒绝服务攻击是通过不断向计算机发起请求来实现的

C. 拒绝服务攻击会造成用户密码的泄露

D. DDos是一种拒绝服务攻击形式

DoS是指攻击者想办法让目标机器停止提供服务或资源访问,是黑客常用的攻击手段之一。这些资源包括磁盘空间、内存、进程甚至网络带宽,从而阻止正常用户的访问。其实对网络带宽进行的消耗性攻击只是拒绝服务攻击的一小部分,只要能够对目标造成麻烦,使某些服务被暂停甚至主机死机,都属于拒绝服务攻击。拒绝服务攻击问题也一直得不到合理的解决,究其原因是因为这是由于网络协议本身的安全缺陷造成的,从而拒绝服务攻击也成为了攻击者的终极手法。攻击者进行拒绝服务攻击,实际上让服务器实现两种效果:一是迫使服务器的缓冲区满,不接收新的请求;二是使用IP欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接。

拒绝服务攻击的方式

(1)SYN Flood。SYN Flood是当前最流行的DoS的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,使被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。

(2)IP欺骗DOS攻击。这种攻击利用RST位来实现。假设现在有一个合法用户(202.197.120.2)已经同服务器建立了正常的连接,攻击者构造攻击的TCP数据,伪装自己的IP为202.197.120.2,并向服务器发送一个带有RST位的TCP数据段。服务器接收到这样的数据后,认为从202.197.120.2发送的连接有错误,就会清空缓冲区中建立好的连接。这时,如果合法用户202.197.120.2再发送合法数据,服务器就已经没有这样的连接了,该用户就必须从新开始建立连接。攻击时,攻击者会伪造大量的IP地址,向目标发送RST数据,使服务器不对合法用户服务,从而实现了对受害服务器的拒绝服务攻击。

(3)UDP洪水攻击。攻击者利用简单的TCP/IP服务,如Chargen和Echo来传送毫无用处的占满带宽的数据。通过伪造与某一主机的Chargen服务之间的一次的UDP连接,回复地址指向开着Echo服务的一台主机,这样就在两台主机之间存在很多的无用数据流,这些无用数据流就会导致带宽的服务攻击。

(4)Ping洪流攻击。由于在早期的阶段,路由器对包的最大尺寸都有限制。许多操作系统对TCP/IP栈的实现在ICMP包上都是规定64KB,并且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区。当产生畸形的,声称自己的尺寸超过ICMP上限的包也就是加载的尺寸超过64KB上限时,就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使接受方死机。

(5)泪滴(Teardrop)攻击。泪滴攻击是利用在TCP/IP堆栈中实现信任IP碎片中的包的标题头所包含的信息来实现自己的攻击。IP分段含有指明该分段所包含的是原包的哪一段的信息,某些TCP/IP(包括Service Pack 4以前的NT)在收到含有重叠偏移的伪造分段时将崩溃。

(6)Land攻击。Land攻击原理是:用一个特别打造的SYN包,它的原地址和目标地址都被设置成某一个服务器地址。此举将导致接受服务器向它自己的地址发送SYN-ACK消息,结果这个地址又发回ACK消息并创建一个空连接。被攻击的服务器每接收一个这样的连接都将保留,直到超时,对Land攻击反应不同,许多UNIX实现将崩溃,NT变的极其缓慢(大约持续5分钟)。

(7)Smurf攻击。一个简单的Smurf攻击原理就是,通过使用将回复地址设置成受害网络的广播地址的ICMP应答请求(Ping)数据包来淹没受害主机的方式进行。最终导致该网络的所有主机都对此ICMP应答请求作出答复,导致网络阻塞。它比ping of death洪水的流量高出1或2个数量级。更加复杂的Smurf将源地址改为第三方的受害者,最终导致第三方崩溃。

(8)Fraggle攻击。Fraggle攻击实际上就是对Smurf攻击作了简单的修改,使用的是UDP应答消息而非ICMP。

分布式拒绝服务

分布式拒绝服务(Distributed Denial of Service,DDoS)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DoS攻击,从而成倍地提高拒绝服务攻击的威力。

拒绝服务预防

防止拒绝服务攻击可以通过各种办法来预防:

(1)主机的设置:关闭不必要的服务;限制同时打开的SYN半连接数目;缩短SYN半连接的time out时间;及时更新系统补丁。

(2)防火墙的设置:禁止对主机的非开放服务的访问;限制同时打开的SYN最大连接数;限制特定IP地址的访问;启用防火墙的防DoS的属性;严格限制对外开放的服务器向外访问。

14. 下列不属于社会工程学攻击的是( )。

A. 攻击者编造一个故事使受害者信服,从而透露秘密消息

B. 攻击者伪造一条来自银行或其他金融机构的需要“验证”登录的消息

C. 攻击者通过搭线窃听方式窃取了从网络节点A发送到网络节点B的消息

D. 通过电话以知名人士的名义去推销诈骗

15. Linux 系统中,文件的权限表示为“-rw-rw-rw-”,下列说法正确的是( )。

A. 文件所有者拥有读、写和执行权限

B. 文件所在组用户拥有读、写和执行权限

C. 其他组用户拥有读和写权限

D. 其他组用户拥有读和执行权限

Linux是一个类似于UNIX的操作系统,Linux系统不仅能够运行于PC平台,还在嵌入式系统方面大放光芒,在各种嵌入式Linux迅速发展的状况下,Linux逐渐形成了可与Windows CE等嵌入式操作系统进行抗衡的局面。嵌入式Linux的特点如下:

(1)精简的内核,性能高,稳定,多任务。

(2)适用于不同的CPU,支持多种架构,如x86、ARM、ALPHA、SPARC等。

(3)能够提供完善的嵌入式图形用户界面以及嵌入式X-Windows。

(4)提供嵌入式浏览器、邮件程序、音频和视频播放器、记事本等应用程序。

(5)提供完整的开发工具和软件开发包,同时提供PC上的开发版本。

(6)用户可定制,可提供图形化的定制和配置工具。

(7)常用嵌入式芯片的驱动集,支持大量的周边硬件设备,驱动丰富。

(8)针对嵌入式的存储方案,提供实时版本和完善的嵌入式解决方案。

(9)完善的中文支持,强大的技术支持,完整的文档。

(10)开放源码,丰富的软件资源,广泛的软件开发者的支持,价格低廉,结构灵活,适用面广。

16. 根据《计算机软件保护条例》的规定,著作权保护的计算机软件是指( )。

A. 程序及其相关文档

B. 处理过程及开发平台

C. 开发软件所用的算法

D. 开发软件所用的操作方法

计算机软件是指计算机系统中的程序及其文档。程序是计算任务的处理对象和处理规则的描述。任何以计算机为处理工具的任务都是计算任务。处理对象是数据(如数字、文字、图形、图像、声音等,它们只是表示,而无含义)或信息(数据及有关的含义)。处理规则一般指处理的动作和步骤。文档是为了便于了解程序所需的阐述性资料。

按照软件的应用领域,可以将计算机软件分为十大类:系统软件、应用软件、工程/科学软件、嵌入式软件、产品线软件、Web应用、人工智能软件、开放计算、网络资源和开源软件。

知识产权管理相关的法律包括专利法、商标法、著作权法和反不正当竞争法等法律,就系统集成行业的工作实践而言,知识产权管理属于特定专业知识领域,组织通常会由相关的法务部门负责知识产权管理相关事项。基于考试角度,考生应该重点了解《著作权法》相关的内容和条款,下面摘录了《著作权法》中的重要条款内容,供考生参考。关于《著作权法》的完整内容,考生可以参考清华大学出版社官方网站本书参考资料部分所对应的电子文档。

第一章总则

第一条为保护文学、艺术和科学作品作者的著作权,以及与著作权有关的权益,鼓励有益于社会主义精神文明、物质文明建设的作品的创作和传播,促进社会主义文化和科学事业的发展与繁荣,根据宪法制定本法。

第二条中国公民、法人或者其他组织的作品,不论是否发表,依照本法享有著作权。

第三条本法所称的作品,包括以下列形式创作的文学、艺术和自然科学、社会科学、工程技术等作品:

(一)文字作品;

(二)口述作品;

(三)音乐、戏剧、曲艺、舞蹈、杂技艺术作品;

(四)美术、建筑作品;

(五)摄影作品;

(六)电影作品和以类似摄制电影的方法创作的作品;

(七)工程设计图、产品设计图、地图、示意图等图形作品和模型作品;

(八)计算机软件;

(九)法律、行政法规规定的其他作品。

第五条本法不适用于:

(一)法律、法规,国家机关的决议、决定、命令和其他具有立法、行政、司法性质的文件,及其官方正式译文;

(二)时事新闻;

(三)历法、通用数表、通用表格和公式。

第二章著作权

第九条著作权人包括:

(一)作者;

(二)其他依照本法享有著作权的公民、法人或者其他组织。

第十条著作权包括下列人身权和财产权:

(一)发表权,即决定作品是否公之于众的权利;

(二)署名权,即表明作者身份,在作品上署名的权利;

(三)修改权,即修改或者授权他人修改作品的权利;

(四)保护作品完整权,即保护作品不受歪曲、篡改的权利;

(五)复制权,即以印刷、复印、拓印、录音、录像、翻录、翻拍等方式将作品制作一份或者多份的权利;

(六)发行权,即以出售或者赠予方式向公众提供作品的原件或者复制件的权利;

(七)出租权,即有偿许可他人临时使用电影作品和以类似摄制电影的方法创作的作品、计算机软件的权利,计算机软件不是出租的主要标的的除外;

(八)展览权,即公开陈列美术作品、摄影作品的原件或者复制件的权利;

(九)表演权,即公开表演作品,以及用各种手段公开播送作品的表演的权利;

(十)放映权,即通过放映机、幻灯机等技术设备公开再现美术、摄影、电影和以类似摄制电影的方法创作的作品等的权利;

(十一)广播权,即以无线方式公开广播或者传播作品,以有线传播或者转播的方式向公众传播广播的作品,以及通过扩音器或者其他传送符号、声音、图像的类似工具向公众传播广播的作品的权利;

(十二)信息网络传播权,即以有线或者无线方式向公众提供作品,使公众可以在其个人选定的时间和地点获得作品的权利;

(十三)摄制权,即以摄制电影或者以类似摄制电影的方法将作品固定在载体上的权利;

(十四)改编权,即改变作品,创作出具有独创性的新作品的权利;

(十五)翻译权,即将作品从一种语言文字转换成另一种语言文字的权利;

(十六)汇编权,即将作品或者作品的片段通过选择或者编排,汇集成新作品的权利;

(十七)应当由著作权人享有的其他权利。

著作权人可以许可他人行使前款第(五)项至第(十七)项规定的权利,并依照约定或者本法有关规定获得报酬。

著作权人可以全部或者部分转让本条第一款第(五)项至第(十七)项规定的权利,并依照约定或者本法有关规定获得报酬。

第十一条著作权属于作者,本法另有规定的除外。

创作作品的公民是作者。

由法人或者其他组织主持,代表法人或者其他组织意志创作,并由法人或者其他组织承担责任的作品,法人或者其他组织视为作者。

如无相反证明,在作品上署名的公民、法人或者其他组织为作者。

第十二条改编、翻译、注释、整理已有作品而产生的作品,其著作权由改编、翻译、注释、整理人享有,但行使著作权时不得侵犯原作品的著作权。

第十三条两人以上合作创作的作品,著作权由合作作者共同享有。没有参加创作的人,不能成为合作作者。

合作作品可以分割使用的,作者对各自创作的部分可以单独享有著作权,但行使著作权时不得侵犯合作作品整体的著作权。

第十四条汇编若干作品、作品的片段或者不构成作品的数据或者其他材料,对其内容的选择或者编排体现独创性的作品,为汇编作品,其著作权由汇编人享有,但行使著作权时,不得侵犯原作品的著作权。

第十六条公民为完成法人或者其他组织工作任务所创作的作品是职务作品,除本条第二款的规定以外,著作权由作者享有,但法人或者其他组织有权在其业务范围内优先使用。作品完成两年内,未经单位同意,作者不得许可第三人以与单位使用的相同方式使用该作品。

有下列情形之一的职务作品,作者享有署名权,著作权的其他权利由法人或者其他组织享有,法人或者其他组织可以给予作者奖励:

(一)主要是利用法人或者其他组织的物质技术条件创作,并由法人或者其他组织承担责任的工程设计图、产品设计图、地图、计算机软件等职务作品;

(二)法律、行政法规规定或者合同约定著作权由法人或者其他组织享有的职务作品。

第十七条受委托创作的作品,著作权的归属由委托人和受托人通过合同约定。合同未作明确约定或者没有订立合同的,著作权属于受托人。

第十九条著作权属于公民的,公民死亡后,其本法第十条第一款第(五)项至第(十七)项规定的权利在本法规定的保护期内,依照继承法的规定转移。

著作权属于法人或者其他组织的,法人或者其他组织变更、终止后,其本法第十条第一款第(五)项至第(十七)项规定的权利在本法规定的保护期内,由承受其权利义务的法人或者其他组织享有;没有承受其权利义务的法人或者其他组织的,由国家享有。

第二十条作者的署名权、修改权、保护作品完整权的保护期不受限制。

第二十一条公民的作品,其发表权、本法第十条第一款第(五)项至第(十七)项规定的权利的保护期为作者终生及其死亡后五十年,截止于作者死亡后第五十年的12月31日;如果是合作作品,截止于最后死亡的作者死亡后第五十年的12月31日。

法人或者其他组织的作品、著作权(署名权除外)由法人或者其他组织享有的职务作品,其发表权、本法第十条第一款第(五)项至第(十七)项规定的权利的保护期为五十年,截止于作品首次发表后第五十年的12月31日,但作品自创作完成后五十年内未发表的,本法不再保护。

第二十二条在下列情况下使用作品,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:

(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;

(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;

(三)为报道时事新闻,在报纸、期刊、广播电台、电视台等媒体中不可避免地再现或者引用已经发表的作品;

(四)报纸、期刊、广播电台、电视台等媒体刊登或者播放其他报纸、期刊、广播电台、电视台等媒体已经发表的关于政治、经济、宗教问题的时事性文章,但作者声明不许刊登、播放的除外;

(五)报纸、期刊、广播电台、电视台等媒体刊登或者播放在公众集会上发表的讲话,但作者声明不许刊登、播放的除外;

(六)为学校课堂教学或者科学研究,翻译或者少量复制已经发表的作品,供教学或者科研人员使用,但不得出版发行;

(七)国家机关为执行公务在合理范围内使用已经发表的作品;

(八)图书馆、档案馆、纪念馆、博物馆、美术馆等为陈列或者保存版本的需要,复制本馆收藏的作品;

(九)免费表演已经发表的作品,该表演未向公众收取费用,也未向表演者支付报酬;

(十)对设置或者陈列在室外公共场所的艺术作品进行临摹、绘画、摄影、录像;

(十一)将中国公民、法人或者其他组织已经发表的以汉语言文字创作的作品翻译成少数民族语言文字作品在国内出版发行;

(十二)将已经发表的作品改成盲文出版。

前款规定适用于对出版者、表演者、录音录像制作者、广播电台、电视台的权利的限制。

第二十三条为实施九年制义务教育和国家教育规划而编写出版教科书,除作者事先声明不许使用的外,可以不经著作权人许可,在教科书中汇编已经发表的作品片段或者短小的文字作品、音乐作品或者单幅的美术作品、摄影作品,但应当按照规定支付报酬,指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利。

前款规定适用于对出版者、表演者、录音录像制作者、广播电台、电视台的权利的限制。

第三章著作权许可使用和转让合同

第二十四条使用他人作品应当同著作权人订立许可使用合同,本法规定可以不经许可的除外。

许可使用合同包括下列主要内容:

(一)许可使用的权利种类;

(二)许可使用的权利是专有使用权或者非专有使用权;

(三)许可使用的地域范围、期间;

(四)付酬标准和办法;

(五)违约责任;

(六)双方认为需要约定的其他内容。

第二十五条转让本法第十条第一款第(五)项至第(十七)项规定的权利,应当订立书面合同。

权利转让合同包括下列主要内容:

(一)作品的名称;

(二)转让的权利种类、地域范围;

(三)转让价金;

(四)交付转让价金的日期和方式;

(五)违约责任;

(六)双方认为需要约定的其他内容。

第四章出版、表演、录音录像、播放

第三十条图书出版者出版图书应当和著作权人订立出版合同,并支付报酬。

第三十一条图书出版者对著作权人交付出版的作品,按照合同约定享有的专有出版权受法律保护,他人不得出版该作品。

第三十二条著作权人应当按照合同约定期限交付作品。图书出版者应当按照合同约定的出版质量、期限出版图书。

图书出版者不按照合同约定期限出版,应当依照本法第五十四条的规定承担民事责任。

图书出版者重印、再版作品的,应当通知著作权人,并支付报酬。图书脱销后,图书出版者拒绝重印、再版的,著作权人有权终止合同。

第三十三条著作权人向报社、期刊社投稿的,自稿件发出之日起十五日内未收到报社通知决定刊登的,或者自稿件发出之日起三十日内未收到期刊社通知决定刊登的,可以将同一作品向其他报社、期刊社投稿。双方另有约定的除外。

作品刊登后,除著作权人声明不得转载、摘编的外,其他报刊可以转载或者作为文摘、资料刊登,但应当按照规定向著作权人支付报酬。

第三十四条图书出版者经作者许可,可以对作品修改、删节。

报社、期刊社可以对作品作文字性修改、删节。对内容的修改,应当经作者许可。

第三十五条出版改编、翻译、注释、整理、汇编已有作品而产生的作品,应当取得改编、翻译、注释、整理、汇编作品的著作权人和原作品的著作权人许可,并支付报酬。

第四十条录音录像制作者使用他人作品制作录音录像制品,应当取得著作权人许可,并支付报酬。

录音录像制作者使用改编、翻译、注释、整理已有作品而产生的作品,应当取得改编、翻译、注释、整理作品的著作权人和原作品著作权人许可,并支付报酬。

录音制作者使用他人已经合法录制为录音制品的音乐作品制作录音制品,可以不经著作权人许可,但应当按照规定支付报酬;著作权人声明不许使用的不得使用。

第四十一条录音录像制作者制作录音录像制品,应当同表演者订立合同,并支付报酬。

第四十二条录音录像制作者对其制作的录音录像制品,享有许可他人复制、发行、出租、通过信息网络向公众传播并获得报酬的权利;权利的保护期为五十年,截止于该制品首次制作完成后第五十年的12月31日。

被许可人复制、发行、通过信息网络向公众传播录音录像制品,还应当取得著作权人、表演者许可,并支付报酬。

第五章法律责任和执法措施

第四十七条有下列侵权行为的,应当根据情况,承担停止侵害、消除影响、赔礼道歉、赔偿损失等民事责任:

(一)未经著作权人许可,发表其作品的;

(二)未经合作作者许可,将与他人合作创作的作品当作自己单独创作的作品发表的;

(三)没有参加创作,为谋取个人名利,在他人作品上署名的;

(四)歪曲、篡改他人作品的;

(五)剽窃他人作品的;

(六)未经著作权人许可,以展览、摄制电影和以类似摄制电影的方法使用作品,或者以改编、翻译、注释等方式使用作品的,本法另有规定的除外;

(七)使用他人作品,应当支付报酬而未支付的;

(八)未经电影作品和以类似摄制电影的方法创作的作品、计算机软件、录音录像制品的著作权人或者与著作权有关的权利人许可,出租其作品或者录音录像制品的,本法另有规定的除外;

(九)未经出版者许可,使用其出版的图书、期刊的版式设计的;

(十)未经表演者许可,从现场直播或者公开传送其现场表演,或者录制其表演的;

(十一)其他侵犯著作权以及与著作权有关的权益的行为。

1991年6月通过,同年10月1日正式实施的《计算机软件保护条例》是我国计算机软件保护的法律依据。该条例的最新版本是在2001年年底通过,2002年1月1日正式实施的。

由于计算机软件也属于《中华人民共和国著作权法》保护的范围,因此在具体实施时,首先适用于《计算机软件保护条例》的条文规定,若是在《计算机软件保护条例》中没有规定适用条文的情况下,才依据《中华人民共和国著作权法》的原则和条文规定执行。

条例保护对象

《计算机软件保护条例》的客体是计算机软件,而在此计算机软件是指计算机程序及其相关文档。

根据条例规定,受保护的软件必须是由开发者独立开发的,并且已经固定在某种有形物体上(如光盘、硬盘和软盘)。

其对软件著作权的保护只是针对计算机软件和文档,并不包括开发软件所用的思想、处理过程、操作方法或数学概念等,并且著作权人还需在软件登记机构办理登记。

著作权人确定

(1)合作开发。对于由两个或两个以上的开发者或组织合作开发的软件,著作权的归属根据合同约定确定。若无合同,则共享著作权。若合作开发的软件可以分割使用,那么开发者对自己开发的部分单独享有著作权,可以在不破坏整体著作权的基础上行使。

(2)职务开发。如果开发者在单位或组织中任职期间所开发的软件符合以下条件,则软件著作权应归单位或组织所有。

.针对本职工作中明确规定的开发目标所开发的软件。

.开发出的软件属于从事本职工作活动的结果。

.使用了单位或组织的资金、专用设备、未公开的信息等物质、技术条件,并由单位或组织承担责任的软件。

(3)委托开发。如果是接受他人委托而进行开发的软件,其著作权的归属应由委托人与受托人签订书面合同约定,如果没有签订合同,或合同中未规定的,则其著作权由受托人享有。

另外,由国家机关下达任务开发的软件,著作权的归属由项目任务书或合同规定,若未明确规定,其著作权应归任务接受方所有。

软件著作权

根据《计算机软件保护条例》规定,软件著作权人对其创作的软件产品享有以下9种权利。

(1)发表权:即决定软件是否公之于众的权利。

(2)署名权:即表明开发者身份,在软件上署名的权利。

(3)修改权:即对软件进行增补、删节,或者改变指令、语句顺序的权利。

(4)复制权:即将软件制作一份或者多份的权利。

(5)发行权:即以出售或者赠与方式向公众提供软件的原件或复制件的权利。

(6)出租权:即有偿许可他人临时使用软件的权利。

(7)信息网络传播权:即以信息网络方式向公众提供软件的权利。

(8)翻译权:即将原软件从一种自然语言文字转换成另一种自然语言文字的权利。

(9)使用许可权、获得报酬权、转让权。

软件著作权自软件开发完成之日起生效。

(1)著作权属于公民。著作权的保护期为作者终生及其死亡后的50年(第50年的12月31日)。对于合作开发的,则以最后死亡的作者为准。值得注意的是,在1991实施的上一版条例中,保护期限是25年,而在最新的条例中,已经改为了50年。在作者死亡后,将根据继承法转移除了署名权之外的著作权。

(2)著作权属于单位。著作权的保护期为50年(首次发表后第50年的12月31日),若50年内未发表的,不予保护。单位变更、终止后,其著作权由承受其权利义务的单位享有。

当得到软件著作权人的许可,获得了合法的计算机软件复制品后,复制品的所有人享有以下权利。

(1)根据使用的需求,将该计算机软件安装到设备中(计算机、PDA等信息设备)。

(2)制作复制品的备份,以防止复制品损坏,但这些复制品不得通过任何方式转给其他人使用。

(3)根据实际的应用环境,对其进行功能、性能等方面的修改。但未经软件著作权人许可,不得向任何第三方提供修改后的软件。

如果使用者只是为了学习、研究软件中包含的设计思想、原理,而以安装、显示和存储软件等方式使用软件,可以不经软件著作权人的许可,不向其支付报酬。

根据著作权法及实施条例规定,著作权人对作品享有5种权利:

(1)发表权:即决定作品是否公之于众的权利。

(2)署名权:即表明作者身份,在作品上署名的权利。

(3)修改权:即修改或授权他人修改作品的权利。

(4)保护作品完整权:即保护作品不受歪曲、篡改的权利。

(5)使用权、使用许可权和获取报酬权、转让权:即以复制、表演、播放、展览、发行、摄制电影、电视、录像,或者改编、翻译、注释和编辑等方式使用作品的权利,以及许可他人以上述方式使用作品,并由此获得报酬的权利。

根据著作权法的相关规定,著作权的保护是有一定期限的。

(1)著作权属于公民。署名权、修改权、保护作品完整权的保护期没有任何限制,永远属于保护范围。而发表权、使用权和获得报酬权的保护期为作者终生及其死亡后的50年(第50年的12月31日)。作者死亡后,著作权依照继承法进行转移。

(2)著作权属于单位。发表权、使用权和获得报酬权的保护期为50年(首次发表后的第50年的12月31日),若50年内未发表的,不予保护。但单位变更、终止后,其著作权由承受其权利义务的单位享有。

当第三方需要使用时,需得到著作权人的使用许可,双方应签订相应的合同。合同中应包括许可使用作品的方式,是否专有使用,许可的范围与时间期限,报酬标准与方法,以及违约责任等。若合同未明确许可的权力,需再次经著作权人许可。合同的有效期限不超过10年,期满时可以续签。

对于出版者、表演者、录音录像制作者、广播电台、电视台而言,在下列情况下使用作品,可以不经著作权人许可、不向其支付报酬。但应指明作者姓名、作品名称,不得侵犯其他著作权。

(1)为个人学习、研究或欣赏,使用他人已经发表的作品。

(2)为介绍、评论某一个作品或说明某一个问题,在作品中适当引用他人已经发表的作品。

(3)为报道时事新闻,在报纸、期刊、广播、电视节目或新闻纪录影片中引用已经发表的作品。

(4)报纸、期刊、广播电台、电视台刊登或播放其他报纸、期刊、广播电台、电视台已经发表的社论、评论员文章。

(5)报纸、期刊、广播电台、电视台刊登或者播放在公众集会上发表的讲话,但作者声明不许刊登、播放的除外。

(6)为学校课堂教学或科学研究,翻译或者少量复制已经发表的作品,供教学或科研人员使用,但不得出版发行。

(7)国家机关为执行公务使用已经发表的作品。

(8)图书馆、档案馆、纪念馆、博物馆和美术馆等为陈列或保存版本的需要,复制本馆收藏的作品。

(9)免费表演已经发表的作品。

(10)对设置或者陈列在室外公共场所的艺术作品进行临摹、绘画、摄影及录像。

(11)将已经发表的汉族文字作品翻译成少数民族文字在国内出版发行。

(12)将已经发表的作品改成盲文出版。

17. 以下计算机软件著作权权利中,不可以转让的是( )。

A. 发行权

B. 复制权

C. 署名权

D. 信息网络传播权

计算机软件是指计算机系统中的程序及其文档。程序是计算任务的处理对象和处理规则的描述。任何以计算机为处理工具的任务都是计算任务。处理对象是数据(如数字、文字、图形、图像、声音等,它们只是表示,而无含义)或信息(数据及有关的含义)。处理规则一般指处理的动作和步骤。文档是为了便于了解程序所需的阐述性资料。

按照软件的应用领域,可以将计算机软件分为十大类:系统软件、应用软件、工程/科学软件、嵌入式软件、产品线软件、Web应用、人工智能软件、开放计算、网络资源和开源软件。

计算机软件著作权的主体与客体

1)计算机软件著作权的主体

计算机软件著作权的主体指享有著作权的人,包括公民、法人和其他组织。

(1)公民。

公民通过以下途径获得软件著作权主体资格:公民自行独立开发软件;订立委托合同,委托他人开发软件,并约定软件著作权归自己享有;通过转让途径取得软件著作财产权主体资格;公民之间或与其他主体之间,对计算机软件进行合作开发而产生的公民群体或者公民与其他主体成为计算机软件作品的著作权人;通过继承权取得的主体资格。

(2)法人。

法人通过以下途径取得主体资格:由法人组织并提供创作物质条件所实施的开发,并由法人承担社会责任;通过接受委托、转让等各种有效合同关系而取得著作权主体资格;因计算机软件著作权主体(法人)发生变更而依法成为著作权主体。

(3)其他组织。

其他组织指除去法人以外的能够取得计算机软件著作权的其他民事主体,包括非法人单位、合作伙伴等。

2)计算机软件著作权的客体

计算机软件的客体指著作权法保护的计算机软件著作权的范围,根据《著作权法》第三条和《计算机软件保护条例》第二条的规定,著作权法保护的是计算机程序及其有关文档。

(1)计算机程序。

根据《计算机软件保护条例》第三条第一款的规定,计算机程序是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可被自动转换成代码化指令序列的符号化语句序列。计算机程序包括源程序和目标程序,同一程序的源程序文本和目标程序文本视为同一软件作品。

(2)计算机程序的文档。

根据《计算机软件保护条例》第三条第二款的规定,计算机程序的文档是指用自然语言或者形式化语言所编写的文字资料和图表,用来描述程序的内容、组成、设计、功能规格、开发情况、测试结果及使用方法等。文档一般以程序设计说明书、流程图和用户手册等形式表现。

计算机软件受著作权法保护的条件

计算机软件受著作权法保护应符合以下条件。

(1)独立创作。受保护的软件必须由开发者独立开发创作,任何复制或抄袭他人开发的软件都不能获得著作权。软件开发的思想、概念不受著作权法的保护,如果用了他人软件作品的逻辑步骤的组合方式,则对他人软件构成侵权。

(2)可被感知。受著作权法保护的作品是作者创作思想在固定载体上的一种实际表达。如果作者的创作思想未表达出来或不可以被感知,就不能得到著作权法的保护。因此,《计算机软件保护条例》规定,受保护的软件必须固定在某种有形物体上。

(3)逻辑合理。受保护的计算机软件作品必须具备合理的逻辑思想,并以正确的逻辑步骤表现出来。

计算机软件的著作权利

1)计算机软件著作权的人身权

计算机软件享有两种权利,即人身权(精神权利)和财产权(经济权利)。软件著作人还享有发表权和开发者身份权。

发表权是指是否公布软件作品的权利;开发者身份权又称为署名权,指软件作者在作品中署自己名字的权利。

2)计算机软件的著作财产权

著作财产权是指能够给著作权人带来经济利益的权利。通常是指由软件著作权人控制和支配,并能够为权利人带来一定经济效益的权利。主要内容有使用权、复制权、修改权、发行权、翻译权、注释权、信息网络传播权、出租权、使用许可权和获得报酬权、转让权。

3)软件合法持有人的权利

软件合法持有人的权利主要有:根据使用的需要把软件装入计算机等装置内;根据需要进行必要的复制;为了防止复制品损坏而制作备份复制品;为了把该软件用于实际的计算机应用环境而做的必要修改,但不得向第三方提供修改后的软件。

4)计算机软件著作权的行使

(1)软件经济权利的许可使用。

软件经济权利的许可使用是指软件著作权人通过合同方式许可他人使用其软件,并获得一定报酬的软件贸易形式。主要有:独占许可使用,被授权方按合同规定取得软件使用的独占性,权利人不得将使用权授予第三方,自己也不得使用该软件;独家许可使用,权利人自己可以使用该软件,其他和独占许可使用相同;普通许可使用,权利人可以将使用权授予第三方,自己也可以使用;法定许可使用和强制许可使用,根据法律特殊规定,不经软件著作权人许可也可以使用其软件。

(2)软件经济权利的转让使用。

软件经济权利的转让使用是指软件著作权人将其著作权中的经济权利全部转移给他人,受让者成为新的著作权主体。软件著作权的转让必须签订书面合同,同时转让不改变软件的保护期。转让方式包括卖出、赠与、抵押、赔偿等。

5)计算机软件著作权的保护期

计算机软件著作权自软件开发完成之日起,保护期为50年。保护期满,除开发者身份权外,其他权利终止。计算机软件著作权人的单位终止和计算机软件著作权人的公民死亡无合法继承人时,除开发者身份权外的其他权利进入公有领域。

计算机软件著作权的归属

我国《著作权法》规定著作权属于作者。《计算机软件保护条例》规定软件著作权属于软件开发者。

1)职务开发软件著作权的归属

公民为完成法人或者其他组织工作任务所创作的作品是职务作品,著作权由作者享有,但法人或者其他组织有权在其业务范围内优先使用。作品完成两年内,未经单位同意,作者不得许可第三人以与单位使用的相同方式使用该作品。

有下列情形之一的职务作品,作者享有署名权,著作权的其他权利由法人或者其他组织享有,法人或者其他组织可以给予作者奖励。

(1)主要是利用法人或者其他组织的物质技术条件创作,并由法人或者其他组织承担责任的工程设计图、产品设计图、地图、计算机软件等职务作品。

(2)法律、行政法规规定或者合同约定著作权由法人或者其他组织享有的职务作品。

2)合作开发软件著作权的归属

合作开发软件是指两个或两个以上公民、法人或其他组织订立协议,共同参加某项计算机软件的开发并分享软件著作权的形式。对合作开发软件著作权的归属应掌握以下4点。

(1)由两个以上的单位、公民共同开发完成的软件属于合作开发的软件。

(2)由于合作开发软件著作权是由两个以上单位或者个人共同享有,因而为了避免在软件著作权的行使中产生纠纷,规定"合作开发的软件,其著作权的归属由合作开发者签订书面合同约定"。

(3)对于合作开发的软件著作权按以下规定执行:"无书面合同或者合同未作明确约定,合作开发的软件可以分割使用的,开发者对各自开发的部分可以单独享有著作权;但是行使著作权时不得扩展到合作开发的软件整体的著作权。"

(4)合作开发者对于软件著作权中的转让权不得单独行使。

3)委托开发软件著作权的归属

受委托创作的作品,著作权的归属由委托人和受托人通过合同约定。合同未作明确约定或者没有订立合同的,著作权属于受托人。委托开发的软件著作权的归属按以下标准确定。

(1)委托开发软件作品需根据委托方的要求,由委托方与受托方以合同确定的权利和义务的关系而进行开发的软件。因此,软件作品著作权归属应当作为合同的重要条款予以明确约定。

(2)若在委托开发软件活动中,委托者与受委托者没有签订书面协议,或者在协议中未对软件著作权归属作出明确的约定,则软件著作权属于受委托者,即属于实际完成软件的开发者。

4)接受任务开发软件的著作权归属

接受任务开发软件的著作权归属一般按以下两条标准确定:①在合同中明确约定的,按照合同约定实行;②未明确约定的,著作权属于实际完成软件开发的单位。

5)计算机软件著作权主体变更后软件著作权的归属

因主体变更引起的变化有以下几种。

(1)公民继承的软件权利归属。合法继承人享有除署名权外的其他权利,如著作权的使用权、使用许可权和获得报酬权等权利。

(2)单位变更后软件权利归属。著作权属于法人或者其他组织的,法人或者其他组织变更、终止后,由承受其权利义务的法人或者其他组织享有;没有承受其权利义务的法人或者其他组织的,由国家享有。

(3)权利转让后的软件著作权归属。权利转让根据签订的合同规定各方的权利。

(4)司法判决、裁定引起的软件著作权归属问题根据法律的判决来执行。

(5)保护期届满权利丧失。

计算机软件著作权侵权的鉴别

1)计算机软件著作权侵权行为

计算机软件著作权侵权行为主要有:未经软件著作权人的同意而发表或者登记其作品;将他人开发的软件当作自己的作品发表或者登记;未经合作者同意将与他人合作开发的软件当作自己独立完成的作品发表或者登记;在他人开发的软件上署名或者更改他人开发的软件上的署名;未经软件著作权人或者其合法受让者的许可,修改或翻译其软件作品;未经软件著作权人或其合法受让者的许可,复制或部分复制其软件;未经软件著作权人或其合法受让者的同意,向公众发行出租其软件的复制品;未经软件著作权人或其合法受让者的同意,向任何第三方办理软件权利许可或转让事宜;未经软件著作权人或其合法受让者的同意,通过信息网络传播著作权人的软件;共同侵权,两人以上共同实施的侵权行为。

2)不构成计算机软件侵权的合理使用行为

根据已获得的软件使用权利进行的不超出使用权限的活动都是合法使用。区分合理使用和不合理使用可以按以下标准。

(1)软件作品是否合法取得。

(2)使用目的是否具有商业营业性,如果是就不属于合理使用。

(3)合理使用一般为少量的使用,超过通常认为的少量界限,即可认为不属于合理使用。

3)计算机著作权软件侵权的识别

计算机软件作为《著作权法》保护的客体,具有以下特点。

(1)技术性,指其创作和开发的高技术性。

(2)依赖性,指人们对其的了解依赖于计算机。

(3)多样性,指计算机程序表达的多样性。

(4)运行性,指程序功能的可运行性。

识别侵权软件可采取下列方法:①将正版和盗版软件进行比对;②将两套软件同时或先后安装,观察其显示是否相同;③对其安装后的目录和各种文件进行对比;④在使用过程中进行对比;⑤进行源程序的对比。

计算机软件著作权侵权的法律责任

计算机软件著作权侵权的法律责任主要有民事责任、行政责任和刑事责任。

需要承担民事责任的侵权行为有:未经软件著作权人的许可发表或登记其软件的;将他人的软件当作自己的软件发表或登记的;未经合作者许可,将与他人合作开发的软件当作自己独立完成的作品发表或者登记的;在他人开发的软件上署名或者更改他人开发的软件上署名的;未经软件著作权人或者其合法受让者的许可,修改或翻译其软件的;其他侵犯软件著作权的行为。

需要承担行政责任的侵权行为有:复制或部分复制著作权人软件的;向公众发行、出租著作权人软件的;故意避开或者破坏著作权人为保护其软件而采取的技术措施的;故意删除或者改变软件权利管理电子信息的;许可他人行使或者转让著作权人的软件著作权的。

侵权行为构成犯罪的,侵权者应承担相应的刑事责任。

根据《计算机软件保护条例》规定,软件著作权人对其创作的软件产品享有以下9种权利。

(1)发表权:即决定软件是否公之于众的权利。

(2)署名权:即表明开发者身份,在软件上署名的权利。

(3)修改权:即对软件进行增补、删节,或者改变指令、语句顺序的权利。

(4)复制权:即将软件制作一份或者多份的权利。

(5)发行权:即以出售或者赠与方式向公众提供软件的原件或复制件的权利。

(6)出租权:即有偿许可他人临时使用软件的权利。

(7)信息网络传播权:即以信息网络方式向公众提供软件的权利。

(8)翻译权:即将原软件从一种自然语言文字转换成另一种自然语言文字的权利。

(9)使用许可权、获得报酬权、转让权。

软件著作权自软件开发完成之日起生效。

(1)著作权属于公民。著作权的保护期为作者终生及其死亡后的50年(第50年的12月31日)。对于合作开发的,则以最后死亡的作者为准。值得注意的是,在1991实施的上一版条例中,保护期限是25年,而在最新的条例中,已经改为了50年。在作者死亡后,将根据继承法转移除了署名权之外的著作权。

(2)著作权属于单位。著作权的保护期为50年(首次发表后第50年的12月31日),若50年内未发表的,不予保护。单位变更、终止后,其著作权由承受其权利义务的单位享有。

当得到软件著作权人的许可,获得了合法的计算机软件复制品后,复制品的所有人享有以下权利。

(1)根据使用的需求,将该计算机软件安装到设备中(计算机、PDA等信息设备)。

(2)制作复制品的备份,以防止复制品损坏,但这些复制品不得通过任何方式转给其他人使用。

(3)根据实际的应用环境,对其进行功能、性能等方面的修改。但未经软件著作权人许可,不得向任何第三方提供修改后的软件。

如果使用者只是为了学习、研究软件中包含的设计思想、原理,而以安装、显示和存储软件等方式使用软件,可以不经软件著作权人的许可,不向其支付报酬。

根据著作权法及实施条例规定,著作权人对作品享有5种权利:

(1)发表权:即决定作品是否公之于众的权利。

(2)署名权:即表明作者身份,在作品上署名的权利。

(3)修改权:即修改或授权他人修改作品的权利。

(4)保护作品完整权:即保护作品不受歪曲、篡改的权利。

(5)使用权、使用许可权和获取报酬权、转让权:即以复制、表演、播放、展览、发行、摄制电影、电视、录像,或者改编、翻译、注释和编辑等方式使用作品的权利,以及许可他人以上述方式使用作品,并由此获得报酬的权利。

根据著作权法的相关规定,著作权的保护是有一定期限的。

(1)著作权属于公民。署名权、修改权、保护作品完整权的保护期没有任何限制,永远属于保护范围。而发表权、使用权和获得报酬权的保护期为作者终生及其死亡后的50年(第50年的12月31日)。作者死亡后,著作权依照继承法进行转移。

(2)著作权属于单位。发表权、使用权和获得报酬权的保护期为50年(首次发表后的第50年的12月31日),若50年内未发表的,不予保护。但单位变更、终止后,其著作权由承受其权利义务的单位享有。

当第三方需要使用时,需得到著作权人的使用许可,双方应签订相应的合同。合同中应包括许可使用作品的方式,是否专有使用,许可的范围与时间期限,报酬标准与方法,以及违约责任等。若合同未明确许可的权力,需再次经著作权人许可。合同的有效期限不超过10年,期满时可以续签。

对于出版者、表演者、录音录像制作者、广播电台、电视台而言,在下列情况下使用作品,可以不经著作权人许可、不向其支付报酬。但应指明作者姓名、作品名称,不得侵犯其他著作权。

(1)为个人学习、研究或欣赏,使用他人已经发表的作品。

(2)为介绍、评论某一个作品或说明某一个问题,在作品中适当引用他人已经发表的作品。

(3)为报道时事新闻,在报纸、期刊、广播、电视节目或新闻纪录影片中引用已经发表的作品。

(4)报纸、期刊、广播电台、电视台刊登或播放其他报纸、期刊、广播电台、电视台已经发表的社论、评论员文章。

(5)报纸、期刊、广播电台、电视台刊登或者播放在公众集会上发表的讲话,但作者声明不许刊登、播放的除外。

(6)为学校课堂教学或科学研究,翻译或者少量复制已经发表的作品,供教学或科研人员使用,但不得出版发行。

(7)国家机关为执行公务使用已经发表的作品。

(8)图书馆、档案馆、纪念馆、博物馆和美术馆等为陈列或保存版本的需要,复制本馆收藏的作品。

(9)免费表演已经发表的作品。

(10)对设置或者陈列在室外公共场所的艺术作品进行临摹、绘画、摄影及录像。

(11)将已经发表的汉族文字作品翻译成少数民族文字在国内出版发行。

(12)将已经发表的作品改成盲文出版。

18. 操作系统的功能可分为相互配合、协调工作的5大部分,其中不含( ) 。

A. 进程管理

B. 文件管理

C. 存储管理

D. 事务管理

1)处理机管理

处理机是计算机系统的心脏,在单用户系统或单道系统中,处理机为一个用户或一个作业服务,其管理简单,但资源利用率低。为提高系统资源的利用率,引入了多道程序技术,即多个程序(作业)同时运行。在多道程序或多用户的情况下,要组织多个作业同时运行,对多个用户进行响应,就需要解决对处理机的分配、调度和资源回收等问题。处理机管理负责解决如何把CPU时间合理地、动态地分配给程序运行的基本单位——进程,使处理机得到充分的利用。许多操作系统是以作业和进程的方式进行管理的,实现作业和进程的调度,分配处理机,控制作业和进程的执行。现代的操作系统还引入了线程(thread)作为分配处理机的基本单位。

由于操作系统对处理机的管理策略不同,其提供的作业处理方式也就不同,如批处理方式、分时处理方式和实时处理方式,从而呈现在用户面前的就有不同的操作系统。在操作系统中,最重要的资源是处理机,最重要的管理是处理机管理。

2)存储管理

计算机系统中,存储器(一般称为主存或内存)是运行程序和存放工作数据的部件,存储管理的工作主要是对内存储器进行分配、扩充和保护。

.内存分配:在内存中除了操作系统和其他系统软件外,还要有一个或多个用户程序。如何分配内存,以保证系统及各用户程序的存储区互相不冲突,是内存分配所要解决的问题。

.存储保护:系统中有多个程序在运行,如何保证一道程序在执行过程中不会有意或无意地破坏另一道程序?如何保证用户程序不会破坏系统程序?这些就是存储保护问题。

.内存扩充:当用户作业所需要的内存量超过计算机系统所提供的内存容量时,如何把内部存储器和外部存储器结合起来管理,为用户提供一个容量比实际内存大得多的虚拟存储器,使这个虚拟存储器和内存一样方便使用,这就需要使用内存扩充。

存储器是计算机系统中最重要的资源之一,因为任何程序和数据,以及各种控制用的数据结构,都必须占有一定的存储空间,因此,存储管理的目的就是尽量提高内存的使用效率。存储管理的好坏直接影响着系统性能。

3)设备管理

现代计算机系统常常配置很多种类的输入输出设备,它们的输入输出速度差别很大。计算机系统常常采用通道、控制器和设备3级控制方法管理这些设备。设备管理的任务就是监视这些资源的使用情况,根据一定的分配策略,把通道、控制器和设备分配给请求输入输出操作的程序,并启动设备完成所需的操作。为了发挥设备和处理机的并行工作能力,常常采用缓冲技术和虚拟技术。

由于输入/输出设备种类很多,使用方法各不相同,因此,设备管理应为用户提供一个良好的界面,使具体的设备特性透明化,以便用户能方便、灵活地使用这些设备。

4)文件管理(信息管理)

文件管理是对系统软件资源的管理。对用户来说,文件系统是操作系统中最直观的部分。我们把程序和数据统称为信息或文件。当一个文件暂时不用时,就把它放到外部存储器(如磁盘、磁带和光盘等)上保存起来。对这些文件如果不能很好地进行管理,就会引起混乱,甚至使其遭受破坏。这就是文件管理需要解决的问题。

文件管理的功能包括:建立、修改和删除文件;按文件名进行访问;决定文件信息的存放位置、存放形式及存取权限;管理文件间的联系及提供对文件的共享、保护和保密等,允许多个用户协同工作又不引起混乱。

5)用户接口(作业管理)

上述4项功能是操作系统对软、硬件资源的管理。除此以外,操作系统也必须为用户提供一个友好的用户接口——命令接口和图形接口。一般来说,用户通过两种命令接口请求操作系统的服务。一种接口是作业一级的接口,即提供一组控制操作命令,如UNIX的Shell命令语言或作业控制语言(JCL)让用户组织和控制自己作业的运行。作业控制又分成两类:联机控制和脱机控制。另一种用户接口是程序一级的接口(编程接口),即提供一组广义指令(或称系统调用、程序请求)供用户程序和其他系统程序调用。当这些程序要求进行数据传输、文件操作或有其他资源要求时,通过这些广义指令向操作系统提出申请,并由操作系统代为完成。

操作系统对计算机的资源进行全面管理,它的基本特征是多任务并行和多用户资源共享。多任务并行是指操作系统可以支持用户同时提交多项任务,同时工作;资源共享是指系统中的资源为多个用户共同使用。

现代操作系统的基本功能是管理计算机系统的硬件、软件资源,这些管理工作分为处理机管理、存储器管理、设备管理、文件管理、作业和通信事务管理。

操作系统的性能与计算机系统工作的优劣有着密切的联系。评价操作系统的性能指标一般有:

(1)系统的可靠性。

(2)系统的吞吐率(量),是指系统在单位时间内所处理的信息量,以每小时或每天所处理的各类作业的数量来度量。

(3)系统响应时间,是指用户从提交作业到得到计算结果这段时间,又称周转时间;

(4)系统资源利用率,指系统中各个部件、各种设备的使用程度。它用在给定时间内,某一设备实际使用时间所占的比例来度量。

(5)可移植性。

19. 操作系统中,短期调度指的是( )。

A. 作业调度

B. 进程调度

C. 线程调度

D. CPU调度

现代操作系统的基本功能是管理计算机系统的硬件、软件资源,这些管理工作分为处理机管理、存储器管理、设备管理、文件管理、作业和通信事务管理。

操作系统的性能与计算机系统工作的优劣有着密切的联系。评价操作系统的性能指标一般有:

(1)系统的可靠性。

(2)系统的吞吐率(量),是指系统在单位时间内所处理的信息量,以每小时或每天所处理的各类作业的数量来度量。

(3)系统响应时间,是指用户从提交作业到得到计算结果这段时间,又称周转时间;

(4)系统资源利用率,指系统中各个部件、各种设备的使用程度。它用在给定时间内,某一设备实际使用时间所占的比例来度量。

(5)可移植性。

20. 线程可以实现在( )。
①内核空间;②用户空间;③ 虚拟空间;④物理空间

A. ①③

B. ②③

C. ①②

D. ③④

线程的基本概念

线程是比进程更小的能独立运行的基本单位。在引入线程的操作系统中,线程是进程中的一个实体,是CPU调度和分派的基本单位。线程自己基本上不占用系统资源,只占用一点儿在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但它可与同属一个进程的其他线程共享该进程所占用的全部资源。相应地,线程也同样有就绪、等待和运行3种基本状态。在有的系统中线程还有终止状态。

线程的属性

线程的属性如下。

.每个线程都有一个唯一的标识符和一张线程描述表。

.不同的线程可以执行相同的程序。

.同一进程中的各个线程共享该进程的内存地址空间。

.线程是处理机的独立调度单位,多个线程是可以并发执行的。

.线程在生命周期内会经历等待状态、就绪状态和运行状态等各种状态变化。

引入线程的好处

传统的进程有两个基本属性:可拥有资源的独立单位、可独立调度和分配的基本单位。由于在进程的创建、撤销和切换中,系统必须为之付出较大的时空开销,因此在系统中所设置的进程数目不宜过多,进程切换的频率不宜太高,这就限制了并发程度的提高。引入线程后,将传统进程的两个基本属性分开,将线程作为调度和分配的基本单位,而将进程作为独立分配资源的单位。用户可以通过创建线程来完成任务,以减少程序并发执行时付出的时空开销。

引入线程的好处主要有如下几个。

.创建一个新线程花费的时间少。

.两个线程间切换花费的时间少。

.由于同一进程内的线程共享内存和文件,线程之间相互通信无须调用内核,故不需要额外的通信机制,使通信更简便,信息传送速度也更快。

.线程能独立执行,能充分利用和发挥处理机与外围设备并行工作的能力。

21. 操作系统中进行资源分配和独立运行的基本单位是( )。

A. 进程

B. 管程

C. 线程

D. 程序

现代操作系统的基本功能是管理计算机系统的硬件、软件资源,这些管理工作分为处理机管理、存储器管理、设备管理、文件管理、作业和通信事务管理。

操作系统的性能与计算机系统工作的优劣有着密切的联系。评价操作系统的性能指标一般有:

(1)系统的可靠性。

(2)系统的吞吐率(量),是指系统在单位时间内所处理的信息量,以每小时或每天所处理的各类作业的数量来度量。

(3)系统响应时间,是指用户从提交作业到得到计算结果这段时间,又称周转时间;

(4)系统资源利用率,指系统中各个部件、各种设备的使用程度。它用在给定时间内,某一设备实际使用时间所占的比例来度量。

(5)可移植性。

22. 程序设计语言的基本成分包括数据、运算、控制和(22)。 数据是程序操作的对象,按照数据组织形式可以分为多种类型,其中枚举属于(23)类型;数组属于(24)类型。

A. 存储

B. 分配

C. 传输

D. 函数

数据成分

程序语言的数据成分是指一种程序语言的数据类型。

1)常量和变量

按照程序运行时数据的值能否改变,将数据分为常量和变量。程序中的数据对象可以具有左值和(或)右值,左值是指存储单元(或地址、容器),右值是指具体值(或内容)。变量具有左值和右值,在程序运行过程中其右值可以改变;常量只有右值,在程序运行过程中其右值不能改变。

2)全局量和局部量

按数据的作用域范围,数据可分为全局量和局部量。系统为全局变量分配的存储空间在程序运行的过程中一般是不改变的,而为局部变量分配的存储单元是动态改变的。

3)数据类型

按照数据组织形式的不同可将数据分为基本类型、用户定义类型、构造类型及其他类型。C(C++)的数据类型如下。

.基本类型:整型(int)、字符型(char)、实型(float、double)和布尔类型(bool)。

.特殊类型:空类型(void)。

.用户定义类型:枚举类型(emum)。

.构造类型:数组、结构体和共用体。

.指针类型:type*。

.抽象数据类型:类类型。

其中,布尔类型和类类型是C++在C语言的基础上扩充的。

运算成分

程序语言的运算成分是指允许使用的运算符号及运算规则。大多数高级程序语言的基本运算可以分成算术运算、关系运算和逻辑运算,有些语言还提供位运算。运算符号的使用与数据类型密切相关。为了确保运算结果的唯一性,运算符号要规定优先级和结合性,必要时还要使用圆括号。

控制成分

控制成分指明语言允许表述的控制结构,程序员使用控制成分来构造程序中的控制逻辑。

1)顺序结构

在顺序结构中,计算过程从所描述的第一个操作开始,按顺序依次执行后续的操作,直到执行完序列的最后一个操作。顺序结构内也可以包含其他控制结构。

2)选择结构

选择结构提供了在两种或多种分支中选择执行其中一个分支的逻辑。基本的选择结构是指定一个条件P,然后根据条件的成立与否决定控制流走计算A还是走计算B,从两个分支中选择一个执行。选择结构中的计算A或计算B还可以包含顺序、选择和重复结构。程序语言中通常还提供简化了的选择结构,也就是没有计算B的分支结构。

3)循环结构

循环结构描述了重复计算的过程,通常包括3个部分,即初始化、需要重复计算的部分和重复的条件。其中初始化部分有时在控制的逻辑结构中不进行显式表示。循环结构主要有两种形式,即while型重复结构和do-while型重复结构。

4)C(C++)语言提供的控制语句

(1)复合语句。复合语句用于描述顺序控制结构。复合语句是一系列用"{"和"}"括起来的声明和语句,其主要作用是将多条语句组成一个可执行单元。复合语句是一个整体,要么全部执行,要么一条语句也不执行。

(2)if语句和switch语句。这两种语句用于实现选择结构。

①if语句实现的是双分支的选择结构,其一般形式如下:

其中,语句1和语句2可以是任何合法的C(C++)语句,当语句2为空语句时,可以简化为

使用if语句时,需要注意的是if和else的匹配关系。C语言规定,else总是与离它最近的尚没有else与其匹配的if相匹配。

②switch语句描述了多分支的选择结构,其一般形式如下:

执行switch语句时,首先计算表达式的值,然后用所得的值与列举的常量表达式值依次比较,若任一常量表达式都不能与所得的值相匹配,则执行default的"语句序列n+1",然后结束switch语句。

表达式可以是任何类型,常用的是字符型或整型表达式。多个常量表达式可以共用一个语句组。语句组可以包括任何可执行语句,且无须用"{"和"}"括起来。

(3)循环语句。C(C++)语言提供了3种形式的循环语句,用于描述循环计算的控制结构。

①while语句。while语句描述了先判断条件再执行循环体的控制结构,其一般形式如下:

②do-while语句。do-while语句描述了先执行循环体再判断条件的控制结构,其一般格式如下:

③for语句。for语句的基本格式如下:

可用while语句等价地表示为

函数

函数是程序模块的主要成分,它是一段具有独立功能的程序。函数的使用涉及3个概念,即函数定义、函数声明和函数调用。

(1)函数定义。包括函数首部和函数体两个部分。函数的定义描述了函数做什么和怎么做。

(2)函数声明。函数应该先声明后引用。函数声明定义了函数原型。声明函数原型的目的在于告诉编译器传递给函数的参数个数、类型以及函数返回值的类型,参数表中仅需要依次列出函数定义中的参数类型。函数原型可以使编译器检查源程序中对函数的调用是否正确。

(3)函数调用。当需要在一个函数(称为主调函数)中使用另一个函数(称为被调函数)实现的功能时,便以函数名字进行调用,称为函数调用。调用函数和被调用函数之间交换信息的方法主要有两种:一种是由被调用函数把返回值返回给主调函数;另一种是通过参数带回信息。函数调用时实参和形参间交换信息的方法有传值调用和引用调用两种。

①传值调用(Call by Value)。若实现函数调用时实参向形式参数传递相应类型的值(副本),则称为传值调用。这种方式下形式参数不能向实际参数传递信息。在C语言中,要实现被调用函数对实际参数的修改,必须用指针作形参。即调用时需要先对实参进行取地址运算,然后将实参的地址传递给指针形参,本质上仍属于传值调用。这种方式实现了间接内存访问。

②引用调用(Call by Reference)。引用是C++中增加的数据类型,当形式参数为引用类型时,形参名实际上是实参的别名,函数中对形参的访问和修改实际上就是针对相应实际参数所作的访问和改变。

数组的定义及基本运算

n维数组是一种"同构"的数据结构,其每个元素类型相同、结构一致。数组是定长线性表在维数上的扩张,即线性表中的元素又是一个线性表。

数组结构的特点是:数据元素数目固定;数据元素具有相同的类型;数据元素的下标关系具有上下界的约束且下标有序。

对数组进行的基本运算有以下两种。

(1)给定一组下标,存取相应的数据元素。

(2)给定一组下标,修改相应的数据元素中某个数据项的值。

数组的顺序存储

一旦定义了数组,结构中的数据元素个数和元素之间的关系就不再发生变动,因此数组适合于采用顺序存储结构。

由于计算机的内存结构是一维线性的,因此存储多维数组时必须按照某种方式进行降维处理,即将数组元素排成一个线性序列,这就产生了次序约定问题。对二维数组有两种存储方式:一种是以列为主序的存储方式;另一种是以行为主序的存储方式。

设每个数据元素占用L个单元,mn为数组的行数和列数,那么以行为主序优先存储的地址计算公式为

Loc(aij)=Loc(a11)+((i-1)n+(j-1))L

同样的,以列为主序优先存储的地址计算公式为

Loc(aij)=Loc(a11)+((j-1)m+(i-1))L

类和继承

1)类

一个类是一些属性和方法的封装体,类的定义用关键字class声明,用关键字public、protected、 private指定类的成员的存取控制属性:private(私有)成员只有类内部的方法才能访问,protected(保护)成员派生类和同一文件夹下的类可以访问,public(公有)成员可以从类的外部访问。默认是public。这体现了面向对象的以下指导思想:尽量将类内部的细节隐藏起来,对类的属性的操作应该通过类的方法来进行。

另外,public还可以用来修饰类,public类能够被其他文件夹下的类访问,非public类只能被同一文件夹下的类访问。一个.java文件中可以包含多个类,会被编译成多个.class文件,但只能有一个public类,而且该类名要和文件名一样。

2)继承

Java中用关键字extends表示类间的继承关系。父类的公有属性和方法成为子类的属性和方法,子类如果有和父类的同名、同参数类型的方法,那么子类对象在调用该方法时,调用的是子类的方法,亦即方法的重置。如果想要调用父类的同名方法,需要用super关键字(属性同理)。

子类的对象可以作为祖先类的对象使用,即所谓类的向上转换,反之则不行。具体表现在:可以用子类对象来对祖先类对象赋值,可以用子类对象作为实参去调用以父类对象为形参的函数。

对象的引用本质

Java中的对象实际上是对象的引用,本质上和C语言中的指针是一样的;但也和C语言指针不尽相同,例如,不能自增、自减,不能强制转换成其他类型。

例如:

构造方法

构造方法就是类的对象生成时会被调用的方法。每个类至少有一个构造方法(Constructor),也称构造函数。构造方法的名字和类名相同,没有任何返回类型。每个类都有一个默认的构造方法,但当用户自定义了构造方法后,默认的构造函数就不再有效了。

重载

同一个类中的两个或两个以上方法,名字相同,而参数个数不同或参数类型不同,称为重载。注意:不能有各方法名字和参数都一样,而仅仅返回值类型不同。

静态属性和静态方法

静态属性和静态方法的声明用关键字static实现,一个类的静态属性只有一份,由所有该类的对象共享。不需要创建对象也能访问类的静态属性和方法,访问方式为"类名.静态属性或静态方法",静态方法与对象无关,因此不能在静态方法中访问非静态属性和调用非静态方法。

this和super关键字

这两个关键字颇为重要。this代表当前对象,super代表当前对象的父类的东西。

this主要用途有以下两个。

(1)一个构造函数调用另一个构造函数,对构造函数的调用必须是第一条语句。

(2)将对象自身作为参数来调用一个函数。

super的用途如下:在子类中调用父类的同名方法,或在子类的构造函数中调用父类的构造函数,此时亦必须是第一条语句。

多态

所谓多态,是指通过基类对象调用一个基类和派生类都有的方法时,在运行时才能确定到底调用的是基类的方法还是派生类的方法。多态的好处是增加了程序的可扩展性。多态是通过动态联编实现的,即编译时不确定,程序运行时才确定调用哪个函数。

抽象类与接口

1)抽象类

抽象类通过关键字abstract实现,抽象类的目的是定义一个框架,规定某些类必须具有的一些共性。

包含抽象方法的类一定是抽象类,所谓抽象方法是指没有函数体的方法。

抽象类的直接派生类必须实现其抽象方法;抽象类只能用于继承,不能创建对象。

2)接口(Interface)

接口用关键字interface声明,只能用于继承。注意:此时关键字为implements(实现)。接口用于替代多继承的概念,能实现多继承的部分特点,又避免了多继承的混乱,还能起到规定程序框架的作用。注意:接口也可以用于多态。

直接继承了接口的类,必须实现接口中的抽象方法;间接的则可以实现,也可以不实现。

3)抽象类与接口的异同

接口和抽象类都不能创建对象。

抽象类不能参与多继承,抽象类可以有非静态的成员变量,可以有非抽象方法;接口可以参与多继承,所有属性都是静态常量,所有方法都是public抽象方法。

异常处理

1)异常概念

异常,即出错,比如0作为除数、找不到类、打开文件错误、数组越界等。异常如果不进行处理,那么程序运行就会结束;如果进行处理,那么会在执行完异常处理代码后继续运行。

Java中所有异常类均继承自类Exception。

Java中的异常类层次结构如下:

此外,还有EOFException、 FileNotFoundException、 MalformedURLException等。

2)捕获异常

异常处理的典型用法如下,将可能出现异常的代码放在try块中,其后由一个或多个catch捕获相应异常进行处理,注意只执行第一个匹配的catch块,忽略后面的。

如果某个方法中所产生的异常该方法自己没有处理,那么可以在调用该方法的方法中进行处理,如果自己处理了,那么调用它的方法就无法得到该异常。

3)抛出异常

异常除了运行中系统产生的之外,也可以主动抛出异常,用关键字throw,如throw new Exception()。注意:throw只能抛出Throwable子类的异常。

4)带throws关键字的方法

带throws关键字的方法声明如下:

强制调用该方法的方法必须处理可能发生的异常,或者将异常重新定向。假定方法A带throws关键字,而方法B中调用了方法A,则方法B中必须有处理方法A中可能产生的异常的语句,或者方法B也带throws关键字,指明调用方法B的方法必须处理异常。

final关键字

用final关键字定义的常量,在其初始化或第一次赋值后,其值不能被改变。常量必须先有值,然后才能使用。对于常量的第一次赋值只能在构造函数中进行。

final对象的值不能被改变,指的是该对象不能再指向其他对象,而不是指不能改变当前对象内部的属性值。

函数参数声明为final后,函数中不能改变其值。

final方法是不能被重置的方法。

final类不能被继承,其所有方法都是final的,但属性可以不是final的。

在计算机系统中,对象是指一组属性及这组属性上的专用操作的封装体。属性可以是一些数据,也可以是另一个对象。每个对象都有它自己的属性值,表示该对象的状态,用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的。封装的目的是使对象的使用者和生产者分离,使对象的定义和实现分开。一个对象通常可由三部分组成,分别是对象名、属性和操作(方法)。

程序设计语言(Programming Language)是用于编写计算机程序的语言。语言的基础是一组记号和一组规则,根据规则由记号构成的记号串的总体就是语言。在程序设计语言中,这些记号串就是程序。程序设计语言包含三个方面,即语法、语义和语用。语法表示程序的结构或形式,即表示构成程序的各个记号之间的组合规则,但不涉及这些记号的特定含义,也不涉及使用者。语义表示程序的含义,即表示按照各种方法所表示的各个记号的特定含义,但也不涉及使用者。语用表示程序与使用的关系。

程序设计语言的基本成分有:数据成分,用于描述程序所涉及的数据;运算成分,用以描述程序中所包含的运算;控制成分,用以描述程序中所包含的控制;传输成分,用以表达程序中数据的传输。

程序设计语言按照语言级别可以分为低级语言和高级语言。低级语言有机器语言和汇编语言。低级语言与特定的机器有关、功效高,但使用复杂、繁琐、费时、易出差错。机器语言是表示成数码形式的机器基本指令集,或者是操作码经过符号化的基本指令集。汇编语言是机器语言中地址部分符号化的结果,或进一步包括宏构造。高级语言的表示方法要比低级语言更接近于待解问题的表示方法,其特点是在一定程度上与具体机器无关,易学、易用、易维护。常见的有Java、C、C++、PHP、Python和Delphi等。这类语言与人们使用的自然语言比较接近,大大提高了程序设计的效率。

中标人应当按照合同约定履行义务,完成中标项目。中标人不得向他人转让中标项目,也不得将中标项目肢解后分别向他人转让。中标人按照合同约定或者经招标人同意,可以将中标项目的部分非主体、非关键性工作分包给他人完成。接受分包的人应当具备相应的资格条件,并不得再次分包。中标人应当就分包项目向招标人负责,接受分包的人就分包项目承担连带责任。

23. 程序设计语言的基本成分包括数据、运算、控制和(22)。 数据是程序操作的对象,按照数据组织形式可以分为多种类型,其中枚举属于(23)类型;数组属于(24)类型。

A. 基本

B. 用户定义

C. 构造

D. 特殊

24. 程序设计语言的基本成分包括数据、运算、控制和(22)。 数据是程序操作的对象,按照数据组织形式可以分为多种类型,其中枚举属于(23)类型;数组属于(24)类型。

A. 基本

B. 用户定义

C. 构造

D. 特殊

25. 传统过程模型中,( )首先引入了风险管理

A. 瀑布模型

B. 螺旋模型

C. V模型

D. 原型化模型

风险是指对无法达到预定目标的可能性和结果的一种测评,是可能给项目的成功带来威胁或损害的可能性。“风险”一词包含着“不确定性”。对于某个既定事件而言,风险包含两个要素:一是某事件发生的可能性;二是该事件发生所带来的影响。

风险管理就是要在风险成为影响项目成功的威胁之前,识别、着手处理并消除风险的源头。项目风险管理就是项目管理者通过风险识别、风险估计和风险评价,并以此为基础合理地使用多种管理方法、技术和手段对项目活动涉及的风险实行有效的控制,采取主动行动、创建条件、可靠地实现项目的总体目标。项目风险管理是一种综合性的管理活动,其理论和实践涉及自然科学、社会科学、工程技术、系统科学、管理科学等多种学科。项目风险管理就是对项目寿命周期中可能遇到的风险进行预测、识别、评估、分析,并在此基础上有效地处置风险,以最低成本实现最大的安全保障。其中多数过程在整个项目期间都需要更新。项目风险管理的目标在于增加积极事件的概率和影响,降低消极事件的概率和影响。项目风险管理过程包括:

(1)风险管理规划。决定如何进行、规划和实施项目风险管理活动。

(2)风险识别。判断哪些风险会影响项目,并以书面形式记录其特点。

(3)定性风险分析。对风险概率和影响进行评估和汇总,进而对风险进行排序,以便于随后的进一步分析或行动。

(4)定量风险分析。就识别的风险对项目总体目标的影响进行定量分析。

(5)应对计划编制。针对项目目标制订提高机会、降低威胁的方案和行动。

(6)风险监控。在整个项目生命周期中,跟踪已识别的风险、监测残余风险、识别新风险,实施风险应对计划,并对其有效性进行评估。

26. 以下有关测试的说法中,错误的是( )。

A. 测试证明了程序的正确性

B. 测试无法执行穷举测试,只能做选择测试

C. 测试工作需要制定测试计划,按计划执行测试工作

D. 白盒测试方法用于单元测试环节

测试工作伴随着整个网络工程的全过程,无论是布线安装还是系统调试,都需要进行反复的测试和确定。

测试计划

测试计划应包括下列5个方面的内容。

1)简要说明

简要说明包括工程的概况和需要达到的主要指标。

2)测试内容

测试内容包括逐项列出的测试步骤、名称、内容和预期达到的目标。

3)测试清单

测试清单是对每项测试内容列出测试的部位和参与测试的单位,包括进度的安排、测试工具和相应的条件(设备和软件等)。

4)测试设计说明

测试设计说明是对每项测试内容的测试设计进行考虑,包括测试的控制方式、输入条件和预期的输出结果。

5)评价准则

评价准则用来说明测试所能检查的范围及其局限性,以及用来判断测试工作是否通过的评价尺度,包括合理的输出结果、测试输出结果与预期输出结果之间容许出现的偏差范围。

测试工作完成后,应提交一份测试分析报告。该报告主要包括下列内容:概要说明、测试结果、结论、原因分析、建议和评价。

网络测试

网络测试是对网络设备、网络系统以及网络对应用的支持进行检测,以展示和证明网络系统能否满足用户在性能、安全性、易用性、可管理性等方面需求的测试。网络测试的实施一般包括以下环节。

◆根据测试目的,确定测试目标。

◆在对相关网络技术和实现细节透彻掌握的基础上,设计测试方案。

◆建立网络负载模型。

◆配置测试环境,包括测试工具的选择及必要的测试工具的研发。

◆采集和整理数据。

◆分析和解释数据。

◆准确、直观、形象地表示测试结果。

网络测试包括网络设备测试、网络系统测试和网络应用测试3个层次。

1)网络设备测试

网络设备测试主要包括以下几个方面:功能测试、可靠性和稳定性测试、一致性测试、互操作性测试和性能测试等。

(1)功能测试用来验证产品是否具有设计的每一项功能。

(2)可靠性和稳定性测试往往通过加重负载的办法来分析和评估系统的可靠性和稳定性。

(3)一致性测试用来验证产品的各项功能是否符合标准。

(4)互操作性测试用来考查一个网络产品是否能在不同厂家的多种网络产品互联的网络环境中很好地工作。网络产品不同于其他产品的最大特点是必须符合标准,不同的网络产品之间要能互操作。

(5)性能测试的主要目标是分析产品在各种不同的配置和负载条件下的容量和对负载的处理能力,如交换机的吞吐量、转发延迟等。

典型的网络设备性能测试方法有两种:第一种是将设备放在一个仿真的网络环境中进行测试,第二种是使用专用的网络测试设备对产品进行测试。

2)网络系统测试和网络应用测试

网络系统测试除了普通意义上的物理连通性、基本功能和一致性的测试以外,主要包括网络系统的规划验证测试、网络系统的性能测试、网络系统的可靠性与可用性的测试与评估、网络流量的测量和模型化等。

(1)网络系统的规划验证测试主要采用的两个基本手段是模拟和仿真。

◆模拟是通过软件的办法,建立网络系统的模型,模拟实际网络的运行。通过设定各种配置和参数模拟系统的行为,对系统的容量、性能以及对应用的支撑程度给出定量的评价。这对于大型网络的规划设计是不可缺少的环节。

◆仿真是指通过建立典型的试验环境,仿真实际的网络系统。规划验证测试的目的在于分析所采用的网络技术的可行性和合理性,网络设计方案的合理性,所选网络设备的功能、性能等是否能够合理地、有效地支持网络系统的设计目标。

(2)网络系统的性能测试是指通过对网络系统的被动测量和主动测量来确定系统中站点的可达性、网络系统的吞吐量、传输速率、带宽利用率、丢包率、服务器和网络设备的响应时间、产生最大网络流量的应用和用户,以及服务质量等。此项工作同时可以发现系统的物理连接和系统配置中的问题,确定网络瓶颈,发现网络问题。测试设备记录一段时间内的网络流量,实时和非实时地分析数据。被动测量不干涉网络的正常工作,不影响网络的性能。主动测量向网络发送特定类型的数据包或网络应用,以便分析系统的行为。

(3)网络系统的可靠性与可用性的测试与评估。系统可用性取决于系统的可靠性(MTTF)及可维护性(MTTR)的高低,其中可靠性是指系统服务多久不中断,可维护性是指服务中断后多久可恢复。三者之间满足如下关系:

System Usability=MTTF/(MTTF+MTTR)*100%

其中,MTTF是指平均无故障时间,MTTR是指平均故障修复时间,MTBF是指平均故障间隔时间。有MTBF=MTTF+MTTR,故

System Usability=MTTF/MTBR*100%

(4)网络流量的测量和模型化。网络流量的测量和模型化对于分析网络性能和带宽的利用率、指导网络流量管理、开发高效的网络应用十分重要。这方面的工作主要有以下几个方面。

◆产生已知特征的流量,使该流量沿网络传播,最后回到测试仪。记录和分析流量特性的任何改变(如延迟漂移)。

◆对链路总体流量的测量和传输时间、吞吐量、带宽利用率等进行分析。

◆分析特定流量的特征和提供的QoS;收集一个时间段内的测量数据进行分析,分析流量沿网络传播过程中流量特征的变化和网络流量的统计行为,建立流量模型。

(5)网络应用层次上的测试则主要体现在测试网络对应用的支持水平,如网络应用的性能和服务质量的测试等。例如,部署基于IP的语音传输VoIP时,最直接的问题是网络中的交换机和路由器设备能否有效地支持语音传输,网络能支持多大的语音流量、多少个语音通道;如果网络支持VoIP,对网络的其他业务特别是关键业务,会产生什么样的影响;网络是否支持服务质量QoS。这些问题都需要通过网络应用测试来回答。

(6)网络系统测试的核心工具是协议分析仪。这是一种专用的网络测试设备,它能够连接到网络上,产生并向网络发送数据,捕捉网络数据,分析数据。协议分析仪一般具有网络监测、故障查找、协议解码和流量产生等功能。

网络设备安全性测试

现在有很多新型网络设备尤其是网络边缘路由器增加了防护功能,阻止了人为、故意的网络攻击。然而,提供的防护会不会对正常数据转发造成影响?有什么样的影响?这些很难从理论上估计,需要进行必要的网络设备安全性测试。

本节提到的测试项,主要是验证网络设备所提供的基本安全功能,并检测这些安全功能项对网络设备运行造成的影响。这些测试项分为访问列表测试和DOS攻击测试两大类。

1)访问列表测试

访问列表测试用于检测边缘路由器的访问列表能否起到防火墙的作用,访问列表测试控制网络传输过滤数据报文,访问列表测试阻止或允许数据报文通过网络接口。过滤依据可以是源地址、目的地址和上层协议号。边缘路由器通过将进入或离开的数据报文与访问列表中的过滤项进行比较,决定允许或阻止数据报文通过。对于边缘路由器能提供的访问列表容量,以及不断变化的访问列表对数据转发的影响都要进行测试。

2)DOS攻击测试

DOS攻击测试用于检测边缘路由设备抵抗"拒绝服务(DOS)攻击"的能力。当设备由于伪造的服务请求和虚假的传输而变得非常繁忙时,就无法响应正常的服务请求,从而造成损失。DOS攻击测试考验网络设备检测并阻止某种特定攻击的能力,并在检测受到某种攻击、设备超负荷运行的情况下,正常传输转发性能所受的影响。

具体的网络设备安全性测试项目如下。

◆访问列表性能测试。

◆虚假源地址攻击测试。

◆LAND攻击检查。

◆SYN风暴检查。

◆Smurf攻击检查。

◆Ping风暴检查。

◆Teardrop攻击检查。

◆Ping to Death检查。

性能测试

性能测试包括可靠性测试、功能/特性测试、吞吐量测试、衰减测试、容量规划测试、响应时间测试、可接受性测试和网络瓶颈测试等。

1)可靠性测试

可靠性测试是使被测网络在较长时间内(通常是24~72小时)经受较大负载,通过监视网络中发生的错误和出现的故障,验证在高强度环境中网络系统的存活能力,也就是它的可靠性。可靠性测试可作为接受性测试的一部分,在产品评估测试中可作为比较测试或作为产品升级进行的衰减测试的一部分。采用的负载模式很重要,越贴近真实负载模式越好。可靠性测试中使用网络分析仪监控网络运行,捕获网络错误。

通常在较长时间段内和持续负载下,不同网络具有不同级别的存活度。如果测试时间足够长、负载足够大,所有可靠性测试最终都会失败。

可靠性测试应用于网络生命周期中的以下3个阶段。

◆计划:作为产品评估测试的一部分,比较不同产品或建立要求规范。

◆开发:验证计划中的要求是否能在系统中完全实现。

◆组建:作为可接受性测试的一部分,在网络运行前进行,核实系统是否达到要求。

2)功能/特性测试

特性测试核实的是单个命令和应用程序功能,通常用较小的负载完成,关注的是用户界面、应用程序的操作以及用户与计算机之间的互操作。特性测试通常由开发人员在他们的工作台上完成,或是在一个小型网络环境下由测试人员完成。

功能测试是面向网络的,核实的是应用程序的多用户特征和在重负载下后台功能是否能正确地执行,关注的是当多个用户正在运行应用程序时,网络和文件系统或数据库服务器之间的交互。功能测试要求网络的配置和负载非常接近于运行环境下的模式。该测试可以在运行网络或独立网络实验室里完成。它只应用于网络生命周期中的以下3个阶段。

◆开发:用于核实在期望的运行模式下,在多用户环境里,应用程序的运行性能是否达到要求。

◆组建:在应用程序安装前完成,可独立进行,也可作为接受性测试的一部分,用于核实在期望的运行模式下,应用程序的运行性能是否达到要求。

◆运行:该阶段测试是在应用程序运行后进行的,如果在运行系统中遇到了问题,该阶段测试用于核实应用程序是否如最初应用时那样工作。

3)吞吐量测试

吞吐量测试和应用程序的响应时间测试相似,但检测的是每秒钟传输数据的字节数和数据报文数,而不是响应时间。它用于检测服务器、磁盘子系统、适配卡/驱动连接、网桥、路由器、集线器、交换器和通信连接。吞吐量测试用于测量网络性能、找到网络瓶颈,以及比较不同产品的性能。

吞吐量测试不使用程序脚本,它借助某些软件对网络服务器执行文件输入/输出操作来产生流量,或通过某些软件在网络上发送专门的数据报文或帧。该测试应用于网络生命周期的以下几个阶段。

◆计划:用于比较网络产品,为模拟网络节点提供运行特征和要求规范。

◆开发:用于核实网络组件以及整个网络是否达到规范要求的水平。

◆组建:可独立进行或作为可接受性测试的一部分,在网络组件或整个网络正式运行之前核实它们是否满足规范的要求。

4)衰减测试

衰减测试是将硬件或软件的新版本与当前版本在性能、可靠性和功能等方面进行比较,同时验证产品升级对网络的性能不会有不良影响。衰减测试混杂了很多为完成其他测试任务要进行的测试。衰减测试的关键是要保证被测组件应是运行网络中最关键或最脆弱的组件。

衰减测试不强调升级版的新特性。新特性测试在衰减测试之前作为功能/特征测试的一部分就已完成。尽管新产品应该解决了当前版本中的错误,但它们也经常存在一些以前没有出现过的错误,如果这些错误发生在产品的关键部分,将会引起严重问题。衰减测试不需要测试产品的所有特性,但网络用户正常运行所依靠的关键功能必须在测试之列。

衰减测试应用于网络生命周期的以下两个阶段。

◆开发:用于核实产品升级版是否能满足性能、互操作性和可靠性的要求。

◆升级:在采用升级版本之前用该项测试来比较升级版和当前版,看升级版是否和当前版一样满足性能、互操作性和可靠性的要求。

5)容量规划测试

容量规划测试用于检测当前网络中是否存在多余的容量空间。当网络承受的总负载超过网络总容量时,网络的性能或吞吐量就有可能下降,所以在网络负载接近这一临界点(网络的最大容量)前,就要根据负载增长的幅度扩充网络资源。

进行该项测试要逐渐增加网络负载,直到网络的运行性能、可接受的水平或吞吐量不断下降,达不到设计所要求的水平为止。网络运行负载和网络最大吞吐量之间的差额就是现有系统的冗余量。

容量规划测试应用于网络生命周期的以下3个阶段。

◆计划:用于估计实施该系统所需要的资源,也可用于成本分析和制定预算。

◆开发:检测系统要求的资源是否满足特定的响应时间和吞吐量的要求。

◆升级:当系统响应时间或吞吐量下降时,重新选取网络组件。

6)响应时间测试

响应时间测试用于检测系统完成一系列任务所需的时间,本项测试是用户最关心的。对于表示层,如微软的Windows,该测试是指在不同桌面之间切换或装载新负载所需的时间。在不同负载即不同实际或模拟用户的数目下运行这一实验,可对每个被测试的应用程序生成一个负载—响应时间曲线。

在应用程序测试中,可执行一系列典型网络动作的命令,如打开、读、写、查找和关闭文件,这些命令提供了最好的负载模拟。例如,对每个进行测试的工作站,检测它在几秒内能完成这些命令。

响应时间测试应用于网络生命周期的以下几个阶段。

◆计划:使用模拟应用程序进行,检测规范要求的各项网络服务。

◆开发:检验规范要求的网络服务是否正在被实现。

◆组建:在接受和组建之前,核实规范要求下的网络服务是否已经被实现。

◆运行:检测网络服务的基准和变化,这可能是针对系统质量的最好测试。

响应时间测试应该包括对系统可靠性的检测。常见的可靠性问题,如在路由器或服务器中大量丢失数据报文或由于网络组件故障引发大量坏数据报文,将严重影响网络的响应时间,因此在整个测试期间都应用网络分析仪监视系统错误。

7)可接受性测试

可接受性测试是在系统正式实施前的"试运行"。它是一个非常有效的方法,可确保新系统能提供良好而稳定的性能。和衰减测试一样,可接受性测试中也包含多项测试,如响应时间测试、稳定性测试和功能/特性测试。

可接受性测试应用于许多领域,但在安装或升级网络前应进行的网络可接受性测试则经常被忽略,而事实上,可接受性测试能为网络购买者在经济和技术上提供有力的保证和参考。

可接受性测试可以仅在新增加的部件上完成,将已存在的负载加上新增程序或新增组件可能产生的负载作为测试使用的负载。

可接受性测试应用于网络生命周期的以下两个阶段。

◆开发:在开发阶段前定期执行,用来核实要求的标准是否可行。

◆组建:在网络投入运行之前应用,用来核实系统是否满足所有要求。

8)网络瓶颈测试

通过网络瓶颈测试可以找到导致系统性能下降的瓶颈。测试中需要测试和计算系统的最大吞吐量,然后再在单个网络组件上进行该项测试,明确各组件的最大吞吐量。通过计算单个组件的最大吞吐量和系统最大吞吐量之间的差额,就能发现系统瓶颈的位置以及哪些组件有多余的容量。

系统瓶颈在不同的测试案例中出现的位置可能有所变化。例如,一个客户业务应用程序测试可能表明服务器是系统的瓶颈,而对一个电子邮件系统的测试则可能表明广域网连接才是网络的限制因素。如果可以在测试的环境中重现引起问题的负载,那么这样的测试结果对解决问题将有很大帮助。

瓶颈测试应用于网络生命周期的以下两个阶段。

◆组建:可以作为容量计划的一部分,用于帮助相关人员明确影响网络性能和响应时间的瓶颈位置。

◆运行:作为故障检测的一部分,帮助相关人员找出影响网络性能或引起系统问题的网络瓶颈。

测试报告

测试报告是整个项目的第一份供大家交流和供领导查阅的报告,人们对工程的满意程度和对工程质量的认可很大程度上来源于这份报告。通常在独立网络测试后,要总结测试数据,并基于此对测试过的同类产品进行排序;而系统内部的测试仅是得出一个简单的结论。

测试报告呈现的内容和采取的表现形式非常重要,测试报告通常包含以下信息。

◆测试目的:用一句或两句话解释本次测试的目的。

◆结论:从测试中得到的信息推荐下一步的行动。

◆测试结果总结:对测试进行总结并由此得出结论。

◆测试内容和方法:简单地描述测试是怎样进行的,应该包括负载模式、测试脚本和数据收集方法,并且要解释采取的测试方法怎样保证测试结果和测试目的的相关性,以及测试结果是否可重现。

◆测试配置:网络测试配置用图形表示出来。

测试报告的形式可以是一个简短的总结(2~4页),也可以是一个很长的书面文档(5~20页)。测试总结可以使用图形表示测试结果,如应用程序的响应时间、吞吐量和产品评估。而系统衰减性测试、配置规模测试和应用程序的功能/特性测试的测试报告还要包括更多的信息。

在非常特殊的情况下,测试报告需要长达50页。它通常包括从项目开始到结束按时间编排的所有活动,以及非常详细的问题信息和解决问题的信息。

网络测试工具

网络测试工具一般包括以下几个。

◆网络管理和监控工具。

◆建模和仿真工具。

◆服务质量和服务级别管理工具。

网络管理和监控工具(如HP公司的OpenView)能够在网络测试运行过程中提示某些问题的网络事件的出现。这些工具可以是驻留在网络设备中的应用软件。

协议分析仪也能被用于监测新设计的网络,帮助分析通信的行为、差错、利用率、效率以及广播和多播分组。

建模工具和仿真工具是更为先进的用来测试验证网络设计的工具。仿真就是在不建立实际网络的情况下,使用软件和数学模型来分析网络行为的过程。利用仿真工具,可以根据所需要测试的目标开发一个网络模型,从而估计网络性能,并对各种网络实现方法之间的差异进行比较。仿真工具使得选择比较的空间变得更大,特别适合于实现和检查一个扩展的原型系统。一个好的仿真工具往往非常昂贵,实现的技术也比较复杂,它要求开发人员不但要精通统计分析和建模技术,而且还要对计算机网络有所了解。

服务级别管理工具是一种比较新型的工具,主要用来分析网络应用的端到端性能。有些工具能够管理服务质量和服务级别,有些工具能够监控实时应用的性能,有些工具能够预测新的应用性能,有些工具可以将上述功能结合起来实现更强大的功能。

27. 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准,耦合程度最高的是(27)耦合;内聚程度最高的是(28)内聚。

A. 数据

B. 内容

C. 标记

D. 公共

从技术角度上讲,软件设计分成体系结构设计、数据设计、接口设计、过程设计4方面的工作。从管理角度上讲,软件设计分为概要设计、详细设计两个阶段。

1)软件设计的基本原理

软件设计的基本原理如下。

(1)模块化:将一个待开发的软件分解成若干个小的简单的部分——模块,每个模块可独立地开发、测试,最后组装成完整的程序。

(2)抽象化:抽象是一种设计技术,抽出事物本质的共同特性而暂不考虑它的细节。

(3)信息隐蔽:将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理,可以提高软件的可修改性、可测试性和可移植性。

(4)模块独立:每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。衡量度量标准有两个:模块间的耦合和模块的内聚度。要想使模块独立性强必须做到高内聚低耦合。

2)结构化设计方法

结构化设计(SD)方法是一种面向数据流的设计方法,它可以与SA方法链接。

在需求分析阶段,用SA方法产生了数据流图。面向数据流的设计能方便地将DFD转换成程序结构图。DFD中从系统的输入数据流到系统的输出数据流的一连串连续变换形成了一条信息流。DFD的信息流大体上可以分为两种类型,一种是变换流,另一种是事务流。

3)软件详细设计

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

结构化程序设计的基本要点如下。

.采用自顶向下、逐步求精的程序设计方法。

.使用顺序、选择、重复3种基本控制结构构造程序。

.主程序员组的组织形式。

处理过程设计的关键是用一种合适的表达方法来描述每个模块的执行过程。这种表示方法应该简明、精确,并因此能直接导出用编程语言表示的程序。

.程序流程图。其包括3种基本成分:加工步骤,用方框表示;逻辑条件,用菱形表示;控制流,用箭头表示。

.盒图(N-S图)。在N-S图中,每个处理步骤用一个盒子表示,盒子可以嵌套。盒子只能从上头进入,从下头走出,此外别无其他出入口,所以盒图限制了随意的控制转移,保证了程序的良好结构。

.形式语言。形式语言是用来描述模块具体算法的非正式而比较灵活的语言。形式语言的优点是接近自然语言,所以易于理解。

.决策树。决策树是一种图形工具,适合于描述加工中具有多个策略、每个策略和若干条件有关的逻辑功能。

.决策表。决策表是一种图形工具,呈表形。决策表将比较复杂的决策问题简洁地描述出来。

4)面向数据结构设计——Jackson方法

面向数据结构设计是以数据结构作为设计的基础,它根据输入输出数据结构导出程序的结构,适用于规模不大的数据处理系统,Jackson方法是一种典型的面向数据结构的设计方法。

5)用户界面设计

用户界面设计是系统与用户之间的接口,也是控制和选择信息输入输出的主要途径。用户界面设计应坚持友好、简便、实用、易于操作的原则。

界面设计包括菜单方式、会话方式、操作提示方式以及操作权限管理方式等。

模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。衡量模块独立程度的标准有两个:耦合性和内聚性。

1)耦合

耦合是模块之间的相对独立性(互相连接的紧密程度)的度量。耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型等。一般模块之间可能的耦合方式有7种类型:

无直接耦合。指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。因此,模块间耦合性最弱,模块独立性最高。

数据耦合。指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递。

标记耦合。指两个模块之间传递的是数据结构。

控制耦合。指一个模块调用另一个模块时,传递的是控制变量,被调用模块通过该控制变量的值有选择地执行模块内的某一功能。因此,被调用模块应具有多个功能,哪个功能起作用受调用模块控制。

外部耦合。模块间通过软件之外的环境联结(如I/O将模块耦合到特定的设备、格式、通信协议上)时称为外部耦合。

公共耦合。指通过一个公共数据环境相互作用的那些模块间的耦合。

内容耦合。当一个模块直接使用另一个模块的内部数据,或通过非正常入口转入另一个模块内部时,这种模块之间的耦合称为内容耦合。

2)内聚

内聚是对一个模块内部各个元素彼此结合的紧密程度的度量。一个内聚程度高的模块(在理想情况下)应当只做一件事。一般模块的内聚性分为7种类型:

偶然内聚(巧合内聚)。指一个模块内的各处理元素之间没有任何联系。

逻辑内聚。指模块内执行若干个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。

时间内聚。把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。

过程内聚。指一个模块完成多个任务,这些任务必须按指定的过程执行。

通信内聚。指模块内的所有处理元素都在同一个数据结构上操作,或者各处理使用相同的输入数据或者产生相同的输出数据。

顺序内聚。指一个模块中的各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能元素的输入。

功能内聚。这是最强的内聚,指模块内的所有元素共同作用完成一个功能,缺一不可。

耦合性和内聚性是模块独立性的两个定性标准,在将软件系统划分模块时,应尽量做到高内聚、低耦合,提高模块的独立性。

28. 在软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准,耦合程度最高的是(27)耦合;内聚程度最高的是(28)内聚。

A. 顺序

B. 功能

C. 时间

D. 逻辑

29. 采用ADSL接入Internet,用户端接入介质为(29),使用的网络为(30)。

A. 双绞线

B. 红外线

C. 同轴电缆

D. 光纤

在网络管理中,最为常用的就是net命令家族。常用的net命令有以下几个。

.net view命令:显示由指定的计算机共享的域、计算机或资源的列表。

.net share:用于管理共享资源,使网络用户可以使用某一服务器上的资源。

.net use命令:用于将计算机与共享的资源相连接或断开,或者显示关于计算机连接的信息。

.net start命令:用于启动服务,或显示已启动服务的列表。

.net stop命令:用于停止正在运行的服务。

.net user命令:可用来添加或修改计算机上的用户账户,或者显示用户账户的信息。

.net config命令:显示正在运行的可配置服务,或显示和更改服务器服务或工作站服务的设置。

.net send命令:用于将消息(可以是中文)发送到网络上的其他用户、计算机或者消息名称上。

.net localgroup命令:用于添加、显示或修改本地组。

.net accounts命令:可用来更新用户账户数据库、更改密码及所有账户的登录要求。

ADSL是一种非对称的宽带接入方式,即用户线的上行速率和下行速率不同。它采用FDM技术和DMT调制技术,在保证不影响正常电话使用的前提下,利用原有的电话双绞线进行高速数据传输。ADSL的优点是可在现有的任意双绞线上传输,误码率低,系投资少。缺点是有选线率问题,带宽速率低。

ADSL不仅继承了HDSL技术成果,而且在信号调制与编码、相位均衡及回波抵消等方面采用了更加先进的技术,性能更佳。由于ADSL的特点,ADSL主要用于Internet接入、居家购物、远程医疗等。

从实际的数据组网形式上看,ADSL所起的作用类似于窄带的拨号Modem,担负着数据的传送功能。按照OSI/RM的划分标准,ADSL的功能从理论上应该属于物理层。它主要实现信号的调制及提供接口类型等一系列底层的电气特性。同样,ADSL的宽带接入仍然遵循数据通信的对等通信原则,在用户侧对上层数据进行封装后,在网络侧的同一层上进行开封。因此,要实现ADSL的各种宽带接入,在网络侧也必须有相应的网络设备相结合。

ADSL的接入模型主要由中央交换局端模块(ATU-C)和远端用户模块(ATU-R)组成。中央交换局端模块包括中心ADSL Modem和接入多路复用系统DSLAM,远端模块由用户ADSL Modem和滤波器组成。

ADSL能够向终端用户提供1~8Mb/s的下行传输速率和512kb/s~1Mb/s的上行速率,有效传输距离在3~5km左右。

比较成熟的ADSL标准主要有两种,分别是G.DMT和G. Lite。G. DMT是全速率的ADSL标准,提供支持8Mb/s的下行速率,及1.5Mb/s的上行速率,但G.DMT要求用户端安装POTS(Plain Old Telephone Service,普通老式电话服务)分离器,比较复杂且价格昂贵。GLite是一种速度较慢的ADSL,它不需要在用户端进行线路的分离,而是电话公司的远程用户分离线路。正式称呼为ITU-T标准G-992.2的G. Lite,提供了1.5 Mb/s的下行速率和512 kb/s的上行速率。

目前,众多ADSL厂商在技术实现上,普遍将先进的ATM服务质量保证技术融入到ADSL设备中,DSLAM(ADSL的用户集中器)的ATM功能的引入,不仅提高了整个ADSL接入的总体性能,为每一用户提供了可靠的接入带宽,为ADSL星形组网方式提供了强有力的支撑,而且完成了与ATM接口的无缝互联,实现了与ATM骨干网的完美结合。

30. 采用ADSL接入Internet,用户端接入介质为(29),使用的网络为(30)。

A. 电话网

B. 电视网

C. DDN专线

D. 5G无线广域网

31. TCP/IP协议中,应用层协议数据单元为( )。

A. 消息

B. 段

C. 用户数据报

D. 帧

应用层是OSI的最高层,这一层的协议都与应用进程间的通信有关。已经定义的OSI应用层协议主要有5种:OSI的电子邮件标准(ISO 10021)叫作MOTIS,它是根据CCITT的X.400建议制定的;OSI的文件传输协议(ISO 8571和ISO 8572)叫作FTAM,这是一个适用于各种文件类型的功能很强的文件访问协议;OSI的目录服务(DS)协议来源于CCITTR X.500系列协议,提供分布式数据库功能;OSI的虚拟终端(VT)协议定义了表示实际终端抽象状态的数据结构,用于解决各种终端不兼容的问题;关于网络管理,OSI指定了公共管理协议(CMIP)和公共管理信息服务(CMIS)。

TCP/IP概述

在诸多网络互联协议中,传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol, TCP/IP)是一个使用非常普遍的网络互联标准协议。TCP/IP协议是美国国防部高级计划研究局(DARPA)为实现ARPANet(后来发展为Internet)互联网而开发的,也是很多大学及研究所多年的研究及商业化的结果。目前,众多的网络产品厂家都支持TCP/IP协议,TCP/IP事实上已成为一个工业标准。

TCP/IP协议是计算机网络互联中使用最广泛的协议,它规定了计算机之间互相通信的方法。TCP/IP是为了使接入因特网的异种网络、不同网络设备之间能够进行正常的数据通信,而预先制订的一簇大家共同遵守的格式和约定。

TCP/IP协议簇包括TCP、IP、UDP、ICMP、RIP、Telnet、FTP、SMTP和ARP等许多协议,对因特网中主机寻址方式、主机的命名机制、信息的传输规则以及各种各样的服务功能均做了详细约定。

TCP/IP协议的结构

TCP/IP也是一个分层结构,TCP/IP分为4层,由下到上分别是网络接口层、网络层、传输层和应用层。

1)网络接口层

网络接口层是TCP/IP软件的最底层,负责接收IP数据报并通过网络将其发送,或者从网络上接收物理帧,抽出IP数据报交给IP层。

一般情况下,各物理网络可以使用自己的数据链路层协议和物理层协议,不需要在数据链路层上设置专门的TCP/IP协议。但是,当使用串行线路连接主机与网络,或连接网络与网络时(如用户使用电话线和Modem接入因特网或两个相距较远的网络通过数据专线互联时),则需要在数据链路层运行专门的SLIP(Serial Line IP)协议的PPP(Point to Point Protocol)协议。

SLIP协议提供在串行通信线路上封装IP分组的简单方法,使远程用户能通过电话线和Modem方便地接入TCP/IP网络。

SLIP是一种简单的组帧方式,使用时还存在一些问题。首先,SLIP不支持在连接过程中的动态IP地址分配,通信双方必须事先告知对方IP地址,这给没有固定IP地址的个人用户上Internet带来了很大的不便;其次,SLIP帧中无协议类型字段,因此它只能支持IP协议;再有,SLIP帧中无校验字段,因此链路层上无法检测出传输差错,必须由上层实体或具有纠错能力的Modem来解决传输差错问题。

为了解决SLIP协议存在的问题,在串行通信应用中又开发了PPP协议。PPP协议是一种有效的点一点通信协议,它由串行通信线路上的组帧方式,用于建立、配置、测试和拆除数据链路的链路控制协议(LCP)及一组用以支持不同网络层协议的网络控制协议(Network Control Protocol, NCP)3部分组成。

由于PPP帧中设置了校验字段,因而PPP在链路层上具有差错检验的功能。PPP中的LCP协议提供了通信双方进行参数协商的手段,并且提供了一组NCPs协议,使得PPP可以支持多种网络层协议,如IP、IPX、OSI等。另外,支持IP的NCP提供了在建立连接时动态分配IP地址的功能,从而解决了个人用户上Internet的问题。

2)网络层

网络层中含有4个重要协议,即网际协议(IP)、网际控制报文协议(ICMP)、地址解析协议(Address Resolution Protocol, ARP)和反向地址解析协议(RARP)。

网络层的功能主要由IP协议提供。除了提供端到端的分组分发功能外,IP协议还提供了很多扩充功能。例如,为了克服数据链路层对帧大小的限制,网络层提供了数据分块和重组功能,这使得很大的IP数据报能以较小的分组在网上传输。

网络层的另一个重要服务是在互相独立的局域网上建立互联网络,即网际网。网间的报文来往根据其目的IP地址通过路由器传到另一网络。

(1)网际协议(IP)。

网络层最重要的协议是网际协议(IP),它将多个网络连成一个互联网,可以把高层的数据以多个数据报的形式通过互联网分发出去。

IP协议的基本任务是通过互联网传送数据报,各个IP数据报之间是相互独立的。主机上的IP层向运输层提供服务。IP从源运输实体取得数据,通过它的数据链路层服务传给目的主机的IP层。IP协议不保证服务的可靠性,在主机资源不足的情况下,它可能丢弃某些数据报,同时IP协议也不检查被数据链路层丢弃的报文。

在传送时,高层协议将数据传送给IP协议,IP协议再将数据封装为IP数据报,并交给数据链路层协议通过局域网传送。若目的主机直接连在本网中,IP可直接通过网络将数据报传给目的主机;若目的主机在远程网络中,则IP路由器传送数据报,而路由器则依次通过下一网络将数据报传送到目的主机或再下一个路由器。也即一个IP数据报是通过互联网络,从一个IP模块传到另一个IP模块,直到目的主机为止。

需要连接独立管理的网络路由器,可以选择它所需的任何协议,这样的协议称为内部网关协议(Interior Gateway Protocol, IGP)。在IP环境中,一个独立管理的系统称为自治系统。

跨越不同管理域的路由器(如从专用网到PDN)所使用的协议,称为外部网关协议(Exterior Gateway Protocol, EGP),EGP是一组简单的定义完备的正式协议。

从IP协议的功能可以知道,IP提供的是一种不可靠的无连接的报文分组传送服务。若路由器或交换机故障使网络阻塞,就需要通知发送主机采取相应措施。

(2)网际控制报文协议(ICMP)。

为了使互联网能报告差错,或提供有关意外情况的信息,在IP层加入了一类特殊用途的报文机制,即网际控制报文协议(Internet Control Message Protocol, ICMP)。ICMP是IP正式协议的一部分,ICMP数据报通过IP送出,因此它在功能上属于网络第三层。

分组接收方利用ICMP来通知IP模块,发送某些方面所需的修改。ICMP通常是由发现别的站发来的报文有问题的站产生的。例如,可由目的主机或中继路由器来发现问题并产生有关的ICMP数据报。如果一个分组不能传送,ICMP便可以被用来报告分组源,说明有网络、主机或端口不可达。ICMP也可以用来报告网络阻塞。

(3)地址解析协议(ARP)。

在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在国际范围内标识主机的一种逻辑地址。为了能让报文在物理网上传送,必须要知道彼此的物理地址。这样,就存在把互联网地址变换为物理地址的地址转换问题。以以太网(Ethernet)环境为例,为了正确地向目的站传送报文,必须把目的站的32位IP地址转换成48位以太网目的地址(DA)。这就需要在网络层有一组协议将IP地址转换为相应物理网络地址,这组协议就是ARP。

在进行报文发送时,如果源网络层给的报文只有IP地址,而没有对应的以太网地址,则网络层广播ARP请求以获取目的站信息,而目的站必须回答该ARP请求。这样源站点可以收到以太网48位地址,并将地址放入相应的高速缓存(Cache)。下一次源站点对同一目的站点的地址转换可直接引用高速缓存中的地址内容。地址转换协议使主机可以找出同一物理网络中任一个物理主机的物理地址,只需给出目的主机的IP地址即可。这样,网络的物理编址可以对网络层服务透明。

在互联网环境下,为了将报文送到另一个网络的主机,数据报需先确定发送方所在网络的路由器。因此,发送主机首先必须确定路由器的物理地址,然后依次将数据发往接收端。除基本ARP机制外,有时还需在路由器上设置代理ARP,其目的是由IP路由器代替目的站对发送方ARP请求作出响应。

(4)反向地址解析协议(RARP)。

反向地址解析协议(Reverse Address Resolution Protocol, RARP)用于一种特殊情况,如果站点初始化以后,只有自己的物理地址而没有IP地址,则它可以通过RARP协议,发出广播请求,征求自己的IP地址,而RARP服务器则负责回答。这样,无IP地址的站点可以通过RARP协议取得自己的IP地址,这个地址在下一次系统重新开始以前都有效,不用连续广播请求。RARP广泛用于获取无盘工作站的IP地址。

3)传输层

传输层的功能是提供应用程序间的通信。其功能包括格式化信息流和提供可靠传输。为实现可靠性传输,传输层协议规定接收端必须发回确认信息,并且假如分组丢失,必须重新发送从而保证可靠传输。

TCP/IP在传输层提供了两个主要的协议,即传输控制协议(Transfer Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)。另外,还有其他一些协议,如用于传送数字化语音的NVP协议。

TCP协议提供的是一种可靠的数据流服务。当传送受差错干扰的数据,或基础网络故障,或网络负荷太重而使网际基本传输系统(无连接报文递交系统)不能正常工作时,就需要通过其他协议来保证通信的可靠。TCP就是这样的协议,它对应于OSI模型的运输层,在IP协议的基础上,提供端到端的面向连接的可靠传输。

TCP采用"带重传的肯定确认"技术来实现传输的可靠性。简单的"带重传的肯定确认"是指与发送方通信的接收者,每接收一次数据,就送回一个确认报文,发送者对每个发出去的报文都留一份记录,等收到确认信息之后再发出下一报文分组。发送者发出一个报文分组时,启动一个计时器,若计时器计数完毕,确认信息还未到达,则发送者重新发送该报文分组。

简单的确认重传严重浪费带宽,TCP还采用一种叫"滑动窗口"的流量控制机制来提高网络的吞吐量,窗口的范围决定了发送方发送的但未被接收方确认的数据报的数量。每当接收方正确收到一则报文时,窗口便向前滑动,这种机制决定了发送方发送的但未被接收方确认的数据报的数量,从而提高了网络的吞吐量。

TCP通信建立在面向连接的基础上,实现了一种"虚电路"的概念。双方通信之前,先建立一条连接,然后双方就可以在其上发送数据流。这种数据交换方式能提高效率,但事先建立连接和事后拆除连接需要开销。TCP连接的建立采用三次握手,整个过程由以下3个环节组成。一是初始化主机通过一个同步比特SYN置位(即SYN=1)的数据段发出会话请求。二是接收主机通过发回具有以下项目的数据段表示回复:同步比特SYN置位(即SYN=1)、即将发送的数据段的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。三是请求主机再回送一个数据段,并带有确认顺序号和确认号。

用户数据报协议(UDP)是对IP协议簇的扩充,它增加了一种机制,发送方使用这种机制可以区分一台计算机上的多个接收者。每个UDP报文除了包含某用户进程发送的数据外,还包含报文目的端口的编号和报文源端口的编号。UDP的这种扩充使得在两个用户进程之间传送数据报成为可能。

UDP协议是依靠IP协议来传送报文的,因而它的服务和IP一样,是不可靠的。这种服务不能确认,不对报文排序,也不进行流量控制,UDP报文可能会出现丢失、重复、失序等现象。

4)应用层

应用层的功能是向用户提供一组常用的应用程序,如电子邮件、文件传输访问、远程登录等。远程登录使用Telnet协议提供了在其他网络主机上注册的接口,Telnet会话提供了基于字符的虚拟终端。文件传输协议(FTP)可以提供网络内机器间的文件复制功能。

文件传输协议是互联网提供的用于访问远程机器的一个协议,它使用户可以在本地机与远程机之间进行有关文件的操作。FTP工作时建立两条TCP连接:一条用于传送文件;另一条用于传送控制。

FTP采用客户机/服务器模式,它包含客户FTP和服务器FTP。客户FTP启动传送过程,而服务器对其作出应答。客户FTP大多有一个交互式界面,具有访问权限的客户可以灵活地向远地传文件或从远地取文件。

Telnet的连接是一个TCP连接,用于传送具有Telnet控制信息的数据。它提供了与终端设备或终端进程交互的标准方法,支持终端到终端的连接及进程到进程分布式计算的通信。

DNS是一个域名服务的协议,提供域名到IP地址的转换,允许对域名资源进行分散管理。DNS最初设计的目的是使邮件发送方知道邮件接收主机及邮件发送主机的IP地址,后来发展成为可服务于其他许多目标的协议。

互联网标准中的电子邮件协议是一个简单的基于文件的协议,用于可靠、有效的数据传输。SMTP作为应用层的服务,并不关心它下面采用的是何种传输服务,它可通过网络在TCP连接上传送邮件,或者简单地在同一机器的进程之间通过进程通信的通道来传送邮件。这样,邮件传输就独立于传输子系统,可在TCP/IP环境、OSI的传输层或X.25协议环境中传输邮件。

邮件发送之前必须协商好发送者、接收者。在邮件传输过程中,所经过的路由被记录下来。这样,当邮件不能正常传输时可按原路由找到发送者。

在当前的UNIX版本中,已将TCP/IP协议融入其中,使之成为UNIX操作系统的一部分。DOS上也推出了相应的TCP/IP软件产品。Sun公司则将TCP/IP广泛推向商务系统,它在所在的工作站系统中都预先安装了TCP/IP网络软件及网络硬件,使网络和计算机成为一体,同时也使TCP/IP网络软件及其客户机/服务器的工作方式为广大用户所接受。

TCP/IP与OSI RM的关系

TCP/IP的应用层对应着OSI模型的会话层、表示层和应用层,TCP/IP的网络接口层对应着OSI模型的物理层和数据链路层,而TCP/IP的传输层、网络层与OSI的传输层、网络层分别对应。

IP数据包的格式

一个IP数据包由首部和数据两部分组成。首部由固定20B的基本首部和0~40B可变长度的任选项组成。其中首部字段主要包括版本号、首部长度、服务类型、数据包长度、标识、标志、数据块偏移值、生存期、协议号、首部校验和以及地址等。

栈的定义

栈是只能在表的一端进行插入、删除的线性表。栈中允许插入、删除的一端称为栈顶,相反,栈中不允许插入、删除的一端称为栈底。处于栈顶位置的数据元素称为栈顶元素,不含任何数据元素的栈称为空栈。栈的特点为后进先出(Last In First Out, LIFO)。

下图是一个栈的示意图,通常用指针top指示栈顶的位置,用指针bottom指向桟底。栈顶指针top动态反映栈的当前位置。

栈的出入示意图

栈的基本操作

栈的基本操作主要有以下6种。

.InitStack(&S):初始化操作,构造一个空栈S。

.StackEmpty(S):若栈S为空栈,返回1,否则返回0。

.Push(&S, e):插入元素e为新的栈顶元素。

.Pop(&S,&e):删除S的栈顶元素,并用e返回其值。

.GetTop(S,&e):用e返回S的栈顶元素。

.ClearStack(&S):将S清为空栈。

栈的顺序存储结构

栈的顺序存储用向量作为栈的存储结构,向量S表示栈,m表示栈的大小,用指针top指向栈顶位置,S[top]表示栈顶元素,当在栈中进行插入、删除操作时,都要移动栈指针;而当top=m-1时,则栈满,当top=-1时,表示栈空。同时为了避免浪费空间可以采用双栈机制,即向量的两端为栈底。

栈的顺序存储结构的C语言描述如下:

栈的说明如下。

.由于C语言的数组下标的范围从0至StackSize-1,初始化设置sq.top=-1。

.栈空条件为sq.top=-1,栈满条件为sq.top=StackSize-1。

.栈顶元素为sq.data[sq.top]。

.元素压栈的规则为:在栈不满时,先改变栈顶指针(top=top+1),再压栈。出栈时,在桟非空时,先取栈顶元素的值,再修改栈顶指针(top=top-1)。

.栈中元素的个数为当前栈顶指针加1。

在顺序栈上实现基本操作的有关函数如下。

1)初始化InitStack(SqStack *S)

2)判空StackEmpty(SqStack S)

3)压栈Push(SqStack *S, ElemType e)

4)出栈Pop(SqStack *S, ElemType *e)

5)取栈顶GetTop(SqStack *S, ElemType*e)

6)清栈ClearStack(SqStack *S)

栈的链式存储结构

栈的链式存储也叫链栈,我们把插入和删除均在链表表头进行的链表称为链栈。链栈也分有头节点和无头节点两种。带头节点的链栈操作比较方便。

链栈的节点类型定义如下:

链栈的约定与说明如下。

.栈以链表的形式出现,链表(不带头节点)首指针为S,即栈顶为S,链表尾节点为栈底。

.初始化时,S=NULL(不带头节点);S=(LStack *),malloc(sizeof(LStack)),S→next=NULL(带头节点)。

.栈顶指针的引用为S(不带头节点)或S→next(带头节点),栈顶元素的引用为S→data(不带头节点)或S→next→data(带头节点)。

.栈空条件为S==NULL(不带头节点)或S→next=NULL(带头节点)。

.进栈操作和出栈操作与单链表在开始节点的插入和删除操作一致。

对不带头节点的链栈,其基本操作函数如下。

1)初始化initstack(LStack *S)

2)压栈(入栈)push(LStack *S, ElemType x)

3)退栈(出栈)pop(LStack *S, ElemType *x)

4)读栈顶元素gettop(LStack *S, ElemType *x)

5)判栈空isempty(LStack *S)

栈的应用

栈具有广泛的应用,例如,求表达式的值及递归到非递归等。

1)表达式求值

在源程序编译中,若要把一个含有表达式的赋值语句翻译成正确求值的机器语言,首先应正确地解释表达式。例如,对赋值语句X=4+8×2-3;,其正确的计算结果应该是17,但若在编译程序中简单地按自左向右扫描的原则进行计算,则为:X=12×2-3=24-3=21。这个结果显然是错误的。因此,为了使编译程序能够正确地求值,必须事先规定求值的顺序和规则。通常采用运算符优先法。

2)递归到非递归

将一个递归算法转换为功能等价的非递归算法有很多方法,可以使用栈保存中间结果。其一般形式如下:

例如,求n!的递归函数如下:

使用转换成等价的非递归算法如下:

其中,st[top][0]用于存放n值,st[top][1]用于存放n!值,在初始时,设置st[top][1]为0,表不n!尚未求出。

由于OSI协议的实现较为复杂,运行效率低,很少有厂商推出符合OSI标准的商用产品。目前,互联网上广泛使用的是TCP/IP。TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网络协议)是Internet上不同子网之间的主机进行数据交换所遵守的网络通信协议。TCP/IP一般泛指所有与Internet有关的一系列网络协议的总称,其中TCP和IP是其中最重要的两个协议。TCP/IP体系结构主要由四层构成,分别为网络接口层、网络层、传输层和应用层。

TCP/IP采用的四层体系结构与OSI参考模型采用的七层体系结构是对应的,它们的结构对比如下图所示。

TCP/IP与OSI体系结构的对比

网络接口层

网络接口层也称链路层(Link Layer)或数据链路层,相当于OSI/RM参考模型的第1层和第2层,负责与网络中的传输介质打交道。常用的链路层技术主要有以太网(Ethernet)、令牌环(Token Ring)、光纤数据分布接口(FDDI)、X.25、帧中继(Frame Relay)、ATM等。

网络层

网络层的作用是将数据包从源主机发送出去,并且使这些数据包独立地到达目标主机。数据包传送过程中,到达目标主机的顺序可能不同于它们被发送时的顺序。因为网络情况复杂,随时可能有一些路径发生故障或是网络中的某处出现数据包的堵塞。网络层提供的服务是不可靠的,可靠性由传输层实现。

传输层

传输层提供应用程序之间的通信。传输层提供了可靠的传输协议TCP和不可靠的传输协议UDP。TCP是一个可靠的、面向连接的协议,允许在因特网上的两台主机之间进行信息的无差错传输。在网络传输过程中,为了保证数据在网络中传输的正确、有序,要使用“连接”的概念,一个TCP连接是指在传输数据前先要传送三次握手信号,以使双方为数据的传送做准备。UDP是用户数据报协议,使用此协议时,源主机一有数据就发送出去,不管发送的数据包是否能到达目标主机、数据包是否会出错,收到数据包的主机都不会通知发送方其是否正确地收到了数据,因此UDP是一种不可靠的传输协议。

应用层

应用层直接为用户的应用进程提供服务,如支持万维网应用的HTTP,支持电子邮件的SMTP,支持文件传送的FTP等。

IP层接收由网络接口层发送来的数据包,并把该数据包发送到更高层——TCP或UDP层;相反,IP层也把从TCP或UDP层发送来的数据包传送到更低层——网络接口层。IP数据包是不可靠的,因为IP并没有做任何事情确认数据包是否按顺序发送或者被破坏,IP数据包中含有发送它的主机地址(源地址)和接收它的主机地址(目的地址)。

高层的TCP和UDP服务在接收数据包时通常假设包中的源地址是有效的,即IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送过来的。IP确认包含一个选项,称为IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明它可以被用来欺骗系统以进行通常被禁止的连接,因此,许多依靠IP源地址进行确认的服务将产生问题,甚至会被非法入侵。

TCP是面向连接的通信协议,通过三次握手建立连接,通信完成时要拆除连接,由于TCP是面向连接的,所以只能用于端到端的通信。

TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口,实际表示接收能力,用以限制发送方的发送速度。

如果IP数据包中有已经封装好的TCP数据包,那么IP将把它们向“上”传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路之间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包则可以被重传。

TCP将它的信息发送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层、设备驱动程序和物理介质,最后传送到接收方。

面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

TCP/IP的应用层大致对应于OSI模型的应用层和表示层,应用程序通过本层协议利用网络。这些协议主要有FTP、TFTP、HTTP、SMTP、DHCP、NFS、Telnet、DNS和SNMP等。

文件传输协议(File Transport Protocol,FTP)是网络上两台计算机传送文件的协议,是通过Internet把文件从客户端复制到服务器上的一种途径。

简单文件传输协议(Trivial File Transfer Protocol,TFTP)是用来在客户端与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。TFTP协议设计的时候是进行小文件传输的,因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,也不进行认证。它传输8位数据。

超文本传输协议(Hypertext Transfer Protocol,HTTP)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示等。

简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一种提供可靠且有效的电子邮件传输的协议。SMTP是建模在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。

动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)分为两个部分,一个是服务器端,另一个是客户端。所有的IP网络设定数据都由DHCP服务器集中管理,并负责处理客户端的DHCP要求;而客户端则会使用从服务器分配下来的IP环境数据。DHCP透过“租约”的概念,有效且动态地分配客户端的TCP/IP设定。DHCP分配的IP地址可以分为三种方式,分别是固定分配、动态分配和自动分配。

网络文件系统(Net File System,NFS)是FreeBSD支持的文件系统中的一种,允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。

远程登录协议(Telnet)是登录和仿真程序,它的基本功能是允许用户登录进入远程主机系统。以前,Telnet是一个将所有用户输入送到远方主机进行处理的简单的终端程序。它的一些较新的版本在本地执行更多的处理,于是可以提供更好的响应,并且减少了通过链路发送到远程主机的信息数量。

域名系统(Domain Name System,DNS)用于命名组织到域层次结构中的计算机和网络服务。在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。DNS通过对用户友好的名称查找计算机和服务。当用户在应用程序中输入DNS名称时,DNS服务可以将此名称解析为与之相关的其他信息,如IP地址。

简单网络管理协议(Simple Network Management Protocol,SNMP)是为了解决Internet上的路由器管理问题而提出的,它可以在IP、IPX、AppleTalk、OSI及其他用到的传输协议上被使用。SNMP事实上指一系列网络管理规范的集合,包括协议本身、数据结构的定义和一些相关概念。目前SNMP已成为网络管理领域中事实上的工业标准,并被广泛支持和应用,大多数网络管理系统和平台都是基于SNMP的。

32. Telnet 服务的默认端口号是( )。

A. 20

B. 21

C. 22

D. 23

在网络管理中,最为常用的就是net命令家族。常用的net命令有以下几个。

.net view命令:显示由指定的计算机共享的域、计算机或资源的列表。

.net share:用于管理共享资源,使网络用户可以使用某一服务器上的资源。

.net use命令:用于将计算机与共享的资源相连接或断开,或者显示关于计算机连接的信息。

.net start命令:用于启动服务,或显示已启动服务的列表。

.net stop命令:用于停止正在运行的服务。

.net user命令:可用来添加或修改计算机上的用户账户,或者显示用户账户的信息。

.net config命令:显示正在运行的可配置服务,或显示和更改服务器服务或工作站服务的设置。

.net send命令:用于将消息(可以是中文)发送到网络上的其他用户、计算机或者消息名称上。

.net localgroup命令:用于添加、显示或修改本地组。

.net accounts命令:可用来更新用户账户数据库、更改密码及所有账户的登录要求。

在TCP/IP网络中,传输层的所有服务都包含端口号,它们可以唯一区分每个数据包包含哪些应用协议。端口系统利用这种信息来区分包中的数据,尤其是端口号使一个接收端计算机系统能够确定它所收到的IP包类型,并把它交给合适的高层软件。

端口号和设备IP地址的组合通常称作插口(socket)。任何TCP/IP实现所提供的服务都用知名的1~1023之间的端口号。这些知名端口号由Internet号分配机构(Internet Assigned Numbers Authority,IANA)来管理。例如,SMTP所用的TCP端口号是25,POP3所用的TCP端口号是110,DNS所用的UDP端口号为53,WWW服务使用的TCP端口号为80。FTP在客户与服务器的内部建立两条TCP连接,一条是控制连接,端口号为21;另一条是数据连接,端口号为20。

256~1023之间的端口号通常由Unix系统占用,以提供一些特定的UNIX服务。也就是说,提供一些只有UNIX系统才有的、其他操作系统可能不提供的服务。

在实际应用中,用户可以改变服务器上各种服务的保留端口号,但要注意,在需要服务的客户端也要改为同一端口号。

33. 关系型数据库是(33)的集合,表是(34)的集合。

A. 表

B. 记录

C. 码

D. 属性

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

34. 关系型数据库是(33)的集合,表是(34)的集合。

A. 约束

B. 记录

C. 吗

D. 索引

35. 属性指的是表中的一个( )。

A. 记录

B. 列

C. 元组

D. 码

36. 对于两个关系E和F,( )的运算结果的任一 元组, 同时属于E和F。

A. E×F

B. EUF

C. E∩F

D. E-F

37. 在一个关系表中,各表的行代表( )。

A. 关系

B. 外码

C. 元组

D. 属性

38. 关系的完整性约束不包含( )。

A. 实体完整性

B. 参照完整性

C. 属性完整性

D. 用户定义完整性

数据库的完整性是指数据的正确性和相容性。数据库是否具备完整性关系到数据库系统能否真实地反映现实世界,因此维护数据库的完整性是非常重要的。

数据库的完整性可分为实体完整性、参照完整性和用户定义的完整性。

实体完整性

实体完整性是基于主码的,一个主码由一个或多个属性组成。实体完整性要求主码中的任一属性(列)不能为空,所谓空值是“不知道”或“无意义”的值。之所以要保证实体完整性,主要是因为在关系中每一个元组的区分是依据主码值的不同,若主码值取空值,则不能标明该元组的存在。

参照完整性

参照完整性是基于外码的,若基本关系R中含有与另一基本关系S的主码PK相对应的属性组FK(FK称为R的外码),则参照完整性要求对R中的每个元组在FK上的值必须是S中某个元组的PK值,或者为空值。

参照完整性的合理性在于R中的外码只能引用S中的主码,不能是S中主码没有的值。如学生和选课表两关系,选课表中的学号是外码,它是学生表的主键,若选课表中出现了某个学生表中没有的学号,即某个学生还没有注册,却已有了选课记录,这显然是不合理的。

对于参照完整性,需要明确以下问题:

(1)外码能否接受空值问题根据实际应用决定。

(2)在被参照关系中删除元组的问题。

.级联删除:将参照关系中所有外码值与被参照关系中要删除元组主码值相同的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去。

.受限删除(一般系统默认):仅当参照关系中没有任何元组的外码值与被参照关系中要删除元组的主码值相同时,系统才可以执行删除操作,否则拒绝执行删除操作。

.置空删除:删除被参照关系的元组,并将参照关系中相应元组的外码值置为空值。

(3)在参照关系中插入元组的问题。

.受限插入:仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。

.递归插入:首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。

用户定义的完整性

实体完整性和参照完整性适用于任何关系数据库系统。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

如果在一条语句执行完后立即检查,则称立即执行约束;如果在整个事务执行结束后再进行检查,则称延迟执行约束。

触发器

触发器(Trigger)是在关系数据库管理系统中应用得比较多的一种完整性保护措施。触发器的功能一般比完整性约束要强得多。一般而言,在完整性约束功能中,当系统检查出数据中有违反完整性约束条件时,仅给出必要提示以通知用户,仅此而已。而触发器的功能则不仅仅起提示作用,它还会引起系统内自动进行某些操作以消除违反完整性约束条件所引起的负面影响。

在目前数据库中事件一般表示为数据的插入、修改、删除等操作。触发器除了有完整性保护功能外,还有安全性保护功能。

非空约束

非空是一个规则,是对声明了非空约束的字段限制其取值域不能为空。它不允许在对一列的数据插入或更新时取NULL值。在默认情况下,所有的列都是允许填充NULL值的,只有在列声明了NOT NULL的列值或其他已经包含了NOT NULL约束的列值时,系统强制要求任何时候都不能填充NULL值。非空约束通常会包含在相关的其他约束上,如主键约束、候选键约束等。因为索引是不对NULL值进行存储的,所以,如果希望使用索引进行表数据的查询,那么必须尽量地使某个要索引的列不包含NULL值。例如,下面语句对emp表的ename字段声明了非空约束。

对于表emp,如果已经有了数据,而且ename列中已存在NULL值,则该操作将被禁止。只要将空值替换或将对应的行删除,该语句还是可以被允许的。当然,对于不明确的列但又不能为空时,可以使用默认值(default)对列值做默认处理,这样也可以远离NULL值对列的影响。

CHECK约束

相对于非空约束,CHECK约束能更灵活地限制某字段取值的值域。客观地说,非空约束只是CHECK约束的一个特例而已。CHECK约束需要设计一个表达式,某条记录的某(些)字段的值如果使这个表达式为假,则这条记录被禁止;反之则被允许。如果定义一个CHECK约束设计一个字段不为空的表达式,那么效果就跟非空约束一样了。CHECK约束设计的表达式具体应用到某条将要进行操作的记录的某(些)字段时,只有三个值——true、false、unknown,表达式值为false时将要进行的操作被禁止,其他的则允许。在CHECK约束的表达式中有如下要求:

(1)该表达式在使用数据插入或更新操作的值时,必须是可以做出逻辑判断的表达式。

(2)该表达式不可以使用嵌套查询和序列器。

(3)该表达式不可以使用SQL函数。

(4)该表达式不可以使用自定义函数。

(5)该表达式不可以使用DBMS的伪字段(比如Oracle中的rownum、level等)。

下面语句说明如何在创建表的语句中声明CHECK约束。

该语句为表Dept_tab中的Loc字段声明了名为Loc_check1的CHECK约束,这个约束要求Loc字段只能填写北京、上海、广州中的一个,否则操作将被禁止。

主键约束

主键是能唯一标识元组的最小属性集,并且是在数据库中被标记为primary key的属性集。如果某个表的某(些)字段声明为主键,那么这些字段就要遵守如下两条规则。

(1)在这些作为主键的字段中任何字段任何行都不能为空。

(2)在这些作为主键的字段中任何两行之间的组合取值不能重复。

下面语句是在创建表的语句中声明了主键约束。

该语句在表dept中声明了字段deptno为该表的主键,这个主键约束并未命名,它的名称可以由系统自动产生。再看下面的语句:

该语句在表emp中声明了字段empno为主键,同时命名该主键约束为epk。

候选键约束

能唯一标识元组的最小属性集,但在数据库中未被标记为PRIMARY KEY,这样的属性集称为候选键。这里的候选键实质就是唯一性约束。它的规则要求与主键的规则要求一样,只是未被声明为主键而已。标准SQL并没有直接定义候选键,候选键取值不能为空和不取重复值的约束可以通过UNIQUE NOT NULL来实现,也可以通过UNIQUE KEY来实现,具体要根据不同的DBMS而定。下列语句在创建表中声明了候选键约束。

该语句为表emp的empno字段声明了一个叫euk的唯一性约束。

外键约束

外键是指在关系模式R中作为候选键的属性集,但在关系模式T中不是候选键。则对于T来说,这些属性集称为相对于R的外键。通常外键在数据库中会被标记为FOREIGN KEY字样。在这里,称R为父模式,T为子模式。通俗地说,就是父表中的主键字段被子表中某个字段引用,那么子表的这个字段则应声明为外键,而父表的那个字段可以声明为主键,也可以声明为唯一键(候选键)。一旦子表的字段被声明为父表的外键,同样的一个字段在父表中称为引用的父键,在子表中称为引用的子键。子键的取值应遵守如下规则,否则将被禁止。

(1)每个子键的取值不能取父键中取值以外的值,但空除外。

(2)对于父键是组合字段的,子键也应是组合字段。父键要求能唯一地标识父表的每一条记录,而子键不要求能唯一标识子表的每一条记录。

(3)对于组合键,子键为空时,所有键的成员字段都为空,不允许部分为空。

一个子表可以有多个子键,每个子键可以对应不同父表的父键。如果是组合键,那么同一个字段可能作为不同外键的成员。当然,子表和父表是相对的,子表如果有唯一键被其他表引用,那么这时的子表对于其他表关于某键,它又是父表。外键的引入,主要是为了表示表间的一对多问题。下面的语句说明了两个表间的外键引用情况。

这两条语句创建了dept和emp两个表,其中dept表中的deptno是它的主键,它被表emp引用。在emp中也有个同样名字的deptno字段,这个字段被声明为引用dept.deptno字段的外键。那么dept表是父表,deptno构成了引用中父表的父键;emp表是子表,deptno构成了引用中子表的子键。

因为外键是引用父表父键的子表的子键,所以父表的数据是引用的基础。一旦父表数据被修改或删除,引用也会造成相关的影响,表现在子表和子键上,这就需要做出相应的规则来约定父表父键发生改动后子表子键如何来进行维护活动。根据这种活动,将子表的外键分为三大类。

(1)禁止更新和删除父键,许多DBMS默认为这一类外键约束。一旦父表的父键被某个子表的子键引用了,那么父表中已有的数据是禁止修改和删除的。

(2)删除或更新父表数据的同时删除或更新子表子键中对应父键取值的行。

(3)删除或更新父表数据的同时将子表中对应父键的子键的取值设置为NULL。

加入这三种外键约束声明的语句可以如下所示:

该语句说明外键deptno默认为第一类。

该语句声明一个第二类的外键。

该语句声明一个第三类的外键。

39. 在一个关系型数据库中,参照完整性约束可以通过( )来实现。

A. 主码

B. 候选码

C. 外码

D. 锁

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

数据库的完整性是指数据的正确性和相容性。数据库是否具备完整性关系到数据库系统能否真实地反映现实世界,因此维护数据库的完整性是非常重要的。

数据库的完整性可分为实体完整性、参照完整性和用户定义的完整性。

实体完整性

实体完整性是基于主码的,一个主码由一个或多个属性组成。实体完整性要求主码中的任一属性(列)不能为空,所谓空值是“不知道”或“无意义”的值。之所以要保证实体完整性,主要是因为在关系中每一个元组的区分是依据主码值的不同,若主码值取空值,则不能标明该元组的存在。

参照完整性

参照完整性是基于外码的,若基本关系R中含有与另一基本关系S的主码PK相对应的属性组FK(FK称为R的外码),则参照完整性要求对R中的每个元组在FK上的值必须是S中某个元组的PK值,或者为空值。

参照完整性的合理性在于R中的外码只能引用S中的主码,不能是S中主码没有的值。如学生和选课表两关系,选课表中的学号是外码,它是学生表的主键,若选课表中出现了某个学生表中没有的学号,即某个学生还没有注册,却已有了选课记录,这显然是不合理的。

对于参照完整性,需要明确以下问题:

(1)外码能否接受空值问题根据实际应用决定。

(2)在被参照关系中删除元组的问题。

.级联删除:将参照关系中所有外码值与被参照关系中要删除元组主码值相同的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去。

.受限删除(一般系统默认):仅当参照关系中没有任何元组的外码值与被参照关系中要删除元组的主码值相同时,系统才可以执行删除操作,否则拒绝执行删除操作。

.置空删除:删除被参照关系的元组,并将参照关系中相应元组的外码值置为空值。

(3)在参照关系中插入元组的问题。

.受限插入:仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。

.递归插入:首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。

用户定义的完整性

实体完整性和参照完整性适用于任何关系数据库系统。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

如果在一条语句执行完后立即检查,则称立即执行约束;如果在整个事务执行结束后再进行检查,则称延迟执行约束。

触发器

触发器(Trigger)是在关系数据库管理系统中应用得比较多的一种完整性保护措施。触发器的功能一般比完整性约束要强得多。一般而言,在完整性约束功能中,当系统检查出数据中有违反完整性约束条件时,仅给出必要提示以通知用户,仅此而已。而触发器的功能则不仅仅起提示作用,它还会引起系统内自动进行某些操作以消除违反完整性约束条件所引起的负面影响。

在目前数据库中事件一般表示为数据的插入、修改、删除等操作。触发器除了有完整性保护功能外,还有安全性保护功能。

非空约束

非空是一个规则,是对声明了非空约束的字段限制其取值域不能为空。它不允许在对一列的数据插入或更新时取NULL值。在默认情况下,所有的列都是允许填充NULL值的,只有在列声明了NOT NULL的列值或其他已经包含了NOT NULL约束的列值时,系统强制要求任何时候都不能填充NULL值。非空约束通常会包含在相关的其他约束上,如主键约束、候选键约束等。因为索引是不对NULL值进行存储的,所以,如果希望使用索引进行表数据的查询,那么必须尽量地使某个要索引的列不包含NULL值。例如,下面语句对emp表的ename字段声明了非空约束。

对于表emp,如果已经有了数据,而且ename列中已存在NULL值,则该操作将被禁止。只要将空值替换或将对应的行删除,该语句还是可以被允许的。当然,对于不明确的列但又不能为空时,可以使用默认值(default)对列值做默认处理,这样也可以远离NULL值对列的影响。

CHECK约束

相对于非空约束,CHECK约束能更灵活地限制某字段取值的值域。客观地说,非空约束只是CHECK约束的一个特例而已。CHECK约束需要设计一个表达式,某条记录的某(些)字段的值如果使这个表达式为假,则这条记录被禁止;反之则被允许。如果定义一个CHECK约束设计一个字段不为空的表达式,那么效果就跟非空约束一样了。CHECK约束设计的表达式具体应用到某条将要进行操作的记录的某(些)字段时,只有三个值——true、false、unknown,表达式值为false时将要进行的操作被禁止,其他的则允许。在CHECK约束的表达式中有如下要求:

(1)该表达式在使用数据插入或更新操作的值时,必须是可以做出逻辑判断的表达式。

(2)该表达式不可以使用嵌套查询和序列器。

(3)该表达式不可以使用SQL函数。

(4)该表达式不可以使用自定义函数。

(5)该表达式不可以使用DBMS的伪字段(比如Oracle中的rownum、level等)。

下面语句说明如何在创建表的语句中声明CHECK约束。

该语句为表Dept_tab中的Loc字段声明了名为Loc_check1的CHECK约束,这个约束要求Loc字段只能填写北京、上海、广州中的一个,否则操作将被禁止。

主键约束

主键是能唯一标识元组的最小属性集,并且是在数据库中被标记为primary key的属性集。如果某个表的某(些)字段声明为主键,那么这些字段就要遵守如下两条规则。

(1)在这些作为主键的字段中任何字段任何行都不能为空。

(2)在这些作为主键的字段中任何两行之间的组合取值不能重复。

下面语句是在创建表的语句中声明了主键约束。

该语句在表dept中声明了字段deptno为该表的主键,这个主键约束并未命名,它的名称可以由系统自动产生。再看下面的语句:

该语句在表emp中声明了字段empno为主键,同时命名该主键约束为epk。

候选键约束

能唯一标识元组的最小属性集,但在数据库中未被标记为PRIMARY KEY,这样的属性集称为候选键。这里的候选键实质就是唯一性约束。它的规则要求与主键的规则要求一样,只是未被声明为主键而已。标准SQL并没有直接定义候选键,候选键取值不能为空和不取重复值的约束可以通过UNIQUE NOT NULL来实现,也可以通过UNIQUE KEY来实现,具体要根据不同的DBMS而定。下列语句在创建表中声明了候选键约束。

该语句为表emp的empno字段声明了一个叫euk的唯一性约束。

外键约束

外键是指在关系模式R中作为候选键的属性集,但在关系模式T中不是候选键。则对于T来说,这些属性集称为相对于R的外键。通常外键在数据库中会被标记为FOREIGN KEY字样。在这里,称R为父模式,T为子模式。通俗地说,就是父表中的主键字段被子表中某个字段引用,那么子表的这个字段则应声明为外键,而父表的那个字段可以声明为主键,也可以声明为唯一键(候选键)。一旦子表的字段被声明为父表的外键,同样的一个字段在父表中称为引用的父键,在子表中称为引用的子键。子键的取值应遵守如下规则,否则将被禁止。

(1)每个子键的取值不能取父键中取值以外的值,但空除外。

(2)对于父键是组合字段的,子键也应是组合字段。父键要求能唯一地标识父表的每一条记录,而子键不要求能唯一标识子表的每一条记录。

(3)对于组合键,子键为空时,所有键的成员字段都为空,不允许部分为空。

一个子表可以有多个子键,每个子键可以对应不同父表的父键。如果是组合键,那么同一个字段可能作为不同外键的成员。当然,子表和父表是相对的,子表如果有唯一键被其他表引用,那么这时的子表对于其他表关于某键,它又是父表。外键的引入,主要是为了表示表间的一对多问题。下面的语句说明了两个表间的外键引用情况。

这两条语句创建了dept和emp两个表,其中dept表中的deptno是它的主键,它被表emp引用。在emp中也有个同样名字的deptno字段,这个字段被声明为引用dept.deptno字段的外键。那么dept表是父表,deptno构成了引用中父表的父键;emp表是子表,deptno构成了引用中子表的子键。

因为外键是引用父表父键的子表的子键,所以父表的数据是引用的基础。一旦父表数据被修改或删除,引用也会造成相关的影响,表现在子表和子键上,这就需要做出相应的规则来约定父表父键发生改动后子表子键如何来进行维护活动。根据这种活动,将子表的外键分为三大类。

(1)禁止更新和删除父键,许多DBMS默认为这一类外键约束。一旦父表的父键被某个子表的子键引用了,那么父表中已有的数据是禁止修改和删除的。

(2)删除或更新父表数据的同时删除或更新子表子键中对应父键取值的行。

(3)删除或更新父表数据的同时将子表中对应父键的子键的取值设置为NULL。

加入这三种外键约束声明的语句可以如下所示:

该语句说明外键deptno默认为第一类。

该语句声明一个第二类的外键。

该语句声明一个第三类的外键。

若基本关系R中含有与另一基本关系S的主码PK相对应的属性组FK(FK称为R的外码),则参照完整性要求,R中的每个元组在FK上的值必须是S中某个元组的PK值,或者为空值。参照完整性的合理性在于,R中的外码只能对S中的主码引用,不能是S中主码没有的值。例如,对于学生和选课表两个关系,选课表中的学号是外码,它是学生表的主键,若选课表中出现了某个学生表中没有的学号,即某个学生还没有注册,却已有了选课记录,这显然是不合理的。

对于参照完整性,需要明确以下问题:

①外码能否接受空值问题,根据实际应用决定。

②在被参照关系中删除元组的问题。

.级联删除:将参照关系中所有外码值与被参照关系中要删除元组主码值相同的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去。

.受限删除(一般系统默认):仅当参照关系中没有任何元组的外码值与被参照关系中要删除元组的主码值相同时,系统才可以执行删除操作,否则拒绝执行删除操作。

.置空删除:删除被参照关系的元组,并将参照关系中相应元组的外码值置为空值。

③在参照关系中插入元组的问题。

.受限插入:仅当被参照关系中存在相应的元组时,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。

.递归插入:首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。

用户定义的完整性

实体完整性和参照完整性适用于任何关系型DBMS。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

如果在一条语句执行完后立即检查,则称立即执行约束;如果在整个事务执行结束后再进行检查,则称延迟执行约束。完整性规则的五元组表示为(D,O,A,C,P),其中D表示约束作用的数据对象,O表示触发完整性检查的数据库操作,A表示数据对象必须满足的断言或语义约束,C表示选择A作用的数据对象值的谓词,P表示违反完整性规则时触发的过程。

触发器

触发器是在关系型DBMS中应用得比较多的一种完整性保护措施。触发器的功能一般比完整性约束要强得多。一般而言,在完整性约束功能中,当系统检查出数据中有违反完整性约束条件时,则仅给出必要提示以通知用户,仅此而已。而触发器的功能则不仅仅起提示作用,它还会引起系统内自动进行某些操作以消除违反完整性约束条件所引起的负面影响。

所谓触发器,其抽象的含义即是一个事件的发生必然触发(或导致)另外一些事件的发生,其中前面的事件称为触发事件,后面的事件称为结果事件。触发事件一般即为完整性约束条件的否定。而结果事件即为一组操作用以消除触发事件所引起的不良影响。在目前数据库中事件一般表示为数据的插入、修改、删除等操作。

触发器除了有完整性保护功能外,还有安全性保护功能。

40. 关系型数据库中常用的查询语言不包括( )。

A. 域关系演算

B. 元组关系演算

C. 导航式语言

D. 关系代数

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

41. 一个取值域是原子的,是指该域的元素是( )单元。

A. 不同的

B. 不可分的

C. 常量

D. 不可见的

42. 假设有两个数据库表,product 表和market 表,分别存放商品信息和市场需求信息。对SQL语句: selet * fom product, market where productp. id=markep.id的结果描述正确的是(42)。如果想从market表中移除m id为MO3的记录,语句(43)是正确的。如果要收回GRANT SELECT ON product to role_A WITH GRANT OPTION语句给role_A赋予的权限,使用语句(44)。早product表、market表初始数据不变的情况下,以下SQL语句返回的结果有(45)条记录。
SELECT product.p_id
FROM product
WHERE productp num>( SELECT sum (arketm need)
FROM market

WHERE markerp id = productp. id);

A. 查找市场所需商品的信息

B. 查找所有市场信息

C. 查找所有商品信息

D. 查找市场所需的商品信息以及相应的市场需求信息

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

43. 假设有两个数据库表,product 表和market 表,分别存放商品信息和市场需求信息。对SQL语句: selet * fom product, market where productp. id=markep.id的结果描述正确的是(42)。如果想从market表中移除m id为MO3的记录,语句(43)是正确的。如果要收回GRANT SELECT ON product to role_A WITH GRANT OPTION语句给role_A赋予的权限,使用语句(44)。早product表、market表初始数据不变的情况下,以下SQL语句返回的结果有(45)条记录。
SELECT product.p_id
FROM product
WHERE productp num>( SELECT sum (arketm need)
FROM market

WHERE markerp id = productp. id);

A. REMOVE FROM market WHERE m id-*M03'

B. DROP FROM market WHERE m id-"M03'

C. DELETE FROM market WHERE m id='M03'

D. UPDATE FROM market WHERE m id='M03'

44. 假设有两个数据库表,product 表和market 表,分别存放商品信息和市场需求信息。对SQL语句: selet * fom product, market where productp. id=markep.id的结果描述正确的是(42)。如果想从market表中移除m id为MO3的记录,语句(43)是正确的。如果要收回GRANT SELECT ON product to role_A WITH GRANT OPTION语句给role_A赋予的权限,使用语句(44)。早product表、market表初始数据不变的情况下,以下SQL语句返回的结果有(45)条记录。
SELECT product.p_id
FROM product
WHERE productp num>( SELECT sum (arketm need)
FROM market

WHERE markerp id = productp. id);

A. REVOKE SELECT ON product FROM role A

B. REVOKE SELECT ON product FROM role ACASCADE

C. REVOKE SELECT ON product FROM role A WITH GRANT OPTION

D. REVOKE SELECT ON producet FROM role AALL

45. 假设有两个数据库表,product 表和market 表,分别存放商品信息和市场需求信息。对SQL语句: selet * fom product, market where productp. id=markep.id的结果描述正确的是(42)。如果想从market表中移除m id为MO3的记录,语句(43)是正确的。如果要收回GRANT SELECT ON product to role_A WITH GRANT OPTION语句给role_A赋予的权限,使用语句(44)。早product表、market表初始数据不变的情况下,以下SQL语句返回的结果有(45)条记录。
SELECT product.p_id
FROM product
WHERE productp num>( SELECT sum (arketm need)
FROM market

WHERE markerp id = productp. id);

A. 0

B. 1

C. 2

D. 3

46. 关系模式R

A. INF

B. 2NF

C. 3NF

D. BCNF

47. 关系模式R

A. 主属性对码的部分函数依赖

B. 非主属性对码的部分函数依赖

C. 主属性对码的传递函数依赖

D. 非主属性对码的传递函数依赖

48. 关系模式R<U, D>中,D为R的函数依赖和多值依赖的集合。将R分解为两个关系模式R1<U1,,D1>和R2<U2,D2>,则以下说法中错误的是( )。

A. 如果U1∩U2→U1-U2成立,那么此分解具有无损连接性

B. 如果U1∩U2→→U1-U2成立,那么此分解具有无损连接性

C. 如果U1∩U2→U1-U2不成立,那么此分解不具有无损连接性

D. 如果U1∩U2→→U1-U2不成立,那么此分解不具有无损连接性

数据依赖是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系,是现实世界属性间相互联系和约束的抽象,是数据内在的性质,是语义的体现。函数依赖则是一种最重要、最基本的数据依赖。

(1)函数依赖。设R(U)是一个属性集U上的关系模式,XYU的子集。若对R(U)的任何一个可能的关系rr中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数决定YY函数依赖于X,记作XY

(2)非平凡的函数依赖。如果XY,但YX,则称XY是非平凡的函数依赖。

(3)平凡的函数依赖。如果XY,但YX,则称XY是平凡的函数依赖。

(4)完全函数依赖。在R(U)中,如果XY,并且对于X的任何一个真子集X',都有X'不能决定Y,则称YX完全函数依赖,记作

(5)部分函数依赖。如果XY,但Y不完全函数依赖于X,则称YX部分函数依赖,记作。部分函数依赖也称局部函数依赖。

(6)传递依赖。在R(U,F)中,如果XYY?XY不能函数决定XYZ,则称ZX传递依赖。

(7)码。设KR(U,F)中的属性的组合,若KU,且对于K的任何一个真子集K',都有K'不能决定U,则KR的候选码,若有多个候选码,则选一个作为主码。候选码通常也称为候选关键字。

(8)主属性和非主属性。包含在任何一个候选码中的属性叫做主属性,否则叫做非主属性。

(9)外码。若R(U)中的属性或属性组XR的码,但X是另一个关系的码,则称X为外码。

(10)函数依赖的公理系统(Armstrong公理系统)。设关系模式R(U,F)中,U为属性集,FU上的一组函数依赖,那么有以下的推理规则。

.A1自反律(Reflexivity):若Y?X?U,则XYF所蕴含。

.A2增广律(Augmentation):若XY为F所蕴含,且Z?U,XZYZF所蕴含。

.A3传递律(Transitivity):若XYYZF所蕴含,则XZF所蕴含。

根据以上3条推理规则,可以推出下面3条推理规则。

.合并规则:若XYXZ,则XYZF所蕴含。

.伪传递率:若XYWYZ,则XWZF所蕴含。

.分解规则:若XYZ?Y,则XZF所蕴含。

引理XA1A2Ak成立的充分必要条件是XAii=1,2,…,k)成立。

函数可以被看作是一个由用户定义的操作。一般来说,函数用一个名字来表示,函数的操作数称为参数(parameter),由一个位于括号中并且用逗号分隔的参数表(Parameter List)指定。函数的结果被称为返回值(Return Value),返回值的类型被称为函数返回类型(Return Type)。不产生值的函数返回类型是void,意思是什么都不返回。函数执行的动作在函数体(body)中指定。函数体包含在花括号中,有时也称为函数块(Function Block)。函数返回类型以及其后的函数名、参数表和函数体构成了函数定义。

函数是C++语言程序的基本功能单元,其重要性不言而喻。函数接口的两个要素是参数和返回值。C语言中,函数的参数和返回值的传递方式有两种:值传递(Pass By Value)和指针传递(Pass by Pointer)。C++语言中多了引用传递(Pass by Reference)。

49. 下列关于BCNF的描述,正确的是( )。

A. BCNF不满足列的原子性

B. BCNF中存在非主属性对码的部分依赖

C. BCNF中存在非主属性对码的传递依赖

D. BCNF中每个函数依赖左部都包含码

50. 关系模式R中,X、Y、Z是U的子集。下列关于多值依赖描述中正确的是( ) 。

A. 若X→→Y为平凡的多值依赖,则U-X-Y为空集

B. 若X→→Y为平凡的多值依赖,则Y是X的子集

C. 若X→→Y且Y→→Z,则X→→Z

D. 若X→→Y,则X→Y

51. 事务TI将数据库中的A值从50改为30,事务T2读A值为30,事务TI又将刚才的操作撤销,A值恢复为50。这种情况属于(51), 是由于数据库系统在(52)方面的不当引起的,能解决此问题的方法是(53)。

A. 丢失修改

B. 不可重复读

C. 读脏数据

D. 幻影现象

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

数据恢复有3个步骤。

(1)反向扫描文件日志,查找该事务的更新操作。

(2)对事务的更新操作执行逆操作。

(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。

简单地说,数据库系统就是基于数据库的计算机应用系统。这样一个系统包括以下内容。

①以数据为主体的数据库。

②管理数据库的系统(DBMS)。

③支持数据库系统的计算机硬件环境和操作系统环境。

④管理和使用数据库系统的人——数据库管理员。

1)数据库的定义和特征

数据库,顾名思义就是存放数据的仓库,这种想当然的理解是不准确的。数据库对应的英文单词是DataBase,如果直译则是数据基地;而数据仓库则另有其词DataWarehouse。所以数据库和数据仓库不是同义词,数据仓库是在数据库技术的基础上发展起来的又一新的应用领域。

数据库技术发展到今天已经是一门成熟的技术,但却没有一个被普遍接受的、严格的定义。数据库是相互关联数据的集合,这是大家公认的数据库的基本特征之一。下面一段话概括了数据库应该具备的一些特征,也可以把它作为数据库的定义。

数据库是相互关联数据的集合,它用综合的方法组织数据,具有较小的数据冗余,可供多个用户共享,具有较高的数据独立性,具有安全控制机制,能够保证数据的安全、可靠,允许并发地使用数据库,能有效、及时地处理数据,并能保证数据的一致性和完整性。

(1)相互关联的数据集合。数据库中的数据不是孤立的,数据与数据之间是相互关联的。也就是说,在数据库中不仅要能够表示数据本身,还要能够表示数据与数据之间的联系。比如在学籍管理中,有学生和课程两类数据,在数据库中除了要存放这两类数据之外,还要存放哪些学生选修了哪些课程或哪些课程由哪些学生选修这样的信息,这就反映了学生数据和课程数据之间的联系。

(2)用综合的方法组织数据。数据库能够根据不同的需要按不同的方法组织数据,如可以用顺序组织方法、索引组织方法、聚集(Cluster)组织方法等。

(3)低冗余与数据共享。由于在数据库技术之前,数据文件都是独立的,所以任何数据文件都必须含有满足某应用的全部数据。比如,人事部门有一个职工文件,教育部门也有一个职工文件,两个部门的职工文件中都有"职工基本情况"的数据,也就是说这一部分数据是重复存储的,如果还有第三、第四个部门也有类似的职工文件,那么重复存储所造成的空间浪费是很大的。在数据库中,可以共享类似"职工基本情况"这样的共用数据,从而降低数据的冗余度。

(4)数据具有较高的独立性。数据独立性是指数据的组织和存储方式与应用程序互不依赖、彼此独立的特性。在数据库技术之前,数据文件的组织方式和应用程序是密切相关的,当改变数据结构时,相应的应用程序也必须随之修改,这样就大大增加了应用程序的开发代价和维护代价。而数据库技术却可以使数据的组织和存储方法与应用程序互不依赖,从而大大降低应用程序的开发代价和维护代价。

(5)保证数据的安全、可靠。数据库技术要能够保证数据库中的数据是安全、可靠的。数据库要有一套安全机制,以便可以有效地防止数据库中的数据被非法使用或非法修改;数据库还要有一套完整的备份和恢复机制,以便保证当数据遭到破坏时(软件或硬件故障引起的),能立刻将数据完全恢复,从而保证系统能够连续、可靠地运行。

(6)最大限度地保证数据的正确性。保证数据正确的特性在数据库中称为数据完整性。在数据库中可以通过建立一些约束条件保证数据库中的数据是正确的。比如输入年龄小于0或者大于200时,数据库能够主动拒绝这类错误。

(7)数据可以并发使用并能同时保证数据的一致性。数据库中的数据是共享的,并且允许多个用户同时使用同一数据,这就要求数据库能够协调一致,保证各个用户之间对数据的操作不发生矛盾和冲突,即在多个用户同时使用数据库的情况下,能够保证数据的一致性和正确性。

2)数据库管理系统

数据库的各种功能和特性,并不是数据库中的数据所固有的,而是靠管理或支持数据库的系统软件——数据库管理系统(DataBase Management System, DBMS)提供的。一个完备的数据库管理系统应该具备上一节提到的各种功能,其任务就是对数据资源进行管理,并且使之能为多个用户共享,同时还能保证数据的安全性、可靠性、完整性、一致性,并要保证数据的高度独立性。一个数据库管理系统应该具备以下功能。

(1)数据库定义功能。可以定义数据库的结构和数据库的存储结构,可以定义数据库中数据之间的联系,可以定义数据的完整性约束条件和保证完整性的触发机制等。

(2)数据库操纵功能。可以完成对数据库中数据的操纵,可以装入、删除、修改数据,可以重新组织数据库的存储结构,可以完成数据库的备份和恢复等操作。

(3)数据库查询功能。可以以各种方式提供灵活的查询功能,可以使用户方便地使用数据库中的数据。

(4)数据库控制功能。可以完成对数据库的安全性控制、完整性控制、多用户环境下的并发控制等各方面的控制。

(5)数据库通信功能。在分布式数据库或提供网络操作功能的数据库中还必须提供数据库的通信功能。

3)数据库管理员

从事数据库管理工作的人员称为数据库管理员(DataBase Administrator, DBA)。DBA有大量的工作要做,既有技术方面的工作,又有管理方面的工作,要参加数据库开发和使用的全部工作。总体来说,DBA的工作可以概括如下。

(1)在数据库规划阶段要参与选择和评价与数据库有关的计算机软件和硬件,要与数据库用户共同确定数据库系统的目标和数据库应用需求,要确定数据库的开发计划。

(2)在数据库设计阶段要负责数据库标准的制定和共用数据字典的研制,要负责各级数据库模式的设计,要负责数据库安全、可靠方面的设计。

(3)在数据库运行阶段首先要负责对用户进行数据库方面的培训;要负责数据库的转储和恢复;要负责对数据库中的数据进行维护;要负责监视数据库的性能,并调整、改善数据库的性能,提高系统的效率;要继续负责数据库安全系统的管理;要在运行过程中发现问题、解决问题。

4)数据库的发展

数据库的核心任务是数据管理,它包括数据的分类、组织、编码、存储、检索和维护等。数据管理经历了以下3个阶段。

(1)人工管理阶段。人工管理阶段是指计算机诞生的初期(20世纪50年代中期以前)。这个时期的计算机技术,从硬件看还没有磁盘这样的可直接存取的存储设备,从软件看没有操作系统,更没有管理数据的软件。这个时期数据管理的特点如下。

①数据不保存。因为计算机主要用于科学计算,一般也不需要长期保存数据,只是在完成某一个计算或课题时才将数据输入,然后不仅原始数据不保存,计算结果也不保存。

②没有文件的概念。这个时期的数据组织必须由每个程序的程序员自行组织和安排。

③一组数据对应一个程序。每组数据只对应一个应用,即使两个程序用到相同的数据,也必须各自定义、各自组织,数据无法共享、无法相互利用和互相参照。因此,程序和程序之间有大量的数据重复。

④没有形成完整的数据管理的概念。由于以上几个特点及没有对数据进行管理的软件系统,所以这个时期的每个程序都要包括数据存取方法、输入输出方法和数据组织方法等。因为程序是直接面向存储结构的,所以存储结构的任何一点修改,都会导致程序的修改,程序与数据不具有独立性。

(2)文件系统阶段。文件系统阶段是指20世纪50年代后期到60年代中期这一阶段。从那时起,计算机不仅大量用于科学计算,也开始大量用于信息管理。像磁盘这样的直接存取存储设备也已经出现,在软件方面也有了操作系统和高级语言,还有了专门用于数据管理的软件,即文件系统(或操作系统的文件管理部分)。这个阶段的数据管理具有以下特点。

①数据可以长期保存在磁盘上,也可以反复使用,即可以经常对文件进行查询、修改、插入和删除等操作。

②操作系统提供了文件管理功能和访问文件的存取方法,程序和数据之间有了数据存取的接口,程序开始通过文件名和数据打交道,可以不再关心数据的物理存放位置。因此,这时也有了数据的物理结构和数据的逻辑结构的区别。程序和数据之间有了一定的独立性。

③文件的形式已经多样化。由于有了磁盘这样的直接存取存储设备,文件也就不再局限于顺序文件,也有了索引文件、链表文件等。因而,对文件的访问可以是顺序访问,也可以是直接访问。但文件之间是独立的,它们之间的联系要通过程序去构造,文件的共享性还比较差。

④有了存储文件以后,数据就不再仅仅属于某个特定的程序,而是可以由多个程序反复使用。但文件结构的设计仍然是基于特定的用途,程序仍然是基于特定的物理结构和存取方法编制的。因此,数据的存储结构和程序之间的依赖关系并未根本改变。

⑤数据的存取基本上以记录为单位。

(3)数据库系统阶段。数据库系统阶段从20世纪60年代后期开始,数据库技术的诞生既有计算机技术的发展做依托,又有数据管理的需求做动力。数据库的数据不再是面向某个应用或某个程序,而是面向整个企业(组织)或整个应用。

52. 事务TI将数据库中的A值从50改为30,事务T2读A值为30,事务TI又将刚才的操作撤销,A值恢复为50。这种情况属于(51), 是由于数据库系统在(52)方面的不当引起的,能解决此问题的方法是(53)。

A. 并发控制

B. 完整性约束

C. 安全性控制

D. 数据库的恢复

53. 事务TI将数据库中的A值从50改为30,事务T2读A值为30,事务TI又将刚才的操作撤销,A值恢复为50。这种情况属于(51), 是由于数据库系统在(52)方面的不当引起的,能解决此问题的方法是(53)。

A. 一级封锁协议和二级封锁协议

B. 二级封锁协议和三级封锁协议

C. 一级封锁协议和三级封锁协议

D. 一级封锁协议、二级封锁协议和三级封锁协议

54. 事务具有 ACID特性,其中C是指事务的( )。

A. 原子性

B. 持续性

C. 隔离性

D. 一致性

55. 数据库恢复操作的基本原理是( )。

A. 存取控制

B. 加密

C. 完整性约束

D. 冗余

在分段存储管理方式中,作业的地址空间按程序自身的逻辑关系划分为若干个程序段,每个段是一组完整的逻辑信息。每个段都有自己的段名,且有一个段号。段号从0开始,每一段也从0开始编址,段内地址是连续的,各段长度是不等的。

分段系统的逻辑地址由段号(名)和段内地址两部分组成。在该地址结构中,允许一个作业最多有64K段,每个段的最大长度为64KB。其地址结构如下图所示。

分段的地址结构

在分段式存储管理系统中,为每个段分配一个连续的分区,而进程中的各个段可以离散地分配到主存中不同的分区中。在系统中为每个进程建立一张段映射表,简称为"段表"。段表实现了从逻辑段到物理主存区的映射。

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

数据恢复有3个步骤。

(1)反向扫描文件日志,查找该事务的更新操作。

(2)对事务的更新操作执行逆操作。

(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。

56. 数据库系统在运行过程中可能会发生CPU故障,这属于(56)。在此类故障的恢复过程中,需要根据日志进行的操作为(57) 。

A. 事务故障

B. 系统故障

C. 介质故障

D. 指令故障

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

数据恢复有3个步骤。

(1)反向扫描文件日志,查找该事务的更新操作。

(2)对事务的更新操作执行逆操作。

(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。

简单地说,数据库系统就是基于数据库的计算机应用系统。这样一个系统包括以下内容。

①以数据为主体的数据库。

②管理数据库的系统(DBMS)。

③支持数据库系统的计算机硬件环境和操作系统环境。

④管理和使用数据库系统的人——数据库管理员。

1)数据库的定义和特征

数据库,顾名思义就是存放数据的仓库,这种想当然的理解是不准确的。数据库对应的英文单词是DataBase,如果直译则是数据基地;而数据仓库则另有其词DataWarehouse。所以数据库和数据仓库不是同义词,数据仓库是在数据库技术的基础上发展起来的又一新的应用领域。

数据库技术发展到今天已经是一门成熟的技术,但却没有一个被普遍接受的、严格的定义。数据库是相互关联数据的集合,这是大家公认的数据库的基本特征之一。下面一段话概括了数据库应该具备的一些特征,也可以把它作为数据库的定义。

数据库是相互关联数据的集合,它用综合的方法组织数据,具有较小的数据冗余,可供多个用户共享,具有较高的数据独立性,具有安全控制机制,能够保证数据的安全、可靠,允许并发地使用数据库,能有效、及时地处理数据,并能保证数据的一致性和完整性。

(1)相互关联的数据集合。数据库中的数据不是孤立的,数据与数据之间是相互关联的。也就是说,在数据库中不仅要能够表示数据本身,还要能够表示数据与数据之间的联系。比如在学籍管理中,有学生和课程两类数据,在数据库中除了要存放这两类数据之外,还要存放哪些学生选修了哪些课程或哪些课程由哪些学生选修这样的信息,这就反映了学生数据和课程数据之间的联系。

(2)用综合的方法组织数据。数据库能够根据不同的需要按不同的方法组织数据,如可以用顺序组织方法、索引组织方法、聚集(Cluster)组织方法等。

(3)低冗余与数据共享。由于在数据库技术之前,数据文件都是独立的,所以任何数据文件都必须含有满足某应用的全部数据。比如,人事部门有一个职工文件,教育部门也有一个职工文件,两个部门的职工文件中都有"职工基本情况"的数据,也就是说这一部分数据是重复存储的,如果还有第三、第四个部门也有类似的职工文件,那么重复存储所造成的空间浪费是很大的。在数据库中,可以共享类似"职工基本情况"这样的共用数据,从而降低数据的冗余度。

(4)数据具有较高的独立性。数据独立性是指数据的组织和存储方式与应用程序互不依赖、彼此独立的特性。在数据库技术之前,数据文件的组织方式和应用程序是密切相关的,当改变数据结构时,相应的应用程序也必须随之修改,这样就大大增加了应用程序的开发代价和维护代价。而数据库技术却可以使数据的组织和存储方法与应用程序互不依赖,从而大大降低应用程序的开发代价和维护代价。

(5)保证数据的安全、可靠。数据库技术要能够保证数据库中的数据是安全、可靠的。数据库要有一套安全机制,以便可以有效地防止数据库中的数据被非法使用或非法修改;数据库还要有一套完整的备份和恢复机制,以便保证当数据遭到破坏时(软件或硬件故障引起的),能立刻将数据完全恢复,从而保证系统能够连续、可靠地运行。

(6)最大限度地保证数据的正确性。保证数据正确的特性在数据库中称为数据完整性。在数据库中可以通过建立一些约束条件保证数据库中的数据是正确的。比如输入年龄小于0或者大于200时,数据库能够主动拒绝这类错误。

(7)数据可以并发使用并能同时保证数据的一致性。数据库中的数据是共享的,并且允许多个用户同时使用同一数据,这就要求数据库能够协调一致,保证各个用户之间对数据的操作不发生矛盾和冲突,即在多个用户同时使用数据库的情况下,能够保证数据的一致性和正确性。

2)数据库管理系统

数据库的各种功能和特性,并不是数据库中的数据所固有的,而是靠管理或支持数据库的系统软件——数据库管理系统(DataBase Management System, DBMS)提供的。一个完备的数据库管理系统应该具备上一节提到的各种功能,其任务就是对数据资源进行管理,并且使之能为多个用户共享,同时还能保证数据的安全性、可靠性、完整性、一致性,并要保证数据的高度独立性。一个数据库管理系统应该具备以下功能。

(1)数据库定义功能。可以定义数据库的结构和数据库的存储结构,可以定义数据库中数据之间的联系,可以定义数据的完整性约束条件和保证完整性的触发机制等。

(2)数据库操纵功能。可以完成对数据库中数据的操纵,可以装入、删除、修改数据,可以重新组织数据库的存储结构,可以完成数据库的备份和恢复等操作。

(3)数据库查询功能。可以以各种方式提供灵活的查询功能,可以使用户方便地使用数据库中的数据。

(4)数据库控制功能。可以完成对数据库的安全性控制、完整性控制、多用户环境下的并发控制等各方面的控制。

(5)数据库通信功能。在分布式数据库或提供网络操作功能的数据库中还必须提供数据库的通信功能。

3)数据库管理员

从事数据库管理工作的人员称为数据库管理员(DataBase Administrator, DBA)。DBA有大量的工作要做,既有技术方面的工作,又有管理方面的工作,要参加数据库开发和使用的全部工作。总体来说,DBA的工作可以概括如下。

(1)在数据库规划阶段要参与选择和评价与数据库有关的计算机软件和硬件,要与数据库用户共同确定数据库系统的目标和数据库应用需求,要确定数据库的开发计划。

(2)在数据库设计阶段要负责数据库标准的制定和共用数据字典的研制,要负责各级数据库模式的设计,要负责数据库安全、可靠方面的设计。

(3)在数据库运行阶段首先要负责对用户进行数据库方面的培训;要负责数据库的转储和恢复;要负责对数据库中的数据进行维护;要负责监视数据库的性能,并调整、改善数据库的性能,提高系统的效率;要继续负责数据库安全系统的管理;要在运行过程中发现问题、解决问题。

4)数据库的发展

数据库的核心任务是数据管理,它包括数据的分类、组织、编码、存储、检索和维护等。数据管理经历了以下3个阶段。

(1)人工管理阶段。人工管理阶段是指计算机诞生的初期(20世纪50年代中期以前)。这个时期的计算机技术,从硬件看还没有磁盘这样的可直接存取的存储设备,从软件看没有操作系统,更没有管理数据的软件。这个时期数据管理的特点如下。

①数据不保存。因为计算机主要用于科学计算,一般也不需要长期保存数据,只是在完成某一个计算或课题时才将数据输入,然后不仅原始数据不保存,计算结果也不保存。

②没有文件的概念。这个时期的数据组织必须由每个程序的程序员自行组织和安排。

③一组数据对应一个程序。每组数据只对应一个应用,即使两个程序用到相同的数据,也必须各自定义、各自组织,数据无法共享、无法相互利用和互相参照。因此,程序和程序之间有大量的数据重复。

④没有形成完整的数据管理的概念。由于以上几个特点及没有对数据进行管理的软件系统,所以这个时期的每个程序都要包括数据存取方法、输入输出方法和数据组织方法等。因为程序是直接面向存储结构的,所以存储结构的任何一点修改,都会导致程序的修改,程序与数据不具有独立性。

(2)文件系统阶段。文件系统阶段是指20世纪50年代后期到60年代中期这一阶段。从那时起,计算机不仅大量用于科学计算,也开始大量用于信息管理。像磁盘这样的直接存取存储设备也已经出现,在软件方面也有了操作系统和高级语言,还有了专门用于数据管理的软件,即文件系统(或操作系统的文件管理部分)。这个阶段的数据管理具有以下特点。

①数据可以长期保存在磁盘上,也可以反复使用,即可以经常对文件进行查询、修改、插入和删除等操作。

②操作系统提供了文件管理功能和访问文件的存取方法,程序和数据之间有了数据存取的接口,程序开始通过文件名和数据打交道,可以不再关心数据的物理存放位置。因此,这时也有了数据的物理结构和数据的逻辑结构的区别。程序和数据之间有了一定的独立性。

③文件的形式已经多样化。由于有了磁盘这样的直接存取存储设备,文件也就不再局限于顺序文件,也有了索引文件、链表文件等。因而,对文件的访问可以是顺序访问,也可以是直接访问。但文件之间是独立的,它们之间的联系要通过程序去构造,文件的共享性还比较差。

④有了存储文件以后,数据就不再仅仅属于某个特定的程序,而是可以由多个程序反复使用。但文件结构的设计仍然是基于特定的用途,程序仍然是基于特定的物理结构和存取方法编制的。因此,数据的存储结构和程序之间的依赖关系并未根本改变。

⑤数据的存取基本上以记录为单位。

(3)数据库系统阶段。数据库系统阶段从20世纪60年代后期开始,数据库技术的诞生既有计算机技术的发展做依托,又有数据管理的需求做动力。数据库的数据不再是面向某个应用或某个程序,而是面向整个企业(组织)或整个应用。

57. 数据库系统在运行过程中可能会发生CPU故障,这属于(56)。在此类故障的恢复过程中,需要根据日志进行的操作为(57) 。

A. UNDO

B. REDO

C. UNDO+REDO

D. 后备副本+UNDO+REDO

58. 关于触发器, 下面说法中正确的是( )。

A. 触发器可以实现完整性约束

B. 触发器不是数据库对象

C. 用户执行SELECT语句时可以激活触发器

D. 触发器不会导致无限触发链

触发器是在关系型DBMS中应用得比较多的一种完整性保护措施。触发器的功能一般比完整性约束要强得多。一般而言,在完整性约束功能中,当系统检查出数据中有违反完整性约束条件时,则仅给出必要提示以通知用户,仅此而已。而触发器的功能则不仅仅起提示作用,它还会引起系统内自动进行某些操作以消除违反完整性约束条件所引起的负面影响。

所谓触发器,其抽象的含义即是一个事件的发生必然触发(或导致)另外一些事件的发生,其中前面的事件称为触发事件,后面的事件称为结果事件。触发事件一般即为完整性约束条件的否定。而结果事件即为一组操作用以消除触发事件所引起的不良影响。在目前数据库中事件一般表示为数据的插入、修改、删除等操作。

触发器除了有完整性保护功能外,还有安全性保护功能。

59. 关于存储过程,下面说法中错误的是( )。

A. 存储过程可用于实施企业业务规则

B. 存储过程可以有输入输出参数

C. 存储过程可以使用游标

D. 存储过程由数据库服务器自动执行

60. 如果一个事务已获得数据项R上的共享锁,则其他事务( )。

A. 可获得R上的排它锁

B. 可获得R上的共享锁

C. 不能获得R上的锁

D. 待该共享锁释放后才可获得R上的锁

61. 数据库管理系统中,以下SQL语句书写顺序正确的是( )。

A. SELECT→FROM→GROUP BY→WHERE

B. SELECT→FROM→WHERE→GROUP BY

C. SELECT→WHERE→GROUP BY→FROM

D. SELECT→WHERE→FROM→GROUP BY

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

数据库为了保证存储在其中的数据的安全和一致,必须有一组软件来完成相应的管理任务,这组软件就是DBMS,DBMS随系统的不同而不同,但是一般来说,它应该包括以下几方面的内容:

(1)数据库描述功能。定义数据库的全局逻辑结构,局部逻辑结构和其他各种数据库对象。

(2)数据库管理功能。包括系统配置与管理,数据存取与更新管理,数据完整性管理和数据安全性管理。

(3)数据库的查询和操纵功能。该功能包括数据库检索和修改。

(4)数据库维护功能。包括数据引入引出管理,数据库结构维护,数据恢复功能和性能监测。为了提高数据库系统的开发效率,现代数据库系统除了DBMS之外,还提供了各种支持应用开发的工具。

因此,衡量数据库管理系统的主要性能指标包括数据库本身和管理系统两部分。

数据库和数据库管理系统的性能指标包括数据库的大小、单个数据库文件的大小、数据库中表的数量、单个表的大小、表中允许的记录(行)数量、单个记录(行)的大小、表上所允许的索引数量、数据库所允许的索引数量、最大并发事务处理能力、负载均衡能力、最大连接数。

62. E-R图向关系模式转换时,实体标识符转换为关系的( )。

A. 码

B. 元组

C. 记录

D. 约束

实体是现实世界中可以区别于其他对象的"事件"或"物体"。每个实体由一组特性(属性)来表示,其中的某一部分属性可以唯一表示实体。实体集是具有相同属性的实体集合。

63. OLTP指的是(63),OLAP指的是(64)。

A. 联机事务处理

B. 联机分析处理

C. 实时事务处理

D. 批量事务处理

64. OLTP指的是(63),OLAP指的是(64)。

A. 联机事务处理

B. 联机分析处理

C. 实时事务处理

D. 批量事务处理

65. SQL语言中,NULL值代表( )。

A. 空字符串

B. 数值0

C. 空值

D. 空指针

SQL-86是第一个SQL标准,后续的有SQL-89、SQL-92(SQL2)和SQL-99(SQL3)等。但作为考试而言,所考查的是一些基本的语法知识。

定义基本表

SQL语言使用动词CREATE定义基本表,其具体语法格式如下:

在这个语句中,主要考查一些约束条件。有关这方面的知识请参考第7章的7.4.3节。

基本表查询

SQL语言查询语句的基本格式如下:

在这个语句中,主要考查各种条件,包括GROUP BY、HAVING等,以及考查IN和EXISTS的区别。另外,还要掌握有关集函数的应用。

集函数

常用的集函数主要有:

.COUNT([DISTINCT|ALL]*):统计元组个数。

.COUNT([DISTINCT|ALL]):统计一列中值的个数。

.SUM([DISTINCT|ALL]):计算一列值的总和(必须是数值型)。

.AVG([DISTINCT|ALL]):计算一列值的平均值(必须是数值型)。

.MAX([DISTINCT|ALL]):求一列值中的最大值。

.MIN([DISTINCT|ALL]):求一列值中的最小值。

集函数只能在SELECT子句和HAVING子句中使用,其他子句中不能使用集函数。

GROUP BY

GROUP BY指定用来放置输出行的组。如果SELECT子句“目标列表达式”中包含聚合函数,则GROUP BY将计算每组的汇总值。指定GROUP BY时,选择列表中任意非聚合表达式内的所有列都应包含在GROUP BY列表中,或者GROUP BY表达式必须与选择列表表达式完全匹配。

如果没有GROUP BY子句,则SQL列函数应用程序返回一行数据。当使用GROUP BY时,会对每个组运用函数,所以所返回的行数与分组数相同。

当使用GROUP BY子句时,SQL将选出的行按照是否符合表达式的值或者是否符合某一列或多列的值进行分组。接下来,SQL处理每一组,从而为每组生成一行结果。在GROUP BY子句中,可以指定一列或多列或者表达式来对行进行分组。在SELECT语句中指定的项具有由行组成的每一组的属性,而不具备表中或视图中单个行的属性。

例如,EMPLOYEE表有几组行,每一组中的这些行描述了某个特定部门的成员。为了查出每个部门中人员的平均薪水,可以写这样的SQL语句:

生成的结果被分成了几行,每行表示一个部门。

如果在GROUP BY子句中指定的列为空值,则会生成只有一行的结果,行中数据为空值。也可以将行按照多列或按照表达式进行分组。例如,使用CORPDATA.EMPLOYEE表编写一条查找每个部门男性员工和女性员工平均薪水的SELECT语句。为了实现这一点,可以这样做:

HAVING

HAVING子句指定组或聚合应满足的搜索条件。当HAVING与GROUP BY ALL一起使用时,HAVING子句优于ALL。

HAVING子句对GROUP BY子句设置条件的方式与WHERE子句和SELECT语句交互的方式类似。WHERE子句搜索条件在进行分组操作之前应用,而HAVING子句搜索条件在进行分组操作之后应用。HAVING语法与WHERE语法类似,但HAVING子句可以包含聚合函数。HAVING子句可以引用选择列表中出现的任意项。

下面的查询得到本年度截止到目前的销售额超过40000的出版商:

HAVING子句用来从分组的结果中筛选行。对于可以在分组操作之前或之后应用的搜索条件,在WHERE子句中指定它们更有效。这样可以减少必须分组的行数。应当在HAVING子句中指定的搜索条件只是那些必须在执行分组操作之后应用的搜索条件。

LIKE与通配符

在WHERE子句的条件表达式中可以使用算术比较运算符号,对于字符型数据,可以使用LIKE关键词以及通配符。例如,要查找姓李的学生的学号和姓名的SQL语句如下:

这里的“%”就是一个通配符,代表0个或多个字符。例如,要查找某个属性中包含“软考在线”的元组,则可以写成“…LIKE'%软考在线%'”。

还有一个通配符是“_”(下划线),这个通配符只代表1个字符。例如,要查找某个属性中第2个字和第3个字是“软考在线”,倒数第2个字和第3个字包含“教育”的元组,则可以写成“…LIKE'_软考在线%教育_'”。

视图操作

视图不真正存在数据,只是把定义存于数据字典,在对视图进行查询时,才按视图的定义从基本表中将数据查出。若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了码,则这个视图称为行列子集视图。

视图对应了数据库系统三级模式/两级映象中的外模式,重建视图即是修改外模式及外模式/模式映象,实现了数据的逻辑独立性。在DBMS中,视图的作用如下:

(1)简化用户的操作;

(2)使用户能从多种角度看待同一数据;

(3)对重构数据库提供了一定程度的逻辑独立性;

(4)能够对机密数据提供安全保护。

建立视图的命令格式如下:

其中With Check Option表示对视图进行Update、Insert和Delete操作时,要保证更新、插入或删除的行满足视图定义中的谓词条件。

例如,建立信息系学生的视图:

因为视图没有真实数据,所以对视图的查询要转换为对相应表的查询,这个过程叫视图消解,视图消解过程由DBMS自动完成。

66. 数据库系统中,使数据恢复到故障发生前的一致状态的机制称为( )。

A. 恢复机制

B. 备份机制

C. 封锁机制

D. 事务机制

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

数据恢复有3个步骤。

(1)反向扫描文件日志,查找该事务的更新操作。

(2)对事务的更新操作执行逆操作。

(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。

简单地说,数据库系统就是基于数据库的计算机应用系统。这样一个系统包括以下内容。

①以数据为主体的数据库。

②管理数据库的系统(DBMS)。

③支持数据库系统的计算机硬件环境和操作系统环境。

④管理和使用数据库系统的人——数据库管理员。

1)数据库的定义和特征

数据库,顾名思义就是存放数据的仓库,这种想当然的理解是不准确的。数据库对应的英文单词是DataBase,如果直译则是数据基地;而数据仓库则另有其词DataWarehouse。所以数据库和数据仓库不是同义词,数据仓库是在数据库技术的基础上发展起来的又一新的应用领域。

数据库技术发展到今天已经是一门成熟的技术,但却没有一个被普遍接受的、严格的定义。数据库是相互关联数据的集合,这是大家公认的数据库的基本特征之一。下面一段话概括了数据库应该具备的一些特征,也可以把它作为数据库的定义。

数据库是相互关联数据的集合,它用综合的方法组织数据,具有较小的数据冗余,可供多个用户共享,具有较高的数据独立性,具有安全控制机制,能够保证数据的安全、可靠,允许并发地使用数据库,能有效、及时地处理数据,并能保证数据的一致性和完整性。

(1)相互关联的数据集合。数据库中的数据不是孤立的,数据与数据之间是相互关联的。也就是说,在数据库中不仅要能够表示数据本身,还要能够表示数据与数据之间的联系。比如在学籍管理中,有学生和课程两类数据,在数据库中除了要存放这两类数据之外,还要存放哪些学生选修了哪些课程或哪些课程由哪些学生选修这样的信息,这就反映了学生数据和课程数据之间的联系。

(2)用综合的方法组织数据。数据库能够根据不同的需要按不同的方法组织数据,如可以用顺序组织方法、索引组织方法、聚集(Cluster)组织方法等。

(3)低冗余与数据共享。由于在数据库技术之前,数据文件都是独立的,所以任何数据文件都必须含有满足某应用的全部数据。比如,人事部门有一个职工文件,教育部门也有一个职工文件,两个部门的职工文件中都有"职工基本情况"的数据,也就是说这一部分数据是重复存储的,如果还有第三、第四个部门也有类似的职工文件,那么重复存储所造成的空间浪费是很大的。在数据库中,可以共享类似"职工基本情况"这样的共用数据,从而降低数据的冗余度。

(4)数据具有较高的独立性。数据独立性是指数据的组织和存储方式与应用程序互不依赖、彼此独立的特性。在数据库技术之前,数据文件的组织方式和应用程序是密切相关的,当改变数据结构时,相应的应用程序也必须随之修改,这样就大大增加了应用程序的开发代价和维护代价。而数据库技术却可以使数据的组织和存储方法与应用程序互不依赖,从而大大降低应用程序的开发代价和维护代价。

(5)保证数据的安全、可靠。数据库技术要能够保证数据库中的数据是安全、可靠的。数据库要有一套安全机制,以便可以有效地防止数据库中的数据被非法使用或非法修改;数据库还要有一套完整的备份和恢复机制,以便保证当数据遭到破坏时(软件或硬件故障引起的),能立刻将数据完全恢复,从而保证系统能够连续、可靠地运行。

(6)最大限度地保证数据的正确性。保证数据正确的特性在数据库中称为数据完整性。在数据库中可以通过建立一些约束条件保证数据库中的数据是正确的。比如输入年龄小于0或者大于200时,数据库能够主动拒绝这类错误。

(7)数据可以并发使用并能同时保证数据的一致性。数据库中的数据是共享的,并且允许多个用户同时使用同一数据,这就要求数据库能够协调一致,保证各个用户之间对数据的操作不发生矛盾和冲突,即在多个用户同时使用数据库的情况下,能够保证数据的一致性和正确性。

2)数据库管理系统

数据库的各种功能和特性,并不是数据库中的数据所固有的,而是靠管理或支持数据库的系统软件——数据库管理系统(DataBase Management System, DBMS)提供的。一个完备的数据库管理系统应该具备上一节提到的各种功能,其任务就是对数据资源进行管理,并且使之能为多个用户共享,同时还能保证数据的安全性、可靠性、完整性、一致性,并要保证数据的高度独立性。一个数据库管理系统应该具备以下功能。

(1)数据库定义功能。可以定义数据库的结构和数据库的存储结构,可以定义数据库中数据之间的联系,可以定义数据的完整性约束条件和保证完整性的触发机制等。

(2)数据库操纵功能。可以完成对数据库中数据的操纵,可以装入、删除、修改数据,可以重新组织数据库的存储结构,可以完成数据库的备份和恢复等操作。

(3)数据库查询功能。可以以各种方式提供灵活的查询功能,可以使用户方便地使用数据库中的数据。

(4)数据库控制功能。可以完成对数据库的安全性控制、完整性控制、多用户环境下的并发控制等各方面的控制。

(5)数据库通信功能。在分布式数据库或提供网络操作功能的数据库中还必须提供数据库的通信功能。

3)数据库管理员

从事数据库管理工作的人员称为数据库管理员(DataBase Administrator, DBA)。DBA有大量的工作要做,既有技术方面的工作,又有管理方面的工作,要参加数据库开发和使用的全部工作。总体来说,DBA的工作可以概括如下。

(1)在数据库规划阶段要参与选择和评价与数据库有关的计算机软件和硬件,要与数据库用户共同确定数据库系统的目标和数据库应用需求,要确定数据库的开发计划。

(2)在数据库设计阶段要负责数据库标准的制定和共用数据字典的研制,要负责各级数据库模式的设计,要负责数据库安全、可靠方面的设计。

(3)在数据库运行阶段首先要负责对用户进行数据库方面的培训;要负责数据库的转储和恢复;要负责对数据库中的数据进行维护;要负责监视数据库的性能,并调整、改善数据库的性能,提高系统的效率;要继续负责数据库安全系统的管理;要在运行过程中发现问题、解决问题。

4)数据库的发展

数据库的核心任务是数据管理,它包括数据的分类、组织、编码、存储、检索和维护等。数据管理经历了以下3个阶段。

(1)人工管理阶段。人工管理阶段是指计算机诞生的初期(20世纪50年代中期以前)。这个时期的计算机技术,从硬件看还没有磁盘这样的可直接存取的存储设备,从软件看没有操作系统,更没有管理数据的软件。这个时期数据管理的特点如下。

①数据不保存。因为计算机主要用于科学计算,一般也不需要长期保存数据,只是在完成某一个计算或课题时才将数据输入,然后不仅原始数据不保存,计算结果也不保存。

②没有文件的概念。这个时期的数据组织必须由每个程序的程序员自行组织和安排。

③一组数据对应一个程序。每组数据只对应一个应用,即使两个程序用到相同的数据,也必须各自定义、各自组织,数据无法共享、无法相互利用和互相参照。因此,程序和程序之间有大量的数据重复。

④没有形成完整的数据管理的概念。由于以上几个特点及没有对数据进行管理的软件系统,所以这个时期的每个程序都要包括数据存取方法、输入输出方法和数据组织方法等。因为程序是直接面向存储结构的,所以存储结构的任何一点修改,都会导致程序的修改,程序与数据不具有独立性。

(2)文件系统阶段。文件系统阶段是指20世纪50年代后期到60年代中期这一阶段。从那时起,计算机不仅大量用于科学计算,也开始大量用于信息管理。像磁盘这样的直接存取存储设备也已经出现,在软件方面也有了操作系统和高级语言,还有了专门用于数据管理的软件,即文件系统(或操作系统的文件管理部分)。这个阶段的数据管理具有以下特点。

①数据可以长期保存在磁盘上,也可以反复使用,即可以经常对文件进行查询、修改、插入和删除等操作。

②操作系统提供了文件管理功能和访问文件的存取方法,程序和数据之间有了数据存取的接口,程序开始通过文件名和数据打交道,可以不再关心数据的物理存放位置。因此,这时也有了数据的物理结构和数据的逻辑结构的区别。程序和数据之间有了一定的独立性。

③文件的形式已经多样化。由于有了磁盘这样的直接存取存储设备,文件也就不再局限于顺序文件,也有了索引文件、链表文件等。因而,对文件的访问可以是顺序访问,也可以是直接访问。但文件之间是独立的,它们之间的联系要通过程序去构造,文件的共享性还比较差。

④有了存储文件以后,数据就不再仅仅属于某个特定的程序,而是可以由多个程序反复使用。但文件结构的设计仍然是基于特定的用途,程序仍然是基于特定的物理结构和存取方法编制的。因此,数据的存储结构和程序之间的依赖关系并未根本改变。

⑤数据的存取基本上以记录为单位。

(3)数据库系统阶段。数据库系统阶段从20世纪60年代后期开始,数据库技术的诞生既有计算机技术的发展做依托,又有数据管理的需求做动力。数据库的数据不再是面向某个应用或某个程序,而是面向整个企业(组织)或整个应用。

把数据库从错误状态恢复到某一个已知的正确状态的功能,称为数据库的恢复。数据恢复的基本原理就是冗余,建立冗余的方法有数据备份和登录日志文件等。可根据故障的不同类型,采用不同的恢复策略。

事务故障的恢复

事务故障的恢复是由系统自动完成的,对用户是透明的(不需要DBA的参与)。其步骤如下:

①反向扫描日志文件,查找该事务的更新操作。

②对该事务的更新操作执行逆操作。

③继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。

④如此处理下去,直至读到此事务的开始标记,事务故障恢复完成。

系统故障的恢复

系统故障的恢复在系统重新启动时自动完成,不需要用户干预。其步骤如下:

①正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做(Redo)队列。同时找出故障发生时尚未完成的事务,将其事务标识记入撤销(Undo)队列。

②对撤销队列中的各个事务进行撤销处理:反向扫描日志文件,对每个Undo事务的更新操作执行逆操作。

③对重做队列中的各个事务进行重做处理:正向扫描日志文件,对每个Redo事务重新执行日志文件登记的操作。

介质故障与病毒破坏的恢复

介质故障与病毒破坏的恢复步骤如下:

①装入最新的数据库后备副本,使数据库恢复到最近一次备份时的一致性状态。

②从故障点开始反向扫描日志文件,找出已提交事务标识并记入Redo队列。

③从起始点开始正向扫描日志文件,根据Redo队列中的记录,重做已完成的任务,将数据库恢复至故障前某一时刻的一致状态。

有检查点的恢复技术

检查点记录的内容可包括建立检查点时刻所有正在执行的事务清单,以及这些事务最近一个日志记录的地址。采用检查点的恢复步骤如下:

①从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。

②由该检查点记录得到检查点建立时所有正在执行的事务清单队列(A)。

③建立重做队列(R)和撤销队列(U),把A队列放入U队列中,R队列为空。

④从检查点开始正向扫描日志文件,若有新开始的事务T1,则把T1放入U队列;若有提交的事务T2,则把T2从U队列移到R队列;直至日志文件结束。

⑤对U队列的每个事务执行Undo操作,对R队列的每个事务执行Redo操作。

67. 通过将一个关系拆分成两个更小的关系来使其满足范式时,必须( )来保持数据的完整性约束

A. 用相同的属性使两个子关系互相关联

B. 移除两个子关系中所有的函数依赖

C. 封锁机制

D. 事务机制

数据库的完整性是指数据的正确性和相容性。数据库是否具备完整性关系到数据库系统能否真实地反映现实世界,因此维护数据库的完整性是非常重要的。

数据库的完整性可分为实体完整性、参照完整性和用户定义的完整性。

实体完整性

实体完整性是基于主码的,一个主码由一个或多个属性组成。实体完整性要求主码中的任一属性(列)不能为空,所谓空值是“不知道”或“无意义”的值。之所以要保证实体完整性,主要是因为在关系中每一个元组的区分是依据主码值的不同,若主码值取空值,则不能标明该元组的存在。

参照完整性

参照完整性是基于外码的,若基本关系R中含有与另一基本关系S的主码PK相对应的属性组FK(FK称为R的外码),则参照完整性要求对R中的每个元组在FK上的值必须是S中某个元组的PK值,或者为空值。

参照完整性的合理性在于R中的外码只能引用S中的主码,不能是S中主码没有的值。如学生和选课表两关系,选课表中的学号是外码,它是学生表的主键,若选课表中出现了某个学生表中没有的学号,即某个学生还没有注册,却已有了选课记录,这显然是不合理的。

对于参照完整性,需要明确以下问题:

(1)外码能否接受空值问题根据实际应用决定。

(2)在被参照关系中删除元组的问题。

.级联删除:将参照关系中所有外码值与被参照关系中要删除元组主码值相同的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去。

.受限删除(一般系统默认):仅当参照关系中没有任何元组的外码值与被参照关系中要删除元组的主码值相同时,系统才可以执行删除操作,否则拒绝执行删除操作。

.置空删除:删除被参照关系的元组,并将参照关系中相应元组的外码值置为空值。

(3)在参照关系中插入元组的问题。

.受限插入:仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。

.递归插入:首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。

用户定义的完整性

实体完整性和参照完整性适用于任何关系数据库系统。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

如果在一条语句执行完后立即检查,则称立即执行约束;如果在整个事务执行结束后再进行检查,则称延迟执行约束。

触发器

触发器(Trigger)是在关系数据库管理系统中应用得比较多的一种完整性保护措施。触发器的功能一般比完整性约束要强得多。一般而言,在完整性约束功能中,当系统检查出数据中有违反完整性约束条件时,仅给出必要提示以通知用户,仅此而已。而触发器的功能则不仅仅起提示作用,它还会引起系统内自动进行某些操作以消除违反完整性约束条件所引起的负面影响。

在目前数据库中事件一般表示为数据的插入、修改、删除等操作。触发器除了有完整性保护功能外,还有安全性保护功能。

非空约束

非空是一个规则,是对声明了非空约束的字段限制其取值域不能为空。它不允许在对一列的数据插入或更新时取NULL值。在默认情况下,所有的列都是允许填充NULL值的,只有在列声明了NOT NULL的列值或其他已经包含了NOT NULL约束的列值时,系统强制要求任何时候都不能填充NULL值。非空约束通常会包含在相关的其他约束上,如主键约束、候选键约束等。因为索引是不对NULL值进行存储的,所以,如果希望使用索引进行表数据的查询,那么必须尽量地使某个要索引的列不包含NULL值。例如,下面语句对emp表的ename字段声明了非空约束。

对于表emp,如果已经有了数据,而且ename列中已存在NULL值,则该操作将被禁止。只要将空值替换或将对应的行删除,该语句还是可以被允许的。当然,对于不明确的列但又不能为空时,可以使用默认值(default)对列值做默认处理,这样也可以远离NULL值对列的影响。

CHECK约束

相对于非空约束,CHECK约束能更灵活地限制某字段取值的值域。客观地说,非空约束只是CHECK约束的一个特例而已。CHECK约束需要设计一个表达式,某条记录的某(些)字段的值如果使这个表达式为假,则这条记录被禁止;反之则被允许。如果定义一个CHECK约束设计一个字段不为空的表达式,那么效果就跟非空约束一样了。CHECK约束设计的表达式具体应用到某条将要进行操作的记录的某(些)字段时,只有三个值——true、false、unknown,表达式值为false时将要进行的操作被禁止,其他的则允许。在CHECK约束的表达式中有如下要求:

(1)该表达式在使用数据插入或更新操作的值时,必须是可以做出逻辑判断的表达式。

(2)该表达式不可以使用嵌套查询和序列器。

(3)该表达式不可以使用SQL函数。

(4)该表达式不可以使用自定义函数。

(5)该表达式不可以使用DBMS的伪字段(比如Oracle中的rownum、level等)。

下面语句说明如何在创建表的语句中声明CHECK约束。

该语句为表Dept_tab中的Loc字段声明了名为Loc_check1的CHECK约束,这个约束要求Loc字段只能填写北京、上海、广州中的一个,否则操作将被禁止。

主键约束

主键是能唯一标识元组的最小属性集,并且是在数据库中被标记为primary key的属性集。如果某个表的某(些)字段声明为主键,那么这些字段就要遵守如下两条规则。

(1)在这些作为主键的字段中任何字段任何行都不能为空。

(2)在这些作为主键的字段中任何两行之间的组合取值不能重复。

下面语句是在创建表的语句中声明了主键约束。

该语句在表dept中声明了字段deptno为该表的主键,这个主键约束并未命名,它的名称可以由系统自动产生。再看下面的语句:

该语句在表emp中声明了字段empno为主键,同时命名该主键约束为epk。

候选键约束

能唯一标识元组的最小属性集,但在数据库中未被标记为PRIMARY KEY,这样的属性集称为候选键。这里的候选键实质就是唯一性约束。它的规则要求与主键的规则要求一样,只是未被声明为主键而已。标准SQL并没有直接定义候选键,候选键取值不能为空和不取重复值的约束可以通过UNIQUE NOT NULL来实现,也可以通过UNIQUE KEY来实现,具体要根据不同的DBMS而定。下列语句在创建表中声明了候选键约束。

该语句为表emp的empno字段声明了一个叫euk的唯一性约束。

外键约束

外键是指在关系模式R中作为候选键的属性集,但在关系模式T中不是候选键。则对于T来说,这些属性集称为相对于R的外键。通常外键在数据库中会被标记为FOREIGN KEY字样。在这里,称R为父模式,T为子模式。通俗地说,就是父表中的主键字段被子表中某个字段引用,那么子表的这个字段则应声明为外键,而父表的那个字段可以声明为主键,也可以声明为唯一键(候选键)。一旦子表的字段被声明为父表的外键,同样的一个字段在父表中称为引用的父键,在子表中称为引用的子键。子键的取值应遵守如下规则,否则将被禁止。

(1)每个子键的取值不能取父键中取值以外的值,但空除外。

(2)对于父键是组合字段的,子键也应是组合字段。父键要求能唯一地标识父表的每一条记录,而子键不要求能唯一标识子表的每一条记录。

(3)对于组合键,子键为空时,所有键的成员字段都为空,不允许部分为空。

一个子表可以有多个子键,每个子键可以对应不同父表的父键。如果是组合键,那么同一个字段可能作为不同外键的成员。当然,子表和父表是相对的,子表如果有唯一键被其他表引用,那么这时的子表对于其他表关于某键,它又是父表。外键的引入,主要是为了表示表间的一对多问题。下面的语句说明了两个表间的外键引用情况。

这两条语句创建了dept和emp两个表,其中dept表中的deptno是它的主键,它被表emp引用。在emp中也有个同样名字的deptno字段,这个字段被声明为引用dept.deptno字段的外键。那么dept表是父表,deptno构成了引用中父表的父键;emp表是子表,deptno构成了引用中子表的子键。

因为外键是引用父表父键的子表的子键,所以父表的数据是引用的基础。一旦父表数据被修改或删除,引用也会造成相关的影响,表现在子表和子键上,这就需要做出相应的规则来约定父表父键发生改动后子表子键如何来进行维护活动。根据这种活动,将子表的外键分为三大类。

(1)禁止更新和删除父键,许多DBMS默认为这一类外键约束。一旦父表的父键被某个子表的子键引用了,那么父表中已有的数据是禁止修改和删除的。

(2)删除或更新父表数据的同时删除或更新子表子键中对应父键取值的行。

(3)删除或更新父表数据的同时将子表中对应父键的子键的取值设置为NULL。

加入这三种外键约束声明的语句可以如下所示:

该语句说明外键deptno默认为第一类。

该语句声明一个第二类的外键。

该语句声明一个第三类的外键。

(1)第一范式(1NF):如果关系模式R的每个关系r的属性值都是不可分的原子值,那么称R是第一范式的模式,r是规范化的关系。关系数据库研究的关系都是规范化的关系。

(2)第二范式(2NF):若关系模式R是1NF,且每个非主属性完全函数依赖于候选键,那么称R是2NF模式。

(3)第三范式(3NF):如果关系模式R是1NF,且每个非主属性都不传递依赖于R的候选码,则称R是3NF。

(4)BC范式(BCNF):若关系模式R是1NF,且每个属性都不传递依赖于R的候选键,那么称R是BCNF模式。

上述4种范式之间有如下联系:1NF2NF3NFBCNF。

68. 下列描述中,( )不是分布式数据库数据透明性的表现形式。

A. 代码透明性

B. 分片透明性

C. 位置透明性

D. 模型透明性

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

69. 分布式数据库的 CAP理论指的是:对于一个分布式数据库系统,一致性、可用性和分区容错性这三个特点,最多只能满足( )个。

A. 0

B. 1

C. 2

D. 3

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

简单地说,数据库系统就是基于数据库的计算机应用系统。这样一个系统包括以下内容。

①以数据为主体的数据库。

②管理数据库的系统(DBMS)。

③支持数据库系统的计算机硬件环境和操作系统环境。

④管理和使用数据库系统的人——数据库管理员。

1)数据库的定义和特征

数据库,顾名思义就是存放数据的仓库,这种想当然的理解是不准确的。数据库对应的英文单词是DataBase,如果直译则是数据基地;而数据仓库则另有其词DataWarehouse。所以数据库和数据仓库不是同义词,数据仓库是在数据库技术的基础上发展起来的又一新的应用领域。

数据库技术发展到今天已经是一门成熟的技术,但却没有一个被普遍接受的、严格的定义。数据库是相互关联数据的集合,这是大家公认的数据库的基本特征之一。下面一段话概括了数据库应该具备的一些特征,也可以把它作为数据库的定义。

数据库是相互关联数据的集合,它用综合的方法组织数据,具有较小的数据冗余,可供多个用户共享,具有较高的数据独立性,具有安全控制机制,能够保证数据的安全、可靠,允许并发地使用数据库,能有效、及时地处理数据,并能保证数据的一致性和完整性。

(1)相互关联的数据集合。数据库中的数据不是孤立的,数据与数据之间是相互关联的。也就是说,在数据库中不仅要能够表示数据本身,还要能够表示数据与数据之间的联系。比如在学籍管理中,有学生和课程两类数据,在数据库中除了要存放这两类数据之外,还要存放哪些学生选修了哪些课程或哪些课程由哪些学生选修这样的信息,这就反映了学生数据和课程数据之间的联系。

(2)用综合的方法组织数据。数据库能够根据不同的需要按不同的方法组织数据,如可以用顺序组织方法、索引组织方法、聚集(Cluster)组织方法等。

(3)低冗余与数据共享。由于在数据库技术之前,数据文件都是独立的,所以任何数据文件都必须含有满足某应用的全部数据。比如,人事部门有一个职工文件,教育部门也有一个职工文件,两个部门的职工文件中都有"职工基本情况"的数据,也就是说这一部分数据是重复存储的,如果还有第三、第四个部门也有类似的职工文件,那么重复存储所造成的空间浪费是很大的。在数据库中,可以共享类似"职工基本情况"这样的共用数据,从而降低数据的冗余度。

(4)数据具有较高的独立性。数据独立性是指数据的组织和存储方式与应用程序互不依赖、彼此独立的特性。在数据库技术之前,数据文件的组织方式和应用程序是密切相关的,当改变数据结构时,相应的应用程序也必须随之修改,这样就大大增加了应用程序的开发代价和维护代价。而数据库技术却可以使数据的组织和存储方法与应用程序互不依赖,从而大大降低应用程序的开发代价和维护代价。

(5)保证数据的安全、可靠。数据库技术要能够保证数据库中的数据是安全、可靠的。数据库要有一套安全机制,以便可以有效地防止数据库中的数据被非法使用或非法修改;数据库还要有一套完整的备份和恢复机制,以便保证当数据遭到破坏时(软件或硬件故障引起的),能立刻将数据完全恢复,从而保证系统能够连续、可靠地运行。

(6)最大限度地保证数据的正确性。保证数据正确的特性在数据库中称为数据完整性。在数据库中可以通过建立一些约束条件保证数据库中的数据是正确的。比如输入年龄小于0或者大于200时,数据库能够主动拒绝这类错误。

(7)数据可以并发使用并能同时保证数据的一致性。数据库中的数据是共享的,并且允许多个用户同时使用同一数据,这就要求数据库能够协调一致,保证各个用户之间对数据的操作不发生矛盾和冲突,即在多个用户同时使用数据库的情况下,能够保证数据的一致性和正确性。

2)数据库管理系统

数据库的各种功能和特性,并不是数据库中的数据所固有的,而是靠管理或支持数据库的系统软件——数据库管理系统(DataBase Management System, DBMS)提供的。一个完备的数据库管理系统应该具备上一节提到的各种功能,其任务就是对数据资源进行管理,并且使之能为多个用户共享,同时还能保证数据的安全性、可靠性、完整性、一致性,并要保证数据的高度独立性。一个数据库管理系统应该具备以下功能。

(1)数据库定义功能。可以定义数据库的结构和数据库的存储结构,可以定义数据库中数据之间的联系,可以定义数据的完整性约束条件和保证完整性的触发机制等。

(2)数据库操纵功能。可以完成对数据库中数据的操纵,可以装入、删除、修改数据,可以重新组织数据库的存储结构,可以完成数据库的备份和恢复等操作。

(3)数据库查询功能。可以以各种方式提供灵活的查询功能,可以使用户方便地使用数据库中的数据。

(4)数据库控制功能。可以完成对数据库的安全性控制、完整性控制、多用户环境下的并发控制等各方面的控制。

(5)数据库通信功能。在分布式数据库或提供网络操作功能的数据库中还必须提供数据库的通信功能。

3)数据库管理员

从事数据库管理工作的人员称为数据库管理员(DataBase Administrator, DBA)。DBA有大量的工作要做,既有技术方面的工作,又有管理方面的工作,要参加数据库开发和使用的全部工作。总体来说,DBA的工作可以概括如下。

(1)在数据库规划阶段要参与选择和评价与数据库有关的计算机软件和硬件,要与数据库用户共同确定数据库系统的目标和数据库应用需求,要确定数据库的开发计划。

(2)在数据库设计阶段要负责数据库标准的制定和共用数据字典的研制,要负责各级数据库模式的设计,要负责数据库安全、可靠方面的设计。

(3)在数据库运行阶段首先要负责对用户进行数据库方面的培训;要负责数据库的转储和恢复;要负责对数据库中的数据进行维护;要负责监视数据库的性能,并调整、改善数据库的性能,提高系统的效率;要继续负责数据库安全系统的管理;要在运行过程中发现问题、解决问题。

4)数据库的发展

数据库的核心任务是数据管理,它包括数据的分类、组织、编码、存储、检索和维护等。数据管理经历了以下3个阶段。

(1)人工管理阶段。人工管理阶段是指计算机诞生的初期(20世纪50年代中期以前)。这个时期的计算机技术,从硬件看还没有磁盘这样的可直接存取的存储设备,从软件看没有操作系统,更没有管理数据的软件。这个时期数据管理的特点如下。

①数据不保存。因为计算机主要用于科学计算,一般也不需要长期保存数据,只是在完成某一个计算或课题时才将数据输入,然后不仅原始数据不保存,计算结果也不保存。

②没有文件的概念。这个时期的数据组织必须由每个程序的程序员自行组织和安排。

③一组数据对应一个程序。每组数据只对应一个应用,即使两个程序用到相同的数据,也必须各自定义、各自组织,数据无法共享、无法相互利用和互相参照。因此,程序和程序之间有大量的数据重复。

④没有形成完整的数据管理的概念。由于以上几个特点及没有对数据进行管理的软件系统,所以这个时期的每个程序都要包括数据存取方法、输入输出方法和数据组织方法等。因为程序是直接面向存储结构的,所以存储结构的任何一点修改,都会导致程序的修改,程序与数据不具有独立性。

(2)文件系统阶段。文件系统阶段是指20世纪50年代后期到60年代中期这一阶段。从那时起,计算机不仅大量用于科学计算,也开始大量用于信息管理。像磁盘这样的直接存取存储设备也已经出现,在软件方面也有了操作系统和高级语言,还有了专门用于数据管理的软件,即文件系统(或操作系统的文件管理部分)。这个阶段的数据管理具有以下特点。

①数据可以长期保存在磁盘上,也可以反复使用,即可以经常对文件进行查询、修改、插入和删除等操作。

②操作系统提供了文件管理功能和访问文件的存取方法,程序和数据之间有了数据存取的接口,程序开始通过文件名和数据打交道,可以不再关心数据的物理存放位置。因此,这时也有了数据的物理结构和数据的逻辑结构的区别。程序和数据之间有了一定的独立性。

③文件的形式已经多样化。由于有了磁盘这样的直接存取存储设备,文件也就不再局限于顺序文件,也有了索引文件、链表文件等。因而,对文件的访问可以是顺序访问,也可以是直接访问。但文件之间是独立的,它们之间的联系要通过程序去构造,文件的共享性还比较差。

④有了存储文件以后,数据就不再仅仅属于某个特定的程序,而是可以由多个程序反复使用。但文件结构的设计仍然是基于特定的用途,程序仍然是基于特定的物理结构和存取方法编制的。因此,数据的存储结构和程序之间的依赖关系并未根本改变。

⑤数据的存取基本上以记录为单位。

(3)数据库系统阶段。数据库系统阶段从20世纪60年代后期开始,数据库技术的诞生既有计算机技术的发展做依托,又有数据管理的需求做动力。数据库的数据不再是面向某个应用或某个程序,而是面向整个企业(组织)或整个应用。

对于多界面的设计,在内容表达、风格、布局、位置、色调、操作方式等方面应一致,统一的模式便于用户快速掌握使用方法。应使设计的所有界面围绕着同一个主题,使用具有共性的对象或反复使用同形对象,使画面产生共同的风格,具有整体统一和协调的感觉。例如,在所有界面中添加具有同样特征的按钮。

提高计算机可靠性的技术可以分为避错技术和容错技术。避错是指预防和避免系统在运行中出错。容错是指系统在其某一组件故障存在的情况下不失效,仍然能够正常工作的特性。简单地说,容错就是当计算机由于种种原因在系统中出现了数据、文件损坏或丢失时,系统能够自动将这些损坏或丢失的文件和数据恢复到发生事故以前的状态,使系统能够连续正常运行。容错功能一般通过冗余组件设计来实现。计算机系统的容错性通常可以从系统的可靠性、可用性和可测性等方面来衡量。

冗余技术是计算机容错技术的基础,一般可分为下列几种类型。

(1)硬件冗余。以检测或屏蔽故障为目的而增加一定硬件设备的方法。

(2)软件冗余。为了检测或屏蔽软件中的差错而增加一些在正常运行时所不需要的软件。

(3)信息冗余。除实现正常功能所需要的信息外,再添加一些信息,以保证运行结果正确性的方法。纠错码就是信息冗余的例子。

(4)时间冗余。使用附加一定时间的方法完成系统功能。这些附加的时间主要用在故障检测、故障屏蔽等方面。

在20世纪60年代,主要利用双处理机或双机的方法来达到容错的目的。例如把关键的元件(处理机、存储器等)或整个计算机设置两套:一套在系统运行时使用,另一套用做备份。根据系统的工作情况又可分为热备份和冷备份两种。

(1)热备份(双重系统):两套系统同时同步运行,当联机子系统检测到错误时,退出服务进行检修,而由热备份子系统接替工作。

(2)冷备份(双工系统):处于冷备份的子系统平时停机,或者运行与联机系统无关的运算,当联机子系统产生故障时,人工或自动进行切换,使冷备份系统成为联机系统。在冷备份时,不能保证从程序端点处精确地连续工作,因为备份机不能取得原来机器上当前运行的全部数据。

20世纪70年代中期出现了软件和硬件结构的容错方法。该方法在操作系统的层次上支持联机维修,即故障部分退出后运行、进行维修并重新投入运行都不影响正在运行的应用程序。该结构的特点是系统内包括双处理器、双存储器、双输入输出控制器、不间断工作的电源,以及与之适应的操作系统等。因此上述硬件的任何一部分发生故障都不会影响系统的继续工作。系统容错是在操作系统控制下进行的,在每个处理机上都保持了反映所有系统资源状态的表格,以及本机和其他处理机的工作进程。

分布式数据库系统是在集中式数据库系统技术的基础上发展起来的,具有如下特点:

(1)数据独立性:在分布式数据库系统中,数据独立性这一特性更加重要,并具有更多的内容。除了数据的逻辑独立性与物理独立性外,还有数据分布独立性(分布透明性)。

(2)集中与自治共享结合的控制结构:各局部的DBMS可以独立地管理局部数据库,具有自治的功能。同时,系统又设有集中控制机制,协调各局部DBMS的工作,执行全局应用。

(3)适当增加数据冗余度:在不同的场地存储同一数据的多个副本,这样可以提高系统的可靠性、可用性,同时也能提高系统性能。

(4)全局的一致性、可串行性和可恢复性。

分布式数据库系统的目标,主要包括技术和组织两方面的目标:

(1)适应部门分布的组织结构,降低费用。

(2)提高系统的可靠性和可用性。

(3)充分利用数据库资源,提高现有集中式数据库的利用率。

(4)逐步扩展处理能力和系统规模。

在集中式系统中,主要目标是减少对磁盘的访问次数。对于分布式系统,压倒一切的性能目标是使通过网络传送信息的次数和数据量最小。

分布式数据存储

分布式数据存储可以从数据分配和数据分片两个角度考察。数据分配是指数据在计算机网络各场地上的分配策略。包括:

(1)集中式:所有数据均安排在同一个场地上。

(2)分割式:所有数据只有一份,分别被安置在若干个场地。

(3)全复制式:数据在每个场地重复存储。

(4)混合式:数据库分成若干可相交的子集,每一子集安置在一个或多个场地上,但是每一场地未必保存全部数据。

在实际应用中,对于上述分配策略,可以从4个方面进行评估,分别是存储代价、可靠性、检索代价、更新代价。其中存储代价和可靠性是一对矛盾的因素,检索代价和更新代价也是一对矛盾的因素。

数据分片是指数据存放单位不是全部关系,而是关系的一个片段,也就是关系的一部分。包括:

(1)水平分片:按一定的条件把全局关系的所有元组划分成若干不相交的子集,每个子集为关系的一个片段。

(2)垂直分片:把一个全局关系的属性集分成若干子集,并在这些子集上做投影运算,每个投影为垂直分片。

(3)混合型分片:将水平分片与垂直分片方式综合使用则为混合型分片。

不管是按哪种方式进行分片,数据分片都应遵循下列基本准则:

(1)完备性条件:必须把全局关系的所有数据映射到各个片段中,绝不允许发生属于全局关系的某个数据不属于任何一个片段。

(2)重构条件:划分所采用的方法必须确保能够由各个片段重建全局关系。

(3)不相交条件:要求一个全局关系被划分后得到的各个数据片段互相不重叠。

分布式数据库系统的架构

分布式DBS的架构分为四级,分别是全局外模式、全局概念模式、分片模式和分布模式,如下图所示。

分布式数据库系统的架构

(1)全局外模式:它们是全局应用的用户视图,是全局概念模式的子集。

(2)全局概念模式:全局概念模式定义了分布式数据库中所有数据的逻辑结构。

(3)分片模式:分片模式定义片段以及定义全局关系与片段之间的映象。这种映象是一对多的,即每个片段来自一个全局关系,而一个全局关系可分成多个片段。

(4)分布模式:片段是全局关系的逻辑部分,一个片段在物理上可以分配到网络的不同结点上。分布模式根据数据分配策略的选择定义片段的存放场地。

从上图中可以看出,分布式DBS的分层架构使数据分片和数据分配分离,形成了数据分布独立性概念。数据分布独立性也称为分布透明性,是指用户不必关系数据的逻辑分片,不必关心数据物理位置分配的细节,也不必关心各个场地上数据库数据模型。分布透明性可归入物理独立性的范围,包括3个层次,分别是分片透明性、位置透明性和局部数据模型透明性。

70. NOSQL数据库的四大分类是指( )。

A. 键值存储数据库,列存储数据库,文档型数据库,关系型数据库

B. 列存储数据库,文档型数据库,关系型数据库,分布式数据库

C. 键值存储数据库,列存储数据库,文档型数据库,图数据库

D. 列存储数据库,文档型数据库,关系型数据库,图数据库

数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

系统使用的所有数据存储在一个或几个数据库中。

71. A database system is a ollction of itererelated data and a set of programs that allow users to access and modify these data. A major purpose of a database system is to provide users with an(71)view of the data. That is, the system hides certain details of how the data are stored and maintained. For the system to be usable, it must retrieve data(72)。 The need for efficiency has led designers to use complex data(73)to represent data in the database. Since many database-system users are not computer trained, developers hide the complexity from users through several levels of abstraction, to simplify users' interactions with the system. Physical level is the lowest level of abstraction that describes(74)the data are actually stored. Logical level is the next-higher level of abstraction that describes(75)data are stored in the database, and what relationships exist among those data. View level is the highest level of abstraction that describes only part of the entire database.

A. abstract

B. physical

C. administrator

D. operator

72. A database system is a ollction of itererelated data and a set of programs that allow users to access and modify these data. A major purpose of a database system is to provide users with an(71)view of the data. That is, the system hides certain details of how the data are stored and maintained. For the system to be usable, it must retrieve data(72)。 The need for efficiency has led designers to use complex data(73)to represent data in the database. Since many database-system users are not computer trained, developers hide the complexity from users through several levels of abstraction, to simplify users' interactions with the system. Physical level is the lowest level of abstraction that describes(74)the data are actually stored. Logical level is the next-higher level of abstraction that describes(75)data are stored in the database, and what relationships exist among those data. View level is the highest level of abstraction that describes only part of the entire database.

A. completely

B. safely

C. usefully

D. fficiently

73. A database system is a ollction of itererelated data and a set of programs that allow users to access and modify these data. A major purpose of a database system is to provide users with an(71)view of the data. That is, the system hides certain details of how the data are stored and maintained. For the system to be usable, it must retrieve data(72)。 The need for efficiency has led designers to use complex data(73)to represent data in the database. Since many database-system users are not computer trained, developers hide the complexity from users through several levels of abstraction, to simplify users' interactions with the system. Physical level is the lowest level of abstraction that describes(74)the data are actually stored. Logical level is the next-higher level of abstraction that describes(75)data are stored in the database, and what relationships exist among those data. View level is the highest level of abstraction that describes only part of the entire database.

A. files

B. structures

C. graphs

D. flows

74. A database system is a ollction of itererelated data and a set of programs that allow users to access and modify these data. A major purpose of a database system is to provide users with an(71)view of the data. That is, the system hides certain details of how the data are stored and maintained. For the system to be usable, it must retrieve data(72)。 The need for efficiency has led designers to use complex data(73)to represent data in the database. Since many database-system users are not computer trained, developers hide the complexity from users through several levels of abstraction, to simplify users' interactions with the system. Physical level is the lowest level of abstraction that describes(74)the data are actually stored. Logical level is the next-higher level of abstraction that describes(75)data are stored in the database, and what relationships exist among those data. View level is the highest level of abstraction that describes only part of the entire database.

A. how

B. what

C. which

D. when

75. A database system is a ollction of itererelated data and a set of programs that allow users to access and modify these data. A major purpose of a database system is to provide users with an(71)view of the data. That is, the system hides certain details of how the data are stored and maintained. For the system to be usable, it must retrieve data(72)。 The need for efficiency has led designers to use complex data(73)to represent data in the database. Since many database-system users are not computer trained, developers hide the complexity from users through several levels of abstraction, to simplify users' interactions with the system. Physical level is the lowest level of abstraction that describes(74)the data are actually stored. Logical level is the next-higher level of abstraction that describes(75)data are stored in the database, and what relationships exist among those data. View level is the highest level of abstraction that describes only part of the entire database.

A. how

B. what

C. which

D. when

获取标准答案和详细的答案解析请阅读全文

未经允许不得转载!2020年下半年 数据库系统工程师 上午试卷 综合知识 软考真题【含答案和答案解析】