Rückblick
Mit Feldern kannst du zum ersten Mal viele Werte auf einmal verwalten. Der Preis dafür ist eine neue Fehlerquelle: Indizes. Fast alles, was hier schiefgeht, geht an den Rändern schief – beim ersten oder beim letzten Element.
Das kann ich jetzt
- Ich kann ein Feld anlegen, füllen und einzelne Plätze ansprechen. (5.1)
- Ich weiß, dass der Index bei 0 beginnt, und kann
lengthrichtig benutzen. (5.1) - Ich kann den Standardkopf
for (int i = 0; i < feld.length; i++)aus dem Kopf schreiben. (5.2) - Ich kann die erweiterte for-Schleife einsetzen und sagen, wann sie nicht taugt. (5.2)
- Ich kann ein Feld verändern und zwei Werte darin tauschen. (5.3)
- Ich kann Summe, Maximum und Anzahl in einem Durchlauf bestimmen. (5.3)
Gemischte Aufgaben
Aufgabe 1: Ränder abzählen
void main() {
int[] werte = {4, 8, 15, 16, 23, 42};
IO.println(werte.length);
IO.println(werte[0]);
IO.println(werte[werte.length - 1]);
IO.println(werte[2] + werte[3]);
int summe = 0;
for (int i = 0; i < werte.length; i++) {
summe = summe + werte[i];
}
IO.println("Summe: " + summe);
int anzahl = 0;
for (int wert : werte) {
if (wert > 15) {
anzahl++;
}
}
IO.println("Anzahl: " + anzahl);
}
a) Sag alle sechs Ausgabezeilen voraus.
b) Was passiert bei werte[6]? Warum ist das kein Tippfehler, sondern ein Denkfehler?
c) Ersetze in der ersten Schleife < durch <=. Was passiert dann, und in welchem Durchlauf?
d) Warum steht in der zweiten Schleife for (int wert : werte) und nicht for (int wert : werte.length)?
Aufgabe 2: Vier Feldfehler
Untersuche jeden Ausschnitt auf Papier. Was ist falsch, und was passiert beim Ausführen?
int[] zahlen = {3, 1, 4, 1, 5};
// a)
for (int i = 1; i <= zahlen.length; i++) {
IO.println(zahlen[i]);
}
// b)
IO.println(zahlen.length());
// c)
for (int wert : zahlen) {
wert = wert * 2;
}
IO.println(zahlen[0]);
// d)
int merker = zahlen[0];
zahlen[0] = zahlen[4];
zahlen[4] = zahlen[0];
Bei welchem der vier meldet die IDE etwas, bei welchen nicht?
Tipp zu d)
Spiel den Tausch mit zwei Zetteln durch. Nach welcher Zeile ist der ursprüngliche Wert von zahlen[0] nur noch im Merker vorhanden – und wo wird er gebraucht?
Aufgabe 3: Auswertung einer Klassenarbeit
Gegeben ist ein Feld mit Punktzahlen. Schreib die Auswertung – jede Teilaufgabe als eigene Methode, so wie in Kapitel 4 gelernt.
int[] punkte = {88, 64, 41, 95, 72, 58, 100, 33};
a) int summe(int[] pWerte) – die Summe aller Werte.
b) double mittelwert(int[] pWerte) – der Durchschnitt.
c) int maximum(int[] pWerte) – der größte Wert.
d) int anzahlAb(int[] pWerte, int pGrenze) – wie viele Werte mindestens so groß sind wie die Grenze.
e) Gib alle vier Ergebnisse aus, für d) die Anzahl der Arbeiten ab 60 Punkten.
Tipp 1: Das Muster ist immer dasselbe
Alle vier Methoden folgen demselben Aufbau:
int ergebnis = ...; // sinnvoller Startwert
for (int i = 0; i < pWerte.length; i++) {
// ergebnis abhängig von pWerte[i] anpassen
}
return ergebnis;
Nur der Startwert und die Anpassung unterscheiden sich.
Tipp 2: Der Startwert beim Maximum
Mit int groesster = 0; anzufangen ist verführerisch – und falsch, sobald alle Werte negativ sind. Nimm stattdessen das erste Element als Startwert und vergleiche ab Index 1.
Tipp 3: zum Mittelwert
summe(pWerte) / pWerte.length sind zwei ganze Zahlen und damit eine Ganzzahldivision. Multipliziere mit 1.0 oder teile durch pWerte.length * 1.0.