Rozwiązania. Arkusz egzaminacyjny INF.04 styczeń 2022
INF 04 egzamin praktyczny Rozwiązanie arkusza styczeń 2022.Część I. Aplikacja konsolowa
Napisz program sortujący tablicę metodą przez wybieranie według zamieszczonej dokumentacji:
Sortowanie przez wybieranie - jedna z prostszych metod sortowania o złożoności O(n2 ). Polega na wyszukaniu elementu mającego się znaleźć na żądanej pozycji i zamianie miejscami z tym, który jest tam obecnie. Operacja jest wykonywana dla wszystkich indeksów sortowanej tablicy.
Algorytm przedstawia się następująco:
- Wyszukaj minimalną wartość z tablicy spośród elementów od i do końca tablicy
- Zamień wartość minimalną, z elementem na pozycji i
- Gdy zamiast wartości minimalnej wybierana będzie maksymalna, wówczas tablica będzie posortowana od największego do najmniejszego elementu.
Założenia do programu
- Program wykonywany w konsoli.
- Obiektowy język programowania zgodny z zainstalowanym na stanowisku egzaminacyjnym: C++ lub C# lub Java lub Python.
- Sortowanie odbywa się malejąco, nie wykorzystuje gotowych funkcji do sortowania oraz do szukania maksimum.
- Sortowana jest tablica 10 liczb całkowitych. Tablica jest polem klasy.
- Tablica jest wczytywana z klawiatury po uprzednim wypisaniu odpowiedniego komunikatu.
- Wszystkie elementy posortowanej tablicy są wyświetlane na ekranie.
- Klasa zawiera co najmniej dwie metody: sortującą i szukającą wartość najwyższą. Widzialność metody szukającej ogranicza się jedynie do klasy.
- Metoda szukająca zwraca wartość, w zależności od przyjętej taktyki może być to wartość maksymalna lub index wartości maksymalnej.
- Program powinien być zapisany czytelnie, z zasadami czystego formatowania kodu, należy stosować znaczące nazwy zmiennych i funkcji.
- Dokumentacja do programu wykonana zgodnie z wytycznymi z części III zadania egzaminacyjnego.
Kod aplikacji (cały folder projektu) przygotuj do nagrania na płytę (skopiuj do folderu z numerem PESEL, do podfolderu konsola).
Część II. Aplikacja mobilna
Wykonaj aplikację mobilną za pomocą środowiska programistycznego dostępnego na stanowisku egzaminacyjnym oraz uruchom ją w dostępnym emulatorze systemu mobilnego.
Źródło CKE
Na obrazach 1a i 1b przedstawiono działanie aplikacji mobilnej. W zależności od użytego środowiska programistycznego oraz emulowanego systemu wynik końcowy może nieznacznie się różnić.
Opis wyglądu aplikacji
Napis Rejestruj konto.
- Napis Podaj e-mail:, a pod nim pole edycyjne z podpowiedzią o treści email.
- Napis Podaj hasło:, a pod nim pole edycyjne do wprowadzenia hasła, realizuje ukrywanie hasła jak na obrazach 1a i 1b.
- Napis Powtórz hasło:, a pod nim pole edycyjne do wprowadzenia hasła, realizuje ukrywanie hasła jak na obrazach 1a i 1b.
- Przycisk o treści ZATWIERDŹ, jest on wyśrodkowany.
- Obszar do wyświetlania komunikatów, jest on wyśrodkowany.
Działanie aplikacji
- Po wybraniu przycisku ZATWIERDŹ jest sprawdzane:
- Czy e-mail zawiera znak @.
- Czy podane hasło jest równe powtórzonemu hasłu.
- W obszarze do wyświetlania komunikatów pojawia się napis:
- Na początku działania aplikacji: Autor, dalej wstawiony numer PESEL zdającego.
- Po zatwierdzeniu, gdy e-mail jest niepoprawny: Nieprawidłowy adres e-mail.
- Po zatwierdzeniu, gdy hasła się różnią: Hasła się różnią.
- Po zatwierdzeniu, gdy nie wystąpiły błędy: Witaj <e-mail>, gdzie <e-mail> oznacza aktualnie wprowadzony adres e-mail.
Założenia aplikacji
Kod aplikacji (cały folder projektu) przygotuj do nagrania na płytę (skopiuj do folderu z numerem PESEL, do podfolderu mobilna).
Część III. Dokumentacja aplikacji
Wykonaj dokumentację aplikacji utworzonych podczas egzaminu. W kodzie źródłowym aplikacji konsolowej utwórz nagłówek metody sortującej i szukającej, według wzoru umieszczonego w listingu 1. Nagłówek powinien znaleźć się w kodzie źródłowym nad metodą. W miejscu nawiasów <> należy podać nazwę funkcji, nazwy parametrów (lub słowo ?brak?) oraz zwięzłe informacje (kilka słów) ? zgodnie ze wzorcem. W miejscu autor należy podać swój numer PESEL
Listing 1. Wzór dokumentacji funkcji
Źródło CKE
Wykonaj zrzuty ekranu dokumentujące uruchomienie aplikacji. Zrzuty powinny obejmować cały obszar ekranu z widocznym paskiem zadań. Jeżeli aplikacja uruchamia się, na zrzucie należy umieścić okno z wynikiem działania programu oraz otwarte środowisko programistyczne z projektem. Jeżeli aplikacja nie uruchamia się z powodu błędów kompilacji, należy na zrzucie umieścić okno ze spisem błędów i widocznym otwartym środowiskiem programistycznym. Wymagane zrzuty ekranu:
- z aplikacji konsolowej ? konsola.jpg
- z aplikacji mobilnej ? mobilna.jpg
W edytorze tekstu pakietu biurowego utwórz plik z dokumentacją i nazwij go egzamin. Dokument powinien zawierać podpisane zrzuty ekranu oraz zapisane informacje:
- nazwę systemu operacyjnego, na którym pracował zdający
- nazwy środowisk programistycznych, z których zdający korzystał na egzaminie
- nazwy języków programowania użytych podczas tworzenia aplikacji
- nazwę emulowanego urządzenia lub systemu, na którym uruchomiono aplikację mobilną
- opcjonalnie komentarz do wykonanej pracy.
Dokumentacja powinna się znajdować w podfolderze dokumentacja
Rozwiązanie części I. Aplikacja konsolowa: Sortowanie przez wybieranie
Przygotowanie rozwiązani rozpoczniemy od wybrania w kompilatorze Visual Studio modułu kompilacji dla Aplikacja konsoli (.NET Framework)
Tworzymy klasę
Zgodnie z warunkami zadania tworzymy klasę, która będzie zawierać tablicę zbioru danych i metody zgodne z treścią zadania. Wybierz z menu Plik/Dodaj klasę?
Podaj nazwę klasy, a zarazem pliku klasy (przyjęte jest nazwy klas podawać z dużej litery). W podanym rozwiązaniu utworzono klasę o nazwie Sortownia.cs
Definiujemy metody publiczne w klasie sortującej
Utworzona klasa ma zawierać tablicę jednowymiarową w rozmiarze 10 elementów. Wartości tych elementów mają być podane z klawiatury. Wykorzystamy do tego celu konstruktor klasy. W klasie zdefiniujemy tablicę danych o zasięgu prywatnym.
Wskazówka:
internal class Sortownia
{
private int[] t = new int[10];
//Konstruktor, którego zadaniem jest
//wprowadzeni wartosci do tablicy
public Sortownia()
{
Console.WriteLine("Podaj dziesięć liczb całkowitych");
int licznik = 0;
do
{
Console.Write((licznik+1).ToString()+": ");
t[licznik]=int.Parse(Console.ReadLine());
licznik++;
}while(licznik < 10);
}
}
Możemy już sprawdzić czy działa nasza aplikacja desktopowa. Przechodzimy do głównego pliku (standardowo Program.cs) i wprowadzamy poniższy kod
Wskazówka:
internal class Program
{
static Sortownia sortownia;
static void Main(string[] args)
{
sortownia= new Sortownia();
Console.ReadKey();
}
}
Po skompilowaniu mamy możliwość wprowadzania wartości do tablicy.
Funkcja sortująca
Wracamy do pliku tworzonej klasy. Z warunków zadania wynika, że musimy napisać tak funkcję sortująca aby wykorzystywała drugą funkcję, która szukając maxa w zadanym przedziale zwróci jego indeks. Nasza funkcja będzie posiadać jeden argument typu całkowitego, który określa dolną granicę przeszukiwania. Funkcja będzie o zasięgu lokalnym wewnątrz klasy (atrybut private)
Wskazówka:
private int SzukajIndeksuMaxa(int j)
{
int id = j;
//szukaj indeksu maxa
for (int k = j; k < t.Length; k++)
if (t[k] > t[id]) id = k;
return id;
}
Funkcja sortująca po znalezieniu indeksu nowego maxa zamienia wartości miejscami (min z maxem). Patrz poniższy kod.
Wskazówka:
public void Sortuj()
{
for(int i=0; i < t.Length; i++)
{
int id = SzukajIndeksuMaxa(i);
//zapamietaj stara wartośc mina
int bufor = t[i];
//podmien na maxa
t[i] = t[id];
//podmien na stara wartośc mina
t[id] = bufor;
}
}
Funkcja pokazująca zawartość tablicy
Choć ta funkcja nie jest wymagana w warunkach zadania napiszemy ją. Jej działanie pozwoli porównać postać tablicy przed i po sortowaniu. Funkcję napiszemy jako publiczną. Będzie ją można wywołać w głównym pliku projektu.
Wskazówka:
public void PokazTablice()
{
for(int i=0; i<t.Length; i++)
Console.Write(String.Format("{0} ", t[i]));
}
Wywołanie metody sortowania
Przechodzimy do głównego pliku (Program.cs) i wywołujemy sortowanie oraz pokazanie stanu tablicy przed i po sortowaniu.
Wskazówka:
internal class Program
{
static Sortownia sortownia;
static void Main(string[] args)
{
sortownia= new Sortownia();
Console.WriteLine("Pokaż przed sortowaniem: ");
sortownia.PokazTablice();
sortownia.Sortuj();
Console.WriteLine("\nPokaż po sortowaniu: ");
sortownia.PokazTablice();
Console.ReadKey();
}
}
Wynik działania aplikacji
Pełny kod klasy Sortownia.cs
Wskazówka:
using System;
namespace styczen_2022_problem_1_sortowanie_przez_wybieranie
{
internal class Sortownia
{
private int[] t = new int[10];
//Konstruktor, którego zadaniem jest
//wprowadzeni wartosci do tablicy
public Sortownia()
{
Console.WriteLine("Podaj dziesięć całkowitych liczb w dowolnej kolejności");
int licznik = 0;
do
{
Console.Write((licznik+1).ToString()+": ");
t[licznik]=int.Parse(Console.ReadLine());
licznik++;
}while(licznik < 10);
}
public void PokazTablice()
{
for(int i=0; i<t.Length; i++)
Console.Write(String.Format("{0} ", t[i]));
}
private int SzukajIndeksuMaxa(int j)
{
int id = j;
//szukaj indeksu maxa
for (int k = j; k < t.Length; k++)
if (t[k] > t[id]) id = k;
return id;
}
public void Sortuj()
{
for(int i=0; i < t.Length; i++)
{
int id = SzukajIndeksuMaxa(i);
//zapamietaj stara wartośc mina
int bufor = t[i];
//podmien na maxa
t[i] = t[id];
//podmien na stara wartośc mina
t[id] = bufor;
}
}
}
}
Pełny kod pliku głównego (Program.cs)
Wskazówka:
using System;
namespace styczen_2022_problem_1_sortowanie_przez_wybieranie
{
internal class Program
{
static Sortownia sortownia;
static void Main(string[] args)
{
sortownia= new Sortownia();
Console.WriteLine("Pokaż przed sortowaniem: ");
sortownia.PokazTablice();
sortownia.Sortuj();
Console.WriteLine("\nPokaż po sortowaniu: ");
sortownia.PokazTablice();
Console.ReadKey();
}
}
}
Rozwiązanie część II. Aplikacja mobilna: Rejestruj konto
UWAGA. Do rozwiązania użyto języka Kotlin.
Inicjujemy pusty projekt
Otwieramy kompilator Android Studio i wybieramy New Project/ Empty Views Activity. Wybór zatwierdzamy klawiszem Next.
Ustalamy nazwę projektu aplikacji, folder lokalizacji projektu i wybieramy język. Omawiane rozwiązanie jest pisane w Kotlinie, stąd wybierz jak poniżej.
Projekt jest gotowy do wprowadzania kodu, ale zanim zaczniesz kodować przygotuj wirtualny emulator urządzenia mobilnego.
Przygotowujemy emulator urządzenia mobilnego.
Zauważ ,że w arkuszu egzaminacyjnym przegotowanym przez CKE jedna z ilustracji przedstawia działanie aplikacji na urządzeniu Nexus 5X API 29 x86. Jeżeli taki emulator istnieje w twoim kompilatorze to go uruchom. Jeżeli nie, to nie próbuj instalować urządzenia emulatora- masz odcięty Internet. Wybierz dowolny emulator z API 29 lub nowszym API (wyższy numer).
Jeżeli nie masz przygotowanego emulatora urządzenia mobilenego i nie wiesz jak to zrobić, to przejdź do tej instrukcji: Jak zainstalować emulator ?
Układ widoku
Przygotowujemy główny widok aktywności aplikacji. Cały układ widoku standardowo jest zapisywany w pliku XML w lokalizacji app/res/layout/activity_main.xml. Zostawiamy proponowane nazwy- szkoda czasu na egzaminie na ich zmianę. Ponadto, osobom sprawdzającym kod, łatwiej jest się poruszać po projekcie ze standardowymi nazwami i lokalizacjami plików.
Usuwamy standardową kontrolkę TextView i osadzamy LinearLayout (vertical). Przypisujemy atrybuty dla layout_width oraz layout_height na match_parent. Ustawiamy marginesy zewnętrzne na 2dp.
Osadzamy kontrolkę TextView i ustawiamy parametry zgodnie z arkuszem egzaminacyjnym.
W pliku XML widoku aktywności (activity_main.xml) będą to takie ustawienia
Wskazówka:
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#008080"
android:text="Rejestruj konto"
android:textColor="@color/white"
android:textSize="34sp" />
Osadzamy kontrolki odpowiedzialne za podanie adresu e-mail. Będzie to kontrolka TextView i E-mail z grupy kontrolek Text. Patrz poniżej
Wprowadzamy tekst informacyjny zgodny z ilustracją z arkusza egzaminacyjnego. I tu może się pojawić błąd związany z czytelnością aplikacji, to znaczy rozmiar czcionki w polu edycyjnym wprowadzającym adres e-mail jest za mały.
Wprowadzamy poprawkę i ustawiamy rozmiar tekstu na 20sp lub 24sp.
W analogiczny sposób osadzamy kontrolki dla podaj hasło i powtórz hasło. Z tą różnicą, że dla wprowadzani hasła i powtórzenia hasła wybieramy kontrolkę Password z grupy Text. Kontrolki te w sposób automatyczny realizują ukrywanie hasła. Co jest zgodne z wymaganiami arkusza egzaminacyjnego.
Zignoruj ostrzeżenie o treści: editTextTextPassword <EditText>: No speakable text prezent. Ostrzeżenie związane jest z braku obsługi czytników ekranu.
Ustawienia dla kontrolek związanych z wprowadzaniem hasła i jego powtórzeniem zapisane w pliku XML są następujące.
Wskazówka:
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Podaj hasło:"
android:textSize="16sp" />
<EditText
android:id="@+id/editTextTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPassword"
android:textSize="20sp" />
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Powtórz hasło:"
android:textSize="16sp" />
<EditText
android:id="@+id/editTextTextPassword2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPassword"
android:textSize="20sp" />
Dodajemy przycisk ZATWIERDŹ. Jest to kontrolka Button osadzona na środku ekranu. Kolor tła jest szary, kolor czcionki jest czarny. Wyśrodkowanie kontrolki uzyskamy przypisując
Wskazówka:
android:layout_gravity="center"
W pliku XML układu aktywności dla przycisku ustawiamy takie parametry jak poniżej
Wskazówka:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="20dp"
android:backgroundTint="#407F7F7F"
android:text="ZATWIERDŹ"
android:textColor="@color/black"
android:textSize="20sp" />
Dodajemy obszar do wyświetlenia komunikatów. Będzie to kontrolka TextView, wyśrodkowana i z czcionką o rozmiarze 20sp.UWAGA. Zgodnie z poleceniem ta kontrolka w momencie uruchomieni powinna zawierać tekst o treści autor oraz PESEL. Te wartości wprowadzimy na sztywno w momencie projektowania widoku aktywności.
Wskazówka:
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Autor PESEL: 00000000000"
android:textSize="20sp"
android:layout_margin="20dp"/>
Podgląd układu prezentuje się jak poniżej.
Funkcja sprawdzająca podane dane
Funkcje sprawdzającą wprowadzone dane zgodnie z warunkami zadania wywołamy w klawiszu ZATWIERDŹ. W treści zadania nie podano czy funkcja ma mieć jakieś argumenty, czy też ma zwracać typ. Zapiszemy ją możliwie najprościej i tak aby łatwo było ją użyć.
Nasza funkcja będzie zwracać komunikat (typ String) związany z poprawności adresu e-mail i hasła. Do znalezienie występowania znaku @ wykorzystamy metodę indexOf() dostępną w klasie String. Do porównania haseł wykorzystamy metodę compareTo() również z klasy String. Patrz poniższy kod
Wskazówka:
fun Sprawdz():String{
val txtEmail=findViewById<EditText>(R.id.editTextTextEmailAddress2)
//odczytaj indeks znaku, -1 oznacza brak
val id=txtEmail.text.indexOf("@")
if(id<0)return "Nieprawidłowy adres e-mail"
//teraz hasła
val txtHaslo=findViewById<EditText>(R.id.editTextTextPassword)
val txtPowtorzHaslo=findViewById<EditText>(R.id.editTextTextPassword2)
//0 oznacza równe ciągi znaków
var i=txtHaslo.text.toString().compareTo(txtPowtorzHaslo.text.toString())
//hasła różne
if(i!=0)return "Hasła się różnią"
if(txtHaslo.text.length<1)return "Nie podano hasła"
//adres jest dobry i hasła są jednakowe
return "Witaj "+txtEmail.text.toString()
}
Obsługa zdarzenie Click() przycisku ZATWIERDŹ
Zdarzenie Click() wywołamy w słuchaczu kliknięć, który zainicjujemy w funkcji onCreate() tak jak poniżej.
Wskazówka:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bt=findViewById<Button>(R.id.button1)
bt.setOnClickListener{
val txt=findViewById<TextView>(R.id.textView5)
txt.text=Sprawdz()
}
}
I to tyle z pisania kodu. Uruchom aplikację i sprawdź jak się zachowuje dla różnych stanów podania hasła czy wprowadzenia adresu e-mail.
Pełny kod aplikacji- zawartość pliku MainActivity.kt
Wskazówka:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.EditText
class MainActivity : AppCompatActivity() {
fun Sprawdz():String{
val txtEmail=findViewById<EditText>(R.id.editTextTextEmailAddress2)
//odczytaj indeks znaku, -1 oznacza brak
val id=txtEmail.text.indexOf("@")
if(id<0)return "Nieprawidłowy adres e-mail"
//teraz hasła
val txtHaslo=findViewById<EditText>(R.id.editTextTextPassword)
val txtPowtorzHaslo=findViewById<EditText>(R.id.editTextTextPassword2)
//0 oznacza równe ciągi znaków
var i=txtHaslo.text.toString().compareTo(txtPowtorzHaslo.text.toString())
//hasła różne
if(i!=0)return "Hasła się różnią"
if(txtHaslo.text.length<1)return "Nie podano hasła"
//adres jest dobry i hasła są jednakowe
return "Witaj "+txtEmail.text.toString()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bt=findViewById<Button>(R.id.button1)
bt.setOnClickListener{
val txt=findViewById<TextView>(R.id.textView5)
txt.text=Sprawdz()
}
}
}
Zawartość pliku układu widoku activity_main.xml
Wskazówka:
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="2dp"
android:layout_marginTop="2dp"
android:layout_marginEnd="2dp"
android:layout_marginBottom="2dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#008080"
android:text="Rejestruj konto"
android:textColor="@color/white"
android:textSize="34sp" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Podaj e-mail:"
android:textSize="16sp" />
<EditText
android:id="@+id/editTextTextEmailAddress2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textEmailAddress"
android:text="ewa@poczta.pl"
android:textSize="24sp" />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Podaj hasło:"
android:textSize="16sp" />
<EditText
android:id="@+id/editTextTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPassword"
android:textSize="20sp" />
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Powtórz hasło:"
android:textSize="16sp" />
<EditText
android:id="@+id/editTextTextPassword2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPassword"
android:textSize="20sp" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="20dp"
android:backgroundTint="#407F7F7F"
android:text="ZATWIERDŹ"
android:textColor="@color/black"
android:textSize="20sp" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Autor PESEL: 00000000000"
android:textSize="20sp"
android:layout_margin="20dp"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>