CS_LEVEL_14_SOLUTION - OnlyCook/abitur-elite-code GitHub Wiki

Level 14 – Musterlösung: Der Elternbrief

Lösung

public class Schule
{
    private List<Klasse> klassen;
 
    public Schule()
    {
        this.klassen = new List<Klasse>();
    }
 
    public void AddKlasse(Klasse k)
    {
        klassen.Add(k);
    }
 
    public string ErstelleWarnungen()
    {
        string bericht = "";
 
        foreach (Klasse k in klassen)
        {
            foreach (Schueler s in k.GetSchueler())
            {
                if (s.GetNote() < 5)
                {
                    bericht += $"Warnung an Eltern von {s.GetName()} (Klasse {k.GetBezeichnung()}): Note {s.GetNote()} ist kritisch!\n";
                }
            }
        }
 
        return bericht;
    }
}
 
public class Klasse
{
    private string bezeichnung;
    private List<Schueler> schueler;
 
    public Klasse(string bez)
    {
        this.bezeichnung = bez;
        this.schueler = new List<Schueler>();
    }
 
    public void AddSchueler(Schueler s)
    {
        schueler.Add(s);
    }
 
    public string GetBezeichnung()
    {
        return bezeichnung;
    }
 
    public List<Schueler> GetSchueler()
    {
        return schueler;
    }
}
 
public class Schueler
{
    private string name;
    private int note;
 
    public Schueler(string name, int note)
    {
        this.name = name;
        this.note = note;
    }
 
    public string GetName()
    {
        return name;
    }
 
    public int GetNote()
    {
        return note;
    }
}

Erklärung

Das Abschlusslevel von Sektion 3

Dieses Level fasst alles zusammen, was du in Sektion 3 gelernt hast: mehrere Klassen mit Beziehungen untereinander, verschachtelte Navigation und bedingte Logik. Neu hinzu kommen die verschachtelte Schleife sowie der String-Aufbau mit Interpolation.

Die Struktur folgt der bekannten Kette – diesmal drei Ebenen tief:

Schule  →  List<Klasse>  →  List<Schueler>

Die Datenklassen Klasse und Schueler

Beide Klassen enthalten keine neue Logik – sie speichern Daten und stellen sie über Getter-Methoden bereit. Schueler hat jetzt zusätzlich ein name-Attribut, das für den Warnungstext gebraucht wird. Klasse verwaltet ihre Schüler intern in einer Liste und gibt sie über GetSchueler() zurück.


ErstelleWarnungen() – die Kernmethode

Verschachtelte Schleifen

foreach (Klasse k in klassen)
{
    foreach (Schueler s in k.GetSchueler())
    {
        ...
    }
}

Um jeden einzelnen Schüler der gesamten Schule zu erreichen, braucht man zwei ineinander verschachtelte Schleifen. Die äußere Schleife geht durch alle Klassen, die innere durch alle Schüler der jeweiligen Klasse. Erst wenn beide Schleifen kombiniert werden, hat man Zugriff auf jeden Schueler – und gleichzeitig auf das Klasse-Objekt, zu dem er gehört.

Das ist wichtig: In der inneren Schleife brauchen wir sowohl s.GetName() und s.GetNote() (vom Schüler) als auch k.GetBezeichnung() (von der Klasse). Da k in der äußeren Schleife definiert wurde, ist es in der inneren Schleife weiterhin verfügbar.

String-Interpolation

bericht += $"Warnung an Eltern von {s.GetName()} (Klasse {k.GetBezeichnung()}): Note {s.GetNote()} ist kritisch!\n";

Das $ vor dem Anführungszeichen kennzeichnet einen interpolierten String. Alles in {...} wird zur Laufzeit ausgewertet und direkt in den String eingesetzt – deutlich lesbarer als das manuelle Verketten mit +.

Das \n am Ende erzeugt einen Zeilenumbruch, sodass jede Warnung in einer eigenen Zeile steht.

Hinweis: Im Abitur (Java) wird dafür oft + zur Verkettung verwendet. In C# ist die $-Interpolation die modernere und übersichtlichere Variante – beide sind korrekt.

String schrittweise aufbauen

bericht += $"Warnung an Eltern von {s.GetName()}";
bericht += $" (Klasse {k.GetBezeichnung()}):";		// Achte auf Leerzeichen
bericht += $" Note {s.GetNote()} ist kritisch!\n";	// Stets eine Zeile (nicht 3), '\n' fängt explizit die Nächste an

Mit += wird jeder Teil einzelnd an das Ende von bericht angehängt. Am Ende gibt die Methode den vollständig zusammengebauten String zurück. Gibt es keine gefährdeten Schüler, bleibt bericht leer (string bericht = "";) – das ist das korrekte Verhalten, kein Sonderfall, den man extra abfangen müsste.

Die Bedingung: < 5

if (s.GetNote() < 5)

Laut Aufgabe sind Schüler mit weniger als 5 Punkten gefährdet. < 5 schließt Schüler mit genau 5 Punkten also aus – sie haben gerade noch bestanden. Vergleiche das mit Level 11, wo > 4 dasselbe Intervall aus der anderen Richtung beschrieben hat: beide Bedingungen sind äquivalent.

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