A pure C++ class to print the yearly calendar of a given year, on the console. Compiled in g++ under Linux. Should compile fine in VC++ with no or minimal changes as no OS specific code has been used.
/** * Class to generate a yearly calendar * Amit Sengupta, 2015 Truelogic.org * Using g++, Linux Mint 18 */ #include <iostream> #include <string> #include <iomanip> using namespace std; class Cal { public: Cal(void); void getYearly(int year); protected: int mYear; string mMonths[13]; string mWeekDays [8]; int mDays [13]; int firstDayOfMonth(int month, int year); static const int YEAR_ROW_WIDTH = 35; // width of a row in yearly display }; /** * Constructor - initialize data * */ Cal::Cal(void) { mMonths[0] = ""; // month starts from 1 mMonths[1] = "January"; mMonths[2] = "February"; mMonths[3] = "March"; mMonths[4] = "April"; mMonths[5] = "May"; mMonths[6] = "June"; mMonths[7] = "July"; mMonths[8] = "August"; mMonths[9] = "September"; mMonths[10] = "October"; mMonths[11] = "November"; mMonths[12] = "December"; mDays[0] =0; mDays[1] = 31; mDays[2] = 28; mDays[3] = 31; mDays[4] = 30; mDays[5] = 31; mDays[6] = 30; mDays[7] = 31; mDays[8] = 31; mDays[9] = 30; mDays[10] = 31; mDays[11] = 30; mDays[12] = 31; mWeekDays[0] = ""; mWeekDays[1] = "Sun"; mWeekDays[2] = "Mon"; mWeekDays[3] = "Tue"; mWeekDays[4] = "Wed"; mWeekDays[5] = "Thu"; mWeekDays[6] = "Fri"; mWeekDays[7] = "Sat"; } /** * Using a standard c++ algorithm to find day of week for a date * Parameters: * month - month number * year - year * Returns: * dow = day of week, sun =0, mon=1 etc. */ int Cal::firstDayOfMonth(int month, int year) { int dow = 0; int day = 1; int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 }; year -= month < 3; dow = ( year + year/4 - year/100 + year/400 + t[month-1] + day) % 7; return dow; } /** * Print yearly calendar * Parameters: * year - year to print for */ void Cal::getYearly(int year) { mYear = year; if (mYear < 1900 || mYear > 2100) { std::cout << "Year must be between 1900 and 2100" << endl; return; } // check for leap year if ((mYear % 4 == 0 && mYear % 100 != 0) || (mYear % 400 == 0)) mDays[2] = 29; int leftPadding = 0; for (int i =1; i <=12; i ++) { // center month label leftPadding = (YEAR_ROW_WIDTH - mMonths[i].size()) / 2; for (int x =0; x < leftPadding; x++) { cout << " "; } cout << mMonths[i] << endl; //print weekday labels for (int j = 1; j <= 7; j++) { cout << setw(5) << mWeekDays[j] << setw(2) << " "; } cout << endl; // print days int daysPrinted = 0; for (int j = 1; j <= mDays[i]; j++) { // move display head to the correct day of week for 1st if (j == 1) { int dow = firstDayOfMonth(i, mYear); for (int spaces=0; spaces < dow; spaces++) { cout << setw(5) << " " << setw(2) << " "; daysPrinted ++; } } cout << setw(5) << j << setw(2) << " "; daysPrinted ++; if (daysPrinted % 7 == 0) { cout << endl; daysPrinted = 0; } } cout << endl << setw(35) << "----------------------------------------------------------------" << endl; } } int main() { Cal cal; cal.getYearly(2015); }
Sample output is given below:
good *-*