1、 目 录1、题目与要求22、系统总体设计(要给出必要的文字说明及必要的图示)32.1 功能需求分析(明确选题的功能需求)32.2 系统功能模块划分(要给出系统功能模块图)43、详细设计43.1重要数据的数据结构设计(即结构体的声明、变量的定义、文件)43.2 函数的规划和设计(即根据分析需要设计哪些函数及其之间的调用关系)53.3 主控模块(main函数)的流程分析与设计(要画出主函数的流程图)63.4 主要功能模块的流程分析与设计(分别要画出各主要功能模块实现的流程图)74、课程设计小结114.1 运行结果114.2设计中的难点及其解决方法184.3 不足之处.195、小组人员分工说明(明确
2、各个组员的具体分工及实际完成情况)19评语及成绩206、附录(源代码)211、题目与要求(标题的字体格式、段落格式照此,以下同!)题目:图书馆管理系统要求:能够完成图书馆日常操作,数据要能够保存,能够随时取出,并在任何操作后都能保持信息完整性,图书的原始数据需保存到磁盘文件中。2、系统总体设计(要给出必要的文字说明及必要的图示)主要分为四大部分:1、图书查找(包括按书名或作者查找)2、借阅图书3、归还图书4、管理系统(包括添加图书、修改图书、删除图书、图书统计、学生管理、职工管理等)2.1 功能需求分析(明确选题的功能需求)具体功能:图书查找n 按书名查找。n 按作者查找。图书借还n 借书l
3、判断所借书籍号是否存在,若不存在重新输入书籍号。l 判断该借书证号是否存在,若不存在重新输入借书证号(即办卡功能)。l 判断该书籍是否已借出,若是则不允许执行借书操作。l 借书处理包括在“借还书登记”中增加该借书情况,在该图书信息中加上“已借”标记。n 还书l 判断所借书是否存在,若不存在重新输入书籍。l 判断该书是否已借出,若不是则不允许执行还书操作。l 借书处理包括在“借还书登记”中增加该还书情况,在该图书信息中加上“未借”标记。管理系统:n 添加图书:增加新的图书,同时需检查新书的图书编号是否在原图书当中存在,若是则应取消添加并提示重新输入。n 删除图书资料:通过编号查询该图书,若找到则
4、允许删除,否则提示无该图书信息。删除对象包括该图书资料以及“借还书登记”中的相关记录。n 删除图书资料:通过编号查询该图书,若找到则允许删除,否则提示无该图书信息。删除对象包括该图书资料以及“借还书登记”中的相关记录。n 图书统计:统计图书馆里存有多本图书。n 学生管理:办理借书卡,统计有多少人有该图书馆的借阅卡,取消在该图书馆借阅图书,查看有多图书被借出。n 职工管理:增加该图书馆管理员工,除掉某员工,员工调职修改资料,统计员工人数等。2.2 系统功能模块划分(要给出系统功能模块图)图书管理系统图图书查找 借书按作者查询按书名查询还书管理系统学生管理添加图书删除图书图书统计职工管理修改图书申
5、请办卡删除卡号图书统计卡号统计增加员工删除员工修改员工统计员工3、详细设计3.1重要数据的数据结构设计(即结构体的声明、变量的定义、文件)11struct student /*定义学生类型,用于存放借出的书籍*/ int carnum; char lendbook10; student1000;struct employ /*定义职工类型*/ int employnum; char employname15; int employage; char employsex2; char employleve10; long int employtage; employ50;struct book
6、/*定义书的类型*/ int booknum; char bookname10; char bookcreat10; int turefalse; /*用于借书和还书模块判断一本书是否借出的条件*/ book1000;struct car /*借书卡的数据类型*/ int carnum; char studentname10; int studentclass; car100;文件有:图书保存文件:book.txt借阅卡文件:car.txt借阅信息文件:record.txt职工信息文件:employ.txt修改文件:bookl.txt3.2 函数的规划和设计(即根据分析需要设计哪些函数及其之间
7、的调用关系)主要设计的函数有:添加图书函数addbook()删除图书函数delbook()图书查询函数chabook()、findbook()、findbook1()图书统计函数bookcount()办卡函数addcar()删除卡函数delcar()卡号统计函数carcount()借书函数lendbook()借出图书统计函数lendcount()还书函数huanbook()修改员工资料函数changemploy()删除员工函数delemploy()添加员工函数addemploy()员工统计函数employcount()其中有调用关系的有:1、主函数main():查找图书函数chabook()、
8、借书函数lendbook()、添加图书函数addbook()、删除图书函数delbook()、修改图书函数changebook()、图书统计函数bookcount()、修改员工资料函数changemploy()、删除员工函数delemploy()、添加员工函数addemploy()、员工统计函数employcount()、办卡函数addcar()、删除卡函数delcar()、卡号统计函数carcount()、借出图书统计函数lendcount()。2、查找图书函数chabook():按书名查找函数findbook()、按作者查找函数findbook1()。3.3 主控模块(main函数)的流程
9、分析与设计(要画出主函数的流程图)开始I=0输入iI=1I=2I=3结束查阅图书借阅图书管理系统还书I=4Main函数流程yNyyyyNNNN主函数主要分为4个部分的功能(查阅图书、借阅图书、管理系统、还书)和一个退出系统的选择,分别用i的值判断其功能。当i=0时,为退出系统;当i=1时,为查阅图书;当i=2时,为借阅图书;当i=3时,为管理系统,当i=4时,为还书功能。3.4 主要功能模块的流程分析与设计(分别要画出各主要功能模块实现的流程图)主要的功能模块有:管理流程、职工管理、学生管理、图书查找、借书流程、还书流程管理系统I=0输入iI=1I=2I=3I=4NNNNNNI=5I=6结束添
10、加图书删除图书修改图书资料书籍统计职工管理学生管理YYYYYYY管理系统职工管理I=0输入iI=1I=2I=3I=4NNNNN结束增加员工删除员工修改员工统计员工职工管理YYYY查阅图书输入iI=0I=1I=2按书名查找按作者查找结束YYNNNY图书查找还书还书流程图输入书编号kkkKkk是否存在Kkk是否借出还书登记结束该书没借出NNYY借书输入书编号kkkKkk是否存在kkk是否借出输入ch判断是否重输Ch=y or ch=Y登记借书结束该书已借出NNYYNY借书流程图学生管理I=0输入iI=1I=2I=3I=4NNNNN结束申请新卡删除卡号借书统计卡号统计学生管理YYYY4、课程设计小结
11、4.1 运行结果如下:4.2 设计中的难点及其解决方法这个系统设计中,主要的难点在于要两个方面,一是设计的对象分为两个方面(面向书馆的管理方面和学生的借阅方面),二是历史查询的功能实现比较困难复杂。针对第一个问题,我们设计了书馆和借阅人这两个方面的结构体,分别实现不同的功能。针对第二个问题,我们主要以多方面的查询来实现这一功能的。此外,我们在借阅图书这个模块消耗了很多时间和人力,一开始总是运行不了,分析代码是没有问题的,可是就是无法实现功能。后来我们发现,主要是办卡功能被我们弄进去了,以至于借书的记录无法保存。所以我们就将办卡的功能放到图书管理那部分。4.3 不足之处首先,我们设计的界面不够美
12、观整齐,本来想弄出表格的形式,但由于时间的关系,无法具体完善。其次,这个系统中,部分功能的实现不够完善,缺乏人性化。最后,我们认为这个系统的的功能不够具体,缺少一些实用性的功能。而且,我们的系统运行繁琐,不够明朗,也没有使用清屏的功能,界面显得罗嗦。查询功能方面也不具人性化。5、小组人员分工说明(明确各个组员的具体分工及实际完成情况)学号姓名分工及完成情况评语及成绩指导教师评语: 指导教师签名: 2011年 月 日小组答辩成绩课程设计成绩评定学 号姓 名第1阶段成绩(30%)第2阶段成绩(60%)平时成绩(10%)最终成绩1931附录源代码如下:#include #include #inclu
13、de #include #include #define STACK_INIT_SIZE 10 #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0struct student /*定义学生类型,用于存放借出的书籍*/ int carnum; char lendbook10; student1000;struct employ /*定义职工类型*/ int employnum; char employname15; int employage; char employsex2; char employleve10; long i
14、nt employtage; employ50;struct book /*定义书的类型*/ int booknum; char bookname10; char bookcreat10; int turefalse; /*用于借书和还书模块判断一本书是否借出的条件*/ book1000;struct car /*借书卡的数据类型*/ int carnum; char studentname10; int studentclass; car100;huanbook() /*还书函数*/ FILE *fp,*fp2; /*定义两个文件指针,fp2用于修改数据时设立临时文件用,防止数据遭破坏*/
15、int i,n; int carnum; char lendbook10; printf(请你输入你的卡号n); scanf(%d,&carnum); fp=fopen(car.txt,r); /*读取卡号记录*/ for(i=0;fread(&cari,sizeof(struct car),1,fp)!=0;i+) /*for循环判断卡号是否存在*/ if(cari.carnum=carnum) /*卡号存在,进入下一循环*/ n=i; fclose(fp); printf(请输入你要还的书的名字n); scanf(%s,lendbook); fp=fopen(record.txt,r);
16、for(i=0;fread(&studenti,sizeof(struct student),1,fp)!=0;i+) /*判断是否借阅了输入的书*/ if(strcmp(studenti.lendbook,lendbook)=0) /*借阅了该书,进入下一循环,否则出错显示*/ fclose(fp); fp=fopen(record.txt,r); fp2=fopen(bookl.txt,w); for(i=0;fread(&studenti,sizeof(struct student),1,fp)!=0;i+) if(strcmp(studenti.lendbook,lendbook)=0
17、) continue; /*删除还掉的书的借书记录*/ fwrite(&studenti,sizeof(struct student),1,fp2); /*写入原来没还的书的记录*/ fclose(fp); fclose(fp2); fp=fopen(record.txt,w); fp2=fopen(bookl.txt,r); for(i=0;fread(&studenti,sizeof(struct student),1,fp2)!=0;i+) fwrite(&studenti,sizeof(struct student),1,fp); /*将借书记录信息写回*/ fclose(fp); f
18、close(fp2); fopen(bookl.txt,w); /*清临时文件的记录*/ fclose(fp2); fp=fopen(book.txt,r); fp2=fopen(bookl.txt,w); for(i=0;fread(&booki,sizeof(struct book),1,fp)!=0;i+) /*将书的记录写入临时文件,防止因为修改信息破坏以前的记录*/ if(i=n) booki.turefalse=1; fwrite(&booki,sizeof(struct book),1,fp2); /*将还的书的原来状态设为无人借阅的*/ continue; fwrite(&bo
19、oki,sizeof(struct book),1,fp2); fclose(fp); fclose(fp2); fp=fopen(book.txt,w); fp2=fopen(bookl.txt,r); for(i=0;fread(&booki,sizeof(struct book),1,fp2)!=0;i+) fwrite(&booki,sizeof(struct book),1,fp); /*将临时文件写回*/ fclose(fp); fclose(fp2); fopen(bookl.txt,w); /*清临时文件*/ fclose(fp2); printf(还书完毕,按任意键返回n);
20、 getch(); return 1; printf(你没有借这样的书,任意键返回n); /*出错提示*/ fclose(fp); getch(); return 0; printf(系统没这样的卡,和管理员联系,按任意键返回n); /*出错提示*/ fclose(fp); getch(); findbook() FILE *fp; char bookname10; int ture,i; fp=fopen(book.txt,r); printf(请输入你要查找的书名n); scanf(%s,bookname); for(i=0;fread(&booki,sizeof(struct book)
21、,1,fp)!=0;i+) if(strcmp(bookname,booki.bookname)=0) if(booki.turefalse=1) printf(这本书的详细资料是:%d %s %s 此书现在无人借阅n按任意键返回n,booki.booknum,booki.bookname,booki.bookcreat); else printf(这本书已经有人借出n);fclose(fp);return 0; fclose(fp); return FALSE; printf(没有你要查询的书籍n); fclose(fp); return FALSE; findbook1() FILE *f
22、p; char bookcreat10; int ture,i; fp=fopen(book.txt,r); printf(请输入你要查找的作者名n); scanf(%s,bookcreat); for(i=0;fread(&booki,sizeof(struct book),1,fp)!=0;i+) if(strcmp(bookcreat,booki.bookcreat)=0) if(booki.turefalse=1) printf(这本书的详细资料是:%d %s %s 此书现在无人借阅n按任意键返回n,booki.booknum,booki.bookname,booki.bookcrea
23、t); else printf(这本书已经有人借出n);fclose(fp);return 0; fclose(fp); return FALSE; printf(没有你要查询的书籍n); fclose(fp); return FALSE; lendcount() FILE *fp; int i,n=0; fp=fopen(record.txt,r); for(i=0;fread(&studenti,sizeof(struct student),1,fp)!=0;i+) printf(卡号:%d 借出的书籍:%s n,studenti.carnum,studenti.lendbook); n=
24、n+1; fclose(fp); printf(目前共有%d本书借出n,n); printf(按任意键n); getch();return n; chabook() char ch5; do printf(-欢迎进入图书查询系统!-n); printf( 1:n); printf( 2:n); printf( 0:n); printf(请输入0-2,其他输入非法!n); scanf(%s,&ch5); switch(ch5) case 1:findbook();getch();break; case 2:findbook1();getch();break; case 0:break; defa
25、ult:printf(无此操作n);getch();break; while(ch5!=0);return FALSE; lendbook() FILE *fp,*fp2; int i,n; int carnum; printf(请你输入你的卡号n); scanf(%d,&carnum); fp=fopen(car.txt,r); for(i=0;fread(&cari,sizeof(struct car),1,fp)!=0;i+) if(cari.carnum=carnum) n=i; fclose(fp); printf(请输入你要借阅的书的名字n); scanf(%s,studentn.
26、lendbook); fp=fopen(book.txt,r); for(i=0;fread(&booki,sizeof(struct book),1,fp)!=0;i+) if(strcmp(booki.bookname,studentn.lendbook)=0) if(booki.turefalse=0) printf(对不起,此书有人借出,请借其他书n);fclose(fp);getch();return; else fclose(fp); fp=fopen(record.txt,a+); studentn.carnum=carnum; fwrite(&studentn,sizeof(s
27、truct student),1,fp); fclose(fp); fp=fopen(book.txt,r); fp2=fopen(bookl.txt,w); for(i=0;fread(&booki,sizeof(struct book),1,fp)!=0;i+) if(strcmp(booki.bookname,studentn.lendbook)=0) booki.turefalse=0; fwrite(&booki,sizeof(struct book),1,fp2); continue; fwrite(&booki,sizeof(struct book),1,fp2); fclose
28、(fp); fclose(fp2); fp=fopen(book.txt,w); fp2=fopen(bookl.txt,r); for(i=0;fread(&booki,sizeof(struct book),1,fp2)!=0;i+) fwrite(&booki,sizeof(struct book),1,fp); fclose(fp); fclose(fp2); fopen(bookl.txt,w); fclose(fp2); printf(借书完毕,按任意键返回n); getch(); return; printf(不存在这样的书,任意键返回n); fclose(fp); getch(
29、); return; printf(你的卡号不存在,请申请新卡,按任意键返回n); fclose(fp); getch(); carcount() FILE *fp; int i,n=0; fp=fopen(car.txt,r); for(i=0;fread(&cari,sizeof(struct car),1,fp)!=0;i+) printf(第%d张卡n,i+1,cari.carnum,cari.studentname,cari.studentclass); n=n+1; fclose(fp); printf(目前共有%d本书n,n); printf(按任意键n); getch(); d
30、elcar() FILE *fp,*fp2; int i; int carnum; char choice; fp=fopen(car.txt,r); fp2=fopen(bookl.txt,w); printf(请输入你要删除的卡号n); printf(如果你输入的卡号存在,系统自动删除该信息!如果不存在,系统不做任何改动n); scanf(%d,&carnum); for(i=0;fread(&cari,sizeof(struct car),1,fp)!=0;i+) if(cari.carnum!=carnum) fwrite(&cari,sizeof(struct car),1,fp2)
31、; fclose(fp); fclose(fp2); printf(是否真的要删除该卡?删除后该书籍的所有信息将无法恢复Y/Nn); scanf(%s,&choice); if(choice=y|choice=Y) fp=fopen(car.txt,w); fp2=fopen(bookl.txt,r); for(i=0;fread(&cari,sizeof(struct car),1,fp2)!=0;i+) fwrite(&cari,sizeof(struct car),1,fp); fclose(fp); fclose(fp2); fp2=fopen(bookl.txt,w); fclose
32、(fp2); printf(按任意键返回n); getch(); return; else printf(按任意键返回n); getch(); return; addcar() FILE *fp; int i=0; fp=fopen(car.txt,a+); printf(请你输入卡号n); scanf(%d,&cari.carnum); printf(请你输入学生姓名n); scanf(%s,cari.studentname); printf(请你输入班级n); scanf(%d,&cari.studentclass); fwrite(&cari,sizeof(struct car),1,f
33、p); fclose(fp); printf(输入完毕,任意键返回n); getch(); changemploy() FILE *fp,*fp2; char employname10,choice;int i; fp=fopen(employ.txt,r); fp2=fopen(bookl.txt,w); printf(请你输入要修改的职工的名字n); scanf(%s,employname); for(i=0;fread(&employi,sizeof(struct employ),1,fp)!=0;i+) if(strcmp(employi.employname,employname)=
34、0) printf(你所要修改的职工的资料如下,请选择你要修改的内容n); printf(n,employi.employnum,employi.employname,employi.employage,employi.employsex,employi.employleve,employi.employtage); printf(2:修改职工名n); printf(3:修改职工年龄n); printf(4:修改职工工资n); printf(5:修改职工学历n); printf(请输入1-5:); scanf(%s,&choice); switch(choice) case 1: printf
35、(请输入新的职工号n); scanf(%d,&employi.employnum); fwrite(&employi,sizeof(struct employ),1,fp2); break; case 2: printf(请输入新的职工姓名n); scanf(%s,employi.employname); fwrite(&employi,sizeof(struct employ),1,fp2); break; case 3: printf(请输入新的年龄n); scanf(%d,&employi.employage); fwrite(&employi,sizeof(struct employ)
36、,1,fp2); break; case 4: printf(请输入新的职工工资n); scanf(%d,&employi.employtage); fwrite(&employi,sizeof(struct employ),1,fp2); break; case 5: printf(请输入新的职工学历n); scanf(%s,employi.employleve); fwrite(&employi,sizeof(struct employ),1,fp2); default:printf(没有这样的操作);break; continue; fwrite(&employi,sizeof(struct employ),1,fp2); fclose(fp); fclose(fp2); fp=fopen(employ.txt,w); fp2=fopen(bookl.txt,r); for(i=0;fread(&employi,sizeof(struct employ),1,fp2)!=0;i+) fwrite(&employi,sizeof(struct employ),1,fp); fclose(fp); fclose(fp2); fp2=fopen(bookl.txt