Я новичок в C, и я только что узнал о struct
.Я должен сделать программу, которая считывает данные из файла и печатает их.
Одна из моих подзадач - вычислить расстояние между двумя точками.Я использую формулу haversine, как видно из функции расстояния.
Однако моя проблема в том, что я пытаюсь получить fst->Lat
и fst->Long
из функции stage_1_read
, и она не работает. Я выделиллинии, в которых они находятся, чтобы прояснить.
Как мне получить эти значения?Это 2-е и 3-е значения, считанные в файле, но с моим текущим кодом, похоже, что вместо этого читаются 1-е и 2-е значенияЯ пытался какое-то время, но просто не могу получить нужные мне значения.
struct file_data{
char User[5];
char Long[12];
char Lat[12];
char Date[11];
char Time[3];
};
double stage_1_read(void);
double distance(struct file_data fst);
double toRadian(double x);
int main(){
printf("%f", stage_1_read());
return 0;
}
double stage_1_read(void){
/* This function takes the data from the input file,reading and printing
the User ID, Location (longitude and latitude), Date, Time, and Distance*/
double d;
char line[256];
struct file_data fst;
if (fgets(line, 256, stdin) != NULL) {
sscanf(line, "%s %s %s %s %s", fst.User, fst.Long, fst.Lat,
fst.Date, fst.Time);
}
else{
printf("Failed to read file. Check file and try again.");
exit(EXIT_FAILURE);
}
d = distance(fst);
printf("Stage 1\n==========\n");
printf("User: #%s\n", fst.User);
printf("Location: <%s %s>\n", fst.Long, fst.Lat);
printf("Date: %s\n", fst.Date);
printf("Time: %s\n", fst.Time);
printf("Distance to reference: %.2f", d);
return 0;
}
double distance(struct file_data fst) {
/* This function is designed to calculate the distance between the check-in
POI and the reference point provided*/
double angle_distance, chord_length, dist;
double lat_2, long_2;
lat_2 = *fst.Lat;
long_2 = *fst.Long;
double var_lat = toRadian(lat_2 - LAT_1);
double var_long = toRadian(long_2 - LONG_1);
chord_length = pow(sin(var_lat/2),2) + cos(toRadian(LAT_1)) *
cos(toRadian(lat_2)) * pow(sin(var_long/2),2);
angle_distance = 2 * atan2(sqrt(chord_length), sqrt(1 - chord_length));
dist = 6371 * angle_distance;
return dist;
}
double toRadian(double x) {
x = PI/DEGREES;
return x;
}
ОБНОВЛЕНИЕ:
Изменен некоторый код в соответствии с запросом.