Menu
Coddy logo textTech

Prosty walidator liczb

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 67 z 68.

challenge icon

Wyzwanie

Łatwy

Utwórz system walidacji liczb, który pokazuje, jak interfejsy definiują kontrakty zachowania, a własne błędy zapewniają zrozumiałe informacje zwrotne, gdy walidacja się nie powiedzie. To wyzwanie sprawdzi Twoją umiejętność tworzenia interfejsów, implementowania ich za pomocą własnych typów oraz odpowiedniego obsługiwania błędów walidacji.

Otrzymasz dwa dane wejściowe:

  • Ciąg znaków zawierający liczby do walidacji, oddzielone przecinkami (np. "45,150,25,200,75")
  • Ciąg znaków zawierający zakres walidacji w formacie "min:max" (np. "1:100")

Twoim zadaniem jest:

  1. Zdefiniować interfejs Validator z jedną metodą: Validate() error
  2. Utworzyć własny typ błędu o nazwie struktura ValidationError z dwoma polami: Value (int) i Message (string)
  3. Zaimplementować metodę Error() string dla ValidationError, która zwraca komunikat w formacie: "Validation failed: [message] (value: [value])"
  4. Utworzyć strukturę NumberValidator z trzema polami: Number (int), Min (int) i Max (int)
  5. Zaimplementować metodę Validate() error dla NumberValidator, która:
    • Zwraca nil, jeśli liczba mieści się w prawidłowym zakresie (włącznie z jego granicami)
    • Zwraca ValidationError z komunikatem "number below minimum range", jeśli liczba jest mniejsza od minimum
    • Zwraca ValidationError z komunikatem "number above maximum range", jeśli liczba jest większa od maksimum
  6. Przetworzyć pierwsze dane wejściowe, dzieląc je po przecinkach, aby uzyskać osobne ciągi znaków z liczbami
  7. Przetworzyć drugie dane wejściowe, dzieląc je po dwukropkach, aby wyodrębnić wartości minimalną i maksymalną
  8. Przekonwertować wszystkie wartości tekstowe na liczby całkowite za pomocą pakietu strconv
  9. Wyświetlić nagłówek walidacji: "=== NUMBER VALIDATION SYSTEM ==="
  10. Wyświetlić parametry walidacji: "Validating numbers in range [min] to [max]"
  11. Dla każdej liczby:
    • Utworzyć instancję NumberValidator z liczbą oraz wartościami zakresu
    • Wywołać metodę Validate() walidatora
    • Jeśli walidacja się powiedzie (błąd ma wartość nil), wyświetlić: "✓ [number] is valid"
    • Jeśli walidacja się nie powiedzie (błąd nie ma wartości nil), wyświetlić: "✗ [error_message]"
  12. Wyświetlić podsumowanie walidacji:
    • "=== VALIDATION SUMMARY ==="
    • "Total numbers checked: [total_count]"
    • "Valid numbers: [valid_count]"
    • "Invalid numbers: [invalid_count]"
  13. Wyświetlić komunikat o zakończeniu: "Number validation completed successfully"

Użyj pakietu strings do dzielenia ciągów wejściowych, pakietu strconv do konwertowania ciągów znaków na liczby całkowite oraz pakietu fmt do formatowania danych wyjściowych. To wyzwanie pokazuje, jak tworzyć elastyczne systemy walidacji z użyciem interfejsów, jednocześnie dostarczając szczegółowych informacji o błędach za pomocą własnych typów błędów.

Spróbuj swoich sił

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Wczytaj dane wejściowe
	var numbersInput string
	var rangeInput string
	fmt.Scanln(&numbersInput)
	fmt.Scanln(&rangeInput)
	
	// Przeanalizuj dane wejściowe
	numberStrings := strings.Split(numbersInput, ",")
	rangeParts := strings.Split(rangeInput, ":")
	
	// Przekonwertuj wartości zakresu na liczby całkowite
	min, _ := strconv.Atoi(rangeParts[0])
	max, _ := strconv.Atoi(rangeParts[1])
	
	// TODO: Napisz swój kod poniżej
	// 1. Zdefiniuj interfejs Validator
	// 2. Utwórz strukturę ValidationError i zaimplementuj metodę Error()
	// 3. Utwórz strukturę NumberValidator i zaimplementuj metodę Validate()
	// 4. Przetwórz każdą liczbę i sprawdź jej poprawność
	// 5. Wyświetl wyniki i podsumowanie
	
	// Wyświetl nagłówek walidacji
	fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
	fmt.Printf("Validating numbers in range %d to %d\n", min, max)
	
	// Przetwórz tutaj każdą liczbę
	
	// Wyświetl podsumowanie walidacji
	fmt.Println("=== VALIDATION SUMMARY ===")
	// Dodaj tutaj podsumowanie
	
	fmt.Println("Number validation completed successfully")
}

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online