推理今天是星期几的C语言程序
以下是一个用C语言编写的程序,可以根据给定的日期(年、月、日)计算出该日期是星期几,程序使用了Zeller公式来实现这个功能。

(图片来源网络,侵删)
#include <stdio.h>
#include <stdbool.h>
// 判断是否为闰年
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 获取某个月的天数
int getDaysInMonth(int year, int month) {
if (month == 2) {
return isLeapYear(year) ? 29 : 28;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} else {
return 31;
}
}
// 计算星期几 (0=星期日, 1=星期一, ..., 6=星期六)
int calculateDayOfWeek(int year, int month, int day) {
// Zeller公式调整:1月和2月视为前一年的13月和14月
if (month < 3) {
month += 12;
year--;
}
int century = year / 100;
int yearOfCentury = year % 100;
int h = (day + (13 * (month + 1)) / 5 + yearOfCentury + yearOfCentury / 4 + century / 4 + 5 * century) % 7;
// 调整结果使0=星期日, 1=星期一, ..., 6=星期六
return (h + 5) % 7;
}
// 将星期几转换为字符串
const char* getDayName(int dayOfWeek) {
switch (dayOfWeek) {
case 0: return "星期日";
case 1: return "星期一";
case 2: return "星期二";
case 3: return "星期三";
case 4: return "星期四";
case 5: return "星期五";
case 6: return "星期六";
default: return "未知";
}
}
int main() {
int year, month, day;
printf("请输入日期(年 月 日): ");
scanf("%d %d %d", &year, &month, &day);
// 验证输入的日期是否有效
if (year < 1 || month < 1 || month > 12 || day < 1 || day > getDaysInMonth(year, month)) {
printf("无效的日期!\n");
return 1;
}
int dayOfWeek = calculateDayOfWeek(year, month, day);
printf("%d年%d月%d日是%s\n", year, month, day, getDayName(dayOfWeek));
return 0;
}
程序说明
- isLeapYear函数:判断给定年份是否为闰年
- getDaysInMonth函数:返回指定年份和月份的天数
- calculateDayOfWeek函数:使用Zeller公式计算星期几
- 调整1月和2月为前一年的13月和14月
- 应用Zeller公式计算
- 调整结果使0对应星期日
- getDayName函数:将数字星期几转换为中文星期名称
- 主函数:
- 获取用户输入的日期
- 验证日期有效性
- 计算并输出星期几
使用示例
请输入日期(年 月 日): 2025 10 15
2025年10月15日是星期日
请输入日期(年 月 日): 2025 2 29
2025年2月29日是星期四
注意:这个程序假设输入的日期是有效的,如果输入无效日期(如2月30日),程序会提示错误。

(图片来源网络,侵删)
