Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 6 kwietnia 2026 12:43
  • Data zakończenia: 6 kwietnia 2026 13:06

Egzamin zdany!

Wynik: 26/40 punktów (65,0%)

Wymagane minimum: 20 punktów (50%)

Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

Cytat przedstawia charakterystykę metodyki RAD. Pełne znaczenie tego skrótu można przetłumaczyć na język polski jako:

...(RAD)..., is both a general term for adaptive software development approaches, and the name for James Martin's method of rapid development.

In general, RAD approaches to software development put less emphasis on planning and more emphasis on an adaptive process. Prototypes are often used in addition to or sometimes even instead of design specifications.

Źródło: https://en.wikipedia.org/

A. zintegrowane środowisko programistyczne
B. prototypowanie wsparte testami jednostkowymi
C. środowisko refaktoryzacji aplikacji
D. środowisko szybkiego rozwoju aplikacji
RAD, czyli Rapid Application Development, tłumaczy się na polski najczęściej jako „środowisko szybkiego rozwoju aplikacji” albo „metodyka szybkiego wytwarzania oprogramowania”. To podejście stawia na błyskawiczne prototypowanie i szybkie iteracje zamiast długiego, formalnego planowania. Bardziej niż na dokumentacji, skupia się na tworzeniu działających wersji aplikacji, które można testować i na bieżąco modyfikować zgodnie z tym, czego oczekuje klient lub zespół użytkowników. W praktyce, przykładowy projekt w RAD to np. budowa aplikacji, gdzie klient dostaje wstępny prototyp po tygodniu, a nie po miesiącu – i od razu może zgłaszać uwagi. Bardzo często stosuje się narzędzia typu CASE (Computer-Aided Software Engineering), które pozwalają szybko generować kod i prototypy GUI bez żmudnego pisania wszystkiego od zera. W świecie profesjonalnych firm IT, RAD jest chętnie wykorzystywany, kiedy czas wdrożenia jest kluczowy, na przykład w startupach, które muszą szybko przetestować swój pomysł rynkowy. Moim zdaniem, nawet jeśli nie wszystkie projekty się do tego nadają, to znajomość RAD jest bardzo przydatna dla każdego programisty – pozwala lepiej zrozumieć, jak można pracować zwinnie i elastycznie, bez zbędnego formalizmu. RAD to nie tylko metodyka, ale też praktyczny styl myślenia o aplikacjach – szybciej, więcej, elastyczniej. Warto się tym zainteresować, szczególnie jeśli komuś zależy na czasie i wczesnych efektach pracy.

Pytanie 2

Jaką wartość będzie miała zmienna result po wykonaniu poniższego kodu PHP?

$array = [5, 1, 8, 3, 7];
$result = 0;
foreach ($array as $value) {
  if ($value > $result) {
    $result = $value;
  }
}
A. 5
B. 24
C. 7
D. 8
Wartości 24, 5 oraz 7 nie są poprawne w kontekście działania podanego kodu PHP. Gdy spojrzymy na odpowiedź 24, zauważymy, że nie ma takiej wartości w tablicy $array, która wynosi 5, 1, 8, 3 ani 7. Zatem, próbując uzyskać taką wartość z operacji na tych liczbach, prowadzi do złych wniosków. Możliwe, że błąd wynikał z niewłaściwego zrozumienia, czym jest proces iteracji w tablicy oraz jak działa przypisanie wartości. W przypadku wartości 5, można pomyśleć, że jest to największa liczba w tablicy, ponieważ jest to pierwsza liczba, która jest porównywana z wartością początkową zmiennej $result. Jednak nie uwzględnia ona kolejnych iteracji, które dostarczają większe wartości. Wartość 7, chociaż jest większa od 5, również nie jest największa, ponieważ istnieje jeszcze większa liczba - 8. W przypadku programowania, kluczowe jest zrozumienie, że pętla foreach nie tylko przegląda elementy, ale także pozwala na dynamiczne aktualizowanie zmiennej w zależności od warunku. Niezrozumienie tego aspektu może prowadzić do błędnych odpowiedzi, jak w tym przypadku, gdzie nie tylko nie dostrzegamy maksymalnej wartości, ale także nie rozumiemy poprawnych operacji na zmiennych. W programowaniu ważne jest, aby nie tylko znać składnię, ale także rozumieć logikę stojącą za danym algorytmem.

Pytanie 3

W programie stworzonym w języku C++ trzeba zadeklarować zmienną, która będzie przechowywać wartość rzeczywistą. Jakiego typu powinna być ta zmienna?

A. int
B. numeric
C. double
D. number
Intuicyjnie można by pomyśleć, że każda zmienna liczbową da się zadeklarować przez int, bo przecież to najprostszy i najpopularniejszy typ w języku C++. Jednak int przechowuje wyłącznie liczby całkowite – nie pozwala na zapis ułamków czy wartości dziesiętnych. To bardzo częsty błąd początkujących programistów, którzy próbują przechować 7.5 w int i są zaskoczeni, że wynik zawsze jest zaokrąglany w dół. Równie problematyczne są próby użycia typów, które wyglądają na sensowne, ale w rzeczywistości nie istnieją w C++. Przykłady to number i numeric – brzmią profesjonalnie, można je spotkać w innych językach (np. number w JavaScript), ale C++ nie przewiduje takich deklaracji. Kompilator po prostu zgłosi błąd i nie skompiluje programu. Z mojego doświadczenia, wielu uczniów daje się nabrać na te angielskie słówka, bo wydają się logiczne. Tymczasem C++ ma ścisłe zasady i ogranicza się do konkretnych typów jak int, float, double czy long double. Jeśli chodzi o double, to jest to oficjalnie wspierany przez standard ISO typ do zmiennych rzeczywistych, stosowany wszędzie tam, gdzie float nie daje wystarczającej precyzji. Warto też zauważyć, że korzystanie z nieistniejących typów prowadzi do błędów kompilacji, co jest nie tylko stratą czasu, ale i może utrudnić dalszą naukę programowania, bo utrwala złe nawyki. Podsumowując, jeśli chcesz przechowywać liczby rzeczywiste w C++, musisz użyć double lub ewentualnie float, a nie int, number czy numeric – te ostatnie po prostu w tym języku nie działają.

Pytanie 4

W jaki sposób procesor nawiązuje komunikację z pamięcią podręczną (cache)?

A. Poprzez linie danych w magistrali systemowej
B. Za pomocą systemu przerwań
C. Używając wyłącznie pamięci RAM
D. Bezpośrednio, omijając mostki systemowe
Komunikacja między procesorem a pamięcią podręczną nie odbywa się poprzez system przerwań, ponieważ przerwania są mechanizmem umożliwiającym procesorowi reagowanie na zdarzenia zewnętrzne, a nie transfer danych między pamięcią a procesorem. Przerwania są używane głównie do komunikacji z urządzeniami peryferyjnymi, które informują procesor o konieczności przetworzenia danych, a nie do bezpośredniej interakcji z pamięcią podręczną. Ponadto stwierdzenie, że procesor komunikuje się z pamięcią podręczną, wykorzystując jedynie pamięć RAM, jest błędne, ponieważ pamięć RAM i pamięć podręczna to różne typy pamięci, o różnych szybkościach i funkcjach. Pamięć podręczna jest znacznie szybsza i działa jako pośrednik między procesorem a wolniejszą pamięcią RAM, co oznacza, że procesor nie korzysta z pamięci RAM do komunikacji z pamięcią podręczną. Warto również zaznaczyć, że komunikacja bezpośrednia z pominięciem mostków systemowych jest niepraktyczna i technicznie niemożliwa. Mostki systemowe są niezbędne do zarządzania ruchem danych między różnymi komponentami w architekturze komputerowej, a ich pominięcie mogłoby prowadzić do chaosu w komunikacji oraz znacznie obniżyć wydajność systemu.

Pytanie 5

Wskaż fragment kodu, który stanowi realizację przedstawionego algorytmu w języku C++.

Kod 1
do {
  suma = suma + i;
} while (suma <= liczba);
cout << suma;
Kod 2
if (suma <= liczba) {
  suma = suma + i;
  i++;
}
else
  cout << suma;
Kod 3
for (i = suma; i <= liczba; i++)
  suma = suma + i;
else
  cout << suma;
Kod 4
while (suma <= liczba) {
  suma = suma + i;
  i++;
}
cout << suma;
Ilustracja do pytania
A. kod 3
B. kod 1
C. kod 2
D. kod 4
Wybrałeś fragment kodu, który faktycznie odwzorowuje logikę schematu blokowego: najpierw sprawdzamy warunek suma <= liczba, a dopiero gdy jest spełniony, wchodzimy do pętli, dodajemy i do zmiennej suma, inkrementujemy licznik i i wracamy do ponownego sprawdzenia warunku. To jest klasyczne zastosowanie pętli while, czyli sytuacji, kiedy nie znamy liczby iteracji z góry, ale wiemy, kiedy mamy skończyć – w tym wypadku, gdy suma przekroczy wartość graniczną liczba. Z mojego doświadczenia właśnie tak wygląda typowy fragment kodu sumujący kolejne liczby naturalne, dopóki nie zostanie osiągnięty limit. Ważne jest też to, że instrukcja wypisania wyniku znajduje się dopiero za pętlą, więc zostanie wykonana dokładnie raz, po zakończeniu obliczeń, co idealnie zgadza się z blokiem pisz suma na schemacie. W dobrych praktykach programistycznych zawsze pilnujemy, żeby warunek pętli dokładnie odpowiadał opisowi w algorytmie, a modyfikacja zmiennych sterujących, takich jak suma i i, była wykonywana wewnątrz pętli w spójny sposób. Taka konstrukcja jest potem łatwa w utrzymaniu, przeniesieniu do innych języków czy modyfikacji, na przykład można bez problemu zmienić warunek na suma < liczba albo dodać dodatkowe sprawdzenie, czy i nie rośnie za szybko. W praktycznych projektach, np. przy obliczaniu sum kontrolnych, limitów budżetowych, punktów gracza w grze, dokładnie taki wzorzec while warunek, obliczenia, inkrementacja, wypisz wynik pojawia się naprawdę często.

Pytanie 6

Wartości składowych RGB koloru #AA41FF zapisane w systemie szesnastkowym po przekształceniu na system dziesiętny są odpowiednio

A. 170, 65, 255
B. 160, 64, 255
C. 170, 64, 255
D. 160, 65, 255
Przy przekształcaniu wartości szesnastkowych RGB na system dziesiętny łatwo popełnić błąd, bo wystarczy źle podstawić którąś cyfrę albo zmieszać kolejność. W przypadku koloru #AA41FF każda para znaków odpowiada jednej składowej: AA to czerwona, 41 to zielona, a FF to niebieska. Najczęściej błędy pojawiają się, gdy niepoprawnie zinterpretujemy cyfry szesnastkowe jako dziesiętne lub po prostu pomylimy kolejność składowych. Przykładowo, '160' w odpowiedzi zamiast '170' wynika być może z błędnego odczytania AA – bo łatwo pomylić literę A (10) z cyfrą 6 czy 0, zwłaszcza jeśli ktoś nie jest przyzwyczajony do liczb szesnastkowych. Podobnie, '64' zamiast '65' dla 41 to typowy efekt nieuwagi w liczeniu: 4*16+1 daje 65, a nie 64, co pokazuje, jak ważna jest precyzja w prostych działaniach matematycznych. Z kolei zamiana AA na 160 może świadczyć o mechanicznej zamianie liter na liczby bez uwzględnienia ich pozycji w zapisie szesnastkowym. Powszechnym błędem jest też zamiana kolejności składowych lub skupianie się tylko na końcowych cyfrach, przez co mylnie przyjmuje się, że na przykład AA to 160, bo pierwsza cyfra to 1, a nie 10. W praktyce branżowej takie niedokładności prowadzą do złych efektów wizualnych – np. kolor na stronie mocno różni się od zamierzonego lub nie pasuje do reszty projektu. Moim zdaniem takie błędy wynikają zwykle z braku nawyków w przeliczaniu systemów liczbowych. Warto zawsze pamiętać, że każda cyfra szesnastkowa ma swoją wagę, a zamiana wymaga precyzyjnego policzenia: pierwsza cyfra razy 16 plus druga cyfra. W codziennej pracy z grafiką cyfrową czy webdesignem taka pomyłka bardzo rzuca się potem w oczy użytkownikowi, więc lepiej od początku ćwiczyć dokładność niż potem szukać, gdzie zniknęła ta właściwa barwa.

Pytanie 7

Jak oddziaływanie monotonnego środowiska pracy może wpłynąć na organizm człowieka?

A. Poprawa kondycji fizycznej
B. Obniżenie koncentracji oraz zwiększone ryzyko popełniania błędów
C. Wzrost poziomu motywacji
D. Zwiększenie odporności na stres
Kiedy w pracy ciągle powtarzamy te same czynności, to może nas to naprawdę zniechęcać. Zauważyłem, że takie monotonne środowisko potrafi sprawić, że gorzej się skupiamy i łatwiej popełniamy błędy. Jeśli pracownicy cały czas robią to samo bez żadnych zmian, to szybko tracą zapał i nie są zadowoleni z tego, co robią. Moim zdaniem, warto czasem zmieniać zadania, żeby wprowadzić trochę świeżości i wyzwań. Dobrze jest też organizować przerwy, bo to pomaga nabrać energii oraz zadbać o fajną atmosferę w pracy.

Pytanie 8

Która z poniższych metod nie należy do cyklu życia komponentu w React.js?

A. componentDidUpdate()
B. componentDidMount()
C. componentWillUnmount()
D. componentWillPublish()
Metoda componentWillPublish() nie jest częścią cyklu życia komponentu w React.js, co czyni ją poprawną odpowiedzią na to pytanie. W React.js istnieje szereg zdefiniowanych metod cyklu życia, które umożliwiają programistom zarządzanie stanem komponentów w określonych momentach ich istnienia. Do najbardziej istotnych z nich należą: componentDidMount(), componentDidUpdate() oraz componentWillUnmount(). Metoda componentDidMount() jest wywoływana po zamontowaniu komponentu w DOM, co pozwala na inicjalizację danych, takich jak pobieranie danych z API. Z kolei componentDidUpdate() jest wywoływana, gdy komponent zostaje zaktualizowany, co jest doskonałym momentem na reagowanie na zmiany w stanie lub propach. Metoda componentWillUnmount() jest wywoływana tuż przed odmontowaniem komponentu, co jest przydatne do czyszczenia zasobów, takich jak anulowanie subskrypcji lub usuwanie nasłuchiwaczy. Zrozumienie tych metod jest kluczowe dla efektywnego zarządzania cyklem życia komponentów w aplikacjach React, co prowadzi do lepszej wydajności i utrzymania kodu.

Pytanie 9

Jaki język programowania został stworzony z myślą o tworzeniu aplikacji na system Android?

A. Java
B. Python
C. Swift
D. Objective-C
Java to taki język, który jest głównie używany do robienia aplikacji na Androida. Od początku Androida, Java była jego podstawowym językiem, dlatego jest tak popularna i dobrze opisana w dokumentacji. Kiedy tworzysz aplikacje na Androida w Javie, to korzystasz z Android SDK oraz API, które świetnie integrują się z funkcjami urządzeń, jak GPS czy kamera. Teraz trochę więcej mówi się o Kotlinie jako nowoczesnej alternatywie dla Javy, ale Java wciąż ma swoje mocne miejsce w tworzeniu aplikacji i Google dalej ją wspiera.

Pytanie 10

Które z wymienionych stwierdzeń najtrafniej charakteryzuje klasę bazową?

A. Klasa, która zawsze zawiera metody wirtualne
B. Klasa, która nie może być dziedziczona
C. Klasa, która zapewnia wspólne atrybuty i metody dla klas pochodnych
D. Klasa, która dziedziczy z klasy pochodnej
Klasa bazowa to klasa, która dostarcza wspólne pola i metody dla klas pochodnych. Definiuje ogólną funkcjonalność, która może być rozszerzana lub modyfikowana przez klasy dziedziczące. Dzięki temu programowanie obiektowe umożliwia wielokrotne wykorzystanie kodu, co prowadzi do jego większej modularności i czytelności. Klasa bazowa często zawiera metody wirtualne, które mogą być nadpisywane przez klasy pochodne, co pozwala na dostosowanie funkcjonalności do konkretnych potrzeb. Przykładem jest klasa 'Pojazd', która posiada metody takie jak 'Jedz()' czy 'Zatrzymaj()', a klasy pochodne, np. 'Samochód' lub 'Rower', rozszerzają tę funkcjonalność.

Pytanie 11

Które z wymienionych opcji wspiera osoby niewidome w korzystaniu z witryn internetowych?

A. Implementacja czytnika ekranu (screen reader)
B. Zmiana rozdzielczości ekranu
C. Umożliwienie modyfikacji czcionki
D. Ograniczenie liczby grafik na stronie
Dodanie czytnika ekranu (screen reader) jest kluczowym rozwiązaniem, które znacząco ułatwia osobom niewidomym i słabowidzącym korzystanie z serwisów internetowych. Czytniki ekranu to oprogramowanie przekształcające tekst na stronie internetowej na mowę, co pozwala użytkownikom na interakcję z treścią dostępną w internecie. Technologia ta opiera się na standardach dostępności, takich jak WCAG (Web Content Accessibility Guidelines), które zalecają projektowanie stron przyjaznych dla osób z różnymi niepełnosprawnościami. Przykładem działania czytnika ekranu może być program JAWS, który umożliwia użytkownikom nawigację po stronach internetowych poprzez komendy klawiaturowe oraz odczytywanie treści na głos. Dzięki czytnikom ekranu, osoby niewidome mają możliwość dostępu do informacji, komunikacji oraz interakcji w sieci, co wpisuje się w ideę cyfrowej inkluzji i równości szans. Wprowadzenie czytnika ekranu na stronie internetowej to nie tylko techniczne wsparcie, ale również wyraz odpowiedzialności społecznej, mający na celu zapewnienie, że wszyscy użytkownicy mają równe prawo do korzystania z zasobów w sieci.

Pytanie 12

Który z wymienionych poniżej przykładów stanowi system informacji przetwarzany przez system informatyczny?

A. System zarządzania oświetleniem drogowym
B. System do monitorowania temperatury serwerów
C. System PESEL
D. System wentylacyjny w biurowcach
System wentylacji w biurowcach, system monitorowania temperatury serwerów oraz system sterowania światłami drogowymi, chociaż są przykładami systemów inżynieryjnych, nie stanowią systemów informacji przetwarzanych przez systemy informatyczne w tradycyjnym rozumieniu. System wentylacji w biurowcach to mechanizm regulujący przepływ powietrza, który działa na podstawie fizycznych zasad termodynamiki i wymiany ciepła. W tym przypadku dane są zbierane i przetwarzane w sposób, który nie angażuje intensywnego zarządzania informacjami osobowymi ani gromadzenia danych w skali, jaką obserwuje się w systemach informacyjnych. Z kolei system monitorowania temperatury serwerów służy do zapewnienia odpowiednich warunków pracy sprzętu komputerowego. Choć wykorzystuje technologię informatyczną do zbierania danych, jego funkcjonalność koncentruje się na diagnostyce i bezpieczeństwie sprzętu, a nie na przetwarzaniu informacji o osobach czy instytucjach. Ostatecznie system sterowania światłami drogowymi, mimo że operuje na podstawie zebranych danych o ruchu drogowym, w istocie nie prowadzi złożonych operacji przetwarzania informacji w sensie administracyjnym ani nie gromadzi danych osobowych. Jego działanie opiera się na algorytmach, które reagują na ruch uliczny, a nie na zarządzaniu informacjami w sposób, który jest charakterystyczny dla systemów takich jak PESEL.

Pytanie 13

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

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

Pytanie 14

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

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

Pytanie 15

Jaką wartość dziesiętną reprezentuje liczba binarna 1010?

A. 12
B. 10
C. 8
D. 14
Liczba binarna 1010 to wartość dziesiętna, która wynosi 10. Aby dokonać konwersji liczby binarnej na system dziesiętny, należy zrozumieć, że każda cyfra w systemie binarnym reprezentuje potęgę liczby 2, zaczynając od prawej strony, gdzie najniższa pozycja ma wartość 2^0. W przypadku 1010, mamy następujące pozycje: 1 * 2^3 (co daje 8), 0 * 2^2 (co daje 0), 1 * 2^1 (co daje 2) oraz 0 * 2^0 (co daje 0). Sumując te wartości: 8 + 0 + 2 + 0, otrzymujemy 10. W praktyce konwersja z systemu binarnego na dziesiętny jest niezwykle przydatna w programowaniu i elektronice, gdzie liczby binarne są powszechnie stosowane. Przykładowo, w obliczeniach komputerowych oraz w projektowaniu układów cyfrowych, znajomość tych konwersji jest kluczowa. Odnosi się to również do standardów, takich jak IEEE 754, które definiują reprezentację liczb zmiennoprzecinkowych w formatach binarnych.

Pytanie 16

Jaką nazwę kontrolki powinno się umieścić w początkowej linii kodu, w miejscu <???, aby została ona wyświetlona w podany sposób?

Ilustracja do pytania
A. SeekBar
B. RatinoBar
C. Switch
D. Spinner
Switch to kontrolka używana w Androidzie do stworzenia elementu interfejsu użytkownika, który pozwala użytkownikowi przełączać się między dwoma stanami. Domyślnie stany te są identyfikowane jako włączone i wyłączone, co jest szczególnie przydatne w przypadku funkcji wymagających prostego wyboru binarnego, jak na przykład włączanie lub wyłączanie ustawień. Kod XML użyty w pytaniu zawiera atrybuty android:textOff i android:textOn, które są typowe dla klasy Switch i pozwalają zdefiniować tekst, jaki ma być wyświetlany w stanie wyłączonym i włączonym. W praktyce Switch jest często stosowany w aplikacjach mobilnych do kontroli ustawień użytkownika, co pozwala na łatwą i intuicyjną obsługę. Dobrymi praktykami jest używanie Switch w kontekście jednoznacznego wyboru, aby nie wprowadzać użytkownika w błąd. Warto również zadbać o dostępność i odpowiednie etykietowanie kontrolki, co zapewnia jej zrozumiałość dla wszystkich użytkowników.

Pytanie 17

Który element HTML5 służy do wyświetlania zawartości video?

A. &lt;film&gt;
B. &lt;video&gt;
C. &lt;media&gt;
D. &lt;play&gt;
Element HTML5 <video> jest kluczowym składnikiem do wyświetlania treści wideo w przeglądarkach. Dzięki niemu można łatwo osadzić filmy na stronach internetowych, co sprawia, że są one bardziej interaktywne i atrakcyjne dla użytkowników. Przykład użycia tego tagu wygląda następująco: <video src='film.mp4' controls></video>. Atrybut 'controls' pozwala na dodanie prostych przycisków odtwarzania, pauzy i regulacji głośności, co znacząco poprawia doświadczenia użytkownika. Warto również wspomnieć, że element <video> wspiera różne formaty wideo, takie jak MP4, WebM czy Ogg, co jest istotne w kontekście zgodności z różnymi przeglądarkami i urządzeniami. W praktyce, stosowanie <video> pozwala na łatwe zarządzanie wideo, w tym na dodawanie napisów, ustawienie automatycznego odtwarzania czy loopowania. To sprawia, że jest on niezwykle popularny w tworzeniu nowoczesnych stron internetowych, które chcą dostarczać wartościowe multimedia. Zastosowanie tego elementu jest zgodne z najlepszymi praktykami w zakresie dostępności i użyteczności, co czyni go niezwykle ważnym w dzisiejszym web development.

Pytanie 18

Jak w CSS definiuje się element, który ma reagować na najechanie kursorem?

A. :mouse
B. :hover
C. :over
D. :click
Odpowiedź :hover jest poprawna, ponieważ w CSS pseudo-klasa :hover jest używana do definiowania stylów elementu, gdy kursor myszy znajduje się nad tym elementem. Jest to niezwykle przydatne w tworzeniu interaktywnych stron internetowych, ponieważ umożliwia twórcom zwiększenie responsywności elementów, takich jak przyciski, linki czy obrazy. Przykładowo, można zastosować :hover do zmiany koloru tła przycisku, co wskazuje użytkownikom, że dany element jest aktywny i gotowy do interakcji. Zastosowanie tej pseudo-klasy nie tylko poprawia estetykę strony, ale również zwiększa jej użyteczność oraz dostępność, co jest zgodne z dobrymi praktykami w projektowaniu UI/UX. Należy pamiętać, że :hover działa tylko w przeglądarkach obsługujących CSS, a efekty związane z tą pseudo-klasą są natychmiastowe, co sprawia, że są one bardzo efektywne w zastosowaniu. Warto również zaznaczyć, że w przypadku urządzeń dotykowych, takich jak smartfony, reakcja na najechanie może być symulowana poprzez dotknięcie ekranu, co sprawia, że ta technika jest uniwersalna.

Pytanie 19

W którym przypadku algorytm sortowania bąbelkowego działa z optymalną wydajnością?

A. Dla tablicy uporządkowanej rosnąco
B. Dla tablicy z dużą liczbą powtórzeń
C. Dla tablicy uporządkowanej malejąco
D. Dla tablicy losowej
Algorytm sortowania bąbelkowego działa z optymalną wydajnością w przypadku, gdy tablica jest już posortowana rosnąco. W takiej sytuacji algorytm wykona jedynie jedno przejście przez tablicę, bez konieczności dokonywania zamian, co sprawia, że jego złożoność wynosi O(n). To znacząco zwiększa jego efektywność w przypadku niemal posortowanych danych, choć nadal pozostaje mniej wydajny niż algorytmy takie jak QuickSort czy MergeSort dla dużych zbiorów. Sortowanie bąbelkowe jest jednak łatwe do zrozumienia i implementacji, co czyni je popularnym narzędziem edukacyjnym.

Pytanie 20

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

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

Pytanie 21

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

A. Java
B. C++
C. Python
D. C#
C# jest językiem programowania opracowanym przez firmę Microsoft, który jest głównie używany w ekosystemie .NET. Chociaż istnieją IDE, które wspierają C#, takie jak Visual Studio, to IntelliJ IDEA, Eclipse i NetBeans nie zostały zaprojektowane z myślą o tym języku. C++ jest językiem programowania o dużych możliwościach, stosowanym głównie w systemach operacyjnych, oprogramowaniu sterownikowym oraz aplikacjach wymagających wysokiej wydajności. Chociaż istnieją wtyczki do Eclipse, które wspierają C++, to głównym celem tych IDE nie jest rozwój w tym języku, a ich główne funkcje koncentrują się na Java. Python, znany ze swojej prostoty i przyjazności dla początkujących, ma również swoje dedykowane środowiska IDE, takie jak PyCharm i Anaconda, które są bardziej optymalne dla tego języka. IDE, takie jak IntelliJ IDEA, Eclipse i NetBeans, nie oferują pełnego wsparcia dla Pythona, co sprawia, że programowanie w tym języku w tych środowiskach nie jest tak efektywne, jak w dedykowanych narzędziach.

Pytanie 22

W standardzie dokumentacji testów oprogramowania IEEE 829-1998 opisany jest dokument, który zawiera dane o tym, jakie przypadki testowe były wykorzystane, przez kogo i czy zakończyły się sukcesem. Co to jest?

A. Specyfikacja Procedury Testowej
B. Plan Testów
C. Raport Podsumowujący Testy
D. Dziennik Testów
Dokładnie – Dziennik Testów to ten dokument z IEEE 829-1998, który ma za zadanie rejestrować, które przypadki testowe zostały wykonane, przez kogo, kiedy oraz jaki był ich rezultat. Z mojego doświadczenia to jest taka codzienna „księga kucharska” testera – wpisujesz co zrobiłeś, o której i czy poszło zgodnie z planem. W prawdziwych projektach dziennik testów bywa nieoceniony: pozwala w każdej chwili wrócić do szczegółów, zweryfikować kto co testował i dlaczego test przerwano, a nawet rozliczać się z czasu pracy. To podstawa rozliczalności (ang. traceability) procesu testowania, co jest szczególnie ważne przy audytach czy testach dla klientów z branż regulowanych, np. medycyna czy bankowość. Sam standard IEEE 829-1998 bardzo konkretnie określa, jakie dane mają się tam znaleźć – to nie tylko „odhaczenie”, ale pełna informacja o przebiegu i wyniku każdego testu, ewentualnych problemach czy wyjątkowych sytuacjach. W praktyce, czy to prowadzisz Excela, dokumentację papierową czy system typu JIRA/Xray, dobrze prowadzony dziennik testów pozwala potem zidentyfikować luki w pokryciu przypadków, powtórzyć testy po naprawach czy po prostu udowodnić, że procedura była zgodna z wymaganiami. Warto to sobie wyrobić jako nawyk. Sam nieraz wracałem do starych dzienników, żeby sprawdzić „co poszło nie tak” parę miesięcy wcześniej – bez tego byłaby loteria!

Pytanie 23

W językach C++ bądź C# termin virtual można wykorzystywać w kontekście

A. metod klasy
B. atrybutów klasy
C. funkcji zaprzyjaźnionych
D. destruktorów
W kontekście języków C++ i C# pojęcie 'virtual' jest często błędnie kojarzone z różnymi składnikami klasy, takimi jak atrybuty czy funkcje zaprzyjaźnione. Jednakże, w praktyce i zgodnie ze standardami tych języków, nie istnieje możliwość oznaczenia atrybutów klasy (czyli jej pól, zmiennych członkowskich) jako wirtualnych – nie ma to sensu, ponieważ dziedziczenie i polimorfizm dotyczą zachowania, czyli metod, a nie danych. Wiele osób myli też funkcje zaprzyjaźnione z metodami klas tylko dlatego, że mają dostęp do prywatnych członków, ale 'friend' w C++ służy tylko do udzielania dodatkowych uprawnień, a nie do realizacji polimorfizmu – nie można więc użyć 'virtual' w takim kontekście. Jeśli chodzi o destruktory, to temat jest trochę bardziej złożony. W C++ destruktory rzeczywiście mogą być wirtualne i często powinny być, jeśli klasa ma dziedziczyć, żeby poprawnie usuwać obiekty przez wskaźniki do klasy bazowej. Jednak w C# wszystkie destruktory są niejako „wirtualne” z definicji i nie używa się tam słowa kluczowego 'virtual' przy destruktorach, bo zarządzanie pamięcią działa inaczej. Niestety, to też bywa źródłem nieporozumień. Całe zamieszanie bierze się z nieintuicyjnych różnic między tymi dwoma językami oraz z mylenia składników klasy z ich zachowaniem. Z mojego doświadczenia wynika, że najczęstszy błąd polega na traktowaniu 'virtual' jako czegoś, co można dodać „gdziekolwiek”, podczas gdy de facto jest to narzędzie skierowane ściśle do deklarowania i nadpisywania metod (funkcji członkowskich) klasy. Jeśli nie zrozumie się tej różnicy, łatwo później wpaść w pułapkę pisania nieczytelnego i nieefektywnego kodu. Warto więc trzymać się dobrych praktyk i nie kombinować tam, gdzie nie jest to przewidziane przez specyfikację języka.

Pytanie 24

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

A. iOS
B. Windows UWP
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 25

Zaprezentowany wykres ilustruje wyniki przeprowadzonych testów

Ilustracja do pytania
A. użyteczności
B. funkcjonalności
C. wydajności
D. ochrony
Wykres przedstawia czasy odpowiedzi strony internetowej co jest kluczowe w kontekście testów wydajnościowych. Testy wydajnościowe mają na celu zmierzenie jak system radzi sobie pod określonym obciążeniem i jak szybko potrafi odpowiedzieć na zapytania użytkowników. Tego typu analiza pomaga zidentyfikować potencjalne wąskie gardła w infrastrukturze IT. Przykładowo jeżeli czasy odpowiedzi DNS lub połączenia są zbyt długie może to wskazywać na potrzebę optymalizacji serwerów DNS lub infrastruktury sieciowej. Testy te są nieodłącznym elementem zapewnienia jakości oprogramowania a ich prawidłowe wykonanie wpływa na doświadczenia użytkowników końcowych. Dobra praktyka w branży IT zakłada regularne przeprowadzanie testów wydajnościowych w celu monitorowania stabilności systemu w warunkach zbliżonych do rzeczywistych. Warto również zauważyć że narzędzia takie jak JMeter czy LoadRunner są powszechnie używane do przeprowadzania takich testów co umożliwia symulację różnorodnych scenariuszy obciążenia i analizę wyników w czasie rzeczywistym.

Pytanie 26

Które z wymienionych praw autorskich nie wygasa po pewnym czasie?

A. Prawa pokrewne
B. Autorskie prawa osobiste
C. Licencje wolnego oprogramowania
D. Autorskie prawa majątkowe
Autorskie prawa majątkowe wygasają zazwyczaj po 70 latach od śmierci autora, co oznacza, że po tym czasie utwory przechodzą do domeny publicznej. Prawa pokrewne, które dotyczą m.in. artystów wykonawców i producentów fonogramów, mają ograniczony czas trwania (zwykle 50 lat od publikacji). Licencje wolnego oprogramowania, takie jak GNU GPL, również podlegają określonym warunkom czasowym i mogą wygasnąć lub zostać zmienione, jeśli autor zdecyduje się na aktualizację licencji.

Pytanie 27

Wykorzystując React.js oraz Angular, stworzono funkcjonalnie równoważne kody źródłowe. Aby móc w metodzie handleSubmit pokazać zawartość kontrolki input w miejscu oznaczonym ???, należy odwołać się do atrybutu o nazwie:
React.js:

nazwa1 = React.createRef();
handleSubmit = e => {
    console.log(this.???.current.value);
}
...
<form onSubmit={this.handleSubmit}>
    <input ref={this.nazwa1} name="nazwa2" id="nazwa3" for="nazwa4" />
Angular:
<form #f="ngForm" (ngSubmit) = "handleSubmit(f)">
    <input ngModel name="nazwa1" id="nazwa2" class="nazwa3" for="nazwa4" >
...
handleSubmit(f) {
    console.log(f.value.???);
}
A. nazwa4
B. nazwa2
C. nazwa1
D. nazwa3
Wybór atrybutów takich jak nazwa4, nazwa2 czy nazwa3 wynika często z nieporozumienia co do roli poszczególnych atrybutów we współczesnych frameworkach frontendowych. Identyfikator (id), klasa (class) czy nawet for mają swoje konkretne zadania, ale nie służą do powiązania wartości inputów z logiką formularza. Id stosujemy typowo do jednoznacznego oznaczania elementów w DOM-ie, co ułatwia stylowanie lub selektory JavaScript, jednak nie ma bezpośredniego przełożenia na to, jak frameworki typu React czy Angular pobierają wartości pól w formularzach – szczególnie jeśli korzystamy z referencji bądź systemu ngForm. Podobnie atrybut class ma charakter czysto prezentacyjny: używamy go do przypisywania styli CSS, ewentualnie do selektorów w testach automatycznych, ale nie do obsługi zdarzeń związanych z danymi formularza. For natomiast jest przydatny tylko w kontekście etykiet (label), by skojarzyć ją z konkretnym polem po id – nie wpływa na to, jak framework zbiera wartości inputów podczas submitowania formularza. Najczęstszym błędem, który obserwuję, jest zakładanie, że skoro id czy class są unikalne lub opisowe, to można przez nie pobierać wartości pól – to nie jest zgodne ani z dokumentacją Reacta, ani Angulara, ani standardami HTML5. To właśnie atrybut name pełni rolę logicznego identyfikatora wpisu w kontekście formularza: w Angularze ngForm buduje obiekt value na podstawie name każdego inputa, a w React – jeśli korzystasz z refów – również najwygodniej jest konsekwentnie opierać się o te same atrybuty, żeby formularze były czytelne i łatwe do utrzymania. W praktyce, kiedy ktoś wybiera inne atrybuty, ma to zwykle związek z brakiem znajomości architektury pracy z danymi w danym frameworku. Warto więc przeanalizować, jak frameworki mapują dane formularza i co wynika z oficjalnych tutoriali i dokumentacji. W dłuższej perspektywie praca z formularzami staje się wtedy dużo prostsza i mniej podatna na błędy, a kod jest bardziej przewidywalny i skalowalny.

Pytanie 28

Który z poniższych przypadków stanowi test niefunkcjonalny?

A. Sprawdzenie działania przycisku
B. Sprawdzenie obsługi formularza rejestracji
C. Weryfikacja poprawności logowania użytkownika
D. Testowanie wydajności aplikacji pod dużym obciążeniem
Testowanie wydajności aplikacji pod dużym obciążeniem to przykład testu niefunkcjonalnego. Jego celem jest ocena, jak aplikacja zachowuje się przy dużej liczbie użytkowników lub operacji jednocześnie. Testy te pozwalają na identyfikację wąskich gardeł i optymalizację kodu oraz infrastruktury serwerowej. W ramach testów obciążeniowych analizowane są parametry takie jak czas odpowiedzi, zużycie zasobów (CPU, RAM) oraz stabilność aplikacji w warunkach skrajnego obciążenia. Testowanie wydajności jest kluczowe w aplikacjach webowych, e-commerce oraz systemach o dużej liczbie transakcji, gdzie każdy przestój może generować straty finansowe i negatywnie wpływać na doświadczenia użytkownika.

Pytanie 29

Jakie są główne różnice między środowiskiem RAD (Rapid Application Development) a klasycznymi IDE?

A. RAD funkcjonuje tylko w systemach operacyjnych Linux
B. RAD koncentruje się tylko na testowaniu programów
C. RAD nie oferuje żadnych narzędzi do debugowania
D. RAD pozwala na szybkie tworzenie prototypów i rozwijanie aplikacji przy minimalnej ilości kodu
RAD (Rapid Application Development) to metodologia tworzenia oprogramowania, która kładzie nacisk na szybkie prototypowanie i iteracyjne podejście do rozwoju aplikacji, minimalizując czas poświęcany na pisanie kodu od podstaw. Kluczowym aspektem RAD jest możliwość szybkiego dostosowywania aplikacji do zmieniających się wymagań biznesowych oraz ciągła interakcja z klientem. Narzędzia RAD, takie jak Visual Studio, Delphi czy OutSystems, pozwalają na budowanie aplikacji przy użyciu graficznych interfejsów, gotowych komponentów i automatycznego generowania kodu, co znacząco skraca czas wprowadzenia produktu na rynek. RAD doskonale sprawdza się w przypadku projektów o krótkim cyklu życia i wymagających szybkich zmian.

Pytanie 30

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

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

Pytanie 31

Które z poniższych narzędzi jest używane do statycznej analizy kodu JavaScript?

A. Jest
B. Babel
C. ESLint
D. Webpack
Webpack, Babel i Jest to narzędzia, które pełnią różne funkcje w procesie tworzenia aplikacji JavaScript, jednak żadna z tych opcji nie jest używana do statycznej analizy kodu. Webpack to narzędzie do pakowania modułów, które pozwala programistom łączyć różne zasoby, takie jak skrypty, style czy obrazy, w jeden plik wynikowy, co jest bardzo przydatne w kontekście optymalizacji aplikacji. Z kolei Babel to transpilator, który umożliwia pisanie kodu w nowoczesnym JavaScript, a następnie konwertuje go do wersji, która jest kompatybilna z szerszą gamą przeglądarek. Dzięki Babel możemy korzystać z najnowszych funkcji języka, co zdecydowanie ułatwia rozwój, jednak nie ma on możliwości analizy statycznej. Natomiast Jest to framework testowy, który skupia się na jednostkowym testowaniu kodu JavaScript. Choć Jest pozwala na pisanie testów i sprawdzanie poprawności działania kodu, to również nie pełni roli narzędzia do analizy statycznej. Wybierając te narzędzia, można wprowadzać różne aspekty optymalizacji i poprawy jakości kodu, ale nie zastąpią one dedykowanych narzędzi do analizy, jak ESLint. Warto zrozumieć, że każde z tych narzędzi ma swoją specyfikę i zastosowanie, co jest kluczowe w kontekście efektywnego używania ich w projektach programistycznych.

Pytanie 32

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

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

Pytanie 33

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

A. LIFO
B. Sterta
C. FIFO
D. Stos
Stos (LIFO - Last In, First Out) działa odwrotnie – najnowsze zadanie jest przetwarzane jako pierwsze, co nie odpowiada kolejności drukowania. Sterta to inna struktura danych używana głównie do dynamicznej alokacji pamięci, a nie do zarządzania kolejkami zadań. LIFO nie nadaje się do implementacji kolejki wydruku, ponieważ najstarsze zadania mogą pozostawać nieprzetworzone, co prowadzi do nieefektywności i dezorganizacji procesów drukowania.

Pytanie 34

Jakie jest podstawowe zadanie konstruktora w klasie?

A. Inicjalizacja obiektu w momencie jego tworzenia
B. Nadanie wartości polom obiektu po jego zniszczeniu
C. Usuwanie instancji obiektów
D. Wprowadzenie nowej metody do już istniejącej klasy
Usuwanie obiektów to zadanie destruktora, a nie konstruktora. Destruktor zwalnia zasoby i wykonuje czyszczenie po zakończeniu działania obiektu. Przypisywanie wartości do pól po zniszczeniu obiektu jest niemożliwe, ponieważ obiekt przestaje istnieć. Dodawanie nowych metod do klasy odbywa się przez definiowanie funkcji członkowskich, ale nie jest to zadanie konstruktora. Konstruktor nie służy do tworzenia nowych funkcji – jego rolą jest wyłącznie inicjalizacja pól obiektu podczas jego tworzenia.

Pytanie 35

Które z poniższych twierdzeń najlepiej charakteryzuje metodę wirtualną?

A. Metoda, która działa wyłącznie dla statycznych pól danej klasy
B. Metoda, która może być wywoływana tylko przez klasę nadrzędną
C. Metoda, która może być przesłonięta w klasie dziedziczącej
D. Metoda, która jest zawsze stosowana w konstruktorach danej klasy
Wirtualna metoda to taka, która jest zdefiniowana w klasie bazowej i można ją nadpisać w klasie pochodnej. Fajna sprawa z tą metodą wirtualną jest taka, że działa na zasadzie dynamicznego wiązania, co w praktyce oznacza, że program decyduje w czasie działania, którą wersję metody wywołać. Dzięki temu mamy polimorfizm – możemy użyć różnych wersji tej samej metody, w zależności od typu obiektu, na którym pracujemy. To naprawdę ważny aspekt programowania obiektowego, bo pozwala na większą elastyczność i łatwiejsze rozwijanie kodu. W hierarchiach klas to się sprawdza, bo klasa bazowa ma ogólne metody, a klasy pochodne mogą je dostosować do swoich potrzeb.

Pytanie 36

Który z poniższych nie jest typem danych w języku JavaScript?

A. String
B. Integer
C. Object
D. Boolean
Wybór typów danych, takich jak Boolean, String i Object, jest prawidłowy w kontekście JavaScript, ponieważ wszystkie te typy są integralnymi elementami tego języka. Boolean reprezentuje dwie wartości: true i false, co jest niezbędne do tworzenia warunków i logiki w kodzie. Z kolei typ String służy do przechowywania tekstu, co jest kluczowe w każdej aplikacji webowej, umożliwiając manipulację danymi tekstowymi. Przykładowo, można korzystać z metod takich jak `toUpperCase()` czy `substring()`, aby przetwarzać napisy. Typ Object, z kolei, to bardziej złożona struktura, która może przechowywać wiele par klucz-wartość, co pozwala na modelowanie bardziej złożonych danych, takich jak obiekty użytkowników, produkty, czy cokolwiek, co wymaga złożonej struktury danych. Typowe błędy myślowe, które prowadzą do nieprawidłowych wniosków dotyczących typów danych, mogą wynikać z braku zrozumienia różnicy między typami w różnych językach programowania. Na przykład, w językach takich jak Java czy C#, Integer jest odrębnym typem, co może prowadzić do myślenia, że JavaScript działa w podobny sposób. W rzeczywistości jednak, JavaScript zapewnia uproszczoną i bardziej elastyczną obsługę typów numerycznych, a zrozumienie tych różnic jest kluczowe dla efektywnego programowania w tym języku.

Pytanie 37

W języku C# szablon List umożliwia korzystanie z listy. Z definicji obiektu kolekcji wynika, że jego elementami mogą być:

List<int> wykaz = new List<int>();
A. elementy o nieokreślonym typie
B. liczby całkowite
C. liczby rzeczywiste
D. elementy typu List
Jeżeli chodzi o kolekcje generyczne w C#, to List<int> jest przykładem bardzo konkretnego zastosowania. Ten zapis oznacza, że tworzymy listę, której elementami mogą być wyłącznie liczby całkowite – dokładnie takie, jakie reprezentuje typ int w .NET (czyli 32-bitowe liczby całkowite ze znakiem). Wynika to z idei generyczności: typ podany w nawiasach ostrych (<int>) precyzyjnie narzuca typ przechowywanych danych. To daje nam bezpieczeństwo typów, na które zwracają uwagę wszyscy programiści C# – nie da się przez pomyłkę dodać tam np. napisu czy obiektu innego typu. Z mojego doświadczenia mogę powiedzieć, że to bardzo upraszcza życie, bo kompilator od razu wychwyci próby niewłaściwego użycia. Praktycznie, gdy tworzysz List<int>, możesz ją wykorzystać np. do przechowywania identyfikatorów, wyników testów, liczb losowych – wszędzie tam, gdzie operujesz właśnie na liczbach całkowitych. Warto dodać, że generyczność jest jednym z filarów nowoczesnych języków, pozwalając pisać kod elastyczny i bezpieczny zarazem. Trochę jak z pudełkiem na śrubki: jak wrzucisz inne rzeczy, to od razu się pogubisz i zrobi się bałagan. Tutaj jest bardzo jasno – List<int> to zawsze lista liczb całkowitych i już. Dobre praktyki branżowe podpowiadają, żeby zawsze stosować jak najbardziej precyzyjne typy w generycznych kolekcjach, bo to ułatwia późniejsze utrzymanie kodu i ogranicza potencjalne błędy.

Pytanie 38

Jakie środowisko deweloperskie jest najczęściej używane do programowania w C#?

A. NetBeans
B. Eclipse
C. Visual Studio
D. PyCharm
Visual Studio to najczęściej wykorzystywane środowisko programistyczne (IDE) do tworzenia aplikacji w języku C#. Oferuje pełne wsparcie dla platformy .NET i umożliwia szybkie tworzenie aplikacji desktopowych, webowych i mobilnych. Visual Studio jest wyposażone w zaawansowane narzędzia do debugowania, projektowania interfejsów oraz integrację z systemami kontroli wersji. Dzięki rozbudowanemu ekosystemowi wtyczek i rozszerzeń Visual Studio jest idealnym rozwiązaniem zarówno dla początkujących, jak i zaawansowanych programistów, którzy tworzą aplikacje na system Windows oraz inne platformy.

Pytanie 39

W języku Java wyjątek ArrayIndexOutOfBoundsException występuje, gdy następuje próba dostępu do elementu tablicy, którego

A. wartość przekracza rozmiar tablicy
B. wartość przewyższa jego indeks
C. indeks jest równy lub większy od rozmiaru tablicy
D. indeks mieści się w zakresie od 0 do n-1, gdzie n oznacza rozmiar tablicy
Wyjątek ArrayIndexOutOfBoundsException w Javie to taki klasyk, na który łatwo się naciąć, zwłaszcza gdy operujesz na tablicach dynamicznie lub masz jakieś pętle i zapomnisz o poprawnych granicach. Ta odpowiedź jest prawidłowa, bo w języku Java indeksowanie tablic zaczyna się od 0, a ostatni poprawny indeks to zawsze rozmiar tablicy minus jeden. Jeśli próbujesz dostać się do elementu, którego indeks jest równy lub większy od rozmiaru tablicy, silnik uruchomieniowy Javy od razu rzuci ten wyjątek. Przykład? Masz tablicę int[] t = new int[5]; i próbujesz odwołać się do t[5] albo t[10] – nie zadziała, bo legalne są tylko indeksy 0, 1, 2, 3, 4. Moim zdaniem to jeden z tych wyjątków, które wyraźnie pokazują, jak ważne jest zabezpieczanie kodu i stosowanie praktyk takich jak sprawdzanie długości tablicy przed dostępem do jej elementów. W profesjonalnym kodzie, zwłaszcza komercyjnym, nie zostawia się takich rzeczy przypadkowi – często stosuje się pętle typu for (int i = 0; i < array.length; i++), żeby mieć pewność, że nigdzie nie wyjedziemy poza zakres. Dobra praktyka to też wykorzystywanie narzędzi jak testy jednostkowe, żeby wyłapywać takie błędy. Warto pamiętać, że ten wyjątek jest unchecked, czyli nie musisz go łapać w kodzie, ale dobrze jest rozumieć, że jego pojawienie się oznacza błąd w logice programu. Osobiście uważam, że jeśli ktoś raz się na tym przejedzie, to już zawsze sprawdza rozmiar tablicy przed dostępem – taka nauczka na całe życie programisty.

Pytanie 40

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

A. Gdy chcemy usunąć element z końca
B. Gdy kolejność przetwarzania danych jest odwrócona (LIFO)
C. Gdy ważne jest szybkie znajdowanie elementów
D. Gdy dane muszą być uporządkowane
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.