Instrukcje pętli warunkowych

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):

Pętla while

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:

while(warunek) instrukcja;      

lub

while(warunek)
{
   ...;
}

if(warunek) instrukcja;

lub

if(warunek)
{
  ...;
}

Pomyłka jest spowodowana prawdopodobnie podobieństwem składni obu instrukcji.

Zapamiętaj:

Instrukcja if nic nie powtarza, lecz warunkowo wykonuje swoją instrukcję.
Instrukcja while warunkowo powtarza 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++ ";
...

Sumy ciągów liczb

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 sumag wykonuj K05...K06
K05:     sumasuma + i
K06:     ii + 1
K07: ii - 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:

Pętla do...while

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);
...

Tajny kod

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 . . .

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.