收藏 分享(赏)

全国交通咨询模拟程序设计.doc

上传人:cjc2202537 文档编号:4587003 上传时间:2019-01-03 格式:DOC 页数:59 大小:283.50KB
下载 相关 举报
全国交通咨询模拟程序设计.doc_第1页
第1页 / 共59页
全国交通咨询模拟程序设计.doc_第2页
第2页 / 共59页
全国交通咨询模拟程序设计.doc_第3页
第3页 / 共59页
全国交通咨询模拟程序设计.doc_第4页
第4页 / 共59页
全国交通咨询模拟程序设计.doc_第5页
第5页 / 共59页
点击查看更多>>
资源描述

1、 全国交通咨询模拟程序设计设计人: 啊 目录一、 绪论1二、 实验实现功能2三、 概要设计2四、 详细设计3五、 程序10六、 运行结果54七、 小结56一、绪论1、 设计题目:全国交通咨询模拟2、设计目的1、掌握 C 语言中对文件的操作方法,巩固结构体数据的定义和使用方法2、进一步熟悉图的定义、存储方法、遍历、最小生成树的相关知识,灵活利用图的相关知识解决现实生活中的实际问题。3、需求分析1、提供对城市信息进行编辑(如:添加或删除)的功能。2、城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。3、提供两种最优决策:最快到达和最省钱到达。全程只考虑一种

2、交通工具4、旅途中耗费的总时间应该包括中转站的等候时间。4、概要设计1、设计一个类,包含城市、航班、列车的信息,并能对其进行添加或删除操作2、用户咨询系统包括城市、列车、航班信息,根据用户选择不同使用不同指针指向程序3、设计一个函数,能够提供时间、费用、中转(任意一个)在最少的情况下的信息二、实现功能功能结构图如下:全国交通咨询系统登陆系统管理员 用户咨询 显示交通 退出系统三、概要设计系统用到的抽象数据类型定义:1).ADT Graph数据对象 V:一个集合,该集合中的所有元素具有相同的特性数据关系 R:R=VRVR=|P(x,y)(x,y 属于 V)基本操作:(1)initgraph(kv

3、exnum;k+)if(第 k 个结点中的城市名与传过来的城市名相同)j=k;/*记录位置*/break;返回 k 的数值;int CreatGraph(ALGraph *G)if(打开城市文件,文件指针返回值为空)输出错误文件信息;程序返回值为 0;while(文件不为空)将文件指针所指的字符串读到城市名数组 cityi中;i+;关闭文件;j=0;while(jvexnum=i;打开航班信息文件“plane.txt“;将文件中的内容以块为单位读到缓冲区数组 a 中;关闭文件;a 的计数变量 k=0;弧的计数变量 arc_num=0;while(kverticesi.planfirstarc;

4、m=0;while(q!=NULL)if( 弧 q 中的邻接顶点与 j 相等)将数组 ai 中的内容都复制到弧 q 中;m=1;break;q=q-nextarc;if(m=0);开辟一个弧结点;将数组 ai中的内容都复制到新的弧结点中;将弧结点连接到适当的位置中去;arc_num+;k+;G-planarcnum=arc_num;打开列车信息文件“plane.txt“;将文件中的内容以块为单位读到缓冲区数组 a 中;关闭文件;a 的计数变量 k=0;弧的计数变量 arc_num=0;while(kverticesi.trainfirstarc;m=0;while(q!=NULL)if( 弧

5、q 中的邻接顶点与 j 相等)将数组 ai 中的内容都复制到弧 q 中;m=1;break;q=q-nextarc;if(m=0);开辟一个弧结点;将数组 ai中的内容都复制到新的弧结点中;将弧结点连接到适当的位置中去;arc_num+;k+;G-trainarcnum=arc_num;返回; 2.创建航班算法的伪码描述如下:creatplanefile()while(flag) /*flag 为标志位,初值为 1*/ 提示“输入航班信息” ;输入航班 code;输入航班的出发城市 vt;输入航班的到达城市 vh;输入机票价格 money;输入航班的出发时间 bt;输入航班的到达时间 at;a

6、.count.co=code; /* a 为程序头部定义的结构体*/ strcpy(a.count.vt,vt);strcpy(a.count.vh,vh);a.count.bt=bt;a.count.at=at;a.count.mo=money;计数值 count+1;提示“是否要继续输入航班信息:” ;scanf(“%d”,if(航班文件不能以读写形式打开)提示“无法打开文件” ;将计数值 count 写入航班车文件;for(i=0;iadjvex )i)将该弧指向顶点位置-1;q=p;p 指向下一条飞机弧;else if(该弧指向的顶点位置(p-adjvex )= = i)if(p 指向

7、图 G 中 k 结点的第一条飞机弧) m=p;将图 G 中 k 结点的第二条飞机弧改为第一弧;p 指向下一条飞机弧;释放(m) ;else 将 p 的下一条弧赋给 q 的下一条弧;m=p;p 指向下一条飞机弧;释放(q) ; elseq=p;p 指向下一条飞机弧; /*以下是删除所有指向此结点的列车弧*/for(k=0;kadjvex )i)将该弧指向顶点位置-1;q=p;p 指向下一条列车弧;else if(该弧指向的顶点位置(p-adjvex )=i)if(p 指向图 G 中 k 结点的第一条列车) m=p;将图 G 中 k 结点的第二条列车弧改为第一弧;p 指向下一条列车弧;释放(m)

8、;else 将 p 的下一条弧赋给 q 的下一条;m=p;p 指向下一条列车弧;释放(q) ; elseq=p;p 指向下一条列车弧;图 G 表头结点总个数-1;else return; 4.求城市 v0,v1 之间的最少费用算法的伪码描述如下:ExpenditureDispose( )for(v=0;vm+城市 v 到 w 的最少费用)*(D+w)=m+城市 v 到 w 的最少费用;将城市 w 的路径改成城市 v 的路径并在最后加入城市 w;输出没有列车或飞机从城市 v0 到 v1; 5.最少中转次数算法的伪码描述如下:求城市 v0 到城市 v1 的最少中转次数TransferDispose

9、( )for(v=0;v从城市 v0 到城市 w 的最少时间)*(D+w)=从城市 v0 到城市 w 的最少时间;else将城市 w 的路径还原;输出没有列车或飞机从城市 v0 到 v1;五、程序:#include“stdio.h“#include“stdlib.h“#include“string.h“#define MAX_VERTEX_NUM 18#define NULL 0#define MAX_ARC_SIZE 100#define MAX_ROUTE_NUM 5#include“stdio.h“#include“stdlib.h“#include“string.h“#define F

10、alse 0#define True 1#define INFINITY 10000typedef structint number;float expenditure;int begintime2;int arrivetime2;Vehide;typedef structVehide stataMAX_ROUTE_NUM;int last;infolist;typedef struct ArcNodeint adjvex;struct ArcNode *nextarc;infolist info;ArcNode;typedef struct VNodechar cityname10;ArcN

11、ode *planefirstarc,*trainfirstarc;VNode,AdjListMAX_VERTEX_NUM;typedef structAdjList vertices;int vexnum,planearcnum,trainarcnum;ALGraph;typedef struct Nodeint adjvex;int route;struct Node *next;Node;typedef struct QNodeint adjvex;struct QNode *next;QNode;typedef structQNode *front;QNode *rear;LinkQu

12、eue;typedef struct TimeNodeint adjvex;int route;int begintime2;int arrivetime2;struct TimeNode *childMAX_ROUTE_NUM;TimeNode,*TimeTree;struct arcint co;char vt10;char vh10;int bt2;int at2;float mo;aMAX_ARC_SIZE;char cityMAX_VERTEX_NUM10;int TTime2;int time2;int time12;int time22;int cMAX_VERTEX_NUM;i

13、nt dMAX_VERTEX_NUM;void Administer(ALGraph *G);void cityedit(ALGraph *G);void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph(ALGraph *G);void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist (*arcs)MAX_VERTEX_NUM);void createtrainfile();i

14、nt DeleteplaneArc(ALGraph *G);void DeleteQueue(LinkQueue *Q,int *x);int DeletetrainArc(ALGraph *G);void DeleteVertex(ALGraph *G);void DemandDispose(int n,ALGraph G);void DestoryTimeTree(TimeTree p);void EnterplaneArc(ALGraph *G);void EnterQueue(LinkQueue *Q,int x);void EntertrainArc(ALGraph *G);void

15、 EnterVertex(ALGraph *G);void ExpenditureDispose(int k,infolist (*arcs)MAX_VERTEX_NUM,ALGraph G,int v0,int v1,float *M,int *final);void flightedit(ALGraph *G);void initgraph(ALGraph *G);void InitQueue(LinkQueue *Q);int IsEmpty(LinkQueue *Q);int LocateVertex(ALGraph *G,char *v);void MinExpenditure(in

16、folist arcs,float *expenditure,int *route);void MinTime(infolist arcs,int *time,int *route);void PrintGraph(ALGraph *G);int save(ALGraph *G);void TimeDispose(int k,infolist (*arcs)MAX_VERTEX_NUM,ALGraph G,int v0,int v1,int (*T)2,int *final);void TimeTreeDispose(Node *head,infolist (*arcs)MAX_VERTEX_

17、NUM);void trainedit(ALGraph *G);void TransferDispose(int k,infolist (*arcs)MAX_VERTEX_NUM,ALGraph G,int v0,int v1);void UserDemand(ALGraph G);void VisitTimeTree(TimeTree p);int main()/*显示程序功能选择界面*/ALGraph G;int i;printf(“请选择程序功能:n“);printf(“1=管理员管理n2=用户咨询n3=显示交通系统n4=退出n“);printf(“选择?“);scanf(“%d“,ge

18、tchar();while(i!=4)switch(i)case 1:Administer(break;case 2:UserDemand(G);break;case 3:PrintGraph(break;printf(“n 请选择程序功能:n“);printf(“1=管理员管理n2=用户咨询n3=显示交通系统n4=退出n“);printf(“选择?“);scanf(“%d“,getchar();return 1;void Administer(ALGraph *G)/*显示管理员管理项目选择界面*/int i;printf(“n 请选择管理项目:n“);printf(“1=初始化交通系统n2

19、=城市编辑n3=飞机航班编辑n4=列车车次编辑n5=返回上一级菜单n“);printf(“选择?“);scanf(“%d“,getchar();while(i!=5) switch(i)case 1:initgraph(G); /初始化交通系统break;case 2:cityedit(G); /城市编辑break;case 3:flightedit(G); /飞机航班编辑break; case 4:trainedit(G); /列车车次编辑break; printf(“n 请选择管理项目:n“);printf(“1=初始化交通系统n2=城市编辑n3=飞机航班编辑n4=列车车次编辑n5=返回上

20、一级菜单n“);printf(“选择?“);scanf(“%d“,getchar();void initgraph(ALGraph *G) /初始化交通系统/*初始化交通系统方式选择界面*/int i;printf(“n 请选择初始化方式:n“);printf(“1=键盘n2=文档n“);printf(“选择?“);scanf(“%d“,getchar();switch(i)case 1:createcityfile();createplanefile();createtrainfile();CreateGraph(G);break;case 2:CreateGraph(G);break;vo

21、id createcityfile()/*创建城市名称文档*/int i=0;int j;char flag=y;FILE *fp;printf(“n 请输入城市名称的信息:n“);while(flag=y|flag=Y)printf(“城市名称:“);gets(cityi);i+;printf(“继续输入?(Y/N)“);scanf(“%c“,getchar();printf(“n“);if(fp=fopen(“city.txt“,“wb“)=NULL)printf(“无法打开文件!n“);return;for(j=0;j=24|bt1=60)printf(“n 时间输入有误,请重新输入n“

22、);scanf(“%d:%d“,getchar();printf(“到达时间:“); /输入航班的到达时间 atscanf(“%d:%d“,getchar();while(at0=24|at1=60)printf(“n 时间输入有误,请重新输入n“);scanf(“%d:%d“,getchar();acount.co=code; / a 为程序头部定义的结构体strcpy(acount.vt,vt);strcpy(acount.vh,vh);acount.bt0=bt0;acount.bt1=bt1;acount.at0=at0;acount.at1=at1;acount.mo=money;c

23、ount+; /计数值 count+1printf(“继续输入?(Y/N)“); /提示“是否要继续输入航班信息:“scanf(“%c“,getchar();printf(“n“);if(fp=fopen(“plane.txt“,“wb“)=NULL) /航班文件不能以读写形式打开printf(“n 无法打开文件!n“); /提示“无法打开文件“fprintf(fp,“%d“,count); /将计数值 count 写入航班车文件for(i=0;i=24|bt1=60)printf(“n 时间输入有误,请重新输入n“);scanf(“%d:%d“,getchar();printf(“到达时间:

24、“);scanf(“%d:%d“,getchar();while(at0=24|at1=60)printf(“n 时间输入有误,请重新输入n“);scanf(“%d:%d“,getchar();acount.co=code;strcpy(acount.vt,vt);strcpy(acount.vh,vh);acount.bt0=bt0;acount.bt1=bt1;acount.at0=at0;acount.at1=at1;acount.mo=money;count+;printf(“继续输入?(Y/N)“);scanf(“%c“,getchar();printf(“n“);if(fp=fop

25、en(“train.txt“,“wb“)=NULL)printf(“n 无法打开文件!n“);fprintf(fp,“%d“,count);for(i=0;ivexnum;k+)if(strcmp(G-verticesk.cityname,v)=0) /第 k 个结点中的城市名与传过来的城市名相同j=k; /*记录位置*/break;return(j);void CreateGraph(ALGraph *G)/*用 city,plan,train 三个文档创建城市交通系统*/int i,j,k;int arc_num;int count1,count2;int m,t;ArcNode *p,*

26、q;FILE *fp;i=0;if(fp=fopen(“city.txt“,“rb“)=NULL) /打开城市文件,文件指针返回值为空printf(“n 无法打开文件!n“);return;while(!feof(fp) /文件不为空fscanf(fp,“%10s“,cityi);i+;fclose(fp); /关闭文件j=0;while(jverticesj.cityname,cityj);/将 cityi 中的内容复制到图的结构体的结点数组中;G-verticesj.planefirstarc=NULL; / 图的结构体其他项赋初值;G-verticesj.trainfirstarc=NU

27、LL;j+;G-vexnum=i;if(fp=fopen(“plane.txt“,“rb“)=NULL)printf(“n 无法打开文件!n“);k=0;fscanf(fp,“%d“, /打开航班信息文件“plane.txt“while(kverticesi.planefirstarc;m=0;while(q!=NULL)if(q-adjvex=j) /弧 q 中的邻接顶点与 j 相等t=q-info.last+1; / 将数组 ai 中的内容都复制到弧 q 中q-info.statat.number=ak.co;q-info.statat.expenditure=ak.mo;q-info.s

28、tatat.begintime0=ak.bt0;q-info.statat.begintime1=ak.bt1;q-info.statat.arrivetime0=ak.at0;q-info.statat.arrivetime1=ak.at1;q-info.last=t;m=1;break;q=q-nextarc;if(m=0)p=(ArcNode*)malloc(sizeof(ArcNode); /开辟一个弧结点p-adjvex=j; /将数组 ai中的内容都复制到新的弧结点中p-info.stata0.number=ak.co;p-info.stata0.expenditure=ak.mo

29、;p-info.stata0.begintime0=ak.bt0;p-info.stata0.begintime1=ak.bt1;p-info.stata0.arrivetime0=ak.at0;p-info.stata0.arrivetime1=ak.at1;p-info.last=0;p-nextarc=G-verticesi.planefirstarc;G-verticesi.planefirstarc=p; / 将弧结点连接到适当的位置中去arc_num+;k+;G-planearcnum=arc_num;if(fp=fopen(“train.txt“,“rb“)=NULL)print

30、f(“n 无法打开文件!n“);return;k=0;fscanf(fp,“%d“, /打开列车信息文件“plane.txt“while(kverticesi.trainfirstarc;m=0;while(q!=NULL)if(q-adjvex=j) /弧 q 中的邻接顶点与 j 相等t=q-info.last+1; /将数组 ai 中的内容都复制到弧 q 中q-info.statat.number=ak.co;q-info.statat.expenditure=ak.mo;q-info.statat.begintime0=ak.bt0;q-info.statat.begintime1=ak

31、.bt1;q-info.statat.arrivetime0=ak.at0;q-info.statat.arrivetime1=ak.at1;q-info.last=t;m=1;break;q=q-nextarc;if(m=0)p=(ArcNode*)malloc(sizeof(ArcNode); /开辟一个弧结点p-adjvex=j; /将数组 ai中的内容都复制到新的弧结点中p-info.stata0.number=ak.co;p-info.stata0.expenditure=ak.mo;p-info.stata0.begintime0=ak.bt0;p-info.stata0.begi

32、ntime1=ak.bt1;p-info.stata0.arrivetime0=ak.at0;p-info.stata0.arrivetime1=ak.at1;p-info.last=0;p-nextarc=G-verticesi.trainfirstarc;G-verticesi.trainfirstarc=p; /将弧结点连接到适当的位置中去arc_num+;k+;G-trainarcnum=arc_num;int save(ALGraph *G)/*保存城市交通系统到相应的文档*/int i,j,k,t;ArcNode *q;FILE *fp;j=0;while(jvexnum)strc

33、py(cityj,G-verticesj.cityname);j+;i=0;if(fp=fopen(“city.txt“,“wb“)=NULL)printf(“n 错误,无法打开文件!n“);while(ivexnum)fprintf(fp,“%10s“,cityi);i+;fclose(fp);k=0;for(i=0;ivexnum;i+)q=G-verticesi.planefirstarc;while(q!=NULL)for(t=0;tinfo.last;t+)strcpy(ak.vt,G-verticesi.cityname);strcpy(ak.vh,G-verticesq-adjv

34、ex.cityname);ak.co=q-info.statat.number;ak.mo=q-info.statat.expenditure;ak.bt0=q-info.statat.begintime0;ak.bt1=q-info.statat.begintime1;ak.at0=q-info.statat.arrivetime0;ak.at1=q-info.statat.arrivetime1;k+;q=q-nextarc;if(fp=fopen(“plane.txt“,“wb“)=NULL)printf(“n 无法打开文件!n“);return 0;i=0;fprintf(fp,“%d

35、“,k);while(ivexnum;i+)q=G-verticesi.trainfirstarc;while(q!=NULL)for(t=0;tinfo.last;t+)strcpy(ak.vt,G-verticesi.cityname);strcpy(ak.vh,G-verticesq-adjvex.cityname);ak.co=q-info.statat.number;ak.mo=q-info.statat.expenditure;ak.bt0=q-info.statat.begintime0;ak.bt1=q-info.statat.begintime1;ak.at0=q-info.

36、statat.arrivetime0;ak.at1=q-info.statat.arrivetime1;k+; q=q-nextarc;if(fp=fopen(“train.txt“,“wb“)=NULL)printf(“n 无法打开文件!n“);return 0;i=0;fprintf(fp,“%d“,k);while(i=0return;elseprintf(“n 确认?(Y/N)“);c=getchar();getchar();if(c=Y|c=y)i=G-vexnum;strcpy(G-verticesi.cityname,v);G-verticesi.planefirstarc=NU

37、LL;G-verticesi.trainfirstarc=NULL;G-vexnum=i+1;save(G);elsereturn;void DeleteVertex(ALGraph *G) / G 是程序头部定义的结构体/*删除城市*/int i,j,k,n;char v10,c;ArcNode *p,*q,*m;printf(“n 请输入删除的城市:“); /提示“输入删除城市名“gets(v);printf(“n 确认?(Y/N)“); /提示“是否确定要删除(Y/N)“c=getchar();getchar();if(c=Y|c=y)n=0; /0 是记数标志,控制循环次数while(

38、nvexnum /提示“无法找到此城市“elsei=LocateVertex(G,v); /利用 G 函数找到此城市名所处在 G 中位置p=G-verticesi.planefirstarc;while(p!=NULL)q=p;p=p-nextarc;free(q); /删除从此结点出发的所有航班弧p=G-verticesi.trainfirstarc;while(p!=NULL)q=p;p=p-nextarc;free(q); /删除从此结点出发的所有列车弧for(j=i;jvexnum-1;j+)strcpy(G-verticesj.cityname,G-verticesj+1.cityn

39、ame); /将 G第 j 个结点的信息依前移 1 位G-verticesj.planefirstarc=G-verticesj+1.planefirstarc;G-verticesj.trainfirstarc=G-verticesj+1.trainfirstarc;G-verticesj.planefirstarc=NULL; /将 G 第 j 个结点的信息置空G-verticesj.trainfirstarc=NULL;for(k=0;kvexnum-1;k+) /以下是删除所有指向此结点的航班弧p=G-verticesk.planefirstarc;while(p!=NULL)if(p

40、-adjvexi)p-adjvex=p-adjvex-1;q=p;p=p-nextarc; /p 指向下一条飞机弧else if(p-adjvex=i) /该弧指向的顶点位置(p-adjvex )= iif(p=G-verticesk.planefirstarc) /p 指向图 G 中 k 结点的第一条飞机弧m=p;G-verticesk.planefirstarc=p-nextarc; /将图 G 中 k 结点的第二条飞机弧改为第一弧p=p-nextarc; /p 指向下一条飞机弧free(m); /释放(m)elseq-nextarc=p-nextarc; /将 p 的下一条弧赋给 q 的

41、下一条弧m=p;p=p-nextarc; /p 指向下一条飞机弧free(q); /释放(q)elseq=p;p=p-nextarc; /p 指向下一条飞机弧for(k=0;kvexnum-1;k+) /*以下是删除所有指向此结点的列车弧*/p=G-verticesk.trainfirstarc; /p 指向图 G 中 k 结点的第一条列车弧while(p!=NULL)if(p-adjvexi) /该弧指向的顶点位置(p-adjvex)ip-adjvex=p-adjvex-1; /将该弧指向顶点位置-1q=p;p=p-nextarc; /p 指向下一条列车弧else if(p-adjvex=i

42、) /该弧指向的顶点位置(p-adjvex)=iif(p=G-verticesk.trainfirstarc)/p 指向图 G 中 k 结点的第一条列车m=p;G-verticesk.trainfirstarc=p-nextarc; /将图 G 中 k 结点的第二条列车弧改为第一弧p=p-nextarc;free(m);elseq-nextarc=p-nextarc;m=p;p=p-nextarc;free(q);elseq=p;p=p-nextarc;G-vexnum-;save(G);elsereturn;void flightedit(ALGraph *G)/*飞机航班编辑项目选择界面*

43、/int i;/ char q;printf(“n 请选择飞机航班编辑项目:n“);printf(“1=新增航班n2=删除航班n“);printf(“选择?“);scanf(“%d“,getchar();if(i=1)EnterplaneArc(G);if(i=2)DeleteplaneArc(G);void trainedit(ALGraph *G)/* 列车车次编辑项目选择界面*/int i;/char q;printf(“n 请选择列车车次编辑项目:n“);printf(“1=新增车次n2=删除车次n“);printf(“选择?“);scanf(“%d“,getchar();if(i=1

44、)EntertrainArc(G);if(i=2)DeletetrainArc(G);void EnterplaneArc(ALGraph *G)/*增加飞机航班*/int i,j,bt2,at2;int code;float money;int m,t;char vt10,vh10,c;ArcNode *p,*q;printf(“n 请输入新增飞机航班的信息:n“);printf(“飞机航班编号:“);scanf(“%d“,getchar();printf(“起始城市:“);gets(vt);printf(“目的城市:“);gets(vh);printf(“航班费用:“);scanf(“%f“,getchar();printf(“起飞时间:“);scanf(“%d:%d“,getchar();while(bt0=24|bt1=60)printf(“n 时间输入有误,请重新输入n“);scanf(“%d:%d“,getchar();printf(“到达时间:“);scanf(“%d:%d“,getchar();while(at0=24|at1=60)

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

当前位置:首页 > 规范标准 > 交通运输

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报