Wyniki egzaminu

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

Egzamin niezdany

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

Wymagane minimum: 20 punktów (50%)

Nowe
Analiza przebiegu egzaminu- sprawdź jak rozwiązywałeś pytania
Udostępnij swój wynik
Szczegółowe wyniki:
Pytanie 1

Która z poniższych technologii służy do tworzenia interaktywnych aplikacji webowych bez przeładowania strony?

A. CSS3
B. AJAX
C. SQL
D. HTML5
AJAX, czyli Asynchronous JavaScript and XML, to technologia umożliwiająca tworzenie interaktywnych aplikacji webowych bez konieczności przeładowywania całej strony. Dzięki AJAX, możliwe jest asynchroniczne przesyłanie danych pomiędzy klientem a serwerem, co pozwala na dynamiczne aktualizowanie treści na stronie bez interakcji użytkownika w postaci odświeżania. Przykładem wykorzystania AJAX może być formularz kontaktowy, który po wysłaniu nie przeładowuje całej strony, ale zamiast tego zaktualizowuje tylko wybraną sekcję, informując użytkownika o sukcesie lub błędzie. AJAX jest wykorzystywany w wielu nowoczesnych aplikacjach webowych, takich jak Gmail czy Facebook, gdzie interaktywność i szybkość są kluczowe. W kontekście standardów, AJAX najlepiej współpracuje z technologiami takimi jak RESTful API oraz JSON, co optymalizuje wymianę danych. Przy implementacji AJAX ważne jest również przestrzeganie zasad związanych z wydajnością i bezpieczeństwem, takich jak unikanie ataków XSS oraz odpowiednie zarządzanie sesjami użytkowników.

Pytanie 2

W programowaniu obiektowym odpowiednikami zmiennych oraz funkcji w programowaniu strukturalnym są

A. pola i kwalifikatory dostępu
B. hermetyzacja oraz dziedziczenie
C. metody statyczne i abstrakcyjne
D. pola i metody
Wiele osób gubi się na początku, próbując przypisać funkcje i zmienne z programowania strukturalnego do bardziej zaawansowanych pojęć OOP, takich jak hermetyzacja, dziedziczenie, czy różne typy metod. Metody statyczne i abstrakcyjne to specjalne mechanizmy, które mają konkretne zastosowania: statyczne należą do klasy, nie do obiektu (nie przechowują stanu pojedynczego egzemplarza), a abstrakcyjne służą do definiowania interfejsu bez implementacji. Żadna z tych kategorii nie odzwierciedla podstawowego podziału na dane i operacje na nich, tak jak pola i metody. Hermetyzacja oraz dziedziczenie to zupełnie inne pary kaloszy – pierwsza dotyczy ukrywania danych i kontrolowania dostępu, druga umożliwia tworzenie hierarchii klas i ponowne wykorzystanie kodu. Oba te pojęcia są kluczowe w OOP, ale nie są odpowiednikami zmiennych i funkcji. Kwalifikatory dostępu, jak public, private czy protected, decydują, kto ma dostęp do pól czy metod, ale same w sobie nie są strukturami danych, ani funkcjonalnościami. Typowy błąd, z którym się spotykam, to mylenie mechanizmów zarządzających dostępem lub abstrakcji z podstawowymi elementami składowymi klasy. W praktyce, jeśli modelujesz klasę, zawsze najpierw myślisz o tym, jakie dane ma reprezentować (pola), a potem – jakie operacje można na tych danych wykonać (metody). Pozostałe aspekty, jak hermetyzacja czy wybór typu metody, są decyzjami na dalszym etapie projektowania, a nie bezpośrednimi odpowiednikami zmiennych i funkcji znanych z programowania strukturalnego.

Pytanie 3

Zapisany kod w języku Python ilustruje

pierwiastki = {"N": "Azot", "O": "Tlen", "P": "Fosfor", "Si": "Siarka"}
A. tablicę asocjacyjną (słownik)
B. kolejkę (LIFO)
C. stos
D. strukturę
W tym zadaniu mamy do czynienia z tablicą asocjacyjną, która w Pythonie nazywa się słownikiem. Słownik to taki fajny sposób na przechowywanie par klucz-wartość, co jest naprawdę przydatne. W naszym przypadku kluczami są symbole chemiczne, jak N czy O, a wartościami ich pełne nazwy, czyli Azot oraz Tlen. Dzięki tej strukturze można szybko sięgnąć po konkretne dane, co jest bardzo pomocne w różnych sytuacjach. Na przykład, można używać ich do przechowywania konfiguracji albo do prostych baz danych. Warto też dodać, że słowniki świetnie pasują do obiektów JSON, co jest ważne w tworzeniu aplikacji webowych. Dają nam dużą elastyczność i robią to w bardzo efektywny sposób, dlatego są jednym z kluczowych elementów Pythona. Ułatwiają pisanie kodu, który jest zarówno czytelny, jak i funkcjonalny.

Pytanie 4

Jakie jest podstawowe zadanie wykorzystania frameworka Node.js w aplikacjach internetowych?

A. Budowanie aplikacji mobilnych
B. Weryfikacja API
C. Zarządzanie aplikacjami serwerowymi i realizacja przetwarzania asynchronicznego
D. Kreowanie graficznego interfejsu użytkownika
Aplikacje mobilne to raczej domena takich narzędzi jak Android Studio czy React Native, które są zaprojektowane do tworzenia aplikacji na smartfony. Projektowanie interfejsów użytkownika raczej robimy w Adobe XD, Sketch czy Figma, a nie w Node.js, bo to nie do końca jego zadanie. Testowanie API to już inna bajka i zazwyczaj korzysta się z Postmana, a Node.js to bardziej środowisko do uruchamiania kodu, a nie do testów.

Pytanie 5

Jak wygląda kod uzupełnienia do dwóch dla liczby -5 w formacie binarnym przy użyciu 8 bitów?

A. 11111101
B. 10000101
C. 11111011
D. 00000101
Pierwsza z niepoprawnych odpowiedzi, która przedstawia wartość 00000101, jest błędna, ponieważ jest to binarna reprezentacja liczby 5, a nie -5. Kod uzupełnieniowy do dwóch wymaga przedstawienia liczby ujemnej poprzez inwersję bitów i dodanie jedynki. Ta odpowiedź nie ma zastosowania przy obliczaniu liczb ujemnych, stąd jest niewłaściwa. Kolejna odpowiedź, 11111101, również jest nieprawidłowa. W przypadku tej liczby, zainwersowanie bitów liczby 5 dawałoby 11111010, a dodanie 1 do tej wartości prowadziłoby do 11111011, co wskazuje, że ta odpowiedź nie jest zgodna z zasadą uzupełnienia do dwóch. Ostatnia z niepoprawnych odpowiedzi, 10000101, jest również błędna, ponieważ nie odpowiada żadnej z reprezentacji liczby -5. Gdybyśmy spróbowali konwertować ją z powrotem na wartość dziesiętną, otrzymalibyśmy 133, co jest zdecydowanie niepoprawne. Warto zauważyć, że każda z tych niepoprawnych odpowiedzi wskazuje na brak zrozumienia zasad konwersji liczb ujemnych w systemie binarnym, co jest kluczowe w informatyce i programowaniu, a ich użycie w praktycznych aplikacjach mogłoby prowadzić do poważnych błędów w obliczeniach.

Pytanie 6

W jakiej fazie cyklu życia projektu informatycznego następuje integracja oraz testowanie wszystkich modułów systemu?

A. Faza analizy
B. Etap implementacji
C. Etap planowania
D. Faza wdrożenia
Planowanie to faza początkowa, w której określane są cele projektu, harmonogram i zasoby, ale nie jest to etap integracji systemu. Analiza skupia się na zbieraniu wymagań i definiowaniu specyfikacji technicznej, ale nie obejmuje łączenia modułów ani testowania gotowego produktu. Wdrożenie to końcowy etap cyklu życia projektu, który następuje po pełnej integracji i testowaniu – polega na uruchomieniu systemu w środowisku produkcyjnym i udostępnieniu go użytkownikom końcowym.

Pytanie 7

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

Pytanie 8

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

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

Pytanie 9

Która z poniższych metod HTTP jest idempotentna?

A. PATCH
B. POST
C. CONNECT
D. GET
Wybór metod HTTP, które nie są idempotentne, może prowadzić do zamieszania i nieporozumień w aplikacjach webowych. Metoda POST, w przeciwieństwie do GET, jest zazwyczaj stosowana do tworzenia nowych zasobów na serwerze. Każde wywołanie POST może prowadzić do utworzenia nowego wpisu lub zmiany stanu zasobu, co sprawia, że jest to operacja nieidempotentna. Przykładowo, korzystając z metody POST do przesyłania formularzy rejestracyjnych, każdy nowy użytkownik powoduje dodanie nowego wpisu do bazy danych. Z kolei metoda PATCH jest używana do częściowej aktualizacji istniejącego zasobu. W przypadku wielokrotnego zastosowania tej samej poprawki, stan zasobu może się zmieniać, co również klasyfikuje ją jako nieidempotentną. Dodatkowo, metoda CONNECT, służąca do nawiązywania tuneli przez serwer proxy, w typowym użyciu nie może być uznana za idempotentną, ponieważ jej działanie zależy od kontekstu i może prowadzić do różnych rezultatów przy wielokrotnym wywoływaniu. Dlatego, przy projektowaniu API, istotne jest zrozumienie różnicy między metodami idempotentnymi a nieidempotentnymi, aby uniknąć nieprzewidywalnych skutków i zapewnić spójność w interakcji z serwerem.

Pytanie 10

Kolor Pale Green w modelu RGB przedstawia się jako RGB(152, 251, 152). Jaki jest szesnastkowy kod tego koloru?

A. A0 FE A0
B. 98 FB 98
C. 98 FE 98
D. A0 FB A0
Prawidłowa odpowiedź to RGB(152, 251, 152) zapisane w systemie szesnastkowym jako 98 FB 98. To nie jest przypadkowe – konwersja formatu RGB na HEX polega na przekształceniu każdej ze składowych (czerwony, zielony, niebieski) na odpowiadającą wartość heksadecymalną. W tym przypadku: 152 to 98 w systemie szesnastkowym, 251 to FB, a 152 znowu 98. W praktyce, takie zapisy są absolutną podstawą przy projektowaniu stron internetowych, stylów CSS albo aplikacji mobilnych, gdzie kolory opisuje się właśnie kodami HEX. Moim zdaniem, każdy kto chce działać w grafice komputerowej albo frontendzie, powinien mieć ten mechanizm w jednym palcu. Warto wiedzieć, że standardy W3C przewidują właśnie taki sposób zapisu i przyjmują zarówno notację z #, jak i bez spacji, czyli #98FB98. Często spotkasz ten format np. w plikach stylów LESS, SASS czy nawet podczas korzystania z generatorów palet. Sam nieraz miałem sytuację, że szybka konwersja RGB na HEX ratowała projekt, bo klient przesłał kolory tylko w jednym systemie. Dobrą praktyką jest też zawsze sprawdzać, czy konwersja nie zniekształciła zamierzonego koloru – niektóre programy graficzne lub biblioteki mogą dokonywać zaokrągleń, co minimalnie wpływa na odcień. Warto więc nie tylko ufać narzędziom, ale rozumieć manualnie, jak się to liczy. No, i to co ciekawe – Pale Green jest kolorem dość uniwersalnym, często spotykanym w projektowaniu UI, bo jest delikatny i nie męczy wzroku. Szczerze polecam pobawić się konwersją różnych kolorów, bo to po prostu się przydaje.

Pytanie 11

Wynikiem wykonania poniższego fragmentu kodu jest wyświetlenie liczb z zakresu od 2 do 20, które są

for (let number = 2; number <= 20; number++) {
    let check = true;
    for (let test = 2; test < number; test++) {
        if (number % test === 0) {
            check = false;
            break;
        }
    }
    if (check) console.log(number);
}
A. pierwsze.
B. podzielne przez wartość zmiennej check.
C. parzyste.
D. podzielne przez wartość zmiennej test.
Podzielność przez zmienną test lub check oznacza, że liczby są wielokrotnościami określonej wartości, ale niekoniecznie są liczbami pierwszymi. Liczby parzyste to liczby dzielące się przez 2, co oznacza, że tylko 2 jest liczbą pierwszą w tym zbiorze. Algorytmy wykrywające liczby parzyste lub wielokrotności nie są używane do znajdowania liczb pierwszych, ponieważ ich zakres i zastosowanie są zupełnie inne.

Pytanie 12

Czym jest ochrona własności intelektualnej?

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

Pytanie 13

Jakie jest źródło błędu w podanym kodzie przez programistę?

class Dokument {
    public string nazwa;
    protected string autor;
}
// .... w kodzie funkcji main
Dokument doc = new Dokument();
Console.WriteLine(doc.autor);
A. Inicjalizacja obiektu została błędnie zapisana.
B. Argumenty konstruktora powinny być przekazane podczas inicjalizacji obiektu.
C. Brak konstruktora w definicji klasy.
D. Pole autor jest niedostępne z tego poziomu.
Brak konstruktora w definicji klasy nie jest błędem – jeśli konstruktor nie zostanie jawnie zdefiniowany, kompilator wygeneruje domyślny konstruktor bez parametrów. Błędna inicjalizacja obiektu lub brak argumentów w wywołaniu konstruktora mogą prowadzić do błędów kompilacji, ale nie mają związku z dostępem do prywatnych pól klasy. Problem polega na naruszeniu zasad dostępu do pól prywatnych, co jest rozwiązane poprzez odpowiednie mechanizmy dostępowe i stosowanie konwencji programistycznych, takich jak wzorzec projektowy getter-setter.

Pytanie 14

Jakie są główne cechy architektury klient-serwer?

A. Dane są przechowywane i przetwarzane na serwerze, a klient wysyła żądania i odbiera odpowiedzi
B. Każdy klient funkcjonuje niezależnie od pozostałych
C. Serwer pełni rolę pasywnego odbiorcy danych od klientów
D. Komunikacja odbywa się bezpośrednio między urządzeniami klienckimi
Architektura klient-serwer to model, w którym dane są przechowywane i przetwarzane na serwerze, a klient wysyła żądania i odbiera odpowiedzi. Model ten umożliwia centralizację zasobów, co prowadzi do łatwiejszego zarządzania aplikacjami i zwiększonego bezpieczeństwa. Klient-serwer jest podstawą działania aplikacji webowych, usług sieciowych oraz baz danych. Dzięki temu architektura ta umożliwia wielu użytkownikom jednoczesny dostęp do tych samych danych, co czyni ją wydajnym rozwiązaniem dla rozproszonych systemów informatycznych. Serwery mogą obsługiwać różne rodzaje klientów, takie jak przeglądarki, aplikacje mobilne czy urządzenia IoT, co sprawia, że jest to wszechstronny model stosowany w wielu branżach.

Pytanie 15

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

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

Pytanie 16

Jaki z wymienionych komponentów jest kluczowy do inicjalizacji pola klasy podczas tworzenia instancji obiektu?

A. Instrukcja warunkowa
B. Konstruktor
C. Metoda statyczna
D. Funkcja zaprzyjaźniona
Konstruktor jest niezbędny do inicjalizacji pól klasy podczas tworzenia nowego obiektu. Bez konstruktora obiekt mógłby zostać utworzony w stanie nieokreślonym, co może prowadzić do błędów w działaniu programu. Konstruktor automatycznie przypisuje wartości do pól lub wykonuje inne niezbędne operacje przygotowawcze. Przykład w C++: `class Samochod { public: Samochod() { marka = "Nieznana"; } }`. W tym przypadku konstruktor ustawia domyślną wartość dla pola `marka`, co eliminuje konieczność ręcznego przypisywania wartości po utworzeniu obiektu.

Pytanie 17

Przykład wywołania funkcji zamien w języku C++ może wyglądać w następujący sposób:

void zamien(int *a, int *b) {
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
A. zamien(&a, &b); // a, b - zmienne całkowite
B. zamien(12, 34)
C. zamien(m, n); // m, n - zmienne całkowite
D. zamien(*a, *b); // a, b - zmienne całkowite
W tym przypadku wywołanie zamien(&a, &b); jest prawidłowe, bo funkcja zamien oczekuje wskaźników do zmiennych całkowitych, nie samych wartości tych zmiennych ani ich referencji. Przekazując adresy przez &a i &b, pozwalamy funkcji modyfikować oryginalne zmienne, a nie ich kopie. To jest fundament operacji wskaźnikowych w C++. Takie podejście umożliwia tzw. przekazywanie przez adres, które jest wykorzystywane wszędzie tam, gdzie trzeba w funkcji podmienić faktyczną zawartość zmiennej, a nie tylko jej kopię. W praktyce, na przykład podczas sortowania tablic czy zamiany miejscami dwóch wartości, korzysta się właśnie z takiego mechanizmu. Przekazywanie wskaźników jest bardzo uniwersalne – pozwala nie tylko zmieniać wartości, ale też np. przekazywać duże struktury bez kopiowania całej ich zawartości, co przyspiesza program i zmniejsza zużycie pamięci. Moim zdaniem warto też zauważyć, że użycie wskaźników jest jednym z filarów programowania na niskim poziomie w C i C++. Wielu początkujących programistów boi się wskaźników (nie wiem czemu, chyba przez te wszystkie historie o błędach i segfaultach), ale jak się już zrozumie, dlaczego i jak przekazywać adresy zmiennych, to potem dużo łatwiej korzystać z bardziej zaawansowanych mechanizmów np. dynamicznej alokacji pamięci czy tablic wskaźników. Standard C++ wręcz zaleca, by wszędzie tam, gdzie funkcja ma zmienić przekazane wartości, używać wskaźników lub referencji. W tym przypadku wskaźniki są idealne, bo dokładnie tego wymaga deklaracja funkcji. Dobrze jest też znać różnicę między przekazywaniem przez wartość, wskaźnik i referencję, bo to pozwala świadomie projektować interfejsy funkcji.

Pytanie 18

Co to jest XSS (Cross-Site Scripting)?

A. Technika optymalizacji kodu JavaScript do zwiększenia wydajności strony
B. Luka bezpieczeństwa pozwalająca na wstrzyknięcie złośliwego kodu do stron przeglądanych przez innych użytkowników
C. Framework do tworzenia responsywnych stron internetowych
D. Protokół komunikacyjny używany w aplikacjach internetowych
Luka Cross-Site Scripting (XSS) jest często mylona z różnymi technikami i narzędziami stosowanymi w tworzeniu aplikacji webowych, co prowadzi do nieporozumień na temat jej rzeczywistego znaczenia i konsekwencji. Na przykład, techniki optymalizacji kodu JavaScript, które mogą wpływać na wydajność strony, nie mają nic wspólnego z zagrożeniami bezpieczeństwa wynikającymi z XSS. Optymalizacja kodu może poprawić czas ładowania strony, ale nie chroni przed atakami, które mogą wykorzystać luki w zabezpieczeniach. Ponadto, frameworki do tworzenia responsywnych stron internetowych, choć przydatne w projektowaniu, nie są instrumentami zapobiegającymi wstrzykiwaniu złośliwego kodu. Protokół komunikacyjny używany w aplikacjach internetowych również nie ma związku z XSS, ponieważ jest to podstawowy element technologii, który nie odnosi się bezpośrednio do bezpieczeństwa. Warto pamiętać, że ignorowanie zagrożeń związanych z XSS może prowadzić do poważnych incydentów bezpieczeństwa, dlatego kluczowe jest stosowanie sprawdzonych praktyk zabezpieczeń, takich jak sanitizacja danych wejściowych i monitorowanie aplikacji w celu wykrywania potencjalnych ataków.

Pytanie 19

Który element dokumentacji technicznej jest istotny dla ustalenia metod ochrony danych w aplikacji?

A. Koncepcja interfejsu użytkownika
B. Opis architektury klient-serwer
C. Harmonogram zarządzania zadaniami
D. System ochrony aplikacji
System zabezpieczeń aplikacji to kluczowy element specyfikacji technicznej, który określa metody ochrony danych. Obejmuje on takie elementy jak szyfrowanie, kontrola dostępu, uwierzytelnianie oraz autoryzacja. Prawidłowo zaprojektowany system zabezpieczeń zapewnia ochronę przed atakami hakerskimi, nieautoryzowanym dostępem oraz utratą danych. W aplikacjach webowych i mobilnych systemy zabezpieczeń obejmują również techniki takie jak dwuskładnikowe uwierzytelnianie (2FA), zabezpieczenia API oraz regularne audyty bezpieczeństwa. Implementacja solidnych mechanizmów zabezpieczeń jest niezbędna, aby zapewnić zgodność z regulacjami prawnymi i zyskać zaufanie użytkowników.

Pytanie 20

Który z wymienionych elementów interfejsu użytkownika jest charakterystyczny dla aplikacji działającej na komputerze?

A. Routing
B. Strona HTML
C. API REST
D. Przycisk (Button)
Przycisk, czyli ten mały element, co go klikamy w aplikacjach, to naprawdę ważna część interfejsu. Używamy go, żeby coś zainicjować, na przykład zapisać dane czy wywołać jakąś funkcję. Fajnie, że można go dowolnie ustawiać – zmieniać wygląd, rozmiar, a nawet to, jak się zachowuje. Dzięki temu pasuje do każdej aplikacji. W dzisiejszych programach, jak WPF, te przyciski mogą mieć różne kolorowe ikony albo nawet animacje, co sprawia, że aplikacja wygląda super. Generalnie, bez przycisków użytkownik by się w aplikacji nie połapał, bo to dzięki nim możemy nawigować, zatwierdzać formularze czy otwierać nowe okna dialogowe.

Pytanie 21

Jakie narzędzie jest używane do automatyzacji testów interfejsu użytkownika aplikacji webowych?

A. Selenium
B. Slack
C. Trello
D. JIRA
Pozostałe odpowiedzi, takie jak JIRA, Slack i Trello, nie są narzędziami przeznaczonymi do automatyzacji testów interfejsu użytkownika. JIRA to popularne narzędzie do zarządzania projektami, które często wykorzystuje się do śledzenia błędów i planowania zadań w zespołach programistycznych. Jest ono nieocenione w kontekście zarządzania cyklem życia aplikacji i usprawniania komunikacji w zespole, ale nie służy do automatyzacji testów. Slack natomiast to narzędzie do komunikacji zespołowej, które umożliwia szybką wymianę informacji i współpracę w czasie rzeczywistym. Choć może być używane do powiadomień o wynikach testów, nie jest narzędziem do ich automatyzacji. Trello, z kolei, to aplikacja do zarządzania projektami, która pomaga w organizacji zadań i pracy zespołowej za pomocą tablic i kart. Choć może wspomagać procesy zarządzania testami poprzez wizualizację postępów, nie jest narzędziem testowym samym w sobie. Często zdarza się, że osoby nowe w branży mylą narzędzia wspomagające zarządzanie projektami z narzędziami do testowania, co może prowadzić do nieporozumień. Warto więc zrozumieć ich różne zastosowania, by skutecznie wykorzystać każde z nich według ich przeznaczenia.

Pytanie 22

Co to jest WebSockets?

A. Metoda zabezpieczania połączeń HTTP
B. Format zapisu danych w bazach NoSQL
C. Protokół komunikacyjny zapewniający dwukierunkową komunikację między przeglądarką a serwerem
D. Biblioteka JavaScript do manipulacji danymi JSON
Inne odpowiedzi dotyczą różnych technologii, które nie są związane z WebSockets, co może prowadzić do błędnych wyobrażeń na temat ich funkcji. Na przykład, biblioteka JavaScript do manipulacji danymi JSON nie ma bezpośredniego związku z protokołem komunikacyjnym. JSON (JavaScript Object Notation) to format wymiany danych, który ułatwia przesyłanie obiektów między serwerem a klientem, ale nie zapewnia mechanizmu komunikacji w czasie rzeczywistym. Kolejną pomyłką jest myślenie, że WebSockets to format zapisu danych w bazach NoSQL. Bazy NoSQL mogą korzystać z różnych formatów danych, ale WebSockets koncentrują się na komunikacji, a nie na przechowywaniu czy formacie danych. Metoda zabezpieczania połączeń HTTP również nie dotyczy WebSockets. Chociaż z pewnością ważne jest, by zapewnić bezpieczeństwo połączeń (np. korzystając z HTTPS), WebSockets funkcjonują jako osobny protokół. Wiele osób może mylnie łączyć te koncepcje, co prowadzi do nieporozumień. Kluczowe jest zrozumienie, że WebSockets to narzędzie do efektywnej komunikacji w czasie rzeczywistym, a nie elementy związane z danymi czy bezpieczeństwem połączeń HTTP.

Pytanie 23

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
W pierwszej z niepoprawnych odpowiedzi wskazano, że sieci asynchroniczne wymagają synchronizacji zegarów. To stwierdzenie jest błędne, ponieważ sama definicja sieci asynchronicznych opiera się na braku konieczności synchronizacji zegarów. W sieciach tego typu, każdy element systemu działa niezależnie, co umożliwia bardziej elastyczne przesyłanie danych w porównaniu do sieci synchronicznych. W drugiej niepoprawnej odpowiedzi zasugerowano, że dane są przesyłane tylko w ustalonych ramach czasowych. Jest to charakterystyczne dla sieci synchronicznych, gdzie transmisja danych jest ściśle zorganizowana i wymaga precyzyjnego harmonogramu. W sieciach asynchronicznych, dane mogą być wysyłane w dowolnym momencie, co pozwala na efektywniejsze wykorzystanie pasma. Kolejna niepoprawna odpowiedź sugeruje, że sieci asynchroniczne są bardziej niezawodne niż sieci synchroniczne. Chociaż sieci asynchroniczne mają swoje zalety, jak większa elastyczność, nie można jednoznacznie stwierdzić, że są one bardziej niezawodne. Niezawodność sieci zależy od wielu czynników, takich jak jakość urządzeń, protokoły transmisji oraz warunki pracy, a nie tylko od charakterystyki asynchronicznej czy synchronicznej.

Pytanie 24

Która z wymienionych sytuacji stanowi naruszenie praw autorskich?

A. Używanie programu typu open-source zgodnie z warunkami licencji
B. Udostępnianie filmu objętego prawami autorskimi bez zgody właściciela
C. Tworzenie kopii zapasowej legalnie zakupionego programu
D. Nabycie licencji na oprogramowanie
Publikowanie filmu chronionego prawami autorskimi bez zgody właściciela jest naruszeniem praw autorskich. Prawa autorskie chronią twórców przed nieuprawnionym kopiowaniem, dystrybucją i rozpowszechnianiem ich dzieł. W przypadku filmów, muzyki czy oprogramowania, każde użycie bez odpowiednich licencji lub zgody właściciela jest niezgodne z prawem. Twórcy mają prawo do wynagrodzenia za swoją pracę, a naruszenia mogą skutkować wysokimi grzywnami, a nawet postępowaniem sądowym. Przestrzeganie praw autorskich wspiera rozwój kultury i technologii, chroniąc interesy twórców.

Pytanie 25

Które z wymienionych narzędzi najlepiej chroni dane na urządzeniach mobilnych?

A. Hasło ustawione na urządzeniu
B. Nieaktualne oprogramowanie
C. Szyfrowanie danych na urządzeniu
D. Zainstalowanie aplikacji rozrywkowych
Szyfrowanie danych na urządzeniu przenośnym to jedna z najskuteczniejszych metod zabezpieczania poufnych informacji. Szyfrowanie przekształca dane w formę, która jest nieczytelna dla osób nieposiadających odpowiedniego klucza deszyfrującego. Dzięki temu, nawet jeśli urządzenie zostanie zgubione lub skradzione, dane pozostają zabezpieczone przed nieautoryzowanym dostępem. Szyfrowanie to standardowa praktyka stosowana przez największe firmy technologiczne i jest zalecana we wszystkich urządzeniach przenośnych, takich jak laptopy i smartfony.

Pytanie 26

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 = x % y;
C. if (x > y) ...
D. x = tablica[6];
Pojawienie się komunikatu Exception in thread "main" java.lang.ArithmeticException: / by zero jest jednoznacznie powiązane z próbą wykonania operacji dzielenia lub modulo przez zero. Tymczasem nie każda operacja na liczbach czy tablicach w Javie prowadzi do takiego wyjątku. Przypisanie wartości do zmiennej, jak x = 0;, jest zupełnie bezpieczne i nie generuje żadnego wyjątku – to po prostu podstawowa operacja inicjalizacji. Podobnie konstrukcja warunkowa typu if (x > y) … sama w sobie nie wykonuje żadnych operacji arytmetycznych, a jedynie porównuje wartości. Tego rodzaju instrukcja nie może wygenerować ArithmeticException, bo nie ma tu dzielenia ani reszty z dzielenia. Często jednak intuicyjnie myli się wyjątki arytmetyczne z błędami związanymi z dostępem do elementów tablicy. Na przykład zapis x = tablica[6]; może prowadzić do IndexOutOfBoundsException, jeśli tablica ma mniej niż 7 elementów, ale to zupełnie inny typ błędu – dotyczy zakresu tablicy, a nie arytmetyki. Z mojego doświadczenia wynika, że taki błąd logiczny pojawia się, gdy programiści nie rozróżniają rodzajów wyjątków lub nie zapoznają się dokładnie z komunikatami błędów. Branżowym standardem jest zawsze analizować dokładnie stack trace błędów i rozróżniać, które operacje mogą generować jakie wyjątki, bo to pozwala lepiej projektować logikę obsługi błędów w aplikacjach. W Javie ArithmeticException to sygnał, że coś poszło nie tak z działaniem matematycznym, a nie z dostępem do pamięci czy porównywaniem wartości. Warto więc poświęcić chwilę na zrozumienie tego rozróżnienia – to się później bardzo opłaca w praktyce.

Pytanie 27

Który z podanych algorytmów można zrealizować zarówno w sposób iteracyjny, jak i rekurencyjny?

A. Algorytm wyszukiwania binarnego
B. Algorytm generowania liczb losowych
C. Algorytm sortowania bąbelkowego
D. Algorytm mapowania kluczy w tablicach asocjacyjnych
Algorytm wyszukiwania binarnego może być zaimplementowany zarówno iteracyjnie, jak i rekurencyjnie. Wyszukiwanie binarne polega na podzieleniu przeszukiwanej tablicy na dwie części i porównaniu elementu środkowego z wartością, której szukamy. Jeśli element nie zostanie znaleziony, algorytm przeszukuje jedną z połówek tablicy. Rekurencyjna wersja tego algorytmu jest często bardziej elegancka i prostsza w implementacji, natomiast iteracyjna bywa bardziej wydajna pod względem zużycia pamięci.

Pytanie 28

1 terabajt (TB) to ile gigabajtów (GB)?

A. 512
B. 1024
C. 1000
D. 2048
Odpowiedzi 1000, 2048 i 512 są błędne z różnych powodów. Zaczynając od 1000 – często spotykana w reklamach, zwłaszcza w kontekście dysków twardych, odnosi się do systemu dziesiętnego, gdzie 1 TB to 1 000 GB. Ale w informatyce to tak nie działa, bo 1 TB to 1024 GB, co może nieco mylić. Odpowiedź 2048 to też nie to, bo tu mamy do czynienia z pomyleniem jednostek – 2048 wynika z 2^11 i nie pasuje do terabajtów i gigabajtów. Na koniec, 512, to w ogóle nie gra, bo 512 MB to tylko 0,5 GB, co w porównaniu do 1 TB jest po prostu za małe. Dlatego warto ogarnąć te różnice między systemami binarnym i dziesiętnym, żeby dobrze wiedzieć, jak przeliczać jednostki pamięci.

Pytanie 29

Jakie oprogramowanie służy do monitorowania błędów oraz zarządzania projektami?

A. Jira
B. Jasmine
C. Bugzilla
D. Git
Bugzilla to narzędzie do śledzenia błędów, które skupia się głównie na identyfikacji oraz zarządzaniu defektami w oprogramowaniu. Choć może być używane w kontekście zarządzania projektami, jego funkcjonalności są ograniczone w porównaniu do kompleksowych rozwiązań, takich jak Jira. Bugzilla jest bardziej odpowiednie dla zespołów, które potrzebują prostszych narzędzi do śledzenia błędów, ale nie zapewnia takich możliwości zarządzania projektami jak Jira. Git to system kontroli wersji, który umożliwia zarządzanie kodem źródłowym, ale nie jest narzędziem do śledzenia błędów ani do zarządzania projektami jako takimi. Git pozwala programistom na współpracę i śledzenie zmian w kodzie, jednakże brakuje mu funkcji zarządzania projektami oraz integracji z procesami Agile, które są kluczowe w nowoczesnym rozwoju oprogramowania. Jasmine to framework do testowania jednostkowego aplikacji JavaScript, który koncentruje się na pisaniu testów i nie jest narzędziem do zarządzania projektami ani do śledzenia błędów. Pomimo że testowanie jednostkowe jest istotną częścią cyklu życia oprogramowania, Jasmine nie oferuje funkcjonalności związanych z zarządzaniem projektami, co czyni go nieodpowiednim w kontekście tego pytania.

Pytanie 30

Przedstawiony na filmie kod napisany w języku C++ nie kompiluje się. Co należy zmienić w tym kodzie, aby proces kompilacji wykonał się bez błędów?

A. poprawnie zapisać warunek w instrukcji if w linii 11, np. sprawdz(x)==true
B. naprawić błąd w funkcji sprawdz, który polega na braku nawiasów {} w pętli for
C. dodać deklarację funkcji sprawdz przed funkcją main
D. zadeklarować zmienną sprawdz przed jej wykorzystaniem w linii 11
Wielu początkujących programistów skupia się na szczegółach składniowych lub drobiazgach logicznych, kiedy pojawia się błąd kompilacji w C++. Jednak często przyczyną jest coś bardzo podstawowego, jak brak deklaracji funkcji przed jej użyciem. Jeśli chodzi o zapis warunku w instrukcji 'if', to kompilator nie zgłasza błędu, gdy używamy wyrażenia typu 'if (sprawdz(x))' – to całkowicie poprawna składnia, a dopisywanie '==true' jest redundantne i nie wnosi niczego nowego. Bardzo często widzę, że ktoś skupia się na tym, żeby warunek koniecznie porównywać do true, ale tak naprawdę to kwestia stylu, nie poprawności. Pozostawienie nawiasów klamrowych w pętli for jest oczywiście dobrą praktyką, ale ich brak nie zawsze generuje błąd kompilacji, jeśli pętla ma tylko jedną instrukcję. Kompilator C++ potrafi to rozpoznać i nie zgłasza błędu – sprowadza się to bardziej do czytelności i unikania błędów logicznych niż do samej poprawności kompilacji. Odpowiedź dotycząca deklarowania zmiennej 'sprawdz' to już nieporozumienie – 'sprawdz' to funkcja, a nie zmienna, więc nie deklarujemy jej w ten sposób. Ten błąd pokazuje, jak łatwo pomylić pojęcia w językach programowania, zwłaszcza jeśli dopiero zaczynamy przygodę z kodowaniem. Główna zasada, którą warto tu zapamiętać, to: każda funkcja używana przed jej zdefiniowaniem musi być zadeklarowana – to właśnie tego brakuje w typowym przykładzie z pytania. Bez deklaracji kompilator nie wie, jaką sygnaturę ma funkcja, a to skutkuje błędem już na poziomie kompilacji. Z mojego doświadczenia wynika, że takie drobne rzeczy potrafią skutecznie utrudnić życie, dlatego warto czytać komunikaty kompilatora i znać podstawowe zasady działania języka C++.

Pytanie 31

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

A. GDPR (RODO)
B. Creative Commons
C. DMCA
D. Open Source Initiative
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 32

Zamieszczony kawałek kodu w języku C# tworzy hasło. Wskaż prawdziwe stwierdzenie dotyczące cech tego hasła?

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

for(int i = 0; i < 8; i++)  {
    znak = pulaZnakow[random.Next(0, dlPuli)];
    wynik += znak;
}
A. Może zawierać małe i wielkie litery oraz cyfry.
B. Ma maksymalną długość 7 znaków, co ustala zmienna i.
C. Może zawierać małe oraz wielkie litery, cyfry i znaki specjalne.
D. Ma 8 znaków lub więcej i zawiera małe oraz wielkie litery, a także cyfry.
Analizując przedstawiony fragment kodu, możemy odrzucić kilka błędnych przekonań zawartych w proponowanych odpowiedziach. Niektóre błędne odpowiedzi sugerują, że hasło może zawierać symbole. Jednak przeglądając zmienną pulaZnakow, widać, że nie zawiera ona żadnych symboli specjalnych, a jedynie małe i wielkie litery oraz cyfry. Inne niepoprawne stwierdzenie mówi, że hasło może być co najwyżej 7-znakowe z powodu zmiennej i. W rzeczywistości, zmienna i wskazuje na iterację pętli kontrolowanej przez warunek i < 8, co oznacza, że hasło jest dokładnie 8-znakowe, a nie 7-znakowe lub krótsze. Kolejna niepoprawna sugestia dotyczy tego, że hasło jest dłuższe niż 8 znaków oraz zawiera symbole, co również jest niezgodne z analizą kodu. Ważne jest, aby rozumieć, jak działają pętle i jaka jest rola zmiennych w kodzie generacji haseł. W zaawansowanych systemach zabezpieczeń często dodaje się symbole specjalne do puli znaków, jednak ten konkretny kod tego nie czyni. Dobrze jest pamiętać, że w bezpieczeństwie kluczowa jest nie tylko długość hasła, ale także jego złożoność i różnorodność użytych znaków. Prawidłowa analiza kodu pozwala uniknąć błędnych założeń i dostarcza solidnych podstaw do zrozumienia mechanizmów generacji losowych haseł.

Pytanie 33

Jakie są kluczowe różnice pomiędzy strukturą (struct) a unią (union) w języku C?

A. Unia umożliwia dynamiczne przypisywanie typów danych, struktura natomiast nie
B. Unia nie jest obsługiwana przez kompilatory współczesnych języków
C. Struktura przechowuje wiele wartości równocześnie, unia tylko jedną
D. Struktura wymaga więcej miejsca w pamięci niż unia
Unia nie pozwala na dynamiczne typowanie danych – typ każdego pola jest zdefiniowany w czasie kompilacji, podobnie jak w strukturze. Struktura nie zajmuje więcej pamięci niż unia – zajmuje dokładnie tyle miejsca, ile potrzeba na przechowywanie wszystkich pól jednocześnie. Twierdzenie, że unia nie jest wspierana przez nowoczesne kompilatory, jest błędne – unie są integralną częścią standardu C i są szeroko wspierane we współczesnych środowiskach programistycznych.

Pytanie 34

Technika konstruowania algorytmu polegająca na rozbiciu na dwa lub więcej mniejszych podproblemów, aż do momentu, gdy ich części będą wystarczająco proste do bezpośredniego rozwiązania, nosi nazwę:

A. dziel i zwyciężaj
B. najkrótszej trasy
C. heurystycznej
D. komiwojażera
W pytaniu pojawiły się odpowiedzi, które dość często mylą się osobom zaczynającym z algorytmiką, ale każda z nich odnosi się do innych pojęć niż te związane z rozbijaniem problemów na mniejsze podzadania. Najkrótsza trasa to raczej rodzaj konkretnego problemu optymalizacyjnego, a nie technika konstruowania algorytmu – tutaj przykładem jest choćby problem znajdowania najkrótszej ścieżki w grafie, który można rozwiązywać różnymi sposobami, nie tylko „dziel i zwyciężaj”, i zdecydowanie nie jest to samodzielna metoda konstruowania algorytmu. Odpowiedź heurystyczna sugeruje podejście oparte bardziej na przybliżeniach niż na systematycznym rozkładaniu na podproblemy – w praktyce heurystyki stosuje się tam, gdzie nie da się lub nie opłaca znaleźć idealnego rozwiązania, a nie do klasycznego podziału problemu na prostsze części. Komiwojażer z kolei to nazwa jednego, bardzo znanego problemu NP-trudnego (problem komiwojażera, TSP – travelling salesman problem), który można próbować rozwiązywać na rozmaite sposoby, m.in. heurystykami, metodami przybliżonymi, czasem nawet „dziel i zwyciężaj”, ale sama nazwa nie opisuje techniki konstrukcji algorytmów, tylko konkretne zadanie. Moim zdaniem często spotykanym błędem jest utożsamianie nazw znanych algorytmów czy problemów z metodami rozwiązywania – to dwie różne sprawy. Warto pamiętać, że w praktyce, kiedy wybieramy technikę algorytmiczną, najpierw określamy rodzaj problemu i wtedy dobieramy właściwe narzędzie, a nie na odwrót. Dobrą branżową praktyką jest rozpoznanie, czy problem nadaje się do rozbicia na mniejsze części i wtedy właśnie wybiera się „dziel i zwyciężaj” – pozostałe odpowiedzi tego nie zapewniają.

Pytanie 35

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

String a = "hello";
String b = "hello";
String c = new String("hello");
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a.equals(c));
A. true, false, false
B. true, false, true
C. false, false, true
D. true, true, true
Wyniki, które wskazują, że zarówno porównanie 'a == c', jak i 'a.equals(c)' powinny zwracać 'true', opierają się na błędnym zrozumieniu, jak działa porównywanie obiektów w Javie. Warto zrozumieć, że operator '==' sprawdza, czy dwie referencje wskazują na ten sam obiekt w pamięci. W przypadku zmiennych 'a' i 'b', ponieważ obie są literałami tego samego ciągu, JVM optymalizuje ich przechowywanie, co skutkuje, że obie referencje prowadzą do tego samego obiektu. Natomiast zmienna 'c', utworzona za pomocą 'new String()', to zupełnie inny obiekt, mimo że jego wartość jest taka sama jak w 'a'. W związku z tym porównanie 'a == c' zwraca false. Z kolei metoda 'equals()' jest zaprojektowana do porównania wartości, a nie referencji, co oznacza, że 'a.equals(c)' zwróci true, ponieważ obie zmienne mają tę samą zawartość. Zrozumienie tych zasad jest kluczowe, aby unikać typowych pułapek przy pracy z obiektami w Javie. Pamiętaj, aby zawsze preferować 'equals()' do porównywania stringów i innych obiektów, aby uzyskać prawidłowe wyniki.”

Pytanie 36

Wskaż fragment kodu, który wykreuje przedstawioną kontrolkę?

Ilustracja do pytania
A. Kod1
B. Kod3
C. Kod2
D. Kod4
Rozpatrując pozostałe opcje można zauważyć kilka błędnych koncepcji które należy wyjaśnić. Kod1 wykorzystuje klasę SearchView która służy do wyszukiwania nie jest jednak przeznaczona do wyświetlania ocen w formie gwiazdek. SearchView nie posiada mechanizmów ani atrybutów pozwalających na wizualizację ocen co oznacza że wybór tego kodu jest pomyłką wynikającą z mylnego zrozumienia funkcji tej kontrolki. Kod2 to ProgressBar który służy do wyświetlania postępu zadań takich jak ładowanie danych. Mimo że ProgressBar potrafi pokazywać poziom zaawansowania to jego forma jest zupełnie inna i nie jest używana do prezentacji ocen w skali gwiazdkowej. Jest to kontrolka dynamiczna której głównym celem jest przedstawianie zmiany stanu a nie stałe wizualizacje. Kod4 z kolei dotyczy klasy Switch co jest elementem UI używanym do przełączania stanów takich jak włączanie i wyłączanie funkcji. Switch nie ma nic wspólnego z ocenami ani wizualizacją skali. Wybór tego kodu mógłby wynikać z mylnego założenia że kontrolka ta może być stosowana do interaktywnego wyboru lecz jej funkcjonalność nie obejmuje ocen. Podsumowując błędne odpowiedzi wynikają z fundamentalnego niezrozumienia specyfiki i zastosowania właściwych kontrolek w Androidzie. Każda z nich ma swoje unikalne przeznaczenie i nie zastąpi funkcji RatingBar w kontekście wizualizacji ocen w postaci gwiazdek standardowego elementu aplikacji mobilnych do zbierania informacji zwrotnej od użytkowników.

Pytanie 37

Które z poniższych jest podstawowym rodzajem testów używanych w testowaniu jednostkowym?

A. Testy systemowe
B. Testy integracyjne
C. Testy jednostkowe
D. Testy akceptacyjne
Pozostałe rodzaje testów, mimo że są istotne w procesie testowania oprogramowania, nie są podstawowymi elementami testowania jednostkowego. Testy integracyjne mają na celu sprawdzenie, czy różne moduły systemu współpracują ze sobą poprawnie. Są one wykonywane po testach jednostkowych i skupiają się na interakcjach między komponentami. Testy systemowe to kolejny poziom testowania, który bada cały zintegrowany system pod kątem zgodności z wymaganiami. Są one szeroko zakrojone i testują zarówno funkcjonalność, jak i niefunkcjonalne aspekty systemu, takie jak wydajność czy bezpieczeństwo. Testy akceptacyjne to ostatnia faza testowania, w której sprawdza się, czy system spełnia kryteria akceptacji i jest gotowy do wdrożenia. Są one często wykonywane przez końcowych użytkowników lub klientów, aby upewnić się, że system spełnia ich potrzeby i oczekiwania. Wszystkie te formy testowania są ważne, ale nie zastępują testów jednostkowych, które są fundamentem weryfikacji poprawności poszczególnych części kodu. Typowym błędem jest myślenie, że można całkowicie polegać na testach wyższego poziomu, zaniedbując testy jednostkowe, co może prowadzić do trudnych do wykrycia błędów w późniejszych etapach projektów.

Pytanie 38

Jakie jest główne zadanie debuggera w środowisku programowania?

A. Generowanie plików wykonywalnych
B. Analiza i usuwanie błędów w kodzie
C. Kompilowanie kodu źródłowego
D. Tworzenie kodu źródłowego
Pisanie kodu źródłowego jest podstawową funkcją edytora kodu, a nie debuggera. Tworzenie plików wykonywalnych odbywa się za pomocą kompilatora, a nie debuggera. Kompilowanie kodu to proces tłumaczenia kodu źródłowego na język maszynowy i również nie jest funkcją debuggera, choć debugger może współpracować z kompilatorem w trakcie analizy błędów. Pominięcie debuggera w procesie tworzenia aplikacji mogłoby prowadzić do błędów w finalnym produkcie, dlatego jego rola jest kluczowa na etapie testowania i optymalizacji kodu.

Pytanie 39

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

A. RAD nie oferuje żadnych narzędzi do debugowania
B. RAD koncentruje się tylko na testowaniu programów
C. RAD funkcjonuje tylko w systemach operacyjnych Linux
D. RAD pozwala na szybkie tworzenie prototypów i rozwijanie aplikacji przy minimalnej ilości kodu
Twierdzenie, że RAD skupia się wyłącznie na testowaniu kodu, jest błędne – jego głównym celem jest szybkie tworzenie aplikacji, a nie jedynie testowanie. Brak narzędzi do debugowania to również nieprawdziwa informacja, ponieważ narzędzia RAD oferują pełne wsparcie dla debugowania i testowania aplikacji w trakcie ich rozwoju. Stwierdzenie, że RAD działa tylko na systemach operacyjnych typu Linux, jest niezgodne z rzeczywistością – narzędzia RAD działają zarówno na Windows, macOS, jak i Linux, co czyni je uniwersalnym rozwiązaniem dla szerokiej gamy deweloperów.

Pytanie 40

Jakie z przedstawionych rozwiązań może pomóc w unikaniu porażeń prądem w biurze?

A. Kontrolowanie jakości powietrza
B. Systematyczne sprawdzanie instalacji elektrycznych
C. Stosowanie monitorów LCD
D. Wykorzystanie foteli o ergonomicznym kształcie
Użycie ergonomicznych foteli poprawia komfort pracy i zapobiega bólom kręgosłupa, ale nie chroni przed zagrożeniami elektrycznymi. Monitorowanie jakości powietrza jest istotne dla zdrowia układu oddechowego, ale nie ma wpływu na bezpieczeństwo elektryczne. Używanie ekranów LCD zmniejsza zmęczenie oczu i redukuje promieniowanie, jednak nie zapobiega porażeniom prądem. Bezpieczeństwo elektryczne wymaga odpowiedniej konserwacji i testowania instalacji, a nie tylko poprawy ergonomii stanowiska pracy.