Zadanie 1000: Stoper z Analizą Danych (WinForms)

CHash
Priorytet: Normalny Szkic

Zadanie 1000: Stoper Mistrza (Windows Forms)

Wstęp

W tym zadaniu stworzysz w pełni funkcjonalny stoper jako aplikację okienkową (Windows Forms). To nie będzie jednak zwykły licznik. Twój program będzie zbierał dane o czasach okrążeń (np. dla sportowca), a następnie analizował je w czasie rzeczywistym, wyliczając średnią, minimum i maksimum.

[!IMPORTANT] Indywidualizacja: Wszelkie napisy w aplikacji (tytuł okna, etykiety przycisków, komunikaty) powinny być Twojego autorstwa. Nie używaj domyślnych "Button1" czy "Form1". Nadaj aplikacji unikalny charakter (np. "Stoper Wyścigowy", "Licznik Treningowy").

Wymagania Techniczne

  • Język: C# (Windows Forms App .NET Framework lub .NET Core/5+).
  • Komponenty: Timer (z System.Windows.Forms).
  • Struktury danych: Tablica lub Lista (List<double> lub List<TimeSpan>).

Przewodnik Implementacji (Krok po Kroku)

Faza 1: Interfejs Użytkownika (GUI)

  1. Stworzenie Projektu: Utwórz nowy projekt "Windows Forms App". Nazwij go sensownie.

  2. Ustawienia Formularza: Zmień tytuł okna (Text) na własną nazwę. Ustaw StartPosition na CenterScreen.

  3. Główny Wyświetlacz Czasu: Dodaj dużą etykietę (Label).

    • Zmień Name na lblCzas.
    • Ustaw dużą czcionkę (np. 48pt).
    • Ustaw tekst startowy na 00:00:00.
  4. Przyciski Sterujące: Dodaj 3 przyciski (Button):

    • Start/Stop: (btnStartStop) - do uruchamiania i zatrzymywania.
    • Okrążenie (Lap): (btnLap) - do zapisu międzyczasu.
    • Reset: (btnReset) - do zerowania wszystkiego.
  5. Lista Okrążeń: Dodaj ListBox (o nazwie lstOkrazenia) lub DataGridView. Tutaj będą pojawiać się czasy.

  6. Panel Statystyk: Dodaj GroupBox lub Panel. Wewnątrz umieść 5 etykiet (Label) do wyświetlania wyników:

    • Minimum
    • Maksimum
    • Średnia
    • Suma
    • Licznik okrążeń
  7. Komponent Timer: Przeciągnij z przybornika komponent Timer.

    • Zmień Name na zegarGlowy.
    • Ustaw Interval na 10 (co 10ms - setne sekundy) lub 100 (co 0.1s).

Faza 2: Logika Stopera

  1. Zmienne Globalne (w klasie Form): Zadeklaruj:

    • Zmienną przechowującą czas (np. DateTime startTime lub po prostu Stopwatch z System.Diagnostics - wybierz sposób pomiaru).
    • Zmienną logiczną bool isRunning do sprawdzania stanu.
    • Listę na czasy okrążeń: List<double> czasyOkrazen = new List<double>(); (lub List<TimeSpan>).
  2. Przycisk Start/Stop: W zdarzeniu Click:

    • Jeśli stoper stoi: Uruchom zegarGlowy.Start(). Zmień napis na przycisku na "STOP".
    • Jeśli stoper chodzi: Zatrzymaj zegarGlowy.Stop(). Zmień napis na "START".
  3. Obsługa Zegara (Tick): Kliknij dwukrotnie w komponent Timer (utworzy się zdarzenie Tick).

    • Oblicz aktualny czas trwania (np. DateTime.Now - startTime).
    • Zaktualizuj lblCzas.Text odpowiednim formatem.
    • Podpowiedź: TimeSpan.ToString(@"hh\:mm\:ss\.ff").

Faza 3: Pomiędzyczasy i Tablice

  1. Przycisk Okrążenie (Lap): To serce tego zadania. W zdarzeniu Click:

    • Pobierz aktualny czas ze stopera.
    • Dodaj go do listy czasyOkrazen.
    • Dodaj wpis do lstOkrazenia (np. "Okrążenie 1: 00:00:12.55").
  2. Aktualizacja Statystyk (Funkcja): Napisz osobną metodę PrzeliczStatystyki(). Wywołuj ją po każdym dodaniu okrążenia.

  3. Obliczanie Minimum: W metodzie PrzeliczStatystyki:

    • Użyj funkcji .Min() z LINQ na swojej liście czasów.
    • Wyświetl wynik w odpowiedniej etykiecie.
  4. Obliczanie Maksimum:

    • Użyj .Max(). Wyświetl.
  5. Obliczanie Średniej:

    • Użyj .Average(). Wyświetl.
  6. Obliczanie Sumy:

    • Użyj .Sum(). Wyświetl.
  7. Licznik:

    • Użyj .Count. Wyświetl.

Faza 4: Sprzątanie (Reset)

  1. Przycisk Reset: W zdarzeniu Click:
    • Zatrzymaj timer.
    • Wyzeruj zmienną czasu.
    • Ustaw lblCzas.Text na "00:00:00".
    • Wyczyść listę: czasyOkrazen.Clear().
    • Wyczyść widok listy: lstOkrazenia.Items.Clear().
    • Wyzeruj etykiety statystyk (wpisz tam "Brak danych" lub "-").

Faza 5: Ulepszenia i Testy

  1. Zabezpieczenia: Co się stanie, jak wciśniesz "Lap" gdy stoper nie chodzi? Zablokuj przycisk (Enabled = false) lub obsłuż to w kodzie.

  2. Testy Manualne: Uruchom program. Zrób 5 szybkich kliknięć "Lap". Sprawdź kalkulatorem, czy średnia się zgadza.

  3. Personalizacja Danych: Upewnij się, że nazwy w lstOkrazenia są czytelne i sformatowane według Twojego pomysłu (np. "Czas #1: ...").

  4. Formatowanie: Zadbaj, by liczby (średnia itd.) nie miały 10 miejsc po przecinku. Formatuj je ładnie.

Warunek Zaliczenia

Poprawne działanie aplikacji, poprawne obliczenia statystyczne i wykonanie commita po każdej większej fazie. Kod musi być Twoim dziełem.


Git - Wersjonowanie

  1. Konfiguracja:

    git config --global user.name "Twoje Imie"
    git config --global user.email "[email protected]"
    
  2. Inicjalizacja: W folderze z plikiem .sln (Solution):

    git init
    

    Ważne: W C# warto dodać plik .gitignore dla Visual Studio, aby nie wrzucać śmieci (folderów obj/bin).

  3. Commity: Wykonuj git commit po zakończeniu każdej Fazy z instrukcji.

    git add .
    git commit -m "Zadanie 1000: Faza 1 - GUI gotowe"