Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int read_location (double *latitude, double *longitude);
void print_location (double latitude, double longitude);
double distance (double lat1, double lon1, double lat2, double lon2);
void sort_arrays (double arr1[], double arr2[], double arr3[], int size);
void all_distances (double latRef, double lonRef, const double lat_list[],const double lon_list[], double dist_list[], int size);
int main ()
{
double lat[20], lon[20], dist[20];
double refLat, refLon;
int choice, quitProg, size, count;
printf ("Welcome to the latitude and longitude sorter.\n You may enter up to 20 locations.\n Enter a latitude of 99 when done.");
quitProg = 1;
size = 0;
while (size < 20 && quitProg != 0){
quitProg = read_location ((lat+size), (lon+size));
size++;
} //end while
printf ("You have finished entering values.\n\n");
choice = 0;
while (choice != 1){
Printf ("1 to quit\n2 to sort by latitude\n3 to sort by longitude\n4 to sort by distance");
scanf ("%d", &choice);
switch (choice) {
case 1:
break;
case 2:
sort_arrays (lat, lon, dist, size);
for (count = 0; count < size; count++){
print_location (lat[count], lon[count]);
} // end for
break;
case 3:
sort_arrays (lon, lat, dist, size);
for (count=0; count<size; count++){
print_location (lat[count], lon[count]);
} // end for
break;
case 4:
printf ("Please enter reference latitude and longitude:\n");
scanf ("%lf %lf", &refLat, &refLon);
all_distances (refLat, refLon, lat, lon, dist, size);
sort_arrays (dist, lat, lon, size);
for (count=0; count<size; count++){
print_location (lat[count], lon[count]);
printf (" is %f miles from reference\n", dist[count]);
} // end for
break;
default:
printf ("Not a valid entry. Please choose again.\n\n");
break;
} //end while
printf ("Thank you for using the latitude and longitude sorter.");
return 0;
} //end main
/*____________________________________________________________________________________*/
int read_location (double *latitude, double *longitude){
double latEntry = 0;
double lonEntry = 0;
while (latEntry != 99){
printf ("Please enter a latitude and longitude:\n");
scanf ("%lf %lf", &latEntry, &lonEntry);
if (fabs(latEntry) <= 90 && fabs(lonEntry) <= 180) {
*latitude = latEntry;
*longitude = lonEntry;
} else {
printf ("\n");
} //end else
return 1;
} //end while
return 0;
} //end read_location
/*____________________________________________________________________________________*/
void print_location (double lat, double lon){
if (lat >= 0){
printf ("%f North ", lat);
} else {
printf ("%f South ", lat);
}
if (lon <= 0){
printf ("%f West\n", lon);
} else {
printf ("%f East\n", lon);
}
} //end print_location
/*____________________________________________________________________________________*/
double distance (double lat1, double lon1, double lat2, double lon2){
double dist;
dist = (3963 * acos(cos(lon1-lon2)*cos(lat1)*cos(lat2) + sin(lat1)*sin(lat2)));
return dist;
}
/*____________________________________________________________________________________*/
void sort_arrays(double arr1[], double arr2[], double arr3[], const int size){
int pass, i;
double hold;
for (pass = 0; pass < size-1; pass++) {
for (i = 0; i < size-1; i++) {
if (arr1[i] > arr1[i+1]) {
hold = arr1[i];
arr1[i] = arr1[i+1];
arr1[i+1] = hold;
hold = arr2[i];
arr2[i] = arr2[i+1];
arr2[i+1] = hold;
hold = arr3[i];
arr3[i] = arr3[i+1];
arr3[i+1] = hold;
} //end if
} //end iterations for loop
} // end passes for loop
} //end sort_arrays
/*____________________________________________________________________________________*/
void all_distances(const double latRef, const double lonRef, const double lat_list[], const double lon_list[], double dist_list[], const int size){
int count;
for (count = 0; count < size-1; count++){
dist_list[count] = distance (lat_list[count], lon_list[count], latRef, lonRef);
count++;
} //end for
} //end all_distances