帮忙解决一下,一个死循环,怎么改

qingqingziya 2009-12-30 03:06:08
#ifndef ADJMATRIX_H
#define ADJMATRIX_H
#include<iostream>
#include<vector>
#include<string>
#define INF 32767
using namespace std;

const int MaxValue=100;//最大值
struct EdgeType{
int iDistance;//路程
int iCost; //费用
int iTime; //所花费的时间
};
struct City{
int Number;
char *Name;

};//交通网络图,有iVexNum个城市,城市之间有iEdgNum条路线,每条路线上的时间路程费用为
//Route[MaxValue][MaxValue]
class AdjMatrix{
public:
AdjMatrix(int n);
int GetVexNum();//取得交通图的城市个数
int GetEdgNum();//取得交通图的路线数目
char* GetCityName (const int i);//通过序号取得城市的名字
int GetCityNum(char* cityname);//通过城市名字取得城市的编号
void CreateGraph();//构造交通图
void PrintGragh();//供测试用
void ShowRouteLength();//向用户显示路程长度
void ShowRouteCost();//向用户显示路程车票
void ShowRouteTime();//向用户显示路程时间
void Dijkstra(int v,int dist[],int path[]);//求一个源点到其他点的最短性质
void DijkstraCst(int v,int dist[],int path[]);
void DijkstraTm(int v,int dist[],int path[]);
void DijkstraShortDistance();//一个城市到其他城市的最短距离
void DijkstraLessTime();//一个城市到其他城市的最少时间
void DijkstraLessCost();//一个城市到其他城市的最少花费
void Floyd(int dist[MaxValue][MaxValue],int path[MaxValue][MaxValue]);//两个点之间的最短性质
void FloydCst(int dist[MaxValue][MaxValue],int path[MaxValue][MaxValue]);
void FloydTm(int dist[MaxValue][MaxValue],int path[MaxValue][MaxValue]);
void FloydShortDistance();//两个城市之间的最段距离
void FloydLessTime();//两个城市之间的最少时间
void FloydLessCost();//两个城市之间的最少花费
private:
int iVexNum;//顶点数,即城市个数
int iEdgNum;//边数,即城市间的路线
City city[MaxValue];//图的顶点,即城市
EdgeType Route[MaxValue][MaxValue];//各边的权值,即路线的时间费用以及路程
};
#endif

using namespace std;
AdjMatrix::AdjMatrix(int n)//初始化有n个顶点的邻接矩阵
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j)
{
Route[i][j].iTime=0;
Route[i][j].iCost=0;
Route[i][j].iDistance=0;
}
else
{
Route[i][j].iTime=INF;
Route[i][j].iCost=INF;
Route[i][j].iDistance=INF;
}
}
iVexNum=iEdgNum=0;
}

int AdjMatrix::GetVexNum()
{
return iVexNum;
}
int AdjMatrix::GetEdgNum()
{
return iEdgNum;
}

char* AdjMatrix::GetCityName(const int i)//取城市的名字
{
if(i<0||i>iVexNum)
{
cerr<<"参数越界,发生错误了!"<<endl;
exit(1);
}
return city[i].Name;
}

int AdjMatrix::GetCityNum(char* cityname)
{
for(int i=1;i<=iVexNum;i++)
{
if (strcmp(city[i].Name,cityname)==0)
return city[i].Number;
}
cerr<<"您输入的城市有错误"<<endl;
return -1;
}

void AdjMatrix::PrintGragh()//将图打印出来,最初测试之用
{
for(int i=0;i<iVexNum;i++)
{
for(int j=0;j<iVexNum;j++)
{
if(100==Route[i+1][j+1].iDistance)
{
Route[i+1][j+1].iDistance=1000;
}
cout<<Route[i+1][j+1].iDistance<<"\t";
}
cout<<endl;
}
}

void AdjMatrix::CreateGraph()//为了方便真是先把时间跟费用这两个权值给屏蔽掉了
{
City city1,city2;
int time,distance,cost;
char flag='y';
char *ch=new char(10);
cout<<"请输入城市的数目:";
cin>>iVexNum;
cout<<"输入城市的信息:"<<endl;
for(int i=1;i<=iVexNum;i++)
{
cout<<"序号"<<i<<"的";
cout<<"城市名字:";
city[i].Name=new char;
cin>>city[i].Name;
city[i].Number=i;
}
cout<<"请输入路线的数目:"<<endl;
cin>>iEdgNum;
for(i=0;i<iEdgNum;i++)
{
cout<<"输入两个城市的信息:"<<endl;
cout<<"城市1序号:";
cin>>city1.Number;
cout<<"城市1名字:";
city1.Name=new char;
cin>>city1.Name;
cout<<"序号是"<<GetCityNum(city1.Name)<<endl;
cout<<"城市2序号:";
cin>>city2.Number;
city1.Number=GetCityNum(city1.Name);
cout<<"城市2名字:";
city2.Name=new char;
cin>>city2.Name;
city2.Number=GetCityNum(city2.Name);
cout<<"序号是"<<GetCityNum(city2.Name)<<endl;
cout<<"所用时间:";
cin>>time;
Route[city1.Number][city2.Number].iTime=time;
Route[city2.Number][city1.Number].iTime=time;
cout<<"所用费用:";
cin>>cost;
Route[city1.Number][city2.Number].iCost=cost;
Route[city2.Number][city1.Number].iCost=cost;
cout<<"两地的路程:";
cin>>distance;
Route[city1.Number][city2.Number].iDistance=distance;
}
return;
}


void AdjMatrix::ShowRouteLength()//向用户显示各个城市之间路程长度
{
cout<<"\t";
for(int i=1;i<=iVexNum;i++)
cout<<city[i].Name<<"\t";
cout<<endl;
for(i=1;i<=iVexNum;i++)
{
cout<<city[i].Name<<"\t";
for(int j=1;j<=iVexNum;j++)
cout<<Route[i][j].iDistance<<"\t";
cout<<endl;
}
}
void AdjMatrix::ShowRouteCost()//向用户显示各个城市之间路程车票
{
cout<<"\t";
for(int i=1;i<=iVexNum;i++)
cout<<city[i].Name<<"\t";
cout<<endl;
for(i=1;i<=iVexNum;i++)
{
cout<<city[i].Name<<"\t";
for(int j=1;j<=iVexNum;j++)
cout<<Route[i][j].iCost<<"\t";
cout<<endl;
}
}
void AdjMatrix::ShowRouteTime()//向用户显示各个城市之间路程时间
{
cout<<"\t";
for(int i=1;i<=iVexNum;i++)
cout<<city[i].Name<<"\t";
cout<<endl;
for(i=1;i<=iVexNum;i++)
{
cout<<city[i].Name<<"\t";
for(int j=1;j<=iVexNum;j++)
cout<<Route[i][j].iTime<<"\t";
cout<<endl;
}
}

void AdjMatrix::Dijkstra(int v0,int dist[],int path[])//求一个源点到其他点的最短距离
//函数里面城市图的权值还是先展示用的两地路程 即iDistance
{
int mindis;
int *s=new int(10);
int u;
for(int i=1;i<=iVexNum;i++)
{
dist[i]=Route[v0][i].iDistance;
s[i]=0;
if(i!=v0&&dist[i]<MaxValue)
path[i]=v0;
else path[i]=-1;
}
dist[v0]=0;
s[v0]=1;
for(i=1;i<iVexNum;i++)
{
mindis=MaxValue;
for(int j=1;j<=iVexNum;j++)
{
if(0==s[j]&&dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
}
if(mindis==MaxValue) return;
s[u]=1;
for(int w=1;w<=iVexNum;w++)
if (0==s[w]&&Route[u][w].iDistance<MaxValue&&dist[u]+Route[u][w].iDistance<dist[w])
{
dist[w]=dist[u]+Route[u][w].iDistance;
path[w]=u;
}
}
}

void AdjMatrix::DijkstraCst(int v0,int dist[],int path[])//求一个源点到其他点的最短距离
{
int mindis;
int *s=new int(10);
int u;
for(int i=1;i<=iVexNum;i++)
{
dist[i]=Route[v0][i].iCost;
s[i]=0;
if(i!=v0&&dist[i]<MaxValue)
path[i]=v0;
else path[i]=-1;
}
dist[v0]=0;
s[v0]=1;
for(i=1;i<iVexNum;i++)
{
mindis=MaxValue;
for(int j=1;j<=iVexNum;j++)
{
if(0==s[j]&&dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
}
if(mindis==MaxValue) return;
s[u]=1;
for(int w=1;w<=iVexNum;w++)
if (0==s[w]&&Route[u][w].iDistance<MaxValue&&dist[u]+Route[u][w].iCost<dist[w])
{
dist[w]=dist[u]+Route[u][w].iCost;
path[w]=u;
}
}
}


void AdjMatrix::DijkstraTm(int v0,int dist[],int path[])//求一个源点到其他点的最短距离
{
int mindis;
int *s=new int(10);
int u;
for(int i=1;i<=iVexNum;i++)
{
dist[i]=Route[v0][i].iTime;
s[i]=0;
if(i!=v0&&dist[i]<MaxValue)
path[i]=v0;
else path[i]=-1;
}
dist[v0]=0;
s[v0]=1;
for(i=1;i<iVexNum;i++)
{
mindis=MaxValue;
for(int j=1;j<=iVexNum;j++)
{
if(0==s[j]&&dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
}
if(mindis==MaxValue) return;
s[u]=1;
for(int w=1;w<=iVexNum;w++)
if (0==s[w]&&Route[u][w].iDistance<MaxValue&&dist[u]+Route[u][w].iTime<dist[w])
{
dist[w]=dist[u]+Route[u][w].iTime;
path[w]=u;
}
}
}

void AdjMatrix::DijkstraShortDistance()
{
char *cityname=new char;
cout<<"请输入您要查询的城市:";
cin>>cityname;
int v0=GetCityNum(cityname);
int *dist=new int[iVexNum];
int *path=new int[iVexNum];
Dijkstra(v0,dist,path);
cout<<"从"<<cityname<<"城市到其他城市的最短路程为:"<<endl;
for(int i=1;i<=iVexNum;i++)
{
cout<<"到城市"<<GetCityName(i)
<<"的最短距离为"<<dist[i]<<"\n";

if(path[i]!=-1)
{
cout<<"路径为"<<GetCityName(i)<<"<-";
int x=path[i];
while(x!=v0)
{
cout<<GetCityName(x)<<"<-";
x=path[x];
}
cout<<cityname;
cout<<endl;
}
else cout<<endl;
}
}
void AdjMatrix::DijkstraLessTime()
{
char *cityname=new char;
cout<<"请输入您要查询的城市:";
cin>>cityname;
int v0=GetCityNum(cityname);
int *dist=new int[iVexNum];
int *path=new int[iVexNum];
DijkstraTm(v0,dist,path);
cout<<"从 "<<cityname<<"城市到其他城市的最少时间为:\n";
for(int i=1;i<=iVexNum;i++)
{
cout<<"到城市"<<GetCityName(i)
<<"的最少时间为"<<dist[i]<<endl;
}
}
void AdjMatrix::DijkstraLessCost()
{
char *cityname=new char;
cout<<"请输入您要查询的城市:";
cin>>cityname;
int v0=GetCityNum(cityname);
int *dist=new int[iVexNum];
int *path=new int[iVexNum];
DijkstraCst(v0,dist,path);
cout<<"从 "<<cityname<<"城市到其他城市的最少花费为:\n";
for(int i=1;i<=iVexNum;i++)
{
cout<<"到城市"<<GetCityName(i)
<<"的最少花费为"<<dist[i]<<endl;
}
}

void AdjMatrix::Floyd(int dist[MaxValue][MaxValue],int path[MaxValue][MaxValue])
{
int i,j,k;
for(i=1;i<=iVexNum;i++)
for(j=1;j<=iVexNum;j++)
{
dist[i][j]=Route[i][j].iDistance;
if(i!=j&&dist[i][j]!=MaxValue)
path[i][j]=i;
else

if(i==j) path[i][j]=0;
else path[i][j]=-1;
}
for(k=1;k<=iVexNum;k++)
for(i=1;i<=iVexNum;i++)
for(j=1;j<=iVexNum;j++)
{
if (dist[i][j]>(dist[i][k]+dist[k][j]))
{
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[k][j];
}
}
}

void AdjMatrix::FloydCst(int dist[MaxValue][MaxValue],int path[MaxValue][MaxValue])
{
int i,j,k;
for(i=1;i<=iVexNum;i++)
for(j=1;j<=iVexNum;j++)
{
dist[i][j]=Route[i][j].iCost;
if(i!=j&&dist[i][j]!=MaxValue)
path[i][j]=i;
else

if(i==j) path[i][j]=0;
else path[i][j]=-1;
}
for(k=1;k<=iVexNum;k++)
for(i=1;i<=iVexNum;i++)
for(j=1;j<=iVexNum;j++)
{
if (dist[i][j]>(dist[i][k]+dist[k][j]))
{
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[k][j];
}
}
}
...全文
240 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingqingziya 2009-12-30
  • 打赏
  • 举报
回复
先谢了,我试试
xianyuxiaoqiang 2009-12-30
  • 打赏
  • 举报
回复
汗,教你个笨办法:
在每个函数第一行加打印语句,这样:
void function1(){
printf("function1");
...
}

定位到死循环的具体函数。然后再逐行判断。
shuxieweilai 2009-12-30
  • 打赏
  • 举报
回复
看了下下 眼泪都看出来了
qingqingziya 2009-12-30
  • 打赏
  • 举报
回复
不是这个的原因...唉...还是谢谢
ghosty_hand 2009-12-30
  • 打赏
  • 举报
回复
乍看是这样的,代码太长了……
ghosty_hand 2009-12-30
  • 打赏
  • 举报
回复
你的switch语句没有default break 这样会有问题的。你的case里面没有case0 ,又没有default。正好case 0是返回上一级菜单,就死循环了。
qingqingziya 2009-12-30
  • 打赏
  • 举报
回复
这是原题,如果有源代码的话也可以,不胜感激!!!

交通咨询系统设计
在交通网络非常发达,交通工具和交通方式不断更新的今天,人们在出差、旅游或做其它出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也感兴趣。设计一个交通咨询系统,能让旅客咨询从任一城市到另一城市定点之间的最短路径或最低花费或最少时间。
qingqingziya 2009-12-30
  • 打赏
  • 举报
回复
在输入城市之间的时间距离路费后,查询选定城市到其他城市的时间距离路费后无问题,然后按0返回上级菜单,再次查询就会出现死循环,请帮忙解决一下,急!!!谢谢~~~
sicxun 2009-12-30
  • 打赏
  • 举报
回复
这分真难挣
qingqingziya 2009-12-30
  • 打赏
  • 举报
回复
void AdjMatrix::FloydTm(int dist[MaxValue][MaxValue],int path[MaxValue][MaxValue])
{
int i,j,k;
for(i=1;i<=iVexNum;i++)
for(j=1;j<=iVexNum;j++)
{
dist[i][j]=Route[i][j].iTime;
if(i!=j&&dist[i][j]!=MaxValue)
path[i][j]=i;
else

if(i==j) path[i][j]=0;
else path[i][j]=-1;
}
for(k=1;k<=iVexNum;k++)
for(i=1;i<=iVexNum;i++)
for(j=1;j<=iVexNum;j++)
{
if (dist[i][j]>(dist[i][k]+dist[k][j]))
{
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[k][j];
}
}
}

void AdjMatrix::FloydShortDistance()
{
char *cityname1=new char;
char *cityname2=new char;
int dist[MaxValue][MaxValue];
int path[MaxValue][MaxValue];
cout<<"请输入两个城市:";
cout<<"城市1:";
cin>>cityname1;
cout<<"城市2:";
cin>>cityname2;
int i= GetCityNum(cityname1);
int j= GetCityNum(cityname2);
Floyd( dist, path);
cout<<"城市"<<cityname1<<"到城市"<<cityname2
<<"的最短路径为"<<dist[i][j]<<endl;

if(path[i][j]!=-1)
{
cout<<"路径为:"<<cityname2<<"<-";
int x=path[i][j];
while(x!=i)
{
cout<<GetCityName(x)<<"<-";
x=path[i][x];
}
cout<<cityname1;
cout<<endl;
}
else cout<<endl;
}

void AdjMatrix::FloydLessTime()
{
char *cityname1=new char;
char *cityname2=new char;
cout<<"请输入两个城市:";
cout<<"城市1:";
cin>>cityname1;
cout<<"城市2:";
cin>>cityname2;
int i= GetCityNum(cityname1);
int j= GetCityNum(cityname2);
int dist[MaxValue][MaxValue];
int path[MaxValue][MaxValue];
FloydTm( dist, path);
cout<<"城市"<<cityname1<<"到城市"<<cityname2
<<"的最少时间为"<<dist[i][j]<<endl;
}

void AdjMatrix::FloydLessCost()
{
char *cityname1=new char;
char *cityname2=new char;
cout<<"请输入两个城市:";
cout<<"城市1:";
cin>>cityname1;
cout<<"城市2:";
cin>>cityname2;
int i= GetCityNum(cityname1);
int j= GetCityNum(cityname2);
int dist[MaxValue][MaxValue];
int path[MaxValue][MaxValue];
FloydCst( dist, path);
cout<<"城市"<<cityname1<<"到城市"<<cityname2
<<"的最少花费为"<<dist[i][j]<<endl;
}

using namespace std;
AdjMatrix Gragh(10);

void Administrator()
{
int i;
cout<<endl;
cout<<"*****这里是管理员的界面,欢迎进入*****"<<endl;
cout<<"1=创建城市交通网络"<<endl
<<"2=增加城市"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
while(i!=0)
{
switch(i)
{
case 1:Gragh.CreateGraph();break;
case 2:{};break;
}
cout<<"1=创建城市交通网络"<<endl
<<"2=增加城市"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
}
return;
}

void OnetoAnotherInfo()
{
int i;
cout<<endl;
cout<<"1=咨询一个城市到其他城市的最短路径"<<endl
<<"2=咨询一个城市到其他城市的最少时间"<<endl
<<"3=咨询一个城市到其他城市的最少车票"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
while(i!=0)
{
switch(i)
{
case 1:Gragh.DijkstraShortDistance();break;
case 2:Gragh.DijkstraLessTime();break;
case 3:Gragh.DijkstraLessCost();break;
}
cout<<"1=咨询一个城市到其他城市的最短路径"<<endl
<<"2=咨询一个城市到其他城市的最少时间"<<endl
<<"3=咨询一个城市到其他城市的最少车票"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
}
return;
}

void TwoCityInfo()//两个城市之间的信息查询
{
int i;
cout<<endl;
loop:
cout<<"1=咨询两个城市之间的最短路程"<<endl
<<"2=咨询两个城市之间的最少时间"<<endl
<<"3=咨询两个城市之间的最少车票"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
while(i!=0)
{
switch(i)
{
case 1:Gragh.FloydShortDistance();break;
case 2:Gragh.FloydLessTime();break;
case 3:Gragh.FloydLessCost();break;
}
/* cout<<"1=咨询两个城市之间的最短路程"<<endl
<<"2=咨询两个城市之间的最少时间"<<endl
<<"3=咨询两个城市之间的最少车票"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
*/
goto loop;
}
return;
}

void Passenger()//用户的界面
{
int i;
cout<<endl;
cout<<"*****这里是乘客的界面,欢迎进入*****"<<endl;
cout<<"1=咨询一个城市到其他城市的信息"<<endl
<<"2=咨询两个城市之间的信息"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
while(i!=0)
{
switch(i)
{
case 1:OnetoAnotherInfo();break;
case 2:TwoCityInfo();break;
}
cout<<"1=咨询一个城市到其他城市的信息"<<endl
<<"2=咨询两个城市之间的信息"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
}
return;
}

void ShowTrafficNet()//显示交通网络
{

int i;
cout<<endl;
cout<<"*****显示交通网,里面有个路线的长度,车票以及时间,欢迎进入*****"<<endl;
cout<<"1=显示路程长度"<<endl
<<"2=显示路线相对应的车票"<<endl
<<"3=显示路线相对应的时间长度"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
while(i!=0)
{
switch(i)
{
case 1:Gragh.ShowRouteLength();break;//显示城市间的路程
case 2:Gragh.ShowRouteCost();break;//显示城市之间的费用
case 3:Gragh.ShowRouteTime();break;//显示城市之间的所花时间
}
cout<<"1=显示路程长度"<<endl
<<"2=显示路线相对应的车票"<<endl
<<"3=显示路线相对应的时间长度"<<endl
<<"0=返回上一级菜单"<<endl;
cout<<"请选择: ";
cin>>i;
}
return;
}

int main()//主函数
{
int i;
cout<<"*****你好!这里是交通系统咨询,欢迎使用*****"<<endl;
cout<<"现在请您选择您的身份:"<<endl
<<"1=管理员"<<endl
<<"2=用户"<<endl
<<"3=显示交通网(用矩阵形式)"<<endl
<<"0=退出"<<endl;
cout<<"请选择: ";
cin >> i;
while(i!=0)
{
switch(i)
{
case 1:Administrator();break;//此处要显示管理员的界面
case 2:Passenger();break;//此处显示用户的界面
case 3:ShowTrafficNet();break;
}
cout<<"现在请您选择您的身份:"<<endl
<<"1=管理员"<<endl
<<"2=用户"<<endl
<<"3=显示交通网(用矩阵形式)"<<endl
<<"0=退出"<<endl;
cout<<"请选择: ";
cin >> i;
}
return 1;
}

684

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧