一、实训目的
通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握C++较复杂程序的组织和设计过程,调试技巧。学习解决实际问题的能力。
二、实训环境
计算机windows xp或其它版本,VC6.0或更高版本,或其它语言环境。
三、实习题目
题目0.GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。
1、平面图
2、实现代码
#include <iostream>
#include <string>
using namespace std;
const Num = 8; //8个场所
const Max = 10000; //初始化边,请将不到达边初始值为最大值,这里使用10000
class MGraph
{
public:
MGraph(string a[], int e, int b[][Num]);
void Floyd();
void print();
private:
string vertex[Num];
int arc[Num][Num];
int vertexNum, arcNum;
int dist[Num][Num];
string path[Num][Num];
};
MGraph:: MGraph(string a[], int e, int b[][Num])
{
int i,j;
vertexNum = Num;
arcNum = e;
for(i = 0; i < vertexNum; i++)
vertex[i] = a[i];
for(i = 0; i < vertexNum; i++)
for(j = 0; j < vertexNum; j++)
arc[i][j] = b[i][j];
}
void MGraph::Floyd()
{
int i,j,k;
for(i = 0; i < vertexNum; i++) //初始化dist和path
for(j = 0; j < vertexNum; j++)
{
dist[i][j] = arc[i][j];
if(dist[i][j] != 10000)
path[i][j] = vertex[i] + "-->" + vertex[j];
else path[i][j] ="此为你想找的地方";
}
for(k = 0; k < vertexNum; k++) //判定顶点i j之间是否经过k
for(i = 0; i < vertexNum; i++)
for(j = 0; j < vertexNum; j++)
{
if(i == j) continue;
if(dist[i][k] + dist[k][j] < dist[i][j])
{
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = path[i][k] + ",然后," + path[k][j];
}
}
}
void MGraph::print() //结点m到n的最短路径
{
int a,b,i;
char ch;
bool N = 1;
while(N)
{
cout << "你想找哪两个地方的最短路径?请输入这两个地方的名称" << endl;
string ch1, ch2, ch11, ch22;
cin >> ch11 >> ch22; //请输入你的起点和终点。
bool P1 = 1, P2 = 1;
while(P1 == 1 || P2 == 1) //异常处理,预防至少有一个场所名称不存在情况
{
for(i = 0; i < Num; i++)
if(vertex[i] == ch22) { ch2 = ch22; P2 = 0; }
for(i = 0; i < Num; i++)
if(vertex[i] == ch11) { ch1 = ch11; P1 = 0; }
if(P1 == 1 || P2 == 1)
{
cout << "输入有误!至少有一个地方的名称是不存在的,请重新输入两个地方的名称" << endl;
cin >> ch11 >> ch22;
P1 = P2 = 1;
}
}
for(i = 0; i < vertexNum; i++)
if(vertex[i] == ch1) a=i;
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch2) b=i;
cout << ch1 << "到" << ch2 << "的最短路径为:\n"
<< path[a][b] << "\n长度为" << dist[a][b] << endl;
N = 0;
cout << "是否想继续了解?(Y或y为继续,N或n为停止)" << endl;
cin >> ch;
while(ch != 'Y' && ch != 'y' && ch != 'N' && ch != 'n')
{
cout << "请重新输入!" << endl;
cin >> ch;
}
if(ch == 'Y' || ch == 'y')
N = 1;
}
}
int main()
{
int a[Num][Num] =
{
{ Max, 100, Max, Max, Max,1000, Max, Max, },
{ 100, Max, 70 , 60 , 200, Max, Max, Max, },
{ Max, 170, Max, 50 , Max, Max, Max, Max, },
{ Max, 60 , Max, Max, Max, Max, Max, Max, },
{ Max, 250, Max, 400, Max, 300, Max, 600, },
{ Max, Max, Max, Max, 298, Max, 20, 300, },
{ Max, Max, Max, Max, Max, 30, Max, Max, },
{ Max, Max, Max, 700, 670, 302, Max, Max, },
};
string ch[] = {"校门口","主楼","体育馆","图书馆","钟海楼","第三饭堂","西湖","医院"};
MGraph m(ch, 20, a);
m.Floyd();
m.print();
return 0;
}
四、心得
接触数据结构一个学期,虽然仅有一个学期,但是让我学到的比之前的更多,至少能有做到了解,知道了为什么和怎么做。尽管很多东西对于我还不是十分会用,但是这只是时间的问题,只要肯花时间去敲代码,去请问同学朋友老师,问题总会有解决的一天。这门课程的结束,也是另一个角度的开始,有遇到什么不懂的,我还是会幼稚的问下去,因为我不怕死!