数据结构课程设计—图书管理系统
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; }
运行截图:
测试文件功能:
接着存入两本:
查询图书:
按书名查询:
按编号查询:
按作者查询:
查询全部:
图书排序:
删除图书:
修改图书:
相关文章推荐
- 数据结构课程设计--图书管理系统
- 数据结构课程设计—图书信息管理系统
- 数据结构课程设计-图书管理系统 作者:彭子竹
- 数据结构课程设计-图书管理开发系统
- 数据结构课程设计(图书管理系统)
- 数据结构课程设计 图书管理系统
- 数据结构课程设计图书管理系统
- 数据结构课程设计-图书管理系统
- 数据结构课程设计-图书管理系统
- 数据结构课程设计—图书管理系统
- 数据结构课程设计--“模拟图书管理系统的开发”
- 数据结构课程设计--图书管理系统
- 数据结构课程设计 - 通讯录管理系统
- 数据结构课程设计-宿舍管理系统
- 数据结构之链表的实现-------C++课程设计-----学生选课管理系统
- 数据结构课程设计---学生信息管理系统
- 数据结构课程设计-通讯录管理系统的设计与实现
- 数据结构课程设计---学生信息管理系统
- 数据结构课程设计学生成绩管理系统源代码
- 数据结构课程设计报告-职工信息管理系统