Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 27 maja 2026 08:09
  • Data zakończenia: 27 maja 2026 08:46

Egzamin zdany!

Wynik: 23/40 punktów (57,5%)

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

Co to jest algorytm QuickSort?

A. Algorytm wyszukiwania binarnego w posortowanej tablicy
B. Technika przeszukiwania grafu wszerz
C. Wydajny algorytm sortowania oparty na strategii 'dziel i zwyciężaj'
D. Metoda kompresji danych bez strat
Algorytm QuickSort to jeden z najbardziej popularnych i efektywnych algorytmów sortowania, który opiera się na strategii 'dziel i zwyciężaj'. W praktyce działa w ten sposób, że wybiera element zwany pivotem (osią) i dzieli zbiór na dwie części: jeden z elementami mniejszymi od pivota, a drugi z elementami większymi. Następnie rekurencyjnie sortuje te podzbiory. QuickSort jest niezwykle szybki i wydajny, zwłaszcza dla dużych zbiorów danych, a jego średnia złożoność czasowa wynosi O(n log n). Używa się go w wielu aplikacjach, gdzie istotne jest szybkie przetwarzanie danych, takich jak sortowanie list w aplikacjach webowych czy organizacja danych w bazach. Warto jednak pamiętać, że w najgorszym przypadku, gdy pivot jest źle wybierany, złożoność może wynosić O(n^2), co występuje na przykład w przypadku już posortowanej tablicy. W kontekście praktycznym, dobre praktyki obejmują dobór odpowiedniej metody wyboru pivota, co może znacznie poprawić wydajność algorytmu.

Pytanie 2

Polecenia wydane w kontekście repozytorium Git, przy założeniu, że folder projektu jest aktualnie wybrany, mają na celu

git init
git add .
git commit -m 'first commit'
A. utworzenie kopii istniejącego repozytorium z jedynie tą rewizją, która zostanie zapisana pod nazwą first commit
B. zamknięcie projektu, co spowoduje zarchiwizowanie wszystkich rewizji do lokalnego archiwum pod nazwą first commit
C. rozpoczęcie sesji z już istniejącym repozytorium oraz pobranie kodu projektu do lokalnego folderu
D. rozpoczęcie pracy z nowym repozytorium, dodanie oraz zatwierdzenie kodu projektu jako first commit
Rozpoczęcie pracy z repozytorium Git jest kluczowe dla efektywnego zarządzania wersjami kodu jednak błędne zrozumienie procesu może prowadzić do nieprawidłowych wniosków. Git nie oferuje funkcji zamknięcia projektu przez zarchiwizowanie wszystkich rewizji do lokalnego archiwum pod nazwą first commit. Takie podejście jest sprzeczne z modelem działania Gita który bazuje na ciągłym rozwoju i wersjonowaniu. Git nie tworzy kopii repozytorium jedynie z rewizją nazwaną first commit. Zamiast tego w każdym commicie zapisuje stan wszystkich dodanych plików co pozwala na pełną rekonstrukcję stanu projektu w każdej wersji. Utworzenie kopii repozytorium jest wykonywane przez klonowanie za pomocą git clone które jednak zachowuje całą historię wersji. Ponadto rozpoczęcie sesji z istniejącym repozytorium i pobranie kodu do lokalnego folderu odbywa się przez polecenia takie jak git clone lub git pull a nie poprzez inicjalizację nowego repozytorium. Użycie poleceń inicjalizujących git init i pierwszego commitu jest typowe dla rozpoczęcia od zera a ich zastosowanie w innych kontekstach może prowadzić do błędów.

Pytanie 3

Które z poniższych nie jest narzędziem do zarządzania stanem w aplikacjach React?

A. MobX
B. Redux
C. Webpack
D. Context API
Webpack to narzędzie do budowania, które służy do zarządzania zasobami w projekcie, a nie do zarządzania stanem aplikacji. Jego głównym celem jest przekształcanie i optymalizacja plików, takich jak JavaScript, CSS czy obrazy, przed ich wdrożeniem na produkcję. Dzięki Webpackowi można tworzyć modułowe aplikacje, które pozwalają na łatwe zarządzanie zależnościami. Przykładem użycia Webpacka może być skonfigurowanie go do kompresji plików JavaScript oraz CSS w celu zwiększenia wydajności aplikacji. W praktyce, Webpack jest szeroko stosowany w projektach React, aby efektywnie łączyć i optymalizować kod z różnych źródeł, co przekłada się na szybsze ładowanie się aplikacji. Standardy dotyczące zarządzania projektami przewidują, że narzędzia do budowania, takie jak Webpack, powinny być odpowiednio skonfigurowane w celu zapewnienia najlepszych praktyk dotyczących wydajności i organizacji kodu.

Pytanie 4

Wskaż właściwość charakterystyczną dla metody abstrakcyjnej?

A. zawsze jest prywatna
B. jest pusta w klasach dziedziczących
C. nie ma implementacji w klasie bazowej
D. jest pusta w klasie nadrzędnej
Wokół metod abstrakcyjnych narosło sporo nieporozumień, które często wynikają z mieszania pojęć związanych z dziedziczeniem i modyfikatorami dostępu. Ludzie czasem myślą, że metoda abstrakcyjna musi być zawsze prywatna, co jednak mija się z prawdą – przecież klasa pochodna nie miałaby do niej dostępu i nie mogłaby jej zaimplementować, gdyby była private. Standardy języków jak Java czy C# wręcz wymagają, by była minimum protected albo public, żeby dziedziczące klasy mogły ją nadpisać. Często można się też spotkać z przekonaniem, że metoda abstrakcyjna jest pusta w klasach dziedziczących – a to bardzo mylące, bo właśnie w klasach dziedziczących mamy obowiązek podać jej konkretną implementację. Jeżeli to pominiesz, kompilator przypomni o tym błędzie. Pojawia się też pogląd, że metoda abstrakcyjna jest pusta w klasie nadrzędnej – to nieprecyzyjne ujęcie, bo 'pusta' sugeruje, że można mieć ciało metody, tylko nic w nim nie napisać, a tymczasem w przypadku metody abstrakcyjnej w ogóle nie wolno podawać ciała w klasie bazowej (nawet klamerek!). Typowym błędem jest też mylenie metody abstrakcyjnej z tzw. metodą wirtualną lub domyślną (te już często mają jakąś domyślną implementację, którą można nadpisać). Takie nieporozumienia prowadzą potem do źle zaprojektowanych hierarchii klas, co z czasem utrudnia rozwój projektu. Z mojego doświadczenia wynika, że najlepiej po prostu pamiętać: metoda abstrakcyjna to taka, która nie ma implementacji w bazie i wymusza jej podanie w klasie pochodnej. Tyle, żadnych półśrodków czy wyjątków.

Pytanie 5

Programista pragnie wybrać algorytm, który najszybciej przetwarza dane w jego aplikacji. Na podstawie złożoności obliczeniowej przedstawionej w tabeli, należy wskazać algorytm numer

Algorytm 1O(n²)
Algorytm 2O(n!)
Algorytm 3O(n³)
Algorytm 4O(n)
Algorytm 5O(n²)
A. 3
B. 2 lub 3
C. 4
D. 1 lub 5
Wybierając algorytm do zastosowania w praktycznej aplikacji, kluczowe jest zwracanie uwagi na złożoność obliczeniową, bo to ona decyduje, jak algorytm radzi sobie ze wzrostem ilości danych. Często spotykam się z błędnym przekonaniem, że algorytm o złożoności na przykład O(n²) jest w porządku, o ile nie mamy naprawdę gigantycznych zbiorów danych. Problem polega na tym, że już przy kilkuset czy kilku tysiącach elementów taki algorytm potrafi znacząco spowolnić działanie aplikacji. Jeszcze gorzej jest z O(n³), bo tutaj czas wykonania rośnie bardzo szybko, praktycznie wykładniczo – co praktycznie wyklucza użycie tego algorytmu w prawdziwie produkcyjnych rozwiązaniach, chyba że mamy do czynienia z ekstremalnie małymi zbiorami danych. Odpowiedzi wskazujące na algorytmy z O(n²) lub O(n³) pomijają najlepszą opcję, która znajduje się w tabeli – czyli Algorytm 4 z O(n). Tylko O(n) gwarantuje, że czas działania rośnie w sposób liniowy, co daje praktycznie jedyną szansę na obsługę dużych wolumenów danych bez zatorów i „zadyszki” aplikacji. Odpowiedź wskazująca Algorytm 2 (O(n!)) to już w ogóle bardzo typowy błąd – tego typu złożoność spotyka się głównie w algorytmach, gdzie trzeba sprawdzić wszystkie możliwe permutacje, jak np. problem komiwojażera, i na pewno nie jest to wybór optymalny. Podsumowując, cała ta sytuacja pokazuje, jak ważna jest umiejętność czytania notacji O(...) i świadomego wybierania algorytmów – to podstawa w programowaniu, szczególnie jeśli zależy nam na wydajności i skalowalności naszych rozwiązań.

Pytanie 6

Która z wymienionych właściwości najlepiej charakteryzuje biblioteki dynamiczne?

A. Są ładowane w trakcie działania aplikacji
B. Są statycznie dołączane do pliku wykonywalnego
C. Są ładowane podczas kompilacji
D. Zawierają kod źródłowy aplikacji
Biblioteki dynamiczne, znane też jako DLL w Windows czy SO w Unix/Linux, ładują się do pamięci, gdy program działa. To super, bo dzięki temu aplikacja nie marnuje zasobów, a jak zajdzie potrzeba, to może z nich korzystać. Można też aktualizować te biblioteki bez potrzeby rekompilacji całego programu – to duża wygoda. Dzięki dynamicznemu ładowaniu kod może być współdzielony przez różne aplikacje, a to zmniejsza rozmiar plików i sprawia, że łatwiej się tym wszystkim zarządza.

Pytanie 7

Jakiego typu testy są stosowane do sprawdzania funkcjonalności prototypu interfejsu?

A. Testy obciążeniowe
B. Testy interfejsu
C. Testy zgodności
D. Testy efektywnościowe
Testy interfejsu są kluczowe w procesie weryfikacji funkcji prototypu interfejsu użytkownika. Testy te koncentrują się na sprawdzeniu poprawności działania wszystkich elementów graficznych, takich jak przyciski, pola tekstowe, menu rozwijane oraz formularze. Testy interfejsu pozwalają upewnić się, że interakcje użytkownika z aplikacją przebiegają zgodnie z oczekiwaniami i nie powodują błędów w nawigacji. Dzięki nim można wykryć problemy związane z nieprawidłowym rozmieszczeniem elementów, brakiem reakcji na kliknięcia lub nieintuicyjnym działaniem, co pozwala na wczesne wdrożenie poprawek i zwiększenie użyteczności aplikacji.

Pytanie 8

W języku Python, jak nazywa się funkcja, która jest wykonywana automatycznie, gdy obiekt jest niszczony?

A. __repr__
B. __del__
C. __str__
D. __init__
W Pythonie funkcja <code>__del__</code> to metoda destruktora, która jest wywoływana, gdy obiekt jest niszczony. Jest to część procesu zarządzania pamięcią, gdzie interpreter Pythona automatycznie usuwa obiekty, które nie są już potrzebne, aby zwolnić pamięć. <code>__del__</code> pozwala na wykonanie dodatkowych czynności przed ostatecznym usunięciem obiektu, takich jak zamknięcie plików czy połączeń sieciowych. Warto jednak pamiętać, że użycie <code>__del__</code> nie jest zalecane do zarządzania zasobami, ponieważ może prowadzić do trudnych do zdiagnozowania błędów, szczególnie gdy obiekty są usuwane w nieprzewidywalnym momencie. Zamiast tego, lepiej jest używać menedżerów kontekstu (z instrukcją <code>with</code>), które zapewniają bardziej kontrolowane i bezpieczne zwalnianie zasobów. Przykładowo, otwierając plik za pomocą <code>with open('plik.txt', 'r') as f:</code>, masz pewność, że plik zostanie zamknięty poprawnie po zakończeniu bloku kodu, niezależnie od tego, czy wystąpił błąd.

Pytanie 9

Jakie jest główne zadanie kontrolera w architekturze MVC (Model-View-Controller)?

A. Obsługa logiki biznesowej i przetwarzanie danych wejściowych od użytkownika
B. Zarządzanie sesją użytkownika
C. Przechowywanie danych aplikacji
D. Prezentowanie danych użytkownikowi
W architekturze MVC każda z trzech warstw pełni ściśle określoną rolę. W przypadku odpowiedzi wskazującej, że kontroler przechowuje dane aplikacji, jest to błędne, ponieważ za przechowywanie i zarządzanie danymi odpowiada model. Model jest odpowiedzialny za dostęp do danych, ich walidację i przechowywanie, co pozwala na zachowanie integralności danych oraz izolację od pozostałych elementów architektury. Odpowiedź sugerująca, że kontroler prezentuje dane użytkownikowi, również jest niepoprawna. Za prezentację danych odpowiada warstwa widoku, która przekształca dane otrzymane z modelu w formę zrozumiałą dla użytkownika. Widok jest odpowiedzialny za interfejs użytkownika i sposób, w jaki dane są wyświetlane. Ostatnia z błędnych odpowiedzi sugeruje, że kontroler zarządza sesją użytkownika. Sesje zazwyczaj są zarządzane na poziomie aplikacji webowej poprzez mechanizmy takie jak cookies czy sesje serwerowe, często poza bezpośrednim zakresem kontrolera w MVC. Choć kontroler może odczytywać dane sesji, jego główna funkcja nie obejmuje bezpośredniego zarządzania nimi. Takie rozdzielenie obowiązków pozwala na większą modularność aplikacji i lepszą separację zadań, co jest kluczowe w efektywnym projektowaniu systemów informatycznych.

Pytanie 10

Jakie są kluczowe różnice pomiędzy strukturą (struct) a unią (union) w języku C?

A. Struktura przechowuje wiele wartości równocześnie, unia tylko jedną
B. Unia umożliwia dynamiczne przypisywanie typów danych, struktura natomiast nie
C. Struktura wymaga więcej miejsca w pamięci niż unia
D. Unia nie jest obsługiwana przez kompilatory współczesnych języków
Unia nie pozwala na dynamiczne typowanie danych – typ każdego pola jest zdefiniowany w czasie kompilacji, podobnie jak w strukturze. Struktura nie zajmuje więcej pamięci niż unia – zajmuje dokładnie tyle miejsca, ile potrzeba na przechowywanie wszystkich pól jednocześnie. Twierdzenie, że unia nie jest wspierana przez nowoczesne kompilatory, jest błędne – unie są integralną częścią standardu C i są szeroko wspierane we współczesnych środowiskach programistycznych.

Pytanie 11

Z analizy złożoności obliczeniowej różnych algorytmów sortowania na dużych zbiorach danych (przekraczających 100 elementów) wynika, że najefektywniejszą metodą jest algorytm sortowania

sortowanie bąbelkoweO(n²)
sortowanie przez wstawianieO(n²)
sortowanie przez scalanieO(n log n)
sortowanie przez zliczanieO(n)
sortowanie kubełkoweO(n²)
A. kubełkowego
B. bąbelkowego
C. przez scalanie
D. przez zliczanie
Sortowanie bąbelkowe, mimo że jest łatwe do zrozumienia i zaimplementowania, ma złożoność czasową O(n²), co czyni je nieefektywnym dla dużych zbiorów danych, takich jak ponad 100 elementów. Działa poprzez wielokrotne przechodzenie przez listę, porównując sąsiednie elementy i zamieniając je miejscami, jeśli są w niewłaściwej kolejności. To powoduje, że algorytm ten staje się wolny przy większej ilości danych. Sortowanie przez scalanie, choć bardziej wydajne niż bąbelkowe, z złożonością O(n log n), nadal nie dorównuje szybkością sortowaniu przez zliczanie w specyficznych warunkach, gdzie zakres wartości jest ograniczony. Jest to metoda rekurencyjna, która dzieli listę na mniejsze części, sortuje je, a następnie scala w jedną posortowaną listę. Natomiast sortowanie kubełkowe, podobnie jak przez zliczanie, korzysta z dodatkowych struktur danych, lecz jego efektywność zależy od tego, jak elementy są równomiernie rozmieszczone w kubełkach, co może prowadzić do złożoności O(n²) w przypadku złej dystrybucji. Typowe błędy myślowe polegają na przecenianiu prostoty implementacji ponad złożoność czasową, a także niedocenianiu specyfiki danych wejściowych, co jest kluczowe dla wyboru odpowiedniego algorytmu sortującego. Przy rozważaniu wyboru algorytmu należy zawsze brać pod uwagę zarówno jego złożoność, jak i charakterystykę danych, jakie będą przetwarzane, co jest podstawą dobrych praktyk inżynierii oprogramowania.

Pytanie 12

Co to jest event bubbling w JavaScript?

A. Technika optymalizacji wydajności zdarzeń na stronie
B. Proces, w którym zdarzenie zaczyna się od najbardziej szczegółowego elementu i propaguje w górę hierarchii DOM
C. System powiadomień o błędach w konsoli JavaScript
D. Metoda zarządzania kolejką zdarzeń w aplikacjach asynchronicznych
Event bubbling to kluczowy mechanizm w modelu zdarzeń JavaScript, który polega na tym, że gdy zdarzenie zostaje wywołane na danym elemencie DOM, propaguje się ono w górę hierarchii DOM, zaczynając od najniższego elementu (czyli elementu, który bezpośrednio wywołuje zdarzenie) i kierując się ku elementom nadrzędnym. To podejście umożliwia efektywne zarządzanie zdarzeniami, gdyż pozwala na przypisanie pojedynczej funkcji obsługi zdarzeń do elementu nadrzędnego, zamiast do każdego z podrzędnych elementów. Na przykład, jeśli mamy listę elementów <li> w <ul>, możemy ustawić jeden nasłuchiwacz zdarzeń na <ul>, co pozwoli na przechwytywanie kliknięć na wszystkich <li>, wykorzystując obiekt Event do określenia, który element został kliknięty. W praktyce, event bubbling przyczynia się do zmniejszenia liczby nasłuchiwaczy zdarzeń i optymalizacji wydajności aplikacji webowych, a także ułatwia organizację kodu. Warto również pamiętać o metodzie stopPropagation(), która może być używana, aby zatrzymać propagację zdarzenia, gdy zajdzie taka potrzeba. Zrozumienie event bubbling jest istotne w kontekście standardów W3C, które definiują zasady dla przetwarzania zdarzeń.

Pytanie 13

Jaki numer telefonu należy wybrać, aby skontaktować się z pogotowiem ratunkowym w Polsce?

A. 997
B. 112
C. 113
D. 998
Numer 112 to tzw. europejski numer alarmowy, który działa nie tylko w Polsce, ale i w całej Unii Europejskiej oraz kilku innych krajach. Z mojego doświadczenia wynika, że warto nawykowo korzystać właśnie z tego numeru, bo jest on uniwersalny i obsługiwany przez wszystkie sieci – zarówno stacjonarne, jak i komórkowe. W praktyce, dzwoniąc pod 112, łączymy się z centralą, która przekieruje nas do odpowiednich służb (pogotowie ratunkowe, policja, straż pożarna), w zależności od sytuacji. To ogromne ułatwienie, szczególnie gdy jesteśmy zestresowani albo w nieznanym miejscu. Moim zdaniem to też ważny aspekt, że osoby z zagranicy mogą łatwo uzyskać pomoc, bo 112 jest rozpoznawalny praktycznie wszędzie w Europie. Zgodnie z przepisami unijnymi, ten numer powinien być promowany jako podstawowy do wzywania pomocy w nagłych przypadkach – stąd jego obecność nawet na automatach telefonicznych czy instrukcjach bezpieczeństwa w zakładach pracy, szkołach, komunikacji miejskiej. Dodatkowo, jeśli nie wiemy, którą dokładnie służbę wezwać, operator 112 pomoże nam to ustalić i połączy z odpowiednim dyspozytorem. Osobiście uważam, że zapamiętanie tego numeru to podstawa, bo można uratować komuś życie – nawet przez przypadek, będąc świadkiem jakiegoś wypadku czy innego zdarzenia. Warto pamiętać, że 112 działa również, gdy telefon nie ma karty SIM (chociaż nie wszędzie to się sprawdza w praktyce, to z mojego rozeznania wynika, że w Polsce powinno zadziałać).

Pytanie 14

W jakiej okoliczności należy umieścić poszkodowanego w pozycji bezpiecznej?

A. Gdy poszkodowany cierpi na krwotok zewnętrzny
B. Gdy poszkodowany jest świadomy, lecz ma uraz kończyny
C. Gdy poszkodowany nie oddycha
D. Gdy poszkodowany jest nieprzytomny, ale oddycha
Pozycja bezpieczna (czyli pozycja boczna ustalona) to jedno z kluczowych narzędzi w udzielaniu pierwszej pomocy. Stosuje się ją wtedy, gdy poszkodowany jest nieprzytomny, ale oddycha samodzielnie i nie ma podejrzenia urazu kręgosłupa. Chodzi przede wszystkim o zabezpieczenie dróg oddechowych przed ewentualnym zadławieniem np. przez ślinę, krew czy wymiociny. Niby proste, ale w praktyce często ludzie mają wątpliwości, czy powinni ruszać nieprzytomną osobę. Ja sam widziałem jak ktoś bał się tego zrobić, bo nie był pewny, czy to bezpieczne. Moim zdaniem lepiej tu działać niż zwlekać – oczywiście, jeśli nie podejrzewasz złamania kręgosłupa. Ważne jest, by pozycję bezpieczną stosować dopiero po sprawdzeniu oddechu – to naprawdę podstawa i tak uczą na wszystkich szkoleniach BLS według standardów Europejskiej Rady Resuscytacji. Przykład z życia: ktoś zasłabł na przystanku, jest nieprzytomny, ale oddycha. Przekręcasz go na bok, głowa odchylona, żeby język nie zablokował gardła – i masz spokój, dużo zmniejszone ryzyko uduszenia. Warto też pamiętać, że trzeba regularnie monitorować stan poszkodowanego, bo sytuacja może się pogorszyć, wtedy przechodzisz do resuscytacji. Pozycja bezpieczna to taki złoty środek kiedy nie musisz jeszcze reanimować, ale musisz chronić życie przez zabezpieczenie oddechu.

Pytanie 15

Która technologia służy do tworzenia responsywnych stron internetowych?

A. Media Queries w CSS
B. Local Storage
C. WebSockets
D. REST API
Media Queries w CSS to technika, która pozwala na tworzenie responsywnych stron internetowych poprzez dostosowywanie stylów do różnych rozmiarów ekranów i urządzeń. Dzięki zastosowaniu reguł media queries, projektanci mogą definiować, jak elementy na stronie mają się zachowywać w zależności od szerokości ekranu, orientacji urządzenia czy jego rozdzielczości. Na przykład, można ustawić większe marginesy na dużych ekranach desktopowych, a na mniejszych urządzeniach mobilnych zredukować je, aby lepiej wykorzystać ograniczoną przestrzeń. Stosując media queries, można również zmieniać rozmiary czcionek, układ kolumn czy widoczność niektórych elementów, co jest kluczowe dla optymalizacji użytkowania na różnych platformach. Jest to częścią podejścia mobile-first, które stało się standardem w nowoczesnym web designie. Warto również zaznaczyć, że korzystanie z media queries wspiera dostępność i użyteczność stron internetowych, co jest zgodne z dobrymi praktykami branżowymi.

Pytanie 16

W jakim celu wykorzystuje się diagram Gantta?

A. do wizualizacji powiązań między elementami systemów
B. do dokładnej analizy czasowo-kosztowej projektu
C. do planowania i zarządzania projektem
D. do przedstawiania funkcjonalności systemu
Diagram Gantta to jeden z podstawowych i – moim zdaniem – najfajniejszych narzędzi używanych w zarządzaniu projektami, zwłaszcza w budowlance, IT czy produkcji. Jest bardzo praktyczny, bo pozwala wizualnie rozplanować, jakie zadania są do wykonania, ile mają trwać i co od czego zależy. Dzięki prostemu układowi poziomych pasków na osi czasu można szybko ogarnąć całość projektu, zobaczyć które zadania się pokrywają i gdzie mogą być wąskie gardła. Branżowe standardy, np. PMBOK, zalecają korzystanie z diagramu Gantta właśnie do planowania i monitorowania postępu. Z mojego doświadczenia to narzędzie, które łączy ludzi – wszyscy od razu widzą, kto co robi i na kiedy. Fajne jest też to, że łatwo aktualizować taki diagram w miarę zmian w projekcie. Diagram Gantta pomaga też w kontroli terminowości i identyfikacji opóźnień. Jeśli ktoś kiedyś miał styczność z programami jak MS Project czy nawet prostym Excelem – na pewno widział taki wykres. Można tam nawet dodać kamienie milowe czy zależności między zadaniami (np. jedno musi się skończyć, zanim drugie się zacznie). Tak naprawdę, w profesjonalnych firmach, zarządzanie projektem bez takiego narzędzia byłoby trochę strzałem w stopę.

Pytanie 17

Które z wymienionych zastosowań najlepiej definiuje bibliotekę jQuery?

A. Tworzenie interfejsów w programach desktopowych
B. Budowanie aplikacji mobilnych
C. Projektowanie struktur baz danych
D. Ułatwienie manipulacji DOM oraz obsługi zdarzeń w JavaScript
jQuery to popularna biblioteka JavaScript, która ułatwia manipulację DOM (Document Object Model), obsługę zdarzeń oraz wykonywanie animacji na stronach internetowych. Dzięki jQuery programiści mogą znacznie skrócić ilość kodu potrzebnego do realizacji operacji na elementach HTML. Biblioteka ta zapewnia również wygodny sposób na wykonywanie asynchronicznych żądań HTTP (AJAX), co pozwala na dynamiczne pobieranie danych z serwera bez konieczności przeładowywania całej strony. jQuery jest szeroko stosowane w projektach, które wymagają interaktywności oraz lekkich efektów wizualnych. Choć w ostatnich latach jego popularność spadła na rzecz bardziej zaawansowanych frameworków takich jak React czy Angular, jQuery nadal jest cenione za prostotę, wydajność oraz bogaty ekosystem gotowych wtyczek i rozszerzeń.

Pytanie 18

Który z wymienionych typów testów najlepiej ocenia odporność aplikacji na intensywne obciążenie?

A. Testy obciążeniowe
B. Testy funkcjonalne
C. Testy bezpieczeństwa
D. Testy zgodności
Testy obciążeniowe to rodzaj testów, które sprawdzają, jak aplikacja radzi sobie z dużym ruchem użytkowników lub przetwarzaniem dużych ilości danych. Celem testów obciążeniowych jest wykrycie potencjalnych wąskich gardeł, identyfikacja problemów z wydajnością oraz określenie maksymalnej przepustowości aplikacji. Testy te są kluczowe dla aplikacji o wysokim natężeniu ruchu, takich jak sklepy internetowe czy systemy bankowe, gdzie stabilność pod obciążeniem jest krytyczna dla sukcesu.

Pytanie 19

Który z wymienionych poniżej wzorców projektowych można zakwalifikować jako wzorzec strukturalny?

A. Fasada (Facade)
B. Obserwator (Observer)
C. Metoda szablonowa (Template method)
D. Fabryka abstrakcyjna (Abstract Factory)
Metoda Szablonowa (Template Method) to wzorzec behawioralny, który definiuje sposób realizacji algorytmu. Fabryka Abstrakcyjna (Abstract Factory) to wzorzec kreacyjny, który koncentruje się na tworzeniu obiektów bez określania ich konkretnych klas. Wzorzec Obserwator (Observer) to wzorzec behawioralny, który umożliwia powiadamianie obiektów o zmianach stanu innego obiektu, co jest kluczowe w implementacji reaktywnych systemów, ale nie jest przykładem wzorca strukturalnego.

Pytanie 20

Jaką wartość zwróci funkcja napisana w języku C++, jeżeli jej argumentem wejściowym jest tablica stworzona w następujący sposób:

int tablica[6] = {3,4,2,4,10,0};

int fun1(int tab[]) {
    int wynik = 0;

    for(int i = 0; i < 6; i++)
        wynik += tab[i];
    return wynik;
}
A. 20
B. 0
C. 10
D. 23
W tego typu zadaniach bardzo łatwo popełnić błąd w ocenie działania pętli oraz sumowania wartości w tablicy. Często pojawia się przekonanie, że funkcja może zwracać zero, bo ostatni element tablicy to 0 – ale trzeba pamiętać, że funkcja sumuje wszystkie elementy i zero po prostu nie wpływa na całą sumę, więc wynik się nie wyzeruje. Bywa też, że sugerujemy się pierwszą liczbą z tablicy albo jakąś wyróżniającą się, na przykład 10, myśląc, że to ona jest odpowiedzią – ale to nie ma uzasadnienia w kodzie. W pętli for wyraźnie jest napisane i < 6, czyli przeglądamy sześć elementów. Każdy z nich jest dodawany do zmiennej wynik. Kod nie ma żadnych warunków ani instrukcji przerwania, więc nie można zatrzymać się „na” jakiejś wartości, ani zignorować jakiejkolwiek liczby. Niektóre osoby mogą też popełnić błąd i dodać tylko część elementów albo pomylić kolejność, przez co suma wychodzi 10, 20 lub inna, ale przy mechanicznej analizie kodu to niemożliwe. Odpowiedź 20 pojawia się czasem, kiedy ktoś przez przypadek nie zliczy ostatniego zera, a z kolei 10 to typowy skrót myślowy – może wynikający z szybkiego rzutu oka na największą liczbę w tablicy, jednak suma elementów to nie to samo, co ich maksimum. Z mojego doświadczenia wynika, że bardzo wielu uczniów nie przywiązuje wagi do sumowania wszystkich elementów, zwłaszcza jak pojawia się zero – a przecież matematyka jest tu bezlitosna. W programowaniu sumujesz wszystko jak leci, jeśli nie ma warunku czy filtru. Takie drobne nawyki, jak dokładne śledzenie każdej iteracji pętli, potem procentują podczas bardziej złożonych zadań na egzaminach czy w prawdziwych projektach. Pamiętaj: jeśli kod nie sprawdza warunków, to wykonuje dokładnie to, co jest napisane – nic mniej, nic więcej. Warto się tego trzymać.

Pytanie 21

Która technologia jest używana do tworzenia animacji na stronach internetowych?

A. XML Schema
B. CSS Animations
C. HTTP Headers
D. SQL Queries
CSS Animations to technologia, która umożliwia tworzenie zaawansowanych efektów animacyjnych na stronach internetowych, bez konieczności użycia JavaScriptu. Dzięki CSS Animations, projektanci mogą definiować kluczowe klatki (keyframes), które określają stany stylów w określonym czasie. Przykładem praktycznego zastosowania może być animacja przycisku, który zmienia kolor i rozmiar po najechaniu na niego myszką. Tego rodzaju animacje są wspierane przez wszystkie nowoczesne przeglądarki i są zgodne z W3C, co czyni je standardem w branży. Dobrze zaprojektowane animacje poprawiają doświadczenia użytkowników, ułatwiając im interakcję z elementami strony. Warto również wspomnieć, że użycie CSS do animacji jest bardziej efektywne pod względem wydajności, ponieważ procesor graficzny (GPU) może lepiej obsługiwać animacje niż tradycyjne metody, takie jak JavaScript. W kontekście projektowania responsywnego, CSS Animations pozwala na płynniejsze i bardziej estetyczne przejścia między różnymi stanami interfejsu, co jest kluczowe dla utrzymania zaangażowania użytkowników.

Pytanie 22

Przedstawione w filmie działania wykorzystują narzędzie

A. kompilatora dla interfejsu graficznego
B. generatora kodu java
C. debuggera analizującego wykonujący kod
D. generatora GUI przekształcającego kod do języka XAML
Patrząc na wszystkie dostępne opcje, łatwo się pomylić, bo terminologia może być trochę podchwytliwa. Debugger analizujący wykonujący kod rzeczywiście jest kluczowym narzędziem w pracy programisty, ale jego zadaniem jest szukanie błędów i obserwowanie działania programu w czasie rzeczywistym, a nie generowanie kodu czy interfejsów. Myślę, że sporo osób utożsamia narzędzia developerskie z debuggerem, bo to jedno z najczęściej używanych rozwiązań – jednak tutaj akurat nie ma on nic wspólnego z przekształcaniem kodu do XAML-a. Generator kodu Java brzmi sensownie, jeśli ktoś pracuje więcej w środowiskach Javy, ale w tym przypadku mówimy o ekosystemie .NET i XAML-u, a Java ma zupełnie inne formaty i narzędzia (np. FXML dla JavaFX, ale to zupełnie inna bajka). Generator GUI przekształcający kod do języka XAML to narzędzie dedykowane platformie Microsoftu, bo XAML funkcjonuje właśnie w tych technologiach. Ostatnia odpowiedź, czyli kompilator dla interfejsu graficznego, to trochę pomieszanie pojęć – kompilator rzeczywiście tłumaczy kod na wykonywalny plik (np. EXE), ale nie jest narzędziem służącym do generowania czy przekształcania opisów interfejsów graficznych. Sporo osób może mieć tendencję do mylenia generatorów z kompilatorami, bo oba „tworzą coś automatycznie”, ale ich przeznaczenie jest zupełnie inne. Moim zdaniem najważniejsze to rozumieć, że generatory GUI ułatwiają życie, pozwalając szybko przenieść projekt interfejsu do kodu XAML, a reszta narzędzi ma zupełnie inne zadania. To rozróżnienie jest naprawdę kluczowe w branży.

Pytanie 23

Które urządzenie komputerowe jest najbardziej odpowiednie do graficznego projektowania w aplikacjach CAD?

A. Laptop z interfejsem dotykowym
B. Laptop z zintegrowanym układem graficznym
C. Serwer dysponujący dużą ilością pamięci RAM
D. Komputer stacjonarny z kartą graficzną NVIDIA Quadro
W kontekście projektowania graficznego w programach typu CAD, kluczowym elementem jest wybór odpowiedniego sprzętu, który zapewni nie tylko stabilność, ale także wydajność. Komputer stacjonarny wyposażony w kartę graficzną NVIDIA Quadro jest najlepszym rozwiązaniem, ponieważ te karty są specjalnie zaprojektowane do obsługi złożonych obliczeń i renderowania grafiki 3D. Dzięki zaawansowanej architekturze oraz optymalizacji pod kątem aplikacji inżynieryjnych i projektowych, karty NVIDIA Quadro oferują znacznie wyższą wydajność w porównaniu do standardowych kart graficznych. Dodatkowo, stacjonarne komputery pozwalają na łatwiejszą rozbudowę, co może być kluczowe w przypadku rosnących wymagań projektowych. W praktyce, użytkownicy CAD często muszą radzić sobie z dużymi i złożonymi modelami, które wymagają nie tylko odpowiedniej mocy obliczeniowej, ale także dużej ilości pamięci wideo, co zapewnia NVIDIA Quadro. Warto dodać, że standardy branżowe, takie jak OpenGL i DirectX, są w pełni wspierane przez te karty, co przekłada się na ich niezawodność i efektywność w profesjonalnym środowisku projektowym.

Pytanie 24

Jakie są kluczowe korzyści z wykorzystania frameworków podczas programowania aplikacji desktopowych?

A. Redukują zapotrzebowanie na pamięć operacyjną aplikacji
B. Gwarantują dostęp do niskopoziomowego kodu systemowego
C. Ułatwiają kontrolę nad wersjami systemu operacyjnego
D. Skracają czas tworzenia aplikacji dzięki gotowym komponentom i narzędziom
Zapewnienie dostępu do niskopoziomowego kodu systemowego jest cechą bibliotek i narzędzi takich jak C lub C++, ale frameworki zwykle dostarczają abstrakcję nad systemem, co upraszcza proces programowania. Zarządzanie wersjami systemu operacyjnego to zadanie narzędzi do wirtualizacji i zarządzania środowiskami, a nie cecha frameworków. Minimalizacja zapotrzebowania na pamięć operacyjną to efekt optymalizacji kodu i wydajnego programowania, ale nie jest to główny cel frameworków, które skupiają się na dostarczaniu narzędzi do szybszego tworzenia aplikacji.

Pytanie 25

Diagramem, który służy do śledzenia realizacji zadań przez członków zespołu projektowego, może być

A. związków encji
B. Venna
C. Gantta
D. aktywnosci UML
Wydaje się, że niektóre z tych diagramów brzmią technicznie znajomo, ale niestety nie są właściwym wyborem, jeśli chodzi o monitorowanie realizacji zadań przez członków zespołu projektowego. Diagram Venna, choć rzeczywiście przydatny do ukazywania części wspólnych i relacji między zbiorami, raczej nie nadaje się do śledzenia postępu prac czy rozkładu zadań w projekcie. To narzędzie typowo matematyczne, można go spotkać w analizie danych czy prezentowaniu wspólnych cech, ale nie w harmonogramowaniu projektów. Diagram związków encji kojarzy się mocno z bazami danych, bo służy do wizualizacji relacji między encjami w systemach informatycznych. Tego typu diagramy są świetne przy projektowaniu struktur danych, ale zupełnie nie pokazują kto, kiedy i co ma zrobić – czyli nie odpowiadają na potrzeby zarządzania zespołem projektowym. Z kolei diagram aktywności UML, używany do opisu przepływu pracy czy procesów w systemach informatycznych, pozwala zobrazować, jak dane czynności następują po sobie i jakie warunki muszą być spełnione, by przejść do kolejnych etapów. To jednak nadal nie jest narzędzie, które pozwala na efektywne śledzenie postępu zadań przypisanych konkretnym osobom oraz zarządzanie realizacją elementów projektu w czasie. Częstym błędem jest mylenie narzędzi do modelowania procesów z narzędziami do zarządzania projektem – to, że diagram coś dobrze pokazuje, nie znaczy jeszcze, że jest uniwersalny. Moim zdaniem kluczem jest tu rozumienie, że w zarządzaniu projektami liczy się nie tylko wizualizacja procesu, ale też kontrola czasu, odpowiedzialności i zależności między zadaniami, co właśnie zapewnia dobrze zrobiony diagram Gantta.

Pytanie 26

Zaprezentowany fragment kodu w języku C# tworzy hasło. Wskaż zdanie PRAWDZIWE dotyczące charakterystyki tego hasła:

var random = new Random();
string pulaZnakow = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";

int dlPuli = pulaZnakow.Length - 1;
char znak;
string wynik = "";

for(int i = 0; i < 8; i++)  {
    znak = pulaZnakow[random.Next(0, dlPuli)];
    wynik += znak;
}
A. Może zawierać zarówno małe, jak i wielkie litery, cyfry oraz symbole
B. Może zawierać małe i wielkie litery oraz cyfry
C. Ma co najmniej 8 znaków oraz zawiera małe i wielkie litery oraz cyfry
D. Jest maksymalnie 7-znakowe, co wynika z wartości zmiennej i
Patrząc na pozostałe odpowiedzi, nietrudno zauważyć typowe pomyłki, które pojawiają się przy analizie kodu generującego hasła. Często spotykam się z błędnym założeniem, że jeśli mamy losowy wybór ze znacznej puli znaków, to automatycznie generowane hasło może zawierać symbole czy inne znaki specjalne. W tym przypadku pulaZnakow wyraźnie ogranicza się tylko do liter – małych i wielkich – oraz cyfr, stąd nie ma możliwości, by pojawił się jakikolwiek symbol, co już obala pierwszą odpowiedź. Następna rzecz – twierdzenie, że hasło ma co najmniej 8 znaków – jest nieścisłe: kod ustawia pętlę for na osiem powtórzeń, więc hasło będzie miało zawsze dokładnie 8 znaków, ani więcej, ani mniej (chyba że ręcznie zmodyfikujemy kod), więc nie jest to 'co najmniej'. Sformułowanie o długości „maksymalnie 7-znakowej” wynika najpewniej z nieuważnego czytania zakresu powtórzeń pętli: for (int i = 0; i < 8; i++) oznacza 8 iteracji, czyli 8 znaków, a nie 7. Często w praktyce ludzie gubią się w liczeniu zakresów, bo zaczynają od zera, ale liczba iteracji jest tu bezpośrednio związana z warunkiem i<wartość>. To są pomyłki, które łatwo popełnić, gdy nie czyta się kodu bardzo uważnie albo nie ćwiczyło się podobnych przypadków na własnych przykładach. Wreszcie, niektóre odpowiedzi próbują dodać jakieś cechy hasła (np. obecność symboli), których w kodzie po prostu nie ma, bo pulaZnakow na to nie pozwala. W branży bezpieczeństwa takie detale są bardzo istotne i weryfikacja puli znaków to pierwszy krok przy analizie generatorów haseł. Zawsze warto szczegółowo patrzeć, co faktycznie znajduje się w zmiennej określającej dostępne znaki, a nie zakładać, że kod jest bardziej zaawansowany, niż jest w rzeczywistości.

Pytanie 27

Jaką złożoność obliczeniową posiada podany algorytm?
Dane:
Tablica: tab[n]
Index: i = 0, 1, ..., n-1
x: szukana

Algorytm:

// K1: i0
// K2: dopóki i < (n - 1)
    // K3: jeżeli tab[i] = x to wypisz i
    // K4: ii + 1
    // K5: idź do K2
// K6: zakończ
A. O(1)
B. O(n log n)
C. O(n)
D. O(n2)
W kontekście złożoności obliczeniowej łatwo wpaść w pułapkę myślenia, że algorytm wydaje się bardziej złożony, niż jest w rzeczywistości. Przykładowo, wybór O(n log n) sugeruje obecność jakiegoś sortowania lub podziału danych, co zupełnie nie występuje w tym rozwiązaniu – tu nie ma rekurencji, dzielenia na podtablice ani żadnych bardziej skomplikowanych operacji. Złożoność O(n^2) typowa jest dla algorytmów, gdzie mamy zagnieżdżone pętle, czyli każda iteracja głównej pętli wyzwala kolejną pełną pętlę po danych – a tutaj pętla jest tylko jedna i przechodzi przez tablicę jeden raz. Bardzo często myli się to z sortowaniem bąbelkowym czy selekcyjnym, gdzie rzeczywiście występuje kwadratowa złożoność, ale nie w prostym przeszukiwaniu liniowym. Z kolei O(1), czyli czas stały, dotyczy tylko takich algorytmów, gdzie liczba operacji nie zależy od wielkości wejścia – na przykład odczytanie elementu z tablicy po znanym indeksie. Tu jednak liczba kroków wzrasta liniowo wraz z n, czyli liczbą elementów, więc niestety nie jest to czas stały. Moim zdaniem, wiele osób błędnie utożsamia prostotę kodu z czasem stałym, ale w rzeczywistości chodzi o to, jak algorytm zachowuje się, gdy ilość danych znacząco rośnie. W tej sytuacji odpowiednia analiza pętli i sposobu przetwarzania danych pozwala szybko zauważyć, że algorytm ten to klasyczne O(n), zgodne z najprostszymi wzorcami algorytmicznymi spotykanymi w praktyce.

Pytanie 28

W programowaniu obiektowym odpowiednikami zmiennych oraz funkcji w programowaniu strukturalnym są

A. hermetyzacja oraz dziedziczenie
B. metody statyczne i abstrakcyjne
C. pola i metody
D. pola i kwalifikatory dostępu
Pola i metody to absolutna podstawa, jeśli chodzi o programowanie obiektowe. Właśnie one są najbliższym odpowiednikiem zmiennych i funkcji z podejścia strukturalnego. Moim zdaniem, gdy uczysz się OOP, warto od razu wyłapać tę analogię – pola (czyli inaczej: atrybuty, właściwości, fields) przechowują stan obiektu, a metody (czyli funkcje w klasie) definiują, co obiekt potrafi zrobić. Przykład z życia: klasa Samochód ma pole kolor, które opisuje jego cechę oraz metodę jedź(), która realizuje jakąś akcję. W praktyce programiści bardzo często modelują swoje klasy tak, aby pola były prywatne (zgodnie z zasadą hermetyzacji), a dostęp do nich zapewniały metody publiczne – tzw. gettery i settery. Standardy branżowe, np. JavaBeans w Javie czy konwencje C#, też polegają na tym, że pola odzwierciedlają dane, a metody operacje na tych danych. Z mojego doświadczenia wynika, że rozumienie tej relacji ułatwia zarówno pisanie czytelnego kodu, jak i jego dalsze rozwijanie. To właśnie dzięki rozdzieleniu na pola i metody klasy mogą odwzorowywać obiekty z realnego świata i ich zachowania, co jest głównym celem programowania obiektowego.

Pytanie 29

Jednym z elementów, które mają zostać zaimplementowane w aplikacji, jest możliwość cofnięcia ostatnich działań do 20 operacji wstecz (undo). Struktura danych, która jest odpowiednia do tego celu i pozwala na dostęp tylko do ostatnio dodanego elementu, to:

A. kolejka
B. drzewo
C. stos
D. tablica
Kolejka to struktura danych działająca na zasadzie FIFO (First In, First Out), co oznacza, że pierwszy dodany element jest pierwszym, który zostaje usunięty. Tego rodzaju organizacja danych nie nadaje się do implementacji funkcji cofania, ponieważ nie umożliwia łatwego dostępu do ostatnich operacji. W kontekście aplikacji umożliwiającej cofnięcie działań, kolejka nie zaspokaja potrzeb użytkownika, gdyż nie pozwala na usunięcie najnowszej operacji. Drzewo, jako bardziej złożona struktura, jest używane głównie do organizacji danych w hierarchicznej formie. Chociaż drzewa mogą być skuteczne w wyszukiwaniu i porządkowaniu danych, nie są odpowiednie do realizacji funkcji cofania ostatnich operacji, ponieważ nie oferują prostego dostępu do ostatnio dodanych elementów. Wreszcie, tablica jest statyczną strukturą danych, która przechowuje elementy w sekwencyjnej kolejności. Mimo że można by używać tablicy do przechowywania operacji, ich ograniczenia dotyczące rozmiaru i elastyczności sprawiają, że są mniej efektywne w porównaniu do stosu w kontekście cofania operacji. W związku z tym, ani kolejka, ani drzewo, ani tablica nie są odpowiednimi wyborami dla funkcjonalności cofania w aplikacji, co czyni stos jedynym logicznym rozwiązaniem.

Pytanie 30

Co to jest JWT (JSON Web Token)?

A. Biblioteka JavaScript do manipulacji danymi JSON
B. Otwarty standard do bezpiecznego przekazywania informacji między stronami jako obiekt JSON
C. Protokół komunikacji między frontendem a backendem
D. Format przechowywania danych w bazach NoSQL
Chociaż odpowiedzi sugerują alternatywne podejścia do zarządzania danymi w aplikacjach, to nie są one związane z funkcjonalnością JWT. Stwierdzenie, że JWT to biblioteka JavaScript do manipulacji danymi JSON, jest błędne, ponieważ JWT nie jest technologią programistyczną, lecz protokołem komunikacyjnym opartym na standardzie JSON. Istnieją biblioteki JavaScript, które mogą być używane do generowania i weryfikowania JWT, jednak sama technologia nie jest związaną z manipulacją danymi. Ponadto, błędne jest również postrzeganie JWT jako formatu przechowywania danych w bazach NoSQL. JWT nie służy do przechowywania danych, ale do ich przekazywania w formie tokenów, które mogą być interpretowane przez różne systemy. W końcu, opisanie JWT jako protokołu komunikacji między frontendem a backendem jest nieprecyzyjne. JWT jest narzędziem do autoryzacji i nie definiuje samego protokołu komunikacyjnego, a jedynie sposób na przesyłanie informacji w formie tokenów. Kluczowym błędem myślowym jest mylenie struktury tokenów z mechanizmami komunikacji – JWT działa jako środek autoryzacji, a nie jako protokół komunikacyjny. Zrozumienie tej różnicy jest istotne dla prawidłowego wykorzystania JWT w aplikacjach webowych.

Pytanie 31

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. int
C. double
D. number
Intuicyjnie można by pomyśleć, że każda zmienna liczbową da się zadeklarować przez int, bo przecież to najprostszy i najpopularniejszy typ w języku C++. Jednak int przechowuje wyłącznie liczby całkowite – nie pozwala na zapis ułamków czy wartości dziesiętnych. To bardzo częsty błąd początkujących programistów, którzy próbują przechować 7.5 w int i są zaskoczeni, że wynik zawsze jest zaokrąglany w dół. Równie problematyczne są próby użycia typów, które wyglądają na sensowne, ale w rzeczywistości nie istnieją w C++. Przykłady to number i numeric – brzmią profesjonalnie, można je spotkać w innych językach (np. number w JavaScript), ale C++ nie przewiduje takich deklaracji. Kompilator po prostu zgłosi błąd i nie skompiluje programu. Z mojego doświadczenia, wielu uczniów daje się nabrać na te angielskie słówka, bo wydają się logiczne. Tymczasem C++ ma ścisłe zasady i ogranicza się do konkretnych typów jak int, float, double czy long double. Jeśli chodzi o double, to jest to oficjalnie wspierany przez standard ISO typ do zmiennych rzeczywistych, stosowany wszędzie tam, gdzie float nie daje wystarczającej precyzji. Warto też zauważyć, że korzystanie z nieistniejących typów prowadzi do błędów kompilacji, co jest nie tylko stratą czasu, ale i może utrudnić dalszą naukę programowania, bo utrwala złe nawyki. Podsumowując, jeśli chcesz przechowywać liczby rzeczywiste w C++, musisz użyć double lub ewentualnie float, a nie int, number czy numeric – te ostatnie po prostu w tym języku nie działają.

Pytanie 32

Jakie funkcje realizuje polecenie "git clone"?

A. Rejestruje zmiany w historii repozytorium
B. Tworzy lokalną kopię już istniejącego repozytorium
C. Łączy dwa branche w repozytorium
D. Usuwa zdalne repozytorium
Polecenie "git clone" to w zasadzie jedna z pierwszych rzeczy, które poznaje się na początku pracy z Gitem. Służy ono do skopiowania całego istniejącego repozytorium – czyli pobiera zarówno wszystkie pliki, jak i całą historię commitów. To jest ogromnie przydatne, bo nie tylko masz najnowszy kod, ale od razu całą historię zmian, branche, tagi i inne rzeczy. Standardowo używa się tego polecenia, kiedy chcesz zacząć pracę nad projektem, który jest już na jakimś zdalnym serwerze (np. Githubie albo GitLabie). W praktyce wygląda to tak, że podajesz adres repozytorium, wpisujesz "git clone https://adres.repo.git" i po kilku chwilach masz pełną kopię projektu u siebie na dysku. Co ciekawe, narzędzie od razu ustawia Ci zdalne połączenie do pierwotnego repozytorium jako "origin", więc potem możesz spokojnie wykonywać polecenia typu git fetch, git pull czy git push. Moim zdaniem to super wygodne, bo cała struktura repozytorium, nawet z podfolderami czy nietypowymi ustawieniami, zostaje zachowana. Warto pamiętać, że git clone to nie tylko kopiowanie plików – to pobieranie całej bazy danych Git, więc masz możliwość cofania się w historii czy przeglądania wszystkich commitów lokalnie i offline. Z mojego doświadczenia: często nowi użytkownicy nie doceniają jeszcze, jak ważne jest to, żeby zawsze pracować na pełnej kopii, a nie wycinku repo. To podstawa bezpiecznej i efektywnej pracy zespołowej.

Pytanie 33

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

A. RAD funkcjonuje tylko w systemach operacyjnych Linux
B. RAD nie oferuje żadnych narzędzi do debugowania
C. RAD koncentruje się tylko na testowaniu programów
D. RAD pozwala na szybkie tworzenie prototypów i rozwijanie aplikacji przy minimalnej ilości kodu
Twierdzenie, że RAD skupia się wyłącznie na testowaniu kodu, jest błędne – jego głównym celem jest szybkie tworzenie aplikacji, a nie jedynie testowanie. Brak narzędzi do debugowania to również nieprawdziwa informacja, ponieważ narzędzia RAD oferują pełne wsparcie dla debugowania i testowania aplikacji w trakcie ich rozwoju. Stwierdzenie, że RAD działa tylko na systemach operacyjnych typu Linux, jest niezgodne z rzeczywistością – narzędzia RAD działają zarówno na Windows, macOS, jak i Linux, co czyni je uniwersalnym rozwiązaniem dla szerokiej gamy deweloperów.

Pytanie 34

Jedną z zasad standardu WCAG 2.0 jest

A. stosowanie różnych palet kolorystycznych, w tym o wysokim kontraście
B. używanie jednego, odpowiednio dużego rozmiaru czcionki
C. unikanie przedstawiania informacji w formie uproszczonej
D. ograniczanie treści na stronie przez rezygnację z używania alternatywnych tekstów dla obrazów i filmów
Stosowanie różnych palet kolorystycznych, zwłaszcza takich z wysokim kontrastem, to naprawdę kluczowa sprawa w dostępności cyfrowej. Tak mówi standard WCAG 2.0, dokładniej zasada 1 – Postrzegalność. Chodzi tu głównie o kryterium sukcesu 1.4.3 (Kontrast – minimum), które wyraźnie określa, że tekst i treść graficzna muszą być czytelne dla osób z różnymi potrzebami, np. słabszym wzrokiem albo daltonizmem. Moim zdaniem warto sobie uświadomić, jak wielka to różnica. Przykładowo, jeśli tekst na stronie jest szary na białym tle, osoby starsze lub z wadami wzroku mogą po prostu nie być w stanie nic przeczytać. W praktyce, wysokokontrastowe kombinacje, np. biały tekst na czarnym tle lub na żółtym, bardzo poprawiają dostępność strony. Widać to choćby w trybach "high contrast" w systemach Windows – często osoby pracujące długo przy komputerze z tego korzystają, bo wzrok się mniej męczy. Branżowe dobre praktyki zalecają również nie polegać wyłącznie na kolorze podczas przekazywania informacji – przykładowo, jeśli błąd w formularzu jest oznaczony tylko na czerwono, osoba z daltonizmem tego nie zauważy. To wszystko pokazuje, że kolory i kontrast to nie tylko estetyka, ale klucz do równego dostępu. Z mojego doświadczenia, gdy projektuje się strony zgodnie z WCAG, dobrze jest testować różne ustawienia kontrastu albo korzystać z narzędzi jak Colour Contrast Analyser, żeby mieć pewność, że wszyscy użytkownicy skorzystają ze strony bez problemów.

Pytanie 35

Które z wymienionych opcji wspiera osoby niewidome w korzystaniu z witryn internetowych?

A. Implementacja czytnika ekranu (screen reader)
B. Umożliwienie modyfikacji czcionki
C. Ograniczenie liczby grafik na stronie
D. Zmiana rozdzielczości ekranu
Dodanie czytnika ekranu (screen reader) jest kluczowym rozwiązaniem, które znacząco ułatwia osobom niewidomym i słabowidzącym korzystanie z serwisów internetowych. Czytniki ekranu to oprogramowanie przekształcające tekst na stronie internetowej na mowę, co pozwala użytkownikom na interakcję z treścią dostępną w internecie. Technologia ta opiera się na standardach dostępności, takich jak WCAG (Web Content Accessibility Guidelines), które zalecają projektowanie stron przyjaznych dla osób z różnymi niepełnosprawnościami. Przykładem działania czytnika ekranu może być program JAWS, który umożliwia użytkownikom nawigację po stronach internetowych poprzez komendy klawiaturowe oraz odczytywanie treści na głos. Dzięki czytnikom ekranu, osoby niewidome mają możliwość dostępu do informacji, komunikacji oraz interakcji w sieci, co wpisuje się w ideę cyfrowej inkluzji i równości szans. Wprowadzenie czytnika ekranu na stronie internetowej to nie tylko techniczne wsparcie, ale również wyraz odpowiedzialności społecznej, mający na celu zapewnienie, że wszyscy użytkownicy mają równe prawo do korzystania z zasobów w sieci.

Pytanie 36

Która z wymienionych cech dotyczy klasy statycznej?

A. Jest automatycznie usuwana po zakończeniu działania programu
B. Może zawierać wyłącznie statyczne pola i metody
C. Może być dziedziczona przez klasy potomne
D. Nie może zawierać ani zmiennych, ani metod
Klasa statyczna to klasa, która może zawierać tylko statyczne pola i metody. Tego rodzaju klasy są często wykorzystywane do implementacji narzędziowych funkcji, które nie wymagają tworzenia instancji obiektu. Klasy statyczne są typowe dla języków takich jak C# czy Java, gdzie mogą one pełnić rolę kontenerów na metody pomocnicze (np. klasa 'Math' w C#). Główną zaletą klas statycznych jest to, że można je wywoływać bez konieczności tworzenia instancji, co znacząco upraszcza kod i zwiększa jego czytelność. Klasy statyczne zapewniają również bezpieczeństwo w dostępie do danych, ponieważ eliminują ryzyko przypadkowego zmodyfikowania instancji obiektu.

Pytanie 37

Co to jest serverless computing?

A. Proces kompilacji kodu bezpośrednio w przeglądarce użytkownika
B. Metoda tworzenia aplikacji bez użycia back-endu
C. Technika projektowania baz danych bez użycia serwera SQL
D. Model wykonywania kodu w chmurze bez konieczności zarządzania infrastrukturą serwerową
Serverless computing to model dostarczania usług obliczeniowych, który pozwala programistom skupić się na pisaniu kodu, bez konieczności zarządzania serwerami czy infrastrukturą. W tym modelu, dostawcy usług chmurowych automatycznie przydzielają zasoby obliczeniowe w odpowiedzi na zdarzenia, co oznacza, że użytkownicy płacą jedynie za rzeczywistą moc obliczeniową, której używają, a nie za z góry ustalone zasoby. Przykładem zastosowania serverless computing może być wykorzystanie funkcji AWS Lambda, która uruchamia kod w odpowiedzi na zdarzenia, takie jak zmiany w bazie danych, przesyłanie plików do chmury czy wywołania API. Ten model jest zgodny z zasadami DevOps oraz architekturą mikroserwisów, które promują elastyczność i szybkość w dostarczaniu aplikacji. Dobrą praktyką jest również integrowanie serverless computing z systemami CI/CD, co pozwala na automatyczne wdrażanie i zarządzanie kodem w sposób efektywny.

Pytanie 38

Zaproponowany fragment kodu w języku Java wypełnia tablicę elementami:

int[] tablica = new int [10];
int j = 2;

for (int i = 0; i < 10; i++) {
    tablica[i] = j;
    j += 2;
}
A. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
B. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
C. 2, 4, 6, 8, 10, 12, 14, 16, 18, 20
D. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Ten fragment kodu w języku Java rzeczywiście tworzy tablicę o 10 elementach i wypełnia ją kolejnymi liczbami parzystymi, zaczynając od 2. Wynika to bezpośrednio z działania pętli for oraz zmiennej j, która startuje z wartością 2 i w każdym przebiegu pętli jest zwiększana o 2. Dzięki temu do każdej komórki tablicy trafia kolejna liczba parzysta: 2, 4, 6, 8 itd., aż do 20. Takie rozwiązanie jest bardzo często spotykane przy algorytmach, które generują lub przetwarzają sekwencje liczb wg określonego wzorca czy postępu arytmetycznego. Co ciekawe, ten schemat można łatwo modyfikować, np. zmieniając wartość początkową lub krok, żeby tablica wypełniała się liczbami nieparzystymi albo dowolnym innym ciągiem. W profesjonalnych projektach, gdy mamy do czynienia z większymi zbiorami danych, lepiej korzystać z metod typu Arrays.fill() lub streamów, jednak zrozumienie takiej manualnej pętli jest fundamentem nauki programowania. Z mojego doświadczenia, taki kod najlepiej obrazuje, jak działa indeksowanie tablic i inkrementacja wartości. Warto przećwiczyć podobne zadania, żeby utrwalić sobie podstawowe operacje na strukturach danych, bo potem przy bardziej złożonych algorytmach wszystko staje się prostsze. Takie rzeczy są wręcz codziennością w pracy programisty – czy to podczas inicjalizowania danych testowych, czy podczas przygotowywania danych wejściowych do algorytmów.

Pytanie 39

Co zostanie wyświetlone w konsoli po wykonaniu poniższego kodu?

console.log(0.1 + 0.2 === 0.3);
console.log(0.1 + 0.2);
A. true, 0.3
B. false, 0.30000000000000004
C. true, 0.30000000000000004
D. false, 0.3
Wynik wyrażenia `0.1 + 0.2` w JavaScript nie jest równy `0.3` ze względu na sposób reprezentacji liczb zmiennoprzecinkowych w pamięci komputera. W programowaniu, liczby zmiennoprzecinkowe są przechowywane zgodnie z normą IEEE 754, co prowadzi do drobnych błędów zaokrągleń. W przypadku `0.1` oraz `0.2` ich suma w rzeczywistości daje wynik `0.30000000000000004`, co jest nieco większe niż `0.3`. Z tego powodu, porównując `0.1 + 0.2` z `0.3`, otrzymujemy `false`. To zjawisko ilustruje potrzebę ostrożności przy porównywaniu wartości zmiennoprzecinkowych i zachęca do używania metod porównawczych, które uwzględniają tolerancję błędu, takich jak `Math.abs(a - b) < epsilon`, gdzie `epsilon` to bardzo mała liczba. W praktyce, zrozumienie tych zasad jest kluczowe dla zapobiegania błędom w obliczeniach finansowych czy innych zastosowaniach wymagających wysokiej precyzji.

Pytanie 40

W zaprezentowanym fragmencie kodu występuje błąd logiczny. Na czym on polega?

int x = 0;
while (x != 0 || x != 5) {
  std::cout << x << " ";
  x++;
}
A. Braku zainicjowania zmiennej x, co powoduje, że zmienna nie ma wartości początkowej.
B. Niepoprawnym użyciu funkcji cout, co skutkuje tym, że zmienna jest wczytywana w pętli.
C. Nieprawidłowym warunku pętli, który sprawia, że pętla jest nieskończona.
D. Niewłaściwym warunku pętli, co powoduje, że pętla nigdy się nie wykona.
Nieprawidłowy warunek pętli powoduje, że staje się ona nieskończona, co jest częstym problemem w programowaniu. W tym przypadku warunek while(x != 0 || x != 5) jest zawsze prawdziwy, ponieważ dla każdej wartości x, która nie jest jednocześnie równa 0 i 5, pętla nigdy się nie zakończy. To logiczny błąd, ponieważ zmienna x nigdy nie osiągnie stanu, w którym oba warunki będą jednocześnie fałszywe. W praktyce powinno się stosować warunki logiczne, które mogą stać się fałszywe dla jakiegoś stanu zmiennych, co pozwala pętli zakończyć działanie. Częstym wzorcem jest użycie operatora && zamiast ||, aby sprawdzić, czy zmienna osiągnęła konkretny zakres wartości. W ten sposób można zagwarantować, że program nie wejdzie w nieskończoną pętlę. Tego typu błędy są często wykrywane podczas testowania i debugowania kodu, a ich unikanie jest kluczowe w zapewnieniu poprawnego działania aplikacji. Dobre praktyki obejmują dokładne przemyślenie warunków pętli i testowanie ich w różnych scenariuszach.