#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. .net获取select控件中的文本内容

    .net获取select控件中的文本内容 2009-11-28 21:19小V古 | 分类:C#/.NET | 浏览1374次 <select id="SecType" st ...

  2. java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

  3. Struts2的Action(二)

    Struts2的Action可以是一个POJO(即简单的javaBean),也实现Action接口,或者继承ActionSupport类. 1.Action接口: public interface A ...

  4. Android课程---Android Studio安装及使用

    2013年Google I/O 大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA 开发环境,旨在取代Eclipse和ADT(And ...

  5. 【iCore3 双核心板_ uC/OS-III】例程十一:任务消息队列

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

  6. ThinkPHP 3.2.3 中设置和使用 Session

    Session 的配置 可以在 config.php(可以是应用公用的 config.php 或模块的 config.php)中对 Session 进行配置,例如: config.php <?p ...

  7. How to prevent SQL injection attacks?

    In our earlier tutorial on SQL Injection, one way to have prevented the SQL injection attack was by ...

  8. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

  9. Linux内核中大小端判定宏

    #include <stdio.h> ];unsigned long mylong;} endian_test = { {'l','?','?','b'} }; #define ENDIA ...

  10. JavaScript实现绑定DOM的定时器插件

    问题 使用原生的setTimeout和setInterval仅仅能够实现, 定时执行事件处理函数, 在网页开发中, 往往会出现一种情况,定时器用于定时更新某个页面区域的数据, 往往在页面加载之后, 就 ...