毕业设计 图书管理系统毕业设计 精品Word文件下载.docx
《毕业设计 图书管理系统毕业设计 精品Word文件下载.docx》由会员分享,可在线阅读,更多相关《毕业设计 图书管理系统毕业设计 精品Word文件下载.docx(33页珍藏版)》请在冰豆网上搜索。
![毕业设计 图书管理系统毕业设计 精品Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/14/cdfd0fae-a6d9-42b9-baa5-d37fc1f125bf/cdfd0fae-a6d9-42b9-baa5-d37fc1f125bf1.gif)
对于前者要求建立数据的一致性和完整性,对于后者则要求应用程序功能的完备,易用等的特点。
基于上述考虑本系统主要利用MicrosoftVisualStudio2005作前端的应用开发工具,利用SQLServer2000作为后台的数据库,利用WINDOWS作为系统平台开发的图书管理系统。
另外本图书馆管理系统利用软件工程化思想和方法,总体上是采用结构化生命法进行系统分析和设计的,而系统实现等步骤则采用了原型法和面对对象的方法。
关键词:
C#程序设计语言,SQLSERVER2000,软件工程
第1章基础理论知识
1.1数据库应用系统开发简介
在数据库应用系统开发之前,对开发数据库的基本概念应当了解,对数据库的结构、开发数据库应用程序的步骤、开发体系及方法都应当有相当清晰的了解和认识。
数据库应用系统开发的目标是建立一个满足用户长期需求的产品。
开发的主要过程为:
理解用户的需求,然后,把它们转变为有效的数据库设计。
把设计转变为实际的数据库,并且这些数据库带有功能完备、高效能的应用。
数据库技术在计算机软件邻域研究中一直是非常重要的主题,产生于60年代,40多年来数据库技术得到了迅速发展,并已形成较为完整的理论体系和一大批实用系统。
并且,近年来,随着World
Wide
Web(WWW)的猛增及Internet技术的迅速发展,使得数据库技术一时成为最热门技术之一。
1.2数据库管理系统
数据库管理系统(DBMS)是指数据库系统中管理数据的软件系统。
DBMS是数据库系统的核心组成部分。
对数据库的一切操作,包括定义、更新及各种控制,都是通过DBMS进行的。
DBMS总是基于某种数据模型,可以把DBMS看成是某种数据模型在计算机系统上的具体实现。
根据数据模型的不同,DBMS可以分成层次型、网状型、关系型、面向对象型等。
SQLServer2000就是一种关系型数据库管理系统。
关系模型。
关系模型主要是用二维表格结构表达实体集,用外键表示实体间联系。
关系模型是由若干个关系模式组成的集合。
关系模式相当于前面提到的记录类型,它的实例称为关系,每个关系实际上是一张二维表格。
关系模型和层次、网状模型的最大判别是用关键码而不是用指针导航数据,表格简单用户易懂,编程时并不涉及存储结构,访问技术等细节。
关系模型是数学化模型。
SQL语言是关系数据库的标准化语言,已得到了广泛的应用。
1.3MicrosoftVisualStudio2005简介
2005年,微软发布了VisualStudio2005。
.NET字眼从各种语言的名字中被抹去,但是这个版本的VisualStudio仍然还是面向.NET框架的(版本2.0)。
它同时也能开发跨平台的应用程序,如开发使用微软操作系统的手机的程序等。
总体来说是一个非常庞大的软件,甚至包含代码测试功能。
这个版本的VisualStudio包含有众多版本,分别面向不同的开发角色。
同时还永久提供免费的VisualStudioExpress版本
运行库实际上在组件的运行时和开发时操作中都起到很大的作用,尽管名称中没有体现这个意思。
在组件运行时,运行库除了负责满足此组件在其他组件上可能具有的依赖项外,还负责管理内存分配、启动和停止线程和进程,以及强制执行安全策略。
在开发时,运行库的作用稍有变化;
由于做了大量的自动处理工作(如内存管理),运行库使开发人员的操作非常简单,尤其是与今天的COM相比。
特别是反射等功能显著减少了开发人员为将业务逻辑转变为可重用组件而必须编写的代码量。
1.4C#语言简介
C#(CSharp)是微软于2000年提出的一种源于C++、类似于Java的面向对象编程语言,适合于分布式环境中的组件开发。
C#是专门为.NET设计的,也是.NET编程的首选语言。
1.4.1C#中OOP概述
程序设计语言,在思想上发展很快,在技术上也是不断创新。
经历了手工操作(控制面板)、机器语言、汇编语言、宏汇编语言、高级语言和第4代语言等多个阶段。
OOP只是在高级程序设计语言中,流行的多种编程技术之一。
1.基本特征
面向对象编程的三个基本特征是:
●封装(encapsulation)——是对问题的抽象,以达到信息隐藏的目的。
通过类和对象,将属性(数据/变量)和方法(操作/函数)封装在一个黑箱内,将细节隐藏起来。
既可以保护数据不被他人恶意或大意地修改,又能防止其他程序员编写高耦合度的代码,还方便了今后对对象内部的修改和升级。
●继承(inheritance)——利用问题和事物的相似性,通过类的(多层)继承机制,可以达到减少软件开发难度和重用已有对象的属性和方法之目的。
●多态(polymorphism)——同一操作或响应,可以同时针对多个可选的类型和对象,并且能够自动在它们中间选择最合适的来进行。
多态可以分为:
⏹编译时多态:
包括函数和运算符的重载(overload),通过早期的静态绑定(binding)来实现。
⏹运行时多态:
通过继承结合晚期动态绑定来实现——用同一基类的指针,可以访问各个不同派生类中的同名方法和函数。
2.基本概念
面向对象编程的基本概念(类似的概念多、表达不够准确、各处的用法各异):
●抽象(abstraction)——一个问题的本质特征。
忽略一个对象的细节,致力于一般的合适级别的程序能力。
抽象是在事物的周围绘制透明的盒子,是定义事物接口的行为。
●信息隐藏(informationhiding)——限制外部对类属性(数据成员)的访问。
●封装(encapsulation)——将某种保密和隐匿应用到类中的数据和一些方法(函数或子例程)上。
封装确保一个对象只能通过确定的渠道(即类的公用方法)才可被修改。
封装意味着将数据及相关函数打包到一个单一的单元(类)中。
每个对象暴露一个接口(公用方法),规定其他对象可以如何读取或修改它。
●类(class)——问题的抽象,对象的模版,接口的实现。
例如int是整数的模版、CPoint是点的模版。
●对象(object)——问题中的事物,类的实例(变量),拥有数据和功能。
若inti;
CPointp;
则i是int的实例变量,p是CPoint的实例对象。
●实例(instance)——一个对象,是某个类的示例。
●实例化(intantiate)——由类定义创建对象。
●继承(inheritance)——创建子类的机制,一种“isa”或“islike”关系,形成类层次结构。
是OOP中对象重用的核心概念。
●子类(subclass)——继承自另一个类的派生类(derivedclass)。
●超类(superclass父类)——被另一个类继承的基类(baseclass)。
●虚函数(virtualfunction)——可以在子类中被覆盖(override)的函数。
●纯虚函数(purevirtualfunction)——只有声明没有定义的函数,必须在派生类中被覆盖。
●抽象类(abstractclass)——至少包含一个纯虚函数的类,不能被实例化。
●具体类(concreteclass)——可以实例化的类,不包含纯虚函数。
●接口(interface)——纯抽象的类,类的模版。
接口中的所有的方法(成员函数)都只有声明,没有定义(都是纯虚函数)。
必须在接口的派生类中,实现接口的全部方法。
接口可以看成是一个,定义了一套内部行为的,若干操作特征标记的集合。
(在C++中,也把类的公用成员函数叫做接口)。
●属性(attribute)——类和接口中的数据信息,又叫数据成员(datamember)或成员变量(membervariable)。
属性是类知道的事物。
●方法(method)——类操作的实现,又叫成员函数(memberfunction)。
方法是类要做的事情。
(在C++中,也把虚函数叫做方法)。
●重载(overload)——一个类中的,参数的数目、类型或排列顺序不同的多个同名方法(成员函数)。
●覆盖(override)——在子类中重新定义(与父类中的定义有区别的)属性和方法。
●持久化(persistence)——将对象存入永久存储中(如文件、数据库等)。
●持久对象(persistentobject)——存入永久存储的对象。
1.4.2面向对象的C#编程
1.类
类类型定义包含数据成员、函数成员和嵌套类型的数据结构,其中数据成员包括常量和字段,函数成员包括方法、属性、事件、索引器、运算符、实例构造函数、析构函数和静态构造函数。
类类型支持继承,继承是派生类可用来扩展和专门化基类的一种机制。
功能与C++/CLI的可见性说明符类似,只是增加了static修饰符。
partial(分部的)——用于定义分部类、结构和接口等对象类型,即将它们的定义分成多个部分,保存到多个代码文件中。
这是C#2.0新引进的功能,用于解决大型对象类型的定义问题,因为C#不支持类体之外的方法和函数体定义。
(1)访问修饰符
类成员可以有如下访问修饰符(accessmodifiers):
●public(公用的)——访问无限制。
●protected(保护的)——只可被包含类(containingclass)或其派生的类型访问。
●internal(内部的)——只能被此程序访问。
●protectedinternal(保护内部的)——只能被此程序或其包含类所派生的类型访问。
●private(私有的)——只能被其包含类访问,为默认的。
C#类的public、protected、private等成员修饰符,每次只能修饰一个成员,直接位于成员声明的开始处,而且没有冒号分隔符。
而不是像C++那样,一个修饰符可以修饰位于其后(直到下一个修饰符为止)的若干成员。
(2)数据成员
类的数据成员(datamember)有:
[[属性]][常量修饰符]const标识符[=常量表达式][,……];
其中,常量修饰符有:
new、public、protected、internal、private及它们的有效组合。
类的数据成员可以是静态数据(使用了static修饰符),也可以是实例数据(未使用static修饰符)。
静态数据为类的所有实例对象所共有,而实例数据则每个实例对象都自己的副本。
常量默认是(总是)静态的。
字段还可以是只读的(使用了readonly关键字,这是C#新增的)和易变的(使用了volatile关键字,字段值一般位于CPU中的寄存器中,高效但是有效期短暂)。
(3)函数成员
类的函数成员(functionmember)有:
●属性(property)——提供对对象或类的特性(characteristic)进行访问的成员。
声明格式为:
其中,属性修饰符与方法修饰符相同,访问修饰符有protected、internal、private、protectedinternal和internalprotected,与类成员的普通访问修饰符相比,没有public、多了internalprotected(内部保护的)。
●事件(event)——定义该类可生成的通知(notifications)。
在发生某些行为时,可让对象通知程序。
客户程序可以调用事件处理程序代码来响应该事件。
其中,事件修饰符与方法修饰符相同。
●索引器(indexer)——允许对象像数组一样被索引的一种成员。
其中,索引器修饰符与方法修饰符类似,只是少了static。
●用户定义的运算符(operator)——运算符重载函数。
●构造函数(constructor)——包括实例构造函数和静态构造函数。
⏹实例构造函数(instanceconstructor)——实现初始化一个类实例所需的行为,会在创建每个类实例时被系统调用。
注意:
因为C#会自动给字段初始化,所以构造函数在C#中的作用没有在C++的大。
格式为:
类型名([参数列表]);
即使调用没有任何参数的默认构造函数,也不能省去后面的圆括号“()”,不然是语法错误。
例如:
Aa=newA();
⏹静态构造函数(staticconstructor)——实现初始化一个类所需的行为,会在程序装入时被系统调用。
为类编写无参数的具体构造函数是C#的一个新特征,主要用于类的静态字段或属性的运行时初始化。
static类型名([参数列表]);
●终结器(finalizer)——在C#的旧版本中叫析构函数(destructor),但由于引用类型的对象是位于具有垃圾内存自动回收功能的CLR堆上,所以C#中的析构函数的功能与C++的很不一样。
为了与C++的析构函数有所区别,在C#的新版本中,改叫终结器。
格式(与C++的析构函数相同)为:
~类型名();
。
2.结构
C#中的结构(struct)与C++中的类似,也可以封装数据和函数(属性和行为),是一种轻量级的类。
但是它与C#的(位于CLR堆中的)类(为引用类型)不同,它是一种(位于局部栈中的)值类型。
1)结构与类的区别
C#中的结构与类的区别有:
●结构是值类型,而类是引用类型。
●结构是密封的(sealed),因此不能被继承。
●结构不能继承类和其他的结构。
●结构隐式地继承了System.ValueType类型。
●结构的(无参数)默认构造函数不能被自定义的构造函数取代。
●结构的自定义的构造函数,必须初始化结构中全部成员的值。
●结构没有析构函数。
●不允许初始化结构的字段,但是可以初始化结构的常量成员。
2)结构声明
结构的完整声明格式为:
其中,结构的修饰符与枚举修饰符相同:
new、public、protected、internal、private,但是与类的有所不同:
因为C#的结构不支持继承,所以没有类的sealed和abstract修饰符;
也没有static修饰符;
还与C++一样,结构的默认修饰符为public(类的默认修饰符为private)。
结构成员声明与类的基本相同,只是没有finalizer-declaration(终结器声明,即析构函数定义)。
C#的结构和类一样,其public、protected、private等成员修饰符,每次只能修饰一个成员,也是直接位于成员声明的开始处,而且也没有冒号分隔符。
3.分部类和静态类
分部类和静态类都是C#所特有的,而且都是C#2.0版新增加的。
前者允许将一个类、结构或接口的定义,放到多个文件中;
后者则是仅包含静态成员的类。
1)分部类
分部类和结构是在类和结构的声明中,使用了partial修饰符的类和结构。
位于不同文件中的同一个分部类,必须位于同一个命名空间或包含类型(对嵌入式分部类)之中,而且在所有类修饰符必须完全一致。
对泛型类,还要求声明中的类型参数和对类型参数的约束也完全一致。
但是类的属性、基类和实现接口的列表却可以不同。
另外,分部类也可以用作嵌套类,不过其包含类必须也是分部类。
编译时,编译器会合并位于不同文件中的同一个分部类的XML注释、属性、基类、接口和成员。
2)静态类
静态类是在类的声明中,使用了static修饰符的类。
静态类中只能包含静态成员,可以用静态构造函数来初始化这些静态成员。
静态类是密封的(不能派生其他类),静态类不能被实例化,也不能包含实例构造函数。
静态类一般用于定义公用的常数和方法(如.NET中的Math类),使用时不需要创建实例,直接用“类名.字段”或“类名.方法”即可。
1.4.3接口与继承
继承(inheritance)是面向对象的基本特征,所有的C#类和结构都是直接或间接地从类Object派生的。
C#中没有明确指出基类的类,都以Object作为其默认基类。
C#中的结构不支持继承,但是C#支持类的单一继承(singleinheritance),多重继承的问题(与Java一样)需通过接口来解决。
1.接口
接口(interface,界面)的概念来源于组件编程的思想。
接口定义统一的公用方法的原型,但是不包含方法的具体实现代码,方法体(代码)由实现接口的类来定义(编写)。
所以接口定义的是一种契约(contract),实现该接口的类则遵守(adhere)此契约。
接口相当于组件的界面,供使用组件的用户查询和调用,而实现接口的类则是组件的编码模块本身。
在C#中,一个接口可以继承自多个接口,一个类也可以实现多个接口。
实现某个接口的类,必须实现该接口中的所有方法。
2.继承的种类
C#中的继承有两种类型:
●实现继承(类继承)——派生类型继承了基类型的所有成员,包括方法、属性、事件和索引的实现代码,派生类既可以直接调用基类的各种函数成员的实现代码,也可以自己编写代码来覆盖或重写它们,还可以为派生类添加新的数据和函数成员。
●接口继承(非实现继承)——派生类型只继承了基类型中的函数签名(signatureofafunction),包括函数名、类型参数的个数、每个形参(formalparameter)的类型和种类(kind,值、引用、输出),从左到右的顺序,但是不包括函数的返回类型、参数名称、类型参数的名称、以及可对最右边的参数指定的参数修饰符。
而没有继承基类型中的实现代码。
接口继承主要用于指定派生类应该具有什么特性和功能。
接口继承相当于接口的实现。
C++只支持实现继承,VB则只支持接口继承,C++/CLI、Java和C#都既支持实现继承,也支持接口继承,所以非常适用于编写基于组件的分布式软件。
C#中的结构,支持(多重)接口继承,但是不支持实现继承。
即,你可以在结构中实现多个接口中定义的函数成员,但是你却不能从类或结构来派生新的结构,也不能从结构派生新的类。
不过,用户定义的结构,总是自动派生于System.ValueType抽象类,还可以派生于(实现)多个接口。
C#中的类,则支持单一实现继承和多重接口继承。
3.方法的继承
C#中方法的继承关系非常多样,除了传统C++的虚函数(C#增加了override修饰符)和纯虚函数(即C#的abstract抽象函数)外,还增加了隐藏方法(new)、密封方法(sealed)和基类方法的调用指令(base.方法名)等诸多新方式。
1)虚方法override
虚函数是面向对象编程中实现运行时多态性的标准途径,而编译时的多态性则是由具有同样函数名,但是函数签名不同的多个重载(overload)函数来实现的。
与C++不同的是,在C#中重写基类的虚方法时,必须使用C#特有的重写修饰符override(覆盖)。
2)隐藏方法new
在C++中,不需要添加任何修饰符,就可以任意重载或覆盖基类的虚函数和非虚函数,但是在C#中,这样做会得到一个编译警告。
目的是,为了避免程序员的笔误,也为了适应代码的维护与升级。
解决办法是,上面介绍过的使用override修饰符来明确重载基类的虚方法,以及使用new修饰符来显式隐藏(覆盖)基类中具有同样签名的(非虚)方法。
第二章系统开发背景
当今时代是飞速发展的信息时代。
在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。
计算机的最大好处在于利用它能够进行信息管理。
使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。
尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。
计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。
本系统就是为了管理好图书馆信息而设计的。
图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,包含很多的信息数据的管理,现今,有很多的图书馆都是初步开始使用,甚至尚未使用计算机进行信息管理。
根据调查得知,他们以前对信息管理的主要方式是基于文本、表格等纸介质的手工处理,对于图书借阅情况(如借书天数、超过限定借书时间的天数)的统计和核实等往往采用对借书卡的人工检查进行,对借阅者的借阅权限、以及借阅天数等用人工计算、手抄进行。
数据信息处理工作量大,容易出错;
由于数据繁多,容易丢失,且不易查找。
总的来说,缺乏系统、规范的信息管理手段。
尽管有的图书馆有计算机,但是尚未用于信息管理,没有发挥它的效力,资源闲置比较突出,这就是管理信息系统的开发的基本环境。
数据处理手工操作,工作量大,出错率高,出错后不易更改。
图书馆采取手工方式对图书借阅情况进行人工管理,由于信息比较多,图书借阅信息的管理工作混乱而又复杂;
一般借阅情况是记录在借书证上,图书的数目和内容记录在文件中,图书馆的工作人员和管理员也只是当时对它比较清楚,时间一长,如再要进行查询,就得在众多的资料中翻阅、查找了,造成查询费时、费力。
如要对很长时间以前的图书进行更改就更加困难了。
基于这些问题,我认为有必要建立一个图书管理系统,使图书管理工作规范化,系统化,程序化,避免图书管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改图书情况。
第三章需求分析
3.1应用需求分析
图书管理系统需要满足来自三方面的需求,这三个方面分别是图书借阅者、图书馆工作人员和图书馆管理人员。
图书借阅者的需求是查询图书馆所存的图书、个人借阅情况及个人信息的修改;
图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时形成借书或还书报表给借阅者查看确认;
图书馆管理人员的功能最为复杂,包括对工作人员、图书借阅者、图书进行管理和维护及系统状态的查看、维护并生成催还图书报表。
3.2实际需求分析
图书借阅者可直接查看图书馆图书情况,如果图书借阅者根据本人借书证号和密码登录系统,还可以进行本人借书情况的查询和维护部分个人信息。
一般情况下,