C程序工作正常(但输出正确),但仍然崩溃
该程序计算输入城市之间的距离 笛卡儿坐标系统并输出最近的两个城市。C程序工作正常(但输出正确),但仍然崩溃
该程序编译没有问题,所以它必须是一个逻辑错误,但一旦最后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);
}
的实际碰撞可能来自您忘记使用它们之前初始化maxi
和maxj
的事实。由于循环中的条件不一定遇到,因此初始化maxdistance
时应将其设置为0和1。
这么做了!非常感谢! –
当距离(g [0],g [1]);'确实是最大距离 –
不应该将maxdistance初始化为MAX_DOUBLE,还是在C中调用最大的双精度值? – Adder
你的城市名称的大小是多少?如果> 15,那么你有问题。尝试使用'scanf(“%15s”,g [i] .name);'使输入安全 –
btw:'for(j = 0; j'for(j = i + 1; j
@ Jean-FrançoisFabre感谢您的建议,不幸的是我已经尝试将for循环更改为确切的格式,如果城市之间的距离差异很大(〜6),它仍然崩溃,并且只适用于最后2个输入的城市 –