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
相关产品推荐
相关产品推荐

