数据结构课程设计——图书管理信息系统.doc_第1页
数据结构课程设计——图书管理信息系统.doc_第2页
数据结构课程设计——图书管理信息系统.doc_第3页
数据结构课程设计——图书管理信息系统.doc_第4页
数据结构课程设计——图书管理信息系统.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图书管理信息系统一、 课程设计题目:图书管理信息系统二、课程设计内容:实现图书管理信息系统的设计。这是一个数据结构的综合使用,涉及的知识比较全面,特别是对文件的使用更为全面。进入系统后,操作员可进行系统维护、读者管理、图书管理、图书流通、退出系统等操作。系统维护:有“初始化”和“读盘”两个重要操作。第一次开始运行时,必须选择“初始化”,使有关文件指针、计数器等初始化为0;而在以后的每次操作开始时,选择“读盘”,将保存过的相关图书信息磁盘文件读入,以便进行各类操作。读者管理:可实现读者信息的追加一项输入。需要输入读者号、读者名、可借书数。 输入“y”可连续输入信息,若输入“n”则结束输入,退出读者管理。 图书管理:有“图书信息输入”和“图书信息查询”两个重要操作。若选“图书信息输入”,就进入相关子模块,在输入信息的同时建立相应的索引及索引文件和索引链头文件,输入书号、书名、作者名、出版社、分类号、藏书量等信息,根据提示输入“y”实现连续输入,若输入“n”则结束输入,退出图书管理;有了图书信息数据之后,就可以进行图书信息的查询以及图书借阅等操作了。若选“图书信息查询”,可根据提示按书号、书名、作者、出版社等进行查询,系统会将查询结果输出。 图书流通:有“借书处理”和“还书处理”两个重要操作。当选择“借书处理”,系统接受输入信息后,首先查询读者文件。若没查到,显示“非法读者!”,若查到,则再检查该读者书是否已借满,如果未借满,则继续检查图书文件;否则显示“书已借满!”。检查图书文件如发现书号不存在或书已借出,都会提示读者“非法书号!”或“书已借出”,否则,进行借出处理,修改借阅文件、读者文件以及图书主文件的相关数据项,并显示“借书成功!”。当选择“还书处理”,系统在接受输入信息之后,首先用书号查询借还书文件,若找到,则填入还书日期,然后再用书号查询图书主文件,修改借出数,用读者号查找读者文件,修改读者的借书数,而后显示“还书成功!”,否则显示“非法书号!”并返回主控菜单。 退出系统:当需要的操作完成后,选择该项,系统会自动将当前图书数据及相关的信息写入磁盘文件。待下次运行系统时,首先读入文件,再进行各种操作。三、算法设计: 对于主关键字的查找,采取折半查找的算法,对于次关键字的查找,采取顺序查找的算法。 存储用到了静态链表和文件操作。四、程序正确性验证(指边界测试数据,即程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足要求的结果): (1)当输入相同的读者信息时: (2)当输入相同的图书信息时: (3)当借书时输入无效的读者号时: (4)当借书时输入无效的书号时:(5)当还书时输入错误的书号时:五、课程设计过程中出现的主要问题、原因及解决方法:出现的主要问题是:当连续输入三个字符串时,第二个字符串不能传入变量中;原因:第一个字符数组的长度定义的有问题。解决方法:让三个字符串分开输入,将第一个字符数组的长度加1。出现的问题还有,就是对scanf和prinf的用法不熟。六、 课程设计的主要收获:通过这次课程设计,我对学过的知识进行了综合,一些理解的不够深刻的问题,能得以解决。从碰到问题,在网上找资料,从图书馆借相关书籍看,请同学和老师帮忙,到真正解决问题,我经历了,从痛苦到喜悦的全过程。这次课程设计给我更多的,我想还是那份编程的经验与其过程中的酸甜苦辣。同时很感谢帮助过我的同学,更感谢胡老师的悉心教导。七、 对今后课程设计的建议: 希望老师在验收时,不要盲目的相信学生,也不要怀疑学生,仅此而已。八、 源代码 /*borrow.c*/*(1)借书处理算法*/void borrowbook(bookdbasefile &bf,bnoidxfile bif,bbookfile &bbf,readfile &rf)char dzh4,sh5,jyrq8;char a5;int i,j,k=0,jls=0;coutdzh;for(i=1;i=rf.readreck.bn1) printf(书已借满!n);return;coutsh; strcpy(a,sh);j=binsearch(bif,sh); /查找图书文件if(j=0) printf(非法书号!n);return;if(bf.bookdbasej.borrownum=bf.bookdbasej.storenum)printf(图书已借出n);return; coutjyrq;jls=+bbf.len; /借还书文件记录数加1 strcpy(bbf.bbookjls.rno,dzh); /借还书文件追加一条记录,记录相关内容 strcpy(bbf.bbookjls.bno,a); strcpy(bbf.bbookjls.date1,jyrq);rf.readreck.bn2+;cout该读者现在已借书数:rf.readreck.bn2endl;bf.bookdbasej.borrownum+;cout该图书被借出次数:bf.bookdbasej.borrownumendl;printf(借书成功!n);/*(2)还书处理算法*/void backbook(bookdbasefile &bf,bnoidxfile bif,bbookfile &bbf,readfile &rf)char dzh8,sh4,hsrq8;int i,j,k=0,m=0; cout输入读者号:; scanf(%s,dzh);for(i=1;i=rf.len;i+) /查找读者文件if(strcmp(dzh,rf.readreci.rno)=0) k=i;break;if(k=0)printf(非法读者!n);return; cout输入书号:;scanf(%s,sh);for(i=1;i=bbf.len;i+) /查询借还书文件if(strcmp(sh,bbf.bbooki.bno)=0)m=i;break;if(m=0)printf(书号有误,不是该读者所借的书的书号!n);return;j=binsearch(bif,sh); /查找图书文件if(j=0)printf(非法书号!n);return; cout输入还书日期:; scanf(%s,hsrq);rf.readreck.bn2-; /修改借书数bf.bookdbasej.borrownum-; /修改借出数strcpy(bbf.bbookm.date2,hsrq); /填入还书日期printf(还书成功!n); /*createfile.c输入图书记录建立相关文件*/*(1)追加一条图书主数据库记录*/void appedbaserec(bookdbasefile &df)int i;i=+df.len; /图书主数据库长度加1printf(书号 书 名 作者名 出版社 分类 藏书量n);scanf(%s%s,df.bookdbasei.bno,df.bookdbasei.bname); scanf(%s%s,df.bookdbasei.author,df.bookdbasei.press); scanf(%s %d,df.bookdbasei.sortno,&df.bookdbasei.storenum);df.bookdbasei.borrownum=0; /借出数置0for(int j=1;ji;j+)if(strcmp(df.bookdbasei.bno,df.bookdbasei.bno)=0)cout已有相同的书号,请重新输入!=1)if(strcmp(sh,bif.bnoidxj.bno)0)k=j+1;break;j-; if(bif.len0) /有序表的插入for(j=bif.len;j=k;j-)bif.bnoidxj+1=bif.bnoidxj; /记录后移strcpy(bif.bnoidxk.bno,sh);bif.bnoidxk.recno=i;bif.len+; /表长加1/*(3)修改书名索引以及书名链头索引表*/void changelinkheadf1(bookdbasefile &df,lhfile1 &lhf1)int i,j,k,m;char sm20;i=df.len; /图书主文件的当前长度,也就是要处理的当前记录号strcpy(sm,df.bookdbasei.bname); /取记录中书名送至变量sm中j=1;k=0;while(j=lhf1.len1)if(strcmp(sm,lhf1.lhfrec1j.bname)=0) k=j;break;j+; if(k!=0)df.bookdnext=lhf1.lhfrec1k.lhead;lhf1.lhfrec1k.lhead=i; /i为主文件的当前记录号(假定为指针)lhf1.lhfrec1k.recnum+;else m=+lhf1.len1; /索引关键字个数加1df.bookdnext=0; /用头插法建立链表,指针置空lhf1.lhfrec1m.lhead=i; /i为主文件的当前记录号(假定为指针)lhf1.lhfrec1m.recnum=1; /计数器置1strcpy(lhf1.lhfrec1m.bname,sm);/*(4)修改作者索引以及作者链头索引表*/void changelinkheadf2(bookdbasefile &df,lhfile2 &lhf2)int i,j,k,m;char zz8;i=df.len; /图书主文件的当前长度,也就是要处理的当前记录号strcpy(zz,df.bookdbasei.author);/取记录中作者送至变量zz中j=1;k=0;while(j=lhf2.len2) if(strcmp(zz,lhf2.lhfrec2j.author)=0)k=j; break;j+;if(k!=0)df.bookdbasei.authnext=lhf2.lhfrec2k.lhead;lhf2.lhfrec2k.lhead=i; /i为文件的当前记录号(假定为指针)lhf2.lhfrec2k.recnum+;elsem=+lhf2.len2; /索引关键字个数加1df.bookdbasei.authnext=0; /用头插法建立链表,指针置空 lhf2.lhfrec2m.lhead=i; /i为主文件的当前记录号(假定为指针)lhf2.lhfrec2m.recnum=1; /计数器置1strcpy(lhf2.lhfrec2m.author,zz);/*(5)修改出版社索引以及出版社链头索引表。*/void changelinkheadf3(bookdbasefile &df,lhfile3 &lhf3)int i,j,k,m;char cbs10;i=df.len; /图书主文件的当前长度,也就是要处理的当前记录号 strcpy(cbs,df.bookdbasei.press); /取记录中书名送至变量sm中j=1;k=0;while(j=lhf3.len3) if(strcmp(cbs,lhf3.lhfrec3j.press)=0)k=j;break;j+;if(k!=0)df.bookdbasei.prenext=lhf3.lhfrec3k.lhead;lhf3.lhfrec3k.lhead=i; /i为主文件的当前记录号(假定为指针)lhf3.lhfrec3k.recnum+;elsem=+lhf3.len3; /索引关键字个数加1df.bookdbasei.prenext=0; /用头插法建立链表,指针置空lhf3.lhfrec3m.lhead=i; /i为主文件的当前记录号(假定为指针)lhf3.lhfrec3m.recnum=1; /计数器置1strcpy(lhf3.lhfrec3m.press,cbs);/*(6)建立图书多重表主索引及相关索引链头文件。*/ void createbook(bookdbasefile &bf,bnoidxfile &bif,lhfile1 &f1,lhfile2 &f2,lhfile3 &f3) char yn=y; while(yn=y|yn=y) appedbaserec(bf); /输入记录 changebnoidxf(bf,bif); /修改书号索引文件 changelinkheadf1(bf,f1); changelinkheadf2(bf,f2); changelinkheadf3(bf,f3); coutyn; /*reader.c 读者管理子系统*/void readermanage(readfile &rf) int i;char yn=y;i=+rf.len;while(yn=y|yn=y)printf(输入读者号 读者名 可借图书数n);scanf(%s %s,rf.readreci.rno,rf.readr);scanf(%d,&rf.readreci.bn1); rf.readreci.bn2=0; /将已借书数置0for(int j=1;ji;j+)if(strcmp(rf.readreci.rno,rf.readrecj.rno)=0&strcmp(rf.readr,rf.readr)=0)cout已有该读者的信息,请重新输入!endl; i=rf.len-1; break;coutyn; i+;rf.len=i-1;/*readfile.c 读入盘中各类文件*/void readfile(bookdbasefile &bf,bnoidxfile &bif,lhfile1 &f1,lhfile2 &f2,lhfile3 &f3,readfile &rf,bbookfile &bbf)file *fpout;int i;/读图书文件fpout=fopen(book,rb);if(fpout=null) printf(cannot open this file book.txt!n); exit(0);i=1;while(!feof(fpout)fread(&bf.bookdbasei,sizeof(bookrectype),1,fpout);i+;if(feof(fpout)break;bf.len=i-1;fclose(fpout);/读书号索引文件fpout=fopen(bidx,rb);if(fpout=null) printf(cannot open this file bidx.txt!n); exit(0);i=1;while(!feof(fpout)fread(&bif.bnoidxi,sizeof(bidxrectype),1,fpout);i+;if(feof(fpout)break;bif.len=i-1;fclose(fpout); /读书名索引链头文件fpout=fopen(nidx,rb);if(fpout=null) printf(cannot open this file nidx.txt!n); exit(0);i=1;while(!feof(fpout)fread(&f1.lhfrec1i,sizeof(bnrectype),1,fpout);i+;f1.len1=i-1;fclose(fpout);/读作者索引文件fpout=fopen(aidx,rb);if(fpout=null) printf(cannot open this file aidx.txt!n); exit(0);i=1;while(!feof(fpout)fread(&f2.lhfrec2i,sizeof(barectype),1,fpout);i+;f2.len2=i-1;fclose(fpout);/读出版社索引链头文件fpout=fopen(pidx,rb);if(fpout=null) printf(cannot open this file pidx.txt!n); exit(0);i=1;while(!feof(fpout)fread(&f3.lhfrec3i,sizeof(bprectype),1,fpout);i+;f3.len3=i-1;fclose(fpout);/读读者文件fpout=fopen(read,rb);if(fpout=null) printf(cannot open this file read.txt!n); exit(0);i=1;while(!feof(fpout)fread(&rf.readreci,sizeof(rrectype),1,fpout);i+;rf.len=i-1;fclose(fpout);/读借还书文件fpout=fopen(bbff,rb);if(fpout=null) printf(cannot open this file bbff.txt!n); exit(0);i=1;while(!feof(fpout)fread(&bbf.bbooki,sizeof(bbookrectype),1,fpout);i+;bbf.len=i-1;fclose(fpout);/search.c/*(1)书号查询算法.用二分法查找实现书号查询算法如下*/int binsearch(bnoidxfile bif,char key)int low,high,mid;low=1;high=bif.len;while(low=high)mid=(low+high)/2;if(strcmp(key,bif.bnoidxmid.bno)=0)return bif.bnoidxmid.recno;else if(strcmp(key,bif.bnoidxmid.bno)0)high=mid-1;else low=mid+1;return 0;/binsearch/*(2)按书名查询算法*/int bnamefind(lhfile1 lhf1,char key)int i,k=0;for(i=1;i=lhf1.len1;i+)if(strcmp(key,lhf1.lhfrec1i.bname)=0)k=lhf1.lhfrec1i.lhead;break;return k;/*(3)按作者查询算法*/int bauthfind(lhfile2 lhf2,char key)int i,k=0; for(i=1;i=lhf2.len2;i+)if(strcmp(key,lhf2.lhfrec2i.author)=0)k=lhf2.lhfrec2i.lhead;break;return k;/*(4)按出版社查询算法*/int bnamefind(lhfile3 lhf3,char key)int i,k=0; for(i=1;i=lhf3.len3;i+)if(strcmp(key,lhf3.lhfrec3i.press)=0)k=lhf3.lhfrec3i.lhead;break;return k;/*(5)输出一条图书主数据库记录*/void showrec(bookdbasefile df,int i)printf(书号 书 名 作者名 出版社 分类号n);printf(=n);printf(%-6s%10s,df.bookdbasei.bno,df.bookdbasei.bname);printf(%8s%8s,df.bookdbasei.author,df.bookdbasei.press);printf(%-6sn,df.bookdbasei.sortno);printf(=n);cout=1&choose=5)printf( 图书查询子系统n);printf(-n);printf(1.书 号 2.书 名n);printf(3.作 者 4. 出版社n);printf(5.退出n);printf(-n);printf(请用户选择: n);scanf(%d,&choose);switch(choose)case 1:printf(输入书号:n);scanf(%s,sh);k=binsearch(bif,sh); /调用书号查询算法if(k=0)printf(没有要查找的图书,请检查是否输入有错n);break;showrec(df,k); /输出查找的图书记录break;case 2:printf(输入书名:n);scanf(%s,sm);k=bnamefind(f1,sm);/调用书名查询算法 if(k=0)printf(没有要查找的图书,请检查是否输入有错n);break;for(i=k;i;i=df.bookdnext)showrec(df,i); /输出一条图书记录break;case 3:printf(输入作者名:n);scanf(%s,zz);k=bauthfind(f2,zz); /调用作者查询算法if(k=0)printf(没有要查找的图书,请检查是否输入有错n);break;for(i=k;i;i=df.bookdbasei.authnext)showrec(df,i); /输出一条图书记录break;case 4: printf(输入出版社:n);scanf(%s,cbs);k=bnamefind(f3,cbs); /调用作者查询算法if(k=0)printf(没有要查找的图书,请检查是否输入有错n);break;for(i=k;i;i=df.bookdbasei.prenext)showrec(df,i); /输出一条图书记录break;case 5:return;/type.h/(1)主数据库文件typedef structchar bno5; /书号char bname21; /书名int namenext; /书名指针链,为了处理方便,仅将数据库记录号看为记录的地址指针char author9; /作者int authnext; /作者链指针(用记录号)char press11; /出版社int prenext; /出版社链指针(用记录号)char sortno4; /分类号int storenum; /藏书量int borrownum; /借出数bookrectype; /数据库记录类型typedef struct bookrectype bookdbasebooksize; int len; /文件当前长度bookdbasefile; /定义图书数据库文件类型/(2)书号索引文件typedef structchar bno5; /书号int recno; /记录指针bidxrectype; /索引文件记录类型typedef structbidxrectype bnoidxbooksize;int len; /当前记录个数bnoidxfile; /书号索引文件类型/(3)书名链头索引文件typedef structchar bname21; /书名int lhead; /链头指针int recnum; /长度bnrectype; /书名链头文件记录类型typedef structbnrectype lhfrec1blhnum;int len1; /链头文件当前长度lhfile1; /书名链头文件类型/(4)作者链头索引文件typedef structchar author9; /作者int lhead; /链头指针int recnum; /长度barectype; /作者链头文件记录类型typedef structbarectype lhfrec2blhnum;int len2;lhfile2; /作者链头文件类型/(5)出版社链头索引文件typedef structchar press11; /出版社int lhead; /链头指针int recnum; /长度bprectype; /出版社链头文件记录类型typedef structbprectype lhfrec3blhnum;int len3;lhfile3; /出版社链头文件类型/(6)读者文件typedef structchar rno4; /读者号char name8; /读者名int bn1; /可借书数int bn2; /已借书数rrectype; /读者文件记录类型typedef structrrectype readrecrrnum; int len; /当前读者数readfile; /读者文件类型/(7)借还书文件typedef structchar rno4; /读者号char bno5; /书号char date19; /借书日期char date29; /还书日期bbookrectype; /借还书文件类型typedef structbbookrectype bbookbooksize;int len; /当前借书数bbookfile; /借还书文件类型/*writefile.c 各类文件写盘*/void writefile(bookdbasefile bf,bnoidxfile bif,lhfile1 f1,lhfile2 f2,lhfile3 f3,readfile rf,bbookfile bbf)file *fpin;int i;/写图书主文件fpin=fopen(book,wb);if(fpin=null) printf(cannot open this file book.txt!n); exit(0);for(i=1;i=bf.len;i+)fwrite(&bf.bookdbasei,sizeof(bookrectype),1,fpin);fclose(fpin);/写图书索引文件fpin=fopen(bidx,wb);if(fpin=null) printf(cannot open this file bidx.txt!n); exit(0);for(i=1;i=bif.len;i+)fwrite(&bif.bnoidxi,sizeof(bidxrectype),1,fpin);fclose(fpin);/写书名索引链头文件fpin=fopen(nidx,wb);if(fpin=null) printf(cannot open this file nidx.txt!n); exit(0);for(i=1;i=f1.len1;i+)fwrite(&f1.lhfrec1i,sizeof(bnrectype),1,fpin);fclose(fpin); /写作者索引链头文件fpin=fopen(aidx,wb);if(fpin=null) printf(cannot open this file aidx.txt!n); exit(0);for(i=1;i=f2.len2;i+)fwrite(&f2.lhfrec2i,sizeof(barectype),1,fpin);fclose(fpin);/写出版社索引链头文件fpin=fopen(pidx,wb);if(fpin=null) printf(cannot open this file pidx.txt!n); exit(0);for(i=1;i=f3.len3;i+)fwrite(&f3.lhfrec3i,sizeof(bprectype),1,fpin);fclose(fpin);/写读者文件fpin=fopen(read,wb);if(fpin=null) printf(cannot open this file read.txt!n); exit(0);for(i=1;i=rf.len;i+)fwrite(&rf.readreci,sizeof(rrectype),1,fpin);fclose(fpin);/写借还书文件fpin=fopen(bbff,wb);if(fpin=null) printf(cannot open this file bbff.txt!n); exit(0);for(i=1;i=bbf.len;i+)fwrite(&bbf.bbooki,sizeof(bbookrectype),1,fpin);fclose(fpin);#define booksize 100 /假定图书文件的最大可能记录数#define blhnum 50 /索引链头文件中的记录数#define rrnum 50 /读者的最大可能数#include using namespace s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论