C++医院选址问题课程设计报告.docx
《C++医院选址问题课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++医院选址问题课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
C++医院选址问题课程设计报告
C++医院选址问题-课程设计报告
学号11710115
数据结构课程设计
设计说明书
医院选址问题
起止日期:
2013年12月23日至2013年12月27日
学生姓名路江飞班级11卓越七班成绩指导教师(签字)
计算机与信息工程学院
2013年12月27日
天津城建大学
课程设计任务书
2013—2014学年第1学期
计算机与信息工程学院11卓越专业11卓越7班级课程设计名称:
数据结构课程设计设计题目:
医院选址问题完成期限:
自2013年12月23日至2013年12月27日共1周设计依据、要求及主要内容(可另加附页):
一、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求
在本课程设计过程中要求学生:
(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;
(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者
皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程
设计成绩。
(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表。
(4)认真编写课程设计报告。
三、设计内容
1)问题描述
n个村庄之间的交通图可以用有向网图来表示,图中边上的权值表示从村庄i到村庄j的道路长ij
度。
现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近,
2)基本要求
(1)建立模型,设计存储结构;
(2)设计算法完成问题求解;
(3)分析算法的时间复杂度。
3)设计思想
医院选址问题实际是求有向图中心点的问题。
首先定义顶点的偏心度。
设图G=(V,E),对任一顶点k,称E(k)=max{d(i,k)}(i?
V)为顶点k的偏心度。
显然,偏心度最
小的顶点即为图G的中心点。
如图7(a)所示是一个带权有向图,其各顶点的偏心度如图(b)所示。
顶点偏心度c24a,123eabb6
c851dd5e7
(a)(b)
图7带权有向图及各顶点的偏心度
医院选址问题的算法用伪代码描述如下:
1(对加权有向图,调用Floyd算法,求每对顶点间最短路径长度的矩阵;
2(对最短路径长度矩阵的每列求大值,即得到各顶点的偏心度;
3(具有最小偏心度的顶点即为所求。
四、参考文献
1、王红梅,数据结构,清华大学出版社
2、王红梅,数据结构学习辅导与实验指导,清华大学出版社
3、严蔚敏、吴伟民,《数据结构C语言版》,清华大学出版社(配题集)
1、设计目的...................................................................12、总体设计...................................................................13、详细设计...................................................................1
3.1、程序具体功能:
........................................................1
3.2、调试分析:
............................................................44、源程序和运行结果...........................................................4
4.1、源程序................................................................4
4.2、运行结果..............................................................95、心得体会...................................................................96、参考文献..................................................................10
医院选址问题1、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
2、总体设计
医院选址问题
输入求最短路径求最小偏心度输出
3、详细设计
3.1、程序具体功能:
1(输入函数
从键盘输入村庄的个数、道路的个数、以及各个村庄之间的距离,采用邻接矩阵存储,带有
相应的异常处理。
核心代码:
voidinput()
{
boolflag=true;
while(flag)
{
1
cout<<"请输入村庄的个数:
";
if(cin>>country_number)//异常检测
break;
else
{
cout<<"输入有误~"<cin.sync();//清空流
cin.clear();//清除流错误标记
continue;
}
}
while(flag)
{
cout<<"请输入道路的条数:
";
if(cin>>road_number&&road_number>0&&road_number<=
country_number*(country_number-1))
break;
else
{
cout<<"输入有误~"<cin.sync();//清空流
cin.clear();//清除流错误标记
continue;
}
}
for(inti=1;i<=country_number;i++)
{
cout<<"请输入第"<
";
cin>>country_name[i];
}
}
2.求最短路径
对加权有向图,调用Floyd算法,求每对顶点间最短路径长度的矩阵。
核心代码:
voidMGraph:
:
Floyd()//Floyd算法
{
inti,j,k;
for(i=1;i<=vertexNum;i++)
for(j=1;j<=vertexNum;j++)
2
{
dist[i][j]=arc[i][j];
}
for(k=1;k<=vertexNum;k++)
for(i=1;i<=vertexNum;i++)
for(j=1;j<=vertexNum;j++)
if(dist[i][k]+dist[k][j]{
dist[i][j]=dist[i][k]+dist[k][j];
}
3.求最小偏心度
对最短路径长度矩阵的每列求大值,即得到各顶点的偏心度。
核心代码:
intMGraph:
:
min()//求最小偏心度
{
intresult[MaxSize];
for(intk=1;k<=vertexNum;k++)//初始化求每列的最大值的矩阵
result[k]=0;
intmin_result=9999;//最小偏心度
inttemp;//记录医院在几号村庄
for(inti=1;i<=vertexNum;i++)//最短路径长度矩阵的每列求大值
{
intt=0;
for(intj=1;j<=vertexNum;j++)
if(dist[j][i]>t)
t=dist[j][i];
result[i]=t;
}
4.输出
输出有向图的原始邻接矩阵、最后的邻接矩阵、各个村庄距离医院的距离以及最小偏心度。
核心代码:
cout<<"初始的邻接矩阵为:
"<for(i=1;i<=vertexNum;i++)
for(j=1;j<=vertexNum;j++)
{
cout<:
left);
cout<if(j==vertexNum)
cout<}
3
cout<<"最终的邻接矩阵为:
"<for(i=1;i<=vertexNum;i++)
for(j=1;j<=vertexNum;j++)
{
cout<:
left);
cout<if(j==vertexNum)
cout<}
cout<<"各村庄的偏心度如下所示:
"<for(intb=1;b<=vertexNum;b++)//输出各顶点的偏心度
cout<cout<<"医院应该建在"<3.2、调试分析:
1.输入调试
输入相应的数据,查看能不能输出相应的邻接矩阵,从键盘输入任意的数据,查询程序能否
正常运行。
2.最小路径调试
运行程序,查看能否将正确结果输出,测试三次以上。
3.最小偏心度调试
运行程序,查看能否将正确结果输出,测试三次以上。
4.输出调试
如果以上三步都调试成功,输出则调试成功。
4、源程序和运行结果
4.1、源程序
MGraph.h:
constintMaxSize=10;//图中最多顶点个数
template
classMGraph
{
public:
MGraph(DataTypea[],intn,inte);//构造函数建立具有n个顶点e条边的图
~MGraph(){}//析构函数为空
voidFloyd();//Floyd算法
4
intmin();//求最小偏心度
private:
DataTypevertex[MaxSize];//放图中顶点的数组
intarc[MaxSize][MaxSize];//存放图中边的数组
intdist[MaxSize][MaxSize];//存放中间结果的数组
intvertexNum;//图的顶点数
intarcNum;//图的边数
};
MGraph.cpp:
#include
#include
#include
#include"MGraph.h"
usingnamespacestd;
template//图的存储结构:
带权的邻接矩阵存储结构
MGraph:
:
MGraph(DataTypea[],intn,inte)//构造函数{
inti,j,w;
vertexNum=n;
arcNum=e;
for(i=1;i<=vertexNum;i++)//数组下标均从1开始
vertex[i]=a[i];
for(i=1;i<=vertexNum;i++)
for(j=1;j<=vertexNum;j++)
if(i==j)
arc[i][j]=0;
else
arc[i][j]=9999;//9999表示无穷大
for(intk=1;k<=arcNum;k++)
{
cout<<"请输入两个村庄的序号和它们之间的距离:
";
cin>>i;
cin>>j;
cin>>w;
arc[i][j]=w;
}
cout<<"初始的邻接矩阵为:
"<for(i=1;i<=vertexNum;i++)
for(j=1;j<=vertexNum;j++)
5
{
cout<:
left);
cout<if(j==vertexNum)
cout<}
}
template
voidMGraph:
:
Floyd()//Floyd算法
{
inti,j,k;
for(i=1;i<=vertexNum;i++)
for(j=1;j<=vertexNum;j++)
{
dist[i][j]=arc[i][j];
}
for(k=1;k<=vertexNum;k++)
for(i=1;i<=vertexNum;i++)
for(j=1;j<=vertexNum;j++)
if(dist[i][k]+dist[k][j]{
dist[i][j]=dist[i][k]+dist[k][j];
}
cout<<"最终的邻接矩阵为:
"<for(i=1;i<=vertexNum;i++)
for(j=1;j<=vertexNum;j++)
{
cout<:
left);
cout<if(j==vertexNum)
cout<}
}
template
intMGraph:
:
min()//求最小偏心度
{
intresult[MaxSize];
for(intk=1;k<=vertexNum;k++)//初始化求每列的最大值的矩阵
result[k]=0;
6
intmin_result=9999;//最小偏心度
inttemp;//记录医院在几号村庄
for(inti=1;i<=vertexNum;i++)//最短路径长度矩阵的每列求大值
{
intt=0;
for(intj=1;j<=vertexNum;j++)
if(dist[j][i]>t)
t=dist[j][i];
result[i]=t;
}
cout<<"各村庄的偏心度如下所示:
"<for(intb=1;b<=vertexNum;b++)//输出各顶点的偏心度
cout<cout<for(inta=1;a<=vertexNum;a++)//最小偏心度
if(result[a]{
min_result=result[a];
temp=a;
}
for(intc=1;c<=vertexNum;c++)
{
if(temp==c)
continue;
else
cout<"<}
returntemp;
}
Main.cpp:
#include
#include
#include"MGraph.cpp"usingnamespacestd;stringcountry_name[MaxSize];//村庄名字数组intcountry_number;//村庄个数
introad_number;//道路个数
voidinput()
7
{
boolflag=true;
while(flag)
{
cout<<"请输入村庄的个数:
";
if(cin>>country_number)//异常检测
break;
else
{
cout<<"输入有误~"<cin.sync();//清空流
cin.clear();//清除流错误标记
continue;
}
}
while(flag)
{
cout<<"请输入道路的条数:
";
if(cin>>road_number&&road_number>0&&road_number<=country_number*(country_number-1))
break;
else
{
cout<<"输入有误~"<cin.sync();//清空流
cin.clear();//清除流错误标记
continue;
}
}
for(inti=1;i<=country_number;i++)
{
cout<<"请输入第"<
";
cin>>country_name[i];
}
}
voidmain()
{
input();
MGraphMG(country_name,country_number,road_number);
MG.Floyd();
cout<<"医院应该建在"<8
}
4.2、运行结果
5、心得体会
编程是一件很枯燥的事情,但也是一件很有意义的事情,经过一个星期的设计学习,使我对C++
语言和数据结构有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更
好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,
通过学习也有所改进;再有对C++语言的一些标准库函数不太了解,还有对函数调用的正确使用不够
熟悉,还有对C++语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过这次的课程设计,我感觉自己写代码的水平还有待提高,要想精通一门编程语言,写大量的代码
9
是必不可少的。
以后我将更加努力学习专业知识,努力提高写代码的能力。
6、参考文献
1、王红梅,数据结构,清华大学出版社
2、王红梅,数据结构学习辅导与实验指导,清华大学出版社3、严蔚敏、吴伟民,《数据结构C语言版》,清华大学出版社(配题集)4、王晓东,计算机算法分析与设计(第三版)
10