Menu
CoddyTech

Trình kiểm tra số đơn giản

Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 67 trên 68.

challenge icon

Thử thách

Dễ

Tạo một hệ thống kiểm tra số để minh họa cách các interface xác định hợp đồng hành vi, còn lỗi tùy chỉnh cung cấp phản hồi có ý nghĩa khi việc kiểm tra thất bại. Thử thách này sẽ kiểm tra khả năng tạo interface, triển khai chúng bằng các kiểu tùy chỉnh và xử lý lỗi kiểm tra phù hợp của bạn.

Bạn sẽ nhận được hai đầu vào:

  • Một chuỗi chứa các số cần kiểm tra, được phân tách bằng dấu phẩy (ví dụ: "45,150,25,200,75")
  • Một chuỗi chứa phạm vi kiểm tra theo định dạng "min:max" (ví dụ: "1:100")

Nhiệm vụ của bạn là:

  1. Định nghĩa một interface Validator với một phương thức duy nhất: Validate() error
  2. Tạo một kiểu lỗi tùy chỉnh có tên là struct ValidationError với hai trường: Value (int) và Message (string)
  3. Triển khai phương thức Error() string cho ValidationError, phương thức này trả về thông báo theo định dạng: "Validation failed: [message] (value: [value])"
  4. Tạo một struct NumberValidator với ba trường: Number (int), Min (int) và Max (int)
  5. Triển khai phương thức Validate() error cho NumberValidator>, phương thức này: <ul> <li>Trả về <code>nil nếu số nằm trong phạm vi hợp lệ, tính cả hai đầu mút
  6. Trả về một ValidationError với thông báo "number below minimum range" nếu số nhỏ hơn giá trị tối thiểu
  7. Trả về một ValidationError với thông báo "number above maximum range" nếu số lớn hơn giá trị tối đa
  8. Phân tích đầu vào thứ nhất bằng cách tách tại dấu phẩy để lấy từng chuỗi số
  9. Phân tích đầu vào thứ hai bằng cách tách tại dấu hai chấm để lấy giá trị tối thiểu và tối đa
  10. Chuyển tất cả giá trị chuỗi thành số nguyên bằng package strconv
  11. Hiển thị tiêu đề kiểm tra: "=== NUMBER VALIDATION SYSTEM ==="
  12. Hiển thị các tham số kiểm tra: "Validating numbers in range [min] to [max]"
  13. Với mỗi số:
    • Tạo một instance NumberValidator với số đó và các giá trị phạm vi
    • Gọi phương thức Validate() trên validator
    • Nếu kiểm tra thành công (lỗi là nil), hiển thị: "✓ [number] is valid"
    • Nếu kiểm tra thất bại (lỗi không phải là nil), hiển thị: "✗ [error_message]"
  14. Hiển thị phần tổng kết kiểm tra:
    • "=== VALIDATION SUMMARY ==="
    • "Total numbers checked: [total_count]"
    • "Valid numbers: [valid_count]"
    • "Invalid numbers: [invalid_count]"
  15. Hiển thị thông báo hoàn tất: "Number validation completed successfully"

Dùng package strings để tách chuỗi đầu vào, package strconv để chuyển chuỗi thành số nguyên và package fmt để in dữ liệu theo định dạng. Thử thách này minh họa cách tạo các hệ thống kiểm tra linh hoạt bằng interface, đồng thời cung cấp thông tin lỗi chi tiết thông qua các kiểu lỗi tùy chỉnh.

Tự làm thử

package main

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

func main() {
	// Đọc đầu vào
	var numbersInput string
	var rangeInput string
	fmt.Scanln(&numbersInput)
	fmt.Scanln(&rangeInput)
	
	// Phân tích các đầu vào
	numberStrings := strings.Split(numbersInput, ",")
	rangeParts := strings.Split(rangeInput, ":")
	
	// Chuyển các giá trị phạm vi thành số nguyên
	min, _ := strconv.Atoi(rangeParts[0])
	max, _ := strconv.Atoi(rangeParts[1])
	
	// TODO: Viết code của bạn bên dưới
	// 1. Định nghĩa interface Validator
	// 2. Tạo struct ValidationError và triển khai phương thức Error()
	// 3. Tạo struct NumberValidator và triển khai phương thức Validate()
	// 4. Xử lý và kiểm tra tính hợp lệ của từng số
	// 5. Hiển thị kết quả và phần tổng kết
	
	// Hiển thị tiêu đề kiểm tra tính hợp lệ
	fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
	fmt.Printf("Validating numbers in range %d to %d\n", min, max)
	
	// Xử lý từng số tại đây
	
	// Hiển thị phần tổng kết kiểm tra tính hợp lệ
	fmt.Println("=== VALIDATION SUMMARY ===")
	// Thêm đầu ra tổng kết vào đây
	
	fmt.Println("Number validation completed successfully")
}

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Go online