您好,欢迎来到纷纭教育。
搜索
您的当前位置:首页图书管理系统 c++ 数据结构实验报告

图书管理系统 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 #include #include #include #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); /*归还图书*/

4

void 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; }

5

case 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 {

7

pInOutStr[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(\"\1.图书入库\\n\"); printf(\"\2.查询库存\\n\"); printf(\"\3.借阅图书\\n\"); printf(\"\4.查询借阅\\n\"); printf(\"\5.归还图书\\n\"); printf(\"\0.退出\\n\"); printf(\"\\n\"); printf(\"\输入 : \");

GetInput(InPutStr,1024,true); if ( strlen(InPutStr) < 1 ) {

8

system(\"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\ printf(\"图书作者 : \"); GetInput(InPutStr,1024);

strcpy(pTmpNewBook->Writer,InPutStr); system(\"cls\");

printf(\"<<%s>>\\n\ printf(\"作者:%s\\n\

9

printf(\"入库数量 : \"); 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)

strcmp(pWork->Writer,pTmpNewBook->Writer) == 0 ) {

pWork->CurrentNumber += pTmpNewBook->CurrentNumber; return; }

pWork = pWork->pNext; }

==

0

&&

10

pWork = *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入库操作成功!(按回车键继续...)\ 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\ pWork = pHead;

while ( NULL != pWork ) { printf(\"

:<<%s>>

:%s

存:%d\\n\ pWork = pWork->pNext; }

printf(\"=====================================================\\n\}

/*借阅图书*/

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(按回车键继续...)\ fflush(stdin); getchar(); system(\"cls\"); free(pTmpBorrow); return; } } else {

system(\"cls\");

printf(\"图书编号%s不存在!\\n(按回车键继续...)\ fflush(stdin); getchar(); system(\"cls\"); free(pTmpBorrow); return; }

14

strcpy(pTmpBorrow->BookName,pWorkBook->BookName); printf(\"请输入借书证号 : \"); GetInput(InPutStr,1024,true); pTmpBorrow->StuID = atoi(InPutStr); if ( 0 == pTmpBorrow->StuID ) {

system(\"cls\");

printf(\"借书证号不存在(借书证号输入整数)!\\n(按回车键继续...)\"); 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_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操作成功!(按回车键继续...)\ 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\ pWork = pBorrow; while ( NULL != pWork ) { printf(\"

借数证号:[%d] 借书名:<<%s>> 归还日

16

期:%s\\n\ pWork = pWork->pNext; }

printf(\"=====================================================\\n\}

/*归还图书*/

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\");

printf(\"你输入的借书信息不存在!\\n(按回车键继续...)\"); 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; }

18

system(\"cls\");

printf(\"借书证号:%d\\n归还图书:<<%s>>\\n\\n操作成功!(按回车键继续...)\ fflush(stdin); getchar(); system(\"cls\"); free(pWorkBorrow); }

5.课程设计心得及存在问题

通过这次课程设计,我不仅把以前所学知识的温习了一遍,还学会了许多新的知识;同时,我也感受到了自身的不足,我们大学生应该趁着年轻时期,多学点知识,为我们以后的生活多做准备。

在编辑程序,有时候稍微不小心就会在中文格式下编写代码,一不小心又会丢掉分号,做什么事都要耐心和细心;在程序编译过程中,每次总会出现不少错误,一个类型的错误就会引起整个程序瘫痪;在运行时,我试着从键盘输入与定义类型不同的数据也会出错,丝毫不能马虎。最后终于运行出来,感觉很欣慰,虽然界面不是很好,有些功能还不完善,我会更加努力,学更多知识来完善自己!

19

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- fenyunshixun.cn 版权所有 湘ICP备2023022495号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务