Arkusz egzaminacyjny INF.04. Styczeń 2024

INF 04 egzamin praktyczny Rozwiązanie arkusza styczeń 2024

Część 1. Aplikacja konsolowa: Poprawność numeru PESEL

Za pomocą narzędzi do tworzenia aplikacji konsolowych zaimplementuj program sprawdzający poprawność numeru PESEL. Program powinien sprawdzać płeć i sumę kontrolną według opisu:

Numer PESEL jest to 11-cyfrowy identyfikator numeryczny.

Płeć

Informacja o płci osoby zawarta jest na 10. (przedostatniej) pozycji numeru PESEL.

cyfry 0, 2, 4, 6, 8 (parzyste) - oznaczają płeć żeńską

cyfry 1, 3, 5, 7, 9 (nieparzyste) - oznaczają płeć męską

Cyfra kontrolna i sprawdzanie poprawności numeru

Jedenastą cyfrą numeru PESEL jest cyfra kontrolna umożliwiająca kontrolę poprawności identyfikatora. Jest ona wynikiem działania na pierwszych dziesięciu cyfrach.

Algorytm obliczania cyfry kontrolnej na podstawie kolejnych cyfr numeru:

1. Dla kolejnych 10 cyfr numeru PESEL oblicz iloczyn każdej cyfry i jej wagi na podstawie tabeli:
Pozycja cyfry od lewej 1 2 3 4 5 6 7 8 9 10
Waga cyfry 1 3 7 9 1 3 7 9 1 3
Oznacza to, że pierwszą cyfrę numeru PESEL należy pomnożyć przez 1, drugą cyfrę przez 3, trzecią przez 7 itd.

2. Wszystkie iloczyny zsumuj ze sobą i zapisz w zmiennej S

3. Wykonaj operację modulo 10 na sumie S i zapisz w zmiennej M

4. Gdy wartość zmiennej M jest równa 0, to zmiennej R przypisz wartość 0. W przeciwnym przypadku zmiennej R przypisz wartość różnicy 10 i M (R=10-M)

5. Zmienna R stanowi sumę kontrolną numeru PESEL i musi być równa jedenastej cyfrze numeru PESEL

Założenia aplikacji:

Kod aplikacji przygotuj do nagrania na płytę. W folderze konsola zapisz 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: Dane paszportowe

Za pomocą dostępnego na stanowisku egzaminacyjnym środowiska programistycznego wykonaj aplikację desktopową do wprowadzania danych paszportowych. Do wykonania zadania wykorzystaj znajdujące się na pulpicie archiwum 7-Zip o nazwie materialy.7z zabezpieczone hasłem: p@szporTy%

arkusz INF 04 egzamin praktyczny Rozwiązanie

Na obrazie 1 przedstawiono ideę aplikacji desktopowej. W zależności od użytego środowiska programistycznego wygląd może nieznacznie się różnić.

Opis wyglądu aplikacji

Działanie aplikacji po opuszczeniu pola edycyjnego Numer

Działanie aplikacji po wybraniu przycisku OK

Aplikacja powinna być zapisana czytelnie, z zasadami czystego formatowania kodu, należy stosować znaczące nazwy zmiennych i funkcji.

Podejmij próbę kompilacji i uruchomienia aplikacji. Informacje dotyczące dokumentacji i zrzutu ekranowego umieszczono w części III zadania egzaminacyjnego. Kod aplikacji przygotuj do nagrania na płytę. W folderze desktopowa zapisz archiwum całego projektu o nazwie desktopowa.zip, pliki źródłowe, które były modyfikowane (interfejs użytkownika i logika aplikacji) oraz plik uruchomieniowy, jeżeli istnieje.

PRZEJDŹ DO ROZWIĄZANIA

Część 3. Dokumentacja aplikacji

Wykonaj dokumentację do aplikacji utworzonych na egzaminie. W kodzie źródłowym aplikacji konsolowej utwórz komentarz do dowolnej funkcji, według wzoru z listingu 1. Komentarz powinien znaleźć się nad funkcją lub pod jej nagłówkiem. W miejscu nawiasów <> należy podać odpowiednie opisy. W miejscu autor należy podać numer zdającego.
UWAGA: Dokumentację należy 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 Listing 1. Wzór dokumentacji funkcji (liczba gwiazdek dowolna)

arkusz INF 04 egzamin praktyczny Rozwiązanie

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. Należy wykonać tyle zrzutów, ile interakcji podejmuje aplikacja (np. stan początkowy, po wpisaniu numeru i opuszczeniu kontrolki, po wciśnięciu przycisku OK itd.) 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 dotyczące narzędzi, z których korzystał zdający podczas egzaminu:

Zrzuty ekranu i dokument umieść w podfolderze dokumentacja.

Rozwiązanie część I. Poprawność numeru PESEL

Warunki rozwiązania zadania nie wymagają zabezpieczeń przed wpisaniem błędnych danych (znaków nie będących cyframi). Stąd też tych zabezpieczeń w kodzie nie ma.

Zgodnie z podanymi warunkami zadania przygotujemy zmienne wynikające z podanego problemu.

Wskazówka:


//graniczna długość znaków w PESEL 
const int ILE_ZNAKOW= 11;
//tablica przechowująca kolejne cyfry kodu PESEL
static int[] pesel = new int[ILE_ZNAKOW];
//waga przypisana do pozycji w kodzie PESEL
static int[] waga = {1,3,7,9,1,3,7,9,1,3};

Program będzie działać według kolejności:

Funkcja wczytująca cyfry tworzące PESEL może wyglądać jak poniżej

Wskazówka:


static void WczytajPesel()
{
    Console.WriteLine("Podaj 11 cyfr kodu PESEL:");
    string s = "";
    for (int i = 0; i < ILE_ZNAKOW; i++)
    {
        pesel[i] = int.Parse(Console.ReadLine());
        s += pesel[i].ToString();
    }
    Console.WriteLine("Wczytany PESEL:"+s);
}

Funkcja sprawdzająca poprawność kodu PESEL ma posiadać jeden argument, którym jest PESEL i ma zwracać wartość logiczną true lub false. Jej postać może być zakodowana jak poniżej

Wskazówka:


static bool CzyPESEL(int[] p) {
    //sprawdź czy PESEL
    int S = 0;
    for (int i = 0; i < 10; i++) 
        S += p[i] * waga[i];
    int M=S%10;
    int R;
    if (M == 0) R = 0;
    else R = 10 - M;
    //tak to PESEL
    if (R == p[10])
    {
        Console.WriteLine("SUMA KONTROLNA POPRAWNA, TO JEST PESEL");
        return true;
    }
    //nie, to nie PESEL
    else
    {
        Console.WriteLine("SUMA KONTROLNA NIEPOPRAWNA, TO NIE JEST PESEL");
        return false;
    }
}

Funkcja sprawdzająca płeć ma mieć jeden argument, którym jest PESEL i ma zwracać wartość typu char. Z warunków zadania wiemy, że płeć zakodowana jest na dziesiątej pozycji kody. Gdy cyfra jest parzysta to kobieta, gdy nieparzysta to mężczyzna. Wystarczy, że sprawdzimy parzystość tej cyfry.

Wskazówka:


static char Plec(int[] p)
{
    //jeżeli przedostatnia jest parzysta
    //to kobieta
    if (p[9]%2 == 0) return 'K';
    //w przeciwnym wypadku mezczyzna
    else return 'M';
}

Wywołanie utworzonych funkcji wykonamy w głównej funkcji Main() programu

Wskazówka:


static void Main(string[] args)
{
    WczytajPesel();
    CzyPESEL(pesel);
    Console.WriteLine("Płeć: "+Plec(pesel));
    Console.ReadKey();
}

Wynik działania aplikacji konsolowej

arkusz INF 04 egzamin praktyczny Rozwiązanie

Pełny kod rozwiązania

Wskazówka:


using System;


namespace styczen_2024_problem_1_PESEL
{
    internal class Program
    {
        //graniczna długość znaków w PESEL 
        const int ILE_ZNAKOW= 11;
        //tablica przechowująca kolejne cyfry kodu PESEL
        static int[] pesel = new int[ILE_ZNAKOW];
        //waga przypisana do pozycji w kodzie PESEL
        static int[] waga = {1,3,7,9,1,3,7,9,1,3};

        static void WczytajPesel()
        {
            Console.WriteLine("Podaj 11 cyfr kodu PESEL:");
            string s = "";
            for (int i = 0; i < ILE_ZNAKOW; i++)
            {
                pesel[i] = int.Parse(Console.ReadLine());
                s += pesel[i].ToString();
            }
            Console.WriteLine("Wczytany PESEL:"+s);
        }

        static bool CzyPESEL(int[] p) {
            //sprawdź czy PESEL
            int S = 0;
            for (int i = 0; i < 10; i++) 
                S += p[i] * waga[i];
            int M=S%10;
            int R;
            if (M == 0) R = 0;
            else R = 10 - M;
            //tak to PESEL
            if (R == p[10])
            {
                Console.WriteLine("SUMA KONTROLNA POPRAWNA, TO JEST PESEL");
                return true;
            }
            //nie, to nie PESEL
            else
            {
                Console.WriteLine("SUMA KONTROLNA NIEPOPRAWNA, TO NIE JEST PESEL");
                return false;
            }
        } 

        static char Plec(int[] p)
        {
            //jeżeli przedostatnia jest parzysta
            //to kobieta
            if (p[9]%2 == 0) return 'K';
            //w przeciwnym wypadku mezczyzna
            else return 'M';
        }

        static void Main(string[] args)
        {
            WczytajPesel();
            CzyPESEL(pesel);
            Console.WriteLine("Płeć: "+Plec(pesel));
            Console.ReadKey();
        }
    }
}
kod rozwiązania nadaj przesyłkę

Kod rozwiązania

pobierz

Rozwiązanie część II. Dane paszportowe

UWAGA. Po zainicjowaniu projektu rozwiązania przejdź do folderu bin/Debug. Skopiuj do tego folderu dołączone pliki graficzne. Jeżeli tego nie zrobisz, to w kodzie programu musisz podać pełną ścieżkę dostępu do wczytywanego pliku. Ale uważaj, egzaminatorowi może zmienić się symbol dysku.

arkusz INF 04 egzamin praktyczny Rozwiązanie

Najbezpieczniej pliki graficzne jest przechowywać w folderze, w którym będzie zapisany plik wykonywalny *.exe

Tworzymy układ okna formatki aplikacji.

Pamiętaj aby przypisać kontrolkom odpowiedni kolor (podany w arkuszu egzaminacyjnym) oraz tytuł w oknie formatki.

arkusz INF 04 egzamin praktyczny Rozwiązanie

Kontrolkom (PictureBox) do przechowywania obrazu przypisujemy szerokość (140 pikseli) i wysokość (180 pikseli) oraz ustawiamy skalowanie obrazu do pełnego wypełnienia obszaru kontrolki (SizeMode ustaw na StretchImage).

arkusz INF 04 egzamin praktyczny Rozwiązanie

Zmienne w programie

Podane rozwiązanie jest napisane możliwie najprościej. Potrzebujemy tylko jednej zmiennej do przechowywania koloru oczu. Z podanych warunków wynika, że początkowy kolor oczu to niebieski.

Wskazówka:


public partial class Form1 : Form
{
    string kolorOczu="niebieskie";
    public Form1()
    {
        InitializeComponent();
    }

Funkcja ładująca grafikę

Arkusz egzaminacyjny zawiera informację, że grafika ma być ładowana na podstawie podanego cyfrowego prefiksu, do którego dołączony jest ciąg znaków tworzący rdzeń nazwy plików graficznych. Przy ładowaniu grafiki z pliku może dojść do nie znalezienia pliku, co powoduje zawieszenie aplikacji.

Najprostszym zabezpieczeniem jest zastosowanie wyjątku na przykład: try- catch. Skorzystamy z tego rozwiązania. Jednocześnie wyślemy w formie komunikatu kod błędnego ładowania pliku (nie jest to wymagane w podanych warunkach rozwiązania arkusza egzaminacyjnego)

Wskazówka:


//parametr to odczytany prefiks z TextBoxa
bool LadujGrafike(string p)
{
    //przechwyć wyjątek
    try
    {
        pictureBox1.Load(p + "-zdjecie.jpg");
        pictureBox2.Load(p + "-odcisk.jpg");
        return true;
    }
    //gdy nie ma pliku graficznego to obsłuż wyjątek
    //braku pliku- wyślij komunikat ze ścieżką ładowanego pliku
    catch(Exception e)
    {
        MessageBox.Show($"Brak pliku w lokalizacji\n{e.Message}");
        return false;
    }
}

Wybór koloru oczu

Kolor oczu ustalany jest na podstawie aktywności kontrolek typu RadioButton. Najłatwiej kontrolki te jest obsłużyć wspólni jednym kodem metody zdarzenia typu CheckedChanged().

Na formatce zaznacz wszystkie trzy kontrolki typu RadioButton (przytrzymaj wciśnięty klawisz SHIFT i wybierz kontrolki kliknięciem myszki)

arkusz INF 04 egzamin praktyczny Rozwiązanie

Przejdź do zakładki Właściwości. W pustym polu metody CheckedChanged dwa razy szybko kliknij. Zainicjujesz wspólne zdarzenie typu CheckedChanged dla tych trzech zaznaczonych kontrolek RadioButton

arkusz INF 04 egzamin praktyczny Rozwiązanie

W kodzie utworzonego zdarzenia wykorzystamy rzutowanie na aktywny obiekt typu RadioButton i jeżeli jest on wybrany, to kolor oczu odczytamy z przypisanego tekstu pola Text

Wskazówka:


private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    //kolor oczu
    RadioButton rb=sender as RadioButton;
    //zapamiętaj aktywny kolor oczu
    if(rb.Checked)kolorOczu=rb.Text;
}

Obsługa klawisza OK.

Na zakończenie zapiszemy kod zdarzenia kliknięcia w kontrolkę typu Button. W zdarzeniu tym obsłużymy odczyt wprowadzonych danych (imię, nazwisko, prefiks pliku graficznego) z jednoczesnymi komunikatami.

Do przycisku podpinamy metodę zdarzenia kliknięcia. Patrz poniżej

arkusz INF 04 egzamin praktyczny Rozwiązanie

W metodzie kliknięcia wprowadzamy poniższy kod.

Wskazówka:


private void button1_Click(object sender, EventArgs e)
{
    //załaduj grafikę
    if(LadujGrafike(textBox1.Text)==false)return;
    //tresc komunikatu
    string tresc = $"{textBox2.Text} {textBox3.Text} kolor oczu {kolorOczu}";
    if (textBox2.Text != "" && textBox3.Text != "")
        MessageBox.Show(tresc,"Komunikat",MessageBoxButtons.OK);
        else
        MessageBox.Show("Wprowadź dane","Komunikat",MessageBoxButtons.OK);
}

Skompiluj program i sprawdź efekt działania. Wynik działania aplikacji desktopowej.

arkusz INF 04 egzamin praktyczny Rozwiązanie

Pełny kod rozwiązania

Wskazówka:


using System;
using System.Windows.Forms;

namespace styczen2024paszporty
{
    public partial class Form1 : Form
    {
        string kolorOczu="niebieskie";
        public Form1()
        {
            InitializeComponent();
        }
        //parametr to odczytany prefiks z TextBoxa
        bool LadujGrafike(string p)
        {
            //przechwyć wyjątek
            try
            {
                pictureBox1.Load(p + "-zdjecie.jpg");
                pictureBox2.Load(p + "-odcisk.jpg");
                return true;
            }
            //gdy nie ma pliku graficznego to obsłuż wyjątek
            //braku pliku- wyśłij komunikat ze ścieżką ładowanego pliku
            catch(Exception e)
            {
               MessageBox.Show($"Brak pliku w lokalizacji\n{e.Message}");
               return false;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //załaduj grafikę
            if(LadujGrafike(textBox1.Text)==false)return;
            //tresc komunikatu
            string tresc = $"{textBox2.Text} {textBox3.Text} kolor oczu {kolorOczu}";
            if (textBox2.Text != "" && textBox3.Text != "")
                MessageBox.Show(tresc,"Komunikat",MessageBoxButtons.OK);
                else
                MessageBox.Show("Wprowadź dane","Komunikat",MessageBoxButtons.OK);
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            //kolor oczu
            RadioButton rb=sender as RadioButton;
            //zapamiętaj aktywny kolor oczu
            if(rb.Checked)kolorOczu=rb.Text;
        }

    }
}
kod rozwiązania nadaj przesyłkę

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