Menu
Coddy logo textTech

Uśpienia i tickery

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

Czasami trzeba kontrolować czas wykonywania programu. Go udostępnia w pakiecie time dwie niezbędne funkcje: time.Sleep do wstrzymywania wykonywania oraz time.NewTicker do wykonywania działań 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 do upływu tego czasu:

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

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

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 prowadzonymi i demonstruje podstawową kontrolę czasu w programach Go.

Otrzymasz dwa wejścia:

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

Twoje zadanie:

  1. Przeanalizować pierwsze wejście, dzieląc je po przecinkach, aby uzyskać poszczególne kroki medytacji
  2. Dla każdego kroku podzielić go po dwukropkach, aby wyodrębnić instrukcję i czas trwania (w sekundach)
  3. Przekonwertować łańcuchy czasu trwania na liczby całkowite za pomocą pakietu strconv
  4. Przekonwertować drugie wejście na liczbę całkowitą, aby uzyskać liczbę cykli
  5. Wyświetlić nagłówek sesji: "=== MEDITATION TIMER ==="
  6. Wyświetlić konfigurację sesji: "Starting meditation session with [number_of_cycles] cycles"
  7. Dla każdego cyklu (zaczynając od cyklu 1):
    • Wyświetlić: "--- Cycle [cycle_number] ---"
    • Dla każdego kroku medytacji:
      • Wyświetlić: "[instruction]..."
      • Użyć time.Sleep, aby wstrzymać wykonanie na określony czas (przekonwertować sekundy na time.Duration, mnożąc przez time.Second)
      • Po uśpieniu wyświetlić: "[instruction] complete ([duration] seconds)"
    • Po wykonaniu wszystkich kroków w cyklu wyświetlić: "Cycle [cycle_number] finished"
  8. Po zakończeniu wszystkich cykli wyświetlić 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świetlić komunikat o ukończeniu: "Meditation session finished - well done!"

Użyj pakietu time do operacji uśpienia, pakietu strings do dzielenia łańcuchów wejściowych, pakietu strconv do konwertowania łańcuchów na liczby całkowite oraz pakietu fmt do wyświetlania danych. Pamiętaj, że time.Sleep przyjmuje parametr typu time.Duration, więc musisz pomnożyć liczbę sekund przez time.Second, aby utworzyć odpowiednią wartość czasu trwania. To wyzwanie pokazuje, jak używać time.Sleep do tworzenia czasowych przerw w wykonywaniu programu w praktycznych zastosowaniach, takich jak timery do medytacji prowadzonej lub ć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 wycinka parts sprawdzić, czy jest ich wystarczająco dużo
	// Wyświetl nagłówek sesji i informacje o konfiguracji
	// Przejdź w pętli przez cykle i etapy
	// Użyj time.Sleep do wprowadzania przerw (rozważ użycie milisekund podczas testowania)
	// 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