数据结构课程设计说明书公交乘车.docx

上传人:b****8 文档编号:10936694 上传时间:2023-02-23 格式:DOCX 页数:29 大小:144.47KB
下载 相关 举报
数据结构课程设计说明书公交乘车.docx_第1页
第1页 / 共29页
数据结构课程设计说明书公交乘车.docx_第2页
第2页 / 共29页
数据结构课程设计说明书公交乘车.docx_第3页
第3页 / 共29页
数据结构课程设计说明书公交乘车.docx_第4页
第4页 / 共29页
数据结构课程设计说明书公交乘车.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

数据结构课程设计说明书公交乘车.docx

《数据结构课程设计说明书公交乘车.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计说明书公交乘车.docx(29页珍藏版)》请在冰豆网上搜索。

数据结构课程设计说明书公交乘车.docx

数据结构课程设计说明书公交乘车

《数据结构与算法设计》

课程设计任务书

题目

公交咨询程序

学生姓名

孙宝琳

学号

200701030124

专业班级

数学0701

【问题描述】

利用图实现公交咨询系统,包括公交线路查询、站点查询以及最优乘车方案的查询。

【软件功能】

1.从文件中接收图和公交车信息;

2.可实现确定公交线路查询,即输出该车的所有站点;

3.可以对某一个站点进行查询输出该站点的所有下一站;

4.可以对乘车方案进行查询,即输出确定起点,终点的最优乘车方案,换车输出换车次数及换车站点;

【算法思想】

设计公交车类(车号,路程长度,终点站)、图类(站点名,公交车类,现有路线条数,现有站点数)、Dijkstra算法类(最短路径上的最后一个站点,最短路径的站点数);从文件中接收内容并对图和公交车进行初始化,公交线路查询——在图中找到起点站,按顺序输出所有公交车号相同的站点;乘车方案中利用Dijkstra算法算出最优路线,并有最短路径的最后一个站点将路径上的所有站点入栈,出站时判断是否换车并输出方案;

【提交成果】

1.“《数据结构与算法设计》课程设计任务书”一份,打印装袋;

2.“《数据结构与算法设计》课程设计报告”一份,打印装袋;

3、上面两项内容的word文档,通过电子邮件交到指导教师。

起止时间

2009年6月8日至2009年6月19日

指导教师签名

年月日

系(教研室)主任签名

年月日

学生签名

孙宝琳2009年6月18日

数据结构与算法设计课程设计

专业数学与应用数学班级数学0701学号************

姓名孙宝琳完成日期6.18指导教师(签名)

1、程序设计说明书

【设计题目】公交咨询程序

【问题描述】

利用图实现公交咨询系统,包括公交线路查询、站点查询以及最优乘车方案的查询。

【软件功能】

1从文件中接收图和公交车信息;

2可实现确定公交线路查询,即输出该车的所有站点;

3可以对某一个站点进行查询输出该站点的所有下一站;

4可以对乘车方案进行查询,即输出确定起点,终点的最优乘车方案,换车输出换车次数及换车站点;

【算法思想】

设计公交车类(车号,路程长度,终点站),图类(站点名,公交车类,现有路线条数,现有站点数),Dijkstra算法类(最短路径上的最后一个站点,最短路径的站点数);从文件中接收内容并对图和公交车进行初始化,公交线路查询——在图中找到起点站,按顺序输出所有公交车号相同的站点;乘车方案中利用Dijkstra算法算出最优路线并有最短路径的最后一个站点输出乘车方案;

【类的设计】

structBus//公交车类

{

intnumber;//公交车号

intlength;//总站数

charbus_state[Maxstate][20];//站点

};

classGraph//建立无向图

{

friendclassDistance;//声明友元类

private:

charstatename[Maxstate][20];//站点

intbusnumber[Maxstate][Maxstate];//邻接矩阵,权值为这两个站点的公交车号

intcurrentstate;//当前站点数

intcurrentbus;//当前公交车数

Busbuses[Maxbus];//公交车信息

public:

Graph();//无参构造函数,对成员变量初始化

voidInsertstate(charstate[]);//插入一个站点

voidInsertbusnumber(charV1[],charV2[],intbusnum);//插入权值

voidSet_graph();//图的建立

boolIsGraphFull();//判断图是否已满

voidshow_busmessage(intnumber);//输出公交信息

intsearchbusnumber(charv0[],charv1[]);//查找指定站点的公交车号码

voiddirection(charv0[],charv1[]);//输出指定站点的公交车方向

friendvoidbusline();//把外部函数定义为图的友元函数,以便使用图的私有成员变量

friendvoidsearchstate();

friendvoidbestproject();

friendvoidmainsurface();

};

classStackNode//栈结点

{

friendclassStack;//友元类

private:

chardate[20];//结点数据

StackNode*link;//结点链指针

public:

//构造函数:

结点赋值

StackNode(chard[]=0,StackNode*l=NULL);

};

classStack//定义栈

{

private:

StackNode*top;//栈顶指针

public:

Stack():

top(NULL){}//构造函数

~Stack();//析构

voidPush(charitem[]);//进栈

intPop(charx[]);//退栈

intGetTop(charx[]);//读取栈顶元素

voidMakeEmpty();//把栈置空

intIsEmpty();

};

classDistance:

publicGraph//定义最短距离类

{

private:

charpath[20];//最短距离的前一站

intdistance[Maxstate];//最短距离

public:

voidbestchooce(charv0[],charv1[]);//最优方案

};

【存储结构设计】

使用邻接矩阵intbusnumber[Maxstate][Maxstate];存储图的信息;

公交车信息采用结构体数组Busbuses[Maxbus];存储;

栈使用链表来实现;

【模块划分及调用关系】

共有三个模块:

公交线路查询Busline()、站点查询Searchstate()、最优方案Bestproject()

【模块流程图】

1.

Busline():

 

存在

2searchstate():

3bestproject():

【界面设计】

采用简单的人机会话,使操作简单明了;

【用户手册】

在程序所在文件夹下建立“公交查询.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//字符串函数库

constintMaxbus=100;//最大公交车数

constintMaxstate=200;//最大站点数

constintMaxValue=999;//最大值

structBus//公交车类

{

intnumber;//公交车号

intlength;//总站数

charbus_state[Maxstate][20];//站点

};

classGraph//建立无向图

{

friendclassDistance;//声明友元类

private:

charstatename[Maxstate][20];//站点

intbusnumber[Maxstate][Maxstate];//邻接矩阵,权值为这两个站点的公交车号

intcurrentstate;//当前站点数

intcurrentbus;//当前公交车数

Busbuses[Maxbus];//公交车信息

public:

Graph()//无参构造函数,对成员变量初始化

{

for(inti=0;i

for(intj=0;j

{

if(i==j)

busnumber[i][j]=-1;//自己到自己没有车

else

busnumber[i][j]=MaxValue;

}

currentstate=0;

currentbus=0;

for(i=0;i

{

buses[i].number=-1;

buses[i].length=0;

}

}

voidInsertstate(charstate[])//插入一个站点

{

if(!

IsGraphFull())//如果图没满

{

for(inti=0;i

if(strcmp(state,statename[i])==0)

break;

if(i==currentstate)//如果不存在,在站点数组后加入

{

strcpy(statename[currentstate],state);

for(i=0;i

{

busnumber[currentstate][i]=MaxValue;

busnumber[i][currentstate]=MaxValue;

}

busnumber[currentstate][currentstate]=-1;

currentstate++;//当前数组加一

}

}

}

voidInsertbusnumber(charV1[],charV2[],intbusnum)//插入权值

{

for(inti=0;i

if(strcmp(V1,statename[i])==0)

break;

for(intj=0;j

if(strcmp(V2,statename[j])==0)

break;

if(i!

=currentstate&&j!

=currentstate)//站点存在插入权值

{

busnumber[i][j]=busnum;

busnumber[j][i]=busnum;

}

}

voidSet_graph()//图的建立

{

charch[700],a[20];

intj=0,k=0,i;

for(i=0;i<20;i++)//对a数组初始化

a[i]='\0';

ifstreaminfile("公交查询.txt");//以读的方式打开文件

if(!

infile)//文件打开失败,则结束程序

{

cout<<"Cant'topen'公交查询.txt'"<

exit(0);

}

while(!

infile.eof()&¤tbus

{

infile>>buses[currentbus].number;//接收车号码

infile.getline(ch,700);//在文件中读取一行

for(inti=0;ch[i]!

=';';i++)

{

if(ch[i]!

='-')//把站点暂存在a中

a[j++]=ch[i];

else

{

strcpy(buses[currentbus].bus_state[k++],a);//对公交车站点赋值

Insertstate(a);//插入站点

for(j=0;j<20;j++)

a[j]='\0';//对a数组初始化

j=0;

}

}

strcpy(buses[currentbus].bus_state[k++],a);

Insertstate(a);

buses[currentbus].length=k;//当前公交车长度赋值

currentbus++;//当前公交车数加一

k=0;

j=0;

}

for(i=0;i

for(k=0;k

Insertbusnumber(buses[i].bus_state[k],buses[i].bus_state[k+1],buses[i].number);

}

boolIsGraphFull()//判断图是否已满

{

returncurrentstate==Maxstate;

}

voidshow_busmessage(intnumber)//输出公交信息

{

for(inti=0;i

if(buses[i].number==number)

break;

if(i==currentbus)

cout<<"查无此车!

"<

else

{//找到,输出该公交车信息

cout<<""<"<

for(intj=0;j

cout<";

cout<

}

}

intsearchbusnumber(charv0[],charv1[])//查找指定站点的公交车号码

{

inti,j,numb;

for(intk=0;k

{

if(strcmp(v0,statename[k])==0)

i=k;

if(strcmp(v1,statename[k])==0)

j=k;

}

numb=busnumber[i][j];//在邻接矩阵中查找权值

returnnumb;

}

voiddirection(charv0[],charv1[])//输出指定站点的公交车方向

{

inti,j,numb,l;

for(intk=0;k

{

if(strcmp(v0,statename[k])==0)

i=k;

if(strcmp(v1,statename[k])==0)

j=k;

}

numb=busnumber[i][j];

for(l=0;l

if(numb==buses[l].number)

break;

for(k=0;k

{

if(strcmp(buses[l].bus_state[k],v0)==0)

i=k;

if(strcmp(buses[l].bus_state[k],v1)==0)

j=k;

}

if(i

cout<<"("<"<

else

cout<<"("<

}

friendvoidbusline();//把外部函数定义为图的友元函数,以便使用图的私有成员变量

friendvoidsearchstate();

friendvoidbestproject();

friendvoidmainsurface();

};

classStackNode//栈结点

{

friendclassStack;//友元类

private:

chardate[20];//结点数据

StackNode*link;//结点链指针

public:

//构造函数:

结点赋值

StackNode(chard[]=0,StackNode*l=NULL):

link(l)

{

strcpy(date,d);

}

};

classStack//定义栈

{

private:

StackNode*top;//栈顶指针

public:

Stack():

top(NULL){}//构造函数

~Stack();//析构

voidPush(charitem[]);//进栈

intPop(charx[]);//退栈

intGetTop(charx[]);//读取栈顶元素

voidMakeEmpty();//把栈置空

intIsEmpty()

{

returntop==NULL;

}

};

Stack:

:

~Stack()

{

StackNode*p;

while(top!

=NULL)

{//逐结点回收

p=top;

top=top->link;

deletep;//释放栈顶结点

}

}

voidStack:

:

MakeEmpty()//把栈置空

{

StackNode*p;

while(top!

=NULL)

{//逐结点回收

p=top;

top=top->link;

deletep;//释放栈顶结点

}

}

voidStack:

:

Push(charitem[])//进栈

{

StackNode*p=newStackNode(item,top);//新结点

p->link=top;//链入*top之前

top=p;//成为新栈顶

}

intStack:

:

Pop(charx[])//退栈

{

if(IsEmpty())return0;

StackNode*p=top;

top=top->link;//修改栈顶指针

strcpy(x,p->date);//送回退栈元素

deletep;

return1;//释放

}

intStack:

:

GetTop(charx[])//读取栈顶元素

{

if(IsEmpty())return0;

strcpy(x,top->date);//送回栈顶元素

return1;//释放

}

classDistance:

publicGraph//定义最短距离类

{

private:

charpath[20];//最短距离的前一站

intdistance[Maxstate];//最短距离

public:

voidbestchooce(charv0[],charv1[])//最优方案

{

ints[Maxstate],v,i,j,w,start=-1,end=-1,number1,number2;

chara[20],b[20];

Stackstack1;//定义栈

Set_graph();//建立图

for(i=0;i

{

if(strcmp(statename[i],v

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1