Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 28 lipca 2026 11:08
  • Data zakończenia: 28 lipca 2026 11:24

Egzamin zdany!

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

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

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

Pytanie 2

Jaką cechą charakteryzuje się sieć asynchroniczna?

A. Dane są przesyłane w sposób nieciągły, bez synchronizacji zegarów
B. Jest bardziej niezawodna od sieci synchronicznej
C. Dane są przesyłane jedynie w określonych przedziałach czasowych
D. Wymaga synchronizacji zegarów
Sieci asynchroniczne to rodzaj systemów komunikacyjnych, w których dane są przesyłane w sposób nieciągły, co oznacza, że nie wymagają one synchronizacji zegarów pomiędzy urządzeniami. W takich sieciach, każda jednostka przesyła dane w dowolnym momencie, co zwiększa elastyczność i efektywność komunikacji. Przykładem zastosowania sieci asynchronicznych są systemy oparte na protokołach, takich jak UART (Universal Asynchronous Receiver-Transmitter), które są powszechnie używane w mikrokomputerach oraz różnych urządzeniach elektronicznych. W kontekście standardów, sieci asynchroniczne są często stosowane w komunikacji szeregowej, gdzie dane są przesyłane bez ustalonych ram czasowych, co pozwala na redukcję opóźnień i zwiększenie przepustowości. W praktyce, taki model komunikacji jest idealny w sytuacjach, gdzie ciągłość przesyłu danych nie jest kluczowa, jak w przypadku transmisji danych z czujników czy urządzeń IoT, gdzie urządzenia mogą nadawać dane, gdy są gotowe, a nie w ustalonych interwałach czasowych.

Pytanie 3

Wskaż uproszczoną wersję kodu XAML dla elementów w pokazanym oknie dialogowym?

Ilustracja do pytania
A. Kod 3
B. Kod 1
C. Kod 4
D. Kod 2
Różnorodność kontrolek XAML często prowadzi do nieporozumień, szczególnie gdy trzeba wybrać właściwe narzędzie do konkretnego zadania. W powyższym oknie dialogowym decyzja, czy użyć ListBox, ComboBox, RadioButton czy CheckBox, opiera się na tym, jak użytkownik powinien wchodzić w interakcję z danym elementem. Częstym błędem jest użycie ComboBoxa zamiast ListBoxa, podczas gdy użytkownik musi mieć wgląd w pełną listę dostępnych opcji i możliwość wyboru tylko jednej – ComboBox ukrywa opcje i wymaga dodatkowego kliknięcia, co w tym przypadku byłoby mniej wygodne. Równie częsty jest wybór RadioButtonów dla pytań o wiele odpowiedzi typu „tak/nie”, jednak RadioButtony służą do wyboru tylko jednej opcji z grupy wzajemnie wykluczających się odpowiedzi, a nie do niezależnych odpowiedzi, które można zaznaczyć równocześnie – tutaj lepiej sprawdzą się CheckBoxy, które umożliwiają wielokrotny wybór. Użycie Label zamiast TextBoxa do wprowadzania imienia zwierzaka mija się z celem, bo Label wyłącznie wyświetla tekst i nie pozwala użytkownikowi na edycję danych. W praktyce spotykam się z tym, że osoby uczące się XAML próbują uprościć kod przez zamianę kontrolek na inne podobne, jednak prowadzi to do złych doświadczeń użytkownika i łamie podstawowe zasady projektowania interfejsów, gdzie czytelność i intuicyjność są kluczowe. Trzeba zawsze brać pod uwagę funkcjonalność danej kontrolki i dopasowywać ją do oczekiwanego zachowania aplikacji, zgodnie z dobrymi praktykami i wytycznymi dla interfejsów użytkownika.

Pytanie 4

Jak oddziaływanie monotonnego środowiska pracy może wpłynąć na organizm człowieka?

A. Poprawa kondycji fizycznej
B. Obniżenie koncentracji oraz zwiększone ryzyko popełniania błędów
C. Zwiększenie odporności na stres
D. Wzrost poziomu motywacji
Kiedy w pracy ciągle powtarzamy te same czynności, to może nas to naprawdę zniechęcać. Zauważyłem, że takie monotonne środowisko potrafi sprawić, że gorzej się skupiamy i łatwiej popełniamy błędy. Jeśli pracownicy cały czas robią to samo bez żadnych zmian, to szybko tracą zapał i nie są zadowoleni z tego, co robią. Moim zdaniem, warto czasem zmieniać zadania, żeby wprowadzić trochę świeżości i wyzwań. Dobrze jest też organizować przerwy, bo to pomaga nabrać energii oraz zadbać o fajną atmosferę w pracy.

Pytanie 5

Modyfikator dostępu znajdujący się przed definicją metody Dodaj() w klasie Kalkulator sprawia, że:

protected void Dodaj() {}
A. nie jest ona dostępna z poziomu klas, które są zaprzyjaźnione z klasą Kalkulator
B. jest ona możliwa do wykorzystania w programie głównym i można ją wywołać na instancji klasy Kalkulator
C. nie jest ona osiągalna w klasach, które dziedziczą po klasie Kalkulator
D. jest ona dostępna zarówno w samej klasie, jak i w klasach dziedziczących po klasie Kalkulator
Często spotykanym problemem przy analizie modyfikatorów dostępu jest mylenie zakresów widoczności protected z innymi, jak public, private czy nawet internal. Przekonanie, że protected sprawia, iż metoda staje się dostępna w programie głównym (np. przez obiekt klasy Kalkulator), wynika zazwyczaj z utożsamiania protected z public. Tymczasem protected ogranicza dostępność tylko do klasy bazowej oraz jej pochodnych, więc próba wywołania Dodaj() na przykład bezpośrednio w programie głównym zakończy się błędem kompilacji – chyba że korzystamy z tej metody właśnie w klasie dziedziczącej. Zdarza się także mylić protected z private — niektórzy sądzą, że protected blokuje dostęp w klasach dziedziczących, ale to nieprawda: w przeciwieństwie do private, protected wręcz otwiera drzwi potomnym do korzystania z tych elementów. Jeszcze rzadziej, ale czasem pojawia się myśl, że protected umożliwia dostęp zaprzyjaźnionym klasom, jak w C++, jednak w C# czy Javie pojęcie „klas zaprzyjaźnionych” nie istnieje, więc taki scenariusz odpada. Moim zdaniem cała ta zawiłość bierze się z różnic między językami i zbyt powierzchownej nauki teorii, gdzie nie przykłada się uwagi do praktycznych przykładów użycia. W branży dobra praktyka to właśnie stosowanie protected wtedy, gdy chcemy umożliwić dziedziczenie i rozbudowę funkcji, ale nie udostępniać ich całemu światu. Warto zapamiętać, że protected to narzędzie do zachowania porządku i kontroli dostępu w hierarchii klas — i nie należy go mylić ani z nadmierną dostępnością, ani z pełnym ukrywaniem implementacji.

Pytanie 6

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. suma liczb parzystych z przedziału od 0 do 100
B. liczby parzyste z przedziału od 0 do 100
C. suma liczb z przedziału od 0 do 100
D. liczby z przedziału od 0 do 100
Wiele osób podczas analizy takich pytań może się zagubić, patrząc tylko pobieżnie na kod. Na przykład, ktoś mógłby pomyśleć, że wynik działania pętli for to po prostu zestaw liczb parzystych z przedziału 0–100, ale to nieprawda – kod nie wyświetla, ani nie zbiera tych liczb do żadnej kolekcji. Zamiast tego każda wartość jest sumowana do jednej zmiennej tmp, co jest dość typowym zabiegiem w programowaniu – chodzi o tzw. akumulację. Kolejna pułapka to założenie, że kod sumuje wszystkie liczby z przedziału 0–100. Gdyby tak było, inkrementacja w pętli powinna wyglądać inaczej (i++ zamiast i+=2) i wtedy rzeczywiście tmp zebrałby całą sekwencję naturalną do 100. Niektórzy mogą jeszcze sądzić, że etykieta label ma przyjąć wartości poszczególnych liczb (czyli np. wyświetlić wszystkie parzyste z zakresu), ale w rzeczywistości przypisujemy jej tylko końcowy wynik sumowania, a nie całą listę. W praktyce takie błędne rozumienie wynika czasem z tego, że nie do końca zwracamy uwagę na składnię pętli oraz na to, co tak naprawdę się dzieje w ciele tej pętli. Z mojego doświadczenia wynika, że kluczem jest tu zrozumienie, jak działa inkrementacja i jak sumujemy wartości – nie każda pętla oznacza przetwarzanie wszystkich możliwych liczb. Kod ten jest dość czytelny, ale łatwo się pomylić, jeśli pobieżnie spojrzymy na zapis for (int i=0; i<=100; i+=2). Warto więc zawsze przeanalizować dokładnie warunki pętli oraz operacje wykonywane na zmiennych w jej wnętrzu. To, co tu robimy, to klasyczna suma liczb spełniających konkretny warunek – i to jest bardzo częsty motyw w zadaniach programistycznych, także na rozmowach kwalifikacyjnych czy sprawdzianach. Praktyka pokazuje, że precyzja w analizie kodu jest dużo ważniejsza niż szybkie czytanie treści.

Pytanie 7

Jakie jest podstawowe zadanie konstruktora w klasie?

A. Nadanie wartości polom obiektu po jego zniszczeniu
B. Usuwanie instancji obiektów
C. Inicjalizacja obiektu w momencie jego tworzenia
D. Wprowadzenie nowej metody do już istniejącej klasy
Konstruktor to specjalna metoda klasy, która jest automatycznie wywoływana podczas tworzenia nowego obiektu. Jego głównym zadaniem jest inicjalizacja pól obiektu oraz przygotowanie go do użytku. Konstruktor ma tę samą nazwę co klasa i nie zwraca żadnej wartości. Przykład w C++: `class Samochod { public: Samochod() { marka = "Nieznana"; } }`. W tym przypadku konstruktor ustawia domyślną wartość dla pola `marka`. Dzięki konstruktorom programista może automatycznie ustawić początkowe wartości, co zwiększa czytelność kodu i eliminuje potrzebę ręcznego przypisywania wartości każdemu nowemu obiektowi.

Pytanie 8

Który z wymienionych poniżej przykładów stanowi system informacji przetwarzany przez system informatyczny?

A. System PESEL
B. System wentylacyjny w biurowcach
C. System zarządzania oświetleniem drogowym
D. System do monitorowania temperatury serwerów
System PESEL (Powszechny Elektroniczny System Ewidencji Ludności) jest przykładem systemu informacji przetwarzanym przez system informatyczny, ponieważ gromadzi, przetwarza i udostępnia dane osobowe obywateli Polski. Jest to złożony system, który działa na bazie zintegrowanych baz danych, umożliwiający identyfikację osób, przydzielanie numerów PESEL oraz zarządzanie informacjami o statusie mieszkańców. System ten jest niezbędny dla organów administracji publicznej, umożliwiając im efektywne zarządzanie danymi obywateli w kontekście takich usług, jak wydawanie dowodów osobistych, rejestracja wyborców, a także w kontekście ochrony zdrowia i ubezpieczeń społecznych. PESEL jest zgodny z Europejskim Ogólnochronnym Rozporządzeniem o Ochronie Danych Osobowych (RODO), co dodatkowo podkreśla jego rolę jako kluczowego systemu informacyjnego w obiegu danych w Polsce. Przykłady zastosowań systemu PESEL obejmują obsługę wniosków o świadczenia socjalne oraz dostęp do e-usług, co świadczy o jego fundamentalnym znaczeniu w administrowaniu danymi ludnościowymi.

Pytanie 9

Co to jest framework?

A. oprogramowanie, które za pomocą metody drag and drop pozwala na stworzenie interfejsu aplikacji
B. platforma programistyczna oferująca określone komponenty oraz narzucająca szkielet lub metodologię tworzenia aplikacji
C. narzędzie przeznaczone do opracowywania, edytowania, testowania i uruchamiania oprogramowania
D. zbiór procedur, danych oraz złożonych typów danych używanych w kodzie źródłowym aplikacji
Framework to coś więcej niż zwykły zestaw bibliotek czy narzędzi. To cała platforma programistyczna, która oferuje gotowe komponenty, ale przede wszystkim narzuca określony sposób tworzenia aplikacji – taki szkielet, według którego trzeba się poruszać. Przykładowo, w świecie frontendu świetnym przypadkiem jest React albo Angular. Programista nie pisze wszystkiego od zera, tylko korzysta z gotowych mechanizmów, jak obsługa routingu, zarządzanie stanem czy komponenty UI. Ale framework wymusza też określony styl pracy – określa, gdzie i w jaki sposób powinny być implementowane poszczególne elementy aplikacji (np. kontrolery, modele, widoki, serwisy). Z mojego doświadczenia to bardzo ułatwia rozwój większych projektów, bo narzuca porządek i pozwala trzymać się dobrych praktyk. Taka architektura jest zgodna ze standardami branżowymi – jak MVC czy architektura warstwowa. Dobrze zaprojektowany framework pozwala skupić się na logice biznesowej zamiast na technikaliach i powtarzalnych zadaniach. W praktyce bardzo przyspiesza wdrożenie zespołu i utrzymanie projektu, bo każdy wie, czego się spodziewać po strukturze kodu. To trochę jak korzystanie z planu budynku zamiast budowania domku bez projektu – mniej chaosu, więcej przewidywalności.

Pytanie 10

Który z wymienionych elementów stanowi przykład złożonego typu danych?

A. bool
B. char
C. struct
D. int
Typ 'struct' w C++ to super sprawa, bo pozwala na trzymanie różnych danych pod jedną nazwą. Dzięki temu można łatwo zorganizować zmienne, które różnią się typami. Wyobraź sobie, że możesz stworzyć strukturę, która będzie reprezentować na przykład samochód z jego marką, rocznikiem i ceną. To naprawdę ułatwia pracę z danymi! Każde pole w strukturze może mieć inny typ, co czyni 'struct' bardzo uniwersalnym narzędziem do modelowania różnych obiektów, jak ludzie czy produkty. W zasadzie, to takie logiczne pudełko, do którego wrzucasz różne informacje i masz do nich szybki dostęp.

Pytanie 11

W jaki sposób można załadować tylko komponent z biblioteki React?

A. import Component from 'react'
B. import { Component } from 'react'
C. import [ Component ] from 'react'
D. import React.Component from 'react'
Użycie składni import { Component } from 'react' to zdecydowanie najczęściej spotykany i najbardziej rekomendowany sposób importowania tylko wybranego komponentu z biblioteki React. To tzw. import nazwany, czyli dokładnie wskazujesz, który kawałek kodu chcesz wyciągnąć z całego modułu. W praktyce, jest to bardzo czytelne i pozwala na jasne zarządzanie zależnościami w pliku. Moim zdaniem ma to ogromne znaczenie w większych projektach, bo łatwo potem znaleźć, które elementy są faktycznie wykorzystywane w danym pliku. Co ważne, taka technika importowania jest w pełni zgodna ze standardami ES6, właściwie każdy nowoczesny projekt front-endowy na tym bazuje. Przykład praktyczny: jeśli chcesz stworzyć klasowy komponent React, wystarczy napisać import { Component } from 'react', a potem class MyClass extends Component {...}. Jest to nieco bardziej eleganckie niż importowanie całego obiektu React (np. import React from 'react'), zwłaszcza jeśli nie potrzebujesz całej funkcjonalności. Dodatkowo, takie rozwiązanie może wpływać pozytywnie na bundlowanie kodu, bo nie ściągasz do projektu niepotrzebnych fragmentów biblioteki. Swoją drogą, coraz częściej widać, że programiści skupiają się na minimalizowaniu importów i czytelności kodu – właśnie przez wybór takich rozwiązań.

Pytanie 12

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

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

Pytanie 13

Jaką strukturę danych obrazuje zamieszczony kod w języku C#?

int[,] array = new int[3, 3];
A. tablicę jednowymiarową
B. listę
C. tablicę dwuwymiarową
D. stos
Kod, który widzisz, tworzy tablicę dwuwymiarową w języku C#. Zapis int[,] array = new int[3, 3]; oznacza, że deklarujesz strukturę, gdzie każdy element jest dostępny przez dwa indeksy – pierwszy wskazuje wiersz, drugi kolumnę. Tablice dwuwymiarowe są bardzo popularne przy przechowywaniu macierzy, plansz w grach (na przykład szachownicy czy sudoku), a nawet obrazów, gdzie każdy piksel opisuje się przez współrzędne. Moim zdaniem, znajomość takich struktur naprawdę ułatwia tworzenie bardziej złożonych algorytmów, bo niekiedy dostępu do danych nie da się zamknąć w jednej linii, tylko trzeba się poruszać w dwóch wymiarach. Jeżeli chodzi o dobre praktyki, to warto pamiętać, że tablica dwuwymiarowa w .NET jest strukturą "prostokątną", czyli każdy wiersz ma tyle samo kolumn – coś jak klasyczna tabela w Excelu. To różni się od tzw. tablic tablic (ang. jagged arrays), które pozwalają mieć nierówną liczbę elementów w wierszach, ale to już trochę inna bajka. W twoim przykładzie stworzyłeś tablicę o rozmiarze 3x3, czyli 9 elementów, do których odwołujesz się za pomocą array[wiersz, kolumna]. Może się to wydawać proste, ale z mojego doświadczenia to właśnie takie zrozumienie podstawowych konstrukcji pozwala pisać czytelny i wydajny kod. W branży często spotyka się sytuacje, gdzie optymalizacja działania na tablicach – zwłaszcza tych dwuwymiarowych – robi różnicę, więc warto to mieć dobrze opanowane.

Pytanie 14

Jakie działanie wykonuje polecenie "git pull"?

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

Pytanie 15

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

<script src="jquery-3.5.1.min.js"></script>
A. wstawić kod JavaScript pomiędzy znacznikami &lt;script&gt;&lt;/script&gt;
B. skorzystać z funkcji biblioteki jQuery, która była wcześniej pobrana i zapisana lokalnie
C. zadeklarować własną funkcję JavaScript o nazwie min.js
D. pobrać z Internetu w momencie otwierania strony i użyć biblioteki jQuery
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 16

Która z wymienionych aplikacji stanowi przykład prostego rozwiązania mobilnego?

A. Aplikacja z rozbudowanym systemem zarządzania projektami
B. Aplikacja typu zegar
C. Aplikacja do analizy danych finansowych
D. Aplikacja do monitorowania użycia pamięci RAM
Aplikacja typu zegar to jeden z najprostszych przykładów aplikacji mobilnej. Jej podstawowa funkcjonalność polega na wyświetlaniu aktualnego czasu oraz alarmów, a dodatkowo może zawierać funkcje takie jak minutnik czy stoper. Tego rodzaju aplikacje charakteryzują się niewielką liczbą funkcji, przejrzystym interfejsem i minimalnym zapotrzebowaniem na zasoby sprzętowe. Dzięki swojej prostocie, aplikacje typu zegar są doskonałym przykładem na to, jak przy użyciu niewielkiej liczby komponentów można stworzyć przydatne narzędzie dla użytkownika.

Pytanie 17

Aplikacje funkcjonujące w systemach Android do komunikacji z użytkownikiem wykorzystują klasę

A. Fragments
B. Screens
C. Activity
D. Windows
W systemie Android klasa Activity to absolutna podstawa komunikacji aplikacji z użytkownikiem. To właśnie ona reprezentuje jeden ekran interfejsu użytkownika, coś w stylu okna dialogowego w klasycznych aplikacjach desktopowych. Cały cykl życia aplikacji, obsługa zdarzeń, wyświetlanie elementów graficznych czy reagowanie na akcje użytkownika – wszystko to ogarnia Activity. Bez niej praktycznie żadna aplikacja nie ruszy, bo to właśnie Activity zarządza np. wywołaniem widoku, obsługą kliknięć czy przekazywaniem danych pomiędzy różnymi ekranami. Moim zdaniem, jeśli ktoś chce programować na Androida, najpierw powinien dobrze przyswoić, jak działa Activity i jej cykl życia (onCreate, onStart itd.), bo to pozwala tworzyć aplikacje zgodne z założeniami platformy. W praktyce deweloperzy bardzo często korzystają z dziedziczenia po klasie Activity, aby rozszerzyć funkcjonalność swoich aplikacji, a także używają jej do uruchamiania nowych ekranów oraz zarządzania nawigacją. Warto jeszcze pamiętać, że dobra znajomość Activity pomaga unikać typowych problemów z zarządzaniem pamięcią czy nieprawidłowym obsługiwaniem powrotów do aplikacji po przerwie. Z mojego doświadczenia, zrozumienie działania Activity to taka baza, bez której trudno iść dalej w temacie Androida.

Pytanie 18

Jaką funkcję spełniają atrybuty klasy w programowaniu obiektowym?

A. Określają globalne stałe programu
B. Zawierają informacje opisujące stan obiektu
C. Zapisują wartości lokalne w funkcjach
D. Umożliwiają przeprowadzanie operacji na obiektach
Pola klasy w programowaniu obiektowym to zmienne, które przechowują dane opisujące stan obiektu. Każdy obiekt posiada swoje własne kopie pól, co oznacza, że różne instancje tej samej klasy mogą przechowywać różne wartości. Przykład w C++: `class Samochod { public: string marka; int przebieg; }`. Pola `marka` i `przebieg` przechowują informacje o konkretnym samochodzie. Pola są kluczowym elementem modelowania rzeczywistych obiektów i umożliwiają przechowywanie oraz modyfikowanie danych w trakcie działania programu. Mogą mieć różne poziomy dostępu (`public`, `private`), co pozwala na lepszą kontrolę nad danymi.

Pytanie 19

W metodach klasy GoldCustomer dostępne są tylko pola

public class Customer {
    public string Name;
    protected int Id;
    private int Age;
}
public class GoldCustomer: Customer {
    private GoldPoints: int;
}
A. GoldPoints
B. GoldPoints, Name, Id
C. GoldPoints, Name
D. GoldPoints, Name, Id, Age
Ta odpowiedź dobrze pokazuje, jak działa dziedziczenie i modyfikatory dostępu w C#. W klasie GoldCustomer masz dostęp do własnych pól, czyli GoldPoints, oraz do pól odziedziczonych po klasie bazowej Customer. Tutaj kluczowe jest rozumienie, które pola są faktycznie dostępne. Skoro Name jest publiczne, to bez żadnych kombinacji można się do niego dobrać z dowolnego miejsca – nawet spoza klasy. Id jest chronione (protected), więc według zasad OOP dostępne jest w klasie bazowej oraz wszystkich pochodnych – czyli właśnie w GoldCustomer. To bardzo praktyczne, bo często się zdarza, że potrzebujemy pracować na polach z klasy bazowej, ale nie chcemy, żeby były one widoczne na zewnątrz klasy (np. przez innych programistów korzystających z API). Age jest prywatne i tu już nie da się go bezpośrednio użyć w klasie pochodnej. Z mojego doświadczenia korzystanie z protected dla rzeczy, które mają być dostępne tylko w hierarchii dziedziczenia, to codzienność – pozwala zachować elastyczność, ale i bezpieczeństwo enkapsulacji. Praktycznie rzecz biorąc, jak piszesz klasy dziedziczące po innych, zawsze warto zerknąć na poziomy dostępu, bo od nich zależy, do czego masz dostęp i co możesz odziedziczyć. Wzorce projektowe, jak np. Template Method, mocno polegają na mechanizmach dziedziczenia i odpowiedniego ustawienia widoczności pól czy metod. Przemyślany dobór public, protected, private ułatwia utrzymanie kodu oraz chroni przed przypadkowym wykorzystaniem nieodpowiednich elementów klasy, co w większych projektach bywa naprawdę kluczowe.

Pytanie 20

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

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

Pytanie 21

Które z poniższych nie jest rodzajem bazy danych?

A. Relacyjna baza danych
B. Routing Database
C. Grafowa baza danych
D. Dokumentowa baza danych
Pojęcia relacyjnej bazy danych, grafowej bazy danych oraz dokumentowej bazy danych mają swoje fundamenty w różnych modelach przechowywania i organizacji danych. Relacyjne bazy danych wykorzystują struktury tabelaryczne do zarządzania danymi, co pozwala na efektywne wykonywanie zapytań i analizy danych. W tym modelu dane są przechowywane w wierszach i kolumnach, a związki między danymi są ustanawiane dzięki kluczom obcym, co sprzyja integralności danych i ich normalizacji. Zastosowanie relacyjnych baz danych jest szerokie, obejmuje systemy finansowe, aplikacje e-commerce oraz wiele innych systemów wymagających ścisłego zarządzania danymi. Grafowe bazy danych, takie jak Neo4j, opierają się na strukturze grafów, co umożliwia modelowanie bardziej skomplikowanych relacji i hierarchii. Ten typ bazy danych znajduje zastosowanie w analizie sieci społecznych, zarządzaniu danymi o połączeniach i rekomendacjach, gdzie tradycyjne podejścia relacyjne mogą być niewystarczające. Dokumentowe bazy danych, jak MongoDB, przechowują dane w formie JSON, co umożliwia elastyczne modelowanie danych oraz skalowalność w aplikacjach, które potrzebują szybko dostosowywać swoje struktury danych do zmieniających się potrzeb. Wybór odpowiedniego typu bazy danych jest kluczowy w zależności od charakterystyki danych i wymagań aplikacji. Typowe błędy myślowe, które prowadzą do pomyłek w identyfikacji typów baz danych, obejmują mylenie terminologii oraz nieznajomość podstawowych zasad działania różnych modeli. Zrozumienie, że niektóre z terminów są stosowane w kontekście różnych dziedzin, takich jak sieci komputerowe i zarządzanie danymi, jest istotne dla podejmowania właściwych decyzji w projektowaniu systemów informacyjnych.

Pytanie 22

Która metoda w obrębie klasy jest uruchamiana automatycznie podczas tworzenia kopii obiektu?

A. Metoda zaprzyjaźniona
B. Destruktor
C. Metoda statyczna
D. Konstruktor kopiujący
Metoda statyczna jest związana z klasą, a nie z jej obiektami, więc nie wywołuje się automatycznie, gdy kopiujemy obiekt. Destruktor to kolejna metoda, która odpowiada za usuwanie obiektu i zwalnianie zasobów, ale jego rola pojawia się dopiero na końcu życia obiektu, a nie podczas samego kopiowania. Co do metody zaprzyjaźnionej, to ona ma dostęp do prywatnych i chronionych elementów klasy, ale też nie jest wywoływana automatycznie w procesie kopiowania. Tylko konstruktor kopiujący robi to właściwie, tworząc kopie obiektów.

Pytanie 23

Co to jest local storage w kontekście aplikacji webowych?

A. Mechanizm pozwalający na przechowywanie danych w przeglądarce użytkownika bez określonego czasu wygaśnięcia
B. Baza danych NoSQL działająca na serwerze aplikacji
C. System plików tymczasowych używany przez przeglądarkę
D. Technologia przechowywania danych w pamięci RAM aplikacji
Local storage to mechanizm dostępny w przeglądarkach internetowych, który pozwala na przechowywanie danych w formacie klucz-wartość. W przeciwieństwie do cookies, które mają czas wygaśnięcia, dane w local storage są przechowywane bezterminowo, co oznacza, że pozostają dostępne nawet po zamknięciu przeglądarki. Dzięki temu deweloperzy mogą tworzyć aplikacje webowe, które pamiętają preferencje użytkowników, stany formularzy czy inne istotne informacje. Typowym zastosowaniem local storage może być zapisywanie ustawień użytkownika w grach przeglądarkowych lub aplikacjach do zarządzania zadaniami. Warto również wspomnieć, że local storage ma limit pojemności wynoszący zazwyczaj około 5 MB na domenę, co czyni go odpowiednim dla przechowywania małych ilości danych. Ponadto, korzystając z local storage, deweloperzy powinni pamiętać o kwestiach bezpieczeństwa, takich jak unikanie przechowywania wrażliwych danych, a także o stosowaniu technik takich jak serializacja danych w formacie JSON, co ułatwia ich późniejsze wykorzystanie.

Pytanie 24

Co to jest PWA (Progressive Web App)?

A. System zarządzania treścią dla stron internetowych
B. Biblioteka graficzna do tworzenia animacji
C. Aplikacja webowa działająca jak natywna aplikacja mobilna
D. Framework do tworzenia aplikacji mobilnych
Jednym z powszechnych nieporozumień jest mylenie Progressive Web App z frameworkami do tworzenia aplikacji mobilnych, takimi jak React Native czy Flutter. Te frameworki pozwalają na tworzenie natywnych aplikacji, które działają na platformach mobilnych i wykorzystują ich natywne API, podczas gdy PWA jest technologią webową, która działa w przeglądarkach internetowych, niezależnie od systemu operacyjnego urządzenia. Ponadto, niektóre osoby mogą myśleć, że PWA to system zarządzania treścią (CMS), co jest błędem. CMS, jak WordPress czy Joomla, skupiają się na tworzeniu i zarządzaniu treścią stron internetowych, natomiast PWA są aplikacjami zaprojektowanymi dla użytkowników, które wykorzystują technologię webową do zapewnienia natywnego doświadczenia. Inne odpowiedzi sugerują, że PWA to biblioteka graficzna, co również jest mylną interpretacją. PWA nie jest narzędziem do tworzenia animacji, ale raczej kompletnym podejściem do budowy aplikacji internetowych, które mogą działać offline i oferować natywne funkcjonalności. Kluczowym błędem myślowym jest brak zrozumienia, że PWA nie polega na technologiach służących do tworzenia aplikacji mobilnych, lecz na wykorzystaniu możliwości nowoczesnych przeglądarek w celu dostarczenia użytkownikom aplikacji działającej płynnie i efektywnie, z poprawioną dostępnością i użytecznością.

Pytanie 25

Celem zastosowania wzorca Obserwator w tworzeniu aplikacji WEB jest:

A. informowanie obiektów o modyfikacji stanu innych obiektów
B. monitorowanie działań użytkownika oraz generowanie wyjątków
C. dostosowanie interfejsu użytkownika do różnych kategorii użytkowników
D. zarządzanie funkcjami synchronicznymi w kodzie aplikacji
Często można się pomylić, próbując „wymyślić” jakąś funkcjonalność, którą może realizować wzorzec Obserwator w aplikacji webowej. Jednak nie każda aktywność związana ze zmianami w systemie czy komunikacją między komponentami to domena właśnie tego wzorca. Z mojego doświadczenia, widzę że wiele osób myli obserwatora z mechanizmami monitorującymi zachowanie użytkownika, jak narzędzia do śledzenia kliknięć czy generowania wyjątków w reakcji na nietypowe akcje – tymczasem Obserwator nie służy do analityki lub obsługi logiki wyjątków. To raczej narzędzie do powiadamiania powiązanych obiektów o zmianach, które zachodzą w jednym z nich. Spotkałem się także z opinią, że wzorzec ten zarządza funkcjami synchronicznymi. W praktyce nie ma on nic wspólnego z zarządzaniem synchronicznością czy asynchronicznością kodu – sam jest neutralny względem tych aspektów. Synchroniczność lub asynchroniczność zależy raczej od implementacji (np. Promises, async/await, event loop), a nie od samego wzorca Obserwator. Jeszcze inny częsty błąd to utożsamianie tego wzorca z mechanizmami dostosowującymi interfejs użytkownika do różnych profili użytkowników. To już bardziej domena wzorców strategii, kompozycji lub nawet prostych warunków w kodzie. W skrócie: Obserwator to taki „kurier”, który informuje zainteresowanych, gdy coś się zmienia – i tylko tyle. Jak dla mnie, zrozumienie tej granicy pomaga uniknąć niepotrzebnych komplikacji w projektowaniu architektury aplikacji webowych.

Pytanie 26

Jakie jest podstawowe założenie normalizacji krajowej?

A. Wzrost kosztów produkcji
B. Ujednolicenie wymagań technicznych i poprawa bezpieczeństwa
C. Zwiększenie ilości regulacji prawnych
D. Utrudnienie handlu międzynarodowego
Ujednolicenie wymagań technicznych i poprawa bezpieczeństwa to główne cele normalizacji krajowej. Normalizacja polega na opracowywaniu standardów, które są stosowane w różnych branżach w celu zapewnienia jakości, bezpieczeństwa i kompatybilności produktów oraz usług. Dzięki normalizacji producenci tworzą wyroby zgodne z określonymi normami, co zwiększa ich konkurencyjność na rynku krajowym i międzynarodowym. Wdrożenie jednolitych standardów wpływa także na bezpieczeństwo użytkowników, minimalizując ryzyko awarii lub niezgodności produktów.

Pytanie 27

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

A. kod XML
B. obsługa wciśniętego przycisku
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 28

Jakie jest zastosowanie iteratora w zbiorach?

A. Do generowania kopii zbiorów
B. Do usuwania elementów ze zbioru
C. Do iterowania po elementach zbioru
D. Do zmiany rodzaju zbioru w trakcie działania aplikacji
Iterator w kolekcjach umożliwia przechodzenie przez elementy kolekcji w określonym porządku. Jest to abstrakcyjny obiekt, który pozwala na iterowanie po różnych strukturach danych, takich jak listy, wektory czy zbiory, bez konieczności znajomości ich wewnętrznej implementacji. Iteratory umożliwiają wykonywanie operacji na elementach kolekcji, takich jak odczyt, modyfikacja lub usuwanie, co czyni je niezwykle użytecznymi w programowaniu obiektowym. Dzięki iteratorom kod staje się bardziej czytelny i mniej podatny na błędy.

Pytanie 29

Jaką kategorię reprezentuje typ danych "array"?

A. Typ danych złożony
B. Typ logiczny
C. Typ danych prosty
D. Typ wskaźników
Tablica ('array') jest przykładem złożonego typu danych, który pozwala na przechowywanie wielu wartości tego samego typu pod wspólną nazwą. Każdy element tablicy jest dostępny za pomocą indeksu, co umożliwia szybkie i efektywne operacje na dużych zbiorach danych. Tablice są szeroko wykorzystywane w programowaniu do przechowywania list, macierzy i innych struktur, gdzie konieczne jest przechowywanie dużych ilości danych tego samego rodzaju. Dzięki tablicom można zorganizować dane w sposób uporządkowany, co ułatwia ich przetwarzanie, sortowanie i wyszukiwanie.

Pytanie 30

Jakie jest główne zadanie ochrony danych osobowych?

A. Zabezpieczenie danych osobowych przed nieautoryzowanym dostępem i ich wykorzystaniem
B. Udostępnianie danych osobowych w celach marketingowych
C. Gwarantowanie anonimowości dla internautów
D. Utrudnianie działalności organom ścigania
Ochrona danych osobowych przed nieuprawnionym dostępem i wykorzystaniem to podstawowy cel ochrony danych osobowych. Zasady ochrony prywatności, takie jak RODO (GDPR), zapewniają użytkownikom prawo do kontroli nad swoimi danymi i decydowania, kto może je przetwarzać. Firmy i organizacje muszą wdrażać środki techniczne oraz organizacyjne, aby zabezpieczyć dane przed wyciekiem, kradzieżą i nadużyciami. Przestrzeganie tych zasad nie tylko chroni jednostki, ale również buduje zaufanie klientów do przedsiębiorstw.

Pytanie 31

W programie stworzonym w języku C++ trzeba zadeklarować zmienną, która będzie przechowywać wartość rzeczywistą. Jakiego typu powinna być ta zmienna?

A. numeric
B. int
C. double
D. number
W języku C++ typ double jest przeznaczony do przechowywania liczb rzeczywistych, czyli takich, które mają część ułamkową. Jest to standardowy wybór w sytuacjach, gdy zależy nam na precyzji przy obliczeniach z użyciem liczb zmiennoprzecinkowych. Takie zmienne bardzo często spotyka się w programowaniu symulacji fizycznych, obliczeniach matematycznych czy przetwarzaniu sygnału – właściwie wszędzie tam, gdzie liczby całkowite po prostu nie wystarczają. Moim zdaniem, wybór double jest najbardziej praktyczny, bo oferuje kompromis między szerokim zakresem wartości a precyzją, czego nie zagwarantuje typ float (który jest mniej precyzyjny). Warto pamiętać, że double to typ określony przez standard języka C++ (IEEE 754), co gwarantuje jego przenośność między różnymi systemami i kompilatorami. Uważam, że dobrze znać też różnicę między double a float – w praktyce double przechowuje liczby z dokładnością do około 15 cyfr znaczących i zakresie od 10^-308 do 10^308. Często programiści korzystają z double domyślnie, żeby mieć spokój z precyzją, nawet jeśli float byłby wystarczający. Z mojego doświadczenia podpowiem, że deklarując double liczysz się z większym zużyciem pamięci niż przy float, ale za to rzadziej napotkasz błędy zaokrągleń. W każdym razie – jeśli chodzi o zmienne rzeczywiste w C++, double to najbezpieczniejszy wybór.

Pytanie 32

Co następuje, gdy błąd nie zostanie uchwycony przez blok catch?

A. Instrukcja throw zostanie automatycznie wykreślona
B. Program zakończy działanie z błędem
C. Program kontynuuje działanie, pomijając błąd
D. Błąd zostanie zignorowany przez kompilator
Jeśli wyjątek nie zostanie przechwycony przez blok 'catch', program zakończy działanie z błędem i wygeneruje komunikat o nieobsłużonym wyjątku. Jest to domyślne zachowanie w C++ i innych językach obsługujących wyjątki, co ma na celu zapobieganie dalszemu wykonywaniu kodu, który mógłby prowadzić do nieprzewidywalnych rezultatów. Obsługa wyjątków jest kluczowym elementem zapewniania stabilności i bezpieczeństwa aplikacji – brak jej implementacji może prowadzić do awarii programu. Dlatego zaleca się, aby zawsze stosować odpowiednie bloki 'try-catch' wokół kodu, który może generować wyjątki.

Pytanie 33

Jaki typ pamięci RAM powinno się wybrać do efektywnego komputera do gier?

A. DDR3
B. DDR5
C. LPDDR4
D. DDR4
Wybór odpowiedniego rodzaju pamięci RAM jest kluczowy dla osiągnięcia maksymalnej wydajności w komputerze gamingowym. DDR5, najnowszy standard pamięci dynamicznej RAM, oferuje znaczące ulepszenia w porównaniu do swoich poprzedników. Główne różnice dotyczą prędkości, efektywności energetycznej oraz pojemności. DDR5 może oferować prędkości sięgające 8400 MT/s, co przyczynia się do szybszego transferu danych, co ma bezpośredni wpływ na wydajność gier i aplikacji wymagających wysokiej przepustowości. Ponadto, DDR5 wprowadza architekturę, która pozwala na zwiększenie ilości pamięci w jednym module, co umożliwia konfiguracje do 128 GB na pojedynczy moduł, co jest niezwykle korzystne dla graczy korzystających z bardziej wymagających tytułów. Przykłady gier, które potrafią w pełni wykorzystać możliwości DDR5 to Cyberpunk 2077 czy Call of Duty: Warzone, gdzie wydajność pamięci jest kluczowym elementem w uzyskiwaniu płynności rozgrywki. Stosowanie DDR5 nie tylko poprawia wydajność, ale również zwiększa przyszłościowość sprzętu, co sprawia, że jest to najlepszy wybór na dzisiejszym rynku komputerów gamingowych.

Pytanie 34

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

A. klasy, obiekty oraz hermetyzację
B. pola, metody, rekurencję oraz kwerendy
C. wyzwalacze i polimorfizm
D. zmienne, procedury oraz funkcje
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 35

Jakie są kluczowe zasady WCAG 2.0?

A. Dostosowana, błyskawiczna, mobilna, dostępna
B. Percepcyjna, operacyjna, zrozumiała, solidna
C. Elastyczna, prosta, przejrzysta, trwała
D. Ewolucyjna, interaktywna, efektywna
Zasady WCAG 2.0, czyli Wytycznych dotyczących dostępności treści internetowych, skupiają się na zapewnieniu, że strony internetowe są dostępne dla wszystkich użytkowników, niezależnie od ich zdolności. Główne zasady to percepcyjna, operacyjna, zrozumiała i solidna. Percepcyjna oznacza, że ​​wszystkie elementy na stronie muszą być przedstawione w sposób, który umożliwia ich percepcję przez różne zmysły, takie jak wzrok i słuch. Na przykład, tekst alternatywny dla obrazów pozwala osobom niewidomym zrozumieć zawartość wizualną. Operacyjna dotyczy interakcji użytkownika z treścią; nawigacja powinna być intuicyjna, a elementy interaktywne łatwo osiągalne. Zrozumiała oznacza, że ​​treść powinna być zrozumiała dla wszystkich użytkowników, co można osiągnąć poprzez prosty język i jasne instrukcje. Solidna koncentruje się na tym, aby treść była wystarczająco elastyczna, aby działała w różnych przeglądarkach i urządzeniach, co jest kluczowe w dobie różnorodności technologii. Przykładem wdrożenia tych zasad może być wykorzystanie ARIA (Accessible Rich Internet Applications), które wspomagają dostępność dynamicznych treści w aplikacjach internetowych.

Pytanie 36

Użycie modyfikatora abstract w definicji metody w klasie wskazuje, że

A. klasy pochodne nie mogą implementować tej metody
B. dziedziczenie po tej klasie jest niedozwolone
C. klasa ta stanowi podstawę dla innych klas
D. trzeba zaimplementować tę metodę w tej klasie
Modyfikator abstract w definicji metody jasno wskazuje, że dana klasa jest przeznaczona do dalszego dziedziczenia i stanowi coś w rodzaju szablonu dla innych klas. W praktyce – jeśli w klasie pojawia się choć jedna metoda abstract, cała klasa musi być także oznaczona jako abstract. To taki sygnał: hej, tej klasy nie da się użyć bezpośrednio, ale możesz po niej dziedziczyć i dopiero tam zaimplementować szczegóły. Moim zdaniem to bardzo wygodne, bo pozwala z góry narzucić kontrakt na klasy pochodne – mają dostarczyć własne wersje abstrakcyjnych metod. W wielu językach obiektowych, jak C# czy Java, stosowanie klas abstrakcyjnych jest powszechną praktyką przy projektowaniu rozbudowanych aplikacji, gdzie ważne jest rozdzielenie ogólnej logiki od szczegółowych implementacji. Daje to sporą elastyczność i chroni przed przypadkowymi błędami, kiedy ktoś próbowałby utworzyć obiekt klasy, która nie ma pełnej funkcjonalności. Często spotyka się to np. przy projektowaniu hierarchii typu Zwierzę → Pies/Kot, gdzie klasa Zwierzę jest abstrakcyjna i zawiera np. metodę abstract WydajDźwięk(). Dzięki temu każde konkretne zwierzę musi zaimplementować własną wersję tej metody, a całość kodu jest czytelniejsza i łatwiej ją rozwijać. Zdecydowanie warto poznać ten mechanizm, bo to fundament nowoczesnego programowania obiektowego i coś, co codziennie przydaje się w pracy programisty.

Pytanie 37

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

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

Pytanie 38

Co to jest shadow DOM?

A. Metoda renderowania grafiki 3D w przeglądarkach
B. Wirtualny DOM używany przez biblioteki jak React i Vue.js
C. Mechanizm enkapsulacji kodu HTML, CSS i JavaScript w komponenty webowe
D. Technika stylizacji elementów w CSS przy użyciu cieni
Shadow DOM to technika pozwalająca na enkapsulację kodu HTML, CSS oraz JavaScript w komponentach webowych, co jest kluczowe w kontekście tworzenia aplikacji opartych na Web Components. Dzięki zastosowaniu Shadow DOM, elementy wewnętrzne komponentu są izolowane od reszty dokumentu, co eliminuje problemy z kolizjami nazw klas CSS oraz pozwala na tworzenie bardziej modularnych i wielokrotnego użytku elementów. Przykładem zastosowania Shadow DOM mogą być komponenty interfejsu użytkownika, takie jak przyciski czy karty, które zawierają własne style i logikę, nie wpływając na globalne style strony. To podejście jest wspierane przez standardy W3C i zalecane w projektach, gdzie skala i złożoność aplikacji wymaga wysokiej wydajności i organizacji kodu. Dobrze zaprojektowane komponenty z użyciem Shadow DOM mogą znacznie uprościć rozwój i utrzymanie aplikacji webowych, czyniąc je bardziej responsywnymi i dostosowanymi do różnych środowisk.

Pytanie 39

Jakie jest oznaczenie normy międzynarodowej?

A. CE
B. PN
C. ISO
D. EN
ISO (International Organization for Standardization) to międzynarodowa organizacja zajmująca się opracowywaniem i wdrażaniem standardów technicznych. Oznaczenie ISO wskazuje, że produkt lub usługa spełnia międzynarodowe normy jakości i bezpieczeństwa, co ułatwia handel oraz współpracę na arenie międzynarodowej. Normy ISO obejmują szeroki zakres dziedzin, takich jak zarządzanie jakością (ISO 9001), zarządzanie środowiskowe (ISO 14001) czy bezpieczeństwo informacji (ISO 27001). Certyfikacja ISO buduje zaufanie klientów i zwiększa konkurencyjność firmy na rynku globalnym.

Pytanie 40

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, 4, 5
B. 0, 1, 2, 3, 4
C. 1, 2, 3, 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.