Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Algorytmy i podstawy informatyki

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 = 4 oraz b = 3?
A. 12
B. 16
C. 1
D. 64

Pytanie z egzaminu CKE, styczeń 2022 (arkusz EE.09-SG-22.01).

Funkcja zwraca 64, ponieważ wykonuje klasyczne potęgowanie przez wielokrotne mnożenie. Zmienna wynik na początku ma wartość 1. Pętla for startuje od i = 0 i działa tak długo, jak i < b. Dla b = 3 wykona się więc dokładnie trzy razy: dla i = 0, i = 1 oraz i = 2. W każdej iteracji instrukcja wynik *= a oznacza to samo co wynik = wynik * a. Przy a = 4 mamy kolejno: po pierwszym obiegu 1 * 4 = 4, po drugim 4 * 4 = 16, po trzecim 16 * 4 = 64. Czyli funkcja oblicza wartość $a^b$, w tym przypadku 4³ = 64. Moim zdaniem to bardzo dobry przykład pokazujący, że pętla może realizować prosty algorytm matematyczny. W praktyce podobne podejście spotyka się przy liczeniu potęg, iloczynów, prostych symulacjach albo w algorytmach kryptograficznych, choć tam stosuje się już bardziej wydajne metody. Dobra praktyka w C++ to też zwracanie uwagi na typ danych: long int mieści większe wartości niż zwykły int, ale przy dużych potęgach i tak może dojść do przepełnienia zakresu, więc w profesjonalnym kodzie trzeba to kontrolować.
W tej funkcji łatwo pomylić kilka rzeczy, bo kod jest krótki, ale zawiera istotny mechanizm pętli i operatora przypisania z mnożeniem. Wartość 1 nie jest wynikiem końcowym, tylko wartością startową zmiennej wynik. Takie ustawienie ma sens, ponieważ 1 jest elementem neutralnym mnożenia, czyli nie zmienia iloczynu na początku obliczeń. Gdyby funkcja od razu zwracała 1, pętla musiałaby się nie wykonać, na przykład przy b = 0. Tutaj jednak b = 3, więc pętla działa trzy razy. Wartość 12 wynika zwykle z myślenia, że program wykonuje mnożenie a * b, czyli 4 * 3. To jednak nie jest ten algorytm. Zmienna b nie jest mnożnikiem użytym bezpośrednio w działaniu, tylko liczbą powtórzeń pętli. To ważna różnica, bo w programowaniu licznik pętli bardzo często steruje tym, ile razy wykona się dana operacja, a nie jest składnikiem obliczenia. Wartość 16 pojawia się, gdy ktoś policzy tylko dwa mnożenia przez 4, czyli 4². Typowy błąd polega tu na niedokładnym prześledzeniu warunku i < b. Dla startu od i = 0 i końca przed i = 3 mamy trzy iteracje, nie dwie. Z mojego doświadczenia najlepiej rozpisać sobie wartości po każdej iteracji, szczególnie przy pętlach for. Wtedy widać, że wynik przyjmuje kolejno 4, 16 i 64. Kod w praktyce oblicza potęgę $a^b$, a nie sumę, iloczyn parametrów ani pojedyncze podniesienie do kwadratu.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.