Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 8 czerwca 2026 01:24
  • Data zakończenia: 8 czerwca 2026 02:08

Egzamin zdany!

Wynik: 28/40 punktów (70,0%)

Wymagane minimum: 20 punktów (50%)

Nowe
Analiza przebiegu egzaminu- sprawdź jak rozwiązywałeś pytania
Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

Który z wymienionych procesów NIE jest częścią etapu kompilacji?

A. Weryfikacja błędów składniowych
B. Optymalizacja kodu
C. Tłumaczenie kodu źródłowego na język maszynowy
D. Analiza działania programu w czasie rzeczywistym
Optymalizacja kodu to integralna część kompilacji, mająca na celu zwiększenie wydajności programu poprzez usunięcie zbędnych instrukcji i usprawnienie algorytmów. Tłumaczenie kodu źródłowego na język maszynowy jest głównym zadaniem kompilatora, który generuje plik wykonywalny. Weryfikacja błędów składniowych jest jednym z pierwszych etapów kompilacji, mającym na celu upewnienie się, że kod jest poprawny pod względem składni, zanim zostanie przekształcony na kod maszynowy.

Pytanie 2

Która z wymienionych bibliotek pozwala na obsługę zdarzeń związanych z myszą w aplikacjach desktopowych?

A. TensorFlow
B. Qt
C. Numpy
D. Django
Numpy to biblioteka do obliczeń numerycznych w języku Python i nie posiada narzędzi do obsługi zdarzeń graficznych w aplikacjach desktopowych. Django to framework do budowy aplikacji webowych w Pythonie, koncentrujący się na backendzie, a nie na tworzeniu GUI czy interakcji z myszą. TensorFlow to biblioteka do uczenia maszynowego i przetwarzania danych, nieprzystosowana do tworzenia aplikacji desktopowych obsługujących zdarzenia myszki i klawiatury.

Pytanie 3

Jakie metody pozwalają na przesłanie danych z serwera do aplikacji front-end?

A. metody POST
B. formatu JSON
C. biblioteki jQuery
D. protokołu SSH
Format JSON to zdecydowanie najpopularniejszy i najwygodniejszy sposób przesyłania danych pomiędzy serwerem a aplikacją front-end. JSON, czyli JavaScript Object Notation, jest lekkim formatem wymiany danych, który został zaprojektowany właśnie pod kątem prostoty odczytu i zapisu, zarówno przez ludzi, jak i maszyny. Moim zdaniem trudno dziś znaleźć nowoczesną aplikację webową, która nie korzysta z JSON-a. W praktyce wygląda to tak, że serwer generuje odpowiedź HTTP z danymi w formacie JSON, a front-end (często napisany w JavaScript lub TypeScript) potrafi je bez problemu sparsować i wykorzystać. Standardy branżowe – jak REST API czy GraphQL – bazują w dużej mierze na tym formacie, bo jest uniwersalny, prosty i dobrze wspierany przez frameworki. JSON wspiera nawet zagnieżdżone struktury, tablice, obiekty, więc przekazywanie danych jest bardzo elastyczne. Z mojego doświadczenia, dzięki JSON-owi można bardzo sprawnie integrować różne technologie na back-endzie i front-endzie, co się naprawdę często przydaje przy dużych projektach. Warto pamiętać, że praktycznie każdy język programowania ma biblioteki do obsługi JSON-a, więc nie ma tu żadnych barier technologicznych. Nawet przy komunikacji asynchronicznej (np. z użyciem fetch czy XMLHttpRequest) JSON jest domyślnym wyborem. Tak naprawdę, jeśli chodzi o wymianę danych w aplikacjach webowych, JSON jest po prostu standardem de facto i warto go dobrze znać.

Pytanie 4

W jaki sposób procesor nawiązuje komunikację z pamięcią podręczną (cache)?

A. Bezpośrednio, omijając mostki systemowe
B. Używając wyłącznie pamięci RAM
C. Za pomocą systemu przerwań
D. Poprzez linie danych w magistrali systemowej
Procesor komunikuje się z pamięcią podręczną (cache) za pomocą linii danych w magistrali systemowej, co jest kluczowym elementem architektury komputerowej. Magistrala systemowa to zestaw ścieżek, które umożliwiają przesyłanie danych pomiędzy różnymi komponentami systemu, w tym procesorem, pamięcią RAM oraz pamięcią podręczną. Pamięć podręczna działa jako bufor, który przechowuje najczęściej używane dane, co pozwala na znaczne zwiększenie szybkości operacji, ponieważ dostęp do pamięci cache jest znacznie szybszy niż dostęp do pamięci RAM. W standardach takich jak Intel's QuickPath Interconnect (QPI) czy AMD's HyperTransport, linie danych odgrywają kluczową rolę w efektywnej komunikacji, co przekłada się na ogólną wydajność systemu. Przykładowo, w nowoczesnych procesorach wielordzeniowych, każda rdzeń może mieć własną pamięć podręczną, a komunikacja za pomocą magistrali pozwala na synchronizację danych pomiędzy tymi rdzeniami oraz współdzielenie zasobów. Efektywne zarządzanie pamięcią podręczną i magistralą jest kluczowe dla osiągnięcia wysokiej wydajności w obliczeniach oraz przetwarzaniu danych.

Pytanie 5

W przypadku przedstawionych kodów źródłowych, które są funkcjonalnie równoważne, wartość, która zostanie zapisana w zmiennej b po wykonaniu operacji, to

Python:C++ / C# / Java:
x = 5.96;
b = int(x);
double x = 5.96;
int b = (int)x;
A. 5.96
B. 596
C. 6
D. 5
W tym zadaniu mamy do czynienia z fajnym przykładem konwersji liczby 5.96 na liczbę całkowitą w różnych językach, takich jak Python czy C++. Kiedy robimy rzutowanie, to po prostu odcinamy część ułamkową, co daje nam 5 w zmiennej b. To jest trochę klasyczne rzutowanie albo konwersja typu, gdzie w większości języków po prostu się to robi. Ciekawostką jest, że w Pythonie działa to przez funkcję int(), która zawsze zaokrągla w dół. A w C++ czy Javie używasz po prostu (int) i efekt jest ten sam. Warto też zwrócić uwagę, że przy liczbach ujemnych rzutowanie działa inaczej, bo zawsze zmierza w stronę zera. Z doświadczenia wiem, że warto być świadomym użycia takich konwersji, bo w niektórych przypadkach, jak operacje finansowe, nawet małe różnice mogą się okazać bardzo istotne.

Pytanie 6

Jaki typ pamięci RAM powinno się wybrać do efektywnego komputera do gier?

A. DDR4
B. LPDDR4
C. DDR3
D. DDR5
Wybór odpowiedniego rodzaju pamięci RAM jest kluczowy dla osiągnięcia maksymalnej wydajności w komputerze gamingowym. DDR5, najnowszy standard pamięci dynamicznej RAM, oferuje znaczące ulepszenia w porównaniu do swoich poprzedników. Główne różnice dotyczą prędkości, efektywności energetycznej oraz pojemności. DDR5 może oferować prędkości sięgające 8400 MT/s, co przyczynia się do szybszego transferu danych, co ma bezpośredni wpływ na wydajność gier i aplikacji wymagających wysokiej przepustowości. Ponadto, DDR5 wprowadza architekturę, która pozwala na zwiększenie ilości pamięci w jednym module, co umożliwia konfiguracje do 128 GB na pojedynczy moduł, co jest niezwykle korzystne dla graczy korzystających z bardziej wymagających tytułów. Przykłady gier, które potrafią w pełni wykorzystać możliwości DDR5 to Cyberpunk 2077 czy Call of Duty: Warzone, gdzie wydajność pamięci jest kluczowym elementem w uzyskiwaniu płynności rozgrywki. Stosowanie DDR5 nie tylko poprawia wydajność, ale również zwiększa przyszłościowość sprzętu, co sprawia, że jest to najlepszy wybór na dzisiejszym rynku komputerów gamingowych.

Pytanie 7

Wynikiem wykonania poniższego fragmentu kodu jest wyświetlenie liczb z zakresu od 2 do 20, które są

for (let number = 2; number <= 20; number++) {
    let check = true;
    for (let test = 2; test < number; test++) {
        if (number % test === 0) {
            check = false;
            break;
        }
    }
    if (check) console.log(number);
}
A. parzyste.
B. podzielne przez wartość zmiennej test.
C. podzielne przez wartość zmiennej check.
D. pierwsze.
Podzielność przez zmienną test lub check oznacza, że liczby są wielokrotnościami określonej wartości, ale niekoniecznie są liczbami pierwszymi. Liczby parzyste to liczby dzielące się przez 2, co oznacza, że tylko 2 jest liczbą pierwszą w tym zbiorze. Algorytmy wykrywające liczby parzyste lub wielokrotności nie są używane do znajdowania liczb pierwszych, ponieważ ich zakres i zastosowanie są zupełnie inne.

Pytanie 8

Jaką cechą odznacza się framework w porównaniu do biblioteki?

A. Framework zapewnia API do szerszego zestawu funkcji
B. Framework stanowi zbiór funkcji, które programista ma możliwość wykorzystania
C. Framework określa strukturę aplikacji i zapewnia jej fundament
D. Framework oferuje funkcje użyteczne w konkretnej dziedzinie problemu
Framework dostarcza gotowy szkielet aplikacji i narzuca architekturę, zgodnie z którą programista musi budować swoją aplikację. Oferuje zestaw narzędzi i komponentów, które upraszczają rozwój oprogramowania, przy jednoczesnym ograniczeniu swobody działania. Dzięki frameworkowi, programista nie musi tworzyć aplikacji od podstaw – dostaje narzędzia, które integrują się ze sobą, co przyspiesza proces developmentu i zapewnia spójność aplikacji.

Pytanie 9

Zasada programowania obiektowego, która polega na ukrywaniu elementów klasy tak, aby były one dostępne wyłącznie dla metod tej klasy lub funkcji zaprzyjaźnionych, to

A. polimorfizm
B. hermetyzacja
C. dziedziczenie
D. wyjątki
Hermetyzacja to taka esencja programowania obiektowego, która polega na ukrywaniu szczegółów implementacyjnych wewnątrz klasy. Dzięki temu tylko wybrane fragmenty kodu mają dostęp do danych czy metod, które faktycznie powinny być widoczne na zewnątrz. W praktyce sprowadza się to do korzystania z modyfikatorów dostępu, takich jak private, protected czy public, co jest podstawą w językach takich jak Java, C++ czy C#. Daje to ogromną przewagę, bo ochrania dane przed przypadkowymi (albo celowymi!) zmianami z zewnątrz. Z mojego doświadczenia wynika, że dobrze zaprojektowana hermetyzacja sprawia, że kod jest bardziej przejrzysty i łatwiejszy do testowania i utrzymania. Przykład? Załóżmy, że mamy klasę KontoBankowe i chcemy, żeby saldo dało się zmieniać tylko poprzez wpłatę i wypłatę, a nie żeby każdy mógł ustawić dowolną kwotę. Wtedy pole 'saldo' robimy private, a dostęp dajemy przez metody public wpłata() i wypłata(). Branżowe praktyki, np. SOLID, wręcz podkreślają wagę hermetyzacji. Ułatwia to też refaktoryzację – jeśli coś zmienisz w środku klasy, a interfejs zewnętrzny zostaje taki sam, reszta programu nawet nie zauważy. Także, moim zdaniem, bez hermetyzacji nie ma sensownego programowania obiektowego – to absolutna podstawa.

Pytanie 10

Który z poniższych elementów HTML5 służy do rysowania grafiki?

A. &lt;draw&gt;
B. &lt;svg&gt;
C. &lt;canvas&gt;
D. &lt;graphic&gt;
Elementy &lt;draw&gt; oraz &lt;graphic&gt; nie istnieją w standardzie HTML5, co sprawia, że nie mogą być używane do rysowania grafiki w dokumentach HTML. Takie nieporozumienia często wynikają z mylnego przekonania, że każda funkcjonalność dostępna w innych technologiach webowych ma swoje odpowiedniki w HTML. Niezrozumienie architektury HTML5 oraz jego standardów prowadzi do wyboru niewłaściwych narzędzi do zadań graficznych. Zamiast korzystać z nieistniejących elementów, programiści powinni zapoznać się z możliwościami, jakie oferuje &lt;canvas&gt;, czy też SVG (Scalable Vector Graphics), które również mogą być używane do tworzenia grafiki, jednak w inny sposób. SVG jest formatem wektorowym, który jest bardziej odpowiedni do statycznych grafik i interfejsów, podczas gdy &lt;canvas&gt; lepiej sprawdza się w przypadku dynamicznych, szczegółowych grafik i animacji. Wybór niewłaściwego elementu może prowadzić do trudności w implementacji oraz w utrzymaniu projektu, dlatego ważne jest, aby dokładnie rozumieć różnice między tymi technologiami i ich zastosowaniami w praktyce. Właściwe podejście do wykorzystania technologii webowych, zgodne z dobrą praktyką, wymaga świadomości dostępnych narzędzi i ich specyfiki.

Pytanie 11

W C++ mechanizm programowania obiektowego, który wykorzystuje funkcje wirtualne (ang. Virtual) i umożliwia programiście pominięcie kontroli klasy pochodnej podczas wywoływania metod, nazywa się

A. polimorfizmem
B. hermetyzacją
C. przeciążeniem
D. dziedziczeniem
Dziedziczenie pozwala na przejmowanie metod i właściwości z klasy bazowej, ale samo w sobie nie umożliwia dynamicznego wyboru metody w czasie działania programu. Przeciążenie (overloading) polega na definiowaniu wielu metod o tej samej nazwie, ale różnych parametrach, co nie jest równoznaczne z polimorfizmem. Hermetyzacja (encapsulation) koncentruje się na ukrywaniu szczegółów implementacyjnych i dostępie do danych tylko przez interfejs klasy, ale nie dotyczy mechanizmu wyboru metody w trakcie działania aplikacji.

Pytanie 12

Jakie środowisko deweloperskie jest powszechnie wykorzystywane do produkcji aplikacji webowych w języku Java?

A. Android Studio
B. XCode
C. Eclipse
D. PyCharm
XCode to środowisko programistyczne przeznaczone głównie do tworzenia aplikacji na systemy Apple, takie jak macOS, iOS, iPadOS, a nie do aplikacji webowych w języku Java. Android Studio jest dedykowane tworzeniu aplikacji mobilnych na system Android i nie jest używane w środowisku webowym dla Javy. PyCharm to narzędzie skoncentrowane na języku Python i nie posiada natywnego wsparcia dla programowania w Javie, co czyni go nieodpowiednim wyborem dla aplikacji webowych opartych na tym języku.

Pytanie 13

Co oznacza akronim IDE w kontekście programowania?

A. Interaktywny Silnik Programistyczny
B. Integrated Development Environment
C. Interaktywny Edytor Debugowania
D. Zintegrowane Środowisko Debugowania
IDE, czyli Zintegrowane Środowisko Programistyczne, to naprawdę przydatne narzędzie. Zajmuje się nie tylko edytowaniem kodu, ale łączy w sobie kompilator, debugger i wiele innych rzeczy, które pomagają w tworzeniu oprogramowania. Dzięki IDE można szybciej pisać programy i lepiej ogarniać projekty. A najpopularniejsze z nich, jak Visual Studio, IntelliJ IDEA czy Eclipse, wspierają różne języki programowania, więc są bardzo uniwersalne. Moim zdaniem, korzystanie z IDE to prawie obowiązek dla każdego programisty!

Pytanie 14

W jakiej sytuacji wykorzystanie stosu będzie korzystniejsze niż lista podczas projektowania zestawu danych?

A. Gdy kolejność przetwarzania danych jest odwrócona (LIFO)
B. Gdy chcemy usunąć element z końca
C. Gdy ważne jest szybkie znajdowanie elementów
D. Gdy dane muszą być uporządkowane
Lista umożliwia liniowy dostęp do elementów i pozwala na dodawanie/usuwanie elementów w dowolnym miejscu, ale nie działa na zasadzie LIFO – dostęp do ostatniego elementu nie jest tak szybki jak w stosie. Kolejka działa zgodnie z zasadą FIFO (First In First Out), co oznacza, że elementy są przetwarzane w kolejności ich dodania, co jest odwrotnością stosu. Tablica dwuwymiarowa to struktura służąca do przechowywania danych w formie macierzy, umożliwiająca indeksowany dostęp, ale nie wspiera bezpośrednio operacji LIFO ani FIFO.

Pytanie 15

W programie stworzonym w języku C++ trzeba zadeklarować zmienną, która będzie przechowywać wartość rzeczywistą. Jakiego typu powinna być ta zmienna?

A. numeric
B. double
C. int
D. number
W języku C++ typ double jest przeznaczony do przechowywania liczb rzeczywistych, czyli takich, które mają część ułamkową. Jest to standardowy wybór w sytuacjach, gdy zależy nam na precyzji przy obliczeniach z użyciem liczb zmiennoprzecinkowych. Takie zmienne bardzo często spotyka się w programowaniu symulacji fizycznych, obliczeniach matematycznych czy przetwarzaniu sygnału – właściwie wszędzie tam, gdzie liczby całkowite po prostu nie wystarczają. Moim zdaniem, wybór double jest najbardziej praktyczny, bo oferuje kompromis między szerokim zakresem wartości a precyzją, czego nie zagwarantuje typ float (który jest mniej precyzyjny). Warto pamiętać, że double to typ określony przez standard języka C++ (IEEE 754), co gwarantuje jego przenośność między różnymi systemami i kompilatorami. Uważam, że dobrze znać też różnicę między double a float – w praktyce double przechowuje liczby z dokładnością do około 15 cyfr znaczących i zakresie od 10^-308 do 10^308. Często programiści korzystają z double domyślnie, żeby mieć spokój z precyzją, nawet jeśli float byłby wystarczający. Z mojego doświadczenia podpowiem, że deklarując double liczysz się z większym zużyciem pamięci niż przy float, ale za to rzadziej napotkasz błędy zaokrągleń. W każdym razie – jeśli chodzi o zmienne rzeczywiste w C++, double to najbezpieczniejszy wybór.

Pytanie 16

Jakie narzędzie jest wykorzystywane do zgłaszania błędów w projektach IT?

A. JIRA
B. Blender
C. Git
D. Photoshop
JIRA to jedno z najczęściej wykorzystywanych narzędzi do zarządzania projektami i raportowania błędów w projektach informatycznych. JIRA umożliwia śledzenie błędów, zarządzanie zadaniami oraz efektywne monitorowanie postępów prac nad projektem. Dzięki integracji z innymi narzędziami, takimi jak Confluence czy Bitbucket, JIRA stanowi kompleksowe rozwiązanie wspierające zespoły deweloperskie. Raportowanie błędów w JIRA pozwala na łatwe przypisywanie ich do odpowiednich członków zespołu, dodawanie załączników i komentarzy oraz monitorowanie statusu danego problemu, co usprawnia proces zarządzania jakością oprogramowania.

Pytanie 17

Jakie jest zadanie interpretera?

A. wykonywanie skryptu krok po kroku
B. tłumaczenie kodu na kod maszynowy
C. optymalizacja większej części kodu, aby przyspieszyć jego wykonanie
D. analiza składni całego programu przed jego uruchomieniem
Interpreter to takie narzędzie, które wykonuje kod linijka po linijce. Działa to tak, że odczytuje program napisany w języku wysokiego poziomu, weryfikuje co tam w nim siedzi i od razu realizuje polecenia, co sprawia, że można fajnie testować kod. Na przykład w Pythonie można łatwo sprawdzić różne fragmenty kodu, co jest mega pomocne przy pisaniu i poprawianiu oprogramowania. Wiesz, od kompilatora różni się tym, że kompilator przetwarza cały kod od razu, tworząc kod maszynowy, który później działa na komputerze. Dzięki temu interpreter jest bardziej elastyczny, można szybko przetestować nowe pomysły, ale z drugiej strony, czasami nie działa tak efektywnie jak skompilowane programy, bo każda linia kodu jest analizowana na bieżąco. Więc w przypadku dużych i wymagających aplikacji lepiej sprawdzają się kompilatory, ale interpreter to skarb, zwłaszcza w nauce i prototypowaniu.

Pytanie 18

Co to jest JWT (JSON Web Token)?

A. Biblioteka JavaScript do manipulacji danymi JSON
B. Format zapisu danych w bazach NoSQL
C. Kompaktowy format do bezpiecznego przekazywania informacji między stronami jako obiekt JSON
D. Protokół do przesyłania danych JSON przez sieć
JWT (JSON Web Token) to kompaktowy format, który umożliwia bezpieczne przesyłanie informacji pomiędzy różnymi stronami. Główną zaletą tokenów JWT jest ich struktura, która składa się z trzech części: nagłówka, ładunku (payload) oraz podpisu. Nagłówek zazwyczaj wskazuje typ tokena oraz algorytm użyty do podpisania, co pozwala na szybką weryfikację integralności danych. Ładunek zawiera informacje, często nazywane roszczeniami (claims), które mogą dotyczyć użytkownika lub sesji, a podpis zapewnia, że token nie został zmodyfikowany w trakcie przesyłania. W praktyce JWT jest często wykorzystywany w systemach autoryzacyjnych, gdzie po pomyślnym zalogowaniu, użytkownik otrzymuje token, który następnie może być używany do autoryzacji dostępu do różnych zasobów. Standard JWT definiuje sposób kodowania i dekodowania tokenów, a jego stosowanie pozwala na zwiększenie bezpieczeństwa aplikacji webowych oraz mobilnych poprzez ograniczenie konieczności przechowywania sesji na serwerze, co jest zgodne z najlepszymi praktykami w dziedzinie inżynierii oprogramowania.

Pytanie 19

Pierwszym krokiem w procesie tworzenia aplikacji jest

A. wybór zestawu typów i zmiennych dla aplikacji
B. opracowanie architektury systemu
C. analiza wymagań klienta
D. stworzenie przypadków testowych
Analiza wymagań klienta to taki trochę fundament całego procesu tworzenia aplikacji. Bez niej ciężko ruszyć dalej, bo nie wiadomo, co właściwie trzeba zbudować i jakie cele ma spełniać projekt. Z mojego doświadczenia wynika, że rozmowy z klientem potrafią odkryć wiele niewypowiedzianych oczekiwań – czasem nawet takie, o których sam klient nie pomyślał, ale są kluczowe dla sukcesu produktu. Bez szczegółowego zrozumienia, czego dokładnie potrzebuje użytkownik końcowy, łatwo wpaść w pułapkę budowania funkcjonalności na ślepo lub tworzenia rozwiązań, które nikomu się nie przydadzą. W branży IT mówi się, że im lepsza analiza na starcie, tym mniej poprawek i niespodzianek później w trakcie realizacji. Standardy takie jak IEEE 830 czy metodyki typu Agile i Scrum mocno podkreślają rolę rozmów z klientem oraz dokumentowania wymagań, zanim przejdzie się dalej. Praktycznie każda większa firma najpierw zbiera wymagania – czy to poprzez warsztaty, wywiady, czy analizę procesów biznesowych. Takie podejście pozwala lepiej zaplanować zakres projektu, oszacować koszty i ustalić priorytety. Bez tego nawet najlepsza architektura czy testy nie uratują projektu przed nieporozumieniami i opóźnieniami.

Pytanie 20

Pętla przedstawiona w zadaniu działa na zmiennej typu string o nazwie ciag. Jej celem jest:

int i = 0;
while (ciag[i] != 0)  {
    if (ciag[i] > 96 && ciag[i] < 123)  {
        ciag[i] = (ciag[i] - 32);
    }
    i++;
}
A. Zamienić w ciągu wielkie litery na małe.
B. Zamienić w ciągu małe litery na wielkie.
C. Od każdego znaku w ciągu, który nie jest równy 0, odjąć kod 32.
D. Od każdego znaku w ciągu odjąć kod 32.
Odejmowanie 32 od wszystkich znaków w napisie to trochę kiepski pomysł, bo to nie zawsze działa. Nie wszystkie znaki, takie jak cyfry czy symbole, mają swoje wielkie odpowiedniki, więc ich kod ASCII nie powinien być zmieniany. Kabel od wielkich liter na małe to zupełnie inna bajka – tutaj dodajemy 32 do kodu. Odejmowanie kodu tylko dla znaków różniących się od 0 pomija istotę operacji na literach, co może skutkować dziwnymi rezultatami. Z mojego doświadczenia wynika, że lepiej to przemyśleć przed wprowadzeniem w życie.

Pytanie 21

Kompilator może wygenerować błąd "incompatible types", gdy

A. do zmiennej typu int przypisano wartość 243
B. funkcja oczekuje całkowitej jako argumentu, a została wywołana z napisem jako parametrem
C. w trakcie deklaracji zmiennej wystąpił błąd, zastosowano nieistniejący typ
D. funkcja zwraca typ void, a w momencie wywołania nie jest przypisana do żadnej zmiennej
Błąd 'incompatible types' to dość powszechny problem, kiedy przypisujesz coś do zmiennej, ale typ się nie zgadza. Na przykład, jeśli próbujesz wstawić tekst do miejsca, gdzie oczekiwana jest liczba całkowita, to właśnie wtedy pojawia się ten błąd. W językach jak Java, gdzie typy są mocno zdefiniowane, musisz uważać na takie rzeczy.

Pytanie 22

Który komponent systemu komputerowego zajmuje się transferem danych pomiędzy procesorem a pamięcią RAM?

A. Karta graficzna
B. Mostek północny (Northbridge)
C. Kontroler DMA
D. Zasilacz
Mostek północny, znany również jako Northbridge, jest kluczowym elementem architektury komputerowej, który odpowiada za komunikację pomiędzy procesorem a pamięcią RAM. Jego głównym zadaniem jest koordynowanie przepływu danych w systemie oraz zapewnienie szybkiego dostępu do pamięci, co jest niezbędne dla wydajności całego systemu. Mostek północny jest odpowiedzialny za zarządzanie magistralami danych, a także interfejsami, takimi jak PCI Express, które łączą różne komponenty. Dzięki zastosowaniu standardów, takich jak DDR (Double Data Rate), mostek północny umożliwia efektywne przesyłanie danych w wysokiej prędkości. Praktycznym przykładem działania mostka północnego jest sytuacja, kiedy procesor potrzebuje załadować dane z pamięci RAM do rejestrów – mostek północny zarządza tym procesem, minimalizując opóźnienia i maksymalizując wydajność. W nowoczesnych systemach komputerowych mostek północny jest często zintegrowany z procesorem, co dodatkowo zwiększa efektywność komunikacji oraz zmniejsza czas dostępu do danych.

Pytanie 23

Wskaż fragment kodu, który stanowi realizację przedstawionego algorytmu w języku C++.

Kod 1
do {
  suma = suma + i;
} while (suma <= liczba);
cout << suma;
Kod 2
if (suma <= liczba) {
  suma = suma + i;
  i++;
}
else
  cout << suma;
Kod 3
for (i = suma; i <= liczba; i++)
  suma = suma + i;
else
  cout << suma;
Kod 4
while (suma <= liczba) {
  suma = suma + i;
  i++;
}
cout << suma;
Ilustracja do pytania
A. kod 4
B. kod 1
C. kod 3
D. kod 2
Wybrałeś fragment kodu, który faktycznie odwzorowuje logikę schematu blokowego: najpierw sprawdzamy warunek suma <= liczba, a dopiero gdy jest spełniony, wchodzimy do pętli, dodajemy i do zmiennej suma, inkrementujemy licznik i i wracamy do ponownego sprawdzenia warunku. To jest klasyczne zastosowanie pętli while, czyli sytuacji, kiedy nie znamy liczby iteracji z góry, ale wiemy, kiedy mamy skończyć – w tym wypadku, gdy suma przekroczy wartość graniczną liczba. Z mojego doświadczenia właśnie tak wygląda typowy fragment kodu sumujący kolejne liczby naturalne, dopóki nie zostanie osiągnięty limit. Ważne jest też to, że instrukcja wypisania wyniku znajduje się dopiero za pętlą, więc zostanie wykonana dokładnie raz, po zakończeniu obliczeń, co idealnie zgadza się z blokiem pisz suma na schemacie. W dobrych praktykach programistycznych zawsze pilnujemy, żeby warunek pętli dokładnie odpowiadał opisowi w algorytmie, a modyfikacja zmiennych sterujących, takich jak suma i i, była wykonywana wewnątrz pętli w spójny sposób. Taka konstrukcja jest potem łatwa w utrzymaniu, przeniesieniu do innych języków czy modyfikacji, na przykład można bez problemu zmienić warunek na suma < liczba albo dodać dodatkowe sprawdzenie, czy i nie rośnie za szybko. W praktycznych projektach, np. przy obliczaniu sum kontrolnych, limitów budżetowych, punktów gracza w grze, dokładnie taki wzorzec while warunek, obliczenia, inkrementacja, wypisz wynik pojawia się naprawdę często.

Pytanie 24

Jak najlepiej przełożyć oczekiwania klienta na dokumentację techniczną dla programistów?

A. Pomijając szczegółowe wymagania techniczne
B. Tworząc szczegółowy dokument z funkcjami oraz wymaganiami technicznymi
C. Rozmawiając wyłącznie z zespołem programistów
D. Opracowując wizualne makiety bez dokładnych opisów
Sporządzenie szczegółowego dokumentu z funkcjami i wymaganiami technicznymi to najlepszy sposób na przełożenie wymagań klienta na specyfikację techniczną. Dokumentacja techniczna jest podstawą do stworzenia aplikacji zgodnej z oczekiwaniami klienta i pozwala na precyzyjne określenie zakresu prac. Zawiera ona opisy funkcjonalności, diagramy architektury, wymagania dotyczące wydajności oraz harmonogram wdrożenia, co minimalizuje ryzyko błędów i nieporozumień podczas realizacji projektu.

Pytanie 25

Przyjmując, że opisana hierarchia klas właściwie odzwierciedla figury geometryczne i każda figura ma zdefiniowaną metodę do obliczania pola, to w której klasie można znaleźć deklarację metody liczPole()?

Ilustracja do pytania
A. figura
B. trapez
C. trójkąt
D. czworokąt
Deklaracja metody liczPole() powinna znajdować się w klasie bazowej, czyli w tym przypadku w klasie „figura”. To podejście jest zgodne z zasadami programowania obiektowego i tzw. polimorfizmem. Dzięki temu każda klasa dziedzicząca po „figurze” jest zobowiązana do własnej implementacji tej metody. To bardzo praktyczne rozwiązanie, bo umożliwia tworzenie ogólnych kolekcji (np. List<Figura>), które mogą przechowywać obiekty różnych figur, a następnie wywoływać liczPole() na każdym z nich bez zastanawiania się, jakiego typu to dokładnie obiekt. Z mojego doświadczenia wynika, że tak właśnie projektuje się API i biblioteki geometryczne – klasa bazowa narzuca kontrakt, a szczegóły są po stronie konkretnych figur. Warto dodać, że zgodnie z dobrymi praktykami, do deklarowania takich metod używa się słowa kluczowego „abstract”, co jasno komunikuje, że metoda musi być uzupełniona w klasach potomnych. Takie podejście mocno ułatwia rozbudowę kodu, np. kiedy chcemy dodać nowy typ figury, wystarczy, że nadpiszemy liczPole(). Moim zdaniem to jeden z najfajniejszych przykładów, jak dobrze przemyślana architektura kodu oszczędza czas i nerwy programistom.

Pytanie 26

Który z wymienionych poniżej typów danych stanowi przykład typu stałoprzecinkowego?

A. decimal
B. int
C. float
D. double
Typ danych 'int' (integer) to przykład typu stałoprzecinkowego, który przechowuje liczby całkowite. Stałoprzecinkowe typy danych są podstawą w programowaniu, ponieważ pozwalają na efektywne przechowywanie wartości bez części ułamkowej, co przyspiesza obliczenia i redukuje zużycie pamięci. Typ 'int' jest szeroko stosowany w językach takich jak C, C++, Java i Python, a jego główną zaletą jest szybkość operacji arytmetycznych oraz przewidywalność wyników. Stałoprzecinkowe typy danych znajdują zastosowanie w algorytmach, systemach sterowania i aplikacjach embedded, gdzie precyzja obliczeń jest kluczowa.

Pytanie 27

Zgodnie z informacjami zawartymi w ramce, wskaż, który z rysunków ilustruje element przypisany do klasy Badge określonej w bibliotece Bootstrap?

Ilustracja do pytania
A. A
B. B
C. D
D. C
Wybrałeś wariant B i to zdecydowanie właściwy trop. Badge w Bootstrapie to nic innego jak taki mały, liczbowy wskaźnik – najczęściej widoczny przy nazwach kategorii, powiadomieniach czy komentarzach – który sygnalizuje użytkownikowi ile czegoś się pojawiło albo ile czeka akcji do wykonania. W praktyce, taki element to nie tylko liczba w kolorowym prostokącie czy kółku, ale też bardzo czytelny komunikat do użytkownika, co się ostatnio zmieniło lub co wymaga uwagi. Właśnie dlatego, w przykładzie B, mamy niebieskie prostokąty z liczbami przy różnych sekcjach (News, Comments, Updates) – to klasyczny przykład badge’a w Bootstrapie, często stylowanego klasą .badge i powiązaną kolorystyką. Warto zwrócić uwagę, że takie badge’e są nie tylko wizualne, ale też semantyczne – są rozpoznawalne przez czytniki ekranu, co jest zgodne z dobrymi praktykami dostępności (WCAG). Stosując badge’e, zwiększamy czytelność i dostępność interfejsu użytkownika, bo od razu wiadomo, gdzie coś nowego się pojawiło. Moim zdaniem, korzystanie z badge’y to jeden z prostszych i skuteczniejszych sposobów na poprawę UX – no i są bardzo łatwe do wdrożenia, wystarczy jedna klasa CSS i gotowe.

Pytanie 28

Testy mające na celu identyfikację błędów w interfejsach między modułami bądź systemami nazywane są testami

A. integracyjnymi
B. wydajnościowymi
C. bezpieczeństwa
D. jednostkowymi
Testy integracyjne mają na celu wykrycie błędów w interfejsach i połączeniach między modułami lub systemami. Głównym celem tych testów jest sprawdzenie, czy różne komponenty aplikacji współpracują ze sobą zgodnie z oczekiwaniami. Testy integracyjne są przeprowadzane po testach jednostkowych, ale przed testami systemowymi. W praktyce testy te obejmują scenariusze, w których kilka modułów wymienia dane lub współdziała w ramach wspólnego procesu. Integracja jest kluczowa dla zapewnienia, że cały system działa jako spójna całość, co minimalizuje ryzyko błędów na etapie produkcji i poprawia jakość końcowego produktu. Przykładem może być test komunikacji między modułem autoryzacji użytkowników a modułem płatności w aplikacji e-commerce.

Pytanie 29

Podana deklaracja zmiennych w języku JAVA zawiera

String imie = "Anna";
short wiek = 12;
int i = 0;
char plec = 'K';
boolean jestUczniem = true;
A. jedną zmienną typu tekstowego, dwie całkowite, jedną znakową i jedną logiczną
B. jedną zmienną typu tekstowego, jedną rzeczywistą, jedną całkowitą, jedną znakową oraz jedną logiczną
C. dwie zmienne typu tekstowego, dwie całkowite oraz jedną logiczną
D. dwie zmienne o typie strukturalnym
Analizując podaną deklarację zmiennych w języku Java, widać wyraźnie, że mamy tu do czynienia z pięcioma zmiennymi o różnych typach: String imie = "Anna" – typ tekstowy, short wiek = 12 oraz int i = 0 – dwa typy całkowite (różnią się zakresem wartości), char plec = 'K' – typ znakowy, boolean jestUczniem = true – typ logiczny. Takie zróżnicowanie typów pozwala nie tylko przechowywać różne informacje, ale też lepiej zarządzać pamięcią i logiczną strukturą programu. Z mojej perspektywy, właściwy dobór typów danych to podstawa, bo pomaga unikać wielu późniejszych problemów z kompatybilnością czy błędami wykonania. Java została zaprojektowana tak, by wymuszać jawność typów, co zdecydowanie zwiększa czytelność kodu i zmniejsza liczbę nieoczywistych bugów. Praktycznie, w każdej większej aplikacji spotkamy się z kombinacją typów prostych (jak int, short, boolean czy char) i obiektowych (np. String). Warto pamiętać, że String to typ referencyjny, a nie prosty jak reszta wymienionych. Przy dużych projektach poleca się deklarować zmienne możliwie najwęższego typu (np. short zamiast int, jeśli wystarczy), by oszczędzać zasoby. To jest taka podstawowa wiedza, bez której trudno ruszyć dalej w świecie Javy, bo typy decydują o tym, jak zachowuje się program i co można z danymi zrobić. W rzeczywistych projektach, na przykład przy tworzeniu rejestracji użytkowników czy bazy danych, takie typy jak String, int, char i boolean pojawiają się na każdym kroku.

Pytanie 30

Który z poniższych języków programowania jest statycznie typowany?

A. PHP
B. TypeScript
C. Ruby
D. JavaScript
Odpowiedzi JavaScript, PHP i Ruby są przykładami języków programowania, które są statycznie typowane, co jest niepoprawne. JavaScript jest językiem dynamicznie typowanym, co oznacza, że typy zmiennych są określane w czasie wykonywania, a nie w czasie kompilacji. To podejście, choć elastyczne, może prowadzić do błędów, których nie widać do momentu uruchomienia programu. Na przykład, w JavaScript można przypisać do zmiennej wartość liczbową, a następnie przypisać do niej wartość tekstową, co może prowadzić do nieprzewidzianych problemów w logice aplikacji. PHP także jest językiem dynamicznie typowanym, co oznacza, że nie wymaga określenia typów zmiennych przed ich użyciem. Choć PHP oferuje pewne mechanizmy do wprowadzania typowania, to jego zachowanie jest bardziej bliskie dynamicznemu podejściu niż statycznemu, co może obniżać jakość kodu i prowadzić do trudności w jego utrzymaniu. Ruby, podobnie jak poprzednie języki, również charakteryzuje się dynamicznym typowaniem, co sprawia, że programiści mogą łatwo zmieniać typy zmiennych w trakcie działania programu, ale znowu, takie podejście niesie ze sobą ryzyko błędów, które mogą być trudne do zdiagnozowania. Te przykłady ilustrują, jak dynamiczne typowanie może prowadzić do pomyłek i błędów w programach, dlatego statyczne typowanie, jak w TypeScript, jest często preferowane w projektach o większej skali oraz tam, gdzie wymagane jest wysokie bezpieczeństwo kodu.

Pytanie 31

Które z poniższych twierdzeń najlepiej charakteryzuje bibliotekę w kontekście programowania?

A. Zbiór kodu źródłowego, który jest stosowany wyłącznie w fazie kompilacji aplikacji
B. Zbiór zmiennych globalnych, które są dostępne w trakcie działania aplikacji
C. Plik wykonywalny, który funkcjonuje jako odrębny program
D. Zestaw funkcji i klas, które mogą być wykorzystywane w aplikacjach
Biblioteka w programowaniu to taka paczka różnych funkcji i klas, które można wykorzystać w wielu projektach. Dzięki nim programiści mają łatwiej, bo korzystają z gotowych rozwiązań, co oszczędza czas na pisanie aplikacji. W bibliotekach można znaleźć przeróżne moduły – od prostych funkcji matematycznych po skomplikowane narzędzia do obsługi grafiki, sieci czy baz danych. Znam parę popularnych bibliotek, takich jak React.js w JavaScript, NumPy w Pythonie czy STL w C++. Używanie bibliotek sprawia, że praca programisty jest efektywniejsza, a tworzenie bardziej złożonych aplikacji idzie szybciej, bo nie musisz wszystkiego pisać od podstaw.

Pytanie 32

Który z wymienionych dysków oferuje najszybszy dostęp do danych?

A. HDD 7200 RPM, SATA III, 64 MB Cache
B. SSD NVMe PCIe 3.0, prędkość odczytu do 3500 MB/s
C. SSD SATA III, prędkość odczytu do 550 MB/s
D. HDD 5400 RPM, SATA II, 32 MB Cache
Odpowiedź wskazująca na SSD NVMe PCIe 3.0 jako najszybszy dysk do odczytu danych jest zgodna z obecnymi standardami technologii przechowywania. Dyski SSD (Solid State Drive) korzystają z pamięci flash, co pozwala na znacznie szybszy dostęp do danych w porównaniu do tradycyjnych dysków HDD (Hard Disk Drive), które działają na zasadzie mechanicznych ruchomych elementów. Dyski NVMe (Non-Volatile Memory Express) są szczególnie wydajne, ponieważ wykorzystują interfejs PCIe (Peripheral Component Interconnect Express), co umożliwia znacznie wyższe prędkości transferu danych. W przypadku SSD NVMe PCIe 3.0, prędkość odczytu może osiągać do 3500 MB/s, co jest znaczącą różnicą w porównaniu do prędkości odczytu w dyskach HDD i SSD SATA. Przykładowo, w zastosowaniach takich jak edycja wideo, renderowanie grafiki 3D czy gry komputerowe, wyższa prędkość odczytu przekłada się na szybsze ładowanie danych i lepszą wydajność systemu. Standardy SATA III dla HDD również mają swoje ograniczenia, ponieważ maksymalna teoretyczna prędkość transferu wynosi 6 Gb/s, co jest dalekie od osiągów oferowanych przez NVMe. Dlatego SSD NVMe PCIe 3.0 jest zdecydowanym liderem w kontekście wydajności odczytu danych w porównaniu do pozostałych opcji.

Pytanie 33

Które z wymienionych działań zwiększa bezpieczeństwo transakcji online?

A. Nieaktualizowanie oprogramowania przeglądarki
B. Udostępnianie informacji o karcie kredytowej w e-mailach
C. Weryfikowanie certyfikatów SSL na stronach zajmujących się transakcjami
D. Zastosowanie publicznego Wi-Fi do logowania się na konto bankowe
Sprawdzanie certyfikatów SSL na stronach transakcyjnych to jeden z najważniejszych kroków w zapewnieniu bezpieczeństwa transakcji internetowych. Certyfikat SSL szyfruje dane przesyłane między użytkownikiem a serwerem, chroniąc je przed przechwyceniem przez osoby trzecie. Adresy stron z certyfikatem SSL zaczynają się od 'https', co wskazuje na bezpieczne połączenie. Certyfikaty SSL zapewniają integralność danych i są podstawą dla każdej strony internetowej obsługującej płatności lub przechowującej dane użytkowników. Zignorowanie tej kwestii naraża użytkowników na ataki typu man-in-the-middle i phishing.

Pytanie 34

Jakie są główne różnice między środowiskiem RAD (Rapid Application Development) a klasycznymi IDE?

A. RAD pozwala na szybkie tworzenie prototypów i rozwijanie aplikacji przy minimalnej ilości kodu
B. RAD nie oferuje żadnych narzędzi do debugowania
C. RAD koncentruje się tylko na testowaniu programów
D. RAD funkcjonuje tylko w systemach operacyjnych Linux
RAD (Rapid Application Development) to metodologia tworzenia oprogramowania, która kładzie nacisk na szybkie prototypowanie i iteracyjne podejście do rozwoju aplikacji, minimalizując czas poświęcany na pisanie kodu od podstaw. Kluczowym aspektem RAD jest możliwość szybkiego dostosowywania aplikacji do zmieniających się wymagań biznesowych oraz ciągła interakcja z klientem. Narzędzia RAD, takie jak Visual Studio, Delphi czy OutSystems, pozwalają na budowanie aplikacji przy użyciu graficznych interfejsów, gotowych komponentów i automatycznego generowania kodu, co znacząco skraca czas wprowadzenia produktu na rynek. RAD doskonale sprawdza się w przypadku projektów o krótkim cyklu życia i wymagających szybkich zmian.

Pytanie 35

Co to jest PWA (Progressive Web App)?

A. Biblioteka graficzna do tworzenia animacji
B. System zarządzania treścią dla stron internetowych
C. Aplikacja webowa działająca jak natywna aplikacja mobilna
D. Framework do tworzenia aplikacji mobilnych
Jednym z powszechnych nieporozumień jest mylenie Progressive Web App z frameworkami do tworzenia aplikacji mobilnych, takimi jak React Native czy Flutter. Te frameworki pozwalają na tworzenie natywnych aplikacji, które działają na platformach mobilnych i wykorzystują ich natywne API, podczas gdy PWA jest technologią webową, która działa w przeglądarkach internetowych, niezależnie od systemu operacyjnego urządzenia. Ponadto, niektóre osoby mogą myśleć, że PWA to system zarządzania treścią (CMS), co jest błędem. CMS, jak WordPress czy Joomla, skupiają się na tworzeniu i zarządzaniu treścią stron internetowych, natomiast PWA są aplikacjami zaprojektowanymi dla użytkowników, które wykorzystują technologię webową do zapewnienia natywnego doświadczenia. Inne odpowiedzi sugerują, że PWA to biblioteka graficzna, co również jest mylną interpretacją. PWA nie jest narzędziem do tworzenia animacji, ale raczej kompletnym podejściem do budowy aplikacji internetowych, które mogą działać offline i oferować natywne funkcjonalności. Kluczowym błędem myślowym jest brak zrozumienia, że PWA nie polega na technologiach służących do tworzenia aplikacji mobilnych, lecz na wykorzystaniu możliwości nowoczesnych przeglądarek w celu dostarczenia użytkownikom aplikacji działającej płynnie i efektywnie, z poprawioną dostępnością i użytecznością.

Pytanie 36

Przedstawione w filmie działania wykorzystują narzędzie

A. generatora kodu java
B. generatora GUI przekształcającego kod do języka XAML
C. debuggera analizującego wykonujący kod
D. kompilatora dla interfejsu graficznego
Wybrana odpowiedź jest trafna, bo faktycznie narzędzie pokazane w filmie to generator GUI, który potrafi przekształcać kod do języka XAML. XAML (czyli Extensible Application Markup Language) jest powszechnie używany do deklaratywnego opisywania interfejsów użytkownika, na przykład w aplikacjach WPF czy UWP na platformie .NET. Jak dla mnie, korzystanie z takich generatorów to ogromna wygoda, bo pozwala błyskawicznie przenosić projekt graficzny do formatu czytelnego dla platformy Microsoftu. Z mojego doświadczenia, wiele zespołów programistycznych stosuje takie rozwiązania, żeby oszczędzić czas na ręcznym pisaniu XAML-a (co potrafi być naprawdę żmudne przy dużych projektach). Co ciekawe, takie narzędzia bardzo dobrze współpracują z designerskimi edytorami UI i potrafią zautomatyzować konwersję nawet z innych formatów graficznych, np. Sketch czy Adobe XD do XAML-a. Branżowe standardy zalecają, by wykorzystywać generatorów GUI właśnie do tego celu, bo minimalizuje to liczbę błędów, przyspiesza wdrożenie zmian i ułatwia współpracę między programistami a projektantami. Warto pamiętać, że XAML jest bardzo elastyczny i umożliwia potem ręczną edycję wygenerowanego kodu – czasem powstają drobne poprawki, ale ogólnie to naprawdę przydatne narzędzie. Ogólnie – jeśli tylko projektujesz UI pod .NET, to automatyczna konwersja do XAML-a to jest coś, co warto znać i wykorzystywać w praktyce.

Pytanie 37

Która z poniższych technologii służy do tworzenia aplikacji mobilnych za pomocą języków webowych?

A. Spring Boot
B. React Native
C. ASP.NET Core
D. Django
React Native to popularna technologia opracowana przez Facebook, która umożliwia tworzenie aplikacji mobilnych z wykorzystaniem języków webowych, takich jak JavaScript oraz biblioteki React. React Native umożliwia programistom pisanie kodu raz i uruchamianie go na różnych platformach mobilnych, w tym iOS i Android, co znacząco przyspiesza proces developmentu. Dzięki temu, aplikacje stworzone w React Native zyskują natywną wydajność oraz dostęp do natywnych komponentów, co jest kluczowe dla uzyskania dobrego doświadczenia użytkownika. Przykłady zastosowania React Native obejmują znane aplikacje, takie jak Facebook, Instagram czy Skype, które wykorzystują tę technologię, aby szybko wprowadzać zmiany i aktualizacje. W branży uznaje się, że stosowanie React Native przyczynia się do oszczędności czasu i zasobów, a także wspiera dobre praktyki związane z wielokrotnym użyciem kodu. Warto również zauważyć, że React Native wspiera hot reloading, co pozwala programistom na bieżąco obserwować zmiany w kodzie bez potrzeby ponownego uruchamiania aplikacji.

Pytanie 38

Użycie modyfikatora abstract w definicji metody w klasie wskazuje, że

A. trzeba zaimplementować tę metodę w tej klasie
B. klasa ta stanowi podstawę dla innych klas
C. dziedziczenie po tej klasie jest niedozwolone
D. klasy pochodne nie mogą implementować tej metody
Modyfikator abstract w definicji metody jasno wskazuje, że dana klasa jest przeznaczona do dalszego dziedziczenia i stanowi coś w rodzaju szablonu dla innych klas. W praktyce – jeśli w klasie pojawia się choć jedna metoda abstract, cała klasa musi być także oznaczona jako abstract. To taki sygnał: hej, tej klasy nie da się użyć bezpośrednio, ale możesz po niej dziedziczyć i dopiero tam zaimplementować szczegóły. Moim zdaniem to bardzo wygodne, bo pozwala z góry narzucić kontrakt na klasy pochodne – mają dostarczyć własne wersje abstrakcyjnych metod. W wielu językach obiektowych, jak C# czy Java, stosowanie klas abstrakcyjnych jest powszechną praktyką przy projektowaniu rozbudowanych aplikacji, gdzie ważne jest rozdzielenie ogólnej logiki od szczegółowych implementacji. Daje to sporą elastyczność i chroni przed przypadkowymi błędami, kiedy ktoś próbowałby utworzyć obiekt klasy, która nie ma pełnej funkcjonalności. Często spotyka się to np. przy projektowaniu hierarchii typu Zwierzę → Pies/Kot, gdzie klasa Zwierzę jest abstrakcyjna i zawiera np. metodę abstract WydajDźwięk(). Dzięki temu każde konkretne zwierzę musi zaimplementować własną wersję tej metody, a całość kodu jest czytelniejsza i łatwiej ją rozwijać. Zdecydowanie warto poznać ten mechanizm, bo to fundament nowoczesnego programowania obiektowego i coś, co codziennie przydaje się w pracy programisty.

Pytanie 39

Jaką istotną właściwość ma algorytm rekurencyjny?

A. Wywołuje się wielokrotnie w jednej iteracji
B. Funkcjonuje tylko w przypadku tablic dynamicznych
C. Zawiera wywołanie samego siebie
D. Jest podzielony na wiele niezwiązanych funkcji
Wywołanie funkcji wielokrotnie w jednej iteracji jest charakterystyczne dla algorytmów iteracyjnych, a nie rekurencyjnych. Podział algorytmu na wiele niezależnych funkcji to część modularności i nie wskazuje jednoznacznie na rekurencję. Algorytmy działające wyłącznie na tablicach dynamicznych mogą być zarówno iteracyjne, jak i rekurencyjne, jednak to rekurencyjne wywołanie samego siebie stanowi kluczowy wyróżnik rekurencyjnego podejścia do problemów.

Pytanie 40

Co to jest dokumentacja instruktażowa programu?

A. Kolekcją testów jednostkowych oraz ich wyników
B. Instrukcją opisującą, jak używać funkcji programu
C. Zbiorem szczegółów technicznych dotyczących kodu źródłowego
D. Dokumentem przedstawiającym plany rozwoju oprogramowania
Dokument zawierający szczegóły techniczne kodu źródłowego to część dokumentacji dla programistów, a nie instrukcja pomocy skierowana do użytkownika końcowego. Zbiór testów jednostkowych i wyników to część procesu testowania aplikacji, mająca na celu weryfikację poprawności działania kodu, ale nie wyjaśnia użytkownikom końcowym, jak korzystać z programu. Dokumenty związane z planami rozwoju aplikacji są istotne z punktu widzenia zarządzania projektem, ale nie zawierają instrukcji dotyczących bieżącej obsługi i użytkowania oprogramowania.