读文件求两个城市的最小距离,换个文件,就不能求了
问题描述:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include<stdlib.h>
struct ZuoBiao{
int x;
int y;
};
typedef struct City{
char name[20];
struct ZuoBiao place; //结构体的嵌套
}Point;
int n;
void init(FILE *p,Point *q,int n){//传入Point 数组 以及 文件大小
int i;
for(i=0;i<n;i++,q++)
fscanf(p,"%s%d%d",&q->name,&q->place.x,&q->place.y);
}
void display(Point *q,int n){
int i;
for(i=0;i<n;i++,q++)
printf("%s\t%d\t%d\n",q->name,q->place.x,q->place.y);
}
double juli(Point city[],char a[],char b[],int n){
int i ,j;
int x1,x2;
int y1,y2;
double c; //c为两点间的距离
for(i=0;i<n;i++){
if(strcmp(city[i].name,a) == 0){ //strcmp函数是比较两个“字符串”的大小 ,等于0时,两个字符串相等;
x1 = city[i].place.x;
y1 = city[i].place.y;
}
// }
for(j=0;j<n;j++){
if(strcmp(city[j].name,b) == 0){
x2 = city[j].place.x;
y2 = city[j].place.y;
}
}
}
c = sqrt((double)((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))); //sqrt函数是平方根函数;
return c;
}
Point* file(){
FILE *fp = NULL;//读文件必须首先建立一个FILE 指针;
fp = fopen("test01.txt","r");//打开一个文件 传入的参数为文件路径与名字,与文件操作方式;
fscanf(fp,"%d",&n);//通过函数fscanf进行存取
Point *p = (Point*)malloc(n*sizeof(Point));//申请内存;p也为数组的首地址,n就为数组的大小
printf("%d\n",n);
init(fp,p,n);
display(p,n);
return p;
}
void minJuLi(Point city[]){
int i,j;
double MIN;
// double MIN = juli(city,city[i].name,city[j].name,n);
double c = 0;
char M[10000],N[10000];
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
MIN = juli(city,city[0].name,city[1].name,n);
c = juli(city,city[i].name,city[j].name,n);
if(c<=MIN){
MIN = c;
strcpy(M,city[i].name); //字符串的拷贝
strcpy(N,city[j].name);
}
}
}
printf("\n");
printf("最近的两个坐标是:%s和%s的距离是:%.3f",M,N,MIN);
}
int main() {
Point *point = file();
char a[1000],b[1000];
printf("输入要计算距离的两个城市:(例如:A B)\n");
scanf("%s %s",&a,&b);
printf("距离最近的两个城市信息如下:\n");
printf("%s和%s的距离是:%.3lf",a,b,juli(point,a,b,n));
minJuLi(point);//求短距离
return 0;
}
卫奇塔 3743 -972威廉斯塔德 1212 -6856温得和克 -2234 1706温泽 4218 -8301温尼伯 4953 -971弗罗茨瓦夫 5105 17武汉 3035 11419雅库茨克 621 12951亚穆苏克罗 651 -518仰光 1646 9609雅温得 351 1131亚伦 -32 16655叶卡捷琳堡 5652 6035耶洛奈夫 623 -11429耶烈万 401 4431横滨 3527 13939南萨哈林斯克 4658 14244萨格勒布 4549 1558郑州 3435 11338淄博 365 118苏黎世 4722 832
答
代码修改如下:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include<stdlib.h>
struct ZuoBiao{
int x;
int y;
};
typedef struct City{
char name[20];
struct ZuoBiao place; //结构体的嵌套
}Point;
int n;
void init(FILE *p,Point *q){//传入Point 数组 以及 文件大小
int i;
for(i=0;i<n;i++,q++)
fscanf(p,"%s%d%d",q->name,&q->place.x,&q->place.y); // MOD 这里q->name前不需要&
}
void display(Point *q){
int i;
for(i=0;i<n;i++,q++)
printf("%s\t%d\t%d\n",q->name,q->place.x,q->place.y);
}
double juli(Point city[],int i,int j){
int x1=0,x2=0; //MOD 这里需要初始化
int y1=0,y2=0; //MOD 这里需要初始化
double c; //c为两点间的距离
x1 = city[i].place.x;
y1 = city[i].place.y;
x2 = city[j].place.x;
y2 = city[j].place.y;
c = sqrt((double)((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))); //sqrt函数是平方根函数;
return c;
}
Point* file(){
FILE *fp = NULL;//读文件必须首先建立一个FILE 指针;
fp = fopen("test01.txt","r");//打开一个文件 传入的参数为文件路径与名字,与文件操作方式;
fscanf(fp,"%d",&n);//通过函数fscanf进行存取
Point *p = (Point*)malloc(n*sizeof(Point));//申请内存;p也为数组的首地址,n就为数组的大小
printf("%d\n",n);
init(fp,p);
display(p);
return p;
}
void minJuLi(Point city[]){
int i,j;
double MIN;
// double MIN = juli(city,city[i].name,city[j].name,n);
double c = 0;
char M[10000],N[10000];
MIN = juli(city,0,1);
strcpy(M,city[0].name); //字符串的拷贝
strcpy(N,city[1].name);
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
c = juli(city,i,j);
if(c<MIN){
MIN = c;
strcpy(M,city[i].name); //字符串的拷贝
strcpy(N,city[j].name);
}
}
}
printf("\n");
printf("最近的两个坐标是:%s和%s的距离是:%.3f",M,N,MIN);
}
int main() {
Point *point = file();
char a[1000],b[1000];
int i,ma=-1,mb=-1;
printf("输入要计算距离的两个城市:(例如:A B)\n");
scanf("%s %s",&a,&b);
printf("距离最近的两个城市信息如下:\n");
for(i=0;i<n;i++)
{
if(strcmp(point[i].name,a) == 0)
{
if (ma == -1)
{
ma = i; //只记录第一个点
}
}
if(strcmp(point[i].name,b) == 0)
{
if (mb == -1)
{
mb = i; //只记录第一个点
}
}
}
if(ma != -1 && mb != -1)
printf("%s和%s的距离是:%.3lf",a,b,juli(point,ma,mb));
minJuLi(point);//求短距离
return 0;
}