数据结构-图书馆管理系统(修改版)_第1页
数据结构-图书馆管理系统(修改版)_第2页
数据结构-图书馆管理系统(修改版)_第3页
数据结构-图书馆管理系统(修改版)_第4页
数据结构-图书馆管理系统(修改版)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

数据结构课程设计报告题目:图书管理基本业务模拟院系:信息工程学院专业班级:计091学生姓名:王晨宇张晴马勋叶旭东学号:090671090678 090683090684 指导教师:沙芸2011年6月29日问题分析图书馆基本业务模拟包含多方面的操作,其中本程序描述的是图书馆的新书入库、读者注册、图书馆借阅、归还、信息查询(含书籍信息查询和读者信息查询)等功能。新书入库功能:新到书籍入库包含几方面的操作:从界面输入书籍的编号(0~999999的长整型)、书名(字符串类型)、该书作者名(字符串类型)、该书的现存量(整型)、该书的总量(整型)。新书入库只有管理员可以进行操作。读者注册功能没有账号和密码读者和管理员都不能登录系统,本系统默认第一个注册系统的是系统管理员,借阅号为1000,权限是1,并输入自己基本信息,默认可借本数为10,并将所借书信息区全部置零。不是第一个注册的读者,借阅号从1000往后顺延,自己设置密码,权限为0.,其余信息与管理员相同,但是登陆之后的界面,管理员可以看到“入库”菜单选项,普通读者不能看到该选项。借阅功能书籍借阅主要涉及存书库和读者信息库双方的更新。用户首先登陆系统,查询该书是否存在,该书的剩余数量是否大于零,最后查询该读者是否已经借满书籍。若以上条件都满足,则将该书编号存入该读者的借阅信息区,将该读者的可借书数量减一,该存书的可借数量减一。归还功能读者登录后按书号来归还所借书籍,若书号正确并且确认归还该书籍,则从读者的借书区删除该书籍,将该书的可借数量增加一,然后返回。旧书注销功能管理员可以对注册过的图书进行注销。数据结构描述根据所给信息,可以采用线性链表来实现该问题。现在分别给予描述。读者读者有很多信息需要使用,其中包含读者的姓名、性别、密码、权限、所借书信息。这里我们定义一个结构体来描述他。定义的结构体代码如下:typedefstructREADER{longnumber;//借阅号charname[15];//读者姓名charsex;//读者性别charpassword[16];//读者的密码intresidue;//读者的剩余可借书籍数量longborrowed[10];//读者已经借阅的书籍编号intlimit;//读者权限structREADER*next;//该结构体作为线性链表的一部分用来链接下一个节点的指针}reader;书籍同读者信息一样,书籍也有很多信息需要描述,其中包含书籍的编码、书名、书籍作者、书籍的总量、书籍的可借数量、出版社信息、出版日期,整个全部我们定义一个reader类型的结构体,该结构体定义的代码如下:structBOOK{intid;intusr[10];inttotal;intstore;intdays[10];intzt;charname[31];charauthor[21];}books[100];数据链接数据通过每个节点的“next”指针来链接,是单线性链表,只可以从头部查询数据,所以要记录好该链表的头结点位置,不要拿该节点的头结点参与运算,否则在程序中可能会修改该链表的头结点的信息,导致后续程序无法运行。图书馆管理系统流程图图书馆管理系统注册登陆注册登陆借阅借阅注销注册归还注销注册归还A、借阅模块:函数声明:voidbook_out(void);//借书该函数的流程图如下:进入查找进入查找进入借阅退出借阅输入书号存在YN输入可借天数B、归还模块函数声明:voidbook_in(void);//还书该函数流程图如下:进入归还进入归还输入书号存在归还归还成功退出归还YNYNC、入库模块函数声明:voidbook_add(void);//入库流程图如下:开始入库开始入库输入书号输入书号输入书籍信息输入书籍信息录入成功录入成功结束输入结束输入D、注销模块函数声明:voidbook_del(void)流程图如下:进入注销进入注销查找编号查找编号信息清零信息清零注销结束注销结束算法设计读者信息存储读者信息采用线性单链表存储,设置头结点,头结点不存储数据,初始化时头结点->next设置为空,然后每从文件中读取一组数据,则将该数据存入新开辟的空间,链接到读者信息链表中,再将该数据的next置空。书籍信息存储书记信息存储采用数组存储方式。查找查找分按书名查找、按作者查找和按书号查找。用switch()语句进行查找。详细程序清单头文件定义头文件library.h定义了2个结构体:书籍结构体、读者结构体头文件还包含一些系统头文件的声明:#include"stdio.h"#include"string.h"#include"conio.h"#include"windows.h"还有一些函数的声明,用#ifndef、#endif来包含,以免重复包含。插入部分插入部分分为新书注册、读者注册、登陆4大块,分3个函数,声明如下: voidbook_add(void);//新书注册voidreg(reader*head);//注册reader*login(reader*rhead);//登陆这3个函数分别实现新书入库、读者注册、登陆等功能,入库功能只有管理员才能调用,其余函数均可以调用,在主函数界面就可以。查找模块查找模块分书籍查找模块,查找模块的定义如下:intsearch_book(void);显示模块根据给出的节点指针,显示该节点所包含读者信息,函数的声明如下:voidshowR(reader*tr);//显示读者信息函数这个模块还有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"读者";}风格函数Style()这个函数用来设置运行的界面颜色,并调用时执行清屏。还有密码保护函数,这个函数可以保护输入的密码不显示在界面上,不被别人看到,这个函数的定义如下:voidintpsd(char*psd)//密码保护函数{inti=0;charc;while((c=getch())!=13)/*用getch()读入的回车值为13*/{if(c!='\b'&&c!='\t'&&i<20){psd[i]=c;putchar('*');i++;}if(c=='\b'&&i>0){printf("\b\b");i--;}/*输出内容为退格,空格,退格;擦掉一个字符*/}psd[i]='\0';return;}这个模块还有几个菜单界面,不再赘述。程序运行结果登陆界面操作菜单 新书注册界面借阅界面还书界面 心得体会这个程序设计大作业相对去年的程序设计大作业来说,难度有所提高,主要是使用了一些数据的处理方法,在数据的存储、调用、查找、排序等方面都得到了充分的锻炼,巩固了数据结构的基本知识,加深了对C语言知识的巩固,并尝试了一些新的想法和思路,在整个程序设计过程中收获颇多。在处理数据和程序代码方面都得到了很大的锻炼。这次课程设计使我看到了很多不足,主要是对语言还理解不够透彻,一知半解等现象,也没有做出很漂亮的界面来支撑程序,而且个人感觉有些凌乱。总之,这次程序设计大作业,感受颇多,今后还要继续努力!参考文献[1]严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,2010.3

[2]蒋清明,黄晓宇,向德生等.C语言程序设计.北京:人民邮电出版社,2008.4[3]李春葆等.数据结构教程(C语言版)。北京:清华大学出版社,2005.1源代码#include<stdio.h>#include<stdlib.h>#include<conio.h>#include"string.h"#include"windows.h"#include"time.h"typedefstructREADER{ longnumber; charname[15]; charsex; charpassword[16]; intresidue; longborrowed[10][2]; intlimit; structREADER*next;}reader;structBOOK{intid,usr[10],total,store,days[10],zt;charname[31],author[21];}books[100];voidreg(reader*head);//注册reader*login(reader*rhead);//登陆voidstyle();//风格函数voidintpsd(char*psd);//密码保护函数reader*menu(reader*Rhead);//菜单reader*S_reader(reader*rhead,longnum);//查找读者voidRsave(reader*Rhead);//读者信息链表写入voidshowR(reader*tr);char*sc(charp);char*lc(inti);reader*menu(reader*Rhead){ Rhead=(reader*)malloc(sizeof(reader)); Rhead->next=NULL; reader*tempr; style(); charm; while(1){ printf("\n┏━━━━━━━━┓"); printf("\n◢━━━━━━━━━━━┫→图书馆系统←┣━━━━━━━━━━━◣"); printf("\n┃┗━━━━━━━━┛直┃"); printf("\n┃┏━━━━━━━━┓接┃"); printf("\n┃┃┃可退┓┃"); printf("\n┃╭★°┃┃能┗出┃"); printf("\n┃╭┛/┃→1﹑登陆┃导┃"); printf("\n┃╰═┛┃┃至┃"); printf("\n┃┃→2﹑注册┃数┃"); printf("\n┃┃┃据┃"); printf("\n┃┃┃未┃"); printf("\n┃┃其它键保存退出┃存┃"); printf("\n┃┗━━━━━━━━┛储┃"); printf("\n◥━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━◤\n"); fflush(stdin); m=getch(); if(m=='2') reg(Rhead); else if(m=='1') { tempr=login(Rhead); if(tempr==NULL) { continue; } else { returntempr; } //menu2(tempr,Rhead,Bhead); } else { //Rsave(Rhead); exit(0); } }}voidstyle()//风格函数{// system("modeconcols=80lines=300"); system("color0f"); system("cls");}voidintpsd(char*psd)//密码保护函数{inti=0;charc;while((c=getch())!=13)/*用getch()读入的回车值为13*/{if(c!='\b'&&c!='\t'&&i<20){psd[i]=c;putchar('*');i++;}if(c=='\b'&&i>0){printf("\b\b");i--;}/*输出内容为退格,空格,退格;擦掉一个字符*/}psd[i]='\0';return;}reader*S_reader(reader*rhead,longnum)//查找读者{ reader*temp=rhead->next; if(temp==NULL) { printf("\n文件中没有数据导入,请检查修复系统!"); returnNULL; } else { while(temp) { if(temp->number==num) returntemp; else temp=temp->next; } returntemp; }}reader*login(reader*rhead)//登陆{ longnum; charpass[16]; inti=5; reader*reader; style(); printf("\n┏━━━━━━━━━━┓"); printf("\n█━━━━━━━━━━━┫欢迎使用登陆系统┣━━━━━━━━━━━█"); printf("\n┗━━━━━━━━━━┛"); while(1) { printf("\n请输入您的借阅证号:"); scanf("%d",&num); if((reader=S_reader(rhead,num))==NULL) { printf("\n没有找到您所在编号的读者."); getch(); returnNULL; } else break; } while(i>0) { printf("\n请输入密码:"); intpsd(pass); if(strcmp(pass,reader->password)==0) returnreader; else { printf("\n密码错误"); returnNULL; } }}voidshowR(reader*tr){// inti;// book*p; printf("\n╔════════╗"); printf("\n╔══════════╣读者信息╠══════════╗"); printf("\n║╚════════╝║"); printf("\n╠══════╦═════╦═══╦════╦════╦═══╣"); printf("\n║借阅证号║姓名║性别║剩余可借║已借本数║权限║"); printf("\n╠══════╬═════╬═══╬════╬════╬═══╣"); printf("\n║%12d║%10s║%6s║%8d║%8d║%6s║",tr->number,tr->name,sc(tr->sex),tr->residue,10-tr->residue,lc(tr->limit)); printf("\n╚══════╩═════╩═══╩════╩════╩═══╝");}char*lc(inti){ if(i==1) return"管理员"; else return"读者";}char*sc(charp){ if(p=='F'||p=='f') return"女"; else return"男";}voidreg(reader*head)//注册{ style(); longi=1000; intj; chart1[16],t2[16]; //head=(reader*)malloc(sizeof(reader)); reader*temp=head->next; reader*p=(reader*)malloc(sizeof(reader)); printf("\n┏━━━━━━━━━━┓"); printf("\n█━━━━━━━━━━━┫欢迎使用注册系统┣━━━━━━━━━━━█"); printf("\n┗━━━━━━━━━━┛"); printf("\n请输入姓名:"); scanf("%s",p->name); getchar(); 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->next=p; p->limit=1; } else { ++i; while(temp->next!=NULL) { ++i; temp=temp->next; } p->number=i; p->limit=0; temp->next=p; } showR(p);}voidpage_title(char*menu_item){ printf("\n"); printf("************欢迎使用08WL型图书馆管理系统************\n\n-%s-\n\n",menu_item);}voidreturn_confirm(void){printf("\n按任意键返回……\n");getch();}voidstate(intn){if(books[n].total!=0)printf("1");if(books[n].total==0)printf("0");}intsearch_book(void){intn,i;chars[31],p[21];printf("请用数字键选择操作\n\n");printf("1按图书序号查找\n\n2按书名查找\n\n");printf("3按作者查找\n\n");switch(getch()) { case'1': printf("请输入图书序号:"); scanf("%d",&i); for(n=0;n<100;n++) { if(books[n].id==i) { printf("书名:%s\n",books[n].name); printf("作者:%s\n",books[n].author); printf("存数:%dof",books[n].store); printf("存在状态:%d\n",books[n].zt); printf("%d\n",books[n].total); returnn; } } printf("\n输入错误或无效图书序号.\n"); return-1; case'2': printf("请输入图书名称:"); scanf("%s",&s); for(n=0;n<100;n++) { if(strcmp(books[n].name,s)==0) { printf("书号:%d\n",books[n].id); printf("作者:%s\n",books[n].author); printf("存数:%dof",books[n].store); printf("存在状态:%d\n",books[n].zt); printf("%d\n",books[n].total); returnn; } } printf("\n输入错误或无效图书名称.\n"); return-1; case'3': printf("请输入作者姓名:"); scanf("%s",&p); for(n=0;n<100;n++) { if(strcmp(books[n].author,p)==0) { printf("书名:%s\n",books[n].name); printf("书号:%d\n",books[n].id); printf("存数:%dof",books[n].store); printf("存在状态:%d\n",books[n].zt); printf("%d\n",books[n].total); returnn; } } printf("\n输入错误或无效作者名称.\n"); return-1; }}voidbook_out(void){ intn,s,l,d; page_title("借阅图书");if((n=search_book())!=-1&&books[n].store>0){printf("请输入借书证序号:");scanf("%d",&s);printf("请输入可借天数:");scanf("%d",&d);for(l=0;l<10;l++){if(books[n].usr[l]==0){books[n].usr[l]=s;books[n].days[l]=d;break;}}books[n].store--;}if(n!=-1&&books[n].store==0)printf("此书已经全部借出.\n");return_confirm();}/*上面是借书的函数,首先调用找书函数*/voidbook_in(void){intn,s,l;page_title("归还图书");if((n=search_book())!=-1&&books[n].store<books[n].total){printf("借阅者图书证列表:\n");for(l=0;l<10;l++)if(books[n].usr[l]!=0)printf("[%d]-%d天\n",books[n].usr[l],books[n].days[l]);printf("请输入借书证序号:");scanf("%d",&s);for(l=0;l<10;l++){if(books[n].usr[l]==s){books[n].usr[l]=0;books[n].da

温馨提示

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

最新文档

评论

0/150

提交评论