学校超市选址设计说明书.docx
- 文档编号:30507000
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:12
- 大小:90.59KB
学校超市选址设计说明书.docx
《学校超市选址设计说明书.docx》由会员分享,可在线阅读,更多相关《学校超市选址设计说明书.docx(12页珍藏版)》请在冰豆网上搜索。
学校超市选址设计说明书
中北大学
数据结构
课程设计说明书
学生姓名:
李志鹏
学号:
1021011520
学院:
软件学院
专业:
软件工程
题目:
学校超市选址问题
指导教师
何志英
2011年12月20日
1.设计任务概述(包括系统总体框图及功能描述)
1.1设计内容:
题目为带权有向图的中心点问题,将某一学校超市作为中心点;对于某一学校超市,其他各单位到其的距离不同,同时各单位人员去超市的频度也不同。
为超市选址,要求实现总体最优。
1.2设计要求:
(1)符合课题要求,实现相应功能;
(2)要求界面友好美观,操作方便易行;
(3)注意程序的实用性、安全性;
1.3功能描述:
根据给出的各单位之间距离及其要去超市的频率来选择超市的位置,实现总体最优。
1.4系统流程图
2.本设计所采用的数据结构(如:
链表、栈、树、图等)
数据模型(逻辑结构):
带权有向图
3.功能模块详细设计
3.1详细设计思想
a.确定核心算法:
确定了数据结构类型为带权有向图后,要进一步确定解决问题的算法。
因为是要得到最优的位置,即确定一个最优的定点,使之到其他单位的距离整体达到最优,算法中实现距离的和最短。
因此联系到数据与算法课程学到的弗洛伊德算法。
通过弗洛伊德算法得到任意两个节点间的最短路径,也就是任意连个单位之间的最短路径。
因此确定弗洛伊德算法为程序的核心算法。
b.功能模块顺序
(1)确定了图作为数据结构后,首先要将实际问题转化为图的形式。
即将单位名称,路径等已知数据信息得到的有向图的邻接矩阵存储在数组结构中。
(2)下个功能模块既是利用弗洛伊的算法得到两个节点之间的最短路径。
(3)利用核心算法-弗洛伊德算法得到任意两个节点之间的最短路径后,下个模块的功能是确定目标节点。
假设有n个单位,即有n个节点,则得到一个n*n的表格,表示任意两个节点之间的路径问题,那么到其他节点距离和最短的节点即目标节点,也就是值和最小的那一行对应的节点即目标节点。
(4)最后一个模块是主函数模块,在主函数模块中直接调用创建有向图图的函数,输入各单位信息,以及调用floyed函数得到两个节点间的最短路径,并得到最优节点。
3.2核心代码
#include
#include
#include
#include
#include"malloc.h"
#defineTURE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-1
#defineINF32767
constintMAXVEX=100;
typedefcharVextype;
typedefcharVextype;
typedefstruct
{
Vextypevexs[MAXVEX][MAXVEX];
intadj[MAXVEX][MAXVEX];
intdis[MAXVEX][MAXVEX];
intf[MAXVEX];
intn;
inte;
}Mgraph;
voidCreatMgraph(Mgraph*G)
{
inti,j,k;
printf("请输入单位个数:
\n");
scanf("%d",&(G->n));
printf("请输入单位间的路径数:
\n");
scanf("%d",&(G->e));
printf("请输入单位名称:
\n");
for(i=0;i
{
printf("请输入第%d个单位名称:
\n",i);
scanf("%s",&G->vexs[i]);
}
for(i=0;i
for(j=0;j
{
G->adj[i][j]=0;
G->dis[i][j]=0;
G->f[i]=0;
}
for(k=0;k
{
printf("请输入相通的两单位(输入格式:
i,j):
\n");
scanf("%d,%d",&i,&j);//在距离上体现为无向;
printf("请输入相通两个单位间的距离(格式:
dis):
\n");
scanf("%d",&(G->dis[i][j]));
G->adj[i][j]=1;
G->adj[j][i]=1;
G->dis[j][i]=G->dis[i][j];
}
for(k=0;k
{
printf("请输入第%d个单位去超市的相对频率:
\n",k);
scanf("%d",&(G->f[k]));
}
for(i=0;i
{
G->dis[i][j]*=G->f[i];if(G->adj[i][j]==0&&i!
=j)
G->dis[i][j]=INF;
}
}
voidFloyed(Mgraph*G){
intA[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX];
inti,j,k,pre;
intcount[MAXVEX];
for(i=0;i
A[i][j]=G->dis[i][j];
path[i][j]=-1;
count[i]=0;
}
for(k=0;k
{
for(i=0;i
for(j=0;j
if(A[i][j]>(A[i][k]+A[k][j])){
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
printf("\nFloyed算法求解如下:
\n");
for(i=0;i
for(j=0;j
{
if(i!
=j)
{
printf("\n");
printf("%d->%d;",i,j);
if(A[i][j]==INF)
{
if(i!
=j)
printf("不存在路径\n");
}
else
{
printf("路径长度为:
%d",A[i][j]);
printf("路径为:
%d*",i);
pre=path[i][j];
while(pre!
=-1)
{
printf("%d\n",pre);
pre=path[pre][j];
}
printf("%d",j);
}
}
}
for(i=0;i
for(j=0;j
{
if(A[i][j]==INF)
count[i]=0;
else
count[i]=1;
}
for(i=0;i
if(count[i])
{
for(j=0;j
if(i!
=j)A[i][i]+=A[j][i];
}
k=0;
for(i=0;i
{
if(count[i])
if(A[k][k]>A[i][i])
k=i;
}
printf("超市的最佳地址为:
");
printf("%s\n",G->vexs[k]);
}
voidmain()
{
Mgraph*Gh=NULL;
Gh=(Mgraph*)malloc(sizeof(Mgraph));
CreatMgraph(Gh);
Floyed(Gh);
system("pause");
}
……………………………
3.3程序运行结果(拷屏)
例:
第0个单位—第1个单位距离4
第1个单位—第3个单位距离3
第0个单位—第2个单位距离2
第1个单位—第2个单位距离2
第0个单位去超市的频率为2
第1个单位去超市的频率为3
第2个单位去超市的频率为1
第3个单位去超市的频率为4
经过计算,
如果超市建在0单位处,则总权值为43;
如果超市建在1单位处,则总权值为22;
如果超市建在2单位处,则总权值为32;
如果超市建在3单位处,则总权值为28。
所以超市应建在1单位处。
下面用程序进行检验:
初始界面:
输入数据:
运算过程及及结果:
4.课程设计心得、存在问题及解决方法
4.1存在的问题及解决方法:
由于对c语言知识的遗忘或者理解缺陷,导致出现一些常识性问题;对问题整体的把握不是很好,对算法的理解不能与实际问题对应起来。
因此也借鉴了一些资料和向懂得同学请教。
还有就是由于练习不够调试程序中出现很多问题,解决问题的能力还有限。
4.2设计心得:
通过一学期的学习,我知道数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。
之前我们我们已经学习了C程序设计、离散数学等,以后还要学操作系统、编译原理、数据库原理、软件工程等。
通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力,而且该课程的研究方法对我们学生在校和离校后的学习和工作,也有着重要的意义。
学以致用,这才是我的目标,课程设计给了我这个机会。
数据结构是计算机科学与技术专业的一门核心专业基础课程,在我们专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。
学习数据结构的最终目的是为了获得求解问题的能力。
对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。
通过数据结构课程实践,加上老师的全力指导,无论是理论知识,还是实践动手能力,我都有了不同程度上的提高。
…………………………
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学校 超市 选址 设计 说明书