פסקל מהצעד הראשון

240, 16 ע', כולל מפתח עניינים – ISBN 965-361-062-7

OCR (הסבר)
ויליאם פרג'ון 4 יק סט ו "ונה ]/6₪00 350% הוצאת הוד-עמי ₪ לספרי מחשבים פסקל מהצעד הראשון מהדורה שנייה עורך ראשי: יצחק עמיהוד עריכה: שרה עמיהוד ייעוץ מקצועי: יהודה כ מוקדש לאמי מרים פרג'ון שמות מסחריים שמות המוצרים והשירותים המוזכרים בספר הינס שמות מסחריים רשומים של החברות שלהם. הוצאת הוד-עמי עשתה כמיטב יכולתה למסור מידע אודות השמות המסחרייס המוזכריסם בספר זה ולציין את שמות החברות, המוצרים והשירותים. שמות מסחרייס רשומיס (%7806708765 76015%0760) המוזכריס בספר צוינו בהתאמה. הוצאת הוד-עמי אינה אחראית לאמינות, לדיוק ולנכונות מידע וּה. הודעה ספר זה מיועד לתת מידע אודות מוצרים שונים. נעשו מאמצים רבים לגרוס לכך שהספר יהיה שלם ואמין ככל שניתן, אך אין משתמעת מכך כל אחריות שהיא. המידע ניתן ''כמות שהוא'' ("15 45ּ"). הוצאת הוד-עמי אינה אחראית כלפי יחיד או ארגון עבור כל אובדן או נזק אשר ייגרם, אם ייגרם, מהמידע שבספר זה, או מכל שימוש בדיסקט/תקליטור שעשויים להיות מצורפים לו. לשם שטף הקריאה כתוב ספר זה בלשון זכר בלבד. ספר זה מיועד לגברים ונשים כאחד ואין בכוונתנו להפלות או לפגוע בציבור המשתמשים/ות. טלפון: 09-9564716 פקס: 09-9571582 דואר אלקטרוני : |ו.סס6.ווְהה00-3ח0603)חו סש םש ₪ אתר באינטרנט : |ו.60. !רחוב -1)ס./ע/ש/ש פסקל מהצעד הראשון מהדורה שנייה ויליאם פרג'ון מ הוצאת הוד-עמי : לספרי מחשבים חס 2ק5+6 5%זו] 6+ וחסו= - [בּס5בּק הסךזוב3ּ: וחהּוו!ו/ תווחה .1 :זסזו0= 9 כל הזכויות שמורות הוצאת הוד-עמי לספרי מחשבים בע''מ ת.ד. 6108, הרצליה 46160 טלי: 09-9564716 פקס: 09-9571582 בקרו אותנו באינטרנט: !60.1.ווחהּ-סח. /ו/עעע כתבו לנו: !60.1.וַוְהִב3ּ-100 060+חו אין להעתיק ספר זה או קטעים ממנו בשוס צורה ובשום אמצעי אלקטרוני או מכני, לרבות צילום והקלטה, אמצעי אחסון והפצת מידע, ללא אישור בכתב מאת ההוצאה, אלא לשם ציטוט קטעים קצרים בציון שם המקור, או לשם שימוש עצמי. הודפס בישראל סיון תשנייה, יוני 1995 עדכון: 1996, 1999 מהדורה שנייה 2000 0 חש || זוזה-ססה 28 ,6108 .0.8.ק 0 ,1999 ,1996 ,1995 שחטנ , ו1588₪ מסת'יב 965-361-062-7 158% תוכן עניינים מקוצר 8 9 מבוא לשפת פסקל ....11111155566665860000 11 אופרטורים חיש(ביי0 .....21165566566006 23 אלגברה ב(ל?34 7 התניות (ל(לאנת 4 מל בק פרוצדורות ופונקצ'(ת :.:.:.1155556666066. 82 157 מערכים ..:יו,אייאייאיייא::ה..119.....4...::5 מערכים דו-מימדיים יי ...129111 10 חיפוש :13901.2 11 מיון ומיזוג מערכים 1 12 קבצים........י;יי,יחאיייי5:.ו1572..:...50 נספתח א: ערבול ((0הוה17511111111665......)]135 נספחתח ב: פתרונות לתרגילים .181.1 אינדקט 2 תוכן העניינים ‏ 5 תוכך העניינים פרק 1: מבוא לשפת ו 11 הקדמה 7 אודות שפת פסקל 1 אופי ומבנה השפה 2.2254 11 מרכיבי שפת פסקל 1 מיליס שמורות 1 משתניס וקבועיס 1 מבנה התוכנית בשפת פסקל 1 ראש התוכנית היראווב 4:.. 14 הגדרת משתניס 1 החלק הביצועי של התוכנית 7 פקודות קלט/פלט (ח|סשוז/\ח|₪680) 17 איך כותביס תוכנית קריאה וברורה 2 פרק 2: אופרטורים היש(ביים.::::::וווווווווווווווווייייייייייי..: 23 מהס אופרטוריס? - ו פעולות חשבון בסיסיות 2 סדרי עדיפויות בחישוביס מתמטייס ל פרוצדורות ופונקציות ...28 הפונקציה 05 (ערך מוחלט) 2 הפונקציה זף5 (ערך ריבועי) 9 הפונקציה +זף5 (שורש ריבועי) 2 הפונקציה 6זס (המרת תו לערך אסקי) 20 הפונקציה זח6 (המרת קוד אסקי לתו) |[ הפונקציות %ח1 (בידוד הערך השלס) ו-6חטזד (המרת ערך ממשי לשלסם) 1 הפונקציה סחטסח (עיגול ערך ממשי) 7 הפונקציה ₪786 (בידוד שבר עשרוני) ב הפונקציה 88000 (יצירת מספר אקראי) ו הפעלת הפונקציה 2 הפרוצדורה 000126ח₪8 0 בי 0 + תרגיליס 20-11 6 פסקל מהצעד הראשון - מהדי 2 פרק 3 אלגברה בוליאנית הה,ה,ה,ההההההההההההההההה ה הההה ה[ ההההה| םהה ההא 37 ביטויי שוויון ואי-שוויון תרגיליס פרק 4: התניות ולולאות הה,הההההההההההההה ה ה ההההה ה הההה ה ה הההה םהה ההות 13 הקדמה התניות 0 לולאות 0 לולאות מותנות תנאי לולאות מורחביס 7 לולאות מקוננות מבנה רב-ברירות - 6455 מגבלות במבנה 6455 רב-ברירות תרגיליס פרק 5: מבני בקרה ההםהההההההההההההה ה הההההה ה ה ההההה הההםה ה ההה םהה אוו 55 הקדמה כללים בסיסיים ליצירת תרשימי ורימה ב סוגיס שוניס של מבני תכנות מבנה סדרת: 0 מבנה תנאי ב מבנה לולאה 0 אלגוריתם (וחחשוזסף|) 7 מבנה סדרת: 0 מבנה תנאי מצומצס מבנה תנאי מורחב מבנה לולאת 6ווח/ש 0 מבנה לולאת 6068%ז מבנה רב-ברירות - 6455 ייהוראות חד-משמעיות הניתנות לביצועיי מבנה סדרתי 'יוווווווווווווווווווווווווווויייי.י. מבנה תנאי מצומצס מבנה תנאי מורחב מבנה לולאת = |זח/ מבנה לולאת דג=ק-₪ 2 מבנה רב-ברירות -6456 0 תרגיליס תוכן העניינים 7 פרק 6: פרוצדורות ופונקציות ההה,הההההההההההההה ה הההה ה הההההה ה ה ה וא 3 הקדמה || מושגי יסוד בהגדרת תת-שגרות (פ6חסטסזס50) 2 תת-שיגרה בסיסית (6חסטסזטט5 6 28516) 0 תהליך הביצוע של תת-שיגרה 5 העברת פרמטרים (נתונים) לתת-שיגרה 0 משתנים כלליים (659!סאוזאע |6|008) ומשתניס מקומיים (פ6וטּוזפע |1068) 7 הגדרת מספר פרמטריס םו בב בו תשוב םמ וט מיב מ ספ יס ש ביס ל סוי א כמ םי ל ופ בב פב 5 בש ל 0 תהליך פירוק תוכנית במבנה 'ימעלה-מטה'' (חצוסס-קסד) 9 יצירת פונקציות (ח066!37300 חססס6חטת) ל ניהול משתניס חיצונייס ל 0 שימוש חוזאר בתת-שגרות ל קינון תת-שגרות (0ח650ח-500) 5 ל 100 תרגיליס 1 פרק 7: מחרוזות ה,ה,ההההההההההההההה ה ה ההההה ה ה ההההה ה ההם ה ה ה ההא םהה ה ההא 15 מהי מחרוזת (0חו50)! 10 מבנה מחרוזת בשפת פסקל 1 פעולות מחרוזת בסיסיות 1 הטיפול במחרוזות 1 השוואת מחרוזות 1 טיפול בתוויס בודדיס 107 פונקציות מחרוזת נוספות 10 הפונקציה 160% (אורך) 1 הפונקציה שְסְ60 (העתקת קטע מחרוזת) 1 הפונקציה 005 (מיקוס תת-מחרוות) 1 שינוי מבנה מחרוזאת 7 הפקודה 156% (הכנסת תת-מחרוזת) 0 הפקודה 086!6%6 (מחיקת קטע ממחרוזת) - 0 מחרוזות ומספריס 1 הפקודה 5% (תרגוס ערך מספרי למחרוזת) 1 הפקודה |8 (הפיכת מחרוזת לערך מספרי) 1 תרגיליס 50 11 פרק 8: מערכים הה,,ההההההההההההההה ה ה ההההה ה ה ההההה ה ההה ה ה[ הההה םהה האוא 119 מערכים חד-מימדיים ל הגדרת המערך בשפת פסקל 7 שימוש מעשי במערכים 0 סריקת מחרוזת 7 ניהול מערכים 2 שילוב קבועיס בהגדרת המערך 1 8 פסקל מהצעד הראשון - מהדי 2 תרגיליס - 0 פרק 9 מערכים דו-מימדיים.:::::ווווווווווווויווויייייייייי....:, 129 שימושיס של מערכים דו-מימדיים 1 פעולות במערך דו-מימדי 1 מטריצות 1 קבועים ומערכים רב-מימדיים 0 תרגילים "|| | פרק 0 חיפוש ההה,הההההההההההההההה ה הההההה ה הההההה ה ההה ה ה הההה םהה ה ההות 19 תהליכי חיפוש 1 חיפוש סדרתי 1 חיפוש בינארי 7 יישוס של תהליכי חיפוש 1 תרגיליס 145.14 פרק 1: מיון ומיזוג מערכים הוה,ה,ההההההההההההההההה ה ה|הההה ה ה וא 1417 מיון מערכיס 1 הקדמה 0 מיון שכניס 1 מיון בועות 1 יתרונות וחסרונות || מיזוג מערכים || תהליך מיווג מערכים || מיווג של יותר משני מערכיס || תרגילים 7[ || 0 פרק 2: קבצים הו,ה,ה,ההההההההההההה ה ה ההההה ה ה ההההה ה ההה ה ה ההההה ההא ההות 157 מהו קובצ! 1 קבציס בשפת פסקל 150512 קובצי טקסט (65!₪ %א6ד) ל 1 הפקודה ח9ו855 (הכוונת שס קוב>) 158 הפקודה )₪656 (פתיחת קוב לקריאה) 1 הפקודה ₪686 (יצירת קוב לכתיבה) 1 הפקודה 6חס6סקה (הוספת נתוניס לקובצ) 160 כתיבה וקריאה מקובצי טקסט 1 סגירת קבצים (6056 6וו=) 1610 הפונקציה +60 (זיהוי סוף קובצ) -- 0 קבציס מבנייסם (1!65 60מץד) 1 מבנה הרשומה 7 טיפול בקבציס מבנייס 1 תוכן העניינים ‏ 9 הפקודה ח455!8 (הכוונת משתנה לשם קובצ) 7 הפקודה )₪656 (פתיחת קובצ לקריאה וכתיבה) .166 הפקודה 6פוזצו₪6 (יצירת קוב לכתיבה) 1 הפקודה 61056 (סגירת קוב) 1 קריאת נתוניס (8680) וכתיבת נתוניס (טוז//) 1 הפונקציה +50 (סוף קובצ) 1 הפונקציה 26ו₪1!65 (מספר רשומות בקובץ) 170 הפונקציה 566% (איתור נתון לפי מיקוס) 0 הפונקציה 8505!ו₪ (מיקוס מצביע הקובצ) 2 תרגיליס 0 נספחתח א: ערבול (0חו135]) הההה,ה,הההההההההההההההה ה ההה ה ה הההה םהה ה ה ההא 15 הקדמה 1 דוגמה לביצוע ערבול 1 תרגיל 1 פונקציות ערבול נוספות :ילל .179.4 פרק 2 | || פרק 3 0007000 פרק 4 8 | ----.|||-|-|-|/|- | -/-- -/ /-/ 0 פרק 5 0 פרק 6 1 פרק 7 7 פרק 8 7 0 פרק 9 .---.-/-/-/-/- 7 . 7//ּ/-/-. פרק 10 ל פרק 11 7 פרק 12 0 אינדקט הה,ה,הה,ההההההההההההההה ה ה ההההה ה ה הההההה ה ה הההה ה ההה ה ה ההההה ה םהה וא 205 0 פסקל מהצעד הראשון - מהדי 2 פרק 1 מבוא לשפת פסק?ל הקדמה אודות שפת פסקל שפת פסקל תוכננה במקור ללימוד כללי תחביר, אופן תכנות, פיתוח חשיבה לוגית, וכבסיס ללימוד שפות אחרות. כשפת לימוד, תחביר השפה ואופן השימוש בה פשוט ביותר. עס השניס התפתחו גרסאות שונות לשפה. כל חברת תוכנה שעסקה בנושא הרחיבה את תחומי השפה וכך יצרה מעין שפה חדשה. רק הבסיס של השפה משותף לכל הגרסאות. כיוס נותרו רק גרסאות בודדות לשפת פסקל המקורית. אחת מהן היא גרסת טורבו פסקל (ובּ2356 סטיוטד) של חברת בורלנד (6ח13ז80). זו אחת הגרסאות הנפוצות ואותה נלמד בספר זה. לכן, כל התייחסות לשפת פסקל מעתה ואילך מכוונות למהדר - טורבו פסקל. אופי ומבנה השפה שפת פסקל פשוטה להבנה ושימוש, אך יחד עס ואת היא גס מאפשרת ליצור מערכות תוכנה מורכבות. פסקל, כמו כל שפת תכנות, מחייבת כתיבת פקודות במבנה קבוע ומוגדר, וזאת נלמד בספר וה. פרק 1: מבוא לשפת פסקל 11 מרכיבי שפת פסקל בפרק זה נעסוק במרכיבים הבסיסיים של שפת פסקל: א) משתניס וקבועיס. ב) מבנה כללי של תוכנית. ג) פקודות קלט/פלט פשוטות. מילים שמורות מילים שמורות מקובלות בכל שפת תכנות. הן שייכות לשפה עצמה, ולא ניתן להשתמש בהן, אלא רק כחלק מפקודה. לפניך רשימת המילים השמורות. המיליס המסומנות בכוכבית מתייחסות לטורבו-פסקל בלבד, ואינו שייכות לשפת פסקל הסטנדרטית : סד כ=א6הק |וסדדה דאפואם וקאך+* דסא דט 5501* םקצך םסאק ]א דאך* פא סאה דזאט* ו4הססחק דקטאהח: דאך* אפחד צהחחה וזדאט 56 ]| חח א 5 דקש ססוא צהחחה 5 ד )זא סדאאוספ 6 ם ]זה 1 דסא 5 צנסם העש אוו ג סא5 סם אסא 6 ג ו ₪ אפחד אז פאז ואז* משתנים וקבועים משתנה (סְ!טגּוּזְהּצ) כשמו כן הוא - משתנה. תפקידו לאגור ערכיס שוניס ולהשתמש בהס בשלבים אחריס של התוכנית. כדי להבין את משמעותו, נתבונן לדוגמה בסיר המכיל מים. ניתן להוסיף לו מים, להפחית ממנו מים ואחר-כך להשתמש במיס שנשארו. כך גס המשתנה, הוא אוגר בתוכו נתון מסויס ובשלב אחר של התוכנית משתמשים בנתון השמור בו. 2 פסקל מהצעד הראשון - מהדי 2 שפת פסקל כוללת סוגים אחדים של משתניס בסיסיים (השמות בסוגרייס מצייניס את השמות הלועזיים שלהס): משתנה שלם (%606ח1): משתנה וה אוגר מספריס שלמיס בלבד. כל ערך ששמים בתוכו, בין אס חיובי או שלילי, חייב להיות שלם. משתנה ממשי (]68א): משתנה זה מכיל ערכים מספריים, הכוללים שבר עשרוני. משתנה ממשי מכיל מספרים ממשיים, שהם ערכיםס שכוללים שבר. לדוגמה: 234 או 1 או 9.194231-. משתנה תו (ז3ח6): משתנה זה שונה מקודמיו, כי התוכן שלו אינו ערך מספרי שלס או שבר, אלא תו בודד. לדוגמה: 'יאיי, יירָיי ייַיי יישיי. מלבד העובדה שהוא מכיל תווים בלבד, השוני העיקרי ממשתנים אחריס הוא בכך שלא ניתן לבצע עמו חישוביס. ניתן אך ורק לשמור בו נתון או לקרוא ממנו נתון. משתנה לוגי/בוליאני (ח800168): משתנה לוגי מייצג שני מצביס: 'כן"י ו''לא'י, או 0א/65+, כשמדובר באנגלית. המשתנה הלוגי (משתנה ה נקרא בדרך כלל בוליאני, על פי שמו הלועזי) דומה למדי למשתנה השלם. ניתן לבצע עמו חישוביס לוגיים, כלומר, כפל לוגי וחיבור לוגי, וכל את בתנאי ששני המשתניס או הערכיםס שפועלים אתס הס משתנים או ערכיס בוליאניים. לא ניתן לבצע פעולות במשתנה זה עס משתנים אחרים, כגוו משתנים שלמיסם או ממשיים. במשתניס מסוג זה נדון בפרק 3, מכיון שלגביהס קייס תחוס מיוחד הנקרא 'יאלגברה בוליאנית'י. בשפת פסקל, כמו ברוב השפות האחרות, ניתן להגדיר קבועים (15ח6005%8) מסוגיס שונים. למעשה, כל סוג שניתן להגדיר כמשתנה (לדוגמה, שלמיס, ממשיים, תוויס וכוי) ניתן להגדיר גסם כקבוע. כבר לפי השס ניתן להבחין בהבדל. כאשר מגדיריסם משתנה, ניתן להשתמש בו ולשנות את תוכנו במהלך התוכנית. כאשר מגדירים קבוע, ניתן אך ורק לקרוא ממנו ללא כל יכולת לשנותו בזמן ההרצה. הערך ההתחלתי שיוגדר עבור הקבוע יישאר ייקבועיי למשך כל זמן הרצת התוכנית. מבנה התוכנית בשפת פסקל עד כה למדנו מהס משתניס וקבועים, ולמדנו איזה סוגיס בסיסייס קיימים. כעת עלינו לדעת כיצד מגדירים אותס בתוכנית. כדי להתקדסם לשלב הזה עלינו לדעת תחילה מהו המבנה הכללי של תוכנית. שפת פסקל היא שפה מבנית, ולכן לכל מרכיב בתוכנית יש מיקוס מסויס שנקבע מראש. למשל, אי אפשר לערבב הגדרת משתניס עס פקודות התוכנית. פרק 1: מבוא לשפת פסקל 13 מבנה תוכנית כולל שלושה חלקים עיקריים : + ראש התוכנית * הגדרת משתנים > החלק הביצועי של התוכנית ראש התוכנית חלק זה הוא למעשה הגדרת שס התוכנית. לרוב הדבר מסתכס בשורה אחת, או שתיים לכל היותר. בשלב וה נאמר רק, כי חלק זה מכיל שורה אחת הנראית כך: ;6רח3ּ וחהוטסוס המילה ו גּזפסיוק מבהירה למחשב כי תפקיד שורה זו לציין את שס התוכנית. כלומר, 3 הוא שס התוכנית. לדוגמה, נכתוב: ;ץ00 הההזטסזוס שורה זו מגדירה למחשב כי שס התוכנית הוא ץ600. ניתן לציין כל שס שרוציס, ובלבד שהוא נכתב במבנה נכון ולפי הכללים : > שס חייב להתחיל באות אנגלית בלבד. > אסור לציין יותר ממילה אחת בשם התוכנית (לדוגמה, שם כגון ייץק60 6ו יי הוא שגוי, מכיוו שהוא מכיל יותר ממילה אחת). > כל התוויס חייביס להיות אותיות אנגליות או ספרות, או קו תחתי ( ). > אסור שהשם יהיה מילה שמורה. הגדרות אלו תקפות גס לשאר המקרים בהסם אנו משתמשיס בשמות. מקריס אחרים יכולים להיות שמות של משתנים, קבועים וגם פקודות בתוך התוכנית. כולס חייביס להיות בעלי שמות תקנייס על פי התבנית שהגדרנו. למעשה, שורה זו אינה משנה מאומה בתוכנית, אשר יכולה להתבצע ללא תלות, אם שורה זו קיימת או לא. הערה חשובה: לאחר כל פקודה או הגדרה בשפת פסקל חייב להיות 8 התו 2 (נקודה-פסיק). רק במקרים בודדים אין צורך להשתמש בתו זה, כפי שנלמד בהמשך. 4 פסקל מהצעד הראשון - מהדי 2 הגדרת משתנים בחלק זה מוגדרים כל המשתניס והערכים הקבועיס שנשתמש בהסם בהמשך התוכנית. כדי שהמחשב יוכל להבחין מהו משתנה ומהו קבוע, יש לחלק את ההגדרה לשתי קבוצות שונות. תחילה, נדגיס כיצד מגדיריס משתנה פשוט: חפ עד :חב המילה זפ מגדירה למחשב כי מנקודה זו של התוכנית והלאה, כל עוד לא ציינו אחרת, אנו מגדיריס משתנים. כדי לפעול עס משתנים אנו צריכיסם לקבוע להס שמות, כי המחשב אינו יכול לנחש בעצמו באילו משתנים אנו רוציס להשתמש. לצורך זה 86 מציין את שס המשתנה, אשר חייב להיות שם תקני. 6סץד הוא סוג המשתנה, לדוגמה משתנה שלם, ממשי, תו וכו'. שימו לב: אנו כותבים את ההגדרות וההוראות בהזחה ועם טבלר 1 8ד), מכיון שכך נכון להציג את התוכנית. בדרך זו היא תהיה קריאה וברורה יותר, ואין לכך חשיבות מבחינת השפה. השתדל לנהוג לפי הדוגמאות שבהמשך. הפיסקה הבאה מגדירה משתנה 'יאיי מסוג שלם (156061) : זה סח % 1 שימו לב: אחרי המילה פיי אין לכתוב את התו '/לי. דוגמאות נוספות להגדרת משתניס: זה |₪68 :₪ ;7 :6 ;ח00|68 | :60666 סז 6 כעת נבחן כיצד מגדירים קבועים. ערכים קבועיס קליס יותר להגדרה מכיון שהמהדר של פסקל אינו דורש מאתנו להגדיר לו את סוג המשתנה, הוא מחליט בעצמו על פי הערך שאנו מציביס בו. הגדרת פסקת הקבועים נראית כך: 6% 6 605% = שוחב פרק 1: מבוא לשפת פסקל 15 המילה /'+60₪5%30"' מגדירה למחשב כי מנקודה זו והלאה, וכל עוד לא ציינו אחרת, כתובות הגדרות של קבועיס. לדוגמה, הפיסקה הבאה מגדירה קבוע בשס ופ ומציבה בו את הערך 3.14 : 0% = | דוגמאות נוספות להצבות קבועות : 0% משתנה שלם 1 1 משתנה תו אי = 6 משתנה ממשי 1 = ₪ לאחר שלמדנו את הדרך להגדרת משתנים וקבועים, אנו יכוליס לשאול שאלה מעשית : איוה ערך יימצא במשתנה שהוגדר, אך עדיין לא נעשה בו שימוש! נתון כוה מכיל בדרך כלל את הערך אפס, אך אין זו עובדה קבועה ואין להסתמך על כך. אס כן, מה עלינו לעשות כדי שנוכל להגדיר משתנה עס ערך שיוצב בו מראש לפני השימוש הראשוני בו לשס כך ניתן לשלב שתי תכונות. האחת היא תבנית הגדרת משתנה, והשנייה - הצבת ערך קבוע. כיצד הדבר מתבצעז הפיסקה הבאה מגדירה משתנה שלם עס ערך התחלתי: יבןיי ;1 = 100001 :7 פיסקה זו הגדירה משתנה, ובו ערך התחלתי 21. כעת נוכל להיות בטוחים כי משתנה וה מכיל את הערך 21 טרס שימושו במהלך התוכנית. החלק הביצועי של התוכנית החלק המרכזי של התוכנית הוא החלק אשר בו אנו מכתיבים למחשב מה עליו לבצע. בתחילת קטע זה תמיד תהיה המילה השמורה חז869 (התחלה), ובסופו המילה השמורה .6חם (סוף). 4 שימו לב: לאחר המילה 0ו שבסוף התוכנית כותבים נקודה. 6 פסקל מהצעד הראשון - מהדי 2 הדוגמה הבאה הינה שלד שלס של תוכנית : ; החוכ וחפוטסוס יבןיי הגדרת קבועים ומשתנים מתוחלים מראש זפ הגדרת משתנים חו9סם מהלך התוכנית - .0 פקודות קלט/פלט (ח!6ם?ו/ ח!630ב) כל אשר למדנו עד כה יכול לעזור בבניית משוואות פשוטות, תרגול משתניס והבנת הלוגיקה של המחשב. דבר אחד חשוב עדיין אין אנו יודעים: קלט ופלט - כיצד להזין נתוניס ולהפיק תוצאות. בני אדס לא היו יכוליס לתקשר אס לא היו להס חושים שעוזרים להם בכך. כך גם במקרה של המחשב, המחשב אינו יכול להדפיס את ההודעה ללא פקודות פלט, או לקבל נתונים ללא פקודות קלט. בשפת פסקל יש שתי פקודות בסיסיות המאפשרות לקלוט ולהדפיס נתונים. כאשר אנו רוציס לקלוט נתון, נשתמש בפקודה ח|₪686 (קרא), וכאשר נרצה להדפיס נתון או הודעה נשתמש בפקודה ח!6וז/ (הדפס). כאן עלינו לעצור וללמוד תחילה מהו מבנה הפקודות בשפת פסקל, וכיצד משתמשים בהן. באופן כללי, ניתן לתאר מבנה של פקודה באופן הבא : ;(... ,2החהזהכן ,1 רח3זהק)6רחהח הההוהוהסס סוחהּחה ההּוהוחס6 הוא שס הפקודה (לדוגמה ח|680א, חוסטוז/, או פקודות אחרות שנלמד בהמשך). 1וחהּיוהּכן, 2 וחהּזהּק וכו' הס הנתוניס שאנו מעביריס לפקודה. מכיון שהמחשב אינו יכול יילנחשיי אילו נתוניס אנו רוציס להדפיס, לקלוט או לעבד, אנו חייביס לציין זאת באופן מפורש. קיימות פקודות שדורשות יותר מנתון אחד ולכן, כשקייס מצב כזה, אנו מצייניס את הנתוניסם משמאל לימין (השמאלי ביותר הוא הראשון, והימני ביותר הוא האחרון) ומפרידים ביניהס בפסיק (ץ. פרק 1: מבוא לשפת פסקל 17 כעת ניגש להגדרת הפקודה חְוַ60א8. התבנית שנשתמש בה לפקודה זו: ; (6חהח זוהע) ח|680 סוחהּח זהּע מציין את שס המשתנה שאליו אנו רוצים לקלוט נתון. הדוגמה הבאה קולטת מספר שלס לתוך המשתנה 1, וכופלת אותו בשניים : >טמח1 וחפוטסוק זפ חן 6 חו9סם ;(1) ח|₪680 ;?;*1:=1 0. נתבונן כעת בתוכנית וננסה לחשוב מה חסר בה. במבט ראשון היא נראית כשורה, והמחשב אף יאשר את הרצתה, כך שמבחינה טכנית הכל בסדר. נבחין כי אין אנו מבצעים כל פעולה ממשית לאחר קריאת נתון שלם. לפקודת החישוב אין כל חשיבות אס אין מאחסניס את התוצאה, או מדפיסים אותה. לצורך הדפסת נתוניס קיימת פקודה מיוחדת שכבר הספקנו להכיר. לפקודה זו קוראיס ח!ספוו/ש. תבנית פקודה זו קצת יותר מורכבת מזו של הפקודה ח|₪680 מכיון שבעזרת ההדפסה ניתן להדפיס יותר מנתון אחד, ואף לבצע חישוביס מסוימים. תחילה נלמד את אופן כתיבת הפקודה: ;( ... ,3רחהזהכן ,2חחבּזבכ ,1 וחהּזה0) הוססח/ השאלה הראשונה שכבר עתה ניתן לשאול היא מהס הנתוניס הדרושים לפקודה חוסטוז\? התשובה לכך פשוטה: הפקודה חווז\ היא פקודה מיוחדת, המקבלת כל מספר של משתנים או צירוף שלהס. בהמשך נלמד שיש פקודות בעלות מספר קבוע של פרמטרים ועלינו לציין את כולס. כלל זה אינו חל על פקודה צו. נתבונן בתוכנית הבאה: ; החוכ וחפוטסוס זפ חן 6 חו9סם ;(1) ח|₪680 1:=1*;?; ;(1 , :15 ?טפס סחחד') חוססוו/ .6 אנו רואים כי תוכנית זו והה לתוכנית הקודמת, בשינוי של שורה אחת. בשורה שלפני האחרונה קיימת תוספת : הדפסת התוצאה בשילוב של הודעה מתאימה. 8 פסקל מהצעד הראשון - מהדי 2 נבחן שורה נוספת המדגימה את השימוש בפקודה חוסטוז/: ;(1*2 ,' :15 050 06 ' ,1 ,' :15 סטובע |החופוזס') הוססהז/ שימו לב: כשאנו רוצים להדפיס שתי הודעות ושני ערכים שונים, הערך הראשון מיוצג על ידי המשתנה 1, והערך השני הוא תוצאת חישוב. נשים לב לכך שאפשר לכתוב ינוסחתיי במקוסם שם של משתנה. תחילה תחושב הנוסחה, ולאחר מכן תודפס התוצאה. נציין גסם, כי את ההודעות תחמנו על ידי שני גרשים (), אחד מכל צד. כעת אנו יכולים אף לשפר את התוכנית, ולכתוב אותה כך: 8% ;8ח0סכ ותהזפסוס (1 זה (2 חן (3 4( חו69 (5 ;(' :ז6סוחטח 8 6קץד') חוסטוחש = (6 ;(1) ח|₪680 (7 ;(1*2 ,' :5 4650%') חו|ססוז\ | (8 .0 (9 העדרה: המספרים שמשמאל בכל שורה נכתבו לצורך ההסבר בלבד והם אינם חלק של התוכנית. ננסה להבין מה תוכנית זו עושה: בשורה 3 התוכנית מגדירה משתנה ייז'י מסוג שלס. בשורה 6 המחשב ידפיס הודעה שתבקש מאתנו להקליד מספר כלשהו. בשורה 7 התוכנית תקלוט את המספר אל המשתנה ייז'י, ובשורה 8 היא תדפיס הודעה בצירוף תוצאת החישוב. נזכור לגבי הפקודה חו6)/ו שני דברים חשובים : או פקודה זו יכולה לקבל מספר כלשהו של פרמטרים נתונים). כלומר, אין אנו חייבים לציין לה מספר מסוים של פרמטרים בכל הרצה. ב לפקודה יש תבנית גמישה. נוכל להדפיס הודעות בשילוב משתנים או ערכים כפי שנרצה. פרק 1: מבוא לשפת פסקל 19 עתה, משהכרנו את שתי הפקודות הללו, נוכל להרחיב את ההסבר בנושא קלט/פלט. לימוד פקודות אלו בצורה בסיסית יאפשר לנו להבין את משמעותן ואופן השימוש בהן. נפנה כעת למבנה המורחב יותר של הפקודה ח|₪680. ננסה לבחון מצב שבו אנו רוציס לקרוא כקלט שלושה ערכים ממשיים, כמו לדוגמה, מיקוס במרחב (2, ץ, א). בשיטה הקונבנציונלית שלמדנו עתה נוכל לקרוא את שלושת הנתוניס הללו בשלוש קריאות נפרדות, קריאה בשלוש פקודות חוח₪68. לחילופין, מציעה לנו שפת פסקל דרך נוחה יותר לביצוע מטלה זו: קריאת שלושת הנתוניס הללו תוך שימוש בפקודה ח|₪680 אחת. כיצד נעשה זאת! בדומה לפקודה חופוו/, שבעזרתה ניתן להדפיס כמה מבנים של נתוניס תוך הפרדתם על ידי התו ,יי (פסיק), כך גם ניתן לקרוא נתוניסם אחדים בעזרת פקודת ח|₪680 אחת. נתבונן בקטע התוכנית הבא : ;סכ וחהוטסום ז ]₪68 -:2,%,א חו9סם ;(2 ,ץ ,א) ח|₪680 .0 בתוכנית זו הגדרנו שלושה משתניס ממשיים (2, ץ, א) וקראנו לתוכס שלושה ערכים, וכל ואת בעזרת פקודת ח|₪680 יחידה. כעת נתבונן גס על הפן השני של פקודה זו - מבנה הקלט. כאשר אנו מוריס למחשב לבצע פקודה זו, הוא מצפה לקבל שלושה ערכים ממשיים, שמופרדים ביניהסם ברוותח. לדוגמה, לאחר שנריצ את התוכנית, המחשב ימתין עד שנכניס שורה כגון זו: 14.3 15.2 5 הערך 14.3 יוצב במשתנה א, הערך 15.2 יוצב במשתנה +, והערך 3.5- יוצב במשתנה 2. 0 פסקל מהצעד הראשון - מהדי 2 איך כותבים תוכנית קריאה וברורה שימו לב שוב לכך שאנו כותבים את שורות התוכנית בהזחה (הזזת - הזסו)3?חשחז) מסוימת לימין. ההזחה אינה דרושה לשפת פסקק, אלא לנו, הכותבים וקוראיסם את התוכנית. תוכנית הכתובת בצורה זו יותר ברורה, מכיון שהיא מבליטה את קטעי התוכנית ואת השייכות של פקודות לפקודות אחרות. אנו ממליצים לנהוג לפי הדוגמאות שבספר. פרק 1: מבוא לשפת פסקל 21 פרק 2 אופרטורים חישוביים מהם אופרטורים! המילה אופרטור (ס+פּז6קס) נובעת מהמילה הלועזית חספזפקס, שפירושה 'יפעולה'י. ואמנס, המילה 'אופרטוריי מייצגת פעולה כלשהי. בפרק גה נדון באופרטוריס המבצעים פעולות חישוב. בין השאר נלמד כיצד מבצעיס את ארבע פעולות החשבון הבסיסיות (חיבור, חיסור, כפל וחילוק), חישוב מנה ושארית, וכיצד מפעילים פונקציות מתמטיות בסיסיות לחישוב ערכים מוחלטים, ערכיס ריבועיים, שורשים ועוד. פעולות חשבון בסיסיות כאשר עוסקים בחישובים מתמטיים בשפת פסקל יש לזכור את הכלל הבסיסי: כתיבת תהליך חישוב במחשב תואס בתבניתו לכתיבת משוואה. לדוגמה, את המשוואה 1 + א = ץ נכתוב כך: ;סז ד הההזססזוק זפ |₪68 :ץא חו9סם 1 + א =:ץ .6 בתוכנית זו הגדרנו שני משתניס ממשיים ויישמנו את המשוואה 1 + א = ץ. כפי שניתן להבחין, תבנית כתיבת המשוואה בשפת פסקל דומה לחלוטין לכתיבת משוואה מתמטית. ההבדל היחיד שניתן להבחין בו הוא, שבנוסף לסימן השוויון אנו מוסיפיסם את התו נקודתייםס (:) ומקבלים "=:'' המייצג פעולת השמה למשתנה ולא שוויון. פרק 2: אופרטוריס חישובייס 23 ומה לגבי שאר פעולות החשבון! את פעולת החיסור נבצע, כמובן, עס התו "*", ואת פעולת הכפל נבצע עס התו י*יי (כוכבית). מכיון שקיימיס שני סוגיס של משתנים חשבוניים: השלמים (שמכילים ערכים שלמים בלבד ללא שברים) והממשייס (הכולליס ערכים בצירוף שבריס עשרוניים), עלינו להשתמש בשתי שיטות נפרדות כדי לציין פעולת חילוק. כאשר עוסקים בערכים ממשיים, מבצעים את פעולות החילוק בעזרת התו 'י/יי (לוכסן), וכאשר מבצעים פעולת חילוק בערכיס שלמיס משתמשיס במילה השמורה "עוש'י (קיצור המילה הלועזית חסופועו6 - חילוק). לדוגמה, אס נתוניסם שני ערכים ממשיים (א ו-1) שעלינו לחשב את המנה שלהם (2), נכתוב: 25%]; בשורה זו מחלקיס את א ב-צ (חילוק ערכים ממשיים) ומציבים תוצאה ממשית במשתנה 2. כאשר נתוניס שני משתניס (8, 4) מסוג שלם, ונרצה לחשב את המנה השלמה (6), נכתוב: ;₪ עו 4 =: 6 בשורה זו ביצענו פעולת חילוק בין שני מספרים מסוג שלס (606חו)₪,8 והתוצאה במשתנה 6 אף הוא מסוג שלס. בנוסף לארבעת האופרטוריס הבסיסיים (חיבור, חיסור, כפל וחילוק) קייס אופרטור נוסף, אשר ניתן להשתמש בו רק עס ערכי שלמים. זהו אופרטור השארית - 6סוח, הדומה לכל אופרטור חשבוני אחר. על ידי אופרטור זה אנו יכוליס לחשב את השארית של חלוקת שני מספרים. לדוגמה, כדי לקבל את השארית מחלוקת המספר 9 ב-4 נרשוס: 8:= 9 00 4; בשורה הבאה חישבנו את השארית (מספר שלם) של חלוקת 8 ב-4. ;4 00 8 =:א נבחן עתה את התוכנית הבאה, בדוגמה זו נקבל ב-4 את הערך 1 (בדקו למה): ;|ו0זבּד הההזטסזק (1 זה (2 :600 (3 חו69ם (5 ;(':ז6טרחטח זז 6קץד') הופשחצ - (6 ;(8) ח|₪680 (?7 ; (': 6 טח 0ח5600 שקץד') הוססוו\ - (8 ;(8) ח|4680 - (9 4 פסקל מהצעד הראשון - מהדי 2 ;₪ א40 =: 6 (10 ;5 00 ה =: כ (11 ;(6 , = החפּוז') חוסזח/ | (12 ;(כ ‏ = זההסח5') חוססחצ | (13 .חס (14 בשורה 3 אנו מגדיריס ארבעה משתניס שלמיס שבהס נאחסן את הקלט ואת תוצאות החישוביס שמיועדיס לפלט. בשורה 6 ידפיס המחשב הודעה בנוסתח: 'יהכנס את הערך הראשוויי, ולאחר מכן יקלוט ערך אה לתוך המשתנה 8 (שורה 7]. בשורה 8 נעשה דבר דומה, המחשב ידפיס הודעה בנוסח: י'יהכנס את הערך השנייי ויקלוט ערך זה לתוך המשתנה 8 (שורה 9). בשורה 10 תחושב המנה של חלוקת שני הערכים הללו והתוצאה תוכנס למשתנה 6. בשורה 11 תחושב השארית של חלוקת שני הערכיס הללו והיא תיכתב במשתנה פ. כעת, נותר להורות למחשב להדפיס את תוצאות החישובים. לכן, בשורה 12 הורינו להדפיס את מנת החילוק, ובשורה 13 הורינו להדפיס את שארית החילוק. נתבונן בקלט ופלט של תוכנית זו. נבחר שני ערכיס 10 ו-4 אשר נזין כקלט: :טח לו 6קעד 10 :סרח 56600 6קעד 4 2 = הַח₪8] 561% = 2 סדרי עדיפויות בחישובים מתמטיים כמו באלגברה, כך גס בחישובים הנעשיס בפסקל אנו נוהגיס לפי סדרי עדיפויות של הפעולות. לדוגמה, פעולות כפל וחילוק קודמות לפעולות חיבור וחיסור. לדוגמה, ;3 / 2 + א =: ץ במשוואה זו יחושב הערך 3 / 2, ולאחר מכן יחובר אליו הערך שבמשתנה א. אס היינו רוציס לחבר את שני המשתנים א ו-2 ורק אז לחלק את הסכוס ב-3, היינו מוסיפים למשוואה סוגריים. ;3 / (2 + א)=:ץ באלגברה למדנו שקיימיס שלושה סוגיסם של סוגרייס. הסוג הראשון הוא סוגריים עגולים *י()יי, סוגריים מרובעים יי[ ]'י, והסוג השלישי סוגרייס מסולסלים יי[ +. פרק 2: אופרטוריס חישובייס 25 כאשר כותביס ביטוי מתמטי במחשב אנו משתמשיס בסוגריים העגולים בלבד, כמה פעמים שנרצה. לדוגמה נכתוב את המשוואה הצו: 7 (15 + א * 14) + 2 * 2] + 4% בשפת פסקל נכתוב אותה באופן הבא : 3 1 1 2 3 (((3 / (15 + % * 14) + 2 * 2) + א) =; ץ 3 שימו לב לסגור סוגדיים שפתחתם. בדוגמה לעיל, המספריסם שמעל המשוואה מציינים את יזוגותיי הסוגריים (הס אינם מהווים חלק של הפקודה בפסקק). דוגמאות נוספות למשוואות: 2 2+ %*2 =:ץ ;;*4/ץ=: ;6 * (5 א 8 + 14) =: ;4 0 (8 + 4) =: 6 < > | כעת נפתור דוגמה מעשית. עלינו לכתוב תוכנית, אשר קולטת את הערכיס הבאים: ומן נסיעה של מכונית (בשעות), מהירות ממוצעת (בקמייש), מספר הקילומטרים לליטר ומחיר ליטר דלק. יש לחשב את עלות הנסיעה על פי הנתוניס הללו. נבחן את המשתניס שדרושים לנו: ד - ומן נסיעת המכונית. צ - מהירות המכונית. 5 - | הדרך שעברה המכונית. 6 - | מספר הקילומטריס לליטר. - | מחיר ליטר דלק. סד - מחיר כולל (עלות הנסיעה). 6 פסקל מהצעד הראשון - מהדי 2 כעת נוכל לגשת לכתיבת התוכנית : ;וחד וההזפסזוס 2 זה (2 ;|₪68 :|הססד ,₪ ,6 ,5 ,ד (3 4( חופסם (5 ;('זמך נסיעה:') חומסוזו/ (6 ;(ד) ח|₪680 (?7 ;('מהירות ממוצעת:') חוססחו/ (8 ;(צ) ח|₪680 (9 ;('מספר קילומטרים לליטר דלק:') חומטוזו/ (10 ;(6) ח|₪680 (12 ;('מחיר ליטר דלק:') חומהו (12 ;(ק) ח|₪680 (13 14( ;ץ*ך=: 5 (15 ;ק * (6 / 5) =: |ססדך (16 ;('עלות הנסיעה:' ,|פ6סד ,"ש"ח') חוסט1ז (17 .4 (18 נבחן את מהלך ביצוע התוכנית : בשורה 3 הגדרנו את כל המשתניס הדרושים. בשורות 6 עד 13 אנו קולטים את ארבעת הנתוניס הבסיסיים: זמן נסיעה, מהירות ממוצעת, מספר קילומטריס לליטר ומחיר לליטר. עלינו לחשב תחילה כמה קילומטריס נסעה המכונית. המשוואה שבשורה 15 מבצעת מטלה זו. על ידי כפל מהירות המכונית בזמן הנסיעה מקבלים כמה קילומטריס המכונית נסעה. כדי למצוא את עלות הנסיעה עלינו לחשב את מספר הליטרים שהמכונית צרכה. עושים זאת על ידי חלוקת מספר הקילומטריםס שהמכונית עברה במספר הקילומטרים שהיא יינוסעתיי לליטר. לדוגמה, אם מכונית צורכת עשרה קילומטריס לליטר, הרי שלנסיעה בת 30 קילומטריס יידרשו 3 ליטרים. לכן, הביטוי 6 / 5 מחשב את מספר הליטריס שנדרשו למכונית. אס נכפול את מספר הליטריס שצרכה המכונית במחיר של ליטר אחד, נמצא את עלות הנסיעה הכוללת. הביטוי שבשורה 16 מבצע חישוב זה. תפקיד שורה 17 הוא רק להדפיס את העלות בצירוף הודעה מתאימה. פרק 2: אופרטוריס חישובייס 27 פרוצדורות ופונקציות הפקודות בשפת פסקל מתחלקות למספר קבוצות, וביניהן: פרוצדורות ופונקציות. המילה פרוצדורה נובעת מהמילה הלועזית 60₪6ס6סיזש שמשמעותה תהליך; כשמה כן היא. פקודה שהיא פרוצדורה מקבלת ערך או ערכיס מסוימים, ועל פיהס היא מבצעת תהליך כלשהו. לדוגמה, הפקודה חוטווש היא פרוצדורה, מכינן שהיא מבצעת תהליך מסוים על פי הנתוניס שנותניס לה. על פּי המשפטים, מילים או משתניס הפרוצדורה ח|סטוז\ יודעת כיצד היא צריכה 'ילהתנהגיי, כלומר להדפיס פלט על המסך. גם הפקודה ה|₪680 נחשבת לפרוצדורה, מכיון שהיא קוראת את הקלט לפי המשתנים שמציינים לה. ניתן לסכם ולומר, כי פרוצדורה היא פקודה המבצעת תהליך על פי הנתוניס שאנו מגדירים לה. מהי פונקציה (ח680חט+)! במתמטיקה פונקציה היא פעולה המתבצעת על ערך (מקור) ומחזירה ערך (תמונה) (אסור שתי תמונות למקור אחד). כתיבת פונקציות בשפת פסקל דומה לכתיבת פונקציות במתמטיקה: ;(ץ) 05 =: א ככלל, ניתן להגדיר את תבנית השימוש בפונקציה באופן הבא : ;(0818) 6וח8ח הסחס6חט =: זפ זהּצ הוא המשתנה שמקבל את התוצאה. סוחהח הסושס6הט+ הוא שס הפונקציה שאנו רוצים להפעיל. 3 הוא הנתון (או הנתוניס) שאנו נותניס לפונקציה לצורך חישוב או עיבוד. נתוניס אלה יכולים להיות קבועים או משתנים, או ביטוי משולב. 8 פסקל מהצעד הראשון - מהדי 2 הפונקציה ₪05 (ערך מוחלט) הפונקציה 885 מחזירה את הערך המוחלט של ערך נתון כלשהו. נזכיר כי ערך מוחלט הוא ערך ללא סימן וכותבים אותו במתמטיקה כך: |או. לדוגמה, הערך המוחלט של 1+ הוא 1, וגם הערך המוחלט של 1- הוא 1. כיצד, אם כן, משתמשיסם בפונקציה!: תוכנית דוגמה: ;וסט ההבזטסזק (1 זהצ (2 סז 1 (3 (4 חו069 (5 ;(' :6ט1ה8/ ז6000חו חה 6קץד') הוסטחצ | (6 ;0) ח|₪680 | (7 ;((1) 05 ,' :5" ,1 , ]0 סטוה ססטוספסה') חוסטח\ | (8 .0 (9 בתוכנית זו אנו מגדיריס משתנה שלם (1) בשורה 3. בשורה 6 תדפיס התוכנית הודעה בנוסח "יהכנס מספר שלס כלשהויי. בשורה 7 תקלוט התוכנית את המספר, ובשורה 8 תדפיס את ערכו המוחלט עס הודעה מתאימה. בהנחה כי קלט התוכנית יהיה 9-, נקבל על המסך: :שחו חהּ 6קץד 9 9 5 9- 06 סטש 050006 הפונקציה זף5 (ערך ריבועי) הפונקציה ז56 מחשבת את הערך הריבועי (בחזקה של שניים) של נתון כלשהו. לדוגמה, התוכנית הבאה תקלוט מספר ממשי ותדפיס את ערכו הריבועי: ;6זה 5 הוהבזססזוס זה |₪68 :₪ חו9סם ;(':6!פצ |68ז 3 חו 6קעד') חובסוו/ ;(₪) ה|₪680 ;((₪) זפ ,' = 6זהוס5') חוססוו/ .0 פרק 2: אופרטוריס חישובייס 29 הפונקציה +זף5 (שורש ריבועי) התהליך ההפוך של חישוב ערך ריבועי הוא חישוב שורש ריבועי. לשס כך מספקת לנו פסקל את הפונקציה +ו560 שמחשבת שורש ריבועי של ערך נתון. לדוגמה, התוכנית הבאה תחשב את השורש הריבועי של קלט התוכנית : 500 ההפזססזס ז |₪68 :₪ חו9סם ;(':6ט!פע |68ז 3 חו ס6קעד') חובסחזו/ ;(₪) ה|₪680 ;((₪) +וף5 ,' = זססז 6זהטוס5') חוססוזו/ .0 הערה: חשוב לציין שאין שורש למספר ממשי שלילי, ולכן הניסיון לחשב שורש ריבועי של מספר כזה יגרוס למחשב לעצור ולהודיע על שגיאה. הפונקציה 0106 (המרת תו לערך אסקי) לכל תו במחשב יש קוד מספרי המייצג אותו. כדי ליצור אחידות, נקבע תקן המגדיר מספרים המייצגיסם את התווים. לדוגמה, נקבע כי הערך 65 מייצג את התו ה, הערך 66 מייצג את התו 8, הערך 38 מייצג התו 6 וכך הלאה. לכל מספר המייצג תו קוראיס קוד אסקי (6006 45611) על שם המכון האמריקאי שקבע תקן וה. כדי להקל על השימוש בקודים אלה, מספקת פסקל פונקציה שתפקידה לקבל תו כלשהו ולהמיר אותו לקוד אסקי. ווהי הפונקציה 06 שאנו עוסקיס בה כעת. לשס הדגמה, נבחן את התוכנית הבאה: ;]וזב ד הההוטסוס זפ 6: 7; חז % חו9סם %' =: ח6 ;(ח0) 00 =: א .0 0 פסקל מהצעד הראשון - מהדי 2 בתוכנית זו הגדרנו שני משתניס. הראשון הוא 60 מסוג תו, והשני הוא א מסוג שלס. בתחילת התוכנית הצבנו במשתנה 0 את התו ''4יי, ובשורה לאחר מכן קיבלנו את ערך אסקי של המשתנה השלם א. כעת אנו יודעיס כיצד פונקציה זו פועלת: היא מקבלת תו ומחזירה ערך שלס המייצג את קוד אסקי שלו. הפונקציה זוז6 (המרת קוד אסקי לתו) הפונקציה ?ח6 הפוכה לפונקציה 6זס. תפקידה לקבל קוד אסקי ולהמיר אותו לתו המתאים. נדגיס ואת בעזרת התוכנית הבאה: ;]וזב ד הההוטסוס 0% = 1000 :7 ז ;67 :6 חו0סם ;(?) זח6 =: 6 .0 בתוכנית וו הגדרנו משתנה מאותחל מראש () מסוג שלם, שערכו 68. בנוסף הגדרנו גסם משתנה מסוג תו בשס ת60. מהלך התוכנית כולל שורה אחת שתפקידה להמיר את הערך שבמשתנה 1 לתו. תהליך אה נעשה בעזרת הפונקציה זח6, שמקבלת את ערכו של המשתנה 1 וממירה אותו לתו המאוחסן במשתנה ת6. הפונקציות 10% (בידוד הערך השלם) ו-6חטזד (המרת ערך ממשי לשלם) שפת פסקל כוללת מספר סוגים של פונקציות, כפי שכבר ראינו, ביניהן פונקציות חישוב, כמו למשל, הפונקציה +ז56, אשר מחשבת שורש של ערך נתון ופונקציות המרה של תוויס לקוד אסקי ולהיפך. פונקציות ההמרה אינן פונקציות חישוב במובן הפשוט, וכך גם הפונקציה 16. היא עוסקת בערכיס ממשיים, אך אינה פונקציה שמחשבת ערכים. כעת נסביר ואת. תפקיד הפונקציה 1% להציג את הערך השלס בלבד של מספר ממשי. לדוגמה, אס ניתן לפונקציה את הערך 13.96 היא תחזיר את הערך 13.00. אס ניתן לפונקציה את הערך 9.4623- היא תחזיר את הערך 9.00- וכך הלאה. פונקציה זו 'ימבודדת'י את הערך השלס מתוך הערך הממשי. הפונקציה 6חשזד גס כן מבודדת את הערך השלס מתוך ערך ממשי נתון. פרק 2: אופרטורים חישוביים 31 ההבדל בין שתי הפונקציות הוא בכך, שהפונקציה 10 מקבלת ערך מסוג ממשי ומחזירה ערך מסוג ממשי. לעומתה, הפונקציה 6חטזד מקבלת עוך מסוג ממשי ומחזירה ערך מסוג שלם. % זכרו: בשני המקרים מקבלים את הערך השלם של הערך הנתון בלבד. הפונקציה 6חט0סח (עיגול ערך ממשלי) למדנו שהפונקציה 6חטזד מאפשרת להמיר ערך ממשי לערך שלם. לעיתים אנו רוצים לעגל ערך, ולא לקצץ את החלק העשרוני של המספר. כדי לעשות זאת צריך להתחשב בשבר לצורך ההמרה. לדוגמה, נעגל את הערך 4.49 לערך 4, מכיוו שהשבר קטן מ-0.5. בדומה, את הערך 4.58 נעגל לערך 5 מכיןן שהשבר שווה (או גדול במקריס אחריס) ל-0.5. כדי לעשות את נשתמש בפונקציה 6חטסא לפי הדוגמה בתוכנית הבאה: ; 8 הטוס הסיוס זה ; |₪68 :₪ חו9סם ;(':6ט!פע |68ז 8 חו 6קעד') חובטוז ;(₪) ח|₪680 ;((₪) ₪00 ,' :6ט|בע ס6סתטסח') חוססוו/ .0 בתוכנית זו הגדרנו משתנה ממשי 8. במהלך התוכנית תודפס הודעה המבקשת מהמשתמש להכניס ערך ממשי כלשהו (הערך נקלט במשתנה א). אחר כך התוכנית תדפיס את הערך לאחר שעבר תהליך עיגול ותציג הודעה מתאימה. הפונקציה 86ז= (בידוד שבר עשרוני) דנו ווה עתה בתפקיד הפונקציה %ח1. מטרתה לבודד את הערך השלס מתוך ערך ממשי נתון. קיימת פונקציה נוספת היימשלימהיי אותה. הכוונה היא, שקיימת פונקציה שתפקידה לבודד את השבר, בדומה לאופן שהפונקציה %ח1 מבודדת את החלק השלם. לפונקציה זו קוראיס 86ז=. הפונקציה מקבלת ערך ממשי כלשהו ומחזירה ערך ממשי המורכב אך ורק משבר עשרוני. לדוגמה, אס ניתן לפונקציה את הערך 11.059 נקבל את הערך 0.059. 2 פסקל מהצעד הראשון - מהדי 2 נדגיס את בעזרת התוכנית הבאה: ;68|/8!65 ההבזססזס זה ;|₪68 :₪ חו9סם ;(':6!פצ |68ז 3 חו ס6קעד') חובסחו/ ;(₪) ה|₪680 ;((₪) %ח1 ,' :6טופע חובו') חוססוו/ ;((₪) ₪786 ,' :הסס6הזת') הוססוו/ .0 בתוכנית זו הגדרנו משתנה ממשי 8. בתחילת התוכנית מציגיס הודעה המבקשת מהמשתמש להכניס ערך ממשי שלאחר מכן נקלט לתוך המשתנה ₪. בסופה של התוכנית אנו מדפיסיס את ערכו השלס של הערך (בעזרת הפונקציה %חז) ואת ערך השבר (בעזרת הפונקציה 86זח). הפונקציה ו00₪ח₪3 (יצירת מספר אקראל) אם נפעיל את הפונקציה ז% על הערך 3 מספר פעמים, נקבל תמיד את הערך 9, מכיון שתמיד נפעל על אותו ערך בסיסי. הפונקציה 830601 מחזירה ערכיס שונים בכל הפעלה שלה: אלה הס ערכיס אקראייס מתוך קבוצת ערכיס המוגדרת בארגומנט הנמסר לפונקציה. הפעלת הפונקציה (ח) והססחהּז ח - מספר שלס. הפונקציה מחזירה מספר שלס בתחום: א > ערך מוחזר >= 0 דוגמה : הדפסת מספרים אקראיים בתחום 1 עד 49 (כמו בלוטו). חו9סם 0 0 1 = :ן זס+ ;(1+(49)ר ססחז)ח|סז/ .6 בקטע וה, התוכנית יימגרילה" 6 מספרים שמודפסים על ידי הפרוצדורה חוססז/ש. פרק 2: אופרטוריס חישובייסם 33 הקיצוניים) ולכן, לאחר הגרלת המספר אנו מחברים 1 למספר האקראי שהתקבל, כדי לקבל מספר בתחוס 1-42 (בהתאם לדרישתנו). שימו לב: המספר שמוגרל הוא בתחום 0 עד 48 (כולל שמי הערכים שאלה: האס כל 6 המספרים שיוגרלו יהיו שוניס! תשובה: לא! בכל פעס שהפונקציה מופעלת יש סיכוי שווה לכל אחד מהמספריס בתחום 0 עד 88, וייתכן מקרה קיצוני שאינו סביר מבתינה סטטיסטית, שבו כל 6 המספריס האקראיים יהיו זהים. הפרוצדורה 26ווהס60חב3א הפונקציה החס0ח8א8 מחזירה תמיד את אותה קבוצת ערכים מתוך קבוצה מוגדרת (אין זו אקראיות אמיתית). על כן, רצוי לרשוסם קריאה לפרוצדורה 6 חה, ללא פרמטריס כלשהם. הפרוצדורה הזו יוצרת שינוי באופן הגרלת המספריםס האקראייס כשמפעילים את הפונקציה וחססח8ּח. נכתוב תוכנית לדוגמה: ;6 וחהוטסוק זפ חו:פחה, ץ,א,ו חו0סם ;26ו סח 0 0 =:ן זסז חופסם ;1+(10)וחססחה"=:א ;1 +(10)וחססחה"=:ץ ;('' = ,ץ, * ',א) חוססח/ש ; (805)ח|80ז חסוז ץ * א = פחה + 6 ('ססספ')חוססוז/ ;('פחסזצו')ח|ס 7 0. תוכנית זו יימייצרתיי 9 תרגילי כפל (המספריס שיוגרלו הס בתחוס 1 עד 10) התרגיל הכולל את המספריס שהוגרלו מוצג למפעיל התוכנית, מתקבל קלט תשובה לתרגיל ונבדקת נכונות התשובה. אתגר: הוסיפו לתוכנית הודעות למשתמש, וכן הוסיפו אפשרות למתן ציון לתלמיד לאחר סדרת התרגיליס. 4 פסקל מהצעד הראשון - מהדי 2 תרגילים תרגיל 2.1 כתבו תוכנית שקולטת שלושה ערכים שלמים 6, 8, 4) ומחשבת את הממוצע. תרגיל 2.2 כתבו תוכנית המקבלת כקלט שלושה ערכיס שלמיס לתוך המשתנים א, 8 ו-6. התוכנית תחשב את השארית מחלוקת 4 בסכוס 8+6. תרגיל 2.3 כתבו תוכנית הקולטת משקל בטונות ומדפיסה אותו בגרמים. תרגיל 2.4 כתבו תוכנית הקולטת שלושה ערכיס ממשייסם ומדפיסה את סכומם, מכפלתס והממוצע שלהס. תרגיל 2.5 כתבו תוכנית הקולטת ערך שלס ומדפיסה את ערכו בסימן ההפוך. לדוגמה, הכנסת המספר 4 תגרוס למחשב להדפיס את המספר 4-, הכנסת המספר 9- תגרוס למחשב להדפיס את המספר ל וכך הלאה. תרגיל 2.6 כתבו תוכנית הקולטת מספר בעל ספרה אחת או שתי ספרות ומדפיסה את ערכי היחידות והעשרות של המספר. (רמז: יש להשתמש באופרטורים 6סוח ו-צו0). תרגיל 2.7 כתבו תוכנית הקולטת ערך, מחשבת ומדפיסה את הערך הריבועי שלו ואת השורש הריבועי. כדי לא לגרוס לבעיות, על התוכנית לחשב תחילה את ערכו המוחלט של המספר הנקלט. (רמז: את משתנה הקלט יש להגדיר כמשתנח ממש"). תרגיל 2.8 כתבו תוכנית הקולטת תו בודד ומדפיסה את ערך אסקי שלו. פרק 2: אופרטוריס חישובייסם 35 תרגיל 2.9 כתבו תוכנית הקולטת תו בודד ומדפיסה את התו הבא בטבלת אסקי. תרגיל 2.10 כתבו תוכנית הקולטת ערך ממשי ומדפיסה את החלק העשרוני שלו. (רמז: לשס כך יש להשתמש בפונקציה 86ז=). תרגיל 2.11 כתבו תוכנית הקולטת את שלושת המימדיס של קוביה (גובה, אורך ורוחב) ומחשבת את הנפח שלה. תרגיל 2.12 כתבו תוכנית הקולטת ערך ממשי ומיישמת את הפעולה של הפונקציה 86זח, בתהליך שיתן את אותה התוצאה ללא שימוש בפונקציה צו. תרגיל 2.13 כתבו תוכנית הקולטת ערך שלסם שאינו שווה ל-0 ומדפיסה את סימנו בלבד. לדוגמה, אם ייקלט ערך שלילי התוכנית תדפיס את הערך 1-, ואס ייקלט מספר חיובי התוכנית תדפיס 1. (רמז: יש להשתמש בפונקציה 05). תרגיל 2.14 כתה בת 37 תלמידים יצאה לטיול. במהלך הטיול התבקשו התלמידים להתחלק לקבוצות של חמישה תלמידים לכל קבוצה. כתבו תוכנית המדפיסה את מספר הקבוצות שבהן יש חמישה תלמידים ואת מספר התלמידים שנשארו ללא קבוצה. (רמז: יש להשתמש באופרטורים 00 ו-/ו0). 6 פסקל מהצעד הראשון - מהדי 2 פרק 3 אלגברה בוליאנית מהי אלגברה בוליאנית? כאשר עסקנו בפרק הראשון בסוגיס שוניס של משתנים, פגשנו בסוג מיוחד של משתנה בשס משתנה בוליאני (סַטהּזהּט 800168₪). משתנה מסוג זה מייצג אך ורק שני ערכיס: כן ולא (סא/65+). אס היה באפשרותנו לרדת לרמה הבסיסית של המחשב ולנתח את מבנהו של משתנה זה, היינו רואיסם כי אהו למעשה משתנה שלם, המכיל את הערך 'יסיי או יי1יי. הערך '0יי מייצג לא והערך 1 מייצג כן. נזכיר גם, כי כן מייצג את המילה שטיוד ולא מייצג את המילה 3156=. האלגברה הבוליאנית מטפלת בפסוקים לוגיים וחישוב פסוקים לוגייסם. פסוק לוגי הוא ביטוי פשוט או מורכב המקבל ערך 'אמתיי או יישקריי. פעולות על פסוקיס לוגייס מתבצעות באמצעות אופרטורים לוגיים. נגדיר את המאפייניס הבסיסיים של אלגברה זו: א) המילה 3156" (שקר) מגדירה את המצב 0, והמילה שטיוד (אמת) מגדירה את המצב 1. ב) 0 הוא ההיפך של 1 (1 הוא ההיפך של 0). ג) קיימות שלוש פעולות בסיסיות : חיבור, כפל והיפוך. ד) פעולת חיבור לוגי: 0+0=0 0+1=1 1 1+0 11 +1 פרק 3: אלגברה בוליאנית | 37 ה) פעולות כפל לוגי: ו פעולת היפוך לוגל: פעולת ההיפוך הופכת את מצב הערך, כלומר מצב 6טזד הופך למצב 8|56= ולהיפך. כיצד כל זה מתקשר למחשב! לאלגברה הבוליאנית יש שימוש נרחב בתחומי המחשוב. למעשה, ווהי צורת העבודה של המחשב. המעבד הראשי המפעיל את המחשב מבין אך ורק את שני המצבים ייסיי ו-'1'י. מכיוו שזהו המצב, לא היה ניתן להזניח נושא ה בשפת פסקל, שבה קיימיס האופרטוריס הלוגיים שבאמצעותס ניתן לבנות תנאיס מורכבים. האופרטורים 08 (חיבור לוגי), פאה (כפל לוגי) ו- דסא (היפוך לוגי) נגדיר שלושה משתניס , 5 ו-6 כמשתניס בוליאניס. 'ינחבריי את ₪ ו-5 כך שהתוצאה תתקבל ב-6. נוכל לכתוב ואת כך: ;5 | =: 6 כלומר, ישנס שני מצביס המיוצגיס על ידי ה ו- 8. פעולת 08 (י'אויי) גורמת לכך שב-6 נקבל מצב 'יאמת'' (1) אם לפחות אחד מהמשתנים ₪ או 8 ייצג מצב 1. ובעברית פשוטה: אס ב-4 או ב-8 היה 'י1' - נקבל ב-6 את המצב 'י1'י. באותו אופן, אם נרצה לכפול את 4 ו-8 כך שהתוצאה תתקבל ב-6 נכתוב: ;5 80 4 =: 6 אנו מבקשיס לקבל ב-6 מצב שנמצא גם ב-4 וגם ב-8. כלומר רק אס גם ב-4 וגם ב-8 יש יי1יי נקבל ב-6 את המצב 'י1''. בכל מצב אחר נקבל ב-6 את המצב יסיי. הפעולה הבסיסית האחרונה היא "'היפוך מצביי, ולשס כך אנו משתמשיס באופרטור דסא. לדוגמה: ;4 0%ח =: 3 8 פסקל מהצעד הראשון - מהדי 2 ביטוי וה יגרוס למשתנה ‏ להפוך את מצבו. אס היה קיים במשתנה הערך ''יסטזדיי, הוא יהיה כעת '8!56'' ולהיפך. אם ב-4 ישנו המצב ייסיי, ונכתוב את הביטוי הזה, ;4 0%ח =: 8 נקבל שערך המשתנה הפך ל-'י1'י. כמו בפעולות אריתמטיות, גס בפעולות לוגיות יש סדר עדיפות לביצוע: דסא - בעדיפות הגבוהה ביותר, אחריה סאג, ולבסוף - 08. ביטויי שוויון ואי- שוויוו במתמטיקה קיימיס שני סוגיס של תבניות פסוק: משוואות ואי-שוויוניס. משוואות שוויון מגדיריס בעזרת התו "=". אי-שוויוניס מגדיריס על ידי חמישה ביטויים שונים: גדול (<), קטן (>), גדול או שווה (<), קטן או שווה (>) אין שוויוו 9). בפסקל מסמניס באופן הבא את ששת הסמלים של שוויון ואי-שוויון: הביטוי הסמן שווה = לא שווה <> (התו < ולאחריו >) גדול > קטן < גדול או שווה =< קטן או שווה => כעת אנו יכוליס לחזור לאלגברה הבוליאנית ולאופן היישוס שלה בפסקל. נתבונןו בביטוי הבא, שבו המשתנה ‏ מוגדר כמשתנה בוליאני: ;5 < 9 =: 3 במבט ראשון, ביטוי וה ייראה לנו כטעות. ננסה לבחון את המצב "ימנקודת הראות" של המחשב. כאשר המחשב נתקל בביטוי 9 > 5 הוא משווה בין שני הערכים. מכיון ש-5 קטן מ-9, המחשב מוצא כי הביטוי הזה נכון, ועל כן הוא מציב במקומו את הערך יפטזדיי. כעת אנו יכולים להבין כי המשתנה 84 מקבל את הערך ייפטזדיי. באותו אופן, אס היה על המחשב לבחון את הביטוי הבא : 2:= 21; פרק 3: אלגברה בוליאנית ‏ 39 היינו מקבליס במשתנה ₪ את הערך "6פו='יי, מכיון שביטוי זה לא נכון. כלומר, התשובה היא יילאיי. התוכנית הבאה מדגימה שימוש בביטוי דומח: ;סכ וחהוטסום זְהָּץ סז 41 חו9סם ;(':(₪ ,ג) 65!פע זס0ססחו סט חו סקעד') חוססוו/ ;(5 ,ה) ח|₪680 ;(8 = ה) חוססוזו/ .0 בתוכנית זו הגדרנו שני משתניס שלמיסם. בשתי השורות הראשונות של התוכנית אנו מדפיסיס הודעה המבקשת מהמשתמש להכניס שני ערכים שלמיס הנקלטיס למשתניס 4 ו-8. בשורה האחרונה של התוכנית אנו מציגים את התוצאה של הביטוי 5 = 4. אס שני הערכיס זהים, התוכנית תדפיס את המילה יים(חדיי, ואס לא - היא תדפיס 55 |גח'י. לאחר שהבנו את האופרטוריס הללו, נשלב גס את האופרטורים 08 ו-סצג. נתבונו בדוגמה הבאה (בהנחה שהמשתנים 8, 8 ו-6 מוגדריסם כשלמים ו-5 כמשתנה בוליאנ") : ;(60 = ה) סח (8 > ) =: םס את הביטוי הזה ניתן להבין מקריאה בלבד. נסביר אותו: אם ערך המשתנה 4 קטן מערך המשתנה 8, וגם ערך המשתנה 4 שווה לערך המשתנה 6, אז המשתנה פ יקבל את הערך פטזדיי. בכל מצב אחר יתקבל הערך "8156" במשתנה זה. באותו אופן ניתן להשתמש באופרטור 08 (ייאוי): (0 = ג) זס (8 > ) =: םס במשתנה כ יתקבל הערך 6טזדיי כאשר ערך המשתנה 4 קטן מערך המשתנה 8, או כאשר ערך המשתנה שווה לערך המשתנה 6. 0 פסקל מהצעד הראשון - מהדי 2 תרגילים תרגיל 3.1 כתבו תוכנית הקולטת שלושה ערכיס שלמים. התוכנית תדפיס יפטזדיי אס שנייס מתוך שלושת הערכים שווים, או ''8156=י אם אין שני ערכים שווים. תרגיל 3.2 כתבו תוכנית הקולטת שלושה ערכיס שלמים. התוכנית תדפיס יפטזדיי אס הערכיס שהתקבלו הס בסדר עולה (הראשון קטן מהשני, והשני קטן מהשלישי). תרגיל 3.3 כתבו תוכנית הקולטת שני ערכים שלמים. התוכנית תדפיס ייסטזדיי אס שני המשתניס שווים ל-0. אס לא, התוכנית תדפיס את הערך "856" . פרק 3: אלגברה בוליאנית ‏ 41 פדק 4 התניות ולולאות הקדמה בעזרת הידע שצברנו עד כה עלה בידינו ליצור תוכניות חישוב שונות. אף על פי כן, ניתן להבחין במגבלה בולטת לעין: לא יכולנו להגדיר תנאים לפעולת התוכנית. לדוגמה, אנו רוציס להציג בפני המשתמש את ההודעה ייהאם ברצונך להמשיך (כן/לא)!'י, לקרוא את התשובה ולפעול בהתאס. אנו יודעיס כיצד להדפיס את ההודעה, לקרוא את הקלט מהמשתמש, אך אין אנו יודעיס כיצד לפעול על פי התשובה, כלומר - להמשיך או להפסיק. נבחן דוגמה נוספת: אנו רוציס לכתוב תוכנית המבקשת מהמשתמש להכניס מספר מ-0 עד 10. אס המשתמש מכניס מספר שגוי, התוכנית תדפיס הודעת שגיאה ותבקש מספר נוסף. גס כאן אנו יודעיס כיצד להדפיס הודעה ולקרוא נתונים, אך אין אנו יכוליס לבצע עמס דבר. בפרק וה נעסוק בהתניות ולולאות. נלמד את הדרך שבה מציגים למחשב ייתנאייי לבדיקה, ועל-פי תוצאת הבדיקה נקבע המשך מהלך ביצוע התוכנית. בנוסף, נלמד גס על הלולאות - הדרכיס לחזור על סדרת פקודות על פי תנאיס שוניס. התניות התניה היא הגדרה למצב שבו אנו מציגיס למחשב תנאי (ח0 וח 600). אס התנאי מתקיים, יתבצע תהליך מסויסם שקבענו מראש. אס התנאי אינו מתקיים, לא יתבצע התהליך הזה, או לחילופין יתבצע תהליך שונה, ולאחר מכן התוכנית תמשיך במהלכה. את תבנית ההתניה ניתן לכתוב כך: ;[601רח50316 ]| הח6ל [ הסו655זקא6] 11 פרק 4: התניות ולולאות | 43 בעברית ניתן לתאר ואת כך: אם 10) [ביטוי התנאי] אז (ח6חז) [פעולה]. כלומר, אם התנאי מתקייס אז תתבצע הפעולה. לדוגמח: ;(8) ח|₪680 ;('258₪0') הוסזח/ הסחז 0 = ג זו בקטע תוכנית זו אנו קולטיס ערך מספרי לתוך המשתנה 4. בשורה שלאחר מכן אנו מציביס למחשב תנאי: אס הערך במשתנה 4 שווה ל-0, אז הדפס את המילה 2580, בכל מקרה אחר כאשר לא יתקבל הערך 0, לא תודפס ההודעה. כעת נשלב את כללי האלגברה הבוליאנית שלמדנו: ;(8) ח|₪680 ;('0') החוש /\ הסרז (10 > ג) סחהּ (0 < ג) זו כאן אנו קולטיס ערך מספרי לתוך המשתנה 8. בשורה השנייה אנו מציביס תנאי: אס ערך המשתנה 4 גדול מ-0 וקטן מ-10, אז תודפס ההודעה 'יאסיי. במיליס אחרות, ניתן לומר כי כאשר מתקבל ביטוי שהוא נכון (ייסטזדיי) אזי מתבצעת הפעולה שכתובה לאחר חסחז. כדי לנצל את הפוטנציאל שקיים בביטוי התניה, יש הרחבה של מבנה זה. בנוסף לתבנית הבסיסית שראינו יש תבנית מורחבת: הסח [חהסו655זקאם] זו [ 5%9%006011] 6 21 5] בעברית ניתן להגדיר את כך: אם 10) ביטוי התנאי [276551005א6] מתקייס אז (ח16ף) יש לבצע את קטע התוכנית 01ח6חח6ז5%8, אחרת (6156) יש לבצע את %2ח558606. את ביטוי התנאי כתבנו כפי שלמדנו, אך כאן אנו מבצעיס את קטע התוכנית 519061 אם התנאי מתקיים, ואם התנאי לא מתקיים - כלומר, אחרת (6156) - מבצעיס את קטע התוכנית 5%80606002. לאחר ביצוע אחד משני קטעי התוכנית על פי בדיקת התנאי, התוכנית תמשיך בפקודה שלאחר הפקודה *ו. באנגלית מכניס ביטוי זה בשס : 160-6156+-11, ובעברית : אם-אז-אחרת. 4 פסקל מהצעד הראשון - מהדי 2 כעת אנו יכוליס להרחיב את הדוגמה הראשונה שעסקנו בה: ;(8) ח|₪680 חסחץ 0 = ג זו ('25₪0') חוססוו/ 6 ; ('2530 דסאצז') מובטוש בשורה הראשונה התוכנית קולטת מספר המאוחסן במשתנה ג. בשורה שלאחר מכן אנו מציביס התניה: אם הערך שבמשתנה 4 שווה ל-0 תודפס ההודעה 0 אחרת (אס לא שווה ל-0) תודפס ההודעה 2580 דסא. התוספת 6|56 חוסכת מאתנו את הצורך בהתניה נוספת עבור המצב השני (המצב בו ערך המשתנה ₪ אינו שווה ל-0) ויוברת תוכנית מובנת יותר. הערה: יש לשים לב כי בסוף הפקודה הראשונה שמופיעה אחרי ‏ 8 במקרה שלנו (יסמתשי) הוסוח/ץ) אין שמיס את התו נקודה-פסיק (6, מכיון שמשפט התנאי לא הסתיים. התו נקודה פסיק (0 יופיע בסיום המשפט ₪ בלבד. נבחן דוגמה נוספת: ;008 וההזפסזק (1 זה (2 ;687 :6 (3 חו69 (5 ;(':-ז8ח6 0!6חו5 3 חו ס6קעץד') חובסחו/ (6 ;(ח0) ח|₪680 (?7 חסוש 'ץצ' = ה0 +ו (8 ;('סםץ") חוססוז/ (9 חס 'א' = ח6 א (10 ('סא') חוסטח/ (12 12( 0. בתוכנית וו הגדרנו משתנה ח6 מסוג תו. בשורה 6 אנו מציגיס הודעה המבקשת מהמשתמש להקיש תו בודד. בשורה 7 התוכנית קוראת את התו הזה ומאחסנת אותו במשתנה ח6. ההתניה שבשורה 8 קובעת: אס תוכן המשתנה ח6 (התו שנתקבל על ידי המשתמש) הוא ייציי, תודפס המילה 5םץ. בשורה 10 קיימת התניה דומה: אס תוכן המשתנה ח6₪ הוא ייאיי - תודפס המילה סא. פרק 4: התניות ולולאות 45 לפני שנבחן דוגמה נוספת, נזכיר כי לכל תו יש קוד אסקי (דנו בנושא וה כאשר עסקנו בפונקציות זח6 ו-0זס בפרק 2). בשל כך, על פי טבלת קוד אסקי האות ייהיי נמצאת לפני האות 'יפיי, והאות "?יי נמצאת אחרי האות יציי. בדוגמה הבאה ננצל תכונה זו: ;8חחחסכ וההזטסזק (1 זהצ (2 ;67 :ו (3 4( חו69ס (5 ;(' :ז3ח6 0!6חו5 3 חו ס6קץד') חוסטחצ = (6 ;(ח0) ח|₪690 | (7 חס ('2' => ח60) סחה ('ח' =< ת60) זו (8 ; ('!!! 2 ס% 2 ח66שסס סטו3/") חובפח/ש (9 10( 0. בתוכנית זו הגדרנו משתנה ח6 מסוג תו. בשורה 7 התוכנית קולטת תו בודד לתוך המשתנה ח6. בשורה 8 קיימת התניה שננתח את מרכיביה. בחלק הראשון של ההתניה נשאלת שאלה: האס התו המאוחסן במשתנה ח6 גדול או שווה ל-. לכל תו יש קוד מספרי המייצג אותו, ולכן ניתן לערוך השוואות בין תוויס. במקרה שלנו, אנו שואליסם אס קוד אסקי של התו במשתנה ח6 גדול או שווה לקוד אסקי של התו ג. במקרה השני אנו שואליס שאלה דומה: האס קוד אסקי של התו במשתנה 6 קטן מקוד אסקי של המשתנה 2. את שתי ההתניות הללו אנו כותביס יחד, וכך מקבליס התניה מורכבת (שורות 9-8): אם התו שב-60 גדול או שווה ל-:יאי' וגם קטן או שווה ל-יי2יי (כלומר בתחוס של ג עד 2) אז התוכנית תדפיס את ההודעה 'י!!! 2 סז ה ח66שסס 6טובּ/יי. כעת נוכל להבין את החשיבות של קוד אסקי, שבעזרתו ניתן לקבוע היכן נמצא כל תו בטבלה ומהו ייסדריי התוויס. לדוגמה, התו 4 קטן מבחינה ערכית מהתו 0 וגס התו 0 קטן מהתו 8. הערה: יש לציין כי ערך אסקי של התו 'יפ'י אינו שווה לערך אסקי של התו ייאיי. לתו 8 יש ערך גבוה מזה של יימיי. כלכומר, יש אבחנה ברורה בין ערכי התווים של אותיות גדולות וקטנות באנגלית. 6 פסקל מהצעד הראשון - מהדי 2 לולאות מבנה תכנות בסיסי נוסף הוא הלולאה (קסס!). הלולאה כשמה כן היא - תהליך החוזר על עצמו. התהליך הוא קבוצת פקודות. קיימים שני סוגיס של לולאות: > לולאה קבועה. > לולאה מותנית. לולאה קבועה היא תהליך החוזר על עצמו מספר קבוע של פעמים, כפי שהמתכנת קובע מראש. בשפת פסקל, כמו בשפות אחרות, אנו משתמשיס במבנה הבא: ;|0ח6ח5%900] 0 אהו סש הווח =: סוחהח זבּ יוס+ ניתן לנסח ואת בעברית בצורה הבאה: בזמן (זס)) שהמשתנה השלס פוחפח זפּצ נע בתחוס שבין חווח עד (0פ) אהוח, בצע (ס6) את ההוראה ([60%ו5%3%6₪]). לדוגמה, אס ברצוננו להדפיס את כל הערכיס מ-1 עד 10, נכתוב: ;(1) הוח / 00 10 160 =: 1 זסז בתחילה, המשתנה 1 (משתנה שלסם) יקבל את הערך 1. לאחר הדפסת הערך (בעזרת הפקודה חפח/) יוגדל ערכו של המשתנה 1 ב-1, ושוב יודפס ערכו. תהליך זה יימשך עד אשר 1 יגיע לערכו העליון (10). נציג דוגמה נוספת: אנו רוציס לכתוב תוכנית שתשאל את המשתמש איוה תחוס ערכיס הוא רוצה להציג על המסך. עס הידע שהיה לנו עד כה לא היה באפשרותנו ליצור תהליך שכזה, אך כעת אנו יכוליס לעשות זאת : ;הטטק ההפזטסזק (1 זה (2 :זססחהט 60 ,₪ 1 (3 4( חופ06 (5 ; (':(1 , 1) סוחזו! חףוח 6ח+ סחה שצס! 6 סקעד') חובסוו | (6 ;( ,1) חו ₪680‏ (7 ;זט 00) הוסזח) 00 3 0 ] =: זססהטס6 זסו (8 .0 (9 בתוכנית זו הגדרנו שלושה משתנים שלמים: 1 שיגדיר את התחוס התחתון, ₪ שיגדיר את התחוס העליון, ו-זחט60 - שישמש כמונה. בשורה 6 התוכנית מדפיסה בקשה להכנסת שני מספרים שיגדירו את התחוס התחתון והעליון. פרק 4: התניות ולולאות 47 בשורה 7 התוכנית קולטת את שני הערכים הללו לתוך המשתנים ] ו-₪. בשורה 8 הגדרנו לולאה שתגרוס למשתנה זסזחטס6 יילנועיי בתחוס בין 5 ל-ח, כך שכל פעם יודפס ערכו של המונה זס6חטס6. נבחן עתה מצב נוסף של הלולאה: ; ... 00 1 0 3 =: 1 זסז כאן מובאת בפנינו דוגמה שבה אנו מבקשיס מהמחשב למנות מ-3 עד 1. מכיןון שהתחוס התחתון (3) גדול בערכו של התחוסם העליון (1), הלולאה לא תתבצע אפילו פעס אחת. בכל זאת, מה יקרה כאשר נהיה חייבים למנות בסדר יורד, לדוגמה מ-9 ל-4! לשם כך נגדיר גירסה נוספת ללולאה זסו. במקוס המילה 0+ נכתוב ס+ח/שס6, שפירושה ייבירידה עד...יי. כעת, אס נרצה למנות בסדר יורד מ-0 עד 4-, לדוגמה, נוכל לכתוב: ; ... 00 4- סזחאוס0 0 =: 1 זסז לולאות מותנות תפקיד הלולאה להקל עלינו בתכנות קטעי תוכנית שחוזרים על עצמם. במקריס רביסם צריכיס להשתמש בלולאות שאינן קבועות. לדוגמה, אנו סורקיסם את הזיכרון כדי למצוא נתון מסויס, וכאשר נמצא את מבוקשנו נוכל לסייס את הלולאה. דנו לא מכבר בעובדה שהלולאה *זס+ מתחילה למנות מהערך התחתון עד הערך העליון ללא הפסקה. בהנחה שנשתמש בלולאה זו לסריקת הזיכרון גס אס היינו מוצאיס את הנתון המבוקש בתחילת הסריקה, היה עלינו להמתין שהלולאה תסיים את עבודתה. במקריסם רבים דבר זה גוזל מזמנו של המחשב (וגם מזמננו, בעבודות גדולות) והוא מיותר לחלוטין, ולפעמים אף מפריע. ניתן אמנס להפסיק לולאת זס? באמצע התהליך, אך לא רצוי. לשס כך נשתמש בלולאות מסוג אחר. לולאות אלו פועלות על פי תנאי. לדוגמה, אנו רוציס לקרוא לולאה שתקרא ערכיס שלמיס עד אשר המשתמש יכניס ערך שלילי. לשם כך נכתוב לולאה הפועלת על פי תנאי: ו|--) ;(1) ח|₪680 ;0 > 1 ומחט בשלוש השורות הללו הגדרנו לולאה החוזרת על עצמה עד אשר מתקבל ערך שלילי (0 > 1 |טחט). 8 פסקל מהצעד הראשון - מהדי 2 כיצד נעשה הדבר הזה! המילה 668% (חזור) מציינת למחשב כי עתה התחלנו לולאה. בעזרת הפקודה ח|₪680 אנו קולטיסם ערכיס שלמיס לתוך המשתנה 1. המילה !שחש (עד אשר) מציינת כי הלולאה תחזור על עצמה עד אשר המשתנה 1 יהיה קטן מ-0, כלומר - יכיל ערך שלילי. כך אנו יכולים להגדיר לולאה שתפעל כל עוד התנאי לא מתקיים. מקובל לכנות לולאה כזו בשס לולאת |וזחט-זהּסקסיו. נבחן את הדוגמה הבאה: ;חוכ הוחהזפסזק (1 זה (2 זז :|ססד | (3 חו69ם (4 ;0 =: !סד | (5 0 (6 ;(': (קסס| 606 סח6 |וואו 0)זססהוהטוח 3 זססחם')חוססחו/ (?7 ;(1) ח|₪680 (8 + |גססד =: ושסד | (9 (0 = 1 |שחט (10 ;(|שססד , = |ססד') הונטחצ ‏ (11 12( 0. בתוכנית זו הגדרנו שני משתניס : |ושסד שישמש כמונה ויכיל את הסכוס הכולל, ו-1 שישמש לקליטת ערכים מהמשתמש. בשורה 5 אנו מאפסיס את המשתנה |%סד. בשורה 6 אנו פותחיס את לולאת ההתניה 6068 שמסתיימת בשורה 10. בשורה 7 אנו מבקשיס מהמשתמש להכניס ערך כלשהו, או את המספר 0 שיציין את סיוס הלולאה. בשורה 8 אנו קולטיס את מהמשתמש ערך ומכניסיס אותו למשתנה 1 ומוסיפיס זאת לערך הכולל שמנוהל על ידי המשתנה |פשסד. עתה, בשורה 10 הצבנו תנאי: על הלולאה לחזור על עצמה עד אשר הערך שהתקבל מהמשתמש שווה ל-0. בצורה וו אנו יכוליס להכניס מספר כלשהו של ערכים, עד אשר נכניס 0 שיגרוס ללולאה להסתיים. בנוסף ללולאת ההתניה ... וטחט ... +6068ז קיימת לולאה נוספת הפועלת באופן דומה. ווהי לולאת 6!וחש (''כל עוד...'). לולאה וו מקיימת את התנאי ההפוך מזה של הלולאה |0חט-60680ז. היא פועלת כל עוד מתקיים תנאי מסוים, בומן שהלולאה |6חט-6068%? מתקיימת כל עוד התנאי לא מתקייס. פרק 4: התניות ולולאות ‏ 49 את מבנה הלולאה 6ווחצו ניתן להגדיר כך: ;[1ח6רח5%060] 60 [חסםוסחס6] פווהעע [חסווח ס6] התנאי שצריך להתבצע. [+%6160+5+8] התהליך שימשיך להתבצע, כל עוד מתקייס התנאי שהוצב ללולאה. דוגמה: =:1 ;(1) ח₪680 00 0 < 1 6!וח/צ בקטע תוכנית וה יצרנו לולאה הקוראת ערכיס שלמיס מהמשתמש. הלולאה תמשיך לפעול כל עוד הנתון המתקבל גדול מ-0. לשס כך היה עלינו לתחל את המשתנה 1, כדי שנוכל להיות בטוחיס שהתנאי 0 < 1 יתקייס לפחות פעס אחת. תנאי לולאות מורחבים עד עתה עסקנו בהתניות ולולאות במבנה המקוצר שלהן. לבד מהלולאה טחט-76268% ניתן היה לבצע בכל ההתניות והלולאות פקודה אחת לכל מחזור. עס זאת, ברוב המקרים יהיה עלינו לבצע כמה פעולות בכל מחזור של הלולאה. לדוגמה, אס נרצה לסכם חמישה ערכים, נוכל להשתמש בלולאה זסו. אך אנו נתקליס בבעיה, המבנה שאנו מכיריס נראה כך: ;(1) ח|₪680 00 5 0 1 =: וסשחטוס6 זסז הלולאה אכן תוכל לקרוא חמישה ערכים, אך לא יהיה באפשרותה לעשות אתם דבר. לשס כך ניתן ליצור מבנה הנקרא בלוק פקודות. והו רצף של פקודות המוגדר בין שני תחומיס על ידי המיליס ח0601 ו-606, אשר תוחמיס למעשה קטע תוכנית. לדוגמה, את בעיית לולאת זסז נפתור כך: 0 =: |סך 0 10 =: זוסחטס600 זסז חו60ם ;(1) ח|₪680 ;1 + |ססד =: |ססדך ו בדרך זו הלולאה תבצע את בלוק הפקודות חמש פעמים. הבלוק כולל את הפקודה ח|₪680 לקריאת נתון מהמשתמש, והוספתו למשתנה |אזסד. בשיטה זו ניתן לפתור גס בעיות מורכבות יותר. לדוגמה, עתה יהיה ניתן לכתוב תוכנית המציגה רשימה של אפשרויות על המסך. התוכנית תקלוט את בחירת המשתמש ועל ידי התניות, היא תוכל לבצע תהליכיס רחבים יותר. 0 פסקל מהצעד הראשון - מהדי 2 דוגמה נוספת: נכתוב תוכנית הקולטת עשרה ערכיס שלמים ומדפיסה את הערך הגדול ביותר שנקלט. כל הערכים הנקלטים הס חיובייס. ;8חףסכ וההפזפסזק (1 זה (2 :הטוס ,17 (3 חו69 (5 ;0 =: ה (6 0 0 1 =: זסזחטס60 זס+ (?7 חו60ס (8 ;(':6ט|8/ ז00ססחו חב חו 6קעץד') חובסחו/ (9 ;(1) ח|₪680 (10 ?7 =: ח חסוט 4 <ז + (12 12( 0, ;( ,' :6ט!פע זפסחטוח') הוסטחצ | (14 15( 6. בתוכנית זו הגדרנו שלושה משתנים שלמים: 1 שישמש לקבלת הקלט מהמשתמש, 4 שמייצג את הערך הגבוה ביותר שנקלט, ו-זסחטס6 המשמש כמונה לולאה. בשורה 7 אנו פותחיס את הלולאה זס! שתחזור על עצמה עשר פעמים. בשורה 9 מציגיס למשתמש הודעה בה הוא מתבקש להכניס ערך שלם, ובשורה 10 הערך נקלט לתוך המשתנה [1. בשורה 11 הצבנו תנאי: אם המשתנה 1 (שזה עתה נקלט לתוכו ערך חדש) מכיל ערך הגבוה מזה שקיים במשתנה 4 (המייצג את הערך הגדול ביותר), אז אנו מעדכניס את ₪4 מפני שנמצא ערך חדש גבוה יותר מזה שהיה בו קודס לכן. בסופה של הלולאה (שורה 14) תודפס הודעה בצירוף הערך הגבוה ביותר שהוזן על ידי משתמש. שימו לב: אס כל המספרים שנקלטו הס שליליים, נקבל שהמספר הגדול הוא 0. הציעו דרך לתיקון התוכנית. פרק 4: התניות ולולאות ‏ 51 לולאות מקוננות נושא מיוחד בתחוס הלולאות הוא קינון (68ח65₪א). אין אה סוג חדש של לולאה, אלא טכניקה מיוחדת שמנצלת את תכונות הלולאה. השס ייקינוויי נובע מן העובדה כי לולאה אחת ממוקמת בתוך לולאה אחרת, כך שהן (קשורות) זו בזו. לפנינו תרגיל: עלינו לכתוב תוכנית הקולטת את ציוניהס של תלמידי כיתה טי, ומחשבת את הממוצע. לאחר מכן התוכנית קולטת את ציוניהס של בני כיתה יי, ומחשבת את הממוצע, וכך הלאה עד כיתה יייב. במקרה פשוט נוכל להשתמש בלולאה עבור כל כיתה. אך, מה יקרה אס יציבו בפנינו את הקריטריון הבא: בנוסף לכך, על התוכנית לשאול את המשתמש לכמה כיתות יש נתונים. בעיה זו מגבילה אותנו, במקרה וחשבנו להגדיר לולאה עבור כל כיתה. לכן, בטכניקה של לולאות מקוננות אנו משיגיס שתי מטרות: תחילה, אנו פותריס את בעיית המספר המשתנה של הכיתות וגס חוסכיס כתיבה חוזרת של לולאות. נבחן את התוכנית הבאה: ;008 וההזפסזק (1 זה (2 חן :1 (3 זז :5 (4 זז :5 (5 ;₪6 : ,|מססד (6 ]9 | :800ז6/ - (7 חו69 (9 ;(':6!85505 01 זססוחנוח /506616 6856!ק') הוסטחצ | (10 ;(0135565) ח|₪680 | (11 ;(':6]355 זסכן 50065 )0 זססרטח זס6חם') הוסטו\ = (12 ((6ח5006) ה|3680 | (13 0 60|85565 0ף 1 =: זסז (14 חו60ם (15 ;0 =: |סך (16 ;(8 ,' :ז6סהחטח 01355') חוססחו/ (17 0 5000600 סט 1 =:8 זס+ (18 חו60ם (19 ;(':' ,₪ ,' .סח זה זססחם') הוססחזו/ (20 ;(₪) ח|₪680 (21 ;₪ + |6סד =: |טסדך (22 23( 0 2 פסקל מהצעד הראשון - מהדי 2 5 / ובזסד =: |הססד (24 ;(|הססד ,' :' ,ה ,' 6855 חן 6סבזסעה') חוססחו/ (25 יו (26 27( 0. נחקור כעת את התוכנית. בחלק הגדרת המשתניםס הגדרנו את המשתניס 84 ו-8 שישמשו אותנו לצורכי ספירה. המשתנים 0185565 (-%5ח5%006 הוגדרו לצורכי קליטת מספר הכיתות ומספר התלמידיס בכל כיתה, בהתאמה. בשורה 14 אנו פותחיס בלולאה הראשונה שתמנה את הכיתות. כאשר נטפל בכיתה הראשונה, המשתנה 4 יהיה שווה 1. כאשר נטפל בכיתה השנייה, המשתנה ‏ יהיה שווה 2, וכך הלאה. המשתנה ₪ ימנה מספר פעמים, על-פי הערך שב-6!35565 (אשר נקלט בתחילת התוכנית). בשורה 16 אנו מאפסיס את המונה |₪סד שתפקידו להחזיק את ממוצע הכיתה שבה אנו מטפלים. בשורה 18 יצרנו לולאה נוספת, שתפקידה לטפל בכל תלמיד. לולאה זו, מונה בעורת המשתנה 8 את מספר פעמים על-פי הערך שבמשתנה ‏ 06ח50/06. תוכן לולאה זו כולל הצגת בקשה לציון, קריאת הנתון לתוך משתנה זמני בשסם ₪, והוספתו לערך הכולל |0₪סד. כאשר מסתיימת הלולאה, והמחשב מגיע לשורה 4, הוא מחשב את הממוצע של אותה כיתה ומדפיס אותו (שורה 25). כעת חוזר כל התהליך שוב ושוב וכל זאת הודות ללולאה החיצונית, שהמשתנה 8 משמש בה כמונה. בדרך זו יצרנו קינוו של שתי לולאות. את הטכניקה הזו ניתן ליישס גם לגבי הלולאות 6!וחו ו- ... |סחט ... +6068ז. ניתן ליצור קינוו עד כמה רמות שנרצה, אך עלינו לוּכור כלל בסיסי: אסור לשנות משתנה (מונה) של לולאה, כלומר, לא ניתן ליצור קינון של שתי לולאות זס+ ולהשתמש במונה אחד. לכל לולאה צריך להיות מונה נפרד. נבחן גירסה נוספת של לולאות מקוננות : ;008 וההזפסזק (1 זה (2 וז :|גססד ,1 (3 חן :60 (4 ;637 :6 (5 6( חופ6ם (7 89( 0 =: |ססך (9 ;0 =: ]חס (10 פרק 4: התניות ולולאות ‏ 53 11( 0 ; (':>זהרח )שח זססחם') הוססוו/ (12 ;(1) ח|₪680 (13 1 + |ססד =: |שססד (14 ;1 + 000 =: זסזחטס6 (15 ;0 > 1 |סחט (16 חס שו |בססד =: |פטסד (17 ;(0ד ,' = 306ז6/') חוססוז (18 ;('? (]ץ) חו3ף3 זו 0 0ם +חהצו וסץ סכ') חוססוזו (19 ; (ח)) ח|₪680 (20 '' <> ₪ |מוחט (21 22( 0. תיאור התוכנית: תוכנית וו קולטת מספר ציוניס ומדפיסה את הממוצע שלהס. כאשר המשתמש רוצה לסיים את קליטת הציוניס עבור כיתה מסוימת, הוא מכניס ערך שלילי. לאחר סיוס קליטת הציונים וחישוב הממוצע, המחשב שואל את המשתמש אס ברצונו לחזור על התהליך עבור כיתה נוספת. מהלך התוכנית: בשורות 3 ו-4 הגדרנו שלושה משתניס שלמים. משתנה כללי (1), משתנה לניהול סכוס הציונים ((10₪) ומשתנה למנייה של מספר הציוניס שנקלטו (ופזחטס6). בנוסף הגדרנו גסם משתנה מסוג תו (ח6) שאת תפקידו נבין בהמשך. ראשיתה של התוכנית בשורה 8. בשורה זו נמצאת הגדרה לתחילת לולאה מסוג ... חש ... +6068ז המסתיימת בשורה 21. את אופיה ומטרתה של לולאה זו נבין בסוף התוכנית. בשורות 9 ו-10 אנו מתחליס את המשתנים |₪₪סד ו-זססחטס6 לערך 0, כך שבכל פעם שהלולאה ... |פחט ... +6068ז המוגדרת בין שורות 8 ו-21 תחזור על עצמה, יתוחלו משתנים אלה לערך 0. בנוסף לכך, הגדרנו לולאה נוספת מסוג ... |₪חט ... ;6068 בין השורות 11 ו-16. לולאה זו כוללת הדפסת הודעה למשתמש להכניס את הציון הבא. הציון נקלט לתוך המשתנה השלם 1, ומוסף למונה הכללי |0₪סד. בנוסף על כך, הורינו למחשב לקדס את המונה חס ב-1 כדי שיוכל למנות את מספר הציונים שנקלטו. בשורה 16 הצבנו תנאי לולאה: יש לחזור על התהליך עד אשר תוכן המשתנה 1 קטן מ-0, כלומר עד אשר קלטנו ערך שלילי עבור ציון. בסיום הלולאה אנו מקבלים שני דבריס: את סכום כל הציונים שנקלטו (במשתנה |108) ואת מספר הציוניס שנקלטו (במשתנה זס6חטס0ס). לצורך חישוב ממוצע הציוניס, אנו מחלקיס את הסכוס במספר הציוניס שנקלטו (שורה 17), ומדפיסיס את התוצאה. 4 פסקל מהצעד הראשון - מהדי 2 עתה, משהסתיים תהליך וּה, המחשב יציג הודעה השואלת אס ברצוננו לחזור על התהליך מההתחלה (שורה 19). בשורה 20 אנו קולטים תו בודד שאמור להיות יציי המייצג את התשובה ייכןיי, או ייאיי המייצג את התשובה "לאיי. בשורה 21 הצבנו תנאי: על הלולאה לחזור על עצמה עד אשר התו שבמשתנה 60 אינו ייציי, כלומר עד אשר המשתמש מחליט שברצונו לסייס את התוכנית. תוכנית זו היא דוגמה טובה להדגמה של לולאות מקוננות. אנו רואיס שניתן לשלב שתי לולאות שאינן תלויות זו בזו לצורך ביצוע פעולה שאינה קבועה. הפעולה נמשכת על פי הנחיות המשתמש. בנוסף על כל ואת, ישנס שימושיס אחרים ללולאות מקוננות. בדוגמאות שבחנו עד כה הדגמנו כי משתמשיס בטכניקה זו כדי לפתור בעיה של מחזוריות בלתי קבועה, זו שתלויה בהחלטת המשתמש. כעת נדגים גם את הצד השני, שבו לא התמקדנו מספיק. לפני שנעשה ואת נבחן את התרגיל הבא: נכתוב תוכנית המציירת מרובע בגודל 3א4. ;0078 ותהזפסזק (1 %חסס (2 ;4 = ה (3 4( / = 3; 5( זפ (6 חן :1 (7 חופ69ס (8 0 3 טס 1 =: ג הס (9 חו9סם (10 00 \ סט 1 =:8 זס) (12 ('*') סון/\ (12 ; חוססו/ (13 14( 0, 15( 6. בתוכנית וו הגדרנו שני קבועים בשורות 3 ו-4. הקבוע 4 מגדיר את גובה המרובע (מספר השורות שבמלבן), והקבוע / מגדיר את רוחב המרובע. הגדרנו משתנים אלה למקרה עתידי, בו נרצה לשנות את מימדי המלבן. להגדרות אלו אין כל חשיבות, כי היינו יכוליס להציב במהלך התוכנית את הערכים 4 ו-3 על פּי הצורך. מכיוו שתהליך גה מבהיר את אופן פעולת התוכנית, בחרנו להוסיף קבועיס אלה. בשורה 7 הגדרנו שני משתנים, 4 ו-8, שישמשו מוניס. תחילתה של התוכנית בשורה 9 אשר כוללת לולאת זס+ שתפקידה למנות את מספר השורות היוצרות את המלבן. שורות 11, 12 ו-13 הן תוכן הלולאה וכוללות לולאת זס+ נוספת, שתפקידה ליצור את שורות המלבן. פקודות הלולאה שבשורות 11 ו-12 למעשה יימציירותיי שורה בודדת של המלבן. כאשר הלולאה פרק 4: התניות ולולאות 55 הראשית (המבוססת על המשתנה ) חוזרת על עצמה 4 פעמים, יודפסו למעשה 4 שורות. תוכנית זו מדגימה היבט נוסף של השימוש בלולאות מקוננות. היא אינה מייצגת כל טכניקה מיוחדת, אלא מראה כיצד אפשר לקצר תהליכים בתוכנית וכך גס 'לחסוך'י בפקודות. נבהיר ּאת. התוכנית צריכה להדפיס מלבן בגודל 3א4, כפי שמודגם בציור הבא : אל%% א<%% א<%% א<%% ניתן לכתוב את התוכנית בצורה הבאה: חו69ם ; ('***') ח|בטוזו/ ; ('***') חוססוו/\ ; ('***') ח|בטוזו/\ ; ('***') ח|בטוזו/\ .6 שש השורות הללו היו נותנות לנו את התוצאות הרצויות. אך, מה היה קורה אילו היה עלינו להציג מלבן ברוחב 5 ובעל 20 שורות! במקרה זה היינו נאלציס להשתמש ב-20 שורות ח!סטח/. לעומת ואת, כאשר משתמשים בתוכנית הקודמת המבוססת על לולאות מקוננות, כל אשר היה עלינו לעשות הוא לשנות את הערכיס של הקבועים 4 ו-א לערכיס המבוקשים. אורכה של התוכנית היה נשאר ללא שינוי. בעזרת הדוגמאות שבחנו עד עתה ניתן להבין כי מטרת הלולאות המקוננות לשמש אותנו לפתרון שתי בעיות: א. חזרה על קבוצת פקודות לפי פרמטר: לולאות שמספר החזרות שלהן נקבע על ידי המשתמש או על פי תנאיס משתנים. ב. קיצור תהליכים בתוכנית. מבנה רב-ברירות - 6455 בראשית הפרק למדנו על התניה מסוג אם...אז... (...חסחסט...1ז). בעבודה שוטפת ניתן להבחין בחיסרון קטן הנובע מעצס מבנה הפקודה. כדי להבין ואת, נתבונן בתרגיל 4.5, שבו אנו מתבקשיס יילהמיריי ערך מספרי למילה. כלומר, המשתמש מציין ערך שלס ועל התוכנית לכתוב את הערך הוה בטקסט באנגלית. לשס כך עלינו להשוות בין המשתנה שהכיל את הערך הנקלט לבין כל הערכיס שעלינו לטפל בהסם. קטע התוכנית עשוי להיראות כך: ;(=') הוסשח/ הסוט 1 = 1 זו ;('סשד') חושח/ הסוז 2 = 1 זו 6 פסקל מהצעד הראשון - מהדי 2 בתרגיל 4.2 נתבקשתם לבצע בדיקות בהנחה שקיימיס רק חמישה מצבים, אך מה היה קורה אילו היינו צריכיס לבדוק עשריס מצבים! לצורך פישוט המשימה קיימת 'יפקודת תנאייי נוספת בשפת פסקל שתפקידה לפשט מצבים אלה : מבנה 6455 - מבנה רב-ברירות. בעזרתו אנו יכוליס להציג מצביס מורכביס וגס את המטלה שיש לבצע כאשר מתקייס כל אחד מהמצביס האלה. כך נראה מבנה 6₪55: + [ח6%07655!0] 6356 ;| רח5500] :חא 6856 ;וס עתה נסביר כל מרכיב במבנה וה: + ...6356 (-600 אלו הן מיליס שמורות המגדירות שמשתמשיס במבנה רב ברירות. [ח0ז655זקא6] הוא הביטוי שאנו רוציס לבחון. חא 6856 אחד מהערכיס שעומד למבחן. [5+3%6₪160%] המטלה שיש לבצע במקרה שמקרה מסויס נבחר. לדוגמה, נבחן את קטע התוכנית הבא: ;(1) ח|₪680 1 6856 ; ('0ז26') חוססחז/\ :0 ;('6חס') מובטוחע :1 ;('סוד') חוסטחש :2 ; ('66זח ד') חוססח/ :3 ;('זטס-') מוסטחש :4 ;('6עו-ז') חוססהו/ :5 בקטע תוכנית זו קלטנו ערך שלס לתוך המשתנה 1. לאחר מכן יצרנו מבנה רב-ברירות 6856, שבו הגדרנו את התנאים הללו: + אס נקלט הערך 0, התוכנית תדפיס את המילה 2670. אס נקלט הערך 1, התוכנית תדפיס את המילה 6ח0. אם נקלט הערך 2, התוכנית תדפיס את המילה סוודך. אם נקלט הערך 3, התוכנית תדפיס את המילה 6שזחדך. אס נקלט הערך 4, התוכנית תדפיס את המילה זוטסם. אס נקלט הערך 5, התוכנית תדפיס את המילה 6שו=. פרק 4: התניות ולולאות ‏ 57 בצורה זו חסכנו את הטירחה בכתיבת שש שורות התניה, אחת לכל מצב. בנוסף, למבנה ה יש תכונות המפשטות בדרגה נוספת את כתיבת התוכנית. לדוגמה, עלינו לכתוב תוכנית הקולטת ערך מספרי ומדפיסה את המילה ד₪5]= כאשר הערך נע בתחוס 1 עד 10, ואת המילה סא5560% כאשר הערך נע בתחוס 1 עד 20. אס היה עלינו להשתמש בהתניה ...חסחצ ...א היינו בריכיס ליצור שתי התניות (אחת לכל מצב), שכל אחת מהן כוללת ביטוי לוגי מורכב. כאן בא לעורתנו מבנה רב-הברירות. ניתן יהיה לרשוס קטע תוכנית ה באופןו הבא : ;(1) ח|₪680 + 1 6856 ("ד145') הוססוו/ :1..10 ;('5560') חובסוז/ :11..20 0 הצורה הפשוטה והמובנת של מבנה וה מדגישה את יתרונותיו על ההתניה ...חס ..ףו. כבר במבט ראשון ניתן להביןו את המשמעות: ההגדרה 1.10 מציינת כי המילה 1851 תודפס כאשר הערכים יהיו בתחוס 1 עד 10, בעוד שההגדרה 11..20 מציינת כי המילה 5560%0 תודפס כאשר הערכים :יהיו בתחוס של 11 עד 20. נבחן דוגמה נוספת: עלינו לכתוב קטע תוכנית הקולט ערך שלס בתחוס 1 עד 0. התוכנית צריכה להדפיס את המילה חשעם (זוגי) כאשר הערך המתקבל הוא זוגי, ואת המילה 000 (אי-זוגי) כאשר הערך המתקבל הוא אי-זוגי. נוכל לממש זאת בצורה הבאה: ;(1) ח|₪680 6856 1 + ('חסעם') חוססו/\ :10 ,8 ,6 ,4 ,2 ;('000') חוססהו\ :9 ,7 ,5 ,3 ,1 0 שימו לב: כאשר מציינים את הערכים שיגרמו להצגת כל הודעה, התו 1 פסיק /0 מפריד בין ערך לערך. 8 פסקל מהצעד הראשון - מהדי 2 לפנינו דוגמה נוספת : כתבו תוכנית הקולטת שני ערכיס ממשיים 4 ו- 8 ותו בודד המציין אופרטור של סוג פעולת החשבון הרצויה (+ - * /). התוכנית תחשב את התוצאה על פי הנתוניס שהוגדרו. ;החחססכ וההזטסזק | (1 זט (2 3( 6% ₪68|; 4( 6: 68 5( חו60פ | (6 ;(':5סט81/ |ה68ז סע חו 6קעץד') הוסטחע (7 ;(5 ,ה) ח|₪680 (8 ;(':(/,* ,- ,+) זס6)הזסקס 6 חו ס6קעד') חוססוז (9 ((ח6) ח|₪680 (10 12( 12( 6856 08 13( 5% 6 := 4 -+ 5; 14( 6 6 := 2-5 15( 6: 6 := 2 * =:₪ מ (16 17( 0, 18( ;(6 ,' 05016ח') חובסח/ (19 20( 0. בתוכנית זו הגדרנו שלושה משתניס ממשיים: 4 ו-5 המשמשים לקליטת שני הנתוניס, ו-6 שיקבל את תוצאת החישוב. בנוסף, הגדרנו גס את המשתנה 68 שיקלוט את האופרטור של פעולת החישוב הרצויה. החלק הראשי של התוכנית הוא מבנה 6856 בשורה 12. כאן אנו מציביס התניות לפעולות החשבון השונות. לדוגמה, התו '+' יגרום לחיבור של ערכי המשתניס ג ו-5 ולהצבת התוצאה במשתנה 6. באותו האופן יתקיימו שאר פעולות החשבון. בסיוס התוכנית (שורה 19) תודפס תוצאת החישוב המבוקש. נעסוק עתה בתכונה חשובה של מבנה 655. כדי להבין אותה, נחזור לדוגמה הקודמת. בדוגמה זו יכול להיווצר מצב בו המשתמש יבקש לבצע פעולה שאינה קיימת. לדוגמה, במקוס להזין תווים לסימול פעולות חיבור, חיסור, כפל או חילוק, הוא עלול ללחוץ בטעות על תו אחר, ואז נרצה להודיע לו על כך. נשתמש לצורך וה בתוספת למבנה 6455 שלמדנו, המאפשרת לעשות זאת. תוספת זו היא המילה 6156 (אחרת), שהשימוש בה נעשה כמו בהתניה ...חסחך ...ז1. פרק 4: התניות ולולאות ‏ 59 נדגיס זאת על ידי שיפור שורות 12 עד 17 בתוכנית הדוגמה שלנו: % ה6 6856 + 2 =:6 :4% 4-5 =: 6 5% ;5 * 2 =; 6 :א ;₪ / 4 =: 6 :5 ; (ח6 , :זסזזם') חוססחו/ 656 0 המילה 6|56 מנחה את המחשב להדפיס הודעת שגיאה כאשר תתקבל בקשה בלתי חוקית. העדה: יש לשים לב כי המילה 656 חייבת להימצא בסוף כל ההתניות. אס ננסה להציב תנאי זה במקוס אחר, המחשב יודיע על שגיאה. מגבלות במבנה 655 רב-ברירות כשס שיש יתרונות למבנה 655, יש לו גס חסרונות. החיסרון העיקרי הוא בכך שניתן ליישס אותו אך ורק עבור משתניס שלמיס ומשתנים מסוג תו, ובאופן כללי - עבור משתניס מסוג "סודריי (מבתינה מתמטית אלו קבוצות בנות-מנייה). אם נשתמש במשתניסם לא סודרים, למשל במשתנה ממשי (ו68]), המהדר ידווח על שגיאה. 0 פסקל מהצעד הראשון - מהדי 2 תרגילים תרגיל 4.1 כתבו תוכנית, הקולטת את מימדיו של מלבן ומדפיסה אותו בעזרת התו כוכבית. תרגיל 4.2 כתבו תוכנית הכוללת לולאה שתפקידה לקלוט עשרה נתוניס ממשיים. בסופה של הלולאה על המחשב להדפיס את הערך הנקלט בעל השבר הגדול ביותר. לאחר סיוס תהליך וה המחשב ישאל את המשתמש אם ברצונו לחזור על התהליך. במידה והמשתמש יאשר זאת, על כל התהליך לחזור מתחילתו. (רמז: יש להשתמש בלולאה ... !ףחש ... 160681 שתכלול בתוכה את כל תהליך הקלט והבדיקה). תרגיל 4.3 כתבו תוכנית המשמשת כמשחק בין שני חברים. הרעיון עליו מבוסס המשחק הוא, שעל השחקן הראשון לקבוע ערך ועל חברו לנחש אותו. מהלך התוכנית: המחשב יבקש מן השחקן הראשון להכניס ערך בין 1 ל-100. המחשב יבדוק אס הערך בתחוס שנקבע. במידע והערך אינו כנדרש, המחשב יבקש להכניסו שוב, עד אשר השחקן הראשון יכניס ערך תקין. לאחר מכן ינקה המחשב את המסך בעזרת שימוש חוזר של הפקודה חוטוז\ (25 פקודות חופטוז\ צריכות לספק ניקוי של המסך). מעתה יחל השלב השני, שבו על השחקן השני לנחש את המספר. כאשר הוא יכניס ערך גבוה מזה שצוין על ידי השחקן הראשון, המחשב ידפיס את ההודעה ''יחטוח ססדיי, וכאשר השחקן השני יכניס ערך נמוך מזה שציין השחקן הראשון המחשב ידפיס את ההודעה ייאס! ססדיי. כך יימשך התהליך עד אשר השחקן השני ינחש את המספר שנבחר על ידי השחקן הראשון. תרגיל 4.4 כתבו תוכנית הקולטת שני ערכיס שלמים. אס שני הערכים שוויס יודפס 'יוהטסם'י, ואס לא - יודפס '|הטףם זסאזיי. תרגיל 4.5 כתבו תוכנית הקולטת ערך שלס בתחום של 0 עד 4. התוכנית תדפיס את המספר בצורה מילולית. לדוגמה, כשיתקבל הערך 0 יודפס 2580, כאשר יתקבל הערך 1 יודפס םאס וכך הלאה. פרק 4: התניות ולולאות ‏ 61 תרגיל 4.6 כתבו תוכנית הקולטת שלושה ערכיםס שלמים. התוכנית תבדוק אס הערך הראשון נמצא בתחוס של שני הערכיס הנותרים. הערך הראשון צריך להיות גדול או שווה לערך השני, וגם קטן או שווה לערך השלישי. במקרה כגה, על התוכנית להדפיס 06, במקרה שהתנאי אינו מתקייס על התוכנית להדפיס דסא 6ס. תרגיל 4.7 כתבו תוכנית הקולטת שני ערכים שמגדירים גבול עליון וגבול תחתון ומדפיסה את כל הערכיס בתחוס זה. יש להתחשב בשני מצביס אפשריים: כאשר הגבול התחתון קטן בערכו מהעליון (במקרה זה יש להשתמש במילה ס6), וכאשר הגבול התחתון גדול בערכו מהגבול העליון (במקרה וה יש להשתמש במילה סטחצוסס). תרגיל 4.8 כתבו תוכנית שדומה לתוכנית הקודמת, אך בשינוי מהותי: בתוכנית הקודמת יצאנו מתוך הנחה שיש להשתמש בהתניה כדי לבדוק את היחס בין הגבול התחתון לעליון. את התוכנית הזו יש לכתוב ללא התניה זו. תרגיל 4.9 כתבו תוכנית הקולטת שני ערכיס מהמשתמש ומציגה את כל המספריס בתחוס זה. יש לבצע את התהליך בעזרת הלולאה ... ושחש ... +6068ז. תרגיל 4.10 כתבו תוכנית הקולטת עשרה ערכיס ממשייס וסופרת כמה מהס מכילים שבריס עשרונייס. (רמז: יש להשתמש בפונקציה 86זת). תרגיל 4.11 כתבו תוכנית הקולטת ערך ממשי ומדפיסה את ערכו המוחלט ללא שימוש בפונקציה 05(. תרגיל 4.12 כתבו תוכנית הקולטת שני מספריס ומדפיסה את הגדול מבין שניהס. 2 פסקל מהצעד הראשון - מהדי 2 תרגיל 4.13 כתבו תוכנית הקולטת מספר שלס ובודקת אם הוא זוגי או לא. התוכנית תדפיס הודעה מתאימה לכל מצב. (רמז: יש להשתמש בשארית של חלוקת המספר ב-2). תרגיל 4.14 כתבו תוכנית הקולטת תו בודד ובודקת אס הוא אות. אס התשובה חיובית יש להדפיס הודעה מתאימה. (רמז: יש לבדוק אס התו המתקבל הוא גס בתחוס 'י2יי.. ייהיי וגם בתחוס ''?יי..'8'י). תרגיל 4.15 כתבו תוכנית הקולטת שלושה ערכים ממשיים המשמשים מקדמים למשוואה ריבועית. התוכנית תחשב ותדפיס את שורשי המשוואה. אס היא לא תוכל לעשות זאת, היא תדפיס הודעה מתאימה. תרגיל 4.16 כתבו תוכנית המקבלת את האורכים של שני הניצביס במשולש ישר זווית ומחשבת את היתר על פי משפט פיתגורס. תרגיל 4.17 כתבו תוכנית הקולטת ערך בתחוס 0 עד 180 המייצג זווית. על התוכנית להדפיס את סוג הזווית: ישרה, קהה או חדה. 6 העדה : יש לבדוק שהזווית הנקלטת אכן נמצאת בתחום הזה. תרגיל 4.18 כתבו תוכנית הקולטת ערך שלס ומדפיסה אותו מן הסוף להתחלה. לדוגמה, הערך 8512 יודפס כך: 2158. פרק 4: התניות ולולאות ‏ 63 תרגיל 4.19 כתבו תוכנית הקולטת תו בודד. באמצעות המבנה 6455 רב-ברירות על התוכנית להדפיס הודעה מתאימה לפי המקריס הבאיס: א. ב. כאשר התו המתקבל הוא מספר (0..9). כאשר התו המתקבל הוא אות גדולה (2..). כאשר התו המתקבל הוא אות קטנה (8..2). כאשר התו המתקבל אינו תואס את אחד המאפייניס שצוינו לעיל. 4 פסקל מהצעד הראשון - מהדי 2 פרק 5 מבני בקרה הקדמה מבני בקרה הס כלי עזר לפיתוח תוכנה. השילוב שלהס מאפשר להציג באופן גרפי תהליכי עיבוד נתוניס של מערכת באמצעות תרשימי זרימה (ששסו= 5 תרשימיס אלה מציגים בפנינו, בצורה ויזואלית, את זרימת המידע, את הפעולות שיש לבצע ואת התנאיס לביצוע פעולות שונות כדי להשלים את משימת עיבוד הנתונים, ולמעשה הס מתאריס את מהלך התוכנית. לרוב, כאשר אנו פוניס לכתיבת תוכנית אין אנו יודעיס בבירור את מהלכה, את הקטעיס שהיא כוללת, סוגי הלולאות, המשתניס שיידרשו לנו, ועוד. תפקיד תרשימי הזארימה הוא לפתור עבורנו את רוב הבעיות הללו. בנוסף, לתרשימי זרימה יש תכונה מיוחדת שהס מתאימים לכל שפה! לא רק זאת, בעזרת תרשים זרימה ניתן לכתוב את התוכנית בדרכיס שונות. מכאן, שתרשימי ורימה הס כלי הכרחתי לפיתותח תוכנות. כללים בסיסיים ליצירת תרשימי זרימה כדי ליצור אחידות והבנה, נקבעו סימניסם מוסכמים שבעזרתם יוצריסם תרשימי זרימה. פרק 5: מבני בקרה 65 התחלת/סיום קטע/תוכנית משפט ביצוע משפט קלט/פלט ו כיוון זרימת התוכנית 0 נקודת מפגש באמצעות סימניס אלה ניתן לתאר באופן כללי את מהלך התוכנית. לדוגמה, מוטל עלינו להציג הודעה המבקשת מן המשתמש להזין למחשב ערך שלס כלשהו ולקלוט אותו למשתנה א. נתאר תוכנית זו בתרשים זרימה: 6 פסקל מהצעד הראשון - מהדי 2 בצורה וו תארנו את מהלך התוכנית. כדי ללמוד יותר על מבני בקרה אלה ולפתח תוכניות מורכבות יותר, נרחיב את הדיון בנושאיסם אחדיס (ראה בסעיפים הבאים). סוגים שונים של מבני תכנות מבני בקרה כולליס שלושה סוגים עיקריים: א. מבנה סדרתי. ב. מבנה תנאי. ג. | מבנה לולאה. מבנה סדרתי מבנה מסוג זה הוא הפשוט ביותר. התרשיס שזה עתה הצגנו הוא דוגמה טובה למבנה סדרתי. תרשיסם זה מתאר מהלך סדרתי של תוכנית, כלומר סדר פעולות בצורה קבועה. אין כל התניות בדרך, אין כל קפיצות לנקודות שונות בתרשים, אלא תיאור סדרת פעולות רצופה. הוראת ב'צוע הוראת ביצוע הוראת ביצוע פרק 5: מבני בקרה ‏ 67 מבנה תנאי מבנה זה הוא הנפו ביותר, מכיון שרוב התוכניות במחשב משתמשות בתנאיס לפעולה או בלולאות. במבנה וה אנו שואלים בדרך כלל שאלה, ופועלים על פי התוצאה. נבחן את הדוגמה הבאה: עלינו לכתוב קטע של תוכנית הקולט ערך שלס. אס הערך הוא חיובי, על התוכנית להדפיס את ההודעה 05111/5ק, ואס הערך שלילי, על התוכנית להדפיס 6411/5שא. נשרטט תרשים זה: בתרשים זה תיארנו את אופן הפעולה של תוכנית הקולטת נתון לתוך המשתנה א ולאחר מכן מציבה תנאי. התנאי הנשאל הוא: האם ערכו של המשתנה א גדול מ-0 (0 < א)! במקרה שהתשובה חיובית, התרשים מפנה אותנו לכיוון הוראת פלט המדפיסה 05111/5ק. במקרה והתנאי לא מתקייס, התרשיס מפנה אותנו לכיווו הוראת פלט המדפיסה את ההודעה 611/5םא. לאחר ביצוע אחת מההוראות הללו, אנו מופניס להמשך התוכנית. במקרה שלנו מסתיימת התוכנית בשלב זה, אך במקוס זאת היינו יכוליס להוסיף פעולות שונות. 8 פסקל מהצעד הראשון - מהדי 2 עתה, משבחרנו תרשים ורימה מורכב יותר, נוכל לדון באחד המאפייניס החשובים של תרשימי הזרימה: חופש בחירה. אס היינו מביטיס בתרשיס שהצגנו בפעס הראשונה, היינו בוחריס בהתניה ...חסוש ...1 כדי לייצג את התנאי, אך אין וה תמיד כך. מכיון שאין אנו מצייניס בבירור צורות התניה מסוימות או מבנה כלשהו, נשאר לנו חופש הבחירה להחליט כיצד ליצור את התהליך. נבחן דוגמה נוספת שתאפשר להמחיש מאפיין ּה: עלינו לכתוב קטע של תוכנית המציג את המספרים מ-1 עד 5. נשרטט את התרשים. 5 / / 6-0 )(2%----- בתרשיס זה מתוארת לולאה שתפקידה להציג את הערכים 1 עד 5. כאן אנו יכולים להגיד בבירור כי חופש הבחירה שמקנה לנו התרשיס מאפשר לבחור בכל לולאה שהיא, מתוך אלו שהכרנו: .... |סחט ... 60681 או ...6|וחצו, ..00 ..זסז פרק 5: מבני בקרה 69 מבנה לולאה הלולאה, כפי שראינו, היא הרחבה של ההתניה. ההבדל המשמעותי שניתן להבחין בו הוא, שההתניה תוביל לבסוף לנקודת מוצא מוגדרת מראש. ללא תלות במסלול שנבחר, תמיד המוצא יהיה בנקודה מסוימת מוגדרת. הלולאה, לעומת זאת, תבצע תנאי בודד ותבחר במסלול שיחזור על עצמו מספר פעמיםס עד אשר יהא עליה לסיים את פעולתה. בשלב גה היא תבחר במסלול השני שיוביל אותה לנקודת המוצא. נבחן מבנה נוסף של לולאה: 6|8 0 0.08 בלולאה זו אנו שואלים שאלה: "האס הסתיימה רשימת העובדים!יי אין זו סתס שאלה, כי כאשר אנו יוצריס תרשיס במבנה זה, אין אנו יודעיס מראש כמה עובדים יש, מתי להמשיך ומתי לסיים את הפעולה. כלומר, אין אנו מתחייבים על כיוון פעולה מסוים. אנו יכולים לגהות את סיוס רשימת העובדיס על ידי מונה, שס אחרון ברשימה, סימון כלשהו, או בעזרת קלט מבחוצ. 0 פסקל מהצעד הראשון - מהדי 2 את השאלה הזו אנו יכולים לפרש בכל דרך שתעזור לנו לפתור את הבעיה. בנוסף, את סוג הלולאה נוכל גס כן לבחור על פי ראות עינינו. לאחר בירור תנאי זה, אנו יכולים לפנות לשני נתיבים: לנתיב הפעולה של טיפול בנתוני העובד, או לכיוון נקודת המוצא של הלולאה כאשר מסתיימת רשימת העובדיס. זכרו: לכל מבנה לולאה או תנאי יש נקודת כמיסה אחת ונקודת מוצא אחת. במקרה והרשימה לא הסתיימה, אנו פוניס לנתיב עיבוד הנתוניס. בנתיב זה אנו קוראיס תחילה את נתוני העובד. גם כאן אין אנו מצייניס בפירוש את הנתוניס שברצוננו לקרוא. נוכל, לדוגמה, לקרוא סוגים שוניסם של נתונים מכיון שהנתוניס של כל העובדים אינס שווים (יש הבדליסם במצב משפחתי, מספר הילדים, תשלומים על חשבון הלוואה, תרומות וכדומה). לאחר קריאת הנתוניס אנו מחשביס את המשכורת. בתהליך וה אנו יכוליסם לשקלל את הוותק, הגיל, סוג העבודה או כל מאפיין אחר שנבחר. בסוף נתיב זה אנו מדפיסיס את תלוש המשכורת וחוזריס לנקודת הכניסה של הלולאה. שוב חוזר על עצמו התהליך, עד אשר מסתיימת הרשימה. אלגוריתם (וחח1%וס!) אלגוריתם הוא מושג המתאר סדרת פעולות חד-משמעיות, ניתנות לביצוע, אשר הוצאתם לפועל תוביל בוודאות לפתרון תוך מספר סופי של צעדים. האלגוריתס מציג את הדרך להשגת המטרה שלשמה הוגדר התהליך. ברצוננו לנסח פתרונות לבעיות אשר יציגו את דרך הפתרון לפרטיה, אך מבלי להציג את הפתרון בשפת תכנות כלשהי. היתרון בניסוח שאינו תלוי בשפה הוא שניתן לממש אותו בכל שפת תכנות. בניסוח הפתרון המילולי אנו מתמודדיס עס כל המטלות שמציבה הבעיה בפנינו, מבלי לעסוק ייבבעיות טכניות'י. הפתרון המילולי מקביל במידה רבה לפתרון באמצעות תרשיס זרימה. שתי הדרכיס מאפשרות יצוג אלגוריתס לבעיה ללא תלות בשפת התכנות. הניסוח של אלגוריתם מילולי חייב לענות על תכונות הבסיס של אלגוריתם, כפי שתארנו אותו. ''אלגוריתם הוא סדרת הוראות'י. התכונה הזו באה לידי ביטוי במבני הבקרה הקיימיס. נרשוס את מבני הבקרה הבסיסיים בניסוח מילולי מוסכם. פרק 5: מבני בקרה ‏ 71 מבנה סדרתי התחל הוראה 1 הוראה 2 הוראה ח סוף מבנה תנאי מצומצם אם < תנאי = אמת > אזי התחל הוראה 1 הוראה 2 הוראה 1 הוראה ח סוף מבנה תנאי מורחב אם < תנאי = אמת > אזי התחל הוראה 1 הוראה 2 הוראה ח סוף, אחרת התחל הוראה 1 הוראה 2 הוראה ח סוף 2 פסקל מהצעד הראשון - מהדי 2 מבנה לולאת 6!וחעש כל עוד < תנאי = אמת > בצע התחל הוראה 1 הוראה 2 הוראה 1 הוראה ח סוף מבנה לולאת +ב63כןסיו חזור הוראה 1 הוראה 2 הוראה ח עד < תנאי = אמת > מבנה רב-ברירות - 6455 בצע לפי ערך < ביטוי> ערך 1: משפט ביצוע 1 ערך 2: משפט ביצוע 2 ערך ח: משפט ביצוע ח סוף פרק 5: מבני בקרה ‏ 73 'יהוראות חד- משמעיות הניתנות לביצוע'י כאשר משתמשים בניסוח מילולי לאלגוריתםס רצוי שנקפיד על תכונה זו. נשתמש במילות ציווי כפי שנדרש, כדי לקבל קבוצת מיליסם המאפשרת כתיבה וניסוח של אלגוריתם מילולי. הנה לדוגמה מספר מילות ציווי ופירושיהן: המילה | הסבר חשב חישוב ביטוי כלשהו והשמתו במשתנה קלוט קליטת ערכים למשתנה הדפס הדפסת ערכים לפלט את מבני התכנות שהצגנו קודם כאלגוריתמים, נוכל להציג גם באמצעות תרשימי זארימה. הבה נעשה ואת. מבנה סדרתי 4 פסקל מהצעד הראשון - מהדי 2 מבנה תנאי מצומצם מבנה תנאי מורחב פרק 5: מבני בקרה 75 מבנה לולאת = וזח/צ 8 80686 1] 6 -1606 0 -88 86086 בבמו-] 6 פסקל מהצעד הראשון - מהדי 2 מבנה לולאת דה=ק-₪ כאן אנו רואים כי מנגנון הבקרה נמצא בסוף הלולאה. מצב זה מאפשר לשלוט על התהליך על פי התוצאה של פעולה מסוימת. לדוגמה, נכתוב תוכנית אשר שולטת על פעולת מכונה. הלולאה שבה מדובר צריכה להתקייס עד אשר יתברר כי המכונה הפסיקה לפעול. במקרה אחר נקלוט נתוניס ונדפיס אותס עד אשר נקבל הוראה המציינת שיש להפסיק את התהליך. פרק 5: מבני בקרה ‏ 77 מבנה רב-ברירות - 655 בפרק 4 למדנו על מבנה מיוחד: מבנה רב-ברירות. מבנה זה פתר אותנו משימוש במספר רב של התניות. בשל מבנהו המיוחד, גם אופן תיאורו הסכימתי שונה משאר המבנים שלמדנו. במבנה הכללי, יחידה גו כוללת את התנאי, ומשס מתחילות הסתעפויות, כך שכל הסתעפות מייצגת מצב אחר. נבחן את מבנה ההתניה הזה: כאן אנו רואיס כי בראש המבנה ניצבת התניה או משתנה. מהתניה זו מסתעפיס תנאים או ערכים, שכאשר אחד מהם נבחר, מבוצע בלוק הפקודות שקשור אליו. 8 פסקל מהצעד הראשון - מהדי 2 לדוגמה, כאשר נקלוט מקש בודד ונרצה לבחון אם נלתצ יציי או ייאיי ניצור תרשים כזה: = סחחסי כך נראה תרשיס המגדיר קטע תוכנית שתפקידה לקרוא תו בודד ולבחון אותו. אס נקלט ייציי תציג התוכנית את המילה יפםציי, ואס נקלט ייאיי היא תדפיס ייסאיי. בכל מקרה אחר תודפס המללה 'יזסזזם'י. פרק 5: מבני בקרה ‏ 79 תרגילים תרגיל 5.1 כתבו תרשיס ורימה ותוכנית לקליטת שלושה ערכיס שלמים. התוכנית תמיין את שלושת הערכים ותציג אותסם מהגדול לקטן. תרגיל 5.2 נתוו תרשיס הזארימה הבא : 9 6 200 0 עו -> א כתבו תוכנית המבצעת תהליך זה. "9 העדה : מבנה הלולאה יכול לרמוז על הסוג המומלץ לשימוש. 0 פסקל מהצעד הראשון - מהדי 2 תרגיל 5.3 שרטטו תרשיסם זרימה של תוכנית הקולטת מאה ערכיםס ממשיים. על התוכנית להדפיס את הנתוניס הבאיסם: א. את מספר הנתוניס שכללו שבר עשרוני. ב. מספר הנתוניס שכללו ערך (עס או בלי שבר עשרוני) ג. | מספר הערכיס שהיו שווים ל-0. תרגיל 5.4 כתבו תרשיס ורימה ותוכנית כדי לקלוט עשרה ערכים ממשיים. על התוכנית להדפיס את סכום השברים העשרוניים. תרגיל 5.5 כתבו תרשיס זרימה ותוכנית לקליטת שני מספרים שלמיס וחישוב מכפלתס ללא שימוש באופרטור הכפל. (רמז: כפל הוא למעשה תהליך חוזר של חיבור). תרגיל 5.6 כתבו תרשיס ורימה ותוכנית לקליטת ערכיס ממשיים. התוכנית תחשב את סכוס הערכים שנקלטו. הערכים ייקלטו בלולאה שתסתיים כאשר הערך הנקלט יהיה 0. תרגיל 5.7 כתבו תרשים ורימה ותוכנית לקליטת ייזרס'י של תווים באנגלית. התוכנית תמשיך לקלוט תוויס עד אשר תתקבל נקודה (.). על התוכנית למנות ולהציג את מספר הפעמים שנקלטה האות 'יח'י. תרגיל 5.8 כתבו תרשיס ורימה בלבד לתיאור הפעולות להדפסת לוח הכפל. (רמז: יש להשתמש בלולאות מקוננות). פרק 5: מבני בקרה ‏ 81 פרק 6 פרוצדורות ופונקציות הקדמה בפרק 2 הסברנו שרוב הפקודות בשפת פסקל מתחלקות לשני סוגים: פרוצדורות ופונקציות. גס ראינו כי הפרדת הפקודות לשני סוגיס עיקריים אלה מקנה לנו כלים חוקיס לפיתוח. בפרק זה נלמד כיצד יוצרים פרוצדורות ופונקציות כדי לנצל את היתרון במבני תכנות אלה. בנוסף, תוך הסתמכות על כלי תכנות אלה, נלמד על מושג המודולריות והעוצמה שהיא מקנה לנו. מושגי יסוד בהגדרת תת- שגרות (פ6חוסטסיוטט5) כדי שנוכל לגשת להגדרת הפרוצדורות, דרושיס לנו כמה כליס בסיסייסם להבנת מבנה התכנות הזה. כאשר אנו דניס בקטע תוכנית, אנו נוטיס לקרוא לה שיגרה (סחחסטסא), מכיוו שהקטע מייצג את מהלך התוכנית. כשאנו קוראים מתוך שיגרה זו לפרוצדורה או פונקציה, אנו למעשה מבצעיסם ייסיעוף'י מתוך רצף פקודות התוכנית. מכיון שלתוכנית הראשית אנו קוראיס שיגרה (סחסטסף), הרי שלקטע התוכנית הזה נקרא תת- שיגרה (סחטטסזופט5). כבר כאן נסביר כי אין כאן כל כוונה ליצור פקודות חדשות, אלא להפוך את מבנה התוכנית למודולרי וגם לקצר ולקצצ במספר הפקודות. כדי להבין את שתי המטרות הללו נאלץ לפנות להגדרת הפרוצדורות והפונקציות. פרק 6: פרוצדורות ופונקציות 83 תת-שיגרה בסיסית (ס6חוסטסיוטט5 6כץ+ 6ו835) המבנה הבסיסי של הפרוצדורה כולל הגדרת שם ואוסף פקודות. תחילה נפנה ללמוד את אופן הגדרת שס תת-השיגרה: ;6 6סזק 6וו60ססוס 6 סז היא מילה שמורה, אשר גורמת למחשב להבין כי ברצוננו ליצור תת-שיגרה חדשה. שס תת-השיגרה הוא 6וחהּ)ססזק. לדוגמה : ;6035 6וו660סזס שורה זו מגדירה למחשב תת-שיגרה חדשה בשס ₪6801043065. ומה בדבר גוף תת-השיגרה! גוף תת-השיגרה מוגדר בבלוק פקודות: 7 ..וססם. התכונות של בלוק הפקודות בתת-השיגרה והות לאלו של תת-בלוק שלמדנו במבניס של לולאות והתניות. נתבונו בתוכנית הדוגמה הבאה: ;רחא וההזטסזק | (1 2( צהז‎ זז :0 (3 (4 ,6 סזט0סססזק | (5 חו60פ | (6 ;(':306 זטסץ זססחם') חוססוזו/ (7 ;(06) ח|₪680 (8 (9 (10 חו69ם (11 96 (12 ;(06 ,' 15 306 זטסץ") חוססח\ = (13 .0 (14 נחקור את מהלך התוכנית. בחלק ההגדרה של התוכנית (שורה 3) יצרנו משתנה בשס 88866 מסוג שלס. התוכנית מתחילה בשורה 12 ומסיימת בשורה 13, כלומר - שתי שורות בלבד. השורה הראשונה של התוכנית קוראת לתת-שיגרה החדשה שיצרנו. בעשותנו זאת, אנו מפניס את המחשב לשורה 7, לתחילת תת-השיגרה. בשורה זו אנו מדפיסיס הודעה המבקשת מן המשתמש להכניס את גילו. בשורה שלאחריה (שורה 8) אנו קולטיס את הגיל לתוך המשתנה 886. בסיוסם תהליך זה (שורה 9) המחשב חוזר לרצף הפקודות הקודם (שורה 13). כך, למעשה, ניתן לחלק את התוכנית לחלקים, או במיליסם אחרות - ליצור מודולריות. 4 פסקל מהצעד הראשון - מהדי 2 בתהליך המודולציה אנו "'מפרקיסיי את התוכנית למספר חלקים שכל אחד מהס אחראי לביצוע פעולה אחת כלשהי. זהו נושא חשוב מאוד, מפני שעל ידי חלוקת התוכנית לקטעים ניתן להשיג מספר דברים : א. התוכנית פשוטה וקלה להבנה. ב. התוכנית נוחה לתחזוקה - הכנסת שינויים ואיתור ותיקון תקלות (תפקיד כל קטע תוכנית מוגדר מראש וברור). ג. | צמצוס התוכנית על-ידי שימוש חוזר בתת-שיגרה. ד. הרחבת פקודות השפה. על פי חתכיס אלה אנו רואיס כי תת-השגרות נותנות יכולת לנהל את התוכנית בצורה טובה יותר. בפרק זה נדון בעיקר בחתך השלישי והחתך הרביעי. חתכיס אלה הן שתי הסיבות העיקריות לשימוש בתת-שגרות. תהליך הביצוע של תת- שיגרה כאשר ניתחנו את מהלך התוכנית הסברנו כי בשורה הראשונה שלה (שורה 12) היא מפנה את המחשב אל תת-השיגרה ₪68086, כך שמהלך התוכנית ''מופנה"י לשורה 7. התרשיס הבא מתאר את אופן הטיפול של המחשב בתת-שגרות : : א|הוא אבחססחק : 0% 008 06הק 1 0 ל או ........... : שא ; 0% 5 7 2 תרשיס וה מתאר תוכנית אשר במהלכה היא קוראת לתת-שיגרה אאא. כאשר התוכנית מגיעה אל הפקודה להפעלת תת-השיגרה, המחשב בוחר במסלול 1 ומפנה את מהלך התוכנית לתחילת קטע הפקודות של תת-שיגרה אאא. בסיוס תת-השיגרה, המחשב משתמש במסלול 2 ופונה להמשך התוכנית המרכצית, כלומר לשורה הבאה. פרק 6: פרוצדורות ופונקציות| 85 העברת פרמטרים (נתונים) לתת- שיגרה אחת התכונות החשובות של תת-שיגרה היא היכולת שלה לקבל נתוניס. כדי להבין מושג זה נתבונן בפקודה כמו חווז\, המקבלת את הנתוניס שעליה להדפיס ולבצע את המוטל עליה. אס לא היינו מספקיס לה נתונים, היא לא היתה יכולה לפעול. לרוב, כאשר כותביס תת-שיגרה למטרה מסוימת, נאלציס לפעול על פי ייבקשה חיצונית'יי, כלומר על פי נתוניס שסופקו מבחוץ. אם כן, אופן ההגדרה של תת-השיגרה, כפי שלמדנו, לוקה בחסר. כדי להשלים חלק חסר זה נלמד את תבנית ההגדרה המורחבת של תת-השיגרת: ,(06 311 / : 6וחהזזב/) 6רחהּ)6סזק 6זווססססזוס בתבנית הגדרה זו אנו מוריס למחשב שברצוננו ליצור תת-שיגרה בשס כלשהו, הדורשת נתוניס. 6וחב%8?8₪3 מייצג את שסםס המשתנה שינהל את הנתון ו-סמְץדזה3ּ הוא סוג הנתון. דוגמה: ((ז5006ח1 : 1) ז0606ח01ס1ז/ סזטוס0ס6סזוק חו9סם ;2 , :1 6 סטוהּ/") חובטוז/ 0 כעת הגדרנו תת-שיגרה בשס ז0%606ח01וו) שדורשת ערך שלס כלשהו, ואחר כך היא מדפיסה אותו הערך עס הודעה מתאימה. אם כן, הגדרת משתנה לצורך העברת נתוניס לתוך תת-שיגרה מתבצע בדומה להגדרת נתוניס בחלק ההצהרה של התוכנית. תוכנית דוגמה: ;6מותפאם הוההזססוק (1 זהצ (2 :2א,1א1 (3 (4 ;(6061ח1 : 1) עשהזק סזטססססזק (5 חו69ם (6 0 1 60 1 =: 2א זסז (7 ; ('*') בסחז/ (8 ; חוססו/ (9 10( 12( חוטסט (12 ;(':₪ורחו! 8 זססח=') הוסטוחע | (13 ;(?) ח|₪690 | (14 0 1 0 1 =:2א זסז (15 ;(2א) אובּזס (16 17( 0. 6 פסקל מהצעד הראשון - מהדי 2 נחקור את מהלכה של התוכנית : בחלק ההגדרה של התוכנית יצרנו שלושה משתניס שלמים. בתחילתה של התוכנית (שורה 13) אנו מציגים הודעה המבקשת מהמשתמש להכניס את הגבול, ולאחר מכן קוראים ערך ה לתוך משתנה (שורה 14). בשורה שלאחר מכן אנו יוצריס לולאה הקוראת לתת-שיגרה צופזס פעס אחת בכל מחזור. כדי לנתח את התוצאות נבחן את תת-השיגרה ולאחר מכן נחזור לתוצאות הלולאה. תת-השיגרה כוללת לולאת זס+ שמקבלת ערך מסוים מבחו ועל פיו היא מדפיסה מספר מסויס של כוכביות. לדוגמה, אס הערך שהתקבל מבחוצ הוא 5, אזי יודפסו חמש כוכביות בשורה. תת-השיגרה כוללת שורה נוספת (שורה 9) שתפקידה לרדת לשורה הבאה בתור. כעת נוכל לחזור ללולאה שבשורה 15 ולנתח את התוצאות הסופיות. בתחילה, כאשר 2א מקבל את הערך 1 וקורא לתת-שיגרה שואזס, על המסך מופיעה כוכבית בודדת. לאחר מכן, כאשר ערכו של המשתנה 2 מתקדס לערך 2 תת-שיגרה שו8זס תדפיס שתי כוכביות, וכך הלאה. אס כן, התוכנית תצייר משולש ישר זווית על המסך. נתבונן בפלט דוגמה זה: :חן 3 וסשת מכיון שבחרנו שרירותית את הערך 5, יודפסו חמש שורות בלבד על המסך. משתנים כלליים (65!טבּוזבּצ [בפס|6) ומשתנים מקומיים (65!טהּוובּט [ב63ס1.0) עתה נבחן את שורה 5, הכוללת את הגדרת תת-השיגרה. בשורה זו הגדרנו משתנה 1 מסוג שלם. גס בשורה 3 הגדרנו משתנה בשס 1 מסוג שלס. מדוע המחשב לא הודיע על בעיה! מדוע התוכנית רצה ללא כל תקלות! לשאלות אלו יש פתרון מיוחד. בשפת פסקל ניתן להגדיר משתנים כלליים (פ65!טהּוּזְבּע |61083) אשר מוגדריס בחלק ההגדרה של התוכנית (תחת המילה השמורה זפּצ) ונגישים מכל אזור בתוכנית. כל חלק של התוכנית בכל מקוס יכול להשתמש בהם ללא הגבלה. בנוסף לכך, ניתן להגדיר גס משתנים מקומיים (פ16טהּוזבּע [1068) אשר נגישיס אך ורק על ידי תת-השיגרה שבה הס מוגדרים. פרק 6: פרוצדורות ופונקציות | 87 בזמן שבו תת-השיגרה פעילה, המחשב יקצה גיכרון לניהול משתנים אלה, עד אשר תסייס תת-השיגרה את פעולתה (ואז משתניס אלה יימחקו מהזיכרון). כאשר הגדרנו את המשתנה 1 בפעסם השנייה (שורה 5 - הגדרת תת-השיגרה) המחשב הבין כי אנו רוצים ליצור משתנה מקומי לצורכי תת-השיגרה בלבד. למעשה, כל משתנה שמוגדר לצורך העברת נתוניס לתת-שיגרה הוא משתנה מקומי. בנוסף, ניתן לומר כי למשתניס המקומייס יש עדיפות על פני משתניס כלליים, כלומר, כאשר יהיו שני משתניס באותו שס (אפילו תחת סוג הגדרה אחר) יעדיף המחשב להשתמש במשתניסם המקומייס בומן הרצת תת-השיגרה. כאשר נרצה להגדיר משתניםס מקומיים נוספים, נוכל לעשות ואת בעזרת הגדרה עס המילה השמורה ז8/: 6|קרחהאם ההבזטסזוס זְהָּצ סז :א החוכ 6זטו60ססוס זְהָּץ סז :א חו9סם 0 חו9סם 0 בדוגמה וו הגדרנו פעמיים את המשתנים א ו-ץ. כאשר נשתמש בהס מחוצ לתת-השיגרה 8ִַפָטס, המחשב יעשה שימוש באלה שהוגדרו בראש התוכנית. כאשר המחשב ייכנס לתת-שיגרה, הוא יפנה מקוס בזיכרון עבור שני משתניס חדשים, כך שתת-השיגרה תוכל להשתמש בהס כבמשתנים מקומיים. כמובן, כאשר תסיים תת-השיגרה את פעולתה, המחשב ימחק את שני המשתניס המקומיים מן הזיכרון, ויאפשר לתוכנית לחזור להשתמש במשתנים הגלובלייס. הערת: שינוי תוכן המשתמיס המקומיים א + בזמן ריצת תת-השיגרה אינו משנה את תוכן התאים של א + שהוגדרו כמשתנים גלובליים. 8 פסקל מהצעד הראשון - מהדי 2 לצורך הבנת הרעיון, נתבונן בתרשים הבא: תת תוכנית תת תוכנית תוכנית ראשית תת תוכנית תת תוכנית כל מלבן מייצג קטע של תוכנית. המלבן הגדול הוא השיגרה הראשית של התוכנית, ואילו המלבניס הקטניס הס תת-שגרות. בנוסף, העיגולים מייצגיס משתנים, כך שהעיגול המרכזי מייצג משתנים גלובליים (שהוגדרו בראשית התוכנית) והעיגוליס הקטניס מייצגיס משתניס מקומייס השייכים כל אחד לתת-השיגרה בה הוא נמצא. על פי תרשים זה ניתן לראות כי כל תת-שיגרה תוחמת בתוכה משתנים מקומיים, ובנוסף היא יכולה להשתמש במשתניס גלובליים. על ידי הבחנה נוספת אנו יכולים להבין גם, כי לתוכנית הראשית אין גישה למשתנים המקומיים של כל תת-שיגרה, ולכל תת-שיגרה אין גישה למתחס המשתניסם של תת-שיגרה אחרת. שאלה: מתי רצוי להגדיר משתנים מקומיים, ומתי רצוי להגדיר משתנים כללים. מהס היתרונות והחסרונות לכל שיטה? תשובה: לא ניתן להגדיר מצב מדויק בו נעדיף להגדיר משתניםס מקומיים על גלובליים, או ההיפך. למרות זאת, ניתן לומר כי לעיתים, כאשר נרצה להשתמש במשתניס לחישובים זמנייס או לניהול לולאה, רצוי להגדיר משתניסם מקומייס. למרות זאת, כאשר נרצה להשתמש במשתנים ולשמור את ערכס לאחר ביצוע תת-השיגרה, עלינו להגדיר משתנים גלובליים, מכיון שמשתנים מקומייס יימחקו לאחר סיוס תת-השיגרה. דרך נוספת היא להעביר את המשתניס כפרמטרים לפי כתובת, כפי שנלמד בהמשך. פרק 6: פרוצדורות ופונקציות ‏ 89 הגדרת מספר פרמטרים כאשר נרצה להגדיר, לדוגמה, שלושה ערכים של תת-שיגרה מסוג שלמים, נוכל לעשות זאת כך: ((061ח1 : 6 ,8 ,ג) 6ההבּססזק 6זטוססססזוס כשס שמגדיריס משתניס תחת המילה השמורה זאּט, כך אנו יכוליס להגדיר משתניס להעברת נתוניס אל תוך תת-השיגרה. נתבונן במקרה נוסף: ברצוננו להגדיר תת-שיגרה שמקבלת שלושה סוגי נתוניס: ממשי, שלם ובוליאני. איך נוכל להגדיר ואת עכשיו: כדי להבין את התשובה, נתבונן בדוגמה הבאה: ((ח200!68 : 5 ;060017ח1 : 1 ;₪68 : 5) 6ההבּ)ססזק 6זטוססססזוס אנו רואיס כי כאשר צריך להשתמש בכמה סוגי משתנים, אנו חוצצים בין הגדרותיהס בעזרת התו נקודה-פסיק (). תהליך פירוק תוכנית במבנה ''מעלה- מטה'י (הח/צס)-קסד) כאשר דנו ביתרונות תכנות מודולרי ראינו ששיטת תכנות זו מפשטת את מבנה התוכנית. במציאות, כאשר ארגון פונה לפיתוח תוכנה, מבצעיס זאת לרוב מספר מתכנתים, במקביל. כל מתכנת כותב חלק מסוים בתוכנית. נגדיר תחילה את מטרת התוכנית : 0 פסקל מהצעד הראשון - מהדי 2 כעת, משהגדרנו את מסגרת התוכנית, נגדיר את שאר מרכיביה: והו תרשים חשס6)-קסד. הוא נקרא כך מפני שהחלק העליון (קסד) הוא מטרת התוכנית והחלק התחתון (חשספ) הוא הפירוק לחלקים. יש לציין כי אין זה תרשיס זרימה, אלא פירוט של חלקי התוכנית. במצב שכזה, לאחר שתכננו את חלקיה השונים של התוכנית, נוכל לגשת לאופן כתיבתה. ראשית נפנה להגדרת המשתנים בתוכנית : ;6|קחח8אם הההזטסזוס זה חן 6% חז | בקטע זה הגדרנו ארבעה משתניס מסוג שלמים. המשתנים , 8 ו-6 יקלטו לתוכם שלושה ערכים שלמים שהמשתמש יזין, ואילו המשתנה 187065% יכיל בסופה של התוכנית את הערך הגדול מביניהס. עתה נפנה לחלקה הראשון של התוכנית, העוסק בקריאת המשתנים. לצורך כך ניצור תת-שיגרה שתבצע תהליך זת: ;03ו| 1"6וו660סוק חו9סם ;(':(0 ,₪ ,4) 8065 זס00ססחו 66זח זססחם') הוססוזו/ ;(6 ,8 ,8) ח|₪680 0 פרק 6: פרוצדורות ופונקציות ‏ 91 תפקידו של חלק וה הוא אך ורק לקרוא את הנתונים. אס בעתיד נרצה לשנותו, לדוגמה, כך שיבחר או ייחשב ערכיס במקוס לקרוא אותס מהמשתמש, נוכל לעשות ואת ללא כל בעיה, כי התוכנית בנויה בצורה מודולרית. השינוי שנערוך בחלק וה של התוכנית לא צריך להשפיע על חלקיס אחרים. כאשר כל חלק בתוכנית מבצע את תפקידו ללא תלות באופן פעולה של חלק אחר, ניתן יילשחקיי עס כל אחד מהם כרצוננו. כעת נפנה לחלק השני של התוכנית: מציאת הערך הגדול ביותר מבין השלושה: ;0ו תות 6זטו0סססום חו9סם ;6 =: 3065 | חסו (6 < ה) 0ח3 (ם < ג) זו ;4 =: ז065זה | חסוז (6 < 5) 0ח3 (מ < 8) זו ;5 =: 870658 1 0 בתת-שיגרה זו אנו בודקיס מיהו הערך הגדול ביותר. בתחילה אנו מניחיס כי הערך של משתנה 6 הוא הגדול ביותר. במשפט התנאי הראשון אנו שואליס שאלה: אס תוכן המשתנה ג גדול מתוכן המשתנה 8 וגם תוכן המשתנה ₪ גדול מתוכן המשתנה 6, אזי ניתן להסיק כי תוכן המשתנה ‏ הוא הגדול ביותר. במשפט התנאי השני אנו שואליס שאלה דומה: אס תוכן המשתנה 8 גדול מתוכן המשתנה ג וגס תוכן המשתנה 8 גדול מתוכן המשתנה 6, אזי המשתנה 8 מכיל את הערך הגדול ביותר. בסיומה של תת-שיגרה זו נקבל במשתנה 370656 | את הערך הגדול מבין שלושת הערכים שנקלטו. כעת, כל שנשאר לנו הוא להדפיס את תוצאות התוכנית. על כך אחראית תת-השיגרה בשס שחוזק : ;>חוזק 6ווו660סום חו9סם (870650] ,' :15 6ט!הע ז65סזה |') חוססוו/ 0 קטעי התוכנית מודולריים, וכל קטע מבצע את המוטל עליו ללא התחשבות בפעולות שמתבצעות על ידי קטעי תוכנית אחרים. לכן ניתן יהיה גם כאן לשנות כל קטע מבלי לפגוע באחרים. לדוגמה, נוכל להוסיף צבעים לטקסט המוצג, לשנות את נוסח וצורת ההודעה ועוד. 2 פסקל מהצעד הראשון - מהדי 2 עתה, לאחר שיצרנו את כל חלקי התוכנית, נכתוב אותה בשלמותה: ;רא החהוטסום זה חן 6% חז | ;03ו| 16וו660סום חו69ם ;(':(0 ,₪ ,4) 8065 זס00ססחו 66זח) זססחם') הוססוו/ ;(6 ,₪ ,ה) ח|₪680 0 ;0ו תות 6זטו0סססזום חו9סם ;6 =: זפסְטָזה | חסו (6 < ה) 0ח3 (ם < ג) זו ;4 =: 870658 1 חסו (6 < 5) 0ח3 (מ < 8) זו ;5 =: ז065זה | 0 ;שחוזק 6ווו660סוס חו9סם (870650 ] ,' :15 6ט!הע 065%זה |') חוססוזו/ 0 7החהזססזק הוהוח+ חו0סם ;03| ;0וחו= שחוזק .6 נוכל לראות עד כמה השיגרה הראשית פשוטה. כל אשר עליה לעשות הוא לקרוא ברצף לתת-שגרות המבצעות את המטלה, זו אחר זו, ולקבל תוכנית שכתובה בצורה מודולרית. למעשה, כל מה שלמדנו עד עכשיו הוא מידור תוכנית - כתיבה מודולרית. כלי זה הוא אחד מאבני היסוד לכתיבה נכונה של תוכניות בכל שפה. כל אשר נלמד עד כה בפרק זה משמש גס לצורך תכנות וגם להבנת נושאים נוספים. מכיון ששפת פסקל היא הנושא העיקרי, נפנה כעת לגרסה נוספת של תת-שיגרה. פרק 6: פרוצדורות ופונקציות 93 יצירת פונקציות (ח0סו066]3173% הסוס6הש-) 1 צ ב , ר ציה ה 1 על הפונקציות למדנו בפרק 2. כבר אז מצאנו כי פונקציה היא גירסה של פרוצדורה, כלומר תת-שיגרה במבנה זהה עס שוני קטן: הפונקציה היא תהליך שבסופו אנו מקבליס ערך כלשהו - הערך המוחזר מהפונקציה. כל מה שנאמר עד כה על מבנה ופעולה של פרוצדורה תקף גם לגבי פונקציה. לכן, כל שנשאר לנו לעשות הוא ללמוד כיצד מנצליס את התכונה החשובה שלה - החזרת ערך. את הפונקציה מגדיריס כך: ;2 ה : (61קץדזה/ : סוחהּזוב/) 6וחהּסח= הסטסחטם המילה השמורה חסטסחו)ף מציינת כי שורה זו כוללת הגדרת פונקציה. המילה 36 א6תט* מייצגת את שס הפונקציה. 6וחבּאזזה3ּ1, כמו בתת-שיגרה מסוג פרוצדורה, הוא שס המשתנה שדרכו מעביריס לפונקציה נתונים. 61קץדו8 הוא סוג המשתנה הזה. ומה בדבר הערך המותזר מהפונקציה! סוג העיוך המוחזר נקבע על ידי 62סץדזגּ/. לדוגמת : ;חן : (05061ח1 : ) ₪050 הסטסחטם ווהי פונקציה בשס 650א, הדורשת ערך שלס 8 ומחזירה ערך שלס. במהלך התוכנית ייסוג הערך המוחזריי מהפונקציה הוא גס ייסוג הפונקציה'י. ניתן לקרוא לפונקציה מסוג זה בצורה הבאה: ;רא החפוטסוס זה זז % חו9סם ;(15) ₪650 =: א .0 סוג הפונקציה יכול להיות כמעט מכל סוג נתון שהוא. בהמשך, כאשר נלמד סוגיסם נוספים של משתנים, נוכל לפרט אילו מהס אינס יכולים להיות ערך מוחזר מפונקציה. כל סוגי המשתנים שנלמדו עד כה מתאימיס להגדרת פונקציה. 4 פסקל מהצעד הראשון - מהדי 2 נתבונן כעת בתהליך התזרת ערך מפונקציה. הנה פונקציה לדוגמה: 1 : (ז606ח1 : 5 ,גה) 810 הסטסחטם חו9סם חסו 5 < ג + 4 =: קוחסד 56 ;5 =: קוחסדך ;קסד =: 0 0 קוחד הוא משתנה שהוגדר כשלס בחלק ההצהרות של התוכנית. לפונקציה זו שני ערכיס מקומיים: 4 ו-8, שניהס מסוג שלמיס וגס הפונקציה מוגדרת כשלס. חלקה הראשון של הפונקציה כולל תנאי המכתיב למחשב להציב ב-קוחפד את הערך הגדול מבין השנייס. חלקה השני של הפונקציה הוא החשוב כאן. הוא וה שמורה למחשב כי על הפונקציה להחזיר את הערך שבמשתנה קח6ד. אנו רואיס כי כדי להחזיר ערך כלשהו, אנו מציבים אותו בשמה של הפונקציה, כאילו היא המשתנה. כך למעשה מוריס לפונקציה להחציר ערך מסויס. העדה: לא מתן לקרוא לפונקציה בדרך שקוראים לפרוצדורה. קדוגמה, את הפונקציה שזה עתה הצגנו, לא ניתן לקרוא כך : ;(,א) 800 צורת קריאה נכונה תהית: ;(,%) 80 =: 2 בדוגמה זו, הערך שנקבל מהפונקציה פופ מועבר ל-2. פירוש הדבר שכאשר אנו כותביס פונקציה אנו מנהליס ערך שמוחזר ממנה והוא משמש אותנו כמרכיב בביטוי. פרק 6: פרוצדורות ופונקציות 95 נוכל לתאר את הפונקציה גס בתרשים : הפונקציה 16 בחרנו באופן שרירותי את שמות המשתנים א ו-ץ שתפקידס לשמש כשני משתנים מקומייס הקולטיס לתוכם שני ערכים שלמיס מהתוכנית הראשית. ניתן לדמות שני משתניס אלה למשתנים ג ו-8 שבדוגמה האחרונה. בעזרת המשתניס הללו, שדרכס עובריס הערכיס לפונקציה 816, יודע המחשב מה להציג במוצא (פלט) של הפונקציה. ניתן לראות כי הנתון ייזורסיי החוצה לתוך המשתנה 2. משתנה זה אינו קשור לפונקציה, אלא מוגדר בדרך כלל כמשתנה גלובלי. את התרשים הזה ניתן לרשום כך: ;(1,3) 800 =: 2 א ו-צ הס 1 ו-3 בהתאמה, ואילו ערך המוצא יתקבל ב-2. ננסה להסביר זאת בדרך אחרת. נתבונן בקטע התוכנית הבא : : (ז0608ח1 : ץצ ,<) 0ופ הסטסחטם חו0סם 0 7 ההזהזססזק הווח + חו0סם ;()) 0 =: 2 ;(2החטא ,1וחטא) ו =: 2 ;(3|2 ,8/1) 0 =: 2 0 6 פסקל מהצעד הראשון - מהדי 2 המשתניס שברשימה זו מוגדריס כשלמים: 2ה/ ,3!1 ,2חחטז ,1וחטא ,2 ,5 ,₪ שאלה: בדוגמה זו הגדרנו שני משתניס מקומייס בשמות א ו-ץ השייכיס לפונקציה פַופ. עתה, בכל שורה משלוש השורות של התוכנית קראנו לפונקציה זו עס זוגות שוניס של משתנים. כיצד, אס כן, מתבצע הדבר! תשובה: המשתנים א ו-ץ משמשים לצורך ייצוג, כלומר, כאשר נציין למחשב כי אנו רוציס להשתמש במשתנים ג ו-8 לצורך הפעלת הפונקציה, המחשב יעתיק את הערך שבמשתנה 4 לתוך המשתנה א ובאותו אופן יעתיק את הערך שבמשתנה 8 לתוך המשתנה ץ. כך גס יעשה לגבי ווגות המשתניס 1וחטא, 2וחטא ו-8!1/ ,3/2. בצורה וו אין הפונקציה יייודעת'י באילו משתניס היא למעשה משתמשת, כי כל אשר מוטל עליה הוא לבצע חישוב או תהליך מסויס המתבסס על הנתוניס שצוינו לה. מקובל לכנות בשס משתנים אקטואליים את המשתניס המופיעים כפרמטרים בפונקציות או בפרוצדורות. ניהול משתנים חיצוניים נניח כי הוטלה עלינו מטלה לכתוב תת-שיגרה שתפקידה לקלוט שני ציוניס ולאחסן אותם במשתנים כללים (גלובליים), שהמתכנת צריך להגדיר. במיליס אחרות, עלינו לכתוב תת-שיגרה שמציינים לה שני משתניס והיא קולטת לתוכס ערכים. יסודות התכנות שנלמדו עד כה אינס מאפשריס לעשות ואת. נניח שאנו מגדיריס תת-שיגרה באופן הבא : ;(|₪68 : 5 ,) 000113785 ס6זטו0סס6סזוס ידוע לנו כי המשתנים 4 ו-8 הס משתניס מקומיים ואין באפשרותם להשפיע על משתנים אחריס שמחו לתת-השיגרה הזו. אם כן, איך נוכל לבצע מטלה זוז גס על בעיה זו חשבו מתכנני שפת פסקל. לצורך פתרון הבעיה הוחלט כי כאשר תוסף המילה השמורה זפּצ, יוכלו משתניס מקומייס לשנות משתניס אחרים. לדוגמח: ;((₪68 : ₪8 ,4 זבּצ) 0603785 6זטו0סססזוס חו60ס ;(' :8]065/ |68 סע זססחם") חובטוז/ ;(5 ,4) ח|₪680 0 פרק 6: פרוצדורות ופונקציות 97 כאשר הוספנו את המילה השמורה זפּע, המחשב ייהביןיי כי ברצוננו לשנות את המשתנים מחוצ לתת-השיגרה. כעת, כאשר נרצה לקרוא לתת-שיגרה צו עלינו לספק לה שני משתנים. אס ננסה להציב במקומס ערכים ממשיים, המחשב יודיע על תקלה. נקרא לתת-שיגרה באופן הבא: ;רחא וחפוססיוס ז ;|₪68 א ;(|₪69 : 8 ,4 זבּצ) 00613765 6זטו0ס6סזוס חו9סם ;(' :65ט]8/ |68 סע זססחם'") חוססוזו/ ;(5 ,ה) ח|₪680 0 חו9סם ,<) 5א187ז6כ) .0 במקרה זה המשתנה ₪ ייצג את המשתנה א, והמשתנה 8 ייצג את המשתנה +. בצורה זו ניתן יהיה לשלוט על משתניס על פי בחירת המתכנת. נעייו בדוגמה נוספת : ;0וסחו וההזססזוק (1 ז (2 סז נא (3 חן :וחד (4 ((061ח1 : 8 ,ג זהצ) 800 6זטוססססזק. (6 חו69 (7 חסו+ ה < 5 + (8 חו60ס (9 ;4 =: קוחסדך (10 12( 2 := ₪ ]יו (13 ;חס (14 (15 8 פסקל מהצעד הראשון - מהדי 2 חופ6 (16 ;(':8!065/ ]0 00לחו סע חש 56ב6וק') הוסטחצ | (17 ;(,0) חו₪680 | (18 19( 0 0,(; ;(8 ,' :סטוהע זסחשורז') חוססווצ | (20 ,' :|פ זסצוס |') חוססוו\ | (21 22( 0. בתוכנית ו הגדרנו שני משתנים (א ו-ץ בשורה 3). בתחילת התוכנית (שורות 17 ו-18) אנו מציגים הודעה המבקשת מהמשתמש להכניס שני ערכים, אשר ייקלטו לתוך המשתנים א ו-צ. בשורה 19 אנו קוראיס לתת-שיגרה פופ תוך ציון שני המשתנים א ו-ץ. מכיוו שבהגדרת תת-השיגרה כללנו את המילה השמורה זפּצ, כל פעולה שתשנה את תוכן המשתניס המקומייס (4 ו-8) תשנה גם את תוכן המשתנים שלנו (א ו-צ). בעזרת כלי חשוב זה נוכל לכתוב תת שגרות אשר מלבד וה שהן מקבלות ערכים לפעולה, הן יכולות להשפיע על משתנים שאנו, כמתכנתים, נוכל לקבוע, מבלי שנצטרך יילנבוריי בשגרות הללו ולהכיר את שמות המשתניס שהוגדרו בהן. שימוש חוזר בתת- שגרות בתחילת הפרק, כאשר פרטנו את היתרונות של השימוש בשגרות אמרנו גס כי הן נועדו לקצר תהליכים. בדוגמה שלפנינו אנו רואיסם כי השימוש במילה השמורה זפּט כדי יילשתףיי משתניס מסוימיס מחוץ לתת-שיגרה חוסך עבודה רבה. לדוגמה, במהלך התוכנית נוכל לקרוא פעמיס נוספות לפרוצדורה פַו, וכל פעם עס משתנים אחרים. בצורה וו לא נאלצ לכתוב כמה פרוצדורות, אחת לכל מקרה שניתקל בו, מכיון שלתת-שיגרה זו יש יכולת להשפיע חיצונית על משתניס שאנו נבחר. פרק 6: פרוצדורות ופונקציות ‏ 99 קינון תת- שגרות (9ח/65%ח-500) למעשה, קינון תת-שגרות אינו נושא חדש. הרעיון בקינון הוא, שניתן לקרוא לתת-שיגרה אחת מתוך תת-שיגרה אחרת. כיצד, אם כן, נעשה הדבר! התשובה לכך פשוטה, קריאה לתת-שיגרה אחת מתוך תת-שיגרה אחרת נעשית בדרך שלמדנו: הצגת השם והנתוניס (אם נדרש) שעל תת-השיגרה לקבל. לדוגמה: ;6|קחח8אם ההבזטסזוס ;(06061ח1 : 1) 06| /0סוז/ סזטוס0סס6סזוס חו9סם ;2 :5 סטוב/") חוססחו/ 0 5% סו / סנו 0ס6סוק זפ תח 6 חו9סם 0 10 0+ 1:=1 זס+ ;(1) 6/3!06סו 0 חו9סם 56 |ססוז/ .0 בתוכנית זו הגדרנו שתי תת-שגרות. הראשונה שמה 6טו|8/פוז/ ותפקידה להדפיס את הנתון השלס שמועבר לה. תת-השיגרה השנייה היא 56 וספוז/ והיא כוללת בתוכה לולאה שבעזרתה השיגרה 6ט!6/3פו/ נקראת עשר פעמים. יש לשיס לב, כי שני המשתניס שמוגדריס בשתי תת-השגרות הינס מקומיים, ורק תת-השיגרה ששייכת אליהסם יכולה לטפל בהם. כאשר הלולאה בתת-שיגרה % סז קוראת לתת-שיגרה 6טןה8/פ/ היא מעבירה לה ערך מסוים. מבחינתה של השיגרה 66/8]06ו/), הערך שמתקבל במשתנה 1 הוא ערך שלס פשוט, ואין זה משנה לה מהיכן הגיע. בצורה זו ניתן לפשט ברמה נוספת את התוכנית. במידה ויש תת-שגרות שמבצעות את אותו התהליך, ניתן ליצור תת-שיגרה שכאשר יקראו לה, היא תבצע אותו. 0 פסקל מהצעד הראשון - מהדי 2 נוהל וה פשוט למדי, אך יש בו מלכוד קל: לדוגמה, נחליף את סדר ההופעה של תת-השגרות: 5% סו / 6ו0ס6סוק זפ סח 6 חו9סם סו 10 סז 1:=1 זס+ ;(1) 6ט!3/ססוו/ 0 ;(06061ח1 : 1) 06| /0סוז/ סזטוסס6סזוס חו9סם ,2 :5 סט1ב/") חוססחזו/ 0 במקרה וה המחשב יודיע על שגיאה. מקור הבעיה הוא, שניתן לקרוא אך ורק לתת-שגרות שהוגדרו קודס לתת-שיגרה שקוראת להם. מסיבה זו, גס ניתן לקרוא בשיגרה הראשית לכל תת-השגרות, מכיון שאלו כבר הוגדרו בתחילת התוכנית, לפניה. פרק 6: פרוצדורות ופונקציות ‏ 101 תרגילים תרגיל 6.1 כתבו תוכנית הקולטת עשרה ציוני תלמידיסם ומחשבת את ממוצע הציוניס האלה. על התוכנית להכיל לולאה בשיגרה המרכזית של התוכנית ותת-שיגרה הקולטת את הציוניס שעורכת ביניהס את הממוצע. תרגיל 6.2 כתבו תוכנית הקולטת שני ערכים שלמים. על התוכנית להדפיס את הגדול מבין שניהס בעזרת תת-שיגרה שתבחן אותס. תרגיל 6.3 כתבו תוכנית המגדירה משתנה שלס מתוחל מראש לערך 0 (יש להשתמש בהגדרת %%חסס). על התוכנית לנוע בלולאה הקוראת ערך מהמשתמש. המשך הלולאה יכלול קריאה לתת-שיגרה שתשווה את הערך שזה עתה נקרא לערך הקודסם שנקרא. אס הערך החדש קטן מהערך הקודס לו, תת-השיגרה תדפיס הודעת שגיאה. בכל מקרה אחר תת-השיגרה תעדכן את המשתנה המתוחל מראש לערך החדש. הלולאה בשיגרה הראשית תימשך עד אשר תקלוט ערך שלילי. תרגיל 6.4 בהסתמך על הפונקציה שופ שהצגנו בפרק וה, כתבו תוכנית הקולטת שלושה ערכים ומדפיסה את הגדול מביניהס. נסו לערוך השוואה בין יעילות התוכנית הזו, אל מול הדוגמה הדומה לה בתחילת הפרק. תרגיל 6.5 כתבו תוכנית המחשבת ממוצע ציוניסם של כיתה שלמה. התוכנית תכלול שלוש תת-שגרות: הראשונה היא תת-שיגרה מסוג פונקציה, שתפקידה לקלוט ולהחזיר את מספר הכיתות שלהן אנו רוציס לחשב את הציונים. תת-שיגרה שנייה, גם היא מסוג פונקציה, שתפקידה יהיה לקלוט כל פעס כמה תלמידים יש בכיתה, ותת-שיגרה שלישית המכילה לולאה כדי לקרוא את הציונים של כיתה מסוימת ולהדפיס את הממוצע. 2 פסקל מהצעד הראשון - מהדי 2 תרגיל 6.6 כתבו תוכנית הכוללת פונקציה שתפקידה לקבל את שלושת הקבועים של משוואה ריבועית (6+אפ+2אה) ולחשב את הדיסקרימיננטה (486 - ?פ). במקרה שלא ניתן לחשב ביטוי וה, על הפונקציה להחזיר את הערך 1-. התוכנית תקלוט את שלושת הערכים הללו, תקרא לפונקציה ותדפיס את התוצאה. תרגיל 6.7 כתבו תוכנית הקולטת ערך שלס ומדפיסה את סכוס ספרותיו. התוכנית תכלול תת-שיגרה שתפקידה לקבל ערך וה ולחשב את הסכוס. הערה : הערך יכול להיות בן מספר מסוים של ספרות, לכן יש ליצור לולאה שתחשב את הסכום. (רמז: יש להשתמש באופרטוריס 00 ו-/01 שלמדנו בפרק 2). תרגיל 6.8 כתבו תוכנית הכוללת פונקציה שתפקידה לחשב את הערך המקורב של הקבוע ו₪ (...3.1415). ערך זה מחושב על-ידי הטור: ), שי ו (2- א2) 9 .3-5 י] הפונקציה תסייס את החישוב כאשר האיבר האחרון המחושב קטן מ-0.0001. תרגיל 6.9 כתבו תוכנית הקולטת משכורת של עובד ואת אחוז המס שיש לנכות ממנה. התוכנית תפעיל תת-שיגרה שתחשב את המשכורת נטו (לאחר ניכוי המס). את התוצאה יש להציב במשתנה שיצוין על ידי המתכנת. (רמז: יש להשתמש במילה השמורה זִּ/). פרק 6: פרוצדורות ופונקציות 103 פרק 7 מחרחות מהי מחרוזת (8חוז5)? בחיי היומיוס אין אנשיס מדבריס בינס לבין עצמס במספרים. התקשורת וההבנה ביניהס נעשית על ידי שמות ומשפטים. גס מחשב 26 שאנו משתמשיס בו מבין אך ורק מספרים. כדי ליצור מחשב פשוט, חייבת שפתו להיות פשוטה ולכן, המחשב "'מדבריי אך ורק בדרך וו. מאידך, בני האדס אינס יכוליס לתקשר ביניהם, או בינס לבין המחשב, במספרים בלבד. לשס כך פותחו שפות תכנות, ביניהן טורבו פסקל (|03563 סטיוטד), שתפקידן לגשר בין המשתמש לבין המחשב. אחד מאמצעי הגישור בין המשתמש לבין המחשב הוא המחרוזת (0ח1ז50). מכיון שלא ייתכן כי נתוניס כמו שס פרטי, שס משפחה, רחוב, הערות וכדומה, יועברו למחשב בצורת מספרים, שפת פסקל מספקת לנו כליס לעשות זאת: זוהי המחרוזת, שתפקידה להכיל רצף של תוויס. מבנה מחרוזת בשפת פסקל מסיבות הסטוריות נקבע כי כל מחרוזת תוכל להכיל רצף של עד 255 תווים, כלומר: שם, הערות, או אפילו סתם נתוניס אקראייס שאורכס לא עולה על 255 סימניס. המבנה הבסיסי שעל פיו מגדיריס משתנה מסוג מחרוזת הוא : זפ ;ו :סוחהח זה פוק 7: מחרווות 105 "סוההּה זהּצ''י הוא שס המשתנה, ואילו "5680" ווהי המילה להגדרת מחרוזת. לדוגמה: חפ ו :הא הגדרה וו מאפיינת משתנה בשס ''סוחבּא'יי כמשתנה מחרוזת, שאורכה המירבי יכול להגיע ל-255 תווים. בדרך כלל, אנו לא וקוקים לאורך המירבי האפשרי, ועל כן נרצה להגדיר את האורך המירבי לכל משתנה בנפרד. כך נוכל גס לחסוך בויכרון. נוכל להגדיר אורך רצוי של מחרוזת על ידי התבנית הבאה: זְהָּ [וח6וחו 5 :חפה זה/ התוספת בתבנית זו היא המילה 609%₪!, אשר מגדירה את האורך המירבי של המחרוזת. לדוגמה, זְהָּץ ;ו :1 זוהי הגדרה של משתנה מחרוזת שיוכל להכיל בתוכו עד 15 תוויס. 6 הערה: אורך מחרוזת יכול להיות אך ורק בתחום של 0 עד 255. פעולות מחרוזת בסיסיות הטיפול במחרוזות שפת פסקל מאפשרת שימוש קל ונוח במחרוזות. ניתן לקלוט שס או פרטיס של אדס או עצס לתוך מחרוזת באותה פשטות שבה השפה קולטת נתוניס אחריס כמו שלמיס, מספריס ממשיים, תוויס ועוד. הדוגמה הבאה מדגימה עיקרון זה: ;61|קרחהאם ובוסוק זה 1 + ;ו :הא חו0סם ;('מהו שמך?') חוססו]/ ; (6ח3א) ה|₪680 ;('מהו גילך?') ח|ססו]/ ;(06) ח|₪680 6. 6 פסקל מהצעד הראשון - מהדי 2 תוכנית זו קוראת שס לתוך משתנה מחרוזת ולאחר מכן היא קולטת גיל לתוך משתנה מסוג שלםס. אס הינו משניס את הגדרת משתנה המתחרוזת ל-[0]6ח5%1 6וחְבּא, השס שהיינו מכניסים היה מוגבל ל-6 אותיות בלבד. כמובן שהשפה לא היתה מודיעה על שגיאה אס היינו מכניסיס שס ארוך יותר מ-6 אותיות, אך המשתנה היה קולט את 6 האותיות הראשונות בלבד, ומתעלס מהשאר. בנוסף לדרך שבה פסקל קולטת מחרוזות, ניתן להציב ביימשתנה מחרוותיי ערך קבוע מראש. דבר זה נעשה כך: ' מחרוזת ' =: 6וחאָח זפ כל מחרוזת קבועה, חייבת להתחיל ולהסתיים בגרש בודד (י), כשס שראינו במשפט של הפקודה חופטוז/). קטע התוכנית הבא מדגיס זאת: ;62| רחהאם וההזססזק זה ו 5% חו60ם ;'שלום !!' =:56 ; (5%) ח|ססוז]/ .6 השוואת מחרוזות משתנה המחרוזת הוא משתנה ככל משתנה אחר. בשל כך ניתן להשוות את תוכן המשתנה לערך כלשהו או למשתנה מחרוזת יותר מאשר כשאנו משוויס שני משתניס שלמיס. ההשוואה נעשית באופן הבא: ... ח6וז 50182 = 81ַחו50 )1 טיפול בתווים בודדים במקריס מסוימיס יש צורך לשנות או לקרוא תו בודד מתוך מחרוזת. כיצד נעשה הדבר!ו שימו לב: הביטוי [חסחופסק]9ח1ש5 מאפשר להתייחס לתווים בודדיסם בתוך מחרוזת שלמה, על פי המיקוסם שלהם בתוך המחרוזת. ספירת התוויסם במחרוזת הינה מצד שמאל/ פרק 7: מחרווות 107 לדוגמה, הביטוי 5)]1[:='4 ישנה את התו הראשון במחרוזת 5%. באותו אופן, אס נכתוב ([5]3) ח|ספוז\ ידפיס המחשב רק את התו השלישי מתוך המחרוזת 5%. למעשה, כל דבר שניתן ליישם על משתנה מסוג תו (644₪), ניתן ליישס על תוויס בודדים בתוך מחרוות. תוכנית דוגמה: ;3 הא ובוסוק זִהָּץ וב 5% חו60ם ;('הקלד מחרוזת כלשהי:') חוססו]/ ;(5%) ח|₪680 ;([561 ,' = [561') חוססוזו/ 6. פונקציות מחרוזת נוסספות לא נוכל לספק את כל דרישות התכנות של מחרוזות באמצעות הפעולות הבסיסיות שלמדנו עד כה. פעולות כמו חיפוש מילה בתוך מחרוות, או עריכת מחרוזת הן פעולות שנעשה בהן שימוש רב. כל מה שלמדנו עד כה לא יכול לספק לנו את הכלים המתאימים לכך. שפת פסקל כוללת כלים מתקדמים :ותר לטיפול בנושאיסם אלה. הפונקציה ח16₪9% (אורך) אחת הפונקציות השימושיות ביותר היא 1609%₪. הפונקציה מקבלת מחרוזת כנתון ומחזירה את אורכה. תוכנית דוגמה: ;64|קרחהאם ובוסוק זה 1 6 ו 5% חו0סם ;(':0חו50 3 חו 6קעד') חוססוז/ ;(5%) ח|₪680 (00)50ח16 =: 1 ,' = ה8%ח6! חחוס5') חוססוזו/ .6 תוכנית ו קולטת מחרוזת ומדפיסה את אורכה. 8 פסקל מהצעד הראשון - מהדי 2 הפונקציה 60 (העתקת קטע מחרוזת) במקריס מסוימיס יש צורך להעתיק חלק ממחרוזת. לשס כך מספקת שפת פסקל את הפונקציה ץ600, שתפקידה להעתיק חלק ממחרוות קיימת. השימוש בפונקציה נעשה בתבנית הבאה: הטסש ,06%ח1 ,57) ץקס6 =: 9חו5 5% - המחרוזת שממנה רוציס להעתיק קטע. 6% - המספר הסידורי של התו שהחל ממנו תתחיל ההעתקה. + 6 - מספר התוויס שרוציס להעתיק. לדוגמה: (4, 1 := 0000 ץ000 =: 56 במשפט זה מעתיקיס את המילה י6000יי לתוך המשתנה 5%. הפונקציה ₪05 (מיקום תת- מחרוזת) במקריס מסוימים עלינו לחפש מילה או קבוצת תוויס מסוימת בתוך מחרוזת. לצורך כך קיימת פונקציה מיוחדת שתפקידה הוא יילומריי לנו היכן ממוקמת תת-מחרוזת בתוך מחרוזת נתונה. הפונקציה היא 05ם. אופן השימוש בה: (5₪ ,58 500) 05ק =: פע 6חו ז2-5%ש5 - תת-המחרוזת שמחפשיס בתוך המחרוזת. ז5% - המחרוזאת שבה מתפשיס. זהּט %חז - משתנה וה יקבל את מיקוס תת-המחרוזת בתוך המחרוזת. לדוגמה, נכתוב את המשפט הבא : ; (יעסצ סד 10 שחי ,יסדי) 5סק = 1 הפקודה תציב במשתנה 1 את הערך 7, מכיוןו שהמחרוזת ייסדיי מצויה בתוך המחרוזת ייעסצ סד 10 |ושחיי החל מהתו השביעי. נבדוק לדוגמה, מצב אחר: 860' ,'א') 205 =: 1 במקרה זה תת-המחרוזת אינה קיימת בתוך המחרוזת ולכן 1 יקבל את הערך 0. פוק 7: מחרווות 109 שימו לב: הפונקציה ₪05 מחזירה תמיד את מיקוס הצירוף הראשון שהיא מוצאת, ואיננה ממשיכה לחפש במחרוזת צירופים נוספים. שינוי מבנה מחרוזת הפקודה +ו1561 (הכנסת תת- מחרוזת) למדנו שניתן לחבר שתי מחרוזות על ידי תבנית המשפט הבאה: 5₪ + 511 =: 501 אך מה קורה כאשר רוצים יילשתוליי מחרוזת אחת בתוך מחרוזת אחרת! לשם כך קיימת פקודה שימושית, שבעזרתה ניתן לעשות ואת. מבנה הפקודה: ; (1806% ,50 ,50050) +6פח1 ז5₪25% - המחרוזת שאנו רוציס לשתול. 5 - המחרוזת שבה אנו שותליסם את המחרוזת המשנית. 6% - המיקוס שממנו אנו רוציס להתחיל לשתול את המחרוזת המשנית בתוך המחרוזת הראשית. לדוגמה: ; 65|קהחהאם והבזטסזום זה ;וז 5% ,36 חו0סם ;'?ץ008+ טסץ זב אוסת , ,סו|6ר' =: 5% ;(':6רחפח זטסץ זססחם') חובסוז/ ; (6חה) ה|₪680 ;(7 ,56 ,6ח8ּ]) 1056 ;50) ח|ססוז/\ .6 תוכנית או מקבלת כקלט את שם המשתמש ייושותלתיי אותו במיקוס ה-7 במחרוזת, אחרי הפסיק העוקב את המילה 'י,0 1 ש'י. אס נכניס, לדוגמה, את השס ייז/י, המחשב ידפיס את ההודעה: ?0 וסץ 6זה צוסח ,1/ה, סווסרן 0 פסקל מהצעד הראשון - מהד'י 2 הפקודה 0616%6 (מחיקת קטע ממחרוזת) הפקודה 'הנגדית" ל-ז5₪פ5א1 היא םדם ופסם. תפקידה למחוק קטע מתוך מחרוזת. מבנה הפקודה: ;600 ,06%ח1 ,57) סססוסכ יב - המשתנה שמכיל את המחרוזת. 6% - המיקוס במחרוזת שממנו מתחיליס במחיקה. + - מספר התוויס שיש למחוק מתוך המחרוזת. לדוגמה, אס נתונה המחרוות ?גא השסץצ 15 דהאאהצציי, וברצוננו למחוק את שתי אותיות א שבמילה יידהאארוציי, נרשוס : ;(2 ,3 50) 6!6%6 0 זה הוא משתנה המכיל את המחרוזת, 3 - המיקוס לתחילת המחיקה, ו- 2 מספר התוויס שצריך למחוק). דוגמה: ;ההא וההזףסזק | (1 זט (2 ;ו שפ (3 ;| :אס0ח1 (4 5( חו60פ | (6 ;('הכנס מחרוזת כלשהי, שבה לפחות שתי מילים:') חו6טוז/ (?7 ;(50) ח|₪680 (8 ,0 * )205 =: אססח1 (9 הסוח 0 <> א06ח1 זו (10 חו0סם 12 ;(068ח1 ,1 5%0) 606|סכ (12 ;('מחרוזת ללא המילה הראשונה: ") חוססוז/\ (13 ;(50) חו6סוו (14 15( 0 16( 56 ;('"שגיאה: המחרוזת חייבת להכיל לפחות שתי מילים.') חו6םוז/ (17 .60 (18 תוכנית דוגמה זו קצת יותר מורכבת, אך כאשר ננתח אותה, נראה שהיא פשוטה למדי. בשורות 3 ו-4 מוגדריס שני משתנים : 5% מסוג מחרוזת, ו-א06ח1 מסוג שלס. תפקיד שורה 9 למצוא את מיקוס הרווח הראשון, כלומר סוף המילה הראשונה. תפקיד משפט התנאי ( ... חסחצ ...ו) בשורה 10 לבחון אס קיימת יותר ממילה אחת, שהרי אס היתה רק מילה אחת, לא היה רווח (בין המילה הראשונה פרק 7: מחרווות ‏ 111 לשנייה). כשהפונקציה 505 אינה יימוצאת'י את המחרוזת המבוקשת (במקרה שלנו תו רווח), היא מחזירה ערך ''0יי. תפקיד 6!666 בשורה 12 הוא למחוק מן התו הראשון (1) ועד למיקוס הרווח (כולל הרווח). תפקיד שורות 13 ו-14 להדפיס הודעה, ולאחר מכן להדפיס את המחרוזת לאחר עריכתה. אס התנאי לא מתקיים (לא נמצא רווח, והפונקציה 505 החזירה ערך יי0יי) המחשב ידפיס הודעת שגיאה. תוכנית דוגמה נוספת: תוכנית זו יותר מורכבת ואף נראית מסובכת, אך ניתוח מפורט של שורות הקוד מבהיר את משמעותה ואופן פעולתה. תפקיד התוכנית לקרוא מחרוזת ולהפוך את סדר התוויס, כדי שתודפס מן התו האחרון לתו הראשון. למשל, המחרוזת המקורית היא 8586 וההדפסה תהיה 68. ;7קוחהאם וההזףסזק | (1 זט (2 ;ו :502 ,501 (3 4( חו69פ | (5 ; ('הכנס מחרוזת:') חוססוז/ (6 (501) ח|₪680 (?7 8( 9( 502 :='' 0 0 < (501) ה00ח16 6!וח/ש (10 חו0סם 12 ;(1 ,502 ,[5%1]1) 56%ח1 (12 ;(1 ,1 ,511) 606|ס (13 ]יו (14 ('המחרוזת לאחר עריכתה:') ח!|ססוז/ (15 (502) ח|ססוז/\ (16 17( 0. בשורה 3 מוגדריס שני משתניס: 501 המשמש כמחרוזת המקור, המחרוזת הראשונית. תפקיד המשתנה 56 הוא לאחסן בגמר התהליך את המחרוזת ההפוכה. הרעיון שעליו מבוססת התוכנית הוא שימוש בפקודה 1056 כדי להכניס תו חדש לתוך מחרוזת היעד 502 ולאחר מכן למחוק אותו מ-561. לכן, תפקיד שורה 10 לבדוק אס אורך המחרוזת 501 (שאותה מקצצים) שווה ל-0. לדוגמה, אס ב- 561 היתה המילה :'10 ₪יי, התוצאה המתקבלת ב-502 ובהדפסה היתה: ייחם | 1סיי. 2 פסקל מהצעד הראשון - מהדי 2 מחרוזות ומספרים תוכנה מורכבת היא לא רק תוכנה אשר קיימיס בה משתניס רביס וחישוביס רביס. תוכנה מורכבת היא תוכנה שקיימיס בה קשריס רביס בין מחרוזות, משתנים, משפטי תנאי, לולאות ועוד. במקריס רביס מתקבל נתון מספרי כלשהו, אשר שמור במבנה של מחרוזת, ויש צורך להמיר אותו לערך מספרי מסוים, או להיפך. נניח לדוגמה, שנתון המשפט ייכם01 ₪5 הםצ 21 יג זיי, ואנו רוציסם לחשב את הגיל בעוד מספר שנים. יש ברשותנו כליס למחוק את כל אשר אינו נחוץ לנו על פי הידע שרכשנו עד כה. אך מה בדבר הערך ''21'י1 כיצד נוכל לבצע עליו פעולות אריתמטיות (חישוביס), שהרי פעולות מסוג זה דורשות משתנה מסוג שלס או ממשי. ולהיפך, כיצד ניצור מחדש מחרוזת כזוז כיצד נתרגם ערך מספרי למבנה מחרוזת! לצרכים אלה מספקת פסקל שתי פקודות יעילות - 5% ו-31 שתפקידן לבצע מטלות אלו. הפקודה ז5% (תרגום ערך מספרי למחרוזת) פקודה זו מקבלת ערך מספרי, באמצעות משתנה כמוב,ן, וממירה אותו למבנה מחרוזת. מבנה הפקודה: ((0ח501 ,6ט|3/) 5₪ 6 -- הערך השלס או הממשי שאנו רוציס להמיר. פחוש - משתנה המחרוזת שבתוכו תאוחסן המחרוזת החדשה שנוצרה. תוכנית לדוגמה: ,68|קרחאם הוהבזססוס זפ וו :0 ;ו 5% חו9סם ;('מהו גילך?') חומםוז/ ((06) ח|₪680 ₪06 := 406 + 4 57 )06, 50, ;('בעוד 4 שנים הגיל יהיה ' , 51) ח [מסוזו/ .0 תוכנית או מקבלת כנתון את הגיל, מחשבת את ערכו בעוד ארבע שניס, מתרגמת אותו למשתנה מחרוזת ומדפיסה אותו. פוק 7: מחרווות ‏ 113 הפקודה 31 (הפיכת מחרוזת לערך מספרי) לעיתים יש צורך להמיר ערך השמור במבנה של מחרוזת, לערך של משתנה מספרי. לשס כך קיימת הפקודה 41/. תבנית הפקודה: ;(068ח1 ,זהּ/ ,50) |3 5% - משתנה מחרוזצת שמכיל את הערך המספרי. זהּ - משתנה שיכול להיות שלס או ממשי, ומאחסן את הערך בסיוס ההמרה. 6%חז - משתנה מסוג שלס שתפקידו לדווח אס המחרוזצת מתאימה להמרה או לא. לדוגמה, לא ניתן להמיר את המחרוזת 'י134'י מכיון שהיא כוללת את התו יחי (שאינו מספרי). במקרה וה המשתנה א06ח1 יכיל את מיקום התו השגוי, שבדוגמה זו הוא 2. אס ההמרה מתבצעת ללא טעויות, המשתנה א06%ח1 מכיל את הערך 0. 4 פסקל מהצעד הראשון - מהדי 2 תרגילים תרגיל 7.1 כתבו תוכנית הקולטת שס ומדפיסה הודעה בנוסח: יישיהיה לך יוס טוב, [שס נתון] *. תרגיל 7.2 כתוב תוכנית שמכילה את המילה 109 !יי במשתנה מחרוזת 551, וקולטת מילה לתוך משתנה מחרוזת 5%2. אס שתי המחרוזות שוות, התוכנית מדפיסה את ההודעה: ייססד טסצ סד 0 | שח". תרגיל 7.3 כתבו תוכנית שתפקידה לקלוט מחרוזת ומספר שלם, ולהודיע על איוה תו מצביע המספר השלם. לדוגמה, אס נתונה המחרוזת 'י8605₪ג'י, אס נזין את המספר 3 הוא יגרוס להצגת ההודעה הזו על המסך: 6 = [3]ך5'י. תרגיל 7.4 כתבו תוכנית אשר קולטת מחרוזת, ומדפיסה אותה בריווח כפול על המסך. לדוגמה, המתרוזת 'י10)שחיי תודפס בצורה הבאה: "יס 1 !1 5 ף". כתבו תוכנית זו תוך שימוש בפרוצדורה. תרגיל 7.5 כתבו תוכנית אשר דומה לתרגיל 7.3. התוכנית תקלוט מחרוזת ומספר שלס. אס המספר נמצא בתחוס אורך המחרוזת, התוכנית תדפיס את התו שאליו מצביע השלם. אס השלם גדול מאורך המחרוזת, התוכנית תדפיס ייסז והשטאז = |ה/'יי. תרגיל 7.6 כתבו תוכנית הקולטת מחרוזת ומדפיסה את שתי האותיות האחרונות שבה. (רמז: יש לבדוק לפני כן אס אורכה של המחרוזת הוא לפחות 2 תווים.) תרגיל 7.7 כתבו תוכנית הקולטת משפט ומדפיסה את המילה הראשונה בלבד. על התוכנית לכלול תת-שיגרה הקולטת את המחרוזת ותת-שיגרה המדפיסה את המילה. (רמז: יש להשתמש בפונקציות 05 ו-609%, וגם לבדוק שהפונקציה 05 אינה מחזירה ערך 0). פרק 7: מחרווות 115 תרגיל 7.8 כתבו תוכנית הקולטת מחרוות, שבה אמור להיות ערך מספרי. אס המחרוות שהתקבלה היא אכן ערך מספרי טהור ללא תוויס מיותרים, התוכנית תדפיס הודעה בנוסח ייהכל בסדריי. אס המחרוזת אינה ייתקינה'יי, התוכנית תדפיס הודעה מתאימה ואת התו השגוי במחרוזת. תרגיל 7.9 כתבו תוכנית הקולטת מספר שלם ומדפיסה אותו עס הפרדה של פסיק לאחר כל שלוש ספרות. לדוגמה, נתון 14532, ולכן פלט המחשב יהיה 14,532. התוכנית תכלול פונקציה שתקבל כנתון את הערך הנקלט ותחזיר מספר ערוך עס הפרדה של פסיקים. תרגיל 7.10 כתבו תוכנית הקולטת ערך שלס, ממירה אותו למחרוזת ומחשבת את סכוס ספרותיו. החישוב ייעשה בעזרת פונקציה מתאימה. כתבו תוכנית נוספת הקולטת ערך שלס, ממירה אותו למחרוזת ומדפיסה אותו מן הסוף להתחלה. תרגיל 7.11 כתבו תוכנית הקולטת מחרוזת ייומסלקתיי כל אות החוזרת על עצמה יותר מפעס אחת ברצף. תהליך זה ייעשה על ידי פונקציה. לדוגמה, מחרוות כגון: "???םשא טסצ סספ זואהח/צש" תודפס כך : "?אסוא טסצ ספ דההצ" תרגיל 7.12 כתבו תוכנית הקולטת מחרוזת ומדווחת : א. אורך המחרוזת. ב. כמה מילים יש במחרוזת. ג. | מהי המילה הארוכה ביותר. ד. מהי המילה הקצרה ביותר. ה. מהו אורך המילה הממוצעת. 6 פסקל מהצעד הראשון - מהדי 2 תרגיל 7.13 כתבו תוכנית הקולטת מחרוזת מסוימת ומצמצמת בה את כל הרווחיס הכפולים, מוחקת את הרווח הראשון (אס קייס) ואת הרווח האחרון (אס קיים). לדוגמה, נתונה המחרוזת :יי שלוס לכל המשתמשים | ". לאחר עיבוד המחרוזת נקבל: יישלוס לכל המשתמשים'י. פרק 7: מחרווות ‏ 117 פדק 8 מערכים מערך (עְּזזבּ) הוא רצף של נתוניס (איבריס), אשר כולס מאותו סוג נתון. לכל איבר יש מספר סידורי, אשר מייצג את מיקומו במערך, ולכןו לכל איבר ניתן לגשת בצורה ישירה, ללא כל תלות באיבר או באיבריס אחריס. מערכים חד- מימדיים ניתן להציג מערך מן הסוג הפשוט ביותר כטבלה. טבלה מסוג זה יכולה להכיל רשימה של מספריס שלמים, שברים ואפילו מחרוזות. בדוגמה הבאה קייס מערך ובו שישה ערכיס שלמים: המערך 48ד והאיברים איבר מסי 1 איבר מסי 2 איבר מס' 6 לכל מערך (טבלה) יש שם המייחד אותו. שס המערך שבדוגמה שלנו הוא 8 ד, ולכל המשתניס בו יש אותו שס - 148. המאפיין היחיד המבדיל איבר אחד ממשנהו הוא המספר הסידורי. לדוגמה, האיבר [48]3ד הוא השלישי במערך, ואם נבדוק את ערכו הנוכחי (הכוונה ל-[18]3) נקבל את הערך 22. פרק 8: מערכיס ‏ 119 ניתן לדמות מערך למקרה בחיי היומיוסם. המחשב מטפל במערכים באותו אופן שהדוור מחלק מכתבים בשכונה שבה יש בתיס פרטיים. הדוור בודק את שס הרחוב (המחשב קורא בהתאמה את שס המערך). לאחר מכן הוא קורא את מספר הבית (המחשב, לחילופין, בוחן את המספר הסידורי של האיבר). בצורה זו הדוור יודע את יעדו של המכתב וכך גס המחשב יודע את מיקומו של האיבר. לשס מה להשתמש במערכיס! במה זה מייעל את התוכנית! למעשה, יש תוכניות אשר בלעדי המערך לא היה ניתן לפתור אותן בכלל, ואס אפשר היה לעשות זאת, הפתרון היה מורכב ומסובך. ניקח לדוגמה קלט ערכים מהמקלדת. אפשר לקלוט כל ערך למשתנה נפרד: ג, 8 6 וכדי, או שאפשר לקלוט את כולם לתוך איברים של מערוך אחד. התנאי הוא כמובן, שכולם יהיו מאותו סוג נתון: מספריס שלמים, מחרוזות וכד'י. כאשר עוסקיס במספר רב של נתוניס, השימוש באיבריס בודדיס ושוניס אינו מעשי כלל, ובשלב זה, טרס עסקנו בתכנות. נצטרך לכתוב תוכנית ענק שתטפל בכל איבר בנפרד. 98 הערה: בפרק זה נעסוק אך ורק במערכים חד-מימדיים. בפרק הבא נסביר מהם מערכים רב-מימדיים, כיצד מגדירים ומשתמשים בהם. הנה דוגמה נוספת : לפנינו תוכנית שתפקידה לקלוט ציוניסם של מספר תלמידים. ללא הגדרת מערך ניאלצ לכתוב לולאה שתיראה כך: 0 00 1 =:1 הס חו0סם ;(':' ,1 ,' זססוחח הר זססחם'") הובסוזו/ ;(1ז8/) חו₪680 חהסום 1 =[ !| ;(2ז8/) ח|₪680 הסוש 2 =[ | ;(8710) ח|₪680 הפר 10 = 1 + ו 1, 2ז8/ וכו'י הס הציוניס של התלמידיס השונים. בתוכנית זו נאלצנו לקרוא עשרה ערכים אל תוך עשרה משתנים שונים. ומה היה אילו צריך היה לקרוא 0 ערכים? איך משתמשים בתכונות המערך כדי לכתוב תוכנית יעילה וקצרה - זאת נלמד עכשיו. 0 פסקל מהצעד הראשון - מהדי 2 הגדרת המערך בשפת פסקל לפני שניגש לאופן הגדרת המערך בשפת פסקל, נבהיר תחילה כמה מן התכונות הבסיסיות הנחוצות להגדרה. 1 לכל מערך יש שם המייחד אותו, באותו אופן שלכל משתנה מסוג שלס, מחרוזת וכוי, יש שס המייחד אותו משאר המשתניס. 2 מספר האיברים קבוע מראש. לא ניתן לשנות מספר וה בזמן ההרצה של התוכנית. 3 סוג המשתנה שעליו מבוסס המערך. אופן הגדרת המערך: זה ([6] זס [ח..ח] שפזובּ :הח 6וח - שס המשתנה המייצג את המערך. צְּזזהּ - מילה שמורה המגדירה לשפת פסקל כי המשתנה הוא מסוג מערך. [ח..וח] - הגדרה וו קובעת את תחום ההגדרה של המערך (ולמעשה, גם את מספר האיברים). לדוגמה, הגדרת [2..10] תאפשר להשתמש במערך המתחיל מ-2 ומסתיים ב-10. גישה לאיבר מחוצ לתחום זה תגרוס לשגיאה בתוכנית. [06/] 0 - הגדרת סוג המשתנה הבסיסי שעליו מבוסס המערך. לדוגמח: זה 1 01 [1..10] שוב :זה אוהי הגדרת מערך ששמו 68זפ!א. תחומו הוא 1 עד 10 והוא מבוסס על משתנה מסוג שלם. על פי ההסבר בתחילת הפרק, המשתנה 18765 הוא למעשה טבלה בעלת עשרה איבריס מסוג שלס. תחוס המערך [ח..וח] יכול להיות בטווח של 65535- עד 65535. לא ניתן להגדיר ערך גבוה או נמוך משני ערכיס אלה. את תחוס המערך כותביס במבנה זּה: [ערך גבוה .. ערך נמוך] במקריס מסוימים לא יהיה ניתן להגדיר מערכים גדולים יותר מדי, אפילו אס הס בתחוס המותר, עקב מגבלות ציכרון. פרק 8: מערכיס ‏ 121 דוגמאות לסוגיס נוספיס של מערכים: זה ;8 01 [0..19] שְהזוהּ : החוד ;68 )6 [3..15-] ץפוה :5 ;ח00!68 06 [2..14] שוב :0 ;50 06 [1..15] ץפוה :5רחה] אפשר לראות את איברי המערך כאוסף של תאיס בטבלה, וכך גם נתייחס אליהס בהמשך. נבחן שוב את צורת הטבלה, ונראה כי למעשה כל איבר ייסגוריי בתא משלו, מבודד מן האחרים. יש שוני בין תא פשוט לבין איבר, אך ניתן לומר כי בשימושיס כשלנו, העוסקיס במשתניס פשוטים, המושג תא הוא הנכון בשימוש. ההגדרה של איבר מיוחסת למשתניס הרבה יותר מורכביס שעדיין לא למדנו. שימוש מעשי במערכים עד כה למדנו מהס מערכים, למה הס משמשים וכיצד מגדיריס אותס. למעשה, למדנו הכול חוץ מהדרך שבה מיישמיס את השימוש בהם. על פי הגדרת המערך, כל איבר נבדל ממשנהו על ידי מספרו הסידורי. כדי לגשת לאיבר מסוים, דרוש שס המערך והמספר הסידורי של איבר שרוציס לפנות אליו. כדי לגשת לאיבר בודד בתוך מערך מסויס נשתמש בתבנית הבאתה: [חסטופסק]6וחהה זה שוחה זבּצ - שס המערך חסולו05ק - המספר הסידורי של האיבר. סריקת מחרוזת קליטת מספר רב של ערכים אל תוך מחרוזת בצורה פרטנית כמו זו שמוצגת כאן אינה יעילה, כמוה כקליטה של משתניס בודדיםס: ;([1 ]90 ד) ח|₪680 ;([30]2 ד) ח|₪680 ;([30]3ד) ח|₪680 כדי לייעל את התוכנית, נשתמש במשתנה אשר מצביע כל פעס על איבר אחר בתוך המערך. 2 פסקל מהצעד הראשון - מהדי 2 התוכנית הבאה מגדירה מערך בן עשרה תאיס מסוג שלמים, וקולטת לתוכו עשרה ציוניס של תלמידים: ;1 וההזסזק | (1 זט (2 3( 10%: 16007; 1 ]0 [1..10] ץפוה :5 (4 (5 חו60פ | (6 0 10 00 1 =: א06ח1 זסז (?7 חו60ס (8 ;('הכנס ציון מספר ' ,06%ח1) חוסטח/ (9 ([068ח765]1ה1]) ח|₪680 (10 ]יו (11 12( 0. התוכנית מגדירה שני משתניס: בשורה 3 מוגדר משתנה מסוג שלם, ובשורה 4 מוגדר משתנה נוסף מסוג מערך, שבו עשרה תאים. בשורה 8 הוצהרה לולאת זסז שבה המשתנה א06ח1 משמש כמצביע על האיבר הראשון, השני, השלישי וכו', בתוך המערך. בשורה העשירית מתבצעת קליטת נתון. נשיס לב כי המחשב מתייחס אל הביטוי [א06ח68]1זהו! כאל משתנה מסוג שלם רגיל. כלומר, כל איבר בודד בתוך מערך נחשב כמשתנה רגיל לכל דבר! [8/%5/1006%, אין המחשב יכול לבקר תמיד את פעולותיו, מכיון שהמצביע (במקרה שלנו א6סח1) הוא משתנה. יכול להיווצר מצב, שבו המצביע יחרוג מן התחום שהוגדר למערך מסוים. תקלה מסוג זה מתבטאת בדרך כלל בהרס נתונים אחריס בתוכנית, או ליינפילתיי התוכנית ולכן יש לשים לב לעניין זה. 04 העדת: במקריס מסוימים, כאשר משתמשים במטוי כמו מן הראוי להעיר שיש מהדרים שבונים מנגנון אבטחה שפועל בזמן ריצת התוכנית, ומאתר מצביס שבהס המצביע *יחורגיי מתחוס המותר. פרק 8: מערכיס ‏ 123 ניהול מערכים עד כה עסקנו בניהול הבסיסי של מערכים. האופן שבו למדנו על מבנה המערך, וצורת השימוש בו נועדה לצורכי הדגמה והסבר בלבד. למעשה, כאשר כותביס תוכנית הכוללת מערכים, נהוג בדרך כלל לעשות כמה דברים יחד, אם ניתן מבחינת פסקל, ואם התוכנית מאפשרת זאת. לדוגמה, אס היה עלינו לכתוב תוכנית שמנהלת ציוני תלמידיסם בשתי כיתות שונות אנו יכולים להקים שני מערכיס נפרדים, כי כך נוח יותר למשתמש. לעומת וה, כדי לכתוב תוכנית העוקבת אחר שינויי מזג האוויר שלוש פעמים ביום, עדיף לקרוא נתוניס אל שלושה מערכים בו-זמנית. הדוגמאות הבאות ממחישות גישה זו. קריאת נתונים נפרדת לכל מערך: 5 ותהזטסוס ז תח 6 0 [1..10] פוב :1 ]0 [1..10] פוב 2 חו9סם ;('הכנס ציוני כיתה ראשונה:') חו6םוזו/ 0 10 0 1 =:1 הס חופסם ;('ציון מספר: ' ,1) חוססוזו/ ;([01355]1) ח|₪680 יו ;('הכנס ציוני כיתה שנייה:') ח|שוז/ 0 10 00 1 =:1 הס חו0סם ;('ציון מספר:' ,1) חוססוזו/ ([0!8552]1) ח|₪680 זי .6 בדוגמה זו אנו קולטיס 10 ציוניס המייצגיס את ציוני הכיתה הראשונה, ולאחר מכן עוד 10 ציוניס המייצגיס את ציוני הכיתה השנייה. כפי שהוזכר בתחילת סעיף זה, בחרנו לקרוא את ציוני שתי הכיתות בנפרד, מטעמי נוחות למשתמש בתוכנה. 4 פסקל מהצעד הראשון - מהדי 2 הדוגמה הבאה מדגימה קריאת מספר ערכים בפעולה אחת והכנסתס לשלושה מערכים שונים בו-ומנית. ;60 6!קחוטווי! הההזססזוק ז זז 0 ;|₪68 06 [1..10] שפזובּ :0 ;|₪68 06 [1..10] שוב :2 ;68 01 [1..10] צְהזוהּ ו חו9סם 0 10 00 1 =:1 הס חופסם כ הכנס ערכי טמפרטורה ע"פ התבנית: בוקר, צהרים, ערב') חוסטוז/ ;([006661]1 ,[06662]1 ,[006663]1) ה|680 ]יו .0 בשיטה זו אנו מנצליס את העובדה שאורכס של שלושת המערכיס שווה, וקולטיס לתוכס באופן מקביל, נתון אחד לכל מערך. שילוב קבועים בהגדרת המעוך נתבונו בדוגמה הבאה: ;סוחס וחפוטסזום זפ תח 6 ]0 [1..10] לפוה ₪פו | חו9סם 0 10 0 1 =:1 זסן ; ([1] 115%) ח|₪680 0 10 00 1 =:1 הס ;([1] 15% 1) חובסוזו .0 לפנינו תוכנית פשוטה המדגימה חיסרון בולט בניהול המערך. אס נבחן את התוכנית לפרטיה, נמצא שאכן אין בה כל שגיאה או תקלה, אך לא בואת מדובר. ניתן להבחין ממבט ראשון כי יש דבר משותף הן להגדרת המערך, והן לשימוש בו, או הייסריקהי' של איבריו. פרק 8: מערכיס 125 אנו רואיסם כי תחוס המערך נע בין 1 ל-10, וכך גס סריקתו שנעה בין 1 ל-10. נחשוב כעת מה היה עלינו לעשות אס הדרישות היו משתנות. ובמיליס אחרות, מה עלינו לעשות כדי שהגדרת המערך תהיה בין 1 ל-12 או בין 3- ל-8. בתוכנית שבדוגמה היינו צריכיס לשנות שלושה או אפילו שישה ערכיס שוניס ובתוכניות ארוכות יותר - אף עשרות ערכים. שפת פסקל היא שפה מתוחכמת ויש בה כלים כדי להקל עלינו בתחום זה. ניתן לשלב בין ערכים קבועים למבנה הגדרת התוכנית. כיצד נעשה דבר זה! נתבונן בתוכנית שלפנינו: )ו 056 הההזססזוס בי ;6 = %ח6 1150 זה ;1 )0 [0%0ח6 1..1156] ץפוה שפו | חו69ם 0 600 1150 0ף 1 =:1 זס? ;([1] 15% 1) ח|₪680 0 00ח6 1150 0ף 1 =:1 זס? ;([1] 15% 1) ח|₪680 .0 מתוך התוכנית הזו ניתן להביו את הרעיון. הגדרתה כוללת קבוע בשס ח0%ח6 1156, שבעזרתו הגדרנו את התחוס העליון של המערך 115% ל-8, ובסיכום: התחוס הוא 1 עד 8. הרעיון הוא, שכאשר נרצה לשנות את תחוס המערך העליון (או התתחתון, במקרה אחר), כל שעלינו לעשות הוא לשנות את הקבוע ח0%ח6 1150. 6 פסקל מהצעד הראשון - מהדי 2 תרגילים תרגיל 8.1 כתבו תוכנית המגדירה מערך בשס %8|065 שבו 10 תאיס מסוג שלמיס. בשלב הראשון התוכנית מאפסת את כל התאים. בשלב השני היא קולטת מספר סידורי של תא ואת הערך שיש להציב בו. (רמז: יש לבדוק אס המספר הסידורי של התא המבוקש הוא בטווח ההגדרה של המערך). תרגיל 8.2 כתבו תוכנית המגדירה מערך בשס 68ט!8 שבו 5 תאיס שבהם נתוניס מסוג ממשי (|₪68). תפקיד התוכנית לקלוט אל תוך חמשת התאיס ערכיס ממשיים, לחלק את כולסם ב-100, ולהדפיס את תוכנס לאחר החילוק. תרגיל 8.3 כתבו תוכנית הסורקת מערך בשס אעא, שבו 10 תאיס מסוג שלם. תפקיד התוכנית למצוא כמה ערכים במערך גדולים מ-0, כמה קטנים מ-0 וכמה שוויס ל-0. השלב האחרון הוא הדפסת התוצאה. תרגיל 8.4 כתבו תוכנית הקולטת ערך מסויס ובודקת כמה פעמיס הוא נמצא בתוך מערך בו 20 תאיס מסוג שלס. התוכנית תדפיס את מספר האיבריס המכילים את הערך או לחילופין, תדפיס הודעה מתאימה כאשר הערך לא נמצא כלל. תרגיל 8.5 כתבו תוכנית הבודקת אס סכוס הערכיס של התאיס הזוגייס שווה לסכוס הערכים של התאים האי-זוגייס במערך. המערך בנוי מ-10 תאים מסוג שלמים. לכל אחד מן המקריס תודפס הודעה מתאימה. תרגיל 8.6 כתבו תוכנית המגדירה מערך בן 10 תאים. התוכנית מקבלת ערך התחלתי, ועל פיו היא ממלאת את המערך באופן סדרתי עולה. לדוגמה, אס המשתמש הכניס כקלט את המספר יי3'י, תוכן המערך ייראה כך (משמאל): 13 ... 8 ,7 ,6 ,5 ,4 ,3. תרגיל 8.7 כתבו תוכנית הקולטת עשרה ערכים שלמים אל תוך מערך, ומדפיסה את סכומס. פרק 8: מערכיס ‏ 127 תרגיל 8.8 כתבו תוכנית שקולטת עשרה ערכים שלמים אל תוך מערך. לאחר מכן היא מדפיסה את הערכים האלה מסוף המערך לתחילתו, כך שהמספר האחרון שהוכנס יודפס ראשון. תרגיל 8.9 כתבו תוכנית הבודקת אס כל איברי המערך שוויס. התוכנית תדפיס הודעה בהתאסם למסקנות הבדיקה. תרגיל 8.10 כתבו תוכנית הקולטת 10 ערכים שלמים אל תוך מערך. התוכנית תבדוק אס המערך מכיל את כל הערכים מ-1 עד 10, ותדפיס הודעה מתאימה. תרגיל 8.11 כתבו תוכנית הקולטת 10 ערכים שלמיס אל תוך מערך. התוכנית תדפיס את המספר השני בגודלו מבין הערכיס האלה. תרגיל 8.12 כתבו תוכנית הקולטת עשרה ערכים שלמים. תפקיד התוכנית למצוא אס יש ערך החוזר על עצמו יותר מפעס אחת, ולהודיע על כך. תרגיל 8.13 כתבו תוכנית המגדירה שני מערכים בעלי אותו גודל וסוג משתנה ממשי (/₪08). התוכנית ''תחבריי את הערכיס באיבריס מקבילים בשני המערכים (איבר מסי 1 בשני המערכים, איבר מס' 2 בשני המערכים וכך הלאה) ותציג את הסכומים האלה על המסך. ההודעה תציין גם את מספר האיבר. 8 פסקל מהצעד הראשון - מהדי 2 פרק 2 מערכים דו-מימדיים שימושים של מערכים דו-מימדיים בפרק הקודס עסקנו במערכיסם חד-מימדיים. למדנו מהו המערך, כיצד מגדיריס אותו וכיצד משתמשיס בו. נתבונן שוב בדוגמה של הדוור המחלק דואר כאנלוגיה למחשב המטפל באיברי מערך, אך נערוך בה שינוי קטן. במקוס בתיס בודדיס נציב בנייניס, שבהם כידוע ישנס דייריס רביס. למשל, ברחוב יש שישה בנייניס שבכל אחד מהסם ארבעה דיירים. כדי לטפל במקרים מסוג זה צריך להגדיר לכל בניין מערך משלו, שבו כל איבר מייצג דירה אחת. נוכל לכתוב את ההגדרות בצורה זו: זה זס [1..4] לפזובּ :חהּשחום זס [1..4] לפזובּ :2חהץחום זס [1..4] זו :כחהשחום המערך 1ַח88עחו8 מייצג את הבנייו הראשון, המערך 2ח8ץח1ו8 מייצג את הבניין השני וכך הלאה. האיבר [1]1ַחהּץחו8 מיוחס לדירה הראשונה בבניין הראשון, האיבר [1]2ח8ץחו8 מיוחס לדירה השנייה בבניין הראשון וכך הלאה. ובאופן דומה, [3]2ּחּץְחו8 מיוחס לדירה השנייה בבניין השלישי. אנו יכוליס להבחין כי שיטה זו אינה יעילה ואף מקשה על ההבנה. נוסף על כך, אס היינו רוציס למפות עיר שלמה חיינו משקיעיס את רוב המאמצ בהגדרת המערכים. כאן באה לעזרתנו שפת פסקל. השפה מספקת את היכולת לשלב מספר מערכים בתוך מערך אחד. מערך מסוג זה נקרא מערך רב-מימדי, ואופן ההגדרה שלו דומה לאופן ההגדרה של מערך פשוט (חד-מימדי). פרק 9: מערכים דו-מימדייס 129 בתור דוגמה, נגדיר מערך דו-מימדי (בעל שני מימדים) הכולל את כל הבנייניס ודירותיהס גס יחד: זה ?0 [1..4 ,1..6] ץפזובּ :המוחהּץחום התחוס הראשון [1..6] מייצג את מספר הבנייניס, והתחוס השני [1..4] מייצג את מספר הדירות בכל בניין. יש לשיס לב לפסיק המבדיל בין שני התחומיס. כאשר נרצה לפנות לבניין מספר 3, דירה מספר 1 נוכל לכתוב: ; ... =: [3,1]וחוחהשץחום כדי להבין טוב יותר את מבנה הטבלה, נתבונן בטבלה הדו-מימדית הבאה, המייצגת מטריצה : את המטריצה הזו ניתן להגדיר בשפת פסקל באופן הבא : זה ?0 [1..2 ,1..3] ץפזובּ :אוהו בטבלה זו יש שלוש שורות ושתי עמודות. בדוגמת הבנייניס הקודמת יש 6 שורות (שורה לכל בניין) וארבע עמודות (עמודה לכל דירה בבניין). וכיצד נפנה לאיבר כלשהו בטבלה הדו-מימדית הזו: = | זכרו: כדי לפנות לאיבר במערך צריך לציין את מיקומו על פי מספר החשורה ומספר העמודה ('קואורדינטות. לשם תזכורת, במערך חד-מימדי צריך לציין מספר שורה בלבד/ בטבלה א1ו8₪ שבדוגמה, האיבר [2 ,1]או18! הינו התא המסומן ב-א: שורה 1, עמודה 2. כאשר נרצה לפנות לבניין מספר 5, דירה מספר 3 נוכל לכתוב: ; ... =: [3 ,5]וחוח8ץחו 0 פסקל מהצעד הראשון - מהד' 2 דוגמאות אלו התייחסו למערך דו-מימדי, אך שפת פסקל תומכת בהרבה יותר מכך. לדוגמה, אס רוצים למפות שטח בשלושה מימדים (2 ,צ ,%) ניתן להגדיר מערך באופן הבא : זה ;₪68 ז0 [1..10 ,1..10 ,1..10] ץפוה ו למערך וה שלושה מימדים, שכל אחד מהם הוא בן 10 איברים. באותו אופן ניתן להגדיר מערכים גדוליס יותר בני שישה, שבעה מימדים ויותר. פעולות במערך דו-מימדי פעולות במערכיס נעשות באמצעות לולאות, כדי לפשט ולייעל את תהליכי העבודה. ניהול של מערך דו-מימדי, או רב-מימדי, והפעולות (או סריקות) המבוצעות בו, דומיס במידה רבה לאלה שנעשיס במערך חד-מימדי. נבחן כעת תוכנית המתחלת תוכן של מערך אוש בעל שני מימדים, שכל איבריו הס מסוג ממשי. ;633% וחהזוססוס זפ ;|₪68 : חן 41 ]69 0 [0..5 ,1..3] ץפחה | :אושפו חו9סם ;('הכנס ערך לתיחול המערך:') חוסטוזו/ ;(צ) ח|₪680 00 3 0 1 =:ג הס 00 5 00 0 =:8 הס ; =: [₪ ,ה]אושהּו .0 מטריצות בתחוס המחשבים ניתן להגדיר מטריצה כמערך דו-מימדי. לדוגמה, מטריצה %5 היא מערך שבו יש ארבע שורות וחמש עמודות. אס כך, כאשר מדובר במטריצה ריבועית בגודל אאא (מספר השורות שווה למספר העמודות) מגדיריס למעשה מערך דו-מימדי התואס את הגודל שנקבע. לדוגמה, אס מדובר במטריצה ריבועית שבה 3 שורות ו- 3 עמודות. ההגדרה של המערך נראית כך: זה )0 [1..3 ,1..3] פוב :אוה פרק 9: מערכים דו-מימדייס ‏ 131 כעת ננסה לפתור תרגיל עס מטריצה ריבועית: נתונה מטריצה ריבועית בגודל 4א4, ועלינו לבדוק אס היא ריבוע קסם. ריבוע זה הוא מטריצה, שסכוס העמודות שלה שווה לסכוס השורות, ושווה גס לסכוס האלכסונים. ננסה ליצור תהליך, אשר יפשט את התוכנית. תחילה נחשב את סכוס אחת השורות, ונניח כי אה הערך שיש בכל השורות, העמודות והאלכסונים. כעת נבדוק אם אמנס סכומס של כל אלה שווה. כמובן שניתן לעשות זאת בלוגיקה פשוטה של ניפוי: לבדוק שורה ראשונה, שנייה וכך הלאה; ולאחר מכן את העמודה הראשונה, השנייה וכך הלאה; ולבסוף - לבדוק את שני האלכסוניס. תוכנית במבנה מסוג זה תכלול שורות רבות ותהיה מסורבלת. בעיה נוספת תיווצר, אם נרצה בעתיד לשנות את מבנה המטריצה. במקרה וה נאלצ לשכתב את כל התוכנית. לכן עלינו לפנות לפתרון יעיל יותר. אחד הפתרונות הוא הוספה של מערך, שבו נאחסן את כל התשובות. לאחר מילוי המערך, נשתמש בשיטת הסריקה שלמדנו, ונבדוק אס כל הסכומיס מתאימיס. ₪ זכרו: המספרים משמאל למשפטי התוכנית מיועדים עבור ההסבר ג ואינס חלק מהתוכנית. ;6 ו5!ה6וחָב1] ותהזטסזק | (1 זה (2 3( ₪, 8, 5: | ;ח0|68ס :0 (4 ?0 [1..4 ,1..4] פוב :או (5 ]0 [1..10] שפזובּ :ד (6 קטע ראשון + (7 חו69 | (8 ;0 =: וחט5 (9 ;ד =: 06 (10 ;0 =: [4] 1906 00 10 %0 1 =: זסז (12 [ה ,1] או + הטפ =: חט5 00 4 0 1 =: הג זסז (12 ? קטע שני + (13 00 4 סט 1 =:ג וס (14 00 4 00 1 =:8 הס (15 ;1 ,ג] אוחהו + [] ₪ספד =: [ה] שפד (16 2 פסקל מהצעד הראשון - מהדי 2 [ קטע שלישי + (17 0 4 0 1 =:א הס (18 00 4 0 1 =:8 הס (19 ;]ה ,5] אוחהו + [4 + ה] 6ספד =:[4 + ה] 6ספד (20 7 קטע רביעי + (21 0 4 0 1 =:א הס (22 ;1 ,ה] אושפּו] =: [9] 6|פפד (23 ? קטע חמישי + (24 0 4 0 1 =:א הס (25 ;]ה ,4 - 5] אוח18! =: [10] 6ספד (26 27( 0 10 0 1 =: הס (28 ;96 =: 06 חסו) החש5 <> [ה] סוספד זו (29 ? קטע שישי 4 (30 חסו+ שטזד = 06 + (31 (!!! 6זה 50 6וחָב13] 3 15 פוחד') חוססוזו/ (32 33( 56 ;('.6זה 50 6וסברח 3 %סאז') חוססוזו/ (34 35( ננתח את התוכנית, שלב אחר שלב ונעזר במספריס שמשמאל. בחלק הראשון של התוכנית העוסק בהגדרות מגדיריס שלושה משתניס שלמים. שנייס מהם (8 ,א) נועדו לסריקת המערכים, ותפקידו של המשתנה 50 להכיל את הסכוס שנחשב בעמודות, בשורות ובאלכסונים. בשורה 4 מגדירים משתנה בוליאני שישמש בסוף התוכנית כ-יימסמן מצביי. הוא יאמר לנו אס המטריצה היא ריבוע קסם, או לא. מגדירים את המטריצה עצמה בגודל 4א4, ומערך חד-מימדי נוסף שיכיל את כל התשובות. גודלו של מערך זה 10 תאים, מכיון שיש ארבע שורות, ארבע עמודות (ביחד ה שמונה) ושני אלכסונים, ויחד - עשר תשובות. בקטע הראשון של התוכנית (שורות 9 עד 12) אנו מאתחליס את כל המשתנים. בקטע השני (שורות 14 עד 16) מחשבים כל שורה וכותביס את התוצאה בטבלה. תחילה נחשב את סכוס השורה הראשונה (כאשר 1=ה) על ידי סריקה (המשתנה 8 מצביע כל פעס על תא אחר בשורה); לאחר מכן נחשב את סכוס השורה השנייה (כאשר 2=) וכך הלאה. בקטע השלישי של התוכנית מחשביסם את העמודות, החל מהעמודה הראשונה (כאשר 1=, 5 מצביע על כל תא ותא בעמודה), העמודה השנייה (כאשר 2=ג) וכך הלאה. הביטוי [4+ה] אוש8ּ1] אומר שנתחיל למלא את התאים 5 עד 8, מכיון שתאים 1 עד 4 מלאים בסכומיס של השורות. בקטע הרביעי (שורות 23,22 ו-26,25) מחשביס את סכוס האלכסונים, כאשר 1=₪ אנו ניגשיס לתא [1,1], וכאשר 2=ג אנו ניגשים לתא [2,2] וכך הלאה. פרק 9: מערכים דו-מימדיים ‏ 133 הקטע החמישי הוא קטע הבדיקה. כאן אנו סורקיס את כל התאיס במערך = ופד ובוחניס אס כולס שווים. ברירת המחדל היא ריבוע קסם תקין. כלומר, בתחילת התוכנית (שורה 9) הגדרנו את המשתנה א0 כ-6טזד - הנחנו כי הריבוע הוא אכן ריבוע קסס. תפקיד קטע התוכנית הזה לנסות ולהפריך הנחה זו. אס במהלך הסריקה נמצאת שורה, עמודה או אלכסון שאינס תואמיס לסכוס של השאר - המשתנה א0 יעודכן, ויושס בו הערך 856=, שיצביע על העובדה כי מטריצה זו אינה ריבוע קססם. תפקיד החלק האחרון הוא להציג כפלט את תוכנו של משתנה א0%. אס המשתנה מכיל את הערך פטזד, כלומר הריבוע הוא ריבוע קסס - תודפס הודעה מתאימה לכך, ואם לא - תודפס הודעה אחרת. קבועים ומערכים רב-מימדיים בפרק הקודם, כאשר דנו במערכיס פשוטים בעלי מימד אחד, הגדרנו כיצד משלבים את הגדרת המערך עס השמה של ערכים קבועיס. באותו אופן ניתן להגדיר גס מערכיס רב-מימדיים. נתבונן בדוגמה הבאה: )ו 056 הההזססזוס וב ;1 = ץוחו ןאוס | (5 = 1חחו | 6 = שוחו | = 3 ווח | זה ץפוה :ד , ברחו 1. .)ורחו !וס 1] ,2זורחו ]. .ץורח !וס | ;₪68 ]0 [3אח ]..)ורחו !וס | חו9סם 6. בדוגמה וו הגדרנו מערך בעל שלושה מימדיס: המימד הראשון מוגדר בתחוס אחו]!שס 1 עד 1שוחו! (1 עד 5); המימד השני מוגדר בתחוס +וחו ]10 עד 2אוחו | (1 עד 6); והמימד השלישי מוגדר בתחוס !]שש ] עד ₪3וחח1] (1 עד 4). כעת נפתור תרגיל המשלב בהגדרת המערך ערכים קבועים. 4 פסקל מהצעד הראשון - מהדי 2 כתבו תוכנית שבה יש מערך בגודל 8אא, כלומר א שורות (א הוא קבוע המוגדר בתחילת התוכנית) שבכל אחת מהן שמונה איבריס מסוג בוליאני. ערך 6טזוד מייצג 'י1'', וערך 8156" מייצג ייסיי. תפקיד התוכנית להמיר כל שורה למחרוזת, ולהציגה על המסך. ;006 וההזפסזק | (1 %ס | (2 ;5 = א (3 זא (5 6( 61: 687; חן 2 (7 ;ו טשפ (8 ;ח00!68סם )0 [1..8 ,..1] ץפחה | :6|ספד (9 חו69ם (11 00 א 60 1 =:ג הס (12 חו0סם (13 14( 5% := "; סס 8 0 1 =:8 הס (15 חו0סם (16 חסו שטזד = [5 ,ה] שוסבּד זו (17 '1' =: 6 (18 19( 6 20( 6 := '0% ;ח6 + 50 =: 5% (21 ;0 (22 ;50 - ' ,ג ,"3 .סא') חוססח/ (23 ;0 (24 25( 0. ננתח את התוכנית ונלמד כיצד היא פועלת : ההגדרות: בראש התוכנית ניצבת הגדרת הקבוע א. בחרנו במקרה את המספר 5. בתחוס הגדרת המשתניס הגדרנו שני משתניס מסוג שלמים (4 ו-8) לצורך סריקת המערך. בנוסף, הגדרנו משתנה מסוג תו לפישוט התוכנית, ואת תפקידו נביו במהלכה. המשתנה ‏ 5% מסוג מחרוזת הוגדר לצורך השמת הערכיס המומרים, וגם את תפקידו נבין במהלך התוכנית. ולבסוף, הגדרנו מערך שיש בו א שורות (במקרה שלפנינו 5 שורות) ושמונה איבריס בכל שורה. פרק 9: מערכים דו-מימדייס 135 גוף התוכנית: תפקיד הלולאה שבשורה 12 יילהצביעיי כל פעס על השורה שאנו סורקים, ואילו תפקיד הלולאה שבשורה 15 להצביע כל פעם על איבר אחר בשורה. פקודת ההתניה בשורה 17 בודקת מה תוכנו של התא הנוכחי, ובהתאס לכך מציבה ''1' או יי0יי במשתנה ח6. תוויס אלה מייצגיס את הערכיס פטזד ו-8|56= בהתאמה. לאחר ההמרה, התו מוסף למשתנה המחרוזת, כך שבסופה של הלולאה הפנימית, המשתנה 5% מכיל מחרוזת בעלת שמונה תווים. שורה 23 משמשת לפלט - הצגת מספר השורה והערך שהיא מייצגת. תרגילים תרגיל 9.1 כתבו תוכנית הכוללת מערך דו-מימדי בגודל 4א4, שבו האיברים מסוג בוליאני. התוכנית מקבלת כקלט ערכים מסוג שלם עבור כל איבר. אם הערך המוכנס הוא 'י0יי, יוצב באיבר המתאיסם "55 |='י ואם לא, יוצב בו י=(חדיי. בסיוס הקליטה תדפיס התוכנית את תוכן התאיס באופן הבא: אס האיבר הכיל 55 |ה='י יודפס 'יסיי, ואם הוא הכיל י₪=(וחדיי יודפס ''1'י. יש להדפיס את המערך בצורת מטריצה ריבועית (באותו אופן שעורכיס את לוח הכפל). תרגיל 9.2 כתבו תוכנית הכוללת מערך דו-מימדי בגודל 4 שורות ו-3 עמודות, שאיבריו הס שלמים. התוכנית קולטת נתוניסם לכל התאים ומדפיסה סכוס של כל שורה, וסכוס של כל עמודה. יש להוסיף הודעה ברורה על מהות המספר שמודפס. תרגיל 9.3 נתון מערך בגודל 5א5. כתבו תוכנית הממירה מערך זה למערך חד-מימדי בגודל 5 איבריס (תאים). כל התאיס הס מסוג ממשי. 6 פסקל מהצעד הראשון - מהדי 2 תרגיל 9.4 כתבו תוכנית הקולטת מחרוזת של אותיות ומספרים. התוכנית תסרוק את המחרוזת ותמצא כמה פעמים מופיע בה כל תו. לדוגמה, אס המחרוזת הנקלטת נראית כך: 2222 פלט התוכנית יהיה: 2ַ - 2 1 ק 3 - 2 1 . | 1 - / תרגיל 9.5 כתבו תוכנית הקולטת ארבע מחרוזות שבכל אחת מהן עד חמישה תוויס. התוכנית תקטע במידת הצורך את התוויס המיותריס ותבצע המרה לכל מחרוזת, כדי שהמחרוזת הראשונה תוצב בשורה הראשונה במערך, המחרוזת השנייה תוצב בשורה השנייה וכך הלאה. המערך הוא דו-מימדי בגודל 5א4, וכל איבריו הס מסוג תו. תרגיל 9.6 נתון מערך שבו ארבעיס איבריס מסוג תו. כתבו תוכנית הסורקת את המערך ומעתיקה אל מערך חדש את התווים, באופן שאף תו לא יחזור על עצמו יותר מפעס אחת. תרגיל 9.7 נתון מערך בן עשרה איברים, שכל איבר בו הוא מסוג מחרוזת. באחת המחרוזות נמצאת המילה 'יד5148'י ובאחרת (באיבר ייגבוהיי יותר) - המילה ייס0זפיי. כתבו תוכנית הסורקת את המערך, וכאשר היא נתקלת במילה יידח יי היא מתחילה להדפיס את כל המחרוזות באיבריס הבאים, עד אשר היא מוצאת את המללה ייקס 51'י. פרק 9: מערכים דו-מימדיים 137 תרגיל 9.8 נתון מערך דו-מימדי בגודל 10א10 שכל ערכיו בתחוס 1 עד 10. כתבו תוכנית הסורקת את המערך ומוצאת היכן נמצא הרצף הגדול ביותר של תוויס זהים. הסריקה תיעשה הן לגבי שורות והן לגבי עמודות. לדוגמה, נתון מערך בגודל 5 ובו הנתוניס הבאיס: 2 2 4 5 6 1 3 1 1 4 1 9 9 9 3 4 5 2 פלט התוכנית יהיה: מיקום: עמודה 4, החל משורה 2. המספר: 7, מופיע 3 פעמים. 8 פסקל מהצעד הראשון - מהדי 2 פרק 10 חיפוש תהליכי חיפוש בפרק זה נדון באחד המרכיביס החשובים של ניהול נתוניס - החיפוש. חיפוש הינו סריקה של מערך נתונים כדי למצוא בו ערך כלשהו על פי קריטריון. למראית עין אין אנו צופיס בעיות בתחוס זה, אך אס נחקור לעומק, נמצא כי יש כאן מלכוד. המלכוד הוא, שככל שננהל טבלאות או קבצים גדולים יותר, כן ירבה הזמן אותו י'יבוּבו'י המחשב כדי למצוא נתון מסויס. לכן, בפרק זה ננסה להציג דרכיס שמטרתן למצוא את הנתון המבוקש בזמן הקצר ביותר. בפרק זה נלמד על שני תהליכי חיפוש: הראשון הוא חיפוש סדותי, שהוא הנפוצ ביותר, מכיון שהוא הפשוט ביותר. תהליך החיפוש השני הוא שיטת החיפוש הבינארי. שיטה זו מורכבת וגס מהירה יותר. בשני תהליכי חיפוש אלה ראוי לשים לב לתפקיד החשוב של המערך. חיפוש סדרתי יתרונות החיפוש הסדרתי הס הפשטות, והעובדה שהוא מתאיס לכל מבני הנתונים. כדי להבין במה מדובר, נתבונן בקטע התוכנית הבא, שבו ע6א הוא הערך שאנו מחפשיס בטבלה. כאשר מוצאיס את הערך בטבלה, מעביריס למשתנה חסטופסק את מיקומו. ;1- =: חסטופסק 0 526 0 1 =:1 זס1 1 =: חסחופסק חסוש [3!6]1ד = 66 זו פרק 10: חיפוש ‏ 139 קטע תוכנית זה מדגיס את הרמה הנמוכה והפשוטה ביותר של תהליך החיפוש הסדרתי. תחילה אנו מציביס במשתנה השלס חסטופסק את הערך 1-, ומאוחר יותר נבין למה. כעת נסרוק את המערך בעזרת המשתנה 1. הלולאה זס+ יימניעה'י את המשתנה 1 בין הערכיס 1 ו-5026 (קבוע שהוגדר בתחילת התוכנית). כעת נעבור לתהליך הבדיקה: בעזרת המשתנה ש6א המשמש אותנו ייכמפתח סריקהיי, שהוא הערך שאנו מחפשים, סורקים את המערך 30/6ד איבר אחר איבר. כאשר נמצא את מבוקשנו, המשתנה חסטופסק יקבל את מספר האיבר שבו נמצא הערך המבוקש. כעת אנו יכוליס להבין מדוע תיחלנו את המשתנה חסטופסץ לערך 1-. אס לא נמצא את הערך הרצוי, משתנה וה יישאר ללא שינוי (1-), ויסמן כי הערך שחיפשנו אינו נמצא במערך. זו היתה השיטה הפשוטה ביותר לחיפוש סדרתי. אס נשיס לב, נבחין כי שיטה זו איטית מאוד. הבעיה נובעת מהעובדה שגס לאחר שהערך שאנו מתחפשיס נמצא, הלולאה ממשיכה לרוצ וכך היא מבזבות ומן יקר (יש לכך משמעות במערכים גדולים וכאשר מבצעים את החיפוש פעמים רבות!) לדוגמה, אס סורקיס מערך בין מאה תאים, והערך שאנו מחפשיס נמצא באיבר השלישי, הלולאה תמשיך לרוצ עד סופה למרות שמצאנו את מבוקשנו. לכן, נייעל את התהליך בצורה הבאה: ;1- =: חסטופסק 1:= ;(?) 106 00 (ע6א <> [30/6]1 ד) סח (26ו5 => 1) 6|וח/צ 1 =: חסטופסק ח6ו% 526 => 1 + ננתח את משמעות הפקודות. בשתי השורות הראשונות תיחלנו את המשתניס חסטופסק ו-1. בשורה השלישית יצרנו לולאה שפועלת אך ורק אס שני התנאיס הבאים מתקיימים: > המשתנה 1, המשמש אותנו כאינדקס, חייב להיות קטן מ-26ו5 (גודלו של המערך). כאשר 1 יגיע לגודל זה, ניתן יהיה לומר כי כל המערך נסרק. > התנאי השני להמשך פעילות הלולאה הוא שהתא הנוכחי שנבדק אינו הערך שאנו מחפשיס. במילים אחרות ניתן לומר, כי הלולאה תמשיך להתבצע כל עוד לא מצאנו את הערך שאנו מחפשיס. היא עושה ואת על ידי העלאת ערך האינדקס 1 כדי שיוכל להצביע על האיבר הבא במערך, והשוואה של האיבר התורן במערך אל הערך המבוקש. 0 פסקל מהצעד הראשון - מהדי 2 חיפוש בינארי כדי להעריך את יעילות שיטת החיפוש הסדרתי, נתבונן בשני מקרים: במקרה הראשון, הערך שאנו מחפשיס נמצא באיבר הראשון, ואז הלולאה תתבצע פעס אחת בלבד. במקרה השני הערך שמחפשים נמצא באיבר האחרון במערך. במקרה זה, כאשר סורקים מערך שיש בו א איברים, הלולאה תתבצע עד מקסימוס א פעמיס. ללא מידע מוקדס על הערכיס שבמערך ועל סדר הופעתם, ניתן יהיה לומר כי הממוצע של פעולות החיפוש הוא 2 / (1 + א). לדוגמה, אם גודל (א) המערך הוא מאה בתים, מבחינה סטטיסטית נאלצ לסרוק חמישיס תאיסם. מספר זה נחשב לקטן מאוד כאשר מדובר במחשב, אך מה יקרה כאשר יהיה נתון מערך בן 40,000 איבריס, שנסרק כ-1000 פעמיםס בתוכנית! למצב כזה נדרשת שיטה טובה יותר. שיטת החיפוש הבינארי מאפשרת להשיג יעילות רבה יותר בתהליכי חיפוש. בשיטה זו אנו מתבססים על העובדה שמערך הנתונים שלנו ממוין. והו חסרונה הגדול של שיטה זו, אשר מחייב מיון מוקדס, או אחזקת איברי המערך בצורה ממוינת. עס זאת, יש יתרון במהירות החיפוש ביחס לשיטות חיפוש אחרות. כדי להבין את שיטת החיפוש הבינארי נתבונן בדוגמה הבאה: נניח שאנו מחפשיס את המספר 37, שנמצא באיבר השמיני במערך. ניגש תחילה לאיבר האמצעי, מספר 6 (קל לנו לעשות ואת כאשר מספר האיברים אי-זוגי). נשווה את הערך שבאיבר 6 אל הערך המבוקש 37. מכיון ש-37 יותר גדול, עלינו לחפש אותו בחלק השני, העליון, כי הערכיםס ממויניס בסדר עולה (זהו תנאי מוקדס להפעלת שיטת חיפוש זו). נשתמש שוב באותה השיטה, ניגש לאיבר האמצעי שבין איבר מספר 6 לאיבר מספר 11. זהו תא 9 (על ידי חישוב פשוט ניתן למצוא, אותו כי 6+11(/2=8.5), ונעגל את התוצאה כלפי מעלה). כעת אנו משוויס את הערך המבוקש 37 אל הערך 45 שנמצא באיבר 9. מכיון ש-45 גדול יותר מ-37, אנו צריכים ילרדת'י לכיוון תחילת המערך. פרק 10: חיפוש ‏ 141 עכשיו, ניגש לתא שנמצא בין המיקוס הנוכתחי לבין אמצע המערך, זהו תא 8. ואכן, בתא וה ישנו הערך שחיפשנו. אם נשווה שיטה וו אל שיטת החיפוש הסדרתי נמצא כי כאן היה עלינו לבצע שלוש השוואות, ואילו בשיטה הראשונה היה עלינו לבצע שמונה השוואות (בממוצע - 6). איך פועלת שיטת החיפוש הבינארי (אנו מכיריסם אותה בשם יישיטה לתפיסת אריה במדברי...): לפי שיטה זו לוקחיסם את טווח איברי המערך, מחלקים אותו לשניים, ומשוויס את האיבר האמצעי לערך שמתפשים. מכיון שהמערך ממוין (לדוגמה, בסדר עולה) נוכל לדעת על פי הערך שבאיבר האמצעי אס הערך שאנו מחפשיס נמצא בחצי העליון או בחצי התחתון של המערך. לאחר שמצאנו באיוה משני חצאי המערך נמצא הערך המבוקש, אנו משתמשיס שוב באותה שיטה, וחוציס שוב את הטווח החדש (במקרה זה, חציו של המערך) לשניים. כך מתמשך התהליך עד אשר אנו מוצאיס את הערך המבוקש, או לחילופין - אין אנו יכוליס לחצות שוב את הקטע לשניים, והערך המבוקש לא נמצא. משניתחנו את השיטה, נוכל לכתוב את התוכנית שמבצעת את החיפוש: ;הזה החום והבזססזק (1 2( 0% 3( 5126 = 4( זא (5 :ש6א ₪1 (6 1 0% [1..526] ץפוה :ד (?7 (8 חו69ם (9 1 =: א (10 12( 12( ]:=:1; 6 =:ה (13 14(( 8% ;2 עו (₪ + 6 =: 1 (15 1 =: 1 חסר% ש6א > [6]1וטבּד +ו (16 1 =: ₪ חסר% ש6א < [1]פוספד זו (17 ;(ח = 1) זס (שא = [6]1סבּד) וסחט (18 .60 (19 2 פסקל מהצעד הראשון - מהדי 2 ננתח את מהלך התוכנית : תחילה אנו מגדיריס בשורה 2 את 526 המייצג את גודל המערך. בשורה 6 מגדיריס ארבעה משתנים: 1 המייצג את הגבול התחתון של הקטע הנבדק, ₪ המייצג את הגבול העליון של הקטע הנבדק, 1 שישמש כאינדקס, ו-צ6א המייצג את הערך שמתפשים. נשתמש במערך 6!פ8ד לצורכי הדגמה. בשורות 12 ו-13 אנו מאתחליס את המשתנים 1 ו-3, שיצביעו על תחילת המערך ועל סופו. כעת אנו פותחיס בלולאה (שורה 14) אשר תסתיים כאשר נמצא את הערך הרצוי, או שתהליך הסריקה יסתיים ללא מציאת הערך המבוקש (שורה 8). בשורה 15 אנו מחשביס את המספר הסידורי של האיבר האמצעי בקטע המערך שאנו נמצאיס בו (בתחילה זהו כל הטווח). בשורות 16 ו-17 אנו בודקיס אס צריך לפנות לחצי העליון או התחתון שלו. כך חוזר התהליך עד אשר נמצא את הערך המבוקש, או עד אשר קטע המערך שבו אנו מחפשים יתקצר לאיבר בודד (התחוס העליון יהיה שווה לתחוס התחתון = )). יישוס של תהליכי חיפוש כל אשר למדנו בפרק זה הוא שיטות לחיפוש. אך עדיין לא למדנו מהו השימוש שנעשה בהן. חיפוש במערך מיועד להשיג מידע רצוי כלשהו. לרוב, קריטריון או תנאי החיפוש מורכב ממספר תנאים, כפי שנראה בהמשך. חיפוש זה הינו חיפוש על פי חתך. לדוגמה, נוכל לומר למחשב להציג את כל שמות האנשיס העובדיס במפעל מסוים שגילם מעל 30, ושנות הוותק שלהס בעבודה לפחות 5. זהו הקריטריון, או חתך של חיפוש. הקריטריון שהצגנו מכיל שני תנאיסם: התנאי הראשון הוא שכל האנשים שיוצגו ברשימה יהיו מעל גיל שלושיסם, והתנאי השני הוא שלכל אחד מהס יהיה לפחות ותק של חמש שנים. כיצד עושים ואתז פרק 10: חיפוש 143 נתבונו בדוגמה הבאה: ;15065 1 וחהיוטסום ב 0 = 6466אזס/ ;ו :הא קוו :0 וו :0 ו זה זז 6 66זסאזס/\ זס [1..100] פוב | חו9סם 0 סט 1 =:1 זס? חופסם חסוז (5 =< א1150]1[./606) חב (30 < 15011[.06 |) + חו60ם ; (6חהא.[15%]1 1 ,' :סרתהּאז') הוססחו\ ; (1150]1[.06 ,' :06 חוססוז ;(150]1[./6066 ]1 ,' :א6ס6/') חוססוו 0 יו .0 בתוכנית זו הגדרנו רשומה בשס ₪66ז6אזס)\ המכילה את פרטי העובד: שם, גיל, ותק. הגדרנו משתנה שלם ) אשר ישמש לסריקת המערך 115% הכולל עד מאה נתוני עובדיסם. כעת אנו מתחיליס בסריקה (הלולאה זס)). בשורת ההתניה ... חסחץ ... + אנו שואליס שתי שאלות: ייהאם גיל העובד גדול מ-30'' ו-'"יהאם ותק העובד לפחות 5 שניסיי. אס התשובה לשתי שאלות אלו היא חיובית (ייכן") - נוכל להדפיס את פרטי העובד. שיטת החיפוש הבינארי אינה מתאימה במקרה זה בגלל סדר הנתונים. 4 פסקל מהצעד הראשון - מהדי 2 תרגילים תרגיל 10.1 כתבו תוכנית הקולטת עשר מחרוזות לתוך מערך, ולאחר מכן מחפשת בהן את המחרוזת 'יאס'י. אם המחרוזת נמצאה, התוכנית תדפיס את ההודעה 'יאס', ואס לא, היא תדפיס את ההודעה יס דסאי'י. תרגיל 10.2 כתבו קטע תוכנית המבצע את החיפוש שבתרגיל 10.1 בעזרת הלולאה ... | סח ... ]6068. תרגיל 10.3 כתבו תוכנית המגדירה מערך ובו תשעה איבריס מסוג שלס. המערך מכיל את הנתוניס הבאיס כשהס ממויניס: 6 ,24 ,22 ,18 ,17 ,11 ,9 ,6 ,1 על התוכנית לחפש את הערך 22 בשתי הדרכיס שלמדנו. התוכנית צריכה גם למנות את מספר הצעדים שנדרשו לה בכל שיטה כדי למצוא את הערך המבוקש. את תוצאות הבדיקה יש להדפיס בסיוס ההרצה. תרגיל 10.4 כתבו תוכנית המגדירה רשומה בשס 5₪060% המכילה את שם התלמיד (מחרוזת עד 20 תווים), וממוצע הציוניס שלו (משתנה ממשי). התוכנית תגדיר שני מערכיס מסוג הרשומה 50₪00676, בני עשריס איבריס כל אחד. תפקיד התוכנית לואהות את כל התלמידיס (במערך הראשון) אשר ממוצע ציוניהס גדול מ-80 ולהעתיקס למערך השני. פרק 10: חיפוש 145 פדק 11 מיון ומיזוג מערכים מיון מערכים הקדמה בפרקיס קודמיס למדנו על אופן הגדרת מערכיס והדרכיס לניהולס. גורס חשוב מאוד בתחוס זה שעדיין לא נלמד הוא המיון. המיון הוא דרך לסדר נתוניס במערך. לדוגמה, אס רוציס למיין קבוצת מספרים במערך, עלינו לסדר אותס לפי סדר מספרי. כאשר רוצים למיין שמות, אנו רוציס לסדר אותם לפי סדר אלפביתי. סדר ה יכול להיות עולה (9ח61ח566), מ-0 עד 9 במיון מספרים, או מ-א (8) עד ת (2); והוא יכול להיות בסדר יורד (9ח01ח66566), מ-9 עד 0 במיון מספרים או מ-ת (2) עד א (8) במיון אלפביתי. נסכם את מושגי היסוד בתחום זה: = מיון - ארגון נתוניס על פי סדר מסוים. > מפתח מיון - גורס המגדיר על פי אילו קריטריונים יש לבצע מיון. לדוגמה, מיון של קבוצת נתוניס נעשה על פי התו האחרון שלהס בלבד. = מיון עולה - סידור נתוניס, כך שהערך הקטן ביותר מופיע בראש הרשימה והגבוה יותר - בסופה. כלומר, סדר הנתוניס הוא מן הנמוך לגבוה. > מיון יורד - מיון נתוניס, כך שהערך הגדול ביותר יהיה בראש הרשימה, והערך הקטן ביותר יחיה בסופה. מיון שכניס שיטת מיון שכנים היא שיטה שמשמשת אותנו גס בתהליכים יומיומיים, על אף שאיןו אנו מבחיניס בכך. תהליך המיון פשוט למדי: מתחילים באיבר הראשון ומשוויס אותו אל האיבריס שאחריו במערך. אס מוצאים איבר שקטן ממנו, פרק 11: מיון ומיווג מערכיס 147 מחליפים ביניהס. כשמגיעיס לאיבר האחרון מקבליס בראש המערך את האיבר שערכו הקטן ביותר. אחר כך משוויס את האיבר השני במערך אל כל שאר האיבריס שאחריו (חוץ מהאיבר הראשון, שכבר עבר את תהליך המיון). אס נמצא איבר קטן ממנו, מחליפים ביניהם. בסופו של שלב זה יהיה באיבר השני ערך שגדול מערך האיבר הראשון, אך קטן מכל שאר הערכים. כך נמשך תהליך המיון, ובכל פעס משוויס איבר אחד אל שאר האיבריס שעדיין לא עברו את תהליך המיון. בסיוס מקבליס מערך שאיבריו ממויניס. שיס לב שקבענו סדר מיון עולה. בסדר מיון יורד, יש שוני קטן וחשוב. התוכל לומר מהו? נתבונן בדוגמת התוכנית כדי להבין את התהליך: ;1 ההחהזססזוק (1 זה (2 ;לח :קת6ד,8 ,3 (3 ;1 זס [1..8] ץפוה :ד (4 (5 חו69ם (6 0 7 0 1 =:ג הס (7 0 8 00 1 + א =:8 זסן (8 חסרש [ה]6!ס3ד > [8]פוספד זו (9 חו60ם (10 ;[ה]6!ט3ד =: קוחסד (12 ;]3 =: [מ]6ו30ד (12 ;קוחד =: [6]8ופפד (13 ,0 (14 15( 0. ננתח את התוכנית: בשורה 3 אנו מגדיריס שני משתניס (8 ,4) לצורך סריקת המערך, ומשתנה עזר (קוחסד) שיאפשר להחליף שני איברים. נחזור עתה אל תהליך המיון. אמרנו, כי משוויס את האיבר הראשון לכל שאר האיברים. אס נתבונן בשורות 7 ו-8 כאשר 1>ג, נראה כי 8 נע בין 2 ל-8. כעת יש לנו שני משתניס, אשר אחד מהס מצביע על האיבר ראשון, והשני מצביע בתור על שאר האיבריס. בסיוס הלולאה השנייה (שורה 8 עד 14) המשתנה 4 מתקדם לערך הבא - 2, וכל הלולאה חוזרת על עצמה שוב, עד אשר ₪ מגיע לאיבר שלפני האחרון. אנו יכוליס לשאול את עצמנו, מדוע אין 8 מגיע עד האיבר האחרון? התשובה פשוטה - חיסכון בזמן הפעולה של המחשב. אם ג יגיע לתא האחרון נשווה אותו אל עצמו, והתוצאה תהיה שוויון, כי מדובר באותו איבר. כך גס לגבי המשתנה 8, הוא אינו מצביע על התא שהמשתנה ₪ מצביע עליו. 8 פסקל מהצעד הראשון - מהדי 2 מיוןו וה נקרא מיון שכנים, מפני שכל פעס נערכת השוואה בין שני איבריס שכניס שוניס. מיון בועות אחת השיטות הנפוצות למיון נתוניס היא מיון בועות. כדי להדגים שיטה זו נאמר כי יש לנו מערך חד-מימדי בשס א ובו שמונה איבריס מסוג שלס. המערך מכיל את הערכיס הבאים (קרא משמאל לימין): 25, 57, 48, 37, 12, 92, 86, 3 השיטה עליה מתבסס תהליך מיון בועות: כל פעם משווים שני תאים צמודיס זה לזה. אם התא הראשון מבין השנייס גדול יותר - מחליפיס ביניהס. לדוגמה: [1]א עם [2]א (25 עם 57) - אין החלפה. [2]א עם [3]א (57 עם 48) - יש החלפה. מעתה [3]א יהיה 57 ו-[2]א יהיה 48. [3]א עם [4]א (57 עם 37) - יש החלפה. מעתה [4]א יהיה 57 ו-[3]א יהיה 37. [4]א עם [5]א (57 עם 12) - יש החלפה. מעתה [5]א יהיה 57 ו-[4]א יהיה 12. [5]א עם [6]א (57 עם 92) - אין החלפה. [6]א עם [7]א (92 עם 86) - יש החלפה. מעתה [7]א יהיה 92 ו-[6]א יהיה 86. [7א עם [8]א (92 עם 33) - יש החלפה. מעתה [8]א יהיה 92 ו-[7]א יהיה 33. כעת אנו רואיס שבתא האחרון [8]א ישנו הערך הגדול ביותר - 92. כדי למיין את כל שאר איברי המערך אנו צריכיס לחזור על הפעולה הזו עוד שבע פעמיס מבחינה תיאורטית. לפני שניגש לכתיבת תוכנית המדגימה מיון וה, נתעכב על נקודה מסוימת. ראינו כי לאחר המיון הראשון, נמצא בתא האחרון הערך הגדול ביותר. אס נמיין פעס נוספת, נראה שבתא שלפני האחרון נמצא הערך השני בגודלו במערך וכך הלאה. ניתן לנצל עובדה וו כדי לחסוך בזמן המיון, ולאחר כל שלב מיון להפחית מכמות התאים שייייכנסויי לשלב המיון הבא. נתבונן בנקודה נוספת: אס לאחר סריקה של המערך לא התבצעו החלפות, ניתן לומר כי כל הערכים כבר ממוינים לפי הסדר, ולא יהיה צורך להמשיך ולסרוק את המערך. הו למעשה סיוס המיון. פרק 11: מיון ומיווג מערכיסם ‏ 149 התוכנית הבאה מדגימה מיון בועות: ;+ ספסוסטם ההזטסזוס זה 50: 006; זז :קוחד ,8 ,3 ;]הז זס [1..8] שְפזובּ :ד חו60ס 2 := 1 ;ד =: הססוא5 0 (6טזד = חסוושו5) סחה (8 > ג) סווחעש חופסם ;6 =: הססוו5 0 8-4 0 1 =:5 הס חח [ם]6!ס3ד > [1 + 8]פוספּד זו חו60ם ;ד =: קוחסך ;1 + 6]8!טב3ד =: [6]8וס3ד ;קסד =: [1 + 6]8סהד ;ד =: הסזו5 ,0 ;1 + 4 =: ה 7 .0 זכרו: מיון זה נקרא מיון בועות, מכיון שבמהלכו המספרים הקטנים שיהקלים ‏ *מבעבעיםיי כלפי מעלה, עד שהסם תופסים את מקומם הסופי, לפי סדר המיון. יתרונות וחסרונות ניתן לראות כי למיון בועות יש יתרון רב על פני מיון שכניס, בכך שניתן לחסוך בו בזמן הפעולה של המחשב. החיסרון, שאינו ברור למראית עין, הוא שבמקריס מסוימיס קשה ליישם אותו. כאשר כותביס תוכנית, חייבים לבחור בשיטת המיון הטובה יותר והמתאימה לנתונים, מיון שכניס או מיון בועות. יש שיטות מיון נוספות שלא נעסוק בהן כאן. 0 פסקל מהצעד הראשון - מהדי 2 מיזוג מערכים מיזוג מערכים אינה שיטת מיון נוספת, אלא ניצול התכונות של מערכיס שכבר ממויניס. נניח לדוגמה, כי נתוניסם שני מערכיס המכילים שמות ממויניסם של תלמידי שתי כיתות שונות. לצורך כלשהו, למשל להכנת רשימת תלמידים לטיול, רוציס להשתמש ברשימה אחת שתכלול את שמות התלמידים משתי הכיתות. השיטה הפשוטה והנראית לעין היא ילחבריי את שני המערכיס ולאחר מכן למיין אותס. במקרה שלפנינו ודומיס לו, אין דרישה ליעילות, ולכן נוכל לבחור גס בדרך זו שאינה הטובה ביותר. במהלכי עיבוד שוניס במחשב, שחוזריס על עצמס פעמים רבות, יש צורך לבצע פעולות מסוג זה ביעילות ולנצל את העובדה שהמערכיס הנתוניס כבר ממוינים. על כן, לא יינחבריי את המערכים ונמיין אותס כיחידה אחת, אלא נמזג את המערכים הממוינים. נוכל לחסוך ומן מחשב בשיטה זו כפי שנראה בהמשך. בהנחה שלפנינו רצפי נתוניס (מערכים) ממוינים, נוכל לפעול בשיטת מיזוג מערכים. תהליך זה יימחבריי שני מערכיס תוך ניצול העובדה שהנתונים בכל מערך כבר עברו תהליכי מיון. מיזוג מערכים אפשרי במערכים חד-מימדיים בלבד. תהליך מיזוג מערכים תהליך המיזוג פשוט ומהיר, כפי שנראה בדוגמה הבאה: ;0חוסזסוי] הההזפסזוק | (1 זט (2 חן : 1וססחוסק (3 חן :סק (4 חן :סק (5 ;1 ז0 [1..5] ץפוה וכויחוו (6 ;1 0 [1..6] ץפוה :ד (?7 )0 [1..11] ץפוה :ד (8 (9 חו9סם (10 ;1 =: 1זססחוסק (12 ;1 =: 2זס%חוסק (12 ;1 =: 3זס%חוסק (13 14( פרק 11: מיון ומיווג מערכיס ‏ 151 ו (15 הסח [2ז6זחוסק ]30162 ד => [1זססחוסק ]61וספד זו (16 חופסם (17 ;[1 סק 3!61ד =: [3זספחוסק ]63ו3ד (18 ;1 + 1זססחוסק =: 1זססחוסק (19 0ס (20 21( 56 חופסם (22 ;סק ]62| ד =: [3זספחוסק [63ו3ד (23 ;1 + 2זססחוסק =: 2זססחוסק (24 יו (25 ;1 + 3זססחוסק =: 3זססחוסק (26 ((6 < 2זססחוסק) ‏ זס (5 < 1זססחוסק) |וטחט (27 28( חסו 5 > 1זסשחוסק *ו (29 0 5 => 1זסשחוסק 6!וח/ו (30 חופסם (31 ;11 סק 3!61ד =: [3זספחוסק []63ו3ד (32 ;1 + 1זססחוסק =: 1זסזחוסק (33 ;1 + 3זססחוסק =: 3זססחוסק (34 35( 60 36( 56 0 6 => 2זסשחוסק 6!וח/ו (37 חופסם (38 ;סק ]62| ד =: [3זספחוסק []63ו3ד (39 ;1 + 2זססחוסק =: 2זסזחוסק (40 ;1 + 3זססחוסק =: 3זססחוסק (41 42( 0, 43( 6. ניתוח התוכנית: בחלק ההגדרה של התוכנית הגדרנו שלושה מערכים: הראשון בן חמישה איבריס, השני בין שישה איבריס והאחרון בן אחד-עשר איבריס, הוא מערך התוצאה שיוכל להכיל את שני המערכיס הראשונים. בנוסף, הגדרנו שלושה מצביעים, אחד לכל מערך. ידוע לנו כי המערכים המקוריים ממוינים. לכן, כל אשר עלינו לעשות הוא להעתיק תא אחר תא לתוך מערך היעד (13!63) תוך שמירה על סדר המיון. הדרך הפשוטה ביותר לעשות ואת היא לבדוק בכל פעס באיזה מערך נמצא הערך הקטן ביותר, ולהעתיקו למערך היעד. 2 פסקל מהצעד הראשון - מהדי 2 ניגש כעת לתהליך המיזוג עצמו: בשורה 16 בודקיס איוה משני הערכיס קטן יותר, וה שנמצא באיבר הראשון במערך הראשון, או וה שבאיבר הראשון במערך השני. את הקטן מבין שניהס מעתיקיס לאיבר הראשון במערך השלישי. כעת מעדכנים את המצביעים. אס העתקנו את הערך מהמערך הראשון, אנו מעדכניס את המצביע שלו, כדי שנוכל לבצע אותה פעולה על הערך הבא במערך. אס העתקנו את הערך מהמערך השני - נעדכן את המצביע שלו, ולא את המצביע של המערך הראשון. את המצביע של המערך השלישי אנו מגדילים ב-1 כדי שיצביע על המקוס הבא במערך. הלולאה שתחילתה בשורה 15 וסופה בשורה 27 מתנהלת עד אשר אחד המערכיס הועתק במלואו למערך היעד. כעת, כל שנשאר לנו לעשות הוא להעתיק אל מערך היעד את שאר התאיסם מהמערך שלא ייהתרוקני'י. העדה: הפתרון שמוצג כאן למיזוג מערכים מניח שהמערכים ממויניסם בסדר עולה (מהקטן לגדוק) והתוצאה שתתקבל תהיה גם היא בסדר עולה. כאשר יש דרישה למיזוג מערכים הממוינים בסדר יורד, יש לשנות את סימני ההתניה בשורה 16. נחזור לדוגמה של רשימת שמות תלמידיס בבית ספר, ונניח שיש בה 1000 שמות ממוינים. כעת, אנו רוציס להוסיף מספר שמות של תלמידיס חדשים שהצטרפו במהלך השנה. פעולה זו אינה מצדיקה מיון שלס לאחר ההוספה, ולכן, מה נעשה! כמובן: נמייו את הרשימה של התלמידיס החדשים ונבחר בתהליך מיזוג כדי לקבל רשימה אחת שלמה ומעודכנת של תלמידי בית הספר. מיזוג של יותר משני מערכים דוגמת המיזוג בסעיף הקודס מתארת מיזוג של שני מערכיס בלבד. מה יקרה אם עלינו למזג שלושה מערכים, ארבעה, ואף יותר! הפתרון אינו קשה. אפשר לבחור בדרך פשוטה של מיזוג שני מערכיס בכל פעולה, עד אשר נקבל מערך בודד. פרק 11: מיון ומיווג מערכיס 153 דרך מתותחכמת יותר, וכמובן שגס יעילה יותר, היא למזג במעבר אחד את הנתוניסם מכל המערכים. כלומר, קוראיס את האיבר הראשון בכל מערך ובודקיס מי מהס הקטן ביותר, ואותו מעביריס למערך היעד. מקדמיס את המצביע באותו מערך לאיבר הבא ושוב בודקיס מיהו האיבר היותר קטן ומעביריס אותו למערך היעד. כך ממשיכיס בהעברת האיבר הקטן ביותר בכל סדרת השוואות. בשלב מסויס מסיימיס לקרוא איבריס ממערך כלשהו בשעה שבאחריס עדיין יש איברים. אס כן, ממשיכים למזג מספר קטן יותר של מערכים. לבסוף ייתכן שיישארו איבריס במערך אחד שאותס נעתיק ישירות למערך היעד. תרגילים תרגיל 11.1 כתבו תוכנית הממיינת מערך חד-מימדי בגודל א בשיטת מיון שכנים. א הוא קבוע המוגדר בחלק ההגדרה של התוכנית. איברי המערך הס מסוג נתון ממשי. תרגיל 11.2 כתבו תוכנית אשר תמזג שני מערכים חד-מימדיים שבכל אחד מהם עשרה איבריסם מסוג שלס. המערך הראשון ממוין בסדר עולה (מהקטן לגדול) והמערך השני ממוין בסדר יורד (מהגדול לקטן). (רמז: כאשר שני מערכיס ממויניס בסדר הפוך, ניתן להתחיל לקרוא בראשון מההתחלה לסוף, ובשני מהסוף להתחלה. דרך אחרת היא למיין את המערך ההפוך בסדר עולה ואחר כך למזג, אך האס תבחרו בדרך זו?). תרגיל 11.3 כתבו תוכנית אשר ממזגת שלושה מערכיס הממויניס בסדר יורד. כל מערך מכיל עשרה איברים מסוג שלם. אופן הביצוע נתון לבחירתכם. תרגיל 11.4 נתונים שני מערכים חד-מימדיים המכילים שישה ציונים כל אחד (ערכיס ממשיים). הציוניס ממויניס בסדר יורד, אך עקב תקלה יש ביניהס גס ערכיס שליליים. כתבו תוכנית אשר ממזגת את שני המערכים, תוך התעלמות מהערכיס השליליים. 4 פסקל מהצעד הראשון - מהדי 2 תרגיל 11.5 נתוו מערך חד-מימדי שבו עשרה שמות תלמידיס הממויניס בסדר עולה. כתבו תוכנית הקולטת שס נוסף, ומוסיפה אותו לרשימה תוך שמירה על סדר המיון. תרגיל 11.6 נתונים שני מערכים בני חמישה תאים כל אחד. תוכנס של שני המערכים והה (קראו משמאל): 6 ,44 ,93 ,14 כתבו תוכנית אשר תמיין את המערך הראשון בשיטת מיון שכניס ואת המערך השני - בשיטת מיון בועות. על התוכנית למנות כמה השוואות נעשו בכל שיטה ולהדפיס את התוצאות. פרק 11: מיון ומיווג מערכיס 155 פדק 12 קבצים מהו קובצ! קוב הוא מבנה נתונים על הדיסקט או על הדיסק המגנטי. אנו מכיריס קבציםס שוניס המשמשיס למטרות שונות. יש לנו קובצי תוכניות, קובצי מסמכיס שכתבנו במעבד תמלילים, קובצי נתוניס המכילים את מצב המלאי במחסן או את רשימת התלמידים ועוד. עלינו לברר לשס מה דרושיס לנו הקבציס בדיסק או בדיסקט, ומה ייחסריי לנו באחזקת כל אלה בזיכרון המחשב! מהי המשמעות האמיתית של קובץ, ומדוע אי אפשר לאחסן את כל התוכנות והמסמכים בזיכרון ולבחור בהס ככל שנרצה? התשובה לכך ברורה. הזיכרון שאנו משתמשים בו הוא זיכרון נדיף (מתנדף, נעלס לאחר כיבוי המחשב). על כן אנו נאלציס לשמור את הנתוניס והתוכניות בדיסקט או בדיסק הקשיח ולטעון אותס לזיכרון בעת הצורך. בנוסף לכך, הזיכרון שאנו משתמשים בו מוגבל בקיבולת שלו, ולכן לא ניתן לטעון את כל אוסף הנתוניס לזיכרון לשס עיבוד (חשבו למשל, על קובצ תושבי המדינה, או על אלפי חשבונות הבנק). עלינו יילקרואיי מדי פעס חלקיס של מאגר הנתוניס שאנו צריכיס לשימוש מיידי ולכתוב אותס לקובצ לאחר העדכון, כדי לפנות מקוס לקבוצת הנתוניס הבאה. ניתן לומר, אס כן, שהקובץ הוא כלי הקיבול של הנתונים. אליו אנו כותביס נתונים וממנו אנו קוראיס נתוניס הדרושיס לנו לעיבוד. תוכנית היא מקרה פרטי, שבו המהדר יוצר עבורנו קובצ תוכנית ואנו קוראיס אותו לצורך הפעלת התוכנית. אין בו תהליך של עדכון, כמו בקוב> נתוניס. הקבציס נכתביס בדיסקט או בדיסק קשיח. בהמשך נשתמש בביטוי יידיסקיי בלבד. מן הראוי לומר שאפשר לכתוב קוב> גס לאמצעי אחר, כמו סרט מגנטי, וא0א-62 ואמצעיס אחרים, שלא נדון בהס כאן. אל המדפסת, למשל, אפשר לכתוב קובץ, אך אין לנו אפשרות לקרוא אותו ממנה. אנו גסם כותביס אל המסך. פרק 12: קבציס 157 קבצים בשפת פסקל שפת פסקל נותנת לנו כליס נוחיס לניהול קבצים: יצירה, עדכון וגישה. כדי לאפשר נוחות זו יש צורך בכלים שוניס לסוגי קבצים שונים, על פי שלושה קריטריוניס: קובצי טקסט, קבצים מובנים (בעלי תבנית), וקבצים בינאריים. בפרק וה נלמד על שני הסוגיס הראשונים. קובצי טקסט (81!6₪5 +א6ד) קובצי טקלסט מכילים מילים, משפטים, וגם מסמכים שהינס רצפים גדולים של מילים ומשפטים. קבציס אלה הס קבציס סדרתיים, שניתן לכתוב ולקרוא מהס בצורה סדרתית בלבד. לא ניתן, לדוגמה, לקרוא שורות אחדות בתחילת הקוב>, ולאחר מכן לדלג לאמצע להמשך הקריאה. לטיפול בקובצי טקסט קיים סוג משתנה - %א6ז. מגדירים אותו כשס שמגדיריס משתניס אחרים: זְהָּץ 6אסד :וה 6ווזהּא 3 מייצג את שס המשתנה ו-א6ד מציין את סוג הנתון. לדוגמה, כשאנו רוצים להגדיר משתנה בשם 16=ץ1 כמשתנה לניהול קובצי טקסט, נכתוב: זה 6אסדך :ועו כעת, משלמדנו כיצד מגדיריס משתנה לניהול קובצי טקסט, נוכל ללמוד על השימוש בו. הפקודה 455/07₪ (הכוונת שם קובץ) כאשר רוצים לפנות לקובצ עלינו לצייןו תחילה את שמו. נעשה זאת באמצעות הפקודה 85514 (שפירושה הכוונה) המייעדת משתנה מסויס לקובצ. משתנה זה יאפשר לנו לפנות אל נתוני הקובצ. תבנית הפקודה: ; (6חחה]ס||- ,6רחבּובּ/) חףו55 6וח3א 3 מציין את שס המשתנה, ו-6וח3א116= מציין את שס הקובצ שאנו רוציס לנהל. לדוגמה, ;("דהק.= |ןז' ,ועו ח0ו55 8 פסקל מהצעד הראשון - מהדי 2 פקודה זו קובעת שהמשתנה 6=ץ יאפשר לפנות לנתוני קוב דהפ.= וזח. כלומר, כאשר נשתמש במשתנה 6!ו"ץ המחשב יידע שאנו רוציס לפנות לקובצ דמס.= וזח. הפקודה ₪656% (פתיחת קובץ לקריאה) הפקודה ח845514 אינה מאפשרת קריאה או כתיבה לקובץ, אלא רק מייעדת משתנה לטיפול בקובצץ מסוים. כאשר רוצים לפנות אל קוב, עלינו 'ילפתות''י אותו תחילה. פתיחת הקוב הינה פעולת הכנה של התוכנה לאיתור מקוס הקובץ בדיסק וזיהוי ייראשויי, כדי שאפשר יהיה לקרוא ממנו או לכתוב אליו. בשפת פסקל יש פקודות שונות לפתיחת קוב לקריאה, או לכתיבה. פותחים קובץ לקריאה באמצעות הפקודה 656%א8. כך נכתוב את הפקודה: ; (6ח3713/) 656% 6וח3ּא זה מציין את משתנה הטקסט לניהול הקובצ. לדוגמה, השורות הבאות מורות למחשב לפתוח את הקובצ דהס.=ם וזח לקריאה: ;("דהק.= ות' ,6|וחעוא) ה0ו55 (6|חץו) 656% אס ננסה לפתוח בעזרת הפקודה ₪656% קובצ שאינו קיים, המחשב יעצור את התוכנית ויודיע על שגיאה. הפקודה %6וזעש₪6 (יצירת קובץ לכתיבה) הפקודה המשלימה לפקודת ₪65% היא הפקודה 6זוזש86. פקודה זו מגדירה קובץ חדש ופותחת אותו לכתיבה בלבד. אס קיים קובץ בשס זה, המחשב ימחק אותו וייצור קוב חדש. כותביס את הפקודה ₪66 כשס שכותבים את הפקודה ₪656%. לדוגמה, השורות הבאות יוצרות קובצ חדש לכתיבה: ;("דהכ.= ת' ,6|וחעוא) ה0ו55 ; (6ץ1) 06 שימו לב: הפקודה 6!/ו6א יוצרת קובץ חדש, ואם יש קובץ בשס זה 1 היא מוחקת אותו. ראו הוזהרתם! פרק 12: קבציס 159 הפקודה 6חסכקה (הוספת נתונים לקובץ) בפעולות שונות עלינו יילעדכןיי קובץ טקסט, כלומר להוסיף אליו נתוניסם בלי למחוק את הנתוניסם הנמצאים בו. לצורך כך משמשת הפקודה שח6קק, שתפקידה לפתוח קובץ קיים לצורך עדכון. כלומר, לאתר את הקוב בדיסק ולוּהות את סופו, כדי שאפשר יהיה לכתוב בהמשכו נתוניס חדשים. 1 שימו לב: אנו עוסקים בקובץ טקסט, ופקודה זו מאפשרת אך ורק להוסיף נתוניסם חדשים לסוף הקובץ, ואין כל אפשרות לשנות בו דבר. כתיבה וקריאה מקובצי טקסט כדי לפשט את תהליך הכתיבה לקבצים והקריאה מהם, הוחלט כי פקודות הפלט/קלט הבסיסיות המשמשות אותנו לכתיבה על המסך וקריאה מן המקלדת ישמשו אותנו גם לקריאה וכתיבה מקבצים. פקודות אלו הן כמובן 0 ו-ח!₪680, ססחו/ ו-חהוססוז\. השוני בכתיבת הפקודה הוא כמובן ציון העובדה שאנו רוציס לכתוב לקובצ או לקרוא ממנו, במקוס לעשות ואת למסך ולמקלדת. את המסך והמקלדת אין צורך לציין במפורש בפקודה, כי הס אמצעי פלט וקלט סטנדרטיים, בהתאמה. תבניות הפקודות לקריאה וכתיבה מקוב: קריאה מקובץ ;(50100 ,6חהּזה/) ה|680 כתיבה לקובץ ;(0/37חו50 ,שוחהּזזוב/) הוססח/ ס6וחהּא זב - שס משתנה אשר שויך לקובצ מסויס. 9 או | - משתנה שאליו נקרא את הנתוניס, או שממנו נכתוב בוו את הנתוניס אל הקוב. 0 פסקל מהצעד הראשון - מהד' 2 לדוגמה, כדי ליצור קוב חדש בשם דגס.סופפ ולכתוב לתוכו את המשפט ייס ן =שחיי נרשוס את הפקודות האלו: זפ 6אסד :ועו חו9סם ;"דכ סוזסס' ,שוח ץו) ה0ו55ה ; (6!|ץ1) סו ;0 1 שח' ,6|וחע) הוססחו/ .0 באותו אופן, אם נרצה לקרוא שורה מקוב ד05%56.84ד/ שנמצא בספריה :6, נכתוב את הפקודות האלו: זפ 6אסד :ועו ;ו 5% חו9סם ;(" .א 0 דמ :0' ,שו ץו) ח0ו55ה ; (6|וחץא) 656% ;50 ,6וחץ₪) ה|₪680 .0 כל התכונות והחוקיםס החלים על הפקודות ה|₪680 ו-חוסשוזש נכוניס גס לגבי קריאה מקבצים וכתיבה אליהס. סיגירת קבצים (6!056 6וו=) כאשר אנו מסיימים את העבודה בקובצ עלינו לייסגוריי אותו. סגירה היא נוהל שבו התוכנית מודיעה למחשב שעליו לבצע פעולות מסוימות בקוב, מכיון שאין אנו עומדיס להשתמש בו יותר. פעולת הסגירה חיונית, במיוחד במצב של כתיבה. לאחר הסגירה, המחשב אינו מאפשר לתוכנית לפנות שוב אל הקובא, אלא רק אס תפתח אותו שוב. במצב קריאה - קוב קלט - הקוב נסגר ללא פעולות נוספות. לעומת ואת, אס הקוב היה במצב כתיבה - קובץ פלט - סגירת הקוב גוררת מספר פעולות: כתיבה לקובצ של הנתוניס שטרס נכתבו מהמשתנה שהוגדר לקובצ, סימון סוף קובצ ועדכון טבלת הקבציס שבדיסק. בשלב מאוחר יותר נוכל לפתוח את הקוב שוב לכל צורך שנרצה. פרק 12: קבציס ‏ 161 41 שימו לב: אס לא סוגרים קובץ פלט הוא עלול להיות בלתי תקין, ולא יהיה ניתן לקריאה. חשוב לסגור את כל הקבצים לפני סיום התוכנית. הפקודה לסגירת קוב היא 61056, והתבנית שלה: ;(ז68!) 6!056 זו" - המשתנה שהוגדר לקוב>. לדוגמה, כדי לקרוא שורה מהקובצ ז56.4א05ד0()א בספריה :6, לכתוב אותה על המסך ולסגור את הקובץ, נכתוב את הפקודות הבאות: זה ;)אד :ועו חו60ם ('ד.6ם א ד מ:6' ,שווחץו) הסו55ה ; (6|וחץא) 6566 50 ,6=ע) ה|680 ;50 ,' 15 ד6.4םאם 0 ד\:6 )0 שחו! ל5זו') חובסוז/ ;(6!ןץ]) 6056 .0 הפונקציה +0ם (זיהוי סוף קוב) אס נתבונן בדוגמה הקודמת נראה כי חסר בה מרכיב חשוב מאוד: אנו קוראיס שורה בודדת ומסיימים. כדי לקרוא קובץ שלם עלינו ליצור לולאת קריאה, אך על מה תסתמך הלולאה! מה יסמן לה מתי להפסיק: איך נדע מהו סוף הקובצ: לפתרון בעיה וו קיימת הפונקציה +50 (קיצור המיליס 16 +0 6חם). פונקציה זו מקבלת משתנה טקסט ומחזירה ערך בוליאני המציין אס הגענו לסוף הקוב. לדוגמה, אם נרצה שהמשתנה =50 יציין את מצב הקובצ, נוכל לכתוב: חפ ח68|ססם :5 חופ6ם ;(6|וחץו]) +6ם =: 50 .6 הגדרנו משתנה, אשר במהלכה של התוכנית יכיל את המצב שעליו מצביע המשתנה שווחעוו. 2 פסקל מהצעד הראשון - מהד' 2 קבצים מבניים (8!65 60קץד) קבציס מבנייס הינס בעלי מבנה קבוע ומוגדר. כדי להבין ואת טוב יותר נגדיר שני מושגיס בסיסיים : שדה (16!6=) - סוג כלשהו של נתון. לדוגמה: מספר זהות, שס פרטי, כמות במלאי, גיל וכדי. רשומה (8₪66076) | - קבוצה של שדות, או נתונים, מסוגיס שוניס, המתאריס ישות כלשהי כמו אדם, פריט במלאי, חשבון בבנק וכוי. לדוגמה, שני השדות/נתוניס שס תלמיד (מחרוזת) וציון (ערך ממשי) הס רשומה. גס קבוצת השדות תיאור שולחן (מחרוזת), גובה (ממשי), רוחב (ממשי) ואורך (ממשי) מהווה רשומה. כעת נוכל להגדיר קוב מבני: זהו קוב אשר מכיל רשומות. עד כה לא עסקנו במבנים מורכביס, אלא במבניס פשוטים כגון שלמים, ממשיים, מחרוזות ועוד. הגדרה של סוג משתנה שיוכל לכלול בתוכו סוגיס שוניסם של משתניס בסיסיים נעשית באמצעות מילת ההגדרה רשומה (366010). מבנה הרשומה את מבנה הרשומות מגדיריס באזור הגדרת המשתניס: ;6|חחאם הההזפסזס 6 0 = 6686 ;ץד :וה ]ו זְהָּץ (66ץ :₪ תחוס הגדרת הרשומה באזור הגדרת המשתניס מתחיל במילת המפתח 6קץד (סוג). באזור זה אנו ‏ "יוצריסיי משתניס חדשיס המבוססים על משתניס מוכרים. כדי ייליצוריי משתנה חדש נשתמש בתבנית 6636 = 0 פרק 12: קבציס 163 הגדרה זו מודיעה למחשב כי מעתה ועד הופעת המילה 'יטחפיי מגדירים תוכן של רשומה. את השדות ברשומה מגדיריס כמשתניס רגילים לכל דבר, לדוגמה: 6 0 = 66א3] ;ו :הא זז :זו ו ברשומה שבדוגמה הוגדרו שני שדות: 'יסוחפּא'יי מסוג מחרוזת, המכיל את שס התלמיד; ושדה *זפואיי המייצג את הציון של התלמיד. לרשומה כולה קוראיס ₪60 אזהויי. כאשר נרצה להגדיר משתנה חדש מסוג רשומה ''₪66אזפוי'י, עלינו לכתוב: זה ;אוהו :₪ כעת נשאלת השאלה, כיצד פוניס לכל שדה בתוך הרשומה! כדי להבין ואת נתבונןו בתוכנית הבאה: ;6|קחח8אם ההבזטסזוס 6 0 = 466אז3 ;ו ו | זז :זו ו זפ ;אוהו :₪ חו9סם (':6ח8ח %ה50006 זססחם') הוססוזו/ ; (6חוה. 1]) ה|680 ; (':אזהרח 06 זססחם'") הוססוזו/ ;(6זב1. ₪) ה|680 0. לפי מבנה התוכנית רואיס שניתן להתייחס לשדות אלה כאל משתנים רגיליס, ואין כל שוני בינס לבין משתנה פשוט. ההבדל היחיד הוא תבנית השימוש: כותביס את שס המשתנה ואת שס השדה ומפרידים ביניהס בנקודה. 4 פסקל מהצעד הראשון - מהדי 2 מכיון שניתן להתייחס לרשומות כסוגי משתנים רגילים כמו מחרוזת, שלס, ממשי ועוד, ניתן ליישס זאת גם על מערך: 0% 0 = )וח | 6 0 = 66 אה ;ו ו | זז :ו ]ו זפ ;66 זט + [וח1ו]..1] ץְפזובּ 5 בדוגמה זו הגדרנו מערך בן 30 איבריס שכל אחד מהס הוא רשומה. מכאן גס ניתן להבין את ההבדל בין תא לבין איבר: תא הוא הגדרה למשתנה פשוט כגון משתנה שלם, ואילו איבר הוא הגדרה לבלוק המכיל בתוכו כמה תאים. כיצד כל וה מתקשר לקבצים! אס נקשר בין שני הדבריס שלמדנו - קבציס בעלי תבנית מוגדרת ורשומות - נוכל ליצור בתוכנית שלנו מערך מסוג חדש. מערך זה יוכל לקלוט נתוניס בצורה מורכבת, לשמור אותס על הדיסק ולקרוא אותס מאוחר יותר כשנצטרך. טיפול בקבצים מבניים טיפול בקבציס מבנייס דומה מאוד לטיפול בקובצי טקסט. תחילה נלמד כיצד מגדיריסם משתנה לטיפול בקבצים: זפ ;36 1 660 )0 סוה :וה 6וחבּאוהּ הוא שס המשתנה. ההגדרה 66070808 01 86 מציינת למחשב כי אנו רוציס ליצור משתנה לטיפול בקבציס מבניים, שהמבנה שלהם הוא וזה המפורט בהגדרה של ₪66070%886. נתבונן בקטע התוכנית הבאה: סע 0 = 66א ;ו ו | ;|₪68 :אזפו ו זה ;66 אזבו 01 סוה :ואוו פרק 12: קבציס 165 קטע זה מגדיר משתנה בשס 6אז3י המיועד לטפל בקבצים מבניים. כדי שהמחשב יוכל לדעת מהו מבנה הקובץ, כתבנו את שס הרשומה: 6₪666ז8ו, במקרה זה. לפני שנוכל להמשיך, עלינו לדעת מספר תכונות הקשורות לניהול קבציס מבניים. התכונה הראשונה היא שקבצים מבניים אינם סדרתיים. כתוצאה, ניתן לקרוא את הרשומות לפי הסדר שלהן בקוב>, אך גם אפשר יילנועיי בקובצ לפניס ולאחור ולקרוא כל רשומה רצויה. תכונה חשובה נוספת היא, שלאחר פתיחת הקוב אין צורך בפעולות נוספות לביצוע תהליכי קלט ופלט. לדוגמה, כדי לקרוא מקובצ טקסט עלינו לפתוח אותו בעזרת הפקודה ₪656%%. כדי לכתוב בו חייביס להשתמש בפקודה 6 /ש₪6. בקבצים מבנייס, לאחר שפתחנו את הקוב בכל צורה שהיא, ניתן גם לקרוא וגם לכתוב ללא המגבלות הללו. עתה נפנה לאופן השימוש בקבצים מבניים. הפקודה 455100 (הכוונת משתנה לשם קובץ) השימוש בפקודה ח85518 להכוונת משתנה לשס קוב נעשה כמו בקובצי טקסט. לדוגמה, בהסתמך על קטע התוכנית שזה עתה כתבנו, נוכל לייעד את המשתנה 13-16 לטיפול בקובצ ₪85.04 על ידי המשפט הבא : ("דכ.5א הו ,6 אזבּויז) חטו55ה הפקודה +₪656 (פתיחת קוב לקריאה וכתיבה) הפקודה +₪656 פותחת קוב לפעולות קלט ופלט. כאשר נעשה שימוש בפקודה זו המחשב יפתח קוב שממנו נוכל גם לקרוא וגס לכתוב כל רשומה בכל מקום בקובץ. אס נבקש לפתוח קוב שאינו קיים, המחשב יפסיק את מהלך התוכנית ויודיע על שגיאה. הפקודה %6וז/ש₪6 (יצירת קוב לכתיבה) הפקודה ₪646 דומה מאוד לפקודה ₪6565, לאחר השימוש בה ניתנת האפשרות גם לכתוב וגם לקרוא מהקובץ. ההבדל היחיד בין שתי הפקודות הוא שבשימוש הפקודה 66חשו₪6 נוצר קובץ חדש, כלומר נקבל קובצ אשר יחיה ריק מנתונים, עד אשר נכתוב לתוכו. 6 פסקל מהצעד הראשון - מהדי 2 1 שימו לב: פעולה זו עלולה למחוק קובץ קיים. ראו הוזהרתם! הפקודה 61056 (סגירת קובצ) תפקיד פקודה זו לסגור את הקובצ. פעולתה והה לכל סוגי הקבצים. קריאת נתונים (630א) וכתיבת נתונים (%6ו]//) כדי להבין את הדרך שבה מתבצעת כתיבה לקובץ או קריאה ממנו, נתבונן בתוכנית הבאה, העוסקת בניהול מלאי פריטים. אנו קוראיס נתוניס מקובצ אחד ויוצריס קוב חדש : ;6 סו הוההזטסזק | (1 2 6 3( 66 = 0 וו :חב (4 ;]8 | :סק (5 6( 0 זה (7 8( 7: 6; 16 +0 שוח = (9 (10 חו69ם (11 ?] אתחול המשתנה [ 4 (12 ;'1510/ם | ד' =: סשוחהּז.1 (13 0 =: ססוזק.1 (14 15( ? יצירת קובץ חדש בשם 16055.0 וכתיבת נתונים לתוכו + (16 ;("1655.001;ק' ,=) ה0ו55 (17 18( ₪66 )=( ;2 =) ססה/ (19 20( 61056 )=(; 21( ?] פתיחה מחודשת של הקובץ החדש לצורך קריאת נתונים ממנו 4+ (22 ;(=) )₪656 (23 24( ₪680 )=, 2, 25( 61056 )=(; 26( 4. פרק 12: קבציס 167 ננתח את מבנה התוכנית: בשורות 3 עד 6 אנו מגדיריס רשומה חדשה בשס 10608₪66, אשר מכילה שני שדות: השדה הראשון (סוחהא) מסוג מחרוזת, מכיל את שס הפריט. השדה השני (66וזק) הוא מסוג ממשי, עבור מחיר הפריט. בשורה 8 מגדיריס משתנה בשס 1 מסוג הרשומה שהגדרנו, ומתחלים אותו. בשורות 13 ו-14 מציבים בו נתונים: שס פריט (במקרה גה - א1510/ם וםד) ומחיר הפריט (2500.00). 41 שימו לב: כדי לפנות לשדה של הרשומה, אנו כותביסם את שס הרשומה ואת שם השדה הרצוי לנו. כלומר, אם נכתוב פקודה כזו, 'א1510/ם | ד' =: סשוחהּ.1 הכוונה היא להכניס את הטקסט ייא1510/ם |שדיי לתוך השדה/משתנה שוחב שברשומה 1. באופן דומה אנו מתייחסיס לשדה 6סוזק שברשומה צו. לאחר שעשינו זאת, אנו רוציס לשמור את הנתוניס בקוב, ולכן בשורה 17 ציינו כי המשתנה = ייצג את הקוב ד81655.04ק. לאחר זאת, יצרנו את הקוב בעזרת הפקודה 6וזאו₪6 שבשורה 18. כעת נתבונן במבנה הפקודה שוו\ שבשורה 19. קיימיס שני פרמטרים: הראשון הוא משתנה לניהול הקוב, והשני הוא המשתנה שאת תוכנו אנו רוציסם לרשוס לקוב. מבנה הפקודה 6זווש הוא: שס המשתנה לניהול הקוב ומשתנה נוסף המכיל את הנתוניס. בהמשך נדון בהרחבה על מבנה הפקודה הצו. בשורות 23 עד 25 אנו מבצעיס את הפעולה ההפוכה: אנו פותחיס את הקובצ על ידי הפקודה 656%0א, וקוראים ממנו את הרשומה שנכתבה לתוכו. נוכל לסכס את מה שלמדנו בתוכנית זו: כאשר רוציס לקרוא מקובץ או לכתוב לתוכו בעזרת הפקודות ₪680 ו-שוז בהתאמה, עלינו לצייו את שס המשתנה שמנהל את הקוב ואת שס המשתנה שבתוכו יאוחסנו הנתוניס, או שממנו הס ייכתבו לקוב>. כל הקבציס המבנייס אשר הצגנו בפרק זה נוצרו על פי רשומות שהגדרנו. קבציס מבנייס ניתן גס להגדיר על בסיס משתנים פשוטים יותר. לדוגמה, ניתן להגדיר קובצ מבני המבוסס על המשתנה השלם (8606ח1) ומחרוזת (9חוו5%) אשר קיבצנו כדי לענות על דרישה כלשהי. 8 פסקל מהצעד הראשון - מהד' 2 נתבונן בדוגמה שלפנינו: ;86 התהזססוס זה ;[06007ח1 +0 שוח = 1 0 01 [1..10] ץוב :ד חו9סם ; ('"דכ.5שפועצז' ,=) ח0ו55ה (=) וצו 0 10 00 1 =:1 הס ;([6]1!ס3 ד ,=) בסחזו/ ; (=) 6|056 .6 נסביר את התוכנית הזו. בחלק הראשון שלה הגדרנו שלושה משתניס: הראשון הוא משתנה לניהחול קובץ מבני המבוסס על המשתנה השלס; המשתנה השני מסוג שלס הוגדר לצורך סריקת מערך; והמשתנה השלישי 8|ספד הוגדר כמערך חד-מימדי בגודל עשרה איבריס מסוג שלס. בתחילת התוכנית הכוונו את המשתנה = לניהול קובצ בשס ד4כ.5חשפאטא. בשורה שלאחריו יצרנו את הקוב בדיסק בעזרת הפקודה 66שש₪6. תפקיד הלולאה זס+ לכתוב את תוכן תאי המערך לקוב>, תוך שימוש בשיטת הסריקה. בסיוס התוכנית סוגריס את הקוב בעזרת הפקודה 6|056. הפונקציה ]₪0 (סוף קובץ) הפונקציה +50 מודיעה לתוכנית כאשר מגיעיס לסוף הקובא. משמעות הפקודה היא, שבעזרתה ניתן לבנות לולאות פשוטות לסריקת תוכן קבצים, ולדעת כאשר מגיעיס לסוף הקובצ. לדוגמה, נניח כי דהכ.5ם!וא הוא קוב מבני המכיל מחרוזות. נוכל לקרוא את תוכנו לתוך מערך באמצעות לולאה פשוטה. פרק 12: קבציס 169 התוכנית הבאה מדגימה זאת: ;660 ההבזטסזוס ז ,500 ז0 6ו8 ₪ זז 60 ;50 06 [1..100] ץחה | :₪865 חו9סם ('"דהכ.5ם]הוז' ,=) ה0ו55ה ;(=) :₪656 0 =: חס 0 8|56= = (=) ]₪0 ס6ווחעו חופסם ; (ז%6ח60) 6ח1 ; ([ 0061 ]65רחּ ,-) 680 ]יו ; (=) 6|056 .0 בתוכנית זו הגדרנו משתנה לניהול קבציס מבניים המבוססים על מבנה המחרוזת. בנוסף הגדרנו גס מערך חד-מימדי הכולל 100 מחרוזות, ומשתנה בשם ז6חטס60 אשר ימנה את מספר המחרוזות שקראנו מן הקובא. כעת ניגש ישירות ללולאה 6!וחש, שבה אנו משתמשיסם בפונקציה 506 בהתניה כזו: כל עוד (6|וחש) לא הגענו לסוף הקובץ (8|56- = (=) 506), תבצע (60) את הפקודות הבאות... תוכן הלולאה : בכל פעס אנו מגדילים את המונה המשמש אותנו גס כאינדקס, וקוראיס מחרוזת חדשה לתוך המערך. בסיוס התוכנית סוגריסם את הקובא בעזרת הפקודה 6|056. הפונקציה 1165126 (מספר רשומות בקובץ) פונקציה נוספת הבאה לעזרתנו בניהול קבציס מבנייס היא 1165126=. על פי שמה ניתן להבין שתפקידה לדווח על גודל הקובצ. נדייק ונאמר, כי פונקציה זו מדווחת על מספר הרשומות בקובצ. לדוגמה, אס מנהליס קובצ שמכיל נתוניס על פריטים ומחיריהם, הפונקציה 26ו65!ו₪ תוכל לדווח כמה פריטים (רשומות) מצוייס בקוב>. דוגמה נוספת: כאשר נתון קוב המכיל מחרוזות, הפונקציה 6 תוכל לדווח כמה מחרוזות קיימות בו. 0 פסקל מהצעד הראשון - מהדי 2 כעת ננסה לממש את הדוגמה האחרונה בצורה קצת שונה. במקוס להשתמש בלולאה 6!וחו והפונקציה 500, נשתמש בלולאה זס) והפונקציה 26ו5שוות : ;0 והתהזססזק זפ ;500 01 816 ₪ וח 6 ;חפ 01 [1..100] שְפזובּ :הא חו60ם ;("דכ.5ם ו הוז' ,=) הסו55 ;(=) ₪656% 0 (=) 6526 0 1 =:1 זס+ ([65]1ח8 ,=) ₪680 (=) 61056 .6 הפונקציה 566% (איתור נתון לפי מיקום) אחד היתרונות הגדוליסם של הקובצ המבני הוא שניתן לנוע בו מרשומה לרשומה. נסביר ונדגיס ואת בעזרת הפקודה 566%. נניח שנתון קובצ שבו חמש מחרוזות, ועלינו לשנות את המחרוזת השלישית. כיצד נעשה זאת!: עלינו יילומריי למחשב לקרוא את הנתוניס של המחרוזת המסוימת. ואת נעשה באמצעות הפקודה 566%, אך כיצד משתמשיס בה! לפני שנשיב, נתבונן תחילה איך פונים לרשומה. שימו לב: אנו מהגים לציין מספר סידורי מהערך 1. במחשב מתחילה 1 הספירה מ-0. לכן, כאשר נרצה י*לגשת'י לנתון הראשון בקובץ, לקרוא או לכתוב אותו, נציין למחשב כי אנו מבקשים גישה לנתון *מספר 0'י. הנתון השני יהיה מספר 1, החמישי יהיה מספר 4 וכן הלאה. נחזור לדוגמה. ברצוננו לשנות את המחרוזת השלישית. מבחינת המחשב זוהי מחרוזת יימספר 2יי בקובצ. כעת, כל אשר נשאר לנו לעשות הוא לפנות למחרוזת זו ולקרוא אותה. תבנית הפקודה 566%: ((חס0ו5סק ,ז6/3!ו) 566% ז1163= - מייצג את המשתנה שיועד לקוב שמטפלים בו. חסוו5 סק - הוא המיקוס בקוב שאליו רוצים לגשת. פרק 12: קבציס ‏ 171 בדוגמה זו, הפקודה 566% פונה אל המחרוזת הרצויה באמצעות הערך חסטופסק ייהמצביעיי על מקומה הסידורי בקוב (אשר מתחיל מ- 0). כעת נכתוב תוכנית המציגה במסך את המחרוזת השלישית של הקוב ששמו דהס.ם תח : ;0חו5 !סוכ ההבזטסזוס זפ ;500 01 ₪6 ₪ ;ו 5% חו9סם ;("דק.= וזח' ,=) ח0ו55ה 656% )=(; 566% )=, 2(; ₪680 )=, 50, 6|056 )=( ; 50 , :15 8|6 6 חו 8ח50 370 סחד') הובסוז/ .0 הפונקציה 1!6905= (מיקום מצביע הקובץ) בעזרת הפקודה 566% ניתן לנוע בתוך הקוב אל מחרוזת רצויה. מכיון שתכונה זו קיימת עבור קבציס מבניים, חייבת להיות גסם דרך אשר נוכל באמצעותה לדעת היכן נמצא המצביע של הקובצ. כלומר, אנו רוציס לדעת על איזו מחרוזת או רשומה מוצב המצביע. לשס כך נשתמש בפונקציה ₪1!6205 שתפקידה לדווח על כך. תבנית הפונקציה: ;(ז6/8!ן-]) 6005 =: חסטופסק זז | - | המשתנה לניהול הקובצ. חסשו5 סק - | משתנה שלס שמקבל לתוכו את מספר המחרוזת או את מספר הרשומה שעליה מוצב המצביע. כעת נכתוב תוכנית שמדפיסה את גודל הקוב (מספר הרשומות שבו) על ידי שימוש בפקודה פסלפוות : ;6526ן68|6 וחפזףסזק | (1 זו (2 ;]וח +0 6וח ₪ (3 ;חן | :526 (4 5( חו60פ | (6 ("דק.= |ז' ,=) ח558 (7 ;(=) :₪056 (8 ((()6526!= ,=]) 566% (9 2 פסקל מהצעד הראשון - מהדי 2 ;(=) 16005 =: 5126 (10 ((526 ,' :15 5126 6ון='") חובסהו/ (12 ; (=) 6056 (12 .0 (13 נבחן את התוכנית הזו: בשורה 3 הגדרנו משתנה לניהול קובצ המכיל מספריס שלמים. בשורה 4 הגדרנו משתנה 5126 שתפקידו להכיל את גודל הקובץ. בשורה 7 אנו מכווניס את המשתנה = לניהול הקוב דהס.= |1, ובשורה 8 פותחיס את הקוב. שורה 9 היא שורת המפתח של תוכנית זו. בשורה זו אנו מוריס למחשב לגשת למקוס מסוים בקוב, וכאן - אל סוף הקובצ, על פי הפונקציה 16526 שמחזירה את גודל הקובצ. כוכור, גודל הקוב נמדד במספר מחרוזות, או רשומות שנמצאות בו. כל אשר נשאר לנו לעשות כעת הוא לקרוא את מיקוס מצביע הקובצ ולהדפיס את ערכו. בשורה 10 אנו מציביס במשתנה 5126 את מיקוס המצביע, ומדפיסים הודעה בשורה 11. תרגילים תרגיל 12.1 כתבו תוכנית הקוראת את תוכן הקובצ ד6.84םאםס ד\:6 ומדפיסה את כולו על המסך. תרגיל 12.2 כתבו תוכנית הקולטת שישה מספריס שלמיס לתוך מערך חד-מימדי וכותבת אותס לקובצ טקסט. תרגיל 12.3 כתבו תוכנית הקוראת את כל הרשומות הזוגיות שבקוב דחפ. 1151 לתוך מערך. הקוב מכיל ערכיס שלמים. אחר כך היא מדפיסה את מספר המשתניס שנטענו לתוך המערך. תרגיל 12.4 כתבו תוכנית הקוראת מחרוזת ושומרת אותה בקוב טקסט בשם דאד.םאזו. תהליך זה יימשך עד אשר המחרוזת שתתקבל תהיה ריקה (המשתמש ילתצ = בלי להקיש תוויס נוספים). פרק 12: קבציס 173 תרגיל 12.5 כתבו את חלק ההגדרה (זפּצ ו-6קש) בלבד של תוכנית הקוראת קוב שמבנה הרשומות שלו הוא: שס עובד גיל ותק בעבודה תרגיל 12.6 כתבו תוכנית המנהלת קוב מבני שהרשומה שלו כוללת מקוס לשם פרטי, שס משפחה ומספר טלפון. התוכנית תקלוט נתוניס אלה ותרשוס אותס בקובצ ד.ס.םאסהץ בצורה סדרתית, עד אשר המשתמש יכניס את המחרוזת ''000'י, אשר תציין לתוכנית לסייס את פעולתה. אורך המחרוזת של השס הפרטי 15 תווים, אורך המחרוזת של שס המשפחה הוא 20 תווים, ואורך המחרוזת למספר הטלפון הוא 10 תווים. תרגיל 12.7 בהסתמך על התרגיל הקודם, כתבו תוכנית אשר קוראת את כל הנתוניס מהקובצ על פי הפירוט שניתן בשאלה הקודמת, ומדפיסה אותם על המסך. תרגיל 12.8 כתבו תוכנית המקבלת שני שמות קבציסם. התוכנית תקרא את הקוב הראשון כקובצ טקסט ותעתיק אותו אל הקוב השני. תרגיל 12.9 נתוניס שני קבציס מבניים (דגכ.1ם |ז= ו-זג52.0 |ז=) בגודל והה המכיליס ערכיס שלמים. כתבו תוכנית אשר תעתיק מחרוזת מכל קובצ לסירוגין ותכתוב אותס לקובא היעד דג3.0ם |זח. לדוגמה, נקרא מחרוזת ראשונה מהקובץ הראשון, מחרוזת ראשונה מהקובצ השני, מחרוזת שנייה מהקובצ הראשון, מחרוזת שנייה מהקובצ השני, וכך הלאה. מטלה נוספת : עכשיו כתבו תוכנית אחרת, שבה קוראים מהקובצ הראשון כל מחרוזת שמקומה בקובצ אי-זוגי וקוראיס מהקובצ השני כל רשומה זוגית. את הרשומות שקוראיס כותבים לקוב> שלישי. 4 פסקל מהצעד הראשון - מהדי 2 נספח א ערבול (6א1וו15) הקדמה למדנו עד כה על דרכים שונות לניהול נתוניס, מיון וחיפוש. בשיטות חיפוש סדרתי וחיפוש בינארי אנו מסתמכיס על העובדה שיש לבצע מספר מסוים של צעדים כדי למצוא את הנתון המבוקש, או לחילופין, להוכיח שהוא אינו נמצא במערך הנתוניס שסרקנו. עתה עלינו להשיב על שאלה בסיסית ונוקבת: האס נאלצ לבזבו את זמנו של המחשב על חיפוש נתוניס שייתכן כי אינס קיימיס כלל! האס יש שיטה 'ילמצואיי נתון מבוקש ללא תהליך חיפוש! התשובה לכך היא כן! ניתן ליצור מצב, בו לא נאלצ להשתמש בתהליך החיפוש כדי לאתר ערך או נתון מבוקש בתוך מערך, או קוב. לשס כך נשתמש בשיטות ערבול (פַחוְחִ15), או טחינה, כפי שיש הנוהגיס לכנות מושג ה בעברית. נבחן את המצב הבא: בכיתה 40 תלמידים. לכל תלמיד יש מספר סידורי המיועד אך ורק לו. כאשר המורה החליטה לחשב ולשמור את ממוצעי ציוני התלמידים, היא בחרה לעשות את בעזרת מערך שהוגדר באופן הבא : זה ;|₪68 )0 [1..40] עְהזוהּ :זה בדרך זו, ממוצע הציוניס של תלמיד שמספרו האישי 1 יישמר באיבר מספר 1 ([65]1ז187) של המערך, וממוצע הציוניס של התלמיד שמספרו האישי 2 יישמר באיבר מספר 2 ([5]2אז8!) וכך הלאה. כך אנו פותריס את בעיית החיפוש, מכיון שהמספר האישי של התלמיד משמש גס כמפתח חיפוש של הנתון, או הערך, השייך לו. לכאורה נראה שפתרנו את הבעיות כי שיטה זו נראית בטוחה וחסכונית, אולס אין זה כך. השיטה מתאימה אך ורק למצביס מסוימים, כפי שנראה מייד. נספח א: ערבול (בַחוח₪35) | 175 נבחן את המצב הבא: במפעל 150 עובדים. אנו רוציס לנהל את נתוניהס של העובדיס בשיטה שנהגנו לגבי התלמידים, תוך שימור על תאימות עס יישומיס אחריס העוסקים בנתוני העובדיס. על כן נשתמש במספר תעודת הזהות של העובד כמפתח חיפוש, וכאן אנו נתקליס בבעיה: מספר תעודת הזהות מורכב מ-7 ספרות, דבר שידרוש מאיתנו להגדיר מערך שבו מיליוני איבריס, בעוד שרק 0 מהם ינוצלו עבור 150 העובדיס. בזבוז צפוי זגה מחייב אותנו למצוא פתרון אחר. נוכל כבר עכשיו לומר, כי אין פתרון אידיאלי לבעיה מסוג זה, אולס יש דרכים המציעות לנו פתרונות מספקיס וסביריס. דוגמה לביצוע ערבול לפנינו משימה: עלינו לכתוב תוכנית לבית ספר בו יש עד 1000 תלמידים. לכל תלמיד יש מספר תעודת זהות בן 7 ספרות. בדוגמה הקודמת קבענו כי השימוש במספר תעודת הזהות אינו פתרון טוב לבעיה. למרות ואת, נוכל להשתמש למשל, בשלוש הספרות האחרונות של תעודת הזהות כמפתח. לדוגמה, כאשר תלמיד יבקש את מאזן ציוניו, הוא יציין את מספר תעודת הזהות שלו. המחשב יבודד את שלוש הספרות האחרונות של המספר, ובעזרתן ישלוף את הנתוניס של התלמיד. נציג זאת בעזרת אלגוריתם מילולי: התחלה הצגת הודעה המבקשת את מספר תעודת זהות של התלמיד קליטת המספר לתוך המשתנה צ5א. (1000 ,צ=א)ססוא = (צשא) הדפסת (צ5א) סוף ננתח את מהלך האלגוריתס: הצגנו הודעה המבקשת את מספר תעודת הזהות ואחר כך קלטנו אותו לתוך המשתנה השלם צפא. בעזרת הפונקציה 05 חישבנו את השארית של חלוקת המספר צ=5א ב-1000. בעשותנו ואת בודדנו את שלוש הספרות האחרונות של מספר תעודת הזהות. כל שנשאר לנו לעשות הוא ילגשתיי לאיבר במערך הציוניס המכיל את ציוני התלמיד, וכמובן, בעזרת המפתח שחישבנו. הכלי שבעזרתו אנו מסיביס מפתח לכתובת נקרא פונקציית ערבול (0חהוה3435 הסוסס6חט)). בדוגמה זו הפעלנו את הפונקציה ססו בתפקיד של פונקציית ערבול. הטבלה הבאה מציגה את הפעולה שביצענו: 6 פסקל מהצעד הראשון - מהדי 2 מספר תא מספר ת.ז. 000 0 20011 1 0 2 "77 107 08 9:08 12009 1.09 מכל מספר תעודת והות אנו "מקצצים" את ארבע הספרות העליונות ומשתמשים בשלוש הספרות התחתונות (מימין) לצורך שליפת הנתון מתא מסויס. לשיטה זו חיסרון גדול, שנסביר אותו על ידי שאלת: האס שני מפתחות סידוריים, (למשל, 1+₪א ו-2צםא) שאינס שוויס (2צ₪א < > 65+1א) יכולים לגרום לפונקציית הערבול לדווח על תוצאה שווה (כלומר, (2צם5א)4 = (1צ5א)). התשובה היא - כן! לדוגמה, שני מספרי תעודות הוהות 3941559 ו-1957559 ייצרו את אותה תוצאה של פונקציית הערבול שהשתמשנו בה קודם, מכיון ששלוש הספרות האחרונות שוות בשני מספרי ואהות אלה. למצב בו הפונקציה מספקת תוצאה שווה למקרים שונים אנו קוראיס התנגשות - חסן601!!5. ניתן להפחית את סיכויי ההתנגשות על ידי הגדלת טווח הערכים. כלומר, להשתמש למשל, בארבע הספרות של מספר הזהות במקוס בשלוש. דבר זה מקטין את הסיכוי להתנגשות, אולס הוא ייאלצ אותנו להקצות שטח עבודה (איבריס) פי 10 יותר גדול. וזהו חיסרון גדול מאוד של השיטה הזו. אף על פי כן, כאשר ניתן להשתמש בשיטה זו, רמת הטיפול בנתוניס היא הטובה, המהירה והיעילה ביותר. נספח א: ערבול (בַחוח₪335) | 177 תרגיל במפעל עשרה עובדיס שלכל אחד מהס יש מספר עובד המייצג אותו. מספרי העובדיס הס: 7 ,452 ,879 ,123 ,533 ,987 ,436 ,190 ,975 ,636 רשימת עובדיס וו מנוהלת בטבלה בת עשרה איבריס בתחוס 0..9. חשב לפי פונקציית השארית (10 ,ץםא)ססא = (צשא)ח5ה את הכתובת של כל עובד. מפתתח כתובת מחושבת 07 72 9 13 3 07 56 100 5 56 0000090000 00 4 על-פי טבלה זו ניתן לראות כי מספר ההתנגשויות הוא שלוש (המספר 7 מופיע יותר מפעס אחת, המספר 3 מופיע יותר מפעס אחת והמספר 6 מופיע יותר מפעס אחת - סהייכ שלוש). כדי לפתור את בעית ההתנגשות נגדיל את טווח הטבלה ל-100, כלומר תחוס האיברים יהיה 0..99. כעת נחשב את הכתובת על פי הפונקציה (100 ,צםא)ססא = (צםא)ח5גה. לפי פונקציה זו נקבל: מפתח כתובת מחושבת 5077 7 472 2 19 9 13 23 3 3 17 7 8 פסקל מהצעד הראשון - מהדי 2 6 15606 00 10 5 5 56 56 כך הגדלנו את הטווח והקטנו את הסיכוי להתנגשות. על פי טבלה זו אנו רואיס שישנה התנגשות אחת בלבד: המספר 36 מופיע יותר מפעס אחת. לבעיה שהצגנו כאן אין פתרון טוב באמצעות פונקציית הערבול שהשתמשנו בה, כי גס הפעס נאלצ להכפיל את טווח הטבלה פי 10 כדי לקבל את התוצאה המבוקשת - אי התנגשות. דרך זו אינה מעשית, מכיון שעלינו להשתמש בעשרה איבריס בלבד מתוך 1000, וזהו בזבוז רב. לשס כך משתמשים בפונקציות ערבול אחרות, יעילות יותר. פונקציות ערבול נוספות כפי שגה עתה ראינו, פונקציית ערבול שבה אנו משתמשיס במספר ספרות מתוך ערך נתון (לדוגמה, מספר תעודת זהות) לוקה בחסר. לרוב, נוצר מספר גבוה של התנגשויות ביחס לכמות הנתונים. לשס כך עלינו לפנות לפתרונות חלופיים שינסו לתת תוצאות טובות יותר. תוצאת האלגוריתם שנפעיל צריכה ייליפוליי בתחוס המספריס שהקצינו (כמו לדוגמה, 10, 100 או 1000). לפנינו מספר דוגמאות לפונקציות ערבול: פונקציית ריבוע: בטכניקה זו אנו לוקחים את המפתח, מעלים אותו בריבוע ושולפיס מתוכו שלוש ספרות. לדוגמה, כאשר נתון המפתח 4567 ונעלה אותו בריבוע, נקבל 2087489. כאשר הדרישה תהיה ליצור מפתח בן שלוש ספרות, נוכל לבחור את הערך 874 מתוך המספר המחושב 2087489. באופן דומה היינו יכוליס לשלוף ספרה מהסוף ושתי ספרות מההתחלה, או כל צירוף אחר שבעורתו נוכל למנוע התנגשויות. פונקציית שינוי בסיס: נוכל לקחת מפתתח נתון ולהמיר אותו לבסיס אחר. לדוגמה, נחליט כי את המספר הנתון (בבסיס 10, כמובן) נמיר למספר בבסיס 8. בדרך זו, מפתח שערכו 137 בבסיס עשרוני יהיה 211 בבסיס שמונה. נספת א: ערבול (טַחוח335) | 179 פונקציית קיפול: פונקציה גו 'ימקפלתיי מספר (מפתח) נתון לשנייס (או יותר). כיצד עושיס ואת! נאמר כי המפתח הוא 149625. נחלק את המספר הזה לשני חלקיס: 625 - החלק התחתון של המספר ו-149 - חלקו העליון. עתה נחשב את סכוס שני החלקיס: 5 9 24 בצורה זו קיבלנו ערך חדש, 774. נבחן דוגמה נוספת: נתון המספר 3917238123. נחלק אותו לארבעה חלקים: 3, 238, 917 ו-003. נחשב את הסכוס הכולל: 13 8+ 17 3 121 המפתח שקיבלנו הוא 1281. אס היו מגדיריםס בפנינו כי תחוס המפתח הוא 9 היה עלינו לחזור שוב על תהליך הקיפול, כדי לקבל תוצאה קטנה מ- 9. במקרה החדש היינו מקבליסם את המפתח 282. שלוש הפונקציות האחרונות שהצגנו מדגימות טכניקות שונות למניעת התנגשות. חוקריס בתחומי המתמטיקה ומדעי המחשב מנסיס למצוא פתרונות שוניס לבעיה. לדוגמה, קיימת שיטות הנקראות 686 ו-5600% שבעזרתן ניתן להקטין את הסיכוי להתנגשות עד לרמה סבירה. למרות זאת, ביצוע תהליכיס כאלה דורשים זמן עיבוד רב. לכן, כאשר אנו בוחריס בפונקציית ערבול כלשהי, עלינו להחליט אם היא מתאימה, ואס כדאי להשקיע מאמצים בפיתוחה. יש לדעת, כי מספר ההתנגשויות אינו קשור דווקא לפונקציית הערבול, אלא לאופי מספרי הזיהוי (מפתחות), הפיזאור שלהס על פני טווח המספריס, צפיפות ועוד. נושאיס אלה חורגיס מתחוס הדיון שלנו, ואנו משאיריס ואת כאתגר לקורא המתעניין. 0 פסקל מהצעד הראשון - מהדי 2 נספח ב פתרונות לתרגילים פרק 2 תרגיל 2.1 ;30111 ד החהזססוק זה ;סח :5,060 ,₪ ;₪68 :| ך חו0סם ;(':(0 ,8 ,ה) 5זססרחטח 66זחס זססחם') הוססוו/ ;(6 ,8 ,ה) ח|₪680 ;3 / (6₪ + 5 + ה) =: ושסד ;( סד ,' = 650|6א') חוססוו/ .0 תרגיל 2.2 ;30112 ד החבזססוק זה חן 6% חו69ם ;(' :(6 ,8 ,ה) 5ז6סרחטח 66זחש זססחם'") הוססוו/ ;(6 ,8 ,8) ח|₪680 ;((6 + 8) סו 2 ,' = %|650ח') מוסטח/ש 0. נספח ב: פתרונות לתרגילים ‏ 181 תרגיל 2.3 תרגיל 2.4 תרגיל 2.5 ;30113 ד ובוסוק זה ;|₪68 : חו9סם ;(':5ח0ף חו %חסו6עש זססחם') הוססחו/ ;0 * / =: / ;(\ ,' :5רחחפזף חו %ח0ו6//") חוססחו/ .0 ;304 ד הההּוטסיוס זפ ;|₪68 6% חו9סם ;(':(0 ,5 ,4) 65ט|הע |68ז 66זח+ חו ס6קעד') מובטוחש ;(6 ,₪ ,ה) ח|₪680 ;((6 + 8 + ה) , = ה 50') חובטח/ ;((6 * 8 * ג) ,' = הסם6ב|קטוטוז') מוסטחצ ;((3 / (6 + 8 + ב)) , = 6סבזסע') חוססחו/ .0 ; פ!וסזז3 ד הההזססוק זה |₪68 :₪ חו9סם ;(' :זססוחגוח 3 זססחם'") חוססוזו/ ;(₪) ה|₪680 () * ח =: ₪ ;(₪ , :6טע 6/0560 סחחד') חוססוו/ .0 2 פסקל מהצעד הראשון - מהדי 2 תרגיל 2.6 ;3016 ד הההזססזוס זפ סח 6 חו9סם ;(':6ט!פע 3 חו ס6קעץד') חובסחו/ ;(1) ח|₪680 ;(10 ססר 1 ,' וסוס אוס 1') חוססוזו/ (10 טום 1 ,' שופוס חפורו') חוססוז .0 תרגיל 2.7 ;7וו0זז3 ד החבּזססזוק זה ; |₪68 :₪ חו9סם ; (':6ט]הע |ה6ז חו סקעד') חוססוזו/ ;(₪) ה|₪680 ;(ח) 05 =: ₪ ;((₪) זפ ,' = 6זהטוס5') חוססוו/ ;((₪) +וף5 ,' = זססז 6זהוס5') חוססוו/ .6 תרגיל 2.8 ;3018 ד ובוסוק זה 687 :6 חו9סם ;(':-ז8ח6 016חו5 3 חו ס6קעד') חוססוו/ ;(ח6) ח|₪680 ;((ח0) זט , 5 ' ,ח6 ,' ₪ 6טופ/ 45611 שחד') הובסוז\ .0 נספח ב: פתרונות לתרגיליסם 183 תרגיל 2.9 ;9וו0ז3 ד ובוסוק זה 687 :6 חו9סם ;(':-ז8ח6 016חו5 3 חו ס6קעד') חובסחו/ ;(ח6) ח|₪680 ;(1 + (ח6) 0ז0ס) זה =: 6 ((ח6 ,' 15 90/6 5011 חו זהּח6 אאסאז') חוססוזו/ .0 תרגיל 2.10 ,10וסזה ד הההזססזוק זה |₪68 :₪ חו9סם ;(':6!פע |68ז 3 חו 6קעד') חובסוזו/ ;(₪) ה|₪680 ;((₪) 86 ,' 5 ' ,₪ ,' +0 ח18600 סחד') הובטסוז\ .0 תרגיל 2.11 ;11| הד הההזטסזום זה ;₪68 :526 ,1 ,\ ,חח חו9סם ;(':(1 , ,ר) 6006 3 06 5הסופח6חו0 66זח+ זססחם') הובטסוז/\ ;(1 ,\ ,) הו680 ;| * / * ₪ =: 5126 ;(5126 ,' 5! 6006 6+ +0 שוחט|סע שחד') חוססוזו/ .0 4 פסקל מהצעד הראשון - מהדי 2 תרגיל 2.12 ;2 ותהזףסזוק זה |₪68 :₪ חו9סם ;(':6!פצ |68ז 3 חו 6קעד') חובסוזו/ ;(₪) ה|₪680 ;(₪)%ח1 - ה =: ₪ ;(₪ ,' = ח18600 סחחד') חובסוז/ .0 תרגיל 2.13 ,33 ד וההזףסזוס זפ סח 6 חו9סם ;(':8106/ ז0סססחו חב חו ס6קעד') חוססוזו/ ;(1) ח|₪680 ;((1) 05 צוס 1 ,' :050|6ח') חוססוזו/ .0 תרגיל 2.14 ;14!ו0ז3 ד ההזססזוס זה זז :םוא זז :סוכ | :]60/6 | חו9סם ;7 =: זססוחטא ;5 ו ז6סוחטא =: 5וסזכ) 5 00 זוחא =: ז60/0 | ;(5קטסז6 ,' :5קטסז 01 זססותטאז') חובסוז/ ;(ז6006 ] ,' :קטסזם 3 +טסרשוו %ח50006') חובסוז/ .0 נספח ב: פתרונות לתרגיליס 185 פרק 3 תרגיל 3.1 תרגיל 3.2 תרגיל 3.3 ;30111 ד החבזוססוק ז ;חן 0% ;0068 ו חו9סם ;(':8]065/ זס06ססחו 6סזרש חו סקעד') חוססוזו/ ;(6 ,8 ,8) ח|₪680 (0 = 8) זס (6 = ג) זס (8 = 1) =: ₪506 6500 ,' = %|050מ') חוססחו/ 0. ;3012 ד החבזססוק ז חן 6% ;0068 ב חו9סם ;(':8]065/ ז06ססחו 6סזרש חו 6קעד') חוססוזו/ ;(6 ,8 ,ג) ח|₪680 ;(0 > 8) 0חה (2 > ג) =: )טפס 6500 ,' = 050|6ג') חוססוו/ .0 ;30113 ד החהזססזוס זה חן 41 ;0068 ו חו0סם ;(':8!65/ ז600סחו סט חו ס6קעד') חובסוזו/ ;(5 ,ה) ח|₪680 ;(0 = 5) 0חה (0 = ) =: ₪650 ;6500 ,' = 050|6ג') חוססוו/ 0. 6 פסקל מהצעד הראשון - מהדי 2 פרק 4 תרגיל 4.1 ;1 זב ד הוהבזססזוס זה חן :ח ,/ חן 41 חו9סם ;(':( ,\) טוח ,הססוצו. זססחם') הוססוזו/ ;(3 ,\) ה|ו₪680 0 3 0 1 =:ג הס חופסם 00 ) 0 1 =:5 הס ('*') סוז/\ ; חוססח/ 7 .0 תרגיל 4.2 ;92 הסוס זפ ;|₪68 :₪ ;₪68 >656חזב | זז 6 ;7 :6 חו9סם ובי 1 ;0 =: ז55ס0ָה | 0 10 0 1 =:1 הס חו60ם ;(' :6!פע )אס זססחם") הובסוז/ ;(₪) ה|₪680 חס 70650 1 < () ₪86 ו ;(₪) ₪786 =: 0055ב | ו (870650 1 ,' = ח118600 30656 |') חוססוז/ ;('?חו303 668% סז %חהצו טוסץ סכ') חובסחו/ (ח6) ח|₪680 ;'א' = ה0 |סחט .0 נספח ב: פתרונות לתרגיליסם 187 תרגיל 4.3 ;3|וז בד הוהבזססזוס זה חן 41 חו0סם 0 ;(':6ט!8ע זססחם") חוססחזו/ ;(8) ח|₪680 ;(100 => ) 0חה (1 =< ) |סחט 0 25 00 1 =:8 הס ;(") חוססחו/ 0 ;(':0655 זוטסץ ז0סח6 ,2 זסעבוק') חוססחזו/ ;(5) ח|₪680 חסוץ ה < 5 )!| ;('. חפוח ססד') חוססוז חסו" ה > 5 )| ;('.שוס! ססד) חוססוז/\ ;5 = ₪ |סחט ;('!!! 0000 ע7ז6/") חוססוזו/ .1 תרגיל 4.4 ;31014 ד ובוסוק זה ;חן 41 חו60ם ;(':8!65/ ז06ססחו סט חו ס6קעד') חוססוו/ ;(5 ,ה) ח|₪680 חסרט ₪ = זו ('!!! והוסם'") חובסחזו/ 6 ;('1!! 603 זסאז') חובסחו/ .0 8 פסקל מהצעד הראשון - מהדי 2 תרגיל 4.5 ; פ!וסזה ד ההבזססזוק זפ זז 6 חו9סם ;(':6ט|8/ ז0סססחו חב חו ס6קעד') חוססחו/ ;(1) ח|₪680 ;('80?') חוסזח/ הסור 0 = זו ;(=א') חוסטו/\ חסו0 1 = זו ; ('ס/ד') חוסזח/ חסו0 2 = זו ; ('=םחחד') הוסוח/ חסרש 3 = זו ; ('₪(00-') הוסטח/ חסו0 4 = זו .0 תרגיל 4.6 ;3016 ד החבזססזוס זה חן 6% חו69ם (':8|65/ ז6006סחו 66זחס סקעד') חובסוו/ ;(6 ,8 ,ה) ח|₪680 חסוס (6 => ג) בח (₪ =< ה) ןו ('0') חובטהו/ 6 ;('0 דסא') חובטוזו/ .0 תרגיל 4.7 ;7וו0ז3 ד החבזססזוק זה | :ססהט00 ,3 ,1 חו0סם (':5סט!פע חחח 0ח3 צוס| 6 חו סקעד') חוססוזו/ ;( ,1) ה|₪680 החסו> 3 > ]| + (זח ו 00) חוססו/ 0 ₪4 60 / =: זסשהטס60 זס+ 6 ; זה ו00) הוסו/\ 0 סשהאוסם ]1 =: זס)הטס6 זסז .60 נספח ב: פתרונות לתרגיליס 189 תרגיל 4.8 ;3018 ד ובוסוק זה | :ססהט00 ,3 ,1 חו9סם ;(':65ט!ה/ חףוח סחה צוס! 606 סקעד') חובסחו/ ;( ,1) ה|₪680 ;זז ט0ס) חוססוו/ ₪0 4 סש ] =: זססהטס6 זס+ שורה זו לא תתבצע אם הח < ]4+ ; (זחו00) הוססחש ₪0 סשחאוסם ] =: זססהטס6 זסז שורה זו לא תתבצע אם ₪3 > ]4+ 0. תרגיל 4.9 ;9וו0ז3 ד ההבזססוס זה 7 1 חו9סם ;(': (חפוח ,צוס!) 65ופצ זס60סחו סט חו סקעד') חובסוזו/ ;(5 ,ה) ח|₪680 0 ;(ה) חובסחו/ 1: + 3 =: ה ;₪ = ₪ |סחט .0 תרגיל 4.10 ;10!ו0ז3 ד ובוסוק ז :ןבס ד ,טס ;68 :₪ חו9סם 0 00 1 =: זס6חט60 זס+ חופסם ;0 =: |%0 ;(':6!פצ |68ז 3 חו 6קעד') חובסוזו ;(₪) ה|₪680 ;1 + |₪סד =: | סד חסחץ 0 <> (₪) 86זה + ]יו ;((0%ד ,' :6060 פסט!פע ]0 זססותטז') חובטסוז/ .0 0 פסקל מהצעד הראשון - מהדי 2 תרגיל 4.11 ;311 ד הטסוק זפ זז 6 חו9סם ;(':6ט81/ ז00ססחו חב חו ס6קעד') חובסחזו/ ;(1) ח|₪680 ) *1 =:1 חש 1>0 ו ;2 , :סטופע ססט|ספטג'") חוססוזו/ .0 תרגיל 4.12 ;2 ותהזףסזוס זה סז 41 חו0סם ;(':65ט!הע סט חו ס6קעד') חוססוזו/ ;(5 ,ה) ח|₪680 חסול 5 < ג + ( ,' :15 6ט!/ זפסחזבּ| סחד') הובטחו/ חס ה < ₪ )ו ;(₪ ,' :15 6ט|/ זפסחזב| סח ד') חובסחזו/ .6 תרגיל 4.13 ,13וזה ד הההזףסזוק זפ סח 6 חו9סם ;(':6ט81/ ז00ססחו חב חו סקעד') חוססוזו/ ;(1) ח|₪680 חר 0 = 2 0סו 1 זו ('!!! 6ט|פע הסעם') חוססחו/ 56 ;('!!! סטוהע 000') חוססחו/ .0 נספח ב: פתרונות לתרגיליסם ‏ 191 תרגיל 4.14 ;.14!ו0זה ד הההזףסזוס זה 687 :6 חו9סם ;(':-ז8ח6 016חו5 3 חו ס6קעד') חוססחו/ ;(ח0) ח|₪680 זס (('7' => ח6) סחה ('ה' =< ח0)) זו חס (('?' => ח0) סחה ('פ' =< ח0)) ;('1!! זהח0') חובסוו/ .4 תרגיל 4.15 ;15!ו0ז3 ד ההבּזטסזוס זה ;|₪68 6% ;]₪63 | :תוסכ חו9סם (': ח0 680 6 זס1 פזסטרחטח |68ז 3 חו סקעד') הוססוז ;(6 ,₪ ,8) ח|₪680 ;> * ב * 4 - (8) זס5 =: סוסס הסט 0 =< ה0וסכ זו חופסם ;(06|03) 50 + 5- =: ₪1 ;(06|3) ף5 - 5- =: ₪2 ;(1 ,' = 1 זססז') חוססוז/ ,(₪2 ,' = 2 זססז') חוססוז/ 0חס 56 ('.005 306]ו68|6 %+0חח08") הובטוז/ .0 תרגיל 4.16 ;16ו0ז3 ד הההּזטסזוס זה ;|₪68 6% חו9סם ;(': החוטהשו] 06 זס1 5סט!פע ₪6 חו ססעד') הובסוז\ ;(5 ,ה) ח|₪680 ;((5) ]50 + (8) זס5) 5 =: 6 ;(6 , = ז760") מוסטוזש .6 2 פסקל מהצעד הראשון - מהדי 2 תרגיל 4.17 ,17!ו0ז3 ד הההזףסזוק זפ וו :ה חו9סם ;(' :5| 0|6ח3 שחד') שטוו ;(8) ח|₪680 חס (180 > ג) חב (0 < ג) זו חופסם ; ('זווית חדה') ח|סזחו/ הרש 90 > ג זו ; ('זווית ישרה') חוספוו\ חסרט 90 = ( זו ;('זווית קהה') ח|ססוו/ חסרט 90 < ג זו 0חס 566 ;('זוויית שגויה.') חוסטחו/ .0 תרגיל 4.18 ,18ו0זה ד הההזססזוס זפ זז 6 חו9סם (':6ו|הע ז06ססחו חה3 סקעד') חוססוזו/ ;(1) ח|₪680 1 ;(10 00 1) בסוזו/ 0 1 =: [ ;0 = 1 |טחט .0 תרגיל 4.19 ,9 הד הטסוק זה 687 :6 חו9סם ;(':-86001זהח6 3 חו סקעד') חוססוזו/ ;(ח6) ח|₪680 60 0856 ;(שוסוכ') חוססוז/ :'פ'.. "סי ;('"6! |ב%וק68") מובטוזצ :'ל'..'תי נספח ב: פתרונות לתרגיליסם ‏ 193 ; ('606! |וברח5') חובטז/ש :'ל'..'ה' ;('סו|הצח1') ח|ססהו/ - 656 ו .0 פרק 5 תרגיל 5.1 ;1ו זה ד והסבזטסזום זה ;106 :קסד ,6 ,5 ,₪ חו9סם (':65ט]8/ 66זחס זססחם") הוססוזו/ ;(6 ,8 ,8) ח|₪680 חסוט 5 < ג + חופסם ;4 =: קוחסך 5 =: ה ;קוחד =: 5 יו ח6ו 6 < 8 זו חופסם ;5 =: קוחסך 6=: 8 ;קוחד =: 6 יו חסחש 5 < ג + חופ6ם ;4 =: קוחסך 5 =: 4 ;קוחד =: 5 ]יו ;(0 ,' :6ט!פע ז5סח8והז') חוססחו/ ;(8 ,' :ס6ט]ה/ 6ס3זסעה') חוססוזו/ ;(ה ,' :סט]הע 6פסאוס 1') חוססוו/ .0 4 פסקל מהצעד הראשון - מהדי 2 תרגיל 5.2 ;30112 ד החבזססזוס זפ סח :א חו0סם ; (א) ח|₪680 1-8 ;(10 טס )ז) חובטוז/ 0 0 א =: א ;0 = א |סחט .0 תרגיל 5.3 ;30113 ד החבזססוק זפ חן 6% ;|₪68 :₪ :60 חו9סם =: 3 (0=: 5 0 6 00 100 0 1 =: הטוס זס? חופסם ;(' :6ט!8ע צוסח זססחם') חוססוז ;(₪) ה|₪680 1 + ה =: ג חס 0 <> (5) זחז זו ;1 + 8 =: 8 הסור 0 <> (5) 86 זו 6.1 =:6 חסםס 0=₪ !ו יו ((8 ,' :6ט]ה/ ז000לחו 060ט[6ח1 פסטוב/") חוססחו/ ;(5 ,' :ח18600 60 סט|6חו פסטוה/") חובסוז/ ;(6 ,' :2670 %0 |6008 פסט1ה/") חובטוזוש 0. נספח ב: פתרונות לתרגיליס 195 תרגיל 5.4 ;3014 ד החבזססוס זה ;|₪68 :₪ :60 חו9סם 0 =: |פסדך 0 10 0 1 =: ז60חטס00 זסז חופסם ;(':6ט!8/ ושח זססחם') חוססוז ;(₪) ה|₪680 ;(₪) ₪786 + |ה%סד =: |טסדך ]יו ;(|סד ,' :6טופע |בזסד') חובסוו/ .0 תרגיל 5.5 ; פ!וסז3 ד הההזססוס זפ ;לח :|סד ,5 ,₪ וז 0 חו9סם ;(' :65ט!8/ סע זססחם') חוססוזו/ ;(5 ,ה) ח|₪680 ;0 =: |סדך 0 48 60 1 =: זסזהטס60 זס+ ;5 + |ססך =: |ססדך ; (|0%3ס , סטןהע |בססד') חוססוזו/ .0 תרגיל 5.6 ;3016 ד החבזססזוק זה ;|₪68 :וססד ,₪ חו9סם 0 =: |ססך 6 פסקל מהצעד הראשון - מהדי 2 ו ;(':8!6/ |68 שח זססחם') חוססחזו/ ;(₪) ה|₪680 ₪ + |גשסד =: |ססד 0 = ₪ |סחט ;(003ס ,' 6טופע |בזסד') חובסוזו/ .0 תרגיל 5.7 ;30117 ד החהזססוס זפ 687 :6 וו :סד חו9סם ;0 =: |סדך 0 (ח6) ח|₪680 ;1 + |הסך =: |שססד חסו אי = ח6 זו %.' = הח |סחט ; (|0ד ,' = זס%חט00') מוסטחז/ .0 תרגיל 5.8 את הכנת תרשים הזרימה אנו משאירים לך כאתגר אישי. פרק 6 תרגיל 6.1 ;30111 ד החבּזססזוס 0% ;0 = |₪68 :סד זפ זז 6 ;(ז0606ח1 : 8|06/) 00/3|06 6זטוססססזוס חו9סם ; 8]06/ + |גססד =: |טסד 0 נספח ב: פתרונות לתרגיליס 197 חו9סם 0 סט 1 =: 1 זסז חופסם ;(1 ,' ]סרח 500060% 01 >'והרח זססחם") הובסוז ; () ח|₪680 ;() 00/3806 יו ;(10 / סד ,' = 6סַבזסע') חוססוזו/ .0 תרגיל 6.2 ;30112 ד החבזססזוק זה סז :א ;(06061ח1 : ₪ ,) 1000 0חו= 6זטוססססוס חו9סם חסחש 5 < ג + (ה ,' :ז000ום') חוססחזו/ 6 ;(5 , :7ז0006ום') הוססחזו/ 0 חו9סם ;(':65ט!8/ סע זססחם'") חוססוזו/ ;( ,א) ח|₪680 ;( ,א) 10001 0חו= 0. תרגיל 6.3 ;30113 ד ההבזססזוס יב ;0 = ז0000ח1 | :6ט|50/8ה | זה סז :]השס ((ז0606ח1 : א) 66%ה סטוססססוק חו9סם חסוץ 0 < א + חופסם חס 050/8!06 | > א + ('! 6טוהע סו|העחו ,זסזזם') הוססוזו 8 פסקל מהצעד הראשון - מהדי 2 תרגיל 6.4 56 | 25/3806 := ; יו 0 חו0סם 1-8 ;(':6ט!8ע צוסח זססחם') חוססחו/ ; (8]06/שו6]) ה|680 ; (06]ה/ש6]) 666% ,0 > 6ט]ה/ששסא |וסחט .0 ;31014 ד החבזססוס זפ חז 6% זז | ;א 6וו60ססוס חו9סם ;(':(0 ,₪ ,ה) 65ט|/ 66זח זססחם') הוססוו/ ;(6 ,8 ,8) ח|₪680 0 ; ז006חו : (ז6606ח1 : ץ ,א) 0ום הסטסחטם חו9סם הסח ץצ < א + א =: 50 56 ;+ =: 500 0 ;0וסחו= 6זטו0סססזום זפ זז | חו9סם ? מציאת הערך הגדול מבין שני הערכים הראשונים 4 ;(₪ ,ג) 800 =: טב | ?; מציאת הערך הגדול מבין שני אלה שנבחנו עתה וערך נוסף + ;(0 870656 ]) ₪0 =: זפסְטָזהב | ;(0650זה ]) חוססוו/ 0 נספח ב: פתרונות לתרגיליסם 199 חו9סם 4% ;0וחו= .0 תרגיל 6.5 200 ; פ!וסז3 ד ההבּזססוס זפ וו :5 ,5 ,₪ ;1060077 : זססות1855 הסטסחנם זפ תח :א חו9סם ;(':00ח56 ח! 6!35565 +0 זסטוחטח 6 זססחם") הובסוז/ ; (א) ח|₪680 ; =: ]635500 0 ;16 : ססות 500605 הססטסחנם זפ תח :א חו9סם ; (':501060%5 01 זססוחטח 6 זססחם) הובסוז/ ; (א) ח|₪680 ; =: ז006ט05%ח5006 0 ; (ז%606ח1 : זססוחטצ1) טסח5וחה) 6זטוס0ס6סזוס זה 7%: 17 |₪68 :|סך חו9סם 0 =: |פססך 0 ז6סוחטא %0 1 =:1 זס) חופסם ; (':>זהרח /וסח זססחם') הוססו ; () ח|₪680 ; (ז6טוחטא / א) + |גססד =: וטסד ]יו ;(09 ד ,' :6855 01 6חָהז6/) חובסוז/ 0 פסקל מהצעד הראשון - מהדי 2 חו0סם 0 זססו 0855 סט 1 =: ג זסן חופסם 500065 =: 65ה50106 ; (500060%5) עסחפוח) יו .0 תרגיל 6.6 ;3016 ד החבּזססוס ז ;|₪68 1 ,א ;₪8 : (|₪68 : 6 ,5 ,ג) 6 הסטסחטם ז |₪68 :קוחד חו69ם ;**4 - (5) זס5 =: קוחסד חסו 0=< קוחד +ו (קה 6 ד) +50 =: וטס 56 ;1- =: הזוס 0 חו9סם ;(':-ח0ו60/8555 6זה 5 01 5%80%05ח60 66ח+ זססחם') הוססוו/ ;(2 ,ץ ,א) ח|₪680 ;((2 ,ץצ ,א) הזוס ,' = סוסכ') חוססחו/ .0 תרגיל 6.7 ;310117 ד החהזססזוק ז תח :א 1 : (ז0606ח1 : 6טו/) וס 68161 הסטסחטם זה סז :קוחד חו9סם ;0 =: קוחסך 1-8 ;(10 ססוח 6ט!8/) + קוחסד =: קוחסד נספח ב: פתרונות לתרגיליסם 201 תרגיל 6.8 תרגיל 6.9 ;10 /01 6ט!8 =: סטן8 ;0 = 6ט|8/ |מחט ;קוחד =: 6ט|68|6/3 0 חו9סם ;(':6ט!8/ זססחם') חוססוו/ ; (א) ח|₪680 ;((א) 686070 ,' :005 ||3 )₪ הט5') חוסטסוז/ .6 ;31018 ד ההבזססזוק ;|₪68 : ₪1 הסטסחנם זה ;100 :א ;68 :|סס ד ,רהז חו9סם ;1=:א ;0 =: |סדך 0 ;( *א)/1-( +1(*4 -א))/1 =: חסז ;הח1 + |בזסד =: |גססד 1 + ח =: ח 1 > ותם6ס1 |סחט ;|ססך * 4 =: |שטסד ;|שססד =: וק 0 חו9סם ;וק ,' = וק') חוססחו/ .0 ;9וו0ז3 ד הההזססזוס זהָּ ;|68 | :אהד שחסחחעבק ;|₪68 :6% | ;((₪68 : 1 זפ ;|₪68 : ך ,ק) 6866 ס6זטססססזוס חו9סם ;(100 / ך- 1)*ק = | 0 2 פססקל מהצעד הראשון - מהדי 2 חו9סם ;('ץְהכן 0+ אבל חב +הסוהץהכ 5זסאוסעו זססחם') הוססוזו/ ;((אה ד ,)חסוחץ8ק) ה|680 16% ,אהד ,)חסחחעהק) 68|6 ;(160 ,' :ח60600ז 367 6% |בסס ד') הובטסוז/ .0 פרק 7 תרגיל 7.1 ; 30111 ד החהזססזוס זפ וו | חו69ם ;(' :6חחהח זטוסץ חו 6קעד') חובסוו/ ; (6חה) ה|₪680 ;(6ח8 ,' ,ץ08 ש6וח 3 שעהּח') מוסטוש .0 תרגיל 7.2 ;3012 ד ובוסוק זפ ,50 לבב חופסם 10% םח' =: 501 ;(502) ח|₪680 חס 50 = 501 זו ;('!!! סס) טסץ סש סוו6רו') חובסחו/ .0 תרגיל 7.3 ; 30113 ד ובוסוק זפ ;ו 5% זז : חו9סם (':0חו5 3 חו סקעד') חוססוזו/ (50) ח|₪680 ;('0ח5 6 זס+ הסטופסק 6 6כעד') הובטוז/ נספח ב: פתרונות לתרגיליסם 203 ; (ק) ח|₪680 5][(;‏ = [' ,= ,"5 מוסטחש .0 תרגיל 7.4 ;4|ו0מ+ החהוטסיוס זפ 5% 5; סח 6 ;>חוזק 6וו660סוס חו9סם 0 00)50ח1 %0 1 =:1 זס+ )5]1[, ' ?(;‏ סחז/ 0 חו9סם ;(':0חו5 3 6קעד') חובסוזו/ ;50) ח|₪680 שמחק .0 תרגיל 7.5 ; פ!וסזז3 ד ההבזססזוס זפ ;ו 5% וו : חו60ם ;(':0חו57 8 6קץד') חוססוו/ (50) ח|₪680 (':5)ורחו! סחו7ז5 6חס הורטוצ הסטופסכק 6חס זססחם') הוססוו/ ;(ק) ח|₪680 חס 50) הזח | < ק זו (ק , -- 6ט!פע סו|העחז') חוססוזו/ 566 ;([]5 , = [' ,= ,5') חובסוו/ .6 4 פסקל מהצעד הראשון - מהדי 2 תרגיל 7.6 ;3016 ד ובוסוק זפ ,50 לבב חו9סם ;(':0חו5 3 6קעד') חובסוזו/ ; (511) ח|₪680 חס 3 =< (501) 160% זו חופסם ;(2 ,1 - (000)50ח6 | ,1ו5) צְקְ60 =: 502 ;(502 ,' :0ח501 6 )0 687800015 סע 35% 1') חובסוז חס 56 ;('!!! דוסח5 ססס 5| 8חו50 :זסזם') הובסחו/ .0 תרגיל 7.7 ;7וו0זז3 ד החבזססוק זפ ;50 לבב זז : ;650 6 ו660סיוק חו9סם ;(':0חו5 3 6קעד') חוססוזו/ ; (511) ח|₪680 0 ;סו 6 וו60ססזוס חו9סם ;(501 ,' ') פסק =: ק ח%6 0= ק ןז 1 =: 502 6 ;(₪ ,1 ,501) ץ0ק60 =: 50 502 ,' :(סזסעו ץ|חס זס) %פזו=') חוססחו/ 0 חו9סם ו ;סו .0 נספח ב: פתרונות לתרגיליסם 205 תרגיל 7.8 תרגיל 7.9 ;3018 ד הההזססזוס זפ ;חו 5 5% :]₪650 ;סח | :זסתום חו9סם ; (':6ט]ה8ע 3 זססחם') חוססוו/ (50) ח|₪680 ; (זסזזם ]650 5) | חס 0 = זסזום זו ('!!! 06 15 סחור/הסעם') הובסחזו/ 56 ;([זסזום 5 ,' :זסזזם') מובסוש .0 ;9וו0ז3 ד ובוסוק זפ זז 6 ;ו 5% ;500 : (7ז0006ח1 : ג) 06ה|פחה ד הסטסחט זה ;0חו50 :5 חו9סם ;(5 ,4) 57 ;2 - (0%0)5ח6] =: 3 0 1 < ₪ 6וחש חופסם ;(8 ,5 % ,') 5675ח1 (3- =: 24 יו ;5 =: 5/8066חוך 0 חו9סם (':6ו!הע ז06ססחו ח3 סקעד') חוססוו/ ;(1) ח|₪680 ((6)50ז5!3חה וד ,' :50|6סג') חוססוו/ .6 6 פסקל מהצעד הראשון - מהדי 2 תרגיל 7.10 ;1 30110 ד חחפּופסוס זפ זז 6 1 : (ז0606ח1 : ג) 6טו/|בזס ד הסטסחנם זפ ;ו :502 ,561 ;סח | :|מססד ;סח | :זסחום זז :ו חו9סם ;(501 ,8) 57 ;0 =: |סך 0 (501) ה0%ה16 סט 1 =: ג זס+ חופסם ;1 =: 52 ;(זסזום ,6ו|הּ/ ,2ז5) ו3 ;6 + |פססד =: |ססדך ]יו 0 חו9סם ;(' :(0 חהח) ז306!) 6|פע זס00סחו חב זססחם') הוססוו/ ;(1) ח|₪680 ;((1/8!06)1לס ד ,' :0105 || 06 ההט5') חובסוז\ 6. ;2 30110 ד חחפוטסיוס זפ תח 6 ;5 5% חו9סם ;(':6!פע שחו חב זססחם'") חוססוזו/ ;(1) ח|₪680 ,0 ) 57 0 1 ס6חאוס 50) ה00ח6] =: 1 זס+ ([5%1) שסוו/\ .6 נספח ב: פתרונות לתרגיליסם 207 תרגיל 7.11 ;31 ד הההזטסזוס זפ ;חן ב ;50 : (8חו50 : 5) 0חו5650 הסטסחנם זפ זז :א 17 חו0סם 2 =:1 0 1 - (5) ו00ח16 > 1 6ווח/ו חופסם ס [1 + 511 = [5]1 6!וח/ע 1(;‏ ,6) 60| ,+ =:1 יו ;5 =: 0חו56%5 0 חו9סם ;('-0ח5071 3 זססחם') חוססוו/ ;50) ח|₪680 ;((ל56%507100)5 ,' :0חו5') חוססוו/ .0 תרגיל 7.12 ;2 ותהזףסזוק זפ ;ו :1 ,51 קוו 6 חן :חס | רז 6 זז 5 | | :01656ח5 חן | :6סְאַהזה/ה חו9סם ;(':0חו57 3 6קעץד') חובסוו/ ; (511) ח|₪680 ;(511) ח0%ח16 =: חס | 8 פסקל מהצעד הראשון - מהדי 2 0 =: חס 5 =: 01005%ח5 ;0 =: 065%חס | 0 0 < 50) ה00ח16 6ווח/צ חופסם ;(501 , ') 5סק =: 1 (2, ,51) 000 =: 502 ;(1, ,51) 60| ;1 + 000008 =: ]חס חס (502) ה0%ח6] > 656פחס | )זו (502) ה0%ח6 ]= :065%חס | חס (502) ה0%ח6 | > +פסלוסח5 זו ;(501) 600% 650:=1+סח5 יו ? אורך מילה ממוצע = (אורך כולל - מספר רווחים) / מספר המילים במשפט + תרגיל 7.13 חס / (1 - זססהטס6) - ח6] =: 06הזהעה ((ח 16‏ ,' :ה00ח6! פחו5') הוססחו/ ;(זח 00 ,' :(5) ]סע ]0 זססותטוצז') חהוססוו/ ;5001650 ,' :סזסע 65%וסח5') חוססוזו/ ((650חס ] ,' :סזסצו 865%ח0 1') חוססוזו/ ((87806/ ,' :סזסשט ]0 ה0%ח6! 6חהזהעהי) הובסוז\ .0 ,13וזה ד הההזססזוס זפ ;ו 5% סח 6 חו9סם ;(':0חו57 3 6קעד') חובסוו/ (50) ה|₪680 0 ;50 ,'[רווח כפול]') 5סק =: 1 חסוט 1<0 )ו ;(1 ,1 50) 6!6%6 ;0 = 1 |טחט חסוט ''= [511 + ;(1 5) 6!6%6 נספח ב: פתרונות לתרגיליסם 209 חסום '' = [050ו80ח6 571 זו ;(1 ,(00)50ח6 1 5%) 606וסכ ;50 , :0חו50 עוסא'') חוססחזו/ .0 פרק 8 תרגיל 8.1 ;30111 ד החבזססזוס זה 06 [1..10] שפזובּ :ו זז :7% חו9סם 0 10 0 1 =:1 הס ;0 =: [65]1טן8/ ;(' :(1-10) וחחו! 66 חו ושואו הסטופסכ זססחם') חוססוזו/ ;(1) ח|₪680 ;(' :|(66 חו זטק 0ף 6טופע זססתם"). חהוססחו/ ; (א) ח|₪680 ח6ו (10 => 1) סח (1 =< 1) זו א =: [1]פסט|8 6 ('.אווחו! עְפזוה 1ס +טס חסטופסק :זסיחם') הוססוו/ .0 תרגיל 8.2 ;30112 ד החבזססזוס זה ;]₪68 06 [1..5] עְהזובּ :5 ;1600 6 |₪68 :₪ חו9סם 0 5 00 1 =:1 הס חופסם ;(1 ,א |₪ זס) סט|פע זססחם') חוססוז ;([81065]1/) ח|₪680 ]יו 0 פסקל מהצעד הראשון - מהדי 2 0 5 00 1 =:1 הס חופסם ;0 / [65]1ט!8 =: ₪ ;(₪ ,' :חסופפוצוס זס3 ' ,1 ,א 6טובּ/") חוססוז יו .0 תרגיל 8.3 ;30113 ד החהזססזוס זפ ]0 [1..10] ץפוה :החטא זז :חור זז :סוס | הז :הס סז 6 חו9סם ;0 =: וסחטו ;0 =: זסאוס | ;0 =: |08ם 00 10 0 1 =:1 הס חופסם חס 0 < [1][חטא ]ו ;1 + זסח0וה =: זסחפוח חסוט 0 = [1][חטא זו ;1 + |008ם =: |הףם חסו% 0 > [1]וחטא + ;1 + ז6שוס ]1 =: זסשוס | יו ;061 ,' :2670 חה זסח0וח פסטופע [בזסד'). חוססוו/ ;([008= ,' :20170 0ל |ה0ף6 פסטופע |בזסד'). חוססחזו/ 10/6 ,' :2610 חר זסצוס| 5סטוהע |ובזסד') מוסטחש .0 תרגיל 8.4 ;3014 ד ההבזססוק זה 1 ?0 [1..20] שוב :טטצ ;10 | :ז0סהטס0 ,שטו8/ ,1 נספח ב: פתרונות לתרגילים ‏ 211 חו9סם ;(':6ט!פע 3 חו ס6קעד') חובסחו/ ;(צ) ח|₪680 0 =: ז%ח60 0 20 0 1 =:1 זס) חו60ם הסח 6ט!8/ = [1]פ5זסטוחטא זו ;1 + זסזח00 =: ]חס יו הסח 0 < זס%הטוס6 + ('.ץְבזזהּ 06 חו (6)5חח ' ,זססת0ס0 ,' זהסקכב סטוב/") חובטוחש 56 ;('! |3 8% זהסכקה 0%ח 0065 ס6טו8/") חובטוחש .0 תרגיל 8.5 ; פ!וסז3 ד ההבזססזוס ז ;[7 1 זס [0..9] שְפזובּ :5 ;7 חז :סד ,1והסד ,1 חו69ם 0 9 0 0 =:1 הס חופסם .₪6 ' ,1 ,א זסן סט|פע זססחם') הוססוז ;([31065]1/) ח|₪680 יו ;0 =: %9|1סך ;0 =: %9|2סך 0 4 0 0 =:1 הס חופסם ;[ * 8]065]1/ + 9|1סד =: 1!סד ;1 + 2 * 8]065]1/ + 2|מ6סד =: 2|מססד ]יו חס 2|מססד = 1!פ)סד זו ('!!! והוסם') חוססחזו/ 566 ;('. 603 זסז') חוססחו/ .0 2 פסקל מהצעד הראשון - מהדי 2 תרגיל 8.6 ;3016 ד ובוסוק זה ;1 01 [0..9] ץפוה = :5זססוחטא ;סתן | :סט|8 1 חו9סם ;(':6!הע הַחודוהז5 3 זססחם') חוססוו/ (8106/) ח|680 0 9 0ף 0 =:1 הס ;6 + 1 =: [5]1זסטוחטא .0 תרגיל 8.7 ;310117 ד החבזססוק זה ;10 01 [1..10] ץ8זזה | :5זססוחו זז :סד חו9סם 00 10 0 1 =:1 הס חופ6ם ;(1 ,א |₪ זס) סט|פע זססחם') חוססוז ([5]1זססוחט]) ה|680 יו 00 10 0 1 =:1 הס ;]זר טא + |הססד =: |גססד ;(|063ד ,' :65ט|8ע ||3 )0 הט5') חובסוז/\ .0 תרגיל 8.8 ;3018 ד הההזססוק זה 1 ?0 [1..10] שְפזוה | :5סט|/ סח 6 חו9סם 00 10 0 1 =:1 הס חופסם ;(2 ,= ||66 סף ס6ט|פע זססחם') חוססוז/ ;([3!065]1/) ח|₪680 ]יו נספח ב: פתרונות לתרגילים ‏ 213 תרגיל 8.9 תרגיל 8.10 ;(':ק0סף 6 0+ החסאטום 606 וחסי פסטן8/") חובסוז/ 0 1 ססחצוסם 10 =:1 זסז ;([8]065]1/) חוססחו/ 6. ;9וו0ז3 ד הההזססזוס ז ?0 [1..10] שפזה | :5סט|4/ חן :7% ;ח8ס|0ס :0 חו0סם שד =: 06 1 ה=: א 0 10 %0 2 =:1 הס 6 =: 08 חס <> [1]פסטו8/ זו הסור 6טזד = א0 זו ('! 608 שזבּ שְבּזזהּ 06 3% פסטופץ ||ח') חוססוו\ ;('.60083 6זה עְהזוב 6חל 31 65ט|פע | +סצז') חוססוזו 6 6. ;0 וההזסוס זה 0 [1..10] עדוה = :5זססוחטא חן :7% ;ח00|68 :סד 50ואם חו9סם 0 10 00 1 =:1 זס1 ;(1 + .סח ||66 זסז סטוה 8 ס6קעד') חוססחזו/ ([5]1ז6סוחגוצ]) ה|680 1 0 10 0 6 =: פוא 0 10 60 1 =:1 זס) 6 =: 0% חסוש א = [1]פזסטוחטא זו הסור 8156= = ₪056 זו 6 =: |מססך 4 פסקל מהצעד הראשון - מהדי 2 חופסם יו =: א זסז חו60ם יו חס שטד = ופשסד זו ('! +15א6 10 %0 1 וחסיז פס|הע ||מ') חוססוז/\ 6 ;('.15%א6 10 %0 1 סי פס!הע || %סז') חוססוז/ .0 תרגיל 8.11 ;311 ד הטסוק זה 0 [1..10] שוב :רהוצ קוו 6 ;1 | :566000 זו חו9סם 0 10 0 1 =:1 הס חופסם ;(, .סח |66 זס] 6טו8/ 6067חו חה סקעד') הוססוז ([5]1זססוחט]) ה|₪680 יו ;1 טרא =: זפזו= 9% =: 560000 0 10 0 2 =:1 הס חס זו < [5]1זסטוחטו זו חו60ם 9% =: 560000 [5]1זסט ותוא =: זפזו= 0 6 ח6ו+ 0ח5660 < [1]פזסטוחטא +ו ;]5]1 06 וטא =: 566000 ;(566000 ,' :15 6ט]הע 65%/טס! 0ח56600') מובטוזש .0 תרגיל 8.12 ;2 ותהזףסזוק זה 1 ]0 [1..10] ץפוה :5זסטוהטצ] חן :וט ,א- 1 ;ח00|68 | :קסס |0חם חו69ם 0 10 00 1 =:1 זסן נספח ב: פתרונות לתרגיליסם 215 חופסם ;2 , .סח ||66 זסז 8|06/ ז600שחו חב זססתם") הוססוז ;([5]1ז6סוחטוצ]) ה|680 יו ?1 =: א :6 =: קסס 01חם 1-8 :1 1-8 הסח ([]5זסטוחטוא = [5]1זסטוחטו) סח (א <> 1) זו חו60ם ;[5]1ז6ט וטא =: סטו/ ;שד =: קסס 01חם 0 ,+ =:1 ;(6ד = קסס01חם) ‏ וס (10 = 1) |סחט + + א =: א ;(6זד = קסס01חם) זס (10 = א) וחחט חסו שטזד = קסס 01ח זו (6טו8 ,' :66ח0 הבר 6זסרח סה הסק6ז ס6טופע לפזו=') הוססחזו/ 56 ; ('.1056!1 חס 62680 15 סט!פע סאז') חוססהזו/\ .0 תרגיל 8.13 ,3 וזה ד וההזףסזוס זה ;)₪68 + [1..10] עְפזוה | :2וחטא ,1 חטא ;00חז 6 חו9סם 0 10 00 1 =:1 הס ;[2]1 חא + [1]1 וחטא =: [1]1וחטצ 0 10 0 1 =:1 זס1 ;(1]1[:0:2 טא ,' :15 ' ,1 ,' .סח 6615 )0 התט5') חובסוז/ .6 6 פסקל מהצעד הראשון - מהדי 2 פרק 9 תרגיל 9.1 ;306 טחוזק והבוססוס זה 17 :5% ;ח00|68ם 0% [1..4 ,1..4] ץְ8זזהּ :ד חו9סם 00 4 0 1 =:ג הס 00 4 00 1 =:58 הס חו0סם ;? = ,₪ ,-- ,ג) סו ;(8) ח|₪680 חסוט 0 = א ז 6 =: [₪ ,ה]6!טפד 6 ;ד =: [8 ,]פד 0 00 4 0 1 =:ג הס חופסם 00 4 00 1 =:8 הס חס שטיוד = [₪ ,ה]סוסבּד זו (*1') ססהז/\ 6 ;('0') ססהו/\ ; ח|ססוו יו .0 תרגיל 9.2 ;06 ד 5 והבזססוס זה | :טש ,5 ,₪ 0 [1..4 ,1..3] פוב :ד חו9סם 00 4 0 1 =:א הס 00 4 0 1 =:8 הס חו0סם ;? = ', ,-- ,ג) סז ;([8 ,]סוט ד) ח|₪680 0 נספח ב: פתרונות לתרגילים ‏ 217 0 4 סט 1 =:ג הס חו60ם 00 4 0 1 =:8 הס ;1 ,ב]30!6ד + החש5 =: וחט5 ;(חחטפ ,' = ' ,ג ,' .סח צוסז )0 הט5') חוסטסוז/ ,0 0 4 0 1 =:ג הס חו60ם 00 4 00 1 =:8 הס ;]1 ,390!6]8ד + החש5 =: וחט5 ((ח טפ , = ' ,4 ,' .סח הוחט|ס6 )0 ההט5') חוססוז/ ,0 .0 תרגיל 9.3 ;אוש וחפיוףסוס זהָ/ חן 41 ;68 06 [1..5 ,1..5] ץְהזובּ :אוה ;| 00 [1..25] עְפזזהּ :ד חו9סם 00 4 6 1 =:א הס 00 4 0 1 =:8 הס ]8 ,ה]אוחה1א =: [8 * ה]6וספד .0 תרגיל 9.4 ,500 ₪680 ההבזטסזוס זה הו ]0 [1..255] עְפזובּ :ב ;וז 5% :8.8 ,ה ;7 נצהך חו9סם ;0 =: [8]4] 00 255 0ף 1 =: ג זסז ;(':50100 3 +ו6פח1') חוססוו/ ;50) ח|₪680 (50) ו00ח6! =: | 0 =: בג זסז ;([58) סזס =: 58 ;1 + [18]8] =: 88 0 8 פסקל מהצעד הראשון - מהדי 2 תרגיל 9.5 תרגיל 9.6 := 6 50 00 1 =: ג זסז חופסם חסר 0 < [הז8ו! זו חו60ם ;(8) זח6 =: טפך ;([ה]8ו ,' - ' ,שבד) חוססחו/ ,0 .6 ; ח|₪680 ;9חו5ץק60 ההבזססוק זה סז 41 ;ו 5% ;0חו5₪ 01 [1..4] זוה | :30|6 57 ;8 01 [1..5 ,1..4] שְהזוהּ :ד חופסם 00 4 0 1 =:ג הס חופסם ;(8 ,' .סח 8חו50 6קעד') חוססוזו ;50) ח|₪680 ;(5 ,1 560) ץ600 =: []30!6 507 יו 0 4 0 1 =:ג הס 00 4 0 1 =:8 הס [ם] | ב ]306 501 =: [8 ,6]2וספד .0 ;ח30!6568 ד הההזטסוק זה ;006 :סחטס= חן טס ,5 ,מ 1 0 [1..40] שוב 1 ,361דך חו9סם 0 =: ז%ח60 0 40 0+ 1 =: ג הס חופסם =: סחטס= 0 טס %0 1 =:8 זס+ טס חסוש [62]8!סה3ד = []61!סבפּד זו נספח ב: פתרונות לתרגילים ‏ 219 חסח+ 8!56=] = חס + חו0סם ;1 + ז0ח00 =: זסזחטס6 ;3 =: [זסחנוס6 ]62| ד ;₪ יו .0 תרגיל 9.7 ;05חו5חוזק והבזססוס זה זז 6 ;חהס|ססם :+ ;50 06 [1..10] ץפוה ד חו69ם ;6 =: 5001 0 10 60 1 =:1 הס חופסם חסר ‏ דחה ד5' = [6]1!טה 50 זו 6 =: 507% 56 חס 0 ד5' = [80!6]1 ד5₪ + 6 =: +50 6 חס שטזך = 500% זו ;([306]1 ד5₪7) חוססוו/ יו .0 תרגיל 9.8 ;ח30!6568 ד הטסוק זה חן :חש ]קסד ,8 ,ה ;חן :חס 650חו ]0 [1..10 ,1..10] פוב :ד חו9סם 0 =: חס 00650 7 5וסז |ו3 חן 56816 - 6חס בק 4 0 10 6 1 =:ג זסן חו60ם 0 פסקל מהצעד הראשון - מהדי 2 0 9 0 1 =:8 זסן חו60ם (=:6 ;1 =: ח6 |קוחסד 0 ([6 ,6]4!סבּד = [8 ,6]4!טב3ד) 0חה3ּ (10 => 6) ס6ווח/צ חו0סם 1+ 6 ;1 + ח6 |קוחסד =: ח6 |קוחסד ;₪ חס ח6 |קוח6 ד > ח6 658חשוה זו חו0סם ₪ =: א ;4 =: ץ ;ח6 !קוחד =: ח6 הפסחשור ו ]יו יו ? 5חרחטוסס || חו ח56876 - סצח צובק + 00 10 0 1 =:ג זס) חופסם 00 9 00 1 =:8 הס חופסם ;₪ =:6 ;1 =: ח6 |קוחסד 0 ([4 ,96]6ד = [ ,6]5!ט3ד) סחה (10 => 6) סווחעו חו0סם ;1+ 60 =:6 ;1 + ח6 |קוח6ד =: ח6 |קוחסד ו חס ח6 |קוח6 ד > ח6 658חשוה זו חו0סם 4 =: א ₪ =: ץ ;ח6 !קוחד =: ח6 הפסחשו ו ]יו ]יו ? 0863 +00 + ;(ח6 100650 ,' :0הטס? 5606066 5%ספח0 |') הוססוז/ ;(₪ , , ,4 ,' :חסטופסכ 3% סחטס-') חוססוזו/ ;([₪ ,]3016 ד ,' :15 סט1ב/") חוססוזו/ .0 נספח ב: פתרונות לתרגיליסם ‏ 221 פרק 10 תרגיל 10.1 תרגיל 10.2 ;5687600 הטסוק ז זז 6 ;ח0!68ס | :0חטס ;50 06 [1..10] ץפחה | :6|ספד חופסם 0 10 60 1 =:1 הס חופסם ;(2 ,' זססוחטח 8ח501 זססחם') הוססוז ;([6]1!ב ד) ח|₪680 ]יו ,6 =: הסחטס= 00 10 10 =:1 הס חס 'אס' = [1]ש!פפּד +ו ;שד =: סחטס= חסו שטזד = סחטס- + (!! אס') הוססח/ 56 ;('.06 דסאז') חהוסטוזו/ .6 ;1- =: חסטופסק (): [ 0 ,2) 106 ;(א = [18006]1) זס (5026 = 1) וחחט 1 =: חסחופסק השח שְ6א = [1]פוטפּד זו 2 פסקל מהצעד הראשון - מהדי 2 תרגיל 10.3 56 ההבזססוס ז חן :חסטופסק ,3 /, ז :2זס חס ,1ססח טס זס [1..9] ץפוה :ד חו9סם 1 =: [6]1!ספך ;6 =: [6]2/פ8ך ;9 =: [8]3!פ89דך ;1 =: [6]4/ס8ך ;7 =: [0|6]5פך =: [8]6!פ89דך ;2 =: [6]7/פ8ך + =: [8]8!פ89ד =: [8]9|פ89ך 6000611 := 0; 600612 := 0; ;1- =: חסטופסק 0 9 0 1 =:1 הס חופסם ;(%071חס) 6ח1 חסו 22 = [6]1!סבפּד זו 1 =: חסטופסק בי ;(2ז0חווס)) 6ח1 ;2 0 (ח + 6 =: 1 7 =: 1 הסח ש6א > [1]פוסבּד זו ,₪ =: 1 הסור ש6א < [1]פוספד זו ;(ח = 1) זס ((₪א = [68וסבּד) וטחט ((1זסס 00 ,' = 1זססחט00') חוססוו/ ,(2ז60ח00 ,' = 2זססחט00') חוססוו/ .0 נספח ב: פתרונות לתרגילים 223 תרגיל 10.4 ;5500605 | הההזססזוק סע 0 = 500006 ;[20]חו5 :סוחהא] ;|₪68 :5 ו זה זז 6 500% ]0 [1..20] ץפזובּ :ד חו9סם 0 20 0 1 =:1 זס) חס 80.0 < 65זב!!.[1]סוספד זו חו60ם ; (6הח6]1[.3!ה ד ,' :6רחהּאז'). הוססחו ;(5אז3. [30!6]1 ד ,' :06פזסעה 5אזבו'). חוססוזו ו .0 פרק 11 תרגיל 11.1 50% הההזטסזום 6% ;5 = % זה ;7 :קת6ד,8 ,3 ז0 [1..8] פוב :ד חו9סם 0 1 - ס 1 =:ג זסן 0 א 0 1 + =: 5 זסז חסו [ה]6!ס3ד > [8]סוספּד זו חו60ם ;[ה]6!ט9ד =: קוחסד ;1 =: [6]4!ט3ד ;]ד =: [8]8!ט3ד 0 6. 4 פסקל מהצעד הראשון - מהדי 2 תרגיל 11.2 ; 0חו0זס! וחהיוטסוס זה חן :1 חוסק ;חן :זססחוסק חן :סק ]0 [1..10] לפוה לכויו 01 [1..10] הזוה ד 1 ]0 [1..10] פוב ד חו9סם ;1 =: 1זסזחוסק ;0 =: 2זססחוסק ;1 =: 3זס6חוסק ובי 1 הסח [2זסשחהוסק ]3162 ד => [1זססחוסק ]61וספד זו חו60ם ;[1]ס%חוסק ]0161 ד =: [3זוססחוסק ]63!ט3ד ;1 + 1זססחוסק =: 1זססחוסק 0חס 6 חו60ם ,[2זססחוסק ]6|2!ד =: [3זססחוסק []63וסד ;1 - 2זססחוסק =: 2זס%חוסק 0 ;1 + 3זס6חוסק =: 3זסזחוסס ;(1 > 2זססחוסק) זס (10 < 1זססחוסק) וסחט חס 10 => 1זסשחוסק + 0 10 => 1זססחוסק 6ווחצו חו60ם ;[1]ס%חוסק ]8061 ד =: [3זוססחוסק ]63!ט3ד ;1 + 1זססחוסק =: 1זססחוסק ;1 + 3זסחוסק =: 3זססחוסק 0 56 0 1 =< 2זססחוסק 6ווחצו חו60ם [2זס%חוסק ]80162 ד =: [3וססחוסק ]63!ט3ד ;1 - 2זססחוסק =: 2זס%חוסק ;1 + 3זסחוסק =: 3זססחוסק 0 .0 נספח ב: פתרונות לתרגיליסם 225 תרגיל 11.3 תרגיל 11.4 ; 0חו0זסו וחפיוטסוס זה חן :קוחד ,8 ,3 ;חן :וס חוסק סז :זססחוסק ;ח0|68סם : הו )0 [1..10] ץפוה לכויו 1 ]0 [1..10] פוב יוו 1 ]0 [1..10] פוב :ד חו9סם ] העתקת שני המערכים לתוך מערך שלישי 4 00 10 0 1 =:ג זס) חופסם ;[]91ד =: [63]8!ט3ד ;]ד =: [10 + ה]63|טפד יו ? מיון נתונים ע"פ שיטת מיון בועות + 1 =: 2 ;6 =: הססוא5 0 (6טד = חסוא5) סחהּ (10 > ) 6ווחש חופסם ;6 =: ה0שוו5 00 20-84 0 8:=1 הס חסוש [63]8!ט30ד > [1 + 3]5סוסבּד זו חו0סם ;[ + 90!63]8ד =: קוחסד ]8 =: [1 + 63]8ו80ד ;קוחד =: [63]8!ט3ד ;ד =: האופ 0 ;1 + 4 =: ה יו .60 | חס הההיוטסיוס זפ חן :וס חוסק חן :זססחוסק חן :זסחוסק 6 פסקל מהצעד הראשון - מהדי 2 ;|₪68 0% [1..6] ץפזובּ לכויו ;|₪68 0% [1..6] פוב ד ;₪68 06 [1..12] ץפוה ד חו9סם ;1 =: 1זסזחוסק ;1 =: 2זס6חוסק ;1 =: 3זססחוסק ובי 1 0 (0 > [1זס)חוסק ]30161 ד) 0ח3 (6 > 1זססחוסק) שווחצו ;1 + 1זססחוסק =: 1זססחוסק 0 (0 > [2זס)חוסק ]30162 ד) ס0ח3ּ (6 > 2זססחוסק) שווחצו ;1 + 2זססחוסק =: 2זס%חוסק חס (6 => 2זסשחוסק) סחה (6 => 1זססחוסק) זו חו60ם חס [2זסשחוסק ]3162 ד => [1זססחוסק ]61וספד *ו חו9סם ;[1זס%חוסק ]80!61ד =: [3זסזחוסק ]63|ט3ד ;1 + 1זססחוסק =: 1זססחוסק 0חס 6 חו9סם ;[2זססחוסק ]6|2!ד =: [3זספחוסק []63ו3ד ;1 + 2זססחוסק =: 2זססחוסק 0 0 ;(6 > 2זססחוסק) זס (6 < 1זססחוסק) וטחט חס 6 => 1זססחוסק *ו 0 6 => 1זססחוסק 6ווחצו חו60ם ;[1זססחוסק ]3161 ד =: [3זסזחוסק ]63|טפד ;1 + 1זסזחוסק =: 1זססחוסק ;1 + 3זססחוסק =: 3זסזחוסק 0 56 0 6 => 2זססחוסק 6ווחצו חו60ם ;21 וק ]62| ד =: [3זספחוסק ]63וט ד ;1 + 2זססחוסק =: 2זססחוסק ;1 + 3זססחוסק =: 3זסזחוסק 0 .0 נספח ב: פתרונות לתרגיליסם ‏ 227 תרגיל 11.5 ;0036 והבזססוס חן :1 חוסק חן :סק ;5 5% ;50 06 [1..10] ץפזוםּ לכויו ;50 06 [1..11] ץפזובּ ד זפ חו9סם (':6החהח 3 חו ס6קעץד') חוססוו/ ;50) ח|₪680 ;1 =: 1זסזחוסק 0 11 0 1 =: 2זססחוסק זס+ הסור 56 > [1זססחוסק]61וספד זו חו60ם ;11 חוסק]8!61ד =: [2זססחוסק [62וט ד ;1 + 1זססחוסק =: 1זסזחוסק חס 6 5% =: [2ז66חו0ק ]62| ד 6. תרגיל 11.6 ;+ זה ק רהס הההזטסוס חן :קסד ,8 ,3 ;סח | :600071 ;לח | :2ז0תחו60 ;ח6|ססם :ו ; יח זס [1..5] פוב לכויו זס [1..5] צפזובּ ד זפ חו9סם ? תיכול המערך הראשון, ושכפולו לשני + 42 =: [80|61]1ך ;3 =: [80!61]2ך ;4 =: [90!61]3ך ;7 =: [61]4/פ8ך ;6 =: [80!61]5דך 8 פסקל מהצעד הראשון - מהדי 2 ;]ד =: [80!62]1ד 00 5 סש 1 =:ג הס ?] אתחול מונים + ;0 =: %671ח60 ;0 =: %612ח60 ] מיון נתונים ע"פ שיטת מיון שכנים + 0 5 0 1 =:ג הס סס 5 00 1 =:8 הס חופסם ;1 + 6000001 =: 1זסחטס6 חס [ה]6!ס3ד > [8]פוספד + חו60ם ;]36 ד =: קוחסד ;1 =: [6]4!טפד ;קוחד =: [6]8וטפד ו ]יו ? מיון נתונים ע"פ שיטת מיון בועות + 1% =: 24 ;ד =: חססוא5 0 (6טד = חסוצו5) 30 (5 > ) 6ווחו חופסם ;1 + 60072 =: 2זסחטס6 ;6 =: החוש 00 5-4 ₪00 8:=1 הס חס [63]8!ט3ד > [1 + 63]8וטפד *ו חו9סם ;[ + 9!63]8ד =: קוחסדך ]ד =: [1 + 63]8ו8ד ;קוחד =: [90!63]8ד ;ד =: חססוא5 0 ;1 + 4 =: 2 יו ] הדפסת תוצאות + ;(1 00 ,' :504 56 01 זססהט00') חובסוז/ (02ח 60 ,' :+50 560000 01 זס%חהס0') חוססוו .0 נספח ב: פתרונות לתרגילים 229 פרק 12 תרגיל 12.1 תרגיל 12.2 0 פסקל מהצעד הראשון - מהדי 2 ;5-6 1 הההּזוססוק זפ 6אסדך = ;ו 5% חו9סם ;("דהם. 06 ד :6' ,=) ח0ו55ה ;(=) :₪656 0 8|56= = (=) ]₪0 ס6ווח/ו חופסם ,50 ₪) ה|₪680 ; (50) חוססוז\ יו ; (=) 6|056 .0 ; 015 רת \ססו/ הההיופסיוס זפ 6אסד = זז 6 ?0 [1..6] לאה | :6|ספד חו9סם 0 6 0 1 =:1 הס חופסם ;(1 ,' 06]ה/ 3 זססחם'") חהוססוז ;([130!6]1) ה|₪680 ]יו ; ('"דכ.5שפועאז' ,=) ח0ו55ה (=) ססוצס 0 6 0 1 =:1 זס) ;([6]1!ס8 ד ,=) חובסחו/ ; (=) 6056 0. תרגיל 12.3 זז : תרגיל 12.4 ;₪605 הוחהופסוס זה ;תח ז0 16 = ;חן :1 + [1..100] צְזוהּ :ד חו9סם ; ('"דהס. ד15 |' ,=) ח0ו55ה ;(=) :₪656 1:0 0 8|56= = (=) ]₪0 ס6ווח/ו חופסם ,2) 106 ;([30!6]1 ד ,=) ₪680 ;(8 ,-) ₪680 יו ;(=) 6|056 6 חו פזסטוהטח |בזסד') חובסוו/ .0 ,6505 ו/ הההיופסיוס זפ 6אסד = ;ו 5% חו9סם ("דאד.=א |' ,=) ח0ו55ה (=) וצו וי -1 (50) חה|₪680 ;50 ,=) הוססהו/ ץ' = 5% |סחט ; (=) 6|056 .0 נספח ב: פתרונות לתרגילים ‏ 231 תרגיל 12.5 ;6 הפס הוהבוססוס 6 0 סש = בלה ;5 :הא זז :0 זז :0 ו ז ;808 )0 8!6 = ;סה : תרגיל 12.6 222 ;006 6חסח ההבזטסזוס 6 0 = לה ;[15 ]חו5 :3 זו ;[20]חו5 :353 | 1 | :זססותט)סחהסחק ו ₪: 803; ₪ 86 01 803; חו9סם ; ('"דהכ.םאסחק' ,=) ה0ו55ה (=) וצו וי -1 ; (' :6חחפּח לפזו=') בסחו/\ ;36 ס5זו=.) ה|680 ח6ח+ '000' <> 6חוחב3 ז.ה + חו60ם ;(' :6חחפּח 35% ]') ססוז ; (350306 1.) ה|₪680 ;(' :ז6סוחטח שחסתק') ססוז ; (6חסחק.) ה|₪680 ;(8 ,=) ססוז 0 ;'000' = 6וחבּ5זו=.2 ומח ; (=) 6|056 .0 פסקל מהצעד הראשון - מהדי 2 תרגיל 12.7 ;68006חסח ההבזטסזוס 6 0 = לה ;[15 ]חו5 :3 זו ;[20]חו5 :353 | 51 | :זססותט)סחהסחק ו ₪: 803; ₪ 86 0 803; חו9סם ; ('"דהכ.םאסח;' ,=) ה0ו55ה ;(=) 656% 0 8|56= = (=) ]₪0 ס6ווח/ו חופסם ;(8 ,=) ₪680 ; (6:11ח0חק. ,35036:21 1 ,16 :6רח3חפזו=.ה) ססוו יו ; (=) 6|056 .0 תרגיל 12.8 ;6וחץק0ס6 הההזטסוס זפ סד 1 ,1 ;5 5% ;50 :62חח3] ,61חב] חו9סם ;(' :6החהח ₪6 156 זססחם") בסוז/ ; ( 61ח8) ח|₪680 ;(' :6החהח 8!6 560000 זססחם") בסוז/\ ; (62רח8ּ]) ח|₪680 ;(61וח3 ,1=) ח0ו55ה ;(1) ]₪656 ;(62הח3 ,2=) ח0ו55 ;(2=) 66ו נספח ב: פתרונות לתרגילים ‏ 233 0 8156= = (1=) ז0ם 6ווח/ו חופסם 50 ,1=) ה|₪680 50 ,2ת) חהוססוו יו 6056 )=1(; 6056 )=2(, 0. תרגיל 12.9 ;00 החבזססוק ז =1, ₪2, 3: | ₪6 1 חן 6 חו9סם ;("דםכ.1ם וח' ,1=) ח0ו55ה ;("דהכ.2ם |1ח' ,2ת) ח0ו55ה ;("דםכ.3ם 1ח' ,3=) ח0ו55ה ;(1=) ]₪656 ₪656] )=2(; ;(3=) 66וז 0 8156" = (1=) ]₪0 ס6ווח/ש חו0סם ;2 ,1=) ₪680 ;2 ,3ת) סח 2 ,2=) ₪680 ;2 ,3ת) סה/ ]יו 6056 )=1(; 6|056 )=2(, 6|056 )3(,; 6. 4 פסקל מהצעד הראשון - מהדי 2 אינדקס א אופרטור (0ז8ז6קס) 23 סאה 38 זסא 38 0% 38 חישובי 23 סדר 39 שארית (₪00) 24 איבר 165 אלגברה בוליאנית 37 אלגוריתם (וחחז1זסט!8) 71 (ראה מבנה בקרה) ב ביטוי תנאי (5ח0ו655זקאס) 44 בלוק פקודות 50 ה הזחה (ח%800ח06חו) 21 התנגשות (חסופו||ס6) 177 התניה 43 ח חיפוש 139 ייאריה במדבריי 142 בינארי 139, 141 סדרתי 139 תהליך 143 חשבון, פעולות 23 סדר 25 ט טורבו פסקל 11 כ כתיבה מודולרית 93 ל לולאה 47 בלוק פקודות 50 מותנית 48 מקוננת (9ַח650ח) 52 קבועה 47 תנאי 50 0 47 [טחט-6068%? 49, 73 6וחצו 49, 72 מ מבנה בקרה 65 אלגוריתס (וחחשוזספָ|8) 71 לולאת +₪6268 73, 76 לולאת 6!וח) 73, 76 מבנה לולאה 70 מבנה סדרתי 67, 72, 74 מבנה רב-ברירות (6856) 73, 78 מבנה תנאי 68 מורחב 72, 75 מצומצם 72, 75 סוגים 67 מבנה רב ברירות (6956) 56, 73, 78 אינדקס 235 מחרוצת (פַחו5₪) 105 אורך 106 השוואה 107 מבנה 105 שינוי 110 משתנה 107 נתון מספרי 113 פונקציות 108 (ראה פונקציה) פעולות 106 תו בודד 107 מטריצה 131 ריבוע קסס 132 מידור תוכנית/כתיבה מודולרית 93 מיזוג מערכיסם 151 יותר משני מערכים 153 תהליך 151 מיון מערכים 147 בועות 149, 150 יורד (0חו0ח06566) 147 מפתח 147 עולה (0ח8506001). 147 שכנים 147 מילים שמורות 12 6 57 א 24 חסטסחט+ 94 6 84 מערך (ץ88) 119 דו-מימדי 129, 131 מטריצה 131 הגדרה 121 חד-מימדי 119 מיווג 151 מיזוג (ראה מיזוג מערכיס) מיון (ראה מיון מערכיס) ניהול 124 6 פסקל מהצעד הראשון - מהדי 2 פנייה לאיבר 130 רב-מימדי 129 קבועיס 134 שילוב קבועים 125 שימוש 122 שס 119 מפתח מיון 147 משתנה (6וס8ּ8) 12 אקטואלי 97 בוליאני (ח800!68) 13, 37 הגדרה 15 חיצוני 97 כללי (|003ו0) 87, 97 לוגי/בוליאני (ח200|68) 13 מחרוזת 107 ממשי (|₪68) 13, 20 מקומי (|₪39סן) 87 שלם (%606ח1) 13, 15 תו (ז8ח0) 13, 108 נ נתוניס, קריאה וכתיבה 167 לי סגירת קוב 162 ע ערבול (9ח1ח85) 175 פונקציות 176, 179 ערך מוחזר 94 ממשי 32 שלם 32 פ פונקציה (חסטסחט)) 28, 83 5 29 זה 31 ץְקְ60 109 162, 169 5 172 6 170 6 32 %חז 31 0חזסח6] 108 סוס 30 5 109 סחטסא 32 וחססחהה 33 6% 171 זז 29 + 30 ס6חטוד 31 יצירה (חסטְ9ז060|3) 94 מחרוזת 108 (ראה מחרוזת) ערבול (9ח1ח85) 176 קיפול 180 ריבוע 179 שינוי בסיס 179 ערך מוחזר 94 פעולות חשבון 25 סדר 25 פקודה 0בחססקה 160 חו55 158, 166 6 167 6 111 סח 110 0 167 ח|690 17 15%9, 166 סוזא 159, 166 16% ש5 113 1 114 ססוז/ 167 מבנה 168 ח|ס)וז/ 17, 19 בלוק 50 קלט/פלט 17 פרוצדורה 28, 83 396 24 מילה שמורה 84 שיגרה (שחסטסא) 85 (ראה שיגרה) פתרונות לתרגיליס 181 קִ קבועיס (0ח500ח00) 12, 13 הגדרה 15 מערך רב-מימדי 134 שילוב במערך 125 קובצ 6₪!₪) 157 בינארי 158 טקסט 0א6) 158 פקודות 158 כתיבה וקריאה 160 מבני (060) 163 טיפול 165 פקודות 166 רשומה (466070) 163 שדה (₪8|0) 165 סגירה 161 סוף קוב 162 קוד אסקי (561) 30 קינון (0ח650) 52, 100 237 סקדניא‎ קלט/פלט, פקודות 17 רִ ריבוע קסם 132 רשומה (46600) 163 מבנה 163 ש שדה (8|0=) 1653 שוויון 39 שיגרה (6חסטס) 83 תת-שיגרה (ס6חסטסזטפט5) 83 בסיסית 84 הגדרת מספר פרמטרים 90 העברת פרמטריס 86 קינון (0ח650ח-505) 100 שימוש חוזר 99 תהליך ביצוע 85 שלס (100606) 15 שפה, מרכיבים 12 ת תא 165 תו 80ח6) 108 ] 45 תוכנית מבנה 13 ראש 14 תנאי (חסטוס0חס6) 453 6 56 חסחץ..זו 44 6. תסת..ו 44 תרשים זרימה זבּח6 צוסו=) 65 חצוסס-קסד 90 כללים 65 8 פסקל מהצעד הראשון - מהדי 2 4 ץפוה 119 1 300 8 חו60 16, 50 6 6 57 זו 108 חסופו|וס6 177 וו 60 0חססקה 160 ח0ו55 158, 166 6 167 6 111 0 17 +פחז 110 0 167 ח|630 17 159, 166 וזו 159, 166 716% 5 113 114 סוז/ 167, 168 ח|ס%וז 17, 19 חסחו0חס 45 6 56 חסחץ..זו 44 6. תסת..ו 44 065 13,12, 15 16 צו) 24 .0חם (סוף), 16, 50 5 44 ב | 37 ,6 1653 60 6 157 ץזהּחום 158 60/6 160 0% 158 0 165 הח סו 65 חצוסס-קסד 90 חסטסחט+ (מילה שמורה) 94 חסטסחט+ 28, 83 5 29 זהס 31 ץ000 109 ח800ז066!3 94 % 162, 169 65 172 6 170 6 32 הַחוח35 176 %חז 31 הזסח6]| 108 0ס 30 5 109 סחטסם 32 וחססה8א 33 6% 171 זז 29 אינדקס 239 + 30 6חטזד 351 ה 84חוח35 175 1 הח%800חה06חו 21 זז 15 1 5 זו 47 (0חט-0068% 49, 72 6|וחצו 49, 723 24 4 100 ,52 8 0 ]וסקס 23 סאה 38 04 24 זסא 38 ₪ 38 סִ 6ז טסוק 28, 83 84 6 סח 34 ס6חסטסח 83 0 פסקל מהצעד הראשון - מהדי 2 א ח|₪690 17 0 163 6חסטסא 83 6חסטסזסט5 83 500-500 100 5 147 50% 147 656600 147 35000 105 589 ז סד 37 צ זהצ, 15, 6סהחהצ 12 חהס|ססם 13, 37 זה 13, 108 |68ס| 87, 97 זז 15,135 08| 87 368 135, 20, 9חו50 107 ו ח|ססוז 17, 19