Menu
CoddyTech

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

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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.Millisecond, כמו ב-time.Duration(duration) * time.Millisecond, כדי שהבדיקות יסתיימו במהירות; הפלט עדיין מציג שניות)
      • אחרי ההשהיה, להציג: "[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.Duration(duration) * time.Millisecond. טיימר אמיתי היה משתמש ב-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: כתבו את הקוד שלכם למטה
	// נתחו כל שלב כדי לחלץ את ההוראה ואת משך הזמן
	// זכרו לבדוק אם הפרוסה parts מכילה מספיק איברים לפני שניגשים אליהם
	// הציגו את כותרת המפגש ואת ההגדרות הראשוניות
	// עברו בלולאה על המחזורים והשלבים
	// השתמשו ב-time.Sleep להשהיות: time.Duration(duration) * time.Millisecond
	// הציגו הודעות סיום וסיכום
	
}
quiz iconבחנו את עצמכם

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

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

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