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");
}