Przejdź do głównej treści
INF.04-02-23.06-SGCzerwiec 2023 · 24 kroki · ok. 62 min · 29 kryteriów z klucza

Rozwiązanie krok po kroku: Sortowanie bąbelkowe i ustawienia czcionki (Java + Android)

Rozwiązujemy arkusz z sortowaniem bąbelkowym i ustawieniami czcionki w wersji Java + Android Studio: w konsoli funkcja, która sortuje rosnąco tablicę 100 liczb pseudolosowych bez gotowych funkcji, i test w programie głównym; w aplikacji mobilnej ekran „Właściwości czcionki” z suwakiem, który zmienia rozmiar cytatu i wypisuje swoją wartość, oraz przyciskiem „>>”, który przełącza cytat w kółko: „Dzień dobry”, „Good morning”, „Buenos dias”. Do tego plik testu, zrzuty i srodowisko.txt.

Kroki idą zdanie po zdaniu za treścią arkusza - każdy zaczyna się poleceniem z arkusza, a kod pokazuje dokładnie te linie, które je spełniają. Najpierw piszemy najprostszą wersję, której wymaga klucz, a w etapie „Dobre praktyki” poprawiamy to, czego klucz nie sprawdza.

Co widać w podglądzie. Wyniki programu konsolowego pochodzą z prawdziwego uruchomienia kodu z danego kroku (JDK 21); w każdym uruchomieniu sprawdziliśmy, że wypisanych liczb jest 100, mieszczą się w przedziale 0..1000 i są ułożone rosnąco. Ekran telefonu to symulacja w przeglądarce zbudowana z pliku XML danego kroku; jej zachowanie odpowiada kodowi Javy z kroku - przesuwaj suwak i klikaj „>>”. Każdy stan aplikacji zbudowaliśmy też w Android Studio (Gradle) i sprawdziliśmy na emulatorze Pixel 8.

Arkusz pozwala też na C++, C# albo Pythona w konsoli i na Xamarin / .NET MAUI w części mobilnej - ten wariant to jedna z możliwych dróg.

Jak liczą się punkty. Klucz ma 29 kryteriów (R.1.1 - R.4.5), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 22 punkty - można stracić 7 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.

  1. Etap 1: Przygotowanie

    Krok 1 · po tym etapie masz 0 z 29 kryteriów (pkt)

    Krok 1: Folder zdającego i podfoldery

    ok. 1 min
    Polecenie z arkusza

    Utwórz folder i nazwij go numerem zdającego. W folderze utwórz podfoldery: konsola, mobilna, testy.

    Na pulpicie zakładamy folder o nazwie z numerem PESEL, a w nim konsola, mobilna i testy. Arkusz nie ma załączników - wszystkie dane (100 liczb i trzy powitania) powstają w kodzie.

  2. Etap 2: Aplikacja konsolowa

    Kroki 2-7 · po tym etapie masz 15 z 29 kryteriów (pkt)

    Krok 2: Projekt konsola w Javie

    ok. 3 min
    Polecenie z arkusza

    Napisz program sortujący tablicę metodą bąbelkową. Program wykonywany w konsoli. Obiektowy język programowania zgodny z zainstalowanym na stanowisku egzaminacyjnym, jeden z: C++, C#, Java, Python.

    Wybieramy Javę - tę samą, w której napiszemy aplikację mobilną. W IntelliJ IDEA: New Project → Java, nazwa konsola. Funkcja sortująca będzie metodą statyczną klasy Main.

    konsola/src/Main.java Java nowy plik
    public class Main {
        public static void main(String[] args) {
        }
    }
  3. Krok 3: Funkcja bubbleSort: tablica jako argument, bez wyniku

    Kryteria: , ,

    R.2.1 Program składa się z programu głównego oraz przynajmniej jednej funkcji lub metody do sortowania. Zawartość funkcji jest zgodna z przeznaczeniem. Dopuszcza się aby funkcja była niedokończona, ale zapisy w niej wskazywały na proces sortowania

    R.2.2 Utworzono funkcję sortującą która jako argument przyjmuje tablicę i nie zwraca żadnej wartości (np. void)

    R.1.3 Użyto znaczące nazewnictwo funkcji lub metod

    ok. 2 min
    Polecenie z arkusza

    Sortowanie odbywa się w funkcji, której argumentem jest tablica, funkcja nie zwraca wartości.

    Nagłówek funkcji: argument int[] numbers, typ zwracany void (R.2.2). Funkcja nie musi zwracać tablicy: w Javie tablica jest przekazywana przez referencję, więc sortowanie w środku funkcji zmienia tę samą tablicę, którą widzi program główny. Nazwa mówi, co funkcja robi (R.1.3).

    konsola/src/Main.java Java zmienione: 3 linie
    public class Main {
        static void bubbleSort(int[] numbers) {
        }
    
        public static void main(String[] args) {
        }
    }
  4. Krok 4: Dwie pętle: przebiegi i pary sąsiadów

    Kryteria: , , ,

    R.2.3 Zastosowano algorytm sortowania (wystarczy że elementy kodu będą na to wskazywać)

    R.2.4 Na proces sortowania składają się dwie pętle operujące na wszystkich wymaganych do prawidłowego posortowania elementach tablicy. Pętle są sterowane różnymi zmiennymi

    R.1.2 Kod zapisano z wcięciami dla zagłębień bloków

    R.1.5 Zastosowano typy zmiennych pasujące do problemu (np. dowolny typ całkowity dla tablicy; typ całkowity dla iteratora pętli) w przypadku Python, tam gdzie jest to wymagane zastosowano jawną konwersję do odpowiednich typów

    ok. 3 min
    Polecenie z arkusza

    Napisz program sortujący tablicę metodą bąbelkową. Sortowanie odbywa się rosnąco, nie wykorzystuje gotowych funkcji do sortowania oraz zamiany miejscami elementów.

    Sortowanie bąbelkowe to dwie zagnieżdżone pętle sterowane różnymi zmiennymi (R.2.4, R.1.5):

    • zewnętrzna i liczy przebiegi - wystarczy length - 1, bo po ostatnim przebiegu najmniejsza liczba sama zostaje na początku,
    • wewnętrzna j idzie po parach sąsiadów j i j + 1. Po każdym przebiegu największa z nieposortowanych liczb „wypływa” na koniec jak bąbelek, więc kolejny przebieg może być o jeden krótszy: length - 1 - i.
    Typowe błędy

    Pętla wewnętrzna do j < numbers.length - przy j równym ostatniemu indeksowi odwołanie numbers[j + 1] rzuca ArrayIndexOutOfBoundsException.

    konsola/src/Main.java Java zmienione: 4 linie
    public class Main {
        static void bubbleSort(int[] numbers) {
            for (int i = 0; i < numbers.length - 1; i++) {
                for (int j = 0; j < numbers.length - 1 - i; j++) {
                }
            }
        }
    
        public static void main(String[] args) {
        }
    }
  5. Krok 5: Porównanie sąsiadów i zamiana przez zmienną pomocniczą

    Kryteria: , , ,

    R.2.3 Zastosowano algorytm sortowania (wystarczy że elementy kodu będą na to wskazywać)

    R.2.5 W pętli wewnętrznej znajduje się porównanie dwóch sąsiednich elementów tablicy gwarantujące sortowanie bąbelkowe rosnące

    R.2.6 Zapisano zamianę elementów miejscami przy pomocy zmiennej buforowej lub w inny sposób, który nie powoduje utraty danych lub w Python zapis typu a, b = b, a

    R.1.1 Kod źródłowy zapisano w sposób czytelny: instrukcje w osobnych liniach, stosowane spacje pomiędzy operatorami, konsekwentnie stosowana wybrana konwencja dla nawiasów klamrowych instrukcji blokowej

    ok. 3 min
    Polecenie z arkusza

    Sortowanie odbywa się rosnąco, nie wykorzystuje gotowych funkcji do sortowania oraz zamiany miejscami elementów.

    Jeśli lewy sąsiad jest większy od prawego, zamieniamy je miejscami - tak duże liczby wędrują w prawo, a tablica układa się rosnąco (R.2.5). Znak > decyduje o kierunku: < posortowałoby malejąco.

    Zamiana bez gotowych funkcji wymaga zmiennej pomocniczej temp (R.2.6): najpierw zapamiętujemy lewy element, potem nadpisujemy go prawym, na końcu wpisujemy zapamiętaną wartość w prawy. Bez temp druga instrukcja zgubiłaby jedną z liczb.

    Typowe błędy

    Zamiana „na skróty” numbers[j] = numbers[j + 1]; numbers[j + 1] = numbers[j]; - po pierwszej instrukcji obie komórki mają tę samą wartość, druga liczba przepada (R.2.6).

    konsola/src/Main.java Java zmienione: 5 linii
    public class Main {
        static void bubbleSort(int[] numbers) {
            for (int i = 0; i < numbers.length - 1; i++) {
                for (int j = 0; j < numbers.length - 1 - i; j++) {
                    if (numbers[j] > numbers[j + 1]) {
                        int temp = numbers[j];
                        numbers[j] = numbers[j + 1];
                        numbers[j + 1] = temp;
                    }
                }
            }
        }
    
        public static void main(String[] args) {
        }
    }
  6. Krok 6: Test w programie głównym: 100 liczb z przedziału 0..1000

    Kryteria: ,

    R.4.2 Tablica jest wypełniana liczbami pseudolosowymi z zakresu 0..1000

    R.1.4 Użyto znaczące nazewnictwo zmiennych. Wyjątkami od reguły są zmienne bufor, tmp, iteratory pętli itp. Kryterium nie jest spełnione tylko wtedy, gdy nazwy zmiennych nic nie znaczą, np. x, a, tab, tablica, fun

    ok. 2 min
    Polecenie z arkusza

    Sortowana jest tablica 100 pseudolosowych liczb całkowitych. W teście sprawdź działanie funkcji sortującej dla wylosowanych liczb pseudolosowych. Liczby powinny być całkowite dodatnie z przedziału 0..1000.

    Program główny zawiera test z części III (R.4.2). Tablica ma 100 elementów typu int (R.1.5). random.nextInt(1001) daje liczby od 0 do 1000 włącznie - górna granica w nextInt jest wyłączna, stąd 1001. Nazwa numbers mówi, co jest w tablicy (R.1.4).

    Typowe błędy

    random.nextInt(1000) losuje tylko do 999 - liczba 1000 nigdy nie wypadnie, choć arkusz podaje przedział 0..1000 (R.4.2).

    konsola/src/Main.java Java zmienione: 7 linii
    import java.util.Random;
    
    public class Main {
        static void bubbleSort(int[] numbers) {
            for (int i = 0; i < numbers.length - 1; i++) {
                for (int j = 0; j < numbers.length - 1 - i; j++) {
                    if (numbers[j] > numbers[j + 1]) {
                        int temp = numbers[j];
                        numbers[j] = numbers[j + 1];
                        numbers[j + 1] = temp;
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            int[] numbers = new int[100];
            Random random = new Random();
            for (int i = 0; i < numbers.length; i++) {
                numbers[i] = random.nextInt(1001);
            }
        }
    }
  7. Krok 7: Wywołanie bubbleSort i wypisanie tablicy z komunikatem

    Kryteria: , ,

    R.4.1 Test funkcji sortującej zawiera odwołanie do tej funkcji z prawidlowo przekazanym parametrem

    R.4.3 Działanie programu testującego polega na wyświetleniu posortowanych rosnąco elementów tablicy

    R.1.7 Program po uruchomieniu wyświetla liczby rozdzielone dowolnym separatorem, widoczny jest znaczący komunikat opisujący co zostało wyświetlone. Jeżeli kod nie uruchamia się - sprawdzić w kodzie aplikacji

    ok. 3 min
    Polecenie z arkusza

    Wszystkie elementy posortowanej tablicy są wyświetlane na ekranie, oddzielone dowolnym separatorem, poprzedzone znaczącym komunikatem. Program główny powinien zawierać test działania funkcji sortującej.

    Wywołujemy funkcję z tablicą jako argumentem (R.4.1) i wypisujemy wszystkie 100 liczb, oddzielone przecinkiem, po komunikacie „Tablica posortowana rosnąco:” (R.1.7, R.4.3). Przecinek stawiamy tylko między liczbami.

    Podgląd to prawdziwe uruchomienie - sprawdziliśmy, że liczb jest 100, mieszczą się w 0..1000 i stoją rosnąco.

    konsola/src/Main.java Java zmienione: 11 linii
    import java.util.Random;
    
    public class Main {
        static void bubbleSort(int[] numbers) {
            for (int i = 0; i < numbers.length - 1; i++) {
                for (int j = 0; j < numbers.length - 1 - i; j++) {
                    if (numbers[j] > numbers[j + 1]) {
                        int temp = numbers[j];
                        numbers[j] = numbers[j + 1];
                        numbers[j + 1] = temp;
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            int[] numbers = new int[100];
            Random random = new Random();
            for (int i = 0; i < numbers.length; i++) {
                numbers[i] = random.nextInt(1001);
            }
    
            bubbleSort(numbers);
    
            System.out.print("Tablica posortowana rosnąco: ");
            for (int i = 0; i < numbers.length; i++) {
                System.out.print(numbers[i]);
                if (i < numbers.length - 1) {
                    System.out.print(", ");
                }
            }
            System.out.println();
        }
    }
    Wynik programu po tym kroku
    > java Main
    Tablica posortowana rosnąco: 27, 32, 48, 66, 79, 80, 83, 83, 85, 86, 94, 99, 113, 133, 144, 150, 155, 164, 177, 195, 218, 219, 234, 236, 246, 246, 262, 273, 280, 300, 316, 319, 322, 323, 324, 364, 376, 379, 380, 388, 412, 419, 425, 437, 465, 468, 468, 470, 485, 485, 501, 508, 511, 526, 537, 551, 555, 565, 578, 587, 619, 624, 631, 651, 664, 673, 687, 705, 706, 726, 730, 731, 733, 733, 758, 760, 763, 799, 825, 827, 833, 850, 851, 855, 856, 869, 871, 878, 887, 899, 901, 901, 903, 918, 920, 931, 971, 981, 989, 998
  8. Etap 3: Test aplikacji konsolowej

    Kroki 8-9 · po tym etapie masz 18 z 29 kryteriów (pkt)

    Krok 8: Plik test.java i zrzut konsola_testy

    Kryteria: , ,

    R.4.4 Zapisano zrzut ekranu z uruchomienia lub kompilacji aplikacji konsolowej, na zrzucie widoczne jest środowisko, w którym powstała aplikacja oraz wypisany jest wynik działania programu lub błędy kompilacji

    R.1.6 Podjęto próbę uruchomienia kodu, co udokumentowano zrzutem ekranowym przedstawiającym wykonywany program lub jego kompilację

    R.2.7 Program uruchamia się w konsoli, co udokumentowano zrzutem ekranu

    ok. 3 min
    Polecenie z arkusza

    Test powinien być fragmentem kodu, który należy umieścić w programie głównym aplikacji. Test zapisz w folderze testy, w pliku o nazwie test, z rozszerzeniem charakterystycznym dla aplikacji pisanych w danym języku programowania. Uruchom aplikację z testem i udokumentuj to zrzutem ekranu. Zrzut powinien obejmować cały obszar ekranu z widocznym paskiem zadań i nazywać się konsola_testy.jpg. Zrzut umieść w folderze testy.

    Test to fragment programu głównego - kopiujemy go do pliku test.java w folderze testy (rozszerzenie języka Java). Plik nie musi się sam kompilować: arkusz wymaga fragmentu kodu, a działający test jest w Main.java.

    Uruchamiamy program w IntelliJ i robimy zrzut całego ekranu z paskiem zadań, ze środowiskiem i wynikiem - konsola_testy.jpg w folderze testy (R.4.4, R.1.6, R.2.7).

    testy/test.java Java nowy plik
    // Test funkcji sortującej - fragment programu głównego (Main.java)
    int[] numbers = new int[100];
    Random random = new Random();
    for (int i = 0; i < numbers.length; i++) {
        numbers[i] = random.nextInt(1001);
    }
    
    bubbleSort(numbers);
    
    System.out.print("Tablica posortowana rosnąco: ");
    for (int i = 0; i < numbers.length; i++) {
        System.out.print(numbers[i]);
        if (i < numbers.length - 1) {
            System.out.print(", ");
        }
    }
    System.out.println();

    Wynik programu bez zmian - taki jak po kroku 7.

  9. Krok 9: Folder konsola: archiwum i źródło

    ok. 2 min
    Polecenie z arkusza

    Kod aplikacji przygotuj do nagrania na płytę. W podfolderze konsola powinno znaleźć się archiwum całego projektu o nazwie konsola.zip, plik z kodem źródłowym programu oraz plik wykonywalny, jeżeli istnieje.

    Folder projektu pakujemy do konsola.zip, obok kopiujemy Main.java. Java nie tworzy pliku .exe - plik wykonywalny pomijamy (arkusz pisze „jeżeli istnieje”).

    Wynik programu bez zmian - taki jak po kroku 7.

  10. Etap 4: Aplikacja mobilna

    Kroki 10-21 · po tym etapie masz 29 z 29 kryteriów (pkt)

    Krok 10: Nowy projekt Czcionka w Android Studio

    ok. 3 min
    Polecenie z arkusza

    Wykonaj aplikację mobilną za pomocą środowiska programistycznego dostępnego na stanowisku egzaminacyjnym oraz uruchom ją w dostępnym emulatorze systemu mobilnego. Aplikacja służy do zarządzania ustawieniami czcionki.

    New Project → szablon Empty Views Activity (z widokami w XML). Nazwa Czcionka, pakiet com.example.czcionka, język Java. Będziemy zmieniać res/layout/activity_main.xml (wygląd) i MainActivity.java (logika).

    Czcionka/app/src/main/java/com/example/czcionka/MainActivity.java Java nowy plik
    package com.example.czcionka;
    
    import android.os.Bundle;
    
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EdgeToEdge.enable(this);
            setContentView(R.layout.activity_main);
            ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            });
        }
    }
    Czcionka/app/src/main/res/layout/activity_main.xml XML nowy plik
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  11. Krok 11: Pionowy LinearLayout z marginesem 20dp

    Kryteria: ,

    R.3.1 Zastosowano język znaczników XML/XAML lub inny do opisu interfejsu użytkownika oraz kod zawiera przynajmniej jedną kontrolkę wynikającą z treści zadania

    R.3.2 Zastosowano rozkład liniowy (np. StackLayout, LinearLayout lub inny o tej idei), pola edycyjne są rozciągnięte na całą szerokość okna (np. fill lub match_parent), ustawiono marginesy dla całej strony lub rozkładu na 20

    ok. 3 min
    Polecenie z arkusza

    Interfejs użytkownika zapisany za pomocą języka znaczników wspieranego w danym środowisku (np. XAML, XML). Zastosowany typ rozkładu liniowy (Linear / Stack lub inny o tej idei). Zastosowano marginesy dla całej strony 20.

    W widoku Code zamieniamy ConstraintLayout na pionowy LinearLayout (R.3.1, R.3.2) i zostawiamy android:id="@+id/main".

    Margines całej strony dajemy jako android:layout_margin="20dp" - margines zewnętrzny układu, ze wszystkich stron (R.3.2). Dlaczego nie padding? Kod szablonu w onCreate ustawia temu układowi padding równy wysokości pasków systemowych i nadpisałby nasze 20dp. Margines leży poza paddingiem, więc szablon go nie rusza.

    Typowe błędy

    android:padding="20dp" na głównym układzie - w XML jest, ale w działającej aplikacji nie widać go: szablon edge-to-edge zastępuje padding wysokością pasków.

    Czcionka/app/src/main/res/layout/activity_main.xml XML zmienione: 4 linie
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  12. Krok 12: Tytuł „Właściwości czcionki” na zielonym tle

    Kryteria:

    R.3.3 Zastosowano kontrolki: tekstu, suwaka, przycisku. Tekst "Właściwości czcionki" oraz tekst przycisku mają cechy: biały kolor czcionki, kolor tła #558B2F, pogrubione. Tekst "Właściwości czcionki" jest zapisany czcionką o największym rozmiarze, "Rozmiar: " - średnią

    ok. 2 min
    Polecenie z arkusza

    Napis o treści: „Właściwości czcionki”. Wszystkie pola są rozciągnięte na szerokość strony. Zastosowany kolor tła elementów: #558B2F, zgodnie z Obrazem 1a. Zastosowany kolory czcionki: czarny i biały, zgodnie z Obrazem 1a. Czcionka napisu „Właściwości czcionki” ma rozmiar największy i jest pogrubiona.

    TextView na całą szerokość (match_parent), tło #558B2F, biały tekst, pogrubiony (textStyle="bold") i największy w aplikacji - 24sp (R.3.3). Pozostałe napisy dostaną mniejsze rozmiary.

    Czcionka/app/src/main/res/layout/activity_main.xml XML zmienione: 9 linii
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#558B2F"
            android:text="Właściwości czcionki"
            android:textColor="#FFFFFF"
            android:textSize="24sp"
            android:textStyle="bold" />
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  13. Krok 13: Napis „Rozmiar:” średnią czcionką

    Kryteria:

    R.3.3 Zastosowano kontrolki: tekstu, suwaka, przycisku. Tekst "Właściwości czcionki" oraz tekst przycisku mają cechy: biały kolor czcionki, kolor tła #558B2F, pogrubione. Tekst "Właściwości czcionki" jest zapisany czcionką o największym rozmiarze, "Rozmiar: " - średnią

    ok. 2 min
    Polecenie z arkusza

    Napis o treści: „Rozmiar: ”. Czcionka napisu „Rozmiar:” ma rozmiar średni.

    Rozmiar 18sp - mniejszy od tytułu, większy od cytatu (domyślne 14sp) (R.3.3). Kolor czarny. Napis ma identyfikator sizeText: kod będzie dopisywał do niego wartość suwaka. Spacja po dwukropku jest w treści celowo - liczba stanie za nią.

    Czcionka/app/src/main/res/layout/activity_main.xml XML zmienione: 8 linii
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#558B2F"
            android:text="Właściwości czcionki"
            android:textColor="#FFFFFF"
            android:textSize="24sp"
            android:textStyle="bold" />
    
        <TextView
            android:id="@+id/sizeText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Rozmiar: "
            android:textColor="#000000"
            android:textSize="18sp" />
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  14. Krok 14: Suwak SeekBar od 0 do 40

    Kryteria: ,

    R.3.3 Zastosowano kontrolki: tekstu, suwaka, przycisku. Tekst "Właściwości czcionki" oraz tekst przycisku mają cechy: biały kolor czcionki, kolor tła #558B2F, pogrubione. Tekst "Właściwości czcionki" jest zapisany czcionką o największym rozmiarze, "Rozmiar: " - średnią

    R.3.4 Suwak ma wartość maksymalną 40

    ok. 2 min
    Polecenie z arkusza

    Suwak (SeekBar / Slider). Suwak ma wartość maksymalną 40, jeżeli ustawienie minimum jest wymagane – ustawić wartość 0.

    SeekBar na całą szerokość z android:max="40" (R.3.4). Minimum nie jest wymagane: SeekBar zaczyna zawsze od 0. Atrybut android:min istnieje dopiero od Androida 8 (API 26), a projekt z szablonu obsługuje też starsze wersje - nie dopisujemy go. Suwak daje wartości całkowite (int), więc rozmiar czcionki z niego będzie liczbą całkowitą.

    Czcionka/app/src/main/res/layout/activity_main.xml XML zmienione: 6 linii
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#558B2F"
            android:text="Właściwości czcionki"
            android:textColor="#FFFFFF"
            android:textSize="24sp"
            android:textStyle="bold" />
    
        <TextView
            android:id="@+id/sizeText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Rozmiar: "
            android:textColor="#000000"
            android:textSize="18sp" />
    
        <SeekBar
            android:id="@+id/sizeSeekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="40" />
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  15. Krok 15: Napis cytatu „Dzień dobry”

    Kryteria:

    R.3.3 Zastosowano kontrolki: tekstu, suwaka, przycisku. Tekst "Właściwości czcionki" oraz tekst przycisku mają cechy: biały kolor czcionki, kolor tła #558B2F, pogrubione. Tekst "Właściwości czcionki" jest zapisany czcionką o największym rozmiarze, "Rozmiar: " - średnią

    ok. 1 min
    Polecenie z arkusza

    Napis cytatu.

    Cytat z identyfikatorem quoteText - kod będzie zmieniał jego treść i rozmiar. Na starcie „Dzień dobry” w domyślnym rozmiarze 14sp (R.3.7).

    Czcionka/app/src/main/res/layout/activity_main.xml XML zmienione: 7 linii
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#558B2F"
            android:text="Właściwości czcionki"
            android:textColor="#FFFFFF"
            android:textSize="24sp"
            android:textStyle="bold" />
    
        <TextView
            android:id="@+id/sizeText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Rozmiar: "
            android:textColor="#000000"
            android:textSize="18sp" />
    
        <SeekBar
            android:id="@+id/sizeSeekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="40" />
    
        <TextView
            android:id="@+id/quoteText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Dzień dobry"
            android:textColor="#000000" />
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  16. Krok 16: Przycisk „>>” wyśrodkowany i pogrubiony

    Kryteria: ,

    R.3.3 Zastosowano kontrolki: tekstu, suwaka, przycisku. Tekst "Właściwości czcionki" oraz tekst przycisku mają cechy: biały kolor czcionki, kolor tła #558B2F, pogrubione. Tekst "Właściwości czcionki" jest zapisany czcionką o największym rozmiarze, "Rozmiar: " - średnią

    R.3.7 Aplikacja kompiluje się i uruchamia w emulatorze, co udokumentowano zrzutem ekranu, jej wygląd jest zgodny z obrazem 1a lub 1c w arkuszu egzaminacyjnym. Zawiera wszystkie elementy. Przycisk jest wyśrodkowany oraz napis cytatu brzmi "Dzień dobry"

    ok. 3 min
    Polecenie z arkusza

    Przycisk o treści: „>>”. Przycisk jest wyśrodkowany oraz jego tekst jest wyśrodkowany i pogrubiony.

    Przycisk ma szerokość treści (wrap_content), a layout_gravity="center_horizontal" ustawia go na środku pionowego układu (R.3.7). Tekst przycisku jest wyśrodkowany domyślnie; pogrubiamy go textStyle="bold". Tło #558B2F przez backgroundTint (w Material 3 zwykłe background przycisk ignoruje), tekst biały (R.3.3).

    Znak > w XML zapisujemy jako &gt; - nawias ostry jest częścią składni znaczników. Ekran ma już wszystkie elementy z obrazu 1a.

    Typowe błędy

    android:gravity="center" zamiast layout_gravity - wyśrodkowuje tekst W przycisku, a przycisk zostaje przy lewej krawędzi (R.3.7).

    Czcionka/app/src/main/res/layout/activity_main.xml XML zmienione: 9 linii
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#558B2F"
            android:text="Właściwości czcionki"
            android:textColor="#FFFFFF"
            android:textSize="24sp"
            android:textStyle="bold" />
    
        <TextView
            android:id="@+id/sizeText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Rozmiar: "
            android:textColor="#000000"
            android:textSize="18sp" />
    
        <SeekBar
            android:id="@+id/sizeSeekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="40" />
    
        <TextView
            android:id="@+id/quoteText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Dzień dobry"
            android:textColor="#000000" />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:backgroundTint="#558B2F"
            android:text="&gt;&gt;"
            android:textColor="#FFFFFF"
            android:textStyle="bold" />
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  17. Krok 17: Tablica trzech powitań i indeks

    Kryteria:

    R.3.6 Napisy "Dzień dobry", "Good morning", "Buenos dias" zakodowano w tablicy 3-elementowej typu napisowego, np. String[]

    ok. 2 min
    Polecenie z arkusza

    Teksty pojawiające się w polu napisu cytatu są zdefiniowane w kodzie jako tablica 3-elementowa.

    Pole aktywności String[] greetings z trzema napisami (R.3.6) i greetingIndex - który napis jest teraz wyświetlany (0 = „Dzień dobry”, jak na starcie). final oznacza, że zmienna zawsze wskazuje tę samą tablicę.

    Czcionka/app/src/main/java/com/example/czcionka/MainActivity.java Java zmienione: 3 linie
    package com.example.czcionka;
    
    import android.os.Bundle;
    
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    
    public class MainActivity extends AppCompatActivity {
    
        private final String[] greetings = {"Dzień dobry", "Good morning", "Buenos dias"};
        private int greetingIndex = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EdgeToEdge.enable(this);
            setContentView(R.layout.activity_main);
            ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            });
        }
    }
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  18. Krok 18: Przycisk „>>”: kolejne powitanie w kółko

    Kryteria: ,

    R.3.5 Obsłużono przycisk za pomocą zdarzenia kliknięcia lub obsłużono suwak za pomocą zdarzenia zmiany wartości. Po wystąpieniu zdarzenia wywoływana jest funkcja obsługująca zdarzenie lub zapisano obsługę suwaka za pomocą powiązania (Binding)

    R.3.10 Po wybraniu przycisku, zmienia się napis cytatu w karuzeli, czyli 1-2-3-1...

    ok. 3 min
    Polecenie z arkusza

    Po wybraniu przycisku następuje akcja: zamieniany jest tekst w napisie cytatu. Kolejne napisy: "Dzień dobry", "Good morning", "Buenos dias". Jeżeli wyświetlony jest tekst „Buenos dias”, wybranie przycisku powoduje wyświetlenie „Dzień dobry” itd.

    Metodę nextGreeting wiążemy z przyciskiem atrybutem android:onClick (R.3.5). Indeks zwiększamy o 1 i bierzemy resztę z dzielenia przez długość tablicy: 0 → 1 → 2 → 0 → 1... Po „Buenos dias” (indeks 2) wychodzi 3 % 3 = 0, czyli znów „Dzień dobry” - karuzela (R.3.10).

    Kliknij w podglądzie kilka razy „>>”.

    Typowe błędy

    greetingIndex++ bez reszty z dzielenia - czwarte kliknięcie odwołuje się do greetings[3] i aplikacja zatrzymuje się z ArrayIndexOutOfBoundsException (R.3.10).

    Czcionka/app/src/main/java/com/example/czcionka/MainActivity.java Java zmienione: 9 linii
    package com.example.czcionka;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    
    public class MainActivity extends AppCompatActivity {
    
        private final String[] greetings = {"Dzień dobry", "Good morning", "Buenos dias"};
        private int greetingIndex = 0;
        private TextView quoteText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EdgeToEdge.enable(this);
            setContentView(R.layout.activity_main);
            ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            });
            quoteText = findViewById(R.id.quoteText);
        }
    
        public void nextGreeting(View view) {
            greetingIndex = (greetingIndex + 1) % greetings.length;
            quoteText.setText(greetings[greetingIndex]);
        }
    }
    Czcionka/app/src/main/res/layout/activity_main.xml XML zmienione: 1 linia
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#558B2F"
            android:text="Właściwości czcionki"
            android:textColor="#FFFFFF"
            android:textSize="24sp"
            android:textStyle="bold" />
    
        <TextView
            android:id="@+id/sizeText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Rozmiar: "
            android:textColor="#000000"
            android:textSize="18sp" />
    
        <SeekBar
            android:id="@+id/sizeSeekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="40" />
    
        <TextView
            android:id="@+id/quoteText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Dzień dobry"
            android:textColor="#000000" />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:backgroundTint="#558B2F"
            android:onClick="nextGreeting"
            android:text="&gt;&gt;"
            android:textColor="#FFFFFF"
            android:textStyle="bold" />
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  19. Krok 19: Suwak: wartość po napisie „Rozmiar:”

    Kryteria: ,

    R.3.5 Obsłużono przycisk za pomocą zdarzenia kliknięcia lub obsłużono suwak za pomocą zdarzenia zmiany wartości. Po wystąpieniu zdarzenia wywoływana jest funkcja obsługująca zdarzenie lub zapisano obsługę suwaka za pomocą powiązania (Binding)

    R.3.8 Po przesunięciu suwaka jego aktualna wartość jest wyświetlana w napisie "Rozmiar: "

    ok. 4 min
    Polecenie z arkusza

    Po przesunięciu suwaka następuje akcja (obraz 1b): wartość aktualna suwaka jest zapisywana po napisie „Rozmiar:”.

    Suwak nie ma atrybutu onClick - zmianę jego wartości odbieramy słuchaczem setOnSeekBarChangeListener (R.3.5). Interfejs OnSeekBarChangeListener wymaga trzech metod; potrzebna jest tylko onProgressChanged - Android wywołuje ją przy każdej zmianie, a parametr progress to aktualna wartość (liczba całkowita 0-40). Wpisujemy ją za „Rozmiar: ” (R.3.8). Dwie pozostałe metody zostają puste.

    Przesuń suwak w podglądzie.

    Czcionka/app/src/main/java/com/example/czcionka/MainActivity.java Java zmienione: 18 linii
    package com.example.czcionka;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.SeekBar;
    import android.widget.TextView;
    
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    
    public class MainActivity extends AppCompatActivity {
    
        private final String[] greetings = {"Dzień dobry", "Good morning", "Buenos dias"};
        private int greetingIndex = 0;
        private TextView sizeText;
        private TextView quoteText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EdgeToEdge.enable(this);
            setContentView(R.layout.activity_main);
            ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            });
            quoteText = findViewById(R.id.quoteText);
            sizeText = findViewById(R.id.sizeText);
            SeekBar sizeSeekBar = findViewById(R.id.sizeSeekBar);
            sizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    sizeText.setText("Rozmiar: " + progress);
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                }
            });
        }
    
        public void nextGreeting(View view) {
            greetingIndex = (greetingIndex + 1) % greetings.length;
            quoteText.setText(greetings[greetingIndex]);
        }
    }
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  20. Krok 20: Suwak: rozmiar czcionki cytatu

    Kryteria:

    R.3.9 Po przesunięciu suwaka jest zmieniany rozmiar czcionki napisu cytatu na wartość pobraną z suwaka (tylko wartości całkowite)

    ok. 2 min
    Polecenie z arkusza

    Rozmiar czcionki cytatu jest zmieniany na aktualną wartość suwaka (rozmiar czcionki powinien być liczbą całkowitą).

    setTextSize(progress) ustawia rozmiar w jednostkach sp - tych samych co textSize w XML. progress jest typu int, więc rozmiar jest zawsze liczbą całkowitą (R.3.9). Przy wartości 0 cytat znika - tak działa aplikacja z arkusza.

    Przesuń suwak na 30 i kliknij dwa razy „>>” - jak na obrazie 1b.

    Czcionka/app/src/main/java/com/example/czcionka/MainActivity.java Java zmienione: 1 linia
    package com.example.czcionka;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.SeekBar;
    import android.widget.TextView;
    
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    
    public class MainActivity extends AppCompatActivity {
    
        private final String[] greetings = {"Dzień dobry", "Good morning", "Buenos dias"};
        private int greetingIndex = 0;
        private TextView sizeText;
        private TextView quoteText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EdgeToEdge.enable(this);
            setContentView(R.layout.activity_main);
            ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            });
            quoteText = findViewById(R.id.quoteText);
            sizeText = findViewById(R.id.sizeText);
            SeekBar sizeSeekBar = findViewById(R.id.sizeSeekBar);
            sizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    sizeText.setText("Rozmiar: " + progress);
                    quoteText.setTextSize(progress);
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                }
            });
        }
    
        public void nextGreeting(View view) {
            greetingIndex = (greetingIndex + 1) % greetings.length;
            quoteText.setText(greetings[greetingIndex]);
        }
    }
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  21. Krok 21: Uruchomienie w emulatorze, zrzuty, srodowisko.txt i folder mobilna

    Kryteria: ,

    R.3.7 Aplikacja kompiluje się i uruchamia w emulatorze, co udokumentowano zrzutem ekranu, jej wygląd jest zgodny z obrazem 1a lub 1c w arkuszu egzaminacyjnym. Zawiera wszystkie elementy. Przycisk jest wyśrodkowany oraz napis cytatu brzmi "Dzień dobry"

    R.4.5 Zapisano zrzut ekranu z uruchomienia lub kompilacji aplikacji mobilnej, na zrzucie widoczne jest środowisko, w którym powstała aplikacja

    ok. 4 min
    Polecenie z arkusza

    Wykonaj zrzut ekranu emulacji aplikacji, ze środowiskiem programistycznym w tle. Zrzut zawierający cały obszar ekranu z widocznym paskiem zadań zapisz jako mobilna.jpg w folderze numerem zdającego/mobilna. Utwórz plik tekstowy o nazwie srodowisko.txt w folderze numerem zdającego/mobilna. Zapisz w nim nazwę środowiska programistycznego, w którym została wykonana aplikacja oraz nazwę emulowanego urządzenia lub systemu, na którym uruchomiono aplikację. W podfolderze mobilna powinno znaleźć się archiwum całego projektu o nazwie mobilna.zip, plik (lub pliki) z kodem źródłowym interfejsu użytkownika (XAML lub XML) oraz plik źródłowy kodu skojarzonego z interfejsem użytkownika.

    Uruchamiamy aplikację w emulatorze. Zrzut całego ekranu z Android Studio w tle i paskiem zadań - mobilna.jpg (R.3.7, R.4.5); zrzuty interakcji (suwak, „>>”) - mobilna1, mobilna2. Plik srodowisko.txt z nazwą środowiska i emulatora. W folderze mobilna: mobilna.zip, activity_main.xml, MainActivity.java.

    mobilna/srodowisko.txt Tekst nowy plik
    Środowisko programistyczne: Android Studio
    Emulator: Pixel 8 (Android 16, API 36)

    Ekran telefonu bez zmian - taki jak po kroku 20.

  22. Etap 5: Dobre praktyki (poza kluczem)

    Kroki 22-23 · po tym etapie masz 29 z 29 kryteriów (pkt)

    Krok 22: Konsola: koniec sortowania, gdy nie było zamiany

    ok. 2 min
    Polecenie z arkusza

    Napisz program sortujący tablicę metodą bąbelkową.

    Jeśli w całym przebiegu pętli wewnętrznej nie było ani jednej zamiany, wszystkie sąsiednie pary są już w dobrej kolejności - tablica jest posortowana i kolejne przebiegi nic nie zmienią. Flaga swapped pozwala wtedy przerwać pętlę break. Dla tablicy prawie posortowanej oszczędza to większość pracy; dla losowej - kilka ostatnich przebiegów.

    Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.

    konsola/src/Main.java Java zmienione: 5 linii
    import java.util.Random;
    
    public class Main {
        static void bubbleSort(int[] numbers) {
            for (int i = 0; i < numbers.length - 1; i++) {
                boolean swapped = false;
                for (int j = 0; j < numbers.length - 1 - i; j++) {
                    if (numbers[j] > numbers[j + 1]) {
                        int temp = numbers[j];
                        numbers[j] = numbers[j + 1];
                        numbers[j + 1] = temp;
                        swapped = true;
                    }
                }
                if (!swapped) {
                    break;   // przebieg bez żadnej zamiany - tablica jest już posortowana
                }
            }
        }
    
        public static void main(String[] args) {
            int[] numbers = new int[100];
            Random random = new Random();
            for (int i = 0; i < numbers.length; i++) {
                numbers[i] = random.nextInt(1001);
            }
    
            bubbleSort(numbers);
    
            System.out.print("Tablica posortowana rosnąco: ");
            for (int i = 0; i < numbers.length; i++) {
                System.out.print(numbers[i]);
                if (i < numbers.length - 1) {
                    System.out.print(", ");
                }
            }
            System.out.println();
        }
    }
    Wynik programu po tym kroku
    > java Main
    Tablica posortowana rosnąco: 4, 17, 27, 39, 52, 56, 73, 76, 79, 87, 91, 97, 97, 104, 116, 129, 134, 144, 146, 147, 153, 153, 154, 182, 215, 225, 227, 232, 247, 255, 260, 278, 295, 315, 319, 327, 332, 346, 349, 356, 361, 363, 367, 388, 421, 424, 427, 438, 445, 447, 481, 514, 515, 519, 529, 531, 536, 538, 544, 547, 547, 550, 599, 602, 607, 620, 621, 623, 624, 648, 653, 657, 672, 677, 693, 701, 704, 709, 754, 755, 758, 761, 762, 774, 779, 803, 809, 814, 818, 827, 828, 870, 870, 882, 898, 911, 918, 988, 989, 991
  23. Krok 23: Android: suwak startuje od rozmiaru cytatu

    ok. 2 min
    Polecenie z arkusza

    Po przesunięciu suwaka następuje akcja (obraz 1b): wartość aktualna suwaka jest zapisywana po napisie „Rozmiar:”.

    Na starcie suwak stoi na 0, a cytat ma 14sp - pierwsze dotknięcie suwaka zmniejsza cytat skokowo. Ustawiamy suwak od razu na android:progress="14" (rozmiar domyślny cytatu) i wpisujemy tę wartość do napisu już w onCreate przez getProgress(). Od pierwszej chwili ekran pokazuje prawdę: „Rozmiar: 14”, suwak i cytat są zgodne.

    Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza, a obraz 1a pokazuje „Rozmiar:” bez liczby.

    Czcionka/app/src/main/java/com/example/czcionka/MainActivity.java Java zmienione: 1 linia
    package com.example.czcionka;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.SeekBar;
    import android.widget.TextView;
    
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    
    public class MainActivity extends AppCompatActivity {
    
        private final String[] greetings = {"Dzień dobry", "Good morning", "Buenos dias"};
        private int greetingIndex = 0;
        private TextView sizeText;
        private TextView quoteText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EdgeToEdge.enable(this);
            setContentView(R.layout.activity_main);
            ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            });
            quoteText = findViewById(R.id.quoteText);
            sizeText = findViewById(R.id.sizeText);
            SeekBar sizeSeekBar = findViewById(R.id.sizeSeekBar);
            sizeText.setText("Rozmiar: " + sizeSeekBar.getProgress());
            sizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    sizeText.setText("Rozmiar: " + progress);
                    quoteText.setTextSize(progress);
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                }
            });
        }
    
        public void nextGreeting(View view) {
            greetingIndex = (greetingIndex + 1) % greetings.length;
            quoteText.setText(greetings[greetingIndex]);
        }
    }
    Czcionka/app/src/main/res/layout/activity_main.xml XML zmienione: 2 linie
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#558B2F"
            android:text="Właściwości czcionki"
            android:textColor="#FFFFFF"
            android:textSize="24sp"
            android:textStyle="bold" />
    
        <TextView
            android:id="@+id/sizeText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Rozmiar: "
            android:textColor="#000000"
            android:textSize="18sp" />
    
        <SeekBar
            android:id="@+id/sizeSeekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="40"
            android:progress="14" />
    
        <TextView
            android:id="@+id/quoteText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Dzień dobry"
            android:textColor="#000000" />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:backgroundTint="#558B2F"
            android:onClick="nextGreeting"
            android:text="&gt;&gt;"
            android:textColor="#FFFFFF"
            android:textStyle="bold" />
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  24. Etap 6: Oddanie pracy

    Krok 24 · po tym etapie masz 29 z 29 kryteriów (pkt)

    Krok 24: Nagranie płyty

    ok. 5 min
    Polecenie z arkusza

    Nagraj płytę z rezultatami pracy. W folderze z numerem zdającego powinny się znajdować podfoldery konsola, mobilna, testy. W folderze testy pliki: konsola_testy.jpg, test.

    Sprawdzamy zawartość przed nagraniem:

    • konsola: konsola.zip, Main.java,
    • mobilna: mobilna.zip, activity_main.xml, MainActivity.java, mobilna.jpg, srodowisko.txt,
    • testy: test.java, konsola_testy.jpg.

    Nagrywamy, sprawdzamy odczyt płyty, opisujemy ją numerem zdającego.

    Ekran telefonu bez zmian - taki jak po kroku 23.

Podgląd

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: . 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). Treść arkusza i klucza oceniania pochodzi z CKE.