校园导航小助手—课程设计
园艺课程会指导如何设计和规划小型花园 #生活技巧# #园艺绿化建议# #园艺课程#
东软校园导航小助手
功能描述
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地图与智能预约,助力园区智能化管理
小学语文校本课程建设的实践
二手课本,从校园来,回校园去
导航小助手
凯立德导航助手下载