1. Wprowadzenie
W programowaniu często trzeba wykonywać te same czynności wiele razy pod rząd. Na przykład:
- Przejść przez wszystkie elementy listy.
- Wczytywać z klawiatury wartości, dopóki użytkownik nie wpisze właściwej.
- Policzyć sumę wszystkich liczb od 1 do 100.
- Pytać użytkownika o hasło tak długo, aż wpisze poprawne.
Jeśli spróbujesz to wszystko zrobić bez pętli, wyjdzie długo, nudno i kompletnie nie do ogarnięcia. Wyobraź sobie, że piszesz kalkulator i postanawiasz ręcznie dodawać liczby od 1 do 10:
int sum = 0;
sum += 1;
sum += 2;
sum += 3;
// ... i tak 10 razy. No nieźle.
Znudzisz się, zanim skończysz! Rozwiązanie — pętle. Pozwalają opisać powtarzanie czynności krótko i czytelnie. Dzisiaj poznasz najbardziej podstawową, ale mega przydatną pętlę — while.
2. Poznajemy pętlę while
Składnia i podstawowy schemat
Pętla while to taki "papuga" w świecie programowania: powtarza ten sam fragment kodu, dopóki spełniony jest jakiś warunek. Jak tylko warunek przestaje być prawdziwy, papuga milknie (pętla się kończy).
while (warunek)
{
// Ciało pętli
}
while z blokiem poleceń
Diagram
Oto prosta blokowa ilustracja, żeby zrozumieć jak działa pętla while:
3. Przykłady: pętla while w akcji
Klasyczny licznik
Zróbmy prosty program, który liczy od 1 do 5 i wypisuje liczby:
int i = 1;
while (i <= 5)
{
Console.WriteLine($"Krok nr {i}");
i++; // Nie zapomnij zwiększyć licznika!
}
// Wypisze:
// 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 skończy (nasza papuga stanie się nieśmiertelna i będzie powtarzać w nieskończoność). To się nazywa nieskończona pętla — straszna sprawa.
Wczytywanie z klawiatury do właściwej wartości
Często pętla służy do tego, żeby "przycisnąć" użytkownika do poprawnej odpowiedzi:
string password = "";
while (password != "qwerty")
{
Console.Write("Wpisz hasło: ");
password = Console.ReadLine();
}
Console.WriteLine("Witamy!");
Tu program prosi o hasło, dopóki nie wpiszesz magicznego "qwerty". Uwaga: jeśli usuniesz linię password = Console.ReadLine();, pętla znowu 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 jest od razu fałszywy — ciało pętli nie wykona się ani razu.
Przykład: warunek od razu fałszywy
int i = 10;
while (i < 5)
{
Console.WriteLine(i); // Nigdy się nie wykona!
}
No i logiczne. Tak właśnie powinno być.
Zagnieżdżone pętle while
Czasem trzeba zrobić pętlę w pętli. Na przykład przejść przez wszystkie linie, a w każdej sprawdzić wszystkie znaki. Na tym etapie to trochę szaleństwo, ale oto prosty przykład:
int i = 1;
while (i <= 3)
{
int j = 1;
while (j <= 2)
{
Console.WriteLine($"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
O zagnieżdżonych pętlach pogadamy szerzej za parę wykładów, na razie chciałem Cię tylko trochę postraszyć :)
Nieskończona pętla
Czasem pętle się kończą, a czasem — żyją wiecznie.
while (true)
{
Console.WriteLine("Jestem wieczny!");
}
Rzadko używane, zwykle do jakichś procesów w tle (np. serwer), ale też się przydaje.
5. Jak nie pisać głupot: typowe błędy z while
W programowaniu pętla to jak prąd: fajna sprawa, ale trzeba znać zasady bezpieczeństwa.
Problem 1: nieskończona pętla przez nieuwagę
Bardzo często początkujący zapominają zaktualizować zmienną, od której zależy warunek. W efekcie pętla działa "w nieskończoność" i trzeba zatrzymać program na siłę (np. kombinacją Ctrl + C).
int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
// i++; // OJEJ! Zapomnieliśmy zwiększyć i
}
Problem 2: źle ustawiony warunek
Czasem programista sam sobie kopie dołek: warunek nigdy nie jest prawdziwy. W efekcie pętla nie wykona się w ogóle.
int i = 10;
while (i < 5)
{
Console.WriteLine(i); // Ten kod nigdy się nie wykona.
i++;
}
Problem 3: błąd z typami danych
W warunku pętli zawsze musi być wyrażenie boolowskie — czyli wynik obliczeń musi być true albo false.
int number = 5;
while (number) // Błąd! Oczekiwano bool, a nie int.
{
number--;
}
GO TO FULL VERSION