C++小练手: 日历
#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; }