MINT üben

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.
Merke

Zählschleife: for (int i = 0; i < a.length; i++); i läuft von 0 bis a.length − 1 und ist zugleich der Index. Bei i = a.length endet die Schleife, bevor gelesen wird.

Rückwärts: for (int i = a.length - 1; i >= 0; i--) beginnt beim letzten Element.

for-each: for (int t : a) liefert nacheinander jeden Wert; t ist nur eine Kopie, die Reihung ändert sich nicht.

Index nötig: zum Schreiben, für Positionen oder für Nachbarn wie a[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

Muster: Ergebnisvariable vorbereiten, Reihung durchlaufen, Ergebnis bei jedem Element aktualisieren; for (int i = 0; i < a.length; i++) besucht jedes Element genau einmal.

Summe und Zähler: Startwert 0; Summe: summe = summe + a[i];; Zählen: anzahl++ nur, wenn die Bedingung gilt.

Mittelwert: Summe geteilt durch a.length; bei zwei int-Werten vorher mit (double) umwandeln.

Maximum und Minimum: Startwert a[0], Schleife ab \(i=1\); Maximum bei a[i] > max ersetzen, Minimum bei a[i] < min. Das Maximum braucht \(n-1\) Vergleiche.

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