南京航空航天大学《面向对象程序设计语言》课程设计报告图书管理系统学号:姓名:日期:目录一.需求分析 (2)二.程序主要功能 (2)三.程序运行平台 (2)四.系统功能框架图 (3)五.程序类说明 (4)六.模块分析 (6)七.比较有特色的地方 (7)八.存在的不足与对策 (11)九.编程体会 (12)十.程序源代码 (13)一.需求分析本系统旨在实现一个小型的图书管理系统,对于一个小型的图书馆或藏书室来说,实施本系统不仅可以减少工作人员数量,降低成本,而且可以大大提高工作效率,降低工作强度,方便读者借书查书及办理各种手续,更方便工作人员对图书进行更有效的管理。
程序主要实现读者管理、图书基本信息及库存管理、图书借还管理以及一些辅助功能等。
(1)以菜单的方式工作(2)图书、读者的基本信息的新增(3)图书、读者的基本信息的修改(4)图书、读者记录的删除(5)图书的借阅,归还(6)查询图书、读者信息及借阅状态二.程序主要功能该程序的主要功能有:读者功能可进行增加读者、读者信息修改、注销读者、读者查询、显示读者信息、显示所有读者信息等操作。
图书信息管理可以进行查询图书、增加图书、删除图书信息、图书信息修改、显示全部图书信息等操作。
其中添加内容包括:书名、ISBN编号、作者、出版商、出版日期、方便读者查看;图书借还功能应该说这是整个系统最主要的功能,借还时要输入编号已及读者编号帮助一个简单的操作指南,指导用户下一步该如何操作。
退出系统在运行时将从文件载入信息。
运行程序后每一步都会有详细的提示,操作简便,大多数地方都考虑到防止用户出现误操作的情况,以提高程序的健壮性,可以放心使用!三.程序运行平台该程序是用VC++制做的,使用Microsoft Visual C++ 运行该程序,具体操作是:打开Microsoft Visual C++ ,菜单栏里点文件→打开工作区→找到“图书管理系统.dsw ”这个文件→打开,或者在资源管理器中双击该文件,此时,VC++会自动打开,并载入该系统相关资源,点击Run 命令菜单或者或用快捷键Ctrl+F5运行该程序。
四.系统功能框架图借书/还书读者信息管图书管理系统图书信息管理帮 助统计查询.新增图书信息 .删除图书信息 .显示图书信息 .修改图书信息 .帮助说明.新增读者信息 .修改读者信息 .删除图书信息 .显示图书信息 .帮助说明 .返回上一层输入图书编号及读者编号.还书借书返回上一层五.程序类说明①有关图书信息的类struct BookInfo{char BookCode[6]; 块分析1、读者信息:下设子菜单,包括:a.新增读者b.修改读者c.删除读者d.读者查询e.显示读者信息f.返回上一层(1)读者编号:读者唯一的识别方式,所以不可以重复,长度小于六个字符。
(2)读者姓名:长度小于20个字符。
(3)读者性别:长度小于三个字符。
2、书库信息:该部分内容最丰富,下设子菜单,包括a.新书入库b.删除c.修改d.返回上一层链表的思路也跟读者信息一样,从头结点开始建,每当新增加一个类节点时,就把新增结点加到链表尾部,再让其中的next指向NULL空,这里没有对链表进行排序。
有关菜单的制作,就是先显示菜单,让用户输入选择,进行输入有效性检查,然后用switch来对不同的选择调用类中不同的函数。
3、借书/还书:借书需要判断的条件不只是判断图书是否存在、图书是否借出、读者是否存在。
还书需要提供读者编号再判断图书是否已经借出。
十.程序源代码#include<iostream>#include<>#include<>#include<fstream>#include<iomanip>#include<>using namespace std;#define BOOKLEN sizeof(struct BookInfo)#define READERLEN sizeof(struct ReaderInfo)书信息管理***"<<endl;cout<<"*2.读者信息管理***"<<endl;cout<<"*3.借书还书****"<<endl;cout<<"*4.统计查询****"<<endl;cout<<"*0.退出系统*****"<<endl;cout<<"请选择0-4:"<<endl;cin>>m;if(m>=0&&m<=4)break;elsecout<<"选择错误,请在0-4中选择"<<endl;}return m;}int CreatSubMenu1(){int m;while(1){cout<<"***图书信息管理*****"<<endl;cout<<"**"<<endl;cout<<"***1.新增图书"<<endl;cout<<"***2.修改图书"<<endl;cout<<"***3.删除图书"<<endl;cout<<"***0.返回上一层**"<<endl;cout<<"请选择0-3:"<<endl;cin>>m;if(m>=0&&m<=3)break;elsecout<<"选择错误,请在0-3中选择"<<endl;}return m;}int CreatSubMenu2(){int m;while(1){cout<<"***读者信息管理*****"<<endl;cout<<"**"<<endl;cout<<"***1.新增读者"<<endl;cout<<"***2.修改读者"<<endl;cout<<"***3.删除读者"<<endl;cout<<"***0.返回上一层**"<<endl;cout<<"请选择0-3:"<<endl;cin>>m;();if(m>=0&&m<=3)break;elsecout<<"选择错误,请在0-3中选择"<<endl;}return m;}int CreatSubMenu3(){int m;while(1){cout<<"***图书流通*****"<<endl;cout<<"**"<<endl;cout<<"****1.借书"<<endl;cout<<"****2.还书"<<endl;cout<<"***0.返回上一层**"<<endl;cout<<"请选择0-2:"<<endl;cin>>m;if(m>=0&&m<=2)break;elsecout<<"选择错误,请在0-2中选择"<<endl;}return m;}int CreatSubMenu4(){int m;while(1){cout<<"*****统计查询****"<<endl;cout<<""<<endl;cout<<"****1.图书清单***"<<endl;cout<<"****2.读者清单***"<<endl;cout<<"****3.图书查询****"<<endl;cout<<"****4.读者查询****"<<endl;cout<<"****0.返回上层*****"<<endl;cout<<"请选择0-4:"<<endl;cin>>m;if(m>=0&&m<=4)break;elsecout<<"选择错误,请在0-4中选择"<<endl;}return m;}int CountBook() //统计已有图书数量(有效图书){struct BookInfo BookTemp;FILE *fp;int count=0;if((fp=fopen("","rb"))==NULL)return 0;else{while(fread(&BookTemp,BOOKLEN,1,fp))if=='1')count++;fclose(fp);return count;}}int CountReader() //统计已有读者人数(有效人数){struct ReaderInfo ReaderTemp;FILE *fp;int count =0;if((fp=fopen("","rb"))==NULL)return 0;else{while(fread(&ReaderTemp,READERLEN,1,fp))if=='1')count++;fclose(fp);return count;}}void SubMenu1() //图书信息管理{int MenuId;while(1){MenuId=CreatSubMenu1();if(MenuId==0)break;switch(MenuId){case 1:AddBookInfo();break;case 2:ModifyBookInfo();break;case 3:DelBookInfo();break;case 0:MainMenu();break;}}}void SubMenu2() //读者信息管理{int MenuId;while(1){MenuId=CreatSubMenu2();if(MenuId==0)break;switch(MenuId){case 1:AddReaderInfo();break;case 2:ModifyReaderInfo();break;case 3:DelReaderInfo();break;case 0:MainMenu();break;}}}void SubMenu3() //图书借阅{int MenuId;while(1){MenuId=CreatSubMenu3();if(MenuId==0)break;switch(MenuId){case 1:BookBorrow();break;case 2:BookReturn();break;case 0:MainMenu();break;}}}void SubMenu4() //信息查询{int MenuId;while(1){MenuId=CreatSubMenu4();if(MenuId==0)break;switch(MenuId){case 1:ShowBookInfo();break;case 2:ShowReaderInfo();break;case 3:SearchReader();break;case 4:SearchBook();break;case 0:MainMenu();break;}}}void AddBookInfo() //新增图书记录{struct BookInfo MyBook;cout<<"请输入图书编号"<<endl;cin>>;while(IsBookExist){cout<<"图书已存在,请重新输入"<<endl;cin>>;}cout<<"请输入书名"<<endl;cin>>;cout<<"请输入作者"<<endl;cin>>;cout<<"请输入出版商"<<endl;cin>>;cout<<"请输入isbn号"<<endl;cin>>;cout<<"请输入出版日期"<<endl;cin>>;='0';strcpy,"0");='1';FILE *fp;if((fp=fopen("","rb+"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}int SetPs; //查询写入文件位置SetPs=InvalidBookPosition();if(SetPs==-1) //图书记录都是有效的,文件指针定义在文件尾fseek(fp,0,SEEK_END);elsefseek(fp,(long)BOOKLEN*SetPs,SEEK_SET); //重新定位写入位置fwrite(&MyBook,BOOKLEN,1,fp);fclose(fp);cout<<"新增图书成功,现有图书"<<CountBook()<<"册"<<"按回车键继续添加"<<endl;();getchar();}void ModifyBookInfo() //修改图书{struct BookInfo MyBook;char ModifyBookCode[6];if(CountBook==0){cout<<"无法修改"<<endl;return;}cout<<"请输入要修改的图书编号"<<endl;cin>>ModifyBookCode;if(!IsBookExist(ModifyBookCode))cout<<"图书不存在"<<endl;return;}int ModiPosition=0;ModiPosition=GetPosition(ModifyBookCode,&MyBook);cout<<"请输入新书名"<<endl;cin>>;cout<<"请输入新作者"<<endl;cin>>;cout<<"请输入新出版商"<<endl;cin>>;cout<<"请输入新的出版日期"<<endl;cin>>;FILE *fp;if((fp=fopen("","rb+"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}fseek(fp,(long)BOOKLEN*ModiPosition,SEEK_SET);fwrite(&MyBook,BOOKLEN,1,fp);fclose(fp);cout<<"修改成功,按回车键继续"<<endl;();getchar();}void DelBookInfo() //删除图书{char DelBookCode[6];if(CountBook==0){cout<<"无法删除"<<endl;return;}cout<<"请输入要删除的图书编号"<<endl;cin>>DelBookCode;if(!IsBookExist(DelBookCode)){cout<<"该书不存在"<<endl;return;}if(IsBorrow(DelBookCode)) //书已经借出,无法删除cout<<"书已经借出,无法删除"<<endl;return;}FILE *fp;if((fp=fopen("","rb+"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}struct BookInfo MyBook;int ModiPosition=0;ModiPosition=GetPosition(DelBookCode,&MyBook);='0';fseek(fp,(long)BOOKLEN*ModiPosition,SEEK_SET);fwrite(&MyBook,BOOKLEN,1,fp);fclose(fp);cout<<"删除图书成功,现有图书"<<CountBook()<<"册"<<endl; }void BookBorrow() //图书借阅{char BookCode[6];char ReaderCode[6];if(CountBook()==0||CountReader()==0){cout<<"无法借书"<<endl;return;}cout<<"请输入图书编号"<<endl;cin>>BookCode;if(!IsBookExist(BookCode)){cout<<"借书失败,该书不存在"<<endl;return;}if(IsBorrow(BookCode)){cout<<"书已经借出,借书失败"<<endl;return;}cout<<"请输入读者编号"<<endl;cin>>ReaderCode;if(!IsReaderExist(ReaderCode)){cout<<"读者不存在,借书失败"<<endl;return;}FILE *fp;if((fp=fopen("","rb+"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}int Position=0;struct BookInfo MyBook;Position=GetPosition(BookCode,&MyBook);='1';strcpy,ReaderCode);fseek(fp,(long)BOOKLEN*Position,SEEK_SET);fwrite(&MyBook,BOOKLEN,1,fp);fclose(fp);cout<<"借书成功,按回车键继续"<<endl;();getchar();}void BookReturn() //还书{char BookCode[6];if(CountBook()==0||CountReader()==0){cout<<"无法还书"<<endl;return;}cout<<"请输入图书编号"<<endl;cin>>BookCode;if(!IsBookExist(BookCode)){cout<<"还书失败,该书不存在"<<endl;return;}if(!IsBorrow(BookCode)){cout<<"书未借出,还书失败"<<endl;return;}FILE *fp;if((fp=fopen("","rb+"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}int Position=0;struct BookInfo MyBook;Position=GetPosition(BookCode,&MyBook);='0';strcpy,"0");fseek(fp,(long)BOOKLEN*Position,SEEK_SET);fwrite(&MyBook,BOOKLEN,1,fp);fclose(fp);cout<<"还书成功,按回车键继续"<<endl;();getchar();}void ShowBookInfo() //显示所有图书信息{struct BookInfo MyBookInfo;int booknum=CountBook();if(booknum==0){cout<<"没有图书信息"<<endl;return;}FILE *fp;if((fp=fopen("","rb+"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}while(fread(&MyBookInfo,BOOKLEN,1,fp))cout<<"编号"<<setw(6)<<<<"书名"<<setw(20)<<<<"作者"<<setw(20)<<<<"出版商"<<setw(30)<<<<"出版日期"<<setw(8)<<;}void SearchBook() //图书查询{char BookCode[6];if(CountBook()==0){cout<<"图书不存在"<<endl;return;}cout<<"请输入图书编号"<<endl;cin>>BookCode;if(!IsBookExist(BookCode)){cout<<"图书不存在"<<endl;return;}struct BookInfo MyBook;GetPosition(BookCode,&MyBook);cout<<"编号"<<setw(6)<<<<"书名"<<setw(20)<<<<"作者"<<setw(20)<<<<"出版商"<<setw(30)<<<<"出版日期"<<setw(8)<<;if=='1') //若书借出,则显示借阅的读者的信息ShowAReader;else cout<<"该书未被借阅"<<endl;}void SearchReader() //读者查询{char ReaderCode[6];if(CountReader==0){cout<<"读者不存在"<<endl;return;}cout<<"请输入读者编号"<<endl;cin>>ReaderCode;if(!IsReaderExist(ReaderCode)){cout<<"读者不存在"<<endl;return;}ShowAReader(ReaderCode);int BorrowCount=IsBorrowed(ReaderCode);if(BorrowCount==0)cout<<"读者未借阅该书"<<endl;else{cout<<"读者借阅了"<<BorrowCount<<"册"<<endl;FILE *fp;if((fp=fopen("","rb"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}struct BookInfo MyBook;while(fread(&MyBook,BOOKLEN,1,fp)){if(strcmp,ReaderCode)==0){i++;cout<<i<<<<<<<<endl;}}fclose(fp);}}void ShowAReader(char *ReaderCode) //显示指定编号的读者详细信息{FILE *fp;if((fp=fopen("","rb"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}struct ReaderInfo MyReader;while(fread(&MyReader,READERLEN,1,fp)==NULL)if(strcmp,ReaderCode)==0)break;cout<<"借阅读者"<<ReaderCode<<<<<<endl;fclose(fp);}int InvalidBookPosition() //查询第一条无效图书记录在文件中的位置{int InvalidPs=-1;int count=0;FILE *fp;if((fp=fopen("","rb"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}struct BookInfo MyBook;while(fread(&MyBook,BOOKLEN,1,fp)){if=='0'){InvalidPs=count;break;count++;}fclose(fp);return InvalidPs;}int IsBookExist(char *ChkBookCode) //查询指定图书在文件中是否存在{int IsExist=0;FILE *fp;if((fp=fopen("","rb"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}struct BookInfo MyBook;while(fread(&MyBook,BOOKLEN,1,fp)){if(strcmp,ChkBookCode)==0&&{IsExist=1;break;}}fclose(fp);return IsExist;}int IsBorrow(char *BookCode) //判断图书是否已经借出,在借返回1,否则返回0 {struct BookInfo temp;int IsbBorrow =0;FILE *fp;if((fp=fopen("","rb"))!=NULL){while(fread(&temp,BOOKLEN,1,fp))if(strcmp,BookCode)==0&&=='1'){IsbBorrow=1;break;}}fclose(fp);return IsbBorrow;}int GetPosition(char *ModiCode,struct BookInfo *MyBook) //获得待修改图书的位置{int count=0;FILE *fp;if((fp=fopen("","rb"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}while(fread(MyBook,BOOKLEN,1,fp)){if(strcmp(MyBook->BookCode,ModiCode)==0&&MyBook->IsAvailable=='1')break;count++;}fclose(fp);return count;}void AddReaderInfo() //增加读者{struct ReaderInfo MyReader;cout<<"读者编号"<<endl;cin>>;while(IsReaderExist){cout<<"读者已存在,请重新输入"<<endl;cin>>;}cout<<"读者姓名"<<endl;cin>>;cout<<"读者性别"<<endl;cin>>;='1'; //新增读者FILE *fp;if((fp=fopen("","rb+"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}int SetPs;SetPs=InvalidReaderPosition();if(SetPs=-1)fseek(fp,0,SEEK_END);else fseek(fp,(long)READERLEN*SetPs,SEEK_SET);fwrite(&MyReader,READERLEN,1,fp);fclose(fp);cout<<"添加读者成功,按回车键继续添加,现有读者"<<CountReader()<<"人"<<endl;();getchar();}void ModifyReaderInfo() //修改读者信息{struct ReaderInfo MyReader;char ModifyCode[6];if(CountReader()==0){cout<<"无法修改"<<endl;return;}cout<<"请输入要修改的编号"<<endl;cin>>ModifyCode;if(!IsReaderExist(ModifyCode)){cout<<"读者不存在"<<endl;return;}int ModiPosition=0;ModiPosition=GetRdPosition(ModifyCode,&MyReader);cout<<"读者姓名"<<endl;cin>>;cout<<"读者性别"<<endl;cin>>;FILE *fp;if((fp=fopen("","rb+"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}fseek(fp,(long)READERLEN*ModiPosition,SEEK_SET);fwrite(&MyReader,READERLEN,1,fp);fclose(fp);cout<<"修改读者成功,按回车键继续"<<endl;();getchar();}void DelReaderInfo() //删除读者信息{char DelCode[6];if(CountReader()==0){cout<<"无法删除"<<endl;return;}cout<<"请输入要删除的读者编号"<<endl;cin>>DelCode;if(!IsReaderExist(DelCode)){cout<<"读者不存在,无法删除"<<endl;return;}int BorrowedNum;BorrowedNum=IsBorrowed(DelCode); //如果读者有书还未还,那不可以删除读者if(BorrowedNum){cout<<"不可以删除,有书还未还"<<endl;return;}FILE *fp;if((fp=fopen("","rb+"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}struct ReaderInfo MyReader;int ModiPosition=0;ModiPosition=GetRdPosition(DelCode,&MyReader);='0';fseek(fp,(long)READERLEN*ModiPosition,SEEK_SET);fwrite(&MyReader,READERLEN,1,fp);fclose(fp);cout<<"删除成功,现有读者"<<CountReader()<<"人"<<endl;}int IsBorrowed(char *ReaderCode) //判断是否有书未还{struct BookInfo temp;int BorrowedNum=0;FILE *fp;if((fp=fopen("","rb"))!=NULL)while(fread(&temp,BOOKLEN,1,fp))if(strcmp,ReaderCode)==0&&=='1')BorrowedNum++;fclose(fp);return BorrowedNum;}int GetRdPosition(char *ModiCode,struct ReaderInfo *MyReader) //获得待修改读者记录的位置{int count=0;FILE *fp;if((fp=fopen("","rb"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}while(fread(MyReader,READERLEN,1,fp)){if(strcmp(MyReader->ReaderCode,ModiCode)==0&&MyReader->IsAvailable=='1')break;count++;}fclose(fp);return count;}int IsReaderExist(char *ChkCode) //查询读者是否存在{int IsExist=0;FILE *fp;if((fp=fopen("","rb"))==NULL){cout<<"文件打开错误"<<endl;exit(0);}struct ReaderInfo MyReader;while(fread(&MyReader,READERLEN,1,fp)){if(strcmp,ChkCode)==0&&=='1'){IsExist=1;break;}}fclose(fp);return IsExist;}int InvalidReaderPosition() //查询第一条无效读者的位置{int InvalidPs=-1;int count=0;FILE *fp;if((fp=fopen("","rb"))==NULL){cout<<"文件打开失败"<<endl;exit(0);}struct ReaderInfo MyReader;while(fread(&MyReader,READERLEN,1,fp)){if=='0'){InvalidPs=count;break;}count++;}fclose(fp);return InvalidPs;}void ShowReaderInfo() //显示所有读者信息{struct ReaderInfo MyReader;int ReaderNum=CountReader();if(ReaderNum==0){cout<<"没有读者信息"<<endl;return;}FILE *fp;if((fp=fopen("","rb"))==NULL){cout<<"文件打开失败"<<endl;exit(0);}while(fread(&MyReader,READERLEN,1,fp)){if=='1')cout<<<<<<<<endl;}fclose(fp);}int main(){int MenuId;Welcome();while(1){MenuId=MainMenu();if(MenuId==0){cout<<"程序运行结束!"<<endl;break;}switch(MenuId){case 1: SubMenu1();break;case 2: SubMenu2();break;case 3: SubMenu3();break;case 4: SubMenu4();break;}}return 0;}。