2017-04-03 32 views
1

我使用這個for循環來從經緯度座標文件中提取數據,然後將座標轉換爲十進制度數,度數轉換爲弧度,然後計算分離角度並返回兩個城市之間的距離。我需要比較文件的前兩行,計算距離,打印結果,然後執行下兩行。我完全按照我想要的方式得到它,但是有五個相同的for循環,每次只調整循環控制參數。有沒有辦法只用一個循環來完成這一點?fscanf兩行數據,在一個循環中執行calc,print結果,fscanf下兩行代碼?

for(i=0;i<=ndata-9;i++) 
    {  
     printf("\n%-15s  %3.0f %4.1f %c  %3.0f %4.1f %c",cities[i].location, 
     cities[i].latdeg,cities[i].latmin,cities[i].directone, 
     cities[i].longdeg,cities[i].longmin,cities[i].directtwo); 
     fprintf(surface,"\n%-15s  %3.0f %4.1f %c  %3.0f %4.1f %c", 
      cities[i].location,cities[i].latdeg,cities[i].latmin, 
      cities[i].directone,cities[i].longdeg,cities[i].longmin, 
      cities[i].directtwo);  
     if(cities[i-1].directone=='N') 
     { 
      polarone=(90.0-(cities[i-1].latdeg+(cities[i-1].latmin/60.0)))*(pi/180.0); 
     } 
     else 
     { 
      polarone=(90.0+(cities[i-1].latdeg+(cities[i-1].latmin/60.0)))*(pi/180.0); 
     } 
     if(cities[i].directone=='N') 
     { 
      polartwo=(90.0-(cities[i].latdeg+(cities[i].latmin/60.0)))*(pi/180.0); 
     } 
     else 
     { 
      polartwo=(90.0+(cities[i].latdeg+(cities[i].latmin/60.0)))*(pi/180.0); 
     } 
     if(cities[i-1].directtwo=='W') 
     { 
      azimuthone=(cities[i-1].longdeg+(cities[i-1].longmin/60.0))*(pi/180.0); 
     } 
     else 
     { 
      azimuthone=(360.0-(cities[i-1].longdeg+(cities[i-1].longmin/60.0)))*(pi/180.0); 
     } 
     if(cities[i].directtwo=='W') 
     { 
      azimuthtwo=(cities[i].longdeg+(cities[i].longmin/60.0))*(pi/180.0); 
     } 
     else 
     { 
      azimuthtwo=(360.0-(cities[i].longdeg+(cities[i].longmin/60.0)))*(pi/180.0); 
     } 
     angle=acos(cos(polarone)*cos(polartwo)+sin(polarone)*sin(polartwo)*cos(azimuthtwo-azimuthone)); 
     distance=angle*radius; 
    } 
    printf("\nDistance between the two cities = %6.1f miles\n",distance); 
    fprintf(surface,"\nDistance between the two cities = %6.1f miles\n", distance); 
+0

是的:你爲什麼不在一個循環內完成那些步驟?任何時候fscanf失敗(檢查fscanf的返回值爲0),你退出循環。也就是說,沿着'while(true){.... break; ...}'。 – Evert

+0

並創建一個函數將您的輸入轉換爲弧度;這可以避免主循環中的混亂。 – Evert

+0

我正在考慮沿着同樣的路線,但我不確定如何編程它 –

回答

0

分治!

(下面是用於演示目的。我以爲一切都是雙,和城市有型結構市。更改類型,如果neccessary。另外,我沒有調試。)

const double deg_to_rad = pi/180, half_pi = pi/2, two_pi = pi*2; 

inline double RadFromDeg(double degrees, double minutes) { 
    return (degrees+minutes/60)*deg_to_rad; 
} 

// not sure if we really need inline here 
inline void ObtainPolarAzimuth(double* polar, double* azimuth, struct City* city) { 
    double temp = RadFromDeg(city->latdeg, city->latmin); 
    if (city->directone == 'N') 
     *polar = half_pi - temp; 
    else 
     *polar = half_pi + temp; 
    // ... blablabla longdeg blablabla longmin blablabla *azimuth 
} 


// ... 

    ObtainPolarAzimuth(*polar1, *azimuth1, city[i-1]); 
    ObtainPolarAzimuth(*polar2, *azimuth2, city[i]); 
    // ... blablabla angle blablabla cos blablabla sin 

而且,恕我直言,寫direct1direct2而不是directonedirecttwo會更好。

+0

@PaulR - 你說得對,我把它刪除了。 – user31264

+0

感謝您的幫助,我會給你一個機會! –