资源描述
全国计算机等级考试——二级公共基础知识辅导讲义
第一章 数据结构与算法
本章应考点拨:本章内容在笔试中会出现 5-6 个题目,是公共基础知识部分出题量比较多的一章,所占分值也比较大,约10分。
1.1 算法
**1、算法是指对解题方案的准确而完整的描述,是一组严谨地定义运算顺序的规则,并且每一个规则都是有效和明确的,此顺序将在有限的次数下终止。
*算法不等于程序,也不等于计算方法。程序的编制不可能优于算法的设计。
**2、算法的基本特征
(1)可行性。针对实际问题而设计的算法,执行后能够得到满意的结果。
(2)确定性。算法中的每一步骤都必须有明确定义,不充许有模棱两可的解释和多义性。
(3)有穷性。算法必须在有限的时间内完成。有两重含义,一是算法中的操作 步骤为有限个,二是每个步骤都能在有限时间内完成。
(4)拥有足够的情报。为算法所提供的情报是否足够。
3、算法的基本要素
算法一般由两种基本要素构成:一是对数据对象的运算和操作;二是算法的控制结构。
基本运算和操作有4类:算术运算、逻辑运算、关系运算、数据传输。
算法的控制结构:顺序结构、选择结构、循环结构。
4、算法设计的基本方法
列举法、归纳法、递推、递归、减半递推技术、回溯法
**△△5、算法复杂度主要包括时间复杂度和空间复杂度。
(1)算法时间复杂度是指执行算法所需要的计算工作量,算法的工作量用算法所执行的基本运算的次数来度量。一般情况下,算法所执行的基本运算次数与问题的规模有关,可以用两种方法来分析算法的工作量:平均性态分析和最坏情况分析。在度量一个算法的工作量时,与所使用的计算机、程序设计语言及程序编制者无关,而且还与算法实现过程中的许多细节无关。
(2)算法空间复杂度是指执行这个算法所需要的内存空间。算法执行时所占用的存储空间包括算法程序所占的空间、输入的初始数据所占的存储空间,以及算法执行过程中所需要的额外空间。
△△1.2 数据结构的基本概念
**1、数据结构是指相互有关联的数据元素的集合。即数据的组织形式。
**2、数据结构主要研究和讨论以下三个方面的问题:
(1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构。
数据的逻辑结构包含:1)表示数据元素的信息;2)表示各数据元素之间的前后件关系。
例如:春,夏,秋,冬
B=(D,R) B:数据结构 D: 数据元素的集合 R:数据元素之间的关系
D={春,夏,秋,冬}
R={(春,夏),(夏,秋),(秋,冬)}
(2)在对数据进行处理时,各数据元素在计算机中的存储关系(即物理关系),即数据的存储结构。
数据的存储结构有顺序、链接、索引等。
1)顺序存储。它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里, 结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构。
2)链接存储。它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构。
3)索引存储:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
**数据的逻辑结构反映数据元素之间的逻辑关系,数据的存储结构(也称数据的物理结构)是数据的逻辑结构在计算机存储空间中的存放形式,因此,逻辑结构和存储结构不是一一对应的。同一种数据的逻辑结构可以根据需要表示成多种存储结构。采用不同的存储结构,其数据处理的效率是不同的。程序的执行效率与数据的逻辑结构和存储结构密切相关。
(3)对各种数据结构进行的运算。
3、数据结构的图形表示
一个数据结构除了用二元关系表示外,还可以直观地用图形表示。在数据结构的图形表示中,对于数据集合D中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,并简称为结点;为了进一步表示各数据元素之间的前后件关系,对于关系R中的每一个二元组,用一条有向线段从前件结点指向后件结点。
注:在数据结构中,没有前件的结点称为根结点。没有后件的结点称为终端结点(也称为叶子结点)。
△△4、线性结构和非线性结构
根据数据结构中各数据元素之间前后关系的复杂程度,可以将数据结构分为两大类型:线性结构(又称线性表)和非线性结构。
**(1)线性结构(非空的数据结构)条件:1)有且只有一个根结点;2)每一个结点最多有一个前件,也最多有一个后件。即数据元素有限并有序。
线性表:最简单、最常用的数据结构
如:(春,夏,秋,冬)
**常见的线性结构有线性表、栈、队列和线性链表等。
注:在一个线性结构中插入或删除任何一个结点后还应该是线性结构。
**(2)非线性结构:不满足线性结构条件的数据结构。
**常见的非线性结构有树、二叉树和图等。
1.3 线性表及其顺序存储结构
1、线性表的基本概念
线性表是一个线性结构,由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。线性表是由 n(n≥0)个数据元素组成的一个有限序列,表中的每一个数据元素,除了第一个外,有且只有一个前件,除了最后一个外, 有且只有一个后件。
**对上面条件的具体解释,线性表的基本概念:
1)有且只有一个根结点,它无前件
2)有且只有一个终端结点,它无后件。
3)除根与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。
线性表中数据元素的个数n称为线性表的长度。线性表可以为空表n=0。
**线性表是一种存储结构,它的存储方式:顺序和链式。
**△△2、线性表的顺序存储结构具有两个基本特点:(1)线性表中所有元素所占的存储空间是连续的;(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。即顺序存储结构要求逻辑上相邻的元素物理上也相邻。
**由此可以看出,在线性表的顺序存储结构中,其前后件两个元素在存储空间中是紧邻的,且前件元素一定存储在后件元素的前面,可以通过计算机直接确定第i个结点的存储地址。
△△3、顺序表的插入、删除运算
**(1)顺序表的插入运算:在一般情况下,要在第i(1≤i≤n)个元素之前插入一个新元素时,首先要从最后一个(即第n个)元素开始,直到第i个元素之间共 n-i+1 个元素依次向后移动一个位置,移动结束后,第i个位置就被空出,然后将新元素插入到第i项。插入结束后,线性表的长度就增加了1。
**顺性表的插入运算时需要移动元素,在等概率情况下,平均需要移动n/2个元素。
**(2)顺序表的删除运算:在一般情况下,要删除第i(1≤i≤n)个元素时,则要从第i+1个元素开始,直到第n个元素之间共 n-i 个元素依次向前移动一个位置。删除结束后,线性表的长度就减小了1。
**进行顺性表的删除运算时也需要移动元素,在等概率情况下,平均需要移动(n-1)/2 个元素。插入、删除运算不方便。
1.4 栈和队列
**△△1、栈及其基本运算
栈是只允许在一端进行插入与删除运算的线性表,是一种操作受限的线性表。
在栈中,允许插入与删除的一端称为栈顶(top),不允许插入与删除的另一端称为栈底(bottom)。
栈顶元素总是最后被插入的元素,栈底元素总是最先被插入的元素。即栈是按照“先进后出”(FILO)或“后进先出”(LIFO)的原则组织数据的。
栈具有记忆作用。
栈的基本运算:1)插入元素称为入栈运算:先将栈顶指针加1,然后将新元素插入到栈顶指针指向的位置;2)删除元素称为退栈运算:先将栈顶元素(栈顶指针指向的元素)赋给一个指定的变量,然后将栈顶指针减1;3)读栈顶元素是将栈顶元素赋给一个指定的变量,此时指针无变化。当栈顶指针为0时,说明栈空。
**△△2、队列及其基本运算
队列是指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表,也是一种操作受限的线性表。尾指针(Rear)指向队尾元素,头指针(front)指向排头元素的前一个位置(队头)。
队列是“先进先出”或“后进后出”的线性表。
队列运算包括:1)入队运算:从队尾插入一个元素;2)退队运算:从队头删除一个元素。
循环队列及其运算:
队列的顺序存储结构通常采用循环队列的形式。
所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置, 因此,从头指针front指向的后一个位置直到队尾指针rear指向的位置之间,所有的元素均为队列中的元素。
**循环队列中元素的个数=rear-front。
1.5 线性链表
1、线性表顺序存储的缺点:(1)插入或删除的运算效率很低。在顺序存储的线性表中,插入或删除数据元素时需要移动大量的数据元素;(2)线性表的顺序存储结构下,线性表的存储空间不便于扩充;(3)线性表的顺序存储结构不便于对存储空间的动态分配。
**△△2、线性链表
线性表的链式存储结构称为线性链表。数据结构中的每一个数据结点对应于一个存储单元,这种存储单元称为存储结点,简称结点。在链式存储方式中,每个结点由两部分组成:一部分用于存放数据元素的值,称为数据域;另一部分用于存放指针,称为指针域,用于指向该结点的前一个或后一个结点(即前件或后件)。如下图所示:
在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致(即是一种物理存储单元上非连续、非顺序的存储结构),而数据元素之间的逻辑关系是由指针域来确定的。
链式存储结构既可以表示线性结构,也可以表示非线性结构。栈和队列也是线性表,也可以采用链式存储结构。
线性链表分为单链表、双向链表和循环链表三种类型。
在单链表中,每一个结点只有一个指针域,由这个指针只能找到其后件结点,而不能找到其前件结点。因此,在某些应用中,对于线性链表中的每个结点设置两个指针,一个称为左指针,指向其前件结点;另一个称为右指针,指向其后件结点,这种链表称为双向链表,如下图所示:
3、线性链表的基本运算
(1)在线性链表中包含指定元素的结点之前插入一个新元素。
**在线性链表中插入元素时,不需要移动数据元素,只需要修改相关结点指针即可,也不会出现“上溢”现象。
(2)在线性链表中删除包含指定元素的结点。
**在线性链表中删除元素时,也不需要移动数据元素,只需要修改相关结点指针即可。
(3)将两个线性链表按要求合并成一个线性链表。
(4)将一个线性链表按要求进行分解。
(5)逆转线性链表。
(6)复制线性链表。
(7)线性链表的排序。
(8)线性链表的查找。
**线性链表不能随机存取。
4、循环链表及其基本运算
在线性链表中,其插入与删除的运算虽然比较方便,但还存在一个问题,在运算过程中对于空表和对第一个结点的处理必须单独考虑,使空表与非空表的运算不统一。为了克服线性链表的这个缺点,可以采用另一种链接方式,即循环链表。
与前面所讨论的线性链表相比,循环链表具有以下两个特点:1)在链表中增加了一个表头结点,其数据域为任意或者根据需要来设置,指针域指向线性表的第一个元素的结点,而循环链表的头指针指向表头结点;2)循环链表中最后一个结点的指针域不是空,而是指向表头结点。即在循环链表中,所有结点的指针构成了一个环状链。下图a是一个非空的循环链表,图b是一个空的循环链表:
循环链表的优点主要体现在两个方面:一是在循环链表中,只要指出表中任何一个结点的位置,就可以从它出发访问到表中其他所有的结点,而线性单链表做不到这一点;二是由于在循环链表中设置了一个表头结点,在任何情况下,循环链表中至少有一个结点存在,从而使空表与非空表的运算统一。
**循环链表是在单链表的基础上增加了一个表头结点,其插入和删除运算与单链表相同。但它可以从任一结点出发来访问表中其他所有结点,并实现空表与非空表的运算的统一。
1.6 树与二叉树
1、树的基本概念
树是一种简单的非线性结构。所有元素之间具有明显的层次特性。在树结构中,每一个结点只有一个前件,称为父结点。没有前件的结点只有一个,称为树的根结点,简称树的根。每一个结点可以有多个后件,称为该结点的子结点。没有后件的结点称为叶子结点。
在树结构中,一个结点所拥有的后件的个数称为该结点的度,所有结点中最大的度称为树的度。根结点在第1层,树的最大层次称为树的深度。
**△△2、二叉树及其基本性质
**(1)什么是二叉树
二叉树是一种很有用的非线性结构,它具有以下两个特点:1)非空二叉树只有一个根结点;2)每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。
**根据二叉树的概念可知,二叉树的度可以为 0(叶结点)、1(只有一棵子树)或 2(有 2 棵子树)。
**(2)二叉树的基本性质
性质1 在二叉树的第k层上,最多有2k-1 (k≥1)个结点。
性质2 深度为m的二叉树最多有个2m-1个结点。
性质3 在任意一棵二叉树中,度数为0的结点(即叶子结点)总比度为2的结点多一个。(n0=n2+1)
性质4 具有n个结点的二叉树,其深度至少为[log2n]+1,其中[ ]表示取log2n的整数部分。
**3、满二叉树与完全二叉树
满二叉树:除最后一层外,每一层上的所有结点都有两个子结点。即在满二叉树的第k层上有2k-1个结点,且深度为m的满二叉树中有2m-1个结点。(叶子在同一层且齐)
完全二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
**根据完全二叉树的定义可得出:度为1的结点的个数为0或1。
满二叉树是完全二叉树,而完全二叉树一般不是满二叉树。
下图a表示的是满二叉树,下图b表示的是完全二叉树:
完全二叉树还具有如下两个特性:
性质5 具有n个结点的完全二叉树深度为[log2n]+1。
性质6(了解)设完全二叉树共有n个结点,如果从根结点开始,按层序(每一层从左到右)用自然数 1,2,…,n 给结点进行编号,则对于编号为 k(k=1,2,…, n)的结点有以下结论:
①若k=1,则该结点为根结点,它没有父结点;若k>1,则该结点的父结点的编号为 INT(k/2)。
②若2k≤n,则编号为k的左子结点编号为2k;否则该结点无左子结点(显然也没有右子结点)。
③若2k+1≤n,则编号为k的右子结点编号为2k+1;否则该结点无右子结点。
4、二叉树的存储结构
**一般二叉树通常采用链式存储结构,对于满二叉树与完全二叉树来说,可以按层序进行顺序存储。
**5、二叉树的遍历
二叉树的遍历是指不重复地访问二叉树中的所有结点。二叉树的遍历可以分为以下三种:
(1)前序遍历(DLR):若二叉树为空,则结束返回。否则:首先访问根结点,然后遍历左子树,最后遍历右子树;并且,在遍历左右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。(先根:根左右)
(2)中序遍历(LDR):若二叉树为空,则结束返回。否则:首先遍历左子树,然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。(中根:左根右)
(3)后序遍历(LRD):若二叉树为空,则结束返回。否则:首先遍历左子树,然后遍历右子树,最后访问根结点,并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。(后根:左右根)
例:
前序遍历:F,C,A,D,B,E,G,H,P
中序遍历:A,C,B,D,F,E,H,G,P
后序遍历:A,B,D,C,H,P,G,E,F
1.7 查找技术
查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。
查找结果:(查找成功:找到;查找不成功:没找到。)
平均查找长度:查找过程中关键字和给定值比较的平均次数。
**△△1、顺序查找
基本思想:从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者相符,查到所要找的元素为止。否则就是表中没有要找的元素,查找不成功。
在平均情况下,利用顺序查找法在线性表中查找一个元素,大约要与线性表中一半的元素进行比较(n/2),最坏情况下需要比较n次。
顺序查找一个具有n个元素的线性表,其平均复杂度为O(n)。
下列两种情况下只能采用顺序查找:
1)如果线性表是无序表(即表中的元素是无序的),则不管是顺序存储结构还是链式存储结构,都只能用顺序查找。
2)即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。
△△2、二分法查找
前提:只适用于顺序存储结构的有序表中进行。
思想:先确定待查找记录所在的范围,然后逐步缩小范围,直到找到或确认找不到该记录为止。 查找过程:
1)若中间项(中间项 mid=(n-1)/2,mid 的值四舍五入取整)的值等于x,则说明已查到;
2)若x小于中间项的值,则在线性表的前半部分查找;
3)若x大于中间项的值,则在线性表的后半部分查找。
例:假设给定有序表中关键字为8,17,25,44,68,77,98,100,将查找k=17的情况描述为如图所示。
[8,17,25,44,68,77,98,100]
low
high
初始状态
[8,17,25],44,68,77,98,100
high
low
mid
一次比较后
[8,17,25],44,68,77,98,100
low
high
mid
两次比较后
二分查找情况示意图
特点:比顺序查找方法效率高。最坏的情况下,需要比较 log2n 次。
**二分法查找只适用于顺序存储的线性表,且表中元素必须按关键字有序(升序) 排列。对于无序线性表和线性表的链式存储结构只能用顺序查找。在长度为n的有序线性表中进行二分法查找,其时间复杂度为O(log2n)。
**1.8 排序技术
排序是指将一个无序序列整理成按值非递减顺序排列的有序序列,即是将无序的记录序列调整为有序记录序列的一种操作。
1、交换类排序法(方法:冒泡排序,快速排序)。
2、插入类排序法(方法:简单插入排序,希尔排序)。
3、选择类排序法(方法:简单选择排序,堆排序)。
总结:各种排序法比较,特别注意时间复杂度。
补充排序方法:
冒泡排序基本思想:(相邻两个元素比较)从表头开始往后扫描线性表,在扫描的过程中逐次比较相邻两个元素的大小。若相邻两个元素中,前面的元素大于后面的元素,则将它们互换。最后就将线性表中的最大者换到了表的最后。然后,从后到前扫描剩下的线性表,同样在扫描的过程中逐次比较相邻两个元素的大小,若相邻两个元素中,后面的元素小于前面的元素,则将它们互换,最后就将剩下线性表中的最小者换到了表的最前面。在上述排序过程中,对线性表的每一次来回扫描后,都将其中的最大者沉到了表的底部,最小者象气泡一样冒到表的前头,冒泡排序由此得名。示意图如下:
快速排序基本思想:从表中选取一个元素(一般取第一个数为标准),设为T,将线性表后面小于T的元素移到前面,而前面大于T的元素移到后面,通过对线性表的一次分割,就以T为分界线,将线性表分成了前后两个子表,且前面子表中的所有元素均不大于T,而后面子表中的所有元素均不小于T。方法:首先,将表的第一个元素赋给T,然后设置两个指针I和J分别指向表的起始与最后的位置。反复操作以下两步:
1)将J逐渐减小,并逐次比较P(J)与T,直到发现一个P(J)<T为止,将P(J)移到P(I)的位置上。
2)将I逐渐减小,并逐次比较P(I)与T,直到发现一个P(I)>T为止,将P(I)移到P(J)的位置上。
上述两个操作交替进行,直到指针I与J指向同一个位置(即I=J)为止,此时将T移到P(I)的位置上。
例,假定一组记录为(46,79,56,38,40,80),对其进行快速排序的第一次划分后的结果为【40,38】,46,【56,79,80】
简单插入排序基本思想:在线性表中,可以想象成只包含第1个元素的有序子表,接下来,从线性表的第2个元素开始直到最后一个元素,逐次将其中的每一个元素插入到前面已经有序的子表中。示意图如下:
希尔排序基本思想:将整个无序序列分割成若干小的子序列进行插入排序。方法:将相隔某个增量H的元素构成一个子序列,在排序过程中,逐次减小这个增量,最后当H减到1时,进行一次插入排序,排序完成。示意图如下:
简单选择排序基本思想:从中选出最小的元素,将它交换到表的最前面。示意图如下:
第二章 程序设计基础
本章应考点拨:本章在考试中会出现约 1 个题目,所占分值大约占 2 分,是出题量较小的一章。本章内容比较少,也很简单,掌握住基本的概念就可以轻松应对考试了,所以在这部分丢分,比较可惜。
2.1 程序设计方法与风格
1、程序设计方法
常用的程序设计方法有:结构化程序设计方法和面向对象方法。
△△2、程序设计风格
**当今主导的程序设计风格是:“清晰第一,效率第二”。
要形成良好的程序设计风格,主要应注重和考虑下述一些因素:
(1)源程序文档化。
1)符号名的命名。符号名能反映它所代表的实际东西,应有一定的实际含义。(见名思义)
2)程序的注释。分为序言性注释和功能性注释。(帮助读者理解程序)
序言性注释:位于程序开头部分,包括程序标题、程序功能说明、主要算法、接口说明、程序位置、开发简历、程序设计者、复审者、复审日期及修改日期等。
功能性注释:嵌在源程序体之中,用于描述其后的语句或程序的主要功能。
3)视觉组织。利用空格、空行、缩进等技巧使程序层次清晰。
(2)数据说明的方法。1)数据说明的次序规范化;2)说明语句中变量安排有序化;3)使用注释来说明复杂数据的结构。
(3)语句的结构。1)在一行内只写一条语句;2)程序编写应优先考虑清晰性;3)程序编写要做到清晰第一,效率第二;4)在保证程序正确的基础上再要求提高效率;5)避免使用临时变量而使程序的可读性下降;6)避免不必要的转移;7)尽量使用库函数;8)避免采用复杂的条件语句;9)尽量减少使用“否定”条件语句;10)数据结构要有利于程序的简化;11)要模块化,使模块功能尽可能单一化;12)利用信息隐蔽,确保每一个模块的独立性;(信息隐蔽是指采用封装技术,将程序模块的实施细节隐藏起来,使模块接口尽量简单。)13)从数据出发去构造程序;14)不要修补不好的程序,要重新编写。
(4)输入和输出。1)对输入数据检验数据的合法性;2)检查输入项的各种重要组合的合法性;3)输入格式要简单,使得输入的步骤和操作尽可能简单;4) 输入数据时,应允许使用自由格式;5)应允许缺省值;6)输入一批数据时,最好使用输入结束标志;7)在以交互式输入/输出方式进行输入时,要在屏幕上使用提示符明确提示输入的请求,同时在数据输入过程中和输入结束时,应在屏幕上给出状态信息;8)当程序设计语言对输入格式有严格要求时,应保持输入格式与输入语句的一致性;给所有的输出加注释,并设计输出报表格式。
2.2 结构化程序设计(面向过程的程序设计方法)
**1、结构化程序设计方法的主要原则可以概括为:自顶向下,逐步求精,模块化, 限制使用 goto 语句。
(1)自顶向下。程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。
(2)逐步求精。对复杂问题,应设计一些子目标作过渡,逐步细化。
(3)模块化。一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,把每个小目标称为一个模块。
(4)限制使用 goto 语句。
**2、结构化程序的基本结构:顺序结构,选择结构,循环(重复)结构。
1)顺序结构。一种简单的程序设计,即按照程序语句行的自然顺序,一条语句一条语句地执行程序,它是最基本、最常用的结构。
2)选择结构。又称分支结构,包括简单选择和多分支选择结构,可根据条件,判断应该选择哪一条分支来执行相应的语句序列。
3)循环结构。又称重复结构,可根据给定的条件,判断是否需要重复执行某一相同的或类似的程序段。
**3、结构化程序设计的好处:程序结构良好、易读、易理解、易维护;提高了编程工作的效率,降低了软件开发成本。
4、结构化程序设计的原则和方法的应用(了解)
在结构化程序设计的具体实施中,注意以下因素:
1)使用顺序、选择和循环三种基本控制结构表示程序的控制逻辑;
2)选用的控制结构只允许一个入口和一个出口。
3)严格控制goto语句的使用。
2.3 面向对象的程序设计
客观世界中任何一个事物都可以被看成是一个对象,面向对象方法是主流软件开发方法。
面向对象方法的主要优点:(1)与人类习惯的思维方法一致;(2)稳定性好;(3)可重用性好(软件的重用是指在不同的软件开发过程中重复使用相同或相似软件的过程);(4)易于开发大型软件产品;(5)可维护性好:软件稳定性好,软件比较容易修改,软件比较容易理解、易于测试与调试。
**面向对象的程序设计主要考虑的是提高软件的可重用性。
△△面向对象方法的基本概念:
**对象是面向对象方法中最基本的概念,可以用来表示客观世界中的任何实体(如桌子、一项计划),对象是实体的抽象。面向对象的程序设计方法中的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,由一组表示其静态特征的属性和它可执行的一组操作组成。对象是属性和方法的封装体。
属性即对象所包含的信息,它在设计对象时确定,一般只能通过执行对象的操作来改变。
操作描述了对象执行的功能,操作也称为方法或服务。操作是对象的动态属性。
**一个对象由对象名、属性和操作三部分组成。
**△△对象的基本特点:标识惟一性,分类性,多态性,封装性,模块独立性好。
(1)标识惟一性。指对象是可区分的,并且由对象的内在本质来区分,而不是通过描述来区分。
(2)分类性。指可以将具有相同属性的操作的对象抽象成类。
(3)多态性。指同一个操作可以是不同对象的行为。
(4)封装性。从外面看只能看到对象的外部特性,即只需知道数据的取值范围和可以对该数据施加的操作,根本无需知道数据的具体结构以及实现操作的算法。对象的内部,即处理能力的实行和内部状态,对外是不可见的。从外面不能直接使用对象的处理能力,也不能直接修改其内部状态,对象的内部状态只能由其自身改变。
**信息隐蔽是通过对象的封装性来实现的。
(5)模块独立性好。对象是面向对象的软件的基本模块,它是由数据及可以对这些数据施加的操作所组成的统一体,而且对象是以数据为中心的,操作围绕对其数据所需做的处理来设置,没有无关的操作。从模块的独立性考虑,对象内部各种元素彼此结合得很紧密,内聚性强。
类:是指将属性,操作相似的对象归为类,即类具有共同属性、共同方法的对象的集合。所以类是对象的抽象,对象是对应类的一个实例。
消息:是一个实例与另一个实例之间传递的信息。消息的组成包括:(1)接收消息的对象的名称;(2)消息标识符,也称消息名;(3)零个或多个参数。
**在面向对象方法中,一个对象请求另一个对象为其服务的方式是通过发送消息。
继承:使用已有的类定义作为基础建立新类的定义技术,即能够直接获得已有的性质和特征,而不必重复定义他们。继承分单继承和多重继承。单继承指一个类只允许有一个父类,多重继承指一个类允许有多个父类。
**类的继承性是类之间共享属性和操作的机制,它提高了软件的可重用性。
多态性是指同样的消息被不同的对象接受时可导致完全不同的行动的现象。
第三章 软件工程基础
本章应考点拨:本章在笔试中一般占8分左右,约3道选择题,1道填空题,是公共基础部分比较重要的一章。从出题的深度来看,本章主要考察对基本概念的识记,有少量对基本原理的理解,没有实际运用,因此考生在复习本章时,重点应放在基本概念的记忆和基本原理的理解上。
3.1 软件工程基本概念
1、软件的相关概念
**计算机软件是包括程序、数据及相关文档的完整集合。
软件的特点包括:1)软件是一种逻辑实体,而不是物理实体,具有抽象性;2)软件的生产与硬件不同,它没有明显的制作过程;3)软件在运行、使用期间不存在磨损、老化问题;4)软件的开发、运行对计算机系统具有依赖性,受计算机系统的限制,这导致了软件移植的问题;5)软件复杂性高,成本昂贵;6) 软件开发涉及诸多的社会因素。
2、软件危机与软件工程
**软件工程源自软件危机。所谓软件危机是泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题。具体的说,在软件开发和维护过程中,软件危机主要表现在:
1)软件需求的增长得不到满足。用户对系统不满意的情况经常发生。
2)软件开发成本和进度无法控制。开发成本超出预算,开发周期大大超过规定日期的情况经常发生。
3)软件质量难以保证。
4)软件不可维护或维护程度非常低。
5)软件的成本不断提高。
6)软件开发生产率的提高跟不上硬件的发展和应用需求的增长。
总之,可以将软件危机可以归结为成本、质量、生产率等问题。
**软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。软件工程的目的就是要建造一个优良的软件系统,它所包含的内容概括为以下两点:
1)软件开发技术,主要有软件开发方法学、开发过程、开发工具和软件工程环境。
2)软件工程管理,主要有软件管理学、软件工程经济学、软件心理学等内容。
**软件工程的主要思想是将工程化原则运用到软件开发过程,它包括3个要素:方法、工具和过程。方法是完成软件工程项目的技术手段;工具是支持软件的开发、管理、文档生成;过程支持软件开发的各个环节的控制、管理。
软件工程过程是把输入转化为输出的一组彼此相关的资源和活动。
**3、软件生命周期
**△△软件生命周期:软件产品从提出、实现、使用维护到停止使用退役的过程。
软件生命周期的主要活动阶段包括:(1)可行性研究与计划制定;(2)需求分析;(3)软件设计;(4)软件实现;(5)软件测试;(6)运行和维护。
△△还可将软件生命周期分为软件定义、软件开发及软件运行维护三个阶段:
1) 软件定义阶段:包括制定计划和需求分析。
制定计划:确定总目标;可行性研究;探讨解决方案;制定开发计划。
需求分析:对待开发软件提出的需求进行分析并给出详细的定义。
2)软件开发阶段:
软件设计:分为概要设计和详细设计两个部分。
软件实现:把软件设计转换成计算机可以接受的程序代码。(编码)
软件测试:在设计测试用例的基础上检验软件的各个组成部分。(写出测试报告)
3)软件运行维护阶段:软件投入运行,并在使用中不断地维护,进行必要的扩充和删改。
**软件生命周期中所花费最多的阶段是软件运行维护阶段。
4、软件工程的目标和与原则
(1)软件工程目标:在给定成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性 且满足用户需求的产品。
(2)软件工程需要达到的基本目标应是:付出较低的开发成本;达到要求的软件功能;取得较好的软件性能;开发的软件易于移植;需要较低的维护费用;能按时完成开发,及时交付使用。
(3)软件工程原则:抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可验证性。
1)抽象:抽取事物最基本的特性和行为,忽略非本质细节,采用分层次抽象,自顶向下,逐层细化的办法控制软件开发过程的复杂性。
2)信息隐蔽:采用封装技术,将程序模块的实现细节隐蔽起来,使模块接口尽量简单。
3)模块化:模块是程序中相对独立的成分,一个独立的编程单位,应有良好的接口定义。模块的大小要适中,模块过大会使模块内部的复杂性增加,不利于模块的理解和修改,也不利于模块的调试和重用;模块太小会导致整个系统表示过于复杂,不利于控制系统的复杂性。
4)局部化:保证模块间具有松散的耦合关系,模块内部有较强的内聚性。
5)确定性:软件开发过程中所有概念的表达应是确定、无歧义且规范的。
6)一致性:程序内外部接口应保持一致,系统规格说明与系统行为应保持一致。
7)完备性:软件系统不丢失任何重要成分,完全实现系统所需的功能。
8)可验证性:应遵循容易检查、测评、评审的原则,以确保系统的正确性。
5、软件开发工具与软件开发环境
软件开发工具与软件开发环境的使用提高了软件的开发效率、维护效率和软件质量。
(1)软件开发工具
软件开发工具的完善和发展将促使软件开发方法的进步和完善,促进软件开发的高速度和高质量。
(2)软件开发环境
软件开发环境(或称软件工程环境)是全面支持软件开发全过程的软件工具集合。
计算机辅助软件工程(CASE,Computer Aided Software Engineering)将各种软件工具、开发机器和一个存放开发过程信息的中心数据库组合起来,形成软件工程环境。它将极大降低软件开发的技术难度并保证软件开发的质量。
3.2 结构化分析方法
结构化方法的核心和基础是结构化程序设计理论。
1、需求分析
需求分析方法有:1)结构化需求分析方法;2)面向对象的分析方法。
**需求分析的任务就是导出目标系统的逻辑模型,解决“做什么”的问题。
**需求分析一般分为需求获取、需求分析、编写需求规格说明书和需求评审四个步骤进行。
2、结构化分析方法
结构化分析方法是结构化程序设计理论在软件需求分析阶段的应用。
结构化分析方法的实质:着眼于数据流,自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。
△△结构化分析的常用工具:1)数据流图(DFD);2)数据字典(DD);3)判定树;4)判定表。
数据流图以图形的方式描绘数据在系统中流动和处理的过程,它反映了系统必须完成的逻辑功能,是结构化分析方法中用于表示系统逻辑模型的一种工具。
上图是数据流图的基本图形元素:
加工(转换):输入数据经加工变换产生输出。
数据流:沿箭头方向传送数据的通道,一般在旁边标注数据流名。
存储文件(数据源):表示处理过程中存放各种数据的文件。
源,潭:表示系统和环境的接口,属系统之外的实体。
△△画数据流图的基本步骤:自外向内,自顶向下,逐层细化,完善求精。
数据字典:对所有与系统相关的数据元素的一个有组织的列表,以及精确的、严格的定义,使得用户和系统分析员对于输入、输出、存储成分和中间计算结果有共同的理解。
**数据字典的作用是对数据流图中出现的被命名的图形元素的确切解释。
**数据字典是结构化分析方法的核心。
3、软件需求规格说明书(SRS)
软件需求规格说明书是需求分析阶段的最后成果,通过建立完整的信息描述、详细的功能和行为描述、性能需求和设计约束的说明、合适的验收标准,给出对 目标软件的各种需求。
3.3 结构化设计方法
1、软件设计的基础
**需求分析主要解决“做什么”的问题,而软件设计主要解决“怎么做”的问题。
从技术观点来看,软件设计包括软件结构设计、数据设计、接口设计、过程设计。
结构设计:定义软件系统各主要部件之间的关系。
数据设计:将分析时创建的模型转化为数据结构的定义。
接口设计:描述软件内部、软件和协作系统之间以及软件与人之间如何通信。
过程设计:把系统结构部件转换成软件的过程性描述。
从工程角度来看,软件设计分两步完成,即概要设计和详细设计。
概
展开阅读全文