数据结构(图书管理系统)课程设计模板(共26页).doc
精选优质文档-倾情为你奉上课程设计题目题目: 图书管理系统 日期:2011-6-25年级: 大二 班级:计科0903班 姓名: 张闲臻 刘晓 李子清 夏广 夏玲玲学号:一实习目的通过实习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。二问题描述 简单的模拟学校图书管理系统,功能比较简单,容易上手。借书步骤如下: 图书入库-à学生注册-à学生借书-à查看图书馆图书信息-à查看学生信息-à还书管理-à再查看图书和学生信息-à退出图书管理系统三需求分析需求提出:各大高校都有图书馆,每个学校的图书管理系统可能都不会完全相同,但大致主要功能还是差不多的。好的图书管理系统当然既方便学生借阅书籍,也方便学校图书的管理。需求描述:作为大学生,我们也都很清楚怎么去图书馆借书。1. 首先,当然是要保证图书馆有书,在这个程序中,我们可以理解为图书的采编入库,得保证学生有书借才行。2. 图书馆已经有各式的书了,如果你需要借,则先应该在学校的图书管理系统中注册才行,至少的确认你是该校的学生才有资格的。其实就是一个通行证。3. 接下来就是借书的过程了。4. 借了书最后还是要还的,所以还有一个还书的过程。 四概要设计· 系统用到的抽象数据类型定义: 从整个管理系统来看,我们知道这里主要有两个对象,一个是图书馆的图书,另一个就是学生。这里这两个对象不单单是作为简单的主体存在,他们都有很多功能,所以我们使用结构体来定义这两个。 1. 图书结构体的定义: typedef struct char number10; /书号char name20; /书名char author20; /作者int countbook; /库存 int shY; /剩余量 mbook;typedef struct int count;/书的本数mbook book100;/最大可有100本书mlibrary;mlibrary library; 2.学生结构体 typedef struct /学生系统 char accountMAXCOUNT; /学生帐号 char name10; /学生姓名 book borrow_bookMAXNUM; /所借书目(书号) int borrownum; /借书数目 stu; typedef struct int u; /用于记录已注册的学生数目 stu zw; /最大学生 数 可以有1000人 Wstudent; Wstudent student; · 系统中子程序及功能要求的说明:1. void putin() 图书的采编入库:为了给学生提供较好的学习资源,我们可以采编多种类型的图书,而且每种类型的书籍可以入库一定数量,方便广大学生借阅。2void Regist() 学生注册信息:在借阅之前,通常要有身份识别,主要是为了学校管理各种书籍借出,能够统一规则管理整个借书于还书的过程。3. void borrow() (借书的方法) 其实整个程序的主要目的就是学生借书,学生通过自己注册的唯一编号借阅图书馆在馆的图书。而且每个学生最多只能借8本。4void lent() (还书的方法)借了书之后,在一定的时间内必须要归还,书是图书馆的,不是某个人的,不能总是占有它,当然也是从大众利益出发。5. void lookStu() (查看学生信息) 不管你是借了还是没有借书,只要你注册了,就会有你 的信息。包括你的借阅号,姓名,所借书籍书证号,借阅的书的数目,还书日期等6. void save_student() (保存学生信息) 如果只是你单方面的注册,而并没有将你的所有信息保存起来,那就等于你没有注册,如果你注册过了,借书时,没有保存,那就是说图书馆的系统并不承认你借过书。7. void readStu() (读取学生信息) 看上去好像和查看学生信息类似,其实完全不同的过程,这是一个将学生的有关信息保存在文件中的过程,这个过程是我们视觉上感觉不到的。这和保存学生8. void lookup() (查询图书信息) 这个类似于查询学生信息的方法,都是将从文件中读取的信息打印出来。9. void save() (保存图书信息的方法) 也就是将所有图书的信息记录在文件中,比如每次入库了多少图示,是哪些图书,数量是多少,或者是借出去一些后那些图书的现有量是多少等相关的信息。10. void readBook() (读取图书信息) 这个跟读取学生的信息道理是一样的,只有将学生的所有信息读取得内存中,我们才能得到完整的图书信息。 · 各程序模块之间的调用关系 从上面每个方法差不多也可以知道每个方法之间的关系了。入库之前,我们也需要将已经入库的图书和已经注册好的学生信息读取到内存中,以便后面的操作。入库图书后,需要void save(),之后还要void readBook() 也就是更新图书信息。 学生注册和图书入库的道路是一样的,注册之后,需要保存,再读取到内存中,也就是及时更新信息。 借书和还书的过程都是将图书和学生联系起来,每次借书时都需要同时更新图书的信息和学生的信息,借了书后,学生的记录中应该保存了他所借的书证号以及要还书的日期,而此时图书的信息也要相应的改变,借出后图书的数量或书目上要体现出来。 还书也是如此,成功还书后,学生信息和图书信息也都要更新,就用到了对学生和图书的信息的保存和读取。 五详细设计· 图书管理系统的伪码描述如下: /保存图书信息的算法 fp=fopen("library.doc","w"); /打开文件if(fp=NULL)printf("n不能保存图书信息n");return;fwrite(&library.count,sizeof(int),1,fp); /读取sizeof(int)个数据到文件中fwrite(library.book,sizeof(library.book0),library.count,fp);/从文件中读取图书信息 fp=fopen("library.doc","r"); /打开文件if(fp=NULL)printf("n不能打开图书信息n");return; fread(&library.count,sizeof(int),1,fp); /从文件中读取sizeof(int)个数据到library中 printf("-图书数量->"+library.count); fread(library.book,sizeof(library.book0),library.count,fp);/图书信息入库 while(y) scanf("%s",num); strcpy(library.booklibrary.count.number,num); scanf("%s",library.booklibrary.count.name); scanf("%s",library.booklibrary.count.author); scanf("%d",&library.booklibrary.count.countbook); library.booklibrary.count.shY=library.booklibrary.count.countbook; library.count+; /每次新书入库,要将图书的全部信息记录/查看所以图书信息 for (i=0;i<library.count;i+)printf("%st%st%st%dt%dn",library.booki.number,library.booki.name,library.booki.author,library.booki.shY,library.booki.countbook); /遍历图书的种类,将其打印出来/保存学生信息 fwrite(&student.u,sizeof(int),1,fp); /从学生信息中,读取sizeof(int)个学生结构体类型数据信息保存到文件中fwrite(student.z,sizeof(student.z0),student.u,fp);/读取学生信息 fread(&student.u,sizeof(int),1,fp);fread(student.z,sizeof(student.z0),student.u,fp);/借书管理 scanf("%s",bnum);/选择要借的书籍序列号 strcpy(student.zi.borrow_bookstudent.zi.borrownum.bName,bnum);/记录学生借书的信息scanf("%s",bo_day); strcpy(student.zi.borrow_bookstudent.zi.borrownum.borrow_day,bo_day); scanf("%s",lent_day); strcpy(student.zi.borrow_bookstudent.zi.borrownum.lent_day,lent_day);library.booki.shY-;student.zi.borrownum+;/每次借书后,学生的借书数目就会增加,而图书馆内的该类型书数目将减少1/还书管理 for(i=0;i<student.u;i+) /遍历已经注册好的学生for(j=0;j<student.zi.borrownum;j+) /找到学生后,遍历他所借的所有图书 library.booki.shY+;student.zi.borrownum-; /还书后,要将该信息清除掉六测试分析 按照附录中的测试数据,得出如下测试、分析结果:· 进入系统初始界面(未操作之前,图书和学生的文件也还不存在)注册读者(已经注册了的,就不需要注册了,可以直接借书)查询读者信息(未借书之前,没有借书记录)图书入库(可以入库不同的书)查询图书信息(没有借出之前,图书的现有量和库存是相同的)借书0101读者借01号图书一本此时查询图书信息01书本现有量减少10101读者的信息(借书后的学生信息)继续借7本书达到借书上限(一个学生只能借8本书)此时的0101读者的信息还书此时01号书的现有量增1此时0101读者的信息未借书七使用说明 a=1 时,采编入库图书, a=2时,注册学生信息,a=3时,学生借书管理,a=4时,学生还书,a=5时,显示学生信息,a=6时,显示图书信息,a=0时,退出图书管理系统。八附录:测试数据入库的图书书证号 01 书名 11 作者 AA 库存 100书证号 02 书名 22 作者 bb 库存 100书证号 5 书名 cc 作者 vv 库存 100注册学生 读者书证号 0101 读者姓名 qq九C语言代码实现#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXCOUNT 10#define MAXNUM 20#define w 1000typedef struct char number10; /书号char name20; /书名char author20; /作者int countbook; /库存 int shY; /剩余量 mbook;typedef struct int count;/书的本数mbook book100;/最大可有100本书mlibrary;mlibrary library; typedef struct char borrow_day10; /借书日期 char lent_day10; /还书日期 char bName10; / book;typedef struct /学生系统 char accountMAXCOUNT; /学生帐号 char name10; /学生姓名 book borrow_bookMAXNUM; /所借书目(书号) int borrownum; /借书数目 stu; typedef struct int u; /用于记录已注册的学生数目 stu zw; /最大学生 数 可以有1000人 Wstudent; Wstudent student; void save()/保存图书信息。FILE *fp;fp=fopen("library.doc","w");if(fp=NULL)printf("n不能保存图书信息n");return;fwrite(&library.count,sizeof(int),1,fp);fwrite(library.book,sizeof(library.book0),library.count,fp);fclose(fp);/每次将文件中的图书信息 ,加载到内存中void readBook() FILE *fp;fp=fopen("library.doc","r");if(fp=NULL)printf("n不能打开图书信息n");return; fread(&library.count,sizeof(int),1,fp); printf("-图书数量->"+library.count); fread(library.book,sizeof(library.book0),library.count,fp); fclose(fp); void putin() /*定义录入函数*/ int i,count1; char num10;int y=1;while(y) printf("n新书入库模块."); printf("n请输入新书信息.");printf("n包括书号,书名,数量");printf("n图书编号:");scanf("%s",num); / count1=library.count;for(i=0;i<library.count;i+) if(strcmp(library.booki.number,num)=0) return; count1+;if(strcmp(count1,library.count)=0) strcpy(library.booklibrary.count.number,num); printf("图书书名:"); scanf("%s",library.booklibrary.count.name); printf("图书作者:"); scanf("%s",library.booklibrary.count.author); printf("图书数量:"); scanf("%d",&library.booklibrary.count.countbook); library.booklibrary.count.shY=library.booklibrary.count.countbook; library.count+;/if(strcmp(count1,library.count)!=0)/*elseprintf("图书管已经有此书,请输入要增加的数量:"); scanf("%d",&library.booklibrary.count.countbook); library.booklibrary.count.shY=library.booklibrary.count.shY+library.booklibrary.count.countbook; */printf("n是否继续录入(1.继续;0,退出录入):");fflush(stdin);scanf("%d",&y);if (y!=1)y=0;break; save();/查询图书信息void lookup() int i;printf("图书号t图书名t作者名t现有量t库存量n");for (i=0;i<library.count;i+)printf("%st%st%st%dt%dn",library.booki.number,library.booki.name,library.booki.author,library.booki.shY,library.booki.countbook);fflush(stdin);getchar();/保存学生信息void save_student() FILE *fp;if(fp=fopen("student.doc","w")=NULL)printf("n不能保存学生信息n");return;fwrite(&student.u,sizeof(int),1,fp);fwrite(student.z,sizeof(student.z0),student.u,fp);fclose(fp);/读取学生的信息void readStu() FILE *fp;if(fp=fopen("student.doc","r")=NULL)printf("n不能读取学生信息n");return;fread(&student.u,sizeof(int),1,fp);/printf("- 学生的个数->%d",student.u);fread(student.z,sizeof(student.z0),student.u,fp);fclose(fp);/学生注册void Regist()int i;char account10;printf("nn读者初始化开始,请输入读者信息:n包括证号,姓名.n学生注册信息");printf("请输入读者的信息n读者书证号:");scanf("%s",account);for(i=0;i<student.u;i+)if(strcmp(student.zi.account,account)=0)printf("你已经注册了!"); return;if(i=student.u)strcpy(student.zstudent.u.account,account); printf("n读者的姓名:"); scanf("%s",student.zstudent.u.name); printf("恭喜你 注册成功!"); student.u+; fflush(stdin); save_student(); /保存学生信息 /借书 管理void borrow()char num10,bnum10,bo_day10,lent_day10;int i,y=1,j,n,cou=0;printf("tt你已进入借书模块.n");while(y) printf("请输入借书的读者证号:");scanf("%s",num) ; cou=library.count; for(i=0;i<student.u;i+) n+; if(strcmp(student.zi.account,num)=0&&library.count>0) if(student.zi.borrownum>=8) printf("对不起!你已达到最大借书上限,不能再借n");break; else printf("请输入你要借的书的编号:"); scanf("%s",bnum); for(j=0;j<library.count;j+)printf("-该书剩余数->"+library.bookj.shY); if(strcmp(library.bookj.number,bnum)!=0) continue; else strcpy(student.zi.borrow_bookstudent.zi.borrownum.bName,bnum); printf("请输入借书日期,格式如(08,03,24):"); scanf("%s",bo_day); strcpy(student.zi.borrow_bookstudent.zi.borrownum.borrow_day,bo_day); printf("请输入还书日期,格式如(08,03,24):"); scanf("%s",lent_day); strcpy(student.zi.borrow_bookstudent.zi.borrownum.lent_day,lent_day); printf("恭喜你!你已借书成功!n");library.booki.shY-;student.zi.borrownum+; save(); save_student(); readBook(); readStu(); break; if(j=cou) printf("对不起,本图书馆没有你要借的书(或者货存不足)!n"); return; if(n=i) printf("对不起,你还没有注册,请先注册,才能借书!"); return; printf("n是否继续录入(1.继续;0,退出录入):"); fflush(stdin); scanf("%d",&y); if (y!=1) y=0; return; save();save_student();/还书管理void lent() char num10,bnum10,bo_day10,lent_day10;int i,j,con;printf("tt你已进入还书模块.n"); printf("请输入还书的读者证号:");scanf("%s",num) ; for(i=0;i<student.u;i+) con+; if(strcmp(student.zi.account,num)=0) if(student.zi.borrownum<1) printf("对不起!你没有借书,不需要还!n");break; else printf("请输入你要借的书的编号:"); scanf("%s",bnum); for(j=0;j<student.zi.borrownum;j+) if(strcmp(student.zi.borrow_bookj.bName,bnum)=0) printf("恭喜你!你已成功还书!n"); library.booki.shY+;student.zi.borrownum-; save(); save_student(); return; if(strcmp(con,student.u)=0) printf("对不起,你还没有注册,请先注册!"); save();save_student();/查看学生信息void lookStu() int i,j;for (i=0;i<student.u;i+) printf("读者书证号t读者姓名t借书数目n"); printf("%stt%stt%dn",student.zi.account,student.zi.name,student.zi.borrownum);for(j=0;j<student.zi.borrownum;j+) printf("所借书名t还书日期n"); printf("t%stt%sn",student.zi.borrow_bookj.bName,student.zi.borrow_bookj.lent_day);printf("nn");fflush(stdin);getchar();/主函数void main()FILE *fp;int a;char y;printf("nttt欢迎使用图书管理系统nn");printf("nttt按 任意键 键 进 入 系 统.n");getch();system("cls");readBook(); /每次先将图书信息读取在内存中readStu(); /每次首先将 注册的学生信息 读取放在内存中 do printf("nnnnntttt图书信息管理系统ttttn");printf("tt*n");printf("ttt 0 -退出系统 n");printf("ttt 1 -采编入库 n"); printf("ttt 2 -登记读者 n");printf("ttt 3 -借阅登记 n");printf("ttt 4 -还书管理 n"); printf("ttt 5 -查询图书信息 n"); printf("ttt 6 -查询读者信息 n");printf("tt*n");printf("ttPlease Enter Choose: ");fflush(stdin);scanf("%d",&a);switch(a)case 0:printf("nn退出