题目:
代码大体框架如下:
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];
}