数据结构程序.docx
- 文档编号:25770280
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:19
- 大小:74.57KB
数据结构程序.docx
《数据结构程序.docx》由会员分享,可在线阅读,更多相关《数据结构程序.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构程序
《数据结构》课程设计
实验名称:
图书管理系统
授课教师:
肖飞
授课班级:
网工0901班
学期:
2010-2011学年第一学期
姓名:
刘堂伟,夏鑫,贺健军
学号:
200926340127
200926340134,200926340128
班级:
网工0901班
完成日期:
2010年12月1日
一.系统需求
Ⅰ、新书入库
图书信息包括书名,书号,库存量,现存量共4项.首先输入3本书的信息,并将其存入文件“book.dat”中.当有新书入库时,先判断文件中是否有此书(即比较书名),若有则修改库存量,现存量的信息;若无此书,则将该书的信息添加到文件中.
Ⅱ、图书查询
输入一个书号,在文件中查找此书,若找到则输出此书的全部信息;若找不到则输出查找失败的信息.
Ⅲ、借阅管理
每个读者的信息包括姓名、编号、1张借书卡(限借一本书),输入3个读者的信息存入文件“libraryreader”中.
借书登记:
输入读者的编号,所借图书的书号,先判断姓名是否在文件“libraryreader”中,若有则将书号存入一张借书卡上(注:
初始时借书卡的信息都为零,借书后借书卡的信息改为所借书的书号),并修改文件“libraryreader”的相应内容,同时修改文件“book.dat”中此书的现存量.若“libraryreader”无此姓名,则应提示错误
还书管理:
输入读者的编号,所还图书的书号,将借书卡的信息置为零,并修改文件“librarybook”的相应内容,同时修改文件“librarybook”中此书的现存量.
Ⅳ、输出全部图书信息和全部读者信息
备注:
基本功能如上,但在编写过程中,做了一些改动,例如:
初始化一本图书和一位读者;增加了新的功能,例如:
可以增加新的读者、可以删除旧书等.具体功能请看流程图.
二.概要设计
☆根据系统要求,可以将此系统化分为如下模块(即如下函数)
♀:
初始化
第一次运行系统时,直接调用Init()---初始化函数、Init_reader()---初始化读者、Init_book()---初始化图书,这三个函数.只需调用一次。
0----退出系统
可用一个函数exit()来实现。
首先将信息保存到文件,释放动态创建的内存空间,再退出此程序。
即:
exit(0);
1----新书入库
可以用Insert_New_Book()来实现,每次输入一本书的信息,放入开辟的空间中,链入链表。
2----增新读者
原理同上,调用Insert_New_Reader()函数来实现.
3----查询
此功能用4个函数来实现,Find()—查找主菜单、Find_Select()---查找选择菜单、Find_Reader()---查找读者、Find_Book()---查找图书,实现重复不断的进行查找.找到就输出全部信息,找不到就输出查找失败信息。
4----借书登记
调用Borrow_Book()函数来实现,借书时只需记录读者信息即可.
A该读者的编号是否已经存在,如果不存在,则提示错误。
B输入的书号是否存在,如果不存在,则提醒读者不存在此书。
C判断此读者是否借了此书,如果有借,则提醒读者不能同时重复借此书。
D该读者的借阅书是否已满(即借书权限达最大)如果是,则提醒该用户借书已满,不能借书.
E借书过程完成后,对读者信息里的借书信息作记录,并修改现存量和读者的借书权限
5----还书管理
原理同上,调用Return_Book()函数,在函数中要分别判断
A该读者的编号是否已经存在,如果不存在,则提示错误。
B输入的书号是否存在,如果不存在,则提醒读者不存在此书。
C判断此读者是否借了此书,如果没有借,则提醒读者没有借此书。
D还书过程完成后,对读者信息里的借书信息清0,并修改库存量和读者的借书权限
6----关于系统
很简单,调用about(),进行直接打印。
7----旧书出库
调用del_old_book()来实现,出库时需判断图书是否已经都归还.若未归还,则提示用户不能删除此图书信息.
8----删旧读者
使用函数del_old_reader(),删除时需判断读者是否还有书没有还.若未归还,则提示用户不能删除此读者信息.
9----输出全部信息
此功能用4个函数来实现(原理同查找功能),Print()--打印函数、Print_Select()---打印选择函数、Print_book()---打印图书信息、Print_reader()---打印读者信息.直接从Book.dat文件和Reader.dat文件中读取信息并输出
10----现存不足图书
调用函数book_not_enough(),遍历链表,发现现存为0的图书,即打印,否则提示用户目前没有现存不足的图书.
11----保存当前信息
此功能调用6个函数实现,Save()---保存信息函数、Save_Reader()---保存读者信息、Save_Book()---保存图书信息、Load()---加载信息函数、Load_Reader()---加载读者信息、Load_Book()---加载图书信息.♂:
保存文件
原理和11一样.
主要模块流程图:
三.详细设计
★数据结构设计
程序中考虑到图书信息和读者信息中都包含有不同类型的数据,故分别建立图书、读者和借书数目3种类型的结构体,并定义两个分别指向图书和读者的全局指针.由于图书和读者的数量非固定,所以采用动态链式存储来实现。
⊙图书类型:
typedefstructbook
{charbook_num[10];/*图书编号采用10位编码*/
charbook_name[20];/*图书名称(20位)*/
}ElemType;
typedefstructLNode{
ElemTypedata;/*定义结点*/
intbook_kc;/*图书的库存量*/
intbook_xc;/*图书的现存量*/
structbook*next;
}BK;
⊙读者类型
typedefstructreader
{
charreader_num[10];/*读者编号采用10位编码*/
charreader_name[10];/*读者姓名(10位)*/
intright;/*读者的借书权限*/
charborrow_name[N];/*所借书名*/
structreader*next;
}RD;
⊙全局指针
BK*h_book;/*图书指针*/
RD*h_reader;/*读者指针*/
主要模块源代码:
1.初始化:
BK*Init_book()/*初始化图书*/
{BK*h;
h=(BK*)malloc(sizeof(BK));
h->next=NULL;
h->book_kc=0;
h->book_xc=0;
returnh;
}
RD*Init_reader()
{RD*Rd;
Rd=(RD*)malloc(sizeof(RD));
Rd->next=NULL;
returnRd;
}
StatusInit(ListLibrary*L)/*初始化图书馆*/
{BK*Bk;
Bk=Init_book();
L->head=L->tail=Bk;
L->tail=L->head;
L->len=0;
L->current=L->head;
L->curops=0;
return1;
}
2.新书入库:
StatusInsert_New_Book(ListLibrary*L)/*新书入库*/
{BK*p,*q;
inti=0;
q=L->head;printf("thanksforincreasethebook\n");
p=(BK*)malloc(sizeof(BK));
if(!
p)return0;p->next=NULL;
while(q->next)q=q->next;
q->next=p;scanf("%s",(p->data).book_num);
scanf("%s",(p->data).book_name);scanf("%d",&p->book_kc);
scanf("%d",&p->book_xc);getch();return0;
}
3.新增读者:
StatusInsert_New_Reader(RD*Rd)/*增新读者*/
{RD*p,*q;
charstr[20];
printf("Pleaseinputthebook'snameyouwanttoborrow:
");
gets(str);q=Rd->next;p=(RD*)malloc(sizeof(RD));
if(!
p)return0;p->next=NULL;
while(q->next)q=q->next;
q->next=p;printf("Pleaseincreasethereader\n");
scanf("%s",p->reader_num);scanf("%s",p->reader_name);
scanf("%d",&p->right);strcpy(p->borrow_name,"str");
savefla=1;getch();return1;
}
4.借书登记:
Statusborrow_book(ListLibrary*L,RD*reader,charname[],charbk[])/*借书登记*/
{
BK*p;RD*q;
RD*e;
e=Find_Reader(reader,name);
q=Find_Reader(reader,e->reader_name);
if(!
q)return0;p=Find_Book(L,bk);
if(!
p)return0;if(!
q->right)return0;
if(!
p->book_xc)return0;p->book_xc=p->book_xc-1;
strcpy(reader->borrow_name,bk);
reader->right=0;saveflag=1;return1;
}
5.还书管理:
StatusReturn_Book(ListLibrary*L,RD*R,charname[])/*还书管理*/
{BK*p;RD*q;
q=Find_Reader(R,name);
if(!
q){Nofind();return0;}
p=Find_Book(L,q->borrow_name);
if(!
p){Nofind();return0;}q->right=0;
strcpy(q->borrow_name,"0");saveflag=1;return1;
}
6.关于系统:
voidabout()
{textcolor(12);
printf("Thisisalibrarysystem:
\n");
}
7.旧书出库:
Statusdel_old_book(ListLibrary*L,charbk[])/*旧书出库*/
{BK*p,*q;p=q=L->head;
while(q->next)
{if(strcmp(q->next->data.book_name,bk)==0)
break;q=q->next;
}
p=Find_Book(L,bk);if(!
p){Nofind();return0;}
if(p->book_xc!
=p->book_kc)return0;q->next=p->next;
saveflag=1;free(p);
}
8.删除读者:
Statusdel_old_reader(RD*Rd,charname[])/*删旧读者*/
{RD*p,*q;
p=q=Rd->next;
while(q->next)
{if(strcmp(q->next->reader_name,name)==0)
break;q=q->next;
}
p=Find_Reader(Rd,name);if(!
p){Nofind();return0;}
q->next=p->next;free(p);return1;
}
9.输出信息:
StatusPrint_book(ListLibrary*L)/*表格形式打印全部*/
{BK*p;
inti=22;p=L->head->next;/*让p指向第一个结点*/
textcolor(14);if(!
p){printf("\nNotfindabook!
\n");getch();
return0;}
printf("\n\n");printtheader();
while(p)
{gotoxy(10,i++);
printf("%-10s%-10s",p->data.book_num,p->data.book_name);gotoxy(10,i++);
printf(HEADER2);p=p->next;
}
getch();return1;
}
StatusPrint_reader(RD*rd)/*打印读者信息*/
{RD*p;p=rd;
p=p->next;
printf("thereaderis\n");
while(!
p)
{
printf("%s,%s,%d,%s",p->reader_num,p->reader_name,p->right,p->borrow_name);p=p->next;printf("\n");
}return1;
}
StatusPrint(ListLibrary*L,RD*h)/*输出全部信息*/
{
Print_book(L);
Print_reader(h);
}
10.现存图书不足:
Statusbook_not_enough(ListLibrary*L,charbook[])/*现存不足图书*/
{BK*p;p=Find_Book(L,book);
if(!
p){Nofind();return0;}
if(p->book_xc==0)printf("Thecurrentbookisinlack:
\n");/*youwenti*/
elseprintf("Therrisnobookinlack\n");return1;
}
11.保存当前信息:
代码如下:
StatusSave_Book(ListLibrary*L)/*保存图书记录*/
{FILE*fp;BK*p;
intcount=0;
fp=fopen("C:
\\librarybook","wb");/*以只写方式打开二进制文本文件C:
\\librarybook*/
if(fp==NULL)
{printf("\n=======>cannotopenfile!
\n");return0;}
p=L->head->next;
while(p){if(fread(p,sizeof(BK),1,fp)==1)/*一次从文件中读取一本书的信息*/
{p=p->next;count++;}
elsebreak;
}
if(count>0)
{getch();
printf("\n\n\n=========savefilecomplete,totalsave'srecondnumberis:
%d\n",count);
getch();saveflag=0;
}
else
{clrscr();
printf("thecurrentBKisempty,nobookrecondissaved!
\n");
getch();
}fclose(fp);
}
StatusSave_Reader(RD*h)/*保存读者信息*/
{FILE*fp;BK*p;
intcount=0;fp=fopen("C:
\\libraryreader","wb");/*以只写方式打开二进制文本文件C:
\\librarybook*/
if(fp==NULL)
{printf("\n=======>cannotopenfile!
\n");return0;}
p=h->head;while(p)
{if(fread(p,sizeof(RD),1,fp)==1)/*一次从文件中读取一本书的信息*/
{p=p->next;count++;}
elsebreak;
}
if(count>0)
{getch();
printf("\n\n\n=========savefilecomplete,totalsave'srecondnumberis:
%d\n",count);
getch();savefla=0;
}
else
{clrscr();
printf("thecurrentRDisempty,nobookrecondissaved!
\n");
getch();
}fclose(fp);
}
Statussave(ListLibrary*L,RD*Rd)
{if(saveflag==1)Save_Book(L);
if(savefla==1)Save_Reader(Rd);return1;
}
★主要功能程序结构设计
※流程图设计
1.主菜单界面
=================================================
*0----退出系统6----关于系统*
*1----新书入库7----旧书出库*
*2----增新读者8----删旧读者*
*3----查询9----输出全部信息*
*4----借书登记10----现存不足图书*
*5----还书管理11----保存当前信息*
=================================================
菜单:
voidmenu()/*主菜单*/
{system("cls");/*调用DOS命令清屏,与clrscr()功能相同*/
textcolor(13);/*在文本模式中选择新的字符颜色*/
gotoxy(10,6);/*在文本窗中设置光标*/
cprintf("Thelibraryborrowandreturnsystem\n");
gotoxy(3,8);
cprintf("*************************************Menu**********************************\n");
gotoxy(3,9);
cprintf("*1putthenewbookintothelibrary2increasethereader*\n");
gotoxy(3,10);
cprintf("*3findthebook4checkinwhenborroothebook*\n");
gotoxy(3,11);
cprintf("*5returnthebook6abouttheproject*\n");
gotoxy(3,12);
cprintf("*7getoutoldbookfromthelibrary8outputtheoldreader*\n");
gotoxy(3,13);
cprintf("*9outputthewhole10thecurrentisinlack*\n");
gotoxy(3,14);
cprintf("*0quitsystem11savethecurrentmessage*\n");
gotoxy(3,15);
cprintf("***************************************************************************\n");
/*cprintf()格式化输出至文本窗口屏幕中*/
}
头文件如下:
#include
#include
#include
#include
#defineMAX1
#defineN100
#defineLENsizeof(structbook)
#defineLEN1sizeof(structreader)
#defineNULL0
#defineHEADER1"|-----------------LIBRARY------------------|\n"
#defineHEADER2"|--------------------|---------------------|\n"
#defineEND"--------------------------------------------\n"
typedefintStatus;
intsaveflag=1,savefla=1;
主函数如下:
voidmain()
{
BK*h_book;/*图书指针*/
RD*h_reader;/*读者指针*/
FILE*fp;/*文件指针*/
intselect,tn,tm;/*保存选择结果变量*/
charch;/*保存(y,Y,n,N)*/
intcount=0;/*保存文件中的记录条数*/
BK*p,*r;
ListLibraryL;
charname1[10],name2[10],name3[10],book1[N],book2[N],book3[N];
Init(&L);
r=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 程序