图书馆管理系统c课设报告附源代码.docx
《图书馆管理系统c课设报告附源代码.docx》由会员分享,可在线阅读,更多相关《图书馆管理系统c课设报告附源代码.docx(88页珍藏版)》请在冰豆网上搜索。
![图书馆管理系统c课设报告附源代码.docx](https://file1.bdocx.com/fileroot1/2022-12/8/9330bc1c-4061-4319-8d9d-dd941f22d9ee/9330bc1c-4061-4319-8d9d-dd941f22d9ee1.gif)
图书馆管理系统c课设报告附源代码
1、需求分析......................3
2、系统总框图....................3
3、每个模块的设计分析............4
4、列出所有定义的函数及说明......7
5、比较有特色的算法..............20
6、存在的问题与不足及对策........27
7、使用说明......................29
8、程序源代码....................34
1.需求分析
以往,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较繁琐。
在借书时,读者首先将要借的书好借阅证交给工作人员,然后工作人员将每本书的信息卡片好读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。
在还书时,读者首先将要还的书交给工作人员,然后工作人员根据图书信息找到相应的书卡好借阅证,并填写相应的还书信息。
南京航空航天大学的图书馆有许多书,如果靠人工的方式来进行管理,那么工作量会非常大。
图书的统计和管理会成为让人头疼的问题,读者借阅图书进行登记也会十分的不方便。
这时,利用计算机来为我们进行这些统计管理的工作,可以给我们的生活带来大大的便利,并且提高工作效率。
由于条件有限,只能使用键盘输入书的信息,所以在输入图书的ISBN号时有些麻烦。
所以在课设里,简化了ISBN号,没有输入书本的真实ISBN号。
在现实生活中,采用扫描的方式录入ISBN号会更加准确,高效。
2.系统总框图
注册后返回主菜单
3.每个模块的设计分析
(1)主界面模块
当进入该管理系统时候,提示相应的说明,够让使用者了解该如何进行操作。
同时还要具有美观性。
用户通过键盘输入选择,程序通过检测输入内容进行比对,调用不同的函数,从而实现不同的功能。
并且,在输入错误数据时程序不会崩溃。
(2)读者注册模块
新用户使用该管理系统时,可以通过注册获得一个属于自己的账号。
注册模块要引导读者完成一步步的注册步骤,并且在最后把注册所得账号告知读者。
在注册时,用了避免用户输错设定的密码,所以采用了输入两次的方式。
如果两次输入的结果是一致的,那么就完成账号的注册。
如果两次输的密码不一致,则用户需要重新输入设定的密码。
这样的方式可以保证每一次的注册都是有效的,避免了用户因为输入错误,无法找回自己的密码。
(3)读者中心模块
读者登陆成功之后才可以进入该模块。
在该模块,读者可以进行密码重置,注销,查看借书情况,借书,还书。
并且也设有返回菜单功能。
注销帐户时,要考虑到删去该读者节点之后不能影响到整个链表的连续性。
所有函数均封装在ReaderList类中,信息存储在Reade类r中,ReaderList类中定义了三个个Reader*指针,一个是head_point,作为链表的头结点;一个是tail_point,作为链表的尾指针;另一个是point,作为活动指针,在不同的类的成员函数中都可使用。
为了防止该活动指针使用过频,造成几个函数同时使用同一个指针指向不明,在有些函数里还定义了一些临时指针。
(4)借书还书模块
读者在登录之后才可以进行借书,还书。
借还书函数会分别调用读者链表和书单链表中的借还书函数,并且在调用这些函数之前会先进行借还书检查。
比如,你不能还你没有借过的书,也不能超过限定数目借书。
用户需先登录,借还时要输入ISBN号。
以借书为例。
借书操作调用的直接函数为:
intReaderList:
:
Borrow(BookList*g,Reader*p,stringbookISBN);
它会调用四个函数来完成借书操作:
boolBookList:
:
Check_borrow_book(stringISBN_Of_Book)//Booklist中的借书检查
voidBookList:
:
borrow_book(stringISBN_Of_Book)//Booklist中的借书手续
boolReaderList:
:
Check_borrowBook(Reader*p,stringBookISBN)//ReaderList中的借书检查
voidReaderList:
:
borrowBook(Reader*p,stringBookISBN)//ReaderList中的借书手续
在Booklist和ReaderList的类中都有借书检查和借书手续函数。
首先会调用借书检查函数,如果不满足借书条件则不会继续借书的操作。
只有在两个借书检查都返回true的时候才会进行借书操作,防止了在书类链表中借了书却在读者类链表中没有借书的情况,实现了两个链表借书的同步性。
因为添加图书时会保证ISBN号的唯一性,如果有ISBN号相同的图书则不会成功添加到书类链表。
借书函数都是通过ISBN号查找图书的,所以借书时不会有借错书的情况。
(5)查找图书模块
用户不需要登陆就可以使用该模块。
用户可以通过ISBN号,书名,出版社,作者对图书进行精确的查找。
同时,为了提高用户的使用质量,增加了输入关键字搜索功能。
输入查找信息后,程序会对图书的ISBN号,书名,出版社以及作者等信息进行比对,并且显示所有满足搜索条件的结果。
这样,读者在搜索时的自由度就增加了。
关键字搜索函数是通过string类中自带的find()函数实现的,所以减小了工作量。
增加了显示全部图书的功能,便于满足用户需求。
增加了返回主菜单的功能,提高了程序的连续操作性。
(6)管理图书模块
要输入管理员密码以后才可以进入图书管理菜单。
为了安全性,管理员在登录之后可以选择修改自己的密码。
并且,这个密码在退出系统时可以保存下来,下一次打开程序时的密码就会使修改后的密码了。
书单信息菜单里,可以对图书进行添加,删除,清空,修改,显示所有。
都是分别调用了BookList类中的函数,对整个书单链表进行了一系列操作。
在修改时会进入图书修改菜单
在搜索书的ISBN号之后会返回该本书的指针,对该本书的信息进行一系列修改,并且也可以返回上级书库信息菜单。
(7)读取保存信息模块
信息的读取和保存分为三大部分,读者信息,书单信息,管理员信息的保存。
而这三个部分的信息又分别由六个函数负责读取和保存。
在保存文件里,链表中的信息会依次存入txt文件。
在读取时,会先将信息存入一个类的数组里,然后将类的数组依次存入链表里。
系统在打开时会自动从文件里面读取上次存储的信息,在退出系统时可以选择保存或不保存本次操作的结果。
如果要保存,则会将操作后的链表存入文件,刷新数据。
总的来说,程序的各个菜单都有比较清晰的结构,也都有返回上级菜单的功能。
基本上所有的函数都考虑到了读者输入错误数据的情况,并且能够进行一定的处理,具有较强的健壮性,不容易崩溃。
4.列出所有定义的函数及说明
[管理员类]中的函数
#ifndefLIBRARIAN_H_INCLUDED
#defineLIBRARIAN_H_INCLUDED
#include
classLibrarian
{
private:
stringpassword;
public:
Librarian()
{
password="880128";
}
Librarian(stringa)
{
password=a;
}
~Librarian()
{
password="";
}
voidchangePassword(stringa)
{
password=a;
}
intchangePassword()//重载修改密码函数
{
cout<<"是否需要修改管理员密码?
按0表示确定,按其他任意键表示不需要修改:
"<charchoice;
cin>>choice;
if(choice=='0')
{
cout<<"请设置新密码:
"<cin>>password;
cout<<"修改成功!
"<return0;
}
else
return0;
}
boolLogin()//管理员登陆
{
cout<<"请输入管理员密码:
"<stringpass;
cin>>pass;
if(pass==password)
{
cout<<"成功登录!
"<changePassword();
}
else
{
cout<<"密码错误!
"<returnfalse;
}
system("pause");
returntrue;
}
stringgetPassword()
{
returnpassword;
}
};
#endif//LIBRARIAN_H_INCLUDED
[书类]中的函数
#ifndefBOOK_H_INCLUDED
#defineBOOK_H_INCLUDED
#include
#include
#include
usingnamespacestd;
classBookList;
classBook
{
friendclassBookList;
friendvoidsaveBooks(BookList*p);
friendvoidreadBooks(BookList*p);
protected:
stringISBN;
stringKind;//图书分类
stringBookName;//书名
stringWriter;//作者名
stringPublisher;//出版商
intnumber;//单个书的本数
Book*next;//指向下一个节点的指针
public:
Book();
Book(stringisbn,stringkind,stringname,stringwriter,stringpublisher,intnumber);
voidcopyBook(stringisbn,stringkind,stringname,stringwriter,stringpublisher,intnumber);
voidcopyBook(Book*p);
voidsetISBN(stringtem);
voidsetKind(stringtem);
voidsetBookName(stringtem);
voidsetWriter(stringtem);
voidsetPublisher(stringtem);
voidsetNumber(inttem);
voidoperator=(constBook&book);//运算符重载
voidsetBook();//重新设定该本书的所有信息
voiddisplayBook();//展示一本书
virtualvoidAdd_list(classBook*p)//把书加入链表
{
next=p;
p->next=NULL;
}
virtualvoidAddNewBook()//添加新书并且设置它的信息
{
next=newclassBook;
next->setBook();
cout<<"已经成功添加新书:
"<next->displayBook();
}
virtualvoidshow_all()//显示所有书
{
system("cls");
displayBook();
while(next!
=NULL)
{
next->displayBook();
next=next->next;
}
}
};
#endif//BOOK_H_INCLUDED
[书链表类]中的函数
#ifndefBOOKLIST_H_INCLUDED
#defineBOOKLIST_H_INCLUDED
#include
#include
#include"Book.h"
usingnamespacestd;
classReaderList;
classBookList;
classBook;
classBookList:
publicBook//书类的链表
{
private:
classBook*head;//头指针
classBook*tail;//尾指针
classBook*node;//活动指针
staticintN;
public:
friendReaderList;
friendvoidsaveBooks(BookList*p);//保存图书到txt文件的函数
BookList();
~BookList();
voidAdd_list(classBook*p);//把一本书加入图书链表
voidAddNewBook();//添加一本书到链表里,并且设置它的各类信息
boolCheck_borrow_book(stringISBN_Of_Book);//检查是否有这一本书,并且它是否有库存返回是否能借书的布尔变量
voidborrow_book(stringISBN_Of_Book);//在书类链表里的借书操作
boolCheck_return_book(stringISBN_Of_Book);//检查是否存在这本书
voidreturn_book(stringISBN_Of_Book);//在书类链表里进行还书操作
classBook*search_ISBN(stringisbn);//按ISBN查找图书,并且返回一个Book*
voidsearch_BookName(stringbookname);//按书名查找并展示所有查找结果
voidsearch_Writer(stringwriter);//按作者名查找并展示所有查找结果
voidsearch_Publisher(stringpublisher);//按出版社查找并展示所有查找结果
voidsearch_keyword(stringkey);//按关键字查找并展示所有查找结果
intsearch();//查找图书的菜单用来调用其他的查找函数
voidshow_all();//显示书库中的所有图书
booldelete_onebook(stringISBN_Of_Book);//从链表中删除一本书
intchange_content(stringISBN_Of_Book);//图书修改菜单用来调用不同的改变图书信息的函数
intGoInto_BookInfo();//书库信息菜单,用来调用对图书管理的各种操作
};
#endif//BOOKLIST_H_INCLUDED
[读者类]中的函数
#ifndefREADER_H_INCLUDED
#defineREADER_H_INCLUDED
#include
#include
usingnamespacestd;
classReaderList;
classReader
{
friendReaderList;
friendvoidsaveReaders(ReaderList*g);
friendvoidreadReaders(ReaderList*g);
protected:
intReaderID;
stringReaderName;//读者姓名
stringPassword;//密码
stringBookInHand[5];//每人最多借5本书,可以根据需要增减限额
intnumberOfBooks;//记录借的书的数目,0为没有借书,1为借了一本,2为借了二本
Reader*next;//指向下一节点的指针
public:
Reader();
~Reader();
Reader(intID,stringname,stringmi,stringbooks[5],intnum);
voidsetReader(intID,stringname,stringmi,stringbooks[5],intnum);
voidcopyReader(Reader*p);
voidoperator=(constReader&reader);//运算符重载
voidresetPassword(stringnewpassword);//重设密码
virtualvoidAdd_Point(Reader*p)//添加一个读者节点
{
next=p;
p->next=NULL;
}
virtualvoidchange_password()
{
stringnewpassword;
cin>>newpassword;
Password=newpassword;
}
};
#endif//READER_H_INCLUDED
[读者链表类]中的函数
#ifndefREADERLIST_H_INCLUDED
#defineREADERLIST_H_INCLUDED
#include
#include
#include
#include
#include"BookList.h"
#include"Reader.h"
usingnamespacestd;
classBookList;
classReaderList;
classReader;
classReaderList:
publicReader
{
private:
friendvoidsaveReaders(ReaderList*g);
Reader*head_point;
Reader*tail_point;
Reader*point;//定义两个Rreader指针,head_point为头指针,point为活动指针
public:
staticintnumberOfReader;
ReaderList();//构造函数,使指针初始化
~ReaderList();
voidAdd_Point(Reader*p);//增加新结点到链表
voidreader_register();//读者注册
Reader*search_ReaderID(intid);//按ID查找
Reader*reader_land(intid,stringpasswordT);//读者登录,成功后将返回该读者的Reader*
voidshow_OneReader(Reader*p,BookList*g);//显示某读者借书情况
voidchange_password(Reader*p);//修改密码
intdelete_reader(Reader*p);//读者注销
boolCheck_borrowBook(Reader*p,stringBookISBN);//检查是否可以借书
voidborrowBook(Reader*p,stringBookISBN);//进行借书操作
boolCheck_returnBook(Reader*p,stringBookISBN);//检查是否可以还书
voidreturnBook(Reader*p,stringBookISBN);//进行还书操作
intBorrow(BookList*g,Reader*p,stringbookISBN);//借书操作的总的函数,用来调用书类链表和读者类链表里的借书相关函数
intReturn(BookList*g,Reader*p,stringbookISBN);//还书操作的总的函数,用来调用书类链表和读者类链表里的还书相关函数
intGoInto_ReaderInfo(Reader*p,BookList*g);//登陆后的读者信息菜单
};
#endif//READERLIST_H_INCLUDED
[不在类中的函数]
{帮助函数}
voidhelp()
{
system("cls");
ifstreamreadHelp;
readHelp.open("help.txt",ios:
:
in);
if(readHelp.fail())
{
cout<<"无法打开文件!
"<exit(0);
}
stringtemp;
cout<while(!
readHelp.eof())
{
getline(readHelp,temp);
cout<}
}
{存储读取相关的函数}
voidsaveLibrarian(Librarian*t)
{
ofstreamsaveLibrarian;
saveLibrarian.open("Librarian.txt",ios:
:
out);
if(!
saveLibrarian)
{
cout<<"保存管理员信息失败!
"<exit(0);
}
saveLibrarian<getPassword();
cout<"<saveLibrarian.close();
}
voidreadLibrarian(Librarian*t)
{
stringtem;
ifstreamsaveLibrarian;
saveLibrarian.open("Librarian.txt",ios:
:
in);
if(!
saveLibrarian)
{
cout<<"保存管理员信息失败!
"<exit(0);
}
saveLibrarian>>tem;
t->changePassword(tem);
cout<"<saveLibrarian.close();
}
voidsaveBooks(BookList*p)
{
ofstreamsaveBook;
saveBook.open("Books.txt",ios:
:
out);
if(!
saveBook)
{
cout<<"保存书单信息失败!
"<exit(0);
}
Book*tem=p-