Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 12 czerwca 2026 07:44
  • Data zakończenia: 12 czerwca 2026 07:44

Egzamin niezdany

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

Wymagane minimum: 20 punktów (50%)

Udostępnij swój wynik
Szczegółowe wyniki:
Pytanie 1

Który z wymienionych typów kolekcji pozwala na dostęp do ostatnio dodanego elementu w pierwszej kolejności?

A. Lista
B. Tablica dwuwymiarowa
C. Kolejka
D. Stos

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Stos to struktura danych działająca na zasadzie LIFO (Last In First Out), co oznacza, że ostatnio dodany element jest usuwany jako pierwszy. Stos znajduje zastosowanie w implementacji mechanizmu wywołań rekurencyjnych, zarządzaniu pamięcią oraz w operacjach związanych z cofaniem i przywracaniem stanu (np. cofanie operacji w edytorach tekstów). Dzięki swojej prostocie stosy są fundamentalnym elementem w programowaniu, szczególnie w językach niskopoziomowych.

Pytanie 2

Błędy w interpretacji kodu stworzonego za pomocą React.js lub Angular można wykryć dzięki

A. narzędziom zainstalowanym po stronie serwera aplikacji
B. kompilatorowi języka JavaScript
C. konsoli przeglądarki internetowej
D. wbudowanemu debuggerowi w danym środowisku

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Konsola przeglądarki to naprawdę super narzędzie do śledzenia błędów w JavaScript, a szczególnie przydatna jest, gdy piszemy coś w React.js albo Angular. Dzięki niej możesz łatwo sprawdzać logi i błędy, a nawet na żywo testować różne fragmenty swojego kodu. To naprawdę szybki sposób, żeby znaleźć problemy, bez potrzeby grzebania w całym kodzie aplikacji.

Pytanie 3

Jakiego kodu dotyczy treść wygenerowana w trakcie działania programu Java?

Ilustracja do pytania
A. Kodu 2
B. Kodu 3
C. Kodu 1
D. Kodu 4

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
W przypadku kodu 4 mamy do czynienia z operatorem modulo zastosowanym na zmiennych x i y. Wiąże się to z próbą podziału przez zero co w języku Java skutkuje wygenerowaniem wyjątku java.lang.ArithmeticException. Przykładowo jeśli y wynosi zero to operacja x % y jest niedozwolona i spowoduje wyjątek. Rozumienie jak bezpiecznie wykonywać operacje arytmetyczne w Javie jest kluczowe dla unikania takich błędów. Zgodnie z dobrymi praktykami należy zawsze sprawdzać wartości zmiennych przed wykonaniem operacji matematycznych które mogą prowadzić do błędów wykonania programu. Ważne jest aby stosować techniki obsługi wyjątków try-catch które pozwalają na przechwycenie i odpowiednie zarządzanie błędami. Używanie odpowiednich testów jednostkowych może pomóc w wcześniejszym wykryciu takich problemów co jest standardem w branży programistycznej. Zrozumienie obsługi błędów w programowaniu pozwala na tworzenie bardziej niezawodnych i odpornych na błędy aplikacji co jest istotnym aspektem pracy profesjonalnego programisty.

Pytanie 4

Jakie narzędzie można wykorzystać do tworzenia aplikacji mobilnych typu cross-platform w C#?

A. środowisko XCode
B. platformę Xamarin
C. środowisko Android Studio
D. platformę React Native

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Xamarin to potężna platforma do tworzenia aplikacji mobilnych typu cross-platform w języku C#. Dzięki wykorzystaniu technologii .NET, deweloperzy mogą pisać kod raz, a następnie wdrażać go na różnych systemach operacyjnych, takich jak iOS i Android. Xamarin umożliwia korzystanie z natywnych interfejsów użytkownika oraz dostęp do funkcji urządzeń mobilnych, co zapewnia dużą wydajność i płynność działania aplikacji. Przykładowo, aplikacja stworzona w Xamarinie może korzystać z natywnych komponentów UI, co pozwala na zachowanie specyficznych dla platformy wzorców interakcji oraz UX. Dzięki wsparciu dla C# i .NET, deweloperzy mogą również łatwo integrować istniejące biblioteki oraz korzystać z ekosystemu .NET, co znacząco przyspiesza proces deweloperski. Warto również zaznaczyć, że Xamarin jest zgodny z wieloma standardami, co ułatwia współpracę w zespołach projektowych oraz utrzymanie kodu na dłuższą metę.

Pytanie 5

Która metoda w obrębie klasy jest uruchamiana automatycznie podczas tworzenia kopii obiektu?

A. Konstruktor kopiujący
B. Metoda zaprzyjaźniona
C. Destruktor
D. Metoda statyczna

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Konstruktor kopiujący to taka specyficzna metoda w klasie, która działa, kiedy robimy nowy obiekt jako kopię już istniejącego. Dzięki temu możemy skopiować wartości pól z jednego obiektu do drugiego. To naprawdę ważne, zwłaszcza gdy mówimy o zarządzaniu pamięcią. Na przykład w C++ może to wyglądać tak: `Samochod(const Samochod &inny) { marka = inny.marka; przebieg = inny.przebieg; }`. Konstruktor kopiujący ma na celu uniknięcie problemów związanych z tzw. płytkim kopiowaniem, co może prowadzić do różnych błędów, jak wielokrotne zwolnienie tej samej pamięci. Generalnie mówiąc, jest to kluczowy mechanizm, który pomaga utrzymać bezpieczeństwo i poprawność działania naszej aplikacji.

Pytanie 6

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

A. Inicjuje obiekt klasy na podstawie klasy dziedziczącej
B. Generuje nowy obiekt klasy bez przypisywania wartości
C. Generuje nowy obiekt i usuwa wcześniejszy
D. Tworzy nowy obiekt jako wierną kopię innego obiektu

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
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 7

Jaki typ testów ocenia funkcjonalność aplikacji z punktu widzenia użytkownika końcowego?

A. Testy obciążeniowe
B. Testy zgodności
C. Testy użyteczności
D. Testy funkcjonalne

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Testy użyteczności to kluczowy element w procesie tworzenia aplikacji, który koncentruje się na analizie i ocenie interakcji użytkownika z produktem. Celem testów użyteczności jest sprawdzenie, jak łatwa i intuicyjna w obsłudze jest aplikacja, czy użytkownik jest w stanie efektywnie osiągnąć swoje cele oraz jakie są potencjalne bariery w korzystaniu z aplikacji. Testy te dostarczają cennych informacji na temat UX (User Experience) i pozwalają na wczesne wykrycie problemów związanych z designem oraz funkcjonalnością.

Pytanie 8

Co oznacza termin 'hoisting' w JavaScript?

A. Przenoszenie deklaracji zmiennych i funkcji na górę ich zakresu podczas fazy kompilacji
B. Optymalizacja kodu wykonywana przez silnik JavaScript
C. Metoda ładowania skryptów z zewnętrznych źródeł
D. Technika zarządzania pamięcią polegająca na usuwaniu nieużywanych obiektów

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Termin 'hoisting' w JavaScript odnosi się do mechanizmu, który przenosi deklaracje zmiennych oraz funkcji na górę ich zakresu, zanim kod zostanie wykonany. To oznacza, że zmienne i funkcje mogą być używane przed ich faktycznym zadeklarowaniem w kodzie. Dla zmiennych zadeklarowanych za pomocą 'var', ich deklaracja jest unoszona, ale nie inicjalizacja. To oznacza, że można odwołać się do zmiennej przed jej przypisaniem, ale jej wartość będzie 'undefined'. W przypadku funkcji, cała deklaracja jest przenoszona, co pozwala na wywoływanie funkcji przed ich zdefiniowaniem. Przykład takiego działania to: `console.log(a); var a = 5;` - w tym przypadku, logowanie zmiennej 'a' przed przypisaniem zwróci 'undefined'. Zrozumienie hoistingu jest kluczowe dla pisania poprawnego i czytelnego kodu w JavaScript oraz unikania pułapek, które mogą prowadzić do trudnych do wykrycia błędów. Holistyczne podejście do hoistingu zachęca programistów do stosowania deklaracji na początku funkcji lub skryptu, co poprawia przejrzystość i zarządzanie zakresem w kodzie.

Pytanie 9

Która z dokumentacji funkcji odpowiada przedstawionemu kodowi źródłowemu?

static int Abs(int liczba)
{
    if (liczba < 0)
        liczba *= -1;
    return liczba;
}
Dokumentacja 1:
/*******************
* nazwa: Abs
* opis: liczy wartość bezwzględną
* zwracana: brak
* argumenty: liczba całkowita
*******************/
Dokumentacja 2:
/*******************
* nazwa: Abs
* opis: liczy wartość bezwzględną
* zwracana: wartość bezwzględna z liczby całkowitej
* argumenty: liczba całkowita
*******************/
Dokumentacja 3:
/*******************
* nazwa: Abs
* opis: liczy potęgę liczby
* zwracana: potęga z liczby całkowitej
* argumenty: dwie liczby całkowite
*******************/
Dokumentacja 4:
/*******************
* nazwa: Abs
* opis: liczy potęgę liczby
* zwracana: potęga z liczby całkowitej
* argumenty: liczba całkowita
*******************/
A. Dokumentacja 4
B. Dokumentacja 3
C. Dokumentacja 2
D. Dokumentacja 1

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Dokumentacja 2 zdecydowanie najlepiej pasuje do przedstawionej funkcji. Zwróć uwagę, że sama definicja funkcji „Abs” w kodzie przyjmuje jeden argument typu całkowitego (int) i zwraca także liczbę całkowitą. Jej zadaniem jest zwrócenie wartości bezwzględnej tej liczby, co dokładnie opisuje fragment: „zwracana: wartość bezwzględna z liczby całkowitej”. To bardzo ważne, bo w programowaniu – a szczególnie w językach takich jak C# czy C++ – jasna i kompletna dokumentacja pozwala potem innym korzystać z funkcji bez konieczności zaglądania do jej wnętrza. W praktyce, takie szczegółowe opisywanie co zwraca dana funkcja i jakie przyjmuje argumenty, znacznie przyspiesza pracę w większych zespołach. Standardem branżowym jest właśnie precyzyjne określanie typu zwracanego i opisu działania, a nie tylko suchy komentarz typu „zwraca: brak” (co byłoby niezgodne z kodem!). Co ciekawe, w wielu firmach stosuje się rozbudowane systemy dokumentacji (np. Doxygen czy XML doc w .NET), które niejako wymuszają takie dokładne opisy. Osobiście uważam, że przyzwyczajenie się do dobrych praktyk dokumentowania funkcji już na etapie nauki procentuje w przyszłości – mniej pytań w zespole, mniej nieporozumień. Ta konkretna dokumentacja spełnia wszystkie kluczowe kryteria: podaje nazwę, precyzyjny opis, prawidłowy typ zwracanej wartości oraz właściwy typ i opis argumentu. Idealnie odzwierciedla, co robi ten fragment kodu, a to podstawa w pisaniu czytelnych i bezpiecznych aplikacji.

Pytanie 10

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

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
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 11

Co to jest lazy loading w kontekście ładowania obrazów na stronie?

A. Format przechowywania obrazów w pamięci podręcznej przeglądarki
B. Technika ładowania obrazów dopiero w momencie, gdy stają się widoczne dla użytkownika
C. Protokół transferu obrazów między serwerem a przeglądarką
D. Metoda kompresji obrazów przed wysłaniem na serwer

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Lazy loading to technika, która pozwala na ładowanie obrazów oraz innych zasobów dopiero w momencie, gdy stają się one widoczne dla użytkownika na ekranie. Dzięki temu oszczędzamy zasoby sieciowe i poprawiamy czas ładowania strony, co jest szczególnie istotne w kontekście optymalizacji SEO oraz doświadczenia użytkownika. Na przykład, w przypadku długiej strony internetowej z wieloma obrazami, lazy loading sprawia, że podczas przewijania strony obrazy nie są ładowane od razu, co zmniejsza obciążenie serwera i przyspiesza wczytywanie widocznych części strony. W praktyce można zastosować atrybuty takie jak "loading='lazy'" w znaczniku <img>, co jest zgodne z nowoczesnymi standardami HTML. Ponadto, wiele bibliotek i frameworków, jak np. Intersection Observer API, umożliwia zaawansowaną implementację lazy loadingu, co sprawia, że jest to obecnie powszechnie stosowana praktyka.

Pytanie 12

Jakie rezultaty pojawią się po uruchomieniu poniższego kodu napisanego w języku C++?

class KlasaBazowa {
    public:
        virtual void metoda() {
            cout << "Bazowa. ";
        }
};

class KlasaPochodna : public KlasaBazowa {
    public:
        void metoda() {
            cout << "Pochodna. ";
        }
};

int main() {
    KlasaBazowa *bazowa = new KlasaPochodna();
    KlasaPochodna *pochodna = new KlasaPochodna();

    bazowa->metoda();
    pochodna->metoda();
    return 0;
}
A. Bazowa. Bazowa.
B. Pochodna. Bazowa.
C. Pochodna. Pochodna.
D. Bazowa. Pochodna.

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Kod wyświetla 'Pochodna. Pochodna.', co wskazuje, że metody klasy pochodnej przejęły kontrolę nad tymi z klasy bazowej. To fajny przykład polimorfizmu, jaki mamy w C++. Tutaj metoda w klasie pochodnej jest lepsza od metody w klasie bazowej. To, jakie wywołanie się wykona, zależy od konkretnego obiektu, a nie od tego, jaką metodę zdefiniowaliśmy w klasie bazowej.

Pytanie 13

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

A. formatu JSON
B. protokołu SSH
C. biblioteki jQuery
D. metody POST

Brak odpowiedzi na to pytanie.

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

Pytanie 14

W zestawieniu przedstawiono doświadczenie zawodowe członków zespołu IT. Osobą odpowiedzialną za stworzenie aplikacji front-end powinna być:

PracownikZnajomość technologii/programów
AnnaInscape, Corel Draw
KrzysztofAngular
PatrykHTML, CSS
EwaDjango, .NET
A. Patryk
B. Krzysztof
C. Anna
D. Ewa

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wybór Krzysztofa jako osoby odpowiedzialnej za stworzenie aplikacji front-end jest zdecydowanie trafiony. Angular to obecnie jedno z najpopularniejszych frameworków do budowy zaawansowanych aplikacji webowych, które wykorzystują wiele komponentów, obsługują dynamiczne interfejsy użytkownika i muszą być skalowalne. Angular pozwala efektywnie zarządzać logiką front-endu, stanami aplikacji oraz integracją z backendem. Z mojego doświadczenia wynika, że osoby znające Angulara są w stanie nie tylko napisać klasyczny interfejs w HTML i CSS, ale również wdrożyć bardziej rozbudowane rozwiązania zgodne ze współczesnymi standardami, takimi jak SPA (single-page application). Praktyka pokazuje, że projekty front-endowe na dużą skalę, bez frameworków takich jak Angular, React czy Vue, bardzo szybko stają się nieczytelne i trudne w utrzymaniu. Krzysztof, mając doświadczenie z Angularem, będzie też znał TypeScript, który jest już właściwie standardem w dużych projektach front-endowych. To daje też lepszą kontrolę nad błędami i czytelność kodu, a to się liczy w zespole. Co ciekawe, w ofertach pracy na front-end developera, znajomość Angulara jest jednym z najczęściej wymienianych wymagań, właśnie przez wzgląd na szeroki zakres zastosowań i wsparcie społeczności. Tak naprawdę, jeżeli zależy nam na wydajnym, nowoczesnym i dobrze zaprojektowanym interfejsie użytkownika, Krzysztof jest tutaj najlepszym wyborem. Często początkujący myślą, że wystarczy sam HTML i CSS, ale prawdziwa praca front-endowca to już zupełnie wyższa liga. Szczerze mówiąc, mając taką osobę w zespole, można spać spokojnie, że front-end będzie wykonany zgodnie z branżowymi standardami.

Pytanie 15

Które z wymienionych środowisk programistycznych jest rekomendowane do developing aplikacji w języku Python z użyciem frameworka Django?

A. XCode
B. Android Studio
C. Unity
D. PyCharm

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
PyCharm to jedno z najbardziej zaawansowanych środowisk programistycznych (IDE) dedykowanych do tworzenia aplikacji w języku Python. Jest to narzędzie preferowane przez programistów korzystających z frameworka Django, który jest popularnym rozwiązaniem do budowy aplikacji webowych. PyCharm oferuje rozbudowane wsparcie dla Django, umożliwiając szybkie tworzenie projektów, integrację z bazami danych oraz wygodne debugowanie aplikacji. IDE zapewnia również możliwość uruchamiania serwerów deweloperskich, podglądu zmian w czasie rzeczywistym oraz automatyczne uzupełnianie kodu, co znacząco zwiększa efektywność pracy nad aplikacjami webowymi. Dzięki PyCharm programiści mogą łatwo zarządzać migracjami bazy danych, tworzyć modele i szablony, co sprawia, że jest to narzędzie nieocenione w ekosystemie Django.

Pytanie 16

Jakie są kluczowe etapy resuscytacji krążeniowo-oddechowej?

A. 30 uciśnięć klatki piersiowej na przemian z 2 wdechami ratowniczymi
B. 20 uciśnięć klatki piersiowej na przemian z 5 wdechami ratowniczymi
C. 10 uciśnięć klatki piersiowej bez wdechów
D. 30 wdechów ratowniczych bez uciśnięć

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
30 uciśnięć klatki piersiowej na przemian z 2 wdechami ratowniczymi to standardowy protokół resuscytacji krążeniowo-oddechowej (RKO) zgodny z wytycznymi Europejskiej Rady Resuscytacji (ERC). Uciśnięcia wykonywane są na głębokość około 5-6 cm w tempie 100-120 uciśnięć na minutę. Po 30 uciśnięciach wykonuje się 2 wdechy ratownicze, które powinny być wykonywane z odpowiednią siłą, aby unieść klatkę piersiową poszkodowanego. Taka sekwencja jest podstawą pierwszej pomocy i może uratować życie osoby, u której doszło do zatrzymania akcji serca. Resuscytację należy kontynuować do momentu przybycia służb ratunkowych lub odzyskania przytomności przez poszkodowanego.

Pytanie 17

Która z poniższych metod najlepiej nadaje się do wizualnego przedstawienia procesu decyzyjnego?

A. Lista kroków
B. Schemat blokowy
C. Drzewo decyzyjne
D. Pseudokod

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Drzewo decyzyjne to rzeczywiście najlepsza metoda wizualnego przedstawienia procesu decyzyjnego, ponieważ zostało stworzone dokładnie w tym celu. Jego struktura hierarchiczna idealnie oddaje naturę podejmowania decyzji - zaczynamy od głównego problemu, a następnie rozgałęziamy się na kolejne możliwości w zależności od wybranych opcji. Drzewo decyzyjne pozwala na przejrzyste zobrazowanie wszystkich możliwych ścieżek, jakie może obrać proces w zależności od podjętych wyborów. Każdy węzeł reprezentuje punkt decyzyjny, gałęzie symbolizują dostępne opcje, a liście pokazują końcowe rezultaty. Dzięki temu można łatwo analizować konsekwencje każdej decyzji i porównywać różne scenariusze. Ta metoda znajduje szerokie zastosowanie w biznesie, medycynie, informatyce oraz analizie ryzyka. Pamiętaj o tej wiedzy - umiejętność wyboru odpowiedniego narzędzia wizualizacji jest kluczowa w pracy analitycznej.

Pytanie 18

Co to jest shadow DOM?

A. Technika stylizacji elementów w CSS przy użyciu cieni
B. Metoda renderowania grafiki 3D w przeglądarkach
C. Wirtualny DOM używany przez biblioteki jak React i Vue.js
D. Mechanizm enkapsulacji kodu HTML, CSS i JavaScript w komponenty webowe

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Shadow DOM to technika pozwalająca na enkapsulację kodu HTML, CSS oraz JavaScript w komponentach webowych, co jest kluczowe w kontekście tworzenia aplikacji opartych na Web Components. Dzięki zastosowaniu Shadow DOM, elementy wewnętrzne komponentu są izolowane od reszty dokumentu, co eliminuje problemy z kolizjami nazw klas CSS oraz pozwala na tworzenie bardziej modularnych i wielokrotnego użytku elementów. Przykładem zastosowania Shadow DOM mogą być komponenty interfejsu użytkownika, takie jak przyciski czy karty, które zawierają własne style i logikę, nie wpływając na globalne style strony. To podejście jest wspierane przez standardy W3C i zalecane w projektach, gdzie skala i złożoność aplikacji wymaga wysokiej wydajności i organizacji kodu. Dobrze zaprojektowane komponenty z użyciem Shadow DOM mogą znacznie uprościć rozwój i utrzymanie aplikacji webowych, czyniąc je bardziej responsywnymi i dostosowanymi do różnych środowisk.

Pytanie 19

Który element HTML5 służy do osadzania wideo na stronie?

A. &lt;player&gt;
B. &lt;movie&gt;
C. &lt;video&gt;
D. &lt;media&gt;

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Element HTML5 &lt;video&gt; jest standardowym tagiem służącym do osadzania wideo na stronach internetowych. Umożliwia on integrację multimediów w sposób, który jest zgodny z aktualnymi standardami sieciowymi. W porównaniu do starszych metod, które wymagały użycia zewnętrznych wtyczek, takich jak Flash, &lt;video&gt; pozwala na bezproblemowe odtwarzanie wideo w przeglądarkach nowej generacji, co zwiększa bezpieczeństwo i wydajność. Element ten oferuje wiele atrybutów, takich jak controls, autoplay, loop, preload, oraz width i height, które pozwalają na dostosowanie odtwarzacza do potrzeb użytkownika. Na przykład, używając atrybutu controls, można dodać przyciski odtwarzania, zatrzymywania lub regulacji głośności, co poprawia interaktywność i użyteczność. Dodatkowo, aby zapewnić dostępność treści wideo, warto stosować atrybuty takie jak &lt;track&gt;, który umożliwia dodawanie napisów, co jest szczególnie ważne dla osób z niepełnosprawnościami słuchowymi. Używanie &lt;video&gt; w projektach webowych to najlepsza praktyka, która wspiera rozwój dostępnych i przyjaznych dla użytkownika doświadczeń wizualnych.

Pytanie 20

Algorytmu Euklidesa, przedstawionego na schemacie, należy użyć do obliczenia.

Ilustracja do pytania
A. największego elementu w zbiorze liczb
B. Najmniejszej Wspólnej Wielokrotności
C. Największego Wspólnego Dzielnika
D. najmniejszej liczby pierwszej w danym zakresie

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Algorytm Euklidesa to klasyczna metoda stosowana do wyznaczania największego wspólnego dzielnika (NWD) dwóch liczb całkowitych. Działa na zasadzie iteracyjnego odejmowania mniejszej liczby od większej aż do momentu, gdy obie liczby staną się równe. Wtedy ta wspólna wartość jest największym wspólnym dzielnikiem. Algorytm jest bardzo efektywny, nawet dla dużych liczb, co czyni go powszechnie stosowanym w praktycznych zastosowaniach, takich jak kryptografia czy optymalizacja komputerowa. W kryptografii, szczególnie w systemach kluczy publicznych, takich jak RSA, obliczanie NWD jest kluczowe dla generowania kluczy. Algorytm Euklidesa jest też podstawą dla bardziej zaawansowanych algorytmów, takich jak rozszerzony algorytm Euklidesa, który umożliwia obliczenie również współczynników liczbowych używanych w teoretycznych dowodach matematycznych. Jego implemetacja jest również często wykorzystywana w bibliotekach matematycznych języków programowania, co świadczy o jego uniwersalności i znaczeniu w dzisiejszej technologii.

Pytanie 21

Do implementacji w aplikacji jednokierunkowej funkcji skrótu, zwanej funkcją haszującą, można wykorzystać algorytm

A. MD5
B. DES
C. AES
D. RSA

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
MD5 to przykład klasycznej funkcji skrótu, czyli właśnie tej funkcji, która generuje z dowolnie długych danych wejściowych stałej długości skrót (hash). Funkcje haszujące są szeroko stosowane w informatyce, szczególnie tam, gdzie potrzebna jest szybka weryfikacja integralności danych albo przechowywanie haseł w bazie danych w sposób bezpieczny (chociaż MD5 dziś już nie poleca się do haseł przez znane luki bezpieczeństwa – lepsze są SHA-256 czy bcrypt). To, co wyróżnia funkcje skrótu jak MD5, to ich jednokierunkowość: znając wynik, praktycznie nie jesteśmy w stanie odtworzyć oryginalnych danych wejściowych, a nawet minimalnie różniące się dane dają zupełnie inne hashe. Przykład praktyczny? Sprawdzenie sumy kontrolnej pliku po pobraniu z internetu – porównujemy hash MD5 z podanym na stronie wydawcy i mamy pewność, że plik nie został podmieniony. W praktyce branżowej, zgodnie z normami bezpieczeństwa jak np. ISO/IEC 27001, funkcje haszujące są podstawą wielu procesów kryptograficznych. Moim zdaniem, znajomość takich algorytmów jak MD5, nawet jeśli już nie jest zalecany w nowych systemach, to podstawa do zrozumienia ogólnego działania funkcji skrótu i różnicy między nimi a szyfrowaniem. Często spotykałem się z myleniem tych pojęć, więc warto to dobrze rozumieć.

Pytanie 22

Jakie z wymienionych funkcji są typowe dla narzędzi służących do zarządzania projektami?

A. Opracowywanie diagramów przepływu
B. Tworzenie interfejsu użytkownika
C. Przeprowadzanie analizy statystycznej
D. Nadzorowanie postępu realizacji

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Monitorowanie postępu prac to jedna z kluczowych funkcji narzędzi do zarządzania projektami. Dzięki temu zespoły mogą śledzić realizację zadań, identyfikować opóźnienia oraz efektywnie alokować zasoby. Narzędzia takie jak Jira, Trello czy Asana pozwalają na wizualizację postępów, co ułatwia kontrolowanie harmonogramu oraz planowanie kolejnych etapów projektu. Monitorowanie postępu prac pomaga także w wykrywaniu wąskich gardeł i umożliwia szybkie podejmowanie decyzji, co znacząco zwiększa efektywność całego zespołu. Funkcja ta jest szczególnie istotna w zarządzaniu projektami IT, budowlanymi i kreatywnymi, gdzie koordynacja wielu zadań jest kluczowa dla sukcesu projektu.

Pytanie 23

Jednym z kroków przy publikacji aplikacji mobilnej w sklepie Google Play są testy Beta, które charakteryzują się tym, że są one

A. realizowane przez zespół testerów zatrudnionych przez firmę Google
B. podzielone na testy funkcjonalne, wydajnościowe oraz skalowalności
C. przeprowadzane przez grupę docelowych użytkowników aplikacji
D. przeprowadzane na podstawie dokumentu zawierającego przypadki testowe

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Testy Beta są kluczowym etapem w procesie publikacji aplikacji mobilnej w sklepie Google Play, ponieważ pozwalają na uzyskanie cennych informacji zwrotnych od rzeczywistych użytkowników aplikacji. W tej fazie aplikacja jest udostępniana ograniczonej grupie docelowych użytkowników, którzy są zainteresowani testowaniem oprogramowania przed jego oficjalnym wydaniem. Użytkownicy ci mają możliwość zgłaszania błędów, proponowania ulepszeń oraz oceny funkcjonalności, co jest niezwykle ważne, aby zapewnić, że produkt spełnia wymagania rynku. Przykładem zastosowania testów Beta może być aplikacja społecznościowa, która w pierwszej fazie testowania pozwala wybranej grupie użytkowników na dzielenie się swoimi doświadczeniami. Otrzymane dane są następnie analizowane w celu wprowadzenia niezbędnych poprawek przed pełnym wprowadzeniem aplikacji na rynek. Ponadto, przeprowadzanie testów Beta jest zgodne z najlepszymi praktykami w branży oprogramowania, zgodnie z metodykami Agile, które podkreślają znaczenie interakcji z użytkownikami oraz ich wkładu w rozwój produktów.

Pytanie 24

Które z wymienionych stanowi przykład zagrożenia fizycznego w miejscu pracy?

A. Brak ergonomicznych miejsc pracy
B. Obciążenie psychiczne
C. Nieodpowiednie relacje w zespole
D. Promieniowanie UV

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Zagrożenia fizyczne w środowisku pracy obejmują czynniki, które mogą prowadzić do obrażeń ciała lub problemów zdrowotnych. Przykładem takiego zagrożenia jest promieniowanie UV, które może powodować oparzenia skóry, uszkodzenia oczu oraz zwiększać ryzyko nowotworów skóry. Ochrona przed promieniowaniem UV jest kluczowa w zawodach wymagających pracy na zewnątrz lub przy urządzeniach emitujących intensywne światło UV. Stosowanie odpowiednich środków ochrony, takich jak okulary przeciwsłoneczne z filtrem UV, odzież ochronna i kremy z filtrem, jest niezbędne do minimalizacji ryzyka. Pracodawcy są zobowiązani do wdrażania procedur bezpieczeństwa i zapewniania odpowiednich środków ochrony pracowników narażonych na działanie promieniowania UV.

Pytanie 25

Jaką cechę powinien posiadać dobry negocjator?

A. brak pewności
B. myślenie tylko o sobie
C. przechwalanie się
D. spokój

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Cechą dobrego negocjatora jest opanowanie, które odgrywa kluczową rolę w procesie negocjacji. Osoba potrafiąca zachować spokój w trudnych sytuacjach może lepiej ocenić sytuację, zrozumieć potrzeby drugiej strony oraz zidentyfikować potencjalne punkty konfliktu. Opanowanie pozwala na skuteczne zarządzanie emocjami, co jest niezbędne w celu osiągnięcia korzystnych rezultatów. Przykładem może być sytuacja, w której negocjator musi zmierzyć się z agresywnym przeciwnikiem; zachowanie zimnej krwi pozwala na analizę sytuacji bez emocjonalnych impulsów. Ponadto, opanowanie wpływa na postrzeganie osoby negocjującej przez innych, budując zaufanie i respekt. W kontekście standardów negocjacyjnych, takich jak BATNA (Best Alternative to a Negotiated Agreement), opanowanie umożliwia lepsze podejmowanie decyzji w trudnych sytuacjach. Dlatego umiejętność zachowania spokoju jest fundamentem skutecznych negocjacji.

Pytanie 26

Jaki środek ochronny najlepiej chroni przed hałasem w biurze?

A. Okna zamknięte
B. Lampy biurowe o niskim poziomie natężenia światła
C. Panele akustyczne wygłuszające
D. Mata antypoślizgowa

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wygłuszające panele akustyczne to jedno z najlepszych rozwiązań w celu ograniczenia hałasu w biurach i innych miejscach pracy. Panele te redukują odbicia dźwięku i zmniejszają natężenie hałasu, co przekłada się na poprawę koncentracji oraz zmniejszenie zmęczenia i stresu. W biurach typu open space panele akustyczne znacząco poprawiają komfort pracy, umożliwiając prowadzenie rozmów bez nadmiernego zakłócania pracy innych osób. Dodatkowo, wygłuszenie pomaga w ochronie zdrowia pracowników, redukując ryzyko utraty słuchu w miejscach, gdzie występuje wysoki poziom hałasu. Odpowiednie rozmieszczenie paneli pozwala także na lepsze zarządzanie akustyką całego pomieszczenia.

Pytanie 27

Przedstawiony na filmie kod napisany w języku C++ nie kompiluje się. Co należy zmienić w tym kodzie, aby proces kompilacji wykonał się bez błędów?

A. dodać deklarację funkcji sprawdz przed funkcją main
B. zadeklarować zmienną sprawdz przed jej wykorzystaniem w linii 11
C. naprawić błąd w funkcji sprawdz, który polega na braku nawiasów {} w pętli for
D. poprawnie zapisać warunek w instrukcji if w linii 11, np. sprawdz(x)==true

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Odpowiedź jest trafna, bo w języku C++ kompilator musi wiedzieć o istnieniu funkcji zanim zostanie ona użyta w kodzie, np. w funkcji main. Bez wcześniejszej deklaracji, kompilator nie zna sygnatury funkcji i nie potrafi zweryfikować wywołania, co skutkuje błędem typu 'implicit declaration of function'. Deklaracja funkcji to taki sygnał informujący kompilator „hej, taka funkcja będzie i będzie przyjmować takie argumenty, a zwracać taki typ”. Praktycznie rzecz biorąc, przed funkcją main wystarczy wpisać np. 'bool sprawdz(int x);', żeby wszystko grało. To szczególnie ważne przy większych projektach czy pracy w zespołach, gdzie pliki nagłówkowe z deklaracjami funkcji są standardem. Pozwala to na lepszą czytelność i porządek w kodzie – kompilator wie, czego się spodziewać, a Ty unikasz dziwnych, trudnych do znalezienia błędów. Moim zdaniem taka organizacja kodu to podstawa, szczególnie jeśli kiedyś będziesz korzystać z bibliotek lub cudzych funkcji – deklaracje są wtedy wręcz obowiązkowe. To zasada, której trzyma się większość zespołów programistycznych i, szczerze mówiąc, sam kilka razy w młodości zapomniałem o deklaracji, przez co debugowanie trwało wieki. Warto od razu wyrobić sobie taki nawyk, bo to oszczędza sporo nerwów i czasu, a kod staje się solidniejszy i bardziej profesjonalny.

Pytanie 28

Rozpoczęcie tworzenia procedury składowej o nazwie dodajUsera w MS SQL wymaga użycia poleceń

A. create procedure dodajUsera
B. create dodajUsera procedure
C. add procedure dodajUsera
D. add dodajUsera procedure

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Polecenie 'create procedure dodajUsera' to właśnie ten sposób, w jaki w Microsoft SQL Server deklaruje się początek nowej procedury składowanej. Wynika to bezpośrednio ze składni T-SQL, gdzie słowo 'create' inicjuje tworzenie nowego obiektu w bazie danych, a 'procedure' określa typ obiektu – procedurę składowaną. Dalej podaje się nazwę, tu akurat 'dodajUsera'. Moim zdaniem, to jedno z podstawowych, ale i najważniejszych poleceń dla każdego, kto chce serio pracować z SQL Serverem, bo bez zrozumienia tej składni bardzo szybko można się pogubić nawet przy prostych operacjach. T-SQL od lat nie zmienia tej konwencji i to jest bardzo wygodne – można śmiało korzystać z tutoriali czy dokumentacji sprzed kilku wersji serwera, bo tu akurat niewiele się zmienia. Przykład praktyczny: gdybyś chciał dodać prostą procedurę, która wstawia użytkownika do tabeli, zacząłbyś właśnie tak: 'create procedure dodajUsera AS BEGIN --tutaj kod END'. Warto wiedzieć, że dobrym zwyczajem jest zawsze nazywać procedury zgodnie z tym, co robią, a nie jakoś przypadkowo, i też często dodawać prefix, np. 'usp_' (od 'user stored procedure'), żeby potem łatwo było je odróżnić od funkcji czy triggerów. Przy dużym projekcie pozwala to zachować porządek. No i nie można zapominać o wersjonowaniu takich procedur – w firmach często stosuje się repozytoria kodu SQL. Generalnie, w środowisku produkcyjnym, każda nowa procedura powinna zaczynać się właśnie od 'create procedure', bez żadnych skrótów czy zamienników.

Pytanie 29

Co zostanie wypisane w konsoli po wykonaniu poniższego kodu JavaScript?

let a = { value: 10 };
let b = a;
b.value = 20;
console.log(a.value);
A. undefined
B. 10
C. 20
D. ReferenceError

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wykonując podany kod JavaScript, otrzymujemy wynik 20 w konsoli. Dzieje się tak, ponieważ obiekt `a` jest przypisany do zmiennej `b`, co oznacza, że obie zmienne wskazują na ten sam obiekt w pamięci. Kiedy zmieniamy właściwość `value` obiektu za pomocą zmiennej `b`, zmiana ta wpływa również na obiekt `a`, ponieważ oba odwołują się do tej samej instancji obiektu. Wartości w JavaScript mogą być przekazywane przez referencję, co oznacza, że manipulując jedną referencją, wpływamy na obiekt, do którego ta referencja odnosi się. Przykład ten ilustruje, jak ważne jest zrozumienie różnicy między typami prymitywnymi (przekazywanymi przez wartość) a obiektami (przekazywanymi przez referencję). W praktyce, taka wiedza jest kluczowa przy pracy z obiektami w JavaScript, zwłaszcza w kontekście zarządzania stanem aplikacji, gdzie modyfikacje obiektów mogą mieć szeroki wpływ na cały system.

Pytanie 30

Wskaż algorytm sortowania, który nie jest stabilny?

A. sortowanie szybkie
B. sortowanie bąbelkowe
C. sortowanie przez wstawianie
D. sortowanie przez zliczanie

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Sortowanie szybkie (Quick Sort) to algorytm, który faktycznie nie jest stabilny w swojej podstawowej wersji. To znaczy, jeśli w kolekcji są dwa identyczne elementy pod względem klucza sortowania, po wykonaniu Quick Sort ich kolejność względem siebie może się zmienić. Z moich doświadczeń wynika, że to może mieć znaczenie, na przykład gdy sortujemy obiekty według jednego pola, ale chcemy zachować kolejność według innego – czasem w praktyce, np. przy obsłudze rekordów w bazach danych, stabilność sortowania gwarantuje spójność wyników. Quick Sort jest jednak bardzo popularny, bo ogólnie działa bardzo szybko i jest efektywny pamięciowo, stąd często go się używa tam, gdzie stabilność nie jest wymagana. W niektórych implementacjach można próbować uczynić Quick Sort stabilnym, ale wymaga to dodatkowych zabiegów i nie jest standardem – biblioteki standardowe (np. C++ std::sort) właśnie z tego powodu nie gwarantują stabilności Quick Sorta. W praktycznych projektach, jeśli zależy Ci na stabilności, lepiej użyć sortowania przez wstawianie lub przez zliczanie. Sortowanie bąbelkowe i przez wstawianie są wręcz typowe do nauki stabilnych algorytmów, a sortowanie przez zliczanie nawet dla dużych zbiorów cały czas pilnuje kolejności równych elementów. Quick Sort jest świetny, ale warto znać jego ograniczenia, szczególnie w aplikacjach biznesowych albo pracy z dużymi, złożonymi strukturami danych.

Pytanie 31

Jakie są różnice między typem łańcuchowym a typem znakowym?

A. Typ znakowy przechowuje pojedyncze znaki, a łańcuchowy ciągi znaków
B. Typ znakowy przechowuje dane logiczne, a łańcuchowy tekst
C. Typ łańcuchowy obsługuje liczby całkowite, a znakowy liczby zmiennoprzecinkowe
D. Typ łańcuchowy przechowuje pojedyncze znaki, a znakowy długie ciągi znaków

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Typ znakowy (char) przechowuje pojedyncze znaki, natomiast typ łańcuchowy (string) przechowuje ciągi znaków. Różnica ta ma kluczowe znaczenie w programowaniu, ponieważ typ 'char' jest używany do operacji na pojedynczych literach, cyfrze lub symbolu, podczas gdy 'string' umożliwia przechowywanie i manipulowanie całymi wyrazami lub zdaniami. W wielu językach 'string' to bardziej złożona struktura danych, która zawiera tablicę znaków (array of characters), co pozwala na efektywną pracę z tekstem i budowanie interaktywnych aplikacji.

Pytanie 32

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

A. decimal
B. int
C. double
D. float

Brak odpowiedzi na to pytanie.

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

Pytanie 33

Jakie działanie związane z klasą abstrakcyjną jest niedozwolone?

A. Definiowanie pól publicznych
B. Określenie metody wirtualnej
C. Rozszerzanie tej klasy
D. Utworzenie instancji tej klasy

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Klasy abstrakcyjne w programowaniu obiektowym to fundament, który umożliwia wprowadzenie abstrakcji i polimorfizmu. Ich głównym celem jest zdefiniowanie wspólnego interfejsu dla klas pochodnych, natomiast nie można tworzyć ich instancji. Przykładem może być klasa abstrakcyjna 'Pojazd', która definiuje metody takie jak 'przyspiesz' i 'hamuj', ale sama nie ma implementacji tych metod. Klasy, które dziedziczą po 'Pojazd', takie jak 'Samochód' czy 'Motocykl', implementują te metody, co umożliwia ich użycie. Zgodnie z zasadami SOLID, klasa abstrakcyjna powinna być używana jako baza dla innych klas, a nie jako samodzielny obiekt. W związku z tym, próbując stworzyć instancję klasy abstrakcyjnej, napotkamy błąd kompilacji. Takie zachowanie jest zgodne z wieloma językami programowania, takimi jak Java, C# czy C++, gdzie klasy abstrakcyjne są kluczowym elementem budowy hierarchii klas oraz wzorów projektowych.

Pytanie 34

Jaką wartość ma zmienna b po wykonaniu poniższego kodu?

int a = 1, b = 20, c = 3;
while (a <= 10) {
    b = b - c;
    a += 2;
}
A. 20
B. 11
C. 2
D. 5

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Po przeanalizowaniu przedstawionego kodu, możemy zauważyć, że zmienne a b i c są zainicjalizowane odpowiednio wartościami 1 20 i 3. Pętla while jest zależna od warunku a <= 10 co oznacza że będzie się wykonywać dopóki a nie przekroczy 10. W ciele pętli najpierw zmniejszamy wartość b o wartość c czyli b = b - c a następnie zwiększamy a o 2 czyli a += 2. Ponieważ a jest początkowo równe 1 pętla będzie się wykonywać pięć razy zanim a stanie się większe niż 10 (1 3 5 7 9). Podczas każdej iteracji wartość b zmniejsza się o 3 (ponieważ c=3). Po pięciu iteracjach wartość b zostanie zmniejszona o 15 (5*3) z początkowej wartości 20 uzyskując ostatecznie 5. W tym kontekście poprawna odpowiedź to 5. Takie podejście do analizy pętli i zmiennych jest kluczowe podczas programowania ponieważ pozwala zrozumieć jak zmieniają się wartości zmiennych w czasie wykonywania programu. Zrozumienie tych zasad jest fundamentalne w programowaniu proceduralnym oraz w debugowaniu kodu.

Pytanie 35

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. 0
B. 20
C. 10
D. 23

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
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 36

W przedstawionych funkcjonalnie równoważnych kodach źródłowych po przeprowadzeniu operacji w zmiennej b zostanie zapisany wynik:

Python:C++/C#/Java:
x = 5.96;
b = int(x);
double x = 5.96;
int b = (int)x;
A. 6
B. 596
C. 5
D. 5.96

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Odpowiedź 5 jest prawidłowa, bo w większości popularnych języków programowania, takich jak Python, C++, C#, czy Java, rzutowanie liczby zmiennoprzecinkowej (czyli typu float lub double) na typ całkowity (int) powoduje odcięcie części ułamkowej, a nie zaokrąglenie. To jest bardzo ważne, bo wiele osób intuicyjnie spodziewa się zaokrąglenia, a tu po prostu wszystko po przecinku ląduje w koszu. W przypadku podanego przykładu zmienna x ma wartość 5.96, ale po rzutowaniu na int, zarówno w Pythonie poprzez funkcję int(), jak i w pozostałych językach przez klasyczne rzutowanie (int)x, zostaje tylko 5. Dokładnie tak działa konwersja: odcina się część po przecinku niezależnie od tego, jak blisko liczba jest kolejnej całości. To niesamowicie przydatne np. podczas pracy z indeksami tablic albo gdy chcemy szybko zamienić wynik dzielenia na liczbę całkowitą. W praktyce, warto pamiętać, że takie rzutowanie nie wykonuje żadnej walidacji ani sprawdzania – jeśli liczba jest ujemna, to po prostu też odcina część ułamkową w kierunku zera, więc int(-5.96) da -5. Z mojego doświadczenia bardzo często spotyka się błąd w kodzie, kiedy ktoś oczekuje zaokrąglenia i nie otrzymuje go, bo rzutowanie zawsze odcina, nie zaokrągla. Warto znać tę różnicę przy projektowaniu algorytmów i korzystać np. z funkcji round() jeśli potrzebujemy zaokrąglenia, a nie odcinania. To takie małe niuanse, ale potem wchodzą w nawyk i bardzo ułatwiają życie podczas kodowania.

Pytanie 37

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. rozpoczęcie sesji z już istniejącym repozytorium oraz pobranie kodu projektu do lokalnego folderu
B. utworzenie kopii istniejącego repozytorium z jedynie tą rewizją, która zostanie zapisana pod nazwą first commit
C. zamknięcie projektu, co spowoduje zarchiwizowanie wszystkich rewizji do lokalnego archiwum pod nazwą first commit
D. rozpoczęcie pracy z nowym repozytorium, dodanie oraz zatwierdzenie kodu projektu jako first commit

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Polecenia git init git add . oraz git commit -m 'first commit' są podstawowymi komendami do rozpoczęcia pracy z nowym repozytorium Gita. git init inicjalizuje puste repozytorium w aktualnym katalogu co tworzy podkatalog .git zawierający wszystkie metadane i historię w wersjonowania. Następnie git add . dodaje wszystkie nowe i zmodyfikowane pliki w bieżącym katalogu do indeksu co oznacza że są one gotowe do zatwierdzenia w repozytorium. Kolejne polecenie git commit -m 'first commit' tworzy pierwszy snapshot aktualnego stanu projektu z przypisaną wiadomością 'first commit' co jest dobrą praktyką sygnalizującą początek nowej historii projektu. Taki proces inicjacji jest standardem w zarządzaniu wersjami w branży IT umożliwiając śledzenie zmian w kodzie ułatwiając współpracę zespołową oraz zapewniając kontrolę nad rozwojem oprogramowania. Ważne jest by w pierwszym commicie umieścić podstawowe działające elementy projektu co stanowi solidną bazę do dalszego rozwoju.

Pytanie 38

Jaki rodzaj licencji umożliwia dowolne zmienianie oraz rozpowszechnianie kodu źródłowego?

A. Licencja OEM
B. Licencja GNU GPL
C. Licencja komercyjna
D. Licencja shareware

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Licencja GNU GPL (General Public License) pozwala na swobodne modyfikowanie i rozpowszechnianie kodu źródłowego, pod warunkiem, że wszelkie zmiany i modyfikacje są również udostępniane na tych samych zasadach. Jest to jedna z najbardziej znanych licencji open-source, która gwarantuje wolność użytkownikom oprogramowania w zakresie jego analizy, modyfikacji oraz redystrybucji. Licencja ta promuje współpracę i transparentność w świecie oprogramowania, umożliwiając społeczności wspólny rozwój projektów i eliminując ograniczenia wynikające z licencji zamkniętych.

Pytanie 39

Która z poniższych nie jest prawidłową metodą zarządzania stanem w React?

A. Redux
B. useState hook
C. Context API
D. React.stateManager

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Odpowiedź "React.stateManager" jest poprawna, ponieważ ta nazwa nie odnosi się do żadnej znanej metody zarządzania stanem w React. W rzeczywistości, React oferuje różne techniki do zarządzania stanem, takie jak Redux, Context API oraz hook useState. Redux to popularna biblioteka, która pozwala na centralizację stanu aplikacji, co ułatwia zarządzanie dużymi zbiorami danych oraz ich synchronizację pomiędzy komponentami. Context API umożliwia dzielenie się danymi w całej aplikacji bez konieczności przekazywania propsów przez wiele poziomów komponentów, co zwiększa czytelność i efektywność kodu. Hook useState to prosty sposób na lokalne zarządzanie stanem w komponentach funkcyjnych, co jest bardzo przydatne w przypadku prostych interakcji. Te narzędzia są zgodne z najlepszymi praktykami w branży i pomagają w tworzeniu skalowalnych oraz łatwych w utrzymaniu aplikacji.

Pytanie 40

Jakie narzędzie wspiera tworzenie aplikacji desktopowych?

A. Symfony
B. Angular
C. Xamarin
D. WPF

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
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.