//预处理 #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; }
做日历主要是要确定好第一天是星期几,然后算间隔多少天,算出具体这一天是星期几,然后把我们想打印的打印出来,把每个月的第一天定位到该在的地方。