补发一下老东西(未优化)
目录
设计具体内容:
功能模块图:
各模块流程图:
运行效果图:
源码:
设计具体内容:
应用相关数据结构及算法,设计并实现一个具有查询功能的城市公交查询系统。设计其信息数据结构,实现如下功能:
(1)有 2 种或 2 种以上的查询功能选择等;
(2)实现根据公交路线查询出该路公交的全部途经路线,根据站点实现途经该站点的公交线路;
(3)能够实现换乘查询功能,或2 点之间有无公车通过的线路;
(4)实现可以规避某一二个站点的最优线路(良好);
(5)根据手机或者其他设备提供的功能,设计步行、骑行、公交或者驾车等的二个选项,并设计出以最短时间、最短路径优先的推荐路径方案中的二个选项,能根据最优排序结果输出全部公交线路和站点的信息等(优秀)
要求:
(1)理解及熟练运用相关图路径算法;
(2)理解运用运用图的存储;
(3)理解运用相关查询技术;
(4)界面友好、系统运行应该快速、稳定、高效和可靠。
功能模块图:
各模块流程图:
运行效果图:
源码:
#include<stdio.h>
#include<queue>
#include<cstring>
#include<iostream>
#include<math.h>
#define maxbus 100
#define maxstation 300
using namespace std;
typedef struct
{
int arc[maxstation][maxstation];
int nvex;
int nedge;
}graph; //图的定义
typedef struct{
int busnum;
char staname[15][20];
int stationnum;
}Bus; //公交线路定义
Bus bus[150];
int bn=0; //bn为公交线路条数
int sn=0;
char station[maxstation][20]; //公交站的数组集合
int way[maxbus][maxstation]={0};//公交路线的线性表
int mp[105][105];//mp[i][j]表示i到j是那一路车到的
void read()
{
FILE *fp;
int i,j;
if((fp=fopen("bus.txt","r"))==NULL)
{
printf("Can't open file!\n");
exit(0);
}
for(i=0;i<maxbus;i++)
{
fscanf(fp,"%d %d",&bus[i].busnum,&bus[i].stationnum);
if(bus[i].busnum!=0)
{
bn++;
for(j=0;j<bus[i].stationnum;j++)
{
fscanf(fp,"%s",bus[i].staname[j]);
}
}
}
}
void read2()
{
FILE *fp;
int i,j;
if((fp=fopen("bus2.txt","r"))==NULL)
{
printf("Can't open file!\n");
exit(0);
}
for(i=0;i<maxstation;i++)
{
fscanf(fp,"%s",station[i]);
if(strcmp(station[i],"")==0)
sn++;
}
}
int stanum=maxstation-sn; //stanum为总共的站点数
void write2()
{
FILE *fp;
int i,j;
if((fp=fopen("bus2.txt","w"))==NULL)
{
printf("Can't open file!\n");
exit(0);
}
for(i=0;i<maxstation;i++)
{
fprintf(fp,"%s ",station[i]);
}
}
void exchange()
{
int i,j,k;
for(i=0;i<bn;i++)
{
for(k=0;k<bus[i].stationnum;k++)
for(j=0;j<maxstation;j++)
if(strcmp(bus[i].staname[k],station[j])==0)
way[i][j]=k+1;
}
}
void input2()
{
int i;
for(i=0;i<maxstation;i++)
{
scanf("%s",station[i]);
}
}
void write()
{
FILE *fp;
int i,j;
if((fp=fopen("bus3.txt","w"))==NULL)
{
printf("Can't open file!\n");
exit(0);
}
for(i=0;i<bn;i++)
{
fprintf(fp,"%d %d ",bus[i].busnum,bus[i].stationnum);
printf("%d %d\n",bus[i].busnum,bus[i].stationnum);
for(j=0;j<bus[i].stationnum;j++)
{
fprintf(fp," %s ",bus[i].staname[j]);
}
fputc('\n',fp);
}
}
void input()
{
int i,j;
for(i=0;i<maxbus;i++)
{
printf("公交线路号:");
scanf("%d",&bus[i].busnum);
printf("站台数:");
scanf("%d",&bus[i].stationnum);
printf("站台:\n");
for(j=0;j<bus[i].stationnum;j++)
{
scanf("%s",bus[i].staname[j]);
}
}
}
int output(int n) //输入某号线的所有站点
{
int i,j;
for(i=1;i<=bus[n].stationnum;i++)
for(j=0;j<maxstation;j++)
if(way[n][j]==i)
printf("%s ",station[j]);
}
void way_search()//输入某号线的所有站点
{
int n,i,m;
printf("请输入公交线:");
scanf("%d",&n);
for(i=0;i<maxbus;i++)
if(bus[i].busnum==n)
m=i;
printf("%d号线路:",n);
output(m);
printf("\n");
}
void sta_search()//输出经过某站点的所有路线
{
//..
}
void creat(graph &G) //站点图建立
{
int i,j;
int a,b;
for(i=0;i<stanum;i++)
for(j=0;j<stanum;j++)
G.arc[i][j]=32635;
FILE *fp;
if((fp=fopen("graph.txt","r"))==NULL)
{
printf("Can't open file!\n");
exit(0);
}
fscanf(fp,"%d",&G.nedge);
for(i=0;i<G.nedge;i++)
{
fscanf(fp,"%d %d",&a,&b);
fscanf(fp,"%d",&G.arc[a][b]);
G.arc[b][a]=G.arc[a][b];
}
G.nvex=stanum;
}
void digist_way(graph &G,int p[],int d[],int n) //迪杰斯特拉算法
{
int v,w,k,min;
int flag[maxstation];
creat(G);
for(v=0;v<G.nvex;v++)
{
flag[v]=0;
p[v]=0;
d[v]=G.arc[n][v];
}
d[n]=0;
flag[n]=1;
for(v=1;v<G.nvex;v++)
{
//...
}
}
void result(graph &G,char a[],char b[]) //两个站点之间的最短距离
{
int i,j,m,n,f;
int p[maxstation],d[maxstation];
for(i=0;i<stanum;i++)
{
if(strcmp(station[i],a)==0)
m=i;
if(strcmp(station[i],b)==0)
n=i;
}
digist_way(G,p,d,m);
printf("最短路径长度为:%d\n",d[n]);
}
int endy, minn = 15, tot, vis[105][105];
struct node{
int x, y;
}ans[105], b[105];
void dfs(int x, int y, int num, int cnt){
if(y == endy && way[x][y]){
if(num < minn || (num == minn && cnt < tot)){
b[cnt].x = x, b[cnt].y = y;
for (int i = 0; i <= cnt; i++){
ans[i] = b[i];
}
tot = cnt;
minn = num;
}
return ;
}
if(!way[x][y]) return ;
int t = -1;
b[cnt].x = x, b[cnt].y = y;
for (int i = 0; i < maxbus; i++) if(way[i][y] && !vis[i][y]) vis[i][y] = 1, dfs(i, y, num + 1, cnt + 1), vis[i][y] = 0;
for (int i = 0; i < maxstation; i++){
if(way[x][i] == way[x][y] + 1){
t = i;
break;
}
}
if(t != -1 && !vis[x][t]) vis[x][t] = 1, dfs(x, t, num, cnt + 1), vis[x][t] = 0;
t = -1;
for (int i = 0; i < maxstation; i++){
if(way[x][i] == way[x][y] - 1 && way[x][i] != 0){
t = i;
break;
}
}
if(t != -1 && !vis[x][t]) vis[x][t] = 1, dfs(x, t, num, cnt + 1), vis[x][t] = 0;
}
void change(int way[maxbus][maxstation],int m,int n) //最短换乘路径
{
endy = n;
minn = 15;
for (int i = 0; i < maxbus; i++){
if(!way[i][m]) continue;
memset(vis, 0, sizeof(vis));
vis[i][m] = 1;
dfs(i, m, 0, 0);
}
if(minn == 15) printf("无法到达\n");
else{
//...
}
}
void link(graph &G) //两站之间是否有直达公交
{
char a[20],b[20];
int i,j,m,n,k=0;
int r[maxbus]={0};
printf("请输入两个站点: ");
scanf("%s",a);
scanf("%s",b);
for(i=0;i<maxstation;i++)
{
if(strcmp(station[i],a)==0)
m=i;
if(strcmp(station[i],b)==0)
n=i;
}
for(i=0;i<maxbus;i++)
{
if(way[i][m]>0&&way[i][n]>0)
{
r[k]=i+1;
k++;
}
}
if(r[0]==0)
{
printf("两个站点之间没有直达公交车\n");
printf("可以换乘的路线有: \n");
change(way,m,n);
}
else
{
//...
}
result(G,a,b);
}
void allvisit() //输出所有路线及站点
{
int i;
for(i=0;i<bn;i++)
{
if(bus[i].busnum!=0)
{
printf("%d号线路为:",bus[i].busnum);
output(i);
printf("\n");
}
}
}
void menu() //菜单函数
{
int n;
graph G;
printf("\t\t***************************************************\n");
printf("\t\t***********XZITXX的智能公交查询系统****************\n");
printf("\t\t***************************************************\n");
printf("\t\t********(1)查询某号线所有站点**********************\n");
printf("\t\t********(2)查询经过某站点的所有公交线**************\n");
printf("\t\t********(3)查询两站之间的最短换乘路径及长度********\n");
printf("\t\t********(4)查询全部公交线及站点********************\n");
printf("\t\t********(5)退出系统********************************\n");
printf("请选择功能: ");
scanf("%d",&n);
switch(n)
{
case 1:way_search();break;
case 2:sta_search();break;
case 3:link(G);break;
case 4:allvisit();break;
case 5:break;
}
if(n>=1&&n<=4)
menu();
}
int main(void)
{
read2();
read();
exchange();
menu();
return 0;
}