Wyniki egzaminu

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

Egzamin zdany!

Wynik: 31/40 punktów (77,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

Który z operatorów w Pythonie umożliwia sprawdzenie, czy dany element należy do listy?

A. and
B. in
C. ==
D. is
Operator `in` w języku Python służy do sprawdzania, czy element należy do listy, zbioru, krotki lub innego obiektu iterowalnego. Przykład: `if 5 in lista` sprawdza, czy liczba 5 znajduje się w liście. Operator `in` jest niezwykle przydatny w przeszukiwaniu danych, a jego zastosowanie skraca kod i zwiększa jego czytelność. W Pythonie jest on szeroko stosowany do iteracji i filtrowania danych, co czyni go jednym z najbardziej intuicyjnych operatorów języka.

Pytanie 2

Która z metod zarządzania projektami stawia na przejrzystość oraz wizualizację bieżących zadań?

A. Waterfall
B. Kanban
C. Agile
D. Scrum
Kanban to metodologia zarządzania projektami, która kładzie nacisk na transparentność i wizualizację pracy w toku (work in progress). Tablica Kanban, podzielona na kolumny oznaczające różne etapy realizacji zadań, pozwala na bieżąco śledzić postęp prac i identyfikować ewentualne blokady. Transparentność procesów umożliwia zespołowi optymalizację przepływu zadań i minimalizację zaległości. W Kanbanie ważna jest elastyczność i możliwość dostosowywania liczby zadań w toku (WIP), co pozwala na uniknięcie przeciążenia zespołu i zwiększenie produktywności.

Pytanie 3

Który z wymienionych przykładów ilustruje projektowanie interfejsu zgodnego z zasadami user experience (UX)?

A. Przycisk umieszczony w przypadkowym miejscu aplikacji
B. Zastosowanie jedynie jednego koloru w całym interfejsie
C. Brak opcji cofnięcia już wykonanej akcji
D. Użycie czytelnych czcionek i intuicyjnego układu elementów
Użycie czytelnych czcionek i intuicyjnego układu elementów to kluczowe zasady projektowania zgodne z user experience (UX). Przejrzystość i estetyka interfejsu zwiększają komfort użytkownika i ułatwiają korzystanie z aplikacji. Intuicyjny układ elementów pozwala na szybkie odnalezienie potrzebnych funkcji, co redukuje frustrację użytkownika i skraca czas potrzebny na realizację zadania. UX opiera się na badaniach dotyczących zachowań użytkowników i dostosowywaniu projektu do ich potrzeb.

Pytanie 4

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

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

Pytanie 5

Który z wymienionych elementów stanowi przykład zbiorowej ochrony?

A. Ekran akustyczny
B. Kask ochronny
C. Okulary ochronne
D. Zatyczki do uszu
Ekran akustyczny to przykład środka ochrony zbiorowej, który redukuje poziom hałasu w miejscu pracy, chroniąc większą grupę pracowników jednocześnie. Środki ochrony zbiorowej mają na celu eliminowanie zagrożeń u źródła i zabezpieczanie całego środowiska pracy, a nie pojedynczych osób. Ekrany akustyczne są często stosowane w zakładach produkcyjnych, gdzie hałas maszyn może przekraczać dopuszczalne normy. Dzięki nim można zmniejszyć poziom hałasu i poprawić komfort pracy, bez konieczności wyposażania każdego pracownika w ochronniki słuchu. Środki ochrony zbiorowej są bardziej efektywne w długoterminowej perspektywie, ponieważ zmniejszają ryzyko dla wszystkich pracowników na danym stanowisku.

Pytanie 6

Co to jest JWT (JSON Web Token)?

A. Format kompresji danych JavaScript i HTML w aplikacjach webowych
B. Biblioteka JavaScript do manipulacji danymi JSON
C. Protokół transferu plików JSON między serwerami
D. Otwarty standard do bezpiecznego przekazywania danych w formacie JSON
JWT (JSON Web Token) to otwarty standard, który pozwala na bezpieczne przesyłanie danych między stronami jako obiekt JSON. Token ten składa się z trzech części: nagłówka (header), ładunku (payload) oraz podpisu (signature). Nagłówek określa typ tokenu i używany algorytm szyfrowania, ładunek zawiera dane, które chcemy przekazać, a podpis zapewnia integralność i autentyczność danych. JWT jest powszechnie wykorzystywany w autoryzacji i wymianie informacji między serwerem a klientem, na przykład w aplikacjach webowych, gdzie po zalogowaniu użytkownik otrzymuje token, który może być użyty do uzyskania dostępu do chronionych zasobów. Dzięki temu mechanizmowi, serwer nie musi przechowywać sesji, co zwiększa jego wydajność. Ważnym aspektem JWT jest jego bezstanowość oraz możliwość łatwego skalowania aplikacji, co czyni go popularnym rozwiązaniem w architekturze mikroserwisów. Dobrą praktyką jest stosowanie JWT w połączeniu z HTTPS, aby zapewnić dodatkową warstwę bezpieczeństwa przy przesyłaniu tokenów.

Pytanie 7

Wskaż programowanie, w którym możliwe jest stworzenie aplikacji mobilnej dla systemu Android?

A. Obiective-C
B. Swift
C. C++
D. Java
Java jest jednym z najważniejszych języków programowania wykorzystywanych do tworzenia aplikacji mobilnych na platformę Android. Został stworzony przez firmę Sun Microsystems i obecnie jest rozwijany przez Oracle. Java jest językiem obiektowym, co oznacza, że umożliwia programistom tworzenie aplikacji w sposób modularny i zorganizowany. W kontekście Androida, Java jest podstawowym językiem, w którym bazowe API (Application Programming Interface) zostało opracowane. Wysoka wydajność, bogata biblioteka klas oraz wsparcie dla programowania wielowątkowego sprawiają, że Java jest idealnym wyborem dla deweloperów aplikacji mobilnych. Przykładowo, do stworzenia prostego interfejsu użytkownika w aplikacji Android, programista może wykorzystać takie elementy jak TextView czy Button, które są częścią frameworka Android SDK. Współczesne praktyki wskazują również na wykorzystanie Java w połączeniu z Kotlinem, co pozwala na osiągnięcie lepszych rezultatów i zwiększa efektywność w pracy nad projektami mobilnymi.

Pytanie 8

Jaką rolę odgrywa destruktor w definicji klasy?

A. Usuwa instancje i zwalnia pamięć
B. Generuje nowe instancje klasy
C. Realizuje testy jednostkowe klasy
D. Ustawia wartości pól klasy
Destruktor to specjalna metoda klasy, która jest automatycznie wywoływana w momencie, gdy obiekt przestaje być używany. Jego zadaniem jest zwalnianie zasobów, takich jak pamięć dynamiczna, uchwyty do plików lub połączenia sieciowe. Destruktor ma tę samą nazwę co klasa, poprzedzoną symbolem `~` w C++ (`~Samochod()`). Destruktor zapobiega wyciekom pamięci i zapewnia, że wszystkie zasoby są poprawnie zwalniane po zakończeniu pracy obiektu. Jest to kluczowy element zarządzania cyklem życia obiektu w językach takich jak C++.

Pytanie 9

Jakie jest kluczowe działanie przy opracowywaniu zbiorów danych do rozwiązania problemu programistycznego?

A. Zmiana języka programowania na bardziej wydajny
B. Realizacja algorytmu sortującego
C. Wybór odpowiednich struktur danych
D. Weryfikacja zbiorów danych przed ich zastosowaniem
Wybór właściwych struktur danych to mega ważny krok, kiedy projektujesz swoje zestawy danych. To, jaką strukturę wybierzesz, ma ogromny wpływ na to, jak szybko i efektywnie będą działać algorytmy. Każda struktura ma swoje plusy i minusy – na przykład listy pozwalają na elastyczne zarządzanie elementami, stosy i kolejki trzymają dane w określonej kolejności, a drzewa czy grafy są już do bardziej skomplikowanych problemów. Dobrze dobrane struktury mogą znacznie przyspieszyć działanie programu i zmniejszyć zużycie zasobów. Moim zdaniem, jeśli chcesz projektować efektywne algorytmy, musisz naprawdę dobrze rozumieć, jak różne struktury działają i umieć je dopasować do problemu, który chcesz rozwiązać.

Pytanie 10

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

A. Code Implementation/Code Delivery - metodyka implementacji i dostarczania kodu
B. Ciągła integracja i ciągłe dostarczanie - praktyki automatyzujące proces wdrażania kodu
C. Component Isolation/Component Deployment - izolacja i wdrażanie komponentów aplikacji
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 11

Co będzie wynikiem działania poniższego kodu JavaScript?

const obj = { name: 'John', greet: function() { setTimeout(function() { console.log(`Hello, ${this.name}`); }, 1000); } }; obj.greet();
A. Hello, null
B. Hello, undefined
C. Hello, John
D. TypeError
Odpowiedzi `Hello, John`, `TypeError` oraz `Hello, null` są wynikiem niepełnego zrozumienia zasad działania kontekstu `this` w JavaScript oraz mechanizmów związanych z wywołaniami funkcji w różnych kontekstach. W przypadku pierwszej z tych odpowiedzi, można by sądzić, że `this` w funkcji anonimowej odwołuje się do obiektu `obj`, co jest błędne, ponieważ w momencie wywołania funkcji przez `setTimeout` kontekst `this` traci odniesienie do obiektu, a zamiast tego wskazuje na obiekt globalny. W efekcie `this.name` nie zwraca wartości `'John'`, lecz `undefined`. Druga odpowiedź, związana z `TypeError`, nie zrozumiała, że żadne błędy nie są generowane w tym kodzie, a funkcja anonimowa wykonuje się bezproblemowo, jednak z błędnym kontekstem. Ostatnia propozycja, `Hello, null`, również jest nietrafiona, ponieważ nie istnieje sytuacja, w której `this` w tym kontekście mogłoby się odwoływać do `null`. Należy również pamiętać, że JavaScript różni się od wielu innych języków programowania, gdzie `this` jest bardziej ściśle powiązane z obiektem, w którym metoda została wywołana. Zrozumienie kontekstu `this` jest kluczowe w pracy z JavaScript, szczególnie w pracy z funkcjami asynchronicznymi oraz w zastosowaniach programowania obiektowego.

Pytanie 12

Z jakiego obiektu można skorzystać, aby stworzyć kontrolkę wskazaną strzałką na ilustracji?

Ilustracja do pytania
A. TextBox - dla biblioteki WPF; JTextField - dla biblioteki Swing
B. Windows - dla biblioteki WPF; JFrame - dla biblioteki Swing
C. Text - dla biblioteki WPF; JText - dla biblioteki Swing
D. Box - dla biblioteki WPF; JField - dla biblioteki Swing
Wybrałeś dokładnie to, co w praktyce programisty jest najważniejsze, czyli TextBox dla WPF i JTextField dla Swinga. Te dwa komponenty to absolutna podstawa, jeśli chodzi o pola do wprowadzania tekstu, zarówno w aplikacjach .NET, jak i Java. W WPF TextBox pozwala na przyjmowanie danych od użytkownika, obsługę zdarzeń, walidację, formatowanie tekstu – ogólnie wszystko, co potrzeba do pracy z tekstem w GUI. W Swingu JTextField jest odpowiednikiem, bardzo intuicyjnym i prostym w użyciu, świetnie się sprawdza przy prostych formularzach czy interfejsach użytkownika. Co ciekawe, oba te komponenty są bardzo elastyczne, można je stylizować, podłączać do systemów walidacji czy nawet rozbudowywać o własne mechanizmy autouzupełniania. Spotkałem się wielokrotnie z sytuacją, gdzie poprawne zastosowanie TextBoxa lub JTextFielda znacząco podnosiło jakość aplikacji – bo jednak wygoda użytkownika i poprawność danych są kluczowe. Takie wybory są zgodne z dokumentacją Microsoftu oraz Oracla, więc trzymasz się dobrych praktyk. Z mojej perspektywy, jeśli chcesz pisać nowoczesne, użytkowe aplikacje desktopowe, znajomość tych kontrolek to absolutny must-have.

Pytanie 13

Który z faz cyklu życia projektu wiąże się z identyfikacją wymagań użytkownika?

A. Analiza
B. Wdrażanie
C. Przeprowadzanie testów
D. Etap planowania
Analiza to etap cyklu życia projektu, podczas którego określane są wymagania użytkownika. W tej fazie zespół projektowy przeprowadza badania, konsultacje i warsztaty, aby zrozumieć potrzeby klienta i użytkowników końcowych. Wynikiem analizy jest szczegółowa specyfikacja funkcjonalna i niefunkcjonalna, która stanowi podstawę do projektowania i implementacji. Prawidłowo przeprowadzona analiza minimalizuje ryzyko nieporozumień oraz zapewnia, że finalny produkt będzie odpowiadał na realne potrzeby użytkowników.

Pytanie 14

Który z wymienionych przykładów przedstawia typ rekordowy?

A. int w języku Python
B. float w języku C
C. struct w języku C++
D. bool w języku Java
Typ 'struct' w języku C++ jest przykładem typu rekordowego, który pozwala na grupowanie zmiennych różnego typu pod jedną nazwą. Struktury pozwalają na przechowywanie powiązanych danych, np. informacji o pracowniku (imię, nazwisko, wiek) w jednym obiekcie. Struktury są kluczowe w programowaniu proceduralnym i obiektowym, umożliwiając efektywne zarządzanie danymi złożonymi. Typy rekordowe pozwalają na budowanie bardziej złożonych i zorganizowanych aplikacji, co zwiększa ich czytelność i ułatwia zarządzanie kodem.

Pytanie 15

Który z algorytmów ma złożoność O(n²)?

A. Dijkstra
B. Bubble Sort
C. Merge Sort
D. Binary Search
Bubble Sort to algorytm o złożoności O(n²), co oznacza, że jego czas wykonania rośnie kwadratowo wraz ze wzrostem liczby elementów wejściowych. Algorytm porównuje sąsiadujące elementy i zamienia je miejscami, jeśli są w złej kolejności. Proces ten powtarza się wielokrotnie, aż do uzyskania pełnego posortowania tablicy. Ze względu na swoją prostotę, Bubble Sort jest często wykorzystywany do nauki podstaw algorytmiki, ale w praktyce rzadko stosuje się go do sortowania dużych zbiorów danych, ponieważ jest nieefektywny w porównaniu do bardziej zaawansowanych algorytmów, takich jak QuickSort czy Merge Sort.

Pytanie 16

Jaką rolę odgrywa interpreter w kontekście programowania?

A. Przekłada kod źródłowy na język maszynowy w trakcie działania programu
B. Łączy kod źródłowy z zewnętrznymi bibliotekami
C. Generuje plik wykonywalny dla systemu operacyjnego
D. Zoptymalizowuje wydajność aplikacji w środowisku produkcyjnym
Interpreter tłumaczy kod źródłowy na język maszynowy instrukcja po instrukcji, co oznacza, że każda linia kodu jest analizowana i wykonywana na bieżąco. Dzięki temu programy interpretowane, takie jak te w Pythonie, Ruby czy JavaScript, mogą być szybko testowane i uruchamiane bez konieczności wcześniejszej kompilacji. Interpretacja pozwala na elastyczność w procesie rozwoju, ponieważ zmiany w kodzie są widoczne natychmiast po zapisaniu pliku. To czyni interpreter idealnym narzędziem do prototypowania i budowania aplikacji w dynamicznych środowiskach.

Pytanie 17

W klasie o nazwie samochod przypisano atrybuty: marka, rocznik, parametry[]. Atrybuty te powinny zostać zdefiniowane jako

A. interfejsy
B. pola
C. metody
D. funkcje
Pola w klasie samochod to właśnie te elementy, które przechowują dane, takie jak marka, rocznik czy tablica parametry. To jest absolutna podstawa programowania obiektowego – najczęściej spotyka się to w językach takich jak Java, C# albo nawet w Pythonie, choć tam często nazywamy je po prostu atrybutami. Dla przykładu, jeśli tworzysz klasę Samochod w C#, to pole 'marka' będzie np. typu string, 'rocznik' – int, a 'parametry' możesz zadeklarować jako tablicę albo listę (List<T>) zależnie od potrzeb. Przechowywanie danych w polach pozwala na lepszą organizację, bo każda instancja klasy ma swoje własne wartości tych pól. Tak się właśnie tworzy modele danych, na których potem operuje cała aplikacja – czy to baza samochodów w warsztacie, czy system ubezpieczeń komunikacyjnych. Takie podejście jest zgodne z zasadami hermetyzacji i solidnych, nowoczesnych standardów pisania kodu. Dużo profesjonalnych frameworków i narzędzi (np. Entity Framework, Hibernate) korzysta z takiego podejścia, nawet jeśli potem te pola opakowujesz w właściwości (properties). Krótko mówiąc, pola to nieodłączny element każdej klasy, która coś reprezentuje, i moim zdaniem nie da się dobrze projektować kodu obiektowego bez zrozumienia tej konwencji.

Pytanie 18

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

A. Generuje nowy obiekt klasy bez przypisywania wartości
B. Tworzy nowy obiekt jako wierną kopię innego obiektu
C. Inicjuje obiekt klasy na podstawie klasy dziedziczącej
D. Generuje nowy obiekt i usuwa wcześniejszy
Tworzenie nowego obiektu bez przypisania wartości to zadanie domyślnego konstruktora, który inicjalizuje obiekt, ale nie kopiuje stanu innego obiektu. Tworzenie obiektu na podstawie klasy pochodnej to proces dziedziczenia, a nie kopiowania – w tym przypadku tworzona jest nowa instancja klasy dziedziczącej, ale nie kopiowany jest stan innego obiektu. Usunięcie obiektu i stworzenie nowego nie jest zadaniem konstruktora kopiującego – za usuwanie odpowiada destruktor, który działa automatycznie podczas niszczenia obiektów.

Pytanie 19

Co to jest Docker?

A. Platforma do tworzenia, wdrażania i uruchamiania aplikacji w kontenerach
B. Narzędzie do testowania wydajności aplikacji webowych
C. Framework do tworzenia aplikacji mobilnych
D. System zarządzania bazami danych NoSQL
Docker jest platformą do tworzenia, wdrażania i uruchamiania aplikacji w kontenerach, co oznacza, że umożliwia programistom izolowanie aplikacji oraz ich zależności w samodzielne jednostki, niezależne od środowiska, w którym są uruchamiane. Dzięki konteneryzacji, aplikacje działają zgodnie w różnych środowiskach, co znacząco upraszcza procesy związane z wdrażaniem i zarządzaniem. Przykładowo, z wykorzystaniem Dockera, programiści mogą stworzyć kontener z aplikacją webową, a następnie wdrożyć go na serwerze produkcyjnym, nie obawiając się, że aplikacja nie zadziała z powodu różnic w konfiguracjach systemu operacyjnego. Ponadto, Docker wspiera DevOps, co jest zgodne z obecnymi trendami w inżynierii oprogramowania, promując podejście Continuous Integration/Continuous Deployment (CI/CD). Używanie Dockera zwiększa efektywność pracy zespołów deweloperskich oraz ułatwia zarządzanie infrastrukturą, co jest istotne w kontekście dużych projektów. Dodatkowo, wspiera on standardy branżowe, takie jak microservices, które ze względu na swoje zalety są szeroko stosowane w nowoczesnych architekturach aplikacyjnych.

Pytanie 20

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

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

Pytanie 21

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

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

Pytanie 22

Jakie składniki powinien mieć plan projektu?

A. Etapy projektu, ramy czasowe, zasoby i zadania
B. Terminy i zasoby ludzkie
C. Tylko czas wykonania i budżet
D. Wyłącznie etapy projektu
Harmonogram projektu powinien zawierać etapy projektu, ramy czasowe, zasoby oraz zadania. Taka kompleksowa struktura umożliwia skuteczne zarządzanie projektem i pozwala na śledzenie postępów. Każdy etap harmonogramu powinien być dokładnie opisany, a zadania powinny być przypisane do odpowiednich członków zespołu. Uwzględnienie zasobów i ram czasowych pozwala na precyzyjne planowanie i minimalizuje ryzyko opóźnień. Harmonogram stanowi nieodłączny element projektów zarządzanych zarówno w modelu Waterfall, jak i Agile, dostarczając przejrzystość na każdym etapie realizacji.

Pytanie 23

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 bąbelkowe
D. Sortowanie szybkie (QuickSort)
QuickSort to algorytm sortowania, który jest najbardziej efektywny dla dużych zbiorów danych, osiągając średnią złożoność obliczeniową O(n log n). Wykorzystuje strategię 'dziel i zwyciężaj', co pozwala na szybkie podzielenie tablicy na mniejsze części wokół elementu zwanego pivotem. Dzięki temu QuickSort jest wyjątkowo szybki, nawet w przypadku dużych i losowo rozłożonych zbiorów danych. Jego zaletą jest niskie zużycie pamięci oraz możliwość sortowania w miejscu (in-place), co oznacza, że nie wymaga dodatkowej przestrzeni poza rekurencyjnym stosowaniem wywołań. Algorytm ten jest szeroko stosowany w aplikacjach bazodanowych, systemach operacyjnych i analizie danych.

Pytanie 24

Celem mechanizmu obietnic (ang. promises) w języku JavaScript jest

A. ulepszenie czytelności kodu synchronicznego
B. zarządzanie funkcjonalnością związaną z kodem asynchronicznym
C. zarządzanie przechwytywaniem błędów aplikacji
D. zastąpienie mechanizmu dziedziczenia w programowaniu obiektowym
Mechanizm obietnic (promises) w JavaScript to, moim zdaniem, jedno z najważniejszych udogodnień, które pojawiły się w języku, żeby ogarnąć cały ten chaos wokół asynchroniczności. Typowa sytuacja kiedyś wyglądała tak, że w kodzie robiło się „callback hell” – zagnieżdżone funkcje wywołujące się nawzajem, co mocno utrudniało życie. Promise pozwala na o wiele czytelniejsze i wygodniejsze zarządzanie operacjami, które kończą się „kiedyś”, np. pobieraniem danych z API, zapisem do pliku, czy czekaniem na odpowiedź użytkownika. Z mojego doświadczenia wynika, że dzięki promises jest dużo łatwiej obsłużyć zarówno sukces, jak i błędy – możesz skorzystać z then(), catch(), a nawet łańcuchować kilka asynchronicznych zadań bez gubienia się w kodzie. Szczególnie przydatne jest to w pracy z fetch(), gdzie bez promises cała obsługa sieci wyglądałaby strasznie topornie. Dodatkowo promises są w pełni zgodne ze standardem ECMAScript 2015 (ES6) i stanowią podstawę dla nowocześniejszych rozwiązań, takich jak async/await. Praktycznie każdy zawodowy frontendowiec czy backendowiec pracujący z Node.js powinien je znać, bo to już nie fanaberia, a codzienność. Dobra praktyka to właśnie korzystanie z promises tam, gdzie tylko mamy do czynienia z nieblokującymi operacjami. Takie podejście nie tylko poprawia czytelność kodu, ale znacząco ułatwia jego utrzymanie i debugowanie.

Pytanie 25

Jaką cechę powinien posiadać dobry negocjator?

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

Pytanie 26

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

A. obsługa wciśniętego przycisku
B. obsługa przycisku ekranu dotykowego
C. kod Java
D. kod XML
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 27

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

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

Pytanie 28

Co to jest XSS (Cross-Site Scripting)?

A. Luka bezpieczeństwa pozwalająca na wstrzyknięcie złośliwego kodu do stron przeglądanych przez innych użytkowników
B. Technika optymalizacji kodu JavaScript do zwiększenia wydajności strony
C. Protokół komunikacyjny używany w aplikacjach internetowych
D. Framework do tworzenia responsywnych stron internetowych
Cross-Site Scripting (XSS) to luka bezpieczeństwa, która umożliwia atakującym wstrzykiwanie złośliwego kodu JavaScript do stron internetowych, które są następnie przeglądane przez innych użytkowników. W wyniku tego ataku, złośliwy kod może być wykonany w kontekście przeglądarki ofiary, co może prowadzić do kradzieży sesji, danych osobowych, czy też przejęcia kontroli nad kontem użytkownika. Aby zapobiegać XSS, programiści powinni stosować techniki takie jak walidacja i oczyszczanie danych wejściowych, a także korzystanie z nagłówków HTTP, takich jak Content Security Policy (CSP). Przykładem może być sytuacja, gdy aplikacja webowa przyjmuje dane w formularzach bez odpowiedniego sprawdzenia, co pozwala na umieszczenie skryptu, który zyskuje dostęp do cookies użytkownika. Zrozumienie i zabezpieczenie się przed XSS jest kluczowe w kontekście budowania bezpiecznych aplikacji webowych, co jest zgodne z najlepszymi praktykami branżowymi.

Pytanie 29

Technika konstruowania algorytmu polegająca na rozbiciu na dwa lub więcej mniejszych podproblemów, aż do momentu, gdy ich części będą wystarczająco proste do bezpośredniego rozwiązania, nosi nazwę:

A. dziel i zwyciężaj
B. heurystycznej
C. najkrótszej trasy
D. komiwojażera
Technika „dziel i zwyciężaj” (ang. divide and conquer) to jedno z tych podejść, które moim zdaniem warto naprawdę dobrze rozumieć, bo spotyka się je praktycznie wszędzie w informatyce. Chodzi tutaj o rozbijanie dużego problemu na mniejsze, bardziej strawne kawałki, które rozwiązujemy niezależnie, a potem składamy wyniki w całość. To bardzo eleganckie, bo pozwala np. mocno uprościć złożone zadania, a przy okazji często optymalizuje czas działania algorytmu. Przykładem mogą być sortowanie szybkie (quicksort) czy sortowanie przez scalanie (merge sort). W praktyce branżowej, kiedy pracuje się nad dużymi systemami albo algorytmami operującymi na wielkich zbiorach danych, taki sposób myślenia bardzo się przydaje, bo pozwala łatwo podzielić pracę nawet między kilku programistów. Standardy branżowe, zwłaszcza w kontekście rozwiązań algorytmicznych czy projektowania systemów, promują właśnie takie modularne podejście. Sam kiedyś przekonałem się, że dużo łatwiej jest testować i utrzymywać kod, kiedy trzyma się tej zasady. Fajnie wiedzieć, że często to właśnie „dziel i zwyciężaj” leży u podstaw wielu struktur danych, algorytmów wyszukiwania czy nawet analizy obrazu, nie tylko w typowym programowaniu. Warto pamiętać, że to nie tylko teoria – w codziennej pracy taki styl rozwiązywania problemów pozwala szybciej wychwytywać i naprawiać błędy, a to przecież kluczowe w projektach IT.

Pytanie 30

Jakie z wymienionych narzędzi służy do emulacji mobilnych urządzeń podczas developowania aplikacji?

A. Genymotion
B. Numpy
C. Postman
D. TensorFlow
Genymotion to jedno z najbardziej zaawansowanych narzędzi do emulacji urządzeń mobilnych podczas tworzenia aplikacji na system Android. Umożliwia symulowanie działania aplikacji na różnych urządzeniach i wersjach systemu Android, co pozwala programistom na testowanie kompatybilności i wydajności aplikacji w różnych warunkach. Genymotion oferuje szybkie emulowanie, obsługę GPS, kamery oraz czujników, co czyni go niezwykle przydatnym narzędziem w procesie rozwoju aplikacji mobilnych. Dzięki wsparciu dla integracji z Android Studio, Genymotion jest popularnym wyborem wśród deweloperów tworzących aplikacje na platformę Android.

Pytanie 31

Która z poniższych technologii służy do tworzenia interaktywnych aplikacji webowych bez przeładowania strony?

A. CSS3
B. SQL
C. AJAX
D. HTML5
HTML5, choć jest potężnym językiem znacznie rozszerzającym możliwości aplikacji webowych, nie jest technologią służącą do asynchronicznego przesyłania danych. HTML5 dostarcza strukturę dla stron internetowych i wprowadza nowe elementy, takie jak <canvas> czy <video>, ale nie ma wbudowanych mechanizmów do zarządzania komunikacją z serwerem bez przeładowania strony. SQL, będący językiem zapytań do baz danych, służy do manipulacji danymi, a nie do tworzenia interaktywnych aplikacji. Umożliwia on wykonywanie operacji takich jak dodawanie, usuwanie czy aktualizowanie danych w bazie danych, ale nie odnosi się do bezpośredniej interakcji z użytkownikami przez przeglądarkę. CSS3, z kolei, to technologia odpowiedzialna za stylizację stron internetowych, co oznacza, że kontroluje wygląd elementów, ale nie wpływa na sposób komunikacji z serwerem. Niektórzy mogą błędnie myśleć, że te technologie mają podobne zastosowania, jednak każda z nich ma swoje specyficzne funkcje i zastosowanie w ekosystemie webowym. Aby zbudować naprawdę interaktywną aplikację, kluczowe jest zrozumienie, że AJAX jest niezbędnym narzędziem do asynchronicznej komunikacji, co pozwala na bardziej płynne i responsywne doświadczenia dla użytkowników.

Pytanie 32

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

A. Pseudokod
B. Schemat blokowy
C. Lista kroków
D. Drzewo decyzyjne
Niestety, ta odpowiedź nie jest poprawna. Przeanalizujmy, dlaczego żadna z pozostałych opcji nie jest najlepszym wyborem. Schemat blokowy to popularne narzędzie wizualizacji, które może zawierać elementy decyzyjne w postaci rombów symbolizujących warunki. Jednak jego głównym przeznaczeniem jest przedstawianie sekwencji działań i ogólnego przepływu procesu, nie samej struktury decyzji. Schemat blokowy odpowiada na pytanie „jak przebiega proces?", podczas gdy w kontekście procesu decyzyjnego potrzebujemy odpowiedzi na pytanie „jakie mam opcje i dokąd prowadzą?". Pseudokod jest odpowiedzią błędną z fundamentalnego powodu - nie jest metodą wizualną. To tekstowa forma zapisu algorytmu wykorzystująca uproszczoną składnię przypominającą język programowania. Owszem, może opisywać logikę decyzyjną za pomocą instrukcji warunkowych, ale robi to wyłącznie w formie tekstu, bez graficznej reprezentacji. Lista kroków również nie spełnia wymagań pytania. Po pierwsze, jest formą tekstową, nie wizualną. Po drugie, ma strukturę liniową i sekwencyjną, która nie oddaje rozgałęzionej natury procesu decyzyjnego, gdzie różne wybory prowadzą do różnych ścieżek. Poprawną odpowiedzią jest drzewo decyzyjne, zaprojektowane specjalnie do wizualizacji procesów decyzyjnych. Jego hierarchiczna struktura naturalnie oddaje sposób podejmowania wyborów - węzły reprezentują punkty decyzyjne, gałęzie symbolizują dostępne opcje, a liście pokazują końcowe rezultaty. Dzięki temu jednym spojrzeniem można ogarnąć wszystkie możliwe scenariusze i ich konsekwencje.

Pytanie 33

Które zdarzenie w JavaScript jest wywoływane po całkowitym załadowaniu strony?

A. page.complete
B. document.ready
C. window.onload
D. window.render
Wszystkie inne odpowiedzi, takie jak "document.ready", "page.complete" oraz "window.render", są niepoprawne w kontekście pytania o zdarzenie wywoływane po całkowitym załadowaniu strony. Odpowiedź "document.ready" odnosi się do jQuery, a nie do czystego JavaScript. To zdarzenie wywoływane jest, gdy DOM jest załadowany, ale niekoniecznie wszystkie zasoby, takie jak obrazy czy arkusze stylów, są już dostępne. Używanie tego zdarzenia może prowadzić do nieporozumień, gdyż programiści mogą zakładać, że strona jest gotowa do pełnej interakcji, gdy w rzeczywistości zachowanie różnych elementów może się różnić w zależności od ładowania zasobów. Z kolei "page.complete" nie jest standardowym zdarzeniem w JavaScript i nie istnieje w dokumentacji, co czyni tę odpowiedź całkowicie błędną. "window.render" również nie jest znanym zdarzeniem w kontekście JavaScript, co może prowadzić do nieporozumień wśród programistów. Używanie niepoprawnych terminów lub zrozumienie ich znaczenia może prowadzić do błędów w kodzie, które z kolei skutkują nieprawidłowym działaniem aplikacji. Dlatego tak ważne jest, aby znać dokładne zdarzenia i ich zastosowanie w kontekście pełnego ładowania strony, co ma kluczowe znaczenie w tworzeniu responsywnych i dobrze działających aplikacji internetowych.

Pytanie 34

Co to jest SQL injection?

A. Metoda optymalizacji zapytań SQL w bazach danych
B. Proces automatyzacji tworzenia zapytań SQL
C. Narzędzie do importowania danych do bazy SQL
D. Technika ataku polegająca na wstrzyknięciu złośliwego kodu SQL do zapytania
SQL injection to technika ataku, polegająca na wstrzyknięciu złośliwego kodu SQL do zapytań, które są przetwarzane przez aplikacje bazodanowe. Atakujący wykorzystuje luki w zabezpieczeniach aplikacji, aby wprowadzić własne instrukcje SQL, które są następnie wykonywane przez bazę danych. Na przykład, jeśli aplikacja nie waliduje poprawnie danych wprowadzanych przez użytkownika, napastnik może wprowadzić złośliwy kod w miejsce oczekiwanego wejścia. Taki atak może prowadzić do ujawnienia poufnych danych, a nawet pełnej kontroli nad bazą danych. Ważne jest, aby stosować tzw. 'prepared statements' oraz 'parameterized queries', co znacząco obniża ryzyko tego typu ataków. Zgodnie z najlepszymi praktykami bezpieczeństwa, aplikacje powinny być regularnie testowane pod kątem podatności na SQL injection, a także powinny stosować odpowiednie mechanizmy autoryzacji i walidacji, aby minimalizować ryzyko wykorzystania takich technik.

Pytanie 35

Jakie oprogramowanie służy do monitorowania błędów oraz zarządzania projektami?

A. Jasmine
B. Jira
C. Bugzilla
D. Git
Bugzilla to narzędzie do śledzenia błędów, które skupia się głównie na identyfikacji oraz zarządzaniu defektami w oprogramowaniu. Choć może być używane w kontekście zarządzania projektami, jego funkcjonalności są ograniczone w porównaniu do kompleksowych rozwiązań, takich jak Jira. Bugzilla jest bardziej odpowiednie dla zespołów, które potrzebują prostszych narzędzi do śledzenia błędów, ale nie zapewnia takich możliwości zarządzania projektami jak Jira. Git to system kontroli wersji, który umożliwia zarządzanie kodem źródłowym, ale nie jest narzędziem do śledzenia błędów ani do zarządzania projektami jako takimi. Git pozwala programistom na współpracę i śledzenie zmian w kodzie, jednakże brakuje mu funkcji zarządzania projektami oraz integracji z procesami Agile, które są kluczowe w nowoczesnym rozwoju oprogramowania. Jasmine to framework do testowania jednostkowego aplikacji JavaScript, który koncentruje się na pisaniu testów i nie jest narzędziem do zarządzania projektami ani do śledzenia błędów. Pomimo że testowanie jednostkowe jest istotną częścią cyklu życia oprogramowania, Jasmine nie oferuje funkcjonalności związanych z zarządzaniem projektami, co czyni go nieodpowiednim w kontekście tego pytania.

Pytanie 36

Który z komponentów interfejsu użytkownika umożliwia użytkownikowi wprowadzanie danych tekstowych?

A. Pole tekstowe
B. Przycisk
C. Dialog wyboru pliku
D. Pasek narzędziowy
Pole tekstowe to element interfejsu użytkownika, który pozwala użytkownikowi na wprowadzanie danych tekstowych. Jest to jeden z najczęściej używanych komponentów UI w aplikacjach desktopowych, mobilnych i webowych. Pole tekstowe umożliwia wprowadzanie haseł, adresów e-mail, wiadomości i innych danych. W nowoczesnych aplikacjach często zawiera walidację, która sprawdza poprawność wpisywanych danych w czasie rzeczywistym. Dzięki swojej elastyczności, pola tekstowe mogą być wykorzystywane w różnorodnych formularzach, ankietach i systemach rejestracji użytkowników, co czyni je nieodzownym elementem aplikacji o dowolnym przeznaczeniu.

Pytanie 37

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

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

Pytanie 38

Jaka będzie wartość zmiennej x po wykonaniu poniższego kodu?

let x = 0;
for (let i = 0; i < 10; i++) {
  if (i % 2 === 0) continue;
  x += i;
}
A. 30
B. 20
C. 45
D. 25
Wartości 45, 30 i 20 uznawane za odpowiedzi na pytanie są wynikiem błędnych założeń dotyczących działania pętli oraz sposobu sumowania wartości. Niektórzy mogą pomyśleć, że wszystkie liczby od 0 do 9 powinny być sumowane, co prowadzi do błędnego wyniku. Zrozumienie tego, jak działa instrukcja continue, jest kluczowe. Instrukcja ta sprawia, że aktualna iteracja pętli jest przerywana w momencie, gdy i jest parzyste, co skutkuje pominięciem tych wartości w sumie. To istotny aspekt, ponieważ nie ma możliwości dodania parzystych liczb do zmiennej x. Kolejną pomyłką jest błędne obliczanie sumy nieparzystych liczb. Zamiast prawidłowego wyniku 25, niektórzy mogą zyskać liczbę 45, co sugeruje, że do sumy dodano również parzyste liczby, co jest niezgodne z logiką pętli. Podobnie, suma 30 pojawia się, gdy ktoś myśli, że bierze tylko niektóre liczby, ale źle oblicza ich sumę. Ostatecznie 20 również nie znajduje uzasadnienia, ponieważ w najlepszym przypadku można uzyskać sumę tylko niektórych nieparzystych liczb, co w rzeczywistości nie jest zgodne z kodem przedstawionym w pytaniu. Warto nauczyć się analizować kod na poziomie instrukcji i zrozumieć, jakie elementy są sumowane, a jakie są pomijane. Umożliwi to unikanie takich potknięć w przyszłości.

Pytanie 39

Liczba A4 w zapisie heksadecymalnym ma odpowiadający jej zapis binarny

A. 10100010
B. 10100100
C. 1010100
D. 1011100
Zapisanie liczby A4 z systemu szesnastkowego (heksadecymalnego) do systemu binarnego to podstawowa umiejętność przy pracy z systemami cyfrowymi. W praktyce każda cyfra heksadecymalna odpowiada dokładnie czterem cyfrom binarnym, co wynika bezpośrednio z faktu, że 16=2^4. Gdy rozbijamy A4 na dwie części, mamy literę A (co oznacza 10 w dziesiętnym) oraz cyfrę 4. Zamieniamy więc A na binarny: 1010, a 4 – 0100. Sklejamy razem i dostajemy 10100100 – to jest właśnie prawidłowa odpowiedź. W rzeczywistych projektach, np. podczas programowania mikrokontrolerów, przy analizie adresów pamięci czy pracy z danymi w protokołach sieciowych, umiejętność szybkiej zamiany szesnastkowych wartości na binarne (i odwrotnie) jest totalnie niezbędna. Moim zdaniem zapamiętanie tych konwersji bardzo przyspiesza debugowanie kodu czy analizę rejestrów sprzętowych. To też podstawa przy pracy z narzędziami typu oscyloskop cyfrowy lub analizator stanów logicznych, gdzie często wartości wyświetlane są w jednym systemie, a dokumentacja posługuje się innym. Branża IT i elektronika wręcz żyją tymi zamianami – nie ma co się oszukiwać, im szybciej to opanujesz, tym mniej błędów popełnisz przy konfiguracji sprzętu czy pisaniu sterowników.

Pytanie 40

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)
C. O(n³)
D. O(n log n)
Złożoność obliczeniowa algorytmu to kluczowy aspekt, który decyduje o jego efektywności, a odpowiedzi takie jak O(n²), O(n log n) czy O(n) wynikają z powszechnych nieporozumień. Odpowiedź O(n²) może pojawić się, gdy ktoś myśli jedynie o największej pętli, nie uwzględniając pełnej hierarchii zagnieżdżonych pętli. Jednakże, w tym przypadku mamy do czynienia z trzema niezależnymi pętlami, a każda z nich przechodzi przez n iteracji, co prowadzi do O(n³). Z kolei O(n log n) jest typowe dla algorytmów sortujących, takich jak sortowanie szybkie czy sortowanie przez scalanie, lecz nie ma zastosowania w kontekście zagnieżdżonych pętli, które wykonują prostą operację przypisania. Odpowiedź O(n) wskazuje na liniową złożoność, co jest błędne w przypadku dwóch lub więcej wymiarów. Takie myślenie często prowadzi do błędnych ocen złożoności algorytmu, zwłaszcza, gdy nie uwzględnia się wszystkich aspektów zagnieżdżenia pętli. Ważne jest, aby przy analizowaniu złożoności obliczeniowej, zawsze uwzględniać wszystkie zagnieżdżone elementy, by uzyskać dokładny obraz wydajności algorytmu.