校园导游系统

校园导游系统,第1张

#include <stdio.h>

#include <string.h>

#define MAX 20

int mincost(int V[], int D[], int n)

int main()

{

int C[MAX][MAX]

int D[MAX], V[MAX] = { 0 }/*数组V用来表示每次计算加入集合V的点,1为加入了,0为还没有加入*/

int n, i, j, k, w, sum

printf("请输入景点个数:")

scanf("%d", &n)

printf("\n请输入建立后的临接矩阵(用n*n矩阵表示), 输入100000表示无穷大:\n")

for(i = 1i <= ni++)

{

for(j = 1j <= nj++)

{

scanf("%d", &C[i][j])

}

}

V[1] = 1 /*1为源点*/

for(i = 1i <= ni++)

{

D[i] = C[1][i] /*D置初值*/

}

for(i = 1i <= ni++)

{

/*从集合S(即没有经过计算的点)中选出一个点w(即V中值为0),使D[w]值最小*/

w = mincost(V, D, n)

V[w] = 1

/*由于w的选定,S中的每个点(即V中值为0的点都要重新计算其到源点的最小值*/

for(k = 2k <= nk++)

{

if(V[k] == 0)

{

sum = D[w] + C[w][k]

if(sum <D[k])

{

D[k] = sum

}

}

}

}

for(i = 2i <= ni++)

{

printf("D[%d] = %d\n", i, D[i])

}

memset(V, 0, MAX * sizeof(int)) /*初始化*/

return 0

}

int mincost(int V[], int D[], int n)

{

int temp = 10000000, i, w = 2

for(i = 2i <= ni++)

{

if(V[i] == 0 &&D[i] <temp)

{

temp = D[i]

w = i

}

}

return w

}

#include <stdio.h>

#define Max 20

#define Init_Length 10000

void shortestdistance()

void print()

{

printf(" 欢迎您来到XX大学\n")

printf("1 主楼 \n")

printf("2 步行广场 \n")

printf("3 图书馆 \n")

printf("4 芙蓉湖 \n")

printf("5 嘉庚南区 \n")

printf("6 北区食堂 \n")

printf("7 中区食堂 \n")

printf("8 囊萤园区 \n")

printf("9 映雪园区 \n")

printf("10 芙蓉园区 \n")

printf("11 凌云园区 \n")

printf("12 博学园区 \n")

printf("13 *** 场 \n")

int a

printf("请输入景点编号:")

scanf("%d",&a)

getchar()

printf("\n")

while(a<1||a>13)

{

printf("ERROR ! 请输入数字 1 到 13:\n\n")

printf("进入最短路径查询:\n")

shortestdistance()

void shortestdistance()

int i,v,w,v0,j

int min

int top[14]={0}

int cost[14][14]

int path[14][14]

int final[14]={0}

int D[14]

for(i=0i<14i++)

for(j=0j<14j++)

cost[i][j]=Init_Length

cost[1][3]=cost[3][1]=10

cost[3][5]=cost[5][3]=40

cost[1][7]=cost[7][1]=10

scanf("%d",&v0)

while(v0>13||v0<1)

printf("ERROR!请重新输入编号从1到13的数\n")

for(i=1i<14i++)

for(j=1j<14j++)

path[i][j]=0

for(v=1v<14v++)

printf("请输入你要去的地方:\n")

scanf("%d",&w)

printf("\n")

while(w>13||w<1)

printf("ERROR!输入错误,请重新输入编号从1到13\n")

scanf("%d",&w)

printf("最短路径为:\n")

for(i=1path[w][i]!=0i++)

printf("-->%d",path[w][i])

printf("\n")

printf("最短路径的长度为: %d\n",D[w])

}

主要特点

C语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程序进行编写,十分有利于程序的调试,且c语言的处理和表现能力都非常的强大,依靠非常全面的运算符和多样的数据类型,可以轻易完成各种数据结构的构建,通过指针类型更可对内存直接寻址以及对硬件进行直接 *** 作,因此既能够用于开发系统程序,也可用于开发应用软件。

以上内容参考:百度百科-c语言

#define INFINITY 10000 /*无穷大*/

#define MAX_VERTEX_NUM 40

#define MAX 40

#include<stdlib.h>

#include<stdio.h>

#include<conio.h>

#include<string.h>

typedef struct ArCell

{

int adj //路径长度

}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]// 邻接矩阵存储

typedef struct //图中顶点表示主要景点,存放景点的编号、名称、简介等信息,

{

char name[30]//景点名

int num//景点编号

char introduction[100]//简介

}infotype//结点信息

typedef struct

{

infotype vexs[MAX_VERTEX_NUM]//数据域存储和边或弧相关的信息

AdjMatrix arcs//弧的二维数组

int vexnum,arcnum//图的当前顶点数和弧数

}MGraph

MGraph b

void cmd(void)

MGraph InitGraph(void)

void Menu(void)

void Browser(MGraph *G)

void ShortestPath_DIJ(MGraph * G)

void Floyd(MGraph *G)

void Search(MGraph *G)

int LocateVex(MGraph *G,char* v)

MGraph * CreatUDN(MGraph *G)

void print(MGraph *G)

int main(void)

{

cmd()

return 0

}

void cmd(void)

{

int i

b=InitGraph()

Menu()

scanf("%d",&i)

while(i!=5)

{

switch(i)

{

case 1:system("cls")Browser(&b)Menu()break

case 2:system("cls")ShortestPath_DIJ(&b)Menu()break

case 3:system("cls")Floyd(&b)Menu()break

case 4:system("cls")Search(&b)Menu()break

case 5:exit(1)break

default:break

}

scanf("%d",&i)

}

}

MGraph InitGraph(void)

{

MGraph G

int i,j

G.vexnum=10//十个结点

G.arcnum=14//14条弧

for(i=0i<G.vexnumi++)

G.vexs[i].num=i//景点编号

strcpy(G.vexs[0].name,"美食楼")

strcpy(G.vexs[0].introduction,"仅四层的小食堂")

strcpy(G.vexs[1].name,"第一教学楼")

strcpy(G.vexs[1].introduction,"上英语课的教学楼")

strcpy(G.vexs[2].name,"3号学生宿舍楼")

strcpy(G.vexs[2].introduction,"室内环境最好的寝室楼")

strcpy(G.vexs[3].name,"医院")

strcpy(G.vexs[3].introduction,"校医院,设施不是很齐全,只能看小病,药费很便宜")

strcpy(G.vexs[4].name,"图书馆")

strcpy(G.vexs[4].introduction,"藏书量大,5楼可以上网")

strcpy(G.vexs[5].name,"足球场")

strcpy(G.vexs[5].introduction,"现代化塑胶跑道,人造草坪,晨练")

strcpy(G.vexs[6].name,"林荫路")

strcpy(G.vexs[6].introduction,"绿树成荫,晨读英语好地点")

strcpy(G.vexs[7].name,"主教学楼")

strcpy(G.vexs[7].introduction,"集机电院林学院和土木院一体")

strcpy(G.vexs[8].name,"第二教学楼")

strcpy(G.vexs[8].introduction,"主要上课的教学楼,环境较差")

strcpy(G.vexs[9].name,"信息楼")

strcpy(G.vexs[9].introduction,"灰色小楼,Triz理论基地")

for(i=0i<G.vexnumi++)

for(j=0j<G.vexnumj++)

G.arcs[i][j].adj=INFINITY//初值赋值无穷大

G.arcs[0][1].adj=100//赋值每条弧

G.arcs[0][2].adj=200

G.arcs[0][6].adj=400

G.arcs[1][7].adj=300

G.arcs[2][3].adj=120

G.arcs[3][6].adj=220

G.arcs[3][4].adj=100

G.arcs[4][5].adj=300

G.arcs[4][9].adj=250

G.arcs[5][9].adj=350

G.arcs[6][7].adj=60

G.arcs[6][9].adj=200

G.arcs[7][8].adj=50

G.arcs[8][9].adj=20

for(i=0i<G.vexnumi++)

for(j=0j<G.vexnumj++)

G.arcs[j][i].adj=G.arcs[i][j].adj//完全有向图邻接矩阵对称

return G

}//InitGraph end

void Menu()

{

printf("\n 东北林业大学导游图\n")

printf(" 1.介绍东北林业大学主要景点 \n")

printf(" 2.主要景点浏览路线 \n")

printf(" 3.选择出发地和目的地 \n")

printf(" 4.选择你想了解的主要景点 \n")

printf(" 5.退出系统 \n")

printf("请您选择:")

}

void Browser(MGraph *G)

{

int v

printf(" 编号 景点名称 简介 \n")

for(v=0v<G->vexnumv++)//浏览所有景点信息

printf(" %-4d %-16s %-56s \n",G->vexs[v].num,G->vexs[v].name,G->vexs[v].introduction)

}

void ShortestPath_DIJ(MGraph * G)// 迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点

{

int v,w,i,min,t=0,x,flag=1,v0

int final[20], D[20], p[20][20]

while(flag)

{

printf("请输入一个起始景点编号:")

scanf("%d",&v0)

if(v0<0||v0>G->vexnum)

{

printf("景点编号不存在!请重新输入景点编号:")

scanf("%d",&v0)

}

if(v0>=0&&v0<G->vexnum)//

flag=0

}

for(v=0v<G->vexnumv++)//初始化

{

final[v]=0//所有顶点的最短路径还没确定

D[v]=G->arcs[v0][v].adj//初始时的最短路径是v0到v边的值

for(w=0w<G->vexnumw++)

p[v][w]=0

if(D[v]<INFINITY)//如果与源点有直接的弧则假定该弧即是当前最短路径

{

p[v][v0]=1p[v][v]=1

}

}

D[v0]=0final[v0]=1//初始化,v0顶点属于S集

for(i=1i<G->vexnumi++)//寻找下一个确定其最短路径的v

{

min=INFINITY //当前所知道的离v0最近的距离

for(w=0w<G->vexnumw++)//v应是在S中且到源点最短路径长度最小的顶点

if(!final[w])

if(D[w]<min){v=wmin=D[w]}//w顶点离v0更近

final[v]=1//w加入s集合

for(w=0w<G->vexnumw++)//出现了通过源点v的最短路径然后又到达w的最短路径

if(!final[w]&&(min+G->arcs[v][w].adj<D[w]))//更新

{

D[w]=min+G->arcs[v][w].adj//当前最短路径为v的最短路径长度加<v,w>的长度

for(x=0x<G->vexnumx++) //当前最短路径为v的最短路径长度加<v,w>

p[w][x]=p[v][x]

p[w][w]=1

}

}

for(v=0v<G->vexnumv++)

{

if(v0!=v) printf("%s",G->vexs[v0].name)

for(w=0w<G->vexnumw++)

{

if(p[v][w]&&w!=v0) printf("-->%s",G->vexs[w].name)

t++

}

if(t>G->vexnum-1&&v0!=v)printf(" 总路线长%dm\n\n",D[v])

}

}//ShortestPath_DIJ end

void Floyd(MGraph *G)//出发地和目的地的信息

{

int v,u,i,w,k,j,flag=1,p[10][10][10],D[10][10]

for(v=0v<G->vexnumv++)

for(w=0w<G->vexnumw++)

{

D[v][w]=G->arcs[v][w].adj

for(u=0u<G->vexnumu++)

p[v][w][u]=0

if(D[v][w]<INFINITY)

{

p[v][w][v]=1p[v][w][w]=1

}

}

for(u=0u<G->vexnumu++)

for(v=0v<G->vexnumv++)

for(w=0w<G->vexnumw++)

if(D[v][u]+D[u][w]<D[v][w])

{

D[v][w]=D[v][u]+D[u][w]

for(i=0i<G->vexnumi++)

p[v][w][i]=p[v][u][i]||p[u][w][i]

}

while(flag)

{

printf("请输入出发地和目的地的编号:")

scanf("%d%d",&k,&j)

if(k<0||k>G->vexnum||j<0||j>G->vexnum)

{

printf("景点编号不存在!请重新输入出发地和目的地的编号:")

scanf("%d%d",&k,&j)

}

if(k>=0&&k<G->vexnum&&j>=0&&j<G->vexnum)

flag=0

}

printf("%s",G->vexs[k].name)

for(u=0u<G->vexnumu++)

if(p[k][j][u]&&k!=u&&j!=u)

printf("-->%s",G->vexs[u].name)

printf("-->%s",G->vexs[j].name)

printf(" 总路线长%dm\n",D[k][j])

}//Floyd end

void Search(MGraph *G)

{

int k,flag=1

while(flag)

{

printf("请输入要查询的景点编号:")

scanf("%d",&k)

if(k<0||k>G->vexnum)

{

printf("景点编号不存在!请重新输入景点编号:")

scanf("%d",&k)

}

if(k>=0&&k<G->vexnum)

flag=0

}

printf(" 编号 景点名称 简介 \n")

printf(" %-4d %-16s %-56s \n",G->vexs[k].num,G->vexs[k].name,G->vexs[k].introduction)

}//Search end

int LocateVex(MGraph *G,char* v)

{

int c=-1,i

for(i=0i<G->vexnumi++)

if(strcmp(v,G->vexs[i].name)==0)

{c=ibreak}

return c

}

MGraph * CreatUDN(MGraph *G)//初始化图形,接受用户输入

{

int i,j,k,w

char v1[20],v2[20]

printf("请输入图的顶点数,弧数:")

scanf("%d%d",&G->vexnum,&G->arcnum)

printf("请输入景点的编号:、名称、简介:\n")

for(i=0i<G->vexnumi++)

{

printf("景点编号:")

scanf("%d",&G->vexs->num)

printf("景点名称:")

scanf("%s",G->vexs[i].name)

printf("景点简介:")

scanf("%s",G->vexs->introduction)

}

for(i=0i<G->vexnumi++)

for(j=0j<G->vexnumj++)

G->arcs[i][j].adj=INFINITY

printf("请输入路径长度:\n")

for(k=0k<G->arcnumk++)

{

printf("第%d条边:\n",k+1)

printf("景点对(x,y):")

scanf("%s",v1)

scanf("%s",v2)

printf("路径长度:")

scanf("%d",&w)

i=LocateVex(G,v1)

j=LocateVex(G,v2)

if(i>=0&&j>=0)

{

G->arcs[i][j].adj=w

G->arcs[j][i]=G->arcs[i][j]

}

}

return G

}

void print(MGraph *G)

{

int v,w,t=0

for(v=0v<G->vexnumv++)

for(w=0w<G->vexnumw++)

{if(G->arcs[v][w].adj==INFINITY)

printf("∞ ")

else printf("%-7d",G->arcs[v][w].adj)

t++

if(t%G->vexnum==0)

printf("\n")

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12126730.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存