私はこの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);
はい:1つのループ内でこれらのステップを正確に実行してみませんか? fscanfが失敗したとき(fscanfの戻り値を0にチェックする)、ループを終了します。つまり、while(true){.... break;の行に沿って何かを使用します。 ...} '。 – Evert
入力をラジアンに変換する関数を作成します。メインループの乱雑さを避けることができます。 – Evert
私は、同じ行に沿って何かを考えていましたが、正確にプログラムする方法がわかりません –