Menu
Coddy logo textTech

השהיה וטיקרים

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 64 מתוך 68.

לפעמים צריך לשלוט בתזמון הביצוע של התוכנית שלך. Go מספקת שתי פונקציות חיוניות בחבילה time למטרה זו: time.Sleep כדי להשהות את הביצוע ו-time.NewTicker כדי לבצע פעולות במרווחי זמן קבועים.

הפונקציה time.Sleep משהה את התוכנית שלך למשך זמן מוגדר. היא מקבלת time.Duration כפרמטר שלה וחוסמת את הביצוע עד שמשך הזמן הזה חולף:

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

עבור פעולות חוזרות במרווחי זמן קבועים, time.NewTicker יוצר טיקר ששולח ערכים בערוץ במרווחי זמן מוגדרים. זה שימושי למשימות שצריכות לפעול מעת לעת:

ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
    <-ticker.C // המתן לתקתק הבא
    fmt.Println("Tick", i+1)
}

פונקציות התזמון האלה חיוניות ליצירת השהיות, למימוש פסקי זמן ולתזמון פעולות חוזרות בתוכניות Go שלך.

challenge icon

אתגר

קל

צרו טיימר למפגש מדיטציה שמשתמש ב־time.Sleep כדי ליצור הפסקות בין הנחיות מודרכות ולהדגים את בקרת התזמון הבסיסית בתוכניות Go.

תקבלו שתי קלטים:

  • מחרוזת שמכילה שלבי מדיטציה בפורמט "step1:duration,step2:duration,step3:duration" (לדוגמה, "Breathe in:3,Hold:2,Breathe out:4")
  • מחרוזת שמכילה את מספר המחזורים לחזרה (לדוגמה, "5")

המשימה שלכם היא:

  1. נתחו את הקלט הראשון באמצעות פיצול לפי פסיקים כדי לקבל שלבי מדיטציה נפרדים
  2. עבור כל שלב, פצלו לפי נקודתיים כדי לחלץ את ההנחיה ואת משך הזמן (בשניות)
  3. המירו את מחרוזות משך הזמן למספרים שלמים באמצעות החבילה strconv
  4. המירו את הקלט השני למספר שלם כדי לקבל את מספר המחזורים
  5. הציגו את כותרת המפגש: "=== MEDITATION TIMER ==="
  6. הציגו את הגדרת המפגש: "Starting meditation session with [number_of_cycles] cycles"
  7. עבור כל מחזור (החל ממחזור 1):
    • הציגו: "--- Cycle [cycle_number] ---"
    • עבור כל שלב במדיטציה:
      • הציגו: "[instruction]..."
      • השתמשו ב־time.Sleep כדי להשהות למשך הזמן שצוין (המירו שניות ל־time.Duration באמצעות הכפלה ב־time.Second)
      • לאחר ההשהיה, הציגו: "[instruction] complete ([duration] seconds)"
    • לאחר השלמת כל השלבים במחזור, הציגו: "Cycle [cycle_number] finished"
  8. לאחר השלמת כל המחזורים, הציגו סיכום של המפגש:
    • "=== SESSION COMPLETE ==="
    • "Total cycles completed: [number_of_cycles]"
    • "Steps per cycle: [number_of_steps]"
    • "Total meditation time: [total_seconds] seconds" (סכום משכי הזמן של כל השלבים כפול מספר המחזורים)
  9. הציגו את הודעת הסיום: "Meditation session finished - well done!"

השתמשו בחבילה time לפעולות השהיה, בחבילה strings לפיצול מחרוזות הקלט, בחבילה strconv להמרת מחרוזות למספרים שלמים ובחבילה fmt להצגת הפלט. זכרו ש־time.Sleep מקבלת פרמטר מסוג time.Duration, ולכן צריך להכפיל את מספר השניות השלם שלכם ב־time.Second כדי ליצור ערך משך מתאים. האתגר הזה מדגים כיצד להשתמש ב־time.Sleep כדי ליצור השהיות מתוזמנות במהלך ביצוע התוכנית, עבור יישומים מעשיים כמו מדיטציה מודרכת או טיימרים לאימון גופני.

נסו בעצמכם

package main

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

func main() {
	// קראו את הקלט באמצעות bufio.Scanner כדי לטפל כראוי ברווחים
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	stepsInput := scanner.Text()
	
	scanner.Scan()
	cyclesInput := scanner.Text()
	
	// נתחו את שלבי המדיטציה ואת המחזורים
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: כתבו את הקוד שלכם למטה
	// נתחו כל שלב כדי לחלץ את ההוראה ואת משך הזמן
	// זכרו לבדוק שיש מספיק איברים ב-slice ‏parts לפני שניגשים אליהם
	// הציגו את כותרת המפגש ואת פרטי ההכנה
	// עברו בלולאה על המחזורים והשלבים
	// השתמשו ב-time.Sleep להשהיות (שקלו להשתמש באלפיות שנייה לצורך בדיקה)
	// הציגו הודעות סיום וסיכום
	
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Go אונליין