:~$ newsletter --subscribe
cat ~/artykuly/programowanie/petla-while-oraz-do-while-w-c.md

Pętla WHILE oraz DO-WHILE w C++

Pętla While jest jedną z najczęściej stosowanych pętli przez programistów. Umożliwia ona sprawdzenie warunku logicznego na samym początku w przeciwieństwie do instrukcji DO WHILE gdzie warunek ten sprawdzany jest na końcu. (UWAGA: Pętla DO-WHILE zawsze wykona się przynajmniej raz).

Ogólna składnia pętli WHILE wygląda tak:

cpp
while(warunek_logiczny) {
    instrukcja1;
    instrukcja2;
}
cpp
while(warunek_logiczny)
    instrukcja1; //koniec pętli

Przykład zastosowania pętli WHILE:

cpp
while(a == 0) {
     cout << "Podaj jeszcze raz liczbę (ma ona być różna od 0):";
     cin >> a;
}

Powyższa pętla będzie działać do momentu, aż zostanie podana liczba różna od 0 (wtedy warunek podany na początku instrukcji zwróci false czyli będzie nieprawdziwy i pętla nie zostanie wykonana).

Ogólna składnia pętli DO WHILE:

cpp
do {
     instrukcja1;
     instrukcja2;
} while(warunek_logiczny);

Przykład zastosowania pętli DO WHILE:

cpp
do {
     cout << "Podaj liczbę (różną od 0):";
     cin >> a;
} while(a == 0);

While czy do-while? Praktyczna różnica

Skoro obie pętle robią niemal to samo, kiedy wybrać którą? Regułka jest krótka. Gdy kod MOŻE nie wykonać się ani razu (na przykład przetwarzanie listy, która bywa pusta), właściwy jest while. Gdy kod MUSI wykonać się przynajmniej raz (wczytanie danych od użytkownika, wyświetlenie menu), naturalny jest do-while, bo najpierw działamy, a dopiero potem sprawdzamy, czy powtórzyć.

Zadanie klasyczne: menu programu na do-while

cpp
#include <iostream>
using namespace std;

int main() {
    int wybor;
    do {
        cout << "--- MENU ---\n";
        cout << "1. Powiedz czesc\n";
        cout << "0. Koniec\n";
        cout << "Twoj wybor: ";
        cin >> wybor;

        if (wybor == 1) cout << "Czesc!\n";
    } while (wybor != 0);

    cout << "Do zobaczenia!\n";
    return 0;
}

Menu musi pokazać się co najmniej raz, a do-while dokładnie to gwarantuje. Dokładnie tę samą konstrukcję pokazywałem w Pascalu przy okazji pętli REPEAT UNTIL, z jedną różnicą: tam warunek mówi, kiedy SKOŃCZYĆ, a w do-while, kiedy KONTYNUOWAĆ.

Pętla nieskończona i przerywanie: break oraz continue

Zapis while (true) tworzy pętlę nieskończoną, którą przerywamy instrukcją break w wybranym momencie. Z kolei continue pomija resztę obrotu i wraca do sprawdzenia warunku:

cpp
while (true) {
    cin >> liczba;
    if (liczba == 0) break;       // zero konczy wczytywanie
    if (liczba < 0) continue;     // ujemne pomijamy
    suma += liczba;
}

Dwa błędy, które robi każdy początkujący

  • Średnik po warunku: zapis while (a < 10); tworzy pętlę z PUSTYM ciałem. Jeżeli warunek jest prawdziwy, program wisi w miejscu, a blok w klamrach poniżej wykona się tylko raz, już po pętli.
  • Brak zmiany warunku w ciele pętli: gdy nic w środku nie zmienia zmiennych z warunku, pętla nigdy się nie skończy. Przy „wiszącym” programie to pierwsza rzecz do sprawdzenia.