Kurs C++: Pętle i Iteracje

Zagnieżdżone pętle for to sytuacja, w której jedna pętla działa wewnątrz drugiej. Pozwalają one na realizację bardziej złożonych operacji, takich jak iteracja po macierzach, tworzenie wzorów czy generowanie kombinacji.

1. Składnia zagnieżdżonych pętli for

for (inicjalizacja1; warunek1; krok1) {
    for (inicjalizacja2; warunek2; krok2) {
        // Kod wykonywany w pętli wewnętrznej
    }
    // Kod wykonywany po zakończeniu pętli wewnętrznej
}

🔹 Pętla zewnętrzna – kontroluje główny zakres iteracji.
🔹 Pętla wewnętrzna – jest wykonywana całkowicie dla każdej pojedynczej iteracji pętli zewnętrznej.

2. Przykłady praktyczne

Przykład 1: Prosta tabliczka mnożenia

Pętla zewnętrzna iteruje po wierszach, a pętla wewnętrzna po kolumnach.

#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= 5; j++) {
            cout << i * j << "\t";
        }
        cout << endl;
    }
    return 0;
}

Wynik:

1   2   3   4   5  
2   4   6   8  10  
3   6   9  12  15  
4   8  12  16  20  
5  10  15  20  25  

Przykład 2: Generowanie wzoru (piramida liczbowa)

#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= i; j++) {
            cout << j << " ";
        }
        cout << endl;
    }
    return 0;
}

Wynik:

1  
1 2  
1 2 3  
1 2 3 4  
1 2 3 4 5  

Przykład 3: Wypełnianie macierzy

Zagnieżdżone pętle często wykorzystuje się do operacji na macierzach (tablicach dwuwymiarowych).

#include <iostream>
using namespace std;

int main() {
    const int WIERSZE = 3;
    const int KOLUMNY = 3;
    int macierz[WIERSZE][KOLUMNY];

    // Wypełnianie macierzy
    for (int i = 0; i < WIERSZE; i++) {
        for (int j = 0; j < KOLUMNY; j++) {
            macierz[i][j] = (i + 1) * (j + 1);
        }
    }

    // Wyświetlanie macierzy
    for (int i = 0; i < WIERSZE; i++) {
        for (int j = 0; j < KOLUMNY; j++) {
            cout << macierz[i][j] << "\t";
        }
        cout << endl;
    }

    return 0;
}

Wynik:

1   2   3  
2   4   6  
3   6   9  

Przykład 4: Wzór w odwróconej piramidzie

#include <iostream>
using namespace std;

int main() {
    for (int i = 5; i >= 1; i--) {
        for (int j = 1; j <= i; j++) {
            cout << "* ";
        }
        cout << endl;
    }
    return 0;
}

Wynik:

* * * * *  
* * * *  
* * *  
* *  
*  

3. Kluczowe wskazówki i dobre praktyki

Kolejność pętli ma znaczenie – pętla wewnętrzna działa całkowicie w każdej iteracji pętli zewnętrznej.
Uważaj na zbyt dużą liczbę iteracji – zagnieżdżone pętle mogą prowadzić do dużej liczby operacji (np. 1000×1000 iteracji = 1 milion działań).
Wcięcia są kluczowe – poprawne formatowanie kodu zwiększa jego czytelność.
Dobrze opisuj zmienne – zmienne i i j są popularne, ale w bardziej złożonych algorytmach warto stosować bardziej opisowe nazwy.


4. Podsumowanie

✅ Zagnieżdżone pętle for są potężnym narzędziem do przetwarzania danych w wielu wymiarach.
✅ Idealnie sprawdzają się przy macierzach, tabliczkach mnożenia czy rysowaniu wzorów.
✅ Warto zachować optymalizację, aby uniknąć niepotrzebnych iteracji.