1、函数声明
声明4
个函数,分别为isLeapYear
函判断输入的年份是否为闰年,getDaysInMonth
函数根据月份和是否闰年返回该月的天数,getFirstDayOfMonth
函数使用蔡勒公式计算某月的第一天是星期几。printCalendar
函数输出该年该月的日历。代码如下,
#include <stdio.h> // 函数声明 int isLeapYear(int year); int getDaysInMonth(int month, int year); int getFirstDayOfMonth(int month, int year); void printCalendar(int month, int year);
2、判断输入的年份是否为闰年
根据闰年的定义,年份需要满足,能被4
整除但不能被100
整除。
或能被400
整除任一条件。
#include <stdio.h> // 函数声明 int isLeapYear(int year); int main() { int year, month; printf("%d",isLeapYear(2024)); return 0; } // 判断是否是闰年 int isLeapYear(int year) { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { return 1; } else { return 0; } }
3、计算月的天数
根据月份和是否闰年返回该月的天数。
#include <stdio.h> // 函数声明 int isLeapYear(int year); int main() { int year, month; printf("%d",getDaysInMonth(9,2024)); return 0; } // 判断是否是闰年 int isLeapYear(int year) { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { return 1; } else { return 0; } } // 获取某个月的天数 int getDaysInMonth(int month, int year) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if (isLeapYear(year)) { return 29; } else { return 28; } } return 0; }
4、计算某月的第一天是星期几
使用蔡勒公式计算某月的第一天是星期几。
#include <stdio.h> // 函数声明 int getFirstDayOfMonth(int month, int year); int main() { int year, month; printf("%d",getFirstDayOfMonth(8,2024)); return 0; } // 获取某月第一天是星期几 int getFirstDayOfMonth(int month, int year) { int day = 1, y, m; // 使用蔡勒公式(Zeller's Congruence)计算星期几 if (month == 1 || month == 2) { month += 12; year--; } y = year % 100; m = year / 100; int firstDay = (day + 2*month + (3*(month+1))/5 + y + y/4 + m/4 - 2*m) % 7; // 调整为从周日(0)开始 if (firstDay < 0) { firstDay += 7; } return firstDay; }
5、输出日历
输出该年该月的日历。日历的第一行是星期的缩写,周日作为一周的第一天。根据该月的天数和第一天的星期数,输出每一天。
#include <stdio.h> // 函数声明 int isLeapYear(int year); int getDaysInMonth(int month, int year); int getFirstDayOfMonth(int month, int year); void printCalendar(int month, int year); int main() { int year, month; // 用户输入年份和月份 printf("请输入年份: "); scanf("%d", &year); printf("请输入月份 (1-12): "); scanf("%d", &month); // 打印该月份的日历 printCalendar(month, year); return 0; } // 判断是否是闰年 int isLeapYear(int year) { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { return 1; } else { return 0; } } // 获取某个月的天数 int getDaysInMonth(int month, int year) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if (isLeapYear(year)) { return 29; } else { return 28; } } return 0; } // 获取某月第一天是星期几 int getFirstDayOfMonth(int month, int year) { int day = 1, y, m; // 使用蔡勒公式(Zeller's Congruence)计算星期几 if (month == 1 || month == 2) { month += 12; year--; } y = year % 100; m = year / 100; int firstDay = (day + 2*month + (3*(month+1))/5 + y + y/4 + m/4 - 2*m) % 7; // 调整为从周日(0)开始 if (firstDay < 0) { firstDay += 7; } return firstDay; } // 打印日历 void printCalendar(int month, int year) { int days = getDaysInMonth(month, year); int firstDay = getFirstDayOfMonth(month, year); printf("\n %d 年 %d 月\n", year, month); printf("日 一 二 三 四 五 六\n"); // 输出空白的日期前置 for (int i = 0; i < firstDay; i++) { printf(" "); } // 输出每一天 for (int day = 1; day <= days; day++) { printf("%2d ", day); // 换行: 一周七天 if ((day + firstDay) % 7 == 0) { printf("\n"); } } printf("\n"); }