图书馆.docx
《图书馆.docx》由会员分享,可在线阅读,更多相关《图书馆.docx(25页珍藏版)》请在冰豆网上搜索。
图书馆
《数据结构的课程设计》
报告
题目:
图书馆管理系统的设计与实现
班级:
1612401
学号:
161240113
姓名:
张修鸣
指导老师:
孙涵
完成日期:
2014.1.3
目录
一.需求分析.
二.程序主要功能.
三.程序运行平台.
四.程序类说明.
五.模块分析.
六.存在的不足与对策.
七.体验感悟
八.程序源代码.
需求分析
本系统旨在实现一个小型的图书管理系统,对于一个小型的图书馆或藏书室来说,实施本系统不仅可以减少工作人员数量,降低成本,而且可以大大提高工作效率,降低工作强度,方便读者借书查书并且建立读者信息库以及图书信息库,更方便工作人员对图书进行更有效的管理。
记录并统计图书使用情况。
程序主要实现读者管理、图书基本信息及库存管理、图书借还管理以及一些辅助功能等。
程序主要功能
该程序的主要功能有:
●图书信息管理
可以进行查找图书、、显示全部等操作。
其中添加内容包括:
书名、图书编号、作者、出版商、出版日期、是否在架等,方便读者根据不同需要进行查找、查看;
●图书借还功能
应该说这是整个系统最主要的功能,此时应先输入借书人员信息,在将所借图书信息输入,系统将自动完成借书过程。
还书与借书相似,在此不做过多解释;
●退出系统
运行程序后每一步都会有详细的提示,操作简便,可以放心使用!
(1)图书信息包括图书ID号,图书名,出版社名,出版年月,馆藏册数。
(2)学生信息包括学号,姓名,班级,在借册数,已还册数,违约次数。
(3)借阅信息包括图书ID号,图书名,学号,姓名,借阅日期,应还日期,归还日期。
(4)采用顺序存储线性表表示图书信息。
采用顺序存储线性表表示学生信息。
采用双向循环链表表示借阅信息。
其中一个双向循环链表表示在借的借阅信息,按照图书ID号非递减排序;另一个双向循环链表表示已还的借阅信息,按照图书ID号非递减排序。
(5)图书信息,学生信息、借阅信息采用文件方式输入。
图书信息示例如下,每条信息一行:
16000001数据结构清华大学出版社2012.1030
学生信息示例如下,每条信息一行:
161340106张三1613401510
借阅信息示例如下,每条信息一行:
标志位1(1表示借阅2表示归还)16000001数据结构161340106张三2013.9.12(借阅时表示借阅日期,应还日期自动生成,根据借阅日期+60天;归还时表示归还日期,归还日期要在借阅日期之后,应还日期之前,如果超过应还日期,则记录一次违约次数)。
例如借阅:
116000001数据结构161340106张三2013.9.12
归还:
216000001数据结构161340106张三2013.10.20
(6)规定每位学生不能同时借阅同一本书两本及以上。
图书归还后,将该条借阅信息从借阅链表中转移到归还链表中。
(7)要求模拟数据中图书信息至少30本以上,学生信息至少20条以上,借阅信息至少50条以上。
(8)能够统计每一本图书被借阅次数(已还),在借册数。
查询每一位学生的借阅历史明细记录。
统计学生平均借阅次数,最大借阅次数,最少借阅次数。
(9)可在此要求基础上进行功能扩展。
程序运行平台
该程序是用VC++6.0制做的,使用MicrosoftVisualC++6.0运行该程序,具体操作是:
打开MicrosoftVisualC++6.0,菜单栏里点文件→打开工作区→找到“图书管理系统.dsw”这个文件→打开,或者在资源管理器中双击该文件,此时,VC++6.0会自动打开,并载入该系统相关资源,点击Run命令菜单或者或用快捷键Ctrl+F5运行该程序。
trl计分析能_________________________________________________________________________________________________________________________
程序类说明
书籍类记录
public:
intno;//图书编号
charbname[20];//图书名称
charautor[20];//出版厂家
structbook{
intno;//图书编号
charbname[20];//图书名称
charautor[20];//生产厂家
chardate[20];//日期
};
typedefstruct{
intno;//图书编号
charname[20];//图书名称
charautor[20];//生产厂家
chardate[20];//日期
intl;
intltime;//在借数目
intrtime;//已还数目
}Book;
读者类
typedefstruct{
charname[10];//姓名
intnum;//学号,
intClass;//班级
intlstu;//在借册数
intrstu;//已还册数
intdisobey;//违约次数
inttimes;//借阅次数
}stu;
记录模块
typedefintElemType;
typedefchardatatype;
typedefstructnode
{
intfreq;
intno;//编号
charbname[20];//书名
intnum;//学号
charname[10];//姓名
intLDy,LDm,LDd;//借书日期
intRdy,Rdm,Rdd;//应还日期
intRDy,RDm,RDd;//还书日期
structnode*next;
structnode*prior;
}NODE,*DuLinkList;
函数分析:
Voidshow()显示图书库中的书籍信息
intfind()从图书库中查找书籍
voidsetRd(int&Rdy,int&Rdm,int&Rdd,inty,intm,intd)生成应还日期
voidz(inti,SqList&L,SqList2&L3,DuLinkList&L1,DuLinkList&L2)管理员界面
voidlend(SqList&L,SqList2&L3,DuLinkList&L1)使用借书程序
voidrev(SqList&L,SqList2&L3,DuLinkList&L1,DuLinkList&L2)使用还书程序
voidshowself(char*q)自身借书查询
voidSH(SqList&L)//书的借阅情况
模块分析
我设计的是一个图书馆管理系统,主要分为3大模块1书籍模块2读者模块3记录模块
该系统主要完成以下功能:
1书籍模块:
1书籍查询
2顺序存储线性表表示图书信息
2读者模块
1学生信息查询
2借书
3还书
4借书查询
3记录模块
1生成应还日期
2建立借书表
3建立还书表
4显示书籍借还情况
系统特点:
系统要能够对相应的数据进行很好的测试,系统的统计对每一种书籍,的名称,编号,作者,数量在文件中进行进行记录;系统数据的读者的借书情况也在文件中储存,使数据可以很好的储存和调用;系统统计书籍的基本信息较全面,包括每一种书籍,的名称,编号,作者,数量;
书籍查询
学生信息
借书表
查询学生借阅信息
书籍借阅信息
存在的不足与对策
由于自身能力有限,所以没有设计添加书籍的功能,也没有将新的信息保存在文件中。
在设计过程中由于设计者的编程功底欠缺,因此学习过程较为艰辛,需要解决的问题也比较多。
在以后的学习中,应该循序渐进,不可急于求成,先打好基础,这样才能更好地发展。
体验感悟
在编写程序的过程中,深切的体会到自身能力还有待提高,通过大规模的查询网上资料与相关书籍我学习到了很多以前不知道的编程方法与各种奇妙的函数语句时,提高了自己对程序设计本身的兴趣,更加乐意去学习这方面的新的东西,并在不断地自我挑战中收获着,或知识技能,或信心勇气。
希望自己在今后的学习中可以更好的完善自我。
程序源代码
#ifndefLIBRARY_H
#defineLIBRARY_H
#include
#include
#include
#include
usingnamespacestd;
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
#defineTRUE1
#defineFALSE0
#defineERROR0
#defineOK1
#defineOVERFLOW-2
structbook{
intno;//图书编号
charbname[20];//图书名称
charautor[20];//生产厂家
chardate[20];//日期
};
typedefstruct{
intno;//图书编号
charname[20];//图书名称
charautor[20];//生产厂家
chardate[20];//日期
intl;
intltime;//在借数目
intrtime;//已还数目
}Book;
Book*p;
Book*q,*newbase;
typedefstruct{
Book*elem;
intlength;
intlistsize;
}SqList;
intIistList_Sq(SqList&L)//构造一个空线性表L
{
L.elem=(Book*)malloc(LIST_INIT_SIZE*sizeof(Book));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
intIistDelete_Sq(SqList&L,inti,Book&e){//在顺序线性表L中删除第i个元素,并返回e
if((i<1)||(i>L.length))returnERROR;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
returnOK;
}
intIistInsert_Sq(SqList&L,inti,Booke){//在顺序线性表L中第i个位置之前插入新的元素e
if(i<1)returnERROR;
if(L.length>=L.listsize){
newbase=(Book*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(Book));
if(!
newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L.length;
returnOK;
}
voidSET(SqList&L)
{
Bookq;
intno;//图书编号
charname[20];//图书名称
charautor[20];//生产厂家
chardate[20];//日期
intl;
inti=1;
FILE*fp;
charc;
if((fp=fopen("a.txt","r"))==NULL)
{
cout<<"文件打开失败!
\n";
exit(0);
}
do{
fscanf(fp,"%d%s%s%s%d",&no,name,autor,date,&l);
q.no=no;
strcpy(q.name,name);
strcpy(q.autor,autor);
strcpy(q.date,date);
q.l=l;
q.ltime=q.rtime=0;
IistInsert_Sq(L,i,q);
i++;
c=fgetc(fp);
if(c=='#')break;
}while(!
feof(fp));
fclose(fp);
}
voidShow(SqList&L){
inti;
cout<<"*图书目录*"<cout<<"*******************************************************"<for(i=0;i{
cout<<"编号:
"<cout<<"书名:
"<cout<<"厂家:
"<cout<<"出版日期:
"<if(L.elem[i].l>0)
cout<<"现有"<else
cout<<"已借完\n";
}
cout<<"*******************************************************"<}#endif
#ifndefSTUDENT_H
#defineSTUDENT_H
#include
#include
#include
#include
usingnamespacestd;
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
#defineTRUE1
#defineFALSE0
#defineERROR0
#defineOK1
#defineOVERFLOW-2
typedefstruct{
charname[10];//姓名
intnum;//学号,
intClass;//班级
intlstu;//在借册数
intrstu;//已还册数
intdisobey;//违约次数
inttimes;//借阅次数
}stu;
typedefstruct{
stu*elem;
intlength;
intlistsize;
}SqList2;
intIistList_Sq1(SqList2&L)//构造一个空线性表L
{
L.elem=(stu*)malloc(LIST_INIT_SIZE*sizeof(stu));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
intIistInsert_Sq1(SqList2&L,inti,stue){//在顺序线性表L中第i个位置之前插入新的元素e
if(i<1)returnERROR;
stu*p,*q,*newbase;
if(L.length>=L.listsize){
newbase=(stu*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(stu));
if(!
newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L.length;
returnOK;
}
voidreadstu(SqList2&L){
FILE*fp;
stuq;
inti=1;
charname[10],c;//姓名
intnum;//学号,
intClass;//班级
intlstu;//在借册数
intrstu;//已还册数
intdisobey;//违约次数
if((fp=fopen("b.txt","r"))==NULL)
{
cout<<"文件打开失败!
\n";
exit(0);
}
do{
fscanf(fp,"%s%d%d%d%d%d",name,&num,&Class,&lstu,&rstu,&disobey);
strcpy(q.name,name);
q.num=num;
q.Class=Class;
q.lstu=lstu;
q.rstu=rstu;
q.disobey=disobey;
c=fgetc(fp);
q.times=lstu+rstu;
IistInsert_Sq1(L,i,q);
i++;
if(c=='#')break;
}while(!
feof(fp));
fclose(fp);
}
voidShow2(SqList2&L){
inti;
cout<<"*学生目录*"<cout<<"*******************************************************"<for(i=0;i{
cout<<"学号:
"<cout<<"姓名:
"<cout<<"班级:
"<cout<<"在借数目:
"<cout<<"已还数目:
"<cout<<"违约次数:
"<}
cout<<"*******************************************************"<}
voidTime(SqList2&l)
{
intmax,min,all;
floatavd;
max=min=all=l.elem[0].times;
for(inti=1;iif(maxif(min>l.elem[i].times)min=l.elem[i].times;
all=all+l.elem[i].times;
avd=(float)all/(float)l.length;}
printf("最大借阅次数%d最少借阅次数%d平均:
%5.2f\n",max,min,avd);
}
#endif
#ifndefRECORD_H
#defineRECORD_H
#include"iostream"
usingnamespacestd;
#include
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineERROR0
#defineOK1
#defineOVERFLOW-2
typedefintElemType;
typedefchardatatype;
typedefstructnode
{
intfreq;
intno;//编号
charbname[20];//书名
intnum;//学号
charname[10];//姓名
intLDy,LDm,LDd;//借书日期
intRdy,Rdm,Rdd;//应还日期
intRDy,RDm,RDd;//还书日期
structnode*next;
structnode*prior;
}NODE,*DuLinkList;
voidsetRd(int&Rdy,int&Rdm,int&Rdd,inty,intm,intd){//生成应还日期
inti=0;
if(y%4==0&&y%100!
=0)i=1;
if(y%400==0)i=1;
if(m==3||m==4||m==5||m==6||m==8||m==9||m==10)
{Rdd=d-1;Rdy=y;Rdm=m+2;}
if(m==7){Rdd=d-1;Rdy=y;Rdm=m+2;}
if(m==11){Rdd=d-1;Rdy=y+1;Rdm=1;}
if(m==12){Rdd=d-1;Rdy=y+1;Rdm=2;}
if(m==12&&d==30&&i==0){Rdd=1;Rdy=y+1;Rdm=3;}
if(m==12&&d==31&&i==0){Rdd=2;Rdy=y+1;Rdm=3;}
if(m==12&&d==31&&i==1){Rdd=1;Rdy=y+1;Rdm=3;}
if(m==1){Rdd=d+1;Rdy=y;Rdm=m+2;}
if(m==1&&d==31&&i==0){Rdd=1;Rdy=y;Rdm=4;}
if(m==1&&i==1){Rdd=d;Rdy=y;Rdm=m+2;}
if(m==2){Rdd=d+1;Rdy=y;Rdm=m+2;}
if(m==2&&i==1){Rdd=d;Rdy=y;Rdm=m+2;}
}
voidIistbook(SqList&L,intx,intRD)
{
for(inti=0;iif(L.elem[i].no==x){
if(RD==0)
L.elem[i].ltime++;
elseL.elem[i].rtime++;}
}
structnode*create(intJ,SqList&L1){//创建双向循环链表
FILE*