C++大作业个人报告.docx
《C++大作业个人报告.docx》由会员分享,可在线阅读,更多相关《C++大作业个人报告.docx(12页珍藏版)》请在冰豆网上搜索。
C++大作业个人报告
C++大作业个人工作总结
1.个人分工
(1)编写地图类CFixedMap和AGV类CAGV;
(2)编写类CPathPlan中将地图转换为有向图的成员函数MaptoGraph();
(3)编写类CPathPlan中的Putpath函数的文件输出部分;
(4)程序后期优化;
(5)答辩PPT制作;
大作业项目报告制作。
2.心得体会
不得不说,这次的大作业比起上次的有着天壤之别。
上次所做的一个小程序,完全不涉及到任何插件,我一个人也没写多久就完成了。
而这次所做的大作业,我们小组3个人一起做了许多努力,但最终实际上并没有达到预期目标。
对我个人来说,本次大作业让我理解到团队合作的重要性,项目规划的必要性。
由于小组几人一开始都各自独立写代码,负责整合的我实在大伤脑筋。
花了很大力气,才最终完成。
虽然我负责的部分比较简单,但我因此帮助小组其他成员做了许多工作。
例如,与文件流有关的工作全部是由我完成的;相关文件大都由我完成。
可以说这些工作比较繁重,但是最后能够看到成果,还是很让人欣慰的。
3.所做工作
(1)文本文档读入地图信息
在最初的设计中,为了方便调试与信息录入,地图文本做的粗糙不堪,但这确实为程序编写提供了许多便利。
如图,优化前的地图文件:
可以看出,全都是由数字组成,如果不了解程序,就不知道文件包含了什么,应该怎样修改。
在优化时,加入了大量提示信息,由此也出现了问题。
由于文件流输入无法判断输入的信息类型,造成了将提示信息录入而无法得到正确信息的错误。
为解决这一问题,我使用了一个简单的手段,即将提示信息与地图信息分隔,并分别录入,然后不再处理提示信息。
改进后的地图文本如下:
(2)采用C++和easyX软件显示地图。
这一部分相对比较简单,只需要稍微学习一下easyx插件就能完成。
地图显示分为了两个部分。
第一步是画点并标注点的标号,第二部分是连线。
值得一提的是,要将连通点的编号转化为相应的坐标看似简单,但我直接使用for循环和if语句却总是无法实现,最后只好写了两个函数getx和gety来解决这个问题。
几幅地图:
(3)编写将地图转换为有向图的成员函数MaptoGraph();
这个函数含有邻接矩阵的内容,本来认为比较难,但实际上也就一般。
函数分为两个部分,其一是初始化矩阵,两点间如果有连线距离就初始化为0,否则初始化为dMax。
第二部分是连通点间的距离向矩阵的输入,由于矩阵是对称的,因此一次可以录入两个值。
以下是调试时输出的矩阵:
(4)后期优化与尝试增加AGV台数
优化时改进了主程序的执行,增加了许多量的初始化,以实现自动完成参数设置;此外将各个部分的代码进行格式修正和精简。
虽然尝试增加AGV台数,也能轻松地添加路径,但是用sleep实现的动态显示部分实在无法改进。
而又已经没有足够的时间来改写计时器,因此两台AGV未能实现。
以下是一些测试截图
4.代码(约170行)
#include
#include
#include
#include
#include
#include
#include
#defineMAX100
#definemaxD99999
classCFixedMap
{
public:
structCoordinate
{
intx;
inty;
intnum;
};//记录点的结构体
structCombname
{
intnum1;
intnum2;
};//连通点名
structcombp
{
intx1,y1;
intx2,y2;
};//连通点坐标
intmVexNum;//顶点数
intmEdgNum;//边数
CoordinatemVexs[MAX];//顶点集合
doublemMatrix[MAX][MAX];//邻接矩阵
Combnamecomb[MAX];//连通点名
combpcp[MAX];//连通点坐标
//以文件方式输入地图信息
voidInput()
{
intpanju;
charfname[10]={"map2.txt"};
cout<<"是否载入默认地图?
(1:
是,2:
否)";
cin>>panju;
if(panju==2)
{
cout<<"请输入地图信息文件名:
";
cin>>fname;
}
ifstreamfile(fname);
charuse1[100];
charuse2[100];
charuse3[100];
charuse4[100];
file>>use1;
file>>mVexNum;
file>>use2;
file>>mEdgNum;
file>>use3;
for(inti=0;i{
file>>mVexs[i].num>>mVexs[i].x>>mVexs[i].y;
}
file>>use4;
for(i=0;i{
file>>comb[i].num1>>comb[i].num2;
}
file.close();
}
intgetx(intn1)
{
intx=0;
for(inti=0;iif(n1==mVexs[i].num)
x=mVexs[i].x;
returnx;
}
intgety(intn2)
{
inty=0;
for(inti=0;iif(n2==mVexs[i].num)
y=mVexs[i].y;
returny;
}
//easyx显示地图
voidShowMap()
{
initgraph(800,600,SHOWCONSOLE|NOCLOSE);//初始化绘图环境
setbkcolor(WHITE);//设置背景色
cleardevice();//用背景色清空屏幕
setfillcolor(BLACK);//设置填充色
//画顶点
for(inti=0;i{
fillcircle(mVexs[i].x,mVexs[i].y,5);
settextcolor(BLACK);
chars[MAX];
sprintf(s,"%d",i+1);
outtextxy(mVexs[i].x-10,mVexs[i].y-20,s);
}
//给实际连通的顶点连线
setlinecolor(RGB(0,0,0));
setlinestyle(PS_SOLID,6,NULL,0);
for(i=0;i{
cp[i].x1=getx(comb[i].num1);
cp[i].y1=gety(comb[i].num1);
cp[i].x2=getx(comb[i].num2);
cp[i].y2=gety(comb[i].num2);
line(cp[i].x1,cp[i].y1,cp[i].x2,cp[i].y2);
}
}
};
classCPathPlan:
publicCFixedMap
{
public:
intpath[MAX];
intpath2[MAX];//存放最后一个点
doubledist[MAX];
doubledist2[MAX];//存放路径距离
intv0;
intv1;//起始点
introute[40];
introute2[40];//路径
intrnum;
intrnum2;//路径顶点数
Coordinaterpoints[MAX];
Coordinaterpoints2[MAX];//路径点集
voidMaptoGraph()
{
rnum=0;
rnum2=0;
inta,b,x,y;
for(inti=0;i{
for(intj=0;j{
if(i==j)
{
mMatrix[i][j]=0;
}
else
{
mMatrix[i][j]=maxD;
}
}
}
for(i=0;i{
if(comb[i].num1)
{
a=comb[i].num1-1;
b=comb[i].num2-1;
x=mVexs[a].x-mVexs[b].x;
y=mVexs[a].y-mVexs[b].y;
mMatrix[a][b]=sqrt(x*x+y*y);
mMatrix[b][a]=sqrt(x*x+y*y);
}
}
}
voidmain(void)
{
CAGVShowa;
a.Input();
a.MaptoGraph();
intpanju;
cout<<"多次演示?
(1:
是,2:
否)";
cin>>panju;
if(panju==1)
{
for(inti=0;i<20;i++)
{
a.ShowMap();
a.Dijstra();
a.Putpath();
if(a.anum==2)
{
a.Dijstra2();
a.Putpath2();
}
a.show();
}
}
else
{
a.ShowMap();
a.Dijstra();
a.Putpath();
if(a.anum==2)
{
a.Dijstra2();
a.Putpath2();
}
a.show();
}
}