Menu
Coddy logo textTech

Итоги — Простой таймер

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

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

challenge icon

Задание

Легко

Создайте приложение обратного отсчета, которое использует time.NewTicker для отсчета времени от заданной продолжительности до нуля, отображая сообщения о прогрессе через регулярные интервалы. Эта задача проверит вашу способность комбинировать тикеры, циклы и вычисления продолжительности для создания функционального приложения для замера времени.

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

  • Строка, содержащая продолжительность обратного отсчета в формате "value:unit" (например, "10:Second" или "3:Minute")
  • Строка, содержащая интервал обновления в формате "value:unit" (например, "1:Second")

Ваша задача:

  1. Разобрать первый ввод, разделив его по двоеточию, чтобы извлечь значение и единицу измерения продолжительности обратного отсчета
  2. Разобрать второй ввод, разделив его по двоеточию, чтобы извлечь значение и единицу измерения интервала обновления
  3. Преобразовать строковые значения в целые числа с помощью пакета strconv
  4. Создать объекты time.Duration как для продолжительности обратного отсчета, так и для интервала обновления, используя соответствующие константы:
    • Для "Second": умножить на time.Second
    • Для "Minute": умножить на time.Minute
    • Для "Hour": умножить на time.Hour
  5. Вывести заголовок таймера: "=== COUNTDOWN TIMER ==="
  6. Вывести настройки таймера: "Starting countdown from [countdown_duration_object]"
  7. Вывести частоту обновления: "Updates every [update_interval_object]"
  8. Создать тикер с помощью time.NewTicker с длительностью интервала обновления
  9. Инициализировать переменную оставшегося времени значением продолжительности обратного отсчета
  10. Использовать цикл для обратного отсчета:
    • Ожидать каждого события тикера с помощью <-ticker.C
    • Вычитать интервал обновления из оставшегося времени
    • Если оставшееся время больше 0, вывести: "Time remaining: [remaining_time_object]"
    • Если оставшееся время 0 или меньше, вывести: "Time's up!" и выйти из цикла
  11. Остановить тикер с помощью ticker.Stop()
  12. Вывести статистику завершения:
    • "=== TIMER COMPLETE ==="
    • "Original duration: [countdown_duration_object]"
    • "Update interval: [update_interval_object]"
    • "Total updates displayed: [number_of_updates]" (рассчитайте, сколько раз было отображено оставшееся время)
  13. Вывести сообщение о завершении: "Countdown timer finished successfully"

Используйте пакет time для операций с тикером и продолжительностью, пакет strings для разделения входных строк, пакет strconv для преобразования строк в целые числа и пакет fmt для вывода. Помните, что time.NewTicker возвращает тикер, который отправляет значения в свой канал через регулярные интервалы, и вы должны вызвать ticker.Stop(), когда закончите, чтобы освободить ресурсы. Эта задача демонстрирует, как создать практичный таймер обратного отсчета, используя механизмы синхронизации Go.

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

package main

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

func main() {
	// Чтение входных данных
	var countdownInput string
	var intervalInput string
	fmt.Scanln(&countdownInput)
	fmt.Scanln(&intervalInput)
	
	// Разбор входных данных длительности обратного отсчета
	countdownParts := strings.Split(countdownInput, ":")
	countdownValue, _ := strconv.Atoi(countdownParts[0])
	countdownUnit := countdownParts[1]
	
	// Разбор входных данных интервала обновления
	intervalParts := strings.Split(intervalInput, ":")
	intervalValue, _ := strconv.Atoi(intervalParts[0])
	intervalUnit := intervalParts[1]
	
	// TODO: Напишите свой код ниже
	// Преобразование в объекты time.Duration с использованием операторов switch
	// Создание таймера обратного отсчета (имитация без реальных задержек для тестирования)
	// Реализация цикла обратного отсчета
	// Отображение всех необходимых сообщений и статистики
	// Примечание: Для целей тестирования имитируйте поведение тикера без реальных задержек во времени
	
}

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