Songs in der Playlist-App
AFB I–IIEmre programmiert eine Playlist-App. Bevor er Code schreibt, plant er die Klasse Song als Klassenkarte. Die Dauer eines Songs wird in Sekunden gespeichert.
- - titel: Zeichenkette
- - kuenstler: Zeichenkette
- - dauer: Ganzzahl
- - favorit: Wahrheitswert
- c Song(titel: Zeichenkette, kuenstler: Zeichenkette, dauer: Ganzzahl)
- + abspielen()
- + markieren()
- + getDauer(): Ganzzahl
- + laengerAls(sekunden: Ganzzahl): Wahrheitswert
- Beschreibe den Aufbau der Klassenkarte. Gehe auf die drei Fächer und die Zeichen
-,+undcein. - Wende die Übersetzungsregeln an und schreibe das Java-Grundgerüst der Klasse: Attribute, Konstruktor und alle Methodenköpfe. Die Rümpfe von
abspielenundmarkierendürfen leer bleiben. - 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)
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)
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.
Das Zahlenschloss am Spind
AFB II–IIIFü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.
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;
}
}
pruefe ist nur für den internen Gebrauch.- + code: int
- - offen: Wahrheitswert
- - versuche
- c Zahlenschloss()
- + oeffnen(): Wahrheitswert
- + schliessen()
- - getVersuche(): Ganzzahl
- + pruefe(eingabe: Ganzzahl): Wahrheitswert
- Zeichne die richtige Klassenkarte zu Material 1.
- Überprüfe Mias Klassenkarte Zeile für Zeile. Nenne jeden Fehler und seine Korrektur.
- Erweitere die Klassenkarte um die gewünschte Sperre und setze die Änderung in der Methode
oeffnenin Java um. Begründe, welche neuen Elemente privat und welche öffentlich sind.
Hinweise
Hinweis zu Aufgabe a)
private → -, public → +, Java-Typ → NDS-Typ hinter den Doppelpunkt. Rümpfe und return-Zeilen gehören nicht ins Diagramm.Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
- - 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 Zeile | Fehler → 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.
