#include<iostream>
#include<string>
#include<cmath>
#include<iomanip> using namespace std; struct City //城市结构体
{
string name;
int EorW;//东经还是西经?东经1,西经0
int NorS;//北纬还是南纬?北纬1,南纬0
double lon;//经度
double lat;//纬度
City()
{
EorW = ;
NorS = ;
}
}; const double PI = 3.1415926;
const double R = 6371.0;//地球半径 int Iputn() //input number输入城市数量
{
int n;
bool flag = true;
while (flag)
{
cout << "请输入城市个数(正整数):" << '\n';
cin >> n;
if ( >= n)
{
cout << "您的输入不符合要求!重新输入请按1,退出请按0:" << '\n';
int choice;
cin >> choice;
if ( != choice){ flag = false; }
}
if (flag)flag = false;
else flag = true;
}
return n;
} int ChoDir(int dir) //choose direction 选择方向(东西经,南北纬)
{
string str1, str2;
if ( == dir){ str1 = "东经"; str2 = "西经"; }
else{ str1 = "北纬"; str2 = "南纬"; }
bool flag = true;
int choice;
while (flag)
{
cout << "请您选择"<<str1<<"还是"<<str2<<":" <<"1." <<str1 << ";" << "0."<<str2 << '\n';
cin >> choice;
if (choice< || choice>)
{
cout << "您的输入不符合要求!重新输入请按1,退出程序请按0:" << '\n';
int choice1;
cin >> choice1;
if (!= choice1)flag = false;
}
if (flag)flag = false;
else flag = true;
}
return choice;
} double Iputcoo(int option) //input coordinate 输入坐标
{
string str;
double up;
if ( == option){ str = "东经"; up = 180.0; }
else if ( == option){ str = "西经"; up = 180.0; }
else if ( == option){ str = "北纬"; up = 90.0; }
else { str = "南纬"; up = 90.0; }
double coor;
bool flag = true;
while (flag)
{
cout << "请您输入" << str << "(0到"<<up<<"间的有理数):" << '\n';
cin >> coor;
if (coor<0.0||coor>up)
{
cout << "您的输入不符合要求,重新输入请按1,退出请按0:" << '\n';
int choise;
cin >> choise;
if ( != choise)flag = false;
}
if (flag)flag = false;
else flag = true;
}
return coor;
} double Calcu(City& P1, City& P2) //calculate 计算两点加球面距
{
if (P1.name == P2.name)return 0.0;
//求AB
double AB;
double OA = sin(P1.lat); double OB = sin(P2.lat);
if (P1.NorS == P2.NorS) AB = fabs(OA - OB);
else AB = OA + OB;
//求夹角
double angle;
if (P1.EorW == P2.EorW) angle = fabs(P1.lon - P2.lon);
else angle = P1.lon + P2.lon;
//求P1A、P2B
double P1A = cos(P1.lat); double P2B = cos(P2.lat);
//求_P1P2_2 (P1'P2的平方)
double _P1P2_2 = P1A*P1A + P2B*P2B - * cos(angle)*P1A*P2B;
//求P1P2_2 (P1P2的平方)
double P1P2_2 = _P1P2_2 + AB*AB;
//求夹角1 (OP1与OP2间的夹角)
double angle1 = acos(( - P1P2_2) / 2.0);
//求球面距
return R*angle1;
} int main()
{
int num = Iputn(); //输入城市数量
if ( >= num){ exit(); }
struct City* city = new City[num];//创建数组
for (int i = ; i < num; i++)
{
getchar(); //输入城市名称
cout << "请您输入城市" << i + << "的名称:" << '\n';
getline(cin, city[i].name);
int choice = ChoDir(); //输入东西经
if (choice< || choice>){ delete[] city; exit(); }
if ( == choice)
{
double elon = Iputcoo();
if (elon<0.0|| elon>180.0)
{
delete[] city;
exit();
}
city[i].lon = PI*elon / 180.0; //角度转弧度
city[i].EorW = ; //东经
}
else
{
double wlon = Iputcoo();
if (wlon<0.0 || wlon>180.0)
{
delete[] city;
exit();
}
city[i].lon = PI*wlon / 180.0;
city[i].EorW = ; //西经
}
choice = ChoDir(); //输入南北纬
if (choice< || choice>){ delete[] city; exit(); }
if ( == choice)
{
double nlat = Iputcoo();
if (nlat<0.0 || nlat>90.0)
{
delete[] city;
exit();
}
city[i].lat = PI*nlat / 180.0;
city[i].NorS = ; //北纬
}
else
{
double slat = Iputcoo();
if (slat<0.0 || slat>90.0)
{
delete[] city;
exit();
}
city[i].lat = PI*slat / 180.0;
city[i].NorS = ; //南纬
}
}
cout << "Start\\End ";
for (int i = ; i < num; i++)
cout << setw()<<setiosflags(ios::left)<<city[i].name;
cout << '\n';
for (int i = ; i < num; i++)
{
cout << setw()<<setiosflags(ios::left)<<city[i].name;
for (int j = ; j < num; j++)
cout << setw() << setiosflags(ios::fixed) << setprecision() << Calcu(city[i], city[j]);
cout << '\n';
}
delete[] city;//delete掉new的数组
return ;
}

计算城市间的球面距离(C++实现)的更多相关文章

  1. PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

    PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...

  2. HDOJ2001计算两点间的距离

    计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  3. 计算两点间的距离,hdu-2001

    计算两点间的距离 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离.   Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1 ...

  4. TSQL 根据经纬度计算两点间的距离;返回米(m)

    -- ============================================= -- Author:Forrest -- Create date: 2013-07-16 -- Des ...

  5. 转:Math: Math.atan() 与 Math.atan2() 计算两点间连线的夹角

    我们可以使用正切操作将角度转变为斜率,那么怎样利用斜率来转换为角度呢?可以利用斜率的反正切函数将他转换为相应的角度.as中有两个函数可以计算反正切,我们来看一下. 1.Math.atan() Math ...

  6. 城市间紧急救援(25 分)(dijstra变形)

    城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...

  7. PTA-数据结构 Dijkstra 城市间紧急救援

    城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...

  8. 5-5 城市间紧急救援 (25分)【最短路spfa】

    5-5 城市间紧急救援   (25分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速 ...

  9. hdu2001 计算两点间的距离【C++】

    计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

随机推荐

  1. matplotlib 安装与使用

    1.在ubuntu下输入 sudo apt-get install python-matplotlib 安装matplotlib 2.简单代码使用

  2. 关于Response.redirect()方法

    1. sendRedirect 后面要加上return.2. sendRedirect 执行过程是先转向还是先执行后续代码再转向?答: 先执行代码再转向,在一个sendRedirect后面不能再有其他 ...

  3. 修改cms 管理栏目路径

    Foosun.SQLServerDAL.Pagination throw new Exception("没有找到SQL");

  4. SQL Server 存储过程(转)

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

  5. IOS彩票第二天设置界面(1)

    ****跳转到设置界面 - (IBAction)setting:(id)sender { // 创建设置口控制器 ILSettingTableViewController *settingVc = [ ...

  6. 【iCore3 双核心板_FPGA】实验二十一:Niosii——基于内部RAM建立第一个软核

    实验指导书及代码包下载: http://pan.baidu.com/s/1boLbBdl iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  7. Mysql VARCHAR(X) vs TEXT

    一般情况下,我们不太会纠结用Varchar或text数据类型. 比如说,我们要存储邮箱,我们自然会用varchar,不会想到用text.而当我们要存储一段话的时候,选了text,感觉varchar也够 ...

  8. SimpleInjector的使用

    SimpleInjector的使用       国庆大假,但是,小弟依然学习,前天去看了房交会,尼玛,吓屎宝宝了,还是安静的坐在公司里巧代码比较合适: the usage of injector co ...

  9. 访问 Android Developers 403 错误

    原因: 以前改过 hosts. 现在用的 威-屁-恩. 解决办法: 把改过的 hosts 删掉就行了.

  10. PL/SQL 存储函数和过程

    --存储过程 .不带参: create or replace procedure 存储过程名 as|is --说明部分 begin --执行的语句: end: 调用存储过程 execute 存储过程名 ...