MINT lernen

Reihungen durchlaufen

Wie findet ein Programm unter hundert Ergebnissen das beste, ohne hundertmal dieselbe Zeile zu schreiben?

1

Jedes Element genau einmal

Ein Handballteam notiert die Tore seiner letzten sechs Spiele. Jede Auswertung muss jedes Element einmal ansehen — das erledigt eine Zählschleife, deren Zähler zugleich der Index ist.

int[] tore = {27, 31, 24, 29, 33, 26};
for (int i = 0; i < tore.length; i++) {
    System.out.println("Spiel " + (i + 1) + ": " + tore[i]);
}
  • Zählschleife:i läuft von 0 bis tore.length − 1 und dient als Index.
  • Bedingung:i < tore.length — bei i = 6 endet die Schleife, bevor tore[6] gelesen wird.
  • Rückwärts:for (int i = tore.length - 1; i >= 0; i--) beginnt beim letzten Element.
  • Struktogramm:Zählschleife mit dem Kopf „für i von 0 bis Länge von tore − 1“.

Wer nur lesen will, kommt ohne Index aus: Die for-each-Schleife liefert nacheinander jeden Wert.

for (int t : tore) {      // „für jedes t in tore“
    System.out.println(t);
}
  • for-each:durchläuft alle Elemente von vorn nach hinten; der Index bleibt verborgen.
  • Nur lesen:t ist eine Kopie des Elements — t = 0; ändert nur die Kopie, die Reihung bleibt gleich.
  • Index nötig:zum Schreiben, für Positionen oder für Nachbarn wie tore[i + 1] → Zählschleife.
2

Summe, Maximum, Anzahl

Fast jede Auswertung folgt demselben Muster: Ergebnisvariable vorbereiten, Reihung durchlaufen, Ergebnis bei jedem Element aktualisieren.

int summe = 0;
for (int i = 0; i < tore.length; i++) {
    summe = summe + tore[i];
}
double schnitt = (double) summe / tore.length;   // 28.33...
  • Summe:Startwert 0, in jedem Durchlauf summe = summe + tore[i];
  • Mittelwert:Summe geteilt durch tore.length — Achtung bei zwei int-Werten.
  • Maximum:Startwert tore[0], Schleife ab i = 1; ist tore[i] > max, wird max = tore[i];
  • Minimum:genauso, nur mit tore[i] < min.
  • Zählen:Startwert 0; anzahl++ nur, wenn die Bedingung gilt, z. B. tore[i] >= 30.
Herleitung:
\(\text{summe}=27+31+24+29+33+26=170\)
| addieren
Die Schleife addiert alle sechs Elemente.
\(170\;/\;6=28\)
| int / int
Beide Operanden sind ganze Zahlen: Java dividiert ganzzahlig, der Rest \(2\) fällt weg (\(170 \bmod 6 = 2\)).
\((\text{double})\,170\;/\;6\approx28{,}33\)
Ergebnis
Ist ein Operand ein double, bleibt der Nachkommaanteil erhalten.

Wähle oben einen Algorithmus und führe die Schleife mit „Einzelschritt“ oder ▶ aus. Beobachte den Zeiger i, die markierte Codezeile und die wachsende Tracetabelle. Ändere dann einen Wert (Kästchen anklicken, dann ↑/↓ oder „Wert −1“/„Wert +1“) und sage vorher, wie sich das Ergebnis ändert.

Schleife im Einzelschritt


      

Halte fest: Die Schleife endet mit i = tore.length — dieser Index wird nur geprüft, nie gelesen. Das Maximum braucht bei n Elementen genau n − 1 Vergleiche, weil tore[0] schon der Startwert ist.

Merke

for (int i = 0; i < a.length; i++) besucht jedes Element genau einmal  ·  Startwert Summe und Zähler: 0  ·  Startwert Maximum und Minimum: a[0]

3

Allgemeine Hinweise

< statt <=

Mit i <= tore.length läuft die Schleife einmal zu oft und liest tore[6] — Abbruch mit ArrayIndexOutOfBoundsException. Die Länge selbst ist nie ein gültiger Index.

Maximum nicht mit 0 starten

Bei lauter negativen Werten, etwa Meerestiefen unter null, bliebe max = 0 stehen, obwohl 0 gar nicht vorkommt. Der erste Wert a[0] ist immer ein sicherer Startwert.

Drei Fragen vor dem Code

Womit startet das Ergebnis? Was passiert bei jedem Element? Was steht am Ende fest? Wer diese Fragen beantwortet, schreibt Struktogramm und Java fast von selbst.

Videos