C程序工作(并提供正确的输出),但无论如何崩溃

时间:2017-06-13 13:57:43

标签: c struct compare

  

程序计算输入城市之间的距离   笛卡尔坐标系并输出最近的2个城市。

程序编译没有问题所以它必须是一个逻辑错误,但是一旦最后两个城市之间的距离太大(大于其他城市之间的距离)就会崩溃。

当我在if语句附近写了一个printf时,它只显示if已被访问过一次,因为如果输入3个城市i和j应该是不同的6/9组合。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct{
    char name[16];
int x;
int y;
}city;

double distance(city a,city b)
{
double d;
d = sqrt((b.x-a.x)*(b.x-a.x) +(b.y-a.y)*(b.y-a.y));
return d;
}

int main()
{
    int n,i,j;
    city *g;
printf("Input number of cities: ");
scanf("%d",&n);
g = (city*)malloc(n*sizeof(city));
for(i=0;i<n;i++)
{
printf("Input name: ");
scanf("%s",g[i].name);
printf("Input x: ");
scanf("%d",&g[i].x);
printf("Input y: ");
scanf("%d",&g[i].y);
}
int maxi,maxj;
double maxdistance;

maxdistance=distance(g[0],g[1]);
for(i=0;i<n;i++){ 
    //printf("i:%d\n",i);
    for(j=0;j<n;j++)
    {
        //printf("j:%d\n",j);

{ 
        if((distance(g[i],g[j]) < maxdistance) && (i!=j))
        {
            printf("debugcheck");
maxdistance = distance(g[i],g[j]);
maxi = i;
maxj = j;
        }
}

    }

}
printf("Least distance is %lf between %s and %s",distance(g[maxi],g[maxj]),g[maxi].name,g[maxj].name);
}

1 个答案:

答案 0 :(得分:1)

实际崩溃可能来自您在使用之前忘记初始化maximaxj的事实。由于不一定遇到循环中的条件,因此在初始化maxdistance时应将它们设置为0和1。