Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 19 grudnia 2025 10:55
  • Data zakończenia: 19 grudnia 2025 11:12

Egzamin zdany!

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

Wymagane minimum: 20 punktów (50%)

Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

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

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

Pytanie 2

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

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

Pytanie 3

Jaki modyfikator dostępu umożliwia dostęp do pól klasy tylko za pomocą jej metod?

A. Public
B. Protected
C. Static
D. Private
Modyfikator `public` umożliwia dostęp do pól i metod z dowolnego miejsca w programie, co narusza zasadę hermetyzacji i ukrywania danych wewnętrznych obiektu. `protected` pozwala na dostęp do pól i metod klasy w ramach dziedziczenia, ale nie ogranicza dostępu wyłącznie do metod tej samej klasy. `static` to modyfikator, który oznacza, że pole lub metoda należy do klasy, a nie do instancji obiektu, co nie jest związane z ograniczaniem dostępu. Tylko `private` zapewnia pełną kontrolę nad dostępem do danych wewnątrz klasy.

Pytanie 4

Które z wymienionych narzędzi nie znajduje zastosowania w tworzeniu aplikacji desktopowych?

A. Przeglądarka internetowa
B. Edytor graficzny
C. Debugger
D. Kompilator
Przeglądarka internetowa nie jest narzędziem wykorzystywanym bezpośrednio w procesie tworzenia aplikacji desktopowych. Chociaż może służyć do przeszukiwania dokumentacji lub testowania aplikacji webowych, jej funkcjonalność nie wspiera bezpośredniego tworzenia aplikacji desktopowych. W tworzeniu aplikacji desktopowych kluczowe są narzędzia takie jak kompilatory, debugery i edytory kodu. Kompilatory przekształcają kod źródłowy na kod wykonywalny, debugery pozwalają na śledzenie błędów, a edytory kodu umożliwiają pisanie i edytowanie aplikacji.

Pytanie 5

Który z wymienionych elementów jest fundamentalny w architekturze klient-serwer?

A. Zdalne wykonywanie aplikacji na urządzeniu klienta
B. Brak podziału na funkcje klienta i serwera
C. Wyłącznie komunikacja synchroniczna
D. Scentralizowane przechowywanie danych
Zdalne wykonywanie aplikacji na urządzeniu klienta oznacza model przetwarzania lokalnego, co nie jest główną cechą architektury klient-serwer. Brak podziału na funkcje klienta i serwera narusza podstawową ideę tego modelu, który zakłada rozdzielenie ról pomiędzy te dwie jednostki. Wyłącznie komunikacja synchroniczna ogranicza elastyczność aplikacji i może prowadzić do opóźnień w przetwarzaniu danych.

Pytanie 6

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

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

Pytanie 7

Co to jest git rebase?

A. Metoda tworzenia kopii zapasowej repozytorium
B. Polecenie do tworzenia nowego repozytorium
C. Narzędzie do rozwiązywania konfliktów między plikami
D. Technika integracji zmian z jednej gałęzi do drugiej przez przeniesienie lub połączenie sekwencji commitów
Git rebase to technika stosowana w systemach kontroli wersji, która umożliwia integrację zmian z jednej gałęzi do drugiej poprzez przeniesienie lub połączenie sekwencji commitów. W praktyce, rebase pozwala na 'przeniesienie' commitów z gałęzi roboczej na szczyt gałęzi docelowej, co skutkuje liniowym historią commitów. Taka struktura jest bardziej przejrzysta i ułatwia śledzenie wprowadzonych zmian. Przykładem zastosowania może być sytuacja, gdy pracujesz nad nową funkcjonalnością w gałęzi feature, a w międzyczasie na gałęzi main wprowadzono istotne poprawki. Wykonując rebase na swojej gałęzi feature, możesz szybko zintegrować zmiany z main, co pozwala na uniknięcie problemów z późniejszym scaleniem. Rebase jest zgodny z dobrymi praktykami branżowymi, ponieważ wspiera utrzymanie czystej historii projektu. Należy jednak pamiętać, że rebase zmienia historię, co sprawia, że nie powinno się go stosować na publicznych gałęziach, aby nie komplikować pracy innych deweloperów.

Pytanie 8

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

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

Pytanie 9

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

Ilustracja do pytania
A. Kod 4
B. Kod 3
C. Kod 2
D. Kod 1
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 10

Które narzędzie najlepiej nadaje się do analizy wydajności aplikacji JavaScript?

A. Chrome DevTools Performance
B. Babel
C. Webpack
D. npm
Wybór narzędzi do analizy wydajności aplikacji JavaScript jest kluczowy, jednak nie każde narzędzie nadaje się do tego celu. Webpack, na przykład, jest narzędziem do budowania aplikacji, które umożliwia pakowanie modułów JavaScript i zarządzanie zależnościami, ale nie jest narzędziem służącym do analizy wydajności. Jego główną funkcją jest optymalizacja kodu i zasobów w celu zmniejszenia rozmiaru aplikacji, co pośrednio może wpłynąć na wydajność, ale nie pozwala na bezpośrednią analizę jej działania w czasie rzeczywistym. Babel również nie jest narzędziem do analizy wydajności. To transpiler, który umożliwia używanie nowoczesnych funkcji JavaScript w starszych przeglądarkach. Jego rolą jest konwersja kodu, a nie monitorowanie jego efektywności. npm to menedżer pakietów, który służy do instalacji i zarządzania bibliotekami JavaScript, ale nie zapewnia narzędzi do analizy wydajności aplikacji. Wybierając niewłaściwe narzędzia, można zainwestować czas w coś, co nie przyniesie oczekiwanych rezultatów, co jest powszechnym błędem wśród programistów. Kluczowe jest zrozumienie, że do skutecznej analizy wydajności potrzebne są narzędzia, które dają nam wgląd w działanie kodu, a nie tylko w jego strukturę czy zależności.

Pytanie 11

Jaką rolę odgrywa interpreter w kontekście programowania?

A. Przekłada kod źródłowy na język maszynowy w trakcie działania programu
B. Generuje plik wykonywalny dla systemu operacyjnego
C. Zoptymalizowuje wydajność aplikacji w środowisku produkcyjnym
D. Łączy kod źródłowy z zewnętrznymi bibliotekami
Tworzenie pliku wykonywalnego jest cechą kompilatora, który generuje gotowy program działający niezależnie od kodu źródłowego. Łączenie kodu z bibliotekami zewnętrznymi to zadanie linkera, który przygotowuje aplikację do uruchomienia, a nie interpretera. Optymalizacja działania aplikacji w środowisku produkcyjnym to rola profilerów i narzędzi do monitorowania wydajności, a nie interpretera, który nie ingeruje w działanie programu po jego uruchomieniu.

Pytanie 12

Jaki jest zasadniczy cel ataku phishingowego?

A. Kradzież haseł z pamięci operacyjnej urządzenia
B. Zbieranie danych osobowych za pomocą podszywających się stron lub wiadomości
C. Uniemożliwienie dostępu do usług internetowych
D. Zakłócanie pracy sieci przez nadmiarowe zapytania
Głównym celem ataku phishingowego jest przejęcie danych osobowych ofiary, co realizowane jest poprzez wykorzystanie fałszywych stron internetowych lub wiadomości. Atakujący tworzą atrakcyjne i wiarygodne kopie legalnych stron, często podszywając się pod znane instytucje bankowe, portale społecznościowe czy serwisy e-commerce. Użytkownik, nieświadomy zagrożenia, wprowadza swoje dane logowania, numery kart kredytowych lub inne wrażliwe informacje, które trafiają w ręce cyberprzestępców. Aby ułatwić ten proces, phisherzy często wykorzystują techniki inżynierii społecznej, takie jak fałszywe powiadomienia o konieczności weryfikacji konta. Przykłady skutecznych ataków phishingowych obejmują kampanie wysyłania e-maili, które informują użytkowników o rzekomych problemach z kontem, kierując ich na podszyte strony. Standardy bezpieczeństwa, takie jak DMARC, SPF i DKIM, są kluczowe dla ochrony przed tego rodzaju atakami, jednak ich brak lub niewłaściwe wdrożenie zwiększa podatność na phishing.

Pytanie 13

Co to jest Redux?

A. System kontroli wersji dla projektów JavaScript
B. Framework do tworzenia aplikacji mobilnych
C. Biblioteka do zarządzania stanem aplikacji w JavaScript
D. Narzędzie do optymalizacji wydajności aplikacji React
Chociaż odpowiedzi związane z frameworkami do tworzenia aplikacji mobilnych, narzędziami do optymalizacji wydajności czy systemami kontroli wersji mogą być interesujące, nie są one związane z funkcją, jaką pełni Redux. Frameworki do tworzenia aplikacji mobilnych, takie jak React Native, pozwalają na rozwijanie aplikacji mobilnych z użyciem JavaScript, ale nie zarządzają one stanem aplikacji w sposób, w jaki robi to Redux. Optymalizacja wydajności aplikacji React nie jest bezpośrednią funkcją Redux; chociaż biblioteka ta może pośrednio przyczynić się do lepszej wydajności przez poprawne zarządzanie stanem, nie jest narzędziem służącym do optymalizacji. Z kolei systemy kontroli wersji, takie jak Git, służą do zarządzania historią zmian w kodzie źródłowym aplikacji, a nie do zarządzania stanem wykonawczej logiki aplikacji. Wybór niewłaściwego narzędzia wynika często z braku zrozumienia ich funkcji oraz zastosowania w procesie tworzenia aplikacji. Aby skutecznie zarządzać stanem w aplikacji, kluczowe jest zrozumienie różnic między tymi narzędziami oraz ich zastosowaniem w architekturze aplikacji, co jest fundamentalnym elementem współczesnego rozwijania oprogramowania.

Pytanie 14

Jaką kategorię reprezentuje typ danych "array"?

A. Typ logiczny
B. Typ wskaźników
C. Typ danych prosty
D. Typ danych złożony
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 15

Na podstawie treści zawartej w ramce, określ, który z rysunków ilustruje element odpowiadający klasie Badge zdefiniowanej w bibliotece Bootstrap?

Ilustracja do pytania
A. Rysunek 2
B. Rysunek 3
C. Rysunek 4
D. Rysunek 1
Wybór Rysunku 2 jest poprawny ponieważ przedstawia on elementy badge zdefiniowane w bibliotece Bootstrap Badge to niewielkie oznaczenia wizualne zazwyczaj zawierające liczby lub krótkie informacje które można umieścić obok linków lub innych elementów interfejsu użytkownika W Bootstrapie badge są implementowane za pomocą klasy .badge i można je stosować na przykład do wskazywania liczby nowych wiadomości lub powiadomień w aplikacjach webowych Dzięki temu użytkownik ma natychmiastowy dostęp do ważnych informacji bez konieczności wykonywania dodatkowych działań Przykładem zastosowania badge może być ikonka koperty z liczbą nieprzeczytanych wiadomości w skrzynce odbiorczej Co więcej badge można stylować za pomocą dodatkowych klas kolorystycznych takich jak .bg-primary .bg-success itd co pozwala na dostosowanie ich wyglądu do stylistyki całej aplikacji To praktyczne narzędzie w tworzeniu intuicyjnych interfejsów użytkownika które poprawia użyteczność i estetykę strony internetowej Zastosowanie badge zgodnie z dobrymi praktykami projektowania UX/UI wspiera lepszą organizację i dostępność informacji w aplikacjach internetowych

Pytanie 16

Co to jest dokumentacja instruktażowa programu?

A. Dokumentem przedstawiającym plany rozwoju oprogramowania
B. Instrukcją opisującą, jak używać funkcji programu
C. Zbiorem szczegółów technicznych dotyczących kodu źródłowego
D. Kolekcją testów jednostkowych oraz ich wyników
Instrukcja wyjaśniająca, jak korzystać z funkcji programu, to podstawowy element dokumentacji pomocy programu. Tego rodzaju dokumentacja jest skierowana do użytkowników końcowych i zawiera opisy interfejsu, funkcji oraz dostępnych narzędzi. Instrukcja użytkownika może obejmować zrzuty ekranu, filmy instruktażowe oraz FAQ (często zadawane pytania), co ułatwia szybkie wdrożenie w obsługę aplikacji. Celem dokumentacji pomocy jest nie tylko wyjaśnienie podstawowych funkcji programu, ale także zwiększenie komfortu użytkownika i minimalizacja problemów związanych z obsługą oprogramowania. Przejrzysta i dobrze napisana instrukcja wpływa na pozytywne doświadczenia użytkowników, redukując liczbę zgłoszeń do działu wsparcia technicznego.

Pytanie 17

Co to jest Continuous Integration (CI)?

A. Protokół komunikacji między różnymi częściami aplikacji
B. Metoda ciągłego monitorowania wydajności aplikacji w produkcji
C. Praktyka automatycznego integrowania kodu w repozytorium wspólnym wraz z testami
D. Technika tworzenia aplikacji mobilnych w sposób przyrostowy
Continuous Integration (CI) to praktyka, która ma na celu automatyzację procesu integrowania kodu w repozytorium wspólnym. Główną ideą CI jest to, aby programiści regularnie dodawali swoje zmiany do głównej gałęzi kodu, co pozwala na bieżące testowanie aplikacji. Dzięki temu można szybko wykrywać i naprawiać błędy, zanim staną się one poważnym problemem. Typowym przykładem zastosowania CI jest użycie narzędzi takich jak Jenkins, GitLab CI czy Travis CI, które automatycznie uruchamiają zestaw testów po każdym wprowadzeniu zmian. Takie podejście nie tylko poprawia jakość kodu, ale również przyspiesza cykl wydania oprogramowania, co jest zgodne z najlepszymi praktykami w branży. Warto również zauważyć, że CI jest często częścią szerszego podejścia do DevOps, które integruje rozwój i operacje, aby zwiększyć efektywność całego procesu wytwarzania oprogramowania.

Pytanie 18

Który z poniższych przykładów ilustruje deklarację złożonego typu w języku C++?

A. int wynik = 100;
B. class Student {};
C. bool status;
D. float ocena = 4.5;
Deklaracja `class Student {};` w języku C++ przedstawia przykład tworzenia typu złożonego w postaci klasy. Klasa to podstawowy element programowania obiektowego, który pozwala na łączenie danych (pól) i funkcji (metod) w jednej strukturze. Klasy umożliwiają modelowanie rzeczywistych obiektów i ich zachowań, co prowadzi do bardziej zorganizowanego i skalowalnego kodu. Klasy mogą być rozszerzane przez dziedziczenie, co jest kluczową zaletą programowania obiektowego.

Pytanie 19

Jakie kroki należy podjąć po wykryciu błędu w kodzie podczas testowania?

A. Pominąć błąd, jeżeli aplikacja funkcjonuje poprawnie
B. Usunąć moduł, który zawiera błąd
C. Naprawić błąd i przeprowadzić ponowne testy aplikacji
D. Zgłosić błąd użytkownikowi końcowemu
Po znalezieniu błędu w kodzie podczas testowania kluczowym krokiem jest poprawienie błędu i ponowne przetestowanie aplikacji. Taki cykl iteracyjny pozwala na eliminację błędów i zapewnienie, że aplikacja działa zgodnie z oczekiwaniami. Testowanie po każdej poprawce jest niezbędne, aby upewnić się, że wprowadzone zmiany nie wpłynęły negatywnie na inne części aplikacji. Taka praktyka jest integralną częścią Continuous Integration (CI) i Continuous Deployment (CD), które zakładają częste wdrażanie i testowanie kodu. Poprawienie błędów na wczesnym etapie rozwoju minimalizuje koszty i czas potrzebny na naprawę błędów w fazie produkcyjnej, co przyczynia się do stabilności i wysokiej jakości końcowego produktu.

Pytanie 20

Jakie metody pozwalają na przesłanie danych z serwera do aplikacji front-end?

A. biblioteki jQuery
B. protokołu SSH
C. metody POST
D. formatu JSON
Format JSON to zdecydowanie najpopularniejszy i najwygodniejszy sposób przesyłania danych pomiędzy serwerem a aplikacją front-end. JSON, czyli JavaScript Object Notation, jest lekkim formatem wymiany danych, który został zaprojektowany właśnie pod kątem prostoty odczytu i zapisu, zarówno przez ludzi, jak i maszyny. Moim zdaniem trudno dziś znaleźć nowoczesną aplikację webową, która nie korzysta z JSON-a. W praktyce wygląda to tak, że serwer generuje odpowiedź HTTP z danymi w formacie JSON, a front-end (często napisany w JavaScript lub TypeScript) potrafi je bez problemu sparsować i wykorzystać. Standardy branżowe – jak REST API czy GraphQL – bazują w dużej mierze na tym formacie, bo jest uniwersalny, prosty i dobrze wspierany przez frameworki. JSON wspiera nawet zagnieżdżone struktury, tablice, obiekty, więc przekazywanie danych jest bardzo elastyczne. Z mojego doświadczenia, dzięki JSON-owi można bardzo sprawnie integrować różne technologie na back-endzie i front-endzie, co się naprawdę często przydaje przy dużych projektach. Warto pamiętać, że praktycznie każdy język programowania ma biblioteki do obsługi JSON-a, więc nie ma tu żadnych barier technologicznych. Nawet przy komunikacji asynchronicznej (np. z użyciem fetch czy XMLHttpRequest) JSON jest domyślnym wyborem. Tak naprawdę, jeśli chodzi o wymianę danych w aplikacjach webowych, JSON jest po prostu standardem de facto i warto go dobrze znać.

Pytanie 21

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. dwie zmienne o typie strukturalnym
C. dwie zmienne typu tekstowego, dwie całkowite oraz jedną logiczną
D. jedną zmienną typu tekstowego, dwie całkowite, jedną znakową i jedną logiczną
Analizując podaną deklarację zmiennych w języku Java, widać wyraźnie, że mamy tu do czynienia z pięcioma zmiennymi o różnych typach: String imie = "Anna" – typ tekstowy, short wiek = 12 oraz int i = 0 – dwa typy całkowite (różnią się zakresem wartości), char plec = 'K' – typ znakowy, boolean jestUczniem = true – typ logiczny. Takie zróżnicowanie typów pozwala nie tylko przechowywać różne informacje, ale też lepiej zarządzać pamięcią i logiczną strukturą programu. Z mojej perspektywy, właściwy dobór typów danych to podstawa, bo pomaga unikać wielu późniejszych problemów z kompatybilnością czy błędami wykonania. Java została zaprojektowana tak, by wymuszać jawność typów, co zdecydowanie zwiększa czytelność kodu i zmniejsza liczbę nieoczywistych bugów. Praktycznie, w każdej większej aplikacji spotkamy się z kombinacją typów prostych (jak int, short, boolean czy char) i obiektowych (np. String). Warto pamiętać, że String to typ referencyjny, a nie prosty jak reszta wymienionych. Przy dużych projektach poleca się deklarować zmienne możliwie najwęższego typu (np. short zamiast int, jeśli wystarczy), by oszczędzać zasoby. To jest taka podstawowa wiedza, bez której trudno ruszyć dalej w świecie Javy, bo typy decydują o tym, jak zachowuje się program i co można z danymi zrobić. W rzeczywistych projektach, na przykład przy tworzeniu rejestracji użytkowników czy bazy danych, takie typy jak String, int, char i boolean pojawiają się na każdym kroku.

Pytanie 22

Zaprezentowany diagram ilustruje wyniki przeprowadzonych testów:

Ilustracja do pytania
A. funkcjonalności
B. ochrony
C. wydajnościowych
D. użyteczności
To właśnie są testy wydajnościowe – dokładnie takie parametry jak czasy ładowania, liczba żądań HTTP, rozmiar przesyłanych danych czy ilość przekierowań analizuje się w praktyce podczas oceny wydajności stron internetowych. Moim zdaniem ten typ testów jest absolutnie kluczowy w projektowaniu nowoczesnych aplikacji webowych, bo użytkownicy szybko rezygnują, jeśli strona się długo ładuje albo jest zbyt zasobożerna. W branży zwraca się obecnie ogromną uwagę na to, by strony były 'lekkie', szybkie i zoptymalizowane pod kątem przesyłu danych. Nawet Google premiuje szybkie serwisy w wynikach wyszukiwania, co niejeden programista już odczuł na własnej skórze. Testy wydajnościowe sprawdzają, jak aplikacja zachowuje się pod dużym obciążeniem i ile danych realnie pobierają użytkownicy. W praktyce polecam korzystać z narzędzi takich jak Google Lighthouse, WebPageTest czy nawet prosty DevTools w przeglądarce – pozwalają szybko wyłapać największe problemy z czasem ładowania. Warto też pamiętać, że optymalizacja wydajności to nie tylko lepsze wrażenia użytkownika, ale bardzo wymierne oszczędności na transferze i infrastrukturze. Dobry zwyczaj to cyklicznie monitorować te wskaźniki, nawet gdy wydaje się, że wszystko działa OK – bo sytuacja może się szybko zmienić po wdrożeniu nowych funkcjonalności lub zmianach w kodzie.

Pytanie 23

Co to jest IndexedDB?

A. Format indeksowania danych w bazach NoSQL
B. Niskopoziomowe API do przechowywania dużych ilości danych w przeglądarce użytkownika
C. System zarządzania bazami SQL w aplikacjach backendowych
D. Indeks danych używany przez wyszukiwarki internetowe
Odpowiedzi, które wskazują na inne znaczenia IndexedDB, wynikają z nieporozumień dotyczących funkcji i zastosowania tej technologii. IndexedDB nie jest indeksem danych używanym przez wyszukiwarki internetowe, ponieważ jego głównym celem jest przechowywanie danych lokalnie na urządzeniu użytkownika, a nie indeksowanie ich w sieci. Takie myślenie prowadzi do błędnych wniosków na temat jego funkcjonalności, ponieważ indeksy w wyszukiwarkach takie jak Google służą do szybkiego odnajdywania informacji w ogromnych zbiorach danych dostępnych w Internecie, a nie do lokalnego przechowywania czy manipulacji informacjami. Ponadto, nie jest to system zarządzania bazami SQL w aplikacjach backendowych. IndexedDB działa w przeglądarkach i jest zaprojektowane do pracy w środowisku klienta, podczas gdy bazy SQL, takie jak MySQL czy PostgreSQL, są zazwyczaj używane na serwerach i wymagają odrębnego podejścia do zarządzania danymi. Również twierdzenie, że IndexedDB jest formatem indeksowania danych w bazach NoSQL, jest mylące. IndexedDB to nie format, lecz interfejs API, który wspiera przechowywanie danych w strukturze obiektowej, co czyni go bardziej elastycznym w kontekście przechowywania danych niż tradycyjne bazy NoSQL. W rezultacie, błędne koncepcje wynikają z niepełnego zrozumienia, jak działa IndexedDB oraz jakie są jego główne zastosowania i ograniczenia.

Pytanie 24

Przykład wywołania funkcji zamien w języku C++ może wyglądać w następujący sposób:

void zamien(int *a, int *b) {
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
A. zamien(*a, *b); // a, b - zmienne całkowite
B. zamien(&a, &b); // a, b - zmienne całkowite
C. zamien(m, n); // m, n - zmienne całkowite
D. zamien(12, 34)
Patrząc na inne podane propozycje, łatwo zauważyć, że każda z nich zawiera typowy błąd związany z mechaniką przekazywania danych do funkcji w C++. Dużo osób na początku myśli, że można po prostu przekazać liczby bezpośrednio, jak w zamien(12, 34), ale to mija się z celem, bo funkcja oczekuje wskaźników, czyli adresów zmiennych, które mają być zamienione. Przekazanie samych wartości (czy to literałów, czy konkretnych zmiennych) skutkuje tym, że funkcja pracuje na kopiach tych wartości, a nie na oryginalnych danych. Taki kod się nawet nie skompiluje, bo kompilator jasno wymaga wskaźników jako argumentów. Z kolei zamien(*a, *b) też jest mylące, bo tu przekazujemy już nie wskaźniki, ale wartości, na które one wskazują. To znowu powoduje, że funkcja dostaje kopie, a nie adresy, więc nie może zmienić oryginałów. Bardzo łatwo tu pomylić dereferencję z przekazaniem wskaźnika – moim zdaniem to jeden z najczęstszych błędów początkujących, bo na pierwszy rzut oka wydaje się logiczne, że skoro funkcja operuje na wskaźnikach, to wystarczy podać gwiazdkę. No ale niestety, to jest właśnie ta typowa pułapka. Podobnie zamien(m, n) wygląda jak klasyczne wywołanie funkcji, ale znowu – przekazujemy wartości, nie adresy, więc zamiana zachodzi tylko na kopiach i nie widać efektu poza funkcją. W praktyce taki kod nie spełnia celu, dla którego ktoś napisał funkcję operującą na wskaźnikach. Takie nieporozumienia wynikają często z nieznajomości podstaw przekazywania parametrów w C++. Programowanie niskopoziomowe jest pod tym względem wymagające, bo trzeba zawsze wiedzieć, czy manipuluje się oryginałem czy tylko tymczasową kopią, a to różnica zasadnicza. Z mojego doświadczenia wynika, że najlepiej uczyć się przez praktykę: napisać prostą funkcję, przekazać różne typy argumentów i samemu zobaczyć, co się dzieje z ich wartościami po powrocie z funkcji. To bardzo szybko wyjaśnia, dlaczego przekazywanie wskaźników lub referencji jest tak ważne w sytuacjach, gdy chcemy faktycznie wpłynąć na dane przekazane do funkcji. Warto też podkreślić, że kompilator nie pozwoli na wywołanie funkcji z niezgodnym typem argumentu – i to jest jedna z tych rzeczy, które ratują przed większą katastrofą w działającym programie.

Pytanie 25

Co to jest Event Loop w JavaScript?

A. Mechanizm pozwalający na asynchroniczne wykonywanie kodu mimo jednowątkowej natury JavaScript
B. Technika obsługi zdarzeń w aplikacjach React
C. System zarządzania cyklem życia komponentów w Angular
D. Protokół komunikacji między różnymi częściami aplikacji webowej
Wybór błędnej odpowiedzi może wynikać z nieporozumienia co do roli Event Loop w JavaScript. Technika obsługi zdarzeń w aplikacjach React to zupełnie inna kwestia. React jako biblioteka frontendowa opiera się na komponentach i zarządzaniu stanem, a obsługa zdarzeń w niej polega na nasłuchiwaniu i reagowaniu na różne interakcje użytkownika. Event Loop nie jest bezpośrednio związany z tym procesem, choć obie koncepcje mogą współpracować w większym ekosystemie aplikacji. Protokół komunikacji między różnymi częściami aplikacji webowej także nie odnosi się do Event Loop. Takie protokoły, jak HTTP czy WebSocket, służą do wymiany danych, ale nie kontrolują one asynchronicznego wykonywania kodu. Również system zarządzania cyklem życia komponentów w Angular to kolejny temat, który nie ma nic wspólnego z Event Loop. Angular, jak React, korzysta z własnych metod do zarządzania cyklem życia komponentów, które są niezależne od działania Event Loop. Zrozumienie różnicy między tymi koncepcjami jest kluczowe dla efektywnego programowania w JavaScript i tworzenia skalowalnych aplikacji. Dlatego ważne jest, aby przyjrzeć się mechanizmowi Event Loop i jego roli w przetwarzaniu asynchronicznym, co jest fundamentalne dla wydajności aplikacji webowych.

Pytanie 26

Wskaż właściwość charakterystyczną dla metody abstrakcyjnej?

A. jest pusta w klasie nadrzędnej
B. zawsze jest prywatna
C. jest pusta w klasach dziedziczących
D. nie ma implementacji w klasie bazowej
Metoda abstrakcyjna to taki specjalny rodzaj metody, który pojawia się w programowaniu obiektowym, głównie w językach jak Java, C# czy Python (tam nazywa się abstractmethod). Jej kluczową właściwością jest to, że nie ma własnej implementacji w klasie bazowej, czyli tej nadrzędnej. To trochę jakby ktoś powiedział: 'Hej, tutaj powinna być jakaś funkcja, ale jeszcze nie wiem, jak dokładnie ma działać – niech ktoś, kto będzie po mnie dziedziczył po tej klasie, sam ją zdefiniuje.' Dzięki temu daje się klasom pochodnym jasny sygnał, że muszą tę metodę zaimplementować, żeby klasa mogła poprawnie funkcjonować. W praktyce, jeśli próbujesz stworzyć obiekt klasy bazowej zawierającej metody abstrakcyjne, kompilator się obrazi (no, rzuci wyjątkiem albo nawet nie pozwoli na kompilację). Moim zdaniem to bardzo praktyczne podejście, bo wymusza spójność w architekturze kodu – każdy, kto dziedziczy po klasie bazowej, nie może zapomnieć o kluczowych metodach. Standardy branżowe, jak SOLID, promują taką separację odpowiedzialności i abstrakcję, dzięki czemu kod jest czytelniejszy i łatwiejszy do rozbudowy. Przykładowo, jeśli masz klasę abstrakcyjną 'Figura', to metoda obliczPole() nie ma sensu bez konkretnej figury, więc w klasie bazowej zostaje abstrakcyjna, a dopiero w 'Kwadracie' czy 'Kole' dostaje realną implementację. Z mojego doświadczenia, takie podejście bardzo pomaga, kiedy projekt robi się większy, bo jasno wiadomo, co jeszcze trzeba dopisać w klasach pochodnych. Jest to wręcz obowiązkowe w wielu wzorcach projektowych, na przykład w strategii albo szablonie metody.

Pytanie 27

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

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

Pytanie 28

Który framework jest powszechnie wykorzystywany do tworzenia aplikacji internetowych w języku Python?

A. Angular
B. ASP.NET Core
C. Django
D. React.js
Django to framework stworzony specjalnie do budowy aplikacji webowych w języku Python. Jest jednym z najbardziej popularnych i zaawansowanych frameworków typu full-stack, który oferuje szeroki wachlarz narzędzi umożliwiających szybkie i efektywne tworzenie aplikacji internetowych. Django pozwala na tworzenie aplikacji zgodnych z zasadą DRY (Don't Repeat Yourself), co oznacza minimalizację powtarzalnego kodu. Posiada wbudowany panel administracyjny, system ORM (Object-Relational Mapping) oraz zabezpieczenia przed atakami CSRF i XSS. Dzięki Django programiści mogą skupić się na rozwijaniu logiki biznesowej, a nie na konfiguracji podstawowych funkcji aplikacji, co znacznie skraca czas wdrożenia gotowego produktu.

Pytanie 29

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

A. Opracowywanie interfejsu graficznego
B. Projektowanie bazy danych
C. Kompilowanie aplikacji
D. Debugowanie kodu w celu znalezienia błędów
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 30

Która z właściwości przycisków typu Radio-button opisanych w przedstawionym fragmencie dokumentacji jest poprawna?

Radio-button label

... The label can be positioned before or after the radio-button by setting the labelPosition property to 'before' or 'after'.

Radio groups

Radio-buttons should typically be placed inside of an <mat-radio-group> unless the DOM structure would make that impossible ... The radio-group has a value property that reflects the currently selected radio-button inside of the group.

Źródło: https://material.angular.io/components/radio/overview

A. Przyciski radio-button są organizowane w elemencie o nazwie <radio-group>
B. Właściwość labelPosition może przyjmować jedną z dwóch opcji
C. Etykieta (label) może być umieszczona wyłącznie po przycisku radio-button
D. Wartość właściwości value grupy radio przechowuje tekst etykiety dla każdego radio-button
Właściwość labelPosition w przyciskach typu radio-button, szczególnie w popularnych bibliotekach jak Angular Material, naprawdę potrafi ułatwić życie programiście. Jej działanie sprowadza się do tego, że pozwala określić, czy etykieta powinna być wyświetlana przed, czy po elemencie radio. Można ustawić tę właściwość na 'before' albo 'after'. Nie brzmi skomplikowanie, ale znaczenie praktyczne jest ogromne – czasem projekt graficzny wymaga, by tekst pojawił się z lewej strony guzika, a czasem z prawej. Dobre praktyki UX też to uwzględniają, bo zgodność z oczekiwaniami użytkownika poprawia czytelność formularzy. Moim zdaniem, jeśli budujesz interfejs dla internautów z różnych środowisk kulturowych (np. z językiem pisanym od prawej do lewej), ta opcja jest wręcz niezbędna. Warto też pamiętać, że takie ustawienie można łatwo nadpisywać na poziomie pojedynczego przycisku, co daje dużą elastyczność. W większości poważnych frameworków webowych, np. Angularze, ta właściwość jest dokumentowana jako podstawowa, bo daje deweloperowi kontrolę bez grzebania w CSS-ach. Sam nie raz korzystałem z labelPosition, szczególnie w korporacyjnych projektach, gdzie musiałem spełniać szczegółowe wymagania projektantów – dzięki temu oszczędza się czas i nerwy.

Pytanie 31

Technika konstruowania algorytmu polegająca na rozbiciu na dwa lub więcej mniejszych podproblemów, aż do momentu, gdy ich części będą wystarczająco proste do bezpośredniego rozwiązania, nosi nazwę:

A. komiwojażera
B. najkrótszej trasy
C. heurystycznej
D. dziel i zwyciężaj
Technika „dziel i zwyciężaj” (ang. divide and conquer) to jedno z tych podejść, które moim zdaniem warto naprawdę dobrze rozumieć, bo spotyka się je praktycznie wszędzie w informatyce. Chodzi tutaj o rozbijanie dużego problemu na mniejsze, bardziej strawne kawałki, które rozwiązujemy niezależnie, a potem składamy wyniki w całość. To bardzo eleganckie, bo pozwala np. mocno uprościć złożone zadania, a przy okazji często optymalizuje czas działania algorytmu. Przykładem mogą być sortowanie szybkie (quicksort) czy sortowanie przez scalanie (merge sort). W praktyce branżowej, kiedy pracuje się nad dużymi systemami albo algorytmami operującymi na wielkich zbiorach danych, taki sposób myślenia bardzo się przydaje, bo pozwala łatwo podzielić pracę nawet między kilku programistów. Standardy branżowe, zwłaszcza w kontekście rozwiązań algorytmicznych czy projektowania systemów, promują właśnie takie modularne podejście. Sam kiedyś przekonałem się, że dużo łatwiej jest testować i utrzymywać kod, kiedy trzyma się tej zasady. Fajnie wiedzieć, że często to właśnie „dziel i zwyciężaj” leży u podstaw wielu struktur danych, algorytmów wyszukiwania czy nawet analizy obrazu, nie tylko w typowym programowaniu. Warto pamiętać, że to nie tylko teoria – w codziennej pracy taki styl rozwiązywania problemów pozwala szybciej wychwytywać i naprawiać błędy, a to przecież kluczowe w projektach IT.

Pytanie 32

W C++ mechanizm programowania obiektowego, który wykorzystuje funkcje wirtualne (ang. Virtual) i umożliwia programiście pominięcie kontroli klasy pochodnej podczas wywoływania metod, nazywa się

A. dziedziczeniem
B. przeciążeniem
C. hermetyzacją
D. polimorfizmem
Dziedziczenie pozwala na przejmowanie metod i właściwości z klasy bazowej, ale samo w sobie nie umożliwia dynamicznego wyboru metody w czasie działania programu. Przeciążenie (overloading) polega na definiowaniu wielu metod o tej samej nazwie, ale różnych parametrach, co nie jest równoznaczne z polimorfizmem. Hermetyzacja (encapsulation) koncentruje się na ukrywaniu szczegółów implementacyjnych i dostępie do danych tylko przez interfejs klasy, ale nie dotyczy mechanizmu wyboru metody w trakcie działania aplikacji.

Pytanie 33

Jakie jest wyjście działania kompilatora?

A. Plik źródłowy w języku o wyższym poziomie
B. Zestaw błędów występujących w kodzie
C. Plik maszynowy gotowy do uruchomienia
D. Kolekcja instrukcji w języku pośrednim
Plik maszynowy gotowy do uruchomienia jest wynikiem działania kompilatora. Po przekształceniu kodu źródłowego na język maszynowy tworzony jest plik binarny, który może być uruchomiony na komputerze bez konieczności ponownej kompilacji. Pliki te są szybkie i efektywne, ponieważ kod został wcześniej zoptymalizowany i przetworzony na instrukcje rozumiane przez procesor. Przykłady takich plików to .exe w systemie Windows lub pliki binarne w systemach Linux. Plik maszynowy to ostateczna forma programu, gotowa do dystrybucji i użytkowania.

Pytanie 34

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

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

Pytanie 35

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

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

Pytanie 36

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

$x = 5; $y = '5'; var_dump($x == $y); var_dump($x === $y);
A. bool(true) bool(false)
B. bool(false) bool(false)
C. bool(false) bool(true)
D. bool(true) bool(true)
Wyniki bool(false) bool(false), bool(true) bool(true) oraz bool(false) bool(true) mogą wydawać się zrozumiałe na pierwszy rzut oka, jednak każdy z tych przypadków zawiera istotne błędy w zrozumieniu mechanizmu porównania w PHP. Porównanie z użyciem operatora ==, który jest porównaniem luźnym, prowadzi do konwersji typów, co nie jest zawsze intuicyjne. Użytkownicy mogą mylnie przyjąć, że porównania opierające się na tym operatorze zawsze zwracają false, gdy zmienne mają różne typy, co jest błędne. W rzeczywistości, w przypadku wyrażenia $x == $y, gdzie $x to integer a $y to string, PHP przekształca zmienną stringową na typ integer przed porównaniem, co skutkuje wynikiem true. W konsekwencji, błędne odpowiedzi mogłyby wynikać z niepełnego zrozumienia działania operatora ===, który wymaga, by zarówno wartość, jak i typ były identyczne. Użytkownicy mogą mylić te dwa operatory i zakładać, że wynik będzie taki sam, niezależnie od typów zmiennych. Warto również zwrócić uwagę na to, jak ważne jest stosowanie operatora identyczności ===, który nie tylko porównuje wartości, ale także typy, co jest zgodne z dobrymi praktykami programowania w PHP. Dzięki temu unika się niejednoznaczności, co jest istotne w skomplikowanych aplikacjach. Wnioskując, kluczem do poprawnych wyników jest znajomość różnicy między porównaniami luźnymi a ścisłymi i świadome używanie odpowiednich operatorów, by unikać nieporozumień.

Pytanie 37

Która z wymienionych aplikacji stanowi przykład prostego rozwiązania mobilnego?

A. Aplikacja typu zegar
B. Aplikacja do analizy danych finansowych
C. Aplikacja do monitorowania użycia pamięci RAM
D. Aplikacja z rozbudowanym systemem zarządzania projektami
Aplikacja typu zegar to jeden z najprostszych przykładów aplikacji mobilnej. Jej podstawowa funkcjonalność polega na wyświetlaniu aktualnego czasu oraz alarmów, a dodatkowo może zawierać funkcje takie jak minutnik czy stoper. Tego rodzaju aplikacje charakteryzują się niewielką liczbą funkcji, przejrzystym interfejsem i minimalnym zapotrzebowaniem na zasoby sprzętowe. Dzięki swojej prostocie, aplikacje typu zegar są doskonałym przykładem na to, jak przy użyciu niewielkiej liczby komponentów można stworzyć przydatne narzędzie dla użytkownika.

Pytanie 38

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 39

Jakie operacje na plikach można uznać za podstawowe?

A. Jedynie otwieranie oraz zamykanie plików
B. Otwieranie, zapisywanie, odczytywanie, zamykanie
C. Usuwanie oraz tworzenie nowych plików
D. Zmiana rozszerzenia plików podczas działania programu
Podstawowe operacje na plikach obejmują otwieranie, zapisywanie, odczytywanie i zamykanie. Te cztery operacje są fundamentem zarządzania plikami w programowaniu i pozwalają na efektywne przechowywanie oraz przetwarzanie danych. Otwarcie pliku umożliwia dostęp do jego zawartości, zapis pozwala na modyfikację lub tworzenie nowych plików, odczyt umożliwia pobieranie danych, a zamknięcie pliku zapewnia integralność danych i zwalnia zasoby systemowe. W wielu językach, takich jak C++, Java czy Python, operacje te są realizowane za pomocą dedykowanych funkcji i klas, co ułatwia ich implementację w kodzie.

Pytanie 40

Który z przedstawionych poniżej przykładów ilustruje prawidłową deklarację zmiennej typu całkowitego w języku C++?

A. char liczba;
B. bool liczba;
C. float liczba;
D. int liczba;
W języku C++ zmienna typu całkowitego jest deklarowana za pomocą słowa kluczowego `int`. Przykładowa poprawna deklaracja to `int liczba;`, co oznacza, że `liczba` jest zmienną, która może przechowywać wartości całkowite, takie jak 1, 42 lub -15. Deklarowanie zmiennych w C++ pozwala na statyczne typowanie, co oznacza, że każda zmienna ma określony typ i nie może przechowywać wartości innego typu. Dzięki temu kod jest bardziej przejrzysty i mniej podatny na błędy związane z niezgodnością typów.