Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Materiały dla klasy II

C++: Pętle warunkowe

SPIS TREŚCI

Pętla

Pętla (ang. loop) to cykliczne powtarzanie wykonywania wybranej instrukcji lub grupy instrukcji w programie. Obiegiem pętli (ang. loop pass) nazywamy pojedynczy cykl wykonania powtarzanej instrukcji lub grupy instrukcji. Pętla warunkowa (ang. conditional loop) wykonuje powtarzanie obiegów w zależności od wybranego warunku.

Na początek:  podrozdziału   strony 

Pętla typu while

while(warunek) instrukcja;
while      - słowo kluczowe języka C++ oznaczające instrukcję pętli warunkowej
warunek    - dowolne wyrażenie arytmetyczne. Warunek jest prawdziwy (true), jeśli ma wartość różną od zera. Warunek jest fałszywy (false), jeśli ma wartość zero.
instrukcja - powtarzana w pętli instrukcja.

Pętla typu while działa następująco. Na początku każdego obiegu komputer oblicza wartość warunku. Jeśli wynik jest różny od zera, to zostaje wykonana instrukcja i komputer rozpoczyna nowy obieg od ponownego obliczenia wartości warunku. Jeśli warunek  ma wartość równą zero, instrukcja w pętli nie zostaje wykonana i pętla kończy działanie.

// Kolejne liczby naturalne od 1 do 100
//-------------------------------------

#include <iostream>

using namespace std;

int main()
{
    int i;

    i = 1;

    while(i <= 100) cout << i++ << " ";

    cout << "\nKONIEC\n";

    return 0;
}

Ponieważ warunek  jest sprawdzany na początku każdego obiegu pętli przed wykonaniem instrukcji zawartej w pętli, to jeśli jest on już od początku fałszywy, pętla nie wykona ani jednego obiegu.

// Fałszywy warunek
//-----------------

#include <iostream>

using namespace std;

int main()
{
    int i;

    i = 101;

    while(i <= 100) cout << i++ << " ";

    cout << "\nKONIEC\n";

    return 0;
}

Przykładowe programy:

// Kolejne liczby parzyste od 2 do n
//----------------------------------

#include <iostream>

using namespace std;

int main()
{
    int i,n;

    cin >> n;

    i = 2;

    while(i <= n)
    {
        cout << i << " ";
        i += 2;
    }

    cout << endl;

    return 0;
}
// Kolejne liczby nieparzyste od 2 do n
//-------------------------------------

#include <iostream>

using namespace std;

int main()
{
    int i,n;

    cin >> n;

    i = 1;

    while(i <= n)
    {
        cout << i << " ";
        i += 2;
    }

    cout << endl;

    return 0;
}
// Sumy kolejnych liczb od 1 do n
//-------------------------------

#include <iostream>

using namespace std;

int main()
{
    int i,n,s;

    cin >> n;

    i = 1; s = 0;

    while(i <= n)
    {
        s += i++;
        cout << s << endl;
    }

    return 0;
}

Zadania do lekcji

Napisać programy, które wczytują liczbę n, po czym wyświetlają n kolejnych wyrazów następujących ciągów liczbowych:
  1. 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 ...
  2. 1 2 3 4 3 2 1 2 3 4 3 2 1 ...
  3. 1 -2 3 -4 5 -6 7 -8 ...
  4. 5 4 3 2 1 0 5 4 3 2 1 0 ...
  5. 1 2 4 8 16 32 64 128 256 ...

Dodatkowo program powinien na końcu wypisać sumę tych n wyrazów.


Pętla do while

W języku C++ istnieją trzy rodzaje pętli. Poznaliśmy jedną z nich, pętlę while. Drugą jest jej siostra do while:

do instrukcja; while(warunek);

do         - słowo kluczowe języka C++ oznaczające początek pętli warunkowej
instrukcja - powtarzana w pętli instrukcja. Zwróć uwagę, że musi ona kończyć się średnikiem.
while      - słowo kluczowe oznaczające sekcję sprawdzania warunku.
warunek  
 - dowolne wyrażenie arytmetyczne. Warunek jest prawdziwy (true), jeśli ma wartość różną od zera. Warunek jest fałszywy (false), jeśli ma wartość zero.

Pętla typu do...while różni się od pętli while. W każdym obiegu najpierw wykonywana jest instrukcja, a dopiero po jej wykonaniu komputer oblicza i sprawdza warunek. Jeśli ma on wartość różną od zera, to wykonywany jest następny obieg pętli. Jeśli warunek  ma wartość zero, pętla nie wykonuje dalszych obiegów i jest przerywana.

// Kolejne liczby naturalne od 1 do 100
//-------------------------------------

#include <iostream>

using namespace std;

int main()
{
    int i;

    i = 1;

    do cout << i++ << " "; while(i <= 10);

    cout << "\nKONIEC\n";

    return 0;
}

Ponieważ warunek kontynuacji jest sprawdzany w pętli do...while na końcu obiegu po wykonaniu powtarzanej instrukcji, to pętla wykonuje zawsze przynajmniej jeden obieg bez względu na wartość warunku - czyli inaczej niż pętla while, która przy fałszywym warunku nie wykonywała się ani jeden raz.

// Fałszywy warunek
//------------------------

#include <iostream>

using namespace std;

int main()
{
    int i;

    i = 101;

    do cout << i++ << " "; while(i <= 10);

    cout << "\nKONIEC\n";

    return 0;
}

Jeśli w pętli chcemy powtarzać więcej niż jedną instrukcję, to stosujemy instrukcję blokową (po klamerce zamykającej nie musimy wstawiać średnika):

while(warunek)
{

    ciąg instrukcji
}

          do
{
    ciąg instrukcji
} while(warunek);

Pętlę do while stosujemy najczęściej wtedy, gdy warunek sprawdzany w pętli nie może być obliczony bez wykonania przynajmniej jednego obiegu. Na przykład wyobraźmy sobie, że piszemy program sprawdzający hasło dostępu, którym będzie liczba 123. Jeśli użytkownik wprowadzi właściwy kod, to program go przepuszcza dalej. Jeśli kod jest zły, to program powinien wypisać odpowiednią informację i ponownie wczytać kod.

// Odczyt hasła
//-------------

#include <iostream>

using namespace std;

int main()
{
    int p;

    setlocale(LC_ALL,"");    // Polskie litery

    do
    {
       cout << "Wpisz hasło:  ";

       cin >> p;

       cout << endl << endl;

       if(!cin.good()) break;

    } while(p != 123);

    if(cin.good())
    {
        cout << "Hasło zaakceptowane" << endl;
        return 0;
    }
    else
    {
        cout << "Próba włamania!!!" << endl;
        return -1;
    }
    return 0;
}

W programie występują nowe elementy:

cin.good() : jest to tzw. funkcja składowa strumienia cin. Sprawdza ona stan strumienia. Jeśli jest on dobry, to funkcja zwraca true, w przeciwnym razie zwraca false.
! : jest to operator logicznego przeczenia. Wartość logiczna wyrażenia objętego tym operatorem zmienia się na przeciwną. Na przykład:
!(5 == 2)
daje wartość logiczną true, ponieważ wyrażenie (5 == 2) jest fałszywe i ma wartość false, a operator ! zmienia tę wartość na przeciwną, czyli true.
!cin.good() : daje wartość true, jeśli stan strumienia jest zły
break; : instrukcja przerywa wykonywanie pętli.

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.