#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
struct date //建立日期结构体
{
int year;
int month;
int day;
};
int m[2][12] = { {31,29,31,30,31,30,31,31,30,31,30,31}, //月份天数数组 第一行为闰年,第二行为平年
{ 31,28,31,30,31,30,31,31,30,31,30,31 } };
int leap(int y) //判断是否为闰年
{
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
return 1;
else
return 0;
}
int datetodays(struct date d) //求一个日期到1970.01.01的天数
{
int sum = 0;
int i;
for ( i = 1970;i < d.year;i++)
{
sum = leap(i) + sum + 365;
}
if (leap(d.year))
{
for (int j = 1;j < d.month;j++)
{
sum = sum + m[0][j - 1];
}
}
else
{
for (int j = 1;j < d.month;j++)
{
sum = sum + m[1][j - 1];
}
}
sum = sum + d.day - 1;
return sum;
}
struct date daystodate(int days) //求1970.01.01加一定天数后的日期
{
int year = 1970, month = 1, day = 1;
int j;
struct date d2;
for ( j = 1970;days >= 365 + leap(j);j++)
{
days = days - 365 - leap(j);
year++;
}
if (leap(j))
{
for (int k = 0;days >= m[0][k]; k++)
{
days = days - m[0][k];
month++;
}
}
else
{
for (int k = 0;days >= m[1][k]; k++)
{
days = days - m[1][k];
month++;
}
}
day += days;
d2.year = year;d2.month = month;d2.day = day;
return d2;
}
void outputdate(struct date a) //输出日期
{
printf("year=%d month=%d day=%d", a.year, a.month, a.day);
}
int isvalidity(struct date b) //判断日期的合理性
{
if (b.year >= 1970)
{
if (leap(b.year))
{
if (b.month <= 12 && b.month >= 1)
{
if (b.day <= m[0][b.month - 1] && b.day >= 1)
return 1;
else
return 0;
}
else return 0;
}
else
{
if (b.month <= 12 && b.month >= 1)
{
if (b.day <= m[1][b.month - 1]&&b.day>=1)
return 1;
else
return 0;
}
else return 0;
}
}
else
return 0;
}
int dateinterval(struct date a, struct date b) //计算两个日期间的天数
{
return abs(datetodays(a) - datetodays(b));
}
struct date dateadddays(struct date a, int days) //求日期加上天数后的日期
{
return daystodate(datetodays(a) + days);
}
struct date datesubdays(struct date b, int days) //求日期减去天数后的日期(最低为1970.01.01)
{
return daystodate(datetodays(b) - days);
}
int whatday(struct date c) //求某个日期是星期几
{
return (datetodays(c)+3)%7+1; //1970.01.01是星期四
}
int main() //test
{
printf(" ******************日期的综合计算器******************\n");
printf("选择你要使用的功能:\n");
printf("1.计算两个日期之间的天数\n2.求一个日期加一定天数后的日期\n3.求一个日期减一定天数后的日期\n");
printf("4.求某个日期是星期几\n");
printf("请输入选择功能的序号:\n");
int num = 0;int days = 0;
struct date d1 = { 0,0,0 }, d2 = { 0,0,0 };
scanf("%d", &num);
switch (num)
{
case 1:
printf("请输入第一个日期的年 月 日:");
scanf("%d %d %d", &d1.year,&d1.month,&d1.day);
if (isvalidity(d1) == 0)
printf("日期错误,请重试");
exit(0);
printf("请输入第二个日期的年 月 日:");
scanf("%d %d %d", &d2.year,&d2.month,&d2.day);
if (isvalidity(d2) == 0)
printf("日期错误,请重试");
exit(0);
printf("两个日期间的天数为:%d", dateinterval(d1, d2));
break;
case 2:
printf("输入日期和要加的天数:");
printf("请输入日期的年 月 日:");
scanf("%d %d %d", &d1.year, &d1.month, &d1.day);
if (isvalidity(d1) == 0)
printf("日期错误,请重试");
exit(0);
printf("请输入天数:");
scanf("%d", &days);
struct date d2 = dateadddays(d1, days);
printf("日期为:%d年%d月%d日", d2.year, d2.month, d2.day);
break;
case 3:
printf("输入日期和要减的天数:");
printf("注意:得出的日期最低为1970.01.01");
printf("请输入日期的年 月 日:");
scanf("%d %d %d", &d1.year, &d1.month, &d1.day);
if (isvalidity(d1) == 0)
printf("日期错误,请重试");
exit(0);
printf("请输入天数:");
scanf("%d", &days);
d2 = datesubdays(d1, days);
printf("日期为:%d年%d月%d日", d2.year, d2.month, d2.day);
break;
case 4:
printf("输入需要求星期几的日期:");
scanf("%d %d %d",&d1.year,&d1.month,&d1.day);
int x = whatday(d1);
printf("这天是星期%d", x);
break;
}
system("pause");
return 0;
} // liuyh 2021.10.11
根据课本中的课后尝试编写的进行日期综合计算的程序代码。
这也算我作为新人入门写的第一个完整项目代码,耗时六个多小时,做完觉得还挺有实用性,很有成就感。