Erste Schritte Vokaltester

Dawinartor

Mitglied
Folgender Code:

Java:
import javax.swing.JOptionPane;
public class VokalTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String eingabe;
        char c;
        boolean istVokal;
        eingabe = JOptionPane.showInputDialog("Geben Sie einen Buchstaben ein");
        c = eingabe.charAt(0);
      
        if ( c == 'a') {
            istVokal = true;
        } else {
        if ( c == 'A') {
            istVokal = true;
        } else {
        if ( c == 'e') {
            istVokal = true;
        } else {
        if ( c == 'E') {
            istVokal = true;
        } else {
        if ( c == 'i') {
            istVokal = true;
        } else {
        if ( c == 'I') {
            istVokal = true;
        } else {
        if ( c == 'o') {
            istVokal = true;
        } else {
        if ( c == 'O') {
            istVokal = true;
        } else {
        if ( c == 'u') {
            istVokal = true;
        } else {
        if ( c == 'U') {
            istVokal = true;
              } else {
                  istVokal = false;
                
                
                if (istVokal == true) {
                JOptionPane.showMessageDialog(null, c + " ist ein Vokal!");
                } else {
                JOptionPane.showMessageDialog(null, c + " ist kein Vokal!");
                
                }
                }
              }
        }
        }
        }
        }
        }
        }
        }
        }
    }
}

Folgende Fragen:
1. Wenn ich ausführe und in die Zeile eines der angegebenen Vokale angebe bekomme ich nichts zurück. Das Programm schließt einfach.

2. Kann man den Code auch effizienter schreiben? Z.B.: if (c == 'a') -> istVokal = true -> ohne "} else {" schreiben zu müssen?
 
Zuletzt bearbeitet von einem Moderator:

FourOhFour

Aktives Mitglied
Folgende Code-Tags:
[ code=Java][ /code]

Hast du schon von switch gehört? Und du hast lauter else Abfragen statt else if, was du wahrscheinlich vorhattest?
 

Java20134

Bekanntes Mitglied
Das kann man etwas einfacher schreiben: Es gibt zwei Möglichkeiten, abgesehen von else-if:
Java:
boolean vokal = false;

switch(Character.toLowerCase(c)){
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
        vokal = true;    
        break;
}

oder auch:
Java:
List<Character> vokale = List.of('a', 'e', 'i', 'o', 'u');
boolean vokal = vokale.contains(Character.toLowerCase(c));
 

Robat

Top Contributor
Oder so ;)
Java:
boolean isVowel = eingabe.matches("(?i)[a|e|i|o|u]");
oder
Java:
boolean isVowel = "aeiou".indexOf(eingabe.toLowerCase()) >= 0;
 

FourOhFour

Aktives Mitglied
Java:
import javax.swing.JOptionPane;
public class VokalTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String eingabe;
        char c;
        boolean istVokal;
        eingabe = JOptionPane.showInputDialog("Geben Sie einen Buchstaben ein");
        c = eingabe.charAt(0);

        if ( c == 'a') {
            istVokal = true;
        } else {
            if ( c == 'A') {
                istVokal = true;
            } else {
                if ( c == 'e') {
                    istVokal = true;
                } else {
                    if ( c == 'E') {
                        istVokal = true;
                    } else {
                        if ( c == 'i') {
                            istVokal = true;
                        } else {
                            if ( c == 'I') {
                                istVokal = true;
                            } else {
                                if ( c == 'o') {
                                    istVokal = true;
                                } else {
                                    if ( c == 'O') {
                                        istVokal = true;
                                    } else {
                                        if ( c == 'u') {
                                            istVokal = true;
                                        } else {
                                            if ( c == 'U') {
                                                istVokal = true;
                                            } else {
                                                istVokal = false;


                                                if (istVokal == true) {
                                                    JOptionPane.showMessageDialog(null, c + " ist ein Vokal!");
                                                } else {
                                                    JOptionPane.showMessageDialog(null, c + " ist kein Vokal!");

                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Siehst du was du gemacht hast?
Java:
 else {
                                                istVokal = false;


                                                if (istVokal == true) {
                                                    JOptionPane.showMessageDialog(null, c + " ist ein Vokal!");
                                                } else {
                                                    JOptionPane.showMessageDialog(null, c + " ist kein Vokal!");

                                                }
                                            }
 

Dawinartor

Mitglied
Folgende Code-Tags:
[ code=Java][ /code]

Hast du schon von switch gehört? Und du hast lauter else Abfragen statt else if, was du wahrscheinlich vorhattest?

Gehört ja. Angewendet nein. So wie ich es verstanden han
Java:
import javax.swing.JOptionPane;
public class VokalTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String eingabe;
        char c;
        boolean istVokal;
        eingabe = JOptionPane.showInputDialog("Geben Sie einen Buchstaben ein");
        c = eingabe.charAt(0);

        if ( c == 'a') {
            istVokal = true;
        } else {
            if ( c == 'A') {
                istVokal = true;
            } else {
                if ( c == 'e') {
                    istVokal = true;
                } else {
                    if ( c == 'E') {
                        istVokal = true;
                    } else {
                        if ( c == 'i') {
                            istVokal = true;
                        } else {
                            if ( c == 'I') {
                                istVokal = true;
                            } else {
                                if ( c == 'o') {
                                    istVokal = true;
                                } else {
                                    if ( c == 'O') {
                                        istVokal = true;
                                    } else {
                                        if ( c == 'u') {
                                            istVokal = true;
                                        } else {
                                            if ( c == 'U') {
                                                istVokal = true;
                                            } else {
                                                istVokal = false;


                                                if (istVokal == true) {
                                                    JOptionPane.showMessageDialog(null, c + " ist ein Vokal!");
                                                } else {
                                                    JOptionPane.showMessageDialog(null, c + " ist kein Vokal!");

                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Siehst du was du gemacht hast?
Java:
 else {
                                                istVokal = false;


                                                if (istVokal == true) {
                                                    JOptionPane.showMessageDialog(null, c + " ist ein Vokal!");
                                                } else {
                                                    JOptionPane.showMessageDialog(null, c + " ist kein Vokal!");

                                                }
                                            }
 

FourOhFour

Aktives Mitglied
Die zweite OptionPane ist in der letzten else Abfrage. Da kommt das Programm nur hin, falls es sich bei der Eingabe um keinen Vokal handelt.
 

Java20134

Bekanntes Mitglied
Warum denn auch so umständlich? Wenn du schon else-if verwendest, dann mach es doch so:
Java:
char c = Character.toLowerCase('a');
boolean vokal = false;

if (c == 'a') {
     vokal = true;
} else if (c == 'e') {
     vokal = true;
} else if (c == 'i') {
     vokal = true;
} else if (c == 'o') {
     vokal = true;
} else if (c == 'u') {
     vokal = true;
}

oder auch:
Java:
if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'){
    vokal = true;
}
 

httpdigest

Top Contributor
Ja, aber nur der Fall "kein Vokal eingegeben" funktioniert dort.
Wenn du den Fall "Vokal eingegeben" hast, wird er das nicht ausgeben. Spiel doch einfach mal den Fall 'a' durch. Du siehst, dass er in den 'then'-Zweig des `if (c == 'a')` geht, und dann _natürlich_ nicht auch noch in den else-Zweig. Aber im Else-Zweig wird ja erst gaaaaanz tief unten, nachdem alle Vokale getesten wurden, angezeigt, dass es kein Vokal war.
Spiel also einfach mal den Kontrollfluss durch und du wirst sehen, dass es bei keinem der Vokale eine Nachricht ausgibt.
Außerdem sollte dir eine gute IDE z.B. auch sagen, dass die innere Bedingung `if (istVokal == true)` niemals erfüllt sein wird.
 

Dawinartor

Mitglied
Ja, aber nur der Fall "kein Vokal eingegeben" funktioniert dort.
Wenn du den Fall "Vokal eingegeben" hast, wird er das nicht ausgeben. Spiel doch einfach mal den Fall 'a' durch. Du siehst, dass er in den 'then'-Zweig des `if (c == 'a')` geht, und dann _natürlich_ nicht auch noch in den else-Zweig. Aber im Else-Zweig wird ja erst gaaaaanz tief unten, nachdem alle Vokale getesten wurden, angezeigt, dass es kein Vokal war.
Spiel also einfach mal den Kontrollfluss durch und du wirst sehen, dass es bei keinem der Vokale eine Nachricht ausgibt.
Außerdem sollte dir eine gute IDE z.B. auch sagen, dass die innere Bedingung `if (istVokal == true)` niemals erfüllt sein wird.

Ich hab es gerade durchgespielt: bei den Eingaben a und e kommt keine Meldung, bei allen anderen Buchstaben kommt die richtige Meldung. Ich verstehe jedoch nicht weshalb. Leider kann ich auch nicht so recht nachvollziehen was du da oben geschrieben hast, denn: wenn ein Vokal eingegeben wird so soll nach den Vokalen geprüft werden, und alle anderen Buchstaben sind mit } else { istVokal = false; definiert. also müsste es doch stimmen.
 

Robat

Top Contributor
Prinzipiell müsste dein Programm neben der Eingabe in 2 Bestandteile geteilt werden.
Java:
public static void main(String[] args) {
     // Eingabe

     // Eingabe prüfen

     // Ausgabe machen (wobei Ausgabe aus der Überprüfung besteht, ob vokal true ist
}
Momentan ist die Ausgabe aber bestand deiner Überprüfung.
Vielleicht kann man es dir an einem vereinfachten Beispiel zeigen.
Angenommen es gäbe nur 2 Vokale a und u.
Was du momentan gemacht hast ist sowas:
Java:
public static void main(String[] args) {
    char eingabe = ....
    
    if(eingabe == 'a') {
         vokal= true;
    } else {
         if(eingabe == 'u') {
              vokal= true;
         } else {
              // Ausgabe
         }
    }
}
Das entspricht aber nicht der Logik die du haben möchtest.
Du möchtest sowas in der Art
Java:
public static void main(String[] args) {
    char eingabe = ....
   
    if(eingabe == 'a') {
         vokal= true;
    } else {
         if(eingabe == 'u') {
              vokal= true;
         } // else-zweig nicht nötig
    }
    // Ausgabe 
}

Siehst du den Unterschied jetzt?
Bei 1. würde es nur eine Ausgabe geben wenn es sich nicht um ein a und nicht um ein u handelt .. dann würde aber auch immer ausgegeben werden, dass es kein Vokal ist.
Bei 2. wird überprüft ob es ein a oder u ist und dann wird geschaut ob es ein vokal war und dementsprechend eine Ausgabe gemacht.
 

Dawinartor

Mitglied
Was ich jetzt sehe ist: im oberen vereinfachten Beispiel hast du ein else Zweig mehr als im unteren. Wenn ich das mit der Else Verzweigung richtig verstanden habe bedeutet diese: Wenn if (Bedingung) eintritt dann wird die Anweisung ausgeführt, falls aber nicht wird die else Anweisung ausgeführt. Nach diesem Schema:

if (Bedingung) {
Anweisung1;
Anweisung2;
} else {
Anweisung3;

Somit wird immer else ausgeführt wenn if nicht autritt oder eben false ist. Nach diesem Prinzip
müsste der Code:

if(eingabe == 'a') { // die Bedingung für if
vokal= true; // die Anweisung für if
} else { //das wird ignoriert weil danach eine neue if Bedingung kommt
if(eingabe == 'u') { //die neue Bedingung
vokal= true; //die neue Anweisung
} else { // Wird das auch ignoriert?
// Ausgabe

und was bedeutet dann if- verschachteln?
 

httpdigest

Top Contributor
Betrachte verschachtelte if-Anweisungen einfach komplett isoliert voneinander.
Wenn du also so etwas hast:
Java:
if (e1) {
  s1;
} else {
  if (e2) {
    s2;
  } else {
    ...
  }
}
egal, wie tief da geschachtelt ist, du kannst es erstmal vereinfachen zu:
Java:
if (e1) {
  s1;
} else {
  // whatever
}
Wenn `e1` zu true ausgewertet wird, dann wird s1 ausgeführt. Was auch immer s1 ist.
Wenn `e1` false ist, dann wird das ausgeführt, was im else-Zweig steht, der zu genau dieser if-Anweisung gehört.
Wenn der else-Zweig jetzt wieder aus einer if-Anweisung - evtl. wieder mit eigenem else-Zweig - besteht, dann kannst du diese gesamte innere if-Anweisung wieder als eine eigene if-Anweisung betrachten. Du weißt ja jetzt, dass diese gesamte innere if-Anweisung nur ausgeführt wird, wenn in der äußeren if-Anweisung die Bedingung zu false ausgewertet wurde. Das heißt, nur dann wenn die Bedingung `e1` der äußeren if-Anweisung zu false auswertet, wird überhaupt irgendein Zweig der inneren if-Anweisung ausgeführt. Und, welcher Zweig der inneren if-Anweisung nun ausgeführt wird, hängt dann von deren Bedingung `e2` ab.
 

Dawinartor

Mitglied
Java:
import javax.swing.JOptionPane;
public class VokaltestErweiterung {
  public static void main (String [] args) {
    String eingabe;
    char c;
    boolean istVokal;
    eingabe = JOptionPane.showInputDialog("Geben Sie einen Buchstaben ein: ");
    c = eingabe.charAt(0);
    if (c == 'a') { //Bedingung für Eingabe c ist, dass c == dem Buchstaben a ist.
    istVokal = true; //Ist das der Fall, so idt es ein Vokal. Das Ergebnis also true.
} else { istVokal = false;}//Falls nicht ist das Ergebnis false.

/*Wird das Programm in diesem Fall nicht, wenn eine Eingabe statt findet, 
*von oben nach unten abchecken ob es sich um den Buchstaben handelt? 
*Oder hört das Programm nach dem die erste if-Bedingung nicht
*stattgefunden hat auf zu prüfen und wirft deswegen immer c + "ist kein Vokal aus"?*/

     if (c == 'A') {
     istVokal = true;
} else { istVokal = false;}
      if (c == 'e') {
      istVokal = true;
} else { istVokal = false;}
       if (c == 'E') {
       istVokal = true;
} else { istVokal = false;}
        if (c == 'i') {
        istVokal = true;
} else { istVokal = false;}
         if (c == 'I') {
    istVokal = true;
} else { istVokal = false;}
          if (c == 'o') {
          istVokal = true;
} else { istVokal = false;}
           if (c == 'O') {
           istVokal = true;
} else { istVokal = false;}
            if (c == 'u') {
            istVokal = true;
} else { istVokal = false;}
             if (c == 'U') {
             istVokal = true;
} else { istVokal = false;}

    if (istVokal == true) {
      JOptionPane.showMessageDialog(null, c + " ist ein Vokal!");
    } else {
      JOptionPane.showMessageDialog(null, c + " ist kein Vokal!");
  }
 }
}
 
Zuletzt bearbeitet von einem Moderator:

httpdigest

Top Contributor
Ich hab eben den Code von FourOhFour ausprobiert, aber auch dieser gibt mir keine Ausgabe wenn ich a oder e eingeben.
Es ist ja auch dein ursprünglicher Code, nur eben formatiert. "Formatiert" heißt hier, dass z.B. die geschachtelten if-Anweisungen eingerückt sind, so dass man - und das habe ich damit sagen wollen - gleich sieht, dass dein Code nicht das tut, was du möchtest.
 

httpdigest

Top Contributor
...unformatierter und nicht in code-tags geschriebener Code...
Spielen wir auch hier das Formatierungsspiel, erhalten wir:
Java:
package org.joml.lwjgl;
import javax.swing.JOptionPane;
public class VokaltestErweiterung {
    public static void main(String[] args) {
        String eingabe;
        char c;
        boolean istVokal;
        eingabe = JOptionPane.showInputDialog("Geben Sie einen Buchstaben ein: ");
        c = eingabe.charAt(0);
        if (c == 'a') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (c == 'A') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (c == 'e') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (c == 'E') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (c == 'i') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (c == 'I') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (c == 'o') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (c == 'O') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (c == 'u') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (c == 'U') {
            istVokal = true;
        } else {
            istVokal = false;
        }
        if (istVokal == true) {
            JOptionPane.showMessageDialog(null, c + " ist ein Vokal!");
        } else {
            JOptionPane.showMessageDialog(null, c + " ist kein Vokal!");
        }
    }
}
Jetzt sieht man auch wieder gut, dass dieser Code ebenfalls nicht das tut, was du möchtest. Hier sind das jetzt alles individuelle, nicht geschachtelte if-Anweisungen, die jeweils immer wieder die istVokal-Variable zu true oder false setzen. Spiele doch auch hier einmal den Kontrollfluss mit 'a' durch:
- Das erste if wird ausgewertet.
- Die Bedingung `c == 'a'` ist offensichtlich true, also wird der then-Zweig ausgeführt.
- Dieser setzt istVokal auf true.
- Der Else-Zweig von dieser if-Anweisung wird nicht ausgeführt
- Nun wird die nächste, völlig unabhängige if-Anweisung ausgeführt.
- Die Bedingung `c == 'A'` wertet zu false aus.
- Somit wird der else-Zweig ausgeführt, und istVokal wird wieder auf false gesetzt
 

Dawinartor

Mitglied
Darf ich bitte darum bitten, dass man den unten stehenden Code für mich analysiert und mir sagt warum er mir dieses Mal nur eine Antwort gibt wenn ich große Vokale eingebe?
-> Am besten so detailliert wie nur möglich.

Java:
import javax.swing.JOptionPane;
public class VokaltestMG {
  public static void main (String [] args) {
    String eingabe;
    char c;
    boolean istVokal;
    eingabe = JOptionPane.showInputDialog("Geben Sie einen Buchstaben ein: ");
    c = eingabe.charAt(0);

    if (c == 'a') {
    istVokal = true;
      } else {
       if (c == 'e') {
       istVokal = true;
         } else {
          if (c == 'i') {
          istVokal = true;
            } else {
             if (c == 'o') {
             istVokal = true;
               } else {
                if (c == 'u') {
                istVokal = true;
                  } else {
                   if (c == 'A') {
                   istVokal = true;
                     } else {
                      if (c == 'E') {
                      istVokal = true;
                        } else {
                         if (c == 'I') {
                         istVokal = true;
                           } else {
                            if (c == 'O') {
                            istVokal = true;
                             } else {
                              if (c == 'U') {
                              istVokal = true;
                               } else {
                                istVokal = false;
                    }
                  }
               }
             }
    }
    if (istVokal == true) {
      JOptionPane.showMessageDialog(null, c + " ist ein Vokal!");
    } else { //passiert wenn istVokal nicht gleich true.
      JOptionPane.showMessageDialog(null, c + " ist kein Vokal!");
 

Robat

Top Contributor
Mal ganz nett nachgefragt: Liest du die Hinweise auch die dir hier gegeben werden?

Die Frage bezieht sich auf genau das gleiche Problem wie vorher .. deine Verschachtelung stimmt nicht.
Formatiere deinen Code und geh Schritt für Schritt bei der Eingabe durch was passiert.

Und noch ein kleiner Hinweis: Bei dem Code den du gepostet hast fehlen mindest. 6 Klammern.
 

httpdigest

Top Contributor
Das ist kein compilierbarer, syntaktisch korrekter Java-Code.
Jetzt können wir raten, wo du die fehlenden acht schließenden Klammern gemacht hast. Und aufgrund deiner Aussage, dass nur für große Vokale eine Nachricht ausgegeben wird, hast du die fehlenden schließenden Klammern sicher ganz ans Ende gepackt und nicht nach dem letzten else-Teil der Buchstaben-Tests, so dass der Code, den du ausgeführt hast und eigentlich posten wolltest, so aussieht:
Java:
import javax.swing.JOptionPane;
public class VokaltestMG {
    public static void main(String[] args) {
        String eingabe;
        char c;
        boolean istVokal;
        eingabe = JOptionPane.showInputDialog("Geben Sie einen Buchstaben ein: ");
        c = eingabe.charAt(0);
        if (c == 'a') {
            istVokal = true;
        } else {
            if (c == 'e') {
                istVokal = true;
            } else {
                if (c == 'i') {
                    istVokal = true;
                } else {
                    if (c == 'o') {
                        istVokal = true;
                    } else {
                        if (c == 'u') {
                            istVokal = true;
                        } else {
                            if (c == 'A') {
                                istVokal = true;
                            } else {
                                if (c == 'E') {
                                    istVokal = true;
                                } else {
                                    if (c == 'I') {
                                        istVokal = true;
                                    } else {
                                        if (c == 'O') {
                                            istVokal = true;
                                        } else {
                                            if (c == 'U') {
                                                istVokal = true;
                                            } else {
                                                istVokal = false;
                                            }
                                        }
                                    }
                                }
                            }
                            if (istVokal == true) {
                                JOptionPane.showMessageDialog(null, c + " ist ein Vokal!");
                            } else { // passiert wenn istVokal nicht gleich true.
                                JOptionPane.showMessageDialog(null, c + " ist kein Vokal!");
                            }
                        }
                    }
                }
            }
        }
    }
}
 

Neue Themen


Oben