Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 10 stycznia 2026 02:39
  • Data zakończenia: 10 stycznia 2026 03:07

Egzamin zdany!

Wynik: 34/40 punktów (85,0%)

Wymagane minimum: 20 punktów (50%)

Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

Która z operacji logicznych zwróci wartość "true", gdy obie zmienne są sobie równe?

A. x == y
B. x && y
C. x != y
D. x || y
Operator `==` w języku C++ i wielu innych językach programowania (np. Python, Java, JavaScript) służy do porównywania dwóch wartości. Zwraca `true`, jeśli obie wartości są sobie równe, oraz `false`, jeśli są różne. Przykład: `if (x == y)` sprawdza, czy zmienna `x` jest równa zmiennej `y`. Operator ten jest kluczowy w instrukcjach warunkowych oraz pętlach, gdzie konieczne jest porównywanie wartości w celu podejmowania decyzji na podstawie wyniku tego porównania.

Pytanie 2

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. czworokąt
B. trójkąt
C. trapez
D. figura
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 3

Jaką właściwość ma sieć synchroniczna?

A. Transmisja danych odbywa się w wyznaczonych interwałach czasowych
B. Gwarantuje większą elastyczność w przesyłaniu danych
C. Nie jest konieczna synchronizacja zegarów
D. Przekazywanie danych zachodzi w sposób niesystematyczny
Sieć synchroniczna charakteryzuje się tym, że transmisja danych odbywa się w ustalonych odstępach czasu, co oznacza, że wszystkie urządzenia w sieci są zsynchronizowane do jednego zegara. Taki sposób przesyłania danych pozwala na precyzyjne określenie momentu, w którym dane są wysyłane i odbierane, co redukuje opóźnienia i błędy w komunikacji. Przykładem sieci synchronicznej jest system TDM (Time Division Multiplexing), który dzieli czas na różne sloty, przydzielając każdy slot konkretnemu użytkownikowi lub urządzeniu. Dzięki temu każdy uczestnik sieci ma gwarancję, że w swoim czasie dostanie dostęp do medium transmisyjnego. Standardy takie jak SONET (Synchronous Optical Network) i SDH (Synchronous Digital Hierarchy) są przykładami technologii, które wykorzystują synchronizację do efektywnego przesyłania danych na dużych odległościach. Takie podejście jest powszechnie stosowane w telekomunikacji, gdzie wysoka wydajność i niezawodność transmisji są kluczowe dla jakości usług.

Pytanie 4

Jaką funkcję pełnią okna dialogowe niemodalne?

A. zarządzania stanem aplikacji za pomocą systemów menu
B. zarządzania ustawieniami aplikacji, jako okno, które pozostaje widoczne na ekranie przez cały czas trwania aplikacji
C. wstrzymywania działania aplikacji w czasie wprowadzania oraz zatwierdzania danych
D. prezentowania komunikatów, które wymagają potwierdzenia, aby kontynuować działanie aplikacji
Wiele osób myli okna dialogowe niemodalne z innymi typami okien, szczególnie modalnymi, co w sumie nie dziwi, bo na pierwszy rzut oka mogą wyglądać podobnie. Jednym z typowych błędów jest przekonanie, że okna niemodalne zatrzymują działanie aplikacji do czasu zatwierdzenia jakichś danych. To akurat cecha okien modalnych – one faktycznie wymuszają interakcję użytkownika, zanim wróci on do głównego okna programu. W praktyce okno niemodalne daje pełną swobodę poruszania się po aplikacji nawet wtedy, gdy jest otwarte. Kolejnym nieporozumieniem jest myślenie, że niemodalne służą do prezentowania komunikatów wymagających potwierdzenia – to znowu domena okien modalnych, takich jak alerty czy potwierdzenia, które muszą być obsłużone przed dalszym działaniem aplikacji. Często spotykam się też z poglądem, że okna niemodalne służą do zarządzania stanem aplikacji przez systemy menu. To w zasadzie nie jest domena żadnych okien dialogowych, tylko klasycznych pasków menu czy nawigacji. Okna niemodalne są zaprojektowane po to, by zapewnić użytkownikowi narzędzia lub ustawienia „pod ręką” przez cały czas, bez zamykania czy blokowania głównego widoku aplikacji. Mylenie tych funkcjonalności prowadzi do złych decyzji projektowych – czasem programiści wrzucają coś do okna modalnego, gdzie powinno być niemodalne i odwrotnie, przez co użytkownicy są sfrustrowani, bo muszą zamykać okna, żeby móc dalej pracować. Warto więc dobrze rozumieć różnice, bo branżowe standardy (jak Apple Human Interface Guidelines czy Windows UX Guidelines) jasno oddzielają te pojęcia i rekomendują konkretne zastosowania każdego typu okna. Moim zdaniem, świadomość tych subtelności to podstawa profesjonalnego projektowania interfejsów.

Pytanie 5

Co to jest WebSocket?

A. Standard zapisu danych w formacie binarnym
B. Protokół komunikacyjny zapewniający komunikację dwukierunkową przez pojedyncze połączenie TCP
C. Narzędzie do testowania aplikacji webowych
D. Biblioteka JavaScript do tworzenia dynamicznych formularzy
WebSocket to protokół komunikacyjny, który umożliwia dwukierunkową, interaktywną komunikację między klientem a serwerem przez pojedyncze połączenie TCP. Dzięki WebSocket możliwe jest przesyłanie danych w czasie rzeczywistym, co jest szczególnie istotne w aplikacjach wymagających natychmiastowej wymiany informacji, takich jak czaty, gry online czy aplikacje do monitorowania. W przeciwieństwie do tradycyjnych protokołów HTTP, które wymagają wielokrotnych połączeń dla każdej interakcji, WebSocket utrzymuje stałe połączenie, co minimalizuje opóźnienia oraz obciążenie serwera. Technologia ta opiera się na standardach IETF, a także jest szeroko wspierana przez większość nowoczesnych przeglądarek, co czyni ją idealnym rozwiązaniem dla aplikacji webowych. Dobrą praktyką jest również obsługa protokołu HTTPS, co zapewnia bezpieczeństwo wymiany danych. Przykładem zastosowania WebSocket jest aplikacja finansowa, w której użytkownicy muszą na bieżąco śledzić zmiany cen akcji.

Pytanie 6

Który z poniższych przykładów stanowi aplikację mobilną wykorzystującą bazę danych?

A. Aplikacja wyświetlająca lokalny czas
B. Aplikacja kalkulator
C. Aplikacja do robienia zdjęć
D. Aplikacja gromadząca listę kontaktów użytkownika
Aplikacja przechowująca listę kontaktów użytkownika korzysta z bazy danych do przechowywania, odczytywania i zarządzania danymi. Tego typu aplikacje mobilne muszą efektywnie zarządzać dużą ilością danych i zapewniać ich szybki dostęp. Bazy danych, takie jak SQLite czy Firebase, są szeroko stosowane w aplikacjach mobilnych, umożliwiając przechowywanie kontaktów, wiadomości, notatek i innych informacji użytkownika. Dzięki bazom danych możliwe jest także synchronizowanie danych pomiędzy urządzeniami i przechowywanie ich w chmurze.

Pytanie 7

Jakie narzędzie jest najbardziej odpowiednie do identyfikacji błędów w trakcie działania programu?

A. Debugger
B. Linker
C. Interpreter
D. Kompilator
Debugger to narzędzie przeznaczone do wyszukiwania błędów w czasie wykonywania programu. Pozwala na zatrzymywanie aplikacji w wybranych miejscach, analizowanie wartości zmiennych i śledzenie przepływu sterowania, co umożliwia szybkie wykrywanie błędów logicznych i błędów czasu wykonania. Debugger jest niezbędny w procesie rozwoju oprogramowania, ponieważ pomaga programistom w zrozumieniu, jak ich kod działa w rzeczywistości i jak różne warunki wpływają na jego funkcjonowanie.

Pytanie 8

Która z poniższych metod tablicowych w JavaScript nie modyfikuje oryginalnej tablicy?

A. sort()
B. push()
C. splice()
D. map()
Metoda map() w JavaScript jest funkcją tablicową, która tworzy nową tablicę na podstawie wyników wywołania funkcji podanej jako argument dla każdego elementu oryginalnej tablicy. Kluczowym aspektem tej metody jest to, że nie modyfikuje oryginalnej tablicy, co czyni ją bezpiecznym narzędziem do transformacji danych. Zastosowanie map() jest szczególnie przydatne w sytuacjach, gdy chcemy przekształcić dane, ale zachować oryginał, na przykład w przypadku przetwarzania wyników z API lub operacji na danych wejściowych od użytkownika. Standardowe praktyki zalecają używanie map() w programowaniu funkcyjnym, co pozwala na bardziej deklaratywne podejście do manipulacji danymi. Przykład zastosowania: mając tablicę liczb, możemy użyć map() do stworzenia nowej tablicy, która zawiera tylko ich kwadraty: const numbers = [1, 2, 3]; const squares = numbers.map(num => num * num); W ten sposób oryginalna tablica numbers pozostaje nietknięta, co jest kluczowe w wielu aplikacjach, w których zachowanie stanu jest istotne.

Pytanie 9

Jaki kod może być związany z treścią wygenerowaną w trakcie działania programu Java?

Exception in thread "main" java.lang.ArithmeticException: / by zero
A. x = 0;
B. if (x > y) ...
C. x = tablica[6];
D. x = x % y;
Kod x = x % y; jest klasycznym przykładem operacji, która może prowadzić do wystąpienia wyjątku ArithmeticException w Javie, szczególnie gdy zmienna y przyjmuje wartość zero. Operator modulo (%) w języku Java nie toleruje dzielenia przez zero – w przeciwieństwie do niektórych innych języków, które mogą zwracać np. NaN lub Infinity, tutaj od razu zostanie zgłoszony wyjątek. Taki wyjątek jest dość powszechny w pracy programisty, zwłaszcza w aplikacjach, gdzie dane wejściowe nie są do końca kontrolowane. Moim zdaniem dobrze jest od razu przyzwyczaić się do zabezpieczania wszystkich operacji dzielenia i modulo poprzez wcześniejsze sprawdzenie wartości dzielnika. Rekomenduje się stosowanie warunków typu if (y != 0) przed wykonaniem takiej instrukcji, co jest zgodne z dobrymi praktykami defensywnego programowania. Dodatkowo, w środowiskach produkcyjnych często otacza się te fragmenty kodu blokiem try-catch, aby elegancko obsłużyć wyjątek i np. wyświetlić użytkownikowi zrozumiały komunikat. Warto pamiętać, że ArithmeticException dziedziczy po RuntimeException, a więc nie musimy jej jawnie obsługiwać, ale nie oznacza to, że powinniśmy ją ignorować – w dobrze napisanym kodzie zawsze należy przewidywać takie sytuacje. Z mojego doświadczenia wynika, że najwięcej błędów z tym związanych pojawia się w aplikacjach przetwarzających dane liczbowe, gdzie nawet niepozorna operacja modulo może „wywalić” cały proces, jeśli nie zostanie odpowiednio zaopiekowana.

Pytanie 10

Na zaprezentowanych ilustracjach znajduje się okno aplikacji w wersji początkowej oraz po wprowadzeniu danych. Przyjmując, że pole "Dostępne środki" służy do wprowadzania wartości typu rzeczywistego, wskaż elementy struktury, które najlepiej odpowiadają tym danym?

Ilustracja do pytania
A. Kod 4
B. Kod 3
C. Kod 1
D. Kod 2
Dla pola 'Dostępne środki', które powinno przechowywać wartości rzeczywiste, odpowiednią strukturą jest ta zawierająca typ danych float lub double. Są to typy zmiennoprzecinkowe umożliwiające przechowywanie liczb z częścią ułamkową, co jest kluczowe przy operacjach finansowych i precyzyjnych obliczeniach. Wybór odpowiedniej struktury danych gwarantuje dokładność i minimalizuje ryzyko błędów związanych z zaokrągleniami.

Pytanie 11

Cytat przedstawia charakterystykę metodyki RAD. Pełne znaczenie tego skrótu można przetłumaczyć na język polski jako:

...(RAD)..., is both a general term for adaptive software development approaches, and the name for James Martin's method of rapid development.

In general, RAD approaches to software development put less emphasis on planning and more emphasis on an adaptive process. Prototypes are often used in addition to or sometimes even instead of design specifications.

Źródło: https://en.wikipedia.org/

A. zintegrowane środowisko programistyczne
B. środowisko refaktoryzacji aplikacji
C. prototypowanie wsparte testami jednostkowymi
D. środowisko szybkiego rozwoju aplikacji
RAD, czyli Rapid Application Development, tłumaczy się na polski najczęściej jako „środowisko szybkiego rozwoju aplikacji” albo „metodyka szybkiego wytwarzania oprogramowania”. To podejście stawia na błyskawiczne prototypowanie i szybkie iteracje zamiast długiego, formalnego planowania. Bardziej niż na dokumentacji, skupia się na tworzeniu działających wersji aplikacji, które można testować i na bieżąco modyfikować zgodnie z tym, czego oczekuje klient lub zespół użytkowników. W praktyce, przykładowy projekt w RAD to np. budowa aplikacji, gdzie klient dostaje wstępny prototyp po tygodniu, a nie po miesiącu – i od razu może zgłaszać uwagi. Bardzo często stosuje się narzędzia typu CASE (Computer-Aided Software Engineering), które pozwalają szybko generować kod i prototypy GUI bez żmudnego pisania wszystkiego od zera. W świecie profesjonalnych firm IT, RAD jest chętnie wykorzystywany, kiedy czas wdrożenia jest kluczowy, na przykład w startupach, które muszą szybko przetestować swój pomysł rynkowy. Moim zdaniem, nawet jeśli nie wszystkie projekty się do tego nadają, to znajomość RAD jest bardzo przydatna dla każdego programisty – pozwala lepiej zrozumieć, jak można pracować zwinnie i elastycznie, bez zbędnego formalizmu. RAD to nie tylko metodyka, ale też praktyczny styl myślenia o aplikacjach – szybciej, więcej, elastyczniej. Warto się tym zainteresować, szczególnie jeśli komuś zależy na czasie i wczesnych efektach pracy.

Pytanie 12

Podejście obiektowe w rozwiązywaniu problemów obejmuje między innymi:

A. klasy, obiekty oraz hermetyzację
B. zmienne, procedury oraz funkcje
C. pola, metody, rekurencję oraz kwerendy
D. wyzwalacze i polimorfizm
Podejście obiektowe, zwane też programowaniem obiektowym (OOP), naprawdę opiera się na takich pojęciach jak klasy, obiekty i hermetyzacja. Klasa to taki szablon, z którego tworzy się obiekty – czyli konkretne instancje tej klasy działające w pamięci komputera. Hermetyzacja polega na tym, że ukrywamy szczegóły implementacji i wystawiamy na zewnątrz tylko niezbędne interfejsy. Moim zdaniem to jest jeden z najważniejszych aspektów OOP, bo pozwala nam lepiej zarządzać złożonością dużych systemów. Przykładowo, w językach takich jak Java czy C#, klasa samochód może mieć prywatne pola (np. numer VIN), a dostęp do nich uzyskujemy tylko przez określone publiczne metody (gettery i settery). To bardzo pomaga, gdy w zespole kilka osób pracuje nad tym samym kodem – nie trzeba wiedzieć wszystkiego o wnętrzu klasy, by z niej korzystać. W praktyce, modelowanie problemów za pomocą obiektów i klas pozwala odwzorować realne byty z rzeczywistego świata w oprogramowaniu. Standardy branżowe, jak SOLID czy zasada pojedynczej odpowiedzialności, podkreślają konieczność stosowania hermetyzacji, bo to przekłada się na elastyczność i łatwość utrzymania kodu. Z mojego doświadczenia, jeśli dobrze opanujesz te podstawy OOP, dużo szybciej zrozumiesz bardziej zaawansowane koncepty, jak dziedziczenie czy polimorfizm. To naprawdę solidny fundament, z którego korzysta praktycznie każdy nowoczesny język programowania.

Pytanie 13

Co to jest JWT (JSON Web Token)?

A. Biblioteka JavaScript do walidacji formularzy webowych
B. Protokół komunikacyjny do transferu danych między klientem a serwerem
C. Standard definiujący sposób bezpiecznego przekazywania informacji jako obiekt JSON
D. Format zapisu danych używany w bazach NoSQL
JWT, czyli JSON Web Token, jest standardem, który definiuje sposób bezpiecznego przekazywania informacji między dwiema stronami w postaci obiektu JSON. Tokeny JWT są powszechnie wykorzystywane w systemach autoryzacji i autoryzacji, umożliwiając przekazywanie zweryfikowanych i podpisanych danych. Struktura tokena składa się z trzech części: nagłówka, ładunku (payload) oraz podpisu. Nagłówek zazwyczaj określa typ tokena oraz algorytm użyty do podpisania, ładunek zawiera dane, które chcemy przesłać, a podpis jest generowany przy użyciu tajnego klucza, co zapewnia integralność danych. Przykładem zastosowania JWT może być system logowania, gdzie po pomyślnym zalogowaniu użytkownik otrzymuje token, który jest następnie używany do autoryzacji kolejnych zapytań do serwera. Dzięki swojej strukturze, JWT nie tylko zwiększa bezpieczeństwo, ale także umożliwia łatwą wymianę informacji między różnymi systemami, co jest szczególnie ważne w architekturach mikroserwisowych.

Pytanie 14

Wykorzystując React.js oraz Angular, stworzono funkcjonalnie równoważne kody źródłowe. Aby móc w metodzie handleSubmit pokazać zawartość kontrolki input w miejscu oznaczonym ???, należy odwołać się do atrybutu o nazwie:
React.js:

nazwa1 = React.createRef();
handleSubmit = e => {
    console.log(this.???.current.value);
}
...
<form onSubmit={this.handleSubmit}>
    <input ref={this.nazwa1} name="nazwa2" id="nazwa3" for="nazwa4" />
Angular:
<form #f="ngForm" (ngSubmit) = "handleSubmit(f)">
    <input ngModel name="nazwa1" id="nazwa2" class="nazwa3" for="nazwa4" >
...
handleSubmit(f) {
    console.log(f.value.???);
}
A. nazwa2
B. nazwa4
C. nazwa1
D. nazwa3
To właśnie nazwa1 jest właściwym atrybutem, do którego trzeba się odwołać, żeby wyciągnąć wartość inputa zarówno w React, jak i w Angularze. W React, kiedy chcemy pobrać wartość z inputa przez refa, to przekazujemy ref={this.nazwa1}, a potem w handleSubmit robimy this.nazwa1.current.value. To po prostu dokładnie ta sama nazwa, którą przypisałeś do refa, nie ma tu żadnej magii. W Angularze z kolei input posiada ngModel oraz name="nazwa1" – i to name jest kluczowe, bo obiekt f.value generowany przez ngForm zawiera wszystkie pola po kluczach odpowiadających atrybutom name. Dzięki temu możesz potem użyć f.value.nazwa1 i dostajesz wartość inputa. W praktyce zawsze warto pilnować, żeby atrybut name był sensowny i jednoznaczny, bo to na nim opierają się frameworki przy serializacji danych formularza i obsłudze ich stanu. Moim zdaniem to jest jedna z bardziej praktycznych umiejętności przy pracy z dynamicznymi formularzami – jeśli ktoś nie dba o spójność nazw atrybutów name, to łatwo o błędy, które są potem trudne do wykrycia. Warto jeszcze pamiętać, że atrybuty typu id, class czy for mają zupełnie inne zastosowanie – służą do stylowania, powiązań z labelkami, itd. Name natomiast to podstawa logicznej obsługi wartości pól formularza. Często spotykam się z sytuacjami, że ktoś próbuje pobierać dane po id czy class, ale to nie jest zgodne z dobrymi praktykami – dla czytelności kodu i łatwości refaktoryzacji o wiele lepiej korzystać z name. Takie rozwiązania są też zalecane w oficjalnej dokumentacji zarówno React, jak i Angulara.

Pytanie 15

Jakie narzędzie umożliwia testowanie API w aplikacjach internetowych?

A. Postman
B. Microsoft Excel
C. Blender
D. Node.js
Postman to jedno z najczęściej wykorzystywanych narzędzi do testowania API aplikacji webowych. Umożliwia wysyłanie żądań HTTP, testowanie endpointów oraz monitorowanie odpowiedzi serwera. Dzięki Postmanowi programiści mogą w łatwy sposób analizować dane przesyłane między frontendem a backendem, co jest kluczowe w trakcie budowania nowoczesnych aplikacji opartych na architekturze REST lub GraphQL. Narzędzie oferuje możliwość automatyzacji testów, co przyspiesza proces wykrywania błędów i zwiększa jakość dostarczanych aplikacji. Postman pozwala także na tworzenie skryptów pre-request i testowych, umożliwiając weryfikację poprawności danych oraz sprawdzanie integralności aplikacji na różnych etapach jej rozwoju.

Pytanie 16

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. 23
B. 20
C. 10
D. 0
Rozwiązując takie zadania, warto nauczyć się dokładnie patrzeć na strukturę kodu. Funkcja fun1 przyjmuje tablicę intów i sumuje jej elementy. Tu pętla for przechodzi po wszystkich sześciu indeksach – od 0 do 5. Gdy podmienisz na liczby z zadania: 3, 4, 2, 4, 10 oraz 0 – po prostu dodajesz te wartości do siebie. Suma wychodzi 23. Czyli wynik funkcji to właśnie 23. To taki bardzo typowy przykład sumowania elementów tablicy – nie tylko na lekcjach, ale praktycznie wszędzie, np. jak liczysz sumę zamówień w sklepie internetowym albo punkty gracza w grze. Jeśli chodzi o dobre praktyki w C++, to warto wiedzieć, że lepiej przekazywać tablicę z dodatkowym parametrem długości, żeby nie robić magicznych liczb jak to '6' w pętli – można się wtedy łatwo pomylić przy zmianie rozmiaru. Moim zdaniem dobrze jest od razu przyswoić sobie nawyk wykorzystywania std::vector zamiast „gołych” tablic, bo są bezpieczniejsze i elastyczniejsze. To już taki krok w stronę kodu produkcyjnego. Ale podsumowując – jeśli widzisz tak napisany kod, to zawsze patrz, ile razy pętla się wykona i jakie są wartości w tablicy. Tylko tyle i aż tyle. W praktyce ta umiejętność przekłada się na szybkie debugowanie i pisanie niezawodnych programów.

Pytanie 17

Wskaż poprawny pod względem składniowym kod dla formatu JSON, który jest używany do wymiany danych między backendem a frontendem aplikacji.

osoby: [
  {imię: 'Anna', wiek: '31' },
  {imię: 'Krzysztof', wiek: '25' }
]
"osoby": [
  {"imię": "Anna", "wiek": 31 },
  {"imię": "Krzysztof", "wiek": 25 }
]
Kod 1Kod 2
<osoby>
  <imie>Anna</imie>
  <wiek>31</wiek>
  <imie>Krzysztof</imie>
  <wiek>25</wiek>
</osoby>
struct osoby {
  imie: {Anna}, wiek:{31};
  imie: {Krzysztof}, wiek:{25}
};
Kod 3Kod 4
A. Kod4
B. Kod3
C. Kod1
D. Kod2
Kod1 niestety jest błędny. W JSON klucze i wartości muszą być w podwójnych cudzysłowach, a nie w pojedynczych. Pojedyncze cudzysłowy tutaj nie działają i będą powodować błąd podczas próby parsowania. Kod3 to nie JSON, tylko przykład XML, który używa znaczników do oznaczania danych, ale w kontekście JSON nie pasuje. Kod4 z kolei przypomina bardziej zapis w jakimś języku programowania, na przykład C. Używasz składni, której parsery JSON nie rozpoznają, bo brakuje nawiasów klamrowych i podwójnych cudzysłowów. Często błędy w JSON wynikają z niewłaściwego użycia znaków interpunkcyjnych i złego formatowania, co może prowadzić do problemów z działaniem aplikacji. Dlatego naprawdę warto zadbać o poprawną składnię JSON, żeby wszystko działało bez zarzutów.

Pytanie 18

Który z wymienionych elementów jest fundamentalny w architekturze klient-serwer?

A. Brak podziału na funkcje klienta i serwera
B. Zdalne wykonywanie aplikacji na urządzeniu klienta
C. Wyłącznie komunikacja synchroniczna
D. Scentralizowane przechowywanie danych
Scentralizowane przechowywanie danych to podstawowy element architektury klient-serwer. W takim modelu dane przechowywane są na serwerze, a klient uzyskuje do nich dostęp na żądanie. Dzięki temu możliwa jest efektywna synchronizacja danych oraz ich ochrona przed nieautoryzowanym dostępem. Architektura klient-serwer jest skalowalna i umożliwia obsługę wielu klientów jednocześnie, co czyni ją fundamentem dla większości nowoczesnych aplikacji webowych i mobilnych.

Pytanie 19

Który z poniższych opisów najlepiej charakteryzuje Node.js?

A. Framework do budowania aplikacji mobilnych przy użyciu JavaScript
B. Biblioteka do tworzenia interfejsów użytkownika w aplikacjach webowych
C. System zarządzania bazami danych NoSQL
D. Środowisko uruchomieniowe JavaScript poza przeglądarką, używające silnika V8 z Chrome
Node.js to środowisko uruchomieniowe JavaScript, które działa na serwerze, a nie tylko w przeglądarkach. Jest zbudowane na silniku V8, który jest również używany w przeglądarce Google Chrome. Dzięki temu, Node.js pozwala na wykonywanie kodu JavaScript na serwerze, co otwiera nowe możliwości dla programistów. Aplikacje napisane w Node.js są zazwyczaj asynchroniczne i oparte na zdarzeniach, co sprawia, że są one wydajne i responsywne. Przykłady zastosowania Node.js obejmują tworzenie serwisów webowych, API oraz aplikacji w czasie rzeczywistym, jak czaty czy gry online. Node.js zapewnia również bogaty ekosystem bibliotek i frameworków, takich jak Express.js, co pozwala na szybkie i efektywne tworzenie aplikacji. Zastosowanie standardów, takich jak RESTful API, w połączeniu z architekturą mikroserwisów, jest przykładami dobrych praktyk przy używaniu Node.js w projektach komercyjnych.

Pytanie 20

Jakie jest wymagane minimalne natężenie światła w biurze na stanowisku pracy?

A. 100 lx
B. 200 lx
C. 500 lx
D. 800 lx
Oświetlenie na poziomie 100 lx czy 200 lx jest na pewno za słabe do pracy biurowej. Tego typu natężenia nadają się bardziej do korytarzy czy miejsc, gdzie nie ma za dużo aktywności wzrokowej. Z kolei 800 lx to już dość dużo, ale w biurze może być zbyt mocne i prowadzić do zmęczenia oczu. Jasne, że natężenie światła zależy od tego, co się robi, ale dla zwykłych biur 500 lx to zdecydowanie najlepszy wybór, bo pasuje do przepisów i zapewnia komfort.

Pytanie 21

Definicja konstruktora dla zaprezentowanej klasy w języku C++ może być sformułowana jak poniżej:

class Owoc
{
    public:
        double waga;
        string nazwa;
        Owoc(double waga, string nazwa);
};

Deklaracja 1:
Owoc::Owoc(double waga, string nazwa) {
    this -> waga = waga;
    this -> nazwa = nazwa;
}

Deklaracja 2:
Construct::Owoc(double waga, string nazwa) {
    this -> waga = waga;
    this -> nazwa = nazwa;
}

Deklaracja 3:
Construct::Owoc(double waga, string nazwa) {
    this.waga = waga;
    this.nazwa = nazwa;
}

Deklaracja 4:
Owoc::Owoc(double waga, string nazwa) {
    this.waga = waga;
    this.nazwa = nazwa;
}
A. Deklaracji 1
B. Deklaracji 2
C. Deklaracji 3
D. Deklaracji 4
Wiele osób, szczególnie na początku nauki, myli się tu przez znajomość składni z innych języków lub nie do końca rozumie, jak działa zakres nazw w C++. Najczęstszy błąd w przedstawionych błędnych deklaracjach polega na używaniu nieprawidłowej nazwy klasy w kwalifikatorze zasięgu, czyli przed '::'. W C++ implementując konstruktor poza ciałem klasy, musimy napisać Owoc::Owoc(...), a nie, na przykład, Construct::Owoc(...). To bardzo podstawowa, ale kluczowa kwestia, która wynika z zasad języka. Często osoby przesiadające się z innych języków, np. z Javy czy C#, próbują też używać notacji this.waga (z kropką), co niestety w C++ jest nieprawidłowe – tutaj operator dostępu do składowych przez wskaźnik to '->', bo this jest wskaźnikiem do obiektu. Takie subtelności bywają podchwytliwe i sam pamiętam, jak łatwo się na tym przejechać, zwłaszcza jak się przeskakuje pomiędzy językami. Jeszcze inny typowy błąd to mylenie konstruktora z zupełnie innymi funkcjami albo próba zadeklarowania konstruktora w przestrzeni nazw, która nie odpowiada klasie – przez co kompilator nie rozpoznaje takiej funkcji jako konstruktora i pojawiają się często niejasne błędy kompilacji. Warto mocno zapamiętać, że w C++ musimy bardzo pilnować zarówno nazewnictwa, jak i składni operatorów, bo automatycznych podpowiedzi na etapie pisania kodu czasem brakuje. Dobrą praktyką jest też sprawdzanie, czy używamy poprawnych typów dostępu do pól (-> zamiast .). Wreszcie, nie można używać innych nazw klas niż tej, której konstruktor rzeczywiście definiujemy. Każde odstępstwo od tej reguły prowadzi do sporych problemów i nieporozumień w kodzie. Z mojego doświadczenia wynika, że te drobiazgi, które wydają się mało istotne, potem najbardziej komplikują pracę i utrzymanie projektu. Warto więc od razu przyzwyczajać się do poprawnej składni i nie kombinować z rozwiązaniami "z innych światów" – C++ rządzi się swoimi prawami i trzymając się ich, można zyskać sporo pewności przy pisaniu kodu.

Pytanie 22

Jaki framework umożliwia tworzenie interaktywnych interfejsów użytkownika w języku TypeScript?

A. ASP.NET Core
B. Angular
C. Django
D. jQuery
Angular to popularny framework oparty na TypeScript, który umożliwia tworzenie dynamicznych i rozbudowanych interfejsów użytkownika. Jest rozwijany przez Google i używany do budowy aplikacji typu Single Page Applications (SPA), które cechują się płynnością działania i interaktywnością. Angular oferuje bogaty ekosystem narzędzi wspierających programistów, takich jak Angular CLI, który pozwala na szybkie generowanie komponentów, serwisów i modułów. Wsparcie dla TypeScript oznacza, że Angular pozwala na wykorzystywanie typów, interfejsów oraz zaawansowanych narzędzi do refaktoryzacji kodu, co przekłada się na większą czytelność i bezpieczeństwo aplikacji. Dzięki modularnej architekturze Angular wspiera tworzenie aplikacji, które są łatwe w utrzymaniu i skalowaniu. Jego dwukierunkowe wiązanie danych (two-way data binding) oraz możliwość dynamicznej aktualizacji widoków czynią go jednym z liderów na rynku frameworków frontendowych.

Pytanie 23

W jaki sposób definiuje się konstruktor kopiujący w ramach klasy?

A. Tworzy nowy obiekt jako wierną kopię innego obiektu
B. Inicjuje obiekt klasy na podstawie klasy dziedziczącej
C. Generuje nowy obiekt klasy bez przypisywania wartości
D. Generuje nowy obiekt i usuwa wcześniejszy
Konstruktor kopiujący to specjalny typ konstruktora, który tworzy nowy obiekt będący dokładną kopią innego obiektu tej samej klasy. Jest to niezwykle przydatne, gdy chcemy zduplikować istniejący obiekt, zachowując jego stan i wartości wszystkich składowych. Konstruktor kopiujący przyjmuje jako argument referencję do obiektu tej samej klasy, co pozwala na kopiowanie zarówno podstawowych typów danych, jak i dynamicznie alokowanych zasobów. Jego zastosowanie jest kluczowe w sytuacjach, gdy musimy pracować z obiektami dynamicznymi lub kopiować obiekty zarządzające wskaźnikami, aby uniknąć problemów związanych z wielokrotnym zwalnianiem tej samej pamięci.

Pytanie 24

W jakim celu wykorzystuje się diagram Gantta?

A. do przedstawiania funkcjonalności systemu
B. do wizualizacji powiązań między elementami systemów
C. do planowania i zarządzania projektem
D. do dokładnej analizy czasowo-kosztowej projektu
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 25

Jakie jest najważniejsze działanie w trakcie analizy wymagań klienta przed rozpoczęciem realizacji projektu aplikacji?

A. Selekcja języka programowania
B. Zrozumienie potrzeb biznesowych i oczekiwań klienta
C. Stworzenie diagramu Gantta
D. Rozdzielenie ról w zespole projektowym
Fajnie, że zauważyłeś, jak ważne jest zrozumienie potrzeb biznesowych i oczekiwań klienta. To kluczowa sprawa przed rozpoczęciem pracy nad projektem aplikacji. Bez tego, nawet najfajniejszy kod może nie spełniać wymagań, a to byłoby szkoda, prawda? Analiza wymagań to nie tylko rozpoznanie celów, ale też spotkania z osobami zaangażowanymi w projekt i zbadanie rynku. Dzięki temu możemy stworzyć aplikację, która naprawdę odpowiada na specyficzne potrzeby, co czyni ją bardziej użyteczną i konkurencyjną. No i oczywiście, jak dobrze określimy, czego potrzebują użytkownicy, to mniej nieporozumień po drodze, a klienci będą bardziej zadowoleni, co zawsze jest na plus.

Pytanie 26

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

A. RAD nie oferuje żadnych narzędzi do debugowania
B. RAD funkcjonuje tylko w systemach operacyjnych Linux
C. RAD pozwala na szybkie tworzenie prototypów i rozwijanie aplikacji przy minimalnej ilości kodu
D. RAD koncentruje się tylko na testowaniu programów
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 27

Co to jest Webpack?

A. Narzędzie do budowania modułów i zarządzania zależnościami w aplikacjach JavaScript
B. Framework JavaScript do tworzenia aplikacji mobilnych
C. System zarządzania bazami danych dla aplikacji Node.js
D. Biblioteka do testowania kodu JavaScript
Webpack to zaawansowane narzędzie do budowania modułów, które znacząco ułatwia zarządzanie zależnościami w aplikacjach JavaScript. Umożliwia on zorganizowane łączenie różnych zasobów, takich jak skrypty JavaScript, style CSS, obrazy i inne pliki, w jeden lub kilka plików wyjściowych. Dzięki temu programiści mogą zoptymalizować czas ładowania aplikacji, minimalizując rozmiar plików i eliminując zbędne zapytania do serwera. Przykładowo, korzystając z Webpacka, można skonfigurować automatyczną kompresję kodu i zastosowanie technik takich jak kod dzielony (code splitting), co znacząco podnosi wydajność aplikacji. Dodatkowo, Webpack wspiera różne wtyczki i loadery, co pozwala na łatwą integrację z narzędziami do kompilacji, takimi jak Babel, umożliwiający użycie nowoczesnych funkcji JavaScript, które mogą nie być jeszcze wspierane przez wszystkie przeglądarki. Standardy branżowe kładą duży nacisk na efektywność i utrzymywalność kodu, a Webpack, będąc częścią ekosystemu JavaScript, skutecznie wspiera te zasady.

Pytanie 28

Który z frameworków pozwala na tworzenie aplikacji z graficznym interfejsem użytkownika oraz obsługą wydarzeń?

A. Express.js
B. TensorFlow
C. Django
D. Qt
Django to framework do tworzenia aplikacji webowych w języku Python, a nie narzędzie do budowy aplikacji desktopowych z interfejsem graficznym. TensorFlow to biblioteka do uczenia maszynowego i sztucznej inteligencji, która nie ma bezpośredniego związku z projektowaniem GUI. Express.js to framework dla Node.js, który służy do budowy aplikacji serwerowych i API, ale nie jest narzędziem do projektowania interfejsów użytkownika w aplikacjach desktopowych.

Pytanie 29

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

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success');
  }, 1000);
});

promise
  .then(res => {
    console.log(res);
    return 'first then';
  })
  .then(res => {
    console.log(res);
  });
A. first then, success
B. success
C. success, first then
D. first then
W przypadku błędnych odpowiedzi można zauważyć kilka typowych nieporozumień dotyczących działania obietnic w JavaScript. Odpowiedzi sugerujące, że najpierw zostanie wyświetlony 'first then' lub że będzie tylko jeden wynik, są wynikiem niezrozumienia, jak działa asynchroniczność oraz jak obietnice przetwarzają wyniki. Obietnice w JavaScript są zaprojektowane tak, aby zarządzać operacjami asynchronicznymi, co oznacza, że kod wewnątrz obietnicy nie blokuje wykonania innych operacji. W momencie, gdy obietnica jest utworzona, kod wykonuje się dalej, a funkcja `setTimeout` działa w tle. Gdy po upływie określonego czasu obietnica jest spełniona, następuje przekazanie wyniku do łańcucha `then`, a nie jakiegokolwiek innego miejsca w kodzie. To oznacza, że wyniki są zwracane w kolejności, w jakiej są zadeklarowane, co w tym przypadku prowadzi do wyświetlenia najpierw 'success', a potem 'first then'. Takie podejście do asynchroniczności jest fundamentalne w JavaScript, a jego zrozumienie jest kluczowe dla każdego programisty. Błędne odpowiedzi pochodzą często z mylnego przekonania, że wyniki obietnic są natychmiastowe lub że działają w tej samej kolejności, co kod synchroniczny. Dlatego ważne jest, aby zrozumieć, że asynchroniczność zmienia sposób, w jaki operacje są wykonywane i jak wyniki są zwracane.

Pytanie 30

Przedstawione kody zawierają realizację funkcji oraz jeden zdefiniowany test automatyczny, który weryfikuje działanie funkcji w przypadku, gdy argumentem jest liczba ujemna. W miejsce kropek należy dodać drugi test, który sprawdzi funkcjonalność funkcji, kiedy argumentem jest liczba dodatnia. Który z poniższych kodów jest odpowiedni do tego testu?

export function fun1(number) {
    if (number < 0)
        number = number * (-1);
    return number;
}
describe('fun1', () => {
    it('test1', () => {
        const result = fun1(-1);
        expect(result).toBe(1);
    })
    ...
})
it('test2', () => {
    const result = fun1(1);
    expect(result).toBe(result+1);
})
A.
it('test2', () => {
    const result = fun1(2);
    expect(result).toBe(-2);
})
B.
it('test2', () => {
    const result = fun1(2);
    expect(result).toBe(2);
})
C.
it('test2', () => {
    const result = fun1(1);
    expect(result).toBe(-1);
})
D.
A. Odpowiedź B
B. Odpowiedź D
C. Odpowiedź C
D. Odpowiedź A
Poprawna odpowiedź to C ponieważ funkcja fun1 zwraca liczbę taką jaka jest z wyjątkiem sytuacji gdy liczba jest ujemna wtedy zwraca jej wartość bezwzględną Test C sprawdza wartość dodatnią 2 gdzie rezultat jest zgodny z oczekiwaniami i funkcja zwraca 2 co jest poprawnym wynikiem To testowanie zgodne z zasadą jednostkowych testów gdzie ważne jest aby funkcje były testowane na różne przypadki brzegowe w tym na wartości ujemne i dodatnie Implementacja jednostkowych testów pozwala na automatyczne sprawdzanie poprawności działania kodu co jest dobrą praktyką w programowaniu Szczególnie ważne jest aby testować funkcje krytyczne i te które mają potencjał do wystąpienia błędów związanych z nieoczekiwanymi danymi wejściowymi Przykład ten pokazuje jak ważne jest aby testy były dokładne i pokrywały różnorodne scenariusze użytkowania co pozwala na wczesne wychwycenie błędów i zapewnienie stabilności aplikacji W tej sytuacji testując wartość 2 zapewniamy że funkcja zachowuje się poprawnie dla wartości dodatnich co jest zgodne z oczekiwaniami programistycznymi

Pytanie 31

Jaką rolę pełni debugger w trakcie programowania?

A. Do wykrywania błędów w czasie działania programu
B. Do kontrolowania wersji kodu źródłowego
C. Do automatycznego generowania dokumentacji projektu
D. Do konwersji kodu źródłowego na język maszynowy
Debugger to takie narzędzie, które pomaga programistom w znajdowaniu błędów i śledzeniu, co się dzieje z programem, kiedy go uruchamiamy. Można go zatrzymać w dowolnym momencie, co nazywamy breakpoints, i wtedy można zobaczyć, jakie zmienne mają jakie wartości. Dzięki temu można łatwiej dostrzegać błędy logiczne czy składniowe. Wydaje mi się, że to naprawdę ważne narzędzie w pracy każdego programisty, bo ułatwia życie!

Pytanie 32

Jakie obliczenia można wykonać za pomocą poniższego algorytmu, który operuje na dodatnich liczbach całkowitych?

Ilustracja do pytania
A. największy wspólny dzielnik wprowadzonej liczby
B. sumę cyfr wprowadzonej liczby
C. sumę wprowadzonych liczb
D. liczbę cyfr w wprowadzonej liczbie
Wybierając odpowiedź dotyczącą liczby cyfr w wprowadzonej liczbie, pokazujesz dobre zrozumienie tego, jak działa prezentowany algorytm. W praktyce bardzo często spotyka się podobne rozwiązania, gdy trzeba np. zliczyć, ile znaków ma PESEL, numer telefonu lub numer identyfikacyjny w bazie danych. Algorytm wykonuje bardzo prostą, ale jednocześnie sprytną operację – dzieli podaną liczbę przez 10 (zawsze całkowicie, bez reszty), aż ta liczba się wyzeruje. Za każdym obrotem pętli zwiększa licznik, więc po zakończeniu działania licznik wskazuje, ile razy można było podzielić liczbę przez 10, czyli ile było w niej cyfr. To dokładnie odpowiada liczbie cyfr w zapisie dziesiętnym. Podejście to jest bardzo efektywne, bo nie wymaga konwersji liczby na tekst ani używania dodatkowych struktur danych. W profesjonalnym kodzie często preferuje się takie rozwiązania – są szybkie i niezawodne. Moim zdaniem warto znać ten wzorzec, bo przydaje się zarówno w algorytmice, jak i analizie danych czy podczas implementacji walidacji pól liczbowych w bazach danych lub formularzach. Dodatkowo, zgodnie z dobrymi praktykami, algorytm nie ulega błędom związanym z nietypowymi danymi – działa dla każdej dodatniej liczby całkowitej. Warto zapamiętać takie sztuczki, bo potem życie programisty jest łatwiejsze.

Pytanie 33

Jakie narzędzie wspiera tworzenie aplikacji desktopowych?

A. Xamarin
B. Angular
C. WPF
D. Symfony
WPF, czyli Windows Presentation Foundation, to narzędzie, które zdecydowanie kojarzy się z aplikacjami desktopowymi na platformie Windows. Pozwala budować nowoczesne, bogate graficznie interfejsy użytkownika, wykorzystując deklaracyjny język XAML oraz logikę programistyczną w C#. Moim zdaniem WPF to nadal bardzo solidny wybór, jeśli chcemy robić rozbudowane aplikacje okienkowe, które muszą korzystać z możliwości systemu operacyjnego, takich jak obsługa plików, drukowanie czy integracja z innymi aplikacjami Windows. Co ciekawe, wielu dużych graczy rynkowych wciąż używa WPF w swoich rozwiązaniach – choćby aplikacje biurowe, narzędzia branżowe do projektowania graficznego, systemy zarządzania produkcją czy rozbudowane panele administracyjne. Osobiście doceniam fakt, że WPF pozwala stosować wzorzec MVVM, co w realnych projektach pomaga utrzymać kod w porządku i łatwo zarządzać złożonymi aplikacjami. No i jeszcze jedno – dzięki bogatej bazie komponentów oraz możliwości stylizacji, z WPF można wycisnąć naprawdę ciekawe UI. Warto też wiedzieć, że choć pojawiły się nowsze technologie (jak WinUI czy .NET MAUI), to w praktyce WPF jest nadal szeroko wspierany i rozwijany. Jeśli ktoś chce zacząć z aplikacjami desktopowymi na Windows, to moim zdaniem WPF to po prostu dobry start.

Pytanie 34

Co to jest klasa abstrakcyjna?

A. Klasa, która może być dziedziczona, ale nie można jej instancjonować
B. Klasa, która może zawierać zarówno metody zdefiniowane, jak i niezdefiniowane (czysto wirtualne)
C. Klasa, która nie może posiadać żadnych metod
D. Klasa, która zawsze dziedziczy z klasy bazowej
Odpowiedź „Klasa, która może być dziedziczona, ale nie można jej instancjonować” jest poprawna, ponieważ najtrafniej oddaje istotę klasy abstrakcyjnej w programowaniu obiektowym. Klasa abstrakcyjna służy jako wzorzec lub szablon dla klas pochodnych, określając wspólne cechy i zachowania, które powinny zostać zaimplementowane w klasach dziedziczących. Nie tworzy się z niej bezpośrednio obiektów, ponieważ sama w sobie nie reprezentuje kompletnego bytu, lecz raczej koncepcję lub ogólny typ. Dzięki temu mechanizmowi programista może narzucić strukturę kodu, zwiększyć jego czytelność oraz ułatwić dalsze rozszerzanie aplikacji. Takie podejście sprzyja stosowaniu zasad programowania obiektowego, takich jak dziedziczenie i polimorfizm, a także pomaga w tworzeniu bardziej uporządkowanych i łatwiejszych w utrzymaniu projektów.

Pytanie 35

W którym przypadku algorytm sortowania bąbelkowego działa z optymalną wydajnością?

A. Dla tablicy uporządkowanej rosnąco
B. Dla tablicy uporządkowanej malejąco
C. Dla tablicy z dużą liczbą powtórzeń
D. Dla tablicy losowej
Algorytm sortowania bąbelkowego działa z optymalną wydajnością w przypadku, gdy tablica jest już posortowana rosnąco. W takiej sytuacji algorytm wykona jedynie jedno przejście przez tablicę, bez konieczności dokonywania zamian, co sprawia, że jego złożoność wynosi O(n). To znacząco zwiększa jego efektywność w przypadku niemal posortowanych danych, choć nadal pozostaje mniej wydajny niż algorytmy takie jak QuickSort czy MergeSort dla dużych zbiorów. Sortowanie bąbelkowe jest jednak łatwe do zrozumienia i implementacji, co czyni je popularnym narzędziem edukacyjnym.

Pytanie 36

Na ilustracji pokazano fragment emulacji iOS z elementem kontrolnym. Który fragment kodu XAML opisuje ten element?

Ilustracja do pytania
A. <Switch IsToggled= "true" />
B. <Entry IsPassword= "true" />
C. <Slider Maximum= "255" />
D. <Stepper Increment= "1" />
Kontrolka <Switch IsToggled= "true" /> w XAML to taki przełącznik. Ma dwa stany: włączony (true) i wyłączony (false). Można to porównać do zwykłego włącznika, tylko że w aplikacjach. Fajnie się z tego korzysta, bo pozwala szybko zmieniać ustawienia, nie trzeba nic więcej wpisywać. To jest dosyć intuicyjne dla użytkowników, więc można nim łatwo zarządzać funkcjami aplikacji.

Pytanie 37

Który z wymienionych mechanizmów pozwala na monitorowanie stanu użytkownika w trakcie sesji w aplikacji internetowej?

A. CSS Selectors
B. Sesje (Sessions)
C. HTTP Headers
D. HTML Forms
Sesje (sessions) to mechanizm wykorzystywany w aplikacjach webowych do śledzenia stanu użytkownika podczas sesji przeglądania. Sesje umożliwiają przechowywanie danych użytkownika na serwerze przez określony czas i identyfikowanie go za pomocą unikalnego identyfikatora (session ID), który jest zwykle przechowywany w ciasteczkach. Mechanizm sesji pozwala na implementację logowania, koszyków zakupowych oraz innych funkcji, które wymagają zachowania stanu między żądaniami HTTP. Sesje są kluczowe dla aplikacji wymagających autoryzacji i autentykacji, ponieważ umożliwiają śledzenie działań użytkownika bez konieczności wielokrotnego logowania. Zastosowanie sesji w aplikacjach zwiększa bezpieczeństwo i poprawia komfort użytkowania, a także umożliwia personalizację treści w czasie rzeczywistym.

Pytanie 38

Jaki jest podstawowy okres ochrony autorskich praw majątkowych w krajach Unii Europejskiej?

A. Bezterminowo
B. 75 lat od daty powstania utworu
C. 50 lat od chwili pierwszej publikacji utworu
D. 70 lat od zgonu autora
Podstawowy czas trwania autorskich praw majątkowych w Unii Europejskiej wynosi 70 lat od śmierci autora. Oznacza to, że przez ten okres twórca lub jego spadkobiercy mają wyłączne prawo do korzystania z utworu i czerpania z niego korzyści finansowych. Po upływie tego czasu dzieło przechodzi do domeny publicznej i może być swobodnie wykorzystywane przez każdego, bez konieczności uzyskania zgody. Długość ochrony praw autorskich została ujednolicona w ramach przepisów UE, aby zagwarantować spójność w całej wspólnocie i wspierać ochronę kultury oraz dziedzictwa narodowego.

Pytanie 39

Co to jest Cypress?

A. Narzędzie do kompilacji kodu TypeScript
B. System zarządzania bazami danych dla aplikacji mobilnych
C. Framework do testowania end-to-end aplikacji webowych
D. Biblioteka komponentów UI dla React
Cypress to popularny framework do testowania aplikacji webowych, skoncentrowany na testach end-to-end, co oznacza, że pozwala na symulowanie rzeczywistego użytkownika w interakcji z aplikacją. Jego architektura oparta na JavaScript i łatwość integracji z innymi narzędziami sprawiają, że jest chętnie wybierany przez zespoły developerskie. Cypress umożliwia szybkie pisanie testów, które mogą być uruchamiane bezpośrednio w przeglądarce, co ułatwia debugowanie. Przykładem zastosowania może być testowanie formularzy na stronie internetowej, gdzie można sprawdzić, czy wszystkie pola działają poprawnie, czy błędne dane są odpowiednio walidowane oraz czy interfejs użytkownika reaguje jak oczekiwano. Dobrą praktyką jest pisanie testów w sposób, który odzwierciedla rzeczywiste scenariusze użytkowników, co zwiększa jakość i niezawodność aplikacji. Cypress zyskał uznanie w branży dzięki swojej wydajności i możliwościom wizualizacji testów, co czyni go jednym z wiodących narzędzi w obszarze automatyzacji testów.

Pytanie 40

Do form komunikacji werbalnej zalicza się

A. gestykulacja
B. mówienie
C. wyraz twarzy
D. pozycja ciała
Mówienie to podstawowa forma komunikacji werbalnej – bez tego ciężko byłoby przekazać bardziej złożone treści, polecenia czy po prostu podzielić się informacjami w jasny i jednoznaczny sposób. Właśnie dlatego w większości branż technicznych, niezależnie czy rozmawiamy o pracy na budowie, czy w biurze projektowym, umiejętność jasnego i zrozumiałego mówienia jest często kluczowa. W praktyce komunikacja werbalna opiera się na słowach, które przekazujemy ustnie. Moim zdaniem najważniejsze jest to, że pozwala uniknąć nieporozumień i usprawnia współpracę w zespole – szczególnie gdy pracujemy przy dużych projektach, gdzie każdy detal ma znaczenie. W codziennych sytuacjach, takich jak prowadzenie spotkań, omawianie problemów technicznych czy instruowanie nowych pracowników, mówienie okazuje się nieocenione. Dodatkowo, standardy komunikacji interpersonalnej podkreślają, że skuteczny przekaz werbalny wymaga nie tylko odpowiedniego doboru słów, ale też umiejętności dostosowania tonu głosu i tempa mówienia do sytuacji. Warto też pamiętać, że mowa ludzka jest najdokładniejszym narzędziem do przekazywania informacji, bo daje możliwość dopytania, wyjaśnienia i natychmiastowej korekty, czego raczej nie da się osiągnąć tylko poprzez gesty czy mimikę. Z mojego doświadczenia wynika, że inwestowanie w rozwój umiejętności werbalnych zwraca się bardzo szybko w pracy technika czy specjalisty.