图书馆管理系统 数据结构大作业.docx

上传人:b****7 文档编号:8654356 上传时间:2023-02-01 格式:DOCX 页数:39 大小:136.96KB
下载 相关 举报
图书馆管理系统 数据结构大作业.docx_第1页
第1页 / 共39页
图书馆管理系统 数据结构大作业.docx_第2页
第2页 / 共39页
图书馆管理系统 数据结构大作业.docx_第3页
第3页 / 共39页
图书馆管理系统 数据结构大作业.docx_第4页
第4页 / 共39页
图书馆管理系统 数据结构大作业.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

图书馆管理系统 数据结构大作业.docx

《图书馆管理系统 数据结构大作业.docx》由会员分享,可在线阅读,更多相关《图书馆管理系统 数据结构大作业.docx(39页珍藏版)》请在冰豆网上搜索。

图书馆管理系统 数据结构大作业.docx

图书馆管理系统数据结构大作业

 

封面

 

数据结构

课程设计报告

图书管理信息系统

 

二〇一三年十二月

本程序是图书管理信息系统的实现,具体功能包括读者注册、登录、新书增添、图书查询、图书搜索、借还书、读存盘等。

程序流程如下:

 

任务分析:

1.新书入库:

新到书籍入库包含几方面的操作:

首先查询该书名的书籍在图书馆信息中是否已经存在,若存在,则增加可借数量和总库存量,若不存在,则新增加概述信息,从界面输入书籍的编号(0~999999的长整型)、书名(字符串类型)、作者名(字符串类型)、出版社信息(字符串类型)、出版日期(整型)、该书的现存量(整型)、该书的总量(整型)。

输入该信息之后,将该节点插入到书籍信息链表中去。

该节点的插入位置根据查找,找到合适的位置插入,这样可以保证整个数据都是有序的,方便查找。

2.读者注册:

没有账号和密码读者和管理员都不能登录系统,系统默认第一个注册系统的是系统管理员,借阅号为1000,权限是1,并输入密码000000及基本信息,并将所借书信息区全部置零。

不是第一个注册的读者,借阅号从1000往后顺延,自己设置密码,权限为0,其余信息与管理员相同,因此登陆之后,管理员可以看到“入库”菜单选项,普通读者不能看到该选项。

3.借书:

书籍借阅主要涉及存书库和读者信息库的更新。

用户首先登陆系统,通过3种查询方式查询该书是否存在,并判断该书的剩余数量是否大于零,最后查询该读者是否已经借满书籍。

若以上条件都满足,则将该书编号存入该读者的借阅信息区,将该读者的可借书数量减1,该存书的可借数量减1。

4.还书:

读者登录后按书名号来归还所借书籍,若书名号正确并且确认归还该书籍,则从读者的借书区删除该书籍,读者的可借书数量加1,将该书的可借数量增加1,然后返回。

5.信息查询:

信息查询分为读者信息查询和书籍信息查询,读者信息查询是在读者登录之后,可以显示本人的基本信息以及借书状况(所借书的本数、可借书本数以及所借书的信息),还可查询书籍信息,可根据书籍的编号来查找书籍、根据书名来查找书籍、根据作者名来查询书籍。

查询到该书籍后显示是否借阅该书籍。

算法设计:

1、查找

查找分按书名查找、按作者查找和按书号查找。

按书名查找是采用遍历线性链表的方式,从首元结点开始向下遍历,检查输入的书名和已存的书名是否匹配,如果匹配,则将该书籍的指针返回,然后查找结束。

若直到最后也没找到,则返回空。

按作者查找则根据输入的作者名,从书籍链表的首元结点开始遍历,检查记录中的读者信息和输入的是否匹配,若找到匹配的,则输出该书籍信息,然后继续向下遍历,直到链表尾部,查找结束。

按书号查找则是根据建立的索引表来查找记录。

2、读者信息存储

读者信息采用线性单链表存储,设置头结点,头结点不存储数据,初始化时头结点->next设置为空,然后每从文件中读取一组数据,则将该数据存入新开辟的空间,链接到读者信息链表中,再将该数据的next置空。

3、图书信息存储

书籍信息存储采用单链表存储,设置头结点,头结点不存储数据,头结点的next为空,初始化时,从文件中读取一个格式化的数据,则将该数据存入新开辟的空间,并将该节点链接到链表中去,将next置空。

程序主要函数:

1.增加图书:

voidinsert(book*bhead);输入书号,判断是否合法,然后输入图书信息。

流程图如下

 

2.借书:

voidborrow(reader*temp,book*Bhead);通过书号、书名、作者三种查找方式查询借书,借书成功后,该书的可借书量减1,读者借书量减1。

流程图如下:

3.还书:

voidreturnbook(book*bhead,reader*temp);输入书号,查询是否存在,然后还书,该书的可借书量加1,读者借书量加1。

流程图如下:

详细程序模块

1、头文件定义

头文件library.h定义了3个结构体:

书籍结构体、读者结构体和索引表结构体,

书籍结构体的定义如下:

typedefstructREADER{

longnumber;//借阅号

charname[15];//读者姓名

charsex;//读者性别

charpassword[16];//读者的密码

intresidue;//读者的剩余可借书籍数量

longborrowed[10];//读者已经借阅的书籍编号

intlimit;//读者权限

structREADER*next;

}reader;

读者结构体的定义如下:

typedefstructBOOK{

longnumber;//书籍编号

charname[30];//书名

charauthor[30];//作者

charpress[30];//出版社信息

longpresstime;//出版日期

intexist;//在库数量

inttotal;//总数量

structBOOK*next;

}book;

索引表结构体的定义如下:

typedefstructKEY{

longkey;

book*adress;

structKEY*next;

}keynode;

头文件还包含一些系统头文件的声明:

#include"stdio.h"

#include"string.h"

#include"conio.h"

#include"windows.h"

还有一些函数的声明,用#ifndef、#endif来包含,以免重复包含。

2、插入模块

插入模块分为书籍入库、注册、登陆3大块,分3个函数,声明如下:

voidinsert(book*bhead);//入库

voidreg(reader*head);//注册

reader*login(reader*rhead,book*bhead);//登陆

这3个函数分别实现新书入库、读者注册、登陆等功能,入库功能只有管理员才能调用,其余函数均可以调用。

3、读写模块

此模块主要实现向文件写入、读取数,主要是2个文件:

reader.txt、book.txt,分为4个函数:

读者读写函数,书籍读写函数。

定义如下:

book*Bload();//书籍链表读取

reader*Rload();//读者链表读入

voidBsave(book*Bhead);//书籍链表写入

voidRsave(reader*Rhead,book*bhead);//读者链表写入

读者和书籍链表的初始化就由读取函数完成,若文件为空则返回空指针,若不为空,则将文件里面的信息写入到链表中,每读出一个数据,分配一个空间,将该信息输入。

4、查找模块

查找模块分书籍查找模块、读者查找模块,书籍查找模块分线性链表查询、遍历查询、索引表查询,读者查询直接遍历读者链表,查找该读者,若存在,返回指针,不存在则返回NULL。

查找模块的定义如下:

book*S_name(book*head,charname[]);//按书籍名查找函数

voidS_author(book*head);//按作者查找

keynode*initindex(book*head);//初始化建立索引表

book*S_number(longnum,book*bhead);//按书号查找

reader*S_reader(reader*rhead,longnum);//查找读者

5、显示模块

根据给出的节点指针,显示该节点所包含的信息,显示分为读者显示和书籍信息显示,读者信息显示包含书籍信息显示,以便显示读者所借书的信息。

这两个函数的声明如下:

voidshowR(reader*tr,book*bhead);//显示读者信息函数

voidshowB(book*p);//显示书籍信息函数

这个模块还有2个小函数,用于将存入的性别’F’、’M’转化成汉字,将存的权限“1”、“0”转化成“管理员”、“读者”输出,这两个函数的定义如下:

char*sc(charp)

{

if(p=='F'||p=='f')

return"女";

else

return"男";

}

char*lc(inti)

{

if(i==1)

return"管理员";

else

return"读者";

}

程序运行结果

1.登录界面:

2.入库界面:

3.借书界面:

4.还书界面:

5.个人信息查询界面:

体会

这次的大作业让我复习并实际运用本学期学的数据结构的有关知识,例如数据的存储、排序、调用、查找等,加深了对数据结构和C语言的理解,总的来说,收获颇丰。

代码

头文件library.h

#ifndefLIBRARY_INCLUDE

#defineLIBRARY_INCLUDE

#include

#include

#include

#include

#include

#include

typedefstructBOOK{

longnumber;

charname[30];

charauthor[30];

charpress[30];

longpresstime;

intexist;

inttotal;

structBOOK*next;

}book;

typedefstructKEY{

longkey;

book*adress;

structKEY*next;

}keynode;

typedefstructREADER{

longnumber;

charname[15];

charsex;

charpassword[16];

intresidue;

longborrowed[10][2];

intlimit;

structREADER*next;

}reader;

char*lc(inti);

char*sc(charp);

voidshowR(reader*tr,book*bhead);

voidshowB(book*p);

book*S_name(book*head,charname[]);

voidS_author(book*head);

keynode*initindex(book*head);

voiddelkey(keynode*keyhead);

book*S_number(longnum,book*bhead);

reader*S_reader(reader*rhead,longnum);

book*Bload();

reader*Rload();

voidBsave(book*Bhead);

voidRsave(reader*Rhead,book*bhead);

voidinsert(book*bhead);

voidreg(reader*head);

reader*login(reader*rhead,book*bhead);

voidborrow(reader*temp,book*Bhead);

voidreturnbook(book*bhead,reader*temp);

voidstyle();

voidintpsd(char*psd);

voidmenu(structBOOK*Bhead,reader*Rhead);

voidmenu2(reader*temp,reader*rhead,book*bhead);

longbacktime();

#endif

借还书文件borrow_return.cpp

#include"library.h"

voidborrow(reader*temp,book*Bhead)

{

style();

longnum;

inti;

chart,k,name[30];

book*Bbook;

getch();

system("cls");

while

(1)

{

printf("\n┏━━━━━━━━━━┓");

printf("\n█━━━━━━━━━━━┫借书┣━━━━━━━━━━━█");

printf("\n┗━━━━━━━━━━┛");

printf("\n请输入您要查找借阅书籍的方式:

");

printf("\n1、按书号查找\n");

printf("\n2、按作者查找\n");

printf("\n3、按书名查找\n");

printf("\n4、返回主菜单\n");

t=getch();

switch(t)

{

case'1':

{

printf("\n请输入您要查找的书籍编号:

");

scanf("%d",&num);

if((Bbook=S_number(num,Bhead))!

=NULL)

{

showB(Bbook);

printf("\n请问你是否要借阅该书籍?

Y/N");

k=getch();

if(k=='Y'||k=='y')

gotoborrow;

else

break;

}

else

break;

}

case'2':

{

S_author(Bhead);

break;

}

case'3':

{

printf("\n请输如您要查找的书籍名:

");

scanf("%s",name);

if((Bbook=S_name(Bhead,name))!

=NULL)

{

showB(Bbook);

printf("\n请问你是否要借阅该书籍?

Y/N");

k=getch();

if(k=='Y'||k=='y')

gotoborrow;

else

break;

}

else

continue;

break;

}

default:

return;

borrow:

if(Bbook!

=NULL&&temp->residue>0&&Bbook->exist>0)

{

temp->residue--;

Bbook->exist--;

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

{

if(temp->borrowed[i][0]==0)

{

temp->borrowed[i][0]=Bbook->number;

temp->borrowed[i][1]=backtime();

break;

}

}

printf("\n借阅成功!

");

}

else

if(!

(temp->residue>0))

printf("\n您只能借阅10本书籍!

");

else

if(!

(Bbook->exist>0))

printf("\n该书没有库存,请借阅其他书籍!

");

printf("\n您要继续借阅书籍吗?

Y/N");

t=getch();

if(t=='y'||t=='Y')

continue;

else

break;

}

}

}

voidreturnbook(book*bhead,reader*temp)

{

longnum;

inti,j=0;

chart;

book*p;

printf("\n┏━━━━━━━━━━┓");

printf("\n█━━━━━━━━━━━┫还书┣━━━━━━━━━━━█");

printf("\n┗━━━━━━━━━━┛");

printf("\n\n请输入您所还书的编号:

");

scanf("%d",&num);

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

{

if(num==temp->borrowed[i][0])

j=1;

}

p=S_number(num,bhead);

if(p!

=NULL&&j==1)

{

printf("\n┌────┬──────┬───────┬────┬───────┐");

printf("\n│书本编号│书籍名称│出版社名称│出版时间│作者│");

printf("\n├────┼──────┼───────┼────┼───────┤");

printf("\n│%8d│%12s│%14s│%8d│%14s│",p->number,p->name,p->press,p->presstime,p->author);

printf("\n└────┴──────┴───────┴────┴───────┘\n");

printf("\n确认归还该书籍?

Y/N");

t=getch();

if(t=='Y'||t=='y')

{

p->exist++;

temp->residue++;

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

{

if(temp->borrowed[i][0]==num)

{

temp->borrowed[i][0]=0;

temp->borrowed[i][1]=0;

break;

}

}

}

elsereturn;

}

else

{

printf("\n编号有误,请仔细检查!

");

}

}

新书入库insert.cpp

#include"library.h"

voidinsert(book*bhead)

{

style();

longt;

book*temp1,*temp,*temp2;

temp1=bhead->next;

printf("\n┏━━━━━━━━━━┓");

printf("\n█━━━━━━━━━━━┫入库┣━━━━━━━━━━━█");

printf("\n┗━━━━━━━━━━┛");

while

(1)

{

printf("\n请输入您给定书的编号(6位以内的正整数):

");

scanf("%d",&t);

if(t<=0||t>999999)

{

printf("\n您的编号不在处理范围(1~999999)之内!

");

fflush(stdin);

continue;

}

else

{

temp2=S_number(t,bhead);

if(temp2==NULL)

{

break;

}

else

{

temp2->total++;

temp2->exist++;

printf("\n编号为%d的书已存在,入库成功!

",t);

return;

}

}

}

temp=(book*)malloc(sizeof(book));

temp->number=t;

printf("\n请输入书名:

");

scanf("%s",temp->name);

printf("\n请输入本书作者:

");

scanf("%s",temp->author);

printf("\n请输入本书出版社:

");

scanf("%s",temp->press);

printf("\n请输入本书出版时间:

");

scanf("%d",&temp->presstime);

temp->next=NULL;

temp->total=1;

temp->exist=1;

if(bhead->next==NULL)

bhead->next=temp;

else

{

while(temp1->next!

=NULL&&temp1->numbernumber)

temp1=temp1->next;

temp->next=temp1->next;

temp1->next=temp;

}

printf("\n┏━━━━━━━━━━┓");

printf("\n█━━━━━━━━━━━┫入库成功┣━━━━━━━━━━━█");

printf("\n┗━━━━━━━━━━┛");

}

voidreg(reader*head)

{

style();

longi=1000;

intj;

chart1[16],t2[16];

reader*temp=head->next;

reader*p;

p=new(reader);

printf("\n┏━━━━━━━━━━┓");

printf("\n█━━━━━━━━━━━┫注册┣━━━━━━━━━━━█");

printf("\n┗━━━━━━━━━━┛");

printf("\n请输入姓名:

");

scanf("%s",p->name);

fflush(stdin);

while

(1)

{

printf("\n请输入性别:

\nM:

男性:

\nF:

女性:

");

p->sex=getchar();

if(p->sex=='F'||p->sex=='f'||p->sex=='M'||p->sex=='m')

break;

else

printf("\n阁下既非男,又非女,莫非来自泰国?

");

}

while

(1)

{

while

(1)

{

printf("\n请输入您的密码:

");

intpsd(t1);

if(strlen(t1)<=4)

printf("\n您设置的密码过于简单,请重新设置:

");

else

break;

}

printf("\n请确认您的密码:

");

intpsd(t2);

if(strcmp(t1,t2)==0)

{

strcpy(p->password,t1);

break;

}

else

printf("\n您两次输入的密码不一致!

");

}

p->residue=10;

p->next=NULL;

for(j=0;j<10;j++)

{

p->borrowed[j][0]=0;

p->borrowed[j][1]=0;

}

if(temp==NULL)

{

p->number=i;

head->n

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文化宗教

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1