Menu
CoddyTech

Простой проверщик чисел

Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 67 из 68.

challenge icon

Задание

Легко

Создайте систему проверки чисел, демонстрирующую, как интерфейсы задают контракты поведения, а пользовательские ошибки предоставляют содержательную обратную связь при неудачной проверке. В этом задании проверяются ваши умения создавать интерфейсы, реализовывать их с помощью пользовательских типов и правильно обрабатывать ошибки проверки.

Вы получите два входных значения:

  • Строку с числами для проверки, разделёнными запятыми (например, "45,150,25,200,75")
  • Строку с диапазоном проверки в формате "min:max" (например, "1:100")

Ваша задача:

  1. Определить интерфейс Validator с единственным методом: Validate() error
  2. Создать пользовательский тип ошибки — структуру ValidationError с двумя полями: Value (int) и Message (string)
  3. Реализовать метод Error() string для ValidationError, который возвращает сообщение в формате: "Validation failed: [message] (value: [value])"
  4. Создать структуру NumberValidator с тремя полями: Number (int), Min (int) и Max (int)
  5. Реализовать метод Validate() error для NumberValidator>, который: <ul> <li>Возвращает <code>nil, если число находится в допустимом диапазоне (включительно)
  6. Возвращает ValidationError с сообщением "number below minimum range", если число меньше минимального значения
  7. Возвращает ValidationError с сообщением "number above maximum range", если число больше максимального значения
  8. Разобрать первую строку, разделив её по запятым, чтобы получить отдельные строки с числами
  9. Разобрать вторую строку, разделив её по двоеточию, чтобы извлечь минимальное и максимальное значения
  10. Преобразовать все строковые значения в целые числа с помощью пакета strconv
  11. Вывести заголовок проверки: "=== NUMBER VALIDATION SYSTEM ==="
  12. Вывести параметры проверки: "Validating numbers in range [min] to [max]"
  13. Для каждого числа:
    • Создать экземпляр NumberValidator с числом и значениями диапазона
    • Вызвать метод Validate() у валидатора
    • Если проверка пройдена (ошибка равна nil), вывести: "✓ [number] is valid"
    • Если проверка не пройдена (ошибка не равна nil), вывести: "✗ [error_message]"
  14. Вывести сводку проверки:
    • "=== VALIDATION SUMMARY ==="
    • "Total numbers checked: [total_count]"
    • "Valid numbers: [valid_count]"
    • "Invalid numbers: [invalid_count]"
  15. Вывести сообщение о завершении: "Number validation completed successfully"

Используйте пакет strings для разделения входных строк, пакет strconv для преобразования строк в целые числа и пакет fmt для форматированного вывода. Это задание демонстрирует, как создавать гибкие системы проверки с помощью интерфейсов и при этом предоставлять подробную информацию об ошибках с помощью пользовательских типов ошибок.

Попробуйте сами

package main

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

func main() {
	// Считайте входные данные
	var numbersInput string
	var rangeInput string
	fmt.Scanln(&numbersInput)
	fmt.Scanln(&rangeInput)
	
	// Разберите входные данные
	numberStrings := strings.Split(numbersInput, ",")
	rangeParts := strings.Split(rangeInput, ":")
	
	// Преобразуйте значения границ диапазона в целые числа
	min, _ := strconv.Atoi(rangeParts[0])
	max, _ := strconv.Atoi(rangeParts[1])
	
	// TODO: Напишите свой код ниже
	// 1. Определите интерфейс Validator
	// 2. Создайте структуру ValidationError и реализуйте метод Error()
	// 3. Создайте структуру NumberValidator и реализуйте метод Validate()
	// 4. Обработайте каждое число и проверьте его
	// 5. Выведите результаты и сводку
	
	// Выведите заголовок проверки
	fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
	fmt.Printf("Validating numbers in range %d to %d\n", min, max)
	
	// Обработайте здесь каждое число
	
	// Выведите сводку проверки
	fmt.Println("=== VALIDATION SUMMARY ===")
	// Добавьте здесь вывод сводки
	
	fmt.Println("Number validation completed successfully")
}

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Go