/****************************/
/* 特定月のカレンダー表示 */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
using namespace std;
/*
クラスDateの定義
*/
class Date {
int year; // 年
int month; // 月
int day; // 日
int tu; // 西暦1年1月1日からの通算日
public:
// コンストラクタ
Date() {}
// コンストラクタ(年月日入力)
Date(int n, int m, int l)
{
int i1;
year = n;
month = m;
day = l;
tu = day;
for (i1 = 1; i1 < year; i1++) {
if ((i1%4 == 0 && i1%100 != 0) || i1%400 == 0)
tu += 366;
else
tu += 365;
}
for (i1 = 1; i1 < month; i1++) {
if (i1 == 2) {
if ((year%4 == 0 && year%100 != 0) || year%400 == 0)
tu += 29;
else
tu += 28;
}
else {
if (i1 == 4 || i1 == 6 || i1 == 9 || i1 == 11)
tu += 30;
else
tu += 31;
}
}
}
// コンストラクタ(通算日入力)
Date(int n)
{
int k = 0, sw = 0;
tu = 0;
year = 1;
month = 1;
while (sw == 0) {
if ((year%4 == 0 && year%100 != 0) || year%400 == 0)
k += 366;
else
k += 365;
if (k < n) {
tu = k;
year++;
}
else
sw = 1;
}
while (sw > 0) {
if (month == 2) {
if ((year%4 == 0 && year%100 != 0) || year%400 == 0)
k = 29;
else
k = 28;
}
else {
if (month == 4 || month == 6 || month == 9 || month == 11)
k = 30;
else
k = 31;
}
if (tu+k < n) {
tu += k;
month++;
}
else {
sw = 0;
day = n - tu;
tu += day;
}
}
}
// -のオーバーロード
int operator - (const Date &b)
{
return tu - b.tu;
}
};
/*
main
*/
int main()
{
int year, month, day = 1, m = 1, n, k, i1;
// 西暦元年1月1日からの通算日
cout << "年,月は? ";
cin >> year >> month;
Date a(year, month, day);
Date b(1, 1, 1);
n = a - b;
// 1日の曜日の決定
n = n % 7 + 1;
if (n == 7)
n = 0;
// 出力
cout.width(4);
cout << " " << year << "年";
cout.width(2);
cout << month << "月\n";
cout << " 日 月 火 水 木 金 土\n";
if (month == 2) {
if ((year%4 == 0 && year%100 != 0) || year%400 == 0)
k = 29;
else
k = 28;
}
else {
if (month == 4 || month == 6 || month == 9 || month == 11)
k = 30;
else
k = 31;
}
for (i1 = 0; i1 < 7; i1++) {
if (i1 >= n) {
cout.width(3);
cout << m;
m++;
}
else
cout << " ";
}
cout << endl;
while (m <= k) {
for (i1 = 0; i1 < 7 && m <= k; i1++) {
cout.width(3);
cout << m;
m++;
}
cout << endl;
}
return 0;
}