#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. 邮件格式(HTML/TXT),TXT为文本邮件

    <?phpclass smtp{/* Public Variables */var $smtp_port;var $time_out;var $host_name;var $log_file;v ...

  2. poj1061-青蛙的约会(扩展欧几里德算法)

    一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...

  3. easyui datagrid 单选框 效果

    columns: [[{            field: 'oid',            title: '选择',            width: 20,            forma ...

  4. SharePoint 2013 网站应用程序、网站集、网站知识整理

    网站应用程序:Web 应用程序是一种可以通过Web访问的应用程序.我们自己以前用VS开发的Web应用程序一般是通过人工部署到IIS上的,而SharePoint的Web应用程序是由SharePoint安 ...

  5. Mac OS X 背后的故事

    Mac OS X 背后的故事 作者: 王越  来源: <程序员>  发布时间: 2013-01-22 10:55  阅读: 25840 次  推荐: 49   原文链接   [收藏]   ...

  6. dubbo 试用全过程

    概述: dubbo服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源. 服务容器只 ...

  7. 记录工作中用到的linux命令

    日常工作中会对centos进行操作,总是会有一些常用的命令记不住,特开一贴,记录那些命令,学而时习之.   RPM操作类命令:   查看RPM安装路径: 1.rpm -qa|grep Memcache ...

  8. java工具类目录

    1 读取properties文件数据 http://www.cnblogs.com/xumin/p/3143762.html 2 发送邮件 3 发送短信 4

  9. Spring的RMI远程调用 - (示例)

    一.定义远程服务器上接口 public interface RMIService { public String getInfo(); } 二.实现远程服务器上接口 public class RMIS ...

  10. Java学习-045-目录中文件拷贝

    挺晚的了,直接上码.敬请各位小主参阅,若有不足之处,敬请指正,非常感谢! 目录文件拷贝源码: /** * <strong>目录拷贝</strong><br> * & ...