Wyniki egzaminu

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

Egzamin zdany!

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

Wymagane minimum: 20 punktów (50%)

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

Jaką cechą charakteryzuje się sieć asynchroniczna?

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

Pytanie 2

Jakie jest oznaczenie normy międzynarodowej?

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

Pytanie 3

Co to jest XSS (Cross-Site Scripting)?

A. Luka bezpieczeństwa pozwalająca na wstrzyknięcie złośliwego kodu do stron przeglądanych przez innych użytkowników
B. Protokół komunikacyjny używany w aplikacjach internetowych
C. Technika optymalizacji kodu JavaScript do zwiększenia wydajności strony
D. Framework do tworzenia responsywnych stron 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 4

Który z poniższych przypadków stanowi test niefunkcjonalny?

A. Testowanie wydajności aplikacji pod dużym obciążeniem
B. Weryfikacja poprawności logowania użytkownika
C. Sprawdzenie działania przycisku
D. Sprawdzenie obsługi formularza rejestracji
Testowanie wydajności aplikacji pod dużym obciążeniem to przykład testu niefunkcjonalnego. Jego celem jest ocena, jak aplikacja zachowuje się przy dużej liczbie użytkowników lub operacji jednocześnie. Testy te pozwalają na identyfikację wąskich gardeł i optymalizację kodu oraz infrastruktury serwerowej. W ramach testów obciążeniowych analizowane są parametry takie jak czas odpowiedzi, zużycie zasobów (CPU, RAM) oraz stabilność aplikacji w warunkach skrajnego obciążenia. Testowanie wydajności jest kluczowe w aplikacjach webowych, e-commerce oraz systemach o dużej liczbie transakcji, gdzie każdy przestój może generować straty finansowe i negatywnie wpływać na doświadczenia użytkownika.

Pytanie 5

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

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

Pytanie 6

Jakie są różnice między konstruktorem a zwykłą metodą w klasie?

A. Konstruktor zawsze nosi tę samą nazwę co klasa i nie zwraca wartości
B. Konstruktor powinien zwracać jakąś wartość
C. Konstruktor można wywołać bez konieczności tworzenia obiektu
D. Konstruktor jest uruchamiany jedynie przez destruktor
Konstruktor różni się od zwykłych metod klasy tym, że nosi taką samą nazwę jak klasa i nie zwraca żadnej wartości, nawet `void`. Konstruktor jest wywoływany automatycznie podczas tworzenia obiektu i nie można go wywołać ręcznie jak zwykłą metodę. Jego zadaniem jest inicjalizacja pól obiektu i przygotowanie go do działania. Przykład w C++: `class Samochod { public: Samochod() { marka = "Ford"; } }`. W przeciwieństwie do innych metod konstruktor nie wymaga deklaracji typu zwracanego, co jest jedną z jego najbardziej charakterystycznych cech.

Pytanie 7

Jakie działanie wykonuje polecenie "git pull"?

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

Pytanie 8

Wskaż poprawny pod względem składniowym kod dla formatu JSON, który jest używany do wymiany danych między backendem a frontendem aplikacji.

osoby: [
  {imię: 'Anna', wiek: '31' },
  {imię: 'Krzysztof', wiek: '25' }
]
"osoby": [
  {"imię": "Anna", "wiek": 31 },
  {"imię": "Krzysztof", "wiek": 25 }
]
Kod 1Kod 2
<osoby>
  <imie>Anna</imie>
  <wiek>31</wiek>
  <imie>Krzysztof</imie>
  <wiek>25</wiek>
</osoby>
struct osoby {
  imie: {Anna}, wiek:{31};
  imie: {Krzysztof}, wiek:{25}
};
Kod 3Kod 4
A. Kod4
B. Kod3
C. Kod2
D. Kod1
Kod1 niestety jest błędny. W JSON klucze i wartości muszą być w podwójnych cudzysłowach, a nie w pojedynczych. Pojedyncze cudzysłowy tutaj nie działają i będą powodować błąd podczas próby parsowania. Kod3 to nie JSON, tylko przykład XML, który używa znaczników do oznaczania danych, ale w kontekście JSON nie pasuje. Kod4 z kolei przypomina bardziej zapis w jakimś języku programowania, na przykład C. Używasz składni, której parsery JSON nie rozpoznają, bo brakuje nawiasów klamrowych i podwójnych cudzysłowów. Często błędy w JSON wynikają z niewłaściwego użycia znaków interpunkcyjnych i złego formatowania, co może prowadzić do problemów z działaniem aplikacji. Dlatego naprawdę warto zadbać o poprawną składnię JSON, żeby wszystko działało bez zarzutów.

Pytanie 9

Diagram Gantta, który został zaprezentowany, odnosi się do projektu IT. Przyjmując, że każdy członek zespołu posiada odpowiednie kompetencje do realizacji każdego z zadań, a każde zadanie może być przypisane tylko jednej osobie, która poświęca na nie pełen dzień pracy, to minimalna liczba osób w zespole wynosi

Ilustracja do pytania
A. 2 osoby
B. 4 osoby
C. 1 osobę
D. 5 osób
Diagram Gantta to narzędzie wizualne używane do planowania i zarządzania projektami. Pokazuje harmonogram zadań w czasie. Na przedstawionym diagramie mamy pięć zadań projektowych: Projekt aplikacji Grafika Strona WWW Aplikacja front-end i Aplikacja back-end. Aby określić minimalną liczbę osób potrzebnych do realizacji projektu należy zidentyfikować które zadania mogą być realizowane równocześnie. Z diagramu wynika że w pierwszym tygodniu (1.02 - 7.02) realizowane są zadania Projekt aplikacji i Grafika które wymagają dwóch osób. W kolejnych tygodniach zadania są ułożone tak by unikać nakładania się co oznacza że w każdej kolejnej fazie projektu można kontynuować prace przydzielając jedną osobę do każdego zadania. Dlatego minimalna liczba osób wymagana do realizacji tego projektu to dwie. Taki sposób planowania jest zgodny z zasadami efektywnego zarządzania zasobami w projektach informatycznych co pozwala na optymalne wykorzystanie czasu i umiejętności zespołu. Zastosowanie metody diagramu Gantta jest powszechną praktyką w branży IT pozwalającą na lepsze zobrazowanie zależności i potrzeb kadrowych w projektach.

Pytanie 10

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

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

Pytanie 11

Jakiego rodzaju zmiennej użyjesz w C++, aby przechować wartość "true"?

A. tekst
B. bool
C. liczba całkowita
D. liczba zmiennoprzecinkowa
Typ danych 'bool' w języku C++ jest przeznaczony do przechowywania wartości 'true' lub 'false'. Deklaracja 'bool isReady = true;' to przykład poprawnego przypisania wartości logicznej do zmiennej. Typ boolean jest kluczowy w warunkach decyzyjnych, pętlach i operacjach porównawczych. W programowaniu typ 'bool' jest wykorzystywany do kontroli przepływu programu, obsługi wyjątków oraz sprawdzania poprawności danych. Użycie booleanów w kodzie zwiększa jego czytelność i pozwala na bardziej przejrzyste budowanie logiki aplikacji.

Pytanie 12

Który z wymienionych dokumentów jest najczęściej stosowany w zarządzaniu pracą zespołu Scrum?

A. Product backlog
B. Specyfikacja techniczna
C. Lista zasobów ludzkich
D. Diagram Gantta
Diagram Gantta jest fajnym narzędziem do pokazywania harmonogramu, ale nie ma go w zarządzaniu backlogiem. Specyfikacja techniczna to co innego – tam są szczegóły implementacyjne, a nie priorytety funkcji. Lista zasobów ludzkich to temat o zarządzaniu personelem, a nie o zadaniach i priorytetach w Scrumie. Więc tu bardziej musisz uważać na to, co do czego pasuje.

Pytanie 13

Jaką instrukcję należy wykorzystać do poprawnej deklaracji zmiennej typu string w C++?

A. string name = "Jan"
B. bool name = "Jan"
C. int name = "Jan"
D. float name = "Jan"
Ta deklaracja 'string name = "Jan"' to naprawdę dobry sposób na zdefiniowanie zmiennej łańcuchowej w C++. Wiesz, 'string' to typ danych, 'name' to nazwa tej zmiennej, a 'Jan' to wartość, która jest jej przypisana. Typ 'string' jest częścią biblioteki <string> i daje nam wiele możliwości, gdy pracujemy z tekstem. Możemy łączyć, porównywać i modyfikować różne łańcuchy znaków bez większego problemu. To jest mega ważne w aplikacjach, które mają do czynienia z danymi tekstowymi, interfejsami użytkownika czy analizą danych, które wprowadzamy.

Pytanie 14

Podana deklaracja zmiennych w języku JAVA zawiera

String imie = "Anna";
short wiek = 12;
int i = 0;
char plec = 'K';
boolean jestUczniem = true;
A. jedną zmienną typu tekstowego, dwie całkowite, jedną znakową i jedną logiczną
B. jedną zmienną typu tekstowego, jedną rzeczywistą, jedną całkowitą, jedną znakową oraz jedną logiczną
C. dwie zmienne typu tekstowego, dwie całkowite oraz jedną logiczną
D. dwie zmienne o typie strukturalnym
Zależnie od odpowiedzi, pojawiają się różne błędne założenia dotyczące typów danych w języku Java. W pierwszej opcji pada stwierdzenie o dwóch zmiennych tekstowych – to nie jest prawda, bo tylko jedna zmienna (imie) została zadeklarowana jako String. Również liczba zmiennych całkowitych jest tutaj przeceniona, gdyż short oraz int to dwa różne typy całkowite, ale są tylko dwa, nie więcej. Przypisanie plec do kategorii tekstowych to częsty błąd – char w Javie to typ znakowy, nie tekstowy, co widać po pojedynczym apostrofie wokół litery. To typ bardzo specyficzny, używany głównie do przechowywania pojedynczego znaku, a nie całych tekstów. W drugiej odpowiedzi pojawia się sformułowanie o typach strukturalnych – w kontekście Javy jest to nieprecyzyjne i raczej błędne, bo typy strukturalne (w sensie struktur znanych np. z języka C) nie występują w tej formie w Javie. String jest co prawda klasą, a więc typem referencyjnym, ale nie jest to struktura w klasycznym rozumieniu. W czwartej odpowiedzi podano jedną zmienną rzeczywistą, co zupełnie nie ma odzwierciedlenia w kodzie – typy rzeczywiste w Javie to float lub double, a żadna z zadeklarowanych zmiennych takiego typu nie posiada. W moim odczuciu te pomyłki bardzo często wynikają z mylenia typów podstawowych z typami referencyjnymi albo z braku znajomości podstawowej składni języka. Czasami też uczniowie utożsamiają pojedynczy znak z tekstem, bo w potocznym rozumieniu to przecież "litera". Jednak w programowaniu ta precyzja jest kluczowa, bo od różnicy między char i String zależą metody, które możemy użyć oraz ilość zajmowanej pamięci. Warto za każdym razem dokładnie sprawdzać, jakiego typu używamy, bo to rzutuje na cały późniejszy kod i możliwości jego rozwoju. Praktyka pokazuje, że błędne założenia na tym etapie mogą bardzo utrudnić pracę nad większym projektem, a korekta typów nie zawsze jest szybka i bezbolesna.

Pytanie 15

Jakie cechy powinien posiadać skuteczny negocjator?

A. asertywność, pesymizm, buta
B. intuicja, cierpliwość, asertywność
C. lojalność, nieśmiałość, uczciwość
D. dobra reputacja, przekora, porywczość
Skuteczny negocjator powinien mieć zestaw cech, które pozwolą mu osiągać kompromisy, rozwiązywać konflikty i dążyć do korzystnych rozwiązań dla obu stron. Intuicja pozwala wyczuć nastroje rozmówcy, wychwycić niewerbalne sygnały i przewidywać możliwe zagrożenia czy okazje jeszcze zanim druga strona je wprost zasygnalizuje. Cierpliwość jest kluczowa, bo proces dochodzenia do porozumienia bywa żmudny, a presja czasu często prowadzi do pochopnych decyzji. Często miałem okazję obserwować, że ci, którzy potrafią zaczekać na ruch drugiej strony, zyskują przewagę negocjacyjną. Asertywność natomiast pozwala jasno wyrażać swoje oczekiwania i granice, bez agresji i bez uległości – to klasyka wśród dobrych praktyk negocjacyjnych, choć nadal niedoceniana w wielu branżach. Asertywność pomaga uniknąć niedomówień i manipulacji, a także buduje szacunek. W praktyce, na sali negocjacyjnej czy nawet przy codziennych rozmowach z klientami, zestaw tych trzech cech daje naprawdę mocną pozycję. Moim zdaniem nie ma jednego uniwersalnego szablonu, ale właśnie intuicja, cierpliwość i asertywność pojawiają się prawie zawsze w podręcznikach czy na szkoleniach dedykowanych profesjonalistom. Warto je ćwiczyć na co dzień, nawet poza pracą, bo to się po prostu opłaca.

Pytanie 16

Jakie jest rozwiązanie dla dodawania binarnego liczb 1011 oraz 110?

A. 10101
B. 10001
C. 11101
D. 11001
W analizie błędnych odpowiedzi, pierwsza niepoprawna odpowiedź 11001 wynika z błędu w dodawaniu ostatniej kolumny. Osoba, która udzieliła tej odpowiedzi, mogła popełnić pomyłkę, nie uwzględniając przeniesienia z drugiej kolumny. W systemie binarnym nie można uzyskać wyniku 11001, ponieważ suma 0 + 1 w ostatnich kolumnach prowadzi do przeniesienia, a nie do dodania wartości. Druga propozycja, 10101, może być efektem pomylenia wartości i przeniesień w trakcie dodawania. Wartości w odpowiednich kolumnach są zinterpretowane niepoprawnie. Tutaj również brakuje uwzględnienia przeniesienia, co prowadzi do wyniku, który nie odzwierciedla rzeczywistego sumowania w systemie binarnym. Ostatnia niepoprawna odpowiedź, 11101, zawiera błąd związany z dodawaniem wartości bez przeniesienia. Sumowanie 1 + 1 w drugiej kolumnie prowadzi do 0 z przeniesieniem, co zostało pominięte. W każdej z tych odpowiedzi występuje zrozumienie błędów w arytmetyce binarnej, które są fundamentalne dla prawidłowego obliczania w systemach cyfrowych.

Pytanie 17

Co to jest SQL injection?

A. Technika ataku polegająca na wstrzyknięciu złośliwego kodu SQL do zapytania
B. Proces automatyzacji tworzenia zapytań SQL
C. Narzędzie do importowania danych do bazy SQL
D. Metoda optymalizacji zapytań SQL w bazach danych
SQL injection to technika ataku, polegająca na wstrzyknięciu złośliwego kodu SQL do zapytań, które są przetwarzane przez aplikacje bazodanowe. Atakujący wykorzystuje luki w zabezpieczeniach aplikacji, aby wprowadzić własne instrukcje SQL, które są następnie wykonywane przez bazę danych. Na przykład, jeśli aplikacja nie waliduje poprawnie danych wprowadzanych przez użytkownika, napastnik może wprowadzić złośliwy kod w miejsce oczekiwanego wejścia. Taki atak może prowadzić do ujawnienia poufnych danych, a nawet pełnej kontroli nad bazą danych. Ważne jest, aby stosować tzw. 'prepared statements' oraz 'parameterized queries', co znacząco obniża ryzyko tego typu ataków. Zgodnie z najlepszymi praktykami bezpieczeństwa, aplikacje powinny być regularnie testowane pod kątem podatności na SQL injection, a także powinny stosować odpowiednie mechanizmy autoryzacji i walidacji, aby minimalizować ryzyko wykorzystania takich technik.

Pytanie 18

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

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

Pytanie 19

W zaprezentowanym kodzie stworzono abstrakcyjną klasę figura oraz klasę prostokąta, która dziedziczy po niej, zawierającą zdefiniowane pola i konstruktory. Wskaż minimalną wersję implementacji sekcji /* metody klasy */ dla klasy Prostokat:

abstract class Figura
{
    abstract double Pole();
    abstract double Obwod();
}

public class Prostokat extends Figura
{
    private double a;
    private double b;

    ... /* Konstruktory */
    ... /* Metody klasy */
}
AB
public double Pole() {
    return a * b;
}

public double Obwod() {
    return 2*a + 2*b;
}
public double Pole() {
    return a * b;
}
CD
public double LiczPole()
{
    return a * b;
}

public double LiczObwod()
{
    return 2*a + 2*b;
}
abstract double Pole()
{
    return a * b;
}

abstract double LiczObwod()
A. C
B. D
C. B
D. A
W tej sytuacji odpowiedź A to zdecydowanie najlepszy wybór. Dlaczego? Klasa Prostokat dziedziczy po abstrakcyjnej Figurze, która wymusza zaimplementowanie dwóch metod abstrakcyjnych: Pole() oraz Obwod(). W Javie (bo składnia sugeruje właśnie ją), jeżeli klasa nie zaimplementuje wszystkich metod abstrakcyjnych odziedziczonych po klasie abstrakcyjnej, sama musi być oznaczona jako abstract, a tu przecież Prostokat ma być konkretną klasą. Wersja A pokazuje dokładnie te dwie metody, z odpowiednimi nazwami, typami zwracanymi i poprawną logiką obliczeń: pole prostokąta to a * b, a obwód to 2*a + 2*b. Taki sposób pisania jest zgodny ze sztuką programowania obiektowego – spełniamy wymagania kontraktu narzuconego przez klasę bazową, implementujemy tylko to, co jest wymagane i w taki sposób, by użytkownik klasy mógł od razu wykorzystywać instancję Prostokata do obliczeń. Takie podejście bardzo ułatwia późniejsze rozbudowywanie projektu i współpracę z innymi programistami, bo każdy od razu wie, że Pole() i Obwod() są częścią wspólnego interfejsu wszystkich Figur. Moim zdaniem, w realnych projektach często się z czymś takim spotyka – jeśli tylko mamy dziedziczenie po klasie abstrakcyjnej, zawsze trzeba pamiętać o tych narzuconych metodach. Warto też zauważyć, że brak zbędnych dodatków – np. nadmiarowych metod czy zmienionych nazw – minimalizuje szansę na pomyłki i nieporozumienia w zespole. Tak w praktyce robi się solidną, czytelną bazę pod hierarchię figur geometrycznych.

Pytanie 20

Jakie są cechy biblioteki statycznej w zestawieniu z dynamiczną?

A. Może być zmieniana w czasie działania programu
B. Jest wczytywana do pamięci podczas działania aplikacji
C. Zostaje dodana do pliku wykonywalnego w trakcie kompilacji
D. Nie potrzebuje obecności pliku wykonywalnego
Biblioteka statyczna jest dołączana do pliku wykonywalnego podczas procesu kompilacji. Oznacza to, że jej kod staje się integralną częścią aplikacji, co eliminuje konieczność ładowania jej w czasie wykonywania programu. Tego typu biblioteki charakteryzują się większym rozmiarem pliku wynikowego, ale oferują wyższą wydajność, ponieważ wszystkie funkcje są dostępne lokalnie, bez dodatkowych operacji ładowania. Przykładami bibliotek statycznych są pliki .lib w C/C++.

Pytanie 21

W obrębie klasy pracownik zdefiniowano następujące metody:

pracownik() { ... }
static void wypisz() { ... }
int operator== (const pracownik &prac) { ... }
~pracownik() { ... }
Którą z nich można, zgodnie z jej funkcją, rozszerzyć o element diagnostyczny o treści:
cout << "Obiekt został usunięty";
A. wypisz
B. operator==
C. pracownik
D. ~pracownik
Wybranie destruktora ~pracownik do umieszczenia komunikatu diagnostycznego o usunięciu obiektu jest jak najbardziej słuszne i zgodne z praktykami programowania obiektowego w C++. To właśnie destruktor odpowiada za wykonywanie wszelkich czynności „na pożegnanie” obiektu, czyli w momencie jego zwalniania z pamięci. Właśnie tu umieszcza się takie rzeczy jak logowanie faktu usunięcia, czyszczenie zasobów zewnętrznych czy zwalnianie pamięci dynamicznej. W praktyce, gdy zadeklarujemy cout << "Obiekt został usunięty"; w destruktorze, będziemy mieli jasny sygnał przy każdym końcu życia obiektu, co świetnie nadaje się do diagnostyki i szukania błędów w zarządzaniu pamięcią. Moim zdaniem każdy programista, nawet początkujący, powinien chwilę pobawić się takimi komunikatami, żeby lepiej zrozumieć, kiedy dokładnie destruktor jest wołany (np. przy wyjściu ze scope’u, delete, końcu programu itp.). To też dobry sposób, żeby wychwycić niechciane wycieki pamięci lub zrozumieć, dlaczego obiekt nie został jeszcze usunięty. Wzorce projektowe, takie jak RAII, wręcz opierają się na działaniu destruktorów. W branży często stosuje się podobne rozwiązania do debugowania problematycznych fragmentów kodu. Ogólnie rzecz biorąc, umieszczanie komunikatów w destruktorze jest praktycznym i polecanym sposobem na rozpoznanie cyklu życia obiektu – i to w każdej większej aplikacji C++.

Pytanie 22

Które z wymienionych działań, które są częścią procesu kreowania prostej galerii zdjęć w formie aplikacji mobilnej, powinno być realizowane przez zespół?

A. Przygotowanie testu jednostkowego dla funkcji przegladajZdjecia()
B. Wdrożenie funkcji dodajZdjecie()
C. Przygotowanie i konfiguracja repozytorium dla projektu
D. Stworzenie dokumentacji kodu aplikacji
Pozostałe odpowiedzi są zadaniami, które w większości przypadków mogą być realizowane indywidualnie, co czyni je zadaniami jednostkowymi. Implementacja funkcji dodajZdjecie() dotyczy konkretnego aspektu programistycznego, który może być wykonany przez jednego dewelopera. Wymaga ona znajomości języka programowania oraz logiki potrzebnej do dodawania zdjęć do galerii, co zazwyczaj nie wymaga współpracy z innymi członkami zespołu. Przygotowanie i skonfigurowanie repozytorium dla projektu natomiast to techniczny proces, który również najczęściej realizuje jedna osoba, odpowiedzialna za ustawienie środowiska pracy. Tworzenie testu jednostkowego dla funkcji przegladajZdjecia() to kolejny krok, który można wykonać samodzielnie, koncentrując się na testowaniu konkretnej funkcji w izolacji, bez potrzeby angażowania innych programistów. W przypadku tych zadań, choć mogą one być częścią większego projektu, to ich realizacja nie wymaga współpracy zespołowej, co sprawia, że nie są to zadania zespołowe.

Pytanie 23

Jaką rolę odgrywa pamięć operacyjna (RAM) w komputerowym systemie?

A. Tymczasowe magazynowanie danych i instrukcji dla procesora
B. Trwałe przechowywanie systemu operacyjnego
C. Zarządzanie transferem danych pomiędzy urządzeniami wejścia/wyjścia
D. Umożliwienie tworzenia kopii zapasowej danych użytkownika
Pamięć operacyjna, znana jako RAM (Random Access Memory), odgrywa kluczową rolę w funkcjonowaniu systemu komputerowego. Jej głównym zadaniem jest tymczasowe przechowywanie danych i instrukcji, które są niezbędne dla procesora w trakcie wykonywania programów. Kiedy uruchamiamy aplikację, jej kod oraz dane są ładowane z pamięci masowej (np. dysku twardego) do pamięci RAM, co umożliwia szybki dostęp do nich przez procesor. Dzięki dużej prędkości działania pamięć operacyjna znacząco przyspiesza procesy obliczeniowe, ponieważ operacje na danych przechowywanych w RAM są wielokrotnie szybsze niż na danych znajdujących się na dysku twardym. Współczesne komputery często wyposażone są w kilka gigabajtów pamięci RAM, co pozwala na efektywne zarządzanie wieloma uruchomionymi aplikacjami jednocześnie. Standardy takie jak DDR4 i DDR5 określają nie tylko wydajność, ale również szybkość przesyłania danych, co ma kluczowe znaczenie w kontekście wydajności systemu komputerowego. W efekcie, pamięć operacyjna jest niezbędna do płynnego działania systemu operacyjnego oraz aplikacji, a jej pojemność i szybkość mają bezpośredni wpływ na ogólną wydajność komputera.

Pytanie 24

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

A. Metoda statyczna
B. Instrukcja warunkowa
C. Funkcja zaprzyjaźniona
D. Konstruktor
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 25

Jakie znaczenie ma termin "hierarchia dziedziczenia" w kontekście programowania obiektowego?

A. Zbiór klas, które nie mają wspólnych powiązań
B. Zespół metod i pól posiadających ten sam modyfikator dostępu
C. Układ klas, który ogranicza występowanie dziedziczenia wielokrotnego
D. Układ klas w strukturę, w której klasy pochodne dziedziczą cechy od klas bazowych
Hierarchia dziedziczenia to fundamentalna koncepcja programowania obiektowego, polegająca na organizacji klas w strukturę, w której klasy pochodne dziedziczą właściwości (pola i metody) od klas bazowych. Pozwala to na wielokrotne wykorzystanie kodu, co zwiększa jego modularność i zmniejsza redundancję. Klasa bazowa dostarcza ogólne cechy i metody, podczas gdy klasy pochodne rozszerzają lub modyfikują tę funkcjonalność, dostosowując ją do bardziej specyficznych wymagań. Przykładem jest klasa 'Pojazd', po której mogą dziedziczyć klasy 'Samochód' i 'Motocykl', zachowując wspólne atrybuty, takie jak 'maksymalna prędkość' czy 'masa'.

Pytanie 26

Jakie jest najważniejsze właściwość algorytmów szyfrowania symetrycznego?

A. Zastosowanie identycznego klucza do szyfrowania oraz deszyfrowania
B. Szyfrowanie wyłącznie tekstowych plików
C. Zastosowanie odmiennych kluczy do szyfrowania i deszyfrowania
D. Funkcjonowanie bez użycia klucza
Algorytmy szyfrowania symetrycznego to takie, które używają tego samego klucza do szyfrowania i deszyfrowania danych. To jedna z najstarszych metod i, co ważne, bardzo często stosowanych, bo działa dość szybko i nie wymaga wielkich zasobów. Przykłady, które na pewno słyszałeś, to AES i DES. Symetryki są super w komunikacji sieciowej, przy przechowywaniu danych, a także w różnych protokołach bezpieczeństwa. Fajnie, że są szybkie, ale z drugiej strony trzeba pamiętać o tym, żeby klucz był bezpiecznie przechowywany, bo to może stanowić nie lada problem.

Pytanie 27

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

A. obsługa wciśniętego przycisku
B. kod XML
C. kod Java
D. obsługa przycisku ekranu dotykowego
Kod XML jest obecnie najczęściej stosowanym formatem do definiowania wyglądu interfejsów użytkownika w takich narzędziach jak Android Studio czy różnego rodzaju designery graficzne. Kiedy projektujesz layout aplikacji mobilnej albo desktopowej, duża część nowoczesnych narzędzi tworzy właśnie pliki XML, które następnie są interpretowane przez system w czasie uruchamiania aplikacji. Ułatwia to rozdzielenie logiki aplikacji od jej prezentacji, co wydaje się fundamentalne przy większych projektach. Moim zdaniem takie podejście daje ogromne korzyści – można łatwo modyfikować wygląd bez dotykania kodu źródłowego. W praktyce, jeśli używasz np. Android Studio, zbudujesz interfejs przeciągając przyciski czy pola tekstowe, a pod spodem dostaniesz czytelny plik XML. To przyspiesza pracę, zwiększa czytelność projektu i pozwala na późniejsze automatyczne generowanie dokumentacji albo testów interfejsu. Takie standardy są rekomendowane nie tylko przez Google, ale też szeroko stosowane w innych środowiskach, jak chociażby XAML w Microsoft czy FXML w JavaFX. Przezroczystość działania tych narzędzi sprawia, że łatwiej jest pracować zespołowo, bo każdy może szybko zorientować się w strukturze UI patrząc na XML-a. Samo generowanie kodu XML przez narzędzia graficzne to duży krok w kierunku lepszej organizacji pracy i zgodności ze współczesnymi praktykami branżowymi.

Pytanie 28

Jakie narzędzie można wykorzystać do tworzenia aplikacji mobilnych typu cross-platform w C#?

A. platformę React Native
B. platformę Xamarin
C. środowisko XCode
D. środowisko Android Studio
Xamarin to potężna platforma do tworzenia aplikacji mobilnych typu cross-platform w języku C#. Dzięki wykorzystaniu technologii .NET, deweloperzy mogą pisać kod raz, a następnie wdrażać go na różnych systemach operacyjnych, takich jak iOS i Android. Xamarin umożliwia korzystanie z natywnych interfejsów użytkownika oraz dostęp do funkcji urządzeń mobilnych, co zapewnia dużą wydajność i płynność działania aplikacji. Przykładowo, aplikacja stworzona w Xamarinie może korzystać z natywnych komponentów UI, co pozwala na zachowanie specyficznych dla platformy wzorców interakcji oraz UX. Dzięki wsparciu dla C# i .NET, deweloperzy mogą również łatwo integrować istniejące biblioteki oraz korzystać z ekosystemu .NET, co znacząco przyspiesza proces deweloperski. Warto również zaznaczyć, że Xamarin jest zgodny z wieloma standardami, co ułatwia współpracę w zespołach projektowych oraz utrzymanie kodu na dłuższą metę.

Pytanie 29

Które urządzenie komputerowe jest najbardziej odpowiednie do graficznego projektowania w aplikacjach CAD?

A. Laptop z interfejsem dotykowym
B. Serwer dysponujący dużą ilością pamięci RAM
C. Komputer stacjonarny z kartą graficzną NVIDIA Quadro
D. Laptop z zintegrowanym układem graficznym
W kontekście projektowania graficznego w programach typu CAD, kluczowym elementem jest wybór odpowiedniego sprzętu, który zapewni nie tylko stabilność, ale także wydajność. Komputer stacjonarny wyposażony w kartę graficzną NVIDIA Quadro jest najlepszym rozwiązaniem, ponieważ te karty są specjalnie zaprojektowane do obsługi złożonych obliczeń i renderowania grafiki 3D. Dzięki zaawansowanej architekturze oraz optymalizacji pod kątem aplikacji inżynieryjnych i projektowych, karty NVIDIA Quadro oferują znacznie wyższą wydajność w porównaniu do standardowych kart graficznych. Dodatkowo, stacjonarne komputery pozwalają na łatwiejszą rozbudowę, co może być kluczowe w przypadku rosnących wymagań projektowych. W praktyce, użytkownicy CAD często muszą radzić sobie z dużymi i złożonymi modelami, które wymagają nie tylko odpowiedniej mocy obliczeniowej, ale także dużej ilości pamięci wideo, co zapewnia NVIDIA Quadro. Warto dodać, że standardy branżowe, takie jak OpenGL i DirectX, są w pełni wspierane przez te karty, co przekłada się na ich niezawodność i efektywność w profesjonalnym środowisku projektowym.

Pytanie 30

Jaką rolę pełni element statyczny w klasie?

A. Ogranicza dostęp do metod publicznych w klasie
B. Automatycznie likwiduje obiekty klasy po zakończeniu działania programu
C. Pozwala na dynamiczne dodawanie nowych metod
D. Zachowuje wspólną wartość dla wszystkich instancji tej klasy
Składnik statyczny klasy przechowuje wartości współdzielone przez wszystkie obiekty tej klasy. Jest to jedno z najbardziej efektywnych narzędzi w programowaniu obiektowym, pozwalające na ograniczenie zużycia pamięci oraz zapewnienie spójności danych. Główna rola składnika statycznego polega na utrzymaniu jednej kopii zmiennej lub metody, która jest dostępna niezależnie od liczby instancji klasy. To oznacza, że zmiana wartości składowej statycznej jest natychmiast widoczna dla wszystkich obiektów klasy. Przykładem jest licznik instancji klasy lub konfiguracja globalna aplikacji, gdzie statyczność pozwala na scentralizowanie danych i ich jednolite zarządzanie.

Pytanie 31

Który z wymienionych algorytmów najczęściej wykorzystuje rekurencję?

A. Obliczanie liczb Fibonacciego
B. Sortowanie bąbelkowe
C. Wyszukiwanie liniowe
D. Sortowanie przez wstawianie
Algorytmy obliczania liczb Fibonacciego są jednym z najbardziej klasycznych przykładów rekurencji. Algorytm ten polega na wywoływaniu funkcji, która sama odwołuje się do siebie, aby obliczyć kolejne liczby w sekwencji. Rekurencyjna natura obliczeń Fibonacciego sprawia, że algorytm jest prosty i intuicyjny w implementacji, choć może być mniej wydajny niż wersje iteracyjne. Rekurencja jest szeroko stosowana w problemach matematycznych i algorytmicznych, gdzie rozwiązanie większego problemu można uzyskać poprzez rozwiązywanie mniejszych, podobnych podproblemów.

Pytanie 32

W jednostce centralnej, za obliczenia na liczbach zmiennoprzecinkowych odpowiada

A. IU
B. FPU
C. ALU
D. AU
FPU, czyli Floating Point Unit, to specjalizowany układ w jednostce centralnej, który zajmuje się właśnie obliczeniami na liczbach zmiennoprzecinkowych. Moim zdaniem bardzo często się o tym zapomina, bo „procesor to procesor”, a tu jednak mamy konkretne podzespoły odpowiadające za różne rodzaje operacji. Współczesne CPU praktycznie zawsze mają wbudowaną FPU, bo operacje na zmiennych typu float czy double są na porządku dziennym, szczególnie w grafice komputerowej, symulacjach fizycznych czy obliczeniach naukowych. Przykładowo, FPU jest niezbędna podczas renderowania grafiki 3D albo nawet przy zwykłych obliczeniach matematycznych, które wymagają dużej precyzji. Standardy branżowe jak IEEE 754 określają sposób reprezentacji i przetwarzania liczb zmiennoprzecinkowych, a FPU jest zaprojektowana właśnie pod takie standardy, żeby wyniki były przewidywalne i zgodne ze światowymi normami. Dla mnie to jest ciekawe, bo chociaż FPU działa raczej „w tle”, to bez niej większość zaawansowanych aplikacji praktycznie by nie działała albo byłaby po prostu niewyobrażalnie wolna. Czasem w kontekście architektury komputerów mówi się nawet o osobnych układach FPU, które kiedyś były dokładane do procesorów, zanim trafiły bezpośrednio do ich wnętrza. Warto o tym pamiętać, bo to właśnie FPU pozwala komputerom liczyć z dużą dokładnością i szybkością wartości, których zwykła ALU by nie ogarnęła.

Pytanie 33

Jakie elementy powinny być ujęte w dokumentacji programu?

A. Opis funkcji, klas i zmiennych w kodzie
B. Szczegóły dotyczące konfiguracji serwera
C. Zestawienie błędów zidentyfikowanych w trakcie testów
D. Strategia marketingowa aplikacji
Opis funkcji, klas i zmiennych w kodzie to kluczowy element dokumentacji programu. Tego rodzaju dokumentacja pozwala na lepsze zrozumienie struktury aplikacji, jej logiki biznesowej oraz wzajemnych zależności pomiędzy poszczególnymi komponentami. Dokumentacja techniczna obejmuje szczegółowe informacje na temat implementacji, interfejsów API, schematów baz danych oraz sposobów integracji z innymi systemami. Dzięki niej programiści mogą szybciej wdrażać się w projekt, a błędy i niejasności są minimalizowane. Kompleksowa dokumentacja zawiera także przykłady użycia poszczególnych funkcji, co dodatkowo ułatwia rozwój i rozbudowę aplikacji. W dobrze prowadzonym projekcie dokumentacja kodu jest na bieżąco aktualizowana, co zwiększa jego przejrzystość i wspiera proces refaktoryzacji.

Pytanie 34

Co oznacza pojęcie 'hoisting' w JavaScript?

A. Mechanizm zarządzania pamięcią w przeglądarce
B. Technika optymalizacji kodu przez silnik JavaScript
C. Proces podnoszenia deklaracji zmiennych i funkcji na górę zakresu
D. Metoda ładowania skryptów z zewnętrznych źródeł
Hoisting to mechanizm w JavaScript, który polega na tym, że deklaracje zmiennych i funkcji są przenoszone na górę zakresu, w którym zostały zadeklarowane. Oznacza to, że możesz używać zmiennych i funkcji przed ich faktyczną deklaracją w kodzie. Na przykład, jeśli zadeklarujesz zmienną za pomocą 'var' lub funkcję, możesz odwołać się do niej wcześniej, a JavaScript zrozumie, o co chodzi. Przykład: jeśli napiszesz 'console.log(x); var x = 5;', to nie dostaniesz błędu, ponieważ 'x' jest hoistowane na górę, jednak jej wartość będzie 'undefined' do momentu przypisania jej wartości. Zrozumienie hoistingu jest kluczowe dla pisania poprawnego kodu w JavaScript, ponieważ może to prowadzić do zaskakujących rezultatów. Warto wiedzieć, że hoisting nie działa w ten sam sposób dla deklaracji 'let' i 'const'. Te zmienne są hoistowane, ale nie mogą być używane przed ich deklaracją, co prowadzi do błędu 'Temporal Dead Zone'. Dlatego zaleca się unikanie deklaracji zmiennych w sposób, który może prowadzić do nieporozumień, i zawsze deklarować zmienne na początku zakresu, w którym będą używane.

Pytanie 35

Jakie elementy powinny być uwzględnione w scenariuszu testów aplikacji?

A. Dokładne wytyczne dotyczące realizacji kodu
B. Dokumentacja techniczna oprogramowania
C. Zestaw kroków do testowania, oczekiwanych rezultatów oraz warunków początkowych
D. Strategia wdrożenia aplikacji w środowisku produkcyjnym
Scenariusz testowy aplikacji powinien zawierać szczegółowy opis kroków testowych, oczekiwane wyniki oraz warunki wstępne, które muszą być spełnione przed rozpoczęciem testu. Scenariusz testowy to kluczowy dokument w procesie testowania oprogramowania, który pozwala na systematyczne i dokładne sprawdzenie, czy aplikacja działa zgodnie z oczekiwaniami. Uwzględnienie kroków testowych pozwala na replikację testów, a opis warunków wstępnych zapewnia, że test jest przeprowadzany w odpowiednim środowisku.

Pytanie 36

Co to jest JWT (JSON Web Token)?

A. Format zapisu danych w bazach NoSQL
B. Protokół do przesyłania danych JSON przez sieć
C. Biblioteka JavaScript do manipulacji danymi JSON
D. Kompaktowy format do bezpiecznego przekazywania informacji między stronami jako obiekt JSON
JWT (JSON Web Token) to kompaktowy format, który umożliwia bezpieczne przesyłanie informacji pomiędzy różnymi stronami. Główną zaletą tokenów JWT jest ich struktura, która składa się z trzech części: nagłówka, ładunku (payload) oraz podpisu. Nagłówek zazwyczaj wskazuje typ tokena oraz algorytm użyty do podpisania, co pozwala na szybką weryfikację integralności danych. Ładunek zawiera informacje, często nazywane roszczeniami (claims), które mogą dotyczyć użytkownika lub sesji, a podpis zapewnia, że token nie został zmodyfikowany w trakcie przesyłania. W praktyce JWT jest często wykorzystywany w systemach autoryzacyjnych, gdzie po pomyślnym zalogowaniu, użytkownik otrzymuje token, który następnie może być używany do autoryzacji dostępu do różnych zasobów. Standard JWT definiuje sposób kodowania i dekodowania tokenów, a jego stosowanie pozwala na zwiększenie bezpieczeństwa aplikacji webowych oraz mobilnych poprzez ograniczenie konieczności przechowywania sesji na serwerze, co jest zgodne z najlepszymi praktykami w dziedzinie inżynierii oprogramowania.

Pytanie 37

Jakie z poniższych narzędzi wspomaga projektowanie interfejsu użytkownika w aplikacjach mobilnych?

A. Kompilator Javy
B. Android Studio Layout Editor
C. Narzędzie do zarządzania bazami danych
D. PyCharm Debugger
Android Studio Layout Editor to narzędzie umożliwiające projektowanie interfejsu użytkownika aplikacji mobilnych w sposób wizualny, za pomocą metody 'przeciągnij i upuść'. Layout Editor pozwala na szybkie tworzenie responsywnych interfejsów, które automatycznie dostosowują się do różnych rozmiarów ekranów i rozdzielczości. Dzięki niemu programiści mogą łatwo dodawać elementy UI, takie jak przyciski, pola tekstowe, listy czy obrazy, oraz dostosowywać ich właściwości bez konieczności pisania dużych fragmentów kodu XML. Narzędzie to jest kluczowe dla szybkiego prototypowania aplikacji oraz iteracyjnego podejścia do budowy interfejsu użytkownika w środowisku Android Studio.

Pytanie 38

Którą konwencję nazewnictwa najczęściej stosuje się w JavaScript?

A. kebab-case
B. camelCase
C. snake_case
D. PascalCase
CamelCase to konwencja nazewnictwa, która jest powszechnie stosowana w JavaScript, szczególnie w kontekście definiowania zmiennych i funkcji. W tej metodzie, każde nowe słowo zaczyna się dużą literą, co czyni tekst bardziej czytelnym. Przykładami mogą być zmienne takie jak `userName` czy `getUserInfo`, gdzie pierwsza część jest zapisana małymi literami, a każde kolejne słowo zaczyna się od dużej litery. Stosowanie camelCase jest zgodne z przyjętymi standardami i dobrymi praktykami w Javascript, gdzie wskazano, że zmienne i funkcje powinny być nazwane w sposób, który jasno określa ich przeznaczenie. Dzięki temu, kod staje się bardziej zrozumiały i łatwiejszy do utrzymania. Warto również zauważyć, że wiele z popularnych bibliotek i frameworków JavaScript, takich jak React czy Angular, również korzysta z tej konwencji, co sprawia, że jest to umiejętność niezbędna dla każdego programisty JavaScript. Dobrą praktyką jest również przestrzeganie tej konwencji w nazwach klas i obiektów, co further enhances readability and maintainability of the code.

Pytanie 39

Jakie działanie związane z klasą abstrakcyjną jest niedozwolone?

A. Definiowanie pól publicznych
B. Utworzenie instancji tej klasy
C. Rozszerzanie tej klasy
D. Określenie metody wirtualnej
Deklaracja pól publicznych w klasie abstrakcyjnej jest całkowicie dozwolona i może być używana do udostępniania danych w klasach pochodnych. Wprowadzenie pól publicznych w klasie abstrakcyjnej pozwala na określenie podstawowych atrybutów, które będą współdzielone przez wszystkie klasy dziedziczące. Może to być przydatne w kontekście encapsulacji i zarządzania danymi w aplikacjach. Deklaracja metody wirtualnej również jest prawidłowa, gdyż klasy abstrakcyjne mogą zawierać metody, które są zdefiniowane jako wirtualne, co umożliwia ich nadpisywanie w klasach pochodnych. Dzięki temu, programiści mogą budować bardziej elastyczne i modułowe aplikacje. Dziedziczenie po klasie abstrakcyjnej jest podstawowym stosowaniem tego typu klas, gdyż pozwala na tworzenie hierarchii, w której klasy pochodne muszą implementować abstrakcyjne metody zdefiniowane w klasie bazowej. Dziedziczenie wspiera ponadto zasady programowania obiektowego, takie jak ponowne wykorzystanie kodu i polimorfizm, co czyni je kluczowym elementem nowoczesnego programowania.

Pytanie 40

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

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