Pętla for

Pętla for powtarza kod dla kolejnych wartości. Nauczysz się przechodzić po zakresie (1..10, downTo, step), po elementach kolekcji i po znakach tekstu, a także pobierać indeks i wartość naraz dzięki withIndex().

for (i in 1..10) po kolekcji downTo · step withIndex()
1

for – podstawy

Pętla for wykonuje swój blok kodu dla każdej wartości, po której przechodzi. Schemat jest prosty: for (zmienna in coś_do_przejścia). Przy każdym obrocie zmienna przyjmuje kolejną wartość.

Pierwsza pętla
for (i in 1..5) {
    println("Iteracja numer $i")
}
// Iteracja numer 1
// Iteracja numer 2
// ... aż do 5
Brak „klasycznej” pętli ze licznikiem

W Kotlinie nie ma pętli for z trzema częściami (start, warunek, krok), znanej z wielu języków C-podobnych. Zamiast tego po prostu „przechodzimy po czymś”: po zakresie, kolekcji czy tekście. To prostsze i mniej podatne na błędy.

2

Iteracja po zakresie

Najczęściej for przechodzi po zakresie. Wykorzystasz tu wszystko, co znasz z poprzedniej lekcji: .., until, downTo i step.

Różne sposoby przechodzenia
// w górę
for (i in 1..5) print("$i ")          // 1 2 3 4 5
println()

// bez ostatniej wartości
for (i in 1 until 5) print("$i ")      // 1 2 3 4
println()

// w dół
for (i in 5 downTo 1) print("$i ")     // 5 4 3 2 1
println()

// co drugą wartość
for (i in 0..10 step 2) print("$i ")   // 0 2 4 6 8 10
3

Iteracja po kolekcji

Pętla for potrafi przejść po liście wartości – po kolei oddaje każdy jej element. Listy poznasz dokładnie w osobnym bloku; tutaj wystarczy wiedzieć, że listOf(...) tworzy listę, a for ją obchodzi.

Przejście po elementach listy
val owoce = listOf("jabłko", "banan", "gruszka")

for (owoc in owoce) {
    println("Owoc: $owoc")
}
// Owoc: jabłko
// Owoc: banan
// Owoc: gruszka
Listy – tylko zajawka

Tworzenie i modyfikowanie list (listOf, mutableListOf, dodawanie, usuwanie) to temat osobnego bloku o kolekcjach. Tu używamy listy wyłącznie jako czegoś, po czym da się „przejść” pętlą for.

4

Iteracja po znakach tekstu

Tekst (String) też da się obejść pętlą for – wtedy zmienna przyjmuje kolejno każdy znak (typ Char).

Znak po znaku
val slowo = "Kotlin"

for (znak in slowo) {
    print("$znak ")   // K o t l i n
}

To przydaje się np. do liczenia konkretnych znaków – choć i tu można połączyć wiedzę z poprzednich lekcji:

Liczenie samogłosek
val tekst = "programowanie"
var samogloski = 0

for (znak in tekst) {
    if (znak in "aeiouyąęó") {
        samogloski++
    }
}
println("Liczba samogłosek: $samogloski")
5

Indeks i wartość: withIndex()

Czasem podczas przechodzenia po liście potrzebujesz jednocześnie pozycji (indeksu) i wartości. Pomaga w tym withIndex() – w nawiasie pętli podajesz wtedy dwie nazwy w klamrach (indeks, wartość).

Numerowanie elementów
val owoce = listOf("jabłko", "banan", "gruszka")

for ((indeks, owoc) in owoce.withIndex()) {
    println("$indeks: $owoc")
}
// 0: jabłko
// 1: banan
// 2: gruszka
Indeksy liczymy od zera

Pierwszy element ma indeks 0. Jeśli chcesz numerować „po ludzku” od 1, wypisz ${indeks + 1}. Alternatywnie po samych indeksach przejdziesz pętlą for (i in owoce.indices), sięgając po wartość przez owoce[i].

6

Pętle zagnieżdżone

Pętlę można umieścić wewnątrz innej pętli. Dla każdego obrotu pętli zewnętrznej pętla wewnętrzna wykonuje się w całości. Klasyczny przykład to tabliczka mnożenia.

Tabliczka mnożenia 3 × 3
for (i in 1..3) {
    for (j in 1..3) {
        print("${i * j}\t")   // \t to tabulator
    }
    println()                  // nowa linia po każdym wierszu
}
// 1  2  3
// 2  4  6
// 3  6  9
Uważaj na liczbę obrotów

Pętle zagnieżdżone wykonują się mnożnie: dwie pętle po 100 elementów to już 10 000 obrotów. Przy dużych danych zwróć uwagę, ile pracy naprawdę zlecasz.

7

Częste błędy

❌ Błąd 1: próba „klasycznej” pętli

❌ Składnia z licznikiem

for (i = 0; i < 10; i++) {
    // Błąd! taka pętla
    // for nie istnieje
    // w Kotlinie
}

✅ Przejście po zakresie

for (i in 0 until 10) {
    println(i)
}

❌ Błąd 2: zakres malejący przez ..

❌ Pętla się nie wykona

for (i in 10..1) {
    print(i)
}
// nic! 10..1 jest pusty

✅ downTo dla liczenia w dół

for (i in 10 downTo 1) {
    print("$i ")
}
// 10 9 8 ... 1

❌ Błąd 3: zmiana zmiennej pętli w środku

❌ i jest tylko do odczytu

for (i in 1..5) {
    i = i + 1
    // Błąd! zmiennej pętli
    // nie można nadpisać
}

✅ Steruj krokiem przez step

for (i in 1..5 step 2) {
    println(i)
}
// 1 3 5

❌ Błąd 4: indeks poza zakresem listy

❌ 0..size sięga za daleko

for (i in 0..lista.size) {
    println(lista[i])
}
// Błąd! ostatni indeks
// to size - 1

✅ indices albo until size

for (i in lista.indices) {
    println(lista[i])
}
// poprawne indeksy
8

Podsumowanie

  • Schemat pętli: for (zmienna in coś_do_przejścia) { ... }.
  • W Kotlinie nie ma klasycznej pętli ze licznikiem – przechodzimy po zakresie, kolekcji lub tekście.
  • Po zakresie: 1..10, until, downTo, step – tak jak poznałeś w lekcji o zakresach.
  • Po kolekcji: for (element in lista); po tekście: for (znak in tekst).
  • withIndex() daje naraz indeks i wartość: for ((i, v) in lista.withIndex()).
  • Pętle można zagnieżdżać; liczba obrotów się mnoży.
  • Zmiennej pętli nie można nadpisywać; do listy po indeksie używaj indices.
9

Zadania do wykonania

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

Zadanie 1 łatwe

Wczytaj liczbę n i pętlą for wypisz wszystkie liczby od 1 do n, a na koniec ich sumę (zsumuj je w zmiennej var).

Zadanie 2 łatwe

Wypisz odliczanie od 10 do 1 (użyj downTo), a po nim napis „Start!”.

Zadanie 3 łatwe

Stwórz listę kilku imion (listOf(...)) i wypisz je z numeracją od 1, używając withIndex() oraz ${indeks + 1}.

Zadanie 4 średnie

Napisz program, który dla wczytanej liczby n wypisze pełną tabliczkę mnożenia n × n (pętle zagnieżdżone). Dla ambitnych: policz też sumę wszystkich liczb parzystych od 1 do n (połącz for, if i operator %).