2017-04-03 8 views
1

私はこのforループを使用して、緯度と経度座標のファイルからデータを取り込み、座標を十進数、度をラジアンに変換し、次に分離の角度を計算し、2つの都市間の距離を返します。ファイルから最初の2行を比較し、距離を計算し、結果を出力し、次の2行を実行する必要があります。私はそれが欲しいのとまったく同じ方法を持っていますが、5つの同一のforループで、毎回ループ制御パラメータを調整するだけです。 1つのループでこれを達成する方法はありますか?fscanf 2行のデータは、calc、print result、fscanfの次の2行を1回のループで実行しますか?

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

はい:1つのループ内でこれらのステップを正確に実行してみませんか? fscanfが失敗したとき(fscanfの戻り値を0にチェックする)、ループを終了します。つまり、while(true){.... break;の行に沿って何かを使用します。 ...} '。 – Evert

+0

入力をラジアンに変換する関数を作成します。メインループの乱雑さを避けることができます。 – Evert

+0

私は、同じ行に沿って何かを考えていましたが、正確にプログラムする方法がわかりません –

答えて

0

デバイドアンドコンクェリ!

(どのような次はデモンストレーション用である。私はすべてがダブルで、都市はタイプstruct市を持っていると仮定します。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 

また、今すぐdirectonedirecttwoの代わりにdirect1direct2と書くのが良いでしょう。

+0

@PaulR - あなたが正しいです、私はそれを削除しました。 – user31264

+0

私はそのショットを与えるよ助けてくれてありがとう! –

関連する問題