long int fun1(int a, int b) { long int wynik = 1; for (int i = 0; i < b; i++) wynik *= a; return wynik; } Którą wartość zwróci funkcja zapisana w...
long int fun1(int a, int b) { long int wynik = 1; for (int i = 0; i < b; i++) wynik *= a; return wynik; }Którą wartość zwróci funkcja zapisana w języku C++, jeżeli jej parametrami są a = 2 oraz b = 5?
A. 25
B. 10
C. 7
D. 32
Ta funkcja działa jak proste potęgowanie całkowite. Zmienna wynik startuje od wartości 1, a pętla for wykonuje się dopóki i < b. Dla b = 5 oznacza to dokładnie pięć obiegów pętli: dla i = 0, 1, 2, 3 oraz 4. W każdym obiegu wykonywana jest instrukcja wynik *= a, czyli skrócony zapis wynik = wynik * a. Przy a = 2 dostajemy kolejno: 1 * 2 = 2, potem 4, 8, 16 i na końcu 32. Funkcja zwraca więc 32, czyli 2⁵. Moim zdaniem to bardzo dobry przykład na zrozumienie, że pętla nie musi tylko dodawać wartości, może też wykonywać mnożenie, budować iloczyn albo symulować potęgowanie. W praktycznym programowaniu taki schemat pojawia się np. przy obliczeniach matematycznych, szyfrowaniu, generowaniu kombinacji albo analizie złożoności algorytmów. Warto też pamiętać o dobrej praktyce: long int ma ograniczony zakres, więc dla dużych a i b może dojść do przepełnienia. W profesjonalnym kodzie często stosuje się typy o jasno określonym rozmiarze, np. int64_t, oraz sprawdza poprawność danych wejściowych.
Jeżeli wynik był inny niż 32, to najczęściej problem wynika z pomylenia działania pętli z pojedynczym działaniem arytmetycznym. Ta funkcja nie liczy a + b ani a * b. Wartość 10 mogłaby się pojawić, gdyby potraktować parametry jako zwykłe mnożenie 2 * 5, ale kod robi coś innego: mnoży zmienną wynik przez a tyle razy, ile wynosi b. To subtelna, ale bardzo ważna różnica w analizie algorytmów. Wartość 7 pasuje do dodawania parametrów, czyli 2 + 5, jednak w funkcji nie ma instrukcji dodawania do wyniku. Operator *= oznacza mnożenie z przypisaniem, a nie zwiększanie wartości o a. Z kolei 25 wygląda jak obliczenie 5², czyli zamiana miejscami podstawy i wykładnika. Tutaj podstawą jest a, a liczba powtórzeń wynika z b, więc liczone jest 2⁵, nie 5². Trzeba też uważnie patrzeć na warunek pętli i < b. Start od i = 0 nie oznacza, że pętla wykona się sześć razy; dla b = 5 wykona się pięć razy, bo ostatnią poprawną wartością i jest 4. Z mojego doświadczenia takie błędy często biorą się z czytania kodu „na oko”, bez rozpisania kolejnych wartości zmiennych. Dobra praktyka przy takich zadaniach to zrobić krótką tabelkę: numer obiegu, wartość i oraz aktualny wynik. Wtedy od razu widać, że funkcja realizuje potęgowanie całkowite dla nieujemnego b.