长 沙 学 院
课程设计说明书
题系
(
部
目 )
图书预定系统 计算机科学与技术系
软件工程 罗利 2010022905
卓琳
2011.5.6-2011.5.16
专业(班级) 姓学指起
名 号
导止
教日
师 期
长沙学院课程设计鉴定表
姓名 罗利 学号 2010022905 专业 软件工程 班级 九班 卓琳 设计题目 图书预定系统 指导教师 指导教师意见: 评定等级: 教师签名: 日期: 答辩小组意见: 评定等级: 答辩小组长签名: 日期: 教研室意见: 教研室主任签名: 日期: 系(部)意见: 系主任签名: 日期: 说明 课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;
课程设计任务书
课程名称:C++程序设计基础
设计题目:1、图书预定系统
设计要求:
问题的描述:
张晨是一位很爱学习的同学,但是他总是为在图书馆借阅不到自己想看的书而烦恼。终于有一天他在图书馆做勤工俭学时突发奇想:“要是有一个包含图书预定的图书借阅系统就好了”。你能够帮助他完成这个系统的编写吗? 系统的大致要求如下:
1. 系统记录图书的主要信息:书名、作者、书号 、出版社 、版次 、出版时间 、馆藏编号 。 2. 系统应该记录读者的信息:姓名、借书证号 、所在系部 、分类(学生?老师?) 、已借
书籍 、超期书籍 、预定书籍 。每本书都应记录其借出日期 和应归还日期 。 3. 借书的规则如下,学生读者可以借5本图书,教师可以借6本,借期都是一个月。一旦超期,
就不可以再借书或预定(原预定的图书取消)。为了简化系统,本题不考虑续借的问题。 4. 预定规则如下:每个学生可以以预定两本,老师可以预定三本图书。被预定的书本一旦重新
入库,则通知前三个预定者,先到的人先借。 5. 如果被预定的图书超过一定人数图书比(比如说某本书被5个人预定,这本书的预定比为5:
1),则将本书加入到下一次的采购清单。
技术要求:
1、菜单:用户需要通过菜单来选择功能。例如,菜单可以设计为下面的样子(菜单和功能可以自己设计,以下界面仅供参考):
########################################
欢迎来到长沙学院图书馆
请按键选择功能
########################################
1、登陆 2注销
2、借书 4、图书预定
3、还书 5、图书检索
7、退出系统
#########################################
2、设计合理的检索功能,要求实现 按名称检索图书
按书号检索图书 按出版社检索图书 按馆藏编号检索图书
3、设计合理的排序功能,要求实现所借书籍: 按还期排序
按书号排序 按馆藏编号排序
4、巧妙灵活的运用文件知识,将多个信息写入文件,如读者信息、图书信息等 5、馆藏书目和读者信息事先已经存放在各自的文件中,程序只需读取和处理即可 6、无需设计全面的图书的管理功能和读者的管理功能,这样可以控制程序规模和复杂度
技术提示:
1、分析和设计很重要,设计清楚再动手
2、使用面向对象的方法可以减轻复杂问题的分析难度
3、使用模板可以减少函数的数量
4、文件不要用太多,要注意文件之间(文件中信息之间)的关系
设计工作量:40课时
工作计划:
(1) 2010软件工程(服务外包)1~14班
2课时:课程设计相关知识介绍。多媒体教室。 26课时:上机、调试。计算机系机房。 10课时:答疑。办公室。 2课时:答辩。计算机系机房。
指导教师签名: 日期:
教研室主任签名: 日期:
系主任签名: 日期:
摘要
该程序使用面向对象的方法实现了图书的预定、检索、借书、还书等一系列功能、还包括图书信息和读者信息的增、删、改、查操作,图书管理员通过密码鉴定对图书信息进行入库、修改、删除等图书信息管理。
系统中包括“图书”类,进行的操作有借书、还书、预定、显示图书信息。“图书库”类(和图书类是聚合关系),进行的操作有构造函数(从文件中读取数据写到对象数组中)、析构函数(将对象数组中的数据保存到文件中)、增删改查函数、书库维护函数(调用增删改查的接口)。关于对读者的操作和定义类似于对图书的操作。
在图书管理系统中,管理员要为每个读者建立借阅账户,并給读者发放不同类别的借阅卡(借阅卡可提供卡号、读者姓名),账户内存储读者的个人信息和借阅记录信息。持有借阅卡的读者可以通过管理员借阅、归还图书和预定图书,不同类别的读者可借阅和预定图书的数量不同。
关键词:XML;面向对象; 图书 管理系统 数据库
目录
1 设计内容与要求 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„ 1 2.设计说明 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„ 3 2.1 问题描述与功能设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 2.2 算法与数据结构„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„5 2.3 函数定义„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 2.4 界面设计、测试„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„17 2.5 编码„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„25 2.6 类图„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„31 3 总结„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„33
参考文献 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„34 附录A 源代码„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„35
1设计内容与要求
设计要求与内容:
问题的描述:
张晨是一位很爱学习的同学,但是他总是为在图书馆借阅不到自己想看的书而烦恼。终于有一天他在图书馆做勤工俭学时突发奇想:“要是有一个包含图书预定的图书借阅系统就好了”。你能够帮助他完成这个系统的编写吗? 系统的大致要求如下:
6. 系统记录图书的主要信息:书名(bookName)、作者(author)、书号(ISBN)(bookNum)、出版
社(press)、版次(edition)、出版时间(publishTime)、馆藏编号(code)。 7. 系统应该记录读者的信息:姓名(readerName)、借书证号(rentBookNum)、所在系部
(department)、分类(学生?老师?)(identity)、已借书籍(rentedBook)、超期书籍(overtdueBook)、
预定书籍(bookBook)。每本书都应记录其借出日期(rentDate)和应归还日期( shouldReturnDate)。
8. 借书的规则如下,学生读者可以借5本图书,教师可以借6本,借期都是一个月。一旦超期,就不可以再借书或预定(原预定的图书取消)。为了简化系统,本题不考虑续借的问题。 9. 预定规则如下:每个学生可以以预定两本,老师可以预定三本图书。被预定的书本一旦重新
入库,则通知前三个预定者,先到的人先借。 10. 如果被预定的图书超过一定人数图书比(比如说某本书被5个人预定,这本书的预定比为5:
1),则将本书加入到下一次的采购清单。
技术要求:
1、菜单:用户需要通过菜单来选择功能。例如,菜单可以设计为下面的样子(菜单和功能可以自己设计,以下界面仅供参考):
########################################
欢迎来到长沙学院图书馆
请按键选择功能 ########################################
1、登陆(register) 2注销(cancel) 2、借书(Book_rent) 3、还书(Book_return) 4、图书预定 (Book_book) 5、图书检索(Book_Retrieval)
7、退出系统(System_exit)
#########################################
2、设计合理的检索功能,要求实现 按名称检索图书
按书号检索图书 按出版社检索图书 按馆藏编号检索图书
1
3、设计合理的排序功能,要求实现所借书籍: 按还期排序
按书号排序 按馆藏编号排序
4、巧妙灵活的运用文件知识,将多个信息写入文件,如读者信息、图书信息等 5、馆藏书目和读者信息事先已经存放在各自的文件中,程序只需读取和处理即可 6、无需设计全面的图书的管理功能和读者的管理功能,这样可以控制程序规模和复杂度
技术提示:
1、分析和设计很重要,设计清楚再动手
2、使用面向对象的方法可以减轻复杂问题的分析难度 3、使用模板可以减少函数的数量
4、文件不要用太多,要注意文件之间(文件中信息之间)的关
2
2.设计说明
2.1 问题描述与功能设计
1.问题描述 问题的描述:
张晨是一位很爱学习的同学,但是他总是为在图书馆借阅不到自己想看的书而烦恼。终于有一天他在图书馆做勤工俭学时突发奇想:“要是有一个包含图书预定的图书借阅系统就好了”。你能够帮助他完成这个系统的编写吗? 系统的大致要求如下:
11. 系统记录图书的主要信息:书名(bookName)、作者(author)、书号(ISBN)(bookNum)、出版
社(press)、版次(edition)、出版时间(publishTime)、馆藏编号(code)。 12. 系统应该记录读者的信息:姓名(readerName)、借书证号(rentBookNum)、所在系部
(department)、分类(学生?老师?)(identity)、已借书籍(rentedBook)、超期书籍(overtdueBook)、
预定书籍(bookBook)。每本书都应记录其借出日期(rentDate)和应归还日期( shouldReturnDate)。
13. 借书的规则如下,学生读者可以借5本图书,教师可以借6本,借期都是一个月。一旦超期,
就不可以再借书或预定(原预定的图书取消)。为了简化系统,本题不考虑续借的问题。 14. 预定规则如下:每个学生可以以预定两本,老师可以预定三本图书。被预定的书本一旦重新
入库,则通知前三个预定者,先到的人先借。 15. 如果被预定的图书超过一定人数图书比(比如说某本书被5个人预定,这本书的预定比为5:
1),则将本书加入到下一次的采购清单。 2.功能设计 1、总体功能
实现图书信息的全面管理,主要是对图书书名、馆藏编号的管理。通过此程序能够更方便的处理图书信息,如图1所示
3
图书预定系统 输 入 图 书 记 录 删 除 图 书 记 录 修 改 图 书 记 录 查 询 书 籍 记 录 显 示 所 有 图 书 读 者 管 理 模 块 图 书 借 阅 模 块
2、模块功能 (一)输入模块
该模块是实现对图书按照书号、书名、作者、出版日期、出版社、馆藏编号的录入并保存到文件中。 (二)删除模块
该模块实现俺图书馆藏编号对图书信息的删除。 (三)修改模块
该模块实现按图书馆藏编号对图信息的修改。 (四)查询模块
该模块实现按图书馆藏编号查询每种图书的信息。 (五)显示所有图书模块
该模块实现显示所有图书的信息。 (六)读者管理模块
该模块实现对读者信息的增删改查。 (七)借阅模块
该模块实现图书的预定、借阅、归还和检索功能。
4
2.2 算法与数据结构
1.算法
借书、还书、预定、图书信息管理功能的详细描述:
1) 借书
A.输入读者编号
IF 如果读者编号有效且有超期未还的图书
则提示超期未还的借阅记录; ELSE
B.输入图书编号;
If 已借书数>=可借书数 Then 给出相应提示; Else
添加一条借录;
“图书信息表”中“现有库存量”-1; “读者信息表”中“已借书数量”+1; 提示执行情况; Endif
输出读者信息
2) 还书
A.输入读者编号;
提示超期未还的借阅记录;
If 有超期 then 提示,调用“计算超期罚款金额”;
Endif
If 选择“确定” 还书
B.输入图书编号;
If 读者状态无效 或 该图书标号不在借录中then 提示该读者借书证无效或该图书不是该读者借阅的; Else
添加一条还录;
删除该借录; “图书信息表”中“现有库存量”+1; 通知预定该书的前3位同学!!! “读者信息表”中“已借书数量”-1; 提示执行情况; 输出读者信息
5
3) 预定
.输入读者编号;
If 该用户预定图书数目>=2(学生)或者>=3(老师) 提示该读者不能预订; Else
修改该用户的预定记录; 修改图书的预定记录; 图书预定次数+1; 提示执行情况; 输出读者信息
4) 图书信息管理
在系统中增加、修改、删除和查询图书信息纪录。
3、设计系统中的类,画出类图 (1)“图书”类: 私有数据:
书名、作者、书号、出版社、版次、出版时间、馆藏编号 增加:预定次数
公共操作:
借书、还书、预定、显示图书信息
(2)“图书库”类(和图书类是聚合关系)
私有数据:
图录指针
图书对象数组 公共操作:
构造函数(从文件中读取数据写到对象数组中) 析构函数(将对象数组中的数据保存到文件中) 增删改查函数
书库维护函数(调用增删改查的接口)
(3) “读者”类
私有数据
读者编号 读者姓名
读者类别 读者系部 已借图书数量
已借图书编号:数组 已经预定图书数量
已经预定图书编号:数组
公共操作
6
写入读者信息 读取读者信息 增删改查读者信息 显示读者信息 返回借阅数量 返回预定数量 借书 还书
预定图书
。。。。。。
读者类可以派生出:学生读者和老师读者两个类
(4)读者库类(和读者类是聚合关系)
私有数据: 读者记录指针 读者对象数组 公共操作:
构造函数(从文件中读取数据写到对象数组中) 析构函数(将对象数组中的数据保存到文件中) 增删改查读者信息的函数
显示读者信息
读者库维护函数(调用增删改查的接口)
2.数据结构
程序定义了“图书”类Book,其私有数据有书名bookName、作者author、书号bookNum、出版社press、版次edition、出版时间publishTime、馆藏编号code、删除标记tag、再架标记onshelf。 class Book {
private:
string bookName; //书名 string author; //作者 string bookNum; //书号 string press; //出版社 string edition; //版次
7
string publishTime; //出版时间 int code; //馆藏编号
int tag; //删除标记 1:已删 0:未删 int onshelf; //是否再架 1:再架 2:已借 public: ········· };
“图书库”类BDatabase(和图书类是聚合关系),其私有数据有图录指针top,图书对
象数组
book[maxBook],其中maxBook=1000,可重新定义。公有数据有热录hotnum、热书编号hotbook[500]。
const int maxBook=1000; //最大书籍容量 class BDatabase {
private:
int top; //图录指针
Book book[maxBook]; //图书对象数组 public:
int hotnum;//热录 int hotbook[500];//热书编号 ······· };
“读者”类Reader,其私有数据有登陆标记regist、删除标记tag、读者姓名readerName、借书证号rentBookcode、身份identity、所在系部department、已借书籍数量rentedBooknum、已借书籍编号rentedBookcode[6]、借书日期rentbookdata[6]、还书日期backbookdata[6]、超期书籍overtdueBook、
预定书籍数量bookBooknum,、预定书籍日期bookBookdata[3]、预定书籍编号bookBookcode[3]。 class Reader {
8
private:
int regist; //登陆标记 1:已登录 0:未登陆 int tag; //删除标记 1:已删 0:未删 string readerName; //读者姓名 string rentBookcode; //借书证号 string identity; //身份
string department; //所在系部 int rentedBooknum; //已借书籍数量 int rentedBookcode[6]; //已借书籍编号 int rentbookdata[6]; //借书日期 int backbookdata[6]; //还书日期 string overtdueBook; //超期书籍 int bookBooknum; //预定书籍数量 int bookBookdata[3]; //预定书籍日期 int bookBookcode[3]; //预定书籍编号 public:
·········· };
读者库类RDatabase(和读者类是聚合关系),其私有数据有读者记录指针top、读者对象数组read[maxReader],其中maxReader=500,可重新定义。 const int maxReader=500; class RDatabase {
private:
int top; //读者记录指针
Reader read[maxReader];//读者对象数组 public: ···· };
9
2.3 函数定义
借书函数,按图书馆藏编号查找图书,再分别记录到读者信息和图书信息中 void rent_book(string readercode) //借书函数 { int i; string id; int bookcode; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b; id3:
cout<<\"身份:\"; cin>>id;
if(id==\"student\"||id==\"teacher\"); else
{ cout<<\"输入有误,请重新输入!\\n\\n\"; goto id3;} bc:
cout<<\"图书编号: \"; cin>>bookcode;
r=ReaderDB.query(readercode);//按编号查找读者 b=BookDB.query(bookcode); //按编号查找书籍
if(b==NULL) {
cout<<\" 不存在该图书,不能借书!(重输请输1,退出请输0)\\n\\n\"; cin>>i; if(i==1) goto bc;
10
else return; }
if(b->borrowbook()==0) {
cout<<\"\该图书已借出,不能借书(重输请输1,退出请输0)\\n\\n\"< r->borrowbook(b->getcode(),id); //借书 r->show(); cout<<\"\\n继续请输1,退出请输0\\n\\n\"; cin>>i; if(i==1) goto bc; else return; } 还书函数,按图书馆藏编号分别向读者信息和图书信息中查找相关信息,显示提示,并进行还书的相关记录。 void back_book(string readercode) //还书函数 { int bookcode; RDatabase ReaderDB; Reader *r; BDatabase BookDB; 11 Book *b; int i; b: cout<<\"图书编号:\"; cin>>bookcode; r=ReaderDB.query(readercode);//按编号查找读者 b=BookDB.query(bookcode); //按编号查找书籍 if (b==NULL) { cout<<\"\不存在该图书,不能还书(重输请输1,退出请输0)\\n\"< b->retbook(); r->retbook(b->getcode()); r->show(); r=ReaderDB.FindBybookBookcode(bookcode); //通知预订的的前三位同学 if(r!=NULL) { cout<<\"********************************************************************************\\n\"; cout<<\"\\\\通知\\n\\n\"; int max[4]={0,0,0,0}; int j=0,i=1; while(j<3) { while(r!=NULL) 12 {if(r->getbookBookdate(bookcode)>max[i]&&r->getbookBookdate(bookcode)!=max[i-1]) max[i]=r->getbookBookdate(bookcode); r++; } cout< cout<<\"\述三位同学可去借书籍<<\"< cout<<\"\\n继续请输1,退出请输0\\n\"; cin>>i; if(i==1) goto b; else return; } 预定书籍函数 ,按图书馆藏编号对图书信息进行查找,存在且已借出的书籍即可预定,显示相关提示,预定成功时便对读者信息记录 void Book_book(string readercode) //预定书籍函数 { string id; int bookcode; int i; RDatabase ReaderDB; Reader *r; BDatabase BookDB; 13 Book *b; cout<<\"身份:\"; cin>>id; bcd: cout<<\"图书编号:\"; cin>>bookcode; r=ReaderDB.query(readercode);//按编号查找读者 b=BookDB.query(bookcode); //按编号查找书籍 if(b==NULL) { cout<<\" 不存在该图书,不能预定书籍(重输请输1,退出请输0)\"; cin>>i; if(i==1) goto bcd; else return; } if(b->borrowbook()==0) r->bookBook(b->getcode(),id); else cout<<\"此书未被借,不必预定!\\n\\n\"; r->show(); BookDB.outb(); ReaderDB.outr(); int j=1; r=ReaderDB.FindBybookBookcode(bookcode); //查找热书 while(r!=NULL) { j++; r++; 14 } if(j>=5) {BookDB.hotnum++; BookDB.hotbook[BookDB.hotnum]=bookcode; } cout<<\"\\n继续请输1,退出请输0\\n\"; cin>>i; if(i==1) goto bcd; else return; } 图书检索函数 ,可按书名、书号、检索、馆藏编号对图书进行查找 void Book_Retrieval() //图书检索函数 { char choice; string s; int c; BDatabase BookDB; start: cout<<\"\\\图书检索\\n\\n\"; printf(\" 1,按书名检索图书 2,按书号检索图书\\n\\n\"); printf(\" 3,按出版社检索图书 4,按馆藏编号检索图书 0, cin>>choice; switch(choice) { case '0': return; break; case '1': 15 退出\\n\\n\"); cout<<\"请输入书名:\"; cin>>s; BookDB.FindByname(s); goto start; break; case '2': cout<<\"请输入书号:\"; cin>>s; BookDB.FindBynum(s); goto start; break; case '3': cout<<\"请输入出版社名:\"; cin>>s; BookDB.FindBypress(s); goto start; break; case '4': cout<<\"请输入馆藏编号:\"; cin>>c; BookDB.FindBycode(c); goto start; break; default: cout<<\"输入有误,请重新输入!\\n\\n\"; } } 16 2.4 界面设计、测试 1、主界面,如图2 图2 使用者可以根据需要选择相应的键进行操作。 2、登陆功能 在图2界面下选择数字1可进入登陆功能界面,通过输入密码可登陆图书管理系统,如图3 图3 17 3、输入功能 在图2界面下选择1可进入图书维护功能界面,屏幕显示提示信息,使用者输入相关信息后,系统将自动将输入的图书信息保存到文件中,如图4 所示。 图4 在图2界面下选择2可进入读者维护功能界面,屏幕显示提示信息,使用者输入相关信息后,系统将自动将输入的读者信息保存到文件中,如图4 所示。 图4 4、删除功能 在图3中选择数字3可进入图书删除功能界面,这时出现删除子菜单,要求使用者输入要删除的馆藏编号,输入馆藏编号后,程序开始执行删除功能,如图5所示。 图5 18 在图4 中选择数字3可进入读者删除功能界面,这时出现删除子菜单,要求使用者输入要删除的读者的借书证号,输入借书证号后,程序开始执行删除功能,如图6所示。 图 6 5、修改功能 在图5中选择数字2进入图书修改功能界面,这时出现修改子菜单,要求使用者输入要修改的馆藏编号,输入馆藏编号后,程序开始执行修改功能,如图7所示。 图7 在图6中选择数字2进入图书修改功能界面,这时出现修改子菜单,要求使用者输入要修改的读者的借书证号,输入借书证号后,程序开始执行修改功能,如图8所示。 图8 19 6、查询功能 在图7中选择数字4进入图书查询功能界面,这时出现查询子菜单,要求使用者输入要查询的馆藏编号,输入馆藏编号后,程序开始执行查询功能,如图9所示。 图9 在图8中选择数字4进入图书查询功能界面,这时出现查询子菜单,要求使用者输入要查询的读者的借书证号,输入借书证号后,程序开始执行修改功能,如图8所示。 图10 7、读者借阅功能 在登陆界面下选择数字2可进入读者借阅系统,读者按照指示进行操作,然后系统将录入的记录自动保存但相应的文件中。 20 借书,在图1中选择数字3进入借书界面,读者根据提示输入相关信息后,程序开始执行借书操作。 如图11所示。 图11 还书,在图1中选择数字4进入借书界面,读者根据提示输入相关信息后,程序开始执行还书操作。 如图12所示 图12 21 预定书籍,在图1中选择数字5进入预定书籍界面,读者根据提示输入相关信息后,程序开始执行预定书籍操作。如图13所示。 图13 图书检索,在图1中选择数字6进入借书界面,读者根据提示输入相关信息后,程序开始执行图书操作。 如下图所示 图14 按书名检索图书 22 图15 按书号检索图书 图16 按出版社检索图书 图17 按馆藏编号检索图书 23 注销,在图1中选择数字2进入注销界面,读者根据提示输入相关信息后,程序开始执行注销操作。如图18所示。 2.5、编码 1、借书: void rent_book(string readercode) //借书函数 { int i; string id; int bookcode; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b; id3: cout<<\"身份:\"; cin>>id; if(id==\"student\"||id==\"teacher\"); else { cout<<\"输入有误,请重新输入!\\n\\n\"; 24 goto id3;} bc: cout<<\"图书编号: \"; cin>>bookcode; r=ReaderDB.query(readercode);//按编号查找读者 b=BookDB.query(bookcode); //按编号查找书籍 if(b==NULL) cout<<\"\不存在该图书,不能借书! \\n\\n\"; if(b->borrowbook()==0) cout<<\"\该图书已借出,不能借书 \\n\\n\"< 2、还书: void back_book(string readercode) //还书函数 { int bookcode; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b; int i; b: cout<<\"图书编号:\"; cin>>bookcode; 25 cout<<\"还书成功!\\n\\n\"; r=ReaderDB.query(readercode);//按编号查找读者 b=BookDB.query(bookcode); //按编号查找书籍 if (b==NULL) { cout<<\"\不存在该图书,不能还书(重输请输1,退出请输0)\\n\"< b->retbook(); r->retbook(b->getcode()); r->show(); r=ReaderDB.FindBybookBookcode(bookcode); //通知预订的的前三位同学 if(r!=NULL) { cout<<\"********************************************************************************\\n; cout<<\"\\\\通知\\n\\n\"; int max[4]={0,0,0,0}; int j=0,i=1; while(j<3) { while(r!=NULL) {if(r->getbookBookdate(bookcode)>max[i]&&r->getbookBookdate(bookcode)!=max[i-1]) 26 max[i]=r->getbookBookdate(bookcode); r++; } cout< cout<<\"\述三位同学可去借书籍<<\"< cout<<\"\\n继续请输1,退出请输0\\n\"; cin>>i; if(i==1) goto b; else return; } 3、预定书籍: void Book_book(string readercode) //预定书籍函数 { string id; int bookcode; int i; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b; 27 cout<<\"身份:\"; cin>>id; bcd: cout<<\"图书编号:\"; cin>>bookcode; r=ReaderDB.query(readercode);//按编号查找读者 b=BookDB.query(bookcode); //按编号查找书籍 if(b==NULL) { cout<<\" 不存在该图书,不能预定书籍(重输请输1,退出请输0)\"; cin>>i; if(i==1) goto bcd; else return; } if(b->borrowbook()==0) r->bookBook(b->getcode(),id); else cout<<\"此书未被借,不必预定!\\n\\n\"; r->show(); BookDB.outb(); ReaderDB.outr(); int j=1; r=ReaderDB.FindBybookBookcode(bookcode); //查找热书 while(r!=NULL) { j++; 28 r++; } if(j>=5) { BookDB.hotnum++; BookDB.hotbook[BookDB.hotnum]=bookcode; } cout<<\"\\n继续请输1,退出请输0\\n\"; cin>>i; if(i==1) goto bcd; else return; } 4、图书检索: void Book_Retrieval() //图书检索函数 { char choice; string s; int c; BDatabase BookDB; start: cout<<\"\\\图书检索\\n\\n\"; printf(\" 1,按书名检索图书 2, printf(\" 3,按出版社检索图书 4, cin>>choice; switch(choice) { case '0': return; 按书号检索图书\\n\\n\"); 按馆藏编号检索图书 0,29 退出\\n\\n\"); break; case '1': cout<<\"请输入书名:\"; cin>>s; BookDB.FindByname(s); goto start; break; case '2': cout<<\"请输入书号:\"; cin>>s; BookDB.FindBynum(s); goto start; break; case '3': cout<<\"请输入出版社名:\"; cin>>s; BookDB.FindBypress(s); goto start; break; case '4': cout<<\"请输入馆藏编号:\"; cin>>c; BookDB.FindBycode(c); goto start; break; default: cout<<\"输入有误,请重新输入!\\n\\n\"; } } 30 2.6、类图 1、图书类图 BDatabase top:int BDatabase(); ~BDatabase(); void inb(); void outb(); void addbook(string , string ,string ,string ,string ,string ,int ); void clear(); Book *query(int c); void FindByname(string ); void FindBynum(string); void FindBypress(string ); void FindBycode(int c); void bookdata(); Book bookName: string author: string bookNum: string press: string edition: string publishTime: string code:int tag:int onshelf:int void in(ifstream &file); void out(ofstream &file); string getbookName(); string getbookNum(); string getpress(); int getcode(); int gettag(); void show(); void addbook(string, string,string,string,string,string,int); void delbook(); int borrowbook(); void retbook(); 31 、读者类图 RDatabase top:int RDatabase(); ~RDatabase(); void inr(); void outr() void clear(); void addStudent(string, string,string,string); void changeStudent(string, string,string,string); void addTeacher(string, string,string); void changeTeacher(string, string,string); Reader *query(string c); Reader *FindBybookBookcode(int); void show(); void readerdata(); 32 Book regist:int tag:int readerName:string rentBookcode:int identity:string department:string rentedBooknum:int rentedBookcode[6]:int rentbookdata[6]:int backbookdata[6]; overtdueBook:string bookBooknum:int bookBookdata[3]:int bookBookcode[3]:int void in(ifstream &file); void out(ofstream &file); void set1regist(); void set0regist(); void show(); string getreaderName(); int gettag(); string getrentBookcode(); int getbookBookcode(int); int getregist(); int getbookBookdate(int); void delreader(); void addStudent(string, string,string,string); voidchangeStudent(string, string,string); void addTeacher(string, string,string); void changeTeacher(string, string); void borrowbook(int,string); void retbook(int ); void bookBook(int,string ); 2 3 总结 通过本次课程设计,我学到了不少东西,最重要的是:我真正的体会到c++在实际生活中的作用,也深刻体会到它带来的方便快捷。 在此次程序设计中,出现了各种各样的我问题,在完成各自模块建立起程序后运行时,出现了很多错误,经过我长时间的修改,还是不能解决问题,无奈之下去请教老师,老师给我提供了许多帮助,经过仔细的检查和调试我最终吧问题大致都解决了,顺利的完成了程序的运行。 通天这次课程设计,我才体会带自己学到的还远远不够,而且不扎实,所以以后我要更深入的虚心c++; 33 参考文献 [1] 钱能. C++程序设计教程[M]. 北京:清华大学出版社,2005:315-324,415-418,423. [2] 刘瑞新. Visual C++面向对象程序设计教程[M]. 北京:机械工业出版社,2005. 34 附录A 源代码 主函数: #include #include \"book.h\" //图书类 #include \"reader.h\" //读者类 #include \"BDatabase.h\" //图书类库 #include \"RDatabase.h\" void window_display(); //界面窗口 void window_choice(); //功能选择 void rent_book(string readercode); //借书模块 void back_book(string readercode); //还书模块 void Book_book(string readercode); //预定书籍模块 void hotbook(); //热书推荐 void Book_Retrieval(); //书籍检索 int System_exit(); //退出系统 int main(int argc, char *argv[]) //主函数 { window_display(); //界面 window_choice(); //功能选择 } void window_display() //界面窗口 { printf(\" ########################################\\n\\n\"); printf(\" 欢迎来到长沙学院图书馆\\n\\n\"); 35 printf(\" 请按键选择功能\\n\\n\"); printf(\" ########################################\\n\\n\"); printf(\" 1、登陆 2注销\\n\\n\"); printf(\" 3、借书 4、还书\\n\\n\"); printf(\" 5、图书预定 6、图书检索\\n\\n\"); printf(\" 7、退出系统\\n\\n\"); printf(\" ########################################\\n\\n\"); } void window_choice() //功能选择 { char choice; string secretCode; int bookcode; string readercode; RDatabase ReaderDB; Reader *r=NULL; BDatabase BookDB; Book *b=NULL; loop: cin>>choice; switch(choice) {case '1': //登陆模块 cout<<\"\\\请输入系统登陆模式\\n\\n\"; cout<<\"\1、图书管理系统 \2、读者借阅系统\\0、退出\\n\\n\"; cin>>choice; switch(choice) { case '0': window_display(); //自动返回主界面 goto loop; break; 36 case '1': //登陆图书管理系统 start: cout<<\"请输入密码:\"; cin>>secretCode; if(secretCode==\"1234\") { cout<<\"登陆成功!\\n\\n\"; wstart: cout<<\"\\\请选择功能代码\\n\\n\"; cout<<\"\1、图书维护\2、读者维护\\0、退出\\n\"; cin>>choice; switch(choice) { case '0': window_display(); //界面 goto loop; break; case '1': BookDB.bookdata(); //图书维护 goto wstart; break; case '2': ReaderDB.readerdata(); //读者维护 goto wstart; break; default: cout<<\"\\\输入有误,请重新输入!\\n\\n\"; goto wstart; } break; } 37 else { cout<<\"\\\密码错误,请重新输入!\\n\\n\"; goto start;} case '2': //登陆读者借阅系统 start2: cout<<\"请输入借书证号:\\n\"; cin>>readercode; ReaderDB.inr(); r=ReaderDB.query(readercode);//按编号查找读者 if(NULL==r) { cout<<\"不存在该读者,请重新输入!(重输请输1,退出请输0)\\n\"; cin>>choice; if(choice==1) goto start2; else window_display(); //自动返回主界面 goto loop; break; } r->set1regist(); //登陆 ReaderDB.outr(); cout<<\"登陆成功!\\n\\n\"; } window_display(); //自动返回主界面 goto loop; break; case '2': cout<<\"请输入借书证号:\\n\"; 38 cin>>readercode; r=ReaderDB.query(readercode); if(r!=NULL) {r->set0regist(); //注销模块 cout<<\"注销成功!\"< cout<<\"********************************************************************************\\n\\n\"; cout<<\"\\\\热书推荐 \\n\\n\"; hotbook(); cout<<\"********************************************************************************\\n\\n\"; cout<<\"\\\借书\\n\"; cout<<\"请输入借书证号:\"; cin>>readercode; r=ReaderDB.query(readercode); if(r!=NULL&&r->getregist()==1) rent_book(readercode); else cout<<\"请先登陆!\\n\\n\"; //登陆提示 window_display(); //自动返回主界面 goto loop; break; case '4': cout<<\"\\\还书\\n\"; cout<<\"请输入借书证号:\"; 39 cin>>readercode; r=ReaderDB.query(readercode); //还书模块 if(r!=NULL&&r->getregist()==1) back_book(readercode); else cout<<\"请先登陆!\\n\\n\"; //登陆提示 window_display(); //自动返回主界面 goto loop; break; case '5': cout<<\"********************************************************************************\\n\\n\"; cout<<\"\\\\热书推荐 \\n\\n\"; hotbook(); cout<<\"********************************************************************************\\n\\n\"; cout<<\"\\\预定书籍\\n\"; cout<<\"请输入借书证号:\\n\"; cin>>readercode; r=ReaderDB.query(readercode); //预定书籍模块 if(r!=NULL&&r->getregist()==1) Book_book(readercode); else cout<<\"请先登陆!\\n\"; //登陆提示 window_display(); //自动返回主界面 goto loop; break; case '6': //图书检索模块 Book_Retrieval(); 40 window_display(); //自动返回主界面 goto loop; break; case '7': //退出系统 System_exit(); } } void rent_book(string readercode) //借书函数 { int i; string id; int bookcode; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b; id3: cout<<\"身份:\"; cin>>id; if(id==\"student\"||id==\"teacher\"); else { cout<<\"输入有误,请重新输入!\\n\\n\"; goto id3;} bc: cout<<\"图书编号: \"; cin>>bookcode; r=ReaderDB.query(readercode);//按编号查找读者 b=BookDB.query(bookcode); //按编号查找书籍 if(b==NULL) cout<<\"\不存在该图书,不能借书! \\n\\n\"; if(b->borrowbook()==0) 41 cout<<\"\该图书已借出,不能借书 \\n\\n\"< void back_book(string readercode) //还书函数 { int bookcode; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b; int i; b: cout<<\"图书编号:\"; cin>>bookcode; cout<<\"还书成功!\\n\\n\"; r=ReaderDB.query(readercode);//按编号查找读者 b=BookDB.query(bookcode); //按编号查找书籍 if (b==NULL) { cout<<\"\不存在该图书,不能还书(重输请输1,退出请输0)\\n\"< b->retbook(); r->retbook(b->getcode()); 42 r->show(); r=ReaderDB.FindBybookBookcode(bookcode); //通知预订的的前三位同学 if(r!=NULL) { cout<<\"********************************************************************************\\n\"; cout<<\"\\\\通知\\n\\n\"; int max[4]={0,0,0,0}; int j=0,i=1; while(j<3) { while(r!=NULL) {if(r->getbookBookdate(bookcode)>max[i]&&r->getbookBookdate(bookcode)!=max[i-1]) max[i]=r->getbookBookdate(bookcode); r++; } cout< cout<<\"\述三位同学可去借书籍<<\"< cout<<\"\\n继续请输1,退出请输0\\n\"; cin>>i; if(i==1) goto b; else return; } void Book_book(string readercode) //预定书籍函数 43 { string id; int bookcode; int i; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b; cout<<\"身份:\"; cin>>id; bcd: cout<<\"图书编号:\"; cin>>bookcode; r=ReaderDB.query(readercode);//按编号查找读者 b=BookDB.query(bookcode); //按编号查找书籍 if(b==NULL) { cout<<\" 不存在该图书,不能预定书籍(重输请输1,退出请输0)\"; cin>>i; if(i==1) goto bcd; else return; } if(b->borrowbook()==0) r->bookBook(b->getcode(),id); else cout<<\"此书未被借,不必预定!\\n\\n\"; r->show(); BookDB.outb(); ReaderDB.outr(); int j=1; r=ReaderDB.FindBybookBookcode(bookcode); //查找热书 while(r!=NULL) 44 { j++; r++; } if(j>=5) {BookDB.hotnum++; BookDB.hotbook[BookDB.hotnum]=bookcode; } cout<<\"\\n继续请输1,退出请输0\\n\"; cin>>i; if(i==1) goto bcd; else return; } void hotbook() //热书推荐 { BDatabase BookDB; for(int i=0;i<=BookDB.hotnum;i++) cout< char choice; string s; int c; BDatabase BookDB; start: cout<<\"\\\图书检索\\n\\n\"; printf(\" 1,按书名检索图书 2,按书号检索图书\\n\\n\"); printf(\" 3,按出版社检索图书 4,按馆藏编号检索图书 0, cin>>choice; switch(choice) { case '0': return; break; 45 退出\\n\\n\"); case '1': cout<<\"请输入书名:\"; cin>>s; BookDB.FindByname(s); goto start; break; case '2': cout<<\"请输入书号:\"; cin>>s; BookDB.FindBynum(s); goto start; break; case '3': cout<<\"请输入出版社名:\"; cin>>s; BookDB.FindBypress(s); goto start; break; case '4': cout<<\"请输入馆藏编号:\"; cin>>c; BookDB.FindBycode(c); goto start; break; default: cout<<\"输入有误,请重新输入!\\n\\n\"; } } int System_exit() //退出系统 { system(\"PAUSE\"); return EXIT_SUCCESS; } 文件book.h: //文件book.h 46 //定义类Book #include private: string bookName; //书名 string author; //作者 string bookNum; //书号 string press; //出版社 string edition; //版次 string publishTime; //出版时间 int code; //馆藏编号 int tag; //删除标记 1:已删 0:未删 int onshelf; //是否再架 1:再架 2:已借 public: void in(ifstream &file); void out(ofstream &file); string getbookName(); //获取书名 string getbookNum(); //获取书号 string getpress(); //获取出版社名 int getcode(); //获取馆藏编号 int gettag(); //获取删除标记 void show(); //输出书籍信息 void addbook(string n,string a,string b,string p,string e,string pt,int c); //加书籍 void delbook(); //删除书籍 int borrowbook(); //借书 void retbook(); //还书 }; 47 增#endif 文件book.cpp: //文件book.cpp //实现类Book #include void Book::in(ifstream &file) { file>>bookName; //书名 file>>author; //作者 file>>bookNum; //书号 file>>press; //出版社 file>>edition; //版次 file>>publishTime; //出版时间 file>>code; //馆藏编号 file>>tag; //删除标记 1:已删 0:未删 file>>onshelf; //是否再架 1:再架 2:已借 } void Book::out(ofstream &file) //析构函数,将book[]写到bookfile.txt文件中 { file< file< string Book::getbookNum() //获取书号 { return bookNum;} string Book::getpress() //获取出版社名 { return press;} int Book::getcode() //获取馆藏编号 {return code;} int Book::gettag() //获取删除标记 { return tag;} void Book::show() //输出书籍信息 { cout<<\"\\书籍名称: \"< 49 code=c; onshelf=1; } void Book::delbook() { tag=1;}//删除图书 int Book::borrowbook()//借书操作 { if (onshelf==1) //再架 { onshelf=2; //已借 return 1; } return 0; } void Book::retbook()//还书操作 { onshelf=1; } //再架 文件BDatabase.h: //文件BDatabase.h //定义类BDatabase #if!defined _BDATABASE_H_ #define _BDATABASE_H_ #include \"reader.h\" #include \"book.h\" const int maxBook=1000; //最大书籍容量class BDatabase { private: int top; //图录指针 Book book[maxBook]; //图录 public: 50 int hotnum;// int hotbook[500]; BDatabase(); ~BDatabase(); void inb();//构造函数,将book.txt读到book[]中 void outb(); //析构函数,将book[]写到book.txt文件中 void addbook(string n,string a,string b,string p,string e,string pt,int c);//增加图书 void clear();//全删 Book *query(int c); //查找图书 void FindByname(string c); //书名检索 void FindBynum(string c); //书号检索 void FindBypress(string c); //出版社检索 void FindBycode(int c); //书籍编号检索 void bookdata();//图书库维护 void show(); //显示书籍信息 }; #endif 文件BDatabase.cpp: //文件BDatabase.cpp //实现类BDatabase #include BDatabase::BDatabase()//构造函数,将bookfile.txt读到book[]中 { hotnum=-1; top=-1; 51 ifstream file(\"bookfile.txt\ if(!file) return; while(!file.eof()) { top++; book[top].in(file); } file.close(); } void BDatabase::inb()//构造函数,将bookfile.txt读到book[]中 { top=-1; ifstream file(\"bookfile.txt\ if(file) while(!file.eof()) { top++; book[top].in(file); } file.close(); } BDatabase::~BDatabase() { ofstream file(\"bookfile.txt\ for(int i=0;i<=top;i++) book[i].out(file); file.close(); } void BDatabase::outb() { ofstream file(\"bookfile.txt\ for(int i=0;i<=top;i++) book[i].out(file); file.close(); } 52 void BDatabase::clear()//全删 { inb(); top=-1; outb(); } void BDatabase::addbook(string n,string a,string b,string pr,string e,string pt,int c)//增加图书 { inb(); Book *p=query(c); //查找 if (NULL==p) //无相同编号时 { top++; book[top].addbook(n,a,b,pr,e,pt,c); //增加图书 } outb(); } Book *BDatabase::query(int c)//查找图书 { inb(); for (int i=0;i<=top;i++) if (book[i].getcode()==c&&book[i].gettag()==0) //存在此书且未借 { return &book[i]; } return NULL; } void BDatabase::FindByname(string c)//书名检索 { inb(); int j=0; for(int i=0;i<=top;i++) if(book[i].getbookName()==c) {book[i].show();//输出相应信息 j++;} if(j==0) 53 cout<<\"本图书馆无此书!\\n\\n\"; } void BDatabase::FindBynum(string c)//书号检索 { inb(); int j=0; for(int i=0;i<=top;i++) if(book[i].getbookNum()==c) {book[i].show();//输出相应信息 j++;} if(j==0) cout<<\"本图书馆无此书!\\n\\n\"; } void BDatabase::FindBypress(string c)//出版社检索 { inb(); int j=0; for(int i=0;i<=top;i++) if(book[i].getpress()==c) {book[i].show();//输出相应信息 j++;} if(j==0) cout<<\"本图书馆无此书!\\n\\n\"; } void BDatabase::FindBycode(int c)//书籍编号检索 { inb(); int j=0; for(int i=0;i<=top;i++) if(book[i].getcode()==c) {book[i].show();//输出相应信息 j++;} if(j==0) cout<<\"本图书馆无此书!\\n\\n\"; } void BDatabase::bookdata()//图书库维护 { char choice; string n; string a; string bu; string pr; string e; string pt; int c; Book *b; start: cout<<\"\\n\\n\\\图 书 维 护\\n\\n\1,新 增\2,更 改\3,删 除\4,查 找\5,显 示\6,全 删\0,退 出\\n\\n\"; cin>>choice; switch (choice) { case '0': return; break; case '1': cout<<\"请输入书名: \"; cin>>n; cout<<\"请输入作者: \"; cin>>a; cout<<\"请输入书号: \"; cin>>bu; cout<<\"请输入出版社: \"; cin>>pr; cout<<\"请输入版次: \"; cin>>e; cout<<\"请输入出版时间(如1999,08,06): \"; cin>>pt; cout<<\"请输入馆藏编号: \"; cin>>c; addbook(n,a,bu,pr,e,pt,c); //增加书籍 cout<<\"增加书籍成功!\"< goto start; break; case '2': cout<<\"请输入图书馆藏编号:\"< b=query(c); //查找 if (b==NULL) cout<<\"该图书不存在!\"< cout<<\"请输入作者: \"; cin>>a; cout<<\"请输入书号: \"; cin>>bu; cout<<\"请输入出版社: \"; cin>>pr; cout<<\"请输入版次: \"; cin>>e; cout<<\"请输入出版时间(如1999,08,06): \"; cin>>pt; b->addbook(n,a,bu,pr,e,pt,c); //更改 cout<<\"更改书籍信息成功!\"< cout<<\"请输入图书馆藏编号:\"; cin>>c; b=query(c); if (b==NULL) cout<<\" 该图书不存在\"; else { b->delbook(); //删除书籍 56 cout<<\"删除书籍成功!\\n\"; } goto start; break; case '4': cout<<\"请输入图书馆藏编号:\"; cin>>c; b=query(c); if (b==NULL) cout <<\" 该图书不存在\"<< endl; else { cout<<\"书籍信息:\\n\\n\"; b->show(); //显示书籍信息 } goto start; break; case '5': cout<<\"所有书籍信息:\\n\\n\"; show(); //显示所有未借图书信息 goto start; break; case '6': clear(); //清除书库 cout<<\"清除书库成功!\"< void BDatabase::show() //显示所有图书信息 { 57 for (int i=0;i<=top;i++) book[i].show(); } 文件reader.h: //文件reader.h //定义类reader #if!defined _READER_H_ #define _READER_H_ #include private: int regist; //登陆标记 1:已登录 0:未登陆 int tag; //删除标记 1:已删 0:未删 string readerName; //读者姓名 string rentBookcode; //借书证号 string identity; //身份 string department; //所在系部 int rentedBooknum; //已借书籍数量 int rentedBookcode[6]; //已借书籍编号 int rentbookdata[6]; //借书日期 int backbookdata[6]; //还书日期 string overtdueBook; //超期书籍 int bookBooknum; //预定书籍数量 int bookBookdata[3]; //预定书籍日期 int bookBookcode[3]; //预定书籍编号 public: void in(ifstream &file);//读出文件信息 void out(ofstream &file);//写入文件 void set1regist(); //已登录 void set0regist(); //未登陆 void show(); //输出读者信息 58 string getreaderName(); //获取姓名 int gettag(); //获取删除标记 string getrentBookcode(); //获取借书证号 int getbookBookcode(int s); //获取预定书籍 int getregist(); //获取登陆标记 int getbookBookdate(int); //获取预定书籍日期 void delreader(); //删除读者 void addStudent(string n,string num,string id,string d); //增加学生读者 void changeStudent(string,string,string); //更学生信息 void addTeacher(string n,string num,string id); //增加老师读者 void changeTeacher(string,string);//更改老师信息 void borrowbook(int bcode,string id); //借书 void retbook(int bcode); //还书 void bookBook(int bcode,string id); //预订书籍 }; #endif 文件reader.cpp //文件reader.cpp //实现类reader #include void Reader::in(ifstream &file) { int n,m; file>>regist; //登陆标记 1:已登录 0:未登陆 file>>tag; //删除标记 1:已删 0:未删 file>>readerName; //读者姓名 file>>rentBookcode; //借书证号 file>>identity; //身份 file>>department; //所在系部 file>>rentedBooknum; //已借书籍数量 59 if(identity==\"student\") { n=5; m=2;} else if(identity==\"teacher\") { n=6; m=3;} while(rentedBooknum>0&&rentedBooknum file>>overtdueBook; //超期书籍 file>>bookBooknum; //预定书籍数量 while(bookBooknum>0&&bookBooknum void Reader::out(ofstream &file) { int n,m; file< else if(identity==\"teacher\") { n=6; m=3; } while(rentedBooknum>0&&rentedBooknum void Reader::set0regist() //未登陆 { regist=0; } void Reader::show()//输出读者信息 { cout<<\"\\姓名:\"< cout<<\"\\借书日期:\"< cout<<\"\\超期书籍:\"<<(overtdueBook==\"\\0\"?\"无\":overtdueBook)< int Reader::gettag() {return tag;} //获取删除标记 string Reader::getrentBookcode() {return rentBookcode;} //获取读者借书证号 int Reader::getregist() //获取登陆记录 { return regist; } int Reader::getbookBookdate(int s) //获取预定书籍日期 { for(int i=0;i 62 { tag=1; }//设置删除标记 1:已删 0:未删 void Reader::addStudent(string n,string code,string id,string d)//增加读者 { tag=0; regist=0; rentedBooknum=0; bookBooknum=0; overtdueBook=\"\\0\"; readerName=n; rentBookcode=code; identity=id; department=d; } void Reader::changeStudent(string n,string id,string d)//更改学生信息 { tag=0; regist=0; rentedBooknum=0; bookBooknum=0; readerName=n; identity=id; department=d; } void Reader::addTeacher(string n,string code,string id)//增加读者 { regist=0; tag=0; rentedBooknum=0; bookBooknum=0; readerName=n; rentBookcode=code; identity=id; 63 } void Reader::changeTeacher(string n,string id)//更改老师信息 { regist=0; tag=0; rentedBooknum=0; bookBooknum=0; readerName=n; identity=id; } void Reader::borrowbook(int bcode,string id)//借书操作 { int n; if(id==\"teacher\") n=6; else if(id==\"student\") n=5; if(rentedBooknum cout<<\"请输入借书日期(如19990806):\"; cin>>rentbookdata[rentedBooknum]; rentedBooknum++; cout<<\"借书成功!\"< cout<<\"请先归还超期书籍:\"< for(int i=0;i { cout<<\"请输入归还日期(如19990806):\"; cin>>backbookdata[i]; for(int j=i;j if(id==\"teacher\") n=3; else if(id==\"student\") n=2; if(rentedBooknum cout<<\"\\\预定书籍成功!\\n\\n\"< 文件RDatabase.h //文件RDatabase.h //定义类RDatabase #include 65 #include \"reader.h\" const int maxReader=500; class RDatabase { private: int top; //读者记录指针 Reader read[maxReader];//读者记录 public: RDatabase(); //构造函数,将readerfile.txt读到read[]中 ~RDatabase();//构造函数,将readerfile.txt读到read[]中 void inr(); void outr();//析构函数,将read[]写到readerfile.txt文件中 void clear();//删除所有读者信息 void addStudent(string,string,string,string); //增加学生读者 void changeStudent(string,string,string,string);//更改学生读者 void addTeacher(string,string,string); //增加老师读者 void changeTeacher(string,string,string); Reader *query(string);//按编号查找 Reader *FindBybookBookcode(int c); //按预定书籍查找 void show(); //输出所有读者信息 void readerdata(); //读者库维护 }; 文件RDatabase.cpp: //文件RDatabase.cpp //实现类RDatabase #include 66 #include \"reader.h\" RDatabase::RDatabase() //构造函数,将readerfile.txt读到read[]中 { top=-1; ifstream file(\"readerfile.txt\打开一个输入文件 if(file) while(!file.eof()) { top++; read[top].in(file); } file.close(); } RDatabase::~RDatabase() //构造函数,将readerfile.txt读到read[]中 { ofstream file(\"readerfile.txt\打开一个输入文件 if(file) {for(int i=0;i<=top;i++) read[i].out(file); file.close(); } } void RDatabase::inr() { top=-1; ifstream file(\"readerfile.txt\打开一个输入文件 if(file) while(!file.eof()) { top++; read[top].in(file); } file.close(); } void RDatabase::outr()//析构函数,将read[]写到readerfile.txt文件中 { ofstream file(\"readerfile.txt\打开一个输入文件 if(file) 67 { for(int i=0;i<=top;i++) read[i].out(file); file.close(); } } void RDatabase::clear()//删除所有读者信息 { top=-1; } void RDatabase::addStudent(string n,string c,string id,string d) //增加学生读者 { Reader *p=query(c); if (p==NULL) { top++; read[top].addStudent(n,c,id,d); } outr(); } void RDatabase::changeStudent(string n,string c,string id,string d)//更改学生读者 { Reader *p=query(c); if (p==NULL) p->changeStudent(n,id,d); } void RDatabase::addTeacher(string n,string c,string id) //增加老师读者 { Reader *p=query(c); if (p==NULL) { top++; read[top].addTeacher(n,c,id); 68 } } void RDatabase::changeTeacher(string n,string c,string id) { Reader *p=query(c); if (p==NULL) p->changeTeacher(n,id); } Reader *RDatabase::query(string c)//按编号查找 { for (int i=0;i<=top;i++) if (read[i].getrentBookcode()==c&&read[i].gettag()==0) return &read[i]; return NULL; } Reader *RDatabase::FindBybookBookcode(int c) //按预定书籍查找 { int j=0; for (int i=0;i<=top;i++) if (read[i].getbookBookcode(c)==c&&read[i].gettag()==0) j++; Reader r[j],*p; for (int i=0;i<=top;i++) if (read[i].getbookBookcode(c)==c&&read[i].gettag()==0) { j=0; r[j]=read[i]; j++; } p=r; if(j==0) return NULL; else return p; 69 } void RDatabase::show() //输出所有读者信息 { for(int i=0;i<=top;i++) read[i].show(); } void RDatabase::readerdata() //读者库维护 { char ch; string rname; string id; string dep; string readercode; Reader *r; whstart: cout<<\"\\n\\n\\\读 者 维 护\\n\\n\1,新 增\2,更 改\3,删 除\4,查 找\5,显 示\6,全 删\0,退 出\\n\\n\"; cin>>ch; switch (ch) { case '0': break; case '1': cout<<\"请输入读者姓名:\"; cin>>rname; cout<<\"请输入借书证号:\"; cin>>readercode; id: cout<<\"请输入身份(student or teacher):\"< cout<<\"所在系部:\"; 70 cin>>dep; addStudent(rname,readercode,id,dep); //增加学生读者 } else if(id==\"teacher\") addTeacher(rname,readercode,id); //增加老师读者 else { cout<<\"身份输入有误,请重新输入!\\n\"; goto id; } cout<<\"添加读者成功!\"< cout<<\"输入借书证号:\"; cin>>readercode; r=query(readercode); if (r==NULL) { cout<<\"该读者不存在 \"< cout<<\"请输入身份(student or teacher):\"; cin>>id; if(id==\"student\") { cout<<\"所在系部:\"; cin>>dep; changeStudent(rname,readercode,id,dep); //更改学生读者 71 } else if(id==\"teacher\") changeTeacher(rname,readercode,id); //更改老师读者 else { cout<<\"身份输入有误,请重新输入!\"; goto id2; } cout<<\"更改读者信息成功!\"< cout<<\"该读者不存在\"< cout<<\"该读者不存在\"< cout<<\"读者个人信息:\"< cout<<\"所有读者信息:\"< cout<<\"清除读者库成功!\"; goto whstart; break; default: cout<<\"输入错误,请从新输入:\"; } } 73 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务