计算机体系结构与算法分析毕业设计说明书,毕业设计

更新时间:2024-01-09 16:59:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

毕业设计说明书

学生姓名: 何阳 学 号: 20083841 学 院: 计算机与信息工程学院 专业年级: 软件工程 题 目: 计算机体系结构与基础算法分析研究

指导教师: 魏善沛 (教授)

评阅教师: 车生兵 (教授)

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

2012年5月

1 引言

作为早期设计决策的体现,软件体系结构明确了对系统实现的约束条件、决定了开发和维护组织的组织结构、制约着系统的质量属性、还能预测软件的质量、并且使推理和控制更改更为简单、有助于循序渐进的原型设计、还可以作为培训的基础。并且软件体系结构作为可传递和可重用的模型,比代码级的重用有更加大的好处,大幅度的缩短了软件的开发周期,缓解编码压力。

而算法是指对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每一条指令表示一个或多个操作。而一个程序的核心也是最基本的也在于算法,并不是只有解决高深问题的指令序列才叫算法,比如简单地从数组中查询一个数据,然后从链表中查询数据,然后从树中查询数据,然后从已经排好序的数组中二分查找数据,然后从排序树中查找数据,这些都是算法。

软件体系结构领域研究目前也是非常活跃,随着用于描述和推理的形式化语言的发展,在提高软件工程师对软件系统的描述和理解能力中,软件体系结构描述起着重要作用,所以了解这些形式化语言有助于我们理解整个软件体系结构的编排,帮助我们把握整个软件的开发。

算法的复用属于代码层面的复用,在解决相似的或者相同的问题方面有着很大的优势。并且在提高程序的运行速度和操作反应速度以及更好的利用资源这些方面有着很好的效应,所以算法的运用在开发的过程中也是不可忽视的环节。

体系结构复用属于设计复用,比代码复用更抽象。一般认为易于复用的标准包括:领域易于理解,变化相对慢,内部有构件标准,与已存在的基础设施兼容,在大规模系统开发时体现规模效应。体系结构是对系统的高层抽象,反应的是系统的主要组成元素及交互关系,并只对感兴趣的属性进行建模,所以相对于算法来说更稳定,更适合于复用。

由于体系结构是在软件开发过程之初产生的,因此设计好的体系结构可以减少和避免软件错误的产生和维护阶段的高昂代价。体系结构是系统集成的蓝本、系统验收的依据,习题结构本身也需要分析与测试,以确定体系结构是否满足需求。所以我们要对软件体系结构有很深刻的认识。

1

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

鉴于软件体系结构是应大系统开发和软件产品线技术而出现的,因此我们有必要去研究软件体系结构与基础算法之间的关系。

2 软件体系结构概述

自从软件系统首次被分成许多模块,模块之间相互作用,组合起来有整体的属性,就具有了体系结构。优秀的开发者常常会使用一些体系结构模式作为软件体系结构实际策略,但他们并没有规范地、明确地表达出来,这样就无法将他们的知识与别人交流。事实上,软件总是具有体系结构,不存在没有体系结构的软件。软件就好比一座楼房,从整体上讲,是因为它有基础、主体和装饰,即操作系统上的基础设施软件,实现计算逻辑的主体应用程序,方便使用的用户界面程序。从细节上来看,每一个程序也是有结构的。早期的结构化程序就是以语句组成模块,模块的聚集和嵌套形成的层层调用的程序结构就是体系结构。

2.1 软件体系结构定义

虽然软件体系结构已经在软件工程领域中有着广泛的应用,但迄今为止还没有一个被大家所公认的定义。许多专家学者从不同的角度和不同的侧面对软件体系结构进行了刻画,下面列举二个较为典型的定义:

① Dewayne Perry和Alexander Wolf曾这样定义:软件体系结构式具有一定形式的结构化元素,即构件集合,包括处理构件、数据构件和连接构件。处理构件对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组合连接起来。这一定义注重区分处理构件、数据构件和链结构件,这一方法在其他的定义和方法中基本上得到保持。

② Mart Shaw和David Garlan认为软件体系结构是软件设计过程中的一个层次,这一层次超越计算过程中的算法设计和数据结构设计。体系结构问题包括总体组织和全局控制,通信协议,同步数据存储给设计元素分配特定功能,设计元素的组织、规模和性能,在各设计方案间进行选择等。软件体系结构处理算法与数据结构上关于整体系统结构设计和描述方面的一些问题,如全局组织和全局控制结构,关于通信、同步与数据存取的协议,设计构建功能定义,物理分布合

2

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

成,设计方案的选择、评估与实现等。

在本论文中使用软件体系结构的下列定义:

软件体系结构为软件系统提供一个结构、行为和属性的高级抽象,有构成系统的元素的描述、这些元素的相互作用、指导元素集成的模式以及这些模式的约束组成。软件体系结构不仅制定了系统的组织结构和拓扑结构,并且显示系统需求和构成系统的元素之间的对应关系,提供了一些设计决策的基本原理。

2.2 构件与软件的重用

一般认为,构件是指语义完整、语法正确和有可重用价值的单位软件,是软件重用过程中可以明确辨识的系统;结构上,它是语义描述、通信接口和实现代码的复合体。

图2-1青鸟构件模型

2.3 软件体系结构风格

软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。体系结构风格定义一个系统家族,即一个体系结构定义一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起来的。体系结构风格反应了领域中众多系统所共有的结构和语义特征,并指导如何各个模块和子系统有效地组织成一个完整的系统。按照这种方式

3

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

理解,软件体系结构风格定义了用于描述系统的术语表和一组指导构件系统的规则。

对软件体系结构风格的研究和实践促进对设计的重用,一些经过实践证实的解决方案也可以可靠地用于解决新的问题。体系结构风格的不变部分使不同的系统可以共享同一个实现代码。只要系统是使用常用的、规范的方法来组织,就可以使别的设计者可以很容易地理解系统的体系结构。 2.3.1 客户/服务器

客户/服务器(C/S)计算技术在信息产业中占有重要的地位。网络计算经历了从基于宿主机的计算模型到客户/服务器计算模型的演变。

C/S软件体系结构式基于资源不对等,且为实现共享而提出来的,是20世纪90年代成熟起来的技术,C/S体系结构定义了工作站如何与服务器相连,以实现数据和应用分布到多个处理机上。C/S体系结构有三个主要组成部分:数据库服务器、客户应用程序和网络,如图2-2所示。

图2-2 C/S体系结构示意图

其中服务器负责有效地管理系统的资源,其任务集中于: ① 数据库安全性的要求。 ② 数据库访问并发性的控制。

4

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

③ 数据库前端的客户应用程序的全局数据完整性规则。 ④ 数据库的备份与恢复。 客户应用程序的主要任务是: ① 提供用户与数据库交互的界面。

② 向数据库服务器提交用户请求并接收来自数据库服务器的信息。 ③ 利用客户应用程序对存在于客户端的数据执行应用逻辑要求。 网络通信软件的主要作用是完成数据库服务器和客户应用程序之间的数据传输。

在一个C/S体系结构的软件系统中,客户应用程序是针对一个小的、特定的数据集,如一个表的行来进行操作,而不是像文件服务器那样针对整个文件进行;对某一条记录进行封锁,而不是对整个文件进行封锁,因此保证了系统的并发性,并使网络上传输的数据量减少到最少,从而改善了系统的性能。

C/S体系结构的有点主要在于系统的客户应用程序和服务器构建分别运行在不同的计算机上,系统中每台服务器都可以适合各构件的要求,这对于软件和硬件的变化显示出极大的适应性和灵活性,而且易于对系统进行扩充和缩小。在C/S体系结构中,系统中的功能构件充分隔离,客户应用程序的开发集中于数据的显示和分析,而数据库服务器的开发集中于数据的管理,不必再每一个新的应用程序中都要对一个DBMS进行编码。将大应用处理任务分布到许多通过网络连接的低成本计算机上,以节约大量费用。

C/S体系结构具有强大的数据操作和事务处理能力,模型思想简单,易于人们理解和接受。但随着企业规模的日益扩大,软件的复杂程度不断提高,C/S体系结构之间暴露了以下缺点:

① 开发成本高。C/S体系结构对客户端软件软硬件配置要求较高,尤其是软件的不断升级,对硬件要求不断提高,增加了整个系统的成本,而且客户端变得越来越臃肿

② 客户端程序设计复杂。采用C/S体系结构进行软件开发,大部分工作量放在客户端的程序设计上,客户端显得十分庞大。

③ 信息内容单一,因为传统应用一般为事物处理,界面基本遵循数据库的字段解释,开发之初就已确定,而且不能随时截取办公信息和档案等外部信息,用户获得的只是单纯的字符和数字,既枯燥又死板。

5

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

④ 用户界面风格不一,使用繁杂,不利于推广使用。

⑤ 软件移植困难。采用不同开发工具或平台开发的软件,一般互不兼容,不能或很难移植到其他平台上运行。

⑥ 软件维护和升级困难。采用C/S体系结构的软件要升级,开发人员必须到现场为客户机升级,每个客户机上的软件都需要维护,对软件的一个小小改动,每个客户机都必须更新。

⑦ 新技术不能轻易应用。因为一个软件平台及开发工具一旦选定,不可能轻易更改。 2.3.2 分层系统

层次系统组织成一个层次结构,每一层为上层服务,并作为下层客户。在一些层次系统中,除了一些精心挑选的输出函数之外,内部的层只对相邻的层可见。这样的系统中构件在一些层实现了虚拟机。连接件通过决定层间如何交互的协议来定义,拓扑约束包括对相邻层间交互的约束。

这种风格支持基于可增加抽象层的设计。这样,允许将一个复杂问题分解成一个增量步骤序列实现。由于每一层最多影响两层,同时只要给相邻层提供相同的接口,允许每个层用不同的方法实现,同样为软件重用提供了强大的支持。

分层系统的风格如图2-3所示,层次系统最广泛的应用时分层通信协议。在这一应用领域中,每一层提供一个抽象的功能,作为上层通信的基础。较低的层次定义低层的交互,最低层通常只定义硬件物理连接。

6

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

图2-3 层次系统风格的体系结构

层次系统的许多可取属性如下:

① 支持基于抽象程度递增的系统设计,使设计者可以把一个复杂系统按照递增的步骤进行分解。

② 支持功能增强,因为每层至多和相邻的上下层交互,因此功能的改变最多影响相邻的上下层。

③支持重用。只要提供的服务接口定义不变,同一层的不同实现可以交换使用。这样,就可以定义一组标准的接口,而允许各种不同的实现方法。

但是,层次系统也存在以下不足之处:

① 并不是每一个系统都可以很容易地划分为分层的模式,甚至即使一个系统的逻辑结构是层次化的,出于对系统性能的考虑,系统设计师不得不把一些低级或者高级的功能综合起来。

②很难找到一个合适的、正确的层次抽象方法。

2.4 软件体系结构

从软件体系结构研究和应用的现状来看,当前对软件体系结构的描述,在很大程度上来说还停留在非形式化的基础上,很大程度上依赖于软件设计师个人的经验和技巧。在目前通用的软件开发方法中,其对软件体系结构的描述通常是采

7

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

用非形式化的图和文本,不能描述系统期望的存在于构件之间的接口,更不能描述不同的组成系统的组合关系的意义。这种描述方法难以被开发人员理解,难以适于进行形式化分析和模拟,缺乏相应的支持工具帮助设计师完成设计工作,更不能用来分析其一致性和完整性等特性。 因此,形式化的、规范化的体系结构描述对于体系结构的设计和理解都是非常重要的。然而,要实现体系结构设计、描述等的形式化并不是一蹴而就的,我们必须先经历一个非形式化的过程,在非形式化的发展过程中逐步提取一些形式化的标记和符号,然后将它们标准化,从而完成体系结构设计、描述等的形式化。

首先简单地介绍传统的软件体系结构描述方法,然后再比较详细地讨论软件体系结构描述语言。

2.4.1 传统软件体系结构研究方法

对于软件体系结构的描述和表达,一种简洁易懂且使用广泛的方法是采用由

矩形框和有向线段组合而成的图形表达工具。在这种方法中,矩形框代表抽象构件,框内标注的文字为抽象构件的名称,有向线段代表辅助各构件进行通讯、控制或关联的连接件。例如:图1表示某软件辅助理解和测试工具的部分体系结构描述。

目前,这种图形表达工具在软件设计中占据着主导地位。尽管由于在术语和表达语义上存在着一些不规范和不精确,而使得以矩形框与线段为基础的传统图形表达方法在不同系统和不同文档之间有着许多不一致甚至矛盾,但该方法仍然以其简洁易用的特点在实际的设计和开发工作中被广泛使用,并为工作人员传递了大量重要的体系结构思想。

为了克服传统图形表达方法中所缺乏的语义特征,有关研究人员试图通过增加含有语义的图元素的方式来开发图文法理论。

软件体系结构的第二种描述和表达方法是采用将一种或几种传统程序设计语言的模块连接起来的模块内连接语言MIL(Module Interconnection Language)。由于程序设计语言和模块内连接语言具有严格的语义基础,因此他

8

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

们能支持对较大的软件单元进行描述,诸如定义/使用和扇入/扇出等操作。

MIL方式对模块化的程序设计和分段编译等程序设计与开发技术确实发挥了很大的作用。但是由于这些语言处理和描述的软件设计开发层次过于依赖程序设计语言,因此限制了他们处理和描述比程序设计语言元素更为抽象的高层次软件体系结构元素的能力。

软件体系结构的第三种描述和表达方法是采用基于软构件的系统描述语言。基于软构件的系统描述语言将软件系统描述成一种是由许多以特定形式相互作用的特殊软件实体构造组成的组织或系统。

这种表达和描述方式虽然也是较好的一种以构件为单位的软件系统描述方法,但是他们所面向和针对的系统元素仍然是一些层次较低的以程序设计为基础的通信协作软件实体单元,而且这些语言所描述和表达的系统一般而言都是面向特定应用的特殊系统,这些特性使得基于软构件的系统描述仍然不是十分适合软件体系结构的描述和表达。 2.4.2 体系结构语言

软件体系结构的第四种描述和表达方法是参照传统程序设计语言的设计和开发经验,重新设计、开发和使用针对软件体系结构特点的专门的软件体系结构描述语言ADL(Architecture Description Language),由于ADL是在吸收了传统程序设计中的语义严格精确的特点基础上,针对软件体系结构的整体性和抽象性特点,定义和确定适合于软件体系结构表达与描述的有关抽象元素,因此,ADL是当前软件开发和设计方法学中一种发展很快的软件体系结构描述方法。 ADL是这样一种形式化语言,它在底层语义模型的支持下,为软件系统的概念体系结构建模提供了具体语法和概念框架。基于底层语义的工具为体系结构的表示、分析、进化、细化、设计过程等提供支持。其三个基本元素是: ① 构件:计算或数据存储单元;

② 连接件:用于构件之间交互建模的体系结构构造块及其支配这些交互的规则;

9

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

③ 体系结构配置:描述体系结构的构件与连接件的连接图。

主要的体系结构描述语言有Aesop、MetaH、C2、Rapide、SADL、Unicon和Wright等,尽管它们都描述软件体系结构,却有不同的特点。Aesop支持体系结构风格的应用,MetaH为设计者提供了关于实时电子控制软件系统的设计指导,C2支持基于消息传递风格的用户界面系统的描述,Rapide支持体系结构设计的模拟并提供了分析模拟结果的工具,SADL提供了关于体系结构加细的形式化基础,Unicon支持异构的构件和连接类型并提供了关于体系结构的高层编译器,Wright支持体系结构构件之间交互的说明和分析。这些ADL强调了体系结构不同的侧面,对体系结构的研究和应用起到了重要的作用,但也有负面的影响。每一种ADL都以独立的形式存在,描述语法不同且互不兼容,同时又有许多共同的特征,这使设计人员很难选择一种合适的ADL,若设计特定领域的软件体系结构又需要从头开始描述。

表2-1 典型元素含义比较

程序设计语言 软件体系结构 模块化级别的系统组成成分实组成程序的基本元素以及其程序构件 取值域范围 系统构件 体,这些实体可以被施以抽象的特性化处理,并以多种方式得到使用 对组成系统的有关抽象实体进操作符 连接构件的各种功能符号 连接件 行各种连接的连接机制 系统中的构件和连接件进行连有关构件和操作符的命名表抽象规则 达规则 件体系结构的风格 一组选择并决定具体使用何决定有关模式能够作为子系统种抽象规则来作用于有关的限制规则 基本构件及其操作符的规则的合法子系统的有关条件 和原理 规范说明

组合模式 接组合的特殊方式,也就是软限制规则 进行大型软件系统构造和开发有关句法的语义关联说明 规范说明 10

有关系统组织结构方面的语义中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

关联说明

按照Mary Shaw和David Garlan的观点,典型的ADL在充分继承和吸收传统程序设计语言的精确性和严格性特点的还应该具有构造、抽象、重用、组合、异构和分析推理等各种能力和特性。其中:

① 构造能力指的是ADL能够使用较小的独立体系结构元素来建造大型软件系统;

② 抽象能力指的是ADL使得软件体系结构中的构件和连接件描述可以只关注它们的抽象特性,而不管其具体的实现细节;

③ 重用能力指的是ADL使得组成软件系统的构件、连接件甚至是软件体系结构都成为软件系统开发和设计的可重用部件;

④ 组合能力指的是ADL使得其描述的每一系统元素都有其自己的局部结构,这种描述局部结构的特点使得ADL支持软件系统的动态变化组合; ⑤ 异构能力指的是ADL允许多个不同的体系结构描述关联存在; ⑥ 分析和推理能力指的是ADL允许对其描述的体系结构进行多种不同的性能和功能上的多种推理分析。

根据这些特点,我们可以将下面这样的语言排除在ADL之外:高层设计符号语言、MIL、编程语言、面向对象的建模符号、形式化说明语言。ADL与需求语言的区别在于后者描述的是问题空间,而前者则扎根于解空间中。ADL与建模语言的区别在于后者对整体行为的关注要大于对部分的关注,而ADL集中在构件的表示上。ADL与传统的程序设计语言的构成元素即有许多相同和相似之处,又各自有着很大的不同。 2.4.3 软件体系结构抽象模型

下面,我们给出程序设计语言和ADL的典型元素的属性和含义比较以及软件

11

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

体系结构中经常出现的一些构件和连接件元素。

1.构件

构件是一个计算单元或数据存储。也就是说,构件是计算与状态存在的场所。在体系结构中,一个构件可能小到只有一个过程或大到整个应用程序。它可以要求自己的数据与/或执行空间,也可以与其它构件共享这些空间。作为软件体系结构构造块的构件,其自身也包含了多种属性,如接口、类型、语义、约束、进化和非功能属性等。

接口是构件与外部世界的一组交互点。与面向对象方法中的类说明相同,ADL中的构件接口说明了构件提供的那些服务(消息、操作、变量)。为了能够充分地推断构件及包含它的体系结构,ADL提供了能够说明构件需要的工具。这样,接口就定义了构件能够提出的计算委托及其用途上的约束。

构件作为一个封装的实体,只能通过其接口与外部环境交互,构件的接口由一组端口组成,每个端口表示了构件和外部环境的交互点。通过不同的端口类型,一个构件可以提供多重接口。一个端口可以非常简单,如过程调用。也可以表示更为复杂的界面,如必须以某种顺序调用的一组过程调用。

构件类型是实现构件重用的手段。构件类型保证了构件能够在体系结构描述中多次实例化,并且每个实例可以对应于构件的不同实现。抽象构件类型也可以参数化,进一步促进重用。现有的ADL都将构件类型与实例区分开来。 由于基于体系结构开发的系统大都是大型、长时间运行的系统,因而系统的进化能力显得格外重要。构件的进化能力是系统进化的基础。ADL是通过构件的子类型及其特性的细化来支持进化过程的。目前,只有少数几种ADL部分地支持进化,对进化的支持程度通常依赖于所选择的程序设计语言。其他ADL将构件模型看作是静态的。ADL语言大多是利用语言的子类型来实现对进化支持的。利用面向对象方法,从其它类型派生出它的接口类型,形成结构子类型。 2.连接件

连接件是用来建立构件间的交互以及支配这些交互规则的体系结构构造模

12

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

块。与构件不同,连接件可以不与实现系统中的编译单元对应。它们可能以兼容消息路由设备实现(如C2),也可以以共享变量、表入口、缓冲区、对连接器的指令、动态数据结构、内嵌在代码中的过程调用序列、初始化参数、客户服务协议、管道、数据库、应用程序之间的SQL语句等形式出现。大多数ADL将连接件作为第一类实体,也有的ADL则不将连接件作为第一类实体的。

连接件作为建模软件体系结构的主要实体,同样也有接口。连接件的接口由一组角色组成,连接件的每一个角色定义了该连接件表示的交互参与者,二元连接有两个角色,如消息传递连接件的角色是发送者和接收者。有的连接件有多于两个的角色,如事件广播有一个事件发布者角色和任意多个事件接受者角色。 显然,连接件的接口是一组它与所连接构件之间的交互点。为了保证体系结构中的构件连接以及它们之间的通信正确,连接件应该导出所期待的服务作为它的接口。它能够推导出正交软件体系结构线索的形成情况。体系结构配置中要求构件端口与连接件角色的显式连接。

体系结构级的通讯需要用复杂协议来表达。为了抽象这些协议并使之能够重用,ADL应该将连接件构造为类型。构造连接件烈性可以将作为用通信协议定义的类型系统化并独立于实现,或者作为内嵌的、基于它们的实现机制的枚举类型。 为完成对构件接口的有用分析、保证跨体系结构抽象层的细化一致性,强调互联与通信约束等,体系结构描述提供了连接件协议以及变换语法。为了确保执行计划的交互协议,建立起内部连接件依赖关系,强制用途边界,就必须说明连接件约束。ADL可以通过强制风格不变性来实现约束,或通过接受属性限制给定角色中服务。 2.4.4 体系结构配置

体系结构配置或拓扑是描述体系结构的构件与连接件的连接图。体系结构配置提供信息来确定构件是否正确连接、接口是否匹配、连接件构成的通信是否正确,并说明实现要求行为的组合语义。

13

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

体系结构适合于描述大的、生命周期长的系统。利用配置来支持系统的变化,使不同技术人员都能理解并熟悉系统。

为了在不同细节层次上描述软件系统,ADL将整个体系结构作为另以个较大系统的单个构件。也就是说,体系结构具有复合或等级复合的特性。另一方面,体系结构配置支持采用异构构件与连接件。这是因为软件体系结构的目的之一是促进大规模系统的开发,即倾向于使自己有的构件与不同粒度的连接件,这些构件与连接件的设计者、形式模型、开发者、编程语言、操作系统、通信协议可能都不相同。另外一个事实是,大型的、长期运行的系统是在不断增长的。因而,ADL必须支持可能增长的系统的说明与开发。大多数ADL提供了复合特性,所以,任意尺度的配置都可以相对简洁地在足够的抽象高度表示出来。

我们知道,体系结构设计是整个软件生命周期中关键的一环,一般在需求分析之后,软件设计之前进行。而形式化的、规范化的体系结构描述对于体系结构的设计和理解都是非常重要的。因此,ADL如何能够承上启下将是十分重要的问题,一方面是体系结构描述如何向其它文档转移,另一方面是如何利用需求分析成果来直接生成系统的体系结构说明。

现有的ADL大多是与领域相关的,这不利于对不同领域体系结构的说明。这些针对不同领域的ADL在某些方面又大同小异,造成了资源的冗余。有些ADL可以实现构件与连接件的进化,但这样的进化能力是有限的,这样的进化大多是通过子类型实现的。而且,系统级的进化能力才是最终目的。尽管现有的ADL都提供了支持工具集,但将这些ADL与工具应用于实际系统开发中的成功范例还有限。支持工具的可用性与有效性较差,严重地阻碍了这些ADL的广泛应用。

14

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

3 基础算法概述

3.1 算法的定义

算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。 一个算法应该具有以下五个重要的特征:

有穷性: 一个算法必须保证执行有限步之后结束; 确切性: 算法的每一步骤必须有确切的定义;

输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输

入是指算法本身定除了初始条件;

输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有

输出的算法是毫无意义的;

可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后

即可完成。

3.2 算法设计与分析的基本方法

1.递推法

递推算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法. 递推是序列计算机中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度

15

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

快和不知疲倦的机器特点。 2.递归法

程序调用自身的编程技巧称为递归( recursion)。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 注意:

(1) 递归就是在过程或函数里调用自身;

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 3.穷举法

穷举法,或称为暴力破解法,是一种针对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止。例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。因此有些人运用计算机来增加效率,有些人辅以字典来缩小密码组合的范围。 4.贪婪算法

贪婪算法是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题, 通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。 贪婪算法是一种改进了的分级处理方法。其核心是根据题意选取一种量度标准。然后将这多个输入排成这种量度标准所要求的顺序,按这种顺序一次输入一个量。如果这个输入和当前已构成在这种量度意义下的部分最佳解加在一起不能产生一个可行解,则不把此输入加到这部分解中。这种能够得到某种量度意义下最优解的分级处理方法称为贪婪算法。 对于一个给定的问题,往往可能有好几种量度标准。

16

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

初看起来,这些量度标准似乎都是可取的,但实际上,用其中的大多数量度标准作贪婪处理所得到该量度意义下的最优解并不是问题的最优解,而是次优解。因此,选择能产生问题最优解的最优量度标准是使用贪婪算法的核心。

图3-1 贪婪算法流程图

一般情况下,要选出最优量度标准并不是一件容易的事,但对某问题能选择出最优量度标准后,用贪婪算法求解则特别有效。最优解可以通过一系列局部最优的选择即贪婪选择来达到,根据当前状态做出在当前看来是最好的选择,即局部最优解选择,然后再去解做出这个选择后产生的相应的子问题。每做一次贪婪选择就将所求问题简化为一个规模更小的子问题,最终可得到问题的一个整体最优解。 5.分治法

分治法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题??直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治法所能解决的问题一般具有以下几个特征:

(1) 该问题的规模缩小到一定的程度就可以容易地解决

(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结

17

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

构性质。

(3) 利用该问题分解出的子问题的解可以合并为该问题的解;

(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 6.动态规划法

动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。 动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。 7.迭代法

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。 8.分枝界限法

分枝界限法是一个用途十分广泛的算法,运用这种算法的技巧性很强,不同类型的问题解法也各不相同。分支定界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集(称为分支),并为每个子集内的解的值计算一个下界或上界(称为定界)。在每次分支后,对凡是界限超出已知可行解值那些子集不再做进一步分支。这样,解的许多子集(即搜索树上的许多结点)就

18

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

可以不予考虑了,从而缩小了搜索范围。这一过程一直进行到找出可行解为止,该可行解的值不大于任何子集的界限。因此这种算法一般可以求得最优解。 与贪心算法一样,这种方法也是用来为组合优化问题设计求解算法的,所不同的是它在问题的整个可能解空间搜索,所设计出来的算法虽其时间复杂度比贪婪算法高,但它的优点是与穷举法类似,都能保证求出问题的最佳解,而且这种方法不是盲目的穷举搜索,而是在搜索过程中通过限界,可以中途停止对某些不可能得到最优解的子空间进一步搜索(类似于人工智能中的剪枝),故它比穷举法效率更高。

3.3 算法的评价方法

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。

1.时间复杂度 算法的时间复杂度是指执行算法所需要的时间。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做 T(n)=Ο(f(n))因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

2.空间复杂度 算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

3.4 算法的分类

3.4.1 算法的分类

算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法。

算法可以宏泛的分为三类:

有限的,确定性算法 这类算法在有限的一段时间内终止。他们可能要花很

19

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。

有限的,非确定算法 这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。

无限的算法 是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。 3.4.2 常见的算法

冒泡排序(Bubble Sort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。

20

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

图3-2 冒泡排序法第一次排序示例

用双重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i,j的值依次为1,2,...10-i。

选择排序(Select Sort)是指每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

简单选择排序的思路很简单,将最小的元素找出并放在序列的最前面,在剩下的元素中继续找出最小的元素放在第二个位置上,以此类推,即可确定其在最终序列中的最终位置。例如:

public void SelectSort(int[] A, int length){

int min;

for(int i=0;i

21

min=i;//记录的最小元素的位置

for(int j=i+1;j

if(A[j]

min=j;//更新最小元素位置

if(min!=i)

Swap(A[i],A[min]);//与第i个位置交换

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

整个排序过程共需要选择n-1次,第i趟选择最小元素所需要的比较次数为n-i次,与数组的初始排列无关,因此总共的比较次数是n(n-1)/2

4 应用软件设计

算法与体系结构的结合运用体现在很多方面,比如有些软件体系结构模型就是以某种算法为基础建立的。而在该处讨论的是在某种软件体系结构的基础上使用基础算法完成某些功能或者提高软件执行效率的方面。因此,在软件设计之初考虑到要用一些基础算法来完善系统的结构和效率,所以采用基于MVC软件界面的体系结构来构建一个简单的仓库系统,从而分析和得到软件体系结构与基础算法之间的联系和用途。

4.1 功能设计

可能有些人会弄不懂MVC体系结构风格与三层系统风格有何区别,因此在软件设计之初,就两者进行了一些简单的的比较。

同样是架构级别的,它们有什么相同点和不同点呢?

其实它们相同的地方在于他们都有一个表现层。所以他们主要不同的地方在于其他的两个层。

22

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

首先先解释一下MVC。V即View.是视图的意思。C即Controller,是控制器的意思。而M即Model,是模型的意思。这三个里.最不容易理解的应该是Model.就是什么是Model,而为什么叫Model。

先不说为什么叫Model,先解释Controller。Controller是控制器的意思,所谓控制器,就是将用户请求转发给模型层,经过处理后把结果返回到界面展现的一个中间层。

再来说说M,即Model,在Java Web里说的是Java Bean,我认识的很多人都把Java Bean误认为是实体类,其实Java Bean有比实体类更丰富的定义,在Java Bean中除了其属性和字段,还可以有行为及其事件,Java Bean可以理解为普通Java对象。Java普通对象,就是符合Java规范的所有对象,这和实体类完全是两回事。所以,我认为在MVC中。业务逻辑和数据访问应该放在Model层,也就是V负责展示数据,Controller除了转发不做业务逻辑。真正的逻辑事务,数据访问,甚至算法都放到Model去。

再说三层架构。三层其实很好理解,界面,业务,数据访问,就这三个,从字面都可以理解出它们的意思。我要说的是它和MVC的区别。在三层架构中没有定义Controller的概念。这是我认为最不同的地方。而MVC也没有把业务的逻辑访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。

当然了。在三层中也提到了Model,但是三层架构中Model的概念与MVC中Model的概念是不一样的,“三层”中典型的Model层是已实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。不一样的概念。虽然名字一样。

所以,这里采用的是基于MVC结构风格的架构来设计软件的架构,在完善软件时,将一些需要用到的算法和函数放在Model层,用以完善系统和优化整个软件的结构。

因为是一个基于MCV架构的仓库系统,所以整个系统在功能上并不复杂,基本上只是完成了和后期添加的算法相关的功能。由于算法方面没有涉及到数据库数据添加的方面,功能侧重于数据的查找和显示,所以主要就是基于一个MD5加密的注册和登陆的模块,以及一个基于冒泡排序的查找模块。

4.2 数据库设计

该系统的数据库比较简单,包含四个简单的表:

23

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

表中的详细关系如下说明。 管理员表中包含了:

管理员号,管理员名,密码,性别,管理员电话,邮箱以及地址。 商品表中包含了:

商品号,商品名,商品产商,商品零售商,商品数量,对应的仓库号。 仓库表中包好了:

仓库号,仓库名,仓库总容量,仓库当前容量,仓库状态。

订单表中包含了:

订单号,商品号,管理员号,商品数,订单日期。

每一种商品只对应一个仓库,一个仓库中能共存储多种商品。一张订单只对应一个管理员和一种商品,而一个管理员可以对应多张订单,一种商品也能对应多张订单,其数据库物理模型如图4-1所示。

图4-1 数据库物理模型

4.3 主要分析功能

1.注册功能

注册时密码存入数据库时有一个简单的加密算法,相应的取出时有一个对应的解密算法。用来在一定的程度上保障管理员的账号安全。

/**

* 加密算法

24

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

return pas; }

}

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

* @param data 原始的明文密码 * @return MD5算法加密后的密码 */

private String getwod(char[] data) {

String pas = null; try {

MessageDigest md = MessageDigest.getInstance(\返回指定的MD5摘要md.update(String.valueOf(data).getBytes());//使用制定字节更新摘要 byte ball[] = md.digest();//通过执行诸如填充之类的最终操作完成哈希计算 int i;//定义的一个初始变量,用来存放相应的值 StringBuffer buf = new StringBuffer(\

for (int offset = 0; offset < ball.length; offset++) { }

pas = buf.toString();// 32位的加密 System.out.println(pas);

i = ball[offset];//获取指定字节处的值 if (i < 0)

i += 256;//改变指定位置符合条件的值 buf.append(\if (i < 16)

buf.append(Integer.toHexString(i));//在新的字节流中加入新的改变了的字符

MessageDigest类

从注册界面上获取到的密码是一个char[],Model层在获取到这个装有密码的数组之后,调用加密的方法。该方法获得需要加密的参数之后,首先解析该数组,通过摘要类使用指定的字节来更新摘要,通过填充类来生成一个新的字节数组。在解析字节数组中的每一个位置对应的字节,当字节大小小于0时,在原字节长度的基础上加上256长度,若是大小小于16则在原字节长度的基础上加上0,然后将新的字节添加到新的字节数组中去。所获取到的就是新的加密后的密码。

注册时加密存入数据库中,避免直接访问数据库时看到的是明文密码。保证了用户数据的安全性,同时也会提高系统的可靠性。

25

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

2.排序扩展

在对容量进行排序时,由于table中自带的排序和数据库中的数据会产生一定的冲突,排序不会成功,所以有一个冒泡排序近似的算法来完成功能。

public void actionPerformed(ActionEvent e) {

Vector data=service.findALL();//获取数据库中所有物品的信息数据 if(((JButton)e.getSource()).getName().equals(\显示商品\ } }

//如果点击的是显示商品的按钮

table=new JTable(new MyGoodsModel(data)); frame.getPanl().getViewport().add(table);

table.getTableHeader().setReorderingAllowed(false);// 不允许改变表头的顺序 table.setAutoCreateRowSorter(true); frame.getPanl().updateUI();

System.out.println(\运行排序\点的是排序的按钮

Vector array=new Vector();//用来存放新排序的数据的容器 for(int i=0;i

int num=data.get(i).getGoodsNum();//获取当前数据的存货量 int state=i;//记录最大的存货的位置 for(int j=0;j

if(num<=data.get(j).getGoodsNum()){ }

num=data.get(j).getGoodsNum();//如果当前位置的存货量比下个位置的state=j;//记录最大存货量的位置

}else{

存货量大的话就将下个位置的存货量替换

}//end of for

array.add(data.get(state));//将一轮遍历完了的最大存货量的数据添加到新的容data.remove(state);//丛原容器中移除

器中

}//end of for

table=new JTable(new MyGoodsModel(array));//将新的数据付给表格模型 frame.getPanl().getViewport().add(table);//刷新表

table.getTableHeader().setReorderingAllowed(false);// 不允许改变表头的顺序 //table.setAutoCreateRowSorter(true); frame.getPanl().updateUI();//刷新表

自定义排序会在完成系统要求功能的同时提高程序执行和反应的效率,在一定程度上优化了系统。

26

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

5 软件体系结构中算法运用的分析

5.1 排序算法结果分析

图5-1 使用自带的算法排序后的结果

由图5-1不难看出,由于数据库字段的问题table类中自带的排序后产生的结果并不是我们想要的理想的结果。它是将数值型的数据当做字符串来排序的,并不是想数值型那样由大到小的排序后的结果,所以我们需要在原有的软件结构的基础上添加新的排序算法来达到想要的结果。

27

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

图5-2 用冒泡算法之后的排序结果

所以添加了新的冒泡排序操作后的结果就如图5-2所示,“存货”数量的排序是按照有大到小的顺序排列的,达到了我们想要的结果。

因此不难看出,基础算法在完善系统的功能方面有很好的效果。所以,在系统设计好的基础上,在完善某些功能时,可以优先考虑基础算法去解决。

5.2 加密算法分析

登录时服务器获取到的用户名的密码在前端就已经做了处理,经过MD5转码,将字符串型的用户密码转成16进制的类型存入数据库或者从数据库提取做验证,在基本程度上保证了用户的密码的安全。

28

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

从界面按获取密码原文调用MD5类返回指定的摘要使用指定字节更新摘要填充更新完的摘要并赋予一个字节数组当前位置是否小于数组长度否当前字节长度<0>16是<16字节值后面加256字节值后面加“0”字节值不变完成加密返回加密后的密文将新的字节值存入数组 图5-3 密文加密流程图

比如用户名的账号密码分别为:admin,admin,那么服务器收到的用户名密码就分别是:admin,21232f297a57a5a743894a0e4a801fc3。要是客户端机器上有中了木马病毒之类的,在不知道系统的解密的算法的情况下就无法窃取到用户的密码。

5.3 扩展分析

基础算法除了在完善系统功能和解决系统性能上有很大的作用之外,在提高系统执行的效率方面也有很大的作用。考虑到在仓库系统的操作中在提高效率主要是从数据库操作方面入手,而存储结构基本上不涉及到算法或者很少涉及到算法,所以没有做相关的实例。但是从基础算法的理解上入手,不难看出,基础算法在提高软件的数据访问效率上的确是有很大的作用的。像在缓存中查找对应的

29

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

数据就可以用到一些查找算法,在存储过程中用到的递归法等等都是这一结论的最好证明。

所以结合以上的研究成果和一些往期的编码经验,不难发现以下规律:一个好的软件不可能只是依靠软件体系结构来完成,一个好的算法也肯定有一个良好的架构来组合。因此,在整个软件开发的编码的过程中,首先要考虑的是整个工程在软件体系结构上的设计,基础算法只是在具体的细节设计上,为了完成一些复杂的功能或者是为了优化系统执行的效率时使用。可以说,基础算法主要作用的地方是在于提高整个系统的性能上,而体系结构的运用却是为系统拟好一个大纲,软件的实现是以这个大纲为基础的。

结 论

综合来看软件的设计是在一个软件体系结构之上的,但是一个完整的软件不可能只是单纯的依靠某种软件体系结构来完成,其中很多的细节都是依靠一些基础的算法和一些巧妙地组合来实现的。软件体系结构只能决定软件的整体的模型,不能决定软件的细节上的走向,整个软件的效率和稳定都是依靠整个编码的合理性以及高效来决定的,细节上的成功才是软件成功的基础。

30

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

但是一个软件也不可能完全的只依靠算法来支持,否则的话虽然软件可能会在效率上会有提高,但是在整体的软件结构上会有散乱的感觉,而且不便于后期软件的维护和升级。

软件体系结构的作用主要体现在整个开发之初系统的设计方面,而基础算法的作用主要体现在编码时系统的效率优化和功能实现方面。所以,软件体系结构和基础算法是相互依存的关系。软件体系结构需要基础算法来完善其内部实现以及优化其效率,而基础算法需要软件体系结构将许多零散的部分连接成一个整体。

致 谢

经历了找工作的焦灼、写论文的煎熬之后,感觉好像一切都尘埃落定,想

起了那句伤感的歌词:“Time to say goodbye.”即将给自己的学生时代和校园生活划上一个分号,之所以说它是分号,是因为我对无忧无虑的学生生活还有无比的怀念,对单纯美好的校园生活还有无比的向往。这只是我生命中的一个路口,并不是终点,我始终相信青春不会散场,坚信有一天会重返校园,以学生或老师的身份去延续这种快乐和幸福。

31

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

 感谢我的母校中南林业科技大学尤其是计算机与信息工程学院所有的老师们,在这片净土读书四载,无形中塑造了我生命的气质、生活的方式,也练就了我乐观的心态和一颗感恩的心。尊敬的导师魏善沛教授在论文上无私的指导,感激之情无以言表,只能在日后的工作和学习中踏实做人、勤奋做事,做出一番成绩来回报他对我的恩惠。宿舍同学的互帮互助和深厚友谊更是赐予了我本科四年活不可磨灭的记忆,毕业前夕的寝室夜谈更是成为了520宿舍生活的美好回忆。在这四年中,我收获快乐并且成长,这是一段永存在心中的回忆。

 在毕业前最后的时光,仍旧要感谢我生命中出现的那些十分重要的师姐师兄、师弟师妹们,以及我结识的朋友们。他们不仅在学术上给予我指点,同时也是我生活中一起同行的人,在交往的过程中我们建立信任、彼此鼓励、互相支持与帮助。

 当然,在我求学期间,还要感谢我深爱的父母亲一直以来对我无怨无悔的付出、支持、关爱、尊重和信任,在我学习、生活、感情、工作上遇到困难时,是您们帮我抵御风霜,谢谢您们。我是幸运而幸福的,我知足并且义无反顾的在大家的关爱下坚持自己的信念和理想一路前行。 

参 考 文 献

[1] 王珊,萨师. 数据库系统概论(第四版).高等教育出版社.2006. [2] 张友生,等.软件体系结构(第二版).清华大学出版社.2006. [3] 耿祥义,张跃平.java2使用教程(第三版).清华大学出版社.2006. [4] 张宏喆,侯迪,等.实用软件设计模式教程.清华大学出版社.2009.

[5] Robert A.Day,Barbara Gastel.How to Write and Publish a Scientific

Paper(Sixth Edition).Publishing House of Electronics Industry.2010.

[6] Thomas H.Cormen,Charles E.Leiserson,Ronald L.Rivest,Clifford

Stein.Introduction to Algorithms(Second Edition).China Machine

Press.1994.

32

中南林业科技大学本科毕业设计 软件体系结构与基础算法分析

[7] 闪四清,杨强.Oracle Database 10g基础教程(第二版).清华大学出版

社.2007.

[8] Wallace B. McClure著.张丽萍等译.SQL Server 2005 Oracle与MySQL 基 于ADO.NET 2的高级编程. 北京:清华大学出版社,2007.1.

[9] 姜桂洪. SQL Server 2005数据库应用与开发.北京:清华大学出版社,

2010.5.

33

本文来源:https://www.bwwdw.com/article/1d9o.html

Top