break - Anweisung reagiert nicht

barca_best_club

Cadet 2nd Year
Registriert
Aug. 2018
Beiträge
19
Hallo, ich bin's mal wieder!
Folgendes Problem habe ich mit Java: Ich wollte eigentlich mithilfe einer switch - case - Anweisung ein Programm programmieren, in dem man "raten" kann, welche Zahl gesucht wird - die Zahl 6 soll richtig sein (--> "Treffer" soll angezeigt werden), bei 4,5,7,8 soll wenigstens "Knapp daneben" dastehen und bei allen anderen Zahlen "Daneben". Das habe ich wie im Screenshot sichtbar programmiert. Allerdings wird mir jetzt bei jeder eingegebenen Zahl als Ausgabe "Daneben" angezeigt, obwohl ich ja ganz offensichtlich die break - Anweisungen gesetzt habe (nicht hinter jeder Zahl von 4,5,7,8, aber das sollte ja eigentlich möglich sein) und anders kann ich mir das einfach nicht erklären. Wo kann das Problem liegen?
 

Anhänge

  • Screenshot (14).png
    Screenshot (14).png
    86,4 KB · Aufrufe: 337
  • Gefällt mir
Reaktionen: Tunguska
Ändere mal wie folgt:

case '4' ---> case 4

Durch die Tüddelchen ist das kein integer, sondern ein char. Also musst du den case entweder auf Integer umstellen (ohne Tüddelchen) oder aber du switchst nicht auf dem Integer sondern direkt auf dem eingegeben char (dann mit Tüddelchen).
 
  • Gefällt mir
Reaktionen: abcddcba, Toms, rg88 und eine weitere Person
Du kannst es btw. etwas eleganter und flexibler lösen, wenn du statt switch-case eine if-Abfrage gegen den Absolutbetrag der Differenz nimmst:

(Pseudocode)
Code:
if abs(correct_number - choosen_number) > 2 {
  // Weit daneben
  } else {
  // Knapp daneben
  }
 
  • Gefällt mir
Reaktionen: Raijin und the_nobs
Das sowieso. Wenn's ausschließlich um Zahlen geht, ist das so deutlich schlanker und kann vor allem parametrisiert werden. Eine Switch-Anweisung ist weitestgehend statisch, während man obige if-Anweisung auch auf einen Funktionsparameter auslegen kann (wie im Beispiel "correct_number"). Im Beispiel fehlt jedoch die Abfrage des Treffers.

Code:
else if (correct_number == chosen_number)
{
   // Treffer
}
 
  • Gefällt mir
Reaktionen: BeBur
Und wo wir grad schon dabei sind :D.

(Pseudocode)
Code:
difference = abs(correct_number - choosen_number);
switch (difference) {
  case 0:
    // Treffer
    break;
  case 1:
  case 2:
    // Knapp daneben
    break;
  default:
    // Weit daneben
}
 
Raijin schrieb:
Ändere mal wie folgt:

case '4' ---> case 4

Durch die Tüddelchen ist das kein integer, sondern ein char. Also musst du den case entweder auf Integer umstellen (ohne Tüddelchen) oder aber du switchst nicht auf dem Integer sondern direkt auf dem eingegeben char (dann mit Tüddelchen).
Das heißt also, die Tüddelchen entscheiden ob es sich um ein char oder nicht handelt?
Ergänzung ()

BeBur schrieb:
Und wo wir grad schon dabei sind :D.

(Pseudocode)
Code:
difference = abs(correct_number - choosen_number);
switch (difference) {
  case 0:
    // Treffer
    break;
  case 1:
  case 2:
    // Knapp daneben
    break;
  default:
    // Weit daneben
}
Das bedeutet also, dass nach den verschiedenen case Anweisungen für "Knapp daneben!" kein Apostroph gesetzt wird? Und muss difference dann als anderer Datentyp deklariert werden oder funktioniert das automatisch?
 
Wenn du 6 schreibst, ist das eine Zahl, die vom Compiler implizit als integer interpretiert wird. Wenn du '6' schreibst, ist das ein char. "6" wiederum wäre ein String.
Mach spaßeshalber mal in deinem ursprünglichen Code aus #1 statt switch (zahl) einfach switch (eingabe). Kann gut sein, dass das auch funktioniert. Bin mir aber nicht 100% sicher ob der rückgabewert des Inputdialog evtl noch \n oder gar \r\n enthält, bin nicht so der javafreak.

Andersherum müsste der ursprüngliche code aber auch gehen, wenn du statt 6 eben 54 eingibst, den ascii-wert von '6', dem char 6 also.
 
  • Gefällt mir
Reaktionen: BeBur
Vielen Dank für den Input erstmal! switch (eingabe) statt switch (zahl) geht nicht, da wird beim Übersetzen des Quellcodes für jede Zahl ein Fehler angezeigt. Bei 54 statt '6' wird bei Eingabe der 6 nach wie vor "Daneben!" angezeigt. Bei der Variante aus #3 und #4 gibt es leider eine Fehlermeldung, scheinbar beim Datentyp, die ich mir aber nicht erklären kann (siehe Screenshot). Muss ich die 6 noch irgendwie anpassen? Oder das abs?
 

Anhänge

  • Screenshot (15).png
    Screenshot (15).png
    132,3 KB · Aufrufe: 236
abs() ist eine Methode aus der Math-Klasse.
 
Leider bin ich noch Anfänger in Java, was bedeutet das für den Quellcode jetzt, was muss ich ändern? Aus public class - math class?
 
Tipp: parseInt() ist eine Methode der Klasse Integer.
Ansonsten gibt es ja noch Google. Da steht, wie man abs() in allen seinen Varianten aufrufen kann. Oder du schreibst dir selbst so eine Methode, wegen dem Lerneffekt. Dann musst du an dem Aufruf nichts ändern.
 
barca_best_club schrieb:
Bei 54 statt '6' wird bei Eingabe der 6 nach wie vor "Daneben!" angezeigt.
Ich meinte beim Originalcode aus #1 beim Eingabedialog eine 54 "raten". Naja, egal.

Aber bitte bitte bitte poste deinen Quellcode nicht als Screenshot, sondern füge ihn als Text mit Copy&Paste in ein Code-Tag in den Beitrag ein.

Code:
If (bla)
{
  // blubb
}
Else
{
  // blablubb
}
 
  • Gefällt mir
Reaktionen: BeBur
Vielen Dank für die Hinweise, werde es mitnehmen! Nachdem ich das mit <3 jetzt geändert habe wie in #3 und #4 zu >2 und die Anweisung zu Math.abs, hat es auch mit dieser Variante geklappt!
 
Habe es gerade mal selbst in einem Online-Compiler ausprobiert:

Code:
public class MyClass {
    public static void main(String args[]) {
        
        CheckNumber(6);
        CheckNumber(54);
    }
    
    public static void CheckNumber(int x)
    {
        String ergebnis="Makuckn ob " + x + " stimmt .. .. ";
        
        switch(x)
        {
            case '6' :
                ergebnis += "Treffer!!";
                break;
            default : 
                ergebnis += "Daneben!";
                break;
        }

        System.out.println(ergebnis);
    }
}
Makuckn ob 6 stimmt .. .. Daneben!
Makuckn ob 54 stimmt .. .. Treffer!!

Wie bereits angedeutet wird bei case '6' der Integer aus dem Switch-Statement (x) mit dem ASCII-Wert des Chars 6 verglichen. Daher geht die Zahl 6 daneben, aber die Zahl 54 trifft, weil ASCII 54 eben der Char 6 ist ;)
 
Zurück
Oben