校园导航小助手—课程设计

发布时间:2024-12-08 20:16

园艺课程会指导如何设计和规划小型花园 #生活技巧# #园艺绿化建议# #园艺课程#

东软校园导航小助手

功能描述

1. 设计校园平面图。其中具有代表性的地点至少含有 12 个,平面图中顶点表示校内代表性的地点,边上的权值表示两地点之间 的距离;

2. 为实现校园导航系统子功能的管理,设计主控菜单;

3. 为来访客人提供图中任意地点相关信息的查询;

4. 为来访客人提供图中任意两地点之间最短路线的查询、指点地 点到其他所有地点最短路线的查询。

具体功能

本程序包含 3 个模块:主程序模块、工作区模块和无向网操作模块。其调用关系如图所示。

主界面如下:

图 1 主界面 

1.存放景点代号、名称、简介等信息供用户查询,为来访客 人提供图中任意景点相关信息的查询,如图所示(说明:以下提供的仅是范例,含12个景点,并不代表是学院的真实地图)。 

图 2 查询各景点信息

 2.可以根据用户输入的起始景点编号,求出该景点到其他景点的最短路径线路及距离,如图所示。

 图3 查询指定景点到其他所有景点最短路径线路及距离

 3.为来访客人提供图中任意景点之间的最短路径查询,如图所示。

 图 4 任意景点之间的最短路径查询

 4.选择主界面的修改地图信息,出现子菜单,可以为校园平面图增加和删除景点或边,修改边上的权值等。如图所示。

 图 5 修改图的信息

子菜单功能就不展示了下面给出源码,自己去试试吧。编译器用的是Dev C++ 5.6.3,应该没有严重bug,可能有小bug,这个完成课程设计已经够了,就没有过多的调试。

代码

代码只给了部分注释,核心的东西基本都注释了,其他的太多了不想注释了,不懂的或者有建议的可以跟我说。

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define INFINITY 65535

#define Max 100

typedef int Vertex;

typedef int WeightType;

int Dist[Max][Max], Path[Max][Max];

typedef struct DataType

{

int num;

char name[100];

char information[1000];

}DataType;

typedef struct MGraph

{

DataType Data[13];

WeightType G[Max][Max];

int Nv, Ne;

}MGraph;

void Menu();

void Menu2();

void choose(MGraph* Map);

void choose2(MGraph* Map);

MGraph* CreateGraph();

MGraph* ShortFloyd(MGraph* Map);

void Data_Observe(MGraph* Map);

void ShortPath_Observe(MGraph* Map);

void Path_Observe(MGraph* Map);

void Data_Ob(MGraph* Map);

void New_CreateGraph(MGraph* Map);

void UpDate(MGraph* Map);

void Add_Node(MGraph* Map);

void Add_Edge(MGraph* Map);

void Delete_Node(MGraph* Map);

void Delete_Edge(MGraph* Map);

int main()

{

int i, j;

MGraph* Map = CreateGraph();

for (i = 1; i <= Map->Nv; i++)

for (j = 1; j <= Map->Nv; j++)

Dist[i][j] = INFINITY;

Map = ShortFloyd(Map);

choose(Map);

return 0;

}

void Menu()

{

printf("\n\n\n");

printf("--------------------------------------------------------------------------------------\t\n");

printf(" 欢迎使用校园导航小助手 \t\n");

printf(" \t\n");

printf(" 欢迎来到广东东软学院 ! \t\n");

printf(" \t\n");

printf(" 1.景点信息总览 2.最短路线查询 \t\n");

printf(" \t\n");

printf(" 3.路线信息查询 4.景点信息查询 \t\n");

printf(" \t\n");

printf(" 5.更改图信息 6.退出 \t\n");

printf(" \t\n");

printf("--------------------------------------------------------------------------------------\t\n");

printf("\n\n请选择你需要的功能,输入代号:\n");

}

void Menu2()

{

printf("\n\n\n");

printf("--------------------------------------------------------------------------------------\t\n");

printf(" \t\n");

printf(" 1.再次建图 2.更新信息 \t\n");

printf(" \t\n");

printf(" 3.增加景点 4.增加路径 \t\n");

printf(" \t\n");

printf(" 5.删除景点 6.删除路径 \t\n");

printf(" \t\n");

printf(" 7.退出 \t\n");

printf(" \t\n");

printf("--------------------------------------------------------------------------------------\t\n");

printf("\n\n请选择你需要的功能,输入代号:\n");

}

void choose(MGraph* Map)

{

int num;

while (1) {

a:Menu();

scanf("%d", &num);

system("pause");

system("cls");

switch (num)

{

case 1: Data_Observe(Map);

system("pause");

system("cls");

goto a;

case 2:ShortPath_Observe(Map);

system("pause");

system("cls");

goto a;

case 3:Path_Observe(Map);

system("pause");

system("cls");

goto a;

case 4:Data_Ob(Map);

system("pause");

system("cls");

goto a;

case 5:choose2(Map);

system("pause");

system("cls");

goto a;

case 6: exit(0);

default:

break;

}

}

}

void choose2(MGraph* Map)

{

int num;

while (1) {

a:Menu2();

scanf("%d", &num);

system("pause");

system("cls");

switch (num)

{

case 1: New_CreateGraph(Map);

system("pause");

system("cls");

goto a;

case 2:UpDate(Map);

system("pause");

system("cls");

goto a;

case 3:Add_Node(Map);

system("pause");

system("cls");

goto a;

case 4:Add_Edge(Map);

system("pause");

system("cls");

goto a;

case 5:Delete_Node(Map);

system("pause");

system("cls");

goto a;

case 6:Delete_Edge(Map);

system("pause");

system("cls");

goto a;

case 7: choose(Map);

default:

break;

}

}

}

MGraph* CreateGraph()

{

MGraph* Map;

int i, j, k;

Map = (MGraph*)malloc(sizeof(MGraph));

Map->Ne = 22;

Map->Nv = 13;

for (i = 1; i <= Map->Nv; i++)

Map->Data[i].num = i;

for (j = 1; j <= Map->Nv; j++)

for (k = 1; k <= Map->Nv; k++)

{

Map->G[j][k] = INFINITY;

}

Map->G[1][2] = Map->G[2][1] = 1200;

Map->G[1][6] = Map->G[6][1] = 350;

Map->G[2][3] = Map->G[3][2] = 20;

Map->G[2][4] = Map->G[4][2] = 600;

Map->G[2][11] = Map->G[11][2] = 15;

Map->G[2][12] = Map->G[12][2] = 200;

Map->G[3][9] = Map->G[9][3] = 450;

Map->G[3][10] = Map->G[10][3] = 500;

Map->G[4][6] = Map->G[6][4] = 30;

Map->G[4][11] = Map->G[11][4] = 250;

Map->G[4][12] = Map->G[12][4] = 370;

Map->G[5][6] = Map->G[6][5] = 150;

Map->G[5][8] = Map->G[8][5] = 200;

Map->G[6][12] = Map->G[12][6] = 380;

Map->G[7][8] = Map->G[8][7] = 100;

Map->G[7][9] = Map->G[9][7] = 100;

Map->G[7][10] = Map->G[10][7] = 30;

Map->G[7][12] = Map->G[12][7] = 50;

Map->G[8][10] = Map->G[10][8] = 60;

Map->G[8][12] = Map->G[12][8] = 20;

Map->G[9][10] = Map->G[10][9] = 50;

Map->G[10][12] = Map->G[12][10] = 40;

strcpy(Map->Data[1].name, "学校北门");

strcpy(Map->Data[2].name, "学院南正门");

strcpy(Map->Data[3].name, "国际教育学院");

strcpy(Map->Data[4].name, "行政楼");

strcpy(Map->Data[5].name, "体育场");

strcpy(Map->Data[6].name, "AB座教学楼");

strcpy(Map->Data[7].name, "EF座教学楼");

strcpy(Map->Data[8].name, "C座教学楼");

strcpy(Map->Data[9].name, "宿舍区");

strcpy(Map->Data[10].name, "学二食堂");

strcpy(Map->Data[11].name, "继续教育学院");

strcpy(Map->Data[12].name, "图书馆");

strcpy(Map->Data[1].information, "此门里华师最近");

strcpy(Map->Data[2].information, "学校大门、学校班车进出口");

strcpy(Map->Data[3].information, "学院国际化的窗口,楼高6层");

strcpy(Map->Data[4].information, "行政办公大楼、楼高6层");

strcpy(Map->Data[5].information, "室外标准篮球场");

strcpy(Map->Data[6].information, "最早的教学楼之一、学院最大系--计算机系在此!楼高4层");

strcpy(Map->Data[7].information, "计算机系集中上课的地方、翻转课堂区域、楼高4层");

strcpy(Map->Data[8].information, "实验室集中区、楼高4层");

strcpy(Map->Data[9].information, "新生宿舍、教师公寓、教授公寓、楼高5层");

strcpy(Map->Data[10].information, "干饭人冲!!!");

strcpy(Map->Data[11].information, "离公交站最近、出门就能坐公交");

strcpy(Map->Data[12].information, "建筑面积46000平米、楼高4层");

return Map;

}

MGraph* ShortFloyd(MGraph* Map)

{

int v, w, k;

for (v = 1; v < Map->Nv; v++) {

for (w = 1; w < Map->Nv; w++)

{

Dist[v][w] = Map->G[v][w];

Path[v][w] = w;

}

}

for (k = 1; k < Map->Nv; k++)

{

for (v = 1; v < Map->Nv; v++)

{

for (w = 1; w < Map->Nv; w++)

{

if ((Dist[v][k] != INFINITY || Dist[k][w] != INFINITY) && (Dist[v][w] > (Dist[v][k] + Dist[k][w])))

{

Dist[v][w] = Dist[v][k] + Dist[k][w];

Path[v][w] = Path[v][k];

}

}

}

}

return Map;

}

void Data_Observe(MGraph* Map)

{

int i;

printf("\n广东东软学院共有以下%d处景点:\n\n", Map->Nv - 1);

for (i = 1; i < Map->Nv; i++)

{

printf("%d.", Map->Data[i].num);

printf("%s: ", Map->Data[i].name);

printf("%s\n\n", Map->Data[i].information);

}

}

void ShortPath_Observe(MGraph* Map)

{

int start, pass, end;

printf("请输入当前景点编号和你想要去的景点编号(空格隔开):\n");

scanf("%d %d", &start, &end);

while (start < 1 || start>Map->Nv - 1 || end < 1 || end>Map->Nv - 1)

{

printf("\n输入错误,请重新输入:\n");

scanf("%d %d", &start, &end);

}

if (start == end)

{

printf("\n输入错误,你已经在此地,请重新输入:\n");

scanf("%d %d", &start, &end);

}

system("cls");

if (Dist[start][end] == INFINITY)

printf("不能到达\n");

if(Dist[start][end] != INFINITY){

printf("\n%s->%s的最小路径为:%d米\n", Map->Data[start].name, Map->Data[end].name, Dist[start][end]);

pass = Path[start][end];

printf("\n最短路径为: %s", Map->Data[start].name);

while (pass != end)

{

printf("-> %s", Map->Data[pass].name);

pass = Path[pass][end];

}

printf("-> %s\n", Map->Data[end].name);

}

}

void Path_Observe(MGraph* Map)

{

int i, j;

int num;

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

scanf("%d", &num);

while (num < 1 || num>Map->Nv - 1)

{

printf("\n输入错误,请重新输入:\n");

scanf("%d", &num);

}

system("cls");

printf("--------------------------------------------------------------------------------------\t\n");

for (i = 1; i < Map->Nv; i++) {

if (i != num) {

j = Path[num][i];

printf("\n沿途路径为: %s", Map->Data[num].name);

while (j != i)

{

printf("-> %s", Map->Data[j].name);

j = Path[j][i];

}

printf("-> %s\n", Map->Data[i].name);

if (Dist[num][i] == INFINITY)

printf("不能到达\n");

if (Dist[num][i] != INFINITY)

printf("%s到%s的最路线总长为: %d米\n", Map->Data[num].name, Map->Data[i].name, Dist[num][i]);

printf("--------------------------------------------------------------------------------------\t\n");

}

}

}

void Data_Ob(MGraph* Map)

{

int num;

printf("请输入一个景点的编号:");

scanf("%d", &num);

while (num < 1 || num>Map->Nv - 1)

{

printf("\n输入错误,请重新输入:\n");

scanf("%d", &num);

}

system("cls");

printf("--------------------------------------------------------------------------------------\t\n");

printf("%d.", Map->Data[num].num);

printf("%s: \n\n", Map->Data[num].name);

printf("(简略版)%s\n", Map->Data[num].information);

printf("--------------------------------------------------------------------------------------\t\n");

}

void New_CreateGraph(MGraph* Map)

{

int NV, NE;

int V1, V2, W;

int i, j, k;

for (j = 1; j <= Map->Nv; j++)

for (k = 1; k <= Map->Nv; k++)

{

Map->G[j][k] = INFINITY;

}

printf("\n输入新地图的景点个数以及路径条数:\n");

scanf("%d %d", &NV, &NE);

Map->Nv = NV + 1;

Map->Ne = NE;

printf("\n输入新地图的%d个景点名称以及相关信息: \n", Map->Nv - 1);

for (i = 1; i < Map->Nv; i++)

{

Map->Data[i].num = i;

scanf("%s", &Map->Data[i].name);

scanf("%s", &Map->Data[i].information);

}

system("pause");

system("cls");

printf("\n正在构建新地图的路径:\n");

printf("\n目前广东东软学院共有以下%d处景点:\n\n", Map->Nv - 1);

for (i = 1; i < Map->Nv; i++)

{

printf("%d.", Map->Data[i].num);

printf("%s: ", Map->Data[i].name);

printf("%s\n\n", Map->Data[i].information);

}

for (i = 0; i < Map->Ne; i++) {

printf("\n\n输入相连接的景点:");

scanf("%d %d", &V1, &V2);

while (V1 < 1 || V1>Map->Nv - 1 || V2 < 1 || V2>Map->Nv - 1)

{

printf("\n输入错误,请重新输入:");

scanf("%d %d", &V1, &V2);

}

if (V1 == V2)

{

printf("\n输入错误,请重新输入:");

scanf("%d %d", &V1, &V2);

}

printf("\n\n输入景点间距离:");

scanf("%d", &W);

Map->G[V1][V2] = Map->G[V2][V1] = W;

}

ShortFloyd(Map);

}

void UpDate(MGraph* Map)

{

int num;

int i;

printf("\n输入需要更改的景点编号:\n\n");

for (i = 1; i < Map->Nv; i++)

printf("%d.%s: %s\n\n", i, Map->Data[i].name, Map->Data[i].information);

scanf("%d", &num);

while (num < 1 || num>Map->Nv - 1)

{

printf("\n输入错误,请重新输入:");

scanf("%d", &num);

}

system("cls");

printf("将%s修改为:\n", Map->Data[num].name);

scanf("%s", &Map->Data[num].name);

printf("将%s修改为:\n", Map->Data[num].information);

scanf("%s", &Map->Data[num].information);

system("cls");

}

void Add_Node(MGraph* Map)

{

int num;

int i;

printf("已有景点如下\n");

for (i = 1; i < Map->Nv; i++)

printf("%d.%s: %s\n\n", i, Map->Data[i].name, Map->Data[i].information);

printf("请按照顺序添加新景点\n\n");

printf("\n请输入序号:");

scanf("%d", &num);

printf("\n请输入景点名称:");

scanf("%s", &Map->Data[num].name);

printf("\n请输入景点简介:");

scanf("%s", &Map->Data[num].information);

Map->Nv++;

printf("\n\n修改成功\n\n");

}

void Add_Edge(MGraph* Map)

{

int i;

int V1, V2, W;

printf("已有景点如下\n");

for (i = 1; i < Map->Nv; i++)

printf("%d.%s: %s\n\n", i, Map->Data[i].name, Map->Data[i].information);

printf("\n请输入需要添加路径的两个景点:");

scanf("%d %d", &V1, &V2);

while (V1 < 1 || V1>Map->Nv - 1 || V2 < 1 || V2>Map->Nv - 1)

{

printf("\n输入错误,请重新输入:");

scanf("%d %d", &V1, &V2);

}

if (V1 == V2)

{

printf("\n输入错误,请重新输入:");

scanf("%d %d", &V1, &V2);

}

printf("\n请输入景点相隔距离:");

scanf("%d", &W);

Map->G[V1][V2] = Map->G[V2][V1] = W;

Map->Ne++;

ShortFloyd(Map);

}

void Delete_Node(MGraph* Map)

{

int num;

int i, j;

printf("已有景点如下\n");

for (i = 1; i < Map->Nv; i++)

printf("%d.%s: %s\n\n", i, Map->Data[i].name, Map->Data[i].information);

printf("\n请输入需删除景点的序号:");

scanf("%d", &num);

while (num < 1 || num>Map->Nv - 1)

{

printf("\n输入错误,请重新输入:");

scanf("%d", &num);

}

for (i = num; i < Map->Nv; i++) {

strcpy(Map->Data[i].name, Map->Data[i + 1].name);

strcpy(Map->Data[i].information, Map->Data[i + 1].information);

}

Map->Nv--;

for (j = num; j < Map->Nv; j++) {

for (i = 1; i < Map->Nv; i++) {

Map->G[j][i] = Map->G[j + 1][i];

Map->G[i][j] = Map->G[i][j + 1];

}

}

for (i = 1; i < Map->Nv; i++) {

if (Map->G[num][i] != INFINITY || Map->G[i][num] != INFINITY);

Map->Ne--;

}

ShortFloyd(Map);

}

void Delete_Edge(MGraph* Map)

{

int num;

int V1, V2;

printf("请输入需删除路径的两个景点:");

scanf("%d %d", &V1, &V2);

if (Map->Nv - 1 == 1) {

printf("\n当前只有一个景点,无路径删除");

goto b;

}

while (V1 < 1 || V1>Map->Nv - 1 || V2 < 1 || V2>Map->Nv - 1)

{

printf("\n输入错误,请重新输入:");

scanf("%d %d", &V1, &V2);

}

if (V1 == V2)

{

printf("\n输入错误,请重新输入:");

scanf("%d %d", &V1, &V2);

}

Map->G[V1][V2] = Map->G[V2][V1] = INFINITY;

Map->Ne--;

b:ShortFloyd(Map);

}

 总结

大一生活马上要结束了,过得好快啊。其实当初填志愿的时候,专业都是随便填的,当时对计算机一无所知。抱着试一试的心态学习编程,发现编程确实有趣好玩,总比天天打游戏好玩。通过这个程序设计认识到底层代码一定要写好,不然一加一个功能就出bug,脑袋都给你挠爆。估计学校课设几年都不变的,希望马上要来东软的学弟能看到这代码。

网址:校园导航小助手—课程设计 https://www.yuejiaxmz.com/news/view/416996

相关内容

期末课程设计——校园二手交易小程序(含报告和演示)
node.js毕设校园生活服务助手平台的设计与实现(程序+论文)
小程序设计基本微信小程序的校园生活助手系统
解锁校园生活新方式:Android导航解密,解决校园出行难题!'
打扫校园劳动课教学教案 打扫校园教学设计(10篇)
园区导航小程序:3D地图与智能预约,助力园区智能化管理
小学语文校本课程建设的实践
二手课本,从校园来,回校园去
导航小助手
凯立德导航助手下载

随便看看