Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 10 grudnia 2025 08:39
  • Data zakończenia: 10 grudnia 2025 08:46

Egzamin zdany!

Wynik: 31/40 punktów (77,5%)

Wymagane minimum: 20 punktów (50%)

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

Przedstawione logo praw Creative Commons umożliwia bezpłatne użytkowanie dzieła:

Ilustracja do pytania
A. pod warunkiem zachowania go w oryginalnej formie
B. w działaniach komercyjnych
C. pod warunkiem udostępnienia go na tej samej zasadzie licencyjnej
D. w celu modyfikacji lub remiksowania
Analizując przedstawione odpowiedzi, warto dokładnie zrozumieć, jakie uprawnienia daje licencja Creative Commons BY-NC. Często spotykanym błędem jest przekonanie, że taka licencja automatycznie pozwala na dowolne wykorzystanie dzieła, także komercyjne, albo że wymaga zachowania oryginalnej formy utworu. Tymczasem skrót NC oznacza wyłącznie użycie niekomercyjne – czyli nie można zarabiać na tym materiale ani go wykorzystywać w działaniach, które mogą mieć charakter komercyjny. To wyklucza możliwość legalnego użycia go np. w reklamie, na płatnych szkoleniach czy produktach na sprzedaż, co jest dość istotne w kontekście praw autorskich. Kolejnym często powielanym nieporozumieniem jest założenie, że tego typu licencje zabraniają modyfikacji lub remiksowania – a wręcz przeciwnie, dopuszczają takie działania, jeśli tylko nie narusza się warunków licencji. Ta pomyłka bierze się zapewne z mylenia BY-NC z licencją BY-NC-ND, gdzie „ND” to „NoDerivatives”, czyli zakaz tworzenia utworów zależnych. Z kolei warunek konieczności udostępnienia dzieła na tej samej zasadzie licencyjnej, czyli tzw. CC SA (ShareAlike), tutaj nie występuje – to osobny warunek licencyjny i jeśli nie ma go w oznaczeniu, nie trzeba się nim przejmować. Generalnie mylenie symboli lub nieczytanie oznaczeń powoduje takie nieporozumienia. W branży IT i szeroko pojętej edukacji bardzo często korzysta się z dzieł Creative Commons i znajomość tych niuansów jest wręcz kluczowa dla świadomego, legalnego działania. Jeśli w praktyce nie masz pewności, czy coś wolno – zawsze warto zajrzeć bezpośrednio do opisu licencji na oficjalnej stronie Creative Commons albo skonsultować się z kimś bardziej doświadczonym. To pozwoli uniknąć typowych błędów, które potem mogą się okazać kosztowne, zwłaszcza w projektach publicznych czy komercyjnych.

Pytanie 2

Przykład wywołania funkcji zamien w języku C++ może wyglądać w następujący sposób:

void zamien(int *a, int *b) {
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
A. zamien(*a, *b); // a, b - zmienne całkowite
B. zamien(&a, &b); // a, b - zmienne całkowite
C. zamien(12, 34)
D. zamien(m, n); // m, n - zmienne całkowite
W tym przypadku wywołanie zamien(&a, &b); jest prawidłowe, bo funkcja zamien oczekuje wskaźników do zmiennych całkowitych, nie samych wartości tych zmiennych ani ich referencji. Przekazując adresy przez &a i &b, pozwalamy funkcji modyfikować oryginalne zmienne, a nie ich kopie. To jest fundament operacji wskaźnikowych w C++. Takie podejście umożliwia tzw. przekazywanie przez adres, które jest wykorzystywane wszędzie tam, gdzie trzeba w funkcji podmienić faktyczną zawartość zmiennej, a nie tylko jej kopię. W praktyce, na przykład podczas sortowania tablic czy zamiany miejscami dwóch wartości, korzysta się właśnie z takiego mechanizmu. Przekazywanie wskaźników jest bardzo uniwersalne – pozwala nie tylko zmieniać wartości, ale też np. przekazywać duże struktury bez kopiowania całej ich zawartości, co przyspiesza program i zmniejsza zużycie pamięci. Moim zdaniem warto też zauważyć, że użycie wskaźników jest jednym z filarów programowania na niskim poziomie w C i C++. Wielu początkujących programistów boi się wskaźników (nie wiem czemu, chyba przez te wszystkie historie o błędach i segfaultach), ale jak się już zrozumie, dlaczego i jak przekazywać adresy zmiennych, to potem dużo łatwiej korzystać z bardziej zaawansowanych mechanizmów np. dynamicznej alokacji pamięci czy tablic wskaźników. Standard C++ wręcz zaleca, by wszędzie tam, gdzie funkcja ma zmienić przekazane wartości, używać wskaźników lub referencji. W tym przypadku wskaźniki są idealne, bo dokładnie tego wymaga deklaracja funkcji. Dobrze jest też znać różnicę między przekazywaniem przez wartość, wskaźnik i referencję, bo to pozwala świadomie projektować interfejsy funkcji.

Pytanie 3

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

A. O(1)
B. O(log n)
C. O(n)
D. O(n²)
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 4

Jaką rolę pełni instrukcja throw w języku C++?

A. Zgłasza wyjątek, który można przechwycić za pomocą bloku catch
B. Przerywa działanie programu, gdy wystąpi wyjątek
C. Inicjuje nowy wyjątek podczas działania aplikacji
D. Ogranicza zasięg zmiennych w bloku try
Instrukcja 'throw' w C++ służy do zgłaszania wyjątków, które mogą być następnie przechwycone i obsłużone przez blok 'catch'. Mechanizm ten pozwala na przerwanie normalnego przepływu programu w przypadku wystąpienia błędu i skierowanie sterowania do odpowiedniego miejsca obsługi wyjątków. 'Throw' jest kluczowym elementem obsługi błędów i umożliwia propagowanie informacji o błędach na wyższe poziomy programu, co pozwala na ich efektywną obsługę. Używanie wyjątków poprawia czytelność kodu, umożliwiając oddzielenie logiki biznesowej od logiki obsługi błędów.

Pytanie 5

Który z poniższych elementów jest częścią architektury PWA (Progressive Web App)?

A. Service Worker
B. Virtual Machine
C. Media Encoder
D. DOM Renderer
Service Worker to kluczowy element architektury Progressive Web App (PWA), który umożliwia działania offline, zarządzanie pamięcią podręczną oraz lepsze doświadczenie użytkownika. Działa on jako pośrednik między aplikacją a serwerem, co pozwala na interceptowanie zapytań sieciowych i dostarczanie zasobów z pamięci podręcznej, gdy sieć jest niedostępna. Dzięki temu użytkownicy mogą korzystać z aplikacji nawet w trybie offline. Service Workers są również odpowiedzialne za powiadomienia push, co zwiększa interaktywność aplikacji. W praktyce oznacza to, że można zbudować aplikację, która działa płynnie na różnych platformach (desktop, mobilne), zachowując przy tym szybkość i responsywność. Warto zaznaczyć, że Service Workers muszą być zarejestrowane na stronie obsługiwanej przez HTTPS, co jest jednym z wymogów bezpieczeństwa. Stosowanie Service Workerów jest zgodne z najlepszymi praktykami branżowymi, a ich implementacja znacząco podnosi jakość i użyteczność aplikacji webowych.

Pytanie 6

Jaki komponent środowiska IDE jest niezbędny do tworzenia aplikacji webowych?

A. Emulator urządzeń mobilnych
B. Zarządzanie bazami danych
C. Debugger, edytor kodu, integracja z systemem kontroli wersji
D. Narzędzie do tworzenia grafiki
Debugger, edytor kodu oraz integracja z systemem kontroli wersji to kluczowe elementy środowiska IDE, które umożliwiają efektywną pracę nad aplikacjami webowymi. Debugger pozwala na wykrywanie i naprawianie błędów w czasie rzeczywistym, edytor kodu umożliwia szybkie pisanie i modyfikowanie kodu, a integracja z systemem kontroli wersji (np. Git) pozwala śledzić zmiany i współpracować w zespołach programistycznych. Te narzędzia stanowią podstawę pracy każdego dewelopera webowego.

Pytanie 7

Który z wymienionych parametrów dysku twardego ma największy wpływ na jego wydajność?

A. Pojemność dysku
B. Ilość pamięci podręcznej (Cache)
C. Rodzaj złącza (SATA/PCIe)
D. Prędkość obrotowa talerzy (RPM)
Prędkość obrotowa talerzy (RPM) jest kluczowym parametrem wpływającym na szybkość dysku twardego. Wyrażana w obrotach na minutę, RPM definiuje, jak szybko talerze dysku mogą obracać się, co z kolei wpływa na czas dostępu do danych. Dyski HDD o wyższej prędkości obrotowej, takie jak 7200 RPM w porównaniu do 5400 RPM, zazwyczaj oferują lepszą wydajność, co przekłada się na szybsze odczyty i zapisy danych. Przykładowo, w zastosowaniach wymagających intensywnego przetwarzania danych, takich jak gry komputerowe czy edycja wideo, wybór dysku o wyższej prędkości obrotowej może znacznie poprawić ogólne wrażenia użytkownika. Warto również zauważyć, że chociaż złącze SATA i PCIe wpływają na szybkość transferu, to w kontekście dysków HDD, RPM pozostaje jednym z najważniejszych czynników. Standardy takie jak SATA III oferują transfery do 6 Gb/s, ale jeśli talerze nie obracają się wystarczająco szybko, potencjał transferu nie zostanie w pełni wykorzystany. Z tego powodu, RPM jest kluczowym wskaźnikiem wydajności w kontekście dysków twardych.

Pytanie 8

Jakie informacje przedstawia diagram Gantta?

A. Model przepływu danych
B. Relacje między różnymi projektami
C. Plan działań w projekcie
D. Strukturę plików w projekcie
Diagram Gantta to narzędzie używane do wizualizacji harmonogramu zadań w projekcie. Przedstawia on zadania w układzie osi czasu, co pozwala na łatwe śledzenie terminów, zależności i etapów realizacji projektu. Diagram Gantta jest niezwykle przydatny w dużych projektach, ponieważ ułatwia planowanie zasobów i umożliwia identyfikowanie potencjalnych opóźnień. Dzięki czytelnej formie, managerowie mogą szybko ocenić, które zadania są w trakcie realizacji, a które są opóźnione. Diagramy Gantta są szeroko stosowane w zarządzaniu projektami budowlanymi, IT oraz w planowaniu kampanii marketingowych.

Pytanie 9

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. ReferenceError
B. 10
C. 20
D. undefined
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 10

Resuscytacja krążeniowo-oddechowa polega na realizowaniu

A. 20 ucisków klatki piersiowej oraz 1 oddech ratunkowy
B. 30 ucisków klatki piersiowej oraz 2 oddechy ratunkowe
C. 10 ucisków klatki piersiowej oraz 5 oddechów ratunkowych
D. 15 ucisków klatki piersiowej oraz 3 oddechy ratunkowe
Resuscytacja krążeniowo-oddechowa (RKO) w obecnych wytycznych Europejskiej Rady Resuscytacji polega właśnie na wykonywaniu 30 ucisków klatki piersiowej na przemian z 2 oddechami ratunkowymi. Taki schemat jest rekomendowany zarówno dla dorosłych, jak i dzieci (poza niemowlętami i sytuacjami szczególnymi), bo zapewnia optymalną perfuzję mózgu i serca, a jednocześnie daje szansę na dostarczenie tlenu do organizmu. Gdyby skrócić liczbę ucisków albo oddechów, efektywność spada, a szansa przeżycia jest mniejsza. Ja zawsze powtarzam, że praktyka czyni mistrza – jak ćwiczyliśmy na fantomach, to właśnie ten rytm: 30 ucisków, potem 2 szybkie oddechy, bez zbędnych przerw. Praktycznie, w stresie łatwo się pogubić, ale jak sobie utrwalicie ten schemat, działa automatycznie. Warto wiedzieć, że uciski muszą być na głębokość około 5–6 cm u dorosłych, z częstotliwością co najmniej 100–120 na minutę – to jest kluczowe dla skuteczności. Z mojego doświadczenia wynika, że najczęściej popełnianym błędem jest zbyt płytkie uciskanie i zbyt długie przerwy na oddechy, warto to poćwiczyć. Kiedy nie chce się robić oddechów (np. obawa przed zakażeniem), można prowadzić tylko uciski, ale pełne RKO daje największe szanse. Takie podejście jest sprawdzone praktycznie na całym świecie i jak dla mnie, nie ma sensu kombinować z innymi proporcjami.

Pytanie 11

W jakiej metodzie zarządzania projektami nacisk kładzie się na ograniczenie marnotrawstwa?

A. Waterfall
B. Kanban
C. Prototypowy
D. Scrum
Kanban to metodologia zarządzania projektem, która koncentruje się na minimalizacji marnotrawstwa i optymalizacji przepływu pracy. Kluczowym elementem Kanbanu jest wizualizacja procesu za pomocą tablicy, na której znajdują się zadania w różnych fazach realizacji. Dzięki temu zespół może łatwo identyfikować wąskie gardła i eliminować zbędne procesy. Kanban promuje ciągłe doskonalenie (kaizen) i pozwala na dostosowywanie się do zmieniających się priorytetów bez konieczności reorganizacji całego projektu. Ta metodologia jest szeroko stosowana w branży IT, produkcji oraz w zespołach operacyjnych, które wymagają dużej elastyczności.

Pytanie 12

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

export function fun1(number) {
    if (number < 0)
        number = number * (-1);
    return number;
}
describe('fun1', () => {
    it('test1', () => {
        const result = fun1(-1);
        expect(result).toBe(1);
    })
    ...
})
it('test2', () => {
    const result = fun1(1);
    expect(result).toBe(result+1);
})
A.
it('test2', () => {
    const result = fun1(2);
    expect(result).toBe(-2);
})
B.
it('test2', () => {
    const result = fun1(2);
    expect(result).toBe(2);
})
C.
it('test2', () => {
    const result = fun1(1);
    expect(result).toBe(-1);
})
D.
A. Odpowiedź C
B. Odpowiedź B
C. Odpowiedź D
D. Odpowiedź A
Błędne odpowiedzi A B oraz D wynikają z niepoprawnego zrozumienia działania funkcji fun1 która przekształca wartość ujemną na dodatnią ale nie zmienia wartości dodatnich Odpowiedź A sugeruje że funkcja powinna dodać 1 do wartości co nie jest zgodne z jej definicją Funkcja nie wykonuje operacji arytmetycznych poza mnożeniem ujemnych liczb przez -1 co w odpowiedzi A nie ma zastosowania Wynik testu oczekiwany jako result+1 nie odzwierciedla poprawnego działania funkcji Odpowiedź B natomiast błędnie zakłada że funkcja przekształca dodatnie liczby w ujemne co nie jest prawdą Funkcja jedynie zmienia znak dla ujemnych wartości więc test oczekujący że 2 przekształci się w -2 jest niepoprawny Odpowiedź D z kolei zakłada że funkcja zmienia znak liczby dodatniej 1 do wartości -1 co również nie jest zgodne z założeniami funkcji Fun1 powinna zwracać tę samą wartość dla liczby dodatniej Funkcje jednostkowe są kluczowym narzędziem do zapewnienia niezawodności kodu i ich prawidłowe zrozumienie jest niezbędne do skutecznego testowania oprogramowania W kontekście tego pytania jedynie odpowiedź C prawidłowo odzwierciedla poprawne zachowanie funkcji dla wartości dodatnich co jest zgodne z jej implementacją

Pytanie 13

Jakie polecenie w Gicie jest używane do zapisywania zmian w lokalnym repozytorium?

A. git push
B. git commit
C. git pull
D. git clone
Polecenie 'git commit' zapisuje zmiany w lokalnym repozytorium Git. Jest to kluczowy krok w procesie kontroli wersji, ponieważ każdy commit tworzy nową migawkę (snapshot) projektu, która może być w przyszłości przywrócona lub porównana z innymi wersjami. Polecenie to jest często używane razem z opcją -m, która umożliwia dodanie wiadomości opisującej zmiany. Dzięki temu możliwe jest efektywne śledzenie historii zmian w projekcie i przywracanie wcześniejszych wersji w razie potrzeby. Git commit to podstawowe narzędzie w pracy zespołowej nad kodem, szczególnie w środowisku deweloperskim, gdzie wersjonowanie jest niezbędne do zapewnienia stabilności kodu i łatwej współpracy.

Pytanie 14

Co to jest algorytm QuickSort?

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

Pytanie 15

Jakie jest przeznaczenie polecenia "git merge"?

A. Do pobierania aktualizacji zdalnego repozytorium
B. Do łączenia zmian z różnych gałęzi
C. Do usuwania zmian w repozytorium
D. Do zakładania nowego repozytorium
Polecenie "git merge" służy w Git do łączenia zmian z różnych gałęzi. Kiedy pracujemy w zespole i każdy programista rozwija swój fragment kodu na osobnej gałęzi, w pewnym momencie trzeba te zmiany zebrać do kupy, żeby powstała jedna, wspólna wersja projektu. Tu właśnie pojawia się "merge" – pozwala w prosty sposób dołączyć zmiany z jednej gałęzi do drugiej, najczęściej z feature branch do develop albo main. Praktycznie rzecz biorąc, to polecenie sprawdza się zawsze wtedy, gdy chcemy zintegrować efekty pracy kilku osób lub wersje rozwojowe z główną linią kodu. Moim zdaniem, korzystanie z "git merge" to w zasadzie codzienność w projektach zespołowych, bo prawie nikt już nie pracuje tylko na jednej gałęzi. Warto też pamiętać, że merge może czasem prowadzić do konfliktów, jeśli te same fragmenty plików były zmieniane równolegle – wtedy trzeba ręcznie rozwiązać te rozbieżności. W praktyce, dobrą praktyką jest regularne mergowanie, żeby uniknąć lawiny konfliktów na koniec sprintu. Dla mnie "merge" to narzędzie absolutnie kluczowe, bez którego ciężko sobie wyobrazić sensowną pracę z Gitem. No i jeszcze – to nie to samo co "rebase", chociaż oba służą do integracji zmian, ale w różny sposób. Merge zostawia historię połączeń, co ułatwia śledzenie zmian w większych projektach.

Pytanie 16

Które z poniższych nie jest algorytmem sortowania?

A. Bubble Sort
B. Binary Search
C. Merge Sort
D. Quick Sort
Binary Search jest algorytmem, który służy do efektywnego przeszukiwania uporządkowanych zbiorów danych, a nie do sortowania. Działa na zasadzie dzielenia zbioru na pół i eliminowania połowy z nich w każdym kroku, co pozwala na szybkie znalezienie poszukiwanej wartości. Jest to przykład algorytmu o czasie działania O(log n), co sprawia, że jest znacznie szybszy od prostego przeszukiwania liniowego. Przykładowo, gdy mamy posortowaną tablicę liczb, Binary Search może być użyty do znalezienia konkretnej liczby, eliminując w każdym kroku połowę zbioru, aż do odnalezienia wartości lub stwierdzenia, że jej nie ma. W kontekście branżowym, Binary Search jest szeroko stosowany w różnych aplikacjach, gdzie wymagane jest szybkie przeszukiwanie danych, na przykład w bazach danych i aplikacjach wyszukiwania. Kluczowe jest zrozumienie różnicy między algorytmem przeszukiwania a algorytmem sortowania; sortowanie odnosi się do organizacji danych w określonym porządku, podczas gdy Binary Search koncentruje się na znajdowaniu elementów w już posortowanych zbiorach.

Pytanie 17

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

A. Określenie metody wirtualnej
B. Rozszerzanie tej klasy
C. Definiowanie pól publicznych
D. Utworzenie instancji tej klasy
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 18

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

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

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

Pytanie 19

Reguła zaangażowania i konsekwencji jako jedna z zasad wpływania na innych odnosi się

A. do doprowadzania spraw do końca
B. do uległości wobec autorytetów
C. do odwzajemniania się osobie, która nam pomogła
D. do kierowania się zdaniem danej grupy
Kiedy analizujemy regułę zaangażowania i konsekwencji, łatwo ją pomylić z innymi mechanizmami społecznymi wpływania na ludzi, bo te psychologiczne zasady czasem zachodzą na siebie w praktyce. Moim zdaniem najczęściej mylonym pojęciem tutaj jest reguła wzajemności, która mówi o tym, że ludzie czują się zobowiązani, by się odwdzięczyć za otrzymaną pomoc – to jednak zupełnie inny mechanizm, związany bardziej z relacjami i budowaniem zaufania niż z wewnętrzną potrzebą bycia konsekwentnym względem własnych decyzji. Z kolei kierowanie się zdaniem grupy to klasyczna presja społeczna czy konformizm, która też bywa silnym czynnikiem wpływu, ale opiera się na chęci dopasowania się do większości, a nie na wcześniejszych własnych zobowiązaniach. No i jeszcze uległość wobec autorytetów – tu chodzi głównie o to, że ludzie mają tendencję słuchać osób postrzeganych jako eksperci czy przełożeni, bo wierzą w ich większą wiedzę czy doświadczenie. To inny proces, nie związany z samą konsekwencją własnych działań. Typowym błędem jest patrzenie na te zasady jakby były zamienne, a w rzeczywistości każda wywołuje inne motywacje i wywołuje inny rodzaj zachowań. W branżowych dobrych praktykach, na przykład w sprzedaży B2B czy w projektach zespołowych, bardzo ważne jest rozróżnianie tych pojęć, by umiejętnie stosować odpowiednie narzędzia wpływu. Warto zawsze pamiętać, że reguła zaangażowania i konsekwencji opiera się na wewnętrznym przymusie trzymania się własnych wcześniejszych wyborów – niezależnie od opinii innych czy zewnętrznej presji.

Pytanie 20

Dokumentacja, która została przedstawiona, dotyczy algorytmu sortowania

To prosta metoda sortowania opierająca się na cyklicznym porównywaniu par sąsiadujących ze sobą elementów i zamianie ich miejscami w przypadku, kiedy kryterium porządkowe zbioru nie zostanie spełnione. Operacje te wykonywane są dopóki występują zmiany, czyli tak długo, aż cały zbiór zostanie posortowany.
A. szybkie (Quicksort)
B. bąbelkowe
C. przez wybór
D. przez wstawianie
Opis w pytaniu jednoznacznie wskazuje na sortowanie bąbelkowe, a nie szybkie (quicksort), przez wybór czy przez wstawianie. Wiele osób daje się zwieść terminologii lub myli charakterystyczne cechy poszczególnych algorytmów, bo przecież wszystkie mają na celu uporządkowanie danych. Jeśli chodzi o quicksort, to działa on zupełnie inaczej – opiera się na wyborze tzw. pivota (elementu głównego), a następnie dzieli tablicę na dwie części: mniejsze i większe od tego elementu. Proces ten jest rekurencyjny i nie polega na cyklicznym porównywaniu jedynie sąsiadujących elementów, tylko na podziale i sortowaniu podtablic. Z mojego doświadczenia wynika, że quicksort jest znacznie wydajniejszy (średnio O(n log n)), ale już implementacyjnie bardziej złożony. Z kolei sortowanie przez wybór (selection sort) polega na znajdowaniu na każdym przebiegu najmniejszego (lub największego) elementu i umieszczaniu go na właściwej pozycji. Nie ma tu zamiany sąsiadujących elementów w kółko – to raczej systematyczne przesuwanie wybranego elementu do przodu zbioru. Sortowanie przez wstawianie (insertion sort) przypomina układanie kart – bierzesz kolejne elementy i wstawiasz je w odpowiednie miejsce w już częściowo posortowanej liście. Tutaj znowu nie chodzi o ciągłe zamienianie miejscami sąsiednich elementów podczas każdego przebiegu, tylko o przesuwanie elementów do przodu aż do znalezienia właściwej pozycji. Typowym błędem jest sugerowanie się słowem „prosta metoda” i mylenie jej z insertion sort, bo oba algorytmy są faktycznie czytelne, ale sposób działania mają kompletnie inny. Branżowe dobre praktyki podpowiadają, by dobrać algorytm do konkretnego problemu – bąbelkowy przydaje się do pokazania podstaw, ale rzadko bywa praktyczny przy dużych zbiorach. Dlatego dokładne czytanie opisu i rozróżnianie tych subtelnych różnic w działaniu algorytmów jest bardzo ważne, szczególnie przy zadaniach rekrutacyjnych czy na egzaminach zawodowych.

Pytanie 21

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

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

Pytanie 22

Jakie jest najważniejsze właściwość algorytmów szyfrowania symetrycznego?

A. Szyfrowanie wyłącznie tekstowych plików
B. Zastosowanie odmiennych kluczy do szyfrowania i deszyfrowania
C. Funkcjonowanie bez użycia klucza
D. Zastosowanie identycznego klucza do szyfrowania oraz deszyfrowania
Algorytmy asymetryczne działają inaczej, bo wykorzystują różne klucze do szyfrowania i deszyfrowania, jak np. RSA. To totalnie różni je od algorytmów symetrycznych. No i są też algorytmy, które nie potrzebują klucza, takie jak hashowanie (MD5, SHA), które robią unikalne skróty danych, ale nie da się ich odwrócić. A jeśli chodzi o szyfrowanie plików tekstowych, to to tylko mały kawałek tego, co algorytmy symetryczne potrafią, bo mogą szyfrować właściwie wszystkie dane, bez względu na to, w jakim formacie są.

Pytanie 23

Który element HTML5 służy do wyświetlania zawartości video?

A. &lt;video&gt;
B. &lt;film&gt;
C. &lt;play&gt;
D. &lt;media&gt;
Element HTML5 <video> jest kluczowym składnikiem do wyświetlania treści wideo w przeglądarkach. Dzięki niemu można łatwo osadzić filmy na stronach internetowych, co sprawia, że są one bardziej interaktywne i atrakcyjne dla użytkowników. Przykład użycia tego tagu wygląda następująco: <video src='film.mp4' controls></video>. Atrybut 'controls' pozwala na dodanie prostych przycisków odtwarzania, pauzy i regulacji głośności, co znacząco poprawia doświadczenia użytkownika. Warto również wspomnieć, że element <video> wspiera różne formaty wideo, takie jak MP4, WebM czy Ogg, co jest istotne w kontekście zgodności z różnymi przeglądarkami i urządzeniami. W praktyce, stosowanie <video> pozwala na łatwe zarządzanie wideo, w tym na dodawanie napisów, ustawienie automatycznego odtwarzania czy loopowania. To sprawia, że jest on niezwykle popularny w tworzeniu nowoczesnych stron internetowych, które chcą dostarczać wartościowe multimedia. Zastosowanie tego elementu jest zgodne z najlepszymi praktykami w zakresie dostępności i użyteczności, co czyni go niezwykle ważnym w dzisiejszym web development.

Pytanie 24

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

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

Pytanie 25

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

$x = 5; $y = '5'; var_dump($x == $y); var_dump($x === $y);
A. bool(false) bool(false)
B. bool(true) bool(false)
C. bool(false) bool(true)
D. bool(true) bool(true)
Odpowiedź bool(true) bool(false) jest prawidłowa, ponieważ w PHP porównania używane w tym kodzie różnią się pod względem operatorów. Pierwsze porównanie z użyciem operatora == jest porównaniem luźnym, co oznacza, że PHP dokonuje konwersji typów przed porównaniem. W tym przypadku zmienna $x o wartości 5 (typ integer) jest porównywana z $y, która ma wartość '5' (typ string). Po konwersji typów oba są interpretowane jako liczba 5, więc wynik to true. W drugim porównaniu operator === sprawdza zarówno wartość, jak i typ zmiennych. W tym przypadku $x jest integerem, a $y jest stringiem, więc ich typy się różnią. W związku z tym wynik to false. W praktyce, używanie operatora === jest zalecane, ponieważ pozwala uniknąć niespodzianek związanych z automatyczną konwersją typów, co jest często źródłem błędów w kodzie. Warto mieć to na uwadze przy pisaniu bardziej skomplikowanych skryptów, aby zapewnić, że porównania są jednoznaczne i wiarygodne.

Pytanie 26

Jaki jest kluczowy zamysł wzorca "Kompozyt" (Composite)?

A. Umożliwienie klientom obsługi obiektów oraz ich zbiorów w spójny sposób
B. Stworzenie jednej klasy do zarządzania wieloma obiektami tego samego rodzaju
C. Danie możliwości dynamicznej zmiany zachowania obiektu
D. Określenie interfejsu komunikacji pomiędzy składnikami systemu
Zarządzanie wieloma obiektami tego samego typu to cecha wzorca Fabryka (Factory) lub Builder, a nie Kompozyt. Definiowanie interfejsu komunikacji między komponentami systemu to rola wzorca Mediator, który organizuje interakcje między różnymi obiektami. Umożliwienie dynamicznej zmiany zachowania obiektu jest domeną wzorca Strategia (Strategy) lub Dekorator (Decorator), które oferują elastyczność w zakresie modyfikacji zachowania podczas działania programu.

Pytanie 27

Zapis w języku C# przedstawia definicję klasy Car, która:

public class Car: Vehicle { ... }
A. jest klasą podstawową (nie dziedziczy po innej klasie)
B. używa pól prywatnych klasy Vehicle
C. odziedzicza po Vehicle
D. jest zaprzyjaźniona z klasą Vehicle
Słusznie, zapis public class Car : Vehicle { ... } w języku C# oznacza, że klasa Car dziedziczy po klasie Vehicle. To jest tak zwane dziedziczenie, jeden z fundamentalnych mechanizmów programowania obiektowego. Dzięki temu Car odzyskuje wszystkie publiczne i chronione (protected) człony klasy Vehicle, a dodatkowo może wprowadzać własne składowe albo nadpisywać metody bazowe. Przykładowo, jeśli Vehicle ma metodę Start(), to Car również ją posiada, chyba że ją nadpisze słówkiem override. Moim zdaniem, znajomość dziedziczenia ułatwia projektowanie czytelnych oraz rozszerzalnych systemów, zwłaszcza w większych projektach. W praktyce — jeśli tworzysz aplikację zarządzającą różnymi pojazdami, to możesz mieć np. klasę Vehicle z uniwersalnymi funkcjami i kilka pochodnych (takich jak Car, Truck, Motorcycle), co pozwala trzymać wspólną logikę w jednym miejscu. Warto pamiętać, że w C# jest tylko dziedziczenie pojedyncze jeśli chodzi o klasy (w przeciwieństwie do niektórych innych języków). To też zgodne z SOLID, gdzie jedna klasa powinna mieć jasno określoną odpowiedzialność. Ja często spotykam się z tym podejściem w kodzie produkcyjnym – porządek w strukturze to podstawa, a dziedziczenie bardzo w tym pomaga.

Pytanie 28

Na schemacie widoczny jest fragment diagramu blokowego pewnego algorytmu. Ile razy zostanie zweryfikowany warunek n<7?

Ilustracja do pytania
A. 8
B. 7
C. 6
D. 5
Wartość 8 pokazuje, że chyba źle zrozumiałeś, jak działa liczba iteracji. Pojawiły się dodatkowe porównania, które nie powinny się zdarzyć w pętli. A wynik 5 może być przez to, że pętla zakończyła się za szybko, albo myślałeś, że zmienna zaczyna się z innej wartości. Z kolei 7 to już za dużo iteracji, co nie pasuje do standardowego działania pętli warunkowej.

Pytanie 29

Jakie są cechy testów interfejsu?

A. Analizują wydajność aplikacji w czasie rzeczywistym
B. Weryfikują zgodność aplikacji z przepisami prawnymi
C. Ulepszają kod aplikacji
D. Sprawdzają prawidłowość pracy elementów graficznych oraz interakcji użytkownika z aplikacją
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 30

Jakie jest przeznaczenie komentarzy w kodzie źródłowym programu?

A. Do optymalizacji wydajności kodu
B. Do uruchamiania kodu w trybie debugowania
C. Do dokumentowania działania kodu i ułatwienia jego zrozumienia
D. Do definiowania zmiennych globalnych
Komentarze w kodzie źródłowym programu pełnią kluczową rolę w dokumentowaniu działania aplikacji. Dzięki nim programiści mogą opisywać, co robią poszczególne fragmenty kodu, jakie funkcje realizują oraz jakie są zależności między modułami. Komentarze nie wpływają na działanie programu, ale znacząco ułatwiają pracę nad nim w przyszłości, zwłaszcza gdy projekt jest rozwijany przez wielu programistów lub po dłuższej przerwie. Komentarze poprawiają czytelność kodu, minimalizując ryzyko błędów wynikających z niejasności lub złej interpretacji działania aplikacji. W dobrze napisanym kodzie komentarze są używane strategicznie – opisują kluczowe algorytmy, niestandardowe rozwiązania oraz obszary wymagające szczególnej uwagi. Przejrzysty i dobrze udokumentowany kod to fundament skalowalnych i łatwych w utrzymaniu aplikacji.

Pytanie 31

Programem służącym do monitorowania błędów oraz organizacji projektów jest:

A. Bugzilla
B. Git
C. Jasmine
D. Jira
Jira to narzędzie, które zdecydowanie wyróżnia się w kwestii zarządzania projektami programistycznymi oraz monitorowania błędów. Z mojego doświadczenia wynika, że praktycznie każda większa firma IT używa Jiry do śledzenia zgłoszeń, tzw. ticketów, które mogą dotyczyć zarówno zadań, jak i błędów do naprawienia. Co istotne, Jira pozwala na bardzo rozbudowaną konfigurację – można tworzyć workflow, automatyzować przypisania zadań, integrować ją z repozytoriami kodów (np. GitHub, Bitbucket), testami automatycznymi, a nawet narzędziami do continuous integration. Standardem branżowym jest prowadzenie rejestru błędów (bug tracker) i backlogu zadań właśnie w Jirze, bo wszystko odbywa się w jednym miejscu, a zespół ma przejrzysty widok postępów. Bardzo fajna jest opcja generowania raportów – łatwo można sprawdzić, ile błędów zostało naprawionych, ile czeka na poprawki czy jak poszczególni członkowie zespołu realizują swoje zadania. Jira jest też zgodna z metodykami Agile, np. Scrum czy Kanban, co dodatkowo ułatwia zarządzanie sprintami, planowanie i retrospektywy. Uważam, że znajomość tego narzędzia to podstawa dla każdego, kto myśli o pracy w branży IT na poważnie. Warto też wiedzieć, że Jira obsługuje zarówno małe zespoły, jak i międzynarodowe projekty, bo jest bardzo skalowalna i można ją dostosować praktycznie do każdego procesu.

Pytanie 32

Który z wymienionych terminów dotyczy klasy, która stanowi podstawę dla innych klas, lecz nie może być tworzona w instancji?

A. Klasa finalna
B. Klasa abstrakcyjna
C. Klasa statyczna
D. Klasa pochodna
Klasa abstrakcyjna to klasa, która nie może być instancjonowana i służy jako szablon dla innych klas. Definiuje ona ogólną strukturę oraz interfejs, który klasy pochodne muszą zaimplementować. Klasy abstrakcyjne mogą zawierać zarówno metody z ciałem (zdefiniowane), jak i metody czysto wirtualne (bez implementacji), które muszą być przesłonięte w klasach pochodnych. W C++ deklaracja czysto wirtualnej metody odbywa się za pomocą '= 0'. Klasa abstrakcyjna zapewnia spójność interfejsu i narzuca implementację określonych metod we wszystkich klasach dziedziczących, co prowadzi do bardziej przewidywalnego i bezpiecznego kodu.

Pytanie 33

Jakie działanie wykonuje polecenie "git pull"?

A. Tworzy nową gałąź w repozytorium
B. Zachowuje zmiany w lokalnym repozytorium
C. Pobiera zmiany z zdalnego repozytorium i scala je z lokalnym
D. Eliminuje plik z repozytorium
Polecenie 'git pull' pobiera najnowsze zmiany ze zdalnego repozytorium i scala je z lokalnym repozytorium. Jest to jedno z podstawowych poleceń w Git, pozwalające na synchronizację lokalnej kopii projektu z wersją przechowywaną w chmurze lub na serwerze. Dzięki 'git pull' programiści mogą na bieżąco aktualizować swoje repozytoria i unikać konfliktów, które mogłyby wyniknąć z pracy na nieaktualnej wersji kodu. Proces ten automatycznie łączy pobrane zmiany, co eliminuje konieczność ręcznego kopiowania plików lub komend.

Pytanie 34

Jaki rodzaj ataku hakerskiego polega na bombardowaniu serwera ogromną ilością żądań, co prowadzi do jego przeciążenia?

A. Man-in-the-Middle
B. SQL Injection
C. Phishing
D. DDoS
Atak DDoS (Distributed Denial of Service) polega na zasypywaniu serwera dużą ilością zapytań, co prowadzi do jego przeciążenia i unieruchomienia. W tym rodzaju ataku, hakerzy wykorzystują sieć skompromitowanych komputerów, znanych jako botnety, aby wysłać ogromne ilości nieautoryzowanych żądań do docelowego serwera w krótkim czasie. Celem DDoS jest spowodowanie, że serwer nie jest w stanie odpowiedzieć na prawidłowe zapytania od autentycznych użytkowników, co skutkuje awarią usługi. Przykłady ataków DDoS obejmują SYN Flood, UDP Flood oraz HTTP Flood, gdzie każdy z tych typów wykorzystuje różne protokoły i metody do zablokowania normalnego ruchu. Standardy takie jak RFC 793 definiują protokół TCP, który może być narażony na ataki SYN Flood. Ważne jest, aby organizacje stosowały odpowiednie środki zabezpieczające, takie jak systemy detekcji intruzów (IDS), firewalle, oraz usługi ochrony DDoS, aby minimalizować ryzyko i skutki tych ataków.

Pytanie 35

W jakiej sytuacji kolekcja typu lista okaże się bardziej wydajna niż tablica?

A. Gdy liczba elementów w kolekcji jest niezmienna
B. Gdy mamy pewność co do dokładnego rozmiaru kolekcji przed kompilacją
C. Gdy chcemy uzyskać dostęp do elementów przy pomocy indeksu
D. Gdy liczba elementów w kolekcji zmienia się dynamicznie
Tablica jest bardziej efektywna, gdy liczba elementów jest stała, ponieważ umożliwia szybki dostęp do elementów za pomocą indeksów. Jednak tablice mają ograniczoną elastyczność – ich rozmiar musi być znany na etapie kompilacji lub inicjalizacji. Gdy liczba elementów jest dynamiczna, tablice mogą prowadzić do nadmiernego wykorzystania pamięci lub jej braku. Dostęp do elementów przez indeks działa wydajnie w tablicach, ale w przypadku częstych operacji dodawania lub usuwania elementów jest mniej efektywny. Znajomość dokładnego rozmiaru kolekcji przed kompilacją czyni tablice bardziej odpowiednimi dla z góry określonych danych.

Pytanie 36

Ergonomiczną oraz właściwą pozycję do pracy przy komputerze zapewni fotel, którego

A. podłokietniki są 30 cm powyżej blatu
B. oparcie w rejonie szyi jest nachylone do przodu o 40ᵒ
C. oparcie wspiera lordozę w dolnym odcinku pleców
D. podłokietniki znajdują się 20 cm poniżej blatu
Prawidłowa i ergonomiczna pozycja pracy przy komputerze jest kluczowa dla zdrowia i komfortu użytkownika. Oparcie krzesła, które zapewnia lordozę w odcinku lędźwiowym, jest niezbędne, ponieważ pozwala na zachowanie naturalnej krzywizny kręgosłupa. Lordoza lędźwiowa to naturalne wygięcie kręgosłupa w dolnej części pleców, które wspiera prawidłowe ułożenie ciała podczas siedzenia. Krzesło powinno być zaprojektowane tak, aby oparcie przylegało do krzywizny ciała, co minimalizuje ryzyko bólu pleców oraz przeciążeń. Praktycznym przykładem ergonomicznej pozycji jest ustawienie oparcia w taki sposób, aby jego dolna część była dostosowana do odcinka lędźwiowego. Zgodnie z normami ISO 9241, które dotyczą ergonomii miejsc pracy przy komputerze, krzesło powinno umożliwiać użytkownikowi przyjęcie wygodnej pozycji z podparciem dla dolnej części pleców. W odpowiedniej pozycji stopy powinny spoczywać płasko na podłodze, a kolana powinny być na poziomie bioder, co wspiera prawidłowe krążenie krwi oraz redukuje napięcia mięśniowe.

Pytanie 37

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

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

Pytanie 38

Co to jest garbage collection w programowaniu?

A. Metoda kompresji danych w bazach SQL
B. Automatyczne zarządzanie pamięcią, które zwalnia pamięć zajmowaną przez nieużywane obiekty
C. Technika optymalizacji algorytmów sortowania danych
D. Proces usuwania nieużywanych elementów z interfejsu użytkownika
Garbage collection (GC) to kluczowy proces w wielu językach programowania, takich jak Java, C# czy Python, odpowiedzialny za automatyczne zarządzanie pamięcią. Dzięki mechanizmowi GC możliwe jest wykrywanie oraz zwalnianie pamięci zajmowanej przez obiekty, które nie są już używane w aplikacji. W praktyce oznacza to, że programista nie musi ręcznie zarządzać cyklem życia obiektów, co minimalizuje ryzyko wycieków pamięci i poprawia stabilność aplikacji. Mechanizm ten działa zazwyczaj w tle, analizując dostępność obiektów w pamięci oraz ich referencje. Przykładem zastosowania GC jest optymalizacja pamięci w aplikacjach serwerowych, gdzie długotrwałe działanie i efektywne zarządzanie zasobami są krytyczne. Użycie garbage collection zgodnie z dobrymi praktykami pozwala na pisanie bardziej przejrzystego i łatwiejszego w utrzymaniu kodu, co jest szczególnie ważne w projektach realizowanych w zespołach. Warto również wspomnieć, że różne implementacje GC (np. generacyjne kolekcje, inkrementalne zbieranie śmieci) mają różne podejścia do zarządzania pamięcią, co może wpływać na wydajność aplikacji.

Pytanie 39

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

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

Pytanie 40

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

A. 30 wdechów ratowniczych bez uciśnięć
B. 30 uciśnięć klatki piersiowej na przemian z 2 wdechami ratowniczymi
C. 20 uciśnięć klatki piersiowej na przemian z 5 wdechami ratowniczymi
D. 10 uciśnięć klatki piersiowej bez wdechów
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.