מבוא
לפני שנכתוב פקודה אחת נשאל: מה המחשב עושה בכלל, ואיך מדברים איתו? בפרק הזה נכיר את הנדסת המחשבים, ננתח משימה פשוטה, נריץ תוכנית ראשונה, ואז נפגוש את העצם הראשון שלנו: צב שמצייר על המסך לפי הפקודות שאנחנו נותנים לו.
- נראה איך המחשב פותר בעיות מתחומים שונים, ומה הופך בעיה לאתגר חישובי.
- ננתח משימה פשוטה: הנתון, הדרוש והצעדים, ונכתוב לה אלגוריתם.
- נכתוב תוכנית ונריץ אותה, נבדוק אותה ונתקן את שגיאותיה, בסביבת פיתוח אמיתית.
- נבחין בין מחלקה לעצם, ונקרא ממשק של מחלקה מוכנה.
- נצייר במישור בעזרת המחלקה
Turtle, וניצור ממנה יותר מעצם אחד.
1.1 הנדסת מחשבים ואתגרים חישוביים
המחשב אינו רק המכשיר שעל השולחן: יש מחשב קטן בטלפון, במכונית, במכונת הכביסה וברמזור. נאמר שלפנינו אתגר חישובי כשהחישוב עצמו הוא המכשול: הנתונים רבים מאוד, או שהזמן קצר מאוד, או שהאפשרויות רבות מכדי שאדם ינסה אותן. כך נכנס המחשב לתחומים שלכאורה אין להם קשר לאלקטרוניקה:
| התחום | האתגר | מה המחשב מחשב |
|---|---|---|
| רפואה | מעקב אחר לב של מטופל לאורך היום | מנתח את האות דגימה אחר דגימה, ומתריע כשהדופק אינו סדיר |
| תחבורה | הדרך המהירה ביותר בעיר עמוסה | משווה בין מספר עצום של דרכים, ומחשב מחדש בכל שינוי בעומס |
| אנרגיה | רשת חשמל שיש בה לוחות סולאריים | מאזן רגע אחר רגע בין הייצור לצריכה |
| תעשייה | בדיקה של כל פריט בקו ייצור | משווה את תמונת הפריט לדגם בתוך חלקיק שנייה |
רופא אינו יכול להסתכל על מספר כזה של ערכים. התוכנית עוברת על כולם, ומציגה לו רק את הרגעים שקרה בהם משהו חריג. הרופא מחליט, והמחשב נותן לו את מה שהוא צריך כדי להחליט.
1.2 משימות חישוביות פשוטות
לא מתחילים בקוד, אלא בשלוש שאלות: מה הנתון? מה הדרוש? מהם הצעדים שמובילים מן הנתון אל הדרוש? התשובה לשתי השאלות הראשונות היא ניתוח המשימה, והתשובה לשלישית היא ניסוח הפתרון.
| שחור | חום | אדום | כתום | צהוב | ירוק | כחול | סגול | אפור | לבן |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
הנתון: שלושה צבעים, וטבלה שממירה כל צבע לספרה. הדרוש: ערך הנגד באוהם. הצעדים:
- נמיר את צבע הפס הראשון לספרה. זו ספרת העשרות.
- נמיר את צבע הפס השני לספרה. זו ספרת האחדות.
- נמיר את צבע הפס השלישי לספרה, ונקרא לה n.
- נכפיל את המספר שקיבלנו משני הפסים הראשונים ב-10n. התוצאה היא הערך באוהם.
חום פירושו 1, שחור פירושו 0, ולכן המספר הוא 10. אדום פירושו n = 2:
לאותה משימה יכול להיות יותר מאלגוריתם נכון אחד, ויש טובים מאחרים.
הנתון: 16 נורות, והקטע שבו נמצאת הנורה השרופה אינו מוליך. הדרוש: הנורה השרופה. נשווה בין שני אלגוריתמים:
| האלגוריתם | הצעדים | בדיקות במקרה הגרוע |
|---|---|---|
| אחת אחרי השנייה | נבדוק את הנורה הראשונה, אחר כך את השנייה, וכן הלאה, עד שנמצא את זו שאינה מוליכה | 15: אם חמש-עשרה תקינות, האחרונה היא השרופה |
| חצייה | נבדוק חצי מן השרשרת. אם הוא מוליך, השרופה בחצי האחר, ואם לא, היא בחצי הזה. אחר כך נחצה את מה שנשאר, עד שנשארת נורה אחת | 4: מ-16 ל-8, ל-4, ל-2, ל-1 |
שני האלגוריתמים נכונים, אבל השני חסכוני בהרבה, וככל שהשרשרת ארוכה יותר ההפרש גדל. נחזור ליעילות בפרק 4.
1.3 שפת תכנות
המעבד מבין רק פקודות פשוטות מאוד, כתובות באפסים ואחדות, ואנחנו לא יכולים לכתוב כך תוכניות ארוכות. גם עברית וערבית אינן מתאימות, כי משפט בהן יכול להתפרש ביותר ממובן אחד. שפת תכנות היא הפשרה ביניהן.
בספר הזה נכתוב בשפת פייתון Python. תוכנית שנקראת מפרש קוראת את מה שכתבנו, בודקת תחילה שהכתיבה תקינה, ואז מבצעת את הפקודות אחת אחרי השנייה:
לכל שפה המילים שלה, אבל הרעיון אחד. הנה אותה פקודה, הדפסת משפט על המסך, בשלוש שפות:
| השפה | איפה נפגוש אותה | הפקודה |
|---|---|---|
| Python | הספר הזה, ניתוח נתונים, תקשורת עם התקנים | print("Power on") |
| C++ | לוח ארדואינו | Serial.println("Power on"); |
| C# | יישומי מחשב | Console.WriteLine("Power on"); |
print ו-Print הן שתי מילים שונות, כי אותיות גדולות וקטנות נבדלות.(א)
print("Ready")(ב)
Print("Ready")(ג)
print("Ready(ד)
print "Ready"1.4 התוכנית: קריאה, כתיבה, הרצה, בדיקה ותיקון
העבודה על תוכנית אינה כתיבה חד-פעמית, אלא מעגל שחוזרים עליו עד שהיא נכונה. לעתים רחוקות תוכנית פועלת נכון כבר בפעם הראשונה, וזה רגיל:
קריאה. קוראים את התוכנית מלמעלה למטה, ומשערים מה היא תעשה לפני שמריצים אותה. הפקודה print מדפיסה על המסך את מה שבין הסוגריים. שורה שמתחילה בסימן # היא הערה: כתבנו אותה בשביל הקורא, והמפרש מתעלם ממנה. והסדר הוא התוכנית: אותן פקודות בסדר אחר נותנות פלט אחר.
print("Sensor test")
print("Reading:", 25)
# the next line runs last
print("Done")Sensor test Reading: 25 Done
print("Done")
print("Sensor test")
print("Reading:", 25)Done Sensor test Reading: 25
כתיבה. כותבים פקודה אחת בכל שורה, ושומרים את התוכנית בקובץ שסיומת שמו .py.
print("Start")
print("End")IndentationError: unexpected indent
הרצה. מבקשים מן המפרש לבצע את התוכנית, ומה שהיא מדפיסה הוא הפלט. בדיקה. משווים את הפלט למה שציפינו לו. תיקון. אם הם שונים מחפשים את הסיבה, מתקנים, ומריצים מחדש.
הניסיון הראשון: שכחנו את המירכאות שסוגרות את המשפט, ולכן המפרש דחה את התוכנית כולה, ואפילו השורה הראשונה לא הודפסה. הניסיון השני: סגרנו את המשפט, אבל כתבנו אות גדולה. הפעם השורה הראשונה בוצעה, והתוכנית נעצרה בשגיאה.
print("Battery check")
print("Voltage: 9 V)SyntaxError: unterminated string literal (detected at line 2)
print("Battery check")
Print("Voltage: 9 V")Battery check NameError: name 'Print' is not defined
הניסיון השלישי: אין הודעת שגיאה. אבל האם הפלט נכון? זרם של יותר מ-200 A מסוללה קטנה? בלתי אפשרי. המחשב חילק את 9 ב-100 תחילה ואז הוסיף 200, ואנחנו רוצים שיחבר את שתי ההתנגדויות לפני החילוק. נוסיף סוגריים, ונקבל את התוכנית השנייה:
print("Battery check")
print("Voltage: 9 V")
print("Current:", 9 / 100 + 200, "A")Battery check Voltage: 9 V Current: 200.09 A
print("Battery check")
print("Voltage: 9 V")
print("Current:", 9 / (100 + 200), "A")Battery check Voltage: 9 V Current: 0.03 A
עכשיו הפלט סביר, ומתאים למה שנחשב ביד: 9 חלקי 300. את האופרטורים החשבוניים נלמד בפירוט בפרק 2.
print("A")
print()
print("B", "C")
print(2 + 3)
print("2 + 3")1.5 סביבת הפיתוח ותוכנית ראשונה
תכנית הלימודים ממליצה להכיר שתי סביבות: סביבה מקוונת, וסביבה שמתקינים על המחשב. כאן נכיר את Google Colab ואת IDLE. יש סביבות נוספות כמו Visual Studio Code ו-PyCharm, ואותה תוכנית רצה בכולן.
| Google Colab | IDLE | |
|---|---|---|
| איפה היא רצה | בדפדפן, והתוכנית רצה על שרת מרוחק | על המחשב שלנו |
| מה צריך | חשבון Google וחיבור לאינטרנט | התקנת פייתון מהאתר python.org, ו-IDLE מגיעה איתה |
| איפה העבודה נשמרת | מחברת ב-Google Drive | קובץ .py במחשב |
| Turtle | לא עובד, כי לשרת המרוחק אין מסך | עובד, ונפתח לו חלון |
ב-Google Colab:
- נכנסים אל
colab.research.google.comובוחרים מחברת חדשה. - כותבים את התוכנית בריבוע שמופיע, שהוא התא.
- לוחצים על לחצן ההרצה שליד התא, או על
Shift+Enter, והפלט מופיע מתחתיו.
ב-IDLE:
- פותחים את
IDLE, ומופיע חלוןShell. - בוחרים
File > New File, וכותבים את התוכנית בחלון החדש. - שומרים בעזרת
File > Saveבשם כמוfirst.py. - לוחצים על
F5, והפלט מופיע בחלוןShell.
התוכנית הראשונה שלנו היא שורה אחת. הפקודה print מדפיסה את מה שבין הסוגריים, ועוברת לשורה הבאה. טקסט בין מירכאות מודפס אות באות. ואם אין כלום בין הסוגריים, מודפסת שורה ריקה, כמו בתוכנית השנייה:
print("Hello from the lab")Hello from the lab
print("Measuring station")
print("Power on")
print()
print("Ready")Measuring station Power on Ready
מה שבין המירכאות מודפס כמו שהוא, ומה שאינו ביניהן מחושב תחילה. וכשמפרידים בין ערכים בפסיק, print מדפיסה אותם באותה שורה עם רווח ביניהם.
print("7 * 6")
print(7 * 6)
print("Seconds:", 24 * 60 * 60)7 * 6 42 Seconds: 86400
print(“Power on”)
SyntaxError: invalid character '“' (U+201C)
Solar panel , Battery , Gauge1.6 העצם כמופע של מחלקה
פותחים את ארון המעבדה ומוצאים שנים-עשר רבי-מודדים מאותו דגם. לכולם אותם לחצנים ואותן יכולות, כי הם יוצרו לפי תכנון אחד. אבל כל רב-מודד הוא דבר נפרד: זה בתחום 20 V וקורא 11.9, וההוא כבוי.
מה שהעצם נושא נקרא תכונות, ומה שהוא יכול לעשות נקרא פעולות. העצמים חולקים את שמות התכונות ואת הפעולות, אבל ערכי התכונות הם של כל עצם לעצמו:
| מחלקה | שני עצמים ממנה | תכונות | פעולות |
|---|---|---|---|
| נורית | האדומה שעל הלוח, והירוקה לידה | צבע, דולקת או לא | הדלקה, כיבוי |
| סוללה | סוללת המכונית, וסוללת האזעקה | מתח, קיבולת | טעינה, פריקה |
| טלפון | הטלפון שלי, והטלפון של חבר | מספר, טעינה | חיוג, שליחת הודעה |
1.7 מחלקה קיימת: Turtle
עם פייתון מגיעות מחלקות מוכנות רבות. נתחיל במחלקה שאפשר לראות את פעולתה בעיניים: Turtle, כלומר הצב. נדמיין צב קטן שהולך על המסך וגורר עט, ומצייר קו בכל מקום שהוא הולך בו. עצם של המחלקה הזאת נראה כחץ קטן, ונותנים לו פקודות והוא זז.
חלון Turtle הוא מישור דו-ממדי עם שני צירים. הנקודה (0, 0) באמצע החלון, x גדל ימינה, ו-y גדל למעלה. כל נקודה נכתבת (x, y), ו-x תמיד ראשון. העצם נולד ב-(0, 0) וכיוונו ימינה. הפקודות forward ו-backward מזיזות אותו בכיוונו הנוכחי, והפקודות right ו-left מסובבות אותו במקומו, במעלות.
תוכנית Turtle ראשונה:
import turtle pen = turtle.Turtle() pen.forward(100) print(pen.position()) turtle.done()
(100.00,0.00)
import turtleמביאה את המודול המוכן, וכותבים אותה פעם אחת בתחילת התוכנית.pen = turtle.Turtle()יוצרת עצם חדש מן המחלקהTurtle, ונותנת לו את השםpen. את השם אנחנו בוחרים.turtleבאות קטנה היא המודול, ו-Turtleבאות גדולה היא המחלקה שבתוכו.- ב-
pen.forward(100)אנחנו נותנים לעצם פקודה: שם העצם, נקודה, שם הפעולה, ובין הסוגריים מה שהיא צריכה. כאן העצם מתקדם 100 צעדים. - ב-
print(pen.position())אנחנו שואלים את העצם איפה הוא, ומדפיסים את התשובה. turtle.done()משאירה את החלון פתוח עד שנסגור אותו. בלעדיה החלון עלול להיסגר, בחלק מן הסביבות, מיד כשהתוכנית מסתיימת, ולא נספיק לראות את הציור.
turtle.py: אז import turtle מוצאת את הקובץ שלנו במקום את המודול המוכן, והתוכנית נעצרת. קראו לו למשל draw1.py. ואל תנסו את Turtle ב-Google Colab, אלא השתמשו ב-IDLE או בסביבה אחרת על המחשב.תנועה וסיבוב:
הסיבוב עצמו אינו מצייר דבר ואינו משנה את המיקום: left משנה רק את הכיוון, וההתקדמות אחריה היא בכיוון החדש. והפקודה backward מחזירה את העצם לאחור על אותו קו בלי להסתובב, ולכן החץ נשאר מכוון למעלה:
import turtle pen = turtle.Turtle() pen.forward(100) pen.left(90) pen.forward(50) pen.backward(20) print(pen.position()) turtle.done()
(100.00,30.00)
right ו-left הם ביחס לחץ, לא ביחס לדף. אם החץ מכוון למטה, אז right(90) מסובבת אותו שמאלה בדף.נתקדם ונסתובב, ארבע פעמים:
import turtle pen = turtle.Turtle() pen.forward(100) pen.right(90) pen.forward(100) pen.right(90) pen.forward(100) pen.right(90) pen.forward(100) pen.right(90) turtle.done()
זה עובד, אבל כתבנו את אותו זוג פקודות ארבע פעמים. ומה אם נרצה צורה עם 20 צלעות? בפרק 4 נלמד את הלולאה, כלומר לומר למחשב "חזור על זה", ואז נכתוב את זוג הפקודות פעם אחת בלבד.
הרמת העט וצבע:
הפקודה penup מרימה את העט, והעצם זז אחריה בלי לצייר, והפקודה pendown מחזירה אותו לדף. יש להן שמות קצרים יותר: up ו-down. הפקודה color משנה את צבע העט, ושם הצבע הוא טקסט באנגלית בין מירכאות, והוא חל על כל מה שמצויר אחריה. נצייר בעזרתן סרגל בשני צבעים:
import turtle
pen = turtle.Turtle()
pen.color("green")
pen.forward(80)
pen.penup()
pen.forward(15)
pen.pendown()
pen.color("red")
pen.forward(40)
pen.up()
pen.forward(15)
pen.down()
pen.forward(40)
turtle.done()מעבר לנקודה:
הפקודה goto(x, y) מעבירה את העצם ישירות לנקודה (x, y) בקו ישר, בלי לשנות את כיוונו. היא נוחה כשהקואורדינטות ידועות, כי אין צורך לחשב שום זווית:
import turtle pen = turtle.Turtle() pen.goto(50, 50) pen.goto(100, 0) pen.goto(150, 50) pen.goto(200, 0) print(pen.position()) turtle.done()
(200.00,0.00)
goto מציירת קו בדרך. כדי לעבור למקום אחר בלי קו, מרימים את העט לפניה ומחזירים אותו אחריה.import turtle pen = turtle.Turtle() pen.forward(50) pen.left(90) pen.forward(30) pen.backward(10) print(pen.position()) turtle.done()
1.8 קריאת ממשק פשוט של מחלקה
כדי להשתמש ברב-מודד לא צריך לדעת מה יש בתוכו. מספיק להכיר את הלחצנים ואת השקעים. וכך גם במחלקה מוכנה.
מה שהפעולה צריכה בין הסוגריים נקרא פרמטר, ושם כותבים את הערך שמעבירים לו. זה הממשק של מה שלמדנו עד עכשיו מן המחלקה Turtle:
| הפעולה | הפרמטרים | מה היא עושה |
|---|---|---|
| Turtle() | כלום | יוצרת עצם חדש ב-(0, 0), שכיוונו ימינה |
| forward(d) | מספר: מרחק | מתקדם d בכיוונו הנוכחי |
| backward(d) | מספר: מרחק | נסוג d בלי להסתובב |
| right(a) | מספר: זווית במעלות | מסתובב במקומו לימינו |
| left(a) | מספר: זווית במעלות | מסתובב במקומו לשמאלו |
| penup() , up() | כלום | מרים את העט |
| pendown() , down() | כלום | מחזיר את העט לדף |
| color(name) | טקסט: שם הצבע | משנה את צבע העט |
| goto(x, y) | שני מספרים: קואורדינטות | עובר לנקודה, ומצייר אם העט על הדף |
| position() | כלום | מחזירה את המיקום הנוכחי ואינה מדפיסה אותו |
קוראים כל שורה בשלוש שאלות. כמה פרמטרים הפעולה צריכה? מאיזה סוג? והאם היא עושה משהו או מחזירה ערך? הפעולה forward מזיזה את העצם ואינה מחזירה לנו דבר. הפעולה position אינה מזיזה דבר, אלא מחזירה ערך, ואם לא נשתמש בו הוא אובד. לכן השורה הרביעית בתוכנית הראשונה שלמטה אינה מדפיסה דבר, ומי שמדפיסה היא החמישית.
import turtle pen = turtle.Turtle() pen.forward(80) pen.position() print(pen.position()) turtle.done()
(80.00,0.00)
import turtle pen = turtle.Turtle() pen.forward print(pen.position()) turtle.done()
(0.00,0.00)
שם ששונה באות אחת, או ערך מסוג אחר שמעבירים לפרמטר, עוצרים את התוכנית. הפעולה מבקשת מספר, והטקסט "100" אינו מספר, ולכן הודעת השגיאה השנייה נפתחת במילה TypeError, כלומר שגיאה בסוג הערך, והמשכה מתאר את החישוב הפנימי שנכשל:
import turtle pen = turtle.Turtle() pen.Forward(100)
AttributeError: 'Turtle' object has no attribute 'Forward'. Did you mean: 'forward'?
import turtle
pen = turtle.Turtle()
pen.forward("100")TypeError: can't multiply sequence by non-int of type 'float'
התועלת האמיתית בקריאת הממשק היא שאפשר להשתמש בפעולה שלא ראינו מעולם. הנה פעולות נוספות מאותו ממשק:
| הפעולה | הפרמטרים | מה היא עושה |
|---|---|---|
| circle(r) | מספר: רדיוס | מצייר מעגל, שמרכזו במרחק r משמאל לחץ, וחוזר לנקודת ההתחלה |
| dot(size, color) | מספר וטקסט | מצייר נקודה מלאה בקוטר ובצבע המבוקשים, גם כשהעט מורם |
| pensize(w) | מספר: עובי | משנה את עובי הקו |
| write(text) | טקסט | כותב את הטקסט במיקום הנוכחי |
| hideturtle() | כלום | מסתיר את החץ, והציור נשאר |
בממשק כתוב שהמרכז של circle(40) נמצא במרחק 40 משמאל לחץ. החץ מכוון ימינה, ולכן המרכז הוא (0, 40). את נקודות הקווים נחשב סביב המרכז הזה, ונרים את העט לפני כל מעבר:
import turtle
pen = turtle.Turtle()
pen.pensize(2)
pen.circle(40)
pen.up()
pen.goto(-28, 12)
pen.down()
pen.goto(28, 68)
pen.up()
pen.goto(-28, 68)
pen.down()
pen.goto(28, 12)
pen.up()
pen.goto(50, 30)
pen.write("Lamp")
pen.hideturtle()
turtle.done()docs.python.org, ויש בו פעולות רבות. אפשר גם לכתוב בחלון Shell את הפקודה help(turtle.Turtle.forward) אחרי import turtle, והממשק של הפעולה הזאת יופיע שם.on() בלי פרמטרים, off() בלי פרמטרים, brightness(percent) עם פרמטר מספרי מ-0 עד 100, ו-is_on() שמחזירה True או False. יש לנו עצם בשם led. כתבו פקודות שמדליקות אותו בחצי עוצמה, ואז מדפיסות אם הוא דולק.1.9 יצירת עצמים חדשים
בכל פעם שמזמנים את turtle.Turtle() נולד מופע חדש. לכל עצם המיקום, הכיוון והצבע שלו, ופקודה שניתנת לעצם אחד אינה משפיעה על אחרים. שם העצם שלפני הנקודה קובע מי מבצע:
import turtle
pen_a = turtle.Turtle()
pen_b = turtle.Turtle()
pen_a.color("red")
pen_b.color("blue")
pen_a.forward(100)
pen_b.left(90)
pen_b.forward(60)
print(pen_a.position())
print(pen_b.position())
turtle.done()(100.00,0.00) (0.00,60.00)
ניצור את העצם clock, נרים את העט שלו, נכתוב את השם, ואז נצייר בעזרת goto. אחר כך ניצור את data ונעשה אותו דבר:
import turtle
clock = turtle.Turtle()
clock.color("blue")
clock.up()
clock.goto(4, 68)
clock.write("CLK")
clock.goto(0, 60)
clock.down()
clock.goto(0, 90)
clock.goto(40, 90)
clock.goto(40, 60)
clock.goto(80, 60)
clock.goto(80, 90)
clock.goto(120, 90)
clock.goto(120, 60)
clock.goto(160, 60)
clock.hideturtle()
data = turtle.Turtle()
data.color("red")
data.up()
data.goto(4, 6)
data.write("DATA")
data.goto(0, 0)
data.down()
data.goto(80, 0)
data.goto(80, 30)
data.goto(160, 30)
data.hideturtle()
turtle.done()pen_b = pen_a אינה יוצרת עצם: אין כאן Turtle(), אלא שני שמות לעצם אחד. לכן בציור יש חץ אחד, ומה שעושים באחד השמות קורה לאותו עצם:import turtle pen_a = turtle.Turtle() pen_b = pen_a pen_a.forward(100) pen_b.left(90) pen_b.forward(50) print(pen_a.position()) print(pen_b.position()) turtle.done()
(100.00,50.00) (100.00,50.00)
goto אינה משנה את כיוון העצם.import turtle pen_a = turtle.Turtle() pen_b = turtle.Turtle() pen_a.goto(40, 40) pen_b.backward(30) pen_a.forward(10) print(pen_a.position()) print(pen_b.position()) turtle.done()
לאורך הספר הזה מלווה אותנו פרויקט אחד שגדל מפרק לפרק: תחנת מדידה שפועלת על סוללה ולוח סולארי. בפרק 2 היא קוראת את מדידותיה, בפרק 3 היא מחליטה, בפרק 6 היא זוכרת, ובפרק 10 היא מתחברת ללוח ארדואינו אמיתי. נתחיל במה שאפשר עכשיו: נצייר את התרשים שלה, ובו הלוח הסולארי, הסוללה והמחוון. לכל חלק עצם משלו, ולכל עצם צבע משלו.
import turtle
panel = turtle.Turtle()
panel.color("blue")
panel.pensize(2)
panel.up()
panel.goto(-200, 125)
panel.write("PANEL")
panel.goto(-200, 60)
panel.down()
panel.goto(-100, 60)
panel.goto(-100, 120)
panel.goto(-200, 120)
panel.goto(-200, 60)
panel.up()
panel.goto(-150, 60)
panel.down()
panel.goto(-150, 120)
panel.hideturtle()
wire = turtle.Turtle()
wire.up()
wire.goto(-100, 90)
wire.down()
wire.goto(120, 90)
wire.up()
wire.goto(-150, 60)
wire.down()
wire.goto(-150, -30)
wire.goto(150, -30)
wire.goto(150, 60)
wire.up()
wire.goto(0, 90)
wire.dot(8)
wire.down()
wire.goto(0, 35)
wire.up()
wire.goto(0, -30)
wire.dot(8)
wire.down()
wire.goto(0, 25)
wire.hideturtle()
cell = turtle.Turtle()
cell.color("red")
cell.pensize(3)
cell.up()
cell.goto(-25, 35)
cell.down()
cell.goto(25, 35)
cell.up()
cell.goto(-12, 25)
cell.down()
cell.goto(12, 25)
cell.up()
cell.goto(32, 24)
cell.write("BATTERY")
cell.hideturtle()
gauge = turtle.Turtle()
gauge.color("green")
gauge.pensize(2)
gauge.up()
gauge.goto(150, 60)
gauge.down()
gauge.circle(30)
gauge.up()
gauge.goto(150, 90)
gauge.down()
gauge.goto(168, 110)
gauge.up()
gauge.goto(125, 126)
gauge.write("GAUGE")
gauge.hideturtle()
turtle.done()התוכנית ארוכה, כי אנחנו חוזרים על אותן פקודות שוב ושוב. זה בסדר: בפרקים 4 ו-7 נלמד לקצר אותה. נסו בעצמכם: הוסיפו לקו התחתון נגד עומס בצורת מלבן קטן, ושאלו: איפה צריך להרים את העט?
עיקרי הפרק:
- המחשב מבצע פקודות פשוטות במהירות עצומה ובלי הבנה, והחשיבה על הפתרון עלינו.
- מנתחים את המשימה לפני הקוד: הנתון, הדרוש, ואז צעדים שאינם משתמעים לשני פנים.
- העבודה על תוכנית היא מעגל: כתיבה, הרצה, בדיקה ותיקון. תוכנית שאינה מתלוננת אינה בהכרח נכונה.
- מחלקה היא תיאור כללי, ועצם הוא מופע מסוים שלה עם ערכי תכונות משלו.
- הממשק אומר לנו איך להשתמש במחלקה בלי לדעת מה יש בתוכה.
- כל זימון של
turtle.Turtle()יוצר עצם חדש ועצמאי.
סיכום פקודות הפרק:
| פקודה | מה היא עושה |
|---|---|
| print("text", 2 + 3) | הדפסה על המסך |
| # comment | הערה שהמפרש מתעלם ממנה |
| import turtle | הבאת המודול המוכן |
| pen = turtle.Turtle() | יצירת עצם חדש בשם pen |
| pen.forward(d) pen.backward(d) | תנועה בכיוון הנוכחי |
| pen.right(a) pen.left(a) | סיבוב במקום |
| pen.penup() pen.pendown() | הרמת העט והורדתו |
| pen.up() pen.down() | שמות קצרים לשתי הפקודות הקודמות |
| pen.color("red") | צבע העט |
| pen.goto(x, y) | מעבר לנקודה |
| pen.position() | המיקום הנוכחי, ערך שחוזר אלינו |
| turtle.done() | השארת החלון פתוח |
מילון מונחים:
| עברית | English | ערבית |
|---|---|---|
| הנדסת מחשבים | Computer engineering | هندسة الحاسوب |
| אתגר חישובי | Computational challenge | تحدٍّ حسابي |
| אלגוריתם | Algorithm | الخوارزمية |
| ניתוח המשימה | Task analysis | تحليل المهمة |
| שפת תכנות | Programming language | لغة البرمجة |
| תחביר | Syntax | النحو |
| מפרש | Interpreter | المفسّر |
| תוכנית | Program | البرنامج |
| הערה | Comment | التعليق |
| פלט | Output | المُخرَج |
| סביבת פיתוח | Development environment (IDE) | بيئة التطوير |
| מחלקה | Class | الفئة |
| עצם | Object | الكائن |
| מופע | Instance | النسخة |
| תכונה | Attribute | الصفة |
| פעולה | Method | العمليّة |
| פרמטר | Parameter | الوسيط |
| ממשק | Interface | الواجهة |
35040 קריאות מכל מונה. כשיש בעיר מאות אלפי מונים אדם אינו יכול לקרוא אותן, ואילו התוכנית אוספת אותן ומגלה תקלות וצריכה חריגה.A , שורה ריקה , B C , 5 , 2 + 3print("Solar panel")
print("Battery")
print("Gauge")(50.00,20.00)led.on() , led.brightness(50) , print(led.is_on())(50.00,40.00) , (-30.00,0.00)שאלות לתרגול:
print("9 * 9")
print(9 * 9)
print()
print("Done", 9 + 9)9 * 9 , 81 , שורה ריקה , Done 18Print("Lab 3")
print("Voltage: 5 V)
print("End")Print, כי זו מתגלה רק בזמן הביצוע.print("Lab 3")
print("Voltage: 5 V")
print("End")import turtle pen = turtle.Turtle() pen.forward(80) pen.left(90) pen.forward(40) pen.right(90) pen.forward(80) pen.right(90) pen.forward(40) print(pen.position()) turtle.done()
(160.00,0.00).forward ו-left בלבד.import turtle pen = turtle.Turtle() pen.forward(120) pen.left(90) pen.forward(60) pen.left(90) pen.forward(120) pen.left(90) pen.forward(60) turtle.done()
47000 אוהם.import turtle pen = turtle.Turtle() pen.left(90) pen.forward(30) pen.up() pen.forward(20) pen.down() pen.forward(30) pen.up() pen.forward(20) pen.down() pen.forward(30) print(pen.position()) turtle.done()
(0.00,130.00)import turtle pen = turtle.Turtle() pen.up() pen.dot(30, "red") pen.forward(50) pen.dot(30, "orange") pen.forward(50) pen.dot(30, "green") pen.hideturtle() turtle.done()
plus מתחיל ב-(0, 40) ומגיע ל-(120, 25). התיל השחור minus מתחיל ב-(0, 0) ומגיע ל-(120, 15). ציירו את שני התילים בשני עצמים, בזוויות ישרות בלבד, והדפיסו את מיקום הסיום של כל אחד.import turtle
plus = turtle.Turtle()
minus = turtle.Turtle()
plus.color("red")
minus.color("black")
plus.up()
plus.goto(0, 40)
plus.down()
plus.goto(120, 40)
plus.goto(120, 25)
minus.goto(120, 0)
minus.goto(120, 15)
print(plus.position())
print(minus.position())
turtle.done()(120.00,25.00) , (120.00,15.00)import turtle pen = turtle.Turtle() pen.pensize(4) pen.up() pen.goto(0, 100) pen.down() pen.goto(50, 100) pen.goto(50, 50) pen.goto(0, 50) pen.goto(0, 0) pen.goto(50, 0) pen.hideturtle() turtle.done()
60 מעלות, וצריך 12 פקודות: שתיים לכל צלע. למצולע בעל 100 צלעות צריך 200 פקודות, ולכן נזדקק ללולאה בפרק 4.import turtle pen = turtle.Turtle() pen.forward(60) pen.left(60) pen.forward(60) pen.left(60) pen.forward(60) pen.left(60) pen.forward(60) pen.left(60) pen.forward(60) pen.left(60) pen.forward(60) pen.left(60) turtle.done()