/*
Autor: Sebastian Iwanowski
Erstellungsdatum: März 2004
Zielgruppe: Schüler im Leistungskurs Informatik, Klasse 11
Kenntnisse der Schüler: Verzweigungen, einfache Schleifen,
noch keine Methoden, kein OOP
Aufgabenstellung: Gib ein Datum ein und berechne, wann im Zeitraum zwischen
1583 und 2299 dieses Datum auf einen beweglichen
Feiertag der Osterzeit fällt.
*/

import java.io.*;

public class OsternDatumsanfrage {

public static void main (String args[]) throws IOException
{
/* Methode:

Es werden nach dem Algorithmus von Gauß zu einem gegebenen Datum
(tag, monat) alle Jahre zwischen 1583 und 2299 ausgerechnet,
in dem das Datum auf einen beweglichen Feiertag der Osterzeit fällt:

Es werden für jedes Jahr die Feiertage Rosenmontag, Fasching (Fastnacht),
Aschermittwoch, Karfreitag, Ostern (Ostersonntag), Ostermontag,
Himmelfahrt, Pfingsten (Pfingstsonntag), Pfingstmontag und Fronleichnam
berechnet und mit dem gegebenen Datum verglichen.
*/

// Verbindung mit der Eingabekonsole:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

// Deklaration der Variablen:
int tag, monat; // Eingabedaten
int jahr; // Laufvariable für getesteten Jahresbereich
int rosenmontag, fasching, aschermittwoch, karfreitag, ostertag, ostermontag,
himmelfahrt, pfingsttag, pfingstmontag, fronleichnam;
//Tage der berechneten Feiertagsdaten
int rosenmonat, faschingsmonat, aschermonat, karmonat, ostermonat,
ostermmonat, himmelmonat, pfingstmonat, pfingstmmonat, fronmonat;
//Monate der berechneten Feiertagsdaten
String feiertagsname; // für die Ausgabe
boolean keinFeiertag = true; // für die Ausgabe
int m, n, a, b, c, d, e; // interne Größen für den Gauß-Algorithmus
boolean schaltjahr; // gibt an, ob betreffendes Jahr Schaltjahr ist

// INPUT:

System.out.print ("Tag eingeben (Zahl): ");
tag = Integer.parseInt (in.readLine());
System.out.print ("Monat eingeben (Zahl): ");
monat = Integer.parseInt (in.readLine());

// OUTPUT:

System.out.println ("Bewegliche Feiertage der Osterzeit in den folgenden Jahren:");

// BERECHNUNG (Kernalgorithmus):

for (jahr = 1583; jahr <= 2299; jahr++)
{ // Schleife über alle Jahre im zulässigen Bereich des Gauß-Algorithmus

schaltjahr = (((jahr%4) == 0) && ((jahr%100) != 0)) || (jahr%400 == 0);

// Berechnung der internen Größen m und n:
if (jahr<1700)
{
m=22; n=2;
}
else if (jahr < 1800)
{
m=23; n=3;
}
else if (jahr < 1900)
{
m=23; n=4;
}
else if (jahr < 2100)
{
m=24; n=5;
}
else if (jahr < 2200)
{
m=24; n=6;
}
else
{
m=25; n=0;
}

// Berechnung der internen Größen a,b,c,d,e:
a = jahr % 19;
b = jahr % 4;
c = jahr % 7;
d = (19*a+m) % 30;
e = (2*b+4*c+6*d+n) % 7;

// Berechnung der Feiertage:
ostertag = (22+d+e); // gilt nur für ostermonat == 3

if (ostertag > 31)
{ // ostermonat == 4

// Berechnung von Ostern:
ostermonat = 4;
ostertag = (d+e-9); // Korrektur für April
if (ostertag == 26)
ostertag = 19;
else if ((ostertag == 25) && (d==28) && (e==6) && (a>10))
ostertag = 18;

// Berechnung von Pfingsten (7 Wochen nach Ostern):
pfingsttag = ostertag + 19; // 49 Tage danach minus 30 Apriltage
if (pfingsttag > 31)
{
pfingsttag = pfingsttag - 31;
pfingstmonat = 6;
}
else
pfingstmonat = 5;

// Berechnung von Karfreitag (2 Tage vor Ostern):
karfreitag = ostertag - 2;
if (karfreitag < 1)
{
karfreitag = karfreitag + 31;
karmonat = 3;
}
else
karmonat = 4;

// Berechnung von Ostermontag (1 Tag nach Ostern):
ostermontag = ostertag + 1;
ostermmonat = 4;

// Berechnung von Himmelfahrt (39 Tage nach Ostern):
himmelfahrt = ostertag + 9; // 39 Tage danach minus 30 Apriltage
if (himmelfahrt > 31)
{
himmelfahrt = himmelfahrt - 31;
himmelmonat = 6;
}
else
himmelmonat = 5;

// Berechnung von Pfingstmontag (1 Tag nach Pfingsten):
pfingstmontag = pfingsttag + 1;
if (pfingstmontag == 32)
{
pfingstmontag = 1;
pfingstmmonat = 6;
}
else
pfingstmmonat = pfingstmonat;

// Berechnung von Fronleichnam (11 Tage nach Pfingsten):
fronleichnam = ostertag - 1; // 60 Tage nach Ostern minus 30 Apriltage
// minus 31 Maitage
if (fronleichnam == 0)
{
fronleichnam = 31;
fronmonat = 5;
}
else
fronmonat = 6;

// Berechnung von Aschermittwoch (46 Tage vor Ostern):
if (ostertag >= 16)
{
aschermittwoch = ostertag - 15; // 46 Tage davor plus 31 Märztage
aschermonat = 3;
}
else
{
aschermonat = 2;
if (schaltjahr)
aschermittwoch = ostertag + 14; // 46 Tage davor plus 31 Märztage
// plus 29 Februartage
else
aschermittwoch = ostertag + 13; // 46 Tage davor plus 31 Märztage
// plus 28 Februartage
}

} // ostermonat == 4
else
{ // ostermonat == 3

ostermonat = 3;

// Berechnung von Pfingsten (7 Wochen nach Ostern):
pfingsttag = ostertag - 12; // 49 Tage danach minus 31 Märztage
// minus 30 Apriltage
pfingstmonat = 5;

// Berechnung von Karfreitag (2 Tage vor Ostern):
karfreitag = ostertag - 2;
karmonat = 3;

// Berechnung von Ostermontag (1 Tag nach Ostern):
ostermontag = ostertag + 1;
if (ostermontag == 32)
{
ostermontag = 1;
ostermmonat = 4;
}
else
ostermmonat = 3;

// Berechnung von Himmelfahrt (39 Tage nach Ostern):
himmelfahrt = ostertag - 22; // 39 Tage danach minus 31 Märztage
// minus 30 Apriltage
if (himmelfahrt == 0)
{
himmelfahrt = 30;
himmelmonat = 4;
}
else
himmelmonat = 5;

// Berechnung von Pfingstmontag (1 Tag nach Pfingsten):
pfingstmontag = pfingsttag + 1;
pfingstmmonat = 5;

// Berechnung von Fronleichnam (11 Tage nach Pfingsten):
fronleichnam = ostertag - 1; // 60 Tage nach Ostern minus 31 Märztage
// minus 30 Apriltage
fronmonat = 5;

// Berechnung von Aschermittwoch (46 Tage vor Ostern):
aschermonat = 2;
if (schaltjahr)
aschermittwoch = ostertag - 17; // 46 Tage davor plus 29 Februartage
else
aschermittwoch = ostertag - 18; // 46 Tage davor plus 28 Februartage

} // ostermonat == 3

// Berechnung von Fasching (1 Tag vor Aschermittwoch):
if (aschermittwoch != 1)
{ // Aschermittwoch != 1. März
faschingsmonat = aschermonat;
fasching = aschermittwoch - 1;
}
else
{ // Aschermittwoch == 1. März
faschingsmonat = 2;
if (schaltjahr)
fasching = 29;
else
fasching = 28;
}

// Berechnung von Rosenmontag (1 Tag vor Fasching):
if (fasching != 1)
{ // Fasching != 1. März
rosenmonat = faschingsmonat;
rosenmontag = fasching - 1;
}
else
{ // Fasching == 1. März
rosenmonat = 2;
if (schaltjahr)
rosenmontag = 29;
else
rosenmontag = 28;
}

// Hiemit sind alle Feiertage berechnet

// Vergleich der Feiertage mit dem Eingabedatum:
if ((karfreitag == tag) && (karmonat == monat))
feiertagsname = "Karfreitag";
else if ((ostertag == tag) && (ostermonat == monat))
feiertagsname = "Ostern";
else if ((ostermontag == tag) && (ostermmonat == monat))
feiertagsname = "Ostermontag";
else if ((himmelfahrt == tag) && (himmelmonat == monat))
feiertagsname = "Himmelfahrt";
else if ((pfingsttag == tag) && (pfingstmonat == monat))
feiertagsname = "Pfingsten";
else if ((pfingstmontag == tag) && (pfingstmmonat == monat))
feiertagsname = "Pfingstmontag";
else if ((fronleichnam == tag) && (fronmonat == monat))
feiertagsname = "Fronleichnam";
else if ((aschermittwoch == tag) && (aschermonat == monat))
feiertagsname = "Aschermittwoch";
else if ((fasching == tag) && (faschingsmonat == monat))
feiertagsname = "Fasching";
else if ((rosenmontag == tag) && (rosenmonat == monat))
feiertagsname = "Rosenmontag";
else
feiertagsname = "";

// OUTPUT:
if (feiertagsname != "")
{
keinFeiertag = false;
System.out.println (jahr + ": " + feiertagsname);
}

} // Schleife über alle Jahre im zulässigen Bereich des Gauß-Algorithmus

// OUTPUT:
if (keinFeiertag)
System.out.println ("Dieser Tag ist in keinem Jahr zwischen 1583 und 2299 ein Feiertag der Osterzeit.");
}

}