Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 20 kwietnia 2026 13:55
  • Data zakończenia: 20 kwietnia 2026 14:08

Egzamin niezdany

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

Wymagane minimum: 20 punktów (50%)

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

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

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

Pytanie 2

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
To wyrażenie logiczne: (x > 10 && x < 100) || x < 0 jest najtrafniejsze, bo dokładnie oddaje założone warunki: zmienna x powinna być ujemna lub znajdować się w zakresie od 10 do 100 (bez tych wartości granicznych, czyli przedział otwarty). Z mojego doświadczenia wynika, że takie podejście jest stosowane wszędzie tam, gdzie istotne są szczegółowe warunki – np. w walidacji danych wejściowych czy podczas filtrowania w bazach danych. Operator || gwarantuje, że jeśli chociaż jeden z warunków jest prawdziwy (czyli x jest mniejsze od 0 lub należy do przedziału 10-100), całe wyrażenie zwróci true. Warto też pamiętać, że zastosowanie operatora && wewnątrz nawiasu zapewnia, że oba warunki (x > 10 oraz x < 100) muszą być spełnione jednocześnie, czyli x leży pomiędzy tymi liczbami. Odpowiedniki takiego zapisu znajdziesz praktycznie w każdym języku programowania – od Javy po Pythona. Branżowe standardy jasno wskazują na czytelność i jednoznaczność warunków logicznych, szczególnie jeśli kod ma być utrzymywany przez inne osoby lub przez nas samych za kilka miesięcy. Uważam, że precyzyjne formułowanie wyrażeń tego typu to podstawa dobrego programisty – naprawdę warto się tego trzymać, bo później mniej błędów wychodzi na produkcji, a kod jest dużo łatwiej przetestować. Często spotykam się z przypadkami, gdzie ktoś pomija nawiasy lub źle łączy operatory i potem są problemy z błędami logicznymi, dlatego warto wyrobić sobie taki nawyk dokładnego zapisywania warunków.

Pytanie 3

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

A. dodać deklarację funkcji sprawdz przed funkcją main
B. poprawnie zapisać warunek w instrukcji if w linii 11, np. sprawdz(x)==true
C. zadeklarować zmienną sprawdz przed jej wykorzystaniem w linii 11
D. naprawić błąd w funkcji sprawdz, który polega na braku nawiasów {} w pętli for
Odpowiedź jest trafna, bo w języku C++ kompilator musi wiedzieć o istnieniu funkcji zanim zostanie ona użyta w kodzie, np. w funkcji main. Bez wcześniejszej deklaracji, kompilator nie zna sygnatury funkcji i nie potrafi zweryfikować wywołania, co skutkuje błędem typu 'implicit declaration of function'. Deklaracja funkcji to taki sygnał informujący kompilator „hej, taka funkcja będzie i będzie przyjmować takie argumenty, a zwracać taki typ”. Praktycznie rzecz biorąc, przed funkcją main wystarczy wpisać np. 'bool sprawdz(int x);', żeby wszystko grało. To szczególnie ważne przy większych projektach czy pracy w zespołach, gdzie pliki nagłówkowe z deklaracjami funkcji są standardem. Pozwala to na lepszą czytelność i porządek w kodzie – kompilator wie, czego się spodziewać, a Ty unikasz dziwnych, trudnych do znalezienia błędów. Moim zdaniem taka organizacja kodu to podstawa, szczególnie jeśli kiedyś będziesz korzystać z bibliotek lub cudzych funkcji – deklaracje są wtedy wręcz obowiązkowe. To zasada, której trzyma się większość zespołów programistycznych i, szczerze mówiąc, sam kilka razy w młodości zapomniałem o deklaracji, przez co debugowanie trwało wieki. Warto od razu wyrobić sobie taki nawyk, bo to oszczędza sporo nerwów i czasu, a kod staje się solidniejszy i bardziej profesjonalny.

Pytanie 4

Jakie aspekty powinny być brane pod uwagę przy tworzeniu zestawów danych?

A. Typ zastosowanego kompilatora
B. Narzędzia do analizy błędów
C. Metoda alokacji pamięci dla danych
D. Ilość linii kodu programu
Długość kodu programu wpływa na czytelność i utrzymanie, ale nie jest kluczowym czynnikiem przy projektowaniu zestawów danych. Kompilator decyduje o tym, jak kod jest przekształcany w kod maszynowy, ale nie ma bezpośredniego wpływu na strukturę danych. Narzędzia do debugowania są istotne w procesie testowania i wykrywania błędów, ale nie odgrywają kluczowej roli w początkowej fazie projektowania zestawów danych. Kluczowe jest odpowiednie zaplanowanie struktury danych i sposobu ich przechowywania, co decyduje o efektywności aplikacji.

Pytanie 5

Które z wymienionych sformułowań najlepiej definiuje oprogramowanie typu ransomware?

A. Oprogramowanie uniemożliwiające dostęp do danych w celu wymuszenia zapłaty
B. Oprogramowanie stosowane do realizacji ataków DDoS
C. Złośliwe aplikacje wyświetlające reklamy
D. Programy zbierające prywatne dane bez zgody użytkownika
Odpowiedzi wskazujące na inne formy złośliwego oprogramowania, takie jak programy zbierające dane osobowe, oprogramowanie do ataków DDoS oraz złośliwe aplikacje wyświetlające reklamy, są niepoprawne w kontekście definicji ransomware. Programy zbierające dane osobowe działają w celu gromadzenia informacji o użytkownikach, często bez ich zgody, lecz nie mają na celu blokowania dostępu do danych ani wymuszania okupu. Z kolei oprogramowanie stosowane do ataków DDoS (Distributed Denial of Service) ma za zadanie zablokować dostęp do serwisów internetowych poprzez ich przeciążenie, a nie szyfrowanie danych użytkowników. Takie ataki są skierowane na infrastruktury sieciowe lub serwery, co różni się od typowych mechanizmów ransomware, które koncentrują się na lokalnych plikach. Złośliwe aplikacje wyświetlające reklamy, znane jako adware, generują dochody poprzez wyświetlanie niechcianych reklam, co nie ma związku z wymuszaniem okupu ani szyfrowaniem danych. Te rodzaje oprogramowania mają różne cele i metody działania, ale nie są zbliżone do funkcji i skutków ataku ransomware.

Pytanie 6

Jakie jest oznaczenie normy międzynarodowej?

A. CE
B. ISO
C. EN
D. PN
PN (Polska Norma) to krajowy odpowiednik norm, który dotyczy produktów i usług w Polsce – nie jest to oznaczenie międzynarodowe. EN (European Norm) to europejskie standardy, które są stosowane na poziomie Unii Europejskiej i nie mają statusu globalnego. Oznaczenie CE (Conformité Européenne) wskazuje, że produkt spełnia wymagania dyrektyw unijnych dotyczących bezpieczeństwa, zdrowia i ochrony środowiska, jednak nie jest to norma międzynarodowa, lecz certyfikat obowiązujący na terenie UE.

Pytanie 7

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

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

Pytanie 8

Programista może wykorzystać framework Angular do realizacji aplikacji:

A. rodzaju front-end
B. rodzaju back-end
C. na komputerze
D. mobilnej
Aplikacje back-endowe zazwyczaj pisze się w innych frameworkach, jak na przykład Express.js albo Django. Wiadomo, że Angular zajmuje się warstwą kliencką. A jak mówimy o aplikacjach mobilnych czy desktopowych, to częściej korzysta się z takich rzeczy jak Flutter, React Native czy Electron. Więc to już nie jest to samo co Angular.

Pytanie 9

Która biblioteka JavaScript jest najczęściej używana do tworzenia testowalnych funkcji asynchronicznych?

A. D3.js
B. Underscore.js
C. Axios
D. Moment.js
Moment.js, D3.js i Underscore.js to biblioteki, które pełnią zupełnie inne funkcje w porównaniu do Axios. Moment.js jest używany głównie do manipulacji datami i czasem, co jest niezwykle przydatne w kontekście tworzenia aplikacji, które wymagają zaawansowanej obsługi dat i stref czasowych. Z drugiej strony, D3.js to potężne narzędzie do wizualizacji danych, pozwalające na tworzenie skomplikowanych wykresów i diagramów w przeglądarkach. Jego zastosowanie w asynchronicznym programowaniu jest ograniczone, ponieważ koncentruje się na prezentacji danych, a nie na ich pozyskiwaniu czy przetwarzaniu. Underscore.js jest z kolei biblioteką, która dostarcza funkcje pomocnicze do programowania funkcyjnego, ułatwiając pracę z kolekcjami danych, ale nie ma bezpośredniego związku z asynchronicznymi żądaniami HTTP. Typowym błędem może być mylenie funkcji każdej z tych bibliotek. Często programiści mogą pomyśleć, że każda z tych bibliotek wspiera asynchroniczność, jednak to Axios w tej dziedzinie jest liderem. Warto zwrócić uwagę, że wybór odpowiedniego narzędzia do konkretnego zadania jest kluczowy w programowaniu, a zrozumienie funkcji każdej biblioteki pozwala na efektywniejsze rozwiązywanie problemów.

Pytanie 10

Które z poniższych narzędzi jest używane do statycznej analizy kodu JavaScript?

A. Jest
B. Webpack
C. ESLint
D. Babel
Webpack, Babel i Jest to narzędzia, które pełnią różne funkcje w procesie tworzenia aplikacji JavaScript, jednak żadna z tych opcji nie jest używana do statycznej analizy kodu. Webpack to narzędzie do pakowania modułów, które pozwala programistom łączyć różne zasoby, takie jak skrypty, style czy obrazy, w jeden plik wynikowy, co jest bardzo przydatne w kontekście optymalizacji aplikacji. Z kolei Babel to transpilator, który umożliwia pisanie kodu w nowoczesnym JavaScript, a następnie konwertuje go do wersji, która jest kompatybilna z szerszą gamą przeglądarek. Dzięki Babel możemy korzystać z najnowszych funkcji języka, co zdecydowanie ułatwia rozwój, jednak nie ma on możliwości analizy statycznej. Natomiast Jest to framework testowy, który skupia się na jednostkowym testowaniu kodu JavaScript. Choć Jest pozwala na pisanie testów i sprawdzanie poprawności działania kodu, to również nie pełni roli narzędzia do analizy statycznej. Wybierając te narzędzia, można wprowadzać różne aspekty optymalizacji i poprawy jakości kodu, ale nie zastąpią one dedykowanych narzędzi do analizy, jak ESLint. Warto zrozumieć, że każde z tych narzędzi ma swoją specyfikę i zastosowanie, co jest kluczowe w kontekście efektywnego używania ich w projektach programistycznych.

Pytanie 11

Która z poniższych metod najlepiej nadaje się do wizualnego przedstawienia procesu decyzyjnego?

A. Schemat blokowy
B. Pseudokod
C. Lista kroków
D. Drzewo decyzyjne
Drzewo decyzyjne to rzeczywiście najlepsza metoda wizualnego przedstawienia procesu decyzyjnego, ponieważ zostało stworzone dokładnie w tym celu. Jego struktura hierarchiczna idealnie oddaje naturę podejmowania decyzji - zaczynamy od głównego problemu, a następnie rozgałęziamy się na kolejne możliwości w zależności od wybranych opcji. Drzewo decyzyjne pozwala na przejrzyste zobrazowanie wszystkich możliwych ścieżek, jakie może obrać proces w zależności od podjętych wyborów. Każdy węzeł reprezentuje punkt decyzyjny, gałęzie symbolizują dostępne opcje, a liście pokazują końcowe rezultaty. Dzięki temu można łatwo analizować konsekwencje każdej decyzji i porównywać różne scenariusze. Ta metoda znajduje szerokie zastosowanie w biznesie, medycynie, informatyce oraz analizie ryzyka. Pamiętaj o tej wiedzy - umiejętność wyboru odpowiedniego narzędzia wizualizacji jest kluczowa w pracy analitycznej.

Pytanie 12

Które narzędzie służy do zarządzania zależnościami w projekcie JavaScript?

A. docker
B. postman
C. git
D. npm
Git, Docker i Postman to narzędzia, które są niezwykle przydatne w procesie tworzenia oprogramowania, ale pełnią zupełnie inne funkcje niż npm. Git to system kontroli wersji, który umożliwia śledzenie zmian w kodzie oraz współpracę zespołową. Chociaż jest kluczowy w zarządzaniu projektami, nie ma zastosowania w zarządzaniu zależnościami, co jest głównym celem npm. Docker to z kolei platforma do tworzenia, uruchamiania i zarządzania aplikacjami w kontenerach, co pozwala na łatwe przenoszenie i uruchamianie aplikacji w różnych środowiskach, ale również nie dotyczy bezpośrednio zarządzania paczkami JavaScript. Postman jest narzędziem do testowania interfejsów API, co także nie ma związku z instalowaniem i śledzeniem zależności w projektach. Typowym błędem jest mylenie funkcji tych narzędzi, co może prowadzić do nieefektywnego zarządzania projektem. Na przykład, jeśli projektant zdecyduje się nie korzystać z npm, może to prowadzić do problemów z zarządzaniem wersjami zewnętrznych bibliotek, co w konsekwencji może skutkować błędami w działaniu aplikacji. Dlatego ważne jest, aby zrozumieć, że każde z tych narzędzi ma swoje unikalne zastosowanie i są one komplementarne, a nie zamienne.

Pytanie 13

Która z wymienionych bibliotek stanowi element standardowego zestawu narzędzi programistycznych w Pythonie?

A. <stdio.h>
B. sys
C. <math.h>
D. vector
Biblioteka `sys` w Pythonie jest częścią standardowego środowiska programistycznego i dostarcza narzędzi do interakcji z systemem operacyjnym. Umożliwia między innymi dostęp do argumentów wiersza poleceń, zarządzanie ścieżkami modułów, jak również zakończenie działania programu za pomocą `sys.exit()`. Dzięki `sys` programista ma kontrolę nad podstawowymi funkcjami systemowymi, co czyni tę bibliotekę kluczową w wielu aplikacjach i skryptach automatyzujących.

Pytanie 14

Co to jest GraphQL?

A. Format danych podobny do JSON używany w komunikacji między aplikacjami
B. Język zapytań do API oraz środowisko wykonawcze do obsługi tych zapytań
C. System zarządzania bazami grafowymi
D. Biblioteka do tworzenia grafów i diagramów w aplikacjach webowych
Wybór odpowiedzi, która sugeruje, że GraphQL jest biblioteką do tworzenia grafów i diagramów w aplikacjach webowych, jest mylący, ponieważ nie uwzględnia fundamentalnych cech i funkcji tego narzędzia. GraphQL nie jest narzędziem graficznym, lecz technologią służącą do efektywnego zarządzania zapytaniami w API. Odpowiedź wskazująca na system zarządzania bazami grafowymi również nie odzwierciedla rzeczywistości, ponieważ GraphQL nie jest systemem bazodanowym, lecz interfejsem do komunikacji z różnymi źródłami danych, które mogą być zrealizowane przy użyciu różnych baz danych, w tym relacyjnych, NoSQL czy grafowych. Ponadto, w przypadku odpowiedzi sugerującej, że GraphQL to format danych podobny do JSON, należy podkreślić, że choć GraphQL używa JSON do przesyłania danych, jego istotą jest definicja zapytań oraz struktura danych, a nie tylko ich format. Często mylone to jest z protokołami komunikacyjnymi, takimi jak REST, które również mogą wykorzystywać JSON, ale nie oferują takiej elastyczności w zakresie kształtowania odpowiedzi, jaką zapewnia GraphQL. Takie nieporozumienia mogą prowadzić do niewłaściwego zrozumienia architektury aplikacji oraz potencjalnych ograniczeń w wydajności i użyteczności implementacji API.

Pytanie 15

Jaką złożoność obliczeniową posiada podany algorytm?
Dane:
Tablica: tab[n]
Index: i = 0, 1, ..., n-1
x: szukana

Algorytm:

// K1: i0
// K2: dopóki i < (n - 1)
    // K3: jeżeli tab[i] = x to wypisz i
    // K4: ii + 1
    // K5: idź do K2
// K6: zakończ
A. O(1)
B. O(n2)
C. O(n log n)
D. O(n)
W kontekście złożoności obliczeniowej łatwo wpaść w pułapkę myślenia, że algorytm wydaje się bardziej złożony, niż jest w rzeczywistości. Przykładowo, wybór O(n log n) sugeruje obecność jakiegoś sortowania lub podziału danych, co zupełnie nie występuje w tym rozwiązaniu – tu nie ma rekurencji, dzielenia na podtablice ani żadnych bardziej skomplikowanych operacji. Złożoność O(n^2) typowa jest dla algorytmów, gdzie mamy zagnieżdżone pętle, czyli każda iteracja głównej pętli wyzwala kolejną pełną pętlę po danych – a tutaj pętla jest tylko jedna i przechodzi przez tablicę jeden raz. Bardzo często myli się to z sortowaniem bąbelkowym czy selekcyjnym, gdzie rzeczywiście występuje kwadratowa złożoność, ale nie w prostym przeszukiwaniu liniowym. Z kolei O(1), czyli czas stały, dotyczy tylko takich algorytmów, gdzie liczba operacji nie zależy od wielkości wejścia – na przykład odczytanie elementu z tablicy po znanym indeksie. Tu jednak liczba kroków wzrasta liniowo wraz z n, czyli liczbą elementów, więc niestety nie jest to czas stały. Moim zdaniem, wiele osób błędnie utożsamia prostotę kodu z czasem stałym, ale w rzeczywistości chodzi o to, jak algorytm zachowuje się, gdy ilość danych znacząco rośnie. W tej sytuacji odpowiednia analiza pętli i sposobu przetwarzania danych pozwala szybko zauważyć, że algorytm ten to klasyczne O(n), zgodne z najprostszymi wzorcami algorytmicznymi spotykanymi w praktyce.

Pytanie 16

Jaki środek ochronny najlepiej chroni przed hałasem w biurze?

A. Okna zamknięte
B. Panele akustyczne wygłuszające
C. Mata antypoślizgowa
D. Lampy biurowe o niskim poziomie natężenia światła
Wygłuszające panele akustyczne to jedno z najlepszych rozwiązań w celu ograniczenia hałasu w biurach i innych miejscach pracy. Panele te redukują odbicia dźwięku i zmniejszają natężenie hałasu, co przekłada się na poprawę koncentracji oraz zmniejszenie zmęczenia i stresu. W biurach typu open space panele akustyczne znacząco poprawiają komfort pracy, umożliwiając prowadzenie rozmów bez nadmiernego zakłócania pracy innych osób. Dodatkowo, wygłuszenie pomaga w ochronie zdrowia pracowników, redukując ryzyko utraty słuchu w miejscach, gdzie występuje wysoki poziom hałasu. Odpowiednie rozmieszczenie paneli pozwala także na lepsze zarządzanie akustyką całego pomieszczenia.

Pytanie 17

Który z wymienionych parametrów dysku twardego ma największy wpływ na jego wydajność?

A. Rodzaj złącza (SATA/PCIe)
B. Pojemność dysku
C. Prędkość obrotowa talerzy (RPM)
D. Ilość pamięci podręcznej (Cache)
Prędkość obrotowa talerzy (RPM) jest kluczowym parametrem wpływającym na szybkość dysku twardego. Wyrażana w obrotach na minutę, RPM definiuje, jak szybko talerze dysku mogą obracać się, co z kolei wpływa na czas dostępu do danych. Dyski HDD o wyższej prędkości obrotowej, takie jak 7200 RPM w porównaniu do 5400 RPM, zazwyczaj oferują lepszą wydajność, co przekłada się na szybsze odczyty i zapisy danych. Przykładowo, w zastosowaniach wymagających intensywnego przetwarzania danych, takich jak gry komputerowe czy edycja wideo, wybór dysku o wyższej prędkości obrotowej może znacznie poprawić ogólne wrażenia użytkownika. Warto również zauważyć, że chociaż złącze SATA i PCIe wpływają na szybkość transferu, to w kontekście dysków HDD, RPM pozostaje jednym z najważniejszych czynników. Standardy takie jak SATA III oferują transfery do 6 Gb/s, ale jeśli talerze nie obracają się wystarczająco szybko, potencjał transferu nie zostanie w pełni wykorzystany. Z tego powodu, RPM jest kluczowym wskaźnikiem wydajności w kontekście dysków twardych.

Pytanie 18

Na ilustracji pokazany jest fragment diagramu blokowego pewnego algorytmu. Ile razy warunek n<7 będzie badany?

Ilustracja do pytania
A. 7
B. 5
C. 8
D. 6
Wybór innej odpowiedzi niż 4 wskazuje na nieprawidłowe rozumienie mechanizmu działania pętli z warunkiem końcowym Problem może tkwić w błędnym założeniu dotyczącym liczby iteracji które ma miejsce gdy nie uwzględnia się początkowej wartości n Wynik 8 mógłby wynikać z mylnego założenia że pętla sprawdza warunek również po zakończeniu gdy n wynosi 7 co jest nieprawidłowe Ponadto wybór 5 może sugerować że zrozumienie zakresu wartości n jest niepełne ponieważ pomija się pierwszą iterację gdy n równa się 1 Odpowiedź 7 mogłaby wynikać z błędnego przeliczania liczby iteracji lub niepoprawnego przeanalizowania działania inkrementacji w algorytmie Ważne jest aby zrozumieć że warunek n mniejsze od 7 jest sprawdzany na początku każdej iteracji pętli i gdy n osiąga wartość 7 pętla nie wykonuje się ponownie Zrozumienie tego mechanizmu jest kluczowe do poprawnego projektowania algorytmów i unikania typowych błędów logicznych które mogą prowadzić do nieefektywności kodu oraz trudności w jego debugowaniu i utrzymaniu Praktykując analizę schematów blokowych i algorytmów warto zwrócić uwagę na działanie warunków i ich wpływ na przebieg pętli co ma szerokie zastosowanie zarówno w programowaniu jak i w analizie danych oraz automatyzacji procesów

Pytanie 19

Jakie wartości może przyjąć zmienna typu boolean?

A. true, false
B. trzy dowolne liczby naturalne
C. O oraz każdą liczbę całkowitą
D. 1, -1
Zmienna typu logicznego (boolowskiego) w językach programowania, takich jak C++, Java czy Python, może przyjmować tylko dwie wartości: true (prawda) oraz false (fałsz). Te wartości są fundamentalne w logice komputerowej, ponieważ umożliwiają podejmowanie decyzji oraz kontrolowanie przepływu programu poprzez struktury warunkowe, takie jak instrukcje if, while czy for. Na przykład, w języku Python, tworząc zmienną logiczną, możemy użyć operatorów porównania, aby określić, czy dwie wartości są równe: is_equal = (5 == 5), co ustawia is_equal na true. Zmienne logiczne są zdefiniowane w standardach programowania, takich jak IEEE 754 dla reprezentacji liczb zmiennoprzecinkowych, gdzie wartość logiczna jest kluczowa dla operacji porównawczych. Dobrze zrozumiana logika boolowska jest niezbędna dla programistów, ponieważ stanowi podstawę algorytmu decyzyjnego oraz wpływa na efektywność kodu.

Pytanie 20

Który z wymienionych elementów UI w aplikacjach mobilnych jest odpowiedzialny za przechodzenie pomiędzy ekranami?

A. Pasek narzędziowy
B. ListView
C. Navigation Drawer
D. Przycisk
Navigation Drawer to jeden z najczęściej stosowanych komponentów interfejsu użytkownika w aplikacjach mobilnych na platformie Android. Pozwala na stworzenie bocznego menu nawigacyjnego, które użytkownik może wysunąć z lewej (lub rzadziej z prawej) krawędzi ekranu. Drawer umożliwia szybki dostęp do różnych sekcji aplikacji, co poprawia nawigację i organizację interfejsu. Navigation Drawer jest szeroko wykorzystywany w aplikacjach mobilnych takich jak Gmail, YouTube czy Google Maps, ponieważ zapewnia przejrzysty i intuicyjny sposób poruszania się po aplikacji, zachowując minimalistyczny wygląd interfejsu. Dzięki niemu użytkownik ma dostęp do wielu opcji bez konieczności zaśmiecania głównego ekranu aplikacji przyciskami nawigacyjnymi. W Android Studio Navigation Drawer można zaimplementować poprzez gotowe szablony lub za pomocą komponentu DrawerLayout.

Pytanie 21

Który z wymienionych mechanizmów umożliwia ograniczenie dostępu do wybranych sekcji aplikacji webowej?

A. Formularze dynamiczne
B. Pliki CSS statyczne
C. System logowania i kontroli dostępu
D. Mechanizm renderowania treści
System logowania i kontroli dostępu to kluczowy mechanizm, który pozwala na ograniczenie dostępu do niektórych części aplikacji webowej. Logowanie umożliwia uwierzytelnienie użytkowników i przypisanie im odpowiednich ról, co definiuje poziom dostępu do zasobów. Dzięki mechanizmom autoryzacji możliwe jest kontrolowanie, które funkcje lub sekcje aplikacji są dostępne dla poszczególnych użytkowników. Kontrola dostępu może być realizowana za pomocą tokenów JWT (JSON Web Token), sesji lub kluczy API, co zapewnia dodatkowe warstwy zabezpieczeń. Wdrożenie takich systemów jest nieodzowne w aplikacjach webowych oferujących różne poziomy funkcjonalności, takich jak panele administracyjne, portale użytkowników czy aplikacje bankowe. Odpowiednie zarządzanie uprawnieniami jest fundamentem bezpieczeństwa aplikacji.

Pytanie 22

W klasie pracownik zdefiniowano następujące metody:

pracownik()   { ... }
static void wypisz()   { ... }
int operator== (const pracownik &prac) { ... }
~pracownik()   { ... }
Która z nich jest odpowiednia do dodania elementu diagnostycznego o treści:
cout << "Obiekt został usunięty";
Ilustracja do pytania
A. pracownik
B. operator==
C. wypisz
D. ~pracownik
Destruktor to specjalna metoda w języku C++ oznaczona tyldą przed nazwą klasy która jest wywoływana automatycznie w momencie usuwania obiektu danego typu z pamięci. Dlatego dodanie elementu diagnostycznego cout<<Obiekt został usunięty; jest najbardziej sensowne w destruktorze ponieważ pozwala na śledzenie momentu w którym obiekt przestaje istnieć. Takie podejście jest zgodne z dobrymi praktykami programistycznymi ponieważ pomaga w debugowaniu i zarządzaniu zasobami w programie. Warto zauważyć że destruktory są kluczowe w kontekście zarządzania pamięcią szczególnie gdy klasa dynamicznie alokuje zasoby. Wówczas destruktor powinien zawierać kod zwalniający te zasoby aby uniknąć wycieków pamięci. Dodawanie diagnostycznych komunikatów może pomóc programistom w identyfikacji potencjalnych błędów związanych z zarządzaniem cyklem życia obiektów i poprawić ogólną stabilność i czytelność kodu. Praktyka ta jest szczególnie ważna w dużych projektach gdzie ręczne śledzenie wszystkich obiektów byłoby trudne i czasochłonne. Warto stosować taką diagnostykę w połączeniu z nowoczesnymi narzędziami do profilowania i analizy pamięci co zwiększa efektywność procesu programistycznego.

Pytanie 23

Jakie będą skutki wykonania podanego fragmentu kodu w języku C++?

vector <int> liczby;
for(int i=0; i<10; i++) {
    liczby.push_back(2*i);
}
A. Z tablicy liczby usuwane są elementy, z każdym obiegiem pętli eliminowany jest element z jej początku.
B. Do tablicy liczby, na jej początku, dodawane są nowe wartości.
C. Z tablicy liczby usuwane są elementy, z każdym obiegiem pętli eliminowany jest element z jej końca.
D. Do tablicy liczby, na jej końcu, dodawane są nowe wartości.
Analizując zaproponowane odpowiedzi, łatwo zauważyć kilka typowych nieporozumień, które często pojawiają się na etapie nauki pracy z kolekcjami w C++. Po pierwsze, wielu osobom myli się pojęcie 'dodawania na początku' z 'dodawaniem na końcu', zwłaszcza że niektóre struktury standardowe, jak listy dwukierunkowe (std::list), umożliwiają wygodne wstawianie na początku (push_front). Jednak w przypadku std::vector nie ma metody push_front, a push_back oznacza zawsze dodanie nowego elementu do końca wektora, co powoduje, że kolejność elementów jest zachowana zgodnie z kolejnością ich dodawania. Błędne jest także przekonanie, że za każdym przebiegiem pętli z wektora coś jest usuwane – takie operacje wymagałyby jawnego wywołania metod erase(), pop_back() lub pop_front(), których tutaj w ogóle nie zastosowano. To bardzo istotne, bo domyślnie wektor nie usuwa niczego sam z siebie. Równie często spotykanym błędem jest mylenie działania innych kolekcji, jak np. kolejki FIFO (gdzie pop_front rzeczywiście usuwa pierwszy element), z zachowaniem vectora, który domyślnie dodaje na końcu. Sporo osób wychodzi z założenia, że 'dynamiczna tablica' powinna się samoistnie przesuwać lub skracać – ale to nie jest prawda w C++. Warto zapamiętać, że vector w C++ jest stworzony głównie do efektywnego rozbudowywania od końca i to jest zgodne z koncepcją dynamicznego zarządzania pamięcią w nowoczesnych językach programowania. Każdy inny sposób użycia wymaga dodatkowego kodu. Z mojego punktu widzenia dobrze jest od razu wyrobić sobie nawyk rozróżniania, która operacja jest domyślnie dostępna w danym kontenerze. Brak tej wiedzy prowadzi do błędnych założeń co do działania kodu i generuje trudne do wychwycenia błędy logiczne.

Pytanie 24

W przedstawionej ramce znajduje się fragment opisu metody compile języka Java wykorzystywanej w kontekście wyrażeń regularnych. Który symbol powinien być użyty, aby znaleźć dopasowanie na końcu tekstu?

MetacharacterDescription
|Find a match for any one of the patterns separated by | as in: cat|dog|fish
.Find just one instance of any character
^Finds a match as the beginning of a string as in: ^Hello
$Finds a match at the end of the string as in: World$
\dFind a digit
\sFind a whitespace character
\bFind a match at the beginning of a word like this: \bWORD, or at the end of a word like this: WORD\b
\uxxxxFind the Unicode character specified by the hexadecimal number xxxx
Źródło https://www.w3schools.com/java/java_regex.asp dostęp 20.08.2020
A. .
B. ^
C. $
D. |
Znak dolara $ w wyrażeniach regularnych w języku Java jest używany do oznaczenia końca ciągu znaków. Jeśli chcemy sprawdzić, czy konkretny wzorzec występuje na końcu danego tekstu, używamy właśnie tego metaznaku. Przykładowo, wyrażenie regularne World$ dopasuje tekst, w którym słowo World pojawia się na samym końcu. Jest to przydatne w wielu scenariuszach, takich jak walidacja struktury tekstu czy filtrowanie logów, gdzie ważna jest pozycja występowania wzorca. Konwencja ta jest zgodna z ogólnymi standardami regex, co czyni ją intuicyjną i uniwersalną w zastosowaniu. Dolar pełni kluczową rolę w automatyzacji procesów w przetwarzaniu tekstu, umożliwiając efektywne dopasowywanie końcowych wzorców w aplikacjach Java. Użycie $ jest zgodne z dobrymi praktykami kodowania, szczególnie w kontekście walidacji danych wejściowych, gdzie określenie końca ciągu jest często wymagane. Jest to także popularne w analizie danych, gdzie dane muszą spełniać określone kryteria co do ich zakończenia, takie jak rozszerzenia plików czy określone etykiety tekstowe.

Pytanie 25

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

A. 1000
B. 2048
C. 1024
D. 512
No to fajnie, że trafiłeś w temat! 1 terabajt (TB) to 1024 gigabajty (GB), co wynika z systemu binarnego, który w IT jest najczęściej używany. Trochę technicznie mówiąc, 1 TB to tak naprawdę 2^40 bajtów, co daje nam ogromną liczbę – dokładnie 1 099 511 627 776 bajtów. Jak podzielisz to przez 1 073 741 824 bajtów, które to są 1 GB, to wyjdzie 1024 GB. Warto wiedzieć, że w świecie komputerów i systemów operacyjnych operujemy głównie na tym systemie binarnym. Ale uwaga, bo producenci dysków często podają pojemności w systemie dziesiętnym, i wtedy 1 TB to jakby 1 000 GB. To może wprowadzać zamieszanie, więc dobrze jest sprawdzać specyfikacje i mieć to na uwadze, żeby nie było nieporozumień. Większość systemów, jak Windows czy Linux, działa w tym binarnym, więc warto to znać, gdyż to ułatwia pracę zarówno użytkownikom, jak i fachowcom z branży IT.

Pytanie 26

Które z wymienionych stanowi przykład struktury dziedziczenia?

A. Klasa Pojazd ma dziedziczenie od klasy Samochód
B. Klasa Pojazd nie dziedziczy z żadnej klasy
C. Klasa Samochód ma dziedziczenie od klasy Pojazd
D. Klasa Samochód i Pojazd nie są ze sobą powiązane
Klasa 'Pojazd' dziedzicząca po klasie 'Samochód' jest błędnym przykładem hierarchii – bardziej ogólne pojęcia powinny znajdować się wyżej w hierarchii dziedziczenia. Klasa 'Pojazd' nie dziedzicząca po żadnej klasie jest podstawową klasą bazową, ale to nie stanowi przykładu hierarchii dziedziczenia. Brak powiązań między klasami 'Samochód' i 'Pojazd' oznacza brak hierarchii – są to niezależne klasy, co eliminuje korzyści wynikające z dziedziczenia i ponownego użycia kodu.

Pytanie 27

Co to jest zasięg (scope) zmiennej w programowaniu?

A. Obszar kodu, w którym zmienna jest dostępna
B. Maksymalny zakres wartości, jakie może przyjąć zmienna danego typu
C. Czas życia zmiennej podczas wykonywania programu
D. Ilość pamięci, jaką zmienna zajmuje podczas wykonywania programu
Wybór odpowiedzi dotyczącej ilości pamięci, jaką zmienna zajmuje podczas wykonywania programu, jest mylący, ponieważ pojęcie zasięgu zmiennej dotyczy nie przestrzeni pamięci, lecz obszaru kodu, w którym zmienna jest dostępna. Ilość pamięci, jaką zmienna zajmuje, jest kwestią zarządzania pamięcią, która jest niezależna od samego zasięgu. Zmienna może zająć różną ilość pamięci w zależności od typu danych, które reprezentuje, ale to nie definiuje, gdzie ta zmienna może być używana. Na przykład w językach takich jak C++ czy Java, zasięg zmiennej wpływa na jej widoczność, a nie na ilość zajmowanej pamięci. Kolejna niewłaściwa koncepcja dotyczy maksymalnego zakresu wartości, jakie może przyjąć zmienna danego typu. To zagadnienie odnosi się do ograniczeń typów danych, a nie do ich zasięgu w kodzie. Typy danych definiują, jakie wartości mogą być przechowywane, ale nie mają wpływu na to, w jakich częściach programu te zmienne są dostępne. Czas życia zmiennej jest również inną kwestią, która nie odnosi się do zasięgu, a do momentu, w którym zmienna jest aktywna w programie. Zrozumienie tych różnic jest kluczowe dla skutecznego programowania, ponieważ nieprawidłowe zrozumienie pojęcia zasięgu może prowadzić do trudnych do zdiagnozowania błędów w kodzie, takich jak błędy związane z dostępem do zmiennych, które nie są już dostępne w danym kontekście.

Pytanie 28

Metodyka zwinna (ang. agile) opiera się na

A. zaplanowaniu całej aplikacji na początku projektu i jej tworzeniu na przemian z testowaniem
B. dekompozycji przedsięwzięcia na elementy, które są niezależnie projektowane, wytwarzane i testowane w krótkich iteracjach
C. podzieleniu projektu na kolejne etapy: planowanie, programowanie, testowanie, z ciągłym oszacowaniem ryzyka projektu
D. przygotowaniu testów dla całego projektu, a następnie wprowadzaniu kolejnych jego fragmentów
Podejście kaskadowe (waterfall) zakłada podział projektu na kolejne etapy (projekt, programowanie, testy), ale nie dopuszcza powrotu do wcześniejszych faz, co czyni je mniej elastycznym niż agile. Projektowanie całej aplikacji na początku jest charakterystyczne dla tradycyjnych metodyk, takich jak V-model, ale nie odzwierciedla idei iteracyjnego rozwoju stosowanego w agile. Implementowanie testów po zakończeniu całości projektu ogranicza możliwość szybkiego reagowania na błędy i jest sprzeczne z filozofią agile, gdzie testy są integralną częścią każdego etapu iteracji.

Pytanie 29

Kod XAML zaprezentowany powyżej zostanie wyświetlony jako:

Ilustracja do pytania
A. D
B. C
C. B
D. A
Wybrałeś dokładnie taką odpowiedź, jaką powinien wskazać każdy, kto dobrze rozumie XAML i układ StackLayout. Zobacz, co tu się dzieje: dwa pola Entry wyświetlają się jedno pod drugim, co daje klasyczną strukturę formularza – najpierw pole "Imię", potem "Nazwisko". Dalej mamy StackLayout z orientacją poziomą (Horizontal), więc etykieta "Zgoda RODO" oraz przełącznik Switch pojawiają się obok siebie – to bardzo typowy sposób na prezentację zgody na coś w aplikacjach, bo nie ma sensu rozdzielać tego na dwie linie. Po nich pojawia się Slider z ustawionym Value na 0.5 i kolorami MinimumTrackColor oraz MaximumTrackColor, czyli dokładnie tak jak widać na obrazku – jeden kolor po lewej, drugi po prawej i kółko pośrodku. Na końcu jest Button "Zapisz". Moim zdaniem, taki układ to wręcz klasyka budowy prostych formularzy w aplikacjach mobilnych opartych na XAML. Swoją drogą, to świetny przykład, jak StackLayout pozwala na szybkie i czytelne układanie elementów na ekranie, bez zbędnego komplikowania interfejsu. W praktyce warto jeszcze pamiętać, że oddzielenie pól Entry podnosi czytelność, a stosowanie układów poziomych sprawdza się wtedy, gdy chcesz, żeby użytkownik od razu widział etykietę i jej kontrolkę. Widać tu też dbałość o kolory i spójność wizualną. Według mnie, warto od razu testować takie formularze na różnych urządzeniach, bo StackLayout zachowuje się przewidywalnie, ale warto mieć na uwadze responsywność – no i nie zapomnij, że Slider i Switch mają swoje domyślne wartości, które można łatwo sterować z kodu.

Pytanie 30

Który system operacyjny jest podstawowym środowiskiem do tworzenia aplikacji mobilnych w języku Swift?

A. Android
B. Windows UWP
C. iOS
D. LG UX
Swift to język programowania stworzony przez Apple specjalnie z myślą o ekosystemie tej firmy, czyli głównie o systemach iOS, macOS, watchOS oraz tvOS. To właśnie iOS jest podstawową, domyślną platformą, na której programiści wykorzystują Swift do budowania aplikacji mobilnych. Praktycznie każda nowoczesna aplikacja na iPhone’a czy iPada, która powstała po 2014 roku, jest przynajmniej w części napisana w Swifcie, bo to obecnie standard branżowy w świecie Apple. Moim zdaniem to jest super wygodne, bo Apple dostarcza kompletne narzędzia do pracy ze Swiftem, jak Xcode czy rozbudowane frameworki (UIKit, SwiftUI). Z mojego doświadczenia wynika, że programowanie w Swifcie dla iOS to nie tylko prostsza składnia, ale też większa stabilność i bezpieczeństwo aplikacji – Apple bardzo dba o aktualizacje narzędzi i dobre praktyki. Warto też pamiętać, że od wersji SwiftUI rozwijanie aplikacji na iOS stało się jeszcze bardziej intuicyjne, bo można korzystać z deklaratywnego podejścia do interfejsów. W realnych projektach spotyka się też Objective-C, ale obecnie Swift wygrywa czytelnością i wsparciem społeczności. Gdyby ktoś chciał tworzyć aplikacje mobilne poza ekosystemem Apple, to niestety Swift nie będzie najlepszym wyborem – właśnie dlatego iOS jest tym środowiskiem, do którego Swift został stworzony i tam najbardziej się sprawdza.

Pytanie 31

Co to jest kontener Docker?

A. Graficzny interfejs do zarządzania kodem aplikacji webowych
B. Lekka, samodzielna jednostka oprogramowania, która zawiera wszystko, co aplikacja potrzebuje do uruchomienia
C. Narzędzie do automatycznego testowania interfejsów użytkownika
D. System zarządzania bazami danych NoSQL
Niektóre odpowiedzi mogą wprowadzać w błąd, myląc pojęcie kontenerów Docker z innymi technologiami. Graficzny interfejs do zarządzania kodem aplikacji webowych odnosi się do narzędzi, takich jak edytory kodu czy IDE, które ułatwiają programistom tworzenie i edytowanie aplikacji, jednak nie zapewniają one izolacji ani pakowania wszystkich niezbędnych komponentów w jedną jednostkę. Podobnie, system zarządzania bazami danych NoSQL to zupełnie inny obszar technologii, skoncentrowany na przechowywaniu i przetwarzaniu danych w sposób nienormowany, a nie na wirtualizacji aplikacji. Narzędzia do automatycznego testowania interfejsów użytkownika także nie mają związku z kontenerami, ponieważ koncentrują się na zapewnieniu jakości oprogramowania poprzez testowanie jego interakcji z użytkownikami. Wspólnym błędem w tych myśleniach jest niezrozumienie, że kontenery Docker działają na zasadzie izolacji aplikacji, co pozwala na ich niezależne uruchamianie i skalowanie, w przeciwieństwie do technologii, które funkcjonują w innych obszarach rozwoju oprogramowania. Zrozumienie różnic pomiędzy tymi technologiami jest kluczowe dla efektywnego wykorzystania narzędzi w procesie tworzenia i zarządzania aplikacjami.

Pytanie 32

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

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

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

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

Pytanie 33

Jakie informacje zawiera dokumentacja realizacji projektu?

A. Podręcznik użytkownika dla końcowych odbiorców aplikacji
B. Zestawienie błędów wykrytych w trakcie testów
C. Strategia marketingowa aplikacji
D. Dane dotyczące faz wdrożenia aplikacji w środowisku produkcyjnym
Opis błędów znalezionych podczas testów jest częścią raportu testowego, a nie dokumentacji wdrożeniowej. Plan marketingowy aplikacji dotyczy promocji i wdrożenia na rynku, ale nie obejmuje aspektów technicznych związanych z implementacją. Instrukcja obsługi aplikacji dla użytkowników końcowych skupia się na interfejsie i funkcjonalności, ale nie zawiera informacji na temat procesu wdrażania aplikacji w środowisku produkcyjnym.

Pytanie 34

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

MojaKlasa obj1 = new MojaKlasa();
obj1.rysunek();
A. polem w klasie
B. konstruktorem
C. metodą w klasie
D. obiektem
Wielu początkujących programistów myli pojęcia takie jak pole, metoda, konstruktor czy obiekt – to całkiem powszechny błąd. Spójrzmy na ten fragment kodu: obj1.rysunek(). Najczęstsza pomyłka to uznanie rysunek za pole lub obiekt, bo wszystko wydaje się „należeć” do obj1. Jednak w językach takich jak Java czy C#, wywołanie z nawiasami okrągłymi oznacza jednoznacznie wywołanie metody, a nie dostęp do pola. Pola to najczęściej dane, które nie wymagają nawiasów do odczytu czy zapisu – np. obj1.wysokosc. Konstruktor to zupełnie inna sprawa: służy do inicjowania nowej instancji klasy, wywoływany jest tylko raz przy tworzeniu obiektu (czyli MojaKlasa obj1 = new MojaKlasa();), a nie przez notację kropkową na obiekcie. Kolejnym typowym problemem jest utożsamianie metody z obiektem, bo skoro działa na obiekcie, to może też nim być – ale to nie tak. Obiektem jest obj1, czyli konkretna instancja MojaKlasa, natomiast rysunek jest „czynnością”, którą ten obiekt może wykonać. To bardzo ważne rozróżnienie, bo mylenie tych pojęć prowadzi do chaotycznego kodu i trudności z utrzymaniem projektu. W nowoczesnych językach OOP przyjęło się, by metody nazywać czasownikami („narysuj”, „oblicz”), a pola rzeczownikami („kolor”, „wysokosc”). Takie podejście sprawia, że kod jest bardziej czytelny i łatwiej go rozwijać w zespole. Dlatego praktycy zawsze zwracają uwagę na właściwe rozróżnianie tych elementów, bo to podstawa dobrej architektury kodu.

Pytanie 35

Sposób deklaracji Klasa2 wskazuje, że

W C++ i C#:
class Klasa2 : Klasa1
W Java:
class Klasa2 extends Klasa1
W Python:
class Klasa2(Klasa1):
A. Klasa1 dziedziczy od Klasa2
B. Klasa2 dziedziczy od Klasa1
C. Klasa2 stanowi klasę bazową
D. Klasa1 jest dzieckiem Klasy2
Deklaracja Klasa2 jako klasy dziedziczącej po Klasa1 oznacza, że Klasa2 przejmuje wszystkie publiczne i chronione (protected) pola oraz metody klasy bazowej (Klasa1). Dziedziczenie to jeden z filarów programowania obiektowego, który umożliwia ponowne wykorzystanie kodu i rozszerzanie funkcjonalności istniejących klas. Dzięki temu Klasa2 może nie tylko korzystać z metod Klasa1, ale także nadpisywać je, co jest kluczowe dla implementacji polimorfizmu. Dziedziczenie pozwala na budowanie hierarchii klas, co prowadzi do lepszego zarządzania kodem i ułatwia jego skalowalność. Przykładem może być klasa Pojazd, z której dziedziczy klasa Samochod, rozszerzając jej funkcjonalność o dodatkowe cechy i metody specyficzne dla samochodów.

Pytanie 36

Która zasada zwiększa bezpieczeństwo w sieci?

A. Zaniedbywanie aktualizacji systemu operacyjnego
B. Korzystanie z mocnych, unikalnych haseł
C. Pobieranie plików z niepewnych źródeł
D. Dzielnie się hasłami z przyjaciółmi
Używanie silnych, unikalnych haseł jest fundamentalną zasadą poprawiającą bezpieczeństwo w sieci. Silne hasło to takie, które składa się z co najmniej 12 znaków, zawiera wielkie i małe litery, cyfry oraz znaki specjalne. Takie hasła są trudne do złamania przez ataki brute force, które wykorzystują algorytmy do próbowania różnych kombinacji znaków. Przykładem silnego hasła może być 'P@ssw0rd!2023', które łączy różnorodne typy znaków. Używanie unikalnych haseł dla różnych kont jest równie ważne, ponieważ w przypadku naruszenia bezpieczeństwa jednego konta, inne pozostają zabezpieczone. Standardy takie jak NIST (National Institute of Standards and Technology) zalecają tworzenie haseł w sposób, który ogranicza ich przewidywalność. Narzędzia do zarządzania hasłami, takie jak LastPass czy 1Password, mogą pomóc w generowaniu i przechowywaniu silnych haseł, co dodatkowo redukuje ryzyko. Stosowanie tej zasady jest kluczowe w kontekście ochrony danych osobowych oraz zapobiegania kradzieży tożsamości.

Pytanie 37

Jakie jest przeznaczenie dokumentacji wdrożeniowej?

A. Do zarządzania bazą danych aplikacji
B. Do tworzenia zadań w systemie kontroli wersji
C. Do opisania procesu instalacji i konfiguracji aplikacji w środowisku produkcyjnym
D. Do testowania wydajności aplikacji
Dokumentacja wdrożeniowa opisuje proces instalacji i konfiguracji aplikacji w środowisku produkcyjnym. Obejmuje ona szczegółowe instrukcje dotyczące wymaganych komponentów systemowych, zależności oraz kroków niezbędnych do prawidłowego wdrożenia aplikacji. Dzięki dokumentacji wdrożeniowej administratorzy IT oraz zespoły DevOps mogą skutecznie zarządzać procesem implementacji, minimalizując ryzyko błędów i przestojów. Dokument ten zawiera również informacje o kopiach zapasowych, procedurach przywracania systemu oraz testach przeprowadzanych po wdrożeniu, co zapewnia stabilność i bezpieczeństwo aplikacji po przeniesieniu jej na serwery produkcyjne. Kompleksowa dokumentacja wdrożeniowa to kluczowy element zarządzania cyklem życia oprogramowania (SDLC).

Pytanie 38

Który z paradygmatów programowania najbardziej akcentuje dziedziczenie oraz polimorfizm?

A. Programowanie obiektowe
B. Programowanie funkcyjne
C. Programowanie proceduralne
D. Programowanie strukturalne
Programowanie strukturalne skupia się na podziale kodu na funkcje i procedury, ale nie wspiera dziedziczenia ani polimorfizmu. Programowanie proceduralne to wcześniejszy paradygmat, który koncentruje się na wykonywaniu sekwencji instrukcji i nie obejmuje obiektów ani klas. Programowanie funkcyjne opiera się na funkcjach jako podstawowych jednostkach kodu, które są niemutowalne i nie wspiera takich cech jak dziedziczenie i polimorfizm, co różni je od programowania obiektowego.

Pytanie 39

Jakie będzie działanie przedstawionych dwóch równoważnych fragmentów kodu źródłowego?

Kod w React:

function Heading(props) {
    return (
        <h1> {props.title} </h1>
    );
}

// w metodzie render
return (
    <Heading title="Egzamin zawodowy" />
);

Kod w Angular:
// heading.component.ts
import {Component} from '@angular/core';
@Component({
    selector: 'app-heading',
    templateUrl: './heading.component.html',
    styleUrls: ['./heading.component.css']
})

export class HeadingComponent {
    title:String = "Egzamin zawodowy";
    ...
}

// heading.component.html
<h1>{{title}}</h1>
A. Nadany tytuł strony: "Egzamin zawodowy"
B. Wyświetlony na stronie tekst w akapicie: "Egzamin zawodowy"
C. Nadany tytuł każdego elementu HTML: "Egzamin zawodowy"
D. Wyświetlony na stronie tekst w nagłówku: "Egzamin zawodowy"
Zdarza się, że łatwo pomylić różne sposoby prezentacji tekstu na stronie, zwłaszcza gdy ma się do czynienia z wieloma frameworkami naraz. W przedstawionych fragmentach kodu zarówno w React, jak i w Angularze, kluczowe jest użycie tagu <h1>, czyli nagłówka pierwszego poziomu. Jeżeli uznałeś, że zostanie wyświetlony tekst w akapicie, to być może zasugerowałeś się inną składnią, bo <p> w kodzie w ogóle nie ma. Możliwe też, że patrząc na słowo „title”, pojawiła się skojarzenie z atrybutem title w HTML (który odpowiada za tzw. tooltip po najechaniu kursorem lub tytuł strony), ale w tym przypadku title to po prostu nazwa właściwości przekazywanej do komponentu lub pola w klasie, nie specjalny atrybut HTML. Kolejna zmyłka, nadawanie tytułu wszystkim elementom HTML – brzmi jak coś, co można by zrobić globalnie stylem, ale tutaj nic takiego się nie dzieje. W kodzie nie występuje żaden mechanizm, który iteruje po wszystkich elementach i ustawia im atrybut, to nie jest ten przypadek. Jeśli chodzi o tytuł strony, to w przeglądarce jest on definiowany przez <title> w sekcji <head> dokumentu HTML, a tutaj pracujemy tylko z zawartością renderowaną w widocznym DOM, nie konfigurujemy meta-danych strony. To częsty błąd – mylić zmienne używane w kodzie z atrybutami HTML o tej samej nazwie. Warto pamiętać, że w React i Angularze komponowanie widoków opiera się głównie o manipulację treścią w obrębie renderowanego drzewa DOM, a nie bezpośrednią modyfikację atrybutów meta czy stylów całego dokumentu. Dobrze jest też zawsze spojrzeć na strukturę znacznika – gdy widać <h1>, od razu powinno się zakładać, że chodzi o nagłówek – i, szczerze mówiąc, takie pytania świetnie pokazują, jak ważne jest rozumienie, co faktycznie renderuje się na stronie, bo czasem pozorne podobieństwo nazw prowadzi do błędnych wniosków.

Pytanie 40

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

A. bool
B. char
C. struct
D. int
Typ 'int' to taki prosty typ, który trzyma tylko jedną liczbę całkowitą, więc nie można go porównywać ze złożonymi typami, jak 'struct'. 'Char' to typ, który trzyma jeden znak, a nie grupuje różnych zmiennych. 'Bool' też jest prosty i tylko zapisuje 'prawda' albo 'fałsz', więc nie ma opcji przechowywania wielu typów w jednym. Złożone typy, jak 'struct', mają tę zaletę, że mogą trzymać różne dane w jednym miejscu, co wyróżnia je w porównaniu do prostych typów takich jak 'int' czy 'bool', które są dużo bardziej ograniczone.