Wyniki egzaminu

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

Egzamin zdany!

Wynik: 36/40 punktów (90,0%)

Wymagane minimum: 20 punktów (50%)

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

Jakie znaczenie ma termin "przesłanianie metody" w kontekście programowania obiektowego?

A. Zmiana metody prywatnej na metodę publiczną
B. Tworzenie nowej metody w klasie bazowej
C. Zastosowanie tej samej nazwy metody w klasie bazowej i pochodnej, ale z inną implementacją w klasie pochodnej
D. Przenoszenie metod z jednej klasy do drugiej
Przesłanianie metody to mechanizm, w którym metoda w klasie pochodnej ma taką samą nazwę, typ zwracany i listę parametrów jak metoda w klasie bazowej, ale zawiera inną implementację. To kluczowy element polimorfizmu, umożliwiający dostosowanie zachowania klasy pochodnej do jej specyficznych potrzeb, przy zachowaniu spójnego interfejsu. Przesłanianie metod pozwala na elastyczne projektowanie kodu i jest szeroko stosowane w dużych projektach, aby umożliwić rozszerzalność oraz ponowne wykorzystanie istniejącej logiki. W C++ przesłanianie osiąga się za pomocą słowa kluczowego 'virtual' w klasie bazowej, a następnie redefinicji metody w klasie pochodnej.

Pytanie 2

Zademonstrowana pętla wykorzystuje obiekt random do:

var random = new Random();
String pulaZnakow = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ";
int dlPuli = pulaZnakow.Length - 1;
char znak;
string wynik = "";

for (int i = 0; i < 8; i++) {
    znak = pulaZnakow[random.Next(0, dlPuli)];
    wynik += znak;
}
A. jednorazowego wylosowania znaku z określonego zestawu znaków
B. wielokrotnego generowania liczby, aby stworzyć ciąg z liczb pseudolosowych
C. uzupełniania tablicy danymi w postaci liczb pseudolosowych
D. stworzenia losowego napisu o długości 8 znaków składającego się z liter
Kod, który został przedstawiony, to typowy przykład generowania losowego napisu, takiego jak hasło czy token sesji. Random służy tutaj do wielokrotnego losowania indeksów z określonego zakresu, które następnie są używane do pobierania znaków z puli liter. W efekcie – po przejściu całej pętli – zmienna 'wynik' zawiera napis złożony z 8 losowo dobranych liter z podanego zestawu. Tak się właśnie w praktyce koduje np. generator jednorazowych haseł lub krótkich identyfikatorów użytkowników. Często takie rozwiązania spotyka się w aplikacjach internetowych, gdzie bezpieczeństwo i nieprzewidywalność takich danych są kluczowe. Zresztą, korzystanie z Random i gotowej puli znaków to branżowy standard, jeśli chodzi o prostą losowość tekstową (chociaż do kryptografii są lepsze klasy, np. RNGCryptoServiceProvider). Warto też pamiętać, że pętle for idealnie nadają się do składania ciągów o z góry ustalonej długości, co jest bardzo czytelne i zgodne z dobrymi praktykami C#. Ogólnie, ten sposób generowania losowego stringa jest szybki, łatwy do zrozumienia i nieźle się skaluje – no i sprawdza się rewelacyjnie w różnych projektach, gdzie trzeba wygenerować coś pseudo-losowego, ale czytelnego dla człowieka. Sam się kiedyś złapałem na tym, jak często taki kod się przydaje przy rejestracji użytkowników czy obsłudze prostych quizów online.

Pytanie 3

Które z wymienionych stwierdzeń najtrafniej charakteryzuje klasę dziedziczącą?

A. Klasa, która wykorzystuje pola i metody innej klasy bez ich ponownej definicji
B. Klasa, która dzieli swoje pola z klasami zaprzyjaźnionymi
C. Klasa, która nie może posiadać konstruktorów ani destruktorów
D. Klasa, która umożliwia wielokrotne dziedziczenie pól prywatnych
Klasa nie dzieli swoich pól z zaprzyjaźnionymi klasami – zaprzyjaźnione klasy mają jedynie dostęp do prywatnych składowych, ale to nie jest mechanizm dziedziczenia. Stwierdzenie o braku konstruktorów i destruktorów jest błędne – każda klasa, w tym dziedziczona, może mieć konstruktory i destruktory, które umożliwiają inicjalizację oraz zwalnianie zasobów. Dziedziczenie nie pozwala również na wielokrotne dziedziczenie prywatnych pól, ponieważ prywatne składowe klasy bazowej są niedostępne dla klas pochodnych.

Pytanie 4

Jakie stwierdzenie najlepiej tłumaczy cel podziału programu na funkcje (metody)?

A. Gwarantuje automatyczną kompilację programu
B. Umożliwia skrócenie kodu przez eliminację wszelkich komentarzy
C. Ułatwia proces debugowania oraz ponowne wykorzystanie fragmentów kodu
D. Eliminuje potrzebę korzystania ze zmiennych globalnych
Dzielenie programu na funkcje (lub metody) jest jedną z kluczowych zasad programowania strukturalnego i obiektowego. Funkcje pozwalają na podzielenie dużych bloków kodu na mniejsze, łatwiejsze do zarządzania i ponownego wykorzystania fragmenty. Dzięki temu kod jest bardziej czytelny, zrozumiały i łatwiejszy do testowania. Ułatwia to także proces debugowania, ponieważ błędy można izolować w konkretnych funkcjach, zamiast przeszukiwać cały program. Ponadto funkcje umożliwiają wielokrotne używanie tego samego fragmentu kodu, co zwiększa efektywność i eliminuje konieczność powielania kodu, zmniejszając ryzyko błędów.

Pytanie 5

Co to jest Service Worker w kontekście Progressive Web Apps?

A. Usługa hostingowa dla aplikacji webowych
B. Protokół komunikacji między przeglądarką a serwerem
C. Skrypt działający w tle przeglądarki, niezależnie od strony webowej
D. Narzędzie do testowania wydajności aplikacji
Pojęcia związane z usługami hostingowymi, narzędziami do testowania wydajności oraz protokołami komunikacyjnymi są istotne w kontekście aplikacji webowych, ale nie mają bezpośredniego związku z tym, czym jest Service Worker. Usługa hostingowa dla aplikacji webowych zajmuje się udostępnianiem treści w Internecie, co jest zupełnie innym zagadnieniem. Aplikacje webowe mogą być hostowane na serwerach, ale to nie ma wpływu na sposób, w jaki działają one w przeglądarkach. Narzędzia do testowania wydajności są pomocne, ale nie są częścią samego procesu tworzenia aplikacji z użyciem Service Workera. Protokół komunikacji między przeglądarką a serwerem dotyczy wymiany danych, ale nie odnosi się do koncepcji działania skryptu w tle. Typowe błędy myślowe prowadzące do takich niepoprawnych wniosków to mylenie różnych aspektów technologii webowych i niezdolność do zrozumienia, jak elementy te współpracują w ekosystemie aplikacji. Aby lepiej zrozumieć Service Worker, warto przyjrzeć się jego roli w kontekście działania offline i poprawy doświadczeń użytkownika, co jest kluczowe dla nowoczesnych aplikacji webowych.

Pytanie 6

W przypadku przedstawionego fragmentu kodu Java, wyjątek zostanie zgłoszony, gdy wartość zmiennej index wyniesie:

try {
    int[] liczby = {1, 2, 3, 4, 5, 6};
    System.out.println(liczby[index]);
}
catch (Exception e) {
    System.out.println("wystąpił błąd.");
}
A. 0
B. 5
C. 7
D. 1
W podanym kodzie Java mamy do czynienia z tablicą o nazwie liczby zawierającą sześć elementów: {1 2 3 4 5 6}. Indeksy tablicy w Javie zaczynają się od 0 a kończą na n-1 gdzie n to długość tablicy. W tym przypadku tablica ma długość 6 a więc jej indeksy to 0 1 2 3 4 i 5. Kiedy próbujemy uzyskać dostęp do elementu tablicy za pomocą indeksu równego długości tablicy lub większego np. 6 w tym przypadku otrzymujemy wyjątek ArrayIndexOutOfBoundsException. Jest to standardowe zachowanie w języku Java mające na celu ochronę przed błędami związanymi z nieprawidłowym dostępem do pamięci. Tego rodzaju błędy mogą prowadzić do nieprzewidywalnych zachowań programów dlatego obsługa takich wyjątków jest dobrą praktyką programistyczną. Kod zawiera blok try-catch który przechwytuje wszelkie wyjątki w tym przypadku i drukuje komunikat aby poinformować użytkownika o błędzie. Takie podejście jest zgodne z zasadami bezpiecznego programowania oraz ułatwia debugging i zarządzanie błędami w aplikacjach produkcyjnych.

Pytanie 7

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

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

Pytanie 8

Czym jest ochrona własności intelektualnej?

A. Zbiór informacji osobowych
B. Zestaw przepisów dotyczących ochrony prywatności
C. Koncepcja prawa zabezpieczającego twórczość i innowacje
D. Rejestr plików przechowywanych w chmurze
Własność intelektualna to zbiór praw chroniących twórczość i wynalazki, obejmujący patenty, prawa autorskie, znaki towarowe i wzory przemysłowe. Własność intelektualna pozwala twórcom na zarabianie na swoich dziełach oraz kontrolowanie, kto i w jaki sposób może z nich korzystać. W wielu krajach naruszenie praw własności intelektualnej wiąże się z poważnymi konsekwencjami prawnymi. Dla przedsiębiorstw i innowatorów ochrona własności intelektualnej jest kluczowa dla zabezpieczenia ich inwestycji oraz rozwijania nowych technologii.

Pytanie 9

Do czego służy operator spread (...) w JavaScript?

A. Do sprawdzania typu danych
B. Do konwersji liczby na string
C. Do rozwinięcia tablicy lub obiektu na poszczególne elementy
D. Do łączenia dwóch różnych typów danych
Operator spread (...) w JavaScript jest niezwykle użytecznym narzędziem, które pozwala na łatwe rozwijanie tablic i obiektów do ich poszczególnych elementów lub właściwości. Umożliwia to na przykład przekazywanie elementów tablicy jako argumentów do funkcji lub łączenie wielu obiektów w jeden. Przykładowo, jeśli mamy tablicę `const arr = [1, 2, 3];` to używając operatora spread, możemy przekazać te elementy do funkcji tak: `Math.max(...arr)`, co zwróci 3. Dodatkowo, operator ten jest często używany przy tworzeniu nowych obiektów na podstawie istniejących. Na przykład, mając obiekt `const obj = { a: 1, b: 2 };`, możemy stworzyć nowy obiekt z dodatkową właściwością: `const newObj = { ...obj, c: 3 };` co da `newObj = { a: 1, b: 2, c: 3 };`. Operator spread jest zgodny z ES6 i stał się standardem w praktykach programistycznych, ułatwiając pisanie czystszych i bardziej elastycznych kodów. Warto go stosować, aby poprawić czytelność i efektywność swojego kodu.

Pytanie 10

Wskaż rodzaj testów, które przeprowadza się podczas fazy tworzenia kodu źródłowego

A. testy wydajnościowe
B. testy wdrożeniowe
C. testy kompatybilności
D. testy jednostkowe
Testy jednostkowe to, moim zdaniem, absolutny fundament solidnego programowania. Są to niewielkie, automatyczne testy, które programista pisze zwykle równolegle z kodem albo nawet przed nim, jeśli stosuje się TDD (Test-Driven Development). Chodzi o to, żeby każda najmniejsza część programu – funkcja, metoda czy klasa – była dokładnie sprawdzona, czy zachowuje się zgodnie z założeniami już na etapie pisania kodu. W praktyce wygląda to tak: piszesz sobie funkcję, która np. liczy VAT, i od razu piszesz kilka testów, które sprawdzają, czy dla różnych wartości zwraca ona poprawne wyniki. Gdy coś się zmieni w kodzie, testy jednostkowe pozwalają od razu wychwycić, że coś zepsułeś (albo, oby nie, ktoś inny). Standardy branżowe, jak np. ISTQB czy wytyczne IEEE 829, bardzo mocno podkreślają wagę testów jednostkowych – bez nich zarządzanie jakością oprogramowania jest po prostu niemożliwe na dłuższą metę. W praktyce nawet proste projekty szybko bez nich zamieniają się w chaos. Co ciekawe, dobrze napisane testy jednostkowe ułatwiają refaktoryzację, bo masz pewność, że po zmianach wszystko działa jak należy. W mojej opinii, jeśli ktoś naprawdę poważnie myśli o pracy w branży IT, powinien umieć pisać testy jednostkowe z marszu.

Pytanie 11

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

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

Pytanie 12

Jakie są różnice między dialogiem modalnym a niemodalnym?

A. Dialog modalny jest ograniczony wyłącznie do aplikacji konsolowych
B. Dialog modalny wymaga zamknięcia, aby powrócić do głównego okna aplikacji, natomiast dialog niemodalny tego nie wymaga
C. Dialog modalny działa w tle, podczas gdy dialog niemodalny jest zawsze wyświetlany na pierwszym planie
D. Dialog modalny umożliwia interakcję z innymi oknami aplikacji, a dialog niemodalny tego nie pozwala
Dialog modalny to okno dialogowe, które wymaga interakcji użytkownika przed powrotem do głównego okna aplikacji. Tego rodzaju okna są często wykorzystywane do wyświetlania komunikatów, potwierdzeń lub formularzy wymagających danych wejściowych. Modalność zapewnia, że użytkownik nie może przejść do innej części aplikacji bez uprzedniego zamknięcia okna dialogowego. To rozwiązanie pomaga w wymuszeniu ważnych akcji, takich jak potwierdzenie usunięcia pliku lub zatwierdzenie płatności. Dialog niemodalny natomiast pozwala na interakcję z resztą aplikacji nawet wtedy, gdy okno dialogowe jest otwarte, co sprawdza się w mniej krytycznych sytuacjach, np. podczas wyświetlania dodatkowych opcji.

Pytanie 13

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. button clicked.
B. toggled.
C. value changed.
D. tapped.
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 14

Jaką nazwę elementu interfejsu należy wprowadzić w pierwszej linii kodu, na miejscu <??? aby został on wyświetlony w podany sposób?

<???
    android:layout_margin="50dp"
    android:switchMinWidth="60dp"
    android:text="Zgadzasz się?"
    android:textOff="NIE"
    android:testOn="TAK" />
Ilustracja do pytania
A. SeekBar
B. Switch
C. RatingBar
D. Spinner
Switch to bardzo charakterystyczny element interfejsu Androida, który służy do przełączania między dwoma stanami, np. włącz/wyłącz, tak/nie. Na screenie wyraźnie widać typowy suwak z okrągłym przyciskiem, który przemieszcza się na boki – dokładnie tak działa Switch. W kodzie XML także pojawiają się atrybuty takie jak text, textOff, textOn – one są właściwe właśnie dla komponentu Switch, bo pozwalają podpisać każdy ze stanów na przełączniku. Praktycznie w każdej nowoczesnej aplikacji spotyka się Switcha do wyrażania zgody, akceptacji regulaminu albo przełączania opcji (np. tryb ciemny). Z mojego doświadczenia to jest dużo wygodniejsze dla użytkownika niż klasyczne checkboxy, bo od razu widać, który stan jest aktywny – a UX-owcy też bardzo to chwalą. Warto pamiętać, że Switch ma swoje domyślne style zgodne z Material Design, więc aplikacja wygląda nowocześnie bez dodatkowej pracy. Dobrą praktyką jest wykorzystywanie Switcha właśnie wtedy, gdy potrzebujemy zmiany binarnej, a nie kilku opcji do wyboru. Jeśli ktoś myśli o bardziej zaawansowanych interfejsach, to Switch pozwala łatwo reagować na zmianę stanu w kodzie Java/Kotlin poprzez listener OnCheckedChangeListener. No i jest to jeden z tych komponentów, które naprawdę warto znać, bo są podstawą w każdym projekcie mobilnym.

Pytanie 15

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

A. Dodawanie nowych instancji do klasy
B. Umożliwienie funkcji dostępu do prywatnych atrybutów klasy
C. Ograniczenie widoczności atrybutów klasy
D. Generowanie kopii pól obiektu w innej klasie
Funkcja zaprzyjaźniona umożliwia dostęp do prywatnych i chronionych składowych klasy, z którą jest zaprzyjaźniona. To mechanizm, który pozwala na utrzymanie hermetyzacji, jednocześnie umożliwiając wybranym funkcjom lub klasom bezpośredni dostęp do wewnętrznych danych innej klasy. Funkcje zaprzyjaźnione często są stosowane do operacji, które wymagają dostępu do wewnętrznych danych klasy, ale nie powinny być jej metodami, np. operacje arytmetyczne lub porównawcze na obiektach tej klasy.

Pytanie 16

Co oznacza skrót SOLID w programowaniu obiektowym?

A. Popularna metodologia testowania aplikacji mobilnych i webowych
B. Zbiór pięciu zasad projektowania oprogramowania ułatwiających tworzenie czytelnego kodu
C. Standard tworzenia dokumentacji technicznej dla aplikacji
D. System organizacji zadań w metodologii zwinnej używany w Scrum
Skrót SOLID odnosi się do pięciu podstawowych zasad projektowania obiektowego, które zostały sformułowane przez Roberta C. Martina. Zasady te, a mianowicie: Single Responsibility Principle (SRP), Open/Closed Principle (OCP), Liskov Substitution Principle (LSP), Interface Segregation Principle (ISP) oraz Dependency Inversion Principle (DIP), mają na celu ułatwienie tworzenia czytelnego, łatwego do modyfikacji i rozszerzenia kodu. Przykładowo, zasada SRP mówi o tym, że każda klasa powinna mieć jedną odpowiedzialność, co pozwala na łatwiejsze wprowadzanie zmian oraz testowanie. Implementacja SOLID sprzyja także lepszej organizacji kodu, co jest kluczowe w dużych projektach, gdzie złożoność i liczba współpracujących komponentów mogą prowadzić do trudności w zarządzaniu. Przykład praktyczny można zobaczyć w aplikacji używającej wzorców projektowych, gdzie zasady SOLID pomagają w tworzeniu elastycznych i dobrze zorganizowanych systemów. W branży programistycznej, przestrzeganie tych zasad jest uznawane za dobrą praktykę, co przyczynia się do zwiększenia jakości oprogramowania oraz satysfakcji zespołów developerskich.

Pytanie 17

Które z wymienionych środowisk programistycznych jest rekomendowane do developing aplikacji w języku Python z użyciem frameworka Django?

A. XCode
B. PyCharm
C. Android Studio
D. Unity
PyCharm to jedno z najbardziej zaawansowanych środowisk programistycznych (IDE) dedykowanych do tworzenia aplikacji w języku Python. Jest to narzędzie preferowane przez programistów korzystających z frameworka Django, który jest popularnym rozwiązaniem do budowy aplikacji webowych. PyCharm oferuje rozbudowane wsparcie dla Django, umożliwiając szybkie tworzenie projektów, integrację z bazami danych oraz wygodne debugowanie aplikacji. IDE zapewnia również możliwość uruchamiania serwerów deweloperskich, podglądu zmian w czasie rzeczywistym oraz automatyczne uzupełnianie kodu, co znacząco zwiększa efektywność pracy nad aplikacjami webowymi. Dzięki PyCharm programiści mogą łatwo zarządzać migracjami bazy danych, tworzyć modele i szablony, co sprawia, że jest to narzędzie nieocenione w ekosystemie Django.

Pytanie 18

Po wykonaniu poniższego kodu na konsoli zostanie wyświetlona liczba:

int a = 0x73;
cout << a;
A. 108
B. 115
C. 0
D. 73
Wartość 0x73 w kodzie oznacza liczbę zapisaną w systemie szesnastkowym (heksadecymalnym). To bardzo często wykorzystywana notacja w programowaniu, szczególnie gdy pracuje się z pamięcią, kodowaniem kolorów lub niskopoziomową obsługą sprzętu. 0x73 to po prostu 7 * 16 + 3, co daje 115 w systemie dziesiętnym. Gdy taki zapis przekażesz do cout, kompilator automatycznie prezentuje tę wartość jako liczbę w systemie dziesiętnym, czyli właśnie 115. Szczerze mówiąc, moim zdaniem warto jak najczęściej ćwiczyć odczytywanie i zamianę wartości pomiędzy systemami liczbowymi, bo to się naprawdę przydaje przy analizie kodu, debugowaniu czy choćby rozumieniu dokumentacji technicznej. Taka umiejętność jest praktycznie niezbędna w embedded, ale i w zwykłym C++ można czasem natknąć się na takie zapisy – szczególnie w kodzie legacy. Osobiście uważam, że dobrze od razu rozpoznawać takie zapisy i nie tracić czasu na kalkulatory. Warto też pamiętać, że podobnie działają inne systemy: np. 0b1101 to binarny, a 0x to zawsze heksadecymalny. W standardzie C++ zapis z prefiksem 0x jest w pełni poprawny i zalecany przy pracy z wartościami bitowymi. Fajnie, jak ktoś łapie takie rzeczy od razu, bo później w pracy nad większymi projektami to ogromne ułatwienie.

Pytanie 19

Jaki jest główny cel normalizacji baz danych?

A. Przyśpieszenie zapytań kosztem zwiększenia redundancji
B. Zmniejszenie rozmiaru bazy danych kosztem integralności
C. Zwiększenie liczby tabel w celu lepszej organizacji danych
D. Eliminacja redundancji danych i zapewnienie integralności danych
Głównym celem normalizacji baz danych jest eliminacja redundancji danych oraz zapewnienie ich integralności. Proces ten polega na przekształceniu danych w taki sposób, aby zminimalizować powielanie informacji, co przekłada się na oszczędność miejsca oraz poprawę wydajności bazy. Normalizacja wyodrębnia dane w sposób, który pozwala na ich logiczne i spójne uporządkowanie, co ułatwia aktualizację oraz usuwanie danych bez ryzyka wprowadzenia niezgodności. Przykładem praktycznego zastosowania normalizacji jest system zarządzania danymi klientów, gdzie informacje o klientach, zamówieniach i produktach są przechowywane w odrębnych tabelach. Dzięki temu można łatwo wprowadzać zmiany w danych klientów, bez wpływu na dane zamówień czy produktów. W branży baz danych, standardy takie jak ACID (Atomicity, Consistency, Isolation, Durability) i zasady dotyczące normalizacji, jak pierwsza, druga czy trzecia forma normalna, stanowią fundamenty dobrych praktyk projektowania baz danych. Zastosowanie tych zasad wpływa na zwiększenie efektywności operacji CRUD (Create, Read, Update, Delete) i zapewnia integralność danych w dłuższym okresie.

Pytanie 20

Co to jest kontener Docker?

A. Graficzny interfejs do zarządzania kodem aplikacji webowych
B. System zarządzania bazami danych NoSQL
C. Lekka, samodzielna jednostka oprogramowania, która zawiera wszystko, co aplikacja potrzebuje do uruchomienia
D. Narzędzie do automatycznego testowania interfejsów użytkownika
Kontener Docker to lekka, samodzielna jednostka oprogramowania, która zawiera wszystko, co aplikacja potrzebuje do uruchomienia: kod, biblioteki, zmienne środowiskowe oraz inne zależności. Dzięki wykorzystaniu technologii wirtualizacji na poziomie systemu operacyjnego, kontenery są bardziej efektywne i oszczędne w użyciu zasobów w porównaniu do tradycyjnych maszyn wirtualnych. Przykładem zastosowania kontenerów Docker jest rozwój aplikacji webowych, gdzie różne mikroserwisy mogą być uruchamiane w osobnych kontenerach, co pozwala na łatwe skalowanie oraz zarządzanie nimi. W praktyce, kontenery umożliwiają programistom szybkie uruchamianie środowisk testowych i produkcyjnych, a także ułatwiają ciągłą integrację i ciągłe wdrażanie (CI/CD), co jest zgodne z najlepszymi praktykami DevOps. W kontekście zarządzania infrastrukturą, kontenery zapewniają spójność środowiska, eliminując problemy związane z "działa na moim komputerze".

Pytanie 21

Jak przedstawia się liczba dziesiętna 255 w systemie szesnastkowym?

A. FE
B. EF
C. 100
D. FF
Liczba dziesiętna 255 jest reprezentowana w systemie szesnastkowym jako FF. Aby zrozumieć, dlaczego tak jest, należy przyjrzeć się procesowi konwersji z systemu dziesiętnego na szesnastkowy. System dziesiętny oparty jest na podstawie 10, co oznacza, że używa dziesięciu cyfr od 0 do 9. W systemie szesnastkowym, który ma podstawę 16, używane są cyfry od 0 do 9 oraz litery od A do F, gdzie A odpowiada 10, B - 11, C - 12, D - 13, E - 14, a F - 15. Aby przeliczyć 255 na system szesnastkowy, dzielimy tę liczbę przez 16. Pierwsza operacja daje nam 15 jako wynik całkowity oraz 15 jako resztę, co w systemie szesnastkowym jest reprezentowane literą F. Dalsze dzielenie 15 przez 16 daje wynik 0 oraz resztę 15, co również jest reprezentowane jako F. Zatem, zapisując reszty w odwrotnej kolejności, otrzymujemy FF. Taki zapis jest używany w różnych standardach, takich jak HTML i CSS, gdzie kolory są przedstawiane w formacie szesnastkowym. Przykładem może być kolor czerwony, którego zapis to #FF0000, co oznacza maksymalną wartość czerwonego składnika i zera dla niebieskiego oraz zielonego. Warto znać te konwersje, zwłaszcza w programowaniu i projektowaniu stron internetowych, gdzie często pracuje się z wartościami szesnastkowymi.

Pytanie 22

Które z wymienionych pól klasy można zainicjalizować przed stworzeniem obiektu?

A. Publiczne pole
B. Static pole
C. Prywatne pole
D. Chronione pole
Pole statyczne można zainicjować przed utworzeniem obiektu klasy, ponieważ należy ono do samej klasy, a nie do jej instancji. Statyczne pola są inicjalizowane tylko raz, w momencie pierwszego użycia klasy lub jej statycznych metod. Dzięki temu można przechowywać dane wspólne dla wszystkich obiektów danej klasy, co jest kluczowe w optymalizacji pamięci i kodu. Przykładem może być licznik instancji klasy, który zwiększa swoją wartość za każdym razem, gdy tworzony jest nowy obiekt.

Pytanie 23

Jakie znaczenie ma polimorfizm w programowaniu obiektowym?

A. Umożliwia jednej metodzie działać w różnorodny sposób w zależności od klasy, do której należy
B. Ogranicza dostęp do atrybutów klasy
C. Dzieli program na klasy oraz obiekty
D. Pozwala na tworzenie obiektów z wielu różnych klas równocześnie
Polimorfizm to zdolność obiektów do używania tej samej metody lub interfejsu, ale z różnymi implementacjami, w zależności od klasy obiektu. Dzięki polimorfizmowi można wywołać metodę `obiekt.wyswietl()`, która zachowuje się inaczej w klasie `Samochod` i inaczej w klasie `Motocykl`, mimo że nazwa metody pozostaje taka sama. Polimorfizm ułatwia rozbudowę aplikacji, ponieważ nowe klasy mogą być dodawane bez modyfikacji istniejącego kodu, co zwiększa elastyczność i rozszerzalność programu. Jest to jedna z najważniejszych zasad programowania obiektowego, obok dziedziczenia i hermetyzacji.

Pytanie 24

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

A. obsługa wciśniętego przycisku
B. kod XML
C. kod Java
D. obsługa przycisku ekranu dotykowego
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 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. 0, 1, 2, 3, 4
B. 1, 2, 3, 4, 5
C. 0, 1, 2, 4, 5
D. 1, 2, 4, 5
W przypadku pozostałych odpowiedzi można zauważyć, że wynikają z nieporozumień dotyczących działania pętli oraz instrukcji sterującej continue. W odpowiedzi sugerującej, że w konsoli zostaną wypisane liczby 0, 1, 2, 4, 5, występuje założenie, że wartość początkowa zmiennej i (czyli 0) również zostanie wypisana, co jest nieprawdziwe. Zmienna i jest zwiększana przed jej wypisaniem, więc jej początkowa wartość nie zostaje uwzględniona. W kolejnej opcji, gdzie podano 1, 2, 3, 4, 5, zauważyć można, że liczba 3 została wypisana, co jest sprzeczne z logiką zastosowaną w kodzie, ponieważ w momencie, gdy i równa się 3, instrukcja continue przerywa bieżącą iterację pętli, pomijając kod wypisujący. Również myśląc o odpowiedzi, która sugeruje, że w konsoli pojawią się liczby 1, 2, 3, 4, 5, można zauważyć, że pominięcie wartości 3 jest kluczowym momentem, który prowadzi do błędnego wniosku. Widać tutaj typowe błędy myślowe, polegające na nieprzemyślanej interpretacji pętli oraz działania instrukcji warunkowych. Aby poprawnie zrozumieć, jak działają pętle i instrukcje w JavaScript, warto poświęcić czas na eksperymentowanie z kodem oraz jego analizowanie, aby dostrzec, jakie konsekwencje mają poszczególne komendy i jakie wartości zmiennych są faktycznie wypisywane.

Pytanie 26

Która z poniższych metod HTTP służy do aktualizacji zasobu?

A. POST
B. DELETE
C. PUT
D. GET
Metoda HTTP PUT jest używana do aktualizacji zasobów na serwerze. Zgodnie z zasadami protokołu HTTP, PUT wysyła zaktualizowane dane do określonego zasobu, co pozwala na jego modyfikację lub utworzenie nowego, jeśli zasób nie istnieje. Przykładem zastosowania PUT może być aktualizacja informacji o użytkowniku w systemie, gdzie wysyłane są dane użytkownika w formacie JSON do odpowiedniego endpointu API, przykładowo: PUT /api/users/123 z danymi {"name": "Jan", "email": "[email protected]"}. W praktyce, korzystanie z metody PUT jest zgodne z zasadami RESTful API, które zaleca używanie tej metody do operacji aktualizacji. PUT jest idempotentne, co oznacza, że niezależnie od liczby razy, jakie zostanie wykonane, wynik operacji pozostaje taki sam. To różni się od POST, które służy do tworzenia nowych zasobów. Zrozumienie zastosowania metod HTTP jest kluczowe w projektowaniu i implementacji efektywnych interfejsów API.

Pytanie 27

Które z wymienionych zastosowań najlepiej definiuje bibliotekę jQuery?

A. Tworzenie interfejsów w programach desktopowych
B. Budowanie aplikacji mobilnych
C. Ułatwienie manipulacji DOM oraz obsługi zdarzeń w JavaScript
D. Projektowanie struktur baz danych
jQuery to popularna biblioteka JavaScript, która ułatwia manipulację DOM (Document Object Model), obsługę zdarzeń oraz wykonywanie animacji na stronach internetowych. Dzięki jQuery programiści mogą znacznie skrócić ilość kodu potrzebnego do realizacji operacji na elementach HTML. Biblioteka ta zapewnia również wygodny sposób na wykonywanie asynchronicznych żądań HTTP (AJAX), co pozwala na dynamiczne pobieranie danych z serwera bez konieczności przeładowywania całej strony. jQuery jest szeroko stosowane w projektach, które wymagają interaktywności oraz lekkich efektów wizualnych. Choć w ostatnich latach jego popularność spadła na rzecz bardziej zaawansowanych frameworków takich jak React czy Angular, jQuery nadal jest cenione za prostotę, wydajność oraz bogaty ekosystem gotowych wtyczek i rozszerzeń.

Pytanie 28

Jakie z wymienionych narzędzi pozwala na jednoczesne korzystanie z systemów BIN, DEC i HEX?

A. GIMP
B. Microsoft Word
C. Przeglądarka grafów
D. Kalkulator systemowy
Kalkulator systemowy to narzędzie, które umożliwia użytkownikom pracę z różnymi systemami liczbowymi, takimi jak system dziesiętny (DEC), binarny (BIN) oraz szesnastkowy (HEX). Jego funkcjonalność pozwala na konwersję wartości liczbowych pomiędzy tymi systemami, co jest niezwykle przydatne w kontekście programowania, inżynierii komputerowej oraz nauk przyrodniczych. Dzięki kalkulatorowi systemowemu, użytkownicy mogą wprowadzać liczby w jednym systemie, a następnie uzyskiwać ich odpowiedniki w pozostałych systemach, co znacznie ułatwia analizę danych. Na przykład, wpisując liczbę w systemie binarnym, można natychmiast zobaczyć jej reprezentację w systemie dziesiętnym i szesnastkowym, co jest kluczowe w zadaniach związanych z konwersją kodów czy obliczeniami w architekturze komputerowej. Ponadto, kalkulatory systemowe często zawierają funkcje umożliwiające przeprowadzanie bardziej skomplikowanych operacji, takich jak dodawanie czy odejmowanie w różnych systemach liczbowych, co czyni je nieocenionym narzędziem w programowaniu i obliczeniach naukowych. Narzędzia te są zgodne z powszechnie przyjętymi standardami, takimi jak IEEE 754 dla reprezentacji liczb zmiennoprzecinkowych, co zapewnia ich wysoką dokładność i niezawodność w obliczeniach.

Pytanie 29

Programista aplikacji mobilnych chce przekwalifikować się na pracownika Full-Stack Developer. Wskaż kurs, który powinien wybrać, aby było to możliwe

A. Raster and Vector Graphics with Adobe
B. Ultimate C# Serier from Beginner to Advanced
C. Complete JavaScript React, SQL, Node.js Cource
D. Mastering Cross-platform Developping
Wybór kursu "Complete JavaScript React, SQL, Node.js Course" to zdecydowanie najbardziej logiczna opcja, jeśli ktoś myśli poważnie o przejściu na ścieżkę Full-Stack Developera. Full-stack to bardzo specyficzne pojęcie – chodzi tu o umiejętność poruszania się zarówno po stronie front-endu (czyli tego, co widzi użytkownik), jak i back-endu (czyli serwera, bazy danych, logiki biznesowej). Ten kurs obejmuje JavaScript, który jest teraz królem w świecie web developmentu – daje ogromne możliwości i na froncie (np. React), i na backendzie (Node.js). Do tego dochodzi SQL, czyli język zapytań do baz danych, bez którego ciężko sobie wyobrazić jakąkolwiek aplikację z prawdziwego zdarzenia. Przerobienie takiego kursu zapewnia znajomość pełnego cyklu tworzenia aplikacji webowych: od interfejsu użytkownika, przez komunikację z API, aż po operacje na bazach danych. W praktyce, firmy szukające full-stacków oczekują właśnie takiego wachlarza umiejętności, bo to pozwala tworzyć całe systemy praktycznie w pojedynkę lub w małych zespołach. Z mojego doświadczenia, nawet podstawowa znajomość Reacta i Node.js otwiera drzwi do wielu ofert pracy i własnych projektów, bo można szybko stworzyć MVP i sprawnie wdrażać nowe funkcjonalności. Warto też dodać, że technologie te mają świetną dokumentację i aktywne społeczności, gdzie można znaleźć wsparcie i praktyczne porady. Według mnie, to najlepszy kierunek na rynku dla kogoś, kto zna już programowanie mobilne i chce się rozwinąć na pełen stos webowy, bo można wykorzystać wiele dotychczasowych umiejętności, a jednocześnie nauczyć się rzeczy praktycznie wykorzystywanych na co dzień w nowoczesnych firmach IT.

Pytanie 30

Jakie z wymienionych narzędzi jest szeroko stosowane do debugowania aplikacji internetowych?

A. Git
B. Chrome DevTools
C. Blender
D. Postman
Chrome DevTools to potężne narzędzie wbudowane w przeglądarkę Google Chrome, które umożliwia debugowanie aplikacji webowych. Umożliwia ono analizowanie struktury DOM, monitorowanie sieci, profilowanie wydajności oraz inspekcję kodu JavaScript. Chrome DevTools pozwala na śledzenie błędów w czasie rzeczywistym, edytowanie stylów CSS oraz modyfikowanie HTML bezpośrednio w przeglądarce, co znacznie przyspiesza proces rozwoju i testowania aplikacji webowych.

Pytanie 31

Jaki będzie wynik działania poniższego kodu w języku JavaScript?

function foo() {
  console.log(a);
  var a = 1;
  console.log(a);
}
foo();
A. undefined, 1
B. ReferenceError, 1
C. undefined, undefined
D. 1, 1
Wynik działania podanego kodu to 'undefined, 1', co jest zgodne z zasadami hoisting w JavaScript. Kiedy funkcja 'foo' jest wywoływana, zmienna 'a' jest zadeklarowana przy użyciu 'var'. Zgodnie z zasadą hoisting, deklaracja zmiennej jest przenoszona na początek funkcji, ale przypisanie wartości następuje w miejscu, gdzie znajduje się kod. Dlatego, podczas pierwszego wywołania 'console.log(a)', 'a' nie ma jeszcze przypisanej wartości, co skutkuje wyświetleniem 'undefined'. Następnie, po przypisaniu '1' do 'a', w drugim 'console.log(a)' zmienna ta już ma wartość, więc wyświetlane jest '1'. Zrozumienie hoisting jest kluczowe dla programistów, ponieważ może wpływać na logikę działania kodu i prowadzić do błędów, jeśli nie jest odpowiednio uwzględnione. W praktyce powinno się unikać korzystania z hoisting, preferując inicjalizację zmiennych na początku funkcji, co zwiększa czytelność i utrzymanie kodu.

Pytanie 32

Który z poniższych formatów jest najczęściej używany do wymiany danych w aplikacjach webowych?

A. XML
B. JSON
C. YAML
D. CSV
JSON (JavaScript Object Notation) jest najczęściej używanym formatem wymiany danych w aplikacjach webowych ze względu na swoją prostotę, czytelność oraz łatwość w integracji z JavaScript. JSON jest lekki i pozwala na szybkie przetwarzanie danych, co czyni go idealnym wyborem w kontekście nowoczesnych aplikacji webowych, które często korzystają z technologii AJAX do komunikacji z serwerem. Przykładem zastosowania JSON może być przesyłanie danych z serwera do przeglądarki w aplikacjach SPA (Single Page Applications), gdzie asynchroniczne żądania wymagają formatu, który można łatwo zdeserializować na obiekt JavaScript. JSON wspiera zagnieżdżone struktury danych i kolekcje, co pozwala na modelowanie złożonych relacji między danymi. Ponadto, jego popularność doprowadziła do rozwoju wielu bibliotek i narzędzi, które ułatwiają pracę z tym formatem, takich jak `JSON.parse()` i `JSON.stringify()` w JavaScript. W związku z tym, JSON stał się de facto standardem dla wymiany danych w ekosystemie webowym, co potwierdzają również standardy takie jak REST, które często wykorzystują właśnie ten format do komunikacji z API.

Pytanie 33

Które z poniższych nie jest narzędziem do zarządzania stanem w aplikacjach React?

A. Webpack
B. Context API
C. MobX
D. Redux
Webpack to narzędzie do budowania, które służy do zarządzania zasobami w projekcie, a nie do zarządzania stanem aplikacji. Jego głównym celem jest przekształcanie i optymalizacja plików, takich jak JavaScript, CSS czy obrazy, przed ich wdrożeniem na produkcję. Dzięki Webpackowi można tworzyć modułowe aplikacje, które pozwalają na łatwe zarządzanie zależnościami. Przykładem użycia Webpacka może być skonfigurowanie go do kompresji plików JavaScript oraz CSS w celu zwiększenia wydajności aplikacji. W praktyce, Webpack jest szeroko stosowany w projektach React, aby efektywnie łączyć i optymalizować kod z różnych źródeł, co przekłada się na szybsze ładowanie się aplikacji. Standardy dotyczące zarządzania projektami przewidują, że narzędzia do budowania, takie jak Webpack, powinny być odpowiednio skonfigurowane w celu zapewnienia najlepszych praktyk dotyczących wydajności i organizacji kodu.

Pytanie 34

Jakie jest przeznaczenie polecenia "git merge"?

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

Pytanie 35

Który język programowania jest używany do stylizacji stron internetowych?

A. JavaScript
B. CSS
C. PHP
D. HTML
HTML, czyli HyperText Markup Language, to język znaczników, który służy do strukturyzacji treści na stronach internetowych. Chociaż HTML jest fundamentalny w tworzeniu stron, nie jest on językiem do stylizacji, lecz do definiowania elementów, takich jak nagłówki, akapity i linki. Odpowiedzi wskazujące na HTML mogą wynikać z nieporozumienia dotyczącego jego roli w procesie tworzenia stron. JavaScript to język skryptowy, który pozwala na interakcję z użytkownikami i manipulację elementami strony w czasie rzeczywistym, jednak również nie pełni funkcji stylistycznych. Umożliwia natomiast dynamiczne zmiany w treści oraz wyglądzie elementów na stronie, co może wprowadzać pewne zamieszanie, zwłaszcza w kontekście stylizacji. PHP to język skryptowy po stronie serwera, który jest używany do generowania treści dynamicznych, takich jak formularze czy systemy zarządzania treścią. PHP nie ma bezpośredniego zastosowania w stylizacji stron, ale może generować dokumenty HTML, które następnie są stylizowane przy użyciu CSS. Zrozumienie różnicy między tymi językami jest kluczowe dla efektywnego tworzenia stron internetowych oraz stosowania dobrych praktyk w web designie. Typowym błędem jest mylenie roli każdego z języków, co prowadzi do nieefektywnego tworzenia stron i trudności w ich utrzymaniu oraz rozwijaniu.

Pytanie 36

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

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

Pytanie 37

Jakie są cechy testów interfejsu?

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

Pytanie 38

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

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

Pytanie 39

Co to jest klasa abstrakcyjna?

A. Klasa, która nie może posiadać żadnych metod
B. Klasa, która może zawierać zarówno metody zdefiniowane, jak i niezdefiniowane (czysto wirtualne)
C. Klasa, która zawsze dziedziczy z klasy bazowej
D. Klasa, która może być dziedziczona, ale nie można jej instancjonować
Odpowiedź „Klasa, która może być dziedziczona, ale nie można jej instancjonować” jest poprawna, ponieważ najtrafniej oddaje istotę klasy abstrakcyjnej w programowaniu obiektowym. Klasa abstrakcyjna służy jako wzorzec lub szablon dla klas pochodnych, określając wspólne cechy i zachowania, które powinny zostać zaimplementowane w klasach dziedziczących. Nie tworzy się z niej bezpośrednio obiektów, ponieważ sama w sobie nie reprezentuje kompletnego bytu, lecz raczej koncepcję lub ogólny typ. Dzięki temu mechanizmowi programista może narzucić strukturę kodu, zwiększyć jego czytelność oraz ułatwić dalsze rozszerzanie aplikacji. Takie podejście sprzyja stosowaniu zasad programowania obiektowego, takich jak dziedziczenie i polimorfizm, a także pomaga w tworzeniu bardziej uporządkowanych i łatwiejszych w utrzymaniu projektów.

Pytanie 40

Które z wymienionych stwierdzeń najcelniej opisuje proces uruchamiania aplikacji?

A. Przetwarzanie kodu źródłowego przez kompilator
B. Generowanie pliku źródłowego
C. Tłumaczenie kodu źródłowego na język pośredni
D. Wykonywanie programu na podstawie przetłumaczonego kodu maszynowego
Uruchomienie programu to naprawdę ważny moment, bo w tym czasie procesor zaczyna działać na kodzie maszynowym. Ten kod powstaje podczas kompilacji, która zamienia kod źródłowy na coś, co komputer rozumie. W tym etapie program trafia do pamięci, a także przygotowywane są różne dane do działania. Tak więc, to jest kluczowy krok w całej historii programu, bo decyduje, jak dobrze będzie działać.