C++实践报告书.docx
《C++实践报告书.docx》由会员分享,可在线阅读,更多相关《C++实践报告书.docx(34页珍藏版)》请在冰豆网上搜索。
C++实践报告书
淮阴工学院
C++程序设计课程设计报告
选题名称:
图书管理系统
系别:
计算机工程系
专业:
计算机与科学技术
班级:
学生姓名:
学号:
指导教师:
学年学期:
2015~2016学年第1学期
2015年12月30日
C++课程设计任务书
课题
名称
图书管理
设计
目的
1.调研并熟悉图书管理的基本功能、数据流程与工作规程;
2.学习图书管理中的相关算法和VC++集成环境的编程技术;
3.通过实际编程加深对基础知识的理解,提高实践能力;
4.学习开发资料的收集与整理,学会撰写课程设计报告。
实验
环境
1.微型电子计算机(PC);
2.安装WindowsXP以上操作系统,VisualC++6.0开发工具。
任务
要求
设计内容:
设计一个实用的小型图书管理程序。
对图书的在库和借出状态要有所表示。
能提供读者信息查询及提供按图书的编号、书名、责任者、出版社等途径的检索。
程序应提供的基本管理功能有:
1)添加:
即增加一本书的记录到系统中。
2)删除:
即从系统中删除一本书的记录。
3)查询:
可根据书名、编号查找书的相关信息,若找到显示该书全部信息。
4)修改:
可修改一本书的除书名外其它信息。
5)状态:
提供该书在库、不在库的状态。
程序应输入不少于10本书的信息。
结束后,及时提交设计报告(含纸质稿、电子稿),要求格式规范、内容完整、结论正确,正文字数不少于3000字(不含代码)。
工作进度计划
序号
起止日期
工作内容
1
2015.12.28~2015.12.28
在预设计的基础上,进一步查阅资料,完善设计方案,形成书面材料。
2
2015.12.29~2015.12.31
设计总体方案,构建、绘制流程框图,编写代码,上机调试。
3
2016.01.01~2016.01.02
测试程序,优化代码,增强功能,撰写设计报告。
4
2016.01.03~2016.01.03
提交软件代码、设计报告,参加答辩,根据教师反馈意见,修改、完善设计报告。
指导教师:
步山岳
2015年12月21日
摘要:
这次的课程设计题目是图书管理系统。
图书管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。
对于前者要求建立起数据一致性和完整性强、数据安全性好的库。
而对于后者则要求应用程序共跟那个完备,易使用等特点。
采用C++作为开发工具。
通过对C++进行深入的学习和应用,主要完成利用图书馆管理系统对图书记录进行统一管理,包括新增图书记录,更改图书记录,删除图书记录等功能,实现图书管理工作系统化,规范化和自动化,为图书管理提供便利。
同时是学习玩《面向对象程序设计》课程后进行的一次全面的综合练习。
有助于加深对面向程序设计中基础理论和基本知识的理解,培养实践能力,促进理论与实践的结合。
关键词:
图书管理系统;C++;信息管理系统。
目录
1课题综述1
1.1预期目标1
1.2面对的问题1
1.3需解决的关键技术1
1.4涉及的知识1
2课题内容2
2.1设计思想2
2.2设计类和对象3
2.2.1设计book类3
2.2.2设计manager类3
2.2.3设计链表4
2.2.4设计主函数5
3程序调试5
3.1常见错误分析5
4代码编写6
5程序调试与运行17
6结论19
总结20
致谢21
参考文献22
C++课程设计成绩表23
1课题综述
1.1预期目标
熟练掌握面向对象设计的含义,联系C++中的数组;判断语句;循环语句和函数中的声明等等,能成功写出实现图书管理操作的代码,并且调试成功。
并在不断的操作过程中熟练掌握C++程序的设计步骤,并不断提高自己阅读与编写程序的能力,进一步熟悉程序的编辑,编译,连接和运行的过程。
1.2面对的问题
在设计过程中,代码设计的字符串的比较有些困难,必须查阅相关书籍找到相关知识的代码才能解决。
并且对每个类的设计把握度还不够,用的代码结构虽然简单但有点冗长不够精简。
1.3需解决的关键技术
本次课程设计中的关键技术就是充分利用面向对象设计中的函数调用,以及图书类方面的应用。
1.4涉及的知识
C++知识:
循环语句,选择语句,数组,函数调用。
1.循环语句
for()语句
for()循环语句的一般格式为:
for(<表达式1>;<表达式2>;<表达式3>)循环体语句;
其中,三个表达式都可以是C++中的任一符合语法规则的表达式;循环体语句可以是C++的任一语句。
同样也可将语句称为for()的内嵌语句,并称为循环体。
for()语句的执行过程如下;首先计算“表达式1”(循环初值),且只算一次。
每一次循环之前计算“表达式2”(循环条件),如果其结果为真,则执行“语句”,并计算“表达式3”(循环增量)。
否则,循环终止。
2.条件语句的一般格式为:
if(<表达式>)语句
其中,<表达式>可以是符合C++语法的任一表达式,也可以是算术表达式、关系表达式等等;语句可以是个单一的语句,也可以是个复合的语句,还可以是个空语句。
由于条件语句只是一个语句,故把语句称为条件语句的内嵌语句,并把内嵌语句的语句结束符“;”作为单选语句的结束符。
同样地,当语句是个复合语句时,把复合语句的结束符“}”也作为条件语句的结束符。
3.数组
数组:
是同类型的数据有序的集合。
数组有一维数组与多维数组之分。
二维数组的定义格式为:
类型说明符数组名[常量表达式1][常量表达式2];
“类型说明符“指定数组元素的类型,“数组名”的命名规则与变量一样,方括号中的“常量表达式1”代表了二维数组的行数,“常量表达式2”代表了二维数组的列数。
行列下标都是从零开始,其最大下标均比常量表达式的值小1。
2课题内容
2.1设计思想
(1)设计classmanager管理者类,以实现对整体图书的管理;Classbook图书类,实现对图书的描述,图书的编号,书名,借出,还入等;设计主函数以调用所设计的类的成员函数。
(2)建立单链表以实现管理者的功能(即通过单链表遍历显示所有图书信息)。
(3)设计菜单来实现功能设计:
1、创建新书目
2、删除书目
3、查询书目
4、修改信息
5、显示所有藏书
6、退出系统并保存修改
2.2设计类和对象
2.2.1设计book类
classbook
{
protected:
stringisbn;//定义字符串图书编号
stringname;
stringwriter;
stringpublicer;
stringtime;
public:
book(){}//构造book函数
book(stringa,stringb,stringc,stringd,stringe)
{
isbn=a;
name=b;
writer=c;
publicer=d;
time=e;
}
2.2.2设计manager类
classmanager:
publicbook
{
private:
bookbuffer[10];//设置图书馆的容量
intsum;
public:
manager()
{
sum=0;
}//默认图书的数量
voidadd(booka)
{
if(sum>=10)//最多添加9本
{
cout<<"添加失败,内存已满!
"<}
else
{
buffer[sum]=a;
sum++;
cout<<"添加新书目成功,以下是本书信息"<}}
2.2.3设计链表
voidread()
{
FILE*fp;//建立文件指针
if((fp=fopen("C:
\\图书馆.txt","rb+"))==NULL)//注意路径,将fp指针指向图书馆。
txt文件
{
cout<<"文件打开失败\n";
system("PAUSE");
exit(0);//关闭程序
}
fread(&sum,4,1,fp);//将文件中的数据个数,赋值给sum
for(inti=0;i{
fread(&buffer[i],sizeof(buffer[i]),1,fp);//将fp文件输入到buffer数组中,每次读出长度为sizeof(buffer[i])的数据项,读取一个数据项
}
fclose(fp);
}
voidwrite()
{
FILE*fp2;
if((fp2=fopen("C:
\\Users\\fei\\Desktop\\图书馆.txt","wb+"))==NULL)//注意路径
{
cout<<"文件打开失败\n";
system("PAUSE");
exit(0);
}
fwrite(&sum,4,1,fp2);//读出有多少条记录,即图书信息
for(inti=0;i{
fwrite(&buffer[i],sizeof(buffer[i]),1,fp2);//将数据写入文件
}
fputc('EOF',fp2);//将文件结束标志输入到fp2指针
fclose(fp2);//关闭文件指针}}
2.2.4设计主函数
//主函数
voidmain()
{
managerworker;
charfunction='0';
//worker.read();
//界面
while(function!
='6')//当function6时结束循环,即退出系统
{
for(inti=0;i<34;i++)
{
cout<<"*";
}
cout<cout<<"欢迎使用本图书管理系统,请选择操作\n"<cout<<"1创建新书目"<cout<<"2删除书目"<cout<<"3查询书目"<cout<<"4修改信息"<cout<<"5显示所有藏书"<cout<<"6退出系统并保存修改"<cin>>function
3程序调试
3.1常见错误分析
静态数据成员的初始化放在构造函数里,而不是在类成员函数实现的前面。
显示定义构造函数后还试图调用默认构造函数。
多层条件语句的if和else不配对;经常丢失“;”。
4代码编写
#include
#include
#include
usingnamespacestd;
#include
classbook
{
protected:
stringisbn;
stringname;
stringwriter;
stringpublicer;
stringtime;
public:
book(){}
book(stringa,stringb,stringc,stringd,stringe)
{
isbn=a;
name=b;
writer=c;
publicer=d;
time=e;
}
voidchange_name(stringa)//修改名称
{
name=a;
}
voidchange_isbn(stringa)//修改编号
{
isbn=a;
}
voidchange_writer(stringa)//修改作者
{
writer=a;
}
voidchange_publicer(stringa)//修改出版商
{
publicer=a;
}
voidchange_time(stringa)//修改时间
{
time=a;
}
stringget_name()//获取署名
{
returnname;
}
stringget_isbn()//获取书编号
{
returnisbn;
}
stringget_writer()//获取作业
{
returnwriter;
}
voiddisplay()//输出图书信息
{
cout<}
};
classmanager:
publicbook
{
private:
bookbuffer[10];//设置图书馆的容量
intsum;
public:
manager()
{
sum=0;
}//默认图书的数量
voidadd(booka)
{
if(sum>=10)//最多添加9本
{
cout<<"添加失败,内存已满!
"<}
else
{
buffer[sum]=a;
sum++;
cout<<"添加新书目成功,以下是本书信息"<}
}
voiddelete_by_name(booka)//删除图书通过
{
intflag=0;//判断是否删除成功,0表示失败,1表示成功
if(sum==0)
{
cout<<"删除失败,已经没有存档了!
"<}
else
{
for(inti=0;i{
if(buffer[i].get_name()==a.get_name())//找出书名相同
{
cout<<"删除书目成功,以下是删除的书信息"<buffer[i].display();//执行删除
for(intj=i;j{
buffer[j]=buffer[j+1];
}
flag=1;//删除成功标志
sum--;
break;
}
}
if(!
flag)
{
cout<<"thebookdoes'texist!
"<}
}
}
voidsearch_by_name(stringnames)//查询图书,通过图书名
{
intflag=0;//默认失败
for(inti=0;i{
if(buffer[i].get_name()==names)
{
buffer[i].display();
flag=1;
}
}
if(flag==0)
{
cout<<"thebookdoes'texist!
"<}
}
voidsearch_by_isbn(stringnames)//通过图书编号查询
{
intflag=0;
for(inti=0;i{
if(buffer[i].get_isbn()==names)//找出相等的图书编号输出
{
buffer[i].display();
flag=1;//表示操作成功
}
}
if(flag==0)
{
cout<<"thebookdoes'texist!
"<}
}
voidsearch_by_writer(stringnames)//同过作者名字查询
{
intflag=0;
for(inti=0;i{
if(buffer[i].get_writer()==names)//判断作者名是否相同
{
buffer[i].display();//输出
flag=1;//设置成功
}
}
if(flag==0)
{
cout<<"thebookdoes'texist!
"<}
}
voidchange_isbns(stringnam,stringisn)//通过查询书名,修改它的编号
{
for(inti=0;i{
if(buffer[i].get_name()==nam)//查出书名相同的书
{
buffer[i].change_isbn(isn);//修改图书编号
}
}
}
voidchange_names(stringnam,stringisn)//通过查询图书名称,修改图书名
{
for(inti=0;i{
if(buffer[i].get_name()==nam)
{
buffer[i].change_name(isn);//修改图书名
}
}
}
voidchange_writers(stringnam,stringisn)//通过查询作者名,修改作者
{
for(inti=0;i{
if(buffer[i].get_name()==nam)
{
buffer[i].change_writer(isn);//修改作者名
}
}
}
voidchange_publicers(stringnam,stringisn)//修改出版商
{
for(inti=0;i{
if(buffer[i].get_name()==nam)
{
buffer[i].change_publicer(isn);
}
}
}
voidchange_times(stringnam,stringisn)//修改出版时间
{
for(inti=0;i{
if(buffer[i].get_name()==nam)
{
buffer[i].change_time(isn);
}
}
}
voiddisplay_all()//输出所有的图书信息
{
for(inti=0;i{
buffer[i].display();
}
}
voidread()
{
FILE*fp;//建立文件指针
if((fp=fopen("C:
\\图书馆.txt","rb+"))==NULL)//注意路径,将fp指针指向图书馆。
txt文件
{
cout<<"文件打开失败\n";
system("PAUSE");
exit(0);//关闭程序
}
fread(&sum,4,1,fp);//将文件中的数据个数,赋值给sum
for(inti=0;i{
fread(&buffer[i],sizeof(buffer[i]),1,fp);//将fp文件输入到buffer数组中,每次读出长度为sizeof(buffer[i])的数据项,读取一个数据项
}
fclose(fp);
}
voidwrite()
{
FILE*fp2;
if((fp2=fopen("C:
\\Users\\fei\\Desktop\\图书馆.txt","wb+"))==NULL)//注意路径
{
cout<<"文件打开失败\n";
system("PAUSE");
exit(0);
}
fwrite(&sum,4,1,fp2);//读出有多少条记录,即图书信息
for(inti=0;i{
fwrite(&buffer[i],sizeof(buffer[i]),1,fp2);//将数据写入文件
}
fputc('EOF',fp2);//将文件结束标志输入到fp2指针
fclose(fp2);//关闭文件指针
}
};
//主函数
voidmain()
{
managerworker;
charfunction='0';
//worker.read();
//界面
while(function!
='6')//当function6时结束循环,即退出系统
{
for(inti=0;i<34;i++)
{
cout<<"*";
}
cout<cout<<"欢迎使用本图书管理系统,请选择操作\n"<cout<<"1创建新书目"<cout<<"2删除书目"<cout<<"3查询书目"<cout<<"4修改信息"<cout<<"5显示所有藏书"<cout<<"6退出系统并保存修改"<cin>>function;
if(function=='1')//创建新书
{
stringa,b,c,d,e;
cout<<"请输入书的isbn编号"<cin>>a;
cout<<"请输入书名"<cin>>b;
cout<<"请输入书作者名"<cin>>c;
cout<<"请输入书的出版社"<cin>>d;
cout<<"请输入书的出版时间"<cin>>e;
booknewbook(a,b,c,d,e);//通过book的构造函数,输入图书信息
worker.add(newbook);//将图书信息保存到buffer数组中,即放入图书馆
newbook.display();//输出添加的图书
system("PAUSE");
system("CLS");
}elseif(function=='5')//显示所有图书
{
cout<<"这是所有藏书:
"<worker.display_all();//调用display_all函数
system("PAUSE");
system("CLS");
}elseif(function=='2')//删除图书
{
stringa;
cout<<"请输