图书馆管理系统.docx
- 文档编号:3819827
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:22
- 大小:46.84KB
图书馆管理系统.docx
《图书馆管理系统.docx》由会员分享,可在线阅读,更多相关《图书馆管理系统.docx(22页珍藏版)》请在冰豆网上搜索。
图书馆管理系统
《算法与数据结构课程设计》
综合设计报告
课程设计报告
设计项目编号
3
名称
图书借阅管理系统
实验课时
5
主要仪器设备
PC机
附属设备
优盘
主要使用软件
WIN-TC
实验时间
2009年3月-5月
1问题的描述和分析
图书借阅管理系统
主要功能包括:
a.图书管理(增加图书、查询图书、删除图书、图书借阅、还书);
b.会员管理(增加会员、查询会员、删除会员、借书信息);
程序设计要求:
1)建立数据文件,系统对数据文件进行自动排序(用冒泡法,以编号和学号为关键字)
2)查询菜单,按图书的编号、名字、作者或者会员的学号、姓名进行查询(因为已经按编号和学号进行了排序,则可使用二分查找法;而因为名字、作者、姓名都有可能不唯一,则只能使用顺序查找法进行查找。
)
2算法的设计
1)建立原始数据文件
记录形式如下:
图书信息(编号,名字,作者,借阅状态)
会员信息(学号,姓名,所借图书编号)
其中编号和学号分别为主关键字。
输入文件算法描述同教材:
{提示用户输入数据文件名;
获取数据文件名filename;
fp=fileopen(filename,"a+")
if(fp==NULL)
输出出错信息
else
{while(输入没有结束)
{让用户输入一条记录;
写入文件中;
设置输入状态;
}
return(数据文件名)
}
2)数据文件按关键字进行排序
使用冒泡法,算法同教材,描述如下:
voidBkSort(Books*Bk)
/*code待排序记录的关键字即书籍编号,sum待排序记录的个数即书目总数*/
{inti,j,n;
Books*temp;
i=1;n=Bk->sum;
for(i=0;i {for(j=n-1;j>i;j--) if(strcmp(Bk->books[j].code,Bk->books[j-1].code)<0) {用字符串复制函数strcpy()以及临时中介temp, 把Bk->books[j]和Bk->books[j-1]的内容进行交换 }/*共进行sum次冒泡,如果没有发生交换则结束*/ } } 3)用到的函数 BkPrint(BooksBk,intn)/*输出书目信息表格*/ MbPrint(MembersMb,intn)/*输出会员信息表格*/ voidInit(BooksBk,MembersMb)/*记录初始化*/ BkSort(BooksBk)/*用冒泡法,系统自动给书籍按编号排序*/ MbSort(MembersMb)/*用冒泡法,系统自动对会员按学号排序*/ BSeqSearch(BooksBk,charname[])/*按书名,对书籍进行顺序查找*/ MSeqSearch(MembersMb,charname[])/*按姓名,对会员进行顺序查找*/ intBkSearch(BooksBk,charcode[])/*按编号,对书籍进行二分查找*/ intMbSearch(MembersMb,charno[])/*按学号,对会员进行二分查找*/ voidBkAdd(BooksBk)/*添加书目信息*/ voidMbAdd(MembersMb)/*添加会员信息*/ voidBkDelete(BooksBk)/*删除书籍*/ voidMbDelete(BooksBk)/*删除会员*/ Borrow(BooksBk,MembersMb)/*借书*/ Return(BooksBk,MembersMb)/*还书*/ 4)查询功能 图书查询 a.按编号查询 b.按书名查询 会员查询 a.按学号查询 b.按姓名查询 3数据结构的设计 图书信息(编号,书名,作者,借阅状态) typedefstruct{ charcode[10];/*编号*/ charname[20];/*名字*/ charwriter[10];/*作者*/ intflag;/*借阅状态,flag=0则为可借状态,flag=1则为借出状态*/ }Book_info; 会员信息(学号,姓名,借书信息) typedefstruct{ charno[10];/*学号*/ charname[20];/*姓名*/ Book_infobbk[5];/*所借书籍的编号,每个会员最多可借5本书*/ intcount;/*借书数目,0<=count<=5*/ }Member_info; 数据定义类型为: #defineMAXSIZE100 typedefstruct{ structBook_infobooks[MAX]; intsum; }Books; typedefBooksBk; typedefstruct{ structMember_infomembers[MAX]; intsum; }Members; typedefMembersMb; 4具体程序的实现 BkPrint(BooksBk,intn)/*输出书目信息表格*/ {printf(p1); printf(p2); printf(p3); if(Bk.books[n].flag==0) printf(p4,Bk.books[n].code,Bk.books[n].name,Bk.books[n].writer); if(Bk.books[n].flag==1) printf(p5,Bk.books[n].code,Bk.books[n].name,Bk.books[n].writer); printf(p3); } MbPrint(MembersMb,intn)/*输出会员信息表格*/ {inti; printf(p6); printf(p7); printf(p8); for(i=0;i {printf(p9,Mb.members[n].no,Mb.members[n].name,Mb.members[n].bbk[i]); printf(p8); } printf("已借%d/5本书\n",i); } voidInit(BooksBk,MembersMb)/*记录初始化*/ {Bk.sum=0; Mb.sum=0; strcpy(Mb.members[0].no,"0000000000"); strcpy(Mb.members[0].name,"membername"); Mb.members[0].count=0; strcpy(Bk.books[0].code,"0000000000"); strcpy(Bk.books[0].name,"bookname"); strcpy(Bk.books[0].writer,"writername"); Bk.books[0].flag=1; } voidBkAdd(BooksBk)/*添加书目信息*/ {intj; chart='y'; ints=Bk.sum; charcode[10],name[20],writer[10]; printf("书目信息录入\n"); while(t=='y'||t=='Y') {printf("编号: \n"); scanf("%s",code); if(BkSearch(Bk,code)! =0) printf("该编号已存在! \n"); else{strcpy(Bk.books[s++].code,code); printf("书名: \n"); scanf("%s",name); strcpy(Bk.books[s++].name,name); printf("作者: \n"); scanf("%s",writer); strcpy(Bk.books[s++].writer,writer); Bk.books[s].flag=0; Bk.sum++; } printf("是否继续添加(y/n): \n"); t=getch(); printf("\n"); } BkSort(Bk); } voidMbAdd(MembersMb)/*添加会员信息*/ {intj; chart='y'; ints=Mb.sum; charno[10],name[20]; printf("会员信息录入\n"); while(t=='y'||t=='Y') {printf("学号: \n"); scanf("%s",no); if(MbSearch(Mb,no)! =0) printf("该学号已存在! \n"); else{strcpy(Mb.members[s++].no,no); printf("姓名: \n"); scanf("%s",name); strcpy(Mb.members[s++].name,name); Mb.sum++; } printf("是否继续添加(y/n): \n"); t=getch(); printf("\n"); } MbSort(Mb); } voidBkDelete(BooksBk)/*删除书籍*/ {intj; charcode[10]; ints=Bk.sum; chart='y'; while(t=='y'||t=='Y') {printf("请输入要删除的书籍的编号: \n"); scanf("%s",code); j=BkSearch(Bk,code); if(j==0) printf("该编号不存在! \n"); elseif(Bk.books[j].flag==1) printf("对不起,该书已借出,不能操作! \n"); elsefor(;j {strcpy(Bk.books[j].code,Bk.books[j+1].code); strcpy(Bk.books[j].name,Bk.books[j+1].name); strcpy(Bk.books[j].writer,Bk.books[j+1].writer); Bk.books[j].flag=1; Bk.sum--; } printf("是否继续删除(y/n): \n"); t=getch(); printf("\n"); } } voidMbDelete(MembersMb)/*删除会员*/ {inti,j,k; charno[10]; ints=Mb.sum; chart='y'; while(t=='y'||t=='Y') {printf("请输入要删除的会员的学号: \n"); scanf("%s",no); j=MbSearch(Mb,no); if(j==0) printf("该学号不存在! \n"); elseif(Mb.members[j].count! =0) printf("该会员已借阅%d本图书,不能进行操作! \n",Mb.members[j].count); else{k=Mb.members[j+1].count; Mb.members[j].count=Mb.members[j+1].count; for(;j for(i=0;i {strcpy(Mb.members[j].no,Mb.members[j+1].no); strcpy(Mb.members[j].name,Mb.members[j+1].name); strcpy(Mb.members[j].bbk[i],Mb.members[j+1].bbk[i]); } Mb.sum--; } printf("是否继续删除(y/n): \n"); t=getch(); printf("\n"); } } /*************************************************************************/ Borrow(BooksBk,MembersMb)/*借书*/ {inti,j,k; charcode[10];charno[10]; printf("请输入要借阅的图书编号: \n"); scanf("%s",code); i=BkSearch(Bk,code); if(i==0) printf("查无此书! \n"); elseif(Bk.books[i].flag==0) {printf("请输入学号: \n"); scanf("%s",no); j=MbSearch(Mb,no); k=Mb.members[j].count; if(j==0) printf("对不起,您还不是会员! \n"); elseif(k==5) printf("对不起,您的借阅额度已满! \n"); else{Bk.books[j].flag=1; strcpy(Mb.members[j].bbk[k+1],code); Mb.members[j].count++; printf("借阅成功,您有30天的借阅期限! \n"); } } } Return(BooksBk,MembersMb)/*还书*/ {inti,j,t; charcode[10];charno[10]; printf("请输入学号: \n"); scanf("%s",no); i=MbSearch(Mb,no); if(i==0) printf("查无此人! \n"); else{printf("请输入要归还的图书编号: \n"); scanf("%s",code); t=BkSearch(Bk,code); if(t==0) printf("查无此书! \n"); else{Bk.books[t].flag=0; for(j=0;j {if(strcmp(Mb.members[i].bbk[j],code)==0) strcpy(Mb.members[i].bbk[j],Mb.members[i].bbk[j+1]); } Mb.members[i].count--; printf("操作成功! \n"); } } } /*************************************************************************/ BkSort(BooksBk)/*用冒泡法,系统自动给书籍按编号排序*/ {inti,j,n; Bookstemp; n=Bk.sum; for(i=0;i {for(j=n-1;j>i;j--) if(strcmp(Bk.books[j].code,Bk.books[j-1].code)<0) {strcpy(temp.books[0].code,Bk.books[j-1].code); strcpy(temp.books[0].name,Bk.books[j-1].name); strcpy(temp.books[0].writer,Bk.books[j-1].writer); temp.books[0].flag=Bk.books[j-1].flag; strcpy(Bk.books[j-1].code,Bk.books[j].code); strcpy(Bk.books[j-1].name,Bk.books[j].name); strcpy(Bk.books[j-1].writer,Bk.books[j].writer); Bk.books[j-1].flag=Bk.books[j].flag; strcpy(Bk.books[j].code,temp.books[0].code); strcpy(Bk.books[j].name,temp.books[0].name); strcpy(Bk.books[j].writer,temp.books[0].writer); Bk.books[j].flag=temp.books[0].flag; } } } MbSort(MembersMb)/*用冒泡法,系统自动对会员按学号排序*/ {inti,j,k,n; Memberstemp; n=Mb.sum; for(i=0;i {for(j=n-1;j>i;j--) for(k=0;k<5;k++) if(strcmp(Mb.members[j].no,Mb.members[j-1].no)<0) {strcpy(temp.members[0].no,Mb.members[j-1].no); strcpy(temp.members[0].name,Mb.members[j-1].name); strcpy(temp.members[0].bbk[k],Mb.members[j-1].bbk[k]); strcpy(Mb.members[j-1].no,Mb.members[j].no); strcpy(Mb.members[j-1].name,Mb.members[j].name); strcpy(Mb.members[j-1].bbk[k],Mb.members[j-1].bbk[k]); strcpy(Mb.members[j].no,temp.members[0].no); strcpy(Mb.members[j].name,temp.members[0].name); strcpy(Mb.members[j].bbk[k],temp.members[0].bbk[k]); } } } /*************************************************************************/ BooksBSeqSearch(BooksBk,charname[])/*按书名,对书籍进行顺序查找*/ {Bookstemp; intj; j=Bk.sum; while(j>0) {if(strcmp(Bk.books[j].name,name)==0) BkPrint(Bk,j); j--; } printf("查无此人\n"); } voidMSeqSearch(MembersMb,charname[])/*按姓名,对会员进行顺序查找*/ {intj; j=Mb.sum; while(j>0) {if(strcmp(Mb.members[j].name,name)==0) MbPrint(Mb,j); j--; } printf("查无此人! \n"); } intBkSearch(BooksBk,charcode[])/*按编号,对书籍进行二分查找*/ {intlow,high,mid; low=1; high=Bk.sum; while(low<=high) {mid=(low+high)/2; if(strcmp(Bk.books[mid].code,code)==0) returnmid; if(strcmp(Bk.books[mid].code,code)>0) high=mid-1; else low=mid+1; } return0; } intMbSearch(MembersMb,charno[])/*按学号,对会员进行二分查找*/ {intlow,high,mid; low=1; high=Mb.sum; while(low<=high) {mid=(low+high)/2; if(strcmp(Mb.members[mid].no,no)==0) returnmid; if(strcmp(Mb.members[mid].no,no)>0) high=mid-1; else low=mid+1; } return0; } 5界面设计 1.图书管理系统 1.1增加图书 1.2查询图书 1.2.1按书名查询 1.2.2按编号查询 1.3删除图书 1.4图书借阅 1.5还书 1.6返回主菜单 2.会员管理系统 2.1增加会员 2.2查询会员 2.2.1按名字查询 2.2.2按学号查询 2.3删除会员 2.4借书信息 2.5返回主菜单 3.退出 相关源程序: voidmain() {BooksBk; MembersMb; FILE*fp; intselect; intcount1=1; intcount2=1;/*保存文件中的记录条数*/ Init(Bk,Mb); fp=fopen("D: \\图书管理","a+"); /*以追加方式打开文本文件D: \\图书管理,可读可写,若此文件不存在,会创建此文件*/ if(fp==NULL) {printf("\n打开文件失败! \n"); exit(0); } while(! feof(fp)) {if(fread(&Bk.books[count1],sizeof(Book_info),1,fp)==1) count1++; if(fread(&Mb.members[count2],sizeof(Member_info),1,fp)==1) count2++; } fclose(fp); printf("\n打开文件成功,书目记录数为: %d,会员记录数为: %d\n",count1,count2); while (1) {printf("\n主菜单\n\n"); printf("1.图书管理系统\n\n"); printf("2.会员管理系统\n\n"); printf("0.退出\n\n"); printf("输入选项(0-2): \n"); scanf("%d",&select); switch(select) {case1: Book_Ctr();break; case2: Member_Ctr();break; case0: exit(0); default: printf("输入有误,请重新输入: \n"); } } getch(); } Book_Ctr()/*二级目录图书管理系统*/ {BooksBk;MembersMb; intselect1,temp; charselect2; charcode[10],name[20]; while (1) {printf("\n图书管理系统\n\n"); p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书馆 管理 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)