1、 《校园导航系统》 课程设计报告 姓 名: 郭璇 学 号: 班 级: 10网络 专 业: 网络工程 指导教师: 唐轶媛 蒋荣萍 时 间:2023/6/25-2023/7/6 信息科学与工程学院 目 录 摘要……………………………………………………………….……………….1 1. 题目…………………………………………………………….……………….1 2. 概要设计……………………………………………………………………….1 3. 调
2、试分析……………………………………………………………………….15 4. 参考文献……………………………………………………………………….15 1. 题目 校园导航系统 设计一个校园导游程序,后台操作: 1、操作员信息管理如修改密码等 2、能根据学校的规模进行添加景点信息、修改景点信息等功能, 3、若临时有交通管制,能进行交通管制的设立和撤消(如某某时间段那条路进行那个方向的交通管制等) 前台为来访的客人提供各种信息查询服务: 1、设计学校的校园平面图,所含景点不少于10个。以图中顶点表达校内各景点,存放景点名称、代号、简介等信息;以边表达途径,存放途径长度等相关
3、信息。 2、为来访客人提供图中任意景点相关信息的查询。 3、提供途中任意景点问路查询,即求任意两个景点间的一条最短的简朴途径。 1.1 需求分析 设计一个校园导航系统,导航系统又分为游客和管理员。要进行管理操作还是游客操作由用户自己选择 管理员的操作:修改景点信息、增长景点信息、交通管制等。 游客的操作:查看景点信息和查最短途径。 2. 概要设计 景点的信息由一维数组存放,景点关系由二维数据来存放 景点的信息和关系从文献读取,进而初始化 typedef struct //保存单个景点信息的结构体 { char code
4、[10]; //存放景点代码 char name[20]; //存放景点名称 char instruction[100]; //存放景点简介 }ViewPoint; typedef struct //存放景点关系的二维数组 { int edges[MAXV][MAXV]; //两景点间的距离 int number; //景点的数量 ViewPoint V[MAXV]; //保存景点信息的结构体数组 }MGr
5、aph; 2.1 流程图 函数开始 ↓ 接受功能的请求 ↓ 接受信息输入 ↓ 判断是否对的 ↓ 读取文献 ↓ 进行相相应操作 ↓ 写回文献 ↓ 函数结束 2.2 具体设计 void MainMenu(); 主菜单,写界面操作的函数。 void UserMenu(); 游客菜单,判断是否非法输入,不会死循环。 void Map(); 输出民大地图,由于时间关系,没有画出。 void ViewAsk(); 游客查询景点函数,让游客选择要查询的景点,判断是否非法输入,不会死循环。 void PathAsk(); 问路函数,根据游客的起点和终
6、点给出最短途径,判断是否非法输入,不会死循环。 void Dijkstra(MGraph G,int v,int i); 迪杰斯特拉函数求最短途径 void Ppath(MGraph G,int path[],int i,int v); 输出最短途径中的景点 void Dispath(MGraph G,int dist[],int path[],int s[],int n,int v,int i); 查找最短途径。 void AdminMenu(); 管理员菜单,判断是否非法输入,不会死循环。 void Password(); 密码函数,管理员需输入密码才干进入后台,输入一次后无需再
7、输入。 void AdminAlter(); 修改密码,需要再次输入密码。 void ViewAdd(); 增长景点,列出已有景点,判断新景点信息是和与已有景点的冲突,如冲突需重新输入,判断是否非法输入,不会死循环。 void ViewAlter(); 修改景点信息,由于时间关系,没有判断新修改的景点信息是否与已有景点信息冲突。若要做次判断,应与增长景点的判断算法一致。 void ControlMenu(); 交通管制菜单,判断是否非法输入,不会死循环。 void PathControl(); 途径管理,可增长途径和修改途径,列出已有途径,根据用户的输入进行管理,判断是否非法输入,不
8、会死循环。但途径长度为整型,没有判断,若输入非整型,则进入死循环,一个大大的BUG,能力有限。 void PathDel(); 删除途径,列出已有途径,用户根据提醒进行删除。判断是否非法输入,不会死循环。 void Read(MGraph &G); 读取文献。 void White(MGraph &G); 保存文献。 2.3 操作界面 程序一开始登录主界面: 游客菜单: 管理员界面 管理员界面 管理员操作界面 查询景点 查询最短途径 修改密码 增
9、长景点 修改景点信息 交通管制界面 删除途径 管理途径 3 调试分析: 当进入操作界面进行功能的选择,但非法输入时,应当提醒错误并可以让用户重新选择,我使用的接受选择的是字符串,判断字符串长度是否等于1,假如不等于则是错误的,等于1后用switch判断第一个字符,与case比较,调用相应的函数。用whlie(1),使之一直循环,直到与case中相同,使用标志和break;让他跳出相应的循环层。在这里经常会犯错,所以要很小心的判断每个标志跳出的相应的循环,使他不会跳出不该跳出的循环。 另一个问题是最短途径
10、在新增一个景点后,我选择不添加相邻的途径时(矩阵的行等于列始终为0,表达同一个景点到同一个景点的途径为0),再次查询最短途径时,起点为新增的途径,终点为任何一个景点都无法运营;但是起点为除新增景点外的景点,而终点为新增景点时,可对的输出:没有途径。由于时间因素来不及调试了。
参考文献
[1]严蔚敏、吴为民.数据结构(C语言版).北京:清华大学出版社.2023
[2]林小茶.C语言程序设计(第二版).中国铁道出版社.2023
[3]杜茂康、李昌兵等.C++面向对象程序设计(第2版).北京:电子工业出版社.2023
附 录
源程序
11、代码
#include
12、ges[MAXV][MAXV]; int number; ViewPoint V[MAXV]; }MGraph; void MainMenu(); void UserMenu(); void Map(); void ViewAsk(); void PathAsk(); void Dijkstra(MGraph G,int v,int i); void Ppath(MGraph G,int path[],int i,int v); void Dispath(MGraph G,int dist[],int path[],int s[],int n,int v,int i)
13、
void AdminMenu();
void Password();
void AdminAlter();
void ViewAdd();
void ViewAlter();
void ControlMenu();
void PathControl();
void PathDel();
void Read(MGraph &G);
void White(MGraph &G);
14、indata("Password.txt");
indata>>pass>>name>>password;
indata.close();
pass=0;
ofstream outdata("Password.txt");
outdata<
15、cout<<"\n\n\n"< 16、─────"< 17、ut< 18、cls");
char choose[1];
int flag=0;
cout<<"\n\n\n"< 19、l;
cout< 20、);break;
case '3':
PathAsk();break;
case '4':
MainMenu();break;
case '5':
exit(0);
default:
system("cls");
cout<<"\n\n\n"< 21、");
cout<<"\n\n\n"< 22、indata("Password.txt");
indata>>pass>>name>>password;
indata.close();
if(pass)
AdminMenu();
else
{
cout<<"\n\n\n"< 23、
ofstream outdata("Password.txt");
outdata< 24、ut< 25、 if(strlen(choose)==1)
{
switch(choose[0])
{
case '1':
flag=1;Password();break;
case '2':
flag=1;MainMenu();break;
case '3':
exit(0);
default:
flag1=1;
system("cls");
cout<<"\n\n\n"< 26、 27、id AdminMenu()
{
system("cls");
char choose[1];
int flag=0;
cout<<"\n\n\n"< 28、 cout< 29、f(strlen(choose)==1)
{
switch(choose[0])
{
case '1':
AdminAlter();break;
case '2':
ViewAdd();break;
case '3':
ViewAlter();break;
case '4':
ControlMenu();break;
case '5':
MainMenu();break;
case '6':
exit(0);
default:
system("cls");
30、 cout<<"\n\n\n"< 31、
void ControlMenu()
{
system("cls");
char choose[1];
cout<<"\n\n\n"< 32、5)<<"───────"< 33、);break;
case '4':
exit(0);
default:
system("cls");
cout<<"\n\n\n"< 34、tw(49)<<"按任意键返回重新选择!";
cout< 35、");
MGraph G;
char viewpoint[20];
char choose[1];
int i,flag=0,flag1=1,flag2=0;
Read(G);
cout<<"\n\n\n"< 36、>>viewpoint;
for(i=0;i 37、"< 38、ak;
}
else
cout< 39、strcmp(choose,"y")==0)
{
break;}
else if(strcmp(choose,"N")==0||strcmp(choose,"n")==0)
{
UserMenu();break;
}
else
cout< 40、10],end[10];
int i,j,flag=0,flag1=1,flag2=0,flag3=1;
Read(G);
cout<<"\n\n\n"< 41、cout< 42、 while(1)
{
cout< 43、lse
cout< 44、>choose;
if(strcmp(choose,"Y")==0||strcmp(choose,"y")==0)
{
flag2=1;break;}
else if(strcmp(choose,"N")==0||strcmp(choose,"n")==0)
{
flag=1;UserMenu();break;
}
else
cout< 45、g2||flag)
break;
}
if(flag||flag2)
break;
}//for
if(flag1)
{
cout< 46、if(strcmp(choose,"N")==0||strcmp(choose,"n")==0)
{
flag=1;UserMenu();break;
}
else
cout< 47、
for(i=0;i 48、st[j];
}
s[u]=1;
for(j=0;j 49、path[i];
if(k==v)
return;
Ppath(G,path,k,v);
cout< 50、






