#include<stdio.h>
typedef struct Date
{
int Year;
int Month;
int Day;
}Date;
Date Start_date, End_date; /* 全局变量 */
Date S, E; /* 用来存放起止日期的初始值,最终输出时用 */
int result_day = 0; /* 最终算得的总天数,初始值设为0 */
/* 函数声明 */
int Enter_date(); /* 输入起止日期 */
int Count_month(int, int, int, int); /* 计算两日期之间的月份差的天数 */
int Count_year(int, int); /* 计算两日期之间的年份差的天数 */
int Is_leap_year(int year); /* 判断当前年份是否为闰年 */
int Judge_month(int month, int year); /* 判断当前年份中的当前月份的天数 */
int main() /* 主函数 */
{
Enter_date(); /* 调用函数,输入起始日期和截止日期 */
result_day += (End_date.Day - Start_date.Day); /* 计算截止日期的日与起始日期的的日的天数的差*/
result_day = Count_month(Start_date.Month, End_date.Month, Start_date.Year, End_date.Year);
/* 调用函数,计算截止日期的月份与起始日期的月份的差的天数 */
result_day = Count_year(Start_date.Year, End_date.Year); /* 调用函数,计算相隔整数年份的天数 */
printf("\n从%d年%d月%d日到%d年%d月%d日共有%d天。\n\n", /* 输出结果 */
S.Year, S.Month, S.Day, E.Year, E.Month, E.Day, result_day);
return 0;
}
int Enter_date()
{
printf("\n程序将给出您输入的两个日期(年月日)之间的天数。\n"); /* 对程序功能的简单说明 */
printf("您输入的年份范围是公元元年至公元3000年。\n\n");
printf("请输入起始日期, \n Year:"); /* 输入起始日期 */
scanf("%d", &Start_date.Year);
while (Start_date.Year < 0 || Start_date.Year > 3000) /* 判断输入的年份是否正确 */
{
printf("Error: 年份输入错误!请重新输入。\n");
printf(" Year:");
scanf("%d", &Start_date.Year);
}
printf(" Month:");
scanf("%d", &Start_date.Month);
while (Start_date.Month < 1 || Start_date.Month > 12) /* 判断输入的月份是否正确 */
{
printf("Error: 月份输入错误!请重新输入。\n");
printf(" Month:");
scanf("%d", &Start_date.Month);
}
printf(" Day:");
scanf("%d", &Start_date.Day);
while (Start_date.Day < 1 || Start_date.Day > 31) /* 判断输入的日期是否正确 */
{
printf("Error: 日期输入错误!请重新输入。\n");
printf(" Day:");
scanf("%d", &Start_date.Day);
}
printf("请输入截止日期,\n Year:"); /* 输入截止日期 */
scanf("%d", &End_date.Year);
while (End_date.Year < Start_date.Year || End_date.Year > 3000) /* 判断输入的年份是否正确 */
{
printf("Error: 年份输入错误!请重新输入。\n");
printf(" Year:");
scanf("%d", &End_date.Year);
}
printf(" Month:");
scanf("%d", &End_date.Month);
while (End_date.Month < 1 || End_date.Month > 12) /* 判断输入的月份是否正确 */
{
printf("Error: 月份输入错误!请重新输入。\n");
printf(" Month:");
scanf("%d", &End_date.Month);
}
/* 当起止日期的年份相同时,判断截止日期的月份是否大于起始日期的月份*/
while (End_date.Year == Start_date.Year && End_date.Month < Start_date.Month)
{
printf("Error: 输入的月份错误!请重新输入。\n");
printf(" Month:");
scanf("%d", &End_date.Month);
}
printf(" Day:");
scanf("%d", &End_date.Day);
while (End_date.Day < 1 || End_date.Day > 31) /* 判断输入的日期是否正确 */
{
printf("Error: 日期输入错误!请重新输入。\n");
printf(" Day:");
scanf("%d", &End_date.Day);
}
/* 当起止日期的年份月份都相同时,判断截止日期的日是否大于起始日期*/
while (End_date.Year == Start_date.Year && End_date.Month == Start_date.Month && End_date.Day < Start_date.Day)
{
printf("Error: 输入的日期错误!请重新输入。\n");
printf(" Day:");
scanf("%d", &End_date.Day);
}
S.Year = Start_date.Year; /* 赋值给S和E中的各项 */
S.Month = Start_date.Month;
S.Day = Start_date.Day;
E.Year = End_date.Year;
E.Month = End_date.Month;
E.Day = End_date.Day;
return 0;
}
int Count_month(int S_Month, int E_Month, int S_Year, int E_Year)
{
while (E_Month - S_Month != 0) /* 计算截止日期的月份与起始日期的月份的差的天数*/
{
if (E_Month > S_Month) /* 当截止日期的月份大于起始日期的月份时,应从起始日期的月份算起 */
{
result_day += Judge_month(S_Month, S_Year); /* 调用判断月份的函数,确定当前月份的天数*/
++S_Month;
}
else /* 否则,应从截止日期的月份算起,减去不足的天数 */
{
result_day -= Judge_month(E_Month, E_Year);
++E_Month;
}
}
return result_day;
}
int Count_year(int S_Year, int E_Year)
{
while (E_Year - S_Year >= 1) /* 计算整数年份的天数 */
{
if (Is_leap_year(S_Year))
result_day += 366;
else
result_day += 365;
S_Year++;
}
return result_day;
}
int Is_leap_year(int year) /* 判断当前年份是否为闰年 */
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 1;
else
return 0;
}
int Judge_month(int month, int year) /* 判断某一年中的当前月份的天数 */
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: return 31; break;
case 2:
if (Is_leap_year(year))
return 29;
else
return 28; break;
default: return 30; break;
}
}
typedef struct Date
{
int Year;
int Month;
int Day;
}Date;
Date Start_date, End_date; /* 全局变量 */
Date S, E; /* 用来存放起止日期的初始值,最终输出时用 */
int result_day = 0; /* 最终算得的总天数,初始值设为0 */
/* 函数声明 */
int Enter_date(); /* 输入起止日期 */
int Count_month(int, int, int, int); /* 计算两日期之间的月份差的天数 */
int Count_year(int, int); /* 计算两日期之间的年份差的天数 */
int Is_leap_year(int year); /* 判断当前年份是否为闰年 */
int Judge_month(int month, int year); /* 判断当前年份中的当前月份的天数 */
int main() /* 主函数 */
{
Enter_date(); /* 调用函数,输入起始日期和截止日期 */
result_day += (End_date.Day - Start_date.Day); /* 计算截止日期的日与起始日期的的日的天数的差*/
result_day = Count_month(Start_date.Month, End_date.Month, Start_date.Year, End_date.Year);
/* 调用函数,计算截止日期的月份与起始日期的月份的差的天数 */
result_day = Count_year(Start_date.Year, End_date.Year); /* 调用函数,计算相隔整数年份的天数 */
printf("\n从%d年%d月%d日到%d年%d月%d日共有%d天。\n\n", /* 输出结果 */
S.Year, S.Month, S.Day, E.Year, E.Month, E.Day, result_day);
return 0;
}
int Enter_date()
{
printf("\n程序将给出您输入的两个日期(年月日)之间的天数。\n"); /* 对程序功能的简单说明 */
printf("您输入的年份范围是公元元年至公元3000年。\n\n");
printf("请输入起始日期, \n Year:"); /* 输入起始日期 */
scanf("%d", &Start_date.Year);
while (Start_date.Year < 0 || Start_date.Year > 3000) /* 判断输入的年份是否正确 */
{
printf("Error: 年份输入错误!请重新输入。\n");
printf(" Year:");
scanf("%d", &Start_date.Year);
}
printf(" Month:");
scanf("%d", &Start_date.Month);
while (Start_date.Month < 1 || Start_date.Month > 12) /* 判断输入的月份是否正确 */
{
printf("Error: 月份输入错误!请重新输入。\n");
printf(" Month:");
scanf("%d", &Start_date.Month);
}
printf(" Day:");
scanf("%d", &Start_date.Day);
while (Start_date.Day < 1 || Start_date.Day > 31) /* 判断输入的日期是否正确 */
{
printf("Error: 日期输入错误!请重新输入。\n");
printf(" Day:");
scanf("%d", &Start_date.Day);
}
printf("请输入截止日期,\n Year:"); /* 输入截止日期 */
scanf("%d", &End_date.Year);
while (End_date.Year < Start_date.Year || End_date.Year > 3000) /* 判断输入的年份是否正确 */
{
printf("Error: 年份输入错误!请重新输入。\n");
printf(" Year:");
scanf("%d", &End_date.Year);
}
printf(" Month:");
scanf("%d", &End_date.Month);
while (End_date.Month < 1 || End_date.Month > 12) /* 判断输入的月份是否正确 */
{
printf("Error: 月份输入错误!请重新输入。\n");
printf(" Month:");
scanf("%d", &End_date.Month);
}
/* 当起止日期的年份相同时,判断截止日期的月份是否大于起始日期的月份*/
while (End_date.Year == Start_date.Year && End_date.Month < Start_date.Month)
{
printf("Error: 输入的月份错误!请重新输入。\n");
printf(" Month:");
scanf("%d", &End_date.Month);
}
printf(" Day:");
scanf("%d", &End_date.Day);
while (End_date.Day < 1 || End_date.Day > 31) /* 判断输入的日期是否正确 */
{
printf("Error: 日期输入错误!请重新输入。\n");
printf(" Day:");
scanf("%d", &End_date.Day);
}
/* 当起止日期的年份月份都相同时,判断截止日期的日是否大于起始日期*/
while (End_date.Year == Start_date.Year && End_date.Month == Start_date.Month && End_date.Day < Start_date.Day)
{
printf("Error: 输入的日期错误!请重新输入。\n");
printf(" Day:");
scanf("%d", &End_date.Day);
}
S.Year = Start_date.Year; /* 赋值给S和E中的各项 */
S.Month = Start_date.Month;
S.Day = Start_date.Day;
E.Year = End_date.Year;
E.Month = End_date.Month;
E.Day = End_date.Day;
return 0;
}
int Count_month(int S_Month, int E_Month, int S_Year, int E_Year)
{
while (E_Month - S_Month != 0) /* 计算截止日期的月份与起始日期的月份的差的天数*/
{
if (E_Month > S_Month) /* 当截止日期的月份大于起始日期的月份时,应从起始日期的月份算起 */
{
result_day += Judge_month(S_Month, S_Year); /* 调用判断月份的函数,确定当前月份的天数*/
++S_Month;
}
else /* 否则,应从截止日期的月份算起,减去不足的天数 */
{
result_day -= Judge_month(E_Month, E_Year);
++E_Month;
}
}
return result_day;
}
int Count_year(int S_Year, int E_Year)
{
while (E_Year - S_Year >= 1) /* 计算整数年份的天数 */
{
if (Is_leap_year(S_Year))
result_day += 366;
else
result_day += 365;
S_Year++;
}
return result_day;
}
int Is_leap_year(int year) /* 判断当前年份是否为闰年 */
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 1;
else
return 0;
}
int Judge_month(int month, int year) /* 判断某一年中的当前月份的天数 */
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: return 31; break;
case 2:
if (Is_leap_year(year))
return 29;
else
return 28; break;
default: return 30; break;
}
}