Wyniki egzaminu

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

Egzamin zdany!

Wynik: 35/40 punktów (87,5%)

Wymagane minimum: 20 punktów (50%)

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

Kod przedstawiony w języku XML/XAML określa:

<Switch
    android:id = "@+id/switch1"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:background = "#00ffff"
    android:text = "Switch"
    tools:layout_editor_absoluteX = "176dp"
    tools:layout_editor_absoluteY = "389dp" />
A. suwak
B. listę rozwijaną
C. stepper
D. przełącznik
Kod przedstawiony w pytaniu to klasyczny przykład wykorzystania komponentu Switch w Androidzie. Switch, jak sama nazwa wskazuje, służy do przełączania między dwoma stanami — najczęściej włącz/wyłącz, aktywne/nieaktywne. Z punktu widzenia interfejsów mobilnych, przełącznik bardzo często znajduje zastosowanie w ustawieniach aplikacji, np. do szybkiego włączania trybu ciemnego, aktywacji powiadomień czy zezwalania na lokalizację. Ten konkretny xml zawiera podstawowe atrybuty, jak android:id, layout_width, layout_height oraz background, czyli kolor tła, co od razu sugeruje, że nie jest to np. dropdown czy suwak. Co ciekawe, Switch różni się od CheckBoxa tym, że wizualnie lepiej komunikuje zmianę trybu (przesuwający się znacznik), co moim zdaniem zwiększa użyteczność, szczególnie jeśli użytkownik ma szybko zrozumieć, co ustawia. Standardy Material Design wręcz zalecają stosowanie Switch do kontrolowania pojedynczych ustawień, bo jest to bardziej czytelne niż inne widgety. Warto pamiętać, że Switch ma różne warianty i można go rozbudować o obsługę zdarzeń onCheckedChangeListener w kodzie Java albo Kotlin, przez co staje się bardzo elastyczny. Odpowiedź przełącznik jest więc zgodna ze wszystkimi cechami tej kontrolki i jej zastosowaniami w praktyce.

Pytanie 2

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 3

Przedstawione w filmie działania wykorzystują narzędzie

A. generatora kodu java
B. kompilatora dla interfejsu graficznego
C. debuggera analizującego wykonujący kod
D. generatora GUI przekształcającego kod do języka XAML
Wybrana odpowiedź jest trafna, bo faktycznie narzędzie pokazane w filmie to generator GUI, który potrafi przekształcać kod do języka XAML. XAML (czyli Extensible Application Markup Language) jest powszechnie używany do deklaratywnego opisywania interfejsów użytkownika, na przykład w aplikacjach WPF czy UWP na platformie .NET. Jak dla mnie, korzystanie z takich generatorów to ogromna wygoda, bo pozwala błyskawicznie przenosić projekt graficzny do formatu czytelnego dla platformy Microsoftu. Z mojego doświadczenia, wiele zespołów programistycznych stosuje takie rozwiązania, żeby oszczędzić czas na ręcznym pisaniu XAML-a (co potrafi być naprawdę żmudne przy dużych projektach). Co ciekawe, takie narzędzia bardzo dobrze współpracują z designerskimi edytorami UI i potrafią zautomatyzować konwersję nawet z innych formatów graficznych, np. Sketch czy Adobe XD do XAML-a. Branżowe standardy zalecają, by wykorzystywać generatorów GUI właśnie do tego celu, bo minimalizuje to liczbę błędów, przyspiesza wdrożenie zmian i ułatwia współpracę między programistami a projektantami. Warto pamiętać, że XAML jest bardzo elastyczny i umożliwia potem ręczną edycję wygenerowanego kodu – czasem powstają drobne poprawki, ale ogólnie to naprawdę przydatne narzędzie. Ogólnie – jeśli tylko projektujesz UI pod .NET, to automatyczna konwersja do XAML-a to jest coś, co warto znać i wykorzystywać w praktyce.

Pytanie 4

Jakie są korzyści z wykorzystania struktur danych typu mapa (np. HashMap w Javie) w kontekście tworzenia zbiorów danych?

A. Ponieważ struktury danych typu mapa zajmują mniej pamięci niż tablice
B. Gdyż nie potrzebują znajomości wielkości danych przed kompilacją
C. Z powodu szybkiego uzyskiwania dostępu do elementów przy użyciu klucza
D. Bo pozwalają na sortowanie danych bez dodatkowych działań
Mapa, na przykład HashMap w Javie, to taka fajna struktura, która trzyma pary klucz-wartość. Dzięki temu szybko możemy znaleźć dane, korzystając z unikalnego klucza. HashMap jest super, bo pozwala nam na błyskawiczne dodawanie, usuwanie i wyszukiwanie elementów w czasie O(1). To naprawdę przydaje się, gdy pracujemy z dużymi zbiorami danych. Używamy jej często w aplikacjach wymagających szybkiego dostępu do informacji, jak różne bazy danych czy strony internetowe. No i jeszcze jej elastyczność – można ją łatwo dostosować do zmieniających się zestawów danych, co jest dużym plusem.

Pytanie 5

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

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

Pytanie 6

Wartości składowych RGB koloru #AA41FF zapisane w systemie szesnastkowym po przekształceniu na system dziesiętny są odpowiednio

A. 160, 64, 255
B. 170, 65, 255
C. 170, 64, 255
D. 160, 65, 255
Kolor zapisany w postaci szesnastkowej #AA41FF to jeden z najpopularniejszych formatów wykorzystywanych np. w CSS i projektowaniu graficznym. Składa się z trzech dwucyfrowych wartości: AA dla czerwonego (R), 41 dla zielonego (G) i FF dla niebieskiego (B). Zamiana tych wartości na system dziesiętny jest kluczowa, żeby lepiej zrozumieć jak działa model RGB – czyli mieszanie trzech podstawowych barw światła w różnych proporcjach. AA w szesnastkowym to 170 w dziesiętnym (bo A=10, więc 10*16+10=170), 41 to 4*16+1=65, a FF to 15*16+15=255. Taka konwersja przydaje się w codziennej pracy z grafiką czy front-endem – na przykład podczas ręcznego tworzenia palet kolorów lub dostosowywania barw ikon w interfejsach użytkownika. Co ciekawe, w wielu narzędziach do projektowania można dowolnie przełączać się między tymi zapisami, żeby precyzyjnie ustawić wybrane odcienie. Moim zdaniem, zrozumienie tej konwersji pomaga lepiej ogarnąć, jak komputery interpretują kolory i jak potem wyświetlają je na ekranie. Praktyka pokazuje, że większość błędów przy pracy z kolorami wynika właśnie z nieprawidłowego przeliczania wartości. No i taka wiedza to prawdziwy fundament dla każdego, kto myśli poważnie o pracy z grafiką czy programowaniem front-endu – nie da się jej pominąć w żadnym sensownym kursie.

Pytanie 7

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

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

Pytanie 8

Jaką cechą odznacza się framework w porównaniu do biblioteki?

A. Framework określa strukturę aplikacji i zapewnia jej fundament
B. Framework oferuje funkcje użyteczne w konkretnej dziedzinie problemu
C. Framework zapewnia API do szerszego zestawu funkcji
D. Framework stanowi zbiór funkcji, które programista ma możliwość wykorzystania
Biblioteka to zestaw funkcji i klas, które programista może wykorzystywać według własnego uznania, ale to on decyduje o strukturze aplikacji. API dostarcza zestaw metod do komunikacji z innymi aplikacjami, ale nie narzuca architektury. Framework to coś więcej niż zbiór funkcji – określa cały proces tworzenia aplikacji, czego nie można powiedzieć o zwykłej bibliotece lub narzędziach użytkowych.

Pytanie 9

Wskaż typy numeryczne o stałej precyzji

A. long long, long double
B. bool char, string
C. float, double
D. int, short, long
Typy numeryczne o stałej precyzji (czyli tzw. typy całkowite) to na przykład int, short, long – dokładnie te, które wskazałeś. Działają one trochę jak liczniki – przechowują liczby całkowite w określonym zakresie, bez przecinka. Moim zdaniem to podstawa, jeśli chodzi o reprezentowanie wartości typu liczba sztuk, indeks, identyfikator – wszędzie tam, gdzie nie potrzebujemy części ułamkowej. Ich precyzja wynika z tego, że są zdefiniowane w standardzie (np. w C++ czy Javie) jako liczby całkowite reprezentowane przez określoną liczbę bitów. Dla przykładu, 32-bitowy int zawsze pomieści wartości od -2 147 483 648 do 2 147 483 647 i każdy bit jest tu ważny. W praktyce, programując mikrokontrolery albo systemy wbudowane, właściwy wybór typu o stałej precyzji potrafi decydować o stabilności i wydajności całego programu. Warto też wiedzieć, że typy te – int, short, long – nie mają błędu zaokrągleń, co często zdarza się przy operacjach na liczbach zmiennoprzecinkowych. No i jeszcze takie małe spostrzeżenie: dobrym zwyczajem jest wybieranie najmniejszego typu całkowitego, który pokryje wymagany zakres, żeby zoptymalizować zużycie pamięci. Takie podejście mocno się przydaje, zwłaszcza jak się pracuje nad większym projektem, gdzie każda optymalizacja jest na wagę złota.

Pytanie 10

Jaka jest podstawowa funkcja narzędzia do zarządzania projektami?

A. Produkcja animacji komputerowych
B. Zarządzanie zadaniami i czasem w projekcie
C. Opracowanie bazy danych dla projektu
D. Poprawa wydajności kodu programu
Zarządzanie zadaniami i czasem to naprawdę kluczowa sprawa w projektach. Dzięki narzędziom takim jak Microsoft Project, Jira, Trello, czy Monday, zespoły mogą lepiej planować, przydzielać role i śledzić, co się dzieje. Możliwości tych narzędzi pozwalają ustalać deadline’y, priorytety, a nawet automatycznie przypominają o zbliżających się terminach. To super pomaga w unikaniu opóźnień i pozwala lepiej zorganizować pracę. Wizualizacja projektu w formie osi czasu czy tablicy kanban też jest mega przydatna, bo wszystko staje się bardziej czytelne.

Pytanie 11

Które z poniższych nie jest frameworkiem do testowania w JavaScript?

A. Express
B. Jasmine
C. Mocha
D. Jest
Wybór frameworków do testowania w JavaScript, takich jak Mocha, Jest czy Jasmine, może wprowadzać w błąd, jeśli nie rozumie się ich celów i funkcji. Mocha jest elastycznym frameworkiem do testowania, który działa w środowisku Node.js oraz w przeglądarkach, umożliwiając pisanie asynchronicznych testów oraz definiowanie zestawów testowych. Jest z kolei nowoczesnym narzędziem do testowania, które oferuje bogaty zestaw funkcji, w tym wsparcie dla asercji i mockowania, co czyni go bardzo popularnym wśród programistów. Jasmine to framework, który skupia się na zachowaniu aplikacji, pozwalając na pisanie testów w stylu BDD (Behavior-Driven Development). Wybór tych narzędzi do testowania jest zatem uzasadniony i kluczowy dla zapewnienia jakości oprogramowania, jednak odpowiedź wybierająca Express jako framework testowy jest nieprawidłowa, ponieważ Express ma zupełnie inny cel – obsługę serwera i routing w aplikacjach webowych. Często mylone są cele poszczególnych narzędzi, co prowadzi do niepoprawnych wniosków. Zrozumienie, że Express nie jest przeznaczony do testowania, a raczej do budowania aplikacji, jest kluczowe dla efektywnego programowania i testowania. Aspekty te uwypuklają znaczenie znajomości narzędzi oraz ich przeznaczenia w kontekście rozwoju oprogramowania.

Pytanie 12

Które urządzenie komputerowe jest najbardziej odpowiednie do graficznego projektowania w aplikacjach CAD?

A. Komputer stacjonarny z kartą graficzną NVIDIA Quadro
B. Laptop z zintegrowanym układem graficznym
C. Laptop z interfejsem dotykowym
D. Serwer dysponujący dużą ilością pamięci RAM
W kontekście projektowania graficznego w programach typu CAD, kluczowym elementem jest wybór odpowiedniego sprzętu, który zapewni nie tylko stabilność, ale także wydajność. Komputer stacjonarny wyposażony w kartę graficzną NVIDIA Quadro jest najlepszym rozwiązaniem, ponieważ te karty są specjalnie zaprojektowane do obsługi złożonych obliczeń i renderowania grafiki 3D. Dzięki zaawansowanej architekturze oraz optymalizacji pod kątem aplikacji inżynieryjnych i projektowych, karty NVIDIA Quadro oferują znacznie wyższą wydajność w porównaniu do standardowych kart graficznych. Dodatkowo, stacjonarne komputery pozwalają na łatwiejszą rozbudowę, co może być kluczowe w przypadku rosnących wymagań projektowych. W praktyce, użytkownicy CAD często muszą radzić sobie z dużymi i złożonymi modelami, które wymagają nie tylko odpowiedniej mocy obliczeniowej, ale także dużej ilości pamięci wideo, co zapewnia NVIDIA Quadro. Warto dodać, że standardy branżowe, takie jak OpenGL i DirectX, są w pełni wspierane przez te karty, co przekłada się na ich niezawodność i efektywność w profesjonalnym środowisku projektowym.

Pytanie 13

Jakie składniki są kluczowe w dynamicznym formularzu logowania?

A. Nagłówek HTTP
B. Plik graficzny
C. Pola tekstowe do wprowadzania danych użytkownika
D. Tabela w bazie danych
Pola tekstowe do wprowadzania danych użytkownika są kluczowym elementem dynamicznego formularza logowania. Umożliwiają one użytkownikowi wprowadzenie informacji, takich jak nazwa użytkownika i hasło, co jest niezbędne do uwierzytelnienia w systemie. Formularze HTML wykorzystują tagi <input> do tworzenia pól tekstowych, a ich interakcja z użytkownikiem może być wspierana przez JavaScript lub inne technologie frontendowe, które walidują dane i zapewniają bezpieczeństwo procesu logowania. Pola tekstowe mogą być wzbogacone o atrybuty, takie jak 'required', 'pattern' czy 'type', które dodatkowo zabezpieczają formularz i ułatwiają użytkownikowi poprawne wypełnienie danych.

Pytanie 14

Co to jest JWT (JSON Web Token)?

A. Format kompresji danych JavaScript i HTML w aplikacjach webowych
B. Otwarty standard do bezpiecznego przekazywania danych w formacie JSON
C. Biblioteka JavaScript do manipulacji danymi JSON
D. Protokół transferu plików JSON między serwerami
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 15

Jakie są kluczowe korzyści z wykorzystania frameworków podczas programowania aplikacji desktopowych?

A. Redukują zapotrzebowanie na pamięć operacyjną aplikacji
B. Gwarantują dostęp do niskopoziomowego kodu systemowego
C. Skracają czas tworzenia aplikacji dzięki gotowym komponentom i narzędziom
D. Ułatwiają kontrolę nad wersjami systemu operacyjnego
Zapewnienie dostępu do niskopoziomowego kodu systemowego jest cechą bibliotek i narzędzi takich jak C lub C++, ale frameworki zwykle dostarczają abstrakcję nad systemem, co upraszcza proces programowania. Zarządzanie wersjami systemu operacyjnego to zadanie narzędzi do wirtualizacji i zarządzania środowiskami, a nie cecha frameworków. Minimalizacja zapotrzebowania na pamięć operacyjną to efekt optymalizacji kodu i wydajnego programowania, ale nie jest to główny cel frameworków, które skupiają się na dostarczaniu narzędzi do szybszego tworzenia aplikacji.

Pytanie 16

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

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

Pytanie 17

Celem zastosowania wzorca Obserwator w tworzeniu aplikacji WEB jest:

A. informowanie obiektów o modyfikacji stanu innych obiektów
B. dostosowanie interfejsu użytkownika do różnych kategorii użytkowników
C. zarządzanie funkcjami synchronicznymi w kodzie aplikacji
D. monitorowanie działań użytkownika oraz generowanie wyjątków
Wzorzec projektowy Obserwator (ang. Observer) to jeden z klasyków ze świata programowania obiektowego i frontendu. Główna jego rola polega na tym, by pozwalać obiektom (obserwatorom) reagować na zmiany stanu innych obiektów (podmiotów) bez sztywnego powiązania tych klas ze sobą. W praktyce, w aplikacjach webowych bardzo często wykorzystuje się ten wzorzec w architekturach typu MVC czy MVVM, gdzie widoki muszą się automatycznie aktualizować po zmianie modelu danych. Przykład: w Reactcie używasz hooka useState lub useEffect – i Twoje komponenty „obserwują” stan aplikacji. Gdy stan się zmienia, komponenty same się przebudowują, a Ty nie musisz ręcznie wywoływać każdej aktualizacji. Podobnie działa np. EventEmitter w Node.js, Redux z subskrypcjami store czy nawet WebSockety, gdzie klient „słucha” na zmiany po stronie serwera. Dzięki temu komunikacja pomiędzy różnymi częściami systemu staje się luźno powiązana, co ułatwia utrzymanie i rozbudowę kodu. Moim zdaniem bez zrozumienia tego wzorca trudno ogarnąć nowoczesny frontend, bo większość bibliotek UI gdzieś pod spodem go wykorzystuje. Przy okazji: Observer to wzorzec zalecany przez GOF (Gang of Four), więc to nie jest tylko „fajna technika”, ale sprawdzony standard branżowy. Warto wiedzieć, że podejście to minimalizuje ryzyko błędów w synchronizacji danych i pozwala naturalnie reagować na zmiany bez pisania stosów callbacków. To spora oszczędność czasu i kodu.

Pytanie 18

Która z metod zarządzania projektami jest najbardziej odpowiednia, gdy w początkowej fazie projektu zakres nie jest w pełni określony, wymagania mogą zmieniać się podczas realizacji, a także mogą wystąpić nowe potrzeby?

A. Agile
B. Model kaskadowy
C. PRINCE2
D. Model V
Agile to podejście, które w mojej ocenie świetnie sprawdza się właśnie w sytuacjach, kiedy zakres projektu nie jest jasny od samego początku albo wymagania klienta mogą się zmieniać w trakcie prac. To nie tylko teoria – branża IT, ale i coraz więcej innych, korzysta z Agile'a tam, gdzie nie da się wszystkiego przewidzieć. Główna zaleta to iteracyjność i elastyczność. Zamiast jednego dużego planu, praca dzieli się na krótkie sprinty lub iteracje, gdzie co chwilę można coś poprawić, zmienić, dodać nową funkcjonalność albo wycofać się z pomysłu, który okazał się nietrafiony. W praktyce, jak klient zmienia zdanie albo rynek wymusza inne podejście – Agile pozwala szybko reagować bez katastrofalnych opóźnień. Moim zdaniem to właśnie dlatego standardy, takie jak Scrum czy Kanban (oba w duchu Agile), są dziś tak popularne nie tylko w software, ale nawet w marketingu czy budowlance. Co ciekawe, Agile promuje współpracę całego zespołu z klientem na każdym etapie, więc ryzyko, że coś zostanie źle zrozumiane i pójdzie do produkcji, jest dużo mniejsze niż w klasycznych podejściach. Warto pamiętać, że to nie jest model totalnego chaosu – są tu zasady i dobre praktyki, ale największym atutem jest właśnie ta adaptacyjność do zmieniających się warunków projektu.

Pytanie 19

Jak nazywa się technika umożliwiająca asynchroniczne wykonywanie operacji w JavaScript?

A. Variable
B. Function
C. Object
D. Promise
Wybór opcji Variable, Function lub Object wskazuje na nieporozumienie odnośnie do podstawowych pojęć w JavaScript. Variable to termin odnoszący się do sposobu przechowywania danych w programie; jest to kontener, który może przechowywać różne typy danych, ale nie jest to technika do zarządzania asynchronicznością. Funkcja jest blokiem kodu, który można wykonać, ale sama w sobie nie zapewnia asynchronicznego działania, chyba że zostanie połączona z innymi technikami, takimi jak Promise czy callbacki. Obiekt, natomiast, to struktura danych, która grupuje właściwości i metody, jednak nie ma bezpośredniego związku z zarządzaniem asynchronicznymi operacjami. Częstym błędem jest mylenie tych podstawowych pojęć i ich funkcjonalności. Osoby, które wybierają niewłaściwe odpowiedzi, często koncentrują się na ogólnych właściwościach tych terminów, nie dostrzegając ich ograniczeń. Aby skutecznie zarządzać asynchronicznymi operacjami w JavaScript, należy zrozumieć, że Promise jest konstrukcją zaprojektowaną specjalnie do tego celu, co odzwierciedla jego użycie w nowoczesnym kodzie JavaScript i zgodność z dobrymi praktykami programistycznymi. Dlatego, aby efektywnie pracować z asynchronicznością, warto zwrócić uwagę na techniki takie jak Promise, które umożliwiają bardziej złożone operacje oraz lepsze zarządzanie błędami.

Pytanie 20

W jakiej sytuacji wykorzystanie stosu będzie korzystniejsze niż lista podczas projektowania zestawu danych?

A. Gdy ważne jest szybkie znajdowanie elementów
B. Gdy dane muszą być uporządkowane
C. Gdy kolejność przetwarzania danych jest odwrócona (LIFO)
D. Gdy chcemy usunąć element z końca
Stos to struktura danych działająca na zasadzie LIFO (Last In First Out), co oznacza, że ostatni dodany element jest przetwarzany jako pierwszy. Jest to niezwykle efektywne rozwiązanie w przypadkach, gdy dane muszą być przetwarzane w odwrotnej kolejności niż były dodane. Stos jest szeroko wykorzystywany w implementacji algorytmów rekurencyjnych, obsłudze wywołań funkcji oraz w systemach zarządzania historią (np. w przeglądarkach internetowych lub edytorach tekstu). Stos zapewnia szybki dostęp do ostatnio dodanych danych i efektywne zarządzanie pamięcią, co czyni go niezastąpionym w wielu aplikacjach informatycznych.

Pytanie 21

Jakie będą skutki wykonania podanego fragmentu kodu w języku C++?

vector <int> liczby;
for(int i=0; i<10; i++) {
    liczby.push_back(2*i);
}
A. Z tablicy liczby usuwane są elementy, z każdym obiegiem pętli eliminowany jest element z jej końca.
B. Z tablicy liczby usuwane są elementy, z każdym obiegiem pętli eliminowany jest element z jej początku.
C. Do tablicy liczby, na jej początku, dodawane są nowe wartości.
D. Do tablicy liczby, na jej końcu, dodawane są nowe wartości.
Kod, który został przedstawiony, pokazuje bardzo typowe zastosowanie kontenera std::vector w C++. Metoda push_back() dodaje nowy element zawsze na końcu wektora, co oznacza, że kolejne wywołania tej funkcji będą rozszerzać tablicę o nowe wartości w porządku dodawania. W tym konkretnym przykładzie do pustego wektora liczby, w każdej iteracji pętli for dodawana jest liczba będąca podwojeniem indeksu – czyli 0, 2, 4, 6, 8, aż do 18 włącznie (bo i przyjmuje wartości od 0 do 9). To bardzo przyjazny i intuicyjny sposób na dynamiczne rozbudowywanie zbioru danych bez konieczności martwienia się o ręczne zarządzanie rozmiarem tablicy, co w języku C++ jest częstym źródłem błędów w przypadku zwykłych tablic. Z mojego doświadczenia korzystanie z push_back() jest czymś absolutnie podstawowym w codziennej pracy programisty, zwłaszcza jeśli chodzi o szybkie prototypowanie czy operacje na listach wynikowych. Warto zwrócić uwagę, że vector zapewnia też wydajne zarządzanie pamięcią - automatycznie rezerwuje przestrzeń, a w razie potrzeby powiększa ją. Standard C++ promuje stosowanie kontenerów STL właśnie z uwagi na bezpieczeństwo i wygodę użytkowania, więc to rozwiązanie jest nie tylko poprawne, ale też zgodne z dobrymi praktykami. Często w praktyce spotyka się właśnie takie sekwencyjne dodawanie elementów do końca wektora, chociażby przy wczytywaniu danych z plików czy budowaniu dynamicznych struktur.

Pytanie 22

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

A. Detection of logical errors during program execution
B. Executing code step by step
C. Real-time translation of instructions
D. Generating an executable file
Generowanie pliku wykonywalnego to jeden z najważniejszych kroków w kompilacji. Kiedy kod źródłowy zostaje przetworzony na język maszynowy, kompilator tworzy plik binarny, który można uruchomić na odpowiednim systemie operacyjnym. Taki plik jest samodzielny, więc nie trzeba go za każdym razem kompilować od nowa przy uruchamianiu. Dzięki kompilacji można też zoptymalizować kod, co jest mega ważne, zwłaszcza przy większych projektach. W przeciwieństwie do interpretacji, gdzie kod działa na bieżąco, kompilacja pozwala wyłapać błędy wcześniej i poprawić wydajność aplikacji. Moim zdaniem, to naprawdę spora zaleta!

Pytanie 23

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

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

Pytanie 24

Jaką jednostkę zaleca się stosować przy projektowaniu interfejsu aplikacji?

A. px
B. dp
C. pt
D. mm
No i właśnie, dp (density-independent pixels) to taki trochę złoty standard przy projektowaniu interfejsów na Androida. W praktyce chodzi o to, żeby elementy UI wyglądały podobnie na różnych urządzeniach – niezależnie czy ktoś ma ekran gęsty jak sito, czy telefon z bardzo dużymi pikselami. Używanie dp pozwala unikać sytuacji, gdzie tekst albo przyciski na jednym urządzeniu są czytelne i wygodne w obsłudze, a na innym są mikroskopijne lub przeciwnie – przesadnie wielkie. Oczywiście, wszystko to wynika z tego, że piksele na różnych ekranach mają inną fizyczną wielkość – tzw. density. Stosując dp, projektanci mogą być pewni, że rozmiary będą proporcjonalnie takie same niezależnie od sprzętu. Sam system Android automatycznie przelicza dp na odpowiednią liczbę pikseli na danym urządzeniu. To bardzo wygodne! Moim zdaniem każdy, kto zaczyna projektować aplikacje mobilne, powinien od razu przyzwyczajać się do pracy z dp, bo to po prostu ułatwia życie i ogranicza potem poprawki. To też zgodne z oficjalnymi wytycznymi Google – praktycznie każda dokumentacja do Material Design kładzie na to nacisk. Warto jeszcze pamiętać, że inne jednostki jak px, pt czy mm mogą się sprawdzić w wyjątkowych sytuacjach, ale raczej tylko wtedy, gdy faktycznie zależy nam na absolutnych rozmiarach – a to w UI mobilnym prawie się nie zdarza.

Pytanie 25

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

let i = 0;
while (i < 5) {
  i++;
  if (i === 3) continue;
  console.log(i);
}
A. 1, 2, 4, 5
B. 0, 1, 2, 3, 4
C. 1, 2, 3, 4, 5
D. 0, 1, 2, 4, 5
W przedstawionym kodzie mamy do czynienia z pętlą while, która działa, dopóki zmienna i jest mniejsza od 5. Na początku i jest równe 0, a w każdej iteracji pętli i jest zwiększane o 1. Wewnątrz pętli mamy warunek, który sprawdza, czy i jest równe 3. Jeżeli tak, to używamy instrukcji continue, co oznacza, że pomijamy resztę kodu w tej iteracji i wracamy do początku pętli. Przeanalizujmy, co się stanie w kolejnych iteracjach: w pierwszej iteracji i jest 1, więc wypisujemy 1, w drugiej iteracji i jest 2, więc wypisujemy 2. Gdy i osiąga 3, warunek if jest spełniony i przechodzimy do następnej iteracji, nie wypisując nic. Następnie i staje się 4 i 5, które również są wypisywane. W efekcie na konsoli zostanie wypisane 1, 2, 4, 5. Takie podejście pokazuje, jak ważne jest zrozumienie działania pętli i instrukcji sterujących w JavaScript, co jest kluczowe w programowaniu i pozwala na efektywne zarządzanie przepływem kodu.

Pytanie 26

Z analizy złożoności obliczeniowej algorytmów sortowania dla dużych zbiorów danych (powyżej 100 elementów) wynika, że najefektywniejszą metodą jest algorytm sortowania:

sortowanie bąbelkoweO(n²)
sortowanie przez wstawianieO(n²)
sortowanie przez scalanieO(n log n)
sortowanie przez zliczanieO(n)
sortowanie kubełkoweO(n²)
A. bąbelkowego
B. kubełkowego
C. przez scalanie
D. przez zliczanie
Sortowanie bąbelkowe jest jednym z najwolniejszych algorytmów i rzadko jest używane w praktyce ze względu na złożoność O(n^2). Sortowanie kubełkowe może być szybkie, ale jego efektywność zależy od równomiernego rozkładu danych. Sortowanie przez scalanie jest bardziej uniwersalne, ale ma większą złożoność obliczeniową niż Counting Sort i może być mniej efektywne dla dużych zbiorów danych o ograniczonym zakresie.

Pytanie 27

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. Generuje plik wykonywalny dla systemu operacyjnego
C. Zoptymalizowuje wydajność aplikacji w środowisku produkcyjnym
D. Łączy kod źródłowy z zewnętrznymi bibliotekami
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 28

Który z poniższych elementów nie jest związany z architekturą mikroserwisów?

A. Monolityczny kod źródłowy
B. Niezależne wdrażanie usług
C. Komunikacja przez API
D. Skalowalność poszczególnych usług
Monolityczny kod źródłowy to podejście, w którym wszystkie komponenty aplikacji są ze sobą ściśle powiązane i zintegrowane w jedną całość. W przeciwieństwie do architektury mikroserwisów, która pozwala na budowę systemów jako zbioru niezależnych usług, monolityczne podejście ogranicza możliwości rozwoju i skalowania aplikacji. W mikroserwisach poszczególne usługi mogą być rozwijane, wdrażane i skalowane niezależnie od siebie, co zwiększa elastyczność i skraca czas realizacji. Przykładem zastosowania architektury mikroserwisów może być serwis e-commerce, w którym oddzielne mikroserwisy obsługują płatności, zarządzanie produktami i wysyłkę. Dzięki temu, jeśli chcemy wprowadzić zmiany w systemie płatności, możemy to zrobić bez wpływu na inne obszary aplikacji. Warto również zauważyć, że podejście to umożliwia lepsze zarządzanie zespołami deweloperskimi, które mogą pracować równolegle nad różnymi usługami, co przyspiesza proces dostarczania wartości dla użytkowników.

Pytanie 29

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

A. git commit
B. git pull
C. git push
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 30

Która z poniższych technologii jest używana do tworzenia interfejsów użytkownika w aplikacjach React?

A. JSX
B. YAML
C. Markdown
D. XML
JSX, czyli JavaScript XML, jest rozbudowanym rozszerzeniem składni JavaScript, które pozwala na pisanie kodu, który przypomina HTML. JSX jest kluczowym elementem w budowaniu interfejsów użytkownika w aplikacjach React, ponieważ łączy logikę z prezentacją. Dzięki JSX można tworzyć komponenty React w sposób bardziej intuicyjny i czytelny, co przyspiesza proces tworzenia aplikacji. Na przykład, zamiast używać funkcji `React.createElement()`, można po prostu zapisać komponent w formie znaczników, co sprawia, że kod jest bardziej zrozumiały. Dodatkowo, JSX umożliwia wstawianie kodu JavaScript bezpośrednio w znacznikach, co pozwala na dynamiczne renderowanie treści. Praktyka korzystania z JSX stała się standardem w ekosystemie React, ponieważ ułatwia zarządzanie stanem i właściwościami komponentów, co jest zgodne z najlepszymi praktykami branżowymi.

Pytanie 31

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

A. zarządzania stanem aplikacji za pomocą systemów menu
B. zarządzania ustawieniami aplikacji, jako okno, które pozostaje widoczne na ekranie przez cały czas trwania aplikacji
C. prezentowania komunikatów, które wymagają potwierdzenia, aby kontynuować działanie aplikacji
D. wstrzymywania działania aplikacji w czasie wprowadzania oraz zatwierdzania danych
Okna dialogowe niemodalne, czasem zwane też oknami narzędziowymi albo pomocniczymi, to bardzo praktyczny element interfejsu użytkownika. To, co wyróżnia je spośród innych typów okien, to fakt, że użytkownik może korzystać równocześnie zarówno z tego okna, jak i z głównej aplikacji. Nie blokuje ono działania programu – wszystko jest dostępne w tym samym czasie. Najczęściej takie okna służą do zarządzania ustawieniami aplikacji albo wywoływania funkcji, które użytkownik może modyfikować na bieżąco, bez konieczności zamykania tego okna po każdej zmianie. Przykład z życia: paleta warstw w programach graficznych (np. GIMP czy Photoshop) albo okno stylów w edytorze tekstu. Dla mnie osobiście, taki model pracy jest dużo wygodniejszy niż korzystanie z okien modalnych, bo pozwala płynnie zmieniać ustawienia bez przerywania pracy. Dobrą praktyką w branży jest, żeby okna niemodalne nie zasłaniały kluczowych elementów interfejsu i były jasno oznaczone, by użytkownik wiedział, że może je w każdej chwili zamknąć, nie tracąc postępów. Takie podejście jest wręcz rekomendowane w wytycznych projektowania UX publikowanych przez Apple czy Microsoft (np. Human Interface Guidelines). Okna niemodalne są szczególnie ważne w aplikacjach wymagających ciągłego dostępu do narzędzi lub parametrów, np. edytorach grafiki, IDE czy programach CAD. Warto o tym pamiętać, projektując bardziej złożone systemy.

Pytanie 32

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, undefined
B. TypeError
C. Hello, John
D. Hello, null
Wynik działania tego kodu to `Hello, undefined`, co jest spowodowane tym, jak działa kontekst `this` w JavaScript. Gdy wywołujemy metodę `greet`, w kontekście tej metody `this` odnosi się do obiektu `obj`. Proszę zauważyć, że metoda `greet` używa funkcji anonimowej w `setTimeout`, a to zmienia kontekst `this`. W momencie, gdy `setTimeout` wywołuje funkcję, `this` nie odnosi się już do obiektu `obj`, lecz do globalnego obiektu (w przeglądarkach jest to `window`), gdzie `name` nie jest zdefiniowane. Dlatego w konsoli widzimy `Hello, undefined`. Takie zachowanie jest typowe dla JavaScript, więc warto zrozumieć, jak można to zmienić, np. używając funkcji strzałkowej (`() => {}`), która nie ma własnego kontekstu `this`, więc po prostu korzysta z kontekstu otaczającego. Użycie strzałek w takich przypadkach jest coraz częściej zalecane w nowoczesnym kodzie.

Pytanie 33

W dwóch przypadkach opisano mechanizm znany jako Binding. Jego celem jest

W Android Studio:
<TextView android:text="@{viewmodel.userName}" />
W XAML:
<Label Text="{Binding Source={x:Reference slider2}, Path=Value}" />
A. zarządzanie mechanizmem obietnic (promises) lub obserwatora (observable) w programowaniu asynchronicznym
B. wiązać właściwości (property) elementu interfejsu użytkownika z danymi lub właściwością innego obiektu
C. przetwarzanie zdarzeń kontrolek interfejsu użytkownika przez wywoływanie odpowiednich funkcji
D. wiązanie oraz eksportowanie plików z różnych modułów aplikacji
Wiązanie (binding) w kontekście interfejsów użytkownika, takich jak Android Studio czy XAML, to bardzo kluczowy mechanizm, który pozwala na automatyczne połączenie danych z logiki aplikacji (np. zmiennych, modeli ViewModel) z konkretnymi właściwościami kontrolek na ekranie. Dzięki temu nie trzeba ręcznie programować każdej aktualizacji – wszystko dzieje się „w tle”. Na przykład, jeśli użytkownik zmieni wartość jakiejś kontrolki, takiej jak suwak (Slider), odpowiednia właściwość w klasie ViewModel również się zaktualizuje i na odwrót. To podejście jest zgodne z architekturą MVVM (Model-View-ViewModel), która jest bardzo popularna w aplikacjach mobilnych i desktopowych. Moim zdaniem to ogromna oszczędność czasu i po prostu mniej błędów w kodzie, bo nie trzeba pisać setek linii kodu łączącego UI z danymi. W praktyce binding często umożliwia także walidację danych na bieżąco, reakcje na zmiany oraz poprawia czytelność kodu. Bez tego, nawet proste aplikacje robią się niepotrzebnie skomplikowane i trudne do utrzymania. Przykłady użycia – to chociażby powiązanie tekstu wyświetlanego w TextView z polem w ViewModel, czy automatyczna aktualizacja etykiety, gdy zmienia się wartość suwaka. To jedna z podstawowych rzeczy, które wyróżniają nowoczesne frameworki UI – i szczerze, trudno bez tego wyobrazić sobie dzisiejsze tworzenie aplikacji.

Pytanie 34

Która z poniższych struktur danych jest najbardziej odpowiednia do przechowywania unikalnych elementów?

A. Sekwencja
B. Kolejka priorytetowa
C. Tablica
D. Zbiór (Set)
Zbiór, czyli Set, to taki specjalny rodzaj struktury danych, który trzyma tylko unikalne elementy. To znaczy, że nie znajdziesz tam powtórzeń – jak masz listę użytkowników czy tagów, to świetnie, bo zbiór to idealnie rozwiązuje. Jest przy tym bardzo szybki w operacjach jak dodawanie, usuwanie czy wyszukiwanie. To dlatego zbory są używane w różnych algorytmach, zwłaszcza gdy chodzi o przetwarzanie dużych ilości danych i zarządzanie unikalnymi zasobami. Fajna sprawa, nie?

Pytanie 35

Które z wymienionych stanowi przykład struktury dziedziczenia?

A. Klasa Pojazd nie dziedziczy z żadnej klasy
B. Klasa Samochód i Pojazd nie są ze sobą powiązane
C. Klasa Pojazd ma dziedziczenie od klasy Samochód
D. Klasa Samochód ma dziedziczenie od klasy Pojazd
Hierarchia dziedziczenia to struktura klas, w której klasa pochodna dziedziczy właściwości i metody klasy bazowej. Klasa 'Samochód' dziedzicząca po klasie 'Pojazd' jest przykładem prawidłowej hierarchii dziedziczenia – klasa 'Samochód' rozszerza klasę 'Pojazd', dziedzicząc ogólne właściwości pojazdu, takie jak prędkość czy typ silnika. Dziedziczenie umożliwia rozszerzanie istniejącej funkcjonalności bez konieczności przepisywania tego samego kodu, co jest jednym z fundamentów programowania obiektowego.

Pytanie 36

Algorytm zaprezentowany w zadaniu można zrealizować w języku Java wykorzystując instrukcję

Ilustracja do pytania
A. if
B. switch
C. try
D. while
Pętla while w języku Java jest idealna do implementacji algorytmów, które wymagają wielokrotnego wykonywania bloku kodu dopóki określony warunek logiczny pozostaje prawdziwy. W przedstawionym schemacie blokowym widzimy iteracyjny proces, który zaczyna się od przypisania wartości 2 do zmiennej number, a następnie kontynuuje dodawanie 2 do tej zmiennej tak długo, jak długo jej wartość nie osiągnie 10. Struktura ta jest typowym przykładem problemu, który najlepiej rozwiązać za pomocą pętli while. Wyrażenie warunkowe number != 10 jest sprawdzane przed każdą iteracją pętli, co umożliwia zakończenie pętli w momencie, gdy warunek przestaje być prawdziwy. To podejście jest zgodne z dobrymi praktykami programistycznymi, które zalecają minimalizowanie niepotrzebnych obliczeń i zwiększanie czytelności kodu. Pętle while są często stosowane w sytuacjach, gdy liczba iteracji nie jest z góry znana i zależy od dynamicznie zmieniających się warunków, co czyni je wszechstronnym narzędziem w wielu aplikacjach, od przetwarzania danych po kontrolę przepływu w symulacjach komputerowych. Praktyczna znajomość pętli pozwala na efektywne rozwiązywanie problemów w złożonych projektach informatycznych.

Pytanie 37

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. bąbelkowe
B. przez wybór
C. szybkie (Quicksort)
D. przez wstawianie
Opisany w pytaniu algorytm to właśnie sortowanie bąbelkowe (ang. bubble sort). Polega ono na wielokrotnym przechodzeniu przez zbiór danych i zamienianiu miejscami sąsiadujących elementów, jeśli są w złej kolejności. Czynność ta powtarzana jest do momentu, gdy cały zbiór zostanie uporządkowany i żadne zamiany nie będą już potrzebne. Moim zdaniem, to chyba jeden z najbardziej intuicyjnych algorytmów sortowania, jakie się poznaje na początku nauki programowania – łatwo go zaimplementować, bo wymaga właściwie tylko dwóch pętli i porównania sąsiednich elementów. W praktyce bubble sort raczej rzadko używa się w profesjonalnych projektach, bo jego złożoność czasowa to O(n^2), co przy dużych zbiorach jest nieefektywne. Jednak czasami, na bardzo małych listach albo gdy szybko trzeba zrobić prosty prototyp, to można sięgnąć po „bąbelki”. Z mojego doświadczenia wynika też, że sortowanie bąbelkowe dobrze obrazuje podstawowe zasady algorytmiki, na przykład jak działa iteracja czy wymiana miejscami zmiennych – to przydatne w nauce. W wielu językach programowania, nawet tych nowoczesnych, można spotkać przykłady z bubble sort jako ilustrację podstaw. To taki klasyk – mało kto używa go zawodowo, ale każdy programista powinien wiedzieć, jak działa. Warto też pamiętać, że istnieją optymalizacje bubble sortu, np. wcześniejsze zakończenie, gdy w danej iteracji nie wystąpiła żadna zamiana. No i taka ciekawostka: choć algorytm nie jest specjalnie szybki, to bardzo łatwo go zaimplementować nawet w językach niskopoziomowych, bo nie wymaga dodatkowej pamięci.

Pytanie 38

Jak określa się proces transferu danych z lokalnego komputera na serwer?

A. Przesyłanie danych
B. Wysyłanie danych
C. Streaming
D. Pobieranie danych
Proces przesyłania danych z komputera lokalnego na serwer nazywany jest wysyłaniem danych. To kluczowy element komunikacji w sieciach komputerowych, który wskazuje na transfer informacji z jednego punktu do drugiego. Wysyłanie danych odbywa się za pomocą różnych protokołów, takich jak FTP (File Transfer Protocol), HTTP (Hypertext Transfer Protocol) czy SFTP (Secure File Transfer Protocol). Przykładem może być przesyłanie plików z komputera na zdalny serwer, co jest powszechnie wykorzystywane w przypadku tworzenia stron internetowych. W kontekście aplikacji, wysyłanie danych może dotyczyć również przesyłania formularzy do bazy danych. Ważne jest, aby dane były odpowiednio pakowane i kodowane w celu zapewnienia ich integralności oraz bezpieczeństwa. Stosowanie protokołów szyfrowania, takich jak SSL/TLS, dodatkowo zabezpiecza proces, co jest istotne w dobie rosnących zagrożeń cybernetycznych. Zbierając wszystkie te elementy, wysyłanie danych jest fundamentalnym procesem w architekturze nowoczesnych systemów informatycznych.

Pytanie 39

W języku C# szablon List zapewnia funkcjonalność listy. Z tworzenia obiektu typu List wynika, że jego składnikami są:

List<int> wykaz = new List<int>();
A. liczby całkowite
B. liczby rzeczywiste
C. elementy typu List
D. elementy o nieokreślonym typie
Szablon List<int> w języku C# implementuje listę, której elementami są liczby całkowite. Jest to przykład zastosowania kolekcji generycznych, które wprowadzają typowanie silne w czasie kompilacji, co pozwala na uniknięcie błędów typowych dla kolekcji niegenerycznych. Definiując List<int> deklarujesz, że lista będzie przechowywać tylko liczby całkowite. Dzięki temu kompilator może wykrywać błędy związane z typowaniem już podczas pisania kodu, co zwiększa jego niezawodność i bezpieczeństwo. Typ generyczny T w List<T> umożliwia tworzenie kolekcji przechowujących dowolny typ, co ułatwia ponowne wykorzystanie kodu i zgodność z zasadą DRY (Don't Repeat Yourself). W praktyce List<int> jest szeroko stosowany w scenariuszach wymagających dynamicznie rozwijanych kolekcji, które nie ograniczają się do statycznej liczby elementów, takich jak tablice. Listy generyczne są wydajniejsze i bardziej elastyczne dzięki metodom takim jak Add, Remove czy Contains, które operują na elementach określonego typu. Dzięki implementacji IEnumerable/Listy są również zgodne z LINQ, co umożliwia stosowanie złożonych zapytań i operacji na danych, takich jak filtrowanie i sortowanie, w sposób czytelny i efektywny.

Pytanie 40

Jaką wartość dziesiętną reprezentuje liczba binarna 1010?

A. 12
B. 8
C. 14
D. 10
Liczba binarna 1010 to wartość dziesiętna, która wynosi 10. Aby dokonać konwersji liczby binarnej na system dziesiętny, należy zrozumieć, że każda cyfra w systemie binarnym reprezentuje potęgę liczby 2, zaczynając od prawej strony, gdzie najniższa pozycja ma wartość 2^0. W przypadku 1010, mamy następujące pozycje: 1 * 2^3 (co daje 8), 0 * 2^2 (co daje 0), 1 * 2^1 (co daje 2) oraz 0 * 2^0 (co daje 0). Sumując te wartości: 8 + 0 + 2 + 0, otrzymujemy 10. W praktyce konwersja z systemu binarnego na dziesiętny jest niezwykle przydatna w programowaniu i elektronice, gdzie liczby binarne są powszechnie stosowane. Przykładowo, w obliczeniach komputerowych oraz w projektowaniu układów cyfrowych, znajomość tych konwersji jest kluczowa. Odnosi się to również do standardów, takich jak IEEE 754, które definiują reprezentację liczb zmiennoprzecinkowych w formatach binarnych.