Wyniki egzaminu

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

Egzamin zdany!

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

Jakie jest oznaczenie komentarza wieloliniowego w języku Java?

A. // ... //
B. <!-- ... -->
C. """ ... """
D. /* ... */
Komentarze wieloliniowe w języku Java zapisuje się właśnie w taki sposób: /* ... */. Taki zapis pozwala na umieszczenie kilku linii tekstu między znakami otwierającym /* i zamykającym */, które kompilator całkowicie ignoruje podczas tłumaczenia kodu. Z mojego doświadczenia to jest najwygodniejsza forma, kiedy trzeba wyłączyć większy fragment kodu – np. część algorytmu, której chwilowo nie chcemy wykonywać lub większy blok dokumentacji. Bardzo często używa się komentarzy wieloliniowych przy pisaniu tzw. docstringów, choć w Javie do dokumentacji API lepiej stosować komentarze JavaDoc z podwójnym ukośnikiem i gwiazdką (/** ... */), ale zwykłe /* ... */ są super uniwersalne – czy to na zajęciach, czy w dużych projektach zespołowych. Moim zdaniem, jeśli uczysz się Javy, warto pamiętać, żeby nie mieszać komentarzy wieloliniowych z jednoliniowymi (// ...), bo to czasem prowadzi do zamieszania, szczególnie przy większych refaktoryzacjach. Co ciekawe, takie same komentarze znajdziesz też w C czy C++, więc jak ktoś zna te języki, to szybko się odnajdzie. W sumie to prosta sprawa, ale zdziwiłbyś się ile osób próbuje stosować inne formaty, które działają w zupełnie innych technologiach. No i jeszcze taka drobna uwaga z praktyki: nigdy nie wstawiaj komentarza wieloliniowego wewnątrz innego; Java tego nie obsługuje i kompilator się pogubi.

Pytanie 2

Co oznacza akronim IDE w kontekście programowania?

A. Zintegrowane Środowisko Debugowania
B. Interaktywny Edytor Debugowania
C. Integrated Development Environment
D. Interaktywny Silnik Programistyczny
IDE, czyli Zintegrowane Środowisko Programistyczne, to naprawdę przydatne narzędzie. Zajmuje się nie tylko edytowaniem kodu, ale łączy w sobie kompilator, debugger i wiele innych rzeczy, które pomagają w tworzeniu oprogramowania. Dzięki IDE można szybciej pisać programy i lepiej ogarniać projekty. A najpopularniejsze z nich, jak Visual Studio, IntelliJ IDEA czy Eclipse, wspierają różne języki programowania, więc są bardzo uniwersalne. Moim zdaniem, korzystanie z IDE to prawie obowiązek dla każdego programisty!

Pytanie 3

Które słowo kluczowe w C++ służy do definiowania klasy nadrzędnej?

A. virtual
B. public
C. class
D. base
Słowo kluczowe 'class' jest podstawowym elementem języka C++ i służy do deklarowania klasy. Definiuje ono strukturę zawierającą pola (zmienne) oraz metody (funkcje członkowskie), które określają zachowanie obiektu. 'Class' pozwala na enkapsulację danych, co oznacza ukrywanie implementacji wewnętrznej i udostępnianie interfejsu publicznego. Dzięki temu klasy stanowią podstawę programowania obiektowego, umożliwiając organizację kodu w logiczne jednostki. Przykładowa deklaracja klasy w C++ wygląda następująco: 'class Samochod { public: void Jedz(); private: int predkosc; };'.

Pytanie 4

Jakie cechy powinien posiadać skuteczny negocjator?

A. lojalność, nieśmiałość, uczciwość
B. dobra reputacja, przekora, porywczość
C. asertywność, pesymizm, buta
D. intuicja, cierpliwość, asertywność
Skuteczny negocjator powinien mieć zestaw cech, które pozwolą mu osiągać kompromisy, rozwiązywać konflikty i dążyć do korzystnych rozwiązań dla obu stron. Intuicja pozwala wyczuć nastroje rozmówcy, wychwycić niewerbalne sygnały i przewidywać możliwe zagrożenia czy okazje jeszcze zanim druga strona je wprost zasygnalizuje. Cierpliwość jest kluczowa, bo proces dochodzenia do porozumienia bywa żmudny, a presja czasu często prowadzi do pochopnych decyzji. Często miałem okazję obserwować, że ci, którzy potrafią zaczekać na ruch drugiej strony, zyskują przewagę negocjacyjną. Asertywność natomiast pozwala jasno wyrażać swoje oczekiwania i granice, bez agresji i bez uległości – to klasyka wśród dobrych praktyk negocjacyjnych, choć nadal niedoceniana w wielu branżach. Asertywność pomaga uniknąć niedomówień i manipulacji, a także buduje szacunek. W praktyce, na sali negocjacyjnej czy nawet przy codziennych rozmowach z klientami, zestaw tych trzech cech daje naprawdę mocną pozycję. Moim zdaniem nie ma jednego uniwersalnego szablonu, ale właśnie intuicja, cierpliwość i asertywność pojawiają się prawie zawsze w podręcznikach czy na szkoleniach dedykowanych profesjonalistom. Warto je ćwiczyć na co dzień, nawet poza pracą, bo to się po prostu opłaca.

Pytanie 5

Które z podanych logo reprezentuje narzędzie, które nie jest używane do tworzenia aplikacji mobilnych?

Ilustracja do pytania
A. 4
B. 3
C. 1
D. 2
Wiele osób myli narzędzia do tworzenia aplikacji internetowych z tymi do natywnych aplikacji mobilnych, szczególnie gdy chodzi o popularne frameworki. Android Studio to środowisko dedykowane budowie aplikacji mobilnych na system Android – bez niego trudno wyobrazić sobie profesjonalny rozwój na tę platformę. Xcode natomiast to narzędzie, bez którego nie ma sensu zaczynać pracy nad aplikacjami na iOS, bo Apple stawia bardzo konkretne wymagania dotyczące narzędzi i kompilatorów. Xamarin pozwala pisać aplikacje mobilne w C#, co sprawia, że można tworzyć jednocześnie wersje na Androida i iOS przy wykorzystaniu wspólnej bazy kodu – to bardzo popularne podejście w korporacyjnych środowiskach, gdzie trzeba minimalizować koszty utrzymania kilku aplikacji. Tymczasem Angular jest frameworkiem do budowy nowoczesnych aplikacji webowych i o ile istnieją technologie (np. Ionic), które pozwalają zamknąć aplikację webową w kontenerze mobilnym, to nie jest to tożsame z budowaniem natywnych aplikacji mobilnych. W praktyce rozwiązania hybrydowe często mają ograniczenia wydajnościowe i nie zapewniają pełnego dostępu do funkcji systemowych, przez co w środowisku profesjonalnych deweloperów traktowane są raczej jako półśrodek niż standard. Wybierając Angulara jako narzędzie do budowy natywnych aplikacji mobilnych można popełnić błąd strategiczny i napotkać trudności z rozwojem produktu, zwłaszcza gdy zależy nam na responsywności i głębokiej integracji z systemem operacyjnym. Takie błędne założenia prowadzą często do frustracji zespołów developerskich i wydłużenia czasu pracy nad projektem.

Pytanie 6

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

class Animal {
  constructor(name) {
    this.name = name;
  }
  speak() {
    return `${this.name} makes a noise.`;
  }
}

class Dog extends Animal {
  speak() {
    return `${this.name} barks.`;
  }
}

let dog = new Dog('Rex');
console.log(dog.speak());
A. undefined
B. Rex barks.
C. Error: speak is not defined
D. Rex makes a noise.
Odpowiedzi, które sugerują inne wyniki, wynikają z nieporozumień dotyczących dziedziczenia w programowaniu obiektowym. Na przykład, stwierdzenie, że wynik to 'Rex makes a noise.', wynika z założenia, że metoda speak() z klasy Animal jest zawsze wywoływana. W rzeczywistości, gdy klasa Dog nadpisuje tę metodę, to właśnie jej wersja jest używana. Nie ma więc możliwości, aby metoda speak() z klas Animal została wywołana dla obiektu dog. Inna nieprawidłowa odpowiedź sugeruje, że wynik to 'undefined'. To może wynikać z mylenia wywołania metody z błędnym odniesieniem do obiektu. Metoda speak() jest zdefiniowana poprawnie i jeśli jest wywoływana na obiekcie dog, zwraca wynik zgodny z jej definicją. Podobnie, odpowiedź wskazująca na błąd "Error: speak is not defined" wskazuje na zrozumienie, że metoda speak() nie istnieje, co jest nieprawdziwe w kontekście obiektu typu Dog, który ma tę metodę zdefiniowaną. Kluczowe jest zrozumienie, jak działa dziedziczenie i jak metody mogą być nadpisywane w podklasach, co jest jedną z podstaw programowania obiektowego. Warto również zwrócić uwagę na to, jak ważne jest testowanie i weryfikacja kodu, aby unikać takich powszechnych pułapek w przyszłych projektach.

Pytanie 7

Jakie środowisko deweloperskie jest powszechnie wykorzystywane do produkcji aplikacji webowych w języku Java?

A. PyCharm
B. Eclipse
C. XCode
D. Android Studio
Eclipse to jedno z najpopularniejszych środowisk programistycznych (IDE) wykorzystywanych do tworzenia aplikacji webowych w języku Java. Jest to potężne narzędzie, które wspiera zarówno tworzenie aplikacji desktopowych, jak i rozbudowanych systemów backendowych. Eclipse oferuje wiele wtyczek i rozszerzeń umożliwiających integrację z narzędziami do zarządzania bazami danych, serwerami aplikacji oraz systemami kontroli wersji. Dzięki temu programiści mogą efektywnie budować i testować aplikacje webowe napisane w Javie.

Pytanie 8

Która biblioteka JavaScript jest najczęściej używana do tworzenia testowalnych funkcji asynchronicznych?

A. D3.js
B. Moment.js
C. Underscore.js
D. Axios
Axios jest jedną z najpopularniejszych bibliotek JavaScript używanych do obsługi żądań HTTP, zwłaszcza w kontekście asynchronicznych operacji. Umożliwia łatwe tworzenie funkcji asynchronicznych, które mogą komunikować się z serwerami. Dzięki wsparciu dla obietnic (Promises), Axios pozwala na prostsze zarządzanie wynikami operacji asynchronicznych. Przykładowo, można użyć go do wykonywania zapytań do API w aplikacjach webowych. Przy pomocy Axios, developerzy mogą łatwo wysyłać żądania GET, POST i inne, a także obsługiwać odpowiedzi i błędy. Z perspektywy dobrych praktyk, Axios wspiera interceptory, które pozwalają na globalne zarządzanie zapytaniami i odpowiedziami, co jest szczególnie przydatne w dużych aplikacjach. Co więcej, Axios obsługuje również anulowanie żądań, co może być istotne w kontekście użytkowników, którzy mogą na przykład zmienić zdanie przed zakończeniem operacji. Takie cechy czynią Axios narzędziem niezwykle przydatnym w nowoczesnym programowaniu JavaScript.

Pytanie 9

Który z wymienionych dokumentów jest najczęściej stosowany w zarządzaniu pracą zespołu Scrum?

A. Diagram Gantta
B. Specyfikacja techniczna
C. Lista zasobów ludzkich
D. Product backlog
Diagram Gantta jest fajnym narzędziem do pokazywania harmonogramu, ale nie ma go w zarządzaniu backlogiem. Specyfikacja techniczna to co innego – tam są szczegóły implementacyjne, a nie priorytety funkcji. Lista zasobów ludzkich to temat o zarządzaniu personelem, a nie o zadaniach i priorytetach w Scrumie. Więc tu bardziej musisz uważać na to, co do czego pasuje.

Pytanie 10

Który z poniższych elementów jest częścią architektury PWA (Progressive Web App)?

A. Service Worker
B. DOM Renderer
C. Virtual Machine
D. Media Encoder
Service Worker to kluczowy element architektury Progressive Web App (PWA), który umożliwia działania offline, zarządzanie pamięcią podręczną oraz lepsze doświadczenie użytkownika. Działa on jako pośrednik między aplikacją a serwerem, co pozwala na interceptowanie zapytań sieciowych i dostarczanie zasobów z pamięci podręcznej, gdy sieć jest niedostępna. Dzięki temu użytkownicy mogą korzystać z aplikacji nawet w trybie offline. Service Workers są również odpowiedzialne za powiadomienia push, co zwiększa interaktywność aplikacji. W praktyce oznacza to, że można zbudować aplikację, która działa płynnie na różnych platformach (desktop, mobilne), zachowując przy tym szybkość i responsywność. Warto zaznaczyć, że Service Workers muszą być zarejestrowane na stronie obsługiwanej przez HTTPS, co jest jednym z wymogów bezpieczeństwa. Stosowanie Service Workerów jest zgodne z najlepszymi praktykami branżowymi, a ich implementacja znacząco podnosi jakość i użyteczność aplikacji webowych.

Pytanie 11

Jakie znaczenie ma polimorfizm w programowaniu obiektowym?

A. Dzieli program na klasy oraz obiekty
B. Pozwala na tworzenie obiektów z wielu różnych klas równocześnie
C. Umożliwia jednej metodzie działać w różnorodny sposób w zależności od klasy, do której należy
D. Ogranicza dostęp do atrybutów klasy
Polimorfizm to zdolność obiektów do używania tej samej metody lub interfejsu, ale z różnymi implementacjami, w zależności od klasy obiektu. Dzięki polimorfizmowi można wywołać metodę `obiekt.wyswietl()`, która zachowuje się inaczej w klasie `Samochod` i inaczej w klasie `Motocykl`, mimo że nazwa metody pozostaje taka sama. Polimorfizm ułatwia rozbudowę aplikacji, ponieważ nowe klasy mogą być dodawane bez modyfikacji istniejącego kodu, co zwiększa elastyczność i rozszerzalność programu. Jest to jedna z najważniejszych zasad programowania obiektowego, obok dziedziczenia i hermetyzacji.

Pytanie 12

Jakie jest zadanie interpretera?

A. analiza składni całego programu przed jego uruchomieniem
B. optymalizacja większej części kodu, aby przyspieszyć jego wykonanie
C. wykonywanie skryptu krok po kroku
D. tłumaczenie kodu na kod maszynowy
Interpreter to takie narzędzie, które wykonuje kod linijka po linijce. Działa to tak, że odczytuje program napisany w języku wysokiego poziomu, weryfikuje co tam w nim siedzi i od razu realizuje polecenia, co sprawia, że można fajnie testować kod. Na przykład w Pythonie można łatwo sprawdzić różne fragmenty kodu, co jest mega pomocne przy pisaniu i poprawianiu oprogramowania. Wiesz, od kompilatora różni się tym, że kompilator przetwarza cały kod od razu, tworząc kod maszynowy, który później działa na komputerze. Dzięki temu interpreter jest bardziej elastyczny, można szybko przetestować nowe pomysły, ale z drugiej strony, czasami nie działa tak efektywnie jak skompilowane programy, bo każda linia kodu jest analizowana na bieżąco. Więc w przypadku dużych i wymagających aplikacji lepiej sprawdzają się kompilatory, ale interpreter to skarb, zwłaszcza w nauce i prototypowaniu.

Pytanie 13

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

A. zmiennoprzecinkowy
B. logiczny
C. łańcuchowy
D. stałoprzecinkowy
Typ łańcuchowy w MySQL odnosi się do przechowywania danych tekstowych, takich jak VARCHAR czy CHAR, które są używane do przechowywania łańcuchów znaków. W przeciwieństwie do typu DECIMAL, nie ma on zastosowania do reprezentacji wartości numerycznych, co sprawia, że nie nadaje się do obliczeń matematycznych wymagających precyzji. Typ zmiennoprzecinkowy (FLOAT, DOUBLE) z kolei jest używany do przechowywania liczb, które mogą obejmować wartości z przecinkiem dziesiętnym, ale mogą cierpieć na problemy z precyzją, ponieważ są reprezentowane w formie binarnej. Ze względu na sposób przechowywania, liczby zmiennoprzecinkowe mogą prowadzić do niezamierzonych błędów zaokrągleń, co czyni je mniej odpowiednimi w kontekście finansowym. Typ logiczny (BOOLEAN) ma na celu przechowywanie wartości prawda/fałsz i nie jest dostosowany do przechowywania wartości liczbowych. Podsumowując, wszystkie trzy wymienione typy są nieodpowiednie do przechowywania liczb dziesiętnych z określoną precyzją, co stanowi kluczową cechę typu DECIMAL, który oferuje większą kontrolę nad dokładnością obliczeń.

Pytanie 14

Jaki framework umożliwia tworzenie interaktywnych interfejsów użytkownika w języku TypeScript?

A. ASP.NET Core
B. jQuery
C. Django
D. Angular
Angular to popularny framework oparty na TypeScript, który umożliwia tworzenie dynamicznych i rozbudowanych interfejsów użytkownika. Jest rozwijany przez Google i używany do budowy aplikacji typu Single Page Applications (SPA), które cechują się płynnością działania i interaktywnością. Angular oferuje bogaty ekosystem narzędzi wspierających programistów, takich jak Angular CLI, który pozwala na szybkie generowanie komponentów, serwisów i modułów. Wsparcie dla TypeScript oznacza, że Angular pozwala na wykorzystywanie typów, interfejsów oraz zaawansowanych narzędzi do refaktoryzacji kodu, co przekłada się na większą czytelność i bezpieczeństwo aplikacji. Dzięki modularnej architekturze Angular wspiera tworzenie aplikacji, które są łatwe w utrzymaniu i skalowaniu. Jego dwukierunkowe wiązanie danych (two-way data binding) oraz możliwość dynamicznej aktualizacji widoków czynią go jednym z liderów na rynku frameworków frontendowych.

Pytanie 15

Początkowym celem środowisk IDE takich jak: lntellij IDEA, Eclipse, NetBeans jest programowanie w języku

A. Python
B. C++
C. Java
D. C#
Środowiska IDE, takie jak IntelliJ IDEA, Eclipse oraz NetBeans, zostały zaprojektowane z myślą o programowaniu w języku Java, który jest jednym z najpopularniejszych języków programowania na świecie. Te zintegrowane środowiska deweloperskie oferują szereg narzędzi i funkcji, które znacznie ułatwiają proces tworzenia aplikacji w Java. Przykładowo, IntelliJ IDEA, stworzony przez firmę JetBrains, dostarcza wsparcie dla automatycznego uzupełniania kodu, refaktoryzacji oraz analizy statycznej, co przyspiesza cykl rozwoju oprogramowania. Eclipse, będący otwartym oprogramowaniem, umożliwia rozszerzanie swoich funkcji poprzez wtyczki, co czyni go elastycznym narzędziem dla programistów. NetBeans, z kolei, zapewnia łatwe w użyciu interfejsy oraz wsparcie dla wielu technologii związanych z Java, takich jak JavaFX czy Java EE, co czyni go idealnym wyborem dla rozwoju aplikacji webowych i desktopowych. Zgodnie z przyjętymi standardami w branży, Java jest językiem obiektowym, który charakteryzuje się wysoką przenośnością oraz bezpieczeństwem, co czyni go atrakcyjnym wyborem dla wielu projektów komercyjnych oraz edukacyjnych.

Pytanie 16

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

A. TCP
B. UDP
C. IP
D. HTTP
Protokół IP (Internet Protocol) działa na poziomie sieci i jest odpowiedzialny za adresowanie oraz routing pakietów w sieci, ale nie zapewnia niezawodności w przesyłaniu danych. IP może dostarczać pakiety w dowolnej kolejności, a także nie oferuje mechanizmów do ponownego przesyłania utraconych danych. Z tego powodu nie jest odpowiedni do zastosowań wymagających gwarancji dostarczenia. Z kolei UDP (User Datagram Protocol) jest protokołem transportowym, który również nie zapewnia niezawodności. UDP umożliwia szybkie przesyłanie danych bez ustanawiania połączenia, co czyni go idealnym dla aplikacji takich jak strumieniowanie audio i wideo, gdzie opóźnienia są mniej krytyczne niż utrata niektórych pakietów. Wreszcie, HTTP (Hypertext Transfer Protocol) jest protokołem aplikacyjnym, który działa na szczycie TCP, ale nie jest odpowiedzialny za przesyłanie danych w niezawodny sposób samodzielnie, ponieważ korzysta z TCP, aby zapewnić te funkcje. HTTP używa TCP do transportu danych, co oznacza, że niezawodność komunikacji nie jest bezpośrednio przypisana do HTTP, ale raczej do protokołu, na którym jest oparty.

Pytanie 17

Co to jest Continuous Integration (CI)?

A. Metoda ciągłego monitorowania wydajności aplikacji w produkcji
B. Technika tworzenia aplikacji mobilnych w sposób przyrostowy
C. Protokół komunikacji między różnymi częściami aplikacji
D. Praktyka automatycznego integrowania kodu w repozytorium wspólnym wraz z testami
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 18

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. Bez względu na zastosowany sposób, w zmiennej b zawsze uzyskamy ten sam rezultat.
B. Drugi zapis nie jest zgodny ze składnią, co doprowadzi do błędów kompilacji.
C. Tylko przy użyciu pierwszego zapisu zmienna a zostanie zwiększona o 1.
D. Wartość zmiennej b będzie wyższa po użyciu drugiego zapisu w porównaniu do pierwszego.
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 19

Jaką funkcję spełniają atrybuty klasy w programowaniu obiektowym?

A. Umożliwiają przeprowadzanie operacji na obiektach
B. Zawierają informacje opisujące stan obiektu
C. Zapisują wartości lokalne w funkcjach
D. Określają globalne stałe programu
Zmienne lokalne w metodach przechowują wartości tymczasowe i są usuwane po zakończeniu wykonywania metody, co odróżnia je od pól klasy, które istnieją tak długo, jak istnieje obiekt. Stałe globalne programu są dostępne z każdego miejsca w kodzie, ale nie są związane z konkretną instancją obiektu – ich wartość nie zmienia się dla różnych obiektów. Operacje wykonywane na obiektach są definiowane przez metody klasy, a nie przez pola – pola jedynie przechowują dane, natomiast metody określają zachowanie obiektów i umożliwiają interakcję z nimi.

Pytanie 20

Jakie są różnice między konstruktorem a zwykłą metodą w klasie?

A. Konstruktor jest uruchamiany jedynie przez destruktor
B. Konstruktor można wywołać bez konieczności tworzenia obiektu
C. Konstruktor zawsze nosi tę samą nazwę co klasa i nie zwraca wartości
D. Konstruktor powinien zwracać jakąś wartość
Konstruktor nie zwraca wartości, w przeciwieństwie do zwykłych metod klasy, które mogą zwracać typy danych (`int`, `float`, `string`). Konstruktor nie może być wywoływany bez tworzenia obiektu – jest to mechanizm związany wyłącznie z procesem inicjalizacji obiektu. Destruktor, a nie konstruktor, jest wywoływany po zakończeniu życia obiektu w celu zwolnienia zasobów. Konstruktor jest pierwszą metodą, która działa podczas tworzenia obiektu, co odróżnia go od destruktora, który działa na końcu życia obiektu.

Pytanie 21

Aby wykorzystać framework Django, należy pisać w języku

A. C#
B. JavaScript
C. Python
D. Java
Framework Django został zaprojektowany specjalnie dla języka Python i z tego powodu wszystkie projekty, aplikacje czy rozszerzenia w Django realizuje się właśnie w tym języku. To nie jest przypadek – Python od lat cieszy się ogromną popularnością w branży webowej, między innymi dzięki swojej czytelności i elastyczności. Moim zdaniem to właśnie ta prostota składni Pythona sprawia, że tak łatwo zacząć nawet większe projekty – nie trzeba tracić czasu na walkę z zawiłościami języka. W praktyce programiści korzystający z Django piszą zarówno widoki, modele, jak i całą logikę aplikacji w Pythonie, wykorzystując przy tym liczne biblioteki i narzędzia tego ekosystemu. Django jest zgodny z filozofią DRY (Don’t Repeat Yourself), co oznacza, że kod w Pythonie staje się bardzo zwięzły i przejrzysty. Często można spotkać się z opinią, że nauka Django to świetny sposób na wejście w świat programowania webowego – sam się z tym zgadzam. Warto wiedzieć, że ogromna społeczność Pythona i Django oferuje mnóstwo wsparcia, dokumentacji oraz gotowych rozwiązań, co na co dzień ułatwia pracę. Tylko w Pythonie zbudujesz pełnoprawną aplikację w Django, bo framework ten nie wspiera innych języków – to się po prostu nie uda, nawet jeśli ktoś próbuje kombinować z integracjami. Widać to choćby po oficjalnych tutorialach i dokumentacji – wszystko, od konfiguracji po deployment, opiera się na pythonowych narzędziach.

Pytanie 22

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

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

Pytanie 23

Która z poniższych metod najlepiej nadaje się do wizualnego przedstawienia procesu decyzyjnego?

A. Drzewo decyzyjne
B. Schemat blokowy
C. Pseudokod
D. Lista kroków
Drzewo decyzyjne to rzeczywiście najlepsza metoda wizualnego przedstawienia procesu decyzyjnego, ponieważ zostało stworzone dokładnie w tym celu. Jego struktura hierarchiczna idealnie oddaje naturę podejmowania decyzji - zaczynamy od głównego problemu, a następnie rozgałęziamy się na kolejne możliwości w zależności od wybranych opcji. Drzewo decyzyjne pozwala na przejrzyste zobrazowanie wszystkich możliwych ścieżek, jakie może obrać proces w zależności od podjętych wyborów. Każdy węzeł reprezentuje punkt decyzyjny, gałęzie symbolizują dostępne opcje, a liście pokazują końcowe rezultaty. Dzięki temu można łatwo analizować konsekwencje każdej decyzji i porównywać różne scenariusze. Ta metoda znajduje szerokie zastosowanie w biznesie, medycynie, informatyce oraz analizie ryzyka. Pamiętaj o tej wiedzy - umiejętność wyboru odpowiedniego narzędzia wizualizacji jest kluczowa w pracy analitycznej.

Pytanie 24

Przedstawiony na filmie kod napisany w języku C++ nie kompiluje się. Co należy zmienić w tym kodzie, aby proces kompilacji wykonał się bez błędów?

A. poprawnie zapisać warunek w instrukcji if w linii 11, np. sprawdz(x)==true
B. dodać deklarację funkcji sprawdz przed funkcją main
C. zadeklarować zmienną sprawdz przed jej wykorzystaniem w linii 11
D. naprawić błąd w funkcji sprawdz, który polega na braku nawiasów {} w pętli for
Wielu początkujących programistów skupia się na szczegółach składniowych lub drobiazgach logicznych, kiedy pojawia się błąd kompilacji w C++. Jednak często przyczyną jest coś bardzo podstawowego, jak brak deklaracji funkcji przed jej użyciem. Jeśli chodzi o zapis warunku w instrukcji 'if', to kompilator nie zgłasza błędu, gdy używamy wyrażenia typu 'if (sprawdz(x))' – to całkowicie poprawna składnia, a dopisywanie '==true' jest redundantne i nie wnosi niczego nowego. Bardzo często widzę, że ktoś skupia się na tym, żeby warunek koniecznie porównywać do true, ale tak naprawdę to kwestia stylu, nie poprawności. Pozostawienie nawiasów klamrowych w pętli for jest oczywiście dobrą praktyką, ale ich brak nie zawsze generuje błąd kompilacji, jeśli pętla ma tylko jedną instrukcję. Kompilator C++ potrafi to rozpoznać i nie zgłasza błędu – sprowadza się to bardziej do czytelności i unikania błędów logicznych niż do samej poprawności kompilacji. Odpowiedź dotycząca deklarowania zmiennej 'sprawdz' to już nieporozumienie – 'sprawdz' to funkcja, a nie zmienna, więc nie deklarujemy jej w ten sposób. Ten błąd pokazuje, jak łatwo pomylić pojęcia w językach programowania, zwłaszcza jeśli dopiero zaczynamy przygodę z kodowaniem. Główna zasada, którą warto tu zapamiętać, to: każda funkcja używana przed jej zdefiniowaniem musi być zadeklarowana – to właśnie tego brakuje w typowym przykładzie z pytania. Bez deklaracji kompilator nie wie, jaką sygnaturę ma funkcja, a to skutkuje błędem już na poziomie kompilacji. Z mojego doświadczenia wynika, że takie drobne rzeczy potrafią skutecznie utrudnić życie, dlatego warto czytać komunikaty kompilatora i znać podstawowe zasady działania języka C++.

Pytanie 25

Jaki jest podstawowy okres ochrony autorskich praw majątkowych w krajach Unii Europejskiej?

A. 75 lat od daty powstania utworu
B. Bezterminowo
C. 50 lat od chwili pierwszej publikacji utworu
D. 70 lat od zgonu autora
Podstawowy czas trwania autorskich praw majątkowych w Unii Europejskiej wynosi 70 lat od śmierci autora. Oznacza to, że przez ten okres twórca lub jego spadkobiercy mają wyłączne prawo do korzystania z utworu i czerpania z niego korzyści finansowych. Po upływie tego czasu dzieło przechodzi do domeny publicznej i może być swobodnie wykorzystywane przez każdego, bez konieczności uzyskania zgody. Długość ochrony praw autorskich została ujednolicona w ramach przepisów UE, aby zagwarantować spójność w całej wspólnocie i wspierać ochronę kultury oraz dziedzictwa narodowego.

Pytanie 26

Zasada programowania obiektowego, która polega na ukrywaniu elementów klasy tak, aby były one dostępne wyłącznie dla metod tej klasy lub funkcji zaprzyjaźnionych, to

A. polimorfizm
B. wyjątki
C. hermetyzacja
D. dziedziczenie
Hermetyzacja to taka esencja programowania obiektowego, która polega na ukrywaniu szczegółów implementacyjnych wewnątrz klasy. Dzięki temu tylko wybrane fragmenty kodu mają dostęp do danych czy metod, które faktycznie powinny być widoczne na zewnątrz. W praktyce sprowadza się to do korzystania z modyfikatorów dostępu, takich jak private, protected czy public, co jest podstawą w językach takich jak Java, C++ czy C#. Daje to ogromną przewagę, bo ochrania dane przed przypadkowymi (albo celowymi!) zmianami z zewnątrz. Z mojego doświadczenia wynika, że dobrze zaprojektowana hermetyzacja sprawia, że kod jest bardziej przejrzysty i łatwiejszy do testowania i utrzymania. Przykład? Załóżmy, że mamy klasę KontoBankowe i chcemy, żeby saldo dało się zmieniać tylko poprzez wpłatę i wypłatę, a nie żeby każdy mógł ustawić dowolną kwotę. Wtedy pole 'saldo' robimy private, a dostęp dajemy przez metody public wpłata() i wypłata(). Branżowe praktyki, np. SOLID, wręcz podkreślają wagę hermetyzacji. Ułatwia to też refaktoryzację – jeśli coś zmienisz w środku klasy, a interfejs zewnętrzny zostaje taki sam, reszta programu nawet nie zauważy. Także, moim zdaniem, bez hermetyzacji nie ma sensownego programowania obiektowego – to absolutna podstawa.

Pytanie 27

Jakie informacje można uzyskać na temat metod w klasie Point?

public class Point {
    public void Move(int x, int y) {...}
    public void Move(int x, int y, int z) {...}
    public void Move(Point newPt) {...}
}
A. Są przeciążone.
B. Zawierają przeciążenie operatora.
C. Służą jako konstruktory w zależności od liczby argumentów.
D. Zawierają błąd, ponieważ nazwy metod powinny być różne.
Metody przeciążone mogą mieć tę samą nazwę – różnią się sygnaturą, czyli liczbą i typami argumentów, co jest zgodne z zasadami programowania obiektowego. Przeciążenie metod to nie to samo co przeciążenie operatorów, które polega na definiowaniu nowego sposobu działania operatorów (np. +, -, *). Pełnienie funkcji konstruktorów to inny mechanizm i dotyczy głównie klas i ich instancjonowania, nie przeciążania metod.

Pytanie 28

Jakie pola powinny być umieszczone w klasie nadrzędnej w strukturze dziedziczenia?

A. Pola, które są wykorzystywane tylko w funkcjach statycznych
B. Pola, które są wspólne dla wszystkich klas pochodnych
C. Pola, które są tylko prywatne
D. Pola, które są charakterystyczne jedynie dla pojedynczej klasy pochodnej
Pola specyficzne dla jednej klasy pochodnej nie powinny znajdować się w klasie bazowej, ponieważ zwiększałoby to złożoność i naruszało zasadę separacji odpowiedzialności. Prywatne pola są ukryte i nie są dziedziczone przez klasy pochodne – są dostępne wyłącznie w ramach klasy, w której zostały zdefiniowane. Pola używane wyłącznie w metodach statycznych nie muszą znajdować się w klasie bazowej, ponieważ są to elementy niezależne od instancji klasy i są przypisane do samej klasy, a nie jej obiektów.

Pytanie 29

W jakiej metodzie zarządzania projektami nacisk kładzie się na ograniczenie marnotrawstwa?

A. Prototypowy
B. Kanban
C. Waterfall
D. Scrum
Kanban to metodologia zarządzania projektem, która koncentruje się na minimalizacji marnotrawstwa i optymalizacji przepływu pracy. Kluczowym elementem Kanbanu jest wizualizacja procesu za pomocą tablicy, na której znajdują się zadania w różnych fazach realizacji. Dzięki temu zespół może łatwo identyfikować wąskie gardła i eliminować zbędne procesy. Kanban promuje ciągłe doskonalenie (kaizen) i pozwala na dostosowywanie się do zmieniających się priorytetów bez konieczności reorganizacji całego projektu. Ta metodologia jest szeroko stosowana w branży IT, produkcji oraz w zespołach operacyjnych, które wymagają dużej elastyczności.

Pytanie 30

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

A. Przekłada kod źródłowy na język maszynowy w trakcie działania programu
B. Łączy kod źródłowy z zewnętrznymi bibliotekami
C. Zoptymalizowuje wydajność aplikacji w środowisku produkcyjnym
D. Generuje plik wykonywalny dla systemu operacyjnego
Interpreter tłumaczy kod źródłowy na język maszynowy instrukcja po instrukcji, co oznacza, że każda linia kodu jest analizowana i wykonywana na bieżąco. Dzięki temu programy interpretowane, takie jak te w Pythonie, Ruby czy JavaScript, mogą być szybko testowane i uruchamiane bez konieczności wcześniejszej kompilacji. Interpretacja pozwala na elastyczność w procesie rozwoju, ponieważ zmiany w kodzie są widoczne natychmiast po zapisaniu pliku. To czyni interpreter idealnym narzędziem do prototypowania i budowania aplikacji w dynamicznych środowiskach.

Pytanie 31

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. Niepoprawnie zdefiniowano działanie wewnątrz funkcji.
B. Funkcja zwraca wartość, chociaż nie powinna jej zwracać.
C. Argument funkcji został przekazany przez wartość, a nie przez referencję.
D. Zmienna x powinna być inicjowana wartością równą 1, a nie 0.
Błąd związany z przekazywaniem argumentu przez wartość, a nie przez referencję, to klasyka w C++. W tym kodzie zmienna x idzie jako kopia, więc zmiany w oblicz nie wpływają na oryginał w main. Może popełniłeś błąd, bo nie do końca rozumiesz różnicę między tymi dwoma metodami. Te inne odpowiedzi wskazują na różne problemy, jak źle zainicjowana zmienna czy błędy w zwracaniu wartości. Ale w oblicz wszystko powinno działać poprawnie, bo zwraca wartość typu int, a problem leży w tym, że przekazujesz kopię argumentu. Warto pamiętać, że poprawny kod wymaga sensownego przepływu wartości między funkcjami i zrozumienia, że x w main nie zmienia się, bo modyfikujesz kopię. Często mylimy to i myślimy, że zmiany w funkcji wpływają na oryginały, a w C++ musisz użyć referencji albo wskaźników, żeby to zadziałało. Zrozumienie tego jest kluczowe, żeby dobrze ogarniać funkcje w C++ i unikać takich problemów w przyszłości.

Pytanie 32

Który z wymienionych poniżej typów danych stanowi przykład typu stałoprzecinkowego?

A. decimal
B. int
C. float
D. double
Typ 'float' przechowuje liczby zmiennoprzecinkowe, co oznacza, że może reprezentować wartości z częściami dziesiętnymi, ale nie jest to typ stałoprzecinkowy. Typ 'double' to również typ zmiennoprzecinkowy, charakteryzujący się większą precyzją niż 'float'. Typ 'decimal' służy do przechowywania liczb zmiennoprzecinkowych z dużą dokładnością, głównie w aplikacjach finansowych, gdzie precyzja jest kluczowa, ale nie zalicza się do typów stałoprzecinkowych.

Pytanie 33

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

A. obsługa interakcji użytkownika, stworzenie UI
B. przechowywanie ściągniętych i przetworzonych informacji
C. zarządzanie logiką aplikacji - obejmuje wdrażanie algorytmów
D. przekazywanie danych do widoku oraz wymiana informacji z modelem
W architekturze MVVM widok pełni bardzo specyficzną rolę i to jest właśnie to, co odróżnia ją od innych popularnych podejść – na przykład MVC. Widok w MVVM powinien być odpowiedzialny głównie za prezentację danych i obsługę interakcji użytkownika, czyli właśnie to, na czym skupia się poprawna odpowiedź. Moim zdaniem, praktyka pokazuje, że warto traktować widok jako „wyświetlacz” i „słuchacza”, który reaguje na działania użytkownika, takie jak kliknięcia, wpisywanie tekstu czy wybór z menu. Nie ma tu miejsca na żadną logikę biznesową – to już zadanie ViewModelu oraz Modelu. Typowe przykłady? W aplikacji desktopowej na WPF widok to XAML z prostymi eventami. W aplikacji mobilnej – layouty i fragmenty obsługujące zdarzenia UI. Dobrym zwyczajem jest też korzystanie z mechanizmów data binding, dzięki czemu widok automatycznie aktualizuje się, gdy zmienią się dane w ViewModelu. Jest to zgodne z dobrymi praktykami, bo pozwala zachować wysoką czytelność i testowalność kodu oraz oddziela warstwę prezentacji od logiki. Branża bardzo mocno trzyma się tu zasady Single Responsibility – widok powinien odpowiadać tylko za prezentację i reakcje na zdarzenia, całą resztę zostawiając ViewModelowi. Warto też pamiętać, że jeśli w widoku ląduje choćby fragment logiki biznesowej, to potem ciężko takie coś testować czy rozwijać. Z mojego doświadczenia najlepiej sprawdza się podejście, gdzie do widoku nie piszemy ani linijki kodu, która nie jest związana z UI.

Pytanie 34

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

A. Publikowanie danych osobowych na otwartych platformach
B. Umieszczanie wszystkich zdjęć na platformach społecznościowych
C. Stosowanie pseudonimów zamiast rzeczywistych imion na mediach społecznościowych
D. Przechowywanie haseł w wiadomościach e-mail
Używanie pseudonimów zamiast prawdziwych imion na portalach społecznościowych jest jedną z podstawowych zasad ochrony prywatności w internecie. Dzięki temu ograniczasz możliwość identyfikacji i śledzenia Twojej aktywności przez osoby trzecie. Pseudonimy minimalizują ryzyko kradzieży tożsamości i redukują ilość danych osobowych dostępnych publicznie. To działanie jest szczególnie ważne dla dzieci i młodzieży, chroniąc ich przed cyberprzemocą i innymi zagrożeniami. W wielu serwisach można także dostosować ustawienia prywatności, ukrywając profil przed osobami spoza listy znajomych.

Pytanie 35

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

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success');
  }, 1000);
});

promise
  .then(res => {
    console.log(res);
    return 'first then';
  })
  .then(res => {
    console.log(res);
  });
A. first then
B. success, first then
C. first then, success
D. success
W przypadku błędnych odpowiedzi można zauważyć kilka typowych nieporozumień dotyczących działania obietnic w JavaScript. Odpowiedzi sugerujące, że najpierw zostanie wyświetlony 'first then' lub że będzie tylko jeden wynik, są wynikiem niezrozumienia, jak działa asynchroniczność oraz jak obietnice przetwarzają wyniki. Obietnice w JavaScript są zaprojektowane tak, aby zarządzać operacjami asynchronicznymi, co oznacza, że kod wewnątrz obietnicy nie blokuje wykonania innych operacji. W momencie, gdy obietnica jest utworzona, kod wykonuje się dalej, a funkcja `setTimeout` działa w tle. Gdy po upływie określonego czasu obietnica jest spełniona, następuje przekazanie wyniku do łańcucha `then`, a nie jakiegokolwiek innego miejsca w kodzie. To oznacza, że wyniki są zwracane w kolejności, w jakiej są zadeklarowane, co w tym przypadku prowadzi do wyświetlenia najpierw 'success', a potem 'first then'. Takie podejście do asynchroniczności jest fundamentalne w JavaScript, a jego zrozumienie jest kluczowe dla każdego programisty. Błędne odpowiedzi pochodzą często z mylnego przekonania, że wyniki obietnic są natychmiastowe lub że działają w tej samej kolejności, co kod synchroniczny. Dlatego ważne jest, aby zrozumieć, że asynchroniczność zmienia sposób, w jaki operacje są wykonywane i jak wyniki są zwracane.

Pytanie 36

Który z wymienionych dysków oferuje najszybszy dostęp do danych?

A. SSD SATA III, prędkość odczytu do 550 MB/s
B. SSD NVMe PCIe 3.0, prędkość odczytu do 3500 MB/s
C. HDD 7200 RPM, SATA III, 64 MB Cache
D. HDD 5400 RPM, SATA II, 32 MB Cache
Odpowiedź wskazująca na SSD NVMe PCIe 3.0 jako najszybszy dysk do odczytu danych jest zgodna z obecnymi standardami technologii przechowywania. Dyski SSD (Solid State Drive) korzystają z pamięci flash, co pozwala na znacznie szybszy dostęp do danych w porównaniu do tradycyjnych dysków HDD (Hard Disk Drive), które działają na zasadzie mechanicznych ruchomych elementów. Dyski NVMe (Non-Volatile Memory Express) są szczególnie wydajne, ponieważ wykorzystują interfejs PCIe (Peripheral Component Interconnect Express), co umożliwia znacznie wyższe prędkości transferu danych. W przypadku SSD NVMe PCIe 3.0, prędkość odczytu może osiągać do 3500 MB/s, co jest znaczącą różnicą w porównaniu do prędkości odczytu w dyskach HDD i SSD SATA. Przykładowo, w zastosowaniach takich jak edycja wideo, renderowanie grafiki 3D czy gry komputerowe, wyższa prędkość odczytu przekłada się na szybsze ładowanie danych i lepszą wydajność systemu. Standardy SATA III dla HDD również mają swoje ograniczenia, ponieważ maksymalna teoretyczna prędkość transferu wynosi 6 Gb/s, co jest dalekie od osiągów oferowanych przez NVMe. Dlatego SSD NVMe PCIe 3.0 jest zdecydowanym liderem w kontekście wydajności odczytu danych w porównaniu do pozostałych opcji.

Pytanie 37

Jaki framework jest powszechnie wykorzystywany do rozwijania aplikacji desktopowych w języku C++?

A. WPF
B. Node.js
C. Qt
D. Flutter
Qt to jeden z najczęściej używanych frameworków do tworzenia aplikacji desktopowych w języku C++. Dzięki Qt programiści mogą budować aplikacje wieloplatformowe (Windows, macOS, Linux) z jednolitym interfejsem użytkownika. Qt oferuje szeroką gamę narzędzi do tworzenia graficznych interfejsów użytkownika (GUI), obsługi baz danych, aplikacji sieciowych oraz animacji. Framework ten jest ceniony za wydajność, stabilność i możliwość pisania kodu raz, a następnie kompilowania go na różne platformy. Qt umożliwia również tworzenie aplikacji mobilnych i wbudowanych, co czyni go niezwykle uniwersalnym narzędziem dla programistów C++.

Pytanie 38

Jakie stwierdzenie najlepiej tłumaczy cel podziału programu na funkcje (metody)?

A. Eliminuje potrzebę korzystania ze zmiennych globalnych
B. Umożliwia skrócenie kodu przez eliminację wszelkich komentarzy
C. Gwarantuje automatyczną kompilację programu
D. Ułatwia proces debugowania oraz ponowne wykorzystanie fragmentów kodu
Dzielenie programu na funkcje (lub metody) jest jedną z kluczowych zasad programowania strukturalnego i obiektowego. Funkcje pozwalają na podzielenie dużych bloków kodu na mniejsze, łatwiejsze do zarządzania i ponownego wykorzystania fragmenty. Dzięki temu kod jest bardziej czytelny, zrozumiały i łatwiejszy do testowania. Ułatwia to także proces debugowania, ponieważ błędy można izolować w konkretnych funkcjach, zamiast przeszukiwać cały program. Ponadto funkcje umożliwiają wielokrotne używanie tego samego fragmentu kodu, co zwiększa efektywność i eliminuje konieczność powielania kodu, zmniejszając ryzyko błędów.

Pytanie 39

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. dziel i zwyciężaj
B. najkrótszej ścieżki
C. komiwojażera
D. heurystyczną
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 40

Jaki będzie wynik działania poniższego kodu JavaScript?

let x = 5;
let y = '10';
console.log(x + y);
A. 510
B. 15
C. undefined
D. error
Niepoprawne odpowiedzi często wynikają z nieporozumień dotyczących operacji w JavaScript, szczególnie związanych z typami danych. W przypadku odpowiedzi, które sugerują, że wynik to 15, może to wynikać z mylnego założenia, że JavaScript traktuje oba operandów jako liczby. Warto zauważyć, że operator + jest niejednoznaczny w JavaScript, ponieważ zarówno łączenie łańcuchów, jak i dodawanie liczb są jego możliwymi zastosowaniami. Dlatego, kiedy operatory działają na różnych typach, jak liczba i łańcuch, JavaScript stosuje konwersję typów, co prowadzi do wyników, które mogą wydawać się sprzeczne z intuicją. Z kolei odpowiedź, która zakłada, że wynik będzie 'error', opiera się na błędnym przekonaniu, że JavaScript nie poradzi sobie z różnymi typami. W rzeczywistości, JavaScript jest zaprojektowany tak, aby radzić sobie z różnymi typami danych i dokonuje konwersji, co może prowadzić do takich wyników jak '510'. Odpowiedź 'undefined' byłaby uzasadniona tylko w przypadku, gdyby kod miał nieprawidłową składnię, co w tym przypadku nie ma miejsca. Zrozumienie zasad działania operatorów w JavaScript, szczególnie dotyczących konwersji typów, jest kluczowe dla unikania tego typu błędów w przyszłości.