#include #include #include #include #define R 6378 #define PI 3.141592653589793 char cities[101][40]; double lat[100]; double lon[100]; int last; #define FILENAME "equidist.in" FILE *in; void read_cities() { last =0; while (1) { fscanf(in,"%s",cities[last]); if (!strcmp(cities[last],"#")) return; fscanf(in,"%lf %lf", &lat[last],&lon[last]); lat[last] *= PI / 180.0; lon[last] *= PI / 180.0; last ++; } } int idx(char *s) { int i; for (i=0; i<= last; i++) if (!strcmp(s,cities[i])) return i; return -1; } double dist(double theta1,double phi1, double theta2, double phi2) { double xx,yy,zz,alpha; xx = cos(phi1)*cos(theta1)*cos(phi2)*cos(theta2); yy = sin(phi1)*cos(theta1)*sin(phi2)*cos(theta2); zz = sin(theta1)*sin(theta2); alpha = acos(xx+yy+zz); return (R*alpha); } int read_case() { char sc1[40],sc2[40],sc3[40]; int c1,c2,c3; fscanf(in,"%s %s %s",sc1,sc2,sc3); if (!strcmp(sc1,"#")) return 0; c1 = idx(sc1); c2 = idx(sc2); c3 = idx(sc3); printf("%s is ",sc3); if (c1<0 || c2<0 || c3<0) printf("?"); else printf("%.0f", dist((lat[c1]+lat[c2])/2, (lon[c1]+lon[c2])/2,lat[c3],lon[c3])); printf(" km off %s/%s equidistance.\n",sc1,sc2); return 1; } int main() { assert(in=fopen(FILENAME,"r")); read_cities(); while (read_case()); fclose(in); return 0; }