《面向对象程序设计》课程设计报告
设计题目 |
图书信息管理系统 |
学生姓名 |
陈海燕 |
学生班级 |
信管1141班 |
学生学号 |
201411671101 |
指导教师 |
易学明 |
完成时间: 2015 年 07月 02 日
1、设计目的:
设计该图书管理系统,要求学生达到熟练掌握C++语言的基本知识和技能,能够基本掌握面向对象程序设计的基本思路和方法,能够利用所学的基本知识和技能解决简单的面向对象程序设计的问题。另外,通过该课程设计的实践,来提高学生动手编程解决实际问题的能力,加深对C++语言及解决问题方法的理解,为以后的学习打下坚实的基础。
2、设计内容:
设计一个C++程序来管理图书信息,能实现图书相关信息的具备数据的输入、查找、删除等功能,能实现。
3、系统功能需求分析:
由对图书管理系统的问题描述可知,该系统主要功能应该包括借阅书刊,归还书刊,取消书刊预约信息,录入书刊,显示用户信息,查询书刊信息,退出系统等功能。同时,在借阅书刊和显示用户信息的功能中还应有有注册用户信息的功能。如果用户在借阅书刊和显示用户信息的的时候,若用户数据库中没有该用户,则提示用户是否注册用户信息。并且,在借阅书刊时,若该书刊已借,用户可以预约该书刊。另外,在归还书刊的功能中,应该有预约该书刊的用户可依预约时间的先后来获得该书刊。在进入取消书刊预约信息的时候,应该根据用户输入的基本信息(借阅名,借阅卡号)首先来显示用户基本信息,再根据基本信息是否来进行取消已预约书刊记录信息的功能。
依以上对系统所需功能的分析,为了实现上述的各个功能,首先应该要建立合适的数据结构,为实现以上各个功能的基本运算而进行合理的数据存储及组织。显然,在该系统中的基本运算主要是数据元素的查找、删除、插入等。数据元素应该是账户信息,账户信息内又包括用户的个人基本信息、借阅信息、以及预约信息。另外,为了能够借阅书刊以及查询书刊信息,应该还要建立对图书信息的存储和组织的数据结构,在该数据结构中,图书信息即为该数据结构的数据元素。
以下对数据元素进行详细的分析。对于账户信息,其包括个人信息、借阅信息、以及预约信息。这些信息可以定义类来实现,并把个人信息类、借阅信息类、预约信息类嵌套在账户信息类里,作为它的私有成员;对于图书信息,则可定义图书信息类。账户信息和图书信息仅仅只是针对单一对象的信息,如要存储多个这样对象的信息,则必须构建一个合适的数据结构来存储和组织这些信息。由系统功能可知,应该选用链表来存储账户信息和图书信息比较合适。所以可以定义链表类来对账户信息和图书信息进行存储和组织。另外,某一个用户借阅或预约的书刊可能有多本,故也可以定义链表类来存储和组织这些信息,在把链表类嵌套到账户类里。
4、总体设计:
(1)系统功能分析:
该系统主要功能包括借阅书刊、归还书刊、取消书刊预约信息、录入书刊,显示用户信息、查询书刊信息、退出系统等。进入该系统后,便出现选择这些功能的菜单,可依选择项进入相应的功能模块。执行某一功能(除了退出系统)后又可返回功能选项菜单界面。所以在主函数中需要采用函数嵌套。
依系统功能分析有:功能模块流程图如下:
系统功能模块流程图
(2)系统功能模块划分与设计
以下对各功能模块进行分析与设计:
① 借阅书刊功能
首先输入书刊名、书刊的ISBN/ISSN号、借阅者名、借阅卡号。然后依借阅者名及借阅卡号在账户类链表中查找该用户是否存在。若不存在,则返回到注册账号。反之,则依ISBN/ISSN号在图书类中查找并判断该书是否已借阅。(书刊是否被借阅,可以在图书类中定义某一变量进行标记,以此来判断该书刊是否被借阅)若借阅,用户则可预约该书刊或结束借阅书刊功能,借阅书刊失败。反之则借阅书刊成功,并作相应的数据记录。另外,在预约书刊后,若预约的书刊被归还,则立即寄给预约人,并作相应的数据记录。(若有多人预约同一本书,应按预约时间的先后,来确定寄给书刊的预定人)。
② 归还书刊功能
首先输入用户名及借阅卡号,并依次在账户类链表中查找到该账户。若未查找则提示用户可能输入信息错误并要求重新输入。若查找到,则输入书刊名及书刊ISNB/ISSN号,并由此在图书类链表中查找该书刊是否存在,若未查找到则提示书刊信息输入错误并要求重新输入。若书刊存在,则输出归还书刊成功,并作相应的数据记录。同时,还要在账户类链表中查找已预约该书刊的用户,并找到最早预约该书刊的用户,将书刊寄送给该用户,并对该用户信息做相关的记录。
③ 查询书刊功能
查询书刊应根据书刊名在图书类链表中来查找该书刊。查找方法应该为顺序查找。若图书类链表中无要查找的书刊,则输出图书馆内无该书;反之,则输出该书的基本信息,基本信息包括:书名、ISNB/ISSN号、价格、是否借阅等信息。有时同名书刊不只一本,故每查找到一本该书刊则显示该书刊信息,直至遍历整个图书类链表。书刊是否被借阅可设定一变量来表记。
④ 取消书刊预约功能
首先输入借阅者名及借阅卡号,并依此在账户类链表中查找该用户是否存在。若未查到,则提示用户可能输入信息错误并要求重新输入。若查到则显示用户信息,并依此是否进行书刊预约功能。若进行,则输入书刊名及书刊ISNB/ISSN号,并在图书类链表内验证输入信息是否正确。
⑤ 显示用户信息功能
首先输入借阅者名及借阅卡号,并依此在账户类链表里查找该用户是否存在。若未查找的到,则提示用户可能输入信息有误或该用户未注册。反之则显示该用户信息。
⑥ 录入书刊信息功能
录入书刊信息,首先要录入书刊的数量,然后依次输入书刊名、书刊ISNB/ISSN号、书刊定价。这样即可录入书刊信息。
5、系统详细设计:
(1)数据类型及类层次图
该系统所需数据类型主要为字符数组类型,即用字符串类型来定义数据。用字符串定义数据可用string类代替,定义成string类型的数据,对字符的操作更简单。在输入string类数据时,用输入流中的操作符>>来输入字符串,这样需特别注意在输入某一字符串时,其间不能输入空格,否则该输入的字符将会转到下个将要输入的字符串变量,使输入变得混乱。这是由于输入流操作符在输入数据时,若遇到空格,则表示该输入已结束。
该系统中定义的类包括:日期类、个人信息类、借阅书刊信息类、预约书刊信息类、账户信息类、图书类、借阅和预约、账户、图书信息链表类。其类UML图及类层次图如下所示:①日期类
|
②个人信息类
|
③借阅信息类
④借阅信息链表类
⑤预约信息类
⑥预约信息链表类
|
⑦账户类
|
⑧账户链表类
|
⑨图书类
⑩图书链表类
(1) 图书管理系统模型图
(2)图书管理模式图
|
6、实习总结与体会:
通过此次课程设计,更加深了对C++面向对象程序设计语言的知识和设计方法的理
解,也深刻认识了自己在这方面的不足之处。首先,在设计该系统时,对问题描述进行了比较深的认识,并确定了系统所需的数据结构及数据的封装模式,也应用了一些面向对象程序设计的基本方法。特别在此次设计中对数据引用的认识更加深刻,引用作为函数形参,能够通过形参而该变实参值,这一技术的使用非常方便有效。同时,通过这次系统的课程设计过程,更进一步认识了自己的在编程方面的一些不足的方面,尤其表现在逻辑思维不够严密,这方面还需在以后更多的训练中,来弥补这方面的不足。但在修改语法错误方面,基本上还是能够修改。
然后,对课题进行了分析并编写了程序,且进行了调试。至此,由于在设计开始,未为整个系统进行整体及整个编写过程的详细思考,使编写的程序的健壮性不是特别的强,且代码复用性做得不够好,由于数据结构的设计比较直接,未能使用更好的算法,使程序代码较为繁琐,而难以用文件方式对数据进行永久保存,这也就使系统的实际使用价值大大地降低了。所以,在设计某系统时,不仅仅只是对其功能模块进行简单的分析,而且更要使功能模块和设计的数据结构结合起来,以此设计更好的算法,编写出更好,更实用的程序。于是,设计前的系统分析工作是非常重要的,这是程序设计思路的来源。
7、附录: 源程序清单:
#include<iostream>
#include<string>
#include<cstddef>
using namespace std;
//定义日期类
class Date{
private:
intyear;
intmonth;
intday;
public:
Date(inty=0,int m=0,int d=0):year(y),month(m),day(d){}
Date(constDate&D):year(D.year),month(D.month),day(D.day){}
intGetyear(){return year;}
intGetmonth(){return month;}
intGetday(){return day;}
voidDashow();
DateDaInput();
~Date(){}
};
Date Date::DaInput(){
inty,m,d;
cout<<"****************年:";
cin>>y;
cout<<"****************月:";
cin>>m;
cout<<"****************日:";
cin>>d;
returnDate(y,m,d);
}
void Date::Dashow(){
cout<<year<<""<<"年"<<" "<<month<<""<<"月"<<""<<day<<" "<<"日"<<endl;
}
//个人信息类
class UnitInfo{
private:
stringname;
stringreid;
stringid;
stringsex;
DateD;
public:
UnitInfo(stringn,string re,string id,string sex,Date d):name(n),
Reid(re),id(id),sex(sex),D(d){}
UnitInfo():name(" "),reid(" "),id(" "),sex(" "),D(0,0,0){};
UnitInfo(constUnitInf &Info):name(Info.name),reid(Info.reid),
id(Info.id),sex(Info.sex),D(Info.d){}
stringGetname(){return name;}
stringGetreid(){return reid;}
voidUnshow();
UnitInfoUnInput();
~UnitInfo(){}
};
UnitInfo UnitInfo::UnInput(){
stringn,r,i,s;
Dated;
cout<<" 借阅卡号:";
cin>>r;
cout<<endl;