# Zahlenraten auch in for-Schleife darstellbar?



## Alpinwhite (30. Okt 2017)

Hallo, ich habe folgendes Programm gemacht, welches eine zufällige Zahl generiert und der Benutzer hat 4 Versuche diese zu erraten. Ich soll dies nun auch mit einer for-Schleife darstellen. Das funktioniert doch garnicht oder?


```
import java.util.Random;

public class Zahlenratenwhile {

    public static void main (String[] args) {
   
   
    int Benutzerzahl;
    Random r = new Random();
    int random_number = r.nextInt(20 - 1 + 1) + 1;
    int Versuche=3;
    int i=2;
   
    System.out.println("Du hast 4 Versuche, um die Zahl zu erraten!");
    System.out.println("Versuch 1:");
    System.out.println("Dein Tipp:");
    Benutzerzahl= Input.readInt();
   
    while (Benutzerzahl<random_number && Versuche>0) {
       
        System.out.println("Die gesuchte Zahl ist groeßer!");
        System.out.println("Versuch " + i + ":");
        --Versuche;
        i++;
        Benutzerzahl= Input.readInt();
        }
    while (Benutzerzahl>random_number && Versuche>0) {
       

        System.out.println("Die gesuchte Zahl ist kleiner!");
        System.out.println("Versuch " + i + ":");
        --Versuche;
        i++;
        Benutzerzahl= Input.readInt();
        }
    if (Benutzerzahl==random_number) {
        System.out.println("Sie haben die Zufallszahl erraten!");
        }
    if (Versuche==0) {
        System.out.println("Sie haben keine Versuche mehr");
        }
    }
    }
```


----------



## Dukel (30. Okt 2017)

Wieso sollte es nicht funktionieren?
Hast du es einmal mit for getestet?


----------



## Alpinwhite (30. Okt 2017)

Dukel hat gesagt.:


> Wieso sollte es nicht funktionieren?
> Hast du es einmal mit for getestet?



Nein ich verstehe den Einstieg nicht


----------



## Dukel (30. Okt 2017)

Funktioniert dein Programm ohne Fehler mit allen Möglichen Versuchen?
Wieso hast du zwei While Schleifen hintereinander und wieso danach zwei If's?


----------



## Alpinwhite (30. Okt 2017)

Dukel hat gesagt.:


> Funktioniert dein Programm ohne Fehler mit allen Möglichen Versuchen?
> Wieso hast du zwei While Schleifen hintereinander und wieso danach zwei If's?



Ja funktioniert einwandfrei. Wie hätte man das richtig machen können?


----------



## Javinner (30. Okt 2017)

> int Benutzerzahl, int Versuche=3


int benutzerZahl wäre Konventionskonform https://de.wikibooks.org/wiki/Java_Standard:_Variablen_und_Bezeichner


> int random_number = r.nextInt(20 - 1 + 1) + 1;


warum nicht einfach r.nextInt(20) + 1;
Dein Code ist stark verbesserungswürdig. Ich hätte die Schleife so gestaltet:

```
package test;

public class Test
{
    public static void main(String[] args)
    {
        while(versuche > 0)
        {
            if(benutzerZahl > random_number)
            {
                //Mach dies
            } else if(benutzerZahl < random_nummer)
            {
                //Mach jenes
            } else
            {
                //Wenn nichts davor eintraff,
                //Dann das hier.
            }
             versuche--;
        }
    }
}
```


----------



## Meniskusschaden (30. Okt 2017)

Alpinwhite hat gesagt.:


> Ja funktioniert einwandfrei.


Nein. Es funktioniert zum Beispiel nicht, wenn die erste Eingabe zu groß und die zweite zu klein ist.


----------



## Alpinwhite (31. Okt 2017)

Meniskusschaden hat gesagt.:


> Nein. Es funktioniert zum Beispiel nicht, wenn die erste Eingabe zu groß und die zweite zu klein ist.



Ja jetzt klappt es: 


```
import java.util.Random;

public class Zahlenratenwhile {

    public static void main (String[] args) {
   
   
    int Benutzerzahl;
    Random r = new Random();
    int random_number = r.nextInt(20 - 1 + 1) + 1;
    int Versuche=3;
    int i=2;
   
    System.out.println("Du hast 4 Versuche, um die Zahl zu erraten!");
    System.out.println("Versuch 1:");
    System.out.println("Dein Tipp:");
    Benutzerzahl= Input.readInt();
   
    while (Benutzerzahl<0 || Benutzerzahl>20) {
       
        System.out.println("Bitte gib eine Zahl zwischen 0 und 20 ein");
        System.out.println("Du hast 4 Versuche, um die Zahl zu erraten!");
        System.out.println("Versuch 1:");
        System.out.println("Dein Tipp:");
        Benutzerzahl= Input.readInt();
    }
    while (Benutzerzahl<random_number && Versuche>0) {
       
        System.out.println("Die gesuchte Zahl ist groeßer!");
        System.out.println("Versuch " + i + ":");
        System.out.println("Dein Tipp:");
        --Versuche;
        i++;
        Benutzerzahl= Input.readInt();
        }
    while (Benutzerzahl>random_number && Versuche>0) {
       

        System.out.println("Die gesuchte Zahl ist kleiner!");
        System.out.println("Versuch " + i + ":");
        System.out.println("Dein Tipp:");
        --Versuche;
        i++;
        Benutzerzahl= Input.readInt();
        }
    if (Benutzerzahl==random_number) {
        System.out.println("Sie haben die Zufallszahl erraten!");
        }
    if (Versuche==0) {
        System.out.println("Sie haben keine Versuche mehr");
        }
    }
    }
```

Trotzdem weiß ich nocht nicht wie ich es mit einer for-Schleife umsetzen soll.


----------



## Meniskusschaden (31. Okt 2017)

Alpinwhite hat gesagt.:


> Ja jetzt klappt es:


Nein, immer noch derselbe Fehler. Gehe das Programm doch mal schrittweise durch, z.B. für den Fall, dass die Zufallszahl 10 ist, die erste Eingabe 15 und die zweite Eingabe 5.


----------



## Alpinwhite (31. Okt 2017)

Meniskusschaden hat gesagt.:


> Nein, immer noch derselbe Fehler. Gehe das Programm doch mal schrittweise durch, z.B. für den Fall, dass die Zufallszahl 10 ist, die erste Eingabe 15 und die zweite Eingabe 5.


Stimmt du hast Recht, leider bringt mir das nichts es schrittweise durchzugehen wenn ich nicht weiß wo der Fehler liegen könnte. Für mich ergibt das alles so Sinn. Gibt es eine empfehlenswerte Seite wo die Ursache meines Fehlers erklärt wird? Vermutlich hängt es mit den Klammern zusammen..


----------



## Dukel (31. Okt 2017)

Nein. Das ist ein Logisches Problem.


----------



## Tarrew (31. Okt 2017)

Ich kenne auch kein Forum in dem man so welche Fragen wie "wie mach ich das richtig?", "wie macht man das", "brauche Lösung für Hausaufgabe" ohne ein bisschen Eigeninitiative gerne sieht. 

Hilfe zur Selbsthilfe oder wie heißt das so schön 

Es wurden dir doch einige Hinweise gegeben, jetzt ist Zeit für ein bisschen Eigeninitiative. 
Evtl. solltest du dich mal mit dem Debugger beschäftigen. 

Zu deiner for-Schleife:
Anstatt 

```
System.out.println("Test 1");
        System.out.println("Test 2");
        System.out.println("Test 3");
        System.out.println("Test 4");
```

kannst du auch schreiben: 

```
for(int i=1; i<=4; i++){
            System.out.println("Test "+i);
        }
```

Die Schleife dient also dazu doppelten Code zu vermeiden. In deinem Code sind die ganzen Ausgaben und while-Schleifen alle doppelt. Du solltest also versuchen, dass entsprechend ähnlich in einer for-Schleife zu schreiben.


----------



## Javinner (31. Okt 2017)

Alpinwhite hat gesagt.:


> Für mich ergibt das alles so Sinn.
> Gibt es eine empfehlenswerte Seite wo die Ursache meines Fehlers erklärt wird?


Man sollte sich angewöhnen, was einem geraten wird, auch umzusetzen: wirkt wunder!
Lies dich hier ein, das könnte sehr hilfreich sein.
http://openbook.rheinwerk-verlag.de/javainsel/javainsel_02_005.html



			
				Tarrew hat gesagt.:
			
		

> Es wurden dir doch einige Hinweise gegeben, jetzt ist Zeit für ein bisschen Eigeninitiative.
> Evtl. solltest du dich mal mit dem Debugger beschäftigen.


so sieht es aus


----------



## Meniskusschaden (31. Okt 2017)

Alpinwhite hat gesagt.:


> leider bringt mir das nichts es schrittweise durchzugehen wenn ich nicht weiß wo der Fehler liegen könnte. Für mich ergibt das alles so Sinn.


Gerade wenn es Sinn für dich ergibt, solltest du es schrittweise durchgehen, denn dann würdest du sehen, wie dein Programm arbeitet und könntest erkennen, dass es so eben doch keinen Sinn ergibt.
Mit schrittweise durchgehen meine ich übrigens nicht, dir jede Zeile anzusehen, sondern jede Zeile auf dem Papier auszuführen, so wie es der Computer auch machen würde - also einen Schreibtischtest.


----------



## Meniskusschaden (31. Okt 2017)

Alpinwhite hat gesagt.:


> Gibt es eine empfehlenswerte Seite wo die Ursache meines Fehlers erklärt wird?


Ich glaube nicht, dass es eine gute Idee ist, jetzt zu recherchieren. Du solltest lieber versuchen, deinen Code zu verstehen.


----------



## Alpinwhite (31. Okt 2017)

Das Problem ist dass wir im Studium solche Sachen nicht lernen. Die Vorlesungen handeln von den Einzelnen Möglichkeiten und im Praktikum sollen wir Programme erstellen ohne vorher jemals eins gemacht zu haben.
Das mit den geschweiften Klammern haben wir noch nichtmal angesprochen, dass manche Schleifen ineinander laufen und welchen Zweck das hat.
Und auch der Schreibtischtest bringt mich gerade nicht weiter, weil ich wie gesagt nicht wüsste wie ich es sonst machen soll.
Ich habe keine Ahnung warum das Programm beendet wenn man zuerst eine größere und dann eine kleinere Zahl eingibt.


----------



## Javinner (31. Okt 2017)

Was studierst du, wenn ich fragen darf?


----------



## Alpinwhite (31. Okt 2017)

Javinner hat gesagt.:


> Was studierst du, wenn ich fragen darf?


User experience Design also kein Informatik. Wir haben nur 40% Informatik.


----------



## Javinner (31. Okt 2017)

Hier hast du ein Grundgerüst, alles funktioniert und du kannst es mit mehr und besseren Textausgaben ausstatten.
Spiel etwas damit rum. Ich lege dir ans Herz, zumindest bis Kapitel 5 des Buches "Java ist auch eine Insel" zu lesen!
Ehrlich, ich hoffe, du erkennst selbst: das ist nicht gut!

```
package ratespiel;

import java.util.Scanner;

public class RateSpiel
{

    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        int versuche = 4;
        boolean erraten = false;
        int geheimzahl = zufallsGenerator();

        while (versuche > 0 && !erraten) {
            int zahl = scanner.nextInt();
            if (zahl == geheimzahl) {
                System.out.println("Erraten, Gratuliere!");
                erraten = true;
            } else
            {
                System.out.printf("Eingegebene Zahl %d ist leider nicht die Richtige%n", zahl);
            }
            versuche--;
        }
    }

    /**
     * generiert und liefert eine Zufallszahl;
     *
     * @return Zufallszahl
     */
    static int zufallsGenerator()
    {
        return (int) (Math.random() * (10));
    }
}
```


----------



## Meniskusschaden (31. Okt 2017)

Alpinwhite hat gesagt.:


> Das Problem ist dass wir im Studium solche Sachen nicht lernen.


Und da haben wir ihn wieder: den armen Studenten, dem man einfach nichts beibringt. Es liegt doch in deiner Hand, was du lernst. Im Studium muss man sich die Inhalte selbst erarbeiten. Darum geht es doch gerade.


Alpinwhite hat gesagt.:


> Die Vorlesungen handeln von den Einzelnen Möglichkeiten und im Praktikum sollen wir Programme erstellen ohne vorher jemals eins gemacht zu haben.


Genau. Man lernt die Grundlagen und wendet sie an.


Alpinwhite hat gesagt.:


> Das mit den geschweiften Klammern haben wir noch nichtmal angesprochen, dass manche Schleifen ineinander laufen und welchen Zweck das hat.


Ich nehme an, mit ineinander laufenden Schleifen meinst du verschachtelte Schleifen. Die kommen hier doch gar nicht vor. Du brauchst nur eine Schleife. Und die drei Schleifen, die du verwendest, sind nicht verschachtelt. Die zweite beginnt erst, nachdem die erste beendet wurde und die dritte beginnt erst, nachdem die zweite abgeschlossen wurde.


Alpinwhite hat gesagt.:


> Und auch der Schreibtischtest bringt mich gerade nicht weiter, weil ich wie gesagt nicht wüsste wie ich es sonst machen soll.


Es ist auch erst einmal nicht wichtig, dass du nicht weißt, wie du es machen sollst. Selbst wenn du jetzt eine alternative Lösung wüsstest, wäre doch dein wichtigeres Problem noch nicht gelöst, nämlich dass du offenbar noch ein Verständnisproblem hast. Das solltest du erst einmal lösen.


Alpinwhite hat gesagt.:


> Wir haben nur 40% Informatik.


Das ist ja fast mehr Informatik als im Informatikstudium. Wenn so viel Informatik gefordert ist, musst du solche einfachen Probleme unbedingt selbstständig lösen können.


----------



## Meniskusschaden (31. Okt 2017)

Alpinwhite hat gesagt.:


> Und auch der Schreibtischtest bringt mich gerade nicht weiter, weil ich wie gesagt nicht wüsste wie ich es sonst machen soll.


Du hast doch offenbar eine Vorstellung davon, was dein Programm macht. Sonst würdest du ja nicht erwarten, dass es funktioniert. Die Fakten zeigen aber, dass es nicht funktioniert. Also gibt es eine Diskrepanz zwischen deinem gedanklichen Modell und der Realität. Mit dem Schreibtischtest kannst du feststellen, wo die beiden voneinander abweichen. Danach hast du bessere Chancen, eine Lösung zu finden.


----------



## Xyz1 (31. Okt 2017)

Evtl hilft ja das erstmal beim Verständnis:


----------



## Dukel (31. Okt 2017)

Woher kam der Code? Hast du den selbst erstellt? Was hast du dir dabei gedacht?


----------



## Xyz1 (31. Okt 2017)

@Dukel , wen meinst du denn damit? Wenn etwas nicht eindeutig klar ist, immer die betreffenden Personen nennen. Habe das Flow Chart Diagramm selber erstellt....

Es soll den Programmfluss verdeutlichen, Quelltext ist hier wahrs nicht erwünscht. Die Schreibweise ist so auch nicht unüblich.


----------



## Javinner (31. Okt 2017)

DerWissende hat gesagt.:
			
		

> Habe das Flow Chart Diagramm selber erstellt


Womit, wenn ich fragen darf?


----------



## Xyz1 (31. Okt 2017)

Javinner hat gesagt.:


> Womit,


Mit dem hier: http://www.flowgorithm.org/ (hoffentlich etwas Werbung erlaubt).


----------



## Dukel (31. Okt 2017)

Ich meinte Alpinwhite.


----------



## Javinner (1. Nov 2017)

DerWissende hat gesagt.:


> Mit dem hier: http://www.flowgorithm.org/ (hoffentlich etwas Werbung erlaubt).


Vielen Dank!, danach habe ich schon länger gesucht. Hatte bis zum Dato immer den Hamstersimulator miteinbezogen, jedoch ist dieser etwas sperrig in Handhabung.


----------



## Alpinwhite (5. Nov 2017)

Habe jetzt nochmal überarbeitet nach euren Vorschlägen, funktioniert aber trotzdem noch nicht. Ich weiss nicht mehr weiter.


```
import java.util.Random;


public class Zahlenratenwhile2 {

    public static void main (String[] args) {
   
   
    int benutzerZahl;
    Random r = new Random();
    int random_number = r.nextInt(20) + 1;
    int Versuche=3;
    int i=2;
   
    System.out.println("Du hast 4 Versuche, um die Zahl zu erraten!");
    System.out.println("Versuch 1:");
    System.out.println("Dein Tipp:");
    benutzerZahl= Input.readInt();
   
   
   
    while (Versuche>0) {
        if (benutzerZahl<random_number) {
       
        System.out.println("Die gesuchte Zahl ist groeßer!");
        System.out.println("Versuch " + i + ":");
        System.out.println("Dein Tipp:");
        i++;
        benutzerZahl= Input.readInt();
        Versuche--;
        } else if
            (benutzerZahl>random_number) {
           
            System.out.println("Die gesuchte Zahl ist kleiner!");
            System.out.println("Versuch " + i + ":");
            System.out.println("Dein Tipp:");
            i++;
            benutzerZahl= Input.readInt();
            Versuche--;
           
        } else if
            (benutzerZahl<0 || benutzerZahl>20) {
           
            System.out.println("Bitte gib eine Zahl zwischen 0 und 20 ein");
            System.out.println("Du hast 4 Versuche, um die Zahl zu erraten!");
            System.out.println("Versuch 1:");
            System.out.println("Dein Tipp:");
            benutzerZahl= Input.readInt();
        }
    }
    }   
}
```


----------



## Javinner (5. Nov 2017)

Ich habe mir die Mühe gemacht und dein Programm etwas umgestaltet:

```
package alpinwhite;

import java.util.Random;
import java.util.Scanner;

public class Alpinwhite
{

    public static void main(String[] args)
    {

        Scanner scanner = new Scanner(System.in);
        Random r = new Random();
        int benutzerZahl;
        int random_number = r.nextInt(20) + 1;
        int versuch = 3;
        int i = 1;
        //Dient allene den Informationszwecken
        //Soll im fertigen Programm geloescht werden
        System.out.println("Gesuchte Zahl: " + random_number);

        System.out.printf("Du hast %d Versuche, um die Zahl zu erraten!%n", versuch);

        while (versuch > 0) {
            System.out.println("Dein Tipp:");
            System.out.printf("Versuch %d:%n", i);
            benutzerZahl = scanner.nextInt();

            if (benutzerZahl < 0 || benutzerZahl > 20) {
                System.out.println("Bitte gib eine Zahl zwischen 0 und 20 ein");
            } else if (benutzerZahl < random_number) {
                System.out.println("Die gesuchte Zahl ist groeßer!");
            } else if (benutzerZahl > random_number) {
                System.out.println("Die gesuchte Zahl ist kleiner!");
            } else if (benutzerZahl == random_number) {
                System.out.printf("Gratuliere! Gesuchte Zahl war: %d%n", random_number);
                  return; //Nachtraeglich geaendert
            }
            i++;
            versuch--;
        }
    }
}
/** Konsolenausgabe */
Gesuchte Zahl: 19
Du hast 3 Versuche, um die Zahl zu erraten!
Dein Tipp:
Versuch 1:
18
Die gesuchte Zahl ist groeßer!
Dein Tipp:
Versuch 2:
20
Die gesuchte Zahl ist kleiner!
Dein Tipp:
Versuch 3:
19
Gratuliere! Gesuchte Zahl war: 19
```

Das Programm ist jedoch noch fehlerhaft, denn, wenn die Zahl außerhalb des Zahlenbereiches liegen sollte,
soll das Programm an der Stelle so lange verbleiben, bis a) die neue Zahl im Zahlenbereich liegt oder b) eine Abbruchanweisung kommt. Ebenso hast du in deinem Programm eine "Erraten"-Bedingung ausgelassen, siehe mein Vorschlag. Zudem sollte die Abfolge eine Richtige sein, so, dass das Programm vorgegebene Stufen abläuft und alles Schritt für Schritt prüft.

edit: Des weiteren scheint mir bei deiner Vorgehensweise eher die for-Schleife das Mittel der Wahl zu sein, weil du ja eben die Versuche mitzählst, mit der for-Schleife hättest du eine Variable dir sparen können.

Nichts für Ungut, dafür, dass du ca. 40% Informatik hast, müsstest du dich viel mehr reinknien!
Das ist definitiv ein Anfängerstoff, welches man aus dem FF kennen muss.


----------



## Alpinwhite (6. Nov 2017)

ne sorry ich glaub das wird nichts mehr. Sitze schon wieder Stunden davor. Warum funktioniert das nicht?


```
import java.util.Random;


public class Zahlenratenwhile2 {

    public static void main (String[] args) {
  
  
    int benutzerZahl;
    Random r = new Random();
    int random_number = r.nextInt(20) + 1;
    int versuche=4;
    int i=1;

  
    System.out.println("Du hast 4 Versuche, um die Zahl zu erraten!");
    System.out.println("Versuch:" + i);
    System.out.println("Dein Tipp:");
    benutzerZahl= Input.readInt();
  
  
  
  

      
      
      
      
      
          
          
            while (versuche>0) {
          
            benutzerZahl= Input.readInt();
      
                if (benutzerZahl<random_number) {
      
                versuche--;
                System.out.println("Die gesuchte Zahl ist groeßer!");
                i++;
                System.out.println("Versuch " + i + ":");
                System.out.println("Dein Tipp:");
              
  
                } else if
                (benutzerZahl>random_number) {
          
                versuche--;
                System.out.println("Die gesuchte Zahl ist kleiner!");
                i++;
                System.out.println("Versuch " + i + ":");
                System.out.println("Dein Tipp:");
          
      
                } else if
                (benutzerZahl==random_number) {
                System.out.println("Sie haben die Zufallszahl erraten");
                break;
                } else if (benutzerZahl<0 || benutzerZahl>20) {
          
                System.out.println("Bitte gib eine Zahl zwischen 0 und 20 ein");
                System.out.println("Versuch" + i);
                System.out.println("Dein Tipp:");
          
                }
                }
          
                if (versuche==0) {
                System.out.println("Keine Versuche mehr");
                }
    }
}
```


----------



## Meniskusschaden (6. Nov 2017)

Alpinwhite hat gesagt.:


> Warum funktioniert das nicht?


Ich sehe eigentlich nur noch zwei Fehler, weiß deshalb aber nicht, welchen du meinst. Wie äußert er sich denn?


Alpinwhite hat gesagt.:


> Sitze schon wieder Stunden davor.


Mit einem Schreibtischtest würden sich übrigens beide Fehler in wenigen Minuten finden lassen. Hast du es schon mal versucht?


----------



## Javinner (7. Nov 2017)

> ich glaub das wird nichts mehr



Meine Hoffnung ist diesbezüglich ebenso getrübt! 
Obwohl man dir mehrmals die Grundlösung deines Problems offengelegt hat, verbeißt du dich nach wie vor 
in deiner Vorgehensweise, welche so nicht funktionieren kann! Also wozu dann weitere Beiträge, wenn du 
fleißig jeden Vorschlag ignorierst und eh das machst, was du für richtig hältst?! 
Als letzte Hilfestellung zu diesem Problem:
- die Reihenfolge deiner Bedingungen sollte eine andere sein(siehe mein Vorschlag)
- die Variablen `versuche, i` sollten am Ende der Schleife ein Mal für alle behandelt werden.

Ganz nebenbei: die neue "Insel" ist draußen, die 50€ würde ich hier investieren!
https://www.rheinwerk-verlag.de/java-ist-auch-eine-insel_4468/ 
Das elektronische Buch steht sogar als Online, PDF, ePub und Mobi zu Verfügung und man kann mit einer Lizenz alle drei auf sein Rechner laden. 

Viel Erfolg!


----------

