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

 

posted @ 2020-10-06 09:03  willison  阅读(199)  评论(0)    收藏  举报