求用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;
}追问
#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;
}追问
为什么无法执行
温馨提示:答案为网友推荐,仅供参考