C语言-求两个日期之间的距离

C语言日期差计算
本文介绍了一个使用C语言实现的日期间隔计算程序。该程序通过输入两个日期(确保第一个早于第二个),然后计算并输出这两个日期之间的天数差。涉及日期处理、闰年判断等实用功能。

下列代码的情况已确定第一个日期必定小于第二个日期,若不确定,可以将代码整理成一个函数,再写一个比较日期大小的函数来确定实参的位置,最后调用计算之间距离的函数,一样可以得到结果。


#include <stdio.h>
#include <stdlib.h>
#include<math.h>

const int MONTH[2][12]= {{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
typedef struct data
{
    int year;
    int month;
    int day;
} ;
int Between(struct data data1,struct data data2);
int isRun(int year);
int main()
{
    struct data data1,data2;
    int bew;
    printf("请输入日期1(空格分隔,年 月 日):\n");
    scanf("%d %d %d",&data1.year,&data1.month,&data1.day);
    printf("请输入日期2(空格分隔,年 月 日):\n");
    scanf("%d %d %d",&data2.year,&data2.month,&data2.day);
    bew=Between(data1,data2);
    printf("相差天数为:%d天",bew);
    return 0;
}
int isRun(int year)
{
    if(((year%400)==0)||(((year%4)==0)&&(year%100)!=0))return 1;
    else return 0;
}

int Between(struct data dt1,struct data dt2)
{
    int total =0;
    while(dt1.year<dt2.year)
    {
        total+=365+isRun(dt1.year);
        dt1.year++;
    }
    if(dt1.month<dt2.month)
    {
        while(dt1.month<dt2.month)
        {
            total+=MONTH[isRun(dt2.year)][dt1.month-1];
            dt1.month++;
        }
    }
    else if(dt1.month>dt2.month)
    {
        while(dt2.month<dt1.month)
        {
            total+=MONTH[isRun(dt2.year)][dt2.month-1];
            dt2.month++;
        }
    }
    if(dt1.day<dt2.day)
    {
        total+=dt2.day-dt1.day;
    }
    else if(dt1.day >dt2.day)
    {
        total+=dt1.day-dt2.day;
    }
    return total;
}


在 C 语言中,**根据两个经纬度(经度、纬度)计算它们之间的地面距离**,最常用的方法是使用 **Haversine 公式**(Haversine Formula),它可以计算地球表面上两点间的**大圆距离**(Great-circle distance),适用于大多数实际场景(如无人机、GPS 定位等)。 --- ## ✅ Haversine 公式简介 该公式基于球面三角学,假设地球是一个完美的球体(虽然实际上略扁,但误差可接受): $$ a = \sin^2\left(\frac{\Delta \phi}{2}\right) + \cos(\phi_1) \cdot \cos(\phi_2) \cdot \sin^2\left(\frac{\Delta \lambda}{2}\right) $$ $$ c = 2 \cdot \text{atan2}\left(\sqrt{a}, \sqrt{1-a}\right) $$ $$ d = R \cdot c $$ 其中: - $\phi_1, \phi_2$:两点的纬度(弧度) - $\Delta \phi$:纬度差 - $\Delta \lambda$:经度差 - $R$:地球半径(平均约 6371 km) - 结果 $d$ 是两点间距离(单位:公里或米) --- ## ✅ C 语言实现代码 ```c #include <stdio.h> #include <math.h> // 地球半径(单位:公里) #define EARTH_RADIUS_KM 6371.0 /** * 计算两个经纬度之间距离(单位:公里) * @param lat1 第一个点的纬度(度) * @param lon1 第一个点的经度(度) * @param lat2 第二个点的纬度(度) * @param lon2 第二个点的经度(度) * @return 距离(公里) */ double calculate_distance(double lat1, double lon1, double lat2, double lon2) { // 将角度转换为弧度 double phi1 = lat1 * M_PI / 180.0; double phi2 = lat2 * M_PI / 180.0; double delta_phi = (lat2 - lat1) * M_PI / 180.0; double delta_lambda = (lon2 - lon1) * M_PI / 180.0; // Haversine 公式 double a = sin(delta_phi / 2) * sin(delta_phi / 2) + cos(phi1) * cos(phi2) * sin(delta_lambda / 2) * sin(delta_lambda / 2); double c = 2 * atan2(sqrt(a), sqrt(1 - a)); double distance = EARTH_RADIUS_KM * c; return distance; } // 示例用法 int main() { // 北京和上海的经纬度(百度/Google 可查) double beijing_lat = 39.9042; // 北纬 double beijing_lon = 116.4074; // 东经 double shanghai_lat = 31.2304; double shanghai_lon = 121.4737; double dist_km = calculate_distance(beijing_lat, beijing_lon, shanghai_lat, shanghai_lon); printf("北京到上海的距离: %.2f 公里\n", dist_km); // 如果想输出米,可以乘以 1000 printf("距离: %.2f 米\n", dist_km * 1000); return 0; } ``` --- ## 🔧 编译说明 由于使用了 `math.h` 中的数学函数(如 `sin`, `cos`, `sqrt`, `atan2`),编译时需链接数学库: ```bash gcc -o distance distance.c -lm ``` > ⚠️ 注意 `-lm`:表示链接 `libm.so` 数学库,否则会报 `undefined reference to 'sin'` 等错误。 --- ## ✅ 输出示例 ``` 北京到上海的距离: 1067.43 公里 距离: 1067430.00 米 ``` (实际公路距离更长,这是直线“空中距离”) --- ## 📌 注意事项 | 项目 | 说明 | |------|------| | ✅ 单位 | 输入是**十进制度数**(如 39.9042),不是度分秒 | | ✅ 精度 | Haversine 精度足够一般用途(误差 < 0.5%) | | ❌ 极端情况 | 接近两极或跨国际日期变更线时可能需要更复杂模型(如 Vincenty) | | 💡 扩展 | 若需更高精度,可用 WGS84 椭球模型(Vincenty 公式) | --- ## ✅ 返回单位可选版本(公里 / 米) 你可以加个参数控制单位: ```c double calculate_distance_in_meters(double lat1, double lon1, double lat2, double lon2) { return calculate_distance(lat1, lon1, lat2, lon2) * 1000.0; // km → m } ``` --- ## ✅ 进阶:支持 float 或结构体封装 ### 使用结构体更清晰: ```c typedef struct { double latitude; double longitude; } GPSPoint; double distance_between(GPSPoint p1, GPSPoint p2) { return calculate_distance(p1.latitude, p1.longitude, p2.latitude, p2.longitude); } ``` 调用方式: ```c GPSPoint beijing = {39.9042, 116.4074}; GPSPoint shanghai = {31.2304, 121.4737}; printf("距离: %.2f km\n", distance_between(beijing, shanghai)); ``` --- ## ✅ 总结 你现在已经可以用 C 实现: - ✅ 经纬度转弧度 - ✅ Haversine 公式计算球面距离 - ✅ 输出公里或米 - ✅ 封装成易用函数 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值