Informatyka dla klas II – pętla iteracyjna

Obiegi wykonywane przez pętlę można numerować. Obieg numerowany nazywamy iteracją. Iteracja wymaga dodatkowej zmiennej, która przechowuje numer wykonywanego przez pętlę obiegu. Zmienna ta nosi nazwę licznika pętli (ang. loop counter). Pętlę iteracyjną możemy utworzyć przy pomocy poznanych dotychczas pętli warunkowych.

Przykład:

Poniższe pętle wykonują 10 obiegów. Obiegi zliczane są przez zmienną i, która pełni tutaj rolę licznika pętli.

...
i = 1;
while(i <= 10)
{
    cout << i << endl;     
    i++;
}
...
...
i = 1;
do
{
    cout << i << endl;
    i++;
} while(i <= 10);
...

Ponieważ pętle iteracyjne pojawiają się w programach bardzo często, w języku C++ istnieje specjalna instrukcja do ich łatwej realizacji. Składnia tej instrukcji jest następująca:

 

for(prolog; kontynuacja; epilog) instrukcja;

 

lub z instrukcją złożoną:

 

for(prolog; kontynuacja; epilog)
{
   Ciąg instrukcji;
}

 

prolog  -  instrukcja wykonywana przed rozpoczęciem pierwszej iteracji. Najczęściej służy do inicjalizacji licznika pętli.
Przykład:

for(i  = 1;...

kontynuacja  - warunek kontynuacji pętli. Jeśli wyrażenie to ma wartość różną od 0, to pętla wykona obieg. Warunek jest sprawdzany na początku każdej iteracji.
Przykład:

for(i = 1; i <= 10;...

epilog  - instrukcja wykonywana po zakończeniu każdej iteracji. Najczęściej wykorzystuje się ją do modyfikacji licznika pętli.
Przykład:

for(i = 1; i <= 10; i++)...

instrukcja  - instrukcja powtarzana w każdej iteracji pętli.
Przykład:

for(i = 1; i <= 10; i++) cout << i << endl;


Przykłady różnych pętli iteracyjnych

W poniższych przykładach zakładamy, iż wszystkie niezbędne zmienne zostały wcześniej odpowiednio zadeklarowane.

Pętla wypisuje kolejne liczby całkowite od 1 do 10:

for(i = 1; i <= 10; i++) cout << i << endl;

Pętla wypisuje liczby od 10 do 1 w kierunku odwrotnym:

for(i = 10; i >= 1; i--) cout << i << endl;

Pętla wypisuje kolejne liczby parzyste od 4 do 26:

for(i = 4; i <= 26; i += 2) cout << i << endl;

 

Zagnieżdżone pętle iteracyjne

Poniższy fragment programu wypisuje wiersz zbudowany z 20 znaków X:

for(i = 0; i < 20; i++) cout << "X";
cout << endl;

Jeśli powtórzymy ten fragment programu 20 razy, to otrzymamy kwadrat z literek X. Instrukcją powtarzaną w pętli może być druga pętla - otrzymamy wtedy układ zagnieżdżony:

for(j = 0; j < 20; j++)
{
    for(i = 0; i < 20; i++) cout << "X";
    cout << endl;
}

Pętla wewnętrzna jest sterowana zmienną i. Jej zadaniem jest wyświetlenie jednego wiersza 20 znaków X. Pętla ta jest powtarzana 20 razy przez pętlę zewnętrzną sterowaną zmienną j. W efekcie w oknie konsoli pojawia się 20 wierszy, każdy zbudowany z 20 literek X:

XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX

 

W pętlach zagnieżdżonych muszą być stosowane różne zmienne liczników pętli.

Jeśli ilość wykonań pętli wewnętrznej uzależnimy od numeru obiegu pętli zewnętrznej, to otrzymamy trójkąt:

for(j = 0; j < 20; j++)
{
    for(i = 0; i <= j; i++) cout << "X";
    cout << endl;
}

X
XX
XXX
XXXX
XXXXX
XXXXXX
XXXXXXX
XXXXXXXX
XXXXXXXXX
XXXXXXXXXX
XXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX

Zastanów się, jak zmienić podane pętle, aby uzyskać następujące wydruki w oknie konsoli:

XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXX
XXXXXXXXXX
XXXXXXXXX
XXXXXXXX
XXXXXXX
XXXXXX
XXXXX
XXXX
XXX
XX
X

                   X
                  XX
                 XXX
                XXXX
               XXXXX
              XXXXXX
             XXXXXXX
            XXXXXXXX
           XXXXXXXXX
          XXXXXXXXXX
         XXXXXXXXXXX
        XXXXXXXXXXXX
       XXXXXXXXXXXXX
      XXXXXXXXXXXXXX
     XXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXX
   XXXXXXXXXXXXXXXXX
  XXXXXXXXXXXXXXXXXX
 XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXX
 XXXXXXXXXXXXXXXXXXX
  XXXXXXXXXXXXXXXXXX
   XXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXX
     XXXXXXXXXXXXXXX
      XXXXXXXXXXXXXX
       XXXXXXXXXXXXX
        XXXXXXXXXXXX
         XXXXXXXXXXX
          XXXXXXXXXX
           XXXXXXXXX
            XXXXXXXX
             XXXXXXX
              XXXXXX
               XXXXX
                XXXX
                 XXX
                  XX
                   X

 

W wyrażeniach możemy stosować funkcje logiczne, których w języku C++ mamy trzy:

 

NIE - Negacja/Zaprzeczenie logiczne (ang. not)

w !w
0 1
1 0

Jest to funkcja jednoargumentowa, której argumentem jest wyrażenie w. Wynikiem jest wartość przeciwna do wartości logicznej wyrażenia w.

 

LUB - Alternatywa/Suma logiczna (ang. or)

w1 w2 w1 || w2
0 0 0
0 1 1
1 0 1
1 1 1

Jest to funkcja dwuargumentowa. Wynik jest równy true tylko wtedy, gdy dowolny z argumentów jest prawdziwy (ma wartość różną od zera). Jeśli oba argumenty są fałszywe (równe zero), to wynikiem jest false. Nazwa suma logiczna pochodzi z podobieństwa wyniku tej funkcji do operacji dodawania liczb nieujemnych. Suma dwóch liczb nieujemnych jest różna od 0, jeśli dowolna z sumowanych liczb jest różna od 0. Suma wynosi 0, jeśli oba argumenty są równe 0.

 

I - Koniunkcja/Iloczyn logiczny (ang. and)

w1 w2 w1 && w2
0 0 0
0 1 0
1 0 0
1 1 1

Jest to funkcja dwuargumentowa. Wynik jest równy true tylko wtedy, gdy oba argumenty są prawdziwe (różne od zera). W przeciwnym razie wynik jest równy false. Nazwa iloczyn logiczny pochodzi z podobieństwa wyniku tej funkcji do operacji mnożenia. Wynik mnożenia jest niezerowy, jeśli wszystkie mnożone liczby są niezerowe.

 

Funkcje logiczne można łączyć:

a || b || c || d
a && b && c && d
a && (b || c)
!(a || b && c)


Wykorzystując funkcję LUB utwórz pętle, które tworzą następujące wydruki (zastanów się dla jakich i,j ma być wyświetlana spacja lub znak X):

XXXXXXXXXXXXXXXX
X              X
X              X
X              X
X              X
X              X
X              X
X              X
X              X
X              X
X              X
X              X
X              X
X              X
X              X
XXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXX
XX             X
X X            X
X  X           X
X   X          X
X    X         X
X     X        X
X      X       X
X       X      X
X        X     X
X         X    X
X          X   X
X           X  X
X            X X
X             XX
XXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXX
X             XX
X            X X
X           X  X
X          X   X
X         X    X
X        X     X
X       X      X
X      X       X
X     X        X
X    X         X
X   X          X
X  X           X
X X            X
XX             X
XXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXX
XX            XX
X X          X X
X  X        X  X
X   X      X   X
X    X    X    X
X     X  X     X
X      XX      X
X      XX      X
X     X  X     X
X    X    X    X
X   X      X   X
X  X        X  X
X X          X X
XX            XX
XXXXXXXXXXXXXXXX

 


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

©2024 mgr Jerzy Wałaszek

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

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