#include //-------------------------------------------------------------------------- // Data Definition // --------------- // A date is a structure consisting of // - day as number // - month as number // - year as number //-------------------------------------------------------------------------- struct Date { int day; int month; int year; }; //-------------- // Data Example //-------------- Date date_1 = { 3, 4, 1900 }; Date date_2 = { 2, 7, 1945 }; Date date_3 = { 12, 4, 1996 }; Date date_4 = { 9, 5, 2000 }; //-------------- // Code Pattern //-------------- // ... F(Date d) // { // ... d.day ... // ... d.month ... // ... d.year ... // } //-------------------------------------------------------------------------- // Prototypes //-------------------------------------------------------------------------- bool isLeapYear(Date d); int nDay(Date d); int leapDay(Date d); //-------------------------------------------------------------------------- // main //-------------------------------------------------------------------------- int main() { std::cout << "isLeapYear(date_1) == " << std::boolalpha << isLeapYear(date_1) << "\n"; std::cout << "isLeapYear(date_2) == " << std::boolalpha << isLeapYear(date_2) << "\n"; std::cout << "isLeapYear(date_3) == " << std::boolalpha << isLeapYear(date_3) << "\n"; std::cout << "isLeapYear(date_4) == " << std::boolalpha << isLeapYear(date_4) << "\n"; std::cout << "leapDay(date_1) == " << leapDay(date_1) << "\n"; std::cout << "leapDay(date_2) == " << leapDay(date_2) << "\n"; std::cout << "leapDay(date_3) == " << leapDay(date_3) << "\n"; std::cout << "leapDay(date_4) == " << leapDay(date_4) << "\n"; std::cout << "nDay(date_1) == " << nDay(date_1) << "\n"; std::cout << "nDay(date_2) == " << nDay(date_2) << "\n"; std::cout << "nDay(date_3) == " << nDay(date_3) << "\n"; std::cout << "nDay(date_4) == " << nDay(date_4) << "\n"; return 0; } //-------------------------------------------------------------------------- // @description check whether a year is a leap year // @param d a date // @return true if d is a leap year, false otherwise // @contract isLeapYear : Date -> boolean // @example isLeapYear(date_1) == false // @example isLeapYear(date_2) == false // @example isLeapYear(date_3) == true // @example isLeapYear(date_4) == true //-------------------------------------------------------------------------- bool isLeapYear(Date d) { return (d.year % 400 == 0) || ((d.year % 100 != 0) && (d.year % 4 == 0)); } //-------------------------------------------------------------------------- // @description calculate the leap day // @param d a date // @return 1 if d is a leap year, 0 otherwise // @contract leapDay : Date -> int // @example leapDay(date_1) == 0 // @example leapDay(date_2) == 0 // @example leapDay(date_3) == 1 // @example leapDay(date_4) == 1 //-------------------------------------------------------------------------- int leapDay(Date d) { if (isLeapYear(d)) return 1; else return 0; } //-------------------------------------------------------------------------- // @description calculate the number of days since the new year // @param d a date // @return the number of days since the new year // @contract nDay : Date -> number // @example nDay(date_1) == 31 + 28 + 31 + 3 == 93 // @example nDay(date_2) == 31 + 28 + 31 + 30 + 31 + 31 + 2 = 184 // @example nDay(date_3) == 31 + 29 + 31 + 12 == 103 // @example nDay(date_4) == 31 + 29 + 31 + 30 + 9 == 130 //-------------------------------------------------------------------------- int nDay(Date d) { if (d.month == 1) return d.day; else if (d.month == 2) return 31 + d.day; else if (d.month == 3) return 31 + 28 + d.day + leapDay(d); else if (d.month == 4) return 31 + 28 + 31 + d.day + leapDay(d); else if (d.month == 5) return 31 + 28 + 31 + 30 + d.day + leapDay(d); else if (d.month == 6) return 31 + 28 + 31 + 30 + 31 + d.day + leapDay(d); else if (d.month == 7) return 31 + 28 + 31 + 30 + 31 + 31 + d.day + leapDay(d); else if (d.month == 8) return 31 + 28 + 31 + 30 + 31 + 31 + 31 + d.day + leapDay(d); else if (d.month == 9) return 31 + 28 + 31 + 30 + 31 + 31 + 31 + 31 + d.day + leapDay(d); else if (d.month == 10) return 31 + 28 + 31 + 30 + 31 + 31 + 31 + 31 + 30 + d.day + leapDay(d); else if (d.month == 11) return 31 + 28 + 31 + 30 + 31 + 31 + 31 + 31 + 30 + 31 + d.day + leapDay(d); else return 31 + 28 + 31 + 30 + 31 + 31 + 31 + 31 + 30 + 31 + 30 + d.day + leapDay(d); }