Skip to content

Instantly share code, notes, and snippets.

@madcoder2k17
Created July 3, 2017 09:25
Show Gist options
  • Save madcoder2k17/8639e194f3e58174c7526bd14d704968 to your computer and use it in GitHub Desktop.
Save madcoder2k17/8639e194f3e58174c7526bd14d704968 to your computer and use it in GitHub Desktop.
This snippet submitted by Tyler Veness. Rearranged by ©jAs and contributed by jAs MLt. Ltd.™
#include <iostream>
#include <iomanip>
bool isLeapYear( unsigned int& ); //checks if 'year' is leap year
unsigned int firstDayOfJanuary( unsigned int& year );
unsigned int numOfDaysInMonth( unsigned int , unsigned int& ); // takes the number of the month, and 'year' as arguments
void printHeader( unsigned int ); //takes the number of the month, and the first day, prints, and updates
void printMonth( unsigned int , unsigned int& ); //takes number of days in month, and reference to 'firstDayInCurrentMonth' so it updates after every call
void skip( unsigned int ); //prints the specified amount of spaces
int main() {
unsigned int year , firstDayInCurrentMonth;
std::cout << "Calendar year? ";
std::cin >> year;
std::cout << "\n";
firstDayInCurrentMonth = firstDayOfJanuary( year );
skip(9);
std::cout << year << "\n";
for ( unsigned int currentMonth = 1 ; currentMonth <= 12 ; currentMonth++ ) {
printHeader( currentMonth );
printMonth( numOfDaysInMonth( currentMonth , year ) , firstDayInCurrentMonth );
std::cout << "\n\n\n";
}
std::cout << "Press Enter to Exit...";
std::cin.ignore();
std::cin.get();
}
bool isLeapYear( unsigned int& year ) { //if number is multiple of 4 and is either multiple of 400 or not multiple of 100, is leap year
return ( year % 4 == 0 ) && ( year % 100 != 0 || year % 400 == 0 );
}
unsigned int firstDayOfJanuary( unsigned int& year ) {
/* "( 97 * year - 97 ) / 400" is the simplification of:
x1 = (year - 1)/ 4;
x2 = (year - 1)/ 100;
x3 = (year - 1)/ 400;
day_start = (year + x1 - x2 + x3) % 7;
after each value is plugged in
*/
return ( year + ( 97 * year - 97 ) / 400 ) % 7;
}
unsigned int numOfDaysInMonth( unsigned int m , unsigned int& year ) {
if ( m == 2 )
return isLeapYear( year ) ? 29 : 28; //if month is February, return correct number based on whether it is leap year
else
return 30 + ( m % 2 ); //otherwise return 31 if month number is odd, 30 if month number is even
}
void printHeader( unsigned int m ) {
skip( 7 );
if ( m == 1 ) std::cout << "January";
else if ( m == 2 ) std::cout << "February";
else if ( m == 3 ) std::cout << "March";
else if ( m == 4 ) std::cout << "April";
else if ( m == 5 ) std::cout << "May";
else if ( m == 6 ) std::cout << "June";
else if ( m == 7 ) std::cout << "July";
else if ( m == 8 ) std::cout << "August";
else if ( m == 9 ) std::cout << "September";
else if ( m == 10 ) std::cout << "October";
else if ( m == 11 ) std::cout << "November";
else if ( m == 12 ) std::cout << "December";
std::cout << "\n S M T W T F S" << "\n";
std::cout << "____________________" << "\n";
}
void skip( unsigned int i ) {
while ( i > 0 ) {
std::cout << " ";
i--;
}
}
void printMonth( unsigned int numDays, unsigned int &weekDay ) {
skip( 3 * weekDay ); //3 is width of a calendar number
for ( unsigned int day = 1 ; day <= numDays ; day++ ) {
std::cout << std::setw(2) << day << " ";
if ( weekDay == 6 ) {
std::cout << "\n";
weekDay = 0;
}
else
weekDay++;
}
}
@madcoder2k17
Copy link
Author

It was a hard task..™

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment