Przedstawiony kod źródłowy, zapisany w języku C++, ma za zadanie dla wprowadzanych dowolnych całkowitych liczb różnych od zera wypisać
int main() { int liczba; cin >> liczba; while (liczba != 0) { if ((liczba % 2) != 0) cout << liczba << endl; cin >> liczba; } return 0; }
A. liczby pierwsze
Źle. Kod sprawdza tylko resztę z dzielenia przez 2 - wypisze 9, a pominie 2.
B. jedynie liczby parzyste
Źle. Liczby parzyste mają resztę 0, a warunek != 0 je pomija.
C. wyłącznie liczby nieparzyste
Dobrze. Warunek liczba % 2 != 0 przepuszcza tylko liczby nieparzyste.
D. wszystkie liczby
Źle. cout stoi wewnątrz warunku if, więc nie każda liczba zostanie wypisana.
Program wypisuje wyłącznie liczby nieparzyste. Pętla
while (liczba != 0) wczytuje liczby do momentu podania zera, a warunek if ((liczba % 2) != 0) przepuszcza tylko te, które przy dzieleniu przez 2 dają resztę różną od zera. Liczby parzyste mają resztę 0, więc są pomijane. Działa to także dla liczb ujemnych: w C++ -3 % 2 daje -1, czyli wartość różną od zera, więc -3 zostanie wypisane. Do zapamiętania: != 0 przy reszcie z dzielenia przez 2 to test nieparzystości. Z tego powodu bezpieczniej pisać % 2 != 0 niż % 2 == 1, bo drugi zapis pomija nieparzyste liczby ujemne.Najczęściej przeoczony jest operator porównania w warunku. W bliźniaczym zadaniu stoi
== 0 i wtedy program wypisuje liczby parzyste; tutaj stoi != 0, co odwraca wynik testu. Wszystkie liczby trafiłyby na ekran tylko bez warunku if, a tu instrukcja cout wykonuje się wyłącznie, gdy reszta z dzielenia przez 2 jest różna od zera. Liczby pierwsze wymagałyby sprawdzenia wielu dzielników, a kod bada tylko dzielenie przez 2 - wypisze na przykład 9 i 15, które pierwsze nie są, a pominie 2, która pierwsza jest. Wynikiem są więc liczby nieparzyste, dodatnie i ujemne. Przy takich zadaniach czytaj warunek znak po znaku, bo jeden symbol zmienia sens całego programu. Przykład: dla danych 3, 8, -5, 6, 0 program wypisze 3 i -5. Zero kończy pętlę i samo nie jest wypisywane.