Wyniki egzaminu

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

Egzamin zdany!

Wynik: 27/40 punktów (67,5%)

Wymagane minimum: 20 punktów (50%)

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

Jakie są cechy testów interfejsu?

A. Sprawdzają prawidłowość pracy elementów graficznych oraz interakcji użytkownika z aplikacją
B. Ulepszają kod aplikacji
C. Weryfikują zgodność aplikacji z przepisami prawnymi
D. Analizują wydajność aplikacji w czasie rzeczywistym
Testy interfejsu, znane też jako testy GUI (Graphical User Interface), są niesamowicie istotne w codziennej pracy programisty, zwłaszcza jeśli chodzi o aplikacje z graficznym interfejsem użytkownika. Ich głównym celem jest sprawdzanie, czy wszystkie elementy graficzne, takie jak przyciski, pola tekstowe czy menu działają zgodnie z założeniami oraz czy użytkownik może wchodzić z nimi w interakcję w przewidywany sposób. W praktyce zdarza się, że najwięcej błędów wychodzi właśnie na tym etapie – na przykład, kliknięcie w przycisk nie wywołuje żadnej akcji, albo okna dialogowe są nieczytelne. Moim zdaniem regularne wykonywanie takich testów (często automatycznych przy użyciu narzędzi typu Selenium, Cypress czy Playwright) pozwala wykrywać drobne usterki zanim trafią do rąk klienta, co jest zgodne z dobrymi praktykami Continuous Integration. Często też testy te są weryfikowane pod kątem responsywności, dostępności (WCAG) czy kompatybilności z różnymi przeglądarkami. Z mojego doświadczenia to właśnie testy interfejsu najbardziej pomagają w budowaniu pozytywnych doświadczeń użytkowników, bo pomagają wychwycić nieintuicyjne zachowania aplikacji, które ciężko zauważyć samym kodem. Warto więc o nich pamiętać, bo nawet najlepsza logika aplikacji nie obroni się, gdy UI nie działa poprawnie.

Pytanie 2

Zapisany fragment w C# wskazuje na definicję klasy Car, która:

public class Car: Vehicle {     ...   }
A. używa prywatnych pól klasy Vehicle
B. stanowi klasę bazową (nie dziedziczy po żadnej klasie)
C. dziedziczy po Vehicle
D. jest powiązana z klasą Vehicle
W przedstawionym kodzie w języku C# mamy definicję klasy Car, która dziedziczy po klasie Vehicle. Dziedziczenie to fundamentalny mechanizm programowania obiektowego, pozwalający jednej klasie przejąć właściwości i metody innej klasy. W praktyce oznacza to, że klasa Car automatycznie zyskuje dostęp do metod i właściwości publicznych oraz chronionych klasy Vehicle, co umożliwia ponowne użycie kodu i zwiększa jego przejrzystość. Dziedziczenie jest kluczowe w projektowaniu skalowalnych systemów, gdzie umożliwia tworzenie bardziej specyficznych klas na podstawie klas ogólnych, co jest zgodne z zasadą DRY (Don't Repeat Yourself). Przykładowo, jeżeli klasa Vehicle zawiera metody takie jak Start() i Stop(), klasa Car może je wykorzystać bez konieczności ponownego definiowania. Dobre praktyki w programowaniu obiektowym zalecają wykorzystywanie dziedziczenia do tworzenia hierarchii klas, które logicznie odwzorowują relacje „jest-a” pomiędzy obiektami w systemie. Ważne jest też unikanie zbyt głębokiego dziedziczenia, co może prowadzić do skomplikowanego i trudnego w utrzymaniu kodu. Zrozumienie dziedziczenia jest kluczowe dla efektywnego wykorzystania wzorców projektowych, takich jak wzorzec projektowy Adapter czy Dekorator.

Pytanie 3

Jak nazywa się proces znajdowania i usuwania błędów w kodzie?

A. Debugowanie
B. Interpretowanie
C. Kompilowanie
D. Kompensowanie
Debugowanie to niezwykle istotny etap w procesie tworzenia oprogramowania, polegający na identyfikowaniu i eliminowaniu błędów w kodzie źródłowym. Jest to proces, który wymaga zrozumienia logiki programu oraz umiejętności analitycznych, aby skutecznie odnaleźć przyczynę problemu i ją usunąć. Debugowanie jest kluczowe dla zapewnienia, że aplikacja działa zgodnie z zamierzeniami i jest wolna od błędów, które mogłyby wpłynąć na jej funkcjonalność lub stabilność. W praktyce debugowanie może obejmować różne techniki, takie jak użycie narzędzi do śledzenia wykonania kodu, analizę logów czy testowanie jednostkowe. Programiści często korzystają z dedykowanych środowisk programistycznych (IDE), które oferują funkcje ułatwiające debugowanie, takie jak punkty przerwań czy inspekcja zmiennych. Dobrym przykładem jest Visual Studio, które umożliwia śledzenie wartości zmiennych w czasie rzeczywistym. Debugowanie jest również częścią dobrych praktyk programistycznych, które zakładają regularne testowanie i kontrolę jakości kodu. Dzięki temu możliwe jest nie tylko eliminowanie błędów, ale także poprawa wydajności i bezpieczeństwa aplikacji.

Pytanie 4

W jakim celu wykorzystuje się diagram Gantta?

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

W przedstawionej ramce znajduje się fragment opisu metody compile języka Java wykorzystywanej w kontekście wyrażeń regularnych. Który symbol powinien być użyty, aby znaleźć dopasowanie na końcu tekstu?

MetacharacterDescription
|Find a match for any one of the patterns separated by | as in: cat|dog|fish
.Find just one instance of any character
^Finds a match as the beginning of a string as in: ^Hello
$Finds a match at the end of the string as in: World$
\dFind a digit
\sFind a whitespace character
\bFind a match at the beginning of a word like this: \bWORD, or at the end of a word like this: WORD\b
\uxxxxFind the Unicode character specified by the hexadecimal number xxxx
Źródło https://www.w3schools.com/java/java_regex.asp dostęp 20.08.2020
A. ^
B. |
C. .
D. $
Znak dolara $ w wyrażeniach regularnych w języku Java jest używany do oznaczenia końca ciągu znaków. Jeśli chcemy sprawdzić, czy konkretny wzorzec występuje na końcu danego tekstu, używamy właśnie tego metaznaku. Przykładowo, wyrażenie regularne World$ dopasuje tekst, w którym słowo World pojawia się na samym końcu. Jest to przydatne w wielu scenariuszach, takich jak walidacja struktury tekstu czy filtrowanie logów, gdzie ważna jest pozycja występowania wzorca. Konwencja ta jest zgodna z ogólnymi standardami regex, co czyni ją intuicyjną i uniwersalną w zastosowaniu. Dolar pełni kluczową rolę w automatyzacji procesów w przetwarzaniu tekstu, umożliwiając efektywne dopasowywanie końcowych wzorców w aplikacjach Java. Użycie $ jest zgodne z dobrymi praktykami kodowania, szczególnie w kontekście walidacji danych wejściowych, gdzie określenie końca ciągu jest często wymagane. Jest to także popularne w analizie danych, gdzie dane muszą spełniać określone kryteria co do ich zakończenia, takie jak rozszerzenia plików czy określone etykiety tekstowe.

Pytanie 6

Jaka jest złożoność obliczeniowa poniższego algorytmu?

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < n; k++) {
            array[i][j][k] = i + j + k;
        }
    }
}
A. O(n)
B. O(n log n)
C. O(n²)
D. O(n³)
Złożoność obliczeniowa przedstawionego algorytmu wynosi O(n³), co wynika z trzech zagnieżdżonych pętli, z których każda iteruje po n elementach. W praktyce oznacza to, że liczba operacji, które algorytm wykonuje, rośnie proporcjonalnie do sześcianu liczby n. Przykładowo, jeśli mamy dwa wymiary, złożoność będzie O(n²), ale w tym przypadku mamy trzy wymiary (i, j, k), co podwyższa złożoność do O(n³). Takie sytuacje zdarzają się często w problemach związanych z przetwarzaniem danych w trzech wymiarach, takich jak grafika komputerowa czy analiza danych 3D. W branży, dobrze jest pamiętać, że złożoność O(n³) może być nieefektywna dla dużych n, dlatego warto analizować algorytmy pod kątem ich wydajności i stosować różne techniki optymalizacji, jak na przykład podział danych czy struktury danych zmniejszające złożoność. Warto również zrozumieć, że dla dużych wartości n, czas wykonania algorytmu może być zauważalnie dłuższy, co wpływa na ogólną efektywność systemu.

Pytanie 7

Które z wymienionych atrybutów klasy mogą być dostępne wyłącznie w obrębie tej klasy oraz jej klas potomnych?

A. Static
B. Public
C. Private
D. Protected
Modyfikator `protected` pozwala na dostęp do pól i metod klasy w ramach tej samej klasy oraz w klasach dziedziczących. Jest to pośredni poziom dostępu między `private` i `public`. Pola `protected` są ukryte przed innymi klasami spoza hierarchii dziedziczenia, ale pozostają dostępne w klasach pochodnych. Dzięki temu dziedziczenie staje się bardziej elastyczne, umożliwiając klasom potomnym korzystanie z chronionych elementów klasy bazowej. Przykład w C++: `class Pojazd { protected: int predkosc; }`. Klasy dziedziczące po `Pojazd` mogą używać `predkosc`, ale obiekty nie mają bezpośredniego dostępu do tego pola.

Pytanie 8

Jakie jest poprawne określenie interfejsu (szablonu klasy) w języku Java?

interface IMyInterface {
    private: int a;
    IMyInterface() { a = 0; }
    void mth1();
}
Definicja 1
interface IMyInterface {
    private: int a;
    void mth1();
    int mth2() { return a; }
}
Definicja 2
interface IMyInterface {
    void mth1();
    int mth2() { return 0; }
}
Definicja 3
interface IMyInterface {
    void mth1();
    int mth2();
}
Definicja 4
A. Definicja 1
B. Definicja 3
C. Definicja 4
D. Definicja 2
W pierwszej definicji interfejsu obecność zmiennej prywatnej i konstruktora jest niezgodna z zasadami definiowania interfejsów w języku Java. Interfejsy nie mogą zawierać żadnych konstruktorów, ponieważ nie są klasami i nie można ich instancjonować. Dodatkowo, zmienne w interfejsach są domyślnie publiczne, statyczne i finalne, co oznacza, że nie mogą być prywatne jak w tej definicji. Druga definicja popełnia podobne błędy przez deklarowanie prywatnej zmiennej i implementację metody wewnątrz interfejsu, co przed Java 8 było niemożliwe. Trzecia definicja zawiera metodę z ciałem, co w kontekście starszych wersji Javy nie jest zgodne z zasadami, choć od Java 8 można deklarować metody domyślne z ciałem, jednak w tej sytuacji nie jest to poprawne bez specyfikacji default. Błędnie przyjęte podejścia do definicji interfejsów mogą wynikać z niezrozumienia, że interfejsy służą jedynie do deklarowania metod i ewentualnie statycznych finalnych zmiennych, nie zaś do implementacji logiki. Prawidłowe zrozumienie roli interfejsów jest kluczowe dla wykorzystania ich w tworzeniu elastycznego i rozszerzalnego kodu. Błędy te podkreślają potrzebę dbałości o zgodność ze specyfikacją języka oraz znajomość jego wersji i nowości wprowadzanych w kolejnych iteracjach.

Pytanie 9

Który z poniższych aspektów najlepiej definiuje działanie e-sklepu?

A. Zarządzanie serwerem e-mail
B. System obsługi koszyka oraz realizacji zamówień
C. Mechanizm generowania grafiki 3D
D. Dostęp do bazy danych klientów
System zarządzania koszykiem i realizacją zamówień to kluczowy element każdej aplikacji e-commerce (sklepu internetowego). Umożliwia użytkownikom dodawanie produktów do koszyka, zarządzanie ich ilością, a następnie finalizację transakcji poprzez proces realizacji zamówienia i płatności. Tego typu funkcjonalność wymaga integracji z bazą danych oraz systemami płatności online, co zapewnia bezpieczeństwo i wygodę użytkownika. Systemy koszyków zakupowych często oferują zaawansowane funkcje, takie jak kupony rabatowe, kody promocyjne czy integracje z magazynami i systemami logistycznymi. Realizacja zamówienia obejmuje procesy takie jak autoryzacja płatności, generowanie faktur oraz śledzenie zamówień, co jest podstawą funkcjonowania nowoczesnych platform e-commerce.

Pytanie 10

Które z poniższych NIE jest zasadą programowania SOLID?

A. Dependency Inversion Principle (Zasada odwrócenia zależności)
B. Open/Closed Principle (Zasada otwarte/zamknięte)
C. Single Responsibility Principle (Zasada pojedynczej odpowiedzialności)
D. Code Reuse Principle (Zasada ponownego użycia kodu)
Odpowiedź "Code Reuse Principle" jest prawidłowa, ponieważ nie stanowi ona jednej z pięciu zasad programowania SOLID. SOLID to akronim, który odnosi się do pięciu podstawowych zasad, które mają na celu ułatwienie tworzenia oprogramowania, które jest łatwe w utrzymaniu i rozwijaniu. W skład tych zasad wchodzą: Zasada pojedynczej odpowiedzialności (Single Responsibility Principle), Zasada otwarte/zamknięte (Open/Closed Principle), Zasada segregacji interfejsów (Interface Segregation Principle), Zasada odwrócenia zależności (Dependency Inversion Principle) oraz Zasada Liskov (Liskov Substitution Principle). Przykładowo, Zasada pojedynczej odpowiedzialności zakłada, że każda klasa powinna mieć jedną, jasno określoną odpowiedzialność, co pozwala na łatwiejsze testowanie i modyfikowanie kodu bez wpływu na inne jego części. Użycie zasad SOLID w praktyce prowadzi do lepszego rozdzielenia logiki aplikacji i ułatwia jej rozwój oraz utrzymanie, co jest kluczowe w długoterminowych projektach programistycznych.

Pytanie 11

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

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

Pytanie 12

Które z poniższych NIE jest typem wartości zwracanej przez funkcję w języku JavaScript?

A. Object
B. Undefined
C. Number
D. Method
W języku JavaScript funkcje mogą zwracać różne typy wartości, takie jak obiekty, liczby czy typ undefined. Wśród wymienionych opcji, 'Method' nie jest typem wartości zwracanej przez funkcję. W rzeczywistości, metoda w JavaScript to funkcja przypisana do obiektu. Jeżeli definiujemy funkcję wewnątrz obiektu, to możemy ją nazwać metodą tego obiektu, ale nie jest to typ wartości. Przykładowo, jeżeli mamy obiekt o nazwie 'person' i metodę 'greet', która zwraca powitanie:

const person = {
name: 'Jan',
greet: function() {
return 'Cześć, ' + this.name;
}
};

W powyższym przypadku, 'greet' jest metodą, ale jej wartością zwracaną jest typ string, co jest typowym zachowaniem funkcji. Dobrą praktyką jest zrozumienie różnicy między funkcjami a ich zastosowaniami w obiektach, co pozwala na lepsze projektowanie kodu oraz ukierunkowanie na zasady programowania obiektowego, które są kluczowe w JavaScript.

Pytanie 13

Który z wymienionych typów danych należy do typu logicznego?

A. int
B. bool
C. float
D. char
Typ danych 'bool' (boolean) jest typem logicznym, który przechowuje jedną z dwóch wartości: 'true' lub 'false'. Typy logiczne są nieodłącznym elementem programowania, ponieważ umożliwiają implementację warunków i pętli sterujących przepływem programu. Typ 'bool' znajduje zastosowanie w praktycznie każdym języku programowania, w tym C++, Java, Python i C#. Operacje logiczne, takie jak 'AND', 'OR' i 'NOT', opierają się na wartościach typu 'bool', co czyni je podstawą dla algorytmów decyzyjnych i strukturalnych. Zastosowanie typów logicznych zwiększa czytelność kodu i pozwala na efektywne zarządzanie warunkami logicznymi.

Pytanie 14

Co zostanie wyświetlone po wykonaniu poniższego kodu w języku Python?

data = [1, 2, 3, 4, 5]
result = list(map(lambda x: x*2, filter(lambda x: x % 2 == 0, data)))
print(result)
A. [2, 6, 10]
B. [1, 2, 3, 4, 5]
C. [2, 4, 6, 8, 10]
D. [4, 8]
Analizując inne odpowiedzi, możemy zauważyć, że wszystkie one bazują na błędnych założeniach dotyczących działania funkcji filter i map. Niektóre z propozycji, takie jak [2, 6, 10], sugerują, że wszystkie liczby parzyste z oryginalnej listy byłyby mnożone przez 2, co jest nieprawidłowe. Funkcja filter zwraca jedynie liczby parzyste, a to oznacza, że tylko liczby 2 i 4 są brane pod uwagę, nie 6 i 10, których w oryginalnej liście po prostu nie ma. Ponadto odpowiedź [2, 4, 6, 8, 10] jest błędna, ponieważ dodaje liczby, które nie występują w danych wejściowych, co prowadzi do nieprecyzyjnego wyniku. Warto zrozumieć, że w Pythonie operacje na kolekcjach są często wykonywane w sposób, który wymaga precyzyjnej analizy danych wejściowych. W kontekście programowania, często popełnianym błędem jest zakładanie, że wszystkie liczby pasujące do jakiegoś warunku będą uwzględniane w dalszej obróbce bez dokładnego ich filtrowania. Stąd wynika, że zrozumienie, jak działają funkcje takie jak filter i map, jest kluczowe dla efektywnego i poprawnego programowania. W procesie nauki ważne jest, aby przyglądać się działaniu kodu krok po kroku i dokładnie analizować, jak funkcje przetwarzają dane. Zrozumienie tych podstawowych koncepcji jest niezbędne, aby uniknąć podobnych nieporozumień w przyszłości.

Pytanie 15

Wykorzystując jeden z dwóch zaprezentowanych sposobów inkrementacji w językach z rodziny C lub Java, można zauważyć, że
Zapis pierwszy:

b = a++;
Zapis drugi:
b = ++a;
A. Wartość zmiennej b będzie wyższa po użyciu drugiego zapisu w porównaniu do pierwszego.
B. Bez względu na zastosowany sposób, w zmiennej b zawsze uzyskamy ten sam rezultat.
C. Tylko przy użyciu pierwszego zapisu zmienna a zostanie zwiększona o 1.
D. Drugi zapis nie jest zgodny ze składnią, co doprowadzi do błędów kompilacji.
Drugi zapis nie jest niezgodny ze składnią – zarówno preinkrementacja, jak i postinkrementacja są w pełni zgodne z zasadami języka i nie powodują błędów kompilacji. Niezależnie od wybranego zapisu, zmienna zostanie zwiększona, lecz kluczowa różnica polega na tym, kiedy dokładnie to następuje. Twierdzenie, że w każdym przypadku wynik będzie taki sam, jest błędne – różnice pojawiają się podczas użycia tych operatorów w bardziej złożonych wyrażeniach. Zapis pierwszy (preinkrementacja) nie jest jedynym sposobem na zwiększenie wartości zmiennej, chociaż w wielu sytuacjach jest preferowany ze względu na efektywność.

Pytanie 16

Mobilna aplikacja przedstawia listę, w której każdy element można dotknąć palcem, aby zobaczyć jego detale. Zdarzenie, które odpowiada tej czynności, to

A. toggled.
B. button clicked.
C. tapped.
D. value changed.
Zdarzenie 'tapped' oznacza, że stuknęliśmy w coś na liście na naszym telefonie. To takie podstawowe zdarzenie, które przydaje się w aplikacjach mobilnych. Dzięki temu możemy wchodzić w interakcje z różnymi elementami, na przykład, gdy klikniemy na coś w liście, pojawią się dodatkowe szczegóły. Ta obsługa zdarzeń 'tap' jest naprawdę ważna w aplikacjach mobilnych, bo to w zasadzie główny sposób, w jaki poruszamy się po interfejsie.

Pytanie 17

Który z dokumentów stosowanych w metodologii Agile zawiera listę funkcjonalności produktu uporządkowanych według ich ważności?

A. Diagram Gantta
B. Product backlog
C. Backlog sprintu
D. Harmonogram projektu
Backlog sprintu zawiera jedynie zadania przypisane do aktualnego sprintu i jest podzbiorem całego backlogu produktu, co oznacza, że nie zawiera całości funkcjonalności. Diagram Gantta to narzędzie do planowania harmonogramu projektów, ale nie służy do zarządzania wymaganiami czy funkcjonalnościami produktu. Harmonogram projektu określa czas realizacji poszczególnych etapów, ale nie odnosi się do listy funkcji, jakie muszą zostać wdrożone, co jest celem backlogu.

Pytanie 18

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 zawsze dziedziczy z klasy bazowej
D. Klasa, która nie może posiadać żadnych metod
Poprawną odpowiedzią jest „Klasa, która może być dziedziczona, ale nie można jej instancjonować”, ponieważ najlepiej oddaje istotę klasy abstrakcyjnej w programowaniu obiektowym. Klasa abstrakcyjna pełni rolę szablonu dla klas pochodnych – określa wspólną strukturę, zachowania lub interfejs, które powinny zostać zaimplementowane przez klasy dziedziczące. Nie można tworzyć jej obiektów, ponieważ nie reprezentuje ona kompletnego bytu, lecz raczej pojęcie ogólne. Takie podejście umożliwia stosowanie dziedziczenia i polimorfizmu, poprawia czytelność kodu oraz ułatwia jego rozbudowę i utrzymanie. Klasy abstrakcyjne są często wykorzystywane do narzucania jednolitego sposobu implementacji metod w całej hierarchii klas. Pozostałe odpowiedzi są niepoprawne, ponieważ opisują cechy, które nie definiują jednoznacznie klasy abstrakcyjnej lub są błędne. Stwierdzenie „Klasa, która zawsze dziedziczy z klasy bazowej” jest nieprawidłowe, gdyż klasa abstrakcyjna sama może być klasą bazową i nie musi dziedziczyć po innej klasie. Odpowiedź „Klasa, która może zawierać zarówno metody zdefiniowane, jak i niezdefiniowane (czysto wirtualne)” jest nieprecyzyjna – taka możliwość często występuje, ale nie jest warunkiem koniecznym, by uznać klasę za abstrakcyjną. Natomiast odpowiedź „Klasa, która nie może posiadać żadnych metod” jest całkowicie błędna, ponieważ klasy abstrakcyjne mogą zawierać zarówno metody abstrakcyjne, jak i w pełni zaimplementowane. Zrozumienie tych różnic pozwala poprawnie rozpoznać, czym naprawdę jest klasa abstrakcyjna.

Pytanie 19

Co to jest CI/CD w kontekście rozwoju oprogramowania?

A. Ciągła integracja i ciągłe dostarczanie - praktyki automatyzujące proces wdrażania kodu
B. Component Isolation/Component Deployment - izolacja i wdrażanie komponentów aplikacji
C. Code Implementation/Code Delivery - metodyka implementacji i dostarczania kodu
D. Customer Interface/Customer Design - projektowanie interfejsów zorientowane na klienta
CI/CD, czyli ciągła integracja i ciągłe dostarczanie, to zbiór praktyk i narzędzi stosowanych w rozwoju oprogramowania w celu automatyzacji procesów budowy, testowania i wdrażania aplikacji. CI polega na regularnym integrowaniu kodu do wspólnego repozytorium, co pozwala na wczesne wykrywanie błędów i konfliktów. Umożliwia to zespołom deweloperskim wykrywanie problemów w kodzie na wczesnym etapie, co znacząco przyspiesza cykl rozwoju. CD natomiast odnosi się do automatyzacji procesu wdrażania aplikacji na środowiska produkcyjne, co minimalizuje czas potrzebny na dostarczenie nowych funkcji do użytkowników. Przykłady praktycznego zastosowania CI/CD obejmują użycie narzędzi takich jak Jenkins, GitLab CI, czy CircleCI, które umożliwiają automatyczne uruchamianie testów oraz wdrażanie aplikacji na różnych platformach. Dobre praktyki w CI/CD obejmują tworzenie małych i częstych aktualizacji, co pozwala na łatwiejsze zarządzanie projektami i szybsze reagowanie na potrzeby klientów.

Pytanie 20

Co oznacza skrót CDN w kontekście aplikacji webowych?

A. Content Definition Notation - notacja do definiowania treści w aplikacjach
B. Content Delivery Network - sieć rozproszona geograficznie, służąca do dostarczania treści
C. Cross Domain Navigation - metoda nawigacji między domenami w aplikacjach webowych
D. Compressed Data Node - węzeł kompresji danych w architekturze mikrousług
W kontekście aplikacji webowych błędne skróty i pojęcia często prowadzą do nieporozumień dotyczących architektury i technologii. Cross Domain Navigation, chociaż istotne w kontekście bezpieczeństwa i wymiany danych między różnymi domenami, nie jest związane z dostarczaniem treści. Metoda ta dotyczy głównie sposobów nawigacji w aplikacjach, które mogą wymagać zarządzania różnymi politykami CORS (Cross-Origin Resource Sharing), ale nie definiuje sposobów optymalizacji dostarczania treści. Compressed Data Node to termin, który sugeruje węzeł odpowiedzialny za kompresję danych w architekturze mikrousług, ale nie wiąże się z geograficznie rozproszonym dostarczaniem treści, co jest kluczowym aspektem działania CDN. Content Definition Notation to z kolei nieznany termin w literaturze dotyczącej technologii webowej, nie mający powszechnie uznawanej definicji w branży. Błędem myślowym byłoby utożsamianie tych terminów z sieciami dostarczania treści, ponieważ każde z nich ma swoją specyfikę i zastosowanie. W kontekście aplikacji internetowych kluczowe jest zrozumienie, że CDN ma na celu poprawę szybkości i efektywności dostarczania treści, co jest niezrównanie bardziej złożonym i istotnym zagadnieniem niż tylko nawigacja czy kompresja danych. Praktyki związane z sieciami CDN są dobrze udokumentowane i należy je stosować zgodnie z najlepszymi standardami branżowymi, aby zapewnić wysoką jakość usług dla użytkowników.

Pytanie 21

Który wzorzec projektowy jest najlepszy do zarządzania tworzeniem obiektów?

A. Decorator
B. Observer
C. Factory Method
D. Adapter
Wybór wzorców projektowych w kontekście zarządzania tworzeniem obiektów jest kluczowy, jednak nie wszystkie wzorce są odpowiednie dla tego celu. Wzorzec Observer, na przykład, jest zaprojektowany do zarządzania powiązaniami między obiektami, umożliwiając jednemu obiektowi informowanie innych o zmianach stanu. Jego zastosowanie w kontekście tworzenia obiektów jest nieadekwatne, ponieważ nie rozwiązuje problemu instancjonowania obiektów, a jedynie komunikacji między nimi. Kolejnym błędnym podejściem jest wzorzec Decorator, który ma na celu dynamiczne dodawanie funkcjonalności do obiektów. Choć może być użyty w kontekście modyfikacji obiektów, nie zajmuje się tworzeniem ich instancji, co czyni go nieodpowiednim w tej sytuacji. Wzorzec Adapter może być mylony z Factory Method, ponieważ również pozwala na współpracę różnych interfejsów, jednak jego główną rolą jest umożliwienie komunikacji pomiędzy niekompatybilnymi interfejsami. Adapter koncentruje się na przekształcaniu interfejsów, a nie na tworzeniu obiektów. W rezultacie, wybór niewłaściwego wzorca może prowadzić do nieefektywnego projektowania, co utrudnia rozwój i utrzymanie aplikacji. Warto zatem dokładnie rozróżniać role poszczególnych wzorców i stosować je w odpowiednich kontekstach, aby unikać typowych pułapek myślowych związanych z ich zastosowaniem.

Pytanie 22

Które z wymienionych oznaczeń wskazuje na liniową złożoność algorytmu?

A. O(n)
B. O(log n)
C. O(n²)
D. O(1)
Złożoność O(n) oznacza liniową zależność czasu wykonania algorytmu od rozmiaru danych wejściowych. Oznacza to, że dla każdego dodatkowego elementu algorytm wykonuje jedną dodatkową operację. Algorytmy liniowe są jednymi z najczęściej stosowanych w praktyce, ponieważ oferują dobrą równowagę między szybkością a złożonością implementacji. Przykłady algorytmów o złożoności O(n) to przeszukiwanie liniowe (Linear Search), sumowanie elementów tablicy oraz niektóre algorytmy sortowania, takie jak Counting Sort dla określonych warunków. Liniowa złożoność czyni te algorytmy bardzo efektywnymi przy przetwarzaniu dużych zbiorów danych.

Pytanie 23

Metodyka zwinna (ang. agile) opiera się na

A. dekompozycji przedsięwzięcia na elementy, które są niezależnie projektowane, wytwarzane i testowane w krótkich iteracjach
B. podzieleniu projektu na kolejne etapy: planowanie, programowanie, testowanie, z ciągłym oszacowaniem ryzyka projektu
C. zaplanowaniu całej aplikacji na początku projektu i jej tworzeniu na przemian z testowaniem
D. przygotowaniu testów dla całego projektu, a następnie wprowadzaniu kolejnych jego fragmentów
Podejście kaskadowe (waterfall) zakłada podział projektu na kolejne etapy (projekt, programowanie, testy), ale nie dopuszcza powrotu do wcześniejszych faz, co czyni je mniej elastycznym niż agile. Projektowanie całej aplikacji na początku jest charakterystyczne dla tradycyjnych metodyk, takich jak V-model, ale nie odzwierciedla idei iteracyjnego rozwoju stosowanego w agile. Implementowanie testów po zakończeniu całości projektu ogranicza możliwość szybkiego reagowania na błędy i jest sprzeczne z filozofią agile, gdzie testy są integralną częścią każdego etapu iteracji.

Pytanie 24

Jakie jest podstawowe zadanie funkcji zaprzyjaźnionej w danej klasie?

A. Ograniczenie widoczności atrybutów klasy
B. Umożliwienie funkcji dostępu do prywatnych atrybutów klasy
C. Generowanie kopii pól obiektu w innej klasie
D. Dodawanie nowych instancji do klasy
Dodawanie nowych obiektów do klasy to zadanie konstruktorów, a nie funkcji zaprzyjaźnionych. Tworzenie kopii pól obiektu w innej klasie może być realizowane za pomocą mechanizmów kopiujących lub metod publicznych, ale nie jest to funkcja zaprzyjaźniona. Ograniczenie zakresu widoczności pól klasy to efekt zastosowania modyfikatorów dostępu, takich jak private, protected lub public, a nie przyjaźni klasowej.

Pytanie 25

Który z poniższych elementów UI umożliwia graficzną nawigację pomiędzy różnymi sekcjami aplikacji?

A. Menu
B. Obszar tekstowy
C. Przycisk opcji
D. Rozwijana lista
Pasek menu to kluczowy element interfejsu użytkownika, który umożliwia wizualną nawigację pomiędzy różnymi sekcjami aplikacji. Paski menu są powszechnie stosowane w aplikacjach desktopowych i mobilnych, ponieważ pozwalają na szybki dostęp do różnych funkcji oraz ustawień. Dzięki ich hierarchicznej strukturze użytkownicy mogą łatwo odnaleźć potrzebne narzędzia i opcje, co zwiększa intuicyjność i wygodę korzystania z aplikacji.

Pytanie 26

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
Zdalne wykonywanie aplikacji na urządzeniu klienta oznacza model przetwarzania lokalnego, co nie jest główną cechą architektury klient-serwer. Brak podziału na funkcje klienta i serwera narusza podstawową ideę tego modelu, który zakłada rozdzielenie ról pomiędzy te dwie jednostki. Wyłącznie komunikacja synchroniczna ogranicza elastyczność aplikacji i może prowadzić do opóźnień w przetwarzaniu danych.

Pytanie 27

Jakie są główne cechy architektury klient-serwer?

A. Serwer pełni rolę pasywnego odbiorcy danych od klientów
B. Komunikacja odbywa się bezpośrednio między urządzeniami klienckimi
C. Dane są przechowywane i przetwarzane na serwerze, a klient wysyła żądania i odbiera odpowiedzi
D. Każdy klient funkcjonuje niezależnie od pozostałych
Architektura klient-serwer to model, w którym dane są przechowywane i przetwarzane na serwerze, a klient wysyła żądania i odbiera odpowiedzi. Model ten umożliwia centralizację zasobów, co prowadzi do łatwiejszego zarządzania aplikacjami i zwiększonego bezpieczeństwa. Klient-serwer jest podstawą działania aplikacji webowych, usług sieciowych oraz baz danych. Dzięki temu architektura ta umożliwia wielu użytkownikom jednoczesny dostęp do tych samych danych, co czyni ją wydajnym rozwiązaniem dla rozproszonych systemów informatycznych. Serwery mogą obsługiwać różne rodzaje klientów, takie jak przeglądarki, aplikacje mobilne czy urządzenia IoT, co sprawia, że jest to wszechstronny model stosowany w wielu branżach.

Pytanie 28

Do zadań widoku w architekturze MVVM (Model-View-ViewModel) należy

A. przechowywanie ściągniętych i przetworzonych informacji
B. zarządzanie logiką aplikacji - obejmuje wdrażanie algorytmów
C. przekazywanie danych do widoku oraz wymiana informacji z modelem
D. obsługa interakcji użytkownika, stworzenie UI
Wiele osób myli zadania widoku w architekturze MVVM z innymi warstwami, przez co później pojawiają się spore problemy przy rozwijaniu i utrzymywaniu większych aplikacji. Przede wszystkim, widok nigdy nie powinien zarządzać logiką aplikacji ani implementować algorytmów – to zadanie Modelu lub ewentualnie ViewModelu. Przenoszenie takich odpowiedzialności do UI prowadzi do tzw. „smrodu kodu” i utrudnia refaktoryzację czy testowanie. Spotkałem się w praktyce z projektami, gdzie próbowano do widoku wrzucić obsługę serwisów, walidację czy sterowanie workflow – efektem był totalny chaos. Równie często pojawia się błędne przekonanie, że widok powinien przekazywać dane do widoku i wymieniać informacje z modelem – tymczasem w MVVM przepływ danych realizuje głównie ViewModel dzięki data bindingowi, a widok jest raczej pasywny i nie zarządza wymianą informacji bezpośrednio z modelem. To ViewModel łączy model z warstwą prezentacji, pozwalając na luźne powiązanie i wysoką elastyczność. Kolejna mylna koncepcja dotyczy przechowywania pobranych i przetworzonych informacji – tym zajmuje się Model, ewentualnie ViewModel, a nie widok. Wrzucając takie rzeczy do UI, łamiemy zasadę separacji odpowiedzialności. Moim zdaniem, warto zapamiętać, że długofalowy rozwój systemu, możliwość testowania oraz opcja łatwego podmieniania warstw bez ruszania całej reszty zależą właśnie od tego, jak precyzyjnie trzymamy się podziału ról. MVVM został zaprojektowany po to, żeby każda warstwa miała jasno określone zadania – i tylko wtedy architektura ma sens, jeśli się tego trzymamy. Odpowiedzialności widoku ograniczają się do prezentacji i obsługi interakcji użytkownika; wszystko, co wykracza poza to, powinno być delegowane do innych warstw. To pozwala na czysty kod i zgodność z najlepszymi praktykami programistycznymi.

Pytanie 29

Który z poniższych procesów jest wyłącznie związany z kompilowaniem kodu?

A. Generating an executable file
B. Executing code step by step
C. Detection of logical errors during program execution
D. Real-time translation of instructions
Tłumaczenie instrukcji w czasie rzeczywistym to coś, co robi interpreter, a nie kompilator. Jeśli chodzi o błędy logiczne, to są one wykrywane podczas debugowania albo testów – nie podczas samego wykonywania kodu. Debugger zajmuje się wykonywaniem kodu krok po kroku, a kompilacja to coś zupełnie innego, bo nie dzieje się na żywo. Kompilacja przetwarza kod przed jego uruchomieniem, co różni ją od interpretacji. Takie podejście ma swoje plusy i minusy, ale na pewno warto je znać.

Pytanie 30

Programista umieścił poniższą linię kodu w pliku HTML, aby

<script src="jquery-3.5.1.min.js"></script>
A. skorzystać z funkcji biblioteki jQuery, która była wcześniej pobrana i zapisana lokalnie
B. zadeklarować własną funkcję JavaScript o nazwie min.js
C. wstawić kod JavaScript pomiędzy znacznikami &lt;script&gt;&lt;/script&gt;
D. pobrać z Internetu w momencie otwierania strony i użyć biblioteki jQuery
Kod HTML jest często używany do włączania zewnętrznych bibliotek JavaScript, takich jak jQuery, które zostały wcześniej pobrane i zapisane lokalnie na serwerze. W tym przypadku atrybut src w znaczniku script wskazuje na lokalnie przechowywany plik jQuery, co oznacza, że przeglądarka załaduje bibliotekę z serwera, na którym znajduje się nasza strona. Korzystanie z lokalnych kopii bibliotek jest dobrą praktyką w przypadku ograniczonego lub niestabilnego dostępu do internetu, ponieważ gwarantuje dostępność bibliotek niezależnie od zewnętrznych źródeł. Zaletą tego rozwiązania jest redukcja potencjalnych opóźnień w ładowaniu strony, ponieważ plik jest już dostępny na tym samym serwerze. Użycie lokalnych plików jest również korzystne z punktu widzenia bezpieczeństwa, gdyż pozwala kontrolować dokładną wersję załadowanej biblioteki i uniknąć potencjalnych zagrożeń wynikających z modyfikacji zewnętrznych plików. W praktyce, programiści często łączą lokalne i zdalne zasoby, wybierając odpowiednią metodę w zależności od potrzeb projektu i dostępnych zasobów sieciowych.

Pytanie 31

Co to jest ESLint?

A. Narzędzie do statycznej analizy kodu i identyfikacji problemów w kodzie JavaScript
B. System zarządzania zależnościami w projektach Node.js
C. Kompilator kodu ECMAScript do starszych wersji JavaScript
D. Framework do testowania aplikacji napisanych w JavaScript
ESLint to zaawansowane narzędzie do statycznej analizy kodu, które koncentruje się na identyfikacji problemów w kodzie JavaScript. Jego głównym celem jest poprawa jakości kodu poprzez wykrywanie potencjalnych błędów oraz niezgodności ze standardami programowania. ESLint pozwala programistom na definiowanie reguł dotyczących stylu kodu, co ułatwia utrzymanie spójności w projekcie. Narzędzie to wspiera również proces refaktoryzacji kodu, co jest kluczowe dla długoterminowej wydajności aplikacji. Przykładowo, jeśli programista użyje zmiennej, która nie została wcześniej zdefiniowana, ESLint ostrzeże go przed tym błędem, co może zapobiec krytycznym awariom w aplikacji. ESLint jest zgodny z popularnymi standardami, takimi jak Airbnb czy Google JavaScript Style Guide, co czyni go wszechstronnym narzędziem, które można łatwo dostosować do indywidualnych potrzeb zespołu. Dzięki integracji z popularnymi edytorami kodu, takimi jak Visual Studio Code, programiści mogą na bieżąco otrzymywać informacje zwrotne na temat jakości swojego kodu, co przyspiesza proces programowania i zwiększa efektywność pracy zespołowej.

Pytanie 32

Która z wymienionych metod może pomóc w walce z uzależnieniem od internetu?

A. Wprowadzenie systematycznych przerw od używania urządzeń cyfrowych
B. Zwiększenie czasu spędzanego na mediach społecznościowych
C. Zainstalowanie większej ilości aplikacji rozrywkowych
D. Używanie komputera jedynie w nocy
Wprowadzenie systematycznych przerw od używania urządzeń cyfrowych to bardzo skuteczna metoda radzenia sobie z uzależnieniem od internetu. Rekomendują ją zarówno psychologowie, jak i specjaliści zajmujący się zdrowiem cyfrowym. W praktyce chodzi o to, żeby regularnie robić świadome przerwy od ekranu – na przykład ustawiając sobie limity czasowe, korzystając z aplikacji blokujących dostęp do określonych stron czy ustalając z góry pory dnia bez używania urządzeń elektronicznych. Takie działania mają mocno pozytywny wpływ na samodyscyplinę i pomagają odzyskać równowagę między życiem offline a online. Zresztą, nawet w poradnikach branżowych dla informatyków czy programistów można znaleźć zalecenia dotyczące odpoczynku od komputera, bo to poprawia koncentrację oraz ogólne samopoczucie. Moim zdaniem, warto przetestować różne sposoby tych przerw – czasem wystarczy wyjść na spacer, zrobić coś rękami albo po prostu porozmawiać z kimś na żywo. Regularność w tych czynnościach naprawdę robi różnicę. A co ciekawe, technika Pomodoro, znana z produktywności, świetnie sprawdza się także tutaj – 25 minut pracy, potem 5 minut przerwy bez żadnych ekranów. Z mojego doświadczenia, takie przerwy pomagają nie tylko ograniczyć korzystanie z internetu, ale też zadbać o swój wzrok i kręgosłup, co jest ważne zwłaszcza dla osób pracujących przy komputerze.

Pytanie 33

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

let arr = [1, 2, 3, 4, 5];
let result = arr.filter(num => num % 2 === 0);
console.log(result);
A. 2,4
B. [1, 2, 3, 4, 5]
C. [1, 3, 5]
D. [2, 4]
Wynik działania podanego kodu to [2, 4], ponieważ zastosowana funkcja filter tworzy nową tablicę, w której znajdują się tylko te elementy, które spełniają określony warunek. W tym przypadku warunkiem jest to, że element musi być parzysty (num % 2 === 0). Z tablicy arr, która zawiera liczby od 1 do 5, tylko liczby 2 i 4 spełniają ten warunek. Filtracja danych jest bardzo przydatna w programowaniu, zwłaszcza w kontekście pracy z dużymi zbiorami danych, gdzie można łatwo wyodrębnić interesujące nas elementy. Stosowanie takich metod, jak filter, jest zgodne z zasadami programowania funkcyjnego, które promują użycie funkcji do przetwarzania danych w sposób bardziej zwięzły i czytelny. W praktyce, funkcja filter może być używana do filtrowania danych z API, przetwarzania zbiorów danych w aplikacjach, czy też w analizach danych. Takie podejście zwiększa wydajność i czytelność kodu, co jest istotne w długoterminowym utrzymaniu projektów.

Pytanie 34

W przedstawionym filmie ukazano kreator interfejsu użytkownika, dla którego automatycznie powstaje

A. obsługa przycisku ekranu dotykowego
B. kod XML
C. obsługa wciśniętego przycisku
D. kod Java
Kod XML jest obecnie najczęściej stosowanym formatem do definiowania wyglądu interfejsów użytkownika w takich narzędziach jak Android Studio czy różnego rodzaju designery graficzne. Kiedy projektujesz layout aplikacji mobilnej albo desktopowej, duża część nowoczesnych narzędzi tworzy właśnie pliki XML, które następnie są interpretowane przez system w czasie uruchamiania aplikacji. Ułatwia to rozdzielenie logiki aplikacji od jej prezentacji, co wydaje się fundamentalne przy większych projektach. Moim zdaniem takie podejście daje ogromne korzyści – można łatwo modyfikować wygląd bez dotykania kodu źródłowego. W praktyce, jeśli używasz np. Android Studio, zbudujesz interfejs przeciągając przyciski czy pola tekstowe, a pod spodem dostaniesz czytelny plik XML. To przyspiesza pracę, zwiększa czytelność projektu i pozwala na późniejsze automatyczne generowanie dokumentacji albo testów interfejsu. Takie standardy są rekomendowane nie tylko przez Google, ale też szeroko stosowane w innych środowiskach, jak chociażby XAML w Microsoft czy FXML w JavaFX. Przezroczystość działania tych narzędzi sprawia, że łatwiej jest pracować zespołowo, bo każdy może szybko zorientować się w strukturze UI patrząc na XML-a. Samo generowanie kodu XML przez narzędzia graficzne to duży krok w kierunku lepszej organizacji pracy i zgodności ze współczesnymi praktykami branżowymi.

Pytanie 35

Co to jest Continuous Integration (CI)?

A. Protokół komunikacji między różnymi częściami aplikacji
B. Metoda ciągłego monitorowania wydajności aplikacji w produkcji
C. Praktyka automatycznego integrowania kodu w repozytorium wspólnym wraz z testami
D. Technika tworzenia aplikacji mobilnych w sposób przyrostowy
Continuous Integration (CI) to praktyka, która ma na celu automatyzację procesu integrowania kodu w repozytorium wspólnym. Główną ideą CI jest to, aby programiści regularnie dodawali swoje zmiany do głównej gałęzi kodu, co pozwala na bieżące testowanie aplikacji. Dzięki temu można szybko wykrywać i naprawiać błędy, zanim staną się one poważnym problemem. Typowym przykładem zastosowania CI jest użycie narzędzi takich jak Jenkins, GitLab CI czy Travis CI, które automatycznie uruchamiają zestaw testów po każdym wprowadzeniu zmian. Takie podejście nie tylko poprawia jakość kodu, ale również przyspiesza cykl wydania oprogramowania, co jest zgodne z najlepszymi praktykami w branży. Warto również zauważyć, że CI jest często częścią szerszego podejścia do DevOps, które integruje rozwój i operacje, aby zwiększyć efektywność całego procesu wytwarzania oprogramowania.

Pytanie 36

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

A. Tablica dwuwymiarowa
B. Stos
C. Kolejka
D. Lista
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 37

Co to jest Event Loop w JavaScript?

A. Protokół komunikacji między różnymi częściami aplikacji webowej
B. Mechanizm pozwalający na asynchroniczne wykonywanie kodu mimo jednowątkowej natury JavaScript
C. System zarządzania cyklem życia komponentów w Angular
D. Technika obsługi zdarzeń w aplikacjach React
Event Loop w JavaScript to kluczowy mechanizm, który umożliwia asynchroniczne wykonywanie kodu mimo jednowątkowej natury tego języka. JavaScript działa w jednym wątku, co oznacza, że może wykonywać jedną operację w danym czasie. Event Loop pozwala jednak na zarządzanie operacjami asynchronicznymi, takimi jak wywołania API czy operacje na danych, które mogą trwać dłużej. Dzięki temu, zamiast czekać na zakończenie tych operacji, kod może kontynuować wykonywanie innych zadań. W praktyce, gdy operacja asynchroniczna kończy się, jej wynik jest umieszczany w kolejce do przetworzenia, a Event Loop zajmuje się ich przetwarzaniem, kiedy główny wątek jest dostępny. To podejście sprawia, że aplikacje webowe są bardziej responsywne, ponieważ nie blokują interfejsu użytkownika podczas oczekiwania na zakończenie długoterminowych zadań. Dobrą praktyką jest zrozumienie działania Event Loop, ponieważ pozwala to na efektywniejsze zarządzanie asynchronicznością w kodzie JavaScript, co jest niezwykle istotne w przypadku rozwijania nowoczesnych aplikacji webowych.

Pytanie 38

Który z wymienionych algorytmów sortowania jest najskuteczniejszy w przypadku dużych zbiorów danych w przeważającej liczbie sytuacji?

A. Sortowanie przez wstawianie
B. Sortowanie przez zliczanie
C. Sortowanie szybkie (QuickSort)
D. Sortowanie bąbelkowe
Sortowanie bąbelkowe ma złożoność O(n²), co czyni je nieefektywnym dla dużych zbiorów danych. Algorytm ten polega na wielokrotnym porównywaniu sąsiadujących elementów i zamianie ich miejscami, co jest procesem czasochłonnym przy dużych danych. Sortowanie przez zliczanie (Counting Sort) jest wydajne, ale najlepiej sprawdza się przy zbiorach o ograniczonym zakresie wartości. Sortowanie przez wstawianie działa w czasie O(n²) i jest skuteczne jedynie dla małych zbiorów danych lub tablic wstępnie posortowanych.

Pytanie 39

Zmienna o typie logicznym może mieć następujące wartości:

A. trzy dowolne liczby naturalne
B. 1, -1
C. 0 oraz każda liczba całkowita
D. true, false
Typ logiczny (boolean) może przyjąć jedynie dwie wartości: true (prawda) i false (fałsz). Jest to fundamentalna zasada w programowaniu, ponieważ zmienne logiczne są podstawą operacji warunkowych, pętli oraz sterowania przepływem programu. W językach takich jak C++, Java, Python i wielu innych, wartości logiczne pozwalają na budowanie złożonych struktur decyzyjnych. Dzięki nim programista może precyzyjnie kontrolować, które fragmenty kodu zostaną wykonane, co jest kluczowe w implementacji algorytmów oraz walidacji danych.

Pytanie 40

Jakie informacje zawiera zestaw instrukcji (ISA) danego procesora?

A. Instrukcje, które procesor jest w stanie wykonać
B. Metodę obsługi pamięci podręcznej
C. Typy danych, które są trzymane w pamięci
D. Układ połączeń między procesorem a innymi elementami
Zestaw instrukcji, znany jako ISA, to taki jakby słownik poleceń, które procesor potrafi zrozumieć i wykonać. To mega ważny element w projektowaniu komputerów, bo to właśnie od niego zależy, jak dobrze i szybko działa system. Mamy różne rodzaje instrukcji, na przykład te do wykonywania działań matematycznych, logicznych, czy do przenoszenia danych. Popularne zestawy jak x86 albo ARM pokazują, jak programy rozmawiają z procesorem. Jak zrozumiesz ISA, to będzie łatwiej pisać lepszy kod i dostosowywać aplikacje do różnych architektur. No i co ważne, ISA też mówi, jak procesor interpretuje te instrukcje i zarządza danymi, co ma ogromny wpływ na to, jak wydajnie wszystko działa.