Frage von kesebesel, 49

java schleife problem?

aufgabe im bild


import java.util.Scanner;

public class JOP {

public static void main(String[] bla) {

    // TODO Auto-generated method stub

    int zufall;

    zufall =(int)(Math.random()*100)+1;
    int zahl;

    while(zahl != zufall) {

    Scanner s = new Scanner(System.in);
    System.out.println("gib eine zahl von 1 bis 100 ein");
    zahl = s.nextInt();

    if (zahl < zufall);{System.out.println("zu klein");}
    if (zahl > zufall);{System.out.println("zu hoch");}
    if (zahl != zufall);{System.out.println("bingo");}
    }
        }
    }

was mache ich falsch und wie kann ich es verbessern?

Antwort
von SirNik, 28

Hallo :D zuerstmal folgendes:

deine Variable zahl wird nicht initialisiert (bei int zahl;) und du versuchst dann direkt auf zahl zuzugreifen in deiner while-bedingung. In java darf man nicht auf eine Variable zugreifen, wenn dort noch nichts reingeschrieben wurde, d.h. das sollte irgendwie so aussehen: int zahl = irgendeinWert;

Dann empfehle ich dir dringenst dein Scanner bitte oberhalb deiner Schleife zu definieren, deklarieren und zu initialisieren! 

Dann zu deinen if's. Nach den if's darfst du kein ; machen! die gehören da nicht hin! 

if (zahl > zufall) {
   System.out.println("Zu hoch!");
}

Also ohne ; (Semikolon) nach der if-Bedingung!

Dann hast du bei der letzten if (zahl != zufall), dabei möchtest du ja testen, ob die zahlen GLEICH sind, also darfst du nicht != benutzen, sondern musst == benutzen.

Und jetzt, wie kannst du es verbessern?
Anstatt einer normalen while (kopfgesteuert) würde ich eine do-while (fußgesteuert) benutzen, das hat den vorteil, dass du zahl dann DOCH nicht mehr direkt initialisieren musst, sondern du kannst in der schleife es so machen, wie du willst, da aus zahl erst gelesen wird, NACHDEM du initialisiert hast:

do {
   // Hier dein Code
}
while (zahl != zufall);

Hier wird der Code mindestens EINMAL ausgeführt, BEVOR auf die Bedingung getestet wird! (beachte hier das semikolon nach while!)

Und dann empfehle ich dir, anstatt drei extra if's zu benutzen das sepcial-statement else-if zu verwenden.
Momentan frägt er bei jeder Iteration (schleifendruchlauf) jede einzelne der 3 if's ab. mit else-if frägt er nacheinander ab, aber dort, wo er merkt das passt geht er rein und handelt das ab und alles danach wird ignoriert:

if (bedingung1) {
   // Code
}
else if (bedingung2) {
   // Code
}
else {
   // Code
}

Wenn Bedingung1 false, dann guck bedingung2, wenn di auch false, dann mach else.
Wenn bedingung1 true, dann mache erstes if und ignoriere den rest, denn der ist in diesem beispiel danach überflüssig.
else-if ist beliebig oft verwendbar!

Ich habe hier mal den Code, der inklusive den Verbesserungen daherkommt!
Versuche ihn aber selbst zu verstehen und nicht einfach Copy&Paste einzusetzen!!! 

Ich hoffe, diese Antwort hilft dir und du verstehst sie!

Hier gibts ja leider kein Spoiler! Also nur weiterlesen, wenn du die antwort wissen möchtest!

Scanner s = new Scanner(System.in);
int zufall = (int) (Math.random() * 100) + 1;
int zahl;

do
{
System.out.println("Eine Zahl: ");
zahl = s.nextInt();

if (zahl < zufall)
{
System.out.println("Zu niedrig!");
}
else if (zahl > zufall)
{
System.out.println("Zu hoch!");
}
else
{
System.out.println("Bingo!");
}
}
while (zahl != zufall);
Kommentar von SirNik ,

Und für den Zusatz brauchst du lediglich eine Hilfsvariable, die bei jedem durchlauf um eins hochgezählt wird :D 

Kommentar von SirNik ,

Ergänzung: In diesem Fall ist kein weiteres else-if (nedingung) mehr nötig, da die ersten beiden if's alle falschen fälle abdecken, und der else fall eben nur ausgeführt wird, wenn die beiden oberen false sind, d.h. in diesem fall kann es nur noch zahl == zufall sein.

alternativ hätte man auch so schreiben können für klarheit:

if (zahl < zufall) { // Code }
else if (zahl > zufall) { // Code }
else if (zahl == zufall) { // Code }

also einfach nochmal ausführlich, statt nur else, aber das hat in diesem fall den gleichen effekt :D

Kommentar von kesebesel ,

Vielen danke für die Hilfe, aber hab mein Problem schon gelöst :D

jetzt brauch ich nur noch ein Zähler der zählt wie oft es schon gemacht wurde :)

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten