Warsztat: zadanie w stylu aplikacji desktop

Koniec bloku o kontrolkach to dobry moment na próbę generalną. Dostajesz treść zadania napisaną tak, jak w arkuszu egzaminacyjnym: lista wymagań, wygląd okna, zasady obliczeń, komentarz do metody. Przejdziemy przez nie krok po kroku — od przeczytania treści, przez plan pracy, do sprawdzenia programu z listą kryteriów. Potem sześć kolejnych arkuszy do samodzielnego rozwiązania.

XAML C# INF.04 arkusz komentarz metody kryteria oceny 2 × 90 min
CEL LEKCJI

Czego się dziś nauczysz

  • Przeczytasz treść zadania egzaminacyjnego i wypiszesz z niej listę wymagań do sprawdzenia.
  • Zaplanujesz kolejność pracy tak, żeby szybko mieć działający szkielet programu.
  • Zbudujesz okno dokładnie według specyfikacji: nazwy, kolory, kolejność i rodzaj kontrolek.
  • Opiszesz metodę komentarzem w wymaganym formacie.
  • Sprawdzisz program według listy kryteriów i przygotujesz zrzuty ekranu.
TEORIA

Część desktopowa egzaminu

Na egzaminie praktycznym INF.04 dostajesz kilka zadań: aplikację (konsolową, desktopową albo mobilną — zależnie od arkusza), testy i dokumentację. Zadanie z aplikacją desktopową zwykle wymaga:

  • okna o określonym tytule — często z Twoim numerem zdającego;
  • konkretnych kontrolek w podanej kolejności i układzie, z podanymi kolorami, rozmiarami czcionek i tekstami;
  • obsługi zdarzeń: przycisk liczy coś albo pokazuje komunikat, lista zmienia obraz, pole wyboru zmienia stan innej kontrolki;
  • sprawdzenia danych i komunikatu w określonej postaci;
  • obrazów z dołączonego folderu;
  • komentarza do wskazanej metody w podanym formacie;
  • zrzutów ekranu działającego programu zapisanych pod określonymi nazwami.

Szczegóły — nazwy plików, folderów, format komentarza — są zawsze w treści arkusza i to ona jest najważniejsza. Ćwiczenie tej lekcji uczy przede wszystkim dokładnego czytania i niegubienia drobnych wymagań.

ZADANIE

Treść zadania

Aplikacja desktopowa „Zapisy na wycieczkę”

Wykonaj aplikację desktopową dla biura podróży SZLAK. Okno aplikacji (rysunek poniżej) zawiera:

  1. Tytuł okna: „Zapisy na wycieczkę — wykonał: ” i Twój numer zdającego. Okno o rozmiarze 760 × 520, bez możliwości zmiany rozmiaru, wyświetlane na środku ekranu.
  2. Nagłówek na całą szerokość okna: napis „Biuro podróży SZLAK”, tło #1D4E89, kolor tekstu biały, czcionka 22 pt, pogrubiona.
  3. Po lewej formularz z etykietami: Imię i nazwisko (pole tekstowe), Telefon (pole tekstowe), Wycieczka (lista rozwijana z pozycjami: Kraków — 450 zł, Zakopane — 620 zł, Gdańsk — 380 zł), Liczba osób (pole tekstowe), Transport (dwa przyciski opcji: „autokar (w cenie)” — zaznaczony domyślnie, „pociąg (+60 zł/os.)”), pole wyboru „ubezpieczenie kosztów leczenia (+35 zł/os.)” i przycisk „Oblicz i zapisz”.
  4. Po prawej zdjęcie wybranej wycieczki (pliki krakow.png, zakopane.png, gdansk.png z folderu z arkuszem), wypełniające ramkę o wysokości 190, a pod nim napis z ceną podstawową.
  5. Na dole okna lista przyjętych zgłoszeń z nagłówkiem „Przyjęte zgłoszenia:”.

Działanie aplikacji:

  1. Po wybraniu wycieczki zdjęcie zmienia się na odpowiednie, a pod nim pojawia się napis „Cena podstawowa: X zł za osobę. Grupy od 5 osób otrzymują 10% rabatu.”
  2. Po kliknięciu przycisku program sprawdza, czy podano imię i nazwisko, telefon (9 cyfr, spacje dozwolone), wybrano wycieczkę i podano liczbę osób od 1 do 10. Jeżeli nie — wyświetla jedno okno komunikatu z listą wszystkich błędnych pól.
  3. Koszt liczy metoda ObliczKoszt: (cena podstawowa + 60 zł za pociąg + 35 zł za ubezpieczenie) × liczba osób; dla 5 lub więcej osób koszt zmniejsza się o 10%.
  4. Przy poprawnych danych program wyświetla okno komunikatu „Zgłoszenie przyjęte:” z opisem w postaci Jan Kowalski, Zakopane, 4 os., koszt: 2 860,00 zł i dopisuje ten opis do listy zgłoszeń.
  5. Metodę ObliczKoszt opisz komentarzem zawierającym: nazwę funkcji, opis, parametry, zwracany typ i opis, autora (numer zdającego).

Wykonaj zrzuty ekranu: wycieczka1.png — błędy przy pustym formularzu, wycieczka2.png — przyjęte zgłoszenie dla danych z przykładu.

Zapisy na wycieczkę — wykonał: 00000000000–✕
Biuro podróży SZLAK
Imię i nazwisko:
Jan Kowalski
Telefon:
600 100 200
Wycieczka:
Zakopane — 620 zł▾
Liczba osób:
4
Transport:
autokar (w cenie)pociąg (+60 zł/os.)
ubezpieczenie kosztów leczenia (+35 zł/os.)
Oblicz i zapisz
ZAKOPANE
Cena podstawowa: 620 zł za osobę. Grupy od 5 osób otrzymują 10% rabatu.
Przyjęte zgłoszenia:
Jan Kowalski, Zakopane, 4 os., koszt: 2 860,00 zł

rysunek z arkusza — okno po przyjęciu pierwszego zgłoszenia

TEORIA

Plan pracy

Zanim otworzysz Visual Studio, przeczytaj treść dwa razy i wypisz wymagania jako listę do odhaczenia — na kartce albo w komentarzu na początku pliku. Potem pracuj w kolejności, która jak najszybciej daje działający program:

KrokCoDlaczego w tej kolejności
1projekt, tytuł, rozmiar okna, obrazy w projekcieproste punkty, które łatwo zgubić na końcu
2układ okna i wszystkie kontrolki z nazwamiwidać od razu, czy okno przypomina rysunek
3zdarzenie listy → zdjęcie i napisszybki efekt, sprawdza ścieżki do obrazów
4przycisk: walidacja, potem obliczenia i komunikatgłówna logika — najwięcej punktów
5komentarz metody, porządek w kodziewymagany format — przepisz go dokładnie
6test z listą wymagań, zrzuty ekranuzrzut bez wymaganych danych nie potwierdzi działania
TEORIA

Krok po kroku

Krok 1–2: okno i układ

Okno ma trzy części: nagłówek na górze, listę na dole i środek z dwiema kolumnami. To dokładnie przypadek DockPanel z lekcji 13: nagłówek Top, lista Bottom, a środek jako ostatnie dziecko. Środek to Grid z kolumnami * i 300, a formularz po lewej — kolejny Grid z etykietami Auto (lekcja 10). Zdjęcie: Border o wysokości 190 z Image Stretch="UniformToFill" — „wypełniające ramkę” (lekcja 21). Rozmiar „bez możliwości zmiany” to ResizeMode="CanMinimize", „na środku ekranu” — WindowStartupLocation="CenterScreen".

Krok 3: zdjęcie po wyborze wycieczki

Pozycje listy mają w Tag nazwę pliku bez rozszerzenia. W SelectionChanged odczytujesz zaznaczony ComboBoxItem i składasz adres pack://. Ceny i nazwy miejsc są w tablicach w tej samej kolejności co pozycje listy, więc SelectedIndex wskazuje właściwy element.

Krok 4: przycisk

Treść mówi o jednym komunikacie z listą wszystkich błędów — zbierasz je więc w zmiennej, jak w lekcji 22, i wyświetlasz razem. Dopiero przy poprawnych danych liczysz koszt metodą ObliczKoszt i pokazujesz wynik w dokładnie takiej postaci jak w przykładzie z treści (format N2 daje „2 860,00”).

Krok 6: test

Sprawdź przypadki z treści i granice: pusty formularz, telefon z 8 cyframi i ze spacjami, 0 i 11 osób, 4 i 5 osób (rabat!), każda wycieczka. Dla danych z przykładu musi wyjść 2 860,00 zł: (620 + 60 + 35) × 4 = 2 860, bez rabatu.

TEORIA

Komentarz metody

Arkusze często wymagają opisania wskazanej funkcji komentarzem z określonymi elementami. Przepisz ich nazwy dokładnie tak, jak w treści, i uzupełnij każdy punkt — także parametry i typ zwracany:

wzór komentarza
/*********************************************************
 * nazwa funkcji:      NazwaMetody
 * opis funkcji:       co robi metoda (jednym–dwoma zdaniami)
 * parametry:          nazwa – znaczenie i zakres
 *                     nazwa2 – znaczenie
 * zwracany typ i opis: typ – co oznacza zwracana wartość
 * autor:              numer zdającego
 *********************************************************/

Metoda liczona w komentarzu powinna być „czysta”: dostaje dane przez parametry i zwraca wynik, a nie czyta pól okna. Taką metodę łatwo opisać, przetestować i użyć ponownie.

ROZWIĄZANIE

Rozwiązanie wzorcowe

Projekt przyklady/24 zawiera folder obrazy z trzema zdjęciami dołączonymi jako zasoby (wpis w .csproj, jak w lekcji 21).

MainWindow.xaml — pełny plik
<Window x:Class="Lekcja24.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Zapisy na wycieczkę — wykonał: 00000000000" Height="520" Width="760"
        ResizeMode="CanMinimize" WindowStartupLocation="CenterScreen">

    <DockPanel>
        <!-- 1. Nagłówek -->
        <Border DockPanel.Dock="Top" Background="#FF1D4E89" Padding="15,10">
            <TextBlock Text="Biuro podróży SZLAK" Foreground="White" FontSize="22" FontWeight="Bold"/>
        </Border>

        <!-- 3. Lista zgłoszeń na dole -->
        <DockPanel DockPanel.Dock="Bottom" Margin="15,0,15,15" Height="110">
            <TextBlock DockPanel.Dock="Top" Text="Przyjęte zgłoszenia:" FontWeight="Bold" Margin="0,0,0,4"/>
            <ListBox x:Name="Zgloszenia"/>
        </DockPanel>

        <!-- 2. Formularz (lewa kolumna) i zdjęcie (prawa) -->
        <Grid Margin="15">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="300"/>
            </Grid.ColumnDefinitions>

            <Grid Grid.Column="0" Margin="0,0,15,0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>

                <Label Grid.Row="0" Content="Imię i nazwisko:"/>
                <TextBox x:Name="Osoba" Grid.Row="0" Grid.Column="1" Margin="0,4"/>

                <Label Grid.Row="1" Content="Telefon:"/>
                <TextBox x:Name="Telefon" Grid.Row="1" Grid.Column="1" Margin="0,4"
                         Width="120" HorizontalAlignment="Left" MaxLength="11"/>

                <Label Grid.Row="2" Content="Wycieczka:"/>
                <ComboBox x:Name="Wycieczka" Grid.Row="2" Grid.Column="1" Margin="0,4"
                          SelectionChanged="Wycieczka_SelectionChanged">
                    <ComboBoxItem Content="Kraków — 450 zł" Tag="krakow"/>
                    <ComboBoxItem Content="Zakopane — 620 zł" Tag="zakopane"/>
                    <ComboBoxItem Content="Gdańsk — 380 zł" Tag="gdansk"/>
                </ComboBox>

                <Label Grid.Row="3" Content="Liczba osób:"/>
                <TextBox x:Name="Osoby" Grid.Row="3" Grid.Column="1" Margin="0,4"
                         Width="50" HorizontalAlignment="Left" MaxLength="2"/>

                <Label Grid.Row="4" Content="Transport:"/>
                <StackPanel Grid.Row="4" Grid.Column="1" Orientation="Horizontal" Margin="0,6">
                    <RadioButton x:Name="Autokar" Content="autokar (w cenie)" IsChecked="True"
                                 Margin="0,0,15,0"/>
                    <RadioButton x:Name="Pociag" Content="pociąg (+60 zł/os.)"/>
                </StackPanel>

                <CheckBox x:Name="Ubezpieczenie" Grid.Row="5" Grid.Column="1" Margin="0,6"
                          Content="ubezpieczenie kosztów leczenia (+35 zł/os.)"/>

                <Button Grid.Row="6" Grid.Column="1" Content="Oblicz i zapisz" Width="140"
                        Height="32" HorizontalAlignment="Left" Margin="0,12,0,0"
                        Click="Zapisz_Click"/>
            </Grid>

            <StackPanel Grid.Column="1">
                <Border BorderBrush="LightGray" BorderThickness="1" Height="190">
                    <Image x:Name="Zdjecie" Stretch="UniformToFill"/>
                </Border>
                <TextBlock x:Name="Informacja" Margin="0,8,0,0" TextWrapping="Wrap"
                           Text="Wybierz wycieczkę, aby zobaczyć zdjęcie."/>
            </StackPanel>
        </Grid>
    </DockPanel>
</Window>
MainWindow.xaml.cs — pełny plik
/*********************************************************
 * Aplikacja: Zapisy na wycieczkę — biuro podróży SZLAK
 * autor: 00000000000 (numer zdającego)
 *********************************************************/
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;

namespace Lekcja24;

public partial class MainWindow : Window
{
    // dane wycieczek w kolejności pozycji listy rozwijanej
    private readonly string[] miejsca = { "Kraków", "Zakopane", "Gdańsk" };
    private readonly int[] ceny = { 450, 620, 380 };

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Wycieczka_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ComboBoxItem? pozycja = Wycieczka.SelectedItem as ComboBoxItem;
        if (pozycja == null)
        {
            return;
        }

        Zdjecie.Source = new BitmapImage(new Uri($"pack://application:,,,/obrazy/{pozycja.Tag}.png"));
        Informacja.Text = $"Cena podstawowa: {ceny[Wycieczka.SelectedIndex]} zł za osobę. " +
                          "Grupy od 5 osób otrzymują 10% rabatu.";
    }

    private void Zapisz_Click(object sender, RoutedEventArgs e)
    {
        // 1. Walidacja — zbieramy wszystkie błędy
        string bledy = "";

        if (Osoba.Text.Trim() == "")
        {
            bledy += "- imię i nazwisko\n";
        }

        string telefon = Telefon.Text.Replace(" ", "");
        bool telefonOk = telefon.Length == 9;
        foreach (char z in telefon)
        {
            if (!char.IsDigit(z))
            {
                telefonOk = false;
            }
        }
        if (!telefonOk)
        {
            bledy += "- telefon (9 cyfr)\n";
        }

        if (Wycieczka.SelectedIndex == -1)
        {
            bledy += "- wycieczka\n";
        }

        if (!int.TryParse(Osoby.Text, out int osoby) || osoby < 1 || osoby > 10)
        {
            bledy += "- liczba osób (od 1 do 10)\n";
        }

        if (bledy != "")
        {
            MessageBox.Show("Uzupełnij poprawnie pola:\n" + bledy, "Błąd",
                            MessageBoxButton.OK, MessageBoxImage.Warning);
            return;
        }

        // 2. Obliczenie kosztu
        int i = Wycieczka.SelectedIndex;
        int cena = ceny[i];
        decimal koszt = ObliczKoszt(cena, osoby, Pociag.IsChecked == true, Ubezpieczenie.IsChecked == true);

        // 3. Wynik i zapis na liście
        string opis = $"{Osoba.Text.Trim()}, {miejsca[i]}, {osoby} os., koszt: {koszt:N2} zł";

        MessageBox.Show("Zgłoszenie przyjęte:\n" + opis, "Biuro podróży SZLAK",
                        MessageBoxButton.OK, MessageBoxImage.Information);
        Zgloszenia.Items.Add(opis);
    }

    /*********************************************************
     * nazwa funkcji:      ObliczKoszt
     * opis funkcji:       liczy łączny koszt wycieczki dla grupy; grupy
     *                     od 5 osób otrzymują 10% rabatu
     * parametry:          cena – cena podstawowa wycieczki za osobę (zł)
     *                     osoby – liczba uczestników (1–10)
     *                     pociag – true, gdy wybrano dojazd pociągiem (+60 zł/os.)
     *                     ubezpieczenie – true, gdy wybrano ubezpieczenie (+35 zł/os.)
     * zwracany typ i opis: decimal – koszt całkowity w złotych
     * autor:              00000000000
     *********************************************************/
    private decimal ObliczKoszt(int cena, int osoby, bool pociag, bool ubezpieczenie)
    {
        decimal zaOsobe = cena;

        if (pociag)
        {
            zaOsobe += 60;
        }
        if (ubezpieczenie)
        {
            zaOsobe += 35;
        }

        decimal razem = zaOsobe * osoby;

        if (osoby >= 5)
        {
            razem *= 0.9m;      // rabat 10%
        }

        return razem;
    }
}

Co dzieje się po kolei

  • Komentarz na początku pliku podaje nazwę aplikacji i autora — dobry zwyczaj, choć nie zawsze wymagany.
  • Tablice miejsca i ceny mają kolejność pozycji listy rozwijanej. Tu tablice wystarczą: dane są stałe i jest ich mało.
  • Przycisk opcji „autokar” ma IsChecked="True" w XAML — bez zdarzenia Checked nie grozi to błędem przy starcie.
  • Zapisz_Click ma trzy wyraźne części opisane komentarzami: walidacja, obliczenie, wynik. Każdy błąd dopisuje linię do bledy.
  • ObliczKoszt nie korzysta z kontrolek — wszystko dostaje w parametrach. Rabat to mnożenie przez 0.9m (litera m oznacza liczbę typu decimal).
  • Opis zgłoszenia jest budowany raz i użyty dwa razy: w komunikacie i na liście.
KRYTERIA

Kryteria oceny — sprawdź się

Egzaminator ocenia każdy punkt osobno, zwykle na podstawie zrzutów ekranu i kodu. Przejdź listę i zaznacz, co Twój program spełnia. Lista jest przykładowa — na egzaminie kryteria wynikają z treści konkretnego arkusza.

#Kryterium
1Tytuł okna zawiera numer zdającego; okno ma stały rozmiar i otwiera się na środku.
2Nagłówek: tekst, tło #1D4E89, biały, pogrubiony, 22 pt, na całą szerokość.
3Formularz: wszystkie etykiety i kontrolki w podanej kolejności; lista rozwijana ma 3 pozycje z cenami.
4Przycisk opcji „autokar” zaznaczony domyślnie; przyciski tworzą jedną grupę.
5Wybór wycieczki zmienia zdjęcie i napis z ceną.
6Zdjęcie wypełnia ramkę o wysokości 190 bez zniekształceń.
7Przy błędach pojawia się jedno okno komunikatu z listą wszystkich błędnych pól.
8Telefon: 9 cyfr, spacje dozwolone; liczba osób 1–10.
9Koszt liczony poprawnie, także z rabatem dla 5+ osób.
10Komunikat i wpis na liście w wymaganej postaci (kwota z dwoma miejscami po przecinku).
11Metoda ObliczKoszt z parametrami i zwracaną wartością, opisana komentarzem z pięcioma elementami.
12Zrzuty ekranu pod wymaganymi nazwami pokazują wymagane sytuacje.
CZĘSTE BŁĘDY

Gdzie giną punkty

SytuacjaSkutek
brak numeru zdającego w tytule okna lub w komentarzuUtrata punktu za „drobiazg”, który zajmuje 10 sekund.
tekst w oknie inny niż w treści (literówka, brak dwukropka)Kryterium „zgodnie z rysunkiem” niespełnione.
osobny MessageBox dla każdego błędu, gdy treść wymaga jednegoNiezgodność z wymaganiem.
obrazy podpięte ścieżką z pulpituNa komputerze egzaminatora zdjęć nie ma. Dołącz je do projektu.
obliczenia w Click zamiast w wymaganej metodzieBrak punktu za metodę i jej komentarz.
komentarz bez parametrów lub typu zwracanegoKomentarz niekompletny.
zrzut ekranu bez widocznego wyniku albo pod złą nazwąEgzaminator nie ma dowodu działania funkcji.
program nie kompiluje się na końcu, bo „poprawiałem w ostatniej minucie”Rób kopię działającej wersji przed większą zmianą.
ARKUSZE

Arkusze do ćwiczeń

Każdy arkusz rozwiązuj jak na egzaminie: nowy projekt, tytuł okna z numerem (użyj fikcyjnego, np. 00000000000), lista wymagań przed rozpoczęciem, na końcu sprawdzenie według kryteriów i zrzuty ekranu. Obrazy przygotuj sam. Proponowany czas podano przy każdym arkuszu. Wskazówkę otwórz dopiero wtedy, gdy utkniesz.

ARK 1Kalkulator malowania pokoju★☆☆

Czas: 45 min. Okno „Malowanie — wykonał: [numer]”, 480 × 420. Pola: długość, szerokość i wysokość pokoju w metrach (liczby z przecinkiem, 1–15), liczba okien (0–5), liczba warstw (przyciski opcji 1 / 2), farba (lista: biała 10 m²/l 45 zł za 2,5 l; kolorowa 8 m²/l 62 zł za 2,5 l). Przycisk „Oblicz”. Powierzchnia ścian = 2 × (długość + szerokość) × wysokość − 1,5 m² za każde okno; potrzebne litry = powierzchnia × warstwy / wydajność; puszki po 2,5 l zaokrąglone w górę. Wynik w napisie pod przyciskiem: powierzchnia, liczba puszek, koszt. Metodę LiczbaPuszek opisz komentarzem.

pokaż wskazówkę
  • Wydajność i cenę puszki trzymaj w tablicach w kolejności pozycji listy. Puszki: (int)Math.Ceiling(litry / 2.5).
ARK 2Zgłoszenie psa na wystawę★★☆

Czas: 60 min. Nagłówek „Wystawa psów rasowych — Lębork 2027” na zielonym tle. Formularz: imię psa, rasa (lista 4 ras — po wyborze obok pojawia się zdjęcie rasy), data urodzenia psa (tekst dd.mm.rrrr), klasa wystawowa wyliczana automatycznie z wieku i pokazywana w napisie (szczenięta 4–9 mies., młodzież 9–18 mies., otwarta powyżej 18 mies.; młodszy niż 4 miesiące — „pies za młody”), właściciel, telefon, pole wyboru „pies szczepiony przeciw wściekliźnie” (wymagane). Przycisk „Zgłoś” sprawdza dane i pokazuje numer startowy „2027/K-015” (kolejny numer, litera — pierwsza litera klasy).

pokaż wskazówkę
  • Wiek w miesiącach: różnica lat × 12 + różnica miesięcy, minus 1, jeśli dzień miesiąca jeszcze nie minął.
  • Klasę licz przy każdej zmianie daty — w TextChanged.
ARK 3Opłata parkingowa★★☆

Czas: 60 min. Strefa (przyciski opcji: A — 4 zł/h, B — 3 zł/h), czas postoju suwakiem od 30 minut do 8 godzin co 15 minut (napis obok: „2 h 15 min”), numer rejestracyjny (2–3 litery, spacja, 4–5 znaków), pole wyboru „karta mieszkańca” (−50%), pole wyboru „pojazd elektryczny” (bezpłatnie w strefie B). Pierwsze rozpoczęte pół godziny kosztuje tyle co cała godzina, później opłata za każdy rozpoczęty kwadrans. Koszt pokazywany na żywo, przycisk „Kup bilet” wyświetla bilet z godziną ważności („ważny do 14:35”). Metoda Oplata z komentarzem.

pokaż wskazówkę
  • Na suwaku przechowuj minuty (30–480, krok 15). Godzina ważności: DateTime.Now.AddMinutes(minuty).
ARK 4Konkurs fotograficzny★★☆

Czas: 60 min. Uczeń zgłasza zdjęcie: imię i nazwisko, klasa (lista), kategoria (przyciski opcji: przyroda, ludzie, architektura), tytuł zdjęcia (5–40 znaków, licznik obok), wybór jednego z czterech przykładowych zdjęć z folderu (lista rozwijana — podgląd obok), zgoda na publikację. Zgłoszenia trafiają do listy „Imię Nazwisko — „Tytuł” (kategoria)”. Jeden uczeń może zgłosić najwyżej 2 zdjęcia, a w każdej kategorii przyjmuje się najwyżej 5 zgłoszeń — pasek postępu pokazuje zapełnienie wybranej kategorii.

pokaż wskazówkę
  • Policz zgłoszenia ucznia i kategorii w pętli po elementach listy albo trzymaj liczniki w polach klasy.
ARK 5Bilety na koncert★★☆

Czas: 60 min. Sektor (lista: płyta 189 zł / 40 miejsc, trybuna A 149 zł / 30 miejsc, trybuna B 119 zł / 30 miejsc), liczba biletów normalnych i ulgowych (ulga 30%, najwyżej 6 biletów w zamówieniu), pole wyboru „parking” (+25 zł za zamówienie). Pod listą sektorów pasek „Wolne miejsca: 34 / 40” dla wybranego sektora. Zamówienie zmniejsza liczbę wolnych miejsc; gdy biletów brakuje, komunikat podaje, ile zostało. Przycisk „Kup” jest aktywny tylko przy poprawnych danych. Metoda CenaZamowienia z komentarzem.

pokaż wskazówkę
  • Wolne miejsca w tablicy int[3]; pasek: Maximum = liczba miejsc sektora, Value = wolne.
ARK 6Gabinet weterynaryjny — rejestracja wizyt★★★

Czas: 90 min. Pełny arkusz z klasą. Klasa Wizyta w osobnym pliku (właściciel, telefon, imię zwierzęcia, gatunek, data, godzina, cel wizyty, cena). Okno: nagłówek z logo gabinetu (obraz), formularz po lewej (gatunek — lista z ikoną gatunku obok, data jako tekst, godzina z listy co 30 minut 8:00–15:30, cel: przyciski opcji szczepienie 90 zł / kontrola 70 zł / zabieg 150 zł, pole wyboru „wizyta domowa” +60 zł), lista wizyt po prawej posortowana według daty i godziny, szczegóły zaznaczonej wizyty pod listą, przycisk „Odwołaj”. Ten sam termin nie może być zajęty dwa razy. Walidacja w stylu lekcji 22 (wszystkie błędy, czerwone pola). Metoda CenaWizyty z komentarzem. Zrzuty: pusta rejestracja z błędami, lista z trzema wizytami.

pokaż wskazówkę
  • Termin wizyty zapisz jako jedno pole DateTime (data + godzina) — porównywanie i sortowanie stanie się proste.
  • Sortowanie bez specjalnych metod: wstawiaj nową wizytę do listy w odpowiednim miejscu (pętla szukająca pierwszej późniejszej i Insert).
PODSUMOWANIE

Co trzeba zapamiętać

  • Przed pisaniem kodu zamień treść arkusza na listę wymagań do odhaczenia.
  • Kolejność: okno i obrazy → układ i kontrolki → zdarzenia → walidacja i obliczenia → komentarz → test i zrzuty.
  • Teksty, kolory, nazwy i format wyniku przepisuj dokładnie z treści.
  • Obliczenia w osobnej metodzie z parametrami i zwracaną wartością, opisanej komentarzem w wymaganym formacie.
  • Obrazy dołączaj do projektu, a zrzuty ekranu rób dla sytuacji wskazanych w treści.

Informacje o egzaminie: Centralna Komisja Egzaminacyjna — egzamin zawodowy.