Easter.java
//********************************************************************
//
// Program #2
// Program Title: Easter.java
//
//********************************************************************
//
// Program Description and Design Overview:
//      A program that prints out the date for Easter Sunday of a given year
//
// Input Requirements:
//      Response to interactive prompt message for year, 
//		a 4 digit integer 
//		Response to interactive prompt message for continuing the program, 
//		a string reply, "yes" or "no" 
//		The program must also work correctly if "YES", "Yes", "NO", or "No" is entered.
  
//
// Output Requirements:
//      Welcome message and title: 
//		"Welcome to the Cal Poly CPE 101 Easter Sunday Calculator" 
//		(followed by an extra blank line) 
//		User prompts: 
//		"Enter the 4 digit year (for example, 1999, not 99)" 
//		"Do you wish to calculate another Easter date (enter "no" or "yes")?" 
//		Output of Results: 
//		If an invalid year was entered (error message and prompt for another year value): 
//		"Invalid year. Date must be between 1900 and 2099 inclusive. 
//		Please enter the 4 digit year again." 
//		If a valid year was entered: 
//		"Easter is Sunday, MMM DD, in YYYY." 
//		Where MMM = March or April, DD = date of month, and YYYY = year.
//
//	Problem Solution Discussion
//		You are required to write a program that prints out the date for Easter 
//		Sunday of a given year. You must use the EASTER-1900 algorithm (described 
//		below) that calculates the month and day of Easter Sunday for any year in 
//		the range from 1900 to 2099 inclusive (the algorithm cannot calculate 
//		correct Easter dates for years outside that range, however). 
//	
//	Data Structures
//
//	Name			Data Type		Description
//	----			---------		-----------
//	month			string			Month Easter is in 
// 	answer			string			user input to question : "do you wish to input another year"
//  year			integer			user input
//  yearMod19		integer			user input % 19
//  yearMod4		integer			user input % 4
//  yearMod7		integer			user input % 7
//  xMod30			integer			(19 * user input + 24) mod 30 
//  yMod7			integer			(2 * yearMod19 + 4 * yearMod4 + 6 * yearMod7 + 5) % 7 
//  dayOfMonth		integer			the day of easter before it was adjusted
//  adjDayOfMonth	integer			the day of easter after it was adjusted
//
//	Problem Solution Design Steps
//		1. Print a welcome message and title 
//		2. Repeat the following steps while the user's input response string value is not equal to "no" (either upper case or lower case letters): 
//			1. Prompt the user for a year as a 4 digit integer 
//			2. Input the year value 
//			3. Check if the year is valid: while the year is not valid repeat these steps: 
//				1. Print an error message 
//				2. Prompt the user for a year as a 4 digit integer 
//				3. Input the year value 
//			4. Calculate the month and day using the Easter-1900 algorithm (see below) 
//			5. Print out the result 
//			6. Prompt the user: "Do you wish to input another year (enter "no" or "yes")?" 
//			7. Input the user's response string
//
//	Program Preconditions:
//      user must enter valid year
//
//********************************************************************

   import cs1.Keyboard;
public class Easter
{

   //-----------------------------------------------------------------
   //  A comment that must be replaced by comment(s) describing the    //  program's main method.
   //-----------------------------------------------------------------
   public static void main (String[] args)
   {
   	String month ="", 
   	answer="yes";
   	
   	int year,	//user input
   	yearMod19,	//user input % 19
   	yearMod4,	//user input % 4
   	yearMod7,	//user input % 7
   	xMod30,		//(19 * user input + 24) mod 30 
   	yMod7,		//(2 * yearMod19 + 4 * yearMod4 + 6 * yearMod7 + 5) % 7 
   	dayOfMonth,	//the day of easter before it was adjusted
   	adjDayOfMonth=0;	// the day of easter after it was adjusted
   	
   	System.out.println ("Welcome to the Cal Poly CPE 101 Easter Sunday Calculator");
   	System.out.println ();
   	
   	
   	while (! answer.equalsIgnoreCase("no"))//when value of string answer does not eqaul "no" without regard to case
    	{
		System.out.println ("Enter the 4 digit year (for example, 1999, not 99)");
		year = Keyboard.readInt();	//stores user input into integer variable
		
		while (year <1900 || year >2100) //when valud of year is not between 1900 & 2100
			{
			System.out.println ("Invalid year. Date must be between 1900 and 2099 inclusive.\nPlease enter the 4 digit year again.");
			year = Keyboard.readInt();	//stores user input into integer variable
    		}
    	
    	//algorithm equations	
    	yearMod19 = year % 19;
    	yearMod4 = year % 4;
    	yearMod7 = year % 7;
    	xMod30 = (19 * yearMod19 + 24) % 30;
    	yMod7 = (2 * yearMod4 + 4 * yearMod7 + 6 * xMod30 + 5) % 7; 
		
		if (year == 1954 || year == 1981 || year == 2049 || year == 2076)//if year is 1954 or 1981 or 2049 or 2076
			{
			dayOfMonth = (15 + xMod30 + yMod7);	//algorithm
			}
		else 
			{
			dayOfMonth = (22 + xMod30 + yMod7);	//algorith
			}
    	
    	if (dayOfMonth <=31)	//if integer variable dayOfMonth is greater than or equal to 31
    		{
    		month = "March";	
    		adjDayOfMonth = dayOfMonth;
    		}
    	else if (dayOfMonth > 31)
    		{
    		month = "April";
    		adjDayOfMonth = (dayOfMonth - 31);
    		}
    	
    	System.out.println ("Easter is Sunday, " + month + " " + adjDayOfMonth + ", in " + year + ".");
    	System.out.println ();
    	
    	System.out.println ("Do you wish to input another year (enter \"yes\" or \"no\")?");
    	answer = Keyboard.readString(); //stores user input into string variable answer
    	
    	}  
   } //end main

} // end class Easter