C++大作业项目报告Word文档下载推荐.docx
- 文档编号:21843230
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:168.47KB
C++大作业项目报告Word文档下载推荐.docx
《C++大作业项目报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C++大作业项目报告Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
classCFixedMap
{
structCoordinate
{
intx;
inty;
intnum;
};
//记录点的结构体
structcombp
intx1,y1;
intx2,y2;
};
//连通点坐标
structCombname
intnum1;
intnum2;
};
//连通点名
public:
intmVexNum;
//顶点数
intmEdgNum;
//边数
doublemMatrix[MAX][MAX];
//邻接矩阵
Combnamecomb[MAX];
//连通点名
combpcp[MAX];
//连通点坐标
CoordinatemVexs[MAX];
//顶点集合
intgetx(intn1);
intgety(intn2);
voidInput();
//以文件方式输入地图信息
voidShowMap();
//easyx显示地图
};
(2)。
基类CAGV
classCAGV
{
intspeed;
//AGV速度
intwidth;
//AGV宽度
intlength;
//AGV长度
public:
CAGV();
intgetl();
//返回AGV长度
intgetw();
//返回AGV宽度
intgets();
//返回AGV速度
};
(3).单一继承类CPathPlan
classCPathPlan:
publicCFixedMap
public:
intpath[MAX];
//存放最后一个点
doubledist[MAX];
//存放路径距离
intv0;
//起始点
introute[40];
//路径
intrnum;
//路径顶点数
Coordinaterpoints[MAX];
//路径点集
voidMaptoGraph();
voidDijstra();
voidPutpath();
};
(4).多重继承类CAGVShow
classCAGVShow:
publicCPathPlan,publicCAGV
#definek(abs(y2-y1))/(abs(x1-x2))
inta,b,c,d;
intx1,x2,y1,y2;
//AGV实际坐标
inti,j;
intl,w,s;
//对应类CAGV中的相关数据
voidshow();
};
2.3程序流程图
开始
AGV信息设定
自动设置AGV?
是
自动载入地图?
手动输入AGV信息
手动输入地图文件名
载入地图文件(文本)
多次演示?
否
显示地图
路径文件输出
路径规划
动态显示
结束?
结束
三、程序重点解析
3。
1文本文档读入地图信息
在最初的设计中,为了方便调试与信息录入,地图文本做的粗糙不堪,但这确实为程序编写提供了许多便利.如图,优化前的地图文件:
可以看出,全都是由数字组成,如果不了解程序,就不知道文件包含了什么,应该怎样修改。
在优化时,加入了大量提示信息,由此也出现了问题.由于文件流输入无法判断输入的信息类型,造成了将提示信息录入而无法得到正确信息的错误。
为解决这一问题,我们使用了一个简单的手段,即将提示信息与地图信息分隔,并分别录入,然后不再处理提示信息。
改进后的地图文本如下:
程序中的相应代码:
voidCFixedMap:
:
Input()
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];
//use数组用来储存提示信息。
file〉〉use1;
file>
〉mVexNum;
//端点个数
>
use2;
mEdgNum;
//边数
use3;
for(inti=0;
i〈mVexNum;
i++)//输入所有点的信息
file〉〉mVexs[i]。
num>
〉mVexs[i].x〉〉mVexs[i].y;
}
file〉>
use4;
for(i=0;
i<
i++)//输入连通点编号
{
file〉>
comb[i].num1〉>
comb[i]。
num2;
file。
close();
}
2Dijkstra算法程序设计
Dijkstra算法主要就是查找和更新,开始时想过用指针来做,后来由于跟地图的输入结合要用到input函数里的变量,于是就采用了用数组来储存距离和路径。
在Diikstra算法中首先是初始化源点数组,然后就是查找其他到源点距离最近的点,然后就是将该点并入源点集,再就是更新,以上次并入的点为起点开始查找,直到遍历所有点。
刷新每次查找后的最短距离并保存。
代码如下:
voidDijstra()
cout〈<
输入起点:
;
cin〉>
v0;
v0——;
ints[MAX];
intv;
inti;
intj;
intw;
doublemin;
for(v=0;
v〈mVexNum;
v++)//初始化S,dist,path
{
s[v]=0;
//0表示未求出最短路径
dist[v]=mMatrix[v0][v];
//开始时假定为最短路径
if(dist[v]〈maxD&
&v!
=v0)
path[v]=v0;
//直达情况
elsepath[v]=—1;
//无直达路径
}
dist[v0]=0;
//初始时v0属于s集,v0到v0路径最短
s[v0]=1;
for(i=1;
mVexNum;
i++)//假设由一个中转点到达会近些,验证.再假设由两个中转点到达会近些,验证。
穷举
min=maxD;
for(w=0;
w〈mVexNum;
w++)//找一个最近到的点,下标装入v
if(s[w]==0&
&
dist[w]〈min)//点w不属于s集且离v0更近
{
v=w;
//经点w中转
min=dist[w];
}
s[v]=1;
//将v并入S,由v0到达v点最短距离为min,假设由v0到v再由v到其余各点,更新当前最后一个点及距离
for(j=0;
j<
mVexNum;
j++)
if(s[j]==0&
&(min+mMatrix[v][j]<
dist[j]))//如果多经过一个点v到点j的距离更短,更新
{
dist[j]=min+mMatrix[v][j];
path[j]=v;
//点的序号
}
}
3动态显示部分
问题主要是集中在用easyx画图上,从直线到斜线到反向直线和任意一个线段,全部用循环和间歇控制,主要工作就是每隔一个间隔绘制一定的图像使得间隔连起来的一个整体是一个顺畅的连贯的运行图。
说起来简单可实践起来哪怕是循环中画图和清空的顺序不对,显示的都会是一个完全不像样的运行线路,所以整个程序部分对逻辑的要求比较严格,每个细节都要重复重复地检查和试运行才能达到不出错的地步.寻找错误几乎成了整个程序设计的主要工作,不过也是在告诉我们,编好程序不一定要多么高级,而是少犯错.
程序代码过多,参见cpp文件。
四、程序运行结果展示
4.1地图文件
4.2运行窗口
4.3动态显示窗口
4.4.fops.txt路径输出
4。
5改变地图,改变AGV参数运行。
(1)。
地图文件
(2).运行窗口,动态显示,fops路径文件输出。
五、程序设计小结
5.1程序设计的缺陷和不足
(1)地图输入的方式虽然采用了文件流,但是实用价值仍然不高,负责输入的组员曾经考虑过使用图片载入,但查阅相关资料后因为难度较大而放弃。
(2)算法的革新未能实现,直接使用了比较简单和落后的Dijkstra算法,程序的处理能力并不强。
(3)多台AGV运行未能实现.后期优化的同时,尝试将1台AGV增加到两台,但是由于动态显示部分程序的特殊性未能完成.
(4)动态显示比较流畅,然而利用sleep方法完成的显示部分会将整个程序冻结,计时器没能使用,是一个遗憾。
(5)程序的界面不够友好,由于前期各项工作完成的进度不如人意,程序的MFC改编也未能完成.
5。
2设计中遇到的困难
主要是小组成员各个部分的衔接问题.大家各自完成后,程序的整合比想象中困难许多,浪费了大量的时间。
因为每个人使用变量的习惯不同,几个部分一开始完全分离,往往是一个小问题就要排查半天才能解决。
六、参考资料
1.《VisualC++程序设计》
Sunshine的博客《图的邻接矩阵存储的C语言实现》.
3豆丁网《最短路径的Dijkstra算法》。
4.easyx教程。
七、源程序及相关文件
见所传电子稿.
八、各小组成员个人报告
单独成份,见所传电子稿。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 作业 项目 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)