Menu
Coddy logo textTech

הצהרת `goto`

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

הפקודה goto ב-Go מאפשרת לך להעביר את השליטה ישירות לפקודה מסומנת בתווית בתוך אותה פונקציה. אף ש-Go כוללת את האפשרות הזאת, כמעט שלא משתמשים בה בתכנות מודרני ב-Go, משום שמעדיפים מבני בקרה ברורים יותר, כמו לולאות ופקודות if.

כדי להשתמש ב־goto, תחילה מגדירים תווית על ידי כתיבת מזהה ואחריו נקודתיים. לאחר מכן אפשר לקפוץ לתווית הזאת באמצעות goto ואחריו שם התווית.

func main() {
    i := 0
start:
    fmt.Println("Count:", i)
    i++
    if i < 3 {
        goto start
    }
    fmt.Println("Done!")
}

בדוגמה הזו, התוכנית חוזרת לתווית start עד שהתנאי מפסיק להתקיים. עם זאת, אותה לוגיקה תהיה ברורה הרבה יותר בשימוש בלולאת for. הפקודה goto עלולה להקשות על קריאת הקוד ועל תחזוקתו, ולכן בדרך כלל לא מומלץ להשתמש בה, ומעדיפים זרימת בקרה מובנית.

challenge icon

אתגר

קל

באתגר הזה תתרגלו שימוש במשפט goto כדי ליצור מנגנון פשוט לניסיונות חוזרים. אתם בונים מערכת חיבור שמנסה ליצור חיבור ומנסה שוב מספר מסוים של פעמים אם הניסיון נכשל.

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

  • מחרוזת שמייצגת את המספר המרבי של ניסיונות חוזרים (למשל, "3")
  • מחרוזת שמייצגת את מספר הניסיון שיצליח (למשל, "2")

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

  1. לנתח את המספר המרבי של הניסיונות החוזרים מהקלט הראשון
  2. לנתח את מספר הניסיון שיצליח מהקלט השני
  3. להשתמש במשפט goto עם תווית כדי לממש את לוגיקת הניסיונות החוזרים
  4. להתחיל ממספר ניסיון 1 ולהגדיל אותו אחרי כל ניסיון שנכשל
  5. עבור כל ניסיון שנכשל, להדפיס "Attempt [attempt_number] failed"
  6. כאשר מספר הניסיון תואם למספר הניסיון שיצליח, להדפיס "Attempt [attempt_number] succeeded" ולצאת
  7. אם עברתם את המספר המרבי של הניסיונות החוזרים בלי להצליח, להדפיס "All attempts failed" ולצאת

השתמשו במשפט goto כדי לקפוץ בחזרה לתווית הניסיונות החוזרים כאשר ניסיון נכשל ולא חרגתם ממספר הניסיונות המרבי. מספרי הניסיון צריכים להתחיל מ-1.

נסו בעצמכם

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // קרא את הקלט
    var maxRetriesStr string
    var successAttemptStr string
    fmt.Scanln(&maxRetriesStr)
    fmt.Scanln(&successAttemptStr)
    
    // המר את הקלטים למספרים שלמים
    maxRetries, _ := strconv.Atoi(maxRetriesStr)
    successAttempt, _ := strconv.Atoi(successAttemptStr)
    
    // אתחל את מונה הניסיונות
    attempt := 1
    
    // TODO: כתוב את הקוד שלך למטה
    // השתמש בפקודת goto עם תווית כדי לממש את לוגיקת הניסיונות החוזרים
    
}
quiz iconבחנו את עצמכם

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

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

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