版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构软件工程操作系统软件技术基础
数据结构数据结构与算法的基本概念常用数据结构线性结构——线性表、栈、队列、链表非线性结构——树、二叉树、图线性表的查找内排序
软件工程程序、软件、软件工具、软件工程的概念软件生存期及开发模型结构化方法——结构化分析、结构化设计、设计工具面向对象——概念、与结构化方法的区别软件集成与软件复用软件测试
操作系统功能与类型进程及处理机管理:进程、进程通信、进程控制、调度、死锁存储器管理、设备管理、文件管理的任务及基本概念8.1数据结构概述
在计算机系统软件和应用软件中都要用到各种数据结构,因此,要进行高质量的程序设计和软件开发,仅掌握几种计算机语言而缺乏数据结构方面的知识是不够的,难以应付各种复杂的问题。要设计出合适的数据结构,才能有效地解决问题。
在计算机系统中,数据就是计算机可以保存和处理的信息。在计算机发展初期计算机主要用于数值运算,数据就是数值。随着计算机硬件技术与软技术件的不断发展,扩大了计算机的应用范围。因此,数据范畴不仅包含了数值,还具有更为广泛的含义,如文字、字母、字符、声音、程序、图形、图像等。何谓数据结构?一、数据结构的基本概念
数据+结构
数据是描述客观事物并能为计算机加工处理的符号的集合。
结构是指事物间的相互关系和约束。
数据结构(DataStructure)是指数据元素的组织形式和相互关系。数据结构:讨论数据在计算机中的组织形式与相互关系的学科
算法:问题求解(程序设计)的步骤与方法
数据:十进制、二进制常数字母、字符程序段、图形图象、语音数据元素:数据的基本单位(数据结点),往往对应客观世界的一个有意义的独立实体,可大可小
数组:A(4)=(123,234,456,789)
字符串:z1="abcdhg"
数据库表文件:每一条记录二、数据结构的内容
1.数据元素之间的逻辑结构
2.数据的存储结构
3.数据的操作相关算法(提高效率)
以上称为数据结构的三个层次,后继所有结构的讨论,都是从这三方面进行的。如“学生表”、“职工表”就是一个数据结构,从逻辑结构来说,是一种线性表结构数据结构实际上就是研究以下问题:l
数据元素间的逻辑关系是什么?l
适宜采用什么样的存储结构?l
有哪些基本运算?怎样实现?
实际上也就是数据结构的三个层次:
数据的逻辑结构数据的存储结构数据操作相关算法集合。数据结构一般包括以下三方面的内容:(1)数据的逻辑结构
数据的逻辑结构从逻辑上抽象地反映数据元素间的结构关系,它与数据在计算机中的存储表示方式无关。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。数据的逻辑结构有两大类:线性结构——线性结构的逻辑特征是:…
…非线性结构——非线性结构的逻辑特征是:…
…线性结构——linearity的逻辑特征:
有并且仅有一个开始数据元素和一个终点数据元素,所有数据元素都最多只有一个直接前趋和一个直接后继。例如:线性表就是一个典型的线性结构。数据元素之间为1对1的关系07020106100803040509堆栈、队列、数组、串等都是线性结构。有且仅有一个无直接前驱而仅有一个直接后继的起始元素有且仅有一个无直接后继而仅有一个直接前驱的终点元素其余的内部元素各有一个直接前驱和一个直接后继线性结构是一种最简单最常用的数据结构线性表是一种最简单和常用的线性结构非线性结构——非线性结构的逻辑特征是:
一个结点可以有多个前趋结点和后继结点。
该结构中一个数据元素可能有多个直接前趋和直接后继。非线性结构中最一般的结构是图结构。在图结构中,任何数据元素的直接前趋和直接后继的个数都不作限制。如树形结构、图等在非线性结构中还有一类较特殊的结构,称为——“树结构”。树的逻辑特征是:①
有且仅有一个称为根的元素无直接前趋;②其他元素有且仅有一个直接前趋,而每个元素都可能有多个直接后继;③所有数据元素(除根元素)都存在一条从根元素到该元素的路径。(2)数据的物理结构数据的物理结构是讨论数据元素之间的关系在计算机中的表示,也称为存储结构。数据的存储结构可用以下四种基本存储方法体现:(A)顺序存储方法——把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构称为顺序存储结构。——即数据的逻辑顺序与存储单元的物理顺序(地址)一致顺序存储方法主要应用于线性数据结构,如线性表、数组等。非线性的数据结构也可以通过某种线性化的方法来实现顺序存储。
(B)链式存储方法
——
对那些不能在物理位置上相邻的(不连续)数据,则可以采用链式存储结构。链式存储结构可以用一组任意的存储单元来存储数据元素。链接存储结构的特点是把存放数据元素的节点分为两部分,一部分存放数据元素(称为数据域);另一部分存放指示存储地址的指针(称为指针域),指针域指出了其后继或前趋数据元素的存储地址(即数据元素之间的关系),从而形成一个链。(C)索引存储方法——存储数据元素的同时,附加有索引表,表中每项叫索引项,由关键字和物理地址组成
该方法通常是在存储元素信息的同时,建立附加的索引表,索引表中的每一项称为索引项。
索引项的一般形式:(关键字、地址)
如:
学号记录号
12009096220099543200989142009885
…
…
…
关键字是能唯一标识一个数据元素的数据项,而地址则指示存储位置(D)散列存储方法——利用数据元素的关键字,计算出元素的物理存储地址
该方法的基本思想是根据元素的关键字直接计算出该元素的存储地址。即在数据元素的字段中有一个或几个字段的值,通过某一散列函数唯一地确定该元素的存储地址。有时又称散列存储方法为“关键字——地址转移法”。(1)顺序存储方法——即数据的逻辑顺序与存储单元的物理顺序(地址)
一致(2)链式存储方法——数据元素之间的逻辑顺序与物理顺序不要求一致,其逻辑顺序由结点指针表示(链)(3)索引存储方法——存储数据元素的同,附加有索引表,表中每项叫索引项,由关键字和物理地址组成(4)散列存储方法——利用数据元素的关键字,计算出元素的物理存储地址(3)数据的处理与运算在数据结构中,数据操作相关算法集合常用的有:遍历、插入、更新、删除、查找、排序
把数据以一定的逻辑结构组织起来,并以适当的方法存储在计算机系统的存储器里,其最终目的是为了有效处理数据,提高数据处理的运算速度。遍历:在数据结构里的各元素间移动或查看所有数据元素(1)遍历:在数据结构的各个元素中移动,或查看所有数据元素。(2)插入:在数据结构中添加新的元素。(3)更新:修改或替代数据结构中指定元素的一个或多个数据项(即字段值)。(4)删除:把指定的数据元素从数据结构中去掉。(5)查找:在数据结构中查找满足一定条件的数据元素。(6)排序:在保持数据结构中数据元素个数不变的前提下,把元素按指定的顺序重新排列。排序一般是建立在线性逻辑结构的基础上。下面的例子可增加对数据结构的感性认识。【例1】
已知职工档案信息由姓名、性别、出生年月、职称、部门、工资、婚否等信息组成;设计一个查询程序要求:
①能根据指定的姓名进行查询
②能按部门进行工资统计汇总
③能检索某职称的职工信息等。该程序的设计直接依赖于数据行(记录)是怎样组织和存储的,即依赖于这n个数据元素的结构。如果这些数据没有任何规律地存放在计算机中,只能用逐一比较的方法顺序查找。这种查找方式对数量不大的对象或许是可行的,但对于大数据量的查询就难以实行了。姓名性别出生年月部门职称工资婚否奖惩男01/10/67技术科工程师165.50.T.memo女03/12/78生产科助工130.00.F.memo女04/12/64生产科高工155.50.T.memo男11/25/72技术科工程师165.00.T.memo女01/12/54生产科助工120.50.F.memo男12/03/76生产科高工180.50.T.memo女01/02/54生产科助工135.00.F.memo女07/02/76销售科经济师185.00.T.memo男07/08/82销售科经济员130.50.F.memo男01/28/72生产科高工150.50.F.memo……………………职工档案信息
这张档案表可称为一个数据结构,它是一个线性表结构,表中的每一行为一个数据元素(它是数据结构的基本单位)。它由姓名、性别以及奖惩等数据项组成。说明:l
表中数据元素的逻辑关系是:对表中任一数据元素,与它相邻且在它前面的数据元素(也称为直接前趋)最多只有一个;与表中任一数据元素相邻且在它后面的数据元素(也称直接后继)也最多只有一个。表中第一个元素没有直接前趋,故称为起始数据元素,最后一个数据元素没有直接后继,故称为终点数据元素(例:表中“李静”所在元素的直接前趋为“胡一民”所在的数据元素;直接后继为“张冬梅”所在的数据元素)。l
该表的存储方式(指计算机存储器如何表示这种关系):表中的数据元素是顺序地邻接在一片连续的单元之中,即顺序存储。l
应针对表元素的逻辑顺序性和存储的顺序性,设计高效合理的算法,实现查找、删除、插入等操作。
一.线性结构的特点
线性结构是数据结构中最简单且最常用的一种数据结构。线性结构的基本特点:是数据元素有序并有限。线性结构的逻辑特征是:在其结构中,有且仅有一个无直接前趋而仅有一个直接后继的数据元素为起始元素;有且仅有一个无直接后继而仅有一个直接前趋的数据元素为终点元素;其余均为内部元素,它们各有一个直接前趋和直接后继。因此,线性结构的数据元素可排成一个线性的序列:
a1,a2,a3,a4,...,an
其中,a1为起始元素,无直接前趋;an为终点元素,无直接后继;ai为索引号为i的数据元素,只有一个直接前趋和直接后继。8.2线性结构
二.常见的线性结构
线性结构有各种类型,如线性表、堆栈、队列、*数组、**串等。1.
线性表(栈和队列可以认为特殊的线性表)
线性表是由n(n≥0)个相同类型的元素a1,a2,...,an所构成的有限线性序列,通常表示为(a1,a2,...,an),其中n为线性表的长度。
ai(1≤i≤n)是线性表中第i个序号的数据元素。ai是抽象表示符号,在不同的情况下含义不同。例如:一个整数序列:
1,12,123,1234,5321,221,122
是一个线性表,表中元素ai是一个整数,表长为7。B=(‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’$’,’+’)
表长为12C=(‘ABC’,’DEF’,’VFP’,’Basce’,’5’,’&^’)表长为6字母表D=(a,b,c,d,e,f,g,h,i,j……
,z)表长为26姓名表L=(张三,李四,周五,赵六,……
)线性表的特征:
P255又例如:线性表基本操作主要有以下几种:①初始化
INITIATE(L):设定一个空的线性表L。②求表长
LENGTH(L):对给定的线性表L,函数返回值为数据元素的个数。③取元素
GET(L,i):若给定的数据元素序号满足1≤i≤LENGTH(L),则函数返回值为给定线性表L的第i个数据元素ai;否则返回空元素。④定位
LOCATE(L,x):对给定值x,若线性表L中存在某个数据元素ai
等于x,则函数返回该数据元素ai在线性表中的索引号i,若L中存在多个等于x的数据元素,则函数返回索引号最小的i值;若L中不存在等于x的数据元素,则函数返回一个特殊值(比如-1),以说明不存在的位置。线性表的存储方式主要有两种:
顺序存储结构的顺序表和链式存储结钩的链表(1)顺序表
在顺序表的存储结构中,数据元素按其逻辑次序依次存放在一组地址连续的存储单元中。由于逻辑上相邻的元素存放在内存的相邻单元中,所以顺序表的逻辑关系蕴含在存储单元的邻接关系中。顺序表的存储结构示意图:
顺序表的特点如下:l
物理上相邻的元素在逻辑上也相邻。l
可随机存取。l存储密度大,空间利用率高。例3:在顺序表中,在数据中间插入数据C
见P255例4:在顺序表中,在数据中间删除数据C
见P256(2)线性链表
线性链表是采用链式存储结构方式进行存储的线性表,即用一组任意的存储单元来存放线性表的数据元素,这组存储单元既可以是连续的,可以是不连续的,从而可以大大提高存储器的使用效率。线性链表有单向链表和循环链表等多种形式。①单向链表:
单向链表是链式存储结构中最简单和最基本的结构。因为在链表中数据元素的逻辑次序与物理存储次序不一定相同。为了能正确表示数据元素间的逻辑关系,在存储每个元素值的同时,还必须存储其直接后继(或直接前趋)的存储位置,这一部分称为链。因此,单向链表的每个数据元素都由两部分组成:存储元素值的数据域(data)和存储直接后继元素存储地址的指针域(next)。
其结构如图:
一个线性表a1,a2,...,an对应的单链表可以逻辑示意图表示。其中,h为链表的头指针,用以确定线性表中第一个元素对应的存储位置。单链表可以用头指针的名字来命名。链表的终点元素无直接后继,故其指针域为空NULL,在图中用^表示。
通常在单链表的第一元素之前附加一个称为头结点的元素。头结点的数据域可以不存放任何数据,也可以存放像线性表的表长的数据信息。如图:
图13-2头指针为L的单链表
例5:设有线性表a1,a2,...,an,在数据元素
ai之前插入数据元素为x的结点
见P256例6:设有线性表a1,a2,...,an,删除单链表中的结点
见P257算法删除:删除元素ai,移动元素ai—an,变为n-1算法插入:共n个元素,在第i位置插入ai,移动元素原来的ai—an,长度变为n+1
单链表中,插入删除一个数据元素,仅仅需要修改该结点的前一个和后一个结点的指针域,非常简便,但要访问表中的任一元素,都必须从头指针开始,顺链查找,无法随机访问。l
优点:插入、删除操作时移动的元素少。l
缺点:所有的操作都必须顺链操作,访问不方便。将顺序表与链表作一比较,可以看出:l
顺序存储的访问是随机访问,而链式存储的访问是顺链进行的顺序访问。l
顺序存储下插入、删除平均移动一半元素,效率不高,而链式存储下插入、删除效率高。l
顺序存储空间利用率高,链式存储需额外增加地址指针的存储,增加空间耗费。
单链表的优缺点②
循环单链表:
循环链表是一种首尾相接的链表。在单链表(或双链表的)中最后一个结点的指针域指向空(NULL),如果将它指向头结点或第一个元素结点(不带头结点的链表),使整个链表形成一个环,这就构成了单向循环链表(或双向循环链表)。循环链表示意图:③
双向链表:
在单链表中,每个结点的指针域只放了一个指针,该指针指向该结点元素的直接后继元素的结点,每查找一个数据元素,都必须从头结点开始,从前向后单方向的搜寻。如果在链表的每个结点上再增加一个指向表中每个元素的直接前趋的指针域。就可以实现线性链表从后向前的搜寻,即可双向查找。这种指针域包括指向该结点的直接前趋和直接后续的两个指针的存储结构,称为双向链表,简称双链表。
一个带头结点的双链表中,并不需要用头指针h来命名这个链表,因为,知道任一结点的指针,就可以访问整个链表的所有结点,包括头结点。
双链表的逻辑示意图如图所示:三、栈与队列
1、栈
栈是一种特殊的线性表,它的插入和删除运算限制在表的一端进行。通常称插入、删除的一端为“栈顶”,另一端称为“栈底”。当表中没有元素时称为“空栈”。由于栈中元素的插入和删除只能在栈顶进行,所以总是后进栈的元素先出来,即后进先出表(LIFO)。
栈的逻辑示意图:栈的特点是:后进先出——LIFO
LastIn,FirstOut如:入栈顺序为1,2,3,4,5
则出栈顺序为5,4,3,2,1栈的基本运算有5种:(1)置空栈
SETNULL(S):将栈S置为空栈。(2)判空栈EMPTY(S):若栈S为空,返回真,否则,返回假。(3)进栈
PUSH(S,X):在栈S顶部插入(叫压入)元素X。(4)出栈
POP(S):若栈S不空,删除(叫弹出)顶部元素。(5)取栈顶TOP(S):取栈顶元素,并不改变栈中内容。2、队列
队列是另一种操作受限的线性表,它只允许在线性表的一端进行数据元素插入操作而在另一端才能进行数据元素删除操作。
根据队列的特点,队列需要两个队列指针来说明:一个是队头指针front,它总是指向队头元素的前一个位置;另一个是队尾指针rear,它总是指向队尾元素所在的存储位置。
队列的结构示意图:允许插入的一端允许删除的另一端
由于队列中元素的插入和删除分别在队尾和队头进行,所以总是先入队列的元素先出队列,即队列具有先进先出的特性。故而队列又称为先进先出表(FIPO——FirstIn,firstOut)。
队列特点同栈的操作类似,队列的基本运算有五种:置空队列SETNULL(Q):将队列Q初始化为空。(2)判队列空
EMPTY(Q):若队列Q为空,返回真,否则返回假。(3)入队列
ENTER(Q,x):若队列Q未满,在原队尾后加入数据元素x,使x成为新的队尾。(4)出队列DELETE(Q):若队列Q不空,则将队头元素删除。(5)取队头元素GETHEAD(Q):若队列Q不空,则返回队头元素,但不改变队列中内容。三、线性表的查找在数据结构中,数据的基本单位是数据元素,数据元素通常表现为记录、结点、顶点等。一个数据元素由若干个数据项(或称为域)组成,用以区别数据元素集合中各个数据元素的数据项称为关键字(Keyword)。
所谓查找(Search),又称检索,就是在一个含有n个数据元素的集合中,根据一个给定的值k,找出其关键字值等于给定值k的数据元素。若找到,则查找成功,输出该元素或该元素在集合中的位置;否则查找失败,此时或者输出查找失败信息,或者将给定值作为数据元素插入到集合中适当的位置。
查找的方法查找算法的评价线性表的查找,常用的有如下三种方法:
顺序查找。
二分法查找。分块查找。
1.顺序查找(最简单、最普通)
从第1个数据元素开始,逐个把数据的元素的关键字值与给定值比较,若找到某数据元素的关键字值与给定值相等,则查找成功;若遍历整个线性表都未找到,则查找失败.
【例1】在所给的线性表中查找:①找:54?成功,查找长度为5。②找:19?失败,查找长度为9。容易推导出,在长度为n的线性表中进行查找的平均查找长度为:(n+1)/2
。237816345412986430
缺点:查找速度慢适应:顺序存储2.二分法查找(折半查找)
当顺序存储的线性表已经按关键字有序时,可以使用二分法查找。二分法查找的基本思路是:由于查找表中的数据元素按关键字有序(假设为增序),则查找时不必逐个顺序比较,而先与中间数据元素的关键字比较。若相等,则查找成功;若不等,即把给定值与中间数据元素的关键字值比较,若给定值小于中间数据元素的关键字值,则在前半部分进行二分查找,否则在后半部分进行二分查找。这样,每进行一次比较,就将查找区间缩短为原来的一半。
在长度为n的有序顺序表中进行二分查找的查找次数不超过[log2n+1]
次(其中[]代表取整)。因此,二分法查找具有效率高的特点。【例2】对顺序存储的线性表进行二分查找:(线性表长度n=7)
序号:1 2 3 4 5 6 7线性表:3 7 15 27 54 98 124
若找27:次数查找区域中间结点序号,对应的元素值状态
1[1,7](1+7)/2=427查找成功
若找98:次数查找区域中间结点序号,对应的元素值状态
1[1,7](1+7)/2=427小于982[5,7](5+7)/2=698查找成功特点:效率较高
3.分块查找(索引顺序查找)
分块查找是介于顺序查找与二分法查找之间的一种查找方法,又称索引顺序查找。它的基本思想是:
分块——将数据划分为若干数据块,数据在块内无序,但块间有序,也就是说,第一块内的最大数据比后继所有块内的所有数据都小(假设按数据递增有序),后面的每一块内的所有数据都大于它前面的所有块的最大数据,同时又小于后继所有块内的所有数据。
查找——分两步进行。①块间:建立一个各块最大关键字值表,将待查数据在该表中按二分法或顺序查找进行,通过块间查找确定数据所在块。用二分法可以提高块间查找的效率。②块内:在块内按顺序查找方式直接查找元素。由于块间查找用了二分法,所以整个算法的效率要比顺序查找高,但事先要将数据进行分块,这在一定程度上增加了额外的时间开销。【例3】分块查找。待查序列为:
221330546550736986
查找key关键字值为50的元素。①先将该序列等分为三块:
{221330}{546550}{736986}②建立一个顺序的各块最大关键字值表:
30 6586③根据待查的关键字在各块最大关键字值表中进行查找,确定数据可能在的块。在[306586]中查找50,由于30<50<65,确定数据在第二块中。④在第二块中顺序查找关键字为50的元素,找到。优点:插入删除操作方便注:以上三种适应顺序存储四、排序
排序又称为分类,它是数据处理中经常使用的一种运算,是将一组数据元素(记录)按其排序码进行递增或递减的运算操作。排序分:内排序——整个排序运算在内存中进行。外排序——对外存储器中的数据进行排序操作。1.插入法排序
把N个数据元素的序列分成两部分,一个是已排好序的有序部分,另一个是未排好序的未排序部分;把未排好序的元素逐个与已排好序的元素比较,并插入到有序部分的合适位置,最后得到一个新的有序序列。【例7】插入法排序(线性表长度n=8)。初始序列
[49]38
65 97 76 1327 49(1)[38 49]65 97 76 13 27 49(2)[38 4965]
97 76 13 2749(3)[38 49 65 97]76 13 27 49(4)[38 49 65 7997]13 27 49(5)[13 38 49 65 76 97]27 49(6)[13 27 38 49 65 76 97]49(7)[1327 38 49 4965 7697]2.选择排序
简单地说,通过交换位置,选最小的放在第一,次小的放在第二,依此类推,直到元素序列的最后为止。【例8】选择排序(线性表长度n=8)。初始序列
49
{38 65 977613 2749}(1)13 38
{659776 4927 49}(2)13 2765
{977649 38 49}(3)13 27 38 97
{764965 49}(4)13 27 38 49 76
{976549}(5)13 27 38 4949
97
{65 76}(6)13 27 3849 49 65 97
{76}(7)13 27 38 49 49 65 76 97 注意:此序列中有两个元素具有相同关键字值49,经过排序,原来排在后面的一个49反而排在了前面,这种相同关键字值经过排序交换位置的现象,称为不稳定,这种排序方法被称为是不稳定的。选择排序就是一种不稳定的排序方法。3.冒泡排序冒泡法排序需要进行n1轮排序过程。【例7】冒泡排序过程(线性表长度n=7)。初始状态:
[65977613274958]第1轮(i=1…6)[657613274958]97第2轮(i=1…5)[6513274958]7697第3轮(i=1…4)[13274958]657697第4轮(i=1…3)[132749]58657697第5轮(i=1…2)[1327]4958657697第6轮(i=1)
[13]2749586576974.分区交换排序法(快速排序)——从几个待排序的元素中任意选一个元素Ri,确定Ri的最终排序位置,使元素中小于Ri的都在Ri前面,大于Ri的都在Ri的后面,这样分成两个子序列。对每个子序列,重复以上操作,又分为四个子序列,反复以上操作,当各子序列长度为1时,排序完成。初始序列:
{58
4916090701530492}
一趟
{4924913015}58{709060}
二趟:
{15
30491
}
492
58{60}
70
{90}三趟
15{30491
}
492
58
60
70
90
四趟15
30491
492
58
60
70
90
略5.归并排序将两个或两个以上的有序表组合成一个新的有序表。将每个元素看成一个长度为1的子序列,把相邻子序列两两合并,得到一个新的子序列,如此重复,最后得到长度为n的一个新的有序序列。【例8】归并排序过程(线性表长度n=7)。初始序列:
[25][57][48][37][12][92][86]
[25 57][3748][1292][86](两两合并)
[25374857][128692](两两合并)
[12 253748578692](两两合并)几种排序比较:稳定性比较——
稳定的排序方法有:插入、归并、冒泡排序;不稳定的排序方法有:选择排序、快速排序。平均综合情况——
归并排序速度较快;插入、冒泡排序速度较慢。总之,各种排序法各有其优缺点。其选用依据是:
其数据规模n大,内存允许,要求稳定,则选归并排序
其数据规模n较小,有稳定要求,则选插入排序。
其数据规模n较小,对稳定不要求,则用选择排序。其数据规模n大,内存允许,对稳定不要求,则选快速排序。非线性结构一、树1.树的定义(结构)树是一个或多个结点元素(n>=0)组成的有限集合T,且满足条件如下:(1)有且仅有一个结点没有前趋结点,称为根结点(root)(2)除根结点外,其余所有结点有且只有一个直接前趋结点(3)包括根结点在内,每个结点可以有多个直接后继结点图13-3树结构示意图第一层第二层第三层第四层A根2.树结构的重要术语与概念:叶子——没有后继结点的结点称为叶子(或终端结点)如图中的D、E、F、G、H、I、J。分支结点——非叶子结点称为分支结点。结点的度——一个结点的子树数目就称为该结点的度。图中的结点B的度为2;结点C的度为3;结点D、
J的度为0。树的度——树中各结点的度的最大值称为该树的度,图所示树的度为3。子结点——某结点子树的根称为该结点的子结点。父结点——相对于某结点的子树的根,称为该结点的子树的父结点。兄弟——
具有同一父结点的子结点称为兄弟。图中结点C
是结点G、H、I的父结点;结占G、H、I是结点C的子结点;结点J是结点I的子结点;结点G、H、I互为兄弟。结点的层次——根结点的层次数是1,其他任何结点的层数等于它的父结点的层数加1。树的深度——一棵树中,结点的最大层次数就是树的深度图所示的树的深度为4。有序树和无序树——如果一棵树中结点的各子树从左到右是有序的,即若交换了某结点各子树的相对位置,则构成了不同的树,就称这棵树为有序树;反之,则称为无序树。森林——森林是n棵树的集合(n≥0),任何一棵树,删去根结点,就变成了森林。对树中的每个结点来说其子树的集合就是一个森林。
图13-3树结构示意图第一层第二层第三层第四层二、二叉树1、二叉树的定义
二叉树结构也是非线性结构中重要的一类,它是有序树,不是树的特殊结构。在二叉树中,每个结点最多只有两棵子树,一个是左子树,一个是右子树。二叉树有五种基本形态:它可以是空二叉树,根可以有空的左子树或空的右子树,或左、右子树皆为空。
注意一般树与二叉树的概念不同:树至少有一个结点,而二叉树可以是空;其次,二叉树是有序树,其结点的子树要区分为左子树和右子树,既使某结点只有一棵子树的情况下,也要明确指出该子树是左子树还是右子树,而树中则无此区分。图13-4二叉树的五种基本形态2、二叉树重要性质:性质1——在二叉树的第i层上至多有2i-1个结点(i>0)。性质2——深度为k的二叉树至多有2k1个结点(k>0)。一棵深度为k且有2k1个结点的二叉树称为满二叉树。满二叉树的特点是每一层上的结点数都达到最大值,2k1个结点是深度为k的二叉树所能具有的最大结点个数。若一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下一层上的结点都集中在该层最左边的若干位置上,则此二叉树称为完全二叉树。显然,满二叉树是完全二叉树,但完全二叉树不一定是满二叉树。
3.二叉树的存储结构(1)顺序存储
对完全二叉树而言,可用顺序存储结构实现其存储,该方法是把完全二叉树的所有结点按照自上而下,自左向右的次序连续编号,并顺序存储到一片连续的存储单元中,在存储结构中的相互位置关系即反映出结点之间的逻辑关系。如用—维数组Tree来表示完全二叉树,则数组元素Tree(i)
对应编号为i的结点。对一般二叉树,可以增加虚拟结点以构造完全二叉树,同样可以顺序存储。ABC@EF二叉树在一维数组中保存为:
(2)链式存储
顺序存储容易造成空间浪费,并具有顺序存储结构固有的缺点:添加、删除伴随着大量结点的移动。
对于一般的二叉树,较好的方法是用二叉链表来表示。表中每个结点都具有三个域:其中,指针Lchild和Rchild分别指向当前结点的左孩子和右孩子。结点的形态如下:LchildDataRchild
左指针域Lchild右指针域Rchild数据域Data4.二叉树的遍历
所谓遍历,是指按某种次序,依次对某结构中的所有数据元素访问且仅访问一次。由于二叉树结构的非线性特点,它的遍历远比线性结构复杂,其算法都是递归的。有三种遍历方式:前序遍历——
访问根结点;先序遍历左子树;先序遍历右子树。
先序遍历序列为:ABDECF中序遍历——
中序遍历左子树;访问根结点;中序遍历右子树。
先序遍历序列为:DBEAFC后序遍历——
后序遍历左子树;后序遍历右子树;访问根结点。
先序遍历序列为:DEBFCA三、
图结构
1.图的概念
图是一种重要的、比树更复杂的非线性数据结构。
在树结构中,某结点只能与其上层的一个结点(父结点)相联系,并且根结点还没有父结点,每个结点与同一层结点间没有任何横向联系;
而在图结构中,数据元素之间的联系是任意的,每个元素可以和其他的元素相联系,从这个意义上来讲,树是一种特殊形式的图。图包括一些点和边,故一个图G由点V(G)和边E(G)这两个集合组成。
无向图
有向图
无向图G1:
G1=(V1,E1)
V1={1,2,3,4,5}
E1={(1,2),(1,3),(3,4),(4,5)}在无向图中,边没有方向:(1,3)也可写成(3,1)
有向图G2:
G2=(V2,E2)
V2={1,2,3,4,5,6}
E2={<1,2>,<2,1>,<2,3>,<2,4>,<3,5>,<5,6>,<6,3>}在有向图中,边有方向:<2,4>不能写成<4,2>。与图相关的一些术语和概念介绍如下:邻接点——有边相连的点。
在无向图中,互邻的两边侧互为邻接点,若有(V2,V3),则V3和V2互为邻接点;在有向图中,若有<V2,V3>,则V3为V2的邻接点,但V2不一定是V3的邻接点,除非也存在<V3,V2>。顶点的度——与每个顶点相连的边数。
在无向图中,以该顶点为一个端点的边的条数。在有向图中,有入度(进的边数)和出度(出的边数)之分。在图(b)中,顶点2的入度为1,出度为3。路径——某一顶点到达另一顶点所经过的顶点序列。两个顶点之间可以有多条路径。
路径上的边的数目称为路径的长度。图(a)中顶点1到顶点5的路径为(1,3,4,5),长度为3。网络——如果图G(V,E)中每一条边都赋有反映这条边的某种特性的数值,则称此图为一个网络,称与边相关的数值为该边的权。
操作系统功能与类型进程及处理机管理:进程、进程通信、进程控制、调度、死锁存储器管理、设备管理、文件管理的任务及基本概念第9章操作系统9.1操作系统的概念和类型
操作系统(OperatingSystem)是计算机系统中最重要的系统软件。协调和管理计算机的软硬资源,提高对硬件的利用率,是用户和计算机之间的接口,为用户使用计算机提供操作的平台和环境。以便用户无需了解计算机硬件或系统软件的有关细节就能方便地使用计算机。处理机管理如何分配与回收被多道程序所共享的CPU(实质上就是如何对进程进行合理调度),以提高CPU利用率。存储器管理对各程序所占的内存空间进行必要的存储保护。设备管理各种外部设备的分配、回收以及共享,以提高设备利用率文件管理大量用户程序、数据的存储组织、存储保护、共享等一系列问题,构成了操作系统中文件管理的主要内容。作业管理如何选取作业进入内存,选哪些、多少等一、操作系统的功能并发性:多个事件同时发生共享性:多程序、多用户同时使用有限资源互斥共享:一段时间只允许一个用户使用资源并发访问:一段时间可由多个进程同时使用某资源虚拟性:把一个物理设备变为逻辑上的多个不确定性:各程序的执行顺序和每个程序的执行时间是不确定的二、操作系统的基本特征
由于多道程序共存于内存且交替执行,有的程序正在计算,有的程序正在输入输出,于是CPU利用率、I/O设备利用率以及内存利用率都大大提高批处理操作系统:进行多个作业,这些作业是由用户将一批作业一起输入计算机的分时操作系统:多个用户对系统的资源进行时间上的分享,将CPU的时间分成一个一个的“时间片”,按策略分配给用户,使用户有“独占”计算机的感觉。如QUNIX实时操作系统:系统能及时响应随机发生的外部事件,并能在最短的时间内完成对事件的处理网络操作系统:管理计算机网络,为用户提供网络资源共享、系统安全及多种网络应用服务分布式操作系统:将地理上分布的数据处理系统或计算机系统互联,实现资源共享、信息交换和协作完成任务三、操作系统的分类进程的概念进程的特征进程结构进程的三种基本状态和相互转换进程调度进程通信死锁9.2处理机管理返回进程:内存中一组指令序列的执行过程,即程序的一次执行;
进程是可以和其它计算机共同执行的计算;
进程是具有一定功能的程序关于某个数据集合的一次运行活动。进程的概念动态性:程序的一次动态过程,具有生命期。一个进程要经历“创建-调度-撤销”三个过程并发性:是程序能与其它程序并发执行独立性:各进程间相互独立异步性:各进程相互独立、按不可预知的速度向前推进进程的特征返回进程由进程控制块、程序及数据三部分组成进程结构(见书表)就绪状态:进程已获得除CPU外的所有资源执行状态:正在执行,当前进程独占CPU阻塞状态(等待状态):进程等待某个事件的发生而暂时不能运行的状态进程的三种基本状态及相互转换执行状态等待状态就绪状态等待事件发生事件发生进程调度时间片到释放进程调度:就是按一定策略合理的将处理器分配给这些进程中的某个进程使用。调度程序按照进程的优先数,将进程的执行顺序排队,一般情况,就照此执行,但如果有某个更为重要的进程需要立即执行,它就使其“插队”,先运行这个进程。进程调度方式剥夺方式非剥夺方式进程调度算法先来先服务(FCFS)调度算法最短CPU运算期优先(SCBF)算法时间轮片(RR)算法最高优先级(HPF)算法多级队列反馈法进程调度进程的管理内容:
并发执行的进程需要进行信息交换,以便协调一致完成指定的任务通信方式(按传递内容分类)低级通信方式:传递控制信息高级通信方式:大批数据的交换通信方式(按传送渠道分类)消息缓冲区通信(直接通信):利用内存公共缓冲区管道通信:利用管道文件信箱通信:通过信箱进程通信进程的管理内容:
系统中两个或两个以上的进程无限期地等待永远不会发生的事件,即在无外力作用下,永远不能继续执行造成死锁状态死锁的原因争夺共享资源进程推进不当死锁的必要条件互斥条件不剥夺条件环路条件部分分配条件死锁的预防只要破坏了死锁的四个必要条件之一,就可以有效地预防死锁。死锁的检测和解除:定时运行死锁检测程序进程死锁9.3存储器管理存储管理主要是对主存储空间的管理。内存分配——为实现多道程序共享内存而进行的内存的动态分配、动态回收.包含管理内存分配表、制定分配策略、确定内存区域的划分方式等。内存空间共享——包含共享内存资源和内存区域信息共享。存储保护——为了避免内存中多道程序之间的相互干扰,必须对内存中程序、数据和信息进行保护。内存扩充——利用外存空间来逻辑扩充内存,也就是把暂时不用的程序、数据调至外存的某特定区域。这个区域被作为系统的逻辑内存使用。存储管理技术方案又分为四种:P285设备分类按工作特性分:输入输出设备、存储设备按资源分配角度分:独占设备:如打印机、终端等。一个作业用完后,另一个才可使用共享设备:允许多个作业同时使用的设备,如磁盘等虚拟设备:用虚拟设备管理技术,把独占设备变为逻辑上的共享设备,以提高设备利用率。设备管理的目标向用户提供使用外设的方便接口充分发挥设备的效率数据传送控制方式:中断控制、DMA方式、通道方式缓冲技术设备分配的方式静态分配、动态分配9.4设备管理
计算机系统中,除中央处理机和主存外的设备统称外部设备,外部设备的多样性导致了设备管理的复杂性。9.5文件管理1.文件系统文件系统是指操作系统中负责管理和存放文件信息的软件机构,它向用户提供了一种简便、统一的存取和管理信息的方法。文件系统的分类包括:(P294表)l
按文件性质/用途分:l
按文件逻辑结构分:l
按文件物理结构分:l
按文件存取方式分:l
按文件保护级别分:对用户而言,最根本的一点,是“按名存取”文件系统的功能包括:l
文件存储空间(外存)的管理。l
文件名到文件存储空间的映射,实现文件“按名存取”l
实现对文件的各种操作。l
支持文件的共享。l
提供文件的保护与保密措施。可以从两个角度看待文件组织:从用户角度看文件的逻辑结构,可分成无结构的流式文件和有结构的记录式文件,对文件的存取分为顺序存取和随机存取;从实现角度看,文件的物理结构可分为连续文件、链接文件和索引文件。2.文件结构组织:1)从用户角度看文件的逻辑结构
无结构的流式文件有结构的记录式文件2)对文件的存取分为顺序存取随机存取3)从实现的角度看,文件的物理结构可分为连续文件,必须连续存放链接文件,既可连续,又可非连续存放索引文件,既可连续,又可非连续存放3.文件目录文件目录是文件系统的关键数据结构,是由文件说明索引组成的用于文件检索的特殊文件。每个项目是一个文件控制块(FCB),它记录了文件说明和控制信息。一级目录——整个目录组织是一个线性结构,系统中的所有文件都建立在一张目录表中。它主要用于单用户操作系统
二级目录——在根目录下,每个用户对应一个目录(第二级目录);在用户目录下是该用户的文件,而不再有下级目录。适用于多用户系统,各用户可有自己的专用目录多级目录——或称为树状目录(Tree-like)。在文件数目较多时,便于系统和用户将文件分散管理。目录级别太多时会增加路径检索时间。适用于较大的文件系统管理
文件存储空间的管理是实现连续空间或非连续空间的分配,常用的管理方法有:
位示图、空闲文件目录表及空闲块链接法。4.文件共享与保护文件访问权限按访问类型可以分为:读(Read)、写(Write)、执行(Execute)、删除(Delete)等。文件的共享与文件的保护保密是同一个问题的两个方面,实质是有条件地共享。
软件工程程序、软件、软件工具、软件工程的概念软件生存期及开发模型结构化方法——结构化分析、结构化设计、设计工具面向对象——概念、与结构化方法的区别软件集成与软件复用软件测试
一、软件工程概述随着社会对软件需求的增长,计算机软件专家加强了对软件开发和维护的规律性、理论、方法和技术的研究,从而形成了一门介于软件科学、系统工程和工程管理学之间的边缘性学科,称之为软件工程学。软件的工程化生产也逐步形成软件产业。1.软件软件是程序的完善和发展,是经过严格的正确性检验和实际试用,并具有相对稳定的文本和完整的文档资料的程序。这些文档资料包括功能说明、算法说明、结构说明、使用说明和维护说明等。(1)程序设计时期(1946-60年代中)生产方式为个体手工方式,只有程序,没有软件的概念以个体劳动形式进行的专用程序的编制,主要采用机器、汇编语言,凭个人经验和编程技巧单独进行。这个阶段只有程序,没有软件概念(2)软件时期(60年代中-70年代中)产生了“软件”概念,出现了严重的“软件危机”。这个时期,称为程序系统时期。软件危机是指计算机软件的开发和维护过程中所遇到的一系列严重问题(3)软件工程时期(70年代今)以工程化的思想作指导,用工程化的原则、方法和标准来开发和维护软件。软件开发经历的三个阶段供求矛盾,软件的生产不能适应市场的需求软件成本和开发难度难于估计软件产品不符合用户要求软件的可靠性差软件的维护费急剧上升软件危机主要体现:
软件危机
由于软件本身是一个逻辑实体,而非一个物理实体,因此软件是非实物性与不可见的。而软件开发本身又是一个“思考”的过程,很难进行管理。开发人员以“手工作坊”的开发方式来开发软件,完全是按照各自的爱好和习惯进行的,没有统一的标准和规范可以遵循。因而,在软件的开发过程中,人们遇到了许多困难。有的软件开发彻底失败了,有的软件虽然开发出来了,但运行的结果极不理想,如程序中包含着许多错误,每次错误修改之后又会有一批新的错误取而代之。这些软件有的因无法维护而不能满足用户的新要求,最终失败了;有的虽然完成了,但比原计划推迟了好几年,而且成本上大大超出了预算。软件开发的高成本与软件产品的低质量之间的尖锐矛盾,终于导致了软件危机的发生。
软件危机具体地说,软件危机主要有以下几方面的表现:①软件的复杂性越来越高,“手工作坊”式的软件开发方式已无法满足要求。②对软件成本和进度统计不准,费用实际超过预算。③开发周期过长。④软件质量难以保证,常被怀疑。⑤缺乏良好的软件文档。⑥现有的软件极难维护。⑦软件开发效率远跟不上计算机发展的需求。⑧用户往往对软件不满意。
为摆脱软件危机,北大西洋公约组织成员国在1968年和1969年两度召开会议,商讨解决“软件危机”的对策。会议总结了软件开发中失败的经验与教训,吸收了机械工程和土木工程设计中成熟而严密的工程设计思想,首次提出了“软件工程”的概念,认为计算机软件的开发,也应像工程设计一样,进行规范性的开发,走“工程化”的道路。以按照预期进度和经费完成软件生产计划。提高软件生产效率和可靠性。“软件工程”出现以后,人们围绕着实现软件优质高产的目标进行了大量的理论研究和实践,逐渐形成了“软件工程学”这一新型学科。软件工程学的研究对象:软件工程学研究如何应用一些科学理论和工程技术来指导软件系统的开发与维护,使其成为一门严格的工程学科。软件工程学的基本目标:软件工程学的基本目标在于研究一套科学的工程方法,设计一套方便实用的工具系统,以达到在软件研制生产中投资少、效率高、质量优的目的。软件工程学的三要素:软件工程学的三个基本要素是方法、工具和管理
软件工程是研究软件的研制和维护的规律、方法和技术的学科。软件工程学包含的内容软件开发技术软件开发方法学软件工具软件工程环境软件工程管理软件管理学软件经济管理学软件生命周期(Softwarelifecycle)
一个软件项目从问题提出、定义、开发、使用、维护,直至被废弃,要经历一个漫长的时期,通常把这个时期称为软件生命周期。它将告诉软件研制者与维护者“什么时候做什么、怎样做“。
软件工程学将软件的生命周期分解为几个阶段,每个阶段的任务都相对独立、简单,便于不同的人员分工协作,每个阶段都有明确的要求、严格的标准与规范,以及与开发软件完全一致的高质量的文档资料,从而保证软件开发工程结束时有一个完整准确的软件配置交付使用。
一般情况下,软件生命周期由软件定义、软件开发、软件维护三个时期组成。每个时期又分为若干个阶段。瀑布模型-------每个周期又分若干阶段,各阶段的工作顺序展开后,如像自上而下的瀑布。故称为瀑布模型。
将软件生存周期划分为计划、开发、运行三个时期计划阶段
问题定义
可行性研究
开发时期需求分析设计编程测试运行时期
运行与维护瀑布模型
软件生存周期的模型:(1)瀑布模型
瀑布模型是将软件生存周期划分为计划、开发、运行三个时期,每个时期又区分为若干阶段,各阶段的工作顺序展开,如像自上而下的瀑布。设计实现快速原型
首先是建立一个能反映用户主要需求的原型,使用户通过使用这个原型来提出对原型的修改意见,如此反复多次,最后建立起符合用户要求的新系统。优点:快速用户与开发者之间的交互由抽象变为具体(2)快速原型模型
快速原型模型的方法是:首先建立一个能反映用户主要需求的原型,用户通过使用这个原型提出对原型的修改意见,然后根据户意见对原型进行改进,如此反复多次,最后建立起符合用户要求的新系统。它的特点不仅是快速,而且用户与分析员之间的交互从抽象变为具体,避免了许多由于理解上的不同而造成的需求分析错误。二、软件开发的阶段
开发软件首先分析要解决的问题,用十分准确的方式描述用户的需求。这个时期的任务,是确定软件开发的总目标,确定软件开发工程的可行性,确定实现工程目标应该采用的策略和必须完成的功能,估计完成该项工程需要的资源和成本,制定出工程进度表。这个问题也叫做软件定义或系统分析。1、系统分析
进一步划分为三个阶段,即问题定义、可行性研究和需求分析。问题定义可行性论证(软件开发前)技术可行性使用现有的技术能实现这个系统吗经济可行性系统的经济效益能超过其开发成本吗操作可行性系统的操作方式在这处用户内可行吗需求分析需求分析的主要任务——“做什么”,系统分析员通过与用户的交谈,写明问题的性质、工程的预期目标以及工程的规模。需求说明书——软件计划任务书论证项目的技术可行性、经济可行性以及操作可行性。结构化分析方法(需求分析方法)——需求说明书通常采用系统模型定义系统,得出经过用户确认的用数据流图、数据字典和简要的描述表示的系统逻辑模型。系统分析具体下面3页1.问题定义
问题定义阶段必须考虑的问题是“做什么”。正确理解用户的真正需求,是系统开发成功的必要条件。软件开发人员与用户之间的沟通,必须通过系统分析员对用户进行访问调查,扼要地写出对问题的理解,并在有用户参加的会议上认真讨论,澄清含糊不清的地方,改正理解不正确的地方,最后得到一份双方都认可的文档。在文档中,系统分析员要写明问题的性质、工程的预期目标以及工程的规模。问题定义阶段是软件生命周期中最短的阶段,一般不超过3天。2.可行性研究
可行性研究要研究问题的范围,并探索这个问题是否值得去解决,以及是否有可行的解决办法,可行性研究的结果是使用部门负责人做出是否继续这项工程决定的重要依据。可行性论证的内容包括:l
技术可行性。l
经济可行性。l
操作可行性。
可行性论证是分析员在收集资料的基础上,经过分析,明确工程软件项目的目标、问题域、主要功能和性能要求,确定应用软件的支撑环境以及经济、制作和时间限制等方面的约束条件,并用高层逻辑模型(通常用数据流图)对各种可能方案进行可行性分析及成本/效益分析。如果该项目在技术和经济上均可行,可明确地写出开发任务的全面要求和细节,形成软件计划任务书,作为本阶段的工作总结。软件计划任务书,包括:软件项目目标。主要功能、性能。系统的高层逻辑模型(数据流图)。系统界面。可供使用的资源。进度安排和成本预算。
3.需求分析
需求分析即系统分析,通常采用系统模型定义系统。在可行性分析的基础上,需求分析的主要任务是:明确用户要求软件系统必须满足的所有功能、性能和限制,也就是解决软件“做什么的问题”。系统分析员和用户密切配合,充分交流信息,得出经过用户确认的系统逻辑模型。系统的逻辑模型,通常是用数据流图、数据字典和简要的描述表示系统的逻辑关系。需求分析只是原理性方案的设计。在这一阶段的工作中,为清晰地揭示问题的本质,往往略去具体问题中的一些次要因素,只将功能关系抽象为反映该问题的系统模型。系统逻辑模型是以后设计和实现目标系统的基础,必须准确而完整地体现用户的要求。返回通过需求分析提交说明书,内容如下:概述需求说明:功能说明、性能说明数据描述:数据流图、数据字典、接口说明运行环境:设备要求、支持的软件需求分析说明书结构化分析方法SA(StructureAnalysis):是软件需求分析最常用的方法,它与设计阶段的结构设计方法SD(StructuredDesigne)一起使用,能够较好地实现软件系统的研制SA方法的基本原理SA方法的实施步骤SA方法的分析工具结构化分析方法SA结构化程序设计技术(SD)
如果一个程序的代码仅仅通过顺序、选择和循环这三种控制结构进行连接,并且每个代码块只有一个入口和出口,则称此程序为结构化的。基本手段分解:把复杂问题分解为若干较小问题(至上而下,逐层分解)抽象:略去细节先考虑最本质的东西基本方法:图形法(HC图或HIPO图)
1
1.11.21.111.121.211.22
SA方法的基本原理建立当前系统的具体模型抽象出当前系统的逻辑模型建立目标系统的逻辑模型考虑人机界面和其他一些问题
SA方法的实施步骤数据流图DFD:描述系统数据流程的图形工具数据字典DD:放置数据流图中包含的所有元素的定义结构化语言判定表SA方法的分析工具2、软件开发-设计
软件开发,是实现前一个时期定义的软件。它包含四个阶段:
设计(总体设计/详细设计)、编码、测试、维护。1.总体设计总体设计,也叫概要设计或初步设计。这个阶段必须回答的是“概括地说,应该如何解决这个问题”。最后得到软件设计说明书。总体设计的目标是采用结构化分析的成果,由数据模型、功能模型、行为模型描述的软件需求,按一定的设计方法,完成数据设计、体系结构设计、接口设计和过程设计。总体设计应遵循的一条主要原则就是程序模块化的原则。总体设计的结果通常以层次图或结构图来表示。2.详细设计
详细设计阶段的任务是把解法具体化,也就是回答“应该怎样具体地实现这个系统”。详细设计亦即模块设计。它是在算法设计和结构设计的基础上,针对每个模块的功能、接口和算法定义,设计模块内部的算法过程及程序的逻辑结构,并编写模块设计说明。详细设计阶段的方法:(1)结构化
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商场安全施工合同范例
- 2024年度品牌营销与推广服务合同
- 2024年度智能电网安防监控系统集成合同
- 商业车位阴阳合同范例
- 北京车辆租借合同范例
- 乙方违约合同模板
- 大学生 兼职合同范例
- 供热运行维护合同模板
- 唐装合作商家合同范例
- 农村旱地出售合同范例
- 中药材种植专业合作社新版章程
- MOOC 电工学(电气工程学概论)-天津大学 中国大学慕课答案
- 蔚来用户运营分析报告-数字化
- 来开火锅店!扇形统计图(课件)三年级上册数学
- 2024年广东机场集团招聘笔试参考题库附带答案详解
- (2024年)互联网营销师培训
- 人工智能在医疗保健领域的应用与发展
- 药业有限公司洗眼液生产及滴眼液扩产项目环评可研资料环境影响
- TCAPC 014-2023 零售药店经营银屑病治疗药品药学服务规范
- 冷库安装施工方案
- 环境设计职业生涯规划
评论
0/150
提交评论