מבוא לתכנות בשפת פייתון

שיעור 2: ספריית Math, משוואה ריבועית ומשפטי תנאי

(c) Igor Kleiner

igkleiner@gmail

סיכום יעיל ונוח

1. ספריית Math

תת־נושא: פונקציות מתמטיות מובנות וייבוא נכון

מוטיבציה: שפת פייתון תוכננה להיות קלה ויעילה. לכן, פונקציות מתמטיות מתקדמות לא נטענות אוטומטית (כדי לחסוך בזיכרון), אלא מאוגדות במודול חיצוני שצריך לייבא.
הגדרה: כדי לגשת לפונקציות מתמטיות יש להשתמש בפקודת import math בתחילת הקובץ. פונקציות נפוצות כוללות: $ \sqrt{x} $ (שורש ריבועי math.sqrt), $ \sin(x) $, $ \log(x) $ ועוד.

אזהרה: לא מומלץ להשתמש ב- from math import * מחשש להתנגשות שמות (Name collision) עם פונקציות או משתנים קיימים בקוד שלכם.
דוגמה:
import math

x = 16
result = math.sqrt(x)
print("The square root of", x, "is", result)
# Output: The square root of 16 is 4.0

2. פתרון משוואה ריבועית

תת־נושא: תרגום אלגוריתם מתמטי לקוד וטיפול במקרי קצה

מוטיבציה: אחת הבעיות הקלאסיות במדעי המחשב היא תרגום נוסחה מתמטית לקוד עובד. עלינו לא רק לחשב, אלא גם למנוע קריסה של התוכנית (למשל: ניסיון להוציא שורש ממספר שלילי). בינה מלאכותית (AI) יכולה לעזור בהבנת שגיאות תחביר (Syntax errors) כמו חלוקה שגויה.
הגדרה ואלגוריתם: עבור משוואה מהצורה: $$ ax^2 + bx + c = 0 $$ 1. מחשבים את הדיסקרימיננטה: $$ D = b^2 - 4ac $$ 2. בודקים תקינות: אם $ D \ge 0 $, ניתן לחשב שורשים ממשיים. 3. מחשבים את השורשים בעזרת הנוסחה: $$ x_{1,2} = \frac{-b \pm \sqrt{D}}{2a} $$
דוגמה: קוד מאובטח מתקלות (עם משפט תנאי)
import math

a, b, c = 1, -5, 6
d = b**2 - 4*a*c

if d >= 0:
    x1 = (-b + math.sqrt(d)) / (2*a)
    x2 = (-b - math.sqrt(d)) / (2*a)
    print(f"Solutions: x1={x1}, x2={x2}")
else:
    print("No real solutions")

הדגמה אינטראקטיבית: מחשבון משוואה ריבועית

$x^2 + $ $x + $ $= 0$

3. משפטי תנאי - חלק 1

תת־נושא: אופרטורים בוליאניים והזחות (Indentation)

מוטיבציה: תכנות רציף (שורה אחר שורה) אינו מספיק לעולם האמיתי. משפטי תנאי מעניקים לתוכנית "בינה" - היכולת לקבל החלטות בהתאם לקלט, ולמנוע שגיאות זמן ריצה.
הגדרה: אופרטורי השוואה בודקים יחסים בין ערכים ומחזירים ערך בוליאני (True או False).
אופרטורים נפוצים: == (שווה), != (לא שווה), <, >, <=, >=.

הזחות (Indentation): בפייתון, הבלוק שמבוצע תחת התנאי חייב להיות מוזח (בד"כ 4 רווחים פנימה).
דוגמה:
number = 5

if number > 0:
    # בלוק זה ירוץ כי התנאי מתקיים
    print("The number is positive.")

4. משפטי תנאי - חלק 2

תת־נושא: תנאים מורכבים (if-elif-else), אופרטורים לוגיים ותנאים מקוננים

מוטיבציה: כשהלוגיקה מסתבכת, אנו נדרשים לבדוק מספר תרחישים התלויים אחד בשני (כמו ניתוח ציון, סיווג גילאים) או לשלב מספר תנאים בו-זמנית.
הגדרה:
  • if / elif / else: מבנה המאפשר בדיקת שרשרת תנאים. אם התנאי הראשון נכשל, בודקים את ה-elif, ואם כולם נכשלו מבצעים את ה-else.
  • אופרטורים לוגיים: and (וגם - שני התנאים חייבים להתקיים), or (או - לפחות אחד מתקיים), not (שלילה).
  • תנאי מקונן (Nested Condition): משפט if בתוך בלוק של if אחר. מומלץ לא לבצע יותר מ-3 רמות קינון כדי לשמור על קריאות הקוד.
דוגמה: שימוש ב-elif ואופרטורים לוגיים
age = int(input("Enter your age: "))

if age < 0:
    print("You are not born yet")
elif age >= 0 and age <= 120:
    print("You are alive")
else:
    print("You are a vampire")
דוגמה: תנאי מקונן (בדיקת זוגיות וחלוקה ב-4)
x = 16
if x > 0:
    print("Positive number")
    if x % 2 == 0:
        print("Even number")
        if x % 4 == 0:
            print("Divisible by 4")

מילון מושגים

Module (מודול) / import
קובץ המכיל קוד פייתון מוכן מראש (כמו math). הפקודה import טוענת אותו לזיכרון כדי שנוכל להשתמש בו.
Discriminant (דיסקרימיננטה - $D$)
החלק במשוואה הריבועית שמתחת לשורש ($ D = b^2 - 4ac $). קובע כמה שורשים ממשיים יש למשוואה.
Boolean (בוליאני)
טיפוס נתונים היכול להכיל רק שני ערכים: True (אמת) או False (שקר).
Indentation (הזחות)
הרווחים בתחילת שורה שמגדירים לאיזה בלוק קוד (למשל תחת if) השורה שייכת.
Nested Conditions (תנאים מקוננים)
הצבת פקודת if אחת בתוך הבלוק המותנה של פקודת if אחרת. מאפשר עצי החלטה מורכבים.

שאלות בדיקה עצמית

1. מדוע בדרך כלל לא מומלץ להשתמש בפקודה from math import *?

2. בפתרון משוואה ריבועית, מה יקרה אם ננסה לחשב שורש ל-$D$ כאשר $D < 0$ ללא משפט תנאי מקדים?

3. מה ההבדל בין האופרטור = לאופרטור == בתוך משפטי תנאי?