日期计算
计算指定日期是周几
#include <stdio.h>
#include <stdlib.h>
int Day(int y, int m, int d);
int main(int argc, char *argv[])
{
int year, month, day; //读取用户输入的年月日
int days; //储存从1900-1-1到该天的天数
int week = 0; //储存求余后的星期
//字符串组合输出星期
char b[] = {"星期"};
char c[7][4] = {"日", "一", "二", "三", "四", "五", "六"};
loop:
printf("请输入年 月 日:(空格分隔)\n");
scanf("%d%d%d", &year, &month, &day);
days = Day(year, month, day);
//增强程序的健壮性
if (days == -1)
{
printf("输入格式有误,");
fflush(stdin); //防止用户输入字母等其他非数字字符
goto loop;
}
else
{
week = days % 7; //用求余计算星期几
printf("%d年%d月%d日是%s%s\n", year, month, day, b, c[week]);
}
system("pause");
return 0;
}
//函数功能:输入年月日,输出1900-1-1到该天的天数,-1位输入不合法
int Day(int y, int m, int d)
{
int i;
int r = 0; //储存1900到该天的闰年个数
int a[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30}; //m给出每月的天数
if (y >= 1900 && m > 0 && m < 13 && d > 0 && d < 32)
{
for (i = 1900; i <= y; i++) //计算闰年的个数
{
if (i % 400 == 0 || i % 100 != 0 && i % 4 == 0)
r++;
}
for (i = 0; i < m - 1; i++) //统计当年1月1日到当月的天数
{
d += a[i];
}
if ((y % 400 == 0 || y % 100 != 0 && y % 4 == 0) && m < 3) //如果当年是闰年但不到二月就不能算进去
r--;
return 365 * (y - 1900) + r + d;
}
else
return -1;
}
参考百度知道
输出日历数组
#include <stdio.h>
#define IS_LEAP_YEAR(y) ((((y) % 4 == 0) && ((y) % 100 != 0)) || ((y) % 400 == 0))
//if( ((0 == year%4)&&(0 != year%100)) ||(0 == year %400) )
//2018
int Leap_year[] = {
31, 29, 31,
30, 31, 30,
31, 31, 30,
31, 30, 31};
int No_Leap_year[] = {
31, 28, 31,
30, 31, 30,
31, 31, 30,
31, 30, 31};
int PrintfDate(int year, int i16DayOffset, FILE* fp)
{
//int i16DayOffset = 0;
int i16Month = 0;
int i16Week = 0;
int i16DayCnt = 0;
int i16DisplayDay = 0;
int i16RunOneTime = 1;
int i16NA = 0;
if (year == 2018)
{
i16DayOffset = 1;
}
i16DayCnt = i16DayOffset;
//月 周 日历
fprintf(fp, "Date%d[53][9]={\n", year);
if (IS_LEAP_YEAR(year))
{
//printf("Leap_year\n");
for (i16Month = 0; i16Month <= 11; i16Month++)
{
for (i16DisplayDay = 1; i16DisplayDay <= No_Leap_year[i16Month]; i16DisplayDay++)
{
if ((i16RunOneTime) && (0 != i16DayOffset))
{
i16Week = 1;
fprintf(fp, "%4d,", i16Month + 1);
fprintf(fp, "%4d,", i16Week);
i16RunOneTime = 0;
}
while (i16DayOffset)
{
//printf(" ");
fprintf(fp, "%4d,", i16NA);
//printf("%4s,",' ');
i16DayOffset = i16DayOffset - 1;
}
if (i16DayCnt % 7 == 0)
{
i16Week++;
fprintf(fp, "\n");
fprintf(fp, "%4d,", i16Month + 1);
fprintf(fp, "%4d,", i16Week);
}
else
{
}
//printf("%4d",i16DayCnt);
fprintf(fp, "%4d,", i16DisplayDay);
i16DayCnt++;
}
}
}
else
{
//printf("No_Leap_year\n");
for (i16Month = 0; i16Month <= 11; i16Month++)
{
for (i16DisplayDay = 1; i16DisplayDay <= No_Leap_year[i16Month]; i16DisplayDay++)
{
if ((i16RunOneTime) && (0 != i16DayOffset))
{
i16Week = 1;
fprintf(fp, "%4d,", i16Month + 1);
fprintf(fp, "%4d,", i16Week);
i16RunOneTime = 0;
}
while (i16DayOffset)
{
//printf(" ");
//printf("%4s,",' ');
fprintf(fp, "%4d,", i16NA);
i16DayOffset = i16DayOffset - 1;
}
if (i16DayCnt % 7 == 0)
{
i16Week++;
fprintf(fp, "\n");
fprintf(fp, "%4d,", i16Month + 1);
fprintf(fp, "%4d,", i16Week);
}
else
{
}
//printf("%4d",i16DayCnt);
fprintf(fp, "%4d,", i16DisplayDay);
i16DayCnt++;
}
}
}
fprintf(fp, "\n");
fprintf(fp, "};\n");
i16DayOffset = i16DayCnt % 7;
//printf("\n");
//printf("DayOffset %4d",i16DayOffset);
//printf("\n");
return i16DayOffset;
}
int main()
{
FILE *fp = NULL;
fp = fopen("./date.c", "wb");
if (NULL == fp)
{
printf("Failed to create 'data.c'\n");
return -1;
}
int i16DayOffset = 0;
i16DayOffset = PrintfDate(2018, 1, fp); //init Offset
for (int year = 2019; year < 2050; year++)
{
i16DayOffset = PrintfDate(year, i16DayOffset, fp);
}
fclose(fp);
fp = NULL;
return 0;
}