Übungen
Aufgabe 1 - Datentypen
Ergänze die Tabelle zu den Datentypen in Kotlin. Lies bei Bedarf auf der Seite Fachkonzept - Datentyp nach.
| Art der Daten | Datentyp in Kotlin |
|---|---|
| Ganze Zahlen | |
| Double | |
| Wahrheitswerte | |
| String |
Zusatzaufgabe: Finde heraus warum der Datentyp Double so heißt.
Aufgabe 2 - Nichts als Fehler
Die folgenden Codebeispiele enthalten jeweils mindestens einen Fehler. Beschreibe die Fehler und korrigiere den Code so, dass er fehlerfrei ist.
// a)
var karte = Karte("Herz", "Dame")
karte.druckeKarte()
var karte = Karte("Pik", 10)
karte.druckeKarte()
// b)
val karte = Karte("Karo", "K")
karte.druckeKarte()
karte = Karte("Kreuz", "4")
karte.druckeKarte()
// c)
k = Karte("Pik", "9")
k.druckeKarte()
// d)
Karte("Kreuz", "7")
druckeKarte()
// e)
val karte = Karte("Herz", "Ass")
println(Karte.rang)
// f)
val s = Stapel("Herz", "Dame")
s.mischen()
Überprüfe deine Vermutungen und Korrekturen in BlueJ oder der Online-Version:
class Stapel {
private val karten: MutableList<Karte> = mutableListOf()
fun zaehleKarten(): Int = karten.size
fun erzeugeBlaetter(anzahlBlaetter: Int) {
val raenge = listOf(
"2", "3", "4", "5", "6", "7", "8", "9", "10",
"B", "D", "K", "A"
)
val farben = listOf("Herz", "Karo", "Pik", "Kreuz")
repeat(anzahlBlaetter) {
for (farbe in farben) {
for (rang in raenge) {
karten.add(Karte(farbe, rang))
}
}
}
}
fun mischen() = karten.shuffle()
private fun zieheKarte(): Karte? {
if (karten.isEmpty())
return null
else
return karten.removeAt(0)
}
fun zieheUndZeige() {
if (karten.isEmpty()) {
println("Es ist keine Karte mehr übrig")
}
else {
zeigeObersteKarte()
zieheKarte()
}
}
fun zeigeObersteKarte() {
if (karten.isEmpty())
println("Stapel ist leer")
else
karten.first().druckeKarte()
}
fun druckeAlle() {
for (karte in karten) {
karte.druckeKarte()
}
}
}
class Karte(
farbe: String, // "Herz", "Karo", "Pik", "Kreuz" (ausgeschrieben, Groß/Kleinschreibung egal)
rang: String // "2"–"10", "B"/"Bube", "D"/"Dame", "K"/"Koenig", "A"/"Ass"
) {
val rang: String = kuerzeRang(rang)
val farbe: String = normalisiereFarbe(farbe)
fun berechneWert(): Int {
return when (rang) {
"A" -> 11
"B", "D", "K" -> 10
else -> rang.toInt()
}
}
fun druckeKarte() {
val symbol = when (farbe) {
"herz" -> "♥"
"karo" -> "♦"
"pik" -> "♠"
"kreuz" -> "♣"
else -> "?"
}
val right = rang.padStart(2, ' ')
val left = rang.padEnd(2, ' ')
println("┌─────┐")
println("│$left │")
println("│ $symbol │")
println("│ $right│")
println("└─────┘")
}
private fun kuerzeRang(roherRang: String): String {
val normalisiert = roherRang.trim().lowercase()
return when (normalisiert) {
"a", "ass" -> "A"
"k", "koenig", "könig" -> "K"
"d", "dame" -> "D"
"b", "bube" -> "B"
else -> {
val zahl = normalisiert.toIntOrNull()
?: throw IllegalArgumentException("Unbekannter Rang: $roherRang")
if (zahl in 2..10) zahl.toString()
else throw IllegalArgumentException("Rang ausserhalb des Bereichs: $roherRang")
}
}
}
private fun normalisiereFarbe(roheFarbe: String): String {
return when (val normalisiert = roheFarbe.trim().lowercase()) {
"herz", "karo", "pik", "kreuz" -> normalisiert
else -> throw IllegalArgumentException("Unbekannte Farbe: $roheFarbe")
}
}
}
fun main() {
// Hier kannst du die Codebeispiele testen
}
Aufgabe 3 - Summe
Schreibe ein Programm, das zwei feste Karten erzeugt. Die Karten sollen ihre visuelle Darstellung ausgeben. Die Summe der Blackjack-Werte der beiden Karten soll berechnet und ausgegeben werden.
Nutze BlueJ oder die Online-Version.
class Stapel {
private val karten: MutableList<Karte> = mutableListOf()
fun zaehleKarten(): Int = karten.size
fun erzeugeBlaetter(anzahlBlaetter: Int) {
val raenge = listOf(
"2", "3", "4", "5", "6", "7", "8", "9", "10",
"B", "D", "K", "A"
)
val farben = listOf("Herz", "Karo", "Pik", "Kreuz")
repeat(anzahlBlaetter) {
for (farbe in farben) {
for (rang in raenge) {
karten.add(Karte(farbe, rang))
}
}
}
}
fun mischen() = karten.shuffle()
private fun zieheKarte(): Karte? {
if (karten.isEmpty())
return null
else
return karten.removeAt(0)
}
fun zieheUndZeige() {
if (karten.isEmpty()) {
println("Es ist keine Karte mehr übrig")
}
else {
zeigeObersteKarte()
zieheKarte()
}
}
fun zeigeObersteKarte() {
if (karten.isEmpty())
println("Stapel ist leer")
else
karten.first().druckeKarte()
}
fun druckeAlle() {
for (karte in karten) {
karte.druckeKarte()
}
}
}
class Karte(
farbe: String, // "Herz", "Karo", "Pik", "Kreuz" (ausgeschrieben, Groß/Kleinschreibung egal)
rang: String // "2"–"10", "B"/"Bube", "D"/"Dame", "K"/"Koenig", "A"/"Ass"
) {
val rang: String = kuerzeRang(rang)
val farbe: String = normalisiereFarbe(farbe)
fun berechneWert(): Int {
return when (rang) {
"A" -> 11
"B", "D", "K" -> 10
else -> rang.toInt()
}
}
fun druckeKarte() {
val symbol = when (farbe) {
"herz" -> "♥"
"karo" -> "♦"
"pik" -> "♠"
"kreuz" -> "♣"
else -> "?"
}
val right = rang.padStart(2, ' ')
val left = rang.padEnd(2, ' ')
println("┌─────┐")
println("│$left │")
println("│ $symbol │")
println("│ $right│")
println("└─────┘")
}
private fun kuerzeRang(roherRang: String): String {
val normalisiert = roherRang.trim().lowercase()
return when (normalisiert) {
"a", "ass" -> "A"
"k", "koenig", "könig" -> "K"
"d", "dame" -> "D"
"b", "bube" -> "B"
else -> {
val zahl = normalisiert.toIntOrNull()
?: throw IllegalArgumentException("Unbekannter Rang: $roherRang")
if (zahl in 2..10) zahl.toString()
else throw IllegalArgumentException("Rang ausserhalb des Bereichs: $roherRang")
}
}
}
private fun normalisiereFarbe(roheFarbe: String): String {
return when (val normalisiert = roheFarbe.trim().lowercase()) {
"herz", "karo", "pik", "kreuz" -> normalisiert
else -> throw IllegalArgumentException("Unbekannte Farbe: $roheFarbe")
}
}
}
fun main() {
}
Aufgabe 4 - Person
Im BlueJ-Projekt person.zip ist die
Klasse Person definiert.
Lade das Projekt herunter, entpacke es und öffne es in BlueJ.
- Experimentiere grafisch - also per Mausklick - mit der Klasse. Erzeuge verschiedene Person-Objekte und rufe deren Methoden auf. Untersuche die Objekte mit Hilfe des Objektinspektors, also durch Doppelklick auf die Objekte oder Rechtsklick → Inspect.
- Nutze die visuelle Darstellung per Mausklick in BlueJ, um die Begriffe Konstruktor, Klasse, Objekt, Attribut, Datentyp, Methode, Parameter und Rückgabe zu erklären.
- Wende deine Beobachtungen an, um in einem Hauptprogramm oder im Codepad Person-Objekte zu erzeugen und zu verwenden.
- Verwende die obigen Fachbegriffe, um ein von dir geschriebenes Hauptprogramm oder Aktionen im Codepad zu erklären.
import java.time.LocalDate
class Person(
var name: String,
val geburtstagTag: Int,
val geburtstagMonat: Int,
val geburtsjahr: Int
) {
fun berechneAlter(): Int {
val heute = LocalDate.now()
val geburtstag = LocalDate.of(geburtsjahr, geburtstagMonat, geburtstagTag)
return geburtstag.until(heute).years
}
fun istVolljaehrig(): Boolean {
return berechneAlter() >= 18
}
fun druckeInfo() {
println("$name, geboren am %02d.%02d.%04d, ist %d Jahre alt.".format(geburtstagTag, geburtstagMonat, geburtsjahr, berechneAlter()))
}
fun berechneAlterAm(tag: Int, monat: Int, jahr: Int): Int {
val referenzdatum = LocalDate.of(jahr, monat, tag)
val geburtstag = LocalDate.of(geburtsjahr, geburtstagMonat, geburtstagTag)
return geburtstag.until(referenzdatum).years
}
}
fun main() {
val person1 = Person(...)
}