图书管理系统c++数据结构实验报告.docx
- 文档编号:28742124
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:23
- 大小:19.98KB
图书管理系统c++数据结构实验报告.docx
《图书管理系统c++数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《图书管理系统c++数据结构实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
图书管理系统c++数据结构实验报告
数据结构
课程设计说明书
学生姓名:
学院:
软件学院
专业:
信息管理与信息系统
题目:
图书管理系统
成绩
指导教师
2011年1月6日
1.设计目的(小标题黑体五号字)
《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
进行数据结构课程设计要达到以下目的:
⏹了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
⏹初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
⏹提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2.设计内容和要求
1)每种书的登记内容包括书号、书名、著作者、现存量和库存量;
2)对书号建立索引表(线性表)以提高查找效率;
3)系统主要功能如下:
*采编入库:
新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;
*借阅:
如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;
*归还:
注销对借阅者的登记,改变该书的现存量。
3.本设计所采用的数据结构
定义图书链表和图书索引结构
structBook
{
charBookID[10];/*图书编号*/
charBookName[512];/*书名*/
charWriter[512];/*作者*/
intCurrentNumber;/*现存量*/
Book*pNext;/*下一个图书信息*/
};
structIndex
{
charBookID[10];/*图书编号*/
Index*pNext;/*下一个索引指针*/
};
/*借阅信息结构*/
structBorrow
{
charBookID[10];/*借阅图书编号*/
charBookName[512];/*书名*/
unsignedlongStuID;/*图书证号*/
charReturnTime[512];/*归还日期*/
Borrow*pNext;/*下一个借阅信息*/
};
4.功能模块详细设计
4.1详细设计思想
主函数main()
主函数通过一个switch语句实现对系统功能的选择。
主菜单选择函数ShowMainMenu()
此函数包括退出系统,图书入库,查询库存,查询借阅和归还图书五个函数,通过调用主菜单函数判断用户做出的选择,从而进行相应的操作。
图书入库函数PutBookInLib()
此函数通过的创建一个图书链表,达到对新进书判断,若在现有的图书中找到该书,则直接进行入库,并记录下图书的数量,若找完整个图书量表也没找到该书,则要记录下新进图书的名称,作者,数量,并把该书插入到已有数中,方便下次对新书的判断。
查询图书馆库存函数QueryBookLib()
查询图书馆库存,查询不改变数据,故传入指针即可。
显示图书的编号、名称、作者、现有量以及库存量
借阅图书函数BorrowBook()
此函数通过读者的图书证号对读者链表从头至尾进行查找,若找到读者,则显示读者图书证号以及姓名,然后利用for循环和指针,对读者所借图书进行查找并显示。
若找不到读者,显示读者标号不存在,按任意键回到查找菜单选择函数界面。
借阅图书函数BorrowBook()
此函数需要读者输入的图书证号,根据读者输入的要借的图书编号,再利用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_*/
/*图书结构*/
structBook
{
charBookID[10];/*图书编号*/
charBookName[512];/*书名*/
charWriter[512];/*作者*/
intCurrentNumber;/*现存量*/
Book*pNext;/*下一个图书信息*/
};
/*图书索引结构*/
structIndex
{
charBookID[10];/*图书编号*/
Index*pNext;/*下一个索引指针*/
};
/*借阅信息结构*/
structBorrow
{
charBookID[10];/*借阅图书编号*/
charBookName[512];/*书名*/
unsignedlongStuID;/*图书证号*/
charReturnTime[512];/*归还日期*/
Borrow*pNext;/*下一个借阅信息*/
};
/*获取输入字符串*/
voidGetInput(char*pInOutStr,intStrLen,boolOnlyGetNumber=false);
/*显示主菜单并返回选择*/
intShowMainMenu();
/*图书入库操作,传入参数为图书列表头指针的指针和索引信息的头指针的指针,因为在此函数内部可能会改变头指针的值*/
voidPutBookInLib(Book**pHead,Index**pIndex);
/*查询图书馆库存,查询不改变数据,故传入指针即可*/
voidQueryBookLib(Book*pHead);
/*借阅图书*/
voidBorrowBook(Borrow**pBorrow,Book*pHead);
/*查询借阅*/
voidQueryBorrow(Borrow*pBorrow);
/*归还图书*/
voidReturnBook(Borrow**pBorrow,Book*pHead);
/*释放图书链表及索引链表及借阅信息链表*/
voidDeleteBookList(Book**pHead);
voidDeleteIndexList(Index**pIndex);
voidDeleteBorrowList(Borrow**pBorrow);
intmain()
{
/*图书列表头指针*/
Book*pBookHead=NULL;
/*图书索引头指针*/
Index*pIndexHead=NULL;
/*借阅信息头指针*/
Borrow*pBorrowHead=NULL;
/*用来保存当前用户的输入*/
intChoosedNum=-1;
while(true)
{
ChoosedNum=ShowMainMenu();
switch(ChoosedNum)
{
case0:
/*退出*/
{
return0;
break;
}
case1:
/*图书入库*/
{
PutBookInLib(&pBookHead,&pIndexHead);
break;
}
case2:
/*查询库存*/
{
QueryBookLib(pBookHead);
printf("按回车键继续...");
fflush(stdin);
getchar();
system("cls");
break;
}
case3:
/*借阅图书*/
{
QueryBookLib(pBookHead);
BorrowBook(&pBorrowHead,pBookHead);
break;
}
case4:
/*查询借阅*/
{
QueryBorrow(pBorrowHead);
printf("按回车键继续...");
fflush(stdin);
getchar();
system("cls");
break;
}
case5:
/*归还图书*/
{
QueryBorrow(pBorrowHead);
ReturnBook(&pBorrowHead,pBookHead);
break;
}
}
}
DeleteBookList(&pBookHead);
DeleteIndexList(&pIndexHead);
DeleteBorrowList(&pBorrowHead);
fflush(stdin);
getchar();
return0;
}
/*获取输入字符串*/
voidGetInput(char*pInOutStr,intStrLen,boolOnlyGetNumber)
{
memset(pInOutStr,0x0,StrLen);
fflush(stdin);
intCount=0;
while(true)
{
charTmpC=0;
fread(&TmpC,1,1,stdin);
if(10==TmpC)
{
break;
}
if(OnlyGetNumber&&TmpC>='0'&&TmpC<='9')
{
pInOutStr[Count]=TmpC;
Count++;
}
else
{
pInOutStr[Count]=TmpC;
Count++;
}
}
}
/*显示主菜单并返回选择*/
intShowMainMenu()
{
charInPutStr[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)
{
system("cls");
gotoNO_INPUT;
}
returnatoi(InPutStr);
}
/*图书入库操作*/
voidPutBookInLib(Book**pHead,Index**pIndex)
{
Book*pWork=*pHead;
charInPutStr[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);
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)==0&&strcmp(pWork->Writer,pTmpNewBook->Writer)==0)
{
pWork->CurrentNumber+=pTmpNewBook->CurrentNumber;
return;
}
pWork=pWork->pNext;
}
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入库操作成功!
(按回车键继续...)",pTmpNewBook->BookName,pTmpNewBook->Writer,pTmpNewBook->CurrentNumber);
fflush(stdin);
getchar();
system("cls");
}
/*释放图书链表及索引链表*/
voidDeleteBookList(Book**pHead)
{
Book*pWork=*pHead;
Book*pNext=pWork;
while(NULL!
=pWork)
{
pNext=pWork->pNext;
free(pWork);
pWork=pNext;
}
}
voidDeleteIndexList(Index**pIndex)
{
Index*pWork=*pIndex;
Index*pNext=pWork;
while(NULL!
=pWork)
{
pNext=pWork->pNext;
free(pWork);
pWork=pNext;
}
}
voidDeleteBorrowList(Borrow**pBorrow)
{
Borrow*pWork=*pBorrow;
Borrow*pNext=pWork;
while(NULL!
=pWork)
{
pNext=pWork->pNext;
free(pWork);
pWork=pNext;
}
}
/*查询图书馆库存,查询不改变数据,故传入指针即可*/
voidQueryBookLib(Book*pHead)
{
Book*pWork=pHead;
intTotalCount=0;
while(NULL!
=pWork)
{
TotalCount++;
pWork=pWork->pNext;
}
system("cls");
printf("当前库存共%d种图书,列表如下:
\n=====================================================\n",TotalCount);
pWork=pHead;
while(NULL!
=pWork)
{
printf("书名:
<<%s>>作者:
%s当前库存:
%d\n",pWork->BookName,pWork->Writer,pWork->CurrentNumber);
pWork=pWork->pNext;
}
printf("=====================================================\n",TotalCount);
}
/*借阅图书*/
voidBorrowBook(Borrow**pBorrow,Book*pHead)
{
charInPutStr[1024];
boolHadTheBook=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)
{
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");
printf("图书编号%s不存在!
\n(按回车键继续...)",pTmpBorrow->BookID);
fflush(stdin);
getchar();
system("cls");
free(pTmpBorrow);
return;
}
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_tltime;
structtm*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)
{
pWork=pWork->pNext;
}
pWork->pNext=pTmpBorrow;
}
pWorkBook->CurrentNumber--;
system("cls");
printf("借书证号:
%d\n借阅图书:
<<%s>>\n\n操作成功!
(按回车键继续...)",pTmpBorrow->StuID,pTmpBorrow->BookName);
fflush(stdin);
getchar();
system("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 管理 系统 c+ 数据结构 实验 报告