# Erklärung static boolean



## dt-schulte (21. Sep 2015)

Guten Abend,

ich benötige eine Erklärung zu einem Program. Ich verstehe nicht so recht, was es macht.
Es geht um einen Zufallsgenerator, der die Lottozahlen ziehen soll.

Die Schleife zum Ziehen der Zahlen sieht so aus:

```
for (i=0;i<Lotto.length; ) {
      gezogen = generator.nextInt(49)+1;
      if (!isIntInArray(gezogen,Lotto)) {
        Lotto[i] = gezogen;
        i++;
      } // end of if
    } // end of for
```

Das isIntInArray verweißt dann hierhin:


```
static boolean isIntInArray(int pruefeZahl, int pruefArray[]) {
    boolean enthalten = false;
    for (int i=0;i<pruefArray.length ;i++ ) {
      if (pruefArray[i]==pruefeZahl) {
        enthalten=true;
      }
    } // end of if
    return enthalten;
  } // end of for
```

Ich habe gehofft, wenn ich den Programmcode Zeile für Zeile durchgehe, verstehe ich den Aufbau der Schleife, aber es will sich mir so überhaupt nicht erschließen 

Ich verstehe das im oberen Teil bei der Ziehung überprüft wird, ob die soeben gezogene Zahl im Array wiederzufinden ist, wenn nicht, dann wird sie als Lotto_ gesetzt.

Aber wie genau läuft die untere Schleife ab? Woher z.B. weiss die Schleife wie lang das Array pruefArray ist?

Ich würd mich über eine Erklärung freuen.

Danke und gruß_


----------



## Dompteur (21. Sep 2015)

dt-schulte hat gesagt.:


> _Aber wie genau läuft die untere Schleife ab? Woher z.B. weiss die Schleife wie lang das Array pruefArray ist?_


In Java kannst du für jedes Array die Länge abfragen. Hier handelt es sich aber um die Länge, mit der das Array erzeugt wurde und nicht um den bereits belegten Teil des Arrays.
Das heißt, dass beim ersten Aufruf das Array mit lauter (integer) Nullen belegt ist. Da Lottozahlen immer größer Null sind, ist das kein Problem. Bei den späteren Aufrufen sind die ersten Stellen des Arrays mit "gültigen" gezogenen Zahlen belegt und am Ende folgen Nullen. Aus diesem Grund kann man bei diesem Problem immer das ganze Array durchsuchen.


----------



## strußi (21. Sep 2015)

die untere schleife erhält die info über die länge durch das .length
-- es gibt dir an, wieviele zellen dein array hat. Dabei ist noch zu beachten wenn es z.B. 6 felder hat, dass die feldindices von 0-5 laufen, deshalb steht in der for-schleife auch i <pruefArray.length und klein <= das würde zu einer IndexOutOfBounceException führen ;-)

static boolean ist eine klassenmethode ohne objekterzeugen nutzbar ist. die methode liefert dir als ergebnis eines methodendurchlaufs ein boolean-wert (true/false) zurück 

mal angenommen Lotto[] ist ein int[] sollte der variablenname klein, also "lotto" geschrieben werden.

dein erster code-block zieht dir zufallszahlen von 1-49, kann alternativ in einer while-schleife gemacht werden, aber das ist wurst.
in der 3. zeile wird mittels der methode "isIntInArray" geprüft ob die gezogene zahl noch nicht vorhanden ist. da diese methode einen rückgabewert vom typ boolean hat läuft das wie folgt.
da kommt der zweite codeblock in spiel, der dir ein boolwert auf die abfrage liefert
initalisiert wird der bool mit false, findet die methode keine übereinstimmung wird false an deine ziehungsmaschine zurückgegeben
if( !true) {...} nicht true, was dem rückgabewert false entspricht, wird der wert in das lotto[] gepackt und eine neue zahl wird gezogen.
wird aber ein true zurückgegeben weil der wert vorhanden ist, wird sofort eine neue zahl gezogen.

im zweiten codeblock kann man nach dem enthalten =true; noch eine zeile einfügen mit "break;" was zu einem abbruch bei der suche nach doppelten zahlen führt.


----------



## dt-schulte (21. Sep 2015)

Hey danke bis hier hin schonmal 

@strußi das es die Info aus dem length bekommt, das war mir soweit klar.. aber mir ist/ war nicht klar, wo length definiert wird. Normalerweise sieht mein Codeschnippsel dann irgendwie so aus

```
int lotto[] = new int[6]
```

hier sehe ich aber überhaupt keine Bezugsgröße.

Aber, nach dem ersten beiden Erklärungen vermute ich mal, das die größe pruefArray = Lotto.length bis zum Wert i der ersten Schleife ist und dadurch die Länge gegeben ist. 

Auch der Inhalt wird 1: 1 aus dem Array Lotto genommen. Stimme die beiden Annahmen?


Dann startet die Schleife bei i=0 und prüft i++ die bereits geschriebenen Werte im pruefArray. Sind die alle ungleich, dann ist gut, findet sich aber eine Überschneidung dann wird der Wert verworfen, es kommt die Meldung "false" zurück  an die erste "if Schleife". 
i wird dort nicht hochgezählt, es wird eine neue Zahl ermittelt, geschrieben geprüft etc.
Wenn jetzt der wert true kommt, Bedeutet die Zahl ist nicht enthalten, dann läuft die obere Schleife weiter, zählt i einen hoch bis i= <Lotto.length

Passt das soweit?


----------



## Dompteur (22. Sep 2015)

"isIntInArray" ist eine Methode mit 2 Parametern (int pruefeZahl, int pruefArray[]).
Eine Methode kommt an 2 Stellen vor :
* bei der Deklaration : hier steht, was die Methode macht.
* beim Aufruf : hier wird die Methode in den Programmfluss eingebungen. Das kann im Programm an mehreren Stellen passieren.

Beim Aufruf "isIntInArray(gezogen,Lotto))" werden Variablem übergeben:
gezogen --> pruefeZahl
Lotto --> pruefArray
Diese Abbildung gilt während der ganzen Ausführung der Methode.

Da nun Lotto als Array mit 6 int-Werten definiert worden ist, kannst du dies innerhalb der Methode über den Parameter pruefArray.length ebenfalls abfragen.


----------



## strußi (22. Sep 2015)

@dt-schulte *IF-Schleife gibt es nicht, ist eine ANWEISUNG*
Einmaliger Durchlauf, danach ist die Anweisung fertig, kann aber wiederholt in einer der Schleifen (while, for, for-each, do-while) aufgerufen werden. Falls ich eine vergessen habe, dürft ihr sie behalten. ;-)


dt-schulte hat gesagt.:


> Dann startet die Schleife bei i=0 und prüft i++ die bereits geschriebenen Werte im pruefArray. Sind die alle ungleich, dann ist gut, findet sich aber *eine Überschneidung* dann wird der Wert verworfen, es kommt die Meldung *"false"* zurück an die erste "if Schleife".
> i wird dort nicht hochgezählt, es wird eine neue Zahl ermittelt, geschrieben geprüft etc.
> Wenn jetzt der wert *true *kommt, Bedeutet die Zahl ist *nicht enthalten*, dann läuft die obere Schleife weiter, zählt i einen hoch bis i= <Lotto.length



hier ist dein Denkfehler. Wenn keine Übereinstimmung gefunden wird kommt false als returnvalue und deshalb das ! in der *if-Anweisung*
bei einer Übereinstimmung wird das true zurückgegeben, was mit !true (not true) als nicht zutreffendes Ereignis erkannt wird und deshalb zu einer neuen zufallszahl verhilft.


----------



## dt-schulte (22. Sep 2015)

@strußi ich werde es in Zukunft beherzigen  

Aber, ich habe es begriffen  Von daher sag ich ganz herzlichen Dank. Danke fürs erklären und danke für die Geduld die hier aufgebracht wird


----------

