You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++日历打印程序集成2D数组的实现问题咨询

C++日历程序2D数组改造方案

核心结论

可以直接将二维数组中的月份编号赋值给现有代码的monthNumber变量沿用原有逻辑,仅需匹配二维数组的索引规则即可。

二维数组访问原理

你定义的int yearly[12][2]是12行2列的int型二维数组,访问规则如下:

  • 第一维为行索引,取值范围0~11,和你现有代码中monthNumber的取值范围(0对应1月,11对应12月)完全匹配
  • 第二维为列索引,取值范围0~1:
    • yearly[行索引][0]:获取对应公历月份的编号(1~12)
    • yearly[行索引][1]:获取对应月份的平年天数
      注意:该二维数组为int类型,无法存储字符串格式的月份名称,因此月份名称的一维数组可以单独保留,无需合并。

改造后完整代码

#include <iomanip>
#include <string>
#include <iostream>

using namespace std;

// 全局静态二维数组,存储月份编号和平年天数
static int yearly[12][2] = 
{{1,31},{2,28},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}}; 

int dayNumber(int day, int month, int year)
{
    static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1,
                       4, 6, 2, 4 };
    year -= month < 3;
    return (year + year / 4 - year / 100 +
        year / 400 + t[month - 1] + day) % 7;
}

string getMonthName(int monthNumber)
{
    string months[] = { "January", "February", "March",
                       "April", "May", "June",
                       "July", "August", "September",
                       "October", "November", "December"};
    return (months[monthNumber]);
}

// 改造后的每月天数获取函数,直接从二维数组取值,新增闰年判断
int numberOfDays(int monthNumber, int year)
{
    int days = yearly[monthNumber][1];
    // 闰年2月特殊处理
    if (monthNumber == 1) {
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            days = 29;
        }
    }
    return days;
}

void printCalendar(int year)
{
    // 修复原代码年份硬编码问题
    printf ("         Calendar - %d\n", year);
    int days;
    int current = dayNumber(1, 1, year);

    for (int i = 0; i < 12; i++)
    {
        days = numberOfDays(i, year);
        printf("\n  ------------%s-------------\n",
               getMonthName(i).c_str());
        printf("  Sun  Mon  Tue  Wed  Thu  Fri  Sat\n");
        int k;
        for (k = 0; k < current; k++)
            printf("     ");
        for (int j = 1; j <= days; j++)
        {
            printf("%5d", j);
            if (++k > 6)
            {
                k = 0;
                printf("\n");
            }
        }
        if (k)
            printf("\n");
        current = k;
    }
    return;
}

int main()
{
    int year = 2021;
    printCalendar(year);
    return 0;
}

改造说明

  • 原有代码中monthNumber从0到11的循环逻辑完全保留,仅替换了numberOfDays的实现,符合你沿用原有逻辑的需求
  • 补充了原代码缺失的闰年2月处理逻辑,输入闰年时2月会自动显示29天
  • 修复了原代码中日历标题年份硬编码为2021的问题

内容的提问来源于stack exchange,提问作者Elijah Asuncion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:45:09