开发工具:
文件大小: 43kb
下载次数: 0
上传时间: 2010-07-19
详细说明: 设计要求: 出于不同目的的旅客对交通工具有不同的要求.例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少.编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询. printf("资料来源:www.zhuicha.com 追查网 请保留此信息,谢谢\n"); printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网\n"); 1.需求分析: (1)提供对城市信息进行编辑(如添加或删除)的功能. (2)城市之间有两种交通工具:火车和飞机.提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能. (3)提供两种最优决策:最快到达或最省钱到达.全程只考虑一种交通工具. 2设计 设计思想 存储结构 struct Tra_Tool{ char* id; char* start; char* destination; float time;/*旅途时间*/ float price; }; 主要算法的基本思想: 从题目上来分析我认为这是一个图的最短 路径问题.因此决定用Dijkstra算法按路径长度递增的顺序逐步产生最短路径的方法:设置两个顶点的集合T和S,集合S中存放已找到的最短路径的顶点,集合T中存放当前还未找到的最短路径的顶点.初始状态时,集合S中只包含源点V0,然后不断从集合T中选取到顶点V0路径长度最短的顶点加入到集合S中,集合S中每加入一个新的顶点U,都要修改顶点V0到集合T中剩余顶点的最短路径长度值,集合T中各顶点新的最短路径长度值为原来的最短路径长度值与顶点U的最短路径长度只值中的较小的.此过程不断重复,直到集合T的顶点全部加入到集合S为止. 调试分析: 此程序结构体虽然简单,但是算法中的调用和实现并不简单,因此调试过程中还是花了不少心血,尤其是在多个城市间选择最短路径时,时常出错,权值总是输入与运算相差很远,但工夫不负有心人,终于调试成功. 源程序清单: #include #include #include const float max=FLT_MAX;/* */ struct Tra_Tool{ char* id; char* start; char* destination; float time;/*旅途时间*/ float price; }; int search(char citytable[][20],char* city,int cn) { /*在城市数组中查找某个城市*/ int i; for(i=0;i if(strcmp(citytable,city)==0) return i; } return -1; } /*最优线路*/ void short_path(struct Tra_Tool* timetable,char* start,char* dest,char city[][20],int tn,int cn,int choice) { /*start表示出发地,dest表示目的地,tn表示表示航班或车次的总次数,cn表示城市的总数*/ /*choice=0表示求最短时间路线,choice=1表示求最少花费路线*/ int i,j,k,st,et; float min,t; char pcity[10][20]; float edge[15][15],dist[15]; int path[15],s[15]; for(i=0;i for(j=0;j{ edge[j]=max; } for(i=0;i{ j=search(city,timetable.start,cn); k=search(city,timetable.destination,cn); if(choice==0) {/*最短时间*/ t=timetable.time; if(t } else {/*最少花费*/ t=timetable.price; if(t } } st=search(city,start,cn); et=search(city,dest,cn); for(i=0;i dist=edge[st]; s=0; if(i!=st&&dist else path=-1; } s[st]=1; dist[st]=0; for(i=0;i min=max; k=st; for(j=0;j if(!s[j]&&dist[j]{k=j;min=dist[j];} s[k]=1; for(j=0;j if(!s[j]&&edge[k][j] printf("%s\t",pcity[j]); printf("\n"); if(choice==0) printf("total time is:%5.1f\n",dist[et]); else printf("total money is:%7.2f\n",dist[et]); printf("\n"); } void main(){ int i,j,k,m,n,cn=5,tn=6,fn=6; char city[15][20]={"北京","上海","天津","武汉","广州"};//最多15个城市 struct Tra_Tool train[20]={{"T1","武汉","北京",10,90},{"T2","上海","北京",8,70}, {"T3","北京","天津",3,30},{"T4","广州","北京",25,200},{"T5","广州","武汉",14,120}, {"T6","武汉","上海",8,80}}; struct Tra_Tool flight[20]={{"F1","武汉","北京",3,500},{"F2","上海","北京",2.5,400}, {"F3","北京","天津",1,200},{"F4","广州","北京",6,1400},{"F5","广州","武汉",5,700}, {"F6","武汉","上海",3,450}}; label1: printf("资料来源:www.zhuicha.com 追查网 请保留此信息,谢谢\n"); printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网\n"); printf("系统功能:\n"); printf("1.编辑城市信息\n2.编辑火车时刻表\n3.编辑飞机航班表\n4.选择出游路线\n5.退出\n"); printf("请选择:"); scanf("%d",&i); printf("\n"); switch(i) { case 1:{ label2: printf("现有城市:\n"); for(j=0;j printf("%d.%s\t",j+1,city[j]); printf("\n\n"); printf("功能:1.添加\n2.删除\n3.返回\n"); printf("请选择:"); scanf("%d",&j); printf("\n"); if(j==1) { printf("请输入城市名:"); scanf("%s",city[cn]); cn++; goto label2; } if(j==2) { printf("请选择要删除的城市的编号:"); scanf("%d",&k); if(k==cn) cn--; else{ for(m=k-1;m strcpy(city[m],city[m+1]); cn--;} goto label2;} else goto label1;} case 2:{ label3: printf("火车时刻表:\n"); printf("资料来源:www.zhuicha.com 追查网 请保留此信息,谢谢\n"); printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网\n"); printf(" 车次\n起点站\n终点站\n路途时间\n票价\n"); for(j=0;j printf("%d: %s\t%s\t%s\t%5.1f\t\t%5.2f\t\n",j+1,train[j].id,train[j].start,train[j].destination, train[j].time,train[j].price); printf("\n\n"); printf("功能:1.添加\t2.删除\t3.返回\n"); printf("请选择:"); scanf("%d",&j); printf("\n"); if(j==1){ printf("现有城市:\n"); for(k=0;k printf("%d.%s\t",k+1,city[k]); printf("\n"); printf("请输入数据:\n"); printf("火车时刻表:\n"); printf("车次\n起点站\n终点站\n路途时间\n票价\n"); scanf("%s%s%s%f%f",train[tn].id,train[tn].start,train[tn].destination,&train[tn].time,&train[tn].price); tn++; goto label3;} else if(j==2){ printf("请选择编号:"); scanf("%d",&k); if(k==tn) tn--; else{ for(m=k-1;m train[m]=train[m+1]; tn--;} goto label3;} else goto label1; } case 3:{ label4: printf("飞机航班表:\n"); printf(" 班次\t起点\t终点\t路途时间\t票价\n"); for(j=0;j printf("%d: %s\t%s\t%s\t%5.1f\t\t%5.2f\t\n",j+1,flight[j].id,flight[j].start,flight[j].destination, flight[j].time,flight[j].price); printf("\n\n"); printf("功能:1.添加\t2.删除\t3.返回\n"); printf("资料来源:www.zhuicha.com 追查网 请保留此信息,谢谢"); printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 "); printf("请选择:"); scanf("%d",&j); printf("\n"); if(j==1){ printf("现有城市:\n"); for(k=0;k printf("%d.%s\t",k+1,city[k]); printf("\n"); printf("请输入数据:\n"); printf("车次\t起点站\t终点站\t路途时间\t票价\n"); printf("资料来源:www.zhuicha.com 追查网 请保留此信息,谢谢"); printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 "); scanf("%s%s%s%f%f",flight[fn].id,flight[fn].start,flight[fn].destination,&flight[fn].time,&flight[fn].price); fn++; goto label4;} else if(j==2){ printf("请选择编号:"); scanf("%d",&k); if(k==fn) fn--; else{ for(m=k-1;m flight[m]=flight[m+1]; fn--;} goto label4;} else goto label1;} case 4:{ printf("请选择交通工具(1.火车 2.飞机):"); scanf("%d",&j); printf("请选择决策方案(1.最短时间 2.最少花费):"); printf("资料来源:www.zhuicha.com 追查网 请保留此信息,谢谢"); printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 "); scanf("%d",&k); printf("现有城市:\n"); for(i=0;i printf("%d.%s\t",i+1,city); printf("\n"); printf("出发地:"); scanf("%d",&m); printf("目的地:"); scanf("%d",&n); printf("\n"); if(j==1&&k==1) if(j==1&&k==2) short_path(train,city[m-1],city[n-1],city,6,5,1); if(j==2&&k==1) short_path(flight,city[m-1],city[n-1],city,6,5,0); if(j==2&&k==2) short_path(flight,city[m-1],city[n-1],city,6,5,1); goto label1; } case 5: return;}} printf("资料来源:www.zhuicha.com 追查网 请保留此信息,谢谢"); printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 "); ...展开收缩
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.