Wyniki egzaminu

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

Egzamin zdany!

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

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

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

Pytanie 2

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

A. bool
B. liczba zmiennoprzecinkowa
C. tekst
D. liczba całkowita
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 3

Jakie ma znaczenie "operacja wejścia" w kontekście programowania?

A. Wprowadzanie nowych funkcji do aplikacji
B. Przekazywanie danych do programu z zewnętrznych źródeł
C. Naprawianie błędów w kodzie aplikacji
D. Zmiana wartości zmiennych globalnych
Dodawanie nowych funkcji do programu to element programowania, ale nie jest to związane z operacją wejścia. Modyfikowanie wartości zmiennych globalnych to operacja na poziomie kodu, a nie proces wejścia danych. Usuwanie błędów w kodzie programu to etap debugowania, a nie operacja wejścia. Operacje wejścia koncentrują się na interakcji z użytkownikiem lub innymi źródłami danych, co odróżnia je od modyfikacji kodu czy zarządzania błędami.

Pytanie 4

Jaki jest wymagany sposób do realizacji algorytmu sortowania bąbelkowego na n-elementowej tablicy?

A. n-liczby warunków
B. dwie pętle funkcjonujące na co najmniej (n+1) elementach każda
C. jedna pętla operująca na 2n elementach oraz warunek
D. dwie pętle działające na najwyżej n-elementach każda
Jedna pętla nie jest wystarczająca do zaimplementowania sortowania bąbelkowego, ponieważ proces porównywania i zamiany miejscami elementów wymaga wielokrotnego przechodzenia przez tablicę. Pętle działające na (n+1) elementach są błędnym założeniem – algorytm działa na n-elementowej tablicy, a każda iteracja zmniejsza liczbę elementów do porównania. Liczba warunków nie ma kluczowego znaczenia w sortowaniu bąbelkowym – najważniejsza jest struktura iteracyjna, która umożliwia porównywanie elementów w parach, aż do momentu pełnego posortowania tablicy.

Pytanie 5

Jakie działania mogą przyczynić się do ochrony swojego cyfrowego wizerunku w sieci?

A. Weryfikacja ustawień prywatności na platformach społecznościowych
B. Zamieszczanie wszystkich szczegółów dotyczących swojego życia prywatnego
C. Niepotwierdzanie źródeł publikowanych informacji
D. Dzieleni się swoimi danymi dostępowymi z przyjaciółmi
Sprawdzanie ustawień prywatności na portalach społecznościowych jest kluczowe dla ochrony cyfrowego wizerunku. Regularne aktualizowanie ustawień prywatności pozwala na kontrolowanie, kto ma dostęp do publikowanych treści, co chroni przed nieuprawnionym wykorzystaniem zdjęć, filmów i informacji osobistych. Dostosowanie widoczności postów oraz ograniczenie udostępniania danych osobowych minimalizuje ryzyko kradzieży tożsamości i cyberprzemocy. To proste działanie znacząco podnosi poziom bezpieczeństwa w sieci i pozwala utrzymać pozytywny wizerunek w internecie.

Pytanie 6

Przedstawione w filmie działania wykorzystują narzędzie

A. kompilatora dla interfejsu graficznego
B. generatora GUI przekształcającego kod do języka XAML
C. generatora kodu java
D. debuggera analizującego wykonujący kod
Wybrana odpowiedź jest trafna, bo faktycznie narzędzie pokazane w filmie to generator GUI, który potrafi przekształcać kod do języka XAML. XAML (czyli Extensible Application Markup Language) jest powszechnie używany do deklaratywnego opisywania interfejsów użytkownika, na przykład w aplikacjach WPF czy UWP na platformie .NET. Jak dla mnie, korzystanie z takich generatorów to ogromna wygoda, bo pozwala błyskawicznie przenosić projekt graficzny do formatu czytelnego dla platformy Microsoftu. Z mojego doświadczenia, wiele zespołów programistycznych stosuje takie rozwiązania, żeby oszczędzić czas na ręcznym pisaniu XAML-a (co potrafi być naprawdę żmudne przy dużych projektach). Co ciekawe, takie narzędzia bardzo dobrze współpracują z designerskimi edytorami UI i potrafią zautomatyzować konwersję nawet z innych formatów graficznych, np. Sketch czy Adobe XD do XAML-a. Branżowe standardy zalecają, by wykorzystywać generatorów GUI właśnie do tego celu, bo minimalizuje to liczbę błędów, przyspiesza wdrożenie zmian i ułatwia współpracę między programistami a projektantami. Warto pamiętać, że XAML jest bardzo elastyczny i umożliwia potem ręczną edycję wygenerowanego kodu – czasem powstają drobne poprawki, ale ogólnie to naprawdę przydatne narzędzie. Ogólnie – jeśli tylko projektujesz UI pod .NET, to automatyczna konwersja do XAML-a to jest coś, co warto znać i wykorzystywać w praktyce.

Pytanie 7

W języku Python, jak nazywa się funkcja, która jest wykonywana automatycznie, gdy obiekt jest niszczony?

A. __str__
B. __repr__
C. __init__
D. __del__
W Pythonie funkcja <code>__del__</code> to metoda destruktora, która jest wywoływana, gdy obiekt jest niszczony. Jest to część procesu zarządzania pamięcią, gdzie interpreter Pythona automatycznie usuwa obiekty, które nie są już potrzebne, aby zwolnić pamięć. <code>__del__</code> pozwala na wykonanie dodatkowych czynności przed ostatecznym usunięciem obiektu, takich jak zamknięcie plików czy połączeń sieciowych. Warto jednak pamiętać, że użycie <code>__del__</code> nie jest zalecane do zarządzania zasobami, ponieważ może prowadzić do trudnych do zdiagnozowania błędów, szczególnie gdy obiekty są usuwane w nieprzewidywalnym momencie. Zamiast tego, lepiej jest używać menedżerów kontekstu (z instrukcją <code>with</code>), które zapewniają bardziej kontrolowane i bezpieczne zwalnianie zasobów. Przykładowo, otwierając plik za pomocą <code>with open('plik.txt', 'r') as f:</code>, masz pewność, że plik zostanie zamknięty poprawnie po zakończeniu bloku kodu, niezależnie od tego, czy wystąpił błąd.

Pytanie 8

Jaki jest kluczowy zamysł wzorca "Kompozyt" (Composite)?

A. Danie możliwości dynamicznej zmiany zachowania obiektu
B. Umożliwienie klientom obsługi obiektów oraz ich zbiorów w spójny sposób
C. Stworzenie jednej klasy do zarządzania wieloma obiektami tego samego rodzaju
D. Określenie interfejsu komunikacji pomiędzy składnikami systemu
Zarządzanie wieloma obiektami tego samego typu to cecha wzorca Fabryka (Factory) lub Builder, a nie Kompozyt. Definiowanie interfejsu komunikacji między komponentami systemu to rola wzorca Mediator, który organizuje interakcje między różnymi obiektami. Umożliwienie dynamicznej zmiany zachowania obiektu jest domeną wzorca Strategia (Strategy) lub Dekorator (Decorator), które oferują elastyczność w zakresie modyfikacji zachowania podczas działania programu.

Pytanie 9

Czym jest klasa w programowaniu obiektowym?

A. instrukcja
B. typ danych
C. wskaźnik
D. zmienna
Bardzo często spotykam się z tym, że klasa w OOP bywa mylona z innymi pojęciami, które brzmią znajomo, ale mają zupełnie inne zastosowanie i sens. Zacznijmy od zmiennej – to po prostu miejsce w pamięci, które przechowuje jakąś wartość, np. liczbę czy napis. Zmienna sama w sobie nie posiada żadnych zachowań, nie można do niej przypisać metod czy właściwości – to tylko pojemnik na dane, nie szablon czy definicja czegoś większego. Klasa natomiast służy do tworzenia zmiennych-typu obiekt, ale nie jest zmienną jako taką. W przypadku wskaźnika sprawa jest trochę bardziej podchwytliwa, bo w językach takich jak C++ rzeczywiście często operujemy wskaźnikami do obiektów lub klas. Jednak wskaźnik to zwyczajnie adres w pamięci, który wskazuje na jakąś zmienną, obiekt czy nawet funkcję. Klasa nie jest adresem, tylko strukturą opisującą, jak mają wyglądać i się zachowywać obiekty. Instrukcja natomiast to najmniejszy element programu wykonujący konkretne polecenie, np. przypisanie wartości czy wywołanie funkcji – nie ma żadnych cech typowych dla klasy, nie jest typem danych i nie opisuje żadnej struktury. Z mojego doświadczenia wynika, że problem z rozróżnieniem tych pojęć często bierze się z nauki „na pamięć” bez zrozumienia, na czym polega modelowanie obiektów w praktyce. W programowaniu obiektowym klasa jest właśnie typem danych, ale takim, który pozwala na zdefiniowanie zarówno przechowywanych danych, jak i operacji na nich, co jest jednym z głównych powodów jej wprowadzenia do języków takich jak Java, Python czy C#. To dzięki klasom możemy tworzyć kod wielokrotnego użytku, budować hierarchie obiektów i korzystać z takich mechanizmów jak dziedziczenie czy polimorfizm. Dobre zrozumienie tej roli jest kluczowe, bo pozwala unikać powtarzalnego kodu i podnosi jakość projektowanych aplikacji – a o to przecież chodzi w profesjonalnym programowaniu.

Pytanie 10

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

A. Kontrolowanie jakości powietrza
B. Wykorzystanie foteli o ergonomicznym kształcie
C. Stosowanie monitorów LCD
D. Systematyczne sprawdzanie instalacji elektrycznych
Regularne testowanie instalacji elektrycznych to podstawowy sposób zapobiegania porażeniom prądem w pracy biurowej. Testy te pozwalają wykryć uszkodzenia, przeciążenia i inne usterki, które mogą stanowić zagrożenie dla pracowników. Prawidłowo przeprowadzane przeglądy techniczne obejmują sprawdzanie stanu przewodów, gniazdek oraz urządzeń elektrycznych. Regularne kontrole zgodne z normami BHP oraz przepisami dotyczącymi instalacji elektrycznych są obowiązkowe i mają kluczowe znaczenie dla bezpieczeństwa pracy. Pamiętaj, że zaniedbanie testów elektrycznych może prowadzić do poważnych wypadków, takich jak pożary lub porażenia prądem.

Pytanie 11

W standardzie dokumentacji testów oprogramowania IEEE 829-1998 opisany jest dokument, który zawiera dane o tym, jakie przypadki testowe były wykorzystane, przez kogo i czy zakończyły się sukcesem. Co to jest?

A. Dziennik Testów
B. Specyfikacja Procedury Testowej
C. Raport Podsumowujący Testy
D. Plan Testów
Dokładnie – Dziennik Testów to ten dokument z IEEE 829-1998, który ma za zadanie rejestrować, które przypadki testowe zostały wykonane, przez kogo, kiedy oraz jaki był ich rezultat. Z mojego doświadczenia to jest taka codzienna „księga kucharska” testera – wpisujesz co zrobiłeś, o której i czy poszło zgodnie z planem. W prawdziwych projektach dziennik testów bywa nieoceniony: pozwala w każdej chwili wrócić do szczegółów, zweryfikować kto co testował i dlaczego test przerwano, a nawet rozliczać się z czasu pracy. To podstawa rozliczalności (ang. traceability) procesu testowania, co jest szczególnie ważne przy audytach czy testach dla klientów z branż regulowanych, np. medycyna czy bankowość. Sam standard IEEE 829-1998 bardzo konkretnie określa, jakie dane mają się tam znaleźć – to nie tylko „odhaczenie”, ale pełna informacja o przebiegu i wyniku każdego testu, ewentualnych problemach czy wyjątkowych sytuacjach. W praktyce, czy to prowadzisz Excela, dokumentację papierową czy system typu JIRA/Xray, dobrze prowadzony dziennik testów pozwala potem zidentyfikować luki w pokryciu przypadków, powtórzyć testy po naprawach czy po prostu udowodnić, że procedura była zgodna z wymaganiami. Warto to sobie wyrobić jako nawyk. Sam nieraz wracałem do starych dzienników, żeby sprawdzić „co poszło nie tak” parę miesięcy wcześniej – bez tego byłaby loteria!

Pytanie 12

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

A. import { Component } from 'react'
B. import React.Component from 'react'
C. import [ Component ] from 'react'
D. import Component from 'react'
Wielu osobom, zwłaszcza na początku przygody z Reactem, potrafią się pomylić sposoby importowania poszczególnych fragmentów tej biblioteki. Przykładowo, użycie import React.Component from 'react' jest składniowo niepoprawne w ES6 – nie istnieje możliwość importowania właściwości w ten sposób. To raczej coś, co można by zobaczyć w starszych rozwiązaniach lub błędnych tutorialach. Kolejna propozycja, czyli import [ Component ] from 'react', wygląda jakby ktoś próbował połączyć składnię tablicową z importem nazwanym, co zupełnie nie ma sensu w kontekście ECMAScript Modules. W rzeczywistości, w nawiasach kwadratowych importu się nie zapisuje – do importów nazwanych używamy nawiasów klamrowych, co jest jasno określone w dokumentacji. Z kolei import Component from 'react' to import domyślny, a 'react' nie eksportuje domyślnie samego Component – eksportuje natomiast cały obiekt React jako default. To jest bardzo częsty błąd: niektórzy myślą, że każdy element biblioteki można zaimportować domyślnie, ale akurat Component jest eksportem nazwanym. Moim zdaniem źródłem tych nieporozumień są niedokładne przykłady w sieci albo powierzchowna znajomość standardów ES6. Warto pamiętać, że składnia importów jest ściśle określona i każde odstępstwo kończy się błędem kompilacji albo nieprzewidywalnym działaniem aplikacji. Dobra praktyka to zawsze sprawdzać dokumentację konkretnej biblioteki, bo różne moduły mogą mieć różne rodzaje eksportów i nie każdy sposób importu będzie pasował do wszystkiego. W przypadku Reacta, jeśli zależy Ci tylko na Component, zawsze trzeba używać importu nazwanego w klamrach, bo taki jest oficjalny eksport tego kawałka z biblioteki.

Pytanie 13

Jaką rolę odgrywa program Jira?

A. Modyfikowanie arkuszy kalkulacyjnych
B. Produkcja grafik 3D
C. Planowanie, śledzenie oraz raportowanie zadań projektowych
D. Zarządzanie edycjami systemu operacyjnego
Jira to jedno z najpopularniejszych narzędzi do zarządzania projektami, wykorzystywane głównie w metodykach Agile i Scrum. Umożliwia planowanie, monitorowanie i raportowanie zadań projektowych na różnych etapach ich realizacji. Dzięki elastycznym tablicom kanban i sprintom, Jira pozwala zespołom programistycznym śledzić postępy, zarządzać backlogiem oraz efektywnie przydzielać zasoby. Funkcjonalności takie jak automatyzacja procesów, śledzenie błędów (bug tracking) i integracja z innymi narzędziami (np. GitHub, Bitbucket) sprawiają, że Jira jest wszechstronnym rozwiązaniem do zarządzania nawet najbardziej złożonymi projektami. Dzięki generowanym raportom i wykresom burndown, menedżerowie mogą dokładnie analizować tempo pracy i podejmować decyzje w oparciu o dane.

Pytanie 14

Który z wymienionych parametrów określa prędkość procesora?

A. Liczba rdzeni
B. Częstotliwość taktowania
C. Rodzaj złącza
D. Wielkość pamięci podręcznej
Częstotliwość taktowania procesora, wyrażana najczęściej w gigahercach (GHz), jest kluczowym parametrem opisującym szybkość działania jednostki centralnej. Określa, ile cykli zegara procesor jest w stanie wykonać w ciągu jednej sekundy. Wyższa częstotliwość oznacza większą ilość operacji, które procesor może przetworzyć w danym czasie, co bezpośrednio wpływa na jego wydajność. Przykładowo, procesor o częstotliwości 3,0 GHz może wykonać 3 miliardy cykli na sekundę, co sprawia, że jest w stanie przeprowadzać bardziej skomplikowane obliczenia i efektywniej zarządzać zadaniami. W praktyce jednak sama częstotliwość nie jest jedynym wskaźnikiem wydajności; istotne są też inne czynniki, takie jak architektura procesora, liczba rdzeni czy szybkość pamięci RAM. Standardy, takie jak Intel Core i9 czy AMD Ryzen 5000, dostarczają informacji na temat maksymalnej częstotliwości taktowania, co pozwala konsumentom lepiej dobierać sprzęt do swoich potrzeb. Warto również zauważyć, że wielu nowoczesnych procesorów stosuje technologię Turbo Boost, która pozwala na chwilowe zwiększenie częstotliwości w celu uzyskania lepszej wydajności przy intensywnych obciążeniach.

Pytanie 15

Jakie działanie powinno się wykonać w pierwszym kroku, oceniając stan osoby poszkodowanej?

A. Wezwać ambulans
B. Zadbać o własne bezpieczeństwo
C. Rozpocząć resuscytację krążeniowo-oddechową
D. Sprawdzić, czy występuje krwawienie
Właśnie o to chodzi — zadbanie o własne bezpieczeństwo jako pierwszy krok to fundament całej pierwszej pomocy i temat, który się często przecenia, a moim zdaniem jest kluczowy. Chodzi o to, że nawet najlepsze chęci nie mają sensu, jeśli ratujący sam staje się kolejną ofiarą. W praktyce oznacza to, że zanim podejdziesz do poszkodowanego, musisz się zastanowić, czy miejsce wypadku jest bezpieczne. Przykładowo na drodze – trzeba rozejrzeć się, czy nie nadjeżdżają inne samochody, zabezpieczyć teren (trójkąt ostrzegawczy, kamizelka odblaskowa). W przypadku porażenia prądem – odłączyć źródło napięcia. To wcale nie są banały; tego uczą na wszystkich kursach BLS (Basic Life Support) i w zasadzie każda książka ratownicza stawia to na pierwszym miejscu. Często się o tym zapomina, bo emocje biorą górę. Prawda jest taka, że każda akcja ratunkowa zaczyna się od sekundy refleksji: czy ja tu jestem bezpieczny? Dopiero później można oceniać stan poszkodowanego i dalej działać. W sumie jak się o tym pomyśli, to takie myślenie ratuje zdrowie nie tylko nam, ale i tym, którym chcemy pomóc — bo nie zwiększamy liczby poszkodowanych. Niektórym wydaje się, że od razu trzeba robić masaż serca czy wołać karetkę, ale bez oceny zagrożenia można narobić sobie i innym więcej problemów. Takie są realia pracy w terenie, nie tylko w teorii.

Pytanie 16

W jakim celu wykorzystuje się diagram Gantta?

A. do wizualizacji powiązań między elementami systemów
B. do planowania i zarządzania projektem
C. do przedstawiania funkcjonalności systemu
D. do dokładnej analizy czasowo-kosztowej projektu
Diagram Gantta to jeden z podstawowych i – moim zdaniem – najfajniejszych narzędzi używanych w zarządzaniu projektami, zwłaszcza w budowlance, IT czy produkcji. Jest bardzo praktyczny, bo pozwala wizualnie rozplanować, jakie zadania są do wykonania, ile mają trwać i co od czego zależy. Dzięki prostemu układowi poziomych pasków na osi czasu można szybko ogarnąć całość projektu, zobaczyć które zadania się pokrywają i gdzie mogą być wąskie gardła. Branżowe standardy, np. PMBOK, zalecają korzystanie z diagramu Gantta właśnie do planowania i monitorowania postępu. Z mojego doświadczenia to narzędzie, które łączy ludzi – wszyscy od razu widzą, kto co robi i na kiedy. Fajne jest też to, że łatwo aktualizować taki diagram w miarę zmian w projekcie. Diagram Gantta pomaga też w kontroli terminowości i identyfikacji opóźnień. Jeśli ktoś kiedyś miał styczność z programami jak MS Project czy nawet prostym Excelem – na pewno widział taki wykres. Można tam nawet dodać kamienie milowe czy zależności między zadaniami (np. jedno musi się skończyć, zanim drugie się zacznie). Tak naprawdę, w profesjonalnych firmach, zarządzanie projektem bez takiego narzędzia byłoby trochę strzałem w stopę.

Pytanie 17

Dziedziczenie jest używane, gdy zachodzi potrzeba

A. określenia zasięgu dostępności metod i pól danej klasy
B. wykorzystania stałych wartości, niezmieniających się w trakcie działania aplikacji
C. sformułowania klasy bardziej szczegółowej niż już stworzona
D. asynchronicznej realizacji długotrwałych zadań
Dziedziczenie to naprawdę jeden z kluczowych fundamentów programowania obiektowego. Chodzi tu o możliwość stworzenia nowej klasy (tzw. klasy pochodnej), która rozszerza lub precyzuje działanie już istniejącej klasy bazowej. Dzięki temu nie trzeba pisać wszystkiego od nowa – można po prostu przejąć cechy i zachowania ogólnej klasy, a potem dołożyć własne, bardziej szczegółowe funkcjonalności. Przykład? Klasa "Pojazd" może być ogólna, a potem robisz z niej "Samochód", "Rower" czy "Motocykl". Każda z tych klas dziedziczy podstawowe właściwości pojazdu (jak np. liczba kół), ale może mieć swoje dodatkowe pole czy metodę. W praktyce to pozwala na bardzo elastyczne i czytelne projektowanie kodu, no i łatwiejsze zarządzanie nim na dłuższą metę. Według większości standardów branżowych, np. w językach Java, C# czy C++, dziedziczenie jest zalecane właśnie wtedy, gdy chcesz odwzorować relację „jest rodzajem” (is-a). Z mojego doświadczenia, używanie dziedziczenia według tej zasady pozwala uniknąć wielu problemów z powielaniem kodu i z czasem naprawdę oszczędza mnóstwo roboty. Warto pamiętać, że nie wszystko należy dziedziczyć na siłę – czasem lepiej postawić na kompozycję, ale jeśli faktycznie potrzebujesz klasy bardziej szczegółowej, to dziedziczenie to chyba najlepszy wybór.

Pytanie 18

Wskaż kod, który jest funkcjonalnie równoważny zaprezentowanemu poniżej:

switch(nrTel) {
    case 999: opis = "Pogotowie"; break;
    case 998: opis = "Straż"; break;
    case 997: opis = "Policja"; break;
    default: opis = "Inny numer";
}
Kod 1.
with nrTel {
    if (999) opis = "Pogotowie";
    if (998) opis = "Straż";
    if (997) opis = "Policja";
    else opis = "Inny numer";
}
Kod 2.
if (nrTel == 999)
    opis = "Pogotowie";
else if (nrTel == 998)
    opis = "Straż";
else if (nrTel == 997)
    opis = "Policja";
else opis = "Inny numer";
Kod 3.
if (nrTel == 999)
    opis = "Pogotowie";
if (nrTel == 998)
    opis = "Straż";
if (nrTel == 997)
    opis = "Policja";
else
    opis = "Inny numer";
Kod 4.
Opis =
    if (nrTel == 999) => "Pogotowie";
    else if (nrTel == 998) => "Straż";
    else if (nrTel == 997) => "Policja";
    else => "Inny numer";
A. Kod 4.
B. Kod 2.
C. Kod 1.
D. Kod 3.
Zamiana instrukcji switch na inne konstrukcje warunkowe wymaga bardzo uważnego odwzorowania zasad działania, zwłaszcza tego, że switch działa wyłącznie na porównaniu wartości (nie warunków logicznych) i wykonuje tylko jeden z przypadków lub blok domyślny. Zauważyłem, że często błędne odpowiedzi biorą się z niepełnego zrozumienia, jak działają instrukcje if-else oraz kiedy wykonywana jest dana gałąź kodu. Przykładowo, Kod 1 i Kod 3 stosują osobne instrukcje if, przez co mogą prowadzić do przypisywania wartości "opis" wiele razy podczas jednego przebiegu – co zupełnie odbiega od pierwotnej logiki switcha. Dla przykładu: jeśli nrTel będzie równe 997, to w Kodzie 3 pierwsze dwa warunki będą fałszywe, ale trzeci będzie prawdziwy i wykona się, a jednocześnie else zostanie potraktowany jako związany tylko z ostatnim if, co jest nieintuicyjne i łatwo o błąd. Jeszcze większe zamieszanie wprowadza Kod 1, gdzie składnia nie odpowiada żadnemu znanemu językowi – takie rzeczy pojawiają się raczej w pseudokodzie i nie nadają się do prawdziwych projektów. Kod 4 natomiast prezentuje nietypową, niepoprawną składnię (np. "if (...) => 'cos';"), która nie jest zgodna z żadnym głównym językiem programowania – to bardziej skrót myślowy lub pseudokod. W praktyce, poprawną zamianą switch na instrukcje warunkowe jest dokładne odwzorowanie logiki wyłączności wyboru, czyli właśnie użycie połączonych bloków if – else if – else, jak w Kodzie 2. Moim zdaniem takie błędne podejścia często wynikają z chęci uproszczenia kodu bez zwrócenia uwagi na to, jak mechanizmy sterowania naprawdę działają. Warto zapamiętać, że właściwe odwzorowanie switcha to zawsze jedna ścieżka wykonania dla danej wartości, bez powtarzania czy nadpisywania wyniku w kolejnych warunkach – i tego właśnie brakuje w niepoprawnych kodach.

Pytanie 19

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

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

Pytanie 20

Jakiego typu funkcja jest tworzona poza klasą, ale ma dostęp do jej prywatnych i chronionych elementów?

A. Destruktor
B. Metoda statyczna
C. Konstruktor
D. Funkcja zaprzyjaźniona
Konstruktor jest specjalnym typem metody klasy, który służy do inicjalizacji obiektów i nie ma dostępu do prywatnych składowych innej klasy, chyba że jest ona klasą zaprzyjaźnioną. Metoda statyczna należy do klasy jako całości i może być wywoływana bez tworzenia instancji obiektu, ale nie posiada dostępu do prywatnych lub chronionych składowych klasy, ponieważ działa w kontekście klasy, a nie instancji. Destruktor, z kolei, jest odpowiedzialny za czyszczenie zasobów po zniszczeniu obiektu i nie posiada funkcjonalności pozwalającej na dostęp do prywatnych danych innej klasy, o ile nie jest ona zaprzyjaźniona.

Pytanie 21

Który z wymienionych poniżej przykładów ilustruje prawidłowy szkielet zarządzania wyjątkami w języku C++?

A. try { kod } except { obsługa }
B. try { kod } finally { obsługa }
C. try { kod } catch { obsługa }
D. try { kod } handle { obsługa }
Niestety, skrypt 'try { kod } handle { obsługa }' nie zadziała w C++. Słowo 'handle' nie jest czymś, co znajdziesz w tym języku – używamy 'catch'. Poza tym, 'except' to termin z Pythona, nie C++. No i 'finally' też nie istnieje w C++, to też jest z języków jak Java czy Python, które mają to w inny sposób. Tak że jedynym poprawnym rozwiązaniem w C++ jest właśnie 'try' i 'catch'. Tylko to gwarantuje, że wszystko będzie działać jak należy.

Pytanie 22

W środowisku IDE przeznaczonym do tworzenia aplikacji okienkowych zdefiniowano okno Form1. Aby wprowadzić zmiany w ustawieniach, w kolejności: tytuł okna na górnym pasku, standardowy kursor na strzałkę oraz kolor tła okna, należy dostosować następujące pola w oknie Properties:

Ilustracja do pytania
A. Text, UseWaitCursor, BackColor
B. (Name), UseWaitCursor, BackgroundImage
C. (Name), Cursor, BackgroundImage
D. Text, Cursor, BackColor
W pracy z IDE do aplikacji okienkowych, bardzo łatwo pomylić znaczenie niektórych właściwości formularza, bo wiele z nich brzmi podobnie albo wydaje się spełniać podobną funkcję. Przykładowo, pole (Name) w oknie Properties nie ma żadnego wpływu na to, co widzi użytkownik w tytule okna – to jest nazwa techniczna obiektu w kodzie, czyli identyfikator, którym odwołujemy się do formularza w trakcie programowania. To megaważna różnica! BackgroundImage natomiast służy do ustawienia grafiki jako tła, a nie koloru – czasem ktoś myli BackColor z BackgroundImage, bo oba dotyczą wyglądu, ale BackColor to czysty kolor, bez obrazków. UseWaitCursor to kolejny haczyk – ta właściwość aktywuje specjalny kursor oczekiwania (taki kręcący się kółek lub klepsydrę), a nie domyślny wskaźnik w kształcie strzałki. Ustawienie tego pola na true sprawia, że użytkownik ma wrażenie, iż aplikacja coś przetwarza – super przydatne w operacjach długotrwałych, ale nie do standardowej obsługi okna. Cursor daje pełną kontrolę nad rodzajem kursora i to jest najlepszy wybór, gdy chodzi o standardowego pointera. Wreszcie, częsty błąd to branie pod uwagę właściwości, które po prostu nie dotyczą zadanego aspektu wizualnego formularza – na przykład mylenie tego, co widzi użytkownik, z tym, jak programista nazywa obiekt. Moim zdaniem, to taki typowy skrót myślowy: patrzymy na nazwę w oknie Properties i wydaje nam się, że to musi być to, co się zmienia na ekranie, a tu czasem logika IDE płata figle. W praktyce, poprawne podejście to zawsze zajrzeć do dokumentacji lub przeprowadzić szybki test – zmienić wartość i zobaczyć, co się realnie dzieje w oknie podglądu. To podstawowa umiejętność każdego, kto na serio chce projektować wygodne i profesjonalne interfejsy, zamiast działać na ślepo.

Pytanie 23

Jaką cechą odznacza się framework w porównaniu do biblioteki?

A. Framework stanowi zbiór funkcji, które programista ma możliwość wykorzystania
B. Framework zapewnia API do szerszego zestawu funkcji
C. Framework oferuje funkcje użyteczne w konkretnej dziedzinie problemu
D. Framework określa strukturę aplikacji i zapewnia jej fundament
Biblioteka to zestaw funkcji i klas, które programista może wykorzystywać według własnego uznania, ale to on decyduje o strukturze aplikacji. API dostarcza zestaw metod do komunikacji z innymi aplikacjami, ale nie narzuca architektury. Framework to coś więcej niż zbiór funkcji – określa cały proces tworzenia aplikacji, czego nie można powiedzieć o zwykłej bibliotece lub narzędziach użytkowych.

Pytanie 24

Który z wymienionych poniżej przykładów ilustruje użycie systemu informatycznego w działalności gospodarczej?

A. E-sklep
B. System nawigacji GPS
C. System sterowania ruchem miejskim
D. System wentylacji
E-sklep, jako przykład zastosowania systemu informatycznego w działalności biznesowej, reprezentuje złożony ekosystem technologiczny, który umożliwia przedsiębiorstwom sprzedaż produktów i usług w Internecie. E-sklepy wykorzystują różnorodne technologie, takie jak systemy zarządzania treścią (CMS), bazy danych oraz systemy płatności, co pozwala na efektywne zarządzanie ofertą, realizację zamówień oraz obsługę klienta. Przykładem może być platforma Shopify, która oferuje funkcjonalności umożliwiające łatwe tworzenie i zarządzanie sklepem online. E-sklepy są zgodne z różnymi standardami, takimi jak PCI DSS, które zapewniają bezpieczeństwo transakcji płatniczych. Dzięki integracji z systemami analitycznymi, właściciele e-sklepów mogą śledzić zachowania użytkowników, co pozwala na optymalizację oferty oraz strategii marketingowej. Tego rodzaju rozwiązania informatyczne fundamentalnie zmieniają sposób, w jaki przedsiębiorstwa prowadzą działalność i komunikują się z klientami, czyniąc procesy bardziej wydajnymi i zautomatyzowanymi.

Pytanie 25

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

let arr = [1, 2, 3, 4, 5];
let result = arr.filter(num => num % 2 === 0);
console.log(result);
A. [1, 3, 5]
B. [2, 4]
C. 2,4
D. [1, 2, 3, 4, 5]
Wybór odpowiedzi [1, 3, 5] lub [2, 4] oraz 2,4 odzwierciedla niezrozumienie działania metody filter w JavaScript. Odpowiedź [1] sugeruje, że program wyświetli wszystkie parzyste liczby, lecz nie uwzględnia, że filter tworzy nową tablicę tylko z liczb spełniających określony warunek, a w tym przypadku tylko liczby parzyste. Ponadto, [3] wskazuje na brak zastosowania filtru, a więc pokazuje wszystkie elementy tablicy, co również jest błędne. Z kolei odpowiedź 2,4 nie jest nawet poprawnym formatem dla JavaScript, gdzie wyniki w konsoli są prezentowane w postaci tablicy z elementami oddzielonymi przecinkami. Takie podejście, aby zapisać wynik w konsoli, a nie odwoływać się do jego struktury, może prowadzić do błędnych interpretacji. Należy pamiętać, że w JavaScript, kluczowym elementem do zrozumienia jest różnica między metodą filter a innymi metodami tablic, takimi jak map czy forEach. Metoda filter zwraca nową tablicę, podczas gdy inne mogą działać na oryginalnych danych bez ich zmiany. Dlatego ważne jest, aby nie tylko znać technikę, ale i jej zastosowanie w kontekście rozwiązania problemu, co jest niezbędne w pracy programisty.

Pytanie 26

Jakie narzędzie najlepiej wykorzystać do testowania API REST?

A. Postman
B. Selenium
C. Jasmine
D. Git
Narzędzia takie jak Git, Selenium czy Jasmine, choć niezwykle użyteczne w swoim kontekście, nie są przeznaczone do testowania API REST. Git to system kontroli wersji, który służy do zarządzania kodem źródłowym i współpracy między programistami, a nie do interakcji z API. Wykorzystanie Gita w testowaniu API może prowadzić do mylnego wrażenia, że jest to odpowiednie narzędzie, podczas gdy w rzeczywistości jego zastosowanie ogranicza się do wersjonowania kodu. Selenium jest narzędziem do automatyzacji testów aplikacji webowych, skupiającym się na interakcjach z interfejsem użytkownika, a więc nie jest odpowiednie do testowania backendu lub API. Jasmine to framework do testowania JavaScript, który jest używany głównie do testowania kodu frontendowego, a nie do weryfikacji działania API. Te pomyłki mogą wynikać z nieprecyzyjnego rozumienia różnicy między testowaniem frontendu a backendu. Warto zrozumieć, że testowanie API wymaga specjalistycznych narzędzi, które potrafią obsługiwać protokoły HTTP, analizować odpowiedzi serwera oraz weryfikować dane, a powyższe narzędzia nie spełniają tych wymogów. Wybór odpowiedniego narzędzia jest kluczowy dla efektywności procesu testowania i zapewnienia wysokiej jakości dostarczanego oprogramowania.

Pytanie 27

Co to jest WebSocket?

A. Protokół komunikacyjny zapewniający komunikację dwukierunkową przez pojedyncze połączenie TCP
B. Biblioteka JavaScript do tworzenia dynamicznych formularzy
C. Narzędzie do testowania aplikacji webowych
D. Standard zapisu danych w formacie binarnym
Zrozumienie podstawowych różnic między protokołami komunikacyjnymi jest kluczowe w kontekście nowoczesnych technologii webowych. Wiele osób myli WebSocket z narzędziami do testowania aplikacji webowych, co prowadzi do nieporozumień. Narzędzia te, choć niezbędne w procesie rozwijania i testowania aplikacji, nie zajmują się rzeczywistą komunikacją między klientem a serwerem, a raczej służą do analizy i debugowania interakcji. Innym powszechnym błędnym wyobrażeniem jest mylenie WebSocket z formatami zapisu danych, co jest całkowicie innym zagadnieniem. Protokół WebSocket nie definiuje sposobu, w jaki dane są zapisywane, ale raczej sposób, w jaki te dane są przesyłane w czasie rzeczywistym. Co więcej, pomysł, że WebSocket jest biblioteką JavaScript do tworzenia dynamicznych formularzy, jest również nieprawidłowy. WebSocket jest protokołem, który wymaga implementacji zarówno po stronie serwera, jak i klienta, a nie tylko narzędzi do interakcji z formularzami. W związku z tym, brak świadomości dotyczącej tych różnic może prowadzić do nieefektywnego projektowania aplikacji, w których kluczowym elementem jest efektywna komunikacja w czasie rzeczywistym. Aby skutecznie wdrożyć nowoczesne rozwiązania webowe, warto zrozumieć, jak WebSocket współdziała z innymi technologiami, takimi jak AJAX czy REST, zamiast skupiać się na mylonych koncepcjach, które mogą wprowadzać w błąd podczas projektowania systemów.

Pytanie 28

Zaprezentowany wykres ilustruje wyniki przeprowadzonych testów

Ilustracja do pytania
A. użyteczności
B. wydajności
C. ochrony
D. funkcjonalności
Wykres przedstawia czasy odpowiedzi strony internetowej co jest kluczowe w kontekście testów wydajnościowych. Testy wydajnościowe mają na celu zmierzenie jak system radzi sobie pod określonym obciążeniem i jak szybko potrafi odpowiedzieć na zapytania użytkowników. Tego typu analiza pomaga zidentyfikować potencjalne wąskie gardła w infrastrukturze IT. Przykładowo jeżeli czasy odpowiedzi DNS lub połączenia są zbyt długie może to wskazywać na potrzebę optymalizacji serwerów DNS lub infrastruktury sieciowej. Testy te są nieodłącznym elementem zapewnienia jakości oprogramowania a ich prawidłowe wykonanie wpływa na doświadczenia użytkowników końcowych. Dobra praktyka w branży IT zakłada regularne przeprowadzanie testów wydajnościowych w celu monitorowania stabilności systemu w warunkach zbliżonych do rzeczywistych. Warto również zauważyć że narzędzia takie jak JMeter czy LoadRunner są powszechnie używane do przeprowadzania takich testów co umożliwia symulację różnorodnych scenariuszy obciążenia i analizę wyników w czasie rzeczywistym.

Pytanie 29

Narzędzie przeznaczone do rozwijania aplikacji w systemie WPf (ang. Windows Presentation Foundation) to

A. Visual Studio
B. PyCharm
C. NetBeans
D. XamarinStudio
Visual Studio to narzędzie, które według mnie jest praktycznie niezbędne do profesjonalnej pracy z WPF (Windows Presentation Foundation). WPF to technologia Microsoftu do budowania nowoczesnych, graficznych interfejsów użytkownika na platformie Windows. Visual Studio posiada wbudowane wsparcie dla projektów WPF – od kreatora nowych aplikacji, przez podpowiedzi składni XAML, aż po graficzny edytor interfejsów, tzw. designer. Na co dzień, gdy projektuję UI w WPF, doceniam funkcje takie jak live preview, debugger XAML czy możliwość natychmiastowego podglądu zmian. Z Visual Studio korzystają praktycznie wszyscy programiści .NET na świecie, bo daje ono dostęp nie tylko do edycji kodu, ale też do narzędzi takich jak NuGet, integracja z systemami kontroli wersji (np. Git), testowanie jednostkowe czy automatyczne refaktoryzacje. Warto wiedzieć, że Microsoft stale rozwija Visual Studio pod kątem WPF, dbając nie tylko o nowości w językach C# i VB.NET, ale też o wygodę pracy z XAML-em oraz wsparcie dla wzorców projektowych, takich jak MVVM. Z praktycznego punktu widzenia, jeśli chcesz tworzyć prawdziwie profesjonalne aplikacje WPF, to Visual Studio jest – moim zdaniem – bezkonkurencyjne. Często nawet początkujący szybko zauważają, jak bardzo przyspiesza ono codzienną pracę i rozwiązywanie problemów typowych dla tej technologii.

Pytanie 30

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

A. Ułatwienie manipulacji DOM oraz obsługi zdarzeń w JavaScript
B. Projektowanie struktur baz danych
C. Tworzenie interfejsów w programach desktopowych
D. Budowanie aplikacji mobilnych
Tworzenie aplikacji mobilnych to domena narzędzi takich jak React Native, Flutter czy Kotlin, które są specjalnie zaprojektowane do pracy na platformach mobilnych i nie wykorzystują jQuery. Tworzenie interfejsów w aplikacjach desktopowych zwykle odbywa się za pomocą narzędzi takich jak Electron, WPF czy JavaFX, a nie jQuery. Projektowanie struktur baz danych wymaga narzędzi takich jak MySQL, PostgreSQL czy MongoDB, które operują na poziomie backendu i nie korzystają z jQuery jako narzędzia do manipulacji danymi.

Pytanie 31

Którego nagłówka używamy w C++ do obsługi plików?

A. <iostream>
B. <fileio.h>
C. <fstream>
D. <stdio.h>
'<stdio.h>' to nagłówek biblioteki C, a nie C++, i jest używany do standardowych operacji wejścia i wyjścia, ale nie jest przeznaczony do pracy z plikami w stylu obiektowym. '<fileio.h>' to nieistniejący standardowy nagłówek C++ – nazwa ta może wprowadzać w błąd. '<iostream>' to biblioteka standardowa służąca do obsługi strumieni wejścia/wyjścia w konsoli (np. 'cin' i 'cout'), ale nie jest używana do pracy z plikami. Tylko 'fstream' oferuje narzędzia dedykowane do obsługi plików na dysku w języku C++.

Pytanie 32

Podczas programowania kontrolki stepper przedstawionej na ilustracji w aplikacji mobilnej, należy zarządzać zmienną, która zawsze przechowuje jej bieżącą wartość. Jakie zdarzenie można wykorzystać do osiągnięcia tej funkcjonalności?

Ilustracja do pytania
A. ValueChanged
B. Unfocused
C. DescendantAdded
D. SizeChanged
Pierwsza z niepoprawnych odpowiedzi DescendantAdded odnosi się do zdarzenia używanego w kontekście hierarchii widoków. To zdarzenie jest uruchamiane, gdy do elementu wizualnego dodany zostaje nowy element podrzędny. Nie ma ono żadnego związku z obsługą zmiany wartości w kontrolkach takich jak stepper, a jego zastosowanie w tym kontekście byłoby nieadekwatne. Zdarzenie Unfocused jest wywoływane, gdy element traci fokus, czyli przestaje być aktywnym elementem interfejsu. Zdarzenie to może być użyteczne w sytuacjach, gdzie konieczne jest zapisanie stanu po opuszczeniu pola tekstowego, ale nie ma zastosowania w kontekście dynamicznego zarządzania wartością steppera. Wreszcie SizeChanged jest zdarzeniem, które występuje, gdy zmienia się rozmiar elementu wizualnego. Może być przydatne w adaptacyjnym projektowaniu interfejsów, ale nie wpływa na logikę aplikacji dotyczącą aktualizacji wartości steppera. Częstym błędem jest mylenie zdarzeń dotyczących interfejsu z tymi, które obsługują logikę biznesową, co prowadzi do niepoprawnego zastosowania w kontekście dynamicznych interakcji z użytkownikiem. Zrozumienie specyfiki każdego zdarzenia i jego poprawnego kontekstu użycia jest kluczowe dla prawidłowego projektowania aplikacji interaktywnych.

Pytanie 33

Które z podejść do tworzenia aplikacji najlepiej uwzględnia przyszłe zmiany w funkcjonalności?

A. Zastosowanie modularnej architektury aplikacji
B. Skupienie się tylko na estetce aplikacji
C. Pisanie kodu bez jakiejkolwiek dokumentacji
D. Tworzenie bez wcześniejszej specyfikacji technicznej
Użycie modularnej architektury aplikacji to najlepsze podejście do projektowania systemów, które muszą uwzględniać przyszłe modyfikacje funkcjonalności. Modularność pozwala na podział aplikacji na mniejsze, niezależne komponenty, które mogą być rozwijane, testowane i aktualizowane niezależnie od siebie. Takie podejście zwiększa elastyczność, ułatwia zarządzanie kodem i pozwala na szybkie wdrażanie nowych funkcji bez konieczności ingerencji w cały system. Architektura modularna jest szczególnie przydatna w dużych projektach, gdzie zmiany są częste, a wymagania dynamicznie się zmieniają.

Pytanie 34

Jak nazywa się technika umożliwiająca asynchroniczne wykonywanie operacji w JavaScript?

A. Variable
B. Promise
C. Function
D. Object
Promise to technika w JavaScript, która umożliwia obsługę operacji asynchronicznych. W odróżnieniu od tradycyjnych funkcji, które mogą blokować wykonanie kodu do momentu zakończenia operacji, Promise pozwala na kontynuację wykonywania kodu, a wyniki operacji są dostępne, gdy zostaną one zakończone. Główne zastosowanie Promise polega na obsłudze operacji takich jak żądania sieciowe, które mogą trwać nieprzewidywalnie długo. Przykładem jest użycie Promise do wykonania zapytania do API: fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)). Dobrą praktyką jest stosowanie asynchronizacji z użyciem async/await, co pozwala na bardziej czytelny kod. Promise jest częścią ECMAScript 2015 (ES6) i stanowi podstawę dla bardziej zaawansowanych technik, takich jak async/await, co pozwala na jeszcze prostszą obsługę asynchronicznych operacji. Zrozumienie Promise jest kluczowe dla efektywnego programowania w JavaScript, zwłaszcza w kontekście aplikacji webowych, gdzie asynchroniczność odgrywa kluczową rolę.

Pytanie 35

Jaki jest podstawowy okres ochrony autorskich praw majątkowych w krajach Unii Europejskiej?

A. 50 lat od chwili pierwszej publikacji utworu
B. 75 lat od daty powstania utworu
C. Bezterminowo
D. 70 lat od zgonu autora
Podstawowy czas trwania autorskich praw majątkowych w Unii Europejskiej wynosi 70 lat od śmierci autora. Oznacza to, że przez ten okres twórca lub jego spadkobiercy mają wyłączne prawo do korzystania z utworu i czerpania z niego korzyści finansowych. Po upływie tego czasu dzieło przechodzi do domeny publicznej i może być swobodnie wykorzystywane przez każdego, bez konieczności uzyskania zgody. Długość ochrony praw autorskich została ujednolicona w ramach przepisów UE, aby zagwarantować spójność w całej wspólnocie i wspierać ochronę kultury oraz dziedzictwa narodowego.

Pytanie 36

W wyniku realizacji zaprezentowanego kodu na ekranie pojawią się:

int tablica[10];

for (int i = 0; i < 10; i++) {
    if (i % 3 != 0)
        std::cout << tablica[i] << ", ";
}
A. wszystkie elementy tablicy, które mają wartość nieparzystą
B. elementy z indeksów tablicy, które są podzielne przez 3
C. elementy tablicy o indeksach: 1, 2, 4, 5, 7, 8
D. wszystkie elementy tablicy, które są wielokrotnością 3
Wiele osób przy tego typu zadaniu potrafi się pomylić przez nieuważne czytanie warunku w instrukcji if albo przez błędne założenie, że chodzi o wartości, a nie indeksy. Kod analizuje tylko indeksy tablicy. Jeżeli założy się, że warunek i % 3 != 0 dotyczy wartości tablicy, a nie samego indeksu, można dojść do wniosku, że na ekranie pojawią się elementy będące wielokrotnościami 3 lub tylko te mające wartości nieparzyste, co jednak jest niezgodne z rzeczywistością, bo tablica nie jest w ogóle inicjalizowana konkretnymi danymi. Zamiast tego, pętla iteruje po i od 0 do 9 i sprawdza, czy indeks nie jest podzielny przez 3. Elementy o indeksach podzielnych przez 3 (czyli 0, 3, 6, 9) są pomijane, więc wyświetlone są tylko te z pozostałych indeksów. Często też popełnia się błąd, myląc warunek „podzielny przez 3” z „niepodzielny przez 3”, co zmienia zupełnie sens działania programu. Dobrą praktyką jest zawsze dokładnie sprawdzać, czy warunek odnosi się do indeksu, czy do wartości oraz jaki jest operator porównania w if-ie. Z mojego doświadczenia wynika, że takie drobiazgi potrafią prowadzić do naprawdę irytujących błędów podczas rozwiązywania większych problemów algorytmicznych. Ważne jest także, by pamiętać, że jeżeli tablica int nie jest zainicjalizowana, nie ma sensu analizować wartości, bo mogą być losowe. Tu liczył się wyłącznie indeks i jego podzielność przez 3, więc każda odpowiedź opierająca się na wartościach elementów zamiast ich położenia jest nietrafiona. Warto na przyszłość dokładnie analizować, czego dotyczy warunek i jakie dane są rzeczywiście dostępne w danej chwili programu.

Pytanie 37

Jakie wyrażenie logiczne powinno być użyte, aby zweryfikować, czy zmienna x zawiera wartości ujemne lub znajduje się w zakresie (10, 100)?

A. x > 10 || x < 100 || x < 0
B. (x > 10 || x < 100) && x < 0
C. x > 10 || x < 100 || x < 0
D. (x > 10 && x < 100) || x < 0
Analizując konstrukcje logiczne użyte w niepoprawnych wariantach, widać, że główny problem tkwi w zbyt szerokim lub zbyt wąskim ujęciu warunków. Przykładowo, zapis typu x > 10 || x < 100 || x < 0 wydaje się na pierwszy rzut oka bliski poprawnej odpowiedzi, ale w rzeczywistości powoduje, że praktycznie każdy przypadek (poza x = 10) będzie spełniał ten warunek, bo zawsze jedna z części będzie prawdziwa. Podobnie w innych wariantach, gdzie operator || jest używany do połączenia zbyt szerokich zakresów, prowadzi to do tego, że nawet liczby większe od 100 są uznawane za prawidłowe, co kompletnie mija się z celem zadania. Z drugiej strony, kombinacja (x > 10 || x < 100) && x < 0 jest zbyt restrykcyjna i wynikiem jej działania będzie prawda tylko wtedy, gdy x jest mniejsze od zera – drugi zakres jest tu praktycznie ignorowany, bo && wymusza spełnienie obu stron, a przecież nie chcemy ograniczać się wyłącznie do liczb ujemnych. To bardzo częsty błąd wśród początkujących – nieprawidłowe łączenie operatorów logicznych przez nieuwagę lub brak doświadczenia z kolejnością ich działania. Moim zdaniem, warto wyrobić sobie nawyk rozbijania takich warunków na kartce lub w notatniku, żeby zobaczyć, jakie wartości zostaną faktycznie objęte zakresem. W praktyce spotkałem się już z sytuacjami, gdzie przez nieprecyzyjne warunki logiczne cały system źle klasyfikował dane, co potem generowało trudne do wykrycia błędy. Sugeruję zawsze sprawdzać swoje wyrażenia na kilku testowych wartościach, zanim trafią do produkcji. To naprawdę oszczędza czas i nerwy.

Pytanie 38

Co to jest SQL injection?

A. Proces automatyzacji tworzenia zapytań SQL
B. Metoda optymalizacji zapytań SQL w bazach danych
C. Technika ataku polegająca na wstrzyknięciu złośliwego kodu SQL do zapytania
D. Narzędzie do importowania danych do bazy SQL
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 39

Jakie jest kluczowe działanie przy opracowywaniu zbiorów danych do rozwiązania problemu programistycznego?

A. Weryfikacja zbiorów danych przed ich zastosowaniem
B. Wybór odpowiednich struktur danych
C. Zmiana języka programowania na bardziej wydajny
D. Realizacja algorytmu sortującego
Implementacja algorytmu sortującego jest ważna, ale to właśnie nie jest ten najważniejszy moment w pracy z danymi – raczej końcowy etap. Zmiana języka programowania oczywiście może wpłynąć na wydajność, ale pamiętaj, że to struktury danych są kluczowe dla efektywności programu, niezależnie od wybranego języka. Testowanie zestawów danych to istotna część sprawdzania projektu, ale samo testowanie nie zastąpi dobrze przemyślanego doboru struktur danych na początku całego procesu. Bez tego trudno o dobry efekt.

Pytanie 40

W programie desktopowym stworzono rozwijaną listę oraz przypisano cztery funkcje do obsługi zdarzeń tej kontrolki. Jaki komunikat pojawi się po dokonaniu wyboru w tej liście?
W XAML (uproszczona wersja):

<ComboBox SelectionChanged="Funkcja1" DragEnter="Funkcja2"
    LostFocus="Funkcja3" KeyDown="Funkcja4">
</ComboBox>
W kodzie:
private void Funkcja1(object sender, SelectionChangedEventArgs e)
{
    MessageBox.Show("Zdarzenie 1");
}
private void Funkcja2(object sender, DragEventArgs e)
{
    MessageBox.Show("Zdarzenie 2");
}
private void Funkcja3(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Zdarzenie 3");
}
private void Funkcja4(object sender, KeyEventArgs e)
{
    MessageBox.Show("Zdarzenie 4");
}
A. Zdarzenie 4
B. Zdarzenie 3
C. Zdarzenie 1
D. Zdarzenie 2
W zadaniu chodziło o to, jakie zdarzenie zostanie wywołane po dokonaniu wyboru w rozwijanej liście ComboBox. Wielu osobom może się wydawać, że zmiana wyboru w kontrolce może powodować aktywację różnych zdarzeń, takich jak LostFocus czy KeyDown, zwłaszcza jeśli wcześniej mieli styczność z WinForms lub innymi frameworkami UI. Zdarzenie LostFocus jednak zostaje wywołane tylko wtedy, gdy kontrolka traci fokus, czyli gdy użytkownik przestaje ją aktywnie obsługiwać, na przykład klikając gdzie indziej – nie podczas zwykłego wyboru elementu. KeyDown natomiast obsługuje sytuacje, w których użytkownik naciska klawisz na klawiaturze, więc ma to sens tylko, gdy wybór w ComboBox jest dokonywany za pomocą klawiatury, ale nawet wtedy domyślnie KeyDown nie informuje o zmianie wybranego elementu, tylko o naciśnięciu klawisza. DragEnter jest całkiem osobną kategorią – to zdarzenie wywołuje się tylko wtedy, gdy przeciągamy jakiś element nad ComboBoxem, co w praktyce nie ma nic wspólnego z normalnym wyborem z listy. Często spotykam się z przekonaniem, że Focus i jego utrata mają coś wspólnego z wyborem wartości, ale według dokumentacji Microsoftu oraz praktyki programistycznej to dwie różne sprawy. SelectionChanged to standardowy, branżowy sposób wykrywania zmiany wyboru w kontrolkach typu ComboBox – niezależnie od tego czy użytkownik używa myszki, klawiatury czy nawet ekranów dotykowych. Właśnie dlatego ta odpowiedź jest właściwa. Moim zdaniem nieporozumienia biorą się często z niejasnego rozumienia różnicy między różnymi zdarzeniami UI. W środowiskach takich jak WPF lub UWP bardzo się to rozdziela i dokumentacja zawsze to podkreśla. Dobrą praktyką jest przypisywanie każdej funkcji tylko do tych zdarzeń, które rzeczywiście dotyczą konkretnej akcji użytkownika – to pozwala uniknąć nieprzyjemnych bugów i nieoczekiwanych komunikatów w aplikacji.