gpt4 book ai didi

c - fscanf 两行数据,执行计算,打印结果,fscanf 接下来的两行,在一个循环中?

转载 作者:太空宇宙 更新时间:2023-11-04 04:24:24 26 4
gpt4 key购买 nike

我正在使用这个 for 循环从纬度和经度坐标文件中引入数据,然后将坐标转换为十进制度数,将度数转换为弧度,然后计算分离角度,并返回两个城市之间的距离。我需要比较文件的前两行,计算距离,打印结果,然后再执行接下来的两行。我完全按照我想要的方式得到了它,但是有五个相同的 for 循环,每次只是调整循环控制参数。有没有办法只用一个循环来完成这个?

   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);

最佳答案

分而治之!!!

(以下是为了演示目的。我假设所有东西都是双重的,并且城市的类型是 struct City。如果需要,请更改类型。另外,我没有调试它。)

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

关于c - fscanf 两行数据,执行计算,打印结果,fscanf 接下来的两行,在一个循环中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43175689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com