资源描述
广东海洋大学信息学院
课程设计报告
设计题目
公交换乘
课程名称
数据结构
姓名(学号)
联系电话
专业名称
所在班级
指导教师
教师职称
起止时间
评定成绩
一、 课程设计的主要内容
公交换乘在一个城市的公共交通系统设计中占据着极其重要的地位,公交换乘的过程将直接影响居民出行时间的长短,公交换乘的过程如下:指定一起始公交站点与目的公交站点,依据参考因素,例如:换乘路线的路径最短、耗费时间最短、所需车资最少等,经过分析处理得到可达目的站点换乘次数最少的乘车方案,具体可分为:
(1)零次换乘 起始站点和目的站点之间存在可直达的公交线路,即出行居民无需转乘就可以直接到达目的站点,这也是较为理想的方案。
(2)一次换乘 起始站点和目的站点之间没有公交车直接往返,即两站点之间不存在可直达的公交线路,则出行居民需要在途经的某个站点下车,然后转乘另一线路公交车才能达到目的站点。
(3)多次换乘 在起始站点和目的站点之间没有可直达的公交线路,出行居民需要经过一次以上的转乘才能达到目的站点,则得到多次换乘方案。多次换乘方案可通过一次换乘的递归计算得到,一般情况下,超过两次转乘的方案对于出行居民来说是难以接受的,本课程设计只要求计算零次和一次换乘方案,对于一次以上的公交换乘不作要求。
二、 功能和结构设计
1、功能设计
在这里通过主函数显示程序的主页版,上面是湛江的公交线路图
在这里输入出发站点的名字,回车确定!
在这里输入最终站点的名字!
输入错误会提醒重新输入!
输入要查询的起点和终点
0次换乘,输出查询结果:
按y或Y,可以继续查询!
输入出发点和终点,一次换乘的结果如下:
2、结构设计
设计一个实现公交换乘的算法:指定任一起始站点和目的站点,依据算法得到所有可达目的站点的的公交线路,包括中间站点的换乘方法以及该公交线路所经过的公交站点。
1. 分析公交站点和公交线路的数据属性,并依据公交换乘的功能要求,确定算法设计方案;
2. 设计公交站点信息以及公交线路信息的存储结构;
3. 设计公交换乘算法,并画出程序流程图;
4. 使用C++程序设计语言编写实现公交换乘的程序;
三、 流程图和算法设计
开始
搜索经过起始站点的所有公交线路和经过目的站点的所有公交线路
判断是否存在同时经过其始站点和目的站点的公交线路
对于经过起始站点的公交线路和经过目的站点的公交线路的每对数据结构中,是否经过相同的公交站点
当前无法找到可行的换乘方案,打印相关信息
结束
找到一次换乘的乘车方案,打印换乘方案以及换乘路线所覆盖的站点信息
否
否
是
是
找到零次换乘(直达)的乘车方案,打印直达路线所覆盖的站点信息
四、 源程序代码
#include<iostream>
#include<string>
using namespace std;
const int pathlen=11;
int qd,zd;//起点,终点的下标
string a[4]={"农垦医院站","广州湾站","霞湖医院站","海滨宾馆站"};
class Busline
{
public:
Busline(string p[],int n);
void zhida(int i,string sp,string fp,string p[],int l);
void gjhc(int i,int j,string sp,string fp,string p1[],string p2[]);
void tu();
private:
string bus[pathlen];
};
Busline::Busline(string p[],int n)
{
if(n>pathlen) throw"上溢";
for(int i=0;i<pathlen;i++)
{
bus[i]=p[i];
}
}
void Busline::zhida(int i,string sp,string fp,string p[],int l)
{
qd=i;
for(int j=0;j<pathlen;j++)
if(fp==p[j])
{
cout<<"可以直达,乘坐"<<l<<"号车!"<<endl;
if(i<j)
{
cout<<"该路线为:"<<endl;
for(int k=i;k<=j;k++)
{
cout<<p[k]<<" ";
}
}
else
cout<<"该路线为:"<<endl;
for(int k=i;k>=j;k--)
{
cout<<p[k]<<" ";
}
}
}
void Busline::gjhc(int i,int j,string sp,string fp,string p1[],string p2[])
{
qd=i;
zd=j;
for(int k=0;k<pathlen;k++)
for(int h=0;h<pathlen;h++)
if(fp==p1[h]&&sp==p2[k])
{
for(int x=0;x<4;x++)
for(int l=0;l<pathlen;l++)
for(int l1=0;l1<pathlen;l1++)
{
if(a[x]==p2[l]&&a[x]==p1[l1])
{
if(i<l)
{
for(int y=i;y<l;y++)
{
cout<<"经"<<p2[y]<<" ";
}
if(j<l1)
{
cout<<"在"<<a[x]<<"转程,"<<" ";
for(int z=l1;z>=j;z--)
{
cout<<"经"<<p1[z]<<" ";
}
cout<<"到"<<fp<<endl;
}
else if(j>l1)
{
cout<<"在"<<a[x]<<"转程,"<<" ";
for(int z=l1;z<=j;z++)
{
cout<<"经"<<p1[z]<<" ";
}
cout<<"到"<<fp<<endl;
}
}
else if(i>l)
{
cout<<"在"<<a[x]<<"转程,"<<" ";
for(int y=i;y>l;y--)
{
cout<<"经"<<p2[y]<<" ";
}
cout<<"到"<<fp<<endl;
if(j<l1)
{
for(int z=l1;z>=j;z--)
{
cout<<"转"<<p1[z]<<" ";
}
}
else if(j>l1)
{
cout<<"在"<<a[x]<<"转程,"<<" ";
for(int z=l1;z<=j;z++)
{
cout<<"转"<<p1[z]<<" ";
}
cout<<"到"<<fp<<endl;
}
}
}
}
}
}
void Busline::tu()
{
cout<<" 湛江公交路线图 "<<endl;
cout<<" 2线| "<<endl;
cout<<" | "<<endl;
cout<<" 东华站○ "<<endl;
cout<<" | | "<<endl;
cout<<" 湾桥站○ 潜水运动 ○海滨医院站 "<<endl;
cout<<" | 学校站 | 海上城市站 "<<endl;
cout<<" ̄农垦医院站● ̄ ̄○ ̄ ̄ ̄●海滨宾馆站 ̄ ̄ ̄○ ̄ ̄ ̄| "<<endl;
cout<<" | | | "<<endl;
cout<<" 啤酒厂站○ ○儿童公园站 ○市旅游总公司站 "<<endl;
cout<<" | | | "<<endl;
cout<<" 俱乐部站○ | | "<<endl;
cout<<" | 广州湾站| |霞湖医院站 "<<endl;
cout<<"  ̄○ ̄○ ̄ ̄ ● ̄ ̄ ̄ ̄ ̄○ ̄ ̄ ̄ ̄ ̄ ̄● ̄ ̄○ ̄ ̄ "<<endl;
cout<<" 广医附院站 国贸站 | 建新东路站 | 霞山汽车运输总站 "<<endl;
cout<<" | | "<<endl;
cout<<" 3线 | | "<<endl;
cout<<"  ̄ ̄○ ̄ ̄○ ̄ ̄ ̄○ ̄○建设路站 ○海运集团公司站 "<<endl;
cout<<"世纪广场站 人民大道 湛江汽车南站 | "<<endl;
cout<<" 中巴专线 |1线 "<<endl;
cout<<" (●为换乘站点,○为普通站点) "<<endl;
cout<<endl;
}
void main()
{
string path1[pathlen]={"农垦医院站","潜水运动学校站","海滨宾馆站","海上城市站","市旅游总公司站","霞湖医院站","海运集团公司站"};
string path2[pathlen]={"东华站","湾桥站","农垦医院站","啤酒厂站","俱乐部站","广医附院站","国贸站","广州湾站","建新东路站","霞湖医院站","霞山汽车运输总站"};
string path3[pathlen]={"海滨医院站","海滨宾馆站","儿童公园站","广州湾站","建设路站","湛江汽车南站","人民大道中巴专线","世纪广场站"};
Busline a(path1,7);
Busline b(path2,11);
Busline c(path3,8);
a.tu();
string sp,fp;
begin:
cout<<"请输入出发点:"<<endl;
cin>>sp;
begin1:
cout<<"请输入终点:"<<endl;
cin>>fp;
int j1=1,jj=1;
for(int d=0;d<7;d++)
{
if(sp==path1[d])
j1=2;
if(fp==path1[d])
jj=2;
}
for( d=0;d<11;d++)
{
if(sp==path2[d])
j1=2;
if(fp==path2[d])
jj=2;
}
for( d=0;d<8;d++)
{
if(sp==path3[d])
j1=2;
if(fp==path3[d])
jj=2;
}
if(j1==1)
{
cout<<"输入的出发点有错,请重新输入:"<<endl;
goto begin;
}
if(jj==1)
{
cout<<"输入的终点点有错,请重新输入:"<<endl;
goto begin1;
}
else
for(int i=0;i<pathlen;i++)
{
for(int k1=0;k1<pathlen;k1++)
if(fp==path1[k1])
{
if(sp==path1[i])
{
a.zhida(i,sp,fp,path1,1);
}
else if(sp!=path1[i])
{
if(sp==path2[i])
{
cout<<"需要换乘,转程方式为:2路转1路线"<<endl;
a.gjhc(i,k1,sp,fp,path1,path2);
}
if(sp==path3[i])
{
cout<<"需要换乘,转程方式:3路转1路线"<<endl;
a.gjhc(i,k1,sp,fp,path1,path3);
}
}
}
else if(fp==path2[k1])
{
if(sp==path2[i])
{
b.zhida(i,sp,fp,path2,2);
}
else if(sp!=path2[i])
{
if(sp==path1[i])
{
cout<<"需要换乘,转程方式:1路转2路线"<<endl;
b.gjhc(i,k1,sp,fp,path2,path1);
}
else if(sp==path3[i])
{
cout<<"需要换乘,转程方式:3路转2路线"<<endl;
b.gjhc(i,k1,sp,fp,path2,path3);
}
}
}
else if(fp==path3[k1])
{
if(sp==path3[i])
{
c.zhida(i,sp,fp,path3,3);
}
else if(sp!=path3[i])
{
if(sp==path1[i])
{
cout<<"转程方式:1路转3路线"<<endl;
c.gjhc(i,k1,sp,fp,path3,path1);
}
else if(sp==path2[i])
{
cout<<"转程方式:2路转3路线"<<endl;
c.gjhc(i,k1,sp,fp,path3,path2);
}
}
}
}
cout<<"\n"<<"是否继续?继续请输入y或者Y!!!"<<endl;
char t;
cin>>t;
if(t=='y'||t=='Y')
goto begin;
else
exit(1);
}
五、 课程设计总结
在这次关于公交换乘的课程设计中,我了解到了我的不足,如算法的不完善、不细心和耐心不是很好等等。不细心的我在调试程序时,老是因为某个书写错误导致很多错误;对这些错误,我不得不花大量的时间去更正,并且还要重复检查是否出现雷同的错误而导致程序不能运行。但是通过这次课程设计,我的这些缺点有些改善。我在写新的程序时,首先要考虑的深入一点、仔细一点,这样修改程序的时间就会少很多。并且也不会因为自己不细心而导致浪费时间的情况出现。
通过这次数据结构的课程设计,加强了我的动手能力,以及提升了局部和统一考虑问题的思维方式。回顾起此次课程设计,至今我仍感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,可以说既辛苦,又受益匪浅,学到很多很多的东西,同时不仅巩固了以前所学过的知识,而且学到了很多在书本上没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到很多问题,可以说是困难重重,毕竟是第一次做,难免会遇到各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,等等。总的来说,这次公交换乘的课程设计虽然困难重重,但是在百度,老师,同学的帮助下让我学会了很多东西,收获很大。
六、 参考资料
王红梅,胡明,王涛.《数据结构(C++版)》[M],清华大学出版社,2013.
Welcome To
Download !!!
欢迎您的下载,资料仅供参考!
展开阅读全文