s n h m r u
i

Ü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.
Alternativ zu einem Hauptprogramm in BlueJ kannst du auch die Online-Version benutzen:
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(...)


}

Aufgabe 5 - Kreuzworträtsel

Suche

v
100.123.1.7 Übungen
Kopieren durch Anklicken

Rückmeldung geben