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

מושגי יסוד בתכנות

30 שעות לימוד

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

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

2.1 כתיבת אלגוריתם מילולי

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

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

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

  1. נקרא את קיבולת הסוללה ביחידות אמפר-שעה.
  2. נקרא את זרם העומס ביחידות אמפר.
  3. נחלק את הקיבולת בזרם ונכפיל את התוצאה ב-60, ונקבל את זמן הפעולה בדקות, ונעגל אותו למספר שלם.
  4. נחלק את הדקות ב-60, והחלק השלם של התוצאה הוא מספר השעות.
  5. השארית של החילוק הזה היא הדקות.
  6. נדפיס את השעות ואת הדקות.

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

שאלה 2.1: כתבו במילים אלגוריתם להמרת משך זמן בדקות לשעות ודקות.

2.2 משתנה

משתנה: שם שאנחנו נותנים לערך ששמור בזיכרון המחשב. אפשר לדמיין אותו כתיבה שעליה שם, ובתוכה ערך אחד בכל רגע.
volts = 12
current = 0.5
print(volts)
print(current)
פלט
12
0.5
volts = 12volts12volts = 9volts9
הערך החדש מחליף את הישן: בתיבה יש ערך אחד בלבד

בוחרים למשתנה שם שמעיד על משמעותו: current ברור יותר מ-c. ולשמות יש כללים:

טעות נפוצה: שם שמתחיל בספרה עוצר את התוכנית עוד לפני שהתחילה, והבדל של אות אחת פירושו משתנה אחר שלא הגדרנו:
2volts = 12
פלט
SyntaxError: invalid decimal literal
Volts = 12
print(volts)
פלט
NameError: name 'volts' is not defined
הערה: הפקודה print אינה מילה שמורה במובן המדויק, אבל היא פעולה מוכנה, ואם נשתמש בשמה למשתנה נאבד אותה. לכן נמנעים מזה.

2.3 מחלקה, תכונות ופעולות

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

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

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

label = "solar panel"
print(label.upper())
print(label.count("a"))
reading = 12.0
print(reading.is_integer())
print(reading.real)
פלט
SOLAR PANEL
2
True
12.0

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

import turtle
pen = turtle.Turtle()
pen.forward(100)
print(pen.position())

2.4 טיפוסי נתונים בסיסיים

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

הטיפוסשם הטיפוסמשמעותודוגמאות
intשלםמספר שלם250 , -3 , 0
floatעשרונימספר עשרוני11.7 , 0.02 , 3.0
strמחרוזתטקסט בין מירכאות"fan" , "12"
boolבוליאניאמת או שקרTrue , False
samples = 250
volts = 11.7
device = "fan"
running = True
print(type(samples))
print(type(volts))
print(type(device))
print(type(running))
פלט
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>

המספר 3.0 הוא מטיפוס float אף שערכו שלם, כי יש בו נקודה. והטקסט "12" הוא מטיפוס str אף שתוויו ספרות, כי הוא בין מירכאות.

2.5 תחומי הערכים וגודלם בזיכרון

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

import sys
print(2 ** 100)
print(sys.float_info.max)
print(sys.float_info.min)
print(sys.float_info.dig)
print(sys.int_info.bits_per_digit)
print(sys.float_info.max * 10)
פלט
1267650600228229401496703205376
1.7976931348623157e+308
2.2250738585072014e-308
15
30
inf

הפעולה sys.getsizeof נותנת את מספר הבתים שהערך תופס בזיכרון:

import sys
print(sys.getsizeof(5))
print(sys.getsizeof(2 ** 100))
print(sys.getsizeof(1.5))
print(sys.getsizeof("abc"))
print(sys.getsizeof(True))
פלט
28
40
24
44
28
הערה: המספרים האלה הם מן המחשב שעליו נבנה הספר, ובמחשב אחר הם יכולים להיות שונים. העיקר הוא הרעיון: גם מספר קטן הוא עצם שלם, ולכן הוא תופס יותר בתים ממה שמספיק כדי לשמור את ערכו בבקר קטן, ומספר גדול תופס יותר ממספר קטן.

2.6 פקודות השמה

בפקודת השמה מחושב קודם הערך שמימין לסימן =, ואחר כך הוא מוצב במשתנה שמשמאל לו. לכן count = count + 1 אינה משוואה, אלא פירושה: לוקחים את הערך הנוכחי, מוסיפים לו אחד, ומציבים את התוצאה במקומו.

count = 10
count = count + 1
count += 4
count -= 2
count *= 3
print(count)
פלט
39
פקודהמה היא עושה
count += 4כמו count = count + 4
count -= 2כמו count = count - 2
count *= 3כמו count = count * 3
count /= 2כמו count = count / 2
טעות נפוצה: הצד השמאלי של השמה חייב להיות שם של משתנה:
12 = volts
פלט
SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?

אפשר להציב ביותר ממשתנה אחד בפקודה אחת:

v, i = 12, 0.5
print(v, i)
a = b = 0
print(a, b)
פלט
12 0.5
0 0
דוגמה 2.2
נחליף בין הערכים של שני משתנים. אם נכתוב a = b ואז b = a, הערך המקורי של a יאבד, ולכן נשמור אותו קודם במשתנה עזר.
פתרון:
a = 3
b = 8
temp = a
a = b
b = temp
print(a, b)
פלט
8 3
temp = aa3temp3b8a = ba8temp3b8b = tempa8temp3b3
החלפה בעזרת משתנה עזר: התא הצבוע הוא זה שהשתנה בכל צעד

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

a = 3
b = 8
a, b = b, a
print(a, b)
פלט
8 3

2.7 הגדרה ואתחול של משתנים

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

print(power)
power = 60
פלט
NameError: name 'power' is not defined

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

x = 5
print(type(x))
x = 2.5
print(type(x))
x = "off"
print(type(x))
פלט
<class 'int'>
<class 'float'>
<class 'str'>
הערה: זה שמותר לשנות טיפוס אינו אומר שזה סגנון טוב. משתנה שמתחיל כמספר ומסתיים כמחרוזת מבלבל את מי שקורא את התוכנית, ולכן אצלנו כל משתנה נשאר בטיפוס אחד.

2.8 אופרטורים חשבוניים

פקודהמה היא עושה
a + bחיבור
a - bחיסור
a * bכפל
a / bחילוק, ותוצאתו תמיד מספר עשרוני
a ** bהעלאה בחזקה
print(7 + 2)
print(7 - 2)
print(7 * 2)
print(7 / 2)
print(8 / 2)
print(2 ** 10)
פלט
9
5
14
3.5
4.0
1024
שימו לב: החילוק / נותן float גם כשהתוצאה שלמה: 8 / 2 נותן 4.0. בשפות אחרות זה שונה, ולכן לא מביאים מהן הרגלים.
דוגמה 2.3
עומס פועל במתח 12 V ובזרם 1.5 A במשך ארבע שעות. נחשב את ההספק שלו ואת האנרגיה שהוא צורך.
פתרון:
P = V · I
E = P · t
volts = 12
current = 1.5
power = volts * current
hours = 4
energy = power * hours
print(power)
print(energy)
פלט
18.0
72.0

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

שאלה 2.2: מה מדפיסה התוכנית הבאה?
a = 9
b = 4
print(a / b)
print(a * b - 1)
print(a ** 2)

2.9 אופרטור מנה ושארית חלוקה

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

print(17 / 5)
print(17 // 5)
print(17 % 5)
print(17.5 // 5)
print(17.5 % 5)
פלט
3.4
3
2
3.0
2.5
דוגמה 2.4
תחנה פועלת כבר 7384 שניות. נמיר את משך הזמן הזה לשעות, דקות ושניות.
פתרון:

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

seconds = 7384
hours = seconds // 3600
left = seconds % 3600
minutes = left // 60
secs = left % 60
print(hours, minutes, secs)
פלט
2 3 4
דוגמה 2.5
נשלח 1000 בתים בחבילות, ובכל חבילה 64 בתים. כמה חבילות שלמות נשלח, וכמה בתים יישארו לחבילה אחרונה?
פתרון:
data = 1000
size = 64
full = data // size
rest = data % size
print(full, rest)
פלט
15 40
שימו לב: במספרים שליליים המנה מעוגלת כלפי מטה, ולא כלפי אפס. לכן -7 // 2 נותן -4 ולא -3, והשארית 1 חיובית, כי −4 · 2 + 1 = −7. ואילו הפעולה int שבשורה השלישית, שנלמד בסעיף 2.12, משמיטה את השבר לכיוון האפס, ולכן היא נותנת -3:
print(-7 // 2)
print(-7 % 2)
print(int(-7 / 2))
פלט
-4
1
-3
תרגול מהיר — מנה ושארית
123 // 4
223 % 4
38 // 9
48 % 9
540 % 8
62.5 // 1
תשובות: 1 5 2 3 3 0 4 8 5 0 6 2.0

2.10 פעולות מתמטיות בסיסיות

פקודהמה היא עושה
pow(a, b)העלאה בחזקה, כמו a ** b
max(a, b, ...)הערך הגדול ביותר
min(a, b, ...)הערך הקטן ביותר
abs(x)ערך מוחלט
round(x, n)עיגול ל-n ספרות אחרי הנקודה; בלי n למספר שלם
sum([a, b, ...])סכום של רשימת ערכים
divmod(a, b)המנה והשארית יחד
print(pow(2, 8))
print(max(4.1, 3.9, 5.0))
print(min(4.1, 3.9, 5.0))
print(abs(-12.5))
print(round(3.14159, 2))
print(round(3.7))
print(sum([12, 11.5, 12.5]))
print(divmod(17, 5))
פלט
256
5.0
3.9
12.5
3.14
4
36.0
(3, 2)

הסוגריים המרובעים ב-sum יוצרים רשימת ערכים, ונכיר אותה בפרק 6. והסוגריים העגולים בתוצאה של divmod מאגדים שני ערכים יחד.

שימו לב: העיגול round אינו מתנהג כמו שלמדנו בבית הספר: מספר שנמצא בדיוק באמצע הדרך מעוגל למספר הזוגי הקרוב. והדוגמה השלישית נראית שגויה כי 2.675 נשמר במחשב מעט פחות מערכו:
print(round(2.5))
print(round(3.5))
print(round(2.675, 2))
פלט
2
4
2.67
דוגמה 2.6
שלוש קריאות של מתח סוללה. נחשב את ההפרש בין הקריאה הגבוהה לנמוכה, ואת הממוצע.
פתרון:
a = 11.8
b = 12.4
c = 12.0
high = max(a, b, c)
low = min(a, b, c)
print(round(high - low, 2))
print(round(sum([a, b, c]) / 3, 2))
פלט
0.6
12.07

המודול random נותן ערכים אקראיים, והוא מועיל כדי לדמות חיישן לפני שיש לנו אחד ביד. הפקודה randint נותנת מספר שלם בתחום, כולל הקצוות, הפקודה random() נותנת מספר עשרוני בין 0 ל-1, והפקודה uniform מספר עשרוני בתחום:

import random
random.seed(7)
print(random.randint(1, 6))
print(random.randint(1, 6))
print(round(random.random(), 3))
print(round(random.uniform(11.5, 12.5), 2))
פלט
3
2
0.395
11.55
הערה: הפקודה random.seed(7) מקבעת את נקודת ההתחלה, ולכן בכל הרצה מתקבלים אותם ערכים. שמנו אותה כאן כדי שהפלט יתאים למה שכתוב בספר; בלעדיה הערכים משתנים בכל הרצה.

2.11 ביטויים חשבוניים וסדר קדימויות

הסדרהפעולותהערה
1( )סוגריים קודם
2**מימין לשמאל
3-xהסימן השלילי, אחרי החזקה
4* / // %משמאל לימין
5+ -משמאל לימין
print(2 + 3 * 4)
print((2 + 3) * 4)
print(2 ** 3 ** 2)
print(-2 ** 2)
print(20 / 2 * 5)
פלט
14
20
512
-4
50.0
טעות נפוצה: שוכחים סוגריים כשמחשבים ממוצע, והתוכנית רצה ונותנת תוצאה שגויה בלי שום הודעה:
a = 10
b = 20
print(a + b / 2)
print((a + b) / 2)
פלט
20.0
15.0
דוגמה 2.7
נחשב את ההתנגדות השקולה של שני נגדים במקביל, 100 Ω ו-300 Ω.
פתרון:
R = R1 · R2 R1 + R2

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

r1 = 100
r2 = 300
total = r1 * r2 / (r1 + r2)
print(total)
פלט
75.0
תרגול מהיר — סדר הפעולות
11 + 2 * 3
2(1 + 2) * 3
310 - 4 - 3
42 * 3 ** 2
518 / 3 / 2
67 % 4 * 2
תשובות: 1 7 2 9 3 3 4 18 5 3.0 6 6
▶ניסוי חי — מעבדת המשתנים והפעולותמריצים תוכניות צעד אחר צעד ורואים איך הערך של כל משתנה מתחלף מול העיניים. במעבדה אין קלט מן המשתמש ואין import, ולכן כותבים את הערכים ישירות במשתנים.
⚠
המעבדה אינה זמינה כרגע. החומר בפרק שלם גם בלעדיה: ממשיכים לקרוא, וחוזרים לניסוי מאוחר יותר או פותחים אותו ישירות מן הקישור שמתחת למסגרת.
https://fahed-lab.com/electronics/python_basics#basics
פותחים את המעבדה בדף נפרד ↗ fahed-lab.com/electronics/python_basics#basics

2.12 המרות בין טיפוסי הנתונים

הפעולות int, float, str ו-bool ממירות ערך לטיפוס שנושא את שמן:

print(int(3.9))
print(int(-3.9))
print(int("42"))
print(float(7))
print(float("3.5"))
print(str(12.5))
print(bool(0))
print(bool(0.5))
print(bool(""))
print(bool("0"))
print(int(True))
פלט
3
-3
42
7.0
3.5
12.5
False
True
False
True
1

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

print(int("3.5"))
פלט
ValueError: invalid literal for int() with base 10: '3.5'
print("Volts: " + 12)
פלט
TypeError: can only concatenate str (not "int") to str

הסימן + הוא חיבור בין מספרים ושרשור בין מחרוזות, והסימן * הוא כפל בין מספרים וחזרה על מחרוזת:

print("Volts: " + str(12))
print("12" + "3")
print(12 + 3)
print("ab" * 3)
פלט
Volts: 12
123
15
ababab

2.13 הצגת ערכים בצורות שונות

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

פקודהמה היא עושה
bin(x)מציג מספר בשיטה הבינארית, כמחרוזת שמתחילה ב-0b
hex(x)מציג מספר בשיטה ההקסדצימלית, כמחרוזת שמתחילה ב-0x
0b1101 , 0xFFכתיבת מספר ישירות בשתי השיטות
int("1101", 2)המרת מחרוזת משיטת ספירה למספר
ord("V")מספר התו בטבלת הקידוד
chr(86)התו שנושא את המספר הזה
print(bin(13))
print(hex(255))
print(0b1101)
print(0xFF)
print(int("1101", 2))
print(int("FF", 16))
print(ord("V"))
print(chr(86))
print(bin(ord("V")))
print(hex(ord("V")))
פלט
0b1101
0xff
13
255
13
255
86
V
0b1010110
0x56

שלוש השורות האחרונות מראות מה קורה באמת כששולחים תו כמו V לארדואינו, כפי שנעשה בפרק 10: לא נשלחת אות, אלא בית שערכו 0x56.

שאלה 2.3: (א) מה נותן hex(16)?
(ב) מה נותן bin(5)?
(ג) מה נותן chr(ord("A"))?

2.14 שגיאות לוגיות, שגיאות תחביר, שגיאות בזמן ריצה

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

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

print("start")
print("end"
פלט
SyntaxError: '(' was never closed

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

print("start")
r = 0
print(12 / r)
print("end")
פלט
start
ZeroDivisionError: division by zero
print("start")
print(volt)
פלט
start
NameError: name 'volt' is not defined

השגיאה הלוגית היא המסוכנת ביותר: התוכנית הבאה רצה בלי תלונה, אבל היא כופלת במקום לחלק בחוק אום. הזרם הנכון הוא 3 A:

volts = 12
resistance = 4
current = volts * resistance
print(current)
פלט
48
הערה: תמיד מנסים תוכנית על דוגמה שתוצאתה ידועה. זו הדרך היחידה לגלות שגיאה לוגית. ואת הודעת השגיאה קוראים מסופה: השורה האחרונה אומרת מה קרה.

2.15 פעולות קלט/פלט ושרשור מחרוזות

הפקודה print מדפיסה ערכים, מפרידה ביניהם ברווח ועוברת לשורה חדשה. הפרמטר sep משנה את המפריד, והפרמטר end משנה את מה שבא בסוף. שרשור מחרוזות בסימן + אינו מוסיף רווח, ודורש המרה של מספרים:

volts = 12
print("Volts:", volts)
print("a", "b", "c", sep="-")
print("no new line", end=" | ")
print("same line")
print()
print("Volts: " + str(volts))
פלט
Volts: 12
a-b-c
no new line | same line

Volts: 12

הפקודה input מציגה הודעה, מחכה למה שהמשתמש מקליד, ומחזירה אותו תמיד כמחרוזת:

name = input("Sensor name: ")
print("Reading", name)
פלט
Sensor name: Temp-1
Reading Temp-1
טעות נפוצה: מה שחוזר מ-input הוא מחרוזת גם אם המשתמש הקליד מספר. לכן הסימן + משרשר את שתי המחרוזות במקום לחבר אותן:
a = input("a: ")
b = input("b: ")
print(a + b)
print(int(a) + int(b))
פלט
a: 12
b: 30
1230
42

לכן ממירים מיד בקריאה: int(input()) או float(input()). נחזור עכשיו לאלגוריתם הסוללה מסעיף 2.1, וכל צעד בו הופך לפקודה:

דוגמה 2.8
נכתוב את התוכנית של זמן הפעולה של הסוללה.
פתרון:
capacity = float(input("Capacity (Ah): "))
load = float(input("Load (A): "))
total = round(capacity / load * 60)
hours = total // 60
minutes = total % 60
print("Runs for", hours, "h", minutes, "min")
פלט
Capacity (Ah): 20
Load (A): 3
Runs for 6 h 40 min

2.16 ביצוע טבלת מעקב

טבלת מעקב מראה מה קורה בתוכנית פקודה אחר פקודה: עמודה לכל משתנה ועמודה לפלט. תא ריק פירושו שהערך לא השתנה. בפרק הבא תתווסף עמודה לכל תנאי.

דוגמה 2.9
נעקוב אחר התוכנית הבאה. שימו לב שההספק חושב לפני שהמתח השתנה, ואינו משתנה איתו.
פתרון:
volts = 12
current = 2
power = volts * current
volts = volts - 1
print(volts, power)
מעקב אחר התוכנית
פקודהvoltscurrentpowerפלט
volts = 1212
current = 22
power = volts * current24
volts = volts - 111
print(volts, power)11 24
דוגמה 2.10
נמיר שניות לדקות ושניות. המשתנה seconds משמש כאן פעמיים, ולכן הסדר חשוב: אם היינו משנים את ערכו לפני חישוב הדקות, החישוב היה משתבש.
פתרון:
seconds = int(input("Seconds: "))
minutes = seconds // 60
seconds = seconds % 60
print(minutes, seconds)
מעקב אחר התוכנית עבור הקלט 130
פקודהsecondsminutesפלט
seconds = int(input("Seconds: "))130Seconds: 130
minutes = seconds // 602
seconds = seconds % 6010
print(minutes, seconds)2 10
שאלה 2.4: בנו טבלת מעקב לתוכנית הבאה וכתבו את הפלט.
x = 7
y = x % 3
x = x // 2 + y
y = y * x
print(x, y)
פרויקט הספר: תחנת המדידה · שלב 2 — התחנה קוראת

בפרק הקודם ציירנו את תחנת המדידה שפועלת על סוללה ולוח סולארי. עכשיו התחנה מתחילה לקרוא: הממיר התקבילי-ספרתי בן עשר הסיביות נותן מספר בין 0 ל-1023 שמייצג מתח בין 0 ל-5 V. מתח הסוללה נכנס אליו דרך מחלק מתח שמחלק ב-4. וחיישן הטמפרטורה נותן 10 mV לכל מעלה, כלומר 0.01 V.

adc_batt = int(input("ADC battery: "))
adc_temp = int(input("ADC temp: "))
step = 5 / 1023
battery = adc_batt * step * 4
temp = adc_temp * step * 100
print("Battery:", round(battery, 2), "V")
print("Temp:", round(temp, 1), "C")
פלט
ADC battery: 620
ADC temp: 82
Battery: 12.12 V
Temp: 40.1 C

נסו בעצמכם: איזו קריאה של הממיר היא הקרובה ביותר ל-12 V בסוללה? בדקו את התשובה בתוכנית.

עיקרי הפרק:

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

פקודהמה היא עושה
x = 5 x += 1השמה
+ - * / ** // %אופרטורים חשבוניים
type(x)הטיפוס של ערך
int(x) float(x) str(x) bool(x)המרה בין טיפוסים
pow max min abs round sum divmodפעולות מתמטיות מוכנות
import random import sysמודולים מוכנים
bin(x) hex(x) ord(c) chr(n)דרכי הצגה של ערכים
print(a, b, sep="", end="")פלט
float(input("..."))קריאת מספר מן המשתמש

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

עבריתEnglishערבית
אלגוריתםAlgorithmالخوارزمية
משתנהVariableالمتغيّر
השמהAssignmentالإسناد
אתחולInitializationالتهيئة
טיפוס נתוניםData typeنوع المعطيات
שלם · עשרוניInteger · Floatعدد صحيح · عدد عشري
מחרוזתStringجملة نصية
מחלקה · עצםClass · Objectالفئة · الكائن
תכונה · פעולהAttribute · Methodالصفة · العمليّة
מנה · שאריתQuotient · Remainderخارج القسمة · الباقي
שגיאת תחבירSyntax errorالخطأ النحوي
שגיאה בזמן ריצהRuntime errorخطأ التشغيل
שגיאה לוגיתLogical errorالخطأ المنطقي
שרשורConcatenationالوصل
טבלת מעקבTrace tableجدول المتابعة
התשובות הסופיות לשאלות הפרק
2.1 קוראים את משך הזמן, מחלקים ב-60 ולוקחים את החלק השלם כדי לקבל שעות, השארית היא הדקות, ואז מדפיסים את שתיהן.
2.2 2.25 , 35 , 81
2.3 (א) 0x10 , (ב) 0b101 , (ג) A
2.4 4 4

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

רמה ראשונה — בסיסי
1.
מה מדפיסה התוכנית?
a = 14
b = 4
print(a // b, a % b)
print(a / b)
print(a ** 2 - b)
print(type(a / 2))
תשובות: 3 2 , 3.5 , 192 , <class 'float'>
2.
מה הטיפוס של כל ערך? הערך האחרון הוא השוואה, שתוצאתה אמת או שקר, ואת ההשוואות נלמד בפרק 3.
(א) 7 / 7
(ב) 7 // 7
(ג) "7"
(ד) 7 > 7
תשובות: (א) float , (ב) int , (ג) str , (ד) bool
3.
כתבו תוכנית שקוראת מתח ומדפיסה את מחציתו.
תשובות:
volts = float(input("V: "))
print("Half:", volts / 2)
4.
תקנו את שתי הטעויות בתוכנית הזאת. המטרה היא להדפיס את הסכום של שני מספרים שהמשתמש מקליד.
a = input("a: ")
b = input("b: ")
print("Sum: " + a + b)
תשובות:
a = int(input("a: "))
b = int(input("b: "))
print("Sum: " + str(a + b))
רמה שנייה — בינוני
5.
המטען של סוללה הוא מכפלת הזרם בזמן. כתבו תוכנית שקוראת אותם ומדפיסה את המטען.
תשובות:
amps = float(input("Current (A): "))
hours = float(input("Hours: "))
print("Charge:", amps * hours, "Ah")
עבור הערכים 2.5 ו-4 היא מדפיסה: Charge: 10.0 Ah
6.
חיישן נותן טמפרטורה בפרנהייט. כתבו תוכנית שממירה אותה למעלות צלזיוס, מעוגלת לספרה אחת.
C = (F − 32) · 5 9
תשובות:
f = float(input("Fahrenheit: "))
c = (f - 32) * 5 / 9
print(round(c, 1))
עבור הקלט 98.6 היא מדפיסה: 37.0
7.
כתבו תוכנית למחלק מתח: היא קוראת את מתח הכניסה ואת שני הנגדים ומדפיסה את מתח היציאה.
תשובות:
Vout = Vin · R2 R1 + R2
vin = float(input("Vin: "))
r1 = float(input("R1: "))
r2 = float(input("R2: "))
vout = vin * r2 / (r1 + r2)
print("Vout:", round(vout, 2))
עבור הערכים 12, 1000, 500 היא מדפיסה: Vout: 4.0
8.
במחסן יש רכיבים אלקטרוניים שמגולגלים בסלילים. כתבו תוכנית שקוראת את מספר הרכיבים ואת מספר הרכיבים בסליל, ומדפיסה את מספר הסלילים השלמים ואת מה שנשאר.
תשובות:
parts = int(input("Parts: "))
reel = int(input("Parts per reel: "))
print("Full reels:", parts // reel)
print("Left over:", parts % reel)
עבור הערכים 1250 ו-300 היא מדפיסה: Full reels: 4 , Left over: 50
9.
בנו טבלת מעקב לתוכנית המרת השניות מסעיף 2.16 עבור הקלט 3599.
תשובות:
פקודהsecondsminutesפלט
seconds = int(input("Seconds: "))3599Seconds: 3599
minutes = seconds // 6059
seconds = seconds % 6059
print(minutes, seconds)59 59
רמה שלישית — אתגר
10.
כתבו תוכנית שקוראת מספר בין 0 ל-255, מדפיסה אותו בשיטה הבינארית ובהקסדצימלית, ואז מדפיסה את המנה והשארית של חלוקתו ב-16. מה הקשר בין שתי התוצאות לשתי הספרות ההקסדצימליות?
תשובות:
value = int(input("Value: "))
print(bin(value))
print(hex(value))
print(value // 16, value % 16)
עבור הקלט 202 היא מדפיסה: 0b11001010 , 0xca , 12 10. המנה והשארית הן אותן שתי הספרות: c ו-a שוות ל-12 ול-10.
11.
כתבו תוכנית שקוראת קריאה של ממיר בן עשר סיביות ומדפיסה את האחוז מכל התחום, מעוגל לספרה אחת.
תשובות:
adc = int(input("ADC: "))
percent = adc * 100 / 1023
print(round(percent, 1), "%")
עבור הקלט 512 היא מדפיסה: 50.0 %
12.
נדמה חיישן: הקריאה שלו 20 מעלות עם רעש אקראי של חצי מעלה לכל היותר לכל כיוון. כתבו תוכנית שמדפיסה קריאה אחת מעוגלת לשתי ספרות.
תשובות:
import random
random.seed(3)
reading = 20 + random.uniform(-0.5, 0.5)
print(round(reading, 2))
עם נקודת ההתחלה הזאת היא מדפיסה: 19.74
13.
כתבו תוכנית שקוראת מספר סיביות, ומדפיסה את מספר הבתים השלמים, את הסיביות העודפות, ואת מספר הבתים שנדרשים כדי לשמור את כולן, בלי פקודת תנאי.
תשובות:
bits = int(input("Bits: "))
print("Bytes:", bits // 8)
print("Extra bits:", bits % 8)
print("Bytes needed:", (bits + 7) // 8)
עבור הקלט 20 היא מדפיסה: Bytes: 2 , Extra bits: 4 , Bytes needed: 3

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

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

עוד לא למדנו לכתוב פעולות, ולכן נחשב ישירות עבור מספר אחד. num // 100 נותן את ספרת המאות, num % 10 נותן את ספרת האחדות, ו-(num // 10) % 10 נותן את ספרת העשרות:

num = 472
hundreds = num // 100
tens = (num // 10) % 10
ones = num % 10
print(hundreds, tens, ones)
print(hundreds + tens + ones)
פלט
4 7 2
13