Pętla for

Pętla for C/C++

Pętla for

Zaczniemy od pętli for. Charakteryzuje się ona tym że z góry wiemy ile razy się wykona.  Zanim jednak zaczniemy warto umówić jak to wygląda for(start; stop; krok). Jak zauważyłeś składa się ona z 4 elementów. Słowa kluczowego for wartości początkowej (start) kroku czyli o ile wartość początkowa będzie się zmieniała za każdym powtórzeniem oraz stopu czyli kiedy należy przestać. Najłatwiej będzie wytłumaczyć jej działanie na jakimś prostym przykładzie.

#include <stdio.h>

int main()
{
    int i;
    for(i = 1; i <= 10; i++) // start, do kiedy się wykonywać, krok
    {
        printf("%d", i); //wypisanie zmiennej i
        printf("\n"); //przejście do nowej linii zabieg estetyczny
    }

    return 0;
}

Program wypisuje kolejno liczby od 1 do 10 każdą w nowej linii. Jak widzisz to wcale nie jest takie trudne. Wartość początkowa pętli to 1. Pętla wykonuje się dopóki jest mniejsze lub równe 10. Na końcu jest krok i++ w języku C i C++ jest  to równoważne z zapisem i = i + 1. Częściej jednak korzystać się z zapisu skróconego ponieważ jest on bardziej czytelny. Oczywiście i– będzie równoważne z i = i – 1 co mam nadzieję jest logiczne. Warto dodać że ciało pętli czyli to wszystko co jest pomiędzy klamrami może zawierać dużo bardziej skomplikowane instrukcje. Przejdźmy do kolejnego przykładu.

#include <stdio.h>

int main()
{
    printf("Podaj 5 liczb\n");
    int liczba, suma = 0; //tworzymy dwie zmienne int
    float srednia; //tworzymy zmienną ułamkową
    for(int i = 5; i > 0; i--) //wewnątrz nawiasów pętli tworzymy zmienną początkową
    {
        printf("%d. ", i); //wypisujemy zmienną i 
        scanf("%d", &liczba);
        suma = suma + liczba; //sumujemy pobrane wartości
    }
    srednia = suma / 5.0; //obliczamy średnią
    printf("Srednia wynosi %.2f ", srednia); //wyświetlamy zmienną float 
    //ale tylko 2 miejsca po przecinku

    return 0;
}

Ten przykład może być troszeczkę bardziej skomplikowane ale to dlatego że jest w nim zmienna typu float. Myślę że to jest dobry moment żeby przyjrzeć się jej trochę bardziej i wytłumaczyć pewne sprawy. Zacznijmy jednak od początku. Tym razem pętla for odlicza od 5 do 1 zwróć uwagę na skrócony zapis i- –. W ciele pętli obliczamy wartość zmiennej suma jest to zabieg dozwolony i jak najbardziej poprawny. Pętla wykonuje się 5 razy a później już poza jej ciałem liczmy wartość zmiennej srednia. Aby uzyskać poprawny wynik wartość zmiennej suma jest podzielona przez 5.0 (czyli też przez zmienną float). Dla nas nie ma to różnicy czy liczbę podzielmy przez 5 czy przez 5.0 ale dla komputera jak najbardziej ma. Dzięki temu uzyskujemy dokładny wynik a nie liczbę całkowitą. Jest to pewien niuans o którym musimy pamiętać. Następnie w funkcji printf pojawia się tajemniczy zapis %.2f sygnalizuje on że mają być wyświetlone tylko dwie liczby po przecinku zamiast standardowo sześciu. Jest to zabieg estetyczny jednak warto o tym wiedzieć. Zapis %.4f wyświetli dokładnie cztery liczby po przecinku. Rzućmy okiem teraz na jeszcze jeden przykład.

#include <stdio.h>

int main()
{
    int k, suma=0;
    printf("Program się zakonczy gdy suma = 13\n");
    printf("Podaj zmienna k\n");
    for(int i = 0; suma!=13; i++) //ciekawy warunek kończący
    {
        scanf("%d", &k);
        suma += k; //skrócony zapis suma = suma + k
        printf("Suma wnosi: %d \n", suma);
    }
    return 0;
}

Ten przykład pokazuje że warunek kończący nie musi być taki oczywisty i jasny. Program działa dopóki zmienna suma jest różna od 13 (!= różny od). Teoretycznie ta pętla może trwać w nieskończoność to od użytkownika zależy kiedy się zakończy. Warty uwagi jest również zapis suma += k jego znaczenie jest wytłumaczone w komentarzu. Zapis suma -= k oznaczałby suma = suma – k.  Oczywiście im więcej przećwiczysz samodzielnie tym lepiej zrozumiesz pewne mechanizmy działania. Do czego bardzo Cię zachęcam. Poniżej fragment kodu z instrukcją warunkową.

#include <stdio.h>

int main()
{
    int liczba, licznik = 0;
    printf("Podaj liczby parzyste\n");
    for(int i = 0; i<5; i++)
    {
        scanf("%d", &liczba);
        if(liczba%2 == 0) //modulo (reszta z dzielenia)
        {
            printf(":)\n");
            licznik++;
        }
        else
        {
            printf(":(\n");
        }
    }
    printf("Podales %d parzystych i %d nieparzystych", licznik, 5-licznik);
    return 0;
}

Taki prosty fragment kodu. Być może zastanawiasz się co oznacza zapis liczba%2 == 0. Należy czytać to w ten sposób. Jeżeli reszta z dzielenia zmiennej liczba przez 2 wynosi 0 to. Modulo jest bardzo przydatne podczas  pisania algorytmów i nie tylko.

Instrukcja break i continue

Bardzo ważne i przydane instrukcje które są nierozłącznym elementem pętli. Słowo kluczowe break „kończy” pętle. Bezwarunkowo kończy jej działanie wychodząc z niej. Continue zaś przechodzi do kolejnego obiegu pętli pomijając wszystkie następne instrukcje które są w kolejce. Aby lepiej to zrozumieć warto spojrzeć na ilustracje pomocnicze. Czerwona strzałka wskazuje miejsce do którego kompilator „przeskakuje” po natknięciu się na instrukcje break lub continue.

pętla for c/c++

 

#include <stdio.h>
 
int main()
{
    int wybor;
    printf(" 0 - BREAK 1 - CONTINUE");
    for(int i=1; i<=999; i++)
    {
        printf("\nObieg petli %d ",i);
        scanf("%d", &wybor);
        if(wybor==1) continue; //przejście do 9 linijki kodu
        if(wybor==0) break; //przejście do 19 linijki kodu
        printf("\nInstukcja nr.1");
        printf("\nInstukcja nr.2");
        printf("\nInstukcja nr.3\n");
       
        
    }
    printf("\nKoniec petli");
    return 0;
}

Przetestuj działanie tego kodu. Lepiej zrozumiesz jak działają te instrukcje i jaki mają potencjał w programowaniu. Na zakończenie ciekawostka.

#include <stdio.h>

int main()
{
    for(;;)
    {
        printf("Never gonna give you\n");
    }
    return 0;
}

Zapis for(;;) oznacza nieskończoną pętle. Ten sam efekt można uzyskać ustalając odpowiedni warunek kończący oraz krok na przykład for(int i=0; i<1; i–) jednak nigdy nie należy tego robić.

Podsumowanie

Warto abyś zapamiętał że kolejność składni w pętli jak najbardziej ma znaczenie. Zawsze na początku jest start później warunek i na końcu krok. Nie wiem czy zwróciłeś uwagę na to że średnik występuje po starcie i warunku po kroku już nie ma średnika. Mówię to ponieważ na początku możesz o tym zapominać i ciężko będzie Ci znaleźć błąd w kodzie. Pętla for użyta w odpowiedni sposób potrafi ułatwić nam mnóstwo pracy i daje niesamowite możliwości a niewłaściwy może zawiesić komputer. Na samym końcu pokazałem Ci jak z niej nie korzystać.