Informatik

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 length richtig 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)?

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

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?

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

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.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Selbsttest

Rückblick

Teilbare URL erstellen

Abschnitte auswählen