Wyniki egzaminu

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

Egzamin zdany!

Wynik: 36/40 punktów (90,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

Który z wymienionych frameworków służy do budowy aplikacji webowych w C#?

A. Django
B. Angular
C. React.js
D. ASP.NET Core
Django to framework dla języka Python, który nie jest związany z ekosystemem C#. Angular to framework frontendowy oparty na TypeScript, używany do tworzenia interfejsów użytkownika, ale nie pełni roli backendowego frameworka webowego w C#. React.js to biblioteka JavaScript dedykowana budowie dynamicznych komponentów frontendowych i nie jest wykorzystywana do budowy backendowych aplikacji w C#.

Pytanie 2

Jaka jest składnia komentarza jednoliniowego w języku Python?

A. ""
B. !
C. //
D. #
Komentarz jednoliniowy w Pythonie zaczynamy od znaku hash, czyli #. To jest taki uniwersalny sposób na szybkie dodanie uwagi lub wyjaśnienia bez wpływu na działanie kodu. Moim zdaniem to bardzo praktyczne – wystarczy po prostu wpisać # i reszta linii jest ignorowana przez interpreter. W dużych projektach często spotyka się krótkie komentarze obok wyrażeń, np. x += 1 # inkrementacja liczby porządkowej. Co ciekawe, Python nie posiada stricte blokowych komentarzy, jak niektóre inne języki (np. /* ... */ w C lub Java), więc hashe naprawdę często się stosuje. To niesamowicie pomaga przy czytelności kodu, szczególnie gdy wracamy do własnych plików po kilku tygodniach albo pracujemy w zespole. PEP 8, czyli oficjalny przewodnik stylu Pythona, zaleca wręcz regularne używanie komentarzy do wyjaśniania „dlaczego” coś robimy, nie tylko „co” robimy. Dobrze napisany komentarz może skrócić czas szukania błędów albo tłumaczenia rozwiązań innym. Z mojego doświadczenia, warto pilnować, by komentarze nie były przestarzałe – łatwo zapomnieć o ich aktualizacji po zmianach w kodzie. Jeśli kiedyś napotkasz kod bez #, a z innymi znakami, to od razu czerwona lampka: to raczej nie jest Python.

Pytanie 3

Jakiego kodu dotyczy treść wygenerowana w trakcie działania programu Java?

Ilustracja do pytania
A. Kodu 4
B. Kodu 2
C. Kodu 1
D. Kodu 3
W przypadku kodu 4 mamy do czynienia z operatorem modulo zastosowanym na zmiennych x i y. Wiąże się to z próbą podziału przez zero co w języku Java skutkuje wygenerowaniem wyjątku java.lang.ArithmeticException. Przykładowo jeśli y wynosi zero to operacja x % y jest niedozwolona i spowoduje wyjątek. Rozumienie jak bezpiecznie wykonywać operacje arytmetyczne w Javie jest kluczowe dla unikania takich błędów. Zgodnie z dobrymi praktykami należy zawsze sprawdzać wartości zmiennych przed wykonaniem operacji matematycznych które mogą prowadzić do błędów wykonania programu. Ważne jest aby stosować techniki obsługi wyjątków try-catch które pozwalają na przechwycenie i odpowiednie zarządzanie błędami. Używanie odpowiednich testów jednostkowych może pomóc w wcześniejszym wykryciu takich problemów co jest standardem w branży programistycznej. Zrozumienie obsługi błędów w programowaniu pozwala na tworzenie bardziej niezawodnych i odpornych na błędy aplikacji co jest istotnym aspektem pracy profesjonalnego programisty.

Pytanie 4

W jakim języku został stworzony framework Angular?

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

Pytanie 5

Przedstawione w filmie działania wykorzystują narzędzie

A. debuggera analizującego wykonujący kod
B. generatora GUI przekształcającego kod do języka XAML
C. kompilatora dla interfejsu graficznego
D. generatora kodu java
Patrząc na wszystkie dostępne opcje, łatwo się pomylić, bo terminologia może być trochę podchwytliwa. Debugger analizujący wykonujący kod rzeczywiście jest kluczowym narzędziem w pracy programisty, ale jego zadaniem jest szukanie błędów i obserwowanie działania programu w czasie rzeczywistym, a nie generowanie kodu czy interfejsów. Myślę, że sporo osób utożsamia narzędzia developerskie z debuggerem, bo to jedno z najczęściej używanych rozwiązań – jednak tutaj akurat nie ma on nic wspólnego z przekształcaniem kodu do XAML-a. Generator kodu Java brzmi sensownie, jeśli ktoś pracuje więcej w środowiskach Javy, ale w tym przypadku mówimy o ekosystemie .NET i XAML-u, a Java ma zupełnie inne formaty i narzędzia (np. FXML dla JavaFX, ale to zupełnie inna bajka). Generator GUI przekształcający kod do języka XAML to narzędzie dedykowane platformie Microsoftu, bo XAML funkcjonuje właśnie w tych technologiach. Ostatnia odpowiedź, czyli kompilator dla interfejsu graficznego, to trochę pomieszanie pojęć – kompilator rzeczywiście tłumaczy kod na wykonywalny plik (np. EXE), ale nie jest narzędziem służącym do generowania czy przekształcania opisów interfejsów graficznych. Sporo osób może mieć tendencję do mylenia generatorów z kompilatorami, bo oba „tworzą coś automatycznie”, ale ich przeznaczenie jest zupełnie inne. Moim zdaniem najważniejsze to rozumieć, że generatory GUI ułatwiają życie, pozwalając szybko przenieść projekt interfejsu do kodu XAML, a reszta narzędzi ma zupełnie inne zadania. To rozróżnienie jest naprawdę kluczowe w branży.

Pytanie 6

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

A. mobilnej
B. na komputerze
C. rodzaju front-end
D. rodzaju back-end
Aplikacje back-endowe zazwyczaj pisze się w innych frameworkach, jak na przykład Express.js albo Django. Wiadomo, że Angular zajmuje się warstwą kliencką. A jak mówimy o aplikacjach mobilnych czy desktopowych, to częściej korzysta się z takich rzeczy jak Flutter, React Native czy Electron. Więc to już nie jest to samo co Angular.

Pytanie 7

Jak wygląda kod uzupełnienia do dwóch dla liczby -5 w formacie binarnym przy użyciu 8 bitów?

A. 11111101
B. 00000101
C. 11111011
D. 10000101
Aby obliczyć kod uzupełnieniowy do dwóch dla liczby -5 w zapisie binarnym na 8 bitach, należy najpierw przedstawić liczbę 5 w postaci binarnej, co daje 00000101. Zgodnie z zasadą uzupełnienia do dwóch, aby uzyskać reprezentację liczby ujemnej, najpierw inwertujemy wszystkie bity tej liczby. Inwersja 00000101 prowadzi do 11111010. Następnie dodajemy 1 do wyniku inwersji: 11111010 + 1 = 11111011. Ostatecznie, kod uzupełnieniowy do dwóch dla -5 na 8 bitach to 11111011. Ta metoda jest powszechnie stosowana w systemach komputerowych i umożliwia efektywne operacje arytmetyczne na liczbach całkowitych, w tym na liczbach ujemnych, co jest kluczowe w kontekście programowania i projektowania systemów. Warto zaznaczyć, że standardy takie jak IEEE 754 definiują zasady reprezentacji liczb zmiennoprzecinkowych, ale w przypadku liczb całkowitych, kod uzupełnieniowy do dwóch pozostaje standardem w większości architektur komputerowych.

Pytanie 8

Wskaż poprawny pod względem składniowym kod dla formatu JSON, który jest używany do wymiany danych między backendem a frontendem aplikacji.

osoby: [
  {imię: 'Anna', wiek: '31' },
  {imię: 'Krzysztof', wiek: '25' }
]
"osoby": [
  {"imię": "Anna", "wiek": 31 },
  {"imię": "Krzysztof", "wiek": 25 }
]
Kod 1Kod 2
<osoby>
  <imie>Anna</imie>
  <wiek>31</wiek>
  <imie>Krzysztof</imie>
  <wiek>25</wiek>
</osoby>
struct osoby {
  imie: {Anna}, wiek:{31};
  imie: {Krzysztof}, wiek:{25}
};
Kod 3Kod 4
A. Kod1
B. Kod3
C. Kod4
D. Kod2
Kod2 jest spoko, bo składnia jest w porządku dla JSON. Używasz odpowiednich znaków i struktur, więc wszystko gra. JSON to taki format do wymiany danych, który często wykorzystuje się w komunikacji między frontendem a backendem. Zgadza się ze standardem ECMA-404. Pamiętaj, że klucze i wartości tekstowe powinny być w podwójnych cudzysłowach, co widać w Kod2. Twój przykładowy kod pokazuje tablicę obiektów, gdzie każdy obiekt ma pary klucz-wartość, a przecinki i nawiasy klamrowe są na swoim miejscu. To naprawdę dobry sposób, bo ułatwia współpracę między różnymi elementami aplikacji. JSON ma ważne zastosowanie w AJAX, bo dzięki niemu możemy dynamicznie aktualizować treści na stronie bez jej przeładowania. To jest mega przydatne w nowoczesnych aplikacjach typu SPA, gdzie JSON odgrywa kluczową rolę w zarządzaniu stanem aplikacji i komunikacji.

Pytanie 9

Co to jest CORS (Cross-Origin Resource Sharing)?

A. Protokół komunikacji między różnymi bazami danych
B. Technika optymalizacji ładowania zasobów statycznych
C. Mechanizm bezpieczeństwa, który określa, które domeny mogą uzyskiwać dostęp do zasobów na serwerze
D. Metoda udostępniania API dla aplikacji mobilnych
CORS, czyli Cross-Origin Resource Sharing, to mechanizm bezpieczeństwa stosowany w aplikacjach internetowych, który reguluje, które zewnętrzne domeny mają prawo uzyskiwać dostęp do zasobów na serwerze. Jest to szczególnie istotne w kontekście aplikacji klienckich działających w przeglądarkach, gdzie zapytania do różnych źródeł (tzw. cross-origin requests) mogą prowadzić do problemów z bezpieczeństwem, takich jak ataki typu CSRF (Cross-Site Request Forgery) czy XSS (Cross-Site Scripting). Przykładowo, jeśli aplikacja internetowa hostowana na domenie A próbuje uzyskać dane z API na domenie B, serwer na domenie B może poprzez nagłówki CORS określić, czy i jakie żądania od domeny A będą honorowane. Przy odpowiedniej konfiguracji, serwer może zezwolić na dostęp tylko dla zaufanych źródeł, co zapobiega nieautoryzowanym operacjom. W praktyce, stosowanie CORS przyczynia się do stworzenia bezpieczniejszych aplikacji webowych, zgodnych z aktualnymi standardami bezpieczeństwa w sieci, takimi jak W3C i OWASP.

Pytanie 10

Algorytm wyszukiwania sekwencyjnego z wykorzystaniem wartownika opiera się na założeniu, że

A. na końcu analizowanego zbioru należy dodać wartownika
B. szukany element powinien wystąpić wielokrotnie w zbiorze
C. zbiór danych wejściowych musi być uporządkowany
D. zbiór ma zawsze 100 elementów
Algorytm sekwencyjnego wyszukiwania elementu z wartownikiem jest techniką optymalizacji procesu wyszukiwania w strukturach danych, która znacząco zwiększa efektywność operacji w przypadkach, gdy zbiór danych jest duży. Wartownik to specjalny element, który jest dodawany na końcu przeszukiwanego zbioru, co pozwala na uproszczenie warunków zakończenia pętli przeszukiwania. Kiedy algorytm przeszukuje zbiór, porównuje każdy element z poszukiwanym, a gdy znajdzie element, może zakończyć działanie. Dodanie wartownika pozwala uniknąć potrzeby sprawdzania, czy aktualnie przeszukiwany element jest ostatnim z oryginalnego zbioru, co z kolei zmniejsza liczbę porównań i przyspiesza proces wyszukiwania. W praktyce algorytm ten jest szczególnie użyteczny w przypadku niewielkich zbiorów danych, gdzie efektywność jest kluczowa. Przykładem zastosowania może być edytor tekstu, w którym użytkownik wyszukuje konkretne słowa w dokumencie, a dodanie wartownika usprawnia ten proces. Zgodnie z zasadami wydajnego programowania, ta technika stanowi jeden z podstawowych mechanizmów stosowanych w algorytmice, co czyni ją fundamentalnym konceptem w nauce o komputerach.

Pytanie 11

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

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

Pytanie 12

Dlaczego w wyniku działania tego kodu w języku C++ na ekranie pojawiła się wartość 0 zamiast 50?

int oblicz(int x)  {
    int i = 50;
    x = x + i;
    return i;
}

int main()  {
    int x = 0;
    int wynik = oblicz(x);
    std::cout << x;
}
A. Argument funkcji został przekazany przez wartość, a nie przez referencję.
B. Zmienna x powinna być inicjowana wartością równą 1, a nie 0.
C. Niepoprawnie zdefiniowano działanie wewnątrz funkcji.
D. Funkcja zwraca wartość, chociaż nie powinna jej zwracać.
W C++ funkcje standardowo dostają argumenty przez wartość, co znaczy, że dostają kopię tego, co do nich wysyłamy. W tym kodzie, jak widzisz, zmienna x idzie do funkcji oblicz jako kopia. To sprawia, że jakiekolwiek zmiany w x w tej funkcji nie mają wpływu na x w funkcji main. Dlatego po wywołaniu oblicz(x) wartość x w main zostaje taka sama. Jeśli chcesz, żeby zmiany wewnątrz funkcji były widoczne w funkcji, która ją wywołuje, to musisz użyć przekazywania przez referencję. Robisz to, dodając & w deklaracji parametru funkcji, czyli robisz to tak: void oblicz(int &x). Przekazywanie przez referencję to dobra praktyka, gdy chcesz, aby funkcja mogła zmieniać wartość argumentu. A dodatkowo jest to efektywniejsze, bo unikasz kopiowania danych, co bywa kosztowne, szczególnie przy dużych strukturach danych.

Pytanie 13

W języku C# szablon List zapewnia funkcjonalność listy. Z tworzenia obiektu typu List wynika, że jego składnikami są:

List<int> wykaz = new List<int>();
A. liczby rzeczywiste
B. elementy o nieokreślonym typie
C. elementy typu List
D. liczby całkowite
Szablon List<int> w języku C# implementuje listę, której elementami są liczby całkowite. Jest to przykład zastosowania kolekcji generycznych, które wprowadzają typowanie silne w czasie kompilacji, co pozwala na uniknięcie błędów typowych dla kolekcji niegenerycznych. Definiując List<int> deklarujesz, że lista będzie przechowywać tylko liczby całkowite. Dzięki temu kompilator może wykrywać błędy związane z typowaniem już podczas pisania kodu, co zwiększa jego niezawodność i bezpieczeństwo. Typ generyczny T w List<T> umożliwia tworzenie kolekcji przechowujących dowolny typ, co ułatwia ponowne wykorzystanie kodu i zgodność z zasadą DRY (Don't Repeat Yourself). W praktyce List<int> jest szeroko stosowany w scenariuszach wymagających dynamicznie rozwijanych kolekcji, które nie ograniczają się do statycznej liczby elementów, takich jak tablice. Listy generyczne są wydajniejsze i bardziej elastyczne dzięki metodom takim jak Add, Remove czy Contains, które operują na elementach określonego typu. Dzięki implementacji IEnumerable/Listy są również zgodne z LINQ, co umożliwia stosowanie złożonych zapytań i operacji na danych, takich jak filtrowanie i sortowanie, w sposób czytelny i efektywny.

Pytanie 14

W przedstawionej ramce znajduje się fragment opisu metody compile języka Java wykorzystywanej w kontekście wyrażeń regularnych. Który symbol powinien być użyty, aby znaleźć dopasowanie na końcu tekstu?

MetacharacterDescription
|Find a match for any one of the patterns separated by | as in: cat|dog|fish
.Find just one instance of any character
^Finds a match as the beginning of a string as in: ^Hello
$Finds a match at the end of the string as in: World$
\dFind a digit
\sFind a whitespace character
\bFind a match at the beginning of a word like this: \bWORD, or at the end of a word like this: WORD\b
\uxxxxFind the Unicode character specified by the hexadecimal number xxxx
Źródło https://www.w3schools.com/java/java_regex.asp dostęp 20.08.2020
A. $
B. |
C. ^
D. .
Znak dolara $ w wyrażeniach regularnych w języku Java jest używany do oznaczenia końca ciągu znaków. Jeśli chcemy sprawdzić, czy konkretny wzorzec występuje na końcu danego tekstu, używamy właśnie tego metaznaku. Przykładowo, wyrażenie regularne World$ dopasuje tekst, w którym słowo World pojawia się na samym końcu. Jest to przydatne w wielu scenariuszach, takich jak walidacja struktury tekstu czy filtrowanie logów, gdzie ważna jest pozycja występowania wzorca. Konwencja ta jest zgodna z ogólnymi standardami regex, co czyni ją intuicyjną i uniwersalną w zastosowaniu. Dolar pełni kluczową rolę w automatyzacji procesów w przetwarzaniu tekstu, umożliwiając efektywne dopasowywanie końcowych wzorców w aplikacjach Java. Użycie $ jest zgodne z dobrymi praktykami kodowania, szczególnie w kontekście walidacji danych wejściowych, gdzie określenie końca ciągu jest często wymagane. Jest to także popularne w analizie danych, gdzie dane muszą spełniać określone kryteria co do ich zakończenia, takie jak rozszerzenia plików czy określone etykiety tekstowe.

Pytanie 15

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

A. Testy użyteczności
B. Testy funkcjonalne
C. Testy obciążeniowe
D. Testy zgodności
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 16

Który z poniższych problemów jest najczęściej rozwiązywany z zastosowaniem algorytmu rekurencyjnego?

A. Wyszukiwanie binarne w uporządkowanej tablicy
B. Generowanie ciągu Fibonacciego
C. Sortowanie za pomocą metody QuickSort
D. Obliczanie sumy elementów w tablicy
Generowanie ciągu Fibonacciego to klasyczny przykład problemu, który najczęściej rozwiązuje się za pomocą algorytmu rekurencyjnego. Algorytm rekurencyjny wywołuje sam siebie, dzieląc problem na mniejsze podproblemy, aż do osiągnięcia przypadku bazowego. W przypadku Fibonacciego każda liczba jest sumą dwóch poprzednich, a algorytm rekurencyjny odwzorowuje to wprost poprzez wywołania fib(n-1) + fib(n-2). Rekurencja jest intuicyjna i często stosowana w zadaniach matematycznych, takich jak obliczanie silni czy rozwiązywanie problemów związanych z przeszukiwaniem drzew. Choć rekurencja jest elegancka, dla dużych n może prowadzić do nadmiarowych obliczeń, dlatego często optymalizuje się ją za pomocą pamięci podręcznej (memoizacji) lub iteracyjnych wersji algorytmu.

Pytanie 17

Szablon MojaTablica oferuje funkcjonalność tablicy z indeksami oraz elementami różnych typów. W oparciu o pokazany kod, który wykorzystuje ten szablon do tworzenia tablicy asocjacyjnej, wskaż definicję, która posługuje się szablonem do zainicjowania tablicy, gdzie indeksami są liczby całkowite, a elementami są napisy?

MojaTablica tab1 = new MojaTablica<string, string>();
tab1["good"] = "dobry";
A. MojaTablica tab2 = new MojaTablica()
B. int tab2[] = new MojaTablica()
C. int tab2 = new MojaTablica()
D. MojaTablica tab2 = MOjaTablica()
Aby utworzyć tablicę asocjacyjną w oparciu o szablon, należy zainicjalizować ją przy użyciu właściwej składni: MojaTablica tab2 = new MojaTablica();. Tego typu deklaracja tworzy obiekt tablicy, gdzie klucze są liczbami całkowitymi, a wartości przechowywane w tablicy to napisy. Tablice asocjacyjne to potężne narzędzie pozwalające na szybkie wyszukiwanie i przechowywanie danych, bazujące na unikalnych kluczach, co umożliwia efektywne zarządzanie złożonymi strukturami danych.

Pytanie 18

Która z funkcji powinna zostać zrealizowana w warstwie back-end aplikacji webowej?

A. zarządzanie zdarzeniami elementów
B. wyświetlanie danych z formularza w przeglądarce
C. zarządzanie bazą danych
D. sprawdzanie formularzy w czasie rzeczywistym
Obsługa bazy danych jest fundamentalną częścią warstwy back-end w aplikacjach internetowych. Backend odpowiada za przetwarzanie logiki biznesowej, przechowywanie i zarządzanie danymi, a także komunikację z bazą danych. Dane przesyłane z front-endu (interfejsu użytkownika) są walidowane i przetwarzane po stronie serwera, zanim trafią do bazy danych lub zostaną zwrócone użytkownikowi. W przypadku aplikacji dynamicznych, serwer pobiera informacje z bazy danych, przekształca je zgodnie z wymogami aplikacji i przesyła z powrotem na front-end. Właściwe zarządzanie danymi i bezpieczeństwo operacji na bazie danych to kluczowe zadania back-endu. Równie ważne jest zapobieganie wstrzykiwaniu SQL (SQL Injection) i zapewnienie integralności danych, co stanowi podstawę skalowalnych i bezpiecznych aplikacji.

Pytanie 19

Jaki jest kluczowy zamysł wzorca "Kompozyt" (Composite)?

A. Umożliwienie klientom obsługi obiektów oraz ich zbiorów w spójny sposób
B. Stworzenie jednej klasy do zarządzania wieloma obiektami tego samego rodzaju
C. Określenie interfejsu komunikacji pomiędzy składnikami systemu
D. Danie możliwości dynamicznej zmiany zachowania obiektu
Wzorzec Kompozyt (Composite) pozwala na obsługę zarówno pojedynczych obiektów, jak i ich grup w jednolity sposób. Jest to szczególnie przydatne w przypadku hierarchicznych struktur danych, takich jak drzewa. Dzięki temu klienci mogą traktować pojedynczy element i grupę elementów identycznie, co upraszcza kod i eliminuje potrzebę pisania oddzielnych metod dla różnych poziomów hierarchii. Composite często znajduje zastosowanie w systemach GUI (graficzne interfejsy użytkownika), gdzie komponenty interfejsu (np. przyciski, panele, okna) mogą być organizowane w zagnieżdżone struktury.

Pytanie 20

Który z protokołów w modelu TCP/IP odpowiada za pewne przesyłanie danych?

A. UDP
B. IP
C. TCP
D. HTTP
Protokół TCP (Transmission Control Protocol) jest kluczowym elementem modelu TCP/IP, odpowiedzialnym za zapewnienie niezawodnego i uporządkowanego przesyłania danych między urządzeniami w sieci. TCP działa na poziomie transportu i gwarantuje, że dane są dostarczane w odpowiedniej kolejności oraz bez błędów. Protokół ten wykorzystuje mechanizmy takie jak kontrola przepływu, retransmisja utraconych pakietów oraz potwierdzenia odbioru, co czyni go idealnym do aplikacji wymagających wysokiej niezawodności, takich jak przesyłanie plików czy komunikacja w sieciach WWW. Na przykład, gdy przeglądarka internetowa pobiera stronę, TCP segmentuje dane na mniejsze pakiety, które są następnie przesyłane do użytkownika, a każdy z nich jest potwierdzany przez odbiorcę. Jeśli pakiet nie zostanie potwierdzony w określonym czasie, TCP automatycznie go retransmituje. Protokół ten jest zgodny z standardami RFC 793 oraz RFC 1122, które definiują jego działanie oraz zasady dotyczące niezawodnego przesyłania danych w sieciach komputerowych.

Pytanie 21

Jakie ma znaczenie "operacja wejścia" w kontekście programowania?

A. Naprawianie błędów w kodzie aplikacji
B. Przekazywanie danych do programu z zewnętrznych źródeł
C. Wprowadzanie nowych funkcji do aplikacji
D. Zmiana wartości zmiennych globalnych
Operacja wejścia w programowaniu polega na przekazywaniu danych do programu z zewnętrznego źródła, takiego jak klawiatura, plik lub strumień danych. W języku C++ typowym przykładem operacji wejścia jest `cin >> zmienna;`, która pobiera dane od użytkownika i przypisuje je do zmiennej. Operacje wejścia są niezbędne w interaktywnych aplikacjach, które wymagają danych od użytkownika w czasie rzeczywistym, umożliwiając dynamiczne przetwarzanie informacji.

Pytanie 22

Jaki rodzaj licencji umożliwia dowolne zmienianie oraz rozpowszechnianie kodu źródłowego?

A. Licencja komercyjna
B. Licencja GNU GPL
C. Licencja OEM
D. Licencja shareware
Licencja GNU GPL (General Public License) pozwala na swobodne modyfikowanie i rozpowszechnianie kodu źródłowego, pod warunkiem, że wszelkie zmiany i modyfikacje są również udostępniane na tych samych zasadach. Jest to jedna z najbardziej znanych licencji open-source, która gwarantuje wolność użytkownikom oprogramowania w zakresie jego analizy, modyfikacji oraz redystrybucji. Licencja ta promuje współpracę i transparentność w świecie oprogramowania, umożliwiając społeczności wspólny rozwój projektów i eliminując ograniczenia wynikające z licencji zamkniętych.

Pytanie 23

Które z poniższych stwierdzeń jest prawdziwe w kontekście dziedziczenia w języku Java?

A. Klasa pochodna dziedziczy po jednej klasie bazowej.
B. Klasa pochodna może dziedziczyć po wielu klasach bazowych.
C. Dziedziczenie jest niezalecane w języku Java.
D. Java nie wspiera dziedziczenia.
Dziedziczenie jest jednym z kluczowych mechanizmów programowania obiektowego, a Java wspiera dziedziczenie jednokrotne. Oznacza to, że klasa pochodna może dziedziczyć tylko po jednej klasie bazowej. Jest to zgodne z modelem dziedziczenia stosowanym w wielu językach obiektowych. Dzięki temu mechanizmowi możemy ponownie wykorzystywać kod, co jest zgodne z zasadą DRY (Don't Repeat Yourself). Dziedziczenie pozwala na tworzenie hierarchii klas, gdzie klasa pochodna dziedziczy właściwości i metody klasy bazowej, co ułatwia rozszerzanie funkcjonalności bez konieczności ponownego pisania kodu. Przykład zastosowania to tworzenie klasy 'Samochód', która dziedziczy po klasie 'Pojazd', co pozwala na automatyczne odziedziczenie wszystkich cech pojazdu, takich jak metoda 'uruchom', a jednocześnie dodanie specyficznych funkcji dla samochodu, jak 'otwórz bagażnik'. Dziedziczenie ułatwia zarządzanie złożonymi systemami, umożliwiając organizację kodu w sposób bardziej zrozumiały i zarządzalny.

Pytanie 24

Co zostanie wyświetlone po wykonaniu poniższego kodu w języku Python?

data = [1, 2, 3, 4, 5]
result = list(map(lambda x: x*2, filter(lambda x: x % 2 == 0, data)))
print(result)
A. [4, 8]
B. [2, 4, 6, 8, 10]
C. [1, 2, 3, 4, 5]
D. [2, 6, 10]
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 25

Aplikacje funkcjonujące w systemach Android do komunikacji z użytkownikiem wykorzystują klasę

A. Activity
B. Windows
C. Fragments
D. Screens
W systemie Android klasa Activity to absolutna podstawa komunikacji aplikacji z użytkownikiem. To właśnie ona reprezentuje jeden ekran interfejsu użytkownika, coś w stylu okna dialogowego w klasycznych aplikacjach desktopowych. Cały cykl życia aplikacji, obsługa zdarzeń, wyświetlanie elementów graficznych czy reagowanie na akcje użytkownika – wszystko to ogarnia Activity. Bez niej praktycznie żadna aplikacja nie ruszy, bo to właśnie Activity zarządza np. wywołaniem widoku, obsługą kliknięć czy przekazywaniem danych pomiędzy różnymi ekranami. Moim zdaniem, jeśli ktoś chce programować na Androida, najpierw powinien dobrze przyswoić, jak działa Activity i jej cykl życia (onCreate, onStart itd.), bo to pozwala tworzyć aplikacje zgodne z założeniami platformy. W praktyce deweloperzy bardzo często korzystają z dziedziczenia po klasie Activity, aby rozszerzyć funkcjonalność swoich aplikacji, a także używają jej do uruchamiania nowych ekranów oraz zarządzania nawigacją. Warto jeszcze pamiętać, że dobra znajomość Activity pomaga unikać typowych problemów z zarządzaniem pamięcią czy nieprawidłowym obsługiwaniem powrotów do aplikacji po przerwie. Z mojego doświadczenia, zrozumienie działania Activity to taka baza, bez której trudno iść dalej w temacie Androida.

Pytanie 26

Programista tworzy system zarządzania buforem drukowania dokumentów. Najnowsze zlecenie drukowania dodawane jest na koniec kolejki, a najstarsze z nich są przekazywane do drukarki. Jaką strukturę danych najłatwiej zastosować w tej sytuacji?

A. Sterta
B. LIFO
C. FIFO
D. Stos
FIFO (First In, First Out) to struktura danych idealnie pasująca do implementacji kolejki wydruku, gdzie zadania są przetwarzane w kolejności ich zgłoszenia. Najstarsze zadanie (pierwsze dodane) jest przetwarzane jako pierwsze, co odwzorowuje rzeczywisty sposób działania kolejek drukowania. FIFO znajduje szerokie zastosowanie w wielu dziedzinach informatyki, takich jak programowanie systemów operacyjnych, zarządzanie buforami oraz implementacja kolejek sieciowych. Dzięki temu zadania są obsługiwane w przewidywalnej kolejności, co jest kluczowe dla zachowania porządku i efektywności przetwarzania.

Pytanie 27

Która z poniższych technologii jest używana do tworzenia wykresów i animacji w przeglądarce?

A. XML
B. SVG
C. JSON
D. CSV
Odpowiedź SVG (Scalable Vector Graphics) jest prawidłowa, ponieważ jest to standardowy format grafiki wektorowej, który jest szeroko stosowany do tworzenia dynamicznych wykresów i animacji w przeglądarkach internetowych. SVG pozwala na łatwe skalowanie grafik bez utraty jakości, co czyni go idealnym wyborem do aplikacji internetowych, które muszą wyświetlać wykresy w różnych rozmiarach. Przykłady zastosowania SVG obejmują interaktywne wizualizacje danych, takie jak wykresy liniowe, słupkowe czy kołowe, które można zrealizować przy użyciu biblioteki JavaScript, takiej jak D3.js. Ponadto, SVG jest kompatybilne z CSS i JavaScript, co umożliwia stylizowanie oraz dodawanie interakcji do grafik. Warto również zauważyć, że SVG jest częścią specyfikacji HTML5, co podkreśla jego znaczenie w nowoczesnym tworzeniu stron internetowych. Dobrą praktyką jest także dbanie o dostępność i zapewnianie odpowiednich atrybutów, takich jak 'title' i 'desc', aby poprawić doświadczenie użytkowników niepełnosprawnych.

Pytanie 28

Jakie jest najważniejsze działanie w trakcie analizy wymagań klienta przed rozpoczęciem realizacji projektu aplikacji?

A. Zrozumienie potrzeb biznesowych i oczekiwań klienta
B. Stworzenie diagramu Gantta
C. Rozdzielenie ról w zespole projektowym
D. Selekcja języka programowania
Fajnie, że zauważyłeś, jak ważne jest zrozumienie potrzeb biznesowych i oczekiwań klienta. To kluczowa sprawa przed rozpoczęciem pracy nad projektem aplikacji. Bez tego, nawet najfajniejszy kod może nie spełniać wymagań, a to byłoby szkoda, prawda? Analiza wymagań to nie tylko rozpoznanie celów, ale też spotkania z osobami zaangażowanymi w projekt i zbadanie rynku. Dzięki temu możemy stworzyć aplikację, która naprawdę odpowiada na specyficzne potrzeby, co czyni ją bardziej użyteczną i konkurencyjną. No i oczywiście, jak dobrze określimy, czego potrzebują użytkownicy, to mniej nieporozumień po drodze, a klienci będą bardziej zadowoleni, co zawsze jest na plus.

Pytanie 29

Jaką rolę pełni debugger w trakcie programowania?

A. Do automatycznego generowania dokumentacji projektu
B. Do kontrolowania wersji kodu źródłowego
C. Do wykrywania błędów w czasie działania programu
D. Do konwersji kodu źródłowego na język maszynowy
Debugger to takie narzędzie, które pomaga programistom w znajdowaniu błędów i śledzeniu, co się dzieje z programem, kiedy go uruchamiamy. Można go zatrzymać w dowolnym momencie, co nazywamy breakpoints, i wtedy można zobaczyć, jakie zmienne mają jakie wartości. Dzięki temu można łatwiej dostrzegać błędy logiczne czy składniowe. Wydaje mi się, że to naprawdę ważne narzędzie w pracy każdego programisty, bo ułatwia życie!

Pytanie 30

Jakie z wymienionych narzędzi służy do emulacji mobilnych urządzeń podczas developowania aplikacji?

A. Genymotion
B. Numpy
C. TensorFlow
D. Postman
Genymotion to jedno z najbardziej zaawansowanych narzędzi do emulacji urządzeń mobilnych podczas tworzenia aplikacji na system Android. Umożliwia symulowanie działania aplikacji na różnych urządzeniach i wersjach systemu Android, co pozwala programistom na testowanie kompatybilności i wydajności aplikacji w różnych warunkach. Genymotion oferuje szybkie emulowanie, obsługę GPS, kamery oraz czujników, co czyni go niezwykle przydatnym narzędziem w procesie rozwoju aplikacji mobilnych. Dzięki wsparciu dla integracji z Android Studio, Genymotion jest popularnym wyborem wśród deweloperów tworzących aplikacje na platformę Android.

Pytanie 31

Jakie są kluczowe różnice pomiędzy strukturą (struct) a unią (union) w języku C?

A. Struktura wymaga więcej miejsca w pamięci niż unia
B. Unia umożliwia dynamiczne przypisywanie typów danych, struktura natomiast nie
C. Unia nie jest obsługiwana przez kompilatory współczesnych języków
D. Struktura przechowuje wiele wartości równocześnie, unia tylko jedną
Główna różnica między strukturą ('struct') a unią ('union') w języku C polega na sposobie przechowywania danych. Struktura przechowuje wszystkie pola jednocześnie, przydzielając każdemu z nich osobne miejsce w pamięci, natomiast unia używa wspólnej przestrzeni pamięci dla wszystkich swoich pól – w danym momencie można przechowywać tylko jedną wartość. Unia jest bardziej efektywna pod względem pamięci, ale mniej wszechstronna, ponieważ zmiana wartości jednego pola nadpisuje pozostałe. Struktury są powszechnie wykorzystywane w aplikacjach, gdzie konieczne jest przechowywanie wielu niezależnych danych, podczas gdy unie są używane do oszczędzania pamięci.

Pytanie 32

Który wzorzec projektowy jest najlepszy do zarządzania tworzeniem obiektów?

A. Observer
B. Decorator
C. Factory Method
D. Adapter
Wzorzec projektowy Factory Method jest kluczowym rozwiązaniem w kontekście zarządzania tworzeniem obiektów. Jego głównym celem jest oddzielenie procesu tworzenia obiektów od ich używania, co zwiększa elastyczność i łatwość w rozszerzaniu aplikacji. Factory Method pozwala na definiowanie interfejsu do tworzenia obiektów, ale pozostawia decyzję o tym, które klasy instancjonować, pod kontrolą podklas. Dzięki temu można łatwo wprowadzać nowe typy obiektów bez modyfikowania kodu klienckiego. Przykładem zastosowania tego wzorca może być system zarządzania dokumentami, gdzie różne typy dokumentów (np. PDF, DOCX) są tworzone przez różne fabryki, ale użycie tych obiektów odbywa się w jednolity sposób. W praktyce stosowanie wzorca Factory Method wspiera zasady SOLID, w szczególności zasadę otwartego-zamkniętego, co sprzyja utrzymywaniu i rozwijaniu systemu zgodnie z najlepszymi praktykami inżynierii oprogramowania.

Pytanie 33

Podczas programowania kontrolki stepper przedstawionej na ilustracji w aplikacji mobilnej, należy zarządzać zmienną, która zawsze przechowuje jej bieżącą wartość. Jakie zdarzenie można wykorzystać do osiągnięcia tej funkcjonalności?

Ilustracja do pytania
A. Unfocused
B. SizeChanged
C. ValueChanged
D. DescendantAdded
Zdarzenie ValueChanged jest kluczowe w kontekście programowania kontrolek takich jak stepper w aplikacjach mobilnych. To zdarzenie jest wywoływane zawsze, gdy wartość kontrolki zostaje zmieniona przez użytkownika, co umożliwia natychmiastowe przetwarzanie tej zmiany i aktualizację interfejsu użytkownika lub innych powiązanych komponentów. W praktyce, użycie zdarzenia ValueChanged to dobry przykład reaktywnego programowania, gdzie aplikacja reaguje na akcje użytkownika w czasie rzeczywistym. Przy implementacji takiego zdarzenia należy zadbać o poprawne sprawdzanie zakresu wartości, aby uniknąć błędów logicznych. Warto również pamiętać o optymalizacji wydajności takiej obsługi, zwłaszcza w aplikacjach złożonych z wielu komponentów zależnych od wartości steppera. Praktyczne zastosowanie tego zdarzenia można znaleźć w aplikacjach e-commerce, gdzie steppery mogą być używane do wyboru ilości produktów w koszyku, a zmiana wartości natychmiast wpływa na obliczenie ceny całkowitej. Używanie zdarzeń takich jak ValueChanged jest zgodne z dobrymi praktykami projektowania interfejsów użytkownika, poprawiając ich responsywność i interaktywność.

Pytanie 34

Jaką rolę pełni instrukcja throw w języku C++?

A. Ogranicza zasięg zmiennych w bloku try
B. Inicjuje nowy wyjątek podczas działania aplikacji
C. Zgłasza wyjątek, który można przechwycić za pomocą bloku catch
D. Przerywa działanie programu, gdy wystąpi wyjątek
Instrukcja 'throw' w C++ służy do zgłaszania wyjątków, które mogą być następnie przechwycone i obsłużone przez blok 'catch'. Mechanizm ten pozwala na przerwanie normalnego przepływu programu w przypadku wystąpienia błędu i skierowanie sterowania do odpowiedniego miejsca obsługi wyjątków. 'Throw' jest kluczowym elementem obsługi błędów i umożliwia propagowanie informacji o błędach na wyższe poziomy programu, co pozwala na ich efektywną obsługę. Używanie wyjątków poprawia czytelność kodu, umożliwiając oddzielenie logiki biznesowej od logiki obsługi błędów.

Pytanie 35

Algorytmu Euklidesa, przedstawionego na schemacie, należy użyć do obliczenia.

Ilustracja do pytania
A. Największego Wspólnego Dzielnika
B. najmniejszej liczby pierwszej w danym zakresie
C. największego elementu w zbiorze liczb
D. Najmniejszej Wspólnej Wielokrotności
Algorytm Euklidesa to klasyczna metoda stosowana do wyznaczania największego wspólnego dzielnika (NWD) dwóch liczb całkowitych. Działa na zasadzie iteracyjnego odejmowania mniejszej liczby od większej aż do momentu, gdy obie liczby staną się równe. Wtedy ta wspólna wartość jest największym wspólnym dzielnikiem. Algorytm jest bardzo efektywny, nawet dla dużych liczb, co czyni go powszechnie stosowanym w praktycznych zastosowaniach, takich jak kryptografia czy optymalizacja komputerowa. W kryptografii, szczególnie w systemach kluczy publicznych, takich jak RSA, obliczanie NWD jest kluczowe dla generowania kluczy. Algorytm Euklidesa jest też podstawą dla bardziej zaawansowanych algorytmów, takich jak rozszerzony algorytm Euklidesa, który umożliwia obliczenie również współczynników liczbowych używanych w teoretycznych dowodach matematycznych. Jego implemetacja jest również często wykorzystywana w bibliotekach matematycznych języków programowania, co świadczy o jego uniwersalności i znaczeniu w dzisiejszej technologii.

Pytanie 36

Zaprezentowany diagram ilustruje wyniki przeprowadzonych testów:

Informacje o stronie
Wyświetlenie po1.431 si
Pobieranie2.815 si
Całkowity czas wczytania4.395 si
Czas powtórnego wczytania1.609 si
Ilość przekierowań (wpisanego adresu)1i
Ilość żądań145i
Łącznie przesłane6.71 MBi
Pomijane przy powtórnym ładowaniu6.47 MB (96%)i
Rozmiar rzeczywisty8.29 MBi
A. ochrony
B. funkcjonalności
C. wydajnościowych
D. użyteczności
To właśnie są testy wydajnościowe – dokładnie takie parametry jak czasy ładowania, liczba żądań HTTP, rozmiar przesyłanych danych czy ilość przekierowań analizuje się w praktyce podczas oceny wydajności stron internetowych. Moim zdaniem ten typ testów jest absolutnie kluczowy w projektowaniu nowoczesnych aplikacji webowych, bo użytkownicy szybko rezygnują, jeśli strona się długo ładuje albo jest zbyt zasobożerna. W branży zwraca się obecnie ogromną uwagę na to, by strony były 'lekkie', szybkie i zoptymalizowane pod kątem przesyłu danych. Nawet Google premiuje szybkie serwisy w wynikach wyszukiwania, co niejeden programista już odczuł na własnej skórze. Testy wydajnościowe sprawdzają, jak aplikacja zachowuje się pod dużym obciążeniem i ile danych realnie pobierają użytkownicy. W praktyce polecam korzystać z narzędzi takich jak Google Lighthouse, WebPageTest czy nawet prosty DevTools w przeglądarce – pozwalają szybko wyłapać największe problemy z czasem ładowania. Warto też pamiętać, że optymalizacja wydajności to nie tylko lepsze wrażenia użytkownika, ale bardzo wymierne oszczędności na transferze i infrastrukturze. Dobry zwyczaj to cyklicznie monitorować te wskaźniki, nawet gdy wydaje się, że wszystko działa OK – bo sytuacja może się szybko zmienić po wdrożeniu nowych funkcjonalności lub zmianach w kodzie.

Pytanie 37

Metoda tworzenia algorytmu polegająca na dzieleniu go na dwa lub więcej mniejszych podproblemów, aż do momentu, gdy ich rozwiązanie stanie się proste, jest techniką

A. komiwojażera
B. heurystyczną
C. dziel i zwyciężaj
D. najkrótszej ścieżki
Strategia znana jako 'dziel i zwyciężaj' to sposób, w jaki można podejść do rozwiązywania problemów w algorytmice. Chodzi o to, żeby rozdzielić większy problem na mniejsze kawałki, które są już łatwiejsze do ogarnięcia. Robimy to, aż każdy z tych kawałków da się rozwiązać bez większego trudu. Jak już mamy rozwiązania tych mniejszych problemów, to je łączymy, żeby uzyskać odpowiedź na nasz pierwotny problem. Przykłady? No to mamy algorytm sortowania szybkiego (Quicksort) oraz Mergesort, które świetnie sobie radzą z porządkowaniem danych, dzieląc je na mniejsze części. Jak patrzy się na to z perspektywy analizy algorytmów, to ta strategia często prowadzi do lepszej złożoności obliczeniowej, co sprawia, że jest naprawdę przydatna w praktyce, zwłaszcza w informatyce. W książce Cormena i innych, 'Introduction to Algorithms', można znaleźć sporo informacji na temat tych metod i ich zastosowań, co czyni je naprawdę istotnymi w obszarze programowania i analizy danych.

Pytanie 38

Które z poniższych nie jest algorytmem sortowania?

A. Merge Sort
B. Quick Sort
C. Binary Search
D. Bubble Sort
Binary Search jest algorytmem, który służy do efektywnego przeszukiwania uporządkowanych zbiorów danych, a nie do sortowania. Działa na zasadzie dzielenia zbioru na pół i eliminowania połowy z nich w każdym kroku, co pozwala na szybkie znalezienie poszukiwanej wartości. Jest to przykład algorytmu o czasie działania O(log n), co sprawia, że jest znacznie szybszy od prostego przeszukiwania liniowego. Przykładowo, gdy mamy posortowaną tablicę liczb, Binary Search może być użyty do znalezienia konkretnej liczby, eliminując w każdym kroku połowę zbioru, aż do odnalezienia wartości lub stwierdzenia, że jej nie ma. W kontekście branżowym, Binary Search jest szeroko stosowany w różnych aplikacjach, gdzie wymagane jest szybkie przeszukiwanie danych, na przykład w bazach danych i aplikacjach wyszukiwania. Kluczowe jest zrozumienie różnicy między algorytmem przeszukiwania a algorytmem sortowania; sortowanie odnosi się do organizacji danych w określonym porządku, podczas gdy Binary Search koncentruje się na znajdowaniu elementów w już posortowanych zbiorach.

Pytanie 39

Która z poniższych struktur danych jest najbardziej odpowiednia do przechowywania unikalnych elementów?

A. Zbiór (Set)
B. Sekwencja
C. Tablica
D. Kolejka priorytetowa
Zbiór, czyli Set, to taki specjalny rodzaj struktury danych, który trzyma tylko unikalne elementy. To znaczy, że nie znajdziesz tam powtórzeń – jak masz listę użytkowników czy tagów, to świetnie, bo zbiór to idealnie rozwiązuje. Jest przy tym bardzo szybki w operacjach jak dodawanie, usuwanie czy wyszukiwanie. To dlatego zbory są używane w różnych algorytmach, zwłaszcza gdy chodzi o przetwarzanie dużych ilości danych i zarządzanie unikalnymi zasobami. Fajna sprawa, nie?

Pytanie 40

Który z wymienionych procesów NIE jest częścią etapu kompilacji?

A. Analiza działania programu w czasie rzeczywistym
B. Optymalizacja kodu
C. Tłumaczenie kodu źródłowego na język maszynowy
D. Weryfikacja błędów składniowych
Analiza działania programu w czasie rzeczywistym nie należy do etapu kompilacji, lecz do etapu wykonywania programu. Kompilacja obejmuje tłumaczenie kodu źródłowego na język maszynowy, optymalizację kodu i weryfikację błędów składniowych. Analiza w czasie rzeczywistym to rola debuggera, który działa na uruchomionym programie i umożliwia śledzenie jego działania krok po kroku.