课程报告课程名称:c程序设计实践专业班级:信息类学生姓名:周元甲学号:任课教师:学期:2011-2012学年第二学期课程报告任务书开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。
使之能提供以下基本功能:(1)图书信息录入功能(图书信息用文件保存)--输入(2)图书信息浏览功能--输出(3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式):①按书名查询②按作者名查询③按照价钱排序④按出版时间排序等等(4)图书信息的删除与修改扩展功能:可以按照自己的程度进行扩展。
比如(1)简单的权限处理(2)报表打印功能(3)甚至根据自己情况,可以加上学生信息,并扩充为图书借阅系统。
(4)模糊查询(5)综合查询(6)统计功能比如统计处某一类别的图书信息或筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能。
成绩评定教师:1 需求分析对案例分析后,我认为该案例是需要一个管理图书馆内图书信息的程序,做程序的当然要根据需求做了,图书信息录入就是增加图书信息,可以用一个文件来存储,修改、删除图书信息就是对存储的文件进行改动,查询则是对文件进行检索而已,无论是查询、排序还是浏览,都要对文件进行遍历,然后在内存中执行简单的操作,得出想要的结果。
考虑到权限的需求,我认为这个系统需要一个管理员,至少是不能让别人随随便便就能进去,而改动其中的信息,于是我想到,既然是图书馆管理系统,那就需要老师和学生都能进去,而执行不同的操作,由于身份不同,可执行的操作也就不同,学生的权限当然没有老师的大了。
由于这是一个图书馆管理系统,学生进去之后便可以进行借书,查书,还书等操作。
这才是符合正常的权限和功能设置,老师也有权决定哪些学生可以进去,哪些不能进,知道哪些同学借了哪些书。
这就是我对这个案例的需求分析。
2 概要设计由于是概要设计下面先介绍一下系统的总体框架,细节部分不再详述。
该程序主要能够实现图书的录入、查询、修改、删除、排序、浏览;学生信息的注册、修改、删除、浏览;教师的登陆、学生的登录;其中教师拥有对图书的录入、查询、修改、删除、排序、浏览,学生信息的注册、修改、删除、浏览等权限;学生拥有对图书的查询、排序、浏览、借书、查询已借图书、还书等权限;学生的权限由教师赋予、学生登录的账号、密码等由教师设定;学生的借书、还书都会引起库中图书数量的变动;为了防止恶作剧,并给每个人都有借书的机会,由于图书数量有限,每个学生仅限借三本书,超过三本系统将会自动提示,并不能借出。
本程序主要就用了文件的打开、关闭、写入、读出等函数如fopen()、fclose()、fwrite()、fread()。
程序总体框架如下:程序中用到了两个结构体struct studentinform{char name[30],key[30],book1[30],book2[30],book3[30];}stud[1000];struct bookinform按时间排序浏览管理学生信息查询图书信息增加图书信息按作者查询按编号查询按类别查询按书名查询学生登录河南工业大学图书馆管理系统教师登录借阅图书按时间排序浏览归还图书查询已借书查询图书信息删除图书信息修改图书信息删除学生信息修改学生信息浏览学信息增加学生信息按作者查询按编号查询按类别查询按书名查询{char num[30],name[30],author[30],company[30],type[30],time[30],price[30];int count;}book[10000];其中前者是用来创建图书信息的结构体,后者是用来创建学生信息的结构体。
3 详细设计①图书信息的录入:该函数主要是通过用fwrite(&book[i],sizeof(struct bookinform),1,fp);这样一个函数来向文件中写入二进制的数据,来实现对图书信息的存储,其缺点是定入的信息是二进制的数据,非字符串型的数据用记事本等打开后不能正确显示,但并不影响程序的使用,因为在下面的打开程序中也用二进制的方式打开,所以显示出的数据还各输入的一样。
详细代码如下:void addbook()/*录入图书*/{system("cls");printf("\n■□■□■□录入图书□■□■□■\n");printf("\n师者所以传道授业解惑也。
——韩愈\n\n");FILE *fp;int judge=1,n=1,i=0;while(judge){printf("请您输入而要录入的图书的\n\n■编号■书名■作者");printf("■出版社■类别■出版时间■价格■数量\n");i++;scanf("%s%s%s%s",book[i].num,book[i].name,book[i].author,book[i].company);scanf("%s%s%s%d",book[i].type,book[i].time,book[i].price,&book[i].count);if((fp=fopen("book_information.txt","ab"))==NULL){printf("File open error!\n");exit(0);}fwrite(&book[i],sizeof(struct bookinform),1,fp);if(fclose(fp)){printf("Can not close the file!\n");exit(0);}printf("继续录入请按1,返回请按0:\n");scanf("%d",&judge);}②图书信息的查询:考虑到图书信息的查询我这个程序用到了四种查询方法,虽然不少,但是,他们都是调用一个函数,避免了程序的重复,使程序更简洁。
其中的j是个判断查询方法的变量,由上一层的选择查询方法的函数中获取,上一层的查询方法的获取,以及界面的显示不再一一细说,只对其核心的查询函数的源代码给出如下:int csearch(int j,char some[])/*查询核心*/{FILE *fp;int n,i,judge;n=1;if((fp=fopen("book_information.txt","rb"))==NULL){printf("书库为空!\n");exit(0);}for(i=0;fread(&book[i],sizeof(struct bookinform),1,fp)!=0;i++){if(j==1){if(!strcmp(some,book[i].name)){printf("●您要查询的图书详细信息如下:\n\n");printf("■编号:%s ■书名《%s》■作者:%s ■出版社:%s\n",book[i].num,book[i].name,book[i].author,book[i].company);printf("■类别:%s ■出版时间:%s ■价格:%s ■库存量:%d\n",book[i].type,book[i].time,book[i].price,book[i].count);n=0;}}else if(j==2){if(!strcmp(some,book[i].num)){printf("●您要查询的图书详细信息如下:\n\n");printf("■编号:%s ■书名《%s》■作者:%s ■出版社:%s\n",book[i].num,book[i].name,book[i].author,book[i].company);printf("■类别:%s ■出版时间:%s ■价格:%s ■库存量:%d\n",book[i].type,book[i].time,book[i].price,book[i].count);n=0;}}else if(j==3){if(!strcmp(some,book[i].author)){printf("●您要查询的图书详细信息如下:\n\n");printf("■编号:%s ■书名《%s》■作者:%s ■出版社:%s\n",book[i].num,book[i].name,book[i].author,book[i].company);printf("■类别:%s ■出版时间:%s ■价格:%s ■库存量:%d\n",book[i].type,book[i].time,book[i].price,book[i].count);n=0;}}else if(j==4){if(!strcmp(some,book[i].type)){printf("●您要查询的图书详细信息如下:\n\n");printf("■编号:%s ■书名《%s》■作者:%s ■出版社:%s\n",book[i].num,book[i].name,book[i].author,book[i].company);printf("■类别:%s ■出版时间:%s ■价格:%s ■库存量:%d\n",book[i].type,book[i].time,book[i].price,book[i].count);n=0;}}}if(n){printf("●对不起,您所查询的图书不存在!\n");printf("\n继续查询请按1,返回请按0:\n");scanf("%d",&judge);}else{printf("\n继续查询请按1,返回请按0:\n");scanf("%d",&judge);}if(fclose(fp)){printf("Can not close the file!\n");exit(0);}return judge;}③图书信息的修改、删除:由于图书信息的修改、删除都是应用一个文件内容覆盖的思想,其核心内容都是把文件读出后进行修改或删除并保存在另一个文件中,然后再将另一个文件中的内容覆盖到原文件上,完成对图书信息的修改、删除,由于其算法大致相同,为了避免重复的叙述,所以不再一一细说,仅举图书信息的修改源代码如下:void revise()/*修改图书信息*/{int i,n;n=1;char name[30];FILE *fp,*cfp;system("cls");printf("◆◇◆◇◆◇◆修改图书信息◆◇◆◇◆◇◆\n\n");printf("学贵得师,亦贵得友。