数据结构课程设计全国交通咨询系统方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工业应用技术学院
课程设计任务书
题目全国交通资询系统
主要容:
设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:
1、掌握C语言的变量及函数的灵活使用;
2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;
3、掌握C语言中文件的基本操作;
4、掌握VC++6.0软件的熟练使用。
主要参考资料:
[1] 春葆.数据结构程序设计[M].:清华大学,2002,03
[2] 王黎,袁永康战略[M].:清华大学,2002,01
[3] 谭浩强.C程序设计第二版[M].:清华大学,2003,03
[4] 任哲.MFC Windows程序设计[M].:清华大学,2004,06
完成期限:2016.12.05—2017.01.05
指导教师签名:
课程负责人签名:
随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规化和自动化。
同时使乘客能通过网络进行称心的交通工具的选择,这也是交通网络优选智能决策的体现。
交通信息的咨询和管理是交通部门管理工作中异常重要的一个环节,因此,运用交通资询管理系统对春运时减轻乘客购票压力、舒缓紧的城际拥堵有重要意义。
关键字:错综复杂;智能化;最优方式;择优系统
摘要 (I)
目录 (II)
第一章概述 (1)
1.1 性能需求 (1)
1.2 功能需求 (2)
第二章概要设计 (3)
2.1 功能模块设计 (3)
2.2 算法分析与设计 (3)
第三章详细设计 (5)
3.1 管理员功能模块设计 (5)
3.2 计算最少费用功能模块设计 (9)
3.3 测试与分析 (17)
第四章全国交通咨询系统的运行 (21)
4.1 程序主界面 (21)
4.2 管理员登录主界面 (21)
4.3 用户界面登录界面 (24)
4.4 显示交通系统界面 (27)
结束语 (30)
参考文献 (31)
附录 (32)
第一章概述
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
在当今信息时代,信息技术己成为当代知识经济的核心技术。
我们时刻都在和数据打交道。
比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。
实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。
数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:
1、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4、训练用系统的观点和软件开发一般规进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
1.1 性能需求
在现代,随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作,况且,受经济危机的影响,也使人们愈发珍惜包里的人民币。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是
目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
显然,靠传统的交通信息咨询、管理方式已不能适应时代的发展,同时也很难旅客的需求。
今天这种传统的管理方法必然会被以计算机为基础的交通信息总揽、智能咨询所代替。
同时这种传统的管理方式反映出很多问题:第一,当要查询某两个城市之间的全部交通方式要各种查找,很繁琐;
第二,随着周围经济环境的变化,每次查询的票价和线路又会由于各种原因而产生变化,更新的不及时或者票价的错误都会造成乘客陷入麻烦;
第三,随着动车、高铁等各种新型交通方式的加入,一个庞大的信息统计如果占用大量人力、物力、存储资源,显然不能适应时代需要。
基于以上情况,开发一个交通择优系统是十分必要的。
开发一个交通择优系统,采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规化和自动化。
同时使乘客能通过网络进行称心的交通工具的选择,这也是交通网络优选智能决策的体现。
交通信息的咨询和管理是交通部门管理工作中异常重要的一个环节,因此,运用交通资询管理系统对春运时减轻乘客购票压力、舒缓紧的城际拥堵有重要意义。
1.2 功能需求
设计了一个方便用户查询交通咨询系统,这个系统功能比较强大。
该程序所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
1、在程序中输入城市名称时,需输入10个字母以的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能对应的一个整型数据;
2、程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地;
3、程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
第二章 概要设计
2.1 功能模块设计
交通咨询管理系统通过主控模块进入系统并提示相应功能供用户选择。
用户选择后进入到各个功能模块,实现管理员管理、用户咨询、交通信息总览功能,管理员管理时可依据不同对系统信息进行增减,使用户在咨询时得到依据最少旅行时间、旅行费用、最少中转站的购票依据,为用户购票选择提供智能决策。
也可通过显示模块对系统中存储的全部信息进行总览和查询。
基于此,提供以上功能。
如下图2.1所示:
图2.1 交通咨询查询系统模块图
2.2 算法分析与设计
系统用到的抽象数据类型定义:
1.ADT Graph{
数据对象V :一个集合,该集合中的所有元素具有相同的特性
最 少 中 转 站 主控模块
系 统 初 始 化 城 市 编 辑 飞 机 航 班 编辑 显 示 飞 机 航 班 显 示 城 市 交通咨询管理系统
用户资询模块 管理员管理模块 交通信息总览模块 最少
旅
行
时
间 最 少 旅 行 费用 列车车次编辑 显示 列 车 车 次
数据关系R:R={VR} VR={<x,y>|P(x,y)^(x,y属于V)}
基本操作:
(1)initgraph(&G);
(2)CreateGraph(&G);
(3)EnterVertex(&G);
(4)DeleteVertex(&G);
(5)EnterplaneArc(&G);
(6)DeleteplanArc(&G);
(7)EntertrainArc(&G);
(8)DeletetrainArc(&G);
}ADT Graph
2.ADT LinkQueue{
数据元素:可以是任意类型的数据,但必须属于同一个数据对象
关系:队列中数据元素之间是线性关系。
基本操作:
(1)InitQueue(&Q);
(2)IsEmpty(&Q);
(3)EnterQueue(&Q,x);
(4)DeleteQueue(&Q,&y);
}ADT LinkQueue
3.ADT TimeTree{
数据对象D:一个集合,该集合中的所有元素具有相同的特性
数据关系R:若D为空,则为空树。
若D中仅含有一个数据元素,则R为空集,否则R={H},H为如下二元关系:
(1)在D中存在唯一的称为根的数据元素root,它在关系H中没有前驱;
(2)除root以外,D中每个结点在关系H下有且仅有一个前驱;
(3)CreateTimeTree(p,i,j,&Q,infolist arcs);
(4)CopyTimeTree(p,q);
(5)VisitTimeTree(p);
}ADT TimeTree
第三章详细设计
3.1 管理员功能模块设计
设计思想:
本系统的管理员模块,当我们从键盘输入有关图的顶点及弧的信息后,用显示图的函数验证,DOS中显示的图的信息与从键盘输入的信息相同,表明交通系统可以从键盘正确输入信息。
通过管理员模块的操作,我们可以对系统的相关信息进行修改与添加。
如下图3.1所示:
图3.1 管理员模块流程图
详细功能:
本系统实现并建立了有关图的3个文本文件(city.txt,plan.txt,train.txt),在交通系统程序中,选择从文本文件输入图的信息后,用显示操作验证,表明文本文件的容可以正确调入图的结构体中,说明交通系统可以从文本文件中读取信息。
当从键盘或文本文件初始化交通图后,测试增加或删除城市结点,增加或删除航班或列车弧,修改信息完毕后返回上一级菜单。
以下是管理员模块的主要代码:
Administer(ALGraph *G)
{ int i;
printf(" ┏━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃请选择管理员管理项目┃\n");
printf(" ┃┃\n");
printf(" ┃ 1 初始化交通系统┃\n");
printf(" ┃ 2 城市编辑┃\n");
printf(" ┃ 3 飞机航班编辑┃\n");
printf(" ┃ 4 列车车次编辑┃\n");
printf(" ┃ 5 返回上一级菜单┃\n");
printf(" ┗━━━━━━━━━━━━━━━━━┛\n");
printf(" 你的选择是:");
scanf("%d",&i);
system("cls");
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");
printf(" ┃请选择管理员管理项目┃\n");
printf(" ┃┃\n"); printf(" ┃ 1 初始化交通系统┃\n"); printf(" ┃ 2 城市编辑┃\n"); printf(" ┃ 3 飞机航班编辑┃\n"); printf(" ┃ 4 列车车次编辑┃\n"); printf(" ┃ 5 返回上一级菜单┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━┛\n"); printf(" 你的选择是:");
scanf("%d",&i);
system("cls");
getchar();
}
}
initgraph(ALGraph *G)
{int i;
printf(" ┏━━━━━━━━━━━━━━━┓\n"); printf(" ┃请选择初始化方式┃\n"); printf(" ┃ 1 键盘┃\n"); printf(" ┃ 2 文档┃\n"); printf(" ┗━━━━━━━━━━━━━━━┛\n"); printf(" 你的选择是:");
scanf("%d",&i);
system("cls");
getchar();
switch(i)
{case 1:createcityfile();
createplanefile();
createtrainfile();
CreateGraph(G);
break;
case 2:CreateGraph(G);
break;
}
}
cityedit(ALGraph *G)
{int i;
char q;
printf(" ┏━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃请选择城市编辑项目┃\n"); printf(" ┃┃\n"); printf(" ┃ 1 增加城市┃\n"); printf(" ┃ 2 删除城市┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━┛\n"); printf(" 你的选择是:");
scanf("%d",&i);
system("cls");
getchar();
if(i==1)
EnterVertex(G);
if(i==2)
DeleteVertex(G);
}
flightedit(ALGraph *G)
{int i;
char q;
printf(" ┏━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃请选择飞机航班编辑项目┃\n"); printf(" ┃┃\n"); printf(" ┃ 1 新增航班┃\n"); printf(" ┃ 2 删除航班┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━┛\n"); printf(" 你的选择是:");
scanf("%d",&i);
system("cls");
getchar();
if(i==1)
EnterplaneArc(G);
if(i==2)
DeleteplaneArc(G);
}
trainedit(ALGraph *G)
{int i;
char q;
printf(" ┏━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃请选择列车车次编辑项目┃\n");
printf(" ┃┃\n");
printf(" ┃ 1 新增车次┃\n");
printf(" ┃ 2 删除车次┃\n");
printf(" ┗━━━━━━━━━━━━━━━━━┛\n");
printf(" 你的选择是:");
scanf("%d",&i);
system("cls");
getchar();
if(i==1)
EntertrainArc(G);
if(i==2)
DeletetrainArc(G);
}
3.2 计算最少费用功能模块设计
设计思想:
本系统设计计算最少费用功能模块,是根据图的广度遍历算法来实现整个功能的。
并通过键盘输入所要查询的起始地与目的地,并选择交通方式,算出最佳路径,可以以费用为权值计算最少费用。
如下图3.2所示:
图3.2 计算最少费用模块流程图
详细功能:
计算最少中转次数、费用功能实现是依据克鲁斯卡尔算法,以费用为权值来得出最佳路径。
根据管理员输入的城市信息构建网状结构,以起始地作为第一个连通分量,然后寻找到其他连通分量的最少费用,连通城市并列入队列,连通目的地后,输入队列(即费用最少的路径)。
以下是信息总览模块的主要代码:
TransferDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1)
{int visited[MAX_VERTEX_NUM],v,w,n=1;
LinkQueue Q;
ArcNode *t;
Node *p,*q,*r,*s;
p=(Node *)malloc(G.vexnum*sizeof(Node)); for(v=0;v<G.vexnum;v++)
{visited[v]=0;
p[v].next=NULL;
}
InitQueue(&Q);
visited[v0]=1;
q=(Node *)malloc(sizeof(Node));
q->adjvex=v0;
q->next=NULL;
p[v0].next=q;
EnterQueue(&Q,v0);
while(!IsEmpty(&Q))
{DeleteQueue(&Q,&v);
if(k==1)
t=G.vertices[v].trainfirstarc;
else
t=G.vertices[v].planefirstarc;
while(t!=NULL)
{w=t->adjvex;
if(!visited[w])
{visited[w]=1;
q=&p[w];
s=p[v].next;
while(s!=NULL)
{r=(Node *)malloc(sizeof(Node));
r->adjvex=s->adjvex;
q->next=r;
q=r;
s=s->next;
}
r=(Node *)malloc(sizeof(Node));
r->adjvex=w;
r->next=NULL;
q->next=r;
if(w==v1)
{q=p[w].next;
r=q->next;
printf("\n旅行路线是:\n");
while(r!=NULL)
{if(k==1)
printf("乘坐No.%d列车车次在%d:%d从%s 到%s\n",(*(*(arcs+q->adjvex)
+r->adjvex)).stata[0].number,(*(*(arcs+q->adjvex)+r->adjvex)).stata[0 ].begintime[0],(*(*(arcs+q->adjvex)+r->adjvex)).stata[0].begintime[1] ,G.vertices[q->adjvex].cityname,G.vertices[r->adjvex].cityname);
else
printf("乘坐No.%d飞机航班在%d:%d从%s 到%s\n",(*(*(arcs+q->adjvex)
+r->adjvex)).stata[0].number,(*(*(arcs+q->adjvex)+r->adjvex)).stata[0 ].begintime[0],(*(*(arcs+q->adjvex)+r->adjvex)).stata[0].begintime[1] ,G.vertices[q->adjvex].cityname,G.vertices[r->adjvex].cityname);
q=r;
r=r->next;
n++;
}
printf("最少中转次数是%d次\n\n",n-2);
for(v=0;v<G.vexnum;v++)
{q=p[v].next;
while(q!=NULL)
{s=q;
q=q->next;
free(s);
}
p[v].next=NULL;
}
free(p);
}
EnterQueue(&Q,w);
}
t=t->nextarc;
}
}
for(v=0;v<G.vexnum;v++)
{q=p[v].next;
while(q!=NULL)
{s=q;
q=q->next;
free(s);
}
p[v].next=NULL;
}
free(p);
if(k==1)
printf("\n不存在列车车次从%s到%s\n\n",G.vertices[v0].cityname, G.vertices[v1].cityname);
else
printf("\n不存在飞机航班从%s到%s\n\n",G.vertices[v0].cityname, G.vertices[v1].cityname);
}
MinExpenditure(infolist arcs,float *expenditure,int *route)
{int i;
*expenditure=arcs.stata[0].expenditure;
if(*expenditure<INFINITY)
*route=0;
else
*route=-1;
for(i=1;i<=st;i++)
if(arcs.stata[i].expenditure<*expenditure)
{*expenditure=arcs.stata[i].expenditure;
}}
ExpenditureDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,float *M,int *final)
{int v=-1,w,i,route;
float m,expenditure;
Node *p,*q,*r,*s;
p=(Node *)malloc(G.vexnum*sizeof(Node));
for(v=0;v<G.vexnum;v++)
{*(final+v)=False;
MinExpenditure(*(*(arcs+v0)+v),M+v,&route);
p[v].next=NULL;
if(*(M+v)<INFINITY)
{q=(Node *)malloc(sizeof(Node));
s=(Node *)malloc(sizeof(Node));
q->adjvex=v0;
s->adjvex=v;
s->route=route;
p[v].next=q;
q->next=s;
s->next=NULL;
}
}
*(M+v0)=0;
*(final+v0)=True;
for(i=1;i<G.vexnum;i++)
{m=INFINITY;
v=-1;
for(w=0;w<G.vexnum;w++)
if(*(final+w)==False)
if(*(M+w)<m)
{v=w;
m=*(M+w);
}
if(v==v1)
{q=p[v].next;
r=q->next;
printf("\n旅行路线是:\n");
while(r!=NULL)
{if(k==1)
printf("乘坐No.%d列车车次在%d:%d从%s 到%s\n",(*(*(arcs+q->adjvex)
+r->adjvex)).stata[r->route].number,(*(*(arcs+q->adjvex)+r->adjvex)). stata[r->route].begintime[0],(*(*(arcs+q->adjvex)+r->adjvex)).stata[r ->route].begintime[1],G.vertices[q->adjvex].cityname,G.vertices[r->ad jvex].cityname);
else
printf("乘坐No.%d飞机航班在%d:%d从%s 到%s\n",(*(*(arcs+q->adjvex)
+r->adjvex)).stata[r->route].number,(*(*(arcs+q->adjvex)+r->adjvex)). stata[r->route].begintime[0],(*(*(arcs+q->adjvex)+r->adjvex)).stata[r ->route].begintime[1],G.vertices[q->adjvex].cityname,G.vertices[r->ad jvex].cityname);
q=r;
r=r->next;
}
printf("最少旅行费用是%f元\n\n",m);
for(v=0;v<G.vexnum;v++)
{q=p[v].next;
while(q!=NULL)
{s=q;
q=q->next;
free(s);
}
p[v].next=NULL;
}
free(p);
return;
}
else if(v!=-1)
{*(final+v)=True;
for(w=0;w<G.vexnum;w++)
if(*(final+w)==False&&(*(*(arcs+v)+w)).last>-1)
{MinExpenditure(*(*(arcs+v)+w),&expenditure,&route); if(*(M+w)>m+expenditure)
{*(M+w)=m+expenditure;
q=p[w].next;
while(q!=NULL)
{s=q;
q=q->next;
free(s);
}
q=&p[w];
s=p[v].next;
while(s!=NULL)
{r=(Node *)malloc(sizeof(Node));
r->adjvex=s->adjvex;
r->route=s->route;
q->next=r;
q=r;
s=s->next;
}
r=(Node *)malloc(sizeof(Node));
r->adjvex=w;
r->route=route;
r->next=NULL;
q->next=r;
}}}}
for(v=0;v<G.vexnum;v++)
{q=p[v].next;
while(q!=NULL)
{s=q;
q=q->next;
free(s);
}
p[v].next=NULL;
}
free(p);
if(k==1)
printf("\n不存在列车车次从%s到%s\n\n",G.vertices[v0].cityname, G.vertices[v1].cityname);
else
printf("\n不存在飞机航班从%s到%s\n\n",G.vertices[v0].cityname, G.vertices[v1].cityname);}
3.3 测试与分析
1、考虑到道路网多是稀疏网,故采用了邻接表作存储结构,其空间复杂度位O(e),此时的时间复杂度也为O(e)。
构建邻接表的时间复杂度位O(n+e),输出路径的时间复杂度为O(n2)。
由此,本交通资询系统的时间复杂度位O(n2)。
2、本程序在求最短路径时使用了迪杰斯特拉算法,主要考虑在本程序的初级阶段,并不需要大量的查询,更多会是图信息的添加和修改,重在算法的理解和掌握,因此采用了算法复杂度相对较低的迪杰斯特拉算法。
当然,从性能上来说,当交通图基本稳定,而且城市信息基本完善的时候,使用佛洛伊德把所有的最短路径信息存储起来可能会更方便一点,后续的查询的时间复杂度也会相对降低。
由此可见,在选用算法时,不能单纯地只考虑算法的时间复杂度,有时还必须综合考虑各种因素。
表1-1 航班时刻表
表1-2 列车时刻表
第四章全国交通咨询系统的运行
4.1 程序主界面
1、全国交通资询系统运行主界面,该主界面包括管理员管理、用户资讯、显示交通系统、退出系统四个选项。
可以选择不同的选项进入不同的操作界面。
如下图4.1所示:
图4.1 全国交通资询主菜单界面
4.2 管理员登录主界面
1、管理员登陆全国交通资询界面,可以进行五项基本操作,初始化交通系统、城市编辑、飞机航班编辑、列车车次编辑、返回上一级菜单。
如下图 4.2所示:
图4.2 管理员登录界面
2、对全国交通资询系统进行初始化,可选择两种初始化方式,键盘和文档两种方式。
如下图4.3所示:
图4.3 全国交通资询系统初始化界面
3、选择城市编辑,可以进行两项基本操作,增加城市和删除城市。
如下图
4.4所示:
图4.4 城市编辑界面
4、选择飞机航班编辑,可以进行两项基本操作,新增航班和删除航班。
如下图4.5所示:
图4.5 飞机航班编辑界面
5、选择列车车次编辑,可以进行两项基本操作,新增车次和删除车次。
如下图4.6所示:
图4.6 列车车次编辑界面
4.3 用户界面登录界面
1、全国交通资询用户登录主界面,可以进行四项基本操作,最少旅行费用查询、最少旅行时间查询、最少旅行中转次数查询和返回上一级菜单。
如下图4.7所示:
图4.7 用户主界面
2、用户查询最少旅行费用查询界面,进行最少旅行费用查询。
如下图 4.8所示:
图4.8 最少旅行费用查询
3、用户查询最少旅行时间查询界面,进行最少旅行费用查询。
如下图 4.9
所示:
图4.9 最少旅行时间查询
4、用户查询最少旅行中转次数查询,进行最少旅行费用查询。
如下图4.10所示:
图4.10 最少旅行中转次数查询
4.4 显示交通系统界面
1、全国交通资询系统交通系统界面,可以进行四项基本操作,显示城市、显示飞机航班、显示列车车次和返回上一级菜单。
如下图4.11所示:
图4.11 全国交通资询系统交通系统界面
2、全国交通资询系统显示城市界面,进行城市信息查询。
如下图4.12所示:
图4.12 全国交通资询系统交通系统界面
3、全国交通资询系统显示飞机航班界面,进行飞机航班查询。
如此下图4.13所示:
图4.13 全国交通资询系统显示飞机航班界面
4、全国交通资询系统显示列车车次界面,进行列车车次查询。
如下图4.14所示:
图4.14 全国交通资询系统显示列车车次界面
结束语
1、遇到的问题:
主要遇到了怎样储存和读取哈夫曼树的问题,知道了应该灵活解决问题,如在建哈夫曼树时要由叶子结点向根结点的次序,而在读取时应由根结点向叶子结点的次序。
文件流问题:无法读指定的文件。
解决,先判断文件能否打开,若能打开,则继续操作,还要判断是否是全文结束。
2、总结:
这次实验难度很高,有许多复杂的函数和文件流问题。
遇到了许多问题,在哈夫曼树的建立存储和读取方面可以参照书独立完成,但文件流方面难度较高,涉及到许多特定语句和形式,如if(!encoding.eof()),ofstream coding("CodeFile.txt");等,由于以前不经常使用,接触不多,所以使用比较困难,通过向他人请教和参考以有的例子得以解决。
通过此次实验更加巩固了树、二叉树的用法,深入理解了树和二叉树在计算机中的存储和读取方式,也增强了自学能力,并且对文件流方面的知识有更深一步的运用和了解,虽然还不能灵活的应用,但已经起到了抛砖引玉的作用。
同时也更加意识到,每一次编程都是对自己学习能力和耐力的挑战,督促我去了解更有用的东西,得到进一步的提高。
参考文献
[1] 晓华.SQL Server2000数据库应用开发[M].:电子工业,2001,06
[2] 王黎,袁永康战略[M].:清华大学,2002,01
[3] 谭浩强.C程序设计第二版[M].:清华大学,2003,02
[4] 任哲.MFC Windows程序设计[M].:清华大学,2004,06
[5] 唐克.MFC程序设计[M].:希望电子,2002,05
[6] 严蔚敏,吴伟民.数据结构(C语言版)[M].:清华大学,1997,09
[7] 科技.Visual C++ 6.0信息管理系统开发[M].:人民邮电,2005,08
[8] 朱晴婷,黄海鹰,莲君.VC++程序设计[M].:清华大学,1998,09
[9] 严蔚敏,吴伟民.数据结构C语言版[M].:清华大学,2002,06
[10] 徐孝凯.数据结构课程实验[M].:清华大学,2002,04
[11] 春葆.数据结构程序设计[M].:清华大学,2002,03
附录
主要代码:
int main()
{ALGraph G;
int i;
printf(" ┏━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃欢迎使用交通咨询管理系统┃\n"); printf(" ┃┃\n"); printf(" ┃主菜单┃\n"); printf(" ┃┃\n"); printf(" ┃制作者:余森┃\n"); printf(" ┃┃\n"); printf(" ┃(请按提示操作)┃\n"); printf(" ┃┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃┃\n"); printf(" ┃ 1 管理员管理┃\n"); printf(" ┃ 2 用户咨询┃\n"); printf(" ┃ 3 显示交通系统┃\n"); printf(" ┃ 4 退出系统┃\n"); printf(" ┃┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━┛\n"); printf(" 1-4键请选择程序功能: \n"); printf(" 你的选择是: ");
scanf("%d",&i);
system("cls");
getchar();
while(i!=4)
{switch(i)
{case 1:Administer(&G);break;
case 2:UserDemand(G);break;
case 3:PrintGraph(&G);break;
}
printf(" ┏━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃欢迎使用交通咨询管理系统┃\n"); printf(" ┃┃\n"); printf(" ┃主菜单┃\n"); printf(" ┃┃\n"); printf(" ┃制作者:余森┃\n"); printf(" ┃┃\n"); printf(" ┃(请按提示操作)┃\n"); printf(" ┃┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃┃\n"); printf(" ┃ 1 管理员管理┃\n"); printf(" ┃ 2 用户咨询┃\n"); printf(" ┃ 3 显示交通系统┃\n"); printf(" ┃ 4 退出系统┃\n"); printf(" ┃┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━┛\n"); printf(" 1-4键请选择程序功能: \n"); printf(" 你的选择是: ");
scanf("%d",&i);
system("cls");
getchar();
}
return 1;
}
void Administer(ALGraph *G)
{int i;
printf(" ┏━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃请选择管理员管理项目┃\n"); printf(" ┃┃\n"); printf(" ┃ 1 初始化交通系统┃\n"); printf(" ┃ 2 城市编辑┃\n"); printf(" ┃ 3 飞机航班编辑┃\n");
printf(" ┃ 4 列车车次编辑┃\n"); printf(" ┃ 5 返回上一级菜单┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━┛\n"); printf(" 你的选择是:");
scanf("%d",&i);
system("cls");
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"); printf(" ┃请选择管理员管理项目┃\n"); printf(" ┃┃\n"); printf(" ┃ 1 初始化交通系统┃\n"); printf(" ┃ 2 城市编辑┃\n"); printf(" ┃ 3 飞机航班编辑┃\n"); printf(" ┃ 4 列车车次编辑┃\n"); printf(" ┃ 5 返回上一级菜单┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━┛\n"); printf(" 你的选择是:");
scanf("%d",&i);
system("cls");
getchar();
}
}
void initgraph(ALGraph *G)
{int i;
printf(" ┏━━━━━━━━━━━━━━━┓\n"); printf(" ┃请选择初始化方式┃\n"); printf(" ┃ 1 键盘┃\n"); printf(" ┃ 2 文档┃\n"); printf(" ┗━━━━━━━━━━━━━━━┛\n"); printf(" 你的选择是:");
scanf("%d",&i); // 输入变量i的值
system("cls");
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')
{printf("城市名称:");
gets(city[i]);
i++;
printf("继续输入?(Y/N)");
scanf("%c",&flag);
getchar();
}
printf("\n");
if((fp=fopen("city.txt","wb"))==NULL
{printf("无法打开文件!\n");
return;
}
for(j=0;j<i;j++)
fprintf(fp,"%10s",city[j]);
fclose(fp);
}
void createplanefile()
{int code,bt[2],at[2];
float money;
int i;
int count;
char vt[10],vh[10],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("%f",&money);
getchar();
printf("起飞时间:");
scanf("%d:%d",&bt[0],&bt[1]);
getchar();
while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60
{printf("\n时间输入有误,请重新输入\n");
scanf("%d:%d",&bt[0],&bt[1]);
getchar();
}
printf("到达时间:");
scanf("%d:%d",&at[0],&at[1]);
getchar();
while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60) {printf("\n时间输入有误,请重新输入\n");
scanf("%d:%d",&at[0],&at[1]);
getchar();
}
a[count].co=code;
strcpy(a[count].vt,vt);
strcpy(a[count].vh,vh);
a[count].bt[0]=bt[0];
a[count].bt[1]=bt[1];
a[count].at[0]=at[0];
a[count].at[1]=at[1];
a[count].mo=money;
count++;
printf("继续输入?(Y/N)");
scanf("%c",&flag);
getchar();
printf("\n");
}
if((fp=fopen("plane.txt","wb"))==NULL)
printf("\n无法打开文件!\n");
fprintf(fp,"%d",count);
for(i=0;i<count;i++)
if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1) printf("\n文件写入错误!\n");
fclose(fp);
}。