//预处理
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//构造一个二维数组,存放闰平年的月的天数。
int days_in_month[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31}
,{0,31,29,31,30,31,30,31,31,30,31,30,31} };
//13是为了第month列刚好对应第几列(数组行和列从0数起)
//判断年份是否为闰年,闰年返回1(真,二维数组第0行),平年返回0(假,二维数组第1行)
int judge_run(int year)
{
return ( year % 400 == 0 ) || (year % 100 != 0 && year % 4 == 0);
}
//判断某一天是星期几。(星期日返回7)
int judge_weekday(int year, int month, int day)
{
int year1 = 1; //公元1月1号是星期一。
int jiange_year = year - year1, jiange_days = 0;
int i;
for (i = 0; i < jiange_year; i++)
{
if (judge_run(i + year1))
jiange_days += 366;
else
jiange_days += 365;
}
for (i = 1; i < month; i++)
{
jiange_days += days_in_month[judge_run(year)][i];
}
jiange_days += day - 1;//例如第一个月的第二天与第一天隔着一天
return year1 + jiange_days % 7;
}
//打印日历
void show(int year, int month)
{
printf(" | 一 | 二 | 三 | 四 | 五 | 六 | 日 | \n");
printf("----------------------------------------------\n");
int n = judge_weekday(year, month, 1);
int i;
//定位到星期几开始打印日期。
for (i = 1; i < n; i++)
{
printf(" ");
}
printf(" ");
//在二维数组中拿到这个月有多少天然后打印
for (i = 1; i <= days_in_month[judge_run(year)][month]; i++)
{
printf("%2d ", i);
if (judge_weekday(year, month, i) == 7)//到了星期日打印完后换行
printf("\n\n ");
}
printf("\n----------------------------------------------\n");
}
int main()
{
int year = 0, month = 0;
printf("请输入你要查询的年月份:>");
scanf("%d%d",&year,&month);
show(year, month);
return 0;
}
做日历主要是要确定好第一天是星期几,然后算间隔多少天,算出具体这一天是星期几,然后把我们想打印的打印出来,把每个月的第一天定位到该在的地方。