实验报告C语言数据结构全国交通模拟咨询
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告C语言数据结
构全国交通模拟咨询 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT
浙江工商大学计算机与信息工程学院数据结构实验大作业报告
专业:物流1001
班级: 1001
学号: 18
姓名:金渐
指导教师:庄毅
2011年12月8日
一、问题描述
处于对不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
【基本要求】
(1)提供对城市信息进行编辑(如:添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
二、系统设计系统框图:
模块说明:
本系统共分15个模块
1、主函数
2、添加城市
3、查找城市并返回序号
4、删除城市
5、添加列车
6、添加航班
7、删除列车或航班
8、找出最小费用路线
9、打印出最小费用路线
10、初始化系统数据(读入内存)
11、找出最快路线
12、计算最快路线耗费的时间并打印
13、计算最小费用路线
14、主界面
15、存储信息到文件
16、退出
下面是系统总流程图:
下面是各模块示意图:
三、系统测试
1、主界面
2、添加城市模块:输入命令 1 后,将提示输入城市名,而后返回主界面
3、删除城市:输入命令2后,提示输入城市名,而后返回主界面
4、添加交通路线:输入命令3,提示输入起点站和重点站,并提示选择火车或飞机,而后输入班次、出发时间、到达时间、票价,而后返回主界面
原train文件:
添加路线后:
5、删除路线:输入命令4,输入班次,而后返回主界面
原train文件:
删除后ttrain文件:
6、查询最小费用路线:输入命令5,并输入起点站和重点站,然后选择交通工具
结果正确!
7、查询时间最短路线:输入命令6,并输入起点站和重点站,然后选择交通工具
四、小结
从小学家里买了电脑起,我对计算机就相当感兴趣,有事没事就喜欢捣鼓捣鼓。
六年级的时候,我的第一台台式电脑就这样被我折腾坏了。
高中,我
迷上了硬件,一放假就泡论坛,研究攒机。
大学,我买了一台真正的属于自己的智能手机——魅族M8。
买时已经上市超过两年的M8使用的是被微软抛弃的windows CE系统。
系统的落后导致了应用程序的匮乏,虽然日常应用勉强可以应付,但是看着android丰富有趣的app不免让人心痒。
于是在大一的寒假里我第一次萌生了学习编程的念头。
现在,经过了C语言和数据结构的学习之后,编写一个相对大型的程序的机会终于来了,我也憋足了劲想要写出一个优秀的程序,并且选择了一个具有实际价值的模型——全国交通咨询系统。
第一天,我花了周六10个小时的时间写出了寻找相邻城市旅行时间最短的一个函数,然而这只是系统其中的一个简单的功能。
至此,我也就做好了在编写过程中遇到相当大困难的准备。
但是,后来的一个星期里,虽然利用了所有的课外时间来思考文件的存储格式以及所有城市间的转车、最低费用、最短时间函数,事情却依然毫无进展。
由于期末临近,时间紧迫,我只好求助于网上的资料。
查阅之后发现求图的最短路径使用的是我还未学会的迪杰斯特拉算法。
在认真研究之后,终于将迪杰斯特拉算法加到了自己的程序之中,完成了最最关键的功能。
两个星期后的今天,终于完成了系统的全部功能以及测试。
这一次的编程经验,我最大的体会是:
代码的编写、调试并不是最困难的部分。
最困难的部分在于如何构思出一个巧妙的软件框架、统一的数据输入输出格式以形成一个完整的体系。
包括各种全局变量的设定、模块的划分都是需要很长的时间去考虑完善的。
五、附录
cpp : Defines the entry point for the console application.
int Cityity/*int类型*/=NumofCity;
CityInfo[NumofCity].FlightNum=0;
CityInfo[NumofCity].TrainNum=0;
NumofCity++; lightNum=CityInfo[i+1].FlightNum;
rainNum=CityInfo[i+1].TrainNum; lightNum;j++)
{
CityInfo[i].Flight[j].Price=CityInfo[i+1].Flight[j].Price;
CityInfo[i].Flight[j].DesCity=CityInfo[i+1].Flight[j].DesCity;
strcpy(CityInfo[i].Flight[j].name,CityInfo[i+1].Flight[j].name);
CityInfo[i].Flight[j].DepTime=CityInfo[i+1].Flight[j].DepTime;
CityInfo[i].Flight[j].ArriveTime=CityInfo[i+1].Flight[j].ArriveTime;
} rain[CityInfo[i].TrainNum].Price=cost;
CityInfo[i].Train[CityInfo[i].TrainNum].DesCity=j;
CityInfo[i].Train[CityInfo[i].TrainNum].DepTime=DepTime;
CityInfo[i].Train[CityInfo[i].TrainNum].ArriveTime=EndTime;
strcpy(CityInfo[i].Train[CityInfo[i].TrainNum].name,train);
CityInfo[i].TrainNum++;light[CityInfo[i].FlightNum].Price=cost;
CityInfo[i].Flight[CityInfo[i].FlightNum].DesCity=j;
CityInfo[i].Flight[CityInfo[i].FlightNum].DepTime=DepTime;
CityInfo[i].Flight[CityInfo[i].FlightNum].ArriveTime=EndTime;
strcpy(CityInfo[i].Train[CityInfo[i].FlightNum].name,flight);
CityInfo[i].FlightNum++;
return 1;
}
lightNum;j++)
if (strcmp(CityInfo[i].Flight[j].name,name)==0) lightNum-
1;j++)
{
CityInfo[i].Flight[j].Price=CityInfo[i].Flight[j+1].Price;
CityInfo[i].Flight[j].DesCity=CityInfo[i].Flight[j+1].DesCity;
strcpy(CityInfo[i].Flight[j].name,CityInfo[i].Flight[j+1].name);
CityInfo[i].Flight[j].DepTime=CityInfo[i].Flight[j+1].DepTime;
CityInfo[i].Flight[j].ArriveTime=CityInfo[i].Flight[j+1].ArriveTime;
} lightNum--;break; rainNum;j++)
if (strcmp(CityInfo[i].Train[j].name,name)==0) rainNum-1;j++)
{
CityInfo[i].Train[j].Price=CityInfo[i].Train[j+1].Price;
CityInfo[i].Train[j].DesCity=CityInfo[i].Train[j+1].DesCity;
strcpy(CityInfo[i].Train[j].name,CityInfo[i].Train[j+1].name);
CityInfo[i].Train[j].DepTime=CityInfo[i].Train[j+1].DepTime;
CityInfo[i].Train[j].ArriveTime=CityInfo[i].Train[j+1].ArriveTime;
} rainNum--;break;
}
}
return 1;
}
int PreCityrainNum;k++)
if
(CityInfo[track[i]].Train[k].DesCity==end&&min>CityInfo[track[i]
].Train[k].Price)
{
min=CityInfo[track[i]].Train[k].Price;
tmp=k;
}
printf("请乘坐%s次列车起止时间:
",CityInfo[track[i]].Train[tmp].name);
printf("%02d:%02d-
%02d:%02d",CityInfo[track[i]].Train[tmp].DepTime/60,CityInf
o[track[i]].Train[tmp].DepTime%60,CityInfo[track[i]].Train[tm
p].ArriveTime/60,CityInfo[track[i]].Train[tmp].ArriveTime%60
);
}
}
else
{
for(i--;i>0;i--)
{
printf("\n%s:",CityName[track[i]]);
end=track[i-1];min=32767;
for (k=0;k<CityInfo[track[i]].FlightNum;k++)
if
(CityInfo[track[i]].Train[k].DesCity==end&&min>CityInfo[track[i]
].Flight[k].Price)
{
min=CityInfo[track[i]].Flight[k].Price;
tmp=k;
}
printf("请乘坐%s次航班起止时间:
",CityInfo[track[i]].Flight[tmp].name);
printf("%02d:%02d-
%02d:%02d",CityInfo[track[i]].Flight[tmp].DepTime/60,CityInfo[tr
ack[i]].Flight[tmp].DepTime%60,CityInfo[track[i]].Flight[tmp].Arri
veTime/60,CityInfo[track[i]].Flight[tmp].ArriveTime%60);
}
}
printf("\n%s: 已到达目的地",CityName[track[0]]);
printf("\n最低价格 : %d\n",cost);
}
ity=i;
CityInfo[i].TrainNum=0; lightNum=0;
rain[CityInfo[j].TrainNum].DesCity=FindNumofCity(TempString3);
rain[CityInfo[j].TrainNum].name,TempString1);
rain[CityInfo[j].TrainNum].DepTime=hour*60+minute;
rain[CityInfo[j].TrainNum].ArriveTime=hour*60+minute;
rain[CityInfo[j].TrainNum].Price=cost; rainNum++;
}
fclose(fp);
fp=fopen(FlightFile,"r");
if (!fp)
{
printf("\n文件打开错误!\n请先初始化系统数据!");
return -1;
}
fscanf(fp,"%d",&num);
for (i=0;i<num;i++)
{
fscanf(fp,"%s",&TempString1);
fscanf(fp,"%s",&TempString2);
fscanf(fp,"%s",&TempString3);
j=FindNumofCity(TempString2);
CityInfo[j].Flight[CityInfo[j].FlightNum].DesCity=FindNumofCity(Te mpString3);
strcpy(CityInfo[j].Flight[CityInfo[j].FlightNum].name,TempString1);
fscanf(fp,"%d:%d",&hour,&minute);
CityInfo[j].Flight[CityInfo[j].FlightNum].DepTime=hour*60+minute;
fscanf(fp,"%d:%d",&hour,&minute);
CityInfo[j].Flight[CityInfo[j].FlightNum].ArriveTime=hour*60+minute;
fscanf(fp,"%d",&cost);
CityInfo[j].Flight[CityInfo[j].FlightNum].Price=cost;
CityInfo[j].FlightNum++; ity=TemPath[i].City;
MinPath[i].FlainNo=TemPath[i].FlainNo;
curPath=curPathNo;
}ity=City; rainNum;i++)
rain[i].DepTime>=(CurTime%1440))&&(CityInfo[City].Train[i
].ArriveTime+(CurTime/1440)*1440-DepTime<MinTime))
lainNo=i;rain[i].DesCity/*(后来调用)现在到达城市可以去
的城市
*/,DesCity,CityInfo[City].Train[i].ArriveTime+(CurTime/1440)
*1440,curPathNo,ByTorByP);
rain[i].DepTime<(CurTime%1440))&&(CityInfo[City].Train[i].
ArriveTime+(CurTime/1440)*1440-DepTime<MinTime))
lainNo=i;
rain[i].DesCity,DesCity,CityInfo[City].Train[i].ArriveTime+(C
urTime/1440+1/*等一天*/)*1440,curPathNo,ByTorByP);
}
}
}
else lightNum;i++)
{
if
((CityInfo[City].Flight[i].DepTime>=CurTime)&&(CityInfo[City].Fligh t[i].ArriveTime+(CurTime/1440)*1440-DepTime<MinTime))
{
TemPath[curPathNo].FlainNo=i;
SearchMinTime(CityInfo[City].Flight[i].DesCity,DesCity,CityI nfo[City].Flight[i].ArriveTime+(CurTime/1440)*1440,curPathNo,B
yTorByP);
}
if
((CityInfo[City].Flight[i].DepTime<CurTime)&&(CityInfo[City].Flight[
i].ArriveTime+(CurTime/1440)*1440-DepTime<MinTime))
{
TemPath[curPathNo].FlainNo=i;
SearchMinTime(CityInfo[City].Flight[i].DesCity,DesCity,CityI nfo[City].Flight[i].ArriveTime+(CurTime/1440+1)*1440,curPathNo
,ByTorByP);
}
}
}
}
return 1;
}
ity=DepCity; rainNum;i++) lainNo=i;rain[i].DepTime;
rain[i].DesCity,DesCity,CityInfo[DepCity].Train[i].ArriveTime,0,ByTor
ByP);
}
}
else lightNum;i++)
{
TemPath[0].FlainNo=i;
DepTime=CityInfo[DepCity].Flight[i].DepTime;
SearchMinTime(CityInfo[DepCity].Flight[i].DesCity,DesCity,CityI nfo[DepCity].Flight[i].ArriveTime,0,ByTorByP);
}
}
if (MinTime==32767)
ity],CityInfo[MinPath[i].City].Train[MinPath[i].FlainNo].name);
ity],CityInfo[MinPath[i].City].Flight[MinPath[i].FlainNo].name);
ity].Train[MinPath[i].FlainNo].DepTime/60,CityInfo[MinPath[i].City].Train[ MinPath[i].FlainNo].DepTime%60,CityInfo[MinPath[i].City].Train[MinPath
[i].FlainNo].ArriveTime/60,CityInfo[MinPath[i].City].Train[MinPath[i].Flai
nNo].ArriveTime%60);
}
printf("%s: 已到达目的地",CityName[DesCity]);
printf("\n旅途耗费时间: %02d:%02d",MinTime/60,MinTime%60);
return 1;
}
rainNum)
{ rain[j].DesCity;
while (end==CityInfo[i].Train[j].DesCity&&j<CityInfo[i].TrainNum) rain[j].Price<min) rain[j].Price;lightNum)
{
min=32767;
end=CityInfo[i].Flight[j].DesCity;
while
(end==CityInfo[i].Flight[j].DesCity&&j<CityInfo[i].FlightNum) {
if (CityInfo[i].Flight[j].Price<min)
{
min=CityInfo[i].Flight[j].Price;
}
j++;
}
ma[i][end]=min;
}
}
} rainNum; rainNum;j++)
{
fprintf(fp,"%s %s %s ", CityInfo[i].Train[j].name,
CityName[i],
CityName[CityInfo[i].Train[j].DesCity]); rain[j].DepTime/60,
CityInfo[i].Train[j].DepTime%60,
CityInfo[i].Train[j].ArriveTime/60,
CityInfo[i].Train[j].ArriveTime%60,
CityInfo[i].Train[j].Price); lightNum; lightNum;j++)
{
fprintf(fp,"%s %s %s ", CityInfo[i].Flight[j].name,
CityName[i],
CityName[CityInfo[i].Flight[j].DesCity]); light[j].DepTime/60,
CityInfo[i].Flight[j].DepTime%60,
CityInfo[i].Flight[j].ArriveTime/60,
CityInfo[i].Flight[j].ArriveTime%60,
CityInfo[i].Flight[j].Price); //起止时间和价格输到文件中}
}
fclose(fp);return 1;
}
//////////////////////////////////////////////////主函数////////////////////////////////////////////// int main()
{
char name[15];
char s_city[15];
char e_city[15];
int Command,cost;
int DepCity,endcity,ByTorByP;
int s_hour,s_minute,e_hour,e_minute;
while (1)
{
StartUI();
scanf("%d",&Command);
switch (Command)
{
case 0: //退出
return 0;
case 1: //添加城市
InitSysData(); //读入所有文档到内存,初始化系统
printf("\n输入城市名:");
scanf("%s",&name);
AddCity(name);//插入城市
SaveSysInfo();//保存到文件
printf("系统数据保存完毕!\n"); break;
case 2: //删除城市
InitSysData(); //读入内存
printf("\n输入城市名:");
scanf("%s",&name); //找到该城市DelCity(name); //删除城市SaveSysInfo(); //保存到文件
printf("系统数据保存完毕!\n"); break;
case 3: //添加交通路线
InitSysData(); //读入内存
printf("起始站城市名:");
scanf("%s",&s_city);
printf("终点站城市名:");
scanf("%s",&e_city);
printf("类型(列车0,飞机1):"); scanf("%d",&ByTorByP);
printf("输入列车/飞机班次:");
scanf("%s",&name);
printf("起始时刻(00:00,24小时制):"); scanf("%2d:%2d",&s_hour,&s_minute); printf("到达时刻(00:00,24小时制):"); scanf("%2d:%2d",&e_hour,&e_minute); printf("票价:");
scanf("%d",&cost);
if (ByTorByP)
{
AddFlight(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_ minute,cost);
}
else
{
AddTrain(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_m inute,cost);
}
SaveSysInfo();
printf("系统数据保存完毕!\n");
break;
case 4: //删除路线
InitSysData();
printf("输入输入列车车次或航班班次:");
scanf("%s",&name);
DelPath(name);
SaveSysInfo();
printf("系统数据保存完毕!\n");
break;
case 5: //最小耗费
InitSysData();
printf("\n起始城市:");
scanf("%s",&name);
DepCity=FindNumofCity(name);
if (DepCity<0)
{
printf("系统中无该城市数据!\n");
break;
}
printf("终点城市:");
scanf("%s",&name);
endcity=FindNumofCity(name);
if (endcity<0)
printf("系统中无该城市数据!\n");
break;
}
printf("乘坐列车请输入0,乘坐飞机请输入1:"); scanf("%d",&ByTorByP);
if (ByTorByP!=0&&ByTorByP!=1)
{
printf("输入错误!");
break;
}
CalcMinPrice(DepCity,endcity,ByTorByP);
printf("\n");
break;
case 6: //最短时间路线
InitSysData();
printf("\n起始城市:");
scanf("%s",&name);
DepCity=FindNumofCity(name);
if (DepCity<0)
{
printf("系统中无此城市数据!\n");
break;
}
printf("终点城市:");
scanf("%s",&name);
endcity=FindNumofCity(name);
if (endcity<0)
{
printf("系统中无此城市数据!\n");
break;
}
printf("乘坐列车请输入0,乘坐飞机请输入1 :"); scanf("%d",&ByTorByP);
if (ByTorByP!=0&&ByTorByP!=1)
printf("输入错误!");
break;
}
CalcMinTime(DepCity,endcity,ByTorByP);
printf("\n");
break;
}
}
}。