Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
Rozpoczęcie: 7 czerwca 2026 22:14
Zakończenie: 7 czerwca 2026 22:31
Egzamin zdany!
Wynik: 26/40 punktów (65,0%)
Wymagane minimum: 20 punktów (50%)
Twój wynik na tle innych
Twój wynik jest lepszy niż 30% podejść do kwalifikacji INF.04.
Porównanie z 22431 zakończonymi podejściami do tej kwalifikacji (dane zbiorcze, bez wyników indywidualnych).
Zachowaj ten wynik na koncie
Załóż darmowe konto albo zaloguj się - ten egzamin przypiszemy do Twojego konta, więc wrócisz do swoich błędów, będziesz śledzić postęp i dostaniesz powtórki dobrane do Twoich odpowiedzi.
Przykład wywołania funkcji zamien w języku C++ może wyglądać w następujący sposób:
voidzamien(int *a, int *b) {inttmp;tmp= *a;
*a= *b;
*b=tmp;}
A. zamien(12, 34)
B. zamien(*a, *b); // a, b - zmienne całkowite
C. zamien(&a, &b); // a, b - zmienne całkowite
D. zamien(m, n); // m, n - zmienne całkowite
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 2
Jaką cechą odznacza się framework w porównaniu do biblioteki?
A. Framework stanowi zbiór funkcji, które programista ma możliwość wykorzystania
B. Framework zapewnia API do szerszego zestawu funkcji
C. Framework określa strukturę aplikacji i zapewnia jej fundament
D. Framework oferuje funkcje użyteczne w konkretnej dziedzinie problemu
Biblioteka to zestaw funkcji i klas, które programista może wykorzystywać według własnego uznania, ale to on decyduje o strukturze aplikacji. API dostarcza zestaw metod do komunikacji z innymi aplikacjami, ale nie narzuca architektury. Framework to coś więcej niż zbiór funkcji – określa cały proces tworzenia aplikacji, czego nie można powiedzieć o zwykłej bibliotece lub narzędziach użytkowych.
Pytanie 3
Które z wymienionych atrybutów klasy mogą być dostępne wyłącznie w obrębie tej klasy oraz jej klas potomnych?
A. Private
B. Static
C. Protected
D. Public
Modyfikator `protected` pozwala na dostęp do pól i metod klasy w ramach tej samej klasy oraz w klasach dziedziczących. Jest to pośredni poziom dostępu między `private` i `public`. Pola `protected` są ukryte przed innymi klasami spoza hierarchii dziedziczenia, ale pozostają dostępne w klasach pochodnych. Dzięki temu dziedziczenie staje się bardziej elastyczne, umożliwiając klasom potomnym korzystanie z chronionych elementów klasy bazowej. Przykład w C++: `class Pojazd { protected: int predkosc; }`. Klasy dziedziczące po `Pojazd` mogą używać `predkosc`, ale obiekty nie mają bezpośredniego dostępu do tego pola.
Pytanie 4
Co zostanie wyświetlone po wykonaniu poniższego kodu w języku Python?
W kodzie Python, który analizujemy, użyto funkcji map i filter, które są często stosowane w programowaniu funkcyjnym. W pierwszej części, funkcja filter filtruje elementy z listy 'data', zwracając tylko te, które są liczbami parzystymi. W tym przypadku, z listy [1, 2, 3, 4, 5] zostaną wybrane liczby 2 i 4. Następnie, funkcja map mnoży te liczby przez 2. Dla liczby 2 otrzymujemy 4, a dla liczby 4 – 8. Dlatego wynik końcowy to lista [4, 8]. W praktyce, znajomość takich konstrukcji pozwala na efektywne przetwarzanie danych i implementację bardziej złożonych algorytmów w codziennych zastosowaniach programistycznych. Korzystając z filtracji i mapowania można na przykład szybko przetwarzać dane wejściowe w aplikacjach webowych lub analizować duże zestawy danych. Ważne jest, aby pamiętać, że te techniki są bardzo przydatne w kontekście pracy z danymi i powinny być uzupełnione o umiejętność czytania i rozumienia kodu, co jest kluczowe w praktyce programistycznej.
Pytanie 5
Jaką nazwę elementu interfejsu należy wprowadzić w pierwszej linii kodu, na miejscu <??? aby został on wyświetlony w podany sposób?
Switch to bardzo charakterystyczny element interfejsu Androida, który służy do przełączania między dwoma stanami, np. włącz/wyłącz, tak/nie. Na screenie wyraźnie widać typowy suwak z okrągłym przyciskiem, który przemieszcza się na boki – dokładnie tak działa Switch. W kodzie XML także pojawiają się atrybuty takie jak text, textOff, textOn – one są właściwe właśnie dla komponentu Switch, bo pozwalają podpisać każdy ze stanów na przełączniku. Praktycznie w każdej nowoczesnej aplikacji spotyka się Switcha do wyrażania zgody, akceptacji regulaminu albo przełączania opcji (np. tryb ciemny). Z mojego doświadczenia to jest dużo wygodniejsze dla użytkownika niż klasyczne checkboxy, bo od razu widać, który stan jest aktywny – a UX-owcy też bardzo to chwalą. Warto pamiętać, że Switch ma swoje domyślne style zgodne z Material Design, więc aplikacja wygląda nowocześnie bez dodatkowej pracy. Dobrą praktyką jest wykorzystywanie Switcha właśnie wtedy, gdy potrzebujemy zmiany binarnej, a nie kilku opcji do wyboru. Jeśli ktoś myśli o bardziej zaawansowanych interfejsach, to Switch pozwala łatwo reagować na zmianę stanu w kodzie Java/Kotlin poprzez listener OnCheckedChangeListener. No i jest to jeden z tych komponentów, które naprawdę warto znać, bo są podstawą w każdym projekcie mobilnym.
Pytanie 6
Jakie metody pozwalają na przesłanie danych z serwera do aplikacji front-end?
A. formatu JSON
B. protokołu SSH
C. metody POST
D. biblioteki jQuery
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 7
Jaką rolę pełni element statyczny w klasie?
A. Ogranicza dostęp do metod publicznych w klasie
B. Automatycznie likwiduje obiekty klasy po zakończeniu działania programu
C. Zachowuje wspólną wartość dla wszystkich instancji tej klasy
D. Pozwala na dynamiczne dodawanie nowych metod
Składnik statyczny klasy przechowuje wartości współdzielone przez wszystkie obiekty tej klasy. Jest to jedno z najbardziej efektywnych narzędzi w programowaniu obiektowym, pozwalające na ograniczenie zużycia pamięci oraz zapewnienie spójności danych. Główna rola składnika statycznego polega na utrzymaniu jednej kopii zmiennej lub metody, która jest dostępna niezależnie od liczby instancji klasy. To oznacza, że zmiana wartości składowej statycznej jest natychmiast widoczna dla wszystkich obiektów klasy. Przykładem jest licznik instancji klasy lub konfiguracja globalna aplikacji, gdzie statyczność pozwala na scentralizowanie danych i ich jednolite zarządzanie.
Pytanie 8
Która z wymienionych właściwości odnosi się do klasy pochodnej?
A. Nie może być zastosowana w strukturze dziedziczenia
B. Nie ma możliwości dodawania nowych metod
C. Dziedziczy atrybuty i metody z klasy bazowej
D. Jest automatycznie usuwana po zakończeniu działania programu
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 9
Która z poniższych metod tablicowych w JavaScript nie modyfikuje oryginalnej tablicy?
A. map()
B. splice()
C. sort()
D. push()
Metoda map() w JavaScript jest funkcją tablicową, która tworzy nową tablicę na podstawie wyników wywołania funkcji podanej jako argument dla każdego elementu oryginalnej tablicy. Kluczowym aspektem tej metody jest to, że nie modyfikuje oryginalnej tablicy, co czyni ją bezpiecznym narzędziem do transformacji danych. Zastosowanie map() jest szczególnie przydatne w sytuacjach, gdy chcemy przekształcić dane, ale zachować oryginał, na przykład w przypadku przetwarzania wyników z API lub operacji na danych wejściowych od użytkownika. Standardowe praktyki zalecają używanie map() w programowaniu funkcyjnym, co pozwala na bardziej deklaratywne podejście do manipulacji danymi. Przykład zastosowania: mając tablicę liczb, możemy użyć map() do stworzenia nowej tablicy, która zawiera tylko ich kwadraty: const numbers = [1, 2, 3]; const squares = numbers.map(num => num * num); W ten sposób oryginalna tablica numbers pozostaje nietknięta, co jest kluczowe w wielu aplikacjach, w których zachowanie stanu jest istotne.
Pytanie 10
Co to jest dependency injection w programowaniu?
A. Metoda optymalizacji zapytań do bazy danych
B. Proces kompilacji kodu źródłowego do kodu maszynowego
C. Metoda projektowania interfejsu użytkownika
D. Technika, w której obiekt otrzymuje inne obiekty, od których zależy
Dependency injection (DI) to technika programowania, która polega na dostarczaniu obiektom ich zależności z zewnątrz, zamiast tworzenia ich samodzielnie wewnątrz klasy. Dzięki temu kod staje się bardziej modularny, łatwiejszy do testowania i utrzymania. Przykładem zastosowania DI jest framework Spring w języku Java, który umożliwia zarządzanie zależnościami za pomocą kontenerów IoC (Inversion of Control). Korzyści płynące z używania DI obejmują zwiększenie elastyczności oraz ułatwienie wprowadzania zmian w kodzie, ponieważ zmiany w jednej klasie nie wymagają modyfikacji innych. DI wspiera zasady SOLID, szczególnie zasadę odwrócenia zależności (Dependency Inversion Principle), co prowadzi do bardziej przejrzystego i zrozumiałego kodu. W praktyce, implementacja DI może odbywać się za pomocą konstruktorów, setterów lub interfejsów, co daje programiście wybór w doborze najodpowiedniejszej metody dla danego projektu.
Pytanie 11
W jakich sytuacjach zastosowanie rekurencji może być bardziej korzystne niż użycie iteracji?
A. Gdy kod źródłowy ma być zoptymalizowany dla starszych kompilatorów
B. Kiedy liczba iteracji przewyższa maksymalny zakres zmiennej licznikowej
C. Gdy algorytm wymaga naturalnego podziału na mniejsze podproblemy
D. Kiedy program jest uruchamiany w środowisku wielowątkowym
Rekurencja jest bardziej efektywna od iteracji, gdy algorytm można naturalnie podzielić na mniejsze podproblemy. Przykładami są algorytmy podziału i zwycięzcy (divide and conquer), takie jak wyszukiwanie binarne, sortowanie szybkie (quick sort) czy obliczanie wartości liczb Fibonacciego. Rekurencja pozwala na bardziej eleganckie i przejrzyste rozwiązanie problemów, które mają strukturę rekurencyjną. W takich przypadkach kod jest krótszy i bardziej czytelny, co ułatwia jego konserwację i rozwój.
Pytanie 12
Który z wymienionych elementów może stanowić część menu w aplikacji desktopowej?
A. CheckBox
B. ScrollBar
C. MenuItem
D. Canvas
CheckBox to komponent, który umożliwia wybór jednej lub wielu opcji, ale nie jest częścią systemu menu – zwykle znajduje się w formularzach lub ustawieniach aplikacji. ScrollBar to element interfejsu umożliwiający przewijanie treści w oknie aplikacji, ale nie jest elementem menu. Canvas to kontener do rysowania elementów graficznych i obiektów, ale nie pełni funkcji w kontekście tworzenia menu aplikacji desktopowych.
Pytanie 13
Jakie elementy powinny być uwzględnione w dokumentacji testowej aplikacji?
A. Specyfikacje techniczne serwera
B. Harmonogram wdrożenia aplikacji
C. Opis procedur testowych oraz rezultaty wykonanych testów
D. Zalecenia dotyczące optymalizacji kodu
Opis procedur testowych i wyników przeprowadzonych testów to kluczowy element dokumentacji testów aplikacji. Tego rodzaju dokumentacja obejmuje szczegółowe instrukcje dotyczące metod testowania, użytych narzędzi oraz kroków niezbędnych do przeprowadzenia testów jednostkowych, integracyjnych i systemowych. W dokumentacji znajdują się również raporty z wynikami testów, które wskazują, czy aplikacja działa zgodnie z wymaganiami oraz jakie błędy zostały wykryte. Testy pozwalają na wczesne wychwycenie problemów i eliminację błędów przed wdrożeniem aplikacji na produkcję, co znacząco zwiększa jakość oprogramowania. Dokumentacja testowa jest także nieocenionym źródłem informacji dla zespołów QA (Quality Assurance), umożliwiając śledzenie historii testów i zapewnienie, że wszystkie elementy aplikacji zostały przetestowane zgodnie z procedurami.
Pytanie 14
Jakie informacje mogą być zapisywane w cookies przeglądarki?
A. Prywatne dane użytkownika, na przykład hasła
B. Dane przechowywane w systemie baz danych
C. Kod źródłowy aplikacji internetowej
D. Preferencje użytkownika, takie jak język lub styl strony
Preferencje użytkownika, takie jak język strony, motyw kolorystyczny lub preferencje dotyczące układu, są typowymi danymi przechowywanymi w ciasteczkach przeglądarki. Mechanizm ciasteczek pozwala na personalizację doświadczenia użytkownika i jest szeroko stosowany w aplikacjach webowych w celu dostosowania interfejsu do indywidualnych potrzeb. Cookies umożliwiają także zapamiętywanie sesji użytkownika, co pozwala uniknąć konieczności wielokrotnego logowania. Informacje te są przechowywane lokalnie w przeglądarce użytkownika i mogą być odczytywane przez aplikację podczas każdej wizyty. Stosowanie ciasteczek zgodnie z przepisami, takimi jak RODO (GDPR), wymaga informowania użytkownika o ich przeznaczeniu oraz uzyskiwania jego zgody na ich przechowywanie, co zapewnia transparentność i zgodność z prawem.
Pytanie 15
Co będzie wynikiem działania poniższego kodu JavaScript?
Wynik działania tego kodu to `Hello, undefined`, co jest spowodowane tym, jak działa kontekst `this` w JavaScript. Gdy wywołujemy metodę `greet`, w kontekście tej metody `this` odnosi się do obiektu `obj`. Proszę zauważyć, że metoda `greet` używa funkcji anonimowej w `setTimeout`, a to zmienia kontekst `this`. W momencie, gdy `setTimeout` wywołuje funkcję, `this` nie odnosi się już do obiektu `obj`, lecz do globalnego obiektu (w przeglądarkach jest to `window`), gdzie `name` nie jest zdefiniowane. Dlatego w konsoli widzimy `Hello, undefined`. Takie zachowanie jest typowe dla JavaScript, więc warto zrozumieć, jak można to zmienić, np. używając funkcji strzałkowej (`() => {}`), która nie ma własnego kontekstu `this`, więc po prostu korzysta z kontekstu otaczającego. Użycie strzałek w takich przypadkach jest coraz częściej zalecane w nowoczesnym kodzie.
Pytanie 16
Czym jest 'refaktoryzacja' w kontekście inżynierii oprogramowania?
A. Proces modyfikowania kodu w celu poprawy jego struktury bez zmiany funkcjonalności
B. Dodawanie nowych funkcji do istniejącego kodu
C. Usuwanie niepotrzebnych funkcji z kodu
D. Optymalizacja wydajności poprzez zmianę algorytmów
Pozostałe odpowiedzi dotyczą różnych aspektów pracy z kodem, ale nie są związane z refaktoryzacją. Usuwanie niepotrzebnych funkcji może być częścią procesu czyszczenia kodu, ale nie jest to synonim refaktoryzacji. W praktyce, usuwanie funkcji może prowadzić do zmiany funkcjonalności aplikacji, podczas gdy refaktoryzacja stara się zachować jej zachowanie. Dodawanie nowych funkcji, choć jest istotnym elementem rozwoju oprogramowania, to jednak odnosi się bardziej do rozszerzania funkcjonalności, a nie do poprawy struktury. Proces ten niesie ze sobą ryzyko wprowadzania nowych błędów, co jest odwrotnością celu refaktoryzacji, jakim jest czystość i stabilność kodu. Optymalizacja wydajności poprzez zmianę algorytmów również różni się od refaktoryzacji. Optymalizacja często skupia się na zwiększeniu szybkości działania programu, co może wymagać głębokich zmian w logice kodu, w przeciwieństwie do refaktoryzacji, której celem jest zachowanie istniejącej funkcjonalności. Zmiany algorytmiczne mogą znacząco wpływać na sposób działania programów, co stoi w sprzeczności z założeniem, że refaktoryzacja nie zmienia zachowania zewnętrznego aplikacji. Częstym błędem jest mylenie tych procesów z uwagi na ich wspólny cel poprawy jakości kodu, jednak różnią się one zakresem i podejściem do modyfikacji.
Pytanie 17
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 18
Jakie mogą być konsekwencje długotrwałego narażenia na hałas w pracy?
A. Uszkodzenie słuchu i zmęczenie
B. Choroby skórne
C. Obniżenie ostrości wzroku
D. Wzrost efektywności pracy
Zmniejszenie ostrości widzenia nie jest bezpośrednim skutkiem hałasu – problemy ze wzrokiem mogą być wynikiem złego oświetlenia lub długotrwałej pracy przy komputerze. Choroby skóry są zazwyczaj związane z ekspozycją na chemikalia, promieniowanie UV lub nieodpowiednie warunki higieniczne, a nie hałas. Zwiększenie wydajności pracy w wyniku hałasu jest błędnym założeniem – hałas zazwyczaj obniża efektywność, prowadząc do zmęczenia i dekoncentracji, a nie poprawy produktywności.
Pytanie 19
Który algorytm sortowania opiera się na metodzie "dziel i zwyciężaj"?
A. Sortowanie szybkie (QuickSort)
B. Sortowanie przez wybór
C. Sortowanie bąbelkowe
D. Sortowanie przez wstawianie
Sortowanie przez wybór polega na wyszukiwaniu najmniejszego elementu w każdej iteracji i umieszczaniu go na początku tablicy, co prowadzi do złożoności O(n²). Sortowanie bąbelkowe również działa w czasie O(n²) i nie wykorzystuje strategii dziel i zwyciężaj. Sortowanie przez wstawianie polega na stopniowym umieszczaniu elementów w odpowiedniej pozycji, ale nie dzieli tablicy na mniejsze części jak QuickSort, co sprawia, że jest mniej wydajne dla dużych zbiorów danych.
Pytanie 20
Jakie z poniższych narzędzi wspomaga projektowanie interfejsu użytkownika w aplikacjach mobilnych?
A. Kompilator Javy
B. PyCharm Debugger
C. Android Studio Layout Editor
D. Narzędzie do zarządzania bazami danych
Android Studio Layout Editor to narzędzie umożliwiające projektowanie interfejsu użytkownika aplikacji mobilnych w sposób wizualny, za pomocą metody 'przeciągnij i upuść'. Layout Editor pozwala na szybkie tworzenie responsywnych interfejsów, które automatycznie dostosowują się do różnych rozmiarów ekranów i rozdzielczości. Dzięki niemu programiści mogą łatwo dodawać elementy UI, takie jak przyciski, pola tekstowe, listy czy obrazy, oraz dostosowywać ich właściwości bez konieczności pisania dużych fragmentów kodu XML. Narzędzie to jest kluczowe dla szybkiego prototypowania aplikacji oraz iteracyjnego podejścia do budowy interfejsu użytkownika w środowisku Android Studio.
Pytanie 21
Jakie aspekty powinny być brane pod uwagę przy tworzeniu zestawów danych?
A. Typ zastosowanego kompilatora
B. Narzędzia do analizy błędów
C. Ilość linii kodu programu
D. Metoda alokacji pamięci dla danych
Sposób alokacji pamięci dla danych to kluczowy element projektowania zestawów danych, ponieważ wpływa na wydajność i efektywność programu. Dynamiczna alokacja pamięci pozwala na tworzenie struktur, których rozmiar jest zmienny i dostosowuje się w trakcie działania aplikacji. Dzięki temu programiści mogą optymalnie zarządzać zasobami systemowymi, unikając marnowania pamięci lub jej niedoboru. Wybór odpowiedniej metody alokacji, np. stosowanie wskaźników, dynamicznych tablic lub struktur danych takich jak lista czy mapa, pozwala na budowanie bardziej skalowalnych i elastycznych aplikacji.
Pytanie 22
Jakie jest fundamentalne zagadnienie w projektowaniu aplikacji w architekturze klient-serwer?
A. Brak podziału na role klienta i serwera
B. Użycie serwera jako głównego miejsca przetwarzania danych
C. Przeniesienie wszystkich obliczeń na stronę klienta
D. Funkcjonowanie aplikacji wyłącznie w trybie offline
Brak rozróżnienia ról pomiędzy klientem a serwerem prowadzi do dezorganizacji i uniemożliwia efektywne zarządzanie danymi. Przeniesienie całości obliczeń na stronę klienta znacznie obciąża jego urządzenie, co może prowadzić do spadku wydajności i zwiększonego zużycia zasobów. Działanie aplikacji wyłącznie w trybie offline wyklucza możliwość przetwarzania danych w czasie rzeczywistym i ogranicza dostęp do aktualnych informacji, co jest sprzeczne z ideą architektury klient-serwer.
Pytanie 23
Co to jest Continuous Integration (CI)?
A. Protokół komunikacji między różnymi częściami aplikacji
B. Technika tworzenia aplikacji mobilnych w sposób przyrostowy
C. Praktyka automatycznego integrowania kodu w repozytorium wspólnym wraz z testami
D. Metoda ciągłego monitorowania wydajności aplikacji w produkcji
W kontekście rozwoju oprogramowania można spotkać się z różnymi praktykami i technologiami, które często mylone są z Continuous Integration. Jedną z takich praktyk jest technika tworzenia aplikacji mobilnych w sposób przyrostowy. To podejście polega na wprowadzaniu małych zmian w aplikacji, które są następnie rozwijane i testowane. Choć metoda przyrostowa może być korzystna, nie odnosi się bezpośrednio do idei CI, gdyż ta ostatnia koncentruje się na automatyzacji integracji kodu i jego testowania, a nie na samej metodzie rozwoju. Kolejnym nieporozumieniem jest metoda ciągłego monitorowania wydajności aplikacji w produkcji, która dotyczy zarządzania i optymalizacji działania aplikacji po jej wdrożeniu. CI jest procesem wcześniejszym, skupionym na kodzie, nie na jego działaniu w produkcji. Ostatnia odpowiedź, dotycząca protokołu komunikacji między różnymi częściami aplikacji, również nie ma związku z CI, ponieważ protokoły te służą do wymiany danych w systemie, a nie do integracji kodu. Zrozumienie tych różnic jest kluczowe, aby poprawnie identyfikować i stosować odpowiednie praktyki w inżynierii oprogramowania.
Pytanie 24
Jaka będzie wartość zmiennej x po wykonaniu poniższego kodu?
Wartości 45, 30 i 20 uznawane za odpowiedzi na pytanie są wynikiem błędnych założeń dotyczących działania pętli oraz sposobu sumowania wartości. Niektórzy mogą pomyśleć, że wszystkie liczby od 0 do 9 powinny być sumowane, co prowadzi do błędnego wyniku. Zrozumienie tego, jak działa instrukcja continue, jest kluczowe. Instrukcja ta sprawia, że aktualna iteracja pętli jest przerywana w momencie, gdy i jest parzyste, co skutkuje pominięciem tych wartości w sumie. To istotny aspekt, ponieważ nie ma możliwości dodania parzystych liczb do zmiennej x. Kolejną pomyłką jest błędne obliczanie sumy nieparzystych liczb. Zamiast prawidłowego wyniku 25, niektórzy mogą zyskać liczbę 45, co sugeruje, że do sumy dodano również parzyste liczby, co jest niezgodne z logiką pętli. Podobnie, suma 30 pojawia się, gdy ktoś myśli, że bierze tylko niektóre liczby, ale źle oblicza ich sumę. Ostatecznie 20 również nie znajduje uzasadnienia, ponieważ w najlepszym przypadku można uzyskać sumę tylko niektórych nieparzystych liczb, co w rzeczywistości nie jest zgodne z kodem przedstawionym w pytaniu. Warto nauczyć się analizować kod na poziomie instrukcji i zrozumieć, jakie elementy są sumowane, a jakie są pomijane. Umożliwi to unikanie takich potknięć w przyszłości.
Pytanie 25
Metodyka zwinna (ang. agile) opiera się na
A. dekompozycji przedsięwzięcia na elementy, które są niezależnie projektowane, wytwarzane i testowane w krótkich iteracjach
B. zaplanowaniu całej aplikacji na początku projektu i jej tworzeniu na przemian z testowaniem
C. podzieleniu projektu na kolejne etapy: planowanie, programowanie, testowanie, z ciągłym oszacowaniem ryzyka projektu
D. przygotowaniu testów dla całego projektu, a następnie wprowadzaniu kolejnych jego fragmentów
Metodyka zwinna (agile) polega na podziale projektu na mniejsze części (iteracje), które są projektowane, implementowane i testowane w krótkich cyklach. Takie podejście pozwala na szybkie reagowanie na zmieniające się wymagania klientów i wprowadzanie poprawek na bieżąco. Agile promuje bliską współpracę z klientem, co minimalizuje ryzyko nieporozumień i zwiększa szanse na stworzenie produktu spełniającego jego oczekiwania. Zamiast czekać na zakończenie całego projektu, poszczególne części aplikacji są dostarczane i testowane stopniowo, co skraca czas wdrożenia i umożliwia szybkie wykrycie błędów. Popularnymi frameworkami bazującymi na Agile są Scrum i Kanban, które organizują pracę zespołu w iteracyjne sprinty lub zadania wizualizowane na tablicach Kanban.
Pytanie 26
Które narzędzie służy do tworzenia makiet interfejsu użytkownika (UI mockups)?
A. Jenkins
B. Figma
C. Postman
D. Webpack
Figma to narzędzie służące do tworzenia makiet interfejsu użytkownika, które jest szczególnie cenione za swoje możliwości współpracy w czasie rzeczywistym. Dzięki Figma zespoły projektowe mogą jednocześnie edytować te same projekty, co znacząco przyspiesza proces twórczy i pozwala na bieżąco wprowadzać zmiany na podstawie uwag członków zespołu. Narzędzie oferuje bogaty zestaw funkcji, takich jak wektoryzacja, prototypowanie czy zintegrowana biblioteka komponentów, co sprawia, że projektanci mogą szybko i efektywnie tworzyć interfejsy, które są zarówno estetyczne, jak i funkcjonalne. Praktyczne zastosowanie Figma obejmuje współpracę z deweloperami przy tworzeniu responsywnych aplikacji oraz możliwość dostosowywania makiet do różnych rozmiarów ekranów. Standardy branżowe, takie jak użycie siatek i systemów modułowych, można łatwo zaimplementować w Figma, co dodatkowo zwiększa jego użyteczność. Dzięki temu narzędziu, zespoły mogą tworzyć nie tylko statyczne makiety, ale także interaktywne prototypy, co jest niezbędne w procesie testowania UX.
Pytanie 27
Który z wymienionych typów kolekcji pozwala na dostęp do ostatnio dodanego elementu w pierwszej kolejności?
A. Tablica dwuwymiarowa
B. Stos
C. Kolejka
D. Lista
Stos to struktura danych działająca na zasadzie LIFO (Last In First Out), co oznacza, że ostatnio dodany element jest usuwany jako pierwszy. Stos znajduje zastosowanie w implementacji mechanizmu wywołań rekurencyjnych, zarządzaniu pamięcią oraz w operacjach związanych z cofaniem i przywracaniem stanu (np. cofanie operacji w edytorach tekstów). Dzięki swojej prostocie stosy są fundamentalnym elementem w programowaniu, szczególnie w językach niskopoziomowych.
Pytanie 28
Jakie są główne różnice między środowiskiem RAD (Rapid Application Development) a klasycznymi IDE w odniesieniu do aplikacji mobilnych?
A. RAD koncentruje się wyłącznie na procesie debugowania aplikacji
B. RAD nie obsługuje interfejsu użytkownika
C. RAD działa tylko na urządzeniach z systemem iOS
D. RAD pozwala na szybsze budowanie aplikacji dzięki narzędziom do wizualnego designu i automatycznego generowania kodu
RAD (Rapid Application Development) umożliwia szybsze tworzenie aplikacji mobilnych dzięki narzędziom do wizualnego projektowania i automatycznego generowania kodu. RAD koncentruje się na iteracyjnym podejściu do rozwoju oprogramowania, w którym prototypy są budowane i testowane w krótkich cyklach, co pozwala na szybkie dostosowywanie aplikacji do zmieniających się wymagań użytkowników. W kontekście aplikacji mobilnych, RAD skraca czas tworzenia poprzez graficzne narzędzia do budowy interfejsów, gotowe komponenty oraz integrację z backendem. Frameworki RAD, takie jak OutSystems, Mendix czy Flutter, pozwalają na szybkie wdrażanie i modyfikację aplikacji mobilnych, co znacząco zwiększa efektywność programistów.
Pytanie 29
Jak określa się proces, w trakcie którego klasa przejmuje właściwości innej klasy w programowaniu obiektowym?
A. Polimorfizm
B. Dziedziczenie
C. Abstrakcja
D. Hermetyzacja
Dziedziczenie to kluczowa cecha programowania obiektowego (OOP), która pozwala jednej klasie (klasie pochodnej) przejmować cechy i zachowania innej klasy (klasy bazowej). Dzięki dziedziczeniu można wielokrotnie wykorzystywać kod, co prowadzi do większej modularności i zmniejszenia redundancji. Dziedziczenie umożliwia rozszerzanie funkcjonalności klas bazowych poprzez dodawanie nowych metod lub modyfikowanie istniejących, bez konieczności ingerencji w oryginalny kod. Przykład w C++: `class Pojazd { ... }; class Samochod : public Pojazd { ... };` – `Samochod` dziedziczy wszystkie publiczne i chronione (protected) elementy klasy `Pojazd`.
Pytanie 30
Jakie obliczenia można wykonać za pomocą poniższego algorytmu, który operuje na dodatnich liczbach całkowitych?
A. liczbę cyfr w wprowadzonej liczbie
B. sumę cyfr wprowadzonej liczby
C. sumę wprowadzonych liczb
D. największy wspólny dzielnik wprowadzonej liczby
Analizując algorytm przedstawiony na schemacie, łatwo zauważyć, że nie wykonuje on ani sumowania cyfr, ani nie oblicza największego wspólnego dzielnika, ani nie sumuje wprowadzonych liczb. W praktyce mylenie tych operacji wynika często z pobieżnego czytania algorytmu lub automatycznego kojarzenia słowa „wynik” z sumą. Jednak podstawą analizy algorytmów zawsze powinno być zwracanie uwagi na konkretne instrukcje i sposób przetwarzania danych. W tym przypadku liczba jest dzielona przez 10 w każdej iteracji pętli, a licznik jest zwiększany o jeden za każdym razem, gdy to się dzieje. Nie ma tu żadnego dodawania poszczególnych cyfr, co wyklucza sumowanie cyfr. Nie pojawia się przetwarzanie wielu różnych liczb, więc niemożliwe jest sumowanie wprowadzonych liczb – algorytm pracuje wyłącznie na jednej wartości podanej na wejściu. Narzędzie do obliczania największego wspólnego dzielnika musiałoby operować na dwóch liczbach i wykorzystywać inne operacje, jak reszta z dzielenia. Typowym błędem jest też utożsamianie każdej pętli z operacją sumowania lub łączenia danych, co w tym przypadku nie ma uzasadnienia merytorycznego. Kluczowe jest przy analizie algorytmów zwracanie uwagi na to, jakie operacje są wykonywane w każdej iteracji i czy pojawia się obsługa wielu wartości, czy tylko jednej. Z mojego doświadczenia wynika, że takie drobne błędy myślowe prowadzą często do fałszywych wniosków, dlatego warto dokładnie czytać algorytm krok po kroku i analizować, do czego rzeczywiście prowadzą poszczególne instrukcje. W tym przypadku algorytm po prostu liczy liczbę dziesiętnych „pozycji” w liczbie aż do jej wyzerowania, co odpowiada liczbie cyfr, a nie żadnej z pozostałych interpretacji.
Pytanie 31
Która z niżej wymienionych pozycji jest ekwiwalentem biblioteki jQuery?
A. TypeScript
B. Bootstrap
C. Express.js
D. Lodash
Lodash to popularna biblioteka JavaScript, która dostarcza gotowe funkcje umożliwiające manipulację tablicami, obiektami oraz danymi. Lodash upraszcza wiele złożonych operacji, takich jak filtrowanie, mapowanie, sortowanie i grupowanie danych. Dzięki Lodash programiści mogą efektywnie zarządzać złożonymi strukturami danych, co prowadzi do zwiększenia czytelności i efektywności kodu. Biblioteka jest szeroko stosowana w aplikacjach frontendowych i backendowych, a jej funkcje są zoptymalizowane pod kątem wydajności, co czyni ją nieocenionym narzędziem w dużych projektach. Lodash często bywa porównywany do jQuery, jednak jego głównym celem jest manipulacja danymi, a nie elementami DOM. Dzięki swojej wszechstronności Lodash znajduje zastosowanie w niemal każdym projekcie JavaScript, zarówno w prostych aplikacjach webowych, jak i dużych projektach korporacyjnych.
Pytanie 32
Które narzędzie najlepiej nadaje się do analizy wydajności aplikacji JavaScript?
A. Webpack
B. Chrome DevTools Performance
C. Babel
D. npm
Chrome DevTools Performance to potężne narzędzie, które jest integralną częścią przeglądarki Google Chrome i służy do analizy wydajności aplikacji JavaScript. Dzięki niemu możemy monitorować czas ładowania, identyfikować wąskie gardła w kodzie oraz analizować, jak różne elementy strony wpływają na ogólną wydajność. Narzędzie to umożliwia nagrywanie sesji wydajności, co pozwala na szczegółowe zbadanie, jak różne operacje wpływają na czas odpowiedzi aplikacji. Przykładowo, możemy użyć DevTools do analizy, które skrypty zajmują najwięcej czasu lub które zadania blokują wątek główny, co jest kluczowe dla zapewnienia płynności interfejsu użytkownika. Dodatkowo, narzędzie to oferuje różne metryki, takie jak FPS (frames per second), co jest niezbędne do oceny płynności animacji. Warto również podkreślić, że DevTools jest zgodne z najlepszymi praktykami branżowymi, a jego umiejętne wykorzystanie może znacząco poprawić jakość aplikacji.
Pytanie 33
Jakie składniki powinien mieć plan projektu?
A. Terminy i zasoby ludzkie
B. Tylko czas wykonania i budżet
C. Wyłącznie etapy projektu
D. Etapy projektu, ramy czasowe, zasoby i zadania
Harmonogram projektu powinien zawierać etapy projektu, ramy czasowe, zasoby oraz zadania. Taka kompleksowa struktura umożliwia skuteczne zarządzanie projektem i pozwala na śledzenie postępów. Każdy etap harmonogramu powinien być dokładnie opisany, a zadania powinny być przypisane do odpowiednich członków zespołu. Uwzględnienie zasobów i ram czasowych pozwala na precyzyjne planowanie i minimalizuje ryzyko opóźnień. Harmonogram stanowi nieodłączny element projektów zarządzanych zarówno w modelu Waterfall, jak i Agile, dostarczając przejrzystość na każdym etapie realizacji.
Pytanie 34
Jednym z kroków przy publikacji aplikacji mobilnej w sklepie Google Play są testy Beta, które charakteryzują się tym, że są one
A. przeprowadzane na podstawie dokumentu zawierającego przypadki testowe
B. realizowane przez zespół testerów zatrudnionych przez firmę Google
C. podzielone na testy funkcjonalne, wydajnościowe oraz skalowalności
D. przeprowadzane przez grupę docelowych użytkowników aplikacji
Testy Beta są kluczowym etapem w procesie publikacji aplikacji mobilnej w sklepie Google Play, ponieważ pozwalają na uzyskanie cennych informacji zwrotnych od rzeczywistych użytkowników aplikacji. W tej fazie aplikacja jest udostępniana ograniczonej grupie docelowych użytkowników, którzy są zainteresowani testowaniem oprogramowania przed jego oficjalnym wydaniem. Użytkownicy ci mają możliwość zgłaszania błędów, proponowania ulepszeń oraz oceny funkcjonalności, co jest niezwykle ważne, aby zapewnić, że produkt spełnia wymagania rynku. Przykładem zastosowania testów Beta może być aplikacja społecznościowa, która w pierwszej fazie testowania pozwala wybranej grupie użytkowników na dzielenie się swoimi doświadczeniami. Otrzymane dane są następnie analizowane w celu wprowadzenia niezbędnych poprawek przed pełnym wprowadzeniem aplikacji na rynek. Ponadto, przeprowadzanie testów Beta jest zgodne z najlepszymi praktykami w branży oprogramowania, zgodnie z metodykami Agile, które podkreślają znaczenie interakcji z użytkownikami oraz ich wkładu w rozwój produktów.
Pytanie 35
Co oznacza walidacja kodu programu?
A. Czynnością związaną z tworzeniem dokumentacji kodu
B. Czynnością polegającą na kompilowaniu kodu
C. Czynnością weryfikującą poprawność i zgodność kodu z założeniami
D. Czynnością dotyczącą publikacji aplikacji w sklepie
Walidacja kodu programu to proces sprawdzania jego poprawności i zgodności z założeniami projektowymi oraz standardami programistycznymi. Celem walidacji jest wykrycie błędów logicznych, składniowych i zgodności kodu z wymaganiami aplikacji. Walidacja może obejmować analizę statyczną kodu (bez jego wykonywania) oraz testy jednostkowe i integracyjne, które sprawdzają funkcjonalność aplikacji. Dzięki walidacji programiści mogą uniknąć błędów na późniejszych etapach rozwoju projektu, co znacząco zwiększa niezawodność i stabilność aplikacji. Proces ten jest nieodzowny w metodykach Agile i Continuous Integration, gdzie regularne testowanie kodu stanowi podstawę dostarczania wysokiej jakości oprogramowania.
Pytanie 36
Która z poniższych nie jest cechą architektury mikroserwisów?
A. Niezależne wdrażanie poszczególnych usług
B. Wspólna baza danych dla wszystkich usług
C. Autonomia zespołów rozwijających poszczególne usługi
D. Odporność na awarie pojedynczych komponentów
W architekturze mikroserwisów kluczową cechą jest niezależność każdej usługi, co obejmuje również niezależne zarządzanie danymi. Wspólna baza danych dla wszystkich usług narusza tę zasadę, ponieważ prowadzi do silnych powiązań między usługami, co ogranicza ich autonomię. Przykładem dobrych praktyk w architekturze mikroserwisów jest stosowanie wzorca bazy danych per mikroserwis, co pozwala na niezależne skalowanie, wdrażanie i rozwijanie poszczególnych usług. W praktyce, takie podejście zwiększa elastyczność w rozwoju i ułatwia szybkie wprowadzanie zmian, co jest kluczowe w nowoczesnym świecie IT. Zgodnie z zasadami DevOps i CI/CD, mikroserwisy powinny być w stanie wprowadzać zmiany w sposób autonomiczny, bez wpływu na inne komponenty systemu. Na przykład, jeżeli jedna usługa wymaga zmiany schematu bazy danych, to nie powinno to wpływać na inne usługi, co umożliwia stabilność oraz ciągłość działania całego systemu.
Pytanie 37
Z analizy złożoności obliczeniowej algorytmów sortowania dla dużych zbiorów danych (powyżej 100 elementów) wynika, że najefektywniejszą metodą jest algorytm sortowania:
sortowanie bąbelkowe
O(n²)
sortowanie przez wstawianie
O(n²)
sortowanie przez scalanie
O(n log n)
sortowanie przez zliczanie
O(n)
sortowanie kubełkowe
O(n²)
A. kubełkowego
B. przez zliczanie
C. przez scalanie
D. bąbelkowego
Sortowanie bąbelkowe jest jednym z najwolniejszych algorytmów i rzadko jest używane w praktyce ze względu na złożoność O(n^2). Sortowanie kubełkowe może być szybkie, ale jego efektywność zależy od równomiernego rozkładu danych. Sortowanie przez scalanie jest bardziej uniwersalne, ale ma większą złożoność obliczeniową niż Counting Sort i może być mniej efektywne dla dużych zbiorów danych o ograniczonym zakresie.
Pytanie 38
Która grupa typów zawiera wyłącznie typy złożone?
A. class, struct, float
B. char, struct, union
C. unsigned, struct, float
D. class, struct, union
Wiele osób myli pojęcia typów złożonych i prostych, bo na pierwszy rzut oka różnice wydają się nie takie oczywiste, zwłaszcza gdy pojawią się typy jak float, char albo unsigned. To często prowadzi do błędnych przekonań, że wystarczy, aby wśród wymienionych znalazł się chociaż jeden typ złożony, żeby cała grupa pasowała do pytania. Jednak float i char to typy proste, tzw. built-in, które służą do przechowywania pojedynczych wartości liczbowych lub znaków i nie pozwalają grupować danych – float jest przecież po prostu liczbą zmiennoprzecinkową, a char pojedynczym znakiem. Podobnie unsigned nie jest osobnym typem złożonym, tylko modyfikatorem, który zmienia zakres liczb całkowitych, eliminując liczby ujemne. Takie elementy nie spełniają kryterium typów złożonych, bo nie pozwalają budować nowych struktur danych. Jeśli chodzi o struct i union, to faktycznie są to typy złożone, ale jeśli w jednym zestawie znajdzie się float czy char, to już cała grupa odpada. Moim zdaniem bardzo często spotykany błąd to właśnie traktowanie modyfikatorów typu (unsigned, signed) jako osobnych typów złożonych, co jest niezgodne z definicjami podawanymi w oficjalnej dokumentacji języków C i C++. Poprawna praktyka branżowa każe zawsze oddzielać typy złożone – takie, które mogą grupować różne wartości lub funkcje, od tych podstawowych. To rozróżnienie jest kluczowe nie tylko w teorii, ale i w codziennym programowaniu, bo od tego zależy, jak budujemy struktury danych i zarządzamy pamięcią, a błędne klasyfikowanie prowadzi do nieczytelnego i trudnego w utrzymaniu kodu. Warto więc zawsze weryfikować, czy wszystkie typy w danym zestawie naprawdę spełniają definicję typów złożonych zgodnie ze standardami języka.
Pytanie 39
Który z poniższych aspektów najdokładniej określa cel realizacji projektu?
A. Zidentyfikowanie technologii, które mogą być zastosowane
B. Określenie problemu i metody jego rozwiązania
C. Ocena postępów w czasie realizacji projektu
D. Stworzenie harmonogramu działań
Określenie problemu i sposobu jego rozwiązania to fundamentalny cel każdego projektu. Bez jasno zdefiniowanego problemu i sprecyzowanej metody jego rozwiązania, projekt może stać się chaotyczny i nieefektywny. Precyzyjna analiza problemu pozwala na wyznaczenie celów, które prowadzą do stworzenia wartościowego produktu lub usługi. Dzięki temu zespół może skupić się na kluczowych zadaniach i efektywnie zarządzać zasobami. Określenie problemu to pierwszy krok w metodykach Agile i Waterfall, który warunkuje sukces całego przedsięwzięcia.
Pytanie 40
Który z wymienionych procesów NIE jest częścią etapu kompilacji?
A. Weryfikacja błędów składniowych
B. Tłumaczenie kodu źródłowego na język maszynowy
C. Optymalizacja kodu
D. Analiza działania programu w czasie rzeczywistym
Optymalizacja kodu to integralna część kompilacji, mająca na celu zwiększenie wydajności programu poprzez usunięcie zbędnych instrukcji i usprawnienie algorytmów. Tłumaczenie kodu źródłowego na język maszynowy jest głównym zadaniem kompilatora, który generuje plik wykonywalny. Weryfikacja błędów składniowych jest jednym z pierwszych etapów kompilacji, mającym na celu upewnienie się, że kod jest poprawny pod względem składni, zanim zostanie przekształcony na kod maszynowy.