我使用這個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);
是的:你爲什麼不在一個循環內完成那些步驟?任何時候fscanf失敗(檢查fscanf的返回值爲0),你退出循環。也就是說,沿着'while(true){.... break; ...}'。 – Evert
並創建一個函數將您的輸入轉換爲弧度;這可以避免主循環中的混亂。 – Evert
我正在考慮沿着同樣的路線,但我不確定如何編程它 –