יסודות התכנות בשפת Python · פרק 3 — ביצוע מותנה⌂📚🏠
פרק 3

ביצוע מותנה

20 שעות לימוד

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

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

3.1 הטיפוס הבוליאני (bool)

כל החלטה בתוכנית מתחילה בשאלה שתשובתה כן או לא: האם הדלת פתוחה? האם המתח גבוה מן הגבול? לתשובות מהסוג הזה יש טיפוס נתונים מיוחד.

ערך בוליאני: ערך שיש לו שני מצבים בלבד: True (אמת) ו-False (שקר). הטיפוס שלו בפייתון נקרא bool.
lamp_on = True
door_open = False
print(lamp_on)
print(door_open)
print(type(lamp_on))
פלט
True
False
<class 'bool'>

הערכים True ו-False אינם מחרוזות, ולכן לא מקיפים אותם במירכאות. והאות הראשונה בהם גדולה תמיד.

טעות נפוצה: כותבים true באות קטנה. פייתון אינה מכירה את המילה הזאת, ומתייחסת אליה כאל שם של משתנה שלא הוגדר:
lamp_on = true
פלט
NameError: name 'true' is not defined

3.2 אופרטורי השוואה

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

פקודהמה היא עושה
a == bשווה: מתקיים כששני הערכים שווים
a != bשונה: מתקיים כששני הערכים שונים
a > bגדול מ-
a < bקטן מ-
a >= bגדול או שווה
a <= bקטן או שווה
volts = 12
print(volts == 12)
print(volts != 12)
print(volts > 12)
print(volts < 15)
print(volts >= 12)
print(volts <= 9)
פלט
True
False
False
True
True
False
טעות נפוצה: סימן אחד = הוא השמה: הוא מציב ערך במשתנה. שני הסימנים == הם השוואה. אם כותבים השמה במקום השוואה בתוך תנאי, התוכנית נעצרת עוד לפני שהתחילה:
volts = 12
if volts = 12:
    print("ok")
פלט
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

ההשוואה מתחשבת גם בטיפוס: המספר 5 והמחרוזת "5" אינם אותו ערך, ואילו המספר השלם 5 והמספר העשרוני 5.0 שווים, כי ערכם המספרי זהה. לכן ממירים למספר את מה שנקרא בפקודה input לפני שמשווים אותו למספר.

print(5 == 5.0)
print(5 == "5")
print("Volt" == "volt")
פלט
True
False
False
דוגמה 3.1
נקרא מתח של סוללה מן המשתמש, ונדפיס אם הוא מספיק להפעלה. הגבול התחתון בדוגמה הזאת הוא 11.8 V.
פתרון:
volts = float(input("Battery voltage: "))
print("Can start:", volts >= 11.8)
פלט
Battery voltage: 12.1
Can start: True

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

שאלה 3.1: מה מדפיסה התוכנית הבאה?
a = 7
b = 2
print(a % b == 1)
print(a // b > 3)
print(a / b != 3.5)

3.3 בעייתיות ההשוואה בערכים עשרוניים

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

total = 0.1 + 0.2
print(total)
print(total == 0.3)
פלט
0.30000000000000004
False

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

הכלל: לא משווים שני מספרים עשרוניים באופרטורים == ו-!=. במקום זה בודקים אם ההפרש ביניהם קטן מסבילות שאנחנו בוחרים לפי הדיוק הנדרש, ומשתמשים בערך המוחלט abs מפני שלא ידוע מי מהם גדול יותר.
דוגמה 3.2
שני נגדים מחוברים בטור, 0.1 kΩ ו-0.2 kΩ. נבדוק אם סכומם שווה ל-0.3 kΩ בסבילות של 0.001 kΩ.
פתרון:
expected = 0.3
measured = 0.1 + 0.2
tolerance = 0.001
print(measured == expected)
print(abs(measured - expected) < tolerance)
פלט
False
True

השורה הראשונה בפלט מראה את הדרך השגויה, והשנייה את הדרך הנכונה.

שאלה 3.2: מה מדפיסה התוכנית הבאה? הסבירו את ההבדל בין שתי השורות.
x = 1.1 + 2.2
print(x == 3.3)
print(abs(x - 3.3) < 0.01)

3.4 אופרטורים בוליאניים וטבלאות האמת

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

פקודהמה היא עושה
a and bמתקיים רק כששני האגפים מתקיימים יחד
a or bמתקיים כשלפחות אגף אחד מתקיים
not aהופך את הערך: אמת הופכת לשקר ושקר לאמת

את תוצאות החישוב של האופרטורים מסכמים בטבלת אמת, אותה טבלה שאנחנו מכירים משערים לוגיים במערכות ספרתיות:

aba and ba or b
FalseFalseFalseFalse
FalseTrueFalseTrue
TrueFalseFalseTrue
TrueTrueTrueTrue
טבלת האמת של and ושל or
anot a
FalseTrue
TrueFalse
טבלת האמת של not
דוגמה 3.3
מנוע פועל כשהדלת סגורה והלחצן לחוץ. צופר אזעקה פועל כשהטמפרטורה גבוהה מ-80 מעלות או כשהלחץ גבוה מ-6 יחידות.
פתרון:
door_open = False
button = True
temp = 72
pressure = 6.5
motor = not door_open and button
alarm = temp > 80 or pressure > 6
print("Motor:", motor)
print("Alarm:", alarm)
פלט
Motor: True
Alarm: True
שאלה 3.3: מה מדפיסה התוכנית הבאה?
a = True
b = False
print(a and b)
print(a or b)
print(not b)
print(not a or b)

3.5 ביטויים בוליאניים וסדר הפעולות

ביטוי בוליאני יכול להיות פשוט, כמו x > 3, או מורכב מכמה תנאים. כשאין סוגריים, פייתון מחשבת את הביטוי לפי הסדר הבא, מלמעלה למטה:

הסדרהפעולות
1סוגריים ( )
2חשבון: ** ואז * / // % ואז + -
3השוואה: == != < > <= >=
4not
5and
6or
דוגמה 3.4
נחשב את ערך הביטוי הבא כאשר x = 5 ו-y = 12:
x > 3 and y < 10 or y == 12
פתרון:

קודם מחשבים את ההשוואות: x > 3 נותן True, ‏y < 10 נותן False, ו-y == 12 נותן True.

אחר כך and לפני or: מחשבים True and False ומקבלים False.

לבסוף False or True נותן True. נבדוק בהרצה:

x = 5
y = 12
print(x > 3 and y < 10 or y == 12)
print(x > 3 and (y < 10 or y == 12))
פלט
True
True

במקרה הזה הסוגריים בשורה השנייה נתנו אותה תוצאה, אבל הם מבהירים את הכוונה. כש-and ו-or מעורבבים, תמיד משתמשים בסוגריים.

כדי לבדוק שערך נמצא בתחום, פייתון מאפשרת לכתוב שתי השוואות ברצף, והן אומרות אותו דבר כמו תנאי עם and:

adc = 512
print(0 <= adc <= 1023)
print(adc >= 0 and adc <= 1023)
פלט
True
True
טעות נפוצה: רוצים לבדוק אם מצב המכשיר הוא 3 או 7, וכותבים mode == 3 or 7. פייתון קוראת את התנאי כך: האם המצב 3? ואם לא, הערך הוא 7. וכל מספר שאינו אפס נחשב אמת, ולכן התנאי מתנהג כאילו הוא מתקיים תמיד. צריך לכתוב השוואה מלאה בשני האגפים:
mode = 5
print(mode == 3 or 7)
print(mode == 3 or mode == 7)
פלט
7
False

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

r = 0
print(r != 0 and 12 / r > 1)
פלט
False
שאלה 3.4: מה מדפיסה התוכנית הבאה?
a = 4
b = 9
print(a > 5 or b > 5 and a != 4)
print((a > 5 or b > 5) and a != 4)
print(not a > 5 and b > 5)

3.6 ביצוע מותנה: if

הפקודה if מבצעת קבוצת פקודות רק כשתנאי מתקיים. כותבים אותה כך:

if condition:
    statement
    statement
next_statement
התנאיגוף התנאיהפקודה הבאהTrueFalse
תרשים הזרימה של if: אם התנאי אינו מתקיים מדלגים על כל הגוף
דוגמה 3.5
נקרא טמפרטורה של מנוע. אם היא גבוהה מ-40 מעלות נדפיס אזהרה. בכל מקרה נדפיס שהבדיקה הסתיימה.
פתרון:
temp = int(input("Temperature: "))
if temp > 40:
    print("Too hot!")
    print("Turn the fan on")
print("Check finished")
פלט
Temperature: 47
Too hot!
Turn the fan on
Check finished

עבור הקלט 30 התנאי אינו מתקיים, ולכן מודפסת רק השורה האחרונה: Check finished

שורה אחת שמזיחים או לא מזיחים משנה את משמעות התוכנית. בתוכנית הבאה הטמפרטורה נמוכה, ובכל זאת השורה האחרונה מודפסת, כי היא מחוץ לגוף התנאי:

temp = 30
if temp > 40:
    print("Too hot!")
print("Turn the fan on")
פלט
Turn the fan on

ואם שוכחים את ההזחה לגמרי, התוכנית אינה מתחילה כלל:

temp = 47
if temp > 40:
print("Too hot!")
פלט
IndentationError: expected an indented block after 'if' statement on line 2

טבלת מעקב:

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

מעקב אחר התוכנית עבור הקלט 47
פקודהtemptemp > 40פלט
temp = int(input("Temperature: "))47Temperature: 47
if temp > 40:True
print("Too hot!")Too hot!
print("Turn the fan on")Turn the fan on
print("Check finished")Check finished
שאלה 3.5: מה מדפיסה התוכנית הבאה? בנו טבלת מעקב ובדקו.
a = 3
b = 8
if b > a:
    a = a + b
    b = 0
if a > 10:
    b = 1
print(a, b)

3.7 ביצוע מותנה: if..else

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

התנאיגוף ifגוף elseהפקודה הבאהTrueFalse
תרשים הזרימה של if..else: שני מסלולים, ורק אחד מהם מתבצע
דוגמה 3.6
נורה מופעלת בלחצן אחד: הלחיצה הראשונה מדליקה והשנייה מכבה. נקרא את מספר הלחיצות ונדפיס את מצב הנורה. הנורה דולקת כששארית חלוקת מספר הלחיצות ב-2 היא אחד.
פתרון:
presses = int(input("Button presses: "))
if presses % 2 == 1:
    print("Lamp ON")
else:
    print("Lamp OFF")
print("done")
פלט
Button presses: 14
Lamp OFF
done
מעקב אחר התוכנית עבור הקלט 7
פקודהpressespresses % 2 == 1פלט
presses = int(input("Button presses: "))7Button presses: 7
if presses % 2 == 1:True
print("Lamp ON")Lamp ON
print("done")done
דוגמה 3.7
עומס מוזן משני מקורות: לוח סולארי וסוללה. נקרא את המתח של כל אחד מהם ונבחר בבעל המתח הגבוה יותר. נשמור את השם במשתנה, ונדפיס אותו פעם אחת אחרי סוף המבנה.
פתרון:
solar = float(input("Solar panel V: "))
battery = float(input("Battery V: "))
if solar > battery:
    source = "solar"
else:
    source = "battery"
print("Load runs from:", source)
פלט
Solar panel V: 11.2
Battery V: 12.4
Load runs from: battery

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

שאלה 3.6: מה מדפיסה התוכנית הבאה:
(א) עבור הקלט 12.
(ב) עבור הקלט 7.
x = int(input("x: "))
if x % 3 == 0:
    x = x // 3
else:
    x = x + 1
print(x)

3.8 שרשרת תנאים: elif

כשיש יותר משני מקרים מוסיפים elif, שהוא קיצור של "אחרת, אם". התנאים נבדקים מלמעלה למטה, ובתנאי הראשון שמתקיים מתבצע הגוף שלו ומדלגים על שאר השרשרת. החלק else בסוף הוא רשות, והוא מתבצע אם אף תנאי לא התקיים.

התנאי הראשוןגוף 1TrueFalseהתנאי השניגוף 2TrueFalseהתנאי השלישיגוף 3TrueFalse
תרשים הזרימה של שרשרת elif: מתבצע לכל היותר גוף אחד
דוגמה 3.8
נסווג מצב של סוללה לפי המתח שלה. הגבולות בדוגמה הם ערכים טיפוסיים שבחרנו לתרגול: 12.6 V ומעלה מלאה, 12 V ומעלה טעונה חלקית, 11.8 V ומעלה נמוכה, ומתחת לזה ריקה.
פתרון:
volts = float(input("Battery voltage: "))
if volts >= 12.6:
    print("Full")
elif volts >= 12.0:
    print("Partly charged")
elif volts >= 11.8:
    print("Low")
else:
    print("Empty")
פלט
Battery voltage: 12.2
Partly charged
מעקב אחר התוכנית עבור הקלט 12.2
פקודהvoltsvolts >= 12.6volts >= 12.0פלט
volts = float(input("Battery voltage: "))12.2Battery voltage: 12.2
if volts >= 12.6:False
elif volts >= 12.0:True
print("Partly charged")Partly charged

התנאי השלישי לא נבדק, ולכן אין לו עמודה בטבלה. מספיק לכתוב volts >= 12.0 בלי volts < 12.6, כי מגיעים לשורה הזאת רק אם המתח נמוך מ-12.6 V.

טעות נפוצה: סדר התנאים חשוב. אם כותבים את התנאי הרחב ראשון, לא מגיעים לעולם אל הצר. בתוכנית הבאה סוללה מלאה מתוארת כנמוכה:
volts = 13.0
if volts >= 11.8:
    print("Low")
elif volts >= 12.6:
    print("Full")
פלט
Low

וזה אינו כמו סדרה של פקודות if נפרדות: בפקודות נפרדות כל תנאי נבדק בלי קשר למה שקרה לפניו, ולכן יכול להתבצע יותר מגוף אחד:

temp = 95
if temp >= 90:
    print("Shutdown")
if temp >= 70:
    print("Alarm")
if temp >= 50:
    print("Fan on")
פלט
Shutdown
Alarm
Fan on
▶ניסוי חי — מעבדת הביצוע המותנהמריצים שרשרת elif צעד אחר צעד, משנים ערכים בעורך, ורואים איזה ענף נבחר ולמה. במעבדה אין קלט מן המשתמש, ולכן כותבים את הערך ישירות במשתנה במקום input.
⚠
המעבדה אינה זמינה כרגע. החומר בפרק שלם גם בלעדיה: ממשיכים לקרוא, וחוזרים לניסוי מאוחר יותר או פותחים אותו ישירות מן הקישור שמתחת למסגרת.
https://fahed-lab.com/electronics/python_basics#cond
פותחים את המעבדה בדף נפרד ↗ fahed-lab.com/electronics/python_basics#cond
שאלה 3.7: מה מדפיסה התוכנית הבאה:
(א) עבור הקלט 75.
(ב) עבור הקלט 10.
(ג) עבור הקלט 101.
n = int(input("n: "))
if n > 100:
    print("A")
elif n > 50:
    print("B")
elif n > 10:
    print("C")
else:
    print("D")

3.9 תנאי בתוך תנאי

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

דוגמה 3.9
נחשב נגד הגנה לנורית LED. ניקח ערכים טיפוסיים: מפל מתח של 2 V וזרם של 0.02 A. אם מתח המקור אינו גבוה מ-2 V הנורית אינה נדלקת. ואם ההתנגדות יוצאת קטנה מ-220 Ω, נשתמש ב-220 Ω, שהוא הנגד הקטן ביותר במחסן שלנו בדוגמה הזאת.
פתרון:
R = VS − VF I
supply = float(input("Supply voltage: "))
if supply > 2:
    resistor = (supply - 2) / 0.02
    if resistor >= 220:
        print("Use", resistor, "ohm")
    else:
        print("Use 220 ohm")
else:
    print("Supply too low")
פלט
Supply voltage: 12
Use 500.0 ohm
מעקב אחר התוכנית עבור הקלט 5
פקודהsupplyresistorsupply > 2resistor >= 220פלט
supply = float(input("Supply voltage: "))5.0Supply voltage: 5
if supply > 2:True
resistor = (supply - 2) / 0.02150.0
if resistor >= 220:False
print("Use 220 ohm")Use 220 ohm

עבור הקלט 1.5 מתקבל המסלול השלישי: Supply too low

תנאי שבא מיד אחרי תנאי, בלי שום חישוב ביניהם, אפשר לכתוב בעזרת and, והתוכנית מתקצרת:

if temp > 40:
    if fan_ok:
        print("Fan on")
תנאי בתוך תנאי
if temp > 40 and fan_ok:
    print("Fan on")
אותו תנאי בעזרת and

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

שאלה 3.8: מה מדפיסה התוכנית הבאה:
(א) כאשר a=−1 ו-b=4.
(ב) כאשר a=2 ו-b=0.
a = int(input("a: "))
b = int(input("b: "))
if a > 0:
    if b > 0:
        print("both")
    else:
        print("first")
else:
    if b > 0:
        print("second")
    else:
        print("none")

3.10 תקינות קלט ומסננת קלט פשוטה

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

דוגמה 3.10
נקרא קריאה מממיר תקבילי-ספרתי (ADC) בן עשר סיביות, ונדפיס באיזה חצי של התחום היא נמצאת. קריאה תקינה היא בין 0 ל-1023, וכל ערך אחר מעיד על תקלה בחיישן.
פתרון:
adc = int(input("ADC reading: "))
if 0 <= adc <= 1023:
    if adc >= 512:
        print("Upper half")
    else:
        print("Lower half")
else:
    print("Sensor fault")
פלט
ADC reading: 1200
Sensor fault

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

v = 12.0
r = float(input("R: "))
print("I =", v / r)
פלט
R: 0
ZeroDivisionError: division by zero

נכניס את החישוב לתוך תנאי, וכך התוכנית מגיעה לחלוקה רק עם ערך תקין:

v = 12.0
r = float(input("R: "))
if r > 0:
    print("I =", v / r)
else:
    print("R must be positive")
פלט
R: 0
R must be positive
הערה: הפקודה int(input()) נכשלת גם אם המשתמש מקליד אותיות במקום מספר. הטיפול בזה דורש כלים שנלמד בהמשך, בפרק הרשות על חריגים.

3.11 משפט בחירה (switch-case): match

כשמשווים משתנה אחד לרשימה של ערכים קבועים, כמו בתפריט, אפשר לכתוב במקום שרשרת elif את הפקודה match. תכנית הלימודים קוראת לה משפט switch-case, כמו בשפות אחרות, והיא קיימת בפייתון מאז גרסה 3.10.

דוגמה 3.11
תפריט פקודות של לוח בקרה: 1 להפעלת המנוע, 2 לעצירתו, 3 או 4 להצגת המצב. כל מספר אחר אינו מוכר.
פתרון:
choice = int(input("Choice: "))
match choice:
    case 1:
        print("Start motor")
    case 2:
        print("Stop motor")
    case 3 | 4:
        print("Show status")
    case _:
        print("Unknown choice")
פלט
Choice: 4
Show status

אחרי case כותבים את הערך, הסימן | פירושו "או", והסימן _ פירושו "כל ערך אחר", והוא ממלא את תפקיד else. במקרה המתאים הראשון מתבצע הגוף שלו והמבנה מסתיים.

שימו לב: הפקודה match משווה את המשתנה לערכים קבועים. תחום כמו "גדול מ-40" כותבים בשרשרת של if ו-elif. הפקודה match אינה רצה במעבדה החיה שבאתר, אלא בפייתון עצמה במחשב או בסביבה כמו Google Colab.
פרויקט הספר: תחנת המדידה · שלב 3 — התחנה מחליטה

בפרויקט של הספר נבנה צעד אחר צעד תחנת מדידה שפועלת על סוללה ולוח סולארי: חיישנים, עומס ומאוורר. בפרק הקודם התחנה המירה את הקריאות שלה למתח ולטמפרטורה. עכשיו היא מחליטה: מנתקת את העומס אם הסוללה יורדת מתחת ל-11.8 V, ומפעילה את המאוורר אם הטמפרטורה עולה על 40 מעלות והעומס פועל.

battery = float(input("Battery V: "))
temp = float(input("Temperature: "))
if battery < 11.8:
    load = False
else:
    load = True
if temp > 40 and load:
    fan = "ON"
else:
    fan = "OFF"
print("Load on:", load)
print("Fan:", fan)
פלט
Battery V: 12.4
Temperature: 46
Load on: True
Fan: ON

נסו בעצמכם: מה משתנה כשמתח הסוללה הוא 11.5 V? ולמה גם המאוורר נעצר?

עיקרי הפרק:

סיכום פקודות הפרק:

פקודהמה היא עושה
if condition:מבצע את הגוף רק אם התנאי מתקיים
else:מבצע את הגוף אם התנאי אינו מתקיים
elif condition:תנאי נוסף, שנבדק אם מה שלפניו לא התקיים
match x: case 1: case _:בחירה לפי ערך של משתנה אחד
== != > < >= <=אופרטורי השוואה
and or notאופרטורים בוליאניים
abs(a - b) < toleranceהשוואת מספרים עשרוניים בסבילות

מילון מונחים:

עבריתEnglishערבית
ערך בוליאניBoolean valueالقيمة البوليانية
אופרטור השוואהComparison operatorمعامل مقارنة
אופרטור בוליאניBoolean operatorمعامل بولياني
טבלת אמתTruth tableجدول الصواب
ביטוי בוליאניBoolean expressionتعبير بولياني
תנאיConditionالشرط
ביצוע מותנהConditional executionالتنفيذ الشرطي
גוף התנאיBody of the conditionجسم الشرط
הזחהIndentationالإزاحة
תנאי בתוך תנאי (קינון)Nested conditionشرط داخل شرط
טבלת מעקבTrace tableجدول المتابعة
קלט · פלטInput · Outputالمُدخَل · المُخرَج
מסננת קלטInput filterمصفاة المُدخَلات
סבילותToleranceالسماح
התשובות הסופיות לשאלות הפרק
3.1 True , False , False
3.2 False , True — הסכום אינו שווה בדיוק ל-3.3, אבל ההפרש ביניהם קטן מן הסבילות.
3.3 False , True , True , False
3.4 False , False , True
3.5 11 1
3.6 (א) 4 , (ב) 8
3.7 (א) B , (ב) D , (ג) A
3.8 (א) second , (ב) first

שאלות לתרגול:

רמה ראשונה — בסיסי
1.
מה מדפיסה התוכנית?
a = 6
b = 15
print(a > 5 and b < 10)
print(a > 5 or b < 10)
print(not (a == 6))
print(b % a == 3)
תשובות: False , True , False , True
2.
כתבו תנאי בפייתון לכל מקרה:
(א) המספר x בין 10 ל-20, כולל הקצוות.
(ב) המספר x הוא כפולה של 7.
(ג) המשתנים a ו-b שונים ושניהם חיוביים.
תשובות: (א) 10 <= x <= 20 , (ב) x % 7 == 0 , (ג) a != b and a > 0 and b > 0
3.
מה מדפיסה התוכנית:
(א) עבור הקלט 3.
(ב) עבור הקלט 8.
(ג) עבור הקלט 12.
x = int(input("x: "))
y = 1
if x > 5:
    y = y + x
if x > 10:
    y = y * 2
else:
    y = y - 1
print(y)
תשובות: (א) 0 , (ב) 8 , (ג) 26
4.
מצאו שלוש טעויות בתוכנית הזאת ותקנו אותן:
t = 30
if t = 30
print("ok")
תשובות: אחרי if צריכה לבוא ההשוואה ==, אחרי התנאי באות נקודתיים, והפקודה print צריכה להיות מוזחת:
t = 30
if t == 30:
    print("ok")
5.
כתבו תוכנית שקוראת מתח, ומדפיסה Safe אם הוא חיובי ואינו עולה על 5 V, ואחרת מדפיסה Unsafe.
תשובות:
v = float(input("V: "))
if 0 < v <= 5:
    print("Safe")
else:
    print("Unsafe")
רמה שנייה — בינוני
6.
כתבו תוכנית שקוראת טמפרטורה ומדפיסה: Freezing מתחת ל-0 מעלות, Cold מתחת ל-15, Warm מתחת ל-30, ואחרת Hot.
תשובות:
t = float(input("Temperature: "))
if t < 0:
    print("Freezing")
elif t < 15:
    print("Cold")
elif t < 30:
    print("Warm")
else:
    print("Hot")
עבור הקלט 15 היא מדפיסה: Warm
7.
כתבו תוכנית שקוראת את הערך הנקוב של נגד ואת ערכו הנמדד. הנגד תקין אם ההפרש הוא עד 5% לשני הכיוונים. התוכנית מדפיסה Good resistor לנגד תקין ו-Reject לנגד שאינו תקין.
תשובות:
nominal = float(input("Nominal: "))
measured = float(input("Measured: "))
low = nominal * 0.95
high = nominal * 1.05
if low <= measured <= high:
    print("Good resistor")
else:
    print("Reject")
עבור הערכים 470 ו-500 היא מדפיסה: Reject
8.
כתבו תוכנית שקוראת את הזרם בשלושה קווים L1, L2 ו-L3, ומדפיסה את שם הקו שזרמו הגבוה ביותר ואת ערכו, בלי להשתמש בפקודה max.
תשובות:
l1 = float(input("L1: "))
l2 = float(input("L2: "))
l3 = float(input("L3: "))
top = l1
name = "L1"
if l2 > top:
    top = l2
    name = "L2"
if l3 > top:
    top = l3
    name = "L3"
print("Highest:", name, top)
עבור הזרמים 4.5, 9, 2 היא מדפיסה: Highest: L2 9.0
9.
בנו טבלת מעקב לתוכנית הבאה כאשר a=3 ו-b=11.
a = int(input("a: "))
b = int(input("b: "))
if a > b:
    a = a - b
elif a == b:
    a = 0
else:
    b = b - a
    if b > 3:
        b = b // 2
print(a, b)
תשובות:
פקודהaba > ba == bb > 3פלט
a = int(input("a: "))3a: 3
b = int(input("b: "))11b: 11
if a > b:False
elif a == b:False
b = b - a8
if b > 3:True
b = b // 24
print(a, b)3 4
10.
כתבו תוכנית שקוראת מתח והתנגדות ומדפיסה את הזרם. אם ההתנגדות אינה חיובית, היא מדפיסה הודעה ואינה מחשבת.
תשובות:
v = float(input("V: "))
r = float(input("R: "))
if r > 0:
    print("I =", v / r)
else:
    print("R must be positive")
עבור הערכים 12 ו-4 היא מדפיסה: I = 3.0
רמה שלישית — אתגר
11.
שנה מעוברת מתחלקת ב-4 ואינה מתחלקת ב-100, אלא אם היא מתחלקת ב-400. כתבו תוכנית בתנאי מורכב אחד שבודקת שנה.
תשובות:
year = int(input("Year: "))
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
    print("Leap year")
else:
    print("Common year")
עבור השנים 2024, 1900, 2000 היא מדפיסה לפי הסדר: Leap year , Common year , Leap year
12.
משווה חלון (window comparator) בודק אם מתח נמצא בין 2 V ל-3 V, כולל הקצוות. כתבו תוכנית שמדפיסה: קריאה לא תקינה למתח שלילי, מתחת לחלון, בתוכו או מעליו.
תשובות:
low = 2.0
high = 3.0
v = float(input("V: "))
if v < 0:
    print("Bad reading")
elif v < low:
    print("Below window")
elif v <= high:
    print("Inside window")
else:
    print("Above window")
עבור הערכים -1, 1.5, 3, 4 היא מדפיסה לפי הסדר: Bad reading , Below window , Inside window , Above window
13.
כתבו מחשבון לחוק אום בעזרת הפקודה match: המשתמש בוחר מה לחשב ואז מזין שני ערכים. בבחירה 1 מחשבים V מתוך I ו-R, בבחירה 2 מחשבים I מתוך V ו-R, ובבחירה 3 מחשבים R מתוך V ו-I. מנעו חלוקה באפס.
תשובות:
choice = int(input("Find (1=V, 2=I, 3=R): "))
a = float(input("First value: "))
b = float(input("Second value: "))
match choice:
    case 1:
        print("V =", a * b)
    case 2:
        if b != 0:
            print("I =", a / b)
        else:
            print("Division by zero")
    case 3:
        if b != 0:
            print("R =", a / b)
        else:
            print("Division by zero")
    case _:
        print("Unknown choice")
עבור הקלטים 2, 12, 4 היא מדפיסה: I = 3.0

שאלות בגרות לפרק 3

רוב שאלות התכנות בבגרות דורשות לולאות, רשימות ומחלקות, ונפגוש אותן בפרקים הבאים. אבל סעיף ב׳ בשאלה הבאה הוא שרשרת תנאים נקייה, ואפשר לפתור את עיקרו כבר עכשיו.
בגרות 2026 שאלה 10 — כרטיס נסיעה
בגרות 2026
סעיףהמבוקשתשובה
(ב)כתבו תוכנית שמדפיסה את שם בעל הכרטיס שיתרתו גבוהה יותר מבין שני כרטיסים. אם היתרות שוות, היא מדפיסה הודעה מתאימה.למטה
(א) , (ג)נשענים על המחלקה TravelCard עצמה.בפרק 8
הפתרון המלא: fahed-lab.com/exams/electronics-815381/815381/solutions/solution-2026

עוד לא למדנו מחלקות, ולכן נשמור כל שם וכל יתרה במשתנה משלהם. ההיגיון של הסעיף הוא בדיוק אותה שרשרת:

name1 = input("Name 1: ")
balance1 = float(input("Balance 1: "))
name2 = input("Name 2: ")
balance2 = float(input("Balance 2: "))
if balance1 > balance2:
    print(name1)
elif balance2 > balance1:
    print(name2)
else:
    print("Both cards have the same balance.")
פלט
Name 1: Dana
Balance 1: 75.5
Name 2: Omar
Balance 2: 40
Dana

התוכנית מדפיסה Both cards have the same balance. כשהיתרות שוות. בפתרון הבחינה עצמו, אחרי שנלמד מחלקות, נכתוב c1.balance במקום balance1, והתנאי יישאר כמו שהוא.