Wyniki egzaminu

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

Egzamin niezdany

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

Wymagane minimum: 20 punktów (50%)

Udostępnij swój wynik
Szczegółowe wyniki:
Pytanie 1

Jakie narzędzie wspiera tworzenie aplikacji desktopowych?

A. Angular
B. Xamarin
C. Symfony
D. WPF

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
WPF, czyli Windows Presentation Foundation, to narzędzie, które zdecydowanie kojarzy się z aplikacjami desktopowymi na platformie Windows. Pozwala budować nowoczesne, bogate graficznie interfejsy użytkownika, wykorzystując deklaracyjny język XAML oraz logikę programistyczną w C#. Moim zdaniem WPF to nadal bardzo solidny wybór, jeśli chcemy robić rozbudowane aplikacje okienkowe, które muszą korzystać z możliwości systemu operacyjnego, takich jak obsługa plików, drukowanie czy integracja z innymi aplikacjami Windows. Co ciekawe, wielu dużych graczy rynkowych wciąż używa WPF w swoich rozwiązaniach – choćby aplikacje biurowe, narzędzia branżowe do projektowania graficznego, systemy zarządzania produkcją czy rozbudowane panele administracyjne. Osobiście doceniam fakt, że WPF pozwala stosować wzorzec MVVM, co w realnych projektach pomaga utrzymać kod w porządku i łatwo zarządzać złożonymi aplikacjami. No i jeszcze jedno – dzięki bogatej bazie komponentów oraz możliwości stylizacji, z WPF można wycisnąć naprawdę ciekawe UI. Warto też wiedzieć, że choć pojawiły się nowsze technologie (jak WinUI czy .NET MAUI), to w praktyce WPF jest nadal szeroko wspierany i rozwijany. Jeśli ktoś chce zacząć z aplikacjami desktopowymi na Windows, to moim zdaniem WPF to po prostu dobry start.

Pytanie 2

Które z poniższych nie jest rodzajem bazy danych?

A. Routing Database
B. Relacyjna baza danych
C. Dokumentowa baza danych
D. Grafowa baza danych

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Routing Database to termin, który nie odnosi się do konkretnego rodzaju bazy danych w tradycyjnym sensie, jak to ma miejsce w przypadku relacyjnych, grafowych czy dokumentowych baz danych. Relacyjne bazy danych organizują dane w tabelach oraz umożliwiają wykonywanie złożonych zapytań przy użyciu języka SQL, co jest standardem branżowym. Grafowe bazy danych, z kolei, są zoptymalizowane do przechowywania i przetwarzania danych o relacjach, co sprawia, że są idealne do zastosowań w obszarze analizy sieci społecznych czy systemów rekomendacyjnych. Dokumentowe bazy danych przechowują dane w formie dokumentów, co ułatwia ich przechowywanie i przetwarzanie, szczególnie w kontekście aplikacji webowych i mobilnych. Routing Database nie jest typowym przykładem bazy danych w tym sensie, ponieważ odnosi się do mechanizmów zarządzania ruchem w sieciach komputerowych, co nie jest związane z obiegiem danych w stylu relacyjnym lub NoSQL. Zrozumienie tych różnic jest kluczowe dla właściwego wyboru technologii bazodanowej w zależności od potrzeb aplikacji.

Pytanie 3

Które z poniższych zdań najlepiej określa funkcję zaprzyjaźnioną w ramach klasy?

A. Funkcja, która jest statyczna i nie ma możliwości modyfikacji pól klasy
B. Funkcja, która uruchamia się automatycznie po stworzeniu obiektu
C. Funkcja, która pozwala na dziedziczenie wielokrotne
D. Funkcja, która ma dostęp do prywatnych pól i metod klasy, z którą jest zaprzyjaźniona

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Funkcja zaprzyjaźniona (ang. friend function) to funkcja, która ma dostęp do prywatnych i chronionych pól oraz metod klasy, mimo że nie jest jej częścią. Służy do realizacji operacji wymagających bezpośredniego dostępu do wewnętrznych elementów klasy, ale bez naruszania zasad hermetyzacji. Przykład w C++: `class Konto { private: double saldo; friend void wyswietlSaldo(Konto k); }`. Funkcja `wyswietlSaldo` może odczytać pole `saldo`, mimo że jest ono prywatne. Funkcje zaprzyjaźnione są używane, gdy konieczna jest bliska współpraca między klasami lub funkcjami, ale nie chcemy nadmiernie otwierać interfejsu klasy.

Pytanie 4

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. naprawić błąd w funkcji sprawdz, który polega na braku nawiasów {} w pętli for
B. zadeklarować zmienną sprawdz przed jej wykorzystaniem w linii 11
C. poprawnie zapisać warunek w instrukcji if w linii 11, np. sprawdz(x)==true
D. dodać deklarację funkcji sprawdz przed funkcją main

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
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 5

Które z wymienionych działań zwiększa bezpieczeństwo transakcji online?

A. Weryfikowanie certyfikatów SSL na stronach zajmujących się transakcjami
B. Zastosowanie publicznego Wi-Fi do logowania się na konto bankowe
C. Udostępnianie informacji o karcie kredytowej w e-mailach
D. Nieaktualizowanie oprogramowania przeglądarki

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Sprawdzanie certyfikatów SSL na stronach transakcyjnych to jeden z najważniejszych kroków w zapewnieniu bezpieczeństwa transakcji internetowych. Certyfikat SSL szyfruje dane przesyłane między użytkownikiem a serwerem, chroniąc je przed przechwyceniem przez osoby trzecie. Adresy stron z certyfikatem SSL zaczynają się od 'https', co wskazuje na bezpieczne połączenie. Certyfikaty SSL zapewniają integralność danych i są podstawą dla każdej strony internetowej obsługującej płatności lub przechowującej dane użytkowników. Zignorowanie tej kwestii naraża użytkowników na ataki typu man-in-the-middle i phishing.

Pytanie 6

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

A. Każdy incydent wynikający z działania osób trzecich
B. Każde zdarzenie, które wymaga interwencji technicznej w miejscu zatrudnienia
C. Nagłe zdarzenie związane z pracą, powodujące uraz lub śmierć
D. Każde zdarzenie, które prowadzi do opóźnienia w wykonaniu obowiązków

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wypadek przy pracy to nagłe zdarzenie związane z wykonywaną pracą, które powoduje uraz lub śmierć pracownika. Wypadki te mogą być wynikiem zaniedbań, nieprzestrzegania zasad BHP lub nieodpowiedniego zabezpieczenia stanowiska pracy. Przykładami wypadków przy pracy są upadki z wysokości, porażenia prądem, oparzenia chemiczne lub uszkodzenia ciała przez maszyny. Pracodawca jest zobowiązany do zgłaszania każdego wypadku przy pracy, prowadzenia dochodzenia w celu ustalenia przyczyn i wdrażania działań zapobiegających powtórzeniu się podobnych sytuacji. Wypadki przy pracy są jedną z głównych przyczyn absencji oraz roszczeń pracowniczych, dlatego prewencja i edukacja w zakresie BHP są niezwykle istotne.

Pytanie 7

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

A. Faza analizy
B. Etap implementacji
C. Etap planowania
D. Faza wdrożenia

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Faza implementacji to etap cyklu życia projektu informatycznego, w którym następuje integracja i testowanie wszystkich modułów systemu. Po zakończeniu fazy projektowania i programowania, elementy aplikacji są łączone w jeden spójny system. Integracja polega na połączeniu komponentów, co umożliwia sprawdzenie ich współpracy oraz poprawności przepływu danych. Następnie przeprowadzane są testy integracyjne i systemowe, których celem jest wykrycie błędów w interakcji między modułami. Proces ten jest niezbędny, aby zapewnić stabilność aplikacji przed wdrożeniem do środowiska produkcyjnego. Skuteczna integracja minimalizuje ryzyko awarii i zwiększa niezawodność systemu.

Pytanie 8

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

A. import [ Component ] from 'react'
B. import React.Component from 'react'
C. import { Component } from 'react'
D. import Component from 'react'

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Użycie składni import { Component } from 'react' to zdecydowanie najczęściej spotykany i najbardziej rekomendowany sposób importowania tylko wybranego komponentu z biblioteki React. To tzw. import nazwany, czyli dokładnie wskazujesz, który kawałek kodu chcesz wyciągnąć z całego modułu. W praktyce, jest to bardzo czytelne i pozwala na jasne zarządzanie zależnościami w pliku. Moim zdaniem ma to ogromne znaczenie w większych projektach, bo łatwo potem znaleźć, które elementy są faktycznie wykorzystywane w danym pliku. Co ważne, taka technika importowania jest w pełni zgodna ze standardami ES6, właściwie każdy nowoczesny projekt front-endowy na tym bazuje. Przykład praktyczny: jeśli chcesz stworzyć klasowy komponent React, wystarczy napisać import { Component } from 'react', a potem class MyClass extends Component {...}. Jest to nieco bardziej eleganckie niż importowanie całego obiektu React (np. import React from 'react'), zwłaszcza jeśli nie potrzebujesz całej funkcjonalności. Dodatkowo, takie rozwiązanie może wpływać pozytywnie na bundlowanie kodu, bo nie ściągasz do projektu niepotrzebnych fragmentów biblioteki. Swoją drogą, coraz częściej widać, że programiści skupiają się na minimalizowaniu importów i czytelności kodu – właśnie przez wybór takich rozwiązań.

Pytanie 9

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

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
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 10

Co to jest WebSocket?

A. Narzędzie do testowania aplikacji webowych
B. Protokół komunikacyjny zapewniający komunikację dwukierunkową przez pojedyncze połączenie TCP
C. Biblioteka JavaScript do tworzenia dynamicznych formularzy
D. Standard zapisu danych w formacie binarnym

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
WebSocket to protokół komunikacyjny, który umożliwia dwukierunkową, interaktywną komunikację między klientem a serwerem przez pojedyncze połączenie TCP. Dzięki WebSocket możliwe jest przesyłanie danych w czasie rzeczywistym, co jest szczególnie istotne w aplikacjach wymagających natychmiastowej wymiany informacji, takich jak czaty, gry online czy aplikacje do monitorowania. W przeciwieństwie do tradycyjnych protokołów HTTP, które wymagają wielokrotnych połączeń dla każdej interakcji, WebSocket utrzymuje stałe połączenie, co minimalizuje opóźnienia oraz obciążenie serwera. Technologia ta opiera się na standardach IETF, a także jest szeroko wspierana przez większość nowoczesnych przeglądarek, co czyni ją idealnym rozwiązaniem dla aplikacji webowych. Dobrą praktyką jest również obsługa protokołu HTTPS, co zapewnia bezpieczeństwo wymiany danych. Przykładem zastosowania WebSocket jest aplikacja finansowa, w której użytkownicy muszą na bieżąco śledzić zmiany cen akcji.

Pytanie 11

Który protokół jest używany do bezpiecznej komunikacji przez Internet?

A. FTP
B. HTTPS
C. HTTP
D. SMTP

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
HTTPS (Hypertext Transfer Protocol Secure) to protokół komunikacyjny, który zapewnia bezpieczną transmisję danych w Internecie poprzez zastosowanie kryptografii. W przeciwieństwie do swojego poprzednika HTTP, HTTPS korzysta z SSL/TLS (Secure Sockets Layer/Transport Layer Security), co pozwala na szyfrowanie danych przesyłanych pomiędzy przeglądarką internetową a serwerem. Dzięki temu, wszelkie informacje, takie jak dane osobowe, hasła czy numery kart kredytowych, są chronione przed podsłuchiwaniem i manipulacją. Użycie HTTPS jest obecnie standardem w branży, zwłaszcza w przypadku stron internetowych, które przetwarzają wrażliwe dane, takich jak sklepy internetowe czy serwisy bankowe. Przykłady zastosowania HTTPS obejmują popularne platformy e-commerce, które implementują ten protokół, aby zbudować zaufanie użytkowników oraz zwiększyć bezpieczeństwo transakcji online. Warto również zauważyć, że wyszukiwarki internetowe, takie jak Google, preferują strony korzystające z HTTPS, co wpływa na ich pozycjonowanie w wynikach wyszukiwania. Wprowadzenie HTTPS jest zatem nie tylko kwestią bezpieczeństwa, ale także praktyki zgodnej z wymaganiami SEO.

Pytanie 12

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

A. Programy zbierające prywatne dane bez zgody użytkownika
B. Złośliwe aplikacje wyświetlające reklamy
C. Oprogramowanie uniemożliwiające dostęp do danych w celu wymuszenia zapłaty
D. Oprogramowanie stosowane do realizacji ataków DDoS

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Oprogramowanie typu ransomware to rodzaj złośliwego oprogramowania, które ma na celu zablokowanie dostępu do danych użytkownika, a następnie wymuszenie okupu w zamian za ich przywrócenie. Ransomware działa na zasadzie szyfrowania plików na zainfekowanym urządzeniu, co uniemożliwia użytkownikowi korzystanie z danych. Po dokonaniu szyfrowania, ofiara otrzymuje wiadomość z żądaniem okupu, zazwyczaj w kryptowalutach, które mają na celu anonimowość transakcji. Przykłady ransomware to oprogramowanie takie jak WannaCry oraz Petya, które spowodowały globalne ataki, skutkując znacznymi stratami finansowymi dla wielu organizacji. Zgodnie z definicjami i standardami, takimi jak NIST (National Institute of Standards and Technology), ransomware jest klasyfikowane jako jedno z najpoważniejszych zagrożeń dla bezpieczeństwa informacji. Warto również zauważyć, że ransomware rozwija się, a jego twórcy stosują różne techniki, aby zwiększyć skuteczność ataków, takie jak wykorzystywanie luk w oprogramowaniu oraz phishing, aby zainfekować systemy użytkowników.

Pytanie 13

Co to jest polimorfizm w programowaniu obiektowym?

A. Mechanizm ukrywania szczegółów implementacji przed zewnętrznymi klasami
B. Zdolność obiektów różnych klas do reagowania na tę samą metodę w sposób odpowiedni dla ich klasy
C. Proces tworzenia nowej klasy na podstawie istniejącej
D. Zdolność klasy do posiadania wielu konstruktorów

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Polimorfizm jest fundamentalnym pojęciem w programowaniu obiektowym, które pozwala obiektom różnych klas na reagowanie na tę samą metodę w sposób odpowiedni dla ich konkretnej klasy. Przykładowo, jeśli mamy klasę `Zwierze` z metodą `dźwięk()`, a następnie klasy `Pies` i `Kot`, każda z tych klas może implementować metodę `dźwięk()` w inny sposób: pies może wydawać dźwięk 'Hau', podczas gdy kot 'Miau'. Dzięki temu, gdy wywołujemy `dźwięk()` na obiekcie typu `Zwierze`, a dokładnie na obiekcie, który może być różnego typu, uzyskujemy różne wyniki w zależności od klasy. Polimorfizm zwiększa elastyczność i skalowalność kodu, co jest zgodne z zasadami SOLID, szczególnie z zasadą otwarte-zamknięte. W praktyce polimorfizm umożliwia programistom tworzenie bardziej złożonych systemów, w których obiekty mogą być używane zamiennie, co ułatwia ich rozwój i konserwację.

Pytanie 14

Która z wymienionych zasad odnosi się do zachowania prywatności w sieci?

A. Umieszczanie wszystkich zdjęć na platformach społecznościowych
B. Stosowanie pseudonimów zamiast rzeczywistych imion na mediach społecznościowych
C. Przechowywanie haseł w wiadomościach e-mail
D. Publikowanie danych osobowych na otwartych platformach

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Używanie pseudonimów zamiast prawdziwych imion na portalach społecznościowych jest jedną z podstawowych zasad ochrony prywatności w internecie. Dzięki temu ograniczasz możliwość identyfikacji i śledzenia Twojej aktywności przez osoby trzecie. Pseudonimy minimalizują ryzyko kradzieży tożsamości i redukują ilość danych osobowych dostępnych publicznie. To działanie jest szczególnie ważne dla dzieci i młodzieży, chroniąc ich przed cyberprzemocą i innymi zagrożeniami. W wielu serwisach można także dostosować ustawienia prywatności, ukrywając profil przed osobami spoza listy znajomych.

Pytanie 15

Jaki komponent środowiska IDE jest niezbędny do tworzenia aplikacji webowych?

A. Narzędzie do tworzenia grafiki
B. Debugger, edytor kodu, integracja z systemem kontroli wersji
C. Zarządzanie bazami danych
D. Emulator urządzeń mobilnych

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Debugger, edytor kodu oraz integracja z systemem kontroli wersji to kluczowe elementy środowiska IDE, które umożliwiają efektywną pracę nad aplikacjami webowymi. Debugger pozwala na wykrywanie i naprawianie błędów w czasie rzeczywistym, edytor kodu umożliwia szybkie pisanie i modyfikowanie kodu, a integracja z systemem kontroli wersji (np. Git) pozwala śledzić zmiany i współpracować w zespołach programistycznych. Te narzędzia stanowią podstawę pracy każdego dewelopera webowego.

Pytanie 16

Jak w CSS definiuje się element, który ma reagować na najechanie kursorem?

A. :over
B. :mouse
C. :click
D. :hover

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Odpowiedź :hover jest poprawna, ponieważ w CSS pseudo-klasa :hover jest używana do definiowania stylów elementu, gdy kursor myszy znajduje się nad tym elementem. Jest to niezwykle przydatne w tworzeniu interaktywnych stron internetowych, ponieważ umożliwia twórcom zwiększenie responsywności elementów, takich jak przyciski, linki czy obrazy. Przykładowo, można zastosować :hover do zmiany koloru tła przycisku, co wskazuje użytkownikom, że dany element jest aktywny i gotowy do interakcji. Zastosowanie tej pseudo-klasy nie tylko poprawia estetykę strony, ale również zwiększa jej użyteczność oraz dostępność, co jest zgodne z dobrymi praktykami w projektowaniu UI/UX. Należy pamiętać, że :hover działa tylko w przeglądarkach obsługujących CSS, a efekty związane z tą pseudo-klasą są natychmiastowe, co sprawia, że są one bardzo efektywne w zastosowaniu. Warto również zaznaczyć, że w przypadku urządzeń dotykowych, takich jak smartfony, reakcja na najechanie może być symulowana poprzez dotknięcie ekranu, co sprawia, że ta technika jest uniwersalna.

Pytanie 17

Jaką komendę w języku C++ używa się do wielokrotnego uruchamiania tego samego bloku kodu?

A. while
B. switch
C. break
D. if

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Instrukcja `while` w języku C++ i innych językach programowania pozwala na wielokrotne wykonanie tego samego fragmentu kodu, dopóki warunek logiczny jest spełniony. Przykład: `while (x < 10) { x++; }` będzie zwiększać zmienną `x` o 1, dopóki jej wartość nie osiągnie 10. Pętle `while` są przydatne, gdy liczba iteracji nie jest z góry znana i zależy od spełnienia określonego warunku w trakcie wykonywania programu.

Pytanie 18

Jakie narzędzie jest wykorzystywane do zgłaszania błędów w projektach IT?

A. Blender
B. Git
C. JIRA
D. Photoshop

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
JIRA to jedno z najczęściej wykorzystywanych narzędzi do zarządzania projektami i raportowania błędów w projektach informatycznych. JIRA umożliwia śledzenie błędów, zarządzanie zadaniami oraz efektywne monitorowanie postępów prac nad projektem. Dzięki integracji z innymi narzędziami, takimi jak Confluence czy Bitbucket, JIRA stanowi kompleksowe rozwiązanie wspierające zespoły deweloperskie. Raportowanie błędów w JIRA pozwala na łatwe przypisywanie ich do odpowiednich członków zespołu, dodawanie załączników i komentarzy oraz monitorowanie statusu danego problemu, co usprawnia proces zarządzania jakością oprogramowania.

Pytanie 19

Które z wymienionych pól klasy można zainicjalizować przed stworzeniem obiektu?

A. Static pole
B. Prywatne pole
C. Publiczne pole
D. Chronione pole

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Pole statyczne można zainicjować przed utworzeniem obiektu klasy, ponieważ należy ono do samej klasy, a nie do jej instancji. Statyczne pola są inicjalizowane tylko raz, w momencie pierwszego użycia klasy lub jej statycznych metod. Dzięki temu można przechowywać dane wspólne dla wszystkich obiektów danej klasy, co jest kluczowe w optymalizacji pamięci i kodu. Przykładem może być licznik instancji klasy, który zwiększa swoją wartość za każdym razem, gdy tworzony jest nowy obiekt.

Pytanie 20

Co to jest wzorzec projektowy Singleton?

A. Wzorzec zapewniający istnienie tylko jednej instancji klasy w całej aplikacji
B. Technika optymalizacji kodu poprzez minimalizację liczby obiektów
C. Metoda zabezpieczania aplikacji przed atakami typu SQL Injection
D. Wzorzec do zarządzania komunikacją między komponentami aplikacji

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wzorzec projektowy Singleton to jeden z fundamentalnych wzorców, który zapewnia, że w trakcie działania aplikacji istnieje tylko jedna instancja danej klasy. Przydaje się to w sytuacjach, gdy musimy zarządzać zasobami, które nie powinny być wielokrotnie instancjonowane, na przykład połączenia z bazą danych czy logika globalnych ustawień. Implementacja tego wzorca zakłada zastosowanie prywatnego konstruktora oraz metody statycznej, która odpowiada za utworzenie instancji. Przykładem zastosowania Singletona mogą być klasy zarządzające konfiguracją aplikacji, gdzie zmiana w jednym miejscu może wpłynąć na cały system. Często jest on krytykowany za to, że wprowadza globalny stan, co może prowadzić do trudności w testowaniu i zarządzaniu stanem aplikacji. Dlatego ważne jest, aby stosować go świadomie i tam, gdzie rzeczywiście przynosi korzyści, zgodnie z najlepszymi praktykami inżynieryjnymi.

Pytanie 21

Jakie znaczenie ma polimorfizm w programowaniu obiektowym?

A. Pozwala na tworzenie obiektów z wielu różnych klas równocześnie
B. Umożliwia jednej metodzie działać w różnorodny sposób w zależności od klasy, do której należy
C. Ogranicza dostęp do atrybutów klasy
D. Dzieli program na klasy oraz obiekty

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Polimorfizm to zdolność obiektów do używania tej samej metody lub interfejsu, ale z różnymi implementacjami, w zależności od klasy obiektu. Dzięki polimorfizmowi można wywołać metodę `obiekt.wyswietl()`, która zachowuje się inaczej w klasie `Samochod` i inaczej w klasie `Motocykl`, mimo że nazwa metody pozostaje taka sama. Polimorfizm ułatwia rozbudowę aplikacji, ponieważ nowe klasy mogą być dodawane bez modyfikacji istniejącego kodu, co zwiększa elastyczność i rozszerzalność programu. Jest to jedna z najważniejszych zasad programowania obiektowego, obok dziedziczenia i hermetyzacji.

Pytanie 22

Jaki kod może być związany z treścią wygenerowaną w trakcie działania programu Java?

Exception in thread "main" java.lang.ArithmeticException: / by zero
A. x = tablica[6];
B. if (x > y) ...
C. x = x % y;
D. x = 0;

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Kod x = x % y; jest klasycznym przykładem operacji, która może prowadzić do wystąpienia wyjątku ArithmeticException w Javie, szczególnie gdy zmienna y przyjmuje wartość zero. Operator modulo (%) w języku Java nie toleruje dzielenia przez zero – w przeciwieństwie do niektórych innych języków, które mogą zwracać np. NaN lub Infinity, tutaj od razu zostanie zgłoszony wyjątek. Taki wyjątek jest dość powszechny w pracy programisty, zwłaszcza w aplikacjach, gdzie dane wejściowe nie są do końca kontrolowane. Moim zdaniem dobrze jest od razu przyzwyczaić się do zabezpieczania wszystkich operacji dzielenia i modulo poprzez wcześniejsze sprawdzenie wartości dzielnika. Rekomenduje się stosowanie warunków typu if (y != 0) przed wykonaniem takiej instrukcji, co jest zgodne z dobrymi praktykami defensywnego programowania. Dodatkowo, w środowiskach produkcyjnych często otacza się te fragmenty kodu blokiem try-catch, aby elegancko obsłużyć wyjątek i np. wyświetlić użytkownikowi zrozumiały komunikat. Warto pamiętać, że ArithmeticException dziedziczy po RuntimeException, a więc nie musimy jej jawnie obsługiwać, ale nie oznacza to, że powinniśmy ją ignorować – w dobrze napisanym kodzie zawsze należy przewidywać takie sytuacje. Z mojego doświadczenia wynika, że najwięcej błędów z tym związanych pojawia się w aplikacjach przetwarzających dane liczbowe, gdzie nawet niepozorna operacja modulo może „wywalić” cały proces, jeśli nie zostanie odpowiednio zaopiekowana.

Pytanie 23

Który z podanych algorytmów operujących na jednowymiarowej tablicy posiada złożoność obliczeniową O(n²)?

A. Wyszukiwanie binarne
B. Sortowanie szybkie
C. Sortowanie bąbelkowe
D. Wypisanie elementów

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Sortowanie bąbelkowe, znane również jako bubble sort, to prosty algorytm sortowania, który działa na zasadzie wielokrotnego przechodzenia przez tablicę i porównywania sąsiadujących ze sobą elementów. Algorytm ten ma złożoność obliczeniową O(n^2), co oznacza, że w najgorszym przypadku liczba operacji porównania wzrasta kwadratowo wraz ze wzrostem liczby elementów w tablicy. Przykładowo, dla tablicy o 5 elementach algorytm może wykonać do 10 porównań. W praktyce sortowanie bąbelkowe jest rzadko stosowane w dużych zbiorach danych ze względu na swoją niską efektywność, jednak jest to dobry przykład do nauki podstaw algorytmów sortujących. Standardy algorytmów sortujących, takie jak te zawarte w podręcznikach algorytmiki, często używają sortowania bąbelkowego jako przykładu do omówienia prostych koncepcji związanych z sortowaniem. Warto zauważyć, że chociaż algorytm ten jest prosty do zrozumienia, jego złożoność czasowa sprawia, że nie jest on praktyczny do stosowania w produkcyjnych rozwiązaniach, gdyż bardziej optymalne algorytmy, jak sortowanie szybkie czy sortowanie przez scalanie, osiągają złożoność O(n log n).

Pytanie 24

Która z wymienionych sytuacji stanowi naruszenie praw autorskich?

A. Używanie programu typu open-source zgodnie z warunkami licencji
B. Tworzenie kopii zapasowej legalnie zakupionego programu
C. Nabycie licencji na oprogramowanie
D. Udostępnianie filmu objętego prawami autorskimi bez zgody właściciela

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Publikowanie filmu chronionego prawami autorskimi bez zgody właściciela jest naruszeniem praw autorskich. Prawa autorskie chronią twórców przed nieuprawnionym kopiowaniem, dystrybucją i rozpowszechnianiem ich dzieł. W przypadku filmów, muzyki czy oprogramowania, każde użycie bez odpowiednich licencji lub zgody właściciela jest niezgodne z prawem. Twórcy mają prawo do wynagrodzenia za swoją pracę, a naruszenia mogą skutkować wysokimi grzywnami, a nawet postępowaniem sądowym. Przestrzeganie praw autorskich wspiera rozwój kultury i technologii, chroniąc interesy twórców.

Pytanie 25

Które z wymienionych sytuacji jest przykładem hermetyzacji w programowaniu obiektowym?

A. Tworzenie klasy abstrakcyjnej
B. Wykorzystanie klasy nadrzędnej w innej klasie
C. Ograniczenie dostępu do pól klasy poprzez modyfikatory dostępu
D. Tworzenie wielu metod o tej samej nazwie w różnych klasach

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Hermetyzacja (ang. encapsulation) to mechanizm programowania obiektowego, który polega na ukrywaniu wewnętrznych danych obiektu oraz udostępnianiu dostępu do nich tylko za pośrednictwem metod publicznych (gettery i settery). Dzięki hermetyzacji dane klasy są chronione przed bezpośrednią modyfikacją, co zwiększa bezpieczeństwo i stabilność kodu. Przykład w C++: `class Konto { private: double saldo; public: void wplata(double kwota) { saldo += kwota; } }` – saldo jest polem prywatnym, które można modyfikować tylko poprzez metody publiczne, co zapobiega nieautoryzowanemu dostępowi.

Pytanie 26

Wskaż uproszczoną wersję kodu XAML dla elementów w pokazanym oknie dialogowym?

Ilustracja do pytania
A. Kod 2
B. Kod 1
C. Kod 3
D. Kod 4

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Dobrze jest znać podstawowe różnice pomiędzy ListBox, ComboBox, CheckBox, RadioButton oraz Label w XAML. W tym oknie dialogowym widać wyraźnie, że po lewej stronie użytkownik ma możliwość wyboru gatunku zwierzęcia spośród kilku opcji wyświetlonych jednocześnie. Takie zadanie najlepiej spełnia ListBox, bo umożliwia wygodną selekcję z widocznej listy. U góry po prawej jest pole tekstowe do wpisania imienia zwierzaka, więc TextBox jak najbardziej pasuje. Poniżej mamy dwa pola wyboru – „Zaszczepiony?” i „Na diecie?” – to są typowe przypadki na CheckBoxy: można zaznaczyć dowolne lub oba naraz. Kluczowe jest to, że CheckBox pozwala użytkownikowi wybrać dowolną kombinację, a nie tylko jedną opcję jak RadioButton. Z mojego doświadczenia często początkujący mylą ComboBox z ListBoxem, ale tu akurat lista jest zawsze widoczna, co jest typowe dla ListBoxa. Stosowanie CheckBoxów dla takich dwustanowych opcji też jest zgodne z dobrymi praktykami UX i standardami opisu formularzy w XAML. W pracy zawodowej często się to wykorzystuje, bo kod jest czytelny i łatwo go rozszerzać. Właśnie taki zestaw – ListBox, TextBox, CheckBox – jest najbardziej przejrzysty i zgodny z zamysłem projektanta interfejsów. Fajnie jest to zapamiętać, bo ta kombinacja pojawia się w wielu firmowych projektach.

Pytanie 27

Który z poniższych kodów realizuje przedstawiony fragment algorytmu?

Ilustracja do pytania
A. Kod 3
B. Kod 2
C. Kod 1
D. Kod 4

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Bardzo dobrze wychwycone! Kod 3 idealnie odwzorowuje logikę algorytmu przedstawioną na schemacie blokowym. Pętla while sprawdza warunek y != 100 i dopóki jest spełniony, wykonuje instrukcję y = a + b. Zarówno przebieg pętli, jak i wyjście z niej odpowiadają dokładnie temu, co prezentuje ten diagram blokowy – czyli wykonujemy przypisanie y = a + b, jeśli warunek jest prawdziwy, a gdy przestaje być, wychodzimy z pętli. Takie podejście jest bardzo typowe w programowaniu, nie tylko w szkolnych zadaniach, ale też w praktyce, gdy musimy powtarzać akcję do momentu spełnienia konkretnego warunku. Moim zdaniem, dobrze jest tutaj zauważyć, że pętle while są preferowane, gdy nie znamy z góry liczby powtórzeń, a warunek wejścia ma być sprawdzany przed każdym przebiegiem – to klasyczna konstrukcja w językach takich jak C, Java czy Python. Tego typu algorytmy można spotkać choćby podczas obsługi wejścia użytkownika (np. powtarzaj pytanie, aż użytkownik poda poprawną wartość) albo w sterowaniu urządzeniami, gdy czekamy na określony sygnał wejściowy. Warto też pamiętać, że w profesjonalnym kodzie dobrze jest dbać o czytelność i jednoznaczność takich fragmentów – a ten kod właśnie taki jest. Swoją drogą, czasem warto dodać jeszcze zabezpieczenia, by uniknąć tzw. nieskończonej pętli, ale tutaj, jak widać, intencja jest jasna i zgodna ze standardami branżowymi.

Pytanie 28

Co to jest klasa abstrakcyjna?

A. Klasa, która nie może posiadać żadnych metod
B. Klasa, która może zawierać zarówno metody zdefiniowane, jak i niezdefiniowane (czysto wirtualne)
C. Klasa, która zawsze dziedziczy z klasy bazowej
D. Klasa, która może być dziedziczona, ale nie można jej instancjonować

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Odpowiedź „Klasa, która może być dziedziczona, ale nie można jej instancjonować” jest poprawna, ponieważ najtrafniej oddaje istotę klasy abstrakcyjnej w programowaniu obiektowym. Klasa abstrakcyjna służy jako wzorzec lub szablon dla klas pochodnych, określając wspólne cechy i zachowania, które powinny zostać zaimplementowane w klasach dziedziczących. Nie tworzy się z niej bezpośrednio obiektów, ponieważ sama w sobie nie reprezentuje kompletnego bytu, lecz raczej koncepcję lub ogólny typ. Dzięki temu mechanizmowi programista może narzucić strukturę kodu, zwiększyć jego czytelność oraz ułatwić dalsze rozszerzanie aplikacji. Takie podejście sprzyja stosowaniu zasad programowania obiektowego, takich jak dziedziczenie i polimorfizm, a także pomaga w tworzeniu bardziej uporządkowanych i łatwiejszych w utrzymaniu projektów.

Pytanie 29

Co to jest dependency injection w programowaniu?

A. Metoda optymalizacji zapytań do bazy danych
B. Proces kompilacji kodu źródłowego do kodu maszynowego
C. Metoda projektowania interfejsu użytkownika
D. Technika, w której obiekt otrzymuje inne obiekty, od których zależy

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Dependency injection (DI) to technika programowania, która polega na dostarczaniu obiektom ich zależności z zewnątrz, zamiast tworzenia ich samodzielnie wewnątrz klasy. Dzięki temu kod staje się bardziej modularny, łatwiejszy do testowania i utrzymania. Przykładem zastosowania DI jest framework Spring w języku Java, który umożliwia zarządzanie zależnościami za pomocą kontenerów IoC (Inversion of Control). Korzyści płynące z używania DI obejmują zwiększenie elastyczności oraz ułatwienie wprowadzania zmian w kodzie, ponieważ zmiany w jednej klasie nie wymagają modyfikacji innych. DI wspiera zasady SOLID, szczególnie zasadę odwrócenia zależności (Dependency Inversion Principle), co prowadzi do bardziej przejrzystego i zrozumiałego kodu. W praktyce, implementacja DI może odbywać się za pomocą konstruktorów, setterów lub interfejsów, co daje programiście wybór w doborze najodpowiedniejszej metody dla danego projektu.

Pytanie 30

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

#include <stdio.h>
int main() {
    int a = 5;
    float b = 5.12345;
    double w;
    w = a + b;
    printf("%s dodawania: %d + %.2f = %f", "Wynik", a, b, w);
    return 0;
}
A. dodawania: 5+5.12345=10.123450 Wynik
B. "%s dodawania: %d + %.2f = %f", "Wynik", 5, 5.12345, 10.123450
C. "%s dodawania: %d + %.2f=%f", "Wynik", a, b, w
D. Wynik dodawania: 5+5.12=10.123450

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
To właśnie taka odpowiedź najlepiej oddaje działanie kodu. Użycie printf z formatami %d dla liczby całkowitej, %.2f dla liczby zmiennoprzecinkowej typu float z dwoma miejscami po przecinku oraz %f dla liczby typu double daje taki właśnie efekt na ekranie: "Wynik dodawania: 5+5.12=10.123450". Kluczowe jest zrozumienie, jak printf zaokrągla i prezentuje wartości float – %.2f ucina do dwóch miejsc po przecinku, nawet jeśli w pamięci zmienna b ma więcej cyfr. To bardzo praktyczna sprawa, bo często chcemy sformatować wyjście tak, by było czytelne dla użytkownika, np. w raportach czy interfejsach tekstowych. Kod pokazuje też bezpośrednią konwersję typu int na double, kiedy dodajemy a i b – kompilator sam wie, że w wyniku będzie double i nie ma potrzeby ręcznie rzutować typu. Takie formatowanie to codzienność w profesjonalnym programowaniu, zwłaszcza gdy zależy nam na przejrzystym, przewidywalnym wyjściu. Moim zdaniem warto też pamiętać o dobrych praktykach – warto zawsze jasno określać liczbę miejsc po przecinku, żeby uniknąć przypadkowych zaokrągleń czy dziwnych formatów na ekranie. Sam printf to klasyk, używany od lat w C i C++, i nawet w nowych projektach, gdzie liczy się wydajność, to jedno z najprostszych narzędzi do szybkiego debugowania czy prezentowania danych liczbowych.

Pytanie 31

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

A. try { kod } finally { obsługa }
B. try { kod } catch { obsługa }
C. try { kod } except { obsługa }
D. try { kod } handle { obsługa }

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Jak to wygląda w C++? Kluczowym elementem jest szkielet z blokami 'try' i 'catch'. W bloku 'try' piszesz kod, który może spowodować błąd, a 'catch' zajmuje się sytuacjami, kiedy coś pójdzie nie tak. Dzięki temu nie musisz się martwić, że program nagle przestanie działać, bo masz kontrolę nad tym, jak reagować w trudnych momentach. Obsługa wyjątków to naprawdę ważna sprawa w programowaniu, bo pomaga wyłapać różne problemy, czy to z danymi, z pamięcią, czy z plikami. Z mojego doświadczenia, to po prostu sprawia, że aplikacje są bardziej stabilne i działa to na korzyść zarówno programisty, jak i użytkownika.

Pytanie 32

Jaką kategorię reprezentuje typ danych "array"?

A. Typ danych złożony
B. Typ logiczny
C. Typ danych prosty
D. Typ wskaźników

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Tablica ('array') jest przykładem złożonego typu danych, który pozwala na przechowywanie wielu wartości tego samego typu pod wspólną nazwą. Każdy element tablicy jest dostępny za pomocą indeksu, co umożliwia szybkie i efektywne operacje na dużych zbiorach danych. Tablice są szeroko wykorzystywane w programowaniu do przechowywania list, macierzy i innych struktur, gdzie konieczne jest przechowywanie dużych ilości danych tego samego rodzaju. Dzięki tablicom można zorganizować dane w sposób uporządkowany, co ułatwia ich przetwarzanie, sortowanie i wyszukiwanie.

Pytanie 33

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

<ComboBox SelectionChanged="Funkcja1" DragEnter="Funkcja2"
    LostFocus="Funkcja3" KeyDown="Funkcja4">
</ComboBox>
W kodzie:
private void Funkcja1(object sender, SelectionChangedEventArgs e)
{
    MessageBox.Show("Zdarzenie 1");
}
private void Funkcja2(object sender, DragEventArgs e)
{
    MessageBox.Show("Zdarzenie 2");
}
private void Funkcja3(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Zdarzenie 3");
}
private void Funkcja4(object sender, KeyEventArgs e)
{
    MessageBox.Show("Zdarzenie 4");
}
A. Zdarzenie 1
B. Zdarzenie 2
C. Zdarzenie 3
D. Zdarzenie 4

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wybrałeś dokładnie to, co trzeba. W tej sytuacji kluczowe jest rozpoznanie, że zdarzenie SelectionChanged jest wywoływane zawsze wtedy, gdy użytkownik wybierze inną pozycję z ComboBoxa. I to właśnie do tego zdarzenia przypisana jest metoda Funkcja1, która wyświetla komunikat "Zdarzenie 1". Trochę to wygląda niepozornie, ale SelectionChanged to jeden z najczęściej obsługiwanych eventów w aplikacjach desktopowych opartych na WPF czy UWP – praktycznie zawsze reagujemy na wybór użytkownika w kontrolkach ComboBox, ListBox albo nawet ListView. Z mojego doświadczenia wynika, że początkujący programiści często mylą to zdarzenie z innymi, jak LostFocus, które odpala się, gdy kontrolka traci fokus, albo z DragEnter (zupełnie inny przypadek, bo dotyczy przeciągania danych). Warto pamiętać, że KeyDown reaguje dopiero na naciśnięcie klawisza, a nie na wybór myszką. Takie rozróżnienie jest codziennością przy tworzeniu bardziej zaawansowanych interfejsów użytkownika. Praktyczna wskazówka: jeśli chcesz reagować na wybór użytkownika i np. ładować dodatkowe dane czy weryfikować coś po stronie aplikacji, to SelectionChanged jest strzałem w dziesiątkę. Standardy branżowe sugerują nie przesadzać z obsługą zbyt wielu eventów jednocześnie dla tej samej kontrolki, bo to może prowadzić do konfliktów i dziwnych zachowań UI. Mocno polecam samemu poeksperymentować – otworzyć Visual Studio, zrobić prostą aplikację WPF, podpiąć te eventy i zobaczyć, które kiedy się odpalają. Dzięki temu dużo szybciej utrwala się ta wiedza niż z samej teorii.

Pytanie 34

Zajmując się pracą w zespole oraz dbając o jego efektywne funkcjonowanie, nie powinniśmy

A. skupiać się jedynie na własnych korzyściach
B. wspierać się nawzajem
C. sumiennie i w ustalonym terminie realizować swoje zadania
D. przyjmować odpowiedzialności za swoje decyzje

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Dokładnie o to chodzi – skupianie się tylko na własnych korzyściach prawie zawsze działa na szkodę zespołu. W praktyce, gdy ktoś patrzy wyłącznie na siebie, najczęściej zaniedbuje współpracę, co prowadzi do napięć i spadku efektywności grupy. W zespole liczy się wspólny cel, a nie indywidualne interesy, bo to właśnie dzięki wzajemnemu wsparciu i otwartej komunikacji można osiągnąć lepsze wyniki. Z mojego doświadczenia wynika, że projekty, w których członkowie współpracowali i dzielili się odpowiedzialnością, szły sprawniej i bez zbędnych spięć. Profesjonalne standardy, np. metodyki Scrum czy Agile, akcentują wartość pracy zespołowej i transparentności – jeśli każdy ciągnie w swoją stronę, cały model współpracy się sypie. Warto pamiętać, że nawet najlepszy specjalista sam nie pociągnie projektu, jeśli nie będzie działał fair wobec innych. Najlepiej się sprawdza takie podejście, gdzie ludzie podchodzą do pracy z otwartością, potrafią poprosić o pomoc i wspólnie świętują sukcesy, a nie tylko skupiają się na własnych liczbach czy bonusach. To naprawdę widać w praktyce – zespoły, gdzie nie liczy się tylko własny interes, mają zwykle znacznie lepsze efekty i atmosferę pracy.

Pytanie 35

Jakie rezultaty pojawią się po uruchomieniu poniższego kodu napisanego w języku C++?

class KlasaBazowa {
    public:
        virtual void metoda() {
            cout << "Bazowa. ";
        }
};

class KlasaPochodna : public KlasaBazowa {
    public:
        void metoda() {
            cout << "Pochodna. ";
        }
};

int main() {
    KlasaBazowa *bazowa = new KlasaPochodna();
    KlasaPochodna *pochodna = new KlasaPochodna();

    bazowa->metoda();
    pochodna->metoda();
    return 0;
}
A. Pochodna. Bazowa.
B. Bazowa. Bazowa.
C. Bazowa. Pochodna.
D. Pochodna. Pochodna.

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Kod wyświetla 'Pochodna. Pochodna.', co wskazuje, że metody klasy pochodnej przejęły kontrolę nad tymi z klasy bazowej. To fajny przykład polimorfizmu, jaki mamy w C++. Tutaj metoda w klasie pochodnej jest lepsza od metody w klasie bazowej. To, jakie wywołanie się wykona, zależy od konkretnego obiektu, a nie od tego, jaką metodę zdefiniowaliśmy w klasie bazowej.

Pytanie 36

Co to jest destructuring assignment w JavaScript?

A. Metoda usuwania nieużywanych zmiennych z kodu
B. Technika optymalizacji kodu przez kompilator
C. Proces konwersji typów danych w JavaScript
D. Składnia pozwalająca na rozpakowanie wartości z tablic lub obiektów do oddzielnych zmiennych

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Destructuring assignment w JavaScript to technika, która pozwala na wygodne i intuicyjne rozpakowywanie wartości z tablic oraz obiektów, co znacząco ułatwia pracę z danymi. Używając tej składni, możemy przypisywać wartości do zmiennych w bardziej przejrzysty sposób. Na przykład, jeśli mamy obiekt z danymi użytkownika, zamiast pisać wiele linii kodu, aby uzyskać dostęp do poszczególnych właściwości, możemy użyć destructuring. Przykład: const user = { name: 'Jan', age: 30 }; const { name, age } = user; Teraz mamy bezpośredni dostęp do zmiennych name i age, co poprawia czytelność kodu. Destructuring jest również przydatny w kontekście funkcji, gdzie możemy rozpakowywać argumenty w sposób bardziej zrozumiały. Jest to zgodne z najlepszymi praktykami programowania w JavaScript, co sprawia, że kod jest bardziej zwięzły oraz łatwiejszy do utrzymania. Dodatkowo, technika ta wspiera rozwój złożonych aplikacji, gdzie zarządzanie danymi i ich struktura odgrywają kluczową rolę.

Pytanie 37

Wykorzystanie typu DECIMAL w MySQL wymaga wcześniejszego określenia długości (liczby cyfr) przed oraz po przecinku. Jak należy to zapisać?

A. zmiennoprzecinkowy
B. łańcuchowy
C. stałoprzecinkowy
D. logiczny

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Typ DECIMAL w języku MySQL jest używany do przechowywania liczb dziesiętnych z określoną precyzją. Przy definiowaniu tego typu danych wymagane jest określenie dwóch głównych parametrów: długości całkowitej liczby, czyli liczby cyfr przed przecinkiem, oraz długości części dziesiętnej, czyli liczby cyfr po przecinku. Taki zapis ma postać DECIMAL(M, D), gdzie M to maksymalna liczba cyfr, a D to liczba cyfr po przecinku. Przykład zastosowania to: DECIMAL(10, 2), co oznacza, że liczba może mieć maksymalnie 10 cyfr, z czego 2 cyfry będą po przecinku. Typ DECIMAL jest szczególnie przydatny w aplikacjach finansowych, gdzie precyzja obliczeń jest kluczowa, aby uniknąć błędów zaokrągleń, które mogą występować w przypadku typów zmiennoprzecinkowych. Standardy dotyczące typów danych w SQL, takie jak SQL:2008, również uznają znaczenie precyzyjnych reprezentacji liczbowych, co sprawia, że DECIMAL jest preferowany w wielu zastosowaniach. Warto dodać, że MySQL pozwala na elastyczność w definiowaniu długości, co umożliwia optymalne dostosowanie do specyficznych wymagań aplikacji.

Pytanie 38

Zaprezentowany diagram Gantta odnosi się do projektu IT. Przy założeniu, że każdy członek zespołu dysponuje wystarczającymi umiejętnościami do realizacji każdego z zadań oraz że do każdego zadania można przypisać jedynie jedną osobę, która poświęci na zadanie pełny dzień pracy, to minimalna liczba członków zespołu powinna wynosić:

Ilustracja do pytania
A. 1 osobę
B. 5 osób
C. 2 osoby
D. 4 osoby

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wybrana odpowiedź jest trafna, bo minimalna liczba członków zespołu wynosi właśnie 2 osoby. W projekcie przedstawionym na diagramie Gantta, kluczowe jest zwrócenie uwagi na to, ile zadań nakłada się w danym tygodniu – a nie łączna liczba zadań. Największe obciążenie zespołu wypada na okresy, gdzie równolegle realizowane są dwa zadania, np. w pierwszym tygodniu są to Projekt aplikacji i Grafika, później w ostatnim tygodniu dwie aplikacje: front-end i back-end. W żadnym momencie nie występuje potrzeba, by więcej niż dwie osoby pracowały równolegle nad różnymi zadaniami. To bardzo praktyczna sytuacja – w realnych projektach IT planuje się obłożenie pracą właśnie przez analizę diagramu Gantta, by nie generować sztucznego przestoju lub nadmiaru ludzi. Moim zdaniem taka optymalizacja zespołu to podstawa w IT, bo pozwala ograniczyć koszty i lepiej zarządzać zasobami. Warto pamiętać, że zgodnie z dobrymi praktykami zarządzania projektami, np. w metodykach PMBOK czy Prince2, zawsze analizuje się ścieżki krytyczne i równoległość zadań, dokładnie w taki sposób, żeby nie dublować niepotrzebnie rąk do pracy. Świetnie, jeśli już na etapie planowania potrafisz to zauważyć i wyciągnąć praktyczne wnioski – to naprawdę przydaje się potem przy rozpisywaniu harmonogramów na czasach rzeczywistych projektów.

Pytanie 39

Celem zastosowania wzorca Obserwator w tworzeniu aplikacji WEB jest:

A. monitorowanie działań użytkownika oraz generowanie wyjątków
B. informowanie obiektów o modyfikacji stanu innych obiektów
C. zarządzanie funkcjami synchronicznymi w kodzie aplikacji
D. dostosowanie interfejsu użytkownika do różnych kategorii użytkowników

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wzorzec projektowy Obserwator (ang. Observer) to jeden z klasyków ze świata programowania obiektowego i frontendu. Główna jego rola polega na tym, by pozwalać obiektom (obserwatorom) reagować na zmiany stanu innych obiektów (podmiotów) bez sztywnego powiązania tych klas ze sobą. W praktyce, w aplikacjach webowych bardzo często wykorzystuje się ten wzorzec w architekturach typu MVC czy MVVM, gdzie widoki muszą się automatycznie aktualizować po zmianie modelu danych. Przykład: w Reactcie używasz hooka useState lub useEffect – i Twoje komponenty „obserwują” stan aplikacji. Gdy stan się zmienia, komponenty same się przebudowują, a Ty nie musisz ręcznie wywoływać każdej aktualizacji. Podobnie działa np. EventEmitter w Node.js, Redux z subskrypcjami store czy nawet WebSockety, gdzie klient „słucha” na zmiany po stronie serwera. Dzięki temu komunikacja pomiędzy różnymi częściami systemu staje się luźno powiązana, co ułatwia utrzymanie i rozbudowę kodu. Moim zdaniem bez zrozumienia tego wzorca trudno ogarnąć nowoczesny frontend, bo większość bibliotek UI gdzieś pod spodem go wykorzystuje. Przy okazji: Observer to wzorzec zalecany przez GOF (Gang of Four), więc to nie jest tylko „fajna technika”, ale sprawdzony standard branżowy. Warto wiedzieć, że podejście to minimalizuje ryzyko błędów w synchronizacji danych i pozwala naturalnie reagować na zmiany bez pisania stosów callbacków. To spora oszczędność czasu i kodu.

Pytanie 40

W przypadku przedstawionego fragmentu kodu Java, wyjątek zostanie zgłoszony, gdy wartość zmiennej index wyniesie:

try {
    int[] liczby = {1, 2, 3, 4, 5, 6};
    System.out.println(liczby[index]);
}
catch (Exception e) {
    System.out.println("wystąpił błąd.");
}
A. 7
B. 5
C. 0
D. 1

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
W podanym kodzie Java mamy do czynienia z tablicą o nazwie liczby zawierającą sześć elementów: {1 2 3 4 5 6}. Indeksy tablicy w Javie zaczynają się od 0 a kończą na n-1 gdzie n to długość tablicy. W tym przypadku tablica ma długość 6 a więc jej indeksy to 0 1 2 3 4 i 5. Kiedy próbujemy uzyskać dostęp do elementu tablicy za pomocą indeksu równego długości tablicy lub większego np. 6 w tym przypadku otrzymujemy wyjątek ArrayIndexOutOfBoundsException. Jest to standardowe zachowanie w języku Java mające na celu ochronę przed błędami związanymi z nieprawidłowym dostępem do pamięci. Tego rodzaju błędy mogą prowadzić do nieprzewidywalnych zachowań programów dlatego obsługa takich wyjątków jest dobrą praktyką programistyczną. Kod zawiera blok try-catch który przechwytuje wszelkie wyjątki w tym przypadku i drukuje komunikat aby poinformować użytkownika o błędzie. Takie podejście jest zgodne z zasadami bezpiecznego programowania oraz ułatwia debugging i zarządzanie błędami w aplikacjach produkcyjnych.