/* File: mycal5.c Step 5 in writing my version of the calendar program. Printing an entire year. */ #include #include "genlib.h" #include "simpio.h" void PrintOneMonth(int start, int days) ; int AddDay(int weekday, int inc) ; int YearDays(int year) ; int MonthDays(int month, int year) ; bool IsLeapYear(int year) ; main() { int year, month, i ; int start, this_month_days ; printf("year =? ") ; year = GetInteger() ; /* January 1900, starts on Monday */ start = 1 ; for (i = 1900; i < year ; i++) { start = AddDay(start, YearDays(i)) ; } for (month = 1 ; month <= 12 ; month++) { printf("Month = %d\n", month) ; printf(" S M Tu W Th F S\n") ; this_month_days = MonthDays(month, year) ; PrintOneMonth(start, this_month_days) ; printf("\n") ; start = AddDay(start, this_month_days) ; } } int AddDay(int weekday, int inc) { return( (weekday + inc) % 7 ) ; } void PrintOneMonth(int start, int days) { int i ; /* Indent the first line */ for (i = 0 ; i < start ; i++) { printf(" ") ; } for (i = 1 ; i <= days ; i++) { printf("%3d", i) ; /* print newline at end of week */ if ( (i + start) % 7 == 0 ) { printf("\n") ; } } /* Print newline at end of month only if necessary */ if( (i + start) % 7 != 1) { printf("\n") ; } } int YearDays(int year) { if (IsLeapYear(year)) { return(366) ; } else { return(365) ; } } int MonthDays(int month, int year) { switch (month) { case 2: if (IsLeapYear(year)) return (29); return (28); case 4: case 6: case 9: case 11: return (30); default: return (31); } } bool IsLeapYear(int year) { return ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ); }