# Wiederholen einer if/switch-case Schleife



## Ballon52 (30. Aug 2016)

Hallo,

ich habe folgendes Problem, und zwar möchte ich eine Abfrage machen und bei einer ungültigen Eingabe soll die Schleife das ganze nochmal abfragen. Der Code sieht so aus:

  String eingabeNeu = scanner.next();
  switch(eingabeNeu){
  case "Ja": System.out.println("Der Gesamtflächeninhalt beträgt: " +(a+b) +" m²"); break;
  case "Nein": System.out.println("Flächeninhalt wird nicht ausgegeben"); break;
  default: System.out.println("Ungültige Eingabe, versuchen Sie es erneut");
}

Bisher funktionieren alle Fälle. Nun soll aber bei "Ungültiger Eingabe,..." das ganze von vorne anfangen, weil die Eingabe entweder Ja oder Nein sein soll. Deswegen hatte ich das break eingebaut. 

Ich kann mir vorstellen, dass default einfach dann ausgeführt wird, wenn kein case zutrifft. Allerdings endet dann ja somit auch die Schleife. Dafür müsste ich ja jetzt nun einen case haben, der alle anderen Fälle abdeckt?

Vielen Dank für eure Hilfe!


----------



## InfectedBytes (30. Aug 2016)

weder if noch switch sind eine Schleife...
Du musst schon selber eine Schleife drumherum bauen, z.b. while


----------



## Thallius (30. Aug 2016)

Auf welchem comparator setzt ein Switch mit Strings denn auf? Finde das irgendwie befremdlich da man ja nicht weiß ob es ein equal oder ein == oder was auch immer ist das da getestet wird.

Gruß

Claus


----------



## thecain (30. Aug 2016)

equals.

Siehe: http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html


----------



## Xyz1 (30. Aug 2016)

Hallo,
Strings in switch Statements ist etwas neumodisch, siehe auch:
http://stackoverflow.com/questions/338206/why-cant-i-switch-on-a-string
---
1.) In default wird eine Variable done NICHT gesetzt, eine Schleife wiederholt die Eingabe
2.) In default wird NICHT mit break aBreakpoint; eine Schleife verlassen
3.) Eine Methode gibt zurück, ob eine Schleife die Eingabe wiederholt
---
BufferedReader statt Scanner einsetzen zu bevorzugen
---
Eingabe darf deutsch sein, aber Variablennamen sollten alle lowerCamelCase Englisch sein
---
Flächeninhalt kenne ich nur a*b , macht's etwas aus, wenn du das komplette postest, so kann ich das vielleicht "verbessern"


----------



## Ballon52 (31. Aug 2016)

@DerWissende

Das habe ich lediglich mal zum üben geschrieben, frag also bitte nicht nach dem "Sinn" 
Ich wollte mal ein wenig mit Klassen und Objekterzeugung rumversuchen. Wie du siehst, bin ich ein blutiger Anfänger, daher würde ich eine eher "unschöne", aber für mich verständliche Lösung begrüßen.

Die Operation zum Schluss soll eben abfragen, ob der gesamte Flächeninhalt ausgegeben werden soll. Eingabemöglichkeit soll Ja oder Nein sein und bei falscher Eingabe (bspw. 1 oder neein) soll erneut gefragt werden (Ungültige Eingabe, versuchen Sie es erneut).

Vielen Dank!


```
public static void main(String[] args) {
  
   Rechteck Rechteck1 = new Rechteck();
   Kreis Kreis1 = new Kreis();
   Scanner scanner = new Scanner(System.in);
  
  Rechteck1.setSeite1();
  Rechteck1.setSeite2();
  double a = Rechteck1.getFlaeche();
  System.out.println("Die Fläche des Rechtecks beträgt: "  +  a  + " m²");  
  
  Kreis1.setRadius();
  double b = Kreis1.getFlaeche();
  System.out.println("Die Fläche des Kreises beträgt: " + b + " m²");
  
  System.out.println("Möchten Sie noch den gesamten Flächeninhalt wissen?");

  String eingabeNeu = scanner.next();
  switch(eingabeNeu){
  case "Ja": System.out.println("Der Gesamtflächeninhalt beträgt: " +(a+b) +" m²"); break;
  case "Nein": System.out.println("Flächeninhalt wird nicht ausgegeben"); break;
  default: System.out.println("Ungültige Eingabe, versuchen Sie es erneut");
  }
  scanner.close();
}
}
```


----------



## Xyz1 (31. Aug 2016)

Hallo @Ballon52 ,
ich hab dir das mal from scratch aufgeschrieben:

```
/**
     * Calcs some things ....
     *
     * @param args images a, b, and c.
     * @throws java.io.IOException
     */
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Nen Kreis(1) oder Quadrat(2)?:");
        int o = Integer.parseInt(in.readLine());
        if (o != 2) {
            System.out.println("Durchmesser, bitte:");
            double d = Double.parseDouble(in.readLine());
            System.out.println("Radius: " + d / 2);
            System.out.println("Umfang: " + Math.PI * d);
            System.out.println("Fläche: " + Math.PI * d * d / 4.0d);
        } else {
            System.out.println("Seitenlänge, bitte:");
            double d = Double.parseDouble(in.readLine());
            String a;
            do {
                System.out.println("Gib jetzt Ja oder Nein ein:");
                a = in.readLine().trim();
            } while (!a.equalsIgnoreCase("ja") && !a.equalsIgnoreCase("nein"));
            if (a.equalsIgnoreCase("ja")) {
                System.out.println("Umfang: " + 4.0d * d);
                System.out.println("Fläche: " + d * d);
                System.out.println("Diagonale: " + Math.sqrt(2.0d) * d);
            } else {
                System.out.println("Tschüss!");
            }
        }
    }
```

Es ist ja zum Lernen, denn Modalität ist bei diesem Beispiel nicht sinnvoll. 

Alles Relevante steht ab `String a;`.


----------



## Ballon52 (31. Aug 2016)

Danke @DerWissende!
Im oberen Teil sind doch schon einige Ausdrücke, die ich so noch nie gesehen habe. Der Teil ab String a ist aber für mich verständlich. Ich werde das gleich mal ausprobieren!


----------



## Xyz1 (31. Aug 2016)

Das ich überall 4.0d und 2.0d reingeschrieben hab, war irgendwie unprofessionell von mir:

```
/**
     * Calcs some things ....
     *
     * @param args images a, b, and c.
     * @throws java.io.IOException
     */
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Nen Kreis(1) oder Quadrat(2)?:");
        int o = Integer.parseInt(in.readLine());
        if (o != 2) {
            System.out.println("Durchmesser, bitte:");
            double d = Double.parseDouble(in.readLine());
            System.out.println("Radius: " + d / 2);
            System.out.println("Umfang: " + Math.PI * d);
            System.out.println("Fläche: " + Math.PI * d * d / 4);
        } else {
            System.out.println("Seitenlänge, bitte:");
            double d = Double.parseDouble(in.readLine());
            String a;
            do {
                System.out.println("Gib jetzt Ja oder Nein ein:");
                a = in.readLine().trim();
            } while (!a.equalsIgnoreCase("ja") && !a.equalsIgnoreCase("nein"));
            if (a.equalsIgnoreCase("ja")) {
                System.out.println("Umfang: " + 4 * d);
                System.out.println("Fläche: " + d * d);
                System.out.println("Diagonale: " + Math.sqrt(2) * d);
            } else {
                System.out.println("Tschüss!");
            }
        }
    }
```


```
Nen Kreis(1) oder Quadrat(2)?:
1
Durchmesser, bitte:
5
Radius: 2.5
Umfang: 15.707963267948966
Fläche: 19.634954084936208

Nen Kreis(1) oder Quadrat(2)?:
2
Seitenlänge, bitte:
5
Gib jetzt Ja oder Nein ein:
ja
Umfang: 20.0
Fläche: 25.0
Diagonale: 7.0710678118654755
```

Du siehst, diese Operationen sind schon furchtbar genau, generell gilt, dass * und / die Genauigkeit (***) nicht verschlechtern oder sogar erhöhen.

***: Okay, einige Ausnahmen gibt es natürlich, aber da geht's ins Eingemachte

Naja, was ich sagen wollte, es kommt auf die Terme an, wie man sie wählt, bei so etwas. 

Solange das Mobil jetzt nicht punktgenau auf dem Mars landen soll, ist erst mal alles Ok.


----------



## Xyz1 (2. Sep 2016)

Es geht auch etwas anders, einige Möglichkeiten hab ich ja schon oben umrissen, hinzu noch:

```
String a;
            for (;;) {
                System.out.println("Gib jetzt Ja oder Nein ein:");
                a = in.readLine().trim();
                if (a.equalsIgnoreCase("ja") || a.equalsIgnoreCase("nein")) {
                    break;
                } else {
                    continue;
                }
            }
```


```
Nen Kreis(1) oder Quadrat(2)?:
2
Seitenlänge, bitte:
5
Gib jetzt Ja oder Nein ein:

Gib jetzt Ja oder Nein ein:
hallo
Gib jetzt Ja oder Nein ein:
ich weiß nicht
Gib jetzt Ja oder Nein ein:
gut
Gib jetzt Ja oder Nein ein:
tschüss
Gib jetzt Ja oder Nein ein:
nein
Tschüss!
```

Viele vermeiden das aber - statt for... auch `while (true) {`, statt `break;` auch `// mache was.... und dann break;`, statt `if (` auch eine extra Methode...

Wie weit bist denn im moment?


----------

