Übungsaufgaben
Zehn Übungen zum Klicken, Ziehen und Knobeln — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du hängst, helfen dir die gestuften Tipps.
Ein Fahrradverleih wird so modelliert. Geben Sie alle Aussagen an, die zum Klassendiagramm passen.
- - ort: Zeichenkette
- - raeder: Reihung von Fahrrad
- + abstellen(f: Fahrrad): Wahrheitswert
- - nummer: Ganzzahl
- - ausleiher: Kunde
- + zurueckgeben()
- - name: Zeichenkette
- + getName(): Zeichenkette
0..12 ist eine Obergrenze, keine feste Anzahl — eine Station kann auch leer sein. 0..1 an der Kunden-Seite heißt: kein oder ein Ausleiher. Die Pfeile zeigen nach rechts; deshalb weiß ein Kunde nichts von seinem Fahrrad. Soll er es kennen, bräuchte die Linie auch zur anderen Seite eine Navigationsrichtung.Entnehmen Sie dem Klassendiagramm eines Zoos, welche Aussagen stimmen.
- - nummer: Ganzzahl
- - tiere: DynArray<Tier>
- + einsetzen(t: Tier)
- - art: Zeichenkette
- - pfleger: Tierpfleger
- + getPfleger(): Tierpfleger
- - name: Zeichenkette
- + getName(): Zeichenkette
Ordnen Sie jeder Anforderung das Attribut zu, das sie in Java umsetzt.
null-Prüfung), feste Grenze → Reihung mit dieser Länge (beim Regal bleiben freie Plätze null, beim Schachbrett sind immer alle 64 belegt), unbegrenzt → ArrayList.Im Klassendiagramm steht Playlist ——songs——> * Song; Song hat die Methode getDauer(): Ganzzahl (Sekunden). Implementieren Sie die Klasse, indem Sie die Lücken füllen — drei Bausteine bleiben übrig.
public class Playlist {
private String name;
private songs;
public Playlist(String name) {
this.name = name;
songs = ArrayList<Song>();
}
public void hinzufuegen(Song s) { songs.(s); }
public int getLaenge() {
int summe = 0;
for (int i = 0; i < songs.(); i++) {
summe = summe + songs.(i).getDauer();
}
return summe;
}
}
Song[] hätte eine feste Länge — für * braucht man die dynamische Reihung. length gibt es nur bei Reihungen, bei der ArrayList heißt es size(). append ist der Name aus dem Abitur-DynArray; in Java heißt die Operation add. Ohne new im Konstruktor wäre songs null.size(), Zugriff: get(i), Anhängen: add(x).Mit der Klasse Playlist aus A4 und Song (mit setDauer(d: Ganzzahl)) läuft das folgende Programm. Bestimmen Sie die Werte — denk an Referenzen aus 4.2.3.
Song a = new Song("Lotus", 200);
Playlist p = new Playlist("Sport");
Playlist q = new Playlist("Chill");
p.hinzufuegen(a);
q.hinzufuegen(a);
p.hinzufuegen(new Song("Echo", 180));
a.setDauer(240);
-
Wie viele
Song-Objekte gibt es? Objekte -
p.getLaenge()s -
q.getLaenge()s -
Nach zusätzlich
p = q;liefertp.getLaenge()s
a — es gibt nur zwei Song-Objekte. setDauer(240) ändert dieses eine Objekt, also sehen es beide Playlists: p = 240 + 180 = 420, q = 240. p = q kopiert nur die Referenz auf die Playlist; danach zeigen p und q auf dieselbe Liste (240), die „Sport“-Liste ist nicht mehr erreichbar.new Song(…)-Aufrufe. hinzufuegen kopiert kein Objekt.Kunde und Fahrrad kennen sich jetzt gegenseitig (0..1 auf beiden Seiten). Bei der Rückgabe müssen beide Referenzen gelöscht werden. Erstellen Sie die Methode der Klasse Fahrrad, indem Sie die Zeilen ordnen.
public void zurueckgeben() {
if (ausleiher != null) {
ausleiher.setRad(null);
ausleiher = null;
} — Ende von if
} — Ende der Methode
ausleiher = null, führt ausleiher.setRad(null) zu einer NullPointerException — der Kunde behielte das Rad. Bei Beziehungen in beide Richtungen muss eine Methode immer beide Seiten konsistent halten.ausleiher noch auf den Kunden zeigt, kann man ihm etwas mitteilen.Analysieren Sie jede Anforderung: Welche Kardinalität steht an der Seite der gezählten (fett gedruckten) Klasse?
ArrayList — die Mindestzahl muss dann der Konstruktor oder eine Prüfung sicherstellen.Eine Praxis kennt beliebig viele Patienten (Praxis ——patienten——> * Patient). Überprüfen Sie die Implementierung: Drei Zeilen führen zu einem Übersetzungsfehler, einem Laufzeitfehler oder einem falschen Ergebnis.
aufnehmen endet mit einer NullPointerException. length scheitert schon beim Übersetzen, get(1) liefert still den zweiten Patienten — oder eine Exception, wenn nur einer da ist.ArrayList?new, Reihungs-Schreibweise statt Listen-Methode, Index ab 0.Die Station aus A1 speichert ihre Räder in private Fahrrad[] raeder = new Fahrrad[12]; (Kardinalität 0..12). Erweitern Sie die Klasse um eine Methode, die ein Rad auf dem ersten freien Platz abstellt und meldet, ob das geklappt hat.
public boolean abstellen(Fahrrad f) {
for (int i = 0; i < ; i++) {
if (raeder[i] ) {
raeder[i] = ;
return ;
}
}
return ;
}
null. Man sucht den ersten solchen Platz, trägt die Referenz ein und bricht sofort mit true ab. Erst wenn die Schleife ohne Treffer durchläuft, sind alle zwölf Plätze belegt → false. raeder.size() gibt es bei Reihungen nicht, und 12 - 1 würde den letzten Platz auslassen.null.Gegeben ist die Klasse Song aus A5. Ermitteln Sie die Summe der Dauern aller Einträge von mix am Ende des Programms.
ArrayList<Song> mix = new ArrayList<Song>();
Song s = new Song("Nova", 150);
mix.add(s);
mix.add(s);
s = new Song("Orbit", 210);
mix.add(s);
mix.add(mix.get(0));
mix.get(1).setDauer(100);
s = new Song(…) ändert nur die Variable s, nicht die schon gespeicherten Referenzen. mix.get(1).setDauer(100) ändert das Nova-Objekt — also alle drei Einträge: 3 · 100 + 210 = 510. Wer 610 hat, hat nur einen Eintrag geändert.