Koło informatyczne

Przyspieszony kurs języka C++

 

Pętla iteracyjna

Iteracja to numerowany obieg pętli, czyli obieg z numerem. Pętla iteracyjna wykonuje obiegi numerowane. Do tego celu musi posiadać zmienną, w której będzie przechowywać numer obiegu.

Pętlę iteracyjną można zrealizować za pomocą poznanych dotąd pętli warunkowych:

 
Code::Blocks
// Pętla iteracyjna
// Koło informatyczne
// (C)2015 I LO w Tarnowie
//------------------------

#include <iostream>

using namespace std;

int main()
{
    int i;

    i = 1;
    while(i < 10)
    {
        cout << "Obieg nr " << i << endl;
        i++;
    }
    return 0;
}
// Pętla iteracyjna
// Koło informatyczne
// (C)2015 I LO w Tarnowie
//------------------------

#include <iostream>

using namespace std;

int main()
{
    int i;

    i = 1;
    do
    {
        cout << "Obieg nr " << i << endl;
        i++;
    } while(i < 10);
    return 0;
}

 

Przyjrzyj się pierwszej pętli. Składa się z kilku części:

 
i = 1; inicjalizacja licznika pętli
while(i < 10) warunek kontynuacji pętli
cout << ... instrukcja powtarzana
i++ modyfikacja licznika wykonywana na końcu obiegu

 

Ponieważ pętle tego typu są powszechnie stosowane w programowaniu, język C++ posiada specjalną instrukcję dla tworzenia pętli iteracyjnej:

 

for(a;b;c) instrukcja;

 

Za słówkiem kluczowym for pojawia się nawias, w którym są trzy elementy:

 
a inicjalizacja, czyli kod wykonywany przed pierwszym obiegiem
b warunek kontynuacji, musi być prawdziwy, aby pętla wykonała obieg
c modyfikacja, czyli kod wykonywany na końcu każdego obiegu

 

Nasza pętla wygląda teraz następująco:

 

Code::Blocks
// Pętla iteracyjna
// Koło informatyczne
// (C)2015 I LO w Tarnowie
//------------------------

#include <iostream>

using namespace std;

int main()
{
    int i;

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

    return 0;
}

 

Czy instrukcja for jest niezbędna? Nie, nie jest, lecz ułatwia życie programistom. W zwykłej pętli warunkowej elementy a, b i c są rozrzucone w kodzie programu. W instrukcji for mamy je wszystkie zgrupowane wewnątrz zawiasów za słowem kluczowym for. Poza tym instrukcja ta umożliwia pisanie krótszych bardziej zwięzłych programów. Pętla for nie jest nowym typem pętli w języku C++. Wewnętrznie jest ona i tak zawsze przekształcana na pętlę while.

Kiedy stosujemy pętlę typu for? Stosujemy ją najczęściej wtedy, gdy należy wykonać zadaną liczbę obiegów lub instrukcje wykonywane w obiegu wykorzystują numer tego obiegu.

Ćwiczenie czyni mistrza, zatem poćwiczmy:

 

Pętla wykonująca obiegi o numerach od 10 do 20:

Code::Blocks
// Pętla iteracyjna
// Koło informatyczne
// (C)2015 I LO w Tarnowie
//------------------------

#include <iostream>

using namespace std;

int main()
{
    int i;

    for(i = 10; i <= 20; i++) cout << "Obieg nr " << i << endl;

    return 0;
}

 

Pętla wykonująca obiegi o numerach od a do b:

Code::Blocks
// Pętla iteracyjna
// Koło informatyczne
// (C)2015 I LO w Tarnowie
//------------------------

#include <iostream>

using namespace std;

int main()
{
    int i,a,b;

    cout << "a = "; cin >> a;
    cout << "b = "; cin >> b;

    for(i = a; i <= b; i++) cout << "Obieg nr " << i << endl;

    return 0;
}

 

Pętla wykonująca obiegi parzyste od a do b:

Code::Blocks
// Pętla iteracyjna
// Koło informatyczne
// (C)2015 I LO w Tarnowie
//------------------------

#include <iostream>

using namespace std;

int main()
{
    int i,a,b;

    cout << "a = "; cin >> a;
    cout << "b = "; cin >> b;

    for(i = a + (a % 2); i <= b; i+=2) cout << "Obieg nr " << i << endl;

    return 0;
}

 

Teraz napiszemy pętlę, która wyrysuje kostki do gry z oczkami od 1 do 6:

 

Code::Blocks
// Pętla iteracyjna
// Koło informatyczne
// (C)2015 I LO w Tarnowie
//------------------------

#include <iostream>

using namespace std;

int main()
{
    int i;

    for(i = 1; i <= 6; i++)
    {
      cout << " ----- \n";
      switch(i)
      {
        case 1: cout << "|     |\n"
                        "|  o  |\n"
                        "|     |\n"; break;
        case 2: cout << "|    o|\n"
                        "|     |\n"
                        "|o    |\n"; break;
        case 3: cout << "|    o|\n"
                        "|  o  |\n"
                        "|o    |\n"; break;
        case 4: cout << "|o   o|\n"
                        "|     |\n"
                        "|o   o|\n"; break;
        case 5: cout << "|o   o|\n"
                        "|  o  |\n"
                        "|o   o|\n"; break;
        case 6: cout << "|o   o|\n"
                        "|o   o|\n"
                        "|o   o|\n"; break;
      }
      cout << " ----- \n";
    }
    return 0;
}

 

Czy powyższy program da się uprościć? Tak, jeśli dodamy pętlę wewnętrzną, która będzie wyświetlać poszczególne wiersze kostek w zależności od liczby ich oczek.

 

Oczka Kostka Każda kostka składa się z pięciu wierszy. Wiersze o numerach 0 i 4 są takie same. Pozostałe składają się z pięciu różnych typów wierszy:
 -----  – a
|     |
– b
|  o  | – c
|    o| – d
|o    | – e
|o   o| – f

Dla każdej wartości oczek kostki wiersze 0 i 4 to typ a.

Poniższa tabelka określa rodzaj wiersza w zależności od jego numeru i liczby oczek:

Wiersz Oczka
1 2 3 4 5 6
1 b d d f f f
2 c b c b c f
3 b e e f f f

Teraz dokonujemy syntezy:

wiersz nr 1: b (1), d (2,3), f (4,5,6)

wiersz nr 2: b (2,4), c (1,3,5), f (6)

wiersz nr 3: b (1), e (2,3), f (4,5,6)

Zwróć uwagę, że wiersz 1 i 3 różnią się tylko d i e. Obserwacja ta uprości program.

1
0  -----  a
1 |     | b 
2 |  o  | c
3 |     | b
4  -----  a 
2
0  -----  a
1 |    o| d
2 |     | b
3 |o    | e
4  -----  a 
3
0  -----  a
1 |    o| d
2 |  o  | c
3 |o    | e
4  -----  a 
4
0  -----  a
1 |o   o| f
2 |     | b
3 |o   o| f
4  -----  a 
5
0  -----  a
1 |o   o| f
2 |  o  | c
3 |o   o| f
4  -----  a 
6
0  -----  a
1 |o   o| f
2 |o   o| f
3 |o   o| f
4  -----  a 

 

Code::Blocks
// Pętla iteracyjna
// Koło informatyczne
// (C)2015 I LO w Tarnowie
//------------------------

#include <iostream>

using namespace std;

int main()
{
    int i,j;

    for(i = 1; i <= 6; i++)
        for(j = 0; j < 5; j++)
           switch(j)
           {
             case 0: ;
             case 4: cout << " ----- \n"; break;
             case 1: ;
             case 3: if(i == 1)     cout << "|     |\n";
                     else if(i < 4)
                     {
                       if(j == 1)   cout << "|    o|\n";
                       else         cout << "|o    |\n";
                     }
                     else           cout << "|o   o|\n";
                     break;
             case 2: if(i == 6)     cout << "|o   o|\n";
                     else if(i % 2) cout << "|  o  |\n";
                     else           cout << "|     |\n";
                     break;
           }
    return 0;
}

 


   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