首页 > 代码库 > 万年历制作

万年历制作

#include<iostream>
#include<iomanip>

using namespace std;

void printMonth(int year, int month);
void printMonthTitle(int year, int month);
void printMonthName(int month);
void printMonthBody(int year, int month);
int getStartDay(int year, int month);
int getTotalNumberOfDays(int year, int month);
int getNumberOfDaysInMonth(int year, int month);
bool isLeapYear(int year);

int main() {
  cout << "Enter full year (e.g., 2001) : ";
  int year;
  cin >> year;

  cout << "Enter month in number between 1 and 12 : ";
  int month;
  cin >> month;

  printMonth(year, month);

  return 0;
}

void printMonth(int year, int month) {
  printMonthTitle(year, month);
  printMonthBody(year, month);
}

void printMonthTitle(int year, int month) {
  printMonthName(month);
  cout << " " << year << endl;
  cout << "----------------------------" << endl;
  cout << " Sun Mon Tus Wed Thu Fri Sat" << endl;
}

void printMonthName(int month) {
  switch(month) {
    case 1: cout << setw(16) << "Junuary"; break;
    case 2: cout << setw(16) << "February"; break;
    case 3: cout << setw(16) << "March"; break;
    case 4: cout << setw(16) << "April"; break;
    case 5: cout << setw(16) << "May"; break;
    case 6: cout << setw(16) << "June"; break;
    case 7: cout << setw(16) << "July"; break;
    case 8: cout << setw(16) << "August"; break;
    case 9: cout << setw(16) << "September"; break;
    case 10: cout << setw(16) << "October"; break;
    case 11: cout << setw(16) << "November"; break;
    case 12: cout << setw(16) << "December";
  }
}

void printMonthBody(int year, int month) {
  int startDay = getStartDay(year, month);
  int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);
  for (int i = 0; i < startDay; i++) {
    cout << " ";
  }
  for (int i = 1; i <= numberOfDaysInMonth; i++) {
    cout << setw(4) << i;
    if ((i+startDay) % 7 == 0) cout << endl;
  }
}

int getStartDay(int year, int month) {
  int startDay1800 = 3;
  int totalNumberOfDays = getTotalNumberOfDays(year, month);
  return (totalNumberOfDays + startDay1800) % 7;
}

int getTotalNumberOfDays(int year, int month) {
  int total = 0;
  for (int i = 1800; i < year; i++) {
    if (isLeapYear(i)) total += 366;
    else total += 365;
  }
  for (int i = 1; i < month; i++) {
    total += getNumberOfDaysInMonth(year, i);
  }
  return total;
}

int getNumberOfDaysInMonth(int year, int month) {
  if (month == 4 || month == 6 || month == 9 || month == 11) return 30;
  if (month == 2) return isLeapYear(year) ? 29 : 28;
  else return 31;
}

bool isLeapYear(int year) {
  return year%4 == 0 && year%100 != 0 || year %400 == 0;
}