Smart-World Surf

יחידה 2: בקרת זרימה ולולאות

שליטה על מהלך התוכנית באמצעות תנאים ולולאות.

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

מהי בקרת זרימה ומדוע היא חיונית?

בקרת זרימה (Flow Control) מתייחסת ליכולת של תוכנית לשנות את סדר הביצוע של הפקודות שלה בהתאם לתנאים מסוימים או לחזור על בלוקי קוד. ללא בקרת זרימה, תוכנית הייתה מבצעת את הפקודות שלה באופן ליניארי בלבד, מה שהיה מגביל מאוד את יכולותיה.

בקרת זרימה (Flow Control): מנגנונים בשפת תכנות המאפשרים לשלוט על סדר ביצוע הפקודות בתוכנית, על ידי קבלת החלטות (תנאים) או חזרה על פעולות (לולאות).

חשיבותה של בקרת הזרימה:

  • קבלת החלטות: מאפשרת לתוכנית להגיב לקלט משתמש, לנתונים חיצוניים או למצב פנימי.
  • חזרה על פעולות: מבצעת משימות חוזרות ונשנות ביעילות, ללא צורך בכתיבת קוד זהה פעמים רבות.
  • לוגיקה מורכבת: בונה אלגוריתמים מתוחכמים המטפלים במגוון רחב של תרחישים.

אבני הבניין של בקרת זרימה: תנאים ולולאות

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

תנאים (Conditional Statements)

תנאים מאפשרים לתוכנית לבצע בלוק קוד מסוים רק אם תנאי כלשהו מתקיים.

if

מבצע בלוק קוד אם התנאי שצוין נכון (True).

elif

קיצור של "else if". נבדק אם תנאי ה-if הקודם היה שקר, ואז בודק תנאי נוסף. ניתן להשתמש במספר רב של elif.

else

מבצע בלוק קוד אם אף אחד מהתנאים הקודמים (if או elif) לא היה נכון. else חייב לבוא לאחר if או elif.

אופרטורים לוגיים: and (וגם), or (או), not (לא). משמשים לשילוב או היפוך תנאים.
אופרטורי השוואה: == (שווה ל), != (שונה מ), < (קטן מ), > (גדול מ), <= (קטן או שווה ל), >= (גדול או שווה ל).

לולאות (Loops)

לולאות מאפשרות לבצע בלוק קוד שוב ושוב.

while

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

for

מבצעת איטרציה (מעבר) על פריטים בסדרה (כגון רשימה, מחרוזת, טווח מספרים). שימושית כאשר ידוע מראש על איזה אוסף רוצים לעבור.

range(): פונקציה מובנית בפייתון המשמשת ליצירת סדרה של מספרים, הנפוצה במיוחד בלולאות for.

פקודות שליטה בלולאות

פקודות אלו מאפשרות לשנות את ההתנהגות הרגילה של לולאה.

  • break: מסיים את הלולאה באופן מיידי וממשיך את ביצוע התוכנית לפקודה שאחרי הלולאה.
  • continue: מדלג על שאר הקוד בתוך האיטרציה הנוכחית של הלולאה וממשיך לאיטרציה הבאה.

תרחישים נפוצים ודוגמאות

הבנת המושגים התיאורטיים היא רק ההתחלה. במבחנים ובחיים האמיתיים, תצטרכו ליישם אותם.

  • לולאות מקוננות (Nested Loops): לולאה בתוך לולאה. נפוץ מאוד לעיבוד נתונים דו-ממדיים (כמו מטריצות), יצירת דפוסים או חיפוש צירופים. דורש מעקב קפדני אחר משתני הלולאה הפנימית והחיצונית.
  • חיפוש ברשימה: שימוש בלולאת for (או while) כדי לעבור על איברי רשימה ולמצוא פריט מסוים. ניתן להשתמש ב-break לאחר מציאת הפריט כדי לשפר יעילות.
  • ספירה וצבירה: שימוש בלולאות כדי לספור כמה פעמים תנאי מתקיים או לצבור סכום/מכפלה של ערכים.
  • אימות קלט משתמש: שימוש בלולאת while בשילוב עם תנאים כדי לבקש קלט מהמשתמש שוב ושוב עד לקבלת קלט תקין.

אתגרים וטעויות נפוצות

היכרות עם כשלים נפוצים תעזור לכם להימנע מהם.

  • לולאות אינסופיות: מתרחשות כאשר התנאי של לולאת while לעולם אינו הופך לשקר. גורם לתקיעת התוכנית.
  • שגיאות "אחד פחות/אחד יותר" (Off-by-one errors): נפוצות בלולאות for עם range() או בלולאות while שבהן תנאי העצירה מוגדר באופן שגוי (לדוגמה, שימוש ב-< במקום <=).
  • מורכבות קוד עם ריבוי קינון: יותר מדי לולאות או תנאים מקוננים יכולים להקשות על קריאות הקוד והבנתו.
  • בחירה בין while ל-for: יש לבחור את הלולאה המתאימה לבעיה. for עדיפה לאיטרציה על אוסף ידוע, while עדיפה כאשר מספר האיטרציות אינו ידוע מראש ותלוי בתנאי מסוים.
מעקב אחר ביצוע קוד (Code Tracing): זוהי אחת המיומנויות החשובות ביותר הנבחנות בקורס. תצטרכו להיות מסוגלים "לרוץ" על קטע קוד בראשכם או על דף, לעקוב אחר ערכי המשתנים בכל שלב, במיוחד כאשר יש לולאות מקוננות, תנאים מורכבים ושימוש ב-break או continue. טעות קטנה במעקב יכולה להוביל לתוצאה שגויה לחלוטין. תרגלו זאת רבות!

שאלות לדיון

  • הסבר מתי נעדיף להשתמש בלולאת while על פני לולאת for, ומתי ההפך. תן דוגמה לכל מקרה.
  • כיצד ניתן למנוע לולאה אינסופית? תאר שתי דרכים שונות והדגם באחת מהן.
  • כתוב קטע קוד בפייתון המדפיס את כל המספרים הזוגיים בין 1 ל-20 (כולל), אך עוצר את ההדפסה לחלוטין אם מגיע למספר הגדול מ-15.
  • מה ההבדל המהותי בין הפקודות break ו-continue בתוך לולאה? תאר את השפעת כל אחת מהן על זרימת התוכנית.

נקודות לתשובת מודל

  • לגבי בחירת לולאה:
    • for: כאשר מספר האיטרציות ידוע מראש או כאשר רוצים לעבור על כל האיברים באוסף (רשימה, מחרוזת, טווח). דוגמה: הדפסת איברי רשימה.
    • while: כאשר מספר האיטרציות אינו ידוע מראש ותלוי בתנאי שמשתנה במהלך הלולאה. דוגמה: קבלת קלט תקין מהמשתמש.
  • לגבי מניעת לולאה אינסופית:
    • ודא שמשתנה התנאי משתנה בתוך הלולאה באופן שיגרום לתנאי להפוך לשקר.
    • השתמש במונה שמתקדם ובתנאי עצירה מבוסס מונה.
    • השתמש ב-break בתוך הלולאה בתנאי מסוים.
    • דוגמה: count = 0; while count < 5: print(count); count += 1.
  • לגבי קטע הקוד:
    
    for num in range(1, 21):
        if num > 15:
            break
        if num % 2 == 0:
            print(num)
            
    • שימוש בלולאת for עם range(1, 21).
    • תנאי if num > 15: break לעצירה מוחלטת.
    • תנאי if num % 2 == 0: להדפסת זוגיים בלבד.
  • לגבי break ו-continue:
    • break: מסיים את הלולאה כולה באופן מיידי. התוכנית ממשיכה לפקודה הבאה אחרי הלולאה.
    • continue: מדלג על שאר הקוד באיטרציה הנוכחית של הלולאה וממשיך לאיטרציה הבאה (בודק שוב את תנאי הלולאה).
מצאתם טעות או שחסר משהו?
→ הקודמת
מבוא לתכנות ושפת Python
הבאה ←
פונקציות ומודולריות