tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
576
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Niv'k Niv'k ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    11
    Hallo Leute!...

    Habe in Java einen Wochentagberechner geschrieben...
    Nur er funktioniert einfach nicht und nach meheren Stunden Fehlersuche, zum Teil zusammen
    mit meinem Arbeitskollegen (auch Azubi) ist mir echt Wirr und ich denke hier sind sicher welche die schnell sehen, was da schief läuft...
    Hie mein Code:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    
    import java.util.Scanner;
     
     
    public class WochentagAusgeben {
     
     
        public static void main(String[] args) {
     
          int ReferenzJahr = 1584;                                              
          Scanner sc = new Scanner(System.in);                                  
        
          System.out.println("Geben Sie das gesuchte Jahr ein:");               
          int GesuchtesJahr = sc.nextInt();                                     
          System.out.println("Geben Sie den gesuchten Monat als Zahl ein:");    
          int GesuchterMonat = sc.nextInt();                                    
          System.out.println("Geben Sie den gesuchten Tag ein:");               
          int GesuchterTag = sc.nextInt();                                      
          int VergangeneTage = 0;                                               
          boolean Schaltjahr = false;                                           
          
          while (ReferenzJahr <= GesuchtesJahr) {                               
            
            if (ReferenzJahr % 4 == 0) {                                                                                                                                                                                        
              Schaltjahr = true;
            }       
            
            if (ReferenzJahr % 100 == 0) {
              Schaltjahr = false;
            }
            
            if (ReferenzJahr % 400 == 0) {
              Schaltjahr = true;
            }       
                    
            if (Schaltjahr == true) {                                           
                VergangeneTage = VergangeneTage + 366;                          
            } else {
                VergangeneTage = VergangeneTage + 365;
            }
            
            ReferenzJahr++;                                                     
          }
          
          int Februar = 28;                                     
          
          if (Schaltjahr == true) {                             
             Februar = 29;                                      
             VergangeneTage = VergangeneTage - 366;             
          } else {
             VergangeneTage = VergangeneTage - 365;             
          }
     
          
          switch (GesuchterMonat) {                             
                                                                
          case 1:                                               
            VergangeneTage = VergangeneTage + 0;
            break;       
          case 2:
            VergangeneTage = VergangeneTage + 31;
            break;          
          case 3:
            VergangeneTage = VergangeneTage + 31 + Februar;
            break;          
          case 4:
            VergangeneTage = VergangeneTage + 31 + Februar + 31;
            break;          
          case 5:                                                                                               
            VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30;
            break;          
          case 6:
            VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31;
            break;          
          case 7:
            VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30;
            break;          
          case 8:
            VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31;
            break;          
          case 9:
            VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31;
            break;          
          case 10:
            VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31 + 30;
            break;          
          case 11:
            VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31 + 30 + 31;
            break;          
          case 12:
            VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31 + 30 + 31 + 30;
            break;
          default: 
            System.out.println("Offenbar gab es einen Fehler bei der Berechnung! \n Vielleicht bei der Monatseingabe vertippt?");
            break;
          }   
          
          int Wochentag = (VergangeneTage + GesuchterTag - 1) % 7;                      
                                                                                    
          switch (Wochentag) {
          
          case 0:
            System.out.println("Der gesuchte Tag ist ein Sonntag!");             
            break;
          case 1:
            System.out.println("Der gesuchte Tag ist ein Montag!");            
            break;
          case 2:
            System.out.println("Der gesuchte Tag ist ein Dienstag!");               
            break;
          case 3:
            System.out.println("Der gesuchte Tag ist ein Mittwoch!");             
            break;       
          case 4:
            System.out.println("Der gesuchte Tag ist ein Donnerstag!");         
            break;
          case 5:
            System.out.println("Der gesuchte Tag ist ein Freitag!");                
            break;
          case 6:
            System.out.println("Der gesuchte Tag ist ein Samstag!");                
            break;
          default: 
            System.out.println("Offenbar gab es einen Fehler bei der Berechnung!");
            break;
          }
          
        }
    }

    Sorry, wenn nicht sofort klar ist, was was ist, hatte eig. alles kommentiert, leider führt das hier zu totaler unleserlichkeit aufgrund der Zeilenumbrüche :/
    Hoffe ihr könnt iwie helfen...

    Danke!
    Geändert von sheel (23.01.12 um 23:09 Uhr) Grund: Codetags
     

  2. #2
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Hi und Willkommen bei tutorials.de,

    sehr hilfreich wäre vor dem Fehlersuchen das eigentliche Problem.
    Falsches Ergebnis (was statt was), Exception (welche), ...?
    Hast du mal mit dem Debugger eingegrenzt, wo was passiert?

    Ich hab mal die Codetags auf die Sprache angepasst.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    Niv'k Niv'k ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    11
    Danke, freue mich hier zu sein!

    Stimmt, hätte echt mehr sagen müssen, sorry,
    Also: Das Ergebnis stimmt einfach nicht. Meist liegt es so +- 2 Tage daneben.
    Habe im debuger mal nachgesehen, was so passiert. Immerhin stimmt es, das bei 2012 Schaltjahr true ist. Ich denke das ich irgendwie was mit den Tagen falsch habe.

    Als Referenzjahr bzw. Tag ist Sonntag der 1. Januar 1584 genannt. Dann lasse ich in der schleife immer wieder abfragen, ob das momentane jahr ein schaltjahr ist, wenn ja kommen 366 Tage dazu wenn nicht 365. Nach der schleife ziehe ich wiede rje nach Schaltjahr 366 bzw. 365 ab, weil in der schleife auch das geforderte Jahr dazugerechnet wurde, das tue ich deshalb, weil ich ja auch vom aktuellem Schaltjahr wissen will, ob es einschaltjahr ist.
    Dadurch wird dann ja auch Februar entsprechend auf 29 oder 28 Tage gesetzt. Danach werden die vergangenen Tage der Monate addiert und die Tage, die eingegeben wurden ( -1 weil der eingegebene tag selbst ja noch nicht vergangen ist).
    Die summe des ganzen also der vergangenen Tage dann %7 ... ist es 0 muss es wieder ein Sonntag sein, 1 ein montag etc...

    Soweit die Theorie, leider ist irgendwo ein ganz blöder Fehler drinne.
    Z.B.: der 11.02.1964 muss ein Dienstag werden. Es kommt Montag raus.
    Der 01.01.2012 ist angeblich ein Freitag!

    Hoffe die Informationen helfen besser!
    Danke.
     

  4. #4
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Konnte zwar ein Problem finden, war aber anscheinend nicht alles, geht noch immer nicht.
    (In der while-Jahr<=-Schleife muss Schaltjahr wieder auf false gesetzt werden.)

    Alternative: Warum nicht die Wochentagsformel von Gauß?
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Ich habe es spaßeshalber mal etwas vereinfacht. Scheint zu funktionieren:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    
    import java.util.Scanner;
     
     
    public class Weekday {
     
        private static boolean istTeilbar(int x, int teiler) {
            return (x % teiler == 0);
        }
     
        private static boolean istSchaltjahr(int jahr) {
            return (istTeilbar(jahr, 400) ||
                    istTeilbar(jahr, 4) && ! istTeilbar(jahr, 100));
        }
     
        public static void main(String[] args) {
     
            int ReferenzJahr = 1584; // Beginn gregorianischer Kalender. 1. 1. 1584 war ein Sonntag.
            Scanner sc = new Scanner(System.in);
     
            System.out.println("Geben Sie das gesuchte Jahr ein:");
            int GesuchtesJahr = sc.nextInt();
            System.out.println("Geben Sie den gesuchten Monat als Zahl ein:");
            int GesuchterMonat = sc.nextInt();
            System.out.println("Geben Sie den gesuchten Tag ein:");
            int GesuchterTag = sc.nextInt();
            int VergangeneTage = 0;
            boolean Schaltjahr = false;
     
            while (ReferenzJahr < GesuchtesJahr) {
                Schaltjahr = istSchaltjahr(ReferenzJahr);
     
                if (Schaltjahr) {
                    VergangeneTage = VergangeneTage + 366;
                } else {
                    VergangeneTage = VergangeneTage + 365;
                }
     
                ReferenzJahr++;
            }
     
            int Februar = istSchaltjahr(GesuchtesJahr) ? 29 : 28;
     
            switch (GesuchterMonat) {
            case 12:
                VergangeneTage += 30;
            case 11:
                VergangeneTage += 31;
            case 10:
                VergangeneTage += 30;
            case 9:
                VergangeneTage += 31;
            case 8:
                VergangeneTage += 31;
            case 7:
                VergangeneTage += 30;
            case 6:
                VergangeneTage += 31;
            case 5:
                VergangeneTage += 30;
            case 4:
                VergangeneTage += 31;
            case 3:
                VergangeneTage += Februar;
            case 2:
                VergangeneTage += 31;
            case 1:
                break;
            default:
                System.out.println("Offenbar gab es einen Fehler bei der Berechnung! \n Vielleicht bei der Monatseingabe vertippt?");
            }
     
            int Wochentag = (VergangeneTage + GesuchterTag - 1) % 7;
     
            String wochentag[] = {
                "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"
            };
     
            System.out.printf("Der gesuchte Tag ist ein %s!\n", wochentag[Wochentag]);
        }
    }
    PS: Übrigens schreibt man in Java nur Klassennamen groß. Variablennamen sollten in mixed Case mit Kleinbuchstaben anfangen - siehe z.B. http://java.about.com/od/javasyntax/...onventions.htm

    Gruß
    Geändert von deepthroat (24.01.12 um 08:54 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    Zitat Zitat von sheel Beitrag anzeigen
    Alternative: Warum nicht die Wochentagsformel von Gauß?
    Zur Hilfe: http://de.wikipedia.org/wiki/Gau%C3%...BCltige_Formel
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  7. #7
    Niv'k Niv'k ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    11
    Hallo alle zusammen!

    Erst einmal danke für die schnelle und kompetente Hilfe!
    Hätte nicht gedacht, dass so schnell Leute antworten... und vor allem:
    Das man hier nicht wie in diversen anderen Foren direkt "fertig" gemacht wird, wenn man mal einen einfachheren Fehler nicht findet!

    Das Problem schein jetzt gelöst zu sein! Es war scheinbar wirklich nur die while schleife in der bei jedem Durchgang, das Schaltjahr wieder auf false gesetzt werden muss!
    Denn nun kommen die richtigen Tage raus, an den Daten, an denen sonst immer das Flasche raus kam!

    Die anderen Lösungen haben mir zusätzlich auch noch weitere unbekannte Lösungswege gezeigt.
    Leider konnte ich keine der anderen Formeln benutzen, da es sich um eine fest definierte Schulaufgabe handelte, bei der genau diese benutzt werden sollte...
    Ich danke euch allen nochmal!

    Und zu den großen Variabelennamen: Ich versuch mich zu bessern! Ich komme aus einem Betrieb der eig. nur mit C++ und Javascript arbeitet und bei uns ist es Sitte die Variabelen groß zu schreibne, dass habe ich mir inzwischen schon angewöhnt. Aber ich hoffe auf besserung!

    In diesem Sinne! Danke und bis zur nächsten Herausforderung!
     

  8. #8
    Avatar von j2se
    j2se j2se ist offline Mitglied Silber
    Registriert seit
    Oct 2011
    Beiträge
    94
    Blog-Einträge
    1
    Zur Vereinfachung und Kontrolle der Daten habe ich ein einfaches Java Programm entwickelt, welches anhang des gesetzten Datums den Wochentag liefert.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    import java.text.DateFormat;
    import java.util.Calendar;
     
    public class WochentagBeispiel {
     
        public static int getDay(int y, int m, int d) {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, y);
            cal.set(Calendar.MONTH, m);
            cal.set(Calendar.DATE, d);
            DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);
            // Die folgende Ausgabe dient nur zur Validierung
            System.out.println(df.format(cal.getTime()));
            return cal.get(Calendar.DAY_OF_WEEK);
        }
        
        public static void main(String[] args) {
            // Achtung Monate beginnen mit 0 (zero based) d.h. Jan = 0, Feb = 1 etc.
            System.out.println("Tag der Woche (1 = Sonntag, 7 = Samstag) von 4.11.2009: " + getDay(2009, 10, 4) );
        }
    }
    Geändert von j2se (24.01.12 um 22:42 Uhr)
     

Ähnliche Themen

  1. kurze bitte; da ich kein IE hab
    Von Fix&Foxi im Forum CSS
    Antworten: 7
    Letzter Beitrag: 06.06.11, 23:06
  2. Bitte um schnelle Hilfe in Java!
    Von AngeloBa im Forum Java
    Antworten: 2
    Letzter Beitrag: 06.05.07, 12:43
  3. Bitte um Hilfe Java Programm!
    Von spy72 im Forum Java
    Antworten: 2
    Letzter Beitrag: 16.01.07, 09:03
  4. Hilfe Um Bitte Zu Blöd Für Java
    Von SirWayne im Forum Java
    Antworten: 1
    Letzter Beitrag: 01.10.06, 00:04
  5. Ladebalken - kurze, simple Frage/Bitte
    Von Comenius im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 31.08.06, 19:15

Stichworte