c++学生成绩管理系统.docx
《c++学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《c++学生成绩管理系统.docx(14页珍藏版)》请在冰豆网上搜索。
c++学生成绩管理系统
学号09710107
数据结构课程设计
设计说明书
医院选址问题
起止日期:
2012年1月2日至2012年1月6日
学生姓名
杨军刚
班级
09计算机1班
成绩
指导教师(签字)
电子与信息工程系
2012年1月6日
天津城市建设学院
课程设计任务书
2011—2012学年第1学期
电子与信息工程系计算机科学与技术专业09级1班级
课程设计名称:
数据结构课程设计
设计题目:
医院选址问题
完成期限:
自2012年1月2日至2012年1月6日共1周
设计依据、要求及主要内容(可另加附页):
一、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求
(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;
(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;
(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;
(4)认真编写课程设计报告。
三、设计内容
医院选址问题
1)问题描述
n个村庄之间的交通图可以用有向网图来表示,图中边上的权值表示从村庄i到村庄j的道路长度。
现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近?
2)基本要求
(1)建立模型,设计存储结构;
(2)设计算法完成问题求解;
(3)分析算法的时间复杂度。
3)设计思想
医院选址问题实际是求有向图中心点的问题。
首先定义顶点的偏心度。
设图G=(V,E),对任一顶点k,称E(k)=max{d(i,k)}(i∈V)为顶点k的偏心度。
显然,偏心度最小的顶点即为图G的中心点。
如图7(a)所示是一个带权有向图,其各顶点的偏心度如图(b)所示。
医院选址问题的算法用伪代码描述如下:
1.对加权有向图,调用Floyd算法,求每对顶点间最短路径长度的矩阵;
2.对最短路径长度矩阵的每列求大值,即得到各顶点的偏心度;
3.具有最小偏心度的顶点即为所求。
目录
一、需求分析4
二、问题求解5
三、总体设计5
四、详细设计6
1.输入函数
2.建立邻接矩阵图6
3.求最短路径7
4.输出函数7
五、调试与测试7
六.关键源程序清单和执行结果8
七、参考文献12
一、需求分析
输入村庄的个数、名称,输入村庄间路的个数以及每条路的长度(权值);
程序根据权值以及路来求解得出医院的地址。
医院的地址要求:
每个村庄到医院的路径最长的值要最小。
二、问题求解
在现实中我会以其中为终点以同样的速度在每个村庄走到终点的时间记录下最长的时间为该点为终点时的一个值。
难后比较那个点为终点时所用的时间值是最小的。
abcde
a1357
b246
c324
d137
e685
三、总体设计
四、详细设计
.输入函数:
template
classGraph
{
public:
virtualvoidInsert(intu,intv,T&w)=0;
virtualvoidRemove(intu,intv)=0;
virtualboolExist(intu,intv)=0;
protected:
intn,e;
};
2.建立邻接矩阵图
template
classMGraph:
publicGraph//邻接矩阵存储图
{
public:
MGraph();
~MGraph();
voidBuild_Graph();
voidInsert(intu,intv,T&w);
voidRemove(intu,intv);
boolExist(intu,intv);
voidFloyd(T**&d,int**&path);
intnum;
protected:
T**a;
TnoEdge;
};
3.求最短路径
template
voidMGraph:
:
Floyd(T**&d,int**&path)//所有顶点之间的最短路径
{
inti,j,k;
d=newT*[n];path=newint*[n];
for(i=0;id[i]=newT[n];path[i]=newint[n];
for(j=0;jd[i][j]=a[i][j];
if(i!
=j&&a[i][j]elsepath[i][j]=-1;
}
}
for(k=0;kfor(i=0;ifor(j=0;jif(d[i][k]+d[k][j]d[i][j]=d[i][k]+d[k][j];
path[i][j]=path[k][j];
}
4.输出函数:
for(i=0;i!
=n;i++)//输出矩阵
{
cout<
sum[i]=0;
for(j=0;j!
=n;j++)
{
sum[i]+=d[i][j];
cout<}
cout<五、调试与测试
在测试中权值的初始化以及最短路径的计算时出现赋值出错等问题。
用if(u<0||v<0||u>n-1||v>n-1||u==v||a[u][v]==noEdge)returnfalse;来解决此问题!
六.关键源程序清单和执行结果
#include
usingnamespacestd;
intINFTY=9999;
template
classGraph
{
public:
virtualvoidInsert(intu,intv,T&w)=0;
virtualvoidRemove(intu,intv)=0;
virtualboolExist(intu,intv)=0;
protected:
intn,e;
};
template
classMGraph:
publicGraph//邻接矩阵存储图
{
public:
MGraph();
~MGraph();
voidBuild_Graph();
voidInsert(intu,intv,T&w);
voidRemove(intu,intv);
boolExist(intu,intv);
voidFloyd(T**&d,int**&path);
intnum;
protected:
T**a;
TnoEdge;
};
template
voidMGraph:
:
Build_Graph()//建图
{
cout<<"请输入顶点的个数:
"<intC_num;
cin>>C_num;
num=n=C_num;e=0;noEdge=INFTY;
a=newT*[n];
for(intk=0;ka[k]=newT[n];
for(intj=0;ja[k][k]=0;
}
cout<<"建立村庄编号为1--"<for(inti=0;i!
=C_num;i++)
for(intj=i+1;j!
=C_num;j++)
{
intw;
cout<<"请输入村庄"<
";
cin>>w;
Insert(i,j,w);//向图中添加权值为W的边
}
cout<<"*********************************************************************"<cout<<"已建立村庄编号为1--"<"<cout<<"**********************************"<cout<<"\t\t";
for(intb=1;b<=C_num;b++){
cout<
}
cout<}
template
MGraph:
:
MGraph()
{
Build_Graph();
}
template
MGraph:
:
~MGraph()
{
for(inti=0;idelete[]a;
}
template
boolMGraph:
:
Exist(intu,intv)
{
if(u<0||v<0||u>n-1||v>n-1||u==v||a[u][v]==noEdge)returnfalse;
returntrue;
}
template
voidMGraph:
:
Insert(intu,intv,T&w)
{
a[u][v]=w;a[v][u]=w;e++;
}
template
voidMGraph:
:
Remove(intu,intv)
{
a[u][v]=noEdge;e--;
}
template
voidMGraph:
:
Floyd(T**&d,int**&path)//所有顶点之间的最短路径
{
inti,j,k;
d=newT*[n];path=newint*[n];
for(i=0;id[i]=newT[n];path[i]=newint[n];
for(j=0;jd[i][j]=a[i][j];
if(i!
=j&&a[i][j]elsepath[i][j]=-1;
}
}
for(k=0;kfor(i=0;ifor(j=0;jif(d[i][k]+d[k][j]d[i][j]=d[i][k]+d[k][j];
path[i][j]=path[k][j];
}
}
intmain()
{
MGraphHospital;
int**d,**path;
inti,j,n;
n=Hospital.num;
Hospital.Floyd(d,path);
int*sum=newint[n];
cout<for(i=0;i!
=n;i++)//输出矩阵
{
cout<
sum[i]=0;
for(j=0;j!
=n;j++)
{
sum[i]+=d[i][j];
cout<}
cout<}
cout<<"*********************************************************************"<intmin=0;
for(i=0;i!
=n;i++)
{
cout<
"<if(sum[min]>sum[i])//判断最短路径
min=i;
}
cout<<"医院应在编号为"<}
测试所用数据:
u=4w={5,4,6,3,7,2}
七、参考文献
1.王红梅.数据结构.清华大学出版社
2.王红梅.数据结构学习辅导与实验指导.清华大学出版社
3.严蔚敏,吴伟民.数据结构(C语言版).