问题描述 :
已知2007年1月1日为星期一。设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。为完成此函数,设计必要的辅助函数也是必要的。
输入说明 :
两个整数,表示年和月,以空格分隔
输出说明 :
按照范例输出
注意各个位置的空格数目,特别是每一行的末尾是否有空格。
输入范例 :
2021 5
输出范例 :
Calendar 2021 - 05
---------------------
Su Mo Tu We Th Fr Sa
---------------------
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
---------------------
完整C++代码
模拟题
#include <bits/stdc++.h>
using namespace std;
int main() {
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int y, m, d = 1;
cin >> y >> m;
for (int i = 2007; i < y; i++) {
// 判断是否为闰年
if (i % 400 == 0 || (i % 4 == 0 && i % 100 != 0)) d += 366;
else d += 365;
}
if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) {
month[2] = 29;
} else {
month[2] = 28;
}
for (int i = 1; i < m; i++) {
d += month[i];
}
// 算出m月是星期d,因为题目是从星期日开始,所以加1
d = d % 7 + 1;
int len = d + month[m], day = 1;
int arr[len] = {0};
if (m < 10) {
string s = "0" + to_string(m);
cout << "Calendar " << y << " - " << s << endl;
} else {
cout << "Calendar " << y << " - " << m << endl;
}
cout << "---------------------" << endl;
cout << "Su Mo Tu We Th Fr Sa" << endl;
cout << "---------------------" << endl;
for (int i = 1; i < len; i++) {
if (i >= d) arr[i] = day++;
if (arr[i] == 0) {
printf(" ");
} else {
printf("%2d ", arr[i]);
}
// 这里是防止最后一个是星期六出现两次换行
if (i % 7 == 0 && i != len - 1) cout << endl;
}
cout << endl;
cout << "---------------------" << endl;
return 0;
}
😋欢迎大伙私信或者评论区交流讨论😋