fun main() { }
Pracownia programowania aplikacji mobilnych · klasa IV

Kotlin — podstawy składni

Język, w którym piszemy aplikacje na Androida.

Ćwiczymy w przeglądarce: play.kotlinlang.org — bez instalacji.
Wprowadzenie

Dlaczego Kotlin

Cztery powody, dla których uczymy się właśnie tego języka.

Oficjalny

język Androida — od 2019 pierwszy wybór Google

Zwięzły

mniej pisania niż w Javie czy C++

Bezpieczny

null safety — mniej wysypujących się aplikacji

Znajomy

jeśli znasz C++/JS — składnia będzie oczywista

Dziś bez Android Studio: piszemy czysty Kotlin w przeglądarce. Ten sam język ożywi potem przyciski w aplikacji.
Zmienne

Zmienne: val i var

Dwa słowa zamiast typów. Bez średników na końcu linii.

fun main() {                        // program zaczyna się tutaj
  val imie = "Ola"                  // val = stała — NIE zmienisz
  var punkty = 0                    // var = zmienna — można zmieniać
  punkty = punkty + 10              // ok, bo var
  // imie = "Jan"                   // BŁĄD kompilacji, bo val
  println(imie)                     // wypisz na ekran
}
Zasada: zawsze pisz val. Zamień na var dopiero, gdy kompilator zaprotestuje.
Typy i napisy

Typy i wstawianie do tekstu

Typ można podać po dwukropku — ale zwykle Kotlin domyśli się sam.

val a: Int = 7                        // liczba całkowita
val cena: Double = 4.5                // liczba z częścią dziesiętną
val gra: Boolean = true               // prawda / fałsz
val tekst: String = "kości"           // napis

println("Cena: $cena zł")             // $zmienna wstawia wartość
println("Suma: ${a + 2}")             // ${...} — dowolne wyrażenie
Koniec z klejeniem tekstu plusami: "Wynik: " + w zamienia się w "Wynik: $w".
Funkcje

Funkcje

Słowo fun, typ wyniku po dwukropku. Na egzaminie logika musi być w funkcjach.

parametry→funkcja→wynik
fun dodaj(a: Int, b: Int): Int {        // parametry i typ wyniku
  return a + b                          // zwróć wynik
}

fun kwadrat(x: Int) = x * x             // wersja jednolinijkowa
fun powitaj(imie: String) {             // bez wyniku — nic nie zwraca
  println("Cześć, $imie!")
}

val w = dodaj(2, 3)                     // wywołanie: w == 5
Warunki

Warunki: if oraz when

if zwraca wartość. when to switch, tylko potężniejszy.

val max = if (a > b) a else b             // if jako wyrażenie!

val opis = when (kostka) {                // when po wartości
  1, 2    -> "mało"                       // kilka wartości naraz
  in 3..5 -> "średnio"                    // zakres
  else    -> "szóstka!"                   // wszystko inne
}

when {                                    // when bez argumentu = łańcuch if-ów
  punkty >= 90 -> println("super")
  else         -> println("grasz dalej")
}
Pętle

Pętle i zakresy

for chodzi po zakresach i kolekcjach. while — klasycznie.

for (i in 0..4) print(i)                  // 0 1 2 3 4 — koniec WLICZONY
for (i in 0 until 5) print(i)             // 0..4 — jak klasyczny for
for (i in 5 downTo 1) print(i)            // w dół: 5 4 3 2 1
for (i in 0..10 step 2) print(i)          // co 2

val rzuty = intArrayOf(3, 6, 6)           // tablica z gotowymi wartościami
for (r in rzuty) println(r)               // po elementach tablicy

while (punkty < 100) { ... }              // while — bez zmian
Pytanie kontrolne: co wypisze for (i in 1..3) print(i * i) ?
Null safety

Null safety i wczytywanie danych

Zwykły typ nie może być pusty. Chcesz null — dopisz znak zapytania.

var t: String? = null                     // ? = może być null
println(t?.length)                        // ?. = policz, jeśli nie null

val n = readLine()?.toIntOrNull()         // wczytaj tekst i zamień na Int
if (n == null || n !in 3..10) {           // walidacja jak w arkuszu
  println("Błędna liczba!")
}
  • String — zawsze tekst
  • String? — tekst albo null
  • ?. — safe call
  • toIntOrNull() — null zamiast błędu
toIntOrNull() zwraca null zamiast błędu, gdy użytkownik wpisze śmieci. To gotowa walidacja — użyjemy jej w każdym zadaniu egzaminacyjnym i w każdym formularzu w Androidzie.
Kolekcje

Tablice, listy i małe magiczne funkcje

Zamiast ręcznych pętli — gotowe operacje na kolekcjach.

val kosci = IntArray(5)                 // tablica 5 zer
kosci[0] = 6                            // dostęp po indeksie, od zera

val lista = mutableListOf(1, 5)         // lista — rośnie w trakcie
lista.add(3)                            // dodaj element

println(kosci.sum())                    // suma elementów
println(kosci.count { it == 6 })        // ile szóstek? it = element
println(lista.filter { it > 2 })        // tylko elementy > 2
kolekcja→filter→count→wynik
Losowanie

Losowanie — serce gry w kości

Jedna linijka, na której stoi całe zadanie z kośćmi.

val rzut = (1..6).random()                  // losowa liczba od 1 do 6

val kosci = IntArray(5)                     // 5 kości
for (i in kosci.indices) {                  // indices = wszystkie indeksy
  kosci[i] = (1..6).random()                // rzut każdą kostką
}
Dokładnie to robi arkusz INF.04 (czerwiec 2024): „losuje wyniki rzutów od 1 do 6, zapisuje je w tablicy, wyświetla rezultat każdej kostki” — właśnie nauczyliście się jądra zadania egzaminacyjnego.
Praktyka

Zadania — play.kotlinlang.org

Otwórz play.kotlinlang.org i pisz.

1 Rozgrzewka

  • wylosuj 5 rzutów kostką do tablicy
  • wypisz każdy: Kostka 1: 4
  • dopisz sumę wszystkich oczek

2 Jak na egzaminie

  • przenieś losowanie do funkcji rzuty()
  • napisz funkcję suma(t: IntArray): Int
  • pobierz liczbę kości 3–10 z walidacją w pętli (toIntOrNull)

★ Poziom INF.04

Punkty liczą się tylko za oczka, które wypadły co najmniej 2 razy (np. 5, 5, 2, 5, 2 → 5+5+5+2+2). Podpowiedź: count { it == oczko }.

Podsumowanie

Zapamiętaj

val domyślnie

var tylko wtedy, gdy wartość musi się zmieniać.

$zmienna i ${wyrażenie}

tak wstawiamy wartości do tekstu.

readLine()?.toIntOrNull()

bezpieczne wczytanie liczby od użytkownika.

(1..6).random(), sum(), count { }

skrzynka narzędzi do gry w kości.

Ten sam Kotlin, którego dziś użyliście, ożywi przyciski w Android Studio.