Wochentagsberechnung nach J. C. F. Gauß in Java

Heyho,

Bin heute über eins meiner uraltprojekte gestolpert.

Und habe alten Java Code von mir gefunden der mir mal wieder sehr gefallen hat.

Hier mal ein paar Hintergrundinfos zum Thema auf Wikipedia.org

Die Gaußsche Wochentagsformel ist eine Formel von Carl Friedrich Gauß zur Berechnung des Wochentags anhand eines gegebenen Datums. Sie wird häufig für die Berechnung der Wochentage in der Informatik eingesetzt. Die Formel gilt von der Einführung des Gregorianischen Kalenders am 15. Oktober 1582 an und prinzipiell solange, bis von diesen Kalenderregeln wieder abgewichen wird, also bis zur nächsten Kalenderreform.
Gaußsche Wochentagsformel

Theoretisch ja nur Mathematisch und Easy.
Der Java Code ist mit Aus- und Eingaben auch nur ein paar Zeilen schlussendlich lang aber trotzdem eine Interessante entwicklung gewesen denn anfangs gab es ein paar Fragezeichen bei mir.

  1. Monat ist von 1 bis 12 aber nicht von Januar bis Dezember
  2. Jahre sind in einzelne Stellen aufgeteilt (kein Int möglich?)
  3. Wochentag muss explizt per Swich gelöst werden da nicht Montag bis Sonntag
  4. Datumsausgabe schön formatiert!
  5. Mit „mod“ wird die Modulo-Operation bezeichnet – wie zum Teufel @Java?
  6. Gauße Klammer extra functional programmieren!
    Nach Iverson war die Klammer kein problem mehr 🙂 suuper ein problem sofort gelöst.

Jetzt gehts los. Wie immer ganz ohne Ablaufplangestaltung (dafür bin ich einfach nicht der richtig hauptsächlich nicht bei klein programmen).

Ja eine Quelle nach der anderen ausgesogen um erstmal die Formel zu verstehen (machte mir wiki sehr einfach aber ich wollt noch ne andere Quelle haben).

Also Bücherschrank durchwühlt ^^ (www.google.de)

Buch von Georg Glaeser „Der mathematische Werkzeugkasten.“

schöne Info, Online E-Books zu dem ding gabs eins und das wurd verschlugen^^

München: Elsevier, 2. Aufl. 2006. ISBN 978-3-8274-1618-6 (Siehe Seite 353)

Wie geschrieben die Seiten 340 bis 360 waren sehr interessant ;).

Weiter gehts mit Java Problemchen.

Monat folgendermaßen gelöst:

public static int[] FuncIntArrayMonatChange(int iMyMonat)
{
		int iMyJahr = 1;
		switch (iMyMonat)
		{
			case 1:
				iMyMonat = 11;
				iMyJahr--;
				break;
			case 2:
				iMyMonat = 12;
				iMyJahr--;
				break;
			case 3:
				iMyMonat = 1;
				break;
			case 4:
				iMyMonat = 2;
				break;
			case 5:
				iMyMonat = 3;
				break;
			case 6:
				iMyMonat = 4;
				break;
			case 7:
				iMyMonat = 5;
				break;
			case 8:
				iMyMonat = 6;
				break;
			case 9:
				iMyMonat = 7;
				break;
			case 10:
				iMyMonat = 8;
				break;
			case 11:
				iMyMonat = 9;
				break;
			case 12:
				iMyMonat = 10;
				break;
			default:
				System.out.println("Monat?");
			break;
		}
		int MyResult[] = new int[2];
		MyResult[0] = iMyMonat;
		MyResult[1] = iMyJahr;
		return MyResult;
	} // Ende FuncIntArrayMonatChange(int Monat);

war einfach wenn man bedenkt das immerhin ein Array mit zwei Ints genutz werden um einen Ausgabewert zu haben – Java kann kein By Reference ….. shit^^

zum nächsten problemechen muss ich das Jahr wirklich aufteilen?

Formel Analyse:

/*
 * w  = (d + < 2,6 * m - 0,2 > + y  + < y/4 > + < c/4 > - 2c) mod 7
[...]
 * y  = die beiden letzten stellen des Jahres
 * c  = die beiden ersten  stellen des Jahres
[..]
 */

Okey eindeutig aufteilen^^ aber wann?
theoretisch braucht man die werte nur außerhalb von anderen werten d.h. Ergebnissmengen werden erst von den Jahreswerten gebraucht nachdem andere bzw. paralell zu anderen Berechnungen. Somit kann die Aufteilung nach allem anderen Erfolgen und die eingabe kann in einem Stück erfolgen da mit String funktionen auch Covertierte Integer Werte bearbeitet werden können

c = (int) (Integer.valueOf(strJahr.substring(0, 2))).intValue();
y = (int) (Integer.valueOf(strJahr.substring(2   ))).intValue();

Easy :).

Zum nächsten Punkt. Wochentags Switch – einfach einfach einfach nur Tippen!

public static String FuncStrWochentagsString(int iWochentag)
	{
		String strResult;
		switch(iWochentag)
		{
			case 0:
				strResult = "Sonntag";
				break;
			case 1:
				strResult = "Montag";
				break;
			case 2:
				strResult = "Dienstag";
				break;
			case 3:
				strResult = "Mittwoch";
				break;
			case 4:
				strResult = "Donnerstag";
				break;
			case 5:
				strResult = "Freitag";
				break;
			case 6:
				strResult = "Samstag";
				break;
			default:
				strResult = "Kein Gültiger Tag.";
			break;
		}
		return strResult;
	} // Ende FuncStrWochentagsString(Integer-Wochentag)

Natürlich müssen auch hierbei alle Gültigen Wochentagsformelregeln beachtet werden (Samstag = 6, Sonntag = 0) Ansonsten ist ja die Formel Sinnentfremdet (und nicht funktional).

Schön Formatierte Datumsausgaben sehen bei mir so aus:

public static String FuncStrEingabe(int iTag, int iMonat, int iJahr)
	{
		if((""+iMonat).length() == 1)
			if((""+iTag).length() == 1)
				return ("0" + iTag +  ".0" + iMonat + "." + iJahr);
			else
				return (      iTag +  ".0" + iMonat + "." + iJahr);
		else
			if((""+iTag).length() == 1)
				return ("0" + iTag +  "." + iMonat + "." + iJahr);
			else
				return (      iTag +  "." + iMonat + "." + iJahr);
	} // Ende FuncStrEingabe(Tag, Monat, Jahr);

Der Rest der Aus und eingaben wurden natürlich auch einigermaßen gut formatiert. Diese könnt ihr dann im Quelltext nachschaun und Testen. (für Rechtschreibfehler wird nicht gehaftet 😀 (und bei Gramattikalischem schwachsinn auch nicht!))

Zum Vorletzten Punkt!
Die Mod Funktionalität sieht so aus:
Mod liefert den kleinsten positiven Rest beim Teilen.
In Unserem Fall geht es nur um „Mod 7“ also als Beispiel (von wikipedia.org)

Beispiel: -19 mod 7 = -5 + 7 = 2

Wenn Ergebnis < 0 dann wird einfach der Mod X dazugezählt also in unserem Fall +7.
Wie in Java umsetzten? -> Antwort von google.de: „%“
was so einfach? Ja, wie in fast jeder Programmiersprache findet sich auch in Java ein Zeichen welches die „Informatik-Grundrechenart Modulo“ Beherrscht. Somit sieht die Formel für Java am ende „[…] % 7“ so aus. Das war viel wind um nichts :).

Zum Letzten punkt meiner obigen aufzählung noch kurz.

public static int FuncIntGauscheKlammer(double Wert) {return ((int) Math.floor(Wert));}
			  // Ende FuncIntGauscheKlammer(Wert GleitKommaZahl)

Aus der GauschenKlammer wird einfach die Standart Math Funktion „floor“ gemacht.
Infos dazu:
Gaußklammer auf Wikipedia

Diese ist aber wirklich ganz ganz leicht zu verstehen weil Runden wird ja wohl jeder können :).

Soviel zu diesen kleinem aber interessanten Programm. Wer den Wiki Artikel gelesen hat weiß auch das diese Formel in unserer Welt oft eingestzt wird.

Sie wird häufig für die Berechnung der Wochentage in der Informatik eingesetzt.

Also Dann viel spaß mit dem Programm.

Alle Projektdateien (.zip)
Quellcode.java

Programmierumgebung für Java (mein persönliche empfehlung):
eclipse
Eclipse

Viel Spaß nun mit meinem Quellcode 🙂

Gruß
Smeagol


Name von Gauß geschrieben