鱼C论坛

 找回密码
 立即注册
查看: 2560|回复: 15

[已解决]求一段程序

[复制链接]
发表于 2018-1-12 10:00:47 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
中国铁路站点分布图(3人)
输入文件是stations.xls,该文件保存有某次列车途经的所有车站名(地名)及与始发站的距离。
1)首先将该文件保存为便于处理的文本文件。
2)对该文件处理的结果是输出有铁路直接连接的两个地名及其距离,如果有冲突,保留 最小值,例如:
T1 A B 150km
K33 A B 147km
此时A与B间距离有两个,则保留最小的147
3)最终输出rwmap.txt,该文件中每行均是如下格式
A B L
其中A、B是地名,L是两个城市间铁路的距离。
4)在输出文件基础上,实现图的基本操作。
5)在4)的基础上,计算从某个城市到其它城市的最短路径。
6)输出文件可以作为图的基础数据文件供其他组同学使用,也可以自己使用。



冥思苦想一整天毫无思路拜托众大佬了

问题是这样的之前有大佬回复过我,给了思路但是实在能力有限做不出来,这是我们的课程设计,做不出来要重修求大佬!!!
最佳答案
2018-1-12 19:02:24
本帖最后由 8306最硬 于 2018-1-13 00:47 编辑

看不太懂题目,但是直觉告诉我这是数据结构的题目。
你可以做一张无向图,地点为顶点,距离为权值,如果你学过数据结构的话。
然后最核心的是最短距离的计算吧,我以前课程设计也是地图,可以用那个费啥啥的算法,我贴一段出来。
  1. void ShowShortPath(Map &G,int p1,int p2){
  2.         /* G--图,p1,p2--要计算距离的地点 */
  3.         int v,u,w,i;
  4.         int D[G.vexnum][G.vexnum],p[G.vexnum][G.vexnum][G.vexnum];
  5.         /* D为邻接矩阵副本,P为最优路径 */

  6.         for(v=0;v<G.vexnum;v++){
  7.                 for(w=0;w<G.vexnum;w++){
  8.                         D[v][w]=G.adj[v][w].ArcVal;
  9.                         for(u=0;u<G.vexnum;u++)
  10.                                 p[v][w][u]=0;
  11.                                 if(D[v][w]<INFINITY){
  12.                                         p[v][w][v]=1;p[v][w][w]=1;
  13.                                 }//end if       
  14.                 }// end for       
  15.         }// end for
  16.                
  17.         for(u=0;u<G.vexnum;u++)
  18.                 for(v=0;v<G.vexnum;v++)
  19.                         for(w=0;w<G.vexnum;w++)
  20.                                 if(D[v][u]+D[u][w]<D[v][w]){
  21.                                         D[v][w]=D[v][u]+D[u][w];
  22.                                         for(i=0;i<G.vexnum;i++)
  23.                                                 p[v][w][i]=p[v][u][i]||p[u][w][i];
  24.                                 }//end if

  25.         for (i=0; i<G.vexnum;i++)
  26.                 if (p[p1][p2][i]){
  27.                         printf("%s-->",G.vexs[i]);
  28.                 }//end if
  29.         printf("\b\b\b 路径长度:%dm\n\n",D[p1][p2]);
复制代码

希望帮助到你,至于excel和txt的接口操作什么的,百度就一抓一大把了。
但是!!但是如果你没有学过数据结构
我猜那就只能到此为止了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-12 11:49:28 From FishC Mobile | 显示全部楼层
虽然看不懂是啥,但是感觉是好厉害的东东。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-12 12:36:27 | 显示全部楼层
兄台,我虽然还没有学到这里,但是可以给你提供一些思路 (本人只学过C,在学C++)。

1.  可以设置一个原始为0的地点, 例如 北京, 那么你A地点 和 B地点 就有了一个统一的公里数。(也就是距离北京多少公里);
2.  手动封装函数, 函数内为各大铁路线, 或者地理详细信息等。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-12 13:28:11 From FishC Mobile | 显示全部楼层
z402375830 发表于 2018-1-12 12:36
兄台,我虽然还没有学到这里,但是可以给你提供一些思路 (本人只学过C,在学C++)。

1.  可以设置一个 ...

老哥我也有思路就是不会代码啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-12 13:29:33 From FishC Mobile | 显示全部楼层
Dr丶温 发表于 2018-1-12 11:49
虽然看不懂是啥,但是感觉是好厉害的东东。。。

我们整个班都不会,只学过一个星期的java现在告诉我们要搞出这个程序,一堆专业术语,搞不成就重修
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-12 16:43:39 From FishC Mobile | 显示全部楼层
兄弟,保重。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-12 19:02:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 8306最硬 于 2018-1-13 00:47 编辑

看不太懂题目,但是直觉告诉我这是数据结构的题目。
你可以做一张无向图,地点为顶点,距离为权值,如果你学过数据结构的话。
然后最核心的是最短距离的计算吧,我以前课程设计也是地图,可以用那个费啥啥的算法,我贴一段出来。
  1. void ShowShortPath(Map &G,int p1,int p2){
  2.         /* G--图,p1,p2--要计算距离的地点 */
  3.         int v,u,w,i;
  4.         int D[G.vexnum][G.vexnum],p[G.vexnum][G.vexnum][G.vexnum];
  5.         /* D为邻接矩阵副本,P为最优路径 */

  6.         for(v=0;v<G.vexnum;v++){
  7.                 for(w=0;w<G.vexnum;w++){
  8.                         D[v][w]=G.adj[v][w].ArcVal;
  9.                         for(u=0;u<G.vexnum;u++)
  10.                                 p[v][w][u]=0;
  11.                                 if(D[v][w]<INFINITY){
  12.                                         p[v][w][v]=1;p[v][w][w]=1;
  13.                                 }//end if       
  14.                 }// end for       
  15.         }// end for
  16.                
  17.         for(u=0;u<G.vexnum;u++)
  18.                 for(v=0;v<G.vexnum;v++)
  19.                         for(w=0;w<G.vexnum;w++)
  20.                                 if(D[v][u]+D[u][w]<D[v][w]){
  21.                                         D[v][w]=D[v][u]+D[u][w];
  22.                                         for(i=0;i<G.vexnum;i++)
  23.                                                 p[v][w][i]=p[v][u][i]||p[u][w][i];
  24.                                 }//end if

  25.         for (i=0; i<G.vexnum;i++)
  26.                 if (p[p1][p2][i]){
  27.                         printf("%s-->",G.vexs[i]);
  28.                 }//end if
  29.         printf("\b\b\b 路径长度:%dm\n\n",D[p1][p2]);
复制代码

希望帮助到你,至于excel和txt的接口操作什么的,百度就一抓一大把了。
但是!!但是如果你没有学过数据结构
我猜那就只能到此为止了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-12 21:58:56 | 显示全部楼层
看不懂怎么办
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-12 23:03:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-1-13 00:39:44 From FishC Mobile | 显示全部楼层
8306最硬 发表于 2018-1-12 19:02
看不太懂题目,但是直觉告诉我这是数据结构的题目。
你可以做一张无向图,地点为顶点,距离为权值,如果你 ...

谢谢老哥!!!不过你猜的不错,老哥高见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-14 15:47:20 | 显示全部楼层
8306最硬 发表于 2018-1-12 19:02
看不太懂题目,但是直觉告诉我这是数据结构的题目。
你可以做一张无向图,地点为顶点,距离为权值,如果你 ...
  1. #include<iostream>
  2. #include<string>
  3. #include<conio.h>
  4. using namespace std;
  5. #include'Map.h'
  6. //邻接矩阵的类型定义
  7. #define MAX 10000000
  8. #define MAX_VERTEX_NUM 20
  9. typedef struct
  10. {
  11.         string vexs[MAX_VERTEX_NUM];//用一维数组存储顶点信息
  12.         int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//用二维数组充当矩阵,来存储顶点边的信息
  13.         int vexnum,edgenum;//顶点数和边数
  14. }MGraph;
  15. /*构造有向网的邻接矩阵*/

  16. void ShowShortPath(Map &G,int p1,int p2){
  17.         /* G--图,p1,p2--要计算距离的地点 */
  18.         int v,u,w,i;
  19.         int D[G.vexnum][G.vexnum],p[G.vexnum][G.vexnum][G.vexnum];
  20.         /* D为邻接矩阵副本,P为最优路径 */

  21.         for(v=0;v<G.vexnum;v++){
  22.                 for(w=0;w<G.vexnum;w++){
  23.                         D[v][w]=G.adj[v][w].ArcVal;
  24.                         for(u=0;u<G.vexnum;u++)
  25.                                 p[v][w][u]=0;
  26.                                 if(D[v][w]<INFINITY){
  27.                                         p[v][w][v]=1;p[v][w][w]=1;
  28.                                 }//end if        
  29.                 }// end for        
  30.         }// end for
  31.                
  32.         for(u=0;u<G.vexnum;u++)
  33.                 for(v=0;v<G.vexnum;v++)
  34.                         for(w=0;w<G.vexnum;w++)
  35.                                 if(D[v][u]+D[u][w]<D[v][w]){
  36.                                         D[v][w]=D[v][u]+D[u][w];
  37.                                         for(i=0;i<G.vexnum;i++)
  38.                                                 p[v][w][i]=p[v][u][i]||p[u][w][i];
  39.                                 }//end if

  40.         for (i=0; i<G.vexnum;i++)
  41.                 if (p[p1][p2][i]){
  42.                         printf("%s-->",G.vexs[i]);
  43.                 }//end if
  44.         printf("\b\b\b 路径长度:%dm\n\n",D[p1][p2]);


  45. int main(void)
  46. {
  47.        
  48.         int data;
  49.         FILE *fp=fopen("stations.txt","r");
  50.         if(!fp)
  51.         {
  52.                 printf("can't open file\n");
  53.                 return -1;
  54.         }
  55.         while(!feof(fp))
  56.         {
  57.                 fscanf(fp,"%c",&data);
  58.                 printf("%c",data);
  59.         }
  60.         printf("\n");
  61.         fclose(fp);
  62.         return 0;



  63. }

复制代码


大神我这调用了这个stations文件 结果各种报错 实在是不知道怎样定义类怎样纠错了您帮帮我吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-14 15:50:52 | 显示全部楼层
8306最硬 发表于 2018-1-12 19:02
看不太懂题目,但是直觉告诉我这是数据结构的题目。
你可以做一张无向图,地点为顶点,距离为权值,如果你 ...

这个是stations这个文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 18:28:37 | 显示全部楼层
本帖最后由 8306最硬 于 2018-1-14 19:20 编辑
haoduoduoyu 发表于 2018-1-14 15:50
这个是stations这个文件


嗯.. 我攀不上大神啊,只是恰巧课程设计也是做图
我看了错误大多是变量名没对上而已,比如
INFINITY-->MAX
邻接矩阵adj
权值ArcVal
ShowShortPath函数也少了个括号}

其他不好说,好像图的定义也没定义全..
文件只是打印数据没存起来吗,我看的有点云里雾里
这样我发我的课程设计给你琢磨琢磨吧?代码很初级效果也很水,但是弄出来及格还是没问题的
(BTW我用的是c-free)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 18:34:13 | 显示全部楼层
本帖最后由 8306最硬 于 2018-1-14 18:44 编辑
  1. /****** Graph.h *******/
  2. #include <stdio.h>
  3. #include <string.h>

  4. #define MAX_VEXTEX_NUM 9
  5. #define INFINITY 65535

  6. typedef struct ArcCell{
  7.         /* 边的结构体 */
  8.         char *vex1,*vex2;                //对应顶点
  9.         int ArcVal;                //权值
  10.         char *info;
  11. }ArcCell,AdjMatrix[MAX_VEXTEX_NUM][MAX_VEXTEX_NUM];

  12. typedef struct Map{
  13.         /* 图的结构体 */
  14.         char *vexs[MAX_VEXTEX_NUM];       
  15.         int vexnum,arcnum;       
  16.         AdjMatrix adj;        //邻接矩阵
  17. }Map;

  18. /* 定位顶点 */
  19. int LocateVex(Map &G,char *vp){
  20.         int k;
  21.         for (k=0 ; k<MAX_VEXTEX_NUM ; k++)
  22.                 if (!strcmp(G.vexs[k],vp)) return(k) ;     
  23.         return (-1);
  24. }

  25. /* 创建图 */
  26. int CreateMap(Map &G){
  27.         G.arcnum = 0;
  28.         G.vexnum = 0;
  29.         G.adj[G.vexnum][G.vexnum].ArcVal = INFINITY;
  30.         return 0;
  31. }


  32. /* 添加顶点 */
  33. int AddVertex(Map &G , char *vp){
  34.        
  35. /*        if (LocateVex(G , vp)!=-1){
  36.                 printf("Vertex has existed !\n");
  37.                 return(-1) ;
  38.         }*/
  39.         G.vexs[G.vexnum] = vp;
  40.         G.adj[G.vexnum][G.vexnum].ArcVal = INFINITY;
  41.         for (int j=0,k=G.vexnum; j<G.vexnum; j++){
  42.                 G.adj[j][k].ArcVal = INFINITY;
  43.                  G.adj[k][j].ArcVal = INFINITY;
  44.                  /* 初始化顶点各边设为INFINITY */       
  45.         }

  46.         G.vexnum++;       
  47.         return 0;
  48. }

  49. /* 添加边 */
  50. int AddArc(Map &G , char *vex1, char *vex2, int ArcVal)
  51. {   
  52.         int i = LocateVex(G , vex1), j = LocateVex(G , vex2);
  53.         if (i==-1||j==-1){  
  54.                 printf("Arc’s Vertex do not existed !\n") ;
  55.                 return(-1) ;
  56.         }
  57.         G.adj[i][j].ArcVal=ArcVal ;
  58.         G.adj[j][i].ArcVal=ArcVal ;
  59.         G.adj[i][j].vex1=vex1 ;
  60.         G.adj[i][j].vex2=vex2 ;
  61.         G.adj[j][i].vex1=vex1 ;
  62.         G.adj[j][i].vex2=vex2 ;
  63. /*        G.adj[i][j].info=info;
  64.         G.adj[j][i].info=info;        */       
  65.         /* 对称矩阵赋值两次 */
  66.        
  67.         G.arcnum++;
  68.        
  69.         return 0;
  70. }
复制代码

这里主要的函数是
边和图的初始化
CreateMap创建图
AddVertex添加顶点(地点)
AddArc添加边,主要包括权值(地点间的距离)
之后怎么做呢,很简单。
只要把你的数据读取出来,把地点和距离添加进图里面,图就算写好了,最短距离的计算建立在你写好图的基础上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 18:35:24 | 显示全部楼层
本帖最后由 8306最硬 于 2018-1-14 18:48 编辑
  1. /******* main.c ********/
  2. #include "Graph.h"
  3. #include <stdio.h>
  4. #include <string.h>

  5. char *position[MAX_VEXTEX_NUM] = {
  6. "北门","饭堂","艺设学院","学生宿舍","英东楼","图书馆","教学楼","行政楼","南门"
  7. };

  8. void ShowShortPath(Map &G,int p1,int p2){
  9.         int v,u,w,i;
  10.         int D[G.vexnum][G.vexnum],p[G.vexnum][G.vexnum][G.vexnum];
  11.         /* D为邻接矩阵副本,P为最优路径 */

  12.         for(v=0;v<G.vexnum;v++){
  13.                 for(w=0;w<G.vexnum;w++){
  14.                         D[v][w]=G.adj[v][w].ArcVal;
  15.                         for(u=0;u<G.vexnum;u++)
  16.                                 p[v][w][u]=0;
  17.                                 if(D[v][w]<INFINITY){
  18.                                         p[v][w][v]=1;p[v][w][w]=1;
  19.                                 }//end if       
  20.                 }// end for       
  21.         }// end for
  22.                
  23.         for(u=0;u<G.vexnum;u++)
  24.                 for(v=0;v<G.vexnum;v++)
  25.                         for(w=0;w<G.vexnum;w++)
  26.                                 if(D[v][u]+D[u][w]<D[v][w]){
  27.                                         D[v][w]=D[v][u]+D[u][w];
  28.                                         for(i=0;i<G.vexnum;i++)
  29.                                                 p[v][w][i]=p[v][u][i]||p[u][w][i];
  30.                                 }//end if
  31.        
  32.         if (p1<p2){
  33.                 /**
  34.                  *  如果键入号码为顶点顺序则正常输出
  35.                  *        如果键入号码为顶点逆序则反向输出*/
  36.                 for (i=0; i<G.vexnum;i++)
  37.                         if (p[p1][p2][i]){
  38.                                 printf("%s-->",G.vexs[i]);
  39.                         }//end if       
  40.         }
  41.         else{
  42.                 for (i=G.vexnum; i>=0; i--)
  43.                         if (p[p1][p2][i]){
  44.                                 printf("%s-->",G.vexs[i]);
  45.                         }//end if
  46.         }//end else
  47. /*        for (int i=0;i<strlen(G.adj[p1][p2].info);i++)
  48.                 printf("\b");*/
  49.         printf("\b\b\b 路径长度:%dm\n\n",D[p1][p2]);
  50. }

  51. int main(){
  52.         Map MySchool;
  53.         int position_1,position_2;
  54.         CreateMap(MySchool);

  55.         for (int i = 0; i < MAX_VEXTEX_NUM; i++)
  56.                 /* 初始化顶点 */
  57.                 AddVertex(MySchool, position[i]);
  58.        
  59.         AddArc(MySchool, "学生宿舍", "饭堂", 134);
  60.         AddArc(MySchool, "北门", "艺设学院", 132);
  61.         AddArc(MySchool, "饭堂", "艺设学院", 64);
  62.         AddArc(MySchool, "艺设学院", "英东楼", 220);
  63.         AddArc(MySchool, "艺设学院", "学生宿舍", 79);
  64.         AddArc(MySchool, "艺设学院", "图书馆", 300);
  65.         AddArc(MySchool, "英东楼", "图书馆", 93);
  66.         AddArc(MySchool, "英东楼", "教学楼", 84);
  67.         AddArc(MySchool, "图书馆", "教学楼", 61);
  68.         AddArc(MySchool, "行政楼", "南门", 113);
  69.         AddArc(MySchool, "教学楼", "行政楼", 63);
  70.         AddArc(MySchool, "图书馆", "行政楼", 108);
  71.         AddArc(MySchool, "英东楼", "行政楼", 147);
  72.         /* 初始化边 */

  73.         for (int i=0; i < MySchool.vexnum; i++)
  74.                 /* 打印各地点 */
  75.                 printf("/*      %d:%s      \n",i,position[i]);
  76.                
  77.         while(1){
  78.                 printf("输入当前地址号码:");
  79.                 scanf("%d",&position_1);
  80.                 printf("输入目的地址号码:");
  81.                 scanf("%d",&position_2);
  82.                 /* 等待键入地点编码 */
  83.                
  84.                 if ( position_1 >= 0 &&
  85.                           position_2 >= 0 &&
  86.                           position_1 <= MySchool.vexnum &&
  87.                           position_2 <= MySchool.vexnum &&
  88.                             position_1 != position_2 )
  89.                         /* 判断键入范围 */
  90.                        
  91.                         ShowShortPath(MySchool,position_1,position_2);
  92.                         /* 输出最优路径和距离 */
  93.                        
  94.                 else printf("\n别乱来\n");
  95.                 }// end while       
  96.        
  97.         return 0;
  98. }
复制代码

两个函数
一个是计算最短距离ShowShortPath
一个是main函数,用于输入顶点和边,计算距离,输出结果
程序到这大致就写好了(我的程序),你的就多了输入文件和输出文件两步咯
但要详细解释还真不好说啊..不管怎样,兄弟加油吧..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-16 00:43:54 From FishC Mobile | 显示全部楼层
8306最硬 发表于 2018-1-14 18:35
两个函数
一个是计算最短距离ShowShortPath
一个是main函数,用于输入顶点和边,计算距离,输出结果

很受启发,已经完成了!谢谢兄dei!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 02:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表