001 package de.hska.java.aufgaben.kontrollstrukturen;
002
003 /**
004 * <p>Berechnet zu einem Datum des Gregorianischen Kalenders
005 * gegeben als Tag, Monat und Jahr den zugehörigen Wochentag und gibt ihn auf dem Bildschirm aus.
006 * Der Algorithmus funktioniert nur für ein Datum, das zwischen März 1900 und Februar 2100 liegt
007 * (1900 und 2100 sind keine Schaltjahre, alle durch 4 teilbaren Jahre dazwischen sind es aber).
008 * </p>
009 *
010 * <p>Algorithmus: Zuerst muss die Gesamtanzahl der Wochentage von 1900 bis zum gegeben
011 * Datum errechnet werden (s.u.). Dies ist letztlich die Hauptschwierigkeit.
012 * Wenn diese Zahl berechnet ist, muss sie nur noch mit Rest durch 7 geteilt werden.
013 * Das ergibt den Wochentag: 0 = Sonntag.</p>
014 *
015 * <p>Die Gesamtanzahl Wochentag berechnen:
016 * <ul>
017 * <li>Vom gegebenen Jahr 1900 abziehen und dies mit 365 multiplizieren.</li>
018 * <li>Die fehlenden Schalttage hinzuaddieren (jahr - 1900) / 4.
019 * Wenn das jahr selbst ein Schaltjahr ist, dann ist für Januar und Februar ein Tag zuviel
020 * berechnet. In diesem Fall Eins abziehen. </li>
021 * <li>Pro Monat die entsprechende Anzahl Tage pro Monat hinzuaddieren (beim Februar immer 28 Tage,
022 * da das Schaltjahr schon berücksichtigt ist).</li>
023 * <li>Noch den Tag dazu.</li>
024 * </ul>
025 *
026 * <p>
027 * <a href="http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/kontrollanweisungen.html#wochentage">Zurück zum Aufgabentext</a>
028 * </p>
029 *
030 *
031 * @author Christian Pape
032 *
033 */
034 public class Wochentag {
035
036 /**
037 * Berechnet den Wochentag eines Datums und gibt ihn auf dem Bildschirm aus.
038 */
039 public static void main(String[] args) {
040 // Ostersonntage: 23. April 1916, 8. April 2007, 5. April 2010
041 // Aschermittwoch: 1. März 2006, 21. Februar 2007, 17. Februar 2010
042 // Gründung der BRD 23. Mai 1949 war ein Montag
043 int tag = 23;
044 int monat = 5;
045 int jahr = 1949;
046
047
048 int wochentag = (jahr - 1900) * 365 + (jahr - 1900) / 4;
049 if (jahr % 4 == 0 && monat <= 2) {
050 wochentag--;
051 }
052 switch (monat) {
053 case 12: wochentag += 30; // kein break: alle nachfolgenden
054 case 11: wochentag += 31; // Anweisungen werden ausgeführt
055 case 10: wochentag += 30;
056 case 9: wochentag += 31;
057 case 8: wochentag += 31;
058 case 7: wochentag += 30;
059 case 6: wochentag += 31;
060 case 5: wochentag += 30;
061 case 4: wochentag += 31;
062 case 3: wochentag += 28;
063 case 2: wochentag += 31;
064 }
065
066 wochentag = (tag + wochentag) % 7;
067
068 switch (wochentag) {
069 case 0: System.out.println("Sonntag");
070 break;
071 case 1: System.out.println("Montag");
072 break;
073 case 2: System.out.println("Dienstag");
074 break;
075 case 3: System.out.println("Mittwoch");
076 break;
077 case 4: System.out.println("Donnerstag");
078 break;
079 case 5: System.out.println("Freitag");
080 break;
081 case 6: System.out.println("Samstag");
082 break;
083 }
084 }
085
086 }