读取城市坐标,计算任意两个城市之间的距离。

要求:语言要求纯C语言, 知识点要求:读文件,结构体,动态分配内存,数组,指针,函数,循环,条件判断。

在这里插入图片描述
在这里插入图片描述
代码描述:

#include <stdio.h>
#include <malloc.h> 
#include <math.h>
#include <string.h> 
struct Coordinator{
	int x;
	int y;
};
typedef struct City{
    char name[5];
	struct Coordinator place;
}Point;
void myinprint(FILE *p,Point *q,int n);
void myoutprint(Point *q,int n);
Point* readfile();
double distance(Point *city,char a[],char b[],int n);
void closest(Point city[]);
double luJin(Point city[],char array[],int n);
void disAll(Point city[]);
int n;//判断出城市个数; 
int main() {
	Point *point = readfile();
	char array[6] = "ABCD";
	char a[5],b[5];
	printf("n求距离 请输入一对顶点如(A B):");
	scanf("%s %s",a,b);
	printf("%s和%s的距离是:%.3lf",a,b,distance(point,a,b,n));
	closest(point);//求短距离 
	luJin(point,array,n);
	disAll(point);
	return 0;
}
Point* readfile(){
	FILE *fp = NULL;//读文件必须首先建立一个FILE 指针; 
	fp = fopen("test1.txt","r");//打开一个文件 传入的参数为文件路径与名字,与文件操作方式; 
	fscanf(fp,"%d",&n);//通过函数fscanf进行存取 
	Point *p = (Point*)malloc(n*sizeof(Point));//申请内存;p也为数组的首地址,n就为数组的大小  
	printf("有%d个城市n",n); 
	myinprint(fp,p,n);
	myoutprint(p,n);
//	fclose(fp);//打开一个文件操作完后就得关闭这个文件 
//	free(p);//释放内存 
	return p;
}
void myinprint(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 myoutprint(Point *q,int n){
	int i;
	for(i=0;i<n;i++,q++)
		printf("%st%dt%dn",q->name,q->place.x,q->place.y);
}
double distance(Point city[],char a[],char b[],int n){
	int i;
	int x,x1;
	int y,y1;
	double c;
	for(i=0;i<n;i++){
		if(strcmp(city[i].name,a) == 0){
			x = city[i].place.x;
			y = city[i].place.y;
		}
		if(strcmp(city[i].name,b) == 0){
			x1 = city[i].place.x;
			y1 = city[i].place.y;
		}
	}
	c = sqrt((double)((x-x1)*(x-x1) + (y-y1)*(y-y1)));
	return c;
}
void closest(Point city[]){
	int i=0,j=0;
	double min = distance(city,city[0].name,city[1].name,n); 
	double c = 0;
	char M[5],N[5];
	for(i=0;i<n;i++){
		for(j=i+1;j<n;j++){
			c = distance(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最近的两个坐标是:%s和%s的距离是:%.3f",M,N,min);
}
double luJin(Point city[],char array[],int n){
	int i,j;
	char a[5] ;
	char b[5] ;
	double K=0;
	static double sum[6];
	for(i=0;i<4;i++){
		a[0] = array[i];
		a[1] = '';
		b[0] = array[i+1];
		b[1] = '';	
		sum[i] = distance(city,a,b,n);
		K += sum[i];
//		printf("%.3fn",sum[i]);
//		printf("总里程%.3fn",K);
	}
	printf("总里程%.3fn",K);
} 
void disAll(Point city[]){
	int i,j,k=0;
	static double num[10],temp;
	for(i=0;i<n;i++){
		for(j=i+1;j<n;j++){
			num[k] = distance(city,city[i].name,city[j].name,n);
			printf("num[%d]=%.3fn",k,num[k]);
			k++;
		}	
	}
	printf("n**********************n");
	for(i=0;i<10;i++){
		for(j=0;j<10-i-1;j++){
			if(num[j] > num[j+1]){
				temp = num[j+1];
				num[j+1] = num[j];
				num[j] = temp;
			}	
		}
	}
	for(i=0;i<10;i++){
		printf("num[%d]=%.3fn",i,num[i]);
	}
	printf("n**********************n");
	printf("num[%d]=%.3fn",9/2,num[9/2]);
	printf("num[%d]=%.3fn",9/2+1,num[9/2+1]);
	
}

结果描述:
在这里插入图片描述
要是要求模块功能简单,那就把我的代码注释几行即可;
在这里插入图片描述
在这里插入图片描述
第30行和第106行注释掉
效果显示如下

在这里插入图片描述

详解请关注牛牛,私聊给你过程解析!

但是为了让各位同学有优秀的编程能力,增强动手能力,此代码虽然是完整程序,还是请先独立思考,再拿此程序作为参考,相信你会有更好的解题过程,要是有不妥之处,各位请多多指正,多多包涵

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>