《数据结构课程设计图书管理.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计图书管理.doc(87页珍藏版)》请在三一办公上搜索。
1、数据结构课程设计报告 题目:图书管理 学 院 计算机学院 专 业 软件工程 年级班别 2010级 4 班 学 号 学生姓名 指导教师 成 绩 _2012年6月一、 设计任务【Design Tasks】1.1、图书管理系统中图书管理模块包括图书类型定义:书号、现存量、总存量,出版时间为整型,定价为浮点型,书名、著者名为字符型,借阅指针、预约指针为读者类型;读者类型定义:证号为整型、姓名为字符型,另外借阅类型和预约类型组合成其中的共用体类型。B树(2-3树)类型定义:关键字个数和关键字数组为整型、另外还有指向双亲的指针、指向子树的指针、记录单元指针;B树查找结果类型定义: 节点指针、关键字序号和查
2、找标志变量为整型。1.2、演示程序以用户和计算机的对话方式进行,在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在后面。该演示系统,没有使用文件,全部数据放在内存存放。四项基本业务都以书号为关键字进行的,采用了B树(2-3树)对书号建立索引,以提高效率。2、设计思路【Design Ideas】2.1、设计框图系统管理界面个人信息借阅信息借书查找修改密码催还信息还书还回首页1、按作者查找2、按书名查找3、按编号查找4、按作者和书名查找新书入库查找图书删除图书查看图书我的图书馆退出系统2-3树凹进输出所有图书编号信息显示所有图书的所有信息
3、2.2、结构体设计/*- 四、所需结构体和类-*/登陆类class Loginpublic:Login();void amend( const string st1,const string st2);bool IsLogin(string &str1, string &str2);string UserName;string UserID;string PassWord;int ErrorNum;/个人信息结构体typedef struct Informationstring ID;string Name;string Academy;string Major;string Educatio
4、n;string State;int number;/超期数目inttotal;/已借数目Inof;/借阅信息结构体typedef struct InofBook/string Check_Data;/string Return_Data;int C_Year;int C_Month;int C_Day;int R_Year;int R_Month;int R_Day;int Book_Number;string Book_Name;string Book_Writer;struct InofBook *next;InofBook;/图书信息类typedef structKeyType ind
5、ex; /书号char B_name120;/书名,可以为中文char B_writer120;/著者,可以中文int stack;/现存量int total;/总库存量int tag;/标志是否被预约 1 是 0 否B_Record,*b_Record; /书目记录类型/图书类struct bookpublic:Book();elemtype Book_Name;elemtype Book_Writer;int Book_Number;int Extant_Num ;/该书现存量int Gross_Num ;/该书总量struct book *next;typedef struct book
6、 *book_Record;typedef struct book Book_Record;typedef struct R_RecordKeyType card; /卡号char R_name120;/姓名char tel11;/手机号码char* PassWord;struct Borrowint yuyue;/存放预约的书号,最多一本struct bNode *R_bookN/4;/借阅书指针char* termN/4;/归还期限int b_num;/已经借阅书的数量bor;/借阅记录类型R_Record,*r_Record; /读者记录类型typedef struct bNode Ke
7、yType index; /关键字向量struct B_Node *child; /子树指针向量B_Record rec; /记录指针向量bNode,*Bode;/书目结点向量类型typedef struct rNode KeyType card; /卡号向量 struct R_Node *child; /子树指针向量 R_Record rec; /记录指针向量 rNode,*Rode; /读者结点向量类型typedef struct B_Nodeint BookNum; /结点中书目个数,即结点的大小int level;struct B_Node *pa; /指向双亲结点struct B_N
8、ode *lBro, *rBro;struct bNode nodem+1;/除child外,其它0号单元未用B_Node,*Book; /书树结点和书树的类型typedef struct R_Nodeint ReaderNum; /结点中读者个数,即结点的大小int level;struct R_Node *pa; /指向双亲结点struct R_Node *lBro, *rBro;struct rNode nodem+1; /除child外,0号单元未用R_Node,*Reader; /读者树结点和读者树的类型typedef structB_Node *pb; /指向找到的结点int i;
9、 /1.m,在结点中的关键字序号int tag; / 1:查找成功,O:查找失败B_Result; /书树的查找结果类型typedef structR_Node *pr; /指向找到的结点int i; /1.m,在结点中的关键字序号int tag; / 1:查找成功,O:查找失败R_Result; /读者树的查找结果类型2.3、宏定义和常量#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define EQ(a,b) (a)=(b)#define LT(a,b) (a)(b)#define m 3 /2-3树的阶#define N
10、 20 / 每种书最大库存20本、读者最多每人借 20/4 = 5 本typedef int Status; /函数的类型,其值是函数结果状态代码typedef int KeyType; /设关键字域为整型typedef string elemtype;2.4、设计模块 主程序模块 图 书 管 理 模 块 图书管理模块 我的图书馆管理模块三、部分代码分析【Code Analysis】3.1、图书管理模块选择switch(i)case 1: /添加图书A_Add_Book( head );save_printf(1,ntt书库现状态如下: n);if(BK-BookNum != NULL)Tra
11、verse_BK(BK,BK-level);elsesave_printf(1,n书库为空);fprintf(fp,nn);printf(nn);break;case 2: /查找图书A_Search_Book();break;case 3: /删除图书A_Delete_Book( head );save_printf(1,ntt书库现状态如下: n);if(BK-BookNum != NULL)Traverse_BK(BK,BK-level);elsesave_printf(1,n书库为空);fprintf(fp,nn);printf(nn);break;case 4: /查看全部图书Sea
12、rch_All_Book();break;case 5:/我的图书馆Mylibrary( head );break;case 0: /返回系统登录界面fprintf(fp,nttttAdmin_menu-menu tnn);exit(1);break;default:save_printf(1,nt您的操作有误,请重新选择(07): );break;3.2.1、添加图书/*- A_Add_Book -*/YN是否存在该编号或输入错误?输入编号A_Add_Book入口重新输入读取改编号图书的其他信息插入2-3树,插入单链表将该书添加到图书库中结束void Load( book_Record q
13、);void A_Add_Book( book_Record head )/添加图书char s2;int i;int j;book_Recordq;q = new Book_Record;B_Record r;Init_Brec(r);dobook_Record p=head;save_printf(1,nt书号: );save_gets(s);r.index = atoi(s);if(r.index 9999999) save_printf(1,nt输入有误,请重新输入(19999999)!n);/*主关键字是图书编号,是唯一的*输入相同编号,重新输入*/while( p != NULL
14、)if( p-Book_Number = r.index )r.index = NULL;coutt该编号已存在!next;while(r.index 9999999);save_printf(1,nt书名: );dosave_gets(r.B_name0);j = strlen(r.B_name0);if(j 20)save_printf(1,nt您输入的书名有误,请重新输入(120字符): );while(j 20);save_printf(1,nt著者: );dosave_gets(r.B_writer0);j = strlen(r.B_writer0);if(j 20)save_pri
15、ntf(1,nt您输入的著者有误,请重新输入(120字符): );while(j 20);save_printf(1,nt存入数量: );dosave_gets(s);r.stack = r.total = atoi(s);if(r.total N ) save_printf(1,nt输入有误,请重新输入(120)!: );while(r.total N);i = Add_Book(BK,r);if(i)/*读取信息*/q-Book_Number = r.index;q-Book_Name = r.B_name0;q-Book_Writer = r.B_writer0;q-Extant_Num
16、 = r.stack;q-Gross_Num = r.total;Load(q);/将新书添加到图书库中q-next = head;head = q;Load_Book( head );/更新“librarydata.txt”图书信息save_printf(1,nt添加成功!n);else save_printf(1,nt添加失败!该书书库容量不足!n);3.2.2、删除图书/*- A_Delete_Book -*/A_Delete_Book入口输入编号重新输入是否存在该编号或输入错误?Y从2-3树、单链表删除该本书将该书从图书库中删除,更新Nbook_Record Dell( int ind
17、ex );void load_book( book_Record h);void A_Delete_Book( book_Record head )/删除图书char s2;int i;int index;/book_Record x;/x = new Book_Record;dosave_printf(1,nt请输入您要删除的书的书号: );book_Record p= head;save_gets(s);index = atoi(s);if(index 9999999) save_printf(1,nt输入有误,请重新输入(19999999)!n书号: );/*处理图书不出在的情况*/wh
18、ile( p != NULL )if( p-Book_Number = index )break;p = p-next;if(p=NULL)index=0;cout无此书!endl;while(index 9999999);i = Delete_Book(BK,index);if(i)/x-Book_Number = index;head = Dell(index);/删除图书load_book( head );/更新图书库图书信息Load_Book( head );/更新图书库图书信息save_printf(1,nt删除成功!n);else save_printf(1,nt删除失败,馆内不存
19、在该书!n);3.2、我的图书馆管理模块选择switch(n) case 1: Information();break;/输出个人信息、状态 case 2: Amend( login );break;/修改密码 case 3: Checkdata();break;/当前借阅信息case 4: Recall();break;/催还信息case 5:Check_out(head);break;/借书case 6: Return_book( head );break;/还书case 7: Find_Book(head);break;/查找case 0: Admin_menu();break;/还回首
20、页/default: printf(tttt输入信息错误,请重新输入!n); break; 3.2.1、修改密码输入新密码从密码文件中读取原密码修改密码写会密码文件修改完成/*采用 * 字符输入密码*/while ( (c=getch() != 13 )if (c!=b & c!=t & count0)printf(b b); count-; passcount = 0;password = pass;coutendl;/*导入密码文件,读取密码和账号*/char *file= password;ofstream fout;fout.open( file, ios:out );if( !fou
21、t.is_open() )cerrfile 修改失败!endl;exit(1);foutusernamesetw(20)passwordsetw(20)login.UserName;/修改后,重新写会密码文件fout.close();login.amend( username, password);3.2.2、借书输入借书数目i sum输入借书编号是否找到?添加该书到个人图书库中 i = i + 1YNNY从个人图书库中查找该书/*借书*/void Library_card( book_Record p );void Load_Book( book_Record head );void Che
22、ck_out( book_Record head )system(cls);system(color f9);save_printf(nt n);save_printf( t n);save_printf( t *借*书*界*面* n);save_printf( t n);save_printf( t n);save_printf( t n);Traverse_Book(BK);int st;int sum,i=0;book_Record p;int st13,st23;int st3;elemtype st4,st5;ifstream fin;coutsum;while( ist;coutB
23、ook_Number = st )if( p-Extant_Num != 0 )fin.open( librarydata.txt, ios:in );if( fin.is_open() )while( finst10 & finst11 & finst12 & finst20 & finst21 & finst22 & finst3 & finst4 & finst5 )if( st3 = st )f = 1;flag = 1;cout你已经借了这本书了!endl;break;elsecout打开文件失败!Extant_Num-;flag = 1;/添加到个人图书库中Library_card
24、( p );fin.close();break;p = p-next ;if( flag = 0 )if( p != NULL )cout该书已被借完!endl;elsecout 图书馆无此书!endl;i+;/更新图书库信息Load_Book( head );system(pause);3.2.2、还书/*还书*/输入还书数目i sum输入还书编号是否找到?从个人图书库中删除该书 i = i + 1YNYN从个人图书库中查找该书void Return_Book( book_Record p );void Return_book( book_Record head )system(cls);s
25、ystem(color f9);save_printf(nt n);save_printf( t n);save_printf( t *还*书*界*面* n);save_printf( t n);save_printf( t n);save_printf( t n);int st;int sum,i=0;book_Record p;coutsum;while( ist;coutBook_Number = st )if( p-Extant_Num Gross_Num )p-Extant_Num+;Return_Book( p );/删除该书,更新个人图书库flag = 1;/coutn编号set
26、w(20)书名setw(20)作者endl;/coutBook_Numbersetw(20)Book_Namesetw(15)Book_Writerendl;coutn编号: Book_Numberendl;coutn书名: Book_Nameendl;coutn作者: Book_Writerendl;break;elsecout您没有借这本书!next ;if( flag = 0 )cout 图书馆无此书!输入编号错误!menu tnn);Init_Book(BK);Init_Reader(Rr);Admin_menu();return 0;/head.h/*- 一、包含的头文件-*/#in
27、clude#include#include #include#include#include#include #include /包含内存分配函数的函数声明;还定义常量和表现由堆例程使用的类型#include /标准输入输出头文件#include /定义了通过控制台进行数据输入和数据输出的函数#include /定义了五种类型、一些宏和通用工具函数.包含了C、C+语言的最常用的系统函数#include #include /时间和日期处理函数#include #include using namespace std; /使用命名空间std/*- 二、所需函数-*/void Admin_menu(
28、);/*- 三、宏定义和常量-*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define EQ(a,b) (a)=(b)#define LT(a,b) (a)(b)#define m 3 /2-3树的阶#define N 20 / 每种书最大库存20本、读者最多每人借 20/4 = 5 本typedef int Status; /函数的类型,其值是函数结果状态代码typedef int KeyType; /设关键字域为整型typedef string elemtype;/*- 四、所需结构体和类-*/登陆类class Loginpublic:Login();void amend( const string st1,const string st2);bool IsLogin(string &str1, string &str2);string UserName;string UserID;str