Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

พิมพ์ปฏิทินประจำปีใน C++

โจทย์

ให้ปี ค.ศ. ต้องการพิมพ์ปฏิทินทั้งปี แสดงวัน เดือน ปี ทุกวัน

ข้อมูลที่ต้องคำนวณ

  • จำนวนวันในเดือน: 1,3,5,7,8,10,12 = 31 วัน; 4,6,9,11 = 30 วัน; 2 = 28 วัน (29 วันถ้าปีอธิกสุรทิน)
  • วันเริ่มต้นของเดือน: คำนวณจากปีและเดือน (Zeller's congruence)

ตัวอย่างโค้ด C++

#include <iostream>
using namespace std;

int dayNumber(int day, int month, int year) {
    static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
    year -= month < 3;
    return (year + year/4 - year/100 + year/400 + t[month-1] + day) % 7;
}

string getMonthName(int monthNumber) {
    string months[] = {"January", "February", "March", "April", "May", "June",
                       "July", "August", "September", "October", "November", "December"};
    return months[monthNumber];
}

int numberOfDays(int monthNumber, int year) {
    switch(monthNumber) {
        case 0: case 2: case 4: case 6: case 7: case 9: case 11: return 31;
        case 1:
            if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) return 29;
            else return 28;
        case 3: case 5: case 8: case 10: return 30;
    }
}

void printCalendar(int year) {
    cout << "\t\t\t Calendar - Year " << year;
    int current = dayNumber(1, 1, year);
    for (int i = 0; i < 12; i++) {
        int days = numberOfDays(i, year);
        cout << endl << "\t\t ----X----" << getMonthName(i).c_str() << "----X---- \t\t" << endl;
        cout << " Sun Mon Tue Wed Thu Fri Sat \n";
        int k;
        for (k = 0; k < current; k++) cout << "\t";
        for (int j = 1; j <= days; j++) {
            printf("%5d", j);
            if (++k > 6) { k = 0; cout << endl; }
        }
        if (k) cout << endl;
        current = k;
    }
}

int main() {
    int year = 2019;
    printCalendar(year);
    return 0;
}

ผลลัพธ์ (บางส่วน)

Calendar - Year 2019
----X----January----X----
Sun Mon Tue Wed Thu Fri Sat
      1   2   3   4   5
6   7   8   9  10  11  12
...
----X----December----X----
Sun Mon Tue Wed Thu Fri Sat
1   2   3   4   5   6   7
8   9  10  11  12  13  14
...
30  31