(数据结构(C语言版))
班级: 信管B08-1班 姓名:
设计题目: 交通咨询系统
设计时间:__2010-9-6_____至___2010-9-16____
指导教师:______ _____ _______________
评 语:________________________________
_________________________________________
_________________________________________
_________________________________________
_________________________________________
评阅成绩:__ __评阅教师:__ ___
《数据结构(C语言版)》课程设计实验报告
开课实验室: 基础实验室一 2010 年9 月16 日
实验题目 | 交通咨询系统 | ||||
一.实验题目 1、问题描述: 出于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。 2.、基本要求 (1)提供对城市信息进行编辑(如:添加或删除)的功能。 (2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。 (3)提供两种最优决策:最快到达和最省钱到达。全程只考虑一种交通工具。 (4)旅途中耗费的总时间应该包括中转站的等候时间。 (5)咨询以用户和计算机的对话方式进行。由拥护输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。 二.实验设备及环境 PC兼容机、Windows操作系统、Turbo C/Win tc,Vc++软件等。 三.功能模块简介和系统结构图 系统结构图: 功能模块具体简介如下: 本系统进入时需要选择您的身份:管理员或用户。 (1)管理员: 要进入管理员界面,首先需要输入用户名和密码。为本系统方便使用,用户名和密码都默认为123456。输入正确的用户名和密码后,即可进入管理员界面,若输入错误,则退回主界面。 管理员界面有5个选项:添加城市、删除城市、添加交通路线、删除交通路线、返回上一级菜单。添加城市和删除城市只需输入城市名即可删除该城市,添加交通路线需要输入起始站城市名、终点站城市名、选择交通工具、火车(飞机)班次、起始时刻、到达时刻和票价,删除交通路线需输入班次。若添加信息成功,会显示“系统信息输入成功!”,若输入选择序号错误,会显示“选择序号错误!请重新选择!”。返回上一级菜单是返回主界面。 输入的信息会分别写入city.txt,train,txt,flight,txt中,用户查询路线时会从文件中读入。 (2)用户: 用户界面有4个选项:查询最小耗费路线、查询最短时间路线、查询城市所有路线、返回上一级菜单。查询最小耗费和最短时间是一个图的最短路径问题,因此用迪杰斯特拉(Dijkstra)算法按路径长度递增的顺序逐步产生最短路径的方法。 最小耗费的编程思想如下:先设置一个二维数组,第一个下标放置城市编号,第二个下标为第一个下标城市中花费最小的终点站城市编号,数组放置的数据为所需要的花费。先判断初始城市和终点城市是否在交通路线中,再设置一个数组,将已找到的最小花费的城市放入这个数组。初始状态时,该数组只包含初始城市,然后不断的选取到该城市花费最小的路线加入数组中,直至找到终点城市。这就是迪杰斯特拉算法。最短时间的路线也是用此算法计算的。 查询城市所有路线需要输入所要查询的城市名和选择交通工具,可显示该城市中所选交通工具的所有路线。 四.系统的主要界面设计及运行说明: 该图为主界面,选择序号即可进入所需界面。进入管理员界面需经过身份验证,输入用户名和密码,本程序用户名和密码均为123456。 此图为管理员界面,这是添加交通路线的例子。 此图为删除交通路线的例子。 此图为已输入的火车路线的保存文件。第一个数字表示的是火车路线总数,城市文件和飞机路线文件同此文件类似。 此图为查询火车最小耗费路线。这是两地之间无中转站的例子。 此图为查询火车最小耗费路线时两地之间有中转站的例子。飞机路线查询同此。 此图为查询最短时间路线。此为两站中无中转站的例子。有中转站和飞机路线同最小耗费路线的图类似。 此图为查询城市所有路线。此为查找北京所有火车的例子。 程序中所用到的时刻表: 列车时刻表 车 次 | 出 发 地 | 到 达 地 | 出发时间 | 到达时间 | 车 费 |
27 | 北京 郑州 西安 郑州 | 郑州 西安 郑州 北京 | 13:15 21:24 05:41 13:42 | 21:12 05:13 13:30 21:39 | 78元 82元 82元 78元 |
41 | 北京 郑州 上海 郑州 | 郑州 上海 郑州 北京 | 7:11 15:20 00:35 09:40 | 15:08 00:13 09:28 17:37 | 90元 100元 100元 90元 |
59 | 上海 广州 | 广州 上海 | 08:20 03:39 | 03:16 22:53 | 182元 |
134 | 兰州 北京 | 北京 兰州 | 03:52 19:24 | 18:56 10:28 | 162元 |
323 | 广州 昆明 | 昆明 广州 | 06:18 16:31 | 16:14 02:27 | 102元 |
873 | 武汉 昆明 | 昆明 武汉 | 07:13 21:42 | 21:17 11:46 | 134元 |
116 | 武汉 长沙 | 长沙 武汉 | 09:36 18:54 | 18:32 03:48 | 98元 |
373 | 长沙 广州 | 广州 长沙 | 13:15 00:35 | 00:15 11:35 | 116元 |
747 | 兰州 武汉 | 武汉 兰州 | 17:41 15:13 | 14:47 12:19 | 210元 |
机 号 | 出 发 地 | 到 达 地 | 出发时间 | 到达时间 | 费 用 |
6320 | 北京 上海 | 上海 北京 | 16:20 18:00 | 17:25 19:05 | 680元 |
201 | 北京 西安 | 西安 北京 | 15:25 12:35 | 17:00 14:15 | 930元 |
2323 | 西安 广州 | 广州 西安 | 7:15 10:15 | 9:35 11:35 | 1320元 |
173 | 拉萨 昆明 | 昆明 拉萨 | 10:20 12:35 | 11:45 14:00 | 830元 |
3304 | 拉萨 武汉 | 武汉 拉萨 | 14:15 16:25 | 15:45 17:55 | 0元 |
4723 | 武汉 广州 | 广州 武汉 | 7:05 11:25 | 8:45 13 :05 | 810元 |
#include #include #define Dij_MAXN 33 #define MAX_VERTEX_NUM 31 #define MAX_STRING_NUM 10 #define MAX_TRAFFIC_NUM 10 typedef short int CityType; typedef struct TrafficNode { char name[MAX_STRING_NUM]; //班次 int StartTime,StopTime; //起止时间 int EndCity; //火车到达城市的编号 int Cost; //票价 } TrafficNodeDat; typedef struct VNode { CityType city; //城市编号 int TrainNum,FlightNum; //标记下面Train数组和Flight数组里元素个数 TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、起止时间、票价和班次 TrafficNodeDat Flight[MAX_TRAFFIC_NUM]; } VNodeDat; typedef struct PNode { int City; int TraNo; } PNodeDat; char CityName[MAX_VERTEX_NUM][MAX_STRING_NUM]; //城市名,采用第一下标为该城市在本程序中的编号 int CityNum; //城市数目 VNodeDat AdjList[MAX_VERTEX_NUM]; //下标所在城市的线路 PNodeDat Path[MAX_VERTEX_NUM]; //存储临时最小时间路径 PNodeDat MinPath[MAX_VERTEX_NUM]; //存储搜索到当前的最小时间路径 int MinTime,StartTime; int curPath; int SeekCity(char *name) { //查找城市 int i; for(i=0;i return i; return -1; } int SaveFile() { //将火车飞机交通信息写入文件 FILE *fp; int i,j,total; if((fp=fopen("city.txt {printf("\\n\无法打开文件!\\n"); return -1;} fprintf(fp,"%d\\n",CityNum);//在city文件中输入城市总数 for(i=0;i fclose(fp); total=0; if((fp=fopen("train.txt {printf("\\n\无法打开文件!\\n"); return -1;} for(i=0;i fprintf(fp,"%d\\n",total);//在train文件中输入火车总数 for(i=0;i fprintf(fp,"%s %s %s ",AdjList[i].Train[j].name,CityName[i], CityName[AdjList[i].Train[j].EndCity]); //输入火车车次,始发站和终点站 fprintf(fp,"%2d:%2d %2d:%2d %d\\n",AdjList[i].Train[j].StartTime/60, AdjList[i].Train[j].StartTime%60, AdjList[i].Train[j].StopTime/60, AdjList[i].Train[j].StopTime%60, AdjList[i].Train[j].Cost);//输入发车时间和到站时间和费用 } fclose(fp); total=0; if((fp=fopen("flight.txt {printf("\\n\无法打开文件!\\n");return -1;} for(i=0;i fprintf(fp,"%d\\n",total);//在flight文件中输入飞机总数 for(i=0;i fprintf(fp,"%s %s %s ",AdjList[i].Flight[j].name,CityName[i], CityName[AdjList[i].Flight[j].EndCity]); //输入飞机航班号,始发站和终点站 fprintf(fp,"%2d:%2d %2d:%2d %d\\n",AdjList[i].Flight[j].StartTime/60, AdjList[i].Flight[j].StartTime%60, AdjList[i].Flight[j].StopTime/60, AdjList[i].Flight[j].StopTime%60, AdjList[i].Flight[j].Cost);//输入起飞时间,到达时间和费用 } fclose(fp);return 1; } int InsertCity(char *Name) { //添加城市 strcpy(CityName[CityNum],Name); AdjList[CityNum].city=CityNum;//设置城市编号 AdjList[CityNum].FlightNum=0; AdjList[CityNum].TrainNum=0;//新增城市火车数和飞机数初始为零 CityNum++;//城市总数加1 return 1; } int DelCity(char *Name) { //删除城市 int city,i,j; city=SeekCity(Name); for(i=city;i strcpy(CityName[i],CityName[i+1]); AdjList[i].FlightNum=AdjList[i+1].FlightNum;AdjList[i].TrainNum=AdjList[i+1].TrainNum; for(j=0;j AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost; AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity; strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name); AdjList[i].Flight[j].StartTime=AdjList[i+1].Flight[j].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i+1].Flight[j].StopTime; } } CityNum--;return 1; } int InsertTrain(char *train,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost) { //添加火车路线 int i,j; i=SeekCity(StartCity);j=SeekCity(EndCity); AdjList[i].Train[AdjList[i].TrainNum].Cost=cost;AdjList[i].Train[AdjList[i].TrainNum].EndCity=j; AdjList[i].Train[AdjList[i].TrainNum].StartTime=StartTime; AdjList[i].Train[AdjList[i].TrainNum].StopTime=EndTime; strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train); AdjList[i].TrainNum++;return 1; } int InsertFlight(char *flight,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost) { //添加飞机路线 int i,j; i=SeekCity(StartCity);j=SeekCity(EndCity); AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j; AdjList[i].Flight[AdjList[i].FlightNum].StartTime=StartTime; AdjList[i].Flight[AdjList[i].FlightNum].StopTime=EndTime; strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight); AdjList[i].FlightNum++; return 1; } int DelPath(char *name) { //删除路线 int i,j,flag=0; for(i=0;i for(j=0;j {flag=1;break;//找到要删除的路线,找到跳出for循环} if(flag) { for(;j AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost; AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity; strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name); AdjList[i].Flight[j].StartTime=AdjList[i].Flight[j+1].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i].Flight[j+1].StopTime; } AdjList[i].FlightNum--;break;//将要删除路线后面的路线全部向前移,并将总数减1 } for(j=0;j {flag=1;break;} if(flag) { for(;j AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost; AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity; strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name); AdjList[i].Train[j].StartTime=AdjList[i].Train[j+1].StartTime; AdjList[i].Train[j].StopTime=AdjList[i].Train[j+1].StopTime; } AdjList[i].TrainNum--;break; } } return 1; } void Dijkstra_Output(int s[30][30],int PreCity[30],int p_end,int TravelType) { //输出最短路径 int track[30]; int i=0,j,k,min,tmp,end,cost=0; j=p_end; track[i++]=j;//下标为0中存储了终点站的城市编号,i变为1 while(PreCity[j]>=0) { cost+=s[PreCity[j]][j];//循环后cost为总费用 j=PreCity[j];track[i++]=j; } printf("\\n\您要查找的路线为:"); printf("\\n\*─────────────────────────────*\\n"); printf("\车号 起始站 终点站 时间 花费\\n"); if(!TravelType)//类型为火车 { for(i--;i>0;i--)//初始时i--后i为路线中的城市数目 { end=track[i-1];min=32767; for(k=0;k { min=AdjList[track[i]].Train[k].Cost;//min为路径中的最小花费 tmp=k;//k为一条路径中花费最小的火车编号 } printf("\\n\%s",AdjList[track[i]].Train[tmp].name);//输出火车班次 printf("\%10s",CityName[track[i]]);//输出起始城市名 printf("\%10s",CityName[track[i-1]]);//输出终点城市名 printf("\%2d:%2d-%2d:%2d",AdjList[track[i]].Train[tmp].StartTime/60, AdjList[track[i]].Train[tmp].StartTime%60, AdjList[track[i]].Train[tmp].StopTime/60, AdjList[track[i]].Train[tmp].StopTime%60);//输出起止时间 printf("\%d\\n",AdjList[track[i]].Train[tmp].Cost);//输出花费 } } else//类型为飞机 { for(i--;i>0;i--) { end=track[i-1];min=32767; for(k=0;k {min=AdjList[track[i]].Flight[k].Cost;tmp=k;} printf("\\n\%s",AdjList[track[i]].Flight[tmp].name);printf("\%10s",CityName[track[i]]); printf("\%10s",CityName[track[i-1]]); printf("\%2d:%2d-%2d:%2d",AdjList[track[i]].Flight[tmp].StartTime/60, AdjList[track[i]].Flight[tmp].StartTime%60, AdjList[track[i]].Flight[tmp].StopTime/60, AdjList[track[i]].Flight[tmp].StopTime%60); printf("\%d\\n",AdjList[track[i]].Flight[tmp].Cost); } } printf("\\n\最终花费: %d\\n",cost); printf("\*─────────────────────────────*\\n"); } void Dijkstra(int s[30][30],int p_start,int p_end,int TravelType) { //迪杰斯特拉算法计算最短路径 int PreCity[30];//数组的值为计算出的路线中下标表示的城市中的前一个城市编号 int i,j,min,pre,pos; for(i=0;i while(PreCity[p_end]==-1) { min=-1; for(i=0;i { for(j=0;j pre=i;pos=j;//j为起始站中花费最小的到达站的城市编号 min=s[i][j]; } } PreCity[pos]=pre; } Dijkstra_Output(s,PreCity,p_end,TravelType); } int CalcMinCost(int StartCity,int EndCity,int TravelType) { //查询最小耗费路线 int s[30][30]; int i,j,min,end,flag1,flag2; flag1=0;flag2=0; for(i=0;i if(TravelType==0)//判断初始城市和终点城市是否在火车交通路线中 for(i=0;i if(AdjList[i].Train[j].EndCity==StartCity) flag1=1; if(AdjList[i].Train[j].EndCity==EndCity) flag2=1; } else if(TravelType==1)//判断初始和终点城市是否在飞机交通路线中 for(i=0;i if(AdjList[i].Flight[j].EndCity==StartCity) flag1=1; if(AdjList[i].Flight[j].EndCity==EndCity) flag2=1; } if(flag1!=1||flag2!=1) {printf("\\n\抱歉!没有您要查找的路线!");return 0;} if(TravelType==0) { for(i=0;i min=32767;j=0; while(j min=32767;end=AdjList[i].Train[j].EndCity; while(end==AdjList[i].Train[j].EndCity&&j if(AdjList[i].Train[j].Cost }//min为i城市中的最小花费,end为其路线终点站 s[i][end]=min; } } } else { for(i=0;i min=32767;j=0; while(j min=32767;end=AdjList[i].Flight[j].EndCity; while(end==AdjList[i].Flight[j].EndCity&&j if(AdjList[i].Flight[j].Cost } s[i][end]=min; } } } Dijkstra(s,StartCity,EndCity,TravelType); return 1; } int SearchMinTime (CityType City,CityType EndCity,int CurTime,int curPathNo,int TravelType) { //计算出最短时间 int i; if (City==EndCity)//若到达城市为终点站 { if (MinTime>CurTime-StartTime) { for (i=0;i<=curPathNo;i++) { MinPath[i].City=Path[i].City; MinPath[i].TraNo=Path[i].TraNo; curPath=curPathNo; } MinTime=CurTime-StartTime; } } else { curPathNo++; Path[curPathNo].City=City; if (!TravelType) { for (i=0;i if ((AdjList[City].Train[i].StartTime>=(CurTime%1440))&& (AdjList[City].Train[i].StopTime+(CurTime/1440)*1440-StartTime //到达车站的发车时间要比始发车的到达时间晚,同时已经经过的时间加上要做火车的时间要比最小时间还小 //即选择发车时间在上一辆火车之后,要花费时间最少的路线 Path[curPathNo].TraNo=i; SearchMinTime(AdjList[City].Train[i].EndCity,EndCity, AdjList[City].Train[i].StopTime+(CurTime/1440)*1440,curPathNo,TravelType); } if ((AdjList[City].Train[i].StartTime<(CurTime%1440))&& (AdjList[City].Train[i].StopTime+(CurTime/1440)*1440-StartTime //若发车时间在上一辆火车之前,则多待一天 Path[curPathNo].TraNo=i; SearchMinTime(AdjList[City].Train[i].EndCity,EndCity, AdjList[City].Train[i].StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType); } } } else { for (i=0;i if ((AdjList[City].Flight[i].StartTime>=CurTime)&& (AdjList[City].Flight[i].StopTime+(CurTime/1440)*1440-StartTime Path[curPathNo].TraNo=i; SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity, AdjList[City].Flight[i].StopTime+(CurTime/1440)*1440,curPathNo,TravelType); } if ((AdjList[City].Flight[i].StartTime Path[curPathNo].TraNo=i; SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity, AdjList[City].Flight[i].StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType); } } } } return 1; } int CalcMinTime(int StartCity,int EndCity,int TravelType) { //查询最短时间路线 int i; int hour,minute; MinTime=32767;curPath=0;Path[0].City=StartCity; if(!TravelType) for(i=0;i Path[0].TraNo=i;StartTime=AdjList[StartCity].Train[i].StartTime; SearchMinTime(AdjList[StartCity].Train[i].EndCity,EndCity, AdjList[StartCity].Train[i].StopTime,0,TravelType); } else for(i=0;i Path[0].TraNo=i; StartTime=AdjList[StartCity].Flight[i].StartTime; SearchMinTime(AdjList[StartCity].Flight[i].EndCity,EndCity, AdjList[StartCity].Flight[i].StopTime,0,TravelType); } if(MinTime==32767) {printf("\\n\抱歉!没有您要查找的路线!");return 0;} printf("\\n\您要查找的路线为:"); printf("\\n\*─────────────────────────────*\\n"); printf("\车号 起始站 终点站 时间 花费\\n"); for(i=0;i<=curPath;i++) { if(!TravelType) { printf("\\n%10s\%10s",AdjList[MinPath[i].City].Train[MinPath[i].TraNo].name, CityName[MinPath[i].City]); printf("\%10s",CityName[AdjList[MinPath[i].City].Train[MinPath[i].TraNo].EndCity]); printf("\%2d:%2d-%2d:%2d",AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime/60, AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime%60, AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime/60, AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime%60); printf("\%d\\n",AdjList[MinPath[i].City].Train[MinPath[i].TraNo].Cost); } else { printf("\\n%10s\%10s",AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].name, CityName[MinPath[i].City]); printf("\%10s",CityName[AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].EndCity]); printf("\%2d:%2d-%2d:%2d",AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].StartTime/60, AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].StartTime%60, AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].StopTime/60, AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].StopTime%60); printf("\%d\\n",AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].Cost); } } hour=MinTime/60;minute=MinTime%60; if(hour<0) hour+=23; if(minute<0) minute+=60; printf("\\n\最短时间: %2d:%2d\\n",hour,minute); printf("\*─────────────────────────────*\\n"); return 1; } int InitSystem() { //从文件中读信息 FILE *fp; int i,j,hour,minute,num,cost; char stmp1[10];char stmp2[10];char stmp3[10]; fp=fopen("city.txt if(!fp) {printf("\\n\无法打开文件!\\n");return -1;} fscanf(fp,"%d",&CityNum);//读入城市总数 for(i=0;i fscanf(fp,"%s",&CityName[i]); AdjList[i].city=i;AdjList[i].TrainNum=0;AdjList[i].FlightNum=0; } fclose(fp); fp=fopen("train.txt if(!fp) {printf("\\n\无法打开文件!\\n");return -1;} fscanf(fp,"%d",&num);//读入火车总数 for(i=0;i fscanf(fp,"%s",&stmp1);//车次 fscanf(fp,"%s",&stmp2);//始发站 fscanf(fp,"%s",&stmp3);//终点站 j=SeekCity(stmp2);//查找始发站城市编号 AdjList[j].Train[AdjList[j].TrainNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Train[AdjList[j].TrainNum].name,stmp1); fscanf(fp,"%d:%d",&hour,&minute); AdjList[j].Train[AdjList[j].TrainNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute); AdjList[j].Train[AdjList[j].TrainNum].StopTime=hour*60+minute;; fscanf(fp,"%d",&cost); AdjList[j].Train[AdjList[j].TrainNum].Cost=cost; AdjList[j].TrainNum++; } fclose(fp); fp=fopen("flight.txt if(!fp) {printf("\\n\无法打开文件!\\n");return -1;} fscanf(fp,"%d",&num); for(i=0;i fscanf(fp,"%s",&stmp1);//航班号 fscanf(fp,"%s",&stmp2);//始发站 fscanf(fp,"%s",&stmp3);//终点站 j=SeekCity(stmp2); AdjList[j].Flight[AdjList[j].FlightNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Flight[AdjList[j].FlightNum].name,stmp1); fscanf(fp,"%d:%d",&hour,&minute); AdjList[j].Flight[AdjList[j].FlightNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute); AdjList[j].Flight[AdjList[j].FlightNum].StopTime=hour*60+minute;; fscanf(fp,"%d",&cost); AdjList[j].Flight[AdjList[j].FlightNum].Cost=cost; AdjList[j].FlightNum++; } fclose(fp); return 1; } void Administrators() { //管理员的界面 char name[10];char s_city[10];char e_city[10]; int Command,cost,flag; int traveltype; int s_hour,s_minute,e_hour,e_minute; char user[10],password[10]; printf("\\n\请输入用户名:"); scanf("%s",&user); printf("\\n\请输入密码:"); scanf("%s",&password); if((strcmp("123456",user)!=0)||(strcmp("123456",password)!=0)) {printf("\\n\输入信息错误!\\n");return;} do { printf("\\n\******这里是管理员的界面,欢迎进入******\\n"); printf("\*━━━━━━━━━━━━━━━━━━━*\\n"); printf("\ 1.添加城市\\n"); printf("\ 2.删除城市\\n"); printf("\ 3.添加交通路线\\n"); printf("\ 4.删除交通路线\\n"); printf("\ 0.返回上一级菜单\\n"); printf("\****************************************\\n"); printf("\\n\请选择:"); scanf("%d",&Command); switch(Command) { case 0: return; case 1://添加城市 InitSystem(); printf("\\n\输入城市名:"); scanf("%s",&name); InsertCity(name); SaveFile(); printf("\系统信息输入成功!\\n"); break; case 2://删除城市 InitSystem(); printf("\\n\输入城市名:"); scanf("%s",&name); DelCity(name); SaveFile(); printf("\系统信息输入成功!\\n"); break; case 3://添加交通路线 InitSystem(); printf("\请输入起始站城市名:"); scanf("%s",&s_city); printf("\请输入终点站城市名:"); scanf("%s",&e_city); printf("\请选择交通工具(火车0,飞机1):"); scanf("%d",&traveltype); 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(traveltype) InsertFlight(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost); else InsertTrain(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost); SaveFile(); printf("\系统信息输入成功!\\n"); break; case 4://删除交通路线 InitSystem(); printf("\请输入班次:"); scanf("%s",&name); DelPath(name); SaveFile(); printf("\系统信息输入成功!\\n"); break; default: printf("\选择序号错误!请重新选择!\\n"); flag=1; } }while(flag); } void Line(int city,int traveltype) { //查找城市中的所有路线 int i; printf("\\n\您要查找的路线为:"); printf("\\n\*─────────────────────────────*\\n"); printf("\车号 起始站 终点站 时间 花费\\n"); if(!traveltype)//类型为火车 { for(i=0;i printf("\\n\%s",AdjList[city].Train[i].name);//输出火车班次 printf("\%10s",CityName[city]);//输出起始城市名 printf("\%10s",CityName[AdjList[city].Train[i].EndCity]);//输出终点城市名 printf("\%2d:%2d-%2d:%2d",AdjList[city].Train[i].StartTime/60, AdjList[city].Train[i].StartTime%60, AdjList[city].Train[i].StopTime/60, AdjList[city].Train[i].StopTime%60);//输出起止时间 printf("\%d\\n",AdjList[city].Train[i].Cost);//输出花费 } } else { for(i=0;i printf("\\n\%s",AdjList[city].Flight[i].name);//输出火车班次 printf("\%10s",CityName[city]);//输出起始城市名 printf("\%10s",CityName[AdjList[city].Flight[i].EndCity]);//输出终点城市名 printf("\%2d:%2d-%2d:%2d",AdjList[city].Flight[i].StartTime/60, AdjList[city].Flight[i].StartTime%60, AdjList[city].Flight[i].StopTime/60, AdjList[city].Flight[i].StopTime%60);//输出起止时间 printf("\%d\\n",AdjList[city].Flight[i].Cost);//输出花费 } } printf("\*─────────────────────────────*\\n"); } void User() { //用户界面 char name[10]; int startcity,endcity; int Command,flag,traveltype; do { printf("\\n\*******这里是用户的界面,欢迎进入*******\\n"); printf("\*━━━━━━━━━━━━━━━━━━━*\\n"); printf("\ 1.查询最小耗费路线\\n"); printf("\ 2.查询最短时间路线\\n"); printf("\ 3.查询城市所有路线\\n"); printf("\ 0.返回上一级菜单\\n"); printf("\****************************************\\n"); printf("\\n\请选择:"); scanf("%d",&Command); switch(Command) { case 0: return; case 1://最小耗费 InitSystem(); printf("\\n\请输入起始城市:"); scanf("%s",&name); startcity=SeekCity(name); if(startcity<0) { printf("\输入城市名错误!\\n"); break; } printf("\请输入终点城市:"); scanf("%s",&name); endcity=SeekCity(name); if(endcity<0) { printf("\输入城市名错误!\\n"); break; } printf("\请选择交通工具(火车0,飞机1):"); scanf("%d",&traveltype); if(traveltype!=0&&traveltype!=1) { printf("\输入错误!\\n"); break; } CalcMinCost(startcity,endcity,traveltype); printf("\\n"); break; case 2://最短时间 InitSystem(); printf("\\n\请输入起始城市:"); scanf("%s",&name); startcity=SeekCity(name); if(startcity<0) { printf("\输入城市名错误!\\n"); break; } printf("\请输入终点城市:"); scanf("%s",&name); endcity=SeekCity(name); if(endcity<0) { printf("\输入城市名错误!\\n"); break; } printf("\请选择交通工具(火车0,飞机1):"); scanf("%d",&traveltype); if(traveltype!=0&&traveltype!=1) { printf("\输入错误!\\n"); break; } CalcMinTime(startcity,endcity,traveltype); printf("\\n"); break; case 3://查找城市所有路线 InitSystem(); printf("\\n\请输入要查找路线的城市:"); scanf("%s",&name); startcity=SeekCity(name); if(startcity<0) { printf("\输入城市名错误!\\n"); break; } printf("\请选择交通工具(火车0,飞机1):"); scanf("%d",&traveltype); if(traveltype!=0&&traveltype!=1) { printf("\输入错误!\\n"); break; } Line(startcity,traveltype); printf("\\n"); break; default: printf("\选择序号错误!请重新选择!\\n"); flag=1; } }while(flag); } int main() { //主界面 int Command; while(1) { printf("\\n\┏****★欢迎使用交通咨询系统V1.0★****┓\\n"); printf("\┗━━━━━━━━━━━━━━━━━━┛\\n"); printf("\ ------------请选择您的身份------------\\n"); printf("\ *━━━━━━━━━━━━━━━━━━*\\n"); printf("\ 1.管理员\\n"); printf("\ 2.用户\\n"); printf("\ 0.退出\\n"); printf("\ **************************************\\n"); printf("\\n\请选择:"); scanf("%d",&Command); switch(Command) { case 0: return 0; case 1: Administrators(); break; case 2: User(); break; default: printf("\选择序号错误!请重新选择!\\n"); } } } 六.实验总结: 课程设计是对自己一个学期以来学习的良好检验,在所有课题中,我选择了交通咨询系统的课题题目。在一个星期的设计过程中,碰到过许多困难,也从书籍和网络中找过许多相关资料来完善自己的设计。但结果不是让人很满意,可能是接触时间太短,对数据结构的认识还不深刻。 通过这次课程设计,我对用迪杰斯特拉算法计算最短路径有了更深刻的认识,加强了我对数据结构的了解。我知道如果要想在C方面有成就,必须多想多练习。现在我还是缺少练习,看程序可能看得懂。而当真正的编写程序起来就遇到困难了。通过这次系统的编写,我明白了编程要细心,有耐心。有些程序看起来很多很难,但只要抽丝剥茧的慢慢分析,就能明白它是怎么运行的。其实,只要踏踏实实一步一步来,你会发觉原来编程难度也不过如此。同时,我懂得了要多思考,遇到问题或不解时不能不懂装懂,要尽量去想请清其缘由,要懂得查阅有用的资料。我知道在这次的课程设计中自已还有许多的欠缺,在以后的日子中,我一定得更加严格要求自己,改正缺点,不断努力,不断进步。