Arkusz egzaminacyjny INF.04. Styczeń 2023

INF 04 egzamin praktyczny Rozwiązanie arkusza styczeń 2023

Część 1. Aplikacja konsolowa: Program do obsługi notatek

Napisz program implementujący klasę do obsługi notatek.

Założenia do programu:

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 uruchomieniowy, jeżeli istnieje.

PRZEJDŹ DO ROZWIĄZANIA

Część 2. Aplikacja mobilna: Proste notatki

Wykonaj aplikację mobilną obsługującą proste notatki tekstowe za pomocą środowiska programistycznego dostępnego na stanowisku egzaminacyjnym oraz uruchom ją w dostępnym emulatorze systemu mobilnego. Aplikacja umożliwia wpisywanie prostych notatek. Dane początkowe aplikacji zapisano w pliku dane.txt, zawartym w archiwum zad2.zip, które znajduje się na pulpicie konta Egzamin i jest zabezpieczony hasłem: !D@Ne$

Aplikacja mobilna Proste notatki

Na obrazach 1a i 1b przedstawiono stan początkowy aplikacji mobilnej. W zależności od zastosowanego środowiska programistycznego oraz emulowanego systemu wynik końcowy może nieznacznie się różnić od przedstawionego. Obraz 2 przedstawia zachowanie aplikacji, dodano notatkę ?Urodziny Ali?, jest ona widoczna jako ostatni element listy.

Elementy aplikacji:

Działanie aplikacji:

Założenia aplikacji:

Podejmij próbę kompilacji i uruchomienia aplikacji. Informacje dotyczące dokumentacji i zrzutu ekranowego umieszczono w części III zadania. Kod aplikacji przygotuj do nagrania na płytę. W podfolderze mobilna powinno znaleźć się archiwum całego projektu o nazwie mobilna.zip, plik z kodem źródłowym interfejsu użytkownika (XAML lub XML) oraz plik źródłowy kodu skojarzonego z interfejsem użytkownika.

PRZEJDŹ DO ROZWIĄZANIA

Część III. Dokumentacja utworzonych aplikacji

Wykonaj dokumentację do aplikacji utworzonych na egzaminie. W kodzie źródłowym aplikacji konsolowej utwórz nagłówek klasy, według wzoru. Nagłówek powinien znaleźć się nad definicją klasy. W miejscu nawiasów <> należy podać odpowiednie opisy. W miejscu autor należy podać numer zdającego.

UWAGA: Dokumentację umieścić w komentarzu (wieloliniowym lub kilku jednoliniowych). Znajdujący się w listingu 1 wzór dokumentacji jest bez znaków początku i końca komentarza, gdyż te są różne dla różnych języków programowania

arkusz INF 04 styczeń 2023 wersja 2

Wykonaj zrzuty ekranu dokumentujące uruchomienie aplikacji utworzonych podczas egzaminu. Zrzuty powinny obejmować cały obszar ekranu monitora 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 lub okno terminala z kompilacją projektu. 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. Wykonać należy co najmniej tyle zrzutów, ile interakcji podejmuje aplikacja.

Wymagane zrzuty ekranu:

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

Zrzuty ekranu i dokument umieść w podfolderze dokumentacja.

UWAGA: Nagraj płytę z rezultatami pracy. W folderze z numerem zdającego powinny się znajdować podfoldery: konsola, mobilna, dokumentacja. W folderze dokumentacja: pliki ze zrzutami oraz plik egzamin. W folderze konsola: spakowany cały projekt aplikacji konsolowej, pliki źródłowe, opcjonalnie plik uruchomieniowy. W folderze mobilna: spakowany cały projekt aplikacji mobilnej, pliki z kodem źródłowym interfejsu i logiki. Po nagraniu płyty sprawdź poprawność nagrania. Opisz płytę numerem zdającego i pozostaw na stanowisku, zapakowaną w pudełku wraz z arkuszem egzaminacyjnym.

Rozwiązanie części I: Aplikacja konsolowa

Przygotowanie rozwiązani rozpoczniemy od wybrania w kompilatorze Visual Studio modułu kompilacji dla Aplikacja konsoli (.NET Framework)

arkusz INF 04 styczeń 2023 wersja 2 Aplikacja konsolowa

Dodajemy klasę

Do projektu dodajemy klasę związaną z tworzeniem notatek. Dla klasy przyjmujemy nazwę (pisaną z dużej litery) Notatka

dodanie klasy visual studio c#

W oknie dialogowym tworzenia klasy wpisz jak poniżej

tworzenie klasy visual studio c#

W utworzonym pliku klasy Notatka.cs definiujemy pola prywatne i publiczne zgodnie z wymaganiami arkusz egzaminacyjnego

Wskazówka:


internal class Notatka
{
    private static int licznik=0;
    private int id;
    public string tytul;
    public string tresc;
}

Dodajemy konstruktor klasy Notatka

W wymaganiach arkusza podano, że konstruktor zawiera dwa parametry dla tytułu i treści notatki. Konstruktor ma inkrementować (zwiększać o jeden) licznik notatek, przypisać identyfikator notatce, tytuł i treść.

Wskazówka:


public Notatka(string _tytul,string _tresc) {
    licznik++;
    id = licznik;
    tytul = _tytul;
    tresc = _tresc;
}

Każde użycie konstruktora zwiększa licznik, a bieżący stan licznika jest przypisywany do identyfikatora tworzonej notatki.

Funkcja diagnostyczna i pokazująca zawartość notatki

Do klasy Notatka dopisujemy dwie proste w działaniu funkcje. Jedna z nich jest funkcja diagnostyczną wypisująca wszystkie parametry notatki, a druga jest funkcja pokazująca zawartość konkretnej notatki. W obu funkcjach zastosujemy łańcuch formatujący- String.Format

Wskazówka:


public void Diagnostyka()
{
    Console.WriteLine(String.Format(
                        "Licznik: {0}, id: {1}, Tytuł: {2}, Treść: {3}",
                        licznik,id,tytul,tresc));
}

W funkcji pokazującej zawartość danych w łańcuchu formatującym zastosujemy przeniesieni do nowego wiersza i uzycie tabulatora (sekwencja parametrów \n\t)

Wskazówka:


public void PokazNotatke()
{
    Console.WriteLine(String.Format(
                        "Tytuł: {0}\n\tTreść: {1}",
                        tytul, tresc));
}

Definiujemy zmienne

W głównym pliku projektu (standardowo Program.cs) definiujemy trzy zmienne oparte na klasie Notatka. W treści zadania nie jest narzucony sposób podania treści notatek. Zastosujemy najprostszą metodę. Treści podamy na sztywno w kodzie programu w momencie tworzenia zmiennych opartych na klasie Notatka.

Wskazówka:


static void Main(string[] args)
{
    Notatka notatka_1,notatka_2,notatka_3;
    notatka_1 = new Notatka("Informacja dnia",
	"UWAGA! W dniu dzisiejszym rozpoczynają się egzaminy");
    notatka_2 = new Notatka("Egzamin trwa",
	"Uczniowie 4 klasy technikum o kierunku technik programista");
    notatka_3 = new Notatka("Wyniki egzaminu",
	"W najblizszych dniach CKE opublikuje wyniki egzaminu");
    Console.WriteLine("Pokaż NOTATKI");
    notatka_1.PokazNotatke();
    notatka_2.PokazNotatke();
    notatka_3.PokazNotatke();
    Console.WriteLine("Pokaż DIAGNOSTYKĘ");
    notatka_1.Diagnostyka();
    notatka_2.Diagnostyka();
    notatka_3.Diagnostyka();
    Console.ReadKey();
}

Skompiluj program i sprawdź zachowanie utworzonej aplikacji konsolowej.

egzamin inf 04 aplikcja notatka visual studio c#

Pełny kod rozwiązania

Plik klasy Notatka (Notatka.cs)

Wskazówka:


using System;

namespace styczen_2023_v2_problem_1_notatka
{
    internal class Notatka
    {
        private static int licznik=0;
        private int id;
        public string tytul;
        public string tresc;

        public Notatka(string _tytul,string _tresc) {
            licznik++;
            id = licznik;
            tytul = _tytul;
            tresc = _tresc;
        }
        public void Diagnostyka()
        {
            Console.WriteLine(String.Format(
                              "Licznik: {0}, id: {1}, Tytuł: {2}, Treść: {3}",
                              licznik,id,tytul,tresc));
        }
        public void PokazNotatke()
        {
            Console.WriteLine(String.Format(
                              "Tytuł: {0}\n\tTreść: {1}",
                              tytul, tresc));
        }
    }
}

Plik główny aplikacji konsolowej (Program.cs)

Wskazówka:


using System;

namespace styczen_2023_v2_problem_1_notatka
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Notatka notatka_1,notatka_2,notatka_3;
            notatka_1 = new Notatka("Informacja dnia",
			"UWAGA! W dniu dzisiejszym rozpoczynają się egzaminy");
            notatka_2 = new Notatka("Egzamin trwa",
			"Uczniowie 4 klasy technikum o kierunku technik programista");
            notatka_3 = new Notatka("Wyniki egzaminu",
			"W najblizszych dniach CKE opublikuje wyniki egzaminu");
            Console.WriteLine("Pokaż NOTATKI");
            notatka_1.PokazNotatke();
            notatka_2.PokazNotatke();
            notatka_3.PokazNotatke();
            Console.WriteLine("Pokaż DIAGNOSTYKĘ");
            notatka_1.Diagnostyka();
            notatka_2.Diagnostyka();
            notatka_3.Diagnostyka();
            Console.ReadKey();
        }
    }
}
kod rozwiązania klasa notatka

Kod rozwiązania

pobierz

Rozwiązanie części II. Aplikacja mobilna: Proste notatki tekstowe

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.

Proste notatki tekstowe New Project Empty Views Activity

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

Proste notatki tekstowe New Project

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 ?

Tworzymy układ widoku głównej aktywności aplikacji

Podane w arkuszu egzaminacyjnym wymagania dla układu widoku okna aplikacji narzucają zastosowanie układu LinearLayout (vertical). Dodajemy ten układ i przypisujemy margines układu na 8 dp dla każdego boku

Proste notatki tekstowe układ LinearLayout

W pliku XML (activity_main.xml) układu widoku zapisane zostaną poniższe parametry

Wskazówka:


<LinearLayout
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:orientation="vertical"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="1.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="1.0">
</LinearLayout>

Pole do wprowadzania danych

Kontrolki EditText oraz Button służące do wprowadzenia nowych danych i ich zaakceptowania ułożone są horyzontalnie- jedna obok drugiej . Te kontrolki umieszczamy w obszarze kontrolki LinearLayout (horizontal). Dodajemy je do układu projektu widoku, co utworzy poniższą hierarchię.

Proste notatki tekstowe kontrolka EditText

Nowym kontrolkom odpowiednio przypisz parametry. Poniżej aktualna zawartość pliku XML tworzonego układu widoku.

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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <EditText
                android:id="@+id/editText1"
                android:layout_width="300dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Nowy element"
                android:textSize="24sp" />

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:backgroundTint="#DC143C"
                android:text="DODAJ" />
        </LinearLayout>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Lista notatek

Ostatnia wymagana kontrolka to ListView. W stanie początkowym lista powinna zawierać trzy elementy. Każdy element ma wpisany krótki tekst. Zaczniemy od osadzenia kontrolki ListView. Osadzonej kontrolce przypisz layout_width i layout_height na match_parent. Wprowadź identyfikator na id: ListView1

Proste notatki tekstowe kontrolka ListView

W warunkach zadania podano, że kolor linii separatora jest ustawiony na Crimson (#DC143C). Aby zmiany koloru były widoczne, trzeba również zmienić szerokość linii separatora. Przejdź do pliku XML i ustaw jak poniżej:

Wskazówka:


<ListView
    android:id="@+id/ListView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:drawSelectorOnTop="false"
    android:divider="#DC143C"
    android:dividerHeight="4px"/>

Zmiany prezentują się jak poniżej

Proste notatki tekstowe kontrolka ListView egzamin inf 04

Kolekcja notatek

Warunki zadania podają, że notatki zapisane są w dowolnej kolekcji. Utworzymy zalążek takiej kolekcji. Początkową treść skopiujemy z dołączonego widoku w arkuszu egzaminacyjnym do dynamicznej listy typu String. Zastosowanie zmiennej listy upraszcza proces odświeżania widoku kontrolki ListView po dodaniu elementu.

Przechodzimy do pliku MainActivity.kt i deklarujemy zmienną listę typu łańcuchowego (String) z przypisanym początkowym tekstem

Wskazówka:


var itemyTresci= arrayListOf<String>(
    "Zakupy: chleb, masło, ser",
    "Do zrobienia: obiad, umyć podłogi",
    "weekend: kino, spacer z psem"
)

override fun onCreate(savedInstanceState: Bundle?) {

W funkcji onCreate() załadujemy początkowe dane do listy itemów treści. Dane do listy wprowadza się przy pomocy tak zwanego adaptera. Tworząc adapter podajemy kontekst aktywności, szablon widoku itemu (skorzystamy z wbudowanego do zasobów androida) oraz tablicę z treścią itemów.

Wskazówka:


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    //lista z widku układu
    var lista = findViewById<ListView>(R.id.ListView1)
    //utwórz lokalnego adaptera listy na podstawie układu simple_list_item_1
    var adapterListy=ArrayAdapter<String>(this,
		android.R.layout.simple_list_item_1,
		itemyTresci)
    lista.setAdapter(adapterListy)
}

Skompiluj aplikacje i sprawdź jej wygląd na emulatorze urządzenia mobilnego. Prawidłowo działająca aplikacja prezentuje się jak poniżej.

Proste notatki tekstowe inf 04 aplikacja mobilna

Dodajemy obsługę wprowadzania kolejnych treści

Kolejne treści kolekcji itemów odczytywane są z pola edycyjnego kontrolki EditText po kliknięciu kontrolki Button. Odświeżanie zawartości widocznej listy wykonuje metoda podpiętego adaptera listy. Nazwa metody to notifiDataChanged.

Wskazówka:


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    //lista z widku układu
    var lista = findViewById<ListView>(R.id.ListView1)
    //utwórz lokalnego adaptera listy na podstawie układu simple_list_item_1
    var adapterListy=ArrayAdapter<String>(this,
		android.R.layout.simple_list_item_1,
		itemyTresci)
    lista.setAdapter(adapterListy)
    //obsługa klikania w klawisz DODAJ
    val btDodaj=findViewById<Button>(R.id.button1)
    btDodaj.setOnClickListener {
        val txt=findViewById<EditText>(R.id.editText1)
        //dodaj nowa treśc do listy itemów treści
        itemyTresci.add(txt.text.toString())
        //uaktualnij zawartośc listy adaptera
        //jest to równoznaczne z uaktualnieniem widoku listy
        adapterListy.notifyDataSetChanged()
    }
}

Wynik działania klawisza DODAJ

Proste notatki tekstowe inf 04 aplikacja mobilna wynik działania aplikacji

Pełny kod rozwiązania

Zawartość pliku MainActivity.kt

Wskazówka:


import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.EditText
import android.widget.ListView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    var itemyTresci= arrayListOf<String>(
        "Zakupy: chleb, masło, ser",
        "Do zrobienia: obiad, umyć podłogi",
        "weekend: kino, spacer z psem"
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //lista z widku układu
        var lista = findViewById<ListView>(R.id.ListView1)
        //utwórz lokalnego adaptera listy na podstawie układu simple_list_item_1
        var adapterListy=ArrayAdapter<String>(this,
			android.R.layout.simple_list_item_1,
			itemyTresci)
        lista.setAdapter(adapterListy)
        //obsługa klikania w klawisz DODAJ
        val btDodaj=findViewById<Button>(R.id.button1)
        btDodaj.setOnClickListener {
            val txt=findViewById<EditText>(R.id.editText1)
            //dodaj nowa treśc do listy itemów treści
            itemyTresci.add(txt.text.toString())
            //uaktualnij zawartośc listy adaptera
            //jest to równoznaczne z uaktualnieniem widoku listy
            adapterListy.notifyDataSetChanged()
        }
    }
}

Zawartość pliku 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <EditText
                android:id="@+id/editText1"
                android:layout_width="300dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Nowy element"
                android:textSize="24sp" />

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:backgroundTint="#DC143C"
                android:text="DODAJ" />
        </LinearLayout>

        <ListView
            android:id="@+id/ListView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:drawSelectorOnTop="false"
            android:divider="#DC143C"
            android:dividerHeight="4px"/>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
kod rozwiązania aplikcj amobilna proste notatki

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