INF.04-02-26.01-SGStyczeń 2026 · 27 kroków · ok. 80 min · 32 kryteria z klucza
Rozwiązanie krok po kroku: Quiz górski konsolowy i mobilny (C# + .NET MAUI)
Rozwiązanie dotyczy arkusza z quizem o górach w wersji C# + .NET MAUI: w konsoli klasa abstrakcyjna Pytanie i dziedzicząca po niej PytanieZamkniete z trzema odpowiedziami i metodą sprawdzającą odpowiedź, a do tego dwa testy z części III - próba utworzenia obiektu klasy abstrakcyjnej, która kończy się błędem kompilacji, i pytanie wczytane z klawiatury; w aplikacji mobilnej .NET MAUI quiz ze zdjęciami z archiwum zad2.7z: pytanie, trzy odpowiedzi do wyboru i przycisk DALEJ, który liczy punkty i przechodzi do kolejnego pytania, a po ostatnim wraca do pierwszego. Kod aplikacji trafia do repozytorium Git w dwóch migawkach.
To drugie rozwiązanie tego arkusza - pierwsze, w zakładce obok, robi to samo w Javie i Android Studio. Arkusz pokazuje oba środowiska (obraz 2 to .NET MAUI), a klucz ocenia je tymi samymi kryteriami.
Kroki idą zdanie po zdaniu za treścią arkusza, a kod od początku jest taki, jak w porządnym projekcie. Na końcu dwa kroki porównują to rozwiązanie z wariantem w Javie.
Co widać w podglądzie. Wyniki programu konsolowego - także komunikat kompilatora z testu 1 - i wyniki poleceń Git pochodzą z prawdziwego uruchomienia kodu i poleceń z danego kroku (.NET 10, Git). Ekran telefonu to symulacja w przeglądarce zbudowana z pliku XAML danego kroku; jej zachowanie odpowiada kodowi C# z kroku - zaznacz odpowiedź i klikaj „DALEJ”. Każdy stan aplikacji zbudowano też naprawdę (dotnet build) i porównano z emulatorem Pixel 8 (Android 16).
Jak liczą się punkty. Klucz ma 32 kryteria (R.1.1 - R.4.7), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 24 punkty - można stracić 8 kryteriów i nadal zdać. Przy każdym kroku jest napisane, które kryteria spełnia; egzaminator ocenia spełnienie kryteriów z klucza, nie zgodność z tym kodem.
Suwak i strzałki obok niego - albo ←→ na klawiaturze - przechodzą krok po kroku; wyjaśnienie, pliki i podgląd zmieniają się razem z krokiem.
Lista „Etap” przenosi od razu do wybranego etapu.
„Rozwiązuję samodzielnie” chowa rozwiązanie kroku - najpierw własna próba, potem odsłonięcie.
„Tryb prezentacji” pokazuje same kroki, bez menu strony - na rzutnik.
Etap 1: Przygotowanie
Krok 1 · po tym etapie masz 0 z 32 kryteriów (pkt)
Krok 1: Folder zdającego, podfoldery i archiwum zad2.7z
ok. 3 min
Polecenie z arkusza
Utwórz folder i nazwij go numerem zdającego. W folderze utwórz podfoldery: konsolowa, mobilna, dokumentacja. Do zbudowania aplikacji zastosuj obrazy i treść pytań z archiwum zad2.7z zabezpieczonego hasłem ?Quiz5
Na pulpicie zakładasz folder o nazwie z numerem PESEL, a w nim konsolowa, mobilna i dokumentacja. Archiwum zad2.7z rozpakowujesz 7-Zipem z hasłem ?Quiz5 - w środku pytania.txt (trzy pytania, odpowiedzi, poprawna odpowiedź i nazwa obrazu) oraz zdjęcia zad1.jpg, zad2.jpg, zad3.jpg.
Poprawne odpowiedzi z pytania.txt: „Na Wielkiej Raczy.”, „owczarek.”, „Tatry.” - w każdym pytaniu inna pozycja (druga, pierwsza, trzecia).
Etap 2: Aplikacja konsolowa
Kroki 2-7 · po tym etapie masz 13 z 32 kryteriów (pkt)
Krok 2: Projekt konsola w C#
ok. 3 min
Polecenie z arkusza
Wykorzystując zasady programowania obiektowego zaprogramuj klasy do realizacji quizu o nazwach: Pytanie oraz PytanieZamkniete. Program wykonywany w konsoli. Zastosowany obiektowy język programowania zgodny z zainstalowanym na stanowisku egzaminacyjnym: C++ lub C#, lub Java, lub Python.
Wybierasz C# - ten sam język posłuży w .NET MAUI. W Visual Studio: Utwórz nowy projekt → Aplikacja konsolowa, nazwa konsola (dotnet new console -n konsola). Program główny piszesz w Program.cs jako instrukcje najwyższego poziomu, a każdą klasę w osobnym pliku (Dodaj → Klasa...).
Nazwy klas są narzucone przez arkusz - Pytanie i PytanieZamkniete - więc pola i metody też nazwiesz po polsku. Konwencja C#: metody i klasy wielką literą (SprawdzOdpowiedz), pola i zmienne lokalne małą.
konsola/Program.csC#nowy plik
Console.WriteLine("Hello, World!");
Wynik programu po tym kroku
> konsola.exe
Hello, World!
Krok 3: Klasa abstrakcyjna Pytanie i jej pola protected
Kryteria: , , , ,
R.2.1 Program zawiera klasę Pytanie oraz klasę potomną PytanieZamkniete
R.2.2 Klasa Pytanie jest abstrakcyjna (zawiera metodę abstrakcyjną lub słowo abstract, lub konstruktor niepubliczny, dziedziczy po klasie abc.ABC)
R.2.3 Klasa Pytanie zawiera pola protected: dwa napisowe oraz jedno logiczne (w Python podkreślnik przed nazwą)
R.1.4 Polskie lub angielskie, znaczące nazewnictwo pól. Wyjątkami od reguły są zmienne bufor, tmp, iteratory pętli itp. Kryterium nie jest spełnione, gdy nazwy zmiennych nic nie znaczą, np. x, fun, foo, tab, tablica
R.1.5 Typy zmiennych pasują do problemu np. typ tekstowy dla treści pytania, odpowiedzi i nazwy obrazu, char dla udzielonej odpowiedzi, bool dla określenia czy odpowiedź jest prawdziwa (w przypadku języka Python typ wynika z przypisanych danych)
ok. 3 min
Polecenie z arkusza
Klasa Pytanie, której obiekt nie może być powołany, zawiera: pola dostępne jedynie w klasie oraz w klasach potomnych, przechowujące: wartość tekstową z treścią pytania, nazwę pliku zawierającego zdjęcie do pytania, informację czy odpowiedź na pytanie jest poprawna, typu logicznego.
Plik Pytanie.cs. „Obiekt nie może być powołany” w C# zapisujesz słowem abstract: new Pytanie("Które to schronisko?", "zad1.jpg") nie skompiluje się (R.2.1, R.2.2).
Pola „dostępne jedynie w klasie oraz w klasach potomnych” to protected (R.2.3): dwa napisy string - treść i nazwa pliku - oraz bool czyPoprawna (R.1.5). Nazwy mówią, co przechowują (R.1.4). namespace konsola; - przestrzeń nazw projektu, wpisana przez szablon klasy.
Visual Studio podkreśla teraz pola ostrzeżeniem, że pole typu string może zostać null - zniknie, gdy konstruktor je wypełni.
R.2.5 Klasa Pytanie zawiera konstruktor dwuargumentowy, argumenty są przypisane odpowiednio do pól napisowych oraz pole logiczne jest ustawione na false
ok. 2 min
Polecenie z arkusza
Konstruktor dwuargumentowy, którego argumentami są treść pytania i nazwa pliku dla pytania. Na podstawie argumentów ustawia wartości pól. Ustawia pole logiczne: odpowiedź na pytanie nie jest poprawna.
Konstruktor przepisuje oba argumenty do pól (this. odróżnia pole od parametru o tej samej nazwie) i jawnie ustawia czyPoprawna = false (R.2.5). Pole bool i tak ma domyślnie false, ale arkusz wymaga ustawienia w konstruktorze.
Konstruktor jest protected: obiektu klasy abstrakcyjnej i tak nie da się utworzyć, więc konstruktor wywołują tylko klasy potomne. Tak zaleca analizator kodu .NET (reguła CA1012), a klucz wprost wymienia „konstruktor niepubliczny” jako cechę klasy abstrakcyjnej (R.2.2).
R.2.7 W klasie Pytanie zdefiniowana metoda abstrakcyjna typu logicznego (słowo kluczowe abstract lub Python: @abstractmethod i słowo pass) . Metoda nie ma implementacji oraz w klasie PytanieZamkniete istnieje metoda nadpisująca metodę abstrakcyjną z klasy Pytanie (w C# i Java obowiązkowo słowo override)
R.1.3 Polskie lub angielskie, znaczące nazewnictwo metod
ok. 2 min
Polecenie z arkusza
Metodę abstrakcyjną typu logicznego, sprawdzającą odpowiedź. Metoda ma jeden argument o typie znakowym, który przyjmuje wartości ‘A’ lub ‘B’ lub ‘C’ (odpowiedzi użytkownika na pytanie quizu). Metoda nie zawiera domyślnej implementacji.
Metoda abstract ma sam nagłówek zakończony średnikiem - bez ciała (R.2.7). Typ zwracany bool, parametr char - jeden znak 'A', 'B' albo 'C' (R.1.5). Każda klasa potomna, która nie jest abstrakcyjna, musi ją nadpisać - inaczej się nie skompiluje.
Krok 6: PytanieZamkniete: pola private i konstruktor przez base
Kryteria: , , , ,
R.2.1 Program zawiera klasę Pytanie oraz klasę potomną PytanieZamkniete
R.2.4 Klasa PytanieZamkniete zawiera pola private: trzy napisowe oraz jedno typu znakowego (w Python dwa podkreślniki przed nazwą)
R.2.6 Klasa PytanieZamkniete zawiera konstruktor sześcioargumentowy, który wywołuje konstruktor rodzica (np. super.__init__, :base(...), super(...) ) oraz przypisuje treści odpowiedzi i znak odpowiedzi prawidłowej (A, B lub C) do odpowiednich pól klasy
R.1.1 Kod źródłowy zapisany w sposób czytelny: instrukcje w osobnych liniach, stosowane spacje pomiędzy operatorami, konsekwentnie stosowana wybrana konwencja dla nawiasów klamrowych
R.1.2 Kod zapisany z wcięciami dla zagnieżdżeń bloków
ok. 4 min
Polecenie z arkusza
Klasa PytanieZamkniete dziedzicząca po klasie Pytanie. Klasa zawiera: pola dostępne jedynie w klasie, niedostępne w klasach potomnych, przechowujące: treść odpowiedzi A, treść odpowiedzi B, treść odpowiedzi C, informację o poprawnej odpowiedzi (znak ‘A’ lub ‘B’ lub ‘C’). Konstruktor sześcioargumentowy, o argumentach: treść pytania, nazwa pliku graficznego dla pytania, treść odpowiedzi A, treść odpowiedzi B, treść odpowiedzi C, odpowiedź poprawna. Konstruktor wywołuje konstruktor klasy, po której dziedziczy. Przypisuje treści odpowiedzi oraz poprawną odpowiedź do pól klasy.
Plik PytanieZamkniete.cs. Dziedziczenie w C# zapisujesz dwukropkiem: : Pytanie (R.2.1). Pola niedostępne w klasach potomnych to private: trzy napisy z odpowiedziami i char poprawnaOdpowiedz (R.2.4).
Konstruktor ma sześć parametrów. Wywołanie konstruktora klasy bazowej stoi przed ciałem konstruktora: : base(tresc, plikObrazu) - ustawi treść, plik i czyPoprawna (w Javie to super(tresc, plikObrazu) w pierwszej linii). W ciele przepisujesz cztery własne pola (R.2.6).
Visual Studio podkreśla teraz klasę na czerwono - nie nadpisuje jeszcze metody abstrakcyjnej. Naprawi to następny krok.
Typowe błędy
Bez : base(tresc, plikObrazu) kompilator zgłasza błąd CS7036 - Pytanie nie ma konstruktora bezparametrowego, więc klasa potomna musi wskazać, który konstruktor rodzica wywołać (R.2.6).
R.2.7 W klasie Pytanie zdefiniowana metoda abstrakcyjna typu logicznego (słowo kluczowe abstract lub Python: @abstractmethod i słowo pass) . Metoda nie ma implementacji oraz w klasie PytanieZamkniete istnieje metoda nadpisująca metodę abstrakcyjną z klasy Pytanie (w C# i Java obowiązkowo słowo override)
R.2.8 W klasie PytanieZamkniete jest zaimplementowana metoda, która sprawdza czy odpowiedź z argumentu zgadza się z poprawną, jeśli tak, przypisuje zmiennej logicznej z klasy Pytanie wartość true; zwracana jest wartość pola logicznego
ok. 3 min
Polecenie z arkusza
Implementację metody abstrakcyjnej sprawdzającej odpowiedź, która: sprawdza czy odpowiedź jest poprawna i w zależności od wyniku, przypisuje odpowiednią wartość do pola logicznego. Zwraca wartość pola logicznego.
W C# nadpisanie metody wymaga słowa override w nagłówku - bez niego kompilator potraktuje metodę jako nową i zgłosi, że klasa nie implementuje metody abstrakcyjnej. Klucz wymaga go wprost: „w C# i Java obowiązkowo słowo override” (R.2.7).
Wynik porównania odpowiedz == poprawnaOdpowiedz to od razu true albo false - przypisujesz go do odziedziczonego pola czyPoprawna (dostępnego, bo jest protected) i zwracasz (R.2.8). Znaki char porównujesz operatorem ==.
Kroki 8-11 · po tym etapie masz 17 z 32 kryteriów (pkt)
Krok 8: Test 1: próba utworzenia obiektu klasy Pytanie
Kryteria: ,
R.4.1 W aplikacji konsolowej jest wykonany test inicjacji obiektu klasy Pytanie - test nie powiódł się (kod nie skompilował się) , co jest udokumentowane na zrzucie ekranu
R.1.6 Podjęta próba uruchomienia kodu, co jest udokumentowane zrzutem ekranowym przedstawiającym uruchomiony program lub jego kompilację
ok. 2 min
Polecenie z arkusza
Sprawdź działanie klas zaimplementowanych w I części egzaminu. Zweryfikuj możliwość utworzenia obiektu klasy Pytanie. Po próbie uruchomienia programu wykonaj zrzut ekranu z otrzymanym błędem i zapisz pod nazwą test1.png w folderze dokumentacja.
W Program.cs zamiast „Hello, World!” próbujesz utworzyć obiekt klasy abstrakcyjnej (using konsola; udostępnia klasy z przestrzeni nazw projektu). Program nie skompiluje się - i o to w tym teście chodzi. Podgląd to prawdziwy komunikat kompilatora C#: CS0144 - nie można utworzyć wystąpienia klasy abstrakcyjnej.
Zrzut całego ekranu z Visual Studio i oknem Lista błędów zapisujesz jako test1.png w folderze dokumentacja (R.4.1, R.1.6).
konsola/Program.csC#zmienione: 3 linie
using konsola;Pytanie pytanie = new Pytanie("Które to schronisko?", "zad1.jpg");
Wynik programu po tym kroku
> dotnet build
Program.cs(3,19): error CS0144: Nie można utworzyć wystąpienia typu lub interfejsu abstrakcyjnego „Pytanie”
Krok 9: Test 2: dane pytania z klawiatury
Kryteria: ,
R.4.2 W aplikacji konsolowej jest wykonany test obiektu klasy PytanieZamkniete : obiekt inicjowano danymi wczytanymi z klawiatury, udzielono odpowiedzi, program wypisał czy odpowiedź jest prawidłowa (metoda sprawdzająca poprawność) co jest udokumentowane na zrzucie ekranu
R.1.7 Program nawiązuje zrozumiałą komunikację z użytkownikiem. Wystarczy, że wyświetla dane (quiz) lub informację o poprawności udzielonej odpowiedzi w dowolnej aplikacji. Jeżeli kod nie uruchamia się z powodu błędów kompilacji - sprawdzić w kodzie aplikacji
ok. 4 min
Polecenie z arkusza
Następnie umieść ten kod w komentarzu. W programie głównym zainicjuj obiekt klasy PytanieZamkniete, dane do konstruktora wczytaj z klawiatury.
Kod testu 1 zamieniasz w komentarz - zostaje w pliku jako ślad testu, a program znów się kompiluje.
Sześć danych do konstruktora wczytujesz z klawiatury, każde po opisie (R.1.7). Żeby nie powtarzać sześć razy pary Console.Write + Console.ReadLine, dopisujesz dwie małe funkcje lokalne:
Wczytaj - wypisuje monit i zwraca wpisany wiersz; Console.ReadLine() może zwrócić null (koniec danych), więc ?? "" podstawia wtedy pusty napis,
WczytajLitere - pyta do skutku, aż dostanie niepusty tekst, i zwraca jego pierwszy znak jako char, zamieniony na wielką literę (ToUpper) - odpowiedź b też będzie 'B'.
Z tych danych tworzysz obiekt PytanieZamkniete (R.4.2).
konsola/Program.csC#zmienione: 27 linii
using konsola;// Test 1: obiektu klasy abstrakcyjnej nie można utworzyć - błąd kompilacji CS0144 (zrzut test1.png)// Pytanie pytanie = new Pytanie("Które to schronisko?", "zad1.jpg");string tresc = Wczytaj("Treść pytania: ");string plikObrazu = Wczytaj("Nazwa pliku obrazu: ");string odpowiedzA = Wczytaj("Odpowiedź A: ");string odpowiedzB = Wczytaj("Odpowiedź B: ");string odpowiedzC = Wczytaj("Odpowiedź C: ");char poprawna = WczytajLitere("Poprawna odpowiedź (A, B lub C): ");PytanieZamkniete pytanie = new PytanieZamkniete(tresc, plikObrazu, odpowiedzA, odpowiedzB, odpowiedzC, poprawna);staticstringWczytaj(string monit){ Console.Write(monit);return Console.ReadLine() ?? "";}staticcharWczytajLitere(string monit){string tekst;do { tekst = Wczytaj(monit).Trim().ToUpper(); } while (tekst.Length == 0);return tekst[0];}
Wynik programu po tym kroku
> konsola.exe
Treść pytania: Które to schronisko?
Nazwa pliku obrazu: zad1.jpg
Odpowiedź A: Na Rysiance.
Odpowiedź B: Na Wielkiej Raczy.
Odpowiedź C: Na Wielkiej Rycerzowej.
Poprawna odpowiedź (A, B lub C): B
Krok 10: Test 2: odpowiedź z klawiatury i wynik
Kryteria:
R.4.2 W aplikacji konsolowej jest wykonany test obiektu klasy PytanieZamkniete : obiekt inicjowano danymi wczytanymi z klawiatury, udzielono odpowiedzi, program wypisał czy odpowiedź jest prawidłowa (metoda sprawdzająca poprawność) co jest udokumentowane na zrzucie ekranu
ok. 3 min
Polecenie z arkusza
Wczytaj z klawiatury odpowiedź na pytanie. Sprawdź za pomocą metody poprawność odpowiedzi i wyświetl na ekranie tekst „Odpowiedź prawidłowa” lub „Odpowiedź nieprawidłowa”. Wykonaj zrzut ekranu o nazwie test2.png.
Odpowiedź użytkownika to znowu jeden znak. Metoda SprawdzOdpowiedz zwraca bool, więc wywołujesz ją wprost w warunku if i wypisujesz jeden z dwóch tekstów z arkusza (R.4.2).
Podgląd to dwa prawdziwe uruchomienia z pierwszym pytaniem z pytania.txt: odpowiedź b (prawidłowa - wpisana małą literą, zamieniona na B) i A (nieprawidłowa). Zrzut z wynikiem - test2.png w folderze dokumentacja.
konsola/Program.csC#zmienione: 10 linii
using konsola;// Test 1: obiektu klasy abstrakcyjnej nie można utworzyć - błąd kompilacji CS0144 (zrzut test1.png)// Pytanie pytanie = new Pytanie("Które to schronisko?", "zad1.jpg");string tresc = Wczytaj("Treść pytania: ");string plikObrazu = Wczytaj("Nazwa pliku obrazu: ");string odpowiedzA = Wczytaj("Odpowiedź A: ");string odpowiedzB = Wczytaj("Odpowiedź B: ");string odpowiedzC = Wczytaj("Odpowiedź C: ");char poprawna = WczytajLitere("Poprawna odpowiedź (A, B lub C): ");PytanieZamkniete pytanie = new PytanieZamkniete(tresc, plikObrazu, odpowiedzA, odpowiedzB, odpowiedzC, poprawna);char odpowiedz = WczytajLitere("Twoja odpowiedź: ");if (pytanie.SprawdzOdpowiedz(odpowiedz)){ Console.WriteLine("Odpowiedź prawidłowa");}else{ Console.WriteLine("Odpowiedź nieprawidłowa");}staticstringWczytaj(string monit){ Console.Write(monit);return Console.ReadLine() ?? "";}staticcharWczytajLitere(string monit){string tekst;do { tekst = Wczytaj(monit).Trim().ToUpper(); } while (tekst.Length == 0);return tekst[0];}
Wynik programu po tym kroku
> konsola.exe
Treść pytania: Które to schronisko?
Nazwa pliku obrazu: zad1.jpg
Odpowiedź A: Na Rysiance.
Odpowiedź B: Na Wielkiej Raczy.
Odpowiedź C: Na Wielkiej Rycerzowej.
Poprawna odpowiedź (A, B lub C): B
Twoja odpowiedź: b
Odpowiedź prawidłowa
> konsola.exe
Treść pytania: Które to schronisko?
Nazwa pliku obrazu: zad1.jpg
Odpowiedź A: Na Rysiance.
Odpowiedź B: Na Wielkiej Raczy.
Odpowiedź C: Na Wielkiej Rycerzowej.
Poprawna odpowiedź (A, B lub C): B
Twoja odpowiedź: A
Odpowiedź nieprawidłowa
Krok 11: Folder konsolowa: archiwum, źródła i plik wykonywalny
ok. 2 min
Polecenie z arkusza
Kod aplikacji przygotuj do nagrania na płytę. W folderze konsolowa powinno znaleźć się archiwum całego projektu o nazwie konsola.zip, skopiowany z projektu plik z kodem źródłowym programu oraz plik wykonywalny, jeżeli istnieje.
Folder projektu pakujesz do konsola.zip, obok kopiujesz Pytanie.cs, PytanieZamkniete.cs, Program.cs i plik wykonywalny konsola.exe z bin\Debug\net8.0 razem z konsola.dll, bez którego .exe się nie uruchomi.
Kroki 12-16 · po tym etapie masz 20 z 32 kryteriów (pkt)
Krok 12: Nowy projekt Quiz (.NET MAUI) i zdjęcia w Resources/Images
ok. 4 min
Polecenie z arkusza
Za pomocą środowiska programistycznego dostępnego na stanowisku egzaminacyjnym wykonaj aplikację mobilną quizu dotyczącego gór.
W Visual Studio: Utwórz nowy projekt → Aplikacja .NET MAUI, nazwa Quiz (dotnet new maui -n Quiz). Będziesz zmieniać MainPage.xaml (wygląd) i MainPage.xaml.cs (kod strony). Strona jest osadzona w Shell - stąd pasek „Home”, jak na obrazie 2 arkusza.
Zdjęcia zad1.jpg - zad3.jpg przeciągasz do folderu Resources/Images - reguła MauiImage w pliku projektu dołącza je do aplikacji, a w kodzie wskazujesz je po nazwie pliku. Zdjęcia z archiwum mają 4032 × 3024 pikseli - aplikacja z nimi działa, ale budowanie i start trwają dłużej; zmniejszenie do 1200 px (np. w Paincie: Zmień rozmiar) to oszczędność, nie wymóg.
Quiz/MainPage.xamlXAMLnowy plik
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Quiz.MainPage"><ScrollView><VerticalStackLayoutPadding="30,0"Spacing="25"><ImageSource="dotnet_bot.png"HeightRequest="185"Aspect="AspectFit"SemanticProperties.Description="dot net bot in a submarine number ten"/><LabelText="Hello, World!"Style="{StaticResource Headline}"SemanticProperties.HeadingLevel="Level1"/><LabelText="Welcome to .NET Multi-platform App UI"Style="{StaticResource SubHeadline}"SemanticProperties.HeadingLevel="Level2"SemanticProperties.Description="Welcome to dot net Multi platform App U I"/><Buttonx:Name="CounterBtn"Text="Click me"SemanticProperties.Hint="Counts the number of times you click"Clicked="OnCounterClicked"HorizontalOptions="Fill"/></VerticalStackLayout></ScrollView></ContentPage>
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 13: Strona z tłem #2E7CB8 i VerticalStackLayout
Kryteria: ,
R.3.1 Zastosowany język znaczników XML/XAML lub inny do opisu interfejsu użytkownika oraz zdefiniowana przynajmniej jedna kontrolka
R.3.3 Kolor tła okna lub rozkładu #2E7CB8, rozmiar czcionki z treścią pytania jest większy niż pozostałe treści, w jednym momencie można wybrać tylko jedno pole radio
ok. 2 min
Polecenie z arkusza
Interfejs użytkownika zapisany za pomocą języka znaczników wspieranego w danym środowisku (np. XAML, XML). Zastosowany dowolny rozkład pozwalający na rozmieszczenie elementów zgodnie z obrazami 1 lub 2. Tło okna lub rozkładu #2E7CB8.
Usuwasz przykładową treść szablonu. Strona dostaje tło BackgroundColor="#2E7CB8" (R.3.3), a elementy z obrazu 2 stoją jeden pod drugim - wystarczy VerticalStackLayout (R.3.1). Padding="10" odsuwa treść od krawędzi, Spacing="10" daje odstęp między kolejnymi elementami.
Z MainPage.xaml.cs usuwasz licznik i OnCounterClicked - zostaje konstruktor z InitializeComponent().
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 14: Zdjęcie zad1.jpg i treść pytania na środku
Kryteria: ,
R.3.2 Zdefiniowane kontrolki: obraz z pliku zad1.jpg , pole tekstowe z treścią pytania: „Które to schronisko?” trzy pola radio z odpowiedziami, oraz przycisk DALEJ
R.3.3 Kolor tła okna lub rozkładu #2E7CB8, rozmiar czcionki z treścią pytania jest większy niż pozostałe treści, w jednym momencie można wybrać tylko jedno pole radio
ok. 3 min
Polecenie z arkusza
Obraz z wartością początkową zad1.jpg. Pole tekstowe z treścią pytania: „Które to schronisko?”. Biały kolor czcionki dla elementów. Rozmiar czcionki z treścią pytania większy niż pozostałe treści. Wyśrodkowane w poziomie obraz, treść pytania i przycisk.
Image z wysokością 250 zajmuje szerokość układu. Domyślne dopasowanie Aspect="AspectFit" mieści całe zdjęcie w ramce z zachowaniem proporcji i stawia je na środku - stąd wyśrodkowanie, także dla pionowego zdjęcia psa (R.3.2).
Label z pytaniem: biały tekst, 24 - pozostałe teksty zostaną przy domyślnych 14 (R.3.2, R.3.3); HorizontalOptions="Center" stawia go na środku.
Oba elementy mają nazwy x:Name - kod będzie podmieniał zdjęcie i treść przy kolejnych pytaniach.
Quiz/MainPage.xamlXAMLzmienione: 10 linii
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Quiz.MainPage"BackgroundColor="#2E7CB8"><VerticalStackLayoutPadding="10"Spacing="10"><Imagex:Name="QuestionImage"Source="zad1.jpg"HeightRequest="250"Margin="0,30,0,0"/><Labelx:Name="QuestionLabel"Text="Które to schronisko?"FontSize="24"TextColor="White"HorizontalOptions="Center"/></VerticalStackLayout></ContentPage>
Ekran telefonu po tym kroku
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 15: Trzy odpowiedzi RadioButton w jednej grupie
Kryteria: ,
R.3.2 Zdefiniowane kontrolki: obraz z pliku zad1.jpg , pole tekstowe z treścią pytania: „Które to schronisko?” trzy pola radio z odpowiedziami, oraz przycisk DALEJ
R.3.3 Kolor tła okna lub rozkładu #2E7CB8, rozmiar czcionki z treścią pytania jest większy niż pozostałe treści, w jednym momencie można wybrać tylko jedno pole radio
ok. 3 min
Polecenie z arkusza
Trzy pola radio z odpowiedziami: „Na Rysiance.”, „Na Wielkiej Raczy.”, „Na Wielkiej Rycerzowej.”. Jednocześnie można wybrać tylko jedno pole radio. Wyrównane do lewej strony pola typu radio.
Trzy kontrolki RadioButton z treścią w Content (R.3.2). Wspólna wartość GroupName="Answers" łączy je w jedną grupę: zaznaczenie jednej odpowiedzi odznacza pozostałe (R.3.3). Przyciski radio stojące w jednym układzie i tak tworzą grupę, ale GroupName zapisuje to jawnie i działa niezależnie od układu.
Przyciski wypełniają szerokość, a kółko i tekst stoją przy lewej krawędzi - wyrównanie do lewej jak w arkuszu. Zaznacz odpowiedzi w podglądzie.
Typowe błędy
Różne wartości GroupName przy odpowiedziach jednego pytania - każda jest osobną grupą i da się zaznaczyć wszystkie trzy naraz (R.3.3).
Quiz/MainPage.xamlXAMLzmienione: 15 linii
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Quiz.MainPage"BackgroundColor="#2E7CB8"><VerticalStackLayoutPadding="10"Spacing="10"><Imagex:Name="QuestionImage"Source="zad1.jpg"HeightRequest="250"Margin="0,30,0,0"/><Labelx:Name="QuestionLabel"Text="Które to schronisko?"FontSize="24"TextColor="White"HorizontalOptions="Center"/><RadioButtonx:Name="AnswerA"Content="Na Rysiance."GroupName="Answers"TextColor="White"/><RadioButtonx:Name="AnswerB"Content="Na Wielkiej Raczy."GroupName="Answers"TextColor="White"/><RadioButtonx:Name="AnswerC"Content="Na Wielkiej Rycerzowej."GroupName="Answers"TextColor="White"/></VerticalStackLayout></ContentPage>
Ekran telefonu po tym kroku
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 16: Przycisk DALEJ na środku
Kryteria:
R.3.2 Zdefiniowane kontrolki: obraz z pliku zad1.jpg , pole tekstowe z treścią pytania: „Które to schronisko?” trzy pola radio z odpowiedziami, oraz przycisk DALEJ
ok. 1 min
Polecenie z arkusza
Przycisk DALEJ. Wyśrodkowane w poziomie obraz, treść pytania i przycisk.
Przycisk z HorizontalOptions="Center" - szerokość napisu, na środku (R.3.2). Biały napis i fioletowe tło daje mu styl szablonu (Resources/Styles/Styles.xaml). Widok jest gotowy - zgodny z obrazem 2.
Quiz/MainPage.xamlXAMLzmienione: 3 linie
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Quiz.MainPage"BackgroundColor="#2E7CB8"><VerticalStackLayoutPadding="10"Spacing="10"><Imagex:Name="QuestionImage"Source="zad1.jpg"HeightRequest="250"Margin="0,30,0,0"/><Labelx:Name="QuestionLabel"Text="Które to schronisko?"FontSize="24"TextColor="White"HorizontalOptions="Center"/><RadioButtonx:Name="AnswerA"Content="Na Rysiance."GroupName="Answers"TextColor="White"/><RadioButtonx:Name="AnswerB"Content="Na Wielkiej Raczy."GroupName="Answers"TextColor="White"/><RadioButtonx:Name="AnswerC"Content="Na Wielkiej Rycerzowej."GroupName="Answers"TextColor="White"/><ButtonText="DALEJ"HorizontalOptions="Center"/></VerticalStackLayout></ContentPage>
Ekran telefonu po tym kroku
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Etap 5: Git
Krok 17 · po tym etapie masz 22 z 32 kryteriów (pkt)
Krok 17: Repozytorium Git i pierwsza migawka: widok
Kryteria: ,
R.4.4 Skonfigurowane repozytorium wersji Git (email [email protected] , nazwa użytkownika - numer zdającego) co jest udokumentowane zrzutem ekranu
R.4.5 Wykonane co najmniej dwa zapisy wersji do repozytorium wersji Git co jest udokumentowane zrzutem ekranu
ok. 4 min
Polecenie z arkusza
Po przygotowaniu projektu utwórz lokalne repozytorium wersji Git, podczas pracy utwórz co najmniej 2 zapisy wersji: po utworzeniu widoku aplikacji oraz po zapisaniu działania aplikacji. Komentarze migawek (commit) powinny być znaczące. Skonfiguruj repozytorium Git: jako nazwę użytkownika użyj numer zdającego, jako email użytkownika [email protected]. UWAGA: Po utworzeniu widoku aplikacji zapisz stan kodu za pomocą Git.
W Visual Studio: Widok → Terminal (katalog projektu) i kolejno:
git init - puste repozytorium w folderze projektu,
dotnet new gitignore - plik .gitignore dla projektów .NET: foldery bin i obj (wyniki budowania, setki megabajtów) nie trafią do repozytorium. Szablon MAUI go nie tworzy - bez niego git add . dodałby tysiące plików,
git config user.name i git config user.email - bez --global dotyczą tylko tego repozytorium; nazwą jest numer PESEL, tu stoi Bartosz Bryniarski (R.4.4),
git add . i git commit -m "..." - migawka ze znaczącym opisem (R.4.5).
Podgląd to prawdziwy wynik tych poleceń w projekcie z tego kroku. To samo da się wyklikać: Git → Utwórz repozytorium Git - Visual Studio dołoży .gitignore sam.
Typowe błędy
git add . bez .gitignore - do migawki trafiają foldery bin i obj; repozytorium i archiwum mobilna.zip puchną do setek megabajtów.
Wynik programu po tym kroku
> git init
Initialized empty Git repository in C:/Users/Egzamin/source/repos/Quiz/.git/
> dotnet new gitignore
Pomyślnie utworzono szablon "plik dotnet gitignore".
> git config user.name "Bartosz Bryniarski"
> git config user.email "[email protected]"
> git add .
> git commit -q -m "Widok quizu: obraz, pytanie, trzy odpowiedzi i przycisk DALEJ"
> git log --oneline
4abcbfb Widok quizu: obraz, pytanie, trzy odpowiedzi i przycisk DALEJ
Etap 6: Aplikacja mobilna - działanie
Kroki 18-21 · po tym etapie masz 28 z 32 kryteriów (pkt)
Krok 18: Pytania w liście rekordów Question
Kryteria:
R.3.4 Umieszczone treść pytań i odpowiedzi w tablicy, liście lub innej kolekcji. Aplikacja zawsze działa na wszystkich elementach kolekcji np. za pomocą pętli
ok. 4 min
Polecenie z arkusza
Treść pytań i odpowiedzi można skopiować z pliku pytania.txt wypakowanego z archiwum ZIP. Wszystkie pytania należy zapisać w tablicy, liście lub innej kolekcji.
Jedno pytanie to cztery dane: nazwa zdjęcia, treść, trzy odpowiedzi i indeks poprawnej odpowiedzi. Zamiast czterech równoległych tablic opisujesz pytanie rekordem - jedną linią: record Question(string Image, string Text, string[] Answers, int CorrectAnswer). Kompilator sam tworzy z niej klasę z konstruktorem i właściwościami tylko do odczytu.
Wszystkie pytania trzymasz w liścieList<Question> (R.3.4); new("zad1.jpg", "Które to schronisko?", [...], 1) tworzy kolejny rekord, a [...] to wyrażenie kolekcji z C# 12. Indeksy poprawnych odpowiedzi: „Na Wielkiej Raczy.” to 1, „owczarek.” - 0, „Tatry.” - 2. Pole currentQuestion mówi, które pytanie jest na ekranie, points liczy punkty.
Klas Pytanie i PytanieZamkniete z konsoli arkusz pozwala użyć, ale nie wymaga; ich pola są private i protected, więc aplikacja nie odczytałaby z nich treści bez dopisywania metod.
Quiz/MainPage.xaml.csC#zmienione: 11 linii
namespace Quiz;publicpartialclassMainPage : ContentPage{privatereadonly List<Question> questions =[ new("zad1.jpg", "Które to schronisko?", ["Na Rysiance.", "Na Wielkiej Raczy.", "Na Wielkiej Rycerzowej."], 1),new("zad2.jpg", "Zwierzę na zdjęciu to", ["owczarek.", "wilk.", "kozica."], 0),new("zad3.jpg", "W oddali są widoczne", ["Himalaje.", "Alpy.", "Tatry."], 2), ];privateint currentQuestion = 0;privateint points = 0;publicMainPage() { InitializeComponent(); }privaterecordQuestion(string Image, string Text, string[] Answers, int CorrectAnswer);}
R.3.4 Umieszczone treść pytań i odpowiedzi w tablicy, liście lub innej kolekcji. Aplikacja zawsze działa na wszystkich elementach kolekcji np. za pomocą pętli
R.3.6 Program odwołuje się do przynajmniej jednej kontrolki w sposób zgodny z danym środowiskiem programistycznym
R.1.3 Polskie lub angielskie, znaczące nazewnictwo metod
ok. 4 min
Polecenie z arkusza
Aplikacja jest uniwersalna - zawsze działa na wszystkich elementach kolekcji. Wszystkie pola radio nie są zaznaczone.
Do kontrolek odwołujesz się po nazwach z x:Name - kompilator tworzy z nich pola klasy (R.3.6). Trzy przyciski radio wkładasz do tablicy answerButtons, dzięki czemu ich treść ustawiasz pętlą po indeksach (R.3.4).
Metoda ShowQuestion wyświetla pytanie o indeksie currentQuestion: zdjęcie (Source - napis z nazwą pliku MAUI zamienia na obraz), treść i trzy odpowiedzi; IsChecked = false odznacza każdy przycisk. Wywołujesz ją w konstruktorze, po InitializeComponent() - ekran startowy bierze dane z listy, nie z XAML.
R.3.5 Program obsługuje zdarzenie kliknięcia przycisku w sposób właściwy dla danego środowiska programistycznego. Wystarczy, że kontrolka przycisku jest odpowiednio powiązana ze zdarzeniem
R.3.10 Jeżeli wybrana odpowiedź jest prawidłowa, inkrementowana jest liczba punktów
ok. 3 min
Polecenie z arkusza
Po wybraniu przycisku DALEJ: inkrementowana jest liczba punktów, jeśli wybrano prawidłową odpowiedź.
Kliknięcie wiążesz w XAML: Clicked="OnNextClicked" (R.3.5). questions[currentQuestion].CorrectAnswer to indeks poprawnej odpowiedzi bieżącego pytania, a answerButtons[...] - przycisk radio z tą odpowiedzią. Jeśli jest zaznaczony (IsChecked), points++ (R.3.10).
Na razie przycisk tylko liczy punkty - ekran się nie zmienia.
Quiz/MainPage.xamlXAMLzmienione: 1 linia
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Quiz.MainPage"BackgroundColor="#2E7CB8"><VerticalStackLayoutPadding="10"Spacing="10"><Imagex:Name="QuestionImage"Source="zad1.jpg"HeightRequest="250"Margin="0,30,0,0"/><Labelx:Name="QuestionLabel"Text="Które to schronisko?"FontSize="24"TextColor="White"HorizontalOptions="Center"/><RadioButtonx:Name="AnswerA"Content="Na Rysiance."GroupName="Answers"TextColor="White"/><RadioButtonx:Name="AnswerB"Content="Na Wielkiej Raczy."GroupName="Answers"TextColor="White"/><RadioButtonx:Name="AnswerC"Content="Na Wielkiej Rycerzowej."GroupName="Answers"TextColor="White"/><ButtonText="DALEJ"Clicked="OnNextClicked"HorizontalOptions="Center"/></VerticalStackLayout></ContentPage>
Krok 21: DALEJ: następne pytanie, po ostatnim - pierwsze
Kryteria: , ,
R.3.8 Po wybraniu przycisku jeżeli istnieje następne pytanie w quizie, jest ono wyświetlane oraz wszystkie przyciski radio nie są zaznaczone (w uruchomionej aplikacji lub na zrzucie i obowiązkowo w kodzie)
R.3.9 Po wybraniu przycisku jeżeli jest to ostatnie pytanie, jest wyświetlane pierwsze pytanie (w uruchomionej aplikacji lub na zrzucie i obowiązkowo w kodzie)
R.3.4 Umieszczone treść pytań i odpowiedzi w tablicy, liście lub innej kolekcji. Aplikacja zawsze działa na wszystkich elementach kolekcji np. za pomocą pętli
ok. 3 min
Polecenie z arkusza
Jeżeli istnieją następne pytania w quizie, wyświetlane jest kolejne pytanie. W przeciwnym wypadku wyświetlane jest ponownie pytanie pierwsze. Wszystkie pola radio nie są zaznaczone.
Indeks zwiększasz o 1 i bierzesz resztę z dzielenia przez liczbę pytań: 0 → 1 → 2 → 0 (R.3.8, R.3.9). Liczba pytań to questions.Count (lista ma Count, tablica - Length), a nie wpisane na sztywno 3 - po dopisaniu czwartego rekordu do listy quiz obejmie go bez zmian w kodzie (R.3.4). ShowQuestion() wyświetla nowe pytanie i odznacza przyciski radio (R.3.8).
Zaznacz odpowiedź i kliknij „DALEJ” trzy razy - po trzecim pytaniu wraca pierwsze.
Typowe błędy
currentQuestion++ bez powrotu do zera - po ostatnim pytaniu questions[3] zatrzymuje aplikację z ArgumentOutOfRangeException (R.3.9).
Krok 22 · po tym etapie masz 28 z 32 kryteriów (pkt)
Krok 22: Druga migawka i log z konfiguracją
Kryteria: ,
R.4.4 Skonfigurowane repozytorium wersji Git (email [email protected] , nazwa użytkownika - numer zdającego) co jest udokumentowane zrzutem ekranu
R.4.5 Wykonane co najmniej dwa zapisy wersji do repozytorium wersji Git co jest udokumentowane zrzutem ekranu
ok. 3 min
Polecenie z arkusza
UWAGA: Po zaprogramowaniu aplikacji zapisz stan kodu za pomocą Git. Wykorzystując polecenia Git lub wbudowane narzędzia systemu kontroli wersji w środowisku programistycznym wypisz wszystkie zapisane stany kodu (migawki) wraz z komentarzami oraz z konfiguracją użytkownika Git (email i nazwa). Wykonaj zrzut/zrzuty ekranu dokumentujące tą czynność. Zrzuty nazwij git1.png, git2.png, ... i zapisz w folderze dokumentacja.
Druga migawka po zaprogramowaniu działania: git add . i git commit ze znaczącym opisem (R.4.5). Potem:
git log - wszystkie migawki z autorem, datą i komentarzem,
git config user.name i git config user.email - bez wartości wypisują bieżącą konfigurację.
Zrzut terminala z tymi wynikami - git1.png w folderze dokumentacja (R.4.4, R.4.5). Podgląd to prawdziwy wynik poleceń.
Wynik programu po tym kroku
> git add .
> git commit -q -m "Działanie quizu: pytania w liście, punkty i przejście do kolejnego pytania"
> git log
commit c34dbe2aff56b02d480ca54e2c5d71ef559b0117
Author: Bartosz Bryniarski <[email protected]>
Date: Fri Jan 9 10:15:00 2026 +0100
Działanie quizu: pytania w liście, punkty i przejście do kolejnego pytania
commit 4abcbfbf1d78216da669f9856986e6632f7bb716
Author: Bartosz Bryniarski <[email protected]>
Date: Fri Jan 9 10:15:00 2026 +0100
Widok quizu: obraz, pytanie, trzy odpowiedzi i przycisk DALEJ
> git config user.name
Bartosz Bryniarski
> git config user.email
[email protected]
Etap 8: Dokumentacja i oddanie pracy
Kroki 23-25 · po tym etapie masz 32 z 32 kryteriów (pkt)
Krok 23: Uruchomienie w emulatorze i zrzuty mobile
Kryteria: ,
R.3.7 Aplikacja kompiluje się i uruchamia w emulatorze, co jest udokumentowane zrzutem ekranu jej układ jest zgodny z obrazem 1 lub obrazem 2 w arkuszu egzaminacyjnym (w uruchomionej aplikacji lub na zrzucie i obowiązkowo w kodzie)
R.4.3 Zapisany przynajmniej jeden zrzut ekranu z uruchomienia lub kompilacji aplikacji mobilnej, na zrzucie widoczne jest środowisko, w którym powstała aplikacja
ok. 3 min
Polecenie z arkusza
Podejmij próbę kompilacji i emulacji aplikacji. Wykonaj zrzuty ekranu dokumentujące działanie aplikacji mobilnej: mobile1, mobile2 ... (np. stan początkowy, po wybraniu odpowiedzi i wciśnięciu przycisku, z kolejnym pytaniem). Zrzuty powinny zawierać cały obszar ekranu z widocznym paskiem zadań.
Uruchamiasz aplikację (F5) na emulatorze Androida. Zrzuty całego ekranu z Visual Studio do folderu dokumentacja: mobile1 - stan początkowy, mobile2 - zaznaczona odpowiedź, mobile3 - kolejne pytanie (R.3.7, R.4.3).
Ekran telefonu po tym kroku
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 24: Plik egzamin
Kryteria:
R.4.6 Dokumentacja zawiera: nazwę systemu operacyjnego, nazwy środowisk programistycznych, emulatora, nazwy języków programowania
ok. 2 min
Polecenie z arkusza
Utwórz plik tekstowy z dokumentacją i nazwij go egzamin. Dokument powinien zawierać informacje o narzędziach wykorzystanych na egzaminie: nazwę systemu operacyjnego, nazwy środowisk programistycznych, nazwę emulatora dla aplikacji mobilnej, nazwy języków programowania.
Arkusz wymaga pliku tekstowego - wystarczy Notatnik: egzamin.txt w folderze dokumentacja z systemem, środowiskami, emulatorem i językami (R.4.6).
egzamin.txtTekstnowy plik
System operacyjny: Windows 11Środowiska programistyczne: Visual Studio (aplikacja konsolowa i aplikacja .NET MAUI), GitEmulator: Android Emulator - Pixel 8 (Android 16, API 36)Języki programowania: C# (aplikacja konsolowa i mobilna), XAML (wygląd aplikacji mobilnej)
R.4.7 Przygotowana jest dokumentacja w postaci płyty: oba projekty są spakowane oraz zmodyfikowane pliki są na zewnątrz archiwów
ok. 5 min
Polecenie z arkusza
Kod aplikacji przygotuj do nagrania na płytę. W folderze mobilna powinno znaleźć się archiwum całego projektu o nazwie mobilna.zip, skopiowane pliki z kodem źródłowym, które były modyfikowane. Nagraj płytę z rezultatami pracy. W folderze z numerem zdającego powinny się znajdować foldery: dokumentacja, konsolowa, mobilna.
Folder projektu MAUI - razem z ukrytym folderem .git, w którym są migawki - pakujesz do mobilna.zip (foldery bin i obj można pominąć - .gitignore i tak je wyklucza z repozytorium); obok kopiujesz MainPage.xaml i MainPage.xaml.cs. Sprawdzasz zawartość przed nagraniem (R.4.7):
konsolowa: konsola.zip, Pytanie.cs, PytanieZamkniete.cs, Program.cs, konsola.exe z konsola.dll,
Kroki 26-27 · po tym etapie masz 32 z 32 kryteriów (pkt)
Krok 26: Te same kryteria, inny zapis
ok. 3 min
Polecenie z arkusza
Zastosowany obiektowy język programowania zgodny z zainstalowanym na stanowisku egzaminacyjnym: C++ lub C#, lub Java, lub Python.
wymaganie
C#
Java
dziedziczenie
class PytanieZamkniete : Pytanie
extends Pytanie
konstruktor rodzica
: base(tresc, plikObrazu) przed ciałem
super(tresc, plikObrazu) w pierwszej linii
nadpisanie metody
słowo kluczowe override (obowiązkowe)
adnotacja @Override (zalecana)
błąd testu 1
CS0144
„Pytanie is abstract; cannot be instantiated”
jedna grupa odpowiedzi
GroupName="Answers"
RadioGroup
odznaczenie odpowiedzi
IsChecked = false w pętli
clearCheck() grupy
pytania w kolekcji
List<Question> z rekordem
cztery równoległe tablice
.gitignore
dotnet new gitignore
gotowy w szablonie Android Studio
W Javie @Override jest tylko podpowiedzią dla kompilatora - kod bez niej też nadpisuje metodę. W C# bez override metoda nie nadpisuje metody bazowej i klasa się nie skompiluje - dlatego klucz pisze „w C# i Java obowiązkowo słowo override”.
Za pomocą środowiska programistycznego dostępnego na stanowisku egzaminacyjnym wykonaj aplikację mobilną quizu dotyczącego gór.
Klucz ocenia oba środowiska tymi samymi kryteriami. C# + .NET MAUI - jeden język na obie części; rekord i lista skracają opis pytań, a błąd w nazwie metody zdarzenia wychodzi już przy kompilacji. Pierwsze budowanie projektu MAUI na Androida trwa kilka minut - emulator i pusty projekt warto uruchomić na samym początku egzaminu. Java + Android Studio - najczęstsze środowisko na stanowiskach, .gitignore gotowy w szablonie.
Na co uważać w MAUI przy Git: bez .gitignore repozytorium obejmie foldery bin i obj, a mobilna.zip urośnie do setek megabajtów.
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
To jedno z możliwych rozwiązań. Egzaminator ocenia spełnienie kryteriów z klucza odpowiedzi, a nie zgodność z tym kodem - inna, poprawna droga też daje punkty.
Autor rozwiązania: Bartosz Bryniarski. Licencja CC BY-NC 4.0 - kopiowanie i przeróbki do celów niekomercyjnych, z podaniem autora i źródła (link do tej strony) (zasady wykorzystania). Treść arkusza i klucza oceniania pochodzi z CKE.