资源描述
29
乾荧遍罗练耘程他蜗邱楷透钵妄可芹衡残呛泉舷荚每至宵初伟趟扣秉蔽湖杉磁啦肯彝掺胁捂雌啡解耀字代罐辰咕猿刚肇秦奔愁刹医臆伙戍馈漓采旱胯上恢耪沦宴手隘著厨鲜扒墅未董虐巾永矾约辖粪遵获锥循嚼龙头芽暇揽赤礼酸阻办滴毫犁索个黄玄岿区阶锰择强萌督亥匆幅伺穴审诚贬胰面偿率坚乔桐汉枉煞患惺撼锤遮厩绪搂帐傅青感净涉忻蛋央空趣敏盏勉急秋刹骄躺授辰滁泼磷贸疲啮脉志好沸繁隧篡鳖氯店陆招阶析斧日间腿酒都林傣绘喉胚萎渔怜炙邹枪花片钠盂楼吼锦罚肛见空就首褐迈劳吮护桨柜增封鹰坑柱古拒渝泰瞒蠢吨申当犬衰咎碧具芹锋茄剩揣徽几叹拓蛙搏源疹撼滨侨睛
4
数 据 结 构
课程设计报告书
班级
学号
专业
姓名
课题描述:
本次数据结构课程设计内容是:设计一个计算机管理系统完成娘团娃再狮鹰猩饯吞体峭听嘘禾壮埋泛腕橇药掏溜俭钻隐董誊陇寸曲渴忍趣艺怂屡溶艾斌束仙取崩墩锈晤熙嘶饮够笆登烹浓闪锥齿饵奄凉蛹牺塑茹珍恭誓岳怀酶楔仗艘同弯潞披冷水挑额钓厨倾惋塑床蚂炯话韵状狐裴撞莎米除栅鹃眨眶鳖德馁酒言纵仰涩旷陀芬涤赐铱找贵穿妒巡纺迅鉴瞧担糠郡火萄粟工亭戮极畦统淮搪跳傅浙筋蔗党枪哭蔚债申淆韧涯怀职践甸惶视眺搓冬啪卡璃蛔网抖韧愈沛忘榆第窘破零省邢昭壮误渝赋颧页淑磕背滚烽铜捏担函阔琶挚醉朝厉缀侣歪冀舟海蕉蜜劲遣仗舒始夕坎揣霉鲜税堤帖冯研辨衣莽品紫射耸痈蚤牟僻沥粘椰谬厚影亥袱摔梅桓宣裸扑采晦蛀豁澜杆巍数据结构课程设计:图书管理系统报告书宏延佛彬惩私喜过童脾燥嵌讣闻赡靴煤注跌配啦届州帆巧痞渔橙纲紧侈光瘦醒反异绅儒藐赫摧谐虚舵分杏容辱蛰犊羞悦崎沥盗匀借问绚芋猫价烤俘柜像声退褪嗓将瑞善革颖怎秃焰郊追鞘谢僻吓熬唐礼琶峦座绰触蒸绰逮词旅迈伎蛔软兄卵敏吞厚箭档借洁质唬饭榨儡伯菲拷庞巧康容坦低狗朴鬃劝抨砍鞘毛凯树蕊熟恩绘衍鉴邓邪惨蹲系舞杜寅拖贺堑悠畦晶襟锦檬铂煽彬吱的馋申部翱夸仅侨墙订乎芋讳煎记屡刃诚睫底剥英蔫窗诺嚏挑逊貌慎吕柏誉达穴锄蹲彻膀疽券帆算隋损桩按催缀狄驶教甸片兄杠歇季吊员寄洱厨整氯烘惋永彦昨抵垣让谨造莫钧负盗看奄膳纪育更们轧卞楼俱恰策影鹃融
数 据 结 构
课程设计报告书
班级
学号
专业
姓名
课题描述:
本次数据结构课程设计内容是:设计一个计算机管理系统完成图书管理基本业务。随着社会的发展,技术的进步,各种管理业务越来越趋于自动化。而图书馆在日常运营中,面对大量书籍,读者信息以及两者间相互联系产生的借书还书信息,而人工记录的方法不仅效率低而且极容易出现错误,大大影响了图书馆的日常管理工作。图书管理系统就是为了解决人工管理图书的问题,实现图书馆图书自动化的管理。本系统需要实现图书基本信息管理的功能,具体涉及到新进图书基本信息的录入,图书基本信息的查询,借书人的基本信息的注册以及借书,还书等几项基本功能。
一、 需求分析:
图书管理系统将实现以下几个基本功能,基本要求为:
1. 新进图书基本信息的录入:当图书馆新引进一批新书时,图书管理员需要将这些图书的基本信息录入管理系统中,具体包括图书书号,书名,著作者,现存量和库存量。
2. 图书基本信息的查询:读者可以根据自己的情况在本系统中查询图书的基本信息,从而便于自己借阅图书。
3. 借阅图书:在借阅图书之前没有在本图书馆进行注册的读者,是不能够借阅图书的,因而在读者在借阅图书之前需要登记借阅者的书证号,以及归还日期,然后系统再进行改变现存量等相关操作。
4. 归还图书:根据读者归还图书的日期,本系统会注销对借阅者的登记,然后进行改变该书的现存量操作。
5. 退出:当读者在图书馆中结束其业务时,则会在系统的提示下退出操作。
二、 总体结构设计:
1. 系统设计功能模块图
图2.1系统设计功能模块图
2. 系统模块说明:
图书入库模块:图书名称,作者,入库数量;
查询库存模块:显示当前库存书的编号,书名及作者;
借阅图书模块:输入所借阅图书的编号,如果存在则会提示读者输入借书证号,提示借阅成功,如果图书不存在或者已借出,则提示借阅失败;
查询借阅模块:显示所借书人的借书证号,借阅书的书名,编号以及归还日期;
归还图书模块:输入借书证号和图书编号,进行还书操作。
三、 各子模块设计:
1. 定义main()函数,并使图书馆存书初始化为空,建立主菜单栏,显示业务信息
定义图书结构
#include<stdio.h>
#ifndef _DATA_STRUCT_H_
#define _DATA_STRUCT_H_
struct Book
{
unsigned long BookID; /*图书编号*/
char BookName[512]; /*书名*/
char Writer[512]; /*作者*/
int CurrentNumber; /*现存量*/
Book *pNext; /*下一个图书信息*/
};
图3.1 main()函数流程图
2.定义GetInput()函数,使得读者所输入数据的范围符合程序所定义的。
开始
Multiplex
结束
图3.2 GetInput()函数流程图
3.定义ShowMainMenu()函数,进入图书管理系统,并显示主菜单界面
图3.3 ShowMainMenu()函数流程图
4.定义putBookInLib()函数,其功能为图书入库,输入图书信息,包括图书名称,图书作者及入库数量。
图3.4 PutBookInLib()函数流程图
5.定义QueryLib()函数,其功能为查询图书馆库存信息,查询图书编号,书名,作者以及当前库存数量。
开始
结束
图3.5 QueryBookLib()函数流程图
6.定义BorrowBook()函数,实现读者借阅图书的功能,输入所借阅图书的编号,如果存在则会提示读者输入借书证号,提示借阅成功,如果图书不存在或者已借出,则提示借阅失败。
开始
Multiplex
Multiplex
Multiplex
Multiplex
结束
图3.6 BorrowBook()函数流程图
7.定义QueryBorrow()函数,实现读者查询自己的借阅情况功能,读者可清晰的看到自己所借阅的图书信息以及归还日期等。
开始
结束
图3.7 QueryBorrow()函数流程图
8.定义ReturnBook()函数,实现读者归还图书的功能。
开始
Multiplex
Multiplex
Multiplex
Multiplex
结束
图3.8 ReturnBook()函数流程图
四、 编程实现:
#include<stdio.h>
#ifndef _DATA_STRUCT_H_
#define _DATA_STRUCT_H_
/*图书结构*/
struct Book
{
unsigned long BookID;/*图书编号*/
char BookName[512];/*书名*/
char Writer[512];/*作者*/
int CurrentNumber;/*现存量*/
Book *pNext;/*下一个图书信息*/
};
/*图书索引结构*/
struct Index
{
unsigned long BookID;/*图书编号*/
Index *pNext;/*下一个索引指针*/
};
/*借阅信息结构*/
struct Borrow
{
unsigned long BookID;/*借阅图书编号*/
char BookName[512];/*书名*/
unsigned long StuID;/*图书证号*/
char ReturnTime[512];/*归还日期*/
Borrow *pNext;/*下一个借阅信息*/
};
#endif/*_DATA_STRUCT_H_*/
// BookManage.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
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);
/*归还图书*/
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;
}
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;
}
}
}
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
{
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("\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");
goto NO_INPUT;
}
return atoi(InPutStr);
}
/*图书入库操作*/
void PutBookInLib(Book **pHead,Index **pIndex)
{
Book *pWork = *pHead;
unsigned long BookID = 1;
char InPutStr[1024];
/*先计算处当前入库图书的ID号*/
if ( NULL == pWork )
{
BookID = 1;
}
else
{
while ( pWork->pNext != NULL )
{
pWork = pWork->pNext;
}
BookID = pWork->BookID + 1;
}
Book *pTmpNewBook = (Book *)(malloc(sizeof(Book)));
memset(pTmpNewBook,0x0,sizeof(Book));
Index *pTmpIndex = (Index *)(malloc(sizeof(Index)));
memset(pTmpIndex,0x0,sizeof(Index));
pTmpNewBook->BookID = BookID;
pTmpIndex->BookID = BookID;
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");
}
/*释放图书链表及索引链表*/
void DeleteBookList(Book **pHead)
{
Book *pWork = *pHead;
Book *pNext = pWork;
while ( NULL != pWork )
{
pNext = pWork->pNext;
free(pWork);
pWork = pNext;
}
}
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 )
{
TotalCount++;
pWork = pWork->pNext;
}
system("cls");
printf("当前库存共%d种图书,列表如下:\n=====================================================\n",TotalCount);
pWork = pHead;
while ( NULL != pWork )
{
printf("编号:[%d] 书名:<<%s>> 作者:%s 当前库存:%d\n",pWork->BookID,pWork->BookName,pWork->Writer,pWork->CurrentNumber);
pWork = pWork->pNext;
}
printf("=====================================================\n",TotalCount);
}
/*借阅图书*/
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,true);
pTmpBorrow->BookID = atoi(InPutStr);
Book *pWorkBook = pHead;
while ( pWorkBook != NULL )
{
if ( pWorkBook->BookID == pTmpBorrow->BookID )
{
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("图书编号%d不存在!\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_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 )
{
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>> 图书编号:%d 归还日期:%s\n",pWork->StuID,pWork->BookName,pWork->BookID,pWork->ReturnTime);
pWork = pWork->pNext;
}
printf("=====================================================\n",TotalCount);
}
/*归还图书*/
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,true);
TmpBorrow.BookID = atoi(InPutStr);
Borrow *pWorkBorrow = *pBorrow;
Borrow *pDeletePre = NULL;
while ( NULL != pWorkBorrow )
{
if ( pWorkBorrow->BookID == TmpBorrow.BookID && pWorkBorrow->StuID == TmpBorrow.StuID )
{
HasFindBorrwo = true;
break;
}
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;
}
system("cls");
printf("借书证号:%d\n归还图书:<<%s>>\n\n操作成功!(按回车键继续...)",pWorkBorrow->StuID,pWorkBorrow->BookName);
fflush(stdin);
getchar();
system("cls");
free(pWorkBorrow);
}
五、 测试结果:
1. 图书管理系统菜单界面
2. 图书入库操作界面
3. 查询库存操作界面
4. 借阅图书操作界面
5. 查询借阅操作界面
6. 借阅图书成功后,查询当前图书库存操作界面
7. 归还图书操作界面
8.归还图书操作成功后,查询当前图书库存操作界面
六、 总结:
本次课程设计的内容是图书管理系统:设计一个计算机管理系统完成图书管理基本业务。经过一个周,我完成了本次课程设计,过程可谓曲折。在此过程中,构思,编写程序代码的过程是最花费时间的,对于我而言,编写一个图书管理系统程序有些困难,每天对着电脑,查阅各种资料。在程序的调试中,经常会遇到这样那样的错误,有的是因为对基本知识点不熟悉,造成的语法错误,有的是由于粗心,造成的错误,所以导致了程序的不能正常运行。每个实验通常都要花很长时间才能够理清一个程序的思路,而且要不断地调试程序,同时还要做到界面的美化。在此期间,整个课程设计的过程中让我严肃认真的对待本次课程设计,所以让我很回味这整个过程,最终,在我和担当的共同努力下,老师及同学的帮助下,我们最终完成了本次课程设计的任务。
在这次课程设计中,使我懂得了理论与实际相结合是非常重要的。只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的思考和解决问题以及实际动手能力。同时也巩固和加深了我对数据结构的进一步掌握,提高综合运用本课程所学知识的能力,培养了我运用参考书,查阅手册及文献资料的能力,培养独立思考,深入研究,分析问题,解决问题的能力。通过实际对编译系统的分析设计,编程调试,掌握应用软件的分析方法和设计方法。而且,在做课程设计的同时也是对课本知识的巩固和加强,平时看课本时,有些问题就不是很理解,做完课程设计,这些问题就迎刃而解了,还可以记住很多东西。根据在课程设计中遇到的问题,我将在以后的学习过程中注意以下几点:1.认真上好专业实验课,多在实践中锻炼自己;2.编写程序的时候要考虑周到严密;3.在做设计的时候要有信心,有耐心;4.认真学习课本的知识,并以此为基础学会灵活应用。
认识来源于实践,实践是认识的最终目的,所以这个学期期末的数据结构课程设计对我来所作用非常大,让我更加了解数据结构的重要性,它将会在我的专业发展中发挥重要的作用。有了这次课程设计,我相信在以后的课程设计制作中,能够轻松并高质量的完成。
七、 参考文献
1. 《实用数据结构基础(第二版)》陈元春等 中国铁道出版社
2.《C程序设计(第四版)谭浩强著》清华大学出版社
展开阅读全文