课程设计(论文)某高校图书管理系统.doc
沈 阳 航 空 航 天 大 学 课程设计题目:某高校图书管理系统一、课程设计时间201011第2学期 第15周,共计1周,20学时。二、课程设计内容用C语言编写软件完成以下任务:1.录入图书信息(根据图书馆的管理情况自行设定,要具有实用性);2.借书处理(数量不足三本,不予外借,并显示相应的提示信息);3.还书处理。4 查询图书信息(根据书名或图书编号)。三、课程设计要求1. 程序质量:² 贯彻结构化程序设计思想。² 用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。² 用户界面中的菜单至少应包括“图书信息录入”、“借书处理”、“还书处理”、“退出”、“查询图书信息”5项。² 代码应适当缩进,并给出必要的注释,以增强程序的可读性。2. 课程设计说明书:课程结束后,上交课程设计说明书和源程序。课程设计说明书的格式和内容参见提供的模板。四、指导教师和学生签字指导教师:_ 学生签名:_五、成绩六、教师评语目录一、需求分析1二、设计分析3三、主要界面截图10四、技术要点13五、个人总结24六、参考文献25七、源程序25一、需求分析 根据任务书给定的“课程设计内容”和“课程设计要求”作如下的需求分析。经过对程序设计题目的分析可知,整个程序的设计实现大致分为5个模块,其中每一个模块对应一个函数(查询模块对应三个函数),他们的功能分别是:录入图书信息(luru);借书(jieshu);还书(huanshu);查询(chaxun)。该系统是一个较典型的数据管理系统,其使用者被假定为图书管理人员,系统应该具有易于管理、快速、稳定、功能齐全的特点。1. 管理性分析系统管理的数据涉及到图书的管理问题,数据量较大且是一种基础性数据,是管理图书的重要数据,所以应该能够快速方便调用修改增添。2. 快速性分析快速性分析,由于信息量较大且变动较为频繁,因此,该程序应该能快速的调用和增补。3. 稳定性分析指系统比较健壮,只要是用户的合理操作,系统都应给出合理正确的回应,而不是出现令用户感到意外的系统错误或系统崩溃。4. 主要功能分析(1)录入函数:主要功能是将图书信息录入书库中; (2)借书函数:主要实现学生借阅书籍的功能;(3)还书函数:实现的功能是把学生借阅的书籍还给书库;(4)查询函数:是显示图书信息(用户输入查询条件,系统规则地在界面显示查询结果,且显示的数据尽量全面。当输入图书编号时,可查询到该图书的书名,作者,出版社,数量;当输入书名时,可查询到该图书的编号,作者,出版社,数量)。除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。每一个图书都包含编号,书名,作者,出版社,数目,将图书纪录类型定义为结构体类型,数据读取自程序所在目录下的图书。二、设计分析主要有5个功能模块,每个模块对应一个C语言自定义函数。他们的功能分别是:录入图书信息(luru);借书(jieshu);还书(huanshu);查询图书信息(chaxun)。 这些函数原型及其功能简述如下:1、录入函数:void luru()/图书录入 主要功能是将图书信息录入书库中;2、借书函数:void jieshu()/借书 主要实现学生借阅书籍的功能;3、还书函数:void huanshu()/还书 实现的功能是把学生借阅的书籍还给书库;4。查询函数:void chaname() 功能是显示图书信息。当输入图书编号时,可查询到该图书的书名,作者,出版社,数量;当输入书名时,可查询到该图书的编号,作者,出版社,数量。除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。每一个图书都包含编号,书名,作者,出版单位,库存数量,将图书纪录类型定义为结构体类型,数据读取自程序所在目录下的tushiguanli.txt。1、程序总体结构图2、主要功能模块框图(1)录入图书信息luru (2)借书函数jieshu(3)还书函数huanshu(4)查询函数chaxun 三、主要界面截图图1 程序主界面图2 录入图书信息图示3 借书功能图示4 还书功能图示5 查询功能(按书名)图示6 查询功能(按书号)四、技术要点设计的程序由七个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。在这些函数当中,输入图书信息、借阅图书信息、还书函数和查询图书函数是程序中较为核心的部分,其中查询函数调用了按书号查询和按书名查询两个函数。1、结构体的应用定义了结构体用来描述图书的编号、作者、书名、出版社以及图书的数量;并且定义了指针:头指针head和指针p1、p2。具体的定义如下:struct book int num; char author10; char name10; char publicor10; int amount; struct book *next;*head,*p1,*p2;所定义的结构体主要用于定义数组和指针。2、文件操作包括了文件的写入和读取两个方面。文件的写入操作,用于保存录入的学生数据,也用于保存所修改的数据。例如如下程序段用于保存录入的图书信息:void luru()/图书录入 FILE *fp; fp=fopen("d:tushuguanli.txt","w"); if (fp=NULL) printf("n 打开文件失败!n"); exit(0); printf(" 请输入图书信息(图书号为“0”时结束)n"); printf(" 输入顺序为:图书号、书名、作者、出版社、图书数量n"); head=NULL; p1=p2=(struct book*) malloc(LEN); scanf("%d%s%s%s%d",&p1->num,p1->name,p1->author,p1->publicor,&p1->amount); while (p1->num) fprintf(fp,"%d%s%s%s%d",p1->num,p1->name,p1->author,p1->publicor,p1->amount); n=n+1; if (n=1) head=p1; else p2->next=p1; p2=p1; p1=(struct book *)malloc(LEN); printf(" 请您继续输入n"); scanf("%d%s%s%s%d",&p1->num,p1->name,p1->author,p1->publicor,&p1->amount); p2->next=NULL;fclose(fp);例如如下程序段用于读取录入的图书信息:void jieshu()/借书int i;FILE *fp;fp=fopen("d:tushuguanli.txt","r");if(fp=NULL)printf("n 打开文件失败!n");exit(0);p1=head;printf("请输入你要借的书的书号n");scanf("%d",&i);while(p1!=NULL)if(i=p1->num)if(p1->amount<=3)printf("该种书藏书量不足,无法借出n");getch();return ;elseprintf("借书成功n");p1->amount-;printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount);p1=p1->next;getch();fclose(fp);3、输入图书信息函数 输入图书信息,首先由程序创建一个新文件,并将录入的图书信息写入该文件当中,具体的程序段如下:void luru()/图书录入 FILE *fp;fp=fopen("d:tushuguanli.txt","w");if(fp=NULL)printf("n 打开文件失败!n");exit(0);printf(" 请输入图书信息(图书号为“0”时结束)n");printf("输入顺序为:图书号、书名、作者、出版社、图书数量n");head=NULL;p1=p2=(struct book*) malloc(LEN);scanf("%d%s%s%s%d",&p1->num,p1->name,p1->author,p1->publicor,&p1->amount);while(p1->num) fprintf(fp,"%d%s%s%s%d",p1->num,p1->name,p1->author,p1->publicor,p1->amount);n=n+1;if(n=1) head=p1;elsep2->next=p1;p2=p1;p1=(struct book *)malloc(LEN);printf(" 请您继续输入n");scanf("%d%s%s%s%d",&p1->num,p1->name,p1->author,p1->publicor,&p1->amount);p2->next=NULL;fclose(fp);4、借阅图书函数该函数的核心内容是更改算法。该函数执行时,由用户输入要借阅图书的编号,而后按照该编号进行查找。如果库存少于三本了则提示库存有限无法借阅,如果库存大于等于三本时,显示借书成功,p1->amount值减1。具体程序段如下:void jieshu()/借书int i;FILE *fp;fp=fopen("d:tushuguanli.txt","r");if(fp=NULL)printf("n 打开文件失败!n");exit(0);p1=head;printf("请输入你要借的书的书号n");scanf("%d",&i);while(p1!=NULL)if(i=p1->num)if(p1->amount<=3)printf("该种书藏书量不足,无法借出n");getch();return ;elseprintf("借书成功n");p1->amount-;printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount);p1=p1->next;getch();fclose(fp);5、还书函数提示输入要还的书的编号,如果所输入的书号在已借图书中,显示还书成功,p1->amount值加1,具体程序段如下:void huanshu()/还书 int i; FILE *fp;fp=fopen("d:tushuguanli.txt","r");if(fp=NULL)printf("n 打开文件失败!n");exit(0);p1=head;printf("请输入你要还的书的书号n");scanf("%d",&i);while(p1!=NULL)if(i=p1->num)printf("还书成功n");p1->amount+;printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount);p1=p1->next;getch();fclose(fp);6、查询函数提示按照书名或者书号来查询图书信息,如果选择按书名查询信息,则会用按书名查询函数,该函数的核心内容是if函数嵌套以及strcmp比较字符串函数的使用;如果选择按书号查询信息,则会用按书号查询函数,该函数如果输入的书号和书库所有书号相符合,则会显示该图书信息,程序段如下:void chaxun()/查询int choose;FILE *fp;fp=fopen("d:tushuguanli.txt","r");if(fp=NULL)printf("n 打开文件失败!n");exit(0);p1=head;printf(" n 书名查询请按(1),书号查询请按(2)n");scanf("%d",&choose);switch(choose)case 1: chaname();break;case 2: chanum();break;default:printf(" n Error n");fclose(fp);void chaname()char shuming10;p1=head;printf("n 请输入书名 ");scanf("%s",shuming);while(p1!=NULL) if(strcmp(shuming,p1->name)=0)printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount);p1=p1->next; getch();void chanum()int number;printf("n 请输入书号 ");scanf("%d",&number);p1=head;while(p1!=NULL)if(number=p1->num)printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount);p1=p1->next; getch(); 7、所用到的主要知识点 (1)、熟练使用函数,能够自己行编写函数并调用。 void luru()/图书录入 (2)、掌握了switch语句的运用,及面对多分支处理的情况。void main()int order;while(1)system("cls");caidan();fflush(stdin);scanf("%d",&order);switch (order)case 1:luru();break;case 2:jieshu();break;case 3:huanshu();break;case 4:chaxun();break;case 5:exit(0);break;default:printf("ttt输入的序号有误,请检查后重新输入.n");getch();break; (3)、链表的应用:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。while(p1->num) fprintf(fp,"%d%s%s%s%d",p1->num,p1->name,p1->author,p1->p ublicor,p1->amount);n=n+1;if(n=1) head=p1;elsep2->next=p1;p2=p1;p1=(struct book *)malloc(LEN); (4)、指针的应用: p2->next = p1(5)、if else语句的应用: if(p1->amount<=3)printf("该种书藏书量不足,无法借出n");getch();return ;elseprintf("借书成功n");p1->amount-;printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount); (6)、定义数组: void chaname()char shuming10; (7)、占位符、换行等的应用: printf("t%dt%st%st%st%dn",五、个人总结此次课程设计中,运用链表和文件读写技术,完成了一个简单的图书管理系统,在编写代码的过程中,对链表的应用有了更加深入的了解,对文件的读写也有了一定的认识,但是,程序依然存在不足:比如说,在处理文件异常时,没有相应的处理代码。在删除链表结点时,当链表为空时的判断不够详细,在查询和写入文件时,对输出格式的控制还不够完善,今后在代码编写中,这些都是需要注意的问题。相信通过今后的努力,我的代码编写的实际应用能力会有更大的提高!六、参考文献1 谭浩强C程序设计北京:清华大学出版社,20052 刘成等C语言程序设计实验指导与习题集北京:中国铁道出版社,2006七、源程序#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#define LEN sizeof(struct book)struct bookint num;char author10;char name10;char publicor10;int amount;struct book *next;*head,*p1,*p2;int n=0;void caidan()/菜单 printf("nnnnnnn");printf("ttt*menu*n");printf("ttt* 1.图书信息录入: *n");printf("ttt* 2.借书处理: *n");printf("ttt* 3.还书处理: *n");printf("ttt* 4.查询图书信息: *n");printf("ttt* 5.退出 *n");printf("ttt*n");printf("ttt 请输入选项编号(0-5):");void luru()/图书录入 FILE *fp;fp=fopen("d:tushuguanli.txt","w");if(fp=NULL)printf("n 打开文件失败!n");exit(0);printf(" 请输入图书信息(图书号为“0”时结束)n");printf(" 输入顺序为:图书号、书名、作者、出版社、图书数量n");head=NULL;p1=p2=(struct book*) malloc(LEN);scanf("%d%s%s%s%d",&p1->num,p1->name,p1->author,p1->publicor,&p1->amount);while(p1->num)fprintf(fp,"%d%s%s%s%d",p1->num,p1->name,p1->author,p1->publicor,p1->amount);n=n+1;if(n=1) head=p1;elsep2->next=p1;p2=p1;p1=(struct book *)malloc(LEN);printf(" 请您继续输入n");scanf("%d%s%s%s%d",&p1->num,p1->name,p1->author,p1->publicor,&p1->amount);p2->next=NULL;fclose(fp);void jieshu()/借书int i;FILE *fp;fp=fopen("d:tushuguanli.txt","r");if(fp=NULL)printf("n 打开文件失败!n");exit(0);p1=head;printf("请输入你要借的书的书号n");scanf("%d",&i);while(p1!=NULL)if(i=p1->num)if(p1->amount<=3)printf("该种书藏书量不足,无法借出n");getch();return ;elseprintf("借书成功n");p1->amount-;printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount);p1=p1->next;getch();fclose(fp);void huanshu()/还书 int i; FILE *fp;fp=fopen("d:tushuguanli.txt","r");if(fp=NULL)printf("n 打开文件失败!n");exit(0);p1=head;printf("请输入你要还的书的书号n");scanf("%d",&i);while(p1!=NULL)if(i=p1->num)printf("还书成功n");p1->amount+;printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount);p1=p1->next;getch();fclose(fp);void chaname()char shuming10;p1=head;printf("n 请输入书名 ");scanf("%s",shuming);while(p1!=NULL) if(strcmp(shuming,p1->name)=0)printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount);p1=p1->next; getch();void chanum()int number;printf("n 请输入书号 ");scanf("%d",&number);p1=head;while(p1!=NULL)if(number=p1->num)printf(" 书号 书名 作者 出版单位 剩余数量 n ");printf("t%dt%st%st%st%dn",p1->num,p1->name,p1->author,p1->publicor,p1->amount);p1=p1->next; getch(); void chaxun()/查询int choose;FILE *fp;fp=fopen("d:tushuguanli.txt","r");if(fp=NULL)printf("n 打开文件失败!n");exit(0);p1=head;printf(" n 书名查询请按(1),书号查询请按(2)n");scanf("%d",&choose);switch(choose)case 1: chaname();break;case 2: chanum();break;default:printf(" n Error n");fclose(fp);void main()int order;while(1)system("cls");caidan();fflush(stdin);scanf("%d",&order);switch (order)case 1:luru();break;case 2:jieshu();break;case 3:huanshu();break;case 4:chaxun();break;case 5:exit(0);break;default:printf("ttt输入的序号有误,请检查后重新输入.n");getch();break;