while, do-while, break / continue
Nie zawsze z góry wiadomo, ile razy coś trzeba powtórzyć. Pętle while
i do-while działają „dopóki warunek jest prawdziwy”. Poznasz też
break (przerwij pętlę), continue (pomiń obrót) oraz krótkie
wprowadzenie do etykiet.
Pętla while
while powtarza blok kodu dopóki warunek jest prawdziwy.
Warunek sprawdzany jest przed każdym obrotem – jeśli od początku
jest fałszywy, pętla nie wykona się ani razu.
var i = 1 while (i <= 5) { println(i) i++ // KLUCZOWE: zbliżamy się do końca warunku }
Wewnątrz pętli while musi dziać się coś, co w końcu uczyni warunek
fałszywym (tu: i++). Bez tego pętla kręci się w nieskończoność,
a program się „zawiesza”.
Gdy z góry wiesz, po czym przechodzisz (np. po zakresie), wygodniejsze bywa
for z poprzedniej lekcji. while błyszczy tam, gdzie liczba
powtórzeń nie jest znana z góry – np. „czytaj dane, dopóki użytkownik
nie wpisze 0”.
Pętla do-while
W do-while warunek sprawdzany jest na końcu, po
wykonaniu bloku. Dzięki temu blok wykona się co najmniej raz,
nawet jeśli warunek od początku jest fałszywy.
var liczba = 0 do { println("Obrót numer $liczba") liczba++ } while (liczba < 3)
| Pętla | Kiedy sprawdza warunek | Minimalna liczba wykonań |
|---|---|---|
while | przed obrotem | 0 (może nie wykonać się wcale) |
do-while | po obrocie | 1 (zawsze co najmniej raz) |
Gdy chcesz najpierw coś pokazać (np. menu wyboru), a dopiero potem
zdecydować, czy powtarzać – wybierz do-while. Menu zawsze wyświetli się
przynajmniej raz.
break – przerwij pętlę
Słowo break natychmiast kończy pętlę i przechodzi do
kodu po niej – nawet jeśli warunek wciąż byłby prawdziwy. Działa w każdej pętli
(while, do-while, for).
for (i in 1..100) { if (i * i > 50) { println("Pierwsza liczba z kwadratem > 50: $i") break // kończymy pętlę – reszta nie jest sprawdzana } } // Pierwsza liczba z kwadratem > 50: 8
continue – pomiń obrót
continue pomija resztę bieżącego obrotu i przechodzi do
następnego. Pętla nie kończy się – po prostu „przeskakujemy” jeden przebieg.
for (i in 1..10) { if (i % 2 == 0) { continue // pomiń liczby parzyste } print("$i ") // 1 3 5 7 9 }
Łatwo je pomylić: break wychodzi z pętli na dobre,
a continue tylko opuszcza jeden obrót i leci dalej.
Pętla „do skutku”: while(true) + break
Czasem chcemy powtarzać coś, aż spełni się jakiś warunek w środku
pętli. Stosujemy wtedy pętlę celowo nieskończoną while (true),
z której wychodzimy przez break.
while (true) { print("Podaj hasło: ") val haslo = readln() if (haslo == "kotlin") { println("Dostęp przyznany") break // jedyne wyjście z pętli } println("Błędne hasło, spróbuj ponownie") }
while (true) nigdy nie zakończy się sama – wewnątrz musi być
break (albo return), inaczej program zawiesi się na zawsze.
Etykiety (krótkie wprowadzenie)
W pętlach zagnieżdżonych break przerywa tylko pętlę
wewnętrzną. Jeśli chcesz wyjść od razu z pętli zewnętrznej, nadaj jej
etykietę – nazwę zakończoną znakiem @ – i wskaż ją:
break@nazwa.
petla@ for (i in 1..3) { for (j in 1..3) { if (i * j == 4) { println("Stop przy $i * $j") break@petla // wychodzi z OBU pętli } println("$i * $j = ${i * j}") } }
Etykiety działają też z continue@nazwa. Bywają przydatne, ale potrafią
utrudnić czytanie kodu – sięgaj po nie tylko wtedy, gdy naprawdę musisz wyjść
z zewnętrznej pętli. Często da się to rozwiązać prościej.
Częste błędy
❌ Błąd 1: brak zmiany warunku → pętla nieskończona
❌ i nigdy nie rośnie
var i = 1
while (i <= 5) {
println(i)
// brak i++ !
}
// pętla kręci się
// w nieskończoność
✅ Zbliżamy się do końca
var i = 1
while (i <= 5) {
println(i)
i++
}
❌ Błąd 2: średnik zaraz po while
❌ ; tworzy pustą pętlę
var i = 1
while (i <= 5);
{
println(i)
i++
}
// pusta pętla zawiesza
// program (i się nie zmienia)
✅ Bez średnika
var i = 1
while (i <= 5) {
println(i)
i++
}
❌ Błąd 3: pomylenie break z continue
❌ break ucina za wcześnie
for (i in 1..5) {
if (i == 3) break
println(i)
}
// 1 2 – pętla się kończy!
✅ continue tylko pomija
for (i in 1..5) {
if (i == 3) continue
println(i)
}
// 1 2 4 5
❌ Błąd 4: break w pętli zagnieżdżonej
❌ break wychodzi tylko z wewnętrznej
for (i in 1..3) {
for (j in 1..3) {
if (warunek) break
// przerywa TYLKO
// pętlę po j
}
}
✅ Etykieta dla pętli zewnętrznej
petla@ for (i in 1..3) {
for (j in 1..3) {
if (warunek) break@petla
// wychodzi z obu
}
}
Podsumowanie
while (warunek) { ... }– powtarza, dopóki warunek prawdziwy; sprawdza go przed obrotem (może nie wykonać się wcale).do { ... } while (warunek)– sprawdza warunek po obrocie; wykona się co najmniej raz.- W
whilemusi dziać się coś, co w końcu zakończy warunek – inaczej pętla nieskończona. break– natychmiast kończy pętlę;continue– pomija bieżący obrót.while (true)+breakto wzorzec „powtarzaj do skutku”.- W pętlach zagnieżdżonych
break/continuedotyczą pętli wewnętrznej; etykieta (nazwa@) pozwala wskazać zewnętrzną.
Zadania do wykonania
Zadania z wczytywaniem uruchamiaj w IntelliJ IDEA; pozostałe w Kotlin Playground.
Za pomocą pętli while (z licznikiem var i) wypisz liczby
od 1 do 10. Pamiętaj o zwiększaniu licznika.
Napisz pętlę for po liczbach 1–30, która wypisuje tylko liczby
niepodzielne przez 3 (użyj continue), a po dojściu do 20 przerywa się
(break).
Korzystając z while (true) i break, wczytuj liczby od
użytkownika i sumuj je, aż wpisze 0. Na koniec wypisz sumę.
Napisz proste menu w pętli do-while: wyświetl opcje (1 – przywitaj,
2 – pożegnaj, 0 – wyjście), wczytaj wybór i obsłuż go instrukcją when.
Pętla ma się powtarzać, dopóki użytkownik nie wybierze 0.