Probleme bei Programm mit Tagen und Monaten

Lestas89

Bekanntes Mitglied
Folgende Aufgabenstellung:

Schreiben Sie eine Anwendung die nacheinander erst den Namen, dann den
Geburtsmonat und dann den Geburtstag des Benutzers einliest. Begrüßen Sie
ihn anschließend mit „Hallo <Name>!“. Falls der Name dem Ihren entspricht,
geben Sie stattdessen „Hallo Programmierer!“ aus.
Testen Sie außerdem ob der eingegebene Monat existiert und ob der Tag gültig
für den entsprechenden Monat ist.
Überprüfen Sie Ihr Programm sowohl mit korrekten, als auch fehlerhaften
Daten. Was passiert wenn Sie in der Eingabebox nach Ihrem Namen noch ein
Leerzeichen schreiben?

Soweit bin ich bisher gekommen:

Java:
import javax.swing.JOptionPane;

public class Geburtstag{
    public static void main(String []args){
      
        String ersteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Namen ein:");
      
        if(ersteEingabe.equals("Markus")){
        JOptionPane.showMessageDialog(null, "Hallo Programmierer!");
        } else {
        JOptionPane.showMessageDialog(null, "Hallo "+ ersteEingabe + "!");
         }
      
      
      
        String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtsmonat ein:");
        int a = Integer.parseInt(zweiteEingabe);
      
         if (a < 1 || a > 12){
         JOptionPane.showMessageDialog(null, "Der Monat ist ungültig!");
      
  
      
        String dritteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtstag ein:");
      
        int januar = 31;
        int februar = 29; // Für dieses Jahr 29 Tage
        int maerz = 31;
        int april = 30;
        int mai = 31;
        int juni = 30;
        int juli = 31;
        int august = 31;
        int september = 30;
        int oktober = 31;
        int november = 30;
        int dezember = 31;
      

            }
        }  
    }

Ab hier komm ich nicht weiter:
"Testen Sie außerdem ob der Tag gültig für den entsprechenden Monat ist."

Kann mir da jemand helfen?
 
Zuletzt bearbeitet:

Jardcore

Top Contributor
Das könnte dich vielleicht interessieren:
http://www.java-forum.org/thema/laenge-der-monate-zuweisen.172389/#post-1085747
Dort hatte ich ein Beispiel gegeben wie man herausbekommt wie viele Tage ein Monat hat.
Dann kannst du testen ob dein eingegebener Tag > 1 und < tageDesMonats ist.

War irgendwas mit:
Java:
   privateint numberOfDaysInMonth(int month, int year){
       return new GregorianCalendar(year, month, 1).getActualMaximum(Calendar.DAY_OF_MONTH);
   }

Du musst dir also eine Methode schreiben die prüft wieviel Tage der eingegebene Monat hat.
 

Lestas89

Bekanntes Mitglied
Hallo Jardcore,

die Funktionen die du aber dort verwendest, hatten wir in der Hochschule noch garnicht. Anscheinend will unser Prof das wir das anders machen. Kannst du mir wirklich nicht weiterhelfen?
 

Jardcore

Top Contributor
Und weil ihr etwas nicht hattet, darfst du es nicht lernen? :)
Wie geschrieben, du musst irgendwie herausfinden wie viele Tage dein eingegebener Monat hat.

Hier von stackoverflow :)
Java:
int iYear =1999;
int iMonth =Calendar.FEBRUARY;// 1 (months begin with 0)
int iDay =1;

// Create a calendar object and set year and month
Calendar mycal =newGregorianCalendar(iYear, iMonth, iDay);

// Get the number of days in that month
int daysInMonth = mycal.getActualMaximum(Calendar.DAY_OF_MONTH);// 28
 

Thallius

Top Contributor
Du must deine TageProMonat in ein int[] tageProMonat stecken und dann einfach nachsehen ob der eingegebene Tag < als tageProMonat[eingegebenerMonat-1] ist.

Gruß

Claus
 

Joose

Top Contributor
Tipp: Von Monat 1-7 haben die ungeraden Monate 31 Tage (die geraden 30 Tage). Von Monat 8-12 ist es umgekehrt.
Spezialfall ist dann nur noch der Februar.
 

Lestas89

Bekanntes Mitglied
Danke für die zahlreichen Antworten. Ich weiß aber immer noch nicht wie ich genau vorgehen soll. Kann einer vllt das mal für den Monat Januar vormachen? Dann weiß ich wie ich vorgehen muss.
 

Lestas89

Bekanntes Mitglied
So hab ich das für den Monat Januar gemacht.

Ist das so richtig?

Java:
import javax.swing.JOptionPane;

public class Geburtstag{
    public static void main(String []args){
       
        String ersteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Namen ein:");
       
        if(ersteEingabe.equals("Markus")){
        JOptionPane.showMessageDialog(null, "Hallo Programmierer!");
        } else {
        JOptionPane.showMessageDialog(null, "Hallo "+ ersteEingabe + "!");
         }
       
       
       
        String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtsmonat ein:");
        int a = Integer.parseInt(zweiteEingabe);
       
         if (a < 1 || a > 12)
         JOptionPane.showMessageDialog(null, "Der Monat ist ungültig!");
       
   
       
        String dritteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtstag ein:");
        int b = Integer.parseInt(dritteEingabe);
       
        if(zweiteEingabe.equals("1")){
            if(b < 1 || b > 31){
                JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
            } else {
                JOptinPane.showMessageDialog(null, "Gültiger Tag!");
            }
        }
       

           
        }   
    }

Eine Frage hab ich aber noch:

Wie kann ich den Code so umschreiben, dass er mich hier die ganze Zeit nach dem Monat fragt, bis ein gültiger Monat eingegeben wurde? :

Java:
String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtsmonat ein:");
        int a = Integer.parseInt(zweiteEingabe);
       
         if (a < 1 || a > 12)
         JOptionPane.showMessageDialog(null, "Der Monat ist ungültig!");
 

Joose

Top Contributor
So hab ich das für den Monat Januar gemacht.

Ist das so richtig?

Funktioniert es? Dann wird es richtig sein ;)
Wie würde der Code für die ersten 4 Monate des Jahres ausschauen?

Wie kann ich den Code so umschreiben, dass er mich hier die ganze Zeit nach dem Monat fragt, bis ein gültiger Monat eingegeben wurde? :
Baue eine Schleife um deine Abfrage, solange etwas falsches eingegeben wird wiederholt sich die Schleife.
Hier bietet sich eine while-Schleife an.
 

Lestas89

Bekanntes Mitglied
Hallo Joose,

das klappt zwar für den Monat Januar, aber es wäre viel zu aufwendig das für jeden Monat einzeln zu machen. Wie ginge das anders?
 

Jardcore

Top Contributor
Du müsstest dir eine Schleife basteln die als Abbruchbedingung ein richtiges Ergebnis annimmt.
Dafür kannst du dir einfachhalber ein boolean nehmen und den dann mit true belegen wenn deine Schleife Abbrechen soll.
Java:
boolean monatGefunden = false;
while(!monatGefunden) {
    // if Eingabe richtig
    monatGefunden = true;
}

Java:
boolean monatGefunden = false;
int monat = 0;

while(!monatGefunden) {
    monat = getMonat("Geben Sie Ihren Geburtsmonat ein: ");
    if(monat <1|| monat >12) {
         JOptionPane.showMessageDialog(null, "Der Monat ist ungültig!");
    } else {
          monatGefunden = true;
    }
}
// ...
private int getMonat(String message) {
    return Integer.parseInt(JOptionPane.showInputDialog(message));
}
 
Zuletzt bearbeitet:

Lestas89

Bekanntes Mitglied
Hallo Jardcore,

so habe ich das gemacht. Ich bekomme aber Fehlermeldungen:

Java:
boolean monatGefunden = false;
        while(!monatGefunden){
        String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtsmonat ein:");
        int a = Integer.parseInt(zweiteEingabe);
       
        
         if (a < 1 || a > 12){
         JOptionPane.showMessageDialog(null, "Der Monat ist ungültig!");
               
            } else {
                monatGefunden = true;
            }
        }

was genau ist falsch ?
 

Joose

Top Contributor
das klappt zwar für den Monat Januar, aber es wäre viel zu aufwendig das für jeden Monat einzeln zu machen. Wie ginge das anders?

Da hast du natürlich recht das es aufwendig ist für jedes Monat etwas entsprechendes zu schreiben.
Es ist aber auch möglich mehrere Bedingungen zu verknüpfen. Weil es ist zum Beispiel vollkommen egal ob der Monat 1 (Januar) oder 3 (März) eingegeben wurde, beide haben nur 31 Tage.
Code:
if( januar oder märz oder ...) {
    if( tage < 1 oder tage > 31) {
        ungültiger wert
    }
....
Somit brauchst du nur noch 3 Bedingungen (1 für alle monate mit 30 tage, 1 für alle monate mit 31 tagen und februar)

Ansonsten sei nochmal mein Tipp von oben erwähnt.


EDIT:
so habe ich das gemacht. Ich bekomme aber Fehlermeldungen:
Es wäre auch praktisch wenn du uns sagst welche Fehlermeldungen das wären, dann kann man auch helfen!
 
Zuletzt bearbeitet:

Lestas89

Bekanntes Mitglied
Hallo Joose,

danke für deine Hilfe. Ich versuche erstmal die Schleife zu bauen und dann kümmer ich mich um die Monate :)

Mein Code sieht nun wie folgt aus, der Compiler meldet aber einen Fehler nachdem ich die Schleife hinzugefügt habe:

Java:
import javax.swing.JOptionPane;

public class Geburtstag{
    public static void main(String []args){
       
       
        String ersteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Namen ein:");
       
        if(ersteEingabe.equals("Markus")){
        JOptionPane.showMessageDialog(null, "Hallo Programmierer!");
        } else {
        JOptionPane.showMessageDialog(null, "Hallo "+ ersteEingabe + "!");
         }
       
        boolean monatGefunden = false;
        while(!monatGefunden){
        String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtsmonat ein:");
        int a = Integer.parseInt(zweiteEingabe);
       
        
         if (a < 1 || a > 12){
         JOptionPane.showMessageDialog(null, "Der Monat ist ungültig!");
               
            } else {
                monatGefunden = true;
            }
        }
       
       
        String dritteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtstag ein:");
        int b = Integer.parseInt(dritteEingabe);
       
        if(zweiteEingabe.equals("1")){
            if(b < 1 || b > 31){
                JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
            } else {
                JOptinPane.showMessageDialog(null, "Gültiger Tag!");
            }
        }
       

           
        }   
    }
 

Lestas89

Bekanntes Mitglied
Habe den Code nun runtergebrochen auf:

Java:
import javax.swing.JOptionPane;

public class Geburtstag{
    public static void main(String []args){
     
     
        String ersteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Namen ein:");
     
        if(ersteEingabe.equals("Markus")){
        JOptionPane.showMessageDialog(null, "Hallo Programmierer!");
        } else {
        JOptionPane.showMessageDialog(null, "Hallo "+ ersteEingabe + "!");
         }
     
        boolean monatGefunden = false;
        while(!monatGefunden){
        String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtsmonat ein:");
        int a = Integer.parseInt(zweiteEingabe);
     
      
         if (a < 1 || a > 12){
         JOptionPane.showMessageDialog(null, "Der Monat ist ungültig!");
             
            } else {
                monatGefunden = true;
            }
        }


     
     
        String dritteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtstag ein:");
        int b = Integer.parseInt(dritteEingabe);
     
 
        }
     

         
        }

und jetzt funktioniert es. Nun muss ich mich an die Tage machen!
Jetzt hab ich aber folgendes Problem: Mein String zweiteEingabe ist nun in der Schleife drin und unsichtbar für die anderen Blöcke. Wie soll ich die Methode equals nun anwenden können? Auf int a kann ich auch nicht zugreifen.
 
Zuletzt bearbeitet:

Lestas89

Bekanntes Mitglied
Vielen Dank Jardcore :) Das wusste ich garnicht. int a muss ich aber auch vor der Schleife mit irgendeinem beliebigen Wert belegen oder?
 

Jardcore

Top Contributor
Jop, hatte mein Beispiel oben noch editiert und die Variable auch vor die Schleife gepackt. Würde die Variable auch nicht unbedingt "a" nennen. Sondern eher "monat" :)
 

Lestas89

Bekanntes Mitglied
So jetzt bin ich eigentlich fertig. Allerdings ist dies eine Endlosschleife und das versteh ich nicht. Ich habe unten tagGefunden = true gesetzt und trotzdem läuft die Schleife immer weiter auch wenn was richtiges eingegeben wurde. Wo liegt der Fehler?

Java:
while(!tagGefunden){
        dritteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtstag ein:");
        b = Integer.parseInt(dritteEingabe);
   
        if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12){
            if(b > 31 || b < 1)
                JOptionPane.showMessageDialog(null,"Ungültiger Tag!");
               
            } else if(a == 4 || a == 6 || a == 8 || a == 9 || a == 11){
                if (b > 30 || b < 1)
                JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
                        }
                else if( a == 2){
                if (b < 1 || b > 29)
                JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
                    }
                else {
                    tagGefunden = true;
                    }
                }
 

Joose

Top Contributor
Wenn du dein Programm korrekt einrückst ist das Problem sofort ersichtlich ;)
Java:
while(!tagGefunden) {
   dritteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtstag ein:");
   b = Integer.parseInt(dritteEingabe);

   if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
     if(b > 31 || b < 1) {
       JOptionPane.showMessageDialog(null,"Ungültiger Tag!");
     }
   } else if(a == 4 || a == 6 || a == 8 || a == 9 || a == 11) {
     if (b > 30 || b < 1) {
       JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
     }
   } else if( a == 2) {
     if (b < 1 || b > 29) {
       JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
     }
   } else {
     tagGefunden = true;
   }
}

Das Problem: tagGefunden wird erst auf true gesetzt wenn du einen Monat <1 oder >12 angibst.
Hier hast du einfach einen Denkfehler ;)

Tipp: Auch wenn der if-Zweig nur aus einer Zeile besteht, verwende am besten immer Klammern

EDIT: Und für den Februar würde dir noch eine Schaltjahrabfrage fehlen. Da er nicht immer 29 Tage hat.
 

Joose

Top Contributor
Wie kann ich das Problem denn beheben mit der Schleife? Mir fällt nichts ein :D

Mir fällt es zwar ein, aber ich mag dir nicht alles an Denkarbeit abnehmen ;)
Am Besten wäre du nimmst dir Stift + Papier und führst einen Schreibtischtest durch. Bzw. gehe deine Schleife mit einem ungültigen Wert und dann mit einen gültigen Wert durch.
Was soll wo wann passieren? Welche Wert wird in welchen Fall auf dieses oder jenes gesetzt?

Mach dir am Anfang keine Sorgen darüber das es vielleicht zuviele if-Abfragen sind oder doppelter Code. Es kommt eher mal darauf an selber auf die Lösung zukommen. Danach kann man sich um Optimierungen immer noch Gedanken machen.
 

Lestas89

Bekanntes Mitglied
So, jetzt bin ich fertig! Der Code sieht wie folgt aus:

Java:
        while(!tagGefunden) {
   dritteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtstag ein:");
   b = Integer.parseInt(dritteEingabe);

   if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
     if(b > 31 || b < 1) {
       JOptionPane.showMessageDialog(null,"Ungültiger Tag!");
     }
   } else if(a == 4 || a == 6 || a == 8 || a == 9 || a == 11) {
     if (b > 30 || b < 1) {
       JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
     }
   } else if( a == 2) {
     if (b < 1 || b > 29) {
       JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
     }
   }
    if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
     if(b <= 31 || b >= 1) {
       JOptionPane.showMessageDialog(null,"Gültiger Tag!");
       tagGefunden = true;
     }
}    if(a == 4 || a == 6 || a == 8 || a == 9 || a == 11) {
     if (b >= 30 || b <= 1) {
       JOptionPane.showMessageDialog(null, "Gültiger Tag!");
        tagGefunden = true;
        }   
    }
    if( a == 2) {
     if (b >= 1 || b <= 29) {
       JOptionPane.showMessageDialog(null, "Gültiger Tag!");
       tagGefunden = true;
     }
   }
           
                   
           
           
        }

Nur das mit dem Schaltjahr weiß ich nicht.
 

Joose

Top Contributor
Zuerst einmal ein kleiner Fehler: Wenn ich deine Bedingungen mir anschaue sehe ich 13 Monate die du überprüfst ;) einer steht da doppelt.

Zu deinem Code:
Folgende Bedingungen schauen doch 1:1 gleich aus oder?
Java:
   if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
.....
   } else if(a == 4 || a == 6 || a == 8 || a == 9 || a == 11) {
.....
   } else if( a == 2) {
.....
   }

    if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
.....
}    if(a == 4 || a == 6 || a == 8 || a == 9 || a == 11) {
.....
    }
    if( a == 2) {
.....
   }

Also wäre es möglich (und praktisch) diese Zweige zusammenzufassen ;)

Java:
   if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
     if(b > 31 || b < 1) {
       JOptionPane.showMessageDialog(null,"Ungültiger Tag!");
     }else {
          ???????
     }
   } else if(a == 4 || a == 6 || a == 8 || a == 9 || a == 11) {
   ...
 

Lestas89

Bekanntes Mitglied
Mh ich versteh nicht genau wie ich die zusammenfassen soll. Wäre dir dankbar wenn du mir das zeigen würdest! :)

Edit: Ich habs. So meintest du es oder?

Java:
        while(!tagGefunden) {
   dritteEingabe = JOptionPane.showInputDialog("Geben Sie Ihren Geburtstag ein:");
   b = Integer.parseInt(dritteEingabe);

   if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
     if(b > 31 || b < 1) {
       JOptionPane.showMessageDialog(null,"Ungültiger Tag!");
     }else{
        JOptionPane.showMessageDialog(null, "Gültiger Tag!");
     }
     tagGefunden = true;
   }
  
   else if(a == 4 || a == 6 || a == 8 || a == 9 || a == 11) {
     if (b > 30 || b < 1) {
       JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
     }else{
        JOptionPane.showMessageDialog(null, "Gültiger Tag!");
        tagGefunden = true;
     }
   }
  
   else if( a == 2) {
     if (b < 1 || b > 29) {
       JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
     } else {
        JOptionPane.showMessageDialog(null, "Gültiger Tag!");
     }
        tagGefunden = true;
   }
 
Zuletzt bearbeitet:

Joose

Top Contributor
Du hast folgende Bedingungen:
Java:
if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
   if(b > 31 || b < 1) {
     JOptionPane.showMessageDialog(null,"Ungültiger Tag!");
   }
}
.....

if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
   if(b <= 31 || b >= 1) {
     JOptionPane.showMessageDialog(null,"Gültiger Tag!");
     tagGefunden = true;
   }
}
....

Die äußeren if-Bedingungen sind identisch. Daher reicht es auch diese nur 1x zu schreiben und den Inhalt beider Zweie dazu zuschreiben.
Java:
if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
   if(b > 31 || b < 1) {
     JOptionPane.showMessageDialog(null,"Ungültiger Tag!");
   }  
   if(b <= 31 || b >= 1) {
     JOptionPane.showMessageDialog(null,"Gültiger Tag!");
     tagGefunden = true;
   }
}
.....

So damit wäre schon mal einiges an doppelten Code weg und das Programm funktioniert immer noch wie davor.

Jetzt könnte dir noch aufallen das die beiden inneren if-Bedingungen irgendwie ähnlich sind.
Die erste if-Bedingung prüft ob der Tag ungültig ist, die Zweite prüft ob der Tag gültig ist.
Wenn die erste if-Bedingung zutrifft (if-Zweig) ist der Tag ungültig, wenn sie nicht zutrifft (else-Zweig) dann ist der Tag gültig.
Also anstatt einer 2.if-Bedingung würde ein einfache else ebenfalls reichen.
 

Joose

Top Contributor
ich habe oben meinen Beitrag bearbeitet. So meinst du es oder?
Genau! :)

Achtung bei deinem Code hast du dich manchmal vertan bei der Position von tagGefunden = true!

Und wenn man nochmal genau schaut fällt dir vielleicht auf das die inneren if-Bedingung sich eigentlich nur anhand der Zahlen unterscheiden welcher ein Monat maximal haben kann.
Der Code im jeden if-Zweig bzw. else-Zweig ist aber identisch. Hier könnte man noch etwas optimieren:
Java:
int untergrenze = 1; // jeder tag muss mindesten gleich 1 sein ;)
int obergrenze;
if(a == 1 || a == 3 || a == 5 || a == 7 || a == 8 || a == 10 || a == 12) {
   obergrenze = 31;
} else if(a == 4 || a == 6 || a == 8 || a == 9 || a == 11) {
   obergrenze = 30;
} else if( a == 2) {
   obergrenze = 29;
}

if (b > obergrenze || b < untergrenze) {
   JOptionPane.showMessageDialog(null, "Ungültiger Tag!");
} else {
   JOptionPane.showMessageDialog(null, "Gültiger Tag!");
   tagGefunden = true;
}
 

Neue Themen


Oben