东华OJ 进阶题36 日历

问题描述 :

已知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;
}

😋欢迎大伙私信或者评论区交流讨论😋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值