Ü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.
So ist das Ticket eines Parkhauses implementiert. Welche Aussagen stimmen?
public class Parkticket {
private int einfahrtMinute;
private boolean bezahlt;
public Parkticket(int einfahrtMinute) {
this.einfahrtMinute = einfahrtMinute;
bezahlt = false;
}
public int dauer(int jetzt) {
return jetzt - einfahrtMinute;
}
public void bezahlen() {
bezahlt = true;
}
}
void-Methode darf keinen Wert zurückgeben — return true; wäre sogar ein Übersetzungsfehler. this ist nur nötig, wenn ein Parameter genauso heißt wie das Attribut; bei bezahlt = false; gibt es keinen gleichnamigen Parameter, also ist das Attribut gemeint. Und die Attribute gehören zum Objekt, sobald es mit new erzeugt wird.Zeilen aus der Klasse Song einer Musik-App. Sortiere sie nach ihrer Rolle.
istLang() zu den Methoden ohne Rückgabe legen, weil sie nichts „holt“ — sie liefert aber einen boolean. Nur void bedeutet: keine Rückgabe.Ein Sportverein hat die Klasse Mitglied entworfen. Setze die Java-Schlüsselwörter ein — eines bleibt übrig.
- - name: Zeichenkette
- - aktiv: Wahrheitswert
- - beitrag: Ganzzahl
- c Mitglied(name: Zeichenkette)
- + beitragZahlen(betrag: Ganzzahl)
- + getBeitrag(): Ganzzahl
Aus „- name: Zeichenkette“ wird private name; und aus „- aktiv: Wahrheitswert“ wird private aktiv;. Im Konstruktor steht .name = name;. Die Methode beitragZahlen bekommt den Rückgabetyp . In getBeitrag muss eine -Anweisung stehen.
new bleibt übrig: Es gehört nicht in die Klasse, sondern dorthin, wo ein Objekt erzeugt wird, z. B. new Mitglied("Lea"). Häufig verwechselt: Wahrheitswert wird zu boolean, nicht zu bool oder Boolean.Die Klasse Pizza ist fertig implementiert. In einer anderen Klasse stehen diese drei Zeilen:
- - sorte: Zeichenkette
- - preis: Ganzzahl
- - belag: Zeichenkette
- c Pizza(sorte: Zeichenkette, preis: Ganzzahl)
- + belegen(zutat: Zeichenkette)
- + getPreis(): Ganzzahl
Pizza p = new Pizza("Funghi", 8);
Pizza q = new Pizza("Funghi", 8);
p.belegen("Oliven");
new + Konstruktor erzeugt ein Objekt; Methoden ruft man mit Punktnotation an einem bestimmten Objekt auf — nie an der Klasse.Die Verkehrsbetriebe übersetzen ihre Klasse Haltestelle nach Java. Verbinde jede Zeile der Klassenkarte mit der passenden Java-Zeile.
- - name: Zeichenkette
- - barrierefrei: Wahrheitswert
- - wartezeit: Fließkommazahl
- c Haltestelle(name: Zeichenkette)
- + getWartezeit(): Fließkommazahl
- + istBarrierefrei(): Wahrheitswert
- + verspaetung(minuten: Ganzzahl)
private, + wird public; der Typ wandert von hinten nach vorn; fehlt im Diagramm der Rückgabetyp, schreibt man void; der Konstruktor bekommt gar keinen. Fließkommazahl heißt in Java double, Ganzzahl int.An der Wetterstation der Schule misst ein Regenmesser die Niederschlagsmenge in mm. Fehlerhafte Messungen (negative Werte) sollen ignoriert werden.
public class Regenmesser {
private int summe;
private int messungen;
public Regenmesser() {
summe = 0;
messungen = 0;
}
public void messen(int mm) {
if (mm >= 0) {
summe = summe + mm;
messungen = messungen + 1;
}
}
public int durchschnitt() {
return summe / messungen;
}
}
Regenmesser r = new Regenmesser(); r.messen(4); r.messen(-2); r.messen(7); r.messen(0); r.messen(6);
Welchen Wert liefert r.durchschnitt()?
int-Werten eine Ganzzahldivision (Kapitel 1): Ergebnis 4, nicht 4,25. Häufige Fehler: 4,25 (Kommadivision), 3 (die −2 doch mitgezählt: 15 / 5) oder 5 (die 0 übersprungen: 17 / 3).Eine Zoohandlung verwaltet ihre Becken mit dieser Klasse:
public class Aquarium {
private int liter;
private int fische;
private int temperatur;
public Aquarium(int liter) {
this.liter = liter;
fische = 0;
temperatur = 20;
}
public void einsetzen(int anzahl) {
fische = fische + anzahl;
}
public void heizen(int grad) {
temperatur = temperatur + grad;
}
public int getTemperatur() {
return temperatur;
}
public int literProFisch() {
return liter / fische;
}
public int platzFuerWeitere() {
return liter / 10 - fische;
}
}
Aquarium a = new Aquarium(120); a.einsetzen(4); a.heizen(5); a.einsetzen(2); Aquarium b = new Aquarium(40); b.einsetzen(1);
Sortiere die Aufrufe nach ihrem Rückgabewert — der kleinste zuerst.
b.platzFuerWeitere()
a.platzFuerWeitere()
a.literProFisch()
a.getTemperatur()
b.literProFisch()
a.einsetzen(2) übersieht — a hat 6 Fische, nicht 4. Und: a und b sind zwei Objekte mit getrennten Attributen.Im Schulkopierer wird mit einer Karte bezahlt (Guthaben in Cent). Eine Schwarz-Weiß-Seite kostet 5 Cent, eine Farbseite 20 Cent.
public class Kopierkarte {
private int guthaben;
private int kopien;
public Kopierkarte(int guthaben) {
this.guthaben = guthaben;
kopien = 0;
}
public void aufladen(int cent) {
if (cent > 0) {
guthaben = guthaben + cent;
}
}
public boolean kopieren(int seiten, boolean farbig) {
int preis = seiten * 5;
if (farbig) {
preis = seiten * 20;
}
if (preis <= guthaben) {
guthaben = guthaben - preis;
kopien = kopien + seiten;
return true;
}
return false;
}
public int getGuthaben() {
return guthaben;
}
public int getKopien() {
return kopien;
}
}
Kopierkarte karte = new Kopierkarte(200); karte.kopieren(12, false); karte.kopieren(8, true); karte.aufladen(-50); karte.kopieren(6, true); karte.aufladen(100); karte.kopieren(30, false);
-
Guthaben direkt nach dem ersten
kopieren-Aufruf Cent -
Wie viele der vier
kopieren-Aufrufe lieferntrue? Aufrufe -
Rückgabewert von
karte.getKopien()am Ende Seiten - Transfer: Wie viele Schwarz-Weiß-Seiten könnte man mit dem Endguthaben noch höchstens kopieren? Seiten
Die Klasse soll ein Konzertticket mit Platz und Preis beschreiben und sich mit new Ticket("A12", 49) erzeugen lassen. Drei Zeilen enthalten Fehler — zwei führen zu Übersetzungsfehlern, einer zu falschem Verhalten.
void, fehlendes this bei gleichnamigem Parameter und ein Getter ohne return. Tückisch ist der mittlere, denn er kompiliert — das Programm läuft, aber jedes Ticket kostet 0 Euro.Ein Lager nutzt diese Klasse. Jede Zeile unten startet mit einem neuen Regal: Regal r = new Regal(4); Welchen Wert liefert der letzte Aufruf der Zeile? Lies den Quelltext genau.
public class Regal {
private int faecher;
private int belegt;
public Regal(int faecher) {
faecher = faecher;
belegt = 0;
}
public void einraeumen(int kisten) {
if (belegt + kisten <= faecher) {
belegt = belegt + kisten;
}
}
public int getBelegt() {
return belegt;
}
public int getFrei() {
return faecher - belegt;
}
}
r.getFrei()
r.einraeumen(2); r.getBelegt()
r.einraeumen(-3); r.getFrei()
r.einraeumen(-2); r.einraeumen(1); r.getFrei()
r.einraeumen(-4); r.einraeumen(2); r.getFrei()
faecher = faecher; weist den Parameter sich selbst zu — das Attribut faecher bleibt 0. Deshalb ist nie Platz für positive Kistenzahlen (2 <= 0 ist falsch), während negative Werte durchrutschen: nach einraeumen(−3) ist belegt = −3 und getFrei() = 0 − (−3) = 3. Wer 4 und 2 erwartet hat, hat den Konstruktor so gelesen, wie er gemeint war — nicht, wie er programmiert ist. Korrektur: this.faecher = faecher;, und einraeumen sollte negative Werte ablehnen.