Menu
CoddyTech

Uśpienia i tickery

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

Czasami musisz kontrolować czas wykonywania programu. Go udostępnia w pakiecie time dwie podstawowe funkcje: time.Sleep do wstrzymywania wykonywania oraz time.NewTicker do wykonywania czynności w regularnych odstępach czasu.

Funkcja time.Sleep wstrzymuje działanie programu na określony czas. Przyjmuje time.Duration jako parametr i blokuje wykonywanie programu, dopóki ten czas nie upłynie:

fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")

W przypadku powtarzających się czynności wykonywanych w regularnych odstępach czasu time.NewTicker tworzy ticker, który wysyła wartości przez kanał w określonych odstępach. Jest to przydatne w przypadku zadań, które muszą być wykonywane okresowo:

ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
    <-ticker.C // Poczekaj na następny takt
    fmt.Println("Tick", i+1)
}

Te funkcje odmierzające czas są niezbędne do tworzenia opóźnień, implementowania limitów czasu i planowania cyklicznych operacji w programach Go.

challenge icon

Wyzwanie

Łatwy

Utwórz timer sesji medytacyjnej, który używa time.Sleep do tworzenia przerw między instrukcjami z przewodnikiem i pokazuje podstawowe sterowanie czasem w programach Go.

Otrzymasz dwa wejścia:

  • Ciąg znaków zawierający kroki medytacji w formacie "step1:duration,step2:duration,step3:duration" (np. "Breathe in:3,Hold:2,Breathe out:4")
  • Ciąg znaków zawierający liczbę powtórzeń cyklu (np. "5")

Twoje zadanie:

  1. Przetwórz pierwsze wejście, dzieląc je po przecinkach, aby uzyskać poszczególne kroki medytacji
  2. Podziel każdy krok po dwukropkach, aby wyodrębnić instrukcję i czas trwania (w sekundach)
  3. Przekonwertuj ciągi znaków określające czas trwania na liczby całkowite za pomocą pakietu strconv
  4. Przekonwertuj drugie wejście na liczbę całkowitą, aby uzyskać liczbę cykli
  5. Wyświetl nagłówek sesji: "=== MEDITATION TIMER ==="
  6. Wyświetl konfigurację sesji: "Starting meditation session with [number_of_cycles] cycles"
  7. Dla każdego cyklu (zaczynając od cyklu 1):
    • Wyświetl: "--- Cycle [cycle_number] ---"
    • Dla każdego kroku medytacji:
      • Wyświetl: "[instruction]..."
      • Użyj time.Sleep, aby zrobić przerwę o określonym czasie trwania (pomnóż czas trwania przez time.Millisecond, tak jak w time.Duration(duration) * time.Millisecond, aby testy kończyły się szybko; wyjście nadal podaje czas w sekundach)
      • Po uśpieniu wyświetl: "[instruction] complete ([duration] seconds)"
    • Po wykonaniu wszystkich kroków w cyklu wyświetl: "Cycle [cycle_number] finished"
  8. Po zakończeniu wszystkich cykli wyświetl podsumowanie sesji:
    • "=== SESSION COMPLETE ==="
    • "Total cycles completed: [number_of_cycles]"
    • "Steps per cycle: [number_of_steps]"
    • "Total meditation time: [total_seconds] seconds" (suma czasów trwania wszystkich kroków pomnożona przez liczbę cykli)
  9. Wyświetl komunikat o zakończeniu: "Meditation session finished - well done!"

Użyj pakietu time do operacji uśpienia, pakietu strings do dzielenia ciągów wejściowych, pakietu strconv do konwertowania ciągów znaków na liczby całkowite, a pakietu fmt do wyświetlania danych. Pamiętaj, że time.Sleep przyjmuje parametr typu time.Duration, dlatego najpierw przekonwertuj liczbę całkowitą: time.Duration(duration) * time.Millisecond. Prawdziwy timer używałby time.Second, ale przerwy trwające pełne sekundy powodują przekroczenie limitu czasu testów. To wyzwanie pokazuje, jak używać time.Sleep do tworzenia czasowych przerw w wykonywaniu programu w praktycznych zastosowaniach, takich jak medytacja z przewodnikiem lub timery ćwiczeń.

Spróbuj swoich sił

package main

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

func main() {
	// Odczytaj dane wejściowe za pomocą bufio.Scanner, aby poprawnie obsłużyć spacje
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	stepsInput := scanner.Text()
	
	scanner.Scan()
	cyclesInput := scanner.Text()
	
	// Przetwórz etapy medytacji i cykle
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: Napisz swój kod poniżej
	// Przetwórz każdy etap, aby wyodrębnić instrukcję i czas trwania
	// Pamiętaj, aby przed odwołaniem się do elementów sprawdzić, czy wycinek parts zawiera ich wystarczająco dużo
	// Wyświetl nagłówek sesji i informacje o konfiguracji
	// Wykonaj pętlę po cyklach i etapach
	// Użyj time.Sleep do wprowadzania przerw: time.Duration(duration) * time.Millisecond
	// Wyświetl komunikaty o zakończeniu i podsumowanie
	
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online