您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程设计—图书管理系统

2016-12-28 23:09 666 查看
/***********************************************************
* 版权所有 (C)2016,test
*
* 文件名称: main.cpp
* 文件标识:main
* 内容摘要:函数文件
* 其它说明:主函数
* 当前版本: V8.0
* 作 者:李晓钰
* 完成日期: 20161227
*
* 修改记录1:
* 修改日期 :20161225
* 版本号: V1.0
* 修改人: 李晓钰
* 修改内容:整理思路,创建基本架构
*
* 修改记录2:
* 修改日期:20161225
* 版本号: V2.0
* 修改人: 李晓钰
* 修改内容:添加基本功能
*
* 修改记录3:
* 修改日期: 20161226
* 版本号: V3.0
* 修改人: 李晓钰
* 修改内容:修复大量的BUG
*
* 修改记录4:
* 修改日期: 20161226
* 版本号: V4.0
* 修改人:李晓钰
* 修改内容:探索新功能
*
* 修改记录5:
* 修改日期: 20161227
* 版本号: V5.0
* 修改人: 李晓钰
* 修改内容:测试运行 发现问题
*
* 修改记录6:
* 修改日期: 20161227
* 版本号: V6.0
* 修改人:李晓钰
* 修改内容:更改功能 测试运行
*
* 修改记录6:
* 修改日期: 20161228
* 版本号: V7.0
* 修改人: 李晓钰
* 修改内容:完善系统的功能
*
* 修改记录6:
* 修改日期: 20161228
* 版本号: V8.0
* 修改人: 李晓钰
* 修改内容:将程序添加注释,将初始化数据变成文件存储,修改小部分不完善的地方
**********************************************************/


library.h

#include <iostream>
using namespace std;
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <iomanip>
#define MAX    100
#define MaxSize 100              //100条记录
//定义希尔排序结构体
typedef char InfoType[10];
typedef struct          //记录类型
{
int key;        //关键字项

} RecType;              //排序的记录类型定义
//书的结构体
typedef struct book
{
float price;                //图书单价
char name[80];              //图书名
long num;                   //图书编号
char writername[20];        //作者姓名
char publish[40];           //出版社名称
struct book *next;          //结点指针
} Book,*BookList;
//界面
void Face();
void FaceBook();
void FaceBookSearh();
//初始化
Book *Init_B();                             //初始化图书链表
int BookAdd(BookList &);                    //建立一个带头结点的链表用来存储图书信息
//查询图书方式
int BookSearch(BookList &);                 //图书查询菜单
int Search_BookNum(BookList &);             //按编号查询
int Search_BookName(BookList &);            //按书名查询
int Search_BookWritername(BookList &);      //按作者名查询
int Search_AllB(BookList &);                //查询所有图书信息
//删除图书
int BookDel(BookList &);                    //以图书编号作为主键进行删除
//修改图书信息
int BookChange(BookList &);
//排序函数
int BookPai(BookList &);
void ShellSort(RecType [],int);
//全局变量声明
extern RecType R[MaxSize];
extern int xer;
extern int X[100];


/*********************************************************
* 功能描述:初始化图书链表
* 输入参数:无
* 输出参数:无
* 返回值  :图书链表
* 其它说明:无
************************************************************/
//增加图书
Book *Init_B()                  //初始化图书链表
{
Book *H;
H=(Book *)malloc(sizeof(Book));
if(!H) exit(1);
H->next=NULL;
return H;
}

/*********************************************************
* 功能描述:新建图书
* 输入参数:X[xer]-图书编号
* 输出参数:是否成功增加
* 返回值  :(1)
* 其它说明:无
************************************************************/
int BookAdd(BookList &H)        //建立一个带头结点的链表用来存储图书信息
{
int i=0;                    //统计要增加的图书量
Book *p,*q;
p=(Book *)malloc(sizeof(Book));
if(!p) exit(1);
if(H->next==NULL)        //记录第一本书
{
cout<<"                        ○输入图书编号:";
cin>>p->num;
X[xer]=p->num;
if(p->num==0)           //退出"增加图书"
{
cout<<"                                                   共计"<<i<<"本图书入库!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
return 1;
}
cout<<"                        ○输入书名:";
cin>>p->name;
cout<<"                        ○输入图书价格:";
cin>>p->price;
cout<<"                        ○输入作者姓名:";
cin>>p->writername;
cout<<"                        ○输入出版社名称:";
cin>>p->publish;
p->next=NULL;
H->next=p;
q=p;
i++;
cout<<endl<< X[xer];
xer++;
}

else
{
q=H;
while(q->next!=NULL)
q=q->next;
p->num=1;                      //进入循环的条件  记录往后的每一本
p->next=NULL;
}
while(p->num!=0)                   //以图书编号作为判断链表是否结束
{
p=(Book *)malloc(sizeof(Book));
if(!p) exit(1);
cout<<"                        ○输入图书编号:";
cin>>p->num;
//希尔数组的加入
X[xer]=p->num;
if(p->num==0)                  //退出"增加图书"
{
cout<<"                                                    共计"<<i<<"本图书入库!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
break;
}
cout<<"                        ○输入书名:";
cin>>p->name;
cout<<"                        ○输入图书价格:";
cin>>p->price;
cout<<"                        ○输入作者姓名:";
cin>>p->writername;
cout<<"                        ○输入出版社名称:";
cin>>p->publish;
p->next=NULL;
q->next=p;
q=p;
i++;
//希尔数组的加入

cout<<endl<< X[xer];
xer++;
}
return 1;
}

/*********************************************************
* 功能描述:查询图书选择模块
* 输入参数:0~9(对应相应功能)
* 输出参数:相应界面
* 返回值  :(1)
* 其它说明:0是退出
************************************************************/
int BookSearch(BookList &H)
{
int m;
while(m!=0)
{
FaceBookSearh();
cin>>m;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
switch(m)
{
case 1:
Search_BookName(H);
break;        //按书名查询
case 2:
Search_BookNum(H);
break;         //按编号查询
case 3:
Search_BookWritername(H);
break;  //按作者名查询
case 4:
Search_AllB(H);
break;            //查询所有图书信息
case 0:
break;                            //退出
}
}
return 1;
}


/*********************************************************
* 功能描述:查询图书
* 输入参数:n-要查询的书名
* 输出参数:要查询书的信息
* 返回值  :(1)
* 其它说明:按书名查询
************************************************************/
int Search_BookName(BookList &H)            //按书名查询
{
Book *p;
p=H->next;
char n[80];
int flag=0;                    //找的书的标志
cout<<"                           ○输入要查询的书名:";
cin>>n;
for(; p!=NULL; p=p->next)
{
if(strcmp(p->name,n)==0)
{
if(flag==0)
cout<<endl<<"书名       编号        单价        作者        出版社            "<<endl;
cout<<" "<<p->name<<"  "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish<<endl;
flag=1;
continue;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
if(p==NULL&&flag==0)
{
cout<<"                          ※没有相关信息!※"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}

/*********************************************************
* 功能描述:查询图书
* 输入参数:n-书的编号
* 输出参数:查询的相应信息
* 返回值  :(1)
* 其它说明:按编号查询
************************************************************/
//查询图书方式
int Search_BookNum(BookList &
e729
;H)             //按编号查询
{
Book *p;
p=H->next;
long n;
int flag=0;
cout<<"                        ○输入要查询的书的编号:";
cin>>n;
for(; p!=NULL; p=p->next)
{
if(n==p->num)
{
if(flag==0)
cout<<endl<<"书名       编号        单价        作者        出版社        "<<endl;
cout<<" "<<p->name<<"  "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish<<endl;
flag=1;
continue;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
if(p==NULL&&flag==0)
{
cout<<"                        ※没有相关信息※!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}


/*********************************************************
* 功能描述:查询图书
* 输入参数:n-书的作者名
* 输出参数:查询的相应信息
* 返回值  :(1)
* 其它说明:按作者名查询
************************************************************/
int Search_BookWritername(BookList &H)      //按作者名查询
{
Book *p;
p=H->next;
int flag=0;
char n[30];
cout<<"                        ○输入要查询的书的作者名:";
cin>>n;
for(; p!=NULL; p=p->next)
{
if(strcmp(p->writername,n)==0)
{
if(flag==0)
cout<<endl<<"书名       编号        单价        作者        出版社        "<<endl;
cout<<" "<<p->name<<"  "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish<<endl;
flag=1;
continue;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
if(p==NULL&&flag==0)
{
cout<<"                         ※没有相关信息!※"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}

/*********************************************************
* 功能描述:查询图书
* 输入参数:无
* 输出参数:图书信息
* 返回值  :(1)
* 其它说明:显示所有信息
************************************************************/
int Search_AllB(BookList &H)               //查询所有图书信息
{
Book *p;
p=H->next;
int i=0,flag=0;
for(; p!=NULL; p=p->next)
{
if(flag==0)
cout<<endl<<"书名       编号        单价        作者        出版社        "<<endl;
cout<<" "<<p->name<<"  "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish<<endl;
flag=1;
i++;
}
cout<<"                                                         共计"<<i<<"本书。"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
return 1;
}


/*********************************************************
* 功能描述:实现编号排序
* 输入参数:无
* 输出参数:排序后的编号
* 返回值  :(1)
* 其它说明:希尔排序
************************************************************/
void ShellSort(RecType R[],int n)   //希尔排序算法  (此处利用数组进行排序)
{
int i,j,gap;
RecType tmp;
gap=n/2;                //增量置初值
while (gap>0)
{
for (i=gap; i<n; i++) //对所有相隔gap位置的所有元素组进行排序
{
tmp=R[i];
j=i-gap;
while (j>=0 && tmp.key<R[j].key)//对相隔gap位置的元素组进行排序
{
R[j+gap]=R[j];
j=j-gap;
}
R[j+gap]=tmp;
j=j-gap;
}
gap=gap/2;  //减小增量
}
}

int BookPai(BookList &H)
{
Book *p;
p=H->next;
int i;

for(i=0; i<xer; i++)
R[i].key=X[i];
cout<<"排序前:"<<endl;

for(; p!=NULL; p=p->next)
{
cout<<endl<<"书名       编号        单价        作者        出版社        "<<endl;
cout<<" "<<p->name<<"  "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish<<endl;
}

ShellSort(R,xer);

cout<<"排序后编号:"<<endl;

for(i=0; i<xer; i++)

cout<<R[i].key<<endl;

return 1;
}

/*********************************************************
* 功能描述:删除图书
* 输入参数:n-删除的书的编号
* 输出参数:是否删除
* 返回值  :(1)
* 其它说明:按图书编号删除
**********************************************************/
//删除图书
int BookDel(BookList &H)                           //以图书编号作为主键进行删除
{
Book *p;
long n;
int flag=0;
p=H;
cout<<"                           ○输入要删除的书的编号:";
cin>>n;
for(; p!=NULL; p=p->next)
{
if(p->next!=NULL&&p->next->num==n)
{
p->next=p->next->next;            //删除语句
cout<<"                              √成功删除!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
flag=1;                           //成功删除标记
break;
}
}
if(p==NULL&&flag==0)
{
cout<<"                               删除失败!"<<endl;           //已经被删除或没有这本书
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}


/*********************************************************
* 功能描述:修改图书
* 输入参数:n-修改的书的编号
* 输出参数:是否修改成功
* 返回值  :(1)
* 其它说明:按图书编号修改
************************************************************/
//修改图书信息
int BookChange(BookList &H)                           //以图书编号作为主键进行修改
{
Book *p;
long n;
int flag=0;
p=H;
cout<<"                           ○输入要修改的书的编号:";
cin>>n;
for(; p!=NULL; p=p->next)
{
if(p->num==n)
{
cout<<"以下为要修改的图书:"<<endl<<"书名       编号        单价        作者        出版社      "<<endl;
cout<<" "<<p->name<<"  "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish<<endl;
cout<<"                       请输入相应修改数据"<<endl;
cout<<"                        ○输入编号:";
cin>>p->num;
cout<<"                        ○输入书名:";
cin>>p->name;
cout<<"                        ○输入图书价格:";
cin>>p->price;
cout<<"                        ○输入作者姓名:";
cin>>p->writername;
cout<<"                        ○输入出版社名称:";
cin>>p->publish;
cout<<"                              √成功修改!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
flag=1;                           //成功修改标记
break;
}
}
if(p==NULL&&flag==0)
{
cout<<"                            ERROR!   修改失败,没有这本书!"<<endl;           //没有这本书
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}

return 1;
}

三个界面的设计:

/*********************************************************
* 功能描述:欢迎界面
* 输入参数:无
* 输出参数:无
* 返回值  :无
* 其它说明:界面1
************************************************************/
void Face()
{
system("color 74");
cout<<endl<<"   ———————————— 欢迎进入图书管理系统 ———————————"<<endl;
cout<<endl<<"                  ┏━━━━━━━━━━━━━━━━━━┓"<<endl;
cout<<"                  ┃                                    ┃"<<endl;
cout<<"                  ┃           ◆1◆ 管理图书           ┃"<<endl;
cout<<"                  ┃                                    ┃"<<endl;
cout<<"                  ┃           ◆0◆ 退出系统           ┃"<<endl;
cout<<"                  ┃                                    ┃"<<endl;
cout<<"                  ┗━━━━━━━━━━━━━━━━━━┛"<<endl;
cout<<"                          →请在此输入您的选择:";
}


/*********************************************************
* 功能描述:图书查询界面
* 输入参数:无
* 输出参数:无
* 返回值  :无
* 其它说明:界面2
************************************************************/
void FaceBookSearh()
{
cout<<"                          ◢━━━━━━━━━━━◣"<<endl;
cout<<"                          ┃#欢迎进入图书查询系统#┃"<<endl;
cout<<"                          ◥━━━━━━━━━━━◤"<<endl;
cout<<"             ┌──────────────┐ "<<endl;
cout<<"             │ ① 按书名查询 ----- (NAM) #│ "<<endl;
cout<<"             ├──────────────┤ "<<endl;
cout<<"             │ ② 按编号查询 ----- (NUM) #│ "<<endl;
cout<<"             ├──────────────┤ "<<endl;
cout<<"             │ ③ 按作者名查询 --- (SEX) #│ "<<endl;
cout<<"             ├──────────────┤ "<<endl;
cout<<"             │ ④ 查询所有信息 --- (TIME)#│ "<<endl;
cout<<"             ├──────────────┤ "<<endl;
cout<<"             │  0. 退   出 ------- (ESC) #│ "<<endl;
cout<<"             └──────────────┘ "<<endl;
cout<<"                           →请在此输入您的选择:";
}


/*********************************************************
* 功能描述:图书管理界面
* 输入参数:无
* 输出参数:无
* 返回值  :无
* 其它说明:界面1
************************************************************/
void FaceBook()
{

cout<<"                         ◢━━━━━━━━━━━◣"<<endl;
cout<<"                         ┃#欢迎进入图书管理系统#┃"<<endl;
cout<<"                         ◥━━━━━━━━━━━◤"<<endl;
cout<<"             ┌──────────────┐ "<<endl;
cout<<"             │ ① 增加图书 ----- (ADD) #  │ "<<endl;
cout<<"             ├──────────────┤ "<<endl;
cout<<"             │ ② 查询图书 ----- (SEA) #  │ "<<endl;
cout<<"             ├──────────────┤ "<<endl;
cout<<"             │ ③ 删除图书 ----- (DEL) #  │ "<<endl;
cout<<"             ├──────────────┤ "<<endl;
cout<<"             │ ④ 排序图书 ----- (SORT)#  │ "<<endl;
cout<<"             ├──────────────┤ "<<endl;
cout<<"             │ ⑤ 修改图书 ----- (CHAB)#  │ "<<endl;
cout<<"             ├──────────────┤ "<<endl;
cout<<"             │  0. 退   出 ----- (ESC) #  │ "<<endl;
cout<<"             └──────────────┘ "<<endl;
cout<<"                           →请在此输入您的选择:";
}


main.cpp:

#include "Library.h"
#include <iostream>
using namespace std;
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <iomanip>
int X[100];            //暂存数组
int xer=0;             //暂存标记
RecType R[MaxSize];    //哈希数组
Book *H;               //图书链表

int main()
{

FILE *fpb1,*fpb2;              //文件指针
Book *p1,*p2,*s1;
H=Init_B();
fpb1=fopen("book.txt","rb");               //读方式打开图书文件
if(fpb1!=NULL)
{
p1=(Book *)malloc(sizeof(Book));
if(!p1) exit(1);
p1->next=NULL;
while(fread(p1,sizeof(Book),1,fpb1)==1)
{
if(H->next==NULL)
{
H->next=p1;
s1=p1;
}
else
{
s1->next=p1;
s1=p1;
}
p1=(Book *)malloc(sizeof(Book));
if(!p1) exit(1);
p1->next=NULL;
}
}
int m,n;
while(m!=0)
{
Face();
cin>>m;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
if(m==1)
{
FaceBook();
cin>>n;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
switch(n)
{
case 1:
BookAdd(H);
break;           //增加图书
case 2:
BookSearch(H);
break;        //查询图书
case 3:
BookDel(H);
break;           //删除图书
case 4:
BookPai(H);
break;           //排序图书
case 5:
BookChange(H);
break;          //修改图书信息
case 0:
break;                       //退出图书管理,返回上一层菜单
}
}
else if(m==0)
{
cout<<endl<<"┅┅┅┅┅┅┅┅┅┅┅┅┅感谢您使用本系统,再见!┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
fpb2=fopen("book.txt","wb");
for(p2=H->next; p2!=NULL; p2=p2->next)
fwrite(p2,sizeof(Book),1,fpb2);          //写入文件   保存信息
fclose(fpb2);
exit(0);
}
}
return 0;
}


运行截图:
测试文件功能:





接着存入两本:



查询图书:

按书名查询:



按编号查询:



按作者查询:



查询全部:



图书排序:



删除图书:





修改图书:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: