图书管理系统 c++ 数据结构实验报告学生姓名:学院: 软件学院专业: 信息管理与信息系统题目: 图书管理系统成绩指导教师2011年1月6日1(设计目的(小标题黑体五号字)《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
进行数据结构课程设计要达到以下目的:, 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; , 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; , 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2(设计内容和要求1)每种书的登记内容包括书号、书名、著作者、现存量和库存量;2)对书号建立索引表(线性表)以提高查找效率;3)系统主要功能如下:*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;*归还:注销对借阅者的登记,改变该书的现存量。
3(本设计所采用的数据结构定义图书链表和图书索引结构struct Book{char BookID[10];/*图书编号*/char BookName[512];/*书名*/char Writer[512];/*作者*/int CurrentNumber;/*现存量*/Book *pNext;/*下一个图书信息*/};struct Index{char BookID[10];/*图书编号*/Index *pNext;/*下一个索引指针*/};1/*借阅信息结构*/struct Borrow{char BookID[10];/*借阅图书编号*/char BookName[512]; /*书名*/unsigned long StuID; /*图书证号*/char ReturnTime[512];/*归还日期*/Borrow *pNext; /*下一个借阅信息*/};4(功能模块详细设计4.1 详细设计思想主函数main()主函数通过一个switch语句实现对系统功能的选择。
主菜单选择函数ShowMainMenu()此函数包括退出系统,图书入库,查询库存,查询借阅和归还图书五个函数,通过调用主菜单函数判断用户做出的选择,从而进行相应的操作。
图书入库函数PutBookInLib()此函数通过的创建一个图书链表,达到对新进书判断,若在现有的图书中找到该书,则直接进行入库,并记录下图书的数量,若找完整个图书量表也没找到该书,则要记录下新进图书的名称,作者,数量,并把该书插入到已有数中,方便下次对新书的判断。
查询图书馆库存函数QueryBookLib()查询图书馆库存,查询不改变数据,故传入指针即可。
显示图书的编号、名称、作者、现有量以及库存量借阅图书函数BorrowBook()此函数通过读者的图书证号对读者链表从头至尾进行查找,若找到读者,则显示读者图书证号以及姓名,然后利用for循环和指针,对读者所借图书进行查找并显示。
若找不到读者,显示读者标号不存在,按任意键回到查找菜单选择函数界面。
借阅图书函数BorrowBook()2此函数需要读者输入的图书证号,根据读者输入的要借的图书编号,再利用while循环遍历是否存在该书,若该书不存在,则显示此书不存在,若该书存在,再利用if判断是否还有现存,若无现存,在提示此书已借完,若还有现存,提示借书成功,根据库函数 time.h自动登记归还日期。
查询借阅函数QueryBorrow()此函数通过while循环实现对所有已借出图书的遍历,并输出所有已借出图书的信息。
归还图书函数ReturnBook()此函数也是以用图书链表和读者链表对读者还书进行操作,根据读者输入的图书证号,利用while循环对读者链表进行遍历,查找是否存在该读者,若读者不存在,则提示该读者的图书证号不存在,若读者存在,根据读者输入的要还的图书编号,再利用while循环遍历是否存在该书,若该书不存在,则显示此书编号不存在,若该书存在,则利用for循环把读者的图书链表中要还书后面的书向前移一个单位,覆盖掉链表中该书的信息,并把读者的借书量减一,把图书的现存量加一。
4.2 核心代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#ifndef _DATA_STRUCT_H_#define _DATA_STRUCT_H_#endif/*_DATA_STRUCT_H_*//*图书结构*/struct Book{char BookID[10];/*图书编号*/char BookName[512];/*书名*/char Writer[512];/*作者*/int CurrentNumber;/*现存量*/Book *pNext;/*下一个图书信息*/3};/*图书索引结构*/struct Index{char BookID[10];/*图书编号*/Index *pNext;/*下一个索引指针*/};/*借阅信息结构*/struct Borrow{char BookID[10]; /*借阅图书编号*/char BookName[512]; /*书名*/unsigned long StuID; /*图书证号*/char ReturnTime[512];/*归还日期*/Borrow *pNext; /*下一个借阅信息*/};/*获取输入字符串*/void GetInput(char *pInOutStr,int StrLen,bool OnlyGetNumber = false);/*显示主菜单并返回选择*/int ShowMainMenu();/*图书入库操作,传入参数为图书列表头指针的指针和索引信息的头指针的指针,因为在此函数内部可能会改变头指针的值*/void PutBookInLib(Book **pHead,Index **pIndex);/*查询图书馆库存,查询不改变数据,故传入指针即可*/void QueryBookLib(Book *pHead); /*借阅图书*/void BorrowBook(Borrow **pBorrow,Book *pHead);/*查询借阅*/void QueryBorrow(Borrow *pBorrow); /*归还图书*/4void 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;/*用来保存当前用户的输入*/int ChoosedNum = -1;while ( true ){ChoosedNum = ShowMainMenu();switch(ChoosedNum){case 0 :/*退出*/{return 0;break;}case 1:/*图书入库*/{PutBookInLib(&pBookHead,&pIndexHead); break;}5case 2:/*查询库存*/{QueryBookLib(pBookHead);printf("按回车键继续...");fflush(stdin);getchar();system("cls");break;}case 3:/*借阅图书*/{QueryBookLib(pBookHead);BorrowBook(&pBorrowHead,pBookHead); break;}case 4:/*查询借阅*/{QueryBorrow(pBorrowHead);printf("按回车键继续...");fflush(stdin);getchar();system("cls");break;}case 5:/*归还图书*/{QueryBorrow(pBorrowHead);ReturnBook(&pBorrowHead,pBookHead);break;}6}}DeleteBookList(&pBookHead);DeleteIndexList(&pIndexHead);DeleteBorrowList(&pBorrowHead);fflush(stdin);getchar();return 0;}/*获取输入字符串*/void GetInput(char *pInOutStr,int StrLen,bool OnlyGetNumber){memset(pInOutStr,0x0,StrLen);fflush(stdin);int Count = 0;while ( true ){char TmpC = 0;fread(&TmpC,1,1,stdin);if ( 10 == TmpC ){break;}if ( OnlyGetNumber && TmpC >= '0' && TmpC <= '9' ) {pInOutStr[Count] = TmpC;Count++;}else{7pInOutStr[Count] = TmpC;Count++;}}}/*显示主菜单并返回选择*/int ShowMainMenu(){char InPutStr[1024];NO_INPUT:printf("\n\n\n");printf("************************************************************ ******\n");printf("* 图书管理系统*\n");printf("************************************************************ ******\n");printf("\n");printf("请选择:\n");printf("\t1.图书入库\n");printf("\t2.查询库存\n");printf("\t3.借阅图书\n");printf("\t4.查询借阅\n");printf("\t5.归还图书\n");printf("\t0.退出\n");printf("\n");printf("\t输入 : ");GetInput(InPutStr,1024,true);if ( strlen(InPutStr) < 1 ){8system("cls");goto NO_INPUT;}return atoi(InPutStr);}/*图书入库操作*/void PutBookInLib(Book **pHead,Index **pIndex) { Book *pWork = *pHead;char InPutStr[1024];Book *pTmpNewBook = (Book *)(malloc(sizeof(Book))); memset(pTmpNewBook,0x0,sizeof(Book));Index *pTmpIndex = (Index *)(malloc(sizeof(Index))); memset(pTmpIndex,0x0,sizeof(Index));system("cls");printf("输入图书编号:");GetInput(InPutStr,1024);strcpy(pTmpNewBook->BookID,InPutStr); system("cls"); printf("输入图书名称 : ");GetInput(InPutStr,1024);strcpy(pTmpNewBook->BookName,InPutStr);system("cls");printf("<<%s>>\n",pTmpNewBook->BookName); printf("图书作者 : ");GetInput(InPutStr,1024);strcpy(pTmpNewBook->Writer,InPutStr); system("cls");printf("<<%s>>\n",pTmpNewBook->BookName); printf("作者:%s\n",pTmpNewBook->Writer);9printf("入库数量 : ");GetInput(InPutStr,1024,true); pTmpNewBook->CurrentNumber = atoi(InPutStr); if ( pTmpNewBook->CurrentNumber < 1 ){system("cls");printf("入库数量错误!(按回车键继续...)"); fflush(stdin);getchar();system("cls");return;}if ( NULL == *pHead ){*pHead = pTmpNewBook;*pIndex = pTmpIndex;}else{Book *pWork = *pHead;while ( pWork != NULL ){if ( strcmp(pWork->BookName,pTmpNewBook->BookName) == 0 && strcmp(pWork->Writer,pTmpNewBook->Writer) == 0 ){pWork->CurrentNumber += pTmpNewBook->CurrentNumber; return;}pWork = pWork->pNext;}10pWork = *pHead;while ( pWork->pNext != NULL ){pWork = pWork->pNext;}pWork->pNext = pTmpNewBook;Index *pWork2 = *pIndex;while ( pWork2->pNext != NULL ){pWork2 = pWork2->pNext;}pWork2->pNext = pTmpIndex;}system("cls");printf("图书:<<%s>>\n作者:%s\n入库数:%d\n\n入库操作成功!(按回车键继续...)",pTmpNewBook->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;11}}void DeleteIndexList(Index **pIndex){Index *pWork = *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 QueryBookLib(Book *pHead) {Book *pWork = pHead;int TotalCount = 0;while ( NULL != pWork )12{TotalCount++;pWork = pWork->pNext;}system("cls");printf("当前库存共%d种图书,列表如下:\n=====================================================\n",TotalC ount);pWork = pHead;while ( NULL != pWork ){printf(" 书名:<<%s>> 作者:%s 当前库存:%d\n",pWork->BookName,pWork->Writer,pWork->CurrentNumber);pWork = pWork->pNext;}printf("=====================================================\n",Tot alCount);}/*借阅图书*/void BorrowBook(Borrow **pBorrow,Book *pHead) {char InPutStr[1024];bool HadTheBook = false;Borrow *pTmpBorrow = (Borrow *)(malloc(sizeof(Borrow))); memset(pTmpBorrow,0x0,sizeof(Borrow));printf("请输入你想借书的编号 : ");GetInput(InPutStr,1024);strcpy(pTmpBorrow->BookID,InPutStr);Book *pWorkBook = pHead;while ( pWorkBook != NULL ){if ( strcmp(pWorkBook->BookID,pTmpBorrow->BookID)==0)13{HadTheBook = true;break;}pWorkBook = pWorkBook->pNext;}if ( HadTheBook ){if ( pWorkBook->CurrentNumber < 1 ){system("cls");printf("图书<<%s>>当前无库存,无法借阅!\n(按回车键继续...)",pWorkBook->BookName);fflush(stdin);getchar();system("cls");free(pTmpBorrow);return;}}else{system("cls");\n(按回车键继续...)",pTmpBorrow->BookID); printf("图书编号%s不存在! fflush(stdin);getchar();system("cls");free(pTmpBorrow);return;}14strcpy(pTmpBorrow->BookName,pWorkBook->BookName);printf("请输入借书证号 : ");GetInput(InPutStr,1024,true);pTmpBorrow->StuID = atoi(InPutStr);if ( 0 == pTmpBorrow->StuID ){system("cls");n(按回车键继续...)"); printf("借书证号不存在(借书证号输入整数)!\ fflush(stdin);getchar();system("cls");free(pTmpBorrow);return;}time_t ltime;struct tm *today;time(<ime);ltime += 60 * 60 * 24 * 30;today = localtime(<ime);sprintf(pTmpBorrow->ReturnTime,"%d年%d月%d日", today->tm_year+1900, today->tm_mon+1,today->tm_mday);if ( *pBorrow == NULL ){*pBorrow = pTmpBorrow;}else{Borrow *pWork = *pBorrow;while ( NULL != pWork->pNext )15{pWork = pWork->pNext;}pWork->pNext = pTmpBorrow;}pWorkBook->CurrentNumber--;system("cls");printf("借书证号:%d\n借阅图书:<<%s>>\n\n操作成功!(按回车键继续...)",pTmpBorrow->StuID,pTmpBorrow->BookName);fflush(stdin);getchar();system("cls");}/*查询借阅*/void 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] 借书名:<<%s>> 归还日16期:%s\n",pWork->StuID,pWork->BookName,pWork->ReturnTime);pWork = pWork->pNext;}printf("=====================================================\n",Tot alCount);}/*归还图书*/void ReturnBook(Borrow **pBorrow,Book *pHead) {char InPutStr[1024];Borrow TmpBorrow;bool HasFindBorrwo = false;memset(&TmpBorrow,0x0,sizeof(TmpBorrow));printf("请输入借书证号 : ");GetInput(InPutStr,1024,true);TmpBorrow.StuID = atoi(InPutStr);printf("请输入所还图书编号 : ");GetInput(InPutStr,1024);strcpy(TmpBorrow.BookID,InPutStr);Borrow *pWorkBorrow = *pBorrow;Borrow *pDeletePre = NULL;while ( NULL != pWorkBorrow ){if ((strcmp(pWorkBorrow->BookID,TmpBorrow.BookID)==0)&& pWorkBorrow->StuID ==TmpBorrow.StuID ){HasFindBorrwo = true;break;17}pDeletePre = pWorkBorrow;pWorkBorrow = pWorkBorrow->pNext;}if ( ! HasFindBorrwo ){system("cls");\n(按回车键继续...)"); printf("你输入的借书信息不存在!fflush(stdin);getchar();system("cls");return;}if ( NULL == pDeletePre ){*pBorrow = pWorkBorrow->pNext;}else{pDeletePre->pNext = pWorkBorrow->pNext;}Book *pWorkBook = pHead;while ( NULL != pWorkBook ){if ( pWorkBook->BookID == pWorkBorrow->BookID ){pWorkBook->CurrentNumber ++;}pWorkBook = pWorkBook->pNext;}18system("cls");printf("借书证号:%d\n归还图书:<<%s>>\n\n操作成功!(按回车键继续...)",pWorkBorrow->StuID,pWorkBorrow->BookName);fflush(stdin);getchar();system("cls");free(pWorkBorrow);}5(课程设计心得及存在问题通过这次课程设计,我不仅把以前所学知识的温习了一遍,还学会了许多新的知识;同时,我也感受到了自身的不足,我们大学生应该趁着年轻时期,多学点知识,为我们以后的生活多做准备。