Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych. Autor artykułu: mgr Jerzy Wałaszek, wersja 1.0 |
©2008 mgr
Jerzy Wałaszek |
Pętla (ang. loop) jest fragmentem programu, który może być wielokrotnie powtarzany. Powtarzanie wykonania fragmentu programu nazywamy obiegiem pętli. Pętla warunkowa (ang. conditonal loop) wykonuje powtarzanie swoich operacji w zależności od warunku, który nazywamy warunkiem kontynuacji. W języku C++ mamy do dyspozycji dwie pętle warunkowe (istnieje jeszcze trzecia, ale zajmiemy się nią na następnej lekcji):
Składnia pętli while jest następująca:
while
(warunek) instrukcja;
lub z wykorzystaniem instrukcji złożonej:
while
(warunek)
{
inst1;
inst2;
...;
}
warunek - wyrażenie dające w wyniku wartość różną od 0, gdy warunek jest spełniony, lub wartość równą 0, gdy warunek jest niespełniony.
Działanie pętli while jest następujące:
Najpierw obliczany jest warunek. Jeśli w wyniku dostajemy wartość różną od 0 (prawdziwą), to wykonana zostaje instrukcja pętli (lub instrukcje wewnątrz klamerek instrukcji złożonej). Po wykonaniu instrukcji następuje powrót na początek pętli i znów jest sprawdzany warunek kontynuacji. Pętla powtarza swoje instrukcje dotąd, aż warunek stanie się fałszywy, czyli jego wartością będzie 0. W takim przypadku pętla przestaje wykonywać swoją instrukcję i następuje przejście do dalszej części programu leżącej za pętlą.
Przykład:
Poniższa pętla while dodaje do zmiennej a liczbę 5 dopóki zawartość a jest mniejsza od 1000. Gdy zmienna a osiągnie wartość większą lub równą 1000, to warunek kontynuacji pętli stanie się fałszywy i dodawanie zostanie przerwane:
...
while(a < 1000)
a += 5;
...
Ponieważ warunek kontynuacji jest sprawdzany w pętli while na samym początku przed rozpoczęciem obiegu, to może się zdarzyć, iż będzie on fałszywy przy wejściu do pętli. W takim przypadku pętla while nie wykona ani jednego obiegu - zapamiętaj tę własność, ponieważ programiści C++ często ją wykorzystują w swoich programach. W powyższym przykładzie jeśli zmienna a zawiera wartość większą lub równą 1000, to pętla while nie doda do niej liczby 5 - warunek jest fałszywy.
UWAGA: Wielu uczniów z powodu małego zainteresowania programowaniem w języku C++ myli często instrukcję pętli warunkowej while z instrukcją warunkową if:
Pomyłka jest spowodowana prawdopodobnie podobieństwem składni obu instrukcji. Zapamiętaj: Instrukcja if nic nie powtarza, lecz
warunkowo wykonuje swoją instrukcję. |
Warunek pętli powinien być uzależniony w pewien sposób od wykonywanych instrukcji lub od czynników zewnętrznych. W przeciwnym razie możemy otrzymać tzw. pętlę nieskończoną (ang. infinite loop), która nigdy normalnie się nie kończy.
Przykład:
Poniższy przykład w nieskończoność wypisuje na ekranie tekst - Witaj w C++:
...
while(1) cout <<
"Witaj w C++ ";
...
Program odczytuje granicę g, a następnie sumuje kolejne liczby naturalne aż suma przekroczy g. Wtedy wypisuje obliczoną sumę oraz ostatnio zsumowaną liczbę naturalną.
Dane wejściowe:
g - granica sumowania
Dane wyjściowe:
suma - kolejnych liczb naturalnych bezpośrednio większa od g
i - ostatnio zsumowana liczba naturalna
Lista kroków:
K01: Czytaj g
K02: suma ← 0
K03: i ← 1
K04: Dopóki suma ≤ g wykonuj K05...K06
K05: suma ← suma + i
K06: i ← i + 1
K07: i ← i - 1
K08: Pisz suma, i
K09: Zakończ
Schemat blokowy:
Program w języku C++
// Suma ciągu liczb naturalnych // (C)2008 I LO w Tarnowie //------------------------ #include <iostream> using namespace std; int main() { int g,suma,i; cout << "Sumowanie kolejnych liczb naturalnych do przekroczenia granicy\n" "--------------------------------------------------------------\n\n"; // odczytujemy granicę g cout << "Podaj granice sumowania g = "; cin >> g; cout << endl; // w pętli sumujemy kolejne liczby naturalne aż suma przekroczy g suma = 0; i = 1; while(suma <= g) suma += i++; // wyprowadzamy wyniki cout << "Suma = " << suma << " dla i = " << --i << endl << endl; system("pause"); return 0; } |
Sumowanie kolejnych liczb naturalnych do przekroczenia granicy -------------------------------------------------------------- Podaj granice sumowania g = 1000 Suma = 1035 dla i = 45 Aby kontynuować, naciśnij dowolny klawisz . . . |
Przebuduj powyższy program, tak aby sumował liczby:
parzyste
parzyste, lecz niepodzielne przez 6
nieparzyste
nieparzyste, lecz niepodzielne przez 5
Składnia pętli do...while jest następująca:
do instrukcja; while(warunek);
lub z wykorzystaniem instrukcji złożonej:
do
{
inst1;
inst2;
...;
} while(warunek);
warunek - wyrażenie dające w wyniku wartość różną od 0, gdy warunek jest spełniony, lub wartość równą 0, gdy warunek jest niespełniony.
Działanie pętli do...while jest następujące:
Najpierw wykonywana jest instrukcja powtarzana w pętli. Po wykonaniu tej instrukcji obliczany jest warunek. Jeśli wynik jest różny od 0, to instrukcja jest powtarzana. W przeciwnym razie gdy warunek ma wartość 0, pętla zostaje przerwana i program przechodzi do wykonywania instrukcji leżących za pętlą.
Przykład:
Poniższa pętla do...while odejmuje od zmiennej a 5 dotąd, aż wynik tego odejmowania będzie liczbą ujemną. Zwróć uwagę, iż odejmowanie wykonywane jest zawsze przynajmniej jeden raz!
...
do a -= 5; while(a >= 0);
...
W pętli do...while warunek kontynuacji jest sprawdzany na końcu, po wykonaniu biegu. Zatem pętla do...while zawsze wykonuje przynajmniej jeden obieg - tym różni się od pętli while, która może nie wykonać ani jednego obiegu, gdy warunek jest fałszywy.
Jeśli warunek jest zawsze prawdziwy, to otrzymujemy pętlę nieskończoną.
Przykład:
Poniższy przykład w nieskończoność wypisuje na ekranie tekst - Witaj w C++:
...
do cout <<
"Witaj w C++ "; while(1);
...
Program żąda podania od użytkownika tajnego kodu - w tym przypadku jest to liczba 854. Odczyt kodu wykonywany jest dotąd, aż użytkownik poda właściwy kod.
Dane wejściowe:
kod - kod wprowadzony przez użytkownika
Dane wyjściowe:
Informacja o akceptacji wprowadzonego kodu.
Lista kroków:
K01: Czytaj kod
K02: Jeśli kod ≠ 854, to idź do K01
K03: Pisz "Kod zaakceptowany"
K04: Zakończ
Schemat blokowy:
Program w języku C++
// Sprawdzanie kodu dostępu // (C)2008 I LO w Tarnowie //------------------------ #include <iostream> using namespace std; int main() { int kod; cout << "System ROBO 378-XV86\n\n"; // czekamy w pętli na poprawny kod dostępu do { cout << "Wpisz kod: "; cin >> kod; } while(kod != 854); // ok, wprowadzono poprawny kod cout << "\nKod zaakceptowany\n\n"; system("pause"); return 0; } |
System ROBO 378-XV86 Wpisz kod: 125 Wpisz kod: 968 Wpisz kod: 854 Kod zaakceptowany Aby kontynuować, naciśnij dowolny klawisz . . . |
I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe