1、数 据 结 构课 程 设 计 说 明 书学生姓名 :学 院 : 软 件 学 院专 业 : 信息管理与信息系统题 目 : 图书管理系统成 绩指 导 教 师2011 年 1 月 6 日1设计目的(小标题黑体五号字)数据结构课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单1的分析和讨论。进行数据结构课程设计要达到以下目的: 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 提高综合运用所学的理论知识和方法独立
2、分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。2设计内容和要求1)每种书的登记内容包括书号、书名、著作者、现存量和库存量;2)对书号建立索引表(线性表)以提高查找效率;3)系统主要功能如下:*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;*借阅:如果一种书的现存量大于 0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;*归还:注销对借阅者的登记,改变该书的现存量。3本设计所采用的数据结构定义图书链表和图书索引结构struct Bookchar BookID10;/*图书编号*/
3、char BookName512;/*书名*/char Writer512;/*作者*/int CurrentNumber;/*现存量*/Book *pNext;/*下一个图书信息*/;struct Indexchar BookID10;/*图书编号*/Index *pNext;/*下一个索引指针*/2;/*借阅信息结构*/struct Borrowchar BookID10;/*借阅图书编号*/char BookName512; /*书名*/unsigned long StuID; /*图书证号*/char ReturnTime512;/*归还日期*/Borrow *pNext; /*下一个
4、借阅信息*/;4功能模块详细设计4.1 详细设计思想主函数 main()主函数通过一个 switch 语句实现对系统功能的选择。主菜单选择函数 ShowMainMenu()此函数包括退出系统,图书入库,查询库存,查询借阅和归还图书五个函数,通过调用主菜单函数判断用户做出的选择,从而进行相应的操作。图书入库函数 PutBookInLib()此函数通过的创建一个图书链表,达到对新进书判断,若在现有的图书中找到该书,则直接进行入库,并记录下图书的数量,若找完整个图书量表也没找到该书,则要记录下新进图书的名称,作者,数量,并把该书插入到已有数中,方便下次对新书的判断。查询图书馆库存函数 QueryBo
5、okLib()查询图书馆库存,查询不改变数据,故传入指针即可。显示图书的编号、名称、作者、现有量以及库存量借阅图书函数 BorrowBook()此函数通过读者的图书证号对读者链表从头至尾进行查找,若找到读者,则显示读者图书证号以及姓名,然后利用 for 循环和指针,对读者所借图书进行查找并显示。若找不到读者,显示读者标号不存在,按任意键回到查找菜单选择函数界面。3借阅图书函数 BorrowBook()此函数需要读者输入的图书证号,根据读者输入的要借的图书编号,再利用while 循环遍历是否存在该书,若该书不存在,则显示此书不存在,若该书存在,再利用 if 判断是否还有现存,若无现存,在提示此书
6、已借完,若还有现存,提示借书成功,根据库函数 time.h 自动登记归还日期。查询借阅函数 QueryBorrow()此函数通过 while 循环实现对所有已借出图书的遍历,并输出所有已借出图书的信息。归还图书函数 ReturnBook()此函数也是以用图书链表和读者链表对读者还书进行操作,根据读者输入的图书证号,利用 while 循环对读者链表进行遍历,查找是否存在该读者,若读者不存在,则提示该读者的图书证号不存在,若读者存在,根据读者输入的要还的图书编号,再利用 while 循环遍历是否存在该书,若该书不存在,则显示此书编号不存在,若该书存在,则利用 for 循环把读者的图书链表中要还书后
7、面的书向前移一个单位,覆盖掉链表中该书的信息,并把读者的借书量减一,把图书的现存量加一。4.2 核心代码#include #include #include #include #ifndef _DATA_STRUCT_H_#define _DATA_STRUCT_H_#endif/*_DATA_STRUCT_H_*/*图书结构*/struct Bookchar BookID10;/*图书编号*/char BookName512;/*书名*/char Writer512;/*作者*/int CurrentNumber;/*现存量*/4Book *pNext;/*下一个图书信息*/;/*图书索引结
8、构*/struct Indexchar BookID10;/*图书编号*/Index *pNext;/*下一个索引指针*/;/*借阅信息结构*/struct Borrowchar BookID10; /*借阅图书编号*/char BookName512; /*书名*/unsigned long StuID; /*图书证号*/char ReturnTime512;/*归还日期*/Borrow *pNext; /*下一个借阅信息*/;/*获取输入字符串*/void GetInput(char *pInOutStr,int StrLen,bool OnlyGetNumber = false);/*显
9、示主菜单 并返回选择*/int ShowMainMenu();/*图书入库操作,传入参数为图书列表头指针的指针和索引信息的头指针的指针,因为在此函数内部可能会改变头指针的值*/void PutBookInLib(Book *pHead,Index *pIndex);/*查询图书馆库存,查询不改变数据,故传入指针即可*/void QueryBookLib(Book *pHead);/*借阅图书*/void BorrowBook(Borrow *pBorrow,Book *pHead);/*查询借阅*/void QueryBorrow(Borrow *pBorrow);5/*归还图书*/void
10、ReturnBook(Borrow *pBorrow,Book *pHead);/*释放图书链表及索引链表及借阅信息链表*/void DeleteBookList(Book *pHead);void DeleteIndexList(Index *pIndex);void DeleteBorrowList(Borrow *pBorrow);int main()/*图书列表头指针*/Book *pBookHead = NULL;/*图书索引头指针*/Index *pIndexHead = NULL;/*借阅信息头指针*/Borrow *pBorrowHead = NULL;/*用来保存当前用户的输
11、入*/int ChoosedNum = -1;while ( true )ChoosedNum = ShowMainMenu();switch(ChoosedNum)case 0 :/*退出*/return 0;break;case 1:/*图书入库*/PutBookInLib(break;6case 2:/*查询库存*/QueryBookLib(pBookHead);printf(“按回车键继续.“);fflush(stdin);getchar();system(“cls“);break;case 3:/*借阅图书*/QueryBookLib(pBookHead);BorrowBook(br
12、eak;case 4:/*查询借阅*/QueryBorrow(pBorrowHead);printf(“按回车键继续.“);fflush(stdin);getchar();system(“cls“);break;case 5:/*归还图书*/QueryBorrow(pBorrowHead);ReturnBook(break;7DeleteBookList(DeleteIndexList(DeleteBorrowList(fflush(stdin);getchar();return 0;/*获取输入字符串*/void GetInput(char *pInOutStr,int StrLen,boo
13、l OnlyGetNumber)memset(pInOutStr,0x0,StrLen);fflush(stdin);int Count = 0;while ( true )char TmpC = 0;fread(if ( 10 = TmpC )break;if ( OnlyGetNumber system(“cls“);printf(“输入图书名称 : “);GetInput(InPutStr,1024);strcpy(pTmpNewBook-BookName,InPutStr);system(“cls“);printf(“n“,pTmpNewBook-BookName);printf(“图
14、书作者 : “);GetInput(InPutStr,1024);strcpy(pTmpNewBook-Writer,InPutStr);system(“cls“);printf(“n“,pTmpNewBook-BookName);printf(“作者:%sn“,pTmpNewBook-Writer);printf(“入库数量 : “);GetInput(InPutStr,1024,true);10pTmpNewBook-CurrentNumber = atoi(InPutStr);if ( pTmpNewBook-CurrentNumber BookName,pTmpNewBook-Book
15、Name) = 0 return;pWork = pWork-pNext;pWork = *pHead;while ( pWork-pNext != NULL )11pWork = pWork-pNext;pWork-pNext = pTmpNewBook;Index *pWork2 = *pIndex;while ( pWork2-pNext != NULL )pWork2 = pWork2-pNext;pWork2-pNext = pTmpIndex;system(“cls“);printf(“图书:n 作者:%sn 入库数:%dnn 入库操作成功!(按回车键继续.)“,pTmpNewBo
16、ok-BookName,pTmpNewBook-Writer,pTmpNewBook-CurrentNumber);fflush(stdin);getchar();system(“cls“);/*释放图书链表及索引链表*/void DeleteBookList(Book *pHead)Book *pWork = *pHead;Book *pNext = pWork;while ( NULL != pWork )pNext = pWork-pNext;free(pWork);pWork = pNext;12void DeleteIndexList(Index *pIndex)Index *pWo
17、rk = *pIndex;Index *pNext = pWork;while ( NULL != pWork )pNext = pWork-pNext;free(pWork);pWork = pNext;void DeleteBorrowList(Borrow *pBorrow)Borrow *pWork = *pBorrow;Borrow *pNext = pWork;while ( NULL != pWork )pNext = pWork-pNext;free(pWork);pWork = pNext;/*查询图书馆库存,查询不改变数据,故传入指针即可*/void QueryBookLi
18、b(Book *pHead)Book *pWork = pHead;int TotalCount = 0;while ( NULL != pWork )TotalCount+;13pWork = pWork-pNext;system(“cls“);printf(“当前库存共%d 种图书,列表如下:n=n“,TotalCount);pWork = pHead;while ( NULL != pWork )printf(“ 书名: 作者:%s 当前库存:%dn“,pWork-BookName,pWork-Writer,pWork-CurrentNumber);pWork = pWork-pNext
19、;printf(“=n“,TotalCount);/*借阅图书*/void BorrowBook(Borrow *pBorrow,Book *pHead)char InPutStr1024;bool HadTheBook = false;Borrow *pTmpBorrow = (Borrow *)(malloc(sizeof(Borrow);memset(pTmpBorrow,0x0,sizeof(Borrow);printf(“请输入你想借书的编号 : “);GetInput(InPutStr,1024);strcpy(pTmpBorrow-BookID,InPutStr);Book *p
20、WorkBook = pHead;while ( pWorkBook != NULL )if ( strcmp(pWorkBook-BookID,pTmpBorrow-BookID)=0)HadTheBook = true;14break;pWorkBook = pWorkBook-pNext;if ( HadTheBook )if ( pWorkBook-CurrentNumber 当前无库存,无法借阅!n(按回车键继续.)“,pWorkBook-BookName);fflush(stdin);getchar();system(“cls“);free(pTmpBorrow);return;e
21、lsesystem(“cls“);printf(“图书编号%s 不存在!n(按回车键继续.)“,pTmpBorrow-BookID);fflush(stdin);getchar();system(“cls“);free(pTmpBorrow);return;strcpy(pTmpBorrow-BookName,pWorkBook-BookName);printf(“请输入借书证号 : “);15GetInput(InPutStr,1024,true);pTmpBorrow-StuID = atoi(InPutStr);if ( 0 = pTmpBorrow-StuID )system(“cls
22、“);printf(“借书证号不存在(借书证号输入整数)!n(按回车键继续.)“);fflush(stdin);getchar();system(“cls“);free(pTmpBorrow);return;time_t ltime; struct tm *today; time( ltime += 60 * 60 * 24 * 30;today = localtime( sprintf(pTmpBorrow-ReturnTime,“%d 年%d 月%d 日“, today-tm_year+1900,today-tm_mon+1,today-tm_mday);if ( *pBorrow = N
23、ULL )*pBorrow = pTmpBorrow;elseBorrow *pWork = *pBorrow;while ( NULL != pWork-pNext )pWork = pWork-pNext;16pWork-pNext = pTmpBorrow;pWorkBook-CurrentNumber-;system(“cls“);printf(“借书证号:%dn 借阅图书:nn 操作成功!(按回车键继续.)“,pTmpBorrow-StuID,pTmpBorrow-BookName);fflush(stdin);getchar();system(“cls“);/*查询借阅*/void
24、 QueryBorrow(Borrow *pBorrow)Borrow *pWork = pBorrow;int TotalCount = 0;while ( NULL != pWork )TotalCount+;pWork = pWork-pNext;system(“cls“);printf(“当前借阅信息共%d 条,列表如下:n=n“,TotalCount);pWork = pBorrow;while ( NULL != pWork )printf(“借数证号:%d 借书名: 归还日期:%sn“,pWork-StuID,pWork-BookName,pWork-ReturnTime);pW
25、ork = pWork-pNext;17printf(“=n“,TotalCount);/*归还图书*/void ReturnBook(Borrow *pBorrow,Book *pHead)char InPutStr1024;Borrow TmpBorrow;bool HasFindBorrwo = false;memset(printf(“请输入借书证号 : “);GetInput(InPutStr,1024,true);TmpBorrow.StuID = atoi(InPutStr);printf(“请输入所还图书编号 : “);GetInput(InPutStr,1024);strcp
26、y(TmpBorrow.BookID,InPutStr);Borrow *pWorkBorrow = *pBorrow;Borrow *pDeletePre = NULL;while ( NULL != pWorkBorrow )if (strcmp(pWorkBorrow-BookID,TmpBorrow.BookID)=0)break;pDeletePre = pWorkBorrow;18pWorkBorrow = pWorkBorrow-pNext;if ( ! HasFindBorrwo )system(“cls“);printf(“你输入的借书信息不存在!n(按回车键继续.)“);f
27、flush(stdin);getchar();system(“cls“);return;if ( NULL = pDeletePre )*pBorrow = pWorkBorrow-pNext;elsepDeletePre-pNext = pWorkBorrow-pNext;Book *pWorkBook = pHead;while ( NULL != pWorkBook )if ( pWorkBook-BookID = pWorkBorrow-BookID )pWorkBook-CurrentNumber +;pWorkBook = pWorkBook-pNext;system(“cls“)
28、;printf(“借书证号:%dn 归还图书:nn 操作成功!(按回车键继续.)19“,pWorkBorrow-StuID,pWorkBorrow-BookName);fflush(stdin);getchar();system(“cls“);free(pWorkBorrow);5课程设计心得及存在问题通过这次课程设计,我不仅把以前所学知识的温习了一遍,还学会了许多新的知识;同时,我也感受到了自身的不足,我们大学生应该趁着年轻时期,多学点知识,为我们以后的生活多做准备。在编辑程序,有时候稍微不小心就会在中文格式下编写代码,一不小心又会丢掉分号,做什么事都要耐心和细心;在程序编译过程中,每次总会出现不少错误,一个类型的错误就会引起整个程序瘫痪;在运行时,我试着从键盘输入与定义类型不同的数据也会出错,丝毫不能马虎。最后终于运行出来,感觉很欣慰,虽然界面不是很好,有些功能还不完善,我会更加努力,学更多知识来完善自己!