// Autor: Apfelthaler Kathrin
// Matnr: 0225369
// 1.Eprog-Bsp: Grad: mittel - Eingabe eines Datums und Berechnung des Wochentags
// bearbeitet von Stephan Bazalka

import eprog.*;
import java.lang.*;

public class Wochentag extends EprogIO
{
public static String berechneTag(int Tag, int Monat, int Jahr)
{
    
    // Überprüfung, ob eingegebenen Daten richtig sind

    if ((Tag > 31) || (Monat > 12)) return "FALSCHE EINGABE";   	      
 
    // Initialisierung eines Arrays vom Typ Integer für die Tage pro Monat
   
    int TaMo[]={31,28,31,30,31,30,31,31,30,31,30,31};
    
    // Überprüfung, ob das Jahr ganzzahlig durch 4, 100 und durch 400 
    // teilbar ist. 
     
    boolean mod4, mod100, mod400;
       if (Jahr % 4 != 0) mod4 = false; 
          else mod4 = true;
       if (Jahr % 100 != 0) mod100 = false;
          else mod100 = true;
       if (Jahr % 400 != 0) mod400 = false; 
          else mod400 = true;
    
    // Ein Schaltjahr ist das eingegebene Jahr dann, wenn es durch
    // 4 ganzzahlig teilbar ist. Im Falle, dass es durch 100 und 
    // durch 400 teilbar ist, ist es kein Schaltjahr.
    // Daher müssen die Tage im Februar entsprechend verändert werden.
    // Außerdem werden schwachsinnige Tage im Februar (30.Feb.) abgefragt.

    if (mod4 == true) {
	TaMo[1] = 29;
	}
    if (mod100 == true && mod400 == false) {
    	TaMo[1] = 28;
	}

    // Sind die Werte ungleich null? (Das Jahr darf null sein)

    if (Tag == 0 || Monat == 0) { return "FALSCHE EINGABE"; }

    // Ist der Tag nicht größer als die maximale Tagesanzahl in diesem Monat?

    if (Tag > TaMo[Monat-1]) { return "FALSCHE EINGABE"; }

    // Diese Formel liefert den Wochentag des 1. Jänner eines gegebenen Jahres
    // Zurückgegeben werden ganzzahlige Werte zwischen 0 und 6

    int X = (Jahr + (int) Math.floor((Jahr-1)/4) - (int) Math.floor((Jahr-1)/100) + (int) Math.floor((Jahr-1)/400)) % 7;

    // Berechnung des Wochentags des gegebenen Datums
    // In einer For-Schleife werden alle vergangenen Tage 
    // des eingegebenen und der letzten Monate gezählt.

    for (int i = 0; i < (Monat - 1); ++i) Tag = Tag + TaMo[i]; 

    // Zum 1.1. werden nun alle vergangenen Tage dazuaddiert
    // Somit gelangt man zum eingegebenen Datum

    X = (X + Tag)% 7;

    // Ein Array vom Typ String wird angelegt
    // Es besteht aus 7 Feldern für die einzelnen Wochentage

    String Wochentag[]={"13467 123456", "12356 123456", "123456 56", "12356 56",
	                "123456 123456", "1567 123567", "13467 123567" };

    // Ausgabe des Wochentages

    return Wochentag[X];

    }
}