MINT lernen

Klassendiagramme

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont: vom Diagramm zum Code und vom Code zum Diagramm.

Dein Fortschritt:
0 / 0 Aufgaben
1

Songs in der Playlist-App

AFB I–II

Emre programmiert eine Playlist-App. Bevor er Code schreibt, plant er die Klasse Song als Klassenkarte. Die Dauer eines Songs wird in Sekunden gespeichert.

Material: Klassenkarte Song
Song
  • - titel: Zeichenkette
  • - kuenstler: Zeichenkette
  • - dauer: Ganzzahl
  • - favorit: Wahrheitswert
  • c Song(titel: Zeichenkette, kuenstler: Zeichenkette, dauer: Ganzzahl)
  • + abspielen()
  • + markieren()
  • + getDauer(): Ganzzahl
  • + laengerAls(sekunden: Ganzzahl): Wahrheitswert
Emres Planung in niedersächsischer Notation
  1. Beschreibe den Aufbau der Klassenkarte. Gehe auf die drei Fächer und die Zeichen -, + und c ein.
  2. Wende die Übersetzungsregeln an und schreibe das Java-Grundgerüst der Klasse: Attribute, Konstruktor und alle Methodenköpfe. Die Rümpfe von abspielen und markieren dürfen leer bleiben.
  3. Interpretiere die Zeile + laengerAls(sekunden: Ganzzahl): Wahrheitswert: Was leistet die Methode vermutlich in der App? Gib einen Aufruf für einen Song von 3:30 Minuten mit dem Ergebnis an.

Hinweise

Hinweis zu Aufgabe a)
Oben der Name, dann …? Was bedeutet das Zeichen vor jeder Zeile für den Zugriff von außen?
Hinweis zu Aufgabe b)
- wird private, + wird public. Der Typ wandert nach vorn: - dauer: Ganzzahl → private int dauer;. Ohne Rückgabetyp steht void. Der Konstruktor hat keinen Rückgabetyp.„Anwenden“ heißt: die bekannten Regeln Zeile für Zeile auf diese Karte übertragen.
Hinweis zu Aufgabe c)
Rechne 3:30 Minuten in Sekunden um. Wofür könnte eine Playlist-App wissen wollen, ob ein Song länger als eine bestimmte Zeit ist?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

Die Karte hat drei Fächer: oben den Klassennamen Song, in der Mitte die Attribute, unten Konstruktor und Methoden. Hinter dem Doppelpunkt steht jeweils der Typ in NDS-Schreibweise (Ganzzahl, Zeichenkette, Wahrheitswert), bei Methoden der Rückgabetyp.

- bedeutet privat: Nur die Klasse selbst darf zugreifen (alle Attribute). + bedeutet öffentlich: Andere Klassen dürfen die Methode aufrufen. c kennzeichnet den Konstruktor, der beim Erzeugen eines Objekts die drei Werte übernimmt.

Erwartungshorizont zu Aufgabe b)
public class Song {
    private String titel;
    private String kuenstler;
    private int dauer;
    private boolean favorit;

    public Song(String titel, String kuenstler, int dauer) {
        this.titel = titel;
        this.kuenstler = kuenstler;
        this.dauer = dauer;
    }

    public void abspielen() {
    }

    public void markieren() {
    }

    public int getDauer() {
        return dauer;
    }

    public boolean laengerAls(int sekunden) {
        return dauer > sekunden;
    }
}

Die Rümpfe von getDauer und laengerAls dürfen auch anders sinnvoll gefüllt sein; wichtig sind Sichtbarkeit, Typen, Parameter und void bzw. Rückgabetyp.

Erwartungshorizont zu Aufgabe c)

Die Methode bekommt eine Zeit in Sekunden und liefert true, wenn der Song länger dauert, sonst false. Die App könnte so z. B. lange Songs aus einer „Kurz vor dem Unterricht“-Playlist herausfiltern.

3:30 Minuten = 210 Sekunden. Aufruf z. B. s.laengerAls(180) liefert true, denn 210 > 180.

2

Das Zahlenschloss am Spind

AFB II–III

Für eine App, die digitale Spind-Schlösser verwaltet, gibt es bereits die Klasse Zahlenschloss (Material 1). Mia hat versucht, dazu die Klassenkarte zu zeichnen (Material 2). Die Schule wünscht sich außerdem: Nach drei falschen Eingaben hintereinander soll das Schloss gesperrt sein und sich nicht mehr öffnen lassen.

Material 1: Zahlenschloss.java
public class Zahlenschloss {
    private int code;
    private boolean offen;
    private int versuche;

    public Zahlenschloss(int code) {
        this.code = code;
        offen = false;
        versuche = 0;
    }

    public boolean oeffnen(int eingabe) {
        versuche = versuche + 1;
        if (pruefe(eingabe)) {
            offen = true;
        }
        return offen;
    }

    public void schliessen() {
        offen = false;
    }

    public int getVersuche() {
        return versuche;
    }

    private boolean pruefe(int eingabe) {
        return eingabe == code;
    }
}
Die Methode pruefe ist nur für den internen Gebrauch.
Material 2: Mias Klassenkarte
Zahlenschloss
  • + code: int
  • - offen: Wahrheitswert
  • - versuche
  • c Zahlenschloss()
  • + oeffnen(): Wahrheitswert
  • + schliessen()
  • - getVersuche(): Ganzzahl
  • + pruefe(eingabe: Ganzzahl): Wahrheitswert
Mia hat mehrere Fehler gemacht.
  1. Zeichne die richtige Klassenkarte zu Material 1.
  2. Überprüfe Mias Klassenkarte Zeile für Zeile. Nenne jeden Fehler und seine Korrektur.
  3. Erweitere die Klassenkarte um die gewünschte Sperre und setze die Änderung in der Methode oeffnen in Java um. Begründe, welche neuen Elemente privat und welche öffentlich sind.

Hinweise

Hinweis zu Aufgabe a)
Übersetze rückwärts: private → -, public → +, Java-Typ → NDS-Typ hinter den Doppelpunkt. Rümpfe und return-Zeilen gehören nicht ins Diagramm.
Hinweis zu Aufgabe b)
Vergleiche jede Zeile mit deiner Karte aus a): Sichtbarkeit, Typname, Parameter, Rückgabetyp. Es sind sieben Fehler.„Überprüfen“ heißt: die Karte am Code messen und alle Widersprüche aufdecken.
Hinweis zu Aufgabe c)
„Drei falsche Eingaben hintereinander“ – das Schloss muss sich die Fehlversuche merken. Bei einer richtigen Eingabe beginnt die Zählung von vorn. Andere Klassen (z. B. die Anzeige) wollen vielleicht wissen, ob das Schloss gesperrt ist.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
Zahlenschloss
  • - code: Ganzzahl
  • - offen: Wahrheitswert
  • - versuche: Ganzzahl
  • c Zahlenschloss(code: Ganzzahl)
  • + oeffnen(eingabe: Ganzzahl): Wahrheitswert
  • + schliessen()
  • + getVersuche(): Ganzzahl
  • - pruefe(eingabe: Ganzzahl): Wahrheitswert
Erwartungshorizont zu Aufgabe b)
Mias ZeileFehler → Korrektur
+ code: int(1) code ist privat → -; (2) Java-Typ statt NDS-Typ → Ganzzahl
- versuche(3) Typ fehlt → - versuche: Ganzzahl
c Zahlenschloss()(4) Parameter fehlt → c Zahlenschloss(code: Ganzzahl)
+ oeffnen(): Wahrheitswert(5) Parameter fehlt → + oeffnen(eingabe: Ganzzahl): Wahrheitswert
- getVersuche(): Ganzzahl(6) Methode ist öffentlich → +
+ pruefe(…): Wahrheitswert(7) Methode ist privat → -

- offen: Wahrheitswert und + schliessen() sind richtig.

Erwartungshorizont zu Aufgabe c)

Neu in der Karte: - fehlversuche: Ganzzahl im Attributfach und + istGesperrt(): Wahrheitswert im Methodenfach.

private int fehlversuche;   // im Konstruktor mit 0 belegt

public boolean oeffnen(int eingabe) {
    versuche = versuche + 1;
    if (istGesperrt()) {
        return false;
    }
    if (pruefe(eingabe)) {
        offen = true;
        fehlversuche = 0;
    } else {
        fehlversuche = fehlversuche + 1;
    }
    return offen;
}

public boolean istGesperrt() {
    return fehlversuche >= 3;
}

Test mit dem Code 4711: oeffnen(1), oeffnen(2), oeffnen(3), dann oeffnen(4711) liefert viermal false, das Schloss ist gesperrt.

Begründung: fehlversuche ist privat, sonst könnte jemand den Zähler von außen auf 0 setzen und beliebig weiterraten. istGesperrt ist öffentlich, damit z. B. die Anzeige der App „gesperrt“ melden kann. Andere sinnvolle Lösungen (z. B. ein Attribut gesperrt: Wahrheitswert) sind gleichwertig.