2017-06-13 83 views
0

該程序計算輸入城市之間的距離 笛卡兒座標系統並輸出最近的兩個城市。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); 
} 
+0

你的城市名稱的大小是多少?如果> 15,那麼你有問題。嘗試使用'scanf(「%15s」,g [i] .name);'使輸入安全 –

+0

btw:'for(j = 0; j 'for(j = i + 1; j

+0

@ Jean-FrançoisFabre感謝您的建議,不幸的是我已經嘗試將for循環更改爲確切的格式,如果城市之間的距離差異很大(〜6),它仍然崩潰,並且只適用於最後2個輸入的城市 –

回答

1

的實際碰撞可能來自您忘記使用它們之前初始化maximaxj的事實。由於循環中的條件不一定遇到,因此初始化maxdistance時應將其設置爲0和1。

+0

這麼做了!非常感謝! –

+1

當距離(g [0],g [1]);'確實是最大距離 –

+0

不應該將maxdistance初始化爲MAX_DOUBLE,還是在C中調用最大的雙精度值? – Adder

相關問題