《图书管理系统-C++课程设计(共31页).doc》由会员分享,可在线阅读,更多相关《图书管理系统-C++课程设计(共31页).doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上信息科学与技术学院程序设计基础课程设计报告题目名称: 图书信息管理系统设计 学生姓名: 王栎沣 学 号: 1102014 专业班级: 计科专业计双2011级1班 指导教师: 郭 理 2012年 6月21日1. 课程设计目的1.1. 课程设计的题目图书信息管理系统设计1.2. 课程设计的要求1.2.1 问题描述(功能要求): 图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。试设计一图书信息管理系统,使之能提供以下功能: (1)系统以菜单方式工作 (2)图书信息录入功能(图书信息以文件保存)输入 (3)图书信息浏览功能输出 (4)查询和排序功能:(
2、至少一种查询方式)算法 (5)图书信息的删除与修改(可选项)1.2.2问题的解决方案: (1)分析系统中的各个实体之间的关系及其属性和行为; (2)根据问题描述,设计系统的类层次; (3)完成类层次中的各个类的描述(包括属性和方法) (4)完成类中各个成员函数的定义; (5)完成系统的应用模块; (6)功能调试 (7)完成系统总结报告以及系统使用说明书。1.2.3其他要求: (1)只能使用C/C+语言,源程序要有适当的注释,使程序容易阅读 (2)至少采用文本菜单界面(如果能采用图形菜单界面更好) (3)学生可自动增加新功能模块2. 总体设计图书信息管理系统设计信息查询还书管理借书登记新书入库打
3、印读者信息打印图书信息图书信息查询读者信息查询2.1. 新书入库模块 功能:登记入库的新书信息2.2. 信息查询模块2.2.1读者信息查询模块 功能:查询某一读者的信息2.2.2图书信息查询模块 功能:查询某一图书的信息2.2.3打印图书信息 功能:打印所有图书的信息2.2.4打印读者信息 功能:打印所有读者的信息2.3. 借书模块 功能:登记读者的借书信息2.4. 还书模块 功能:登记读者的还书信息3. 详细设计3.1. 类设计typedef struct BOOK /声明图书结构体变量BOOK,表示图书信息char number10; /书号char title20; /书名char wr
4、iter10; /作者 char publish20; /出版社 int year; /出版年份 int month; /出版月份 int day; /出版日期 float price; /出版价格int storage; /库存量int remain; /现存量struct BOOK *next; /下一个节点指针BOOK;typedef struct BORROW /借书信息char book_number10; /书号BORROW;typedef struct READER /读者信息char number3; /读者编号char name10; /读者名字int borrow_amou
5、nt; /当前借书量BORROW borrowMax; /借书信息struct READER *next;READER;3.2. 基本操作函数int DisplayMenu();/显示主菜单void Initialize(); /初始化(初始化读者和图书的信息)void Init_reader();/初始化读者信息void Init_book(); /初始化图书信息void Insert_New_Book();/新书入库模块int Find(); /查找菜单void Find_Select();/查找菜单选择函数void Find_Reader();/查找某个读者信息void Find_Boo
6、k();/查找某个图书信息 void Print_reader(); /打印所有读者信息void Print_book();/打印所有图书信息void Borrow_Book();/借书函数void Return_Book();/还书函数void Save(); /保存到文件void Selectmenu(); /主菜单选择函数3.3. 程序流程图 3.3.1主函数流程图图3.3.1 主函数流程图3.3.2初始化模块图3.2 初始化模块流程图3.3.3借书模块图3.3 借书模块流程图3.3.4新书入库模块图3.4 新书入库模块3.3.5信息查询模块图3.5 信息查询模块流程图3.3.6还书模块
7、图3.6 还书模块流程图4. 运行结果5. 设计源码/*Standard Template Library,标准模板库*/#include /数据流输入输出#include /字符串类using namespace std;#define Max 3 typedef struct BOOK /声明图书结构体变量BOOK,表示图书信息char number10;/书号char title20; /书名char writer10;/作者 char publish20; /出版社 int year; /出版年份 int month; /出版月份 int day; /出版日期 float price;
8、 /出版价格int storage; /库存量int remain; /现存量struct BOOK *next; /下一个节点指针BOOK;typedef struct BORROW /借书信息char book_number10;/书号BORROW;typedef struct READER /读者信息char number3; /读者编号char name10;/读者名字int borrow_amount;/当前借书量BORROW borrowMax; /借书信息struct READER *next;READER;BOOK *h_book = NULL;/图书链表头结点READER *
9、h_reader = NULL;/读者链表头结点int DisplayMenu();/显示主菜单void Initialize();/初始化(初始化读者和图书的信息)void Init_reader();/初始化读者信息void Init_book();/初始化图书信息void Insert_New_Book();/新书入库模块int Find();/查找菜单void Find_Select();/查找菜单选择函数void Find_Reader();/查找某个读者信息void Find_Book();/查找某个图书信息 void Print_reader();/打印所有读者信息void Pr
10、int_book();/打印所有图书信息void Borrow_Book();/借书函数void Return_Book();/还书函数void Save();/保存到文件void Selectmenu(); /主菜单选择函数/显示主菜单int DisplayMenu() int choice;coutendl图书管理系统主菜单endl; coutstring(50,=)endl;cout*t0-退出系统 *endl;cout*t1-新书入库 *endl;cout*t2-信息查询 *endl;cout*t3-借书登记 *endl;cout*t4-还书管理 *endl; coutstring(5
11、0,=)endl; coutchoice;if(choice4)coutpBook-number;if (strcmp(pBook-number, 0) = 0)/读到了文件末尾/strcmp是字符串比较函数/关闭文件输入流,恢复标准输入流fclose(stdin);freopen(CON, r, stdin);return;cinpBook-titlepBook-writerpBook-publishpBook-yearpBook-monthpBook-daypBook-pricepBook-storagepBook-remain;/创建下一个节点BOOK *temp = (BOOK*)ma
12、lloc(sizeof(BOOK);memset(temp, 0, sizeof(BOOK);pBook-next = temp;pBook = temp;/关闭文件输入流,恢复标准输入流fclose(stdin);freopen(CON, r, stdin);/初始化读者信息void Init_reader() READER *pReader;pReader = (READER*)malloc(sizeof(READER); /*向系统申请分配指定size个字节的内存空间,返回类型是 void* 类型。*/memset(pReader, 0, sizeof(READER); /* 把pRea
13、der 清零 */h_reader = pReader;if (freopen(reader.txt, r, stdin) = NULL) /打开文件fclose(stdin);freopen(CON, r, stdin);return;while (1)/读取读者信息cinpReader-number;if (strcmp(pReader-number, 0) = 0)/如果读到了文件末尾fclose(stdin);freopen(CON, r, stdin); return;cinpReader-namepReader-borrow_amount; for (int i = 0; i bo
14、rrow_amount; i+)cinpReader-borrowi.book_number;/创建下一个节点READER *temp = (READER*)malloc(sizeof(READER);memset(temp, 0, sizeof(READER);pReader-next = temp;pReader = temp; /关闭文件输入流,恢复标准输入流fclose(stdin); /函数原型: int fclose(FILE *stream);freopen(CON, r, stdin); /*重新分配文件指针,实现重定向。如果stream流已经打开,则先关闭该流。如果该流已经定
15、向,则freopen将会清除该定向。*/*函数原型: FILE *freopen(const char *filename,const char *type, FILE *stream);*/*功 能: 关闭一个流。注意:使用fclose()函数就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。*/void Insert_New_Book() /新书入库模块BOOK *p,*p0,*p1; p=p1=h_book;coutntt新书入库n; coutstring(40,=)endl;coutn请输入新书信息:n; p0=(BOOK *)malloc(sizeof(B
16、OOK);coutp0-number; while(strcmp(p0-number,p1-number)!=0&p1-next != NULL)p1=p1-next; if(strcmp(p0-number,p1-number)=0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/ coutn此编号图书已存在!直接入库!n; coutp0-storage;p1-storage+=p0-storage;p1-remain+=p0-storage;cin.clear( ); cin.ignore( 200,n); else/*若不存在,则需要输入其他的信息 ,然后在进行插入
17、操作*/ cout tmp;memcpy(p0-title,tmp,20); /函数原型void *memcpy(void *dest, const void *src, int n);/*从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中*/cout tmp;memcpy(p0-writer,tmp,20); cout tmp;memcpy(p0-publish,tmp,20); coutp0-year;coutp0-month;coutp0-day;coutp0-price;coutp0-remain;p0-storage=p0-remain;whi
18、le(strcmp(p-next-number, 0) != 0) p=p-next;if(h_book=NULL) h_book=p0; /*此处分两种情况,链表中如果没有数据,head则直接指向p0处*/elsep0-next = p-next;p-next = p0; /*此处分两种情况,链表中有数据,链表中最后元素的next指向p0处*/p0-remain=p0-storage; coutn新书入库完毕!n; getchar();/查找菜单int Find()int choice;coutntt信息查询菜单n; coutendlstring(50,=)endl;cout*t 0-返回上
19、级 t*n; cout*t 1-查找图书 t*n; cout*t 2-查找读者 t*n; cout*t 3-打印所有图书 t*n; cout*t 4-打印所有读者 t*n;coutstring(50,=)endl;coutchoice; if(choice4)cin.clear( ); cin.ignore(200,n);coutn错误!请重新输入:; else break;return choice; /查找菜单选择函数void Find_Select()while(1) /*循环调用模式,保证能进行重复操作*/switch(Find() /*功能选择*/ case 0:return;cas
20、e 1:Find_Book();break;case 2:Find_Reader();break;case 3:Print_book();break;case 4:Print_reader();break;default:coutn错误!; cin.clear( ); cin.ignore(200,n);exit(0);void Find_Reader() /查找某个读者信息READER *p;int i;char find_reader10;p=h_reader;coutn读者信息查询模块n; coutstring(50,=)endl;coutfind_reader;while(strcmp
21、(p-number,find_reader)!=0&p-next)p=p-next;if(strcmp(p-number,find_reader)=0)coutn读者编号:find_reader的信息为:n;cout编号:numberendl; cout姓名:namen; /*此处这样处理,是为了能实现一个读者能借多本书, 而Max的数值可以随需要修正*/ for(i=0;iMax;i+)cout借的第i+1本书的编号为:;coutborrowi.book_numberendl;elsecoutn此读者编号不存在,请核对!; getchar(); void Find_Book() /查找图书信
22、息 BOOK *p;char find_book10; /*读者编号唯一,查找只须一次遍历*/p=h_book;coutn图书信息查询模块n;coutstring(25,)endl;coutfind_book;while(strcmp(p-number,find_book)!=0&p-next)p=p-next;if(strcmp(p-number,find_book)=0) /*找到了就打印,否则提示不存在,或出错*/ coutn图书编号find_book的信息为:endl; cout图书名:titleendl; cout作者:writerendl; cout出版社:publishendl;
23、 cout出版日期:year年month月day日endl; cout图书价格 :price元endl; cout现存量:remainendl; cout库存量:storageendl;elsecoutn此图书编号不存在,请核对并检查你的信息是否有误!; getchar();void Print_reader() /打印所有读者信息READER *p;int i;p=h_reader;coutnumber, 0) != 0) /*遍历链表一次就可以了*/*strcmp函数的作用是功能:比较字符串s1和s2。*/coutReaderNo.numberendl; cout读者姓名为:nameend
24、l;for(i=0;iMax;i+)cout借的第i + 1一本书的编号为; coutborrowi.book_numberendl;coutendlnext;coutn读者信息打印完毕!endl; getchar();void Print_book() /打印图书信息BOOK *p;p=h_book;coutn图书信息如下:nn; coutNo. BookName BookWriter Bookpublish Publication Dates Price Remain number, 0) != 0)coutnumber titletwritertpublisht year年month月d
25、ay日t price remain storagenext;coutn图书信息打印完毕!endl; getchar();void Borrow_Book() /借书模块BOOK *p0; READER *p1;char bo_num10,rea_num10;int i;p0=h_book; p1=h_reader;coutnnn借书界面n; coutstring(50,=);coutrea_num;while(p1-next!=NULL&strcmp(rea_num,p1-number)!=0) /*遍历一次读者链表,判断读者是否存在*/p1=p1-next;if(p1-next=NULL&s
26、trcmp(rea_num,p1-number)!=0) /*如果存在,则继续,不存在就、则提示错误!*/ coutn此读者编号不存在!n; getchar();return; coutbo_num;while(strcmp(bo_num,p0-number)!=0&p0-next!=NULL) /*遍历一次图书链表,判断此图书是否存在*/p0=p0-next;if(p0-next=NULL&strcmp(bo_num,p0-number)!=0) /*如果存在,则继续,不存在就、则提示错误!*/coutremain=0) /*判断此图书现在是否还有库存*/ coutborrow_amount
27、=Max) /*判断此读者借书量是否已经达到最大允许借书量*/ coutborrow_amount !=0) /*此读者若已经借书,再判断此读者是否要借两本一样的书*/int b = 0;for(i=0;iborrow_amount;i+) /*遍历一次读者所借的书,如果发现有重复,则结束*/if(strcmp(p1-borrowi.book_number,bo_num)=0)b = 1; if (b = 1)coutborrowp1-borrow_amount+.book_number,bo_num); p0-remain-;coutn读者编号numberborrowp1-borrow_am
28、ount+.book_number,bo_num); /原型声明:extern char *strcpy(char *dest,const char *src)/功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间p0-remain-;coutn读者编号number借书完毕!endl;cin.clear( ); cin.ignore( 200,n);void Return_Book() /还书模块BOOK *p; READER *q;int i,j,find=0;char return_book_num10,return_reader_num10;p=h_book
29、; q=h_reader;coutn还书模块n; coutreturn_reader_num; while(q-next!=NULL&strcmp(return_reader_num,q-number)!=0) q=q-next;if(q-next=NULL&strcmp(return_reader_num,q-number)!=0)find=2;/*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,则find=2,若借了,则find=1,若没借为find=0*/coutn此读者编号不存在!n; return;coutreturn_book_num;while(p-next!=
30、NULL&strcmp(return_book_num,p-number)!=0)p=p-next;if(p-next=NULL&strcmp(return_book_num,p-number)!=0) find=2;/*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,则find=2,若借了,则find=1,若没借为find=0*/coutn错误!此图书编号不存在!n; cin.clear( ); cin.ignore( 200,n);return; for(i=0;iborrowi.book_number)=0) /*如果此读者借了此书*/find=1; /*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,则find=2,若借了,则find=1,若没借为find=0*/for(j=i;jborrowj.book_number,q-borrowj+1.book_number); strcpy(q-borrowMax-1.book_number,0);p-rem