CS_LEVEL_5_SOLUTION - OnlyCook/abitur-elite-code GitHub Wiki

Level 5 – Musterlösung: Algorithmus: Das Älteste Tier

Lösung

public class Gehege
{
    private List bewohner;

    public Gehege()
    {
        this.bewohner = new List();
    }

    public Tier ErmittleAeltestes()
    {
        if (bewohner.Count == 0) return null;

        Tier aeltestes = bewohner[0];
        foreach (Tier t in bewohner)
        {
            if (t.GetAlter() > aeltestes.GetAlter())
            {
                aeltestes = t;
            }
        }
        return aeltestes;
    }
}

public class Tier
{
    private int alter;

    public Tier(int alter)
    {
        this.alter = alter;
    }

    public int GetAlter()
    {
        return alter;
    }
}

Erklärung

Strategie: Das Maximum in einer Liste finden

ErmittleAeltestes() ist ein klassischer Suchalgorithmus, der das Maximum einer Liste findet. Das Grundprinzip funktioniert immer gleich – egal ob man das älteste Tier, das schwerste Paket oder die höchste Punktzahl sucht:

  1. Nimm das erste Element als vorläufigen Kandidaten.
  2. Geh die gesamte Liste durch.
  3. Ist das aktuelle Element „besser" als der bisherige Kandidat? → Kandidat ersetzen.
  4. Am Ende hat der Kandidat das gesuchte Maximum.

Sonderfall: Leere Liste

if (bewohner.Count == 0) return null;

Bevor der Algorithmus startet, muss geprüft werden, ob die Liste überhaupt Elemente enthält. Wäre die Liste leer und man würde trotzdem bewohner[0] aufrufen, gäbe es einen Laufzeitfehler (IndexOutOfRangeException).

Ist die Liste leer, wird sofort null zurückgegeben – die Methode bricht an dieser Stelle ab, der Rest wird nicht mehr ausgeführt. Im Abitur kostet das Vergessen dieser Prüfung häufig Punkte.


Den Startkandidaten setzen

Tier aeltestes = bewohner[0];

Der erste Eintrag der Liste wird als Ausgangspunkt genommen. bewohner[0] greift per Index auf das erste Element zu – das ist sicher, weil die leere Liste bereits oben abgefangen wurde.

aeltestes ist eine lokale Variable vom Typ Tier. Sie speichert nicht eine Kopie des Tieres, sondern eine Referenz auf dasselbe Objekt, das auch in der Liste steckt.


Die foreach-Schleife

foreach (Tier t in bewohner)
{
    if (t.GetAlter() > aeltestes.GetAlter())
    {
        aeltestes = t;
    }
}

foreach durchläuft die Liste von Anfang bis Ende. In jedem Durchlauf steht das aktuelle Element in der Variable t.

Die if-Bedingung vergleicht das Alter des aktuellen Tieres mit dem des bisherigen Kandidaten. Ist t älter, wird aeltestes auf t gesetzt – der Kandidat wird also laufend durch ein besseres ersetzt, falls eines gefunden wird.

Wichtig: Es wird > und nicht >= verwendet. Das bedeutet: Gibt es mehrere Tiere mit dem gleichen Höchstalter, gewinnt das erste gefundene – spätere mit gleichem Alter überschreiben es nicht. Das entspricht genau der Aufgabenstellung.


Ergebnis zurückgeben

return aeltestes;

Nach der Schleife zeigt aeltestes auf das Tier mit dem höchsten Alter in der gesamten Liste. Es wird direkt zurückgegeben – der Rückgabetyp der Methode ist Tier, also ein vollständiges Objekt, nicht nur ein einzelner Wert.


Ablauf an einem Beispiel

Angenommen, die Liste enthält drei Tiere mit den Altern [4, 9, 6]:

Schritt t.GetAlter() aeltestes.GetAlter() Bedingung t > aeltestes aeltestes wird
Start 4 (bewohner[0]) Tier mit Alter 4
1 4 4 Tier mit Alter 4
2 9 4 Tier mit Alter 9
3 6 9 Tier mit Alter 9

Rückgabe: das Tier mit Alter 9.