Übungen
Aufgabe 1 - Nichts als 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. Erläutere die Bestandteile des unten dargestellten Klassendiagramms.
Implementiere anschließend 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
}
Hilfe
Baue eine mögliche Lösung mit zwei unabhängigen Fallunterscheidungen zusammen und ergänze die Vergleichsoperatoren.
fun main() { §§fest
val alter = (0..60).random() §§fest
println("Alter: $alter") §§fest
if (alter §§<§§ 18) {
println("Du kommst hier nicht rein!")
} else {
println("Willkommen im Club!")
}
if (alter §§>§§ 40) {
println("Möchtest du dein Kind abholen?")
}
} §§fest
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
}
Hilfe
Bringe die Zeilen der Fallunterscheidung in die richtige Reihenfolge und ergänze die Grenzwerte, sodass jeder Punktebereich die passende Ausgabe erhält.
fun main() { §§fest
val punktzahl = (0..15).random() §§fest
println("Punktzahl: $punktzahl") §§fest
if (punktzahl <= §§3§§) {
println("Das reicht leider nicht.")
} else if (punktzahl <= §§6§§) {
println("Ausreichend")
} else if (punktzahl <= §§9§§) {
println("Befriedigend")
} else if (punktzahl <= §§12§§) {
println("Gut")
} else {
println("Sehr gut!")
}
} §§fest
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.
(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.
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")
}