C++课程设计报告图书信息管理系统设计.docx
《C++课程设计报告图书信息管理系统设计.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告图书信息管理系统设计.docx(35页珍藏版)》请在冰豆网上搜索。
C++课程设计报告图书信息管理系统设计
信息科学与技术学院
程序设计基础课程设计报告
题目名称:
图书信息管理系统设计
2012年6月21日
1.课程设计目的
1.1.课程设计的题目
图书信息管理系统设计
1.2.课程设计的要求
1.2.1问题描述(功能要求):
图书信息包括:
登录号、书名、作者名、分类号、出版单位、出版时间、价格等。
试设计一图书信息管理系统,使之能提供以下功能:
(1)系统以菜单方式工作
(2)图书信息录入功能(图书信息以文件保存)——输入
(3)图书信息浏览功能——输出
(4)查询和排序功能:
(至少一种查询方式)——算法
(5)图书信息的删除与修改(可选项)
1.2.2问题的解决方案:
(1)分析系统中的各个实体之间的关系及其属性和行为;
(2)根据问题描述,设计系统的类层次;
(3)完成类层次中的各个类的描述(包括属性和方法)
(4)完成类中各个成员函数的定义;
(5)完成系统的应用模块;
(6)功能调试
(7)完成系统总结报告以及系统使用说明书。
1.2.3其他要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)学生可自动增加新功能模块
2.总体设计
图书信息管理系统设计
信息查询
还书管理
借书登记
新书入库
打印读者信息
打印图书信息
图书信息查询
读者信息查询
2.1.新书入库模块
功能:
登记入库的新书信息
2.2.信息查询模块
2.2.1读者信息查询模块
功能:
查询某一读者的信息
2.2.2图书信息查询模块
功能:
查询某一图书的信息
2.2.3打印图书信息
功能:
打印所有图书的信息
2.2.4打印读者信息
功能:
打印所有读者的信息
2.3.借书模块
功能:
登记读者的借书信息
2.4.还书模块
功能:
登记读者的还书信息
3.详细设计
3.1.类设计
typedefstructBOOK//声明图书结构体变量BOOK,表示图书信息
{
charnumber[10];//书号
chartitle[20];//书名
charwriter[10];//作者
charpublish[20];//出版社
intyear;//出版年份
intmonth;//出版月份
intday;//出版日期
floatprice;//出版价格
intstorage;//库存量
intremain;//现存量
structBOOK*next;//下一个节点指针
}BOOK;
typedefstructBORROW//借书信息
{
charbook_number[10];//书号
}BORROW;
typedefstructREADER//读者信息
{
charnumber[3];//读者编号
charname[10];//读者名字
intborrow_amount;//当前借书量
BORROWborrow[Max];//借书信息
structREADER*next;
}READER;
3.2.基本操作函数
intDisplayMenu();//显示主菜单
voidInitialize();//初始化(初始化读者和图书的信息)
voidInit_reader();//初始化读者信息
voidInit_book();//初始化图书信息
voidInsert_New_Book();//新书入库模块
intFind();//查找菜单
voidFind_Select();//查找菜单选择函数
voidFind_Reader();//查找某个读者信息
voidFind_Book();//查找某个图书信息
voidPrint_reader();//打印所有读者信息
voidPrint_book();//打印所有图书信息
voidBorrow_Book();//借书函数
voidReturn_Book();//还书函数
voidSave();//保存到文件
voidSelectmenu();//主菜单选择函数
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还书模块
图3.6还书模块流程图
4.运行结果
5.设计源码
/*StandardTemplateLibrary,标准模板库*/
#include//数据流输入/输出
#include//字符串类
usingnamespacestd;
#defineMax3
typedefstructBOOK//声明图书结构体变量BOOK,表示图书信息
{
charnumber[10];//书号
chartitle[20];//书名
charwriter[10];//作者
charpublish[20];//出版社
intyear;//出版年份
intmonth;//出版月份
intday;//出版日期
floatprice;//出版价格
intstorage;//库存量
intremain;//现存量
structBOOK*next;//下一个节点指针
}BOOK;
typedefstructBORROW//借书信息
{
charbook_number[10];//书号
}BORROW;
typedefstructREADER//读者信息
{
charnumber[3];//读者编号
charname[10];//读者名字
intborrow_amount;//当前借书量
BORROWborrow[Max];//借书信息
structREADER*next;
}READER;
BOOK*h_book=NULL;//图书链表头结点
READER*h_reader=NULL;//读者链表头结点
intDisplayMenu();//显示主菜单
voidInitialize();//初始化(初始化读者和图书的信息)
voidInit_reader();//初始化读者信息
voidInit_book();//初始化图书信息
voidInsert_New_Book();//新书入库模块
intFind();//查找菜单
voidFind_Select();//查找菜单选择函数
voidFind_Reader();//查找某个读者信息
voidFind_Book();//查找某个图书信息
voidPrint_reader();//打印所有读者信息
voidPrint_book();//打印所有图书信息
voidBorrow_Book();//借书函数
voidReturn_Book();//还书函数
voidSave();//保存到文件
voidSelectmenu();//主菜单选择函数
//显示主菜单
intDisplayMenu()
{
intchoice;
cout<cout<cout<<"*\t0----退出系统*"<cout<<"*\t1----新书入库*"<cout<<"*\t2----信息查询*"<cout<<"*\t3----借书登记*"<cout<<"*\t4----还书管理*"<cout<cout<<"请选择相应选项:
";
while
(1)
{
cin>>choice;
if(choice<0||choice>4)
cout<<"\n错误!
请重新输入:
";
else
break;
}
returnchoice;
}
voidInitialize()//初始化(初始化读者和图书的信息)
{
Init_book();
Init_reader();
}
voidInit_book()//初始化图书信息
{
BOOK*pBook;//创建指向BOOK类的指针
pBook=(BOOK*)malloc(sizeof(BOOK));
/*sizeof是C/C++中的一个操作符(operator),作用是返回一个对象或者类型所占的内存字节数。
*/
/*Malloc向系统申请分配指定size个字节的内存空间。
返回类型是void*类型。
*/
/*void*类型可以强制转换为任何其它类型的指针。
*/
memset(pBook,0,sizeof(BOOK));//函数原型void*memset(void*s,intch,size_tn);
/*memset函数的作用是将s中前n个字节替换为ch并返回s;*/
h_book=pBook;
//打开文件
if(freopen("book.txt","r",stdin)==NULL)
{
fclose(stdin);
freopen("CON","r",stdin);
return;
}
while
(1)
{
//读取读者信息
cin>>pBook->number;
if(strcmp(pBook->number,"0")==0)//读到了文件末尾
//strcmp是字符串比较函数
{
//关闭文件输入流,恢复标准输入流
fclose(stdin);
freopen("CON","r",stdin);
return;
}
cin>>pBook->title>>pBook->writer>>pBook->publish>>pBook->year>>pBook->month
>>pBook->day>>pBook->price>>pBook->storage>>pBook->remain;
//创建下一个节点
BOOK*temp=(BOOK*)malloc(sizeof(BOOK));
memset(temp,0,sizeof(BOOK));
pBook->next=temp;
pBook=temp;
}
//关闭文件输入流,恢复标准输入流
fclose(stdin);
freopen("CON","r",stdin);
}
//初始化读者信息
voidInit_reader()
{
READER*pReader;
pReader=(READER*)malloc(sizeof(READER));/*向系统申请分配指定size个字节的内存空间,返回类型是void*类型。
*/
memset(pReader,0,sizeof(READER));/*把pReader清零*/
h_reader=pReader;
if(freopen("reader.txt","r",stdin)==NULL)//打开文件
{
fclose(stdin);
freopen("CON","r",stdin);
return;
}
while
(1)
{
//读取读者信息
cin>>pReader->number;
if(strcmp(pReader->number,"0")==0)//如果读到了文件末尾
{
fclose(stdin);
freopen("CON","r",stdin);
return;
}
cin>>pReader->name>>pReader->borrow_amount;
for(inti=0;iborrow_amount;i++)
{
cin>>pReader->borrow[i].book_number;
}
//创建下一个节点
READER*temp=(READER*)malloc(sizeof(READER));
memset(temp,0,sizeof(READER));
pReader->next=temp;
pReader=temp;
}
//关闭文件输入流,恢复标准输入流
fclose(stdin);//函数原型:
intfclose(FILE*stream);
freopen("CON","r",stdin);
/*重新分配文件指针,实现重定向。
如果stream流已经打开,则先关闭该流。
如果该流已经定向,则freopen将会清除该定向。
*/
/*函数原型:
FILE*freopen(constchar*filename,constchar*type,FILE*stream);*/
/*功能:
关闭一个流。
注意:
使用fclose()函数就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。
*/
}
voidInsert_New_Book()//新书入库模块
{
BOOK*p,*p0,*p1;
p=p1=h_book;
cout<<"\n\t\t新书入库\n";
cout<cout<<"\n请输入新书信息:
\n";
p0=(BOOK*)malloc(sizeof(BOOK));
cout<<"BookNo.:
";
cin>>p0->number;
while(strcmp(p0->number,p1->number)!
=0&&p1->next!
=NULL)
p1=p1->next;
if(strcmp(p0->number,p1->number)==0)
/*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/
{
cout<<"\n此编号图书已存在!
!
直接入库!
\n";
cout<<"请输入入库的图书数量:
";
cin>>p0->storage;
p1->storage+=p0->storage;
p1->remain+=p0->storage;
cin.clear();
cin.ignore(200,'\n');
}
else/*若不存在,则需要输入其他的信息,然后在进行插入操作*/
{
cout<<"图书名:
";
chartmp[20]={0};
cin>>tmp;
memcpy(p0->title,tmp,20);//函数原型void*memcpy(void*dest,constvoid*src,intn);
/*从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中*/
cout<<"图书作者:
";
chartmp0[10]={0};
cin>>tmp;
memcpy(p0->writer,tmp,20);
cout<<"图书出版社:
";
chartmp1[20]={0};
cin>>tmp;
memcpy(p0->publish,tmp,20);
cout<<"图书的出版年份:
";
cin>>p0->year;
cout<<"图书的出版月份:
";
cin>>p0->month;
cout<<"图书的出版日期:
";
cin>>p0->day;
cout<<"图书价格:
";
cin>>p0->price;
cout<<"图书入库量:
";
cin>>p0->remain;
p0->storage=p0->remain;
while(strcmp(p->next->number,"0")!
=0)
{
p=p->next;
}
if(h_book==NULL)h_book=p0;/*此处分两种情况,链表中如果没有数据,head则直接指向p0处*/
else
{
p0->next=p->next;
p->next=p0;/*此处分两种情况,链表中有数据,链表中最后元素的next指向p0处*/
}
p0->remain=p0->storage;
}
cout<<"\n新书入库完毕!
\n";
getchar();
}
//查找菜单
intFind()
{
intchoice;
cout<<"\n\t\t信息查询菜单\n";
cout<cout<<"*\t0----返回上级\t*\n";
cout<<"*\t1----查找图书\t*\n";
cout<<"*\t2----查找读者\t*\n";
cout<<"*\t3----打印所有图书\t*\n";
cout<<"*\t4----打印所有读者\t*\n";
cout<cout<<"请选择相应代码:
";
for(;;)/*循环调用模式,保证能进行重复操作*/
{
cin>>choice;
if(choice<0||choice>4)
{
cin.clear();
cin.ignore(200,'\n');
cout<<"\n错误!
请重新输入:
";
}
else
break;
}
returnchoice;
}
//查找菜单选择函数
voidFind_Select()
{
while
(1)/*循环调用模式,保证能进行重复操作*/
{
switch(Find())/*功能选择*/
{
case0:
return;
case1:
Find_Book();break;
case2:
Find_Reader();break;
case3:
Print_book();break;
case4:
Print_reader();break;
default:
cout<<"\n错误!
";
cin.clear();
cin.ignore(200,'\n');
exit(0);
}
}
}
voidFind_Reader()//查找某个读者信息
{
READER*p;
inti;
charfind_reader[10];
p=h_reader;
cout<<"\n读者信息查询模块\n";
cout<cout<<"\n请输入你要查询读者编号:
";
cin>>find_reader;
while(strcmp(p->number,find_reader)!
=0&&p->next)
p=p->next;
if(strcmp(p->number,find_reader)==0)
{
cout<<"\n读者编号:
"<\n";
cout<<"编号:
"<number<cout<<"姓名:
"<name<<"\n";
/*此处这样处理,是为了能实现一个读者能借多本书,
而Max的数值可以随需要修正*/
for(i=0;i{
cout<<"借的第"<
";
cout<borrow[i].book_number<}
}
else
cout<<"\n此读者编号不存在,请核对!
";
getchar();
}
voidFind_Book()//查找图书信息
{
BOOK*p;
charfind_book[10];/*读者编号唯一,查找只须一次遍历*/
p=h_book;
cout<<"\n图书信息查询模块\n";
cout<cout<<"请输入你要查询图书编号:
";
cin>>find_book;
while(strcmp(p->number,find_book)!
=0&&p->next)
p=p->next;
if(strcmp(p->number,find_book)==0)/*找到了就打印,否则提示不存在,或出错*/
{
cout<<"\n图书编号"<"<cout<<"图书名:
"<title<cout<<"作者:
"<writer<cout<<"出版社:
"<publish<cout<<"出版日期:
"<year<<"年"<month<<"月"<day<<"日"<cout<<"图书价格:
"<price<<"元"<cout<<"现存量:
"<remain<cout<<"库存量:
"<storage<}
else
cout<<"\n此图书编号不存在,请核对并检查你的信息是否有误!
";
getchar();
}
voidPrint_reader()//打印所有读者信息
{
READER*p;
inti;
p=h_reader;
cout<<"\