NWAFU-1553简单计算两个日期之间的天数差

本文详细介绍了如何在C语言中实现两个功能函数:ToDate用于将字符串日期解析为Date结构体,DaysCount用于计算两个日期之间的天数差。函数原型和示例测试用例也一并给出。
摘要由CSDN通过智能技术生成

题目:
代码大体框架如下:

typedef struct {
	unsigned int year;
	unsigned int month;
	unsigned int day;
}Date, * PDate;

int main()
{
    char str1[12], str2[12];
    Date sd, ed;
    fgets(str1, 12, stdin);
    fgets(str2, 12, stdin);
    if (ToDate(str1, &sd) == 0 && ToDate(str2, &ed) == 0)
        printf("%d\n", DaysCount(&sd, &ed));
    else
        printf("input data is invalid.\n");
    return 0;
}
 

int is_leap(int year)
{
    return ((year%4==0&&year%100!=0)||year%400==0);
}
 
int month_days(int month, int leap)
{
	int m_days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };	if (month == 2)
		return (leap == 1) ? 29 : 28;
	else
		return m_days[month];
}

请实现下面的两个函数,其原型要求如下:
int ToDate(char *str, PDate pd);
int DaysCount(PDate sdate, PDate edate);
ToDate()函数将字符串str中的合法日期存入指针变量pd指向的结构体成员中,其中字符串str的基本形式为“YYYY-MM-DD”,YYYY代表年,MM代表月,DD代表日,如str为“2023-12-30”,则ToDate()函数的功能是将2023、12、30分别存入pd->year、pd->month、pd->day中。如果str中的日期数值范围或数据格式非法,函数返回-1,正常返回0。
DaysCount()函数计算两个日期sdate和edate之间差距是多少天,并返回计算结果。

给出调试案例:
输入:

2008-08-08
2023-12-30

输出:

5622

可以使用sscanf函数从字符串str中将年月日读取为整数,例如,sscanf(str, “%d-%d-%d”, &year, &month, &day)。
另外,提供以下日期计算结果,供程序测试使用。
1949年10月01日开国大典,至今(2023年12月30日)已过27118天。
1950年10月25日抗美援朝,至今(2023年12月30日)已过26729天。

具体代码如下:

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

typedef struct {
    unsigned int year;
    unsigned int month;
    unsigned int day;
} Date, * PDate;

int ToDate(char* str, PDate pd);
int DaysCount(PDate sdate, PDate edate);
int is_leap(int);
int month_days(int, int);

int ToDate(char* str, PDate pd)
{
    int year, month, day;
    if ((sscanf(str, "%d-%d-%d", &year, &month, &day)) == 3)//判断格式是否正确
    {
        if (year >= 1900 && year <= 2050 && month >= 1 && month <= 12 && day >= 1 && day <= 31)//判断数据范围是否正确
        {
            pd->year = year;
            pd->month = month;
            pd->day = day;
            return 0;
        }
        else
            return -1;
    }
    else
        return -1;
}

int DaysCount(PDate sdate, PDate edate)
{
    unsigned int adds = 0;
    unsigned int adde = 0;
    unsigned int addz = 0;
    //计算初始年的有效天数
    int adds1 = month_days(sdate->month, is_leap(sdate->year)) - sdate->day;
    for (int i = sdate->month + 1; i <= 12; i++)
    {
        adds += month_days(i, is_leap(sdate->year));
    }
    adds += adds1;
    //计算终止年的非有效天数
    int adde1 = month_days(edate->month, is_leap(edate->year)) - edate->day;
    for (int i = edate->month + 1; i <= 12; i++)
    {
        adde += month_days(i, is_leap(edate->year));
    }
    adde += adde1;
    //计算初始年的第二年到终止年的总天数
    for (int i = sdate->year + 1; i <= edate->year; i++)
    {
        if (is_leap(i) != 1)
            addz += 365;
        else if (is_leap(i) == 1)
            addz += 366;
    }
    
    int res = adds + addz - adde;//初始有效天数加总天数减去终止的非有效天数
    return res;
}
int main()
{
    char str1[12], str2[12];
    Date sd, ed;
    fgets(str1, 12, stdin);
    fgets(str2, 12, stdin);
    if (ToDate(str1, &sd) == 0 && ToDate(str2, &ed) == 0)
        printf("%d\n", DaysCount(&sd, &ed));
    else
        printf("input data is invalid.\n");
    return 0;
}

int is_leap(int year)//判断是不是闰年
{
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}

int month_days(int month, int leap)//给出闰(平)年的各个月份对应的天数
{
    int m_days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 2)
        return (leap == 1) ? 29 : 28;
    else
        return m_days[month];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值