数据结构课程设计图书管理.docx
《数据结构课程设计图书管理.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计图书管理.docx(122页珍藏版)》请在冰豆网上搜索。
数据结构课程设计图书管理
数据结构课程设计报告
题目:
图书管理
学院计算机学院
专业软件工程
年级班别2010级4班
学号
学生姓名
指导教师
成绩____________________
2012年6月
一、设计任务【DesignTasks】
1.1、图书管理系统中图书管理模块包括图书类型定义:
书号、现存量、总存量,出版时间为整型,定价为浮点型,书名、著者名为字符型,借阅指针、预约指针为读者类型;读者类型定义:
证号为整型、姓名为字符型,另外借阅类型和预约类型组合成其中的共用体类型。
B树(2-3树)类型定义:
关键字个数和关键字数组为整型、另外还有指向双亲的指针、指向子树的指针、记录单元指针;B树查找结果类型定义:
节点指针、关键字序号和查找标志变量为整型。
1.2、演示程序以用户和计算机的对话方式进行,在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在后面。
该演示系统,没有使用文件,全部数据放在内存存放。
四项基本业务都以书号为关键字进行的,采用了B树(2-3树)对书号建立索引,以提高效率。
2、设计思路【DesignIdeas】
2.1、设计框图
2.2、结构体设计
/*-------------------四、所需结构体和类-------------------*/
//登陆类
classLogin
{
public:
Login();
voidamend(conststringst1,conststringst2);
boolIsLogin(string&str1,string&str2);
stringUserName;
stringUserID;
stringPassWord;
intErrorNum;
};
//个人信息结构体
typedefstructInformation
{
stringID;
stringName;
stringAcademy;
stringMajor;
stringEducation;
stringState;
intnumber;//超期数目
inttotal;//已借数目
}Inof;
//借阅信息结构体
typedefstructInofBook
{
//stringCheck_Data;
//stringReturn_Data;
intC_Year;
intC_Month;
intC_Day;
intR_Year;
intR_Month;
intR_Day;
intBook_Number;
stringBook_Name;
stringBook_Writer;
structInofBook*next;
}InofBook;
//图书信息类
typedefstruct{
KeyTypeindex;//书号
charB_name[1][20];//书名,可以为中文
charB_writer[1][20];//著者,可以中文
intstack;//现存量
inttotal;//总库存量
inttag;//标志是否被预约1是0否
}B_Record,*b_Record;//书目记录类型
//图书类
structbook
{
public:
Book();
elemtypeBook_Name;
elemtypeBook_Writer;
intBook_Number;
intExtant_Num;//该书现存量
intGross_Num;//该书总量
structbook*next;
};
typedefstructbook*book_Record;
typedefstructbookBook_Record;
typedefstructR_Record{
KeyTypecard;//卡号
charR_name[1][20];//姓名
chartel[11];//手机号码
char*PassWord;
structBorrow{
intyuyue;//存放预约的书号,最多一本
structbNode*R_book[N/4];//借阅书指针
char*term[N/4];//归还期限
intb_num;//已经借阅书的数量
}bor;//借阅记录类型
}R_Record,*r_Record;//读者记录类型
typedefstructbNode{
KeyTypeindex;//关键字向量
structB_Node*child;//子树指针向量
B_Recordrec;//记录指针向量
}bNode,*Bode;//书目结点向量类型
typedefstructrNode{
KeyTypecard;//卡号向量
structR_Node*child;//子树指针向量
R_Recordrec;//记录指针向量
}rNode,*Rode;//读者结点向量类型
typedefstructB_Node{
intBookNum;//结点中书目个数,即结点的大小
intlevel;
structB_Node*pa;//指向双亲结点
structB_Node*lBro,*rBro;
structbNodenode[m+1];//除child外,其它0号单元未用
}B_Node,*Book;//书树结点和书树的类型
typedefstructR_Node{
intReaderNum;//结点中读者个数,即结点的大小
intlevel;
structR_Node*pa;//指向双亲结点
structR_Node*lBro,*rBro;
structrNodenode[m+1];//除child外,0号单元未用
}R_Node,*Reader;//读者树结点和读者树的类型
typedefstruct{
B_Node*pb;//指向找到的结点
inti;//1..m,在结点中的关键字序号
inttag;//1:
查找成功,O:
查找失败
}B_Result;//书树的查找结果类型
typedefstruct{
R_Node*pr;//指向找到的结点
inti;//1..m,在结点中的关键字序号
inttag;//1:
查找成功,O:
查找失败
}R_Result;//读者树的查找结果类型
2.3、宏定义和常量
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineEQ(a,b)((a)==(b))
#defineLT(a,b)((a)<(b))
#defineHT(a,b)((a)>(b)
#definem3//2-3树的阶
#defineN20//每种书最大库存20本、读者最多每人借20/4=5本
typedefintStatus;//函数的类型,其值是函数结果状态代码
typedefintKeyType;//设关键字域为整型
typedefstringelemtype;
2.4、设计模块
主程序模块
↓
图书管理模块
↓↓
图书管理模块我的图书馆管理模块
三、部分代码分析【CodeAnalysis】
3.1、图书管理模块选择
switch(i){
case1:
//添加图书
A_Add_Book(head);
save_printf(1,"\n\t\t书库现状态如下:
\n");
if(BK->BookNum!
=NULL)
Traverse_BK(BK,BK->level);
else
save_printf(1,"\n书库为空");
fprintf(fp,"\n\n");
printf("\n\n");
break;
case2:
//查找图书
A_Search_Book();
break;
case3:
//删除图书
A_Delete_Book(head);
save_printf(1,"\n\t\t书库现状态如下:
\n");
if(BK->BookNum!
=NULL)
Traverse_BK(BK,BK->level);
else
save_printf(1,"\n书库为空");
fprintf(fp,"\n\n");
printf("\n\n");
break;
case4:
//查看全部图书
Search_All_Book();
break;
case5:
//我的图书馆
Mylibrary(head);
break;
case0:
//返回系统登录界面
fprintf(fp,"\n\t\t\t☆\tAdmin_menu-->menu\t☆\n\n");
exit
(1);
break;
default:
save_printf(1,"\n\t您的操作有误,请重新选择(0→7):
");
break;
}
3.2.1、添加图书
/*-----------------------------A_Add_Book------------------------------*/
voidLoad(book_Recordq);
voidA_Add_Book(book_Recordhead){//添加图书
chars[2];
inti;
intj;
book_Recordq;
q=newBook_Record;
B_Recordr;
Init_Brec(r);
do{
book_Recordp=head;
save_printf(1,"\n\t书号:
");
save_gets(s);
r.index=atoi(s);
if(r.index<=NULL||r.index>9999999)
save_printf(1,"\n\t输入有误,请重新输入(1→9999999)!
\n");
/*
**主关键字是图书编号,是唯一的
**输入相同编号,重新输入
*/
while(p!
=NULL)
{
if(p->Book_Number==r.index)
{
r.index=NULL;
cout<<"\t该编号已存在!
"<}
p=p->next;
}
}while(r.index<=NULL||r.index>9999999);
save_printf(1,"\n\t书名:
");
do{
save_gets(r.B_name[0]);
j=strlen(r.B_name[0]);
if(j<=0||j>20)
save_printf(1,"\n\t您输入的书名有误,请重新输入(1→20字符):
");
}while(j<=0||j>20);
save_printf(1,"\n\t著者:
");
do{
save_gets(r.B_writer[0]);
j=strlen(r.B_writer[0]);
if(j<=0||j>20)
save_printf(1,"\n\t您输入的著者有误,请重新输入(1→20字符):
");
}while(j<=0||j>20);
save_printf(1,"\n\t存入数量:
");
do{
save_gets(s);
r.stack=r.total=atoi(s);
if(r.total<=NULL||r.total>N)save_printf(1,"\n\t输入有误,请重新输入(1→20)!
:
");
}while(r.total<=NULL||r.total>N);
i=Add_Book(BK,r);
if(i)
{
/*读取信息*/
q->Book_Number=r.index;
q->Book_Name=r.B_name[0];
q->Book_Writer=r.B_writer[0];
q->Extant_Num=r.stack;
q->Gross_Num=r.total;
Load(q);//将新书添加到图书库中
q->next=head;
head=q;
Load_Book(head);//更新“librarydata.txt”图书信息
save_printf(1,"\n\t添加成功!
\n");
}
else
{
save_printf(1,"\n\t添加失败!
该书书库容量不足!
\n");
}
}
3.2.2、删除图书
/*-----------------------------A_Delete_Book------------------------------*/
book_RecordDell(intindex);
voidload_book(book_Recordh);
voidA_Delete_Book(book_Recordhead){//删除图书
chars[2];
inti;
intindex;
//book_Recordx;
//x=newBook_Record;
do{
save_printf(1,"\n\t请输入您要删除的书的书号:
");
book_Recordp=head;
save_gets(s);
index=atoi(s);
if(index<=0||index>9999999)save_printf(1,"\n\t输入有误,请重新输入(1→9999999)!
\n书号:
");
/*处理图书不出在的情况*/
while(p!
=NULL)
{
if(p->Book_Number==index)
break;
p=p->next;
}
if(p==NULL)
{
index=0;
cout<<"无此书!
"<}
}while(index<=0||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,"\n\t删除成功!
\n");
}
elsesave_printf(1,"\n\t删除失败,馆内不存在该书!
\n");
}
3.2、我的图书馆管理模块选择
switch(n)
{
case1:
Information();break;//输出个人信息、状态
case2:
Amend(login);break;//修改密码
case3:
Checkdata();break;//当前借阅信息
case4:
Recall();break;//催还信息
case5:
Check_out(head);break;//借书
case6:
Return_book(head);break;//还书
case7:
Find_Book(head);break;//查找
case0:
Admin_menu();break;//还回首页
//
default:
printf("\t\t\t\t输入信息错误,请重新输入!
\n");break;
}
3.2.1、修改密码
/*采用*字符输入密码*/
while((c=getch())!
=13)
{
if(c!
='\b'&&c!
='\t'&&count<20)
{
pass[count++]=c;
putchar('*');
}
if(c=='\b'&&count>0)
{
printf("\b\b");
count--;
}
}
pass[count]='\0';
password=pass;
cout</*导入密码文件,读取密码和账号*/
char*file="password";
ofstreamfout;
fout.open(file,ios:
:
out);
if(!
fout.is_open())
{
cerr<"<exit
(1);
}
fout<fout.close();
login.amend(username,password);
3.2.2、借书
/**************************借书********************************/
voidLibrary_card(book_Recordp);
voidLoad_Book(book_Recordhead);
voidCheck_out(book_Recordhead)
{
system("cls");
system("colorf9");
save_printf("\n\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
save_printf("\t※※\n");
save_printf("\t※****************借**书********界**面***************※\n");
save_printf("\t※※\n");
save_printf("\t※※\n");
save_printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
Traverse_Book(BK);
intst;
intsum,i=0;
book_Recordp;
intst1[3],st2[3];
intst3;
elemtypest4,st5;
ifstreamfin;
cout<<"\n\n请输入要借书的数目:
";
cin>>sum;
while(i{
intflag=0;
intf=0;
printf("请输入要借第%d本书的编号:
",i+1);
cin>>st;
cout<p=head;
/*
**查找借阅的书
*/
while(p!
=NULL)
{
if(p->Book_Number==st)
{
if(p->Extant_Num!
=0)
{
fin.open("librarydata.txt",ios:
:
in);
if(fin.is_open())
{
while(fin>>st1[0]&&fin>>st1[1]&&fin>>st1[2]
&&fin>>st2[0]&&fin>>st2[1]&&fin>>st2[2]
&&fin>>st3&&fin>>st4&&fin>>st5)
{
if(st3==st)
{
f=1;
flag=1;
cout<<"你已经借了这本书了!
"<break;
}
}
}
else
{
cout<<"打开文件失败!
"<}
///////////////////////////////////////////////////////
if(f==0)
{
p->Extant_Num--;
flag=1;
//添加到个人图书库中
Library_card(p);
}
fin.close();
}
break;
}
p=p->next;
}
if(flag==0)
{
if(p!
=NULL)
cout<<"该书已被借完!
"<else
cout<<"图书馆无此书!
"<}
i++;
}
//更新图书库信息
Load_Book(head);
system("pause");
}
3.2.2、还书
/**************************还书********************************/
voidReturn_Book(book_Recordp);
voidReturn_book(book_Recordhead)
{
system("cls");
system("colorf9");
save_printf(