题目
用C++求地球两点间距离
已知地球的平均半径为6371.393千米,假设在地球的同一纬度上,有两个处于不同经度的点A、B,编程序求出这两点之间的直线距离(即弦长)、弦长所对球心角的大小(单位为度)以及球面距离(即劣弧的长度).
要求:
⑴计算结果要有尽可能高的精确度.
⑵ 要考虑到横跨东、西两个半球的情况.(提示:东经为正,西经为负;北纬为正,南纬为负.)
⑶ 要求输入数据之间以空格分隔.例如,北纬30度上东经10度到东经50度的距离,输入格式应为:30 10 50
已知地球的平均半径为6371.393千米,假设在地球的同一纬度上,有两个处于不同经度的点A、B,编程序求出这两点之间的直线距离(即弦长)、弦长所对球心角的大小(单位为度)以及球面距离(即劣弧的长度).
要求:
⑴计算结果要有尽可能高的精确度.
⑵ 要考虑到横跨东、西两个半球的情况.(提示:东经为正,西经为负;北纬为正,南纬为负.)
⑶ 要求输入数据之间以空格分隔.例如,北纬30度上东经10度到东经50度的距离,输入格式应为:30 10 50
提问时间:2020-07-13
答案
根据你的题目写的
#include <iostream>
#include <string>
using namespace std;
#define EARTH_RADIUS 6371.393
#define PI 3.14159
int main(int argc,char ** argv)
{
x05while(1)
x05{
x05x05char szInput[128];
x05x05string strInput;
x05x05string strTmp;
x05x05char szTmp[128];
x05x05string::size_type Index;
x05x05float LatLongitude[3]={0};x05//经纬度
x05x05float Radius;
x05x05float ArcLen;x05x05//弧长
x05x05float ChordLen;x05x05//弦长
x05x05float LonDiff;x05//圆心角
x05x05int i=0;
x05x05cout<<"-----------------------------------------------"<<endl;
x05x05cout<<"请输入经纬度"<<endl;
x05x05cin.clear();
x05x05cin.sync();
x05x05cin.get(szInput,sizeof(szInput));
x05x05strInput=szInput;
x05x05while((Index=strInput.find(" ")) != string::npos)
x05x05{
x05x05x05strTmp=strInput.substr(0,Index);
x05x05x05_snprintf(szTmp,sizeof(szTmp),"%s",strTmp.c_str());
x05x05x05sscanf(szTmp,"%f",&(LatLongitude[i]));
x05x05x05strInput=strInput.substr(Index+1);
x05x05x05i++;
x05x05}
x05x05_snprintf(szTmp,sizeof(szTmp),"%s",strInput.c_str());
x05x05sscanf(szTmp,"%f",&(LatLongitude[i]));
x05x05if(LatLongitude[0]>90 || LatLongitude[0]<-90)
x05x05{
x05x05x05cout<<"输入纬度有误"<<endl;
x05x05x05continue;
x05x05}
x05x05if(LatLongitude[1]<-180 || LatLongitude[1]>180 || LatLongitude[2]<-180 || LatLongitude[2]>180)
x05x05{
x05x05x05cout<<"输入经度有误"<<endl;
x05x05x05continue;
x05x05}
x05x05Radius=EARTH_RADIUS*sin((90-LatLongitude[0])/180*PI);
x05x05if(LatLongitude[2]>LatLongitude[1])
x05x05{
x05x05x05LonDiff=LatLongitude[2]-LatLongitude[1];
x05x05}
x05x05else
x05x05{
x05x05x05LonDiff=LatLongitude[1]-LatLongitude[2];
x05x05}x05
x05x05if(LonDiff>180)
x05x05{
x05x05x05LonDiff=360-LonDiff;
x05x05}
x05x05ChordLen=Radius*sin(LonDiff/2/180*PI)*2;
x05x05ArcLen=2*Radius*PI*(LonDiff/360);
x05x05cout<<"两点之间的弦长:"<<ChordLen<<"千米"<<endl;
x05x05cout<<"弦长所对应的圆心角:"<<LonDiff<<"度"<<endl;
x05x05cout<<"两点之间的劣弧长:"<<ArcLen<<"千米"<<endl;
x05}
x05
x05return 0;
}
运行
#include <iostream>
#include <string>
using namespace std;
#define EARTH_RADIUS 6371.393
#define PI 3.14159
int main(int argc,char ** argv)
{
x05while(1)
x05{
x05x05char szInput[128];
x05x05string strInput;
x05x05string strTmp;
x05x05char szTmp[128];
x05x05string::size_type Index;
x05x05float LatLongitude[3]={0};x05//经纬度
x05x05float Radius;
x05x05float ArcLen;x05x05//弧长
x05x05float ChordLen;x05x05//弦长
x05x05float LonDiff;x05//圆心角
x05x05int i=0;
x05x05cout<<"-----------------------------------------------"<<endl;
x05x05cout<<"请输入经纬度"<<endl;
x05x05cin.clear();
x05x05cin.sync();
x05x05cin.get(szInput,sizeof(szInput));
x05x05strInput=szInput;
x05x05while((Index=strInput.find(" ")) != string::npos)
x05x05{
x05x05x05strTmp=strInput.substr(0,Index);
x05x05x05_snprintf(szTmp,sizeof(szTmp),"%s",strTmp.c_str());
x05x05x05sscanf(szTmp,"%f",&(LatLongitude[i]));
x05x05x05strInput=strInput.substr(Index+1);
x05x05x05i++;
x05x05}
x05x05_snprintf(szTmp,sizeof(szTmp),"%s",strInput.c_str());
x05x05sscanf(szTmp,"%f",&(LatLongitude[i]));
x05x05if(LatLongitude[0]>90 || LatLongitude[0]<-90)
x05x05{
x05x05x05cout<<"输入纬度有误"<<endl;
x05x05x05continue;
x05x05}
x05x05if(LatLongitude[1]<-180 || LatLongitude[1]>180 || LatLongitude[2]<-180 || LatLongitude[2]>180)
x05x05{
x05x05x05cout<<"输入经度有误"<<endl;
x05x05x05continue;
x05x05}
x05x05Radius=EARTH_RADIUS*sin((90-LatLongitude[0])/180*PI);
x05x05if(LatLongitude[2]>LatLongitude[1])
x05x05{
x05x05x05LonDiff=LatLongitude[2]-LatLongitude[1];
x05x05}
x05x05else
x05x05{
x05x05x05LonDiff=LatLongitude[1]-LatLongitude[2];
x05x05}x05
x05x05if(LonDiff>180)
x05x05{
x05x05x05LonDiff=360-LonDiff;
x05x05}
x05x05ChordLen=Radius*sin(LonDiff/2/180*PI)*2;
x05x05ArcLen=2*Radius*PI*(LonDiff/360);
x05x05cout<<"两点之间的弦长:"<<ChordLen<<"千米"<<endl;
x05x05cout<<"弦长所对应的圆心角:"<<LonDiff<<"度"<<endl;
x05x05cout<<"两点之间的劣弧长:"<<ArcLen<<"千米"<<endl;
x05}
x05
x05return 0;
}
运行
举一反三
已知函数f(x)=x,g(x)=alnx,a∈R.若曲线y=f(x)与曲线y=g(x)相交,且在交点处有相同的切线,求a的值和该切线方程.
我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好
奥巴马演讲不用看稿子.为什么中国领导演讲要看?
想找英语初三上学期的首字母填空练习……
英语翻译
最新试题
- 1几个方程帮忙解一下
- 2"the wet quantity of the shipment" 小女子初来窄到工作中遇到这“wet quantity”不明其中意思感谢帮助啊
- 3当m为何值时,方程组x+y=9m+6 2x—y=3m的解满足x<0,y>0?
- 4一吨等于多少方
- 5英语什么方法最快记住26个字母
- 6谁能出一道数学难题,要在初二范围内的,thank you
- 7肺泡内的二氧化碳进入血液和组织细胞最少经过几层细胞膜?
- 8关于x的二次多项式a(x3-x2+3x)+b(2x2+x)+x3-5,当x=2时的值是-17,则当x=-2时,该多项式的值是_.
- 9什么叫分化?肿瘤细胞的分化程度与恶性程度关系如何?
- 10高数...分析函数间断点类型并补充可去间断点定义 f(x)=(1+2x)^1/x
热门考点
- 1如果(a-3)x^2 y^3与-x^2 y^3是同类项,则a()
- 2人教版六年级上学期第23课
- 3用若干个长15厘米 ,宽6厘米,高12厘米的小长方形平成一块大正方形,要用几个这样的小长方体木块?
- 4学校要粉刷教室的屋顶和四面墙壁,教室长20米,宽15米,高4米,扣除门窗面积20平方米,要粉刷多少平方米?如果每平方米需要人工费8元,人工需要多少钱?
- 5已知点A(1,5),B(3,-1),点M在x轴上,当AM-BM最大时,点M的坐标为_.
- 6高中阶段常见的可逆反应有哪些
- 7等物质的量的SO2 ,SO3 质量之比为 等质量的SO2 ,SO3 的物质的量之比为
- 8电磁感应 无电流的电路中的电势
- 9如果圆的半径扩大2倍,那么圆的周长扩大几倍,圆的面积扩大几倍,快!很急
- 10相等向量一定是平行向量吗?