Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 10 kwietnia 2026 14:22
  • Data zakończenia: 10 kwietnia 2026 14:25

Egzamin niezdany

Wynik: 17/40 punktów (42,5%)

Wymagane minimum: 20 punktów (50%)

Nowe
Analiza przebiegu egzaminu— sprawdź jak rozwiązywałeś pytania
Udostępnij swój wynik
Szczegółowe wyniki:
Pytanie 1

Pętla przedstawiona w zadaniu działa na zmiennej typu string o nazwie ciag. Jej celem jest:

int i = 0;
while (ciag[i] != 0)  {
    if (ciag[i] > 96 && ciag[i] < 123)  {
        ciag[i] = (ciag[i] - 32);
    }
    i++;
}
A. Zamienić w ciągu małe litery na wielkie.
B. Zamienić w ciągu wielkie litery na małe.
C. Od każdego znaku w ciągu, który nie jest równy 0, odjąć kod 32.
D. Od każdego znaku w ciągu odjąć kod 32.
Pętla, która zamienia małe litery na wielkie, to naprawdę fajny przykład tego, jak można operować na tekstach. W zasadzie każdy znak w napisie jest przeszukiwany, a jeśli to litera, to modyfikujemy jej kod ASCII. W praktyce dodajemy lub odejmujemy 32, żeby uzyskać odpowiednią wielką literę. Tego typu operacje wykorzystuje się w wielu miejscach, jak na przykład przy filtrowaniu danych czy normalizacji tekstu. No i oczywiście w systemach wyszukujących, gdzie wielkość liter ma znaczenie. Warto umieć zaimplementować taką pętlę, bo przydaje się w różnych aplikacjach, szczególnie tam, gdzie tekst jest kluczowy.

Pytanie 2

Co to jest wskaźnik w języku C?

A. Funkcja do dynamicznej alokacji pamięci
B. Typ danych do zapisywania tekstów
C. Zmienna przechowująca adres pamięci
D. Zmienna przechowująca wartość logiczną
Zmienne przechowujące wartości logiczne to typ bool (np. true/false) i nie mają związku z wskaźnikami. Funkcje dynamicznie alokujące pamięć, takie jak malloc(), zwracają adresy, ale same nie są wskaźnikami. Typ danych do przechowywania tekstów w C to tablica znaków (char[]) lub wskaźnik do char, ale to nie to samo co wskaźnik w sensie ogólnym, który może wskazywać na dowolny typ danych.

Pytanie 3

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

A. Klasa pochodna może dziedziczyć po wielu klasach bazowych.
B. Java nie wspiera dziedziczenia.
C. Klasa pochodna dziedziczy po jednej klasie bazowej.
D. Dziedziczenie jest niezalecane w języku Java.
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 4

Który system operacyjny jest podstawowym środowiskiem do tworzenia aplikacji mobilnych w języku Swift?

A. Windows UWP
B. iOS
C. Android
D. LG UX
Swift to język programowania stworzony przez Apple specjalnie z myślą o ekosystemie tej firmy, czyli głównie o systemach iOS, macOS, watchOS oraz tvOS. To właśnie iOS jest podstawową, domyślną platformą, na której programiści wykorzystują Swift do budowania aplikacji mobilnych. Praktycznie każda nowoczesna aplikacja na iPhone’a czy iPada, która powstała po 2014 roku, jest przynajmniej w części napisana w Swifcie, bo to obecnie standard branżowy w świecie Apple. Moim zdaniem to jest super wygodne, bo Apple dostarcza kompletne narzędzia do pracy ze Swiftem, jak Xcode czy rozbudowane frameworki (UIKit, SwiftUI). Z mojego doświadczenia wynika, że programowanie w Swifcie dla iOS to nie tylko prostsza składnia, ale też większa stabilność i bezpieczeństwo aplikacji – Apple bardzo dba o aktualizacje narzędzi i dobre praktyki. Warto też pamiętać, że od wersji SwiftUI rozwijanie aplikacji na iOS stało się jeszcze bardziej intuicyjne, bo można korzystać z deklaratywnego podejścia do interfejsów. W realnych projektach spotyka się też Objective-C, ale obecnie Swift wygrywa czytelnością i wsparciem społeczności. Gdyby ktoś chciał tworzyć aplikacje mobilne poza ekosystemem Apple, to niestety Swift nie będzie najlepszym wyborem – właśnie dlatego iOS jest tym środowiskiem, do którego Swift został stworzony i tam najbardziej się sprawdza.

Pytanie 5

Zgodnie z informacjami zawartymi w ramce, wskaż, który z rysunków ilustruje element przypisany do klasy Badge określonej w bibliotece Bootstrap?

Ilustracja do pytania
A. C
B. B
C. A
D. D
Wybrałeś wariant B i to zdecydowanie właściwy trop. Badge w Bootstrapie to nic innego jak taki mały, liczbowy wskaźnik – najczęściej widoczny przy nazwach kategorii, powiadomieniach czy komentarzach – który sygnalizuje użytkownikowi ile czegoś się pojawiło albo ile czeka akcji do wykonania. W praktyce, taki element to nie tylko liczba w kolorowym prostokącie czy kółku, ale też bardzo czytelny komunikat do użytkownika, co się ostatnio zmieniło lub co wymaga uwagi. Właśnie dlatego, w przykładzie B, mamy niebieskie prostokąty z liczbami przy różnych sekcjach (News, Comments, Updates) – to klasyczny przykład badge’a w Bootstrapie, często stylowanego klasą .badge i powiązaną kolorystyką. Warto zwrócić uwagę, że takie badge’e są nie tylko wizualne, ale też semantyczne – są rozpoznawalne przez czytniki ekranu, co jest zgodne z dobrymi praktykami dostępności (WCAG). Stosując badge’e, zwiększamy czytelność i dostępność interfejsu użytkownika, bo od razu wiadomo, gdzie coś nowego się pojawiło. Moim zdaniem, korzystanie z badge’y to jeden z prostszych i skuteczniejszych sposobów na poprawę UX – no i są bardzo łatwe do wdrożenia, wystarczy jedna klasa CSS i gotowe.

Pytanie 6

Jakie z poniższych narzędzi wspomaga projektowanie interfejsu użytkownika w aplikacjach mobilnych?

A. Android Studio Layout Editor
B. Kompilator Javy
C. Narzędzie do zarządzania bazami danych
D. PyCharm Debugger
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 7

Jakie jest wyjście działania kompilatora?

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

Pytanie 8

W podanym fragmencie kodu Java wskaż, która zmienna może przechować wartość "T":

int zm1;
float zm2;
char zm3;
boolean zm4;
A. zm4
B. zm2
C. zm3
D. zm1
W kodzie zadeklarowano różne typy zmiennych z których każda ma swoje specyficzne zastosowanie i ograniczenia. Zmienna zm1 jest typu int co oznacza że może przechowywać liczby całkowite. Typ ten jest używany do reprezentacji wartości liczbowych bez części ułamkowej i jest kluczowym elementem w operacjach arytmetycznych w wielu aplikacjach. Niemniej nie jest odpowiedni do przechowywania pojedynczych znaków takich jak T ponieważ znak ten wymaga reprezentacji w postaci typu char. Zmienna zm2 została zadeklarowana jako float co oznacza że może przechowywać liczby zmiennoprzecinkowe. Typ float jest często stosowany w obliczeniach wymagających mniej precyzyjnych wartości liczbowych z ułamkami dziesiętnymi ale podobnie jak int nie nadaje się do przechowywania znaków. Zmienna zm4 jest typu boolean co oznacza że służy do przechowywania wartości logicznych true lub false. Jest to podstawowy typ danych używany w operacjach warunkowych i pętlach kontrolnych jednak nie można za jego pomocą przechowywać znaków ani żadnych innych wartości poza logicznymi. Wybór niewłaściwego typu danych do przechowywania określonych wartości jest powszechnym błędem w programowaniu i może prowadzić do trudnych do zdiagnozowania błędów w kodzie. Ważne jest aby rozwijać umiejętność prawidłowego doboru typów danych w zależności od specyficznych potrzeb aplikacji co pozwala unikać problemów związanych z niezgodnością typów i minimalizuje ryzyko błędów.

Pytanie 9

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

A. Python
B. C#
C. C++
D. Java
Ś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 10

Jakie znaczenie ma poziom dostępności AAA w WCAG 2.0?

A. Dostosowanie tylko do użytkowników mobilnych
B. Najwyższy poziom dostępności
C. Średni standard dostępności
D. Najnizszy poziom dostępności
Poziom dostępności AAA w WCAG 2.0 oznacza najwyższy standard dostępności, który ma na celu zapewnienie, że treści internetowe są dostępne dla wszystkich użytkowników, w tym osób z różnymi rodzajami niepełnosprawności. WCAG, czyli Wytyczne dotyczące dostępności treści internetowych, są międzynarodowym standardem, który definiuje, jak tworzyć dostępne treści. Poziom AAA obejmuje wszystkie wytyczne z poziomów A i AA oraz dodatkowe wymagania, które są bardziej rygorystyczne. Przykładem może być konieczność zapewnienia alternatywnych opisów dla wszystkich mediów, w tym dla materiałów wideo i audio, a także użycie odpowiednich kontrastów kolorystycznych. W praktyce oznacza to, że strony internetowe muszą być projektowane z myślą o właściwej nawigacji, dostępnym oprogramowaniu czytającym oraz dostosowanych formatach tekstowych, które są łatwe do przetwarzania przez osoby z różnymi ograniczeniami. Wdrożenie poziomu AAA jest wyzwaniem, ale przyczynia się do bardziej inkluzywnego środowiska online.

Pytanie 11

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

A. Naprawianie błędów w kodzie aplikacji
B. Wprowadzanie nowych funkcji do aplikacji
C. Przekazywanie danych do programu z zewnętrznych źródeł
D. Zmiana wartości zmiennych globalnych
Dodawanie nowych funkcji do programu to element programowania, ale nie jest to związane z operacją wejścia. Modyfikowanie wartości zmiennych globalnych to operacja na poziomie kodu, a nie proces wejścia danych. Usuwanie błędów w kodzie programu to etap debugowania, a nie operacja wejścia. Operacje wejścia koncentrują się na interakcji z użytkownikiem lub innymi źródłami danych, co odróżnia je od modyfikacji kodu czy zarządzania błędami.

Pytanie 12

Jakie rezultaty pojawią się po uruchomieniu poniższego kodu napisanego w języku C++?

class KlasaBazowa {
    public:
        virtual void metoda() {
            cout << "Bazowa. ";
        }
};

class KlasaPochodna : public KlasaBazowa {
    public:
        void metoda() {
            cout << "Pochodna. ";
        }
};

int main() {
    KlasaBazowa *bazowa = new KlasaPochodna();
    KlasaPochodna *pochodna = new KlasaPochodna();

    bazowa->metoda();
    pochodna->metoda();
    return 0;
}
A. Bazowa. Bazowa.
B. Pochodna. Pochodna.
C. Bazowa. Pochodna.
D. Pochodna. Bazowa.
Kod wyświetla 'Pochodna. Pochodna.', co wskazuje, że metody klasy pochodnej przejęły kontrolę nad tymi z klasy bazowej. To fajny przykład polimorfizmu, jaki mamy w C++. Tutaj metoda w klasie pochodnej jest lepsza od metody w klasie bazowej. To, jakie wywołanie się wykona, zależy od konkretnego obiektu, a nie od tego, jaką metodę zdefiniowaliśmy w klasie bazowej.

Pytanie 13

Jakie informacje mogą być zapisywane w cookies przeglądarki?

A. Preferencje użytkownika, takie jak język lub styl strony
B. Prywatne dane użytkownika, na przykład hasła
C. Dane przechowywane w systemie baz danych
D. Kod źródłowy aplikacji internetowej
Przechowywanie wrażliwych danych użytkownika, takich jak hasła, w ciasteczkach jest niezgodne z zasadami bezpieczeństwa, ponieważ cookies mogą być podatne na ataki typu Cross-Site Scripting (XSS). Bezpieczne przechowywanie haseł odbywa się po stronie serwera, najczęściej w bazach danych, gdzie są one haszowane i szyfrowane. Dane przechowywane w bazie danych dotyczą głównie długoterminowych informacji użytkownika i nie są przechowywane bezpośrednio w przeglądarce. Kod źródłowy aplikacji webowej nigdy nie jest przechowywany w ciasteczkach, ponieważ stanowi podstawę aplikacji i jest zabezpieczony po stronie serwera lub repozytoriów kodu.

Pytanie 14

Przedstawiono funkcjonalnie równoważne fragmenty kodu aplikacji Angular oraz React.js.

Angular
submit(f) {
    console.log(f.value); 
}
<form #f="ngForm" (ngSubmit)="submit(f)">
    <input ngModel name="tytul" type="text" id="tytul">
    <button>Dodaj</button>
</form>
React
handleSubmit = e => {
    e.preventDefault();
    console.log('tytul: ' + e.currentTarget.tytul.value);
};
render() {
    return (
        <div>
            <form onSubmit={this.handleSubmit}>
                <input type="text" id="tytul" />
                <button>Dodaj</button>
            </form>
        </div>
    );
}
A. funkcję, która zapisuje do zmiennych f lub e dane z pola <input> formularza
B. funkcję, która wypełnia dane w formularzu podczas jego inicjalizacji
C. obsługę zdarzenia przesłania formularza
D. wyświetlanie w konsoli przeglądarki danych pobranych z pól formularza w czasie rzeczywistym, gdy użytkownik je wypełnia
Błędne odpowiedzi wynikają z niepoprawnego zrozumienia, jak działa obsługa zdarzeń w obu frameworkach. W przypadku Angulara i React.js, kluczową rolą przedstawionego kodu jest obsługa zdarzenia zatwierdzenia formularza, a nie wypisywanie danych w czasie rzeczywistym. Odpowiedzi sugerujące wypisywanie danych w konsoli w czasie rzeczywistym mylnie interpretują mechanizm działania komponentów. Takie działanie wymagałoby implementacji dodatkowych funkcji, które nasłuchiwałyby na zmiany wprowadzane do pól formularza, np. za pomocą zdarzenia onChange w React.js. Kolejna błędna idea to przypisanie danych do zmiennych f lub e. W przedstawionych fragmentach kodu zmienne te służą do przechwytywania zdarzenia submit lub referencji formularza, a nie do przypisywania danych. Zrozumienie, że zmienne te są istotne dla obsługi zdarzeń, jest kluczowe. Ponadto zakładanie, że funkcje wypełniają dane podczas inicjacji formularza, jest niepoprawne. Takie działanie wiązałoby się z inicjalizacją wartości formularza, co w ukazanych przykładach nie ma miejsca, ponieważ celem jest przetwarzanie danych w momencie zatwierdzenia formularza. To typowy błąd wynikający z niepełnego zrozumienia przepływu danych i cyklu życia komponentów w nowoczesnych frameworkach JavaScriptowych.

Pytanie 15

W jakim modelu Cyklu Życia Projektu Informatycznego znajduje się etap analizy ryzyka?

A. W spiralnym
B. W modelu Fry’ego
C. W kaskadowym
D. W modelu z prototypem
Często spotyka się przekonanie, że analiza ryzyka jest obecna w każdym modelu cyklu życia projektu informatycznego, ale to nie do końca tak działa. W modelu kaskadowym, czyli tzw. waterfall, wszystko odbywa się etapami – analiza, projektowanie, implementacja i tak dalej, w sztywno określonej kolejności. Tu niestety nie ma miejsca na systematyczną analizę ryzyka na każdym etapie, bo cała koncepcja tego modelu polega na tym, że raz wykonane czynności trudno potem cofnąć lub poprawić, szczególnie gdy coś pójdzie nie tak. To, moim zdaniem, jest jeden z powodów, dla których model kaskadowy bywa krytykowany – brak elastyczności i mała odporność na niespodziewane problemy. Podobnie jest w modelu z prototypem – tam niby tworzy się szybkie makiety czy prototypy, ale głównym celem jest poznanie potrzeb użytkownika i szybkie zebranie informacji zwrotnej, a nie formalna analiza ryzyka. Ryzyko oczywiście można zidentyfikować przy okazji, ale nie jest to centralny punkt tego podejścia. Model Fry’ego to już zupełnie inna bajka – jest bardzo liniowy, nacisk kładzie raczej na dokumentację i ścisłe trzymanie się etapów, a nie na adaptacyjność czy zarządzanie niepewnością. Z mojego punktu widzenia, błędne wybranie któregoś z tych modeli jako tego, gdzie analizuje się ryzyko, wynika z przekonania, że wszędzie jest miejsce na refleksję nad zagrożeniami – niestety, tylko model spiralny wprost i metodycznie wpisuje analizę ryzyka w swój rdzeń. W innych przypadkach analiza ryzyka jeśli się pojawia, to głównie z inicjatywy zespołu, a nie jako zaplanowany, powtarzający się etap procesu. Warto o tym pamiętać przy wyborze metodyki do danego projektu – nie każda zapewni takie same mechanizmy zabezpieczające przed błędami i nieprzewidzianymi zdarzeniami.

Pytanie 16

Metoda przeszukiwania w uporządkowanych tablicach, która polega na podzieleniu tablicy na kilka części i wykonywaniu wyszukiwania liniowego tylko w tej części, gdzie może znajdować się poszukiwany element, w języku angielskim jest określana jako

A. Jump search
B. Binary search
C. Exponential search
D. Ternary search
Wydaje się, że wybór padł na inną metodę wyszukiwania niż jump search – spróbuję wyjaśnić, skąd mogły się wziąć takie wątpliwości. Exponential search rzeczywiście działa na posortowanych tablicach, ale jego główna idea to szybkie znajdowanie zakresu, w którym może się znajdować poszukiwany element, poprzez wykładnicze zwiększanie indeksu (czyli 1, 2, 4, 8 itd.), a dopiero później użycie binary search do finalnego wyszukiwania w wykrytym przedziale. To nie jest metoda z dzieleniem tablicy na kilka części i szukaniem liniowo po „bloku”. Ternary search z kolei jest spotykany głównie tam, gdzie szukamy ekstremum (minimum lub maksimum) funkcji unimodalnej, a nie konkretnego elementu w tablicy. Tutaj tablica jest dzielona na trzy części, ale to zupełnie inna idea niż jump search – chodzi o ciągłe zawężanie przedziału na podstawie wartości funkcji, a nie liniowe przeszukiwanie fragmentu tablicy. Binary search jest chyba najbardziej znaną metodą dla uporządkowanych tablic: dzieli zbiór na pół i eliminuje połowę elementów w każdej iteracji. Jednak tutaj nie ma podziału na „bloki” i nie wykonuje się wyszukiwania liniowego, tylko zawsze korzysta z bezpośrednich porównań środkowego elementu. Z mojego doświadczenia, najczęstszy błąd przy tego typu pytaniach to mylenie mechanizmów dzielenia tablicy i przyspieszania wyszukiwania – nie każda metoda, która coś „dzieli” albo „przeskakuje”, działa tak samo. W praktyce jump search jest czymś dość specyficznym i bardzo łatwo można go pomylić z innymi klasykami, zwłaszcza jeśli nie miało się okazji widzieć jego działania na żywo. Warto zapamiętać, że to właśnie ten algorytm łączy w sobie blokowe przeskoki i liniowe przeszukiwanie tylko wybranego fragmentu – i to go wyróżnia spośród pozostałych popularnych metod branżowych.

Pytanie 17

Który z poniższych języków programowania jest statycznie typowany?

A. PHP
B. Ruby
C. TypeScript
D. JavaScript
Odpowiedzi JavaScript, PHP i Ruby są przykładami języków programowania, które są statycznie typowane, co jest niepoprawne. JavaScript jest językiem dynamicznie typowanym, co oznacza, że typy zmiennych są określane w czasie wykonywania, a nie w czasie kompilacji. To podejście, choć elastyczne, może prowadzić do błędów, których nie widać do momentu uruchomienia programu. Na przykład, w JavaScript można przypisać do zmiennej wartość liczbową, a następnie przypisać do niej wartość tekstową, co może prowadzić do nieprzewidzianych problemów w logice aplikacji. PHP także jest językiem dynamicznie typowanym, co oznacza, że nie wymaga określenia typów zmiennych przed ich użyciem. Choć PHP oferuje pewne mechanizmy do wprowadzania typowania, to jego zachowanie jest bardziej bliskie dynamicznemu podejściu niż statycznemu, co może obniżać jakość kodu i prowadzić do trudności w jego utrzymaniu. Ruby, podobnie jak poprzednie języki, również charakteryzuje się dynamicznym typowaniem, co sprawia, że programiści mogą łatwo zmieniać typy zmiennych w trakcie działania programu, ale znowu, takie podejście niesie ze sobą ryzyko błędów, które mogą być trudne do zdiagnozowania. Te przykłady ilustrują, jak dynamiczne typowanie może prowadzić do pomyłek i błędów w programach, dlatego statyczne typowanie, jak w TypeScript, jest często preferowane w projektach o większej skali oraz tam, gdzie wymagane jest wysokie bezpieczeństwo kodu.

Pytanie 18

Który z poniższych metod najlepiej zabezpiecza dane karty płatniczej podczas zakupów online?

A. Przechowywanie numeru karty w przeglądarce internetowej
B. Udostępnianie danych karty na platformach internetowych
C. Używanie wirtualnych kart płatniczych lub jednorazowych kodów
D. Podawanie informacji o karcie w odpowiedzi na wiadomość e-mail od nieznajomego
Zapisywanie numeru karty w przeglądarce internetowej jest wygodne, ale niebezpieczne – jeśli przeglądarka zostanie zhakowana, dane karty mogą zostać przejęte. Podawanie danych karty w odpowiedzi na e-mail od nieznanej osoby to klasyczny przykład phishingu, gdzie hakerzy podszywają się pod banki lub instytucje finansowe. Udostępnianie danych karty na forach internetowych naraża użytkownika na natychmiastowe wykorzystanie tych informacji przez przestępców.

Pytanie 19

Który z poniższych formatów jest najczęściej używany do wymiany danych w aplikacjach webowych?

A. YAML
B. CSV
C. JSON
D. XML
XML (eXtensible Markup Language) był jedną z najpopularniejszych metod wymiany danych w aplikacjach webowych w przeszłości, jednak jego złożoność i większy rozmiar w porównaniu do JSON sprawiają, że nie jest on preferowany w nowoczesnym rozwoju oprogramowania. XML wymaga bardziej rozbudowanej struktury, co prowadzi do większego narzutu danych, a jego parsowanie jest bardziej zasobożerne. Mimo że XML oferuje możliwości takie jak walidacja za pomocą DTD czy XSD, te cechy są często zbędne w prostych zastosowaniach, gdzie wystarczy tylko przesyłanie danych w formacie bez dodatkowych wymagań strukturalnych. CSV (Comma-Separated Values) jest formatem tekstowym, który ma swoje zastosowanie w zakresie prostych zbiorów danych, takich jak tabele lub bazy danych, ale nie obsługuje złożonych struktur danych ani hierarchii, co ogranicza jego użyteczność w kontekście nowoczesnych aplikacji webowych. YAML (YAML Ain't Markup Language) z kolei, chociaż bardziej czytelny dla ludzi niż XML, nie zdobył takiej popularności jak JSON w kontekście wymiany danych w aplikacjach webowych, głównie z powodu swoich luźnych zasad składniowych, które mogą prowadzić do błędów w interpretacji danych. Typowe błędy myślowe, które mogą prowadzić do wyboru błędnych formatów, dotyczą często przywiązania do tradycyjnych metod z przeszłości, ignorowania wymagań nowoczesnych aplikacji oraz nieznajomości zalet i ograniczeń poszczególnych formatów. Współczesny rozwój oprogramowania kładzie nacisk na efektywność i łatwość użycia, co czyni JSON idealnym rozwiązaniem dla programistów.

Pytanie 20

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

A. Tablica, która zmienia swoje wymiary w trakcie działania programu
B. Tablica, która przechowuje wartości, do których można uzyskać dostęp tylko za pomocą indeksów numerycznych
C. Tablica, która przechowuje wyłącznie dane tekstowe
D. Tablica przechowująca dane w formie par klucz-wartość
Tablica asocjacyjna to fajna rzecz, bo przechowuje dane w formie par klucz-wartość. W przeciwieństwie do zwykłych tablic, gdzie używasz numerów do indeksowania, tutaj możesz mieć różne unikalne klucze, na przykład teksty czy liczby. To naprawdę ułatwia wyszukiwanie informacji i organizowanie danych. W Pythonie nazywa się to 'słownikami', a w C++ używa się 'map'. Moim zdaniem, to świetne narzędzie do pracy z większymi zbiorami danych.

Pytanie 21

Kod w bibliotece React.js oraz w frameworku Angular, który został zaprezentowany, ma na celu wyświetlenie

Fragment kodu React.js:
state = {    zm1: 0   };
hanleEv = () => {
    this.setState({zm1: this.state.zm1 + 1});
}
render() {
    return (<div>
        <span>{this.state.zm1}</span>
        <button onClick={this.handleEv}>BTN_1</button>
    </div>);
}
Fragment kodu Angular:
@Component({
    selector: 'sel1',
    template: `<span>{{ zm1 }}</span>
              <button (click)="onBtnCilcked()">BTN_1</button>`
})
export class Licznik1Component {
    zm1 = 0;
    onBtnCilcked() { this.zm1++; }
}
A. wyłącznie przycisku oraz obsłużenie zdarzenia click, które ono generuje
B. wartości 0 po naciśnięciu przycisku
C. tylko napisu BTN_1
D. liczby kliknięć przycisku
Wydaje się, że łatwo tu popaść w uproszczenia lub ulec pierwszemu wrażeniu na temat działania tego kodu, zwłaszcza jeśli nie patrzy się na całą strukturę zarówno w React, jak i Angularze. Sam przycisk z napisem BTN_1 faktycznie występuje, ale nie to jest sednem – komponenty nie ograniczają się tylko do wyświetlania przycisku. Ich główną rolą jest obsługa interakcji: kliknięcie nie tylko wywołuje zdarzenie, lecz przede wszystkim modyfikuje stan licznika i od razu aktualizuje widok. Sądząc, że program ma wyświetlać „tylko napis” lub „tylko przycisk i obsługę click”, pomija się istotę działania frameworków: dynamiczną prezentację danych w odpowiedzi na działania użytkownika. Pojawia się też czasem mylne założenie, że widok pokazuje wartość 0 po kliknięciu – to nieprawda, bo oba fragmenty kodu startują z wartością 0, ale po kliknięciu ta wartość jest zwiększana i od razu pokazuje nową liczbę kliknięć. To bardzo typowy błąd, wynikający z niezrozumienia jak aktualizowany jest stan komponentu i jak natychmiast to wpływa na renderowanie widoku. Trzeba jeszcze pamiętać, że samo „obsłużenie zdarzenia click” jest tylko częścią procesu – pełna funkcjonalność polega na wyświetleniu aktualnej liczby kliknięć, czyli dynamicznej reakcji na akcje użytkownika. Dlatego w branży kładzie się nacisk na powiązanie warstwy widoku z logiką biznesową poprzez stan komponentu – to jest podstawa nowoczesnych aplikacji. Zakładając, że chodzi tylko o statyczny element lub samo zdarzenie, zupełnie pomija się sedno tego typu zadań, gdzie właśnie dynamiczna aktualizacja UI po akcji użytkownika jest kluczowa. Takie błędne założenia często biorą się z pobieżnego czytania kodu lub nieznajomości mechanizmów reaktywności i data bindingu, które są fundamentem zarówno Reacta, jak i Angulara.

Pytanie 22

Która z wymienionych cech dotyczy klasy statycznej?

A. Nie może zawierać ani zmiennych, ani metod
B. Może być dziedziczona przez klasy potomne
C. Może zawierać wyłącznie statyczne pola i metody
D. Jest automatycznie usuwana po zakończeniu działania programu
Klasa, która nie może zawierać zmiennych ani metod, jest w rzeczywistości pusta i nie spełnia żadnych praktycznych funkcji. Dziedziczenie klas statycznych jest niemożliwe, ponieważ nie można ich instancjonować, co eliminuje potrzebę dziedziczenia. Klasy, które są automatycznie usuwane po zakończeniu programu, to standardowe klasy, a nie klasy statyczne – proces usuwania obiektów leży w gestii destruktorów i mechanizmu garbage collection.

Pytanie 23

Jakie metody można wykorzystać do przechowywania informacji o użytkownikach w aplikacji mobilnej na systemie Android?

A. W rejestrze systemu
B. Tylko w pamięci RAM
C. Za pomocą plików SharedPreferences
D. Wyłącznie w zewnętrznych bazach danych
Przechowywanie danych w rejestrze systemu jest typowe dla aplikacji desktopowych działających na systemach Windows i nie znajduje zastosowania w środowisku Android. Zewnętrzne bazy danych są używane do przechowywania dużych ilości danych, ale nie są optymalnym rozwiązaniem dla prostych preferencji użytkownika, ponieważ wymagają bardziej skomplikowanej konfiguracji. Przechowywanie danych wyłącznie w pamięci RAM jest rozwiązaniem tymczasowym – dane te są tracone po zamknięciu aplikacji lub ponownym uruchomieniu urządzenia, co czyni je niepraktycznymi do przechowywania trwałych ustawień użytkownika.

Pytanie 24

Zaprezentowany symbol odnosi się do

Ilustracja do pytania
A. Creative Commons
B. praw autorskich
C. prawa cytatu
D. domeny publicznej
Ten symbol to międzynarodowe oznaczenie domeny publicznej – często nazywany jest też symbolem Public Domain. Moim zdaniem to bardzo przydatna rzecz, bo jednoznacznie komunikuje, że utwór nie jest chroniony prawem autorskim, więc można go swobodnie wykorzystywać bez pytania kogokolwiek o zgodę. To szczególnie ważne, gdy pracujesz nad projektami komercyjnymi albo edukacyjnymi i musisz mieć pewność, że nie naruszasz czyichś praw. W praktyce spotkasz to oznaczenie na stronach z grafikami, muzyką czy tekstami, np. na Wikimedia Commons albo w niektórych bazach zdjęć stockowych – wtedy od razu wiesz, że możesz pobierać, edytować czy publikować materiał na własnych zasadach. Kluczowe jest jednak, żeby nie mylić tego symbolu z licencjami Creative Commons – tam nadal obowiązują konkretne warunki. W branży IT oraz przy pracy twórczej rozpoznawanie takich oznaczeń jest wręcz podstawą dobrych praktyk, bo znacząco minimalizuje ryzyko prawne. Z mojego doświadczenia wynika, że wielu początkujących myli domenę publiczną z wolnymi licencjami – a to nie to samo. Oznaczenie Public Domain jasno pokazuje: nie ma ograniczeń, korzystaj śmiało i nie musisz podawać autora, choć czasami jest to mile widziane z punktu widzenia etyki.

Pytanie 25

Jakie jest oznaczenie komentarza wieloliniowego w języku Java?

A. <!-- ... -->
B. // ... //
C. """ ... """
D. /* ... */
Wielu początkujących programistów myli składnię komentarzy w różnych językach programowania, co jest całkiem naturalne – szczególnie jeśli ktoś ma styczność z wieloma technologiami naraz albo przechodzi z jednego języka na drugi. W przypadku Javy tylko zapis /* ... */ pozwala na tworzenie komentarzy wieloliniowych, czyli takich, które rozciągają się na kilka kolejnych wierszy kodu. Zapis <!-- ... --> jest charakterystyczny dla języków znaczników, takich jak HTML czy XML. Java nie rozpoznaje tego typu komentarza – jeśli spróbujesz go użyć, kompilator po prostu się „zgubi” i potraktuje to jako błąd składni, a nie komentarz. Z kolei // ... // to pomieszanie dwóch różnych rzeczy: w Java używamy podwójnego ukośnika (//) do komentarzy jednoliniowych, czyli takich, które kończą się na końcu danej linii. Powielenie ukośników po obu stronach nie ma żadnego znaczenia dla interpretera Javy i nie działa w praktyce. Natomiast zapis z trzema cudzysłowami """ ... """, choć jest popularny np. w Pythonie do komentowania bloków tekstu lub docstringów, w języku Java nie jest rozpoznawany nawet jako komentarz – kompilator potraktuje taki fragment jako błąd składni lub nieoczekiwany string w kodzie. Niestety, takie błędy wynikają często z przyzwyczajeń wyniesionych z innych języków, co jest typowym problemem przy nauce nowych technologii. Z mojego punktu widzenia warto od początku rozróżniać te różnice, bo potem przychodzi mniej przykrych niespodzianek na etapie kompilowania czy wdrażania aplikacji. Praktyka pokazuje, że nawet doświadczeni programiści czasami odruchowo stosują nieprawidłową notację, szczególnie gdy edytują kod w różnych językach. W Javie zawsze trzymaj się więc zapisu /* ... */ dla komentarzy wieloliniowych i nie próbuj używać formatów z innych ekosystemów – to po prostu tutaj nie zadziała.

Pytanie 26

Jaką strukturę danych obrazuje zamieszczony kod w języku C#?

int[,] array = new int[3, 3];
A. tablicę dwuwymiarową
B. listę
C. stos
D. tablicę jednowymiarową
Kod z pytania przedstawia strukturę, która bywa mylona z innymi, ale ma bardzo konkretne cechy. Jeśli ktoś pomylił ją z tablicą jednowymiarową, pewnie sugerował się tylko fragmentem 'int[]', ale obecność przecinka w deklaracji (int[,]) jednoznacznie wskazuje na dwa wymiary. Tablica jednowymiarowa pozwala na dostęp przez jeden indeks – coś jak lista wartości pod rząd, na przykład numery od 0 do n. Stos to zupełnie inna struktura, która w języku C# zwykle jest reprezentowana przez klasę Stack<T> i działa na zasadzie LIFO (Last In, First Out), czyli elementy wyjmuje się w odwróconej kolejności do tego, jak je wstawiasz. W kodzie nie ma żadnej logiki związanej ze stosami ani nie jest używana żadna taka klasa. Lista natomiast, często używana w C# jako List<T>, to dynamiczna kolekcja jednowymiarowa, pozwalająca na łatwe dodawanie i usuwanie elementów, ale też nie pozwala na odwoływanie się do elementów przez dwa indeksy. Z mojego doświadczenia, wiele osób utożsamia tablice dwuwymiarowe z listami, bo mają podobne operacje dostępu, jednak technicznie to zupełnie różne obiekty – tablica dwuwymiarowa ma stały rozmiar i dostęp O(1) do każdego elementu przez dwa indeksy. Błędne odpowiedzi często wynikają z nieuważnego przeczytania składni lub braku rozróżnienia pomiędzy różnymi strukturami danych na poziomie języka. Warto nauczyć się zauważać różnice w deklaracji i przeznaczeniu tych struktur, bo ma to spore znaczenie przy projektowaniu algorytmów i wydajności aplikacji. W praktyce, wybór pomiędzy tablicą jednowymiarową, dwuwymiarową, stosem czy listą zależy od konkretnego problemu i sposobu, w jaki musisz przechowywać oraz przetwarzać dane. Poprawne zrozumienie tych różnic oszczędza sporo frustracji na dalszych etapach nauki programowania, szczególnie przy pracy z bardziej zaawansowanymi strukturami i algorytmami.

Pytanie 27

W programie desktopowym stworzono rozwijaną listę oraz przypisano cztery funkcje do obsługi zdarzeń tej kontrolki. Jaki komunikat pojawi się po dokonaniu wyboru w tej liście?
W XAML (uproszczona wersja):

<ComboBox SelectionChanged="Funkcja1" DragEnter="Funkcja2"
    LostFocus="Funkcja3" KeyDown="Funkcja4">
</ComboBox>
W kodzie:
private void Funkcja1(object sender, SelectionChangedEventArgs e)
{
    MessageBox.Show("Zdarzenie 1");
}
private void Funkcja2(object sender, DragEventArgs e)
{
    MessageBox.Show("Zdarzenie 2");
}
private void Funkcja3(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Zdarzenie 3");
}
private void Funkcja4(object sender, KeyEventArgs e)
{
    MessageBox.Show("Zdarzenie 4");
}
A. Zdarzenie 2
B. Zdarzenie 3
C. Zdarzenie 1
D. Zdarzenie 4
Wybrałeś dokładnie to, co trzeba. W tej sytuacji kluczowe jest rozpoznanie, że zdarzenie SelectionChanged jest wywoływane zawsze wtedy, gdy użytkownik wybierze inną pozycję z ComboBoxa. I to właśnie do tego zdarzenia przypisana jest metoda Funkcja1, która wyświetla komunikat "Zdarzenie 1". Trochę to wygląda niepozornie, ale SelectionChanged to jeden z najczęściej obsługiwanych eventów w aplikacjach desktopowych opartych na WPF czy UWP – praktycznie zawsze reagujemy na wybór użytkownika w kontrolkach ComboBox, ListBox albo nawet ListView. Z mojego doświadczenia wynika, że początkujący programiści często mylą to zdarzenie z innymi, jak LostFocus, które odpala się, gdy kontrolka traci fokus, albo z DragEnter (zupełnie inny przypadek, bo dotyczy przeciągania danych). Warto pamiętać, że KeyDown reaguje dopiero na naciśnięcie klawisza, a nie na wybór myszką. Takie rozróżnienie jest codziennością przy tworzeniu bardziej zaawansowanych interfejsów użytkownika. Praktyczna wskazówka: jeśli chcesz reagować na wybór użytkownika i np. ładować dodatkowe dane czy weryfikować coś po stronie aplikacji, to SelectionChanged jest strzałem w dziesiątkę. Standardy branżowe sugerują nie przesadzać z obsługą zbyt wielu eventów jednocześnie dla tej samej kontrolki, bo to może prowadzić do konfliktów i dziwnych zachowań UI. Mocno polecam samemu poeksperymentować – otworzyć Visual Studio, zrobić prostą aplikację WPF, podpiąć te eventy i zobaczyć, które kiedy się odpalają. Dzięki temu dużo szybciej utrwala się ta wiedza niż z samej teorii.

Pytanie 28

Jaką funkcję pełnią mechanizmy ciasteczek w aplikacjach internetowych?

A. Do zapisywania danych użytkownika w przeglądarce
B. Do przechowywania informacji w bazie danych
C. Do zapisywania danych użytkownika na serwerze
D. Do generowania dynamicznych interfejsów dla użytkowników
Mechanizm ciasteczek (cookies) w aplikacjach webowych służy do przechowywania danych użytkownika bezpośrednio w przeglądarce. Ciasteczka mogą przechowywać różnego rodzaju informacje, takie jak preferencje językowe, identyfikatory sesji czy dane logowania, co pozwala na personalizację doświadczenia użytkownika oraz śledzenie jego aktywności na stronie. Dzięki ciasteczkom aplikacje webowe mogą zapamiętać użytkownika i dostosować treści do jego potrzeb przy kolejnych wizytach. Cookies są nieodłącznym elementem zarządzania stanem w aplikacjach stateless, takich jak te oparte na protokole HTTP. Mogą być one również wykorzystywane w systemach reklamowych i analitycznych do monitorowania zachowań użytkowników. Prawidłowe zarządzanie ciasteczkami i stosowanie odpowiednich polityk prywatności są kluczowe dla zgodności z przepisami RODO oraz regulacjami dotyczącymi ochrony danych osobowych.

Pytanie 29

Jaką wartość zwróci funkcja napisana w języku C++, jeżeli jej argumentem wejściowym jest tablica stworzona w następujący sposób:

int tablica[6] = {3,4,2,4,10,0};

int fun1(int tab[]) {
    int wynik = 0;

    for(int i = 0; i < 6; i++)
        wynik += tab[i];
    return wynik;
}
A. 20
B. 0
C. 10
D. 23
W tego typu zadaniach bardzo łatwo popełnić błąd w ocenie działania pętli oraz sumowania wartości w tablicy. Często pojawia się przekonanie, że funkcja może zwracać zero, bo ostatni element tablicy to 0 – ale trzeba pamiętać, że funkcja sumuje wszystkie elementy i zero po prostu nie wpływa na całą sumę, więc wynik się nie wyzeruje. Bywa też, że sugerujemy się pierwszą liczbą z tablicy albo jakąś wyróżniającą się, na przykład 10, myśląc, że to ona jest odpowiedzią – ale to nie ma uzasadnienia w kodzie. W pętli for wyraźnie jest napisane i < 6, czyli przeglądamy sześć elementów. Każdy z nich jest dodawany do zmiennej wynik. Kod nie ma żadnych warunków ani instrukcji przerwania, więc nie można zatrzymać się „na” jakiejś wartości, ani zignorować jakiejkolwiek liczby. Niektóre osoby mogą też popełnić błąd i dodać tylko część elementów albo pomylić kolejność, przez co suma wychodzi 10, 20 lub inna, ale przy mechanicznej analizie kodu to niemożliwe. Odpowiedź 20 pojawia się czasem, kiedy ktoś przez przypadek nie zliczy ostatniego zera, a z kolei 10 to typowy skrót myślowy – może wynikający z szybkiego rzutu oka na największą liczbę w tablicy, jednak suma elementów to nie to samo, co ich maksimum. Z mojego doświadczenia wynika, że bardzo wielu uczniów nie przywiązuje wagi do sumowania wszystkich elementów, zwłaszcza jak pojawia się zero – a przecież matematyka jest tu bezlitosna. W programowaniu sumujesz wszystko jak leci, jeśli nie ma warunku czy filtru. Takie drobne nawyki, jak dokładne śledzenie każdej iteracji pętli, potem procentują podczas bardziej złożonych zadań na egzaminach czy w prawdziwych projektach. Pamiętaj: jeśli kod nie sprawdza warunków, to wykonuje dokładnie to, co jest napisane – nic mniej, nic więcej. Warto się tego trzymać.

Pytanie 30

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, 6, 10]
C. [1, 2, 3, 4, 5]
D. [2, 4, 6, 8, 10]
Analizując inne odpowiedzi, możemy zauważyć, że wszystkie one bazują na błędnych założeniach dotyczących działania funkcji filter i map. Niektóre z propozycji, takie jak [2, 6, 10], sugerują, że wszystkie liczby parzyste z oryginalnej listy byłyby mnożone przez 2, co jest nieprawidłowe. Funkcja filter zwraca jedynie liczby parzyste, a to oznacza, że tylko liczby 2 i 4 są brane pod uwagę, nie 6 i 10, których w oryginalnej liście po prostu nie ma. Ponadto odpowiedź [2, 4, 6, 8, 10] jest błędna, ponieważ dodaje liczby, które nie występują w danych wejściowych, co prowadzi do nieprecyzyjnego wyniku. Warto zrozumieć, że w Pythonie operacje na kolekcjach są często wykonywane w sposób, który wymaga precyzyjnej analizy danych wejściowych. W kontekście programowania, często popełnianym błędem jest zakładanie, że wszystkie liczby pasujące do jakiegoś warunku będą uwzględniane w dalszej obróbce bez dokładnego ich filtrowania. Stąd wynika, że zrozumienie, jak działają funkcje takie jak filter i map, jest kluczowe dla efektywnego i poprawnego programowania. W procesie nauki ważne jest, aby przyglądać się działaniu kodu krok po kroku i dokładnie analizować, jak funkcje przetwarzają dane. Zrozumienie tych podstawowych koncepcji jest niezbędne, aby uniknąć podobnych nieporozumień w przyszłości.

Pytanie 31

Który z podanych algorytmów można zrealizować zarówno w sposób iteracyjny, jak i rekurencyjny?

A. Algorytm wyszukiwania binarnego
B. Algorytm sortowania bąbelkowego
C. Algorytm mapowania kluczy w tablicach asocjacyjnych
D. Algorytm generowania liczb losowych
Algorytm wyszukiwania binarnego może być zaimplementowany zarówno iteracyjnie, jak i rekurencyjnie. Wyszukiwanie binarne polega na podzieleniu przeszukiwanej tablicy na dwie części i porównaniu elementu środkowego z wartością, której szukamy. Jeśli element nie zostanie znaleziony, algorytm przeszukuje jedną z połówek tablicy. Rekurencyjna wersja tego algorytmu jest często bardziej elegancka i prostsza w implementacji, natomiast iteracyjna bywa bardziej wydajna pod względem zużycia pamięci.

Pytanie 32

Którego nagłówka używamy w C++ do obsługi plików?

A. <fstream>
B. <iostream>
C. <fileio.h>
D. <stdio.h>
'<stdio.h>' to nagłówek biblioteki C, a nie C++, i jest używany do standardowych operacji wejścia i wyjścia, ale nie jest przeznaczony do pracy z plikami w stylu obiektowym. '<fileio.h>' to nieistniejący standardowy nagłówek C++ – nazwa ta może wprowadzać w błąd. '<iostream>' to biblioteka standardowa służąca do obsługi strumieni wejścia/wyjścia w konsoli (np. 'cin' i 'cout'), ale nie jest używana do pracy z plikami. Tylko 'fstream' oferuje narzędzia dedykowane do obsługi plików na dysku w języku C++.

Pytanie 33

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
Wybrana odpowiedź jest trafna, bo faktycznie narzędzie pokazane w filmie to generator GUI, który potrafi przekształcać kod do języka XAML. XAML (czyli Extensible Application Markup Language) jest powszechnie używany do deklaratywnego opisywania interfejsów użytkownika, na przykład w aplikacjach WPF czy UWP na platformie .NET. Jak dla mnie, korzystanie z takich generatorów to ogromna wygoda, bo pozwala błyskawicznie przenosić projekt graficzny do formatu czytelnego dla platformy Microsoftu. Z mojego doświadczenia, wiele zespołów programistycznych stosuje takie rozwiązania, żeby oszczędzić czas na ręcznym pisaniu XAML-a (co potrafi być naprawdę żmudne przy dużych projektach). Co ciekawe, takie narzędzia bardzo dobrze współpracują z designerskimi edytorami UI i potrafią zautomatyzować konwersję nawet z innych formatów graficznych, np. Sketch czy Adobe XD do XAML-a. Branżowe standardy zalecają, by wykorzystywać generatorów GUI właśnie do tego celu, bo minimalizuje to liczbę błędów, przyspiesza wdrożenie zmian i ułatwia współpracę między programistami a projektantami. Warto pamiętać, że XAML jest bardzo elastyczny i umożliwia potem ręczną edycję wygenerowanego kodu – czasem powstają drobne poprawki, ale ogólnie to naprawdę przydatne narzędzie. Ogólnie – jeśli tylko projektujesz UI pod .NET, to automatyczna konwersja do XAML-a to jest coś, co warto znać i wykorzystywać w praktyce.

Pytanie 34

Który z frameworków pozwala na tworzenie aplikacji z graficznym interfejsem użytkownika oraz obsługą wydarzeń?

A. Express.js
B. Qt
C. Django
D. TensorFlow
Django to framework do tworzenia aplikacji webowych w języku Python, a nie narzędzie do budowy aplikacji desktopowych z interfejsem graficznym. TensorFlow to biblioteka do uczenia maszynowego i sztucznej inteligencji, która nie ma bezpośredniego związku z projektowaniem GUI. Express.js to framework dla Node.js, który służy do budowy aplikacji serwerowych i API, ale nie jest narzędziem do projektowania interfejsów użytkownika w aplikacjach desktopowych.

Pytanie 35

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 36

Jakie narzędzie można wykorzystać do stworzenia mobilnej aplikacji cross-platform w języku C#?

A. środowisko XCode
B. środowisko Android Studio
C. platformę Xamarin
D. bibliotekę React Native
Wiele osób może pomylić narzędzia używane do tworzenia aplikacji mobilnych cross-platform, zwłaszcza że na rynku jest ich całkiem sporo i nie zawsze różnice są jasne na pierwszy rzut oka. React Native, mimo że jest bardzo popularny w środowisku JavaScript, nie ma nic wspólnego z C#. To framework, w którym piszemy kod głównie w JavaScript lub TypeScript i pozwala budować natywne aplikacje na Androida oraz iOS. Fajnie się go używa, ale jeśli ktoś zna tylko C#, to raczej nie jest to najlepszy wybór. Z kolei XCode to kompletnie inna bajka – to narzędzie stworzone przez Apple do pisania aplikacji natywnych na iOS i macOS, głównie w językach Swift lub Objective-C. Środowisko jest rozbudowane i profesjonalne, ale nie daje wsparcia dla pisania kodu w C#, więc nie nadaje się do zadań cross-platform w tym języku. Android Studio to natomiast oficjalne IDE od Google do tworzenia aplikacji na Androida, najczęściej w Javie lub Kotlinie. Nie ma tu domyślnej obsługi C# ani programowania cross-platformowego. Typowym błędem jest utożsamianie każdego „dużego” narzędzia mobilnego z możliwością tworzenia aplikacji na wiele systemów, co nie zawsze jest prawdą. Ważne, by przed wyborem technologii dokładnie sprawdzić, jakie języki i jakie systemy są wspierane. Tylko Xamarin (a obecnie także jego następca, .NET MAUI) daje pełnoprawne wsparcie dla C# oraz tworzenie aplikacji na różne systemy z jednej bazy kodu. To oszczędza czas i pozwala na większą elastyczność w projekcie.

Pytanie 37

Jak nazywa się proces znajdowania i usuwania błędów w kodzie?

A. Kompilowanie
B. Debugowanie
C. Interpretowanie
D. Kompensowanie
Procesy kompilowania, interpretowania i kompensowania mają swoje specyficzne funkcje w programowaniu, ale nie są bezpośrednio związane z usuwaniem błędów w kodzie. Kompilowanie to proces tłumaczenia kodu źródłowego napisanego w języku wysokiego poziomu na kod maszynowy, który może być wykonany przez komputer. Jest to kluczowy etap w przypadku języków kompilowanych, takich jak C++ czy Java, gdzie kod źródłowy musi zostać przekształcony w formę zrozumiałą dla procesora. Interpretowanie, z kolei, polega na bezpośrednim wykonywaniu kodu źródłowego przez interpreter, który analizuje i uruchamia instrukcje programu linijka po linijce. Języki takie jak Python czy JavaScript często wykorzystują ten proces, co może wpływać na wydajność wykonania, ale ułatwia testowanie i modyfikacje kodu. Kompensowanie nie odnosi się bezpośrednio do programowania, ale w kontekście ogólnym oznacza wyrównywanie lub łagodzenie skutków błędów czy niedoskonałości. Może dotyczyć np. strategii zarządzania projektem, ale nie jest procesem technicznym związanym z debugowaniem kodu. Te różnice w funkcjonalności i zastosowaniu pokazują, jak ważne jest precyzyjne rozumienie terminologii programistycznej w kontekście debugowania i innych procesów.

Pytanie 38

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

A. float liczba;
B. char liczba;
C. bool liczba;
D. int liczba;
Deklaracja `float liczba;` oznacza zmienną przechowującą liczby zmiennoprzecinkowe, a nie całkowite. `char liczba;` definiuje zmienną znakową, przechowującą pojedynczy znak, np. 'A' lub 'z'. Deklaracja `bool liczba;` odnosi się do zmiennej logicznej, która może przechowywać tylko wartości `true` lub `false`. Każdy z tych typów ma swoje zastosowanie, ale żaden z nich nie jest równoważny zmiennej typu całkowitego (int).

Pytanie 39

Która z wymienionych reguł należy do netykiety?

A. Stosowanie nieformalnego języka w każdej rozmowie
B. Unikanie używania dużych liter w komunikacji
C. Udostępnianie treści bez zgody właścicieli
D. Zaniechanie odpowiadania na wiadomości od innych użytkowników
Unikanie pisania wielkimi literami w wiadomościach jest kluczowym elementem netykiety, ponieważ tekst pisany dużymi literami w internecie jest powszechnie interpretowany jako krzyk. To zasada, która ma na celu utrzymanie kultury komunikacji online oraz zapewnienie komfortu odbiorcy. Gdy użytkownik korzysta z wielkich liter, może to być odbierane jako agresywne lub dominujące, co może prowadzić do nieporozumień oraz negatywnych reakcji. Przykładem może być sytuacja, w której osoba, pisząc do grupy na forum internetowym, używa wyłącznie wielkich liter, co może zniechęcić innych do interakcji. Dobrą praktyką jest pisanie w sposób przystępny i zrozumiały, co sprzyja pozytywnej atmosferze w komunikacji. Standardy netykiety, takie jak te przedstawione w dokumentach związanych z etyką w internecie, podkreślają znaczenie szacunku i zrozumienia w interakcjach online, co obejmuje również sposób formułowania wiadomości. Warto także pamiętać o tym, że różne platformy społecznościowe mają swoje zasady, które podkreślają unikanie pisania krzykiem, co potwierdza ogólne podejście do netykiety.

Pytanie 40

Jakie narzędzie jest najbardziej odpowiednie do identyfikacji błędów w trakcie działania programu?

A. Debugger
B. Interpreter
C. Linker
D. Kompilator
Kompilator służy do tłumaczenia kodu źródłowego na kod maszynowy przed uruchomieniem programu, ale nie analizuje błędów w czasie jego wykonywania. Interpreter tłumaczy kod na bieżąco, ale nie pozwala na zatrzymywanie programu i analizowanie jego działania krok po kroku. Linker to narzędzie, które łączy różne moduły i biblioteki w jeden plik wykonywalny, ale nie ma funkcji analizy błędów w czasie działania programu – jego rola kończy się po wygenerowaniu pliku wykonywalnego.