c语言万年历源码
时间: 2025-05-03 18:46:26 浏览: 23
### C语言实现万年历的源码示例
以下是基于C语言编写的万年历程序的一个完整示例。该程序能够计算任意给定日期是星期几,并显示对应月份的日历。
#### 程序功能描述
此程序通过输入年份和月份来生成对应的日历表,利用蔡勒公式(Zeller's Congruence)或者类似的算法来判断某一天是星期几[^1]。
```c
#include <stdio.h>
// 函数声明
int isLeapYear(int year);
void printCalendar(int year, int month);
int main() {
int year, month;
printf("请输入年份: ");
scanf("%d", &year);
printf("请输入月份 (1-12): ");
scanf("%d", &month);
if (month >= 1 && month <= 12) {
printCalendar(year, month);
} else {
printf("错误:月份应在1到12之间。\n");
}
return 0;
}
// 判断是否为闰年
int isLeapYear(int year) {
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 1; // 是闰年
}
return 0; // 不是闰年
}
// 打印指定年月的日历
void printCalendar(int year, int month) {
const char *months[] = {"", "January", "February", "March", "April",
"May", "June", "July", "August", "September",
"October", "November", "December"};
int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31};
if (isLeapYear(year) && month == 2) {
daysInMonth[2] = 29;
}
// 蔡勒公式的调整部分
int dayOfWeek = (year + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 +
(13 * month + 3) / 5 + 1) % 7;
if (month < 3) {
year -= 1;
}
// 输出头部信息
printf("\n%s %d\n", months[month], year);
printf("-----------------------------\n");
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
// 计算当月第一天是星期几
int totalDays = 0;
for (int i = 1; i < month; ++i) {
totalDays += daysInMonth[i];
}
totalDays += (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
int startDay = (totalDays + 1) % 7;
// 打印日历主体
int spaceCount = startDay;
while (spaceCount-- > 0) {
printf(" "); // 占位符
}
for (int i = 1; i <= daysInMonth[month]; ++i) {
printf("%4d", i); // 显示日期
if (++startDay % 7 == 0) {
printf("\n"); // 换行
}
}
printf("\n");
}
```
#### 关键点解析
上述代码实现了以下几个核心功能:
1. **闰年的判定**:通过`isLeapYear()`函数完成,用于确定二月是否有29天。
2. **蔡勒公式应用**:用于计算某一年某一月的第一天是星期几。
3. **动态打印日历**:根据每个月的实际天数以及起始位置,逐行列出完整的日历表格。
#### 使用说明
运行程序后,按照提示分别输入目标年份和月份即可查看相应日历。如果输入非法值,则会收到相应的错误提醒并退出操作。
---
###
阅读全文
相关推荐






