#include<string.h>
#include<math.h>
typedef struct
{
char Cname[21];
float Lat;
float Lon;
} CITY;
typedef struct
{
int Nb_cities;
CITY Cities[20];
} CITIES_LIST;
float **DistancesMatix = NULL;
char* GetFileName(void)
{
static char file[20];
printf("Enter the file name:\n");
scanf("%s",file);
return file;
}
void ReadFile(CITIES_LIST &list)
{
char *file=GetFileName();
FILE*fp=NULL;
int i;
fp=fopen(file,"r");
fscanf(fp,"%d\n",&list.Nb_cities);
for(i=0;i<list.Nb_cities;i++)
{
fscanf(fp,"%s %f %f\n",list.Cities[i].Cname,&(list.Cities[i].Lat),&(list.Cities[i].Lon));
}
fclose(fp);
}
void WriteDistanceMatrix(CITIES_LIST list)
{
int i, j, no = -1;
char *file=GetFileName();
FILE*fp=NULL;
if(DistancesMatix == NULL) return;
fp=fopen(file,"w");
fprintf(fp, "DESTINATION ");
for(i=0; i<list.Nb_cities; ++i)
{
fprintf(fp, "%s ", list.Cities[i].Cname);
}
fprintf(fp, "\n");
for(i=0; i<list.Nb_cities; ++i)
{
fprintf(fp, "%s ", list.Cities[i].Cname);
for(j=0; j<list.Nb_cities; ++j)
{
fprintf(fp, "%.2f ", DistancesMatix[i][j]);
}
fprintf(fp, "\n");
}
}
void CalculateDistances(CITIES_LIST list)
{
int i, j;
float res;
if(DistancesMatix != NULL)
{
delete[] DistancesMatix;
}
DistancesMatix = new float*[list.Nb_cities];
for(i=0; i<list.Nb_cities; ++i)
{
DistancesMatix[i] = new float[list.Nb_cities];
}
for(i=0; i<list.Nb_cities; ++i)
{
DistancesMatix[i][i] = 0;
for(j=i+1; j<list.Nb_cities; ++j)
{
res = cos(list.Cities[i].Lat) * cos(list.Cities[j].Lat);
res *= cos(list.Cities[i].Lon - list.Cities[j].Lon);
res += sin(list.Cities[i].Lat) * sin(list.Cities[j].Lat);
res = 6378 * acos(res);
DistancesMatix[i][j] = res;
DistancesMatix[j][i] = res;
}
}
}
void main (void)
{
CITIES_LIST list;
memset(&list, 0, sizeof(CITIES_LIST));
ReadFile(list);
CalculateDistances(list);
WriteDistanceMatrix(list);
}
測試數據:
3
Metz 3.400000 5.400000
Nancy 6.400000 78.000000
Rennes 43.000000 23.000000
輸出:
DESTINATION Metz Nancy Rennes
Metz 0.00 3231.42 9743.57
Nancy 3231.42 0.00 10559.68
Rennes 9743.57 10559.68 0.00