Wyniki egzaminu

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

Egzamin zdany!

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

Wymagane minimum: 20 punktów (50%)

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

Do zadań widoku w architekturze MVVM (Model-View-ViewModel) należy

A. zarządzanie logiką aplikacji - obejmuje wdrażanie algorytmów
B. przekazywanie danych do widoku oraz wymiana informacji z modelem
C. obsługa interakcji użytkownika, stworzenie UI
D. przechowywanie ściągniętych i przetworzonych informacji
Wiele osób myli zadania widoku w architekturze MVVM z innymi warstwami, przez co później pojawiają się spore problemy przy rozwijaniu i utrzymywaniu większych aplikacji. Przede wszystkim, widok nigdy nie powinien zarządzać logiką aplikacji ani implementować algorytmów – to zadanie Modelu lub ewentualnie ViewModelu. Przenoszenie takich odpowiedzialności do UI prowadzi do tzw. „smrodu kodu” i utrudnia refaktoryzację czy testowanie. Spotkałem się w praktyce z projektami, gdzie próbowano do widoku wrzucić obsługę serwisów, walidację czy sterowanie workflow – efektem był totalny chaos. Równie często pojawia się błędne przekonanie, że widok powinien przekazywać dane do widoku i wymieniać informacje z modelem – tymczasem w MVVM przepływ danych realizuje głównie ViewModel dzięki data bindingowi, a widok jest raczej pasywny i nie zarządza wymianą informacji bezpośrednio z modelem. To ViewModel łączy model z warstwą prezentacji, pozwalając na luźne powiązanie i wysoką elastyczność. Kolejna mylna koncepcja dotyczy przechowywania pobranych i przetworzonych informacji – tym zajmuje się Model, ewentualnie ViewModel, a nie widok. Wrzucając takie rzeczy do UI, łamiemy zasadę separacji odpowiedzialności. Moim zdaniem, warto zapamiętać, że długofalowy rozwój systemu, możliwość testowania oraz opcja łatwego podmieniania warstw bez ruszania całej reszty zależą właśnie od tego, jak precyzyjnie trzymamy się podziału ról. MVVM został zaprojektowany po to, żeby każda warstwa miała jasno określone zadania – i tylko wtedy architektura ma sens, jeśli się tego trzymamy. Odpowiedzialności widoku ograniczają się do prezentacji i obsługi interakcji użytkownika; wszystko, co wykracza poza to, powinno być delegowane do innych warstw. To pozwala na czysty kod i zgodność z najlepszymi praktykami programistycznymi.

Pytanie 2

Testy mające na celu identyfikację błędów w interfejsach między modułami bądź systemami nazywane są testami

A. wydajnościowymi
B. bezpieczeństwa
C. jednostkowymi
D. integracyjnymi
Testy integracyjne mają na celu wykrycie błędów w interfejsach i połączeniach między modułami lub systemami. Głównym celem tych testów jest sprawdzenie, czy różne komponenty aplikacji współpracują ze sobą zgodnie z oczekiwaniami. Testy integracyjne są przeprowadzane po testach jednostkowych, ale przed testami systemowymi. W praktyce testy te obejmują scenariusze, w których kilka modułów wymienia dane lub współdziała w ramach wspólnego procesu. Integracja jest kluczowa dla zapewnienia, że cały system działa jako spójna całość, co minimalizuje ryzyko błędów na etapie produkcji i poprawia jakość końcowego produktu. Przykładem może być test komunikacji między modułem autoryzacji użytkowników a modułem płatności w aplikacji e-commerce.

Pytanie 3

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

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

Pytanie 4

Jakie środowisko deweloperskie jest najczęściej wykorzystywane do budowy aplikacji na platformę Android?

A. Visual Studio
B. PyCharm
C. Android Studio
D. XCode
Android Studio to oficjalne środowisko programistyczne (IDE) do tworzenia aplikacji na system Android. Zostało opracowane przez Google i zapewnia pełne wsparcie dla języków takich jak Java, Kotlin oraz C++. Android Studio oferuje narzędzia do projektowania interfejsu użytkownika (UI), emulatory urządzeń, a także debugger i profiler, które pozwalają na testowanie i optymalizację aplikacji. IDE to jest zintegrowane z Android SDK, co ułatwia dostęp do API systemu Android oraz narzędzi takich jak ADB (Android Debug Bridge). Android Studio to kluczowe narzędzie dla deweloperów mobilnych, umożliwiające szybkie wdrażanie aplikacji na różne urządzenia oraz publikację w Google Play Store.

Pytanie 5

Jakie jest wyjście działania kompilatora?

A. Kolekcja instrukcji w języku pośrednim
B. Plik maszynowy gotowy do uruchomienia
C. Zestaw błędów występujących w kodzie
D. Plik źródłowy w języku o wyższym poziomie
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 6

Jakie są różnice między procesem kompilacji a interpretacją kodu?

A. Interpretacja umożliwia tworzenie bibliotek dynamicznych, a kompilacja bibliotek statycznych
B. Kompilacja wymaga użycia debuggera, natomiast interpretacja tego nie potrzebuje
C. Kompilacja jest stosowana jedynie w programowaniu obiektowym
D. Kompilacja przekształca cały kod źródłowy przed jego wykonaniem, podczas gdy interpretacja tłumaczy kod na bieżąco
Kompilacja i interpretacja to dwa różne sposoby, żeby uruchomić kod. Kiedy kompilujesz, to cały kod jest zamieniany na język maszynowy przed uruchomieniem programu, a na końcu dostajesz plik, który można odpalić. Z kolei w interpretacji, kod jest analizowany i wykonywany linia po linii „na żywo”. Kompilacja jest bardziej typowa dla języków takich jak C czy C++, a interpretacja jest popularna w językach skryptowych jak Python czy JavaScript. Kompilacja daje większą wydajność, ale musisz poczekać, aż cały kod się skompiluje, a interpretacja pozwala na szybkie testowanie i łatwiejsze znajdowanie błędów.

Pytanie 7

Który z języków programowania jest powszechnie stosowany do tworzenia interfejsów użytkownika przy użyciu XAML?

A. C++
B. Java
C. Objective-C
D. C#
C++ jest często używany do tworzenia aplikacji desktopowych, ale w przypadku interfejsów użytkownika XAML jest bardziej związany z C#. Java jest językiem wykorzystywanym głównie do tworzenia aplikacji na Androida oraz aplikacji webowych i backendowych, ale nie jest typowo używany do programowania interfejsów w XAML. Objective-C to starszy język programowania dla systemów Apple i nie jest związany z XAML, który jest specyficzny dla technologii Microsoftu.

Pytanie 8

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

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

Pytanie 9

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

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

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

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

Pytanie 10

Która z wymienionych właściwości odnosi się do klasy pochodnej?

A. Dziedziczy atrybuty i metody z klasy bazowej
B. Jest automatycznie usuwana po zakończeniu działania programu
C. Nie ma możliwości dodawania nowych metod
D. Nie może być zastosowana w strukturze dziedziczenia
Stwierdzenie, że klasa pochodna nie może dodawać nowych metod, jest błędne – klasy pochodne mogą dodawać nowe metody, które rozszerzają funkcjonalność klasy bazowej. Automatyczne usuwanie klasy po zakończeniu programu dotyczy obiektów klasy, a nie samej klasy – za usuwanie obiektów odpowiada destruktor. Klasa, która nie może być używana w hierarchii dziedziczenia, to klasa oznaczona jako 'final' (w C++) lub 'sealed' (w C#), ale standardowe klasy pochodne nie mają tego ograniczenia, chyba że zostanie to jawnie zadeklarowane.

Pytanie 11

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

A. Tablica przechowująca dane w formie par klucz-wartość
B. Tablica, która przechowuje wartości, do których można uzyskać dostęp tylko za pomocą indeksów numerycznych
C. Tablica, która przechowuje wyłącznie dane tekstowe
D. Tablica, która zmienia swoje wymiary w trakcie działania programu
A więc zwykła tablica działa na zasadzie numerów, nie ma kluczy tekstowych, więc nie ma mowy o parach klucz-wartość. Co prawda, tablice dynamiczne potrafią zmieniać rozmiar, ale mimo to, nie dadzą rady zorganizować danych w taki sposób. Tekst czy inne typy danych w tablicach są po prostu przechowywane jak inne. Kluczowa różnica jest taka, że tablice asocjacyjne pozwalają na użycie kluczy, co czyni je bardziej elastycznymi. Trochę się zgubiłeś w tym wszystkim.

Pytanie 12

Jakie jest główne zadanie kontrolera w architekturze MVC (Model-View-Controller)?

A. Zarządzanie sesją użytkownika
B. Przechowywanie danych aplikacji
C. Obsługa logiki biznesowej i przetwarzanie danych wejściowych od użytkownika
D. Prezentowanie danych użytkownikowi
W architekturze MVC każda z trzech warstw pełni ściśle określoną rolę. W przypadku odpowiedzi wskazującej, że kontroler przechowuje dane aplikacji, jest to błędne, ponieważ za przechowywanie i zarządzanie danymi odpowiada model. Model jest odpowiedzialny za dostęp do danych, ich walidację i przechowywanie, co pozwala na zachowanie integralności danych oraz izolację od pozostałych elementów architektury. Odpowiedź sugerująca, że kontroler prezentuje dane użytkownikowi, również jest niepoprawna. Za prezentację danych odpowiada warstwa widoku, która przekształca dane otrzymane z modelu w formę zrozumiałą dla użytkownika. Widok jest odpowiedzialny za interfejs użytkownika i sposób, w jaki dane są wyświetlane. Ostatnia z błędnych odpowiedzi sugeruje, że kontroler zarządza sesją użytkownika. Sesje zazwyczaj są zarządzane na poziomie aplikacji webowej poprzez mechanizmy takie jak cookies czy sesje serwerowe, często poza bezpośrednim zakresem kontrolera w MVC. Choć kontroler może odczytywać dane sesji, jego główna funkcja nie obejmuje bezpośredniego zarządzania nimi. Takie rozdzielenie obowiązków pozwala na większą modularność aplikacji i lepszą separację zadań, co jest kluczowe w efektywnym projektowaniu systemów informatycznych.

Pytanie 13

Która metoda wyszukiwania potrzebuje posortowanej listy do prawidłowego działania?

A. Wyszukiwanie z hashem
B. Wyszukiwanie binarne
C. Wyszukiwanie liniowe
D. Wyszukiwanie sekwencyjne
Wyszukiwanie liniowe (sekwencyjne) działa niezależnie od tego, czy tablica jest posortowana, ale ma złożoność O(n), co czyni je mniej efektywnym dla dużych zbiorów danych. Wyszukiwanie z hashem (hashing) nie wymaga posortowania tablicy, ponieważ działa na zasadzie mapowania kluczy do wartości i ma złożoność O(1) w najlepszym przypadku. Przeszukiwanie sekwencyjne (Linear Search) działa liniowo i nie wykorzystuje sortowania, co sprawia, że jest mniej wydajne dla dużych tablic.

Pytanie 14

Jaką nazwę elementu interfejsu należy wprowadzić w pierwszej linii kodu, na miejscu <??? aby został on wyświetlony w podany sposób?

<???
    android:layout_margin="50dp"
    android:switchMinWidth="60dp"
    android:text="Zgadzasz się?"
    android:textOff="NIE"
    android:testOn="TAK" />
Ilustracja do pytania
A. Switch
B. Spinner
C. SeekBar
D. RatingBar
W tym przykładzie można łatwo pomylić niektóre elementy interfejsu Androida, bo każdy z nich na pierwszy rzut oka wydaje się być jakimś rodzajem suwaka albo przełącznika. Jednak warto przyjrzeć się szczegółom. SeekBar służy do wyboru wartości w zakresie – najczęściej spotyka się go przy ustawianiu głośności czy jasności, posiada linię i przesuwany wskaźnik, ale nie ma opcji podpisania stanów typu „TAK” i „NIE”, więc zupełnie nie pasuje do binarnego wyboru. Spinner natomiast to coś jak rozwijana lista – pojawia się strzałka w dół i umożliwia wybór spośród wielu opcji, a nie przełączanie się tylko pomiędzy dwoma wartościami. RatingBar to już całkiem inna bajka – służy do oceniania, na przykład w postaci gwiazdek, i nie występuje tam przełącznik w prawo/lewo, więc nie da się uzyskać efektu widocznego na obrazku. Najczęstszym błędem przy takich pytaniach jest kierowanie się tylko nazwą komponentu – SeekBar kojarzy się z przesuwaniem, ale nie chodzi tu o zakres. Czasem też Spinner myli się z przełącznikiem, jeśli ktoś nie kojarzy dokładnej ikonki. Warto zawsze sprawdzać, jakie atrybuty dostępne są dla danego komponentu i w jakich scenariuszach zaleca się ich używanie zgodnie z dokumentacją Androida. Branżowe standardy mówią jasno: Switch stosujemy do prostych zmian stanu, a inne elementy dobieramy odpowiednio do liczby możliwych wyborów. Z mojego punktu widzenia, dobre osadzenie elementu interfejsu wynika z poznania ich przeznaczenia i typowych zastosowań – to naprawdę pomaga uniknąć takich pomyłek w przyszłości.

Pytanie 15

Jakie narzędzie służy do zarządzania wersjami?

A. Bugzilla
B. Trello
C. Git
D. Jira
Choć Trello, Jira i Bugzilla są bardzo przydatnymi narzędziami w pracy zespołowej, żadne z nich nie służy bezpośrednio do zarządzania wersjami kodu czy plików projektu. Trello skupia się przede wszystkim na organizacji zadań – to takie wirtualne tablice kanban, świetnie się sprawdzają przy planowaniu sprintów, ustalaniu priorytetów albo po prostu ogarnianiu, kto czym się zajmuje. Natomiast Jira, choć jest bardziej rozbudowana i używana masowo w środowiskach Agile czy Scrum, odpowiada głównie za zarządzanie projektami, śledzenie postępu prac, zgłaszanie błędów oraz planowanie wydań. Bugzilla z kolei to wyspecjalizowany system do rejestrowania i zarządzania błędami – kiedy pojawi się jakiś bug w aplikacji, wrzucasz go do Bugzilli, a potem śledzisz, kto, kiedy i jak go naprawił. I niby te narzędzia można zintegrować z systemami kontroli wersji, ale same z siebie nie przechowują historii zmian plików, nie pozwalają na cofanie się do wcześniejszych wersji czy łączenie różnych gałęzi kodu. Pomyłka w tym pytaniu często bierze się z tego, że ludzie mylą zarządzanie projektami albo błędami z zarządzaniem wersjami – a to są zupełnie inne dziedziny. W praktyce, jeśli chcesz mieć pełną kontrolę nad zmianami w kodzie, śledzić kto co zmienił i kiedy, i nie martwić się o przypadkowe utraty ważnych fragmentów – to tylko narzędzia takie jak Git zapewnią ci taki komfort. Reszta, choć ważna, nie rozwiązuje problemu wersjonowania plików w sensie technicznym.

Pytanie 16

Co to jest API w kontekście programowania?

A. System zarządzania relacyjnymi bazami danych
B. Interfejs programistyczny aplikacji, który definiuje sposób komunikacji między różnymi komponentami oprogramowania
C. Narzędzie do testowania interfejsu użytkownika aplikacji
D. Metoda kompresji danych w aplikacjach webowych
Pojęcie API jest często mylone z innymi aspektami programowania, co może prowadzić do nieporozumień. Narzędzia do testowania interfejsu użytkownika aplikacji, choć ważne, dotyczą zupełnie innej dziedziny niż API. Testowanie interfejsu użytkownika koncentruje się na ocenie, jak dobrze aplikacja działa z perspektywy użytkownika, a nie na tym, jak różne komponenty oprogramowania komunikują się ze sobą. Z kolei metoda kompresji danych w aplikacjach webowych odnosi się do technik optymalizacji przesyłanych informacji, ale nie ma nic wspólnego z definiowaniem komunikacji między systemami. Kompresja może poprawić wydajność aplikacji, ale nie wpływa na sposób, w jaki te aplikacje ze sobą współdziałają. Ponadto, systemy zarządzania relacyjnymi bazami danych (RDBMS) to narzędzia do przechowywania i zarządzania danymi, które mogą być wykorzystywane przez API, ale nie definiują, czym jest API. Często błędne podejście do zrozumienia API wynika z braku znajomości tego, jak różne technologie współdziałają w ekosystemie programistycznym. Kluczowe jest zrozumienie, że API jest narzędziem do ułatwienia komunikacji między różnymi aplikacjami, co jest fundamentem nowoczesnych architektur oprogramowania.

Pytanie 17

Jakie z wymienionych działań jest fundamentalne w modelu kaskadowym?

A. Iteracyjne wprowadzanie modyfikacji na każdym poziomie
B. Równoległe prowadzenie wielu etapów projektu
C. Zakończenie jednej fazy przed rozpoczęciem następnej
D. Przeprowadzanie testów systemu po zakończeniu każdej fazy
Kończenie jednej fazy przed rozpoczęciem kolejnej to kluczowa cecha modelu kaskadowego (Waterfall). W tym podejściu projekt jest realizowany etapami – analiza, projektowanie, implementacja, testowanie i wdrożenie – bez możliwości powrotu do poprzednich faz. Dzięki temu model Waterfall jest przejrzysty i łatwy do zarządzania, szczególnie w projektach o stabilnych wymaganiach. Jednak jego ograniczeniem jest brak elastyczności, co może prowadzić do problemów, jeśli wymagania zmienią się w trakcie trwania projektu.

Pytanie 18

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

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

Pytanie 19

Jednym z rodzajów testów funkcjonalnych, które można przeprowadzić na aplikacji webowej, jest ocena

A. bezpieczeństwa aplikacji
B. poprawności wyświetlanych elementów aplikacji
C. wydajności aplikacji
D. poziomu optymalizacji kodu aplikacji
Testy funkcjonalne w aplikacji webowej są super ważne, bo sprawdzają, czy wszystko działa jak należy. Mówiąc prościej, chodzi o to, żeby zobaczyć, czy wszystkie elementy na stronie są wyświetlane prawidłowo, jak przyciski i formularze. To też dotyczy tego, jak użytkownicy wchodzą w interakcję z różnymi częściami strony. Moim zdaniem, dobrze przeprowadzone testy mogą naprawdę poprawić doświadczenie użytkownika.

Pytanie 20

Na przedstawionym obrazie widać fragment emulacji systemu iOS z prostą aplikacją. Górna część ekranu nachodzi na pasek stanu baterii. Który z poniższych zapisów powinien zostać użyty w miejscu znaków zapytania, aby ustawić jedynie marginesy górne tylko dla systemu iOS?

Ilustracja do pytania
A. x:TypeArguments="Thickness"<br/> iOS= "0, 0, 0, 0"<br/> Android= "0, 20, 0, 0"<br/> WinPhone= "0, 0, 0, 0"
B. x:TypeArguments="Thickness" <br/> (0, 20, 0, 0)
C. x:TypeArguments="Thickness"<br/> iOS= 20
D. x:TypeArguments="Thickness"<br/> iOS= "0, 20, 0, 0"<br/> Android= "0, 0, 0, 0"<br/> WinPhone= "0, 0, 0, 0"
Odpowiedź czwarta jest prawidłowa, ponieważ prawidłowo wykorzystuje mechanizm OnPlatform w XAML do zastosowania specyficznych ustawień dla różnych platform. W przypadku iOS zastosowano margines górny wynoszący 20 jednostek, co jest konieczne, aby uwzględnić przestrzeń zajmowaną przez status bar systemowy. Takie podejście jest zgodne z dobrymi praktykami projektowania aplikacji wieloplatformowych, gdzie różne platformy mogą wymagać różnych ustawień interfejsu użytkownika. Przykładowo, w aplikacjach tworzonych przy użyciu Xamarin.Forms, korzystanie z OnPlatform pozwala na dynamiczne dostosowywanie interfejsu w zależności od platformy, co zwiększa elastyczność i poprawia doświadczenie użytkownika. Dodatkowo, zastosowanie marginesów tylko dla platformy iOS pozwala na zachowanie spójności i pełną kontrolę nad wyglądem aplikacji na innych platformach takich jak Android czy Windows Phone, gdzie takie dostosowanie nie jest konieczne. Uwzględnienie tych różnic jest kluczowe dla tworzenia aplikacji, które wyglądają i działają dobrze na wszystkich docelowych urządzeniach.

Pytanie 21

Do czego służy operator spread (...) w JavaScript?

A. Do rozwinięcia tablicy lub obiektu na poszczególne elementy
B. Do sprawdzania typu danych
C. Do konwersji liczby na string
D. Do łączenia dwóch różnych typów danych
Operator spread (...) w JavaScript jest niezwykle użytecznym narzędziem, które pozwala na łatwe rozwijanie tablic i obiektów do ich poszczególnych elementów lub właściwości. Umożliwia to na przykład przekazywanie elementów tablicy jako argumentów do funkcji lub łączenie wielu obiektów w jeden. Przykładowo, jeśli mamy tablicę `const arr = [1, 2, 3];` to używając operatora spread, możemy przekazać te elementy do funkcji tak: `Math.max(...arr)`, co zwróci 3. Dodatkowo, operator ten jest często używany przy tworzeniu nowych obiektów na podstawie istniejących. Na przykład, mając obiekt `const obj = { a: 1, b: 2 };`, możemy stworzyć nowy obiekt z dodatkową właściwością: `const newObj = { ...obj, c: 3 };` co da `newObj = { a: 1, b: 2, c: 3 };`. Operator spread jest zgodny z ES6 i stał się standardem w praktykach programistycznych, ułatwiając pisanie czystszych i bardziej elastycznych kodów. Warto go stosować, aby poprawić czytelność i efektywność swojego kodu.

Pytanie 22

Jaką właściwość ma sieć synchroniczna?

A. Gwarantuje większą elastyczność w przesyłaniu danych
B. Nie jest konieczna synchronizacja zegarów
C. Przekazywanie danych zachodzi w sposób niesystematyczny
D. Transmisja danych odbywa się w wyznaczonych interwałach czasowych
Sieć synchroniczna charakteryzuje się tym, że transmisja danych odbywa się w ustalonych odstępach czasu, co oznacza, że wszystkie urządzenia w sieci są zsynchronizowane do jednego zegara. Taki sposób przesyłania danych pozwala na precyzyjne określenie momentu, w którym dane są wysyłane i odbierane, co redukuje opóźnienia i błędy w komunikacji. Przykładem sieci synchronicznej jest system TDM (Time Division Multiplexing), który dzieli czas na różne sloty, przydzielając każdy slot konkretnemu użytkownikowi lub urządzeniu. Dzięki temu każdy uczestnik sieci ma gwarancję, że w swoim czasie dostanie dostęp do medium transmisyjnego. Standardy takie jak SONET (Synchronous Optical Network) i SDH (Synchronous Digital Hierarchy) są przykładami technologii, które wykorzystują synchronizację do efektywnego przesyłania danych na dużych odległościach. Takie podejście jest powszechnie stosowane w telekomunikacji, gdzie wysoka wydajność i niezawodność transmisji są kluczowe dla jakości usług.

Pytanie 23

Jaką strukturę danych można zrealizować, korzystając jedynie z wymienionych metod?

push(arg) – dodaje element
pop() – usuwa ostatnio dodany element
peek() – zwraca ostatnio dodany element bez usuwania
isEmpty() – sprawdza czy istnieją dane w strukturze
A. kolejka FIFO
B. drzewo binarne
C. tablica
D. stos
Zestaw metod przedstawionych w pytaniu – czyli push, pop, peek oraz isEmpty – jednoznacznie wskazuje na strukturę danych zwaną stos (stack). To jest taki bardzo charakterystyczny „magazyn”, gdzie zawsze mamy do czynienia z zasadą LIFO, czyli Last In, First Out. Oznacza to, że ostatni element, który dodaliśmy metodą push, będzie tym pierwszym, który usuniemy przez pop. Peek natomiast pozwala tylko podejrzeć, co jest na górze stosu, ale niczego nie usuwa. isEmpty z kolei daje nam szybki sposób sprawdzenia, czy na stosie w ogóle coś jeszcze zostało. W praktyce, stosy są niezbędne w wielu algorytmach i strukturach programistycznych – na przykład podczas wywołań rekurencyjnych funkcji (sam system operacyjny używa stosu do obsługi wywołań procedur), przy obsłudze nawiasów w kompilatorach czy podczas implementacji algorytmu DFS (Depth-First Search) w grafach. Moim zdaniem, nawet jeśli na początku wydaje się, że stos nie jest tak „potężny” jak inne struktury, to jego prostota jest właśnie największym atutem i dlatego jest tak często wykorzystywany w praktyce. Branżowe standardy, na przykład w językach takich jak Java czy C#, bezpośrednio udostępniają gotowe klasy Stack, które właśnie implementują dokładnie te metody – to pokazuje, jak fundamentalna jest ta struktura. Pewnie warto też pamiętać, że stosy mają swoje ograniczenia (np. nie nadadzą się do kolejkowania zadań), ale tam gdzie trzeba działać LIFO, są niezastąpione.

Pytanie 24

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

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

Pytanie 25

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. 1
B. 5
C. 7
D. 0
W sytuacjach gdy analizujemy dostęp do elementów tablicy w języku Java istotne jest zrozumienie jak działają indeksy tablicowe. Tablica o długości n posiada indeksy od 0 do n-1. W tym kontekście tablica liczby ma sześć elementów co oznacza że poprawne indeksy to 0 do 5. Wyjątkowa sytuacja jak ArrayIndexOutOfBoundsException pojawia się gdy próbujemy uzyskać dostęp do indeksu większego niż największy dostępny indeks lub mniejszego niż zero. W przypadku indeksu 0 lub 1 dostęp jest poprawny i nie spowoduje wyjątku ponieważ te indeksy mieszczą się w zakresie długości tablicy. Częsty błąd myślowy polega na myleniu długości tablicy z maksymalnym indeksem co jest przyczyną błędów logicznych w programach. Podobnie indeks 5 jest również poprawny ponieważ odnosi się do ostatniego elementu tablicy o długości sześciu elementów. Aby unikać takich błędów ważne jest nie tylko znać teorię ale również stosować ją w praktyce. Regularne pisanie testów jednostkowych oraz walidacja danych wejściowych mogą pomóc w minimalizacji ryzyka wystąpienia takich wyjątków w aplikacjach komercyjnych. Stosowanie dobrej obsługi wyjątków i odpowiedni debugging są kluczowe w procesie tworzenia oprogramowania zwłaszcza w dużych projektach gdzie stabilność i niezawodność aplikacji są priorytetowe dla użytkowników końcowych.

Pytanie 26

Co to jest ORM w kontekście programowania?

A. Operational Reliability Management - zarządzanie niezawodnością operacyjną systemów
B. Output Rendering Module - moduł renderujący dane wyjściowe w aplikacjach
C. Object-Relational Mapping - technika konwersji danych między systemami typów w relacyjnych bazach danych
D. Organized Resource Model - model organizacji zasobów w aplikacjach webowych
Object-Relational Mapping (ORM) to technika programistyczna, która pozwala na konwersję danych pomiędzy obiektami w programowaniu obiektowym a relacyjnymi bazami danych. Dzięki ORM, programiści mogą operować na danych w sposób bardziej naturalny, wykorzystując obiekty i ich właściwości zamiast skomplikowanych zapytań SQL. Przykłady popularnych frameworków ORM to Hibernate dla Javy, Entity Framework dla .NET oraz Django ORM dla Pythona. Te narzędzia upraszczają komunikację z bazą danych, co zwiększa wydajność i ułatwia zarządzanie kodem. Dzięki zastosowaniu ORM, programiści mogą również łatwiej stosować zasady programowania obiektowego oraz wzorce projektowe, co prowadzi do lepszej organizacji kodu i jego łatwiejszej konserwacji. Wspierają one również migracje schematów bazy danych oraz zarządzanie relacjami między obiektami, co jest istotne w kontekście złożonych aplikacji webowych i systemów informatycznych.

Pytanie 27

Jakie jest rozwiązanie dla dodawania binarnego liczb 1011 oraz 110?

A. 10001
B. 11101
C. 11001
D. 10101
W analizie błędnych odpowiedzi, pierwsza niepoprawna odpowiedź 11001 wynika z błędu w dodawaniu ostatniej kolumny. Osoba, która udzieliła tej odpowiedzi, mogła popełnić pomyłkę, nie uwzględniając przeniesienia z drugiej kolumny. W systemie binarnym nie można uzyskać wyniku 11001, ponieważ suma 0 + 1 w ostatnich kolumnach prowadzi do przeniesienia, a nie do dodania wartości. Druga propozycja, 10101, może być efektem pomylenia wartości i przeniesień w trakcie dodawania. Wartości w odpowiednich kolumnach są zinterpretowane niepoprawnie. Tutaj również brakuje uwzględnienia przeniesienia, co prowadzi do wyniku, który nie odzwierciedla rzeczywistego sumowania w systemie binarnym. Ostatnia niepoprawna odpowiedź, 11101, zawiera błąd związany z dodawaniem wartości bez przeniesienia. Sumowanie 1 + 1 w drugiej kolumnie prowadzi do 0 z przeniesieniem, co zostało pominięte. W każdej z tych odpowiedzi występuje zrozumienie błędów w arytmetyce binarnej, które są fundamentalne dla prawidłowego obliczania w systemach cyfrowych.

Pytanie 28

Które narzędzie służy do tworzenia makiet interfejsu użytkownika (UI mockups)?

A. Figma
B. Jenkins
C. Postman
D. Webpack
Jenkins, Postman i Webpack to narzędzia o zupełnie innym przeznaczeniu, co prowadzi do mylnych wniosków na temat ich zastosowań w kontekście tworzenia makiet interfejsu użytkownika. Jenkins jest narzędziem do ciągłej integracji i dostarczania oprogramowania, które automatyzuje procesy budowania, testowania i wdrażania aplikacji. Jego rolą jest wspieranie deweloperów w efektywnym zarządzaniu kodem źródłowym i zapewnieniu, że każda zmiana wprowadzona w kodzie nie wprowadza błędów. Z kolei Postman to narzędzie przeznaczone do testowania API, które umożliwia wysyłanie zapytań, analizowanie odpowiedzi oraz dokumentowanie interfejsów API, co jest kluczowe w kontekście integracji usług, ale nie ma związku z tworzeniem wizualnych makiet UI. Webpack jest narzędziem do bundlowania modułów JavaScript i zasobów, umożliwiającym optymalizację aplikacji webowych. Jego głównym celem jest zarządzanie złożonością aplikacji front-end, co jest istotne, ale nie ma zastosowania w kontekście projektowania interfejsów użytkownika. Typowym błędem myślowym jest mylenie narzędzi do prototypowania z narzędziami do zarządzania procesem wytwarzania oprogramowania. Zrozumienie, jakie narzędzia są odpowiednie do konkretnych zadań, jest kluczowe dla efektywnej pracy w zespole projektowym.

Pytanie 29

Jakie są korzyści z wykorzystania struktur danych typu mapa (np. HashMap w Javie) w kontekście tworzenia zbiorów danych?

A. Gdyż nie potrzebują znajomości wielkości danych przed kompilacją
B. Bo pozwalają na sortowanie danych bez dodatkowych działań
C. Z powodu szybkiego uzyskiwania dostępu do elementów przy użyciu klucza
D. Ponieważ struktury danych typu mapa zajmują mniej pamięci niż tablice
Tablice faktycznie zajmują mniej pamięci, ale nie mają takiego sposobu dostępu do danych jak mapa, bo korzystamy z indeksów. Mapa nie jest od tego, żeby sortować dane, chociaż da się to jakoś obejść, na przykład z TreeMap. Jest też taka kwestia, że jeśli nie znamy rozmiaru danych przed kompilacją, to to jest typowe dla list i wektorów, a mapa w sumie się w tym nie sprawdzi. No i HashMap działa na zasadzie dynamicznej alokacji, więc sama się powiększa, gdy dodajemy nowe elementy.

Pytanie 30

Co to jest Webpack?

A. Framework JavaScript do tworzenia aplikacji mobilnych
B. System zarządzania bazami danych dla aplikacji Node.js
C. Biblioteka do testowania kodu JavaScript
D. Narzędzie do budowania modułów i zarządzania zależnościami w aplikacjach JavaScript
Webpack to zaawansowane narzędzie do budowania modułów, które znacząco ułatwia zarządzanie zależnościami w aplikacjach JavaScript. Umożliwia on zorganizowane łączenie różnych zasobów, takich jak skrypty JavaScript, style CSS, obrazy i inne pliki, w jeden lub kilka plików wyjściowych. Dzięki temu programiści mogą zoptymalizować czas ładowania aplikacji, minimalizując rozmiar plików i eliminując zbędne zapytania do serwera. Przykładowo, korzystając z Webpacka, można skonfigurować automatyczną kompresję kodu i zastosowanie technik takich jak kod dzielony (code splitting), co znacząco podnosi wydajność aplikacji. Dodatkowo, Webpack wspiera różne wtyczki i loadery, co pozwala na łatwą integrację z narzędziami do kompilacji, takimi jak Babel, umożliwiający użycie nowoczesnych funkcji JavaScript, które mogą nie być jeszcze wspierane przez wszystkie przeglądarki. Standardy branżowe kładą duży nacisk na efektywność i utrzymywalność kodu, a Webpack, będąc częścią ekosystemu JavaScript, skutecznie wspiera te zasady.

Pytanie 31

Zapisany fragment w Pythonie ilustruje:

pierwiastki = {"N":"Azot","O":"Tlen","P":"Fosfor","Si":"Siarka"}
A. strukturę danych
B. tablicę asocjacyjną (słownik)
C. kolejkę (LIFO)
D. stos
W tym pytaniu chodziło o rozpoznanie tablicy asocjacyjnej (czyli słownika) w języku Python. Taka struktura danych pozwala bardzo szybko przypisywać wartości do kluczy i potem je równie sprawnie odnajdywać, co jest superpraktyczne w codziennych zadaniach programistycznych. Taki słownik, jak w przykładzie, gdzie symbole pierwiastków są kluczami, a ich polskie nazwy wartościami, pokazuje typowe zastosowanie tej struktury do przechowywania powiązanych danych bez konieczności przeszukiwania całej listy po kolei. Moim zdaniem słowniki to w ogóle jeden z najwygodniejszych wynalazków Pythona – nie musisz się martwić o kolejność, wystarczy znać klucz i już masz wartość. W branży wykorzystuje się słowniki na potęgę: do mapowania konfiguracji, przechowywania danych z plików JSON, czy nawet jako szybki cache. Warto dodać, że słowniki w Pythonie od wersji 3.7 zachowują kolejność dodania elementów, co czasem pomaga w czytelności kodu, chociaż to raczej miły „bonus” niż must-have. W kontekście dobrych praktyk zawodowych zawsze pilnuję, żeby klucze były niezmiennikami (np. stringi czy liczby), bo tego wymaga Python, a wartości mogą być dowolne. Jeżeli ktoś planuje automatyzować jakieś procesy lub pracować z danymi, bez słowników się nie obejdzie. To trochę taki niepozorny, a bardzo potężny „narzędzie” w arsenale każdego programisty.

Pytanie 32

W systemie RGB kolor Pale Green przedstawia się jako RGB(152, 251, 152). Jaki jest szesnastkowy kod tego koloru?

A. AO FE AO
B. 98FB98
C. 98 FE98
D. AO FB AO
Analizując odpowiedzi, które nie są poprawne, można zauważyć, że każda z nich zawiera błędy związane z konwersją wartości RGB do formatu szesnastkowego lub z nieprawidłowym układem cyfr. Przykładowo, pierwsza odpowiedź AO FB AO nie jest zgodna z formatem szesnastkowym, ponieważ zawiera litery, które nie odpowiadają wartościom RGB (0-255). Odpowiedź ta nie jest skonstruowana z poprawnych grup heksadecymalnych. Kolejna odpowiedź, 98 FE98, pomimo że wykorzystuje poprawne wartości, nie odpowiada pełnej reprezentacji koloru, ponieważ brakuje w niej wartości niebieskiej, co prowadzi do niepełnej i błędnej reprezentacji kolorystycznej. Trzecia odpowiedź AO FE AO również błądzi w tej samej kwestii, co pierwsza, wskazując na komponenty, które nie istnieją w dozwolonym zakresie dla kolorów RGB. W kontekście projektowania i standardów webowych, takie błędy mogą prowadzić do nieprawidłowego wyświetlania kolorów w różnych przeglądarkach oraz na różnych urządzeniach. Dlatego tak istotne jest, aby przy konwersji kolorów zachować poprawność techniczną oraz używać odpowiednich wartości w formacie szesnastkowym.

Pytanie 33

Który z wymienionych składników jest charakterystyczny dla środowiska IDE przeznaczonego do tworzenia aplikacji mobilnych?

A. Edytor tekstowy, przeglądarka internetowa, system kontroli wersji
B. Kompilator, debugger, emulator urządzenia mobilnego
C. Edytor graficzny, narzędzia analityczne, klient FTP
D. Narzędzia do analizy danych, serwer webowy, przeglądarka internetowa
Kompilator, debugger i emulator urządzenia mobilnego to podstawowe narzędzia w każdym środowisku IDE przeznaczonym do tworzenia aplikacji mobilnych. Kompilator jest odpowiedzialny za przekształcenie kodu źródłowego na plik wykonywalny, co pozwala na uruchomienie aplikacji na urządzeniu. Debugger umożliwia wykrywanie i eliminowanie błędów, co jest kluczowe dla prawidłowego działania aplikacji. Emulator pozwala na symulowanie działania aplikacji na różnych urządzeniach i systemach, co ułatwia testowanie bez potrzeby fizycznego dostępu do wielu modeli telefonów czy tabletów. Taki zestaw narzędzi jest standardem w Android Studio, XCode oraz Visual Studio, co umożliwia pełen cykl tworzenia aplikacji mobilnych – od kodowania, przez testowanie, aż po wdrażanie.

Pytanie 34

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

A. Mata antypoślizgowa
B. Panele akustyczne wygłuszające
C. Lampy biurowe o niskim poziomie natężenia światła
D. Okna zamknięte
Maty antypoślizgowe służą do zwiększenia bezpieczeństwa na śliskich powierzchniach, ale nie wpływają na poziom hałasu w miejscu pracy. Zamknięcie okien może ograniczyć hałas z zewnątrz, ale nie jest wystarczającą metodą wygłuszania hałasu generowanego wewnątrz biura. Lampy biurowe o niskim natężeniu światła wpływają na jakość oświetlenia, co poprawia komfort pracy wzrokowej, ale nie mają żadnego związku z redukcją hałasu. Właściwe wygłuszenie wymaga specjalnych materiałów i technologii, takich jak panele akustyczne lub ścianki dźwiękochłonne.

Pytanie 35

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

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

Pytanie 36

Jaki typ testów ocenia funkcjonalność aplikacji z punktu widzenia użytkownika końcowego?

A. Testy zgodności
B. Testy obciążeniowe
C. Testy użyteczności
D. Testy funkcjonalne
Testy obciążeniowe skupiają się na sprawdzaniu, jak aplikacja działa pod dużym ruchem lub obciążeniem, co pozwala ocenić jej wydajność, ale nie dotyczy to bezpośrednio doświadczeń użytkownika. Testy funkcjonalne mają na celu sprawdzenie, czy poszczególne funkcje aplikacji działają zgodnie z założeniami, ale nie badają wygody użytkowania. Testy zgodności natomiast weryfikują, czy aplikacja spełnia określone normy i standardy, co ma niewiele wspólnego z oceną użyteczności aplikacji przez użytkownika końcowego.

Pytanie 37

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

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

Pytanie 38

Jaką wartość będzie miała zmienna result po wykonaniu poniższego kodu PHP?

$array = [5, 1, 8, 3, 7];
$result = 0;
foreach ($array as $value) {
  if ($value > $result) {
    $result = $value;
  }
}
A. 8
B. 24
C. 7
D. 5
Wartości 24, 5 oraz 7 nie są poprawne w kontekście działania podanego kodu PHP. Gdy spojrzymy na odpowiedź 24, zauważymy, że nie ma takiej wartości w tablicy $array, która wynosi 5, 1, 8, 3 ani 7. Zatem, próbując uzyskać taką wartość z operacji na tych liczbach, prowadzi do złych wniosków. Możliwe, że błąd wynikał z niewłaściwego zrozumienia, czym jest proces iteracji w tablicy oraz jak działa przypisanie wartości. W przypadku wartości 5, można pomyśleć, że jest to największa liczba w tablicy, ponieważ jest to pierwsza liczba, która jest porównywana z wartością początkową zmiennej $result. Jednak nie uwzględnia ona kolejnych iteracji, które dostarczają większe wartości. Wartość 7, chociaż jest większa od 5, również nie jest największa, ponieważ istnieje jeszcze większa liczba - 8. W przypadku programowania, kluczowe jest zrozumienie, że pętla foreach nie tylko przegląda elementy, ale także pozwala na dynamiczne aktualizowanie zmiennej w zależności od warunku. Niezrozumienie tego aspektu może prowadzić do błędnych odpowiedzi, jak w tym przypadku, gdzie nie tylko nie dostrzegamy maksymalnej wartości, ale także nie rozumiemy poprawnych operacji na zmiennych. W programowaniu ważne jest, aby nie tylko znać składnię, ale także rozumieć logikę stojącą za danym algorytmem.

Pytanie 39

Jakie aspekty powinny być brane pod uwagę przy tworzeniu struktury danych dla aplikacji?

A. Tylko wymagania sprzętowe
B. Złożoność obróbki danych oraz ich efektywną organizację
C. Tylko typ języka programowania
D. Nie ma związku pomiędzy strukturą danych a efektywnością aplikacji
Złożoność przetwarzania danych i ich optymalna organizacja to kluczowe elementy podczas projektowania struktury danych dla aplikacji. Dobrze zaprojektowana struktura danych wpływa na wydajność aplikacji, redukuje czas dostępu do informacji oraz minimalizuje zużycie zasobów. Optymalizacja algorytmów oraz wybór odpowiednich struktur danych, takich jak listy, drzewa czy tablice hashujące, ma bezpośredni wpływ na szybkość działania aplikacji.

Pytanie 40

Jakie z wymienionych czynności można zrealizować przy pomocy składnika statycznego danej klasy?

A. Wywołanie destruktora klasy bez jej usuwania
B. Umożliwienie dzielenia pól klasy pomiędzy zaprzyjaźnione klasy
C. Zachowanie wartości wspólnych dla wszystkich instancji klasy
D. Tworzenie prywatnych kopii pól dla każdej instancji
Składnik statyczny klasy przechowuje wartości wspólne dla wszystkich instancji danej klasy. Oznacza to, że niezależnie od liczby utworzonych obiektów, istnieje tylko jedna kopia składowej statycznej, która jest współdzielona przez wszystkie instancje. Składowe statyczne są często wykorzystywane do przechowywania liczników, stałych wartości lub danych konfiguracyjnych. Metody statyczne mogą być wywoływane bezpośrednio na klasie, bez konieczności tworzenia obiektu, co czyni je niezwykle użytecznymi w przypadku funkcji narzędziowych.