#include <iostream>
#include <string>
using namespace std;
// input yyyy mm, output calendar:
// September 2020
// ---------------------------
// Mon Tue Wed Thu Fri Sat Sun
// 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
string get_monthName(int m)
{
switch(m)
{
case 1:
return "Jan";
break;
case 2:
return "Feb";
break;
case 3:
return "Mar";
break;
case 4:
return "Apr";
break;
case 5:
return "May";
break;
case 6:
return "Jun";
break;
case 7:
return "Jul";
break;
case 8:
return "Aug";
break;
case 9:
return "Sep";
break;
case 10:
return "Oct";
break;
case 11:
return "Nov";
break;
case 12:
return "Dec";
}
}
void print_calendar(int year, int month);
void print_title(int year, int month);
void print_body(int year, int month);
int main()
{
while(1)
{
// Prompt user to enter year and month
cout << "Please enter yyyy[1800,2200] mm(e.g., 2020 9): ";
int year, month;
input:
cin >> year >> month;
if (year < 1800 || year > 2200 || month < 1 || month > 12)
{
cout << "Please enter the right year & month: ";
goto input;
}
//print calendar of the month
print_calendar(year, month);
char zz[20];
cout << "quit?y/n: ";
cin >> zz;
if (!strcmp(zz, "y"))
exit(0);
}
return 0;
}
// 打印日历,包括标题和日历体
void print_calendar(int year, int month)
{
print_title(year, month);
print_body(year, month);
}
// 打印标题
void print_title(int year, int month)
{
cout << get_monthName(month) << " " << year << endl;
cout << "-----------------------------" << endl;
//cout << " Mon Tue Wed Thu Fri Sat Sun " << endl;
cout << "Mon\tTue\tWed\tThu\tFri\tSat\tSun\t" << endl;
}
// 判断闰年
int isLeapYear(int year)
{
return ( year % 400 == 0 || (year % 4 == 0 && year % 100 != 0) );
}
// 获取某年某月的天数
int get_monthNumberOfDays(int year, int month)
{
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
break;
case 4:
case 6:
case 9:
case 11:
return 30;
break;
case 2:
return isLeapYear(year) ? 29 : 28;
}
}
// 获取 1800年1月1日(周三) 至 该月1日 的天数
int get_totalNumberOfDays(int year, int month)
{
int sum = 0;
for (int y = 1800; y <= year; y++)
{
if (y != year)
{
for (int m = 1; m <= 12; m++)
sum += get_monthNumberOfDays(y, m);
}
else
{
for (int m = 1; m < month; m++)
{
sum += get_monthNumberOfDays(y, m);
}
}
}
return sum;
}
// 判断 该月1日 是周几
int get_firstDayOfMonth(int days)
{
return (days % 7 + 3) % 7;
}
// 打印日历体
void print_body(int year, int month)
{
//int n=get_totalNumberOfDays(2020, 9);
//cout << n << endl;
//cout << get_firstDayOfMonth(100);
int firstDay = get_firstDayOfMonth(get_totalNumberOfDays(year, month));
int numberOfDays = get_monthNumberOfDays(year, month);
for (int i = 1; i < firstDay; i++)
{
cout << "\t";
}
int cols_printed = firstDay - 1;
for (int d = 1; d <=numberOfDays; d++)
{
cout << d << "\t";
cols_printed += 1;
if (cols_printed % 7 == 0)
cout << "\n";
}
cout << endl;
}