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    }