Wyniki egzaminu

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

Egzamin zdany!

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

Zaznaczone elementy w przedstawionych obramowaniach mają na celu:
Fragment kodu w WPF/XAML:

<Windows Title="Tekst"...>
Fragment kodu w Java:
public class Okno extends JFrame {
    ...
    public Okno() {
        super();
        this.setTitle("Tekst");
    }
    ...
A. uzyskanie nazwy obiektu obrazującego okno aplikacji
B. ustawienie tytułu okna na "Tekst"
C. zapisanie tytułu okna do obiektu Tekst
D. przypisanie nazwy obiektu obrazującego okno aplikacji
Wybrana odpowiedź dokładnie oddaje sens działania kodu zarówno w WPF/XAML, jak i w Javie z użyciem JFrame. W jednym i drugim przypadku chodzi o ustawienie tytułu okna aplikacji, czyli tego tekstu, który pojawia się na pasku tytułowym okienka po uruchomieniu programu. Z mojego doświadczenia, jest to jedna z pierwszych rzeczy, jakie użytkownicy widzą w każdej aplikacji okienkowej, więc warto pamiętać, jak ją ustawić. W WPF właściwość Title w tagu Window służy właśnie do wyświetlenia krótkiego opisu albo nazwy programu. Z kolei w Javie metoda setTitle pozwala dynamicznie przypisywać tekst, co jest bardzo przydatne przy pisaniu aplikacji z wieloma oknami albo zmieniającym się stanem (np. można dodać tam nazwę pliku, z którym pracujemy). Branżowe standardy zachęcają do tego, żeby tytuły okien były krótkie, jednoznaczne i faktycznie informowały użytkownika o funkcji aktualnego widoku. Co ciekawe, w niektórych frameworkach można nawet dodać ikonę do tego paska tytułowego. Samo ustawienie tytułu nie zmienia żadnych właściwości obiektu aplikacji poza tym, jak jest widoczny dla użytkownika. To mały detal, ale bardzo ważny w codziennej pracy programisty interfejsów graficznych.

Pytanie 2

Co oznacza termin 'immutability' w programowaniu funkcyjnym?

A. Funkcje mogą być przypisywane do zmiennych
B. Kod może być wykonywany równolegle
C. Stan obiektu nie może być modyfikowany po jego utworzeniu
D. Obiekty są automatycznie usuwane z pamięci
Termin 'immutability' w programowaniu funkcyjnym odnosi się do właściwości obiektów, które po utworzeniu nie mogą być modyfikowane. W kontekście programowania funkcyjnego, gdzie funkcje są kluczowym składnikiem, immutability jest fundamentalnym założeniem, które pozwala na tworzenie bardziej przewidywalnych i bezpiecznych aplikacji. Kiedy obiekty są niemodyfikowalne, każde ich 'zmiana' generuje nowy obiekt, zamiast aktualizować istniejący, co eliminuję problemy związane z nieprzewidywalnym stanem aplikacji. Przykładem może być język programowania Scala, gdzie kolekcje, takie jak List, są niemodyfikowalne z założenia. Z perspektywy dobrych praktyk, immutability przyczynia się do łatwiejszej analizy kodu, testowania jednostkowego oraz równoległego przetwarzania danych. Ponadto, programowanie funkcyjne, bazujące na tej koncepcji, sprzyja tworzeniu czystych, modularnych i łatwych do przetestowania aplikacji.

Pytanie 3

Jakie pola powinny być umieszczone w klasie nadrzędnej w strukturze dziedziczenia?

A. Pola, które są wykorzystywane tylko w funkcjach statycznych
B. Pola, które są wspólne dla wszystkich klas pochodnych
C. Pola, które są charakterystyczne jedynie dla pojedynczej klasy pochodnej
D. Pola, które są tylko prywatne
W klasie bazowej w hierarchii dziedziczenia umieszcza się pola, które są wspólne dla wszystkich klas pochodnych. Dzięki temu klasy pochodne mogą dziedziczyć te same właściwości, co eliminuje konieczność ich wielokrotnego definiowania. Jest to jedna z głównych zalet programowania obiektowego, umożliwiająca reużywalność kodu i zwiększenie spójności w projekcie. Przykładem może być klasa 'Pracownik', która zawiera pola takie jak 'imię', 'nazwisko' i 'wynagrodzenie', a klasy pochodne, takie jak 'Inżynier' czy 'Księgowy', mogą dziedziczyć te same pola, dodając jedynie specyficzne właściwości dla swojej roli.

Pytanie 4

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

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

Pytanie 5

Podejście obiektowe w rozwiązywaniu problemów obejmuje między innymi:

A. wyzwalacze i polimorfizm
B. klasy, obiekty oraz hermetyzację
C. zmienne, procedury oraz funkcje
D. pola, metody, rekurencję oraz kwerendy
Podejście obiektowe, zwane też programowaniem obiektowym (OOP), naprawdę opiera się na takich pojęciach jak klasy, obiekty i hermetyzacja. Klasa to taki szablon, z którego tworzy się obiekty – czyli konkretne instancje tej klasy działające w pamięci komputera. Hermetyzacja polega na tym, że ukrywamy szczegóły implementacji i wystawiamy na zewnątrz tylko niezbędne interfejsy. Moim zdaniem to jest jeden z najważniejszych aspektów OOP, bo pozwala nam lepiej zarządzać złożonością dużych systemów. Przykładowo, w językach takich jak Java czy C#, klasa samochód może mieć prywatne pola (np. numer VIN), a dostęp do nich uzyskujemy tylko przez określone publiczne metody (gettery i settery). To bardzo pomaga, gdy w zespole kilka osób pracuje nad tym samym kodem – nie trzeba wiedzieć wszystkiego o wnętrzu klasy, by z niej korzystać. W praktyce, modelowanie problemów za pomocą obiektów i klas pozwala odwzorować realne byty z rzeczywistego świata w oprogramowaniu. Standardy branżowe, jak SOLID czy zasada pojedynczej odpowiedzialności, podkreślają konieczność stosowania hermetyzacji, bo to przekłada się na elastyczność i łatwość utrzymania kodu. Z mojego doświadczenia, jeśli dobrze opanujesz te podstawy OOP, dużo szybciej zrozumiesz bardziej zaawansowane koncepty, jak dziedziczenie czy polimorfizm. To naprawdę solidny fundament, z którego korzysta praktycznie każdy nowoczesny język programowania.

Pytanie 6

Jaki typ złośliwego oprogramowania funkcjonuje w tle, zbierając dane o wprowadzanych hasłach?

A. Keylogger
B. Trojan
C. Adware
D. Spyware
Keylogger to takie złośliwe oprogramowanie, które działa w tle i rejestruje wszystkie naciśnięcia klawiszy. To naprawdę niebezpieczne, bo może przechwytywać hasła i inne ważne dane osobowe. Keyloggery mogą się dostawać na komputer na różne sposoby, na przykład przez zainfekowane pliki, złośliwe reklamy albo w ramach innych niebezpiecznych programów. Przykładami takich keyloggerów są Spyrix czy Perfect Keylogger, które mogą monitorować, co robisz na komputerze. Z punktu widzenia bezpieczeństwa, standardy takie jak ISO/IEC 27001 mówią, jak ważna jest ochrona informacji. Dlatego tak istotne jest, żeby użytkownicy mieli świadomość zagrożeń, jakie niosą keyloggery i używali dobrego oprogramowania antywirusowego, żeby chronić swoje urządzenia i dane.

Pytanie 7

Jakie narzędzie może zostać wykorzystane do automatyzacji testów aplikacji internetowych?

A. Visual Studio Code
B. Blender
C. Selenium
D. Postman
Postman to narzędzie do testowania API, umożliwiające wysyłanie zapytań HTTP i analizowanie odpowiedzi serwera, ale nie jest narzędziem do testowania interfejsów użytkownika w przeglądarce. Blender to narzędzie do modelowania 3D i animacji, które nie ma zastosowania w testowaniu aplikacji webowych. Visual Studio Code to edytor kodu źródłowego, który może być używany do pisania i debugowania kodu, ale samo w sobie nie jest narzędziem do automatycznego testowania aplikacji webowych, jak Selenium.

Pytanie 8

Który z wymienionych frameworków jest charakterystyczny dla aplikacji komputerowych pisanych w C#?

A. WPF (Windows Presentation Foundation)
B. Spring
C. React
D. Qt
WPF (Windows Presentation Foundation) to framework firmy Microsoft, który jest powszechnie wykorzystywany do tworzenia aplikacji desktopowych w języku C#. WPF pozwala na projektowanie zaawansowanych interfejsów użytkownika (UI) z wykorzystaniem XAML (Extensible Application Markup Language), co umożliwia oddzielenie logiki aplikacji od warstwy prezentacyjnej. WPF wspiera grafikę wektorową, animacje oraz różne efekty wizualne, co czyni go idealnym narzędziem do budowy nowoczesnych, estetycznych aplikacji dla systemu Windows. Integracja z .NET i Visual Studio umożliwia szybkie tworzenie aplikacji oraz korzystanie z bogatych bibliotek i gotowych komponentów UI. WPF jest szczególnie ceniony za elastyczność, obsługę danych i możliwość tworzenia aplikacji responsywnych.

Pytanie 9

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 10

W środowisku IDE przeznaczonym do tworzenia aplikacji okienkowych zdefiniowano okno Form1. Aby wprowadzić zmiany w ustawieniach, w kolejności: tytuł okna na górnym pasku, standardowy kursor na strzałkę oraz kolor tła okna, należy dostosować następujące pola w oknie Properties:

Ilustracja do pytania
A. Text, Cursor, BackColor
B. (Name), Cursor, BackgroundImage
C. Text, UseWaitCursor, BackColor
D. (Name), UseWaitCursor, BackgroundImage
Wybrana odpowiedź jest prawidłowa, bo dokładnie te trzy właściwości – Text, Cursor i BackColor – odpowiadają w Windows Forms za ustawienia tytułu okna, domyślnego kursora myszy oraz koloru tła formularza. W praktyce, edytując pole Text w Properties, określasz, co użytkownik zobaczy na belce tytułowej okna. To często pierwszy krok w customizacji okna – tytuł powinien jednoznacznie identyfikować aplikację i jej funkcję, zgodnie z dobrymi praktykami UX/UI. Następnie pole Cursor umożliwia wybranie rodzaju kursora, który pojawi się, gdy użytkownik najedzie myszą na dany formularz. Najczęściej używany jest domyślny wskaźnik (strzałka), ale można tu ustawić na przykład kursor oczekiwania czy rękę, jeśli wymaga tego logika aplikacji. Zmiana BackColor to podstawa, jeśli chcesz wizualnie wyróżnić okno lub dostosować je do kolorystyki firmowej. Moim zdaniem, te trzy pola to podstawa podstaw w pracy z IDE do Windows Forms – bez ich zrozumienia ciężko mówić o jakimkolwiek sensownym projektowaniu interfejsu. Warto też zwrócić uwagę, że te właściwości są uniwersalne i pojawiają się praktycznie w każdym tutorialu czy dokumentacji Microsoftu dla .NET – to już taki żelazny standard branżowy. Z mojego doświadczenia często początkujący programiści mają z tym problem, bo szukają skomplikowanych rozwiązań, a tu chodzi po prostu o poprawne posługiwanie się Properties. Dzięki temu nawet najprostsza apka wygląda profesjonalniej i jest bardziej intuicyjna dla użytkownika.

Pytanie 11

Czym jest klasa w programowaniu obiektowym?

A. zmienna
B. typ danych
C. instrukcja
D. wskaźnik
Bardzo często spotykam się z tym, że klasa w OOP bywa mylona z innymi pojęciami, które brzmią znajomo, ale mają zupełnie inne zastosowanie i sens. Zacznijmy od zmiennej – to po prostu miejsce w pamięci, które przechowuje jakąś wartość, np. liczbę czy napis. Zmienna sama w sobie nie posiada żadnych zachowań, nie można do niej przypisać metod czy właściwości – to tylko pojemnik na dane, nie szablon czy definicja czegoś większego. Klasa natomiast służy do tworzenia zmiennych-typu obiekt, ale nie jest zmienną jako taką. W przypadku wskaźnika sprawa jest trochę bardziej podchwytliwa, bo w językach takich jak C++ rzeczywiście często operujemy wskaźnikami do obiektów lub klas. Jednak wskaźnik to zwyczajnie adres w pamięci, który wskazuje na jakąś zmienną, obiekt czy nawet funkcję. Klasa nie jest adresem, tylko strukturą opisującą, jak mają wyglądać i się zachowywać obiekty. Instrukcja natomiast to najmniejszy element programu wykonujący konkretne polecenie, np. przypisanie wartości czy wywołanie funkcji – nie ma żadnych cech typowych dla klasy, nie jest typem danych i nie opisuje żadnej struktury. Z mojego doświadczenia wynika, że problem z rozróżnieniem tych pojęć często bierze się z nauki „na pamięć” bez zrozumienia, na czym polega modelowanie obiektów w praktyce. W programowaniu obiektowym klasa jest właśnie typem danych, ale takim, który pozwala na zdefiniowanie zarówno przechowywanych danych, jak i operacji na nich, co jest jednym z głównych powodów jej wprowadzenia do języków takich jak Java, Python czy C#. To dzięki klasom możemy tworzyć kod wielokrotnego użytku, budować hierarchie obiektów i korzystać z takich mechanizmów jak dziedziczenie czy polimorfizm. Dobre zrozumienie tej roli jest kluczowe, bo pozwala unikać powtarzalnego kodu i podnosi jakość projektowanych aplikacji – a o to przecież chodzi w profesjonalnym programowaniu.

Pytanie 12

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

A. Numpy
B. Genymotion
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 13

Jaką komendę w języku C++ używa się do wielokrotnego uruchamiania tego samego bloku kodu?

A. if
B. while
C. break
D. switch
Instrukcja `while` w języku C++ i innych językach programowania pozwala na wielokrotne wykonanie tego samego fragmentu kodu, dopóki warunek logiczny jest spełniony. Przykład: `while (x < 10) { x++; }` będzie zwiększać zmienną `x` o 1, dopóki jej wartość nie osiągnie 10. Pętle `while` są przydatne, gdy liczba iteracji nie jest z góry znana i zależy od spełnienia określonego warunku w trakcie wykonywania programu.

Pytanie 14

Wskaź kod, który spowoduje wyświetlenie okna dialogowego przedstawionego na ilustracji. Dla uproszczenia kodu, zrezygnowano z atrybutów znaczników

Ilustracja do pytania
A. kod 4
B. kod 2
C. kod 3
D. kod 1
Odpowiedź, którą wybrałeś, to kod 2, i nie ma co do tego wątpliwości. Dobrze, że zauważyłeś wszystkie elementy, które były w oknie dialogowym. W tym kodzie masz TextBox na górze, który pozwala na wpisanie tekstu. Dwa CheckBoxy po lewej stronie to te typowe pola wyboru, które też były widoczne. Po prawej stronie masz trzy RadioButtony, które tworzą grupę przycisków - to jest właśnie to, co powinno być. Na dole widoczny jest przycisk Button z napisem Test, co też jest zgodne z obrazkiem. Takie rozmieszczenie to klucz do stworzenia dobrego interfejsu. Wiesz, w praktyce w wielu aplikacjach używa się właśnie tych elementów do prostych formularzy. Jeżeli rozumiesz, jak te komponenty działają i jak je ze sobą łączyć, to naprawdę dobrze ci to pójdzie w przyszłości w tworzeniu ładnych i funkcjonalnych interfejsów.

Pytanie 15

Jedną z zasad standardu WCAG 2.0 jest

A. stosowanie różnych palet kolorystycznych, w tym o wysokim kontraście
B. używanie jednego, odpowiednio dużego rozmiaru czcionki
C. unikanie przedstawiania informacji w formie uproszczonej
D. ograniczanie treści na stronie przez rezygnację z używania alternatywnych tekstów dla obrazów i filmów
Stosowanie różnych palet kolorystycznych, zwłaszcza takich z wysokim kontrastem, to naprawdę kluczowa sprawa w dostępności cyfrowej. Tak mówi standard WCAG 2.0, dokładniej zasada 1 – Postrzegalność. Chodzi tu głównie o kryterium sukcesu 1.4.3 (Kontrast – minimum), które wyraźnie określa, że tekst i treść graficzna muszą być czytelne dla osób z różnymi potrzebami, np. słabszym wzrokiem albo daltonizmem. Moim zdaniem warto sobie uświadomić, jak wielka to różnica. Przykładowo, jeśli tekst na stronie jest szary na białym tle, osoby starsze lub z wadami wzroku mogą po prostu nie być w stanie nic przeczytać. W praktyce, wysokokontrastowe kombinacje, np. biały tekst na czarnym tle lub na żółtym, bardzo poprawiają dostępność strony. Widać to choćby w trybach "high contrast" w systemach Windows – często osoby pracujące długo przy komputerze z tego korzystają, bo wzrok się mniej męczy. Branżowe dobre praktyki zalecają również nie polegać wyłącznie na kolorze podczas przekazywania informacji – przykładowo, jeśli błąd w formularzu jest oznaczony tylko na czerwono, osoba z daltonizmem tego nie zauważy. To wszystko pokazuje, że kolory i kontrast to nie tylko estetyka, ale klucz do równego dostępu. Z mojego doświadczenia, gdy projektuje się strony zgodnie z WCAG, dobrze jest testować różne ustawienia kontrastu albo korzystać z narzędzi jak Colour Contrast Analyser, żeby mieć pewność, że wszyscy użytkownicy skorzystają ze strony bez problemów.

Pytanie 16

Który algorytm sortowania opiera się na metodzie "dziel i zwyciężaj"?

A. Sortowanie przez wstawianie
B. Sortowanie szybkie (QuickSort)
C. Sortowanie bąbelkowe
D. Sortowanie przez wybór
Sortowanie przez wybór polega na wyszukiwaniu najmniejszego elementu w każdej iteracji i umieszczaniu go na początku tablicy, co prowadzi do złożoności O(n²). Sortowanie bąbelkowe również działa w czasie O(n²) i nie wykorzystuje strategii dziel i zwyciężaj. Sortowanie przez wstawianie polega na stopniowym umieszczaniu elementów w odpowiedniej pozycji, ale nie dzieli tablicy na mniejsze części jak QuickSort, co sprawia, że jest mniej wydajne dla dużych zbiorów danych.

Pytanie 17

Jakie czynniki powinny być brane pod uwagę podczas organizacji zasobów ludzkich w projekcie?

A. Umiejętności oraz doświadczenie członków zespołu
B. Jedynie dostępność technologii
C. Budżet projektu, bez uwzględnienia kompetencji zespołu
D. Wyłącznie techniczne wymagania projektu
Podczas planowania zasobów ludzkich w projekcie kluczowe jest uwzględnienie umiejętności i doświadczenia członków zespołu. Odpowiednie dopasowanie kompetencji do wymagań projektu ma ogromny wpływ na jakość i tempo realizacji zadań. Zespół o różnorodnych umiejętnościach jest bardziej elastyczny i lepiej radzi sobie z napotkanymi wyzwaniami. Analiza umiejętności pozwala na efektywne przydzielanie zadań, co zwiększa produktywność i redukuje ryzyko opóźnień.

Pytanie 18

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

A. Etap planowania
B. Wdrażanie
C. Przeprowadzanie testów
D. Analiza
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 19

Co to jest serverless computing?

A. Proces kompilacji kodu bezpośrednio w przeglądarce użytkownika
B. Model wykonywania kodu w chmurze bez konieczności zarządzania infrastrukturą serwerową
C. Technika projektowania baz danych bez użycia serwera SQL
D. Metoda tworzenia aplikacji bez użycia back-endu
Serverless computing to model dostarczania usług obliczeniowych, który pozwala programistom skupić się na pisaniu kodu, bez konieczności zarządzania serwerami czy infrastrukturą. W tym modelu, dostawcy usług chmurowych automatycznie przydzielają zasoby obliczeniowe w odpowiedzi na zdarzenia, co oznacza, że użytkownicy płacą jedynie za rzeczywistą moc obliczeniową, której używają, a nie za z góry ustalone zasoby. Przykładem zastosowania serverless computing może być wykorzystanie funkcji AWS Lambda, która uruchamia kod w odpowiedzi na zdarzenia, takie jak zmiany w bazie danych, przesyłanie plików do chmury czy wywołania API. Ten model jest zgodny z zasadami DevOps oraz architekturą mikroserwisów, które promują elastyczność i szybkość w dostarczaniu aplikacji. Dobrą praktyką jest również integrowanie serverless computing z systemami CI/CD, co pozwala na automatyczne wdrażanie i zarządzanie kodem w sposób efektywny.

Pytanie 20

Który z poniższych aspektów najdokładniej określa cel realizacji projektu?

A. Ocena postępów w czasie realizacji projektu
B. Określenie problemu i metody jego rozwiązania
C. Zidentyfikowanie technologii, które mogą być zastosowane
D. Stworzenie harmonogramu działań
Przygotowanie harmonogramu działań jest istotne, ale to tylko jeden z elementów planowania projektu, a nie jego główny cel. Zidentyfikowanie technologii to krok wspierający, który pomaga w realizacji projektu, ale nie rozwiązuje bezpośrednio problemu użytkownika. Analiza postępów pracy to narzędzie monitorujące, które służy do oceny efektywności działań, jednak nie stanowi podstawowego celu projektu, lecz jest częścią zarządzania nim.

Pytanie 21

Który fragment kodu ilustruje zastosowanie rekurencji?

Blok 1:
int fn(int a) {
  if(a==1) return 1;
  return fn(a-1)+2;
}
Blok 2:
int fn(int a) {
  if(a==1) return 1;
  return (a-1)+2;
}
Blok 3:
int fn(int a) {
  if(a==1) return 1;
  return fun(a-1)+2;
}
Blok 4:
int fn(int a) {
  if(a==1) return 1;
  return 2;
}
A. Blok 4
B. Blok 3
C. Blok 2
D. Blok 1
Blok 1 to typowy przykład rekurencji, czyli sytuacji, gdy funkcja wywołuje samą siebie z innym argumentem (tutaj fn(a-1)). Takie podejście pojawia się w programowaniu bardzo często, szczególnie przy rozwiązywaniu problemów, gdzie rozwiązanie można rozbić na mniejsze, podobne zadania. W Bloku 1 mamy tzw. przypadek bazowy (if(a==1) return 1), czyli moment, w którym dalsza rekurencja się zatrzymuje – bez tego każdy program rekurencyjny skończyłby się przepełnieniem stosu i błędem. Moim zdaniem, dobrze rozumiana rekurencja to jedna z podstaw algorytmiki – spotyka się ją choćby przy obliczaniu silni, ciągu Fibonacciego czy w algorytmach przeszukiwania struktur drzewiastych, np. w operacjach na drzewach binarnych. W praktyce branżowej warto wiedzieć, że rekurencja bywa bardzo elegancka i skraca kod, ale trzeba ją stosować z głową – łatwo przekroczyć limity stosu przy zbyt głębokim wywołaniu albo zapomnieć o przypadku bazowym, przez co program nie kończy działania. W standardach wielu języków (np. C, Java) rekurencja jest narzędziem jak każde inne, ale zawsze powinna być projektowana z myślą o czytelności i efektywności rozwiązania. Często spotykam się z sytuacją, gdzie początkujący próbują wszystko rozwiązywać rekurencyjnie, a to nie zawsze jest optymalne – niektóre problemy lepiej rozwiązać iteracyjnie, choćby ze względu na wydajność. W tym konkretnym kodzie zastosowanie rekurencji jest klasyczne i poprawne, więc zdecydowanie jest to dobry wzór do nauki.

Pytanie 22

Co oznacza pojęcie 'hoisting' w JavaScript?

A. Mechanizm zarządzania pamięcią w przeglądarce
B. Proces podnoszenia deklaracji zmiennych i funkcji na górę zakresu
C. Metoda ładowania skryptów z zewnętrznych źródeł
D. Technika optymalizacji kodu przez silnik JavaScript
Omawiając inne odpowiedzi, warto zauważyć, że niektóre z nich mogą wprowadzać w błąd. Na przykład, technika optymalizacji kodu przez silnik JavaScript nie ma nic wspólnego z hoistingiem. Hoisting nie jest związany z optymalizacją, ale z tym, jak JavaScript interpretuje kod. Optymalizacja kodu odnosi się do sposobu, w jaki silniki JavaScript, takie jak V8, przetwarzają kod, aby działał szybciej, poprzez różne techniki, takie jak JIT (Just-In-Time) compilation, a nie przez przenoszenie deklaracji. Z kolei mechanizm zarządzania pamięcią dotyczy sposobu, w jaki JavaScript radzi sobie z pamięcią w czasie wykonania, co również nie jest bezpośrednio związane z hoistingiem. Pamięć jest zarządzana przez garbage collector, który usuwa nieużywane obiekty. Metoda ładowania skryptów z zewnętrznych źródeł także nie ma związku z hoistingiem, ponieważ odnosi się to do sposobu, w jaki zasoby są pobierane i wykonywane w przeglądarkach. Wszystkie te koncepcje, choć dotyczą JavaScriptu, nie mają związku z mechanizmem hoistingu, co prowadzi do powszechnych nieporozumień wśród programistów. Dlatego tak ważne jest zrozumienie, jak działa hoisting, aby uniknąć błędów w kodzie oraz poprawić zrozumienie działania JavaScriptu.

Pytanie 23

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

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

Pytanie 24

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

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

Pytanie 25

Jakie znaczenie ma przystosowanie interfejsu użytkownika do różnych platform?

A. Usuwa konieczność testowania na różnych platformach
B. Gwarantuje optymalne korzystanie z aplikacji na każdym urządzeniu
C. Umożliwia skoncentrowanie się wyłącznie na funkcjonalności aplikacji
D. Pozwala na unifikację kodu niezależnie od używanej platformy
Dostosowanie interfejsu do różnych urządzeń to naprawdę ważna sprawa, żeby wszystko działało jak należy. Aplikacje, które dobrze się przystosowują do różnych ekranów czy systemów, dają lepsze doświadczenie użytkownikom. Użycie takich technik jak responsywny design czy elastyczne układy, jak flexbox czy grid, to super pomysł. Dzięki temu elementy interfejsu same się skalują, a aplikacja wygląda spójnie na telefonach, tabletach i komputerach. Nie ma nic gorszego niż chaotyczny interfejs na różnych urządzeniach, więc to naprawdę kluczowa kwestia.

Pytanie 26

Co to jest automatyzacja testowania procesów?

A. Integracją testów w środowisku deweloperskim
B. Używaniem narzędzi oraz skryptów do wykonywania testów w sposób automatyczny bez udziału człowieka
C. Kompilowaniem kodu w celu zwiększenia efektywności
D. Sprawdzaniem poprawności działania aplikacji na urządzeniach przenośnych
Automatyzacja procesu testowania to zastosowanie narzędzi, skryptów i technologii do przeprowadzania testów oprogramowania w sposób zautomatyzowany, bez konieczności ciągłej ingerencji człowieka. Automatyzacja pozwala na szybkie i wielokrotne uruchamianie testów regresyjnych, co znacząco zwiększa efektywność testowania, redukuje czas potrzebny na wykrycie błędów i umożliwia jednoczesne testowanie wielu funkcji. Narzędzia takie jak Selenium, JUnit czy TestNG pozwalają na tworzenie skryptów testowych, które automatycznie weryfikują poprawność działania aplikacji na różnych urządzeniach i w różnych środowiskach. Automatyzacja testów to nie tylko oszczędność czasu, ale także wyższa dokładność i powtarzalność testów, co minimalizuje ryzyko przeoczenia krytycznych błędów.

Pytanie 27

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

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

Który z wymienionych składników jest charakterystyczny dla środowiska IDE przeznaczonego do tworzenia aplikacji mobilnych?

A. Edytor tekstowy, przeglądarka internetowa, system kontroli wersji
B. Kompilator, debugger, emulator urządzenia mobilnego
C. Narzędzia do analizy danych, serwer webowy, przeglądarka internetowa
D. Edytor graficzny, narzędzia analityczne, klient FTP
Kompilator, debugger i emulator urządzenia mobilnego to podstawowe narzędzia w każdym środowisku IDE przeznaczonym do tworzenia aplikacji mobilnych. Kompilator jest odpowiedzialny za przekształcenie kodu źródłowego na plik wykonywalny, co pozwala na uruchomienie aplikacji na urządzeniu. Debugger umożliwia wykrywanie i eliminowanie błędów, co jest kluczowe dla prawidłowego działania aplikacji. Emulator pozwala na symulowanie działania aplikacji na różnych urządzeniach i systemach, co ułatwia testowanie bez potrzeby fizycznego dostępu do wielu modeli telefonów czy tabletów. Taki zestaw narzędzi jest standardem w Android Studio, XCode oraz Visual Studio, co umożliwia pełen cykl tworzenia aplikacji mobilnych – od kodowania, przez testowanie, aż po wdrażanie.

Pytanie 29

Co to jest Event Loop w JavaScript?

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

Pytanie 30

Zalecenia standardu WCAG 2.0 dotyczące percepcji koncentrują się na

A. umożliwieniu interakcji między komponentami użytkownika za pomocą klawiatury
B. zrozumieniu i wiarygodności prezentowanych treści na stronie
C. prezentacji elementów interfejsu użytkownika
D. zapewnieniu odpowiedniej ilości czasu na przeczytanie i zrozumienie treści
Rekomendacje standardu WCAG 2.0 dotyczące percepcji koncentrują się na tym, jak użytkownicy postrzegają i interpretują treści na stronach internetowych, co obejmuje również komponenty interfejsu użytkownika. Standardy te nakładają obowiązek projektowania elementów interaktywnych w sposób, który umożliwia ich łatwe identyfikowanie i zrozumienie przez wszystkich użytkowników, w tym osoby z niepełnosprawnościami. Przykłady obejmują odpowiednie etykietowanie przycisków, stosowanie kontrastujących kolorów oraz zapewnienie wyraźnych granic dla interaktywnych elementów. Komponenty takie jak formularze, menu nawigacyjne czy przyciski akcji muszą być intuicyjnie zrozumiałe i łatwe w obsłudze. Odniesienia do standardów WCAG 2.0, szczególnie do wytycznych związanych z percepcją, podkreślają znaczenie dostosowania treści do różnych percepcyjnych sposobów odbioru, co jest kluczowe dla zapewnienia dostępności. Właściwe zastosowanie tych zasad sprzyja lepszej użyteczności, co przekłada się na pozytywne doświadczenia użytkowników.

Pytanie 31

Jaką wartość przyjmie etykieta label po wykonaniu poniższego kodu, gdy zostanie on uruchomiony po naciśnięciu przycisku w aplikacji?

private void Button_click(object sender, routedEventArgs e) {
    int tmp = 0;
    for (int i=0; i<=100; i+=2) {
        tmp += i;
    }
    label.Content = tmp;
}
A. liczby parzyste z przedziału od 0 do 100
B. suma liczb z przedziału od 0 do 100
C. liczby z przedziału od 0 do 100
D. suma liczb parzystych z przedziału od 0 do 100
Kod, który został podany w pytaniu, wykorzystuje pętlę for do obliczenia sumy wszystkich liczb parzystych z przedziału od 0 do 100 włącznie. Zmienna tmp pełni tutaj rolę akumulatora, który z każdą iteracją powiększa swoją wartość o kolejną liczbę parzystą. Startujemy od zera, a dzięki i+=2 pętla przechodzi tylko przez liczby parzyste (0, 2, 4, ..., 100). To bardzo typowy sposób, żeby wyliczyć sumę konkretnego zbioru liczb – w tym przypadku parzystych z określonego zakresu. Moim zdaniem warto zauważyć, że takie podejście świetnie sprawdza się w prostych kalkulatorach, prostych analizach danych czy nawet w grach, gdzie czasem trzeba sumować tylko wybrane wartości. W praktyce, szczególnie w większych projektach, lepiej opakować takie operacje w osobne metody lub korzystać np. z funkcji agregujących LINQ w C#. Ale zasada jest ta sama – najpierw określamy, co konkretnie chcemy sumować (tutaj: liczby parzyste), a potem realizujemy to w pętli. Ten fragment kodu jest też niezłym przykładem, jak optymalnie można przechodzić przez dane, jeśli nie musimy analizować wszystkich możliwych wartości (tutaj: wystarczy co drugi krok). Takie sumowanie przydaje się w pracy z raportami, zestawieniami i w miejscach, gdzie liczy się wydajność przetwarzania danych.

Pytanie 32

Który system operacyjny jest podstawowym środowiskiem do tworzenia aplikacji mobilnych w języku Swift?

A. Android
B. LG UX
C. iOS
D. Windows UWP
Swift to język programowania stworzony przez Apple specjalnie z myślą o ekosystemie tej firmy, czyli głównie o systemach iOS, macOS, watchOS oraz tvOS. To właśnie iOS jest podstawową, domyślną platformą, na której programiści wykorzystują Swift do budowania aplikacji mobilnych. Praktycznie każda nowoczesna aplikacja na iPhone’a czy iPada, która powstała po 2014 roku, jest przynajmniej w części napisana w Swifcie, bo to obecnie standard branżowy w świecie Apple. Moim zdaniem to jest super wygodne, bo Apple dostarcza kompletne narzędzia do pracy ze Swiftem, jak Xcode czy rozbudowane frameworki (UIKit, SwiftUI). Z mojego doświadczenia wynika, że programowanie w Swifcie dla iOS to nie tylko prostsza składnia, ale też większa stabilność i bezpieczeństwo aplikacji – Apple bardzo dba o aktualizacje narzędzi i dobre praktyki. Warto też pamiętać, że od wersji SwiftUI rozwijanie aplikacji na iOS stało się jeszcze bardziej intuicyjne, bo można korzystać z deklaratywnego podejścia do interfejsów. W realnych projektach spotyka się też Objective-C, ale obecnie Swift wygrywa czytelnością i wsparciem społeczności. Gdyby ktoś chciał tworzyć aplikacje mobilne poza ekosystemem Apple, to niestety Swift nie będzie najlepszym wyborem – właśnie dlatego iOS jest tym środowiskiem, do którego Swift został stworzony i tam najbardziej się sprawdza.

Pytanie 33

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

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

Zastosowanie typu DECIMAL języka SQL wymaga wcześniejszego zdefiniowania długości (liczby cyfr) przed przecinkiem oraz długości cyfr po przecinku. Jest to zapis:

A. logicznym
B. zmiennoprzecinkowy
C. stałoprzecinkowy
D. łańcuchowym
Typ DECIMAL w SQL bywa mylony z różnymi innymi kategoriami typów, głównie dlatego, że ludzie kojarzą „przecinek” z liczbami zmiennoprzecinkowymi albo traktują wszystko, co ma cyfry, jako coś podobnego do tekstu. W rzeczywistości DECIMAL jest typem stałoprzecinkowym, czyli takim, w którym precyzja i liczba miejsc po przecinku są z góry ustalone przy definicji kolumny. To jest zupełnie inne podejście niż w typach zmiennoprzecinkowych, takich jak FLOAT czy DOUBLE. Tam liczby są przechowywane w formacie binarnym zgodnym mniej więcej ze standardem IEEE 754, a przecinek „pływa”, co prowadzi do drobnych, ale istotnych błędów zaokrągleń.
Jeśli ktoś zaznacza odpowiedź zmiennoprzecinkowy, to zwykle wynika z intuicji: skoro jest przecinek, to pewnie float. To jest typowy błąd myślowy. W SQL typy zmiennoprzecinkowe są właśnie po to, by obsługiwać bardzo duże lub bardzo małe wartości kosztem dokładności, np. w obliczeniach naukowych. DECIMAL natomiast ma służyć do obliczeń finansowych i biznesowych, gdzie dokładność jest ważniejsza niż zakres. Z mojego doświadczenia to jedno z częstszych źródeł błędów w młodych projektach: użycie FLOAT do kwot pieniędzy.
Odpowiedź logicznym też bywa wybierana trochę „na czuja”, bo ktoś kojarzy, że SQL ma typy TRUE/FALSE, ale DECIMAL nie ma nic wspólnego z logiką boolowską. Typy logiczne przechowują wartości dwustanowe (czasem z NULL jako stanem trzecim), a nie liczby z miejscami po przecinku. Podobnie odpowiedź łańcuchowym wynika z przekonania, że skoro można cyfry zapisać w tekście, to wszystko jedno, czy to tekst, czy liczba. W praktyce typy łańcuchowe (CHAR, VARCHAR, TEXT) nie zapewniają poprawnej arytmetyki, sortowania numerycznego ani kontroli zakresu liczb. Trzymanie wartości liczbowych jako tekst to bardzo zła praktyka: utrudnia indeksowanie, psuje wydajność i powoduje dziwne błędy przy porównaniach (np. '100' < '20' w porządku leksykograficznym). Dobre wzorce projektowania baz danych mówią jasno: liczby trzymaj w typach liczbowych, a wartości wymagające dokładności dziesiętnej w typie stałoprzecinkowym DECIMAL/NUMERIC, z jasno określoną precyzją i skalą.

Pytanie 35

Który z podanych algorytmów operujących na jednowymiarowej tablicy posiada złożoność obliczeniową O(n²)?

A. Wypisanie elementów
B. Sortowanie bąbelkowe
C. Sortowanie szybkie
D. Wyszukiwanie binarne
Sortowanie bąbelkowe, znane również jako bubble sort, to prosty algorytm sortowania, który działa na zasadzie wielokrotnego przechodzenia przez tablicę i porównywania sąsiadujących ze sobą elementów. Algorytm ten ma złożoność obliczeniową O(n^2), co oznacza, że w najgorszym przypadku liczba operacji porównania wzrasta kwadratowo wraz ze wzrostem liczby elementów w tablicy. Przykładowo, dla tablicy o 5 elementach algorytm może wykonać do 10 porównań. W praktyce sortowanie bąbelkowe jest rzadko stosowane w dużych zbiorach danych ze względu na swoją niską efektywność, jednak jest to dobry przykład do nauki podstaw algorytmów sortujących. Standardy algorytmów sortujących, takie jak te zawarte w podręcznikach algorytmiki, często używają sortowania bąbelkowego jako przykładu do omówienia prostych koncepcji związanych z sortowaniem. Warto zauważyć, że chociaż algorytm ten jest prosty do zrozumienia, jego złożoność czasowa sprawia, że nie jest on praktyczny do stosowania w produkcyjnych rozwiązaniach, gdyż bardziej optymalne algorytmy, jak sortowanie szybkie czy sortowanie przez scalanie, osiągają złożoność O(n log n).

Pytanie 36

W zamieszczonym fragmencie kodu Java wskaż nazwę zmiennej, która może przechować wartość 'T'.

int zm1;
float zm2;
char zm3;
boolean zm4;
A. zm3
B. zm4
C. zm2
D. zm1
Poprawnie wskazana została zmienna 'zm3', której typ to 'char'. To właśnie zmienne typu 'char' w Javie służą do przechowywania pojedynczych znaków, takich jak na przykład litera 'T'. Zmienna 'char' przechowuje znak jako wartość liczbową zgodnie z kodowaniem Unicode, co pozwala na obsługę szerokiego zakresu znaków z różnych alfabetów. W praktyce często spotyka się sytuacje, gdzie potrzebujemy przechować czy odczytać pojedynczy znak – np. literę przy przetwarzaniu tekstu, analizowaniu plików, czy nawet w prostych grach tekstowych, gdzie np. sterowanie postacią opiera się o pojedyncze litery wciskane na klawiaturze. Moim zdaniem dobre zrozumienie typu 'char' to podstawa, bo łatwo pomylić go z typem 'String', który przechowuje jednak całe ciągi znaków, a nie pojedyncze znaki. Z punktu widzenia dobrych praktyk, zawsze warto dobierać możliwie najwęższy typ danych do zadania – jeżeli chcemy przechować jedną literę, typ 'char' jest po prostu najefektywniejszy. Nawiasem mówiąc, w Javie znak umieszczamy w pojedynczych apostrofach (np. 'T'), co jednoznacznie odróżnia je od tekstów (podwójne cudzysłowy). Osobiście zdarzało mi się kiedyś pomylić te typy i potem szukać błędów, więc warto zapamiętać tę różnicę. Warto też wiedzieć, że typ 'char' przydaje się np. do operacji na znakach w tablicach, przy konwersjach kodów ASCII czy nawet szyfrowaniu prostych tekstów. Zdecydowanie jest to typ, którego nie można pominąć w nauce Javy.

Pytanie 37

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

SELECT COUNT(*)
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
A. Liczba pracowników z pensją powyżej średniej
B. Liczba pracowników z najwyższą pensją
C. Błąd składni SQL
D. Średnia pensja wszystkich pracowników
Odpowiedź, że wynik działania zapytania SQL to liczba pracowników z pensją powyżej średniej, jest całkowicie poprawna. Zapytanie to korzysta z funkcji agregującej COUNT(*), która zlicza liczbę rekordów spełniających określony warunek. W tym przypadku warunkiem jest, że pensja pracownika jest większa od średniej pensji wszystkich pracowników, którą obliczamy za pomocą wewnętrznego zapytania (subquery). Tego rodzaju operacje są powszechnie stosowane w analizie danych w bazach danych, gdzie często musimy wykonać porównania względem wartości agregatów, takich jak średnia, mediana czy suma. Przykładowo, w analizie wynagrodzeń w danej firmie, można użyć podobnych zapytań do oceny, jaki odsetek pracowników jest wynagradzanych powyżej średniej, co może być istotne z punktu widzenia polityki płacowej oraz budżetowania. Pamiętaj, że dobre praktyki w pracy z bazami danych obejmują optymalizację zapytań oraz unikanie niepotrzebnych obliczeń, co może wpłynąć na wydajność systemu.

Pytanie 38

Jakie działania należy podjąć, aby uniknąć nieskończonej rekurencji w danej funkcji?

A. Wykorzystać automatyczny debugger w kompilatorze
B. Zastosować iterację zamiast rekurencji
C. Dodać warunek zakończenia w funkcji
D. Rozszerzyć zakres zmiennych globalnych
Warunek stopu to taki kluczowy element w rekurencji, który właściwie mówi, kiedy funkcja powinna przestać się wywoływać. Jak masz ten warunek, to funkcja wraca z wynikiem zamiast kręcić się w kółko, co mogłoby prowadzić do jakiegoś szaleństwa, tzn. przepełnienia stosu. Myślę, że warto zwrócić uwagę, że dodanie tego warunku to naprawdę podstawowa sprawa w programowaniu, bo bez niego wszystko może się posypać i przestanie działać tak, jak powinno.

Pytanie 39

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

A. 1011100
B. 10100100
C. 10100010
D. 1010100
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

Po uruchomieniu poniższego kodu w języku C++ na konsoli zobaczymy następujący tekst:

#include <stdio.h>
int main() {
    int a = 5;
    float b = 5.12345;
    double w;
    w = a + b;
    printf("%s dodawania: %d + %.2f = %f", "Wynik", a, b, w);
    return 0;
}
A. "%s dodawania: %d + %.2f = %f", "Wynik", 5, 5.12345, 10.123450
B. Wynik dodawania: 5+5.12=10.123450
C. dodawania: 5+5.12345=10.123450 Wynik
D. "%s dodawania: %d + %.2f=%f", "Wynik", a, b, w
Wiele osób daje się złapać na nieco podchwytliwe formatowanie tekstu i nie do końca rozumie mechanizm działania funkcji printf w języku C++. Kluczowe jest, że printf nie wypisuje dosłownie wszystkiego, co znajduje się w cudzysłowie, tylko podmienia tzw. specyfikatory formatu na konkretne wartości przekazane po przecinku. Próby dosłownego przepisania wywołania funkcji printf jako wyjścia na ekran są mylące – program nie drukuje ""%s dodawania: %d + %.2f = %f"", tylko zamienia to na odpowiednie liczby i teksty. Równie powszechnym błędem jest niedopasowanie precyzji – np. wypisanie 5.12345 zamiast 5.12 przy %.2f, bo printf automatycznie zaokrągla wynik do dwóch miejsc po przecinku w tym miejscu. Część osób pomija też fakt, że argumenty w printf muszą być przekazane w tej samej kolejności, co specyfikatory – co jest bardzo istotne przy większej liczbie zmiennych. Należy zwrócić szczególną uwagę na to, jak typy danych są prezentowane i obsługiwane przez printf: %d to zawsze liczba całkowita, %.2f – liczba zmiennoprzecinkowa dokładnie z dwoma cyframi po przecinku, %f – domyślnie sześć miejsc po przecinku. W praktyce niepoprawne jest zapisywanie wywołania funkcji jako tekst do wyświetlenia albo przestawianie kolejności czy branie wartości z pamięci bez sprawdzenia ich formatu. Z mojego doświadczenia takie potknięcia wynikają raczej z braku praktyki z printf i nieuważnego czytania dokumentacji. Warto zawsze sprawdzać, jak formatowanie będzie wyglądać na wyjściu i testować fragmenty kodu – bo komputer nie domyśli się, co autor miał na myśli, tylko wykona dokładnie to, co zadeklarowano w kodzie.