Übungen
Aufgabe 1 - for-Schleifen
(a) Gib mit einer for-Schleife in fünf Zeilen dein Lieblingsfach aus.
Jede Zeile soll mit ihrer Nummer beginnen, also zum Beispiel:
1: Informatik ist toll
2: Informatik ist toll
3: Informatik ist toll
4: Informatik ist toll
5: Informatik ist toll
fun main() {
}
(b) Berechne mit einer for-Schleife die Summe aller Zahlen
von 1 bis 100 und gib das Ergebnis aus. Vervollständige dazu die Vorlage:
fun main() {
var summe
for (zahl ..) {
// Erhöhe summe in jedem Durchlauf um zahl
}
println("Die Summe ist $summe")
}
(c) Gib mit zwei verschachtelten for-Schleifen ein Dreieck aus
Sternen aus:
*
**
***
****
*****
Tipp: print("*") gibt einen Stern aus, ohne danach in eine neue
Zeile zu wechseln. Mit println() (ohne Text) wechselst du in die
nächste Zeile.
fun main() {
for (zeile in 1..5) {
// Gib in der inneren Schleife so viele Sterne aus, wie der Wert von zeile angibt,
// und wechsle danach in eine neue Zeile
}
}
Aufgabe 2 - if und for verschachteln
(a) Gib die Zahlen von 1 bis 30 aus. Ersetze dabei
- jede durch 3 teilbare Zahl durch das Wort
"Drei", - jede durch 5 teilbare Zahl durch das Wort
"Fünf", - jede durch 3 und 5 teilbare Zahl durch
"DreiFünf".
Eine Zahl z ist durch 3 teilbar, wenn z % 3 == 0 gilt.
Der Operator % liefert den Rest einer Division.
fun main() {
}
Gehe in einer Schleife alle Zahlen von 1 bis 30 durch.
Prüfe innerhalb der Schleife zuerst den Fall „durch 3 und 5 teilbar“, dann die Einzelfälle und zuletzt den Normalfall. Andernfalls wird die Zahl 15 schon durch den ersten passenden Fall abgefangen.
(b) Gib alle Primzahlen zwischen 2 und 30 aus. Eine Zahl ist eine Primzahl,
wenn sie durch keine Zahl außer 1 und sich selbst teilbar ist.
Hier brauchst du eine for-Schleife innerhalb einer
for-Schleife: Die äußere Schleife geht alle Zahlen durch, die
innere prüft mögliche Teiler.
Lege für jede Zahl eine lokale Variable istPrim an und setze
sie zunächst auf true. Prüfe in der inneren Schleife für jeden
möglichen Teiler, ob die Zahl ohne Rest teilbar ist, und setze
istPrim in diesem Fall auf false.
Gib die Zahl am Ende nur aus, wenn istPrim noch
true ist.
fun main() {
}
Aufgabe 3 - Auch einfache Werte sind Objekte
Auch scheinbar einfache Werte wie Zeichenketten, Zahlen oder Wahrheitswerte sind in Kotlin Objekte. Sie können also Attribute und Methoden besitzen.
(a) Führe das folgende Programm aus und erkläre für jede Zeile, was die aufgerufene Methode bewirkt.
fun main() {
val wort = "Informatik"
println(wort.uppercase())
println(wort.reversed())
println(wort.length)
println(wort.repeat(3))
println(wort.take(3))
println(wort)
val zahl = 5
println(zahl.toDouble())
println(zahl.times(4))
val kommazahl = 3.75
println(kommazahl.toInt())
}
(b) Überlege welche Wirkung folgender Code hat und überprüfe deine Vermutung. Erkläre warum der Punkt-Operator mehrfach hintereinander verwendet werden kann.
fun main() {
var text = "Informatik".take(3).reversed().repeat(3)
println(text)
text = "Informatik".reversed().repeat(3).take(3)
println(text)
}
(c) Schreibe selbst Ausdrücke und gib sie mit println(...) aus:
- Gib das Wort
"Informatik"rückwärts und in Großbuchstaben aus. - Prüfe, ob das Wort die Zeichenfolge
"for"enthält (Du benötigst hier die MethodecontainsDiese erhält als Parameter einen String und gibt einen Boolean zurück). - Wandle die Kommazahl
9.99in eine ganze Zahl um und gib sie aus.
fun main() {
}
Aufgabe 4 - Namen für Objekte
Gegeben ist die Klasse Figur. Eine Figur hat eine Rolle, einen
Energiewert in Prozent und eine zurückgelegte Entfernung. Beim Laufen
sinkt die Energie, die zurückgelegte Entfernung steigt.
(a) Sage voraus, welche Ausgabe das folgende Programm bewirkt. Führe das Programm anschließend aus und überprüfe deine Vorhersage.
class Figur(val rolle: String) {
var energie: Int = 100
var aktuelleEntfernung: Int = 0
fun druckeStatus() {
println("--------------------------------------------")
println("Ich bin $rolle.")
println("Energie: $energie %")
println("Entfernung: $aktuelleEntfernung Einheiten")
}
fun laufen() {
aktuelleEntfernung += 20
energie -= 10
}
}
fun main() {
val a = Figur("Heldin")
val b = Figur("Magierin")
val c = a
a.laufen()
a.druckeStatus()
b.laufen()
b.druckeStatus()
c.laufen()
c.druckeStatus()
a.druckeStatus()
}
(b) Beurteile die Aussage: Wenn ein Objekt mit val deklariert wird,
dann kann es nicht verändert werden.
Unterscheide zwischen der Identität eines Objekts und dem Zustand eines Objekts.
Aufgabe 5 - Gültigkeitsbereich
(a) Das folgende Programm lässt sich nicht ausführen. Finde den Fehler, erkläre ihn und korrigiere das Programm so, dass es die Nachricht ausgibt.
fun main() {
val zahl = 7
if (zahl > 5) {
val nachricht = "Die Zahl ist groß."
}
println(nachricht)
}
(b) Vertiefung (optional): Sage voraus, was das folgende Programm ausgibt, und führe es anschließend aus.
fun main() {
val wert = 1
if (5 > 3) {
val wert = 2
println(wert)
}
println(wert)
}
Aufgabe 6 - Umgang mit null
Eine Truhe kann einen Schatz enthalten – muss sie aber nicht.
Deshalb hat ihr Inhalt den nullbaren Typ Schatz?.
(a) Das folgende Programm lässt sich nicht ausführen. Erkläre, warum der
Aufruf s.druckeStatus() vom Compiler abgelehnt wird, und
korrigiere das Programm mit einer if-Abfrage so, dass es in beiden
Fällen (Truhe leer / Truhe gefüllt) eine sinnvolle Ausgabe macht.
Probiere deine Lösung mit und ohne die Zeile truhe.hineinlegen(...) aus.
class Schatz(
val bezeichnung: String,
val wert: Int
) {
fun druckeStatus() {
println("Schatz $bezeichnung mit Wert $wert")
}
}
class Truhe {
var meinSchatz: Schatz? = null
fun hineinlegen(s: Schatz) {
meinSchatz = s
}
fun gibInhalt(): Schatz? {
return meinSchatz
}
}
fun main() {
val truhe = Truhe()
// truhe.hineinlegen(Schatz("Goldring", 10000))
val s = truhe.gibInhalt()
s.druckeStatus()
}
(b) Vertiefung (optional): Löse die Ausgabe ohne
if-Abfrage. Verwende den sicheren Aufruf ?. zusammen
mit dem Elvis-Operator ?:, sodass bei einer leeren Truhe die
Meldung "Die Truhe ist leer" erscheint.