地球的平均半径为6371千米,已知地球上两个城市A、B的经度和纬度,编程序求出这两个城市之间的地面距离

求用c语言编写程序,可在c++6.0下可运行

#include<iostream>
#include<math.h>

using namespace std;

#ifndef M_PI
#define M_PI (3.141592653)
#endif

#define EARTH_R (6371.0)
#define MIN_DISTANCE (0.00001)//最小分辨度为1厘米

//求double类型的绝对值
double dabs(double value){
return value > 0.0 ? value : (0.0 - value);
}

//求double类型的较大数
double max(double a, double b){
return a > b ? a : b;
}
//求double类型的较小数
double min(double a, double b){
return a < b ? a : b;
}

double toRadian(double angle){
return angle / 360.0 * 2 * M_PI;
}

//已知半径、圆心角角度(弧度制),求圆心角对应的弦长
double getChordByRadiusAngle(double radius, double angle){
return 2.0 * radius * sin((angle / 2.0));//求得弦长
}

//已知半径、弦长,求弧对应的弧度(弧度制)
double getAngleByRadiusChord(double radius, double chord){
return 2.0 * asin(chord / 2.0 / radius);//求得弦对应的大圆圆心角,弧度制
}

//已知半径、弦长,求弦端点在球面上的距离
double getArcByRadiusChord(double radius, double chord){
double angle =getAngleByRadiusChord(radius, chord);//求得弦对应的大圆圆心角,弧度制

double distance = (M_PI * radius) * (angle / M_PI);
return distance;
}

//经度相同,求纬度不同的两点A、B间的弦长
//输入:A点的纬度([90,-90],北纬为正)、B点的纬度
//输出:点A、B间的弦长
double chord_Longitude(double latitudeA, double latitudeB){
double latitudeDiff = dabs(latitudeA - latitudeB);
double angle = toRadian(latitudeDiff);//求得大圆圆心角,弧度制

return getChordByRadiusAngle(EARTH_R, angle);//求得弦长
}

//纬度相同,求经度不同的两点A、B间的弦长
//输入:A点的经度([180,-180],东经为正)、B点的经度、纬度([90,-90],北纬为正)
//输出:点A、B间的弦长
double chord_Latitude(double longitudeA, double longitudeB, double latitude){
latitude = dabs(latitude);
double laR = EARTH_R * cos((latitude / 180.0) * M_PI);//求得纬线圈半径

double longitudeDiff = dabs(longitudeA - longitudeB);
longitudeDiff = longitudeDiff < 180.0 ? longitudeDiff : (360.0 - longitudeDiff);
double angle = toRadian(longitudeDiff);

return getChordByRadiusAngle(laR, angle);//求得弦长
}

//输入两点的经纬度,求出两点的距离
//输入:A点的经度([180,-180],东经为正)、A点的纬度([90,-90],北纬为正)、B点的经度、B点的纬度
//输出:点A、B的距离
//先求得两点的弦长,再求弦对应的大圆圆心角,最后得到大圆弧线长即为距离
double distanceOf2Points(double longitudeA, double latitudeA, double longitudeB, double latitudeB){
double chord = 0.0;
/*
if(longitudeA == longitudeB){//经度相同
chord = chord_Longitude(latitudeA, latitudeB);
}else if(latitudeA == latitudeB){//纬度相同
chord = chord_Latitude(longitudeA, longitudeB, latitudeA);
}else{*/
//求以AB为对角线,以过点A、B的两条纬线、经线的四个交点为顶点的等腰梯形的四条边长
double baselineA = chord_Latitude(longitudeA, longitudeB, latitudeA);//过点A的底线长
double baselineB = chord_Latitude(longitudeA, longitudeB, latitudeB);//过点B的底线长
double waistline = chord_Longitude(latitudeA, latitudeB);//腰线长
/*
if(baselineA == baselineB){//实为矩形
chord = sqrt(baselineA * baselineA + waistline * waistline);
std::cout<<"矩形: "<<chord<<endl;
}else{*/
double baselineS = min(baselineA, baselineB);//较短的底线
double baselineL = max(baselineA, baselineB);//较长的底线
double shortline = (baselineL - baselineS) / 2.0;//分割中间矩形后,边侧直角三角形的边

chord = sqrt(waistline * waistline - shortline * shortline + (baselineL - shortline) * (baselineL - shortline));
//}
//}

double distance = getArcByRadiusChord(EARTH_R, chord);
if(distance >= MIN_DISTANCE){
return distance;
}
return 0.0;
}

int main(){
double params[4];
int i;
double distance;

std::cout<<"输入格式:A点经度 A点纬度 B点经度 B点纬度"<<std::endl<<std::endl;

while(true){
i = 0;
distance = -1.0;
while(std::cin>>params[i]){//读入四个经纬值
i++;
if(4 == i){
break;
}
}
if(4 == i){
distance = distanceOf2Points(params[0], params[1], params[2], params[3]);
std::cout<<"A点("<<params[0]<<","<<params[1]<<")、B点("<<params[2]<<","<<params[3]<<") 的距离为:"<<std::endl<<distance<<"(千米)"<<std::endl<<std::endl;
}else{
break;//输入非数字 字符时,结束程序
}
}
return 0;
}追问

为什么无法执行

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网