Wyniki egzaminu

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

Egzamin zdany!

Wynik: 29/40 punktów (72,5%)

Wymagane minimum: 20 punktów (50%)

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

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

A. na komputerze
B. rodzaju back-end
C. rodzaju front-end
D. mobilnej
Angular to świetne narzędzie do tworzenia aplikacji front-endowych. Chodzi o to, że odpowiada za to, co widzi użytkownik i jak może z tym interagować. Dzięki Angular możemy budować dynamiczne i responsywne aplikacje webowe. Z tego co widzę, używamy tam komponentów, modułów i rzeczy typu dwukierunkowe wiązanie danych, co naprawdę ułatwia życie. Bez wątpienia, Angular jest jednym z najpopularniejszych frameworków do robienia interfejsów użytkownika, co tylko potwierdza jego efektywność.

Pytanie 2

Jaki model zarządzania projektami przewiduje, że wszystkie etapy są realizowane jeden po drugim, bez możliwości wrócenia do wcześniejszych faz?

A. Model spiralny
B. Model kaskadowy (waterfall)
C. Model przyrostowy
D. Metodyki zwinne (Agile)
Model kaskadowy (Waterfall) zakłada, że każda faza projektu jest realizowana sekwencyjnie, bez możliwości powrotu do wcześniejszych etapów. Każda faza musi zostać zakończona przed rozpoczęciem kolejnej, co sprawia, że model ten jest przewidywalny i dobrze nadaje się do projektów o jasno określonych wymaganiach. Dzięki temu ryzyko błędów jest minimalizowane na wczesnym etapie, co zwiększa stabilność projektu. Waterfall jest często stosowany w projektach infrastrukturalnych i rządowych, gdzie istotna jest dokładność i zgodność z pierwotnym planem.

Pytanie 3

Po uruchomieniu poniższego kodu w języku C++ w konsoli pojawi się ciąg liczb:

int a = 1;
while (a++ < 6) {
    cout << a << " ";
}
A. 1 2 3 4 5 6
B. 2 3 4 5 6 7
C. 1 2 3 4 5
D. 2 3 4 5 6
Z tego co widzę, najczęstsze nieporozumienia związane z tym pytaniem wynikają z mylenia sposobu działania operatora postinkrementacji z preinkrementacją, a także niezrozumienia kolejności wykonania instrukcji w pętli. W tym przykładzie zapis a++ < 6 sprawia, że najpierw do warunku trafia obecna wartość a (sprawdzana jest 1 < 6), dopiero potem następuje zwiększenie a do 2. Wewnątrz pętli wypisywana jest już ta nowa wartość. To może być mylące, bo ktoś mógłby założyć, że najpierw następuje inkrementacja, a potem sprawdzenie warunku – tak by było przy ++a < 6, ale nie przy a++ < 6. Kolejna rzecz: wybierając odpowiedzi typu 1 2 3 4 5 6 lub 2 3 4 5 6 7, można nieświadomie przyjąć, że pętla wypisuje także wartości początkową lub końcową poza zakresem warunku, co w tym kodzie nie ma miejsca. Częstym błędem jest też założenie, że warunek a++ < 6 przepuszcza do wypisania wartość 6 lub nawet 7, ale w rzeczywistości przy a równym 6 warunek staje się fałszywy i pętla się kończy. Takie subtelności są bardzo istotne w codziennym programowaniu, szczególnie kiedy pracuje się z pętlami sterującymi wykonywaniem algorytmów czy przetwarzaniem danych w tablicach. Praktyka pokazuje, że przeoczenie różnic między post- i pre-inkrementacją prowadzi do bugów, które często trudno namierzyć, a ich efekty mogą wychodzić dopiero po dłuższym czasie. Moim zdaniem najlepiej przyjąć zasadę, by czytać kod spokojnie linijka po linijce i zwracać uwagę na to, co dzieje się z każdą zmienną w każdej iteracji. Uczy to logicznego myślenia i pozwala lepiej rozumieć mechanizmy języka – a to podstawa do pisania solidnego, przewidywalnego kodu.

Pytanie 4

Co to jest PWA (Progressive Web App)?

A. Framework do tworzenia aplikacji mobilnych
B. System zarządzania treścią dla stron internetowych
C. Aplikacja webowa działająca jak natywna aplikacja mobilna
D. Biblioteka graficzna do tworzenia animacji
Progressive Web App (PWA) to aplikacja webowa, która łączy cechy stron internetowych i natywnych aplikacji mobilnych, oferując użytkownikom lepsze doświadczenia dzięki technologii webowej. PWA wykorzystują zaawansowane funkcje przeglądarek, takie jak Service Workers, aby zapewnić offline'ową funkcjonalność, powiadomienia push i lepsze zarządzanie pamięcią podręczną. Dzięki temu użytkownicy mogą korzystać z aplikacji niezależnie od jakości połączenia internetowego. Przykłady PWA obejmują aplikacje takie jak Twitter Lite, które umożliwiają użytkownikom przeglądanie treści nawet przy słabym sygnale sieciowym, a także Facebook Lite, który jest zoptymalizowany pod kątem urządzeń o ograniczonych zasobach. Warto również wspomnieć o zastosowaniach PWA w e-commerce, gdzie użytkownicy mogą szybko dodawać produkty do koszyka i dokonywać zakupów bez konieczności ładowania pełnej aplikacji mobilnej. Te właściwości sprawiają, że PWA są zgodne z najlepszymi praktykami branżowymi, zapewniając użytkownikom dostęp do funkcji, które wcześniej były zarezerwowane tylko dla natywnych aplikacji.

Pytanie 5

Który system informatyczny powinien być zastosowany do zarządzania sprzedażą w e-sklepie?

A. System ERP
B. System e-commerce
C. System CRM
D. System CMS
System e-commerce to takie fajne rozwiązanie, które naprawdę ułatwia sprzedaż przez internet. Znajdziesz w nim wszystko, co potrzebne do zarządzania produktami, zamówieniami, a nawet płatnościami. Dzięki temu przedsiębiorcy mogą szybko zakładać i prowadzić sklepy online, co daje super doświadczenie dla klientów. Warto wspomnieć o popularnych systemach, jak Shopify czy WooCommerce – z nich korzystają tysiące sklepów na całym świecie. Te systemy mają też fajne narzędzia, dzięki którym można monitorować sprzedaż czy analizować, co klienci lubią. A bezpieczeństwo? To też ważna sprawa, bo standardy, takie jak PCI DSS, dbają o to, żeby dane klientów były dobrze chronione. W czasach rosnącej konkurencji w internecie, wybór odpowiedniego systemu e-commerce to klucz do sukcesu.


Pytanie 6

Co to jest REST API?

A. Architektura API oparta o zasoby i standardowe operacje HTTP
B. Biblioteka JavaScript do komunikacji z bazami danych
C. Protokół sieciowy do transferu danych binarnych
D. Framework do testowania API
REST API (Representational State Transfer Application Programming Interface) to architektura API, która koncentruje się na zasobach i wykorzystuje standardowe operacje HTTP, takie jak GET, POST, PUT i DELETE. Dzięki tej architekturze każdy zasób, na przykład użytkownik czy produkt, jest reprezentowany przez unikalny identyfikator URL, co ułatwia dostęp i manipulację danymi. REST API jest szeroko stosowane w aplikacjach webowych i mobilnych, ponieważ pozwala na łatwą integrację różnych systemów oraz umożliwia wykorzystanie technologii takich jak JSON i XML do wymiany danych. Przykładem praktycznego zastosowania REST API może być aplikacja do zarządzania zadaniami, w której użytkownicy mogą tworzyć, edytować i usuwać zadania za pomocą odpowiednich zapytań HTTP. Dobrą praktyką przy projektowaniu REST API jest stosowanie odpowiednich statusów HTTP, takich jak 200 (OK), 201 (Created) czy 404 (Not Found), co ułatwia komunikację między klientem a serwerem oraz zwiększa transparentność działania API. Dodatkowo, REST API jest zgodne z zasadą bezstanowości, co oznacza, że każdy nowy request zawiera wszystkie informacje potrzebne do jego przetworzenia.

Pytanie 7

Co to jest JWT (JSON Web Token)?

A. Standard definiujący sposób bezpiecznego przekazywania informacji jako obiekt JSON
B. Biblioteka JavaScript do walidacji formularzy webowych
C. Format zapisu danych używany w bazach NoSQL
D. Protokół komunikacyjny do transferu danych między klientem a serwerem
JWT, czyli JSON Web Token, jest standardem, który definiuje sposób bezpiecznego przekazywania informacji między dwiema stronami w postaci obiektu JSON. Tokeny JWT są powszechnie wykorzystywane w systemach autoryzacji i autoryzacji, umożliwiając przekazywanie zweryfikowanych i podpisanych danych. Struktura tokena składa się z trzech części: nagłówka, ładunku (payload) oraz podpisu. Nagłówek zazwyczaj określa typ tokena oraz algorytm użyty do podpisania, ładunek zawiera dane, które chcemy przesłać, a podpis jest generowany przy użyciu tajnego klucza, co zapewnia integralność danych. Przykładem zastosowania JWT może być system logowania, gdzie po pomyślnym zalogowaniu użytkownik otrzymuje token, który jest następnie używany do autoryzacji kolejnych zapytań do serwera. Dzięki swojej strukturze, JWT nie tylko zwiększa bezpieczeństwo, ale także umożliwia łatwą wymianę informacji między różnymi systemami, co jest szczególnie ważne w architekturach mikroserwisowych.

Pytanie 8

Który z wymienionych programów jest przeznaczony do zarządzania projektami przy pomocy tablic kanban?

A. Trello
B. Photoshop
C. Jira
D. Word
Jira to zaawansowane narzędzie do zarządzania projektami, ale jest bardziej skoncentrowane na metodykach Agile i Scrum, a nie wyłącznie na tablicach kanban. Photoshop to narzędzie do edycji grafiki i tworzenia projektów wizualnych, które nie ma funkcji zarządzania projektami. Word jest edytorem tekstu i służy do tworzenia dokumentów, ale nie jest używany jako narzędzie do zarządzania zadaniami i projektami w sposób, w jaki robi to Trello.

Pytanie 9

Podana deklaracja zmiennych w języku JAVA zawiera

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

Pytanie 10

Który z etapów umożliwia zwiększenie efektywności aplikacji przed jej wydaniem?

A. Dodawanie komentarzy do kodu
B. Tworzenie interfejsu graficznego
C. Optymalizacja kodu
D. Testowanie jednostkowe
Optymalizacja kodu to kluczowy etap poprawy wydajności aplikacji przed jej publikacją. Polega na eliminacji zbędnych operacji, poprawie algorytmów oraz minimalizacji użycia zasobów, co pozwala na szybsze działanie aplikacji i zmniejszenie jej zapotrzebowania na pamięć. Optymalizacja kodu obejmuje również refaktoryzację, czyli przekształcenie kodu w bardziej czytelną i efektywną formę bez zmiany jego funkcjonalności. Dzięki optymalizacji aplikacje działają płynniej, szybciej się ładują i oferują lepsze doświadczenie użytkownika, co ma kluczowe znaczenie dla SEO oraz pozycjonowania aplikacji w wyszukiwarkach. Dodatkowo, zoptymalizowany kod jest łatwiejszy w utrzymaniu i rozwijaniu, co przekłada się na długoterminowe korzyści dla zespołu deweloperskiego.

Pytanie 11

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 końcu, 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 początku, 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 12

Który z wymienionych mechanizmów pozwala na monitorowanie stanu użytkownika w trakcie sesji w aplikacji internetowej?

A. HTTP Headers
B. HTML Forms
C. Sesje (Sessions)
D. CSS Selectors
Sesje (sessions) to mechanizm wykorzystywany w aplikacjach webowych do śledzenia stanu użytkownika podczas sesji przeglądania. Sesje umożliwiają przechowywanie danych użytkownika na serwerze przez określony czas i identyfikowanie go za pomocą unikalnego identyfikatora (session ID), który jest zwykle przechowywany w ciasteczkach. Mechanizm sesji pozwala na implementację logowania, koszyków zakupowych oraz innych funkcji, które wymagają zachowania stanu między żądaniami HTTP. Sesje są kluczowe dla aplikacji wymagających autoryzacji i autentykacji, ponieważ umożliwiają śledzenie działań użytkownika bez konieczności wielokrotnego logowania. Zastosowanie sesji w aplikacjach zwiększa bezpieczeństwo i poprawia komfort użytkowania, a także umożliwia personalizację treści w czasie rzeczywistym.

Pytanie 13

Który z wymienionych kroków wchodzi w skład testowania aplikacji?

A. Kompilowanie aplikacji
B. Debugowanie kodu w celu znalezienia błędów
C. Projektowanie bazy danych
D. Opracowywanie interfejsu graficznego
Debugowanie kodu w celu znalezienia błędów to jeden z kluczowych etapów testowania aplikacji. Proces ten polega na uruchamianiu programu w trybie debugowania, co pozwala na śledzenie jego działania linijka po linijce i identyfikowanie miejsc, w których występują błędy. Debugowanie umożliwia analizowanie wartości zmiennych, śledzenie przepływu programu i wykrywanie nieoczekiwanych zachowań, co jest niezbędne do usunięcia błędów i poprawy wydajności aplikacji. Narzędzia do debugowania, takie jak Visual Studio, PyCharm czy Chrome DevTools, pozwalają na dokładne testowanie kodu na różnych etapach jego rozwoju, co znacząco skraca czas naprawy błędów i zwiększa jakość oprogramowania.

Pytanie 14

Mobilna aplikacja przedstawia listę, w której każdy element można dotknąć palcem, aby zobaczyć jego detale. Zdarzenie, które odpowiada tej czynności, to

A. toggled.
B. button clicked.
C. value changed.
D. tapped.
Zdarzenie 'tapped' oznacza, że stuknęliśmy w coś na liście na naszym telefonie. To takie podstawowe zdarzenie, które przydaje się w aplikacjach mobilnych. Dzięki temu możemy wchodzić w interakcje z różnymi elementami, na przykład, gdy klikniemy na coś w liście, pojawią się dodatkowe szczegóły. Ta obsługa zdarzeń 'tap' jest naprawdę ważna w aplikacjach mobilnych, bo to w zasadzie główny sposób, w jaki poruszamy się po interfejsie.

Pytanie 15

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 16

Które z poniższych stwierdzeń najlepiej charakteryzuje tablicę asocjacyjną?

A. Tablica, która przechowuje wyłącznie dane tekstowe
B. Tablica przechowująca dane w formie par klucz-wartość
C. Tablica, która przechowuje wartości, do których można uzyskać dostęp tylko za pomocą indeksów numerycznych
D. Tablica, która zmienia swoje wymiary w trakcie działania programu
Tablica asocjacyjna to fajna rzecz, bo przechowuje dane w formie par klucz-wartość. W przeciwieństwie do zwykłych tablic, gdzie używasz numerów do indeksowania, tutaj możesz mieć różne unikalne klucze, na przykład teksty czy liczby. To naprawdę ułatwia wyszukiwanie informacji i organizowanie danych. W Pythonie nazywa się to 'słownikami', a w C++ używa się 'map'. Moim zdaniem, to świetne narzędzie do pracy z większymi zbiorami danych.

Pytanie 17

Która z wymienionych reguł należy do netykiety?

A. Unikanie używania dużych liter w komunikacji
B. Udostępnianie treści bez zgody właścicieli
C. Stosowanie nieformalnego języka w każdej rozmowie
D. Zaniechanie odpowiadania na wiadomości od innych użytkowników
Unikanie pisania wielkimi literami w wiadomościach jest kluczowym elementem netykiety, ponieważ tekst pisany dużymi literami w internecie jest powszechnie interpretowany jako krzyk. To zasada, która ma na celu utrzymanie kultury komunikacji online oraz zapewnienie komfortu odbiorcy. Gdy użytkownik korzysta z wielkich liter, może to być odbierane jako agresywne lub dominujące, co może prowadzić do nieporozumień oraz negatywnych reakcji. Przykładem może być sytuacja, w której osoba, pisząc do grupy na forum internetowym, używa wyłącznie wielkich liter, co może zniechęcić innych do interakcji. Dobrą praktyką jest pisanie w sposób przystępny i zrozumiały, co sprzyja pozytywnej atmosferze w komunikacji. Standardy netykiety, takie jak te przedstawione w dokumentach związanych z etyką w internecie, podkreślają znaczenie szacunku i zrozumienia w interakcjach online, co obejmuje również sposób formułowania wiadomości. Warto także pamiętać o tym, że różne platformy społecznościowe mają swoje zasady, które podkreślają unikanie pisania krzykiem, co potwierdza ogólne podejście do netykiety.

Pytanie 18

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

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

Pytanie 19

Wskaż termin, który w języku angielskim odnosi się do "testów wydajnościowych"?

A. performance testing
B. integration testing
C. security testing
D. unit testing
Testy wydajnościowe, czyli performance testing, to coś, co naprawdę warto mieć na uwadze. Dzięki nim możemy sprawdzić, jak nasza aplikacja działa pod dużym obciążeniem i jak szybko odpowiada na różne żądania. Moim zdaniem, to kluczowy aspekt, zwłaszcza jeśli planujemy, żeby nasza aplikacja miała wielu użytkowników. W końcu, nikt nie lubi czekać, aż coś się załaduje!

Pytanie 20

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

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

Pytanie 21

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

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success');
  }, 1000);
});

promise
  .then(res => {
    console.log(res);
    return 'first then';
  })
  .then(res => {
    console.log(res);
  });
A. first then
B. success, first then
C. first then, success
D. success
Podany kod JavaScript korzysta z obietnic (Promises), co jest nowoczesnym podejściem do zarządzania asynchronicznością w JavaScript. W momencie, gdy tworzymy nową obietnicę, wykorzystujemy funkcję `setTimeout`, która po 1 sekundzie wywołuje metodę `resolve`, przekazując tekst 'success'. To jest pierwszy krok, w którym obietnica zostaje spełniona. Następnie, w łańcuchu `then`, pierwsza funkcja `then` przyjmuje wynik obietnicy, czyli 'success', loguje go na konsolę, a następnie zwraca nowy tekst 'first then'. Druga funkcja `then` odbiera ten wynik i również go loguje. W rezultacie na konsoli pojawią się kolejno: 'success' oraz 'first then'. Taki sposób tworzenia łańcuchów obietnic jest zgodny z najlepszymi praktykami programowania asynchronicznego w JavaScript, ponieważ pozwala na czytelniejsze i bardziej zrozumiałe zarządzanie kodem asynchronicznym, eliminując złożoność związaną z tzw. „callback hell”. Warto zaznaczyć, że obietnice mogą być stosowane do radzenia sobie z żądaniami sieciowymi, operacjami na plikach czy innymi długotrwałymi procesami, co czyni je niezbędnym narzędziem w nowoczesnym programowaniu webowym.

Pytanie 22

Jakie jest wymagane minimalne natężenie światła w biurze na stanowisku pracy?

A. 500 lx
B. 100 lx
C. 200 lx
D. 800 lx
Oświetlenie na poziomie 100 lx czy 200 lx jest na pewno za słabe do pracy biurowej. Tego typu natężenia nadają się bardziej do korytarzy czy miejsc, gdzie nie ma za dużo aktywności wzrokowej. Z kolei 800 lx to już dość dużo, ale w biurze może być zbyt mocne i prowadzić do zmęczenia oczu. Jasne, że natężenie światła zależy od tego, co się robi, ale dla zwykłych biur 500 lx to zdecydowanie najlepszy wybór, bo pasuje do przepisów i zapewnia komfort.

Pytanie 23

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

pracownik() { ... }
static void wypisz() { ... }
int operator== (const pracownik &prac) { ... }
~pracownik() { ... }
Którą z nich można, zgodnie z jej funkcją, rozszerzyć o element diagnostyczny o treści:
cout << "Obiekt został usunięty";
A. operator==
B. wypisz
C. pracownik
D. ~pracownik
Analizując wszystkie odpowiedzi, łatwo dostrzec, że tylko destruktor jest logicznym miejscem na informację o usunięciu obiektu, natomiast pozostałe opcje często wynikają z błędnego rozumienia roli metod klasy. Konstruktor, mimo że jest wywoływany przy tworzeniu obiektu, nie ma żadnego związku z jego usuwaniem – to wręcz jego przeciwieństwo. Często spotykam się z sytuacją, gdzie ktoś myli konstruktor z destruktorem, bo oba mają podobną nazwę, ale ich funkcje są dokładnie odwrotne. Operator== z kolei odpowiada za porównywanie obiektów — nie wpływa ani na ich tworzenie, ani usuwanie. Umieszczając tam komunikat o usunięciu, wprowadzilibyśmy tylko zamieszanie i moglibyśmy nawet nie zauważyć, kiedy taki tekst się pojawia – bo wywołanie operatora porównania może następować wiele razy, a obiekt nadal będzie istniał. Statyczna metoda wypisz również nie ma żadnej relacji z cyklem życia instancji danej klasy – jej zadaniem jest operowanie na danych klasy jako takiej, a nie konkretnych obiektach. W praktyce, próba umieszczenia kodu diagnostycznego związanego z usuwaniem obiektu w którejkolwiek z tych metod może prowadzić do powstania nieczytelnego, trudnego w utrzymaniu kodu i błędnej interpretacji działania programu. Wielu programistów na początku swojej kariery ulega pokusie wrzucania komunikatów wszędzie, gdzie popadnie, ale z czasem przekonują się, że konstruktor i destruktor mają swoje jasno określone role i to właśnie destruktor jest miejscem na komunikaty o końcu życia obiektu. Standardy branżowe i literatura (jak np. Meyers czy Sutter) mocno podkreślają, żeby rozdzielać odpowiedzialności i nie zaciemniać logiki klasy niepotrzebnymi wywołaniami w niewłaściwych miejscach.

Pytanie 24

Który z języków programowania jest powszechnie wykorzystywany do tworzenia aplikacji na komputery stacjonarne?

A. PHP
B. HTML
C. C++
D. JavaScript
C++ jest jednym z najczęściej wykorzystywanych języków programowania do tworzenia aplikacji desktopowych. Jego wysoka wydajność, niskopoziomowy dostęp do pamięci i możliwość zarządzania zasobami sprawiają, że jest idealnym wyborem do tworzenia aplikacji wymagających dużej mocy obliczeniowej, takich jak gry, oprogramowanie do obróbki grafiki czy aplikacje systemowe. Frameworki takie jak Qt i biblioteki standardowe C++ (STL) umożliwiają budowanie zarówno prostych, jak i zaawansowanych aplikacji z bogatym interfejsem użytkownika. C++ jest wykorzystywany na szeroką skalę w przemyśle, co czyni go jednym z kluczowych języków w ekosystemie programistycznym.

Pytanie 25

Jakie jest zastosowanie metody fetch() w JavaScript?

A. Sortowanie kolekcji obiektów
B. Filtrowanie elementów tablicy
C. Manipulacja elementami DOM
D. Pobieranie zasobów z sieci asynchronicznie
Metoda fetch() w JavaScript jest kluczowym narzędziem do asynchronicznego pobierania zasobów z sieci. Umożliwia ona wykonywanie zapytań HTTP do serwerów w sposób, który nie blokuje głównego wątku aplikacji, co jest istotne w kontekście zapewnienia płynności działania aplikacji webowych. Użycie fetch() pozwala na pobieranie różnych typów danych, takich jak JSON, tekst, czy pliki binarne. Przykład zastosowania fetch() może wyglądać następująco: fetch('https://api.example.com/data') .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(data => console.log(data)); W tym przykładzie, po nawiązaniu połączenia z API, sprawdzamy, czy odpowiedź jest poprawna, a następnie przetwarzamy dane w formacie JSON. Ponadto, fetch() wspiera nowoczesne praktyki, takie jak obsługa promes (Promises) oraz async/await, co upraszcza kod i poprawia jego czytelność. Użycie tej metody jest zgodne z aktualnymi standardami webowymi, co czyni ją preferowanym rozwiązaniem w nowoczesnym programowaniu JavaScript.

Pytanie 26

Co oznacza pojęcie MVP w kontekście projektowania aplikacji?

A. Multiple Value Platform - platforma wspierająca wiele typów wartości danych
B. Mobile Virtual Platform - platforma do testowania aplikacji mobilnych
C. Most Valuable Program - program uznany za najbardziej wartościowy w organizacji
D. Minimum Viable Product - produkt o minimalnej funkcjonalności zdolny do działania
Pojęcie Minimum Viable Product (MVP) odnosi się do koncepcji projektowania produktów, która zakłada stworzenie wersji produktu z minimalną funkcjonalnością, zdolnej do spełnienia podstawowych potrzeb użytkowników. Celem MVP jest jak najszybsze wprowadzenie produktu na rynek, co pozwala na zbieranie danych od rzeczywistych użytkowników i dostosowywanie produktu na podstawie ich feedbacku. Tego rodzaju podejście jest zgodne z metodologią Lean Startup, która promuje szybkie cykle iteracyjne i minimalizację ryzyka inwestycyjnego. Przykładem MVP może być aplikacja mobilna, która oferuje tylko najważniejsze funkcje, na przykład możliwość rejestracji i przeglądania treści, zamiast pełnej gamy opcji. Dzięki temu zespół developerski może szybko identyfikować kluczowe potrzeby użytkowników i wprowadzać odpowiednie udoskonalenia. W praktyce MVP pozwala nie tylko na szybsze wprowadzenie produktu na rynek, ale również na optymalizację kosztów i czasów rozwoju, co jest szczególnie istotne w dynamicznie zmieniającym się środowisku technologicznym.

Pytanie 27

Co zostanie wypisane w konsoli po wykonaniu poniższego kodu JavaScript?

let a = { value: 10 };
let b = a;
b.value = 20;
console.log(a.value);
A. 20
B. undefined
C. 10
D. ReferenceError
Wykonując podany kod JavaScript, otrzymujemy wynik 20 w konsoli. Dzieje się tak, ponieważ obiekt `a` jest przypisany do zmiennej `b`, co oznacza, że obie zmienne wskazują na ten sam obiekt w pamięci. Kiedy zmieniamy właściwość `value` obiektu za pomocą zmiennej `b`, zmiana ta wpływa również na obiekt `a`, ponieważ oba odwołują się do tej samej instancji obiektu. Wartości w JavaScript mogą być przekazywane przez referencję, co oznacza, że manipulując jedną referencją, wpływamy na obiekt, do którego ta referencja odnosi się. Przykład ten ilustruje, jak ważne jest zrozumienie różnicy między typami prymitywnymi (przekazywanymi przez wartość) a obiektami (przekazywanymi przez referencję). W praktyce, taka wiedza jest kluczowa przy pracy z obiektami w JavaScript, zwłaszcza w kontekście zarządzania stanem aplikacji, gdzie modyfikacje obiektów mogą mieć szeroki wpływ na cały system.

Pytanie 28

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

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

Pytanie 29

W jakim języku został stworzony framework Angular?

A. PHP
B. Postscript
C. C#
D. Typescript
Angular został stworzony w języku TypeScript, który to w sumie można uznać za rozszerzenie JavaScriptu – dodaje on typowanie statyczne i sporo udogodnień znanych z języków obiektowych. Moim zdaniem to był strzał w dziesiątkę, bo dzięki temu kod aplikacji Angular jest czytelniejszy, łatwiejszy w utrzymaniu i mniej podatny na takie typowe błędy, które się pojawiały w czystym JS. W praktyce, kiedy piszesz komponenty czy serwisy w Angularze, natychmiast korzystasz z silnych typów, interfejsów czy mechanizmów takich jak dekoratory. To nie tylko poprawia bezpieczeństwo kodu, ale też pomaga zespołom programistycznym lepiej się dogadywać i szybciej wdrażać nowe funkcjonalności. Przemysł poszedł tą drogą, bo TypeScript daje lepsze wsparcie narzędziowe, np. podpowiedzi w edytorach, refaktoryzację czy automatyczne wykrywanie błędów. Wbrew pozorom, nie jest trudno się przestawić z JS na TS – nawet dla osób, które programowały wcześniej tylko w czystym JavaScript. Poza tym, Angular to nie tylko framework do weba – aplikacje tworzone w TypeScript można kompilować na różne platformy, co jest już praktyką w dużych firmach. Takie podejście wpisuje się w obecne trendy w branży, gdzie typowanie i czytelność kodu to podstawa.

Pytanie 30

Która z wymienionych metod najlepiej chroni komputer przed złośliwym oprogramowaniem?

A. Stosowanie mocnych haseł
B. Właściwie zaktualizowany program antywirusowy
C. Unikanie używania publicznych sieci Wi-Fi
D. Cykliczne wykonywanie kopii zapasowych
Tworzenie kopii zapasowych to niewątpliwie ważny krok w zabezpieczaniu danych, ale pamiętaj, że to nie pomaga w aktywnej ochronie przed wirusami. Możesz oczywiście odzyskać dane po ataku, ale lepiej jest zapobiegać niż leczyć, prawda? Unikanie publicznych sieci Wi-Fi zmniejsza ryzyko przechwycenia danych, ale nie zabezpiecza twojego komputera przed złośliwym oprogramowaniem. Silne hasła, no jasne, są ważne, ale nie zapobiegają przedostawaniu się wirusów do systemu.

Pytanie 31

Która z niżej wymienionych pozycji jest ekwiwalentem biblioteki jQuery?

A. Bootstrap
B. Lodash
C. TypeScript
D. Express.js
Bootstrap to framework CSS, który służy do stylizacji i tworzenia responsywnych interfejsów użytkownika, ale nie oferuje narzędzi do manipulacji danymi jak Lodash. TypeScript to język programowania, który rozszerza JavaScript o statyczne typowanie, ale nie pełni roli biblioteki do manipulacji obiektami i tablicami. Express.js to minimalny framework do budowy serwerów w Node.js i nie ma zastosowania w kontekście manipulacji danymi na poziomie frontendowym, jak ma to miejsce w przypadku Lodash.

Pytanie 32

Algorytmy, które są wykorzystywane do rozwiązywania problemów przybliżonych lub takich, które nie mogą być opisane za pomocą algorytmu dokładnego, na przykład w prognozowaniu pogody czy identyfikacji nowych wirusów komputerowych, to algorytmy.

A. heurystyczne
B. iteracyjne
C. liniowe
D. rekurencyjne
Algorytmy heurystyczne są metodami rozwiązywania problemów, które są stosowane w sytuacjach, gdy nie ma jednoznacznego algorytmu dokładnego lub gdy problem jest zbyt skomplikowany, aby można go było rozwiązać w rozsądnym czasie. Przykłady zastosowań algorytmów heurystycznych obejmują przewidywanie pogody, gdzie różne modele atmosferyczne mogą być łączone w celu uzyskania lepszej prognozy, oraz rozpoznawanie nowych wirusów komputerowych, gdzie algorytmy heurystyczne pozwalają na identyfikację wzorców i anomalii w zachowaniu oprogramowania. Algorytmy te różnią się od tradycyjnych algorytmów liniowych, które działają na podstawie z góry określonych kroków oraz algorytmów rekurencyjnych, które polegają na rozwiązywaniu problemu poprzez dzielenie go na mniejsze podproblemy. Heurystyki są bardziej elastyczne, ponieważ pozwalają na zastosowanie intuicji i doświadczenia w procesie rozwiązywania. W praktyce algorytmy heurystyczne często łączą różne podejścia, aby uzyskać wyniki, które są wystarczająco dobre w krótkim czasie, co czyni je idealnymi do zastosowania w dynamicznie zmieniających się dziedzinach, takich jak analiza danych i sztuczna inteligencja.

Pytanie 33

W jaki sposób określa się wypadek związany z pracą?

A. Każde zdarzenie, które prowadzi do opóźnienia w wykonaniu obowiązków
B. Każde zdarzenie, które wymaga interwencji technicznej w miejscu zatrudnienia
C. Każdy incydent wynikający z działania osób trzecich
D. Nagłe zdarzenie związane z pracą, powodujące uraz lub śmierć
Zdarzenia, które powodują opóźnienia w realizacji zadań, nie są klasyfikowane jako wypadki przy pracy – mogą to być awarie lub błędy proceduralne, ale nie prowadzą do urazu pracownika. Zdarzenia wymagające pomocy technicznej mogą być awariami sprzętu, ale jeśli nie skutkują urazem, nie są uznawane za wypadki przy pracy. Incydenty spowodowane przez osoby trzecie mogą mieć wpływ na bezpieczeństwo pracy, ale nie są automatycznie klasyfikowane jako wypadki przy pracy – konieczne jest dokładne ustalenie związku z wykonywanymi obowiązkami zawodowymi.

Pytanie 34

Który z poniższych metod najlepiej zabezpiecza dane karty płatniczej podczas zakupów online?

A. Przechowywanie numeru karty w przeglądarce internetowej
B. Używanie wirtualnych kart płatniczych lub jednorazowych kodów
C. Podawanie informacji o karcie w odpowiedzi na wiadomość e-mail od nieznajomego
D. Udostępnianie danych karty na platformach internetowych
Korzystanie z wirtualnych kart płatniczych lub jednorazowych kodów to skuteczny sposób na ochronę danych karty płatniczej podczas transakcji internetowych. Wirtualne karty mają ograniczony okres ważności i są powiązane z określoną kwotą, co minimalizuje ryzyko kradzieży całego konta bankowego. Jednorazowe kody płatności wygasają po jednorazowym użyciu, co uniemożliwia ich ponowne wykorzystanie przez osoby trzecie. Dzięki tym metodom użytkownicy znacznie redukują ryzyko oszustw i nieautoryzowanych transakcji.

Pytanie 35

Który z wymienionych dysków oferuje najszybszy dostęp do danych?

A. HDD 5400 RPM, SATA II, 32 MB Cache
B. SSD NVMe PCIe 3.0, prędkość odczytu do 3500 MB/s
C. HDD 7200 RPM, SATA III, 64 MB Cache
D. SSD SATA III, prędkość odczytu do 550 MB/s
Odpowiedź wskazująca na SSD NVMe PCIe 3.0 jako najszybszy dysk do odczytu danych jest zgodna z obecnymi standardami technologii przechowywania. Dyski SSD (Solid State Drive) korzystają z pamięci flash, co pozwala na znacznie szybszy dostęp do danych w porównaniu do tradycyjnych dysków HDD (Hard Disk Drive), które działają na zasadzie mechanicznych ruchomych elementów. Dyski NVMe (Non-Volatile Memory Express) są szczególnie wydajne, ponieważ wykorzystują interfejs PCIe (Peripheral Component Interconnect Express), co umożliwia znacznie wyższe prędkości transferu danych. W przypadku SSD NVMe PCIe 3.0, prędkość odczytu może osiągać do 3500 MB/s, co jest znaczącą różnicą w porównaniu do prędkości odczytu w dyskach HDD i SSD SATA. Przykładowo, w zastosowaniach takich jak edycja wideo, renderowanie grafiki 3D czy gry komputerowe, wyższa prędkość odczytu przekłada się na szybsze ładowanie danych i lepszą wydajność systemu. Standardy SATA III dla HDD również mają swoje ograniczenia, ponieważ maksymalna teoretyczna prędkość transferu wynosi 6 Gb/s, co jest dalekie od osiągów oferowanych przez NVMe. Dlatego SSD NVMe PCIe 3.0 jest zdecydowanym liderem w kontekście wydajności odczytu danych w porównaniu do pozostałych opcji.

Pytanie 36

Metodyka zwinna (ang. agile) opiera się na

A. podzieleniu projektu na kolejne etapy: planowanie, programowanie, testowanie, z ciągłym oszacowaniem ryzyka projektu
B. dekompozycji przedsięwzięcia na elementy, które są niezależnie projektowane, wytwarzane i testowane w krótkich iteracjach
C. zaplanowaniu całej aplikacji na początku projektu i jej tworzeniu na przemian z testowaniem
D. przygotowaniu testów dla całego projektu, a następnie wprowadzaniu kolejnych jego fragmentów
Metodyka zwinna (agile) polega na podziale projektu na mniejsze części (iteracje), które są projektowane, implementowane i testowane w krótkich cyklach. Takie podejście pozwala na szybkie reagowanie na zmieniające się wymagania klientów i wprowadzanie poprawek na bieżąco. Agile promuje bliską współpracę z klientem, co minimalizuje ryzyko nieporozumień i zwiększa szanse na stworzenie produktu spełniającego jego oczekiwania. Zamiast czekać na zakończenie całego projektu, poszczególne części aplikacji są dostarczane i testowane stopniowo, co skraca czas wdrożenia i umożliwia szybkie wykrycie błędów. Popularnymi frameworkami bazującymi na Agile są Scrum i Kanban, które organizują pracę zespołu w iteracyjne sprinty lub zadania wizualizowane na tablicach Kanban.

Pytanie 37

W środowisku do tworzenia aplikacji, gdzie przedstawiono menu, aby usunąć wszystkie pliki tymczasowe oraz wyniki projektu, należy wybrać opcję

Ilustracja do pytania
A. Run Code Analysis on Solution
B. Build Solution
C. Batch Build
D. Clean Solution
Opcja „Clean Solution” to dokładnie to, czego używa się w Visual Studio lub innych środowiskach IDE, gdy chce się pozbyć wszystkich plików tymczasowych oraz wyników kompilacji powiązanych z bieżącym projektem lub rozwiązaniem. To bardzo praktyczna funkcja – zwłaszcza wtedy, gdy mamy problemy ze zbudowaniem projektu po wprowadzeniu wielu zmian lub gdy różne konfiguracje builda zaczynają się mieszać. Clean Solution usuwa wszystkie foldery bin i obj, co pozwala rozpocząć proces kompilacji od zera, eliminując potencjalne konflikty wynikające ze starych plików. Moim zdaniem warto korzystać z tej opcji regularnie, szczególnie w większych projektach czy zespołach, gdzie często zmieniają się zależności. W branży IT, według dobrych praktyk, „czyszczenie” rozwiązania przed puszczeniem pełnego builda pomaga zredukować liczbę nieprzewidzianych błędów kompilacji. Dla mnie to trochę taki techniczny reset – zanim zaczniesz szukać błędów w kodzie, upewnij się, że budujesz wszystko na świeżo. Zresztą, w dokumentacji Microsoftu też znajdziesz zalecenia, by właśnie Clean Solution stosować do rozwiązywania problemów z nieaktualnymi artefaktami builda. Bez tej funkcji czasem trudno dojść, czemu kompilator się buntuje.

Pytanie 38

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

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

Pytanie 39

Jakie obliczenia można wykonać za pomocą poniższego algorytmu, który operuje na dodatnich liczbach całkowitych?

Ilustracja do pytania
A. sumę cyfr wprowadzonej liczby
B. największy wspólny dzielnik wprowadzonej liczby
C. liczbę cyfr w wprowadzonej liczbie
D. sumę wprowadzonych liczb
Wybierając odpowiedź dotyczącą liczby cyfr w wprowadzonej liczbie, pokazujesz dobre zrozumienie tego, jak działa prezentowany algorytm. W praktyce bardzo często spotyka się podobne rozwiązania, gdy trzeba np. zliczyć, ile znaków ma PESEL, numer telefonu lub numer identyfikacyjny w bazie danych. Algorytm wykonuje bardzo prostą, ale jednocześnie sprytną operację – dzieli podaną liczbę przez 10 (zawsze całkowicie, bez reszty), aż ta liczba się wyzeruje. Za każdym obrotem pętli zwiększa licznik, więc po zakończeniu działania licznik wskazuje, ile razy można było podzielić liczbę przez 10, czyli ile było w niej cyfr. To dokładnie odpowiada liczbie cyfr w zapisie dziesiętnym. Podejście to jest bardzo efektywne, bo nie wymaga konwersji liczby na tekst ani używania dodatkowych struktur danych. W profesjonalnym kodzie często preferuje się takie rozwiązania – są szybkie i niezawodne. Moim zdaniem warto znać ten wzorzec, bo przydaje się zarówno w algorytmice, jak i analizie danych czy podczas implementacji walidacji pól liczbowych w bazach danych lub formularzach. Dodatkowo, zgodnie z dobrymi praktykami, algorytm nie ulega błędom związanym z nietypowymi danymi – działa dla każdej dodatniej liczby całkowitej. Warto zapamiętać takie sztuczki, bo potem życie programisty jest łatwiejsze.

Pytanie 40

Wykorzystując jeden z dwóch zaprezentowanych sposobów inkrementacji w językach z rodziny C lub Java, można zauważyć, że
Zapis pierwszy:

b = a++;
Zapis drugi:
b = ++a;
A. Drugi zapis nie jest zgodny ze składnią, co doprowadzi do błędów kompilacji.
B. Tylko przy użyciu pierwszego zapisu zmienna a zostanie zwiększona o 1.
C. Wartość zmiennej b będzie wyższa po użyciu drugiego zapisu w porównaniu do pierwszego.
D. Bez względu na zastosowany sposób, w zmiennej b zawsze uzyskamy ten sam rezultat.
W językach programowania z rodziny C (w tym C++ i Java) istnieją dwie formy inkrementacji: preinkrementacja (++x) i postinkrementacja (x++). Preinkrementacja zwiększa wartość zmiennej przed jej użyciem w wyrażeniu, natomiast postinkrementacja zwiększa ją dopiero po zakończeniu aktualnej operacji. Oznacza to, że w przypadku postinkrementacji, wartość zmiennej przed zwiększeniem zostanie użyta w bieżącym wyrażeniu, a dopiero potem następuje jej zwiększenie o 1. Ta subtelna różnica ma istotne znaczenie, zwłaszcza w pętlach i wyrażeniach logicznych, gdzie każda iteracja wpływa na wynik. W praktyce preinkrementacja jest nieco bardziej efektywna, ponieważ nie wymaga przechowywania kopii pierwotnej wartości zmiennej, co przekłada się na minimalnie lepszą wydajność w niektórych przypadkach.