2401_83754279 2024-05-22 12:20 采纳率: 89.7%
浏览 5
已结题

c语言打印年历表,要求每行打印三个月份

c语言打印年历,要求每行打印三个月份,并且使用蔡斯勒公式打印这份年历表

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-22 12:20
    关注

    引自免费微信小程序:皆我百晓生

    为了实现这个功能,你需要编写一个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天。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月30日
  • 已采纳回答 5月22日
  • 创建了问题 5月22日