Zadanie 1000: Stoper z Analizą Danych (WinForms)
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(zSystem.Windows.Forms). - Struktury danych: Tablica lub Lista (
List<double>lubList<TimeSpan>).
Przewodnik Implementacji (Krok po Kroku)
Faza 1: Interfejs Użytkownika (GUI)
-
Stworzenie Projektu: Utwórz nowy projekt "Windows Forms App". Nazwij go sensownie.
-
Ustawienia Formularza: Zmień tytuł okna (
Text) na własną nazwę. UstawStartPositionnaCenterScreen. -
Główny Wyświetlacz Czasu: Dodaj dużą etykietę (
Label).- Zmień
NamenalblCzas. - Ustaw dużą czcionkę (np. 48pt).
- Ustaw tekst startowy na
00:00:00.
- Zmień
-
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.
- Start/Stop: (
-
Lista Okrążeń: Dodaj
ListBox(o nazwielstOkrazenia) lubDataGridView. Tutaj będą pojawiać się czasy. -
Panel Statystyk: Dodaj
GroupBoxlub Panel. Wewnątrz umieść 5 etykiet (Label) do wyświetlania wyników:- Minimum
- Maksimum
- Średnia
- Suma
- Licznik okrążeń
-
Komponent Timer: Przeciągnij z przybornika komponent
Timer.- Zmień
NamenazegarGlowy. - Ustaw
Intervalna10(co 10ms - setne sekundy) lub100(co 0.1s).
- Zmień
Faza 2: Logika Stopera
-
Zmienne Globalne (w klasie Form): Zadeklaruj:
- Zmienną przechowującą czas (np.
DateTime startTimelub po prostuStopwatchzSystem.Diagnostics- wybierz sposób pomiaru). - Zmienną logiczną
bool isRunningdo sprawdzania stanu. - Listę na czasy okrążeń:
List<double> czasyOkrazen = new List<double>();(lubList<TimeSpan>).
- Zmienną przechowującą czas (np.
-
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".
- Jeśli stoper stoi: Uruchom
-
Obsługa Zegara (Tick): Kliknij dwukrotnie w komponent
Timer(utworzy się zdarzenieTick).- Oblicz aktualny czas trwania (np.
DateTime.Now - startTime). - Zaktualizuj
lblCzas.Textodpowiednim formatem. - Podpowiedź:
TimeSpan.ToString(@"hh\:mm\:ss\.ff").
- Oblicz aktualny czas trwania (np.
Faza 3: Pomiędzyczasy i Tablice
-
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").
-
Aktualizacja Statystyk (Funkcja): Napisz osobną metodę
PrzeliczStatystyki(). Wywołuj ją po każdym dodaniu okrążenia. -
Obliczanie Minimum: W metodzie
PrzeliczStatystyki:- Użyj funkcji
.Min()z LINQ na swojej liście czasów. - Wyświetl wynik w odpowiedniej etykiecie.
- Użyj funkcji
-
Obliczanie Maksimum:
- Użyj
.Max(). Wyświetl.
- Użyj
-
Obliczanie Średniej:
- Użyj
.Average(). Wyświetl.
- Użyj
-
Obliczanie Sumy:
- Użyj
.Sum(). Wyświetl.
- Użyj
-
Licznik:
- Użyj
.Count. Wyświetl.
- Użyj
Faza 4: Sprzątanie (Reset)
- Przycisk Reset:
W zdarzeniu
Click:- Zatrzymaj timer.
- Wyzeruj zmienną czasu.
- Ustaw
lblCzas.Textna "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
-
Zabezpieczenia: Co się stanie, jak wciśniesz "Lap" gdy stoper nie chodzi? Zablokuj przycisk (
Enabled = false) lub obsłuż to w kodzie. -
Testy Manualne: Uruchom program. Zrób 5 szybkich kliknięć "Lap". Sprawdź kalkulatorem, czy średnia się zgadza.
-
Personalizacja Danych: Upewnij się, że nazwy w
lstOkrazeniasą czytelne i sformatowane według Twojego pomysłu (np. "Czas #1: ..."). -
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
-
Konfiguracja:
git config --global user.name "Twoje Imie" git config --global user.email "[email protected]" -
Inicjalizacja: W folderze z plikiem
.sln(Solution):git initWażne: W C# warto dodać plik
.gitignoredla Visual Studio, aby nie wrzucać śmieci (folderów obj/bin). -
Commity: Wykonuj
git commitpo zakończeniu każdej Fazy z instrukcji.git add . git commit -m "Zadanie 1000: Faza 1 - GUI gotowe"