数据结构课程设计说明书 公交乘车.doc_第1页
数据结构课程设计说明书 公交乘车.doc_第2页
数据结构课程设计说明书 公交乘车.doc_第3页
数据结构课程设计说明书 公交乘车.doc_第4页
数据结构课程设计说明书 公交乘车.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构与算法设计课程设计任务书题 目公交咨询程序学生姓名孙宝琳学号200701030124专业班级数学0701设计内容与要求【问题描述】 利用图实现公交咨询系统,包括公交线路查询、站点查询以及最优乘车方案的查询。【软件功能】1 从文件中接收图和公交车信息;2 可实现确定公交线路查询,即输出该车的所有站点;3 可以对某一个站点进行查询输出该站点的所有下一站;4 可以对乘车方案进行查询,即输出确定起点,终点的最优乘车方案,换车输出换车次数及换车站点;【算法思想】设计公交车类(车号,路程长度,终点站)、图类(站点名,公交车类,现有路线条数,现有站点数)、Dijkstra算法类(最短路径上的最后一个站点,最短路径的站点数);从文件中接收内容并对图和公交车进行初始化,公交线路查询在图中找到起点站,按顺序输出所有公交车号相同的站点;乘车方案中利用Dijkstra算法算出最优路线,并有最短路径的最后一个站点将路径上的所有站点入栈,出站时判断是否换车并输出方案;【提交成果】1.“数据结构与算法设计课程设计任务书”一份,打印装袋;2.“数据结构与算法设计课程设计报告”一份,打印装袋;3、上面两项内容的word文档,通过电子邮件交到指导教师。起止时间2009 年 6 月 8 日 至 2009 年6月 19 日指导教师签名年 月 日系(教研室)主任签名年 月 日学生签名孙宝琳 2009年 6月18 日数据结构与算法设计课程设计专业 数学与应用数学 班级 数学0701 学号 200701030124 姓名 孙宝琳 完成日期 6.18 指导教师(签名)1、 程序设计说明书【设计题目】公交咨询程序【问题描述】利用图实现公交咨询系统,包括公交线路查询、站点查询以及最优乘车方案的查询。【软件功能】1 从文件中接收图和公交车信息;2 可实现确定公交线路查询,即输出该车的所有站点;3 可以对某一个站点进行查询输出该站点的所有下一站;4 可以对乘车方案进行查询,即输出确定起点,终点的最优乘车方案,换车输出换车次数及换车站点;【算法思想】 设计公交车类(车号,路程长度,终点站),图类(站点名,公交车类,现有路线条数,现有站点数),Dijkstra算法类(最短路径上的最后一个站点,最短路径的站点数);从文件中接收内容并对图和公交车进行初始化,公交线路查询在图中找到起点站,按顺序输出所有公交车号相同的站点;乘车方案中利用Dijkstra算法算出最优路线并有最短路径的最后一个站点输出乘车方案;【类的设计】 struct Bus /公交车类int number; /公交车号int length; /总站数char bus_stateMaxstate20; /站点;class Graph /建立无向图friend class Distance; /声明友元类private:char statenameMaxstate20; /站点int busnumberMaxstateMaxstate; /邻接矩阵,权值为这两个站点的公交车号int currentstate; /当前站点数int currentbus; /当前公交车数Bus busesMaxbus; /公交车信息public:Graph() ; /无参构造函数,对成员变量初始化 void Insertstate(char state);/插入一个站点void Insertbusnumber(char V1,char V2,int busnum) ;/插入权值void Set_graph() ; /图的建立bool IsGraphFull() ; /判断图是否已满void show_busmessage(int number); /输出公交信息int searchbusnumber(char v0,char v1) ; /查找指定站点的公交车号码void direction(char v0,char v1) ; /输出指定站点的公交车方向friend void busline(); /把外部函数定义为图的友元函数,以便使用图的私有成员变量friend void searchstate();friend void bestproject();friend void mainsurface();class StackNode /栈结点friend class Stack; /友元类private: char date20; /结点数据StackNode *link; /结点链指针public:/构造函数:结点赋值StackNode (char d =0,StackNode *l =NULL);;class Stack /定义栈private:StackNode *top; /栈顶指针public:Stack ( ) :top(NULL) /构造函数Stack ( ); /析构void Push(char item); /进栈int Pop(char x);/退栈int GetTop(char x); /读取栈顶元素void MakeEmpty (); /把栈置空int IsEmpty() ;class Distance:public Graph /定义最短距离类private:char path20; /最短距离的前一站int distanceMaxstate; /最短距离public:void bestchooce(char v0,char v1); /最优方案;【存储结构设计】 使用邻接矩阵int busnumberMaxstateMaxstate;存储图的信息;公交车信息采用结构体数组Bus busesMaxbus;存储;栈使用链表来实现;【模块划分及调用关系】Main() Mainsurface()退出Bestproject()Searchstate()Busline()共有三个模块:公交线路查询Busline()、站点查询Searchstate()、最优方案Bestproject()【模块流程图】1. Busline(): Set_graph()Mainsurface()特定车号的路线查询所有路线浏览循环输出当前车接收车号 存在 存 存在 输出公交车信息show_busmessage()2 searchstate():Set_graph() 否 接收站点Mainsurface()在图内查找有站点名所到的车及方向3 bestproject(): 无路径 有路径 栈为空 是 车相同接收起始站Bestchooce()Set_graph()Dijkstra算法Mainsurface()对路径上的站入栈出栈判断是否是换车输出换车信息输出路径Mainsurface()【界面设计】 采用简单的人机会话,使操作简单明了;【用户手册】 在程序所在文件夹下建立“公交查询.txt”,并输入以下内容: 30世家星城-通讯学院-石油公寓-潘家庄-明德门-杨家村-城南客运站-西八里村-医学院-纬二街-雁南路-大雁塔-赛格电脑城-李家村-和平门-大差市-五路口-火车站;603电视塔-国展中心-吴家坟-八里村-纬二街-小寨-长安立交-省体育场-草场坡-南稍门-南门-钟楼-北门-火车站;37城北客运站-公交六公司-方新村-龙首村-北关-钟楼-东门-兴庆路-建工路-幸福路南口;(每一个车的线路占一行); 编译运行程序,根据提示执行程序;要想有更为准确的方案,可以在“公交查询.txt”中加入公交车线路;2、 程序上机调试报告【语法错误及其排除】1 函数赋值时,将变量赋给了指针; 使用指针传值;2 在出栈时没有判断栈是否为空,导致top指空 在出栈前判断IsEmpty();【算法错误及其排除】1 在建立图中没有对a数组进行置空,导致数据混乱;在使用a之前对a数组赋空;2 在输出最优结果时 没有保留前一站使程序无法判断是否换车加入b数组保留前一站;3、 程序测试结果【测试数据】30世家星城-通讯学院-石油公寓-潘家庄-明德门-杨家村-城南客运站-西八里村-医学院-纬二街-雁南路-大雁塔-赛格电脑城-李家村-和平门-大差市-五路口-火车站;603电视塔-国展中心-吴家坟-八里村-纬二街-小寨-长安立交-省体育场-草场坡-南稍门-南门-钟楼-北门-火车站;37城北客运站-公交六公司-方新村-龙首村-北关-钟楼-东门-兴庆路-建工路-幸福路南口;(每一个车的线路占一行);【输出结果】1公交线路查询: 2 站点查询:3 最优方案:【程序性能评价】 使用简单;结果正确、明了;【性能改进方向】1. 将邻接矩阵改为三维,即在相同两站间由多个公交可以到达;2. 在站点里加入方位,即在寻找最优结果的时候可以不必将所有站点进行操作,加快运行速度;3. 在公交车类中加入收费,在最优结果输出时计算收费(有刷卡、投币、按站收费);【收获及体会】 通过这个程序的编写使我对c+中文件的操作、图的操作、栈的操作、查找等内容有了更深的理解,在编译的过程中也是我知道了自己的数据结构课程内容还很浅,还需要在努力;4、 源程序代码#include/文件库#include#include/字符串函数库const int Maxbus=100;/最大公交车数const int Maxstate=200;/最大站点数const int MaxValue=999;/最大值struct Bus /公交车类int number; /公交车号int length; /总站数char bus_stateMaxstate20; /站点;class Graph /建立无向图friend class Distance; /声明友元类private:char statenameMaxstate20; /站点int busnumberMaxstateMaxstate; /邻接矩阵,权值为这两个站点的公交车号int currentstate; /当前站点数int currentbus; /当前公交车数Bus busesMaxbus; /公交车信息public:Graph() /无参构造函数,对成员变量初始化for(int i=0;iMaxstate;i+)for(int j=0;jMaxstate;j+)if(i=j)busnumberij=-1; /自己到自己没有车elsebusnumberij=MaxValue; currentstate=0;currentbus=0;for(i=0;iMaxbus;i+)busesi.number=-1;busesi.length=0;void Insertstate(char state) /插入一个站点if(!IsGraphFull() /如果图没满for(int i=0;icurrentstate;i+) /查看该站是否已经存在if(strcmp(state,statenamei)=0)break;if(i=currentstate) /如果不存在,在站点数组后加入strcpy(statenamecurrentstate,state);for(i=0;icurrentstate;i+)busnumbercurrentstatei=MaxValue;busnumbericurrentstate=MaxValue;busnumbercurrentstatecurrentstate=-1;currentstate+; /当前数组加一void Insertbusnumber(char V1,char V2,int busnum) /插入权值for(int i=0;icurrentstate;i+) /查找站点if(strcmp(V1,statenamei)=0)break;for(int j=0;jcurrentstate;j+)if(strcmp(V2,statenamej)=0)break;if(i!=currentstate&j!=currentstate) /站点存在插入权值busnumberij=busnum;busnumberji=busnum;void Set_graph() /图的建立char ch700,a20;int j=0,k=0,i;for(i=0;i20;i+) /对a数组初始化ai=0;ifstream infile(公交查询.txt); /以读的方式打开文件if(!infile) /文件打开失败,则结束程序coutCantt open 公交查询.txtendl;exit(0);while(!infile.eof()¤tbusbusescurrentbus.number; /接收车号码infile.getline(ch,700); / 在文件中读取一行for(int i=0;chi!=;i+)if(chi!=-) /把站点暂存在a中aj+=chi;elsestrcpy(busescurrentbus.bus_statek+,a); /对公交车站点赋值Insertstate(a); /插入站点for(j=0;j20;j+)aj=0; /对a数组初始化j=0;strcpy(busescurrentbus.bus_statek+,a);Insertstate(a);busescurrentbus.length=k; /当前公交车长度赋值currentbus+; /当前公交车数加一k=0;j=0;for(i=0;icurrentbus;i+)for(k=0;kbusesi.length-1;k+) /插入权值Insertbusnumber(busesi.bus_statek,busesi.bus_statek+1,busesi.number);bool IsGraphFull() /判断图是否已满return currentstate=Maxstate;void show_busmessage(int number) /输出公交信息for(int i=0;icurrentbus;i+) /查找权值if(busesi.number=number)break;if(i=currentbus)cout查无此车!endl;else /找到,输出该公交车信息cout number路(busesi.bus_state0busesi.bus_statebusesi.length-1)endl;for(int j=0;jbusesi.length-1;j+)coutbusesi.bus_statej;coutbusesi.bus_statejendl;int searchbusnumber(char v0,char v1) /查找指定站点的公交车号码int i,j,numb;for(int k=0;kcurrentstate;k+) /查找站点if(strcmp(v0,statenamek)=0)i=k;if(strcmp(v1,statenamek)=0)j=k;numb=busnumberij; /在邻接矩阵中查找权值return numb;void direction(char v0,char v1) /输出指定站点的公交车方向int i,j,numb,l;for(int k=0;kcurrentstate;k+) /查找指定站点if(strcmp(v0,statenamek)=0)i=k;if(strcmp(v1,statenamek)=0)j=k;numb=busnumberij; for(l=0;lcurrentbus;l+) /查找该公交车位置if(numb=busesl.number)break;for(k=0;kbusesl.length;k+)if(strcmp(busesl.bus_statek,v0)=0)i=k;if(strcmp(busesl.bus_statek,v1)=0)j=k;if(ij) /输出公交车方向cout(busesl.bus_state0busesl.bus_statebusesl.length-1)endl;elsecout(busesl.bus_state0-busesl.bus_statebusesl.length-1)link; delete p; /释放栈顶结点void Stack :MakeEmpty ()/把栈置空 StackNode *p;while (top != NULL) /逐结点回收p=top; top=top-link; delete p; /释放栈顶结点void Stack:Push(char item )/进栈 StackNode *p =new StackNode ( item, top );/新结点p-link=top; /链入*top之前top = p; /成为新栈顶int Stack :Pop (char x ) /退栈 if ( IsEmpty ( ) ) return 0; StackNode *p = top; top = top-link; /修改栈顶指针strcpy(x,p-date); /送回退栈元素 delete p; return 1; /释放int Stack:GetTop (char x )/读取栈顶元素 if (IsEmpty() return 0;strcpy(x,top-date); /送回栈顶元素return 1; /释放 class Distance:public Graph /定义最短距离类private:char path20; /最短距离的前一站int distanceMaxstate; /最短距离public:void bestchooce(char v0,char v1) /最优方案int sMaxstate,v,i,j,w,start=-1,end=-1,number1,number2;char a20,b20;Stack stack1; /定义栈Set_graph(); /建立图for(i=0;icurrentstate;i+) / 查找起始站、终点站if(strcmp(statenamei,v0)=0) start=i;if(strcmp(statenamei,v1)=0)end=i;if(start=-1|end=-1)cout站点不存在!endl;bestproject();for( i=0;icurrentstate;i+) /初始化距离、前一站si=0; /s集合赋空if(busnumberstartiMaxValue)distancei=1;pathi=start;elsedistancei=busnumberstarti; /权值赋给最短距离pathi=-1;sstart=1; /起始站放入s集合distancestart=0;int min;for(i=0;icurrentstate;i+)min=MaxValue;for(w=0;wcurrentstate;w+) /在邻近的顶点中查找最短距离if(!sw&distancewmin)v=w;min=distancew; sv=1; for(j=0;jcurrentstate;j+)if(!sj&(min+1)distancej&busnumbervjMaxValue) /计算起点到每个站点的距离distancej=min+1;pathj=v;i=1;j=0;if(distanceend0) /两个站点有公交车cout 到达v1共有distanceend站,最优方案为:endl;do /对路径上的站点入栈stack1.Push(statenameend);end=pathend;while(end!=start);stack1.Pop(a); /出栈number1=searchbusnumber(v0,a); /查找两个站点的公交车号码cout 乘坐number1;direction(v0,a); /查找两站的公交方向coutv0a;while(!stack1.IsEmpty() /判断栈是否为空stack1.Pop(b); number2=searchbusnumber(a,b); /查找下两个站间的公交车号码if(number1=number2) /判断两个车是否是同一辆coutb;i+;else /不是同一辆,则换车if(i=1)cout 仅有一站,建议步行bendl;elsecout 共i站endl;cout 换乘 number2; /输出换车信息direction(a,b);number1=number2;coutab;i=1;j+;strcpy(a,b); /保留前一站if(i=1)cout 仅有一站,建议步行至bendl;elsecout 共i站0)cout 共换车j次,请注意换车的站点!endl;elseif(distanceend=0)cout您所在站点即为v0endl;elsecout从v0至v1无公交可到!endl;void bestproject() /最优方案Distance bestway;char start20,end20;coutstart;coutend;coutendl;bestway.bestchooce(start,end);mainsurface();void mainsurface() /主界面int flag;cout 欢迎使用公交咨询系统endl; /用户会话界面cout 1.公交线路查询endl;cout

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论