C语言实现月历输出:计算并输出指定年份月份的月历

本篇文章提供了一个C语言函数Calendar,用于计算并输出指定年份月份的月历。函数接收两个参数yearmonth分别代表年份和月份,并根据输入输出符合格式要求的月历。

需求

右侧编辑器中有一个函数Calendar,它有两个参数yearmonth,分别代表年份和月份。其中1900 <= year <= 99991 <= month <= 12

请在这个函数中补充代码,计算并输出当月的月历,格式要求如下:

  1. 要求输出有7列,从左至右分别是从星期一到星期日。
  2. 同一列的数字对齐右边。
  3. 每一个位置上的数字占2个字符,不够长的用空格补充。
  4. 如果第一行的头几个位置上没有数字,则用两个空格代替。
  5. 最后一行不用补全缺少数字的位置。
  6. 不同列之间有一个空格,最后一列后面没有空格。
  7. 允许自由增加函数,只要Calendar函数的功能正确即可。

思路

  1. 计算当月1号是星期几;
  2. 计算当月的天数;
  3. 根据以上两个数据,输出当月的月历。

代码实现

#include <stdio.h>

int is_leap_year(int year) {  // 判断闰年
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
        return 1;
    } else {
        return 0;
    }
}

int get_days_of_month(int year, int month) {  // 计算当月天数
    int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month == 2 && is_leap_year(year)) {  // 闰年2月29天
        return 29;
    } else {
        return days[month];
    }
}

void Calendar(int year, int month) {
    int week_day_of_first_day = 1;  // 1900年1月1日是星期一
    for (int i = 1900; i < year; i++) {  // 计算1900年到(year-1)年有多少天
        week_day_of_first_day += is_leap_year(i) ? 366 : 365;
    }
    for (int i = 1; i < month; i++) {  // 计算(year,1,1)到(year,month-1,31)有多少天
        week_day_of_first_day += get_days_of_month(year, i);
    }
    week_day_of_first_day %= 7;  // 计算(year,month,1)是星期几

    int days_of_month = get_days_of_month(year, month);

    printf(" Mo Tu We Th Fr Sa Su\n");  // 输出月历头部
    for (int i = 0; i < week_day_of_first_day; i++) {  // 输出第一行前面的空格
        printf("   ");
    }
    for (int i = 1; i <= days_of_month; i++) {  // 输出日期
        printf("%2d", i);
        if ((week_day_of_first_day + i - 1) % 7 == 6) {  // 判断是否到了星期日
            printf("\n");  // 换行
        } else {
            printf(" ");  // 输出空格
        }
    }
    if ((week_day_of_first_day + days_of_month - 1) % 7 != 6) {  // 判断最后一天是否是星期日
        printf("\n");  // 换行
    }
}

int main() {
    int year, month;
    scanf("%d%d", &year, &month);
    Calendar(year, month);
    return 0;
}

代码解析

  1. is_leap_year(int year) 函数用于判断年份是否为闰年。
  2. get_days_of_month(int year, int month) 函数用于计算指定年份和月份的天数。
  3. Calendar(int year, int month) 函数实现月历输出,具体步骤如下:
    • 计算当月1号是星期几:通过循环计算1900年1月1日到指定日期的天数,然后对7取余得到星期几。
    • 计算当月的天数:调用get_days_of_month函数获取。
    • 输出月历:根据计算结果输出月历头部,并根据星期几输出日期,最后输出换行符。

总结

本文提供了一个C语言函数Calendar,用于计算并输出指定年份月份的月历,并详细解释了代码的实现过程。希望本文能帮助你更好地理解C语言编程和算法。


原文地址: https://www.cveoy.top/t/topic/m3IZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录