# 基于VC++控制台实现的图书信息管理系统
# 1 需求分析
开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。使之能提供以下基本功能:
- 图书信息录入功能(图书信息用文件保存)--输入
- 图书信息浏览功能--输出
- 查询功能(至少一种查询方式)、排序功能(至少一种排序方式):
- 按书名查询
- 按作者名查询
- 按照价钱排序
- 按出版时间排序
- 图书信息的删除与修改
扩展功能:可以按照自己的程度进行扩展。比如:
- 简单的权限处理
- 报表打印功能
- 甚至根据自己情况,可以加上学生信息和借阅信息的管理,并扩充为图书借阅系统
- 模糊查询
- 综合查询
- 统计功能,比如统计处某一类别的图书信息 或 筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能
需求分析如下:
- 图书管理需要有管理员,客户,游客
- 管理员的功能包括登录、注册、录入图书、删除图书、查看借书情况(查看借出最多与最少的图书)、修改图书信息、浏览图书信息、修改个人信息、修改学生的信息
- 客户模块功能包括借书、还书、查询图书(价格查询、作者查询、类型查询、图书名查询)、查看自己借阅的图书、修改个人资料
- 游客模块包括图书信息查询功能,包括价格查询、图书浏览、作者查询、图书名查询
# 2 概要设计
## 2.1 数据结构
```c++
struct mima
{
char id[3];//账号名
char phone[12];//电话
char passworld[16];//密码
struct mima *next;//下一个节点
};
struct book
{
int num;//图书编号
char bookname[30];//图书名
char author[20];作者
char press[30];出版社
char cate[30];类型
int year, mon, day;//出版日期
double price;//价格
int kucun;//库存量
int lend;//接触量
struct book *next;
};
```
## 2.2 模块划分
```c++
void creatid1();//图书结构的建立
void liulan();//浏览图书
void login1();//管理员登录
void FIND();//查找
void find1();//按类别查找
void find2();//按作者查找
void find3();//按价格查找
void READ();//浏览图书
void xiugaixuesheng();//修改学生的资料
void CHANGE();//修改图书信息
void teacher();//老师菜单
void student();//学生菜单
void login2();//学生登录
void creatid2();//学生注册
void FINDbook();//查找图书
void tour();//游客菜单
void add();//添加图书
void READmine();//浏览我的图书
void tongji();//统计信息
void tongji2();//按借出最多的统计
void tongji1();//按最少的统计
void INPUT(LinkList head);//插入图书,形参为要插入的链表
void jieshu(LinkList head);//借书菜单,形参为图书的链表
void huanshu(LinkList head);//还书菜单,形参为图书的链表
void write(LinkList head);//向图书文件写入,形参为要写入文件的链表
void writemy(LinkList head);//向我的图书写入,形参为 我借的图书的链表
void writeid(LinkList1 head);//把管理员的信息写入文件,形参为老师信息的链表
void writeid1(LinkList1 head);//把我的信息写入文件, 形参为老我的信息的链表
void mydel(LinkList head,LinkList p);//删除我借的图书,形参分别为,我的图书//的链表,要删除的图书
void del(LinkList head);//删除图书,形参为图书链表
void chan(LinkList head);//修改图书信息,形参为图书链表
void kucundel(LinkList head,int num);//库存减少,形参分别为图书链表和图书编//号
void print(LinkList head);//输出图书信息,形参为图书链表
void xiugaiziliao(char *id1);//修改管理员的资料,形参为老师的id
void xiugaiziliao1(char *id1);//修改我的资料,形参为 我的id
LinkList priceDown(LinkList head);//按价格降序查找,形参为图书链表,返回排序//好的链表
LinkList paixu(LinkList head);//按图书编号从小到大排序, 形参为图书链表,返//回排序好的链表
LinkList read();//从文件中读入图书,返回一个图书链表
LinkList1 readid();//从文件中读入管理员账号密码,返回老师的信息链表
LinkList1 readid1();//从文件中读入我的账号密码, 返回我的信息的链表
LinkList readmy();//查找我借的书,返回读出的图书链表
LinkList priceUp(LinkList head);//按价格升序查找,形参为要排序的链表,返回排//好序的图书链表
```
## 2.3 **程序总体框架**

# 3 详细设计
Login1():输入账号和密码,如果账号和密码与文件中保存的不同,则重新登陆。登陆成功后选择自己的操作。
```c++
case 1:INPUT(head);write(head);break;//输入图书并写入文件。
case 2:FIND();break;//查找。
case 3:READ();break;//浏览。
case 4:CHANGE();break;//修改图书信息。
case 5:tongji();break;//统计信息。
case 6:xiugaiziliao(id);break; //修改个人资料。
case 0:return;//返回上一菜单。
```
creatid1():输入账号,电话号码和两次密码,如果账号已经存在或者两次密码不同,则重新注册。否则将信息写入文件并提示注册成功。
```c++
void creatid1()
{
printf("欢迎来到注册页面:\n");
FILE *fp;
char id1[20], id[20],phone1[15], passworld1[20],phone[15], passworld[20],
passworld2[20];
if((fp=fopen("teachid.txt","a+"))==NULL)
{
printf("can not open this file!\n");
exit(0);
}
printf("请输入账号名:\n");
scanf("%s", id);
for(;!feof(fp);)
{
fscanf(fp,"%s%s%s", id1, phone1, passworld1);
if(strcmp(id1,id)==0)
{
printf("用户名已存在,请重新输入:\n");
creatid1();
}
}
printf("请输入电话号码:\n");
scanf("%s", phone);
printf("请输入密码:\n");
int i;
for(i=0;i<20;i++)
{
passworld1[i]=getchar();
if(passworld1[i]=='\r') break;
printf("*");
}
putchar(10);
passworld1[i]='\0';
printf("请确定密码:\n");
for(i=0;i<20;i++)
{
passworld2[i]=getchar();
if(passworld2[i]=='\r') break;
printf("*");
}
putchar(10);
passworld2[i]='\0';
if(strcmp(passworld1,passworld2)==0)
{
printf("注册成功,请牢记您的密码:\n");
fprintf(fp,"%s ", id);
fprintf(fp,"%s ", phone);
fprintf(fp,"%s\n", passworld1);
printf("注册成功,请牢记您的密码!!!!\n请您登陆:\n");
}
else
{
printf("两次密码不一致,请重新注册:\n");
creatid1();
}
if(fclose(fp))
{
printf("can not close this file!\n");
exit(0);
}
login1();
}
```
void INPUT(LinkList head):输入图书信息,当输入的图书编号已经存在时重新输入,当输入的图书编号为-1时结束,并将输入的图书信息写入文件。
```c++
void INPUT(LinkList head)
{
LinkList p, rear=head;//刚开始尾指针是空的
int num;//定义各种图书信息
char bookname[30];
char author[20];
char press[30];
char cate[30];
int year, mon, day;
double price;
int kucun;
int lend;
printf("输入图书信息,输入图书编号等于-1表示输入结束\n");
printf("输入图书编号:");
scanf("%d", &num);
while(num!=-1)
{
printf("请输入图书名:");
scanf("%s", bookname);
printf("请输入图书作者:");
scanf("%s", author);
printf("请输入图书出版社:");
scanf("%s", press);
printf("请输入图书类别:");
scanf("%s", cate);
printf("请输入图书出版时间(年 月 日):");
scanf("%d%d%d", &year,&mon, &day) ;
printf