首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fscanf两行数据,执行calc,打印结果,fscanf接下来的两行,在单循环中?

fscanf两行数据,执行calc,打印结果,fscanf接下来的两行,在单循环中?
EN

Stack Overflow用户
提问于 2017-04-03 10:29:06
回答 1查看 35关注 0票数 1

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

代码语言:javascript
复制
   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);
EN

回答 1

Stack Overflow用户

发布于 2017-04-03 17:11:17

分而治之!

(以下内容仅用于演示目的。我假设所有的东西都是双精度的,城市的类型是struct City。如有必要,请更改类型。此外,我没有对其进行调试。)

代码语言:javascript
复制
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

另外,imho最好是写direct1direct2,而不是directonedirecttwo

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43175689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档