Wyniki egzaminu

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

Egzamin zdany!

Wynik: 37/40 punktów (92,5%)

Wymagane minimum: 20 punktów (50%)

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

Złośliwe oprogramowanie stworzone w celu przyznania hakerom uprawnień administracyjnych do komputera ofiary bez jej świadomości, to

A. keylogger
B. robak
C. wirus
D. rootkit
Rootkit to specyficzny rodzaj złośliwego oprogramowania, który został stworzony właśnie po to, żeby uzyskać i utrzymać nieautoryzowane uprawnienia administracyjne na systemie ofiary, a jednocześnie pozostać jak najbardziej niezauważonym. W praktyce, rootkit pozwala atakującemu przejąć pełną kontrolę nad komputerem – może wtedy instalować inne szkodliwe programy, kraść dane czy omijać zabezpieczenia bez wiedzy użytkownika. Co ważne, rootkity są często wykorzystywane przez cyberprzestępców do tzw. eskalacji uprawnień, czyli podniesienia poziomu dostępu z konta zwykłego użytkownika do administratora (roota), co w świecie Linuksa i Unixa jest dość powszechną strategią. Moim zdaniem, to jeden z najtrudniejszych do wykrycia typów malware – potrafi modyfikować systemowe procesy, a nawet podszywać się pod pliki systemowe, co sprawia, że standardowe antywirusy często go nie wykrywają. W branży IT mówi się wręcz o konieczności korzystania z zaawansowanych narzędzi forensics, np. rootkit detectors i regularnym monitorowaniu integralności systemu, zgodnie z zaleceniami CIS Controls. Jeśli ktoś chce się dobrze zabezpieczyć, to naprawdę warto zwracać uwagę na nieoczywiste symptomy: podejrzane procesy, zmiany w kluczowych plikach systemowych czy dziwne aktywności sieciowe. Rootkit to prawdziwy koszmar administratorów i świetny „przykład z życia” na to, jak ważna jest segmentacja uprawnień i stosowanie zasady najmniejszych uprawnień.

Pytanie 2

Zmienna o typie logicznym może mieć następujące wartości:

A. trzy dowolne liczby naturalne
B. 0 oraz każda liczba całkowita
C. true, false
D. 1, -1
Typ logiczny (boolean) może przyjąć jedynie dwie wartości: true (prawda) i false (fałsz). Jest to fundamentalna zasada w programowaniu, ponieważ zmienne logiczne są podstawą operacji warunkowych, pętli oraz sterowania przepływem programu. W językach takich jak C++, Java, Python i wielu innych, wartości logiczne pozwalają na budowanie złożonych struktur decyzyjnych. Dzięki nim programista może precyzyjnie kontrolować, które fragmenty kodu zostaną wykonane, co jest kluczowe w implementacji algorytmów oraz walidacji danych.

Pytanie 3

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

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

Pytanie 4

Czym jest klasa w programowaniu obiektowym?

A. zmienna
B. typ danych
C. wskaźnik
D. instrukcja
Klasa w programowaniu obiektowym to w praktyce taki szablon, według którego tworzymy konkretne obiekty. To coś jak przepis, dzięki któremu programista może zdefiniować własny, złożony typ danych, opisujący realny byt czy problem. Klasa określa, jakie dane (pola, właściwości) oraz zachowania (metody, funkcje) mają mieć obiekty, które potem powstaną na jej podstawie. Programując w językach takich jak Java, C++ czy Python, właśnie klasy pozwalają nam zamknąć logikę i dane w jednym opakowaniu – to jest jeden z filarów OOP (programowania obiektowego). Moim zdaniem nie da się robić sensownych, skalowalnych projektów bez klas, bo to one pozwalają sensownie ogarnąć złożoność. Przykład? W aplikacji bankowej klasa KontoBankowe może mieć pola typu saldo, numer konta i metody do przelewów. Każde nowe konto to osobny obiekt tego typu, ale wszystkie zachowują się spójnie. Warto przy tym pamiętać, że dobra praktyka nakazuje projektować klasy tak, żeby były jak najbardziej uniwersalne, czyli zgodnie z zasadą DRY (Don’t Repeat Yourself) i SOLID. Często spotykam się z opinią, że klasa to „sztywny typ danych”, ale to nieprawda – dzięki dziedziczeniu czy polimorfizmowi można je elastycznie rozszerzać. Podsumowując, klasa to własny, często złożony typ danych stworzony specjalnie pod potrzeby danej aplikacji – i właśnie za to tak się je ceni.

Pytanie 5

Jakie zasady stosuje programowanie obiektowe?

A. Tworzenie aplikacji z wykorzystaniem relacyjnych baz danych
B. Rozwiązywanie problemów poprzez modelowanie ich przy pomocy klas i obiektów
C. Podział kodu na funkcje i procedury
D. Zastosowanie wyłącznie algorytmów heurystycznych
Programowanie obiektowe polega na rozwiązywaniu problemów poprzez modelowanie ich za pomocą klas i obiektów. Klasy definiują strukturę i zachowanie obiektów, które są instancjami tych klas. Obiekty przechowują stan (dane) w polach i realizują funkcjonalność poprzez metody. Programowanie obiektowe pozwala na odwzorowanie rzeczywistych systemów, dziedziczenie cech, polimorfizm oraz hermetyzację danych, co prowadzi do bardziej modułowego i skalowalnego kodu. Przykłady języków obiektowych to C++, Java i Python.

Pytanie 6

Które z poniższych NIE jest typem wartości zwracanej przez funkcję w języku JavaScript?

A. Object
B. Method
C. Number
D. Undefined
W języku JavaScript funkcje mogą zwracać różne typy wartości, takie jak obiekty, liczby czy typ undefined. Wśród wymienionych opcji, 'Method' nie jest typem wartości zwracanej przez funkcję. W rzeczywistości, metoda w JavaScript to funkcja przypisana do obiektu. Jeżeli definiujemy funkcję wewnątrz obiektu, to możemy ją nazwać metodą tego obiektu, ale nie jest to typ wartości. Przykładowo, jeżeli mamy obiekt o nazwie 'person' i metodę 'greet', która zwraca powitanie:

const person = {
name: 'Jan',
greet: function() {
return 'Cześć, ' + this.name;
}
};

W powyższym przypadku, 'greet' jest metodą, ale jej wartością zwracaną jest typ string, co jest typowym zachowaniem funkcji. Dobrą praktyką jest zrozumienie różnicy między funkcjami a ich zastosowaniami w obiektach, co pozwala na lepsze projektowanie kodu oraz ukierunkowanie na zasady programowania obiektowego, które są kluczowe w JavaScript.

Pytanie 7

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

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

Pytanie 8

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

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

Pytanie 9

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

A. Component Isolation/Component Deployment - izolacja i wdrażanie komponentów aplikacji
B. Ciągła integracja i ciągłe dostarczanie - praktyki automatyzujące proces wdrażania kodu
C. Code Implementation/Code Delivery - metodyka implementacji i dostarczania kodu
D. Customer Interface/Customer Design - projektowanie interfejsów zorientowane na klienta
CI/CD, czyli ciągła integracja i ciągłe dostarczanie, to zbiór praktyk i narzędzi stosowanych w rozwoju oprogramowania w celu automatyzacji procesów budowy, testowania i wdrażania aplikacji. CI polega na regularnym integrowaniu kodu do wspólnego repozytorium, co pozwala na wczesne wykrywanie błędów i konfliktów. Umożliwia to zespołom deweloperskim wykrywanie problemów w kodzie na wczesnym etapie, co znacząco przyspiesza cykl rozwoju. CD natomiast odnosi się do automatyzacji procesu wdrażania aplikacji na środowiska produkcyjne, co minimalizuje czas potrzebny na dostarczenie nowych funkcji do użytkowników. Przykłady praktycznego zastosowania CI/CD obejmują użycie narzędzi takich jak Jenkins, GitLab CI, czy CircleCI, które umożliwiają automatyczne uruchamianie testów oraz wdrażanie aplikacji na różnych platformach. Dobre praktyki w CI/CD obejmują tworzenie małych i częstych aktualizacji, co pozwala na łatwiejsze zarządzanie projektami i szybsze reagowanie na potrzeby klientów.

Pytanie 10

Do stworzenia zbioru danych potrzebnego do uruchomienia algorytmu sortowania bąbelkowego tablicy, wymagane są przynajmniej następujące typy:

A. jeden tablicowy, jeden liczbowy do nadzorowania pętli, dwa do zamiany miejscami elementów
B. jeden tablicowy, dwa liczbowe do nadzorowania pętli, jeden do zamiany miejscami elementów
C. dwa tablicowe, jeden liczbowy do nadzorowania pętli
D. dwa tablicowe, dwa do zamiany miejscami elementów
Sortowanie bąbelkowe to jeden z tych algorytmów, które wydają się proste, ale wymagają solidnego zrozumienia działania pętli i pracy z tablicami. W praktyce, aby prawidłowo zaimplementować bubble sort, zawsze korzysta się z jednej tablicy (w której przechowywane są elementy do posortowania), dwóch liczbowych zmiennych sterujących (dla dwóch zagnieżdżonych pętli for lub while, bo każda z nich odpowiada za przechodzenie przez elementy), a także jednej dodatkowej zmiennej tymczasowej do zamiany miejscami dwóch elementów. To właśnie te cztery składniki są absolutnym minimum, żeby kod był czytelny i zgodny z zasadami dobrej praktyki. Z mojego doświadczenia, rezygnacja z jednej z nich prowadzi do niepotrzebnego kombinowania, a czasem nawet do dziwnych błędów. Warto wiedzieć, że takie podejście dobrze wpisuje się w wymagania większości języków programowania – czy to C, Java, czy Python – i sprawdza się zarówno przy nauce, jak i w praktycznych zadaniach rekrutacyjnych. Pozostawienie logiki zamiany elementów w osobnej zmiennej tymczasowej to nie tylko kwestia czytelności; to też sposób na unikanie utraty danych podczas zamiany. Co ciekawe, niektórzy próbują czasami zamieniać bez zmiennej tymczasowej, używając operacji XOR, ale w praktyce to przerost formy nad treścią i raczej niezalecane w standardzie branżowym. Dobrze jest wiedzieć, że to podejście, które tu wybrałeś, stanowi niejako wzorzec dla wszystkich początkujących programistów i jest akceptowane na egzaminach czy rozmowach technicznych.

Pytanie 11

Który z wymienionych procesów NIE jest częścią etapu kompilacji?

A. Optymalizacja kodu
B. Tłumaczenie kodu źródłowego na język maszynowy
C. Analiza działania programu w czasie rzeczywistym
D. Weryfikacja błędów składniowych
Optymalizacja kodu to integralna część kompilacji, mająca na celu zwiększenie wydajności programu poprzez usunięcie zbędnych instrukcji i usprawnienie algorytmów. Tłumaczenie kodu źródłowego na język maszynowy jest głównym zadaniem kompilatora, który generuje plik wykonywalny. Weryfikacja błędów składniowych jest jednym z pierwszych etapów kompilacji, mającym na celu upewnienie się, że kod jest poprawny pod względem składni, zanim zostanie przekształcony na kod maszynowy.

Pytanie 12

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

sortowanie bąbelkoweO(n²)
sortowanie przez wstawianieO(n²)
sortowanie przez scalanieO(n log n)
sortowanie przez zliczanieO(n)
sortowanie kubełkoweO(n²)
A. bąbelkowego
B. przez scalanie
C. przez zliczanie
D. kubełkowego
Sortowanie przez zliczanie (Counting Sort) to jeden z najszybszych algorytmów sortowania dla dużych zbiorów danych, jeśli zakres wartości jest ograniczony. Algorytm działa w czasie O(n+k), gdzie n to liczba elementów, a k to zakres wartości. Jest to algorytm stabilny, co oznacza, że zachowuje kolejność elementów o tej samej wartości. Counting Sort jest szczególnie efektywny w przypadku danych numerycznych o ograniczonym przedziale wartości, co czyni go idealnym rozwiązaniem do sortowania dużych zbiorów danych w krótkim czasie.

Pytanie 13

Co to jest WebSockets?

A. Biblioteka JavaScript do manipulacji danymi JSON
B. Format zapisu danych w bazach NoSQL
C. Metoda zabezpieczania połączeń HTTP
D. Protokół komunikacyjny zapewniający dwukierunkową komunikację między przeglądarką a serwerem
WebSockets to protokół komunikacyjny, który umożliwia dwukierunkową, pełnodupleksową komunikację między klientem a serwerem. To oznacza, że zarówno przeglądarka, jak i serwer mogą wysyłać dane w dowolnym momencie, co znacząco różni się od tradycyjnego modelu HTTP, gdzie klient inicjuje każde połączenie. Przykładem zastosowania WebSockets jest aplikacja czatu w czasie rzeczywistym, gdzie użytkownicy mogą widzieć wiadomości natychmiastowo, bez potrzeby odświeżania strony. Dodatkowo, WebSockets zmniejszają opóźnienia w komunikacji, co jest kluczowe w aplikacjach wymagających szybkiej interakcji, takich jak gry online czy platformy do handlu. Warto zaznaczyć, że WebSockets są zdefiniowane w standardzie IETF jako RFC 6455, a ich wykorzystanie powinno być zgodne z najlepszymi praktykami w zakresie bezpieczeństwa, takimi jak użycie protokołu wSecure WebSockets (wss://) do zapewnienia bezpieczeństwa przesyłanych danych.

Pytanie 14

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

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

Pytanie 15

Zamieszczony fragment kodu w Android Studio wdraża metodę nasłuchującą dla obsługi zdarzenia:

przycisk = (Button) findViewById(R.id.yes_button);
przycisk.setOnClickListener(new View.OnClickListener() { ... });
A. zmiany stanu kontrolki Switch
B. zmiany w polu tekstowym
C. wybierania daty
D. naciśnięcia przycisku
Kod wykorzystuje metodę setOnClickListener, która jest podstawowym sposobem przypisywania reakcji na kliknięcie przycisku (Button) w Androidzie. To taki klasyczny wzorzec nasłuchiwania zdarzeń, w tym przypadku – kliknięcia użytkownika. Moim zdaniem, ta konstrukcja pojawia się praktycznie w każdym większym projekcie Androidowym, bo trudno sobie wyobrazić interfejs bez przycisków, które coś faktycznie robią. Co ciekawe, korzystając z setOnClickListener, przekazujemy obiekt anonimowej klasy implementującej interfejs View.OnClickListener, a w jej metodzie onClick() umieszczamy kod, który ma się wykonać po naciśnięciu przycisku. To bardzo elastyczne rozwiązanie, bo możemy tu zarówno wyświetlić Toast, przejść do innego activity, wysłać dane do internetu czy nawet ukryć inny widok. Warto pamiętać, że praktycznie wszystkie kontrolki dziedziczące po View mogą mieć własnych listenerów, ale Button to najbardziej naturalny przypadek użycia. To taka podstawa obsługi UI w Android Studio i moim zdaniem każdy, kto chce pisać apki na Androida, powinien mieć to opanowane na pamięć. Dodatkowo, od wersji Android API 26 można używać także lambda expressions, co jeszcze bardziej skraca kod, ale sama idea zostaje ta sama – reagujemy na kliknięcie przycisku.

Pytanie 16

Który z wymienionych aktów prawnych odnosi się do ochrony danych osobowych w krajach Unii Europejskiej?

A. GDPR (RODO)
B. Creative Commons
C. Open Source Initiative
D. DMCA
GDPR (RODO) to akt prawny dotyczący ochrony danych osobowych w Unii Europejskiej. Wprowadza on jednolite zasady przetwarzania danych, zwiększając ochronę prywatności obywateli. RODO daje użytkownikom prawo do dostępu do swoich danych, ich poprawiania, a także żądania ich usunięcia (prawo do bycia zapomnianym). Firmy muszą transparentnie informować o celach przetwarzania danych oraz zapewniać odpowiedni poziom zabezpieczeń. Niezastosowanie się do przepisów RODO skutkuje wysokimi karami finansowymi.

Pytanie 17

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

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

Pytanie 18

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

int x = 5;
int y = 10;
Console.WriteLine($"Suma {x} i {y} wynosi {x + y}");
A. Error: niewłaściwa składnia
B. Suma x i y wynosi 15
C. Suma 5 i 10 wynosi x + y
D. Suma 5 i 10 wynosi 15
Kod w języku C# wykonuje operację dodawania dwóch zmiennych, x i y, oraz wyświetla wynik w sformatowanym ciągu tekstowym. Poprawna odpowiedź to 'Suma 5 i 10 wynosi 15', ponieważ zmienna x ma wartość 5, a zmienna y ma wartość 10. Kiedy dodajemy te dwie liczby, otrzymujemy 15. Warto zwrócić uwagę na wykorzystanie interpolacji ciągów, co jest istotnym elementem w nowoczesnym C#. Umożliwia to w prosty sposób łączyć tekst z wartościami zmiennych, co zwiększa czytelność kodu. Interpolacja jest szczególnie przydatna w kontekście generowania komunikatów użytkownika i raportów. Przykład zastosowania może obejmować aplikacje, które prezentują wyniki obliczeń lub statystyki, gdzie ważne jest, aby w przyjazny sposób przedstawiać dane. Dobre praktyki programistyczne sugerują, aby unikać twardego kodowania wartości zamiast tego używać zmiennych, co ułatwia późniejsze modyfikacje i utrzymanie kodu.

Pytanie 19

Zgodnie z dokumentacją dotyczącą menu Navbar z biblioteki Bootstrap 4, w celu stworzenia menu należy zdefiniować listę

A standard navigation bar is created with the .navbar class, followed by a responsive collapsing class:
.navbar-expand-xl|lg|md|sm (stacks the navbar vertically on extra large, large, medium or small screens).
To add links inside the navbar, use a <ul> element with class="navbar-nav". Then add <li> elements with a
.nav-item class followed by a <a> element with a .nav-link class...
Use any of the .bg-color classes to change the background color of the navbar (.bg-primary, .bg-success,
.bg-info, .bg-warning, .bg-danger, .bg-secondary, .bg-dark and .bg-light)
Tip: Add a white text color to all links in the navbar with the .navbar-dark class, or use the .navbar-light
class to add a black text color.
Źródło: https://www.w3schools.com/bootstrap4
A. < ul class="navbar-nav" > ... < /ul>
B. < ol class="navbar-nav" > ... < /ol>
C. < ol class="a, .nav-item" > ... < /ol>
D. < ul class="a, .nav-item" > ... < /ul>
Wybrałeś dokładnie taki kod, jaki zaleca oficjalna dokumentacja Bootstrapa 4. Użycie <ul class="navbar-nav"> … </ul> jest podstawą do tworzenia nawigacji w tym frameworku. Cała magia polega na tym, że Bootstrap styluje właśnie elementy listy nieuporządkowanej (ul) z klasą "navbar-nav". To pozwala prawidłowo wyświetlić menu poziomo, z zachowaniem responsywności i spójności z resztą interfejsu. Wewnątrz każdej listy dodaje się <li class="nav-item">, a w nich <a class="nav-link"> z linkami – wtedy całość zachowuje się zgodnie z założeniami Bootstrapa. W praktyce widać to na prawie każdej stronie korzystającej z tego frameworka – niezależnie czy robisz prostą wizytówkę, czy rozbudowaną aplikację webową. Takie podejście zapewnia nie tylko poprawne style, ale też dobre wsparcie dla dostępności (a11y), bo listy są dla czytników ekranu czytelniejsze niż np. <div>. Moim zdaniem, trzymanie się tej struktury jest kluczowe, jeśli chcesz, żeby twoje menu działało dobrze na różnych przeglądarkach i urządzeniach. Z moich doświadczeń wynika, że próby modyfikowania tej struktury kończą się często problemami ze stylami, a nawet łamaniem responsywności. Lepiej nie kombinować i stosować to, co już sprawdzone – oszczędza to mnóstwo nerwów przy późniejszym rozwijaniu projektu.

Pytanie 20

Co zostanie wyświetlone po wykonaniu poniższego kodu w języku Python?

data = [1, 2, 3, 4, 5]
result = list(map(lambda x: x*2, filter(lambda x: x % 2 == 0, data)))
print(result)
A. [2, 6, 10]
B. [1, 2, 3, 4, 5]
C. [2, 4, 6, 8, 10]
D. [4, 8]
W kodzie Python, który analizujemy, użyto funkcji map i filter, które są często stosowane w programowaniu funkcyjnym. W pierwszej części, funkcja filter filtruje elementy z listy 'data', zwracając tylko te, które są liczbami parzystymi. W tym przypadku, z listy [1, 2, 3, 4, 5] zostaną wybrane liczby 2 i 4. Następnie, funkcja map mnoży te liczby przez 2. Dla liczby 2 otrzymujemy 4, a dla liczby 4 – 8. Dlatego wynik końcowy to lista [4, 8]. W praktyce, znajomość takich konstrukcji pozwala na efektywne przetwarzanie danych i implementację bardziej złożonych algorytmów w codziennych zastosowaniach programistycznych. Korzystając z filtracji i mapowania można na przykład szybko przetwarzać dane wejściowe w aplikacjach webowych lub analizować duże zestawy danych. Ważne jest, aby pamiętać, że te techniki są bardzo przydatne w kontekście pracy z danymi i powinny być uzupełnione o umiejętność czytania i rozumienia kodu, co jest kluczowe w praktyce programistycznej.

Pytanie 21

Która z poniższych technologii jest używana do tworzenia animacji na stronach internetowych?

A. XML
B. CSS Animations
C. MySQL
D. HTTP Headers
CSS Animations to technologia, która pozwala na tworzenie dynamicznych efektów wizualnych na stronach internetowych. Umożliwia ona animowanie różnych właściwości CSS, takich jak kolor, położenie, rozmiar czy przezroczystość, w prosty sposób. Dzięki CSS Animations, deweloperzy mogą tworzyć płynne przejścia i efekty bez potrzeby używania JavaScriptu, co zwiększa wydajność i responsywność witryn. Przykładem zastosowania CSS Animations może być animowanie przycisków na stronie, które zmieniają kolor po najechaniu na nie kursorem. Z punktu widzenia dobrych praktyk, warto pamiętać o optymalizacji efektów animacyjnych, aby nie obciążały one zbytnio zasobów przeglądarki. CSS Animations są częścią standardu CSS3, co oznacza, że są szeroko wspierane przez różne przeglądarki i można je łatwo implementować w projektach webowych.

Pytanie 22

Który protokół jest wykorzystywany do transferu plików między klientem a serwerem?

A. POP3
B. HTTP
C. FTP
D. SMTP
Protokół FTP (File Transfer Protocol) jest standardowym protokołem sieciowym, który został zaprojektowany do przesyłania plików między klientem a serwerem. Dzięki FTP użytkownicy mogą łatwo wysyłać i pobierać pliki w sieci, co czyni go nieocenionym narzędziem w administracji serwerami oraz w środowiskach deweloperskich. Protokół ten działa na zasadzie architektury klient-serwer, gdzie klient łączy się z serwerem FTP, autoryzuje się i następnie może przesyłać pliki. W praktyce FTP często wykorzystywane jest do przesyłania dużych plików, tworzenia kopii zapasowych, a także do publikowania stron internetowych na serwerach hostingowych. Istnieje wiele implementacji FTP, w tym wersje bezpieczne, takie jak FTPS i SFTP, które zapewniają dodatkowe warstwy bezpieczeństwa, szyfrując dane podczas transferu. W kontekście standardów branżowych, FTP jest powszechnie akceptowany i stosowany w różnych systemach operacyjnych oraz aplikacjach, co czyni go standardem w zakresie transferu plików w Internecie.

Pytanie 23

Co zostanie wyświetlone po wykonaniu poniższego kodu?

function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function() {
  return `Hello, ${this.name}!`;
};

const person = new Person('John');
console.log(person.sayHello());
A. Hello, John!
B. Hello, [object Object]!
C. TypeError: person.sayHello is not a function
D. Hello, undefined!
Pierwsza z niepoprawnych odpowiedzi sugeruje, że wynik to 'Hello, undefined!'. To wynika z błędnego założenia, że właściwość 'name' nie jest prawidłowo przypisana do obiektu. W kodzie właściwość 'name' jest poprawnie ustawiona przez konstruktor, więc nie ma podstaw do uznania, że zwróci 'undefined'. Warto zauważyć, że 'undefined' pojawia się, gdy zmienne nie zostały zainicjowane lub gdy nie odnajdujemy właściwości w obiekcie. Z kolei opcja, która wskazuje na 'TypeError: person.sayHello is not a function', jest oparta na błędnym założeniu, że metoda 'sayHello' nie istnieje w obiekcie 'person'. Metoda ta została zdefiniowana w prototypie, więc każda instancja obiektu 'Person' ma do niej dostęp i nie spowoduje to błędu typu. Ostatnia z odpowiedzi, sugerująca, że wynik to 'Hello, [object Object]!', jest efektem niepoprawnego użycia konwersji obiektu do stringa. Gdybyśmy próbowali zwrócić 'this' jako obiekt bez odpowiedniego przetworzenia, zwróciłoby to domyślną reprezentację obiektu. Kluczowym błędem w myśleniu jest nieuwzględnienie, że metody są częścią prototypów i obiekty dziedziczą je, co jest fundamentalnym założeniem obiektowego paradygmatu programowania w JavaScript. Warto zwrócić uwagę na te koncepcje, aby lepiej zrozumieć działanie prototypów w tym języku.

Pytanie 24

Na podstawie zamieszczonego fragmentu kodu można stwierdzić, że element o nazwie rysunek jest

MojaKlasa obj1 = new MojaKlasa();
obj1.rysunek();
A. konstruktorem
B. polem w klasie
C. metodą w klasie
D. obiektem
W tym fragmencie kodu wywołujesz funkcję rysunek na obiekcie obj1, który jest instancją klasy MojaKlasa. To znaczy, że rysunek jest metodą tej klasy. Tak naprawdę, w programowaniu obiektowym korzystanie z metod to chleb powszedni – to one definiują zachowanie obiektu. W praktyce, metody są tym, co pozwala obiektom „robić” coś konkretnego, czyli realizować logikę biznesową albo odpowiadać na zdarzenia. Moim zdaniem warto pamiętać, że w standardach takich jak Java czy C#, notacja obj1.rysunek() jednoznacznie wskazuje na wywołanie metody (nawiasy są tu sygnałem, że chodzi o funkcję, a nie o dostęp do pola). To zresztą jest bardzo czytelna konwencja, spotykana praktycznie w każdym języku zorientowanym obiektowo. Dla przykładu, jeśli chciałbyś uzyskać dostęp do pola w obiekcie, nie używałbyś nawiasów, tylko napisałbyś obj1.nazwapola. W pracy nad większymi projektami warto też pamiętać o tzw. enkapsulacji – metody pozwalają „schować” szczegóły implementacji i udostępnić tylko to, co faktycznie powinno być dostępne z zewnątrz. W sumie, wywołanie obj1.rysunek(); dokładnie pokazuje, jak od strony praktycznej wyglądają interakcje z metodą klasy.

Pytanie 25

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

let x = 5;
let y = '10';
console.log(x + y);
A. error
B. undefined
C. 15
D. 510
Wynik działania podanego kodu to 510, co może być zaskakujące dla osób nieznających typów danych w JavaScript. W tym przypadku zmienna x jest liczbą całkowitą (5), a zmienna y jest łańcuchem tekstowym ('10'). Kiedy używamy operatora + w JavaScript, następuje tzw. "przesunięcie typów". Gdy jeden z operandów jest łańcuchem, to JavaScript konwertuje pozostałe typy na łańcuch, a następnie wykonuje konkatenację. W efekcie 5 konwertowane jest na '5', a wynik końcowy to '5' + '10', co daje '510'. To zachowanie jest zgodne z regułami języka JavaScript i jego dynamicznym typowaniem. Warto zwrócić uwagę, że taka konwersja może prowadzić do niezamierzonych wyników, dlatego ważne jest, aby zrozumieć, kiedy i jak działają operatory w JavaScript. Dla większej jasności, w sytuacjach, gdy chcemy dodać dwie liczby, lepiej jest upewnić się, że obie zmienne mają ten sam typ danych, np. przez użycie funkcji parseInt() lub parseFloat().

Pytanie 26

Który z wymienionych poniżej typów danych stanowi przykład typu stałoprzecinkowego?

A. int
B. float
C. decimal
D. double
Typ danych 'int' (integer) to przykład typu stałoprzecinkowego, który przechowuje liczby całkowite. Stałoprzecinkowe typy danych są podstawą w programowaniu, ponieważ pozwalają na efektywne przechowywanie wartości bez części ułamkowej, co przyspiesza obliczenia i redukuje zużycie pamięci. Typ 'int' jest szeroko stosowany w językach takich jak C, C++, Java i Python, a jego główną zaletą jest szybkość operacji arytmetycznych oraz przewidywalność wyników. Stałoprzecinkowe typy danych znajdują zastosowanie w algorytmach, systemach sterowania i aplikacjach embedded, gdzie precyzja obliczeń jest kluczowa.

Pytanie 27

Jak nazywa się wzorzec projektowy, do którego odnosi się ta definicja?

Wzorzec projektowy należący do grupy wzorców strukturalnych. Służy do ujednolicenia dostępu do złożonego systemu poprzez wystawienie uproszczonego, uporządkowanego interfejsu programistycznego, który ułatwia jego użycie.
Źródło Wikipedia. Wolna encyklopedia
A. Dekorator
B. Prototyp
C. Kompozyt
D. Fasada
Wzorzec projektowy Fasada jest jednym z kluczowych wzorców strukturalnych używanych w inżynierii oprogramowania. Jego głównym celem jest uproszczenie i ujednolicenie interakcji z złożonym systemem poprzez wystawienie uproszczonego i uporządkowanego interfejsu programistycznego. Fasada ukrywa złożoność systemu, zapewniając jednolity punkt dostępu do zestawu funkcji lub klas. W praktyce fasada jest używana do tworzenia prostych interfejsów dla bardziej złożonych bibliotek lub systemów, co ułatwia ich użycie przez programistów. Na przykład w systemie bankowym fasada może zintegrować różne usługi jak autoryzacja płatności, zarządzanie kontami i generowanie wyciągów, oferując jeden interfejs do ich obsługi. Fasada wspiera dobre praktyki poprzez promowanie niskiej zależności i wysokiej spójności. Zmiany w wewnętrznym działaniu systemu są mniej widoczne na zewnątrz, co zwiększa elastyczność systemu. Fasada jest zgodna z zasadą projektowania SOLID, zwłaszcza z zasadą pojedynczej odpowiedzialności, umożliwiając lepsze zarządzanie kodem i jego utrzymanie. Jej użycie jest powszechne w systemach złożonych, gdzie upraszczanie interfejsów jest kluczowe dla efektywności programistycznej i skalowalności systemu.

Pytanie 28

Która z wymienionych metod może pomóc w walce z uzależnieniem od internetu?

A. Wprowadzenie systematycznych przerw od używania urządzeń cyfrowych
B. Zwiększenie czasu spędzanego na mediach społecznościowych
C. Używanie komputera jedynie w nocy
D. Zainstalowanie większej ilości aplikacji rozrywkowych
Wprowadzenie systematycznych przerw od używania urządzeń cyfrowych to bardzo skuteczna metoda radzenia sobie z uzależnieniem od internetu. Rekomendują ją zarówno psychologowie, jak i specjaliści zajmujący się zdrowiem cyfrowym. W praktyce chodzi o to, żeby regularnie robić świadome przerwy od ekranu – na przykład ustawiając sobie limity czasowe, korzystając z aplikacji blokujących dostęp do określonych stron czy ustalając z góry pory dnia bez używania urządzeń elektronicznych. Takie działania mają mocno pozytywny wpływ na samodyscyplinę i pomagają odzyskać równowagę między życiem offline a online. Zresztą, nawet w poradnikach branżowych dla informatyków czy programistów można znaleźć zalecenia dotyczące odpoczynku od komputera, bo to poprawia koncentrację oraz ogólne samopoczucie. Moim zdaniem, warto przetestować różne sposoby tych przerw – czasem wystarczy wyjść na spacer, zrobić coś rękami albo po prostu porozmawiać z kimś na żywo. Regularność w tych czynnościach naprawdę robi różnicę. A co ciekawe, technika Pomodoro, znana z produktywności, świetnie sprawdza się także tutaj – 25 minut pracy, potem 5 minut przerwy bez żadnych ekranów. Z mojego doświadczenia, takie przerwy pomagają nie tylko ograniczyć korzystanie z internetu, ale też zadbać o swój wzrok i kręgosłup, co jest ważne zwłaszcza dla osób pracujących przy komputerze.

Pytanie 29

Która z wymienionych topologii sieci wykazuje cechę, że wszystkie urządzenia są połączone jednym kablem?

A. Topologia pierścienia
B. Topologia gwiazdy
C. Topologia magistrali
D. Topologia siatki
Topologia magistrali to jedna z podstawowych topologii sieci komputerowych, w której wszystkie urządzenia są podłączone do jednego kabla, zwanego magistralą. W tej konfiguracji dane przesyłane są w obu kierunkach na wspólnym przewodzie, a każde urządzenie musi odczytać dane i zidentyfikować, czy są one przeznaczone dla niego. Kluczową zaletą topologii magistrali jest jej prostota oraz niskie koszty instalacji, ponieważ wymaga mniej kabli niż inne topologie. Jest to jednak także jej największa wada - awaria jednego segmentu kabla może spowodować przerwanie komunikacji w całej sieci. Topologia magistrali jest często wykorzystywana w małych sieciach lokalnych oraz w systemach, gdzie nie ma potrzeby dużej niezawodności. Standardy, takie jak IEEE 802.3, definiują zasady działania sieci Ethernet korzystających z tej topologii. W praktyce, zastosowanie topologii magistrali można zaobserwować w starszych instalacjach sieciowych, gdzie budżet na infrastrukturę był ograniczony, a wymogi dotyczące skomplikowania sieci były minimalne.

Pytanie 30

Zawarty w ramce opis licencji sugeruje, że mamy do czynienia z licencją

Rodzaj licencji, który zapewnia otwarty dostęp do oprogramowania dla wszystkich użytkowników programu, którego dotyczy: prawo do darmowego użytkowania, kopiowania, rozpowszechniania oraz tworzenia modyfikacji, ulepszania i rozbudowania.
A. Freeware
B. Open Source
C. OEM
D. Shareware
Opis podany w pytaniu idealnie pasuje do koncepcji licencji Open Source. W praktyce oznacza to, że każdy użytkownik ma nie tylko prawo korzystać z oprogramowania za darmo, ale także może pobierać kod źródłowy, analizować go, modyfikować, ulepszać i nawet udostępniać dalej własne warianty. To daje ogromne możliwości rozwoju – nie tylko dla pojedynczych programistów, lecz przede wszystkim dla całych społeczności, które budują narzędzia i rozwiązania dużo szybciej niż zamknięte firmy. Przykłady? Linux, GIMP, LibreOffice, czy nawet przeglądarka Firefox. Moim zdaniem, to jest wręcz fundament nowoczesnego IT – wiele firm (nawet tych największych, typu Google czy Microsoft) opiera się dziś na rozwiązaniach Open Source, bo to daje elastyczność, bezpieczeństwo i transparentność. Branżowe standardy, np. licencja GNU GPL lub MIT, jasno określają zasady współdzielenia i ochrony praw autorskich. Dobra praktyka to zawsze sprawdzić warunki licencji przed wdrożeniem projektu w firmie albo szkole. Fajnie jest też pamiętać, że Open Source to nie tylko darmowość, ale przede wszystkim filozofia dzielenia się wiedzą, co w informatyce często prowadzi do innowacji i lepszej jakości kodu.

Pytanie 31

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 32

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

int[,] array = new int[3, 3];
A. tablicę jednowymiarową
B. stos
C. tablicę dwuwymiarową
D. listę
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 33

Jaka będzie złożoność czasowa wyszukiwania w posortowanej tablicy przy użyciu algorytmu binarnego?

A. O(n²)
B. O(log n)
C. O(n log n)
D. O(n)
Algorytm binarny to efektywny sposób wyszukiwania elementu w posortowanej tablicy, który działa w czasie O(log n). Działa on na zasadzie dzielenia przestrzeni wyszukiwania na pół w każdym kroku. Przykładowo, jeśli mamy tablicę z miliona elementów, to po pierwszym porównaniu możemy wykluczyć połowę z nich, a następnie kontynuować wyszukiwanie w pozostałej części. W praktyce oznacza to, że nawet dla dużych zbiorów danych, czas wyszukiwania pozostaje stosunkowo krótki. Algorytm ten jest powszechnie stosowany w różnych dziedzinach, takich jak programowanie, grafika komputerowa czy bazy danych, gdzie szybkość wyszukiwania jest kluczowa. Warto również wspomnieć, że aby móc zastosować algorytm binarny, tablica musi być wcześniej posortowana, co może wymagać dodatkowego nakładu czasu, ale po posortowaniu, zyskujemy efektywność algorytmu binarnego.

Pytanie 34

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

public class Car: Vehicle { ... }
A. odziedzicza po Vehicle
B. jest klasą podstawową (nie dziedziczy po innej klasie)
C. używa pól prywatnych klasy Vehicle
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 35

Jakie są główne różnice między środowiskiem RAD (Rapid Application Development) a klasycznymi IDE?

A. RAD funkcjonuje tylko w systemach operacyjnych Linux
B. RAD koncentruje się tylko na testowaniu programów
C. RAD nie oferuje żadnych narzędzi do debugowania
D. RAD pozwala na szybkie tworzenie prototypów i rozwijanie aplikacji przy minimalnej ilości kodu
RAD (Rapid Application Development) to metodologia tworzenia oprogramowania, która kładzie nacisk na szybkie prototypowanie i iteracyjne podejście do rozwoju aplikacji, minimalizując czas poświęcany na pisanie kodu od podstaw. Kluczowym aspektem RAD jest możliwość szybkiego dostosowywania aplikacji do zmieniających się wymagań biznesowych oraz ciągła interakcja z klientem. Narzędzia RAD, takie jak Visual Studio, Delphi czy OutSystems, pozwalają na budowanie aplikacji przy użyciu graficznych interfejsów, gotowych komponentów i automatycznego generowania kodu, co znacząco skraca czas wprowadzenia produktu na rynek. RAD doskonale sprawdza się w przypadku projektów o krótkim cyklu życia i wymagających szybkich zmian.

Pytanie 36

Jakie kroki należy podjąć po wykryciu błędu w kodzie podczas testowania?

A. Naprawić błąd i przeprowadzić ponowne testy aplikacji
B. Zgłosić błąd użytkownikowi końcowemu
C. Usunąć moduł, który zawiera błąd
D. Pominąć błąd, jeżeli aplikacja funkcjonuje poprawnie
Po znalezieniu błędu w kodzie podczas testowania kluczowym krokiem jest poprawienie błędu i ponowne przetestowanie aplikacji. Taki cykl iteracyjny pozwala na eliminację błędów i zapewnienie, że aplikacja działa zgodnie z oczekiwaniami. Testowanie po każdej poprawce jest niezbędne, aby upewnić się, że wprowadzone zmiany nie wpłynęły negatywnie na inne części aplikacji. Taka praktyka jest integralną częścią Continuous Integration (CI) i Continuous Deployment (CD), które zakładają częste wdrażanie i testowanie kodu. Poprawienie błędów na wczesnym etapie rozwoju minimalizuje koszty i czas potrzebny na naprawę błędów w fazie produkcyjnej, co przyczynia się do stabilności i wysokiej jakości końcowego produktu.

Pytanie 37

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

SELECT COUNT(*)
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
A. Liczba pracowników z pensją powyżej średniej
B. Liczba pracowników z najwyższą pensją
C. Błąd składni SQL
D. Średnia pensja wszystkich pracowników
Inne odpowiedzi sugerują mylne interpretacje funkcji i logiki zapytania SQL. Odpowiedź wskazująca na średnią pensję wszystkich pracowników nie uwzględnia faktu, że zapytanie nie zwraca wartości średniej, lecz liczbę pracowników, którzy zarabiają powyżej tej wartości. Odpowiedź odnosząca się do liczby pracowników z najwyższą pensją również jest niepoprawna, ponieważ w zapytaniu nie ma żadnych odniesień do konkretnego wynagrodzenia, a jedynie do wartości średniej. Ponadto, stwierdzenie, że zapytanie generuje błąd składni SQL, jest błędne, ponieważ składnia jest poprawna i zgodna z standardami SQL. Kluczową kwestią jest zrozumienie, że zapytania SQL mogą wykorzystywać zagnieżdżone zapytania do dynamicznego obliczania wartości w kontekście zbioru danych. Często popełnianym błędem jest mylenie funkcji agregujących z prostymi operacjami na kolumnach. Warto więc zaznajomić się z różnymi typami zapytań oraz ich zastosowaniem w praktyce, aby zwiększyć efektywność analizy danych. Zrozumienie logiki działania zagnieżdżonych zapytań oraz funkcji agregujących jest kluczowe dla skutecznej pracy z bazami danych.

Pytanie 38

Które z poniższych nie jest językiem programowania?

A. Ruby
B. HTML
C. Kotlin
D. Python
HTML (HyperText Markup Language) jest językiem znaczników, który służy do tworzenia struktury stron internetowych. Jest fundamentalnym elementem w budowie aplikacji webowych, ponieważ umożliwia definiowanie elementów takich jak nagłówki, akapity, obrazy, linki i wiele innych. HTML nie jest językiem programowania w sensie, w jakim są nimi Python, Ruby, czy Kotlin, ponieważ nie obsługuje logiki programowania, takiej jak zmienne, pętle czy warunki. Jego głównym celem jest struktura i prezentacja treści w przeglądarkach internetowych. HTML współpracuje z CSS (Cascading Style Sheets) do stylizacji oraz JavaScript do obsługi logiki i interakcji. Przykładowo, podczas tworzenia strony internetowej można użyć HTML do zbudowania struktury, CSS do nadania jej estetyki, a JavaScript do dodawania dynamicznych elementów, takich jak formularze czy interaktywne mapy. Dobrą praktyką jest również używanie semantycznego HTML, co poprawia dostępność oraz SEO, co jest szczególnie ważne w współczesnym internecie.

Pytanie 39

W pokazanych fragmentach kodu zdefiniowano funkcję o nazwie fun1. W tej funkcji należy zaimplementować obsługę. Fragment kodu interfejsu użytkownika (XAML):

<RadioButton Content="opcja1" />
<RadioButton Content="opcja2" />
<Button Content="OK" Width=75 Click="fun1"/>
Fragment kodu logiki programu (C#):
private void fun1(object sender, RoutedEventArgs e) { ... }
A. aplikacji po wystąpieniu zdarzenia utraty fokusu przez pole opcji
B. naciśnięcia przycisku zatwierdzającego dialog
C. usunięcia kontrolek z pamięci RAM
D. inicjacji elementów interfejsu użytkownika
Obsługa zdarzeń związanych z przyciskami zatwierdzającymi dialogi jest kluczową częścią interakcji użytkownika z aplikacją. W wielu środowiskach programistycznych, takich jak JavaScript, C# czy Java, przyciski te wywołują funkcje obsługi zdarzeń (event handlers), które mogą walidować dane, przetwarzać informacje lub wykonywać inne działania po naciśnięciu przycisku. Implementacja funkcji obsługującej przycisk jest nieodzowna w aplikacjach graficznych, gdzie interakcja z użytkownikiem wymaga dynamicznego reagowania na jego działania. Dzięki temu aplikacje stają się bardziej interaktywne i responsywne, co zwiększa komfort użytkownika i poprawia ogólną użyteczność oprogramowania.

Pytanie 40

Co to jest garbage collection w programowaniu?

A. Automatyczne zarządzanie pamięcią, które zwalnia pamięć zajmowaną przez nieużywane obiekty
B. Technika optymalizacji algorytmów sortowania danych
C. Metoda kompresji danych w bazach SQL
D. Proces usuwania nieużywanych elementów z interfejsu użytkownika
Garbage collection (GC) to kluczowy proces w wielu językach programowania, takich jak Java, C# czy Python, odpowiedzialny za automatyczne zarządzanie pamięcią. Dzięki mechanizmowi GC możliwe jest wykrywanie oraz zwalnianie pamięci zajmowanej przez obiekty, które nie są już używane w aplikacji. W praktyce oznacza to, że programista nie musi ręcznie zarządzać cyklem życia obiektów, co minimalizuje ryzyko wycieków pamięci i poprawia stabilność aplikacji. Mechanizm ten działa zazwyczaj w tle, analizując dostępność obiektów w pamięci oraz ich referencje. Przykładem zastosowania GC jest optymalizacja pamięci w aplikacjach serwerowych, gdzie długotrwałe działanie i efektywne zarządzanie zasobami są krytyczne. Użycie garbage collection zgodnie z dobrymi praktykami pozwala na pisanie bardziej przejrzystego i łatwiejszego w utrzymaniu kodu, co jest szczególnie ważne w projektach realizowanych w zespołach. Warto również wspomnieć, że różne implementacje GC (np. generacyjne kolekcje, inkrementalne zbieranie śmieci) mają różne podejścia do zarządzania pamięcią, co może wpływać na wydajność aplikacji.