LOGO – תכנות פונקציונלי

שפת לוגו (Logo) הינה שפת תכנות מתקדמת ומתוחכמת. זוהי גירסה ידידותית של שפת עיבוד הרשימות LISP – שפת הבינה המלאכותית. לוגו בנויה על פי עקרונות התכנות המבני (מודולרי), המאפשרים ראיית השלם כמורכב מחלקים עצמאיים – מבנה של פרוצדורות ופונקציות. עקרונות אלה מנחים את המתכנת למשמעת עבודה וסגנון תכנות נכון, לשם פיתוח של תכניות מורכבות, אש ניתן גם לפקח ולשלוט בהן ביעילות. – ISBN 965-361-003-1

OCR (הסבר)
3 ערך י. עמיהוד ספרי לימוד והפשהה בּמדעי המחשר הוצאת הודיעמי | 0 תכנות פונקציונלי .'. ₪ דיגכת, 6 60| 7 [ לכני משפחתי 2+קר+ככר: עיבוד תמלילים ועריכה לשונית: שרה עמ*הוד | )2020 תכנות פונקציונלי ש. מנולה ערך י. עמיהוד ספרי לימוד והכשרה במדעי המחשב . הוצאת הודיעמי 0 6 0 ם תו 08 .5 עס התג .1 עס 601600 )0( כל הזכויות שמורות הוצאת הוד-עמי לספרי מחשבים בע"מ ת.ד. 560, רמת-גן 52105 טל המשרד: 052-541207 אין להעתיק ספר זה או קטעים ממנו בשום צורה ובשום אמצע: אלקטרוני או מכני, לרבות צילום והקלטה, ללא אישור בכתב מאת ההוצאה, אלא לשם ציטוט קטעים קצרים בציון שם המקור הודפס בישראל שבט תשמ"ט, פברואר 1989 68 פשתקנת 11 4 ו1חז1/-1106 ת8)-התבת 560 .0.2.ק 9 ענת 0ס6ע ,157861 מסת"ב 965-361-003-1 158% ה ק ד מ ה שפת לוגו (12000) הינה שפת תכנות מתקדמת ומתוחכמת. זוהי גירסה ידידותית של שפת עיבוד הרשימות המתקדמת 1158 - שפת הבעה המלאכותית. לוגו בנויה על פי עקרונות התכנות המבני (מודולרי), המאפשרים ראיית השלם כמורכב מחלקים עצמאיים ‏ - מבנה של פרוצדורות ופונקציות. עקרונות אלה מנחים ‏ את המתכנת למשמעת עבודה וסגנון תכנות נכון, לשם פיתוח של תכניות מורכבות, אשר ניתן גם לפקח ולשלוט בהן ביעילות. לוגו הינה שפה בעלת אופי פונקציונלי ועל-כן עוסק הספר בעיקר בתכנות הפונקציונלי. הרכבת פונקציות הינה אמצעי עיקרי ליצירת ביטויים מורכבים בתכנות, ולשם כך נדרשות דרכי חשיבה חדשות ומתקדמות. מסיבה זו נמנעתי מלכלול הוראת הצבה להגדרת משתנה גלובלי כמו 'שאגא', כל עוד ניתן לוותר עליה. יתרה מזו, התכניות בלעדי 'שא4א' נכתבות באופן פשוט ואלגנטי *ותר. במהלך התיאור ולימוד השפה הצגתי בפני הקורא מושגים רבים מעולם מדעי המחשב, כמו משתנים, הליכים, פונקציות ועוד. הלומד <וכל להכיר את מבני הפיקוח השונים המוכרים בפתרון בעיות חישוביות (בעיות אלגוריתמיות), כמו המבנה הסידרתי, המבנה המפוצל, מבנה הלולאה, השיגרה ובעיקר - את המבנה הרקורסיבי. אין לי כל כוונה ללמד נושאים במתמטיקה, כמו תורת הקבוצות למשל, וגם לא נושאים במבנה המחשב כמו שיטות ספירה. לכן, ‏ יש להתייחס לסעיפים המכילים תרגילים העוסקים בנושאים אלה, כמיועדים לתלמיד אשר רכש ממקורות אחרים את הידע הבסיסי הדרוש. בספר ניתנים תרגילים רבים לדוגמה, הכוללים פתרונות מפורטים, הסברים ותיאור של שלבי פתרון. הם אינם מיועדים לחיקוי עיוור, אלא מכוונים להצגת דרכי חשיבה שיטתית ותהליכי עבודה מובנים לבניית הפתרון/התכנית. בכל פרק מוצגים התרגילים ברמת קושי עולה בהתאס להתקדמות הלימוד. ספר זה מתאים בעיקר לשפת 1.000 18%8. מכיון שההוראות הנלמדות בו שייכות לגירסה של 1.051 (6מך 5 ססטסטקם 00 0שס1), הוא מתאים גם למשתמשי הגירסה של 11 12000 מ1פע8 וגם למשתמשי הגירסה של 1000 מעסס). כללי התחביר והדוגמאות מתאימים לכל אחד מהם. במקום שקיימים הבדלים בין הגירסאות (ואלה מעטים בלבד), ניתנים לנוחות הקורא הערות, הסברים מפורטים והנחיות. בנספח ניתן תיאור של הגירסה של אצשקגתתמד/קזא, המתאימה גם למחשבי קומודור (₪ת0פסא 0ס6), כדי שגם משתמשי גירסה זו יוכלו להשתמש בספר. - 5 - תכנות פונקציונלי בשפת 1000 מיועד לתלמידים בבתי ספר תיכוניים ובאוניברסיטאות, ולכל מי שמעוניין | ללמוד ולהכיר שפה לוגית מתקדמת. הוא מכוון אל כל מי שמעדיף להתקדם בצעדים בטוחים באופן מבוקר, להגביר את הקצב ולקלוט נושאים חדשים. צעדי הצב של שפת 0 טובים ואף מומלצים למתחילים, אשר לומדים את העקרונות של שפת התכנות והגרפיקה ואינם בתחום העיסוק של ספר זה. תודתי נתונה לפרופ' יהושפט גבעון, שעזר לי בהערות:ו,| הדריך אותי בעצותיו, גילה לי מרעיונותיו ועודד אותי בהוצאת ספר זה לאור. אני מקווה שספר זה *עורר את התעניינותו של הלומד לחיפוש אחר אתגרים חדשים, ויעניק למשתמש בו את מלוא ההנאה שבהתלהבות היצירה. ש. מנולה תוכן העניינים פרק 1 - 1000 10 0₪ תמו 0 הוראת ההדפסה עַאזַתק, ‏ 11 שורת הוראה, ‏ 16 הדפסת רוות, ‏ 18 ניקוי מסך, ‏ 20 פעולות החשבון, ‏ 20 הוראת הבקרה ?גבמקתת, 22 ארגון ההדפסה, ‏ 23 25 ,0417 היהשהה הוראת‎ פרק 2 - תכנות מודולרי - הליכים ו הגדרת הליך, ‏ 27 כללים לכתיבה של שם הליך, 30 האלגוריתם, ‏ 32 פרק 3 - עריכת הליכים ‏ ....... 0 ההוראה עע (ַדַכע), 36 פקודות עריכה עבור 1000 188, 39 פקודות עריכה עבור 11 1/0060 ם)זקקה, פקודות עריכה עבור 10060 םקקה, ‏ 841 פקודות הפועלות על הליכים, ‏ 843 פרק % - השימוש במשתנים הגדרת משתנים בכותרת הליך, ‏ 85 העברת משתנים מהליך להליך, 50 פרמטר פורמלי ופרמטר אקטואלי, ‏ 51 משתנה מקומי ומשתנה לא-מקומי, ‏ 52 ביטוי כערך של משתנה, ‏ 55 פרק 5 - הוראות שימוש בדיסקט פרק 6 - משפטי תנאי ל הוראת התנאי ,18‏ 63 הוראת הסיום 59102, 66 הוראות תנאי מקוננות, 67 הוראת התנאי עסע1, 70 10 0000 >+התתתתתתחתת=-ש 27 16 2 57 02 פרק 7 - פרק 8 - פרק 9 - רקורסיה 22 ו הליך רקורסיבי, ‏ 73 6 הדפסה רקורסיבית, 78 הדפסת רצף של תווים המשמשים סמלים במתמטיקה, ‏ 79 הפעלת הליך רקורס*ב: מתוך הליך רקורסיבי אחר, ‏ 83 פונקציות נתונות 0:10 90 פונקציה, ארגומנט וערך הפונקציה, ‏ 90 פונקציות מתמטיות, ‏ 91 חישוב מספרים ראשוניים, 99 מספר מושלם, 102 חישובים אקראיים, 105 הצבת הסמן במסך - ,5₪1008908‏ 112 עריכת רשימה - הפונקציה מסאמזַא ,5₪‏ 113 מבוא לתכנות פונקציונלי ל 0 כ 10 הגדרת פונקציות, 118 פונקציה רקורסיבית, ‏ 122 האלגוריתם של אוקלידס, ‏ 123 תכניות חישוב בשברים פשוטים, 126 מהלך הביצוע של הליך רקורסיבי, ‏ 131 מהלך הביצוע של פונקציה רקורסיבית, 135 סידרת פיבונצ'י, ‏ 181 פרק 10 - ביטויים בוליאנים 7 ביטוי לוגי ופעולות לוגיות, ‏ 18% תכנית לבדיקת תקינות של תאריך, 148 חישוב פונקציונלי, ‏ 151 153 ,םיטקידרפ‎ פרק 11 > מיעים ורטלמוה 21.4.ו49והואאוורו-.-..-צואוצפיה [19 פונקציות בחירה, 158 פונקציות בדיקה, ‏ 16% תווים בקוד 85011, 170 הערות בתכנית, ‏ 172 פרק 12 - עיבוד רשימות כוטוהו0 וא ג)ש:שם:2:0-ואה0קחוהאוק. 18 פונקציות הרכבה, ‏ 17% קבוצות, ‏ 181 יצירת רשימות, 185 רשימה ממויינת, 187 חיפוש, ‏ 192 שיטה למיון מהיר, 195 פרק 13 - רשימות מקוננות 17 פרק 1% - תכניות אינטראקט'ב'ות ‏ ייינייייייייייל נספח א' נספח ב' נספח ג' נספח ד' נספח ה' נספח ו' איחוד של רשימות, 199 חישובים מתקדמים במספרים, ‏ 20% יצוג מספרים בשיטה המדעית, 208 קליטת תווים מן המקלדת, ‏ 211 פעולות חשבון בבסיס ת, ‏ 215 פרויקט: מכונה להדפסת שיקים במספרים ובמילים, 218 220 | - פונקציות קלט של רשימות, 228 רשימה דו-מימדית, ‏ 231 פרויקט: תכנית ל"ניחוש" הקלף שנבחר, ‏ 233 פרויקט: ניחוש קלף - רש'מה חד-מימדית, ‏ 212 הפרדיקט ‏ קצשא, ‏ 2487 פרויקט: דוגמה ליישום לומדה לגיל הרך, ‏ 249 ההוראה 1'/מקמת - הרחבות, ‏ 255 הפונקציה אשת, 258 פרויקט: דוגמה ליישום בחישובים עסקיים, 262 כת:יבה בעבר *ת ‏ :4:9 .2.0 271 פלט במדפסת, | 272 מפקון פקוד --5.גו4ו4)אופוהפורוהוורוווש-,.- 270 פקודות בספר, ‏ 275 פקודות נוספות בלוגו, ‏ 281 מעבר בין סוגי מסכים, 286 הנקמה +יאאוליו...-...1בו4ג.4ואו4. 207 פקודות מקבילות לגירסת 1051, 287 הבדלים בתחביר, ‏ 289 אינדקס תכניות דוגמה ‏ ...-...0:0:5441 55 24.0:0.-- 291 איגדקט הוהאצת א+%ו5וא)סחוטיצוהא.ואואו+4.... 2% ביצליוגרפיה ‏ .4:וג.פיפיא ...2:40.21 240 296 6 5% - ה - 0 סק אמ - 0 ₪ זסס) - 1 1000 קה - גירסאות לוגו אלו פותחו ע"י חברת 6 50809צ5 ע6סטקשס0 1060 - 1651. - 10 - פרק [ (1,00020 100 605 זב זוהי "קבלת הפנים" המופיעה על המסך, בה שפת לוגו מברכת אותנו, כאשר מטעינים אותה לזיכרון המחשב. בתחילת שורה חדשה מופיע התו 'סימן שאלה' (?). זוהי התווית של שפת לוגו, או סימן ההיכר של השפה, הקרוי באנגלית 6>קשסעק, ולידו מופיע ריבוע מהבהב (זהו הסמן, עספטט0). הסימן '?' מציין שלוגו מוכנה לקבל הוראות מאוצר הפקודות השייכות לה. הראת ההדפסה ]76 צאנזתת היא הוראת פלט המשמשת להדפטת דבר (8ת121) כלשהו על המסך. דבר יכול להיות תו, מילה, מספר, משפט (רשימה של מילים), ערך של ביטוי חשבוני, ערך של משתנה ועוד. מבנה המשפט: דבר צַאזאע או בקיצור: דבר הק יש להפריד בין המילה עַא81ק לבין המשך המשפט על-ידי תו-רווח. תו-הרווח בלוגו משמש להבחנה בין חלקי המשפט של השפה. בסוף מתן ההוראה יש ללחו על המקש <אתטצמת> (או <דַמת> בקיצור), ובכך להודיע למחשב שסיימנו לכתוב את הפקודה ועליו לבצעה כעת. יש מחשבים בהם שם מקש זה הוא <תמזַאם>, ויש אחרים שבהם המקש מסומן על-ידי חצ שמאלי בדמוי וו (1->)). = 11 = הדפסת נתון מספרי אם נכתוב '5 תק' ונלח על <אתט1מת> --%7 5 מק? המחשב ידפיס את המספר: 5 עוד דוגמה ---6> 8 תס? המחשב ידפ:ס: 18 ? בגמר ההדפסה מופיעה שוב התווית של לוגו (סימן השאלה '?') בראש שורה חדשה, ולידה הסמן המהבהב המציין שלוגו מוכנה לקבל הוראות חדשות. יש לזכור, שכל עוד לא הקשנו על <זַשת>, לא תהיה שום תגובה מן המחשב, ‏ כי אין הוא יודע אם סיימנו לכתוב את ההוראה או לא, אם רצינו לכתוב 5 או 510. בהוראה %₪? מתייחס המחשב לערכו של הנתון המספרי ולא לסיפרה המטסמלת אותו. כך הדבר גם לגבי הפעולות החשבוניות. אין המחשב מתייחס אל התו המסמל את פעולת החיבור '+' למשל, אלא למשמעות הפעולה עצמה והוא מבצע אותה בהתאם. לכן נוכל לבקש מהמחשב להדפיס לנו את ערכו של ביטוי חשבוני. כאטר נכתוב -7ד% /+5 (;? המחשב ידפיס: 9 1 כאן המחשב לא הדפיס את הסיפרה 5, את פעולת ההיבור ‏ '+' ואת הסיפרה ‏ % כפי שהצגנו זאת, אלא הוא חישב את ערך הביטוי '|+5' והזדפיס את התוצאה. אם היינו כותביס למחשב 5+8 בהשמטת ההוראה גע, היינוה מקבלים הערה כגון: ב 2-2 ב 2 שש 22 בש 2 42 בש 2 ב 22 2 ב 2 ,2-ב שש 2, ב- 20 בשש 2 הד 5 בא לש ל- == 9 וונ'עט סם סצ' ץ'אווש שסאא ע''אסס 1 מכיון שהמחשב מתייחס אל התוצאה כאל ערך, יש להורות לו מה לעשות בערך ‏ זה - האם לאחסן אותו, האם לערוך בו חישובים נוספים, האם להדפיס אותו. ההוראה 25, היא אחת הדרכים לפנייה למחשב. הדפסת מילה מילה יכולה להיות מורכבת מתו אחד או יותר. על מנת לגרום למחשב להתייחס למילה כאוסף של תווים ולא אל המשמעות שלה, יש להדפיס גרשיים (") בתחילת המילה. אם נכתוב ---6 נאזתק" הק? תופיע על המסך המילה: זאזתק לְ כאן מדפיט המחשב את רצף התווים המרכיבים את המילה 'דאזתס', מבלי לפרש את המשמעות שלה ומבלי לקבל אותה כהוראה שעליו לבצע. נוכל לבקש לכתוב כל מילה שנבחר, למשל: 10%תפ" הק? על המסך תופיע המילה: אסזג זז ? הגרשיים מציינים את תחילתה של מילה, וסופה מצוין על-ידי תו- הרווח, כפי שמציינים סוף של כל נתון בלוגו (ולא על-ידי גרשיים כפי שנהוג בשפות אחרות). אם נכתוב ---> "510%" הק? המחשב ידפיס: "0 7? הגרשיים שבסוף המילה 580% הם חלק בלתי נפרד ממנה, דבר שלא התכוונו אליו. הוראת 28 פועלת על דבר אחד בלבד. מילה נחשבת לדבר אחד, אך שתי מילים הן שני דברים. - 13 - אם נכתוב ---% 6אצאתסא" 6002" הק? המחשב *דפיס: 0002 אך יעיר לגבי המילה 'סא1אחסא': על הדרך לכתוב מילים אחדות בשורה אחת נלמד בהמשך. עוד דוגמה ---6 3 15 תק? 5 3 ותש 0 70 לגאש אסאא ע'אספ 1 ? בלוגו ניתן לכתוב *ותר מהוראה אחת בשורוז. כלומר, הקשת <זַמת3> באה אחרי כתיבת סידרה של הוראות בזו אחר זו, כל עוד מקפידים על הרווחים במקומות הנכונים. אם נכתוב ---> תגמצ" הק שמא" תק צקקגע" הק? יופיע על המסך הפלט הבא: צססות שטא ההמץ כפי שרואים, בכל אחת מהוראות 28 עובר הסמן בתום ההדפסה לתחילתה של שורה חדשה, ושם הוא מדפיס את הנתון הבא. כיצד, אם כן, ניתן להדפיס יותר ממילה אחת באותה השורה? הדפסת רשימה הדרך להדפיס מספר מילים, מספרים וכו', היא לתחום את כולם בתוך רשימה אחת בין שני סוגריים מרובעים, אחד שמאלי ']' ואחד ימנ: '['. כאשר נוהגים כך, א*ן צורך להקדים כל מילה בגרשיים, או לכתוב גת לפני כל נתון. - 14 - לדוגמה --7> [0א1אתסא 60002] הק? נקבל: סא1אתסא 0002 דוגמהינוספת ---> [תגמצ אמא צפקגה] הק? נקבל: תומצ שמא צפקאתה ועוד דוגמה ---> [88 23 15] תק? נקבל: 8 23 15 אוסף של נתונ*ם שתוחמים אותם בסוגריים מרובעים נקרא רשימה. גם כאן 28 פועלת על דבר אחד, והפעם זוהי רשימה. יש לציין שכל נתון הנמצא בתוך רשימה במשפט ההוראה תק, ה*נו חסר משמעות לגבי המחשב, ולכן הוא יודפס כפי שהוצג. אם נכתוב ---6> [3 * 45] תק? המחשב ידפיס: 3 * 45 . המחשב לא חישב את ערכוה של הביטוי החשבוני, ולכן לא הודפסה התוצאה, אלא הופיעו על המסך הנתונים שברשימה. הערה: בדוגמאות שלמעלה סומנו הסוגריים המרובעים בהדגשה. הדבר נעשה לצורך הלימוד בלבד, ואין זה חלק מצורת הכתיבה בלוגו. בהמשך נסמן לעיתים קרובות הוראות, או נדגיש לשם הבלטה, לשם לימוד בלבד. הדפסת מספר דברים הדרך להדפיס מספר דברים בשורה היא לתחום את משפט ההוראה ב*ן שני סוגריים עגולים. כלומר, ‏ יש להקדים את הפקודה תק בסוגר שמאלי ')', ולסיים את המשפט בסוגר *מני '('. = 1 = המבנה הכללי: (דברת ‏ ... דבר2 דבר1. 8ת) לדוגמה ---> (2000 [תהסצ שמא] צפפגת" תק)? על המסך יופיע המשפט: 0 תגמצ שמא צעקקגהת ? נסה לגלות מה ידפיס המחשב כאשר נרשום את ההוראה הבאה: ]238 + 420 =[ 238 + 420(‏ תק)? רת הוראה מספר התווים בשורה בלוגו הוא 128. זוה שורת הוראה לוגית הנקלטת על-ידי המחשב, ולא שורה פיזית, שהיא לא יותר מ-40 או 80 תווים. כאשר מזינים מספר רב של דברים, ללא הקשה על <> בעת כתיבת הוראה ומגיעים לסוף השורה הפיזית, מופיע במקום ה-80 ח> ימינה 'ל<--' בגירסה של 1000 א18%, או סימן קריאה '!' בגירסה של :דצ 0060 םזקקה ושל 1000 םתקקג. זהו ציון לכך שאין זה סוף שורת הוראה. הסמן ‏ עובר לשורה פיזית חדשה, כדי לאפשר לנו לרשום את המשך המשפט. רצוי לבדוק לפני כל לחיצה על <זשת>, אם מה שכתבת ‏ זה אכן מה שרצית לכתוב. למשל, אם לא כתבת 228 במקום תק, אולי שכחת רוותח במקום שצריך ורשמת 1/0מת"תע במקום 0תתטא" הע, או אם חסר סוגר מרובע ‏ או עגול במקום המתאים. ניתן לערוך תיקונים כל עוד הסמן נמצא באותה שורת הוראה, ולא עבר לתחילת שורה חדשה. - ב-1,000 18% התיקון נעשה בעזרת מקש החף לאחור (שסעעה8-886%), אשר בכל הקשה מוחק תו אחד משמאל לסמן. בדרך זו ני*תן למחוק תווים לא רצויים ולכתוב אחרים. - | ב-11 10060 ₪/סק8 מחיקת תו שמשמאל לסמן נעשית באמצעות מקש מטפס. - 16 - = ב-1000 ₪קק מבצע תפקיד זה החהף השמאל?' '--6'. דרך אחרת לתיקון, היא על-ידי הזזת הסמן עד לאיזור השג:אה: - ב-1000 188 וב-11 10060 ₪ם/קק8 נעשה הדבר באמצעות התף השמאלי, אשר מניע את הסמן לתו שמשמאלו מבלי למחוק אותו. כך ניתן להגיע לאיזור השגיאה, לתקן את הנדרש, להוסיף תו שחהסר וכו'. - ב-1000 ט]קק יש ללחו על המקש <[018>, ובעודו לחוצ להקיש את האות '8' (א540%). הכתיבה בלוגו נעשית בשיטת מפ0א-אפטסק או מפסא-דתמפא1. אין חשש שתו חדש "יעלה" על תו קיים, מפני שכל השורה מן הסמן והלאה זזה ימינה ומפנה מקום לתו שהוכנס. לאחר התיקון יש להניע את הסמן ימינה לסוף השורה, בעזרת חף ימין 'ל--', על מנת להמשיך היכן שהפסקנו. אם אחר* שלחצת על <זַשת>, הודיע לך המחשב הערה כתוצאה משגיאת כתיב, ניתן לחסוך בכתיבת כל המשפט מחדש. השתמש בפעולה המעתיקה את המשפט האחרון שנכתב: - | ב-1000 18% הדבר נעשה על ידי הקשת <73>. - | ב-11 1000 40/8 יש ללחוצ על <ת01> ובעודו לחוצ להקיש על מקש האות 'א'. - וב-0000 ₪קק - על-ידי לחיצה על <010> ועל מקש האות "יי פעולה זו תעתיק על המסך את כל השורה שנכתבה לפני הקשת ה-<עשת> האחרון, כשהסמן מופיע בסופה. במצב זה ניתן לערוך את התיקון הדרוש כפי שהוסבר לע:יל. דילוג שורה אם תרצה שהמחשב ידלג על שורה מבלי להדפיס בה דבר, ותרשום את הפקודה 28 ללא דבר כלשהו להדפסה ---> מק? תקבל את ההודעה הבאה בגירסת 0060 אם1: - 17 - אנוה לומדים מכך, שהוראת 5ת בלוגו דורשת קלט, אשר כולל דבר אחד או דברים אחדים. הערה: ב-10060 א18%, ב-11 10060 מתקק8 וב-1000 ממקק ‏ יש הודעות שגיאה שונות במעט זו מזו. איך נוכל, אם כן, לדלג על שורה, להשאיר שורת רווח ולעבור לשורה חדשה? זאת נעשה א. באמצעות הרשימה הריקה '[]' (= הסוגר*ים המרובעים, כאשר לא מופיע ביניהם כל תו). ב. באמצעות המילה הריקה '"' (= גרשיים, כאשר אף לא תו אחד רשום אחריהם). נוכל לכתוב כך ---6 [] אק? או כך ---%> " הק? בכל אחד משני המקרים יעבור הסמן לתחילת שורה חדשה מבל* להדפיס בר הדפסת רו ות תו-הרווח משמש בלוגו להבחנה בין נתון לנתון. אין חשיבות לכך שנפריד בין שני נתונים בהקשת תו-רווח אחד או *ותר, כי תמיד יופיע בפלט תו-רווח אחד בלבד בין שני נתונים. לעתים יש צורך להדפיס תו-רווח אחד ‏ או *ותר לפנ* נתונים או ביניהם. כיצד נוכל להורות למחשב להדפיס את תו-הרווח, כך שהוא יופיע על המסך כרווח ' ' (%ם218)? - 18 - אנו נעזרים לשם כך בתו הלוכסן היורד '' (ת5188 א280), אשר מתקבל על-ידי הקשת המקש המתאים. אחרי הלוכסן, מימין, משאירים את תווי הרווח הדרושים. ב-10060 ₪ זקק8 אפשר להשתמש בשני מקשים - מקש <0181> ובעודו לחו> יש ללחו על מקש האות '6'. כל תו שיוקש אחרי הלוכסן, בכלל זה גם תו-הרווח, יתקבל על-:ד: המחשב כנתון, ולא יפוענח על-פ5י המשמעות שלו בלוגו. הערה: לצורך ההסבר בדוגמאות אשר נביא בספר, נשתמש באות 'ס' כד: לציין תו-רווח ' '. אם נכתוב ---> %8" מק? המחשב ידפיס את המילה 8408ק, בהשאירו רווח אחד בתחילת השורה: טס ? אם נרצה להדפיס את המילה במרחק של חמשה רווחים מתחילת השורה, נכתוב זאת כך ---> ₪ פסספססס" ק? נקבל (5 תוו* רווח משמאל!) ₪ סססססס 7 שים לב- כדי להדפיס תו-רווח דרוש לוכסן. תו-רווח שלא נמצא אחר: לוכסן מתקבל על-ידי המחשב על-5* המשמעות שלו בלוגו, כלומר, הוא יורה על סוף נתון. לפניך עוד דוגמה ונסה להבין כיצד היא פועלת: (האאתמס" ס" 3אאה1םת" ס" 2אאהגמס" 1אאה:פס" תק)? נקבל: - האאה 3001 אא1.1פססס2אא,זמסס1אאג.זמס שים לב כמה רווחים יש לפני כל נתון. התוכל לומר כיצד זה קורה? לנוחותך בלבד סומן כל רווח בפלט באמצעות האות 'ס', אשר אינה מהווה חלק מהתשובה. - 19 - גיקוי סך ניתן להבחין, שכאשר מסיימים לרשןום בשורה האחרונה, נעלמת השורה הראשונה מן'המסך כתוצאה מגלגול השורות כלפי מעלה. כך מקבלים שורה חדשה בשורה האחרונה שהתפנתה. גלגול המסך מאפשר הוספת שורה בתחתית המסך להמשך הכתיבה. אך מה נעשה אם נרצה למחוק את כל המסך על מנת להתחיל מחדש בשורה הראשונה שלו? ההוראה | את כאשר רושמים הוראה זו מקבלים מסך נקי, כשבפינה השמאלית העליונה מופיע התו '?', ולידו - הסמן המהבהב. ב-1000 188 וב-11 10000 ₪ קק8 ניתן להשתמש גם בקיצור 67. לדוגמה, (ק'ש ---> א ונקבל בראש המסך משמאל: ? פעולות החטב | סימני פעולות החשבון בלוגו הם: חיבור '+' חיסור '-' כפל 'שי חילוק '/' לחיבור ולחיסור משתמשים בסמלים הרגילים המוכרים לנו. בנוסף לפעולת החיסור, ‏ מציין סימן המינוס מספר שלילי, אם הוא מופיע צמוד למספר משמאל ללא רווח ביניהם. אם נכתוב ---6 8- 7 תק? המחשב ידפיס: , 7 אך יעיר את ההערה על כך שאין לו הוראה לגב 4-: = 20 - לכפל אין אנו יכולים להשתמש בנקודה '.', כמו למשל ‏ '3.48' בשל הבלבול אשר יכול להיגרם בינה לבין הנקודה העשרונית. הדבר נכון גם לגבי ה'איקס' כמו '%א3', שיגרום בקלות לבלבול עם האות 'א'. לכן| בלוגו, כמו ברוב שפות המחשב, אנו משתמשים בכוכבית '*' לסימול פעולת הכפל: 3*4. לחילוק, הסמל המקובל ברוב שפות המחשב הוא לוכסן ‏ '/' כמו '12/3', ולא הנקודתיים כמו '12:3', אשר נועד להן תפקיד חשוב אחר. ב-11 00060 מוקקה יש להקפיד על תו-רווח משני צידי סימן החילוק. אין לרשום '56/7' אלא '7 / 56'. יש לזכור שהחלוקה באפס אינה מוגדרת. אם רוצים לקבוע עדיפות כלשהי לביצוע חלק, או חלקים של ביטן: חשבוני, יש להשתמש בסוגרים. הכללים בשימוש בהם, ‏ או בהשמטתם, דומים לאלה הנהוגים באלגברה. בלוגו, כמו במתמטיקה, הביטוי 2+5*3 פירושו (5*3)+2 והתוצאה היא 7. אם רוצים לכתוב 2+5(*3) אשר התוצאה שלו היא .21, יש להשתמש בסוגריים על מנת להבטיח תרגום נכון של הביטו'*. סדר הביצוע של פעולות החשבון הינו כמקובל באלגברה: א. פעולות הכפל והחילוק מתבצעות לפני* פעולות החיבור והחיטסור. ב. פעולות בעלות אותה עדיפות מתבצעות משמאל לימין. ג. כאשר יש סוגריים מבצעים תחילה את הפעולות הרשומות בתוכם, לפי כללים א ו-ב לע'יל. ד. אם יש סוגריים במספר רמות (כלומר "סוגריים בתוך סוגריים"), מבצעים תחילה את הביטוי שבסוגריים הפנימיים ביותר. שים לב, - הביטוי 24/6*2 שונה מן הביפוי (21/)6*2, - הביטוי 2/8+3 שונה מן הביטוי (2/)8+3, וכדומה. - 21 - הרראת הבקרה ‏ וחקת זאמקסת היא פקודה לביצוע חוזר של רשימת הוראות מספר פעמים. ההוראות שיש לבצע ת פעמים מוצגות בין שנ* סוגריים מרובעים. המספר ‏ ת, חייב להיות בעל ערך חיובי. ב-000 מ]קק ערך זה לא יהיה גדול מ-65535. ערוך בדיקה וגלה בעצמך מהו הערך המקסימלי בגירסה שבידיך. המבנה הכלל*: [הוראה אחת או יותר] םת ץהמעמת דוגמה ---%> [" אע [2000 10 מא00מא] תק] 3 דהמקטת? הפלט יהיה: 0 0 מאסס.טא 0 20 מא0סס,זטש 0 0ץע' מאסס.זטש משפט זה יגרום להדפסת הברכה '1060 710 ₪א00%מ₪' 3 פעמים, כאשר אחרי כל הדפסה מופיעה שורת רווח. האם גילית למה יש שורת רווח? תרג ילים 1. כתוב שורת הוראות למחשב להדפסת הפלט הבא: 4 4 4 )ג | 248 142 4 ב(44222 444 - 22 - 2. כתוב הוראה להדפסת הביטוי החשבוני '=(2+30/3)-5+8*1' והערך שלו, לאחר שחושב על-ידי המחשב. עם ביצוע ההוראה יודפס הפלט על המסך: 9= (2+30/3) -[*5+8 3. כתוב הוראה למילוי המסך במילה 'המצטשקא00', אם ידוע לך שיש 4 שורות פיזיות במסך. נסה זאת גם עם השם שלך. 8%. כתוב שורת הוראות להדפסת ריבוע הנוצר על-ידי רצף של האות 2, כך שכל צלע תהיה בנויה מ-10 תווי 2 למשל. ארג | החדנטה כבר הזכרנו שהמסך מחולק ל-40 עמודות ול-21 שורות, ובגירסה של 0 186 - 25 שורות. העמודה '0' מציינת את העמודה הראשונה בכל שורה. תנועת הסמן היא משמאל לימין עד לעמודה ה-'38'. כזכור, עמודה '39' שהיא האחרונה בכל שורה, מיועדת לצ:ון "המשך" באמצעות סימן קריאה או חצ בהתאם לגירסת לוגו שברשותך. ציון השורות נעשה מלמעלה למטה, כאשר הסיפרה '0' מציינת את השורה הראשונה ו-'21' - את האחרונה בגירסה של 2000 א18%, ובגירסה של מע - '23' מציין את השורה האחרונה. הערה: ב-12000 184 וב-11 1000 תקסה יש אפשרות להרחיב את המסך ל-80 עמודות על-ידי השימוש בהוראה 5₪01818. באמצעות הוראה זו ניתן לקבוע ת עמודות בשורה הפיזית. לדוגמה -+-> 00| ו כתוצאה נקבל מסך, שבו נוכל לרשום עד 80 תווים בכל שורה. - 23 - ההוראה 501008508 ישנה בלוגו הוראה המאפשרת לקבוע את מקומו של הסמן על המסך כד: לערוך את ההדפסה במקום הרצוי לנו. הוראה זו דורשת קלט בצורת רשימה, ובה שני ערכים. ב-1000 18% הערך הראשון מורה על השורה (קואורדינטה ) והערך השני - על העמודה (הקואורדינטה א). המבנה הכללי: [א עַ] 507008508 ב-11 1000 ₪פקא וב-1000 ₪]קק8 הערך הראשון מצביע על העמודה (קואורדינטה א) והערך השני - על השורה (קואורדינטה צ). המבנה הכללי: [ע א] 581008508 להלן הוראה המדפיסה את הברכה צבכה7ת81 צקקג במרכז המסך: [צאסמדת1ם צקקגו] תק [13 11] 5₪1008508? בחישוב פשוט מצאנו שהשורה האמצעית במסך היא השורה ‏ '11', ועל התו הראשון להופיע בעמודה '13'. לכן נתנו הוראה למקם את הסמן בנקודה (11,13). כאשר תתבצע הוראת ההדפסה, הופעת התו הראשון של הפלט יהיה במקום שבו נמצא הסמן. הערה: על המשתמשים בגירסה של 11 10060 מוסקה או 10060 מוסקה להציב את הערכים בסדר הפוך, כלומר תחילה קואורדינטה א ואחר-כך צ ובדוגמה שלנו: ?5₪1003508 ]13 11[ - 28 - נכתוב כעת הוראה הגורמת להופעת ברכה זו והעלמתה לסירוגין מספר פעמים: [[צגפוותתדם צסקגזה] תע [13 11] 50100508 לאמדתהם 1ס] 20 [המפתת? בשל מהירות הביצוע תופיע הברכה ותעלם בקצב מהיר מדי. כדי להאיט את הקצב של לוגו נשתמש בהוראה 0411. הרראת ההשהייה 11 זוהי הוראת השהייה, המקבלת קלט של ערך מספרי. ערך זה מורה על משך זמן ההמתנה הנדרש מן המחשב, עד לביצוע ההוראה הבאה. המבנה הוא: ם ₪17 רק לאחר שיחלוף הזמן הרשום בקלט ביחידות האופייניות לגירסה שבה פועלת התכנ*ית, ימשיך המחשב בביצוע ההוראה העוקבת אחר ההוראה צזהט. בדוק ומצא מה צריך להיות ערכו של ם על מנת שהמחשב ימתין שנייה שלימה. ברשימת ההוראות של עהמעתת נוסיף הוראת השהייה לפני ההוראה צאמדתס ואחריה, וכך נאט את הקצב:- [ [13 11] 581000508 25 ₪11 דאתנת01 25 תזגש] 20 דהמקמת? [‏ צגפוודתזט צקסגא] תק = 259 - תרג ילים (המשך) .5 .6 כתוב שורת הוראות היוצרת כרטיס ברכה (מסך ברכה) לשנה החדשה. כתוב הוראה לחישוב מספר הנרות הדרושים לכל *מי חג החנוכה. על ההוראה להציג את כל הביטו* ואת ערכו. - 26 - פרק 2 תכנות מודולרי - הליכים עד עתה כתבנו שורת פקודות למחשב, ולאחריהן הקשנו <אתט[טה> כדי שהן *חלו להתבצע. אלו הן למעשה פקודות ישירות. נוהגים כך כאשר נמצאים במצב הרגיל של לוגו, והוא מזוהה כאמור, על-ידי סימן השאלה '?' שהוא ה-6>קשסעק של השפה. במצב זה, ‏ עם סיום ביצוע ההוראות, המשפטים שכתבנו לא נשמרים בזיכרון, פרט למשפט האחרון. על כן, אם נרצה שהמחשב *חזור על ביצוע אותן ההוראות, יהיה עלינו לכתבן ‏ שוב. מהו, איפוא, הפתרון ? הגדרת הליך אחת הדרכים לשמירת סידרת הוראות בזיכרון, היא על-ידי הגדרה של הליך (6עט666ס2ק). ההליך בנוי מ:- א. כותרת המתחילה במילה 10. ב. גוף ההליך המורכב מסידרת הוראות. ג. המילה פאם לציון סוף ההגדרה. מילת המפתח היא 10 ולידה שם ההליך. שם זה הוא לפי בחירתנו כל עוד נשמור על מספר כללים, אך רצוי לבחור בשם בעל משמעות המזכיר את משימת ההליך. שם זה *יהפך בסופו של דבר, למילה של לוגו. - 2] - עם לחיצה על <זעת>, נעלם סימן השאלה '?' ומופיע במקומו סימן היחס ‏ '<' , המציין שנמצאים במצב של הגדרה. סימן זה יופיע בתחילת כל שורה חדשה בכל פעם שנסיים שורת הוראות. כל הוראה שתיכתב תהיה חלק מהוראות ההליך, והיא תתבצע רק עם הרצתו מאוחר יותר. שפת לוגו הינה מסוג פרשן (אינטרפרטר ‏ - ש606עסת66ת1). כלומר, תרגום משפט ההוראה או ההוראות לשפת מכונה, מתבצע בתום כל שורה. במצב הרגיל, כאשר כותבים פקודות ישירות, הפרשן נכנס לפעולה לאחר כל <ז1שת>. לעומת זאת, בשלבי ההגדרה אין כלל בדיקה, כך שהערות לגב שגיאות בהליך (אם ישנן כאלו) נקבל עם ביצוע ההוראות בזמן ההרצה. על מנת לצאת ממצב הגדרה למצב הרגיל של לוגו, יש לכתוב את המילה עאםע בשורה נפרדת ולהקיש <[שת>. ברגע זה לוגו תודיע לנו כ 'שם ההליך' מוגדר ואז יופיע שוב סימן השאלה '?'. לשם ביצוע ההוראות המרכיבות את ההליך, יש לרשום את שם ההליך ולהקיש <1שת> כדי שהמחשב יתחיל בביצוע. שים לב - כל עוד לא כתבת את המילה פאע, לא תוכל לפנות ללוגו. דוגמה להגדרת הליך: חישוב היקף של מלבן ושטחו, כאשר אורכו הוא 50 ורוחבו הוא 30. אפם זה 70? ( ( 30 + 50 ) * 2 [ 15 שמאדמת מחד ] מק )< ( 30 * 50 [ 18 מהנמחפ מחד ] תק )< פאם< פמא1עפת 15 אםם זא ל כעת (מצא בזיכרון המחשב הליך בשם אמ8]הא. שם זה מתוסף לאוצר הפקודות של לוגו, באופן שבו נוכל להשתמש בו כמו בכל הוראה אחרת. = 28 - נכתוב ---6 אחם וא? כתוצאה, תתבצענה הפקודות המרכיבות את ההליך ונקבל את הפלט הבא: 0 15 סמאדטת ממך 0 15 611 מצך ? כל מילה שאין גרשיים בתחילתה, מובנת על-ידי לוגו כמשימה שיש לבצע, ולא כרצף של תווים. המחשב קיבל את המילה אממ ]גא ומכיון שאין פקודה כזו, הוא הבין אותה כשם של הליך, ולא כרצף של תווים. הוא פענהחה את ההליך וביצע את המשימה המתבקשת מההוראות הכתובות בהליך זה. אם כתבנו מילה שאינה מוגדרת בלוגו, או טעינו באיות השם וכתבנו אז8]א למשל, האות '1' במקום האות '₪', היינו מקבלים את ההערה הבאה: גם כאשר נרשום 0188קא008 מע, כדי להדפיס את המילה 'תמדסקאסס6י ונשכח להקדים אותה בגרשיים, לוגו תתייחס אל 0080788 כאל הליך. כשלא תמצא אותו נקבל את ההערה: 00 70 אסא אסאא צ'אספ 1 כל הליך שמגדירים נשמר בזיכרון במהלך העבודה. מחיקת הליך נעשית באמצעות ההוראה 458חע, ובקיצור חםת. כותבים את ההוראה ואת שם ההליך שברצוננו למחוק, אך יש להקדים את השם בגרשיים. לדוגמה, ההוראה אםם,]4א" מפהתת, תגרום למחיקת ההליך אממוגא מן הזיכרון. נסו לנחש ‏ - מה לוגו תעיר לנו אם נכתוב לאחר מכן - 29 - אמם]הא? נכון! היא תעיר: אמםשבא 10 אס₪ לסאא צ'אסס 1. כללים לכתיבה ל ס הליך שם ההליך נבחר לפי הכללים הבאים: א. אין להשתמש במילים הנתונות של לוגו. אם נכתוב --%7 דהמקטת 70 נקבל את ההערה הבאה: כל המילים הנתונות בלוגו הן אעצעזאזהק, כלומר, מילים קדומות, שהוגדרו בעת יצירת השפה. הערה: קיימת דרן המאפשרת להשתמש במילים הנתונות של לוגו, אך לא נעסוק בכך בספר זה. ב. שם יכול להיות מורכב מרצף של אותיות וספרות וכל תו אחר, פרט לתווים המסמלים פעולות אריתמטיות, פעולות יחס, סוגר*יים עגולים וסוגריים מרובעים. לדוגמה, מילים חוקיות בלוגו: 0, 15%, 5₪440%. אם נרצה להשתמש בשם המורכב משת: מילים, נוכל לכלול בו נקודה לשיפור הקר:אות, למשל פדאזיד. אמח5, | או מקף-תחתון-מחבר כמו מ1א740 %מחפ5, אך לא מקף אמצעי המשמש גם לסימן המינוס '-', כמו מדא141-אמחפ. ג. אסור לבחור בשם המורכב כולו מספרות. אם נכתוב --7> 3 70 נקבל את ההערה הבאה: ד. אין לבחור בשם המוגדר כבר בזיכרון. אם נכתוב שוב ---%> אאא 70 נקבל את ההערה הבאה: נוכל כמובן לבחור במילה 1א4188א כי די בתו אחד שונה על-מנת שהשם יהיה שונה. כתוב כעת הליך הגורם להצגת הפלט הבא: א אא אא אאאאת א א א א א א אאא א אאאאא אאת <> <> ב ההליך 4א584 ידפיס א-ים כדי ליצור את המילה שנה בשיטת הגרפיקה למחצה (108ת56₪1-0280). הגדרת ההליך 4א514 אגס 70? [א א אס אאסס אאאאאס] תק [א א אס אפםס א ספספ] אק< [א א אס אפפס א פ אס] הק] 2 צגמפטת< [אאאאאס אאאס א פ אס] אס< " הק< פאם< ָ? שים לב, שאחת הפקודות תבוצע פעמיים באמצעות הפקודה ץגמקטת, כד: להדפיס שתי שורות זהות. נכתוב גאג5₪ ונקבל את שרטוט המילה שנה על המסך. באותה שיטה נוכל לכתוב הליך 1008 המשרטט את המילה טובה, ‏ או הליך 198(9+ - 31 - ליצירת המספר 1989, או כל מספר אחר. כאמור, ‏ יש באפשרותנו להשתמש בכל הליך שהגדרנו, ואשר נמצא בזיכרון, כמו בכל פקודה אחרת בלוגו. נוכל לכתוב למשל ---> 9 האתגדפ 1004 בא514? המחשב יפנה אל ההליכים הכתובים בשורת הוראות ‏ זו ויבצע אותם בהתאם לנדרש: תחילה הוא יבצע את ההליך גא584, לאחר מכן את 4, ושוב את באגח5 ולבסוף - את ההליך 1989+. פנייה להליך מתוך הליך נוכל לפנות אל הליך המוגדר כבר בזיכרון, מתוך הגדרה של הליך אחר. כלומר, הליכים יכולים להיות חלק מההוראות של אותו הליך. דוגמה - תהמצ. שמא 70? [4ע0ד גא5184] 20 [המקטת< עאט< ? נסה למצוא מה יבצע ההליך תהמצץ.אפא. האלג ריתם הליך היא תכנית המורכבת מסידרת הוראות הניתנות לביצוע, כד: לקבל את הפלט הרצוי. סידרת הוראות כזו נקראת אלגוריתם. השם אלגוריתם (מת1%ע4180) הוא על שמו של המתמטיקן הערבי אל- חואריזמי מן המאה התשיעית לפנה"ס, אשר חיבר ספרי יסוד באלגברה. בימי הביניים השתמשו במונח זה עבור תהליך ביצוע של פעולות- חשבון פשוטות על סמךך שיטת הסימון ההודית-ערבית. היום משמש - 32 - המושג "אלגוריתם", כדי לתאר תהליך של חישוב בסמלים לפי חוקים קבועים הניתן לביצוע על-ידי מכונה, אשר מאפשר פתרון של בעיות נתונות. בתחום המחשבים, האלגוריתם מתאר את התהליך שעל המחשב לבצע על מנת לחשב ולפלוט את התוצאה המבוקשת. האלגוריתם הפשוט הוא בעל מבנה סידרתי, שההוראות בו מבוצעות זו אחר זו לפי סדר הופעתן בתכנית. מבנה אחר פגשנו בלימוד הפקודה [המעחת, המציגה מבנה של לולאה שבו ההוראות חוזרות על עצמן מספר פעמים. בהגדרת הליך השתמשנו בפקודות הבסיסיות השייכות לשפה, אשר מוגדרות בדרך שתוכלנה להתבצע על-ידי המחשב ללא פירוט נוסף. המחשב מקבל את ההוראה, מפענח ומבצע אותה. מילה לא מוכרת בשפהת גורמת להפסקת הביצוע בליווי הערת שגיאה. ראינו שנוסף על המילים הבסיסיות של השפה, מאפשרת לוגו להגדיר מילים חדשות לביצוע משימה שהגדרנו בעצמנו, כמו למשל גאג91. הליך זה מורכב מסידרת הוראות יסודיות, שאותן 'יודע' המחשב לבצע. הגדרת הליכים והשימוש בהם כמו בכל פקודה אחרת המוגדרת בלוגו מאפשרת את יישום התכנות המודולרי. תכנית גדולה ניתן לפצל לכמה הליכים או תת-הליכים, כשלכל הליך תפקיד יותר מצומצם. כך הופכת הגדרת התכנית השלימה לפשוטה יותר, מובנת יותר ונוחה לתיקון. בתכנות מבני (תכנות מודולרי, או שתנשמשהתפס?ת 66עטש60ט562) בונים את התכנית השלימה על-ידי השימוש בהליכים שכבר הוגדרו. - 33 - תרג'לים .5 כתוב הליך 100/84 ליצירת הפלט הבא: אאא א אא אאאא אאאאג אא א א א א א א א א א א א א א א א א אאאאא א אאאאא | << א< הגדר את ההליך 4א584 ושמור אותו בזיכרון המחשב. כתוב לאחר מכן את ההליך ההמצ.שמא והרא אותו. כתוב הליך אשר ישרטט באמצעות אותיות מתאימות את המילה 0. מבנה הפלט: 000 00 0000 ו 06000 0060 0 70 0-0 0-08 7 0( 0 6000 0-0 1 00 0606 0 12 000 00 00| כתוב הליך ג1אשאגא 10 ליצירת חנוכיה במרכז המסך, בשיטת 8 . המנע משימוש בתווים המשמשים סמלים במתמטיקה. כתוב הליך :01 10 המחשב בשבועות ובימים את גילו של ילד בן שבע שנים. תחילה הוא יחשב את הגיל בשבועות (בהנחה שיש 52 שבועות בשנה) ולאחר מכן - בימים (בהנחה שיש 365 *ום בשנה). על המסך יופיע הפלט הבא: 00 פאמטט מספר 1‏ 165 204% מחך 02 פצגע מספר 2‏ 16 צסם מאך במקום 'מספר1' יירשם הערך שמהווה את גיל הילד בשבועות כפי שחושב על-ידי המחשב. במקום 'מספר2' - יירשם הגיל בימים, אשר חושב אף הוא על-ידי המחשב. . 8 = לד(:* הציונים הבאים: 85, 70 ו-90. חשב והדפס את הממוצע שלהם עם הודעה מתאימה, למשל: מספר 15 מבגתטטה מתחד. כעס מאוד כאשר סבו החליט להעניק לו דמי חנוכה באופן ביום הראשון נתן לו שקל אחד. ביום השני נתן לו כפולה של הסכום שקיבל ביום הקודם. ביום השלישי נתן לו 3 פעמים הסכום של היום שלפניו. ביום הרביעי נתן לו % פעמים הסכום של היום שלפניו. ביום השמיני נתן לו 8 פעמים הסכום של היום השביעי. בסיו מו של חג החנוכה היה יוסי מאושר מאוד. כתוב הליך המחשב את הסכום שקיבל *וסי ביום השמיני. מהו סכום דמי החנוכה שקיבל יוסי, אם ביום הראשון קיבל שקל אחד בלבד? ומהו הסכום של דמי* החנוכה אם קיבל ביום הראשון % שקלים? = 39 = פרק 3 עריכת הליכים עד כה הכרנו את מסך העבודה של לוגו. במסך זה אנו נותנים הוראות ולוגו מבצעת, ואם שוגים במתן הוראה כלשה* - לוגו מעירה. במסך זה גם מגדירים הל*כים ומריצים אותם. במסך העבודה לוגו מגיבה בהתאם להוראות שהיא מקבלת. במסך העבודה אין אפשרות לערוך שינויים, או לתקן שגיאות, אלא רק בשורה שבה (מצא הסמן. גם לא ניתן להוסיף הוראה ששכחנו לרשום בהליך. לא פעם היינו צריכים להגדיר את כל ההליך מחדש בשל מגבלה זו. למזלנו, מלבד מסך העבודה, ישנו מסך אחר המ*ועד לעריכה בלבד, בו ניתן לכתוב הליכים, לערוך בהם שינויים, לתקן שגיאות ולהוסיף הוראות במקרה הצורך. בנוסף, אין במסך זה מגבלה של מספר תווים לשורת הוראה, כפי* שקיים במסך העבודה (128 תוו:ם). ההראה ₪2 (1911) הכניסה למסך העריכה נעשית עם ההוראה ₪2 (עורך - 005ס₪61). לאחר הקשת <זַש3> מקבלים מסך ריק, כשהסמן המהבהב נמצא בפינתו השמאלית העליונה. בתחתיתו נמצא שורה מוארת ובה כתוב 08זזקע 1000, אך לא נמצא בה את סימן השאלה. נוכל לכתוב הליכים בהתאם לכללים שלמדנו, דהיינו, להתחיל ב-10 את שורת הכותרת ולידה לכתוב את שם ההליך, למשל ‏ 01. בשורות הבאות רושמים סידרת הוראות ולבסוף, בטורה נפרדת, את מילת הסיום פאם. - 36 - אמרנו 'לכתוב', אך לא אמרנו 'להגדיר'. כלומר, המסך משמש כטיוטה בלבד ולכן לוגו לא תגיב על שום הוראה שנרשום במסך זה, אפילו לא אחרי שסיימנו ב-פאם. היציאה מן העורך אל מסך העבודה נעשית בשתי דרכים: 1. אישור ללוגו לשמור את אשר כתבנו בזיכרון המחשב, ולקבוע שההליך יהיה 'מוגדר'. - | ב-1000 18% הדבר נעשה באמצעות מקש ל₪560>. - | ב-11 1/0060 ₪]"קק8 עושים זאת בהקשת מקש 'תפוח' ומקש האות '4' בו זמנית. - ב-1000 ₪/תקק ‏ - בלחיצה על מקש <1ע0%6> והאות '6' בו- זמנית. ואכן עם המעבר למסך העבודה נקבל את ההודעה: סמאזעטת 15 610. 2. :ציאה מן העורך ללא הגדרה, מבל: להתחשב אם בוצע ש'ינוי, תיקון או כתיבת הליך חדש. כל מה שנכתב ישאר רק בעורך, בשטח העבודה השמור לו בזיכרון המחשב. בדרך זו, ההוראות שנכתבו זה עתה לא תהיינה מוגדרות בלוגו, ולא נקבל את ההודעה על הגדרה כלשה'. - | ב-1000 אם1 נעשה זאת בלחיצה על <1ע062> ועל המקש <68%ע>. - ב-11 1000 ₪/קק ‏ - בלחיצה על מקש 'תפוח לבן' ומקש <080>. - | ב-1000 18קק4 - בלחיצה על <0621> והאות '0'. קיימות אפשרויות אחדות לכניסה ל-ה10ַ001: 1. כניסה עם פא בלבד: א) אם טרם השתמשנו בעורך בהרצה זו, נותנים את הפקודה פא ומקבלים את המסך לפי המתואר בעמוד הקודם. ב) אם השתמשנו כבר בעורך באותה הרצה, נכתוב כם ונקבל את מסך העריכה האחרון שהיה לפני היציאה. אין זה חשוב באיזו דרך יצאנו מן העורך, עם הגדרה או ללא הגדרה. - 37 - כניסה בצירוף שם הליך: לדוגמת: תהמצ" כמ? א) אם גמ הוא שם הליך חדש שעוד לא הוגדר, נקבל מסך ריק שבפינתו השמאלית רשום תגמצ 10, ואז נוכל להמשיך לכתוב אותו. ב) אם ההליך הגמצ כבר מוגדר, נקבל את מסך העריכה ובו מוצג ההליך כפי שהגדרנו אותו בפעם האחרונה לאחר התיקונים והשינויים. כניסה עם רשימת שמות של הליכים: דרך זו מאפשרת לעבור לעורך ולקבל יותר מאשר הליך אחד. ההליכים הכתובים ברשימה, אשר הוגדרו קודם לכן, יופיעו במסך העריכה בזה אחר זה. דבר ‏ זה מבהיר, שניתן לכתוב ב-₪01708 מספר הליכים זה אחר זה. אך זכור, אין להתחיל כותרת של הליך חדש לפנ שסיימת הליך קודם. כיצד עובדים במסך העריכה? ישנן פקודות שונות המקלות על העבודה. הן מאפשרות לנוע על פנ: המסך באמצעות הסמן כדי לערוך תיקונים או שינויים במקום הרצו'. בהמשך נציג את הפקודות לגירסאות לוגו, אשר אנו דנים בהן בספר זה. - 38 - קודות עריכה עבור 1000 ו רוב פקודות העריכה מבוצעות על-ידי הקשה על מקש אחד בלבד, אך ישנן כאלו שמבוצעות בצירוף מקש <1ע002>, או בעזרת <10/6ת9>. להלן פקודות העריכה, אשר מתאימות גם למסך העבודה וגם למסך העריכה. ([ 61 + = ] ( ס8ך + [פ19 + %6+1ת5) ( 2-) +,0%21 + 8268%( מחיקת התו שעליו מוצב הסמן. (חצ אחורה) מוחק את התו שמשמאל לסמן. העברת הסמן לסוף השורה. העברת הסמן לתחילת השורה. הזזת הסמן תו אחד ימינה (חף ימני). הזזת הסמן תו אחד שמאלה (חא שמאלי). מחיקה של התווים בשורה, מן הסמן *מינה. העתקה של השורה האחרונה שנמחקה. העתקה של השורה האחרונה שנכתבה על-:די המשתמש. הפסקה של העבודה המתבצעת על-ידי המחשב. הפקודות הבאות מתאימות עבור מסך העריכה (801108) בלבד: ( חץ-מעלה + [ חץ-מטה + ( פאם + [ 6חסו + [ פס 6ק + [ חס אק ) (ס₪0ע + 1ע0%) (תסקת + 1ע0%2)+ [ שח + [ ספט + העברת הטסמן שורה אחת מעלה. העברת הסמן שורה אחת מטה. העברת הסמן לסוף המסך. העברת הסמן לתחילת המסך. דפדוף במסכים אחורה (מעלה). דפדוף במסכים קדימה (מטה). העברת הסמן לתחילת העריכה. העברת הסמן לסוף הער*כה. פתיחה של שורה חדשה בין שתי שורות קיימות. יציאה מן העורך עם הגדרה. - 39 - [08%ע22 + 1ע00+ + 366 [ 1 רא 1 יציאה מן העורך עם הפסקת העבודה ללא הגדרתה. העברה של חלק השורה שמן הסמן ‏ ימינה, לשורה חדשה. מחיקת ‏ תו שמאל* וצירוף של השורה שהסמן מוצב בתחילתה, אל המשך השורה הקודמת. במילים אחרות, ביטול של ל886> בשורה שלפני שורת הסמן (חצ אחורה). מ דרת עריכה עבור 11 1000 268 הפקודות בגירסה זו של לוגו נעשות בחלקן בעזרת מקש <1ע052> וחלקן - בעזרת מקש 'תפות'. הפקודות אשר מתאימות גם למסך העבודה וגם למסך העריכה: [ץ + מתד0 [ מס ( א + תפס ( ה + עתדס ו ו - -ר (₪50 + תפוח לבן+ מחיקת התו על*ו עומד הסמן. מחיקת התו שמשמאל לסמן. העברת הסמן לסוף השורה. העברת הסמן לתחילת השורה. הזזת הסמן תו אחד ימינה (ח> י*מנ'). הזזת הסמן תו אחד שמאלה (חף שמאל'). מחיקה של *תרת השורה, מן הסמן ימ*נה. מחיקה של כל השורה. העתקה של השורה האחרונה, שהוכנסה או שנמחקה. הפסקה של העבודה המתבצעת על-ידי המחשב. - 40 - הפקודות הבאות מתאימות עבור מסך העריכה (108ַדַכ₪) בלבד: [ 0 + 0182 )+ פתיחה של שורה חדשה בין שת: שורות קיימות. ( חצ-מעלה )?| העברה של הסמן שורה אחת מעלה. ( חץ-מטה )+ העברה של הסמן שורה אחת מטה. (חצ מעלה + תפוח שחור)+ דפדוף המסך אחורה (מעלה). (חץ' מטה + תפוח שחור)+ דפדוף המסך קדימה (מטה). [ 1 + תפוח + דילוג אל תחילת העריכה (הקטע הראשון). [ 2 + תפוח + דילוג אל הקטע השני של העריכה. [ 9 + תפוח )+ דילוג אל הקטע התשיעי של הער:כה (אחרון). ( 4 + תפוח לבן + יציאה מן העורך עם הגדרה. ( 250 + תפוח לבן + יציאה מן העורך עם ביטול העריכה. [ 366 )+ העברה של חלק השורה שמן הסמן ימינה, אל שורה חדשה. [ תמ + מחיקת תו שמאלי, והעברה של כל השורה שהסמן מוצב בראשה אל המשך השורה הקודמת. במילים אחרות, ביטול של ל260> בשורה שלפני שורת הסמן. הערה: במצב עריכה ניתן על-ידי להיצה על (? + תפוח) לקבל על המסך את כל המידע בדבר הוראות העריכה. נקדות עריכה עבור 1000 מזקק רוב הפקודות מתבצעות בהקשה על מקש <1ע002> בצירוף מקש נוסף. במקום <018> נרשום את הסמל '7', ואם נכתוב ג" פירושו, שיש , להקיש על <0131> ובעודו לחו יש להקיש על האות '4'. - 41 - הפקודות אשר מתאימות גם למסך העבודה וגם למסך העריכה: בפטסס ץר" ט --?7 "5 - 0% 7 4868 "8 48 868 "ד .0 >%-- 6 א" צ" הזזה של הסמן תו אחד קדימה (*מ*נה). כנ"ל. המקש 'חף ימינה' מבצע פעולה זהה. הזזה של הסמן תו אחד אחורה (שמאלה). העברה של הסמן לתחילת השורה. העברה של הסמן לסוף השורה. מחיקת התו על*יו עומד הסמן. מחיקת התו שלפני הסמן (משמאל לסמן). 'חץ שמאלה' מבצע פעולה זהה. 'מחיקה של יתרת השורה מן הסמן ימינה. א. העתקה של השורה האחרונה שנמחקה, אל המקום שבו הסמן נמצא, ואת שאר השורה מזיז ימינה. ב. העתקה של השורה האחרונה שנרשמה. הפקודות הבאות מתאימות למסך העריכה בלבד: 8 85א 8‏ אד 6 10018%ט6ע2 4 מסק 0 פטס 66 76 העברה של הסמן שורה אחת מטה. העברה של הסמן שורה אחת מעלה. פתיחה של שורה חדשה בין שת: שצורות קיימות. העברה של יתרת השורה מהסמן *מינה אל שורה חדשה. במצב עריכה פועל מקש זה כמו א7"8. יציאה מן העורך עם הגדרה. יציאה מן העורך עם הפסקת העבודה ללא הגדרה. דפדוף למסך הבא של העריכה. דפדוף למסך הקודם של העריכה. הזזת הסמן לסוף העריכה. הזזת הסמן לתחילת העריכה. - 82 - נקודות הפועלות על הליכים ההוראה 2015 [11%51085 0₪6 6ם1עק) על מנת לדעת מה קיים בזיכרון, יש להשתמש בהוראה המציגה על המסך את הרשימה של שמות כל ההליכים הנמצאים בו. אם למשל, ההליכים באהחפ, 700 ו-1989צ קיימים בזיכרון, ונרשום ---% 5 נקבל: האס 70 0 9 70 בדרך ‏ זו ניתן לבדוק איזה הליכים מוגדרים בזיכרון וכיצד נכתבים שמותיהם, דבר שימנע מאתנו טעויות כתיב. ההוראה 20 [006 6םבפק) א. הוראה זו מציגה על המסך את כל הפקודות הכלולות בהליך כלשהו. אם נכתוב ---> באפ" 0ק? על המסך תופיע הגדרת ההליך מהתחלת הכותרת ועד מילת הסיום פאע. במצב זה אי אפשר לערוך אותו. ב. להצגת מספר הגדרות (הליכים) משתמשים במבנה הבא: כאשר שם1...שםת מציינים שמות של הליכים. 5 3 - ההוראה 2025 (69ע22006002 006 6ם1עק+ הפקודה 59 גורמת להצגה של כל ההליכים המוגדרים בזיכרון. ההוראה 2805 (205ט20606ק2 856ת0) למחיקה של כל ההליכים שבזיכרון משתמשים בפקודה פקתם. ההוראה 20488 (קיצור - תם) הכרנו את ההוראה שם" תם (מ5ַ₪) למחיקת הליך אחד מסוים. ניתן להשתמש בהוראה זו כדי למחוק מספר הליכים המפורטים ברשימה, לפי המבנה הבא: ההוראה ,2841 (/41 6פַַת₪+ הוראה זו משמשת למחיקת כל מה שנמצא בזיכרון. - 48 - פרק 4 השימוש במשתנים זיכרון המחשב מורכב ממספר רב של תאים שבהם מאוחסנים נתונים, ולכל אחד מהם ‏ יש כתובת. כאשר רוצים להשתמש בתא מסוים אין מתייחסים לכתובת האמיתית שלו, אלא נותנים לו שם סמלי. לתא קוראים משתנה (8218016/) משום שהנתון המאוחסן בו :כול להשתנות מספר פעמים במהלך ביצוע התכנית. הנתון המאוחסן בתא הוא הערך (081₪06) של המשתנה. הגדרת המשתנים נעשית בעת הכרזת הכותרת של ההליך על-ידי מתן שמות, אשר ‏ יופיעו מיד אחרי שם ההליך. למשתנים שונים יש לתת שמות שונים. על מנת שלוגו תבחין בין שם של הליך לבין שם של משתנה, ‏ יש להצמיד לתחילת המשתנה נקודתיים (:). כלומר, להקיש נקודתיים ואת השם ללא רווח ביניהם, לדוגמה מאסא:, 1018: ועוד. הגדרת משת ג ים בכותרת הליך בפרק קודם הגדרנו הליך א188הא כדי לחשב היקף ושטח של מלבן בעל נתונים קבועים. בכל פעם שהרצנו את התכנית, קיבלנו תמיד את אותן התוצאות. כעת נגדיר הליך 1א4]/88₪א, ובמקום נתונים קבועים נגדיר בו משתנים (180168ע78), שבאמצעותם נוכל לחשב היקף ושטח של מלבן בכל גודל שהוא בעזרת אותה התכנית. = 55 4 הגדרת 1אמם ]4 ₪ ס: טבגמססת: 1אסםהא 0ד? ( ( אסמת0: . שמססת: ) > 2 [ 15 תמאדסת אד ] הק )< ( אסמתס: + שגהססת: [ 15 הגדסתס פד ] תק )< פאט< ספאזטטס 15 1אמםזהא ? כדי לחשב את ההיקף והשטח של מלבן כלשהו באמצעות הליך זה, צריך להזין נתונים. מתן ערכים למשתנים נעשה עם קריאת ההליך לביצוע. אם נרצה למשל, שהחישוב יתבצע למלבן בעל אורך של 85 ורוחב של 63 נרשום זאת כך: 5 63 1אמםהא? קבלת הערכים למשתנים נעשית בהתאמה לפ: סדר הופעתם: הערך הראשון למשתנה הראשו(ן, הערך השני למשתנה השנ* וכן הלאה, אם דרוש. בדוגמה זו, 63 הוא הערך למשתנה /ש80012: ו-85 הוא הערך של המשתנה 08₪048:. והתוצאה תה*ה: 6 15 שמאדמת מאחל 5 175 51041 מחך שים לב: גם /ב008ַ: וגם 08₪01: ה*נם משתנים שיש להם ערך. מטרת התרגיל היא להדפיס את ערך החישוב של השטח וההיקף, ולכן לא תחמנו את הביטוי בתוך סוגריים מרובעים. אם הי*נו כותבים: [(08₪08: + עאמס0ת:) * 2 15 סמאדטת מחל] הק המחשב היה מדפיס את כל מה שנמצא בין הסוגריים, בל* לחשב את הערך של הביטוי. משתנים אלה הס משתנים חופש'ים (082180168 6ס6עע), שעם ס'ום הביצוע ערכיהם נעלמים. השימוש בהם מאפשר לנו לבצע אותם חישובים עבור מלבנים שונים, על-ידי מתן ערכים חדשים למשתנים בכל קריאה בהתאם לנדרש. כך הופכים ההל*כים לכלליים *ותר. 4 ₪ = תפקיד המשתנים מצטמצם בתיאור תבנית החישוב, ולכן אין כל חשיבות לשמות בהס משתמשים לסימון משתנים אלה. ביצוע ההליך לא יהיה שונה אם גרשום 20:41: במקום ש30088: ו-2₪142: במקום 08801:. עם זאת, רצוי לתת לערכים השונים שמות בעלי משמעות, לשם נוחות העבודה. ניתן להשתמש באותו שם גם להגדרה וגם למשתנה, מכיון שלוגו י*כולה להבחין ביניהם בשל סימן הנקודתיים ':' הצמוד לשם של משתנה, אך לא נמצא לפני הגדרה. זכור- לפני שם של משתנה יש לכתוב נקודתיים (:) בלי רווח. לדוגמה נכתוב הליך כללי לחישוב ביטוי חשבוני מן הצורה הבאה: 2 * ץצ + א הגדרת ‏ 748010 2 צ: א: מנסתגד 10 (2: * צ: + א: =" 2: *" צ: +" א: תק) פאם כאשר נכתוב ---> 6 2 4 מתנסתג? נקבל את הפלט הבא: 6 = 6 * 2 + 8 שים לב: בחלקו הראשון של משפט ת2, הופיעו סימן הכפל '*' וסימן החיבור '+' מלווים בגרשיים, כדי לגרום להדפסתם, יחד עם הערכים של א: צ: ו-2:. בצד ימין של הביטוי נכתבו הסימנים ללא הגרשיים, וזה גרם למחשב לבצע את הפעולות עצמן, לחשב את הביטו:י ולהדפ:סו. הערכים של המשתנים יכולים להיות מספריים (נומריים), ויכולים להיות אלפא-נומרים (רצף של תווים). נגדיר הליך המקבל שתי מילים, שהם שני שמות של תלמידים, ומדפיס פלט מן הצורה הבאה: .פפאמדתץ 0000 פת3 שם2 פאה שם1 - ד - הגדרת 5סאעצאץ 2אגא: 1מאגא: פפאמזתע 70 ([.5פאמתץ 0002 מתה] 2מאהא: פאה" 1מאגא: תק) פאם בדוגמה זו הנתונים הם שמות המורכבים מרצף של תווים, ולכן יש להקדים כל אחד מהם בגרשיים בעת הקר:*אה. נכתוב ---% צעמ" דאסת" פפאמצתק? ונקבל: . 5פאמזתע 0002 טתה צעם פאה זאסת בכל קריאה נוכל לתת שני שמות אחרים, והפלט יהיה בהתאם. כאשר מפעילים הליך המוגדר עם משתנים, המחשב מצפה לקלוט נתונים כמספר המשתנים המוגדרים לאותו הליך. במקרה שלנו הוגדרו שנ: משתנים, ולפיכך:- אם נכתוב ---6 1" פספאמדתע או רק ---6> 5פאמזות נקבל הודעת התראה כמו: 5שאמנתץ 10 5יקא1 אסטסאם צסא או 5אא מתסא 5סמטא 5סאמזאהץ תרג'לים 1. כתוב הליך 0101 10, הדומה ל-061 10 שבשאלה 5 בפרק ‏ 2, לשם חישוב הגיל בשבועות ובימים. הפעם יוגדר ההליך עם משתנה 6:, כדי לקבל את גיל הילד בשנים. - 48 - כתוב הליך :100 10 כללי לחישוב קוטר, שטח והיקף של מעגל, על-5י הרדיוס.אשר *ינתן כקלט. הגדר הליך ₪10 10 המקבל שם ומדפיס את המשפט הבא: .1 שמא 70 מסנא 11'5 ,שם 0תוחתא הגדר הליך עם שני משתנים, האחד מקבל מילה והשני - מספר. על ההליך להדפיס את ההודעה הבאה: שם 15 שאגא צא 02 פתמצ מספר ‏ 6ג ך כתוב הליך 110 70 המקבל % נתונים ל-4 משתנים: א. מרחק הנסיעה - א60מתמכת: ב. מהירות ממוצעת - 50080: ג. צריכת דלק (ק"מ לליטר) - אא: ד. מחיר לליטר דלק - מסנתק: על התכנית לחשב ולהדפיס: 7 סש הש | - | זמן הנסיעה הדרוש. - | מחיר הדלק הדרוש לנסיעה זו. כתוב הסבר ליד המספרים. כתוב הליך עם 2 משתנים. המשתנה 4תעזצ: מקבל את היתרה של חשבון לקוח בבנק, והמשתנה השנ* 08א7: מקבל את סכום ההפקדה, או המשיכה של הלקוח. על ההליך לחשב את היתרה החדשה ולהדפיס את ההודעה הבאה: יתרה :מ5א/281 אמא , סכום הפקדה/משיכה :א5401710אגת הטסצ שים לב לכך שסכומי ההפקדה/משיכה והיתרה יכולים להיות עם סימן שלילי. העברת מטתגים מהליך להליך ראינו, שניתן לפנות להליך מוגדר מתוך הליך אחר. ידוע גם שבעת קריאה להל*יך המוגדר עם משתנים, יש לדאוג לנתונים, אשר יהיו הערכים למשתנים אלה בהתאמה. הדבר נכון גם כאשר הקריאה באה מתוך הליך אחר. נכתוב כעת הליך 0112 הפונה ל-0111 שבתרגיל 1, לשם חישוב הגיל בשבועות ובימים עבור שלושה ילדים בני 5, 9 ו-12 שנים. הגדרת ‏ 0102 2 10 " הת 5 0101 " תק 9 001 " הק 12 0101 פא באער גרשום ")שש 44 י : 2 נקבל את הפלט הבא: ‏ 0 5אממח 260 15 דאס מצד 012 5צבכ 1825 15 011 מא 00 פאממט 468 15 פתדאס מא 012 5צ3כ 3285 15 כ]דה0 מך 0 פאמתח 624 15 דאס מז 012 5צבכ 4380 15 כ דא0 מך 2 פונה שלוש פעמים ל-0101 עבור כל אחד מן הילדים. בכל פניה הוא מעביר ערך למשתנה ‏ 0: המוגדר ב-0111. בפעם הראשונה הוא מעביר את הנתון 5, בפעם השניה - את הנתון 9, ופעם אחרונה - את הנתון 12. בתום כל ביצוע של 0111, מדפיס המחשב שורה ריקה (על- ידי " תת). 2 יבצע תמיד את החישובים עבור אותם גילאים. אם נגדיר אותו עם משתנים - נהפוך אותו להליך כללי, המבצע בכל הרצה את - 50 - החישובים עבור 3 גילאים כלשהם. נכתוב עתה את ההליך 06103, אשר מציג גישה זו. הגדרת ‏ 0113 2: צ: א: 613 70 " הק א: 0101 " הת צ: 01 " הק 2: 0101 פאם להרצת התכנית יש לרשום את שם ההליך '01123' בצירוף ‏ 3 נתונים, כמספר המשת('ים ---6> 4 6 10 013? המשתנים מקבלים נתונים אלה בהתאמה: המשתנה א%: מקבל את הערך 10, המשתנה צ: מקבל את הערך 6, והמשתנה 2: - את הערך 14. בקריאה ל- 1 מועבר הערך של המשתנה המצוין באותה פניה אל המשתנה 6: המוגדר ב-0111. אם כן, אפשר לתת ערכים למשתנים על-יד* נתונים קבועים, אלא גם על-ידי העברתם באמצעות משתנים. פרמטר פורמלי ופרמטר אקטואלי המשתנים המוגדרים יהד עם ההליך נקראים פרמטרים פורמליים ( 8ת282806%0 1[המעסץ), אשר משמשים לתיאור תבנית החישוב. רק כאשר קוראים להליך ונותנים ערכים למשתנים, מתבצע החישוב עצמו. הערכים הניתנים,בזמן הקריאה נקראים פרמטרים אקטואלים (200181 %8) ) ראינו שניתן להעביר בתור פרמטר אקטואלי לא רק קבוע, אלא גם ערך של משתנה. מכאן שמשתנה של הליך יכול לתפקד גם כפרמטר פורמל* וגם כבעל פרמטר אקטואלי. = 31 = מטתנה מקומי מטתנה לא-מקומי הליך אחד יכול לקרוא (לפנות) להליך מוגדר אחר, כמו למשל ‏ 0103 קורא ל-01121. הליך קורא נחשב בדרך כלל להליך ברמה גבוהה יותר מאשר ההליך הנקרא על-ידו. המשתנים המוגדרים בהליכים מוכרים תמיד במהלך התכנית על-ידי הליכים בעלי רמה הנמוכה מרמת ההליך בו הם מוגדרים, אך לא להיפך. כך נמצא, שהמשתנים א<: צ: ו-2: מוכרים על-ידי ‏ 0101, אבל המשתנה 6: השייך ל-0111, אינו מוכר על-:ידי 0113. משתנים המוכרים על-יד: תת-הליכים אחרים בתכנית הם משתנים לא-מקומיים (בדוגמה ‏ זו, %: למשל). משתנים של הל:*ך המוכרים ‏ רק על-ידי אותו ההליך, אך לא על-ידי הליך אחר כלשהו בתכנית הם משתנים מקומיים (המשתנה 6: למשל). הערכים של משתנה מקומי (10081) וגם של משתנה לא-מקומי (תסא 1) נעלמים עם גמר ביצוע ההליך שבו הם מוגדרים. ההוראה 5א20 [8₪65א 00% 6םצעק) הוראה זו גורמת להצגת השמות של כל המשתנים שבזיכרון ואת ערכיהם כפי שהם קיימים בעת מתן ההוראה. נניח שההוראה 5א20 היא חלק מהוראות ההליך 0121. בכל פעם כאשר 3 לי*פנה ל-0121, נקבל נוסף על חישוב הגיל, גם את שמות המשתנים הנמצאים ברגע זה בזיכרון ואת ערכיהם הנוכחיים. כלומר, ניתן מתוך תת-הליכים להתייחס אל משתנים, אשר מוגדרים בהל:כ:ים בעלי רמה גבוהה יותר, ללא צורך בהעברת פרמטרים. אם רשמנו '18 6 10 0113', נקבל: ערכו של א: הוא 10 ערכו של צ: הוא 6 וערכו של 2: הוא 14 = 2 = המצב יהיה זהה בשלוש הקריאות. כלומר, הערכים של א:, צ: ןו-2: אינם משתנים במהלך כל התכנית. המשתנה 6: מקבל ערך אחר בכל קריאה, ולכן נקבל בפעם הראשונה שערכו הוא 10, בדומה לערכו של א:, בפעם השניה הוא יהיה 6 כמו ערכו של צ:, ובפעם האחרונה הוא יהיה 14 כמו הערך של 2:. % כאשר ההוראה 5א0ע ניתנת מתוך ההליך בעל הרמה הנמוכה יותר, מוצגים בפלט המשתנים המוגדרים גם בהליכים האחרים. לא כן, אם נרשום את ההוראה 5א0ק2 ב-06113. כאן לא נמצא זכר למשתנה 8:. הערה: לעתים יש צורך להגדיר משתנים לא-מקומ*יים כדי שניתן יהיה להתייחס אליהם בתוך תת-הליכים ברמה נמוכה יותר. יש להקפיד לא להגדיר משתנים אחרים בעלי שמות הזהים להם, כדי להמנע משגיאות אפשרי ות. במצב של משתנים בעלי שמות זהים המוגדרים בהליכים שונים, יתייחס כל הליך לערך של המשתנה השייך לו. תת-ההליכים שלהם ית:יחסו למשתנים השייכים להליכים המדורגים ברמה הקרובה *ותר לרמתם. לדוגמה, נתונים שלושה הליכים: 8 א: גב 70 א: א: 2: םפם 70 א: 000 70 0%5 %5 פאסק פאם [] פק [] אק ₪ ם: א: מפם 7 000 פאס פאט כאשר (רשום ---> 8 2.3 78 נקבל מביצוע ההוראה 5א20 אשר ב-444 את התוצאות האלו: 15 8 15 3 15 2 - 53 - מביצוע 5א0ת אשר ב-888 נקבל: 15 155 15 5 ₪ = 5 את 62 ₪6 ככ כלומר, הליך מפם מתעלם ממשתנים המוגדרים בהליך 442 ששמותיהם זהים לאלה שלו. מביצוע 5א0ע2 אשר ב-000 נקבל: 15 15 155 55 155 ₪ שר תת << 4- גא ההליך 0 מכיר ב-: ו-א8: אשר ב-288, אך לא ב-444. כאשר לוגו מבח*ינה במהלך התכנית בשם של משתנה בלתי מוכר, היא מפסיקה את הביצוע ומעירה לנו על כך. אם למשל ההוראה '0: 8ק' תהיה חלק מהוראות ההליך 6103, נקבל את ההערה הבאה: שם בלתי מוכר יכול להיות גם כתוצאה מטעות כתיב, אם רשמנו למשל שהחסת: במקום שג80081:. לעתים קורה שלוחצים במידה רופפת על מקש מסוים, ולכן הוא< לא נקלט על-ידי המחשב. אם גרשום לדוגמה ' : תע' בתוך ההליך 0111 במקום '0: תק', נקבל: - 8 5 שים לב: רשמנו משתנה ללא שם (רק נקודתיים) ולכן הובן כמשתנה ששמו מורכב מהמילה הריקה (ללא תו כלשהו). הערה: אנו עוסקים בספר זה במשתנים מקומיים ולא-מקומיים בלבד. לכן, אם נרשום 5א20 במצב הרגיל של לוגו בהוראה ישירה, לא *וצג אף משתנה על המסך. בשוי עוך ל מותנה משתנים יכולים לקבל ערכים בדרכים שונות וביניהן ‏ - באמצעות ביטוי חשבוני. במקרה זה משמש הביטוי החשבוני לשם העברת ערך למשתנה. נגדיר הליך אזאמם]הא הפונה ל-1א418₪א אשר הגדרנו בתחילת הפרק, לשם חישוב שטחו של מלבן אחד והיקפו על-5* אורך +: ורוחב א:. לאחר מכן נחשב את השטח והה*קף של מלבן שני, אשר אורכו קטן ב-84 יחידות מן הראשון ורוחבו גדול ב-6 מהראשון. הגדרת ‏ אזאמם זא צ: א: אזאתם וגא סד צ: א: 1אמםגאא " מק (8 - צ:) (6 + א:) 1אמםוהא " מק פאם אם נתונות הצלעות 24 ו-10, נרשום ---> 4 10 אדאטם)גא? המשתנה א: מקבל את הערך 10, ו-צ: את הערך 2%. אזאטמ)]הא פונה פעמיים ל-1א410₪א, פעם אחת הוא מבצע את החישוב עבור 10 ו-21, כאשר הערך של א: מועבר כפי שהוא למשתנה /30082: - 55 - של 1אמ8]א, | והערך של צ: מועבר ל-08₪08:, אף הוא כפי שהוא. בפעם השניה מועבר הערך של הביטוי (6+א:) ל-/0084:, והערך של הביטוי (4-צ:) מועבר ל-08808:. תרג''לים (המשך) 7 כתוב הליך 3888/00 10, המוגדר עם שלושה משתנים המקבלים 3 שמות שונים. על הליך זה לפנות שלוש פעמים ל-₪8₪00, | אשר הוגדר בתרגיל 3, על מנת לקבל את המשפט עבור כל אחד משמות אלה. 8. כתוב הליך א10001 170 המוגדר עם משתנה אחד 5: ומקבל כקלט את גודל הרדיוס של מעגל נתון. על הליך זה לפנות ‏ 3 פעמים ל-1008 (שהתבקשת להגדיר בתרגיל 2), כדי לבצע את החישובים המוגדרים שם עבור 8:, עבור 2-1: ועבור 1+ַ3:. יש לזכור: - | משתנה כותבים עם נקודתיים צמודים משמאל. - | שם (מילה) כותבים עם גרשיים צמודים משמאל. - | הגדרה (הליך) כותבים ללא כל תוספת. - 56 - פרק 5 הוראות שימוש בדיסקט בפרק הקודם למדנו להשתמש בהוראות המטפלות בהליכים שבזיכרון המחשב: הצגת שמות, ‏ הצגת אופן הגדרה על המסך, קריאה לעריכה ומחיקה מן הזיכרון. במהלך עבודתנו אנו מגדירים הליכים, אשר נרצה להשתמש בהם שוב במועד אחר. אולם כשמסיימים ומכבים את המחשב, כל העבודה נעלמת כלא היתה. בזיכרון המחשב, שהוא הזיכרון הפנימי, נשמרות ההגדרות כל עוד המחשב פועל, אבל כאשר נרצה לשמור דברים חשובים גם אחר: שמסיימים את העבודה, נעשה זאת בדיסקט המשמש לאחסנה קבועה. שמירת העבודה באחסנה קבועה היא חיונית מאוד, ולכן עלינו להכיר את ההוראות המשמשות למטרה זו. 58/8 הארוהה‎ באמצעות הוראה זו ניתן לשמור בתקליטון (דיסקט0 - 2158%86066) את כל ההגדרות הנמצאות באותו רגע בזיכרון המחשב, תחת שם קוב שנבחר על ידנו. השם יכול להכיל תווים כלשהם, אך לוגו לא תקבל שם המכיל תווים המשמשים סמלים במתמטיקה. בגירסת 1000 1% שם של קובצ יכול להכיל עד 8 תווים. יש להמנע משימוש בשם המכיל נקודה, כי שלושת התווים הבאים מימין לנקודה יתקבלו כסיומת, במקום הסיומת המזהה את קבצי לוגו (ש1). דוגמה לשם קובא של לוגו: א18.גתזאה5. = 57 > אין ההוראה 58/8 מתייחסת אל הל*ך (8עט20006ק) בודד, אלא אל אוסף הליכים, והיא יוצרת קוב (116ע) אחד המכיל את כולם. לשם הבהרה נתאר זאת כך: - | שם של קוב מקביל לשם של ספר. - | שם של הליך מקביל לשם של פרק או סיפור. קובצ יכול להכיל הגדרה אחת או יותר, כשם שספר *כול להכיל סיפור אחד או סיפורים אחדים. אם קיימות בזיכרון ההגדרות 0101, 01, 1002, אמםהא ו-הגמץ, ונרצה לשמור אותן בתקליטון תחת שם קובף א011ת1. נרשום ---% אז1נסתגי" מ/ב5? עם הקשת מתבצעת פעולת השמירה ונדלקת הנורה שבכונן כד: לציין שהוא פועל. . הקוב א7480101 יכיל את כל ההגדרות שהיו בזיכרון המחשב בזמן מתן ההוראה. יש גירסאות בהן לוגו מודיעה לנו כמה הליכים נשמרו בפעולה זו: לוגו לא מאפשרת שמירת הגדרות תחת שם קוב שכבר קִיִיָם בדיסקט, וזאת מטעמי זהירות. אם ניתן הוראת 5408 לשם קובף שכבר ק:ים, נקבל את ההודעה הבאה: ההוראה 18 הוראה זו, השייכת לגירסה של 10060 אם1, מציגה על המסך את כל שמות הקבצים שבדיסקט. הדבר מאפשר לנו לדעת אילו קבצים קי:מים בדיסקט ומה הם שמותיהם. כל שם קובף אשר נכתב בשפת לוגו *ופיע = 8 - עם הסיומת א1., שפירושה 7116 סשסם. , לדוגמה: שו תד עבור הגירסה של 11 1060 םנקקג והגירסה של 1000 ₪פקה משתמשים בהוראה 0414106, בגירסה של 1000 ₪קקה שם הקוב שנכתב בשפת לוגו יופיע בסיומת 10060. ולדוגמה: 0. תד הצגת השמות בביצוע ההוראה 218 (או 0814106) קובעת שההגדרות נמצאות בתקליטון, א היא א*נה מציינת אם הן נמצאות בזיכרון המחשב. כדי שתהיינה בזיכרון יש לטעון אותן מן התקליטון. ההוראה 108 ההוראה 1042 ולידה שם קובצ מטעינה את הזיכרון בכל ההגדרות השמורות תחת שם קוב> זה. כאשר נכתוב ---6> אזזסתהד" כב10? נדלקת הנורה שבכונן והטעינה מתבצעת. בגמר הפעולה מופיעה שוב סימן השאלה ולידו הסמן המהבהב. כאשר נרשום 015ק2, יופיעו על המסך שמות ההליכים שהטענו יחד עם ההליכים שהיו קודם בזיכרון, אם היו כאלה. אם רוצים לבדוק אילו הגדרות מכיל קוב מסוים, רצוי לבצע טעינה כשהזיכרון נקי. אם רושמים שם של קוב שאיננו קיים, או כותבים את השם בשגיאת כתיב, נקבל את ההודעה הבאה: - 59 - ההוראה ₪ז1קטפגתת למחיקת קוב מן התקליטון רושמים את ההוראה 10₪קמפהתם ולידה ‏ - את שם הקובף שברצוננו למחוק. אם נכתוב --7-% א" ם,ן1ךתמפהתם? נמחק את קובצ א1280101'. כאשר נרשום לאחר מכן 04141006 (או הדת), לא נמצא את א143011.1 ברשימת שמות הקבצים שבדיסקט. כאשר שומרים הליכים בקוב>, אפשר לשמור בו גם הלי*כים שאינם דרושים, או הליכים שכבר קיימים בקובף אחר, ובכך לגרום לבזבוז מקום בתקליטון. לכן, רצו* לפני פעולת שמירה לבדוק את תוכן הזיכרון (למשל, בעזרת ההוראה 015ק2), ולמחוק באמצעות ההוראה ‏ תם את ההליכים שא*נם נחוצים. אם נרצה להוסיף הליכים לקובץ קיים, או לאחד כמה קבצים, יש לטעון אותם לזיכרון, לצרפם יחד ולבצע שמירה לשם קוב חדש. אחר כך יש למחוק את הקבצים הישנים מן התקליטון. לדוגמה: בדיסקט קיים קובף בשם 0%08א3₪012 ובו שני הליכים 1אממאא ו-אזאמם]הא, וקובצ אחר בשם 018008 ובו שני הליכים 1000 ו-ז 10 על מנת לאחד את שני הקבצים לקובף אחד, ‏ יש לטעון את שניהם לזיכרון המחשב. נרשום ---6> מזסאהדסמת" כה0ת? ואחר כך (רשום ---> ₪" ב0? נניח שלפני פעולת הטעינה הגדרנו הליך בשם ג180ת, אשר נמצא בזיכרון. כעת יהיו בזיכרון 5 הליכים: 1אתםתהא, אזאםם הא, 00ד ,1808 ו-א10001. אם נרצה, נוכל לשמור את כל החמישה תחת שם קובצ חדש למשל: הפא" מע54? - 60 - לאחר פעולת השמירה נמחק את הקבצים הישנים 00₪א14סמת ו-מעסת01 מןו התקליטון. קיימות דרכים מתוחכמות יותר לפעולה זו, שלא נעסוק בהן כאן. ההוראה ₪ז1עד1סם (הוראה זו אינה קיימת ב-10060 ₪ סק1) נרשום את ההוראה ולידה שם-קוב, לדוגמה שו את" מעדקידסט בגירסת 11 1000 ₪זקק יש לרשום את שם הקובף ללא הסיומת (שם.). בעזרת הוראה זו שולפים מן התקליטון אל מסך הערי*כה ושטח העבודה את כל ההגדרות השמורות תחת שם הקוב הנתון. אין מבצעים את ההליכים. יוצאים מן העורךך (עם שינויים או בלעדיהם) בהתאם לגירסת לוגו שבה פועלים, והקובצ חוזר לדיסקט. בגירסה של 1060 א18 נשאר הקובצ בשטח העבודה של ה-1108כ₪ ולכן, ני*תן לרשום ₪2 ולקבלו שוב במסך העריכה. באמצעות מקש <₪50> אפשר לצאת מן העורך, אך הפעם - להגדיר את הקוב בזיכרון המחשב לשם ביצוע. - 61 - פרק 6 משפטי תנאי הוראות שכתבנו עד כה בהליכים התבצעו לפי סדר כתיבתן. המחשב ביצע הוראה אחר הוראה עד לסיומו של ההליך. כבר פגשנו בלימוד ההוראה ץגמקטת, שהמחשב מבצע רשימת הוראות מספר פעמים, למרות שהן כתובות פעם אחת. כלומר, הוא חוזר לבצע את ההוראות שברשימה פעם אחר פעם, עד מתי? המחשב עורך השוואה בין מספר הפעמים שההוראות התבצעו לבין הערך המספר* 'ם' הנמצא מיד אחר* ההוראה ןסקסת, ומפסיק את הלולאה ברגע שקיים שוויון. כך שבהוראה עצמה כלול משפט תנאי, שלפי קיומו או אי-קיומו של התנאי, תלו:י המשך ביצוע הלולאה.. את משפטי התנא* ני*תן להציג למחשב גם באמצעות ביטויים לוג*ים. השימוש במשפטים אלה דרוש אם רוצים: א. לבצע רשימת הוראות רק אם התנאי מתקיים. ב. לבצע רשימה אחת של הוראות כאשר התנאי מתקיים ורשימת הוראות אחרת אם התנאי אינו מתקיים. אחת הדרכים להציג ביטויים לוגיים היא על-ידי השוואת *חסים באמצעות פעולות היחס: (1ַנסס שווה ל 2[מס0) 2 = 0011 (1נְסס גדול מ 0012) 2 < 11סס (1נֶפס קטן מ 2ן[ַסס) 2 |> 11[סס = 62 = הראת הזנאי 11 את ההוראה 1 אפשר להציג בשני אופנים. מבנה אחד של ההוראה: המחשב בודק אם הביטו* הלוגי המופיע במשפט הוא אמיתי או שקרי, כלומר - 'נכון' או 'לא נכון'. ₪ אם התשובה היא חיובית, משמע שהתנאי מתקיים, ואז מתבצעת רשימת ההוראות המופיעה מיד אחרי הביטוי הלוגי שבאותו משפט. המשך התכנית תלוי כמובן, בהוראות שברשימה. ₪ אם התשובה היא שלילית, המשמעות היא שהתנאי לא מתקיים, ואז מתעלם המחשב מרשימת ההוראות, והביצוע עובר להוראה העוקבת הבאה אחרי משפט ה-ק1. מבנה שני של ההוראה: במבנה הזה כלולות בתוך משפט אחד שת* האפשרויות, שרק אחת מהן תתבצע: - | אם התנאי מתקיים תתבצע 'רשימת הוראות 1' בלבד. - | אם התנאי לא מתקיים, תתבצע רק 'רשימת הוראות 2'. לפניך הליך המקבל שני מספרים 8 ו-ם. התכנית מדפיסה בשורה הראשונה את שנ:< המספרים שהתקבלו ובשורה השניה - אחת משת: ההודעות, בהתאם לערכי המספרים: | נקבל --%7> 'פ אגזוד תטץהמתס 15 ג' או דד-> '4 אגחך המדמה 15 מ' - 3 - הליך 48 למציאת המספר הגדול 8 : 88 70 (פ: [= ם] [פפפס] ג: [= ג] תק) [[8 אגד תתדהמת0 15 4] תע] ם: < ג: סך [[8 אגחד תמנהמת0 15 ם] תק] ג: < ם: ספך פאת כאשר נכתוב ---> 2 53 48? נקבל את הפלט הבא: ' 2 = ם 3 >= 4 ם5 אגחדך תפדהמתס 15 4 במקרה הזה, התנאי שבמשפט הראשון מתקיים. כלומר, הערך של 4 גדול יותר מהערך של ₪, ולכן מתבצעת ההוראה המופיעה במשפט זה. במשפט השניי אין התנאי מתקיים, לכן התעלם המחשב מההוראה והמשיך הלאה להוראה העוקבת. התדע מה :היה הפלט כאשר נרשום ---% 4 6 פה? או אם נרשום --->6 9 9 8ב? הערה: בלוגו יש אפשרות להשתמש באותיות בעברית כדי להציג הודעות למשתמש ולקבל ממנו נתונים. המעוניין בכך יכול לעיין בנספח הדן בכך. למשל, בהליך 428 *יכתב המשפט: [[הערך של 8 גדול מן הערך של 8] תק] 8: < ג: קך הפלט לאחר ביצוע משפט זה: הערך של 84 גדול מן הערך של 8 כעת נכתוב הליך המדפיס את ערכו המוחלט של מספר כלשהו. הליך ‏ 1 זוא א: ןשוא 170 [א: תע] [א:- 5ק] 0 > א: תד פאט > ₪ - תכנית זו מקבלת ערך למשתנה א, ובודקת אם ערך זה הוא שלילי: - | אם א שלילי - היא כופלת אותו בערך 1- ומדפיסה (רשימה 1). - | אם א לא שלילי, כלומר, אם התנאי לא מתקיים ‏ - היא מדפיסה אותו כפי שהוא (רשימה 2). התכנית תקינה מבחינה לוגית, כי היא עונה על הנדרש - הדפסת ערכו המוחלט של מספר נתון. הבה נראה את התכנית שנית, כאשר תלמיד אחד הגדיר הליך זה בשגיאה לוגית. התלמיד טעה בכך שהוא כתב את ההוראה 'א: מפ' בשורה נפרדת עוקבת, ללא שינוי ערך הקלט. הליך ‏ 1דה ווח א: 11ה,זוחוע סיד [א:- תע] 60 א: חך א: תק פאם כאשר נרשום מספר חיוב'י ---> 5 1 וח התנאי שבהוראת 1 לא *תקיים והמחשב ידפיס: 5 לגבי ערך חיובי נראה שהתכנית נותנת תוצאה נכונה, אך לא כן לגב: ערך שלילי. אם נרשום ---6 5- דג תח המחשב ידפיט: : פ- אך גם: 5 ההוראה 'א: תפ' שאמורה להתבצע רק אם התנאי לא מתקיים, אינה מופיעה במשפט התנאי, אלא בהוראה נפרדת. עם סיום משפט התנא: עובר אליה הביצוע בכל מקרה, ולכן היא תתבצע תמיד. אם ניתן היה לסיים את התכנית לאחר ביצוע הרשימה שבהוראת 18, היינו נמנעים משגיאה זו. - 5 - הוראת הסיוס 9102 בדומה ל-פאם, מסיימת ההוראה 5102 את ביצוע ההליך. המילה פאם נרשמת בטורה האחרונה בהגדרת ההליך בלבד, כדי לציין את סוף ההגדרה. ההוראה 5102, לעומת זאת, יכולה להופיע בכל מקום בהליך כדי לסיים את הביצוע של ההליך במקום בו היא מופיעה. נכתוב הליך כדוגמת 011.871/, ובאמצעות 5105 במקום המתאים, נקבל תכנית נכונה. הליך 2ד1ה וו א: 12 טא 10 [פסדפ א:- תהק] 0 > א: עד א: תק פאת בתכנית זו, אם ערכו של א קטן מאפס יודפס הערך המוחלט על-:ידי הפיכתו ‏ ל-(א-), והביצוע יסתיים מיד. לעומת זאת, אם הערך גדול או שווה לאפס, כלומר התנאי לא מתקיים, *תעלם המחשב מההוראות המופיעות ברשימה של משפט התנאי ובכלל זה ההוראה 5102. המחשב יעבור להוראה הבאה, המספר המקור: יודפס ורק אז יסת:ים ההליך. שים לב: מאחר שבמשפטי התנאי המילה ע1 פועלת על ביטו* לוג: שערכו מסתך או מפחגע, לוגו תעיר לנו אם נרשום ביטוי* שאיננו לוגי. אם לדוגמה נרשום ‏ '3 + א: קז' במקום '3 = א: אז1' נקבל הודעת שגיאה. אם הערך של א: הוא '9', נקבל את ההערה הבאה: = = הוראות תנאי מקרגגות ההוראות שתתבצענה במשפטי התנאי בהתאם לקיום של התנאי, או א'- קיומו, מוצגות בתוך רשימה. רשימת הוראות יכולה לכלול כל הוראה שהיא ועל-כן, גם הוראת תנאי יכולה להיות בתוך רשימה. מכאן שנוכל לכלול הוראת תנאי פנימית בתוך רשימת הוראות של הוראת תנאי חיצונית. דוגמה: "רשימת הוראות ‏ 1" של הוראת התנאי החיצונית כוללת הוראת תנא: פנימית: [[רשימה ב'][רשימה א'] תנאי א1] הוראת תנאי פנימית יכולה להופיע גם כחלק מ"רשימת הוראות 2". למעשה, כל הוראת תנאי, פנימית או חיצונית, יכולה לכלול הוראת תנאי פנימית נוספת. נציג זאת בדוגמה. לפניך מוגדר הליך המקבל שלושה מספרים ומדפיס את הגדול מביניהם. הגדרת הם71מת03 710 0 8: 4: תתדהמת0 70 [[0: אפ][8: תק] 8<:0: ק1] [[0: תם][4: תק] 6:<ג: ק1] ם:<ג: סד פאם רשימה 1 ---> [[0: תפ][8: תע] 0:<ג: תד] תתבצע רק אם כן 4<:8: רשימה 2 ---> [[0: מת][8: תק] 0:ם: קד] תתבצע רק אם לא 4<:8: -ש 7 = לדוגמה, כאשר נרשום ---> 3 15 7 תמךהמח? נקבל: 5 המשתנה ‏ 4: יקבל את הערך ], המשתנה 38: יקבל את הערך 15 ו-0: יקבל 3.. התנאי '4<:8: ש1' בהוראה החיצונית לא מתקיים, כי ‏ 7 לא גדול מ-15. לכן מתבצעת רשימה 2: [[0: תּע][8: אק] 5<:0: סד] התנאי ‏ '2<:0: א1' בהוראה זו כן מתקיים, ועל כן הרשימה הראשונה [8: 28] מתבצעת, והפלט הוא הערך של 8: כלומר - 15. רשימת הוראות היא אוסף של הוראות שיש לו התחלה וסוף. אפשר להציג אוסף הוראות זה בתוך תת-הליך, ולפנות אליו במקום המתאים מתוך ההליך הראש*. תת-הליך הוא קטע לוגי של ההליך השלם, המוצג בנפרד מסיבות שנציין להלן. כפי שאנו רואים, לוגו מאפשרת להגדיר הליכים הכוללים אוסף הוראות מסוים ולפנות אליהם מתוך כל הליך אחר. זוהי שפה הבנויה על-5* עקרונות של התכנות המב(נ* (שתנמשהעשס:? 06עט60ט62ס5), אשר הוזכרו בפרק 2. משפט המורכב מהוראות תנאי מקוננות הופך למשפט ארוך ומסורבל. לכן, טוב נעשה אם נשתמש בטכניקה של התכנות המבני להגדרת תת-הליכים שייקלו על הבנת התכנית. נכתוב כעת תכנית לפתרון התרגיל הבא: נתונים ‏ ] מטבעות שמשקלם זהה, פרט לאחד הכבד יותר מן האחרים. נתונים גם מאזני פלס. יש למצוא את המטבע הכבד על-ידי מינימום של שקילות. לפתרון התרגיל נסמן את המטבעות במספרים מ-1 עד 7. המספרים מקבילים לאותיות 8 עד 6 בהתאמה. 0% = הגדרת ‏ הממד 0 ם: ם: כ: 0: ם: 2: גממדהא 70 [פ510 0: תת] ת: + ם: + כ: = 6: + ם: + ג: סד [ת: ם: ע: מדא] [0: ם: ב: מדא] ק: + ם: + כ: ל 6: + ם: + ג: סך פאם עורכים השוואה בין שתי קבוצות, כשבכל אחת 3 מטבעות: קבוצת המטבעות , 8, 0 וקבוצת המטבעות כ, ₪, ק. אם משקל שתי הקבוצות שווה, תודפס הודעה שהמטבע השביעי כבד יותר והביצוע יעצור: [פ810 06: תק] ע: + ם: + כ: > 6: + ם: + ג: עד אחרת - נמשיך לבדוק איזו מבין שתי הקבוצות כבדה *ותר: ק: + ם: + כ: ל 60: + ת: + ג: עד - | אם התנאי מתקיים, משמע שהקבוצה 2, 8 ו-0 כבדה יותר, ואז תתבצע רשימה א': [0: 8: ג: פדא] - | ואם התנאי לא מתקיים, תתבצע רשימה ב': [א: ₪: כ: פדא] אנו פונים להליך 8 להמשך הבדיקה של הקבוצה הכבדה, כאשר ערכ: המשתנים שבקריאה מועברים בהתאמה למשתנים המוגדרים בהליך מזא. הגדרת ‏ מה א: ם: א: פצא 70 [5109 א: תק] ם: = א: חך [ע: תע] [א: תק] ת: < א: קך פא הליך 8158 מבצע השוואה רק בין שני מטבעות. אם הם שווים - הוא מדפיס את השלישי והביצוע יעצור. אחרת - הוא בודק איזה מהם הוא הכבד ומדפיס את מספרו. = 68 = בפניה להליך התמזגא יש לתת 7 נתונים ל-7 המשתנים, 6 משתנים יקבלו את הערך 0, כד לציין את המטבעות השווים במשקלם. את המטבע הכבד נציין לפי מספרו הסידור*. אם המטבע הכבד הוא מספר 5 למשל, נציין מספר זה עבור הנתון במקום החמ*שי. נרשום ---% 0 0 5 0 0 0 0 גמפדגא? הראת התנאי 51 דפת היא הוראה לבדיקת ביטויים לוגיים ושמירת ערך התוצאה (מטחך או 81595ת) בזיכרון המחשב במשך ביצוע ההליך. בשלב מסוים לאחר מכן יכולה לבוא הוראת תנא* א1, אשר לפניה נרשום ‏ 2א1 או קעקך, בכך נבדוק את התוצאה השמורה של בחינת הביטוי הלוגי, ואז: - | אם הביטוי הוא אמת תתבצע רשימת ההוראות המופיעה אחר* הוראת התנאי 11 (שטתדק1). - | אם הביטוי הוא שקרי תתבצע רשימת ההוראות המופיעה אחר* הוראת התנאי סע (4158קק1). לשם דוגמה נגדיר מחדש את ההליך 4188מ03, ונשתמש בהוראה עפמך ובהוראות 1ע1 ו-סע1: 0041881 תרדגה‎ 0: ם: 2: 1תמדהמתס 70 8: < : זפמך [ [0: 8ם] [8: תת] 0: < ג: ק1] לאד [ [0: תקע] [8: תק] 0: < ם: את1] עקד עאם הצגת משפטי הוראות תנאי בדרך זו, הינה פשוטה יותר ומובנת על- ידי קורא התכנית. המשפט בהוראת א1, צריך להיות כולו בשורת הוראות אחת שלימה, ללא הקשת <> באמצע. כאשר משתמשים בהוראה ‏ 1891 - משפט הבדיקה - 70 - יכול להיות בשורה נפרדת ‏ '... 1857', אפשרות 1 בשורה אחת: '...תע1', ואפשרות 2 בשורה אחרת: '...קחך'. בנוסף, ניתן להשתמש ב-181 וב-9ת1 יותר מאשר פעם אחת בהליך, בכל מקום שהוא. ההתייחסות תהיה תמיד אל תוצאות הבחינה של הביטוי שהופיע במשפט 57ם1 האחרון שבוצע. תרגילים 1. הגדר הליך המקבל מספר למשתנה א, בודק אם הוא חיובי או שלילי, ומדפיס הודעה מתאימה - הממאטא מ051110ק ג 15 א: או - תממאטא מטז1סטא 4 15 א: 2. כתוב הליך המקבל שני מספרים ובודק אם הם שווים או שונים. בהתאם לכך הוא מדפיס הודעה: - 5תממאטא השס או - פתממאטא ‏ תהטסטאט 3. כתוב הליך המקבל שגי מספרים ומדפיס אותם בסדר עולה. 8. כתוב תכנית המקבלת שלושה מספרים ומדפיסה אותם בסדר עולה. זכור, כי תכנית יכולה להיות מורכבת מהליך אחד ‏ או מהליכים אחדים. 5. כתוב הליך המקבל מספר. אם המספר גדול מ-10, תודפס המילה פטתץ, ואם לא - תודפס 4/5₪ת. 6. כתוב הליך המקבל שני מספרים, ומדפיס את הערך המוחלט של הפרשם. הגדר הליךך אשר מקבל מספר למשתנה 2: ומספר שני למשתנה 8:. הוא בודק אם,ג: גדול, קטן או שווה ל-8:, ומדפיס הודעה מתאימה. כתוב תכנית לפתרון בעיה הדומה לבעיה ג84128. עשה זאת עבור קבוצה של 9 מטבעות. כתוב תכנית המקבלת 4% נתונים אשר *כולים לשמש צלעות (לאו דווקא לפי סדר) לבניית מרובע, ובודקת אם אפשר ליצור מרובע שניתן יהיה לחסום בו עיגול. נתון המשפט: אם הסכום של שת* צלעותיו הנגדיות של מרובע נתון שווה לסכום של שת* הצלעות האחרות, אזי ניתן לחסום בו עיגול. השתמש במשפט זה לצורך בניית התכנית. - 72 = פרק 7 רקורסיה הליך נכתב לביצוע משימה מוגדרת וניתן לפנות אליו על-יד* ציון שמו בצירוף ערכים למשתנים (אם הוא מוגדר עם משתנים). ראינו, שהליך | אחד יכול לפנות להליך אחר, והדגמנו זאת בהליכים ההמפצ.אטא, או 110ת3. הליך רקורסיבי הליך יכול לפנות גם לעצמו. כלומר, נכלול את שם ההליך המוגדר כחלק מהוראות ההליך עצמו. הליך כזה נקרא הליך רקורסיבי (220060028 6ט61עטססת). נגדיר הליך רקורסיבי פ5תממאטא 10' המדפיס את המספרים הטבעיים. אסא: פהתמאטא 70 אשא: תק הוראה זו הינה פניה להליך עצמו ---6> 1 + אשא: פתממעטא פאם ביצוע הליך רקורסיבי נעשה במחזורים. נדגים זאת בעזרת ההל:ך שלמדנו. נבחר במספר '1' כערך התחלתי למשתנה אשא:. כאשר נפנה ל-פתממאטא ונרשום ---> 1 5תממוטא? יתבצע המחזור הראשון, ובשל ההוראה 'אשא: תתק' נקבל ---%> 1 - 73 - כאן מתבצעת פניה למחזור הבא. פניה זו רשומה כחלק מהוראות ההליך. אטא: מקבל ערך חדש, שהוא הערך העוקב של קודמו, כלומר (1+אסא:), כאילו רשמנו 2 פהממאשא. כתוצאה מביצוע המחזור השנ: יודפס ---> 2 שוב תתבצע פניה להליך, ומחזור זה יקרא למחזור של:ש'. ערך אטא: יהיה הפעם '3' ויודפס אף הוא על המסך ---> 3 וכן הלאה, מחזור יקרא למחזור, בכל קריאה ערכו של אטא: גדל ב-1 ובכל ביצוע מודפס ערך חדש ---> 8 פַ מתי יהיה על המחשב לסיים? - זאת לא אמרנו לו. ולכן, ₪ הוא ימשיך הלאה ... הלאה ... ללא הפסקה ... עד אי*נסוף. 0 8 על מנת להמנע מביצוע אין סופי של מחזורי הפעולה, יש 3% לכלול בתוך ההליך הרקורסיבי הוראת תנאי לסיום. 1 אם לא נכלול הוראת עצירה בתכנית, או אם נרצה לעצור כל ביצוע שהוא בלוגו, נעשה זאת על-ידי לחיצה על 70, לחיצה על 68%ע0%21+22 או על ₪50+תפוח, בהתאם לגירסה, ונקבל הודעה מתאימה. נכתוב עתה את ההליך 1פתתמאטסא ונכלול בו משפט תנאי לעצירה. נדרוש מהליך זה להדפיס את כל המספרים העוקבים מ-1 עד 100, ובהתאם לכך נקבע את הגבול אשר ישמש תנאי לעצירה. הגדרת 51תמתמשא אטא: 1פתתפאטא 10 [ 5102 ] 100 < אשא: עד אטא: תק 1 + אטסא: 51תממעא פאם המספר 1 יהיה הערך ההתחלת: של אטא:, והוא יודפס במחזור הראשון. בכל מחזור אחשא: יגדל ב-1 , וכשיגיע ל-100 עדיין התנאי להפסקה לא יתקיים, וכך יודפס גם המספר 100, אך לא יותר. = 8% 5 במקום הביטוי הלוגי '100 < אטשא:' יכולנו לרשום 101'‏ = אשא:'. שניהם מתאימים כתנאי הפסקה נכון. אך שים לב - כאשר השתמשנו בסימן היחס '<' (גדול מ-), בחרנו במספר 100 לצורך ההשוואה, אבל לסימן היחס '=' (שווה ל-), התאים המספר ‏ 101. השונ* בגורם ההשוואה הינו מקור שכיח לשגיאות בכתיבת תכניות ועל-כן רצוי להקפיד. לסיום ההליך 51תמפאשא השתמשנו בתנאי עצירה על מנת להמנע מביצוע אינסופי. עתה נגדיר הליך 2פהממאשא ובו משפט תנאי לביצוע, כלומר אם התנאי לא מתקיים הביצוע יסת'יים. הגדרת 2פ5הממשא אטא: 2פתממאטא 0י' [1 + אטא: 52תממאטא אטא: הק] 101 > אטא: קד פאם בהליך זה, כל עוד ערכו של אשא: קטן מ-101, המחשב מדפיס ערך זה ומתבצעת פניה נוספת להליך. נכתוב הליך המדפיס את סכום המספרים הזוג*יים מ-21 עד 100. הגדרת 5082001 0% א: 52001 70 [ 5102 א5080%: תק ] 100 < א: שד ( א: + א500:) (2 + א:) 502001 ספאם להליך זה שני משתני קלט: א: לקליטת המספר הראשון, %ם: המציין את הערך ההתחלת: של המשתנה שאליו צוברים את המספרים. המספר הזוגי הראשון לאחר 21 הוא 22, ולכן הוא ישמש כערך התחלת: ל-א:. ל-50808: ניתן ערך 0 (אפס). כאשר נרשום ---6 0 22 02001 נקבל את התוצאה הבאה: 2220 - 75 - בפניה מתוך ההליך, הערך של א: גדל ב-2, כלומר במחזור השנ* הוא יהיה 28 במקום 22. אל א5080: המשמש כמשתנה צובר, יתוסף ערכו של א: של המחזור הנוכחי (22 + 0). בתחילת המחזור השלישי א: יהיה 6 ו-א50008: יהיה הפעם 46 (=22+24), וכך ישתנו הערכים ממחזור למחזור עד לקיום התנא* ‏ - '100 < א:'. רק אז יודפס ערכו של הסכום הכללי (א50808: תהת), והביצוע יסת'יים. מה היה קורה אילו רשמנו 21 כערך התחלת* ל-א: במקום 22? הנכון הוא - שהיינו מקבלים את סכום כל המספרים האי-זוגיים מ-21 ועד 100. דבר שמביא אותנו להסיק שיש לבחור בקלט הנכון בהתאם להנחיות הבעיה. עוד דבר שיש להעיר עליו הוא, שאם היינו משתמשים במשפט התנא* בביטוי הלוגי '101 = א:', הביצוע היה הופך לאינסופי עבור 22 כערך התחלתי. אותו הדבר היה קורה לגבי הביטוי '100 = א:' עבור חישוב סכום המספרים האי-זוגיים מ-21 ועד 100. התדע מדוע? סיוע: נסה לחבר כפולות של 2 אל הערך ההתחלתי שקבעת. בהליך רקורסיבי מתבצעות ההוראות שוב ושוב, כאשר הערכים של המשתנים עליהם מתבצע החישוב יכולים להיות שונים ממחזור למחזור, בהתאם לדרישות התרגיל. מה שכן צריך להשתנות, זהו ערכו של הביטוי הלוגי שבו תלוי התנאי לעצירה או התנאי לביצוע, ולכן ‏ :יש להיות זהירים בקביעת התנאי הזה. תרגילים 1. הגדר מחדש את 5082001, אך הפעם השתמש בתנאי לביצוע. כל עוד התנאי מתקיים, הביצוע נמשך (ללא הוראת 5102). 2. כתוב הליך להדפסת המספרים מ-1 עד 50 המסתיימים ב-6. 3. כתוב הליך המדפיס את המספרים מ-1 עד 100 המתחלקים ב-7. - 76 - %. כתוב הליך המדפיס בסדר יורד מ-200 ל-100 את המספרים המתחלקים ב-8. 5. כתוב הליך להדפסת סכום המספרים מ-1 עד 30 המתחלקים ב-3. 0 + ...+ 9 + 6 + 3 6. כתוב הליך רקורסיבי להדפסת מכפלת המספרים מ-1 עד 10. 0 * ... * 3 %* 2 %* 1 7. הגדר הליך להדפסת תרגילי כפל של א: במספרים שמ-1 עד 10. אם הערך של א: הוא 6, נקבל: . 12 6 * 1 6 * 2 6 * 10 > 0 בהוראת ?מקטת מתבצעות ההוראות שברשימה מ פעמים. תנאי ההפסקה של הביצוע התחוזר נבדק על-ידי פעולת פיקוח פנימית של לוגו באמצעות מונה. הוא< סופר כמה פעמים התבצעה רשימת ההוראות, ומשווה בין מונה זה לבין הערך של ת. גם שינוי ערכו של המונה וגם הבדיקה כלולים בתוך ההוראה עצמה. להלן הליך המדפיס א: בעמים את המשפט 'אבאתמקט 5‏ 2 8ב 1', פעם בהליך רקורסיבי ופעם עם ההוראה 1גמקתת. הגדרת סשת הגדרת לסטת מאסא: א: סמת 0 א: צעפת 70 [ 5109] א: < מאסא: קך זנ אגאתםקטם ג אה 1] תק ] א: שהמקתת ] אאתתקטס 4 אה 1] תהק פאם א :1 + מפאסא: סחת פאם - 771 - אם ניתן למשתנה א: ערך זהה בשני ההליכים, ולמשתנה מא0א: ניתן את הערך 1, הפלט שיתקבל מביצוע ההליך שמת יהיה זהה לפלט של עקפת. ב-880 המשתנה מאסא: מיועד לספור כמה פעמים מתבצעת הרקורסיה. לכן, אם מספר הפעמים הנדרש ידוע (או ניתן לחישוב), וביצוע ההוראות החוזר על עצמו הוא ללא ערכים משתנים, ניתן יהיה להשתמש בהוראה ד4מקטת. הדנטה רקורטיבית נלמד עתה דרכים לנצל את העוצמה של הרקורסיה בפקודות הדפסה שונות. ההוראה ‏ מפצך בהוראה עא%1, עובר הסמן בתום ההדפסה לתחילת שורה חדשה. כאשר הרצנו את פהתפאשא, הודפסו המספרים זה תחת זה. כל הוראת תק קיבלה ערך חדש והדפיסה אותו בשורה חדשה. שונה הדבר בהוראה אפצץ, בה לא יעבור הסמן לשורה חדשה, אלא ישאר אחר* התו האחרון שהודפס. שם יודפס הנתון הבא (אם יש כזה). מבנה כללי: דבר מפצך דוגמה ---6> צפסגע 170 צססגת" מקצך תהמצ" מפצץ אמא" מפעך פא כאשר (רשום ---6> צסקות? נקבל: ?ממ צעשטאצקקו האות א של אמא הופיעה מיד אחרי האות צ של צקקגא, וכך גם לגב המילה מע הצמודה למילה שמא. ובסיום ה-מקצץ האחרון הופיע התו - 8 - (?) של 1000 באותה שורה, בצמוד לאות 8 של תגמצ. המילים הודפסו ללא רווחים ביניהן. על מנת לקבל רווח בין נתון לנתון עלינו לבקש הדפסת רווח במקום הדרוש, באמצעות הלוכסן ההפוך (). דוגמה ---> מ" מקצך תהמצס" מפצץ אמא" מקצד סצפפגת" מפצץ? נקבל: ?7 תהמצ אטא צספגה שים לב: התווית (?) הופיעה אחר* ‏ תו רווח, שהוא התו האחרון שהודפס (תו הרווח הוא התו של הוראת מקצ1 האחרונה). נוכל להשתמש בהוראה שקצ1? להדפסה של מספר דברים בהוראה אחת, אם נתחום את כל המשפט בסוגריים עגולים: ( ס" תהמצס" אמא" סצקקזז" מעצד )? הוראת טקצך פועלת גם על רשימה. בהדפסת רשימה תמיד י*ופיע רווח בין הנתונים. דוגמה ---6> [תגמצ שמא צקקגז] מפצץך? נקבל: ?7 מצ ומא צפסגת גם כאן, התווית (?) של לוגו צמודה לתו האחרון שנכתב. הדנסת רצף 4ל תריס המטמצים סמלים במתמטיקה כאשר התבקשת לכתוב הליך היוצר צורות בשיטת ה-168צת90₪1-0280, יעצנו לך לא להשתמש בתווים הש**כים למתמטיקה. הסיבה לכך היא, שלוגו מקבלת כל אחד מן התווים האלה כנתון אחד ויחיד, ולכן לא נוכל לרשום הוראה להדפסת רצף של כוכביות, למשל. אם נכתוב למשל ---6 [****א*] תק? נקבל: * % א % %* - 79 - גם אם נרשום ---> [*****] מקעך? נקבל: ?א א א א * בין כל שתי כוכביות הופיע תו רווח. הדבר נכון ‏ גם לגב:י שאר הפעול%ת החשבוניות, פעולות היחס והסוגריים העגולים. בלוגו לא נוכל לכתוב: ‏ ***" תק, וגם לא: ‏ ***" מקצץ. בכל מקרה נקבל הערה, שכן לוגו מוכנה לקבל רק נתון אחד, ז"א כוכבית אחת המלווה בגרשיים, אך לא *ותר. נוכל לנצל את התכונה של טפקצץך באופן הנכון כדי לקבל את שביקשנו. אם נכתוב ---> (%" א" א" א*" מקצך)? או אם נרשום 7--6 [*" מקצך] 4 דגמקסמת? נקבל % כוכבים צמודים: ?א אחרי כל הדפסה ב-מקצץ יעבור הסמן לעמודה הבאה, שם הוא ידפיס את הנתון התורן. עוד אפשרות להדפסת רצף של סימנים היא על-:ידי השימוש בלוכסן, כפי שעשינו בהדפסת רווחים. לדוגמה ---> ****" תהק? או ---> [****] תק? בשיעור הראשון רשמנו הוראה להדפסת הברכה 'צגפאצתדת צקקגת' במרכז המסך, מחקנו והצגנו שוב לסירוגין 20 פעם: [[צא.. ... ...5870 25 דג דאמדתהמ 01 25 ₪411] 20 צהמקטת? - 80 -; נוכל לעצב את הברכה בצורה נאה יותר, אם נמסגר אותה בכוכביות למשל, או כל תו אחר. לדוגמה: *אא3א++%אא%%%%% % %%% * * + צהכאצתדם צקקגת ‏ * * *+ **%*%%%% 4444444444 אבל, כאשר נשתמש ב-7א012407₪ נמחק את כל המסך וכך, ‏ גם המסגרת תופיע ותעלם יחד עם הברכה. אבל, אנו רוצים שהברכה בלבד תוצג ותעלם לסירוגין. כאשר מציבים את הסמן בנקודה (א,צ), שבה כבר מופיע תו כלשהו, ומבקשים הדפסת תו אחר, הפלט החדש יעלה על הישן. כלומר, אם נבקש הדפסת תו-רווח במקום שבו קיימת האות '8' למשל, תעלם אות זו ויופיע במקומה רווח. לכן נוכל לתת הוראה שתמחק את רצף התווים היוצרים את המשפט 'צגסחדתזם עקקגא' בלבד והמסגרת תשאר ללא שינוי. נרשום שוב את משפט ההוראה +ךמקטת, עם השינויים המתאימים: ו [מ" מעצד] 1% דקפת [13 11] 581008508 25 דדגש] 20 דהמקמת? [[ צאפוודתדט צקקגז] מקצד [13 11] 501008508 25 צדגט במשפט שלפנינו ההוראות המודגשות הינן במקום ההוראה [ַא78ת01₪ שבדוגמה הקודמת. ההוראה ‏ 18 ץהמקחת מציינת שיש לכתוב 12 תוו:י-רווח, החל מהמקום המצויין על פני המסך. שים לב לכך שההוראה ארוכה מאורך שורה. ב-1.000 18פק8, סימן הקריאה בסוף השורה מציין ששורת ההוראות לא מסתיימת כאן, וההמשך מופיע בשורה הבאה. ב-18% מציינים זאת על- ידי חצ-ימינה (<--). - 81 - יש להבחין בין אופן הביצוע של ההוראה עאזתק, לבין אופן הביצוע של ההוראה 8קצץ1. ב-8ק790 הפעולה מתבצעת על כל עמודה (או תו), ובתום ההדפסה נמצא הסמן בעמודה הבאה לאחר התו האחרון שהודפס. לעומת זאת, ב-28 הפעולה מתבצעת על שורה של*מה. על-כן, אם הפלט המודפס באמצעות ההוראה 28 אינו ממלא את מספר התווים שבשורת המסך, מתמלאים התווים הנותרים של השורה ברווחים. השינויים שעשינו ברשימת ההוראות של זג|מקתת מבצעים את אשר בקשנו, אבל הם הפכו את המשפט לארוך מאד. דבר זה לא נאה לעין ולא נוח לקריאה. לכן נגדיר הליך צעע, ונכתוב בו את כל ההוראות הכלולות ברשימה של ץהמפתת במבנה נוח וגם פשוט יותר. הגדרת ‏ צקת צפם 70 [13 11] 501008508 [ פ" מקצע] 18 צהמסמת 5 ץד [13 11] 507003508 [צאסחתדם צקקגא] מפצך 5 דט פא הליך זה מציב את הסמן בעמודה 13 אשר בשורה 11, מדפיס 18 תוו'- רוותה בזה אחר זה, ממתי| קמעה, מציב שוב את הסמן בנקודה (11,13), מדפיס את הברכה, וממתין כאן שוב. הדפסת הברכה ומחיקתה מתבצעות פעם אחת בהליך זה. אם נרצה שהביצוע יחזור 20 פעם, נוכל לרשום ---% [צסא] 20 גמקטת? כעת נוכל לכתוב הליך היוצר מסגרת במרכז המסך הבנויה מכוכביות, ובתוכה תופיע הברכה ותעלם מבלי שהדבר ישפיע על המסגרת. > 42 = הגדרת 1צגסווזתזם א: 1צאפמתתנם 70 אתמ 01 501008508 ]9 11[ [+" מקצץל] 18 דהמסמת *" מקצע [10 10] 501008508 *" הק [29 10] 501008508 *" מקצך [10 11] 501008508 *" מקצך [29 11] 51008508 *" מקצד [10 12] 581008508 *" מקצ [29 12] 501008508 [11 13] 501008508 [+" מקצע] 18 עאמקמת [צפם] א: דהמקפת פאם בהליך זה מנקים את המסך, מדפיסים את המסגרת ומבצעים א: פעמים את ההליך צפן. הערה: משתמשי הגירסה של 11 1060 םתקקה או 1060 אזקק, צריכיםס להפוך את סדר הנתונים המציינים את הקואורדינטות של הנקודות שעל המסך. תחילה יש לרשום את ערך העמודה ואחר כך את ערך השורה, כלומר (צָ,א) במקום (א,ץ). הנעלת הליך רקורטיבי מתוך הליך רקורטיבי אחר נגדיר הליך רקורסיבי המדפיס סידרה כלשהי של מספרים עוקבים מ-ת ועד ם, כשרווח אחד מפריד בין מספר למספר. - 83 - הגדרת 51084 א: א: 5124 70 [ 5109 ] א: < א: סך ( סם" א: מפצץ ) א: 1+א: גתפדפ פאם אם נכתוב ---6 0 ך 84ת51? נקבל: 90 19 18 17 16 15 14 13 12 11 10 9 8 7 המשתנה א: קיבל את הערך 7 כערך התחלתי, ובכל מחזור הוא גדל באחד. המשתנה א: קיבל את ערך הגבול המהווה את המספר האחרון של הסידרה. בכל מחזור נעשתה בדיקה אם א: < א:. כל עוד א: אינו גדול מ-8:, המחשב מדפיס את ערכו של א: ותו רווח אחד, וממשיך למחזור שלאחריו. כאשר תנאי זה מתקיים מסתיים הב*צוע. נוכל לכתוב הליך 5125 הפונה ל-51288 להדפסת המספרים מ-1 עד 9, כך שבשורה הראשונה יודפס המספר ---> 1 בשורה השניה יודפסו שני המספרים מ-1 עד 2 ---> 2 1 בשורה השלישית יודפסו המספרים מ-1 עד 3 ---> 3 2 1 וכן הלאה עד השורה התשיעית ---> 9 7 6 5 3% 12 הגדרת 5105 5 70 " תת 1 1 גחפ51 " תת 2 1 פ51 " תת 3 1 גאפ51 " תע 14 התפדפ " אע 5 1 גתפ91 " תע 6 1 גתפ81 " תע 17 גתפ51 " תע 8 1 8פ51 " הת 19 התפ51 פאע - 88 - ההליך 51825 פונה ל-4ג 512‏ 9 פעמים. בכל קריאה הוא קובע ל-א: את הערך 1, ואילו ל-4: הוא קובע ערך גבולי הגדל משורה לשורה ב- 1. בקריאה הראשונה ערך הגבול יהיה 1, בקריאה השניה הוא יהיה 2, וכן הלאה, עד שבקריאה התשיעית א%: יקבל ערך 9. אחרי כל קריאה ל- 4 ניתנה ההוראה ‏ '" תפ', כדי שהסידרה הבאה תודפס בשורה חדשה. הליך זה הינו פשוט, כי לכל פניה יש הוראה נפרדת. ההוראות מתבצעות לפי סדר זו אחר זו, וההליך מסתיים על-ידי ההוראה כפאם. שיטה זו טובה כאשר מספר הצעדים קטן. אך אם נרצה לבצע את הפעולה 0 פעם למשל, האם נצטרך לכתוב 500 שורות של הוראות? בגלל המבנה הסדיר של ההליך 51805, ניתן להפוך אותו להליך רקורסיבי, כפ: שמובא להלן: הגדרת ‏ 510251 8%: 051 70 [ 5109] 9 < א: פך א: 1 ב8ת51 " הק 1: 51 סאם כדי לקבל תוצאה כמו של הליך 518025 המקור:י, נכתוב ---% . 1 51 למשתנה א: אשר משמש להעברת ערך הגבול ניתן ערך התחלת* 1. מספר השורות שיש להדפיס הוא 9, ולכן התנאי לעצירה הוא כאשר (<א:. בכל מחזור פונה ההליך 518251 ל-51084, וקובע ל-א: את הערך 1, ואילו ל-8: מועבר ערך המשתנה א%: שהוא כאמור, הערך הגבול*י לכל שורה. במחזור הראשון ‏ א: מקבל ‏ 1, ולכן מודפס 1 ותו לא. אחרי סיום הביצוע של 51288, חוזר המחשב להוראה הבאה לאחר הקריאה '" תפ', - 85 - הוראה ‏ זו מעבירה את הסמן לתחילת שורה חדשה, בה מתבצעת ההדפסה של המחזור הבא (1+א: 918091). בכל מחזור א: גדל ב-1, וכך בכל קריאה מקבל א: ערך גדול ב-1 מאשר בקריאה הקודמת. תרג'לים (המשך) 8. כתוב הליך 148 להדפסת ם תווי רווח, לכל ערך שהוא ם. לאחר מכ , השתמש בהליך זה כחלק של הוראה המדפיסה שנ* שמות, למשל 2008 ו-01.1/8, כש-ם תווי רווח מפרידים ביניהם. לדוגמה, אם נכתוב ---6> 5" תכ 7 גד צספסק" מפצץ? נקבל: יצע ההליך 718 קיבל את הערך 7 כקלט, ולכן קיבלנו 7 תווי רוות בין שני השמות (התו מ מסמל תו רווח). 9. הגדר הליך המקבל שם כלשהו, ומדפיס אותו על פני כל המסך. 0. הגדר הליך 4א₪82 המקבל שני מספרים טבעיים, אחד ל-: והש(* ל-א:, מחשב ומדפיס את 4: בחזקת א%:. כתוב הודעה אשר תציין את שנ*י מספרי הקלט ואת התוצאה. 1. כתוב הליך 'אטא: פט01148ע 0'' להדפסת הפלט הבא: בשורה הראשונה יופיע סימן דולר אחד --->% % בשורה השניה *ופיעו שני סימני דולר ---> 5% בטורה העשירית יופיעו עשרה סימנ* דולר --->% 9% משפט העצירה יהיה '[5102] 10<אטא: ענ'. - 86 - .2 .3 .1 .5 כתוב הליך '15א: אאספהג.1וסק 0'' אשר ידפיס בטורה הראשונה 10 סימני דולר ---> 5% ובכל שורה יודפס סימן '%' אחד פחות ---> 5% עד שבשורה העשירית יודפס דולר אחד בלבד ---> % הערך ההתחלת:י של 15א: הוא 10. בכל מחזור יופחת ממנו אחד ועל-כן הוראת העצירה תהיה '[5102] 15%1א: תז'. כתוב הליך להדפסת הפלט הבא: בטורה הראשונה יודפס המספר 1 פעם אחת ---6 1 בשורה השניה - המספר 2 פעמי'ם ---> 22 בשורה השלישית - המספר 3 שלוש פעמים ---> 3 ובשורה התשיעית - המספר 9 תשע פעמים ---> 099 הגדר הליך להדפסת הפלט הבא: בשורה הראשונה יודפס המספר 1 אחר* רווח אחד -ד-> 1 בשורה השניה יודפס המספר 2 אחרי שני רווחים ---> 2מס בשורה השלישית - המספר 3 אחרי שלושה רווחים ---> 3 ובשטורה התשיעית - המספר 9 אחרי 9 רווחים ---6 9פסססססססס זכור: התו ס מסמל תו רוות. הגדר תכנית קש0חפטא היוצרת משולש כוכביות כפי שמוצג כאן: * %%% %%%א%+ *%..א%.אא *%.%א%אא%% +.אצ+א+%%%%%% *אא אאא א % א %%%+ = 87 - 6. הגדר הליך אאספעפטא היוצר משולש כמו בתרגיל 13, אבל הוא יהיה מוצב הפוך: הבסיס למעלה והקודקוד מופנה כלפי מטה. 7 שנה את משפט העצירה שבתרגיל 18, כך שבתום ביצוע שסתפטא, תתצצע פניה להליך אשספאפטא ורק לאחר מכן הביצוע :*עצור. הצורה שתתקבל במקרה זה תהיה מעוין של כוכביות. 8. כתוב תכנית עם משתנה קלט א: המקבל ערך טבע* ומדפיסה את הפלט כמובא להלן. במקום א: יודפס הערך של המשתנה. א: ... 4 3 2 1 א: ... 43 3 2 א .34 א: (: א: 9. כתוב תכנית להדפטסת לוח הכפל של 10 על 10. הפלט יהיה: 9090 9 8 7 6 5 5 3 2 1 9 18 0 2-8 100 חי 150 0. בהנחה שלא קיימת ההוראה ₪417 בלוגו, הגדר אותה בעצמך. 1. כתוב תכנית להדמ*יית שעון דיגיטלי לציון השעה, הדקה והשניה. למשל, אם שעון זה מצביע על השעה 4, 36 דקות ו-7 שניות, נראה זאת על המסך בצורה הבאה: 8:36:07. הדרכה: תכנית זו תהיה מורכבת מארבעה הליכים: א0100, השסא, מעטאצא ו-2א₪00פ. - 88 - ההליך א0100 10 - ינקה את המסך. - יבנה מסגרת נאה לשעון. - יקבע מקום להדפסת הנקודתיים המפרידים בין ציון השעות, הדקות והשניות. ויפנה להליך ₪008, עס ערך התחלת*י 1. ההליך ‏ 8: ₪008 70 - | יקבע את המקום שבו תודפס השעה. אם השעה מצויינת על-ידי סיפרה אחת, יש להדפיס רווח במקום סיפרת העשרות. [א: מקצע] [(8: ס" מפצצ)] 8610: חד - | לאחר מכן הוא יפנה ל-18טא1א ויתן ערך התחלתי להרצת הדקות. עם תום הביצוע של מעטא1א, מתקדמים למחזור הבא לציון השעה הבאה ‏ '1+ע8: תּחַסק'. תנאי להפסקה יהיה כאשר השעה היא 12 למשל. ההליך א: שצטאזא 70 - | ימקם את הסמן בנקודה בה יודפסו הדקות. אם הדקה היא בת סיפרה אחת, ‏ יש להדפיס אפס במקומה של סיפרת העשרות, [א: מסצד] [(א: 0" מפצד)] 610א: קד - על ההליך לפנות ל-2א5₪00 עם ערך התחלת:* '0' להרצת השניות, 5 ולאחר מכן להתקדם למחזור הבא '1+א: שצטאזא'. תנאי העצירה יהיה כאשר '59<א:'. ההליך ‏ '5: 5א00מ5 70' דומה להליך מצשאזא, אך בהבדל קטן: הליך 9פא5₪00 אינו פונה להליך אחר פרט לעצמו '5+1: פא5₪00'. בנוסף, יש לכלול בו הוראת השהיה משניה לשניה. - 89 - פרק 8 פונקציות נתונות בלוגו, כמו גם בשפות אחרות, כלולות פונקציות שימושיות שונות. יש הקוראים להן פונקציות בנויות (58תס1ס6תט"ת םד16-1דט2), כי הן נבנו עם יצירת השפה. נקציה, ארגומנט וערך הפרנקציה לפני שנמשיך נסביר את מושג הפונקציה (םתס61>סמטץ). נתונות שתי קבוצות א' ו-ב', ולכל איבר בקבוצה א' מותאם איבר אחד ויתחיד של קבוצה ב'. התאמה זו נקראת פונקציה מקבוצה א' לקבוצה ב'. קבוצה א' נקראת התחום של הפונקציה, וקבוצה ב' נקראת הטווח של הפונקציה. איבר אחד בתתום נקרא ארגומנט (%6תפשטשתה), אשר בשפות התכנות, זהו הקלט שעליו מתבצע החישוב. תוצאת החישוב של הפונקציה, הינה ערך הפונקציה (6ט081 מ0ס1סס6מטע). פונקציה ניתנת לתיאור באופנים שונים: באופן מילולי, על-:ד: טבלה, על-ידי הצגה גראפית, על-*די נוסחה ועוד. הפונקציות המתמטיות מתוארות בדרך כלל על-ידי נוסחה. בחישוב הנוסחה מותאם לאיבר מסוים בתחום, לארגומנט, ערך אחד ויחיד. פונקציה יכולה גם להתאים עבור זוג ארגומנטים, או *ותר, ערך אחד ויחיד. לדוגמה, פעולות החשבון הרגילות הן פונקציות שכאלה. כאשר טווח הפונקציה מכיל איבר אחד ויחיד, ערך הפונקציה הוא קבוע, ולא תלו: בארגומנט. פונקציה כזו נקראת פונגקציה קבועה. - 99 - לפונקציה קבועה אין צורך בקלט, כי ערכה אינו תלוי בו. מאוחר יותר נכיר פונקציה לא-קבועה, אשר אינה דורשת קלט כלשהו. תוצאת החישוב של הפונקציה מהווה ערך, ולכן ניתן להשתמש בה גם בתוך ביטוי חשבוני. כאשר פונים לפונקציה יש לומר למחשב מה לעשות בערך המתקבל מחישוב הפונקציה. כך, הפלט של פונקציה מהווה ערך שיש לפעול עליו בעזרת הוראה כלשהי, בעוד שהפלט של הליך מודפס על המסך או במדפסת. מ נקצית מתמטיות בסעיף ‏ זה נכיר מספר פונקציות מתמטיות, אשר אפשר להשתמש בהן בצורה פשוטה בתוך תכנית. הן מקבלות נתון אחד או יותר כקלט, ומבצעות חישוב שתוצאתו הוא ערך אחד בלבד. הפניה אל הפונקציה נעשית על-ידי ציון שמה, בצירוף ערך או ערכים הנדרשים לצורך החישוב. כקלט לפונקציות מתמטיות ניתן להשתמש בכל דבר בעל ערך מספרי - קבוע, משתנה, ביטוי חשבוני, או פונקציה אחרת. פ 8 50% פונקציה זו מקבלת שני נתונים 8 ו-ס ומחשבת את סכומם. לדוגמה: 0 25 50% הק? המחשב ידפיס: 055 ניתן להפעיל את הפונקציה על מספר רב יותר של נתונים, אם נתחום אותה בין שני סוגריים עגולים - לדוגמה: (10 9 8 7 6 5 53 3 2 1 אספ) מק? במקרה הזה נקבל את סכום כל הנתונים: 55 - 91 - ם 8 1סטססחהק הפונקציה 2800001 מקבלת שני נתונים ומחשבת את מכפלתם. לדוגמה: 1 230 עסטפסאק מק? המחשב *ידפיס: 200 גם פונקציה זו פועלת על מספר רב יותר של נתונים, באותה דרך כמו ב-508. כלומר, ‏ יש להציג את שם הפונקציה ואת כל הנתונים בין סוגריים עגולים. לדוגמה: ( 5 4 3 2 1 עסטפסמק ) תק? נקבל: 1|090 פ 8 מסאמתמעעזס (לא קיימת בגירסה של 0000 ₪ קק)) פונקציה זו מחשבת את התוצאה של "8 פחות ס". לדוגמה: 7 100 מסאמתמעקדת תק? נקבל: 3 ספ 8 זאמזסט ב-1,000 198 וב-11 10060 םסקה הפונקציה מבצעת את פעולת החילוק של 8 ב-5, ומקבלים שלם וחלק עשרו(נ'. לדוגמה: 5 48 זאמזינסטס תק? נקבל: 1.6 - 92 - ב-1000 2818 הפונקציה מחשבת את חלוקת 8 ב-ם, ומקבלים את החלק השלם בלבד של המנה. לדוגמה: 5 36 צאמ1צסטם הק? המחשב ידפיס: 9 5 8 זאמ1נסטסצאד (פונקציה זו קיימת רק ב-11 10060 ₪ ן]סקה) הפונקציה מחזירה את המנה של חלוקת 8 ב-0. לדוגמה: 6 15 עאמ1נסטסנאד תק? נקבל: ' 2 ם 8 המסק (פונקציה זו קיימת רק ב-10060 א18) הפונקציה 20088 מקבלת שני נתונים ומחשבת את התוצאה הבאה: הנתון הראשון מועלה בחזקה של הנתון השנ'. לדוגמה: 3 7 המטסס מק? נקבל: 33 תח זאד הפונקציה 1א1 מקבלת ערך אחד של מספר עשרוני, ומחשבת את חלקו השלם. לפניך מספר דוגמאות: 6 <--- 9 יאד תק? 6 <--- 9 עאד תק? 6 <--- - 6.29- עא1 ק? 6- | ל--- 0 6.99- עאך מק? - 93 - םת יכול להיות גם כל ביטוי חשבוני שהוא. לדוגמה: (8 / 76) אע הק? נקבל: 9 ספ 3 המפאזוועת הפונקציה המפאזבאמת מקבלת שני נתונים 8 ו-ס, של החלוקה של 8 ב-ס. ומחשבת את השארית לדוגמה: 3 16 תמפא-האטת תק? הפלט יהיה: 1 מכיון שהחלוקה של 16 ב-3 שווה 5 נקבל כתוצאה את השארית 1. נוכל להשתמש בפונקציה אמפא41אמת כדי לקבל את סיפרת העשרות של מספר בעל שלוש ספרות. ניקח למשל את המספר 3[2. תחילה נשתמש בפונקציה עא1 כדי לקבל את הערך השלם של חלוקת 312 ב-10 ונקבל [3. אחר כך נשתמש בפונקציה המכאזגאמת כדי לקבל את השארית של חלוקת ]3 ב-10: נכתוב: 0 (10 / 372 עאד) תספאדגאפת הק? ונקבל: 7 ב-1000 8עק8 נוכל לרשום פקודה משולבת: 0 (10 372 זא0001₪) המפאדגאמת הק? כפי שניתן לראות, ב- 1א000118: 8 372 ו-5= 10, וב-8מקא41אסת: 8= (10 372 עא600118) ו-ם= 10. בשתי פונקציות אלו, ‏ ₪ אינו יכול להיות אפס, כי החלוקה באפס אינה מוגדרת. - 984 - הח 3 הפונקציה 50%1 מקבלת נתון בעל ערך חיובי, ומחשבת את השורש הריבוע*י שלו. לדוגמה: 50% תק? יודפס: / נתון הקלט יכול להיות גם ביטוי חשבוני, או פונקציה. ב-000 2708₪ק8 הערך המחושב על-:ד: 1 הינו תמיד מספר עשרוני. לכן, תופיע בו הנקודה העשרונית, גם אם חלק השבר העשרוני שווה לאפס. נחשב לדוגמה את היתר של משולש ישר זווית, כאשר נתונים הניצבים: 3 ו-4=ם. נוכל לכתוב לפי משפט פיתגורס את ההוראה הבאה: ( ( 3 ₪ צסטססתת ) + ( 3 3 צסטססתק ) ) 502 מק? ונקבל: .5 שים לב, כי 5081 פועלת על ערך אחד בלבד, שהוא תוצאה של הביטו: המורכב הכלול בתוך הסוגריים החיצוניים. ם פאטסת פונקציה זו מקבלת ערך אחד ומעגלת אותו למספר השלם הקרוב אליו. עבור 0לת: העיגול נעשה כלפי מעלה, אם החלק העשרו(: גדול או שווה ל-0.5. אם החלק העשרוני קטן מ-0.5, אזי העיגול נעשה כלפ: מטה. עבור 0>ת: העיגול נעשה כלפי מטה, אם החלק העשרוני גדול או שוות ל-0.5. כאשר החלק העשרוני קטן מ-0.5, העיגול נעשה כלפי מעלה. - 95 - להלן כמה דוגמאות: 2 <--- 9 פאשסת תהק? 3 <--- 5 פאטסת מק? 1 <--- 7 פאטסת אק? 8 <--- 2-- פאשסם תק? 0-9 <--- 5 פאטסת מק? בשל הסימטריה הקיימת על ציר המספרים משנ* צדי האפס נמצא כי: א:- פאשסת שווה ל- א: פאשסת- כעת נכתוב הוראה, אשר מעגלת מספר עשרוני עד שת*י ספרות אחר:* הנקודה. למשל: 0 / ( 0 * 34.5369 פאטסת) הק? נקבל: 5 בנוסף לפונקציות המובאות מעלה נמצא בלוגו גם פונקציות לחישובים טריגונומטריים: ם א51, ם 605 ו-ת אג4807, אשר לא נדון בהן כאן. תרגילים 1. כתוב הליך המקבל מספר כלשהו, בודק האם הוא זוגי או א'- זוגי, ומדפיס אותו עם הודעה מתאימה. רמז: מספר זוג* מתחלק ב-2 ללא שארית. 2. כתוב הליך המקבל מספר כלשהו למשתנה %:, בודק האם הוא מתחלק בנתון צ: ללא שארית, ומדפיס את המספר והודעה "כן/לא" בהתאם לתוצאה. - 06 - כתוב תכנית המקבלת למשתנה א(א: מספר כלשהו בעל שלוש ספרות, ומדפיסה בזה אחר זה: - את סיפרת המאות, ה את סיפרת העשרות, - את סיפרת היחידות. כתוב מחדש את תרגיל מס' 3 על מנת לקבל את המספר בחלוקה של מאות (סיפרת המאות עם שנ* אפסים), עשרות (סיפרת העשרות עם אפס אחד), ויחידות. יש להגדיר את ההליך שבשאלה ‏ 43, כך שידפיס את הפלט לףפ: הדוגמה הבאה: אטא: = יחידות + עשרות + מאות לדוגמה: 9 >= 9 + 30 + 500 נתונה מכונה למכירת ממתקים, המקבלת כתשלום מטבע של שקל אחד, ומחזירה עודף במטבעות של 1/2 שקל, 10, 5 ו-1 אג'. כתוב תכנית המקבלת כנתון את מחיר הממתק, מחשבת ומדפיסה את העודף במספר מינימלי של מטבעות. אם מחיר הממתק הוא 27 אג' ושולם עבורו 1 ש"ח, הפלט *היה, למשל: 1/2 עס (5)א001 1 .7 160 שס (5)א001 2 .1 5 אס (5)א001 0 .04 1 עס (5)א001 3 כתוב תכנית המקבלת כקלט למשתנה 8א11: משך זמן בשניות, ומדפיסה זמן זה בשעות, דקות ושניות. לדוגמה - אם הקלט הוא 16370, אז הפלט יהיה >---‏ 1:32:50. המספר ‏ 84 מציין את השעות, ‏ 32 מציין את הדקות ו-50 - את השניות. - 97 - הגדר תכנית המורכבת משני הליכים, האחד ‏ - א[א%צ והשנ' - סקז התכנית מחשבת איזה יום בשבוע חל אטא: *מים אחר: יום צגכ:, ומדפיסה את שם היום באנגלית. הדרכה: הגדר הליך א1א4צ, שבו המשתנה צ8כ2: מקבל ערך מספר: המציין את היום לפי מספרו הסידור* בשבוע: 1 = יום ראשון 2 = יום שג 7= יום שבת המשתנה אשא: מקבל ערך המצביע על תקופה מסוימת המבוטאת במספר *מים. ההליך אצ פונה להליך 128904 המוגדר עם המשתנה 0%צ: ומעביר ל-08צ: ערך של ביטוי חשבוני המחשב את היום החל אטא: ימים אחרי יום 28:. ערך זה יכול להיות 0, 1, 6...,2. ההליך אסצטלות מדפיס את שם היום באנגלית בהתאם לערך של אסצ: - | אם א0צ: שווה 0 יודפס צ8בכ54108 = אם 0%צ: שווה 1 יודפס צהפאשפ וכן הלאה. כאשר נרשום לדוגמה -%77> 3 2 אדאגץ? נקבל: צהספטפאמח 165 צהכ מחך הנתונים הם: - צ8כ: מקבל את הערך 2, - אטא: מקבל את הערך 23. התוצאה, היום 'צגס5מפאמט' מתקבלת כדלהלן: שארית של החלוקה של הסכום 'ששא: + צגכ:' במספר 7 (מספר הימים בשבוע). = 98 = 9. הגדר הליך לפתרון המשוואה הריבועית: 6=0+אמס+?א8 עבור 90 ו-02-4806<=50. בכל מקרה אחר יש להדפיס הודעת שג:אה. השתמש בנוסחה: יק 0% 12 28 נשתמש בכמה מהפונקציות שלמדנו כדי לבנות הליכים למטרות שונות. חיצוב מספרים ראשו (יים :גדיר הליך המקבל מספר נתון א:, בוחן אם הוא מספר ראשוני או לא, ומדפיס הודעה מתאימה. זכור, ‏ כי מספר ראשוני הוא מספר המתחלק רק ב-1 ובעצמו ללא שארית. כלומר, אם קיים מספר הנמצא בין 1 ל-א:, ו-א: מתחלק בו ללא שארית, אזי א: הוא מספר לא ראשו('. הגדרת ‏ מאדתק א: א: מאזתק 70 [ 5109 ([ 1אסטפנת 15] א: תק) ] א: = א: שד [ 5109 ([ 1אסאפדת סא 158 ] א: תע) ] 0 = א: א: המפאדגאתת שד 1 + א: א: מאזתק פאם למשל, לבדיקה אם המספר 127 הוא ראשוני נרשום: 2 127 מאזתק? דרך החישוב: - | יש לערוך את הבדיקה עבור המספרים המחלקים, שבין 2 ל-א: (לא כולל א:). אם המספר לא מתחלק באף לא אחד מן המספרים האלה, - 99 - וערכו של המחלק הפך להיות שווה ל-א:, המשמעות היא, ‏ כי א: הוא ראשוני, יש להדפיס הודעה מתאימה ולסיים. [פ0ד5 ([ [1אסאפנת 15] א: תק)] א: = א: סד - | אם השארית של חלוקת א: ב-א: היא אפס, המשמעות היא ש-א: לא ראשוני. הודעה על כך תודפס וההליך *:עצר: [50 ([דאסטפנת 1סא 15] א: תת)] 0 = א: א: המפאדגאמת עד - אם השארית איננה אפס כלומר, התנאי לא מתקיים, הביצוע מתקדם להוראה הבאה הקוראת למחזור הבא. במחזור זה א: גדל ב-1, על- מנת להמשיך את הבדיקה לשאר הערכים. הביצוע מסתיים כאשר מתקיים התנא* א:>א:. יש להדפיס הודעת הסבר. הליך ‏ זה נכון, אך מבצע בדיקות מיותרות. ניתן להקטין לכד: מחצית את מספר הבדיקות, אם תנאי הסיום עבור המספר הראשונ:י יהיה: (2 / א:) < א: ע1 במקום א : > א: עך אפשר לעשות זאת, מכיון שהמחלק הקטן ביותר הוא 2, והמספר הנכפל בו על מנת לקבל את א: הוא הערך השווה ל-2/א:. האם לא ניתן לצמצם את מספר הבדיקות לפחות מאשר חצי? מתברר שכן. הבה נבחר מספר א כלשהו ונמצא כי אם א],<א וגם א]<ץ, אזי א<ץ*א. אם א איננו ראשוני יש לו שני מחלקים, שאחד מהם חייב להיות קטן מהשורש של א. לכן, יש להגיע למספר הגדול מן השורש של א על מנת להסיק שאין לו מחלקים, ולכן ה-א הוא כן מספר ראשוני. נוכל לרשום זאת כך: [([ צא80פת 15] א: תק)] א: > א: דַת0ס עד - 100 - פעולת הכפל מהירה בדרך כלל מפעולת השורש במחשבים. ננצל מידע זה ונרשום: [(ן דאסופנת 15] א: תע)] א: * א: > א: חך בהתאם לכך נגדיר את ההליך 1טאזהע, בצורה היעילה ביותר שלמדנו עד כה. הגדרת ‏ 1מאזתק א: א: 1מאז1תק 70 [ 5109 ( [1אסאפ1ת 15] א: תע)] א: * א: > א: חך [ 5109 ([1א0אפ1ת דסא 15] א: תק)] 0 = א: א: המפאדגאמת עד 1: א: [מאזתק פא עוד ניתן לשפר ולהפחית לחצי ממספר הבדיקות שהגענו אליהן עד כה. ידוע, שכל מספר המתחלק במספר זוגי מתחלק גם ב-2. על-כן, אם הוא לא מתחלק ב-2, ברור שהוא לא יתחלק במספר זוגי אחר כלשהו, ולכן נוכל לדלג בבדיקה על כל המספרים הזוג'ים. לצורך זה נגדיר הליך 2שאזתק הבודק תחילה אם ערכו של א: הוא 2. אם כן, תודפס ההודעה ש-א: הוא מספר ראשונ* והתכנ*ית תעצור. אחרת, יבדוק ההליך אם א: הוא מספר זוג'. - | אם כן, תודפס הודעה ש-א: הוא לא ראשוני והביצוע יסתיים. - | אם לא, יפנה 2מאזתק לתת-הליך 3מאזחק, אשר מבצע בדיקה של מספרים אי-זוגיים בלבד. הוא יתחיל במחלק הראשון שהוא 3. הגדרת 2מאנחע אטא: 2פאדתק 10 [פ510 [1אסאפנת 15] אטא: תק] 2 = אטא: סד [ 5109 ([1אסאפנת עסא 15] אטא: הע)] 0 = 2 אטא: הספאנגאמת קד 3 אטא: 3מאזפק פאם - 101 - הגדרת 3מאזהק א: א: 3שאנתק 70 ] 0 ( [1א1580ת 15] א: תק)] א: * א: > א: עד ] 0 ([ 1אסאפנת צסא 15] א: תק)] 0 = א: א: תתפאדגאמת קד 2: א: 3מאזחק פאם כשנרצה לבדוק אם המספר 127 הוא ראשוני, נרשום: 7 כמאזתק? מכיון שהמספר הנתון איננו מספר זוגי, פונה הליך זה ל-3שאזתק ומעביר ל-א: את ערכוה של אטא:, ולמחלק א: הוא נותן את הערך ההתחלתי 3. בכל מחזור גדל הערך של א: ב-2. מספר מועלם מספר מושלם הוא מספר, אשר סכום כל המחלקים שלוו ועוד ‏ 1 שווה למספר עצמו. לדוגמה, המספר 6 הוא מספר מושלם, כי סכום המחלקים שלו 2 ו-3 ועוד 1 שווה ל-6 (2+3+1=6). גם המספר 28 הוא מספר מושלם (2+1+1+14+1=28). נכתוב עתה תכנית 01מתתמק 710, אשר בודקת.אם מספר נתון אשא: הוא מספר מושלם, ומדפיסה הודעה בהתאם. שלבי הפתרון: א. יש לבדוק אם ערך המשתנה 05כ2: הוא המחלק של אשא: ללא שארית. 0 = סטכ: אטא: תמפאנ1אאמת עך ₪ אם כן, בקריאה למחזור הבא יש להוסיף למשתנה צובר 508: את המחלק 5עשכ: וגם את המחלק השני שערכו שווה ל- פ5פ: /אטא:. (5טם:/אסא: + 05כ: + א50:) (1 + 5טכ:) אטא: צסמעתמק - 102 - - | אחרת, יש להתקדם למחזור הבא, ללא שינוי ערכו של א508:, אספ: (1 + 5טכ:) אטא: צסמקתמק בהליך זה ערך הקלט 'א50:' של המחזור הבא תלוי בקיום תנא: כלשהו. לכן ‏ יש לכתוב את הקריאה לרקורסיה | לכל אחת מהאפשרויות, ובכל אפשרות לחשב את ערך הקלט בהתאם לדרישות. בשני המקרים הערך של 2/58: גדל ב-1, בעת הקריאה למחזור הבא. בקריאה להליך במחזור הראשון, המשתנה א908: מקבל 1 כערך התחלת*, והמשתנה 5/כ2: מקבל 2. בתום התהליך, כאשר 09כ2: מקבל ערך הגדול מהשורש של אשא:, 5: * פטכ: > אטא: שד יש לבדוק אם א50%: שווה ל-אטעא:, ולהדפיס הודעה בהתאם: , [(01מעתמק" 15" אטא: תק)] א50: = אטא: קך [([עסא 15] אטא: פמק)] אחרי ההדפסה יש לעצור. שים לב לכך, שאפשר לכתוב את ההוראה להדפסה בשני אופנים שונים. משפט זה מורכב מהוראת תנאי מקוננת, ההופכת אותו למשפט מורכב וארוך. רצוי אם כן, להגדיר תת-הליך (א221, שאליו נפנה לפנ העצירה, ואשר בו תתבצע בדיקת ההשוואה בין 50%: לבין אטא:. כך נוכל לרשום: [5109 אדפם] פטע: * פשכ: > אטא: קך הגדרת 84א801 האצפם 70 אטפ: = אטא: עפמך [ (01מקתפק" 15" אטא: הת)] עשד [[1סמעתתק דסא 8ד] אטא: תק)] קחד פאם - 103 - שים לב: גא821 הוא תת-הליך ברמה נמוכה מזה הפונה אליו, לכן ניתן להתייחס אל 50%: ו-אשא: ללא הצורך בהעברת פרמטרים. תרגילים (המשך) .90 .1 .12 .3 .8 כתוב תכנית פמאזתק 10 להדפסת כל המספרים הראשונ*ים מ-2 עד 0. הגדר הליך הפונה ל-צעַסַמקַתמק שבתרגיל 11, לבדיקה של המספר:ים מ-850 עד 500, כדי למצוא מספר מושלם. יש להדפיס הודעהת מתאימה לכל אחד מהמספרים אשר נבדקים. הערה: הביצוע דורש זמן מחשב רב, סבלנות! כתוב תכנית שתדפיס את כל המספרים בנ* שלוש ספרות, אשר סכום החזקות השלישיות של כל אחת מהספרות שלהם הוא המספר עצמו. למשל, המספר 153 ממלא דרישה זו: 13 + 57 + 35 > 3 כתוב תכנית שתדפיס את כל השלשות של מספרים שלמים, אשר יכולים ליצור משולש ישר-זווית. חשב את השלשות, אשר בהם אורך היתר הוא בתחום 2 עד 50. לדוגמה, בשלושת המספרים 3, 8, 5 אורך היתר הוא 5. כתוב הליך המקבל מספר שלם א: הגדול מ-1 ומדפיס אותו. אחר כך הוא מדפיס את המספרים המתקבלים כתוצאה מן הפעולות הנעשות על א:. תיאור ההליך: א. מדפיס את א:. ב. אם א: שווה ל-1, מפסיק את הביצוע. ג. אם א%: הוא מספר אי-זוגי, מתקדם למחזור הבא כאשר א%: מקבל ערך השווה ל-3+1*א:. מדפיס את הערך החדש של א:. - 104 - ד. אם א: הוא זוגי, מתקדם למחזור הבא כאשר ‏ א%: מחולק ב-2/א( 2:). מדפיס את הערך החדש של א:. לדוגמה, אם הקלט הוא ]1 - נקבל את הפלט הבא: 1 5 8 16 5 10 20 840 3 26 52 17 בדוק אם תמיד מתקבלת סידרה סופית (המגיעה עד למספר 1), ואם יש מקרים שבהם התכנית איננה מגיעה לידי עצירה. חישובים אקראי ים לפעמים נרצה שהמחשב יבחר מספר אקראי, שאין אפשרות לחזותו מראש. באמצעות פעולה זו ניתן לכתוב תכנית שתבצע הדמייה של הטלת מטבע למשל, או הטלת קוביה, או שתחקה קליעה במספר כלשהו בגלגל ההימורים (רולטה). בלוגו קיימת הוראה לבחירת מספר שלם באופן אקראי מתוך תחום מספרים מוגדר. הפונקציה אספאגת הפונקציה ם 08פא8ת פולטת ערך מספרי שלם גדול או שווה לאפס, ‏ אך קטן מ-ם, המוגדר כערך גבולי. הפונקציה דורשת קלט ם בעל ערך מספרי שתפעל עליו. ערך זה יכול להיות מבוטא על-ידי קבוע מספרי, משתנה מספרי, או ביטוי חשבוני. כאשר נרשום ---6 06 אססאגת תק? נקבל | על המסך מספר ‏ א כלשהו מתחום המספרים שלהלן: (0,1,2,3,8,5,6,7,8,9), כי צריך שיהיה 610א05. שים לב שהאפס כלול, אך ה-10 לא. - 105 - אם גרשום ---> (6 / 75) אספאגת הק? המספר שיבחר יהיה בתחום המספרים (11, ... ,0,1,2), כי הערך של ם הוא התוצאה של (75/6) ושווה 12.5. הערך הגבולי השלם בחישוב זה הוא 12 יולכן 12 איננו כלול בתחום. אם נרצה לבחור יאת אחד הערכים מתחום המספר*ים של גלגל המזלות שהוא (0,1,2,...,80), נרשום ערך גבולי 41, אשר לא נכלל בתחום: נרשום ---> 1 אספאגת תק? בהטלת קוביה, הערכים האפשריים הם (1,2,3,1,5,6), ולכן נשתמש במספר 1 כגבול עליון: נכתוב ---> 7 אספאגת הק? כאן ‏ יש שגיאה, כי תחום המספרים בביטוי זה כולל את האפס '0', אשר איננו בתחום המספרים של הקוביה. נוכל לפתור בעיה ‏ זו אם נוסיף 1 לתוצאת החישוב שתתקבל, כלומר אם התוצאה היא 0 נקבל 1, אם התוצאה היא 1 נקבל 2, אם התוצאה היא 2 נקבל 3, אם התוצאה היא 3 נקבל 8, אם התוצאה היא 8 נקבל 5, אם התוצאה היא 5 נקבל 6, אם התוצאה היא 6 נקבל... לא !! אסור ש-6 יהיה כלול בתחום, אחרת נקבל 7. אם כן, נרשום ---% 6 אסספאגת + 1 מק? הערך 1 מתוסף לתוצאה המתקבלת מפעולת אספאגת על הנתון 6. הערך הגבוה ביותר יכול להיות 5, ובתוספת 1, נקבל 6. - 106 - אפשר להציג זאת גם כך ---> 1 + (6 אספאגת) תק? הסוגריים מיועדים לקבוע עדיפות וכך, 1 מתוסף לתוצאה אשר חושבה תחילה על-ידי '6 אספאהת'; בהעדר סוגריים, הביסוי 1 + 6 שהוא ‏ 7 היה מתקבל כקלט לפקודה אספאגת. לעתים מתעורר הצורך לבחור מספרים מתחום. כלשהו, נאמר מ-12 ועד 5 (כולל), כך ש-12 הוא הערך המינימלי שבתחום ‏ - 'אנא', ו-15 הוא הערך המקסימלי שבו - 'אגא'. המספר הקטן ביותר מפעולת אספאהת הוא אפס, אם נוסיף לו 12, נשנה את הערך המינימלי ל-12. ואז, אם התוצאה היא 1 נקבל 13, אם היא 2 נקבל ‏ 14 ואם היא 3 נקבל 15, אך עד כאן. כלומר, על הפעולה ליצור מספרים מהתחום הבא (0,1,2,3). הערך הגבולי יהיה במקרה זה - 4. אם כן, נרשום ---> 4 אספאגת + 12 תק? ערך גבולי בבעיות כאלו הוא מספר הערכים הנמצאים בתחום המוגדר. מקבלים מספר זה אם מפחיתים מערך ה-א את ערך ה-א ומוסיפים 1. לפי הדוגמה לעיל: ‏ 15-12+1=4 נגדיר הליך 5זאפאת לבחירת מספר אקראי מכל תחום שהוא, כאשר משתנה א88%: מייצג את הערך המקסימלי והמשתנה א1א: מייצג את הערך המינימלי. הגדרת 15אסאת אזא: אגא: 5זאפאת 70 (1 + אזא: - אגא:) אספאגת + אזא: תהק עאם אספאות היא פונקציה, דהיינו הוראה הפולטת ערך. לכן, יש להורות למחשב מה לעשות בערך המופק על-'ידי הפעלתה. ערך זה יכול לשמש כחלק מביטו* חשבוני, או להיות קלט למשתנה של הליך מוגדר בעת - 107 - הפניה אליו. פונים להליך בפקודה ישירה מתוך המצב הרגיל של לוגו, מתוך הליך אחר כחלק מההוראות שלו, וגם מתוך ההליך עצמו באופן רקורסיב'י. אחד ההליכים שהגדרנו בתחילת הספר הוא 1א88[א, המחשב את ההיקף והשטח של מלבן כלשהו. בעת הקריאה להליך הוא קיבל כקלט שנ: ערכים למשתנים | שג3008: ו-08₪₪08:. באמצעות השימוש ב-אספאגת נוכל ליצור ערכים אקראיים בתחום המספרים (25..50) למשל, ולהשתמש בהם לציון צלעות המלבן. נרשום ‏ -7--> (26 אסעאגת + 25) (26 אספאגת + 25) 1אמםוהא? כתוצאה מפקודה זו הפונקציה א0סאגת תפעל פעמיים: המספר האקרא: שייבחר מחישוב הביטוי הראשון יהיה קלט למשתנה הראשון /30084:, ומהביטוי השני נקבל מספר אקראי אחר למשתנה השני א608מַ08:. להלן דוגמה להליך היוצר א: מטפרים אקראיים בתחום (20..30) ומדפיס את סכומם. הגדרת אפ אספ: א: פאתאטפ 70 [109פ א50: תק] 1 > א: תד (11 אססאגת + 20 + 508:) 1-א: פאתאספ פאם בעת הקריאה להליך נקבע ל-א50:, המשמש כמשתנה צובר, את הערך אפס. בכל מחזור מתוסף לו מספר אקראי חדש: 1 אססאגת + 20 + אעשפ: התוצאה מהווה קלט למחזור הבא. משתנה ‏ א: המשמש משתנה מונה מציין את מספר הערכים הדרוש. בכל מחזור מופחת ממנו 1, בהתאם לשיטת הספירה לאחור. תנאי הסיום הוא 0:, כאשר הסתיימה בחירת כל א: הערכים האקראיים וצבירתם במשתנה א50:. בתום הביצוע מודפס ערך הסכום (א50: מע), וההליך יסתיים בהוראת העצירה 5102. - 108 - נציג תכנית היוצרת אשא: מספרים אקראיים בתחום (0..20) ומדפיסה רק את אלה הגדולים מ-10. בביצוע זה נדרשות שתי פעולות ביחס למספר הנבחר: בדיקה אם הוא גדול מ-10 והדפסה שלו. אנו למדים שיש צורך בקישור הערך האקראי עם משתנה כלשהו, אשר עליו נוכל לבצע יותר מחישוב אחד. הערך של המשתנה הוא קבוע, ונשמר כל עוד לא ניתנה הוראה לשינוי. ערך זה אובד עם סיום ביצוע ההליך. פתרון זה דורש שנ* הליכים: - | הליך אמך 10 מוגדר עם משתנה, אשר מבצע את הבדיקה. אם התנא: מתקיים הוא מדפיס את התוצאה. - | הליך פאתאמ1 710 פונה אטא: פעמים ל-א18₪. בכל פניה המשתנה המוגדר ב-א18 מקבל מספר אקרא* אחר. מספר ‏ זה יש לבדוק ולהדפיס לפי תנאי הבעיה. הגדרת כאתאמך אטא: פאתאמד 70 [ (21 אספאגת) אמ ] אטא: דגמפקפת פא הגדרת אמך פדא: אד 70 [פצא: תק] 10 < פצא: חך פאם כאשר רושמים ---> 5 פאתאפד? פאתאם פונה ‏ 15 פעמים ל-א1₪. בכל פניה המשתנה 15א: מקבל מספר אקראי חדש, שהוא הערך המתקבלימביצוע '21 אספאגת' בכל קריאה. אפץ? בודק אם הערך של 815: גדול מעשר: 0 < 15א: עך אם כן - הוא מדפיס אותו. אחרת, הוא לא מבצע דבר. - 109 - להלן דוגמה לפתרון בעיה לחישוב ממוצע של אשא: מספרים אקראיים בתחום ‏ (0..10). נחזור על החישוב לכל ערך של אטא: מ-1 ועד 30. תרגיל זה ה*נו ניסוי של חישוב ממוצע סטטיסטי, שבו כל התוצאות שיתקבלו יהיו בערך 5. הגדרת | 024ואחא אטא: א5080: פאתא: ה2טאמא 10 [פ510] 38 < אשא: אד אסא: / (א5000: + פאתא:) הק (1 + אטא:) (אטא50: + פאתא:) (11 אספאגת) ה2טוטא > פאם בקר*יאה הראשונה ל-24טא₪א אנו קושרים למשתנה פאחא: ערך של מספר, אשר נבחר באופן אקרא* באמצעות הביטוי '11 אססאגת'. כתוצאה מפעולה זו אטא: המספרים האקראיים שנבחרו עד כה הוא ‏ '1'. מכ*ון שטרם צברנו מספרים אלה במשתנה צובר א5080%:, ערכו הוא עדיין 'ס'. לכן נרשום ---% 1 0 (11 אספאאגת) 2טאמ? בכל מחזור מודפס ממוצע המספרים שנבחרו עד כה: אטא: / (א08ח50: + פאתא:) תק בכל קריאה חדשה נבחר מספר אקרא* אחר, שיהיה ערך ל-פאחא: של המחזור הבא: (11 אספאגת) לערך של 50808: מתוסף הערך של פאאא: שקיבלנו במחזור הנוכח': (50808%: + פאתא:) ומספר הערכים שנבחרו גדל ב-1: (1 + אטסא:) תנאי סיום התכנית הוא כאשר 0 < אא תרגילים (המטך) .5 .6 .7 .8 .9 .90 .1 .2 כתוב הליך הבוחר ומדפיס 10 מספרים אקראיים בתחום (1..25). כתוב הליך היוצר 5 מספרים אקראיים בתחום (60..100), ומדפיס את הממוצע שלהם. כתוב תכנית הבוחרת א: מספרים אקראיים בתחום (0..100), בודקת ומדפיסה רק את אלה הגדולים מ-50. הגדר הליך אש ידפיס אטא: מספרים אקראיים שליליים בתחום (25-..11-*). רמז: הכפל ב-(1-) את הערך המתקבל מהביטוי של הפונקציה. כתוב תכנית היוצרת 2 מספרים אקראיים בתחום (27..20). בשורה הראשונה היא מדפיסה אותם לפי סדר בחירתם, ובשורה השניה ‏ - לפי סדר עולה. כתוב תכנית להדמיית הטלת מטבע 815: פעמים, כאשר '0' מציין צד אחד של המטבע, ו-'1' - את צדו השנ'. - | אם '1' נבחר *ותר מ-15/2א:, יש להדפיס הודעת זכיה. - | אם לא, יש להדפיס הודעת הפסד. כתוב תכנית להדמיית 15א8: זריקות של זוג קוביות. על התכנ'ת לרשום בטור אחד את תוצאות הזריקה של הקוביה הראשונה, בטור שני את התוצאות של השניה, ובטור שלישי ‏ - את סכום שת: התוצאות. כתוב תכנית ליצירת 10 תרגילי חיבור של שני מספרים אקראיים, בתחום (1..99). על המחשב להדפיס אותם ואת תוצאת החישוב שלהם. הצבת הסמ במטך - 501000508 נכתוב הליך המדפיס נקודות היוצרות על המסך קו אלכסון *ורד משמאל לימין. הגדרת | 41788 אםןג 0 דאמידת 01 " מפצצ' [0 9] 9₪1008508 ." מפצץ [1 1] 501008508 ." מפציד [2 2] 9817008508 ." מקצצ [24 24] 51003908 פאם ניתן לצמצם הליך זה, המורכב מ-25 הוראות החוזרות על עצמן, אם נהפוך אותו להליך רקורסיבי. נגדיר את ההליך עם משתנים, אשר יקבלו בכל פעם ערך חדש לציון העמודה והשורה. יש לשים לב לכך שהערכים צריכים להיות בתוך רשימה. אם נרשום לדוגמה: [א: צ:] 501008508 נקבל את ההודעה הבאה: אם משתנה מופיע בתוך רשימה, לוגו לא תדע מה ערכו, כי היא מקבלת אותו כנתון ולא כמשתנה בעל ערך. זכור את ההבדל בין 'א: תע' לבין '[א:] חק'. בלוגו קיימות פקודות לבניית רשימה, אך לפני שנלמד אותן, הבה נכיר את ההוראה המציגה דברים על המסך. זוהי הוראה הדומה ל- עאזתת, אבל יש ביניהן הבדל בהצגה של רשימות. = 112 - ההוראה 580% הפונקציה 5808 פועלת על דבר אחד בלבד. נשתמש בדוגמה: נניח כי למשתנה א: יש ערך 100. אם נרשום ‏ ---6 א: תק המחשב ידפיס ---> 100 ואם נרשום ---> א: ₪08 נקבל גם כן ‏ ---> 1008 במקרה זה אין הבדל וקיבלנו אותו פלט. אבל, אם נרשום ‏ ---> [א:] מק המחשב ידפיס >---‏ א: ואם נרשום ---> [א:] חספ נקבל ---> [א:] כלומר, 9808 מציגה את הרשימה כפי שהיא. עוד דוגמה 7---> [1000 מא11 1] תק? נקבל את המשפט: 0 אאדע ך אבל כאשר נרשום ---> [1000 אד 1] 0₪פ? המשפט יוצג בתוך רשימה: [2000 מאד נ] נלמד כעת הוראת בניה, אשר מאחדת, או מצרפת, דברים לרשימה אחת. עריכת רימה - הפר נקציה 05ו₪זו50 (קיצור - 95) המבנה הכלל:י: דבר 58 או: דבר2 דבר1] 58 הפונקציה 58 מקבלת דבר אחד או שני דברים כקלט, ופולטת רשימה המכילה דברים אלה (ב-11 1000 מ]תק8 הפונקציה 58 פועלת על 2 דברים, אך לא על דבר אחד). אם ה"דבר" הינו מספר או מילה (רצף - 113 - של תווים), ערך הפלט שלה הוא רשימה המכילה את המספר עצמו, או את המילה עצמה. אם נרשום ---%> 7 55 5808? נקבל מספר זה בתוך רשימה: [57] אך אם נרשום ---> אסטפ" פהאספ" 55 חס1פ? נקבל את שתי המילים ברשימה אחת: [אסטפ פגאספ] אם ה"דבר" הינו משתנה, 58 תציב את ערכו של המשתנה ברשימה שהיא בונה. אם ה"דבר" הוא רשימה, 58 תצרף את האיברים לרשימה שהיא בונה. ניתן לאחד מספר דברים באמצעות ההוראה 58, אם נתחום את כל ההוראה בסוגריים עגולים: נגדיר הליך המדגים כיצד לאחד דברים באמצעות 58, כלומר לצרף אותם יחד. הגדרת 158241 הנא: פדא: קודא 0 ה,זצא: פדא: 55 5808 [צטא 61] [צ1ם] 58 5808 (פ1א: 0) זמ" [מטדנס 8 צמקסם] /זדא: 58) אסמפ פא כאשר נרשום ---% 4 000₪" 2001 ך4קהפדא? בשורה הראשונה *ודפס: [0014 0008 2001] כלומר 58 איחדה את ערכו של 15א: עם ערכו של הדו לרשימה אחת. - 1184 - בשורה השניה נקבל: [דטג 61 צם] כאן ‏ 5₪ איחדה את איברי הרשימה 2/1[‏ 61] יחד עם תוכן הרשימה [צ₪] ברשימה אחת. ובשטורה השלישית נקבל: [2001 ₪110 ₪ק01 8 צמפסק 004 0008] שים לב: מאחר שתוצאת החישוב של ההוראה 58 מהווהּ ערך, יש להורות למחשב מה לעשות בערך זה. בדוגמה שלמעלה השתמשנו בהוראה 5808. כעת נשתמש בפונקציה 58₪, על מנת להגדיר מחדש את ההליך א41₪, כדי שיפעל עם משתנים. ההליך ‏ 1אעזה א: צ: 1אמוג 70 [5109] 24 < צ: שך א: צ: 58 501008808 1: 1+צ: 1אשוה פאם ערך התחלתי של המשתנה א:, המציין את העמודה, הוא המספר '0'. גם למשתנה +:, המציין את השורה, נציב ערך '0'. נרשום עתה ---> 0 0 1א.? הביטוי 'א: צ: 58' מאחד את הערכים של א: ו-ץצ: בתוך רשימה המשמשת קלט ל-5₪1008908, כאילו רשמנו - '[0 0] 5₪1008508'. המחשב מדפיס במקום זה את סימן הנקודה '.' ומתקדם למחזור הבא, כאשר א: גדל ב-1 וגם צ: גדל ב-1, וכך ממחזור למחזור. תנאי הסיום הוא כאשר המשתנה צ: מקבל ערך, אשר לא מציין כל שורה שהיא על המסך (השורה 24 היא האחרונה). הערה: כאשר הפונקציה 581008508 מקבלת קואורדינטות של נקודה שאיננה מוגדרת על המסך, מקבלים הודעת שג:אה. - 155 - שמת לב בוודאי, שערכו של א%: זהה לערכו של צ: בכל מחזור. לכן ניתן להגדיר הליך זה במשתנה אחד בלבד, שישמש גם לציון העמודה וגם לציון השורה. בשורת ההכרזה נרשום: א: 2אמ8 70 להצבת הסמן נכתוב: א: א: 5₪ 51003508 ובקריאה לרקורסיה: 1א: 182 בתרגיל הבא נגדיר הליך 1%א1, המדפיס א-ים היוצרים את צורת האות 'א' על פנ* המסך. למעשה, צורת 'א' בנויה משנ* קווים אלכסוניים מצטלבים באופן סימטר*. אחד היורד משמאל לימין, והשני - מימין לשמאל. האלכסון הראשון מתחיל בנקודה [6 0], ומסתיים בנקודה [28 24] והאלכסון השני מתחיל ב-[21 0] ומסתיים ב-[0 24]. גם בפתרון זה די לנו במשתנה אחד. לאלכסון הראשון, כמו ב-2א41₪, נרשום 'א: א: 5₪ 5₪1008508'. באלכסון השני, הערך של השורה שווה לזה של האלכסון הראשון, אבל את הקלט של העמודה יש לחשב. על פ: החישוב נמצא, שערך העמודה באלכסון השני מתקבל אם נפחית מהמטפר 3 את ערך העמודה של האלכסון הראשון: כאשר העמודה באלכסון הראשון היא '0', באלכסון השני היא '20'. ואכן: 21-0=25. - | כאשר העמודה באלכסון הראשון היא '1', העמודה באלכסון הש(: היא '23' (21-1=23). - | כאשר העמודה באלכסון הראשון היא '2', העמודה באלכסון הש(: היא '22' (21-2=22). וכן הלאה..., - כאשר העמודה האחרונה באלכסון הראשון ה'יא ים2', העמודה באלכסון השני היא '0' (25=0-2%). וכאן נסיים. לפיכך, להצבת הסמן להדפסת האלכסון היורד מימין לשמאל נרשום: (א: - 24) א: מ5 501008508 - 116 - הגדרת ‏ 1%א1% א: אנאד 0ד [פ510] 24 < א: סד א: א: מפ 7003508 א" מקעיך (א: - 2%) א: 58 60700508 א" מפעך 1+ א: אדאד פא תרגילים (המשך) .3 . .5 הגדר הליך המדפיס אותיות 2-ים, היוצרות על המסך את הצורה של האות '2'. חזור על בעיה זו עבור האות 2, האות 8, ועבור צ, ט, א, א. כתוב תכנית היוצרת סימולציה של "יויו", המחקה תנועת כדור היורד מטה ועולה מעלה לסירוגין. הגדר לצורך הפתרון שני הליכים -אחד א%א0020+, והש(: פ00צ0ץצ. השתמש באות ‏ '0' הדומה לכדור. הגדר הליך להדפסת 500 כוכבים בנקודות הנבחרות באופן אקראי. השתמש במשפט: (39 אספאגת) (25 אספאגת) 58 50700508 הסבר: הפונקציה אסכאגת בביטוי הראשון בוחרת ערך המציין את העמודה, ובביטן: השני היא בוחרת ערך לשורה. 58 מציבה ערכים אלה ברשימה, אשר משמשת קלט ל-501000908. זכור: אם הינך משתמש בגירסה של 11 1000 םןקק או של ₪ זקקה 0, יש להפוך את סדר הערכים של הנקודה. המשפט *ירשם כך: (23 אספאגת) (39 אספאגת) 98 507008508 - 11] - פרק 9 מבוא לתכנות פונקציונלי בפרק הקודם הכרנו חלק מהפונקציות השימושיות המוגדרות כחלק בלת* נפרד משפת לוגו. אולם, מה קורה אם נרצה להשתמש בפונקציה לחישוב הערך המוחלט למשל, שאיננה מוגדרת בשפה? הגדרת פנקציות לוגו מאפשרת למשתמש להגדיר פונקציות (8ת6610תטע), כשם שהיא מאפשרת להגדיר הליכים (205ט20096ק2). הפקודות בהליך גורמות לשינוי על המסך (אק, עַאמ7ת014), שינוי בזיכרון (7₪91, ד4מקטת) וכדומה. התוצאה של ההליך הינה פלט מוצג או מודפס. פעולות החישוב בפונקציה, לעומת זאת, יוצרות ערך. דהיינו, כאשר קוראים לפונקציה, תוצאת החישוב מהווה את ערך הפונקציה. פונקציה הינה תכנ'*ת, אשר בתום החישוב שהיא עורכת, ‏ היא מחזירה ערך אחד ויחיד הקרו: ערך הפונקציה (06ו081 תס61סתטע). הפונקציה מופעלת על נתון אחד או *ותר (ארגומנטים -| %8ת420₪0), אשר קובעים את ערכה. בדומה להגדרת הליך, מתחילים הגדרה של פונקציה על-ידי המילה 10, לידה שם הפונקציה ולאחריו שמות המשתנים. המשתנים הם הפרמטרים הפורמליים, שאליהם מועברים ערכי הארגומנטים בהתאמה. בשורות שלאחר הכותרת ניתנת סידרת ההוראות המתארת את חישוב הערך של הפונקציה ומסיימים במילה פאח. - 118 - כותרת פונקציה: פרמטרת ... פרמטר2 פרמטר1 (שם פונקציה) 70 מילת המפתח בתכנית המגדירה פונקציה היא עשע001, ובקיצור 0. עס מעבירה את הערך המחושב למי שקרא לפונקציה, וזהו תנאי להגדרת התכנית כפונקציה. עם מסירת הערך לקורא מסתיים ביצוע הפונקציה. בין פונקציות השפה מצאנו את פונקציית הסכום 'א90' ופונקציית השורש הריבועי '001פ', אך אין פונקציה להעלאה בריבוע למשל, ואין פונקציה להעלאה בחזקה שלישית. הבה נגדיר פונקציות אלו. הגדרת 0088 הגדרת ‏ 50% (העלאת מספר בחזקה שלישית) (העלאת מספר בריבוע) 4: פטס 70 א: 508 710 4: * (2: * ג: פס א: * א: פס פאט פאס כאשר מפיקים במחשב ערך יש להורות לו מה לעשות בערך זה. 0088 ו-500 ה פונקציות ולכן עלינו לפנות אליהן על-ידי כתיבת השם ומתן הערכים למשתנים, וגם - לציין מה לעשות בערך המתקבל כתוצאת החישוב. אם לא נעשה כן - נקבל הודעת שגיאה. אם נרשום ---6 1 ממטס? נקבל הערה כגון: 1 וט 00 10 דצ אסאא ע''אסת 1 עתה נשתמש בהוראה האומרת למחשב מה לעשות בערך המתקבל. נוכל לרשום למשל ---> 7 508 מק? ונקבל: 9 - 119 - היחס לפונקציה כלשהי כמוהו כאל ערך, ועל כן היא יכולה להופיע כחלק מביטו* חישובי. לדוגמה: 2 / (5 508 + 75) תע או: 0 < (4 מפטס) דפמך או למשל: 3 5608 10 508 תע בפרק על משפטי התנאי הגדרנו הליך 272הא, המחשב את הערך המוחלט של נתון מספרי ומדפיס אותו. הפעם נכתוב את אותו תהליך חישוב כפונקציה. כלומר, כתוצאה מביצוע הפונקציה יתקבל ערך, בניגוד להליך, שבו המחשב פולט את התוצאה על המסך. נלמד את ההבדלים בין הליך לבין פונקציה מבחינת אופן ההגדרה ואופן הביצוע. הגדרת 285 (פונקציה) הגדרת 472:אא (הליך) א: 8285 70 א: 72 טא 70 [א:- פ0] 0 > א: עך [פ510 א:- תתע] 0 > א: עד א: פס א: חק פאם פא בהליך 01/12 משמשת ההוראה 5102 לסיום ההליך באחד מסעים: ההוראה ש1. הביצוע ימשיך לאחר ההוראה פאם. בפונקציה 885 מקבלי*ם ב-ת0 את הערך המחושב ובכך מסתיים ביצוע הפונקציה. אין חשש שבמקרה זה ימשיך הביצוע בפקודה העוקבת. התכנית שקראה לפונקציה תטפל בערך שהתקבל. בפנייתנו ל-0₪8/472/ נרשום ---> 9- 2עג.זחוא? ונקבל את התוצאה על המסך: 19 לא כן בפניה לפונקציה - כאן יש לרשום הוראת הדפסה לפנ: 425 ---> 9- 425 חק? כדי שהערך המוחזר אכן *וצג על המסך: 19 - 120 - גם כאשר פונקציה אחת פונה לפונקציה אחרת, ההוראה 02 שבפונקציה הקוראת פועלת על התוצאה, כלומר על הערך, המתקבל מהפונקציה הנקראת. נגדיר פונקציה /1כ2, המקבלת שני מספרים 8 ו-ס, ומחזירה את ערך המנה של חלוקת 8 ב-5פ (בגירסה של 1000 ₪]קק8 קיימת הפונקציה 07 למטרה זו). הגדרת טזע 8: (ג: טעדכ 70 (פ: / :) עאד 05 פאם כאשר נרשום ---6> 3 18 טנס הק? נקבל: 8 05 מקבלת מ-1א1 את הערך שלה, ואת הערך הזה היא מעבירה. תרגילים 41 הגדר פונקציה אגא, המקבלת שנ*י מטפרים ומחז*רה את הערך הגדול מבין השניים. הדפס את התוצאה. עשה זאת גם בשאר התרגילים שבהמשך. 2. הגדר פונקציה אזא, הפועלת על שני מספרים ומחזירה את הערך הנמוך מבין השנ'יים. 3. הגדר פונקציה 40תת, המחזירה את החלק העשרונ של מספר עשרוני כלשהו. אם הנתון הוא 17.5019 למשל, הערך המוחזר יהיה 0.5019. = 121, = 8. בהנחה שלא נמצאת בלוגו הפונקציה המפא1גאמת להצגת שארית החילוק של 8 ב-0, הגדר אותה בעצמך. קרא לפונקציית השארית בשם 'פסא'. דמז - השתמש ב-עא1. 5. הגדר מחדש את הפונקציה לעיגול מספרים, כאילו לא קיימת בשפה הפונקציה פעאט00ת. קרא לה 'פאא'. 6. הגדר פונקציה פאגתה0מא המקבלת שנ* נתונים אגא: ו-אזא:, ומחזירה ערך שהוא מספר אקראי שלילי בתחום (אגא:-...אזא:-). 7 הגדר פונקציה 241 המחזירה את ערכו של 21 (=3.1415). אם קיימת הפונקציה 1ק בגירסת לוגו שאתה משתמש בה, הנח שהיא איננה קיימת, והגדר אותה בעצמך. מנקציה רקורטיבית ראינו שפונקציה יוצרת ערך, אשר משמש כקלט לתכנית אחרת שקראה לה, או לפונקציה אחרת שפנתה אליה. למעשה, פונקציה יכולה לקרוא לא רק לפונקציה אחרת, אלא היא יכולה לקרוא גם לעצמה. בפונקציה כזו מתבצע החישוב במחזורים, אשר תוצאת כל אחד מהם תלויה בתוצאה של המחזור, אשר חושב לפנ*ו. כל מחזור פועל על תוצאה שק*בל מהמחזור שנקרא על-:דו. בהמשך *בואו הסברים והבהרות מפורטים *ותר. פונקציה מסוג זה הינה פונקציה רקורסיבית. - 122 - האלג ריתס של אקלידס בהסתמך על האלגוריתם של אוקלידס (מתמטיקן ‏ *וונ מן המחצית השניה למאתח הרביעית לפנה"ס), נגדיר פונקציה למציאת המחלק המשותף המקסימלי 'מממ' של 2 מספרים. באנגלית מכנים זאת: 0 - 18905ט21 מסשם 00 68665%6ע62. האלגוריתם (מת1%ת4180), שהוא תהליך חישוב, מתבסס על ההגדרה הבאה: כל מחלק משותף של שני מספרים טבעיים (לא אפס) מחלק גם את הסכום וגם את ההפרש שלהם. תיאור האלגוריתם של אוקלידס: א. אם מ=8, אזי ה-מממ שווה לערך עצמו (ל-8 או ל-5). ב. אם א הוא ה-מממ של 8 ו-ם, אזי א% הוא ה-מממ של ערכו המוחלט של הפרשם |ט-8|. נתון: 8 = אם, םס = אמ מכאן ש- אש - אםת = כ - 8 נציב את א מחוצ לסוגריים ונקבל (₪ - ם) א = 5 - 8 כלומר, גם ההפרש של 8 ו-סם הוא כפולה של א. זאת, כל עוד הפרש זה גדול מאפס, כלומר כל עוד 8 שונה מ-5. אם נחסר את 8 מ-סם, הערך המוחלט של התוצאה תמיד יהיה קטן מן הערך הגדול מבין השניים. נחזור על פעולת החיסור, כאשר אחד המשתנים הוא< בעל הערך הקטן מבין 8 ו-ס, ובמשתנה השני (נציב את הערך המוחלט של ההפרש שלהם, עד שערכי שני המשתנים 8 ו-5 *ה*ו שווים. לדוגמה, נתון: 8=32, 12=. נחשב את הערך המוחלט של ההפרש: 20 = |32-12|. נציב ערך זה במשתנה בעל הערך הגדול מבין השניים, שבמקרה זה הוא המשתנה 8. הנתונים הפעם: 8=20, 12-ם. - 123 - נחשב שוב את הערך המוחלט של ההפרש ונקבל: 8 = |20-12|. גם הפעם 8 הוא המשתנה בעל הערך הגדול ובו נציב את ערך ההפרש. עכשיו נקבל: 8=8, 12>. נחזור על פעולת החיסור ונקבל: 4 = |12-8]. 5 הוא עתה בעל הערך הגדול, ולכן נציב בו את תוצאת החישוב. כעת 8=8, 1=ם. כתוצאה מפעולת חיסור נוספת נקבל: 4 = |8-8|. הפעם ערך זה :וצב ב-8. כתוצאה מהצבה זו נקבל כי 4=ס וגם 8=4, כלומר שניהם שווים. לכן מממ שווה 4, על פי משפט א' של האלגוריתם. נכתוב את האלגוריתם בשפת לוגו ונבצע את תהליך חישוב ה-מממ באופן רקורסיבי על ערכו המוחלט של |פ-8|, יחד עם הערך הנמוך מבין השניים, עד ש-'ס=8'. הגדרת |אאא (מממ) 8: 4: אא 0ד [4: ע0] ם: = : עד 8: < 2: עפמך [ם: (8: - ג:) אאא פס] צקד [(4: - ם:) 2: אאא פס] פקד פאם עבור 8: ו-8: שווים, ערך הפונקציה יהיה הערך של 8: והביצוע יסתיים. אחרת, תתבצע קריאה רקורסיבית באופן מותנה: 2 אם '8: < :', אז 8: של המחזור הבא יקבל את ההפרש ‏ '2:-:' ו-8: שהוא הקטן מביניהם, יעבור כפי שהוא. - | אחרת, אם 8: הוא הגדול, אז 8: של המחזור הבא יקבל את ההפרש '4:-8:', ואילו 8: יעבור כפי שהוא. אלגוריתם אחר עבור מממ, אף הוא של אוקלידס, מובא בתיאור הבא: א. אם ערכוה של אחד משני המשתנים 8 ו-ס הוא '0', אז ערכו של השני הוא ה-מממ. - 12% - ב. אחרת, יש לחזור על החישוב, כאשר ערך השארית כתוצאה מחלוקת 5" ב-8 יהיה ערך למשתנה האחד 8, ואילו הערך של 8 יהיה ערך למשתנה השני ם. כפי שידוע, אין החלוקה באפס מוגדרת, לכן יש לבדוק אם הערך. של 8: הוא '0'. - | אם כן, אז ערכו של 8: הוא ה-מממ, ועם מסירת ערך זה יסתיים ביצוע הפונקציה. - | אם לא, יש לחשב את ה-מממ עבור השארית והערך של ג:. יש להעביר את ערך השארית למשתנה 2: בקריאה למחזור הבא, ול-8: את ערך המשתנה 82: של המחזור הנוכח*. תהליך זה מתבצע באופן רקורסיבי עד שמקבלים '4=0:'. אלגוריתם זה נציג בפונקציה 602: הגדרת 602 8 8: 602 70 [; 0] 0 = ג: חך 8: (ב: ם: תתפאדהאמת) 002 פס פאם לחישוב 002 עבור המספרים 12 ו-18, נרשום ---> 8 12 602 מק? ונקבל: 6 פונקציה פונה לפונקציה אחרת באמצעות 05, כי זו דרכה לפעול על הערך המוחזר מהפונקציה הנקראת. כך גם כאשר היא פונה לעצמה: 4: (: 8: הסקאדבאמת) 602 05 - אם 8: הוא '0', הפלט יהיה הערך של 8:. - במקרה ש-8: הוא '0', כלומר אם נרשום '0 14 602 תק', תפנה הפונקציה באופן רקורסיבי לעצמה פעם אחת בלבד. ערך המשתנה 8: של המחזור הבא יהיה '0', כתוצאה של הביטו: '18 0 התפאדהאמת', ו-8: יקבל את הערך 14. - 125 - - | כאשר התנאי '0 = 2: א1' מתקיים, הערך 14 יהיה הפלט של 602 'ןת: ק0]', שהוא ערך התוצאה של הפונקציה. תכניות חיטוב בטנרים פשוטים נגדיר הליך לצמצום של שבר פשוט ונשתמש בפונקציה מממ כשם שמשתמשים בכל פונקציה אחרת. נעשה זאת בפתרון התרגיל הבא, שבו נתונים המונה 8 והמכנה ס. ידוע, שכדי לצמצם את השבר צריך לחלק את המונה ואת המכנה במחלק המשותף הגדול ביותר. הגדרת ‏ 218208 מאהחפא: טאסא: א20א21 70 (מאהחמא: מאסא: כ00) / טאסא: מפצך /" מפצץך (מאהצמא: מאסא: 002) / מאגצמא: מפצך סאם כאשר נרשום ---6 8 12 אטלאד?? נקבל את הפלט הבא: .2.3 תחילה חילקנו את המונה '12' ב-מממ (6) והדפסנו את התוצאה: (פאגזומא: מאסא: 002) / מאסא: מפצך ליד זה הדפסנו את פעולת החילוק '/': /" מקצץך לאחר מכן חילקנו את המכנה '18' אף הוא ב-מממ והדפסנו את התוצאה: (פאהחפא: מאסא: 002) / שאגאפא: מקצך הערה;; אם בגירסה שהינך משתמש בה מופיעה הנקודה העשרונית, ניתן למנוע את הדפסתה באמצעות פונקציית השלם 1א1 במשפט ההדפסה: ( (מאזופא: מאסא: 002) / מאסא:) עאז מקצך כו גם עבור המכנה: ( (מאנומא: מאסא: 002) / מאההמא:) דא מקצך - 126 - נגדיר הליך להסבת שבר מדומה לשבר מעורב ונשתמש לשם כך בהליך המצמצם שבר פשוט. כזכור, בשבר מדומה המונה גדול מן המכנה, ולכן הוא מכיל גם יחידות שלימות. הגדרת טשטגחסמא מאגחמא: מאסא: טגמסטא 70 ( פ" =" ס" מאגאמא: /" מאסא: מקצד ) מאהמפא: < מאסא: דפפך [( ש" (מאגמא: / מאסא:) צאד מקצצ)] ותד [פ0ד5] 0 = מאגחמא: מאסא: המפאצגאמת סד (ס" +" מקציד) מאהתמא: (מאגחסא: מאסא: המפאזהאסת) אטלאד? פאם עבור המספר המדומה '70/25' נרשום את ההוראה ---> 5 70 טגתסמא? ונקבל את הפלט הבא: 5 + 2 = 70/25 נציג תחילה את התרגיל: ‏ ( ס" >" ם" מאהזמא: /" מאסא: מקצד ) עתה נעבור לחישוב ההליך ₪0 הבודק תחילה, אם המספר שנמסר לו הוא שבר מדומה: מאהתטא: < מאסא: תפמ אם כן, הוא מדפיס את השלמים ולידם שני רווחים: [( ס" (מאגמא: / מאסא:) עא1 מקצע)] צחד ההוראה שלאחר מכן מתבצעת בכל מקרה, על מנת להבטיח סיום ההליך, גם אם לא נשאר שבר פשוט לאחר הוצאת השלמים: [פ510] 0 = מאגצשא: מאסא: המפאדהאפת קד לדוגמה, אם המונה הוא 42 והמכנה שווה ל-14, אז התוצאה היא מספר שלם ולא מספר מעורב, לדוגמה: '3 = 42/18'. - 127 - אך אם נשאר שבר פשוט, מודפס סימן הפלוס ‏ '+', ומבוצעת קריאה ל-218208, כדי להדפיס את השארית בצורה המצומצמת ביותר. מאהצטא: (מאגחמא: מאסא: תתפאדהאתת) אט2אז2 נגדיר הליך לחיבור שני מספרים של שבר פשוט. בחיבור זה לפנינו ארבעה משתנים: 1מאסא: 1מאהחפא: 2מאסא: 2מאהאט:. ההליך מחשב את סכומם ובאמצעות ₪044 מדפיס את התוצאה בצורה המצומצמת. ידוע ש- 4 / (560 + 86) = 6/6 + 8/0 לפי משוואה זו נפתור את התרגיל. הגדרת השסמזא 2: 2אא: 1אא: 1אא: הטמדע 70 (1*:₪2א: ) ( (1מ:*2אא:) + (1*:₪2אא:)) טהמסמא פא כאשר נרשום ---> 9 7 5 3 הסמזתה? נקבל את הפלט הבא: 9 1 = 65/50 הספזא פונה ל-טגת0שא. הוא מעביר את ערך החישוב של '06 + 6ם' למשתנה מא0א: ובמקרה שלנו - את הערך 65 (= 5*7 + 3*10). למשתנה מאהחתא: הוא מעביר את ערך הביטוי '6ס', שהוא 50 (= 5*10). אם נרצה בהדפסת התרגיל מתחילתו, נוסיף ל-11808 הוראה שתתבצע לפני הפניה ל-ע₪₪08₪4: ( ס" =" ש" 812: /" 2אא: ס" +" פ" ₪1א: /" 1את: מקע ) ואז הפלט הסופי :היה: 0 + 1 = 65/50 = 71/10 + 3/5 למעשה, כתבנו תכנית שלימה לחיבור שני מספרים של שבר פשוט. - 128 - תכנית זו בנויה לפי שיטת התכנות המבני ומורכבת מכמה הליכים, אשר אחד קורא לחברו. - | ההליך 11808 מבצע את החישוב ופונה ל-טְגַת₪0א, על מנת שזה , יציג את התוצאה כמספר מעורב (אם נ:תן). - | ההליך /8₪0882 פונה ל-א20א21, כדי לצמצם את המספר, אם הדבר אפשרי. - | ההליך א20א218 פונה לפונקציה 602, שבאמצעותה מתבצע חישוב הצמצום. נוכל להציג כך את התהליך: 2 <--- 208א 21‏ ?-- שגבתסמא ‏ <-- חטפנת תרג'ילים (המשך) 8 הגדר הליך המקבל שטח של עיגול, ומשתמש בפונקציה 81ק שהגדרת בתרגיל 1, לחישוב הרדיוס של אותו עיגול. 9. הגדר הליך 81508 הפונה להליך ע04מא, לחישוב הפרש של שני מספרים של שבר פשוט. 0. הגדר הליך מעטא לחישוב המכפלה של שני מספרים של שבר פשוט. 1. הגדר הליך א8110% לחישוב החלוקה של המטפר הראשון בשני. השתמש בהליך /₪0₪48א. 2. הגדר הליך אפאת הבוחר 4% נתונים אקראיים בתחום (1...100), שיהוו שני מספרים של שבר פשוט. ההליך פונה להליך הטסמזח לחישוב והדפסה של הסכום שלהם. 3. כתוב הוראה שתבצע את תרגיל 12 עשר פעמים. כלומר, הדפסת 10 תרגילי חיבור של שני מספרים בשבר פשוט, כאשר הנתונים נבחרים באופן אקראי על-ידי המחשב. - 129 - .58 .5 השתמש בפונקציה 002 על מנת להגדיר פונקציה לחישוב המכפלה המשותפת הקטנה ביותר של שנ* מספרים נתונים (המכנה המשותף הקטן ביותר). בהנחה שהפונקציה 5081 אינה מוגדרת בלוגו, הגדר פונקציה 0007 למציאת קירוב של השורש הריבוע* של מספר נתון, עד לדרגת דיוק של 0.0001. סיוע לפתרון: אם אזא: מהווה שטח של מלבן כלשהו, הרי ככל שההפרש בין שתי הצלעות קטן יותר, כך מתקרב המלבן לצורה של ריבוע. *דוע שצלע של ריבוע היא השורש הר*בוע: של שטחו. אם נתונה צלע אחת 4: של שטח אטא: כלשהו - הצלע השניה 8: תהיה שווה ל-84:/אעא:. הדרכה בהרכבת התכנית: לפתרון התרגיל נקבע ערך התחלת: '1' עבור המשתנה 4:, ואילו ל-8: ניתן את הערך 4:/אטא, אשר שווה ל-אטא: עצמו. - | אם ההפרש המוחלט של 2: ו-8: קטן מ-0.0001, על הפונקציה לפלוט את הערך של 4:. תוכל להשתמש בפונקציה 885 לאחר שתגדיר אותה במחשב: | [4: 09] 0.0001 > (8: - 4:) 485 שד - | אחרת, ‏ יש לפנות לפונקציה באופן רקורסיבי כאשר 8: יקבל ערך שהוא הממוצע של שתי הצלעות. 8: יקבל כאמור את הערך 'ה: /אטא:'. (ה:/אטא:) 8(/2:+4:) אטא: 50048001 פס בתרגילים כאלה, כאשר יש להציב ערך התחלתי שנקבע ‏ או מחושב על-ידי האלגוריתם, נוכל להגדיר הליך ראשי אשר יפנה לפונקציית החישוב עם מתן הערכים המתאימים. = 130 - לדוגמה ---> 5 תתספאתקה 70 5: 1 15א: 50048002 תק פא מהלך הביצע של הליך רקורסיבי הבה נעקוב אחר הביצוע של תהליך החישוב (מתס1ע0ש41) בעל מבנה רקורסיבי, צעד אחר צעד, ותוך כדי כך נלמד על דרך פעולתו של הליך רקורסיבי. בגמר ביצוע הוראה בתכנית כלשהי עובר המחשב להוראה העוקבת. אם הוראה ת שבהליך 44 היא קריאה להליך 25, אזי בתום ביצוע כל ההוראות המופיעות ב-888, עובר הביצוע להוראה 1+ם שבהליך 448 להמשך התהליך המוצג בתכנית. כיצד מיושם הדבר בהליך רקורסיבי, כאשר הפניה היא אל ההליך עצמו? לאן עובר הביצוע כאשר הוא מסיים מחזור ד' למשל, שנקרא על-ידי מחזור ג' שלפניו? היכן ומת מסתיים כל מחזור, האם בהוראה 5102, או בהוראה כאם? על מנת להסביר זאת, נעזר בהליך כא08ע המדפיס את המספרים מ-1 עד 3. הקלט הוא '1'. אטא: פאתסע 170 [פ510] 3 < אטא: עך1 אסא: הק 1 + אטא: פאתסע סאם כאשר (רשום --7> 1 פאתסץ? נקבל את הפלט הבא: 1 2 3 - 131 - תחילה הודפס המספר '1', לאחריו המספר '2' ולבסוף - '3'. נרשום להלן את כל ההוראות המתבצעות במשך הרצת התכנית, על מנת לבדוק כל הוראה והוראה - מתי היא מתבצעת? איזו באה אחריה? מת: מסתיים כל אחד מן המחזורים, ואיך? במקום המשתנה אטא: נכתוב את הערך עצמו בכל מחזור ומחזור, כפ: שמתייחס אליו המחשב. כאשר רושמים '1 פאתסע' ומקישים <265> מתחיל המחשב בביצוע: 1 פוותסע [5109] 1<3 שד 1 אק ך-- 1+1 סע א 6 ב' 2 פאחסע [9109] 223 שד 2 אע ר-- 2+1 009 3 פאמסע == % 0 [פ510] 3<3 ש 1‏ .4.3.1 3 תק .4.3.2 == 1 תשתסע .4.3.3 ד' 4 כאותסע 07 43 סד 1. תחילה מבצע המחשב את ההוראה 1 ולאחריה את ההוראה ‏ 2. כאן אין התנאי מתקיים, לכן המחשב עובר להוראה 3, אשר מדפיסה את המספר 1. בהוראה 84 מתבצעת קריאה רקורסיבית להוראה '1+1 פשתסת' והמחשב עובר למחזור אחר (מחזור ב'). בתום הביצוע של כל ההוראות הכלולות במחזור ב' נחזור למחזור א', למילת הסיום פאם. במחזור ב' תופעלנה כל ההוראות המסומנות במסגרת ב' ובמסגרות הפנימיות הכלולות בו. - 132 - מחזור ב' מתחיל להתבצע כאשר הקלט שלו הוא '2'. בהוראה 84.1 התנאי לעצירה לא מתקיים, לכן ממשיך המחשב להוראה 4.2, שמדפיסה את המספר 2. בהוראה 4.3 נעשית פניה למחזור ג', והפעם ערך הקלט הוא '3', כי '2+1 פשתסת' (שים לב - עדיין לא הגיע ההליך למילה סאם שב-8.8). בהוראה ‏ 4.3.1 שבמחזור ג' לא מתקיים התנאי, ולכן הוראה 4.3.2 מדפיסה את המספר 3. הוראה 8.3.3 קוראת למחזור ד' '3+1 פשתסץ'. במחזור ד', התנאי ‏ '8<3 ע1' שבהוראה ‏ 85.3.3.1 אכן מתקיים, וכתוצאה - נעצר ביצוע מחזור זה על-ידי ההוראה 5?05. כאשר מחזור ‏ זה מסתיים, מסתיימת ההוראה 4.3.3, והמחשב עובר להוראה שלאחריה, אל ההוראה 8.3.2. כאן מופיעה המילה פאם האומרת שאין יותר הוראות לתיאור התהליך, וכך מסתיים מחזור ג'. סיום מחזור ג' פירושו גמר ביצוע ההוראה 5.3, ועתה עובר המחשב להוראה ‏ %.8. כאן המילה סאפ מסיימת מחזור ב', שפירושו סיום ההוראה 1. ועם סיום ההוראה 4, מבצע המחשב את ההוראה ‏ 5. הפעם מציינת המילה סאם את סיום מחזור א'. וכך, עם גמר ביצוע מחזור א', מגיע תהליך ביצוע ההליך הרקורסיבי לסיומו. בדוגמה הבאה נבחן את מהלך הביצוע של ההליך א80. הליך זה דומה ל-0802ע, אלא שהוראת הקריאה הינה לפני הוראת ההדפסה חק. 10 808 5 [9109] 3 < פדא: קך 1 + 15א: אסם 5צא: אק פאם - 133 - כאשר נרשום 1 א80, הפלט שיופיע על המסך יהיה שונה מזה שקיבלנו על-ידי הרצת 080ע2. העזר בתרשים הבא, ועקוב אחר ההוראות המתבצעות בזו אחר זו, על מנת שתוכל לרשום את הפלט באופן *דנ', לפני שתריצ את ההליך במחשב. 1 אס . [09ד8] 123 ע 1‏ .2 --- 11 א80 2 806% [פ10פ] 223 18 3.1 4 - 1 08 .3.2 3 אסם [פ10פ] 323 אד .3.2.1 אע 1 808 .3.2.2 די 4 אס 0 ] 3 פד 2 שים לב, שהמחשב לא עובר להוראה % ('1 הפ') של המחזור הראשון, כל עוד לא סיים את ביצוע כל ההוראות הכלולות במחזור שלאחריו. כן הדבר לגבי הוראה 3.3 ('2 תפ'), שבמחזור ב'. הוראה זו תתבצע רק בתום ביצוע ההוראה 3.2, המציינת את גמר ביצוע מחזור ג'. ההוראה 3.2.2 שבמחזור ג' פונה למחזור ד', אך זה נעצר על-:ד: ההוראה 5102, בשל קיומו של התנא*. כאשר מחזור ד' מסתיים, הביצוע עובר להוראה 3.2.3 הנמצאת אחר: הקריאה, ולכן מודפס המספר 3. עם סיום מחזור ‏ ג' על-:ד: סאע, עובר המחשב להוראה 3.3, המדפיסה את המספר 2, וכאן מסתיים מחזור = 138 0 ב' - אף הוא על-ידי פאם. הביצוע מתקדם להוראה 1, אשר מדפיסה את המספר ‏ 1, וממשיכה למילה פאת של מחזור א' המציינת את סיום הביצוע של כל ההליך. מהלך הביצוע של פו(קציה רקורסיבית נלמד עתה את סדר ביצוע הפעולות בפונקציה רקורסיבית. נגדיר פונקציה ']0א, המקבלת 2 נתונים 8 ו-ם, ומחזירה את מכפלתם (ס * 8). נניח שפעולת הכפל '*' אינה מוגדרת בגירסת לוגו שבידך, ואף לא הפונקציה עסטפסתק. אם יש לחשב לדוגמה 4*3, כלומר 4 פעמים 3, מהלך החישוב הוא: (3+(3+(3+(0+3)))) נציג זאת באופן סכימטי: ר 3 רד 3+36 -] ך- 6+3=9 = 932 = | 12 לצורך הפתרון, נשתמש במשתנים 82: ו-8: ונגדיר משתנה נוסף 1 אשר ישמש כמשתנה צובר של התוצאה. בתחילה ערכו הוא '0', לאחר מכן מתוסף לו בכל מחזור הערך 3, וסה"כ % פעמים. הגדרת עתסא עתספעת: 8: ג: צעטא 70 [1ספטת: פס] 1 > ם: קך (8: + קוטפסת:) (1 - 8:) 2: עעטא פס פאת - 135 - כאשר נרשום ---> 0 5 3 צעטא תק נקבל: 12 הפונקציה 0/2 מחשבת את הערך של '8: פעמים 8:'. 8: משמש כמשתנה מונה בשיטת הספירה לאחור, כך שבכל פעם מופחת ממנו 1. למשתנה עטפטת: כאמור, מתוסף בכל מחזור הערךך של 8:. ולכן בקריאה לרקורסיה אנו רושמים: (4: + [וספמת:) (1 - ם:) 2: עתטשא פס במחזור ם, שהוא המחזור האחרון, מתקיים התנאי '261: 18'. אז הוא מוסר את הערך של עתשפמ3: למחזור שקדם לו, כלומר לזה שפנה אליו: [1ספעת: ק0] 1 > ם: תד הפלט של מחזור םת הופך להיות התוצאה של המחזור המקבל (מחזור 1-ת). ערך זה עליו להחזיר למחזור שפנה אליו מחזור 2-ם, וכן הלאה עד למחזור הראשון, שאליו אנו פונים כאשר רושמים ו 0 4 3 זט תק עתה התוצאה מודפסת על המסך. אנו רואים, שבתהליך זה הפלט של הפונקציה הנקראת משמש קלט לפונקציה הקוראת. 0 16 ב נמחיש זאת באמצעות התרשים הבא. כאשר גרשום --> 0 5 3 נא הק? יתחיל הביצוע: 0 5 3 דטת [0 פס] 461 סד (0+3) (8-1) 3 ]תשא פס | פאם 33 3 דט 6 2 3 תעטא [6 09] 261 אך פאט ך- (1653 (2-1) 3 ששטא פס ז 9 כ עעטא 12 0 3 צעתטא [12 ע0] 061 ק 1‏ .3.2.2.2.1 ==> 12 בהוראה 2 של המחזור הראשון, אין התנאי מתקיים, לכן עובר המחשב להוראה ‏ 3. על הוראה זו לפלוט (6שק6ט0) את ערך התוצאה של מחזור ב', והביצוע עובר למחזור חדש. גם במחזור ב' אין התנאי מתקיים והביצוע עובר להוראה ‏ 3.2. הפלט של מחזור זה תלוי אם כן, בתוצאת החישוב של מחזור ג'. כתוצאה מאי קיום התנאי אף במחזור ג', הפקודה 0 שבהוראה 3.2.2 תפעל על הערך שיחושב על-ידי מחזור ד', אשר משמש עבורה כקלט. במחזור ד' עדיין התנאי לא מתקיים, ולכן ההוראה ‏ 3.2.2.2 תפלוט את הערך שיתקבל ממחזור ה'. במחזור ה', כאשר התנאי כן מתקיים, מחזירה 00 שבמשפט התנאי את - 13] - הערך 12 (הוראה 3.2.2.2.1). ערך זה מהווה קלט עבור מחזור ד', אותו הוא מוסר למתחזור ג'. הפקודה 0 בהוראה 3.2.2 תחזיר ערך זה למחזור ב', אשר יפעל עליו בהוראה 3.2 וימסור אותו למחזור א'. הוראה 3 של מחזור א' מקבלת תוצאה זו ומחזירה אותה כערך סופ: של כל החישוב. שים לב, כי המילה פא₪ בהגדרה מציינת את סוף תיאור החישוב, או התכנית, בלבד. התוצאה המחושבת על-ידי פונקציה הינה ערך, ולכן ניתן להשתמש בה כחלק של ביטוי חשבוני. כמו כן למדנו ש-09 פועלת על ביטו:יים הניתנים לחישוב. לכן נוכל להשתמש בתוצאת החישוב של כל מחזור ומחזור במקום המשתנה 07פטת:, ולתוצאה זו נוסיף את הערך של 4: במשפט הפלט '05'. נניח שהתוצאה של מחזור ב' ידועה, אזי נוכל לחשב את מחזור א' על פי התבנית הבאה: מחזור א' = 4: + מחזור ב' כןו הדבר לגבי מחזור ב'. אם התוצאה של ג' ידועה אז': מחזור ב' = 2: + מחזור ג' ובאופן כלל:: מחזור ת 1 4: + מחזור 1+ת החישובים מתבצעים על ערכים לא ידועים, התלויים בתוצאת חישובים אחרים, שאף הם לא ידועים. על כן, הדבר מחייב לחשב ערך התחלת: ידוע, אשר ישמש נקודת מוצא לחישוב של כל פונקציה. ואמנם, תוצאת הכפל של נתון כלשהו ב-6 שווה 0, לכן '0' יהיה ערך הפלט של המחזור האחרון, מחזור ם. הפלט של המחתזור האחרון הי:נו הערך הראשון המוחזר כערך התוצאה של המחזור אשר קרא לו. ערך התוצאה הראשון הנמסר על-ידי מחזור ם למחזור הקורא לו 1-ת, הינו הערך המשמש נקודת מוצא לחישוב ערך הפונקציה כולה. התוצאה של המחזור האחרון נמסרת רק כאשר ערך המכפיל 8: שווה 0 (אפס), כלומר: [0 פ0] 1 > 8: קד את התוצאה הסופית מקבלים על-ידי הצבה של הערך המתקבל מן המחזור. הנקרא אל הביטו*י המחשב את ערך הפלט של המחזור הקורא. = 18 = למעשה, הפתרון הנכון מסתמך על שת* המשוואות הבאות: - עבור המחזור האחרון, התוצאה היא 0 - עבור כל מחזור םת אחר, התוצאה היא: 4: + מחזור 1+ת נבחן עתה את מהלך הביצוע של ההליך מפקתטא: הגדרת ‏ קד 8: 8: מפצתטא 0 [0 פס] 1 > ם: שך (1 - 8:) 2: מעצעתטא + 2: 05 פאם נסה להבין את תהליך ביצוע ההוראות המובא בתרשים שלפניך. כאשר נרשום ---> 8 3 מפצעטא תק? יתחיל הביצוע: 8 3 קט | [0 08] 841 קד (4-1) 3 פוט + 3 פס 7 3 3 קט 18 341 ]09 6[ (3-1) 3 םפנעטא + 3 עס רייק 2 3 מפדזטון [0 ק0] 261 קך (2-1) 3 םקצוטא + 3 תס | פאם 1 3 ,סד זו [6 00] 161 סד 1) 3 מפדוטא + 3 פס | 6 3 .מקוהזטוו [0 ת0] 061 18 .3.2.2.2.1 ==> 0 - 139 - שים לב, כי בדרך חישוב זו תוצאת הפונקציה במחזור ‏ 1-ת שווה לתוצאת הפונקציה של מחזור ם בתוספת הערך של 8:. כלומר, תוצאת החישוב של כל מחזור תלויה בתוצאת החישוב של המחזור הבא אחריו, אך מחושב לפניו. כך הדבר בכל מחזור עד למחזור האחרון, שבו התנאי אמנם מתקיים, ואז התוצאה שלו משמשת נקודת מוצא התחלתית של החישוב כולו. בתום הביצוע מחזירה הפונקציה את ערך התוצאה הסופית. במחזור האחרון, מחזור ה', התוצאה שלו מהווה נקודת מוצא: 0 >>-=5 '0ק‎ 0' ערך התוצאה של מחזור ד' שווה ל-(מחזור ה' + 3): 0+ = '(1 - 1) 3 םתנוטא + 3 ק0' ==>)> 3 ערך הפונקציה של מחזור ג' מבוטא על-ידי (מתזור ד' + 3): 3 + 3 = '(1 - 2) 3 ₪ת1טא + 3 ק '0‏ ===)) 6 תוצאת החישוב של מחזור ב' היא (מתזור ג' + 3): 6 + 3 = '(1 - 3) 3 םעט + 3 07' ==>>> 9 ערך| התוצאה של מחזור א' שהוא הערך הסופי של הפונקציה הרקורסיבית שווה ל-(מחזור ב' + 3): 9+ = '(1 - 8) 4 מתע1טא + 3 ק0' ===>> 12 במהלך הביצוע הרקורסיבי נעשית קריאה רקורסיבית ממחזור למחזור. הקריאה הרקורסיבית הראשונה מתבצעת במחזור הראשון, ובכל מחזור מתבצעת קריאה נוספת עד למחזור האחרון, שם היא לא מתבצעת כלל. במקום זאת, מוחזר ערך המשמש כערך התחלתי לחישוב. כלומר, המחזור האחרון הוא המחזור הראשון, אשר מחשב ומעביר ערך למחזור שקרא לו. כל מחזור אשר מקבל ערך מבצע חישוב על הערך שנמסר לו, ומעביר את תוצאת החישוב שלו למחזור שקדם לו, עד למחזור הראשון. המחזור הראשון פולט את התוצאה הסופית של כל חישוב. = 100 = סידרת פיב (צ''. נגדיר פונקציה המחשבת את האיבר ה-ם-* בסידרת פיבונצ'י: -. ,21,370 141.2,39.,0,13 שים לב שגם האיבר הראשון וגם השני שווים ל-1 (8251, 1). כל איבר אחר שווה לסכום של שני קודמ*ו: .% " 5-1 * 2 הגדרת ‏ מדק א: פנת 70 [1 פ0] 1 > א: שך [1 פ0] 2 = א: חך (2-א: 18ע) + (1-א: פנס) 02 פאם מאחר שתוצאת כל מחזור תלויה בשני מחזורים הנקראים על-ידו, ‏ יש להגדיר שני ערכים התחלתיים, אשר ישמשו כצעד ראשון לחישוב. החישוב עבור 6 מזת, למשל: 8% פנע + 5 מדק = 6 מדק 3 בת + 4 פדע = 5 מדק 2 פזע + 4 מדק > 4 מדק 1 מע + 2 תנק = 3 מדק נתון : 11 מע = 2 מנק נציב ערך זה בביטוי החישוב של 4 18ע ונקבל: 2 1 +1 > 3 מצע אם נציב את הערכים המתאימים עבור ביטוי החישוב של 4 18ק, נקבל: 3 = 1 + 2 = 48 מצק - 141 - כך נעשה עבור התישוב של 5 18ע, ונקבל: 5 2 + 3 = 5 הנקת ותוצאת החישוב עבור 6 18ע תהיה: ו ססן 3 + 5 = 6 מנק ואכן, האיבר השישי הוא 8. תרג'לים (המשך) .6 .17 .8 .9 הגדר פונקציה אתתש0ק, המקבלת שנ* מספרים טבעיים, ומחשבת את הנתון 4: בחזקת א:. זכור ש-4: בחזקת 0 שווה ל-1. אם הינך משתמש בגירסה של 1000 18%, הנח שלא קיימת הפונקציה המסטסק. הנח שפעולות הכפל והחילוק א*נן מוכרות על-*די* המחשב, ואף לא הפונקציות תמפאזגאמת ו-7צא00011₪, בתנאים אלה הגדר פונקציה 4א1א, המקבלת שנ* נתונים 8 ו-ם, ומחשבת את המנה של חליקת 8 ב-0. הוראות החישוב: א. אם מ8% אזי התוצאה היא '0'. ב. יש למנות את מספר המחזורים בהם ניתן לחסר את ס מ-8 ( פ: (8: - ג:) אגא + 1 ק0 ) הסתמך על אותה הנחה שבתרגיל ]1 על-מנת להגדיר פונקציה זזהתעפ, לחישוב השארית של חלוקת 8 ב-5. הגדר פונקציה 40108140ת, לחישוב !א (א עצרת). נוסחת החישוב של א עצרת: 41 ... א*(2-א)*(1-א)אא = וא לדוגמה - 5*8*3*2*1 = !5 על פי ההגדרה [(1-א)*א= א וגם 1 !1 = 102 = .09 .1 למעשה, אם ‏ !4 *דוע, אז: 1 * 5 = !5 כמו כן, אם !3 ידוע, אז: 1ב א* 2 = ו וכן הלאה .. הנחייה: השתמש בהגדרה ‏ '1 > !1' כנקודת מוצא התחלתית לחישוב. הגדר פונקציה 18א50, המשתמשת ב-1ע, לחישוב סכום של טור מסידרת פיבונצ'י, בעל א: איברים. הדרכה: - | עבור טור בעל איבר אחד, כתוב: 1 תנק = 1 מדקאטספ - | סכום טור בעל א: איברים שווה לסכום טור של 1-א: איברים, ועוד ערך האיבר ה-א:, מכאן ש- א: פע + (1-א:) פנטאט5 = א: מדקאטפ הערה: ‏ יש לציין, שלרוב התרגילים יש לפחות שני פתרונות שונים. הגדר פונקציה רקורסיבית לחישוב סכום של א: האיברים הראשונים לכל אחת מן הסדרות הבאות: א. א:/1 + ... + 1/3 + 1/2 + 1 ב א:/1 + ... + 1/5 - 1/8 + 1/3 - 1/2 + 1 3 (א:*(1-א:+ ... +*(1+2(*3+2)) ... )) 0 13 2 פרק 10 ביטויים בוליאנים השימוש במחשבים אינו מצטמצם בביצוע חישובים חשבוניים בלבד, אלא כולל גם חישובים לוגיים. עד כה ביצענו חישובים לוגיים בביטויים המשמשים להשוואת יחסים של ערכים מספריים. זאת עשינו באמצעות פעולות היחס, גדול מ- ('<'), קטן מ- ('>') ושווה ל- ('='). בשוי לוגי פעולות לוגיות ביטוי אשר משתמשים בו בפעולות היחס נקרא ביטוי לוגי פשוט. הוא מופיע במשפט: התנאי אשר בודקים אם הביטוי הלוגי הוא אמיתי או שקרי, כלומר "נכון" (מטסתך1) או "לא נכון" (4088ת). מידע זה דרוש על מנת לבצע פעולה מסוימת במקרה אחד, עם אפשרות לפעולה אחרת במקרה אחר. לדוגמה, כאשר הגדרנו פונקציה 885, ביקשנו מהמחשב לבדוק אם הנתון א: קטן מ-0: '0 > א: עז'. הערך של ביטוי זה יכול להיות 'שטתץז' או '158₪הת' בלבד. בהתאם לערך שמתקבל עוברת התכנית להוראה שיש לבצע. לפעמים יש צורך לבדוק יותר מאשר ביטוי לוג פשוט אחד בתוך הוראת תנא* אחד. בלוגו, כמו בשפות אחרות, ניתן לכתוב ביטו:י לוגי המורכב ממספר ביטויים לוגיים פשוטים. הקשר המחבר ביטויים לוגיים פשוטים לביטוי לוגי מורכב נעשה על-ידי פעולות הנקראות מילות חיבור מבחינה דקדוקית, וקשרים מבחינה לוגית. הבדיקה של הוראת התנא* תתייחס לביטוי הלוגי המורכב כולו. כלומר, ניתן להגיע להחלטות בכל רמת מורכבות באמצעות משפט* התנאי. ערך - 188 - הביסוי המורכב יהיה תלוי אם כן:- א. בערכם של הביטויים הפשוטים. ב. בפעולה הלוגית. מבחינים בין קשרים חד-מקומיים ודו-מקומיים. הפעולה הלוג:ית '1סא' היא קשר חד-מקומי, הפעולות הלוגיות 'עאג' ו-'08' מייצגות קשרים דו-מקומיים. פעולות לוגיות המתבצעות על ביטויים שערכם הוא 'אמת' או 'שקר', נקראות גם פעולות בוליאניות, על שמו של המדען הצרפתי ג'ורג' בול (8001 060286). הוא חקר אותן ביסודיות והניח את הבסיס התיאורטי לפעולות אלו. בכך הואה איפשר חישובים בביטויים בוליאנים, דהיינו ביטויים לוגיים מורכב:ים. הפעולה הלוגית פא8, פירושה 'וגם'. בפעולה זו אנו קושרים שנ: ביטויים לוגיים פשוטים, אשר נכנה אותם 10811 ו-10812, לביטוי לוגי מורכב אחד, שנכנה אותו 8001: 2 60אג 10811 = 8001 1 *קבל ערך 'אמת' רק כאשר גם 10811 וגם 10₪12 יחד מייצגים ערכי 'אמת'. די באחד מהם שיש לו ערך 'שקר' על מנת שהביטוי 1ססם ייחשב 'שקר*'. הפעולה הלוגית 08, פירושה 'או'. ערכו של הביטוי המורכב: 2 0 120811 = 8001 הביטוי 8001 יקבל ערך 'אמת', אם ל-10811 ערך 'אמת' או ל-10₪12 ערך 'אמת'. במילים אחרות, די באחד מהם שיהיה לו ערך 'אמת' כד: שהביטוי 001 :היה 'אמת'. הפעולה הלוגית 01א,.פירושה 'לא', והיא פועלת על ביטוי לוג: פשוט אחד בלבד. אם נתון הביטוי 10811, הערך המתקבל מהביטו: המורכב '10811 עסא', יהיה תמיד ההיפך מן הערך של הביטוי 10811. בדרך זו 01א פועלת למעשה לשלילת הביטוי הלוגי. - 145 - לכל שפת תכנות יש מבנה תחביר* המי*וחד לה. בלוגו נמצא, ששלוש הפעולות פאג, 8 ו-07א, הן פעולות מסוג א26+1ע. כלומר, פעולות המקדימות את הביטויים שיש לפעול על:יהם. בשפות אחרות נמצא, שהפעולות פאג ו-08 הן מסוג א91ת1. כלומר, פעולות המופיעות בין שג הביטויים (כפי שהובא לע*ל). הפעולות האריתמטיות למשל, הינן מסוג א++%ת1, כאשר הן נמצאות בין שני ביטויים חשבונ'ים, לדוגמה: '773 + 540', '15 * 36'. הערה: בלוגו פעולות אלו מתנהגות גם כ-א621עק. לעומת זאת, אזפ ו-2802007 הן פעולות מסוג א6?1פק, מכיון שהן מופיעות לפני הביטו*יים: '773 0 פ', '15 36 צסטססתק'. המבנה הכללי של ביטו* לוגי המורכב באמצעות כא4: <ביטו: לוגי 2> <ביטוי לוגי 1> פא = -- היוה ה לפי ערכי שנ* הביטו*ים הלוגיים. נמצא 4 תוצאות: ו ב | ערך הביטו: | תוצאה | | מסתץ" מטתד" פאה | מטתד | | 8₪ןהת" מטתד" פאג | מפזות | | שמשת" ₪פוגת" פאג | מפזות | 8" מפגת" פאג | מפעגס | יוו - 146 - המבנה הכללי של ביטוי המורכב באמצעות א08: <ביטוי לוגי 2> <ביטוי לוגי 1> 08 נציג את 84 האפשרויות של ערכי הביטויים הלוגיים ונקבל את התוצאה: 0 | ערך הביטוי | תוצאה | מסתץ" מטתד" הס | מטסתל | מפזגת" מסתך" מס | מטתד | מטתץ" מפתגת" תס | מטתך | גת" מפת" תס | מפתגק | זכ וה ".ב יי וי ב ישן המבנה הכללי של ביטוי צסא: עבור ביטוי לוגי אחד יש רק שת:י אפשרויות: ו || ערך הביטו: | תוצאה | ו | מטתד" צסא | מפגק | || מפתגת" עסא | מטתץ | ו )וויה - 1-7 - שים לב, שהפעולות הבוליאניות הן למעשה פונקציות בוליאניות. הן דורשות קלט עם ערכים של 'שטת7' או '5₪גת', ומחזירות כפלט ערך 'אחד בלבד, אף הוא 'מסתך או 'תפוגץ'. באמצעות הפעולות פאה ו-08 ניתן לפעול על :ותר מאשר שגנ: ביטויים, אס נתחום את כל הביטוי המורכב בסוגריים עגולים: (ביטוי לוגי ם ‏ ... ביטוי לוגי 2 ביטוי לוגי 1 פאג) (ביטוי לוג'י ם ... ביטוי לוגי 2 ביטוי לוג 1 8) בפעולות פאג8 די בביטוי לוגי אחד שקרי, כדי שערכו של כל הביטו: המורכב יהיה 'שקר'. בפעולות 08, די בביטוי אמיתי אחד, על מנת שערכו של כל הביטו: המורכב יהיה 'אמת'. אם גנרשום ---6 (2%2=! 10 1211 25(=5 5001) 1=1 כאג) תק? נקבל על המסך את ההודעה: 8 הביטוי '1=0' הוא 4/58₪ע, ולכן קיבלנו שערך הביטוי כולו הוא 8₪. ההוראה תק פועלת על הערך המתקבל, ולכן היא מדפיטה את המילה '45₪ת'. תכנית לבדיקת תקיגות של תאריך נגדיר הליך המקבל תאריך המורכב משלושה נתונים - שנה, חודש ויום, ומבצע עליו בדיקת תקינות עבור שנת 1988. - 148 - 878 תרדגה‎ צגפ: נעאסא: תגמצ: מדגכ 0ד [5109 [תגמצ פ1ןהטא1] תק] 1988 = תבתצ: עסא שד [5109 [אעאסא פבעאטאד] תע] 12 < מתאסא: 1 > נתאסא: תס עד [5100 [478כ עמתתססא1] תק] 2 = גתאסא: 29 < צגכ: פאה חד ( 11 = חצאסא: 9 = הלאסא: 6 = מצאסא: 4 = מצאסא: הס) קד [פ510 [1₪ דסמתתססא1] תק] 30 < צגת: קד] [צגפ פ1הטא1] תק] [01מ8תת00 12'5] תהע] 32>צגכ: 0<צגכ: פאג שד סאם הסבר: א. אם הערך של המשתנה תגמצ: שונה מ-1988, הדפס הודעת שגיאה ועצור. שונה, כלומר, לא שווה: 8 = תגמצ: צסא אם ערך 11א0א: אינו בתחום המספרים (1...12), הדפס הודעת שגיאה ועצור. אם הערך קטן מ-1 או גדול מ-12, המספר אינו בתחום המספרים המצביעים על חודש מסוים: 2 < אעאסא: 1 > ה1אסא: הס בחודש פברואר של שנת 1988 יש 29 יום. לכן יש להדפיס הודעת שגיאה ולעצור, אם ערכו של צג2: גדול יותר מ-29 וגם ערכו של אזאסא: הוא 2: 2 = אדאסא: 29 < צגכ: פאה אם ערכו של ז1עאסא: מצביע על החודש ה-4, או ה-6, או ה-9, או ה-11, בדוק אם ל-24%: ערך גדול מ-30 ואם כן, הדפס הודעת שגיאה ועצור: (11=ה1אסא: 9=מתאסא: 6=מנאסא: 4=זתאסא: הס) אם ערכ של צג2: הוא בתחום המספרים (1...31), המצביע על יום סביר בחודש, הדפס שהתאריך נכון. אחרת, הדפס הודעת שגיאה: 2 > צגפ: 0 < צגכ: פאג - 189 - פעולות אלו מתבצעות על ביטויים עם ערכים של 'מטסתך' או 'מפעגק', ולכן הן פועלות על כל ביטוי לוגי שהוא, בין אם הוא פשוט או מורכב. ננצל עובדה זו ונגדיר מחדש את ההליך הזה. בהוראות הת(א: יופיעו ביסויים ברמת מורכבות גבוהה יותר, ועל-ידי כך נצמצם את מספר הוראות התנא*. הגדרת ‏ 28781 ע: א: צ: 1מלהכ 0ד 1 (0231: 2%1: 12<א: 61א: 1988=ע: עסא תס) עד [פ510 [18גפ פ1עגטא1] הק] =א: 6-א: ב-8: 05) 30<כ: פאה 29<כ: 2-א: פאג חס שד [[טתת00 15 דד] תקע] [[מעג עסמתתססאב] תפ] פאם ניתן להלן הסבר על אופן כתיבת הביטוי מבחינה לוגית, ונלמד תוך כדי כך גם על הדרך בה פועלות פונקציות אלו בלוגו. בהוראת התנאי הראשונה - אם התנאי מתקיים, כלומר אם ערכוה של הביטוי 'אמת', מודפסת הודעת שגיאה. אנו יודעים שהתאריך אינו תקין, אם לאחד מן הביטויים הבאים יש ערך 'אמת': א) 8 = צ: עסא ב) 1 > א: ג) 2 < א: ד) 1 > פ: ה) 1 < כ: כלומר, מספיק שאחד מן הביטויים האלה יהיה בעל ערך 'אמת', על מנת שנדפיס הודעת שגיאה. לכן, קשרנוו את כל הביטויים האלה באמצעות הפעולה 08. יש להבחין בכך שהביטוי הראשון '88 = צ: עַסא', הוא ביטו: מורכב, והוא אחד הקלטים של הפונקציה 08. על כן מחשבים אותו תחילה, כדי שפעולת 08 תפעל על הערך המתקבל מחישוב זה. - 150 - בהוראת התנאי השניה - אם התנאי מתקיים, מודפסת הודעת שגיאה, אחרת ‏ - מודפסת הודעה חיובית. כאן מתבצעת הבדיקה עבור חודש פברואר, ועבור החודשים שיש בהם רק 30 *ום. התאריך לא יהיה תקין: - אם ל-2: יהיה ערך גדול מ-29 עבור חודש 2 (פברואר): 9: 2-א: פאגב - | או, אם נתון ל-2: ערך גדול יותר מ-30, עבור אחד מהחודשים 9 4 6 ו-11: (8=11: 9-א8: 6=א: 2-=א: 05) 30<כ: פאג תוצאת החישוב של כל אחד משנ ביטויים אלה, מהווה קלט עבור הפעולה 08 הבאה בתחילת הביטוי המורכב כולו. כלומר, על המחשב לחשב תחילה את הערך של כל אחד מהם. בדוגמה זו, הקלט השני הינו ביטוי מורכב, המחושב על-:ד: הפונקציה פאג. כאן פועלת פא על שני ערכים המתקבלים משנן: קלטים, שאחד מהם אף הוא ביטוי מורכב: (11=א: 9=א8: 6-א: 4-א: ה0) בחישוב של ביטוי לוגי מורכב מבצעים תחילה את החישוב של כל אחד מהביטויים המשמשים כקלט, ורק לבסוף ניתן לחשב את הערך של הביטוי השלם. חשוב פונקציר(לי הפונקציות הבוליאניות בלוגו הן מסוג א1+?6עק, אשר בהן הקלטים נמצאים בחלק הימני של הביטוי הבוליאני. אם קלטים אלה מופיעים אף הם כביטויים בוליאנים, יהיו גם הקלטים שלהם בחלק הימנ* בביטוי המשמש כקלט, וכן הלאה. מכיון שהחישוב מתבצע תחילה על הביטויים המשמשים כקלט, מתברר שהחישוב מתבצע מימין לשמאל. - 151 - באריתמטיקה קיימת דרך חישוב מסוימת הנקראת כתיב פולני (ג115סק מ10ס8פסא), שבה מופיעה פעולת החשבון לפני שנ* הנתונים ולא ביניהם. לדוגמה: | - הביטו: '8 %* שי נכתב כך: 8 54 * - הביטוי '2 - 5 * 80' נכתב כך: ‏ 2 5 80 * - שים לב, כי פעולת החיסור נמצאת לפני שני הנתונים שהיא פועלת עליהם: האחד הוא הערך המתקבל מחישוב הביטוי '5 80 *', והשנ: הוא 2. ביטוי המתבצע מימין לשמאל, כאשר הפעולה נמצאת בתחילת הביטוי, דומה לביטו:י הפולנ:י שהחישוב בו מתנהג באופן פונקציונלי. נמצא שבביטוי מורכב, פונקציה אחת פועלת על פונקציה שניה, אשר פועלת על פונקציה שלישית וכו'. כך שהפלט של הפונקציה השלישית משמש קלט לפונקציה השניה, והתוצאה של השניה משמשת קלט לפונקציה הראשונה. במילים אחרות ‏ - ערך הפונקציה השלישית משמש ארגומנט לפונקציה השניה, וערך הפונקציה השניה מהווה ארגומנט לפונקציה הראשונה. לדוגמה: נתונות שלוש פונקציות (א)ע, (צ)6, (2)א₪, המוגדרות באופן הבא: 2 = (א)ץק 2ץ = (צ)0 22 = (2)₪ כאשר נרצה לחשב את הביטוי (((0)81)3)ע, נבצע את הצעדים הבאים: תחילה נחשב (8)3 ונקבל >===‏ 9 לאחר מכן נחשב (6)9 >===‏ 18 ולבסוף נחשב (18)ק >===‏ 20 וזוהי התוצאה. - 152 - נרדיקטיס בלוגו קיימות מספר פונקציות, הבודקות תנאים מסוימים. פונקציה כזו קרויה פרדיקט (6610806עק). ערכיה האפשריים הם אשתך" או מפזק". לדוגמה, הפרדיקט לתטמאטא מקבל נתון קלט אחד, ומחזיר את הערך 'שטתז', רק אם הקלט הוא בעל ערך מספרי. כאשר נרשום ---> (הערך המספרי 3.14) :םק פתמפווא תק? נקבל: מסתך אבל כאשר נרשום ---> (המילה זק) 1ע" קהממאטא הק? נקבל תשובה שלילית: ₪ בתכניות שבהן על המשתמש להקיש נתון מספרי כלשהו, ניתן באמצעות קתממאטא לבצע בדיקה של הקלט המוקש ולהמשיך את ביצוע התכנית בהתאם לתוצאה שתתקבל. כך נוכל להמנע מהודעות שגיאה ועצירת התכנית בעת הביצוע. פרדיקט אחר הוא 00419ם, הבודק שוויון בין שני נתונים. הוא פועל על נתונים מספריים וגם על נתונים לא מספריים, בדומה לפעולה כאשר נרשום ---> 6*6 4*9 00810 תק? נקבל: שעת > כאשר נרשום ---> 66 4+9 ₪041 תק? נקבל: זו נרשום דוגמה נוספת ---> 0" סמה" <]הטסם הק? המילים שוות והתוצאה: מסתד = 153 - עתה (רשום ---> [ממגתפד] מטהת15" <תהטסם הק? אין שיוויון מכיון שמשווים מילה עם רשימה: 5 יוצרי השפה דאגו ששמות הפרדיקטים בלוגו יסתיימו באות 'ת', כד: לציין שמדובר בפרדיקט המחזיר פלט 'אמת' או 'שקר'. גם אנו נוכל להגדיר פונקציות לוגיות לביצוע בדיקות מסוימות. נגדיר להלן פונקציה המקבלת מספר אחד ופולטת את המילה 'שסתד' אם הערך הוא של*לי, אחרת התוצאה תהיה '5₪זגת'. הגדרת ‏ 5117115 5: >ךד,5111 10 [4158ת" 05] [מטתץך" 05] 0 > פצא: שד פאט ידוע שהמחשב מבצע חישוב על ביטויים לוגיים, כמו כן ‏ ידוע ש-ק05 פועלת על ביטויים הנ*תנים לחישוב באמצעות המחשב. ולכן נוכל להגדיר פונקציה זו בדרך הפשוטה הבאה: הגדרת פמקז047מא אטא: פמט11טא 0 0 > אטא: 05 סא הביטוי '0 < אטא:' הוא ביטוי לוגי ולכן הערך שלו הוא 'משת1' או '19₪ע'. הפעולה 05 תפיק במקרה זה רק אחד משני ערכים אלה, והר: לפנינו פונקציה לוגית. 0 1% - תרג ילים .1 כתוב פונקציה לוגית, המקבלת ‏ 3 נתונים, בודקת אם כולם שווים, ופולטת הודעה מתאימה. הערה: ‏ 005 פולטת את ערך הפונקציה, אשר יכול להיות מספר, מילה או רשימה. אם נרצה שערך הפונקציה יהיה הודעה, נוכל לרשום את ההודעה ברשימה, למשל: [מטתד 18 11 ,פמץ] פס כתוב פרדיקט המקבל ‏ 3 נתונים, ובודק אם הם י*כולים להוות צלעות של משולש, הפלט הוא 'שטשת1' או 'מפמגק'. כתוב פונקציה המקבלת 3 נתונים, בודקת אותם ומפיקה תשובה בהתאם לתוצאת הבדיקה: '0' אם אי אפשר לבנות בהם משולש. '1' אם אפשר ליצור משולש שווה צלעות. '2' אם אפשר ליצור משולש שווה שוקיים. '3' אם המשולש המתקבל *היה שונה צלעות. אפשר להשתמש בפרדיקט שבתרגיל 2 לפתרון תרגיל זה.. באחד התרגילים בשיעורים הקודמים הגדרת תכנית המקבלת 84 נתונים, ובודקת אם ניתן ליצור בהם מרובע, אשר אפשר יהיה לחסום ‏ בו עיגול. פתור מחדש תרגיל זה, אך הפעם השתמש בפעולות הלוגיות, והגדר את התכנית כפונקציה. הגדר פרדיקט 0222 לבדיקה אם נתון הוא אי-זוגי. הגדר פרדיקט אחר א₪/₪ לבדיקה אס נתון הוא זוגי. רצוי שתבדוק תחילה אם הנתון הוא ערך מספרי. - 155 - הגדר פונקציה ;עתזמאאצ5 המקבלת מספר אטא: המורכב מחמש ספרות, בודקת אם הספרות שלו הן סימטריות (הסיפרה הראשונה זהה לאחרונה, והשניה זהה לרביעית), ופולטת הודעה בהתאם. הגדר פונקציה רקורסיבית 3א10א, למיון שלושה מספרים שונים בסדר עולה. מאחר ש-00 פועלת על ערך אחד בלבד, יש לאחד את שלושת הערכים לרטימה אחת באמצעות ההוראה 58 (רשימה אחת מהווה דבר אחד, כלומר, ערך אחד): 0 )58 :2 :8 :0( כאשר נרשום למשל ---> 6 11 98 3אשזא מק? נקבל את הפלט הבא: 8 36 11 אם נרשום ---> | 6 11 98 3אש1א 80פ? נקבל: [98 36 11] ש 156 = פרק 11 מילים ורשימות עד כה השתמשנו במשתנים לצורך החישובים שביצענו באמצעות המחשב. ראינו שבהגדרת הליך אחד ניתן להשתמש במשתנים שונים, שכל אחד מהם מיועד לאחסנה של נתון אחר, כך למשל, המשתנה הגמצ: שימש עבור השנה, 11א0א: - עבור החודש והמשתנה צג28: - עבור היום. בכל רגע קשור המשתנה עם ערך אחד בלבד, כאשר קישור זה אינו קבוע. דרך אחרת לאחסן נתונים הינה על-ידי סידור שלהם ברשימה המוצגת כמערך חד-מימדי (וקטור). באמצעות מערךך כזה ניתן לטפל במספר נתונים כמו רשימת תלמידים למשל, רשימת מספרי טלפון או רשימת ארצות. דרך זו נוחה ופשוטה יותר במקום השימוש במספר רב של משתנים המיועדים לאחסן נתונים עבור חישובים זהים. כבר בתחילת הספר הזכרנו את מושג הרשימה (2186) בלוגו, כאשר למדנו את הוראות ההדפסה. שם נאמר שרשימה הינה אוסף של דברים התחום בין סוגריים מרובעים. כמו כן נאמר, שלוגו מתייחטסת אל הרשימה כאל דבר אחד, גם אם היא מכילה מספר דברים. אס נתונה הרשימה [34 1 13 8 5], אנו אומרים שהדברים המופיעים בה הם איבר*. רשימה זו. נוכל להצביע על כל אחד מאיברי הרשימה על פי מקומו הסידורי. איבר מסוים יכול להיות הראשון ברשימה, השנ: בה, או האחרון. ברשימה הנתונה, המספר '5' הוא האיבר הראשון, והמספר '38' הוא האיבר האחרון. - 151 - נקציות בחירה בלוגו קיימות פונקציות מיוחדות המשמשות לעיבוד רשימות. חלקן פונקציות בחירה (8ע5618060) המיועדות לבחור ולפלוט חלק מרשימה נתונה, או איבר אחד ממנה: הפונקציה 1857ע כאשר הקלט הוא רשימה, הפלט הוא האיבר הראשון של רשימה זו. כאשר נרשום ---6> [34 21 13 8 5] לפת1ע 5₪80₪? יודפס על המסך: 5 הפונקציה ‏ 145% אם נתונה רשימה, הפלט הוא האיבר האחרון המופיע ברשימה זו. כאשר נרשום ---> [38 21 13 8 5] 1857 ₪ס8פ? נקבל על המסך: 3 הפונקציה 80121851 (בקיצור חם) עבור קלט שהוא רשימה, הפלט הוא רשימת כל איברי הרשימה פרט לראשון . כאשר (רשום -6-7 [38 21 13 8 5] 89 580%? יופיע הפלט הבא: [38 21 13 8] = 108 - הפונקציה 8011451 (בקיצור מם) עבור קלט שהוא רשימה, הפלט הוא רשימת כל איברי הרשימה פרט לאחרון. אם נרשום ---> [38 21 13 8 5] מם תק? נקבל את הפלט הבא: [21 13 8 5] לפניך מוגדר הליך 15%תק המקבל רשימה כלשהי סמט: ומדפיס איברים שונים שלה, כמפורט להלן : הגדרת 157תאהק סמ: 151תק 70 א. כל איברי הרשימה - ספץ: מק ב. האיבר הראשון - סמץ: עפתזע תק ג. האיבר האחרון - סמט: לעפה הק ד. רשימת כל האיברים פרט לראשון - ספ קם תק ה. רשימת כל האיברים פרט לאחרון - סמט: םם תק. פאם בקריאה להליך רושמים את שם ההליךך ונותנים למשתנה סמ/: קלט המוצג כרשימה ---> [אתפם ₪088 15הק אספאס1] 51ד,/זתק? כתוצאה מן הביצוע י*ופיע על המסך: אחפם באס 5דַהגק אספאס1 א0ספא 10 אתםם אתםפם האסת 5זתהק 4אסת 4815 אספא10 שים לב, כי השתמשנו בהוראה 25 ולא ב-580₪, ולכן הרשימות הוצגו ללא הסוגריים המרובעים. כאשר דרוש לבצע חישובים על איברי הרשימה, פועלים על כל אחד מהם לפי הסדר. החישוב כזה נעשה אם-כן במחזורים, כשבכל מחזור מתבצעות פעולה, או פעולות, על איבר אחר ברשימה. הביצוע יכול להתחיל - 199 - באיבר הראשון, אחר-כך לעבור לאיבר השני לביצוע החישוב הנדרש, לעבור לאיבר שלאחריו וכך מאיבר לאיבר עד לאיבר האחרוו ן. ההתייחסות לאיבר הראשון ברשימה נעשית בעזרת פונקציית הבחירה צפתנת. כך נוכל לבצע את החישובים באיבר הראשון שברשימה. בגמר הטיפול באיבר זה נוכל לפנות לרקורסיה, כאשר הקלט יהיה הפעם רשימה של שאר האיברים הדורשים טיפול. אלה הם כל איברי הרשימה פרט לראשון. נגדיר הליך רקורסיבי מזא141 לעיבוד של רשימה. ההליך מקבל רשימת תלמידים, ומדפיס את איבריה בזה אחר זה, כל איבר בשורה חדשה. הגדרת דא41 האהססת: פדא זג סיד האזסעת: צפתנקע תהק האתפסת: עם פדא זאיד פא בקריאה להליך יש לרשום את השם 01812 עם רשימת התלמידים שתשמש קלט עבור בא1חפמת:. כאשר (רשום ---> [1אסת 01 בטג אגכ] פזאגיד? נקבל את הפלט הבא: אפ ג 01 1אסת כאשר תסתיים הדפסת כל איבכרי הרשימה נקבל את ההערה הבאה: במחזור הראשון מודפס האיבר הראשון 'אגכ'. בפניה לרקורסיה הערך של גאזאפפת: מבוצע 'גא[הפתת: עם' כלומר ‏ - [1אסת 610 דטא]. - 160 - במחזור השני '1ש2' הוא האיבר הראשון, ולכן הוא מודפס. ושוב פונים למחזור חדש ונותנים 'גא1אפמת: עפ' של הרשימה הנוכחית. וכך ממחזור למחזור, כאשר בכל קריאה מופחת מהרשימה האיבר הראשון של אותו מחזור, עד שמסתיים הטיפול בכל אחד מאיברי הרשימה, ו-/זוופפת: הופכת לרשימה ריקה 'ך]'. יש לדעת כי בלוגו כמו במתמטיקה, רשימה, גם אם אין בה אף לא איבר אחד, עדיין תקרא רשימה. מאחר ש-1851ע לא יכולה לבחור איבר מרשימה שאין בה איברים, מתערבת מערכת התוכנה של לוגו ועוצרת את הביצוע, ומציגה את ההודעה המתייחסת לרשימה ריקה. על מנת להמנע מהערות לוגו, נוכל לסיים את ביצוע ההליך בתנאי מסוים. תנאי מתאים להפסקת הביצוע במקרה זה הוא כאשר 1%4אפ8: הופכת לרשימה ריקה: [509] [] = באצמפסת: חך נוסיף אם-כן את משפט התנאי ונקבל הליך המסתיים ללא הערות. א1הפטת: פדא גד סד [פ510] [] = גא1אפתת: סך הא1פעת: צפתנע תק האנתפפת: עם פדא גיד פאם חישוב של מספר איברים ברטימה נדגים שני פתרונות שונים להגדרת פונקציה המחשבת את מספר האיברים אשר נמצאים ברשימה נתונה. דוגמה אחת היא הפונקציה 150481א. בפתרון זה מתוסף בכל מחזור הערך '1' לערך הפונקציה של המחזור הנקרא. הערך הידוע שעליו נסתמך בחישוב הוא '0' (אפס) המציין את מספר האיברים ברשימה . ריקה: [0 פס] [] = 81ת: חך - 161 - נשתמש בערך זה כערך של המחזור האחרון. כלומר, כנקודת מוצא לחישוב כולו. במילים אחרות, ערך המחזור האחרון הוא '0' וערך מחזור ם הוא '1 + (ערך מחזור 1+ם)'. הגדרת ‏ 152281 57: 1ת4ק15א 70 [0 פס] [] = 162: עך 1 שם 401ק5זא + 1 05 פאם בכל פניה רקורסיבית הקלט של 152: הוא '157: עם' של המחזור הקורא. דוגמה אחרת היא הפונקציה 152482 אשר נגדיר להלן. פונקציה זו מוגדרת עם משתנה מונה %:, אשר מקבל בתחילת החישוב ערך '0', ובכל מחזור מתוסף לו '1'. ערכו הסופי של המשתנה א:, המתקבל במחזור האחרון, מועבר למחזור שפנה אליו. המחזור שלפנ*י האחרון מעביר ערך זה למחזור שקדם לו וכך עד להעברתו למחזור הראשון, אשר פולט אותו כערך של הפונקציה 482ק5זא. הגדרת 150482 א: 157: 155282א 70 [א: 05] [] = 67ע: עך (1 + א:) (1517: עם) 2תג1קפזא פס פאם בכל פניה רקורסיבית ערך המשתנה א: גדל באחד. הקלט של הרשימה 51: של המחזור הנקרא הוא רשימת איברי 1581: של המחזור הקורא ללא האיבר הראשון '187: עם'. - 162 - תרג ילים הערה: הפתרון עבור כמה מן התרגילים יכול להיות מורכב מכמה הליכים ו/או מכמה פונקציות. הגדר הליך רקורסיבי המקבל רשימת שמות של תלמידים ומדפיס את המשפט הבא לכל אחד מן התלמידים שברשימה. .1 עשמטא 10 מסעא 15 1% ,שם כתזמת הגדר הליך רקורסיבי המקבל את רשימת חודשי השנה ומדפיס אותם בסדר הפוך, כלומר מן הסוף להתחלה. הגדר הליך רקורסיבי המקבל שתי רשימות: אחת היא רשימת ימי השבוע: [צגפתטה5 ... צהספאסא צבפאש5] השניה - רשימת המספרים הסידוריים: [מצך ... כא2 152] על ההליך להדפיס משפט כדוגמת המשפט הבא עבור לכל אחד מימ:* השבוע, בהתאמה: צהמאסס 15 אמסטא מחך אד צגכ 151 מא הגדר הליך המקבל שם של עיר במשתנה צ017: ורשימת ערי בירה - במשתנה .[040170:. ההליך בודק אם הערך של צ017: נמצא ברשימה הנתונה של ערי הבירה, ומדפיס הודעה בהתאם. הדרכה: השתמש בהוראה הבאה לפתרון הבעיה: : פפתדק > צ017: עך הגדר הליך המקבל רשימת ארצות ומדפיס אותה פעמיים, בשת: עמודות מקבילות. בעמודה אחת יודפסו שמות הארצות לפי סדר הופעתם ברשימה, ובעמודה הימנית הם יודפסו בסדר הפוך, מן האחרון לראשון. רמז: השתמש בשת* רשימות שיש בהן אותם ערכים. - 13 = 6. הגדר פונקציה 81088851 המקבלת רשימה של מספרים חיוב:יים, ומחזירה את הערך הגבוה ביותר המופיע ברשימה. לדוגמה, אם הקלט הוא '[19 23 120 1 57 28]', אז הפלט הוא '120'. הדרכה: הגדר משתנה עזר 1:, כך שההשוואה תיעשה בינו לבין כל אחד מאיבר* הרשימה, ואשר בו ישמר הערך הגדול של כל מחזור. בתחילת הביצוע המשתנה 81: י*קבל ערך '0'. 7. השתמש באחת ההגדרות של 815248 על מנת להגדיר פונקציה 24אא, לחישוב ממוצע של רשימת ציונים כלשהי. 8. הגדר פונקציה אמפא1 המקבלת רשימה של חבר* קבוצה במשחק כדור-סל 5ַ80+ע:, ופולטת את מספרו הסידורי של חבר מסו*ם אטע: כפי שהוא מופיע ברשימה הנתונה. אם אין חבר כזה, על הפונקציה להחזיר את הערך '0'. 9. הגדר פונקציה 84/88 המקבלת רשימת חברים 1581: ומספר א:, ומחזירה את האיבר הנמצא במקום ה-א: ברשימה. מונקציות בדיקה מילה מורכבת מתווים, או שהיא ריקה. למילה אשר איננה ריקה יש תו ראשון ואחריו המשך המילה. ואפשר לציין את התו האחרון שלה ואת חלק המילה של פניו. כאשר נתונה המילה '1₪קק8' כערך של המשתנה פתח:, נקבל: האות '4' = פתא: צפתדק האות 'םש' <--7 פתט: 157 חלק המילה 'מתקק' <--- פתא: עם חלק המילה 'תקקא' <--- עתשח: עם נוכל להגדיר הליך המטפל בתווי המילה בזה אחר ‏ זה באופן = 164 = רקורסיבי. כל מחזור מתייחס לתו הראשון של המילה שנמצאת במשתנה פאש: למשל, על-יד הביטוי 'עתא: עפת1ע'. ערך המשתנה כפתח: של המחזור הבא יהיה 'כתא: עפ' של המחזור הקורא, עד אשר נקבל ב-₪32": מילה ריקה '"' (11טא). נוכל לבדוק אם לפנינו מילה ריקה ולסיים את התהליך. [פ510 ... ] " = פתא: סך כשם שפונקציות הבחירה אינן מקבלות רשימה ריקה כקלט, כן אין הן מקבלות מילה ריקה כקלט. במקרה זה למשל, נקבל עבור הפונקציה שם, את ההערה הבאה: כדי להמנע מהודעת השגיאה כדאי להשתמש בפונקציות בדיקה, ולהמשיך את התכנית בהתאם לתוצאה. הפרדיקט מצדוע פרדיקט זה מקבל קלט כלשהו, כמו רשימה, מילה או מספר (המורכב גם הוא מרצף של תווים), ובודק אם קלט זה הוא "ריק" או שאינו ריק. לכן נוכל לרשום עתשט: קצדקאם עך במקום 0 " = כעתא: עך ובמקום [] = האזחפסת: סד נוכל לרשום באתפטת: קצצסאם קד 11575 טקידרפה‎ הפרדיקט מקבל קלט ובודק אם קלט זה מהווה רש*מה. לדוגמה: עתא: קפ קך = 165 = הפרדיקט פפהסש הפרדיקט מקבל קלט ובודק אם קלט זה מהווה מילה. לדוגמה: עתא: קפתסא עד תרג'לים (המשך) .0 .1 .2 .3 .8 הגדר פונקציה א המחשבת את אורכה של מילה כלשה'. כלומר, יש למצוא את מספר התווים המרכיבים את המילה. הגדר פונקציה א המקבלת שתי מילים, בודקת אם 1פתא: ארוכה יותר מ-8₪822:, ומחזירה הודעה מתאימה. הנחייה: הפונקציה 05 יכולה להשתמש בפונקציה זַדַסא₪ע, שהוגדרה בתרגיל קודם. הגדר הליך המקבל רשימה של מספרים בשבר עשרונ* ומציג אותם בטור, זה תחת זה, עם יישור הנקודה העשרונית. הדרכה: קבע תחילה עמודה, למשל העמודה 11, שבה תופיע הנקודה העשרונית. אם מספר הספרות של החלק השלם הוא 6, יש להדפיס את המספר לאחר הדפסת ‏ 54 רווחים. לכן יש לחשב תחילה כמה רווחים דרוש להדפיס משמאל. הגדר הליך המקבל מספר המורכב מתשע (9) "ספרות לכל היותר, מדפיס אותו ואת סכום ספרותיו. אם אורך הקלט הוא יותר מ-9 תווים, יש להפסיק את החישוב ולתת הודעה כי מספר הספרות לא מתאים. הגדר פונקציה 2051 המקבלת מילה במשתנה 1804א/: ואות אחת במשתנה 01:, ומחזירה את מקום ההופעה הראשון של האות במילה. אם אות זו איננה חלק מן המילה הנתונה, על הפונקציה להחזיר את הערך '0'. - 166 - 5. עפת1ע הינה פונקציה המחזירה את האיבר הראשון של רשימה כלשהי. נסה להגדיר פונקציה פא5₪00 שהפלט שלה יהיה האיבר השני של רשימה כלשה*. 6. הגדר פונקציה 814597 המחזירה את האיבר שלפני האחרון ברשימה כלשה*. 7. בהנחה שלא קיים הפרדיקט פצצקאם, הגדר אותו בעצמך. 8. הגדר פרדיקט 0155א51 הבודק אם קיים רק איבר אחד ברשימה, או אם קיים רק תו אחד במילה. הפונקציה כה₪0 הפונקציה ₪082 מקבלת שתי מילים ומחברת אותן למילה אחת. המבנה הכללי:. מילה2 מילה1 כתסח אם הערך של א: הוא המילה '84', והערך של צ: הוא המילה 'גאגא', אז ערך הביטוי 'צ: א: עתסט' הוא 'גאבאגם'. הערך של א: מתחבר עם הערך של צ: ויוצר מילה אחת בהתאם לסדר שבו הם רשומים. על-כן, ערך הביטוי 'א: ץ: כהסח' הוא 'גַפגאגא'. הפונקציה ת₪0 יכולה לפעול על יותר מאשר שתי מילים, אך לשם כך יש צורך לתחום את כל הביטוי בסוגריים עגולים. המבנה הוא: (מילהם ... מילה2 מילה1 ת00) נתון הביטוי הבא: (3 גאגא" הם" 2 צ: א: 1 ץ: א: פתסא) הערך שלו הוא: 3אאהפ2אבאהםן1רהאהאגם 2 17 = נגדיר פונקציה 3085 המקבלת מילה, ומחזירה אותה בסדר הפוך (כלומר, היפוך סדר התווים המרכיבים אותה). הגדרת פחעת פטת 10 [ " פס] ג/דא: פצדקם פד (מ1דא: םת פתטת) (ג.זדא: 1457) פתסט פס פאם כאשר נרשום ---6 48062" פתטת תק? הפלט יהיה: 04 החישוב נעשה באופן רקורסיבי. כל מחזור מציב את האות האחרונה של הקלט שלו בתחילת הערך המתקבל מתוצאת החישוב של המחזור הנקרא על-ידו: (ה[דא: עם פתטת) (114א: דפג1) פתסט פס 7-4 | התוצאה | הפעולה ן מחזור א' | 2084 | 480" פתטת כ" פתסא | מחזור ב' | 04 || 88" פתטת 0" פחסט | מחזור ג' | 4 || ג" פתטת 8" פתסח | מחזור ד' | 4 | " פתטת ג" פתסט | ו הסימן '"' בלבד מציין מילה ריקה. הערך הידוע, אשר משמש כנקודת מוצא לחישוב התרגיל מתקבל במחזור האחרון, כאשר יש מילה ריקה: [ " 0₪] בדא: פצדקאם עך ניתן להגדיר משתנה /שת:, שערכו בתחילת הביצוע יהיה המילה הריקה '"'. בקריאה לרקורסיה נחבר לסוף המילה עמת: את האות האחרונה של הנתון 114/: השייך לאותו מחזור, ואילו הערך של 104א: יהיה - 168 - 'מדא: שפ'. הביצוע מסתיים כאשר גמדא: הופכת לריקה, ואז מוחזר הערך של עשת:. הגדרת ו | צפת: ה/דא: מפתסעמת 70 [טת: פס] הודא: קצדקאם קך (ה.זזא: 1/97 את: פתסט) (הנדא: ם) מפהמעשטת קס פאם כפי שרואים, המשתנה שתת: של כל מחזור חדש מקבל את ערכו של הביטוי הבא: 8 51 עמת: פפסט כך למעשה משתנה ערכו של /את: ממחזור למחזור, עד שלא נשאר כל תו שהוא ב-ג,11א: ואז כאמור, מחזירה מפתת/חת את הערך של שאת:. בקריאה הראשונה, הערך של 2ג,1דא: הוא '02ם8' ו-עחת: שווה )ע,וטא. בקריאה השניה - ו תהיה 'סםג' ו-שעת: = 'פי. בקריאה השלישית - = 'פה' ו-שתת: = 'ספ'. ברביעית - 4 = '4' ו-ששת: = 'פסע'. בקריאה האחרונה - .זדוא: >= (מעטא) ו-/עת: > 'גתספ'. לסיום - מקבלים את המילה 'פסםג' כשהיא הפוכה: 'בַמ6פ'. הפרדיקט קמתסקקם (קיים בגירסת ךַך 0 מ קפסה ) פרדיקט זה מקבל שתי מילים, ומחזיר ערך אמת אם המילה הראשונה נמצאת לפני המילה השניה, על פי הסדר המילו('*. לדוגמה, אם נרשום ---> אדא" פאס" קעהסקמם מק נקבל: מטמך תרגילים (המשך) 9. הגדר פונקציה אסתתא1)]את המקבלת מילה ובודקת אם התווים מופיעים בה באופן סימטר*, כלומר שקריאתה משמאל לימין תהיה זהה עם קריאתה מימין לשמאל. למשל המילים 'א00א' או 'תמטטוי ממלאות תנא*י זה. הדרכה: בקריאה לרקורסיה ערך המילה יהיה: (8ת1א: םם) עם 0, הגדר הליך המקבל את המילה '40424084ַת2' ומדפיס אותה כשבכל שורה מופחת תו אחד, עד לתו האחרון שנשאר. לדוגמה: 0 תת את 4 1. נסה להגדיר הליך המקבל את המילה 'גתמַַתגסַַתּה' (כמו בשאלה הקודמת), ומדפיס בשורה הראשונה את האות האחרונה '8', בשורה השניה את 2 האותיות האחרונות 'גת', בשורה השלישית את 3 האותיות האחרונות 'גַת8', וכן הלאה עד שבשורה האחרונה מודפסת כל המילה בשלימותה. תו יס נקוד 5011 תו יכול להיות אחת האותיות (8...2 2), אחת הספרות (1...9 6), אחד הסימנים של 4 פעולות החשבון, פעולות *חס, סימני פסוק, או כל סימן מוגדר אחר (6 6...) וגם תו-רווח ' '. - 170 - המחשב מזהה כל תו על פי קוד מסוים, שהוא הערך המספר* שלו. השימוש המקובל במחשבים אישיים הוא על פי קוד 45011, אשר פותח בארה"ב, והוא מציין בראשי תיבות את הבי*טו'י: 1 - סששתהת6ע60ת1 תסצסה8שעס%ת1 ע0ס+ 0066 6826ת508 ת108עסחה הפונקציה 45011 פונקציה זו, הנקראת על שם הקוד עצמו, מקבלת ערך שהוא מילה, ומחזירה את ערך הקוד של התו הראשון המופיע במילה. אם נרשום ---> 4" 5011 תק? או נכתוב ---6 :טג" 45011 תס? נקבל בשני המקרים את הקוד של האות '1': 65 מספר זה הוא הערך של האות '4' בטבלת קוד 450611. '8' הינה האות הראשונה באותיות האלף-בית האנגלי, ומכיון שאותיות אלו קיבלו את ערכי הקוד על פי הסדר שלהם, נמצא שערך הקוד של האות '8' הוא 6, של האות '0' הוא 67 וכן הלאה. הפונקציה 0848 הפונקציה 0848 הפוכה לפונקציה 85011. היא מקבלת ערך מספרי הנע בין 0 ל-255, ומחזירה את התו המיוצג על-ידי אותו מספר. כאשר (רשום 6-77 65 הגס תק? תודפס האות '4' שהיא בעלת אותו קוד: 4 - 171 - הערות בתכנ ית בשפות תכנות שונות קיימת דרך לציין הערות בגוף התכנית. המחשב אינו מתייחס אליהן, ואינו מקבל אותן כהוראות שעליו לבצע. הן מיודות לנוחות המתכנת בלבד. בלוגו לא מוגדרת מילה המאפשרת כתיבת הערה (א%מהשסת). נסה להגדיר בעצמך הליך אא אשר מקבל רשימה כלשהי, כאשר מתבצעת קריאה להליך, המחשב אינו מתייחס לתוכן הרשימה, ולכן אינו מבצע כל פעולה שהיא על הרשימה הזו. לדוגמה, נכתוב הערה בתכנית ---% [₪ש8ע8ס? עַם 18 5נתך7] אשת תרג''לים (המשך) 2. הגדר פונקציה 041א00 המקבלת רשימת מ*לים, (אשר *כולות להכיל ‏ תו אחד או *ותר), ומחזירה מילה המורכבת מהאיברים שברשימה. תוכל לכלול בהגדרה הערה באמצעות ההליך אמ שהגדרת, כדי לציין את תפקיד הפונקציה, ואת שלבי הפתרון. 3. כתוב הליך המקבל רשימת שמות, ומדפיס את האות הראשונה של כל שם (כלומר, של כל איבר). הדרכה: (8אזהפטת: 7פת1ק) צפתדע תהק 1. כתוב תכנית המקבלת רשימת שמות, ומדפיסה רק את אלה, אשר האות הראשונה שלהם היא מ-'' ואילך באלף-בית הלטי(נ'. - 172 - .5 .6 .7 לקורס שחיה מתקבלים ילדים שגילם אינו נמוך משמונה שנים. השיעורים מתקיימים בשלושה ימים בשבוע: יום א' עבור ילדים שהאות הראשונה בשם שלהם היא מ-4 עד 1, יוסם ג' עבור ילדים שהאות הראשונה בשם שלהם היא מ-1 עד ש, יום ה' עבור ילדים שהאות הראשונה בשם שלהם היא מ-6 עד 2. כתוב תכנית המקבלת רשימה ובה שמות הילדים וגיליהם לפי הסדר הבא: [גילת שםת ‏ ... ... גיל2 שם2 גיל1 שם1] התכנית תציג על המסך אם הילד התקבל או לא, ואם כן - באיזה יום הוא ילמד. הדרכה: ניתן להתייחס לאיבר השני ברשימה על-ידי הביטוי הבא: (4א1הפמת: עם) צפתדק האיברים הנותרים לטיפול :*היו: (בא1הפמת: עם) קעם הגדר פרדיקט פזמאקד המקבל שני שמות 1שאגא: ו-2מאגא: ובודק אם 1שאגאא: נמצא לפני 2מאגא: על פי הסדר המילוני. אם גירסת לוגו שברשותך כוללת את הפונקציה סםת0ע88, אל תשתמש בה. כתוב פונקציה המקבלת רשימת שמות, מוצאת את השם הגדול ביותר על פי הסדר המילוני ומחזירה אותו. - 173 - פרק 12 עיבוד רשימות בטיעור הקודם למדנו על פונקציות הבחירה המשמשות לטיפול ברשימות ובמילים. הסברנו כיצד הן פועלות, מהו הקלט הדרוש להן ומהו הפלט שניתן להפיק מהן. הכרנו גם את הפונקציה פתס₪ המרכיבה מִילה על- ידי חיבור של מספר מילים למילה אחת. נקציות הרכנה ההוראה 5₪ (מ6ַאמִז1ַאמ9) , הינה אחת הפונקציות המשמשות להרכבת רשימות. היא מאחדת דברים לרשימה אחת, ולכן אפשר באמצעותה לאחד לרשימה אחת נתונים קבועים, תוכן של משתנים ותוכן של רשימות. נלמד עתה פונקציות נוספות המרכיבות רשימות. 157 היצקנופה‎ המבנה הכללי: דבר ‏ 11757 או: דבר2 דבר 1‏ 115% הפונקציה 1.1151 מקבלת דבר אחד או שני דברים ושמה אותם באריזה אחת, דהיינו, ברשימה אחת. לדוגמה, אם למשתנה א: יש הערך '57' ולמשתנה 8: יש הערך '80'. ערך הב*טן* ים: 2צא" 1197' הוא '[8480 2צא]'. במקרה זה הפונקציה 57 בנתה רשימה המכילה את הנתון '2צא' והערך של :. 2 1% - ערך הביטוי יהיה שווה, אם במקום 1157 נרשום: '4): 2צא" מפ' אבל, כאשר אחד הדברים הוא רשימה, כמו בביסוי הבא: א: [= 17 + 40] צפדם ערכו הוא: [7פ [= 17 + 80]] רשימת הקלט המכילה תרגיל חשבונ'י, מופיעה ברשימת הפלט כפי שהיא, כדבר נפרד. נמצא, שמספר הדברים ש-1191 מקבלת, הוא מספר האיברים שיהיו בתוך הרשימה שהיא בונה. לדוגמה, הפונקציה 1151 קיבלה 2 דברים: [= 17 + 40] : - דבר1 - דבר2 ברשימת הפלט נקבל 2 דברים: [= 17 + 80] הערך של א: - איבר1 - איבר2 לא כך, אם (שתמש ב-58₪: א: [= 17 + 80] 58 במקרה זה, ערך הביטוי יהיה: [97 = 17 + 88] כאן מאחדת 58 לרשימה אחת את האיברים המופיעים ברשימת התרגיל החשבו(: יחד עם הער של א:. מספר האיברים המתקבלים ברשימה החדשה הוא כמספר איבר*י הרשימה המופיעה כקלט, ועוד נתון אחד א:. הפונקציה 58 קיבלה 2 דברים: [= 17 + 80] אנ - דבר1 - דבר2 - 175 - מספר האיברים, שהפונקציה 5 החזירהָ בתוך הרשימה, ‏ שונה מאשר במקרה הקודם: - | איבר1 = '80' - | איבר2 = !'+' - איבר3 = '17' - | איבר4 = '=' - | איבר5 = '57' כזכור, דבר יכול להיות תו, מילה או רשימה. לכן, גם איבר של רשימה יכול להיות תו, מילה או רשימה. ו יכולה לקבל יותר משני* דברים ולבנות אותם ברשימה אחת. לשם כך יש לתחום את כל המשפט בסוגריים עגולים: לדוגמה, ערך הביטו* (2צא" א: [אא אוא] [8 :א קמכ] 8: 181) הוא: : [?צא 57 [אא אעא] [8 :68 אמפ] 480] שים לב להבדל בין פלט זה לבין הפלט המתקבל באמצעות 5פ. הערך של הביטוי, (לצא" א: [אא אזא] [8 681 עמפ] 8: 55) הוא: [2צא 57 אא אזא 8 681 עפפ 80ג] הפונקציה עטקת (שטקלפענת+ הפונקציה עחעפעת מקבלת שני קלטים, שהראשון בהם הוא דבר כלשהו והשני הוא רשימה, ומציבה את הדבר בתחילת הרשימה. כאשר (נרשום ---> [1987 צעטנ] 17 עעפק 5₪08? נקבל: [1987 צעטנ 17] - 176 = דוגמה נוספת ---> רא [333] [22 1]] [000 םם 8] צטפת אסמפ? נקבל את הרשימה הבאה: [08 [333] [22 1] [000 מם ה]] יש לשים לב לכך שהאיברים ברשימת הקלט הם: ווהי *[133י. '291 גזי ברשימת הפלט התוסף להם האיבר '[000 28 8]' והוצב בראש. אם היינו משתמשים ב-58 במקום ב-עשפע, היינו מקבלים פלט זהה בדוגמה הראשונה, אך בדוגמה השניה היינו מקבלים את הרשימה הבאה: [3 [333] [22 1] 000 פם ה] הפונקציה 55 איחדה את איברי הרשימה '[000 מם ]' יחד עם איבר: רשימת הקלט השניה לרשימה אחת. הפונקציה 10201 (85%0017) הפונקציה 1201 מקבלת שני קלטים, שהראשון הוא דבר והשנ' - רשימה, ומציבה את הדבר בסוף הרשימה. דוגמה ---> [[2] ן[1] [2 1]] [] דט 5₪408פ? הפלט יהיה: [נם [2] [1] [2 1]] הרשימה הריקה הופיעה כאיבר אחרון ברשימת הפלט. נגדיר פונקציה המקבלת שני קלטים: רשימת שמות של בנים 9צ80:, ורשימה אחרת 01805: ובה שמות של בנות. על הפונקציה לבנות רשימות של זוגות, כך שהאיבר הראשון בכל רשימה כזו יהיה שם בן, והאיבר השני יהיה שם של בת. על הפונקציה להתחזיר רשימה אחת שמכילה את כל הרשימות שהיא בנתה. = 177 - הגדרת 000708 5 80%98: 000208 720 [[] 05] 01818: סצדקאם 5צ80: קעצקאם הס פך. (01815: 1פת1ע 6צ80: צפתדע 51ד1) צטספע 05 (01915: 29 5ע20: עם ₪תקט00) פאם כאשר נרשום ---> [דצשת גד הב3ס] [ט210 תתא אהכ] שתקטסס הק? נקבל את הפלט הבא: [צטת ע21] [תגד תזא] [בַת0 אהפ] הסבר: בתרגיל זה יש לבנות רשימה לכל צמד, ולכן השתמשנו בביטו' - (01015: דפת1ע 5צ20: עפתדע 157) במחזור הראשון, ערך הביטוי הוא [084 אה8כפ]. ערך זה מוצב באמצעות הפונקציה עפע בראש רשימת הפלט של המחזור הבא, כאילו רשמנו: (01815: תם 5צ80: עמ מתקטסס) [גת0 אגכע] צטקע פס עתה עובר הביצוע למחזור שני, כשהקלט הוא: [2 פתא] עבור 5: [צשת גת | עבור | 0180/5: הפונקציה בונה רשימה לצמד [140 תזא] ומציבה אותה בתחילת רשימת הפלט של המחזור השלישי. וזה, כאילו רשמנו: (01015: עם 5צ80: עם מתסט0ס) ‏ [73 הדא] צטפע 05 במחזור שלאחר מכן:- הערך '[/21]' עובר ל-80%5: הערך '[צעת3]' עובר ל- 018865: במחזור זה מוצבת רשימת הצמד [עשת /21] בתחילת רשימת הפלט של = 1|8 = המחזור האחרון. ערך ‏ הפלט של המחזור האחרון הוא הרשימה הריקה '[]', אשר משמשת כנקודת מוצא לחישוב כולו. ערך זה מוחזר כאשר אחת משתי הרשימות הופכת לריקה: [1] 0] 61315: מצדסום 5צ0ם: קצדסאם הס שד ואז כאילו רשמנו - ך] [צטת ט21] צטפע 05 תוצאת הביטוי '[[עשת /21]]', היא רשימת הפלט של המחזור השלישי. נציב ערך זה במקום המתאים בביטוי, שעל המחזור השני לחשב: [[צטת טד2]] [1גד הדא] צטפע פס התוצאה תהיה: [[צטת צ21] [גד תנא]] שוב נציב את ערך התוצאה לביטוי שיש לחשב על-ידי המחזור הראשון: [[צטת ע21] [מגד הדא]] [084 אהפ] שטפת פס והפלט יהיה: [[צטת ש21] [;זגד תדא] [גתס אגפ]] רשימה זו היא התוצאה הסופית, או ערך הפונקציה. תרגילים 1. הגדר פונקציה המקבלת רשימת צבעים, ומחזירה רשימה שבה האיבר הראשון של הקלט יהיה האיבר האחרון של הפלט. אם הקלט הוא - [עפת אמפתס מטתם ש10ומצ] הפלט יהיה - [שס11טע סשת אממתס מטום] 2. הגדר פונקציה ₪4:004 המקבלת רשימת נתונים, ומחזירה רשימה שבה נתונים אלה מסודרים בסדר הפוך, כלומר, האיבר הראשון יהיה האחרון, האיבר השני *היה האיבר שָלפנ* האחרון והאחרון יהיה הראשון. - 179 - הגדר פונקציה א80זק המקבלת מילה 814: כקלט, ומחזירה רשימה שאיבריה הם התווים המרכיבים את המילה. לדוגמה, אם הקלט הוא: '01101', הפלט יהיה: '[1 0 2 ץ 0]'. במבחן על-פה הספיק המורה לבחון רק 5 תלמידים. הגדר פונקציה המקבלת את רשימת כל תלמידי הכתה ומחזירה כפלט את רשימת התלמידים שעדיין לא נבחנו. רשימה זו תכיל את שמות התלמידים המופיעים מהמקום השישי ואילך. הגדר פונקציה :28 המקבלת 1פז]:, שהיא רשימת מועמדים לתפקיד כלשהו, ושַם של מועמד 8אגא: שנבחר לתפקיד. הפונקציה מחזירה את רשימת המועמדים שלא נבחרו. הגדר פונקציה 08א614 המקבלת רשימה של דיירי בניין אתכ: ומחזירה רשימה חדשה, בה מוחלף שמו של דייר שעזב א0:2: בשמו של הדייר החדש אאטא:. לכיתה מסוימת הצטרף תלמיד חדש כט1פשמא:. הגדר פונקציה 1התפא1, שמקבלת רשימת התלמידים 15א8פ510: כשהיא מסודרת על פיי האלף-בית, ופולטת רשימה חדשה, כאשר שמו של התלמיד החדש מופיע במקום המתאים. מסופר על 21 מורדים בימי המרד הגדול ברומאים, אשר החליטו להתאבד זה אחר זה. הם ישבו במעגל במקומות ממוספרים, וקבעו ביניהם להתחיל בספירת הנוכחים וכל אדם שביעי יתאבד בתורו. הספירה הראשונה התחילה מזה שנקבע כיושב במקום הראשון. הספירה הבאה התחילה מזה היושב אחרי המתאבד האחרון (הספירה מת' יחסת רק לנותרים בח*ים). כתוב פונקציה אשר תמצא את מקומו של זה שניצל ממוות. הצג זאת כפלט עם הודעת הסבר. קבוצות קבוצה (58%6) מכילה רשימה של איברים. לקבוצה תכונות שונות, אשר נחזור עליהן בקצרה: א. אין בקבוצה חזרות, כל איבר מופיע בה פעם אחת בלבד (אך לא כך ברשימה, שבה איבר יכול להופיע פעמים אחדות). נתונות שת*י רשימות: 141 - [ 15 12 13 12 11 ] ו-12 - [ 15 14 13 12 11 ] נבדוק אם אלו הן קבוצות: - 11 אינה קבוצה, האיבר שערכו 12 נמצא בה פעמיים. - | 12 כן מהווה קבוצה. ב. אין חשיבות לסדר שבו רשומים איבר* הקבוצה. לדוגמה, את קבוצת המספרים הזוגיים מ-1 עד 10, ניתן ל*יצג על-ידי: [10 8 6 5 2] גם על-:ד*: [2 4 6 8 10] וגם על-ידי כל רשימה אחרת, המכילה את אותם הערכים. ג. קבוצה שאין בה אף לא איבר אחד היא קבוצה ריקה (566 ע6קשת). בדיקת שייכות של איבר לרשימה בתרגיל 4' שבפרק הקודם צריך היה להגדיר הליך, הבודק אם העיר צעס: מופיעה כאחד האיברים של הרשימה ‏ 62118:. נלמד עתה את הפונקציה שניתן באמצעותה לפתור תרגילים מן הסוג הזה. - 181 - הפרדיקט קתממאחן הפרדיקט סתפמוטוא מקבל שני קלטים: איבר ורשימה. הפלט הוא 'אמת' אם איבר זה שייך לרשימת הקלט, ואם אינו שייך - הפלט הוא 'שקר'. המבנה הכללי: רשימה דבר תממונם? לדוגמה, אם נרשום ---6 [צעט שסם דתט 61] דע" פתממאטא הק? יוצג על המסך: ₪ עוד דוגמה ---6 9011 5] [[87] 3] 4 2] [[87] 3] פתממאמא הק? התשובה היא: מטתיד שים לב: בדוגמה השניה האיברים של רשימת הקלט 1.151 הם: ,925 8 ב. '8', ג. | '[[87] 3]'. ד. '[90 5]'. על-כן, האיבר ("דבר") השווה ל-'[[87] 3]' כן שייך לרשימה. בדיקת יחס בין קבוצות לבד מבדיקת השייכות של איבר מסוים לקבוצה נתונה, קיימות במתמטיקה פעולות לביצוע בדיקות יחס בין קבוצות. כאשר נתונות שתי קבוצות 4 ו-8, נוכל לומר אם הן שוות, אם אחת חלקית לשניה, או שהן קבוצות זרות. קיימות פעולות אלגבריות לביצוע חישובים על קבוצות, כמו למשל א*חוד, חיתוך והפרש בין קבוצות. פעולות אלו אינן מוגדרות בלוגו, אך יש באפשרותנו להגדירן. נביא לדוגמה הגדרה של הפונקציה א10אט, לאיחוד שתי קבוצות 2 ו-8 (8 ט 8). אסזאט מקבלת עבור שני המשתנים : ו-8: שת* רשימות שהן קבוצות, ומחזירה את קבוצת כל האיברים הנמצאים ב-82, ב-8 או בשתיהן גם *חד. - 182 - הגדרת א10אם 8 8: אסנאט 70 [8: פ0] 8: קצדקאם עך 8: (4: לפחדק) קתתמאמא צפמד [8: 8: 88 אסעאט 05] עאד [(פ8: א8: עם א10אטש) (8: צפתדע) צעפע פס] פסדך פא כאשר נרשום ---6 [7 6 23 33] [17 7 23] אסצאט מק? נקבל את התוצאה הבאה: 7 23 33 17 הסבר: כנקודת מוצא, הפלט של המחזור האחרון יכלול את כל האיברים הנמצאים בקבוצה 8:, וזאת כאשר לא נמצא אף איבר בקבוצה 4: - [פ: 05] 8: סעד7קוש קד על פי הדוגמה הזו, הפלט של המחזור האחרון הוא: [7 6 23 33]. הפונקציה בודקת בכל מחזור, אם האיבר הראשון של הקבוצה 2: שייך לקבוצה 8: - 8: (4: דפתדק) פתממאטא לסמד - | אם כן, אין מציבים איבר זה ברשימת הפלט, כדי למנוע הופעה חוזרת של אותו איבר. הביצוע עובר למחזור חדש לבדיקת האיבר הבא בתור בקבוצה 4: - ם: 4: עם אסזאט פס - אם האיבר אינו שייך לקבוצה 8:, מציבה אסזאט איבר ‏ זה בראש תוצאת הפלט המתקבלת מהמחזור שנקרא על-ידי המחזור הנוכח'י. (8: 8: עם אסדצאטס) (4: לפתדקע) דטסעע פס = 13 2 הביצוע מסתיים כאשר הרשימה 8: הופכת לרשימה ריקה. תרגילים (המשך) 9 .90 .1 .2 הגדר פונקציה 58 המקבלת רשימת איברים, אשר יכולות להיות בה חזרות. הפונקציה מחזירה את רשימת כל האיברים כקבוצה, דהיינו ללא חזרות. הדרכה: אם האיבר הראשון לא מופיע ברשימת שאר האיברים, יש להציב איבר זה ברשימת הפלט. הגדר פרדיקט 5812 הבודק אם הרשימה 157: מהווה קבוצה. הגדר פרדיקט 09812 הבודק אם שת* הקבוצות 121: ו-22: שוות. הערה: שתי קבוצות הן שוות, כאשר כל אחת מהן היא חלקית לשניה. זכור, ‏ כ שתי קבוצות הן זהות גם אם א*בריהן אינם מופיעים באותו סדר. שתי כיתות לומדות מקצוע מסוים, כל אחת עם מורה אחר. הכיתה הראשונה למדה בסמסטר הראשון קבוצה של ם נושאים, והכיתה השניה הספיקה ללמוד באותו פרק זמן קבוצה של ₪ נושאים (ם יכול להיות שונה מ-₪). אפשר שלא כל הנושאים בקבוצה האחת יהיו זהים (חופפים) לאלה שבקבוצה השניה. א. כתוב פונקציה המקבלת שתי קבוצות: קבוצת הנושאים של הכיתה הראשונה 1251:, וקבוצת הנושאים של הכיתה השניה 8. היא מחזירה רשימה, שבה קבוצת הנושאים הנמצאים רק ב-1514: אך אינם ב-1818:. לדוגמה, 14פ: ---> | [05₪7א 5מפ0סא 058%4א 5₪3סא 1מפסא] ו-1918: ---6 [56סא 5 2מפס0א 581סא] - 184 - הפלט *היה --> [05₪7א 05₪4א 553סא] ב. כתוב פונקציה המקבלת שתי קבוצות כמו ומחזירה בתרגיל 12א' רשימה של קבוצת הנושאים החופפים. כלומר, הנושאים הנמצאים גם ב-1514: וגם ב-1518:, מהן . ולא רק באחת על פי הדוגמה הקודמת, הפלט יהיה: [55פ0א 0581א] ג. כתוב פונקציה המקבלת שת*י קבוצות כמו בתרגיל 12א', ומחזירה רשימה של קבוצת הנושאים הנמצאים בכל אחת מהקבוצות 151: ו-12918: אך אינם חופפים. כלומר, נקבל רשימה של כל הנושאים הרשומים רק ב-514/: יחד עם הנושאים הרשומים רק ב-12515:. לפי הדוגמה נקבל: [05₪7א 0586א 05₪4א 0583סא 0582סא] * * * * * יצירת ושימות הפונקציה 18ע5128.4 משמשת ליצירת רשימה של אשא: האיברים הראשוניים מסידרת פיבונצ'' (נססתסמ1ץ). פונקציה זו משתמשת בפונקציה 18ע, שהוגדרה באחד הפרקים הקודמים, על מנת שזו האחרונה תחשב לה את האיבר ה-א: בסידרה. הגדרת 91084718 אטא: 8זעגתת51 70 [[] ת0] 1 > אטא: אד (1 - אעטא: פנעגתפ51) (אטא: מדת) צטפת פס פא הפונקציה 842018כ512 מקבלת קלט שהוא ערך בודד, ומחזירה פלט שהוא רשימה. - 15 0 כאשר (רשום --- 7 8ַ1עגת512 א30פ? נקבל רשימה ובה 7 איברים ראשונים של הסידרה: [13 8 5 3 2 1 1] בכל מחזור, הפונקציה מדקתת5 משתמשת בהוראה עק 1 כדי להציב בסוף ההוראות של רשימת הפלט של המחזור הבא ('1 - אטא: פ1תגתכ51'), את האיבר ה-א: של הסידרה ('אטא: 8ד1ע'), כערך התחלת* לחישוב. הפונקציה מחזירה את הרשימה הריקה '[]' עבור מספר איברים הקטן מ-1: [[] פ0] 1 > אטא: קד תרג''לים (המשך) 3. הגדר פונקציה לבניית רשימה בת א: איברים של סידרת מספרים, שבה ההפרשים מהווים סידרה של המספרים האי-הזוגיים הטבע'ים. כלומר, אם האיבר הראשון בסידרה המקורית הוא הנתון ‏ א:, האיבר השני הוא 1+א:, האיבר השלישי שווה לאיבר השני + 3, האיבר הרביעי שווה לאיבר השלישי + 5, וכן הלאה. 84 נתונה הפונקציה 1]- א - 2א > צ הגדר פונקציה המחזירה רשימה של זוגות הערכים השלמים א ו-1, עבור ערכי א בין (3-) לבין (5%), בהפרשים של 1. סה"כ תקבל 8 איברים המופיעים כרשימות. 5. לפניך 7 האיברים הראשונים של סידרת המספרים הטבעיים ת50:. וש ,35 200 1% 12 ,7 3 ,1 ההפרשים של 528: מהווים אף הם סידרה של מספרים: 3% 9 8% ,6 ,5 2 ,2 כתוצאה, איחוד של שתי סדרות אלה מהווה את קבוצת המספרים הטבעיים (קבוצה, כלומר שכל איבר בה מופיע פעם אחת בלבד). - 186 - הגדר פונקציה לחישוב 100 האיברים הראשונים של הכ5:. 6. הגדר פונקציה לבניית רשימה של 819: מספרים אקראיים, בתחום של (1...99). 7. הגדר פונקציה הבונה מילה בת א: אותיות הנבחרות באופן אקראי. רימה ממויינת כאשר נתונה רשימה של נתונים בעלי תכונה משותפת, כמו רשימת רחובותיה של עיר, רשימת פרחי-בר, או רשימת תאריכים היסטוריים, נמצא שנתונים אלה מופיעים לפי סדר מסוים. על פי סדר זה ניתן לקבוע איזה נתון מבין שני נתונים בא קודם. רשימה כזו נקראת רשטימה ממויינת. בדרך כלל בונים את הרשימה תוך כדי קליטת נתונים ללא סדר כלשהו ואחר-כך ממיינים אותה לפי סדר רצוי. מבחתינים במיון על 5 סדר עולה, שבו כל איבר קטן יותר מזה הבא אחריו, ומיון בסדר יורד שבו האיבר הגדול נמצא לפני האיבר הקטן ממנו. נגדיר להלן תכנית למיון רשימת נתונים מספריים לפי סדר עולה. התכנית מורכבת משתי פונקציות: 5081 ו-0א50011. הפונקציה 5081 גורמת לכך שהאיבר בעל הערך הגדול ביותר יימצא בסוף הרשימה. הפונקציה 68א50811 מציבה בתהליך רקורסיבי את האיבר המקסימל: הזה, שחושב על-ידי 5081, בסוף רשימת הפלט של שאר האיברים של המחזורים הבאים. = 107 - הגדרת 5081 2: 507 70 [ע: 05] 2: עם פצדקום עך ע: עם צפתדק > 2: עפתדע עסמך [((2: 8) 5087) (ם: לפתדע) ספת פ0ס] צעד [ך((ע: שם עם 1: צפתדק לשקע) 507) (ם: עם לפתנע) עספע פס] שעעך פאם כאשר נרשום ---> [38 6 27 12 480 35] 5081 5808? נקבל את הפלט הבא: [30 38 6 27 12 35] הפלט הוא רשימה, שבה האיבר בעל הערך הגדול ביותר מוצב בסופה. הסבר: בכל מחזור מתבצעת השוואה בין שנ* נתונים - (ע: עם) דפתדק > ם: צפהדע צפטך לכן, הביצוע צריך להסתיים כאשר ישאר רק איבר אחד, והוא ישמש כנקודת מוצא לערך התחלתי לחישוב רשימת הפלט. [1: 08] 2: סם קצנקאם קד את המספר הקטן מבין שני הנתונים שהושוו, יש להציב בראש רשימת הפלט של המחזור הבא. בקריאה לרקורסיה יש לבצע את החישוב על שאר האיברים, פרט לזה שכבר הוצב בפלט. כלומר, - אם האיבר הראשון הוא שהוצב, אז 12: יקבל את הערך 'ע: שפ'. - | אם האיבר השני הוא שהוצב, אז 1: יקבל את כל שאר האיברים פרט לשני. לכן, יש לדאוג לכך שהאיבר הראשון יהיה כלול ברשימת קלט זו. - 188 - נציג תיאור של הקלט והפלט בכל מחזור: הפלטי הפקודה מח' א: [80 38 6 7 12 35] <= [38 6 271 12 0 1 35 עשסק מח' ב: [80 38 6 27 12] ל= | [38 6 27 20] 5081 12 צססק מח' ג: [80 38 6 27] <= | [38 6 20] 5081 27 צססק מח' ד: [80 38 6] <= | [38 80] 9087 6 שטספק מח' ה: [40 38] <= | [20] 5081 38 שטסק במחזור האחרון הקלט הוא איבר אחד, אשר מוחזר כפלט = [80]. כפי שניתן לראות, הפלט של מחזור א' הוא למעשה הפלט המוחזר מביצוע הפונקציה 5081. עדיין אין זו התשובה שלה אנו מצפים. על- כן, יש להפעיל פונקציה נוספת 06א50811, אשר תגרום למיון של כל הרשימה כנדרש. הגדרת 0א50871 11 6אד50 סיד [181: ק0] 182: עם סצדקום עך (197: 5081 8 0א50821) (187: 5001 צפה1) עטק קס סט כאשר נרשום ---> [38 6 27 12 20 35] 6א50011 מק נקבל את הרשימה ממויינת: 0 38 35 27 12 6 הטבר: בכל מחזור, הפונקציה 6א5071 מפעילה את ההוראה דטסן - | כדי להציב בסוף רשימת הפלט של המחזור הנקרא: 57: 5081 עם 6א501 - | את האיבר האחרון של רשימת הפלט של הפונקציה 508₪1: 7פן: 5081 14571 ערך הביטוי ‏ '1257: 907 0' שבקריאה הרקורסיבית משמש קלט עבור 1: של המחזור הנקרא. = 1-9 - אם נציב את הערך של '0/87: 5091' במקום הביטו* עצמו, נקבל את המשפט הבא עבור המחזור הראשון: יש 05 [30 38 6 27 12 35] 1857 [40 38 6 27 12 35] 85 0א50811 הערך של [30 38 6 27 12 35] 1451 הוא '80', והוא יוצב בסוף התוצאה של המחזור הבא. הערך של [406 38 6 27 12 35] 80 שווה ל-'[38 6 27 12 35]', והוא ישמש ערך ל-181: של המחזור השני. במחזור השניי כאילו רשמנו: [38 6 27 12 35] 60אזידת50 [38 6 27 12 35] 1457 107 05 בשלישי: | [35 6 27 12] פ 0א50871 [35 6 27 12] 157 עשפ פס ולאחריו: [27 6 12] 80 509110 [27 6 12] 1482 עטק פס ובאחרון : [12 6] 85 6א509011 [12 6] 1452 צטק1 פס כמובן, שאין טעם לבצע את 5087 כאשר הרשימה היא בת איבר אחד, ולכן תנאי הסיום הוא: [ד19: 05] 157: עם פצדקאם עך וכך, משמשת הרשימה [6] כערך התחלת* לחישוב הפונקציה 8א50811. ניתן לראות שבמשפט הפלט ב-0א50811, מתבצעת הפונקציה 5081 פעמיים. אם נצמצם את מספר הקריאות לפעם אחת בלבד, נחסוך בזמן מחשב. ניתן לעשות זאת, אם נקשור את ערך הפונקציה למשתנה שישמש קלט עבור תת-פונקציה 581, שבה יחושב משפט הפלט הזה. נשנה אם-כן את 6א50811 בהתאם: 17: 01א5071 70 [151: 05] 1651: עם פצדקאם עך 05 57 )50817 :151( פאם - 190 - כעת נגדיר את תת-הפונקציה 537: 2 5 70 (2: 80 01א50811) (2: 1481) לטק פס פאט 1 "פונה ‏ ל-זַה5, כאשר ‏ 12: מקבל את ערך הפלט של 'ז151: 5081'. וכך, הפונקציה 5081 מתבצעת פעם אחת בכל מחזור. במשפט הפלט ב-581 מתבצע החישוב על ערך המשתנה 1:, ומתבצעת הקריאה הרקורסיבית. רקורסיה מסוג זה, שבה פונקציה אחת קוראת לשניה, והשניה פונה לראשונה, היא רקורסיה עקיפה. באחד התרגילים בשיעור קודם היה צריך להגדיר פונקציה תמטגה, המקבלת שני קלטים, מספר א: ורשימה 181:, ומחזירה כפלט את האיבר המופיע במקום ה-א: ברשימה 187:. הפונקציה 178%, אשר קיימת בלוגו משרתת מטרה זו. הפונקציה ‏ אמדך % מפמחזירה את האיבר המופיע במקום ה-א: ברשימת הקלט. המספר '1' מצביע על האיבר הראשון ברשימה, '2' - על האיבר השני, וכן הלאה. המבנה הכללי: רשטימה מספר אטדדך כאשר נרשום ---> [צגא תקג תבהא מעת אהד] 4 אמצד תק? נקבל: ג - 191 - אם הערך של א: גדול ממספר איבר* הרשימה, תופיע ההודעה הבאה: ב-1000 18% וב-11 10060 ₪]קק8 הפונקציה 178% פועלת גם על מילה. היא מחזירה את התו המופיע במקום ה-א:. לדוגמה --%7 שטשצטמם" 3 אמעד הק? הפלט יהיה: 4 באחד התרגילים היה צריך להגדיר פונקציה 15248/, המחשבת את מספר האיברים המופיעים ברשימה נתונה. הפונקציה %א000, אשר נתונה בלוגו מבצעת פעולה זו. הפונקציה ז%א000 זא600 מקבלת רשימה כקלט, ומחזירה כפלט את מספר האיברים הנמצאים ברשימה זו. כאשר נרשום ---% [3 אא [2 1] [[פ] 6 8] 4] צאטסס הק? נקבל את הפלט הבא ---% 5 ב-10060 188 וב-11 10060 סק פועלת פונקציה זו גם על מילה. היא מחזירה את מספר התווים המרכיבים את המילה. אם נרשום ---% צזימתק" עאש0ס תק? נקבל: 6 חיפוץ באחד התרגילים הקודמים היה עלינו להגדיר פונקציה אמפא1 לחיפוש איבר מסוים ברשימה נתונה. אם הא*בר נמצא, הפונקציה מחזירה את מספרו הסידורי ברשימה, ואם הוא לא מופיע - הפונקציה מחזירה את הערך אפס. - 192 - 1 בעזרת הפונקציה סהמפאמא, ניתן לבדוק אם איבר כלשהו נמצא ברשימה נתונה ולהחליט אם להמשיך בעיבוד, או להפסיק. חיפוש של איבר ברשימה יכול להתבצע בדרך הפשוטה של שיטת החיפוש הלינארי. בחיפוש זה מתחילים באיבר הראשון ברשימה, עוברים מאיבר לאיבר, עד למציאת האיבר הרצוי. עבור רשימה בת אשא: איברים, פעולת ההשוואה מתבצעת במקרה המקסימלי אשא: פעמים. כאשר נתונה רשימה לא ממויינת, אין דרך אחרת, אלא לעבור מאיבר לאיבר. לא כן, כאשר הרשימה היא ממויינת, כאן עדיף להשתמש בשיטה של חיפוש בינארי. תיווכח לדעת, שלעתים כדאי מטעמי חסכון בזמן עיבוד, למיין את הרשימה תחילה ואח"כ לערוך את החיפוש. האלגוריתם של חיפוש בינר'י: א. חשב את מספרו הסידור* של האיבר המופיע באמצע הרשימה, והצב אותו כערך למשתנה פא1:. ב. השווה בין האיבר המבוקש לבין האיבר המופיע במקום ה-פא1:. - | אם יש שוויון, הערך של 'פא1:' הוא ערך הפונקציה. ג. אם האיבר הרצו:* קסן יותר מהאיבר המופיע במקום ה-כפא1:, הוא נמצא בתחום של חצי הרשימה שבין האיבר הראשון ועד האיבר ה-פא1:. חשב את מספרו הסידורי של האיבר הנמצא באמצעו של תחום זה, והצב אותו כערך חדש ל-פא1:, ועבור לשלב ב' של האלגוריתם. ד. אם האיבר המבוקש גדול יותר - הצב ב-פא1: את הערך של המספר הסידורי של האיבר הנמצא באמצע התחום שבין האיבר ה-פא1: לבין האיבר האחרון של הרשימה. עבור לשלב ב' של האלגוריתם. על פי אלגוריתם זה, נעשית ההשוואה הראשונה על האיבר שבאמצע הרשימה. אם אין שוויון עוברים למחצית המתאימה של הרשימה, - 193 - ומשווים עם האיבר שבאמצע מחצית זו. ואם שוב אין שוו*ון, עוברים למחצית המתאימה של המחצית, וכך למעשה, אחר* שתי השוואות בלבד יופחת מספר האיברים הנבדקים לכדי רבע. אחרי ‏ 3 השוואות *ופחת לשמינית ואחר* 4 נגיע ל-1/16. לפי חישוב זה נמצא, שעבור רשימה בת 1-2% איברים דרושות לא יותר מ-ם השוואות עד למציאת האיבר הרצו*. נגדיר אלגוריתם לחיפוש בינרי בשני הליכים, האחד - הליך ראש: 5, והש - תת-הליך 25א. נשתמש גם בפונקציה קתממאטא, אשר בודקת אם איבר שייך לרשימה. הגדרת 105 17: 0871: פטסקזא 70 17 [05: פתממאמא נפטד [(ד15: 2א000) (2 / (161: צאטסס) 2א1) 1 פשקא 5ס] עעך [(151: [09 הממאמא דסא 16] 087: 58) ק0] שעך פאם ההליך 181205 מקבל במשתנה 081: את האיבר המבוקש, ובמשתנה 061: הוא מקבל רשימה ממויינת. תחילה ההליך בודק, באמצעות קהתמאטה, אם 081: נמצא ברשימה 51:. א. אם כן ('חא1'), הוא פונה לפונקציה 825 ומעביר לה 3 ערכים: - | ערך הגבול התחתון, שהוא המספר הסידורי של האיבר הראשון ברשימה. - | המספר הסידורי של האיבר המופיע באמצע הרשימה: (2 / (152: צאטסס) עאד1) - | ערך הגבול העליון, שהוא המספר הסידורי של האיבר האחרון ברשימה: (152: עאט0ס) ב. אם לא ('עת1'), הוא מודיע שהערך של 08[1: אינו שייך לרשימה צס:. = 108 - הגדרת 15 8: פא1: תא1: פקא 70 [פאז: 05] 1981: פאד: 1788 = [087: סך 1 פאז: אמד1 > 0571: צפסך [פאד: (2 / (פאד: + תא]:) עא1) תא1: פעם קס] לאד [ת0א: (2 / (808: + פאד:) עאד) פאד: פקא סס] קסד פאם בהליך זה, המשתנה 188: מקבל את ערך הגבול התחתון של התחום הנבדק, המשתנה כא1: מקבל את המספר הסידורי של אמצע התחום הנבדק, והמשתנה 808: מקבל את ערך הגבול העליון של אותו תחום. בתחילת החישוב, אם יש שוויון מוחזר הערך של פא1:. אחרת, בודקים אם [08: קטן יותר מהאיבר הנמצא במקום ה-פא1: - עצפ1: פא1: אמעת > 081: צפמך בשל סימן היחס '>', פונקציה זו מתאימה רק לחיפוש של נתון מספר: ברשימת מספרים. אם רוצים להגדיר פונקציה עבור חיפוש מי*לה ברשימת מילים, ‏ יש להשתמש בפונקציה המשווה מילים לפי הסדר המילוני, כמו למשל פמתס0עטם. בהתאם לתשובה של משפט ה-1851, נעשית פניה רקורסיבית ל-108 עס העברת הערכים של המחצית המתאימה של הרשימה, או של קטע ממנה. שים לב: מאחר ש-081: ו-151: הם משתנים לא-מקומיים, הח מוכרים על-ידי 5עע, ולכן ניתן לערוך בהם חישוב בתוך ההגדרה של הליך זה. ליטה למי | מהיר קיימות שיטות מיון מהירות יותר. אחת | מהן, | שנכנה אותה 507ספט, פועלת בדרך הבאה+: - 195 - נתונה רשימה 8: שאינה ממו*ינת. משמאל לאיבר הראשון שלה מציבים בתת-רשימה 1 את כל האיברים הקטנים ממנו, ומימינו מציבים בתת-רשימה ‏ (1ת: את שאר האיברים. מאחדים את הכל ברשימה אחת באמצעות הפונקציה 8. חוזרים על חישוב זה לכל אחת מתת-הרשימות המתקבלות, כל עוד יש בהן *ותר מאיבר אחד. לדוגמה, נתונה הרשימה: [31 10- 66 50 47 3- 1% 50 23 8 38] במחזור הראשון נקבל רשימה, שהאיבר הראשון בה הוא תת-רשימה: [31 10- 3- 18 23 8] האיבר השני הוא המספר הראשון ברשימה המקורית: 38 האיבר האחרון הוא תת-רשימה: [66 50 57 50] נאחד את האיברים ונקבל (רשימה, מספר, רשימה): [[66 0 ₪7 0] 3% [31 0- 3- 15 23 8] במחזור 2 נקבל: ]]-3- -10[ 8 ]23 1% 31[[ | ]]37[ 50 ]50 / 66[[ במחזור 3 נקבל: ננ66] 50 | = [%7] | 3331] 23 [72%]| [3- [10-]] נמשיך ונקבל: [ | |[ | | 3 | נטג] | | [10-] 7-7", הפלט הסופי: | [66 50 50 47 31 31 23 18 8 3- 10-] במחזור הראשון פעלנו על רשימה אחת. במתזור 2 אנו פועלים על שת: רשימות, הנמצאות משני הצדדים של המספר 3%. במחזור השלישי לפנינו רשימות רבות *ותר, אשר יש לטפל בכל אחת מהן בנפרד. אח"כ מקבלים מספר רשימות בנות איבר אחד. - 196 - מחלצים את האיברים מן הרשימות ומקבלים איברים בודדים בלבד, המהווים את הפלט של ההליך. הרעימה הממויינת מתקבלת על-ידי איחוד של כל האיברים המתקבלים בכל מחזור. לצורך החישוב נגדיר שתי פונקציות, האחת ראשית 0981, והשניה ‏ - תת-פונקציה 1200ק. 1 פונה ל-120ק, אשר מחזירה כפלט רשימה המורכבת משתי תת-רשימות: בראשונה נמצאים כל האיברים הקטנים מהאיבר הראשון, ובשניה - שאר האיברים שאינם קטנים ממנו. 0987 מאחדת - באמצעות הפונקציה 58 את שתי תת-הרשימות האלו כשביניהם מוצב האיבר הראשון. בפניה הרקורסיבית נוכל להשתמש במשפט הבא: (1: ט2דס 1057) תס ם: שפתדע (2: מס2דק צפתדע) תת 5פ) פס תרגילים (המשך) 8. בתרגיל 26 בפרק הקודם צריך היה להגדיר פונקציה פנסאקדן לבדיקה, אם מילה נתונה מופיעה לפני מילה אחרת על פי הסדר המילוני. השתמש בפונקציה זו על מנת להגדיר תכנית מיון אעעא, למיון רשימה של מילים. 9. נתונות שת רשימות לא ממויינות של מילים. הגדר פונקציה המחזירה רשימה אחת ממויינת, שאיבריה הם האיברים של שתי הרשימות. 90. הגדר פונקציה 1200א, המקבלת שתי רשימות ממויינות של שמות של סופרים, ומאחדת אותם לרשימה ממויינת אחת. 1. הגדר פונקציה המקבלת שתי רשימות. האחת 51025: בה מופיעים שמות של תלמידים, והשניה 084285: ובה ממוצע הציונים שלהם בהתאמה. נוסף לשת: הרשימות מקבלת הפונקציה שם של תלמיד - 197 - .2 .3 .8 .5 .6 ש]גא: ומחזירה את הציון שלו מרשימת הציונ'ם. לדוגמה, - אם 81005: = [000 עעע ממם פפע 000 מפם גג2] ו- | 0842₪5: = [95 80 85 70 98 75 60] ו- מאבא: = טשמם אז הפלט יהיה: 5. הגדר פונקציה המקבלת שתי רשימות. האחת - רשימת חודש: השנה, והשניה ‏ - כמות המשקעים של כל חודש בהתאמה. על הפונקציה להחזיר את החודש שבו היתה כמות המשקעים הרבה ביותר. בתרגיל מס' 8 בפרק 8 (פונקציות נתונות), היה עליך לכתוב תכנית המחשבת איזה יום בשבוע חל אעסא: ימים אחרי *ום צגכ:, ומדפיסה את שם היום במילים. באמצעות הפונקציה אמעד1, הגדר פונקציה המורכבת מהוראה אחת בלבד לפתרון אותה בעיה. דהיינו, על הפונקציה להחזיר את שם היום במילים. נתונות שתי רשימות: | א1/8: היא רשימה ממויינת של שמות תלמידים (הנה שאין שני שמות זהים); 122: היא רשימה של מספרי תעודת הזהות שלהם בהתאמה. הגדר פונקציה למציאת מספר תעודת הזהות של התלמיד ששמו ניתן ב-מא4א:. הגדר תכנית המבצעת מיון עבור רשימה נתונה הפעת: בדרך הבאה: מצא את האיבר הגדול ביותר באמצעות פונקציה 81051: והצב אותו בסוף רשימת הפלט של המחזור הבא. ₪ מחק באמצעות פונקציה 58807 את האיבר הזה מ-הפמת: של המחזוּר הנוכח*, והעבר את הרשימה החדשה כקלט ל-אפמת: של המחזור הבא. כתוב תכנית למיון רשימת מספרים על 5 השיטה 7ת050פת170 שתוארה בעמוד הקודם. - 198 - פרק 13 רשימות מקוננות איבר של רשימה יכול להיות תו, מילה, מספר או רשימה. רשימה המוכלת בתוך רשימה היא רשימה פנימית. רשימה פנימית יכולה גם היא להכיל איברים שהם רשימות, ולא רק מילים, או מספרים. מכאן, שרשימות יכולות להכיל רשימות של רשימות בכל רמה שהיא. רשימה מסוג זה היא רשימה מקוננת (115%6 68606א). את ה"רמה" של הרשימה הראשית נגדיר בדרך זו: - | רשימה שאין בה אף לא איבר אחד שהינו רשימה, היא רשימה בת רמה אחת. כלומר, היא רשימה של אטומים, שאיבריה הם מילים או מספרים. - | רשימה בת שתי רמות, היא רשימה שיש בה לפחות איבר אחד שהוא רשימה פנימית. רשימה פנימית זו הינה בת רמה אחת בלבד. - | רשימה בת שלוש רמות, היא רשימה שיש בה לפחות איבר אחד שהוא רשימה בת שתי רמות. ובאופן כללי ‏ - רשימה בת א רמות, היא רשימה שיש בה איבר אחד לפחות שהוא רשימה בת 1-א רמות. רשימה בת ₪ רמות הינה רשימה מקוננת. איחד על רצימות הפונקציה מ0אמזאם5 (או 58) מאחדת רשימות, כלומר מצרפת איבר: רשימה אחת עם איברי רשימה אחרת ויוצרת רשימה אחת. תכונה זו של הפונקציה 5958 מאפשרת להגדיר פונקציה 500858, המקבלת רשימה של רשימות בכל רמה שהיא, ומחזירה רשימה בת רמה אחת. וכך, א'בריה יהיו כל האטומים שהופיעו ברשימת הקלט. - 199 - הגדרת 5004581 7 500451 70 [[] פס] 151: פצדפאם אד (1.81: נפתדק) 1970 דפמך [(151: עם) (157: צפתדת) 58 500458 קס] תקד (1.87: עס 500458) (192: צפתנע) לטפע פס פאם נרשום ---% ןז [ד] [א3.1% [[דפ] א] [22 פפפ] 1 88]] 500458 אסם? ונקבל את הרשימה הבאה: [7 1 3.18 דק ע 22 ספת 1 88] כל האיברים שאינם רשימות, אלא מילים או מספרים בכל רמה שהיא, הופיעו כאיברים של רשימת הפלט ברמה אחת. רשימת הקלט 181: *כולה להכיל איברים שהם בעצמם רשימות. לכן ‏ יש לבדוק כל אחד מן האיברים, ולקבוע אם הוא רשימה: (151: לפתד1ע) 11515 צפמך א אם לא, כלומר אם האיבר הנבדק הינו מילה או מספר, יש להציב אותו בתחילת רשימת הפלט של המחזור הבא: (151: עם 500858) (162: פתדת) צטפע לס - | אבל, אם הוא כן רשימה, יש לאחד את איבריו עם שאר איברי 1 באמצעות הפונקציה 58 לרשימה אחת, שתהווה קלט למחזור הבא: (191: עם) (161: צפתדע) 58 500458 פס] עעך מגיעים למחזור האחרון כאשר אין יותר איברים ב-1517:. הרשימה הריקה משמשת כערך התחלת: (נקודת מוצא) לחישוב הפלט: [[] 05ס] ם: פצלקאם עך - 200 - נציג איפוא את התיאור של הקלט והפלט בכל מחזור: הקלט הפלט א. [נ [ת1] [3.18 [[דצספ] ש] [22 פספ] 1 88] פלט מחזור ב' ב. [ [1] 3.18 [[דק] ע] [22 פפס] 1 פפ] פלט מחזור ג' 88 לטפץ ג. [ד [1] 3.18 [[דס] ע] [22 פפפ] 1] פלט מחזור ד' 1 טפס ד. [נ [1] 3.18 [[דת] ש] [22 פפפ]] פלט מחזור ה' ה. [1 [1] 3.1% [[דם] ש] 22 פפפ] פלט מחזור ו' פפפ דטקץ ו. [ [1] 3.18 [[דס] ם] 22] פלט מחזור ז' 2 עטפק ז. [ד [1] 3.18 [[דק] ם]] .‏ פלט מחזור ח' ח. [נ [1] 3.18 [דס] ש] פלט מחזור ט' ת דטסת 0 [ [1] 3.18 [דם]] פלט מחזור :' י. [ד [ת1] 3.18 דפ] פלט מחזור יא' :םס צטתץ יא. [ָנ [1] 3.14] פלט מחזור יב' 3.18 צטקץ יב. [נ [1]] פלט מחזור יג' יג. [נ 1] פלט מחזור יד' 1 צטקק יד. [נ] פלט מחזור טו' 1 דטסץ טו. [] ךז ניתן לראות ש-01קע פועלת רק כאשר האיבר הראשון של כל מחזור אינו רשימה. כאשר האיבר הראשון הוא רשימה, מאחדת 5₪ את א*בריו עם שאר איברי הרשימה של אותו מחזור לרשימה אחת, שתשמש קלט למחזור הבא. לדוגמה, רשימת הקלט של מחזור ה' היא: [ל [1] 3.18 [[דפ] ש] 22 פפפ] האיבר הראשון ברשימה זו הוא 'כפפ', שאינו רשימה. לכן, במחזור זה מציבה הפונקציה עשעע את פעפ בתחילת רשימת הפלט של המחזור הנקרא על ידה, כלומר מחזור ו'. מחזור ו' מקבל כקלט את הרשימה ללא האיבר הראשון. דוגמה נוספת - רשימת הקלט של מחזור ז' היא: [ל [ד] 3.18 [[דפ] א]] האיבר הראשון כאן הוא רשימה [[1ק] א]. על מנת להגיע לאטומים, מאחדת 58 את איברי האיבר הראשון שהם האיבר ע והאיבר [21] עם שאר א*ברי הרשימה (1, [1] ו-3.18) לרשימה אחת ומעבירה אותה כקלט למחזור הבא שהוא מחזור ח'. במקרה זה, רשימת הפלט של מחזור - 201 - ז' תהיה רשימת הפלט של המחזור אשר נקרא על *דו, דה*ינו, של מחזור ח'. תרג'לים הגדר פרדיקט הבודק אם שתי רשימות הן בעלות אורך שווה. בדו"ה הציונים של התלמידים, רשומים בכל שורה 5 נתונים. הנתון הראשון הוא שם התלמיד, וארבעת האחרים מהווים את ציוניו במקצועות מתמטסיקה, אנגלית, מחשבים ועברית. כל איבר ברשימת הקלט הינו למעשה רשימה של תלמיד אחד, שבה מופיע שמו כאיבר ראשון, ועוד ארבעת הציונים שלו. הגדר פונקציה המקבלת את רשימת התלמידים וציוניהם, ומחזירה את רשימת השמות של כל התלמידים שברשימה. לדוגמה, אם הקלט הוא: [[90 92 80 90 אהגע] [80 95 75 85 אמתס] [85 87 85 80 תדא]] אז הפלט יהיה: [אאכ אמהס תזא] הגדר פונקציה המקבלת רשימה לפ: המתואר בתרגיל ‏ 2, ומחזירה את רשימת הציונים של המקצוע המופיע במקום ה-א:. על פיי הדוגמה שבתרגיל 2, רשימת הציונים של כל התלמידים במקצוע המופיע כאיבר רביעי ברשימת כל תלמיד היא: [92 95 87] כתוב תכנית המקבלת תאריך כלשהו, ומחשבת כמה י*מים חלפו מתחילת אותה שנה ועד לאותו תאריך ("כולל"). זכור להתחשב במספר הימים בכל חודש. כתוב תכנית המקבלת שני תאריכים ומחשבת כמה *מים יש ביניהם. לדוגמה,. ההפרש בין ה-9 בינואר לבין ה-5 בינואר הוא 4 ימים. - 202 - .190 .1 כתוב תכנית המחקה 50 זריקות של קוביה, ופולטת כמה הגרלות היו לכל מספר. הגדר תכנית המקבלת רשימת הודעות פאמא: כדוגמת "עיקר החדשות", הודעות פרסומת, או מאמר כלשהו. הפלט הוא הצגה של הרשימה הזו שוב ושוב בשורה אחת ויחידה על המסך בתנועה מימין לשמאל, כפי שרואים בפרסומת אלקטרונית ("פרסומת נעה"). הגדר תכנית המקבלת כל מילה שהיא, ומדפיסה אותה לפ: הדוגמה הבאה. עבור המילה טסא1תטאטא נקבל: 8 ט% טא נתטאטא שים לב, שהתחלנו מן האות הראשונה. הגדר הליך המקבל מילה המורכבת ממספר תווים אי-זוגי, ומציגה את הפלט לפי תבנית נתונה. אם למשל, נתונה המילה אמעפטת10, אז הפלט יהיה: 5 א 5 טש אפוג פטת ד שים לב, שהתחלנו מן האות האמצעית. הגדר פונקציה 58174104 המקבלת רשימה בכל רמה שהיא, ומחזירה את רשימת כל האטומים (מילים או מספרים) כקבוצה, ללא חזרות. הגדר פונקציה הבוחרת מספר אקראי 8: בתחום (6 .. 1), ומחזירה אותו ברשימה בת 8: רמות, כשהוא מופיע ברשימה הפנימית ביותר. - 203 - לדוגמה: אם המספר הנבחר הוא 3, הפלט יהיה: [[[3]]]. אם המספר הוא 1, הפלט יהיה: [1]. חיטובים מתקדמים במספרים קיימות שיטות ספירה אחרות מלבד השיטה העשרונית. בשיטה העשרונית הבסיס הוא המספר 10, והטימושט הוא ב-10 ספרות שהראשונה בהן היא אפס, דהיינו: 9 ... 2 1 0. כאשר ‏ הצגנו את קוד 85011 אמרנו, שמספרי הקוד הם מ-0 ועד 255. אין זו קביעה שרירותית. כל תו מיוצג במחשב על-ידי 8 סיביות שהן בית אחד (מץצמ). כל סיבית (811) יכולה להיות באחד משנ* מצבים, דלוק (א0) או כבו* ("09), מצבים אלה נוכל לתאר על-:די שתי הספרות '1' או יס' בהתאמה. לכן נמצא, שמספר הצירופים השונים שנוכל לייצג בבית אחד בן 8 סיביות הוא: 256 = 5%. כאשר למדנו את ההוראה ?המאת נאמר, שבגירסה של 000 ₪ זקעא מספר הפעמים המקסימל: שאפשר לרשום בהוראה טעמה הוא 65535 (ב-18% 0 התגברו על מגבלה זו). למניית מספר הפעמים של ביצוע ההוראה משתמשים בשני בתים, שהם 16 סיביות. באמצעותם נוכל ל**צג 6 6 צירופים, מ-0 ועד 65535. על-כן, הערך המספרי הגדול ביותר שניתן לבטא בדרך זו הוא 65535. בשיטה ה-ת-ית, שבה הבסיס הוא ת, יהיו ם ספרות שונות שהראשונה בהן היא '0', והאחרונה תהיה '1-ת'. ערכה של הסיפרה מחושב על-ידי הכפלת הסיפרה בחזקה המתאימה של הבסיס ‏ ת, בהתאם למקומה של הסיפרה במספר. עבור סיפרת היחידות החזקה המתאימה היא '0', עבור הסיפרה השניה מימין החזקה היא '1', עבור הסיפרה השלישית מימין החזקה היא '2' וכן הלאה. ערך המספר עצמו הינו סכום כל המכפלות של כל הספרות. - 208 - זכור, כי כל מספר בחזקת '0' שווה ל-1. בטיטה הבינרית (עְע8ת81), בבסיס 2, יש שתי ספרות בלבד: 0 ו-1. כאשר נחשב את ערך המספר 1101001 נקבל: 1825 + 1825 + 1%23 + 1820 = 1 בשיטה האוקטלית (00081), הבסיס הוא 8 ויש בה 8 ספרות: "1 0': אם נתון המספר 275 בבסיס 8, נציין אותו כך: ב27%. ערכו בשיטה העשרוגנית יהיה לפי החישוב הבא: 1 = 5980 + *8*ך + 2%82 בשיטה ההקסדצימלית (80001₪81א86), בבסיס 16, יש 16 סמלים שונים. הספרות: ‏ '1...9 0', והאותיות: ‏ 'ת ם כ 0 8 ג'. האות ב מציינת את הערך 10, 2=11, 0=12, 2=13, 14=ם ו-15=ק. ערך המספר 6ן2089 יהיה: 0% = 99160 .+ ₪161 + 08162 + 2%163 עד כאן הפכנו מספר בבסיס םת למספר בבסיס 10. הסבת מספר מבסיס עשרוני למספר בבסיס ‏ ת כלשהו, נעשית ‏ על-ידי חלוקת המספר בערך הבסיס ם בפעולות חילוק חוזרות, עד שמקבלים מנה של אפס. את המספר החדש בונים על-ידי רישום השאריות של פעולות החילוק מימין לשמאל. = 965 - דוגמה: הסבת המספר 1 למספר בינר'*. ר---------- (1) 52 = 2 / 105 | ר------ (8) 88 = 8 ] 5ף | | ר---- (0) 13 = 2 / 26 1|| ד (6601 =2 487 1( | צ-0- 0 4 =5 ₪7 |||||ד- (1640 *3/8 |||!||1ד- )506 =1/8 | | 1 1 10 1 מכאן ש- 11 = 160 ההסבה מבסיס עשרוני לבסיס אוקטלי, לבסיס הקסדצימלי, או לכל בסיס ם שהוא, דומה להסבה מבסיס עשרונ* לבינרי בהבדל אחד: כאן המחלק הוא ‏ 8 או 16 או כל ערך ת, אשר מציין את הבסיס שאליו מסיבים את המספר. נציג לדוגמה 2 פונקציות להמרה של מספר מייצוג בשיטת בסיס אחד לייצוג בשיטת בסיס אחרת. הגדרת ₪6כ.10. אז8 פונקציה ההופכת מספר בינרי למספר עשרונ'. אקא: אטא: סמפ.0ד1.אנם 70 [0 05] אטא: קצדקום פד ((2 * אלא:) אטא: 80 סמע.10.אדם) + (אטא: 1457 * אקת:) פס פאע הפרמטר הראשון הוא המספר המ*ועד להסבה והפרמטר השני הוא ערך הבסיס בחזקת '0' (אפס), עבור השלב הראשון של החישוב. | כאשר נרשום ---> 1 011 10.280.אזם מק? נקבל את התוצאה הבאה: 27 - 206 - הסבר: בתהחילת הביצוע הערך של 'אשא: 51ה1' הוא סיפרת היחידות, אשר מוכפלת בבסיס, אשר מועלה בחזקת '0'. לכן, בקריאה למחזור הראשון קיבל המשתנה א82: את הערך '1'. נחבר תוצאה זו לשאר התוצאות של המכפלות שיחושבו בהמשך לכל אחת מהספרות, כאשר בכל מחזור המשתנה %: מקבל ערך השווה לערך הבסיס כשהוא מועלה בחזקה הבאה. הגדרת א₪6.170.81 פונקציה להפיכת מספר עשרוני למספר בינרי. 5: א0.10.87מפ 70 [פדא: 0] 2 > 18א: קד (2 15א: תמסא1האמת) (2 / 15א: צא1 א0.10.21מכ) פתסט פס פאס הסבר: נרשום את השאריות של החלוקה מימין לשמאל, כדי לבנות את המספר שמהווה רצף של ספרות 0 ו-1. זאת עושים באמצעות הפונקציה כה₪0, שמצרפת את השאריות שיחושבו בהמשך, 2 / 15א: עא1 א10.81. סמכ עם השארית שחושבה באותו מחזור: 2 15א8: המפא1האמת תנאי הסיום הוא כאשר המנה היא '0': 2 > 16א: עך נקודת המוצא היא השארית האחרונה: [15א: פס] תרג'ל'ם (המשך) 2. הגדר פונקציה להסבה של מספר אוקטלי (בסיס 8) למספר עשרוני. 3. הגדר פונקציה להסבה של מספר עשרוני למספר אוקטלי. - 207 - 4. הגדר פונקציה להסבה של מספר הקסדצימלי (בסיס 16) למספר עשרוני. כאשר הערך מ*וצג על-ידי אות ולא על-ידי סיפרה, יש לתרגם את האות לערכה המספר* לצורך חישוב המכפלה. 5. הגדר פונקציה להסבה של מספר עשרוני למספר הקסדצימלי. כאשר השארית גדולה מ-9 יש להפוך אותה לאות המ*יצגת את ערכה. 6. הגדר פונקציה להסבת מספרים מכל בסיס שהוא למספר עשרוני, ופונקציה אחרת להסבת מספרים עשרוניים לכל בסיס אחר. 1. הגדר פונקציה להסבת מספרים מכל בסיס שהוא לכל בסיס אחר. הדרכה: יש להפוך את המספר לבסיס 10 תחילה, ואת התוצאה להסב לבסיס הרצוי. ינווג מספרים בטיטה המדעית בחישובים אריתמטיים אפשר לקבל מספרים גדולים אשר עוברים את גבול הדיוק כפי שהוא מוגדר בשפה. כדי להמנע מתקלה זו, מציגים מספרים אלה בשיטה המדעית באמצעות הנקודה הצפה. ב-1.000 188 המספר השלם הגבוה ביותר שניתן להציג מורכב מ-10 ספרות, וערכו 9999999999. ב-10060 ₪זקק8 המספר השלם הגבוה ביותר שניתן להציג הוא המספר 7, הערך של המספר השלם הגבוה ביותר נקבע על םי השימוש בארבעה בתים, כלומר '8*8' סיביות. ב-32 סיביות ניתן לבטא 22 צירופים שונים מ-'0' ועד '2187883687'. אם (רשום --%7 0 76599554472 המפאדגאמת תק? - 208 - נקבל בגירסת 060 8]זסקג הודעת שגיאה, כי פונקציה זו פועלת רק על מספרים בדיוק מלא. ב-1000 18% נקבל את התוצאה: 90 שים לב, כי התוצאה המדויקת הינה 472 ולא 470. אם המטפר הוא מעל ל-10 ספרות (הספירה נעשית משמאל לימין, בדומה ל-118%), לוגו תעגל אותו תחילה ל-10 ספרות, ורק אחר-כך היא תחשב את השארית של המספר המעוגל שהתקבל. מימין לשארית היא תוסיף אפסים, כמספר הספרות הימניות שנשמטו מן המספר המקור:. עיגול המספר ל-10 ספרות גורם לכך שאין הוא מוצג בדיוק על פי ערכו. השימוש בשיטה המדעית מאפשר לאחטן מספרים גדוליס מאוד ללא צורך בניצול מספר רב של בתים. לעומת זאת, מאבד המספר מדיוקו, לפי מספר הבתים שנקבעו לאחסנה שלו. למשל, הערך של הביטוי 1/3 מאוחסן כך לפי השיטה המדעית: | 0.3333333333 כל תלמיד יודע ש-3 פעמים 1/3 שווה 1, אך לא כן במחשב. המכפלה של ...0.333 ב-3 לא תתן את הערך 1. לדוגמה, נגדיר הליך המקבל נתון מספר* כלשהו וכופל אותו ב-3: 5 3טקא 0 5: * 2 תק פאם כאשר הנתון הוא 1/3 נרשום ---> 3 3טקא? נקבל: ...9 - 209 - בטיטה המדעית בגירסה של 000 א18, מוצג המספר על-ידי חזקה של בסיס 10, המוכפלת במקדם. המקדם מי*וצג על-ידי מספר עשרוני שערכו בין 1 ל-9. לדוגמה: המספר 342567465432 מוצג על-ידי המחשב כך: | 3.8256746508+0011 והמשמעות היא: 11 * 3.125673653 מעריך החזקה (6מסתסקאם), הינו המספר המופיע מימין לאות 8. האות 8 נמצאת במקום העשירי מהנקודה הצפה ואחריה מספר מורכב מארבע ספרות. הוא מציין את החזקה '0011+', סימן הפלוס מציין שהחזקה חיובית. מימין לסיפרה 3 במספר המקורי יש 11 ספרות ולכן מעריך החזקה הוא 1. ולדוגמה, את המספר 819.76 נציג כך: 8.89760000080002. במספרים שליליים מופיע הסימן מינוס '-' בתחילת המספר. עבור מספרים בשבר עשרוני הקטנים מ-1, שהחזקה בהם היא שלילית, מופיע סימן מינוס אחרי האות ₪. בשיטה זו מורכב המספר מ-17 תווים, כאשר התו הראשון *כול להיות סיפרה, או סימן המ*נוס '-'. כאשר החזקה השלילית היא '1-', מספר הספרות אחר: הנקודה העשרונית הוא 10, בעיגול הסיפרה העשירית בהתאם לצורך. לדוגמה, המספר 0.00001231567 מוצג כך: 65-.. 1 והמשמעות היא: ל * 1.234567 תרגיל: ערוך בדיקה וגלה בעצמך כיצד מוצגים מספרים בשיטה המדעית בגירסה שבידך. - 210 - קליטת תו יס מ| המקלדת פונקציית הקלט המחסעומת (שת) פונקציה זו משמשת לקליטת ערך מן המשתמש תוך כדי ביצוע ההוראה בה היא רשומה. ערך זה מתקבל באופן הבא: לוגו מפסיקה את פעולתה וממתינה עד אשר המשתמש יקיש על מקש כלשהו. היא מזהה את המקש הנלחץ ומעבירה את הערך שלו כקלט להוראה הפועלת על 6. לדוגמה: נרשום -7--6> 1" 6ת פתסש תק? כל עוד לא נלח% מקש כלשהו, 0 אינה קולטת כל ערך שהוא, ההוראה אינה יכולה להתבצע ותכנית לוגו תמשיך להמתין. ברגע שנקיש על מקש כלשהו, למשל על האות 'פ5', מועבר ערך זה באמצעות 86 כנתון אל הפונקציה 25ת₪0, וכך נקבל: וו הפונקציה ₪082 צירפה את התו 'פ' שהקשנו אל התווים '//4'. באחד התרגילים הקודמים צריך היה להגדיר תכנית המקבלת מספר ימדפיסה אותו ואת סכום ספרותיו. האם ברור לך עתה מדוע הגבלנו את מספר הספרות של הקלט ל-9. נכתוב כעת תכנית לפתרון התרגיל עבור קלט של מספר בכל גודל שהוא. על מנת להתגבר על הבעיה של הגבלת מספר הספרות במספר המוצג שלא בשיטה המדעית, נגדיר פונקציה שתקלוט את הספרות מהמשתמש בזו אחר זו באמצעות הפונקציה 86, ותחבר אותן למילה אחת. הגדרת ‏ 157זצַטע דנ סנס: 151ודטק 0 [ " 00] לדדכ: סתתמאטא צסא ד סו דפד,נטת צדסדכ: פתסט פס פאם = 211 - בקריאה לפונקציה נרשום ---> 6 157עשסק תק? לוגו תמתין להקשת מקש כלשהו על-ידי המשתמש. הפונקציה 158ודסק מבצעת שתי פעולות על ערך המקש (התו) ש-80 מספקת לה. ערך זה נקשר למשתנה 210117:, שבאמצעותו מתבצעים החישובים. הפונקציה 151ע1שק בודקת בכל מחזור אם הקלט הוא סיפרה: [" 0] 1011כ: קתתמאטא עסא עד אם הקלט הוא סיפרה, כלומר אם התנאי לא מתקיים, היא מחברת אותו עם ערך הפונקציה של המחזור הבא למי*לה: 0 151תצשת דד10כ: סתסט פס בכל מחזור מופעלת 56, ועל כן בכל פניה ל-197תעטק לוגו תמתין לקליטת ‏ תו קלט נוסף. כתנאי לסיום משמש תו קלט שאיננו סיפרה. בסיום ביצוע התכנית נקבל מילה המורכבת מספרות בלבד. התכנית שלפניך קולטת מספר ומדפיסה אותו ואת סכום ספרות*ו. [פנסקת מבצעת את קליטת המספר. לחישוב סכום הספרות נפנה לפונקציה 420 המקבלת רשימת מספרים, או מילה המורכבת מספרות, ומחשבת את סכום איבריה. הגדרת 8202 5: פפג 70 [0 05] 18א: פעדקאם פד פא: עם ספה + (פצא: דפתדק) 05 פאט בקריאה ל-822 נרשום ---> 0 151צטק פפג תק? הערך של הפונקציה 2011157 הוא מילה המורכבת מספרות, והוא מועבר למשתנה 15א:. הפונקציה 422 מחזירה את סכום הספרות המרכיבות מילה זו. בפתרון התרגיל לא נוכל לרשום את המשפט הבא: (30 151,זצטסע ססג) 86 157מעשק 55 תק? - 212 - הסיבה לכך היא, ש-1/151ט0ק תתבצע פעמיים, ויהיה על המשתמש להקיש פעמיים את אותו המספר. במקרה זה עלול להיות מצב, שהמילה שתוקש בפעם הראשונה ותוצג, תהיה שונה מן המילה שתוקש בפעם השניה ותחושב. כך נוכל לקבל מספר שסכום ספרותיו אינו זהה עם הסכום שנרשם על המסך. כדי ש-2010151 תתבצע פעם אחת בלבד, נגדיר פונקציה עמק עם משתנה פהש:, שאליו נקשור את ערך הפונקציה 1157שק. עמק תציג את יעתא: ואת ערך הפונקציה 422, אשר תפעל על הערך המועבר לה באמצעות המשתנה פתא:. הגדרת ‏ לשזעק עתא: עםטק 0ך (עתט: פעג) כתח: 58 ק0ס פאם כעת נוכל לרשום ---% סת 151צטסק עטק תק? ונקבל את הקלט שהוזן על-ידי* המשתמש. כאשר מריצים תכנית שדורשת קלט מן המשתמש, רצוי שתהיה לו הנחיה בדבר הקלט הנדרש ממנו. לשם כך נגדיר הליך אטאתק, אשר מציג על המסך הודעה מתאימה ואחר-כך פונה לפונקציה ות ומק. הגדרת אשזאחע אטאתתק 70 7 [אתטזטת פפמתפ אמוך פא הממוטא התסמצאת אג עטקא1] תק [] תפ [] הק 6 151.צטת עטק הק פא במקרה זה די לרשום ---6 אטאתק? - 213 - תכנית זו היא אחת הדוגמאות של תכנות מבני, המתבצעת באופן פונקציונלי. נוכל לתאר זאת באמצעות התרשים הבא: אטאתק 6ע 1186סטק 61665 107ת: 157/דשק >>> ז עתא: תםמק >>> ש: 806 בש: 56 ת: ספה 0 ניתן לראות על פי התרשים, ש-אטאתת פונה לשתי פונקציות 157,ודטק ו-₪7זטע, כחלק מהוראות החישוב שלה. את 1151שע היא מפעילה על מנת שהפלט שלה ישמש קלט לפונקציה עשומק, והפלט של עשמק הוא תוצאת החישוב של אשאתק. הפונקציה 51ד,דטסק פועלת על 30. הערך שמתקבל מ-80 משמש קלט עבור המשתנה 017זכ:. ותוצאת החישוב של 201157 כאמור, מהווה קלט עבור המשתנה פת: המוגדר בפונקציה 7 זחק. הפונקציה [ַ₪ומק מאחדת באמצעות 58 את הערך של פגח: עם ערך הפונקציה פס8. איחוד זה הינו הערך שהיא מחהזירה ל-אשאתק. בהוראות שאיגן מתמטיות, כאשר מספר מוגדר כמילה, שפת לוגו מתייחסת אליו כאל רצף של תווים ולא לפי ערכו המספרי. היא מדפיסה אותו כפי שהוא, ולא לפי השיטה המדעית, גם אם הוא עובר את גבול הדיוק. - 214 - ורוו ה בדוגמה זו נוכל לפנות ל-ע2שוטק כשערך הקלט מלווה בגרשיים: 3 ???+ שטק הק? והתוצאה תהיה: 9 776%63968553 עולות חשבון בנסיס ח פעולות החשבון בבסיס ‏ 5 דומות לאלו אשר נעשות בבסיס עשרוני. ההבדל הוא בתחום המספרים שמשתמשים בהם בכל שיטה. בחיבור שני מספרים מתבצעות הפעולות מימין לשמאל. תחילה מחברים את סיפרת האחדות של כל אחד מהמספרים, לאחר מכן - את הספרות במקום השני מימ*ן, אחר-כך - את הספרות במקום השלישי וכן הלאה. בכל מחזור מחשבים את הסכום של שלושה ערכים: סיפרה אחת מכל אחד משני המחוברים ונשא (צַע085). ערך הנשא (הסיפרה להעברה) בכל מחזור שווה לסיפרה השניה מימין של הסכום (בחיבור עשרוני זוה:* סיפרת העשרות). אם אין העברה, ערך הנשא הוא '0'. התוצאה היא מספר המורכב מספרות האחדות של סכום כל מחזור. אם בתום התהליך ערך הנשא שונה מ-'0', נוסף ערך זה משמאל למספר. נציג תכנית לחיבור שני מספרים בינריים, שתחום הספרות שלהם הוא 0 או 1. אם אורך אחד המחוברים קטן *ותר מחברו, מופעלת הפונקציה 1 להוספת אפסים משמאל למספר הקצר, ‏ על מנת ששניהם :היו באורך זהה. הגדרת אסצצדספה 8: ג: אסנדצנפפא 70 8 1אט00 = 8: עאטסס צפאך [ " 0 5: ג: אדמא50 קס] צחד 8 1אש00 < : עאט0ס דפמך [ " 0 (מ: 4: דטס1צא) 8: אדפא50 קס] צחד [ " 0 8: (8: 8: נטסתצא) אזמאט5 פס פאם - 215 - הגדרת 11001 2א: 1א: דטסתצא 70 [2א: קס] 2א: צאטסס = 1א: עא000 עד (2א: 0" פתסטא) 1א: דטסתנא פס פא הפונקציה אסזינזססג פונה לפונקציה א81א50 לתישוב הסכום ומעבירה לה 4 ערכים: שני ערכי המחוברים, '0' עבור הנשא, והמילה הריקה '"' כערך התחלת: לתוצאה. - | אם אורך שני המחוברים 8 ו-2 שווה, הם מועברים כפי שהם. / אם ‏ 'ם: %א600 < : %א000', מועבר ערכו של 8 בתוספת אפסים מצדו השמאלי, באמצעות הביטו* '8: 8: בט10א'. - אחרת, אם אורך של 4: הוא הקצר, מועבר ערכו של : על-:ד: חישוב הביטוי '8: 8: בט0תדא'. הגדרת א50831 8: 0: ם: 2: אזמאטפ 70 ב: פצדקום עפטץ [[ת: פס] [8: 0: פתסא 05] 6 < 0: ע1] צעד (אפ דתספעת) (58 צתתהס) ם: עם ב: 80 אזמאטס פס פא פונקציה זו מחברת שני מספרים בינריים המוצגים במשתנים 2: ו-8:. מעבירים אליה שנ*י מחוברים אשר האורך שלהם זהה ולכן, התנא' לסיום הפונקציה הוא כאשר אין יותר ספרות באחד מהם: '4: קצדקאם קזי בפניה אל הפונקציה בכל מחזור משמיטים את הסיפרה הימנית מכל אחד משני הנתונים, באמצעות ההוראה מם. אל המשתנה 0: מועבר הערך '0' כערך הנשא ההתחלתי, ובכל מחזור חדש הוא מחושב על-ידי הפונקציה 0488 הפועלת על התוצאה של 5%. בתחילה, ערך התוצאה היא המילה הריקה, והיא מועברת למשתנה 8:. בכל מחזור חדש מחושבת התוצאה החדשה על-:ידי הפונקציה +תשפקת - 216 - הפועלת על הערך של 5%. בתום הביצוע, אם אין נשא, התוצאה ה*א הערך של 8:. אחרת - מתוסף ערך הנשא לצדו השמאל:* של הערך של ת:. הגדרת אפ אפ 70 (0: 8: 1.487 4: 1457 אטפ) פס פאם ערך הפונקציה %פ הוא סכום הסיפרה הימנית בכל אחד משנ* המספרים יחד עם הנשא. ערך זה משמש כקלט גם ל-צ0488, וגם ל-שפעת. שים לב: כאן לא התבצעה העברת פרמטרים. 4:, 8: ו-0: הם משתנ*ים לא-מקומיים ולכן הם מוכרים על-ידי הליכים ברמה נמוכה *ותר מההליך שבו הם מוגדרים. הגדרת 04708 5: צתתגס 70 [0 09] [1 פ0] 1 < 8: אד פאם סכום של 3 ספרות בינריות יכול להיות 00 (ערך עשרוני = ,)0‏ 01 (ערך עשרוני > 1), 10 (ערך עשרוני = 2) או 11 (ערך עשרו(* ‏ = 3). הסיפרה השניה מימין במספר הבינרי היא הנשא. ערכה הוא 1 כאשר הסכום גדול מ-1, אחרת היא 0. הגדרת ספמ 5 עעספטת 70 [פת: 0" ₪082 ק0] 2 = 5: 0 = 5: 08 אך 8: 1" פתסח פס פא סיפרת האחדות היא 0 אם הסכום הוא 0 או 2. לכן, מוסיפה פונקציה זו '0' לצדה השמאלי של תוצאה 8:, אחרת היא מוסיפה '1'. - 217 - תרגילים (המטך) 8. הגדר פונקציה לחיסור של שני מספרים בינר:'ים ח*וביים, כשהמחוסר גדול מן המחסר. דרך אחת לפתרון התרגיל היא על-יד* השימוש בשיטת המשלים ל-2 עבור המספר המחסר, וחישוב הסכום, מבלי להוסיף את הנשא האחרון. חיטוב המשלים ל-2: הפוך כל 0 המופיע במספר ל-1, וכל 1 ל-0. לאחר מכן הוסף 1 למספר המתקבל (שספרותיו הפוכות). לדוגמה: המספר הנתון הוא 11100110 הפוך את הספרות ל-00011001 חבר 1 + ותקבל: 1 9. הגדר פונקציה לחיבור שני מספרים בכל בסיס שהוא. הערה: לצורך החישוב יש להסב את הערכים המיוצגים על-:ד: אותיות (אם הם נכללים בתחום). 0. הגדר תכנית המחשבת את : בחזקת א: מבל* להציג זאת בשיטה המדעית. 1. בהנחה שלא מוגדר הפרדיקט סתתמאטא, הגדר אותו בעצמך. פרויקט: מכו גה להדפסת שיקים במספרים במילים ערך מספרי אנו מבטאים בדרך כלל על-ידי יצוגו בסמלי הספרות. אבל בשטימושים רבים, כמו בשיקים למשל, מצאו לנכון לרשום ערך זה גם במילים, כדי למנוע אי בהירות ביחס לסכום הנקוב. ניישם זאת - 218 - בתכנית, המקבלת מספר טבעי המורכב מ-6 ספרות ומתרגמת אותו למילים. נגדיר תכנית זו לפי כללי התכנות הפונקציונל'י. כפי שידוע, ערך הסיפרה במספר תלוי במיקום שלה. במספר בן 3 ספרות נמצא את סיפרת היחידות, סיפרת העשרות וסיפרת המאות. מהסיפרה הרביעית ועד השישית המספר נחשב באלפים, אבל גם בשלוש הספרות האלו *ש אחדות אלפים, עשרות אלפים ומאות אלפים. כלומר, אם נחלק מספר בן שש ספרות לשלשות, התרגום לשנ* החלקים יהיה זהה בהבדל אחד - לחלק השמאלי אנו מוסיפים את המילה 'אלפים'. הגדרת כתח.160.70 אטא: כתח.0ד.10כ 0ד [0ת20" 05] 0 > אטא: אך . ((אסא: עמתם. 157) תטמס אסתדך) 55 פס ( (אטא: 1 0וא. 151) | דמוא אסתיד) פאם פונקציה זו מקבלת מספר ובודקת אם ערכו הוא '0': - | אם כן, הפלט הוא המ*לה '230?'. - | אחרת, היא מאחדת למשפט אחד את תרגום האלפים עם תרגום המאות. תרגום האלפים מתבצע על-ידי הפונקציה עמזע.0%8ת1. הקלט שלה הוא רשימת הפלט של הפונקציה ע₪]ע.151, המחשבת את החלק המציין את האלפים במספר, מהסיפרה הרביעית ועד השישית. תרגום המאות מתבצע על-ידי הפונקציה ת0מא.א6ת1. הקלט שלה הוא רשימת הפלט של הפונקציה ז₪0א.1581, שהיא רשימת הספרות הראשונות, עד הספרה השלישית. לדוגמה, אם ערכו של אטא: הוא 340017, אז הפלט של שםפ/ם.157 הוא הרשימה [0 8 3], אשר משמשת קלט עבור הפונקציה סםוםע.אסת1, לשם תרגום למילים. הפלט של 151.8₪07 הוא הרשימה [7 1], אשר משמשת קלט עבור הפונקצ:יה 07מא. אסת1, לשם תרגום למילים. - 219 - הבה נראה כיצד מחושבות שתי רשימות הפלט, המשמשות כל אחת קלט עבור פונקציה אחרת. הגדרת ‏ שאתם.157 5: שםם. 157 70 (1000 (1000 / 18א: עצא1) תמפאדגאטת) אטתנע קס פא הגדרת | 07א. 157 5 ספא 157 70 (1000 15א: המפאדהאמת) אטתזק 05 פאם כפי שרואים, שת*י פונקציות אלו פונות לפונקציה אטא1ע, אשר בונה רשימה שאיבריה הם הספרות המרכיבות את כל אחד משנ* חלקי המספר. הגדרת אטאזק עתט: אטתדק 70 [[] 09] פמט: פצדקאם עד עתט: עם אטתדק כתש: דפתדע עשפע פס פאם לדוגמה: כאשר נרשום ---> 5 אס . 187 0₪פ? הפלט יהיה: [07 3] שים לב - אם אין אלפים, הפלט הוא '[0]'. וכאשר נרשום ---> 5 תסמוא. 1.57 510₪? הפלט יהיה (ללא ה-0 משמאל): [5 1] הפלט של עק8/ם.151 משמש קלט עבור חש/ם.אסתך, ואילו הפלט של י'סםוא. 1.57 משמש קלט עבור ₪07א. אסתל. 7 220 - הגדרת ‏ עטזם. אסתד 1 סט אסת 10 [ ( פא54ט0גדי" 1 02מא.אסתד 58) ע0] [ " קס] [0] = עפם: שך פאם אם אין אלפים, נקבל כפלט את המילה הריקה '"'. אחרת, ‏ יש לבצע תרגום זהה לתרגום של המאות, אבל יש לציין במילים שהערך הוא באלפים. במקרה זה נוסיף למשפט הפלט את המילה 'פאהפטסצד"'. הגדרת | ד0א. אש6חיך 2 למא אס סיד " [191: 858801 05] 3 > 152: עאט60 שד 0 = (157: עם דפתדע) 0 > (1581: 57ב1) פאג דפמד ך (פמתפאט" 1 עפתדע צאט 58) 05ס] לקד [151: עם 458801 פאה" פמתפאטת" 7: עפתדע צנאטש 58) פס] קחד פאם אס אין סיפרת מאות, התוצאה תהיה הפלט של הפונקציה 458₪01. אם יש סיפרת מאות, יש לבדוק אם גם סיפרת העשרות וגם טיפרת היחידות הן אפס. - | אם כן, סיפרת המאות תתורגם על-ידי הפונקציה עאש, ונציין במילים שערכה הוא במאות: 'פמתספאשע"'. - | אחרת, יש להרכיב משפט המורכב מתרגום סיפרת המאות יח עם התרגום ש-454801 תבצע לשתי הספרות הנותרות. הגדרת 2454801 1 45407 0 [[: צפדת צצאט 05] [ " ת0] 0 = ם: צפתדק קד] 1 = : שאט00 שד [1: 151 צצאט 05] 0 = ם: עפתדק קך [(ע: 1081) פתפם 09] 1 = 2: עפתצק שך 0 = 2: 1457 דפט [(2: צפתדת) פאחד פס] צקד [((: 1481) צאט (2: צפתדע) פאמך 58) קס] קקך פאט - 221 - א. אם הקלט של 454807 הוא בן סיפרה אחת, אז - אם היא שווה ל-'0', יש להחזיר מילה ר:קה, אחרת - הפלט י*היה תרגום של סיפרת יחידות זו על-ידי הפונקציה עתאש. ב. אם הקלט הוא בן שתי ספרות, אז - - אם סיפרת העשרות היא '0', הפלט *היה תרגום סיפרת היחידות באמצעות צזאע. - | אם סיפרת העשרות היא '1', הפלט י*תקבל מביצוע התרגום על-ידי הפונקציה מחפע. - אם סיפרת היתידות היא '0', הפלט *היה תרגום הפונקציה 8. אחרת, הפלט יהיה משפט המורכב מתרגום סיפרת העשרות על-ידי 5אםש1, יחד עם התרגום של סיפרת ה*חידות על-יד: צזאט. נציג יחד את שלוש הפונקציות ע1אש, מתפם ו-פאמך, בזוה אחר זו. לכל אחת מהן נצרף הערה, כדי לצ:יין את י*יעוד התכנית, או לתת הסברים כלשהם. מציינים הערה בגוף התכנית באמצעות ההליך אמת, כפי שמוגדר לפניך: אתהאפת: אסת 70 פאם ההליך אעת מקבל קלט כלשהו, גם רשימה, אך לא מבצע כל הוראה. המחשב מתעלם מהערך של הקלט. דוגמאות להוראת את בגוף התכנית נראה בהמשך. הגדרת צעזאס א: עזאט 70 [01ס1טצ הסע 15 "עצאט"] אמפת [מאזא סד אמ/מ5 א51 מטדקע הטססת ממתח 00 מאס] א: אמצ פס פאם - 222 - הגדרת ₪ש65%ע א: פתפם 70 [9 עד 10 אסתע פתממאטא תסע 15 "מתפת"] אמת ו אממתטסע אמטלתדעד מע ומד אמטום אמך] 1 + א: אתדך פס [אמטנתא1א אממעאסדם אממואק/50 אממדאך5 אממדקדק פאם הגדרת 5אשך 2 א: 5אפץ 20 [450801 הסע 15 "פאמד"] אחת ו צצאמטמס צ7א51 שנעדת צצתסע צצתדד צצאמחד] 1 - א: אמצ פס [צתטאצא צצאסדם פאם כאשר נרשום ---6 7 פפמפא. 10 16 הק? הפלט יהיה: אממץאמעם5 פאהפטסמד' צצתסע פאה כפמתפאטע צדתזזד בשני התרשימים הבאים נציג בשני חלקים את שלבי הביצוע של התכנית להדפסת שיקים. - 223 - א. התרשים מתאר את החלק הראשון של התכנית, עד הפניה לפונקציה צסמא. אסת'. הפניה ל-01מא. אסת' מתבצעת פעמיים. אסא: פתח.6.10זת (שטת: 156.₪60%5) ₪606.משע6 9 (מטת: /186.6168) 8168.משסס 5: דשא 57 >>> (... קא6) א0%ש1ק סתא: אטתחנק /- 7 דסמוו. תד =6> 8 סם,ם. 97 >>> ₪ פחזו: אטתדק >>> 59 םס .1808 =%> 6% 600ם.ששסס 7 ז: דסא. אסהך 6 - 220 - ב. התרשים מתאר את מהלך הביצוע של הפונקציה ₪01א. אסחד. : צסמא. אסתיך (... קא6) %נתט (... 0א6) 858006 ז 1 54801 =>> ... 0א6) 8ת66 ... 0א6) 6806 (... 0א6) סנתט תרגילים (המשך) 2. שנה את התכנית סתחא.210.10, כדי שתתרגם מספר שבור עד 9 ספרות. בנוסף, שפר אותה, כך שתבצע תחילה בדיקה אם הקלט הוא אכן מספר המורכב רק מספרות, ושמספר הספרות אינו עולה על 9. - 225 - .3 .8 .5 הגדר פונקציה המקבלת רש*מה בת רמות אחדות, ומחזירה את כל האטומים הנמצאים ברמה 1. לדוגמה, אם הקלט הוא: [1000 [א10[[8]פפ8]] אספ אסא [פע מם] 5 1] הפלט יהיה: [000 א50 אסא 5 1] הגדר פונקציה המקבלת רשימה בת רמה כלשה:י, ומחזירה ברשימה את כל האטומים הנמצאים ברמה ה-א:. אם רשימת הקלט היא ברמה נמוכה מ-א:, מוחזרת רשימה רי*קה. הגדר פונקציה המקבלת רשימה 12981: בת םת רמות, ומחזירה רשימה שאיבריה הם רשימות בנות רמה אחת. איברי הרשימה האחת יהיו האטומים המופיעים ברמה 1 של 1257:, איברי הרשימה השניה *ה*יו האטומים הנמצאים ברמה 2 של ,:2657‏ ... ואיברי הרשימה ה-ת יהיו האטומים המופיעים ברמה ה-ם של 187:. אם הקלט הוא כמו בדוגמה שבתרגיל 23, אז הפלט *היה: [101] [פפ4] [אם פע הם] [000 אט5 אסא 5 1]] משולש פסקל מציג את מקדמי הבינום של ניוטון. כתוב תכנית לבניית משולש פסקל לפי המבנה הבא: 1 5 10 10 50 1 מספר האיברים בכל שורה שווה למספר השורה, האיבר הראשון והאחרון הם '1', ושאר האיברים מתקבלים על-ידי חיבור שנ* האיברים שמעליהם. לדוגמה, הערך של האיבר השלישי בשורה 6: הוא 16, כי 8+6=10. - 226 - ][. הגדר פונקציה המקבלת רשימה ברמה אחת 1581:, ומחזירה רשימה .8 .9 .90 במספר רמות כמספר איברי 151:. האיבר הראשון יופיע ברמה 1 של רשימת הפלט, האיבר השני ברמה 2 של רשימת הפלט והאיבר ה-ם יופיע ברמה םת של רשימת הפלט, לפי הסדר. לדוגמה, אם הקלט הוא: [1טח תעש הכ מא01 צדסם שםנה ] אז נקבל: [[[[[דשא] תש זהפ] ממאד01] דדסם] סםזה] הגדר פונקציה כמו בתרגיל [2, אשר מקבלת רשימה בת ם איברים. אבל, בפונקציה זו האיבר הראשון יופיע ברמה ה-ם של רשימת הפלט, האיבר השני יופיע ברמה '1 - םת' של רשימת הפלט, והאיבר ה-ם יופיע ברמה 1 של רשימת הפלט. לדוגמה, אם הקלט הוא: [דמא ₪ זה מטאד דדמ פםזה ] נקבל: [צטא [ע₪ ופ [.₪א01 [צצמם [פטעה]]]]] כתוב תכנית המקבלת רשימת מספרים בסדר עולה, ומחזירה איברים אלה ברשימה, אשר כל מספר מופיע בה ברמה התואמת את ערכו. לדוגמה, אם הקלט הוא: [7 5 5 5 35 3 1] נקבל: [בבבבנ 171 5 5 5] 5] 3 73 1] הגדר תכנית כמו בתרגיל 29, אך הפעם רשימת הקלט תהיה בסדר יורד. אם הקלט הוא: נ 5 5 נקבל: [ 33 51 51 5 5 בבלשםתז]]ם - 221 - פרק 14 תכניות אינטראקטיביות אחד ה*יתרונות של שפת תכנות הוא, שניתן לכתוב בה תכנית בעלת אופי שיחתי בין המשתמש לבין המחשב. כלומר, במהלך ביצוע התכנית מתבקש המשתמש להקיש נתון או נתונים, אשר משמשים כקלט לביצוע המשך התכנית. התכניות *כולות לשמש עבור משחקי אתגר או שעשוע, למשחקים לימודיים, ללומדות מכל הסוגים וגם עבור חישובים עסקיים. בכל מקרה רצוי לכלול בתוך התכנית, באמצעות אמת למשל, תיאור קצר והסבר על הפעולות שהיא מבצעת והדרכה על אופן השימוש בכלליה. על התכנית להנחות את המשתמש להזין קלט ולהודיע לו לאיזה סוג של קלט היא מצפה. כאשר התכנית מקבלת נתונים, עליה לבצע בדיקת תקינות של הקלט. מונקציות קלט של ושימות את פונקציית הקלט ההסקגמת לקליטת תו כלשהו כבר פגשנו. נכיר כעת פונקציה לקליטת רשימה. הפונקציה 15%תסגמת (מת) פונקציה זו, כפי שניתן להבין מהשם שלה, הינה הוראת קלט המקבלת נתונים אשר מהווים רשימה. גם כאן, כמו במקרה של הזנת תו בודד, לוגו תפסיק את הביצוע כדי לאפשר למשתמש לספק את הנתונ'ים. בפונקציה 80 הביצוע המשיך לאחר הקשה של תו אחד, מפני ש-6ת - 228 - דורשת תו אחד ויחיד. בפונקציה מת הביצוע ימשיך רק כאשר נקיש על <נמת+, על מנת שלוגו תדע שסיימנו להקיש את כל תוכן הרשימה. לאחר שמזינים את הנתונים, נקבל רשימה אשר משתמשים בה כמו בכל רשימה אחרת. לכן, ההתייחסות לנתונים תעשה על-יד* פונקציות הבחירה, גם אם רשמנו נתון אחד ו*היד. לדוגמה, נוכל לרשום ---% תת צפהנע תק? לוגו תמתין, נקיש את הנתונים ובסיום נקיש <צמת>. אם נקיש למשל: 'תמ5157 תמצדסחם המאנס המוגק' הפלט יהיה: תמדק הבה נגדיר פונקציה הבונה רשימה מ-אשא: כתובות של תלמידים הנקלטות מן המשתמש באמצעות פונקציה םת. כל כתובת נקלטת כרשימה. הגדרת 4008855 אטא: פפמתפפ4 70 [[] 09] 0 = אטא: חך 1 - אטא: 5פתתפסג 8 צטקת פס פאט בכל מחזור ימתין המחשב לקליטת נתונים מן המשתמש וימשיך את הביצוע רק לאחר שיוקש <זעת>. רשימת הקלט החדשה תוצב בתחילת רשימת הפלט של המחזור הבא. הביצוע יסתיים כאשר יקלטו כל אשא: הכתובות. תרגילים 1. כתוב הליך המצפה לקלט. בהקשת מקש כלשהו, יודפס קוד ה-45011 של התו שהוקש. - 229 - כתוב תכנית המציגה שאלה כלשהי על המסך, ומצפה מן המשתמש שיקיש על אחד המקשים 'צ' (פמצ) או 'א' (סא). - | אם התו שהוקש הוא 'צ' תודפס המילה 1קקס0צ". - | אם התו הוא 'א', תודפס המילה מג4טגז". הגדר את התכנית, כך שכל עוד לא הוקש אחד משנ* התווים האלה, תמשיך השאלה להיות מוצגת על המסך, והמחשב ימשיך לצפות לנתון. כתוב תכנית המצפה מן המשתמש לשני נתונים מספר*יים, ומדפיסה את סכומם. הגדר שוב את התכנית שבתרגיל 33, אך הפע יש להציג את כל התרגיל החשבונ* כשלידו התוצאה. . רמז: מכיון שיש *ותר מפעולה אחת המתבצעת על הנתונים הנקלטים, יש לקשור את ערכיהם למשתנים. הגדר תכנית המבקשת קלט מן המשתמש ובודקת אם תוכן רשימת הקלט יכול לשמש משפט פתיחה להגדרת הליך. כלומר, התכנית בודקת: - אם רשימת הקלט מתחילה במילה 10, - האם המילה השניה תקינה כשם של הליך, - | אם :> עוד נתונים, ואם הם מתאימים לה:יות שמות של משתנים, אם הקלט יכול לשמש משפט פתיחה להגדרת הליך, על התכנית להדפיס את התו '<' בתחילת שורה חדשה. אם לא, תוצג הודעת שג:אה. הגדר תכנית המשתמשת בפונקציה 400895, אשר תקלוט מן המשתמש אטא: כתובות של תושבים מכל חלקי הארף, ותדפיס רק את אלה הגרים בעיר צ017:. - 230 - 7. כתוב תכנית הקולטת רשימת תלמידים וציוניהם במקצוע מסוים. בכל המתנה יקיש המשתמש שלושה נתונים: שם המשפחה, שם פרט: והציון. על התכנית להחזיר רשימה ממויינת בסדר י*ורד של הציונים, כלומר מן התלמיד בעל הציון הגבוה ביותר עד לתלמיד בעל הציון הנמוך ביותר. רימה ד -מימדית למדנו על רשימה בת רמה אחת (מערך חד-מימדי) וראינו שניתן לטפל ברשימות בכל רמה שהיא, דה*ינו, במערך רב-מימדי. נעסוק עתה ברשימה דו-מימדית בת שתי רמות, שהיא מערך דו-מימד'. מערך דו-מימדי ניתן להצגה בצורת טבלה בת א עמודות ו-צ שורות, אשר נכנה "טבלה בסדר א * צ". לדוגמה, טבלה בסדר 3*4 (4 עמודות * 3 שורות) ניתנת להצגה כך: 8)1,1( - 8)1,2( - 8)1,3( | 8)1,0( 8)2,1( | 8)2,2( | 8)2,3( | 8)2,8( 8)3,1( 8)3,2( 8)3,3( | 8)3,3( באמצעות טכניקת הרשימות נוכל לתאר את הטבלה כרשימה בת שת: רמות, שיש בה צ רשימות במימד אחד, שבכל אחת מהן א איברים. כך נוכל למשל, להתייחס אל האיבר '(8)1,1', כאשר 1 מציין את מספר השורה ו-[ מציין את מספר העמודה, באופן הבא: 1 1: אמדעד ד: אמצך לדוגמה, הערך של 1151: הוא: [[12 9 6 10[]3 8 5 8[]2 3 2 1]] הערך של 1: הוא 2 והערך של 1: הוא 8. ערך הביטוי יהיה שווה ל-10, שהוא האיבר הרביעי בשורה השניה. תרג ילים (המשך ) כתוב תכנית המדפיסה טבלה של מערכת השיעורים של תלמיד. המשתמש מתבקש להזין את המחשב בשמות המקצועות שהוא לומד בכל יום. לדוגמה: ( :" צגפ: [אסצ 15001א1א 55מספגא] הק) אם הערך של צגכ: הוא 'א580זת' למשל, יופיע המשפט הבא על המסך: : א1580ת3 אסצ 150012א1א פפטספג המחשב ימתין לקבלת רשימת המקצועות של אותו יום מן המשתמש. פעולה זו תתבצע עבור כל אחד מששת ימי השבוע. כל מקצוע יש לתאר ב-4 תווים. בתום קליטת כל הנתונים תופיע טבלת המערכת על המסך. לדוגמה, 1 ₪000 8180 18 ... . . . אאא מתגא דגא 2 ... . 0 תממת 1000 3 ... . 587 גטמך המתח 4 הפפ זא 5 כלומר, מתחת לשם של כל יום :יירשמו המקצועות של אותו *ום בעמודה, זה תחת זה. בפסטיכון (פסטיבל בבית-ספר תיכון) אשר נערך במסיבת סיום שנת הלימודים, היה על המארגנים להכריז על השיר אשר זכה בתחרות. כל אחת מארבע הכיתות (ט', *', י"א ו-י"ב) מסרה את רשימת הנקודות, אשר העניקה לכל אחד מ-% השירים לפ סדר הופעתם (שיר מספר 1, שיר מספר 2 וכו'). הניקוד נע בין 1 ל-5, ואסור היה לתת לשנ(* שירים מספר נקודות זהה. - 232 - כתוב תכנית אשר תקבל רשימה אחר רש*מה מן המשתמש ותדפיס טבלה להצגת תוצאות הבחירה, לדוגמה: מתנאם בתזחפ <תזח5 נתדטפ 8 3 2 5 | 2 1 5 3 61 1 2 3 8 ד 4 2 5 3 | על התכנית לחשב ולהדפיס הודעה בדבר השיר הזוכה. פרויקט: תכנית ל" יחוש" הקלף שנבחר נגדיר כעת תכנית "המנחשת" קלף שנבחר על-ידי השחקן מתוך 21 קלפים כלשהם. התכנית חוזרת על הפעולות הבאות 3 פעמים: - | התכנית מסדרת את הקלפים ב-3 שורות, דהיינו 1 קלפים בכל שורה. - | השחקן מקיש את מספר השורה בה נמצא הקלף הנבחר. - | התכנית "טורפת" את הקלפים. לאחר מכן, היא מדפיסה את הקלף שהשחקן בחר. קלף זה יימצא באמצע השורה השניה בתום הביצוע. ערבוב הקלפים נעשה לפי הכללים הבאים: א. יש לאסוף את הקלפים שורה אחר שורה, ולהקפיד שהשורה בה הקלף נמצא תאסף שניה בתור. ב. את חבילת הקלפים שנאספה יש לסדר עמודה אחר עמודה, כלומר מלמעלה למטה, שלושה קלפים בכל עמודה. - 233 - התכנית 000990280 מבצעת את ניחוש הקלף הנבחר, באמצעות פונקציות עזר שונות, כפי שנראה להלן. הגדרת כת00₪5504 70 ([] 0₪80055) פת6 עתס פתס 11 אמע1 תק פא הקלט של 2ת6 הינו רשימה במימד אחד של 21 הקלפים. בפעם הראשונה זוהי רשימה שאיבריה נבחרו באופן אקראי מתוך 52 קלפים על-:ד: הפונקציה 680058. הפלט של 080 הינו רשימה במימד אחד, של הקלפים לאחר ‏ ערבוב. פלט זה משמש קלט עבור 082 לערבוב שני, ולאחר מכן לערבוב שלישי. מכיון שהפלט הסופי מוצג למחשב כרשימה במימד אחד, נמצא הקלף הנבחר במקום ה-11 ברשימה. בחירת הקלפים באופן אקראי מתבצעת על-ידי תכנית המורכבת משלוש פונקציות: 080058, 085 ו-048052. הפונקציה 048252 כוללת את רשימת 52 הקלפים, שמתוכם בוחרים את 1 הקלפים שישתתפו במשחק. הגדרת 0848052 0 2 [פאס14%כ=2 5-58 דתמו-ת 0=0108] אעת [6אדא=א אממסס=0 א1=240 0=10] אמת ו 0 00 106 00 90 80 70 60 50 40 30 20 10] פס ו א 0 אנ 08 91 88 חך 61 58 38 ח3 28 11 / 85 5 085 95 85 75 65 55 45 38 25 15 [פא פס ענ 05 9 85 פך 62 55 32 35 22 15 פא השתמשנו בהליך אחת, על מנת להטביר את משמעות הסמלים. - 238 - הגדרת 080058 והגדרת 685 1: 0/0008 [0021: 09] 21 > 0221: עאט00 שד ( (04252 52 אספאגת + 1 אמ11) 085) 680088 פס ספאמ 70 085 :06 [0221: 00] 0221: 6: קתממאמא עד 1 0: עשפע 05 פא בתחילה, הקלט של 680058 הוא הרשימה הריקה (ראה ב-0009504282). כל עוד אין ברשימת הקלט 0221: 21 קלפים, פונה 610058 ל-685. הקלט עבור 0: הוא ערך שנבחר באופן אקראי מתוך 688052. 5 בודקת אם ערך זה נבחר,כבר קודם. אם כן ‏ - היא מחזירה את הרשימה 0221: כפי שהיא. אחרת, היא מציבה ערך זה ברשימה. הביצוע מסתיים כאשר נמצאים ברשימה 21 קלפים, ואז הפונקציה 8 מחזירה רשימה זו כפלט. פלט זה, הערוך ברשימה במימד אחד, משמש קלט עבור הפונקציה פתס בפעם הראשונה. הגדרת 060820 1 פתס 10 ([] 7 121: אדפ 1א) פתגסצאתק פס פא הפלט של הפונקציה 082 מחושב על-ידי הפונקציה 6480עאתת, הפועלת על קלט שהוא רשימת הפלט של הפונקציה אזח14א אשר נציג בהמשך. הפלט של 082 ישמש כקלט עבור ההפעלה הבאה של הפונקציה כת6. - 235 - % היא פונקציה המקבלת רשימה 151: במימד אחד, והופכת אותה לרשימה דו-מימדית. כלומר, ‏ היא הופכת רשימה אחת לרשימה של רשימות, שבכל אחת מהן אשא: איברים (במילים אחרות - טבלה בת אסא: עמודות). הגדרת ‏ אזעגזת 2: אשא: 7סם: אצקגזא 70 [ע: 1157 05] 1657: מצדסקאם עד אא: = 2: ע2א000 עפמד [[] אסא: 157: אדעה תא ת: צטפע פס] אד (ע: (151: עפת1ע) צסק1) אטא: 57: עם אנדעהוא פס סאם המשתנה ,1: משמש כמחסנ*ת, אשר בתתחילת הביצוע היא ריקה. בכל מחזור מאחסנים בה אי*בר נוסף מהרשימה 57/]: (2: (1252: עפתדע) עטס) עד שמספר האיברים מגיע ל-אטא: - אטא: = 2: א000 ספת עתה מציבים מחסנית זו, שהיא רשימה בת אשא: איברים, בתחילת רשימת הפלט: [] אטא: 157: אדקתג1א ם: צטפע פס הביצוע מסתיים כאשר אין יותר איברים ב-1581:, ואז משמשת המחסנית של המחזור האחרון כנקודת מוצא לחישוב הפונקציה: [.1: 1157 ק0] 161: קצדקום פך אם לדוגמה נרשום ---> [] 3 [ש 5 כ 0 8 4] אנעגוא הק? נקבל את הפלט הבא: [[ש ₪ פ] [0 8 ג]] הפונקציה 10480אתת פועלת על הפלט המוחזר מ-א1ַ140א, אשר מהווה קלט עבור המשתנה 13%7:. - 236 - הגדרת כ1643אחץ 7: פתההסנאפק 70 דט 7: צפתדע מקצן [3 4] הספתטסספ ([1 סא פא11] <== " תת) 7: 2 אצ מקצך [3 7] 51000508 ([2 סא 5א11] <== " חת) 7 487 מקצ [3 10] 901003508 ([3 סא 8א21] <== " תפ) [ " הע] 10 צאמקפת [ >>> מתמוא מאד.1 מא 09 סא מגד פפמתק <<<] הק [ " מקצד] 10 צאמספת [ >> 15 פתג0 הטסצ <<] תק 7 0 עאדסע 05 פאם פונקציה זו עורכת את המסך ומדפיסה את הטבלה שורה אחר שורה. היא מנחה את המשתמש להקיש את המספר של השורה שבה נמצא המספר הנבחר. לאחר מכן היא פונה לפונקציה עא01ע, אשר ממתינה לקבלת הקלט מן המשתמש, | באמצעות | 36" (מגחסקהמת). זכור, | אם אתה עובד ב-11 1.000 ₪ זקס, או ב-000. ₪ זפק1, יש להפוך את סדר הקואורדינטות. הפונקציה צאז0ק מחשבת את הפלט עבור הפונקציה פת0ע1אתק, הפלט הזה הוא למעשה ערבוב הקלפים בהתאם לתשובת השחקן. הגדרת צא01ע ה: ק: זא01ק 70 [3 2 1] ק: סתממאטא דפמיך [ת: 80 עאד0ק קס] קד [(ת: 1357 ת: צפתדע ת: 2 אמע1 58) בהא 05] 1 = ק: קך [(ת: 1087 ת: 2 אמעד ת: שפהדע 8פ) 13גא 0] 2 > ק: שך (ת: 2 אמצד ת: 197 ת: צפתנת 58) 13הא פס פאע - 2371 - המשתנה ‏ ;: מקבל את ערך הנתון של המקש שנלחף. עא01פ תמשיך בביצוע רק אם ערך הקלט הוא '1' או '2' או '3' - [3 2 1] ק: פתתסאמא עסמך אחרת, היא תמתין למקש אחר - [ת: 0 יאזסק 05] 8ע1] המשך הביצוע הוא איסוף הקלפים לרשימה במימד אחד. סדר האיסוף תלוי בערכו של ת:. השורה ה-2:-: תמיד תיאסף שניה בתור. רשימה זו תהווה קלט למשתנה 6מע: של הפונקציה 413א. הגדרת ‏ 473א סמט: 13גא 10 1 ([] 3 סמט: אדקהתא) עגתא קפס פאם 3 פונה לפונקציה ש4זא, להמשך ערבוב הקלפים. הפעולות האלו מכוונות לסדר את הרשימה בטבלה באופן שבו היא היתה נוצרת, אילו סידרנו את הרשימה עמודה אחר עמודה. לצורך זה, אא מקבלת רשימה של שבע רשימות. בכל רשימה שלושה איברים (3א7א:), אטשר הוכנו על-*די הפונקציה א1ץנא, שהגדרנו לעיל. הגדרת ‏ שגות אטא: 3א7א: תא 10 [[] פ0] 3 < אטא: עד (1 + אטא: 3א7א: שה1א) (אטא: 3א7א: מא) 55 פס םאו מאחדת בכל מחזור את הפלט של מא, עם הפלט של המחזור הבא לרשימה אחת. היא עושה זאת 3 פעמים. = 2068 - הגדרת ‏ % אמפאד: אא: מא 70 [ן] פס] אא: פצצקאם פד (אמפאד: אא: עם מא) (אא: עפתדע אמפאד: אאעד) עטפע עס פא הפלט של ,]% הינו רשימה, שאיבריה הם כל האיברים המופיעים במקום ה-אמפא1:, בכל אחת משבע הרשימות. הרצת התכנית: להרצת התכנית עלינו לרשום -%77 ו בתכנית 008950828 השתמשנו ברשימה דו-מ*מדית. כדי לבצע את המשימה של ניחוש הקלף אפשר להשתמש ברשימה חד-מימדית, כפי שנציג בתכנית הבאה 0009504802. אך לפני כן, הבה נכיר את הפונקציה ₪ הפונקציה 008508 פונקציה זו מחזירה רשימה ובה שני ערכי הקואורדינטות [< ץ], המורים על מקומו של הסמן. האיבר צ מציין את מספר השורה, והאיבר א - את העמודה. פונקציה זו, היא דוגמה לפונקציה לא-קבועה, שאינה פועלת על משתנים. בפונקציה נוכל להשתמש גם בביטויים חשבוניים. לדוגמה: , ו (000508 1091 + 3) 58 501008508] 4 דהמפעת דאמדתהם,וס? [ ₪00 צאט" מקעע (008508 157 + 5) - 239 - %כור, ב-11 10060 ₪ "תק וב-1000 שזסק הערך הראשון מציין את העמודה (הקואורדינטה א), והערך השני (הקואורדינטה ץ) מציין את השורה. נדגים דרך אחרת אפשרית להגדיר את 0ת00₪5504 ואת כת0. נכנה אותן 1 ו-0821 בהתאמה. השווה את שת* ההגדרות וקבע מה* הדרך הנבחרת על-:דך. הגדרת 0085564801 1 0 3 ([] 0₪0058) 1סת0 11 אמעד תק פאס הגדרת ‏ 0801 0: 121: 1פתס 70 [121: 00] 1 > 0: עך 1 - ); ((ך] 7 1: אדתהזא) סתגסזאתע) 0801 פס פא כפי שרואים, 0201 היא פונקציה רקורסיבית הקוראת לעצמה. לכן מתבצעת רק פניה אחת ל-0801 מתוך 6005504(21. שים לב לערך שהמשתנה 121: מקבל בכל מחזור. גם את הפונקציה לבחירת 21 הקלפים, נוכל להגדיר באופן טונה. הנה דוגמה: הגדרת 0800581 1 0 (52 אספאגת + 1) 21 048052 תגוום קס פאע 1 מעבירה את ערך הפונקציה תגם לפונקציה 1כת0. שים לב, כי ל-0800981 אין צורך בקלט. - 240 - הגדרת תגהאם ת: א: ם: תגחם 90 [[] פס] 1 > א: שד ו 2 ת: אמעע לספק פס (1 - (2: 1א000) אספאגת + 1) 1 - א: (ם: ת: מצמתתם) הגמם פאם בקריאה ל-2₪28 מועברת רשימת 52 הקלפים למשתנה .1:, ל-א: מועבר המספר 21, ול-8: מועבר מספר אקראי " בתחום (1..52). בכל מחזור מוצב האיבר ה-8: של ,1: בתחילת רשימת הפלט של המחזור הבא. בכל מחזור חדש מקבל המשתנה 12: את רשימת הקלפים ללא האיבר ה-ַ: של המחזור הנוכחי. הסרת איבר זה מן הרשימה מתבצעת על-:ד: הפונקציה מצמזעס, כדי שלא י*יבחר קלף כלשהו פעמיים. ערך המשתנה א: מופחת באחד, ו-2: של המחזור הבא מקבל מספר אקראי חדש בתחום ("מספר הקלפים הנותרים"..1). הגדרת משזטס 1 ת: מפשוסת 70 [.1ז: עפ 09] 1 = ת: טך ((1ן: עפ 1 -כת: מםנמס) ם1: לפתדע שטפק פס פאם המשתנה 8: משמש כמונה בשיטת הספירה לאחור. כל עוד אין ערכו שווה ל-'1' מוצב האיבר הראשון של הרשימה בתחילת רשימת הפלט. במחזור הראשון, כאשר 8: הוא '1', מוחזרת רשימת האיברים הנותרים ללא האיבר הראשון, שהוא האיבר ה-3:. זהו הערך ההתחלת* לחישוב כולו. - 201 - פרויקט: (יחו? קלף - רימה חד-מימדית את התכנית לניחוש קלף אפשר להגדיר גם באמצעות רשימה הד-מימדית. עלינו יהיה להחליף כמה מהפונקצ*ות שהגדרנו בפרויקט הקודם, כאשר עסקנו ברשימות דו-מימדיות. הגדרת 0085504802 2 0 ([] 080058) 0822 2כת0 0802 11 מצד תע פא פונקציה זו דומה ל-008956482. היא פונה ל-0822 במקום ל-כ08, אך הפונקציות הקודמות 648252, 080055 ו-088 נשארות ללא שינו'י. הגדרת 0802 1: 0822 10 [3 4] 581008508 07 1 7 פאתת [ " תפ] 7 צגמקפת [ >>> מתמא מאז.] שא =ס סא מצד פפמתק <<<] הק [ " מקצד] 10 דאפקפת [ >> 15 0495 תטסצ <<] חק 1 ₪0 12אזסתק 05 פאם 2 מציגה באמצעות. ץזאהת את 21 הקלפים על המסך ומאפשרת להקיש את מספר השורה בה נמצא הקלף הנבחר. אחר-כך היא פונה ל-12א01ע לערבוב הקלפים, בהתאם לתשובת המשתמש. - 202 - הגדרת ‏ א)אחק א: א: 7א13: ת]אתק 70 [09עפ (א: [סא פא11] <==" תק)] 7א13: קצדקום שד [פ510 1 + א: 7 7א13: ת]אתק סמ2ג] 1 > א: סד ( " 7א13: צפתדת מפצד) א: 1 - א: [א13: סם ש]אתס פאם הפונקציה א]אתת מקבלת למשתנה [א13: רשימה של 21 איברים ברמה אחת. באמצעות המשתנה-מונה א%: (בשיטת הספירה לאחור), היא מציגה ] איברים בשורה. בתום כל שורה, כאשר א: קטן מ-1, היא פונה ל-₪4280 לציון מספר השורה א: על המסך, והצבת הסמן במקום הרצוי להדפסה הבאה. לאחר מכן מתבצעת קריאה רקורטיבית כשהערך ] מועבר ל-א:, א: גדל באחד ‏ ו-]א123: נשאר ללא שינוי. שים לב, ההוראה 5105 המופיעה בסוף משפט תנאי זה, מסיימת כאן את אותו המחזור. כל עוד א: גדול מאפס, מוצג האיבר הראשון של הרשימה, והביצוע עובר למחזור הבא. המשתנה ]א13: מקבל '[א13: חם', ו-א: קטן ב-1. הביצוע מסתיים כאשר הרשימה ][א13: הופכת לריקה. הגדרת ₪200 סמל 70 (א: [0א 8א11] <==" מפצץ) 3 3 + (008508 צפת1ק) 58 500508 פאס - 283 - הגדרת ‏ 172א201 אפפת: ק: 2עאדסק 70 [3 2 1] ע: סתממאחא צפמך [אפמת: 80 2עאדסק פס] עעד [(18 אפתת: פא50) עסתשא5 ת0] 1 = ק: אד [אפמת: 580001 00] 2 > ק: פך (7 מפמת: פא50) 51301 פס פאת הפונקציה 12א01ע מקבלת את ערך המקש שהוקש במשתנה ק:, ואת רשימת 1 הקלפים ‏ - ב-8פמת3:. השורה שבה נמצא הקלף הנבחר תיאסף שניה ולכן, אם ע: הוא 2, הפונקציה 72א201 פונה לפונקציה 580801 ומעבירה את הרשימה הפמת: כפי שה*א. נוכל לנצל את העובדה שהרשימה ה*א בת רמה אחת ולהשתמש בפעולת הזזה סיבובית שמאלה. הזזה סיבובית שמאלה פעם אחת פירושה: להעביר את האיבר שבמקום ם אל מקום 1-ם, וכך לכל אחד מהאיברים. את האיבר הראשון יש להעביר למקום האחרון ברשימה. אם פ: הוא 1, בפעולת הזזה סיבובית שמאלה 1% פעמים נציב את 7 האיברים הראשונים החל מהמקום השמינ*י בהתאמה, האיבר הראשון במקום השמ*יני, האיבר השני במקום התשיעי וכן הלאה. אם הערך של ע: הוא 3, בפעולת הזזה סיבובית 7 פעמים נציב את 7 האיברים האחרונים מהמקום השמיני בהתאמה: האיבר ה-15 במקום השמינ', האיבר ה-16 במקום התשיעי וכן הלאה. פעולת ההזזה מתבצעת על-ידי הפונקציה מא50. - | אם 2: הוא -1, מועבר ערך הפונקציה 2א50 כקלט ל-01ת5710 לביצוע 14 הזזות - (18 אפמת: כפא50) 510801 05 - | אם ק: הוא 3, מועבר ערך הפונקציה א50 כקלט ל-צ5800 לביצוע 7 הזזות - (7 זפמת: פא50) 502 פס - 208 - הגדרת כא50 1: 2: פאספ 70 [ע: פ0] 1 6 1: שך 1 1: (ם: עם 2: עפתדע צשפ1) פא50 פס פאם הפונקציה 510801 מחזירה את רשימת הקלט במבנה מתאים, לשם הדפסה על-ידי ע]אתק. האיברים יופיעו ב-7 עמודות, כשהם מסודרים עמודה אחר עמודה מלמעלה למטה. בטורה הראשונה יודפסו 7 נתונים, שהראשון בהם הוא האיבר הראשון, לידו האיבר הרביעי, אחר כך השביעי כלומר, בדילוג של 3 איברים מזה שהודפס אחרון. השורה השניה תתחיל באיבר השני ואחריו יבואו שאר האיברים בדילוג של 3. בשורה השלישית יופיע במקום הראשון האיבר השלישי ואחריו שאר האיברים בדילוג של 3. הגדרת 510801 2: 5001 10 (1 2: עם עם עסחד 1 2: עם תעסחד 1 ם: תסתד 8פ) קפס סא 01 משתמשת בפונקציה ע180 המחשבת את האיברים של כל שורה. הגדרת עסתך א: 2: עסתד סד [[] פס] : פעצצקאם עד [3 ם: עם ע0ת1 2: 1פתדע עספע ק0ס] 1 > א: עך 1- א: 2: עם עסתד פס פאם להרצת התכגית נרשום הפעם --67, 0-2 = 205 - תרגילים (המשך) .90 .1 .2 .3 18 כתוב הליך אשר מקבל קלט למשתנה %:, לקביעת הסמן בעמודה א:, באותה השורה בה הסמן נמצא. כתוב הליך 508 המקבל קלט למשתנה צ:, לקביעת הסמן בשורה צ:, באותה העמודה בה הסמן (מצא. הגדר תכנית המקבלת טבלה, שבה אטסא: א'י-זוגי של שורות ועמודות, ובודקת אם היא מהווה ריבוע קסם. בריבוע קסם סכום האיברים בכל שורה שווה לסכום האיברים בכל עמודה ולסכום האיבר*ם בכל אלכסון. הגדר תכנית המחזירה פלט של טופס אחד של המשחק 00א81, לפי התיאור הבא: בטורה הראשונה תופיע המילה 00א81, עם רווחים שווים בין אות לאות. מתחת לזה תופיע טבלה של 5*5, שכל איבר בה נבחר באופן אקרא* בתחום (1..75). העמודות תסומנה באותיות השם 00א1ַם, ובכל אחת מהן יהיו מספרים אקראיים מן התחום המותר, כמפורט להלן : מספר עמודה כותרת העמודה מספרים אקראיים בתחום 1 8 1.5 2 1 1.50 3 א 2.05 8 0 00 5 0 5 אסור שאיבר אחד יופיע פעמיים באותו טופס. כתוב תכנית ליצירת דף של לוח שנה של חודש מסוים. התכנית תחשב כמה ימים יש באותו חודש, ובאיזה יום בשבוע הוא מתחיל. תוכל להיעזר ב-"לוח התאר:ך" המופיע ב-"*ומן לתלמיד". יש המכנים אותו בשם "הלוח התמידי". - 246 - 5. הגדר תכנית ליצירת ריבוע קסם, ‏ עם ערך 15א: אי-זוג: של שורות ועמודות. אם אין לך רעיון או דרך אחרת, תוכל להיעזר בהנחיות הבאות: א. 1 ו. הצב את המספר '1' בעמודה האמצעית א: של השורה האחרונה צ:, אם זה עתה הצבת ערך בשורה האחרונה כאשר 15א: ‏ = ץ:, עבור לעמודה 1+א: של השורה הראשונה (1=צ:) להצבת המספר העוקב הבא. לאחר הצבת ערך במקום כלשה יש לעבור לעמודה הבאה (1+א:) של השורה הבאה (1++:). אם זה עתה הצבת ערך בעמודה האחרונה (815:=א:), עבור לעמודה הראשונה (1=א:) של השורה הבאה (1++:), להצבת המספר העוקב הבא. אם נמצא כבר ערך במקום הבא בתור, יש לעבור לעמודה ‏ א: של השורה 1-+:, ורק שם להציב את הערך הנוכחי. אם זה עתה הצבת ערך בעמודה האחרונה של השורה האחרונה, כאשר %8=:815: וגם 15א/:=צ:, עבור לעמודה א: שבשורה 1-צ: להצבת המספר העוקב הבא. תהליך זה יסתיים כאשר הערך המוצב יהיה שווה ל-פזא * :1 הנרדיקט קוו פונקציות הקלט תגהסקהמת ו-1151תגמת מיועדות לקלט של תו או רשימה. בלוגו קיים הפרדיקט עצמא אשר מחזיר ערך 'אמת' במקרה של הקשת תו במקש כלשהו. נניה שבמהלך תכנית מסוימת יש למדוד את משך התגובה של המשתמש. הספירה צריכה להמשך כל עוד לא הוקש תו, ולהסתיים ברגע שהוקש. נכתוב פונקציה אשר תבצע מדידה זו. - 27 - הגדרת ‏ 5718 א: 184ת5 70 [5109 א: תק] פצמא סד 1א: תפ פאם נרשום ---> 1 184תפ? לאחר שהות מה נקיש את האות '4' למשל, ואז יודפס ערכו של המשתנה א: וגם האות '4'. השימוש ב-קצט₪א לא גורם לתכנית לעצור על מנת לקבל את הקלט הדרוש כמו ב-1517ת4מת, או ב-תבאס0קגמת, אלא הביצוע ממשיך עד להקשה של תו כלשהו. ערכו של התו שהוקש נשמר על-ידי פצמטא באוגר זמני אשר משמש להעברת נתונים. על ערך זה לא מתבצעת כל פעולה שה:א והוא מועבר אל המסך עם סיום התכנית. כל עוד מכיל האוגר תוכן כלשהו, ערכו של פצטא הוא 'מטתד'. תנאי הסיום לביצוע ההליך גת1ת5 הוא 'קצטא א1', אך במשפט זה מותנית גם הדפסת ערכו של א:. אם נשמיט את מילת הסיום ‏ 'ק510', הדבר יביא להדפסת כל הערכים של א: המתקבלים במהלך ביצוע ההליך, מרגע ההקשה. מסקנה: ערכו של פצטא הוא משתך1 ללא שינוי, כי ערך המקש עדיין שמור באוגר. ניתן לשחרר את האוגר מן הנתון המוחזק בו על-ידי קליטת הנתון באמצעות הפונקציה סַ. הגדרת ‏ 571841 א: 591841 10? [5109 ₪0 אסעת א: תק] סצטא חך 1א: 41ת1ע5 פאם - 28 - הגדרת [וססת3 תגט: הספת 70 פא כאשר נרי הפעם את 1841ע5 יודפס רק ערכו של א:, בלי ערך התו שהוקש. ההליך 51841 פונה ל-אסכת3 כשהוא מעביר למשתנה הג?: את ערכו של המקש באמצעות 86. כך משתחרר האוגר מן התוכן שהיה בו, וערכו של פצטא הופך שוב ל-'מפוגת'. מתעוררת בעיה כאשר המשתמש הוא ילד קטן למשל, אשר לוח על מקש ואינו מרפה ממנו מיד. במקרה ‏ זה נאספים באוגר תווים אחדים. ההליך הבא מיועד לטפל בשחרור של האוגר מכל תו שהוא. הגדרת 85סס8 תגט: פאספת 10 [ס3 פאסכת] פצסא פך פא פרויקט: דוגמה ליישום לומדה לגיל הרך התכנית מציגה שלוש אותיות הנבחרות באופן אקראי מרשימת אותיות נתונה. אחת משלוש האותיות שנבחרו משורטטת בשיטת הגרפיקה למחצה בחלקו העליון של המסך. הסמן מדלג עם שהות מה, בין שלוש האותיות שנבחרו. על הילד להקיש מקש כלשהו כאשר הסמן מצביע על האות הזהה לאות המופיעה בראש המסך. כשהתשובה נכונה משורטט צ/581 בצדו השמאל* | של המסך, אחרת ‏ - מופיע עס התכנית מאפשרת לשחקן לצי ין את מספר הפעמים שהוא מעונין לשחק, ואת זמן ההשהיה בין פעולות הדילוג של הסמן. - 29 0 הגדרת צ8זק טאזד: אטא: עגפ 70 [5108 1 23 5108] 1 > אטא: עד [אא ... ... ממא01 צדמם תמתה] 3 [] 501807 סם פגוססת דס מאנ: 1 - אשא: צגות פאם צג,זת יפונה ל-5₪1₪01 לבתירת 3 אותיות מתוך רשימה נתונה, ומשם - להמשך התכנית. בתום כל משחק פונה צ1/8ק ל-5אסכת3 על מנת להחזיר את הערך ‏ '418₪ק' ל-קפעמא, כדי שיהיה מוכן לפעם הבאה. הביצוע נפסק כאשר מסיימים את כל אטא: המשחקים. ההליך 8108 הוגדר כקיצור להוראה 501008508: א: צ: 5108 70 א: צ: 5₪ 1008508מפ פא 07 משתמשת ב-517 בביצוע רקורסיה עקיפה לבחירת האותיות באופן אקראי. הפניה ל-ע/את8 נעשית כדי למחוק את האות שנבחרה מן הרשימה, ולהבטיח בחירת אות אחרת בכל פעם. הגדרת | 501801 1 א: 187: 501/07 70 [פס81 (182: 1 + (3 אססאגת) אמדד) 187: אדגא 151: אתפ] 1>א: קך 1 א: 187: (ם: 1 + (ם: עאטסס אספאגת) אמעד) 57 פאם הגדרת ‏ 5707 ע: א: 1פדע: 0871: ע/5 70 (1: 081: שאת) 1 - א: (1151: 0871: עשקע) 07מוזתס פאם - 250 - הגדרת עאת 2 0871: טאת 70 [ם1: 05ס] 1: סצדקאם שד ₪ עפתדע = 087: צפמך [,11: עם 081: עאת קס] וחד [(1: עם 087: טאת) 10: עפתדע צטשפע פס] שפד פאם לאחר בחירת שלוש אותיות שונות, פונה 580807 ל-אמעם לשרטוט האותיות שנבחרו, ולאחר מכן היא פונה ל-אזגא (אשר נגדיר בהמשך) להצגת אחת מאותיות אלו בחלק העליון של המסך. הגדרת שתכ 3: אתספ 20 3 12 5108 3: פפתצע פד 1 שהמקמת 6 12 5108 3: פם עפתדע עפדם 1 צגמקמת 29 12 5708 3: 1058 1157 1 שהמקמת פאם בהגדרת 28 השתמשנו בהוראה ז4מעמת כדי לבצע מספר פעמים רשימה של הוראות. ההוראות ברשימה יכולות להיות שמות של הליכים המוגדרים במחשב. אם למשל, קיים הליך שטתג011כ - נוכל לרשום ---> [פטתהווסכ] 1 צהמקסת? מאחר ש-1גמקטת פועלת רק על רשימה, נוכל לרשום זאת גם כך - סטתהוסת" צפדע 1 שהמקסת? כזכור, הפונקציה 1157 בונה רשימה המכילה את ערך הקלט שהיא מקבלת. אם הקלט הוא נתון קבוע, מוחזר נתון זה ברשימה. אם הקלט הוא משתנה, מוחזר ערכו של המשתנה ברשימה. - 251 - אם לדוגמה, ערך המשתנה א: הוא '777' ערך הביטו* 'א: עפך:' יהיה שווה ל-'[777]'. כך הדבר, אם ערכן של המשתנה 00תק: הוא המילה 'שטתה1זסת' - ערך הב*טו* 'ססתק: 1197' יהיה שווה '[קט2011880]'. במקום הפונקציה 1.15% אפשר להשתמש בפונקציה 55. תכונות אלו מאפשרות להגדיר משתנה, שערכו הוא לא רק נתון שיש לבצע עליו חישוב. כאשר מציגים משתנה בתוך רשימה, הוא :כול להיות בעצמו חישוב הניתן לביצוע (אלגוריתם). נניח שלא ננצל את התכונה של המקמתה להפעיל הוראות מתוך רשימה. במקום זאת נפנה להליך תמת0ם, כדי שיבדוק מתוך רשימת כל ה"אותיות" המוגדרות, איזו אות עליו לשרטט. 3 עפתדק 0161 1 להמקמת 3: פפתזע המתסם למשל, במקום לרשום: נרשום את המשפט הבא: . את 80888 נגדיר כך: 24: תמתסם 70 [תפן8] עמעג" = 2084: עך [צדסם] צדמם" = גת20: עך [,ממאד0] מטאדס" = 2084: עד [אפא] אמא" = ג208: עד פאם בהליך 80888 עורכים השוואות כמספר הצורות המוגדרות בתכנית. כלומר, אם מספרן הוא 22, צריכים לרשום 22 משפטי תנאי. באמצעות "מקטת התכנית הפכה פשוטה *ותר, וחסכנו בבדיקות מיותרות. נשתמש בהוראה זו גם בהגדרת התכנית אז1גא. אזגא משרטטת את האות שאתה נעשית ההשוואה, ואחר-כך היא פונה ל-צזתק. - 252 - הגדרת אזגא 1: 23: אצגא 70 6 1 תפ 1: 15 1 עהמקחת 1 3ע: צזס פאט הגדרת צזק 1 3: צעק 70 ₪ 17גא 6 22 5708 [5109 0871: 23: (ת0פתש0 1457) אסם] פצסא סד מאזד: ₪417 19 22 708פ [5109 081: 23: (00508 157) אסם] סצסא קד מאזץ: עזגט 32 22 תהסדפ [5109 081: 13: (008508 97ה1) אסם] קצסא סך 1ס: 23: צזק פאם ב-צ0פ מדלג הסמן מאות אחת לחברתה, כשהוא מצביע בכל פעם על אות אחרת עם השהיה מסוימת. את זמן ההשהיה נקבע במשתנה 8₪א11: המוגדר בהליך צגתע עוד בתחילת התכנית. 8א11: הוא משתנה 'לא-מקומ:' (10081-תסא), ולכן הוא מוכר על-ידי הליכים ברמה נמוכה :ותר בתכנית. מיותר היה להעביר את ערכו מהליך אחד לאחר, מכיון שערכו נשמר כפי שהוא, בכל זמן ביצוע התכנית. צעם פונה ל-אסם ברגע שהמשתמש לוחצ על מקש כלשהו. הגדרת 80% 01: 23: א: אכם 70 6108 1 2 [50 9411 [ענצתס] [ענדא5] 081: = 23: עפתדת ק1] 6 = א: חך [50 דהא [צנצתס] [צעאפ] 0871: > 13: עם צפתדק ע1] 19 = א: סך [50 411 [צעצתס] [עונאפ] 087: = 13: 187 עד] 32 > א: סך פאם - 253 - ב-א25% בודקים אם ערך הקואורדינטה א%:, בה היה הסמן בעת ההקשה, מצביע על המקום של האות הראשונה. אחרת, עורכים את הבדיקה עבור האות השנ*ה ולבסוף - עבור האות השלישית. במשפט שבו ערכו של א: מקיים את התנאי, בודקים אם האות עליה מצביע הסמן זהה עם האות העליונה. בהתאם לתשובה, ההליך פונה ל-%/1א58, או ל-צןעת0. זה למעשה עיקר התכנית. לא מובאים כאן ההליך צ/5%1, או צעצתס, וגם לא ה"אותיות" המופיעות ברשימה, שאותם תוכל להגדיר בעצמך. נציג לדוגמה שרטוט של אחת האותיות, האות "בית": הגדרת ‏ 8811 צזמם 70 5 מפצץך [סטא ] 6 ץהמקמת 5 - (008508 1451) 008508 1351ע ת6זס 5%" מפצץך סאם ההליך דזעם משתמש בהליך פטא8, אשר מדפיס את הסימן ‏ '%' ולאחר מכן מציב את הסמן מתחת לסימן שהודפס. הגדרת 4900 פטאה 70 1 - (008508 14517) 1 + (0020508 צפהדקע) 570 6" מקצך פאם מומל לתת בתחילת התכנית הסברים והנחיות על דרך המשחק, להציג למשתמש הודעה בה הוא מתבקש להזין את מספר הפעמים שהוא רוצה לשחק, ואת זמן ההשהיה שהוא מעונ'ין בו. הערה: בתכנית שהוצגה ק*ימים נוסף על המשתנה שא11': משתנים אחרים 'לא-מקומיים'. העברת : ערכיהם להליכים ברמה נמוכה *ותר היא - 284 - מיותרת בקטעים מסוימים, מכיון שהם לא משתגים בחלק זה של התכנית. נסה למצוא אותם על מנת להסוך בהגדרת משתנים. ההראה 1/1 - הרתבות כל הוראה שניתן לרשום במצב הרגיל של לוגו, יכולה להיות אחת מהוראות רשימת הקלט של עמפמת. כאשר ערכו של משתנה הו שם של הליך, ניתן באמצעות ההוראה צגמקפת לבצע את ההוראות הכלולות בו. למשל, לא נוכל לכתוב הוראה כמו ---> 2 / 10 + 4? וגם בתוך ךטטמת, אין זה אפשר'. אם נכתוב ---> [2 / 10 + 8] 1 שגמקתת? נקבל הערה: 9 1 0 10 צגוחו שסאא י''אסס ד ץמפטת אינה פונקציה המחשבת ערך ולכן, לא נוכל לרשום ---> [2 / 10 + 8] 1 שהמסתת תק? עלינו לכלול ברשימת הקלט הוראות לביצוע, ולא חישובים המחזירים ערך, כנהוג עם פונקציות למשל. משפט נכון יהיה לדוגמה ---> [2 / 10 + 4 תע] 1 עגמקסת? דוגמה נוספת ---> [(6 5 5% 3 א50) מפצד] 1 המקתת? לדוגמה נגדיר פונקציה הפועלת בשיטת הכתיב הפולני בהילוך לאחור (תסנטה8טסא ב20118 86ע62ט6ת2). בשיטה זו מציגים את פעולת החשבון בסוף הביטוי, אחר* שני הנתונים שהיא פועלת עליהם. למשל, נתון הביטוי: 7 + 45 נכתוב אותו כך: + 17 85 כזכור, בכתיב הפולני המקובל פעולת החשבון נרשמת בהתחלה, בצורה הבאה: ‏ 17 85 + - 255 - נכתוב פונקציה 058קפת3, המקבלת שלושה קלטים (שני מספרים ואחת מפעולות החשבון) ומחשבת את ערך הביטוי. הגדרת ‏ 541קפה/3 ב,נטמק: 2א: 2א: הפתקפתטת 70 [2א: + 1א: 05] +" = העמת: עך [2א: - 1א: 0] -" = געמק: סך [2א: * 1א: ק0] *" = המטחק: עך [2א: / 1א: תס] /" = המטמק: שד פאט ב-51.[קפתעת רשומים 4 משפטי תנא* כמספר פעולות החשבון. אם מספרם היה גדול יותר, ה*ה צורך במספר רב *ותר של משפטי תנא'י. שים לב, כי לא ניתן להשתמש במשפט '2א: גמססק: 1א: 02'. הערך של ,מעמס: בביטוי זה הוא הסמל של פעולת החשבון, אך לא הפעולה עצמה. וכך, הקלט של 05 הוא 1א: ולא ערך הביטוי. כפי שלמדנו, 05 פועלת על ערך אחד בלבד. גם המשפט '(2א: ב,טמק: 1א: 5₪) 05' לא יענה על הדרישה. כאן, תחזיר 00 רשימה המכילה את שלושת הערכים. לדוגמה: אם 9 = 1א:, 4 = 2א: ו-%" = גטמק:, ערך הביטוי המחושב על-:די הפונקציה 55 הוא '[84 * 9]'. כלומר, 05 מקבלת רשימה המכילה סמלים המרכיבים ב:יטו* חשבוני' ולא את ערכו של הביטו* החשבונ'י. אם 05 תקדים את הביטוי בתוך הרשימה, היא *כולה להעביר את ערך הביטוי למי שפנה אליה. נרשום: (1א: מטעק: 1א: פס" שפ) על פי הדוגמה הקודמת, הר* זה כאילו רשמנו [84 * 9 02]. כאן, הקלט של 00 הוא ערך אחד 36, השווה לערך הביטוי '8 * 9'. זהמקטת מפעילה הוראות המופיעות בתוך רשימה, ולכן נוכל להשתמש בה בהגדרת 1582קפהע/ת. - 206 - הגדרת 512עפתטת : 2א: 1א: 2חספתטת 70 (2א: בתטטק: 1א: פס" מפ) 1 דהמקסת פאם הפונקציה תא יכולה לפעול על יותר מאשר שני נתונים, אם נתחום את כל ההוראה בסוגריים עגולים. לדוגמה, (18" 00" |" 02" 00" פתסט) לדוגמה, נתונה רשימת המספרים [38 360 23 [] כערך של המשתנה 5, עלינו להרכיב ממספרים אלה מספר אחד. לא נוכל לרשום את הביטוי 'פת3: פת0ש', כי 08085 פועלת על ערכים ולא על רשימות. אבל, באמצעות הפונקציה 58 ניתן יהיה לצרף את המילה פת0ש" יחד עם איברי הרשימה לרשימה אחת. לדוגמה, הביטוי 'פ3: פתסא" מפ' יהיה שווה ל- [38 360 23 7 פתסש] הביטוי שברשימה עדיין לא תקין לחיבור כל האיברים למילה אחת, כ: חסרים בו הסוגריים העגולים. לכן נתקן זאת בדרך הבאה: ( (" פת: עתסא" )" 5₪) הפעם נקבל את הרשימה הבאה: [( 25 360 23 7 פתסט )]. מכיון שהביטוי להרכבת המילה מופיע בתוך רשימה, נוכל להשתמש במשפט המכיל את הצמד ץ'מפטת/ 09 לקבלת הערך של הביטו'. הגדרת כתסשטאס 5: פתסמאס 70 ( (" פ5ת: עתסש" )" ק0" ₪פ) 1 להמקטת פא כאשר נרשום ---6> [7890 156 23 1] פתסאמאס מק? נקבל: 100 - 25] - זהמפתת א*ננה פונקציה, ולכן אין המשפט המורכב מהוראה ‏ זו *כול לשמש כחלק מביטוי חישובי, או כערך למשתנה כלשהו. תפקידה העיקר* של וגמקטת הוא בביצוע חוזר של סידרת הוראות בלולאה. להפעלת הוראות הנתונות בתוך רשימה והפקת פלט מהם, משתמשים בפונקציה אשטת. הפ נקציה ות אטת היא פונקציה אשר הקלט שלה הוא רשימה, והפלט הוא תוצאת החישוב על-5* הרש'מה. במילים אחרות, היא קוראת את הכתוב ברשימה, ומבצעת את ההוראות שהיא קוראת. תוכן רשימת קלט של אשת יכול להיות - | הוראות לביצוע 8 ביטו* חישוב: א. הרשימה יכולה להכיל הוראות או הליכים, כפי שראינו זאת בהוראה 1מפטת. ז"א, התוצאה של [רשימת הוראות] אשת שווה לתוצאה של - [רשימת הוראות] 1 צהמקטת לדוגמה נוכל לרשום --%7 [[4315ת 5ט0 1] תק] אטת? וגם ---> [פטגג. 01 ] אטת? ב. אשת היא פונקציה, ועל-כן היא יכולה לפעול גם על ערך המוחזר מביטויים חישוביים. יש להורות למחשב מה לעשות בערך שחושב על-ידי אשת עצמה, בדומה לפונקציה הבאה: 7 פאתקס 70 (187: 00" 58) 1 שאמקתת פאם הפונקציה :028% מקבלת כקלט למשתנה ‏ 187: רשימה, המכילה ביטוי חישובי, למשל [81 %ת50]. ערך הפונקציה <אמק0 הוא תוצאת החישוב של הביטוי המופיע ברשימה, שבמקרה שלנו שווה ל-9. 0 208 -= פאםקס היא פונקציה, ולכן ‏ יש לפנות אליה באמצעות הוראה כלשה*י הפועלת עליה. לדוגמה, נכתוב --7> [81 5081] פאמקס הק? ונקבל: 9 נוכל לומר שהמשפט הזה קיים: [ביטוי חישובי] אשת > [ביטוי חישובי] סאמס0 לדוגמה ---> [2 / 10 + 2] אשת חק? וגם ---> [81 56081] אטת חהק? אם הערך של המשתנה אץע: הוא '50%1', וב-15א: יש הערך '81', נוכל לכתוב את הביטוי הבא: (15א: אשת: 1151) אטסת שים לב - הרשימה [81 50(1] אינה שווה לרשימה [15א: אשץ:]. נגדיר פונקציה צפת1קע. טא המקבלת במשתנה 1151: רשימת נתונים, ובמשתנה כעעתת: - פרדיקט מוגדר הפועל על קלט אחד בלבד. פרדיקט זה יכול להיות פרדיקט המוגדר בשפה (כמו 1157, סתתמאטא, פפתס), או פרדיקט שהגדרנו בעצמנו. על הפונקציה להחזיר את הרשימה ללא האיבר הראשון המקיים את הפרדיקט. הגדרת 18571ע. עשאת ספתת: 187: דפתדק טאת 70 [1] 09] 181: קצדקום אד (187: נפחדת "" עתסט פמתק: 1187) אטת צפמך [181: תם ס] עשד [(פמתק: 181: עם 7פתדק.עאת) (187: דפתדק) עטקק 00] קסך פאט נרשום את ההוראה ---> פתטמאטא" [88 עמת 29 אסא] צפתנע. טאת הק? בהוראה זו הרשימה '[88 /עע 29 אסא]' מהווה ערך ל-151:, והפרדיקט 'קתמפאטא' הוא הערך של פטתק:. - 259 - נקבל את הפלט הבא: 8 עמק אסא תוצאת החישוב ש-אטת מבצעת היא ערכו של ביטוי לוגי, הקובע אם האיבר הראשון של 181: הוא מספר (קתממאטא). אסטת פועלת על רשימה, לכן 12151 בונה את הביטוי הלוג* ברשימה. נתון המשפט: (1517: דצפתדע "" סתסשט פמתתקע: צפד1) במשפט זה 1.157 מקבלת שני דברים: - הערך של המשתנה פטתק: - ערך הביטוי 151: לפתדע "" סתסט כידוע, מילה בלוגו צריכה להיות עם גרשיים בתחילתה, אחרת לוגו תזהה אותה כהליך. לכן באה ₪082 ומחברת גרשיים לערך '157: לפהדק'. לדוגמה, במחזור הראשון ערך הביטו*: (151: עפתדת "" פתסשט פמתק: 57ד1) הוא: [אסא" קתממאטא] ₪090 בנתה מילה המורכבת מהגרשיים ומהאיבר הראשון שברשימה, ובכך אפשרנו ללוגו לבצע את החישוב ומנענו שגיאה תחבירית. תרג'לים (המשך) 6. הגדר פונקציה המקבלת רשימת מספרים, ומחזירה אותן כמילה אחת ללא הסיפרה הראשונה. על הפונקציה להיות מורכבת ממשפט אחד בלבד. 1 הגדר פונקציה פתשאטע אשר יש לה שני משתנים: אשע: ו-פתשע:. המשתנה אש0ע: מקבל שם של פונקציה הפועלת על מילים (כמו 869 זדאם], אסתדק). המשתנה פתש1: הוא רשימת מילים. הפונקציה עתשאעת מחזירה רשימה ובה תוצאת פעולת אטשע: על כל אחד מאיבר* הרשימה. - 260 - .8 .9 אם לדוגמה, נרשום 77-> [פ1וטד' ב1.חזמס 8] פתטת" כפהטאשע תק? נקבל את הפלט הבא: צטזדת פגמוד אספם באחד התרגילים בטיעור קודם, היה צריך להגדיר פונקציה המחזירה רשימה של זוגות הערכים א% ו-+, בתחום מסוים עבור הפונקציה הקבועה (1-א-2א=ץ). הפעם, הגדר פונקציה צאסאטע, אשר מחשבת את הערכים של פונקציה מוגדרת כלשהי אשע: עבור ערכי ‏ << מ-'5-' עד 'פ' בהפרשים של 1, ומחזירה כפלט את רשימת זוגות הערכים א ו-צ. נניח שקיימת הפונקציה | 3א2 לחישוב הפונקציה הבאה '1-א3+2א-(א)ק' כאשר '3אע' מוגדרת במחשב כך: א: 3אע 70 1]- א: 2% + א: * א: א א: ק0ס פא אם נרשום ---> 3" כ- צאסאטע תמק? נקבל: [ 5 ...2 [73- 8-][136- 5-] שים לב, במקום '3אא' נוכל לרשום כל פונקציה מוגדרת אחרת הדורשת קלט אחד, כמו 5007, א51 או 5ם1. אחת השיטות למציאת פתרון למשוואות היא שיטת החציה. השתמש בשיטה זו להגדרת תכנית המקבלת פונקציה כלשהי למשתנה סאשק:, ומחשבת פתרון מקורב בדיוק של 0.0005. הדרכה: מצא תחום בו קיים הפתרון. תחום זה נמצא בין שנ: ערכי א שעבורם ערכי הפונקציה הם בעלי סימנים מנוגדים: 0 > (2א)?*(1א)? תחום זה ישמש כקטע התחלתי לחישוב: א. יש למצוא את נקודת האמצע: 2 (%2+1א) =ם - 261 - ב. אם.0 > (ם)? * (1א)? אזי המשתנה 2א יקבל את הערך של ם, אחרת, 1א יקבל את הערך של ם. ג. תנאי ההפסקה יהיה כאשר 5 >> (ם)? 405 ההוראה ‏ ממעעתססע" שסחזד בתכניות הידברותיות כמו בלומדה או במשחק, רצוי לתת למשתמש בשלב מסוים את האפשרות להמשיך בתכנית או לסיימה. כלומר, ‏ יש לשאול אותו על כוונותיו ולקבל תשובה כן/לא ובהתאם לכך לנהוג. למשל: (א/צ) ? מטא1עא0ס 20 צאגט טסצ 0 ממעם פס" שטסמ' היא הוראה לסיום ביצוע של התכנית בכל מקום שהוא וחזרה ללוגו. ההוראה 5105 למשל, מסיימת רק את ההליך בו היא מופיעה. לכן, כתנאי לסיום התכנית נוכל לרשום את המשפט הבא: [,"מטם פס" שסתוו] 'א' = 6ת עך פרויקט: דגמה ליישום בחישובים עטקיים תכנית ‏ זו משמשת להכנת חשבוניות בחנות לרהיטי גן הסוחרת בחמישה פריטים. תחילה היא מציגה על המסך טופס חשבונית ריק המוכן לקבלת נתונים לחישוב. עם סיום קבלת כל הקלט, היא ממלאת את המקומות המתאימים בתוצאות של החישובים הדרושים. - 262 - הגדרת ]1805 הספת 10 ו 8 5 עש54זזן פמקסגוז ן]ז אק [: (א/צ) ?1דאספמפמו תמותסאג ] מקעד [[] תע] [ממפמע] צ" > 0 סד פאס מזפפן מציגה את טופס החשבונית הריק באמצעות ההליך 45401א. לאחר מכן היא פונה ל-2₪5כ2ג₪ להדפסת תוצאת החישוב המתקבל מ-עשו5זו1. בתום הצגת החשבונית המוכנה, היא מאפשרת למשתמש להכין חשבונית חדשה: [ : (א/צ) ?1דאסמהפטא המתסא ] מפצעיד הגדרת 845401 ₪ 0 0 צזואתהא" מקצד 1 1 אסך5 תשווהא" מקצד 12 1 9708 המזזוע, תזמא" מפצד 20 1 08ךפ אטזת 50" הק 32 1 8108 [] תק [] תע [=" מפצד] 38 דהמקחת [] חק גזאפאדטפ" הק [] תק אגאופ" אק [] אק אג0א.1558א" הק [] תק 1958א" אק [] אע גפמאפגא" הק [] פע [=" מקצד] 38 צאמקפה 0" תק 18 16 5108 (א4הא" 15%" תק) 18 18 8708 [ " מקצד] 20 ץמקפת 18 19 5708 הט" תק 18 21 5108 פאם = 203 - 8 משתמשת בהליך 5108 המוגדר כקיצור ל-9₪1008₪508. לאחר ביצוע 5801א, נקבל את הפלט הבא: אטחת50 הכפדחצ.תדחא | נשאגא תו ב אגז וס .א ₪ 4סטאפגא 0 אגא 15% 8 הגדרת /₪81580 צ: א: טטאפנא 70 [[] ?0] 1 > א: אך 8 צ: 508 2 + צ: 1 - א: טשחפנע (1 ס0ת דמועא) א500 צטספע סקס פאם שו מקבלת את הכמות עבור כל פריט באמצעות הפונקציה צמזסת. היא מחשבת את הסכום לכל אחד מחמשת הפריטים באמצעות הפונקציה 8%, ומציבה סכום של כל פריט ברשימה. מאוחר יותר נראה כ*צד משתמשת הפונקציה 50808 ברשימת מחירים נתונה, אשר מוגדרת בתת- פונקציה תזהמא לקליטת מחיר המוצר המתאים. בתום הביצוע של 845808 מוצב הסמן מתחת לעמודה 1שא4א בשורה של הפריט הראשון, ועם קבלת הנתון הוא עובר לשורה של הפריט הבא עד לקבלת כל הנתונים. = 26 - הגדרת ‏ צאזטא א: מפת: עשתטא 70 [ " 05] עעת: 458011 = 13 סד [עעת: ת0] 1 > א: 0 = מעת: 05 סד 1 - א: 0 שמא מכת: פתסט פס פאם זם, זט מגבילה את המשתמש לשתי הקשות בלבד. פעם אחת בקריאה רגילה ופעם שניה בקריאה רקורסיבית. ערך הפונקציה הוא מילה המורכבת מהתווים שהיא קולטת. אם באחד משני המחזורים הוקש <זמת>, ערך הפונקציה של אותו מחזור הוא המילה הריקה. התוצאה של יוזסא משמשת קלט עבור א500. הגדרת 50808 עתח: 50 70 [0 05] פתט: פצדקאם חד [0 09] 0 = פתא: עך [1 36 וטא 5008 ס] פתשט: קתממאטא סא שד סתא: מקצך 3 ( 000508 עפתדקת ) 5108 הזוזמוץ מקעיץך תנמא * פתחא: פס פא זפ מחשבת את הסכום עבור כל פריט, אם ערך הקלט הוא המילה הריקה, הרי הסכום הוא אפס. כך גם כאשר ערך הכמות הוא אפט. - אם ערך הקלט איננו מספר, מתעלמת 50108 מהערך שנקלט ומבצעת שוב פניה ל-₪1]₪% לקבלת קלט מתאים. - | אם הקלט הוא מספר, מודפסים הכמות והמחיר, המחושב על-:די הזוא. ערך הפונקציה במקרה זה הוא 'כמות * המחיר'. ₪5 205 = הגדרת ‏ הזחמחא הזחטא 170 [250 280 210 160 950] א: אמחד 05 פאס הנמא מחזירה את האיבר ה-א: מרשימת המחירים. הפונקציה 815800 בונה רשימה שכל אחד מאיבריה מהווה את הסכום עבור אחד מחמשת הפריטים ולכן היא מתבצעת בחמישה מחזורים. ערכו של א: הוא בתחילה '5', ובכל קריאה מופחת ממנו אחד. התזהמא היא פונקציה ברמה נמוכה *ותר, אשר משתמשת בערךך של א: המוגדר בפונקציה עטשא5דתא. שים לב כי הספירה מתבצעת לאחור, ולכן המחירים מסודרים בהתאם בתוך הרשימה. הרשימה המתקבלת על-*ד* ₪158 מהווה קלט עבור ההליך פטקעגת אשר מדפיס את הסכומים, מחשב ומדפיס את התוצאה לתשלום. הגדרת פטססגת 51 פמפפגא 10 8 157: צטסצס 2 16 5108 ( (" 161: אטפ" )" 58) את צטספצך פאם ההליך ₪5ק140 פונה לפונקציה 2/1001 להדפסת הסכום עבור כל פריט. לאחר מכן היא פונה לפונקציה 192001 ומעביר לה קלט שהוא מחיר הקניה המחושב על-יד* הביטו: ( (" 151: אספ" )" 58₪) אטת - 266 - הגדרת תשסי/זק צ: 1: עטסעמת 70 2 ע: 9708 [9109] ,1: קצדקוום שד 0 = 1: דפתדק [פמיך [- " מפצד] עא1 [1: צפתדע עמחק מפעץ] שפד (צ: + 2) : סם צטסדזק פאט עטסעקת מדפיסה בעמודה של הסכום את סכום הקניה לכל פריט. אם הסכום שווה לאפס עבור פריט מסוים, היא מדפיסה קוו '-' באותו מקום. אחרת, היא מדפיסה את הסכום ביישור סיפרת האחדות, באמצעות הפונקציה עמתק. הגדרת ‏ זמחתק א: עפתק 70 [א: 0] א: עאט0ס > 4 שד (א: " פתסט) עשחק פס פאם עמתת מחזירה את הקלט שלה, אשר מורכב מ-5 תווים. כל עוד מספר התווים בקלט קטן מ-5, היא מצרפת תו רווח בצד השמאל'. הגדרת 1ס0קצך זדד: צשספצץ 0 1: תשתק טפצץ 5108 18 2 5 > עד: עאד עמתק מפצץ 2 21 5108 5 >= עתת: עאז זשתק הק פאם 2 207 ₪ עטספצי' מקבלת למשתנה .11'': את ערך הסכום הכולל של הקניה. תחילה היא מדפיסה אותו, לאחר מכן היא מדפיסה את הישוב המע"מ ולבסוף - את הסכום לתשלום. כךך מתקבל טופס חשבונית מוכן למסירה ללקוה. אם רוצים לקבל את החשבונית במדפסת, הדבר ניתן על-ידי לחיצה על 'ספטפק+1?0םת5', בעת שהטופס מוצג על המסך. תרגילים (המשך ) 0. כתוב תכנית לתרגול פעולות החשבון. התכנית תבחר באופן אקרא: שני מספרים בתחום (1..99) ואת פעולת החשבון. התכנית תציג את השאלה בצורה נאותה, תבדוק אם תשובתו של התלמיד אכן שווה לתוצאת החישוב, ותגיב בהתאם. ערוך את התרג*ל בצורה נאה על המסך. 1. כתוב תכנית המציגה למשתמש רשימה של דברים שיש בהם מן המשותף, ורק איבר אחד בה יוצא דופן. למשל, רשימה של מדינות באירופה, וביניהן מדינה אחת השייכת לאסיה. אפשר להציג לדוגמה רשימה של רהיטים וביניהם שם של פר:* כלשהו. על המשתמש לגלות מהו האיבר יוצא הדופן. הוא יכול לעשות זאת על-ידי הקשת המספר המציין את מקומו הסידורי של אותו איבר ברשימה, ‏ או על-:יד" איות השם. התכנית בודקת את התשובה ומגיבה בהתאם. תוכל להגדיר רשימה הכוללת כמה רשימות כאלה (למשל 5% רשימות הכלולות ברשימה אחת), והתכנית תציג את הרשימות זו אחר זו. אפשר להרחיב את הפתרון ולתת דיווח על מספר התשובות הנכונות מתוך השאלות שנשאלו. - 268 - .2 .3 כתוב תכנית הבוחרת מספר אקראי כלשהו בן 3 ספרות, ומבקשת מן המשתמש לנחש אותו. כל סיפרה במספר תופיע פעם אחת בלבד, ולמשתמש יינתן מספר מוגבל של ניחושים. מהלך התכנית דומה בעיקרו למשחק 'בול וקליעה', שבו אחרי כל ניחוש יינתן רמז בדבר התוצאה: א. עבור כל סיפרה נכונה בערכה, אך אינה מופיעה במקומה הנכון,יוצג התו 'א' המרמז על קליעה. ב. עבור כל סיפרה נכונה גם מבחינת מקומה המדויק במספר, יוצג התו 'פ' המורה על ביל. ג. אם הניחוש אינו מכיל אף לא סיפרה נכונה אחת, תוצג ההודעה: 5 תפסמתתסס סא בתום המשחק הצג הודעה על מספר הניחושים השגויים. תן אפשרות למשתמש לשנות את ההגבלה של מספר הניחושים, כמו למשל על-ידי ההודעה הבאה שתוצג על המסך: 00 20 אמט01 מם תעדט₪ טסצ (א/צ) ?דדא1.1 מז מסאהגס 20 הפנ טסצ ספ אם הוסכם שהמשתמש ישנה את המגבלה, הוא יתבקש להדפיס את מספר הניחושים הרצוי: מתנסמע 00צ פמפפמטס) תס המפאטא אטאדאגא מצד התזאם כתוב תכנית היוצרת מעבד תמלילים פשוט בעברית, אשר האותיות מתוכננות בו בשיטת הגרפיקה למחצה. מספר האותיות בשורה יהיה מוגבל לחמש, ומספר השורות במסך יהיה 3. הנחייה: - הגדר הליך לכל אות. אם המשתמש יקיש את האות 'ב' למשל, תופיע הצורה של האות הזו על המסך. תן למשתמש את האפשרות להדפיס רצף של אותיות בשורה. - | הגדר 'סמן' שיורה על מקום ההדפסה הבאה. = 209 - . .5 ₪ אם 'הסמן' מגיע לסוף שורה, על התכנית להעב:יר אותו לשורה חדשה. - תן אפשרות למשתמש לעבור לשורה חדשה אם רצונו בכך. 2 תן אפשרות לניקוי מסך. כתוב תכנית לחישוב והדפסה של תלוש משכורת לעובד במפעל מסוים. על התכנית לקבל מן המשתמש את הפרטים הבאים: 1) מס' זהות. 2) שם העובד. 3) מס' שעות העבודה. %) השכר לשעה. התכנית תבצע בדיקת תקינות הקלט, תדפיס אותו בתלוש, תחשב ותדפיס את המשכורת ברוטו, את מס ההכנסה, והמשכורת נטו. המס שמשלם העובד מחושב באופן הבא: - | עבור הכנסה קטנה מ-800 ש"ח - 0%. - | עבור חלק ההכנסה מ-801 עד 1200 ש"ח ‏ - 25%. - ₪ 0 "| מ-1201 עד 1800 ש"ח - 35%. - . - " שלמעלה מ-1800 ש"ח ‏ - 50%. כתוב תכנית כללית להכנת חשבונית-מס שתכיל עד 10 פריטים כלשהם. יש להגדיר בתכנית רשימה ובה כל הפריטים (למשל 30 פריטים) הנמכרים בחנות מסוימת. על התכנית לקבל מן המשתמש את שם הפריט והכמות לאותו פריט ולהדפיסם בחשבונית. באמצעות פונקציית חיפוש יש לשלוף המחיר של פריט מתוך הרשימה ולהדפיסו. בחשבונית יש לחשב ולהדפיס:- - | את המחיר של כל יחידה ואת המחיר הכולל לפריט, - | את סך הכל לחשבונית ללא מע"מ, - | את סכום המע"מ, = את הסכום לתשלום. - 270: - נספח א' כתיבה בעברית עד עתה הצגנו את שפת לוגו הפועלת באנגלית. את ההודעות ואת הדו- שיח של המשתמש עם המחשב הצגנו בשפה האנגלית בלבד. בכמה מקרים, הצגנו תווים בעברית בשיטת הגרפיקה למחצה. במחשבים (יתן להציג מלל בעברית ולהקיש תווים בעברית. נלמד עתה את השיטות לעשות זאת במחשבי אם1 ו-םןסק. הדפסת תווים בעברית למשתמשי 1000 אפד הטען מה-205 את התכנית אמתממם ואחר-כך טען את התכנית 1060. אם אתה (מצא בלוגו, וברצונך לעבור ל-205 רשום את ההוראה '05ם.' (נקודה והמילה 205 ללא רווח). כדי לעבור חזרה ללוגו יש לרשום '1000'. ברירת המחדל היא שמקש <0405> נעול, כלומר לא מגיב, והכתיבה היא באותיות גדולות באנגלית בלבד. אם נרצה לדעת מה מצב מקש זה נוכל לרשום: 5 תק? אם הוא נעול נקבל: משת השלב הראשון הוא שחרור הנעילה של מקש 0405. על מנת לשחרר אותו, נרשום את ההוראה: 8" 05 כאשר המקש <0205' משוחרר, הוא יגיב על כל לחיצה ויאפשר לכתוב אותיות קטנות באנגלית. בלחיצה נוספת על <0429> נשוב לאותיות גדולות באנגלית. - 271 - ג. על מנת לכתוב בעברית, יש לעבור לצדו הימני של המסך, לכיוון ימין-שמאל. זאת עושים על-ידי לחיצה בו-זמנית על שני המקשים <ז> ו-<748>. הסמן *ופיע בצדו הימני של המסך. כדי לכתוב בעברית יש ללחו על <0425>. ניתן לעבור לצד שמאל של המסך עם לחיצה נוספת על <411> ו-<7142>, או על-ידי מקש <ישת>. הדפסת תווים בעברית למשתמשטשי 11 1000 ₪ זקטסה יש להביא את המתג הנמצא מתחת למחשב בצד שמאל למצב עברית. כשמקש *0405> יהיה לחו>, תתאפשר הכתיבה בעברית. לט במדפסת על מנת לקבל תדפיס על הנייר ולא על המסך, יש ליצור תחילה קשר בין המחשב למדפסת. ב-1.000 18% רושמים את הפקודה '71קת" מזממזתכ'. מעתה, נוצר הקשר וכל תדפיס :*ישלח למדפסת. וודא תחילה שהמדפסת מופעלת. לניתוק הקשר רושמים 'שתמפזתססא'. כאשר עובדים בגרפיקה, כלומר במסך גרפי, ומעוניינים להדפיס את המסך, יש לפעול כך: א. לטעון תחילה מה-205 תכנית הנקראת 08408105, ואחר-כך את תכנית 100060. ב. כאשר הציור המבוקש מוצג בשלמותו על המסך, יש ללחו על 6 +ת. כל מה שמופיע על המסך הגרפי *ודפס במדפסת. - 212 - ב-1.000 ,פסה הקשר נעשה באמצעות הפקודה '1 המצאצתק.'. המספר '1' מציין את קו הקשר אל המדפטת. לניתוק הקשר רושמים '0 תתצאצתק.', הוראה שמחזירה אותנו למטסך. להדפסת המסך הגרפי, קיים סוג של מדפסת הפועל עם ההוראה הבאה: (13 ת68 6" 9 הגס מקצך) כאשר הציור מוצג על המסך והמחשב קשור למדפסת. רצוי לכלול הוראה זו בהליך תחצאחק שנגדיר ונשמור בדיסקט. הגדרת תצאחק תנאחק 70 1 המצאדתק. (13 תהמס 6" 9 הגס מקען) 0 תמצאדתק. פאם במקרה זה, כאשר ההליך תעאת? נמצא בזיכרון המחשב, די לרשום תזאתת כדי שהציור המופיע על המסך הגרפ* *ודפס במדפסת. למשתמש ב-11 1000 ₪ סקא מומלצ לעיין במדריך של השפה. - 2713 - גש מו בי מילון פקודות מילון זה מכיל את כל הפקודות שבהן דנו בספר זה, וכולל בהמשך רשימה של פקודות נוספות. בנוסף על פקודות אלו קיימים בלוגו הליכים (פרוצדורות) ופונקציות הקשורים בעיבוד קבצים, בתכונות, בקבוצות ועוד. המשתמש המתקדם טוב יעשה, אם *פנה לספרות המקצועית המצורפת לגירסת לוגו שרכש, כדי להכיר וללמוד את כל פקודות הלוגו. חלק מהפקודות פועלות על ערך אחד, אחרות פועלות על שנ*י ערכים, ויש כאלו שאינן דורשות כל ערך שהוא. להלן הסמלים המורים על סוג הערך הדרוש לפקודה: 6 = תו כלשהו. % >= רשימה (1186). ש > מילה (6עסט). ם > מספר (עפסמטת). תש186 = רשימה או מילה או מספר. 0א6ש1 = ביטוי לוגי (ם65910עקא6 10₪1681). ₪5 = רשימת הוראות. 6 ץ > שם של פרוצדורה או של פונקציה. נתון = כל נתון שהוא. הסמל () מורה על כך, שהפקודה פועלת גם על מספר רב של נתונים, אם תוחמים את כל המשפט בסוגריים עגולים. הסמל <> מציין שאין חובה לרשום את הפרמטר. כאשר ‏ יש אפשרות לכתוב את הפקודה בקיצור, רשמנו את השם המלא בסוגריים. - 2% = מקודות בספר () 02א1₪6 01א1₪6 סאג םת אג40 6 45011 2 1ש קמתסעעם םש15% 8 (דַפת1קדט8) םש156 8 (1.451זדסם) 05 0 ם הגס דאמ תס םמ 005 מחזירה ערך אמת, ‏ אם כל הביטויים הם בעלי ערך אמת. פונקציית הטנגס. מחזירה את ערך 45011 של התו 6. מחזירה ערך אמת, אם המי*לה ‏ 1ש אמנם נמצאת לפני 2ש על פ: הסדר המי*לונ'. מחזירה | את הרשימה 185 ללא האיבר הראשון, או את המילה ש ללא התו הראשון, או את המספר ם ללא הסיפרה הראשונה. מחזירה | את הרשימה 186 ללא האיבר האחרון, או את המילה ש ללא התו האחרון, או את המספר ם ללא הסיפרה האחרונה. פונקציה המחזירה ערך "אמת" אם הלחיצה על מקש 06405 אינה גורמת לשינוי. מציגה על המסך את כל שמות הקבצים שבדיסקט. (11 | 1000 ממסקה | ו-מ/קקה 0). מחזירה את התו שערך 45011 שלו הוא מ. מנקה את מסך התמליל. פונקציית הקוסינוס. - 275 - םש15%6 זאטסס ₪ 2 1ת מסאמתעעעדס הזם .5 <6סע"> עפ (ץזפת) שם-קובא" מ זנטדדסם םש156 מצעזיחאן נתון2 נתון1 00412 ססעס" הת (מפגתת) ו מחזירה את מספר איבר* הרשימה ‏ 186, או את מספר התוו*ם המרכיבים את המילה ש, או את מספר הספרות המרכיבות את המספר ם. (ב-10060 %8קקג היא פועלת רק על רשימה). מחזירה את ערכי הקואורדינטות של הסמן במסך התמליל. פונקציית ההפרש. (לא קיימת | ב-מ"קסב 0) מציגה על המסך את שמות כל הקבצים שבדיסקט עבור הגירסה של 20060 18%. יציאה מלוגו אל מערכת 005. מעבירה את הפעילות למסך הער*כה, עם אפשרות לקבלת הל*ך אחד או *ותר בהתאם לנדרש. מעבירה מן הדיסקט אל מסך העריכה את הקובצ הרשום בפקודה. בודקת אם הרשימה 156 ריקה. פועלת גם על מילה ומספר. מציינת סוף הגדרה של הליך. מחזירה ערך אמת, אם שני הנתונים שווים. מוחקת מן הזיכרון את ההגדרה הנתונה. מוחקת את כל ההגדרות מן הזיכרון. 52 206 5 שס-קובצ" ₪ז1עמפבתת פפתת תש15%6 צפחדק 8% נתון צשפע 1 0<>א66ש1 תך >15%₪%2< 6 תת (88זהעע1) 5% צע1 (משתצעך) ת זאד מש155 ת אמדד פצון םש15% 157 () נתון2 נתון1 1151 מוחקת מן הדיסקט את הקובא הנתון. מוחקת את כל הפרוצדורות והפונקציות שבזיכרון.+ מחזירה את האיבר הראשון של הרשימה 186. פועלת גם על מילה ומספר. מציבה את הנתון בתחילת הרשימה 156. אם ערך הביטוי קא1₪6 הוא אמת, מתבצעת רשימת ההוראות ‏ 158%₪61. אחרת, מתבצעת רשימת ההוראות 150₪62. אם ערך הביטוי השמור על-ידי 1857 הוא שקר, מתבצעות ההוראות שב-150₪6. אם ערך הביטוי השמור על-ידי ע5מ7 הוא אמת, מתבצעות ההוראות שב-180₪%6. מחזירה את הערך השלם של ת. מחזירה את האיבר ה-ת שברשימה 156. פועלת גם על מילה ומספר (לא ב-₪זקסג 0). מחזירה ערך אמת אם הוקש מקש כלשהו. מחזירה את האיבר האחרון שברשימה 18%. פועלת גם על מילה וגם על מספר. מציבה את נתוני הקלט בתוך רשימה שהיא בונה. - 27] - נתון 1570 שם-קובא" 1085 5% נתון ששסן תש155 נתון קהממחות קא16 זסא נתון שתממאטא נתון 02 (עטקצשס0) () 02א1₪0 801א0ש1 08 ס6סעס" 20 5 005 5 מחזירה ערך אמת אם הנתון הוא רשימה. טוענת מן הדיסקט את הקוב המבוקש. מציבה את הנתון בסוף הרשימה 18%. מחזירה ערך אמת אם הנתון הוא - - איבר ברשימה 156, - תו במילה ח, - או סיפרה במספר ת. (ב-1/0000 תק היא פועלת רק על רשימה) מחזירה ערך אמת אם ערך הביטו* קא186 הוא שקר. מחזירה ערך אמת אם הנתון הוא מספר. מחזירה את תוצאת החישוב של הנתון. מחזירה ערך שקר אם ‏ כל ערכ: הקלט הם שקר. מציגה על המסך את ההגדרה המבוקשת. מציגה על המסך את כל שמות המשתנים וערכיהם. מציגה על המסך את ההגדרות של כל הפרוצדורות והפונקציות שבזיכרון. מציגה את שמות כל ההליכים והפונקציות שבזיכרון. - 208 - 2 1ת תתשסק () נתון הק (עאזאק) () 2ם 1ם עסטססאק 2 1ם צאמ1סטם ם אססאאת ₪6 (ההססמת) 2 1ם המסא דועת 6% ת ץהתקמת נה (ד5ז.זסהמת) םת סאטסת 5% אשת שם-קובא" מעב58 נתון1 5₪ (מסאמזא58) () נתון2 [א צַ] 501008508 מחזירה את הערך של 1ת בחזקת 2ם. מדפיסה את ערך הנתון על המסך. מחזירה את מכפלת 1ת ב-2ת. מחזירה את הערך של 1ַת חהלקי 2ם. ב-₪סק 0 הילא מחזירה את המנה של 2ם/1םת. מחזירה מספר אקראי בתחום (1-ם ... 0). מצפה להקשת מקש, ומחזירה את ערכו. מחזירה את השארית של 2ם/1ם. מבצעת ‏ ת פעמים את ההוראות שברשימה %. מצפה לקלט מן המשתמש ומחזירה אותו כרשימה לאחר הקשת <66ע2>. מעגלת את הנתון ם. גורמת לביצוע ההוראות שברשימה 180₪%6. שומרת את כל ההגדרות שבזיכרון המחשב בקובצ דיסקט בעל השם הנתון. מחזירה את ערכי הנתונים ברשימה אחת. מציבה את הסמן בנקודה (א,צ). - 279 - 1 נתון 5808 ם אז5פ םת 7 0 () 2ם 1ת 508 קא186 זפ תעקס" שסתאד ש 70 () נתון מסצך םת 417 זא () ₪2 1ש סתסט נתון ספפתסא קובעת ם עמודות בשורה הפיזית במסך. מציגה על המסך את הנתון. פונקציית הסינוס. מחזירה את השורש הר*בוע* של 8. מסיימת ביצוע של ההליך. מחזירה את ערך סכום הקלטים. שומרת את ערך הביטו* הלוג: 180%0. עוצרת את ביצוע התכנית ומחזירה ל-106₪0. מכריזה על הגדרת פרוצדורה או פונקציה חדשה. מדפיסה את הנתון על המסך. הסמן נשאר אחר*י התו האחרון שהודפס. הוראת השהייה של םת *חידות זמן. פונקציה המחזירה את מספר העמודות הקיים ברגע זה בשורה הפיזית במסך. מחברת את הקלטים למילה אחת. מחזירה ערך אמת אם הנתון הוא מילה. - 280 - נקודות גוספות בלוגו בלוגו קיים מספר רב של פקודות, אשר לא דנו בהן בספר זה. נציג כאן חלק מהן. פקודות למשתנים נתון עאט" מאבא עפט" 0א1צ עפט" נתון מאגא ש" קמאגא עפט" אחתת פאתם סאפם פקודות להליכים סנס" שאמ [1186] 6סעס" מא1עמס הוראה המציבה את הנתון כערך למשתנה עפט. מתנהגת כמו הנקודתיים. לדוגמה, אם הערך של אטא הוא 6, נוכל לרשום: אטא" ט6אתחץ תק במקום: אטא: חק הוראה המציבה את ערך הנתון למשתנה מהט. פרדיקט הבודק אם ש הוא משתנה בעל ערך. מחיקת המשתנה מתפאט. מחיקת כל המשתנים המוגדרים במחשב. הגדרת משתנים במסך העריכה. פונקציה שהפלט שלה הוא< רשימת ההוראות של הפרוצדורה ססעס. הוראה להגדרת הליך בשם 6ססק, אשר 1186 מהווה את רשימת ההוראות שלו. פקודה זו מאפשרת הגדרת הליכים מתוך הליך אחר. - 281 - ש" ססטאדעטת ש" <טדדדאזתק ששסת" 16₪ס" שמפצק 00 פקודות לשטח העבודה סאמ דאסס. 5מפסא ₪ פקודות המתערבות בביצוע שפסטגפ פרדיקט הבודק אם ש הוא הליך המוגדר במחשב. פרדיקט הבודק אם > היא פקודה השי*כת ללוגו. הוראה להעתקת ההוראות של ההגדרה 0184 להגדרה אחרת שפםת. ההוראה מתאימה להגדרת שמות | מקוצרים עבור פקודות השייכות ללוגו. פונקציה להצגת כל המילים הידועות ללוגו. באמצעות הוראה זו תוכל לדעת מהן המילים השייכות לנוסח שבידיך. פונקציה שהפלט שלה הוא מספר היחידות הפנויות בזיכרון המחשב. הוראה המנקה את תא* הזיכרון שכבר מלאו את תפקידם ומכשירה אותם לשימוש חוזר. פקודה הגורמת להפסקה זמנית שליכל פעולה שהיא. בהפסקה זו ניתן לבצע כל הוראת אחרת בלוגו. ב-11 1000 08קק2 וכן גם ב-1.000 ₪,זקק אפשר להפסיק גם על-:ך: לחיצה על 72. ב-1,000 18% משתמשים במקש [פע]. - 282 - 0 (מטאזעאסס) ממשיכה את הביצוע אשר הופסק על-:ד: ₪ קיימת אפשרות לעצירה של פעולה כלשהי על-ידי לחיצה על א" במחשב םזקקה, ולחיצה על 06%מטא+0%21 ב-1000 אמ1. הקשה על כל מקש אחר תגרום להמשך הפעולה. פקודות גרפיות 0 (82א0000א240) ם 88 (א808) א 5 (אממתספת 01) [צ א] 01 ם פע (פִ₪4ת0ע) שסאמע ו ןו סאזסגמת פאס פונקציה המציינת את צבע המסך. הצב נע אחורה ם צעדים. מנקה את המסך הגרפי. הצב נשאר במקום. | מנקה את המסך הגרפי. הצב חוזר למקומו ההתחלת * הוראה לסמן נקודה בקואורדינטה הנתונה. הצב מתקדם ם צעדים. מצב שבו הצב לא חורג מגבולות המסך. העברה למסך גרפי מלא. 28 - קיצור עבור גירסת 120060 18%. מחזירה את ערך כיוון הצב במעלות ביחס לצפון מציבה את הצב במקומו ההתחלת* מבל: לנקות את המסך. = 23 - תא (ם,זתטדטסד) ם 17 (דתמ1) 5 (אממת50כטאצא) אפק 0,זססאמץק פע (אשספאמ) מע (מפ5התמאסע) אפ (מפתמעמתאמק) 2095 טש (פטאמק) ת ד (107ת) ם 00 ם ופ (סאדפגמ5) ת 100 [ם א] אמק הצב לא נראה. קובעת את כיוון הצב ב-ת מעלות שמאלה ממצבו האחרו[ן. לקבלת מסך מפוצל בגירסת 000 אמ1. פונקציה המציינת את מצב העט וצבעו. פונקציה לציון צבע העט. מצב שבו הצב משרטט בעת תנועתו. מצב שבו הצב מוחק בעת תנועתו. מציירת קווים על מסך נקי, ומוחקת קווים מצרירים, מחזירה את ערכי הקואורדינטות של הנקודה בה נמצא הצב. מצב שבו הצב אינו משרטט בעת תנועתו. קובעת את כיוון הצב ב-ת מעלות *מינה ממצבו האחרו[. הוראה לקבוע את צבע המסך. קובעת את כיוון הצב ב-ם מעלות ימינה ביחס לצפון. הוראה לקבוע את צבע העט. הוראה לקבוע את מצב העט וצבעו. - 208 - [צ א] ₪7005פ קאפ ₪ ב 01 ם 57% ם צ:₪פ אס )50018( 7 אטאט [ץ א] 5עתגשסד שספאזש סהתט 00% ץצ מניעה את הצב עד לנקודה (צָ,א). פרדיקט המציין לנו אם הצב נראה או בלת: נראה. פונקציה המורה את היחס בין רוחב המסך לבין אורכו (ברירת המחדל היא 0.8). הוראה לקבוע את היחס בין הרוחב לאורך. מניעה את הצב עד לעמודה ם באותה שורה. מניעה את הצב עד לשורה םת באותה עמודה. קבלת מסך מפוצל עבור גירסות ה-א זקקה. מצב שבו הצב נראה. קבלת מסך התמליל. 15 קיצור עבור הנוסח של 1000 18%. מחזירה את כיוון הצב במעלות ימינה מן הנקודה בה הצב נמצא אל הנקודה (עָ,א). מצב שבו הצב חורג מגבולות המסך ונעלם. מצב שבו הצב 'עוטף' את המסך אם הוא חורג מגבולות*ו. מחזירה את ערך הקואורדינטה א בה הצב נמצא. מחזירה את ערך הקואורדינטה עץ% בה הצב נמצא. - 205 - מעבר בין סוגי מסכים בלוגו, כל הוראה גרפית תעביר אותנו למסך הגרפי. מסך זה יהיה מחולק לש( חלקים, החלק העליון לציור, והחלק התחתון ‏ ובו מספר שורות שנועדו לכתיבת תמליל (הוראות). אבל, ניתן לעבור למסך גרפי שלם, שכולו מוקדש לציור. לביצוע ההוראות שלהלן אפשר לכתוב את הפקודה במלואה, לכתוב את הקיצור (ב-1000 18%), או להקיש מקש פונקציונלי או זוג מקשים, כפי שניתן בטבלה הבאה: א. לקבלת מסך תמליל לכתיבה בלבד (מסך העבודה): ב-1000 188 רושמים אמסת0ספדאמך או בקיצור 15, או לוחצים על <1. ב-11 1000 םסקה וב-20060 םוסקה רושמים אממתה150אמד, או לוחצים על (71). ב. לקבלת מסך מפוצל, גם לכתיבה וגם לציור: ב-1000 18% רושמים אממתספסמאצא או בקיצור 5א, או מקישים ל2. ב-11 0 מאמתפקה וב-10060 ממסקה רושמים א88ת5/11508, או לוחצים על (78). ג. לקבלת מסך גרפי שלם, לציור בלבד: ב-1000 18% רושמים אממה0פםתטץ או בקיצור 5ת, או מקישים ל8ק>. ב-11 1000 שקק וב-1060 ₪זקקג רושמים אשמת50תעשע, או לוחצים על (2"). - 286 - נספח גי אזץ ג א אדא בגירסת לוגו אדקהתתמך/ע1זא (המצויה במחשבי ‏ ₪ [קקה ו-מת0ס0סאא00) יש פקודות אשר אינן זהות עם אלו השייכות לגירסה 1051 .המופיעה בספר זה, למרות שהן מתנהגות באופן דומה. יש פקודות שנמצאות בגירסת 1051 ואינן כלולות בג:*רסת צַדא. פקודות מקבילות לגירסת 1051 מטרת הרשימה שלהלן להנחות את המשתמש בגירטת 817 לבחור את הפקודות המתאימות לגירסת לוגו המוצגת בספר זה. נציג אותן כאן בהתאמה: ג ירסת אך1קהתתפץ/ ידא עמוד בספר גירסת 1051 בטוח 16 פאג אגיזא 66 איסתה 6 99 <> 000 אס 12 <אם1> עא000 ב 209 0 ?צדקואם 1% קשציך כ 13 ויו ₪ תס 4 ו סת תת הת 8 פתו המסמדאך 933 זאד אמד 11 > אפצד = 27 סצסא - 28] - 1? פגמת ?תםמאט ?ממא שסצאבג סטאגא 0ק תת 20 פס (המס ות 0כהמת) סת (דפתטסמת) סת וי סיד 1צאדתק 7? פקודות עריכה: 165 99 12 13 17 2 8 23 "22 21 208 2 "1 202 8 5 16 מציב את הסמן בתחילת השורה. מביא את הסמן לסוף השורה. 1 10 קתממאטון סהממותזא 08 05 05 <ם,זקק> תמנאדתק. דסטססתק (תזזספאמת) סת (151. זסהמת) מת 0 ספ מע קסע" הוסתזוד מקצך דדט קסתסט מעתיק את שורת ההוראות האחרונה שניתנה למחשב. מוחק את התו שעליו עומד הסמן. מוחק את התו שמשמאל כנ"ל; לסמן . מפסיק כל עבודה המתבצעת על-:ידי המחשב. מניע את הסמן שמאלה. מניע את הסמן ימינה. - 288 - ו פקודות הפועלות במסך העריכה בלבד: נש , , , , ה ₪ כ , 0 פס ם. ₪ מביא את הסמן לתחילת העריכה. מביא את הסמן לסוף העריכה. מניע את הסמן שורה אחת מטה. מניע את הסמן שורה אחת מעלה. פותח שורה חדשה בין שתי שורות. מוחק מהסמן *מינה עד סוף השורה. יציאה מן העורך עם הגדרה. יציאה מן העורך עם הפסקת העבודה ללא הגדרה. הכניסה למסך העריכה נעשית גם על-ידי המילה 10. הנדלים בתתביר נוסף על ההבדלים שהזכרנו, נמצא גם הבדלים בתחביר: א. בפקודות הפועלות על הליכים כמו 0, עם ו-אם, כותבים את שם ההליך ללא הגרשיים. במקום אט1א" 0ע למשל, כותבים אטזא 0ק. במשפט: התנאי, ההוראות אינן נמצאות בתוך סוגריים מרובעים. לדוגמה, במקום - | [188הק" 0] [מטת1" ס0] 187: פעצקאת סד כותבים: 8 5 מפמש מטתד" 00 אמאד 197: ?צדקאם סד ניתן להשמיט את המילה אמאחך (וכמובן שהקו הינור לשם הדגשה בלבד). הדבר נכון גם לגבי פע1 ו-181. ההוראות נכתבות ללא הסוגריים המרובעים. = 209 = ציון של נקודה על המסך בהוראה 008508 לא מופיע בתוך סוגריים מרובעים. לדוגמה, במקום - [10 30] 51003508 כותבים: 9 30 008508 הדבר נכון גם עבור ההוראה צאעטפ. ד. נתון שלילי יש לכתוב בין סוגריים עגולים, אחרת *תי*יהס המחשב אל סימן המינוס כאל פעולת החיסור. יש לכתוב - (10-) 20 008508 ולא: 0- 20 008508 במחשב 008802088 הקשר למדפסת נעשה עם המילה 'תמעאזתק' והניתוק - עם המילה 'אמזא1תקסא'. - 290 - נספח ד' אינדקס תכניות דוגמה שמות ההגדרות המשמשות 'דוגמה', מובאים כאן בהתאם לסדר הופעתם בספר, ולא לפי סדר האלף-בית. כך, תמצא שהן מסודרות לפי רמת הידע הנרכש ככל שמתקדמים עם החומר. 7 דספת 8 אפם זחא 77 ספת 1 אזזם 8 צססג 2 תומצ שמא 2 צפן - 6 1אמם זא 3 ותד 7 תד 8 14 8 5אמדתת הי 5 50 2 5 1 1 3 99 מאזתץק 55 אזאמם וא 11 1דתק 6% מ 11 2ודק 8 דהזמטא 12 3דתק 65 1 ו 13 אזסם 6 2 זו 17 5אפאת 7 ה 108 פאתאם 99 הממדא 1099 פאתאמד ₪9 8 - 1 אפך 19 1 110 וו 3 פממאטא 112 2 7% 1ממאטא 118 דהופדון 175 2 ממא 15 באזה 755 ו - 291 - 10 155 200 206 207 21 222 23 213 205 216 216 217 217 217 219 220 200 220 221 221 221 222 23 23 29 218 זו 5 - 1 0.06 .אד אזם. 0סד. סמ דפדנטת פפגה - תשטק - אטאתתק אסזייזססג 1טסצא - אזמאספ - אם - צתתס - 1 זטפטת פתא. 10 דכ קז 97 - סא 7 - אטתזתק - שם,זם . אסתד - דסא אסתד - 7 - צאט - מפתפת - פאס - 5 5 (כולל תת-הליכים) 20 0-1 (כולל תת-הליכים) 272 0-2 (כולל תת-הליכים) - 292 - 117 139 |59 120 120 11 12 15 16 127 18 11 13 15 1-39 141 19 150 18 158 159 100 12 12 1.08 109 |18 13 15 108 1|9 100 11 אזאד 5 ₪ 55 2חט טס <- אא 002 22 טהתסטא הספזון פשתסע אס זט זפ חן פע מצגכ באכ סד,זד זו פמטזסטא 57דזתק סד זאד 1 1-2 פע מפתמעסת וו אסזאט :8 07 - 1 - תת - לכל בעיח -- פתוון 1 - 293 - 208 4 208 1 29 הספת 29 פספת 200 ץז (כולל תת-הליכים) 206 ₪1 1ספתטת 27 2 207 פתסשטאס 208 קאמפס 209 דפתדש. טאת 23 מתפסת (כולל תת-הליכים) נספח ה' אינדקס הוראות 165 177 12 157 |39 סך (04158ע1) עפך (מטתעק1) עסד עאז אא אמצ סצמא 157 ובו 1 10 וב קתמסאטון עסא שהממוטא (עטפנטס) פס 08 20 פאק 05 205 המוסק (עאנתק) תק צסטפסתק 0 - 298 - 15 13 2, סאג א 5011 קמת0סקטת (1פת1עצטם) עם (91.זדטם) מם 05 06 הגס את 05 צאטסס ₪ 0 מסאמתתקפדת הנס .5 (צצסמ) פם ₪זנטידדסט קעידקועם פאט ןס (פפהתת) תם זתם תת פפתת כל 202 13 107 16 אזפ תפ ספ אספ עפסד ,זמעם קסיד" שסתו 5 = 10 מטתד מפצץך ד פתסש ספהסט ,% 9 ףז האס זהו כל הסוד! 7 295 - 155 211 08 5 208 5 28 7 13 201 21 ,2 3 13 %6% | > 6 אספאות (ה4אסקמת) סה המפאדאמת ,2 | *אגמקמת (1.157פ4מת) מת פאטסת אטת ₪ (פַסאמזאמ5) 55 5 8 זו ד סז נספת [' ביבליוגרפיה לוגו בעברית: 3 . אלקין רבקה, *רושלים במשיכת צב - רעיונות להתנסות ו*צירה, אוני' בן-גוריון, 1988. גבעון יהושפט, פרופ', סדרת הרפתקאות בלוגו, באג, 1987. לירון אורי, נשר פרלה, צצקיס רינה, מדריך לעסק* צבים, באג, חלק א - 1984, חלק 2 - 1988. -, צו לצב - עלון אגודת לוגו בישראל, מרכז לוגו - המחלקה 0 להוראת הטכנולוגיה והמדעים בטכניון, החל מ-1986. ספרות מומלצת באנגלית: .2 ,11111 860288/ סע 1,000 ₪זקק ,8820106 ת406150 .5 ,צע060₪60 16סעטך ,.1.2 8 ש6תה 182018 מ206150 .6 . 1988 ,5658ק סדא (085עת 817 ,16ע50 0 06מ50160 ע6ס0קם0ס0 (,תהבעם עסטעהת .7 . 1987 - 111 1סט ,1986 - 11 1סט ,1985 - 1 1סט 1 , צ א פאססת 28516 ,₪5תסספ6ת1א ,.5 סעסקפק .8 ,0 את 626 ע0+ שתנשםהתשסע? 1000 ,26062 פפסת .9 . 1985 , ש₪6510 ב₪861580 לקורא המתעניין: .9 4 הראל דוד, פרק* יסוד במדעי המחשב, האוניברסיטה המשודרת משרד הבטחון ההוצאה לאור, 1985. האן יחיאל ועמיהוד יצחק, המחשב האלקטרוני, הוצאת הוד-עמ', 5 (אושר כספר לימוד). - 296 - 0 - תכנות פונקציונלי מציג את שפת לוגו מנקודת ראות חדשה. השונה כתכלית מזו המוכרת. לנו על ידי גרפיקת הצכ. הוא מאור תמונה מקיפה וכרורה של הפוטנציאל הטמון כה. מציכ ללומד אתגר ועוזר לו להתמודד עם תכנות כרמה גכוהה. לוג הינה גירסה ידידותית כעלת. אופי פונקציונלי. הקרוכה לשפת קפ לתחומי השימוש של כינה מלאכותית. ומערכות מומחה. על-כן הספר עוסק כעיקר כתכנות הפונקציונלי. שכו הרככת פונקציות הינה אמצעי עיקרי ליצירת. כיטויים מורככים. שיטת. הלימוד מיישמת לקחים מנסיונה של המחכרת. היא מנחה את הלומד מן הקל אל הככד. מצעדים ראשונים כתכנות מתקדם ועד לניצול של העוצמה והתחכום של השפה. היא מדריכה כיצד לתכנת באופן מכוקר ומוכנה כדי להגיע לרמת מיומנות גכוהה. המחכרת. מדגישה נושאים המיושמים גם כשפות תכנות פונקציונליות אחרות: | תכנות | מכני ורקורסיכי, | נוהלים | לכניית | פרוצדורות ופונקציות עוכוד | רשימות ועוד. ‏ כספר כ-100 תכמות לדוגמה ופרויקטים מקיפים כתחומי כעילות. שונים. ‏ וגם עשרות תרגילים לעכודה עצמית. המשולכים כנושאי הלימוד. הספר מציג את גירסת. 1060 אפו שפותחה על-ודי ו109 (0פס! סח 5510005 זסוטסוח ס0). הוא מתאים גם למשתמשי וו ס6סן ם וסקה ו-060)/ = מק. ניתן הסכר על גירסת אוקגחהםחדווא ל-קומודור. 0 - תכנות פונקציונלי מיועד לתלמידים בכתי הספר התיכוניים וכאוניכרסיטאות, ‏ וללומד השקדן הרוצה להתמחות בשפה לוגית מתקדמת. המחכרת: ש. מנולה הינה מורה למקצועות המחשכ ומתמחה בשפת לוגו. הדריכה כקורס "הכרת. המחשכ ויישומיו כחינוך" כסמינר לוינסקי, עוסקת בהוראה ככתי-ספר תיכוניים. ומלמדת את שפת לוגו בכיתות של תלמידים מחוננים. ככל שלמדה להכיר את השפה, כן התעוררה סקרנותה לגלות את רזיה, והוסיפה להתפעל מכוחה ומן התחכום שכה. את הנסיון שהיא רכשה העלתה על הכתכ כספר זה. וכחרה כדרכים הפשוטות. היעילות והכהורות. ללימוד השפה. הכנתה והשימוש היעיל כה. מסת"ב 965-361-003-1 א158