C++语言程序设计课程设计报告图书借阅管理系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本科生课程设计
课程名称: C++语言程序设计
课程编号:
设计题目:图书借阅管理系统
姓名:
班级:
学号:
院系:信息学院网络技术系
实验地点:
指导教师:
成绩:
教师签字:
目录
一.系统设计总说明
1.1设计目的 (3)
1.2设计要求 (3)
1.3设计内容 (4)
1.4系统功能简介 (4)
1.5设计平台 (4)
二.C++语言课程设计报告
2.1需求分析
2.1.1管理员功能 (5)
2.1.2读者功能 (5)
2.2概要设计
2.2.1整体设计 (6)
2.2.2系统层次结构图 (7)
2.2.3流程图(部分示例) (7)
2.3详细设计
2.3.1书籍结构体(Book) (8)
2.3.2书籍管理结构体(BookManage) (8)
2.3.3读者结构体(Reader) (8)
2.3.4读者管理结构体(ReaderManage) (9)
2.3.5菜单结构体(Menu) (9)
2.3.6主函数(main) (9)
2.4编码调试
2.4.1各界面菜单显示 (10)
2.4.2登录验证 (13)
2.4.3注册新读者用户 (13)
2.4.4添加新的图书资料 (13)
2.4.5修改已有图书资料 (13)
2.4.6删除已有图书资料 (14)
2.4.7查找已有图书资料 (14)
2.4.8显示全部图书资料 (14)
2.5参考文献 (14)
2.6设计总结 (14)
2.7附录:C++图书管理系统源代码 (15)
系统设计总说明
1.1设计目的
《C/C++语言课程设计》是信息管理与信息系统专业的重要实践性课程。

课程设计为学生提供了一个手脑并用、独立实践的机会。

目的在于培养学生分析问题和解决问题的能力,将课本的理论知识与实际应用问题进行有机结合,提高学生程序设计、程序调试及项目开发能力。

通过本课程设计的实践,全面总结C++课程学习中的数据类型、程序结构、数组、函数、指针、结构体等基本概念,掌握其使用方法。

培养使用面向过程的程序设计方法编写计算机程序的能力。

课题的目的主要是考查学生对C/C++语言的综合编程能力的掌握,培养学生的分析问题和解决问题的能力及逻辑思维能力。

该课题主要考察学生对函数、结构体,指针,文件等的操作,以及C/C++语言基本规则和算法的掌握,所以完成本颗题目要求学生较强的设计能力,特别是要具有综合应用能力。

如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。

1.2设计要求
①问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做
什么(而不是怎么做),限制条件是什么。

②概要设计:对问题描述中涉及的操作对象定义相应结构体,并按照以设计需要为中心的原
则,确定各个结构体之间的关系。

逻辑设计的结果应写出每个结构体抽象数据结构体型的定义(包括数据
结构的描述和每个基本操作的功能说明)、各个主要模块的算法,并画出模块之间的调用关系图。

③详细设计:定义相应的储存结构并写出各函数的伪码算法。

在这个过程中,要综合考虑系
统功能,使得系统结构清晰、合理、简单和易于调试,数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能做到明确具体。

详细设计的结果写出数据成员储存结构的码类型定义,写出函数形式的算法框架。

④程序编码:把详细设计的结果进一步求精为程序设计语言程序,同时加入一些注解,
使程序中逻辑概念清楚。

⑤程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。

能够熟练掌握调试工
具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。

调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果。

⑥结果分析:程序运行结果包括正确的输入及输出结果和含有错误的输入及其输出结果。

1.3设计内容
设计一个小型图书借阅管理系统。

1.4系统功能简介
①管理员功能
A.添加新的图书资料
B.修改已有图书资料
C.删除已有图书资料
D.查找已有图书资料
E.查看所有图书资料
F.修改读者用户信息
G.删除读者用户信息
H.查看所有读者信息
②读者功能
A.借阅新的图书
B.归还已借图书
C.查找所需图书
D.查看借阅情况
1.5设计平台
本系统是在windows环境下开发的,使用软件为Microsoft公司的Visual C++ 6.0,并采用了面向过程的技术。

C++语言课程设计报告
信息管理与信息系统专业 200811622233 张媛媛
指导教师:
2.1需求分析
2.1.1管理员功能:
①登录:输入管理员密码,若密码错误则不得执行管理员操作。

②添加新书:增加新的图书资料,同时需检查新书的图书编号是否已存在于
原图书资料中,若已存在则应取消添加或提示重新输入。

③修改图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,
允许修改,否则提示无该图书信息。

④删除图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,
允许删除,否则提示无该图书信息。

删除对象包括该图书资料
以及“图书状态”和“借阅人”中与此书相关的所有记录。

⑤查找图书:
A.按书号查找:通过编号查询该图书资料,若该编号存在,则显示图书信
息,否则提示无该图书信息。

B.按书名查找:通过书名查询该图书资料,若该编号存在,则显示图书信
息,否则提示无该图书信息。

C.按作者查找:通过作者查询该图书资料,若该编号存在,则显示图书信
息,否则提示无该图书信息。

⑥查看全部图书:显示所有图书资料,包括书号、书名、作者、状态和借阅
人等信息。

⑦修改读者:通过姓名查询该读者信息,若该姓名存在,则显示已有信息,
允许修改,否则提示无该读者信息。

⑧删除读者:通过姓名查询该读者信息,若该姓名存在,则显示已有信息,
允许删除,否则提示无该读者信息。

删除对象包括该读者姓名、
班级、电话以及“图书状态”和“借阅人”中与此人相关的所
有记录。

⑨查看所有读者:显示所有读者资料,包括姓名、班级、电话等信息。

2.1.2读者功能:
①登录:输入读者姓名,若未经注册则不得进入读者服务界面。

②注册:新用户经注册方可登录系统并使用读者服务功能。

③借书:
A.输入所需图书编号,判断该编号是否存在,若不存在则提示重新输入。

B.若所输入图书编号存在,则判断该书籍是否已被借出,若已借则不允
许执行借书操作。

C.若所输入图书未借,则提示输入读者姓名,判断所输入读者姓名是否
存在,若不存在则提示重新输入。

D.若读者姓名存在,则允许执行借书操作。

E.借书处理包括在“图书状态”中加上“已借”标记。

④还书:
A.输入所借书编号,判断该编号是否存在,若不存在则提示重新输入。

B.判断该书是否已借出,若未借则不允许执行还书操作。

C.借书处理包括在“图书状态”中加上“未借”标记。

⑤查询图书:
A.按书号查找:通过编号查询该图书资料,若该编号存在,则显示图书信
息,否则提示无该图书信息。

B.按书名查找:通过书名查询该图书资料,若该编号存在,则显示图书信
息,否则提示无该图书信息。

C.按作者查找:通过作者查询该图书资料,若该编号存在,则显示图书信
息,否则提示无该图书信息。

⑥查看借阅情况:输入读者姓名,若该姓名不存在则提示重新输入,若该姓
名存在则显示该读者借阅信息。

2.2概要设计
2.2.1整体设计
经过需求分析,本系统共设计了五个大模块,分别是书籍数据维护模块、书籍管理模块、读者数据维护模块、读者管理模块和菜单模块。

接着相应定义了五个结构体,分别是书籍结构体(Book)、书籍管理结构体(BookManage)、读者结构体(Reader)、读者管理结构体(ReaderManage)和菜单结构体(Menu)。

书籍结构体(Book)的功能在于存放和维护书籍的基本信息,包括书号、书名、作者、状态(已借/在架)和借阅人;书籍管理结构体(BookManage)的功能在于实现对书籍的相关操作,包括读取书籍文档文件(book.txt)、保存书籍文档文件、添加图书、修改图书、
删除图书、显示全部图书和查找图书;读者结构体(Reader)的功能在于存放和维护读者的基本信息,包括姓名、班级和电话;读者管理结构体(ReaderManage)的功能在于实现对读者的相关操作,包括读取读者文档文件(reader.txt)、保存读者文档文件、新读者注册、修改读者、删除读者、显示全部读者和查找读者;菜单结构体(Menu)的功能在于实现各界面的引导工作,包括主登录界面、系统管理界面、读者登录界面、读者服务界面、管理员书籍查找界面和读者书籍查找界面。

2.2.2系统层次结构图
2.2.3流程图(部分示例)
①管理员登录
②读者登录
③读者借阅图书
④管理员或读者按书名查找图书
2.3详细设计
2.3.1书籍结构体(Book)
①私有数据
char bnum[10]; //书号
char bname[20]; //书名
char bauthor[10]; //作者
char rname[10]; //借阅人
②公有数据及公有函数
int tag; //状态标记判断指标(已借/在架)
Book() //构造函数初始化信息
void set_bnum(char *no) //设置书号
char *get_bnum() //获得书号
void set_bname(char *n) //设置书名
char *get_bname() //获得书名
void set_bauthor(char *a) //设置作者
char * get_bauthor() //获得作者姓名
void set_tag(int t) //状态设置
void set_rname(char *rn) //设置借阅人
char *get_rname() //获得借阅人姓名
void show_tag() //显示图书状态
void copy(Book m) //Book结构体copy函数
2.3.2书籍管理结构体(BookManage)
①私有数据及函数
Book books[100]; //定义Book书籍结构体数组对象,最大容量100本int length; //计数
void saveFile() //保存书籍文件
void readFile() //读取书籍文件
②公有数据及函数
BookManage() //构造函数,读取磁盘文件
~BookManage() //析构函数,保存磁盘文件
bool add(Book book) //添加图书资料
int bnu_search(char *bnu) //按书号查找书籍
int bna_search(char *bna) //按书名查找书籍
int bau_search(char *bau) //按作者查找书籍
int rn_search(char *rn) //按借阅人查找书籍
void revise(Book book,int i)//带参的修改书籍函数
void deleteBook(int index)//带参的删除书籍资料函数
void show_book()//不带参的显示书籍函数
void show_book(int i)//带参的显示书籍函数
void br_book()//读者借、还书功能函数
bool in(int i) //判断图书是否在架函数
2.3.3读者结构体(Reader)
①私有数据及函数
char rname[10]; //读者姓名
char rclass[10]; //班级
char rtel[10]; //电话
②公有数据及函数
Reader() //构造函数,实现数据初始化
void set_rname(char *rn) //设置读者姓名
char * get_rname() //获得读者姓名
void set_rclass(char *rc) //设置班级
char *get_rclass() //获得班级
void set_rtel(char *rt) //设置电话
char *get_rtel() //获得电话
void copy(Reader m) //读者Reader结构体copy函数
2.3.4读者管理结构体(ReaderManage)
①私有数据及函数
Reader readers[50]; //定义读者结构体数组对象,最多50位int length; //计数
void readFile() //读取读者文件函数
void saveFile() //保存读者文件
②公有数据及函数
ReaderManage() //构造函数,读取读者文件
~ReaderManage() //析构函数,保存读者文件
void add_reader(Reader r) //添加读者用户函数
int search(char *rn) //按姓名查找读者函数
bool revise(Reader reader,int i) //修改读者资料函数
void delete_reader(int index) //删除读者函数
bool log_reader(Reader r) //登录时判断读者用户是否存在函数void reg_reader() //注册用户函数
void show_reader() //不带参的显示读者信息函数
void show_reader(int i) //带参的显示读者信息函数
2.3.5菜单结构体(Menu)
①私有数据及函数
BookManage bm; //定义书籍管理结构体对象bm
ReaderManage rm; //定义读者管理结构体对象rm
Reader r; //定义读者结构体对象r
int choice; //菜单序号选择
int key; //管理员密码
②公有数据及函数
void header() //页眉
void log_menu() //主界面登录菜单
void admin_menu() //管理员管理菜单
void reader_menu() //读者服务菜单
void bsearch_menu() //读者查找书籍菜单
void absearch_menu() //管理员查找书籍菜单
void reader_lr() //读者登录或注册菜单
void log_admin() //管理员登录
void rn_search() //按书号查找函数
void bnu_search() //按书号查找函数
void bna_search() //按书名查找函数
void bau_search() //按作者查找函数
void addBook() //新增书籍函数
void reviseBook() //修改书籍函数
void delBook() //删除书籍函数
void reviseReader()//修改读者用户函数
void delReader() //删除读者用户函数
2.3.6主函数(main)
int main()
2.4编码调试、测试
2.4.1各界面菜单显示
①主登录界面
②系统管理界面
③读者登录界面
④读者服务界面
⑤书籍查找界面
2.4.2登录验证
①管理员登录
A.输入错误密码
B.输入正确密码
②读者登录
A.输入已注册姓名
B.输入未注册姓名
2.4.3注册新读者用户
2.4.4添加新的图书资料
①输入已存在图书书号②输入未存在图书书号
2.4.5修改已有图书资料
①输入不存在图书书号②输入已存在图书书号
2.4.6删除已有图书资料
①输入不存在图书书号②输入已存在图书书号
2.4.7查找已有图书资料(以按书号查找为例)
①输入不存在图书书号
②输入已存在图书书号
2.4.8显示所有图书资料
2.5参考文献
1.MS-DOS命令大全[帮助文件]/落雪飞花;网络资料
2.C++函数库参考[帮助文件];刘双印老师提供
3.C++基础教程--从问题分析到程序设计[专著]/(美)D. S. Malik著;清华大学出版社
2.6设计总结
经过近一个星期的努力,前后修修改改,调试又调试,我的C++图书管理系统终于得以诞生!在这个过程中,我发现自己还有很多很多知识都没有学好,看别人的例子的时候好像很简单,自己一上机操作就有问题。

调试的时候系统总是报错,还有很多警告,每添加一个函数,往往都要要调试很久,有时候仅仅只是少了一个大括号,却花上近半个小时才找到问题的瓶颈所在。

系统虽然完成了,也可以运行,一些基本的功能也能够实现,但我知道,还有很多的不足。

另外,我发现帮助文件真的很有用,每当我看别人例子看不懂的时候,都是去帮助文件搜索,如果里面的信息不够完整,再利用各大网站的搜索引擎来寻找答案,比如更改背景颜色的问题,之前试了很多次都不行,后来偶然发现一个MS-DOS命令大全,然后再去网上搜索color命令的使用语法,原来以为很复杂的代码,只需一句system(color fd),问题就迎刃而解了。

以后还会有很多课程设计,一定要吸取这次的教训,知识不是看过就可以了,而是要把知识学透、学精,才能够真正做到为我所用。

2.6附录:C++图书管理系统源代码
//姓名:张媛媛
//班级:信管1082
//学号:200811622233
//*********************************************************
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
#include <conio.h>
#define BookFile "book.txt" //将字符串BookFile替换原文件中的宏名称book
#define ReaderFile "reader.txt"
using namespace std;
//**********读者结构体,用于存放读者基本信息**********
class Reader
{
private:
char rname[10];
char rclass[10];
char rtel[10];
public:
Reader() //构造函数,实现数据初始化
{strcpy(rname,"");strcpy(rclass,"");strcpy(rtel,"");}
void set_rname(char *rn) //设置读者姓名
{strcpy(rname,rn);} //将rn的字符复制给rname
char * get_rname() //获得读者姓名
{return rname;} //返回rname的值
void set_rclass(char *rc) //设置班级
{strcpy(rclass,rc);}
char *get_rclass() //获得班级
{return rclass;}
void set_rtel(char *rt) //设置电话
{strcpy(rtel,rt);}
char *get_rtel() //获得电话
{return rtel;}
void copy(Reader m) //读者Reader结构体copy函数
{strcpy(rname,m.get_rname());strcpy(rclass,m.get_rclass());strcpy(rtel,m.get_rtel());} };
//*********读者管理结构体,实现对读者用户的管理*********
class ReaderManage
{
Reader readers[50]; //定义读者结构体数组对象,最多50位
int length;
void readFile() //读取读者文件函数
{
ifstream fread; //定义输入文件流对象fread
length=0; //计数
if(!fread)
{cout<<"读取磁盘文件失败!"<<endl;exit(1);}
fread.open(ReaderFile,ios::binary);//使文件流与文件关联,以二进制方式打开int i=0;
while((fread.read((char *)&readers[i],sizeof(Reader))))//计算并返回所占字节数i++;
length=i;
fread.close();//关闭磁盘文件
}
void saveFile() //保存读者文件
{
ofstream fwrite; //定义输出文件流对象fwrite
if(!fwrite)
{cout<<"文件保存失败!\n"; exit(1); }
fwrite.open(ReaderFile,ios::binary);//使文件流与文件关联,以二进制方式打开
fwrite.write((char *)readers,length*sizeof(Reader));//计算并返回所占字节数
fwrite.close(); //关闭磁盘文件
}
public:
ReaderManage() //构造函数,读取读者文件
{readFile();}
~ReaderManage() //析构函数,保存读者文件
{saveFile();}
void add_reader(Reader r) //添加读者用户函数
{
if(length>=50)
{cout<<"对不起,注册人数已满!\n";return ;}
readers[length].copy(r); //调用读者结构体copy函数
length++;
}
int search(char *rn) //按姓名查找读者函数
{
for(int i=0;i<length;i++)
if(strcmp(readers[i].get_rname(),rn)==0)//判断是否相等
return i;
return -1;
}
bool revise(Reader reader,int i) //修改读者资料函数
{
readers[i].copy(reader); //调用读者结构体cpoy函数
return true;
}
void delete_reader(int index) //删除读者函数
{
for(int i=index;i<length-1;i++)
readers[i].copy(readers[i+1]); //用后面的地址覆盖前面的地址
length--;
}
bool log_reader(Reader r) //登录时判断读者用户是否存在函数
{
for(int i=0;i<length;i++)
if(strcmp(readers[i].get_rname(),r.get_rname())==0)
return true;
return false;
}
void reg_reader() //注册用户函数
{
char n[10]; //姓名name
char c[10]; //班级class
char t[10]; //电话tel
Reader reader;
cout<<"\n\t请输入您的姓名:";
cin>>n;
cout<<"\n\t请输入您的所在班级:";
cin>>c;
cout<<"\n\t请输入您的联系电话:";
cin>>t;
reader.set_rname(n); //调用读者结构体设置读者姓名函数
reader.set_rclass(c); //调用读者结构体设置读者班级函数
reader.set_rtel(t); //调用读者结构体设置联系电话函数
add_reader(reader); //调用读者结构体添加读者函数
cout<<"\n\t注册成功!";
}
void show_reader() //不带参的显示读者信息函数
{
cout<<"\n **********************读****者****信****息****列****表**********************\n\n";
cout<<"姓名\t\t\t班级\t\t\t电话\n";
for(int i=0;i<length;i++)
{
cout<<readers[i].get_rname();
cout<<"\t\t\t"<<readers[i].get_rclass();
cout<<"\t\t\t"<<readers[i].get_rtel()<<"\n";
}
}
void show_reader(int i) //带参的显示读者信息函数
{
cout<<"\n **********************读****者****信****息****列****表**********************\n\n";
cout<<"姓名\t\t\t班级\t\t\t电话\n";
cout<<readers[i].get_rname();
cout<<"\t\t\t"<<readers[i].get_rclass();
cout<<"\t\t\t"<<readers[i].get_rtel()<<"\n";
}
};
//********书籍结构体,用于存放书籍基本信息********
class Book
{
private:
char bnum[10]; //书号
char bname[20]; //书名
char bauthor[10]; //作者
char rname[10]; //借阅人
public:
int tag; //状态标记判断指标(已借/在架)
Book() //构造函数初始化信息
{strcpy(bnum,"");strcpy(bname,"");strcpy(bauthor,"");strcpy(rname,"");tag=0;}
void set_bnum(char *no) //设置书号
{strcpy(bnum,no);} //把字符串no中的字符复制到字符串bnum中
char *get_bnum() //获得书号
{ return bnum;} //返回值为bnum
void set_bname(char *n) //设置书名
{strcpy(bname,n);}
char *get_bname() //获得书名
{return bname;}
void set_bauthor(char *a) //设置作者
{strcpy(bauthor,a);}
char * get_bauthor() //获得作者姓名
{return bauthor;}
void set_tag(int t) //状态设置
{tag=t;}
void set_rname(char *rn) //设置借阅人
{strcpy(rname,rn);}
char *get_rname() //获得借阅人姓名
{return rname;}
void show_tag() //显示图书状态
{
if(tag==1)
{cout<<"已借";}
else
{cout<<"在架";}
}
void copy(Book m) //Book结构体copy函数
{
strcpy(bnum,m.get_bnum()); //将获得书号函数里的返回值里的字符复制到bnum strcpy(bname,m.get_bname());
strcpy(bauthor,m.get_bauthor());
tag=0;
}
};
//**********书籍管理结构体,实现管理书籍功能**********
class BookManage
{
private:
Book books[100]; //定义Book书籍结构体数组对象,最大容量100本
int length;
void saveFile() //保存书籍文件
{
ofstream fwrite; //定义输出文件流ofstream结构体对象fwrite
if(!fwrite)
{cout<<"文件保存失败!\n"; exit(1); }
fwrite.open(BookFile,ios::binary);//使文件流与文件建立关联,以二进制方式打开fwrite.write((char *)books,length*sizeof(Book)); //计算并返回所占字节数
fwrite.close(); //关闭磁盘文件
}
void readFile() //读取书籍文件
{
ifstream fread; //定义输入文件流对象fread
length=0;
if(!fread)
{cout<<"文件读取失败!"<<endl;exit(1);}
Book temp; //定义书籍结构体临时对象temp
int i=0;
fread.open(BookFile ,ios::binary);//使文件流与文件建立关联,以二进制方式打开 while((fread.read((char *)&books[i],sizeof(Book))))
i++; //每读完一次,指针后移一位,直到不能读出正确结果为止length=i;
fread.close();
}
public:
BookManage() //构造函数,读取磁盘文件
{
length=0; //从头读起,计数,最大100
readFile(); //调用读取文件函数
}
~BookManage() //析构函数,保存磁盘文件
{
saveFile(); //调用保存文件函数
}
bool add(Book book) //添加图书资料
{
if(length>=100)
{
cout<<"对不起,储存已满,您无法继续添加!\n";
return -1;
}
else
{
books[length].copy(book); //调用书籍结构体copy函数
length++;
return (length-1);
}
}
int bnu_search(char *bnu) //按书号查找书籍
{
for(int i=0;i<length;i++)
if(strcmp(books[i].get_bnum(),bnu)==0) //字符串比较,判断是否相等
return i;
return -1;
}
int bna_search(char *bna) //按书名查找书籍
{
for(int i=0;i<length;i++)
if(strcmp(books[i].get_bname(),bna)==0) //判断
return i;
return -1;
}
int bau_search(char *bau) //按作者查找书籍
{
for(int i=0;i<length;i++)
if(strcmp(books[i].get_bauthor(),bau)==0)//判断
return i;
return -1;
}
int rn_search(char *rn) //按借阅人查找书籍
{
for(int i=0;i<length;i++)
if(strcmp(books[i].get_rname(),rn)==0)//判断
return i;
return -1;
}
void revise(Book book,int i)//带参的修改书籍函数
{books[i].copy(book);} //调用Book结构体copy函数
void deleteBook(int index)//带参的删除书籍资料函数
{
for(int i=index;i<length-1;i++)
books[i].copy(books[i+1]);//用后面的地址将当前的地址覆盖
length--;
}
void show_book()//不带参的显示书籍函数
{
cout<<" **********************书****籍****信****息****列****表**********************\n\n";
cout<<"书号";
cout.width(10);
cout<<"书名";
cout.width(20);
cout<<"作者";
cout.width(10);
cout<<"状态";
cout.width(10);
cout<<"借阅人\n";
for(int i=0;i<length;i++)
{
cout<<books[i].get_bnum();
cout.width(10);
cout<<books[i].get_bname();
cout.width(20);
cout<<books[i].get_bauthor();;
cout.width(10);
books[i].show_tag();
cout.width(10);
cout<<books[i].get_rname()<<"\n";
}
}
void show_book(int i)//带参的显示书籍函数
{
cout<<" **********************书****籍****信****息****列****表**********************\n\n";
cout<<"书号";
cout.width(10);
cout<<"书名";
cout.width(20);
cout<<"作者";
cout.width(10);
cout<<"状态";
cout.width(10);
cout<<"借阅人\n";
cout<<books[i].get_bnum();
cout.width(10);
cout<<books[i].get_bname();
cout.width(20);
cout<<books[i].get_bauthor();;
cout.width(10);
books[i].show_tag();
cout.width(10);
cout<<books[i].get_rname()<<"\n";
}
void br_book()//读者借、还书功能函数
{
ReaderManage reader;
int choi; //选择
int a; //图书状态指标(1已借2在架)
char sh[10]; //需要还书的书号
char dz[10]; //读者姓名
cin>>sh;
int index=bnu_search(sh); //定义一个变量等于查找到的书号
if(index>=0)
{
if(books[index].tag==1) //已借
a=1;
if(books[index].tag==0) //在架
a=2;
switch(a)
{
case 1:
cout<<"\n\t该书目前状态为<已借出>\n";
cout<<"\n\t请选择您需要的服务:1:还书 0:返回\n";
cin>>choi;
cin.ignore(); //清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响
if(choi!=1&&choi!=0)
{
cout<<"\n\t操作有误,请重新选择(0/1)!\n";
return;
}
else if(choi==1)
{
cout<<"\n\t请输入您的姓名:";
cin>>dz;
cin.ignore();
int index1=reader.search(dz);
if(index1==-1)
{
cout<<"\n\t对不起,系统无该读者记录,新用户请先注册!";
return;
}
else
{
strcpy(dz,"");//将读者姓名已空白代替
books[index].set_rname(dz);//借阅人一项变为空白
books[index].set_tag(0);//图书状态变为在架
cout<<"\n\t还书成功!"<<endl;
}
}break;
case 2:
cout<<"\n\t该书目前状态为<在馆>\n";
cout<<"\n\t请您需要的服务:1:借书 0:返回\n";
cin>>choi;
cin.ignore();
if(choi!=1&&choi!=0)
{
cout<<"\n\t操作有误,请重新选择(0/1)!\n";
return;
}
else if(choi==1)
{
cout<<"\n\t请输入您的姓名:";
cin>>dz;
int index1=reader.search(dz);
if(index1==-1)
{
cout<<"\n\t对不起,系统无改读者记录,新用户请先注册!";
return;
}
else
{
books[index].set_rname(dz);
books[index].set_tag(1);
cout<<"\n\t借书成功!"<<endl;
}
}break;
}
}
else
{
cout<<"\n\t对不起,系统无该书记录!";}
}
bool in(int i) //判断图书是否在架函数
{
if(books[i].tag==1)
return false;
return true;
}
};
//**********菜单结构体,实现界面引导**********
class Menu
{
BookManage bm; //定义书籍管理结构体对象bm
ReaderManage rm; //定义读者管理结构体对象rm
Reader r; //定义读者结构体对象r
private:
int choice; //菜单序号选择
int key; //管理员密码
public:
void header() //页眉
{
system("color fd");
cout<<"\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n";
cout<<"\t ※※\n";
cout<<"\t ※※\n";
cout<<"\t ※图书借阅管理系统※\n";
cout<<"\t ※※\n";
cout<<"\t ※※\n";
cout<<"\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n";
}
void log_menu() //主界面登录菜单
{
system("color fd");
header();
cout<<"\n\t\t\t< 请选择登录身份 >\n";
cout<<"\n\t\t\t\t1: 管理员\n\n\t\t\t\t2: 读者\n\n\t\t\t\t0: 退出\n\t您的选择是:";
choice: cin>>choice;
cin.ignore(); //清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响switch(choice)
{
case 1:
log_admin(); //管理员登录,需密码验证
break;
case 2:
reader_lr(); //读者登录或注册
break;
case 0:
exit(1); //退出系统
break;
default:
cout<<"\n\t您的操作有误,请重新选择(0→2): ";
goto choice;
}
}
void admin_menu() //管理员管理菜单
{
system("cls");
system("color f9");
cout<<"\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n";
cout<<"\t ※※\n";
cout<<"\t ※****************系**统**管**理**界**面**************※\n";
cout<<"\t ※※\n";
cout<<"\t ※ 1: 添加新的图书资料 2: 修改已有图书资料※\n";
cout<<"\t ※※\n";
cout<<"\t ※ 3: 删除已有图书资料 4: 查找已有图书资料※\n";
cout<<"\t ※※\n";
cout<<"\t ※ 5: 查看所有图书资料 6: 修改读者用户信息※\n";
cout<<"\t ※※\n";
cout<<"\t ※ 7: 删除读者用户信息 8: 查看所有读者信息※\n";
cout<<"\t ※※\n";
cout<<"\t ※ 9: 返回系统登录界面 0: 退出图书管理系统※\n";
cout<<"\t ※※\n";
cout<<"\t ※※\n";
cout<<"\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n";
cout<<"\n\t请选择您需要的服务序号: ";
choice: cin>>choice;
cin.ignore();
switch(choice)
{
case 1: //添加图书
addBook();
bm.~BookManage();
break;
case 2: //修改图书
reviseBook();
bm.~BookManage();
break;
case 3: //删除图书
delBook();
bm.~BookManage();
break;
case 4: //查找图书
absearch_menu();
break;
case 5: //查看全部图书
bm.show_book();
cout<<"\n\t显示完毕!";
system("pause");
admin_menu();
break;
case 6: //修改读者
reviseReader();
rm.~ReaderManage();
break;
case 7: //删除读者
delReader();
rm.~ReaderManage();
break;
case 8: //查看所有读者
rm.show_reader();
cout<<"\n\t显示完毕!";
system("pause");
admin_menu();
break;
case 9: //返回系统登录界面
system("cls");
log_menu();
case 0: //退出系统
exit(1);
break;
default:
cout<<"\n\t您的操作有误,请重新选择(0→7): ";
goto choice;
}
}
void reader_menu() //读者服务菜单
{
system("cls");
system("color f9");
cout<<"\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n";
cout<<"\t ※※\n";
cout<<"\t ※****************读**者**服**务**界**面**************※\n";
cout<<"\t ※※\n";
cout<<"\t ※ 1: 借阅图书 2: 归还图书※\n";
cout<<"\t ※※\n";
cout<<"\t ※ 3: 查找图书 4: 借阅情况※\n";
cout<<"\t ※※\n";
cout<<"\t ※ 5: 返上一级 0: 退出系统※\n";
cout<<"\t ※※\n";
cout<<"\t ※※\n";
cout<<"\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n";
cout<<"\n\t请选择您需要的服务序号: ";
choice: cin>>choice;
cin.ignore();
switch(choice)
{
case 1:
cout<<"\n\t请输入您欲借阅的图书书号: ";
bm.br_book();
bm.~BookManage();
break;
case 2:
cout<<"\n\t请输入您欲归还的图书书号: ";
bm.br_book();
bm.~BookManage();
break;
case 3:
bsearch_menu();
break;
case 4:
rn_search();
break;
case 5:
system("cls");
reader_lr();
break;
case 0:
exit(1);
break;
default:
cout<<"\n\t您的操作有误,请重新选择(0→5): ";
goto choice;
}
}
void bsearch_menu() //读者查找书籍菜单
{
system("cls");
system("color f2");
cout<<"\t\t\t※※※※※※※※※※※※※※※※※\n";
cout<<"\t\t\t※※\n";
cout<<"\t\t\t※****书**籍**查**找**界**面****※\n";
cout<<"\t\t\t※※\n";
cout<<"\t\t\t※ 1: 按书号查找※\n";
cout<<"\t\t\t※※\n";
cout<<"\t\t\t※ 2: 按书名查找※\n";
cout<<"\t\t\t※※\n";
cout<<"\t\t\t※ 3: 按作者查找※\n";
cout<<"\t\t\t※※\n";
cout<<"\t\t\t※ 4: 返回上级※\n";
cout<<"\t\t\t※※\n";
cout<<"\t\t\t※ 0: 退出系统※\n";
cout<<"\t\t\t※※\n";
cout<<"\t\t\t※※※※※※※※※※※※※※※※※\n"; int bsc; //book search choice
cout<<"\n\t请输入您需要的服务序号: ";
cin>>bsc;
cin.ignore();
switch(bsc)
{
case 1:
bnu_search();。

相关文档
最新文档