c语言打印年历,要求每行打印三个月份,并且使用蔡斯勒公式打印这份年历表
3条回答 默认 最新
关注引自免费微信小程序:皆我百晓生
为了实现这个功能,你需要编写一个C语言程序,使用蔡斯勒公式(Zeller's congruence)来计算给定日期是星期几。蔡斯勒公式适用于格里高利历(公历),可以用来确定任何日期是一周中的哪一天。
以下是完整的C语言代码示例,用于打印出指定年份的月历,每个月份占一行:
#include <stdio.h> #include <stdlib.h> // 蔡斯勒公式,返回1-7,分别代表周一到周日 int dayOfWeek(int year, int month, int day) { if (month < 3) { month += 12; year--; } int q = day; int m = month; int K = year % 100; int J = year / 100; int h = (q + ((13 * (m + 1)) / 5) + K + (K / 4) + (J / 4) - (2 * J)) % 7; // 将结果调整为0-6,以便与0表示周日,1表示周一匹配 return (h + 6) % 7; } void printCalendar(int year) { const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; const int daysInMonths[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int i = 0; i < 12; i += 3) { printf("%s\t%s\t%s\n", months[i], months[i + 1], months[i + 2]); for (int j = 0; j < 9; ++j) { for (int k = 0; k < 3; ++k) { int currentMonth = i + k; int currentDay = (j * 7) + 1; // 检查是否在当前月份内 if (currentDay > daysInMonths[currentMonth]) { break; } int dow = dayOfWeek(year, currentMonth + 1, currentDay); printf("%d ", currentDay); // 打印星期几,如果是第一天,则添加星期信息 if (j == 0 && k == 0) { switch (dow) { case 0: printf("Sun "); break; case 1: printf("Mon "); break; case 2: printf("Tue "); break; case 3: printf("Wed "); break; case 4: printf("Thu "); break; case 5: printf("Fri "); break; case 6: printf("Sat "); break; } } } printf("\n"); } printf("\n"); } } int main() { int year; printf("Enter the year: "); scanf("%d", &year); printCalendar(year); return 0; }这段代码首先定义了一个
dayOfWeek函数,用于计算给定日期是一周中的哪一天。然后,printCalendar函数负责打印整个年历,每行打印三个月份。在主函数中,用户被提示输入年份,然后调用printCalendar函数进行输出。运行此程序并输入年份,它将打印出相应年份的月历。注意,这里没有处理闰年的特殊情况,闰年的二月有29天,但上述代码默认每年二月都有28天。要处理闰年,可以在计算总天数时加入条件判断:若年份能被4整除且不能被100整除,或者能被400整除,则二月有29天。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录