补发一下老东西(未优化)

目录

设计具体内容:

功能模块图:

各模块流程图:

运行效果图:

源码:


设计具体内容:

应用相关数据结构及算法,设计并实现一个具有查询功能的城市公交查询系统。设计其信息数据结构,实现如下功能:

(1)有 2 种或 2 种以上的查询功能选择等;

(2)实现根据公交路线查询出该路公交的全部途经路线,根据站点实现途经该站点的公交线路;

(3)能够实现换乘查询功能,或2 点之间有无公车通过的线路;

(4)实现可以规避某一二个站点的最优线路(良好);

(5)根据手机或者其他设备提供的功能,设计步行、骑行、公交或者驾车等的二个选项,并设计出以最短时间、最短路径优先的推荐路径方案中的二个选项,能根据最优排序结果输出全部公交线路和站点的信息等(优秀)

要求:

(1)理解及熟练运用相关图路径算法;

(2)理解运用运用图的存储;

(3)理解运用相关查询技术;

(4)界面友好、系统运行应该快速、稳定、高效和可靠。


功能模块图:

android 公交查询源码 智能公交查询_c语言


各模块流程图:

android 公交查询源码 智能公交查询_算法_02

android 公交查询源码 智能公交查询_c语言_03

android 公交查询源码 智能公交查询_c语言_04

android 公交查询源码 智能公交查询_数据结构_05


运行效果图:

android 公交查询源码 智能公交查询_android 公交查询源码_06


源码:

#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;
}