数据结构课程设计-图书管理系统
安徽省巢湖学院计算机与信息工程学院
课程设计报告
课程名称《数据结构》
课题名称图书管理系统
专业计算机科学与技术
班级 10计本(2)班
学号10012090
姓名王显龙
联系方式 150********
指导教师江家宝
20 11 年 12 月 28 日
目录
1、数据结构课程设计任务书 (3)
1.1、题目 (3)
1.2、要求 (3)
2、总体设计 (3)
2.1、功能模块设计 (3)
2.2、所有功能模块的流程图 (3)
3、详细设计 (3)
3.1、程序中所采用的数据结构及存储结构的说明 (4)
3.2、算法的设计思想 (4)
4、调试与测试: (4)
4.1、调试方法与步骤: (4)
4.2、测试结果的分析与讨论: (4)
4.3、测试过程中遇到的主要问题及采取的解决措施: (8)
5、时间复杂度的分析: (8)
6、源程序清单和执行结果 (8)
7、C程序设计总结 (18)
8、致谢 (18)
9、参考文献 (18)
1、数据结构课程设计任务书 1.1、题目:图书管理系统
1.2、要求
设计要求设计一个计算机管理系统完成图书管理基本业务。
1) 每种书的登记内容包括书号、书名、著作者、现存量和库存量; 2) 对书号建立索引表(线性表)以提高查找效率; 3) 系统主要功能如下:
*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;
*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;
*归还:注销对借阅者的登记,改变该书的现存量。 2、总体设计
2.1、功能模块设计及流程图
根据课程设计题目的功能要求,各个功能模块的组成框图如下:
Y N Y N
3、详细设计
1.书号索引文件:
Typedef struct {int bno; int RecNo;}
进入图书馆
采购的新书
读者借书
读者还书
是否已有该书? 查询所借书现存量大于0? 注销对借阅者的登记
改变该书的库存量 借出该书一本
改变该书的现存量
确定该书
的书号
登记到图书帐目表
不能借该书
改变该书库存量
登记借阅者的书证号和归还期限
BidxRedType;
Typedef struct{
BidxRecType BnoIdx[Booksize];
Int len;}
BnoIdxFile;
2.读者文件:
Typedef struct{int ron;
Char name[8];int bn1; init bn2;}RRecType;
Typededf struct{RRecType ReadRed[RRnum];
Int len;}ReadFile;
3.输入一条图书记录的算法描述如下:
BookDbaseFile AppeDBaseFile(BookDBaseFile df)
提示输入项的输入顺序;
输入一条记录;
图书计数器加1;}
4.按书名查询如下:
Int BnameFind(LHFile lhf1,char keyl[])
{for(i=1;i<=lhf1;i++)
{if(dey==链头文件中当前的记录的书名)
{k=链头文件中当前的记录链头;退出循环;}}
Return k;}
3.1、程序中所采用的数据结构及存储结构的说明:
Const LIST_INTT_SIZE=100;
Typedef struct{ElemType elem[LIST_DIZE];
Int length;
}SqList;
Typedef struct{ElemType *elem;intlength;int listsize;int incrementsizer;}SqList;
}
3.2、算法的设计思想:
V oid borrowbook(int bookid)\\借书操作
Intretbook(int bookid)\\还书操作
V oid RDatabase::readerdata()\\读者维护
V oid BDatabase:;bookidata()\\图书维护
4.调试与测试:
4.1、调试方法与步骤:在相应的集成环境中进行运行源程序,并根据提示调试源程序直到得到正确的程序!!
4.2调试方法与步骤:
4.3、测试过程中遇到的主要问题及采取的解决措施:
是源程序运行不对!!但是在集成环境的提示下,还是可以慢慢的提示成功的!!
5、时间复杂度的分析
进分析时间复杂度为:t(n)=O(n)
6、源程序清单和执行结果
#include
#include
#include
#include
#define Max 2
typedef struct book
{
char book_num[10];
char book_name[20];
char book_writer[10];
int book_xy;
int book_kc;
struct book *next;
}BK;
typedef struct borrow
{
char borrow_book_num[10];
char limit_date[8];
}BO;
typedef struct reader
{
char reader_num[10];
char reader_name[10];
int right;
BO borrow[Max];
struct reader *next;
}RD;
BK *h_book;
RD *h_reader;
void Login();
int Menu();
void Init();
void Init_book();
void Menu_select();
void Insert_New_Book();
void Find_Book();
void add_reader();
void Print_reader();
void Print_book();
void Borrow_Book();
void Return_Book();
void Save();
void Save_Book();
void Save_Reader();
void Load();
void Load_Reader();
void Load_Book();
void Login()
{
system("cls");
printf("\n\n\n\t\t\t欢迎使用图书管理系统\n");
printf("\n\n\n\t\t 按任意键进入系统...");
getch(); system("cls");
}
int Menu()
{ int dm;
printf("\n\t\t图书管理系统主菜单\n");
printf("=================================================\n"); printf("☆\t0----退出系统☆\n");
printf("☆\t1----采编入库☆\n");
printf("☆\t2----登记读者☆\n");
printf("☆\t3----借阅登记☆\n");
printf("☆\t4---还书管理☆\n ");
printf("☆\t5---查询图书信息☆\n");
printf("☆\t6----查询读者信息☆\n");
printf("=================================================\n"); printf("请选择相应的代码:");
for(;;)
{ scanf("%d",&dm);
if(dm<0||dm>6)
printf("\n错误!请重新输入:");
else break;
}
return dm;
}
void Menu_select()
{
for(;;)
{
switch(Menu())
{ case 0:
system("cls");
Save();
printf("\n\n\t文件保存成功!\n");
printf("\n\n\t欢迎下次使用本系统!\n");
getch();
exit(0);
case 1:Insert_New_Book();break;
case 2:add_reader();break;
case 3:Borrow_Book();break;
case 4:Return_Book();break;
case 5:Print_book();break;
case 6:Print_reader();break;
default:printf("\n错误!");
exit(0);}
}
}
void Init()
{
Init_book();
}
void Init_book()
{
BK *p0;
printf("\n图书初始化开始,请输入图书信息..\n包括编号.书名.数量..\n"); p0=(BK*)malloc(sizeof(BK));
h_book=p0;
printf("\n请输入图书信息:\n");
printf("图书编号:");
scanf("%s",p0->book_num);
printf("图书名称:");
scanf("%s",p0->book_name);
printf("图书作者:");
scanf("%s",p0->book_writer);
printf("图书数量:");
scanf("%d",&p0->book_kc);
p0->book_xy=p0->book_kc;
p0->next=NULL;
printf("\n图书信息初始化完毕!按任意键继续下一步操作..\n");
getch();
system("cls");
}
void Insert_New_Book()
{
BK *p,*p0,*p1;
p=p1=h_book;
printf("\n新书入库模块...\n");
printf("\n请输入新书信息..\n包括书号.书名.数量..\n");
p0=(BK *)malloc(sizeof(BK));
printf("图书编号:");
scanf("%s",p0->book_num);
while(strcmp(p0->book_num,p1->book_num)!=0&&p1->next!=NULL) p1=p1->next;
if(strcmp(p0->book_num,p1->book_num)==0)
{
printf("\n此编号图书已存在!!直接入库!\n");
printf("图书数量:");
scanf("%d",&p0->book_kc);
p1->book_kc+=p0->book_kc;
p1->book_xy+=p0->book_kc;
}
else
{
printf("图书名称:");
scanf("%s",p0->book_name);
printf("图书作者:");
scanf("%s",p0->book_writer);
printf("图书数量:");
scanf("%d",&p0->book_kc);
while(p->next)
{ p=p->next; }
if(h_book==NULL) h_book=p0;
else p->next=p0;
p0->next=NULL;
p0->book_xy=p0->book_kc;
}
printf("\n新书入库完毕!按任意键继续下一步操作..\n");
getch();
system("cls");
}
void add_reader()
{ RD *p0;
int i;
printf("\n读者初始化开始,请输入读者信息..\n包括书证号.姓名..\n"); p0=(RD*)malloc(sizeof(RD));
h_reader=p0;
printf("\n请输入读者的信息:\n");
printf("读者书证号:");
scanf("%s",p0->reader_num);
printf("读者姓名:");
scanf("%s",p0->reader_name);
p0->right=0;
for(i=0;i { strcpy(p0->borrow[i].borrow_book_num,"0"); strcpy(p0->borrow[i].limit_date,"0"); } p0->next=NULL; printf("\n读者信息初始化完毕!按任意键继续下一步操作..\n"); getch(); system("cls"); } void Borrow_Book() { BK *p0; RD *p1; char bo_num[10],rea_num[10],lim_date[8]; int i; p0=h_book; p1=h_reader; printf("\n借书模块...\n"); printf("\n请输入借书的读者书证号:"); scanf("%s",rea_num); while(p1->next!=NULL&&strcmp(rea_num,p1->reader_num)!=0) p1=p1->next; if(p1->next==NULL&&strcmp(rea_num,p1->reader_num)!=0) { printf("\n此读者编号不存在!按任意键返回..\n"); goto END; } printf("\n请输入你要借的书的编号:"); scanf("%s",bo_num); while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL) p0=p0->next; if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0) { printf("\n此图书编号不存在!按任意键返回..\n"); } else if(p0->book_xy<=0) { printf("\n抱歉,此书已借完!请等待新书的到来!!\n按任意键返回...."); } else if(p1->right>=Max) { printf("\n不好意思,借书数目已满!不能借书!\n按任意键返回...."); } else if(strcmp(p1->borrow[0].borrow_book_num,"0")!=0) { for(i=0;i { if(strcmp(p1->borrow[i].borrow_book_num,bo_num)==0) { printf("\n抱歉!同一个读者不能同借两本相同的书!\n"); } else if(strcmp(p1->borrow[i].borrow_book_num,"0")==0) { printf("\n请输入你要归还图书的日期:"); scanf("%s",lim_date); strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num); strcpy(p1->borrow[p1->right-1].limit_date,lim_date); p0->book_xy--; printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num); } } } else { printf("\n请输入你要归还图书的日期:"); scanf("%s",lim_date); strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num); strcpy(p1->borrow[p1->right-1].limit_date ,lim_date ); p0->book_xy--; printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num); } END:getch(); system("cls"); } void Return_Book() { BK *p; RD *q; int i,j,find=0; char return_book_num[10],return_reader_num[10]; p=h_book; q=h_reader; printf("\n还书模块...\n"); printf("\n请输入要还书的读者编号:"); scanf("%s",return_reader_num); while(q->next!=NULL&&strcmp(return_reader_num,q->reader_num)!=0) q=q->next; if(q->next==NULL&&strcmp(return_reader_num,q->reader_num)!=0) { find=2; printf("\n此读者编号不存在!按任意键返回..\n"); goto end; } printf("\n请输入读者还书的编号:"); scanf("%s",return_book_num); while(p->next!=NULL&&strcmp(return_book_num,p->book_num)!=0) p=p->next; if(p->next==NULL&&strcmp(return_book_num,p->book_num)!=0) { find=2; printf("\n错误!此图书编号不存在!按任意键返回..\n"); goto end; } for(i=0;i if(strcmp(return_book_num,q->borrow[i].borrow_book_num)==0) { find=1; for(j=i;j { strcpy(q->borrow[j].borrow_book_num,q->borrow[j+1].borrow_book_num); strcpy(q->borrow[j].limit_date,q->borrow[j+1].limit_date); } strcpy(q->borrow[Max-1].borrow_book_num,"0"); strcpy(q->borrow[Max-1].limit_date,"0"); p->book_xy++; q->right--; printf("\n编号%s的读者还书完毕!按任意键继续下步操作..",return_reader_num); } if(find==0) printf("\n错误!此读者未借此书!按任意键返回..\n"); end: getch(); system("cls"); } void Print_book() { BK *p; p=h_book; printf("\n图书信息如下:\n\n"); printf("图书编号\t图书名称\t图书作者\t现有\t\t库存\n"); while(p!=NULL) { printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p ->book_xy,p->book_kc); p=p->next; } printf("\n图书信息打印完毕!按任意键继续下一步操作.."); getch(); system("cls"); } void Print_reader() { RD *p; int i; p=h_reader; printf("\n读者信息如下:\n\n"); printf("读者书证号\t\t读者姓名\n"); printf("\n"); while(p!=NULL) { printf("\t%s\t\t%s",p->reader_num,p->reader_name); for(i=0;i { printf("\n"); printf("图书编号",i+1); printf("\t还书日期",i+1); printf("\n"); printf("\t%s",p->borrow[i].borrow_book_num); printf("\t\t%s",p->borrow[i].limit_date); } printf("\n"); p=p->next; } printf("\n读者信息打印完毕!按任意键继续下一步操作.."); getch(); system("cls"); } void Save() { Save_Reader(); Save_Book(); } void Save_Reader() { FILE *fp_reader; RD *p,*p0; p=h_reader; if((fp_reader=fopen("Reader.txt","wb"))==NULL) { printf("\n文件保存失败!\n请重新启动本系统...\n"); exit(0); } while(p!=NULL) { if(fwrite(p,sizeof(RD),1,fp_reader)!=1) printf("\n写入文件失败!\n请重新启动本系统!\n"); p0=p; p=p->next; free(p0); } h_reader=NULL; fclose(fp_reader); } void Save_Book() { FILE *fp_book; BK *p,*p0; p=h_book; if((fp_book=fopen("Book.txt","wb"))==NULL) { printf("\n文件保存失败!\n请重新启动本系统...\n"); exit(0); } while(p!=NULL) { if(fwrite(p,sizeof(BK),1,fp_book)!=1) printf("\n写入文件失败!\n请重新启动本系统!\n"); p0=p; p=p->next; free(p0); } h_book=NULL; fclose(fp_book); } void Load() { Load_Reader(); Load_Book(); } void Load_Reader() { RD *p1,*p2,*p3; FILE *fp; fp=fopen("book.txt","rb"); p1=(RD *)malloc(sizeof(RD)); fread(p1,sizeof(RD),1,fp); h_reader=p3=p2=p1; while(! feof(fp)) { p1=(RD *)malloc(sizeof(RD)); fread(p1,sizeof(RD),1,fp); p2->next=p1; p3=p2; p2=p1; } p3->next=NULL; free(p1); fclose(fp); } void Load_Book() { BK *p1,*p2,*p3; FILE *fp; fp=fopen("Book.txt","rb"); p1=(BK *)malloc(sizeof(BK)); fread(p1,sizeof(BK),1,fp); h_book=p3=p2=p1; while(! feof(fp)) { p1=(BK *)malloc(sizeof(BK)); fread(p1,sizeof(BK),1,fp); p2->next=p1; p3=p2; p2=p1; } p3->next=NULL; free(p1); fclose(fp); } void main() { FILE *fp_book,*fp_reader; Login(); if((fp_book=fopen("Book.txt","rb"))==NULL||(fp_reader=fopen("Reader.txt","rb"))= =NULL) { Init(); } else Load(); Menu_select(); } 7、C程序设计总结 设计过程中,不仅复习课本上所学知识,还通过查资料、问同学学到了课本上没有的知识。从而启发我,要想写好程序,在写好课本知识的同时还需要多读和专业有关的一些书籍,同时还需要多动脑子,尽量把所学的知识综合起来应用,力争写出完美的程。 同时感觉到了团体合作学习的好处,所以应该多多团体合作学习!! 8、致谢 能够完成这次课程设计必须感谢尤字、杨森等同学的帮助!!修改了几 处重要错误,同时启发我完善了该程序的功能 9、参考文献 谭浩强,C程序设计(第二版),北京:清华大学出版社,2001.1