CS_LEVEL_6_SOLUTION - OnlyCook/abitur-elite-code GitHub Wiki

Level 6 – Musterlösung: Das Warenlager (Suche)

Lösung

public class Paket
{
    private double gewicht;
    private string zielort;
 
    public Paket(string ziel, double gew)
    {
        this.gewicht = gew;
        this.zielort = ziel;
    }
 
    public double GetGewicht()
    {
        return gewicht;
    }
 
    public string GetZielort()
    {
        return zielort;
    }
}
 
public class Lager
{
    private List<Paket> pakete;
 
    public Lager()
    {
        pakete = new List<Paket>();
    }
 
    public void Hinzufuegen(Paket p)
    {
        pakete.Add(p);
    }
 
    public Paket ErmittleLeichtestes()
    {
        if (pakete.Count == 0) return null;
 
        Paket leichtestesPaket = pakete[0];
        foreach (Paket p in pakete)
        {
            if (p.GetGewicht() < leichtestesPaket.GetGewicht())
            {
                leichtestesPaket = p;
            }
        }
        return leichtestesPaket;
    }
}

Erklärung

Das Klassendiagramm umsetzen

Das Klassendiagramm gibt vor, welche Klassen, Attribute und Methoden implementiert werden müssen – und zwar exakt so wie angegeben. Das gilt für Namen, Typen und Parameter.

Die Klasse Paket hat zwei private Attribute (gewicht und zielort) sowie einen Konstruktor mit den Parametern ziel und gew. Die Reihenfolge der Parameter im Konstruktor entspricht der Angabe im Diagramm – das sollte immer eingehalten werden.

Lager verwaltet intern eine Liste von Paket-Objekten. Diese Liste wird im Konstruktor initialisiert:

pakete = new List<Paket>();

Die Methode Hinzufuegen

public void Hinzufuegen(Paket p)
{
    pakete.Add(p);
}

Diese Methode nimmt ein Paket-Objekt entgegen und fügt es der internen Liste hinzu. Sie ist der einzige Weg, wie Pakete ins Lager gelangen – das Lager kontrolliert also selbst seinen Inhalt.

Das Minimum finden: ErmittleLeichtestes()

Dieser Algorithmus funktioniert nach demselben Prinzip wie ErmittleAeltestes() aus Level 5 – nur suchen wir diesmal das Minimum statt das Maximum. Der einzige Unterschied liegt im Vergleichsoperator: statt > wird < verwendet.

if (p.GetGewicht() < leichtestesPaket.GetGewicht())
{
    leichtestesPaket = p;
}

Ist das aktuelle Paket leichter als der bisherige Kandidat, wird der Kandidat ersetzt.

Leere Liste abfangen

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

Ohne diese Prüfung würde pakete[0] bei einer leeren Liste einen Laufzeitfehler auslösen. Diese Zeile sollte immer ganz am Anfang stehen, bevor auf ein Listenelement zugegriffen wird – im Abitur kostet das Fehlen dieser Prüfung regelmäßig Punkte.

Ablauf an einem Beispiel

Angenommen, die Liste enthält drei Pakete mit den Gewichten [8.0, 3.5, 6.0]:

Schritt p.GetGewicht() leichtestesPaket.GetGewicht() Bedingung p < leichtestes leichtestesPaket wird
Start 8.0 (pakete[0]) Paket mit 8.0 kg
1 8.0 8.0 Paket mit 8.0 kg
2 3.5 8.0 Paket mit 3.5 kg
3 6.0 3.5 Paket mit 3.5 kg

Rückgabe: das Paket mit Gewicht 3.5.

⚠️ **GitHub.com Fallback** ⚠️