From 2266bc64dacbd668e72e6f9566d6371cb3e144ab Mon Sep 17 00:00:00 2001 From: AlternateWalls <71268229+AlternateWalls@users.noreply.github.com> Date: Tue, 5 Oct 2021 22:05:29 -0400 Subject: [PATCH] Update easter.cpp --- others/easter.cpp | 142 +++++++++++++++++++++++++++++++++------------- 1 file changed, 102 insertions(+), 40 deletions(-) diff --git a/others/easter.cpp b/others/easter.cpp index e8aec5f5d..e7d7ae011 100644 --- a/others/easter.cpp +++ b/others/easter.cpp @@ -1,49 +1,111 @@ -// You can read more about the reason behind the algorithm itself here: -// https://en.wikipedia.org/wiki/Date_of_Easter +/* +* @file +* @brief Determines the date of Easter after 1582 +* +* @details +* The date of Easter is determined in each year through a calculation known as "computus." +* Easter is celebrated on the first Sunday after the Paschal full moon, which is the first full moon on or after 21 March. +* Determining this date in advance requires a correlation between the lunar months and the solar year, while also accounting for the month, date, and weekday of the Julian or Gregorian calendar. +* The complexity of the algorithm arises because of the desire to associate the date of Easter with the date of the Jewish feast of Passover which, Christians believe, is when Jesus was crucified. +* +* You can read more about the date of Easter here: +* https://en.wikipedia.org/wiki/Date_of_Easter +* +* @author AlternateWalls (https://github.com/AlternateWalls) +*/ - /* Testing data: - * 2003 - 20th of April (4/20) - Passed - * 1830 - 11th of April (4/11) - Passed - * 2020 - 12th of April (4/12) - Passed - * 1910 - 27th of March (3/27) - Passed +//Includes +#include +#include + +/* +* @brief Contains information for Easter date +*/ +class EasterYearMonthDay +{ +public: + int year; // Year Easter is on + int month; // Month Easter is on + int day; // Day Easter is on + + EasterYearMonthDay(int newYear, int newMonth, int newDay) + { + year = newYear; // Assigns year to class + month = newMonth; + day = newDay; + } +}; + +/* + * @brief Function that finds the month and day of Easter + * @params param1 An int "y" of the year you want to find Easter on after + * 1582 + * @returns An instance of the easterYearMonthDay calss that contains the + * information (Ex. 420 - 4/20 or April 20th) */ -class easter -{ - public: - static void FindEaster(int y) +EasterYearMonthDay findEaster(int y) { + if (y > 1582) { - if (y > 1582) - { - // Calculations (It's not worth going into detail and naming each of these differently) + int a = y % 19; // Year's location on Metonic Calendar + int b = y / 100; // Century index + int c = y % 100; + int d = b / 4; + int e = b % 4; // Takes into account leap years + int f = (b + 8) / 25; + int g = (b - f + 1) / 3; + int h = (19 * a + b - d - g + 15) % 30; // Days from Mar. 21st until the full moon + int i = c / 4; + int k = c % 4; + int r = (32 + 2 * e + 2 * i - h - k) % 7; // The number of days from Paschal full moon to next Sunday + int m = (a + 11 * h + 22 * r) / 451; + int n = (h + r - 7 * m + 114) / 31; // Month of Easter + int p = (h + r - 7 * m + 114) % 31; // p + 1 is the day of Easter - //Year of Metonic Cycle - int a = y % 19; + // Assign values + EasterYearMonthDay date(y, n, p + 1); // Assign values to new instance of class - int b = y / 100; - int c = y % 100; - int d = b / 4; - int e = b % 4; - int f = (b + 8) / 25; - int g = (b - f + 1) / 3; - int h = (19 * a + b - d - g + 15) % 30; - int i = c / 4; - int k = c % 4; + //Return date + return date; + } + else + { + EasterYearMonthDay date(0, 0, 0); - //The number of days from Paschal full moon to next Sunday - int r = (32 + 2 * e + 2 * i - h - k) % 7; - - int m = (a + 11 * h + 22 * r) / 451; - int n = (h + r - 7 * m + 114) / 31; - int p = (h + r - 7 * m + 114) % 31; - - // Print date - cout << "Easter in " + y + " falls on " + n + "/" + - (p + 1) + "."); - } - else - { - return; - } + //Return date + return date; } } + + + static void test() + { + /* + * @brief Inputting different year values and comparing the outputs to a calendar + */ + + //2003 | April 20th + assert(findEaster(2003).month == 4); //Should return true + assert(findEaster(2003).day == 20); //Should return true + + //1910 | March 27th + assert(findEaster(1910).month == 3); //Should return true + assert(findEaster(1910).day == 27); //Should return true + + //1877 | April 1st + assert(findEaster(1877).month != 3); // Should return true + assert(findEaster(1877).day != 22); // Should return true + + //1400 | Invalid date + assert(findEaster(1400).month == 0); // Should return true + assert(findEaster(1400).day == 0); // Should return true + } + + //Main + int main() + { + test(); + return 0; + } + +