Menu
CoddyTech

Ôn tập: Bộ hẹn giờ đơ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 65 trên 68.

challenge icon

Thử thách

Dễ

Tạo một ứng dụng đếm ngược sử dụng time.NewTicker để đếm từ một khoảng thời gian đã chỉ định về 0, đồng thời hiển thị thông báo tiến độ theo các khoảng thời gian đều đặn. Thử thách này sẽ kiểm tra khả năng kết hợp ticker, vòng lặp và phép tính thời lượng để tạo một ứng dụng hẹn giờ hoạt động.

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

  • Một chuỗi chứa khoảng thời gian đếm ngược theo định dạng "value:unit" (ví dụ: "10:Second" hoặc "3:Minute")
  • Một chuỗi chứa khoảng thời gian cập nhật theo định dạng "value:unit" (ví dụ: "1:Second")

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

  1. Phân tích đầu vào thứ nhất bằng cách tách chuỗi tại dấu hai chấm để lấy giá trị và đơn vị của khoảng thời gian đếm ngược
  2. Phân tích đầu vào thứ hai bằng cách tách chuỗi tại dấu hai chấm để lấy giá trị và đơn vị của khoảng thời gian cập nhật
  3. Chuyển các giá trị chuỗi thành số nguyên bằng package strconv
  4. Tạo các đối tượng time.Duration cho cả khoảng thời gian đếm ngược và khoảng thời gian cập nhật bằng các hằng số phù hợp:
    • Với "Second": nhân với time.Second
    • Với "Minute": nhân với time.Minute
    • Với "Hour": nhân với time.Hour
  5. Hiển thị tiêu đề bộ hẹn giờ: "=== COUNTDOWN TIMER ==="
  6. Hiển thị phần thiết lập bộ hẹn giờ: "Starting countdown from [countdown_duration_object]"
  7. Hiển thị tần suất cập nhật: "Updates every [update_interval_object]"
  8. Tạo một ticker bằng time.NewTicker với khoảng thời gian cập nhật
  9. Khởi tạo một biến thời gian còn lại bằng khoảng thời gian đếm ngược
  10. Dùng vòng lặp để đếm ngược:
    • Chờ từng sự kiện ticker bằng <-ticker.C
    • Trừ khoảng thời gian cập nhật khỏi thời gian còn lại
    • Nếu thời gian còn lại lớn hơn 0, hiển thị: "Time remaining: [remaining_time_object]"
    • Nếu thời gian còn lại bằng 0 hoặc nhỏ hơn, hiển thị: "Time's up!" rồi thoát vòng lặp
  11. Dừng ticker bằng ticker.Stop()
  12. Hiển thị thống kê hoàn tất:
    • "=== TIMER COMPLETE ==="
    • "Original duration: [countdown_duration_object]"
    • "Update interval: [update_interval_object]"
    • "Total updates displayed: [number_of_updates]" (tính số lần thời gian còn lại được hiển thị)
  13. Hiển thị thông báo hoàn tất: "Countdown timer finished successfully"

Dùng package time cho các thao tác với ticker và thời lượng, package strings để tách chuỗi đầu vào, package strconv để chuyển chuỗi thành số nguyên và package fmt để xuất dữ liệu. Lưu ý rằng time.NewTicker trả về một ticker gửi giá trị qua kênh của nó theo các khoảng thời gian đều đặn. Khi hoàn tất, bạn cần gọi ticker.Stop() để giải phóng tài nguyên. Thử thách này hướng dẫn cách tạo một bộ hẹn giờ đếm ngược thực tế bằng các cơ chế định thời của Go.

Tự làm thử

package main

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

func main() {
	// Đọc đầu vào
	var countdownInput string
	var intervalInput string
	fmt.Scanln(&countdownInput)
	fmt.Scanln(&intervalInput)
	
	// Phân tích đầu vào về thời lượng đếm ngược
	countdownParts := strings.Split(countdownInput, ":")
	countdownValue, _ := strconv.Atoi(countdownParts[0])
	countdownUnit := countdownParts[1]
	
	// Phân tích đầu vào về khoảng thời gian cập nhật
	intervalParts := strings.Split(intervalInput, ":")
	intervalValue, _ := strconv.Atoi(intervalParts[0])
	intervalUnit := intervalParts[1]
	
	// TODO: Viết code bên dưới
	// Chuyển thành các đối tượng time.Duration bằng câu lệnh switch
	// Tạo bộ đếm thời gian đếm ngược (mô phỏng không có độ trễ thực tế để kiểm thử)
	// Triển khai vòng lặp đếm ngược
	// Hiển thị tất cả thông báo và số liệu thống kê cần thiết
	// Lưu ý: Để kiểm thử, mô phỏng hoạt động của ticker mà không gây ra độ trễ thực tế
	
}

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