计算机专业毕业设计论文Word版

发布时间:2020-11-17 22:35:23

目   录

第一章 绪 论 1

1.1 系统开发的背景 1

1.2 软件开发的策略 1

1.3 软件的开发方法 3

1.4 系统开发环境的选取 4

第二章 系统规划 7

2.1 软件开发中的主要问题 7

2.2 软件开发目标 7

第三章 系统分析 8

3.1 系统的初步调查 8

3.2 系统的可行性分析 8

3.3 对现存软件的研究 9

3.4 新系统逻辑方案的提出 9

第四章 系统设计 12

4.1 目的与任务 12

4.2 系统的总体结构设计 12

4.3 系统的物理结构设计 13

4.4 系统运行的软硬件环境 14

4.5数据库设计 14

4.6用户界面设计 17

第五章 系统实现 19

5.1 与数据库的连接 19

5.2 线程的设计 21

5.3具体的功能实现 22

5.4 系统测试 34

第六章 系统运行与维护 36

6.1 系统的运行 36

6.2 系统的维护 36

第七章 结 37

7.1本软件的特点 37

7.2本软件的缺点 37

结   语 38

39

参考文献 40



第一章 绪 论

1.1 系统开发的背景

在科技日益发达的今天,社会对每个身处其中的分子要求越来越高,懂得一门外语只是基本的要求。而学习外语也要讲究一定的方法,一些辅助的工具也是必不可少的。

回顾过去背单词的方式,大家都是对着一本厚厚的字典,用笔在纸上反来复去的写,力求用次数来达到记忆的目的。可这种方式太浪费时间,一些单词被背了又背,一些单词却未被问津,自己都不知道哪些是已经记下来的,哪些是还不会的。把时间都白白的浪费掉了,真是得不偿失,因此,改变这种方式势在必行!使用计算机编写的背单词工具就改变了这种状况,使背单词也变得“轻松”起来。面对当前市场上背单词工具质量的良莠不齐,因而提出了设计一个新的,功能更实用,操作更方便,界面更友好的英语背单词工具——“攻破单词”。

通过对此工具的使用,可以节省很多时间,提高记忆效率,加强学习上的灵活性,使记忆、测试和查单词等各方面都很方便、轻松、快捷,相信它更能满足学习英语的学习者的需要,提高学习的进程,增加学习的兴趣。

1.2 软件开发的策略

将程序看作是按照顺序执行的一系统指令,这通常称为过程编程。过程化程序设计的典型特征是:程序中的数据对于所有过程都是可见的,因此也很容易造成混乱;过程与数据之间的关系是独立的,数据并没有要求一定要用那些方法来处理,原则上任何过程都可以对数据进行操作。在面向过程的程序设计方法中,首先考虑的是程序的功能,即程序要解决的问题,通过将功能逐步细化,直到每一个小的功能模块都能够用函数或过程来实现。然后设计数据结构,编写功能模块(过程),最后将它们组合成一个复杂的程序。换句话说,面向过程的程序设计采用的是“算法+数据结构=程序设计”的思想,即首先考虑解决问题的算法,然后再设计适合的数据结构使得算法得以有效的实现。面向过程的程序设计方法对于小型程序来说是适合的,但是用它来开发大规模的、可重用的应用就显得力不从心了。

与过程编程相对的是面向对象的编程。面向对象编程(OOP)从另外角度看待计算机程序,它将重点放在使用计算机所完成的任务上,而不是在计算机处理任务的方式上。在面向对象编程中,计算机程序概念化为一组对象,它们一起工作以完成一项任务。每个对象是程序的单独一部分,以特定的严格控制的方式与其他部分互相交流。面向对象编程超越程序复杂,用客观世界的对象模型自然地表示软件开发,用对象代表需要解决的问题的中心环节,而不是以函数过程、数据结构为中心,从而使计算机程序的分析、设计和实现的过程和方法改变了过去的脱节和跳跃的状态,这就使人们对复杂系统的认识过程与系统的程序设计过程简单化,并使两者容易达到一致。面向对象编程具备了几个优点,比如:代码维护方便、可扩展性好、支持代码重用技术等。这些优点是过程编程语言所不具备的。可以使用

“对象+消息=程序设计”来表示面向对象的理论。图1-1、1-2为面向过程的程序设计与面向对象程序设计的图示,在其中可以直观地看到二者的区别。

1-1 面向过程的程序设计

方法 方法

对象 方法    方法 方法  对象

   方法 方法

  方法 方法

对象

1-2 面向对象的程序设计

本软件的开发就使用面向对象的方法。

1.3 软件的开发方法

面向对象的方法经由系统分析、设计和试验等阶段,遵从软件生命周期的规律。所谓软件的生命周期是指一个软件从它的发生到其消亡的过程。以下是利用生命周期法开发软件的各个阶段的具体内容:

(1)系统规划阶段:其主要任务是明确软件开发的请求,并进行初步的调查,通过可行性研究确定下一阶段的实施。可行性分析的任务是确定项目开发是否必要和可行。也就是要对问题定义阶段中所提出的问题进行分析,以决定所提出的问题是否有“可行”的解。所谓可行,首先在技术上要可行,即现有技术能否解决所提出的问题;其次是经济上可行,即用户能否支付实施项目所需要的费用,项目建成后能否取得预期的经济效益;最后进行操作上和法律上的可行性研究。综合这些方面的论证,最终决定是否实施该项目。当然,这项工作就是建立在初步调查的基础上。

(2)用户需求分析阶段:在这个阶段中,就是了解用户的需求,准确的确定用户需要的功能,明确为了实现这些功能,需要哪些处理,需要处理什么数据;需要存储哪些数据文件;得到哪些信息;输入输出数据的格式以及有关处理的具体算法等。此外需要找出为了实现既定功能所需要的约束条件,典型的约束为成本约束和时间约束。另一个重要任务是要规定系统的生效准则,规定在目标系统建成后验收目标系统的一些原则以及具体的验收方法等。具体工作包括:

1详细调查

其具体的调查内容包括:清楚当前市面上现存的背单词工具所具备的功能和实现方法,了解使用者在使用过程中存在的问题和希望使用的功能。

2提出新系统的逻辑设计

系统分析结束时,应完成系统分析报告,交上级审批.系统分析报告是系统设计的依据,是与用户交流的工具,是应用软件的重要组成部分。其内容包括:原系统分析部分、新系统逻辑模型、新系统信息量的估计。

(3)系统设计阶段:其任务是在系统分析的基础上,按照逻辑模型的要求,科学合理地进行系统的总体设计和具体的物理设计,为下一阶段的系统实施提供必要的技术资料。具体分为:总体设计阶段和详细设计阶段。

1总体设计阶段:这个阶段中的主要任务是得到一个能够实现用户需求的理想的系统结构。所谓理想的结构指的是:能够实现需求阶段中规定的功能;系统容易设计和实现;系统易于维护。设计内容包括划分子系统、设计规范制定、数据流程图设计、功能结构图设计、系统物理配置方案设计。

2详细设计阶段:在这个阶段中的任务是进行系统所需要的数据结构设计和数据库的物理设计。输入输出设计、编写程序模块设计说明书。

系统设计工作结束后,要提交系统设计报告。若系统设计被审查批准,整个系统开发工作便进入系统实施阶段。

(4)系统实施阶段:这是软件系统的实现阶段,要进行模块编码和模块测试。模块测试又称为单元测试。模块编码要严格按详细设计阶段开发的模块逻辑进行。模块程序设计完成之后,应经过严格的测试。程序测试应该采用科学的方法。主要是黑盒法和白盒法进行测试,从而尽可能多地发现模块中错误,并加以改正。把经过彻底测试的模块组装起来形成需要的应用系统。再进行集成测试,采用的是黑盒测试方法,集成的方法可采用自顶向下集成或自底向上集成,或者二者结合的方法。

(5)维护阶段:主要包括改正性维护、适应性维护和完善性维护:改正性维护是改正程序中所遗漏的错误,保证用户程序能正常运行;完善性维护是增加程序的功能以满足用户的进一步需求;适应性维护是当用户改变硬件或软件支持环境时,满足程序需要的修改工作。维护阶段是一个非常重要的阶段,维护工作的好坏直接影响到用户的满意程度[6]

1.4 系统开发环境的选取

根据软件所要完成的功能和结合当前情况,我选择了Java语言。Java语言诞生于1991年,是由SUN MicroSystem公司的Jame Gosling,Bill Joe等人为在电视、控制烤面包箱等家用电子产品上进行交互式操作而开发的一个名为Oak的软件,1995年下半年正式以Java这个名字推出,并引起轰动[2]

Java语言是一种完全的面向对象的编程语言。在Java语言中,对象是表现事物,消息传递是事物间的相互关系,类和继承分别是相似行为对象的抽象和类之间的关系,方法是允许作用于类对象上的各种操作。面向对象程序设计有三个基本的特征:封装(Encapsulation)、继承(Inheritance)与多态(Polymorphism)[2]。所谓封装,就是用一个自主式框架把对象的数据和方法连在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。Java语言的封装性较强,因为

Java无全程变量,无主方法,在Java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互操作。多态性就是多种表现形式,具体来说,可以用一个对外接口,多个内在实现“方法”表示。继承是指一个对象直接使用另一对象的属性和方法。Java提供给用户一系列类(class,Java的类有层次结构,子类可以继承超类的属性和方法。与另外一些面向对象编程语言不同,Java只支持单一继承。

作为一种计算机语言,Java相当的优秀,最为显著的优点是它与平台无关,同样的代码可以不用改动就可以在各种软硬件平台上运行。这种平台无关性对于开发Internet应用程序来说是非常重要的。Java有以下基本特点:

简单性:“我们用Java来设计应用系统时,程序员不需要非常专业的训练,并且这种语言应该和当前所流行的技术一致,因此,虽然我们发现C++并不是这样的语言,但Java还是被设计成为尽可能和C++类似。只有这样Java才易于理解。我们将C++中那些很少使用、难于理解以及令人迷惑的东西去掉形成Java,这些被去掉的C++特性在我们看来,带来的好处远不如它们可能造成的痛苦。”——《Java语言白皮书》

面向对象:Java语言是一种完全的面向对象的编程语言。

分布式:分布式包括数据分布和操作分布。数据分布是指数据可以分散在网络的不同主机上,操作分布是指把一个计算分散在不同主机上处理。

强健性:Java最初设计目的是应用于电子类消费产品,因此要求较高的可靠性。Java虽然源于C++,但它消除了许多C++的不可靠因素,可以防止许多编程错误。

安全性:一种编程语言,尤其是网络编程语言,与跨平台性随之而来的还有另一大特性:安全性。在网络上,如果网络语言不十分可靠,极有可能被人有意或无意地造成恶果。为防止利用Java程序攻击其他人的系统,Java主要的编译和运行时系统中采取了防护措施,为Java代码筑起了两道坚实的防护屏障。

跨平台:所谓跨平台,就是指应用程序与计算机系统硬件结构的无关性,更直观的说就是用Java编写的应用程序不和修改就可在不同的软硬件平台同样的运行。

可移植性:同体系结构无关的特性使得Java应用程序可以在配备了Java解释器和运行环境的任何计算机系统上运行,这成为Java应用软件便于移植的良好基础。

解释方式执行:Java字节码可以在任何装有Java解释器的机器上直接执行。

高效率:“虽然字节码的运行效率通常已经能够满足应用要求,但还有一些要求很高运行效率的场合,在这些情况下,字节码可以‘即时’地被翻译为特定宿主机的机器码。”——《Java语言白皮书》

多线程:Java语言的多线程机制使应用程序能够并发执行,而且,它的同步机制保证了对共享数据的正确操作,

动态可扩充性:Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响应用程序的执行。并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。

Java的众多优点,使我对它产生了浓厚的兴趣,让我觉得不去学习它是不行的也许编写工具软件并不能完全体现Java语言的优势,但我想通过此次实践走进Java。

“工欲善其事,必先利其器”,使用合适的工具是提高软件开发效率的重要途径。Java的开发工具分成三大类,分别为:文本编辑器、Web开发工具和集成开发工具[8]。我采用的是美国Borland公司推出的可视化集成开发工具——JBuilder ,以及文本编辑工具——UltraEdit。Jbuilder是目前使用最广泛的Java开发工具之一,支持开发人员构建标准的Java应用系统。其开放的环境、丰富的Java开发向导和基于组件的开发方式,极大地简化了开发人员的工作,使得开发更为快捷和简便,加快了项目的进度。

数据库方面采用Microsoft Access, Access功能足够强大,足以应付一般的数据管理及处理需要,而且它易于掌握。采用Windows200中文版作为开发、测试和运行的平台。硬件选择Intel PentiumⅡ,256内存,40G硬盘等。



第二章 系统规划

2.1 软件开发中的主要问题

凡事预则立,不预则废。科学的规划对于任何需要经过较长时间努力才能实现的事情都是非常重要的。

规划,一般是指对较长时期的活动进行总体的、全面的计划。作为一个背单词的工具,是一名英语学习者学习的助手。而无论是谁,习惯一旦养成就不容易改变使用背单词工具也是一样,选择好了,在之后很长一段时间之内也不会更换。所以说如何使使用者能使用的方便、舒服,并且真正实现“助手”的含义就是重中之重。考虑到学习者的水平不同,要求掌握的单词级别也就不同,所以就要有词库选择的功能;考虑到避免重复练习的问题,所以就要有改变单词出现次序和记录不同用户的测试进度的功能;考虑到要有反馈练习成效的问题,所以就要有测试的功能;考虑到要有单词查找的问题,所以就要有字典的功能;考虑到不可能将所有单词都收录到库中,所以就要有词库维护的功能,另外还需要加设一些听力方面的辅助功能。

在现存的一些背单词软件中,往往对以上问题考虑的或多或少有一些欠缺,其中一个主要原因就是人们更多地关心软件的经济效益,用很多花俏的东西代替了切实有用的功能,而对于使用者的需求又了解过少,对于软件的具体方案考虑较少,对总体方案与发展战略问题不够重视。总之,软件开发中,往往缺乏科学的、有效的系统规划。

2.2 软件开发目标

力求实现一个小巧精悍的绿色英语单词辅助记忆软件。拥有一定的信息量,软件功能具有人性化,可以设定单词浏览速度的自动浏览,又可手动浏览;按照正序/逆序/随机/默认浏览记忆;随时查找单词和进行测试;能够播放听力文件;可以进行词库维护,使其成为您背诵英语单词的“利器”。

世界上有许多难事,但是没有完成不了的难事,背单词就是其中的一种,只要努力,人定胜天,人生终将辉煌!



第三章 系统分析

3.1 系统的初步调查

系统的初步调查是系统分析阶段的第一项活动,初步调查阶段的主要目标是从分析人员的角度看新项目开发有无必要和可能。初步调查的内容包括两方面:调查内容和分析内容。前者包括调查有关工作的信息,包括主要输入、主要输出、主要处理功能;后者主要分析现有什么,需要什么、在现有资源下能提供什么、此项目有无必要和可能进一步的调查与开发。

本软件开发的初步调查采用的主要方式是与英语学习者(包括使用和未使用过背单词工具的)进行交流,把握第一手资料。经过初步调查了解到,现在很多学习者还停留在“字典—纸—笔”的古老背单词方式上,用书写次数来达到记住的目的,这种方式不但花的功夫多,而且收效还不好,可以说是事倍功半。而那些现在正在使用计算机背单词的学习者,从不同方面反映了他们在使用背单词工具中所存在的问题,总觉得在不同程度上不够理想。

现存背单词软件的主要问题包括:有些设计的过于繁琐,难于操作,并不实用或是使用起来不够灵活;有些则又过于简单,不能满足使用者的需求,比如说单词从头到尾,顺序固定,即不能变换次序又不能分级别记忆,反来复去总是记开头那么几个;测试功能不够健全,无法真正检测使用者的学习情况等等。

所以说,各方面的人,都需要一个切实好用的英语背单词工具,提高英语学习效率。

3.2 系统的可行性分析

可行性研究是以相对短的时间和相对低的成本来确定给定的问题是否有解。这里相对短和相对低是指和实现建议系统所需时间和成本相比较而言。可行性研究主要从下述4个方面进行研究:技术可行性、经济可行性、操作可行性和调度可行性[5]

(1)技术可行性:技术可行性的考虑集中在现存的计算机硬件能否支持被研究的系统,首先关心的是该组织是否有相应的软件和硬件能够支持处理建议的应用程序。其次考虑在规定平台之上,利用现有的成熟技术是否能够实现这个应用。现代计算机硬、软件技术的飞速发展,为系统建设提供了技术条件。计算机等基础设施的更新换代也紧跟潮流的发展,这就为开发系统提供了坚实基础。

(2)经济可行性:这是经典的并且是最常使用的评价计算机系统的方法。这个评价的结果称为成本/效益分析。简单地说,经济可行性研究是确定得自新系统的节省和利益,将这些利益和系统的实现成本相比较,如果利益超过成本,则开发新系统的决策是肯定的;否则的话,除非有其他特殊原因,这个决策将是否定的。本软件的实现是作为考核学生学习情况的手段,不存在经济可行性的问题。

(3)操作可行性:是指人员的手工操作而不是指计算机系统操作是否可行,也就是说在实现了建议的计算机系统后,所需要的配合的手工操作是否可行。作为新时代的学生,几乎人人都具备计算机的基本操作能力,而本软件的使用又十分简单方便,所以具备操作可行性。

(4)调度可行性:指的是建议的计算机系统能否在规定的期限内交付给用户。基于本软件,经过上述的分析,可以在规定的期限内完成。

除了上面讨论的4个方面的可行性论证,有些产品的开发可能会涉及现存法律方面的问题,即需要进行法律可行性论证。

从当前情况来看,本软件的开发是可行的。

3.3 对现存软件的研究

对现存软件进行详细研究是了解系统需求和进行系统分析与设计的重要基础工作,因此要进行全面、细致而充分的研究。通过研究,发现现存背单词工具各自存在以上一点或几点问题:

(1) 单词一起存放,不能根据不同层次的用户选择词库;

(2) 单词练习方式单一;

(3) 没有单词测试功能,或测试功能不全面;

(4) 没有记录用户个人信息的功能;

(5) 没有单词查询的功能;

(6) 无法向库中添加单词;

通过分析,可以看出这些问题,都是需要进行改进的。

3.4 新系统逻辑方案的提出

建议的计算机系统是基于现存软件之上建立的,这应该是现行系统的完善与提高。用户所提供的信息往往是现行系统的缺陷,而不是整个系统的功能与行为。

在问题定义阶段对建议的功能、规模和约束条件等已经作了规定。在可行性研究阶段通过和使用者的交流,对用户的需求有了初步的了解。因此在这个阶段中,设计者应该进一步澄清问题定义中的模糊部分,更正错误部分。通过这个活动,清楚地描述新系统的主要功能,主要的数据输出与输入数据的来源,以及所需要的特殊处理。本软件的逻辑模型主要是以数据流程图为主要描述工具。

(1)数据流程图 (简称为DFD)

数据流程图是在对系统调研阶段绘制的业务流程图进行分析的基础上,从系统的科学性、管理的合理性、实际运行的可行性角度出发,将信息处理功能和彼此之间的联系自顶向下、逐层分解,从逻辑上精确地描述新系统应具有地数据加工功能、数据输入、数据输出、数据存储及数据来源和去向。数据流图是组织中信息运动的抽象,是逻辑模型的主要形式[5]。数据流程图的图例如下:

数据的源点或终点        数据处理     

数据存储       数据流

“攻破单词” 数据流程图如图3-1所示。

       





第四章 系统设计

4.1 目的与任务

此阶段的任务就是根据用户需求分析阶段得到的目标系统的物理模型确定一个合理的软件系统的体系结构。这个体系结构的确定包括合理地划分组成系统的模块,模块间的调用关系及模块间的接口关系。软件的体系结构从总的方面决定了软件系统的可扩充性、可维护性以及系统的性能。并考虑到经济、技术和运行环境等方面的条件,确定系统的总体结构和系统各组成部分的技术方案,合理选择计算机和通信的软、硬件设备,提出系统的实施计划,确保总体目标的实现。

4.2 系统的总体结构设计

总体设计的任务是确定软件的体系结构,软件体系结构指的是软件的总体结构以及该结构提供系统的功能的方式,也说是说软件体系结构是程序的一些部件(模块)的层次结构,这些部件相互作用的方式以及这些部件使用的数据结构[5]。“攻破单词”的功能结构图如图4-1所示。

如图所示,系统由用户信息管理、单词和美音赏析三大模块组成。其中各功能模块又包含子模块。下面对各大模块分别进行描述。

(1)用户管理模块:

这个模块主要是进行用户进入的身份验证和记录用户的个人信息。新用户必须进行注册,方可使用本软件;原有用户也要在输入了用户ID和密码之后才能进入练习阶段,当然,作为一名已注册用户是可以进行密码修改的。加入此功能目的是为了让系统能记录不同用户的练习情况,统计测试成绩,这样一来,使用者可以很方便的知道自己在何时进行了测试,并且取得了怎样的成绩。方便用户了解自己的学习情况,统筹安排。

(2)单词模块:

这是本软件的核心部分,也是关键所在。其中包括四个子模块:

词库设置模块:在这里用户可以选择词库、选择开始位置、确定每次的练习单词个数、选择自动浏览的浏览速度、单词的排列次序:分为顺序/逆序/随机几在种。在单词练习方面,可以选择单词的显示模式,分为隐藏单词/隐藏词

图4-1“攻破单词”功能模块图

义/单词大写几种。浏览方式分为自动和手动两种。

测试模块:用于进行单词测试,并统计测试结果。

字典模块:用于进行单词查找,分为“英译汉”和“汉译英”,其中“汉译英”支持模糊查询。

维护模块:用于向词库中添加单词。

(3)美音赏析模块:

用于播放英语听力文件,通过打开文件对话框,选择一个文件进行播放。因为目前JAVA支持的音频文件格式有:AIFF、AU、WAV、type0和type1的MIDI,以及RMF[1]。所以在程序中对文件选择的格式进行了限制,只有符合格式的,才可能被选定。

4.3 系统的物理结构设计

从系统本身看,只需要制作成单机使用即可,使用者在自己的计算机上运行本软件,就可以进行单词的练习和使用相关功能。

数据库是数据管理的最新技术,是计算机科学的重要分支。现在普遍使用的大中型数据库有IBM DB2,Oracle, SQL Server, SyBase, Informix等。常用的小型数据库有Access, Paradox, foxpro等。个人用户常用的主要是基于中小型数据库的MicroSoft SQL和Access。由于微软的Access使用简单,而且又是世界上最流行的桌面数据管理系统[5],更加因为它适用于本软件,所以本软件使用Access数据库完成单词的存储等多项任务。

4.4 系统运行的软硬件环境

考虑到本系统的运行的稳定及性能要求,本系统系统配置如下:

硬件配置:

CPU: Pentium以上

内存:64M以上

硬盘:剩余空

多媒体机器(若无声卡,则无法收听声音文件)。

软件环境需求:

操作系统:

数据库:MicroSoft  Access

软件:装有JDK

4.5数据库设计

(1) 数据库设计的主要任务是针对一个给定的应用环境,在给定的硬件环境、操作系统、以及数据库管理信息系统等软件环境下,创建一个性能良好的数据库模式,建立数据库及其应用系统,使之能有效地收集、存储、操作和管理数据,满足用户地各类需求[5]

(2) 概念设计

在系统的数据库设计中, 先要对系统分析得到的数据存储进行分析,分析数据存储之间的关系,然后得出系统关系模式。

(3) 逻辑结构设计

逻辑结构设计的任务就是把概念结构设计阶段设计好的基本E-R 图, 转换为与选用的具体机器上的数据库管理系统产品所支持的数据模型相符合的逻辑结

n 1

m

n

图4-2 攻破单词数据库的E-R图

构。本系统的E-R 图如图4-2所示:

(4) 物理结构设计

本系统数据库中设计4张表,各表基本结构信息如下,分别为:表4-1单词表,表4-2书目表,表4-3测试记录表,表4-4用户注册表。

表4-1 单词表(t_word)

列名

数据类型

宽度

主键

外键

是否允许为空

说明

word_id

文本

8

YES

NO

NO

单词号

word_eng

文本

100

NO

NO

NO

单词

word_chn

文本

100

NO

NO

NO

词义

word_num

数字

长整型

NO

NO

NO

单词数

bood_id

文本

4

NO

YES

NO

书号

表4-2 书目表(t_book)

列名

数据类型

宽度

主键

外键

是否允许为空

说明

book_id

文本

8

YES

NO

NO

书号

book_name

文本

30

NO

NO

NO

书名

book_info

文本

100

NO

NO

NO

书目信息

表4-3 测试记录表(t_test)

列名

数据类型

宽度

主键

外键

是否允许为空

说明

test_id

文本

8

YES

NO

NO

测试号

test_right_cound

数字

长整型

NO

NO

NO

测试正确数数

test_error_cound

数字

长整型

NO

NO

NO

测试错误数

user_id

文本

50

NO

YES

NO

用户号

bood_id

文本

50

NO

YES

NO

书号

test_date

文本

8

NO

NO

NO

测试日期

word_num_f

数字

整型

NO

NO

NO

开始位置



表4-4 用户注册表(t_user)

列名

数据类型

宽度

主键

外键

是否允许为空

说明

user_id

文本

8

YES

NO

NO

用户号

user_name

文本

8

NO

NO

NO

用户名

user_pwd

文本

8

NO

NO

NO

密码

4.6用户界面设计

为了使用者使用方便,提高学习效率,本软件将采用命令按钮和菜单选择相结合的设计方法,做到界面风格一致,并且界面朴素大方,任何人都能够接受。

本软件可以管理个人用户,所以进入系统之前必须通过验证。简洁、清晰、友好是此界面应具有的设计风格。用户只需填写用户ID和密码,然后点击【确定】按钮,就可进入主界面。主界面是用户进行单词练习的地方,也是进行功能选择的地方。当用户做出选择以后,系统就进入相应的窗口界面。

本系统主要界面设计图样:

(1) 登录界面图样如图4-3所示

图4-3 “攻破单词”登录界面图样

登录界面设计思路:如图4-3所示,本界面是用户使用本软件首先呈现给用户的界面,用于用户登陆信息的管理。当【登陆】按钮被点击后,通过在数据库的t_user表中查找,如果用户ID和密码输入合法有效将可进入系统,出现主界面;当【取消】按钮被点击后便可以退出该操作界面;【修改密码】按钮被点击后则出现修改密码对话框,用于已注册用户的密码修改;如果是一位新用户,则要点击注册,进行新用户注册环节。

(2)系统主界面图样如图4-4-1所示。

主界面设计思路:如图4-4-1所示,菜单条上的各菜单项与本系统实现的各种功能的窗体界面相连接,当用户进入系统后,用户可以通过选择菜单中的菜单项进入相应的界面。主界面也是用户进行单词练习的地方。练习界面如图4-4-2所示。在界面上可以通过对复选框的选择,实现“隐藏单词”/“隐藏词义”/“单词大写”的不同显示单词方式;并且通过滚动条的设置,确定自动浏览的速度,速度范围为50毫秒10000毫秒/个,还可以手动浏览单词。

在“单词”菜单下,分别有:“词库设置”、“测试”、“字典”、“词库维护”和“退出”子菜单。

在“美音赏析”菜单下,有“选择”和“返回”子菜单。

4-6-1 “攻破单词”主界面图样

4-6-2 “攻破单词”显示单词后的主界面图样

其它界面与功能实现,将在下一章中详细介绍。

第五章 系统实

在软件的生命周期中,经过了系统规划、系统分析和系统设计等阶段以后,便开始了系统实施阶段。在系统分析和设计阶段,系统开发工作主要是集中在逻辑、功能和技术设计上,工作成果是以各种系统分析与设计文档来体现的。系统实施阶段要继承此前各阶段的工作成果,将技术设计转化为物理实现,因此系统实施的成果是系统分析和设计阶段的结晶[5]

5.1 与数据库的连接

在Java语言中,保持数据有几种方法,分别为:利用平面文件、串行化对象和使用数据库[11]。使对象串行化意味着可以把该对象写入某个流中,然后从该流中把它读取回来。流处理的一个例子是把输出结果发送到磁盘文件中,或通过网络连接发送给另一台计算机。此方法在本程序中不适用;当需要存储的只是一些配置设置,以后才打印的文本文档或要传输给世界上其他某个地方的XML文档时,平面文件是一种可行的选择,本程序就应用文件的方式存储听力文件;数据库是一种复杂的存储技术,它可以处理大量的数据,并且能方便的进行修改和查询,用数据库来存储单词是一个不错的选择。

数据库可以被定义为是在计算机存储设备上合理存放的,相互关联的数据集合,这种集合具有以下特点:

·以一定的数据模型来组织数据,数据尽可能的不重复。

·以最优方式为某个特定组织的多种应用服务。

·其数据结构独立于使用它的应用程序。

·对数据的定义、操纵和控制,由数据库管理信息系统统一管理。

SQL(Structured Query Language,结构化查询语言)是一种介于关系代数与关系演算之间的结构化查询语言,它是一个通用的、功能极强的关系数据库语言,集数据查询、数据操纵、数据定义和数据控制功能于一体。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select,Insert,Update,Delete,Create,以及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作

[2]。而实现Java语言与SQL结合起来的编程接口就是JDBC(Java DataBase Connection,Java数据库连接)。JDBC允许开发人员使用一个与数据库无关的公用API来编写应用程序。软件开发人员把数据写在API上,而不是写在底层数据库上。JDBC的中心在于执行基本的SQL声明和取回结果。Java JDBC代码能在数据库之间移植,是因为那些数据库特定的代码被包含在了一个叫做驱动程序的Java类中,如果需要改变数据库,我们只需要改变Java代码使用的驱动程序,就立即可以在新数据库上运行。JDBC API被设计成了能在尽可能多的关系数据库平台上使用。JDBC API通过提供封装具体功能的大量Java类和接口,是我们能轻松地编写访问关系数据库的代码。我们可以:

使用一个Driver Manager(驱动程序管理器)类来装载一个驱动程序。

使用一个Connection(连接)对象(实现 Connection接口的一个类实例)来建立与数据的连接。

使用一个Statement(语句)对象来封装SQL语言,并把它们发送给数据库与执行。

使用一个ResultSet(结果集)对象来检索查询结果等等[3]

其中,JDBC驱动程序可分为以下4个种类:

① JDBC-ODBC桥加ODBC驱动程序程序。

这类驱动程序把JDBC转换成ODBC驱动器,靠ODBC驱动器和数据库通信。

② 本地API

此类型的驱动程序,将运用Java包装由数据库厂商所提供、用于操作数据库的API函数。

③ 纯Java客户库驱动程序

这种驱动程序将JDBC转换为与数据库无关的网络协议,之后这种协议又被某个服务器转换为一种数据库协议。这是最为灵活的JDBC驱动程序,可移植性最好。

④ 本地协议纯Java驱动程序。

这种类型的驱动程序不通过任何额外的中介软件,而是直接通过Java程序并利用网络协议,将操作数据库的需求,传递给数据库[2]

本软件通过JDBC-ODBC桥访问数据库。其实现数据库连接的代码段如下:

try {

user = "";

password = "";

url = "jdbc:odbc:word";

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

conn= DriverManager.getConnection(url,user,password);

sqlStatement = conn.createStatement();

} catch (Exception e) {

System.out.println("DbWord initialize:" + e);

}

5.2 线程的设计

在传统操作系统中,“进程”是一个重要的概念。进程是一个内核级的实体,并且操作系统以它为执行单元进行调度。进程由PCB(Process Control Block)、程序代码、数据组成。在计算机中,可能有多个程序在运行。通常,将一个正运行的程序的实例称作一个进程,它不仅执行着自身的指令序列,拥有自己的数据空间,而且还占用着一定的系统资源,如CPU时间、内存空间以及一些设备的使用权等。进程之间是相互独立的,即使是启动两个相同的程序,系统都会启动两个独立的进程,它们分别占用不同的系统资源。随着操作系统的发展,出现了线程的概念。线程是对进程的扩展。在现代操作系统中,都支持多线程。 

所谓线程,是一个逻辑概念,是指程序中的一个执行流。在一个进程中,可以有多个线程。它和线程一样,有一个入口、一个出口和一个顺序执行序列。这些线程在操作系统的调度下并发执行。使得每个线程都好像在独占整个系统资源。线程是操作系统的最小高度单元。Java中的线程有五种状态,分别是新生态(newborn)、可执行态(runnable)、执行态(running)、阻塞态(blocked)和死亡态(dead),通过程序控制实现状态间的转换。

线程与进程的区别主要体现在如下几个方面:

(1)同样作为基本的执行单元,线程的划分比进程小。因此,支持多线程的系统要比只支持多过程的系统并发度高。

(2)进程将内存作为自己独有的资源,每个进程都有自己的内存。与此相反,线程却共享内存单元,并通过共享内存交换信息。

(3)线程的创建和进程的创建不同。创建进程要把程序段和数据从磁盘交换数据。因此多线程利于提高效率。

(4)进程是相对静态的,代表代码和数据存放的地址空间。而线程是动态的,每个线程代表进程内的一个执行流。

启动线程占用较少的系统资源,并且线程共享进程资源。可以看出,线程具有轻便的特性,因此线程也称为轻线程。目前,多线程编程已经成为编程的一个有效的工具。利用多线程可以编出界面友好、效率高的应用程序,已得到了广泛的应用。

生成线程有两种方法,一种是通过继承Thread类实现线程体,另一种是通过实现Runnable接口来实现线程体。由于Java中不支持多继承,利用Runnable接口是子类做线程模板的唯一方法。

在本软件中也应用了线程的概念,主要的应用表现在“美音赏析”部分,使菜单的响应事件类实现Runnable接口,在其中重写的 run()方法中实现声音文件的播放,当选中【选择】菜单项时就创建一个线程,调用 run()方法。这样即使是在播放声音文件的同时也可以进行其它的操作,体现Java的多线程的优势。以上为菜单响应事件中,run()方法的实现源代码:

class MenuItemListener implements ActionListener,Runnable {

private FileInputStream ff=null;

public void run(){

try{

locate = new JavaSoundAudioClip(ff);

locate.play();

}

catch (IOException e){

}

}

5.3具体的功能实现

程序流程图又称程序框图,是详细设计过程中使用最广泛的工具,具有直观、形象、容易理解的特点;程序设计又称编码,是系统生命周期中继详细设计之后的阶段,这个阶段的任务是使用选定的程序设计语言,把程序设计说明书体现的信息处理过程描述后,转化成能在计算机系统上运行的程序源代码。

由于篇幅有限,在介绍部分界面功能时,为便于讲解,本人附上该功能模块的程序流程图或实现相应功能的代码段。

(1)“登陆”的功能实现

界面如图4-3所示,用户输入信息,点击【登陆】按钮后,创建两个String类型对象,其值分别为文本输入框和密码输入框的内容,创建一个数据库连接的对象,通过Select语句,在数据库的t_user表中进行查找,如果存在相应记录,则进入主界面。其程序流程图如图5-1所示。

以下为“登陆”界面的【登陆】按钮的事件处理的程序编码。

String strUser = this.jTextField1.getText();

String strPwd = this.jPasswordField1.getText();

DbWord dw = new DbWord();

dw.DbWord();

String strSql = "Select user_id,user_pwd from t_user where ";

strSql = strSql + "user_id='"+strUser+"' and user_pwd='" +strPwd+ "'" ;

try {

ResultSet rs = dw.runSelect(strSql);

if (rs.next()){

Words_in_mind window = new Words_in_mind();

window.setTitle("攻破单词");

     window.pack();

Dimension ScrDim=window.getToolkit().getScreenSize();

Dimension WinDim=window.getSize();

int x=(int)((ScrDim.getWidth()-WinDim.getWidth())/2);

int y=(int)((ScrDim.getHeight()-WinDim.getHeight())/2);

window.setLocation(x,y);

LogOn.strUserId = strUser ;

window.setVisible(true);

this.setVisible(false);

}else{

this.jLabel3.setText("The UserID or Password is Error");

this.jTextField1.setText("");

this.jPasswordField1.setText("");

}

} catch(Exception ex){

System.out.println("Frm_LogOn.jButton1_acctionPerformed: " + ex.getMessage());

}

N

N

Y

Y

图5-1“登陆”模块程序流程图

(2) “修改密码”的功能实现

界面如图5-2所示,用户输入信息,当【确定】按钮被点击后,创建四个

String类型对象,其值分别为文本输入框和密码输入框的内容,创建一个数据库连接的对象,通过Select语句,在t_user表中查找用户ID和密码均符合的记录,在判断了用户两次输入的新密码相同后,通过Update语句完成数据库中该条记录的密码修改,在些过程中,界面下方的标签框会显示相应的提示信息;当【取消】按钮被点击后便退回登陆界面。

图5-2 “攻破单词”修改密码界面图样

(3)注册”的功能实现

界面如图5-3-1所示,用户输入信息,当【确定】按钮被点击后,创建三个String类型对象,其值分别为文本输入框和密码输入框的内容,判断输入有效后,创建一个数据库连接的对象,通过Select语句,在t_user表中获取最大的用户ID,将其值“加一”,作为新记录的user_id字段值。将获取的用户在输入框中

输入的内容分别作为新记录的user_name,user_pwd字段值,用Insert语句在t_user

5-3-1 5-3-2

图5-3 “攻破单词”注册界面图样

表中追加新记录,并在屏幕上回显新用户的ID,界面如图5-3-2所示,这是用户登陆时要用到的,所以要记住自己的ID当【取消】按钮被点击后便可以退出该操作界面。其程序流程图如图5-4所示。

N

N N

Y

Y



图5-4“注册”模块程序流程图

(4)“词库设置” 的功能实现

界面如图5-5所示,些界面是用户进行单词练习必须设置的界面,倘若用户没有进行过此界面的设置,点击主界面的【开始】按钮,此界面也会出现。窗体界面由一个组合框,用于选择书目,组合框中的的内容是通过读取数据库中t_book表获得的;一组单选按钮,程序中定义了一个iOrder的整型变量,通过它的0,1,2,3的其中一个值确定默认/顺序/逆序/随机的不同浏览方式;三个文本域,是用户的输入区,用于设置“开始位置”、“复习数量”和“浏览速度”,其中“开始位置”的默认值为本用户各词库已测试单词的下一个(进行选书时响应)。以下为将书名

图5-5 “攻破单词“词库设置界面图样

添加到组合框中的功能实现源代码:

try {

int iBookNum,i=0;

DbWord dw = new DbWord();

dw.DbWord();

ResultSet rs = dw.runSelect("Select count(*) as count from t_book");

if (rs.next()){

iBookNum = Integer.parseInt(rs.getString("count"));

}else{

 iBookNum = 0 ;

}

rs = dw.runSelect("Select book_name from t_book");

String[] sBookName = new String[iBookNum];

while (rs.next()) {

sBookName[i] = rs.getString("book_name");

i++;

}

Vector vBook = new Vector(iBookNum);

for( i = 0; i

vBook.add(i,sBookName[i]);

}

cmbBook = new JComboBox(vBook);

cmbBook.setSelectedIndex(iBookIndex);

}catch (Exception g) {

System.out.println ("actionPerformed :" + g );

}

(5) “测试”的功能实现

界面如图5-6所示,窗体界面有一个组合框,用于选择书目,同样,组合框中的的内容是通过读取数据库中t_book表获得的;一个表格,用于记录用户测试情况;两个文本域,用于设置“开始位置”和输入英文单词,其中“开始位置”的默认值为本用户各词库已测试单词的下一个(进行选书时响应)。点击【测试】按钮后,根据用户的选择,在数据库的t_word表中查找符合的单词,并通过【下个】按钮逐一显示;【提交】按钮用于统计测试结果,显示在界面下方的表格中,并将相关信息记录追加到数据库的t_test表中;【导出】按钮用于将本次测试的单词的词义/正确单词/测试输入等其他信息导出到一个Excel文件中,用的是动态

数组的方式将测试过的单词、词义以及用户的输入单词记录下来,实现这个功能,是为了使用户可以对本次测试的单词根据结果对照进一步深化巩固。导出保存及Excel文件分别如图5-7、图5-8所示。其程序流程图如图5-9所示。其中,显示表格内容是通过查找数据库中user_name相符的t_test表记录实现的,构建表格功能实现源代码如下

JTable createJTable(){

JTable jt ;

DbWord dw = new DbWord();

dw.DbWord();

ResultSet rs = null;

ResultSet rsCount = dw.runSelect("Select count(*) as count from t_test where user_id = '"+LogOn.strUserId+"'");

try{

rsCount.next();

int count = Integer.parseInt(rsCount.getString("count"));

Object[][] cells = new Object[count][9];

int j = 0 ;

String strSql = "Select user_name,book_name,word_num_f,";

strSql = strSql + "word_num_f +test_right_count+test_error_count-1,";

strSql = strSql + "test_right_count,test_error_count,";

strSql = strSql + "str(Round(test_right_count/(test_right_count + test_error_count),3)*100)+'%',";

strSql = strSql + "test_date from t_test,t_user,t_book where ";

strSql = strSql + "t_test.user_id = t_user.user_id and ";

strSql = strSql +"t_test.book_id = t_book.book_id and t_test.user_id = '"+LogOn.strUserId+"' order by test_id desc";

rs = dw.runSelect(strSql);

while(rs.next()){

for (int k = 0 ;k < 8 ; k++){

String strTemp = rs.getString(k+1);

if(strTemp == null){

strTemp = " " ;

}

cells[j][k+1] = strTemp ;

}

cells[j][0] = String.valueOf(j + 1);

j++;

   }

String []columnName = {

"序号","用户名","书名","开始位置","结束位置","正确数","错误数","正确率","测试日期"

};

jt = new JTable(cells,columnName);

return jt ;

}catch(Exception ex){

System.out.println("createJTable: " + ex);

return null ;

}

}

图5-6 “攻破单词“测试界面图样

图5-7 “攻破单词“导出文件存储界面图样



图5-9“注册”模块程序流程图

图5-8 “攻破单词“导出文件后界面图样

(6)字典的功能实现

其程序流程图如图5-10所示,界面如图5-11所示。

                 



图5-10“字典”模块程序流程图

图5-11 “攻破单词“字典界面图样

(7) 词库维护的功能实现

界面如图5-12所示,这是用于向词库中添加单词用的,用户在两个输入框中输入要添加的单词的EnglishChinese,当【添入】按钮被按下时,在t_word表中找到“自定义词库”的最后一条记录,追加记录,实现添加单词的目的。界面最下方的标签框会以红色字体显示提示信息(界面中未显示)。

        

图5-12 “攻破单词“词库维护界面图样

(8)美音赏析 的功能实现

界面如图5-13所示,当点选主界面上的“美音赏析”菜单后的界面图样,此为一个打开对话框,可通过它来选择一个英文听力文件进行播放。根据Java语言支持的声音文件格式,本软件对打开对话框的文件类型进行了筛选,只要是符合文件格式,是都可以播放的,也就是说,即使你选择了一个本地计算机上的“.wav格式的音乐文件,也是可以正常播放的。

图5-13 “攻破单词“点选美音赏析后的界面图样

(9) 退出询问的功能实现

界面如图5-14所示,这是当用户点选了【退出】菜单项或按钮时的响应事件,用于询问使用者是不是要真的离开,避免误操作。

图5-14 “攻破单词“退出询问的界面图样

5.4 系统测试

系统测试是管理信息系统开发周期中一个十分重要而漫长的阶段。其重要性体现在它是保证系统质量与可靠性的最后关口,是对整个系统开发过程包括系统分析、系统设计和系统实现的最终审查。尽管在系统开发周期的各个阶段均采取了严格的技术审查,希望尽早发现问题予以修正,但依然难免遗留下差错,如果没有在投入运行前的系统测试阶段被发现并纠正,问题尽早会在运行中暴露出来,到那时要纠正错误将会付出更大的代价,甚至会造成不堪设想的后果。

测试工作是否成功,取决于测试案例设计是否科学合理。测试案例系指测试输入数据及其对应的输出,其设计依赖于所采用的测试方法。系统测试的方法可以分为人工测试和机器测试两种。

本软件的测试主要以人工测试为主,采用的是个人复查的方法。在编写完每一个功能模块的时候,反复运行,并尽量穷尽其所有途径,尽可能的发现其是的错误,并进行改正。现举一例说明如下。

例如在编写“修改密码”功能代码的时候,当用户点击【确定】按钮后,首先要判断用户的输入是否有效,我用的是if语句,代码如下:

if ("".equals(strnPwd1.trim())||"".equals(strnPwd2.trim())){

this.jLabel4.setText("the New PassWord is null");

 if (!strnPwd1.equals(strnPwd2)){

this.jLabel4.setText("the newPassWord1 , newPassWord2 not Same");

this.jPasswordField2.setText("");

this.jPasswordField3.setText("");

在运行时,当我输入是一个新密码为空时,按照设计应该显示"the New PassWord is null"

,可运行结果却显示"the newPassWord1 , newPassWord2 not Same",经过反复的思考,我找到了根源所在:在每个if语句块的最后加上一条return ;语句,问题就迎刃而解。在测试的过程中,这样的问题很多,有些是因为疏忽造成的,有些则是因为技术方面的欠缺,不过通过反复的检查和思考,都将问题一一解决,使系统执行结果与设计相符

第六章 系统运行与维护

6.1 系统的运行

(1) 数据的输入

本系统的输入采用键盘输入方法

(2) 怎样进入系统

将本软件所对应的jar文件及数据库复制到计算机上,添加ODBC数据源,双击jar文件即可运行。

6.2 系统的维护

系统维护是面向系统中各种构成因素的,按照维护对象的不同,本系统维护的内容可分为两类:数据维护、代码维护。代码维护是比较复杂的环节,但本系统的数据维护相对简捷。由于本软件是一个背单词工具,所以数据的维护就是单词量的增加。作为毕业设计,本软件的单词量并不是很大,只有两万个,封

装在个词库之中,分别为傻瓜词汇、大学英语 6 级词汇、 TOFEL词汇、GRE词汇、计算机词汇和商务英语词汇,用户可以根据需要方便地选择学习范围,另外的自定义词汇就是用于词库维护的,用户可以通过对“词库维护”功能的操作,向此库中添加词库中没有的单词(在之前已经介绍)

第七章 结 论

7.1本软件的特点

本软件用户界面友好、清晰,易于操作。

单词分库存储,用户可根据个人情况自行选择。

实行个人用户管理,使每个使用者都能轻松掌握自己的学习进度。

功能全面,集练习、查询、测试于一身。

可靠性高。

易于更新和维护。

整个软件体积非常小。相比其他同类软件动辄几百MB的体积,“攻破单词”显示格外小巧。不过,请您千万不要以为软件体积小是功能不足的表现

7.2本软件的缺点

在“词库维护”方面,本软件只能进行单词的逐一添加,如果是大批量的加入,本软件没有此项功能。由于时间的因素,本人的这方面的考虑还欠成熟,所以暂时本软件没有专门的大批量词库维护功能,要想大批量加入,只能通过修改数据库了来实现了。不过我想这不会成为一个阻点,在以后的学习过程中,我会不断完善本软件,使其功能不断强大

结  束  语



参考文献

[1] 朱福喜、唐晓军.Java程序设计技巧与开发实例[M].北京:人民邮电出版社,2004,85-149

[2] 李云山、吕杰武.深入浅出Java语言程序设计[M].北京:中国青年出版社,2003,1-317

[3] 张洪斌.Java程序设计导学[M].北京:北京科海电子出版社,2003,311-333

[4] 朱仲杰.Java2全方位学习[M].北京:人民邮电出版社,2003,1-364

[5] 王家华.软件工程[M].沈阳:东北大学出版,2001,1-216

[6] 郭雪妍.Java程序设计[M].北京:机械工业出版社,2003,1-195

[7] 杨巨杰.Jbuilder6.0开发与应用[M].北京:科学出版社,2003,227-300

[8] 飞思科技产品研发中心.精通Jbuilder9.0[M].北京:电子工业出版社,2004, 1-174

[9] 萧仁惠、陈锦辉.JDBC数据库程序设计[M].北京:中国铁道出版社,2004,75-214

[10] 杜江、管佩森.Java实用编程100例[M].北京:中国铁道出版社,2004,35-219

[11] 江义华.Java完美经典[M].北京:中国铁道出版社,2004,527-584

[12] 洪维恩.Java2面向对象程序设计[M].北京:中国铁道出版社,2002,1-406

[13] 李争、陆正中.Jbuilder精髓[M].北京:电子工业出版社,2004,1-86

[14] 王志文、夏秦、李平均。Java程序设计[M].西安:西安交通大学出版社,2004,59-127

[15]〔美〕Watts S.Humphrey.软件工程规范[M].北京:清华大学出版社,2003,44-51

[16] (意)Carlo Ghezzi、Mehdi Jazayeri、Dino Mandrioli.软件工程基础(第2版)[M].北京:清华大学出版社,2003,427-444

[17] 贾岚.Access数据应用教程[M].北京:北京希望电子出版,2003,67-116

(注:可编辑下载,若有不当之处,请指正,谢谢!)

计算机专业毕业设计论文Word版

相关推荐