城市通信网络建设系统Word文档格式.docx
- 文档编号:16985676
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:36
- 大小:222.96KB
城市通信网络建设系统Word文档格式.docx
《城市通信网络建设系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《城市通信网络建设系统Word文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
2.3系统功能设计
系统建立了interface函数和choice函数,其功能如下:
(1)interface函数:
使用户更清晰看到程序的主体,使得程序界面更为直观。
程序如下:
voidinterface()//初始界面
{
printf("
____________________________________________\n"
);
…………最小生成树的应用…………\n"
…………通信网络建设问题………\n"
…………Made…By…董卓琴Version1.0\n"
_______________________________________________________\n"
\n"
___________________________________________________________\n"
;
___________1.输入通信网络基本信息并将信息存储到文件中\n"
___________2.将网络基本信息显示到屏幕上\n"
___________3.用kruskal算法算出最短路径,并将结果存储
到文件中\n"
___________4.用prim算法算出最短路径,并将结果存储到文件中\n"
___________5.退出\n"
\t\t\t请输入您要选择的选项(1-5):
\n"
}
(2)choice函数:
为用户提供了方便,用户可以通过按数字键来选择相应的功能。
voidchoice()//控制选项函数
{
MGraphG=MGraph();
intc;
interface();
std:
:
cin>
>
c;
while(c)
switch(c)
{
case1:
system("
cls"
color1b"
printf("
\n\t\t*****************欢迎使用**********************"
\n__________________Welcom_to_Use"
\n********************************************_____________*************************************"
G=SaveGraph(G);
interface();
//system("
PAUSE"
std:
continue;
case2:
color1c"
\t\t\t下面显示的是通信网络的基本信息\n"
G=print(G);
\n\t\t\t按任意键返回\n"
c=getchar();
//c=getchar();
case3:
color1e"
prim(G,G.vexs[0]);
\t\t*******结果存入KruskalResult.dat中,按任意键返回***********\n"
case4:
color1d"
G=kruskal(G);
\t\t*******结果存入PrimResult.dat中,按任意键返回***********\n"
case5:
return;
}
}
3.模块设计
3.1模块设计
系统主要包含主程序模块和其它操作模块。
其调用关系如下图所示。
3.2系统子模块及其功能设计
本系统共设计了5个子模块,各程序的函数名及功能说明如下:
(1)CreateGraph(G);
//创建图模块
(2)SaveGraph(G);
//存储图模块
(3)Print(G);
//输出图模块
(4)Kruskal(G);
//kruskal算法求最小生成树模块
Kruskal算法的基本思想是:
1、若网络G的边数en1,则G即为所求的最小生成树,否则,一定有e>
n-1.
2、将网络的e条边按权值自小到大顺序排列。
3、将网络G中的边都去掉,只留下n个孤立顶点作为初始的最小生成树T,再按边的排放顺序逐个考察,若与当前E(T)中的边不构成圈,便将它加入到边集E(T),直至E(T)中边数满n-1为止。
(5)Prim(G);
//prim算法求最小生成树模块
Prim算法是另一种求最小生成树的方法,它的基本思想是按权值局部最小逐次将顶点和边加入到T中,直至V(T)满n个顶点为止。
Prim算法步骤为:
1、设最小生成树T的V(T)和E(T)均为空。
2、从顶点集V(G)中任取一顶点加到顶点集V(T)中。
3、在与V(T)中各顶点相关的所有边中,取一条权值最小的边(Vi,Vj),其中,Vi包含于V(T),Vj包含于V(T)。
4、(Vi,Vj)加入到E(T)中,将顶点Vj加入到V(T)中。
5、若V(T)已满n个顶点,则算法终止,否则转步骤(3)。
3.3系统模块之间的调用关系
系统的5个子模块之间的主要调用关系如下图所示:
4.详细设计
4.1数据结构设计
系统采用邻接矩阵存储信息,定义如下:
//图的数据结构
typedefstructMGraph//建立图
MGraph()
memset(vexs,0,MAX_VERTEX_NUM);
Vertexvexs[MAX_VERTEX_NUM];
//城市名称
intAdjMatrixarcs;
//网络条数
intvexnum;
//图的当前顶点数(城市总数)
intarcnum;
//图的当前弧数(网络总数)
}MGraph;
//记录从顶点集U到V-U的代价最小的边的辅助数组定义
typedefstructTemp//辅助数组
Temp()
lowcost=0;
Vertexadjvex;
//当前点
intlowcost;
//权值
}closedge[MAX_VERTEX_NUM];
typedefstructCityNumber
CityNumber()
memset(cityNam,0,1024);
charcityNam[1024];
}CityNum;
CityNum*Hometown=newCityNum[20];
//若G中存在顶点u,则返回该顶点在图中位置;
否则返回-1。
#include<
stdio.h>
intLocateVex(MGraphG,Vertexu)
{
inti;
for(i=0;
i<
G.vexnum;
++i)
if(strcmp(u,G.vexs[i])==0)
returni;
return-1;
4.2系统主要模块设计
4.2.1CreateGraph函数
1)创建邻接矩阵以存储图的内容。
2)填充矩阵,即输入城市间网络的状况,以方便使用prim算法或kruskal算法求
出最经济的架设方法。
程序如下:
//采用数组(邻接矩阵)表示法,构造无向网G。
MGraphCreateGraph(MGraph&
G)
inti=0,j=0,k=0,w=0;
Vertexva,vb;
//路径的两个节点
\n\n\t\t*************建立城市间网络信息**********"
请输入城市的总数:
scanf("
%d"
&
G.vexnum);
请输入城市间的网络数:
G.arcnum);
请输入%d个城市的名称(<
%d个字符):
G.vexnum);
for(i=0;
i<
G.vexnum;
++i)//构造顶点向量
%s"
G.vexs[i]);
++i)//初始化邻接矩阵
for(j=0;
j<
++j)
G.arcs[i][j]=65535;
//65535为无穷大
printf("
请输入%d条网络的两个城市信息城市1和城市2
的距离(以空格作为间隔):
G.arcnum);
for(k=0;
k<
G.arcnum;
++k)
{
%s%s%d"
va,vb,&
w);
//输入城市1城市2名称及其距离
i=LocateVex(G,va);
//定位权值位置
j=LocateVex(G,vb);
G.arcs[i][j]=G.arcs[j][i]=w;
//对称
returnG;
4.2.2SaveGraph函数
1)为了避免每次都重复输入信息,用文件存储图的内容。
2)如果没有文件则建立文件,并把图的内容存储到文件中。
3)如果文件存在,则从文件中读取图的内容到内存,以便完成其他操作。
MGraphSaveGraph(MGraphG)//输入内容存储在smalltree.dat
inti,j;
FILE*fp;
fp=fopen("
smalltree.dat"
"
rt"
if(fp==NULL)
G=CreateGraph(G);
fp=fopen("
wt"
fprintf(fp,"
%d\n"
//存城市树
//存网络数
for(i=0;
++i)
fprintf(fp,"
%s\t\n"
//存城市名称
++i)//存储邻接矩阵
for(j=0;
++j)
if(G.vexs[i]==G.vexs[j])
{
G.arcs[i][j]=0;
///到它自己
fprintf(fp,"
%s_%s_%d\n"
G.vexs[i],G.vexs[j],G.arcs[i][j]);
}
else
rewind(fp);
std:
cout<
<
"
存储成功!
。
输入任意键返回."
std:
endl;
charc=getchar();
else//从文件中读取网的信息存到内存中
printf("
\t\t*******正在读取文件中....***********\n"
fscanf(fp,"
&
G.vexnum);
chartempBuffer[1024];
memset(tempBuffer,0,1024);
i<
fgets(tempBuffer,1023,fp);
strcpy(Hometown[i].cityNam,tempBuffer);
charCityA[1024];
intLenth=0;
memset(CityA,0,1024);
++i)
{
fscanf(fp,"
CityA);
intn=0;
chartempCityName[1024];
memset(tempCityName,0,1024);
while(CityA[n]!
='
_'
)
tempCityName[n]=CityA[n];
n++;
strcpy(G.vexs[i+G.vexnum],tempCityName);
n++;
intnum=0;
tempCityName[num]=CityA[n];
num++;
strcpy(G.vexs[i+G.vexnum+1],tempCityName);
intnumint=0;
\0'
tempCityName[numint]=CityA[n];
numint++;
intX=1;
Lenth=0;
for(n=numint-1;
n>
=0;
n--)
intintkeynum=0;
switch(tempCityName[n])
{
case'
0'
intkeynum=0;
break;
1'
intkeynum=1;
2'
intkeynum=2;
3'
intkeynum=3;
4'
intkeynum=4;
5'
intkeynum=5;
6'
intkeynum=6;
7'
intkeynum=7;
8'
intkeynum=8;
9'
intkeynum=9;
}
Lenth+=intkeynum*X;
X=X*10;
G.arcs[i][j]=Lenth;
}
\t\t*******读取成功...\t***********\n"
fclose(fp);
4.2.3print函数
Print函数完成输出功能,将内存中图的内容输出到屏幕上
MGraphprint(MGraphG)//将输入的网络基本信息打到屏幕上
城市总数:
%d\t"
G.vexnum);
网络条数:
G.arcnum);
城市名称:
\t\n"
i++)
//printf("
%s_"
Hometown[i].cityNam;
各个城市间的距离:
for(j=0;
%s__%s_距离:
%d公里\n"
G.vexs[i+G.vexnum],G.vexs[j+G.vexnum],G.arcs[i][j]);
charc=getchar();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 城市 通信 网络 建设 系统