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