1、分类号 编 号 课 程 设 计题目 全国交通咨询系统 院 系 信息工程学院 专 业 计算机科学与技术 姓 名 学 号 指 导 教 师 目录1 需求分析31.1 问题描述31.2 基本要求32 概要设计42.1数据结构42.2 程序模块82.2.1 管理员模块82.2.2 客户查询82.3各模块之间的调用关系以及算法设计82.3.1各个模块之间的调用关系83 详细设计93.1 管理员模块93.2 用户查询模块103.3 函数调用关系图104 测试与分析124.1合法数据的测试124.1.1 测试截图124.2 非法数据的测试17五总结18参考文献21附录21全国交通咨询系统1 需求分析1.1 问
2、题描述随着我国交通系统的发展,从一个城市到另一个城市可以选择多个交通工具,比如火车,飞机。不同的交通工具的价格,所用的时间也不一样。对旅客来说,可以根据自己的时间安排,资金的情况选择不能的交通工具和不同的乘车路线。本系统就是主要完成这个的功能,旅客在出发前可以根据出发地和到达地查询不同的路线,旅客可以有三个决策方案,第一个是时间最短,第二个是费用最小,第三个是中转次数最少。对管理员来说,可以对城市进行增加,可以对列车时刻表和飞机航班表的信息进行的增加。1.2 基本要求 输入的形式和输入值的范围在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车
3、或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能对应的一个整型数据。 输出的形式程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。 程序所能达到的功能(1)管理员可以细化为对城市信息的管理,对列车时刻表的管理,对飞机航班表的信息的管理,初始化交通图;(2)用户可以查询两个城市之间的航班和车次。用户只需要选择起始城市和目的城市,就可以选择时间最短、费用最少和中转次数最少的方案;(3)用户可以按照自己
4、的需求选择乘坐飞机和火车。(4)退出系统。2 概要设计2.1数据结构(1)本程序运用了关于图这种数据结构。图的存储结构采用邻接表的结构抽象数据类型定义。 typedef 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
5、;typedef struct VNodechar cityname10; ArcNode *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
6、;typedef structQNode *front; QNode *rear;LinkQueue;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;基本操作:void Administer(ALGraph *G);v
7、oid 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();/创建列车文件void DeleteQueue(LinkQ
8、ueue *Q,int *x);void DemandDispose(int n,ALGraph G);/用户需要的方案void DestoryTimeTree(TimeTree p);void EnterplaneArc(ALGraph *G);?/增加航班void EnterQueue(LinkQueue *Q,int x);/入队Qvoid EntertrainArc(ALGraph *G);/增加列次void EnterVertex(ALGraph *G);voidExpenditureDispose(intk,infolist(*arcs)MAX_VERTEX_NUM,ALGraph
9、 G,int v0,int v1,float *M,int *final);/最少花费安排void flightedit(ALGraph *G);/编辑航班void initgraph(ALGraph *G);/创建图的方式:通过键盘或者文档void InitQueue(LinkQueue *Q);/创建队列Qint IsEmpty(LinkQueue *Q);int LocateVertex(ALGraph *G,char *v);/找到v在图中的位置void MinExpenditure(infolist arcs,float *expenditure,int *route);/计算金钱v
10、oid MinTime(infolist arcs,int *time,int *route);/计算时间int save(ALGraph *G);/保存图voidTimeDispose(int k,infolist (*arcs)MAX_VERTEX_NUM,ALGraph G,int v0,int v1,int (*T)2,int *final);/最少时间安排voidTimeTreeDispose(Node*head,infolist(*arcs)MAX_VERTEX_NUM);void trainedit(ALGraph *G);/编辑列车voidTransferDispose(int
11、k,infolist(*arcs)MAX_VERTEX_NUM,ALGraph G,int v0,int v1);/最少换乘安排void UserDemand(ALGraph G);/用户需要的选择void VisitTimeTree(TimeTree p);2.2 程序模块 2.2.1 管理员模块管理员模块包括初始化交通系统、城市编辑模块、飞机航班编辑模块、列车车次编辑模块。初始化交通系统包括键盘和文档两种创建方式。键盘创建包括创建城市文件、创建航班文件、创建列次文件。2.2.2 客户查询用户咨询界面包括用户需要的最少金钱花费、最少时间花费和最少转乘次数。没种方案都可以选择用户需要的起始地和
12、目的地,可以根据用户需要选择乘坐的飞机或者列车。2.3各模块之间的调用关系以及算法设计2.3.1各个模块之间的调用关系主函数退出用户咨询管理员管理管理员管理返回上一级菜单列车车次编辑飞机航班编辑城市编辑初始化交通系统用户咨询最少中转次数返回上一级菜单最少旅行时间最少旅行费用初始化交通系统文档键盘新增城市城市编辑新增航班飞机航班编辑新增车次火车列次编辑图13 详细设计3.1 管理员模块 初始化交通系统通过键盘和文档两种方式实现,使用了函数是 initgraph(ALGraph *G)函数。调用了创建城市文件createcityfile()函数、创建火车车次文件createtainfile()函数
13、和创建图的CreateGraph(G)函数。城市编辑模块使用函数cityedit(ALGraph*G)调用了添加城市函数EnterVertex(ALGraph*G)实现对城市的添加功能。飞机航班编辑模块使用函数flightedit(ALGraph *G)调用EnTerplaneArc(ALGraph*G)函数实现增加航班功能。列车车次编辑模块使用函数traintedit(ALGraph *G)调用EnTertrainArc(ALGraph*G)函数实现增加航班功能。3.2 用户查询模块用户需求使用函数UserDemand(ALGraph *G)调用需求方案函数DemandDispose(int
14、 n,ALGraph G),需求方案函数中调用了花费方案函数voidExpenditureDispose(intk,infolist(*arcs)MAX_VERTEX_NUM,ALGraph G,int v0,int v1,float *M,int *final)、最少时间方案函数voidTimeDispose(int k,infolist (*arcs)MAX_VERTEX_NUM,ALGraph G,int v0,int v1,int (*T)2,int *final)和最少换乘函数voidTransferDispose(intk,infolist(*arcs)MAX_VERTEX_NUM
15、,ALGraph G,int v0,int v1)实现,而最少花费函数又调用了计算金钱的MinExpenditure(infolist arcs,float *expenditure,int *route)函数;最少时间函数调用了计算时间函数MinTime(infolist arcs,int *time,int *route);最少转乘函数使用了队列和图的广度优先遍历。在计算最小时间时用到了时间树。用户可以在选择了三种方案任一种之后选择起始城市和目的城市,然后选择想要乘坐的是飞机还是火车,就可以找出三种不同方案的各自的最优方案。3.3 函数调用关系图DeleteQueueEnterQueueI
16、nitQueueMinTimeTimeTreeDisposeTransferDisposeTimeDisposeMinExpenditureExpenditureDisposecreateplanefilecreatetrainfileCreateGraphinitgraphcityeditAdministertraineditcreatecityfileflighteditEnterVertexEnterplaneArcEntertrainArcMain()UserDemand 图2InitQueueEnterQueueDeleteQueueCreateTimeTreeCopyTimeTre
17、eTimeTreeDisposeVisitTimeTreeDestoryTimeTree4 测试与分析 4.1合法数据的测试 4.1.1 测试截图 图3(1)输入菜单号“1”,进入管理员模块。图4(2)输入菜单号“1”,初始化交通系统。选择“1”进行键盘录入,选择“2”直接导入录好的图。图5选择”2”城市编辑,可以添加城市:图6可在用户咨询界面查询到添加的城市:图7选择”3”可以添加航班信息:图8在用户咨询页面可以查询到: 图9图10(3)输入菜单号“2”,进入用户咨询界面 图11 (4) 输入“1”,选择最少费用的方案。图12图13 (5) 输入“1”,选择乘坐列车。图14 (6) 在用户咨
18、询界面输入“2”,按上述操作,则可以咨询最少旅行时间的方案。图15(7)在用户界面输入“3”,按上述操作,可以查询最少转车次数的方案。图16(8)若在选择交通工具界面选择“2”,飞机,则可以选择最少花费,最省时和最少中转次数的乘坐飞机的方案。图17图18图194.2 非法数据的测试4.2.1 在主菜单中输入错误号码后,系统自动跳转到主菜单,继续让用户输入。图204.1.2 选择用户咨询界面后,选择没有的城市,系统会让用户重新入。图214.1.3 在输入航班信息有误的时候会出现提示。图22五总结周桂华: 调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析: 在调试的过程中碰到了一下
19、问题:a. 引用形参应用不当;b. 文件操作中遇到读入错误或找不到文件;解决方案:a. 对引用形参了解的不是很透彻,导致错误,通过查阅相关书籍如C+ Primer和请教编程能力较高的人,最终解决问题。b. 通过参考谭浩强编著的C程序设计中的文件操作,文件格式和相关文件路径的设置,最终解决问题。 算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想: 经验和体会: 通过本次课程设计,我学到了一种程序设计方法,就是结构化程序设计方法,在程序设计过程中,我尝试按如下方法进行结构化程序设计:(1)自顶向下;(2)逐步细化;(3)模块化设计(4)结构化编码。这种设计方法的过程
20、是将问题求解由抽象逐步具体化的过程,而且,用这种方法便于验证算法的正确性。 本次课程设计所使用的是较为复杂的抽象数据类型图,而且在弧的基础上增加了许多信息,如添加了时间,费用等等,这无疑给编程加大了难度,同时也是相当的具有挑战性。 在编程的过程中,我用到了全局数组,我将数组放在工程的头文件里面,编译的时候报错,说是多重定义。最终放弃了创建工程,而选择了单个文件进行编译和运行,结果顺利通过。同时,在文件操作方面我也曾遇到问题,就是在程序对文件进行读取的时候报错,无法读取文件,最后查询有关C的工具书,原来是文件路径问题,借助工具书最终解决了文件操作方面的问题。总之,这次课程设计是对这一个学期以来对
21、数据结构学习成果的一个验证,同时也是理论与实践很好的结合,既对学过的数据结构进行了巩固,也对我的编程能力奠定了坚实的基础。通过本次的实验,了解了自己比较薄弱的环节,对图的应用不够灵活,以后需要加强图这种抽象数据类型的应用。史佳:这次实验我负责的是管理员界面的城市编辑、航班编辑和列车编辑,就是实现的增加城市、增加航班、增加列次的功能。还有用户查询界面的最小转乘函数中的空队列的建立,元素入队、出队的功能。刚看到系统名字的时候认为系统很简单,就是把所有的城市之间的航线和列次建立为图,利用图的最小路径就可以实现最少花费、最少时间和最少换乘次数。在需求分析阶段,我们很容易的判断出来系统所需要的功能,但在
22、概念设计阶段和详细设计阶段我们遇到了很多问题。比如如何利用函数实现图的广度优先遍历,怎样用树计算出最少的旅途时间,在这些问题上我们遇到了很多困难。老师在课堂上只是简单的讲解了图,书上也没有详细的代码,我们只好从网上翻阅各种资料,但网上的代码会有很多错误,需要大量的时间理解和修改代码。在创建文件上我们也遇到了很多问题,大量的数据给文件的录入增加了难度,一个很小的差错就能导致半个小时的录入付诸东流。这两周课程设计虽然花费了我们很多时间,但我对队列、图和图的应用都有了更深的理解,对函数调用也更加的熟练,在对代码的理解和编写时,我们不停的翻阅课本和网络,自己C语言的编程能力也有了很大提高。不停的修改界
23、面而是系统更加美观也锻炼了我的审美能力。这次做系统在考察了我对知识的掌握的同时,也让我学到了很多知识,长时间的专注于程序使我的专注能力也有所提高,希望通过以后的学习,会对数据结构有更好的掌握。王小飞: 本次课程设计,我们小组的题目是全国交通咨询系统,在本系统中,我负责的模块是,创建系统所需要的几个重要文件,有创建城市文件、航班文件、列车文件,创建时间树,以及最少中转次数中的广度优先遍历。 在编写自己所负责模块的代码时,遇到了很多是问题和困难,比如函数之间的相互调用,经常会出现问题,在做系统中中最少转次数的广度优先遍历时,对其算法了解的不够透彻,还有自己对文件的操作也没有很熟练的掌握,经常需要翻
24、书以及请教同学,去查找一些基本的语法。这都是因为自己数据结构的基础知识欠缺,学的不够扎实,以及平时的编程练习太少,代码输入不熟练,眼高手低的结果。 通过这两周的课程设计,自己不仅巩固了之前所学的理论知识,并且在此基础上,对数据结构的特点以及算法, 有了更深入的了解。另外这两周的课程设计,培养了自己灵活运用所学到的知识及技能来分析、解决实际问题的能力,使自己体会到把理论知识和实践相结合的重要性。 总之,两周的课程设计使自己获益匪浅,虽然为此花费了很多的时间和精力,但是却让自己深刻认识到了自己在学习方面的不足之处。经过本次课程设计,自己不仅学到了很多的知识和技能,更重要的是学会了如何运用所学知识去
25、解决实际问题,为自己以后的学习和工作奠定了基础。参考文献【1】C语言程序设计/谭浩强著.-4版.-北京:清华大学出版社,2010.6【2】数据结构:C语言版/严蔚敏,吴伟民编著.-北京:清华大学出版社,2007【3】网上相关资料附录#define MAX_VERTEX_NUM 18#define NULL 0#define MAX_ARC_SIZE 100#define MAX_ROUTE_NUM 5#include#include#include#include#define False 0#define True 1#define INFINITY 10000typedef structi
26、nt 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;ArcNode *planefirstarc,*trainfirstarc;VNode,AdjListMAX_V
27、ERTEX_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;LinkQueue;typedef struct TimeNodeint adjvex; int rout
28、e; 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;int dMAX_VERTEX_NUM;/*函数声明*/void Admin
29、ister(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();void DeleteQueue(LinkQueue *Q,
30、int *x);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 EnterVertex(ALGraph *G);void ExpenditureDispose(int k,infolist (*arcs)MAX_VERTEX_NUM,ALGraph G,int v0,int v1,float *M,in
31、t *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(infolist arcs,float *expenditure,int *route);void MinTime(infolist arcs,int *time,int *route);void PrintGraph(ALGraph *G);i
32、nt 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_NUM);void trainedit(ALGraph *G);void TransferDispose(int k,infolist (*arcs)MAX_VERTEX_NUM,ALGraph G,int v0,int v1);void U
33、serDemand(ALGraph G);void VisitTimeTree(TimeTree p);void quitSystem() printf(n $欢迎再次使用$n);exit(0);void main()ALGraph G;int i;while(i!=3) system(cls);printf(nnnnnnn 请选择程序功能:n);printf( *n);printf( * 1=管理员管理 *n);printf( * 2=用户咨询 *n);printf( * 3=退出 *n);printf( *n);printf( 选择?);scanf(%d,&i);getchar(); sw
34、itch(i) case 1:Administer(&G); break; case 2:UserDemand(G); break; case 3:quitSystem();break; /管理人员菜单void Administer(ALGraph *G)int i;system(cls);printf(nnnnnnn 请选择管理项目:n); printf( *n); printf( * 1=初始化交通系统 *n); printf( * 2=城市编辑 *n); printf( * 3=飞机航班编辑 *n); printf( * 4=列车车次编辑 *n); printf( * 5=返回上一级菜单
35、 *n); printf( *n); printf( 选择?); scanf(%d,&i); getchar();switch(i)case 1:initgraph(G); break; case 2:cityedit(G); break; case 3:flightedit(G); break; case 4:trainedit(G); break;/创建图的方式void initgraph(ALGraph *G) int i; system(cls); printf(nnnnnnn 请选择初始化方式:n); printf( *n); printf( * 1=键盘 *n); printf(
36、* 2=文档 *n); printf( *n); printf( 选择?); scanf(%d,&i); getchar(); switch(i)case 1:createcityfile(); createplanefile(); createtrainfile(); CreateGraph(G); break;case 2:CreateGraph(G); break;/创建城市文件void createcityfile()int i=0; int j; char flag=y; FILE *fp; printf(n请输入城市名称的信息:n); while(flag=y|flag=Y)pri
37、ntf(城市名称:);gets(cityi);i+;printf(继续输入?(Y/N);scanf(%c,&flag); getchar();printf(n); if(fp=fopen(city.txt,wb)=NULL)printf(无法打开文件!n);return;for(j=0;ji;j+)fprintf(fp,%10s,cityj); fclose(fp);/创建飞机航班文件void createplanefile()int code,bt2,at2; float money; int i; int count; char vt10,vh10,flag; FILE *fp; flag=y; count=0; while(flag=Y|flag=y) printf(请输入飞机航班的信息:n); printf(飞机航班编号:); scanf(%d,&code); getchar(); printf(起始城市:); gets(vt); printf(目的城市:); gets(vh); printf(起飞时间:); scanf(%d:%d,&bt0,&bt1); getchar();while(bt0=24|bt1=60)printf(n时间输入有误,请重新输入n); scanf(%d:%d,&bt0,&bt1); getchar();