Tablica tab[] jest wypełniona dowolnymi liczbami całkowitymi. Jaka wartość znajdzie się w zmiennej zm1 po wykonaniu prezentowanego fragmentu kodu?
int tab[10]; int zm1 = 0; … for (int i = 0; i < 10; i++) { if (tab[i] % 2 == 0) zm1++; }
Poprawna jest odpowiedź: liczba elementów parzystych w tablicy. Pętla przechodzi przez wszystkie 10 elementów, a warunek tab[i] % 2 == 0 jest prawdziwy dla liczb parzystych, bo reszta z dzielenia ich przez 2 wynosi 0. Wtedy zm1++ zwiększa zmienną o 1, więc po pętli zm1 przechowuje liczbę takich elementów - od 0 do 10.
Do zapamiętania: w C++ warunek parzystości działa także dla liczb ujemnych (-6 % 2 daje 0), natomiast dla ujemnych nieparzystych reszta wynosi -1, a nie 1. Dlatego nieparzystość bezpieczniej sprawdzać warunkiem tab[i] % 2 != 0 niż == 1. Schemat licznik + warunek + inkrementacja to jeden z podstawowych algorytmów na tablicach.
Wybór sumy liczb parzystych wynika z pomylenia zm1++ z zm1 = zm1 + tab[i]. Inkrementacja zawsze dodaje 1, więc zmienna nie gromadzi wartości elementów, tylko liczy, ile razy warunek był spełniony. Odpowiedź o elementach nieparzystych odwraca warunek: % 2 == 0 wybiera liczby parzyste, a nieparzyste dawałyby resztę różną od zera.
Indeks ostatniej liczby parzystej wymagałby przypisania indeksu, czyli zm1 = i; - wtedy po pętli zmienna wskazywałaby pozycję ostatniego trafienia. W kodzie zmienna nigdy nie przyjmuje wartości i, tylko rośnie o jeden. Kluczem do takich zadań jest dokładne odczytanie instrukcji wykonywanej po spełnieniu warunku: inkrementacja liczy, dodawanie elementu sumuje, a przypisanie indeksu zapamiętuje pozycję. W kodzie nie ma przy tym żadnego warunku dotyczącego samego indeksu. Wartość początkowa zm1 = 0 przed pętlą potwierdza, że zmienna pełni rolę licznika.