Wyniki egzaminu

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

Egzamin zdany!

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

Wymagane minimum: 20 punktów (50%)

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

Jakie są różnice między typem łańcuchowym a typem znakowym?

A. Typ znakowy przechowuje dane logiczne, a łańcuchowy tekst
B. Typ znakowy przechowuje pojedyncze znaki, a łańcuchowy ciągi znaków
C. Typ łańcuchowy przechowuje pojedyncze znaki, a znakowy długie ciągi znaków
D. Typ łańcuchowy obsługuje liczby całkowite, a znakowy liczby zmiennoprzecinkowe
Twierdzenie, że typ łańcuchowy przechowuje pojedyncze znaki, jest błędne – do tego służy typ 'char'. Przechowywanie liczb całkowitych nie jest domeną ani typu 'char', ani 'string', lecz typów takich jak 'int'. Typy znakowe nie przechowują danych logicznych, takich jak 'true' czy 'false' – do tego służy typ 'boolean'. Typ 'char' służy do przechowywania znaków w formie litery lub symbolu, podczas gdy 'string' jest złożoną strukturą umożliwiającą operacje na większych fragmentach tekstu.

Pytanie 2

Który z wymienionych algorytmów działających na tablicy jednowymiarowej ma złożoność obliczeniową \( O(n^2) \)?

A. Wyświetlenie elementów
B. Sortowanie bąbelkowe
C. Sortowanie szybkie
D. Wyszukiwanie metodą binarną
Sortowanie bąbelkowe to taki klasyczny algorytm, który ma złożoność \( O(n^2) \). Chociaż jest dość prosty w zrozumieniu, to nie za bardzo sprawdza się w większych zbiorach danych. Działa tak, że porównuje sąsiadujące ze sobą elementy i zamienia je miejscami, jeśli są w złej kolejności. Trochę to czasochłonne, ale warto znać ten algorytm, bo pokazuje podstawy sortowania.

Pytanie 3

Który z wymienionych wzorców projektowych jest najbardziej odpowiedni do uproszczenia interfejsu złożonego systemu?

A. Singleton (Singleton)
B. Kompozyt (Composite)
C. Metoda szablonowa (Template method)
D. Fasada (Facade)
Wzorzec Kompozyt (Composite) umożliwia traktowanie pojedynczych obiektów i ich grup w jednakowy sposób, co ułatwia zarządzanie hierarchicznymi strukturami. Metoda szablonowa (Template Method) definiuje szkielet algorytmu w klasie bazowej, pozwalając podklasom na dostosowanie poszczególnych kroków. Singleton to wzorzec zapewniający istnienie tylko jednej instancji klasy, co jest użyteczne w zarządzaniu zasobami systemowymi, ale nie służy do upraszczania interfejsu do złożonego systemu.

Pytanie 4

Podaj wspólną cechę wszystkich kontrolek umieszczonych w ramce

<Label Text="5" BackgroundColor="Blue" TextColor="Tan" isVisible="True" />
<Stepper BackgroundColor="Blue" Value="5" isVisible="True" />
<Entry TextColor="Tan" BackgroundColor="Blue" Placeholder="5" />
<Slider ThumbColor="Tan" BackgroundColor="Blue" Value="5" isVisible="False" />
A. mają identyczny kolor czcionki
B. mają tło w tym samym kolorze
C. wszystkie są widoczne
D. są w nich ustawione te same wartości domyślne
W tym przypadku wskazałeś/aś, że wszystkie kontrolki mają tło w tym samym kolorze, i to jest faktycznie prawidłowa odpowiedź. Gdy spojrzymy na definicje: Label ma BackgroundColor="Blue", Stepper także BackgroundColor="Blue", Entry również BackgroundColor="Blue", a Slider—no właśnie—też BackgroundColor="Blue". To pokazuje, że niezależnie od typu kontrolki, wszystkie mają ustawione tło na dokładnie ten sam kolor. W praktyce bardzo często spotyka się wymóg zachowania spójności wizualnej interfejsu, szczególnie w aplikacjach profesjonalnych czy korporacyjnych. Ustalanie wspólnego BackgroundColor jest jednym z najprostszych kroków ku temu, by UI wyglądało porządnie i było czytelne dla użytkownika końcowego. Moim zdaniem, kiedy projektuje się cały ekran lub jakąś sekcję UI, warto od razu narzucić style lub korzystać z szablonów (np. Styles w XAML czy resourcach), żeby uniknąć przypadkowych rozbieżności kolorystycznych, które potem tylko irytują i programistów, i użytkowników. W branży jest to uznawane za dobrą praktykę – jednolity background ułatwia szybkie ogarnięcie, które elementy należą do jednej grupy funkcjonalnej. Poza tym, kolor tła bywa często wykorzystywany do komunikowania stanu albo priorytetu (np. alerty na czerwono itp.), więc to naprawdę ważne, żeby takie detale były przemyślane i konsekwentnie stosowane. No i jeszcze taka ciekawostka: nie wszystkie kontrolki domyślnie wyświetlają tło, więc czasem trzeba to jawnie ustawić, żeby efekt był taki sam na każdej platformie.

Pytanie 5

Który element dokumentacji technicznej jest istotny dla ustalenia metod ochrony danych w aplikacji?

A. Koncepcja interfejsu użytkownika
B. Harmonogram zarządzania zadaniami
C. Opis architektury klient-serwer
D. System ochrony aplikacji
Plan zarządzania zadaniami koncentruje się na harmonogramie i podziale pracy, ale nie odnosi się do ochrony danych. Opis architektury klient-serwer dotyczy modelu komunikacji między aplikacją a serwerem, ale nie precyzuje mechanizmów zabezpieczeń. Projekt interfejsu użytkownika jest kluczowy dla doświadczeń użytkowników, ale nie obejmuje bezpośrednich mechanizmów ochrony danych i aplikacji, które są uwzględniane w specyfikacji systemu zabezpieczeń.

Pytanie 6

Zaproponowany fragment kodu w Android Studio realizuje metodę nasłuchującą do obsługi wydarzenia:

przycisk = (Button) findViewById(R.id.yes_button);
przycisk.setOnClickListener(new View.OnClickListener() { ... });
A. zmiany w polu tekstowym
B. wybór daty
C. naciśnięcia przycisku
D. zmiany stanu kontrolki Switch
Metoda OnClickListener, to coś, co na pewno warto znać, gdy pracujesz z aplikacjami na Androida. Gdy użytkownik klika przycisk, wywoływana jest metoda onClick. I tu możesz zrobić różne rzeczy, jak na przykład przejść do innego ekranu, zapisać dane albo uruchomić jakąś akcję w tle. To jest dobry przykład wzorca projektowego zwanego Delegacja, który pomaga oddzielić to, co widzisz w interfejsie, od tego, co dzieje się w aplikacji. Dzięki temu łatwiej zarządzać kodem i wprowadzać zmiany. Fajnie jest, gdy logikę umieszczasz w osobnych metodach, bo wtedy testowanie całej aplikacji staje się prostsze. Przykłady? Możesz na przykład użyć OnClickListenera, żeby zrobić logowanie po kliknięciu przycisku lub wysłać formularz. Pamiętaj też, żeby unikać ciężkich operacji w metodzie onClick, żeby aplikacja działała płynnie.

Pytanie 7

Jaki kod może być związany z treścią wygenerowaną w trakcie działania programu Java?

Exception in thread "main" java.lang.ArithmeticException: / by zero
A. x = 0;
B. x = tablica[6];
C. if (x > y) ...
D. x = x % y;
Pojawienie się komunikatu Exception in thread "main" java.lang.ArithmeticException: / by zero jest jednoznacznie powiązane z próbą wykonania operacji dzielenia lub modulo przez zero. Tymczasem nie każda operacja na liczbach czy tablicach w Javie prowadzi do takiego wyjątku. Przypisanie wartości do zmiennej, jak x = 0;, jest zupełnie bezpieczne i nie generuje żadnego wyjątku – to po prostu podstawowa operacja inicjalizacji. Podobnie konstrukcja warunkowa typu if (x > y) … sama w sobie nie wykonuje żadnych operacji arytmetycznych, a jedynie porównuje wartości. Tego rodzaju instrukcja nie może wygenerować ArithmeticException, bo nie ma tu dzielenia ani reszty z dzielenia. Często jednak intuicyjnie myli się wyjątki arytmetyczne z błędami związanymi z dostępem do elementów tablicy. Na przykład zapis x = tablica[6]; może prowadzić do IndexOutOfBoundsException, jeśli tablica ma mniej niż 7 elementów, ale to zupełnie inny typ błędu – dotyczy zakresu tablicy, a nie arytmetyki. Z mojego doświadczenia wynika, że taki błąd logiczny pojawia się, gdy programiści nie rozróżniają rodzajów wyjątków lub nie zapoznają się dokładnie z komunikatami błędów. Branżowym standardem jest zawsze analizować dokładnie stack trace błędów i rozróżniać, które operacje mogą generować jakie wyjątki, bo to pozwala lepiej projektować logikę obsługi błędów w aplikacjach. W Javie ArithmeticException to sygnał, że coś poszło nie tak z działaniem matematycznym, a nie z dostępem do pamięci czy porównywaniem wartości. Warto więc poświęcić chwilę na zrozumienie tego rozróżnienia – to się później bardzo opłaca w praktyce.

Pytanie 8

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

A. Kanban
B. Waterfall
C. Scrum
D. Prototypowy
Scrum to inna metodologia zwinna, ale jej celem jest iteracyjne dostarczanie produktów w ramach określonych sprintów, a nie minimalizacja marnotrawstwa. Waterfall to tradycyjny model sekwencyjny, który nie koncentruje się na eliminacji marnotrawstwa, lecz na dokładnym zaplanowaniu projektu na etapie początkowym. Model prototypowy opiera się na iteracyjnym tworzeniu i testowaniu prototypów, ale jego głównym celem jest uzyskanie feedbacku od użytkowników, a nie optymalizacja przepływu pracy.

Pytanie 9

W jakim języku programowania kod źródłowy musi być skompilowany do kodu maszynowego konkretnej architektury procesora przed jego uruchomieniem?

A. C++
B. PHP
C. Java
D. Perl
Wiele osób zakłada, że języki takie jak PHP, Perl czy Java działają podobnie do C++, jeśli chodzi o uruchamianie kodu, ale to tylko pozory. PHP i Perl są językami interpretowanymi – ich kod źródłowy jest analizowany i wykonywany 'w locie' przez interpreter, bez wcześniejszego tłumaczenia na natywny kod maszynowy procesora. To oznacza, że można szybko wdrażać zmiany, ale kosztem wydajności i czasem większego zużycia zasobów. Takie podejście jest popularne w aplikacjach webowych, gdzie szybkość wdrażania jest ważniejsza niż absolutna prędkość działania. Java wygląda na pierwszy rzut oka na język kompilowany, bo korzysta z kompilatora, ale w rzeczywistości kompiluje kod źródłowy do tzw. bytecode'u, który jest wykonywany przez maszynę wirtualną JVM. To sprawia, że programy w Javie są bardzo przenośne (mogą działać na różnych systemach operacyjnych), ale nie są bezpośrednio tłumaczone na instrukcje dla konkretnego modelu procesora. W C++ natomiast kompilacja to proces tłumaczenia kodu na czysto maszynowe instrukcje, takie jakie rozumie konkretny fizyczny procesor – to daje większą wydajność, ale i mniejszą przenośność (trzeba kompilować osobno dla każdej platformy). Moim zdaniem często mylimy kompilację do kodu bajtowego z kompilacją do kodu maszynowego, a to są dwa zupełnie różne podejścia. W profesjonalnych projektach wybór technologii zawsze zależy od potrzeb – jeżeli wymagana jest pełna wydajność i kontrola nad sprzętem, to stawia się na języki takie jak C++. W przypadku PHP, Perla czy Javy liczy się raczej łatwość wdrażania i przenośność. To rozróżnienie jest kluczowe dla zrozumienia, jak działa świat programowania na poziomie systemowym i aplikacji wysokopoziomowych.

Pytanie 10

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

A. Umieszczanie wszystkich zdjęć na platformach społecznościowych
B. Publikowanie danych osobowych na otwartych platformach
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 11

Który z dokumentów stosowanych w metodologii Agile zawiera listę funkcjonalności produktu uporządkowanych według ich ważności?

A. Diagram Gantta
B. Harmonogram projektu
C. Product backlog
D. Backlog sprintu
Backlog sprintu zawiera jedynie zadania przypisane do aktualnego sprintu i jest podzbiorem całego backlogu produktu, co oznacza, że nie zawiera całości funkcjonalności. Diagram Gantta to narzędzie do planowania harmonogramu projektów, ale nie służy do zarządzania wymaganiami czy funkcjonalnościami produktu. Harmonogram projektu określa czas realizacji poszczególnych etapów, ale nie odnosi się do listy funkcji, jakie muszą zostać wdrożone, co jest celem backlogu.

Pytanie 12

Co to jest shadow DOM?

A. Metoda renderowania grafiki 3D w przeglądarkach
B. Mechanizm enkapsulacji kodu HTML, CSS i JavaScript w komponenty webowe
C. Technika stylizacji elementów w CSS przy użyciu cieni
D. Wirtualny DOM używany przez biblioteki jak React i Vue.js
Zastosowanie błędnych koncepcji w kontekście Shadow DOM prowadzi do nieporozumień na temat jego funkcji. Przykładem niepoprawnego podejścia jest mylenie Shadow DOM z technikami stylizacji CSS przy użyciu cieni, co jest całkowicie innym zagadnieniem. W rzeczywistości Shadow DOM nie zajmuje się stylizacją w tradycyjnym sensie, lecz umożliwia tworzenie izolowanych instancji DOM, co jest kluczowe w kontekście wielokrotnego użycia komponentów. Innym błędnym zrozumieniem jest myślenie, że Shadow DOM jest metodą renderowania grafiki 3D, czego nie jest; techniki 3D w przeglądarkach są zazwyczaj związane z WebGL. Ponadto, wirtualny DOM, używany przez biblioteki takie jak React czy Vue.js, nie ma związku z Shadow DOM, ponieważ wirtualny DOM jest abstrakcyjną reprezentacją rzeczywistego DOM, mającą na celu optymalizację aktualizacji UI. Shadow DOM natomiast skupia się na izolacji i enkapsulacji kodu. Zrozumienie tych różnic jest kluczowe dla efektywnego wykorzystania technologii webowych, a ich ignorowanie może prowadzić do błędnych implementacji oraz zwiększenia złożoności projektów webowych. Aby skutecznie pracować z komponentami, należy znajomość Shadow DOM zintegrować z innymi technologiami, trzymając się najlepszych praktyk i standardów.

Pytanie 13

Jakie zastosowanie ma język Swift w zakresie aplikacji mobilnych?

A. Do tworzenia aplikacji na system Android
B. Do przeprowadzania testów aplikacji mobilnych
C. Do zarządzania bazami danych w aplikacjach mobilnych
D. Do tworzenia aplikacji na system iOS
Java jest językiem programowania przeznaczonym głównie do tworzenia aplikacji na Androida, a nie iOS. Objective-C to starszy język używany przed Swift, ale obecnie Apple zaleca tworzenie nowych aplikacji w Swift. Python, choć może być używany do budowy aplikacji mobilnych, nie jest standardowym językiem w ekosystemie Apple i nie jest wspierany przez XCode jako domyślny język programowania dla iOS.

Pytanie 14

W jakiej sytuacji kolekcja typu lista okaże się bardziej wydajna niż tablica?

A. Gdy liczba elementów w kolekcji zmienia się dynamicznie
B. Gdy chcemy uzyskać dostęp do elementów przy pomocy indeksu
C. Gdy mamy pewność co do dokładnego rozmiaru kolekcji przed kompilacją
D. Gdy liczba elementów w kolekcji jest niezmienna
Tablica jest bardziej efektywna, gdy liczba elementów jest stała, ponieważ umożliwia szybki dostęp do elementów za pomocą indeksów. Jednak tablice mają ograniczoną elastyczność – ich rozmiar musi być znany na etapie kompilacji lub inicjalizacji. Gdy liczba elementów jest dynamiczna, tablice mogą prowadzić do nadmiernego wykorzystania pamięci lub jej braku. Dostęp do elementów przez indeks działa wydajnie w tablicach, ale w przypadku częstych operacji dodawania lub usuwania elementów jest mniej efektywny. Znajomość dokładnego rozmiaru kolekcji przed kompilacją czyni tablice bardziej odpowiednimi dla z góry określonych danych.

Pytanie 15

Co to jest ORM w kontekście programowania?

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

Pytanie 16

W jakiej sytuacji wykorzystanie stosu będzie korzystniejsze niż lista podczas projektowania zestawu danych?

A. Gdy kolejność przetwarzania danych jest odwrócona (LIFO)
B. Gdy dane muszą być uporządkowane
C. Gdy ważne jest szybkie znajdowanie elementów
D. Gdy chcemy usunąć element z końca
Stos to struktura danych działająca na zasadzie LIFO (Last In First Out), co oznacza, że ostatni dodany element jest przetwarzany jako pierwszy. Jest to niezwykle efektywne rozwiązanie w przypadkach, gdy dane muszą być przetwarzane w odwrotnej kolejności niż były dodane. Stos jest szeroko wykorzystywany w implementacji algorytmów rekurencyjnych, obsłudze wywołań funkcji oraz w systemach zarządzania historią (np. w przeglądarkach internetowych lub edytorach tekstu). Stos zapewnia szybki dostęp do ostatnio dodanych danych i efektywne zarządzanie pamięcią, co czyni go niezastąpionym w wielu aplikacjach informatycznych.

Pytanie 17

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

A. Łączy kod źródłowy z zewnętrznymi bibliotekami
B. Przekłada kod źródłowy na język maszynowy w trakcie działania programu
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 18

Przyjmując, że opisana hierarchia klas właściwie odzwierciedla figury geometryczne i każda figura ma zdefiniowaną metodę do obliczania pola, to w której klasie można znaleźć deklarację metody liczPole()?

Ilustracja do pytania
A. figura
B. trapez
C. czworokąt
D. trójkąt
Deklaracja metody liczPole() powinna znajdować się w klasie bazowej, czyli w tym przypadku w klasie „figura”. To podejście jest zgodne z zasadami programowania obiektowego i tzw. polimorfizmem. Dzięki temu każda klasa dziedzicząca po „figurze” jest zobowiązana do własnej implementacji tej metody. To bardzo praktyczne rozwiązanie, bo umożliwia tworzenie ogólnych kolekcji (np. List<Figura>), które mogą przechowywać obiekty różnych figur, a następnie wywoływać liczPole() na każdym z nich bez zastanawiania się, jakiego typu to dokładnie obiekt. Z mojego doświadczenia wynika, że tak właśnie projektuje się API i biblioteki geometryczne – klasa bazowa narzuca kontrakt, a szczegóły są po stronie konkretnych figur. Warto dodać, że zgodnie z dobrymi praktykami, do deklarowania takich metod używa się słowa kluczowego „abstract”, co jasno komunikuje, że metoda musi być uzupełniona w klasach potomnych. Takie podejście mocno ułatwia rozbudowę kodu, np. kiedy chcemy dodać nowy typ figury, wystarczy, że nadpiszemy liczPole(). Moim zdaniem to jeden z najfajniejszych przykładów, jak dobrze przemyślana architektura kodu oszczędza czas i nerwy programistom.

Pytanie 19

Jaki tekst zostanie wyświetlony po uruchomieniu jednego z poniższych fragmentów kodu?
Kod w React:

<h2>{2+2}</h2>
Kod w Angular:
<h2>{{2+2}}</h2>
A. {{2+2}}
B. {4}
C. {2+2}
D. 4
Wiele osób trafia na problem, bo te klamry i podwójne klamry wyglądają trochę tajemniczo, zwłaszcza przy pierwszym kontakcie z Reactem albo Angularem. Często pojawia się myślenie, że skoro w szablonie wpisano {2+2} albo {{2+2}}, to właśnie taki tekst zostanie wyświetlony na stronie, dosłownie z klamrami. W praktyce jednak i React (JSX), i Angular traktują klamry jako specjalną składnię do osadzania dynamicznych wartości z JavaScript — to nie jest zwykła dekoracja, tylko wyraźny sygnał dla silnika, że w tym miejscu należy wykonać kod i podstawić wynik. To powoduje, że nie wyświetli się ani „{2+2}”, ani „{{2+2}}”, tylko właśnie wynik tego wyrażenia. Co ciekawe, odpowiedź „{4}” też jest błędna, bo React i Angular nie wyświetlają już klamer w efekcie końcowym — klamry są tylko częścią składni, nie wyniku. Człowiek łatwo może się pomylić, bo w zwykłym HTML czegoś takiego nie ma i klamry są po prostu tekstem. Moim zdaniem często wynika to z niezrozumienia, jak działa tzw. data binding w frameworkach frontendowych. Warto wyrobić sobie nawyk myślenia o klamrach jako narzędziu do „wstrzykiwania” wartości, nie jako części tekstu. To też pokazuje, jak ważne jest czytanie dokumentacji — oficjalne materiały Reacta i Angulara bardzo wyraźnie podkreślają, że klamry służą do oceny JavaScriptu. Jeśli więc widzimy {2+2} w szablonie, przeglądarka zobaczy tylko „4”, bo wszystko, co w klamrach, jest oceniane przed wyświetleniem. Jeśli wpiszemy tam zmienną lub nawet funkcję, efekt będzie podobny — zawsze podstawiona zostanie końcowa wartość, a nie kod czy same klamry. Takie mechanizmy bardzo upraszczają pracę, bo pozwalają łatwo aktualizować widok w zależności od stanu aplikacji.

Pytanie 20

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

A. Android Studio
B. Visual Studio
C. PyCharm
D. XCode
XCode to IDE przeznaczone do tworzenia aplikacji na systemy iOS oraz macOS, a nie na Androida. Visual Studio to środowisko wykorzystywane głównie do programowania aplikacji na Windows, choć z odpowiednimi rozszerzeniami umożliwia tworzenie aplikacji na Androida, to Android Studio jest bardziej kompleksowym narzędziem w tym zakresie. PyCharm to środowisko dedykowane językowi Python i służy do budowy aplikacji desktopowych, webowych lub narzędzi analitycznych, ale nie jest przeznaczone do tworzenia aplikacji mobilnych na Androida.

Pytanie 21

Zestaw operatorów przedstawiony poniżej należy do kategorii operatorów:

*      /      ++      --      %
A. przypisania
B. arytmetycznych
C. logicznymi
D. porównawczymi
Operatorzy tacy jak *, /, ++, -- czy % należą do grupy operatorów arytmetycznych, ponieważ służą bezpośrednio do wykonywania operacji matematycznych na liczbach. To właśnie dzięki nim programista może realizować podstawowe działania, takie jak mnożenie, dzielenie, inkrementacja, dekrementacja oraz obliczanie reszty z dzielenia. W praktyce codziennej, np. przy obliczeniach faktur, przetwarzaniu danych liczbowych czy algorytmach związanych z obliczaniem średnich, te operatory są wręcz niezastąpione. Moim zdaniem bez solidnego zrozumienia operatorów arytmetycznych trudno ruszyć dalej w programowaniu, bo pojawiają się niemal we wszystkich zadaniach, od najprostszych po najbardziej zaawansowane. Warto też pamiętać, że zgodnie ze standardami języków takich jak C++, Java czy Python, te operatory mają swoje określone priorytety i kolejność wykonywania, którą trzeba znać, żeby uniknąć błędów logicznych. Przykładowo, operator ++ jest często wykorzystywany w pętlach do zwiększania wartości liczników, a % pozwala sprawdzić parzystość liczby. Osobiście uważam, że nawet jeśli na początku wydają się proste, to ich niuanse, np. różnice między ++i a i++, potrafią zaskoczyć, szczególnie w bardziej złożonych wyrażeniach.

Pytanie 22

Jaki będzie wynik działania poniższego kodu w języku Python?

def fun(x, l=[]):
    l.append(x)
    return l

print(fun(1))
print(fun(2))
print(fun(3, []))
print(fun(4))
A. [1], [2], [3], [4, 3]
B. [1], [1, 2], [3], [3, 4]
C. [1], [2], [3], [4]
D. [1], [1, 2], [3], [1, 2, 4]
Wynik działania tego kodu jest poprawny i wynika z zrozumienia, jak Python obsługuje domyślne argumenty funkcji. W momencie, gdy funkcja 'fun' jest wywoływana po raz pierwszy z argumentem 1, lista 'l' jest pusta i dodawany jest do niej element 1, co skutkuje wynikiem [1]. Przy kolejnym wywołaniu z argumentem 2, lista 'l' nie jest tworzona na nowo, a zamiast tego używane jest to samo odniesienie do istniejącej listy, co oznacza, że 2 zostaje dodane do listy, przekształcając ją w [1, 2]. W trzecim wywołaniu funkcji, przekazujemy nową, pustą listę, więc wynik to [3]. Kiedy po raz czwarty wywołujemy funkcję z argumentem 4, znowu używamy tej samej listy, do której dodano już 1 i 2, co daje nam wynik [1, 2, 4]. Kluczowe jest zrozumienie, że domyślne argumenty w Pythonie są tworzone raz, więc nie są resetowane przy kolejnych wywołaniach funkcji. Takie zarządzanie pamięcią w Pythonie jest zgodne z dobrymi praktykami programistycznymi oraz pozwala na efektywne użycie zasobów.

Pytanie 23

Które z wymienionych poniżej błędów podczas wykonywania programu można obsłużyć poprzez zastosowanie wyjątków?

A. Błąd kompilacyjny
B. Błąd w składni
C. Niekompatybilność typów danych w kodzie
D. Błąd dzielenia przez zero
Błędy składniowe są wykrywane na etapie kompilacji i nie mogą być obsługiwane za pomocą wyjątków – kompilator generuje komunikat o błędzie, zanim program zostanie uruchomiony. Błędy kompilacji, takie jak niezgodność typów danych, również są wychwytywane na etapie kompilacji i wymagają poprawienia kodu źródłowego. Wyjątki są przeznaczone do obsługi błędów, które występują w czasie wykonywania programu, a nie błędów wykrywanych przez kompilator. Dlatego obsługa błędów składniowych i kompilacyjnych wymaga innego podejścia niż mechanizm wyjątków.

Pytanie 24

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

let arr = [1, 2, 3, 4, 5];
let result = arr.filter(num => num % 2 === 0);
console.log(result);
A. [1, 2, 3, 4, 5]
B. [1, 3, 5]
C. 2,4
D. [2, 4]
Wynik działania podanego kodu to [2, 4], ponieważ zastosowana funkcja filter tworzy nową tablicę, w której znajdują się tylko te elementy, które spełniają określony warunek. W tym przypadku warunkiem jest to, że element musi być parzysty (num % 2 === 0). Z tablicy arr, która zawiera liczby od 1 do 5, tylko liczby 2 i 4 spełniają ten warunek. Filtracja danych jest bardzo przydatna w programowaniu, zwłaszcza w kontekście pracy z dużymi zbiorami danych, gdzie można łatwo wyodrębnić interesujące nas elementy. Stosowanie takich metod, jak filter, jest zgodne z zasadami programowania funkcyjnego, które promują użycie funkcji do przetwarzania danych w sposób bardziej zwięzły i czytelny. W praktyce, funkcja filter może być używana do filtrowania danych z API, przetwarzania zbiorów danych w aplikacjach, czy też w analizach danych. Takie podejście zwiększa wydajność i czytelność kodu, co jest istotne w długoterminowym utrzymaniu projektów.

Pytanie 25

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

A. Lista zasobów ludzkich
B. Diagram Gantta
C. Product backlog
D. Specyfikacja techniczna
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 26

Zapis w języku C# przedstawia definicję klasy Car, która:

public class Car: Vehicle { ... }
A. odziedzicza po Vehicle
B. używa pól prywatnych klasy Vehicle
C. jest zaprzyjaźniona z klasą Vehicle
D. jest klasą podstawową (nie dziedziczy po innej klasie)
Słusznie, zapis public class Car : Vehicle { ... } w języku C# oznacza, że klasa Car dziedziczy po klasie Vehicle. To jest tak zwane dziedziczenie, jeden z fundamentalnych mechanizmów programowania obiektowego. Dzięki temu Car odzyskuje wszystkie publiczne i chronione (protected) człony klasy Vehicle, a dodatkowo może wprowadzać własne składowe albo nadpisywać metody bazowe. Przykładowo, jeśli Vehicle ma metodę Start(), to Car również ją posiada, chyba że ją nadpisze słówkiem override. Moim zdaniem, znajomość dziedziczenia ułatwia projektowanie czytelnych oraz rozszerzalnych systemów, zwłaszcza w większych projektach. W praktyce — jeśli tworzysz aplikację zarządzającą różnymi pojazdami, to możesz mieć np. klasę Vehicle z uniwersalnymi funkcjami i kilka pochodnych (takich jak Car, Truck, Motorcycle), co pozwala trzymać wspólną logikę w jednym miejscu. Warto pamiętać, że w C# jest tylko dziedziczenie pojedyncze jeśli chodzi o klasy (w przeciwieństwie do niektórych innych języków). To też zgodne z SOLID, gdzie jedna klasa powinna mieć jasno określoną odpowiedzialność. Ja często spotykam się z tym podejściem w kodzie produkcyjnym – porządek w strukturze to podstawa, a dziedziczenie bardzo w tym pomaga.

Pytanie 27

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

let x = 5;
let y = '10';
console.log(x + y);
A. undefined
B. 15
C. error
D. 510
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.

Pytanie 28

Który element HTML5 służy do osadzania wideo na stronie?

A. &lt;video&gt;
B. &lt;movie&gt;
C. &lt;player&gt;
D. &lt;media&gt;
Element HTML5 &lt;video&gt; jest standardowym tagiem służącym do osadzania wideo na stronach internetowych. Umożliwia on integrację multimediów w sposób, który jest zgodny z aktualnymi standardami sieciowymi. W porównaniu do starszych metod, które wymagały użycia zewnętrznych wtyczek, takich jak Flash, &lt;video&gt; pozwala na bezproblemowe odtwarzanie wideo w przeglądarkach nowej generacji, co zwiększa bezpieczeństwo i wydajność. Element ten oferuje wiele atrybutów, takich jak controls, autoplay, loop, preload, oraz width i height, które pozwalają na dostosowanie odtwarzacza do potrzeb użytkownika. Na przykład, używając atrybutu controls, można dodać przyciski odtwarzania, zatrzymywania lub regulacji głośności, co poprawia interaktywność i użyteczność. Dodatkowo, aby zapewnić dostępność treści wideo, warto stosować atrybuty takie jak &lt;track&gt;, który umożliwia dodawanie napisów, co jest szczególnie ważne dla osób z niepełnosprawnościami słuchowymi. Używanie &lt;video&gt; w projektach webowych to najlepsza praktyka, która wspiera rozwój dostępnych i przyjaznych dla użytkownika doświadczeń wizualnych.

Pytanie 29

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. Najnizszy poziom dostępności
D. Średni standard dostępności
Niepoprawne odpowiedzi dotyczące poziomu dostępności w WCAG 2.0 wprowadzają w błąd i nie odzwierciedlają rzeczywistego znaczenia poziomów dostępności. Po pierwsze, stwierdzenie o minimalnym poziomie dostępności jest mylące, ponieważ poziom A nie jest jedynie minimalnym standardem, ale również zawiera kluczowe wytyczne. Uznanie poziomu AAA za minimalny standard mogłoby prowadzić do sytuacji, w której użytkownicy niepełnosprawni nie otrzymaliby odpowiedniej pomocy. Kolejnym błędnym podejściem jest określenie poziomu AAA jako średniego poziomu dostępności, co jasno sugeruje błędne zrozumienie hierarchii poziomów w WCAG. W rzeczywistości poziom AAA jest znacznie bardziej wymagający i zawiera dodatkowe kryteria, które są kluczowe dla pełnej dostępności. Ostatnia niepoprawna odpowiedź sugeruje, że poziom AAA dotyczy jedynie użytkowników mobilnych, co jest całkowicie mylne. WCAG 2.0 jest zaprojektowane tak, aby dotyczyło wszystkich platform i urządzeń, nie ograniczając się tylko do mobilnych. Koncentruje się na zapewnieniu dostępności treści dla wszystkich, niezależnie od używanego urządzenia.

Pytanie 30

W klasie o nazwie samochod przypisano atrybuty: marka, rocznik, parametry[]. Atrybuty te powinny zostać zdefiniowane jako

A. interfejsy
B. metody
C. funkcje
D. pola
Pola w klasie samochod to właśnie te elementy, które przechowują dane, takie jak marka, rocznik czy tablica parametry. To jest absolutna podstawa programowania obiektowego – najczęściej spotyka się to w językach takich jak Java, C# albo nawet w Pythonie, choć tam często nazywamy je po prostu atrybutami. Dla przykładu, jeśli tworzysz klasę Samochod w C#, to pole 'marka' będzie np. typu string, 'rocznik' – int, a 'parametry' możesz zadeklarować jako tablicę albo listę (List<T>) zależnie od potrzeb. Przechowywanie danych w polach pozwala na lepszą organizację, bo każda instancja klasy ma swoje własne wartości tych pól. Tak się właśnie tworzy modele danych, na których potem operuje cała aplikacja – czy to baza samochodów w warsztacie, czy system ubezpieczeń komunikacyjnych. Takie podejście jest zgodne z zasadami hermetyzacji i solidnych, nowoczesnych standardów pisania kodu. Dużo profesjonalnych frameworków i narzędzi (np. Entity Framework, Hibernate) korzysta z takiego podejścia, nawet jeśli potem te pola opakowujesz w właściwości (properties). Krótko mówiąc, pola to nieodłączny element każdej klasy, która coś reprezentuje, i moim zdaniem nie da się dobrze projektować kodu obiektowego bez zrozumienia tej konwencji.

Pytanie 31

Który z wymienionych frameworków jest charakterystyczny dla aplikacji komputerowych pisanych w C#?

A. Spring
B. WPF (Windows Presentation Foundation)
C. Qt
D. React
Qt to popularny framework do tworzenia aplikacji, ale jest przeznaczony głównie dla języków takich jak C++ i Python, a nie C#. Spring to framework do tworzenia aplikacji webowych i serwerowych w języku Java – nie jest przeznaczony do budowy aplikacji desktopowych na platformie Windows. React to biblioteka JavaScript używana do budowy interfejsów użytkownika aplikacji webowych, głównie w środowisku przeglądarki, co sprawia, że nie nadaje się do tworzenia tradycyjnych aplikacji desktopowych w języku C#.

Pytanie 32

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. Służą jako konstruktory w zależności od liczby argumentów.
C. Zawierają przeciążenie operatora.
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 33

Które z wymienionych stanowi przykład struktury dziedziczenia?

A. Klasa Samochód i Pojazd nie są ze sobą powiązane
B. Klasa Samochód ma dziedziczenie od klasy Pojazd
C. Klasa Pojazd ma dziedziczenie od klasy Samochód
D. Klasa Pojazd nie dziedziczy z żadnej klasy
Klasa 'Pojazd' dziedzicząca po klasie 'Samochód' jest błędnym przykładem hierarchii – bardziej ogólne pojęcia powinny znajdować się wyżej w hierarchii dziedziczenia. Klasa 'Pojazd' nie dziedzicząca po żadnej klasie jest podstawową klasą bazową, ale to nie stanowi przykładu hierarchii dziedziczenia. Brak powiązań między klasami 'Samochód' i 'Pojazd' oznacza brak hierarchii – są to niezależne klasy, co eliminuje korzyści wynikające z dziedziczenia i ponownego użycia kodu.

Pytanie 34

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

A. XCode
B. Eclipse
C. Android Studio
D. PyCharm
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 35

Który z komponentów interfejsu użytkownika umożliwia użytkownikowi wprowadzanie danych tekstowych?

A. Dialog wyboru pliku
B. Pasek narzędziowy
C. Pole tekstowe
D. Przycisk
Pole tekstowe to element interfejsu użytkownika, który pozwala użytkownikowi na wprowadzanie danych tekstowych. Jest to jeden z najczęściej używanych komponentów UI w aplikacjach desktopowych, mobilnych i webowych. Pole tekstowe umożliwia wprowadzanie haseł, adresów e-mail, wiadomości i innych danych. W nowoczesnych aplikacjach często zawiera walidację, która sprawdza poprawność wpisywanych danych w czasie rzeczywistym. Dzięki swojej elastyczności, pola tekstowe mogą być wykorzystywane w różnorodnych formularzach, ankietach i systemach rejestracji użytkowników, co czyni je nieodzownym elementem aplikacji o dowolnym przeznaczeniu.

Pytanie 36

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. Używanie wirtualnych kart płatniczych lub jednorazowych kodów
C. Udostępnianie danych karty na platformach internetowych
D. Podawanie informacji o karcie w odpowiedzi na wiadomość e-mail od nieznajomego
Korzystanie z wirtualnych kart płatniczych lub jednorazowych kodów to skuteczny sposób na ochronę danych karty płatniczej podczas transakcji internetowych. Wirtualne karty mają ograniczony okres ważności i są powiązane z określoną kwotą, co minimalizuje ryzyko kradzieży całego konta bankowego. Jednorazowe kody płatności wygasają po jednorazowym użyciu, co uniemożliwia ich ponowne wykorzystanie przez osoby trzecie. Dzięki tym metodom użytkownicy znacznie redukują ryzyko oszustw i nieautoryzowanych transakcji.

Pytanie 37

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

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

Pytanie 38

W jakich sytuacjach zastosowanie rekurencji może być bardziej korzystne niż użycie iteracji?

A. Gdy kod źródłowy ma być zoptymalizowany dla starszych kompilatorów
B. Gdy algorytm wymaga naturalnego podziału na mniejsze podproblemy
C. Kiedy liczba iteracji przewyższa maksymalny zakres zmiennej licznikowej
D. Kiedy program jest uruchamiany w środowisku wielowątkowym
Przekroczenie zakresu zmiennej licznikowej nie jest powodem, dla którego rekurencja jest bardziej efektywna. Problemy z zakresami zmiennych licznikowych można rozwiązać poprzez odpowiedni dobór typów danych, a nie przez zastosowanie rekurencji. Programowanie wielowątkowe nie jest bezpośrednio związane z rekurencją – chociaż niektóre algorytmy rekurencyjne mogą być implementowane w środowisku wielowątkowym, nie jest to ich główne zastosowanie. Optymalizacja kodu dla starszych kompilatorów nie ma związku z rekurencją, ponieważ starsze kompilatory mogą mieć ograniczoną obsługę rekurencji lub generować mniej efektywny kod rekurencyjny.

Pytanie 39

Które zdarzenie w JavaScript jest wywoływane po całkowitym załadowaniu strony?

A. page.complete
B. document.ready
C. window.render
D. window.onload
Odpowiedź "window.onload" jest poprawna, ponieważ zdarzenie to jest wywoływane, gdy cała strona, w tym wszystkie obrazy, skrypty i style, zostały całkowicie załadowane. Jest to niezwykle istotne w kontekście programowania w JavaScript, ponieważ pozwala na pewność, że wszystkie zasoby są dostępne, zanim podejmiemy jakiekolwiek działania na elementach DOM. Przykładowo, jeśli chcemy zmienić zawartość elementu na stronie lub dodać do niej interaktywne funkcje, musimy upewnić się, że cały dokument jest już w pełni załadowany. Dobrym przykładem zastosowania jest sytuacja, kiedy po załadowaniu strony chcemy zainicjować jakieś skrypty, które manipulują elementami DOM, na przykład dodanie zdarzeń do przycisków lub animacji. Współczesne standardy wskazują na stosowanie tego zdarzenia w połączeniu z innymi metodami, jak np. "DOMContentLoaded", co pozwala na bardziej efektywne zarządzanie ładowaniem zasobów. Warto zaznaczyć, że chociaż "window.onload" jest użyteczne, w wielu nowoczesnych aplikacjach front-end używa się frameworków, które mogą oferować bardziej zaawansowane mechanizmy zarządzania cyklem życia aplikacji.

Pytanie 40

Definicja konstruktora dla zaprezentowanej klasy w języku C++ może być sformułowana jak poniżej:

class Owoc
{
    public:
        double waga;
        string nazwa;
        Owoc(double waga, string nazwa);
};

Deklaracja 1:
Owoc::Owoc(double waga, string nazwa) {
    this -> waga = waga;
    this -> nazwa = nazwa;
}

Deklaracja 2:
Construct::Owoc(double waga, string nazwa) {
    this -> waga = waga;
    this -> nazwa = nazwa;
}

Deklaracja 3:
Construct::Owoc(double waga, string nazwa) {
    this.waga = waga;
    this.nazwa = nazwa;
}

Deklaracja 4:
Owoc::Owoc(double waga, string nazwa) {
    this.waga = waga;
    this.nazwa = nazwa;
}
A. Deklaracji 1
B. Deklaracji 4
C. Deklaracji 3
D. Deklaracji 2
Deklaracja 1 pokazuje dokładnie taką definicję konstruktora, jaka powinna być użyta w języku C++. Nazwa klasy i konstruktora musi być identyczna, a składnia Owoc::Owoc(double waga, string nazwa) jest kanoniczna w C++ dla implementacji konstruktora poza klasą. Użycie this->waga = waga jasno wskazuje, że chodzi o przypisanie wartości z parametru do pola składowego klasy. W praktyce to jest bardzo często spotykany wzór przy pisaniu konstruktorów dla klasy, która ma kilka pól – tak można odróżnić parametry funkcji od pól klasy. Moim zdaniem warto zawsze zwracać uwagę na taki zapis, bo to pomaga unikać błędów, zwłaszcza przy większych projektach, gdzie pól może być sporo i łatwo się pomylić. W dodatku stosowanie składni this-> od razu sygnalizuje, że działamy na polach konkretnej instancji obiektu. Takie podejście jest zgodne ze wszystkimi standardami C++ i bez problemu skompiluje się w każdym środowisku. W praktyce często spotykam się z tym, że ktoś próbuje stosować inne notacje czy podpatrzone w innych językach konstrukcje, ale w C++ to właśnie taki zapis jest poprawny i klarowny dla każdego programisty. Dla czytelności kodu i łatwości utrzymania projektu, zdecydowanie polecam trzymać się tej formy. Dobrze jest też pamiętać, że w nowszych wersjach C++ można też użyć listy inicjalizacyjnej, ale tutaj przedstawiony sposób jest w pełni poprawny i zrozumiały.