1. Wprowadzenie
W programowaniu często trzeba wykonywać te same czynności wiele razy z rzędu. Na przykład:
- Przejść po wszystkich elementach listy.
- Odczytywać z klawiatury wartości, dopóki użytkownik nie wprowadzi właściwej.
- Obliczyć sumę wszystkich liczb od 1 do 100.
- Pytać użytkownika o hasło tak długo, aż poda poprawne.
Jeśli spróbujesz zrealizować to wszystko bez pętli, wyjdzie długo, nudno i nieskalowalnie. Wyobraź sobie, że piszesz program kalkulator i decydujesz się dodawać liczby od 1 do 10 ręcznie:
int sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
// ... i tak 10 razy. Ech.
Znudzisz się, zanim skończysz! Rozwiązanie — pętle. Pozwalają zwięźle i jasno opisać powtarzanie czynności. Dziś poznamy najbardziej podstawową, ale diabelnie przydatną pętlę — while.
2. Poznajemy pętlę while
Składnia i podstawowy schemat
Pętla while to „papuga” w świecie programowania: powtarza ten sam fragment kodu tak długo, jak spełniony jest pewien warunek. Gdy tylko warunek przestaje być prawdziwy, papuga milknie (pętla się kończy).
Składnia:
while (condition)
{
// Ciało pętli
}
Diagram
Oto prosty schemat blokowy ułatwiający zrozumienie działania pętli while:
3. Przykłady: pętla while w działaniu
Klasyczny licznik
Zróbmy prosty program, który liczy od 1 do 5 i wypisuje liczby:
int i = 1;
while (i <= 5)
{
System.out.println("Krok nr " + i);
i++; // Nie zapomnij zwiększyć licznika!
}
// Wyświetli:
// Krok nr 1
// Krok nr 2
// Krok nr 3
// Krok nr 4
// Krok nr 5
Zwróć uwagę: jeśli zapomnisz zwiększyć zmienną i, pętla nigdy się nie zakończy (nasza papuga stanie się nieśmiertelna i wiecznym powtarzaczem). To się nazywa nieskończona pętla — rzecz dość groźna.
Wczytywanie z klawiatury aż do uzyskania poprawnej wartości
Często pętla służy do „dociskania” użytkownika do poprawnej odpowiedzi:
String password = "";
while (!password.equals("qwerty"))
{
System.out.print("Podaj hasło: ");
password = console.nextLine();
}
System.out.println("Witamy!");
Tutaj program prosi o podanie hasła, dopóki nie wpiszesz magicznego "qwerty". Nie zapomnij: jeśli usuniesz linię password = console.nextLine();, pętla znów stanie się nieskończona (będzie pytać o hasło, ale nie będzie czytać wejścia — zawiesi się na zawsze, jak zepsuty robot).
4. Rodzaje i scenariusze użycia pętli while
Zwykła pętla while
Ta pętla, jak pokazano wyżej, sprawdza warunek przed pierwszą iteracją. Jeśli warunek od razu jest fałszywy — ciało pętli nie wykona się ani razu.
Przykład: warunek nie jest spełniony od razu
int i = 10;
while (i < 5)
{
System.out.println(i); // Nie wykona się nigdy!
}
Co, swoją drogą, jest logiczne. Dokładnie tak, jak tu napisano.
Zagnieżdżone pętle while
Czasem trzeba zrobić pętlę w pętli. Na przykład przejść po wszystkich wierszach i w każdym z nich sprawdzić wszystkie znaki. Na tym etapie to raczej przygoda, ale oto prosty przykład:
int i = 1;
while (i <= 3)
{
int j = 1;
while (j <= 2)
{
System.out.println("i = " + i + ", j = " + j);
j++;
}
i++;
}
// i = 1, j = 1
// i = 1, j = 2
// i = 2, j = 1
// i = 2, j = 2
// i = 3, j = 1
// i = 3, j = 2
Szczegółowo omówimy zagnieżdżone pętle za kilka lekcji, na razie tylko chciałem was postraszyć :)
Nieskończona pętla
Czasem pętle się kończą, a czasem — żyją wiecznie.
while (true)
{
System.out.println("Jestem wieczny!");
}
Używana rzadko, zwykle do jakichś procesów w tle (na przykład praca serwera), ale też stosowana w praktyce.
5. Jak nie robić głupot: częste błędy z while
W programowaniu pętla jest jak elektryczność: świetna sprawa, ale trzeba znać zasady bezpieczeństwa.
Problem 1: nieskończona pętla przez nieuwagę
Bardzo często początkujący zapominają aktualizować zmienną, od której zależy warunek. W efekcie pętla działa „w nieskończoność” i trzeba zatrzymać program ręcznie (na przykład kombinacją Ctrl + C).
int i = 1;
while (i <= 5)
{
System.out.println(i);
// i++; // Ojej! Zapomnieliśmy zwiększyć i
}
Problem 2: błędnie ustawiony warunek
Czasem programista sam sobie kopie dołek: warunek nigdy nie bywa prawdziwy. W efekcie pętla nie wykonuje się w ogóle.
int i = 10;
while (i < 5)
{
System.out.println(i); // Ten kod nigdy się nie wykona.
i++;
}
Problem 3: błąd typów danych
W warunku pętli zawsze musi być wyrażenie boolowskie — czyli wynik obliczeń powinien być true lub false.
int number = 5;
while (number) // Błąd! Oczekiwano boolean, a nie int.
{
number--;
}
GO TO FULL VERSION