Problem Description
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
Input
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
Output
对于每组输入数据,输出一行,结果保留两位小数。
#include<stdioh>
#include<mathh>
void main()
{int X1,X2,Y1,Y2;<br>double d;<br>printf("%d %d %d %d\n",X1,Y1,X2,Y2);
<br>while(scanf("%d %d %d %d\n",&X1,&Y1,&X2,&Y2)!=EOF)
<br>while(1)<br>{d=sqrt((X1-X2)(X1-X2)+(Y1-Y2)(Y1-Y2));<br>printf("%2f\n",d);
1、C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
2、尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
3、二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
#include<stdioh>
#include<stringh>
#include<mathh>
#include <stdlibh>
#include <malloch>
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;
} ////该函数的功能是输入文件名,将其出入file并作为返回值返回。
void ReadFile(CITIES_LIST list) ////c中没有引用,所以此处改为指针传递
{
char file=GetFileName(); ///调用getfilename获取文件名。
FILEfp=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();
FILEfp=NULL;
if(DistancesMatix == NULL) return;
fp=fopen(file,"w"); /////以写方式打开文件
fprintf(fp, "DESTINATION "); ////将DESTINATION 字符串写入stdout流中
for(i=0; i<listNb_cities; ++i)
{
fprintf(fp, "%s ", listCities[i]Cname); /////依次写入城市的名字到stdout
}
fprintf(fp, "\n"); //////换行
for(i=0; i<listNb_cities; ++i)
{
fprintf(fp, "%s ", listCities[i]Cname);
for(j=0; j<listNb_cities; ++j)
{
fprintf(fp, "%2f ", DistancesMatix[i][j]);
}
fprintf(fp, "\n");
}
} /////
void CalculateDistances(CITIES_LIST list) /////计算城市距离的
{
int i, j;
float res;
if(DistancesMatix != NULL)
{
free(DistancesMatix);
} /////这里只是检查一下这个指针是否存在切指向NULL,不过new和delete是c++的用法改成c的malloc和free了
DistancesMatix = (float ) malloc(sizeof( float)listNb_cities);
for(i=0; i<listNb_cities; ++i)
{
DistancesMatix[i] = (float ) malloc(sizeof(float)listNb_cities);
} //////为该指针分配一个二维数组,动态分配二维数组的一般方法。
for(i=0; i<listNb_cities; ++i)
{
DistancesMatix[i][i] = 0;
for(j=i+1; j<listNb_cities; ++j)
{
res = cos(listCities[i]Lat) cos(listCities[j]Lat);
res = cos(listCities[i]Lon - listCities[j]Lon);
res += sin(listCities[i]Lat) sin(listCities[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);
}
说明:
我只是修改了楼上的几个错误,添加了一些注释,余下的几个警告信息都是在计算城市距离时候给出的。请把分给楼上,我觉得楼上的这个程序写的很好。
import javatextDecimalFormat;
import javautilScanner;
public class $ {
public static void main(String[] args) {
Scanner in = new Scanner(Systemin);
while (true) {
Systemoutprint("输入两点坐标(整形逗号分隔,exit退出):");
String str = innextLine();
if ("exit"equals(str)) {
Systemexit(0);
}
String[] arr = strsplit(" ");// 输入的字符串按空格分隔成字符串数据
try {
int x1 = IntegerparseInt(arr[0]);
int y1 = IntegerparseInt(arr[1]);
int x2 = IntegerparseInt(arr[2]);
int y2 = IntegerparseInt(arr[3]);
double x = Mathpow((x2 - x1), 2);// x平方
double y = Mathpow((y2 - y1), 2);// y平方
double result = Mathsqrt(x + y);
DecimalFormat df = new DecimalFormat("####");// 数字格式化
Systemoutprintln("点(" + x1 + "," + y1 + ")到点(" + x2 + "," + y2 + ")的距离为:" + dfformat(result));
} catch (Exception e) {
Systemoutprintln("输入错误,重新输入!");
continue;
}
}
}
}
Private Sub Command1_Click()
If Text1Text <> "" Then
a = Val(Text1Text)
Else
a = -Val(Text2Text)
End If
If Text3Text <> "" Then
b = Val(Text3Text)
Else
b = -Val(Text4Text)
End If
c = Abs(a - b)
If c > 180 Then c = 360 - c
Text5Text = c 2 31415926 6378137 / 360
End Sub
经纬度是经度与纬度的合称组成一个坐标系统,它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。怎么计算两个经纬度之间的距离,有什么计算公式或者方法技巧?
经纬度计算方法
在地球上任何地点,只要有只表,有根竹竿,一根卷尺,就可知道当地经纬度。但表必须与该国标准时校对。
方法如下: 1、先算两分日
比如在中国某地,杆影最短时是中午13点20分,且杆长与影长之比为1,则可知该地是北纬45°(tgα=1),东经100°(从120°里1小时减15°,4分钟减1°)杆长与影长之比需查表求α,这里用了特殊角。
2、再算两至日经度的算法不变 纬度在北半球冬至α+235°,夏至α-235°在任意一天加减修正值即可。
3、修正值算法:就是距两分或两至日的天数差乘以94/365 比如2013年2月17日,2013年3月22日春分差33天,即太阳直射点在南纬
33×94/365=85°
所以今天正午时得到的纬度是(arctgα+85)°
tgα= 杆长/影长
计算地球上两点距离d1已知地球上两点的经度、纬度:(X1,Y1), (X2,Y2),其中X1,X2为经度,Y1,Y2为纬度;
视计算程序需要转化为弧度(31415926/180)
地球半径为R=63710 km
则两点距离d=Rarcos[cos(Y1)cos(Y2)cos(X1-X2)+sin(Y1)sin(Y2)]
2在地球上同一条经线上纬度相差一度,实际距离是111公里;在赤道经度相差一度,实际距离是111公里,在其他的纬线上,经度每相差一度,实际距离是111经度数cos经度数,例如在北纬30度,经度相差5度,实际距离是:1115cos30度。
用经纬度大致计算距离地球赤道上环绕地球一周走一圈共 4007504公里
而一圈分成360°
而每1°(度)有60'
每一度一秒在赤道上的长度计算如下:
4007504km/360°=11131955km
11131955km/60'=18553258km=18553m
而每一分又有60秒
每一秒就代表 18553m/60=3092m
任意两点距离计算公式为
d=11112cos{1/[sinΦAsinΦB十 cosΦAcosΦBcos(λB-λA)]}
其中:A点经度,纬度分别为λA和ΦA
B点的经度、纬度分别为λB和ΦB,d为距离
地球上所有地方的纬度一分的距离都是约等于186公里,也就是一度等于186*60=111公里。
不同纬度处的经度线上的一分的实际长度是不同的,219国道基本在东经29-38度之间,29度处的一分经线长约163公里,38度处的一分经线长约147公里。
以上就是关于C语言计算两点间距离方法是什么全部的内容,包括:C语言计算两点间距离方法是什么、C语言求城市距离(50分)、求距离的java小程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)