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 – 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ść.
for (i in 1..5) { println("Iteracja numer $i") } // Iteracja numer 1 // Iteracja numer 2 // ... aż do 5
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.
Iteracja po zakresie
Najczęściej for przechodzi po zakresie. Wykorzystasz tu
wszystko, co znasz z poprzedniej lekcji: .., until,
downTo i step.
// 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
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.
val owoce = listOf("jabłko", "banan", "gruszka") for (owoc in owoce) { println("Owoc: $owoc") } // Owoc: jabłko // Owoc: banan // Owoc: gruszka
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.
Iteracja po znakach tekstu
Tekst (String) też da się obejść pętlą for – wtedy zmienna
przyjmuje kolejno każdy znak (typ Char).
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:
val tekst = "programowanie" var samogloski = 0 for (znak in tekst) { if (znak in "aeiouyąęó") { samogloski++ } } println("Liczba samogłosek: $samogloski")
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ść).
val owoce = listOf("jabłko", "banan", "gruszka") for ((indeks, owoc) in owoce.withIndex()) { println("$indeks: $owoc") } // 0: jabłko // 1: banan // 2: gruszka
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].
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.
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
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.
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
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.
Zadania do wykonania
Zadania z wczytywaniem uruchamiaj w IntelliJ IDEA; pozostałe w Kotlin Playground.
Wczytaj liczbę n i pętlą for wypisz wszystkie liczby
od 1 do n, a na koniec ich sumę (zsumuj je w zmiennej var).
Wypisz odliczanie od 10 do 1 (użyj downTo), a po nim napis „Start!”.
Stwórz listę kilku imion (listOf(...)) i wypisz je z numeracją od 1,
używając withIndex() oraz ${indeks + 1}.
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 %).