Übungen
Aufgabe 1 - Nichts als Fehler
Keines der folgenden Programm-Fragmente funktioniert so wie es soll. Beschreibe, was jeweils falsch ist und korrigiere die Fehler.
// Fehler 1
class Auto {
var marke: String
var ps: Int
}
// Fehler 2
class Auto(marke: String, ps: Int) {
}
fun main() {
val a = Auto("BMW", 150)
println(a.marke)
}
// Fehler 3
class Auto {
var marke: String = ""
var ps: Int = 0
}
fun main() {
val a = Auto()
a.marke = "BMW"
a.ps = "150"
}
// Fehler 4
class Auto {
var marke = ""
var ps = 0
}
fun main() {
val a = Auto()
a.marke = "BMW"
a.ps = "150"
}
// Fehler 5
class Auto {
var marke = ""
fun druckeMarke(): String {
println(marke)
}
}
// Fehler 6
class Auto {
var marke = ""
}
fun druckeMarke(): String {
println(marke)
}
Aufgabe 2 - Thermostat
Ein Thermostat ist ein Gerät, das die Temperatur in einem Raum misst und regelt,
indem es die Heizung ein- oder ausschaltet.
Im Klassendiagramm können wir die Klasse Thermostat
folgendermaßen darstellen:
(a) Erläutere die Bestandteile des Klassendiagramms.
(b) Implementiere die Klasse Thermostat entsprechend dem
Klassendiagramm.
Die Implementierung von Methoden (also die Teile zwischen den geschweiften
Klammern)
kannst du - bis auf Dummy-Rückgabewerte - leer lassen.
Entscheide dich bei den Attributen begründet zwischen
val und var.
Aufgabe 3 - Würfel
Ein Würfel soll folgende Anforderungen erfüllen:
- Beim Erstellen eines Würfels wird die minimale und maximale Augenzahl festgelegt. Es sollen also nicht nur Zahlen von 1 bis 6 möglich sein, sondern z.B. auch von 2 bis 5 oder von 0 bis 10.
- Ein Würfel soll sich die aktuelle Augenzahl und den Wert des letzten Wurfs merken. Beim Erstellen eines Würfels sollen diese Werte auf -1 gesetzt werden, um anzuzeigen, dass der Würfel noch nicht geworfen wurde.
-
Ein Würfel soll eine Methode
werfen()haben, die eine neue Augenzahl generiert. Diese Augenzahl soll zufällig zwischen der minimalen und maximalen Augenzahl liegen. Dabei soll die aktuelle Augenzahl aktualisiert und der Wert des letzten Wurfs gespeichert werden. -
Schließlich soll es eine Methode
wurdeBenutzt()geben, die zurückgibt, ob der Würfel bereits geworfen wurde. Dies kann man daran erkennen, dass die aktuelle Augenzahl gleich -1 ist oder nicht. Ob zwei Werte gleich sind, kannst du mit dem Operator==überprüfen.
(a) Erstelle ein Klassendiagramm für die Klasse Wuerfel.
(b) Implementiere die Klasse Wuerfel entsprechend deinem Klassendiagramm.
Teste deine Implementierung, indem du ein Hauptprogramm schreibst, das
einen Würfel erzeugt, ihn mehrmals wirft und die Ergebnisse ausgibt.
Aufgabe 4 - Türsteher
Ergänze das Codefragment so, dass es die folgenden Anforderungen erfüllt.
(a) Wenn das (zufällige) Alter unter 18 liegt, soll die Ausgabe "Du kommst hier nicht rein!" sein, ansonsten "Willkommen im Club!".
(b) Wenn das Alter über 40 liegt, soll zusätzlich die Ausgabe "Möchtest du dein Kind abholen?" erfolgen.
(c) Zusatzaufgabe: Man kann die Anforderungen mit Hilfe von zwei
unabhängigen if-Anweisungen erfüllen oder
mit einer verschachtelten if-Anweisung, also
einer if-Anweisung innerhalb einer anderen if-Anweisung.
Probiere beide Möglichkeiten aus und vergleiche die Vor- und Nachteile.
Hinweis zur Ausgabe: Falls du nicht verstehst was es mit dem $-Zeichen
in der Ausgabe auf sich hat, kannst du in den
Tipps zu Kotlin nachschauen.
fun main() {
val alter = (0..60).random()
println("Alter: $alter")
// Hier soll die Ausgabe entsprechend den Anforderungen erfolgen
}
Aufgabe 5 - Notenauswertung
- 0 bis 3 → "Das reicht leider nicht."
- 4 bis 6 → "Ausreichend"
- 7 bis 9 → "Befriedigend"
- 10 bis 12 → "Gut"
- über 12 → "Sehr gut!"
Benutze dazu eine verschachtelte if-Anweisung.
Schaue bei Bedarf auf der Seite Fachkonzept - Fallunterscheidungen
nach.
fun main() {
val punktzahl = (0..15).random()
println("Punktzahl: $punktzahl")
// Hier soll die Ausgabe entsprechend den Anforderungen erfolgen
}
Aufgabe 6 - Bruch
Ein Bruch hat einen Zähler und einen Nenner, die beide ganze Zahlen sind.
Beim Erstellen eines Bruchs soll der Zähler und der Nenner angegeben werden.
Es soll eine Methode erweitern geben, die den Bruch mit einem
Faktor erweitert, also den Zähler und den Nenner mit diesem Faktor multipliziert.
Es soll eine Methode kuerzen geben, die den Bruch kürzt, also
den Zähler und den Nenner um den als Parameter angegebenen Faktor dividiert.
Dies soll nur möglich sein, wenn der Zähler und der Nenner durch diesen Faktor
teilbar sind, also keinen Rest bei der Division haben.
Ob eine Zahl durch einen Faktor teilbar ist, kannst du mit dem Modulo-Operator
% überprüfen:
fun main() {
val zaehler = (6..9).random()
val faktor = 3
val rest = zaehler % faktor
println("$zaehler geteilt durch $faktor hat Rest: $rest")
}
(a) Erstelle ein Klassendiagramm für die Klasse Bruch.
(b) Implementiere die Klasse Bruch entsprechend deinem Klassendiagramm.
Teste deine Implementierung, indem du ein Hauptprogramm schreibst, das
einen Bruch erzeugt, ihn erweitert und kürzt und die Ergebnisse ausgibt.