温雅72 2021-11-16 23:15 采纳率: 100%
浏览 69
已结题

读文件求两个城市的最小距离,换个文件,就不能求了

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/590866570736121.jpg "

img


#left")

#include <stdio.h>
#include <math.h>
#include <string.h> 
#include<stdlib.h>
struct ZuoBiao{
    int x;
    int y;
};
typedef struct City{
    char name[20];
    struct ZuoBiao place;  //结构体的嵌套 
}Point;
int n;
void init(FILE *p,Point *q,int n){//传入Point 数组 以及 文件大小 
    int i;
    for(i=0;i<n;i++,q++)
        fscanf(p,"%s%d%d",&q->name,&q->place.x,&q->place.y);
}
void display(Point *q,int n){
    int i;
    for(i=0;i<n;i++,q++)
        printf("%s\t%d\t%d\n",q->name,q->place.x,q->place.y);
}
double juli(Point city[],char a[],char b[],int n){
    int i ,j;
    int x1,x2;
    int y1,y2;
    double c; //c为两点间的距离 
    for(i=0;i<n;i++){
        if(strcmp(city[i].name,a) == 0){  //strcmp函数是比较两个“字符串”的大小 ,等于0时,两个字符串相等; 
            x1 = city[i].place.x;
            y1 = city[i].place.y;
        }
//    }
    for(j=0;j<n;j++){
    
        if(strcmp(city[j].name,b) == 0){
            x2 = city[j].place.x;
            y2 = city[j].place.y;
        }
    }
}
    c = sqrt((double)((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)));   //sqrt函数是平方根函数; 
    return c;
}
Point* file(){
    FILE *fp = NULL;//读文件必须首先建立一个FILE 指针; 
    fp = fopen("test01.txt","r");//打开一个文件 传入的参数为文件路径与名字,与文件操作方式; 
    fscanf(fp,"%d",&n);//通过函数fscanf进行存取 
    Point *p = (Point*)malloc(n*sizeof(Point));//申请内存;p也为数组的首地址,n就为数组的大小  
    printf("%d\n",n); 
    init(fp,p,n);
    display(p,n);
    return p;
}
void minJuLi(Point city[]){
    int i,j;
    double MIN;    
//    double MIN = juli(city,city[i].name,city[j].name,n); 
    double c = 0;
    char M[10000],N[10000];
    for(i=0;i<n-1;i++){
        for(j=i+1;j<n;j++){
             MIN = juli(city,city[0].name,city[1].name,n); 
            c = juli(city,city[i].name,city[j].name,n);
            if(c<=MIN){
                MIN = c;
                strcpy(M,city[i].name);  //字符串的拷贝 
                strcpy(N,city[j].name);
            }
        }
    }
    printf("\n");
    printf("最近的两个坐标是:%s和%s的距离是:%.3f",M,N,MIN);
}

int main() {
    Point *point = file();
    char a[1000],b[1000];
    printf("输入要计算距离的两个城市:(例如:A B)\n");
    scanf("%s %s",&a,&b);
    printf("距离最近的两个城市信息如下:\n");
    printf("%s和%s的距离是:%.3lf",a,b,juli(point,a,b,n));
    minJuLi(point);//求短距离 
    return 0;
}

卫奇塔 3743 -972威廉斯塔德 1212 -6856温得和克 -2234 1706温泽 4218 -8301温尼伯 4953 -971弗罗茨瓦夫 5105 17武汉 3035 11419雅库茨克 621 12951亚穆苏克罗 651 -518仰光 1646 9609雅温得 351 1131亚伦 -32 16655叶卡捷琳堡 5652 6035耶洛奈夫 623 -11429耶烈万 401 4431横滨 3527 13939南萨哈林斯克 4658 14244萨格勒布 4549 1558郑州 3435 11338淄博 365 118苏黎世 4722 832

  • 写回答

1条回答 默认 最新

  • 关注

    代码修改如下:

    
    
    #include <stdio.h>
    #include <math.h>
    #include <string.h> 
    #include<stdlib.h>
    struct ZuoBiao{
        int x;
        int y;
    };
    typedef struct City{
        char name[20];
        struct ZuoBiao place;  //结构体的嵌套 
    }Point;
    int n;
    void init(FILE *p,Point *q){//传入Point 数组 以及 文件大小 
        int i;
        for(i=0;i<n;i++,q++)
            fscanf(p,"%s%d%d",q->name,&q->place.x,&q->place.y); // MOD 这里q->name前不需要&
    }
    void display(Point *q){
        int i;
        for(i=0;i<n;i++,q++)
            printf("%s\t%d\t%d\n",q->name,q->place.x,q->place.y);
    }
    double juli(Point city[],int i,int j){
        
        int x1=0,x2=0; //MOD 这里需要初始化
        int y1=0,y2=0; //MOD 这里需要初始化
        double c;      //c为两点间的距离 
        x1 = city[i].place.x;
        y1 = city[i].place.y;
        x2 = city[j].place.x;
        y2 = city[j].place.y;
        c = sqrt((double)((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)));   //sqrt函数是平方根函数; 
        return c;
    }
    Point* file(){
        FILE *fp = NULL;//读文件必须首先建立一个FILE 指针; 
        fp = fopen("test01.txt","r");//打开一个文件 传入的参数为文件路径与名字,与文件操作方式; 
        fscanf(fp,"%d",&n);//通过函数fscanf进行存取 
        Point *p = (Point*)malloc(n*sizeof(Point));//申请内存;p也为数组的首地址,n就为数组的大小  
        printf("%d\n",n); 
        init(fp,p);
        display(p);
        return p;
    }
    void minJuLi(Point city[]){
        int i,j;
        double MIN;    
        //    double MIN = juli(city,city[i].name,city[j].name,n); 
        double c = 0;
        char M[10000],N[10000];
        MIN = juli(city,0,1); 
        strcpy(M,city[0].name);  //字符串的拷贝 
        strcpy(N,city[1].name);
        for(i=0;i<n-1;i++){
            for(j=i+1;j<n;j++){
                c = juli(city,i,j);
                if(c<MIN){
                    MIN = c;
                    strcpy(M,city[i].name);  //字符串的拷贝 
                    strcpy(N,city[j].name);
                }
            }
        }
        printf("\n");
        printf("最近的两个坐标是:%s和%s的距离是:%.3f",M,N,MIN);
    }
    int main() {
        Point *point = file();
        char a[1000],b[1000];
        int i,ma=-1,mb=-1;
        printf("输入要计算距离的两个城市:(例如:A B)\n");
        scanf("%s %s",&a,&b);
        printf("距离最近的两个城市信息如下:\n");
        for(i=0;i<n;i++)
        {
            if(strcmp(point[i].name,a) == 0)
            {
                if (ma == -1)
                {
                    ma = i; //只记录第一个点
                }
            }
            if(strcmp(point[i].name,b) == 0)
            {
                if (mb == -1)
                {
                    mb = i; //只记录第一个点
                }
            }
        }
        if(ma != -1 && mb != -1)
            printf("%s和%s的距离是:%.3lf",a,b,juli(point,ma,mb));
        minJuLi(point);//求短距离 
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月26日
  • 已采纳回答 11月18日
  • 修改了问题 11月17日
  • 修改了问题 11月17日
  • 展开全部

悬赏问题

  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私