s n h m r u

Minimallogo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

s n h m r u
i

Karten per Code

Karten-Objekte im Hauptprogramm nutzen

Wir wollen nun Karten-Objekte nicht mehr per Mausklick erzeugen, sondern im Hauptprogramm per Code. Eine Übersicht über den Aufbau der Klasse Karte gibt das folgende Klassendiagramm:

Klassendiagramm der Klasse Karte

Ein Klassendiagramm besteht hier aus drei Bereichen. Oben steht der Name der Klasse, darunter stehen die Attribute. Der untere Bereich enthält zuerst den Konstruktor und anschließend die Methoden. Bei Attributen und Parametern steht nach einem Doppelpunkt der Datentyp. Bei Methoden steht hinter der schließenden Klammer der Rückgabetyp. Gibt eine Methode keinen Wert zurück, wird kein Rückgabetyp angegeben.

Hier findest du einige Vorschläge für ein Hauptprogramm. Manche davon lassen sich ausführen, andere führen zu Fehlern.

// Programm 1
var karte: Karte = Karte("Herz", "A")
var meineKarte = Karte("Pik", "10")
karte.druckeKarte()
meineKarte.druckeKarte()
// Programm 2
var karte = Spielkarte("Karo", "K")
karte.druckeKarte()
// Programm 3
var karte = Karte("Kreuz", "4")
karte.druckeKarte()
karte = Karte("Herz", "B")
karte.druckeKarte()
// Programm 4
val karte: String = Karte("Kreuz", "4")
karte.druckeKarte()
karte = Karte("Herz", "B")
karte.druckeKarte()
// Programm 5
var karte = Karte(Herz, 2)
karte.druckeKarte()
// Programm 6
Karte("Karo", "D")
druckeKarte()
// Programm 7
val karte = Karte("Pik", "5")
val wert: String = karte.berechneWert()
val rang: Int = karte.rang
println(wert)
println(rang)
// Programm 8
val karte = Karte("Karo", "D")
var ergebnis = karte.berechneWert()
println(ergebnis)
ergebnis = karte.rang
println(ergebnis)

Um Platz zu sparen ist in den obigen Programmen nur der Teil innerhalb der main-Funktion angegeben. Für das erste Beispiel sähe das komplette Hauptprogramm dann so aus:

fun main() {
    // Programm 1
    var karte: Karte = Karte("Herz", "A")
    var meineKarte = Karte("Pik", "10")
    karte.druckeKarte()
    meineKarte.druckeKarte()
}

Kommentare in Kotlin beginnen mit den Zeichen //. Alles, was hinter diesen Zeichen steht, wird beim Ausführen des Programms ignoriert.

Aufgabe 1

Probiere die verschiedenen Hauptprogramme aus. Beschreibe deren Wirkung und erkläre die auftretenden Fehler. Gehe dabei insbesondere auf folgende Fragen ein:
  • Wie ruft man in Kotlin einen Konstruktor auf?
  • Wie greift man auf Attribute und Methoden eines Objekts zu?
  • Welche Namen kann man für Variablen verwenden?
  • Was bedeuten val und var? Was sind die Gemeinsamkeiten und Unterschiede?
  • Welche Wirkung hat die Anweisung println() im Code? Vergleiche auch mit der Anweisung print().
  • Kotlin kann in vielen Fällen die benutzten Datentypen automatisch ableiten. Formuliere eine Regel zur automatischen Typableitung (Type inference).

Alternativ zur Ausführung in BlueJ kannst du auch die Online-Version zum Testen der Programme nutzen.

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() {
    // Programm 1
    var karte: Karte = Karte("Herz", "A")
    var meineKarte = Karte("Pik", "10")
    karte.druckeKarte()
    meineKarte.druckeKarte()
}

Suche

v
100.123.1.1.4 Karten per Code
Kopieren durch Anklicken

Rückmeldung geben