לולאות עריכה

הפקודה repeat עריכה

"לולאה" היא מושג תיכנותי חשוב מאד. לולאה היא מבנה שבו המחשב מבצע סידרת הוראות מסויימת פעם אחר פעם, ללא שהמתכנת יצטרך לחזור ולכתוב אותן. מבנה קלאסי של לולאה הוא הפקודה repeat שהיכרנו כבר. פקודה זו מקבלת כקלט רשימה של פקודות וכן מספר. הפקודות יבוצעו פעם אחר פעם, כאשר מספר הפעמים הוא שווה למספר שניתן בקלט. בשפת בני אדם היינו אומרים "בצע את הפעולות הבאות (כאן תבוא רשימת פעולות מבוקשות)... וחזור על כך X פעמים (כאשר X הוא מספר הפעמים המבוקש).". בנוסף ל-repeat הבסיסית, קיים בלוגו מספר לא מבוטל של לולאות אחרות.

הפקודות while ו-until עריכה

  • הפקודה הראשונה שנכיר היא while. אופן הכתיבה שלה הוא כזה:

while [cond] [instruction]

(להבדיל מב-if ודומיו, בלולאות התנאי מופיע כרשימה - כתוב בין סוגריים מרובעים.)

רצף הפקודות שבין הסוגריים המרובעים (המיוצג למעלה על-ידי הביטוי instruction) יתבצע שוב ושוב. לפני כל ביצוע של הלולאה ישוערך התנאי (cond) מחדש, ולוגו תקבע את ערכו הבוליאני (ל-TRUE או ל-FALSE). במקרה שהתנאי נכון - ההוראות יבוצעו פעם נוספת. במקרה שהתנאי שיקרי, התכנית תמשיך הלאה ולא תבדוק את התנאי פעם נוספת. נסו את הדוגמה הבאה:

while [:size<10] [print :size make "size :size+1]

  • הפקודה until יוצרת לולאה דומה ללולאת ה-while, אך "הפוכה": רצף הפקודות שבסוגריים (instruction) יבוצע כל עוד התנאי הנבדק מחזיר תוצאה של "שקר" (FALSE). הלולאה תיפסק דווקא כאשר התנאי יחזיר אמת. נסו גם את הדוגמה הזו, והשוו אותה לדוגמה הקודמת:

until [:size<10] [print :size make "size :size+1]

הפקודות do.while ו-do.until עריכה

  • הפקודה do.while יוצרת לולאה במבנה הבא:

do.while [instruction] [cond]

כפי שתוכלו לראות, רצף ההוראות לביצוע מופיע לפני התנאי הנבדק, ולא אחריו. הסיבה לכך היא, שבלולאה כזו בדיקת התנאי נעשית אחרי ביצוע ההוראות ולא לפניו. בפעם הראשונה שהמחשב מגיע אל הלולאה, ההוראות יבוצעו תמיד, ללא בדיקה של התקיימות התנאי. רק במעברים הבאים הלולאה תתנהג כמו לולאת while רגילה.

do.while [print :size make "size :size+1] [:size<10]

  • do.until היא לולאה הזהה ל-do.while למעט העובדה שהיא ממשיכה להתבצע כל עוד התנאי שיקרי. נסו אותה בעצמכם!

הפקודה forever עריכה

  • forever היא לולאה אינסופית. ניתן לעצור אותה בעזרת תנאי עצירה בגוף הלולאה (בעזרת הפקודה stop), או בעזרת לחיצה על כפתור halt בזמן שהלולאה רצה. אופן הכתיבה שלה הוא:

forever [print :size make "size :size+1]

הפקודה for עריכה

  • הלולאה האחרונה בלוגו היא for. אופן הכתיבה שלה הוא כזה:


for [name val1 val2 val3] [instruction]

כאשר name הוא שמו של משתנה פנימי לשימוש הלולאה (אינדקס) (בלי נקודותיים לפניו), val1 הוא ערכו ההתחלתי של האינדקס, val2 הוא ערכו הסופי, ו-val3 הוא הכמות שבה יקודם האינדקס בכל איטרציה. אופן הפעולה של הלולאה הוא כזה: תחילה, ערכו של האינדקס נקבע לערך ההתחלתי (val1). דבר זה יתבצע פעם אחת, לפני האיטרציה הראשונה. בכל איטרציה יבדק אם ערכו של האינדקס גדול מהערך הסופי, val2 (אם val1 גדול מ-val2 יבדק אם ערכו של האינדקס קטן מ-val2) אם לא (כולל אם ערכו של האינדקס שווה לערך הסופי), יבוצע instruction, ואז ערכו של האינדקס יקודם ב-val3. אפשר גם לא לכתוב את val3, ואז האינדקס יקודם באחד (או במינוס אחד, אם הערך הסופי קטן מהערך ההתחלתי). אם הערכים val1, val2 ו-val3 הם כאלו שיגרמו ללולאה אינסופית (למשל, אם val1 גדול מ-val2, ו-val3 חיובי), הלולאה לא תבוצע כלל.


for [index 1 10 1] [print :index]

הערות לסיום עריכה

  • שימו לב להבדל בין ההוראות repeat ו-for, המאפשרות למתכנת לקבוע מראש כמה פעמים הוא רוצה שרצף פעולות מסויים יתבצע, לבין הפקודות until, while, do.while, do.until המאפשרות למתכנת לקבוע תנאי כלשהו, שיביא לסיום ביצוע הלולאה.
  • "לולאה אינסופית" היא מצב בו המחשב מבצע לולאה מסויימת פעם אחר פעם ואינו מפסיק לעולם. מצב כזה אינו יכול לקרות בלולאות מסוג repeat ו-for, אבל הוא בהחלט עלול להתרחש בלולאות מקבוצת until, while, do.while, do.until. כדי למנוע "לולאות אינסופיות" יש להקפיד על כך שבתוך רצף הפקודות שהמחשב נדרש לבצע יופיעו גם פקודות המסוגלות לגרום להתמלאות התנאי המאפשר יציאה מהלולאה.
  • לולאת forever יוצרת בכוונה מצב של לולאה אינסופית. לכאורה, זו פקודה שלעולם לא נרצה להשתמש בה, אך בפועל היא שימושית למדי. לולאת forever מנוצלת לא פעם כדי ליצור את המסגרת הראשית של משחק המתנהל בתורות. בתוך הלולאה מוסיף המתכנת אמצעי מיוחד לסיום המשחק במקרה שאחד הצדדים רוצה לפרוש.


הפרק הקודם:
תנאים
לולאות הפרק הבא:
מילים