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:

Założenia do programu

Kod aplikacji (cały folder projektu) przygotuj do nagrania na płytę (skopiuj do folderu z numerem PESEL, do podfolderu konsola).

PRZEJDŹ DO ROZWIĄZANIA

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.

arkusz INF 04 styczeń 2022
Ź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.

Działanie aplikacji

Założenia aplikacji

  • 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).
  • Zastosowany kolor tła dla napisu Rejestruj konto: Teal (#008080), zgodnie z Obrazem 1a.
  • Zastosowany kolory czcionki: czarny i biały, zgodnie z Obrazem 1a.
  • Czcionka napisu Rejestruj konto jest wizualnie większa od pozostałych.
  • Pola edycyjne są rozciągnięte na całą szerokość ekranu.
  • Aplikacja powinna być zapisana czytelnie, z zasadami czystego formatowania kodu, stosować znaczące nazwy zmiennych i funkcji.
  • Dokumentacja do programu wykonana zgodnie z wytycznymi z części III zadania egzaminacyjnego.
  • PRZEJDŹ DO ROZWIĄZANIA

    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

    arkusz INF 04 styczeń 2022
    Ź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:

    W edytorze tekstu pakietu biurowego utwórz plik z dokumentacją i nazwij go egzamin. Dokument powinien zawierać podpisane zrzuty ekranu oraz zapisane informacje:

    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)

    Sortowanie przez wybieranie arkusz INF 04 styczeń 2022

    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ę?

    dodaj klasę arkusz INF 04 styczeń 2022

    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

    klasa arkusz INF 04 styczeń 2022

    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.

    wartości tablicy arkusz INF 04 styczeń 2022

    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

    sortowanie przez wybieranie arkusz INF 04 styczeń 2022

    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();
            }
        }
    }
    
    kod rozwiązania sortowani eprzez wybieranie

    Kod rozwiązania

    pobierz

    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.

    New Project Android Studio INF 04 styczeń 2022

    Ustalamy nazwę projektu aplikacji, folder lokalizacji projektu i wybieramy język. Omawiane rozwiązanie jest pisane w Kotlinie, stąd wybierz jak poniżej.

    kotlin nowy projekt Android Studio INF 04 styczeń 2022

    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.

    układ widoku Android Studio INF 04 styczeń 2022

    Osadzamy kontrolkę TextView i ustawiamy parametry zgodnie z arkuszem egzaminacyjnym.

    TextView Android Studio INF 04 styczeń 2022

    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

    e-mail Android Studio INF 04 styczeń 2022

    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.

    układ widoku Android Studio INF 04 styczeń 2022

    Wprowadzamy poprawkę i ustawiamy rozmiar tekstu na 20sp lub 24sp.

    rozmiar tekstu Android Studio INF 04 styczeń 2022

    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.

    kontrolka Password Android Studio INF 04 styczeń 2022

    Zignoruj ostrzeżenie o treści: editTextTextPassword <EditText>: No speakable text prezent. Ostrzeżenie związane jest z braku obsługi czytników ekranu.

    EditText Android Studio INF 04 styczeń 2022

    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.

    Password Android Studio INF 04 styczeń 2022

    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.

    aplikacja mobilna Android Studio INF 04 styczeń 2022

    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>
    
    kod rozwiązania rejestruj konto

    Kod rozwiązania

    pobierz
    Alkomat- wirtualny test

    Alkomat- darmowa aplikacja na Androida

    Pobierz ze sklepu Google Play
    Olinowanie stałe- kalkulator średnic

    Olinowanie stałe- darmowa aplikacja na Androida

    Pobierz ze sklepu Google Play
    przepis na gogfry

    Przepis na gofry

    zobacz
    przepis na bitą śmietanę

    Przepis na bitą śmietanę

    zobacz