// Команда МГПИ. // Решение задачи номер 1 #include #include #include #include #include #include typedef struct { double x, y; } POINT; POINT MoveTo (POINT current_point, int cur, char *d); void main() { char str[250], *t1, *t2, num[50]={""}; unsigned int len, map_num = 1; FILE *f; POINT current_point = {0, 0}; f = fopen ("treasure.in", "rt"); if (!f) { puts ("Файл treasure.in отсутствует"); exit (EXIT_FAILURE); } fgets (str, 202, f); t1 = str; while (strcmp(str, "END") && strcmp(str, "END\n")) { strcpy (num, ""); t2 = num; while (isdigit((int) *t1)) { *t2 = *t1; t1++; t2++; } *t2 = 0; len = atoi(num); num[0] = *t1; loop: t1++; switch (*t1) { case ',': num[1] = 0; current_point = MoveTo (current_point, len, num); t1++; break; case '.': num[1] = 0; current_point = MoveTo (current_point, len, num); printf ("Карта #%d\n", map_num); if ((current_point.x<0) && (current_point.x>-.001)) current_point.x = 0; if ((current_point.y<0) && (current_point.y>-.001)) current_point.y = 0; printf ("Координаты сокровища (%.3f,%.3f).\n", current_point.x, current_point.y); printf ("Расстояние до сокровища %.3f.\n\n", sqrt(current_point.x*current_point.x + current_point.y*current_point.y)); fgets (str, 202, f); t1 = str; map_num++; current_point.x=0; current_point.y=0; //t1--; break; default: num[1] = *t1; num[2] = 0; current_point = MoveTo (current_point, len, num); strcpy (num, ""); goto loop; } } fclose(f); } POINT MoveTo (POINT current_point, int len, char *num) { if (!strcmp(num, "N")) current_point.y+=len; if (!strcmp(num, "E")) current_point.x+=len; if (!strcmp(num, "S")) current_point.y-=len; if (!strcmp(num, "W")) current_point.x-=len; if (!strcmp(num, "NE")) {current_point.y+=len*sqrt(.5); current_point.x+=len*sqrt(.5);} if (!strcmp(num, "SE")) {current_point.y-=len*sqrt(.5); current_point.x+=len*sqrt(.5);} if (!strcmp(num, "SW")) {current_point.y-=len*sqrt(.5); current_point.x-=len*sqrt(.5);} if (!strcmp(num, "NW")) {current_point.y+=len*sqrt(.5); current_point.x-=len*sqrt(.5);} return (current_point); }