Funkcje – podstawy

Funkcja to nazwany fragment kodu, który możesz wywoływać wielokrotnie. Poznasz słowo fun, sposób przekazywania danych przez parametry (nazwa: Typ), zwracanie wyniku (: Typ i return) oraz typ Unit dla funkcji, które nic nie zwracają.

fun parametry return Unit
1

Czym jest funkcja

Funkcja to nazwany fragment kodu, który wykonuje jedno konkretne zadanie. Raz ją zapisujesz, a potem wywołujesz w dowolnym miejscu – nawet wiele razy. Dzięki temu nie powtarzasz tego samego kodu i łatwiej go poprawiać.

Funkcję main znasz już od pierwszych lekcji – to specjalna funkcja, od której startuje program. Teraz nauczysz się pisać własne funkcje.

Jedna funkcja = jedno zadanie

Dobra funkcja robi jedną rzecz i ma nazwę, która o tym mówi (np. policzPole, przywitaj). Taki podział sprawia, że program czyta się jak listę sensownych kroków.

2

Definiowanie i wywołanie

Funkcję definiujemy słowem kluczowym fun, po którym podajemy nazwę, nawiasy () i ciało w klamrach. Aby ją uruchomić, piszemy jej nazwę z nawiasami – to wywołanie.

Definicja i wywołania
fun przywitaj() {
    println("Witaj w programie!")
}

fun main() {
    przywitaj()       // wywołanie
    przywitaj()       // można wywołać wiele razy
}
// Witaj w programie!
// Witaj w programie!
Kolejność definicji nie ma znaczenia

Funkcję możesz zdefiniować nad albo pod main – Kotlin i tak ją znajdzie. Liczy się, żeby istniała w pliku.

3

Parametry – przekazywanie danych

Parametry pozwalają przekazać funkcji dane do pracy. Wypisujemy je w nawiasach w postaci nazwa: Typ – tak samo jak przy deklaracji zmiennej, nazwa najpierw, typ po dwukropku.

Funkcja z jednym parametrem
fun przywitaj(imie: String) {
    println("Cześć, $imie!")
}

fun main() {
    przywitaj("Anna")        // Cześć, Anna!
    przywitaj("Krzysztof")   // Cześć, Krzysztof!
}

Wartość podana w wywołaniu (np. "Anna") to argument. Parametrów może być więcej – rozdzielamy je przecinkami:

Wiele parametrów
fun przedstaw(imie: String, wiek: Int) {
    println("$imie ma $wiek lat")
}

przedstaw("Anna", 18)   // Anna ma 18 lat
Parametr jest tylko do odczytu

Wewnątrz funkcji parametru nie można nadpisać (zachowuje się jak val). Jeśli potrzebujesz go zmieniać, skopiuj wartość do własnej zmiennej var.

4

Typ zwracany i return

Funkcja może zwrócić wynik. Typ tego wyniku podajemy po nawiasach, po dwukropku (): Int), a samą wartość oddajemy słowem return.

Funkcja zwracająca sumę
fun suma(a: Int, b: Int): Int {
    return a + b
}

fun main() {
    val wynik = suma(3, 5)   // wynik = 8
    println(wynik)
}

return robi dwie rzeczy naraz: oddaje wartość i natychmiast kończy działanie funkcji – kod po nim już się nie wykona.

5

Unit – funkcje bez wyniku

Nie każda funkcja musi coś zwracać – wiele z nich po prostu „coś robi” (np. wypisuje tekst). Taka funkcja zwraca specjalny typ Unit, oznaczający „nic konkretnego”. To odpowiednik void z innych języków.

Te dwie funkcje są równoważne
// typ zwracany pominięty -> domyślnie Unit
fun przywitaj(imie: String) {
    println("Cześć, $imie!")
}

// to samo, z jawnym Unit (zwykle się go nie pisze)
fun przywitaj2(imie: String): Unit {
    println("Cześć, $imie!")
}
Unit pomijamy

W praktyce typu Unit się nie zapisuje – po prostu nie podajesz typu zwracanego. Gdy widzisz funkcję bez : Typ po nawiasach, wiesz, że nic nie zwraca.

6

Wynik funkcji w użyciu

Wartość zwrócona przez funkcję to zwykła wartość – możesz ją przypisać do zmiennej, wstawić do szablonu albo użyć w dalszych obliczeniach.

Trzy sposoby użycia wyniku
fun poleKwadratu(bok: Int): Int {
    return bok * bok
}

fun main() {
    val p = poleKwadratu(5)               // 1) przypisanie -> 25
    println("Pole: ${poleKwadratu(4)}")         // 2) wprost w szablonie -> 16
    val razem = poleKwadratu(2) + poleKwadratu(3)  // 3) w wyrażeniu -> 13
    println("$p, $razem")
}
7

Częste błędy

❌ Błąd 1: zła kolejność w parametrze

❌ Typ przed nazwą

fun przywitaj(String imie) {
    // Błąd! najpierw nazwa,
    // potem typ
}

✅ nazwa: Typ

fun przywitaj(imie: String) {
    println("Cześć, $imie")
}

❌ Błąd 2: brak return przy typie zwracanym

❌ Obiecany Int, ale nic nie zwrócone

fun suma(a: Int, b: Int): Int {
    a + b
    // Błąd! brakuje return

✅ Ze słowem return

fun suma(a: Int, b: Int): Int {
    return a + b
}

❌ Błąd 3: wywołanie bez nawiasów

❌ Sama nazwa nie uruchamia

fun main() {
    przywitaj
    // nic się nie dzieje –
    // to nie jest wywołanie
}

✅ Z nawiasami

fun main() {
    przywitaj()
}

❌ Błąd 4: zła liczba argumentów

❌ Za mało argumentów

fun suma(a: Int, b: Int): Int {
    return a + b
}
suma(3)
// Błąd! funkcja wymaga
// dwóch argumentów

✅ Tyle argumentów, ile parametrów

fun suma(a: Int, b: Int): Int {
    return a + b
}
suma(3, 5)
8

Podsumowanie

  • Funkcję definiujemy słowem fun, a uruchamiamy przez wywołanie: nazwa().
  • Parametry zapisujemy jako nazwa: Typ; wartości przekazane w wywołaniu to argumenty.
  • Parametr jest tylko do odczytu (jak val).
  • Typ zwracany podajemy po nawiasach: ): Int, a wartość oddajemy przez return.
  • return zwraca wynik i kończy działanie funkcji.
  • Funkcja bez wyniku zwraca Unit (odpowiednik void) – typu tego zwykle się nie zapisuje.
  • Wynik funkcji to zwykła wartość: można go przypisać, wstawić do szablonu lub użyć w wyrażeniu.
9

Zadania do wykonania

Zadania z wczytywaniem uruchamiaj w IntelliJ IDEA; pozostałe w Kotlin Playground.

Zadanie 1 łatwe

Napisz funkcję przywitaj(imie: String), która wypisuje powitanie. Wywołaj ją trzy razy z różnymi imionami.

Zadanie 2 łatwe

Napisz funkcję suma(a: Int, b: Int): Int, która zwraca sumę dwóch liczb. W main przypisz wynik do zmiennej i wypisz go.

Zadanie 3 łatwe

Napisz funkcję czyParzysta(liczba: Int): Boolean, która zwraca true, gdy liczba jest parzysta. Przetestuj ją na kilku liczbach, wypisując wyniki.

Zadanie 4 średnie

Napisz dwie funkcje: pole(a: Int, b: Int): Int oraz obwod(a: Int, b: Int): Int dla prostokąta. Wczytaj wymiary, wywołaj obie funkcje i wypisz wyniki. Zwróć uwagę, że logika obliczeń jest „zamknięta” w funkcjach, a main tylko je spina.