C++ בקלות מהד' 3

עורך מקצועי של המהדורה – אבי בוץ ; תרגום לעברית – שמואל בן-טולילה, ירון ותמי תלם | 453, 10, 16 עמודים : איורים ; 24 ס"מ + 1 תקליטור. – ISBN 965-361-225-5

OCR (הסבר)
מהדורה שלישית ויד ץוג ייעוץ מקצועי: אבי בוץ .ל 0 שוש 2 הוד-עמי [לי רוי יי ++6 בקלות מהדורה שלישית קרא את קובץ 06פ5.פ6אס בתקליטור כדי לקבל מידע על תכולת התקליטור המצורף. קרא בהקדמה כיצד להתקין את המהדר 86 וכיצד להעתיק את קוד המקור. עורך ראשי: יצחק עמיהוד תרגוס לעברית : שמואל בן- טולילה, ירון ותמי תלם עריכה מקצועית של המהדורה השלישית : אבי בוץ, חברת מיי- סופט עריכה ועיצוב: ענבל אילני, שרה עמיהוד עיצוב עטיפה : שרון רז שמות מסחריים שמות המוצריס והשירותיס המוזכריס בספר הינס שמות מסחרייס רשומיס של החברות שלהס. הוצאת 8 והוצאת הוד-עמי עשו כמיטב יכולתן למסור מידע אודות השמות המסחרייס המוזכריס בספר זה ולציין את שמות החברות, המוצריס והשירותים. שמות מסחרייס רשומיס (780608765 6015%6760ז) המוזכריס בספר צוינו בהתאמה. ++6 06ח807!3 הינו מוצר של חברת 6חבּווס0ם מוצרי 5עוסשוז/\ הינם מוצרים רשומים של חברת 116-0501%] הודעה ספר זה מיועד לתת מידע אודות מוצרים שונים. נעשו מאמצים רבים לגרום לכך שהספר יהיה שלם ואמין ככל שניתן, אך אין משתמעת מכך כל אחריות שהיא. המידע ניתן ''כמות שהוא'' ("15 פבּ"). הוצאת 335 והוצאת הוד- עמי אינן אחראיות כלפי יחיד או ארגון עבור כל אובדן או נזק אשר ייגרם, אם ייגרם, מהמידע שבספר זה, או מהתקליטור המצורף. לשם שטף הקריאה כתוב ספר זה בלשון זכר בלבד. ספר זה מיועד לגברים ונשיס כאחד ואין בכוונתנו להפלות או לפגוע בציבור המשתמשים/ות. טלפון: 09-9564716 פקס: 09-9571582 דואר אלקטרוני: |ו.ס60.והחִה00-3ח (06+חז םי ם ש ₪ אתר באינטרנט: |60.1.ווחהּ-סח. עצעשטצו/ / :קה ++6 בקלות מהדורה שלישית דייר קריס ג'מסה עורך מקצועי של המהדורה: אבי בוץ, מיי-סופט הוצאת הוד-עמי לספרי מחשבים ++6 ץ0 5656000 . .חק ,58חה ,415 ץ חסטוסם סזוחד תווחה .1 :זסזו0= חס 60 06הטפחה! חפוופַחם 6 והסז? הסה!5חבזס 260הוסחסטה 9 00% ,655זק 58רחה2 עס ססחפווסטוס 0 6 %6ח8ץ600 .150 ווחה-0סר] )06( כל הזכויות שמורות הוצאת הוד-עמי לספרי מחשבים בע''מ ת.ד. 6108 הרצליה 46160 טלפון: 09-9564716 פקס: 09-9571582 אין להעתיק או לשדר בכל אמצעי שהוא ספר זה או קטעים ממנו בשום צורה ובשום אמצעי אלקטרוני או מכני, לרבות צילום והקלטה, אמצעי אחסון והפצת מידע, ללא אישור בכתב מאת ההוצאה, אלא לשם ציטוט קטעים קצרים בציון שס המקור. הודפס בישראל 1000 0 6סתףו |וא .4 ו זוזה-פסו 8ןו|072 ,6108 .0.8.ק 0 , .15 מסת'יב 965-361-225-5 158% חוכן העניינים הקדמה 2 חלק 1 בוש אים בסיסיים .ובו ואנט. בר 29 פרק 1: התוכנית הראשונה 1 פרק 2: מבט על שפת התכנות ++6 3 פרק 3: כתיבת הודעות על המסך 216 פרק 4: משתנים לאחסון המידע 0 פרק 5: פעולות אריתמטיות בסיסיות 0 פרק 6: קליטת נתונים מהמקלדת 0 פרק 7: הרצת תוכנית על פי תנאים 0 פרק 8: לולאות 10002.0 חלק 2: השימוש בפונקציות לבניית תוכניות .......522 111 פרק 9: הפונקציות 1 פרק 10: שינוי ערכי פרמטרים 1 פרק 11: יתרונות ספריית ההרצה (18₪48%! פואנד-אעא) 1 פרק 12: משתנים מקומיים וטווח הכרתם 1 פרק 13: העמסת פונקציות 1 פרק 14: המשתנה המיוחס בשפת ++6 0 פרק 15: קביעת ערכי ברירת-מחדל לפרמטרים 1 חלק 33 אחסון מידע במערכים ובמבני רשומה .....-... 165 פרק 16: מערכים 1 פרק 17: מחרוזות תווים 7 פרק 18: מבני רשומות 1 פרק 19: איגודים 1 פרק 20: מצביעים ו חלק 4: המחלקות של 5556166666000...071 207 פרק 21: המחלקות: תחילת הדרך 20926 פרק 22: החלק הפרטי והחלק הציבורי 7 2 תוכן העניינים | 5 פרק 23: פונקציות בנייה ופונקציות פירוק ל פרק 24: העמסת אופרטורים 2 פרק 25: פונקציות סטטיות ומשתני מחלקה 2 חלק 5: הורשה ותבניות וי 259 פרק 26: הורשה 2 פרק 27: הורשה מרובה ו פרק 28: אלמנטים פרטיים ואלמנטים חברים ל פרק 29: תבניות פונקציה 2 פרק 30: תבניות מחלקה 00 300 חלק 6: נושאים מתקדמים ב- ++6..----66111666660640 1 313 פרק 31: מאגר הזיכרון החופשי לור פרק 32: פעולות במאגר הזיכרון החופשי 3 פרק 33: ניצול מירבי של א61 ו-ד60 330 פרק 34: פעולות קלט/ פלט בקבצים 3 פרק 35: פונקציות משולבות וקוד אסמבלי בתוכנית 1 פרק 36: ארגומנטים של שורת הפקודה 6 פרק 37: שימוש בקבועים ובהוראות מאקרו 0 פרק 38: פולימורפיזם 0 פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות 3 פרק 40: ספריית תבניות סטנדרטיות ‏ 511 10 פרק 41: יצירת פרויקט ו פרק 42: הרצת תוכנית ב-++6 וב1503\ 1 נספח: מילון מונחים לעובר מ-6 ל- ++6 ל מפתח סימנים מיוחדים ב 7 3 רשימת טבלאות לאונ 3 אינדקס עברי 2 אינדקס לועזי (התחלה בסוף הספר) 253 6 ++6 בקלות חוכן העניינים במה שונה ספר זה מספריס אחריס בנושא? 2 למי מיועד הספר? [/[/|/ 2 כיצד להשתמש בספר? ל מה בספר? 22 תוכנת 61/0ד בתקליטור המצורף 2 התיקיה 66:ו6ז\6ז50108\ ...0 24 התקנת התוכנה 2 הפעלת התוכנה 20 הרצת תוכניות 2 קוד המקור בתקליטור המצורף 2 התיקיה 50 ₪556 .ו 27 התיקיה דסאסא דזק 2 העתקת קבצי קוד המקור לדיסק הקשיח 2 חלק 1: נושאים בסיסיים ההההההההההההההההההההההההההההההווה,וו: 29 פרק 1: התוכנית הראשוה ...31.11 יצירת התוכנית הראשונה | משמעות השס של התוכנית 7 הידור התוכנית - קומפילציה 3 המהדר - מה הוא עושה? מ יצירת התוכנית השנייה ב 3 שגיאות תחביר, מהן? 6 שגיאות תחביר, מהן? 7 עבודה בסביבת פ/שססחו/\ 7[ סיכום 0 שש 0 שש 0 בס מכ קש שמש ו תרגילים 2 פרק 2: מבט על שפת התכנות + 390.07 משפטי התוכנית 0 משפט ס6סטוסחוא 6 555 05 ססיב מ 080 ש 0 2-5 בוש וט בש םש יש שובובים שש לפ 0 קבצי כותר בשפת ++6 0 משפט (סוסט)חו8 סוסצ ל מהי תוכנית ראשית? 0 הבנת השימוש ב- 6וסצ 575 5 5 5 50 5-55 80 5 1 תוכן העניינים | 7 הסוגרייס המסולסלים ץ + ל משפט 600% להצגת הודעות פלט על המסך .2 ערוצ הפלט 600% 2 סיכוס ה תרגיליס 0 פרק 3: כתיבת הודעות על המ ...0 46 הצגת מספרים על ידי השימוש ב- +60 -[//// 0 הצגת מספר ערכיס בפקודה אחת 7 השימוש בתוויס מיוחדיס ה[ רשימת תוויס מיוחדיס 1 הצגת מספריס בבסיס אוקטלי ובבסיס הקסדצימלי 52 הפלט הסטנדרטי לדיווח תקלות 0677 0 קביעת אורך הפלט 0 סיכוס 1 57 תרגיליס 7[ פרק 4: משתנים לאחסון המיב 260 הצהרה על משתניס בתוכנית 5 מה וה משתנה? 8 קביעת שמות בעלי משמעות למשתניס || מילים שמורות ל מדוע דרושים משתנים בתוכנית? 9 הקצאת ערך למשתנה קש 0000 סש 0 00 בשש 5 לבפ הקצאת ערכיס בעת הצהרת המשתניס 0 הקצאת ערך למשתנה 0 השימוש בערכי המשתניס ל גלישת ערכי משתניס |[ || דיוק של ערכי משתניס ו[ שימוש בהערות לשיפור קריאות התוכנית 0 תיעוד פנימי של התוכנית 7 סיכוס 0 תרגיליס 0 פרק 5: פעולות אריתמטיות בסיסיות.... 67 אופרטוריס מתמטיים בסיסיים 0 קידוס ערך המשתנה באחד ו משמעות מיקוס האופרטור להגדלה עצמית ביחס למשתנה 0 אופרטור הקטנה עצמית 0 אופרטוריס אחרים ש ‏ ו סדר הקדימות .ל קביעת סדר הפעולות בביטוייס מתמטייס 7 פעולות חשבוניות עלולות לגרוס לשגיאות גלישה (שסוזפשס0) ל 8 ++6 בקלות פרק 6: קליטת נתונים מהמקלדת..... 80 ערוצ הקלט ח!6 2 1 חוס וקליטת נתוניס מהמקלדת 2 תקינות הקלט - שגיאות בקליטה 0 קליטה של תו אחד 7 קליטה של מילים מהמקלדת 0 ניתוב מחדש של הקלט בי סיכוס - ו תרגיליס 5 פרק 7: הרצת תוכנית על פי תנאים ...0 השוואה בין שני ערכיס 0 המשפט זו 0 משפטים פשוטים ומשפטיס מורכביס 7 משפטים פשוטים ומורכביס ל ...88 משפטים שיבוצעו אס התנאי אינו מתקייס 88 משפטיס מורכביס בעקבות משפט 6156 59 הבנת תהליך ההתנייה - 6856-ו 0 הזחת משפטיס לשיפור קריאות תוכנית ל משפטי תנאי מורכביס 24 ערכים מספריים לתוצאות אמת ושקר ל האופרטור ד0א 9.4 אופרטורים לוגייס 0 בדיקת תנאים שוניס 0 משפט ח5//166 לו 2..4 90 סיכוס 0 תרגיליס 0 פרק 6: 217 אשב 100 ביצוע חוזר של משפט בודד מספר פעמיס קבוע ו לולאת זס1 לביצוע חוזר של קבוצת משפטיס 0 שינוי בקצב קידוס הלולאה ב הישמר מפני לולאות אינסופיות 7 ביצוע לולאה מספר פעמים נתון ל הלולאה 8ווחעצ ג ביצוע לולאה עד אשר תנאי מסויס מתקיים 0 שגרה של ביצוע משפט פעס ראשונה ללא תנאי: 6וח/ו-00 ב חזרה על משפטים כל עוד תנאי מסויס מתקיים 0 תוכן העניינים 9 חלק 2: השימוש בפונקציות לבניית תוכניות .... 111 פרק 9: הפו קציו 1 היצירה והשימוש בפונקציה הראשונה 1 הקריאה לפונקציה יע וו1174...4 העברת מידע לפונקציות - 0 העברת פרמטר לפונקציה 120 החזרת ערכים מפונקציה 1 פונקציות שאינן מחוזירות ערך 12 פונקציות מחזירות ערך ל לול -4: 122 שימוש בערך המוחזר על ידי פונקציה 0 הצהרת הפונקציה 12 אב טיפוס של פונקציה יכול לסייע לך 1 סיכוס 1 תרגיליס ילוי כגיל .126.24 פרק 10: שינוי ערכי פרמטרים...... 127 מדוע בדרך כלל לא ניתן לשנות את ערכי הפרמטריס בתוך הפונקציה? 12 למה פונקציות בשפת ++6 אינן יכולות לשנות בדרך כלל את ערכי הפרמטרים 1 שינוי ערכי הפרמטרים 1 שינוי ערכי הפרמטרים בתוך הפונקציה 1 דוגמה נוספת ושב-א יבב ב0... 132 הבנת פעולת המהדר בעזרת תדפיס של שפת אסמבלי 1 סיכוס 134 תרגיליס 1 פרק 11: יתרונות ספריית ההרצה (+188₪48₪)! פואזד-א0א)..... 136 השימוש בפונקציות ספריה 1 כיצד להבין את פונקציות הספריה 5 ב 1 פונקציות 1ק .139.24 סיכוס 1 תרגיליס .140.04 פרק 12: משתנים מקומיים וטווח הכרתם....-.-.-.-.660ש6ש6ש0ש1ש1ש0 141 הגדרת משתנה מקומי 1 בעיית התנגשות של שמות משתניס 1 המשתנה המקומי טסט פמק שלש ששום שמש טלשש שש 3 10 הגדרת משתנה גלובלי ...10 בעיית משתנה גלובלי ומשתנה מקומי בעלי שס והה 1 המשתנה הגלובלי שלב ...1410 טווח ההכרה - 56006 6'5וספחו8ּ/\ 1 סיכום ב 5 שו ב שו ב בשש שש מש כ מ בשש בשש מ שב-שש שש 5 1066 0 ++6 בקלות תרגיליס 5 ב 1 פרק 13: העמסת פונקצינת .111555555 149 מהי העמסת פונקציות - ו מתי להשתמש בהעמסת פונקציות? ב העמסת פונקציות משפרת את קריאות התוכנית 1 סיכום ם ‏ ם בוסוטם משלטום פמט בלשמ םי ו ל 2 15 תרגיליס 0 פרק 14: המשתנה המיוחס בשפת 67171..-6111111111.6060000 1 153 משתנה מיוחס 1 הגדרת משתנה מיוחס בתוכנית 1 העברת פרמטרים לפי ייחוס 15 שימוש בהערות לציון שימוש בהעברה לפי ייחוס 1 דוגמה נוספת לס ששכ ל בש השמש לפ שש השמש שש 2 בכ 055 1:5 כללי העברת פרמטריס לפי ייחוס 7 שימוש במשתני ייחוס לשינוי פרמטרים של פונקציות 1 סיכום 1 תרגילים 158200 פרק 15: קביעת ערכי ברירת-מחדל לפרמטרים ..-....-..5666666 160 הגדרת ערכי ברירת מחדל ל 161 השמטת ערכי פרמטריס 167 הגדרת ערכי ברירת מחדל לפרמטריס 1 סיכום 1 תרגילים 1 חלק 3: אחסון מידע במערכים ובמבני רשומה . 165 פרק 2:16מערכים: 1 הגדרה של משתנה מטיפוס מערך 1 מערכים מאחסנים ערכיס רביס מאותו סוג 7 גישה לאיברי המערך 1 שימוש בערך אינדקס כדי לגשת לאיברי המערך .170 משתנה אינדקס 1 קביעת ערכי המערך במשפט ההגדרה 1 העברת מערכיס לפונקציות 1 סיכוס .172 תרגיליס .174.5 פרק 17: מחרוזות תו[ים :...9וטורויוווויויויי01115516515550565 2 175 הגדרת מחרוזת בתוכנית 1 הצבה אוטומטית של 11)\ למחרוזות בשפת ++6 1 התו המיוחד ₪011 17 תוכן העניינים ‏ 11 ההבדל בין '\' לביו "2" 1 אתחול המחרוזת 179.4 העברת מחרוזות לפונקציות 1 ניצול העובדה שערך קוד 45011 של התו 11שא הוא 0 1 פונקציות מחרוזת של ספריית ההרצה הסטנדרטית 1 יש לציית לכללים ונהליס 12 סיכוס 1830 תרגיליס 1 פרק 18: מבני רשומות.. ...2 184 הגדרת מבנה רשומה 1 שדות הרשומה 1 הגדרת משתנה הרשומה - 0 מבנה הרשומה והפונקציות 17 פונקציות שמשנות ערכי שדות ברשומה .188.1 שימוש במצביעיס לרשומה 1 סיכוס 1 תרגיליס 1 פרק 19: אי12* ...21 19 אחסון מבנה האיגוד 1 איגוד מאחסן ערך של שדה אחד בלבד בכל זמן נתון ו בי.19%....4 האיגוד האנונימי 195.44 איגודים אנונימייס חוסכיס מקוס בזיכרון 1 סיכוס 196201 תרגיליס 1 פרק 20: מצביעים..ו99ווטווויוווויוויויוויו6555655 6561516465 198 מצביע למחרוזת תוויס 1 דוגמה נוספת 200 קידוס מצביע למחרוות תוויס 0 צמצוס משפטים עודפים 2 סריקת מחרוזת תוויס 7 הפעלת מצביעים במערכים מטיפוסים שוניס [/|/נ//// 1 מתמטיקה של מצביעים 0 סיכוס .|| תרגיליס 20 חלק 4: המחלקות של ++0..-------56666666640 207 פרק 21: המחלקות: תחילת הדר[ ...20921600 העצס ותכנות מונחה עצמים 7 מהס עצמים (אובייקטים)! 0 הגדרת פונקציית מחלקה מחוצ להגדרת מחלקה 17 2 ++6 בקלות שיטות (פונקציות) המחלקה ל דוגמה נוספת 2 סיכוסם 7 תרגיליס 21 פרק 22: החלק הפרטי והחלק הציבורי ...6166666606 217 הסתרת מידע 0 אלמנטים פרטיים ואלמנטים ציבוריים 0 אלמנטים פרטיים ואלמנטים ציבוריים 0 פונקציות ממשק 0000 איברי המחלקה ואופרטור טווח ההכרה הכללי 0 נצל את אופרטור טווח ההכרה לפתרון התנגשות איברי המחלקה ל הגדרת פונקציות פרטיות במחלקה 0 סיכום 0 תרגיליס || | פרק 23: פונקציות בנייה ופונקציות פיר[]..........1116666606. 226 יצירת פונקציית בנייה 207.4 פונקציית בנייה, מה היאז 2 ערכי מחדל של פרמטרים בפונקציית בנייה 229 העמסה של פונקציות בנייה 230 יצירת פונקציית פירוק 2 פונקציית פירוק מה היאז 7 סיכוס 2 תרגיליס 2 פרק 24: העמסת אופרטורים........0 5 237 העמסת האופרטורים פלוס ומינוס 7[ דוגמה נוספת 2 אופרטוריס שאינס ניתניס להעמסה 2 העמסת אופרטוריס אונארייס .45 העמסת אופרטוריס באמצעות פונקציות מטיפוס 0ח6וז? 2 העמסת האופרטור [] ו[ סיכום 2 תרגילים וש בש כ 250 פרק 25: פונקציות סטטיות ומשתני מחלקה..------6616066666 251 שיתוף משתני המחלקה 2 שיתוף משתניס של המחלקה 0 0 שש בו 5 2.5575 השימוש במשתנים ציבורייס סטטיים טרס יצירתו של עצס המחלקה 2 פונקציות מחלקה סטטיות .לפ שימוש בשיטות מחלקה (פונקציות) ישירות בתוכנית 2 סיכוס 6 תרגיליס 0 ל 2 תוכן העניינים | 13 חלק 5: הורשה ותבניות הההההההההההההההההההההההההוההההה,ו: 29 פרק 1.26 2 הורשה פשוטה 5 80 2 ב-90 5‏ ש.ם בבש 5 5 05 ב 0-0 0/00/5095 5 םגש שש ב ב 262.25 ההורשה מה היא? 6 דוגמה נוספת 7 האלמנטים המוגניס 2 אלמנטיס מוגניס מספקים נגישות וביטחון 0 פתרון להתנגשות שמות אלמנטיס במחלקה 20 סיכוס 1:4 269 תרגיליס || פרק 27: הורשה מרובה .00052 272 דוגמה להורשה מרובה 2 בניית הורשה משורשרת - ו גזירת מחלקה חדשה באמצעות הרשאת 6זפעוזוס 7 סוגי הרשאה והיתרי גישה 1 גזירה באמצעות שו|פטס 280 גזירה באמצעות 6זפעווס 2 גזירה באמצעות 66660>סוק 2 סיכוס סוגי הרשאה והיתרי גישה 2 תכנון עצ הורשה 8 סיכוס 8.1 תרגיליס 2 פרק 28: אלמנטים פרטיים ואלמנטים חברים...........161666666 28.5 הגדרת מחלקה חברה 2 מה הן מחלקות חברות? ב השוני בין אלמנטיס מוגניס למחלקות חברות 2 הגבלת הגישה של מחלקות חברות 2 מה הן פונקציות חברות? 2 מזהה מחלקה 2 סיכוס 2 תרגיליס 2 פרק 29: תבניות פונקציה.::ו:יייאאאיסיוגיו:..6...51..55. 29/24 הגדרה של תבנית פונקציה פשוטה ל השימוש בתבנית הפונקציה ו 2 תבניות המטפלות במספר טיפוסים 20 תבניות וטיפוסיס מרוביס 2 סיכוס .290 תרגיליס 2 4 ++6 בקלות פרק 30: תבניות מחחלק ...7 300 הגדרה של תבנית מחלקה 20150 תבניות מחלקה 1 הצהרה על עצמיס בעזרת תבניות מחלקה 7 בניית רשימה מקושרת באמצעות 8065!קוחסדך 2 סיכוס 2 תרגיליס ילילו 4405ו. .211 חלק 6: נושאים מתקדמים ב- ++6..-.--666 313 פרק 31: מאגר הזיכרון הח[ :וט 31 האופרטור עש6ח 0080 חשיבות ההקצאה הדינמית של ציכרון || כאשר אופרטור צו6ח נכשל הוא מחציר 1 וטא 0 מאגר הזיכרון החופשי, מה הוא? | שחרור שטח זיכרון שאינו דרוש עוד 2 דוגמה נוספת || סיכום .|| תרגילים -מ/ננ- 0 פרק 32: פעולות במאגר הזיכרון הח[פש...........-111666666666 1 323 יבירה של מנהל מאגר הזיכרון החופשי 7[ יצירת אופרטוריס שוח ו-06!606 פרטייס 325 סיכוס 2 תרגיליס 7 פרק 33: ניצול מירבי של 618 00071-1.... 330 קוב הכותר ח. 10568 7 השימוש ב-600% | תווי מילוי 7 הצגת מספר הספרות של משתנה 036 .| קלט ופלט של תוויס בודדים [ 2 קליטה של תוויס בודדים מהמקלדת 2 קליטת רצף תוויס מהמקלדת 2 סיכוס 0 תרגיליס ליאאפו הצירו אטיאאריצגהלהו ...237 פרק 34: פעולות קלט/ פלט בקבצים.......... 6 338 ערו פלט לקוב\ .39 ערו קלט לקובצ 2 קריאה של שורה מתוך קובצ 2 בדיקת ציון סוף הקוב 2 בדיקת שגיאה בפעולות קלט/פלט בקבצים 7 סגירת קובצ לב ו-ירב 0-15 ב. .244 תוכן העניינים | 15 בחירת צורת הפתיחה של הקובצ 1 פעולות קריאה וכתיבה .34 סיכוס 7 תרגיליס ...48:00 פרק 35: פונקציות משולבות וקוד אסמבלי בתוכנית............. 349 פונקציות משולבות 5 המילה השמורה 6חווחו 55 1 פונקציה משולבת, מה היא? ל פונקציות משולבות במחלקה 52 שילוב קוד אסמבלי בתוכנית ו סיכוס 5 תרגיליס ל פרק 36: ארגומנטים של שורת הפקודה ...3600 הגישה ל-8706 ו-צאָזםּ 2 הגישה לארגומנטיס שבשורת הפקודה ל התקדמות בלולאה עד ש-עַפָזֶבּ יהיה \!א 5 צחָזהּ כמצביע 200 שימוש בארגומנטיס של שורת הפקודה ו גישה למשתני הסביבה של מערכת ההפעלה 2 גישה למשתני הסביבה 0 סיכוס ל- 362 תרגיליס || || פרק 37: שימוש בקבועים ובהוראות מאקר[.........11111110606000 364 השימוש בקבועי שמות ל הבנת הגדרות קדם-המעבד 0 יצירת קבועי שמות בעזרת 6חו%068 2 קבועי שמות מקלים על הכנסת שינוייס בתוכנית 7 החלפת משוואות בהוראות מאקרו 7 ההבדל בין מאקרו לפונקציה 7 השימוש בהוראת מאקרו גמיש ביותר 371 סיכוס 1 תרגיליס ל פרק 38: פולימורפלם וב 374 מהו פולימורפיוס 7 יצירת עצס 6חסחק פולימורפי 6 2378 עצמים פולימורפיים יכוליס לשנות את צורתס בזמן ריצת התוכנית 2 פונקציות וירטואליות טהורות 1 מתי להשתמש בפולימורפיוס 2 סיכוס 2 תרגיליס 0.7 6 ++6 בקלות פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות...... 385 ייצוג מצביס חריגיס כמחלקות .|| כיצד מוריס ל-++6 לתפוס מצביס חריגיס (משפטי ץז ו-68%60) 0 כיצד לעורר מצב חריג (משפט ששסזח%) 5 פעולת מנגנון המצביס החריגיס 2 הגדרת פונקציה לטיפול במצב חריג (0!87ח8ח ח6000א6) 2 הגדרת פונקציה לטיפול במצביס חריגיס 9 שימוש במשתני מחלקת מצב חריג 2 טיפול במצביס חריגיס בלתי-צפוייס 1 פונקציה לטיפול במצביס חריגים בלתי-צפוייס 2 קביעת המצביס החריגיס אשר מותר לפונקציה לעורר -/ 0 מצביס חריגיס של מחלקות 3932 פולימורפיזם ומנגנון ה-8חו|0ח8ר חס ק66א= 2 מצבים חריגיס בתוך הבנאי 0 סיכוס 2 תרגיליס ה פרק 40: ספריית תבניות סטנדרטיות .1666666665......511 400 עקרונות הספריה 511 0 מכולות ב- 511 02 איטרטוריס ד[ שימוש באלגוריתמיס ואיטרטוריס -4. .07 תווית של איטרטור 0 אלגוריתמיס 0 מתאמיסם (%075ק08) 1 אובייקטי פונקציות (00[66₪ חסטס6חטת) 1 סיכוס .17 מקורות 0 פרק 41: יצירת פר[יק ...4136656155 מהי פונקציית ספריה? 1 יצירת תוכנית ממספר קבצי מקור ו מהו פרויקט? - 0 כיצד נבנה פרויקט || תוכנית דוגמה לפרויקט 18 פרק 42: הרצת תוכנית ב-++6 |15083/ ...4222776000 תיאור תהליך הרצת תוכנית חדשה ב-++6 |1508/ 7 תיאור תהליך הרצת תוכנית קיימת ב-++6 |1508/ ו תוכן העניינים | 17 נספח: מילון מונחים לעובר מ-6 ל- ++6 6666666666 429 מ-5 ל-6 ומ-6 ל-++6 ...429 מערכות קלט/פלט מבוססות מחלקה 0 ערוציס מובניס ב-++6 ב ערוצים חלופיים ב-++6 0 קריאה לפי שם, או על ידי ייחוס 1 הגדרות משתניס ב-++6 ב-431.2-4 כתיבת הערות בתוכנית - 2 מילים שמורות 3 מפתח סימנים מיוחדים.....טוווופוווויוי1.5.5.000ש1121ש212111111. 437 רשימת טבלאות :ב 438 אונדק 43 אינדקס לועזי (התחלה בסוף הספר).....66165666600000 6 453 8 ++6 בקלות כמה מילים על אבי בוץ אבי בוץ הינו מומחה לפיתוח מערכות ובסיסי נתוניס בסביבת פשס6חו/\ ו-אטח!1. מזה 10 שניס הוא עוסק בתכנות ובפיתוח תוכנה בשפות ++6/6 ו-28516 |1503/\. אבי הינו מרצה בכיר במכללת סיון ובמכללות מחשבים מובילות בארצ. אבי הקיס את אתר האינטרנט 6.60 דה ו64%. ש/צשו. דואר אלקטרוני של אבי בוצ: |ו.6%ח. חסו5ו/6%ח%560ססטוצהּ 19 הקדנ/ה במה שונה ספר זה מספרים אחרים בנושא? הספר ++6 בקלות מתחיל מהבסיס, משלב קליטת נתוניס מהמקלדת, הצגתם על המסך ועד לנושאים מתקדמים העוסקים בתכנות מונחה עצמים. המחבר עושה ואת בשיטת ראה-ועשה. הוא מסביר ומדגים, ושוב מסביר ושוב מדגיס - כך, עד שתרכוש יכולת עבודה עצמית. בספר תמצא עשרות דוגמאות לבניית תוכניות בשפת ++6, תרגיליס ופתרונות, אשר יאפשרו לך יילחקות'י אותס בעת תרגול, ולבסוף - גס לשפר, להרחיב ולשלב אותס ביישומיס שתכתוב. הס ישמשו לך ערכת כלים לבניית יישומים של ממש. ווהי מהדורה שלישית של הספר, אשר כוללת עדכונים, תיקוניס ותוספות, כמתבקש בסביבת המחשוב הדינמית והמתעדכנת. מבין החידושיס של הספר: + ספריית תבניות סטנדרטיות - 511 (פרק 40): מהי וכיצד אפשר להשתמש בה. > יצירת פרויקט (פרק 41): בניית קוד תוכנית או יישוס ב-++6 קרויה ייצירת פרויקטיי. בפרק ואה תלמד מהו מרכיביו של פרויקט וכיצד לערוך אותו ולהביאו למצב של יישוס בר-ביצוע. > הרצת תוכנית חדשה/קיימת ב-++6 |8טפו/ (פרק 42): במקריס רביס הצעד הבא בתכנות או בפיתוח מערכות תוכנה הינו מעבר לעולס היוויזואלייי של ++6 הקרוי ++6 |908ו/. בפרק וה תלמד איך להריץ תוכנית ++6 שכתבת בעבר או שאתה כותב כעת. > שיפורים ותיקוניס להסבריס ולתוכניות, כפי שמצאנו, או כפי שהעירו לנו קוראינו הנאמנים. תודתנו לכולס. למי מיועד הספר? הספר ++6 בקלות מיועד למי שמתחיל את צעדיו הראשונים בתכנות, וגס למי שיש לו רקע ומעט ניסיון בתכנות ורוצה לעבור לשפת ++6. גם אם אתה מבין מהס משתנים, לולאות ופונקציות, תמצא תועלת בספר זה. תוכל לעבור במהירות על הפרקיס הראשוניס ותמצא בו נושאיס חדשיס המיוחדיס לשפת ++6. אס אתה יודע 21 המדקה‎ תכנות, אך תכנות מונחה עצמים - פַחווחוחבּזטסזק %60ה16ז0 00[66% (005) לא מוכר לך עדיין - אל דאגה. הספר ++6 בקלות מניח שאין לך רקע קודם בתכנות מונחה עצמים, ועל כן הוא מנחה אותך בשביליו של עולס מופלא ומתקדם זה. אם אתה מתחיל, מהתחלה... ובכן, ה יהיה מהנה אפילו. ++6 היא אכן שפה נפלאה ומורכבת, אך גס העושיס את צעדיהס הראשונים בעולס התכנות יוכלו להתמודד איתה בעזרת ספר זה. הספר שבידך יתן לך יסודות מוצקים בתכנות ברמה הגבוהה ביותר. תלמד כיצד לתכנת בצורה נכונה, אך, תצטרך לעבוד לאט: יהיה עליך לקרוא בעיון כל פיסקה ולהריצ כל דוגמה, לפתור בעצמך את התרגיליס ואחר כך להשוות לפתרון שהספר נותן לך. בסיומו של הספר תדע תכנות, וגם תדע לתכנת יישומיס כרצונך. ואז... עבור לשלב הבא בעזרת מיגוון הספריס שהוצאת הוד-עמי מציעה לך. כיצד להשתמש בספר? ספר לימוד קוראים מהתחלה. זה נכון, אבל יש עוד מספר דרכיס לקריאת ספר זה. לספר יש תוכן ענייניס מקוצר, תוכן מפורט מאוד, וגס אינדקס עברי/לועזי. תוכן הענייניסם המפורט מאפשר לך למצוא במקרים רביס את מבוקשך, ואם לא - יש אינדקס שיביא אותך בדיוק לנושא שחיפשת. לאחר שתעבור ותלמד את הנושאיס השוניס שבספר, תוכל להניח את הספר בצד ולהיעזר בו מעת לעת לפי הצורך. מומלצ להקדיש זמן לדפדוף בספר, כדי להכיר אותו בצורה כללית ולהתרשם מיכולות השפה שאותה הינך עומד ללמוד וליישס. כך תדע לאן לפנות כשתיתקל בקושי כלשהו. מה בספר? ++6 בקלות מחולק לשישה חלקים, בהתאם לשלבי הלימוד של שפת ++6. כל חלק עוסק במכלול נושאיס המהוויס יחידת לימוד אחת: + חלק 1 מניח את היסודות לתכנות בשפת ++6: משתנים, קלט ופלט בסיסי, משפטי התנייה 19) עס אופרטורים יחסיים ולוגיים, וגסם לולאות. + חלק 2 עוסק בבניית תוכניות ושימוש בפונקציות, ובכלל ה העברת פרמטרים, שימוש בספריית ההרצה (עזפזם!ו!| שוחש-חטז), טווח ההכרה של משתניס (56006 80!6וזאץ), העמסת פונקציות (פחסט6חט 8ַחוסְבסוזסעס), משתני ייחוס (76/0700069 | ++6) ודרכיסם לקביעת ערכי ברירת מחדל לפרמטריס (65ט]ה/ ז6ז6חהּזבכ ז!061800). + חלק 3 מציג דרכים לאחסנת נתוניס במערכים (8/5זו8) ובמבנים (600165ט907). בחלק וה נלמד גם על עבודה במחרוזות תווים (95ח5071 זסז8786ח6), על שימוש באיגודים (פחסוחט) ועל מצביעים (5זסזחוסס). + חלק 4 מוקדש ללימוד נושא מרכזי בתכנות מונחה עצמים - המחלקות (6|85505). נלמד גם על נתוניס פרטיים (ספטוזק) וציבוריים טשו!ופטס), על פונקציות בנייה (5ח600חט? זס5006%ח60) ופונקציות פירוק (5חס6חט1 זס6%ט0650). פרק אחד 2 ++6 בקלות מוקדש להעמסת אופרטוריס (פַחו0/671080 זס)8זסקס) ופרק נוסף - לפונקציות סטטיות (5ח6₪0חט+ 5%806) ומשתני מחלקה (5ז6סוחסוח 08%8). > חלק 5 ממשיך בלימוד תכנות מונחה עצמיס ומציג את ההורשה (66ח88ו6חחו) הרגילה וההורשה המרובה, אלמנטיס פרטייס וחברים (800 5זססוחסוח ס6זהעוזוק 5]) ואת השימוש בתבניות פונקציה (8065!קוח6+ חסטסחנט)) ובתבניות מחלקות (8%65| 6+ 6|]855). > חלק 6 ממשיך בנושאיס מתקדמים של ++6 ועוסק בניהול משאבי הזיכרון החופשי (50016 66/)), פעולות קלט/פלט בקבצים, ייעול חו6 ו-+600, שילוב שגרות אסמבלי בתוכניות ++6, ארגומנטיס של שורת פקודה, קבועיםס ומקרוס, פולימורפיזס (ותפוחקזסוחץוסק) וניהול חריגיס (5ח₪0ק66א6). בנוסף, על 57₪, יצירת פרויקט וקצת על ++6 |5808!/. תרגילים לחזרה: בסוף כל פרק תמצא תרגילים אשר עוסקים בנושאים שבהם דן הפרק. פתור אותס בעצמך תחילה, ורק אחר כך קרא מתוך התקליטור את הפתרון המוצע. פתרון וה אינו היחיד וגם אינו בהכרח האופטימלי, או האלגנטי ביותר, אך תוכל בהחלט להשתמש בו כבנקודת התייחסות בלימודיך. שיק צ! חשוב! הספר נכתב לצורך לימוד עבודה במהדר בורלנד מתקדם. התרגילים והפתרונות הורצו בגירסה ‏ 4 ומעלה ‏ של מהדר ++6 0ַחבּ!זס8. תוכל להריץ אותם גם במהדר אחר, או במהדר 6 |6דך (גירסה קלה של מהדר 0ח801!8) שנמצא בתקליטור המצורף. את רוב התוכניות והתרגילים ניתן להריץ במהדר %6ו161. החומר שבפרק 39 מחייב מהדר מגירסה 4.5 ומעלה של בורלנד, או גרסת מהדר אחר ברמה זהה לפחות, או ++6 |1508/. בספר זה תמצא כליס שוניס שבהס אנו משתמשים לעזר במהלך הלימוד: הערה הערה הקשורה בנושא המדובר. 07 שיק +! הדגשת עניין בעל חשיבות מיוחדת או אזהרה. מודגש: טקסט מודגש בעת הופעת מושג בפעס הראשונה ו/או כדי להבליטו בפיסקה. במסגרת עם הצללה, הסבר נוסף, בעברית פשוטה או במילים אחרות, על מושג או נושא שבו דניס בפרק. 23 המדקה‎ תוכנת 6וו61ד בתקליטור המצורף לנוחותך תמצא בתקליטור מהדר 61106 של בורלנד, באדיבות חברת 0חאחסש. באמצעות מהדר וה תוכל להדר את רוב התוכניות. להידור התוכניות המורכבות של ++6 תודקק למהדר שלס של השפה. מהדר 161/00 הוא גירסה קלה של מהדר ++6 06ח088סם, אשר עוצב על ידי חברת בורלנד, כדי לאפשר תרגול של תוכניות ++6. רוב התוכניות הורצו במהדר זה, אך לא כולן (יש תוכניות שזקוקות למהדר מתקדס יותר). על כן, אס יש קושי בהרצה של תרגיליס כלשהם, ראוי שתריץ אותס לבדיקה במהדר שלס. הוראות ההתקנה וההפעלה המלאות נמצאות בתקליטור בקוב\ 1!.606ב5%ח1 \ 66ו!6+ \ 500/36 אס מותקן כבר מהדר 8071300 במחשב, אל תתקין את 61.186ד אלא רק העתק את התוכניות מהתקליטור. התיקיה 6זו|6+\6יובּעש5010 \ תוכנת 96 01ד (1/66 6 סטזוטד), מהדר לשפת ++6\6 של חברת |הַּחסוהחו%6ח1 סחה\וסט, אשר מיועד למחשבי 06 18% ותואמיס. אהו מהדר מהיר מאוד המסוגל, לפי דיווחי החברה, להדר מעל 7,000 שורות בדקה. התוכנה כוללת : + מהדר 60!וקוחסס). * עורך (%0ו60) המשמש לכתיבת ותיקון התוכניות. > מערכת תפריטים נוחה, לבחירת האופציות השונות במערכת. * מקשר כ660אחו). * | מערכת איתור שגיאות בהידור. . מערכת לבניית תוכניות מקבצי מקור רביס. הודעה רשיון השימוש לתוכנה מוגבל להדגמה בלבד. התוכנה משווקת כמו שהיא (''15 455'), ללא אחריות לתוצאות העלולות להיגרס מהשימוש ו/או אי השימוש בתוכנה מכל סיבה שהיא, וכן להפסד כספי, ומן, רכוש ו/או כל הפסד אחר שייגרס, אס ייגרס. 4 ++6 בקלות התקנת התוכנה ההתקנה וההפעלה פשוטים. עקוב אחר הסעיפים הבאים. ניתן להתקין תחת פשסבחו/\ אך להפעליל, רצוי וצריך תחת 05ם. ההתקנה תבוצע בסביבת העבודה 05כ, ולצורך ההסבר נתייחס לכונן :6 (אותן פעולות תעבודנה גס על כל כונן אחר). >>אם אתה נמצא ב-פשסחוצ\ - כבה והפעל את המחשב במצב ₪05פ<< >>בחלון כיבוי המחשב סמן את האפשרות 12 15-05 חן זס+ט קוה 60 6+ +₪65+37 < < 1 יש לעבור לתיקיית השורש על ידי הפקודה: \ 60 (קיצור של ץ66001ז01 6פַח8ח6), ולהגיע למצב זה: <\:6. 2< במקרה וזה איננו ניסיון התקנה ראשון - יש למחוק את התיקיה שד |6ד, שבתוכה תותקן התוכנה. עשה זאת על ידי הפקודה: 0+ 06|066, ואז תראה על המסך את המשפט הבא : 666 0:\<06|0766. לבסוף, הקש <זסשח=>. אס התיקיה לא קיימת, הסמן יעבור מיידית לשורה חדשה וימתין להוראה. אס התיקיה קיימת, תופיע השאלה הצו: [חץ] ?5000176600765 15 |ו3 חב "06ו!6ס" 01766607 60| כלומר, 'האסם אתה בטוח שאתה רוצה לבטל תיקיה זו'י הקש על המקש<+ץ> ואחר כך על <ז00ח=>. המחשב ידווח: ...וס 8חססוסס. 3 עתה יהיה עליך לעבור לכונן המתאיס של התקליטור (למשל :א). המעבר ל- :א - על ידי הפקודה: :א (ואז על המסך יהיה כתוב: :א<\:6). לאחר הקשת <זססח=> הסמן המהבהב יופיע אחרי = <\:א. 4. עכשיו הכל מוכן לביצוע ההתקנה. כתוב את הפקודה: :6 5%8/1ח1<\:א (שפירושה, התקנה לתוך כונן :6). שיס לב: אל תשכח לכתוב :6, כלומר לאן יש לבצע את ההתקנה. המחשב ידווח על התקנת התוכנה ם1ז1611. משך ומן ההתקנה תלוי במהירות המחשב שלך, ויכול להימשך גם מעל 2 דקות. בדרך כלל ההתקנה מהירה יותר. 5 במקרה של תקלה (תקיעת המערכת) יש לבטל את ההתקנה על ידי <6>+<|600>. במקרה זה המחשב ישאל: ?(א/+ץ) פסן ה0806 6זחווחזסד; כלומר, האס לסייס את העבודה. יהיה עליך להקיש <צ> ו- <זס6חם>, ואז, בהנחה שיש די ויכרון בדיסק הקשיח, לחזור על שלבים 2-4. 6 לאחר סיוסם ההתקנה שיס את התקליטור בצד ושמור אותו כגיבוי. הפעלת התוכנית והרצת התוכניות נעשית מתוך הדיסק הקשיח. הקדמה 25 הפעלת התוכנה 1 2 יש לחזור מכונן :א לכונן :6, ולהימצא בתיקיית השורש של כונן 6. הכניסה ל- ++6 - על ידי הפקודה 6:\<6 המפעילה את קוב ההפעלה ד0ג6.0. כתוצאה, מקבליס את סביבת העבודה של ++6/6 ספזטד, ובתוכה חלון פתות בצבע כחול, ששמו: ₪00.69 הא סא (רק בפעם הראשונה שנכנסים לתוכנה). אס הקוב 6.98% לא הועתק לכונן 6 שלך, העתק אותו ידנית או צור קובצ אצווה חדש. קובץ ההפעלה של התוכנה נמצא ב-6א6.6)\חום \66ו|6). כדאי לסגור את החלון 500.67 א סא על ידי צמד המקשים <3->+<)|)> ואז מקבליס חלון אפור ריק, שבראשו רשימת תפריטים על רקע לבן. כרגע אתה מוכן להתחיל לעבוד בעזרת התוכניות שבספר. שימו לב: ברירת המחדל של המהדר היא לקרוא ולשמור קבצים עם סיומת 6 או קק). בחר 6.* או טט6.* בהתאס לקבצים שפת 6 או שפת ++6). הרצת תוכניות העתק את התיקיה של התוכניות לפי ההוראות בהמשך. .1 26 כדי לקבל תוכנית - יש להקיש <3=>. הקשה זו פותחת ייחלון שיחהיי, שכותרתו הראשית: 6 8 1080 (ייטען קובציי) וכותרת משנה ראשונה הינה: שוח ואחריה, בתוך שורה כחולה עס הדגשה ירוקה כתוב: קק0.* (אס אתה מריצ תוכניות 6 - הקש 886650866 פעמיים כדי שיישאר רק 6.*. אס אינך רואה דבר הקלד 6.*, ולאחר מכן הקש <ז060חם>). תעבור לחלון פנימי שכותרתו ₪165 (ייקבציסיי), ותראה על רקע בצבע תכלת 2 טוריסם של שמות קבציס. באופן כללי, מקשי החיציסם מאפשריס לעבור עס ה'יסמןיי, שצבעו ירוק בהיר, על כל הקבצים. בחר את התיקיה הרצויה ואת הקוב הרצוי. הקשה על <זפסחם> תכניס אותך לתוכנית. כדי לבחור תיקיה אחרת הקש על \.. שמופיע בסוף הרשימה של התוכניות. הקשת <%07ח=> על שס קובצ תפתח חלון כחול, שכותרתו במרכז הינה: יישס הקובציי, ובתוך החלון יופיע הטקסט של תוכנית זו (או של קובצ זה). כדי להריץ את התוכנית עליך להקיש על צמד המקשים: <9-">+<]61>. המחשב יתרגס את התוכנית לשפת מכונה ויבצע אותה. כדי לראות את פלט התוכנית הקש <5=>+<)|\>. יש להקיש על מקש כלשהו כדי לחזור לחלון התוכנית. המשך ההרצה של תוכניות נוספות מומלצ באופן הבא: לסגור תחילה את חלון התוכנית הנוכחית על ידי בצמד המקשים <3-">+<1|6>. אחר כך ניתן לתזור על השלבים 1 עד 5, כאשר בשלב 3 אפשר לבחור תוכנית אחרת. ++6 בקלות הערת: בכל שלב בסעיפי הרצת התוכניות אפשר לבטל שלב כלשהו ולחזור לשלב הקודם על ידי המקש <256>. העדה חשובה/?? אס המחשב שלכס מחובר לרשת, המלצתנו היא - להקיש ₪5 בזמן אתחול המערכת כדי לדלג על ביצוע הקבצים 66.080א80106 ו-5/5.פַמחסס. אס לא תעשו כך, *יתכן שבתוכניות תראו תווים לא מובניס במקום עברית. קוד המקור בתקליטור המצורף בכל אחד מששת חלקי הספר תמצא עשרות תוכניות בשפת ++6. ביניהן תוכניות קטנות ופשוטות ומהן תוכניות ארוכות ומורכבות. אנו מציעים לך ללמוד אותן, וחשוב לא פחות - להריץ אותן במחשב. כדי למנוע ממך את הטרחה, הטעויות ובזבוז הזמן הכרוכיס בהבאתן למצב ריצה, התוכניות מצורפות בתקליטור. התוכניות הורצו ונבדקו, אך :ייתכן שתמצא טעות כלשהי בספר או בתוכניות שבתקליטור. אנו מבקשיס ממך לבדוק את הנושא בעצמך, כחלק מתהליך הלימוד שלך. נודה לך אס תודיע לנו על השגיאה, אס ישנה, כדי שנוכל לתקן בהדפסת המהדורה הבאה. בתקליטור תמצא גס את קוב הפתרונות לתרגיליס שבסוף כל פרק (אין פתרונות לכל התרגילים). אנו ממליציס שתפתור את התרגיליס בעצמך, טרס שתפנה לפתרון המוצע. ואת ועוד: הפתרון המוצע אינו בהכרח הפתרון היחיד, או הטוב ביותר! בתיקיה 59253 \80065 תמצא את קבצי התוכניות בשתי תיקיות : 56/52פא - התוכניות שכלולות בספר. דסא סא ד - הפתרונות לכל התרגיליס שבסוף כל פרק. התיקיה ₪556055 תיקיה זו כוללת 7 תת-תיקיות שבהן תמצא את רוב התוכניות המוצגות בספר. תיקיה או מחולקת לשבע תת-תיקיות (556) המסומנות לפי חלקי הספר (1 עד 6): 5561 , 5562 , 5563 , 5564 , 5565 , 55606 ,8 (תוכניות חלק 6 נמצאות בשתי תת-תיקיות : לפרקיס 31-35 ו- 36-39 בהתאמה). תוכל לקרוא את הקבציס לעורך ++6 של 66ו61ד או לעורך אחר, כרצונך. התוכניות כתובות בקוד מקור של ++6, כך שתוכל לערוך בהן שינוייסם כרצונך ולהריצ אותן לתרגול. כמה מהן תוכלנה לשרת אותך במסגרת עבודתך. שמות הקבציס הינס כפי שתמצא במהלך ההסבריסם והדוגמאות בספר. קבצי ++6 נושאיס את הסיומת ססס. כמו למשל: סק9%.6ז₪. 27 המדקה‎ התיקיה דסאסאדזק תיקיה זו כוללת את הפתרונות לתרגיליס שבכל פרק. כל תוכנית נמצאת בקוב\ נפרד, לפי הסימון הבא : קק0.אא החאם כאשר: חח - מייצג מספר דו-ספרתי של מספר הפרק המתאים. אא - מייצג מספר סידורי של התרגיל באותו פרק. לדוגמה : ,2 34אם פירושו: פתרון לתרגיל 2 שבפרק 34. העתקת קבצי קוד המקור לדיסק הקשיח כדי להעתיק את תכולת התיקיה 00%5\59253ם : 1. לחצ על לחצן התחל, תוכניות, סייר 5\וססחוצ\. 2 לח על כונן התקליטוריס וסמן את התיקיה 59253 שבתיקיה 5אססם. 3 גרור אותה לתיקיה 866ו|6ד או לתיקיית השורש 6. מכיוןו שמקור הקבצים הוא התקליטור, הס מסומניס לקריאה בלבד. יש לשנות מאפיין אה כך: 1. בסייר 5שסוחו)\ היכנס לתיקיה בדיסק שבה נמצאים הקבציס שהעתקת (6:\)6|!66\59253 או אחרת). 2 סמן את כולס על ידי 601+8. 3 הצב את סמן העכבר מעל האזור המסומן ולח לחיצה ימנית בעכבר. 4. מהתפריט המקוצר בחר מאפיינים. 5 בטל את הסימון בתיבה קריאה בלבד (דאג שהיא תהיה ריקה). 6 לחץ על החל, לחצ אישוד. בדוק האס השתנה המאפיין על ידי סימון הקובצ: לחיצה ימנית ובחירה במאפיינים בתפריט המקוצר. שיס לב שהתיבה של קריאה בלבד תהיה ריקה. התוכניות והפתרונות המצורפים הורצו ונבדקו. עשינו את מירב המאמצים כדי לבדוק את תקינות פעולתן, ולא נותר לנו אלא לאחל לך תרגול מהנה ומועיל. שים לב, שאם אתה עובד במהדר 61166 - הכל מתבצע בסביבת המהדר. לא יוצרים קוב\ םאם ולא יוצאים ל-05פ כדי להריץ אותו. הספר נכתב לשימוש במהדר רגיל ולכן יש לשים לב לשינויים כאשר עובדים ב-6:ו61ד. 8 ++6 בקלות חלק 1 נועואינו בבסיטייםו בחלק הראשון של הספר נציג את הנושאיס הבסיסיים הדרושים לבניית תוכניות בשפת ++6. חלק זה כולל את עקרונות התכנות מהצעד הראשון, ומעניק לקורא את הידע הבסיסי הדרוש לכתיבה ותכנות בשפת ++6. חלק זה כולל את הפרקים הבאים: פרק 1 - התוכנית הראשונה פרק 2 - מבט על שפת התכנות ++6 פרק 3 - כתיבת הודעות על המסך פרק 4 - משתנים לאחסון המידע פרק 5 - פעולות אריתמטיות בסיסיות פרק 6 - קליטת נתוניס מהמקלדת פרק 7 - הרצת תוכנית על פי תנאיס ב ב טצ צ בצ רצ ם פרק 8 - לולאות 29 0 ++6 בקלות התוכניר: הראעוונה השימוש במחשב הולך ומתפשט. מספר רב של תוכנות משרתות סוגים שוניס של משימות בעבודה היומיומית. בין התוכנות הנפוצות ניתן למנות מעבדי תמלילים, גליונות אלקטרונייס וסביבת עבודה 05כ, חלונות - פאוס6חו/\ או אזאט. למעשה, תוכניות מחשב, או תוכנה (6ז50\8) הן קבציס המכילים רצף של פקודות הקובעות כיצד המחשב יפעל. קבצים שהסיומת שלהם וח60 או 6%6 הם תוכניות הרצה המכילות את הפקודות להפעלת המחשב, ואשר פועלות במחשבים אישיים. במיליס אחרות, הקבציםס מכיליס פקודות מסוימות שהשילוב והמבנה שלהן מאפשרים את ביצוע המשימה הרצויה. בעת כתיבת התוכניות, המתכנת מציין רצף פקודות לביצוע פעולות במחשב. בפרק זה נציג כיצד לכתוב פקודות אלו בשפת ++6. בהמשך הפרק נדון בנושאים הבאים : % כדי לכתוב תוכנית יש להשתמש בעורך (0זו60 6606) להקלדת פקודות ++6 שיוצרות את קוב המקור. + כדי להפוך תוכניות ++6 לתוכניות הניתנות להרצה (מורכבות מקוד בינארי, הכולל את הספרות 0 ו- 1 בלבד, ושאותו המחשב מבין), משתמשיס בתוכנית ייעודית הנקראת מהדר ++6. % כדי לשנות את קוד התוכנית משתמשים בעורך. > כאשר עוברים על כלל תכנות אחד או יותר של ++6, המהדר מציג על המסך הודעת שגיאת תחביר מתאימה (זסזז6 אפזחץ5). במקרה זה יש לערוך שוב את התוכנית, לתקן את השגיאות שנפלו בה ואז - להדרה שנית. ניתן להגדיר את עבודת התכנות כתהליך יצירה של רצף הפקודות שהמחשב יריצ כדי לבצע משימה מסוימת ומוגדרת. הכלים ליצירת רצפיסם אלה הס שפות התכנות (סְחָבּששח3ּ! שהווהוחבּזטסיוק), ביניהן שפת ++6. המתכנת כותב את רצף הפקודות בקוב מקור (11!6 50₪166), המכיל את רשימת הפקודות בשפת התכנות שבחר. הדרך המוצלחת ביותר להבנת עבודת התכנות היא על ידי התנסות וכתיבה של תוכניות בשפת ++6. פרק 1: התוכנית הראשונה ‏ 31 יצירת התוכנית הראשונה כעת ניצור את התוכנית הראשונה בשפת ++6. לקוב\ המכיל את התוכנית ניתן את השס 092.ד185;. הסיומת קק6 מציינת שהתוכנית שבקובצ כתובה בשפת ++6. המשימה שעל התוכנית לבצע, פשוטה: הצגת המשפט "!++6 עס 65660" על המסך. בשורות הבאות מוצגיס סימן ההנחיה פקוחסזק) של מערכת הפעלה 05 (בדוגמה <\:6), הפקודה להרצת התוכנית והודעת הפלט שהיא מציגה על המסך: <עססתת> ‏ 18257ע<\:0 !++0 צץס 2650066 כידוע, את מלאכת התכנות ניתן לבצע ישירות ברמת שורת הפקודה (בסביבה כגון 5 או א1א)), או לחלופין בסביבה המבוססת על פווססחו/\. למען הפשטות, כאשר נציג את פלטי תוכניות הדוגמה המופיעות בספר וה, נצא מנקודת הנחה כי קוראינו עובדים ישירות דרך שורת הפקודה. במקרה זה, לדוגמה, כדי להריצ את התוכנית 5אם. 1851" צריך להקליד תחילה את שס התוכנית 1851" בשורת הפקודה של המערכת, ולאחר מכן להקיש על זס%חם. שים לב, שאם אתה עובד במהדר 61106 - הכל מתבצע בסביבת המהדו. לא יוצרים קוב םאם ולא יוצאים ל-005 כדי להריץ אותו. הספר נכתב לשימוש במהדר רגיל ולכן יש לשים לב לשינויים כאשר עובדים ב-6זו61ד. השלב הראשון של כתיבת התוכנית היא עריכת קובצ מקור שלה באמצעות עורך, כמו 0% (המסופק עס חבילת מערכת ההפעלה 05כ). חשוב להדגיש, כי אין להשתמש במעבדי תמלילים כגון 6זס)\, מכיוו שקבציס הנערכיס באמצעות תוכנות אלה הינס בעלי פורמט מיוחד הכולל התייחסות לצורה החיצונית של המסמך כמו: אותיות מודגשות, יישור פסקאות, קביעת שולייס ותכונות נוספות. מעבדי התמליליס משלבים תווים מיוחדיס בתוך הטקסט, שלפעמיס נסתריס למשתמשים, ואשר מטרתס לסמן את הצורה החיצונית של הטקסט. פענוח הסימנים נעשה על ידי תוכנת מעבד התמלילים שיצרה אותם. לסימניס אלה אין משמעות בשפת ++6, והימצאותס בתוך התוכנית עלולה לגרוס לתקלות בתכנות. המהדרים של ++6 יימביניסיי קבצי 45611 'ינקיים'י. בשלב ראשוני של הלימוד מומלצ לטעון תוכנת עורך (או במהדר 101/%6) ולכתוב את שורות התוכנית המופיעות להלן: <ת.ת108%2608> 866ט610ת1+ (10סט) תנאת ה1סט \ ;"!++0 שס סטספ6ת" >> סגוסס ו נלמד את פירוש הפקודות, או משפטי התוכנית (065ח6וח5%90%0 הוחהזפָסזק) האלה, בפרק 2. בשלב זה נעסוק בכתיבת הפקודות בלבד. יש לשיס לב לתחביר: דיוק ברישוס 2 ++6 בקלות ומיקוס הפסיקים, נקודות-פסיק והסוגריים המסולסלים. לאחר בדיקה חוזרת ניתן לשמור את רצף הפקודות בקוב\ ששמו 699 דפח1". משמעות השם של התוכנית קבציס המכילים תוכניות ++6 מסתיימיס בסיומת (חסטחט6אם) זו - 5 6. השימוש במוסכמה זו מקל עלינו ועל מתכנתיס אחריס להבחין כי קובצ מסוים מכיל תוכנית ++6. מומלצ ביותר לתת לתוכניות שמות ברורים, המעידים על תפקידן. לדוגמה שס של תוכנית המטפלת בנושאי תקציב, יהיה <ק6. דפספטפ. באופן דומה, לתוכנית שתפקידה הוא חישוב משכורות כדאי לקרוא קסס. ץח |54. הערה כדי למנוע בלבול, לעולם אין לתת לתוכנית שם של פקודת 05ס-15, כמו | למשל, +60 או שס. הידור התוכנית - קומפילציה המחשב פועל על פי שפה מיוחדת, שפת מכונה (סַא6033ח3! ס6חוח6בּוא), שמתבססת על צירוף של הספרות 1 ו- 0. משמעות הספרות היא נוכחות או היעדר של אות חשמלי. לכן, לפני הרצת תוכנית המקור, הכתובה בשפת התכנות, צריך להמיר אותה לשפת מכונה. ההמרה מתבצעת על ידי תוכנית מיוחדת - מהדר (וסווקוח 60) והפעולה נקראת הידור (חס0וש01!3וח 60). לכל שפת תכנות יש מהדריס מסחריים שונים. הנה הפקודה הדרושה להידור של תוכנית 1851" במהדר ++6 של חברת 6חה|זסם (לא ב-6זו |70) : <66%םת> 57.025ת1ע 60:\<200 הערה חשובה: אם אתה משתמש במהדר המצורף בתקליטור - 06ו61ד, גרסת המהדו הזו אינה כוללת את הפקודה 866. את ההידור יש לבצע מתוך המהדר. פעל לפי ההוראות בהקדמה ובקובץ 5131!.6406חו. במילים אחרות, המהדר עובר על קוב המקור המכיל את תוכנית ++6 ומנתח אותו. אס משפטי התוכנית אינס מפרים אף כלל תכנות של ++6, המהדר ממיר את הקוד לשפת מכונה (ספרות 0 ו- 1) שהמחשב מבין ויודע לבצע. הסיומת של קוב המכונה הנוצר היא 5%5, קיצור של 6טַ8ט60אם. כעת, כשקוב\ המכונה מוכן, ניתן להריץ את התוכנית על ידי הקלדת שמה בשורת הפקודה, כמקובל. צורת ההפעלה של מהדר ++6 תלויה בסוג המהדר שברשותך. לדוגמה, אס אתה מפעיל את המהדר ++6 סאג |808, הידור התוכנית קס.זפח1" למשל, יתבצע באמצעות הפקודה 866 כמו בדוגמה זו: <6%פת₪> 1257.028ת 60:\<200 פרק 1: התוכנית הראשונה 33 הוראות להידור באמצעות מהדרים של חברות אחרות מופיעות בספרות הנלווית למהדר. לאחר סיום ההידור נוצר קובצ הרצה. בסביבת העבודה של מערכת הפעלה 5, תוכנית הרצה תקבל את שם קוב המקור והסיומת שלו 5א5. בדוגמה שלנו הקוב יהיה 5אם. ד155=. הערה חשובה: למרות שהמהדר %6ו61ד המצורף בתקליטור יוצר תוכנית 5אם - לא ניתן להריץ אותה משורת הפקודה (זו המשמעות של גרסת 1186 לעומת הגירסה המלאה). פעל לפי ההוראות בהקדמה ובקובץ 5131!.606ח1. ייתכן כי בשלב ההידור תופענה הודעות שגיאה על המסך. במקרה זה יש לטעון את קוב המקור בעורך התוכניות, ולבדוק את תוכנו מול הרשוס בספר. לאחר תיקון הטעויות יש להדר את הקוב שנית. לאחר שההידור מסתייס בהצלחה, צריך להריצ את התוכנית על ידי הקלדת שמה בשורת הפקודה, כפי שהוסבר. המהדר - מה הוא עושה? כדי ליצור תוכנית, משתמשיס בפקודות של שפת תכנות מסוימת (++6 לדוגמה). הפקודות הדרושות נכתבות בקוב> מקור. בהמשך יש להפעיל תוכנית מיוחדת הקרויה מהדר (6!וקוחס6), הממירה את קוב המקור לשפת מכונה (שהיא השפה שהמחשב מבין). אס ההידור הסתיים בהצלחה, נוצר קובץ הרצה. לעומת ואת, אס בקובצ המקור נכתבו הפקודות לא לפי התחביר והחוקים של השפה - המהדר יציג על המסך הודעות שגיאה. המתכנת צריך לתקן את השגיאות בקוב> מקור, ולהדר שוב את התוכנית. אם אתה עובד על מחשב מרכזי או על מיני-מחשב, ייתכן וכבר מותקן עליו מהדר הנגיש לך ולכל שאר משתמשלי המערכת. אך אס אתה עובד על מחשב אישי, יחיה עליך לרכוש ולהתקין מהדר מסחרי, כגון ++6 סחפ!זסם או ++6 [ה508ו/ ספסזסוו]. ללימוד בלבד, ואולי קצת יותר, תוכל להסתפק במהדר פד 61ד, שנמצא בתקליטור המצורף. יצירת התוכנית השנייה כעת נעבור לתוכנית השנייה. לקובץ מקור של התוכנית ניתן את השס 5ק0.צ845. בתוכו נכתוב את הפקודות המופיעות כאן: <ת.ת108%2608> 866ט610םת1+ (16סט) מ1את ה1ס7 ָ ;"!7ץ685 18 ++6 ם1 שתנ1נתתהעטסס2ק" >> סגוסס 4 ++6 בקלות לאחר שמירת הקוב, נהדר אותו ונשתמש בשס הקוב, כדי להפעיל את התוכנית. הפקודה הדרושה לביצוע הידור של תוכנית +55 במהדר שפת ++6: <66%םת> ‏ ע8ע02.צפתםת 60:\<200 סיוס מוצלח של ההידור ייצור קוב הרצה לתוכנית, ששמו 5%5.צ55. כאשר מריציס את התוכנית, יוצגו על המסך השורות הבאות : <עססתם> צפתם<\:0 !ץ685 18 ++6 ם1 טמנ1תתהצףס+ק כעת נשנה בקובץ המקור פפס.צפאפ, נערוך אותו מחדש ונוסיף את המילה ץוע במקוס המתאיסם בהודעת הקלט של התוכנית, כפי שמוצג כאן: ;"!ץ685 צעסט 18 ++6 ם1 שתנתתהצטסצק" >> סטסס נשמור את הקובצ ונהדר שוב. בהרצה זו התוכנית תציג את ההודעה החדשה: <2ס6פת >8‏ צפתם<\:0 [ץ688 שעסט 18 ++60 ת1 שמנ1תתה028ףס-ק כל פעס שעורכיס שינוייס בקובץ מקור, יש להדר את התוכנית שוב, כדי שהשינוייס יהיו תקפיסם בהרצת התוכנית. כל שינוי בתוכנית מחייב את הידורה מחדש, כדי שהשינויים יבואו לידי ביטוי בקוד שפת המכונה. למשל, השתמש בעורך כדי לשנות את קובצ המקור, אך הפעם, הוסף שורה, כפי שתוכל לראות בדוגמה הבאה: <םת.ת108%208> 866ט610םת1+ (ס1סט) תנאת ה1סט \ ;"!ץ685 צעסט 18 ++6 ם1 שתנ1נתתהפטסצק" >> סגטסס ;"!0001 צְ666ע2ק תת" >> 01ם8 >> סטסס ] את השינוייס יש לשמור בקובצ המקור. כעת ניתן להריצ את התוכנית, וגם נקבל את התובאות בשורה שתחת פקודת ההרצה: <%ססתם> צפתם<\:0 [ץ688 שעסט 18 ++6 ת1 ש6ת1תתה28ף0ס-ק כפי שניתן לראות, לא הוצגה שורת הפלט החדשה, אשר נוספה בדוגמה זו. כאמור, יש להדר את התוכנית מחדש כדי שהשינויים בקובצ המקור ייכנסו לתוקף. לפיכך, נהדר עתה את התוכנית פעם נוספת. כעת, כאשר נריצ את התוכנית, יופיע על המסך הפלט במלואו, כפי שרצינו: <צססתת> צפתם<\:0 [ץ688 שעסט 18 ++60 1 6ש6מ1תת0428ס-ק !0001 צְ2666ס סתת פרק 1: התוכנית הראשונה 35 להזכירך: אם אתה משתמש במהדר המצורף בתקליטור - 6זו61ד, גרסת המהדו הזו אינה כוללת את הפקודה 866. את ההידור יש לבצע מתוך המהדר, ולמרות שהמהדר 61186ד המצורף בתקליטור יוצר תוכנית םאם - לא ניתן להריץ אותה משורת הפקודה (זו המשמעות של גרסת 1186 לעומת הגירסה המלאה). פעל לפי ההוראות בהקדמה ובקובץ 51311.606ח1. שגיאות תחביר, מהן? בכל שפה ושפה קיימים חוקים לכתיבת משפטים. חוקים אלה הס תחביר השפה (א%8חץ5). לדוגמה, בעברית המשפטים מסתיימים בנקודה והסימן לחלוקת המשפט לקטעים הוא הפסיק. בשפות לועזיות כגון אנגלית, צרפתית או ספרדית מתחילים משפט באות גדולה. בדומה לשפת אנוש, גם לשפות תכנות יש תחביר. בשפת ++6 יש שימוש בסימן נקודה-פסיק, בסוגריים מסולסלים ובסימנים אחרים על פי התחביר שלה. בביצוע הידור של תוכנית, המהדר מגלה את שגיאות התחביר שבתוכנית המקור ומציין סוג השגיאה ומספר השורה שבה מופיעה שגיאה. המהדר ייצור תוכנית הרצה, רק אס בתוכנית אין שגיאות תחביר. כדי להמחיש מהן שגיאות תחביר ניצור את התוכנית הבאה: <ת.ת108%2608> 610866ת1+ (16סט) מ1את 1סע | 822 ₪ת8200 000668 086 >> 0006 ו בהשוואה לתוכניות הקודמות, בתוכנית האחרונה הודעת הפלט אינה מופיעה בתוך גרשייס. תחביר בשפת התכנות ++6 דורש כי הודעות פלט יופיעו בין גרשייס ולכן, בביצוע הידור יוצגו על המסך שגיאות תחביר שהתגלו. לדוגמה, הודעות שגיאה לפי מהדר ++6 סחהווסם : <צססתת> ‏ קפק0ס.אתעאצפ5 0:\<500 4 199339 (6) סם16עץ000 4.0 מתסנפעספט ‏ ++0 ם18עסם :סקס.אהס6תץפ 81ת8%10ם667ם1 מסנפסםתט? ם1 'פפטש' 1ססתץפ5 606ם611בםט :5 סקס.א68מםץ5 עסצעם () ם 1 ₪8 ()תנאת תסנססםתט+ ם1 ; שםת1פפ1ת %םת6ת5%8%6 :5 קקס.א%8תץ8 עסלעם *** 116ת60 ם1 672028 2 *** במקרה וה המהדר מציג שתי הודעות על שגיאות תחביר, שתיהן בשורה חמש של קוב המקור. השלב הבא הוא לערוך את הקוב\ ולרשוס גרשייס בתחילה ובסיוס של הודעת הפלט, כפי שמוצג להלן: ; "58665פסת סתגוסע8 000665 056" >> סטסס 6 ++6 בקלות לאחר תיקון השגיאה, ניתן להדר את התוכנית וליצור קוב\ הרצה. בדרך כלל, בתחילת הדרך בתכנות, מתגלות שגיאות תחביר רבות, אך כשצובריס ניסיון, מספר שגיאות התחביר יורד ומהירות הגילוי שלהן עולה. שגיאות תחביר, מהן ? תוכנית בשפת תכנות ++6 חייבת להיכתב לפי חוקי השפה, שנקראיס תחביר השפה. לדוגמה, הודעות פלט צריכות להיכתב בין גרשייס ובסוף כל פקודה חייב להופיע נקודה-פסיק. אס בתוכנית קיימות שגיאות תחביר, יוצגו על מסך בעת ההידור הודעות מתאימות. המהדר איננו מסוגל ליצור קובצ הרצה לתוכנית שיש בה שגיאות תתביר, ולכן יש יילנקות'י את קוב המקור מכל שגיאת תחביר, כדי שנוכל להמשיך ביצירת התוכנית. עבודה בסביבת פוסשוחו//ש כדי לפשט את הדוגמאות שהובאו עד עתה, יצאנו מנקודת הנחה כי סביבת העבודה שלך מבוססת על שורת פקודה, כמקובל במערכות ההפעלה 5-05 או אזא(ו. למרות זאת, רוב מתכנתי ++6 עובדים כיוס בסביבת עבודה המבוססת על פאוספחו/\ עס מהדר כמו ++6 [1508/, או בסביבת הפיתוח המשולבת של 6חהפוזסם. כאשר מתכנתים בסביבת פאוססחו/\\, משפטי התוכנית אינס שוניס מהמשפטים בהם משתמשיס בסביבת עבודה המבוססת על שורות פקודה. השוני בין שתי סביבות העבודה הוא בעיקר בתהליך ההידור וההרצה של התוכנית. בתכנות בסביבת פווססחו//, בה ניתן ליצור קובצ מקור על ידי שימוש בעורך פנימי של המהדר. אחר כך ניתן להדר את התוכנית על ידי בחירה באופציה הרצויה מתוך התפריט, או על ידי לחיצה בעכבר (לחצן שמאלי, כמובן). שגיאות תחביר עשויות להיות מוצגות בחלון נוסף. בסיוס ההידור אפשר להריצ את התוכנית על ידי בחירת אפשרות הרצה מתוך התפריט (או בסמל שעל סרגל הכלים). סביבת העבודה, או סביבת התכנות (חהסההחסזוטח6 פַחוההוחהזטָסזק) נקראת כך, מכיון שהיא מספקת את כל הכלים ליצירה, הידור והרצה של תוכניות. פרק 1: התוכנית הראשונה 37 סיכום בפרק זה למדנו כיצד ליצור ולהדר תוכניות בשפת ++6. בפרק הבא נציג את החלקיסם השונים של תוכניות בשפת ++6. נסביר את השימוש בסוגרייס המסולסלים [) ובמילות מפתח כגון חוסצ. נלמד גס כיצד לכתוב תוכנית המציגה הודעת פלט על המסך. לפני שנעבור לפרק הבא, מומלצ לבחון אם מובניס הנושאיס הבאים: / / > / / תוכנית היא רצף הפקודות שהמחשב מסוגל לבצע. תוכניות כתובות בשפת תכנות ++6 מאוחסנות בקבציסם בעלי סיומת קקס. המהדר ממיר תוכניות כתובות בשפת ++6 לשפת מכונה, שהיא השפה שהמחשב מבין. לשפת ++6 קיים קוב חוקים, הנקרא תחביר בשפה. כאשר בתוכנית מופיעה שגיאת תתביר, המהדר מציג הודעה המתארת את השגיאה. המהדר ייצור קובץ הרצה לתוכניות, רק כשאין בהן שגיאות תחביר. תרגילים 8 כיתבו תוכנית המדפיסה את שמכם על המסך. למשל, עבור השם טוצ8כ, הפלט שיתקבל על המסך יהית: 8 15 סתהם צא בצעו בתוכנית הקודמת את השינוי הבא, כדי שהיא תדפיס את השורת: ++0 0ם1ם1682 ת'1 6ם8 בנ1טהכ 15 סתהּם צא הערה: אל תשכחו להפעיל את המהדר על קובץ הקוד המעודכן! התוכנית הבאה מכילה שגיאות תחביריות. הפעילו את מהדר ++6 ותקנו את התוכנית על פי הודעות השגיאה שהתקבלו. <ת.ת105%268> 61006ת1+ (10סט) מ1את 1סע ְ ; !|!א51 סם גמסץ ע50 5שטס 5ם81פתסס תהעסספק 6ם7 >> סטסס ++6 בקלות נויבט על ענית התכנות ++6 בפרק הקודס כתבנו מספר תוכניות בשפת ++6. מטרתנו בפרק הקודס הייתה להציג את התהליך הכתיבה וההידור של תוכניות ולא עסקנו בהבנת פקודות השפה. כפי שראינו, רוב תוכניות בשפת ++6 שומרות על מבנה דומה. מתחילות במספר משפטי 6 חוצ, בהמשך מופיע משפט קבוע (סוסט)חוהוח חסוסצ וסדרה של משפטי ביצוע בתוך סוגרייס מסולסלים (). בפרק ה נסקור את המשפטים שהוצגו בפרק הקודם, ונבין את משמעותס. בהמשך הפרק נדון בנושאיס הבאיס: > משפט 6₪06חו% מאפשר להשתמש בקבצי כותר המכילים תוכניות, הגדרות והצהרות. *> ביצוע של תוכנית ++6 מתחיל מהמשפט (6וסע)חוזבּוח סוסץ. > תוכניות מורכבות מפונקציות (אחת או יותר), הבנויות מסדרות משפטיס המבצעיס יחד מטלה מסוימת. % הצגת פלט על המסך מתבצעת דרך ערו הפלט זטסס6. תוכנית ++6 מורכבת מסוגים שוניס של משפטים ופקודות. בפרקים הבאים נציג דוגמאות שונות: משפט ההשמה (ח6ו5%3%6₪ 60% ח455107), שבאמצעותו מציביס ערכיס בתוך משתניס, או משפט התנאי , המאפשר לתוכנית לקבל החלטות ביצוע בעת ההרצה על פי תנאיס שקבענו מראש. בשלב זה נציג באופן כללי משפטי השפה, או משפטי התוכנית (פ5זַהס6וח6ז3ז5 וחבּיוףסוט). פרק 2: מבט על שפת התכנות ++6 39 משפטי התוכנית בפרק 1 יצרנו תוכנית ++6 בשס 8פס.דפאזפ, קוב המקור של התוכנית הכיל את המשפטיס שלהלן: <ת.ת108%2608> 61086םת1+ (ס1סט) תנאת ה1סט \ ;"!++0 שס 6טס0פס6ת" >> סגגוסס ] במקרה זה, התוכנית מכילה שלושה משפטים. הסוגרייס המסולסלים תוחמיס משפטים שיש ביניהס קשר, או רצף, בביצוע בתוכנית. לכן מכניס אותס גס בשס סמלי הקבצה (5!|סטוחץ5 פחוקטסזס). <ת.ת108%208> 61086םת1+ משפטי תוכנית > (18סט)םת1א8ת ב1סע | ;"!++0 צס 6ס6טס0פ6ת" >> סגוסס בהמשך נלמד כל אחד מהמשפטים המופיעים בתוכנית. משפט פאטוסחו כל אחת משלוש התוכניות שיצרנו בפרק 1 מתחילה במשפט 66ט|6ח1א הבא : <ת.ת105%20608> 61006ם1 משפט 3161666 הוא הוראה למהדר להכניס בתחילת התוכנית ולפני ביצוע ההידור את תוכן הקובצ, ששמו מופיע בין הסוגרייס. במקרה וה המהדר מתייחס לקובצ\ ח. וחה6טפסו. האות ח היא בדרך כלל הסיומת של שמות הקבציס שמשתלביס בתחילת התוכניות. קבציסם אלה הס קבצי כותר (659| ז16800). ניתן לראותס כי בספריה המכילה את קבצי המהדר מוגדרת תת-ספריה בשם פס 61א1. בתת-ספריה זו נמצאיס מספר קבצי כותר. כל קובצ כותר מכיל הגדרות שונות לביצוע פעולות שונות. לדוגמה, ח.חזוח הינו קובצ כותר המטפל בהגדרות ובפעולות מתמטיות. קבצי כותר הס קבצי מלל במבנה 11ַ56א, ולכן ניתן להציג אותס על גבי המסך ולהדפיסס. בשלב זה לא נעסוק בתוכן של קבציס אלה, ורק נסתפק בהבנת השימוש במשפטי ס6סטוסחוא. בכל תוכנית המוצגת בספר זה מצוין איזה קבצי כותר חייביס להיות מוגדריס בה. 0 ++6 בקלות קבצי כותר בשפת ++6 תוכניות ++6 מתחילות במשפט 6|₪606ח%1 אחד או יותר, המוריס למהדר לכלול בתוכנית את קוב הכותר (8!6 ז346806) המוזכר במשפט. בסיוס ההידור, התוכנית כוללת את המשפטים של קוב הכותר (את התוכן שלו), כאילו נכתבו מראש ישירות בגוף התוכנית. קבצי כותר מסוגיסם שוניס משמשיס את התוכנית בביצוע פעולות שונות. לדוגמה, קבצי כותר מסוג מסוים מגדירים פעולות קלט/פלט, וקבצים מסוג אחר מגדיריס את השירותיס שמספקת מערכת ההפעלה (למשל, הצגת התאריך והשעה ברגע מסויס), וכן הלאה. כל התוכניות אשר מוצגות בספר זה כוללות בתוכן את קוב\ הכותר ח.1050768₪. קבצי כותר, כמו תוכניות ++6 עצמן, הס קבצי 45611, כלומר תווים, אשר ניתן להציג, לקרוא ולהדפיס את תוכנם. כדי להבין טוב יותר את תוכן הקוב\ ח.וח5068סו, כדאי להתבונן בו באמצעות העורך ולהדפיסו. קוב\ וה נמצא בספריה 05/ 61א1 שנמצאת בספריה המכילה את קבצי מהדר ++6. לא מומלץ לשנות את תוכן קבצי הכותר אשר מסופקים ישירות עם מהדר הערה ++6, מכיון ששינוי כזה עלול לגרור שגיאות בתוכניות אחרות אשר כוללת 7 אותו, ואינן "יודעות" על השינוי. זכרו, זהו קובץ סטנדרטי! הערה זו אינה חלה, כמובן, על קבצי כותר שכל מתכנת כותב לעצמו. משפט (6וסצ)חובּוח טוסע התוכניות הכתובות בשפת ++6 מורכבות ממספר רב של משפטים. סדר הופעת המשפטים אינו חייב להיות הסדר שבו יתבצעו הפקודות בשלב הרצת התוכנית, אולס כל תוכנית ++6 מתחילה בפקודה אחת קבועה. המשפט (6וסע)חוהּוח סוסצ מאפשר למתכנת לקבוע את המקוס שבו תתחיל התוכנית לרוצ. כאשר התוכניות מבצעות פעולות רבות, מספר המשפטיס בה גדל, ובהתאס לכך קייס הצורך לפצל את התוכנית לחלקיס קטניסם יותר, שיעניקו למתכנת שליטה טובה בתוכנית. במקרה זה, המשפט (0וסע)חוהוח סוס מציין את סדרת המשפטים העיקריים (חוהּוח), שיתבצעו בתחילת ההרצה של התוכנית. מהי תוכנית ראשית ? קבצי מקור של תוכניות ‏ ++6 מכילים מספר רב של משפטים. המשפט (0וסע)חו8ח וסט הוא הזיהוי של התוכנית הראשלית (ו8זפסזס חו8א), אשר מכילה את הפקודות הראשונות לביצוע. בכל תוכנית ++6 חייב להיות משפט אחד בלבד המכיל את השס חו8ח. כאשר בוחניס תוכניות ++6 גדולות, כדאי לחפש את המשפט המכיל את השס חופוח. משפט וה הוא למעשה הצהרת הפונקציה ()חופּח, הכוללת את הפקודה הראשונה לביצוע בתוכנית. פרק 2: מבט על שפת התכנות 6++‏ 41 הבנת השימוש ב-שוסע ככל שהתוכניות שנכתבות הולכות ונעשות מורכבות יותר, צריך לחלק אותן לקטעים אשר ניתניס ליישליטה'י, אלו הן פונקציות (חסטסחטת). פונקציה היא קבוצת משפטי תוכנית בתוך התוכנית שמבצעיס משימה אחת מוגדרת. לדוגמה, בתוכנית משכורת למשל, הפונקציה עְז58|3 תחשב את השכר של העובד, והפונקציה |8פוחוזק תדפיס את תלוש השכר. וכך למשל, הפונקציה 00% זּטף5 תחשב שורש ריבועי בתוכנית העוסקת בחישוביס מתמטיים. כאשר התוכנית מפעילה פונקציה, הפונקציה מבצעת את המטלה ויימחזירהיי ערך תוצאה אל התוכנית שהפעילה אותה (או ייקראה לה" - ו|68 חסחס6חטת). בכל תוכנית קיימת פונקציה אחת לפחות, ולכל פונקציה יש שם ייחודי לה. התוכניות שכתבנו בשיעור הראשון כללו אך ורק פונקציה אחת, הפונקציה חוףחח. בפרק 9 נחקור לעומק את השימוש בפונקציות. לעת עתה נבהיר, כי פונקציה מורכבת מאוסף משפטים המכוונים לביצוע מטלה מסוימת. בתוכניות ++6 שכיח השימוש במילה שוסע. ניתן להשתמש במילה סוס כדי לציין כי פונקציה מסוימת אינה מחזירה ערך כלשהו, או כדי לציין כי לא מועבריס לפונקציה ארגומנטיס בזמן הפעלתה. לדוגמה, תוכניות הפועלות בסביבת 5-05 או אזאש מסוגלות לסייס את פעולתן בהעברת ערך סטטוס יציאה (סט1ה8/ 508005 +אם) אל מערכת ההפעלה. את סטטוס היציאה אפשר לבחון למשל, בעזרת קבצי אצווה (65|ו1 ח88%0). בסביבת 05, קבצי אצווה בוחניס את סטטוס היציאה של תוכנית על ידי תנאי ₪/ם 5081 =1. בדוגמה הבאה נבחן את סטטוס היציאה של התוכנית 5אם. | |סאץצם המסיימת, ומעבירה אחד מהערכיס הבאים למערכת ההפעלה: ערך יציאה | משמעות הצלחה קוב איננו קייס אין נייר במדפסת להלן דוגמה לתוכנית אצווה ב- ₪005 המתייחסת לתוכנית ולטבלה לעיל: תצק 2 6070 1 תמטתתתסתתם לטסא שד 0 ממטמתתסתתת תך שתזע סא 0 2 תמעמתתסתתת צסא 18 1 ממטאתתסתתם תפך אמפתתס סא 0 3 מתמעמתתסתתת צסא 18 2 ממטאתתסתתם תך 8 פתאתתסס 5116 מ0860 ע6ת06 אתת 2 ++6 בקלות בתוכניות הפשוטות שנציג בספר איננו וקוקיס להתחזרת קודים למערכת ההפעלה, ולכן נציב את המילה שוסט, לפני שס התוכנית הראשית חווח כדלקמן: (ה1סט)מנ1נהת ב1סט ס6ט1הט 8 תעטס6שם שסםת 40658 תהעךשסמק | בפרקיס הבאים נציג כיצד ניתן להעביר לתוכנית פרמטריס (שס קובצ קלט, לדוגמה), מתוך פקודת ההרצה של התוכנית. כאשר מריציס תוכנית ללא פרמטרים, קובעיס את המילה סוס בתוך הסוגרייס שבהמשך לשס התוכנית הראשית חואוח, כדלקמן: (ה1נסט)םנ1הת 16סט ספ ססם 6068 תהפ4שסעק 65מפתטשתה3 6ת11 בתהתתסס כאשר תוכניות נעשות מורכבות יותר, הן עשויות להחזיר ערכים למערכת ההפעלה או לתמוך בפרמטריס של שורת פקודה. בשלביס אלה נסתפק בהצהרה שוסט עם חופוח, כפי שמופיע בתוכנית. הסוגריים המסולסלים [ | תוכניות גדולות ניתן לחלק לפי קבוצות של משפטים. בדרך כלל יש גס קבוצה של משפטיס שתתבצע מספר רב של פעמים. לדוגמה: פעולת חישוב הציונים של 100 תלמידים. פעולות אחרות שמתקיימות תחת תנאי מסוים, ניתן לרכז בתוך קבוצה של פקודות. לדוגמה, הצגת המילה ייעובריי על המסך לתלמיד שקיבל מעל 50 בבחינה. הסוגרייס המסולסלים [ ) מקבציס בתוכס סדרה של משפטים וכך הס מחלקים את התוכנית לקבוצות של משפטים. עד כאן הצגנו את הסוגרייס המסולסליס המקבציס את משפטי התוכנית הראשית חופוח. משפט זטסס6 להצגת הודעות פלט על המסך בתוכניות הקודמות השתמשנו לצורך הצגת הודעות על המסך, השתמשנו במילה 600% ובסימן קטן מ- כפול (>>), כך: ;"!++0 ,6110" >> סגסס המילה +טסס מסמנת את ערוץ הפלט (ו68ז5% +טק+ש0) ששפת ++6 משייכת להתקן הפלט הסטנדרטי המוגדר במערכת ההפעלה. בדרך כלל (אס לא אומריס למערכת משהו אחר), מערכת ההפעלה מנתבת הודעות פלט למסך, מכיון שהוא מוגדר כהתקן הפלט הסטנדרטי. פרק 2: מבט על שפת התכנות 6++‏ 43 יחד עם זאת, ניתן לנתב את הפלט ליעדים אחרים כגון קובץ, או התקניס אחרים, כגון מדפסת. בדוגמה הבאה - פלט התוכנית %6א5%.6ז1 מנותב למדפסת במקוס למסך, על ידי שימוש בפקודה ישירה של מערכת ההפעלה. <צספתת> ‏ אתע < 1857ת<\:0 שיק 6 ! קובץ 5א5% הנוצר תחת וד לא יכול לרוץ תחת 05כ. הכל מתנהל תחת התוכנית ולא בחלון 05פ. ערוץ הפלט 60% כפי שלמדנו, תוכניות ++6 משתמשות בערוצ הפלט 60% כדי להציג הודעות על המסך. הסדר בו שולחת התוכנית תוויס אל ערו +שסס הוא הסדר בו הס יופיעו על המסך. למשל, נכתוב את המשפטיס הבאים: ;" ,128% 6829סק8 58066פ65ת 15םך7" >> סגוסס ;".66הפפסת 15ם6 צ5 10110866" >> סטסס בתגובה, מערכת ההפעלה תציג את רצף התוויס הוה: . 8066פפסת 18ם5 עס 66₪ח10110 ,128% פע68סקה8 58066פ65ת 5נמך אופרטור ההכנסה (>>) נקרא כך, מפני שהוא מאפשר לתוכנית להכניס (להזריס) תוויס אל ערוצ הפלט. בפרק 3 נעסוק בשימוש של זטסס ונציג כיצד ניתן להרכיב משפט פלט הכולל טקסט, מספריס שלמיס ומספרים ממשיים, כל אחד לחוד וכולס יחד. בפרק 8, נראה את המילה חו6 המסמנת את ערוצ הקלט ומאפשרת קליטת נתוניסם מהמקלדת של המחשב. סיכום בפרק זה הצגנו מספר רכיביס המופיעים ברוב התוכניות בשפת ++6. לפני שנעבור לפרק הבא, מומלצ לבחון אס מובניס הנושאיס הבאים: * כמעט כל התוכניות בשפת ++6 מתחילות במשפט 6!006ח%1. משפט וה מורה למהדר להכניס במקומו את תוכן קובץ הכותר הרשוס במשפט. * קבצי כותר מכילים הגדרות שונות ושילובס בתוכניות מאפשר למתכנת לנצל אותן במהלך התוכנית. * בקבצי מקור מספר רב של משפטים. המשפט (6וסע)ח81ח 6וסש מציין את תחילת התוכנית הראשית, ולכן הפקודות שבתוכנית זו יתבצעו ראשונות בעת הרצת התוכנית. 4 ++6 בקלות / כאשר התוכנית נעשית ארוכה ומסובכת, ניתן לפשט ולשפר אותה על ידי חלוקתה לקטעי קוד קטניס, שכל אחד מהס בעל תפקיד מצומצם וברור. ווהי הגישה של עבודה בפונקציות. את משפטי הפונקציה כותבים בין סוגריים מסולסלים שמאליים וימניים: 5%90600606...<7 הסס6חט4>1. ברוב התוכניות בשפת ++6 נעזריס בערו הפלט זטס6 להצגת הודעות ונתוניס על המסך. על ידי שימוש בפקודות קלט/פלט של מערכת הפעלה ניתן לשנות את יעד הפלט של %טסס למקומות אחריס כגון קובצ, להתקנים אחרים כגון מדפסת, ואפילו לגרוס לכך שנתוני פלט אלה ישמשו קלט לתוכנית אחרת. כפי שלמדנו בפרק זה, ערוצ הפלט זטסס משמש את התוכנית להצגת הודעות ונתוניס על המסך. בפרק 3 נראה כיצד ניתן בעזרתו להרכיב משפט פלט הכולל טקסט, מספרים שלמיסם ומספרים ממשיים. כמו כן, נראה את אופן העיצוב של פלטיס אלה. תרגילים כיתבו תוכנית המנקה את המסך ומדפיסה בו את ההודעה הבאה: 18%םם פס6םת1עק 6ם8 ם50266 6ם6 016828 תהעפסלסק פנמך כדי לנקות את המסך עליכם להורות למהדר לכלול בתוכנית את הספריה ח.סוחס6. עשו זאת באמצעות הפקודה 610606ח%1. את המסך מנקיס על ידי קריאה לפונקציית הספריה ;()ז50ז|6, לפני הדפסת ההודעה. נתבו למדפסת (במקוס למסך) את פלט התוכנית שכתבתם עבור תרגיל 1 בפרק 1 (התוכנית המדפיסה את שמכם). פרק 2: מבט על שפת התכנות ++6 45 כתיבת הודעות על המסר בפרקיס הקודמיס הראינו תוכניות המשתמשות בערו הפלט +וסס כדי להציג הודעות על המסך. בפרק זה נראה כיצד ניתן בעזרתו להרכיב משפט פלט הכולל מלל, מספריס שלמים (כגון 1010) ומספריס ממשיים (כגון 0.12345). בהמשך הפרק נדון בנושאיס הבאים: + ערוצ הפלט 600% משמש להצגת מספרים ותוויס על המסך. %> ניתן להשתמש בתוויס מיוחדים עס 60% כדי לעבור לשורה חדשה, להשתמש בטבולטור אופקי, להפעיל את הרמקול הפנימי של המחשב ועוד. + ++6 מאפשרת להציג בקלות מספרים עשרוניים ((3חו66כ), אוקטליים (בסיס 8 - ו06₪), או הקסדצימליים (בסיס 16 - |₪8ו8060א16). > על ידי שימוש באופרטורי הניתוב (5זס)9ז6קס ח6000ז₪601) של מערכת ההפעלה ניתן לנתב את הודעות הפלט של תוכנית הנשלחות דרך %ש60, אל קובץ או אל מדפסת. *> ערו הפלט 667 מאפשר לתוכניות לשלוח הודעות לפלט הסטנדרטי, לדווח על תקלות, וכך למנוע מהמשתמשיס לנתב מחדש את ההודעה. > ניתן לעצב את פלט התוכנית על ידי שימוש בפונקציית העיצוב א560. 6 ++6 בקלות הצגת מספרים על ידי השימוש ב- זטסס בתוכניות המוצגות בפרקיס הקודמיס השתמשנו ב-+ט0ס כדי להציג על המסך מחרוזות תווים (05ח50/1 זס6סבּז674), שהן קבוצות של אותיות ומספרים הנמצאות בין גרשיים. בהמשך נראה שניתן להיעזר ב-60₪% להצגת מספרים. התוכנית הבאה, 1.07, מציגה את המספר 1001 על המסך. <ת.ת108%2608> 610866ת1+ (16סט) מ1את ב1סע ן 7 >> 00060 לאחר הידור והרצת התוכנית, יהיה הפלט המוצג על המסך 1001, כפי שנראה להלן: <56%ם₪> 0:\<1001 11 כעת עליכם לערוך את התוכנית, ולשנות את משפט זטסס, כדי שעל המסך יופיע המספר 2: 7 %6>> 00060 בנוסף להצגת מספרים שלמיס (ללא ספרות עשרוניות), ניתן להיעזר ב- +60 להצגת מספריס ממשיים כדוגמת 1.2345. מספריס אלה נקראיס מספרים בייצוג נקודת צפה (0615והטח +הוסק-שַחושְבּס!ת). התוכנית הבאה, 6.695אזדסום=, מציגה על המסך את המספר 0.12345: <ת.ת108%268> 610866םת1+ (16סט) מ1את 1סע ן 72 >> 0000 לאחר ההידור נריץ את התוכנית ונקבל על המסך את השורות הבאות : <עססתא> 6א711ת20ע<\:0 5. 0 פרק 3: כתיבת הודעות על המסך ‏ 47 הצגת מספר ערכים בפקודה אחת הסימן קטן-מ הכפול (>>) שמשתמשים בו בצירוף עס 600% נקרא אופרטור הקלט או אופרטור ההכנסה (02679%01 1856+10₪), מכיון שהוא מכניס את התוויס והסימניס בתוך ערוץ הפלט. תחביר השפה מאפשרת שימוש במספר אופרטורים אלה בצירוף פקודת 600% אחד. לדוגמה, התוכנית הבאה, 00.692ד1001, נעזרת באופרטור הפלט ארבע פעמים כדי להציג את המספר 1001 על המסך. <ת.ת108%2608> 86ט610ת1+ (16סט) מ1את ב1סע | 2 >> 0 >> 0 >> 1 >> 6ג0ס0ס לאחר הידור והרצת התוכנית, יוצגו על המסך השורות הבאות: <%6%ם₪> | 6:\<1001100 11 בכל פעס ששפת ++6 פוגשת באופרטור הקלט, מתבצע צירוף של המספרים או התוויס הסמוכים לאופרטור בתוך ערוצץ הפלט. התוכנית 5₪80/1001.6?2, מציגה מחרוזת ומספר על המסך, תוך שימוש ב- +600. <ת.ת108%2608> 610866ת1+ (ס1סט) תנאת ה1סט \ 2 >> " 18 עססתטם 166ע0סט8+ שא" >> סגוסס ] יש לשיס לב, כי לאחר המילה 15 הקפדנו לשיס תו-רווח, כדי לגרוס לכך שבהצגת הפלט, המחרוזת לא תהיה דבוקה למספר (51001!). בצורה דומה, התוכנית 6 5זוז1001, מציגה את המספר 1001 במרכז המחרוזת. <ת.ת108%2608> 610866םת1+ (ס1נסט)םנ1הת ב1סט ו ;"58000160 שת 18 " >> 1001 >> " עשסתטם 6ם7" >> 6טסס שימו לב לרווח שלפני ואחרי המספר 1001. כך נהגנו גס קודס. 8 ++6 בקלות לסיוס, התוכנית הבאה, 655.א64דגואאנוא, משלבת מחרוזות, תווים, מספריס שלמים ומספרי נקודה צפה בתוך אותו ערו הפלט: <ת.ת108%268> 610866ת1+ (ס1סט) מ1את 1סע ן 4 >> " פהשח 8581827 צת " >> 20 >> " 866 סשת" >> 6ט0ס0 ;601 >> לאחר הידור והרצת תוכנית זו יופיע על המסך הפלט הבא : <עססתא> 7608תאא1א<\:0 4 88 58182 צת 20 866 ספת השימוש בתווים מיוחדים בכל התוכניות שכתבנו עד עתה רוכז הפלט בשורה אחת. אולס לפעמים, יש להציג הודעות פלט הפרוסות על פני מספר שורות. לדוגמה, היה רצוי כי תוכנית המציגה כתובת של אדס כלשהו, תתפרס על יותר משורה אחת. כעת נלמד כיצד ניתן להציג פלט המתפרס על מספר שורות. נוכל ליצור שורה חדשה בשתי דרכים. בדרך אחת, מחדיריס תו שורה חדשה 68786060 6חו|ו6א) - ח\ במקוס הרצוי במחרוזת (שיס לב, התו \ מסמל שאחריו נמצא תו קוד, ובמקרה זה - ח. התוכנית הבאה, 5.6099פאזוסשוד, מדגימה הצגת פלט בשתי שורות, ושימוש בתו שורה חדשה: <ת.ת108%2608> 610866םת1+ (16סט) מ1את ב1ס7 ָ ;"סטף 116 18 18ם7ם\6תס 6ת11 18 18םמ7" >> סטסס לאחר הידור והרצת התוכנית יוצג הפלט על המסך בשתי שורות: <עססת₪> 5 <\ :0 ס6תס 6ם11 18 15םמך סט" 6ם11 18 15םך במקרה שפקודת הפלט אינה כוללת מחרוזת, ניתן לצרף את התו המיוחד שורה חדשה ביו אופרטורים הפלט, כאשר התו הוא בין גרשיס בודדים ('ח\'). לדוגמה, התוכנית קק5.6פאז ושפא, מציגה את הספרות 1, 0, 0 ו- 1, כל אחת בשורה נפרדת. פרק 3: כתיבת הודעות על המסך ‏ 49 <ת.ת108%2608> 610866ת1+ (16סט) מ1את ב1סע ן י'ע )0 > זמ 066 > יזמ 1 56 סטסס ו ניתן להשתמש באופרטור !606 (כמו גס בתו מיוחד שורה-חדשה) לקידוס הסמן לשורה חדשה. אופרטור |600 מסמל סוף שורה (6חז] 06ח6) ותחביר השימוש והה לשורה-חדשה. התוכנית 69.ופאפ, מתארת את השימוש באופרטור !600 כדי לקדם את הסמן לתחילת שורה חדשה. <ת.ת108%2608> 866ט610םת1+ (ס1סט)ת1נאת ה1סט \ ;"++0 צץס 2680060" >> 01ם6 >> "...ת66ס סשט'1" >> סגגוסס כמו קודס, לאחר הידור והרצת התוכנית יופיע הפלט על המסך בשתי שורות: <עסמתם> מפאם<\:0 .. . םת066 שט'ך ++0 צס 2650066 לסיוםס, התוכנית הבאה, 55.095פמפפא, מציגה במספר שורות את הכתובת של חברת 5 2358 : <ת.ת108%2608> 61086םת1+ (ס1סט) מ1את 1סטע ן ;ק01ת6 >> "655תק 08058" >> סטסס 2 >> "1 50106 ,חססתגאת ת6ט50 2975" >> 0006 2 >> "89102 טא ,76085 188" >> סגוסס 0 ++6 בקלות רשימת תווים מיוחדים בנוסף לתו המיוחד לשורה-חדשה, בשפת ++6 ניתן להשתמש בתווים מיוחדים אחרים המאפשרים ביצוע של מיגוון פעילויות. להלן טבלה 3.1 ובה רשימת התווים המיוחדים בשפה. טבלה 3.1: תווים מיוחדים לשימוש בצירוף עם %טסס. תו מיוחד | מטרה 8\ | אזהרה או צפצוף (ו|06) 0\ | 086650866 +%\ | מעבר לדף חדש ח\ | מעבר לשורה חדשה ז\ | מעבר לתחילת השורה (ללא מעבר לשורה חדשה) ז\ | טבולטור אופקי צ\ | טבולטור אנכי \\ | הצגת הסימן \ ?\ | הצגת הסימן ז '\ | הצגת הסימן ' "\ | הצגת הסימן יי 0\ | אפס - וו₪ 0\ | הצגת מספר בבסיס האוקטלי, לדוגמה: 007\ ההחחא\ | הצגת מספר בבסיס ההקסדצימלי, לדוגמה : "==תא\ כאשר משתמשים בתוך מחרוזת בתווים המיוחדים המופיעים בטבלה 3.1, הערה יש לכתוב אותם במרכאות כפולות. כך לדוגמה: "!6!זס/\ ח\סוו6רו". כאשר 7 כותבים את התווים המיוחדים לחוד (לא בתוך מחרוזת), יש לכתוב אותם בתוך מרכאות בודדות, כמו בדוגמה זו: 'ח\' . התוכנית 99ס5950141.6 משתמשת בתוויס מיוחדיס א\ ו- )\ כדי להשמיע צפצופים ברמקול הפנימי של המחשב. בנוסף, היא מציגה את המחרוזת: ||86 ||86 ||88 - על המסך, תוך שימוש בטבולטור אופקי. פרק 3: כתיבת הודעות על המסך ‏ 51 <ת.ת108%2608> 61086ת1+ (16סט) מ1את ב1סע ן ;"ה\2611\8\62811\8\%2611" >> 0006 הצגת מספרים בבסיס אוקטלי ובבסיס הקסדצימלי בתוכניות שהראינו עד כה, הצגנו את המספרים בבסיס דצימלי. בעולס התכנות לפעמיס יש צורך בהצגת המספריס בבסיסיס שוניס. הבסיסיס הנפוצים הס בסיס אוקטלי (בסיס 8) ובסיס הקסדצימלי (בסיס 16). בתוכנית ++6 ניתן להמיר מספריס ולהציגם על המסך בבסיסים שוניס על ידי השימוש בפונקציות המרת הפלט: 666, % ו-א6ח. לדוגמה בתוכנית הבאה, 5קס.אפוודסס, מוצג השימוש בפונקציות המרת הפלט להצגת מספרים בבסיסים דצימלי, אוקטלי והקסדצימלי. <ת.ת108%2608> 61086ת1+ (16סט) מ1את ה1ס7 ָ >05/ >> 9-7 6 20 > ₪ 0 >> 05 ו ;[0תמ20>>9>> ' ' >> 10 >> אפת >> " :601081סהא6ת">> 6טסס 6017 >> 20 >> ' ' >> 10 >> 060 >> " :ַַַַַת1ססכ">> 6טסס ו לאחר ההידור והרצת התוכנית יוצגו על המסך השורות הבאות: <6062ת₪> | אם8?ץ0:\<00 4 12 :00681 4 8 :81ת80601א6ת 0 10 :601081 הערה כאשר מנצלים את אחד ממעצבי הפלט להצגת פלט אוקטלי, הקסדצימלי או דצימלי, השימוש בו יהיה תקף עד סוף התוכנית, או עד השימוש 7 במעצב אחר. 2 ++6 בקלות הפלט הסטנדרטי לדיווח תקלות זיוסס כפי שציינו קודם, על ידי מתן פקודות מתאימות, מערכת ההפעלה מסוגלת לנתב את הפלט מהתקן הפלט הסטנדרטי אל התקניס אחרים. הדבר נכון כאשר מציביס בתוכניות בשפת ++6 את הפקודה 600%. ברס, כאשר מתרחשת תקלה בביצוע התוכנית, נרצה שדיווח התקלה יוצג על המסך ולא על התקן אחר, כדי להעיר את תשומת ליבו של המשתמש באותו רגע. לכן, במקרה של דיווח תקלות יש להציב בתוכנית את הפקודה זז66 במקומה של 600%, וכך להבטיח את השימוש בערוצ דיוות התקלות, שהוא ערוצ פלט המשויך תמיד למסך. לדוגמה, התוכנית 6588.699 מציגה על המסך את ההודעה: 8 פ875ח1ת 6558066 158מך <ת.ת108%268> 610846ת1+ (ס1סט) מ1את 1סע ז ; "פ5עהסססת 78ץ8ח1ת2 8655806 18ם7" >> עע06 לאחר הידור, ניתן לנסות ולהריץ את התוכנית תוך שינוי התקן הפלט, כדלקמן: <עס6סםתם> לאם.טאתאאת1ץ ‏ < אתעס<\:0 במקרה זה, הודעת הפלט תופיע על המסך, על אף שינוי התקן הפלט. למעשה, הודעת הפלט מנווטת לערוצ הפלט הסטנדרטי לדיווח תקלות, שהוא המסך. שיפ ש ! ב-6:ו611ד תוכנית זו לא תרוץ משורת הפקודה ב- 05פ. קביעת אורך הפלט בתוכניות הקודמות הצגנו מספריס על המסך והקפדנו לשים תווי רווח לפני ואחרי המספרים, כדי להבטיח הצגה נכונה וברורה של אותס המספרים. בשפת ++6 קיימת פונקציית עיצוב בשס ש56% המאפשרת לקבוע את האורך המינימלי הדרוש להצגת פלט מסוים. משתמשיסם בפונקציה זו בצירוף פקודת +60, כאשר אורך הפלט נמדד ונקבע בתווים. לדוגמה, בתוכנית הבאה, פפס.שד55, מוצג השימוש בפונקציית 560% להצגת המספר 1 על המסך. כל פעם בה משתמשת התוכנית הבאה בפונקציה 560% היא מוגדרת באורך אחר (3,4,5,6). כדי להשתמש בפונקציית 560% יש להגדיר את קובצ הכותר ח.קוחהוחסו בתחילת התוכנית. פרק 3: כתיבת הודעות על המסך 53 <ת.ת108%208> 010₪6ם1 <ם. ק1ת8תס1> 01006ם1 (16סט) מ1את 1סע ָ ;1 >>3(>>1001)ח56%>> "18 עססתגות 166ע02ט1+8 צא" >> סטסס 12 >>4(>>1001)א56%>> "18 עססתגת 166ע02ט18 צא" >> סטסס ;5(>>1001>>1)א56%>> "18 עססתגםת 166ע02ט8+ צא" >> סטסס ;6(>>1001>>1)ח56%>> "18 עססתגות 166ע02ט8+ צא" >> סטסס ו לאחר הידור והרצת התוכנית יוצגו על המסך השורות הבאות: <%ס6ת₪> | א0:\<5878 1 מססתטת 166ע0ט8+ ץשא 1 מססתטת 166ע0סט8+ ץשא 1 185 מססתטת 166עסט18 ץא 1 185 מססתטת 166עסט1+8 ץא האורך שנקבע על ידי 56% הוא המספר המינימלי של התוויס הדרוש להצגת הפלט. בתוכנית הקודמת, המשפט (3) 560% קובע אורך מינימלי של שלושה תווים להצגת המספר 1001, אולס אורך המספר הוא ארבעה תווים. במצביס אלה הפקודה 600% תציב לפלט את האורך הדרוש (במקרה וה ארבעה תוויס). יש לציין כי כאשר משתמשיס בפונקציה /560%, פעולתה תהיה תקפה לערך או למספר הסמוך לה. במקרה של משפט פלט בעל מספר רב של מופעים, יש להציב את הפונקציה לפני כל מופע ומופע במשפט. הערה התוכנית הקודמת השתמשה בקובץ הכותר ח.קוחוחסו, מומלץ להדפיס 2 ' | את תוכן הקובץ ולקרוא אותו. גם קובץ כותר זה, כמו ח.ח68ז050ו, נמצא 7 בספריה =סש \6א1. סיכום בפרק זה הצגנו כיצד פועלת הפקודה 600% והראינו דרכיס שונות לטיפול בפלט על המסך. בכל התוכניות המוצגות בספר זה השתמשנו בפקודה 600% לטיפול בפלטים. לפני שנעבור לפרק הבא, מומלצ לבחון אם מובניס הנושאיס הבאים: * ערו הפלט +60 מאפשר הצגה של מספרים, אותיות וסימנים. / ניתן להשתמש בתו המיוחד ח\, או במעצב הפלט |0ח6 כדי לקדס את הסמן לתחילת השורה הבאה. * ניתן לשלוט על עיצוב ההדפסה (שורה חדשה, טבולטור אופקי וכוי) על ידי הונת תוויס מיוחדים לערוץ הפלט. 4 ++6 בקלות פונקציות המרה 066, 06 ו- 6% מאפשרות הצגת המספרים בבסיס דצימלי, אוקטלי והקסדצימלי בהתאמה. פונקציית העיצוב 56% מאפשרת לקבוע את האורך המינימלי הרצוי להצגת ערכי הפלט. על ידי שימוש בערוץ הפלט זז66 אפשר לדווח תקלות, ניתן להציג הודעות תקלה בהתקן המוגדר לכך (ברוב המקרים, המסך). ניתן לקבוע את מספר התווים המינימלי הדרוש להצגת ערך מסוים, על ידי שימוש במעצב הפלט 560. תרגילים כיתבו תוכנית אשר הפלט שלה הוא: 12 ו 9- כיתבו תוכנית אשר תדפיס את שורות הפלט הבאות: 7 0 ץ08 צץע6%ט6 0200018608 4 686 סם 11%6 ך התוכנית צריכה להשמיע שני צפצופים (ק066) בסיוס ההדפסה. כיתבו תוכנית המדפיסה את ערך המספר 19 בבסיס הקסדצימלי ובבסיס אוקטלי. התוכנית צריכה להדפיס שורה מהצורה: 1 0233 0ם8 80601081א6ם 013 18 19 יש להשתמש באופרטור המרת פלט להדפסת המספרים. כיתבו תוכנית המדפיסה לערוצ דיווח התקלות את הודעת השגיאה הזו: !| |866פפסת עסעעם ם8 18 158מך כיתבו תוכנית המדפיסה (דרך ז600) את הפלט הבא, ברווחים 3,5,7,9, בעזרת הפונקציה 560%: 13 13 13 13 פרק 3: כתיבת הודעות על המסך 55 נישתנים לאחסון העידע עד כאן הצגנו תוכניות פשוטות מאוד. כאשר כותביס תוכנית המבצעת משימות בעלות משמעות, מתעורר הצורך בשמירת מידע במהלך הרצת התוכנית. למשל, תוכנית המדפיסה תוכנו של קובצ מסוים, ודאי צריכה לדעת את שמו של הקוב ובמקריס מסוימים את מספר העותקים הרצוי להדפסה. במהלך הרצת התוכנית, המידע הדרוש מאוחסן בזיכרון הפנימי, או ויכרון העבודה, של המחשב. התוכניות משתמשות במשתנים (פ6!טהּו1זּ/) כדי לגשת ולהתייחס לנתוניס מסוימים המאוחסנים בציכרון. במילים פשוטות ניתן להגדיר, כי משתנה הוא שם של מקוס בזיכרון בו ניתן לאחסן ערכים מסוימים. בהמשך הפרק נדון בנושאים הבאים : + צריך לציין למהדר מהס המשתניס בהם ייעשה שימוש במהלך התוכנית על ידי הצהרה על השם והטיפוס (סוג, 6). % טיפוס של משתנה קובע את אוסף הערכים שהמשתנה יכול להכיל (למשל ערכיס שלמים,או ערכים מטיפוס נקודה צפה), וגס את הפעולות שניתן לבצע עליו. % אופרטור ההשמה של ++6 משמש להקצאת ערכים למשתנים. % יש להשתמש בערו הפלט 606 כדי להציג על המסך את ערך המשתנה. > קביעת שמות בעלי משמעות למשתנים, תקל עליך ועל מתכנתיס אחריס לקרוא ולהבין את התוכנית. > תיעוד התוכנית לכל אורכה בעזרת הערות ברורות המתארות פעולות שונות, תקל עליך ועל מתכנתים אחרים, כאשר צריך לעדכן אותה בעתיד. באופן ציורי ניתן לדמות משתנה לתיבה, שבה ניתן לשים ערכיס. כאשר התוכנית זקוקה לערך המשתנה, היא פשוט ניגשת לתיבה ומתבוננת בערך שבתוכה. 6 ++6 בקלות הצהרה על משתנים בתוכנית לא כל משתנה מסוגל לאחסן בתוכו כל ערך. התוכניות מסוגלות לטפל בסוגיס שוניס של ערכים: מספרים שלמים, אותיות האלף-בית, מספרים ממשיים. בתוכניות ++6 מאחסניס את ערכים במשתניס המתאימים לסוגם, לכן ניתן לחלק את המשתנים לפי טיפוסים שוניס. להלן טבלה 4.1 המציגה את טיפוסי המשתנים הנפוציס בשפת ++6. טבלה 4.1: רשימת טיפוסי משתנים נפוצים בשפת ++6 טיפוסי ערך לאחסון זה | ערכיס בתחום: 128- עד 127. בדרך כלל משמש לאחסון אותיות. +חו | ערכיס בתחום: 32,768- עד 32,767. 60טט | ערכיס בתחום: 0 עד 65,535. הַחס! | ערכיס בתחוס: 2,147,483,648- עד 2,147,483,647 + | ערכים בתחום: *10 * 3.4- עד *10 * 3.4 6טטס | ערכים בתחום: **10 * 1.7- עד 10% * 1.7 כדי להשתמש במשתנה, מחייב תחביר השפה להצהיר עליו (066136), או במיליס אחרות - להגדיר אותו בתוכנית. הצהרת המשתנה כוללת טיפוס המשתנה והשס שבו הוא יופיע בתוכנית. בדרך כלל, הצהרת המשתנים נרשמת בתחילת התוכנית אחרי הסוגרייס המסולסלים. להלן תבנית התחביר להצהרת משתנה: ;סתהת 18016עהט 6סץ6 218016אט רוב המשתניס הס מהטיפוסים הרשומים בטבלה 4.1. מכיוו שהמתכנת קובע את שס המשתנה, מומלצ ורצוי שיהיה ה שס בעל משמעות אשר יתאר את תפקיד המשתנה, כמו למשל, 6וחאח 66ץ7!0קח6 (שס-עובד) או 806 66ץס!קח6. (גיל-עובד). ++6 מתייחסת אל הצהרות משתנים כאל משפטים, ולכן צריך לכתוב נקודה-פסיק (;) בסוף ההצהרה. להלן דוגמה להגדרת מספר משתנים. נשיס לב שמשתמשיס בנקודה-פסיק להפרדה של הצהרת משתנים מטיפוסים שונים. <ם.ת1085%268> 06ט610ת1+ (סנסט)ם1הת 16סט ו 2 מ0ְ₪68₪ סת1 ;ץ818%פם 11086 2 0 06מם618568 סם0ס1 ו התוכנית שבדוגמה אינה מבצעת כל פעולה, וולת הצהרת המשתנים. ניתן להבחין במיקום סימני נקודת-פסיק, המפרידיס בין הצהרות טיפוסים שוניס של משתנים. פרק 4: משתנים לאחסון המידע 57 להצהרת מספר משתנים בעלי אותו טיפוס יש לרשום פסיק בין שמות המשתנים הרצוייס. להלן דוגמה להצהרת שלושה משתנים מטיפוס ממשי. ;סטת 6ם000ע6012ע2 ,688 6תססם1 ,7ץ588182 11086 מה זה משתנה? משתנה הוא שס של מקוס בויכרון העבודה של המחשב בו מאוחסניס נתוניסם. התוכנית במהלך הביצוע מאחסנת במשתניס את המידע הדרוש. בשפת ++6 חייבים להצהיר על משתניס שבשימוש התוכנית. ההצהרה מתבצעת על ידי ציון טיפוס המשתנה ושמו. להלן דוגמה להצהרת משתנה 886 מטיפוס שלם טחו): 7 סתב קביעת שמות בעלי משמעות למשתנים המשתניס המוגדריס בתוכנית חייביס להיות בעלי שמות ייחודיים. כדי שהתוכנית תהיה יעילה וברורה, מומלצ לתת למשתניס שמות בעלי משמעות המתארים את התפקיד שלהם. למשל, בתוכנית מסוימת מוגדריס המשתניס הבאיס: 7 ,ץץ ,א 6ם1 בהנחה שהמשתניס לעיל מתייחסים לגיל התלמיד, ציון ממוצע וציון בבחינה, עדיף יהיה להצהיר עליהם כך: 2 ,80020 ₪686 ,806 %ת86000 6ת1 שמות המשתנים יכוליס להכיל צירופי אותיות, מספריסם וסימן קו-תחתון ( = ). הסימן הראשון בשס המשתנה חייב להיות אות או קו-תחתון, ובכל מקרה אסור ששם משתנה יתחיל במספר. שפת ++6 מבדילה בין אותיות גדולות ובין אותיות קטנות. לכן, בשלביס הראשוניס של לימוד השפה, מומלצ להגדיר את שמות המשתנים תמיד באותיות קטנות. בהמשך ניתן להשתמש באותיות גדולות לשיפור הבהירות של התוכניות. לדוגמה: ;188%סתססת1 ,7ץ58182ץ1םתס6תסא 11086 88 ++6 בקלות מילים שמורות בנוסף לכללי מתן השמות שהוצגו בפיסקה הקודמת, קיימות בשפת ++6 מספר מיליס שאסור להשתמש בהסם כשמות משתנים. מילים אלו הן מיליס שמורות. רשימת המיליס השמורות בשפת ++6 ניתנת בטבלה 4.2. טבלה 4.2: רשימת מילים שמורות בשפת ++6. וי ה680 56 אהסזם סט וחפהּ 00 6 ורי 6 וזח 60 6% 5 זסז יו הס ומטחס 6 6סם פחס|ן +חו 6חז|חו ז 100 0חסוזז בי סוטטס 60 וז ז וס צוסח ו 6 2 0 + סרפ הז בייפ ץצח שוסזחץ 5 חל 510 6וחצו 6 וס יי |8טשזוצ 60 ופחט חסוחט מדוע דרושים משתנים בתוכנית ? ככל שתוכניות מורכבות יותר, כן גדל מספר הפעולות שמתבצעות בהן על פריטים שוניס. למשל, תוכנית המחשבת משכורות עובדים, צריכה לעבד את נתוניו של כל עובד. נניח, כי התוכנית משתמשת במשתנים (80|69וז8/) שם-עובד, מספר-ת.ז. ומשכורת (כמובן שתכתוב את המשתניס באנגלית, כנדרש בתכנות). כשהתוכנית תופעל, היא תקצה את נתוני העובד הראשון למשתניס הללו ותפעל בעזרתס לחישוב משכורתו. לאחר מכן, היא תחזור על תהליך זה עבור כל אחד מהעובדיס האחרים, ותציב עבור כל אחד מהס את פרטיו האישייס במשתניס הללו. במיליס אחרות, בעת הריצה, התוכנית מקצה ערכיס חדשיס ושוניס למשתניס הללו, ומשתמשת בהס בחישוב משכורתו של העובד הנוכחי. המשתניס האלה (כולס, או חלקסם) מכילים ערכים שוניס בכל שלב חישוב, ולכן הס נקראיס בשס זה. הקצאת ערך למשתנה במהלך התוכנית ניתן לאחסן או להקצות ערכים למשתנים. כדי לעשות ואת, משתמשים באופרטור ההשמה (3%0ז6ק0 %ח6וחתש551), סימן שווה. בשורות הבאות להלן מוצגות מספר דוגמאות להקצאת ערכיס למשתניס מטיפוסים שונים. יש לשיס לב שבסיוס כל משפט השמה מופיע הסימן נקודה-פסיק. 72 = 806 52 = 7ץע5818 2 = מססת 6םס 60 06ת415868 פרק 4: משתנים לאחסון המידע 59 הערה הערכים הניתנים למשתנים אינן כוללים סימני פיסוק של מספרים (פסיקים או נקודות) כדוגמת 25,000.75 או 238,857. רישום הסימנים 7 האלה יגרום להפסקת ההידור של התוכנית והצגת הודעת שגיאה מתאימה. בתוכנית הבאה יש דוגמאות להצהרת משתניס והשמת ערכיס בהם: <ת.ת108%2608> 61086םת1+ (ס1סט) ת1נאת ה1סט ו 7 סמסת1 ;ץ58182 11086 ;תססת 6ם6 ₪0 06ם6018%68 סַםס1 2 = 866 52 = 7ץע5818 2 = תססת 6ם6 60 06ת415868 הקצאת ערכים בעת הצהרת המשתנים לעיתיס קרובות צריך לקבוע ערך התחלתי למשתניס. שפת ++6 מאפשרת להקצות ערכיס למשתניס בעת ההצהרה עליהם. להלן דוגמה: 2 = 806 6ם1 7 = ץצ58182 11086 2 = מססת 06 0ם 06ם41868 סַם0ס1 ברוב התוכניות הנכללות בספר ניתניס ערכיס התחלתיים למשתניס במסגרת הצהרתס. הקצאת ערך למשתנה במהלך התוכנית המשתניס מאחסנים בתוכם ערכים. בשפת ++6 משתמשים באופרטור ההשמה (סימן שווה) להקצאת ערך למשתנה. במשפט הבא מתבצע השמה של הערך 4 למשתנה בשם ח6550!, תוך שימוש באופרטור ההשמח: ;4 ת16550 בשפת ++6 ניתן לקצר את הדרך להקצאת ערכיס התחלתיים למשתנים, על ידי שימוש באופרטור ההשמה במסגרת משפט הצהרת המשתנה, כדלקמן: ת165980 %ם1 0 ++6 בקלות השימוש בערכי המשתנים לאחר שמשתנה מקבל ערך ניתן להתייחס לערך זה (לעבד ולקרוא אותו) על ידי שימוש בשס המשתנה המכיל אותו. לדוגמה, בתוכנית הבאה 9ק2₪5.0/שש530, מתבצעת הקצאת ערכיס לשלושת המשתניס שהזכרנו ולאחר מכן ערכיהס מוצגיס על המסך כהודעות פלט, תוך שימוש בפקודה +ט0ס. <ת.ת108%2608> 610866םת1+ (ס1סט)ת1נאת ה1סט ו 2 = 806 סם1 7 = ץע58182 11086 2 = מססת 06 60 06ם418568 סַם0ס1 ;01>> "016 68259ץ">> 8066 >> " 18 10786קת6 6ם7" >> סטסס 12 >> 88182 >> "9 8%685ת צסנ1סת מץ" >> סגוסס >> תססת 66 60 06ת41868 >> " 18 תססת 6ם7" >> סטסס 12 >> "6820 6ם6 תסע1 1168ת " משפט ה- 60% האחרון בתוכנית אינו נכלל בשורה אחת, ועל כן פיצלנו הערה אותו לשתי שורות. בשפת ++6 ניתן "לפצל" משפטים בצורה זו, מכיון 7 שסיום המשפט מסומן על ידי התו נקודה-פסיק. בכל מקרה, מומלץ לפצל משפטים בנקודת השבירה שלהם (כמו תחילת מחרוזת, סוגריים או אופרטור) ולהזיח את השורה החדשה לימין בשניים או שלושה תווים כמו בדוגמה. כאשר מהדרים ומריציס תוכנית זו, המסך מציג את הפלט הבא : <צספת0> 5מתעא0:\<580 ה 48 6825ץ 32 158 60010766 6ם" 75 8%655 צְס1סת מ ם%ע68 6םת6 תסע+ 1165 238857 15 מתססת 6םמך כפי שניתן לראות, כדי לנצל את הערך שמאוחסן במשתנה, צריך לצייןו את שס המשתנה במשפטי התוכנית. פרק 4: משתנים לאחסון המידע ‏ 61 גלישת ערכי משתנים כפי שלמדנו, הטיפוס (סוג) של משתנה קובע איזה ערכיס הוא יכול לאחסן. לדוגמה, משתנה מטיפוס )ח! יכול להכיל ערכיס בתחום מ- 32,768- ועד 32,767. הקצאת ערך שאינו בטווח הערכיס האלה למשתנה +%חו תגרוס שגיאת גלישה (זסזוס צוסו!זסעס). התוכנית הבאה, 699.ששס :ו=מפטס, ממחישה מהי שגיאת גלישה. היא מקצה למשתניס ערכים שאינס בטווח המתאיס להם. בתוכנית יש שני 5פחוחזהּ\\ מכווניס. <תמ.ת105%268> 610866םת1+ (ס10סט) תנאת ה1סט | 72 = 0810176 %ם1 2 = 6-עט08161ס 016 שַתס1 7 = 00816176 116516 0288 2 >> 6ט051601סק >> " פםת1אסתסס חסם 6ט161פסק" >> סטסס 2 >> 0816176 16 >> " 8ם681ת00 חסם שטנס1פסק 16ס" >> סטסס " 8ם681ת00 חסם 6ט161פסק 11%6%616">> סטסס >> 116616 0816176 >> 2 לאחר הידור והרצת התוכנית נראה את הפלט הבא על המסך: 6 פףת081ת00 חסם 6ט5161סק 6. פ8ף 00081 חאסם 6ט5161סס ש1ע 0 8 שוסת 6ט8101ס 116616 הערה ערך התו 6ששו5ס ₪6ו! יכול להשתנות בהתאם לסביבת ההפעלה, 05כ או : 5\וסחו/\. כפי שניתן לראות, התוכנית הקצתה למשתנים ערכים מסוג פַחס!, 6חו ומסוג זפחס, שאינם בטווח המתאים להם, ולכן נוצרה שגיאת גלישה. שגיאות גלישה קשות לאיתור, ולכן יש לזכור תמיד בזמן התכנות מהם תחומי הערכיס המתאימיס לכל משתנה. שיק 6 ! הערך שהתוכנית מציגה עבור המשתנה 6ע0ו5סכ 6טו! הוא מסוג זבּח6 (תו), מכיון שהמשתנה הוגדר מטיפוס זה. ומכיון שכך, התו שהוצג על ידי %\60 כערכו של המשתנה ש6עטחופסק 6או! מתאים לתו ]4561 המורחב שערכו 210. 2 ++6 בקלות דיוק של ערכי משתנים כפי שלמדנו, כאשר מקצים למשתניס ערכים אשר חורגיס מטווח הערכיסם שהס יכולים להכיל, קורות שגיאת גלישה. באופן דומה, צריך לתת את הדעת גס לבעיית יכולת המחשב להציג ערכיס מדויקיס של מספרים בעלי ספרות עשרוניות. ווהי בעיית דיוק (חסו66!5זק) בעת אחסון (וכתוצאה מכך - הצגה) של ערכים מספריים. כאשר עובדיס, למשל, במספריס מטיפוס נקודה צפה טחוסק 0ח80סו= - מספריס בעלי נקודה עשרונית), המחשב אינו יכול להציג אותס תמיד בדיוק של מספר הספרות העשרוניות שלהס. שגיאות דיוק (פזסזז6 חסו9!ו66זק) כאלו קשות מאוד לגילוי. התוכנית הבאה, 6155.6099פאפ, מקצה ערך קטן מ- 0.5 למשתנה מטיפוס 086, 6!פטוס (כלומר: נקודה צפה, דיוק כפול). התוכנית ממחישה את מגבלות המחשב בעת ייצוג מספרים. המשתנה בתוכנית אינו מכיל את הערך שהוצב בו, אלא את הערך 0.5: <ת.ת108%2608> 61086םת1+ (10סט) תנאת 18סע ו 2 = 815 06סם 5 11086 2 0 = 15את ססםת 4 16סגס4ף 5 ססם 5 >> " 18 0.49999990 ס6תנסק 8ַם108%1ע" >> סטסס ; 61ת6 >> 2 >> 15את ססת 6 >> " 18 0.49999990 16מטסכ" >> סטסס לאחר הידור והרצת התוכנית יופיע על המסך הפלט הבא : 5 18 0.49999990 סתנ1סס 6ם10861קע 5 18 0.49999990 16סטסכ כפי שניתן לראות, הערכיס שהוקצו למשתניס והערכיס שהמשתניס מכילים למעשה אינם זהים. אי דיוקים אלה קורים מפני שקוד המכונה של המחשב מייצג מספרים באמצעות מספר קבוע של ספרות אחד ואפס (מילה בגודל קבוע). אין להבין מהכתוב, שהמחשב אינו יכול כלל להציג ערכים באופן מדויק, אלא, שבעת צורך להשתמש במספרים בעלי רמת דיוק גבוהה, יש לזכור את בעיית אי-הדיוק האפשרית ולטפל בה בכלים מתאימים, מכיוו שקשה מאוד לאתר שגיאות מסוג זה. בנושא וה לא נעסוק במסגרת הספר. פרק 4: משתנים לאחסון המידע 63 שימוש בהערות לשיפור קריאות התוכנית בתוכניות מורכבות המכילות מספר רב של פקודות לא תמיד כל המשפטים ברורים, או קלים להבנה. לפעמיס יש גס צורך להעביר למתכנתיס אחריס את התוכניות שנוצרו על ידי עמיתיהם בצוותי התכנות של פרויקט מסוים. על כן חשוב להקפיד על כתיבה ברורה של התוכניות. הנה מספר דרכיס מומלצות לשיפור קריאות התוכנית: %> שימוש בשמות משתניס בעלי משמעות המתאריס את תפקיד המשתנה. > עריכה והזחה (ח%900ח06ח1) נכונה של המשפטים בתוכנית (ראה פרק 7). > שימוש בשורות ריקות להפרדה בין קבוצות של משפט ביצוע. % שימוש בהערות בתוך התוכנית להסבר תהליכי התוכנית. ניתן לציין שתי מעלות לשימוש בהערות (%5ח6וו60) בתוך התוכנית. הראשונה - הו מאוד מועילות למתכנתים, כאשר הס מעייניס בתוכניות שנכתבו על ידי מתכנת אחר. השנייה - כאשר הזמן חולף, וכותב התוכנית חייב להיזכר בפרטי הדבריס שהוא עצמו צירף לתוכנית. להכנסת הערות בתוך התוכנית בשפת ++6 משתמשים בתווים // (שני לוכסנים), כמו בדוגמה: %מסתתסס 8 18 18םמץל // שני הלוכסניס // מצייניס למהדר שלא להתייחס למשפטים הכתוביס אחריהס ועד לסוף השורה. אין זה מחייב, אך רצוי בתחילת כל קובצ מקור לכתוב מספר מיליס אודות שס התוכנית, שס המתכנת, תאריך הביצוע וכמובן מטרת התוכנית : פס תס :תהשססצק // 8 185עא :2ס6תתה28ססצק // 9 :ם1606₪עח 2866 // // . ת8%10ת07ס+ת1 000666 צְ1ת>תסת 7280%8 :6פסספטס // בהמשך התוכנית ניתן לבאר את המשפטים השונים, תוך מיקוס הערות הסבר אחרי המשפטיס או תחתיהסם. למשל, נתייחס למשפט הבא : 8% ת1 06מם1868כ // 2 = תססת 6ם6 סם 06םת41568 הערה שהוצבה מימין למשפט מתארת בבירור את המידע הנוסף אודות הביצוע שלו. סוגיה מעניינת היא, מה הוא הגבול להצבת הערות! ניתן להשיב בפשטות: אף פעס אין די הערות בתוכנית, אולס אין להיגרר למצביס מוגזמיס הגובליס בגיחוך. ההערות המוצגות בשורות הבאות אינן מוסיפות כלל למעיין בתוכנית. 4 ++6 בקלות 6 78218016 6םת₪ 0ם 32 מ16פפת // 7 = 866 צ%ע8818 082180108 ס6םתם 50 2500.75 מם16פפת // ;2500.75 = 58185 מטרת הערות בגוף התוכנית היא להסביר מדוע מוצביס המשפטיס במקומס. תיעוד פנימי של התוכנית ברוב התוכניות קייס צורך בהסבריס פנימייס ותיעוד התהליכיס המתבצעים בהן. כך יכוליס המתכנת עצמו וגס מתכנתיס אחריס להבין טוב יותר את התוכניות ולבצע בהן שינוייס בעת הצורך. בשפת ++6 משתמשים בשני לוכסנים (//) לציון הערה פנימית בתוכנית. הנה דוגמה: %מסתתסס ++0 8 18 18מץך // בתהליך ההידור, כאשר המהדר מזהה את הסימנים /, הוא מתעלס מהמיליםס הכתובות אחריהס מימין עד סוף השורה. תוכניות הכתובות היטב מצטיינות בקלות הבנתן. הערות בתוך התוכנית מגבירות את הבהירות של תוכנית. בנוסף לשימוש בהערות (0ח6וחח60) כדי לשפר את קריאות התוכנית, הערה צריך להשתמש בשורות ריקות כדי להפריד בין קטעי תוכנית או בין 7 משפטי תוכנית שאינם "שייכים" זה לזה. כאשר מהדר ++6 מגלה שורה ריקה, הוא פשוט מדלג עליה. סיכום בפרק ה הצגנו כיצד ניתן לאחסן מידע בתוך משתניס במהלך ביצוע התוכנית. בקצרה, משתנה (80!6ו8/)) הוא שס שהתוכנית מקצה למקוס הזיכרון שבו היא שומרת נתוניס או תוצאות. לפני שהתוכנית משתמשת במשתנה, צריך להגדיר שם וסוג שניתניס לו. בפרק 5 תלמד כיצד לבצע במשתניס פעולות חישוב פשוטות, כמו חיבור וחיסור. לפני שנעבור לפרק הבא מומלצ לבחון אס מובניס הנושאיס הבאיסם: * כדי להשתמש במשתנים צריך להצהיר את טיפוס המשתנה ואת שמו. שמות המשתנים חייבים להיות ייחודיים, ורצוי שיהיו בעלי משמעות. שמות המשתניס מתחילים באותיות, או בקו-תחתון. שפת ++6 מבדילה בין אותיות גדולות לבין אותיות קטנות. 0% ל טיפוס המשתנה קובע איזה ערכיס ניתן לאחסן במשתנה. טיפוסי משתניס נפוציס בשפת ++6 הם: ₪08%, %חו, זהח6 ו- פחסו. % הערות בתוך התוכנית משפרות את הבהירות של התוכנית. בשפת ++6 שני תווי לוכסן (//) מצייניס הערה בתוך התוכנית. פרק 4: משתנים לאחסון המידע | 65 תרגילים 6 כיתבו תוכנית המגדירה את המשתניס הבאים : א) מידת נעליים - משתנה מסוג זחן ב האות הראשונה בשם - משתנה מסוג 6087 ג מספר הכוכביס בדגל ארהייב - משתנה מסוג +חו ד) מספר האטומים ביקוס - משתנה מסוג 00!6ו0 ה) ערך הקבוע ח - משתנה מסוג 08% לאחר מכן יש לקבוע ערכיס התחלתיים כלשהם לכל המשתנים (פרט למשתנה האחרון, המקבל את הערך 3.14), ולהדפיס אותם. כיתבו תוכנית המחשבת נפח קוביה. הגדירו משתנה מסוג זחו, אשר ערכו הוא צלע הקוביה, ואתחלו אותו לערך 10. יש להשתמש במשתנה נוסף מסוג )חו לחישוב נפח הקוביה, ולהדפיס את ערכו. כעת תנו ערך חדש למשתנה אורך הצלע, חשבו את הנפח החדש, והדפיסו את התוצאה שמתקבלת. מיצאו את השגיאות בתוכנית הבאת: <ם.0ת105%268> 61066ם1+ (10סט) ת81ת ב1סע | ;א 6א1 72 ץצ 1068 1 "=" 5 1086" 2 = 02 2 = 01 300016 ; 68% 7 סםב1 שטט 10 2 22 086ס1ם ) התוכנית הבאה בודקת תוצאות השמה בין סוגי משתניס שונים. הגדירו משתנה בשם + מסוג +08 בעל ערך 4.7. כעת הגדירו משתנה נוסף בשם !1 מסוג %חו שלתוכו יש להציב את ערך המשתנה +. הדפיסו את הערך המתקבל במשתנה 1. במקביל לסעיף הקודם, יש לתת למשתנה חדש [ את הערך 5, ולהציב את ערך המשתנה ( לתוך משתנה +. יש להדפיס את הערך המתקבל ב-). התוכנית צריכה לכלול תיעוד, כלומר - הסבריס/הערות. התרגיל הבא בודק את מגבלות הדיוק של המחשב. הגדירו משתנה מסוג זחו ואתחלו אותו לערך 12345678. הגדירו משתנה מסוג 808% ואתחלו אותו לערך 7 כפול 10 בחזקת 41- (7.05-41). יש להדפיס את הערכיםס המתקבליס. הערה : בתרגיל יש שני 5סָחוחז8/ץ וזה בסדר. ++6 בקלות פעולות אריתלטיות בסיסשיות בפרק הקודס הראינו כיצד מצהיריס על משתנים ומגדיריס אותס בתוכנית. בדרך כלל, בתוכניות מחשב משתמשים בערכים המאוחסנים במשתנים כדי לבצע פעולות אריתמטיות כגון סיכוס, חיסור, כפל וחילוק. בהמשך הפרק נדון בנושאים הבאים : % שימוש באופרטורים אריתמטיים של ++6 לביצוע פעולות חשבוניות בתוכנית. + ++6 קובעת סדר קדימויות לאופרטוריס האריתמטיים השונים, כדי להבטיח שפעולות חשבוניות תבוצענה בסדר נכון. > שליטה על סדר הפעולות החשבוניות בתוכנית באמצעות סוגרייס. + ניתן להשתמש באופרטור ההגדלה העצמית (++) כדי לחבר 1 לערכו של משתנה, ובאופרטור ההקטנה העצמית (--) כדי לחסר 1 מערכו של משתנה. לאחר הצגת נקודות אלו, נוכל לראות כמה קל לבצע פעולות אריתמטיות בשפת ++6! אופרטורים מתמטיים בסיסיים ברוב התוכניות צריך לערוך חישובים אריתמטייםס בערכים ובמשתנים. הפעולות האריתמטיות הבסיסיות הן חיבור, חיסור, כפל וחילוק. בהמשך נציג כיצד לבצע פעולות אלו על ערכיס קבועים (דוגמה: 3 * 65 ועל משתניס (כמו : וחט5 + |008)). בטבלה 5.1 מוצגת רשימת האופרטוריס האריתמטייסם הבסיסיים. פרק 5: פעולות אריתמטיות בסיסיות | 67 טבלה 5.1: אופרטורים אריתמטיים בסיסיים בשפת ++6. האופרטור פעולה דוגמה (%ה% + 605% = |%0%8 ;0 - +חסוחץ8ק = 6806 ;86 אםץ * 605% = אם+ 00% / |%088 = 6מָמז6עבּ התוכנית 655.אדגוושס5 משתמשת בפקודה 600% להצגת התוצאות של מספר חישוביס אריתמטייס בסיסיים. , " >> 1.2345 * 2 >> 12 " >> 15 / 3 >> 2 , 7 > > 12 <ת.ת108%2608> 610866ת1+ ;617ת6 >> 7 + 5 >> " 2 >> " 2 * (16סט) מ1את ה1סע ו 7 יק 5. ך" 3 -5" >> >> >> >> \ 6גוסס 6גו0סס 6גוסס 6גו0ס0ס ו כשנתבונן במשפטי התוכנית, נוכל להבחין שבכל שורה מופיע הביטוי האריתמטי פעמיים: פעם אחת בין גרשיים, כדי שהתוכנית תציג את הביטוי ופעם שנייה ללא גרשיים, כדי להציג את התוצאה עצמה. בהמשך המשפט מופיע סימן של שורה חדשה. לאחר הידור והרצת התוכנית יופיעו על המסך השורות הבאות: במקרה הקודס הצגנו פעולות מתמטיות כאשר האופרנדיס הס ערכיס 5< > 8זתאאסט0:\<5 12 7 2 1.2345 * 3 19 / 4 ו קבועיס. בתוכנית 2ק85.6געוודגא מוצגות פעולות אריתמטיות אשר מופעלות על משתנים. 8 ++6 בקלות <ת.ת108%2608> 61086ת1+ (16סט) מ1את ב1סע ָ ח166 תה 01 0086 6םע // 72 = 00850 1086) %ת66עסק 6 18 א68 58168 // 2 = א08 858168 1086 48 עמסעגס 6ם6 ס>תטסתה8 76 // ;20.00 = 810 >תטסת8 1086 6 866ת028 מ6ץטס,א58 58168 //‏ ;00081 ,606ת8ם0 ,א8ם 1086 1 60581 // ;8% 858168 * 0086 = א₪8% ;688% + 0086 = 0681ם 2 - 8160 סתטסת8 = 06ם8ם0 אה68 >> "5 :א718:\" >> 008% >> "5 :0088 1668" >> סטסס 7 >> 0581 >> "0 :1ב1ס9\" >> 6012 >> 06ם028 >> "9 :ַססִתהת0 0056065" >> סגוסס 1 המשתנים המופיעים בתוכנית הס מטיפוס ממשי. ניתן לראות, כי בהצהרה על המשתניס מתבצעת השמה של ערכים רלוונטיים. בהמשך, התוכנית מבצעת סדרה של פעולות אריתמטיות לחישוב מס הקנייה של המוצר, העלות הכוללת של המוצר והעודף המגיע לקונה. לאחר הידור והרצת התוכנית יוצג על המסך הפלט הבא : <עססתת> פ5פתעםץתא<\:0 9 :70681 3 :א78 0 :00890 1660 00560862 682060: 1 קידום ערך המשתנה באחד אחת הפעולות הנפוצות בתוכניות מחשב היא קידוס ערכי משתניס באחד. בדרך כלל משתניס אלה משמשים מונים לביצוע פעולות כדוגמת ציון מספר הקוב להדפסה, או ספירה של אירועים. להלן דוגמה למשפט בשפת ++6 המקדם את ערך המשתנה +%חטס6 באחד, כלומר, לאחר ביצוע המשפט ההשמה. הערך המאוחסן במשתנה +חטס6 יהיה תוצאה של חיבור הערך הקודם ועוד אחד. 2 + סתטסס = סמתגטסס התוכנית 699.דאט6600א1 משתמשת באופרטור ההשמה לקידוס ערך המשתנה וחטח באחד. פרק 5: פעולות אריתמטיות בסיסיות 69 <ת.ת108%2608> 610866ת1+ (ס10סט) ת1נאת ה1סט | 72 = תגםת 6ם1 ;6[1ת8>> תטם >> " 18 6ט81ט 6ם%1ע508 6'5םתטסס" >> סגגוסס ;1 + תטת = חתטם 12 >> תגטם >> " 18 6ט810ט 8ם61ת6 פ6'5םתטסס" >> סגוסס לאחר הידור והרצת התוכנית, יוצגו על המסך השורות הבאות: <צססתם> | 7א00ס0ס6א60:\<1 0 185 6ט810ט 06ם%1ע568 5'שתגוסס 1 18% 78106 06מם₪1ם6 5'שמגוסס מכיון שפעולת קידוס ערך המשתנה באחד שכיחה מאוד, קייס בשפת ++6 אופרטור מיוחד לפעולה זו ושמו אופרטור להגדלה עצמית (וסזבּו6ק0 60%וח6ו6ח1) האופרטור מורכב משני סימני פלוס (++) הצמודיס למשתנה. להלן שני משפטים, המבצעיס הגדלת ערך המשתנה חחח באחד: ; ++וזגום ;1 + חתטם = תטת התוכנית הבאה 699.פס 6א1 משתמשת באופרטור להגדלה עצמית, כדי לקדס את ערך המשתנה וחטח באחד : <םת.ת108%208> 006ו61ת1+ (ס1סט)תנאת ה1סט \ 72 = תגם 6ם1 ;61ת8>> תטם >> " 18 6ט81ט 06ם%1ע5082 6'5םתטסס" >> סגוסס ; ++ותגום 12 >> תגטם >> " 18 6ט810ט 8ם61ת6 6'5םתטסס" >> שסגוסס תוכנית זו פועלת בצורה והה לתוכנית קקס. זאטס66אז שראינו קודס. משמעות מיקום האופרטור להגדלה עצמית ביחס למשתנה ניתן להציב את האופרטור להגדלה עצמית לפני שס משתנה המיועד לקידום, או אחריו. לדוגמה : ;++18016עה8 ; 18016ע2ה8עט++ 0 ++6 בקלות במקרה הראשון, כשהאופרטור מופיע לפני שס המשתנה הוא נקרא אופרטור הגדלה עצמית מוקדמת (ז3+0ו6ק0 +חה6וח6'ו6חו או61זפ). במקרה השני, כשהוא מופיע אחרי שס המשתנה הוא נקרא אופרטור הגדלה עצמית מאוחרת פהסוחסו6ח! או)05%ק ז0ז63קס). הבה נבין את ההבדל בפעולות האופרטור לפי המיקוס שלו ביחס לשס המשתנה. לפנינו הביטוי הבא : ;++ףתטסס = סתטסס 6תפפעטס במשפט ההשמה מתבצעת הקצאת הערך הנוכחי של משתנה %חטס6 בתוך המשתנה 60% %ח6זזטוס. בנוסף ולאחר ביצוע ההשמה, אופרטור הגדלה עצמית יימאוחריי גורס לקידוס ערך המשתנה %חטסס באחד. לכן, המשפט הקודס שקול לשני המשפטיס הבאיס: ;מטסס = סתטסס סתספעטס 72 + סתוסס = סתגוסס כעת נעבור לאופרטור קדס הגדלה עצמית. נתייחס לביטוי הבא: ;%תטסס++ = 6תטסס סמתפעעגוס במקרה זה, לפני שמבצעיס את משפט ההשמה, מגדילים את ערך המשתנה 600% באחד. את התוצאה מקציס למשתנה +חטס6 %חסזוטס6. לכן המשפט הקודם שקול לשני המשפטים שלהלן. 72 + סתגוסס = סתגוסס ;מטסס = סתטסס סתספעטס כאמור, קידוס משתניס באחד הינה פעולה נפוצה מאוד בתוכניות ++6, ולכן חשוב מאוד לדעת את אופןו הפעולה של האופרטור להגדלה עצמית בשתי הגרסאות שלו. בתוכנית הבאה 9ק6.ד05פ שפפ, מוצג השימוש באופרטור להגדלה עצמית : <ת.ת108%2608> 610866םת1+ (16סט) מ1את ה1סע ן 2 = ס6תטסס 80811 6ת1 2 = סתטסס 016 6ת1 2 >> שתגטסס 80811 >> " 18 סתגוסס 11הת5" >> סטסס >> ++סתטסס 811ת8 >> " 16108ץ ++6תטסס 811ת5" >> סטסס 2 >> שתגסס 811ת16">>5אט סַם61ת6 ש6עוסס 11הת5" >> סטסס 2 >> סתטסס 016 >> " 18 סתגוסס ט1ס" >> סטסס 2 >> סתטסס 016++ >> " 16168ץ סתטסס 0106++" >> סטסס ;01 >> סתטסס סנס >> " סט1הט סַםתנהםתס סתטסס ש1מ" >> סטסס פרק 5: פעולות אריתמטיות בסיסיות ‏ 71 לאחר הידור והרצת התוכנית יוצגו על המסך השורות הבאות: <עס6סתע> ‏ 2057 מתק<\:0 0 18 >תטסס 50811 0 16108ץ ++%מגוס6 50811 1 6גו81ט שַם01ם6 ס6תטס6 50811 0 18 סתטסס 16 1 16168%5ץ סתטסס ש01++ 1 06ג1אט שַםת61ם6 סתטסס ש1כס בתוכנית הקודמת מופעל אופרטור הגדלה עצמית מאוחרת על המשתנה +חטס6 ו|5. כתוצאה מפעולה זו התוכנית מציגה את הערך המקורי של המשתנה, שהוא אפס, ואת הערך החדש שהוא אחד. לעומת זאת, על המשתנה זחטסס פופ מופעל האופרטור קדס הגדלה עצמית. התוכנית מקדמת את ערכו באחד טרס ביצוע משפט ההצגה, ולכן מוצג על מסך הערך 1001 שהוא ערכו החדש של המשתנה. אופרטור הקטנה עצמית ראינו קודס, כי בשפת ++6 סימן הפלוס הכפול (++) הוא האופרטור להגדלה עצמית. בדומה לו, בשפת ++6 קייס אופרטור להקטנה עצמית (800ז6קס %ח6וח6זססכ), המשמש להקטנת ערך המשתנה באחד. סימנו של האופרטור להקטנה עצמית הוא מינוס כפול (--). הפעלת האופרטור להקטנה עצמית והה להפעלת האופרטור המקביל, המשמש להגדלה עצמית. האופרטור להקטנה עצמית מופיע בשתי צורות: אופרטור הקטנה עצמית מוקדמת (6/8%0קס 060%וח06676 א6זק) ואופרטור הקטנה עצמית מאוחרת 678%0ק0 066767060% אוחפסק). בתוכנית הבאה, ;69.זאט60ספם, מוצג השימוש באופרטור להקטנה עצמית : <ם.ת1085%208> 61006ת1+ (ס1סט) מ81ת 1סע | 2 = סתטסס 80811 6ת1 2 = סתטסס ש1ס 6ת1 2 >> סשתגסס 80811 >> " 18 סתגוסס 11הת5" >> סטסס 2 >> --6ת000 80811 >> " 716108 --6תגוסס 50811" >> סגוסס 2 >> סתטסס 80811 >> " סגו81ט סַם01ת6 סתטסס 811תפ" >> סטסס 2 >> סתגטסס 16 >> " 18 סתעגוסס ט1ס" >> סטסס 2 >> סתטסס 16כ₪-- >> " 16168ץ סתטסס 16כם--" >> 006 ;01ת6 >> סתטסס סָגם >> " סט1הט סַםתנהםתס סתטסס ש1ס" >> סטסס 2 ++6 בקלות לאחר הידור והרצת התוכנית יופיעו על המסך השורות הבאות: <לס6ת₪> צַאטש600מכ<\:60 0 18 >\תטסס 50811 0 16188ץ --6תט60 50811 1- 18 6גו1ט שַם61םת6 6>תטסס 50811 0 18 סתטסס 16 9 161685ץ סתטסס 6ש1ס-- 9 18 סגו1ט שַם61םת6 סתטסס ש1ס על פי תוצאות התוכנית לעיל ניתן לקבוע כי האופרטור להקטנה עצמית פועל בצורה זהה לאופרטור להגדלה עצמית, למעט ההבדל שהאחרון מקטין את ערכו של המשתנה באחד. אופרטורים אחרים בפרק הנוכחי התמקדנו באופרטוריס האריתמטייס הבסיסים ובאופרטוריס להגדלה והקטנה עצמית. בשפת ++6 קיימיס מספר רב של אופרטורים. להלן טבלה המציגה מספר אופרטורים נוספים שבשימוש בשפה. טבלה 5.2: רשימת אופרטורים בשימוש בתוכניות ++6. אופרטור >> << התפקיד מודולו או שארית. מחזיר את שארית התוצאה של פעולת החילוק. אופרטור המשליס לאחד. הופך את ערך הסיביות של משתנה. אופרטור סא\. פעולת 4% בסיביות בין שני משתנים. אופרטור 08. פעולת 08 בסיביות בין שני משתנים אופרטור 0₪א. פעולת 0₪א בסיביות בין שני משתנים. הזוה אריתמטית שמאלה של סיביות לפי מספר הסיביות. הווה אריתמטית ימינה של סיביות לפי מספר הסיביות הדרוש. פרק 5: פעולות אריתמטיות בסיסיות 3 סדר הקדימות כשמרכיבים ביטויים אריתמטיים יש לקחת בחשבון את סדר קדימות הביצוע של האופרטוריס בביטוייס אלה. לדוגמה, לפעולת הכפל יש קדימות על פני פעולת החיבור, ועל כן פעולת הכפל מתבצעת קודס. נבהיר ואת על ידי בחינת הביטוי הבא : 268016 = 5 + 2 * 72 על פי סדר ביצוע הפעולות שבביטוי ניתן לקבל שתי תוצאות שונות: = 1 3 52% = 110 סל 2 + 5 = ;3 * 7 = = ;21 = כדי לגרוס לאחידות בחישובים, קייס בשפה סדר קדימות קבוע לביצוע של אופרטוריס. בטבלה 5.3 מוצגת סדר קדימות של האופרטוריס בשפת ++6. הטבלה מחולקת לקבוצות, כאשר הקבוצות העליונות הס בסדר קדימות גבוה יותר. הכוונה לכך שפעולות אלו יתבצעו לפני פעולות שבקבוצות תחתונות יותר. בתוך הקבוצה האופרטוריס מקבליםס סדר קדימות שווה. כפי שציינו קודם, ניתן לראות בטבלה שאופרטור הכפל קודס לאופרטור החיבור. בטבלה מוצגיס כל האופרטוריס שבשפת ++6. בהמשך נלמד על פעולות האופרטוריס השוניס. טבלה 5.3: סדר קדימות של אופרטורים. אופרטור | פעילות דוגמה טווח הכרה 6 ה 00 שרח 6::6[855רחח 61855 טווח הכרה גלובלי סח 6!סהוהּץ:: סימון נקודה לאלמנט 6 זר 660.6[טס <>- סימון חצ לאלמנט 6וחח ז6סוח6ו <-זססהוסק 0 קריאה לפונקציה (005 038 )0 ה6חט? 8 ציוון מערך [א06חו]ץהזובּ \ דסא לוגי ח0ו655ואס! . המשלים ל- 1 הופך את הסיבית ח0ו655ז0 אס + חיבור אונרי 1+ - חיסור אונרי 1 ++ הגדלה עצמית מאוחרת/מוקדמת 6 הצ++ / ++80|6זפ8/ -- הקטנה עצמית מאוחרת/מוקדמת 6 ה-- / --80|6]זה 8 כתובת של וה 4 ++6 בקלות אופרטור > ]2 צוסח )%%6 פעילות דוגמה מצביע גודל טיפוס/אובייקט אופרטור הקצאת זיכרון שחרור ציכרון מציין למצביע מצייו למצביע כפל חילוק מודולו חיבור בינארי חיסור בינארי הזזה אריתמטית שמאלה הזוה אריתמטית ימינה קטן מ קטן שווה גדול מ גדול שווה שווה שונה פעולת 4% בסיביות פעולת 08א בסיביות פעולת 08 בסיביות וגסם בתנאי או בתנאי תנאי מותנה השמה קיצור - כפל קיצור - חילוק חוסק* (06/%)512001 / (51260%)00[66% 6 שסח זסזחוסק 06|6%6 זז חוסק*.160 0 חוסק<-0[60% ח0סו655זקא6 * חסן655זקאם חסן655זקא6 / הסו655זקאם הסן655קא6 % חסן655זקאם חסו655זא6 + חסו655זקאם חסו0655א6 - חסו655זקאם חסו77655ק[6% >> חס|655זקאם חסו655זק%א6 << חהסן655זקאם חסו655זקא6 < חהסו55סזקאם חסן7655קא6 => חסו655זקאם חסו655זקא6 < חסו655זקאם חסו655זקא6 =< חסו55סזקאם חסו655קא6 == חסו655זקאם חסו655זא6 =! חסו5פסזוקאם חסו655זקא6 0 הסופפסזוקאם חסו655זקא6 א הסו5פסוקאם חסו655וקא6 ₪כ) הסו5פסוקאם חסו055 זא +88 הסו5פסזוקאם חסו55זקא6 || הסופפסוקא= ("ץ 656 ,א הסור 3 11" 5חהסוח ץ : א ? 8) חסו07055ק1-6%ח0סו7655ק6% = חסו655זוקאם ח0ו655ז0קא6 =* חסו655וקא= חסו655זק6% =/ חסו55סוקאם= פרק 5: פעולות אריתמטיות בסיסיות | 75 אופרטור דוגמה =% קיצור - מודולו ה0ו655זקא6 =% חסו655זקאם = קיצור - חיבור חסו695זקא6 =+ חסו55טזסאם ל קיצור - חיסור חסו655זקא6 =- חהסו55טזסאם =8₪ קיצור - פעולת סאג בסיביות חסו655 6 =.8 חסו5פסזקא= =2 קיצור - פעולת 08א בסיביות חסו655 וקא =>/ חסו655זקא= =| קיצור - פעולת 08 בסיביות 606550 = | ח65500זקא= =>> קיצור - הווה שמאלה חסו27655ק[א6 =>> הסופפסזוקאם =<< קיצור הזזה ימינה חסו655זקא6 =<< חסופפסזוקאם חסו655 6 , חהסו655זכא6 שחו קביעת סדר הפעולות בביטויים מתמטיים לעיתיס יש צורך לקבוע סדר ביצוע פעולות אריתמטיות שלא על פי סדר הקדימות של השפה. לצורך זה ניתן לשלב בביטוייס האריתמטיים - סוגריים, וכך לחלק את הביטוי לקבוצות חישוב נפרדות. מבחינת סדר הביצוע של התוכנית, הביטוייסם שבתוך הסוגרייסם יתבצעו ראשוניס. נבהיר ואת על ידי בחינת הביטוי הבא : ;(4 + 3) * (3 + 2) = 209016 להלן סדר הפעולות לביצוע: ;(4 + 3) * (3 + 2) = 016ו68ע2 על ידי שימוש בסוגריים, מחלקיס את הביטוייס לקבוצות, וכך קובעיס את סדר ביצוע הפעולות האריתמטיות. הדוגמה הקודמת עוסקת במספרים בלבד, אך אפשר להקיף בסוגרייס גס משתנים, או צירוף של משתניס ומספרים: 2 * (0 106ע0 + 8 2106) = 0086 6 ++6 בקלות פעולות חשבוניות עלולות לגרום לשגיאות גלישה (שסו1וסעס) בפרק 4 למדנו, כי כאשר מקצים למשתנה ערך שאינו נמצא בתחוס הערכים שטיפוס המשתנה לאחסן, נוצרת שגיאת גלישה. באותו אופן, עלולות גס פעולות חשבוניות לגרוס שגיאות גלישה: כאשר מקציס למשתנה ערך שנובע מפעולה חשבונית כלשחי, והערך חורג מטוות הערכיס של טיפוס המשתנה הזה. לדוגמה, התוכנית קפס הפעסצודהות ממחישה את הנושא. שיס לב להסבר שאחריה. <ת.ת108%2608> 61086םת1+ (ס1סט) מ1את 1סטע | 2 סם1 2 * 200 = 16גו269 ;01 >> 88016ת >> " = 300 * 200" >> 6טסס ] כפי שניתן לראות, מוקצית מכפלת הערכיס 200 ו- 300 למשתנה מטיפוס זחו. כל אחד מהמספרים נמצא בתחוס הערכים המתאימים למשתנה מטיפוס זה (32,768- עד 7), אך מכפלתם (60,000) חורגת מהערך המקסימלי שהוא יכול להכיל, ולכן נגרמת שגיאת גלישה. הידור והרצת התוכנית 2ק6.מפעטסהזגוא יביאו להצגת הפלט הבא על המסך: <667ת₪> תמט0סה1הא<\:0 6 = 300 * 200 סיכום בפרק זה הצגנו כיצד מבצעיס פעולות אריתמטיות בשפת ++6. התמקדנו באופרטוריס הבסיסייס והאופרטוריס להגדלה/הקטנה עצמית, והסברנו מה הוא סדר קדימות בביצוע ביטוייס אריתמטייס. לפני שנעבור לפרק הבא, מומלצ לבחון אס מובניס הנושאיס הבאיסם: * בשפת ++6 משתמשים באופרטורים +, -, * ו- / לביצוע פעולות חיבור, חיסור, כפל וחילוק, בהתאמה. * אופרטור להגדלה עצמית של ערך משתנה, יכול להופיע בשתי גרסאות שונות: הגדלה עצמית מוקדמת והגדלה עצמית מאוחרת (אחרי). * אופרטור להקטנה עצמית של ערך המשתנה מופיע גם כן בשתי גרסאות: הקטנה לפני ו- הקטנה אחרי. פרק 5: פעולות אריתמטיות בסיסיות | 77 בגירסה קדס הגדלה/הקטנה עצמית משתמשים בערך המשתנה לאחר שגדל, או קטן ערכו באחד. לעומת זה בגירסה הגדלה/הקטנה עצמית מאוחרת משתמשים בערך המשתנה לפני שגדל או קטן ערכו באחד. כדי להגיע לביצוע עקבי של פעולות אריתמטיות, קייס בשפת ++6 סדר קדימות לביצוע האופרטוריס השוניס. סדר הביצוע של האופרטוריס בתוך ביטוי הוא מימין לשמאל. משתמשיס בסוגריים כדי לשלוט על סדר ביצוע הפעולות בכלל, עס אפשרות להכתיב סדר פעולות רצוי כלשהו. בשימוש בסוגריים נוהגיס לפי כללי המתמטיקה, האומריס שביצוע פעולות בין סוגריים פנימייס קודמים לביצוע פעולות בין הסוגרייס המקיפים אותס. שים לב שמשתמשים בסוגריים רגיליס בלבד! בפרק הבא נציג את ערוץ הקלט ח₪. משתמשים בו לקריאת נתוני הקלט המגיעים מהמקלדת והקצאתס במשתנים השונים בתוכנית. תרגילים 8 כיתבו תוכנית המדגימה את פעולת האופרטור >> באופן הבא : יש לאתחל משתנה שלס בשם ו לערך 5, ולהציג בו את הערכים - ], 1>>ו, 2>>ן. כיתבו תוכנית המחשבת את שורשיה של המשוואה 6+אפ+2א8. התוכנית תגדיר שלושה משתנים מסוג 008%: 8, 5 ו- 6, ותאתחל אותס לערכיס כלשהס לחישוב המשוואה.| התוכנית| תגדיר | את שני שורשי המשוואה, | 650!611ז ו- 65002ז, מטיפוס +808. השורשיסם יחושבו על פי הנוסחה הבאה: 8 (480-:0\+ מ-) =6801%1ע2 8 (%05-480\- 5-) =2691182 יש להדפיס את שורשי המשוואה הריבועית 650/61 ו-650/02ז. הערה: התוכנית צריכה להיעזר בפונקציית הספריה +וס5. חישוב השורש של ערך * מתבצע על ידי הקריאה לפונקציה (50700. הפונקציה שייכת לספריה .ו ++6 בקלות 33 מהו הפלט המתקבל מהרצת התוכנית הבאה: (10סט) ת81ת 16סע ָ ;א ,1 = ץ סם1 ; ++ץ=א ;[01ת6 >> >> "=ץ " >> א >> "=א" >> 0008 ץ ץ ; ץש++=< ;[0ת6 >> = "שץש " 46 %.69 "שא" 46 פגוסס ץ 4 /++ (ץצ=א) 2 >6%>> ץ >> "=ץ " >> א >> "=א" >> 0006 ; ץט=א++ ;[01ת6 >> >> "=ץ ">> א >> "=א" 6> סטסס ץ ץ 4. כיתבו תוכנית אשר תיחשב את ההיקף והשטח של שני מעגליס שהרדיוסיס שלהס הינס 4 ו- 5 בהתאמה. פרק 5: פעולות אריתמטיות בסיסיות | 79 קליטת נתונים מ%הלקלדת עד כה למדנו על ערוץ הפלט 600% המשמש להצגת נתוניס וחישוביס על המסך. בפרק זה נכיר את ערוצ הקלט חו6, המשמש לקליטת נתוניס מהמקלדת. כמו כן נראה כיצד מאחסניס את הנתוניס הנקלטיס בתוך משתנה אחד או יותר. בפרק וה נדון בנושאיס הבאים: > ערו הקלט ח1ו6 משמש לקריאת תוויס ומספריס שהמשתמש מקליד, והקצאתס למשתניס מסוימיסם. % ניתן להשתמש בתוכן של משתנה, אשר הוקצה לו ערך באמצעות חו6, כאילו הערך הוקצה לו על ידי אופרטור ההשמה של ++6. %> כאשר מקציס למשתניס ערכים באמצעות ערו הקלט חו6, צריך להתאיס לכל משתנה את הערך המתאים לטיפוס (סוג) שלו, וגם לשים לב לטווח הערכים שהוא יכול לאחסן. בפעולות הקשורות בהצגת נתונים מפעיליס ערוץ הפלט +שסס על ידי שימוש באופרטור ההכנסה >> (020678%0 07₪ז56ה1) של הערוצ. בצורה דומה, בפעולות הקשורות בקליטת נתוניס מפעילים את ערוצ הקלט על ידי שימוש באופרטור השליפתה << (זס+הּוסקס חהסוז6בּו+אם) של הערוצ. 0 ++6 בקלות ערוץ הקלט חוס קליטת נתון מהמקלדת על ידי שימוש בערוץ הקלט מחייב קביעת משתנה שבו יאוחסן ערך הקלט. בתוכנית הבאה, 695.א61ד185פ, מוצג השימוש בערו הקלט חו6 לקליטת מספר מהמקלדת. בתוכנית זו, המספר שנקלט מאוחסן במשתנה וססוחטח. <ת.ת108%2608> 61086םת1+ (16סט) מ1את 1סע ָ 0 סשת תסע+ 686ע מעסקתטת 6םל // ;עסמתטם 6ם1 ;" נעפסתם 26898 6םת8 עססתטםת 1%66ע02ט18 עטסץ 6קץ71">> סגוסס ;עססמתטם << םמ01 ;[0ת6 >> עספמחטת >> " 18 פססתטם 1686ע02ט18 עטסצ" >> סטסס ו לאחר הידור והרצת התוכנית, מופיעה על המסך הודעת קלט המבקשת להקליד ערך של מספר כלשהו. לאחר הקלדת המספר והקשה על <זססחם> התוכנית מאחסנת את המספר במשתנה זסטוווח. בשלב הבא התוכנית משתמשת בערוצ הפלט +60 להצגת הודעה מתאימה על מסך, הכוללת את המספר שנקלט. התוכנית 5קס.5ופחסאף קולטת שני מספרים. לאחר קליטתס הס מאוחסניס במשתנה % ובמשתנה 0ח5600, על פי סדר הקליטה. ערכי המשתניס המוצגיס על המסך על ידי שימוש בערו הפלט זט0ס6. <ת.ת108%2608> 866ט610ת1+ (ס1סט)ת1נאת ה1סט | 6תםם 8 66קץ6 פע6סתטא //‏ ;0ם8600 ,51286 6ם1 ;" נעססתת 65855עק סם8 פפססמתטם סחס 6קץ1" >> סטסס ;56000 << 51286 << ם1ס "התה" >> 11286 >> " שעסח 60קץץ₪ פע6מתטת 6ם7" >> סגוסס ;01ם6 >> 6₪ת5600 >> ו יש לשיס לב למבנה משפט הקלט (חוס), ולבחון את השימוש בשני אופרטוריס לשליפה. 7 << 11286 << ם01 במשפט זה, ערוץ הקלט חוס מאחסן את ערך הקלט הראשון במשתנה 9%ז8, ואת ערך הקלט השני במשתנה 0ח5660. פרק 6: קליטת נתונים מהמקלדת ‏ 81 במקרה שדרושה קליטה של ערך שלישי, ניתן לשרשר למשפט אופרטור שליפה ומשתנה נוספים כמו דוגמה שלהלן. 7 << 6ת8800 << 11286 << ם1ס ערוץ) הקלט ח₪ מפריד בין המשתנים על ידי הבחנה בתו הבלתי נראה (ז603736%6 50806 6אוחש) הראשון. תווים, או סימניס בלתי נראים, הס תו-רווח, מקש 185, או מקש זסזחם. ניתן לבדוק תכונה זו על ידי הרצה חוגרת של התוכנית 5זסחסעל וקליטת המספרים תוך שימוש בתוויס בלתי נראיס שוניס. חוס וקליטת נתונים מהמקלדת ניתן להשתמש בערו הקלט חו6 לקליטת נתוניס מהמקלדת. השימוש בערוצ הקלט מחייב לקבוע באיזה משתנה יאוחסן הנתון שנקלט. להלן תבנית למשפט קלט תוך שילוב של אופרטור השליפה (<<). ₪ 5 ₪65 תקינות הקלט - שגיאות בקליטה ערוץ הקלט ח1ו6 מתאיס את הקליטה לטיפוס המשתנה המקבל את הנתון. לכן יש לקחת בחשבון שעלולות להתרחש תקלות בעת הונת מספרים לא תקיניס, או כאשר מזינים מספריס למשתנים שאינס מתאימים. למשל, אם נריץ את התוכנית אזסדפפזח הקודמת ונקליד את הנתון 1000000 כמספר האהוב עלינו, ונקיש זסזחם, נראה שבהודעת הפלט שהתוכנית צריכה להציג לא יופיע מספר זה. במסע גילוי סיבת הדבר נראה שהמשתנה שעליו מוקצה המספר הוא מטיפוס זחז, וכידוע משתנה זחו יכול לקבל את הערכיס שבתחוס 32,768- עד 32,767 בלבד, והמספר שרשמנו 1000000 הוא מחוצ לתחוס הזה. זוהי שגיאת גלישה (וסוזפטס). אם נשוב ונריצץ את התוכנית ונרשוס את האותיות 86 כמספר האהוב, שוב לא תהיה התאמה בין טיפוס המשתנה לבין הקלט המוצע, שכן אותיות אינן מספרים, וערוצ הקלט מצפה למספר. שגיאה זו היא מסוג אי התאמה בסוג (זסזס ח66הח5!וח 6קץד). אותס הניסיונות ניתן לערוך בהרצות חוזרות של התוכנית פפפאסווז. הקלדה של ערכים שאינס מספרים, ואף הקלדה של מספריס ממשיים (עס נקודה עשרונית) יגרמו לאותו סוג של תקלות שהראינו. בהמשך הספר נלמד לצמצס תקלות אלו ככל האפשר על ידי בדיקות תקינות לקלט. קליטה של תו אחד בשתי התוכניות הקודמות ערוצ הקלט מצפה לערכים מטיפוס זחו. בתוכנית הבאה, 6.5.6 אזס, מוצג השימוש בערוצ הקלט חו6 לקליטת תו אחד מהמקלדת. יש לשיס לב שהמשתנה הקולט את הנתוניסם מהמקלדת הוא מטיפוס זְהּחס. 2 ++6 בקלות <ת.ת108%208> 610866םת1+ (16סט) מ1את ב1סע | ;7 עאתס ;" נבעססתם 658עק 6ת8 0282806062 צץםה8 6קץ1" >> סטסס 2 << ם1ס 12 >> 160000 >> " פהח 60קעץ6 16606062 6ם7" >> סטסס ] לאחר הידור והרצת התוכנית ניתן להבחין שהתוכנית מסוגלת לקלוט תו אחד בכל ריצה. בחלק השני של הספר נציג כיצד קולטים מחרוזות של תוויס. קליטה של מילים מהמקלדת בחלק השני של הספר נלמד כיצד לאחסן מילים, או אפילו שורה שלמה של טקסט בתוך משתנה. גס נלמד להשתמש בערוץ הקלט חוס כדי לקרוא מיליס ושורות שלמות. לעת עתה נלמד לכתוב תוכנית הקוראת ערכים מטיפוס ₪086 ו-פַחס!. בתוכנית 06.67 אזס מוצג השימוש בערוצ הקלט חו6 לקליטת מספר מטיפוס פַחסו. באותה דרך ניתן לקלוט מספריס מטיפוסים שונים. המפתח הוא בכתיבה של טיפוס המשתנה במשפט הקלט המשמש לקליטה. <ת.ת108%2608> 61086םת1+ (ס1סט) ת1נאת ה1סט ו ;6ו1אט שם0ס1 ;" :עססםתם 688עס 0ת8 עססתטם 18266 8 ס6סץ1" >> סטסס ;16אט << ת01 ;01ם6 >> 6ו81ט >> " פ8ח 60קעץ6 טמסץ עססחטת 6ם7" >> סטסס ניתוב מחדש של הקלט כפי שלמדנו בפרק 3, ניתן לנתב את ערוצ הפלט 60% לקובצ או למדפסת, במקוס למסך. ערוצ הפלט %טסס מייצג את ערוצ הפלט הסטנדרטי סטקזטס 0870ח500) של מערכת ההפעלה. באופן דומה, ערוצ הקלט ח!ו6 מייצג את ערוצ הקלט הסטנדרטי טטסח!ו 706ז08ח5%9) של מערכת ההפעלה. כתוצאה מכך, ניתן לנתב ₪6017660) את הקלט אל התוכנית מקובא, ולא מהמקלדת. בפרקיס הבאיס נלמד כיצד לכתוב תוכניות הקוראות ומעבדות קלט מנותב. פרק 6: קליטת נתונים מהמקלדת 83 סיכום בפרק זה הצגנו כיצד משתמשיס בערו הקלט חוס לביצוע קליטת נתוניס מהמקלדת. לפני שנעבור לפרק הבא מומלצ לבחון אס מובניס הנושאיס הבאיסם: / / / חוס הוא ערוצ הקלט בשפת ++6, שמאפשר קליטה של נתוניס מהמקלדת. השימוש בערוץ הקלט חו6 מחייב הגדרת המשתניס להקצאת הנתוניס הנקלטים. כדי להקצות ערכי קלט למשתנה יש להשתמש ב- ח₪ תוך שילוב האופרטור לשליפת הקלט (<<). במשפטי חו6 הקולטים מספר ערכים שוניס יש צורך להפריד בין הערכים על ידי סימניס בלתי נראים (תו-רווח, זססחם, 785). במקרה של אי-התאמה בין סוג הערכים הנקלטים לבין טיפוסי המשתנים שערוצ הקלט חו6 מציב בהס את הערכיס האלה, תהיה שגיאה. בפרק הבא נציג כיצד ניתן להרכיב משפטי תנאי בתוכנית, ונלמד את תחביר הפקודה )ו בשפת ++6. תרגילים כיתבו מחדש את תרגיל 2 מפרק 4, אלא שהפעם אורך צלע הקוביה יוזן כקלט על ידי המשתמש. כיתבו תוכנית הקולטת שלושה משתניס מהמשתמש (מטיפוס 6!טטסס) ומדפיסה אותס ואת הממוצע שלהס על המסך. כמו כן, התוכנית תקלוט שלושה תוויס ותדפיס את השרשור שלהס (משמע, זה אחר זה ברצף). כיתבו תוכנית הקולטת את המספר 74233 אל משתנה מסוג %חו 60חףופחט. הדפיסו את התוצאה והבתינו בחריגה (צוסוזפעס). יש לכתוב תוכנית המקבלת כקלט את המשכורת לשעה של עובד כלשהו, מספר שעות העבודה בחודש, ואת אחוז המס שיש לנכות מהשכר. התוכנית תדפיס את שכר הנטו של העובד. 4 ++6 בקלות הרצח תוכנית על בי הנאים נחזור להגדרה של תוכנית מחשב: רצף של פקודות הקובעות כיצד על המחשב לפעול כדי לבצע משימה מסוימת. ביצוע התוכניות שהצגנו עד כאן התחיל במשפט הראשון והסתייס במשפט האחרון. סביר להניח שבמהלך ביצוע תוכניות מורכבות יותר, נרצה שקבוצה של משפטים תתבצע כאשר תנאי מסויס מתקיים, ואילו קבוצה של משפטים אחריס תתבצע כאשר תנאי זה אינו מתקיים. במיליסם אחרות, נרצה שהתוכנית תדע להתנהג לפי תנאי הסביבה בה היא רצה. בהמשך הפרק נדון בנושאיס הבאיס: % השוואת ערכים כדי לקבוע אס הם גדולים, קטניס או שוויס לערכיס אחרים. > השימוש והתחביר של משפט ‏ בשפת ++6. > ביצוע משפטים פשוטים (510!6) ומורכבים (ס0חטסקח0ס60). > השימוש והתחביר של משפט 6!56-) להרכבת משפטי תנאי, כאשר משפטיס מסוימיס יתבצעו בתשובה חיובית (6טזז) לתנאי ומשפטיס אחריס יתבצעו בתשובה שלילית (8156=) לתנאי. %> שילוב של מספר משפטי 6|56-) לביצוע בדיקות של חלופות שונות לביצוע משימות בתוכנית. % השימוש באופרטוריס בוליאניסם סאג (וגם) ו-08 (או) להרכבת משפטי תנאי מורכבים, כגון: האס המשתמש הו בעל כלב וגם האם הכלב חואו רלמסויו תוכניות היודעות להתנהג על פי תנאי הסביבה מבצעות עיבוד מותנה (6655100סיו [הה0ושוח60). כלומר, ישנה מערכת התנייה מובנית בתוך התוכנית, המפקחת על הפעלה או אי הפעלה של משפטים מסוימים. בשלב זה, מספר הכליס שהצגנו מאפשריס כתיבת תוכניות שימושיות. פרק 7: הרצת תוכנית על פי תנאים | 85 השוואה בין שני ערכים באופן טבעי, תוכניות המבצעות עיבוד מותנה בודקות את הקיוס של תנאים מסוימים. למשל, תוכנית הבודקת אם ציון התלמיד הוא 100; או תוכנית אחרת הבודקת אס עלות המוצר היא מעל 50 שייח. כדי לבצע סוג זה של בדיקות או השוואות, בשפת ++6 משתמשים באופרטורים המוצגים בטבלה 7.1. טבלה 7.1: אופרטורי היחס בשפת ++6 האופרטור הבדיקה דוגמה == שני הערכים שוויס 0 == 56076 =! שני הערכים שונים שוח =! 0!0 > הערך השמאלי גדול מהערך השני 0 < 605% > הערך השמאלי קטן מהערך השני 0, > ץ58|8 =< הערך השמאלי גדול או שווה לערך השני 0 =<006 5%066 => הערך השמאלי קטן או שווה לערך השני 1 => סחָה כאשר משתמשיס בתוכנית באופרטורי היחס כדי להשוות בין שני ערכיס, אפשר לצפות לשתי תוצאות: נכון - 6וש, או לא נכון - 18/56. בכל פקודות \ המוצגות בהמשך הספר נשתמש באופרטורי היחס (5זס+בּ'וסקס |בּחהסו+6!3א). המשפט זו בשפת ++6 מאפשר המשפט )ו לבדוק תנאי מסויס, ולפי התוצאה - לבצע משפט אחד או רצף של משפטים. להלן תבנית משפט ז1: (6טע% 18 תס161סתסס) 15 ; 5086665 במשפט )+ מתבצעת בדיקה של תנאי, תוך שימוש באופרטורי היחס. אס התנאי מתקייס (התשובה תיובית), מבוצע המשפט שבהמשך המשפט ). בתוכנית 1.6 דפחזם שלהלן, מוצג השימוש במשפט ז. התוכנית משווה בין הציון של התלמיד שבמשתנה 50085 דפםד, לבין הערך 90. אם הציון גדול או שווה לערך 90 התוכנית תציג הודעה על המסך, אחרת, התוכנית תסתיים. 6 ++6 בקלות <ת.ת108%2608> 610866ת1+ (16סט) מ1את ה1סע ן 72 = 80026 ₪686 6ת1 (90 =< 80026 ₪686) 15 12 >> "!ב ת8 8606 טסץ ,5ת20628%6018%10ם60" >> סגוסס ו כצפוי, יש בתוכנית שימוש באופרטור גדול או שווה (=<), להשוות בין הציון לבין הערך 90. אס תוצאת ההשוואה היא יינכון'י, התוכנית מבצעת את המשפט שבהמשך המשפט )!. במקרה זה המשפט שנבצע הוא משפט פלט זטסס, המציג הודעה מתאימה על המסך. לעומת זאת, אס תוצאת ההשוואה היא לא נכוןיי, התוכנית לא תבצע את המשפט שבהמשך, ולכן לא תוצג כל הודעה על המסך. כדי להבין טוב יותר את המשפט א, מומלצ להריצ שוב את התוכנית ולשנות את הציון לערך קטן מ- 90. משפטים פשוטים ומשפטים מורכבים השימוש במשפט + גורר ביצוע של משפטים נוספיס בהמשך לבדיקת התנאי. לפעמיס מספיק ביצוע של משפט אחד, אך במקרים רביס יש צורך לבצע מספר משפטים. להלן דוגמה למשפט זו, הכולל ביצוע של משפט בודד. משפט (90 =< 80026 ₪68%) 15 פשוט => ;6061 >> "!2 תה 806 טסץ ,5ת0286018%610םת600" >> סטסס כאשר דרושה הרצת רצף של משפטים לאחר בדיקת התנאי, חייבים לתחוס את קבוצת המשפטיס בתוך סוגריים מסולסליס ( ). להלן דוגמה למשפט א הכולל ביצוע של מספר משפטים. (90 =< 80026 ₪686) 15 משפט ו מורכב-> ;601 >> "!2 ת8 60% טסץ ,5ת18%10ט002828%" >> סטסס 2 סמסמסְ0689 >> " 9885 80026 ₪686 עגמסצ" >> 0006 ו לסיכום, כדי להריצ מספר משפטיס אחרי בדיקת תנאי במשפט ז, חייבים לקבצ את המשפטיס האלה בין סוגריים מסולסלים ( ]. התוכנית 69.פאטספואס6 היא גירסה משופרת של התוכנית הקודמת, ובה מציגיס שתי הודעות פלט לאחר בדיקת הציון, אס הוא גדול או שווה לערך 90. פרק 7: הרצת תוכנית על פי תנאים 87 <ת.ת108%2608> 61086ת1+ (16סט) מ1את 1ס7 ן 2 = 800206 ₪686 6ת1 (90 =< 5002986 6686) 15 ןָ 12 >> "!2 ת8 606 טסץ ,89ת6020828%6018%102" >> סגוסס 2 6>> 850026 60086 >> " 898 80026 ₪686 עטסצ" >> סגוסס ו משפטים פשוטים ומורכבים אוסף המשפטיס המתבצע בעת תשובה חיובית של מפעולת התנייה, יכול להיות פשוט - 60%ו5%8067 6!קוחו5 (משפט אחד), או מורכב - 5000600608 0חטסקוח60 (משפטיס אחדיסם). כאשר התוכנית צריכה לבצע שני משפטים או יותר, המבוססים על התנייה, יש לקב\ את המשפטיס האלה בין סוגרייסם מסולסלים: 15 )806 <= 18( ו‎ 17 >> "!שססט 0 עסכקתס6ת6ע2 טסץ 6עט5 6א%בא" >> סטסס 55 67 5 ופ שו 66 < ה נבושט ₪|ס >>> םושו משפטים שיבוצעו אם התנאי אינו מתקיים בתוכניות הקודמות השתמשנו במשפט ‏ לבדיקת תנאי וביצוע פעולות לפי תוצאת הבדיקה. ואת אומרת, אס התנאי מתקיים (הציון גדול או שווה לערך 90) התוכנית מציגה הודעה מתאימה על המסך. לעומת ואת, אס התנאי אינו מתקיים (הציון קטן מ- 90), התוכנית לא מציגה הודעה על המסך ולמעשה היא מסתיימת. ברוב המקרים נרצה שלאחר ביצוע בדיקת תנאי יבוצע רצף משפטים אם התנאי מתקיים, ורצף אחר של משפטים אם התנאי אינו מתקיים. כדי לבצע משפט אחד או רצף של משפטים כאשר תנאי מסוים אינו מתקיים, צריכיס להשתמש במשפט 656, לפי התבנית הבאח: (6טע% 18 םס161סתסס) 15 ; 5%ת6ת50860 1-6 ; 5%ת6ת560860 8 ++6 בקלות בתוכנית ₪155.69 =1 מפעילים את המשפט + לבדיקת ציון התלמיד. אס הציון גדול או שווה לערך 90 ותנאי הבדיקה מתקיים, התוכנית תציג הודעת ברכה על המסך. לעומת וזאת, אס התנאי אינו מתקיים, התוכנית תציג על מסך הודעה הממליצה לתלמיד להתאמצ יותר לקראת הבחינה הבאה. <ת.ת108%2608> 610866םת1+ (16סט) מ1את ה1סע | 52 = 80006 508% סת1 15 )6686 8002986 <= 90( 12 >> "!2 ת8 606 טסץ ,89ת0828%6018%102ם00" >> סגוסס 6 ;1 >>"!שת1ם סאפם עססעַ8ם אעסח סם 668₪ם טסצ" >> סגגוסס משפטים מורכבים בעקבות משפט 656 כפי שראינו קודס, משתמשים בסוגריים מסולסלים כדי לקבצ מספר משפטים המשמשים למילוי מטרה מסוימת. במשפט 6156 ניתן להשתמש בתכונה זו ולקבוע סדרה של פקודות שיבוצעו במקרה שהתנאי אינו מתקייס. בתוכנית ₪155.62 פאס משולבות קבוצות של משפטיס לאחר משפט ) ולאחר משפט 6!56. <(.ת1056208> 61006ת1+ (ס1סט) מנ1את ב1סטע | 2 = 80026 568% סת1 15 )5658% 80026 <= 90( 127 >> "!2 ת8 606 גטסץ ,989ת6286018%10םת00" >> סטסס 2 %6>> 80026 ₪686 >> "פהש 80026 ₪686 עטסצ" >> 0006 1-6 ;661 >> "!עססע8ת 66אעסש פטהםת 16טסם5 גטסצ" >> ס6גטסס 12 >> " פסת1סק ">> 80026 ₪688 - 100 >> " 15860 טסצ" >> סגוסס פרק 7: הרצת תוכנית על פי תנאים 89 מומלץ להריץ את התוכנית מספר פעמיס ולקבוע מדי פעס ערכיס התחלתיים שוניס למשתנה 50076 65%, וכך לראות את הביצוע כאשר התנאי של משפט 1 מתקייס וכאשר הוא אינו מתקיים. בתוכנית 68156085.099 משתמשים בערוץ הקלט כדי לקלוט את הציון מהמקלדת. בהמשך, התוכנית משווה את הציון לערך 90 ולפי תוצאת ההשוואה היא מציגה על המסך הודעה מתאימה. <ם.ת105%268> 006ו61ם1+ (ס1סט) מנ1את ב1סטע ָ 62 מ685₪ם סת1 ;" נעססתם 688עק 0ם8 80026 ₪896 6ם6 ם1 6סץ71" >> ס6טסס 7 מְ68₪ << ם01 15 )568% 80026 <= 90( 2 >> " !2 ת8 606 גוסץ ,9ת028%018%10ם002" >> סטסס 2 %6>> 800206 ₪686 >> " ₪88 80026 ₪686 עטסצ" >> 0006 6 ;61ת6 >> "!עפע8ת 66אעסש פטהםת 16טסםפ5 גטסצ" >> 6גסס 2 >> " 8סת1סק " >> 80026 6888- 100 >> " 15860 טסצ" >> סגוסס ] לאחר ההידור ניתן להריץ את התוכנית ולהיווכת שהשילוב של משפטי קלט ומשפטי תנאי מעניק לתוכנית עוצמה רבה. הבנת תהליך ההתנייה - 6|56-)ו תוכניות מורכבות בוחנות תנאיס שוניס ובהתאס להתקיימות התנאיס תבצענה קבוצות שונות של משפטיס: אוסף משפטיס אחד אס התנאי מתקייס ואוסף משפטיס אחר, אס התנאי אינו מתקייס. תהליך התנייה אה מתבצע באמצעות משפט 6!86-)ו, כפי שנראה להלן: ( ה ; 5%מ508%006 165 | וכ 0 ++6 בקלות אס התוכנית צריכה לבצע יותר ממשפט אחד כתוצאה מקיום, או אי קיוס התנאי, יש לקבא בסוגריים את קבוצת המשפטים הזו: ו פה | ו סה 055 ; 5ת06ת568%606 6טע> 06ת5600 ופ 155 55 ;558500052 518186 06ת5600 הזחת משפטים לשיפור קריאות תוכנית ניתן לראות בתוכניות שהוצגו בפרק זה שהמשפטיס שלאחר משפטי ), 6156 וסוגר מסולסל שמאלי, כתובים בהזחה ימינה. לעיצוב זה קוראיס הזחה (חסוַ660%6ח1), והוא גורס לכך שהתוכנית תהיה ברורה וקריאה יותר. בנוסף, ההאחה מאפשרת לבחון בקלות את התוכנית ולמקד משפטים שקשורים ביניהם. מבחינת המהדר והשפה אין חשיבות לאופן עריכת התוכנית, אך למתכנת הקורא את התוכנית - בוודאי שכן. להלן דוגמה להזחה: 15 )6686 80026 <= 90( ְ 27 >> "!ב ת8 606 גטסץ ,98ת06286018%10םת00" >> ס6טסס 2 >> 80026 ₪688 >> "פהש 80026 ₪686 עטסצ" >> 0006 ) 1-6 , 12 >> "!עסעהת 60א2סח סטהם 16טסם85 טסצ" >> סגוסס 2 >> " פסת1סס " >> 50026 ₪686 - 100 >> " 18860 גוסצ" >> סגוסס ) פרק 7: הרצת תוכנית על פי תנאים ‏ 91 משפטי תנאי מורכבים משפטי התנאי שהצגנו לפני כן מתייחסיס לבדיקת תנאי אחד. נוכל לחשוב על מצביס שוניס שבהס נרצה לבחון תנאי מורכב, שכולל מספר תנאיס המשולבים וה בזה. לדוגמה, נרצה לבדוק אס התלמיד עונה על שני תנאים: (1) אס הציון שלו במתמטיקה גדול או שווה לערך 90 (2) אס התלמיד מסווג בכיתת המתקדמים. דוגמה אחרת היא, בדיקה אם אדס הוא בעל כלב והאס הכלב הוא דלמטי. לבדיקות אלו ניתן להשתמש באופרטור פא (88₪) - ''וגם'' של שפת ++6. במקריס אחריסם נרצה לערוך בדיקות מסוג אחר, בהס נרצה לברר אס הנבדק עונה על תנאי אחד מבין התנאים המצוינים. כמו, לדוגמה: אס בעל-החייס הוא כלב או אס הוא חתול. לצורך גה ניתן להשתמש באופרטור 0₪ס ([[) - 'או". שני האופרטוריס האלה הס אופרטורים לוגיים (5ז3%0ו26ן0 [1.0163). כאשר משתמשים באופרטורים לוגייס סא4 ו- 08 לבדיקת מספר תנאים, יש לשיס את ביטויי התנאי בתוך סוגרייס כדלקמן: תנאי שלם ((ת8%18ת081 == 800) 866 (86008 8 פתטס ע56ט)) +1 כפי שמוצג לעיל, כל ביטוי שנבדק מוקף בסוגרייס. משפט התנאי המורכב נמצא כולו בתוך סוגריים. כדי לקבל תוצאה ייאמת'יי (006) בבדיקה המשתמשת באופרטור 4% (88), כל התנאים המופיעיס במשפט חייבים להתקיים. אם ביטוי אחד בתוך המשפט אינו מתקלים (אינו *אמתיי), אז התשובה לבדיקה תהיה "לא נכון'' או 'ישקריי (8|56)). למשל, במשפט התנאי ייהאס אדס מסויס הוא בעל כלב וגס האס הכלב הוא מסוג דלמטייי מספיק שהאדם אינו בעל כלב, כדי שהתנאי כולו לא יתקיים. באופן דומה, אס הכלב אינו מסוג דלמטי, לא משנה שאדם הוא בעל כלב - התנאי כולו לא מתקיים. כדי שהתנאי אכן יתקיים, חייב להיות לאדס כלב וגם הזן של הכלב חייב להיות מסוג דלמטי. במשפט הבא משתמשים באופרטור 05 (]]) כדי לקבוע אס האדס הוא בעלים של כלב, או של חתול. ((080 8 פתחס 865ט) || (808 8 פתטס ע86ם)) 15 כדי לקבל תוצאת י'אמת'י בבדיקה המשתמשת באופרטור 08 (||) מספיק שתנאי אחד מתוך התנאים המופיעים במשפט מתקיים. למשל, במשפט הקודם אס האדם הוא בעל כלב, הביטוי יהיה ייאמת'י, ואם הוא בעל חתול בלבד, הביטוי יהיה גם-כן ייאמתי. כמובן, שאס אדס הוא גס בעל כלב וגס בעל חתול, הביטוי גם כן מתקייס. המצב היחיד שהביטוי לא מתקייס הוא אס האדסם אינו בעל כלב ואינו בעל חתול, או במיליס אחרות, אף לא אחד מתנאי המשפט מתקיים. 2 ++6 בקלות ערכים מספריים לתוצאות אמת ושקר שפת ++6 מציגה את הערך הלוגי "*אמת'י בשימוש בכל מספר מלבד 0, ואת הערך הלוגי יישקריי באמצעות 0 בלבד. התייחסות וו של השפה נוחה מאוד לניסוחס הקריא של תוכניות. למשל, 600 8 פחשס ז56 הוא משתנה באמצעותו נאבחן אס אדס הוא בעל כלב או לא. אס אדס אינו בעל כלב ערך המשתנה יהיה 0: 2 = 6006 8 פתחס 68פג אס האדם הוא בעל כלב, ערך המשתנה יהחיה כל מספר השונה מ- 0, לדוגמה - 1: 2 = 0408 8 פתחס ע6פגו התוכנית יכולה להשתמש בערך של המשתנה בתוך משפט התנאי )ו, כמו שנראה כאן: (800 8 פתחס 565ט) 15 אס ערך המשתנה שונה מאפס, תתקבל תוצאת הבדיקה כ-"אמתיי, והתנאי יתקיים. לעומת זאת, אס ערך המשתנה שווה לאפס, תוצאת הבדיקה היא יישקריי, והתנאי אינו מתקיים. כדי לנצל את היכולת של ++6 להציג מצבי ייאמת'י או יישקריי, נביג משפט תנאי אשר שווה למשפט הקודס: (0=! 400 8 פתחס 565ט) 15 בתוכנית ;;02.זג6 506 הפקודה ‏ 0 משתמשת במשתנים 000 8 פחשס זספש ו- 68% 8 פח/שס ז56ט לקביעת סוג בעל החייס שבבעלות האדס. <ת.ת108%268> 61066ת1+ (ס1סט) מ1את 1סע ו 2 = 604 8 פתשס 68פ5ט 6ת1 2 = 086 8 פתשס 68פ5ט 6ת1 (800 8 פתחס 562ט) 15 ;601 >> "02686 826 885סכ" >> סגוסס (080 8 פתחס 562ט) 15 ;1 >> "072680 826 08659" >> סגוסס ((080 8 פתחס 65פט) 66 (008 8 פתטס ע56ט)) 15 12 >> "06ת810 866 םת08 0868 סם8 85סכ" >> סגוסס ((080 8 פתחס 5865ט) || (008 8 פתטס ע586ט)) 15 12 >> "!020860 826 6658ק" >> סגוסס פרק 7: הרצת תוכנית על פי תנאים 93 כדי להבין טוב יותר את המשפט, מומלצ לבצע הרצות חוזרות של התוכנית ולשנות בכל הרצה את ערכי המשתנים. פעס להציב 0 לשני המשתנים, ופעס אחרת להציב 1 לשניהס. אפשר להריצ פעס נוספת כאשר ערכי המשתנים יהיו 0 ו-1 לסירוגין. יש לשיס לב לפשטות התכנות ולקלות ההפעלה של האופרטוריס הלוגייס סא ו- 08 לכתיבת משפט בדיקה של תנאים מורכביס. האופרטור דסא ניתן להתנות ביצוע של פעולה מסוימת בי'אמתיי של תנאי מסויס או ביישקריי שלו. נכונות התנאי לפני הבדיקה של משפט + יכולה להשתנות על ידי האופרטור דסא (!), וכך התנאי של + יקבל משמעות אחרת. לדוגמה, המשפט הבא בודק אס האדס אינו בעל כלב: (800 8 פתחס ₪865 !) 15 ;01ת6 >> "004 8 שטס 10טסם5 טסצ" >> סגוסס תפקיד האופרטור ד0א (לא) הוא להפוך את משמעות התנאי מ-ייאמתיי ל-יישקריי ולהיפך, מ-יישקריי ל-י"*אמתיי. למשל, במידה ואדס אינו בעל כלב, והערך שבמשתנה 909 8 פחשוס ₪56 הוא אפס. כאשר מפעילים על משתנה זה את האופרטור דסא, יהפוך ערך המשתנה מאפס לאחד. במצב גה הערך שייבדק על ידי משפט התנאי יהיה יינכון"י, כי נכוו שהאדס אינו בעל כלב, ולכן המשפט הסמוך לפקודה + מתבצע. המשמעות היא שנכונה העובדה שלאדסם זה אין כלב. על אף המסורבלות לכאורה של ניסוח ּה, הוא מתברר כנוח ובהיר יותר בתוכניות מורכבות. בתוכנית פקס.דסא 55ט מוצג כיצד משתמשים באופרטור דסא : <ת.ת108%2608> 61086םת1+ (סנסט)םנ1הת 16סט ו ;0 = 008 8 פםתחס ₪865 6םת1 12 % 8 פתחס 568ט 6ת1 (800 8 פתחטס ₪865 !) 15 ;061ת6 >> "008 8 צגס 18טסם5 טסצ" >> סגוסס ר (08% 8 פתחטס ₪862 !) 15 ;01ת6 >> "086 8 צגס 10טסם5 טסצ" >> סגוסס ר ו כדי להבין טוב יותר את המשפט ולבחון את תהליך הביצוע של התוכנית, מומלצ לבצע הרצות חוזרות של התוכנית ולשנות את ערכי המשתנים 008 8 פחאוס ₪56 ו- +68 8 חס ]₪56. 4 ++6 בקלות בדיקה של תנאי שלילי (דסא) מורכבת יותר מבחינתנו מאשר בדיקה של הערה תנאי חיובי. עלינו לזכור כי "לא-לא" פירושו "כן". מומלץ לבדוק היטב את 7 התשובה ולנסות עם מספר ערכים שונים כדי להיות בטוחים שהתנאי נכתב כראוי. אופרטורים לוגיים קיימיס משפטי התנייה שבהס התנאי מורכב מחלקים אחדים. דוגמה לכך הוא משפט תנאי של תוכנית, אשר בודקת אס תנאי השכר של עובד מסויס הס לפי שעות, ואס עובד וה עבד מעל 40 שעות בשבוע שחלף. כאשר קיוס תנאי מסויס תלוי בקיוס כל תת-חלקיו (בדוגמה זו - שנייס), יש להשתמש באופרטור סא\ (וגס -‏ 88). כאשר משתמשיס באופרטור סאג צריך להקיף כל תנאי בסוגריים, וגס לקבצ את כל התנאיס יחד בתוך סוגרייס נוספיס, כפי שמוצג בדוגמה זו: ;%ת85856006 ((40 < פעטסם 66צ10קת6) 68 (צץ1מטסם == צ8ק 60010766)) 15 כאשר קיוס משפט התנאי תלוי בקיוס אחד החלקיס בלבד, יש להשתמש באופרטור אס (או - |]) . גס כאן צריך להקיף בסוגרייס כל תנאי וגם להקיף בסוגריים נוספים את כל התנאים. הדוגמה הבאה מדגימה את השימוש באופרטור 08 על ידי בדיקה, אס המשתמש הוא בעליה של מכונית, או בעליו של אופנוע: 558562 ((016צ20ספ6סת == 1016ם6ט) ₪ (ע08 == 1016ם06)) +1 בדוגמאות הקודמות התייחסנו למצב שבו התנאי, או קבוצת התנאים, מתקיימים. כאשר רוצים שהתוכנית תבצע משפט, או קבוצת משפטים, כאשר התנאי אינו מתקייס. לשס כך צריך להשתמש באופרטור השלילה דסא (לא - )6). אופרטור זה הופך תנאי אמת (יימתקייסם'י) לתנאי שקרי (יילא מתקייסיי), ולהיפך. האופרטוריםס סאג, 08 ו- 01 הס אופרטורים לוגייס (5זס0ז9ז6סס |3סוטסו). בדיקת תנאים שונים בתוכניות הקודמות בפרק זה בוצעו פעולות בהתאם לתוצאת הבדיקה הלוגית של תנאי. בחלק מהן בוצעו פעולות כאשר התנאי מתקיים; באחרות בוצעו פעולות מסוימות כאשר התנאי מתקיים, ופעולות אחרות כאשר התנאי אינו מתקיים. קיימיס מצביס בהס מעונייניס לבדוק מספר תנאיס הקשוריס לאותו נושא. למשל, סיווג רמת התלמיד לפי ציון המבחן. תוכנית כוו צריכה לבדוק לדוגמה, אס הציון גדול או שווה לציוניסם שוניס: 60,70,80,90 וכוי. בתוכנית 5.692 50/6854 שלהלן אנו מבצעיס משימה זו על ידי שימוש במספר משפטי 1-6156. פרק 7: הרצת תוכנית על פי תנאים 95 <ת.ת108%2608> 61086ת1+ (16סט) מ1את 1סע ָ 2 0מ₪68 סת1 "ו ;" :ע66םא 688ע2 6ת8 80026 ₪686 עגטסץ םב 6סץ?7" >> סגוסס 2 6860 << ת01 15 )₪686 80026 <= 90( 12 >> "!ב ת8 606 טסצ" >> סגוסס 6186 15 )6686 80026 <= 80( 12 >> "!2 8 606 טסצ" >> שגוסס 6186 15 )6686 80026 <= 70( ;01 >> "0 8 8606 טסצ" >> סגוסס 6186 15 )6686 80026 <= 60( ;601 >> "כ 8 85ח 62806 עטסצ" >> סגוסס 6 12 >> "656% פת% 581166 טסצ" >> 0006 ו הפקודה הראשונה בתוכנית בודקת אס הציון גדול או שווה לערך 90. אס התנאי מתקיים, התוכנית מציגה על המסך הודעה מתאימה. לעומת ואת, אס התנאי אינו מתקיים, המשפט "...ו 6!56" שבהמשך מבצע בדיקה אם הציון גדול או שווה לערך 80. כאשר התנאי מתקיים התוכנית מציגה על המסך הודעה מתאימה. אס התנאי אינו מתקיים, התוכנית בודקת שוב את הציון לפי ערך נמוך יותר. תהליך הבדיקה חוזר על עצמו עד לסיוס הבדיקות של הערכים הרצויים. משפט ח%6ועש5 כפי שלמדנו, על ידי שילוב של סדרת משפטי 6156-+! ניתן לבדוק משפטי תנאי מרוביס. בתוכנית הקודמת שימשו אותנו משפטי 656- בקביעת תחוס הערכים שבו נמצא ציון המבחן. במקריס בהס צריך לבדוק שוויון לערכיס מסוימים, משתמשיס במשפטי 5/6 (מיתוג). כאשר משתמשיס במשפט חססווו5, יש לציין ביטוי ולאחריו אפשרות אחת או יותר, שהתוכנית תוכל לבדוק ולראות אס הן מתאימות לביטוי. התוכנית הבאה, קק.סדנ/5, מדגימה שימוש במשפט חסווש5 שבעזרתו היא מציגה הודעה אשר מתבססת על הציון של הסטודנט. 6 ++6 בקלות <ת.ת108%2608> 61086ת1+ (ס1סט) ת1את ה1סט ו ;'פע' = 62806 כהתס ] (42806) ב160ש5 ;601 >> "ב פטסץ תס 8ם8286018610םסס" >> סטסס :'ת' 0886 268%; ;01ת6 >> "0% 18 2 8 ,080 6סא" >> 6טסס :'פ' 0886 268% ; 12 >> "62806ט8 צץ1תס 826 0'8" >> סטסס :'0' 0856 ;268% ;[0ת6 >> "51216ע₪62 6ע82 פ'כ" >> ס6טסס :'כ' 08986 ;268% 12 >> "וְעסעהם צ5600 !00565א6 סא" >> סטסס ‏ :0618016 268% ; משפט ח6וואו\5 מורכב משני חלקים : % משפט התנאי שבא אחרי המילה ח0סזו/5. > המקרים אשר עשויים לקייס את משפט התנאי. כשתוכנית נתקלת במשפט חספואו5, היא מעריכה את התנאי, ולאחר מכן מחפשת (לפי הסדר) את המקרה, אשר ערכו והה לערך התנאי. כשנמצא ערך כזה, התוכנית מריצה את אוסף המשפטים המתאים לו. לדוגמה, בתוכנית זו, המקרה של הערך '8' מתאים לערך התנאי, ולכן מוצגת ההודעה "אס 15 8 8 ,580 +0סא". משפט +/06/80 הוא מקרה ברירת-המחדל, אשר מתאים לכל ערך שאינו ברשימת הערכים. על כן, המשפטים שאחריו מתבצעיס רק כאשר כל המקרים הקודמים אינס מתאימים לערך התנאי. שיקל ש! כאשר משתמשים במשפט חססטוצו5, צריך לכלול בו משפטי 68%זט לאחר כל משפט 6856. כאשר התוכנית מוצאת מקרה מתאים מאלה שמוצגים במשפט חסצו5, היא מחשיבה גם את כל המקרים הבאים אחריו כמתאימים, וכתוצאה - היא תבצע את המשפטים הנלווים להם. המושג גלישה מתאר מצב זה וכדי שהתוכנית תבצע רק את המשפטים המתאימים למקרה הראשון שעונה על התנאי, צריך להשתמש במשפט א68זט. משפט 6א6זם מציין לתוכנית להפסיק את פעולת משפט 50 ולעבור למשפט הבא אחריו. בדוגמה שלנו, התוכנית תבצע את המשפט שלאחר "פ' 6856" בלבד, ותסיים. אם תסיר את משפטי 68%6זפ מהתוכנית, היא תדפיס במקרה זה גם את המשפטים האחרים, עד לסוף משפט ח60ו//5. פרק 7: הרצת תוכנית על פי תנאים | 97 סיכום בפרק זה הצגנו כיצד משתמשיס במשפט ו וכיצד מרכיבים משפטי תנאי מורכביס בתוכנית. כפי שלמדת, התוכנית שלך יכולה להשתמש במשפט ), כדי לבצע קבוצת משפטים אחת כאשר התנאי מתמלא (006), ונשתמש במשפט 6!56, כדי לפרט משפטים שהתוכנית תבצע כאשר התנאי אינו מתמלא (8/56)). בפרק 8 נלמד כיצד מבצעים משפטי תוכנית באופן מחזורי מספר פעמים רצוי, או עד אשר תנאי מסויס מתמלא. לדוגמה, תוכל לחזור 100 פעמים על קבוצת משפטים כדי לסכם ציוניס של 100 סטודנטיס, או עד שמקבליס למשל, ערך שלילי בקלט. לפני שנעבור לפרק הבא, נבחן אס מובניס הנושאיס הבאיס : / / 0% בשפת ++6 אופרטורי היחס מאפשרים השוואה בין שני ערכים; אם שני ערכים שוויסם, או לא שווים, אס ערך אחד גדול או קטן מהשני. המשפט ‏ מאפשר התניית ביצוע פעולות בהתאס להגדרות של מחבר התוכנית. המשפט 6158 מאפשר ביצוע פקודות אחרות אחרי 1, בהתאם להגדרת מחבר התוכנית. בשפת ++6 כל ערך שאינו אפס מייצג את הביטוי יינכוןיי. לעומת זאת, ערך אפס מייצג את הביטוי יילא נכון'י. האופרטוריס הלוגיים פאג (88) ו- מס (||) מאפשריס להרכיב משפטי תנאי מורכבים, המבצעים בדיקה של מספר תנאים באותו המשפט. האופרטור הלוגי דסא (!) מאפשר בדיקה ישירה של תנאים מהסוג ילא נכון". במקרים בהס צריך לבדוק שוויון בין תנאי מסויס לבין אוסף ערכיס מסוימים, משתמשים במשפט ח6פוא54. כאשר התוכנית מוצאת מקרה המתאיס לאחד התנאים שבמשפט ח66ואו5, היא מחשיבה גם את כל המקרים הבאים אחריו כמתאימים. משפט 686ז0 מצייו לתוכנית להפסיק את פעולת משפט ח6ו/ש5 ולעבור למשפט הבא אחריו. תרגילים 1 כיתבו תוכנית המקבלת כקלט שלושה מספרים. אם כולס שוויס, יש להדפיס: 1 826 פעססמתגמת 11ב אחרת, יש להדפיס: 1 ססם 826 פע6סתטת 656ם7 8 ++6 בקלות כיתבו תוכנית הקולטת מספר. אם ערכו גדול מ- 500 או קטן מהמספר 500-, התוכנית מדפיסה 'א', אחרת היא מדפיסה 'ט'. כיתבו תוכנית המקבלת שני משתנים בוליאניס, בשמות א ו-+, ומחשבת את הפונקציה 08א. הפונקציה 08א מוגדרת באופן הבא : אסא א 55 | =טמך =טמך ד סד 5 | ד 5 | סד 5 | 5 | 5 | ערך 0 שקול לערך 55 1=, וכל ערך פרט לאפס, שקול לערך =(\חד. הערה : חישוב הפונקציה יתבצע על ידי משפט . כיתבו תוכנית הקולטת שני מספריס ותו המייצג פעולה חשבונית (+, -, *, /. התוכנית תדפיס את תוצאת הפעולה החשבונית בין שני המספרים. פרק 7: הרצת תוכנית על פי תנאים 99 לולאות בפרק הקודס הצגנו כיצד להשתמש במשפטים 6156- כדי לגרוס שהתוכנית תבצע פעולות מסוימות לפי תנאים שוניס. באותו הקשר, ניתן לצפות שתוכנית תבצע פעולות שונות מספר פעמים, עד למילוי תנאיסם מסוימיס. בפרק וה נלמד כיצד לגרוס שהתוכנית תבצע משפט אחד או קבוצה של משפטים עד למילוי תנאי מסויס. בהמשך הפרק נדון בנושאיס הבאים : %> משפט זס) לביצוע חוזר של קבוצת משפטים מספר פעמים, הנקבע על ידי המתכנת. % משפט 6!וחאו לביצוע חוזר של קבוצת משפטים מספר פעמים, עד אשר מתמלא תנאי ידוע. %> משפט סווחצו-00 לביצוע של קבוצת משפטים לפחות פעסם אחת, עס אפשרות ביצוע חוזר שלהס עד אשר מתמלא תנאי ידוע. היכולת לביצוע חוזר של קבוצת משפטים היא אחת התכונות המעניקה לשפות התכנות עוצמה רבה. נסביר ואת על ידי ניתוח של התוכניות המוצגות בהמשך. 0 ++6 בקלות ביצוע חוזר של משפט בודד מספר פעמים קבוע ביצוע חוז₪ר של משפט אחד, או של מספר משפטים, היא אחת הפעולות הנפוצות בתוכניות מחשב. לדוגמה, תוכנית המשתמשת באותה סדרת משפטים כדי להדפיס חמישה עותקיס של קוב מסוים. דוגמה אחרת היא קטע תוכנית שחוזר על עצמו, כדי לחשב את הערך הנוכחי של תיק השקעות, הכולל 30 מניות סחירות בבורסה. בשפת ++6, המשפט 0+ מאפשר לבצע קבוצה של משפטים מספר פעמים קבוע מראש. המשפט זס+ הקרוי גס לולאת 10 (קסס! 0)) נעּר במשתנה מוגדר בלולאה ומתעדכן לפי התקדמות ביצוע הלולאה. זהו יימונה הלולאה'י, שמאחסן את המספר הסידורי של ביצוע הלולאה. לדוגמה, בלולאת זס+ הבאה, המשתנה %ט0ס6 הוא משתנה העזר של הלולאה. הערך שלו משתנה לפי התקדמות הביצוע של הלולאה. במקרה זה הלולאה תתבצע 10 פעמים: (++%תטסס ;10 => סתטסס ;1 = >תטסס) 02ס+ ; 5086065 בלולאת זס+ ארבעה רכיביס. תפקידס של שלושת הרכיביס הראשוניס הוא לנהל ולפקח על ביצוע הלולאה. הרכיב הראשון קובע ערך התחלתי למשתנה, בדוגמה: 1=+חטסס. ברכיב זה משתמשיס פעס אחת בכניסה ללולאה. הרכיב השני משמש לבדיקת התנאי לביצוע המשפט הכתוב אחרי רכיבי הלולאה, בדוגמה התנאי הוא: 20 => %חטסס. אס התנאי אינו מתקיים, הלולאה תסתיים והתוכנית תבצע את המשפט שאחרי הלולאה. אס התנאי מתקיים התוכנית תבצע את המשפט הכלול בלולאה ותשתמש ברכיב הרביעי של הלולאה כדי לשנות את הערך של המשתנה הפנימי של הלולאה. בדוגמה זו מקדמים את ערך המשתנה %חטסס באחד על ידי המשפט ++)חט0ס6. השלב הבא בתוכנית הוא הבדיקה החוזרת של הרכיב השני , תנאי עצירת הלולאה. על פי התוצאה של הבדיקה הזו הלולאה תמשיך לרוץ, או תעצור. (++%תטסס ;10 => 6תטסס ;1 = סתגסס) 108 קידום משתנה הלולאה - | התנאי = | ערך התחלתי - 1 בתוכנית 08.625*ד9185 להלן, מתואר השימוש במשפט זס). התוכנית מציגה על המסך את המספרים מ- 1 ועד 100. <םת.ת1085%208> 61006ת1+ (ס1סט) מ1את 1סע ָ ;%תטסס 6ם1 (++%תמטט0ס60 ;100 => סתטסס ;1 = %תטסס) 108 ;' ' >> סתטסס >> 0006 פרק 8: לולאות ‏ 101 בתחילת הביצוע של לולאת זסז ניתן ערך התחלתי 1 למשתנה +חטסס. בהמשך מתבצעת בדיקת התנאי לעצירת הלולאה: אס הערך של המשתנה )חטסס6 קטן, או שווה לערך 0. כאשר התנאי מתקיים, מתבצע המשפט הכלול במשפט התנאי של הלולאה ואילו הערך של המשתנה 60% מקודם באחד. בשלב הבא נבדק קיוס התנאי והפעולות חוזרות על עצמן עד אשר התנאי הנבדק על ידי הרכיב השני אינו מתקייס והלולאה מסתיימת. כדי להבין טוב יותר את המשפט, מומל לבצע הרצות חוזרות של התוכנית ולשנות כל פעס את הערך שבתנאי העצירה של הלולאה: 10, 20 ואפילו 500. בתוכנית ;69.זאט60א85 שיפרנו במעט את התוכנית הקודמת. בתחילת ביצוע התוכנית המשתמש מתבקש להזין את הערך לסיום הלולאה. בהמשך, התוכנית תציג על המסך את המספרים המתחילים ב- 1 ומסתיימיס בערך הרצוי. <ת.ת108%2608> 61086םת1+ (16סט) מ1את ב1סע \ ;+תטסס 6ם1 2 שִת81ם6 6ת1 ;" :עפסת₪ 2698989 0םת8 6טמ81ט 8ם01ם6 6ם6 ם1 6סץ71" >> סגוסס ;ו1אט סַם01ת6 << ם1ס (++%תטסס ;78106 6שם01ם6 => סתטסס ;1 = 6תטסס) 1058 ק' ' >> סתטסס >> סטסס ] מומלץ להריצ את התוכנית ולהזין ערכיס שונים כגון 10, 1 ואפילו 0. במקרה שנזין את הערך 0, או ערך שלילי כלשהו, הלולאה לא תתבצע מכיון שבתחילת הביצוע התנאי | חחו0ח6 => %חטסס איננו מתקיים, וא הלולאה מסתיימת מייד. לולאת זס: לביצוע חוזר של קבוצת משפטים בפרק 7 למדנו שבפקודות 0-656 המבצעות סדרה של משפטיס שוניס הקשוריס לתוצאות בדיקות התנאי, יש צורך לקבץ את המשפטיס האלה בתוך סוגרייס מסולסליסם ( ). אותה דרישה קיימת גם בקשר ללולאה זסו. בתוכנית הבאה 100.07 1פסא מוצג על המסך בכל סיבוב של הלולאה המספר התורן וסכום של כל המספריס שהוצגו לפניו (זוהי דוגמה, ועל כן אל תחפשו משמעות רבה לפעולה זו). 12 ++6 בקלות <ת.ת108%2608> 61086ת1+ (16סט) מ1את ה1סע ;%תטסס 6ם1 2 = 50681 ס6ם1 (++%תטטס60 ;100 => סתטסס ;1 = %תטסס) 108 12 >> " 0ם " >> סתטסס >> " סתנ1נססת" >> סגוסס ;סמטסס + 0081 = 60681 27 %6>> 0081 >> " 1618585ץ " >> סגוסס ו הקבצת המשפטיס הקשורים ביניהס מאפשרת לבצע סדרת פעולות בכל סיבוב, או איטרציה (ח1%679+10) של הלולאה. שינוי בקצב קידום הלולאה בתוכניות הקודמות בפרק זה הצגנו לולאות שקצב הקידוס של משתנה העזר המפקת על הקידוס הינו ב-1. עלינו לדעת שלולאת זס! מאפשרת קידוס של משתנה העזר שלה בכל ערך שהוא. לדוגמה, בתוכנית 95ס.5פעז] צ8 מוצגיס המספרים שבין 0 ל- 100 בקפיצות של 5. <ת.ת108%20608> 610866ת1+ (16סט) מ1את ב1ס7 | ;%תטסס 6ם1 (5 =+ 600% ;100 => סתטסס ;0 = סתטסס) 10% ;' ' >> סתטסס >> 0006 ] לאחר הידור והרצת התוכנית יוצגו על המסך המספרים 10,5,0 וכך הלאה עד 100. יש לשיס לב להרכב משפט הקידוס של משתנה העזר בלולאה: ;5 =+ סת00סס לעיתיס רוציס לשנות ערך של משתנה (הוספה, למשל) ואחר כך לתת למשתנה את הערך החדש שהתקבל. בשפת ++6 קיימות שתי דרכים לעשות זאת. להלן דוגמה לדרך הראשונה. בדוגמה זו אנו מוסיפים 5 לערך הנוכחי של המשתנה %ח600 : 2 + סתטסס = סמתטסס דרך שנייה, קצרה יותר, לבצע את אותה פעולה: += 52‏ %תגטסס פרק 8: לולאות 103 הדרך השנייה היא הנפוצה בשימוש בלולאות בתוכניות כתובות בשפת ++6, מכיון שהיא קצרה יותר וקלה יותר לכתיבה. ניתן לשנות את הערך של המשתנה הפנימי של הלולאה גס כלפי מטה ולקבוע את הרכיב הרביעי עס אופרטור הפחתה, ואף לתת לו ערכיס שליליים. בתוכנית 699.א/שספ זא6 מוצגיס על המסך המספרים מ- 100 ועד 1, בסדר הפוך. <ת.ת108%2608> 61086םת1+ (16סט) מ1את ב1סע ָ ;%תטסס 6ם1 (--%ת60%0 ;1 =< סתטסס ;100 = סתטסס) 10% ק' ' >> סתטסס >> סטסס במקרה זה, הערך ההתחלתי של המשתנה הוא 100 ובכל סיבוב בלולאה ערך משתנה העזר יורד ב- 1. כאשר הערך מגיע ל- 0, מסתיים ביצוע הלולאה. הישמר מפני לולאות אינסופיות לולאת זס1 (קסס! זס)) הינה אחד הכלים שבאמצעותס התוכנית יכולה לחזור מספר פעמים רצוי על קבוצת משפטים מוגדרת. משתנה בקרה מונה את מספר החזרות אשר הלולאה ביצעה. כשהתוכנית מגיעה לתנאי הסיוס של הלולאה, היא מפסיקה לחזור על המשפטים הכלוליס בלולאה, ועוברת למשפט הבא אחרי לולאת זס?. לולאות אינסופיות (פקסס! 86וח8ח1) נוצרות בשל טעות בתוכנית, שבעקבותיו תנאי הסיוס של הלולאה לעולס אינו מתקייס. כתוצאה מכך, הלולאה אינה מפסיקה לחזור על ביצוע המשפטים הכלוליס בה, עד אשר עוצרים ייבכוח'יי את התוכנית. לולאת זסז הבאה היא דוגמה ללולאה אינסופית : ( ו ו סט 0 100 >> שש ק 0( = 6₪) | 2608 5588 // המשתנה %חטסס הוא משתנה הבקרה של הלולאה, אך הלולאה סופרת את מספר הפעמים שהיא מתבצעת באמצעות משתנה אחר (ס!סהוזפּע פחסזצו). על כן, ערכו של המשתנה %חטסס לעולס לא יהיה גדול או שווה ל- 100. המשמעות היא שהלולאה תהיה אינסופית. אפשר להיחלצ ממנה רק על ידי הפסקת התוכנית במכוון. חשוב לציין, כי לולאות זס אינן מוגבלות לשימוש במשתנה מטיפוס 6חו כמשתנה בקרה. 4 ++6 בקלות התוכנית הבאה, 1009/8.655, מדגימה שימוש במשתנה בקרה מטיפוס 6031 להצגת אותיות האלף-בית בלולאה אחת, ושימוש במשתנה בקרה מטיפוס 808% - להצגת מספרי נקודה צפה בלולאה שנייה: <ת.ת108%2608> 61086ת1+ (16סט) מ1את ה1סע \ ;150672 עהםס ;סגו1פט 11086 (+18₪%%0624 ; '2' => 18%60% ;'ת' = ע1₪866) 505 7 >>> 00060 ;01ת6 >> 0006 (0.1 =+ 6ט81ט ;1.0 => 6ט1הט ;0.0 = 6גמ1הט) 02ס+ ק' ' >> 6מ1הט >> 0006 000% >> 601; לאחר הידור והרצת התוכנית יופיע על המסך הפלט הבא : 4 צאאטט ד 035 טאאא הסעמ ספת 0 002 37 04-09-0065 708 0 0 ביצוע לולאה מספר פעמים נתון אחת הפעולות השכיחות בתוכנית היא חזרה על משפט אחד או יותר, מספר פעמיס רצוי. משפט 0+ של ++6 מאפשר לתוכנית לעשות זאת. משפט זס+ משתמש במשתנה בקרה ששולט על מספר הפעמיס של ביצוע הפקודות. תבנית כללית של משפט זסן) היא: (%תמ008ת028םת1 ;588% ;ת1%181128%10ם1) 5 ל ו ו כאשר הלולאה מתחילה, היא מקצה ערך התחלתי למשתנה הבקרה. אחר כך התוכנית בודקת את תנאי הלולאה. אס התנאי מתקייס (06), התוכנית מבצעת את המשפט הכלול בלולאה. אחר כך התוכנית מקדמת את משתנה הבקרה בערך של ה-)חסוחסזסחו (במקרה שלנו - 1) וחוזרת לבדוק את התנאי. אס התנאי מתקיים, היא חוזרת על התהליך. אס התנאי אינו מתקייס (8156)), לולאת זס1 מסתיימת והתוכנית ממשיכה בביצוע המשפט הראשון שאחרי משפט זסז. פרק 8: לולאות 105 הלולאה 6ווחש הלולאה זס]1 מאפשרת לבצע הרצה חוזרת של משפט, או קבוצה של משפטיס מספר ידוע של פעמים. ישנס מקריס בהס צריך להריצ משפט או קבוצה של משפטים כל עוד מתקיים תנאי מסוים, ללא קביעה מראש של מספר הסיבובים או האיטרציות. למשל, תוכנית הקוראת קובצ (בפרקיס מתקדמיס יותר נראה כיצד לטפל במידע מאוחסן בקוב), ומבצעת פעולה כל עוד לא נקלט התו המציין את סוף הקובף, ולא על פי מספר מוגדר וידוע של פעמים. בשפת ++6 מבצעיםס משימה זו על ידי משפט פווחצו. תבנית כללית שלו מוצגת להלן: (%206 18 ם61610ם0סס) 16נ1םח ; 5%מ06ת00 568 תהליך ביצוע הלולאה מתחיל בבדיקת תנאי הלולאה. כאשר התנאי מתקיים, התוכנית מבצעת את המשפט, או את קבוצת המשפטיס שבתוך הלולאה. אחרי ביצוע המשפטים הכלוליס בתוך הלולאה נבדק קיוס התנאי בשנית. אם התנאי עדיין מתקיים - המשפטים הכלולים בלולאה יבוצעו שוב וחוזר חלילה. רק כאשר התנאי שמציבה הלולאה לא מתקיים, התוכנית ניגשת לביצוע המשפט הבא שמחו ללולאה. התוכנית הבאה 9ק6.אץ ז6"5 מנחה את המשתמש להקיש על האות ץצ לתשובה חיובית, או על האות א\ לתשובה שלילית. לולאת 6!וחאו שבתוכנית מבצעת קליטה של אותיות בודדות מהמקלדת, עד לקבלת האותיות צ או א. <ת.ת108%2608> 866ט610םת1+ (16סט) מ1את ב1סע \ ששססבס 18 א מס צ תסשתט שטעםס 0סם 886// 2 = 806 6ם1 ;1007 עַהתס (6תס8 !) 16נ1תחט ָ ;" :6טםת1פתסס 60 עפסת₪ 568598ק 6₪ם8 א עס צ פסץ7"ת\" >> סטסס 7 << ם01 (('ץ' == ע168₪6) || ('צ' == ע168₪62)) 15 2 = 6₪ת40 (('ם' == 16₪₪6%2) || ('א' == ע16886)) 15 6186 2 = 006 16 עס+ 2611 8068%62'8 6ם6 תוס5 // ק'ה\' >> 0006 1₪6בַָהטםת1 // ] 12 6%6>> 160008 >> " ₪88 660קץעץ₪ גמסץ 166662 6ם7" >> סגוסס ו 6 ++6 בקלות בתוכנית זו ניתן להבתין כי הלולאה 6!וחצ\ מבצעת מספר משפטים בכל סיבוב. משפטיס אלה מקובצים, כנדרש, בתוך סוגרייסם מסולסלים ( ). במקרה זה, הלולאה 6וחצו נעזרת במשתנה עזר 6ח00. כל עוד אין המשתמש מקיש על האות צ (או ץ) או על האות א (או ח), הלולאה ממשיכה להתבצע. כאשר אחת מהאותיות האלו מתקבלת, התוכנית הופכת את ערך המשתנה לייאמתיי והלולאה מסתיימת. לרוב, הלולאה 6!וח/ע מופיעה בתוכניות המטפלות בקבצים. ביצוע לולאה עד אשר תנאי מסוים מתקיים כשכותבים תוכניות מורכבות, צריך לפעמיס לבצע קבוצת משפטים עד אשר תנאי מסויס מתקיים. לדוגמה, תוכנית המחשבת את משכורותיהס של כל העובדיס בחברה מסוימת תבצע את הלולאה כל עוד נותר עובד שאת נתוניו צריך לעבד. משפט סווח/צ משמש, בדרך כלל, כדי לחזור על קבוצת משפטיס עד אשר תנאי מסויס מתקיים: (תס61%1םת60)" 16ותשט ו כאשר תוכנית מגיעה למשפט 6ווח/ו היא בוחנת את התנאי ומעריכה אס הוא מתקיים. אס התנאי מתקיים (6ט/0), התוכנית מבצעת את משפטי הלולאה. לאחר ביצוע המשפט האחרון בגוף הלולאה, התוכנית בוחנת שוב אס תנאי הלולאה מתקיים, ואס כן, היא מבצעת שוב את משפטי גוף הלולאה. כך היא עושה שוב ושוב, עד שתנאי הלולאה אינו מתקייס (8156)). במקרה זה התוכנית מפסיקה לבצע את משפטי הלולאה וממשיכה אל המשפט הבא אחרי משפט סווחצו. שגרה של ביצוע משפט פעם ראשונה ללא תנאי: שווחעש-60 כפי שלמדנו, בשפת ++6 מאפשרת הלולאה פווחאו\ לבצע משפט או קבוצת משפטים, עד למילוי תנאי מסויס. בתחילת הלולאה, נבדק קיומו של תנאי. אס התנאי מתקיים, הלולאה מתבצעת. אס התנאי לא מתקיים, הלולאה לעולס לא תתבצע. ישנס מקריס בהס נצטרך להכין תוכנית שלפי המשימות המוטלות עליה, יש לבצע במהלכה משפט או קבוצה של משפטיס לפחות פעס אחת ללא בדיקת קיוס תנאי כלשהו - אבל לאחר מכן להתנות את ביצוע המשפטים האלה בקיוס תנאי מוגדר מראש. למשימות אלו ניתן להשתמש בלולאה 6ווחצו-80, אשר התבנית הכללית שלה ניתנת להלן: + 00 ; 000668 568 ; (%206 18 םס61נ1נסתסס) 116תש ן[ פרק 8: לולאות 107 הלולאה 6ווחאו-60 מתחילה בביצוע המשפטים שבתוך הלולאה. בסיומס, התוכנית בודקת את תנאי הלולאה. אס התנאי מתקיים, התוכנית תחזור לתחילת הלולאה ותבצע את המשפטים שוב. 4+ 60 ; %8ת6ת508%0 ; (%206 18 םס61נ1נסתסס) 116תש [ אס התנאי אינו מתקיים, התוכנית לא תחזור לתחילת הלולאה ותמשיך את ביצוע המשפט הראשון שלאחר הלולאה. שימוש נפוצץ בלולאה 6וחצו-60 הוא לשס הצגת תפריטי התוכנית. התוכנית מציגה לפחות פעם אחת את התפריט. במידה והמשתמש בוחר בכל אפשרות מלבד סיום 19ש0), התוכנית תבצע את הפעולה המתבקשת ושוב תציג את התפריט. אס המשתמש בוחר באפשרות סיום, הלולאה מסתיימת והתוכנית מבצעת את המשפט הראשון שמחוצ ללולאה. חזרה על משפטים כל עוד תנאי מסוים מתקיים כתלות בדרישות התוכנית שלך, ייתכנו מקריס בהס לאחר ביצוע מספר משפטים, לפחות פעס אחת, התוכנית תחזור עליהס כל עוד תנאי מסויס מתקיים. במקרה כוה יש להשתמש במשפט סווח/ש-00. ₪6 155 5 6 66 5 הקל - ( כאשר תוכנית מגיעה למשפט 6ו01ש-00 היא מבצעת מייד את המשפטים הכלולים בגוף הלולאה. לאחר הביצוע, התוכנית בוחנת את קיוס תנאי הלולאה. אס התנאי מתקייס (6ט0), היא חוזרת ומבצעת את משפטי הלולאה. אס התנאי שקרי (8156), כלומר - אינו מתקייס, התוכנית מפסיקה לבצע את משפטי הלולאה וממשיכה אל המשפט הבא אחרי משפט 6!וחצו-00. 8 ++6 בקלות סיכום תהליך איטרטיבי/סיבובי (0ח7066551ק 6/ע19678%1) מתבטא ביכולת של התוכנית לחזור על ביצוע של משפט אחד או על קבוצת משפטים. כפי שלמדת, משפט 107 מאפשר לתוכנית לחזור על משפט אחד או יותר מספר פעמים רצוי. משפט 6!וחש מאפשר לחזור על קבוצת משפטיס כל עוד תנאי מסויס מתקיים. ולבסוף, משפט 16וחש-60 מאפשר לתוכנית לבצע קבוצת משפטים פעס אחת לפחות, וגס לחזור עליהם כל עוד התנאי מתקיים. לפני שנעבור לפרק הבא, נבחן אס מובניס הנושאיס הבאים : / / / / הלולאה 10 בשפת ++6 מאפשרת ביצוע חוזר של משפט או של קבוצת משפטיס מספר פעמים קבוע. בלולאה זס+ ארבעה רכיבים: ערך התחלתי, תנאי הלולאה, המשפט או קבוצת המשפטים של הלולאה, ופקודה לקידוס של משתנה העזר. הלולאה זס! אינה מחייבת קידוס משתנה העור בערך 1 בלבד, או קידום של משתנה העזר בערכים חיוביים בלבד. הלולאה 8!וחאו בשפת ++6 מאפשרת ביצוע חוזר של משפט, או של קבוצת משפטים, כל עוד תנאי הלולאה מתקיים. תוכניות המטפלות בקבציס משתמשות, בדרך-כלל, בלולאה 6ווחאו, מאחר ובאמצעותה ניתן לקרוא את התוכן של הקוב עד לזיהוי סימן סוף-קוב\. הלולאה 116חש-00 מאפשרת לבצע משפט או קבוצת משפטים לפחות פעס אחת, עס אפשרות של חזרה על ביצוע המשפט או קבוצת המשפטים. תוכניות משתמשות, בדרך כלל, בלולאה 6ווחאו-60 כדי לעבוד עס תפריטיס. בשלוש הלולאות: זס), 6\וחצו ו- 6וחאו-60 אי קיוס תנאי הלולאה גורס לסיוס הביצוע של הלולאה, והמשך התוכנית במשפט הראשון שמופיע אחריה. בפרק הבא נציג כיצד לחלק תוכנית ארוכה למספר יחידות קטנות ויעילות הנקראות פונקציות (5חסוס6חטת). פרק 8: לולאות 109 תרגילים 110 כיתבו תוכנית המקבלת כקלט מספר חיובי ומדפיסה למסך את כל המספריס מ-0 עד למספר זה. כיתבו תוכנית המקבלת כקלט מספר חיובי, בדומה לתרגיל הקודם, ומדפיסה את כל המספרים הזוגיים בין 0 למספר זה, כשהס מופרדים בכוכביות. כיתבו תוכנית המדפיסה את לוח הכפל של הספרות 1 עד 10 בצורת טבלה. יש להשתמש בשתי פקודות זס) מקוננות. יש לכתוב תוכנית המקבלת מספר א, ומדפיסה משולש בעל א שורות מהצורה הבאה. לדוגמה, עבור ערך 5=א נקבל: * *** **<**<* * * א * א * א א*א*<**<***** כיתבו תוכנית המחשבת ממוצע ציוניס של מספר לא מוגבל של תלמידים. התוכנית תקלוט ציונים כל עוד המשתמש לא הזין את הציון 1-. כאשר מתקבל הציון 1-, התוכנית תדפיס את הממוצע ותסיים. כיתבו תוכנית המקבלת כקלט שני מספרים ומדפיסה את כל טווח המספרים בין המספר הגדול לקטן, בסדר יורד. יש להשתמש בפקודה 8ווחאו לביצוע הלולאה. כיתבו תוכנית המבקשת מהמשתמש להזין מספר שאינו שלילי, ובודקת אם המספר הוא מספר ראשוני (אשר מתחלק רק בעצמו וב-1). ++6 בקלות חלק 2 העוינלועו בבונקציורו לבניית הוכניות ככל שהתוכנית הופכת ארוכה ומורכבת, גדל הצורך לחלק אותה ליחידות קטנות יעילות, המעניקות שליטה ומאפשרות תחזוקה קלה. יחידות אלו נקראות פונקציות וכל אחת מבצעת משימה מסוימת. למשל, בתוכנית המטפלת בהנהלת חשבונות ניתן להגדיר פונקציות (5חסופס6חשת). כל אחת מהן מבצעת משימה מסוימת, כמו לדוגמה, קבלת כספים, תשלומים, שכר עבודה וכדי. על ידי טיפול פרטני בפונקציה הבודדת מקליס על תהליך פיתוח התוכנית השלמה, ומאפשריס להבין את מרכיביה ולשלוט בהס טוב יותר. בנוסף, ניתן לשלב את הפונקציה כיחידה שלמה, גס בתוכניות אחרות, וכך לקצר את זמני הפיתוח של תוכניות חדשות. חלק זה כולל את הפרקים הבאים: פרק 9 - הפונקציות פרק 10 - שינוי ערכי פרמטרים פרק 11 - יתרונות ספריית ההרצה פרק 15 - העמסת פונקציות ם ם ם ב פרק 12 - משתניס מקומייס וטווח הכרתם ם כ פרק 14 - המשתנה המיוחס בשפת ++6 ם פרק 15 - קביעת ערכי ברירת-מחדל לפרמטריס 11 2 ++6 בקלות הטונקציות ככל שהתוכנית נעשית ארוכה ומורכבת גדל הצורך לחלק אותה ליחידות קטנות יעילות המאפשרות הקלה בתחזוקה של התוכנית. כל יחידה כזו נקראת פונקציה (חסוש6חטת) ותפקידה לבצע משימה מוגדרת. תוכנית קוראת (681!5) לפונקציה כאשר נדרש הביצוע של משימה מסוימת במהלך התוכנית. בזמן הקריאה לפונקציה, התוכנית מוסרת לה את הערכיס הדרושים לה לביצוע המשימה. בפרק זה נלמד כיצד ליצור פונקציות בשפת ++6, כיצד להשתמש בהן ונדון בנושאיס הבאים: > פונקציה (חסזשחט=) היא קבוצת משפטים המבצעים יחדיו מטלה מסוימת. > קריאה לפונקציה נעשית על ידי כתיבת שמה ואחריו סוגריים, כמו למשל ()660פ. > בסיוס פעולתה, יכולה פונקציה להחזיר ערך מטיפוס מסוים, כמו למשל זחו או + התוכנית יכולה לבחון ערך זה (בפקודה +, למשל), או להקצות אותו למשתנה. > הפרמטריס (האקטואלייס) שהתוכנית מעבירה לפונקציה (למשל, שם עובד, גיל, או שכר) מקובציס בסוגריים שנכתביס לאחר שם הפונקציה. % אב טיפוס של פונקציה (6קשסטסז] חסטסחטת) משמש להגדרת טיפוס הערך (למעשה, סוג המשתנה) שהפונקציה מחזירה, ואת טיפוסי הפרמטרים שהתוכנית מעבירה לפונקציה. השימוש בפונקציות חיוני בתהליך כתיבת תוכניות. בשפת ++6 קל מאוד ליצור ולהשתמש בפונקציות. פרק 9: הפונקציות | 113 היצירה והשימוש בפונקציה הראשונה בתוך תוכנית מסוימת, כל פונקציה צריכה לבצע משימה אחת בלבד. כאשר נוצר מצב שפונקציה מבצעת יותר ממשימה אחת, כדאי מאוד לחלק אותה למספר פונקציות קטנות לפי מספר המשימות המוגדרות בה. בדומה להגדרת משתנים, גס שס פונקציה בתוכנית אחת חייב להיות ייחודי. בנוסף, מומלצ ששס הפונקציה ישקף את הפעולה שהיא מבצעת. לדוגמה, בטבלה 9.1 ניתנת רשימה של פונקציות, ודי במבט חטוף בשמות אלה, כדי לדעת אילו משימות הן מבצעות. טבלה 9.1: דוגמאות של שמות בעלי משמעות לפונקציה. שם הפונקציה משימה 65 ְ05% >חוזכ | הדפסת ציוני בחינה. 36 366000%5 | תהליך תשלומים בהנהלת חשבונות. שוח ז50 066 | קבלת שס משתמש. חח 006 6חוזס | הדפסת מסמך מסויסם. אחז 6 0ס6חן 68]60!3%6 | חישוב התשלוס למס ההכנסה. המבנה הכללי של הפונקציה דומה למבנה התוכנית הראשית חוג8חח המופיעה בכל התוכניות המוצגות בספר. הנה תבנית כללית של פונקציה: (118% מססְסתַהת8ק)סתהם מתס61סםט?| 6קץ6 םעט66ע2 ָ 2 8218016ט 508660668 ; כעת נשווה בין המבנה הכללי של הפונקציה לבין מבנה הפונקציה חופח : (108סט)מתנ1הת ב1סע (115% מְסססתַה82)סתהת 6קץ6 ןָ ָ ;מטסס סת1 2 18016עהט (++%ת80ט10;00>%ת0;000=%ם02)000+ ]; 8 6 ם60\6 568 ק' ' >> סתטסס >> סטסס 4 ++6 בקלות למעשה, התוכנית הראשית מתנהגת כפונקציה לכל דבר. משימת הפונקציה 6 שוסח5 היא להציג הודעה על המסך. (10סט) 655800 טסם8 16סע ן ;1 >> "+07 צס 32680060 ם66ס 6ט'1 ,6110" >> סגטסס ו פירוש המילה 6וסע, שבתחילת שס הפונקציה, הוא כפי שהצגנו בפרק 2: הפונקציה אינה מחזירה ערך לאחר סיוס הפעולות שהיא מבצעת. לעומת זאת, משמעות המילה 6, כאשר היא בתוך סוגריים, היא שהפונקציה אינה מקבלת ערכיס מוקדמים (כאשר היא נקראת במהלך ביצוע התוכנית). הפונקציה 655806 שוסח5, משולבת בתוכנית 86.659וי שסח5 שלהלן: <ת.ת108%2608> 86ט610םת1+ (10סט) 655890 שטסם8 16סע | ;1 >> "+01 צס 2690060 םפסכ פט'1 ,6110" >> סטסס (ס1סט) מ1את 1סטע \ ;1 >> "תסנ1ססתט+? 6ם6 0811 סם פטססת" >> סגוסס ; () 655806 אסם5 12 >> "תסנפסתט1 פת6 תסל1 286%" >> 0006 ו כאמור, ביצוע תוכנית בשפת ++6 מתחיל בפונקציה חואח. בתוכה ניתן להבחין במשפט הקורא לפונקציה 655806 אוסח5: ; () 655806 חסם5 הסוגריים שבהמשך שס הפונקציה מסמנים למהדר ++6 שהתוכנית דורשת בשלב וה לקרוא לפונקציה זו. בהמשך הפרק נלמד שבתוך סוגריים אלה ניתן לשלב פרמטריס להעברת מידע לפונקציה. לאחר הידור והרצה, התוכנית תציג על המסך את השורות הבאות : <ע6סתע> ₪56 8808 <\:0 מסנססתט+ 6ם6 0811 סם סגטססת ++6 צס 28500060 ם66ס 6ט'1 ,6110ת תסנ%סתט+ 66 תסע+ 280% לאחר שהתוכנית פוגשת במשפט קריאה לפונקציה, היא ניגשת לביצוע של המשפטים שבתוך הפונקציה. בסיומם, היא מחזירה את הפיקוד לפונקציה הקוראת, ומבצעת את המשפט הבא לאחר משפט הקריאה לפונקציה. פרק 9: הפונקציות | 115 <ת.ת108%2608> 866ט610ם1+ (10סט) 655800 טסם5 16סט *-- ן ;801 >> "++60 צסע 2880000 מ8פסס פט'1 ,6110ם" >> סוסס ו (ס1סט) מ1את 1%סע \ 2 >> "םסבססתט1 6ם6 0811 60 פטססת" >> סגסס ; () 655806 שסםפ 4 ;01ת6 >> "תסנססתט1 שת6 תסע+ 286%" >> 0006 ו התוכנית 565.09 סשד משתמשת בשתי פונקציות 006 שוסח5 ו- 5ח6550! צוסח5 להצגת שתי הודעות על המסך. <ת.ת108%208> 610866םת1+ (10סט)61616 טסם8 16סעט ו ;01ת6 >> "++0 צס 2650060 :200%" >> סוסס ו (0010)ם16850 טסם8 16סע ן ;01ת >> "פתסנססתגת ם16א 5682660 0ת265802:06%%1" >> סטסס ו (10סט) ת81ת 18סע ו ;()61%616 אסם5 ; () ם16550 חאסם5 ו בתחילה, התוכנית קוראת לפונקציה 006 אוסח5 המציגה את ההודעה על מסך באמצעות הפקודה %ש60. מייד עם סיום הפונקציה ₪06 אוסח5 התוכנית קוראת לפונקציה ח6550! אוסח5, אשר באותה דרך מציגה גם היא הודעה על המסך. כאשר הפונקציה ₪06 שסח5 מסתיימת, גם התוכנית מסתיימת, מכיון שאחרי הקריאה לפונקציה זו אין משפטים נוספיס לביצוע התוכנית הראשית חופוח. הפונקציות שראינו בפרק וה מבצעות מטלות פשוטות מאד, כך שלמעשה, לא היה לתוכנית צורך אמיתי בפונקציות אלו כדי לבצע את המטלות הכלולות בה. מטרת השימוש בפונקציות בפרק זה היא להראות כיצד מגדירים פונקציה וכיצד קוראים לה (מפעילים אותה). פונקציות מסייעות בפישוט תוכניות גדולות ומורכבות על ידי חלוקת התוכנית לחלקיס קטנים, פשוטים, חד משמעייס וקליס לשימוש. פונקציות כוללות שורות קוד מעטות בדרך כלל והינן קלות להבנה ולשינוי. אפשר ליצור ספריה (אוסף) 6 ++6 בקלות של פונקציות שנוהגיס להשתמש בהן בתוכניות שונות, וכך לחסוך את זמן הכתיבה והניפוי שלהן שוב ושוב עבור כל תוכנית. כלומר, אפשר להשתמש שוב ושוב בקוד שכבר נכתב, ולא להמציא מחדש את הגלגל... עוצמתה של שפת ++6 (כמו גס של שפת 6) נובעת במידה רבה מספריות הפונקציות הנלוות לה ומהיכולת שלה לנצל אותן בדרך יעילה לפיתוח תוכניות מורכבות, ועס ואת - פשוטות לתחזוקה. הקריאה לפונקציה התוכנית מבצעת את משפטי הפונקציה על ידי קריאה לפונקציה (חסטסחט1 8 פַחזו|68) ועל כן מכניס אותה גס בשס התוכנית הקוראת (וחפזפסזכן פַחו|ו63). כדי לקרוא לפונקציה יש לשלב בתוכנית משפט הכולל את שס הפונקציה וסוגריים, כמו בדוגמה ה 5 5 6 ( כאשר דרושה העברת מידע לפונקציה, כותבים את הפרמטרים המעבירים את המידע בתוך הסוגריים, ומפרידיס ביניהס בפסיקים. לאחר סיוס ביצוע הפונקציה, התוכנית מבצעת את המשפט הראשון הסמוך למשפט הקריאה לפונקציה. העברת מידע לפונקציות בשפת ++6 ניתן להגביר את יכולת הפונקציה על ידי פרמטריס (מידע) שמעביריס אליה מהתוכנית הקוראת. לכל אחד מהפרמטרים המועברים לפונקציה צריך לציין את הטיפוס שלו, כגון +חו, או 808%. לדוגמה, בפונקציה זסטוחטח צוסח5 מוגדר פרמטר מטיפוס זחו. (08106 6ת1)ע6סחגוםת חסםפ5 18סט 2 6%>> 6ט810ט >> " 15 8106ט פ5'עסססתַהַע82ק 6ם7" >> סגוסס בעת הקריאה לפונקציה, ניתן להעביר אליה בדרך זו את הערך הרצוי: ; (1001) ע6כתגום טסם5 ערך שמועבר לפונקציה פרק 9: הפונקציות | 117 שפת ++6 ממירה את הפרמטר פ6טו8/ בערך המועבר במשפט הקריאה לפונקציה, כפי שמוצג כאן: ; (1001) עסמחום שסם5 (6ט81ט סת1) ע6קחגות חסם5 18סט ָ 1 >> 78106 >>" 18 6ט7810 פ5'עסססתהעהק 6ם06>>"7ט00 ] כך מתרגם המהדר את ההעברה לפונקציה: (78106)1001 שטסם8 16סט / 2+ 185 6ט810ט 2'8ע6662ת828ק 6ם6>>"7גו00 ו בתוכנית 695.\₪א4אפפפ5ט משתמשיס בפונקציה זסטוחטח אוסח5 מספר פעמים, כאשר בכל פעס מועבר אליה ערך אחר. <ת.ת108%208> 606ט1סת1+ (08106 6ת1)ע6מחתגוםת חסםפ5 18סט ָ 2 6%>> 6ט810ט >> " 15 6ט810ט פ5'עסססתַהע82ק 6ם7" >> סגוסס (10סט) תנאת 18סע ו ; (1) ע6סתגום אסם5 ; (1001) עס6סחגום שסם5 ; (532-) עס6מחגום שסם5 לאחר הידור והרצת התוכנית נקבל על המסך את השורות הבאות: <6%ס6תם> אתתתקמפס <\:6 1 15 6מו1אט 828(6%62'85ק 6מך 1 פ18%5 6ט1אט 5'מסססתַה2הק 6םמך 2 185 6ט810ט 6662'58ת828ס 6םמך ניתן לראות כי כל פעס שהפונקציה נקראת, מועבר למשתנה 6טוא8צ הערך הנכון. אס ננסה להעביר לפונקציה ערך מטיפוס שונה מהטיפוס המוגדר לפרמטר, המהדר יציג הודעת שגיאה. לדוגמה, נקבל הודעת שגיאה אס נעביר ערך מטיפוס 808% לפרמטר מטיפוס זחו. ברוב המקרים מועבריס מספר ערכים לפונקציה מסוימת. לכל פרמטר מועבר יש צורך להגדיר בפונקציה שס וטיפוס משתנה. 8 ++6 בקלות לדוגמה, בתוכנית 8165411.692 הפונקציה ₪6!6ו| 0ח3 פופ שוסח5 מציגה על המסך את הערך הגדול ואת הערך הקטן שבין שלושת הערכיס שמועברים אליה. <ת.ת108%2608> 866ט610םת1+ (ס %ת1 ,ם %ת1 ,8 6ם116616)1 ת8 ס1ס חסםפ בנ1סט ו 2 = 80811 6ת1 7 = 016 6ם1 (46< ₪ 17 ;ספ = 16ס (19 < 0) 1% 7 = 16ס (1נ5081 > 6₪) +1 80811 = 2 >> 16 >> " 18 8106ט 0108656 6ם7" >> סגוסס 12 >> 80811 >> " 18 68ט1א8ט 811686ת5 6ם7" >> סטסס (0ס1סט) תנאת ה1סט | ;(3 ,2 ,116616)1 בִם8 ס1ס חאסם5 ;(500- ,0 ,116616)500 ִם8 סַ1ס חאסם5 ; (1001 ,1001 ,116116)1001 בִם8 סַ1ס חסם5 כאשר התוכנית קוראת לפונקציה, הערכיס מועבריס כך: ,2 ,116016)1 0םת8 016 חסםפ5 5 ז 0 5 . 8 -ך 1 ;(0 %ם1 ,0 6ם1 ,8 6םת116616)1 6ם8 ס1ס חסם8 18סט פרק 9: הפונקציות 119 לאחר הידור והרצת התוכנית יופיע הפלט הבא על המסך: <עססת₪> מתא105ם <\:0 3 18 8106ט 0180656 6םמך 1 18 8106ט 50811656 6םמך 0 18 6ג810ט 01806656 6םמך7 0 18 78106 508116586 6םמך7 1 1898 8106ט 01806656 6םמך 1 18% 6ג81ט 50811656 6םך התוכנית 695.פוא5 ששסא5₪ משתמשת בפונקציה 66עס!קוח6 שוסח5 כדי להציג על המסך את הגיל (פרמטר מטיפוס %חו) ואת המשכורת (פרמטר מטיפוס 08%) של העובד. <ת.ת108%2608> 61086ת1+ (צ858182 51086 ,806 סת1) 6010766 טסם8 בנ1סע ו ;061ת8>> "010 8ע682ץ ">> 806>> " 18 6107686 6ם7">>סגוסס 2 >> 88182 >> "9 %68את צְס1סת םל" >>06ו00 (16סט) מ1את ב1ס7 ן ; (25000.00 ,010766)32ת6 טסם5 ו ניתן לראות שבפונקציה 66ץס!מוח6 אוסח5 מוגדריס הפרמטרים מטיפוס זחו ומטיפוס 8% בהתאם לדרישה. העברת פרמטר לפונקציה שמות הפרמטרים המוגדריס בפונקציות חייבים להיות ייחודיים. לכל אחד מהסם יש לקבוע טיפוס. בעת הקריאה לפונקציה, שפת ++6 משבצת לפרמטריס את הערכיס המופיעים בתוך הסוגרייס של משפט הקריאה לפונקציה. שיבוצ הערכיס מתבצע לפי הסדר, משמאל לימין. 0 ++6 בקלות החזרת ערכים מפונקציה הפונקציה מבצעת משימה מסוימת במסגרת התוכנית, וברוב המקרים ווחי משימת חישוב, אשר תוצאותיה מוחזריס לפונקציה הקוראת. על כן, צריך להגדיר את טיפוס הערך המוחזר על ידי הפונקציה. כדי לבצע זאת, די בציון טיפוס הערך המוחזר לפני שס הפונקציה. לדוגמה, הפונקציה הבאה 8|065\ 800 מקבלת שני פרמטרים מטיפוס )חו, מחברת אותס, ומחזירה את התוצאה שגם היא מטיפוס זחו. (ע %ת1 ,8 %6ת81068)1ט 88606 6ת1 ָ %2 סמסם1 ;ם + 8 = 269016 ; (268111%) םשגו26% במקרה זה, הציון +חו מופיע לפני שס הפונקציה ומגדיר את טיפוס הערך המוחזר על ידי הפונקציה. משפט חזטשס6ז מיועד להחזרת הערך מהפונקציה. הוא גורס להחזרת הערך מהפונקציה, מסיים את ביצוע הפונקציה ומעביר את השליטה לתוכנית הקוראת. את הערך המוחזר ניתן לאחסן במשתנים המוגדריס בתוכנית, כדלקמן: 268016 = 860 781065)1 , 2( ; במשפט הקודס התוכנית משבצת למשתנה בשם ]8508 את הערך המוחזר על ידי הפונקציה 81065 8300. בצורה דומה ניתן להציג על המסך את הערך המוחזר על ידי הפונקציה, תוך שימוש במשפט זטסס. להלן דוגמה: 2 >> (81068)500,501ט 800 >>" 18 68מ1א8ט 05 מתט5 " >>6006 היישוס הקודס של הפונקציה פסטַ1ה\ 800 מורכב משלושה משפטים. לפנינו יישוס חדש ומקוצר של אותה הפונקציה, שבו מנצליס את תכונותיו של משפט חז0ש6ז. בדרך זו אנו ממחישיס ומסביריס את מהות הפונקציה: (ע %ת1 ,8 %6ת81068)1ט 88606 6םת1 ו ; (כ+8) מו26% פרק 9: הפונקציות ‏ 121 בתוכנית הבאה 692.פט וגטפפא השתמשנו בפונקציה 0815 300 לחיבור מספריס שוניס: <ת.ת108%2608> 61086ת1+ (ע %ת1 ,8 %6ת81068)1ט 88606 6ת1 ן ; (כ+8) םעו26% ] (16סט) מ1את ב1סע ן 2 >> (1068)100,200הט 80606 >> -" = 200 + 100" >> סטסס 2 >> (81068)500,501ט0 8006 >> " = 501 + 500" >> סטסס 2 >> (1 ,1-)810608ט 800 >> " = 1 + 1-" >> סטסס ] הפונקציה מחזירה ערך לפי הגדרתה. הפונקציה הקודמת מחזירה ערך מטיפוס זחו. לעומתה, הפונקציה הבאה 8|]06/ 867806 מחזירה את הערך הממוצע של שני מספרים מטיפוס 6חו. לרוב, ערך זה יהיה שבר מתמטי כדוגמת המספר 3.5 (מספר שאינו שלס)). (ע %6ת1 ,8 6ת6)1ט1הט 80602806 11086 ן ; (2.0 / (ס + 8))םעג6ס6ץ ו במקרה זה, הציון 808% שלפני שס הפונקציה מגדיר את טיפוס הערך המוחזר על ידה. פונקציות שאינן מחזירות ערך טיפוס הערך המוחזר על ידי פונקציה (למשל, ₪086 ח! או זפּח6) נכתב לפני שס הפונקציה. כאשר כותביסם את המילה שוסע לפני שסם הפונקציה, פירוש הדבר שהפונקציה אינה מחזירה ערך. כדי להחזיר ערך, הפונקציה משתמשת במשפט חזטססיז, אשר משמעותו היא: הפסקת ביצוע הפונקציה והחורת הערך אל התוכנית הקוראת לפונקציה (שיכולה גם היא להיות פונקציה). במקרה בו טיפוס הפונקציה הוא וסע, משפט חזטס6ז אינו מחזיר ערך כלשהו, אלא רק מסיים את פעולת הפונקציה. כאשר משפט חזנ6ז אינו מחזיר ערך, הוא נכתב כך: ; ת%ע6608ע2 בדוגמה הצו, הפונקציה היתה מטיפוס סוסט ועל כן, משפט חזנ6ז אינו עושה דבר, אלא רק מסיים את ביצוע הפונקציה. בפונקציה מטיפוס סוסט אין צורך ב- ;חזש6ז אלא אס מחליטים לסיים את הפונקציה בשלב כלשהו, לפני הסוף שלה. 2 ++6 בקלות אם בפונקציה כתובים משפטי תוכנית לאחר משפטי חזש6ז, הם לא הערה יבוצעו, מכיון שמשפט חזושפז גורם לסיום הפונקציה וחזרה אל התוכנית 7 הקוראת. התוכנית הקוראת ממשיכה בביצוע המשפטים שמייד לאחר משפט הקריאה לפונקציה. פונקציות מחזירות ערך כאשר מציביס לפני שס הפונקציה את המילה שזסט, הפונקציה אינה מחזירה ערך. לעומת זאת, פונקציות המחזירות ערך חייבות לקבל את טיפוס הערך שהן מחזירות, על פי הטיפוס שרשוס לפני שס הפונקציה. כדי להחזיר את הערך צריך להשתמש במשפט ח0פז. כאשר התוכנית מזהה את משפט חחזטש6ז, הפונקציה עצמה מסתיימת, ומחזירה את הערך המוגדר לפונקציה הקוראת. שימוש בערך המוחזר על ידי פונקציה תוכנית יכולה להשתמש בערך המוחזר על ידי פונקציה באופניס שונים. התוכנית, או הפונקציה הקוראת (681!60 6חז), יכולה להקצות למשתנה את הערך שקיבלה מהפונקציה (הערך המוחזר). היא עושה את בעזרת משפט השמה, כפי שנראה להלן: ; (צ2ע5818 ,פעטסת ,0210766ת6) 011סע7ץ8ק = >תטסתה8 11ספצ8ס המשפט הבא מציג שימוש נוסף בערך המוחזר על ידי פונקציה. לדוגמה, המשפט הבא מציג את הערך המוחזר באמצעות המשפט זש60 : ;61 >> (581827 ,פמגוסת ,766ץ60010) 011ס2ץ8ק >> "66הת 601066 6ם7" >> סגטסס ניתן להשתמש בערך המוחזר על ידי פונקציה בתוך משפט תנאי, למשל: (500.00 > (7ץ88182 ,פעגוסםת ,766ץ10סת11)6ַסעעצְ8ק) 15 ;1 >> "28156 8 6608ם 10766קת6 18םך7" >> סגוסס הצהרת הפונקציה כדי שהתוכנית תוכל לקרוא לפונקציה, מהדר שפת ++6 צריך לוזהות מראש בוודאות את טיפוס הערך המוחזר על ידי הפונקציה. בנוסף, הוא צריך לדעת את מספר הפרמטרים שהפונקציה משתמשת בהם ואת הטיפוס שלהם. בתוכניות שהצגנו בפרק זה, הגדרת הפונקציה שהפעלנו נמצאת באותו קוב מקור, ותמיד לפני משפט הקריאה לפונקציה. במקריס רביס פונקציות יכולות להופיע במקומות שוניס בקובצ המקור (קובצ התוכנית), וגס מקובל מאוד שפונקציה אחת קוראת לפונקציה אחרת. פרק 9: הפונקציות | 123 כדי להבטיח שהמהדר ++6 ידע את פרטי הפונקציות השונות שמופעלות בתוכנית, צריך לכתוב בתתילת קוב המקור של התוכנית את הצהרת הפונקציה (ח166!373%10 הס וס6תשת), או כפי שמכנים זאת לעתים: אב-טיפוס של הפונקציה (0%0%/265] הספס6הטשת). ככלל, הצהרת הפונקציה מספקת מידע אודות טיפוט הנתון המוחזר מהפונקציה (26ץ+ ₪ז6%0א) ואודות הפרמטריס שלה. המשפטים להלן מציגיס הצהרות של פונקציה עבור מספר פונקציות המשמשות אותנו בפרק זה. ; (10סט) 655806 שסם8 16סע ; (%ת1) עסמתטת שסם8 16סע ; (5108% ,%ת1) 60010766 חסםתפ בנ1סט ; (סת1 ,%6ת1068)1אט 8006 6ת1 ;(6ת1 ,%ת106)1ה8ט 8062806 11086 ניתן לראות שבכל אב-טיפוס מצויניס טיפוס הערך המוחזר על ידי הפונקציה ומספר וטיפוס הפרמטריס הכלולים בה. ס6סץע מעגססת ;(6ת1 ,%ת6)1ט10ה8ט 8062806 11086 8 עמססַסתַהעבק בתוכניות שבהן קוראיס לפונקציה שהמהדר לא ויהה את ההצהרה שלה, או את הגדרתה, תופיע הודעה על שגיאת תתביר. ניתן לראות שבקבצי כותר של התוכניות בשפת ++6 כתובות ההצהרות של הפונקציות שבשימוש של התוכניות. בתוכנית 6 סאק שלהלן מוצג השימוש בהצהרות הפונקציות. <ת.ת105%208> 006ו61ת1+ 86 מסנבססמםטע// ;(6ם1 ,סםת1) 6ו1אט 8762806 11086 (ס1סט) מ1את 1סע ן >> " 18 2 6₪ם8 2000 01 80762806 6ם7" >> סגוסס 2 >> (2 ,78106)2000 8762806 (ע %6ת1 ,8 6ת6)1ט10הט 80602806 11086 ו ;(2.0 / (ס + 8))םעגם26 4 ++6 בקלות בתוכנית זו, הקריאה לפונקציה 8106/ 8/67806 מופיעה לפני ההגדרה שלה. לכן יש צורך להציב את הצהרת הפונקציה לפני התוכנית-הראשית חו8ח, שבה מתבצעת הקריאה לפונקציה. היעדר הצהרת הפונקציה גורס לשגיאת תחביר בשלב ההידור. אב טיפוס של פונקציה יכול לסייע לך אב הטיפוס של פונקציה (606/06סז חסטסחטת) מציין למהדר את טיפוס הערך המותחזר על ידי הפונקציה, ואת מספר וטיפוסי הפרמטרים שהפונקציה מקבלת. בזמן ההידור המהדר מוודא (בעזרת אב הטיפוס המתאיס) שאין טעות בשימוש בערך המותחזר על ידי פונקציה (למשל, שלא הוקצה למשתנה מטיפוס 6חו ערך של פונקציה המחזירה טיפוס 080ו=), וכי מועבריס לפונקציה מספר נכון של פרמטריס מטיפוסים מתאימים. מהדרים ישנים לא ביצעו את הבדיקות הללו, אך מהדרים חדישיס מבצעים אותן, וכך הס מקלים רבות על המתכנת בגילוי שגיאות בקוד שכתב. סיכום בפרק וה למדנו כיצד משתמשים בפונקציות בשפת ++6. מכיון שהפרק הקיף חומר רב, ייתכן שתפיק תועלת בנסיונות עס תוכניות הדוגמה. לפני שנעבור לפרק הבא מומלצ לבחון אס מובניס הנושאיס האלה: * ככל שהתוכנית נהפכת לארוכה ומורכבת גדל הצורך לחלק אותה ליחידות קטנות ונוחות לטיפול - אלו הן הפונקציות. * לכל פונקציה חייב להיות שם ייחודי. * הפונקציות מתוכננות להחציר ערך לפונקציה הקוראת. הן מקבלות את המידע הדרוש להן באמצעות הפרמטרים של הפונקציה. * בפונקציות המחזירות ערך חייבים לציין לפני שס הפונקציה את טיפוס הערך המוחזר על ידן (כמו זבּח6 ,זחו). לעומתן, בפונקציות שאינן מחזירות ערך יש לציין 6 לפני שס הפונקציה. * בפונקציות המקבלות פרמטרים יש להגדיר לכל פרמטר שם ייחודי וטיפוס הפרמטר. לעומתן, בפונקציות שאינן מקבלות פרמטרים יש לציין וסט בסוגרייס שלאחר שם הפונקציה. * מהדר שפת ++6 חייב לזהות את טיפוס הערך המוחזר, את המספר וטיפוס הפרמטרים של הפונקציות המשרתים את התוכנית. כאשר הגדרת הפונקציה מופיעה בסוף קובץ המקור לאחר משפט הקריאה אליה, חייבים לכתוב בתחילת קובץ המקור הצהרה של הפונקציה. בפרק הבא נראה כיצד לשנות את ערכי הפרמטרים המועברים לפונקציות. פרק 9: הפונקציות | 125 תרגילים 16 כיתבו פונקציה המקבלת ערך מטיפוס 080ו₪, בשם שחוזכ סז וחטח, וערך מטיפוס :חן 60ת8ופחט, בשס ₪65 0% פח, ומדפיסה את זחוזס %0 וחטח, פסחט 0% סח פעמים. כיתבו פונקציה אשר מקבלת ערך מטיפוס 08%, ומחזירה את הריבוע שלו. השתמשו בפונקציה כדי לחשב את הריבועים של 7, 3.4, 311.3-, 4 . כיתבו שתי פונקציות חווח ו- אא8וח. הפונקציה א8חז מקבלת שני ערכים מטיפוס 0% ומחזירה את הגדול מביניהס. הפונקציה חווח מחזירה את הקטן מביניהם. כיתבו פונקציה אשר מקבלת שני ערכים, א ו-ץ, מטיפוס 008% ומחזירה את 3ץ+3א. כיתבו גם פונקציית עזר 6006 המחזירה את החוקה השלישית של מספר נתון. כיתבו מחדש את תרגיל 6 בפרק 8 והשתמשו בפונקציות חוחח ו-א8ח. שימו לב להערת האזהרה שמייצר המהדר כתוצאה מהצורך להסב ערך מטיפוס זחו לטיפוס 8% שנו את הגדרת חווז ו-א8ח כדי שלא תתקבלנה הודעות אזהרה. ++6 בקלות שינוי ערכי ברמטרים בפרק הקודס למדנו כיצד ניתן לחלק את התוכנית ליחידות קטנות ויעילות לתחזוקת התוכנית, הנקראות פונקציות. כפי שלמדנו, התוכנית יכולה להעביר מידע (פרמטרים) לפונקציות. בדוגמאות שבפרק 9 התוכניות השתמשו או הציגו פרמטריס מבלי לשנות את ערכיהם. בפרק זה נלמד כיצד לשנות את ערך הפרמטריס בתוך הפונקציה. לשינוי ערך של פרמטר בתוך הפונקציה נדרשים מספר צעדיס אותם נציג בהמשך. בפרק זה נדון בנושאיס הבאיס: > שינוי ערך של פרמטר פורמלי של פונקציה יכול להתבצע אך ורק אס הפרמטר מועבר כמצביע (זססחוסק), או כמשתנה ייחוס (6סהההע 6066ז0010). %> כתובת הפרמטר בזיכרון חייבת להיות ידועה לפונקציה, כדי שזו תוכל לשנות את ערכו. > כתובת הזיכרון של משתנה נקבעת באמצעות האופרטור כתובת של (8). > האופרטור מצביע לכתובת בזיכרון (*), מאפשר לקבוע מהו הערך המאוחסן בכתובת זיכרון נתונה. % כאשר התוכנית מטילה על פונקציה לשנות ערך של פרמטר שלה, היא מעבירה לה את כתובת הפרמטר בזיכרון המחשב. שינוי ערך של פרמטר בתוך פונקציה הינו תהליך מקובל מאוד. על כן, ראוי לתרגל את דרך הביצוע באמצעות התוכניות שבפרק זה, כדי להגיע לרמת מיומנות גבוהה. פרק 10: שינוי ערכי פרמטרים 127 מדוע בדרך כלל לא ניתן לשנות את ערכי הפרמטרים בתוך הפונקציה? התוכנית הבאה, 65.695אגה6סא, מעבירה שני פרמטרים לפונקציה 5סטופע ץבוספו. שמות הפרמטרים הם 8ום ו- ||8ח5. בפונקציה פסטוּע שְ0150!3 מתבצעת השמה של הערך 1001 לשני הפרמטריס האלה. ואחר כך הפונקציה מציגה את ערכס על המסך. התוכנית מציגה שוב את ערך הפרמטריס על המסך, לאחר סיוס ביצוע הפונקציה. <ת.ת108%2608> 61086םת1+ (פ %ם1 ,8 6ם685)1ט1הט צ415018 בנסע | 8 5 112 112 >> 8 >> " 6ע8 81068ט 3180187 מנם1%ט 081068 6ם7" >> סטסס ; [0ת8 >> ₪ >> " בסםתה " (ס1סט) מ1את 1סע ן 72 = 50811 ,2002 = 016 %ם1 >> " שםת8 " >> 16 >> " תסנססתט1 65026 68ט1הט" >> סטסס ;[0ת6 >> 811ת5 ; (50811 ,81065)0100ט צץ415018 >> " בת8 " >> 16 >> " תסנססתט1 85062 68ט1הט" >> סטסס 12 >> 511 לאחר הידור והרצת התוכנית, תוצגנה על המסך השורות הבאות: <צססתם> מסאתםס6סא<\:0 0 8ת8 2002 ם0ס61סםג? 6ע6502ע 781065 1 ש6תה8 1001 826 781008 צ615018 םתנם1%ש 81065ט 6םך 0 6ת8 2002 מתסנססמט1 ע8166% 81065 בפלט של התוכנית נוכל לראות תופעה מעניינת: בפלט של הפונקציה 65טוּע עְ8!ספו0, ערכי שני הפרמטרים עודכנו ל-1001. אבל לאחר סיוס הפונקציה, התוכנית מדפיסה את ערכי הפרמטריס פופ ו- |(3וח5, המקוריים כפי שהס מופיעים ב-חופח, ללא שינוי. כדי להבין את התופעה, בה שינוי ערך הפרמטרים אינו משפיע על הערכים המקורייס של המשתניס 518 ו- ||5₪08 בפונקציה חופוח, צריך להתבונן היטב במנגנון העברת הפרמטריס לפונקציה בשפת ++6. 8 ++6 בקלות המהדר מעתיק את ערכי הפרמטריס אל הפונקציה. הערך המועתק מאוחסן זמנית במקוס בזיכרון הנקרא מחסנית (א5%86%). הפונקציה משתמשת בערכים המועתקיס שבמחסנית לפעולות שהיא מבצעת בתוכה. כאשר הפונקציה מסתיימת, המהדר מוחק את תכולת המחסנית, ואיתה את כל השינוייס שהפונקציה ביצעה בערכי הפרמטריס שהועתקו אליה. כידוע, המשתנה הוא שס של כתובת בזיכרון אשר בו מאוחסן ערך מטיפוס המוגדר למשתנה המסויס בתוכנית. לדוגמה, נניח שכתובת 10 וכתובת 12 בזיכרון המחשב הן הכתובות של המשתניס 518 ו- ||3ח5. כאשר התוכנית מעבירה את המשתניס האלה לפונקציה פ5סטו8/ שְ50|3ו0, הס מועתקיס אל המחסנית. בתרשים 10.1 מתוארת העברת הפרמטרים לפונקציה 65ג|ע צְו0150, וכיצד היא משתמשת בערכיס המועתקיס שבמחסנית. שי כתובת ד | ו ו 2 | מחסנית ציכרון (806ו6) (ל 14 ,3 +מ1) 31865 צג6151 016 ;(811 81 ,0015 31005 שג1801 | // 56 תרשים 10.1: העתקת ערכי הפרמטרים המועברים אל הפונקציה באמצעות המחסנית. הפונקציה 5ס6ט!פּצ 015013 אינה יכולה לשנות את ערכי המשתנים שו ו- ||ה0ח5 המכיליםס את הערכים 2002 ו- 0 בהתאמה, מכיון שאין לה גישה לכתובות 10 ו- 12 של הזיכרון, שבהן נמצאיס המשתניס המקוריים. למה פונקציות בשפת ++6 אינן יכולות לשנות בדרך כלל את ערכי הפרמטרים בעת העברת הפרמטרים לפונקציה, מועתקיס ערכי הפרמטרים למקוס בזיכרון הנקרא מחסנית (5%866). כל השינוייס שהפונקציה מבצעת בפרמטריס מופעלים במחסנית בלבד. בסיוסם הפונקציה, נמחקת כל תכולת המחסנית, ואיתה גם כל השינוייס שהפונקציה עשתה בערכים המועתקים. מכיון שהפונקציה אינה יודעת היכן כתובות הפרמטרים (המשתנים), היא אינה יכולה לשנות את הערכיס שלהם. פרק 10: שינוי ערכי פרמטרים 129 שינוי ערכי הפרמטרים כדי לבצע שינוי בערך פרמטר כלשהו, הפונקציה צריכה לדעת את הכתובת שלו בוּיכרון המחשב. כדי להעביר כתובת של פרמטר לפונקציה משתמשים באופרטור 'יכתובת שליי (8₪). במשפט הקריאה לפונקציה הבאה מתואר כיצד מעבירים את הכתובת של המשתנים פופ ו-8|1הח5 לפונקציה 8815 6פַחההתס. העברת פרמטרים לפי כתובת ; (880811 ,65)6010ט1בּט סִחְתַַַם0 בתוך הפונקציה, במקביל לציון העברת הכתובת של הפרמטריס במשפט הקריאה, צריכים לציין שאכן הכתובת הועברה אליה. לצורך זה מגדירים בפונקציה משתנה מצביע (18|6ז8ע זסזחוסק) אחד, או יותר, על ידי צירוף כוכבית לפני שס המשתנה. הנה דוגמה: (נ81ת5* מ%ת1 ,סָ1סע* 6ת68)1ו1ט ססֶתהתס בנ1סעט משתנה מצביע כדי להציב ערכיס למשתניס בפונקציה, צריך לומר למהדר שפועלים עס כתובת של פרמטר. לשס כך צריך להוסיף כוכבית משמאל לשס הפרמטר. בדרך זו ייקבעו השינוייס במקוס הנכון בזיכרון. להלן דוגמה: 2 = 16ס* 2 = 811ת5* בתוכנית 6₪3698408.602 מתואר השימוש בטכניקה שהצגנו לפני כן - שימוש באופרטור כתובת. בתוכנית מעביריס לפונקציה 65ט|8/\ 06ח8ח6 את כתובות הזיכרון של המשתנים פָום ו-!|8וח5, המשמשים כפרמטרים לפונקציה. הפונקציה מבצעת השמה בערך המאוחסן בכתובות המשתניס בזיכרון, והדבר גורס גס לשינוי ערך המשתניס המקוריים שבזיכרון, אשר נשמר לאחר סיוס ביצוע הפונקציה. <ת.ת108%2608> 86ט610םת1+ (ע* %ם1 ,8* 6ת68)1ו1ט סִחֶתהתס ב1סט \ 12 וק 12 ל >> " 6ע82 781068 צ018018 תנת1%ח 781068 6םמ7" >> סטסס 12 >> ס* >> " שתה8 " >> ה2* 0 ++6 בקלות , 80811 = 2 >> " 6ם8 " >> 016 >> " תסנססםתט+1 6ע6502ס 5 12 >> 11ַַָת5 ; (0811ת65 ,6018 (16סט) מ1את ה1ס7 | 2 = 016 6ם1 0006 >> "7816 ) 68גו1אט 66ת8ם0 >> " סת8 " >> 016 >> " מסנססםט2 810665 781068" >> סגוסס ;061ת6 >> 50811 לאחר הידור והרצת התוכנית, תוצגנה על המסך השורות הבאות: <שתססת 0 8ם8 2002 ם0ס61 > | את.5תק0ם6:\< 06 סתט 650296 7818065 1 ש6ת8 1001 826 781008 צ815018 םתנם1%ש 81065ט 6םך 1 ₪ם8 1001 םב0ס1 %סתט1 8166% 7818065 בפלט התוכנית ניתן לראות שהשינוייס שבוצעו בפרמטרים על ידי הפונקציה 5 6896 השפיעו על אותס ערכי המשתניס המוגדריס מחוצ לפונקציה. מכיון שלפונקציה יש גישה למיקוס המשתנים בזיכרון, היא יכולה לפעול על הערכיס האלה ישירות, ולכן השינוייסם נשמריס לאחר סיוס הפונקציה. בעת העברת הכתובת של פרמטריס לפונקציה, שפת ++6 מציבה את הכתובת של כל אחד מהמשתניס במחסנית. תהליך העברת הכתובות של הפרמטריס מתואר בתרשיס 10.2. (51806) מחסנית (כ* +מ1 ,3* +מ1) 65גו[ה 6שתהת6 016 ;([6:8181 ,6:018) 310105 6שחהו[6 | // 56 תרשים 10.2: העברת פרמטרים לפי כתובת. על ידי השימוש במצביעים (5ז6זחוסק) לפונקציה 65ט|8/ 6פַח8ח6 נוצרת גישה ישירה לכתובת המשתנים בציכרון וכך, השינוי בערכס נקבע כנדרש. פרק 10: שינוי ערכי פרמטרים ‏ 131 שינוי ערכי הפרמטרים בתוך הפונקציה כדי לשנות ערכיס של הפרמטרים, צריך לאפשר לפונקציה לגשת לכתובות של הפרמטרים בזיכרון. כתובות הפרמטריס מועברות לפונקציה על ידי שימוש באופרטור ייכתובת שליי במשפט הקריאה אליה: ; (8218016ט 685006) פתס61סתט+ 5006 במקביל להעברת הכתובת במשפט הקריאה לפונקציה, יש לציין בהגדרת הפונקציה עצמה שהפרמטרים שהיא מקבלת הם מטיפוס מצביע (כתובת של משתנה), על ידי צירוף כוכבית לפני שס הפרמטר: ק 0 ל ו" שו 5 5 6 בס בתוך הפונקציה יש לפנות אל המשתנה, תוך צירוף כוכבית לשמו: = 5 אש 5 665 >> 5 כדי למנוע שגיאות, שפת ++6 אינה מתירה לתוכנית להעביר כתובות פרמטרים לפונקציה שאינה מצפה לקבל מצביע כפרמטר. המהדר גס מפיק הודעת אוהרה כאשר התוכנית מנסה להעביר ערך אל פונקציה שמצפה לקבל כפרמטר ערך של מצביע. דוגמה נוספת כאשר התוכנית מעבירה מצביעיס לפרמטרים, הפרמטרים יכולים להיות מכל טיפוס שהוא. הפונקציה משתמשת במצביעים מצביעה על המשתניס מהטיפוס המתאים, ומציינת לפני כל אחד מהס כוכבית כדי לציין שהמשתנה הוא מצביע. בתוכניה 5.655 והעפהגצו5 מועברות לפונקציה פסטוא8ע כ₪8ש5 כתובות של שני פרמטריס מטיפוס 80080. תפקיד הפונקציה הוא להחליף בין ערכי הפרמטריס על ידי התייחסות לכתובותיהס בציכרון. <ת.ת108%2608> 61086םת1+ (ע* 108% ,8* 81068)5108%ט ק8ח8 ב1סע ו ;קתסס 11086 ;8* = סת6ם ;כק]* = ב * ;קת66 = ₪* 2 ++6 בקלות (ס1סט) מ1את 1סע ן 72 = 016 11086 2 >= 811ת8 11086 ; (6850811 ,8010) 781065 80ח5 2 >> 16 >> " פת1הסתסס 216" >> 0006 12 >> 811ת8 >> " פת1אסתס60 811ת5" >> סטסס התוכנית קוראת לפונקציה 5סט|א8/ סְַאאו5, ומעבירה אליה פרמטריס לפי כתובת. תוכנית מתייחסת לפרמטרים על ידי שימוש במצביעים בתוך הפונקציה. כעת ננתח מספר משפטים חשובים בפונקציה 65ט81/ סְ8או5. ראשית, הפרמטרים המוגדריס 8 ו-8 הס מצביעיס לערכיס מטיפוס 608%. (ע* 108% ,8* 8106585)5108%ט ק8ח5 בנסע בתוך הפונקציה מוגדר משתנה 0וח6?. טיפוס המשתנה הוא ₪080 רגיל (לא מטיפוס מצביע ל- 08%ו!)). ;קתסס 11086 כעת נתבונן במשפט הבא: ;3* = סתסם משפט וה מבצע השמה של הערך בזיכרון שהפרמטר 8 מצביע עליו (הערך 10000.0 של 4ֶפ) אל משתנה הפונקציה סוח6ז. ההשמה תקינה, מכיון שהמשתנה סחפז גם הוא מטיפוס 808%. משתנה מטיפוס מצביע הוא משתנה המכיל כתובת בזיכרון המחשב. במשפט הבא מוצהר שהמשתנה קוח6+ הוא מצביע של כתובת בזיכרון, שבה מאוחסן ערך מטיפוס 8%סו|. ;קתסס* 11086 במקרה זּה, המשתנה 600 יכול להצביע על כתובת בזיכרון שבה מאוחסן מספר ממשי, אבל הוא לא מסוגל לאחסן את הערך עצמו. בנושא יימצביעיםיי נדון בהרחבה בחלק 3 של הספר. בשלב זה חשוב לדעת, שלצורך העברת פרמטריס לפי ייחוס יש להשתמש במצביעים. פרק 10: שינוי ערכי פרמטרים ‏ 133 הבנת פעולת המהדר בעזרת תדפיס של שפת אסמבלי אחת הדרכים הטובות ביותר להבין כיצד מהדר ++6 מתייחס למצביעים, היא לבחון את פלט המהדר, אשר מוצג בשפת אסמבלי (ץ|0וח1556). רוב מהדרי ++6 מספקים מתג שורת הרצה (ח66וש\5 6חו! 6ח8וחוחס6), המכוון את המהדר לייצר קוד אסמבלי. על ידי עיון בתדפיס שפת אסמבלי המופק על ידי מהדר ++6, אפשר להבין טוב יותר כיצד המהדר משתמש במחסנית כאשר הוא מעביר פרמטרים לפונקציה. סיכום בפרק זה למדנו כיצד לשנות את ערכי פרמטריס בתוך הפונקציה. כדי לעשות זאת, יש להשתמש במצביעיס המאפשרים גישה ישירה לכתובת הפרמטר בזיכרון. בפרק 14 נציג טכניקת פרמטריס מיוחסיס (665ח₪6)676) של שפת ++6, המפשטת את תהליך שינוי ערכי הפרמטרים. הטכניקה שהצגנו בפרק זה נפוצה מאוד בתוכניות הכתובות בשפת 6 הקלאסית, ולכן חשוב להבין כיצד היא פועלת. לפני שנעבור לפרק הבא, מומלצ לבחון אם מובניס הנושאיס הבאים: * בצורה רגילה, פונקציה אינה מסוגלת לשנות ערכי פרמטרים. / בעת העברת הפרמטריס לפונקציה, שפת ++6 מעתיקה את הערכים שלהס למקוס בויכרון הנקרא מחסנית. כל השינויים שהפונקציה מבצעת בפרמטריס מופעליס במחסנית בלבד. * כדי לשנות ערכים של פרמטרים, הפונקציה צריכה לדעת את הכתובות שלהם בויכרון. * כתובות הפרמטרים מועברות לפונקציה על ידי שימוש באופרטור 'יכתובת שליי (8). * בפונקציה המקבלת כתובת של משתנה, יש להגדיר את הפרמטרים מטיפוס מצביע (כתובת של המשתנה בזיכרון) על ידי צירוף כוכבית לפני שס הפרמטר. * בתוך פונקציה כאשר רוצים להשתמש בערך של התא בזיכרון אליו משויך מצביע יש לסמן כוכבית לפני שם הפרמטר. בפרק | הבא נציג כיצד להשתמש בפונקציות | של ספריות | ההרוצה (121737165] 6וח1+-חטא) המסופקות על ידי היצרנים בחבילות המהדריס של שפת ++6. נראה ששימוש בפונקציות אלו עשוי להגביר את עוצמת התוכניות ולחסוך זמן רב בפיתוח שלהן. 4 ++6 בקלות תרגילים 1 כיתבו פונקציה בשס 50%, המקבלת שלושה משתנים מטיפוס >חן (6/076066ז עֶם), וממיינת אותס מהגדול לקטן. בשלב ראשון, הקלט יהיה מתוך משתנים בתוכנית. אחר כך תוכלו לכתוב תוכנית דומה, אשר מקבלת את הקלט מהמקלדת. 2 כיתבו פונקציה מהצורה הבאה: ; (6101002 סת1 ,111% עס6סקט 6ם3101662)1 אהת 6ם1 פונקציה זו מחזירה את המספר השלם הגדול ביותר, שערכו קטן או שווה לערך אוחו| זסקקט, והוא מתחלק ללא שארית ב- זססוטו0. ניתן לבצע את הפעולה ללא הגדרת משתני עזר מקומייס בפונקציה. אפשר להניח כי ז06ועו0 אף פעס אינו גדול מהערך לוחז|. זססקט. 3 כיתבו פונקציה ([* 6ח| ,ן* 6חו)6חט+ המאתחלת את ערכי המשתנים 1 ו-], המתקבליס כקלט מהמשתמש. יש לכתוב שגרת חווח, אשר תפעיל את הפונקציה 6חטז, ותדפיס את ערכי המשתנים. 4 | מיצאו את השגיאות בתוכנית הבאה, ותקנו אותה: <ם.0ת105%268> 61066ם1+ (ץ %6ם1 ,א %68םת800)1 6םת1 | ;ץ + 6% =6% ;א םע660%ץ (10סט) ת81ת 18סע ז ;0=2ס,8=1 6ם1 ; (פ* ,800)*8 >> סטסס פרק 10: שינוי ערכי פרמטרים 135 יתרונות ספריית ההרצה (צההחםז ו פוונד-אטא) בפרק 9 למדנו כיצד ניתן לחלק את התוכנית לפונקציות שהן יחידות קטנות יעילות לתחזוקת התוכנית והמבצעות משימות מסוימות. אחד היתרונות של הפונקציות הוא שניתן להשתמש בהן בתוכניות שונות. בפרק זה נציג פונקציות של ספריות ההרצה הסטנדרטיות (פסזזבּז8!!] שוחו חטא) או בקיצור פונקציות ספריה, המסופקות בחבילות המהדריס של שפת ++6. בספריה זו יש אוסף מקיף של פונקציות מוכנות שניתנות לשימוש בכל תוכנית ותוכנית. על ידי ניצול יתרונותיה של ספריית ההרצה מצטמצמת עבודת תכנות הדרושה להשלמת התוכנית. עבודה מייגעת וו מתחלפת בקריאות לפונקציות ספריה, אשר מבצעות את המטלות הדרושות. בהמשך הפרק נדון בנושאיס הבאיס: + השימוש בפונקציות ספריה. > הגדרה נכונה של קבצי כותר של ספריות ההרצה. %> השימוש בהצהרות הפונקציות כדי לדעת אילו פרמטרים יש להעביר לכל פונקציה. אפשר לנהל יותר מספריית הרצה אחת, כפי שנלמד בהמשך. רוב ספריות ההרצה המסופקות עס המהדריס של השפה מכילות מספר רב של פונקציות שימושיות. השימוש בפונקציות אלו חוסך זמן רב בפיתוח התוכניות ומגביר את עוצמתן. בפרק הנוכחי נראה שהשימוש בפונקציות הספריות פשוט עד מאוד. 6 ++6 בקלות השימוש בפונקציות ספריה בפרק 9 למדנו כי השימוש בפונקציה בתוכנית מותנה בכך שתהיה הגדרה שלה בקובצ המקור שבו היא נקראת, או לחילופין תהיה הצהרה של הפונקציה, או שיוצג אב-טיפוס שלה לפני משפט הקריאה אליה. מכיון שהגדרת פונקציות הספריה נמצאות בספריה עצמה, יש להצהיר עליהן בתוכנית המשתמשת בהן. כדי להקל על מלאכת ההצהרה ולמנוע שגיאות תתביר, מצורף לכל ספריות ההרצה קובץ כותר )1!6(‏ 8680607) המכיל את ההצהרות התקינות של פונקציות הספריה שבו. לכן, למתכנת נותר רק להציב בתוכנית את שם קובצ הכותר הנכון במשפט 6סטוסחו שבתחילת התוכנית. לדוגמה, בתוכנית הבאה, 6?2.שאדשסא5, מתואר השימוש בפונקציות הספריה: שוח ו-6וח60 להצגת התאריך והשעה הנוכתים על גבי המסך. הצהרת פונקציות ספריה אלו נמצאת בקוב> הכותר ח.6חחם. <ת.ת108%208> 010₪6ם1 8 ץשץע8ש112 6ת51-תטע מסץ// <ת. %106> 0100₪6ם1 (16סט) מ1את ב1סע ן ;616 ת78566ץ8 6 6ת61 ; (ע1טא) 6ת61 = 6ת61 5785668 >> " 18 סשת1ם ת7866ץ58 סתס6עעטס 6ם7" >> סטסס ;601 >> (6ת61 8ת65785606) 60616 1 לאחר הידור והרצת התוכנית יוצגו על המסך התאריך והשעה המצויניס בשעון המערכת. <66%ת₪> מא11ח58₪0 <\:0 9 16:13:51 08 260 ₪66 1585 6ת61> ת566ץ5 6םת6ע2טס 6םמך בתוכנית הקודמת השתמשנו בפונקציות שוח ו- ₪06 6%. התוכנית מעבירה לפונקציה 66 את כתובת הפרמטר ₪6 5/5906 תוך שימוש בטכניקה המתוארת בפרק 10. בתחילת התוכנית נעזריס ב- 6סט!סח1 כדי להעתיק לתוכנית את קוב\ הכותר ה.סח המאפשר שימוש בפונקציות הספריה הדרושות. בצורה דומה, בתוכנית ;69.ז508 מתואר השימוש בפונקציה 50% לחישוב שורש ריבועי של מספר ערכיס המוצגיס על המסך. הצהרת (אב-טיפוס) פונקציית הספריה + נמצאת בקובצ הכותר ח.חזהוח. פרק 11: יתרונות ספריית ההרצה | 137 <ם.ת1085%208> 61006ת1+ 86 סמסעש8 8םת681ת00 // <ם. ת8%ת> 61086ת1+ (ס1סט) מ1את 1סע | 2 >> (100.0)%ע562 >> " 18 100.0 01 006ע2 500826 6ם7" >> ס6טסס 12 >> (502%)10.0 >> " 18 10.0 05 006 6ע5008% 6ם7" >> סטסס 2 > (5.0)%ע502 >> " 18 0 .5 05 006ע 6ע5008% 6ם7" >> סטסס ו ולבסוף, | בתוכנית | ק5+504|1.0 | אנו | משתמשים בפונקציית | מעוכת (חסט6חט וח6ז5ץ5). אב הטיפוס של הפונקציה מוגדר בקובץ ח.550]12. פונקציית המערכת מאפשרת לתוכניות להריצ בקלות פקודות של מערכת ההפעלה (למשל, זו של 05כ), או תוכניות אחרות : <ת.ת108%2608> 61086ת1+ <ת.מ56011> 86ט610מת1+ (ס1סט) מ1את 1סע | ; ("פ1ת") 5756608 ] בתוכנית זו משמשת פונקציית המערכת להרצת הפקודה 018 של מערכת הפעלה 05. כדאי לנסות ולהריץ באופן דומה פקודות 205 אחרות, או תוכניות אשר נכתבו בפרקים הקודמים. את התוכנית ניתן להריץ באמצעות קוב\ 6א6 בלבד. על כן, תוכנית זו לא תפעל באמצעות מהדר התרגול 16166. לשס הרצה צריך להשתמש במהדר בגירסה מלאה. כיצד להבין את פונקציות הספריה בדרך כלל, המהדריס של שפת ++6 מכילים מספר רב של פונקציות ספריה ולרוב, בתיעוד המצורף למהדר יש תיאור מפורט של פונקציות אלו. בדרך כלל מוצגות ההצהרות (אב-טיפוס) של הפונקציות. לדוגמה, הצהרת הפונקציה +וף5: 000016 5626 )600016( ; במקרה זה, אנו לומדים מהצהרת הפונקציה שהערך המוחזר שלה הוא מטיפוס 6פטסס, כאשר גם הפרמטר שהיא מצפה לקבל הוא מאותו טיפוס. בדומה לפונקציה זו, הצהרת פונקציית הספריה סוחט היא : ;(* 6 6ת61) 6106 ₪ 6106 8 ++6 בקלות בדוגמה זו אנו רואיס שהפונקציה מורה שהפונקציה מחזירה ערך מהטיפוס + חס (המוגדר בקובצ כותר 06.8). הפונקציה מצפה לפרמטר מצביע למשתנה מסוג + סחוס. מומלץ להתבונן היטב בתיעוד על פונקציות הספריה השונות המסופקות עס המהדרים של שפת ++6, כדי להימנע משגיאות בעת הקריאה לפונקציות. ראוי לציין כאן שהמתכנת יכול לצרף את הפונקציות שהוא כותב אל הספריות הסטנדרטיות המסופקות על ידי יצרן המהדר. כך הוא יכול לכלול בהן פונקציות שהוא ערך בעצמו ושדרושות לו בתוכניות שהוא מפתח. כפי שמתכנתים שונים יכולים להשתמש בספריות ההרצה הסטנדרטיות, כך הם יכולים להשתמש בספריות שאחד מחבריהם הכין, או לרכוש ספריות מוכנות כאלה (יש גם סְזה/6ז508). פונקציות זקה מהדרים רבים תומכים בפונקציות ממשק תכנות יישומים - 201 (חסטהּס|כסקג 6 ותהזפסזק), בנוסף לספריית זמן הריצה (ץזפּזפו! 6וחט-חט₪א) הסטנדרטית של ++6. בסביבת פצוססחו/\ למשל, קיימות פונקציות 871 שונות: גרפיקה, תקשורת, מולטימדיה ורבות אחרות. לכן, לפני שכותבים פונקציה שעשויה למלא משימה סטנדרטית, כדאי לברר מהן פונקציות 01ה, שכבר כלולות בספריית המהדר. סיכום ספריות ההרצה של הפונקציות בשפת ++6 מכילות אוסף מקיף של פונקציות מוכנות שניתנות לשימוש בכל תוכנית ותוכנית. על ידי ניצול יתרונותיה של ספריית ההרצה ניתן לחסוך זמן רב בפיתוח תוכניות. מומלצ ללמוד היטב את מבנה הפונקציות על פי התיעוד הנלווה למהדר. לפני שנעבור לפרק הבא מומלצ לבחון אס מובניס הנושאיס הבאיסם: / ספריות ההרצה של הפונקציות הן אוסף של פונקציות מוכנות לשימוש בתוכניות השונות. * כדי להשתמש בפונקציית ספריה יש להצחיר עליה כתוכנית. * לרוב המהדרים של שפת ++6 מצורפים קבצי כותר המכילים הצהרות תקינות של הפונקציות שבספריית ההרצה שלהם. בפרק 12 נציג את המשתניס המקומייס וטווח הכרתם. טווח הכרת המשתנה הוא הטווח בתוכנית שבו ניתן להשתמש במשתנה מסויס. פרק 11: יתרונות ספריית ההרצה 139 תרגילים 1 כיתבו פונקציה המקבלת שלושה ערכיסם מטיפוס 8080, ומדפיסה את הערך סו של הראשון, ערך חו5 של השני ואת ערך 605 של השלישי. היעזרו בספריה המתמטית של ++6. 2 כיתבו תוכנית המדפיסה את השעה הנוכחית, סופרת בלולאה מ-1 עד 1,000,000 ומדפיסה שוב את השעה הנוכחית. 0 ++6 בקלות מלעורוניבו נללוונ/ייםבו וטווח הכרתם בפרקיס הקודמיס למדנו שהפונקציות הן יחידות תכנות קטנות המרכיבות את התוכנית. הפונקציות שהצגנו בפרקיס הקודמים מבצעות פעולות פשוטות. כאשר כותביס פונקציות מורכבות יותר, מתעורר צורך להגדיר משתניס בתוך הפונקציות כדי שהן תוכלנה לבצע את המשימות המוגדרות להן. המשתניס המוגדריס בתוך הפונקציה נקראיס משתנים מקומיים (פ6!טבּוזְבּע |1063). ערך המשתנה המקומי ועצם קיומו מוכר אך ורק לפונקציה שבה הוא מוגדר. לדוגמה, משתנה /58!8 המוגדר בפונקציה |וסזץְה מוכר אך ורק בפונקציה זו. לשאר הפונקציות אין גישה לערך המאוחסן בו. בהמשך הפרק נדון בנושאים הבאים: + הגדרת משתנים מקומיים (65!טוזהע |1068) בתוך פונקציה, נעשית על ידי ציון השם והטיפוס שלהם, כמו שהדבר נעשה בפונקציה חופוח. > שמות המשתניס בתוך פונקציה צריכים להיות ייחודיים, אך פונקציות שונות יכולות להשתמש באותס שמות משתנים. > טווח ההכרה (56006) של משתנה הוא אוסף המקומות בתוכנית בהס המשתנה מוכר ונגיש. % משתנים גלובליים (65!ס8וזפּ/ |088!ס) מוכריס לכל אורך התוכנית, ונגישיס בכל פונקציה. > אופרטור טווח ההכרה (::, זסזהזסקס חהסטט!650ז |6!058) מסייע בבקרת טוות ההכרה של משתנה. תהליך הגדרת משתניס מקומיים קל מאוד, ולמעשה כבר הגדרנו משתניס מסוג וה בפונקציות חו3חז בתוכניות המוצגות בפרקיס הקודמיס. פרק 12: משתנים מקומיים וטווח הכרתם ‏ 141 הגדרת משתנה מקומי משתנה מקומי (פְטגּוזְבּצ |1063) הוא משתנה המוגדר בתוך הפונקציה. המשמעות של המילה מקומי היא שהמשתנה מוכר אך ורק בתחוס הפונקציה שבה הוא מוגדר. משתניס מקומייס מוגדרים בפונקציה מייד בתחילת קוד ההגדרה של הפונקציה. (10סט)תסנ1ססתט1 58006 ב1סע ו ;מטסס 6ת1 %2 1108₪0 ו בתוכנית 5.6022קפפמפפ5ט תפקיד הפונקציה :6א5068 0חט50 הוא לגרוס שברמקול המחשב יושמע מספר צפצופים על פי הערך המועבר בפרמטר 6605פ2. בפונקציית 5 6חט50 מוגדר משתנה מקומי ז6חטס6 המשמש כמשתנה עזר בלולאה של השמעת הצפצופים. <ת.ת108%2608> 610866םת1+ (8ק66ס %6ת5008%62)1 תט580 בנסע ָ ;עססתטסס %6ם1 (++ע6סתטסס ;06808 => עססתטסס ;1 = עספסתטסס) 105 ;'ה\' >> 6006 (10סט) תנאת 18סע ו ; (2) 066708 בתט0ס5 ; (3) 06608 במתט0ס5 ו יש להדגיש, כי את המשתנה המקומי זסזחטס6 מגדיריס מייד בתחילת הקוד של הפונקציה. בעיית התנגשות של שמות משתנים במהלך התכנות של פונקציות אנו עלוליסם להגדיר שמות והיס למשתניס מקומייס בפונקציות שונות. כפי שציינו קודס, משתנה מקומי מוכר אך ורק בתחוס הפונקציה שבה הוא מוגדר. שפת ++6 דואגת לייחס כל משתנה לפונקציה הנכונה. על כן אין התנגשות של שמות המשתנים, על אף שהסם זהים. בתוכנית פפס.פואגאו16 תפקיד הפונקציה 81065/\ 800 הוא לחבר שני מספריםס שלמים. בפונקציה מוגדר משתנה מקומי 6ט1פ\ המאחסן בתוכו את תוצאת חיבור המספרים. אולסם גם בפונקציה חוגוח 12 ++6 בקלות מוגדר משתנה מקומי בשם 6ט|אץ, המשמש פרמטר להעברת מידע לפונקציה 65 806₪0. שמות והיס אלה אינס מתנגשים ביניהם, מכיון ששפת ++6 מייחסת כל משתנה מקומי לפונקציה שבה הוא מוגדר. <ת.ת108%2608> 86ט610םת1+ (ע %ת1 ,8 %6ת81068)1ט 88606 6ת1 ז ;הט סם1 ;ספ + 8 = 6ו1א8ע ; (6גו81ט) םש1ו26% (ס1סט) מ1את 1סע | 2 = 6ג1אט 6ם1 2 = 8106ט ע6ם06ס 6ת1 >> " > " >> 8106ט ע6ב05 >> " + " >> 8106ט >> סטסס 2 >> (06מ1אט ע6ם06 ,סגו1ט) פסגו1פט 8006 המשתנה המקומי משתנה מקומי הוא משתנה המוגדר בתוך הפונקציה. שס המשתנה והערך המאוחסן בו מוכרים אך ורק בתחוס הפונקציה שבה הוא מוגדר. משתניס מקומייס מוגדריס בפונקציה מייד בתחילתה. השמות שניתניס למשתנים מקומיים צריכים להיות ייחודיים רק בתחום הפונקציה שבה הס מוגדריס (ועל כך אפשר להגדיר משתנה בשס זהה בכל פונקציה אחרת). כאשר מגדיריס משתנה מקומי בתוך פונקציה, אפשר לקבוע לו ערך התחלתי בעזרת אופרטור ההשמה (960זסקס +חסוח5519). הגדרת משתנה גלובלי משתנים מקומיים, כך ראינו, מוגדריס ומוכריס רק בתוך הפונקציות שבהן הס מוגדריס. לעומתס, בשפת ++6 קיים סוג משתנה המוכר לכל הפונקציות בתוכנית. משתנה מסוג וה נקרא משתנה גלובלי (ס|טהּוזבּט |61023), כי הוא כללי לכל הפונקציות. משתניס גלובליים מוגדריס בתחילת התוכנית, ומחוצ להגדרות הפונקציות שבתוכנית. פרק 12: משתנים מקומיים וטווח הכרתם 143 הגדרת משתנה גלובלי 1 ;78218216 610081 5006 6ם1 (סנסט)םנ1הת 1סט ו 6 60 16טסח 65ת55866(6 תהאשטססצק // ו בתוכנית 9פס. ו61084 מוגדר משתנה גלובלי זפפוחטח לכל הפונקציות בתוכנית גישה אליו, ועל כן הו מסוגלות להשתמש ולשנות את הערך המאוחסן בו. בתוכנית זו, כל פונקציה מציגה את ערך המשתנה ומקדמת את ערכו באחד. <ת.ת108%2608> 866ט610םת1+ 2 = פפסחתטם %ם1 (10סט)06ם8ת6 515286 16סע | 2 >> מססתטת >> " 66ת8ת0 11286 ם1 6ט81ט 5'עססתטת" >> סגוסס ; ++62מתגות ו (10סט) סִפ0ת8ת0 560086 בנסע ו ;01ם6>> ע6כתגות >> " 86ם8ת0 86ת5600 ם1 6ט1א8ט 5'עססתטת" >> סגוסס ; ++2סמתגות ו (ס1סט) מ1את 1סע | 12 >> עססחטת >> " תנאת ת1 6ט1א8ט פ'עפסתטת" >> 000% ; ++ץ ססתגוםת ; () 66ם8ם0 11586 ; () 86ת8ם6 56006 ו ככלל, יש להימנע משימוש במשתנים גלובליים בתוכניות ++6. מכיון שלכל פונקציה בתוכנית יש גישה אליהס, קשה לעקוב ולדעת באיזה שלב בתוכניות ועל ידי איזו פונקציה נעשה שינוי בערכס. לכן, עדיף ליישס את דרך התכנות שבה מוגדרים משתניס מקומיים בפונקציה הו8ח, אשר משמשיס פרמטריס להעברת ערכים לפונקציות הספציפיות הדורשות משתנים אלה. יש לציין ולהזכיר כי בהעברת מידע דרך פרמטרים, ערך המשתנים המועבריס מועתק למחסנית, כך שהפונקציות המקבלות את המידע משתמשות במחסנית, ולא פוגעות בערכיס המקורייס. 4 ++6 בקלות בעיית משתנה גלובלי ומשתנה מקומי בעלי שם זהה יש להימנע משימוש במשתנים גלובליים. במקרה בו שס משתנה גלובלי ושס משתנה מקומי והיס יש התנגשות. הנה דרך פתרון לבעיה: אופרטור טווח ההכרה (::) של שפת ++6 פותר את הבעיה ומאפשר להתייחס למשתנה הגלובלי בתוך פונקציה שבה מוגדר משתנה מקומי באותו שס. למשל, נניח שבתוכנית מוגדרים שני משתניס בשם זססוחטח, אחד גלובלי ואחד מקומי. במשפט הבא (מתוך הפונקציה) התוכנית מתייחסת למשתנה המקומי. 6 18016עהט 20681 // 12 = עס6מתטםת לעומת ואת, במשפט הבא משתמשיס באופרטור טווח ההכרה כדי להתייחס למשתנה הגלובלי בתוך הפונקציה שבה מוגדר משתנה מקומי באותו שס. 6 18016עאט 010081 // 2 = מססתטם:: בתוכנית <61081064.602 מוגדר משתנה גלובלי בשס זספוחטח. בנוסף, בפונקציה 5 טח שוסח5 מוגדר משתנה מקומי, גס הוא בשסם זססווטח. בתוך הפונקציה מופעל האופרטור טווח ההכרה כדי לאפשר גישה למשתנה הגלובלי. <ת.ת108%268> 610866ת1+ 6 010081 // 2 = מססחתטם 6ת1 (ע6מחמגות 6ם1) פע6מתגום חסם5 ב1סט ן 12 >> עססתטת >> " פםנ1הסתס0ס עפסחתטםת 18216עהט 10081" >> 00806 2 >> מסשסתטם:: >> " פת81סת0ס60 עספסחטת 18216עהט 010281" >> סטסס ] (16סט) מ1את ב1סע | 2 = 6ט10ט 8006 6ת1 ; (6גו81 5086) פ628סתגום אסם5 לאחר הידור והרצת התוכנית יוצגו על המסך שורות הפלט הבאות : <66%םת₪> | 610281002 <\:0 2 5"םת00681 ע6שקתטת 180186ע8ט 10081 1 פםנ81סת00 עססתגטת 18216ע8ט 010081 פרק 12: משתנים מקומיים וטווח הכרתם 145 על פי התוצאות ניתן להיווכתח שהשימוש באופרטור טווח ההכרה מאפשר גישה למשתנים גלובליס בתוך הפונקציה שבה מוגדר משתנה מקומי בשס זהה. יחד עם זאת, השימוש במשתניס גלובלים ומקומייס בעלי שמות זהים עלול לגרוס לבלבול שתוצאותיו מובילות לתקלות ושגיאות מיותרות. על כן מומלצ להמעיט בשימוש במשתניס גלובלייס בתוכנית. המשתנה הגלובלי משתנה גלובלי הוא משתנה המוכר לכל הפונקציות בתוכנית. משתנה גלובלי מוגדר בתחילת קובצ מקור, ומחוצ להגדרות הפונקציות שבתוכנית. לכל הפונקציות שנמצאות מתחת להגדרת המשתניס הגלובליס יש גישה למשתנים, ולכן הן מסוגלות להשתמש בהם ולשנות את ערכם. מומלא להמעיט בשימוש במשתנים גלובליים עקב בעיות ותקלות שעלולות להיות בהגדרת שמות משתניס אלה, ובגישה החופשית אליהס מכל מקוס בתוכנית. טווח ההכרה - 560006 6'5!טבּוובּ\ בספרות המקצועית הקשורה לשפת ++6 מרבים להתייחס למונח טוות (56006), המגדיר את חלקי התוכנית בהס שס המשתנה מוכר (ולכן פעיל). טווח ההכרה של משתנה מקומי הוא בפונקציה בה הוא מוגדר בלבד. לעומת זאת, טווח ההכרה של משתנה גלובלי הוא כל התוכנית, ולכן טווח ההכרה שלו רחב יותר מטווח ההכרה של משתנה מקומי. סיכום בפרק וה למדנו להגדיר משתנים מקומיים המוכרים בתוך הפונקציה שבה הס מוגדריס בלבד. סוג משתנה אחר שהוצג בפרק הוא המשתנה הגלובלי המוכר לאורך כל התוכנית. מכיון שהמשתניס הגלובליים יכוליס לגרוס לשגיאות שקשה לגלותן, עדיף להימנע מהשימוש בהם ככל האפשר. בפרק 13 נלמד כיצד ++6 מאפשרת לתוכניות להגדיר שתי פונקציות או יותר, אשר נושאות את אותו השס, אך מתייחסות לפרמטרים שונים ואף לטיפוס התזרה (ח₪6007) שונה. על ידי העמסת שם הפונקציה בדרך וו אפשר לפשט מאוד את השימוש בפונקציות. לפני שנעבור לפרק הבא, מומלצ לבחון אם מובניס הנושאיס הבאים: * משתנים מקומיים הם משתנים המוגדריס בתוך הפונקציה. * המשתנים המקומיים מוכריס רק בתוך הפונקציות שבהן הם מוגדרים. * בפונקציות שונות ניתן להגדיר משתנים מקומיים בעלי שמות והים, ללא התנגשות. 6 ++6 בקלות % משתנים גלובליים מוכרים לאורך כל התוכנית. % כדי ליצור משתנה גלובלי יש להגדיר אותו בתחילת קוב המקור ומחוץצ לכל הפונקציות. / שימוש במשתנים גלובלייס יכול לגרוס לתקלות שקשה לזהות. מפני שהערך של משתניס הגלובלייס מושפע מפעולות בכל התוכנית. לכן מומלצ לחימנע עד כמה שאפשר משימוש במשתנים גלובליים. תרגילים 1. מהו הפלט של התוכנית הבאה? <ם.0ת105%268> 61066ם1+ ;5 = ס סם1 (8 %ת1) 5 ב1סט ָ ;3 = 0 6ם1 2 + 0 = ס 12 >> 8 >> סגוסס 12 >> כ >> סגוסס 12 %6>> :: >> סטסס ; "1 \ =======" >> 1₪ן00 (10סט) ת81ת 18סע ְ פרק 12: משתנים מקומיים וטווח הכרתם 147 [88 מהו הפלט של התוכנית הבאה? <ם.ת61066>105%268ם1+ 2 = א 6ם1 (א< %ם1) 5 %ם1 ָ ;קת + א מעג66ץ ;1 = קתס 6ם1 / (א %ם1) 6 6ם1 ָ ;קתס - א:: תעגססץ 2 = תס 6ם1 / (10סט) תנ81ת 18סע ָ 12 >> (א)6 >> 0006 2 >> (א)1 >> שגוסס 12 >> ((א)5)4 >> סגוסס = א 6ם1 12 >> (א)1 >> 00806 ;01ם8 >> (א ;501 >> ((א)64 ;601 >> ((א)6)5 >> סטסס ;01ם6 >> ((א::)4 ;601 >> (3 7 6 >> 0006 )1 >> 0006 )1 >> 6גמסס )6 >> 6גו00 12 = א ;01 >> (5)7 >> 0006 2 >> (6)7 >> שסגוסס 1 ;801 >> (5)7 >> 0006 12 >> (6)7 >> שגוסס ++6 בקלות העמלסחה טונקציות בפרקיס הקודמיס למדנו שבהגדרת פונקציה יש לציין את טיפוס הערך המוחזר על ידה, שמות הפרמטריסם שהפונקציה מנהלת, והטיפוס של כל אחד מהם. לפיכך, כאשר נרצה לכתוב פונקציה לחיבור שני מספריס ונקרא לה בשס 65ט|8/ 800 ואחר כך נרצה לחבר שלושה מספרים, עלינו להגדיר פונקציה חדשה דומה לקודמת ולתת לשתיהן שמות שוניס כדי לזהות אותן באופן מוחלט: לדוגמה, בפונקציה, 65ט|8/ סש 800 ובפונקציה 65ט]8/ 66זח+ 8006. כדי למנוע כפילויות אלו, שפת ++6 מצוידת במנגנון המאפשר להגדיר מספר פונקציות בעלות שס והה. בומן ההידור, המהדר בוחן את מספר וטיפוס הפרמטריס בכל קריאה לפונקציה ומציב לכל קריאה וקריאה את הפונקציה הנכונה. תהליך זה נקרא העמסת יתר של פונקציות (פַחוהְבּסוזסטס), או בקיצור העמסת פונקציות. בהמשך הפרק נדון בנושאים הבאים : > מושג העמסת פונקציות והמקריס בהם רצוי ליישם אותו. > העמסת פונקציות בתוכנית. העמסת פונקציות היא תכונה של שפת ++6, שאינה קיימת בשפת 6. כפי שנראה בהמשך, ניצול העמסת פונקציות תורס לבהירות והבנת קוד התוכנית. פרק 13: העמסת פונקציות 149 מהי העמסת פונקציות מנגנון העמסת פונקציות מאפשר להגדיר מספר פונקציות שונות שבהס והים השם וטיפוס הערך המותחזר. לדוגמה, בתוכנית הבאה מנצלים את המנגנון להעמסת הפונקציה 65ט!8/ 800. הפונקציה הראשונה מבצעת חיבור של שני ערכים מטיפוס זחו. לעומתה, ההגדרה השנייה של הפונקציה מבצעת חיבור של שלושה ערכים. במהלך החידור, שפת ++6 קובעת לכל קריאה את ההגדרה המתאימה. <ת.ת108%2608> 61086םת1+ (ע %ת1 ,8 %6ת81068)1ט 88606 6םת1 ז ; (ם + 8)םעגו260 (ס %םת1 ,םס 6ת1 ,8 6ת81068)1ט 8866 6ת1 ָ ;(0 + 0 + 8)םעטמט26% (16סט) מ1את ב1סע ָ 12 >> (801 ,810068)200ט 8006 >> " = 801 + 200" >> סטסס 1 ,1068)100הט 860 >> " = 700 + 201 + 100" >> סטסס 12 >> (700 ו בתוכנית זו ניתן לראות שהפונקציה 8165 800 מוגדרת פעמיים. בהגדרה הראשונה היא מחברת שני ערכים מטיפוס שחו, ובהגדרה השנייה היא מחברת שלושה ערכים. אין צורך לצייו בתוכנית שהפונקציות מועמסות. המהדר של שפת ++6 מבדיל בין ההגדרות השונות לפי השוני בפרמטרים שמועברים לפונקציה. בצורה דומה, בתוכנית 5ק6.חטס ₪56 קיימת העמסת הפונקציה 655806 עשסח5. בהגדרה הראשונה מציגיס על המסך הודעת פלט כאשר אין מעבירים לפונקציה פרמטריס כלשהם. בהגדרה השנייה מציגיסם על המסך הודעת פלט אחת, המועברת כפרמטר לפונקציה. בהגדרה השלישית והאחרונה מציגיס על המסך שתי הודעות פלט המועברות כפרמטרים לפונקציה. 0 ++6 בקלות (10סט) 655800 שטסם8 16סע ו 12 >> "++0 צס 26850060 :5806פ65ת 618016כ" >> סטסס ו (655806ת* 82ם655806)0ת טסם8 16סע ז ;01 >> 858066סת >> סגוסס (0ת8600* 0282 ,1128%6* 82ם655806)0ת טסם8 בנסע ן 12 >> 51280 >> 0006 ;01ת6 >> 6₪ת5600 >> 0006 ] (ס1סט) מ1את 1סע ן ; () 655806 אסם5 ; ("!0060ספס6ת ם66ם 6ט'6558076)"1ת טסם5 ; ("!0001 18 סַם6210801ט0" ,"!בעהאת 50 ססםת 18 ++6") 655806 חסם5 מתי להשתמש בהעמסת פונקציות? המקרה הנפוצ ביותר לשימוש בהעמסת פונקציות הוא כאשר משתמשיס בפונקציה לביצוע מטלה, למרות שטיפוסי הפרמטרים המוזניס לה יכולים להיות שונים מדי פעם. למשל, נניח כי בתוכנית קיימת פונקציה בשס 666צו 06 /ץ08 המחזירה מספר המתאים ליוס בשבוע (0 ליוס ראשון, 1 ליוס שני, ... ו- 6 ליוס שבת). אז ניתן לבצע העמסה של פונקציה זו, כדי שתתן את התוצאה הנכונה, בין אם הקלט הוא תאריך ג'וליאני (ץְ03 חפּווטנ) ובין אס הקלט מורכב משלושה פרמטרים המציגים את היוס, החודש והשנה של תאריך מסויס. (צ08 מ118טך 6ת66%)1 01 68 6ת1 זָ // 8 (ע68ץ 6ת1 ,087 6ת1 ,םת6תסת 6ם1)א66%ח 05 08 6ת1 ָ // 8 ] בפרקיםס הבאים נעסוק בתכונות של שפת ++6 כשפה לתכנות מונחה עצמים. העמסת פונקציות היא חלק מתכונות אלו המעניקות עוצמה ליכולת הביצוע של תוכניות מחשב. פרק 13: העמסת פונקציות ‏ 151 העמסת פונקציות משפרת את קריאות התוכנית העמסת פונקציות (0חו080!זפטס חסטסחט=) מאפשרת להגדיר בתוכנית אחת מספר פונקציות בעלות שס והה. הפונקציות המועמסות צריכות להתזיר ערך מאותו הטיפוס, אך הן נבדלות זו מזו במספר, או בטיפוסי הפרמטריס שהן מקבלות. בעבר היה על מתכנתי 6 ליצור מספר פונקציות בעלות שמות דומים, וגס לזכור מהס הפרמטריס אשר מתאימים לכל אחת מהן. כאשר משתמשיס בהעמסת פונקציות, לעומת זאת, על המתכנת לזכור שס פונקציה אחד בלבד. סיכום מנגנון העמסת פונקציות מאפשר להגדיר מספר פונקציות בעלות שס וזהה. במהלך ההידור שפת ++6 קובעת לכל קריאה את ההגדרה המתאימה, לפי המספר והטיפוס של הפרמטרים המוגדריס ומועבריס לפונקציה. לפני שנעבור לפרק הבא מומלצ לבחון אס מובניס הנושאיס הבאיסם: * העמסת פונקציות מאפשר ליצור גרסאות שונות לאותה פונקציה. * כדי להעמיס פונקציה, צריך להגדיר שתי פונקציות, או יותר, באותו שס ועס טיפוס החזרה. השוני בין הפונקציות הוא רק במספר ובטיפוס של הפרמטריס שהן מקבלות. / בומן ההחידור יקבע המהדר איזו פונקציה תופעל בעת הצורך, לפי המספר וטיפוס הפרמטריס המוגדריס והמועבריס לה. * העמסת פונקציות מפשטת את תהליכי התכנות, בכך שהן מאפשרות למתכנתים לפעול עס אותו שס פונקציה, כאשר התוכניות שלהס צריכות למלא משימה מוגדרת. בפרק הבא נציג כיצד ניתן להגדיר משתנה מיוחס בשפת ++6. פרמטריס אלה מקלים על הניהול והטיפול בפרמטרים המועברים לפונקציה. תרגילים 1. כיתבו את הפונקציות חווח ו-אח (ראו תרגיל 3 בפרק 9) עבור ארגומנטיס מטיפוס פחס! וארגומנטיס מטיפוס 8086. בידקו את הפונקציות האלו על ידי הרצת דוגמאות. 2 כיתבו פונקציות המחשבות את הממוצע של 2, 3 ו-4 ארגומנטיס (מטיפוס ז8סו). 3 | כיתבו תוכנית שמקבלת ערך ח מהמשתמש ובודקת אותו: אס 3<ח התוכנית מדפיסה ח כוכביות (י'*'). אחרת, התוכנית מדפיסה 5 סימני דולר ('%'). 2 ++6 בקלות הנלעוחזנה הונ?/יודום בעשפת ++6 בפרק 10 הצגנו כיצד ניתן לשנות את ערכס של הפרמטרים על ידי שימוש במצביעיס למשתניסם. גם הראינו, כי כדי להצביע על משתנה צריך להציב כוכבית לפני שס הפרמטר בפונקציה. שיטה וו מקורה בצורת התכנות בשפת 6. כדי להקל ולצמצס את הצעדיס הדרושים לשינוי ערך של פרמטר בשפת ++6, כוללת השפה את המושג יחל (61676066א). בפרק הזה, נראה שיחס או משתנה מיוחס הוא למעשה כינוי (שס חליפי) למשתנה המוגדר בזיכרון. בהמשך הפרק נדון בנושאים הבאים : > הצהרת משתנה מיוחס ואתחולו נעשית על ידי כתיבת הסימן 8 מייד לאחר טיפוס המשתנה ושימוש באופרטור ההשמה כדי להקצות לו ערך. לדוגמה: 2 = תת 81185 168 > כאשר מעבירים לפונקציה פרמטר לפי ייחוס, היא יכולה לשנות את ערכו מבלי להשתמש במצביע. > בכותרת הפונקציה מצהירים על פרמטר ייחוס על-ידי כתיבת הסימן 8 לאחר טיפוסו. ניתן או לשנות את ערכו של הפרמטר בתוך פונקציה, מבלי להשתמש במצביע. השימוש ביחס הופך את שינוי הפרמטריס לפעולה פשוטה מאוד. נכנה אותה: שינוי פרמטרים לפי ייחוס. פרק 14: המשתנה המיוחס בשפת ++6 153 משתנה מיוחס משתנה מלוחס (66ח₪6)076) מאפשר לציין שס חליפי, או כינוי, למשתנה המוגדר בתוכנית. הגדרת משתנה מיוחס מתבצעת על ידי הצבת הסימן 86 מייד לאחר כתיבת טיפוס המשתנה לפי הדוגמה הבאה: הגדרת משתנה מיוחטסי 7 = סתהם 81185 68ת1 לאחר הגדרת המשתנה המיוחס ניתן להשתמש בו כמו במשתנה רגיל. הנה כך: 2 = תת 81188 2 = 8218016ט בתוכנית ₪55.62 580 מוגדר משתנה מיוחס 6וחהח 3185 המשמש כינוי למשתנה זסוהטח. בתוכנית משתמשיס במשתנה הרגיל ובמשתנה המיוחס, באופן חלופי. <ם.0ת105%268> 61066ם1+ (10סט) ת81ת ב1סע ן 2 = עספסמתטת 6ם1 0ם26+628 66 6026866// ;עסמתות = תת 81185 %66ם1 ;6061 >> מעססתטם >> " פם581תסס עססתטת 18016ע8ט 6ם7" >> 0006 12 >> סתהת 81185 >> " פת81סת0ס0 עסמתטם 60 81185 6ם7" >> סטסס 72 + תת 81185 = סתהת 81185 ;661 >> מעססתטם >> " פם581תסס עססתטת 18016ע8ט 6ם7" >> 000% ;001 >> סתהת 81188 >> " פתנ1הסתסס עסמחטםת 60 81185 6ם7" >> סגטסס ו במהלך התוכנית מוסיפים את הערך 500 לערך הקייסם במשתנה המיוחס סוחפּח 5פון|8. כתוצאה מפעולה זו, ערך זה מתווסף למשתנה זספוחטח. לאחר הידור התוכנית והרצתה יוצגו על המסך שורות הפלט הבאות: <צססמע> עעת 880% <\:0 1 פתבַסת60 עפסחגת 218216ה8ט פםמך 1 פתבַסת600 עפסחטת 60 81185 6םמך 5 1 פפת681ת600 עפסחגת 218216ה8ט 6ם7 5 1 פ5פםת081ת600 עפסחגת 60 81185 6מם" השימוש במשתנה מיוחס במהלך התוכנית אינו מומלץ, מכיוו שהדבר מקשה על הבנת התוכנית. לעומת ואת, השימוש במשתנה מיוחס מקל מאוד על שינוי ערכי הפרמטריס בפונקציה, כפי שנתאר בהמשך. 4 ++6 בקלות הגדרת משתנה מיוחס בתוכנית המשתנה המיוחס הוא שסם חליפי או כינוי למשתנה המוגדר בתוכנית. כדי להגדיר משתנה מיוחס כותבים את הסימן ייש'י מייד לאחר טיפוס המשתנה. ולאחר ציון שס המשתנה המיוחס כותבים את הסימן שווה *=" שבהמשכו נמצא שס המשתנה לו מתייחסים, לדוגמה: 1 ₪ 115 = העברת פרמטרים לפי ייחוס המטרה העיקרית של משתני ייחוס היא ליישס העברת פרמטרים לפי ייחוס, ועל ידי כך להקל על שינוי ערכי הפרמטריס שבתוך הפונקציה. בתוכנית הבאה 5ק6.6אחפשפח, מוגדר משתנה מיוחס בשם 8|85 זפפוחטח המשמש כינוי למשתנה זפפוחטח. המשתנה המיוחס משמש כפרמטר המועבר לפונקציה 6טו8/ 6פַח608. בפונקציה זו מציביס לפרמטר את הערך 1001. <ת.ת108%2608> 610866םת1+ (681188 %6ם1)סגו1ט סִסֶתהת0ס 16סעט ו 2 = 81188 1 (ס1סט)מנ1נאת סנ1נסט ו ;עסמתטת 6ת1 ;צפטת = 81188 פססמתגטם 66ת1 ; (81188 ש6סתטת) 6גו81ט סחְתהַםת0ס ;1תס >> עססתטת >> "פת1נה8>תסס מססמחטת 18016עהט פם7" >> 6טסס ו בתוכנית מועבר המשתנה המיוחס לפונקציה 6טוא\ ספַח8ח6 כפרמטר. יש לציין שבהגדרת הפונקציה 6טו8/ 6ַח8ח6 מוגדר הפרמטר כמשתנה מיוחס מטיפוס זחו. (81188 %68ם1)סגו1ט סִסֶתהתס ב1סט בדרך זו ניתן לשנות את ערך הפרמטר שבפונקציה ללא צורך במצביעים. הימנעות משימוש בכוכבית (*) בתוך הפונקציה מקל על כתיבתה והבנתה. שיטת העברת פרמטרים זו נקראת העברה לפי ייחוס (6)676006ז צֶם). פרק 14: המשתנה המיוחס בשפת ++6 155 שימוש בהערות לציון שימוש בהעברה לפי ייחוס רוב מתכנתי ++6 קשורים לטכניקות תכנות של שפת 6, ובכללן השימוש במצביעים, כשיטה לשינוי ערכס של משתנים בתוך הפונקציות. עובדה זו גורמת למתכנתיס לחשוב שבהעדר מצביעים, אין ערך הפרמטר משתנה בפונקציה. כדי למנוע אי הבנות מסוג זה מומלא להרבות ברישוס הערות בתוכניות שבהן משתמשיסם בטכניקת העברת פרמטרים לפי ייחוס. בדרך וּו, המתכנתיס בשפת ++6 יבינו טוב יותר את ביצועי הפונקציות בתוכנית. דוגמה נוספת הפונקציה הבאה מוצגת בפרק 10, ותפקידה להחליף בין ערכי שני פרמטריס מטיפוט 0 (ע* 108% ,8* 81068)2108%ט ק8ח5 בנסע ו ;קתסס 11086 ;8* = 0ת66 ;כ]* = ב * ;קת60 = ₪* ] בפונקציה זו יש שימוש מעורב של משתניס שהס מצביעיס ושל משתנים שאינס מצביעים. בתוכנית הבאה, 692.=פ₪ פגשש5, מנצליסם את תכונותיהס של המשתניס המיוחסים ועל ידי כך מצמצמיס את מורכבות הגדרת הפונקציה. <ת.ת108%2608> 610866םת1+ (ע 2108%6 ,8 8106585)5108%6ט ק8ח5 ב1סע ָ ;קתסס 11086 2 = קתסם ;םס = 8 ;קתפס = םס (10סט) מ1את 1סע 11086 016 = 72 11086 8811 = 2 110868 016 81188 = 7 110868 80811 811885 = 2 ; (81188 50811 ,81188 18ס)0685ו81ט כ8ח5 ; (50811 ,ס1ס) 65ט81ט 8787 // 2 >> 16 >> " פםת1הסתסס 216" >> סטסס 12 >> 811ת8 >> " פת81סת60 50811" >> 0006 6 ++6 בקלות ניתן לראות שהגדרת הפונקציה 8165 5 מובנת יותר מגרסתה הקודמת. לעומת זאת, בתוכנית נוספו שני שמות הפרמטרים המיוחסים 885 פופ ו-95ו|3 ||5₪3, הדרושיס ליישוס השיטה. כללי העברת פרמטרים לפי ייחוס המשתנה המיוחס אינו משתנה רגיל. כאשר מייחסים ערך למשתנה מיוחס, הערך המאוחסן בו לא ניתן לשינוי. להבדיל ממשתנה מצביע, קיימות מספר פעולות שאינן ניתנות לביצוע במשתנה מיוחס: %> לא ניתן לקבל את הכתובת של המשתנה המיוחס על ידי שימוש באופרטור ייכתובת של...." (8). > לא ניתן לשייך מצביע למשתנה מיוחס. + לא ניתן לבצע השוואות לוגיות של משתניס מיוחסים. > לא ניתן לבצע פעולות אריתמטיות במשתנים מיוחסים. % אין אפשרות לשנות את שיוך המשתנה המיוחס לאחר קביעתו. בפרקיס הבאים, כאשר נציג את התכונות של תכנות מונחה עצמיס בשפת ++6, נחזור ונעסוק ביתר פירוט במשתנה המיוחס. שימוש במשתני ייחוס לשינוי פרמטרים של פונקציות כוכור לנו מפרק 10, תוכנית יכולה לשנות ערך של פרמטריס בתוך פונקציות על ידי שימוש במצביעים. פונקציה יכולה לשנות ערך של פרמטר רק אס היא מקבלת את כתובתו. כדי לקבל את כתובת הפרמטר, משתמשים באופרטור הכתובת (א). הפונקציה משתמשת במשתנים מצביעים (אשר מאחסנים כתובות גיכרון). כדי להצהיר על משתנה מצביע בתוך פונקציה, צריך לכתוב כוכבית (*) לפני שמו. כדי להשתמש בערך של הפרמטר בתוך הפונקציה, או כדי לשנותו, מוסיפים לפני כל התייחסות אליו את אופרטור ההצבעה (*). לרוע המזל, פעולות רבות בתוך פונקציות משלבות שימוש במשתניס מצביעיס ושאינס מצביעים. שילוב סוגיס שוניס של מצביעים עלול לגרוס לבלבול ולתקלות. משתני ייחוס של ++6 מפשטים את תהליך שינוי ערכם של פרמטרים, על ידי עקיפה של הצורך במשפטים המשלבים שימוש במשתנים מצביעים ושאינס מצביעים. המחיר של נוחות זו הינו תוספת משתנים, שיש צורך להכיר בעת קריאת התוכנית. פרק 14: המשתנה המיוחס בשפת ++6 157 סיכום בפרק ה למדנו כיצד להעביר פרמטרים לפונקציה לפי ייחוס. הצגנו את המשתנה המיוחס כשס חליפי, או כינוי, למשתנה שבזיכרון של המחשב. על ידי העברת פרמטריס לפי ייחוס ניתן לשנות את ערכי הפרמטריס בתוך הפונקציה. לפני שנעבור לפרק הבא נבחן אם מובנים הנושאיס הבאים: / / / / / המשתנה המיוחס הוא שם חליפי, או כינוי, למשתנה בתוכנית. כדי להגדיר משתנה מיוחס מציבים את הסימן ''8'י מייד לאחר טיפוס המשתנה. לאחר שיוך משתנה למשתנה המיוחס, ערכו של המשתנה המיוחס לא ניתן לשינוי. מומלץצ להרבות ברישוס הערות בתוכנית כדי לציין את השימוש בטכניקת העברת פרמטריס לפי ייחוס. ואת, כדי להגביר את קריאות התוכנית ולהזכיר שבפונקציות אלו ערכס של הפרמטרים עשוייס להשתנות. שימוש מורחב של המשתנים המיוחסים בתוך התוכנית עלול לגרוס לסיבוך קוד התוכנית ולפגוע בהבנת התהליכיס המתבצעים בה. בפרק הבא נציג כיצד ניתן להגדיר ערכי ברירת המחדל לפרמטרים בפונקציה. תרגילים 1 18 מהו הפלט של התוכנית הבאה? ; [08ת6 >> ; [08ת6 >> ; [08ת6 >> ; [0ת6 >> ++6 בקלות ל >% > >> א > 5% >% >> >% >> >> <בם.0ת105%268> 61066ם1+ (10סט) ת81ת ב1סע 6 >> >> = ץָ 6ת0ס1 א 10268 | 2 6ת0ס1 ץ >> סגוסס 72 = א ץ >> סגוסס 72 = ץצ ְ כיתבו תוכנית שבה כלולות שלוש הפונקציות הבאות : > 666 - מקבלת משתנה 6ט|פצ (806ז8/ 06ח₪606760) וערך 66/58, ומורידה מ-6ט81/ את 06!08. כל הטיפוסיס הס טיפוסי נקודה צפה 80סו=). % 6ח1- כמו בפונקציה 56, אבל מוסיפה את 06!%8 ל-6ט81/. > %חוזזק - מדפיסה את ערך הארגומנט שלה. כיתבו את הפונקציה כ8ש5 להחלפת ערכי משתנים (מסוג 8086) ושאינה משתמשת במשתנה עזר נוסף. פרק 14: המשתנה המיוחס בשפת ++6 159 קביעת ערני ברירת-מחדל לבפרמטרים בפרקיס הקודמיס למדנו שבשפת ++6 ניתן להעביר ערכיס לפונקציות תוך שימוש בפרמטרים שלה. בפרק 13 הצגנו את מנגנון העמסת פונקציות, שבעזרתו ניתן להגדיר מספר פונקציות המשתמשות באותו שם. הפונקציות נבדלות ביניהן על ידי המספר וטיפוס הפרמטרים. תכונה נוספת של שפת ++6 מאפשרת לקרוא לפונקציה ללא ציון הפרמטרים. במקרה וה, השפה תדאג להציב לפרמטריםס אלו ערכי ברירת מחדל המוגדריס מראש. בפרק זה נדון בנושאיס הבאים: % שפת ++6 מאפשרת להגדיר ערכי ברירת-מחדל לפרמטריס של פונקציה. +> ערכי ברירת המחדל מופיעיס בכותר הפונקציה (ז6806ח חססחט=) בעת הגדרתה. %> כאשר בקריאה לפונקציה מושמטים אחד או יותר מערכי הפרמטריס, ++6 מנצלת את ערכי ברירת המחדל, כדי להשלים את הפרמטר החסר. + כאשר בקריאה לפונקציה מושמט פרמטר אחד, מושמטים גס כל הפרמטריס הבאיס אחריו. השימוש במנגנון ערכי ברירת מחדל לפרמטרים של הפונקציה מאפשר מצד אחד להגביר את השימושיות החוזרת של הפונקציות (ניצול הגדרת הפונקציה בתוכנית אחת ויותר), ומצד שני - מקל על השימוש בפונקציה עצמח. 0 ++6 בקלות הגדרת ערכי ברירת מחדל קביעת ערכי ברירת מחדל לפונקציה הינה פעולה פשוטה וקלה לביצוע. משתמשיס באופרטור ההשמה של שפת ++6, ומציבים את הערך הרצוי לפרמטר בהגדרת הפונקציה, כמו בדוגמה שלהלן. (008%=19.95 11086 ,8126=12 6ת1)םתס61סםתט2 5086 בנסט | | / ו ערכי ברירת 98 מסנ1ססתטץ // המחדל : בתוכנית 2קס.5דוטאיפפס מופיעה הפונקציה 8זסשפוחהּזהק שוסח5, שבהגדרתה ניתניס ערכי ברירת מחדל לשלושת הפרמטריס שלה 8, 5 ו- 6. בתוכנית קוראיס לפונקציה מספר פעמים. בפעם הראשונה לא נקבעים כל פרמטרים, בפעם השנייה נקבע ערך לפרמטר 8, בהמשך נקבע ערך לפרמטריס 8 ו-5, ובסוף נקבע ערך לשלושת הפרמטרים. <ת.ת108%2608> 610866ת1+ (6=3 %ת1 ,2=ס 6ם1 ,8=1 ס6ת828(6%6258)1ק שטסם8 בנסע ן מ סי > סי ו זכ 8% > 5 7 > טסט ] (ס1סט)מנ1נאת ס1נסט ו ; () 82866628 חסםפ ; (1001) ;(2002 ,828(6%628)1001ק חסםפ5 ;(3003 ,2002 ,666285)1001ת828ק אסם5 1 8 שסםפ לאחר הידור התוכנית והרצתה יוצגו על המסך שורות הפלט הבאות : <עססתם> ‏ פ75תסתתמת <\:6 3 2-0 0 1 8 8 1001 5 2-0 3 8 8 3 6 2002 ס 1001 3 0 2002 ס 1001 ניתן להבחין בתוצאות ההרצה, שהפונקציה משתמשת בערכים הדרושים לה לפי קביעת ערכי ברירת המחדל. פרק 15: קביעת ערכי ברירת-מחדל לפרמטרים 161 השמטת ערכי פרמטרים כאשר ערך של פרמטר מסוים אינו מועבר, גס הפרמטריס שבהמשך לא יועברו לפונקציה. במיליס אחרות, אין אפשרות שלא להעביר פרמטר שהוא במרכז רשימת הפרמטרים של הפונקציה. בתוכנית הקודמת אי העברת ערך לפרמטר 5 בפונקציה 5ז סח ההק אוסח5, גרס גס לאי העברת ערך לפרמטר 6 באותה פונקציה. אין כל דרך להעביר ערך לפרמטר 6 ללא העברת ערך לפרמטר ם. הגדרת ערכי ברירת מחדל לפרמטרים בעת הגדרת פונקציה, מאפשרת ++6 להגדיר ערכי ברירת מחדל לפרמטר אחד או יותר, כדי שאפשר יהיה לנצל אותם, אם בעת הקריאה לפונקציה יושמטו פרמטריס כלשהסם. כדי להגדיר ערך ברירת מחדל לפרמטר, יש להשתמש באופרטור ההשמה בהגדרת הפונקציה. לדוגמה, הפונקציה הבאה, |וסזץְאם, מגדירה ערכי ברירת מחדל לפרמטרים פזטסח ו- 866 : (((0 2 5) ופ 51 סה 1605 כו 51% ₪ ) ופפ 15 ָ 8 // / כאשר בקריאה לפונקציה מושמט פרמטר אחד, מושמטים בהכרח גם כל הפרמטרים העוקבים לו. סיכום בפרק הנוכתי הצגנו כיצד לקבוע ערכי ברירת מחדל לפרמטריס של הפונקציה. בפרקיס הבאיס נדון בתכונות של ++6 כשפה לתכנות מונחה עצמים, וננצל את קביעת ערכי ברירת מחדל של הפרמטרים לאתחול משתניס שוניס בתוך המחלקה. לפני שנעבור לפרק הבא מומלצ לבחון אס מובניס הנושאיס הבאים: * קביעת ערך ברירת מחדל מתבצע על ידי שימוש באופרטור ההשמה להצבת הערכיס הרצוייס לפרמטריס בכותרת הגדרת הפונקציה. * הפונקציה תפעיל את ערך ברירת המחדל של פרמטר כאשר בקריאה לפונקציה לא יועבר ערך לפרמטר הזה. * כאשר תוכנית אינה מעבירה ערך של פרמטר, התוכנית חייבת להשמיט את הערכיס של כל הפרמטריס העוקביס - תוכניות לא מסוגלות להשמיט ערך של פרמטר מסויס בלבד. 12 ++6 בקלות בפרקיס הקודמיס למדנו שניתן לאחסן במשתנה ערכים המוגדרים לפי טיפוסים זחו, 8% וכוי. בפרק 16 נציג כיצד ניתן לשמור מספר ערכים מאותו טיפוס בתוך מערך. למשל, 100 ציוניס של תלמידיס בכיתה, או המחיר של 50 פריטים. השימוש במערכיס והגישה לערכיס המאוחסניס בהם, הן משימות קלות מאוד ליישוס. תרגילים 1. כיתבו מחדש את תרגיל 2 מפרק 14, אלא שהפעם, אס הקריאה לפונקציות 066 ו-6חו אינה מציינת מפורשות את %8, מניחיס שערכה הוא 1. 2 כיתבו פונקציה אשר מדפיסה פירמידה, שגובהה וצורת הלבנה שלה (התו ממנו היא מורכבת) הס קלטים לפונקציה. ברירת המחדל היא 10 ו-יי*יי בהתאמה. 3 כיתבו פונקציה +₪א6 אשר מעלה מספר א מטיפוס 608% בחזקת מספר ח מטיפוס +חו 60ח0ופחט. אס הקריאה לפונקציה אינה מציינת מפורשות את ח, מניחיס שערכו של המשתנה הוא 1. פרק 15: קביעת ערכי ברירת-מחדל לפרמטרים 163 חלק 3 אחושון מאידע במערכים ובמבני רעווונלה בפרקיס הקודמיס למדנו שבמשתנה אחד ניתן לאחסן ערך אחד על-פי טיפוס המשתנה. בתוכניות שהצגנו בשני החלקיס הראשוניס של הספר, הצבנו ערך אחד לכל משתנה שהוגדר. תוכניות מורכבות צריכות בדרך כלל לנהל מידע רב בומן נתון. למשל, 100 ציוניס של תלמידיס בכיתה, 20 תוצאות של משחקי כדורגל או שמות וכתובות של 5000 העובדיס של מפעל גדול. בחלק הנוכחי של הספר נלמד להשתמש בטיפוסי נתוניס שוניס כדי לאחסן ערכיס שוניס באותו משתנה. בהמשך נראה שניצול משתנה אחד לאחסון מספר רב של ערכיס הוא מאוד נפוצץ ושימושי בתוכניות בשפת ++6. חלק זה כולל את הפרקים הבאים: ד פרק 16 - מערכיס פרק 17 - מחרוזות תוויס פרק 18 - מבני רשומות פרק 19 - איגודים ב נצ נ ם פרק 20 - מצביעים 15 6 ++6 בקלות מלערלים בתוכניות שהצגנו בפרקים קודמיס אוחסנו נתונים במשתניס במהלך הרצת התוכנית. עד כאן הקצבנו לכל משתנה ערך אחד. בדרך כלל, ברוב התוכניות נדרש טיפול במספר ערכים העוניס על אותה הגדרה. למשל, 50 ציוניס של תלמידיס בכיתה, 100 כותרים של ספרים, או 1000 שמות של קבציסם. במקרים אלה ניתן להשתמש במערכים. הגדרת המערך (עְ8זז4) כוללת את שם המערך, טיפוס המערך ואת מספר הערכים או איבריס שניתן לאחסן בו. בהמשך הפרק נדון בנושאים הבאים : מערך (עְבזזה) הוא מבנה נתוניס, המאפשר לאחסן מספר ערכיס במשתנה יחיד. בעת הצהרה על מערך, יש לציין את טיפוס איברי המערך ואת מספר הפריטים (איבריס, %5ח6ח6!6 עְה8ּזזה) שיאוחסנו בו. כל האיברים במערך חייבים להיות מאותו הטיפוס (זבּח6, זחו וכדי). כדי לאחסן ערך במערך, יש לציין את מספר איבר המערך שבו יאוחסן הערך (המספור מתתיל מאפס)/). כדי לגשת לערך המאוחסן במערך, יש לצייןו את שם המערך ואת מספר האיבר שבו מאוחסן הערך. כאשר מצהירים על מערך, ניתן להשתמש באופרטור ההשמה כדי לאתחל את איברי המערך בערך רצוי כלשהו. ניתן להעביר משתניס מטיפוס מערך לפונקציה, כשס שמעבירים לפונקציה כל פרמטר מטיפוס אחר. בשפת ++6 השימוש במערכים הוא נפוץ ומקיף מאוד. בפרק 17 נציג את השימוש במערכיס להרכבת מחרוזות של אותיות (כגון כותריס של ספרים, שמות של קבצים וכו') אשר בהגדרתס הס מערכים של תוויס. פרק 16: מערכים 167 הגדרה של משתנה מטיפוס מערך משתנה מטיפוס מערך (עְ3זוז4) הוא משתנה המסוגל לאחסן בתוכו מספר ערכים. בדומה לתכונות של המשתנים שהצגנו עד כה, המערכים חייבים להיות מוגדריס לטיפוס נתון מסוים (כגון +חו, ז8ח6 או 608%) ולכל מערך חייב להיות שם. בנוסף לתכונות אלו, בהגדרת המערך ניתן להוסיף את מספר הערכים שהוא יהיה מסוגל לאחסן. הערכים שמערך מאחסן חייבים להיות מאותו טיפוס, וזה אומר שאין המערך מסוגל לקלוט ערכים מטיפוסים שונים. בהגדרה הבאה, המערך 500765 65%+ מתוכנן לאחסן 100 ציוני מבחניס שוניס. טיפוס המערך 2] 50068 ₪686 6ם1 גודל המערך -) לפי הגדרה זו, המהדר של שפת ++6 מקצה בזיכרון מקוס אשר יספיק לאחסון 100 ערכיס מטיפוס סחו. הערכיס שמאותחסניס במערך נקראיס איברי המעוך (60%5וח6!6 צְבּזיזה). מערכים מאחסנים ערכים רבים מאותו סוג כאשר כותביס תוכניות מורכבות, דרוש לפעמיס להשתמש במשתניס רביס מאותו טיפוס (06ע, סוג), כמו למשל מחיריס של 50 פריטים, או שמות של 100 עובדים. במקוס לעבוד עס מספר גדול של משתנים, אשר לכל אחד מהס שס נפרד ושונה, ניתן להגדיר מערך, שהוא משתנה אחד, והוא זה שמכיל מספר ערכים הקשורים זה לזה. כדי להגדיר מערך, צריך לציין את סוגו (06ץ1) ואת מספר האיבריס שיכיל, ולתת לו שם ייחודי. לדוגמה, המשפטים הבאים מגדירים שלושה מערכים שונים: 606 עפ 515 ;[100] 806 60010766 6ם1 8 [25] 1₪55פפן ₪868 21956 גישה לאיברי המערך במשתנה מסוג מערך ניתן לאחסן מספר ערכים. כדי לגשת לערך מסויס במערך נעזריס בערך אינדקס (סט!בּע א10₪6%), המצביע על האיבר הרצוי במערך. למשל, כדי לגשת לאיבר הראשון של המערך 5606 %8% ערך האינדקס שעלינו להשתמש בו הוא 0. האינדקס של האיבר השני הוא הערך 1, האינדקס של האיבר השלישי הוא הערך 2 וכך הלאה. בתרשים 16.1 מתוארת שיטת האינדקס של המערך כאשר האינדקס של האיבר הראשון במערך הוא 0 והאינדקס של האיבר האחרון במערך שווה לגודל המערך (מספר האיבריס) פחות 1. 8 ++6 בקלות +086 5001768]0[ +086 5001768]1[ +086 5001768]2[ +086 50601768]97[ +086 50601768]98[ +086 50601768]99[ תרשים 16.1: סימון האינדקס של איברי המערך. יש להדגיש, כי בשפת ++6 תמיד ערך האינדקס של האיבר הראשון במערך הוא 0, והאינדקס של האיבר האחרון הוא גודל המערך פחות 1. בתוכנית <9ס6.+צהחחא מוגדר מערך בשס פסט]פצ המתוכנן לאחסון חמישה ערכיס מטיפוס זחו. בתוכנית מתבצעת השמה של הערכים 100, 200, 300, 400 ו- 500 לחמשת האיבריס של המערך. <ת.ת108%2608> 61086םת1+ (16סט) מ1את ב1סע ז ץה8עעה 6ם6 6ע60182ק // ;[5] 781065 6ם1 2 = [65]0ג810 2 = [65]1ג810ט 2 = [65]2ג810ט 2 = [810659]3ט 2 = [65]4ג810ט ;601 >> "68ט1א8ט סת1חס011+ 6םת6 8ם81סתסס ץ8עע8 6ם7" >> סטסס [2] 81068 >> ' ' >> [85]1ט81ט >> ' ' >> [68]0ג810ט >> סגטסס 12 (%> [68]4מ81ט >> ' ' >> [68]]3טמ1ה8ט >>' ' >> ו האיבר הראשון במערך (הערך 100) מוגדר בכניסה [0] אפס ([0]פס|ע). האיבר האחרון (הערך 500) מוגדר בכניסה [4] ארבע (גודל המערך (5) פחות 1). פרק 16: מערכים 169 שימוש בערך אינדקס כדי לגשת לאיברי המערך המערך, כפי שכבר למדנו, מאפשר לאחסן מספר רב של ערכיס באותו משתנה (משתנה המערך). כדי לפנות אל ערכים כלשהס במערך, התוכנית צריכה להשתמש בערכי אינדקס. ערך אינדקס (6ט|א/ א06ח1) מציין את המספר הסידורי של איבר המערך שאליו המתכנת רוצה לפנות לקריאה או כתיבה. לדוגמה, המשפט הבא מקצה את הערך 100 לאיבר הראשון במערך, אשר שמו הוא 500765: 72 = [0] 65ע5002 שים לב! המספור תמיד מתחיל מ- 0/ בעת ההצהרה על מערך מגדיריס את מספר האיבריס שיכיל. המשפט הבא מצהיר על מערך מטיפוס אחז בעל 100 איברים: ק 1100 566 ור במקרה זה, איברי המערך הס [0] 500165 עד [99] 560765. משתנה אינדקס הדרך הנפוצה לביצוע פעולות במערכיס של התוכניות היא להיעזר במשתנה המשמש כאינדקס לאיברי המערך. למשל, המשפט הבא יגרוס להצבת הערך 400 באיבר [3]ָפסטוה/, בהנחה שבמשתנה ו מאוחסן הערך 3. 81065 ]1[ = 72 בתוכנית הבאה, ק6.אאא2/ש53₪0, נעזריס במשתנה 1 כמונה לולאת זס) וכאינדקס המאפשר הצגת הערך של איברי המערך במסך. הערך ההתחלתי שהלולאה מציבה במשתנה ! הוא 0, כך שהוא מתייחס לאיבר הראשון של המערך [0]פפט81/. הלולאה מסתיימת כאשר הערך של ו גדול מ- 4 (המתייחס לאיבר האחרון במערך). <ת.ת108%2608> 86ט610םת1+ (16סט) מ1את ה1סע ן ץהעעה8 6ם₪ 6ע60182ק // ;[1069]5א8ט 6ת1 12 16 781065]0[ = 2 81065]1[ = 2 781065]2[ = 2 781065]3[ = 2 781065]4[ = 2 2 >> "81068ט 8ת1ח0ס5011 6םת₪ פםת1אפתסס צץ8ע822 6ם71" >> סטסס 1+6(‏ ;12>6-9 ?0 = 1) ע0ס5 ק' ' >> [810685]1ט >> 0006 0 ++6 בקלות בכל פעם שהלולאה מקדמת את ערך המשתנה 1, מתאפשרת הגישה לאיבר הבא במערך. מומלצ להריץ שוב את התוכנית ולערוך את השינוייס הבאיס ללולאת ז10: (=- 0 א 1 402 = 5), מס ק' ' >> [810685]1ט >> 0006 במקרה זה, התוכנית תציג את הערכיס המאוחסניס במערך, מהאיבר האחרון ועד לאיבר הראשון. קביעת ערכי המערך במשפט ההגדרה כבר ראינו שבשפת ++6 ניתן לקבוע ערך התחלתי למשתניס במשפטי ההגדרה שלהם. הדבר נכון גם בקשר למערכים. אתחול המערכיס במשפט ההגדרה שלהם מתבצע על ידי רישוס ערכיס של המערך בתוך סוגרייס מסולסלים, כאשר בין הגדרת המערך והסוגרייס כותבים את הסימן שווה. לדוגמה, המשפט הבא מבצע אתחול של המערך 5: קביעת ערכים לאיברי המערך. ;[ 500 ,400 ,300 ,200 ,100 + = [81065]5ט %ם1 בצורה דומה, המשפט הבא מבצע אתחול של מערך מטיפוס 3%סן1: ;ן( 50000.00 ,35000.00 ,25000.00 + = [18₪5]3ע58182 1108% רוב המהדריס של שפת ++6 מציבים את הערך אפס לאיברים שלא מציינים עבורס ערך התחלתי כלשהו במשפט ההגדרה. לדוגמה, במשפט הבא מתבצע אתחול של שלושת האיבריס הראשוניס של המערך המונה חמישה איבריס: ;ן 300 ,200 ,100 + = [810658]5ט %6ם1 האיבריס [3]פַט!4ע ו- [8!065]4צ אינס מקבליס ערך התחלתי כלשהו. על ידי אתחול המערך במשפט ההגדרה ניתן לקבוע את גודלו, ללא ציון מפורש של הגודל. המהדר מכין מקוס בזיכרון לאחסון מספר האיבריס המצוינים בתוך הסוגריים המסולסלים. ההגדרה הבאה למשל, יוצרת מערך שגודלו מתאיס לאחסון ארבעה ערכים מטיפוס זחן : ;( 4 ,3 ,2 ,1 + = []פמ6סתטת 6ם1 פרק 16: מערכים ‏ 171 העברת מערכים לפונקציות כשס שאפשר להעביר לפונקציה ערכיםס של משתנים, אפשר להעביר לה גם מערכים. הפונקציה יכולה לאתחל מערך, לעדכן את הערכיס המאוחסנים בו, או להציג אותס על המסך. הפונקציה מקבלת את כתובת המערך ולכן היא מתייחסת למערך המקורי. להעברת המערך לפונקציה צריך לציין את טיפוס המערך, אך לא את גודלו. בדרך כלל המערך מועבר לפונקציה כפרמטר, לפי התחביר המוצג בדוגמה שלהלן. ; (%8מ006ת616 05 מסמתטםת %ם1 ,[]7ץ8228 6ת1)תסנ1ססםתט2 5006 ב1סט בתוכנית 9ק6.אטפצא חאה הפונקציה זז עשסח5 מקבלת כפרמטר את המערך ומציגה את ערכי האיברים שלו על המסך. כאן המקוס להזכיר, כי בשפת ++6 ההפרדה בין משפטים נקבעת על ידי נקודה-פסיק. לכן, פיצול שורה או הוספת רווחים בין הפקודות שבמשפט לא קובעיס את סיומה ולא משפיעים על מהלך הרצת התוכנית. בדרך זו ניתן לפצל את המשפטים למספר שורות כדי שהתוכנית תהיה ברורה וקריאה יותר. <ת.ת108%2608> 86ט610ת1+ (%8ת610006 01 עססתטם 6ת1 ,[]ץ8228 6םת1)ץ8228 טסם8 בנסט ָ 12 סם1 (++1 ;%8ת61000 05 עפסתטת > 1 ;0 = 1) 108 ;' ' >> [1]ץ28ע8 >> סגוסס 000% >> 601; (ס1סט) מ1את 18סע | ;[ 5 ,4 ,3 ,2 ,1 + = [5] פע6מתטת 116%16 6םת1 ;[ 3000 ,2000 ,1000 + = [3]פע6סתטת 16ס 6ת1 ;(5 ,628מתטת 7)116%616ץ8228 שסם5 ;(3 ,פמ6מחטת 7)016ץ8228 חסם5 במשפט הקריאה לפונקציה, שבדוגמה הבאה, המערך מועבר על ידי ציון שמו: ; (5 ,8ע62מתטת 7)116616ץ8228 חסםפ5 בתוכנית 9ק6.ץ4ח דפ"6, תפקידה של הפונקציה 65ט81/ 06% הוא להציב ערך לשלושת האיבריס הראשונים של המערך פזסטוחטח. 2 ++6 בקלות <ת.ת108%2608> 86ט610ת1+ (%8ת610006 01 עססתטם 6ת1 ,[]7ץ8228 6םת065)1מ81ט 666 בנסעט ָ 16 12 (++1 ;%68ת61000 05 עספסתטת > 1 ;0 = 1) 1058 ָ ;" :" >> 1 >> " 6ט1אט עססתםע" >> סטסס ;[1] ץ8228 << ם1ס (16סט) מ1את ה1סע | ; [3] פשצס6מתום %ם1 ; (3 ,5ע6קות) 68גו81ט 966 12 >> "פשאס2011 88 826 65גמ1הט 82287 6ם7" >> סטסס (1+4 ;3 > 1 ;0 = 1 6ם1) 10 12 >> [1]פע6סתטת >> 0006 ו המערך מועבר לפונקציה על ידי ציון שמו. הפונקציה מציבה ערכים במערך: הלולאה מציבה ערך לאיבר התורן. בפרק 20 נלמד ששפת ++6 מעבירה לפונקציה את המערכים על ידי שימוש במצביעים. לכן ניתן לשנות את ערך האיבריס של מערך בתוך הפונקציה. סיכום בפרק זה למדנו שניתן לאחסן מספר ערכים, מאותו סוג במשתנה אשר מוגדר כמערך. בשפת ++6 יש שימוש רב במערכים. לפני שנעבור לפרק הבא מומלצ לבחון אס מובניס הנושאיס הבאיס : / / % המערך הוא משתנה המסוגל לאחסן מספר ערכים מאותו טיפוס. משפט הגדרת המערך כולל את טיפוס המערך, שס המערך ומספר הערכיס שיאוחסנו בו. הערכיס שמאוחסניס במערך הס איברי המערך (%05ח6ח6!6 שפזזה). הערך הראשון של המערך מאוחסן באיבר אפס ([0]ץ878). הערך אחרון מאוחסן באיבר האחרון של המערך, שמספרו נקבע לפי גודל המערך פחות 1. פרק 16: מערכים ‏ 173 / / בדרך כלל נעוריס במשתני אינדקס לשם גישה לאיברי המערך. כאשר מעביריס מערך כפרמטר לפונקציה, יש לציין בפונקציה את טיפוס המערך ואת שמו. אין צורך לציין את גודל המערך. בפרק 7 נציג את המחרוזות וכיצד לעבוד איתן. נראה שמחרוות היא על פי ההגדרה מערך מטיפוס זהּח6, כלומר - מחרוזת תווים (9ח!זל5 3366 6). תרגילים 4 כיתבו פונקציה המקבלת מערך של שלמים שאורכו 10, ומחזירה את ערכו של המספר הקטן ביותר במערך. כיתבו בנוסף שיגרה חופוח, המפעילה את השיגרה הזו ומדפיסה את התוצאה. כיתבו תוכנית המקבלת מהמשתמש מספרים, עד אשר יקיש את המספר 1-. כאשר הוקש מספר זה, יש להדפיס את כל הספרות שנקלטו בסדר הפוך (הניחו שהמשתמש מקיש פחות מ- 10 מספרים). כיתבו תוכנית המקבלת מהמשתמש מספרים בטווח 0 עד 49, עד אשר הוא מקליד ערך שנמצא מחוץ לטווח. כעת יש להדפיס עבור כל ערך בתחוס את מספר הפעמיס שהמשתמש הקליד אותו. כיתבו פונקציה המקבלת שני מערכיס של עשרה ערכים שלמים (חו). מניחים שכל אחד מהמערכיס הינו ממוין. השיגרה צריכה להדפיס בצורה ממוינת את כל המספרים המופיעים בשני המערכים. ++6 בקלות נלרורוזותת חווים מחרוזות (85ח5671) הן מבניס המתאימיס לאחסון מידע כגון שמות קבציס, כותרות של ספרים, שמות העובדים וצירופי אותיות אחריס. ברוב התוכניות הכתובות בשפת ++6 יש שימוש במתרוזות. בהמשך הפרק נראה שמחרוזות התווים (5%71005 6₪3736%675) הן מערכיס מטיפוס ז8ח6 המסתיימים בתו המיוחד 11 (0 5011). בפרק זה נבחן בפירוט מחרוזות תוויס. נלמד לאחסן ולטפל במחרוזות תוויס כדי להשיג יתרונות הנובעיס משימוש בפונקציות של ספריות ההרצה (165ז8ז!! 6והסחטף). בהמשך הפרק נדון בנושאיס הבאים : > הגדרת מחרוזת בתוכנית - הגדרה של מערך מטיפוס זְהח6. *> השמה של תוויס במחרוות - השמה של תוויס באיברי המערך. > חשיבות התו המיוחד 1!1וא (0 5611), כדי לציין את התו האחרון במחרוזת. % אתחול של מחרוזת יכול להעשות בעת ההגדרה שלה. > העברת מחרוזות לפונקציות, בדרך כלל דומה להעברת כל מערך אחר. % שימוש בפונקציות של ספריות ההרצה 6וחש-חטז כדי לטפל במחרוזות תוויס. בשפת ++6 המחרוזות מאוחסנות במערכיס של תווים. ברוב התוכניות הכתובות בשפת ++6 יש שימוש במחרוזות, ועל כן מומלץ להריץ את כל התוכניות שבפרק זה, כדי לתרגל את השימוש במחרוזות. ראוי לשים לב לכך שעבודה במחרוזות תווים דומה לעבודה במערכים, כפי שראינו בפרק 16. פרק 17: מחרוזות תווים | 175 הגדרת מחרוזת בתוכנית בתוכניות הכתובות בשפת ++6 מנצליס את תכנות המחרוזות לאחסון שמות אנשים, שמות של קבצים ומידע אחר המבוסס על תוויס ואותיות. הגדרת המחרוזת נעשית על ידי הגדרת מערך מטיפוס זַח6 שגודלו מתאיס לדרישות התוכנית. למשל, התוצאה של ההגדרה הבאה היא יצירת משתנה מטיפוס מחרוזת בשס 6ו8ח1!6 שמסוגל לאחסן 64 תוויס (יש לזכור שהתו המיוחד 11א הוא חלק מתוך 64 התווים). ; [64 ] 6ת8ת116+ עַַםס בתרשיס הבא (17.1) מוצגת בצורה גרפית ההגדרה, כאשר אינדקס המערך מתחיל באיבר [806]0ח8!6 ומסתיים באיבר [6]63וההחס6!ם. [60 3 116 [1 ]6 ת116 [16]62ח3 ת116 [6]63 3 ת116 תרשים 17.1: מחרוזת בשפת ++6 היא מערך מטיפוס ז60. הדבר הראשון המבדיל בין המערכים הרגיליס וביןו המחרוזות בשפת ++6 הוא אופן סימון סוף המחרוזת. בשפת ++6 סוף המחרוזת מצוין על ידי התו המיוחד 11א שהוא תו 45011 שערכו 0. הוא מוגדר בשפת ++6 כתו מיוחד '0\'. לכן, לאחר השמה של תוויס במחרוזת יש להציב את התו 1!)וא ('0\') לאחר התו האחרון של המחרוזת. לדוגמה, בתוכנית 629 ד8"5 הפוג נעזריס בלולאת זס+ כדי להציב במשתנה זטּחפוהּ את אותיות האלף-בית הלועזי ( מ- 4 עד 2 ). בהמשך, התוכנית מציבה בסיוס המחרוזת את התו 11א, ומציגה על המסך את תוכן המחרוזת תוך שימוש בפקודה א <ת.ת108%2608> 61086םת1+ (ס1סט) מ1את 1סע | תא 108ק 1686628 26 //‏ ;[8206%]27םק81 עַהַםס ;1606672 עהםס ;66%ת1 6ם1 6 ++6 בקלות ;ק'7' >> ע168%0% ;0 = א8פסם1 ,'ת' = ע1₪%66) 02ס+ (++א06ם1 ,++ע16%%62 72 = [א00ם806%]1מםק81 2 = [8א060מם1] 806%םס81 2 %6>> " 826 1666028 6ם71" >> סטסס ו יש לשים לב שהתוכנית מציבה את התו 11)\ בסיוס המחרוזת, וכך היא מציינת בה את האיבר האחרון שלה. 2 = [8א060מם806%]1םס81 כדי להציג מחרוזת על המסך, משתמשים בפקודה +ט60, אשר מנתבת את המחרוזת אל ערוץ הפלט, עד לתו 1ושא. כעת נתבונן בלולאה זס) של התוכנית. ניתן לראות שהלולאה קובעת ערך התחלתי לשני משתנים: ז60%6! ו-א66ח1 ומקדמת את ערכס. כאשר משתמשים בלולאה זס+ בשני משתני עזר, יש להפריד ביניהם בפסיק. ;'5' >> ע168%0 ;0 = אפסם1 ,'ת' = ע16₪%60%) 02ס+ (++א06ם1 ,++ע165%62 הצבה אוטומטית של ו וטא למחרוזות בשפת ++6 בכל התוכניות בספר זה הצבנו מחרוזות תוויס בין גרשיים, כמו בדוגמה זו: "%ת8%68ת00 08ם1ע562 8 15 15םק" כאשר מגדיריס מחרוות, שפת ++6 מציבה בצורה אוטומטית את תו 11שא בסיומה, כפי שמוצג בתרשיס הבא. תרשים 17.2: הצבה אוטומטית של התו 011א בסיום המחרוזת. התו ‏ 11)א, שהמהדר מציב בסוף המחרוזת קובע לפקודה 600% את סיוס הצגת המחרוזת שהועברה לערוצ הפלט. פרק 17: מחרוזות תווים | 177 התו המיוחד !וטא מחרוזת מוגדרת כמערך של תוויס שבסיומו נמצא התו 11/וא (י0\י). הגדרת המחרואת בתוכנית היא למעשה הגדרת מערך מטיפוס זגג6. במהלך התוכנית מתבצעת פעולת השמה של תווים למחרוזת, והתוכנית מוסיפה למחרוות את התו 1ושא\ המסמן את סוף המחרוזת. לעומת זאת, כאשר מגדיריס מחרוזת על ידי הכנסת התוויס בתוך גרשייס כפולים, מהדר ++6 מציב אוטומטית את התו 11)\ בסוף המחרוות. רוב הפונקציות בשפת ++6 מתבססות על העובדה שהתו 11ש\ מסמן את סוף המחרוות. התוכנית הבאה, %011.699א1007, משנה במקצת את התוכנית הקודמת, על ידי שימוש בלולאת זס+ להצגת תכולת המחרוזת : <ת.ת108%208> 610866םת1+ (ס1סט) מ1את 1סע ן ענטא 8ט10ק 6282806628 26 // ; [27] 8266ם810 שהַםס ;5672 עהתס ;אסשת1 6ם1 ,4+ע16%502 ;'2' >> ע1₪%66% ;0 = א66בםת1 ,'ת' = 18%6602) מ05ס+ (++א068ם1 2 = [א0₪0ם1] 806%6מםק81 2 = [א6₪0ם1] 806%מם810 (++א006םת1 ;2תסא =! [א060%ם1] 06%6ס8םתק81 ;0 = א0₪6ם1) 102 ; [068ם1] 806%םק81 >> סטסס ;ק01ת6 >> 00086 ] כפי שניתן לראות, לולאת זס+ בוחנת את התוויס במחרוזת, וה אחר זה. אם התו אינו 1 (כלומר, מסמן את התו האחרון במחרוות), הלולאה מציגה את התו, מקדמת את האינדקס המציין את המספר הסידורי במערך, וממשיכה את התהליך. 8 ++6 בקלות ההבדל בין 'גַ' לבין "ג" חשוב להבין מה הוא השוני מבחינת ++6 בין תו הנמצא בתוך גרשיס בודדיס (דוגמת '\') לבין אותו תו, כאשר הוא נמצא בתוך גרשים כפולים (דוגמת ""). התו הנמצא בתוך גרשים בודדים הינו תו קבוע (%ח6075%3 ז68786%0) מטיפוס ז8ח6. המהדר מקצה עבורו שטח זיכרון שגודלו בית אחד, המתאיס לאחסון קבוע מסוג תו. במקרה השני, כאשר התו נמצא בין גרשיס כפולים, לפנינו קבוע מחרוזת (+ח6075%3 8ַחוו5%) שמכיל את התו עצמו ואת התו 011א שנוסף אוטומטית על ידי המהדר כדי לציין את סוף המחרוזת. לכן, המהדר מקצה שטת שגודלו שני בתיס בזיכרון המחשב לאחסון מחרוזת תו. בתרשיס 17.3 מתואר כיצד מהדר שפת ++6 מאחסן בזיכרון קבוע מטיפוס תו '' וקבוע מטיפוס מחרוזת "א". תרשים 17.3: אופן אחסון קבוע מטיפוס תו וקבוע מטיפוס מחרוזת. אתחול המחרוזת בפרק 16 הצגנו את אופן אתחול המערכים במשפט ההגדרה שלהם. מבחינה זו, אתחול המחרוזות אינו שונה. כדי לקבוע ערך התחלתי למחרוות תוויס במשפט ההגדרה, יש לכתוב את המחרוזת הרצויה בתוך סוגריים כפולים, כדלקמן: ;"++0 צֶס 66טספ6ת" = [₪1816]64 מאתס כאשר מספר התוויס הרשומיס במחרוות קטן מגודל המחרוזת המוגדר, המהדר מציב את התו 011\ לשאר התוויס במחרוזת. לעומת זאת, כאשר בהגדרת המחרוזת לא מצייניס את גודל המחרוזת, המהדר יקצה לה שטח זיכרון, המתאיס לאחסון מספר התוויס הדרוש ועוד התו 1!א. ;"++6 צס 6500606ת" = []61816 עַאםס בתוכנית 8.625ז5 זנא1 מתבצע אתחול של מחרוזות במשפטי הגדרתן. פרק 17: מחרוזות תווים | 179 <ת.ת108%2608> 610866ת1+ (16סט) מ1את ב1סע ָ ;"++0 שס ססטספפ2" = [61616]64 פהתס ;"05ת1ע8%2 028280662 0ם01ם6625%8םתס" = [165998902]64 עַַםתס 12 >> 01616 >> " :א0%ס2" >> 0006 2 >> 16989890 >> " :ם265950ת" >> 0006 ו ברוב התוכניות המוצגות בהמשך הספר נאתחל את המחרוזות במשפט ההגדרה שלהן. העברת מחרוזות לפונקציות העברת מחרוזת כפרמטר לפונקציה נעשית בצורה דומה להעברת מערך רגיל. בהגדרת הפונקציה יש להגדיר את הפרמטר מטיפוס 6031 ולהציב אחרי שמו סוגריים מרובעים. אין צורך לצייו את גודל המחרוזת המתקבלת. לדוגמה, בתוכנית 5ק6.אד5 ששסו5 מוגדרת פונקציה שתפקידה להציג מחרוזת כלשהי על המסך. <ת.ת108%2608> 866ט610םת1+ ([]0ם1ע8%6 82ת06)0ם5621 טסם8 בנסע ן ;01 >> 8ם1ע85 >> 0006 (ס1סט) ת1נאת ה1סט ו ;("!++0 ,6110ת")6ם5621 אסם5 ; ("++6 צס 326850000 ם66ס 6ט'6)"1ם5621 טסם5 ניתן לראות שהפונקציה 9ח571 צוסח5 מתייחסת לפרמטר המחרוזת כאל מערך רגיל. ([]0ם1ע86 06)0282ם5621 טסם8 בנסט בפרק אה למדנו שהפונקציות בשפת ++6 נעזרות בתו 11 כדי לזהות את סוף המחרוות. בתוכנית 692.א5! אד5 מוגדרת פונקציה 0%0ח6| פַחו5₪ אשר סורקת את המחרוזת שהיא מקבלת כפרמטר עד לתו 1!1וא, וכך היא מחשבת את גודל המחרוזת. במהלך התוכנית מועברות לפונקציה מספר מחרוזות שונות. 0 ++6 בקלות <ת.ת108%2608> 610866םת1+ ([]6ם1ע8% מַַַתס)תססַת16 סַם1ע8% 6ת1 ן יתיה שתנםססת 0כ// ;(++1 ;'0\' =! [6]1ם8021 ;0 = 1) ע0ס1 %% סם 1000 סגס // 68280662 // 1%ע56 שת 0% מ6%ת16 6ת7 //‏ ;(1)םע660ת ] (0ס1סט) תנאת ה1סט ו ;"++6 לס 26500686" = []₪1616 עַַַםתס ;"5חם1ע5% 028280062 8מם01םת62568בתש" = []ם16550 עַַַתס >> " פת81ס6ת00ס" >> 01616 >> " 6ם1ע56 6ם7" >> סטסס 12 >> "082806628 " >> (61%616)ם0%מם16 שַם1ע56 >> " 8ת681ת00">> ם18990 >> " ש0ם1ע86 6ם7" >> סטסס 12 >> "082806028" >> (ם16550)ם16206 סַם5621 ו פונקציות רבות בשפת ++6 סורקות מחרוזות עד למציאת התו 11)א בדרך שהצגנו בתוכנית הקודמת. ניצול העובדה שערך קוד 1 של התו )ועא הוא 0 בפרק 7 למדנו שערך 0 מייצג מצב של תנאי שקרי (שאינו מתקיים, 68156) ולפיכך, מכיון שהתו 011 מסומל בקוד 45611 על ידי הערך 0, ניתן לפשט את פעולתן של לולאות רבות: פונקציות רבות סורקות מחרוזות בשיטת תו אחר תו, כדי למצוא את התו 11א. לדוגמה, לולאת זס+ הבאה ממחישה כיצד פונקציה עשויה לחפש תו 1 וא במחרוזת : (++%א006ם1 ;עתסא =! [א06%ם1] 6ם1ע8%6 ;0 = א6₪6ם1) 102 , פרק 17: מחרוזות תווים | 181 מכיון שערך התו 11/\א הוא 0, לולאות רבות המחפשות את התו הזה במחרוזת ניתנות לפישוט באופן הבא : (+4א006ת1 ;[א06ם1] 6םת1ע8% ;0 = א6₪60ם1) 102 במקרה זה, כל עוד הביטוי [א06חו]9ח5%71 אינו 11טא (הערך 0 מצייו תשובה שלילית, מצב שקרי), הלולאה ממשיכה לפעול. פונקציות מחרוזת של ספריית ההרצה הסטנדרטית בפרק 11 למדנו שרוב המהדרים של שפת ++6 כוללים אוסף של פונקציות רבות עוצמה הנקרא ספויית הרצה סטנדרטית (עזבּזפ!!| 6וש-חטם), או בפשטות: פונקציות ספריה. בספריה זו נמצאות פונקציות רבות, המטפלות במחרוזות. לדוגמה, הפונקציה זקטז5% ממירה את האותיות הלועזיות הקטנות לאותיות גדולות. פונקציה נוספת היא חשוזז5, המחזירה את מספר התוויס שבמחרוות מסוימת. בנוסף, קיימות פונקציות המאפשרות לסרוק מחרוזת ולמצוא בתוכו תו מסוים. לדוגמה, בתוכנית הבאה, 699 מפטאד5, מתואר השימוש בפונקציות : זקטז50 ו-זשוש5 שבספריית ההרצה. <םת.ת105%208> 61006ת1+ 98 תמסנ1ססתט10 8ת681ת00 // <ם.6ת5521> 1086סת1+ (ס1סט) ת1נאת ה1סט ו ;"++0 ץס 2650060" = []₪1%16 עַַַםס ;"562188 ע828066ת0 06ם01ם625%8בתס" = []1659902 עַַםס 2 >> (₪1%16)ע2קט0ע8%2 >> " :0856ע62סקס" >> סגוסס ;[01ת8 >> (ת2)16550ש1ע5% >> " :1096208858" >> סטסס השימוש בפונקציות ספריית ההרצה חוסך ומן רב בפיתוח התוכניות. יש לציית לכללים ונהלים כפי שלמדנו, פונקציות המטפלות במחרוזות תווים, מצפות למצוא תו 011א, אשר מסמן את התו האחרון במחרוזת. לכן, עליך לוודא כי תוכניותיך אכן דואגות להוסיף בסוף מחרוזות התוויס שהן יוצרות את התו הזה. אס לא כך, פונקציות המסתמכות על המוסכמה הזו תיכשלנה בפעולתן. 2 ++6 בקלות סיכום ברוב התוכניות בשפת ++6 יש שימוש במחרוזות תוויס. בפרק וה למדנו כיצד לטפל במחרוזות. בפרק הבא נלמד לאחסן נתוניס מטיפוסים שוניס במבנה מוגדר - 6 50. כך למשל במבנה, או מבנה רשומה, מכילים את כל נתוני העובד: שס, כתובת, שנת לידה, מצב משפחתי, שכר ועוד. לפני שנעבור לפרק הבא, מומלצ לבחון אם מובניס הנושאיס הבאים: / / % %% מחרוזת תוויס מוגדרת כמערך של תוויס אשר מסתייס בתו 0 5611, שהוא התו טא יצירת מחרוזת תווים נעשית על ידי הגדרת מערך מטיפוס זחס. הצבת התו 011א\ בסוף המחרוזת מוטלת על התוכנית (לאחר התוכן האחרון). מהדר שפת ++6 מציב את התו 011 בצורה אוטומטית לקבועים מטיפוס מחרוזת, המוגדרים בין גרשיים. אתחול מחרוזת במשפט ההגדרה נעשה על ידי כתיבת תוכן המחרוזת בין גרשיים. רוב המהדריסם בשפת ‏ ++6 כולליסם מספר רב של פונקציות ספריה ( זהזם!! 6וחם-חטח), המטפלות במחרוזות. תרגילים כיתבו תוכנית המגדירה שתי מחרוזות (מערכי תוויס). האחת מאותחלת ל-'"0חו5 8 חהג 1'י והשנייה - ל-'יססץ פַחו5 8 וזה 1'יי. ההגדרה של המחרוזת הראשונה תציין במפורש את אורך המחרוזת. ההגדרה השנייה לא תעשה זאת. התוכנית תדפיס את המחרוזות למסך. כיתבו פונקציה אשר מקבלת מחרוות ותו. אס התו מופיע במחרוזת, הפונקציה מחזירה 1, ואחרת - 0. כיתבו פונקציה אשר מקבלת מחרוזת ותו, ומחזירה את מספר הפעמיסםס שהתו מופיע במחרוזת. כיתבו פונקציה אשר מקבלת שתי מחרוזות ומתחזירה את מספר המקומות (האינדקסים) בהםס המחרוזות זהות. למשל, המחרוזות 8266 ו- 5280 והות בשני מקומות. פרק 17: מחרוזות תווים 183 נל" רעווולורו בפרק 16 למדנו שבשפת ++6 ניתן לאחסן מידע מאותו טיפוס בתוך מערך. הראינו שהשימוש במערכים נוח מאוד ומועיל. אולס, במקריס רביס יש צורך לאחסן מידע המורכב מנתוניס שאינס מאותו טיפוס, כמו למשל, בתוכנית המטפלת ברשומות עובדים. בתוכנית כזו יש צורך לייחס לעובד מסויס את שס העובד, גילו, משכורתו, כתובתו, מספר עובד ומידע נוסף. כדי לאחסן מידע מגוון זה, צריך להשתמש בטיפוסים שוניס של משתנים: %חו, |68ז, +₪08 ומחרוזות. כדי לאחסן מידע מסוג זה, משתמשיס במבנה (5070₪6:0:6), או מבנה רשומה (6:ש5%706% 66076א). נלמד שמבנה הרשומה הוא משתנה המכיל בתוכו יחידות מידע הקרויות שדות (5ז06וחסוח, או 8₪6!05), והן מטיפוסים שוניס. בהמשך הפרק נדון בנושאים הבאים : > מבני רשומה (5006007059) מאפשריס לקב\ בתוך משתנה אחד נתוניס מטיפוסיס שוניס, אשר קשוריס זה לזה. > מבנה רשומה מורכב משדה נתוניס אחד או יותר (שדות הרשומה, פזסטוחסוז). + מבנה רשומה מוגדר על ידי ציון שס המבנה והשדות המרכיביס אותו. +> בהגדרת הרשומה מצייניס את טיפוסי השדות (משתנים), כמו למשל, 6חו, ז8ח6 או 808%. יש לתת שם ייחודי לכל שדה. > לאחר שמגדירים מבנה רשומה ניתן להצהיר בתוכנית על משתניסם מטיפוס המבנה (6ק 06076 50). > כדי שפונקציה תוכל לשנות שדות של מבנה רשומה, יש להעביר לה את כתובת המבנה על פי כתובת. מבנה הרשומה הוא אבן היסוד של מבנה המחלקה בתכנות מונחה-עצמים, כפי שנלמד בחלק 4 של הספר. על כן מומלצ מאוד להשקיע זמן להבנת מבנה הרשומה ולהריץ שוב ושוב את התוכניות המוצגות בפרק זה. 4 ++6 בקלות הגדרת מבנה רשומה המבנה (56₪6%066), מתאר את תבנית הרשומה (3%6!|קוחסד) שאחר כך אפשר להצהיר עליה כמשתנה. במיליס אחרות, קודס מגדיריס כמבנה הרשומה ולאחר מכן מגדיריס את המשתניס מטיפוס הרשומה. כדי להגדיר רשומה יש להשתמש במילה השמורה 5060 ובהמשכה לכתוב את שס המבנה וסוגר מסולסל שמאלי. בין הסוגר המסולסל השמאלי לבין הסוגר המסולסל הימני מגדירים את שדות הרשומה (0075ו16₪/) ואת הטיפוס שלהס. אחרי הגדרת הרשומה ניתן להגדיר משתניס מטיפוס הרשומה: )]) סתהת 06וע5% הגדרת שדות (5זספוחוס!/) | ;1 שתהם שצסמתסת 6ם1 ;2 סתהת מסשסתסת 11086 הגדרת משתנה | ;16מַ18עבט | לדוגמה, הגדרת מבנה הרשומה הבא מתאיס לאחסון מידע אודות עובד: + 610766 06וע56 ; [64 ] סותאם תס 6010766 סַם0ס1 ;ץ8182פ 11086 ; [10] פמסםס מַ8ם0 ;טטטת 055106 סת1 ו במקרה הקודם לא מוגדר משתנה מטיפוס הרשומה. בשפת ++6 ניתן להגדיר משתניסם מטיפוס רשומה רק לאחר שמוגדר מבנה הרשומה ולהשתמש לצורך וה בשם המבנה (שלעיתיס קרוי 8+ ₪65076זל5). להלן דוגמה: שם המבנה (1906') ;תס חסת ,עס6אעסח ,00585 10766סחס הגדרת משתנים במשפט הקודסם הגדרנו שלושה משתנים מטיפוס מבנה הרשומה 66ץס!קוח6. במקריס מסוימים, הגדרת משתנים מטיפוס רשומה נעשית תוך שימוש במילה השמורה %, על פי הדוגמה הבאה: ;760ץ10קתס חסם ,שסאע2סח ,058558 10766קת0 6סגע56 להגדרת משתנה רשומה בשפת 6 חייבים להשתמש במילה השמורה ‏ 50₪06: לכן, מטעמי הרגל נוהגים מתכנתי 6 להציב מילה זו לפני הגדרת המשתנים. בכל מקרה, בשפת ++6 השימוש במילה השמורה 6זו5₪ להגדרת משתנה אינו חובה. פרק 18: מבני רשומות 185 שדות הרשומה מבנה הרשומה מורכב מיחידות מידע הנקראות שדות (116!|05 או 5זסטוחסוח). כדי לאחסן מידע בשדות וכדי לגשת למידע המאוחסן בהס משתמשיסם באופרטור הנקודה (.). לדוגמה, במשפטיס הבאיס מתבצעת השמה של ערכיםס בשדות שוניס של המשתנה זסאזסו שהוא מטיפוס מבנה הרשומה 66עסוקוחס6. 72 = 16 6010766 ע6א2ס₪ 2. 25000 = צע62.5818אעסט 2 = פססחטםת 62.05%106א02סח הגישה לשדה של משתנה הרשומה מתבצעת על ידי ציוו שס המשתנה ושס השדה הרצוי, כאשר הס מופרדיס על ידי נקודה. בתוכנית הבאה, 95פס.פפצס ופואם, מתואר השימוש במבנה הרשומה 66ץס!קוח6. <ת.ת108%2608> 610866םת1+ <ת.6ם5621> 010₪6ם1+ (ס1סט)תנאת ה1סט ו ] 766ץ10קתס 6סטעמ56 ; [64 ] סותאם 0 601066 סַם0ס1 ;ץ8182פ 11086 ;[6]10תסםס עַַַם0 ;פשפטטת 052106 6ת1 ;עסאעסח ן[ 8ם1ע5% 6ם6 0ם פתם ב צְק600 // ; ("06סע מםסע" ,פתהת.62א2סא) צץס5620 72 = 10 66צ60010.ע6א2סש 72 = ץ58182.ע62אעסט 2 = פססמתגטם 6.05%106א2ס₪ %ם1ע86 6ם6 0סם עפסחטת 6תסםס 8 צְֶ000 // ; ("555-1212" ,6תסםתק.ע6אע2סא) ץ56200 ;01ת6 >> סתהם.62א2סח >> " :66צ107סתםע" >> סגסס ;01ת6 >> 6םסםס.62א2סש >> " :נ6םמסםקע" >> סגסס 12 >> 10 010766ת61.6א2סח >> " :10 66צ10קחתםת" >> סטסס ;1 >> צ61.88182א2סח >> " :581827" >> סגוסס 12 >> מעפסתטת 61.015106אעסש >> " :015106" >> סטסס 6 ++6 בקלות ההשמה של ערכיס לשדות מטיפוס %חו ו- 108 מתבצעת בצורה ישירה. לעומת זאת, כדי להציב ערכים למחרוזות סח ו- 6חסחק משתמשיס בפונקציה ץק56. הצבת ערכים לשדה מחרוזת מתבצעת על ידי העתקה של מחרוזות (למעט אתחול המחרוזת בעת הגדרת המשתנה). הגדרת משתנה הרשומה מבנה הרשומה בשפת ++6 מאפשר לכלול בתוך שס משתנה אחד מידע המורכב מטיפוסיס שוניס של נתוניס. מבנה מוגדר על ידי תבנית המידע המאפשר להגדיר משתנים מטיפוס הרשומה בשלבים מאוחריס בתוכנית. כל תבנית מקבלת שם ייחודי בתוכנית. על ידי שימוש בשםס התבנית ניתן להגדיר משתניס מטיפוס רשומה זו. רכיביה של רשומה נקראיס שדות. בשפת ++6 ניתן לגשת לשדות הרשומה או לאחסן בהן מידע על ידי שימוש באופרטור הנקודה, כפי שמתואר בדוגמה הבאה: ;78106 5006 = מססמחסת. 18016עבט ;עסמתסת 62ם8218216.062ט = 18016ע8ט 506 מבנה הרשומה והפונקציות בפונקציות שלא מתבצע בהן שינוי בערכי שדות הרשומה ניתן להעביר את שס משתנה הרשומה כפרמטר לפונקציה. בתוכנית ;57.62 שסא5 מוגדרת הפונקציה 6 שוסח5 אשר תפקידה להציג את ערכי שדות הרשומה מטיפוס 66/סוכוח6. <ת.ת108%2608> 866ט610םת1+ <ת.06ם5621> 010₪6ם1+ + 610766 06וע56 ; [64 ] סות8אם תס 6010766 סַם10 ;ץ8182פ 11086 ;[6]10תסםס עַַַם0ס ;שטטטת 055106 6ת1 2 (62א02%ש צְס1סת0) 10760קתס טסם8 בנ1סע ו ;01ת6 >> סתה8םת.ל6א2סט >> " :10766קתם" >> סטסס 12 >> ס6תסםס.פ6א2סט >> " :6םתסםע" >> סגוסס ;601 >> 16 62.000210766א2סח >>" :10 66צ10קתם" >> סטסס 2 >> 4ע61.88182א2סח >> " :581827" >> סגוסס ;01ם6 >> עסמתטת 62.011106אע2סש >> " :051106" >> סטסס פרק 18: מבני רשומות 187 (16סט) מ1את ה1ס7 ן ; 62א סש צס1סת 4%ת1ע56 6םב6 0ם תת 8 צְס600 // ; ("6סע מתתסש" ,סתהת.62א2סא) צץס5620 72 = 10 60010766 ע6א2ס₪ 2. 25000 = צע62.5818%אעסש 2 = פססמתגטם 6.05%106א2%סח 1%ע5% 6ם6 0 עפסחתטם 6תסמס 8 צְק00 // ; ("555-1212" ,6תסםק.ע6א2סא) ץ56200 ; (62א02ש) 6010780 אסםפ5 ו בתוכנית הקודמת הוגדר המשתנה זסאזסש מטיפוס רשומה. משתנה זה מועבר לפונקציה 66/ס!קוח6 שוסח5 על ידי ציוו שס המשתנה בלבד. בתוך הפונקציה מתבצעת הצגת שדות הרשומה על המסך. יש לשים לב, שבתוכנית הרשומה 60066 מוגדרת מחוץ לתוכנית הראשית חואוח, ומחוץ לפונקציה 0/66!כח6 צוסח5. הגדרת הרשומה 6 חייבת להיות לפני הגדרת הפונקציה 66ץס!קח6 צוסח5, מכיון שבפונקציה מוגדר משתנה זס6אזסאו שהוא מטיפוס הרשומה 66עס!|קוחס. הערה יש לשים לב שצריך להעביר את המבנה לפונקציה. על כן מומלץ להעביר ל לפונקציה את כתובת המבנה ולהשתמש במצביעים. פונקציות שמשנות ערכי שדות ברשומה בפרקיס הקודמיס למדנו ששינוי ערך הפרמטרים על ידי פונקציה דורש העברת כתובת המשתנה אל הפונקציה. לכן, יש להעביר את כתובת משתנה הרשומה אל הפונקציה, כדי שהיא תוכל לבצע שינוייס בערכי שדות הרשומה. העברת כתובת הרשומה לפונקציה נעשית על ידי הצבת אופרטור הכתובת (ייכתובת של..." 8) לפני שס משתנה הרשומה. להלן דוגמה: ; (8₪02%62)ם0610םט1 5086 בתוך הפונקציה יש לפנות לשדות הרשומה באמצעות מצביעים. להלן תחביר מומלצ של משפט לשימוש במצביעים לשדות הרשומה: 2 506 = ש6סתפת<-18216עא8ט ע6סתנ1סק 8 ++6 בקלות לדוגמה, בתוכנית ₪88.625 66 מעביריס רשומה מטיפוס 601066 לפונקציה 66ץ6₪0!0 06%. תפקיד הפונקציה הוא לבקש מהמשתמש להזין את מספר הזיהוי של העובד ולאחר מכן לאחסן אותו בשדה 6! 601066 של הרשומה. כדי לשנות את ערך השדה, הפונקציה מפעילה מצביע לרשומה. <ת.ת108%2608> 86ט610םת1+ <ת.6ם5621> 010₪66ם1+ + 610766 06וע56 ; [64 ] סותאם תס 6010766 סַם10 ;ץ8182פ 11086 ;[10]פתסםס עַַַםת0ס ;טטת 052106 6ת1 קן (62אעסש* ץ010ת10)6 610766 66% בנסעט \ ;" :10 10766קת6 ת8 םת1 6סץ71" >> סגוסס 600107606<-62אע2סש << ת1ס (16סט) מ1את ה1ס7 ן ; 62א סש צס1סת 4ת1ע56 66 0ם תת 8 צְס60 // ; ("06סע מתסש" ,סתהת.62א2סא) צץס5620 ; (ע16)6%₪02%6 6010766 466 ;01ת6 >> פתה8םת.עלסא2סט >> " :10766קתם" >> סטסס 12 >> 10 0107606ת61.6א2ס >> " :10" >> סטסס בתוכנית הראשית ח!ו8ח מעביריס לפונקציה 6! 66ץ0!|ח6 860 את כתובת משתנה המבנה זסאזסעש. בתוך הפונקציה 10 66עס!וח6 066 מאחסנים בשדה 0 66ץ0!קוח6 את הערך שהמשתמש הזין. כותביס לצורך זה את המשפט הבא : 60010766<-62א2%סש << ת01ס פרק 18: מבני רשומות 189 שימוש במצביעים לרשומה כאשר צריך לשנות ערכי שדות של הרשומה בתוך הפונקציה, יש להעביר לפונקציה את כתובת משתנה הרשומה. במקביל הפונקציה מקבלת את המשתנה על ידי שימוש במצביע לרשומה. כדי לגשת לשדה ברשומה יש להשתמש במצביעים על פי הפירוט הבא: ; צס6מתסת<-8016בעאט = 6ט81ט 608 = ב והכחה ב םסל -1 0 ל סיכום לפני שנעבור לפרק הבא נבחן אם מובנים לנו הנושאים הבאים: * מבנה הרשומה אוגר מידע שמורכב מנתונים מטיפוסים שונים. * היחידות המרכיבות את הרשומה נקראות שדות (8₪6!65 או ז6סוחסוח). * מבנה הרשומה מגדיר תבנית (6000!816)) לצורך הגדרה עתידית של משתנים. / לאחר הגדרת מבנה הרשומה ניתן להשתמש בשס המבנה (99809) להגדרת משתניס מאותו טיפוס. % גישה לשדות הרשומה, או הקצאת ערכיסם לשדות, נעשית על ידי שימוש באופרטור הנקודה באופן הבא : ז6טוחסוח.6!פ8וזפע (שדה.משתנה). * כדי לשנות בתוך הפונקציה ערך של שדה ברשומה, יש להעביר אל הפונקציה את הכתובת של משתנה הרשומה כפרמטר. / כדי לגשת לשדה ברשומה כאשר בפונקציה יש שימוש במצביע לרשומה, צריך להשתמש בפורמט : זססוח6רח<- 6!סהוזה/. בפרק 19 נציג כיצד משתמשים במבנה האיגוד (חסוחט) בשפת ++6. מבנה האיגוד דומה למבנה הרשומה, מכיון שהוא מורכב משדות. לעומת זאת, אחסון מבנה האיגוד בזיכרון אינו והה לאחסון מבנה הרשומה. מבנה האיגוד מסוגל לאחסן בתוכו ערך אחד ברגע נתון, ללא קשר למספר השדות שבו. תרגילים 1 הגדירו רשומה הכוללת את הפרטיס הבאיסם לגבי גבר/אישה: שם, גיל. יש להגדיר משתנה מטיפוס הרשומה. יש לאתחל את שדות הרשומה מהקלט (חו6) ולאחר מכן להדפיס את הפרטים למסך. 2 כיתבו תוכנית המנהלת יומן פגישות. הגדירו רשומה המכילה שדות אלה: יוס הפגישה, חודש הפגישה ומחרוזאת המתארת את הפגישה. יש ליצור מערך של 20 רשומות (היומן) ולכתוב שיגרה המאפשרת למשתמש להזין פגישה חדשה ליומן, ושיגרה נוספת המדפיסה את רשימת הפגישות. 0 ++6 בקלות כיתבו תוכנית המגדירה רשומה המכילה נתוניס לגבי אורך שתי הצלעות המאונכות של משולש ישר זווית. כיתבו פרוצדורה המקבלת כפרמטר רשומה מסוג זה, ומציירת את המשולש בעזרת כוכביות (י*י). יש לכתוב שיגרת חו8וח אשר תקלוט את נתוני המשולש ותדפיס את ציור המשולש. נתון מבנה הרשומה הבא : ] 2806 06גוע56 ;[20]ָ[ס6ת8ם 85ם0 ;[4] 02806 תהאס 11086 7 סם1 ) כיתבו שיגרה המקבלת משתנה מטיפוס 87806 ומעדכנת בו את ערך המשתנה 0, כך שיקבל ערך 1 אס ממוצע הציוניס גדול מ-60 ואחרת - יקבל ערך 0. פרק 18: מבני רשומות ‏ 191 איגודים בפרק 18 למדנו כיצד מאחסנים מידע בתוך מבנה רשומה. במקריס מסוימים יש צורך שהתוכנית תתייחס למידע בדרכים שונות. בנוסף, לעיתיס התוכניות צריכות לעבד מספר ערכים, אך ברגע נתון עליהן להתייחס לערך מסויס אחד בלבד. הפתרון לשני המקרים הקודמים הוא אגירת המידע במבנה איגוד (חסוחש). בהמשך הפרק נדון בנושאים אלה: + איגודים (פחסוח)) בשפת ++6 דומים מאוד למבני רשומה, אך נבדלים מהם בצורה בה ++6 מאחסנת כל אחד מהם בזיכרון, וגס בכך שאיגוד יכול לאחסן בכל זמן נתון ערך של שדה אחד בלבד. > איגוד הוא מבנה נתונים, אשר כמו מבנה רשומה מכיל קטעי נתונים, הנקראיס שדות. > איגוד מגדיר תבנית (806!קוח6 ד), אשר באמצעותה ניתן להצהיר על משתנים. % גישה לשדה של איגוד נעשית באמצעות אופרטור הנקודה (.) של ++6. % כדי לשנות ערך של שדה של איגוד בתוך פונקציה, צריך להעביר אל הפונקציה את כתובת משתנה האיגוד. > איגוד אנונימי (5וסוחץחסחה) הוא איגוד ללא שס. בהמשך נראה שמבנה האיגוד דומה מאוד למבנה הרשומה, בשפת ++6, אך מאחסניס אותו באופן שונה מאופן אחסון של מבנה הרשימה. 2 ++6 בקלות אחסון מבנה האיגוד מבחינת הגדרתס בתוכנית, מבנה האיגוד ומבנה הרשומה דומים מאוד. למשל, המשפטיס הבאיס מגדיריס מבנה איגוד בשס 66ח015%8, המורכב משני שדות. ] 06ת315868 מסנמגו 7 סם1 ; 66628 106 ;ן בדומה למבנה הרשומה, הגדרת מבנה האיגוד אינה מאוחסנת בזיכרון המחשב. כלומר, אין עבורה הקצאת זיכרון. הגדרה זו היא תבנית (0|8%6ח16) למשתניס מטיפוס האיגוד, אשר יוגדרו בשלב מאוחר יותר בתוכנית. כדי להגדיר משתניס מטיפוס איגוד, אפשר להשתמש באחד משני הפרמטריס הבאיס: ] 06ת915%8 תסנ1נתט ] 06ת8915%8 תסנתט 2 16 72 6ת1 ; 66628 106 ;66628 106 ; | ;06ת128 ,ץםת8תע662 ,תהַסהך [ %2, 962 ,ת8ק80ך 06מם41568 מבנה האיגוד שבדוגמה מכיל שני שדות: 1165 ו- 5זס66וח. ההגדרות יוצרות משתניס המיועדיס לאחסון המרחק למדינות ספציפיות. בדומה למבנה הרשומה, ניתן להציב ערך לשדות האיגוד, אך בניגוד לו, ניתן לתת ערך לשדה אחד בלבד ברגע נתון. בעת הגדרת האיגוד, המהדר מקצה מקוס בזיכרון לאחסון השדה הגדול ביותר המוגדר בתבנית האיגוד. במקרה של איגוד 66ח015%8, המהדר יקצה בציכרון מקוס לאחסון ערך מטיפוס פַחס!. תרשיס 19.1 מתאר את הקצאת הציכרון לאיגוד 66ח01558. 4 | 01150366 מסנתט בתים )1 פחסן (חהקהן [ תרשים 19.1: מהדר ++6 מקצה בזיכרון מקום לשדה הגדול ביותר באיגוד. נניח כי בתוכנית מתבצעת השמה של ערך לשדה 65ווחח, לפי המשפט הבא : 72 = 116085ת.תהסבּך כאשר בהמשך תתבצע השמה לשדה 5ז6660וח, הערך החדש ידרוס את הערך הקייס בשדה 1!65. פרק 19: איגודים 193 בתוכנית 692.אסנאטפפט מתואר יישוס הנעזר בהגדרת האיגוד 06ח01568. בתחילת התוכנית מקציס ערך לשדה ₪165 ומציגיס אותו על המסך. בהמשך מקצים ערך לשדה 5 ה. בשלב זה יידרס (יימחק) ערך השדה 1!65וח על ידי הערך החדש. <ם.ת105%268> 61006ם1+ (ס1סט) מנ1את ב1סט | ) 06ת015%68 תסנתגו 72 סם1 1028 66628 ; ;1% ן 2 = 81%.01108ח 2 >> 81%.01168 >> " 18 1165ת ם1 81%66ח 06םת31568 ת" >> סטסס 2 = 085ע81%.066₪6ח ;601 >> 81%.06%628ח >> " 18 658ססת ם1 81%606ח 6סת3415%8 ת" >> סטסס ] יש לשיס לב שהגישה לשדות האיגוד מתבצעת תוך שימוש באופרטור הנקודה. בצורה דומה מתאפשרת גישה גס לשדות הרשומה, כפי שמוצג בפרק 18. איגוד מאחסן ערך של שדה אחד בלבד בכל זמן נתון איגוד הוא מבנה נתוניס (5006₪76 8ז08), אשר כמו מבנה רשומה, מאפשר לקבצ בתוך משתנה אחד מספר נתוניס מטיפוסיס שונים, אך קשורים זה לזה. עס זאת, שלא כמו מבנה רשומה, איגוד מאחסן ערך של שדה אחד בלבד בכל זמן נתון. במיליס אחרות, כאשר מקצים ערך לשדה כלשהו של איגוד, הוא יידורסיי (מוחק, ובא במקום) את הערך הקודס אשר היה מאוחסן בשדה קודם לכן. האיגוד מגדיר תבנית (0!8%6ו6ד) שבאמצעותה ניתן להצהיר על משתניס בתוכנית. כאשר המהדר נתקל בהגדרת איגוד, הוא מקצה רק את כמות הזיכרון המאפשרת לו לאחסן ערכים עבור השדה הגדול ביותר של האיגוד, שהתוכנית עלולה לפגוש. 4 ++6 בקלות האיגוד האנונימי האיגוד האנונימי (חסוחט 5טסוחץחסחה) הוא איגוד אשר אין לו שס מוגדר. שפת ++6 מציעה סוג זה של איגוד כדי להקל על הגישה לשדות האיגודים המוגדריס בתוכניות, כאשר מטרת האיגוד הוא לחסוך בשימוש בזיכרון המחשב, או ליצור שמות נרדפים לערכים מסוימים. נניח, למשל כי בתוכנית מסוימת זקוקיס לשינוי בשני משתניס 65!!₪ ו-66615וח. בנוסף ידוע, כי התוכנית משתמשת באחד המשתנים ברגע נתון. לפני כן הצגנו את השימוש באיגוד 01509066 שיכול לשמש פתרון לבעיה המוצגת כאן. במקרה זה נגדיר איגוד בשס שוח וניגש לשדות על ידי שימוש באופרטור הנקודה : 65!!וח.6וחהח (-6%675וח. 6וחהח. המשפט הבא יוצר (מגדיר) איגוד אנונימי (ללא שס): + תסנתו 7 סם1 ; 66628 106 ;ן בהגדרה הקודמת ניתן לראות שאין לאיגוד שס, ואין הגדרה של משתנה מטיפוס האיגוד. הגישה לשדות האיגוד 65!!וח ו-61675וח מתוך התוכנית נעשית ללא שימוש באופרטור הנקודה. בתוכנית הבאה 699.אצאסאא מוגדר איגוד אנונימי המכיל שני שדות : 1165 ו-60015ח. יש לשים לב שהגישה לשדות האיגוד מתבצעת בצורה ישירה בדומה לגישה אל משתניס רגילים. קייס הבדל מהותי בין השימוש במשתניס רגיליס לבין האיגוד המתואר, מכיון שברגע שמציביס ערך לשדה אחד של האיגוד אין אפשרות להשתמש בערך של שדה אחר שלו. <ת.ת108%2608> 61086םת1+ (ס1סט) מ1את 1סע | + מסנתו 7 סם1 ; 66628 106 7 72 = 11685ת 12 >1108>6%ת >> " 158 1168ת 01 6ט81ט 6ם71" >> סגטסס 2 = פעססת ;01ת6 >> 8ע6662ת >> " 18 8ע6ס6ת +0ס 6ט81ט 6ם7" >> סגטסס ו הדוגמה הקודמת מוכיחה שהשימוש באיגוד אנונימי מאפשר חיסכון בזיכרון המחשב, מבלי להשתמש בשס האיגוד ובאופרטור הנקודה, כדי לגשת לערכי השדות של האיגוד. פרק 19: איגודים 195 איגודים אנונימיים חוסכים מקום בזיכרון איגוד אנונימי (חסוחט פטסתץחסחה) הוא איגוד חסר שסם. איגודיסם אנונימייס מאפשרים לחסוך במקום, מבלי לטרוח עם שימוש באופרטור הנקודה (.). המשפטים הבאים מגדירים איגוד אנונימי המסוגל לאחסן שתי מחרוזות תווים: | קט ו ב ו ; [255] סתַת סַם10 086 ;ו סיכום בפרק וה למדנו כיצד להגדיר איגוד (חסוחש) וכיצד להשתמש בו בתוכנית. הצגנו שמבנה האיגוד דומה למבנה הרשומה. למרות זאת, קיים שוני מהותי בין שני המבניס בקשר לצורת אחסון המידע בזיכרון המחשב. בפרק 10 למדנו שכדי שפונקציה תוכל לשנות פרמטר, התוכנית צריכה להעביר את הפרמטר אל הפונקציה באמצעות מצביע (או כתובת ויכרון). השתמשנו במצביעיס לעבודה במערכים ובמחרוזות תווים. בפרק הבא נחזור ונעסוק בפעולות המצביעיס בשפת ++6. לפני שנעבור לפרק הבא נבחן אס מובנים לנו הנושאים הבאים : * המהדר מקצה קטע ויכרון התואם לשדה הגדול ביותר, המוגדר באיגוד. / הגדרת מבנה האיגוד איננה גורמת להקצאת ציכרון. היא מהווה תבנית מתאימה להגדרה עתידית של משתניסם מטיפוס האיגוד. * הגישה לשדות האיגוד מתבצעת על ידי שימוש באופרטור הנקודה. השמה של ערך בשדה כלשהו של האיגוד גורס למחיקה של הערך הקיים בשדה אחר של אותו איגוד. * איגוד אנונימי הינו איגוד ללא שם. הגישה לשדות איגוד אנונימי בתוכנית והה לגישה אל משתניס רגיליס, ללא צורך באופרטור הנקודה. 6 ++6 בקלות תרגילים 1 מהו הפלט של התוכנית הבאה! כמה זיכרון מוקצה למבנה חסוחט? (ס1סט) מ1את 1סע \ ] צְסתמ6עעטס מתסנםט 57 סמסת1 ;ת6%811ת5 שסם 6ת1 ;ץ 108 ;סתטסתה8 [ 2 = 85ע60118.%תגוסח8 "5" >> 11898סה.%תטסתה >> " הב 1 בפ1טח 7" >> 00806 ; [0תם8 >> 2 * 6.4011828תגוסת8 = ת6%811ם852 שטסת.סשתגוסתה8 " 86ם 1 ת18ח 1 86ם6₪ פתאסת תס1תח" >> סטסס 2 >> "5דא " >> ת6%811ם85 שטסת.6תטסת8 >> 2 * ת8526%811 טחטסם.ס6תטסת8 (סַתס1) = פת6ץ.>תטסתה " 86ם 1 מפ1ח 1 86םת6 פתהאסת מסנתשט" >> סגוסס ;61ת6 >> "פאתצ " >> פתפץ.%מטסתה8 >> " סְתנ1טהסת סטססה ת6268 ץ1תס תה8ס 1 סט" >> סטסס ;01ת6 >> "... ף" >> פתספץ.6תטסת8 >> 2 מהו הפלט של התוכנית הבאה? <ת.ת108%208> 866ט610םת1+ (16סט) מ1את 1סע | ] ע81ק תסנםט ;ץ %ם1 ;א %ם1 ;םס |( 7 = א.ס 12 >> א. >> סגוסס = צ.ס ;01ת6 >> ץ.ק >> סגוסס ;[0ת6 >> א.ק >> סגוסס = א 12 >> ץ.0 >> סגוסס 12 >> א. >> סגוסס פרק 19: איגודים| 197 לצביעים בפרקיס הקודמיס ראינו ששינוי ערכי הפרמטריס בתוך הפונקציה מחייב העברת כתובות הפרמטריסם לפונקציה. הגישה לפרמטר בתוך הפונקציה נעשית על ידי שימוש במצביעים (675+חזסק). במספר תוכניות שהוצגו בפרקיס הקודמים הפעלנו את שיטת המצביעיםס לפרמטרים. בדרך כלל, בתוכניות המבוססות על מערכיס או מחרוזות, משתמשים במצביעים לניהול וגישה לאיברי המערך. בהמשך הפרק נדון בנושאים הבאים : % יישוס פעולות המצביעים לטיפול במחרוזות: מחרוזת תוויס כמצביע, וטיפול בתוכן המחרוזת באמצעות פעולות במצביעים. > פעולות חשבוניות במצביעיס כמו הגדלת ערך המצביע באחד. > שימוש במצביעים לטיפול במערכיס מטיפוס שחו, או 8!08%. פעולות המצביעים (פחסוחְבּזסקס זספזחוספ) מקובלות בתוכניות ++6, ולכן מומלצ להשקיע ומן בתרגול והרצה חוזרת של התוכניות שבפרק זה. 8 ++6 בקלות מצביע למחרוזת תווים המצביע מכיל ערך של כתובת בויכרון המחשב. כאשר התוכנית מעבירה מערך (לדוגמה, מחרוזת תוויס) כפרמטר לפונקציה, שפת ++6 מעבירה את כתובת הזיכרון של האיבר הראשון. מסיבה זו נפוצ השימוש במצביעים למחרוזת. הגדרת מצביע למחרוזת נעשית על ידי הצבת כוכבית לפני שס המשתנה, כדוגמת המשפט המופיע להלן: ; (9ת8%21* 0282)םתסנ1ססתט1 8006 16סע בתוכנית 9קס.מז5 אזפ משתמשת במצביע למחרוזת בפונקציה פַח50 אוסח5. תפקיד הפונקציה הוא להציג את תווי המחרוזת על המסך, תו אחר תו. <ת.ת108%208> 866ט610םת1+ (0ת8%21* 82ת06)0ם85621 טסם8 בנסע ן ('0\' =! סַם1ע86*) 16נ1םתח | 2 + >> 0006 ;++0םת1ע56 (ס1סט)מנ1נאת סנ1נסט ו ; ("!++6 צ2 06)"2650060ם5621 טסם5 כעת נשיס לב ללולאה 6וחש שבתוך הפונקציה 8ַחו50 אוסח5. תנאי הלולאה ('0\' =! פַחו50*) 6!וחצו בודק אס התו שהמצביע פַח5₪1 מורה עליו ברגע הבדיקה אינו התו 11)\, אשר מציין את התו האחרון במחרוזת. אם התשובה חיובית והתו אינו 1, הפקודה 600% בלולאה גורמת להצגת התו על המסך. בהמשך, המשפט ++4ח50 מקדס את המצביע פַחו5₪, כדי שיצביע על האיבר הבא במחרוזת. כאשר המצביע 50 מצביע על התו 11וא, תושלס הצגת המחרוזת, והלולאה תסתייסם. נניח למשל, שכתובת הזיכרון של המחרוות המועברת לפונקציה היא 1000. כל פעס שערך המצביע 8ח5₪1 יתקדס באחד, המצביע פַחו50 יצביע על התו הבא במחרוזת (כתובות 1001, 1002, 1003 וכו). דוגמה זו מתוארת בתרשיס 20.1. פרק 20: מצביעים 199 ++6ת3)71 תרשים 20.1: סריקת מחרוזת באמצעות מצביע. דוגמה נוספת וה עתה למדנו שעל ידי שימוש במצביע ניתן לסרוק מחרוזות עד לתו 11()\ המציין את סוף המחרוזת. בתוכנית 699.א15 אדפ מוגדרת פונקציה תְזפַח6| פַָחו5% המנצלת את תכונות המצביע של המחרוזות, כדי לקבוע את גודל המחרוזת. <ת.ת108%2068> 610866םת1+ (0ם5621* מַַַתס)תסִסת16 סַם1ע8% 6ת1 ו 2 = ם066ת16 6ם1 ('0\' =! שַם1ע56*) 16נ1תח \ ; ++ת0%6ת16 ;++0ת1ע56 ; (ת0%ת16) מעט266 (16סט) מ1את 16ס7 ן ;"+04 ץ2 2650060" = []₪1616 פַַםתס >> " פם1הסתסס " >> 61616 >> סגוסס ;"082806658 " >> (61%616)ם86מ16 סַם1ע562 ] בפונקציית 0%%ח6| פַחו5% הלולאה מתבצעת עד לרגע שמצביע מחרוזות מגיע לתו א. 0 ++6 בקלות קידום מצביע למחרוזת תווים כאשר תוכנית מעבירה מערך אל פונקציה, היא למעשה מעבירה לה את כתובת הזיכרון של האיבר הראשון במערך. השימוש במצביע מאפשר לפונקציה לנוע לאורך המערך על ידי קידוס ערך המצביע. לדוגמה, נניח כי התוכנית מעבירה לפונקציה מסוימת את מחרוזת התווים "סו|36". תחילה פונה המצביע אל המקוס בזיכרון (כתובת) שבו נמצא התו 'ח'. כאשר הפונקציה מקדמת את המצביע, הוא מצביע כעת אל הכתובת בזיכרון שבה נמצא התו '6'. הפונקציה ממשיכה לקדם את המצביע אל כתובות הזיכרון שבהן מאוחסניס שאר איברי המערך, עד אשר המצביע מגיע אל התו א. צמצום משפטים עודפים בשתי הדוגמאות הקודמות השתמשנו במשפט לולאת 6ווחשו הבא, כדי לקבוע את סוף המחרוות : ('0\' =! שם1ע55%*) 116תח כידוע, ערך התו 1!וא ('0\') בקוד 456011 הוא אפס. בשפת ++6 משתמשים בערך 0 כדי לציין ערך שקרי (8156)), ובכל ערך אחר, כדי לציין ערך יאמת'' (06), ראה בפרק 7. על כן, ניתן לכתוב את משפט 6!וחצו הקודס גס בצורה זו: (09ם1ע5%*) 116תט במקרה זה, כל עוד המצביע אינו מגיע לערך 0 (11א), תנאי הבדיקה מתקייס והלולאה נמשכת. בפרק 5 למדנו את תכונותיו של אופרטור ההגדלה המאוחרת בשפת ++6 (ז678%0ק0 זחסוח6"סחו אוחפסק), שבעזרתו משתמשים בערך המאוחסן במשתנה, ואחר כך מקדמיס אותו באחד. בתוכניות רבות הכתובות בשפת ++6 משתמשים באופרטור זה ובאופרטור ההקטנה המאוחרת (800זסקס %ח06ח00076 אופ5סק) לשס סריקת מערכים על ידי מצביעים. לדוגמה, שתי הלולאות הבאות פועלות בצורה זהה לחלוטין: (0ת1ע586*) 16נ1תח (0מ1ע86*) 16נ1תח ;06+47ם1ע5%2* >> 0006 ן 72 + >> 0006 2++06ם1ת56 המשפט "++0ח51* >> %טססיי גורס להצגת תו המחרוזת המוצבע על ידי המצביע 58 ולהגדלת ערך המצביע, כך שיצביע על התו הבא במחרוזת. טכניקה זו מיושמת בתוכנית <69.פזקזמא5. בתוכנית מוגדרות מחדש הפונקציות 8ַחו50 צוסח5 ו-הז0ח6! 8חו50. פרק 20: מצביעים 201 <ת.ת108%2608> 866ט610םת1+ (0ת8%21* 82ת06)0ם5621 טסם8 בנסע ן (09ם21ע5%6*) 116םט ;7 + >> 000 (0ם5621* מַַַתס)תססַת16 סַם1ע8% 6ת1 ו 2 = ם066ת16 6ם1 (++0ם1ע5%62*) 116תט ; ++ם0%ת16 ; (ת0%ת16) מעט266 (16סט) מ1את ה1ס7 ן ;"+04 ץ2 2650060" = []₪1%16 עַםתס ; (0)%1%16ם5621 אסם5 >> " 8םת681ם00 " >> 0006 ;"082806698 " >> (61616)ם0%מם16 שַם1ע56 ] יש לשים לב, שהשימוש בטכניקת המצביעים המקוצרת, המתוארת בתוכנית, יעיל מאוד כאשר הפונקציה מטפלת במחרוזות. סריקת מחרוזת תווים אחד השימושיס השכיחיס ביותר של מצביעיס הוא סריקת מחרוזות תוויס. על מנת לחסוך בעבודת קידוד תוכניות רבות משתמשות באוסף משפטיס מהצורה הבאה כדי לסרוק מחרוות: ( ו 6 | 0:8 // %ע88006תס 6א6םת 6ם₪ 0סם סתגסס // ;++0ת1ע560 2 ++6 בקלות הפונקציה הבאה, 6856ז6מקש 8חו50, משתמשת במצביעים כדי להמיר את תווי המחרוזת לאותיות גדולות (6856ז6סקש) : 08 66 ופ 8 סופ 6 ז ;[0]0ם1ע85 05 80020688 // ;שם5521 = 8002688 סַם558261* מהםס 506 )) ו \ ה 6 ( ב 0 ה ו סיה קת = 707 = ₪ = 26 6 וג 5006 / 000 ו ו / הפונקציה מחזירה את הכתובת ההתחלתית של המחרוות המעודכנת, ולכן ניתן להשתמש בפונקציה באופן הבא : 56" 16 קט 110 שמש [06 2 >> 6605 הפעלת מצביעים במערכים מטיפוסים שונים השימוש במצביעים נפוץ לטיפול במחרוזות, אולס ניתן לנצל את תכונות המצביע לטיפול במערכים מטיפוסיס אחרים. לדוגמה, בתוכנית ;קס.זגס);מפדפ מתואר השימוש במצביע למערך מטיפוס 086ו. <ת.ת108%268> 61066ת1+ ,ץ8עע8* 5108%)51086 חסם5 ב1סט (%8ת86ת610 05 ע6שמתטת 6ת1 | 12 6ת1 (++1 ;%8ת610006 05 עפסתטת > 1 ;0 = 1) 1058 ; 0[1ת6 >> ++7ץ8228* >> סגוסס (16סט) מ1את 1סע ן ;[5.5 ,4.4 ,3.3 ,2.2 ,1.1+ = [810869]5ט 1108% ;(5 ,5108%6)0781068 חסם5 פרק 20: מצביעים 203 הפונקציה צוסו אוסח5 המוגדרת בתוכנית, נעזרת בלולאה זס) להצגת ערך האיבר שהמצביע עְפזז8 מורה עליו. לאחר מכן, הלולאה מקדמת את ערך המצביע זזה כדי שיצביע על האיבר הבא. במקרה זה התוכנית מעבירה לפונקציה פרמטר נוסף, המציין את מספר האיברים שבמערך. ערך זה דרוש, מכיון שמערכים מטיפוס 0080 או זחו, פחס! וכו' אינס כולליס את התו המיוחד ‏ 11)א לציון סוף המערך, כפי שקייס במחרוזות. מתמטיקה של מצביעים כפי שלמדנו, תוכניות יכולות להשתמש במצביעים למערך מכל טיפוס. בתוכנית הקודמת, ראינו כיצד הפונקציה 08% אוסח5 מקדמת מצביע בתוך מערך מטיפוס %. ניתן לומר שהמצביע מצביע אל מקום בזיכרון (כתובת), שבה מאוחסן ערך מטיפוס מוגדר, למשל, זהּח6, 6חו או 808%. כאשר פונקציה סורקת מערך באמצעות מצביע, היא מקדמת את המצביע בכל פעם, מהאיבר הנוכחי אל האיבר שבא אחריו. כדי שמצביע יוכל להצביע לאיבר הבא במערך, על ++6 לעקוב אחר גודל איברי המערך (בבתים) כדי לדעת בכמה בתיס צריך לקדס את המצביע כל פעם. לדוגמה, כדי לקדס את המצביע אל התו הבא במחרוזת, ++6 צריכה לקדסם את ערך המצביע בבית אחד. לעומת זואת, כדי להצביע לאיבר הבא במערך מטיפוס +חו, על ++6 לקדם את המצביע בשני בתיםס (ערכים מטיפוס 6חו תופסים שני בתי ציכרון). עבור ערכיס מטיפוס 608%, ++6 מקדמת את המצביע בארבעה בתים. על ידי ידיעת טיפוס הערך שאליו מצביע המצביע, ++6 יודעת בכמה בתיס לקדס את ערך המצביע (זסחוסס 6), כך שיצביע אל האיבר הבא. בתוך התוכנית יש להשתמש באופרטור ההגדלה העצמית, כך למשל ++ש6טן|א/. מאחורי הקלעיסם ++6 מגדילה את ערכו של המצביע (את כתובת הזיכרון) במספר הבתים הדרוש. סיכום בתוכניות ++6 נפוץ השימוש במצביעיס, במיוחד לטיפול במחרוזות תוויס. לפני שנעבור לפרק הבא נבחן אס מובניסם לנו הנושאיס הבאיס: * המצביע מכיל ערך שהוא כתובת בזיכרון המחשב. כאשר התוכנית מעבירה מערך לפונקציה, היא מעבירה למעשה את הכתובת של האיבר הראשון במערך. / הגדלת ערך המצביע באחד גורמת לכך שהמצביע יצביע על האיבר הבא של המערך. * פונקציות המטפלות במחרוזות באמצעות מצביעים, סורקות בדרך כלל את המחרוזת עד שהמצביע מגיע לתו 011 (שבסוף המחרוזת). * פונקציות המטפלות במערכים שאינס מחרוזות, צריכות לקבל את מספר האיברים של המערך המועבר, מכיון שלמערכים אלה אין ערך סיוס מיוחד. 4 ++6 בקלות בפרק| הבא נתתיל בהצגת התכונות | של ++6 כשפה מונחית-עצמים (017160%60 02166%). תחילה נציג את המחלקה (61355) אשר דומה למבנה הרשומה (6%₪76ש7ש5). המחלקה מאפשרת להגדיר עצמים. בהמשך נשתמש במחלקה כדי להגדיר את העצס 816 (קוב\). בתוך המחלקה המגדירה את העצס הזה נכללות הפונקציות המטפלות בו, וביניהן 6 %חוזק ו- 6 06!606. תרגילים 1 כיתבו שיגרה המקבלת מחרוזת והופכת בה את כל האותיות הלועזיות הקטנות לאותיות לועזיות גדולות. יש להשתמש במצביעיס כדי לסרוק את תווי המחרוזת. יש לחפש בספריה <ח.6%/26> פונקציה מתאימה לבדיקת גודל האותיות. 2 כיתבו את השיגרה הבאת: (8%612 * 0282 ,8621 * 85ם802)0 םת1 868 6ם1 השיגרה תחזיר 1 אס המחרוזת 51 מכילה את המחרוזת 562, ואחרת - תתזיר 0. 3 כיתבו שיגרה המקבלת מחרוזת ומזהה אם זהו פלינדרוס. כלומר, היא מחזירה 1 כאשר המחרוזת היא פלינדרום, ואחרת, היא מחזירה 0. לידיעתך, מחרוזת הינה פלינדרוס, אס היא זהה ללא תלות בכיוון הקריאה, כשנתעלס מהרוותיסם. הנה מספר דוגמאות לפלינדרומיס : 8 0-8 58 סת מס 5660 תאת ספ5פעסטסע פ5סתהבת יש להשתמש במצביעיס לסריקת המחרוזת, וצריך להתעלם מתווי רווח שנמצאיס בה. 4. כיתבו את השיגרה הבאה: (0ס 82ת0 ,8 *82ם82)060ם0 ע86 *עַהַם0ס המחזירה מצביע אל מיקום תו "6" הראשון במחרוזת 5. יש להחזיר 011 במקרה ש-6 אינו מופיע ב-5. פרק 20: מצביעים 205 חלק 4 השעחלקות על ++6 0הווהוהבּופסוק %60ה6וז0-02[66% - תכנות מונחה עצמים מתמקד בעצמים או דברים - (08[66%59 או 85ַחוח%) המרכיבים את מערכת התוכנה. לדוגמה, ניתן להגדיר עצס מטיפוס קוב או, עצס מטיפוס עובד, או עצס מטיפוס אחר כלשהו. עצס מטיפוס עובד יכול להכיל נתונים, כגון, שס העובד, מספר ויהוי ושכר. עד כאן העצס דומה למבנה הרשומה, אולס העצס מורכב גס מסדרה של פעולות שהתוכנית מבצעת על הנתוניס הכלולים בו. לדוגמה, בעצס מטיפוס קוב נמנות פעולות רגילות כגון הדפסה, מחיקה או העתקת קוב>. לעצס מטיפוס עובד ניתן לייחס פעולות של הדפסה, קידוס או חיסול של העצס. בשפת ++6 המחלקה היא המעטפת של העצס אשר מכילה בתוכה את הנתוניס והפונקציות שפועלות עליהס. בחלק זה של הספר נציג את המחלקה בצורה מפורטת. חלק זה כולל את הפרקים הבאים: ד פרק 21 - המחלקות: תחילת הדרך פרק 22 - החלק הפרטי והחלק הציבורי פרק 23 - פונקציות בנייה ופונקציות פירוק פרק 24 - העמסת אופרטוריס ב ב רנ ם פרק 25 - פונקציות סטטיות ומשתני המחלקה 207 8 ++6 בקלות הלחקלקות: תחילת הדדרךר המחלקה (01855) היא כלי העבודה העיקרי בשפת ++6 כשפת תכנות מונחה עצמים. בפרק הנוכחי נראה שהמחלקה דומה במידה רבה למבנה הרשומה (507060076). המחלקה היא המעטפת של המרכיבים של העצם, הכוללים את הנתוניס ואת הפונקציות הפועלות עליו, בכך שהיא מקבצת נתוניס או משתניס שמתייחסים לפריטי נתוניס (עצמים, אובייקטים), או לפונקציות שפועלות על הנתוניסם האלה (שיטות, 5ה). שפת ++6 מאפשרת לך להגדיר את כל המאפיינים (תכונות) של עצם. במקרה של נתוני עצס מוחשי מסוג טלפון, למשל, המחלקה תכיל שדות נתוניס שיפרטו אס זה טלפון חוגה או טלפון לחצניס והפעולות שניתן לעשות בו. על ידי הקבצה של נתוני העצס למשתנה אחד (המבנה), אפשר לפשט את התכנות ואת אפשרות השימוש החוזר בקוד. בהמשך הפרק נדון בנושאיס הבאים : > להגדרת המחלקה בתוכנית צריך לפרט את המשתנים ואת הפונקציות הכלולים בה. + הגדרת המחלקה כוללת תבנית (8%6!קוח6ד) שבאמצעותה התוכנית יכולה ליצור עצמים מטיפוס המחלקה, כשם שתוכנית יוצרת משתנים מטיפוס שחו, זְהח6 וכדי. > השמה של ערכים לנתוניס של המחלקה באמצעות אופרטור הנקודה. > קריאה לפונקציות המחלקה באמצעות אופרטור הנקודה. פרק 21: המחלקות: תחילת הדרך 209 העצם ותכנות מונחה עצמים במובן הפשוט ביותר עצם 00660 - אובייקט) הוא דבר (פַחוחז). בתוכניות הרגילות, המשתניס מוגדרים לאחסון נתוניס אודות דברים של העולס האמיתי, כמו לדוגמה עובדים, ספריס וגס קבצים. עיצוב תוכנית המתבסס על שיטת תכנות מונחה עצמים מתמקד בדברים (פפָחוחד) המרכיבים את מערכת התוכנה (היישוס) ואת הפעולות שיש לבצע על אותס הדבריסם. לדוגמה, הפעולות שיש לביצוע בעצס מטיפוס קוב הן הדפסה, הצגה, מחיקה ועדכון. בשפת ++6 המחלקה היא התבנית להגדרת העצם. מטרת התכנות היא להכניס בתוך המחלקה את המידע המירבי אודות העצם. בדרך זו ניתן לנצל את הגדרת המחלקה במספר רב של תוכניות. המחלקה מורכבת מאלמנטיס שהם נתוניס ופונקציות הפועלות על הנתוניס האלה. בספרות המקצועית הדנה בתכנות מונחה עצמיס מתייחסים לפונקציות הפועלות על נתוני המחלקה במונח שיטות (6%8065). בדומה למבנה הרשומה, המחלקה המוגדרת בתוכנית חייבת להיות בעלת שס ייחודי בה. במשפט הגדרת המחלקה, מרכיביה נרשמים בתוך סוגרייס מסולסליס. ) סתהת 01888 01858 מסממתפסת 2868 // ;ע6מתסת 8868 16 עסמתסת תס%1סתטע // ; (%מ1) צס6מתסת שסם8 18סע ו לאחר הגדרת המחלקה ניתן להגדיר משתניסם שהס העצמיס (00[600) מטיפוס המחלקה הצו. להלן דוגמה של הגדרת עצמים: 0076000 ,סשטס 001606 ,6תס 00606 פתת 01858 בהמשך מוצגת הגדרה של מחלקה בשס 66ץס!ח6. המחלקה מכילה משתניסם לאחסון הנתוניס ופונקציות או שיטות הפועלות עליהם. ] 766ץ10קתס 018585 :טס ; [64 ] סתאם תס 2 6010766 סַם0ס1 ;ץ8182פ 11086 (10סט) 107606קת6 שסם8 14סע ז 2 >> סתהםת >> " :ס6תהא" >> ס6טסס ;601 >> 16 60010766 >> " :10" >> סטסס 12 >> צע5818 >> " :581827" >> סגוסס 7 0 ++6 בקלות המחלקה שבדוגמה מורכבת משלושה משתנים ופונקציה אחת. יש לשים לב לתווית ":6ו!פטק" המופיעה בתוך הגדרת המחלקה. בפרק 22 נלמד שאלמנט במחלקה יכול להיות פרטי (סזבּטזזק), או ציבורי (6)!טשפ). דבר וה קובע כיצד התוכנית יכולה לפנות לאלמנט. במקרה הקודס, כל האלמנטיס נמצאיס בחלק הציבורי של המחלקה, ולכן התוכנית יכולה לגשת אליהם על ידי שימוש באופרטור הנקודה (וס+ּז6קס +0) של שפת ++6. לאחר הגדרת המחלקה בתוכנית ניתן להגדיר עצמיסם (משתנים) מטיפוס המחלקה. כפי שנראה בדוגמה הבאה: שם המחלקה ;ץ82 500200 ,00858 ,ש6אע2סט צס1סת משתני המחלקה (עצמים) בתוכנית 51961855.629 מוגדריס שני עצמיס מטיפוס המחלקה 66ץסוסוח6. השימוש באופרטור הנקודה מאפשר לתוכנית להציב ערכים למשתני המחלקה. בהמשך התוכנית מופעלת פונקציית המחלקה 66עסוקוח6 שוסח5, כדי להציג את הנתונים של העובדיס. מומלצ להגדיר את המחלקה בקוב\ כותר ח, ולהכליל אותה בקובא מכ6 כ-06ט|6ח1א. <ת.ת108%2608> 866ט610ת1+ ] 766ץ10קתס 0185855 :טס ; [64 ] סותאם תס 6010766 שַם0ס1 ;ץ8182פ 11086 (10סט) 107606קת6 שסם8 14סע זָ ;1 >> סתהם >> " :סתבהא" >> סטסס ;1 >> 16 60010766 >> " :10" >> סטסס 2 >> צע5818 >> " :581827" >> סגוסס <ת.ת108%268> 06100₪6ם1 <ת.06ם5%21> 01066ם1 "ת. 01855קת6" 010₪6ם1 (ס1סט) ת1נאת ה1סט ָ ;055 ,ש6אעסט צס1סת פרק 21: המחלקות: תחילת הדרך ‏ 211 ; ("6סע מתתסש" ,סתהת.62א2סא) צץס5620 72 = 10 60010766 ע6א2ס₪ 2 = 7ץ62.58182אע0סש ; ("ה8פתהט שְסקהת" ,פתהַת.55סס) צץק5620 2 = 16 05858.600010766ס 2 = צ088.581829כ ; () 6010766 אסם5. 02862 ; () 107660קתס חסם5. 088 ו בתוכנית מוגדריס שני עצמיס מטיפוס 66ץס!וקח8, האחד בשם זפאזסשו והשני בשס 5. בהמשך מתבצעת השמה של נתונים למשתני העצמים תוך שימוש באופרטור הנקודה. בסוף התוכנית קוראיס לפונקציה 66ש0!0ח6 ששסח5 ומפעיליס אותה. מהם עצמים (אובייקטים)? ברוב תוכניות ++6 נמצא התייחסות לישויות, או עצמיסם, שבעולס הממשי. לפי הפירוש הפשטני ביותר, עצס (05[660, אובייקט) הוא דבר ממשי, כמו למשל מכונית, כלב או שעון. לעצם יש מספר תכונות וגם פעולות שהתוכנית אמורה לבצע על אותן תכונות. לדוגמה, במקרה של העצם מטיפוס שעון, התכונות (שדות הנתוניס) עשויות לכלול את השעה הנוכתית, ואת השעה שנקבעה לצלצול המעורר. הפעולות שהתוכנית תבצע על השעון תהיינה כיוון השעה, כיוון השעון המעורר או כיבויו. התכנות מונחה העצמיס (סחווחותהזססזק %60ה6ס-00[600) מביא להתמקדות בעצמים שעליהס ובאמצעותס פועלת התוכנית, ובפעולות שניתן לבצע עליהסם. הגדרת פונקציית מחלקה מחוץ להגדרת מחלקה במחלקה 601066 הקודמת מוגדרה פונקציית המחלקה בתוך המחלקה במקרה זה הפונקציה נקראת פונקציה משולבת (חסוש6חט+ 6חו!ח1). הגדרת הפונקציה עלולה להקשות על הבנת המחלקה עצמה, כאשר הגדרת הפונקציה מורכבת יותר והקוד שלה מתרחב. במקוס להציב את הגדרת הפונקציה במלואה בתוך הגדרת המחלקה, ניתן להגדיר את הפונקציה מחוצץ למחלקה, ולהכניס בתוך המחלקה רק את הצהרת הפונקציה (ח0ו066!3173% חסושס6חטת), אב-טיפוס (6כע%ס6סיום). 2 ++6 בקלות הגדרת המחלקה תיראה כמו בדוגמה הבאה: ] 766ץ10קתס 0185855 :פטס ; [64 ] סותאם תס 2 6010766 סַם10 ;ץ8182פ 11086 אב טיפוס של פונקציה | ; (18סט) 610766 שסם8 ב1סעט ;ו פונקציות שונות עשויות לשאת את אותו שס ועל כן, כאשר מגדיריס פונקציה מחוצ למחלקה, יש להציב את שס המחלקה ואופרטור טווח הכרה (::) לפני שס הפונקציה. להלן ההגדרה החדשה של הפונקציה 66ץס|קחח6 צוסח5. שם המחלקה (10סט) 10766קתס שסם8: :60010766 בנ1סע שס הפונקציה ן 12 >> שתהת >> " :ס6תהא" >> סגוסס 12 >> 16 60010706 >> " :10" >> סטסס 17 >> צ88182 >> " :581827" >> סגוסס ן בתוכנית 695.א61455*0 מוצגת הגדרת הפונקציה 66ץס!ח6 אוסח5 מחוצ למחלקה, ולשס כך משתמשים באופרטור הגלובלי כדי לציין את שס המחלקה. הערה מומלץ לבנות את המחלקה (6!855) בקובץ כותר ח, את הגדרות הפונקציה השייכות למחלקה - בקובץ קק6, ואת הקובץ הראשי לבנות בקובץ סקס 7 נפרד. המחלקה פונקציות הקוב\ הראשי 5 המחלקה חוהוח יש ליצור פרויקט ולהריץ את התוכנית. הנחיות לבניית פרויקט, ראה בפרק 41 "יצירת פרויקט". <ת.ת108%268> 61066ת1+ <ת.06ם5621> 010₪6ם1+ ] 766ץ10קתס 0185855 :טס ; [64 ] סותאם תס 6010766 סַם0ס1 ;ץ58182ם 11086 ; (010ט) 107606קתס חסם5 ב1סעט ;ו פרק 21: המחלקות: תחילת הדרך 213 (10סט) 10766קת6 שסם8: :60010766 בנסע ז ;601 >> סתהת >> " :סתהא" >> סטסס 12 >> 16 60010706 >> " :10" >> סטסס 17 >> צ88182 >> " :581827" >> סגוסס ו (16סט) מ1את ה1סע ן ;055 ,ש6אעסט צס1סת ; ("6סע מתסש" ,ס6תהת.62א2סא) צץק5620 72 = 10 60010766 ע6א2ס₪ 2 = ץ62.58182אעסש ; ("ה8פתהט שְסקה8ת" ,פתהַת.55סס) צץק5620 2 = 16 05858.60010766ס 2 = צ00885.58182 ; () 6010766 אסם62.5א02%סח ; () 10766קתס חאסם5. 088 שיטות (פונקציות) המחלקה השימוש במחלקות מאפשר לקב> את נתוני העצס ואת הפונקציות (שיטות) אשר פועלות על נתוניס אלה, בתוך משתנה אחד (העצם, האובייקט). כאשר מגדיריס שיטה (6%7000) של עצם, ניתן לעשות ואת באחת משתי הדרכיס הבאות: לכלול את קוד הפונקציה בתוך הגדרת המחלקה, או לכתוב את משפטי הפונקציה מחוצ למחלקה. המקרה הראשון, שבו כולליס את השיטה/הפונקציה בתוך המחלקה, הוא לכאורה נות יותר, אך במהרה תיווכח שהגדרה כזו הינה מסורבלת ומקשה על המשתמש במחלקה לוהות את השירותיס שהיא מספקת. במקרה השני, שבו הפונקציה מוגדרת מחוצ למחלקה, יש לציין בתוך המחלקה את אב הטיפוס של כל אחת מהשיטות/הפונקציות (כלומר, שס הפונקציה, הערך המותחזר על ידה, מספר הפרמטרים שהיא מקבלת והטיפוס שלהס), את ההכרזה על הפונקציה. כדי להגדיר פונקציית מחלקה מחוצ להגדרת המחלקה, יש לכתוב לפני שס הפונקציה את שס המחלקה ואת אופרטור טווח ההכרה: (828(0%0618ק) סתהת תסנססתט5: :פַתהת 01885 6קץ6 םע2660 8:8 // 4 ++6 בקלות דוגמה נוספת בתוכנית 16855.699פפפ מוגדרת המחלקה 0085, אשר מכילה מספר שדות נתונים ואת הפונקציה 660ז0 אוסח5. כפי שהצגנו קודם, הגדרת פונקציית המחלקה נמצאת מחוצ למחלקה עצמה. התוכנית יוצרת שני עצמיס מטיפוס 0085, ובמהלך הרצתה היא מציגה על המסך את המידע המתייחס לכל אחד מהם: <ת.ת108%268> 61066ת1+ <ת.6ם5621> 01086ם1+ ]1 0008 0185855 :טס ;[660]64עכ עַַַםת0 %2 87628760 6ת1 %2 87628060 6ת1 ; (02660)07010 חסם58 14סע ;ו (2660)0010ס חטסם40885::8 בנסע ז ;01ת6 >> 2660 >> " :226600" >> שגוסס ;601 >> 61026 80612806 >> " :6ם610ח ס6שהתסטת" >> סטסס ;601 >> 6ם610ם 8062806 >> " :26106 6שהתסטת" >> סטסס (ס10סט) ת1נאת ה1סט \ ;6% ,צְססאם 0005 ; ("ת618א8ת1אכע" ,2660 למסת) צץק5620 72 = 6106 62806טב. צססבּת 2 = 6₪מםש61ם 62806טב. צססבת ; ("6060000ת5 0ת6618ת5" ,660ע66.02הת) צץק5620 2 = 610260 62806ט6%.8א8ת 2 = 6₪מםש61ת 86%.87612806ת ; () 02660 חסם8. שְססהּת ; () 026060 חסם5. 866 פרק 21: המחלקות: תחילת הדרך 215 סיכום בתוכניות הכתובות בשפת ++6 נוהגים להשתמש במחלקות. כפי שהצגנו, הגדרת המחלקה דומה להגדרת מבנה הרשומה. בפרקיס הבאים נציג את התכונות, העוצמה ואת לפני / של ל 0% היכולת של המחלקה. שנעבור לפרק הבא, נבדוק אס מובניס הנושאיס הבאיס: במובן הפשוט, העצס הוא הדבר אשר עליו התוכנית מבצעת את פעולותיה. תוכניות בשפת ++6 מציגות עצמיס באמצעות המחלקה. המחלקה, בדומה למבנה הרשומה, מכילה אלמנטיס. חלק מהאלמנטים מיועדיס לאחסון מידע (נתוניסם) וחלק מיועד לבצע פעולות על המידע (פונקציות/שיטות). לכל מחלקה בתוכנית חייב להיות שם ייחודי. לאחר הגדרת המחלקה ניתן להגדיר עצמיס מטיפוס המחלקה המוגדרת. הגישה לאלמנטיס של המחלקה מתאפשרת על ידי השימוש באופרטור הנקודה. ניתן להגדיר את פונקציות המחלקה בתוך הגדרת המחלקה, או מחוצה לה. כאשר מגדיריס פונקציה מחוצ להגדרת המחלקה, יש להציב לפני שס הפונקציה את שס המחלקה ואת אופרטור טווח ההכרה לפי הפורמט חסשסחט\::6|855. בפרק זה התייחסנו לתווית :6ז!פשק המופיעה בתוך הגדרת המחלקה. הסברנו שהצבת המילה בתוך ההגדרה מאפשרת גישה לכל האלמנטיסם של המחלקה מכל מקוס בתוכנית. בפרק 22 נתאר בצורה מפורטת את חלקי המחלקה: החלק הפרטי והציבורי. תרגילים 1 26 כיתבו מחלקה המשמשת כמונה (%6ח60) ובעלת הממשקיס הבאים: 26ו₪8וחו - אתחול המונה לערך הנתון, 6חו ו-066 לעדכון ערך המונה (הוספה וגריעה, בהתאמה), ו-80 המדפיסה את המספרים מ- 0 ועד ערך המונה. כיתבו מחלקה המתארת צפרדע. נתוני המחלקה הם: 6חּח, זס|סס, 6חָב, +חטוסצו. פונקציות המחלקה הן: 508005 %חוזק - המדפיסה את כל הנתוניס של הצפרדע; 5% - המדפיסה *י!!!אסטף"י ומצפצפת בעזרת פעמון המחשב, 8306*61000/2)] פעמים. כיתבו מחלקה ח50ז6ק אשר מכילה שס של איש/אישה ומערך מצביעים (בגודל 5) לחמישה חבריס שלו/שלה (אלה הס עצמים מטיפוס ח50ז6ק). המחלקה תספק את השרותיס האלה: > 6וחהח 56% - קביעת שס איש/אישה. > 0ח 5% - הוספת חבר/ה לרשימת החברים (בצורה מעגלית, כך שהכניסה השישית באה על חשבון המקוס של הכניסה הראשונה). > 500005 >חוזק - הדפסת רשימת החברים. > 26]|ה₪וח! (אופציונלית) - אתחול משתני המחלקה. ++6 בקלות החלק הטרטי והחלק הציבורי בפרק הקודם הגדרנו שתי מחלקות אשר בתוכן הצבנו את המילה סווטגוק. כפי שהסברנו, המילה הזו מאפשרת גישה לכל האלמנטיס של המחלקות המוגדרות על ידי שימוש באופרטור הנקודה. בפרק זה נסביר כיצד ניתן לשלוט על הגישה לאלמנטיס של המחלקה על ידי הצבתס בחלק הפרטי (סזהּצוזק), או בחלק הציבורי (סו!|טטק) של המחלקה. בהמשך הפרק נדון בנושאיס הבאיס: > הגדרת אלמנטים פרטיים ואלמנטים ציבורייס במחלקה. > הבנת הסתרת מידע (חחו0וח הסטהוזסיח1), וכיצד להשתמש בה בתוכנית. > השימוש בפונקציות ממשק (5ח600חט] 01866ח1), לצורך גישה לאלמנטיס פרטייס של המחלקה. בפרק 21 ציינו שצריך לכלול בהגדרת המחלקה מידע רב ככל האפשר אודות העצם. בצורה זו העצמיס יכילו מטען מידע המאפשר להס להיות בסיס למספר גדול של תוכניות. כך, הס יהיו מוכללים (66ח607%31 )561) במידה כזו שהס יספקו את כל הדרוש, הן מבחינת הנתוניס והן מבחינת הפעולות המתבצעות על נתוניס אלה. פרק 22: החלק הפרטי והחלק הציבורי 217 הסתרת מידע המחלקה מורכבת מנתונים ושיטות (פונקציות). כדי להשתמש במחלקות ולנצל את יכולתן, התוכנית צריכה להכיר מה הס הנתוניס שהמחלקה מסוגלת לאחסן (משתניס) ומה הן השיטות המוגדרות בה (פונקציות). לעומת ואת, אין כל צורך לדעת כיצד השיטות פועלות. לדוגמה, במחלקה מטיפוס קוב 66₪), מספיק לדעת שקיימת בה פונקציה בשם שחוזק ושהקריאה אליה על ידי המשפט שחוזק.86 תגרוס להדפסת עותק מפורמט של הקוב>. בדומה, טוב לדעת על קיוס הפונקציה 06166 816 המבצעת מחיקה של קוב. כמובן שמבחינת התוכנית אין צורך לדעת כיצד פונקציות אלו פועלות. במיליסם אחרות, התוכנית צריכה להתייחס אליהן כקופסאות שחורות. למעשה, התוכנית מכירה את השיטות שמוגדרות במחלקה ויודעת לקרוא אליהן ולהעביר להן את הפרמטרים הדרושים, אך אין היא מכירה את התהליכיס שמתרחשיס בתוך המחלקה. הסתרת מידע (0ח161ח חסוזהּוחז0+ח1), היא תהליך בו מאפשרים לתוכנית להכיר את המידע המינימלי הדרוש לה לשס שימוש וניצול המחלקה. החלק הפרטל (סְהעוזק) והחלק הציבורי שו!פטוק) של המחלקה מאפשרים ליישס את תהליך הסתרת המידע. במחלקות המוגדרות בפרק 21 הוצבה התווית ":6ו!פטס", כך שכל האלמנטים של המחלקה מוכרים וידועים על ידי התוכנית כולה. לכן, מכל מקוס בתוכנית ניתן לגשת לאלמנטיס של המחלקה תוך שימוש באופרטור הנקודה. ] 766ץ10קת6 0185855 :טס ; [64 ] סותאם תס 6010766 סַם0ס1 ;ץ8182פם 11086 ; (010ט) 107606קתס חסם5 ב1סעט ו בתהליך עיצוב המחלקה ניתן לראות שחלק מהאלמנטים שלה מיועדים לשימוש פנימי, ולשאר מרכיבי התוכנית אין צורך בהס. אלמנטים אלה הס אלמנטים פרטיים של המחלקה וצריכיס להיות מוסתריס לתוכנית. אס אין מצייניס את התווית ":סו|סטס" בתוך המחלקה, המשמעות היא שכל האלמנטים של המחלקה מוצביס בחלק הפרטי שלה, ואז אי אפשר יהיה לגשת אליהס על ידי שימוש באופרטור הנקודה. הגישה לאלמנטיס בחלק הפרטי של מחלקה מותרת לפונקציות המחלקה בלבד. כאשר מגדיריס את המחלקה, יש להפריד בין החלק הפרטי לבין החלק הציבורי שלה לפי הדוגמה הבאה. 8 ++6 בקלות ]) 01888 8006 01888 :טס 2 סשת50 סת1 משתנה ציבורי ; (1108% ,%ת107866)1עק 16181126םת1 ב1סעט ; (010ט) 68%8 טסם8 16סע : ספטנמס משתנה פרט?----- ;8106ט צְ%6 6ת1 ; עססתטת צץ%6 11086 כפי שניתן לראות, התוויות אטוז ו-6וופטון מאפשרות להגדיר בצורה ברורה את האלמנטיס הפרטייס ואת האלמנטים הציבורייסם של המחלקה. במקרה זה, תתאפשר גישה ישירה לאלמנטיס הציבוריים של המחלקה על ידי שימוש באופרטור הנקודה, לפי הדוגמה הבאה: % תבה 026866 // 2 01885885 5006 2 = 18016ע2הט 606.8006[סס ;(1.2345 ,866)2002ט10עק 1%181126ם606.1רסס ()08%8 חטסם606.8רסס אם ננסה לגשת לאלמנטיס הפרטיים של המחלקה 6ט|אצ שס6א, או זסטוחטחה ץ6א תוך שימוש באופרטור הנקודה, המהדר יציג הודעה של שגיאת תחביר (זסזום א8זחץ5). בדרך כלל נהוג להגן על נתוני המחלקה מפני גישה ישירה של התוכנית על ידי הצבתס בחלק הפרטי של המחלקה. על כן, התוכנית אינה יכולה לגשת ולעדכן את ערכי המשתניס האלה על ידי שימוש באופרטור הנקודה. במקוס זה, שימוש או עדכון של הערכיס במשתניס יתבצע על ידי קריאה לפונקציות עדכון המוגדרות במחלקה. על ידי מניעת הגישה הישירה של התוכנית אל משתני המחלקה, ניתן להבטיח שהערכיס שיוצבו במשתני המחלקה תמיד יהיו תקינים. למשל, נניח כי בתוכנית מוגדר עצס מטיפוס 686601 ז6|68טח המכיל משתנה בשסם חאצוס0 66ח, אשר חייב לקבל ערך מתוך טווח המספרים הנע בין 1 לבין 5 בלבד. אם המשתנה חשוס0 6 הוא אלמנט ציבורי של המחלקה, התוכנית יכולה לפנות אליו באופן ישיר ולעדכן את הערך שלו: 1 = מא60 816ת.2080602 61682טת אילו היינו מציביס את המשתנה בחלק הפרטי של המחלקה, היינו יכוליס להשתמש בשיטה המקובלת במחלקה, כמו הפונקציה חשוס0 66 ח85519, שתפקידה לעדכן או לשנות את ערך המשתנה. בדוגמה ניתן לראות שהפונקציה מבצעת בדיקות תקינות של הקלט למשתנים, כך שניתן להבטיח שהנתון המאוחסן במשתנה תמיד יהיה תקין. פרק 22: החלק הפרטי והחלק הציבורי 219 (06ו781 6ת1) ת61600%9ת ת6::889510אטת 6ת1 ו ((5 => 6ט810ט) 86 (0 < 6ט1ט)) +1 ו 2 = מתח40 616 %תסתת85810 5000688101 //‏ ;(0)םעט266 ] 6 86 8110טם1 //‏ ;(1-)םעגט260 שיטות המחלקה המיועדות לבקרת תקניות הקלט של משתני המחלקה נקראות פונקציות ממשק (6₪005הט] %61366ה1). פונקציות ממשק מאפשרות להגן על הנתוניס של המחלקה. אלמנטים פרטיים ואלמנטים ציבוריים המחלקות בשפת ++6 מורכבות מנתוניס ומשיטות (005ח6%/). כדי להבדיל בין האלמנטיס שמותרת גישה ישירה אליהס על ידי שימוש באופרטור הנקודה, לבין האלמנטיס האחרים, שפת ++6 מאפשרת להגדיר במחלקה אלמנטים פרטיים ואלמנטיס ציבוריים. מצד אחד, ניתן לגשת לאלמנטים הציבוריים על ידי שימוש באופרטור הנקודה. מצד שני, הגישה לאלמנטים הפרטיים מתאפשרת באמצעות פונקציות המחלקה בלבד. ככלל, מומלצ להגן על נתוניס רבים ככל האפשר המוגדרים במחלקה על ידי הצבתס בחלק הפרטי של המחלקה. אלמנטים פרטיים ואלמנטים ציבוריים בתוכנית ₪155.695ס*א1 מתואר השימוש באלמנטיס הפרטייס ובאלמנטיס הציבורייס של המחלקה. בתוכנית מוגדר עצס מטיפוס 66ץ0!קוח6, שהיא המחלקה המוגדרת להלן. ] 766ץ10קתס 0185855 :טס ;(5108% ,סַת10 ,* ע8ת1068)0הט ם85510 6ת1 ; (10סט) 6107606 שטסם8 16סע ; (5108%) ץ58182 06ם8ם0 6ת1 ; (18₪)0010 866 סַם0ס1 : 66הטנ1עס ;[64][סתאם עַַ8ם0 2 60107606 סַם0ס1 ;ץ58182 1086" 0 ++6 בקלות כל משתני המחלקה מוגניסם על ידי הגדרתס כאלמנטיס פרטיים. הגישה לנתוני המחלקה מתאפשרת באמצעות פונקציות ממשק של המחלקה בלבד. להלן קוד התוכנית 699.שפזווס=א1. <ת.ת108%208> 01066ם1 <ת.06ם5%21> 01066ם1 ] 766ץ10קתס 0185855 :טס ;(5108% ,סֶת0ס1 ,* ע8%ת10685)0הט ם855810 6ת1 ; (10סט) 6107606 שסם8 16סע ; (5108%)ץ58182 06ם8ם0 6ת1 ; (18)0010 866 סַם0ס1 : ס6הטנמס ;[64]סתאם עַַַם0 2 600107606 סַם0ס1 ;ץ58182 1086" ל ,סתהת קת6* ע82ת0) 106585הט מ85810: :10766קת6 6ת1 (צע5818 קת6 5108% ,186 סת6 סַם0ס1 ; (סתהת קת6 , סתהת) ץ56200 2 תס = 14 66צ10סת (50000.0 > 58182 קתס) 15 \ ;2ץ58182 קת6 = 58182 1 | ; (0) םשגו 6 ] 1-6 ץע8818 110טםתך // ; (1-) ם2ו266 (10סט) 10766קת6 שסם8: :60010766 בנסע ז ;1 >> סשתהת >> " :10766קתם" >> סטסס 12 >> 16 600107606 >> " :10" >> סטסס 17 >> צ88182 >> " :581827" >> סגוסס (צע85818 חטסם 7)5108%6ץ58182 06ם10766::028ח6 6ת1 | (50000.0 > 88182 שס6ם) 15 ז ;81857 שסת = 58182 פרק 22: החלק הפרטי והחלק הציבורי ‏ 221 01 // ; (0) םשגו26% ] 16 ץע8818 110טםתך // ; (1-) םעו266 (16)0010 010766::06%6ת6 סַם0ס1 | ; (10 00010766) פעגו266 (16סט) מ1את ה1סע ן ; 6א סש צס1סת (101,10101.0 ,"הפתה08 צְסְסְבּה")65ט1הט ם61.85810א2סש) 15 (0 == 12 >> "89881066 8100698ט 10766קתםת" >> סגוסס ; () 6010766 טסם5. 02862 (0 == (581827)35000.00 סִסְםת8ת62.0א2סש) 15 \ ;601 >> "00ת388810 581827 טסא" >> סטסס ; () 6010766 אסם5.ע6א02%ס ] 1-6 12 >> "806015160 58182 8116טםת1" >> 006 על אף שהתוכנית ארוכה, הפונקציות המוגדרות בה קלות להבנה, לכן כדאי לבחון את משפטי התוכנית. תפקידה של פונקציה 6ט|8 0חו855 הוא לתת ערכיס התחלתייס למשתניס שנמצאיס בחלק הפרטי של המחלקה. בפונקציה גו מתבצעת בדיקת תקינות קלט. הפקודה 1 בפונקציה בודקת אס הזנת שכר העובד חוקית. הפונקציה 6 צוסח5 מציגה על המסך את הערכים המאוחסניס במשתנים הפרטיים של המחלקה. במחלקה שתי פונקציות ממשק: +58|81 6פַח608 ו-10 966, שדרכן ניתן לגשת לאלמנטיס הפרטיים של המחלקה. לאחר הידור והרצה מוצלחים, מומלץ לשנות את קוד התוכנית ולנסות לגשת למשתנים הפרטיים של המחלקה על ידי שימוש באופרטור הנקודה. את משפטי הגישה יש להציב בתוכנית הראשית חואוח. ברגע שנבצע הידור של התוכנית, המהדר יציג על מסך הודעת שגיאה, מכיון שאין אפשרות לגשת בצורה ישירה לאלמנטיס הפרטייס של המחלקה. 2 ++6 בקלות פונקציות ממשק כדי למנוע שגיאות ותקלות שונות ולהכתיב גישה מסודרת לאיברי המחלקה, צריך להגביל את הגישה אל נתוני המחלקה. לשס כך מגדירים את איברי המחלקה כפרטיים (סספטוזק). בדרך זו התוכנית אינה יכולה לפנות אל הנתוניס שבמחלקה בעורת אופרטור הנקודה. על המחלקה להגדיר פונקציות ממשק, שבאמצעותן ניתן יהיה להקצות ערכיס לאיבריה הפרטיים, המוגדרים 6זפטוזק. פונקציות הממשק יבחנו ויתנו תוקף לערכים שיוקצו לאיבריס אלה. איברי המחלקה ואופרטור טווח ההכרה הכללי יש לשיס לב ששמות הפרמטריס של הפונקציות המוגדרות בתוכנית 692.פפנוּוס:זא1 מתחילים בצירוף האותיות. קוחס. סת60 6ם10 ,פתהת קתס6* ע8םת65)0ט1הט ם10766::88810קח6 6םת1 (ץ58182 קחתס 11086 הצבת צירוף האותיות קוח6 בתחילת שמות הפרמטרים של הפונקציות מיועדת למנוע התנגשות בין שמות הפרמטרים לבין שמות המשתנים של המחלקה. כאשר סוג ה של התנגשות מתרחש, ניתן לפתור אותה על ידי השימוש באופרטור טווח ההכרה הכללי (::) - (ז02073%0 חהססט!₪650 |61023) של שפת ++6. להגדרת הפונקציה הבאה משתמשים באופרטור טווח ההכרה ומציבים אותו ואת שס המחלקה לפני שמות משתני המחלקה. בצורה זו מאוד קל להבדיל בין שמות משתני המחלקה 66ץס!קוחס לבין שמות הפרמטריס של הפונקציה. ,סתהת* ע8ת106585)0הט מ10766::85810קח6 6םת1 (צ88182 51086 ,10 6010766 סַם0ס1 ו ; (סתהת ,סתהּת: : 7606ץ10קת6) ץ56200 600107685 = 10 1066ק60: :66צ10סת (50000.0 > צץע8818) +11 ו ;ץע5818 = צץע10766::5818%סתס 1 |// ; (0) ם2ו26% ] 1-6 צע5818 8110טםתך // ; (1-) ם0%ו66ע השימוש בשס המחלקה ובאופרטור טווח ההכרה בצורה המתוארת לעיל, מונע התנגשות בין שמות המשתניס ובין הפרמטריס של הפונקציה. פרק 22: החלק הפרטי והחלק הציבורי 223 נצל את אופרטור טווח ההכרה לפתרון התנגשות איברי המחלקה בעת הצהרה על פונקציות מחלקה ייתכן ששס של משתנה מקומי השייך לפונקציה (שיטה) מסוימת, והה לשס של אחד מאיברי המחלקה. כברירת המחדל, המהדר יתייחס תמיד לשס המשתנה המקומי, אשר יגבר על השס הפרטי במחלקה. ניתן לגשת כך אל איבר המחלקה המתאים, על ידי שימוש בשס המחלקה ובאופרטור טוות ההכרה: ;6ו781 8086 = פתהת מ6%קתפת: :סתהת 01858 הגדרת פונקציות פרטיות במחלקה בכל הדוגמאות המוצגות בפרק הנוכחי, הוצבו המשתניס בחלק הפרטי של המחלקה. בתוכניות מורכבות יותר, ייתכן שלא יהיה רצוי שתהיה גישה ישירה מהתוכנית למספר פונקציות במחלקה. במקרה זה ניתן להציב את הגדרת הפונקציות האלו בחלק הפרטי של המחלקה, וכך למנוע גישה ישירה אליהן על ידי שימוש באופרטור הנקודה. סיכום בקרת הגישה של התוכנית לאלמנטיס של המחלקה מקטינה את הסיכוי לתקלות הנובעות משימוש שגוי באלמנטיס אלה. בקרת הגישה לאלמנטיםס של המחלקה מתבצעת על ידי הצבתס בחלק הפרטי שלה. ברוב המחלקות המוגדרות בשפת ++6 קיים שילוב של אלמנטיס פרטיים ואלמנטים ציבוריים. לפני שנעבור לפרק הבא, נבדוק האם מובנים לנו הנושאים הבאים : * אלמנטים במחלקה יכולים להיות בחלק הפרטי או בחלק הציבורי של המחלקה. מכל מקוס בתוכנית ניתן לגשת בצורה ישירה לאלמנטיס הציבוריים של המחלקה באמצעות אופרטור הנקודה. הגישה לאלמנטיס הפרטיים של המחלקה נעשית באמצעות פונקציות המחלקה בלבד. * על פי ברירת המחדל, ובהיעדר ציון מפורש, שפת ++6 מניחה שכל האלמנטים במחלקה הס פרטיים. % השמת ערכים למשתנים פרטיים במחלקה מתבצעת על ידי פונקציות ממשק. > בפונקציות המחלקה ניתן להשתמש בשס המחלקה ובאופרטור טווח ההכרה (::) לפי הפורמט פִַַהַח::66ץס!קוח6, וכך למנוע התנגשות בין שמות המשתנים ובין הפרמטרים של הפונקציה. אחת הפעולות הנפוצות בעת יצירת עצס היא הצבה של ערכיס התחלתיים במשתניס שלו. בפרק 23 נציג את הבנאים (6%075ש6005%7) בשפת ++6, שהס פונקציות מיוחדות שמופעלות בצורה אוטומטית בעת יצירת העצם. על ידי שימוש בפונקציית בנייה ניתן לאתחל בקלות את העצמיס של המחלקה. 4 ++6 בקלות תרגילים 1 כיתבו מחלקה בשם חספז6ק המספקת את הפונקציות הציבוריות האלו: (806 %םת1 ,פת8ת *82ת15)0ת1 ב1סט ; (10סט)6ת1עס 1סט הפונקציה %חוזק תדפיס את שס האדם, גילו ושנת הלידה שלו. יש להשתמש בפונקציה פרטית בשם ז68ץ חזזוט, המחשבת את שנת הלידה על פי הגיל והשנה הנוכחית. העדה: השתמשו בפונקציה (06108160 לקבלת השנה הנוכחית. 2 כיתבו מחלקה המייצגת נקודה במישור על ידי קואורדינטות ץ,א. משתני המחלקה /,א יהיו פרטיים. כיתבו פונקציות לאתחול הנקודה והתזרת מיקוס הנקודה (הקואורדינטות). 3 כיתבו מחלקה הכוללת אוסף (56%) של מספריםס ממשיים. על המחלקה להגדיר את הפונקציות הציבוריות הבאות: + הוצאת כל המספרים מהקבוצה - (0ו0ע)6!687 0וסצ + הוספת מספר לקבוצה - (וחטח 800)008% סוסצ בדיקה אס מספר נתון נמצא בקבוצה - (חחטח 15%)08%א6 )ח1 יש להוסיף מספר רק אס אינו כבר קייס באוסף. על המחלקה להשתמש במערך פרטי באורך 50 לשמירת איברי האוסף. 4.| כיתבו מחלקה לביצוע הפעולות המוגדרות בתרגיל 3, אך המאפשרת מספר לא מוגבל של איבריס באוסף. רצוי להשתמש ברשימה מקושרת פרטית. הערה: לפניך תרגיל מורכב במקצת. אם דרוש לך מידע נוסף בנושא ירשימה מקושרתיי, עיין בספר אחר, כמו למשל */המדריך השלס לשפת 6 שבהוצאת הוד-עמי. פרק 22: החלק הפרטי והחלק הציבורי 225 בונקציות בצנייה ובונקוציוח ניירוק אחת הפעולות הדרושות בעת יצירת העצס היא לקבוע ערכיס התחלתיים למשתני העצם. בפרק 22 הראינו שפונקציות המחלקה הן הדרכים היחידות המובילות לאלמנטיס הפרטיים של המחלקה. כדי לפשט את תהליך אתחול העצם, קייס בשפת ++6 סוג של פונקציה מיוחדת שמופעלת כאשר העצם נוצר. פונקציה מסוג זה נקראת פונקציית בנייה (חסוש6חט1 זס+6ש605%) או בנאי. בשפת ++6 קיים סוג נוסף של פונקציה מיוחדת שמופעלת לאחר סיוס הקיוס של העצם בתוכנית. פונקציה מסוג זה נקראת פונקציית פירוק (חסו+6חט+ 6%01ט65%7) או מפרק. בהמשך הפרק נדון בנושאים הבאים : > פונקציות בנייה הן שיטות מחלקה (167005/), המקלות על אתחול משתני המחלקה. השס של פונקציות הבנייה זהה לשל המחלקה. > פונקציות בנייה אינן מחזירות ערך, או טיפוס. %> בכל יצירה של משתנה מחלקה, מופעלת אוטומטית פונקציית הבנייה של המחלקה, אס קיימת כזו. % עצמים שונים עשוייסם להקצות זיכרון לאחסנת נתוניס. כאשר מוחקים עצם, ++6 קוראת לפונקציית הפירוק של המחלקה, אשר יימנקהי' את המקוס בזיכרון שתפסו עד עתה הנתונים של העצם. > השס של פונקציית פירוק אגהה לשס המחלקה לה היא שייכת, ולפניו מופיע הסימן ₪ (006). > פונקציות פירוק אינו מחזירות ערך. ייתכן שהמונחיס בנייה ופירוק יתפרשו באופן מוטעה לאוזן הלא מקצועית. יש לפרשס במובן של כלי עזר בתכנות. הבנאי עוזר להרכבה של העצם, ולעומת זאת המפרק, על פי הגדרתו, פועל בשלבי סיוס פעולתו של העצס. במקריס רבים, תפקיד המפרק הוא לשחרר את הזיכרון שנתפס על ידי העצס בזמן שפעל. 6 ++6 בקלות יצירת פונקציית בנייה פונקציית הבנייה (ח10ול6חט] ז0ז06ז60₪5%) היא פונקציית מחלקה הנושאת את שס המחלקה. לדוגמה, אם שס המחלקה הוא 66עס!קוח6, בנאי המחלקה נקרא 66ץסוקוח6. אנלוגית, במחלקה 6005, שס הבנאי יהיה גס כן 6005. כאשר בתוכנית מסוימת מוגדרת פונקציית בנייה, שפת ++6 מריצה את הפונקציה הזו בצורה אוטומטית בעת יצירת העצס. בתוכנית פפ6.6ט88ד5א60 המוצגת כאן, מוגדרת מחלקה בשס 66עס!קוחס. בנוסף, בתוכנית מוגדר בנאי בשס 601066 שתפקידו לקבוע ערכיס התחלתיים למשתני העצם. פונקציית בנייה אינה מחזירה ערך, ולמרות זאת אין להגדיר אותה באמצעות שוסצ. הפונקציה מוגדרת ללא ציון טיפוס של ערך מוחזר. ] 766ץ10קתס 018585 :טס ; (51080 ,6ת10 ,* עהִת0) 786ץ10סחס (6סץ5 מעט6%ץ סת) מס1נססתט1 עס6סטע959%ת00 // ; (010ט) 6107606 שסם8 16סע ; (5108%)ץ58182 06ם8ם06 6ת1 ; (18)0010 866 סַם0ס1 : ס6אטנעס ;[64]סתאם עַַַם0 2 60107606 סַם0ס1 ;ץ58182 1086" ;ו הכללים להגדרה של פונקציית הבנייה בתוכנית זהיס לכללי ההגדרה של פונקציית מחלקה כלשהלי: ,1 66צ10סתס סַת0ס1 ,סתַם* מַַתם0) 10766קתס: : 66ץס 1סת (צע5818 11086 ; (סתהת ,סתהּת: : 766ץ10סת6) ץ56200 600107685 = 10 66צ10ק600: :66צ10סת (50000.0 > צץע8818) +11 ;ץע5818 = צ10766::5818%2סחס 1-6 46 58182 8116טםמ1 // 72 = 7ע10766::858182קת0 ) ניתן לראות שפונקציית הבנייה אינה מחזירה ערך לפונקציה הקוראת. במקרה זה, פונקציית הבנייה משתמשת באופרטור טווח ההכרה הכללי ובשס המחלקה לפני כל אלמנט, כפי שלמדנו בפרק הקודם. להלן יישוס מלא של התוכנית 6.655ט8 ד05ס6. פרק 23: פונקציות בנייה ופונקציות פירוק | 227 <ת.ת108%208> 010₪6ם1 <ת.08ם5%21> 01066ם1 ] 766ץ10קתס 018585 :טס ; (51080 ,6ת10 ,* פהַתס0) 766ץ10סחס ; (010ט) 6107606 שסם8 16סע ; (5108%) ץ58182 06ם8ם0 6ת1 ; (18)0010 866 סַם0ס1 : טנס ;[64]סתאם עַַַם0 2 60107606 סם0ס1 ;ץ58182 1086" ,1 66צ10קת0 סַת0ס1 ,סתַםת* מַַםס0) 10766קתס: : 66ץס 1סת (צע5818 11086 ; (סתהת ,סתהּת: : 766ץ10סת6) ץ56200 6010768 = 10 10766ק600: :66צ10סת (50000.0 > צץע8818) +11 ;ץע5818 = צץ10766::58182סחס 1-6 846 58182 8116טםמ1 // 72 = 7ע10766::858182קת0 (10סט) 10766קת6 שסם8: :60010766 בנסעט ז ;1 >> סשתהת >> " :10766קתם" >> סטסס 12 >> 16 60010706 >> " :10" >> סטסס ;1 >> 88182 >> " :581827" >> סגוסס (ס1סט)ת1נאת ה1סט \ ;(10101.0 ,101 ,"הפתבהט שְססהם")62אעסט צס1סת ; () 6010766 אסם5.ע62א02%סח ו יש לשיס לב שהצהרה על העצס זסאזסצו כוללת את הערכיס ההתחלתיים של נתוני העצס המסודריס בתוך סוגריים, בדומה לדרך העברת פרמטרים לפונקציה רגילה. הנתוניס שבתוך הסוגרייס מועבריס כפרמטרים לפונקציות הבנייה של מחלקת העצם. ;(10101.0 ,101 ,"הפתבהט צְמסהאם")62אעסט צס1סת 8 ++6 בקלות בתוכנית ניתן ליצור מספר עצמיס מטיפוס 66ץ0ו800, אשר לכל אחד מהם ניתן להעביר את הפרמטריס הדרושים לבנאי כדי לבצע את אתחול העצם. להלן דוגמאות של משפטים ליצירת עצמים מטיפוס 66ץסומוח6 : ;(10101.0 ,101 ,"הפתבהט שְמסהם")62אעסט צְס1סת ;(20000.0 ,57 ,"6סכ מםסע")ץ2ע50026682 צְס1סת 1 ,1022 ,"206 ס6םה0")ע6שאתאת 107656קתס פונקציית בנייה, מה היא ? פונקציית בנייה (חסטסחט1 ח600ט50ח60) היא פונקציה מיוחדת שמופעלת בצורה אוטומטית בכל פעם שנוצר עצם מטיפוס המחלקה. לרוב משתמשים בפונקציית הבנייה לאתחול משתני העצסם. שס פונקציית הבנייה והה לשס המחלקה לה היא שייכת. למשל, במחלקה ששמה ₪16, שס פונקציית הבנייה יהיה גם כן 86. אופן הגדרת הבנאי דומה לאופן הגדרת פונקציית מחלקה רגילה, למעט העובדה שבפונקציית הבנייה לא מצייניס את טיפוס הערך המוחזר. בעת יצירת עצס במחלקה ניתן להעביר פרמטרים לפונקציית הבנייה באמצעות משפט יצירת העצם, לפי התבנית הבאה: (63ו81ט ,081062 ,60%)7810061[סס פתהת 01888 ערכי מחדל של פרמטרים בפונקציית בנייה בשפת ++6 ניתן לקבוע ערכי ברירת מחדל לפרמטריס בפונקציה. ערכיס אלה יופעלו כאשר במשפט הקריאה לפונקציה לא יועברו ערכים לפרמטריס מסוימים. תכונה זו הוצגה בפרקיס קודמיס בספר, והיא ניתנת ליישום גס בפונקציות בנייה. לדוגמה, בפונקציית הבנייה 66ץסווח6 המוצגת בהמשך, נקבע לפרמטר +ז58!8 ערך ברירת מחדל. אם לא יועבר ערך לפרמטר זה, הפרמטר יקבל מפונקציית הבנייה את הערך 0, לעומת זאת, את שם העובד ומספר זיהוי חייביס להעביר לפונקציה. ,1 66צ10סת0 סַת0ס1 ,סתַםת* מַַת0) 10766קתס: : 66ץס 1סת (10000.00 = צץע5818 11086 ; (סתהת ,סתהּת: : 7606ץ10קת6) ץ56200 600107686 = 10 1066ק600: :66צ10סת (50000.0 > צץע58818) +11 ;ץע5818 = צץ10766::5818%2סחס 1-6 46 58182 81168טםמ1 // 72 = 7ע10766::858182קת0 פרק 23: פונקציות בנייה ופונקציות פירוק 229 העמסה של פונקציות בנייה בשפת ++6 ניתן לבצע העמסה של פונקציות על ידי הגדרת פונקציות בעלות שס זהה ורשימת פרמטרים שונה. תכונה זו ניתנת ליישום גס בפונקציות בנייה. בתוכנית קש 60505 מתוארת העמסה של פונקציית הבנייה 66ץסוקוח6. בהגדרה הראשונה של הפונקציה מוגדריס בה כפרמטריס שם, מספר זיהוי ושכרו של העובד. פרמטריס אלה חייביס לעבור במשפט היצירה של העצם. בהגדרה השנייה של הפונקציה המשתמש נדרש להזין את שכר העובד, כאשר נתון זה לא מועבר לעצס בעת יצירתו. (10 600010766 סשְַם10 ,פתהם* כַהםס0) 10766קתס: : 66ץ0 1סת / ; (סתהת ,סתהּת: : 766ץ10קת6) ץ56200 01076086 = 10 66צ10ק600: :66צ10סת 60 1 >> סתת >> " 205 צץע585818 8 עססםע" >> סגוסס ;" :550,000 מה8םתם 16558 " ;ץע5818::ססץס1קת6 << םת1ס ; (50000.0 =< ץ2ע5818) 116םתח [] בתוך הגדרת המחלקה מוגדריס גס שני הבנאיס על ידי תבניות הפונקציה שלהס. ] 766ץ10קתס 0185855 :טס תבניות של ;(11080 ,6םת10 ,* עַַַם0) 766ץ10סתס פונקציות מועמסות ,9 סבה 6 צסוקהס ; (010ט) 107606קתס חסם58 ב1סע ; (7)51086%ץ58182 06ם8ם6 6ת1 ; (10סט)18 866 סַם0ס1 : טנס ;[64]סתאם עַַ8ם0 2 60010706 סַם0ס1 ;ץ5818%ם 11086 להלן יישוסם מלא של התוכנית 9ק58.6ע50א60: <ם.0ת105%208> 61066ת1+ <םת.6ם5621> 010₪6ם1+ ] 766ץ10קת6 01855 :טס ; (51080 ,6ת10 ,* תהתס0) 786ץ10סחמס ; (סתס1 ,* פִַַת0) 786ץ10סחס ; (010ט) 6107606 שטסם8 16סע ; (5108%) ץ58182 06ם8ם0 6ת1 ; (18)0010 866 סַם0ס1 0 ++6 בקלות : ס6אטנמס ; [64 ] סתהם שַהַתס 2 60107606 סַם0ס1 ;581827 1086" ,1 66צ10סת0 סַת0ס1 ,סתַםת* מַַתם0) 10766קתס: : 66ץס 1סת (צע5818 11086 ; (סתהת ,סתהּת: : 766ץ10סת0) ץ56200 601068 = 10 66צ66::60010צ10סת (50000.0 > צץע8818) +1 ;ץע5818 = צ10766::58182סחס 1-6 846 858185 8116טםמ1 // 72 = ע858182: :010766 ו (10 6010766 סשְַם10 ,פתהםת* כַהַתס0) 10766קתס: : 66ץס 1סת / ; (סתהת ,סתהּת: : 766ץ10קת6) ץ56200 60010768 = 10 66צ10ק600: :66צ10סת 60 1 >> סתת >> " 2058 צץע585818 8 עססםת" >> סגוסס ;" :550,000 מהםתם 1655 , "ו ;ץע5818::ססץס1קת6 << םת1ס ; (50000.0 =< צץע5818) 116םתח [] ] (10סט) 10766קת6 שסם5: :60010766 ב1סע ָ ;1 >> סשתהת >> " :10766קתם" >> סטסס 12 >> 16 60010706 >> " :10" >> סטסס 7 >> 88182 >> " :581827" >> סגוסס ו (ס1סט)ת1נאת ה1סט \ ;(10101.0 ,101 ,"הפתבהט צְמסהם")62אעסט צְס1סת ; (102 ,"206 שתה08")עס6שס8תאת 66צ10קתס ; () 6010766 אסם5.ע62א02%ח ; () 6010766 טחסם5. עַססתאת ) הרצת התוכנית תתחיל בבקשה להזנת שכרה של העובדת 206 6ח28. לאחר הזנת הערך הדרוש, התוכנית תמשיך ותציג על המסך את נתוני שני העובדיס. פרק 23: פונקציות בנייה ופונקציות פירוק ‏ 231 יצירת פונקציית פירוק פונקציית פירוק (ח00וש6חט) ז6+0ש265%7) מופעלת מייד לאחר שעצם בתוכנית מסיים את תפקידו - נהרס (06500/60כ). עצם מסיים את תפקידו בסוף התוכנית, או בסוף טווח הכרתו, על פי חוקי הגדרת משתנה. בפרקים הבאים נציג כיצד ליצור רשימת עצמים המופעלים בעת שהתוכנית רצה. לצורך משימה זו יש להקצות שטח בזיכרון המחשב לאחזקת העצמיס (טרס הסברנו איך מבצעיס הקצאה של זיכרון). במשך ביצוע התוכנית יוצריס ומפרקיס עצמים, ולכן משימה זו משתלבת כראוי עס השימוש בפונקציות פירוק. בתוכניות שהוצגו עד כאן, התוכנית יצרה את העצמים מייד לאחר שהופעלה, בכך היא הצהירה עליהם. בסיוס התוכנית העצמיס נהרסים. כאשר מגדירים פונקציית פירוק, היא מופעלת אוטומטית על ידי ++6 עבור כל עצס בשעה שהתוכנית מסיימת את פעולתה (כאשר העצמיס נהרסים). בדומה לפונקציית בנייה, שס פונקציית הפירוק זהה לשס המחלקה שהיא שייכת אליה. לפני שס המפרק יש להציב את הסימן *-, לפי התבנית הבאה: ע2060ו2ע065% 6108668ת1 = (10סט) פת8ם 01888 ָ 58 מסנ1ססתטס // פונקציית פירוק אינה מקבלת פרמטרים כלל. בתוכנית 699 דס6ט8ד5פפ משולבת הגדרת פונקציית הפירוק הבאה. פונקציה זו שייכת למחלקה 66ץס|קוח6. (010ט) 760ץ10ס- : : 10766קתס בנ1סע \ 17 %>> סתהם >> " ע50 007606 6ם₪ 6םת1צץ0סע656כק" >> סגגוסס במקרה וּה, הפונקציה מציגה על המסך הודעה על פירוק העצם. בסיוס התוכנית, שפת ++6 קוראת בצורה אוטומטית לפונקציית הפירוק עבור כל עצסם. להלן יישוס מלא של התוכנית 9פ6.דס6מטדפפם. <ת.ת108%268> 61066ת1+ <ת.6ם5621> 010₪6ם1+ ] 766ץ10קתס 018585 :טס ; (51080 ,6ת10 ,* פהַת0) 786ץ10סחס ; (1סץט) 107686ת= ; (010ט) 6107606 שסם8 16סע ; (5108%)ץ58182 06ם8ם06 6ת1 ; (18)0010 866 סַם0ס1 2 ++6 בקלות : ס6אטנמס ; [64 ] סתהם שַהַתס 2 60107606 סַם0ס1 ;581827 1086" ,1 66צ10קת0 סַתס1 ,סתַםת* מַַת0) 10766קתס: : 66ץס 1סת (צע5818 11086 ; (סתהת ,סתהּת: : 7606ץ10סת6) ץ56200 60010768 = 10 66צ10ק600: :66צ10סת (50000.0 > צץע8818) +1 ;ץע5818 = צ10766::58182סחס 1-6 48 858182 81168טםמ1 // 72 = 7ע10766::858182קת0 (010ט) 10760 קתס- : : 10766 ספת 27 6%>> סתהם >> " ע50 007606 6ם₪ 6םת1צץ65620כק" >> סגוסס (10סט) 10766קת6 שסם8: :60010766 ב1סע ;1 >> סשתהת >> " :10766קתם" >> סטסס 12 >> 16 60010706 >> " :10" >> סטסס 17 >> צ88182 >> " :581827" >> סגוסס (ס1סט)ת1נאת ה1סט | ;(10101.0 ,101 ,"הפתבהט צְססהם")62אעסט צס1סת ; () 6010766 אסם5.ע62א02%סח / לאחר הידור והרצת התוכנית נראה על המסך את השורות הבאות: <ע66ם₪> 518007מק <\:0 התה צסקאם :10766קתס 1 1 1 :צץ58182 8 צְסקהאת 508 007606 6ם6 86ם1ץ65%20כ פרק 23: פונקציות בנייה ופונקציות פירוק 233 יש לשיס לב שהתוכנית מפעילה את פונקציית הפירוק לאחר סיוס התוכנית, מבלי לקרוא לפונקציה. לעת עתה אין משמעות רבה לפונקציות פירוק. בפרקיס הבאיס נלמד כיצד להקצות זיכרון במחשב לשס ביצוע משימות בעצם, ונגלה את היכולת ואת נוחות השימוש בפונקציות פירוק לשחרור זיכרון המחשב כאשר הורסים, או מפרקים את העצם. פונקציית פירוק מה היא? פונקציית פירוק (חסטסחט? זס6%ט:2650) היא פונקציה מיוחדת שמופעלת אוטומטית בכל פעס שמפרקיס את העצם. שס פונקציית הפירוק והה לשס המחלקה לה היא שייכת. לפני שס פונקציית הפירוק יש להציב את הסימן *-;'י, לדוגמה : 66/ס!|פוח6>י. אופן הגדרת פונקציית הפירוק דומה לאופן הגדרת פונקציית מחלקה רגילה. סיכום בנאיס ומפרקיס הס פונקציות מיוחדות שמתבצעות בצורה אוטומטית בעת יצירת העצם, או כאשר מפרקיס את העצם. רוב התוכניות נעזרות בפונקציות בנייה לאתחול משתני העצם. לרוב התוכניות הפשוטות, וביניהן אלו שהצגנו בפרק הנוכתי, אינן וקוקות לפונקציות פירוק. לפני שנעבור לפרק הבא, נבחן אס מובניס לנו הנושאיס הבאים: * פונקציית הבנייה היא פונקציה מיוחדת הנקראת באופן אוטומטי כל פעם שנוצר עצס. היא מקבלת את שס המחלקה אליה היא מתייחסת. * פונקציות בנייה אינן מחזירות ערך, ולמרות ואת אין להגדיר אותן מטיפוס 0וסט. פונקציות אלו מוגדרת ללא ציון טיפוס ערך מוחזר. > בעת יצירת עצם, התוכנית יכולה להעביר פרמטרים לפונקציית הבנייה. * שפת ++6 מאפשרת להעמיס פונקציות בנייה ולקבוע ערך ברירת מחדל עבור הפרמטרים שלה. פונקציית הפירוק היא פונקציה מיוחדת הנקראת באופן אוטומטי כל פעס שעצס מתפרק (או נהרס). פונקציות הפירוק מקבלות את אותו השס של המחלקה אליהן הן מתייחסות. לפני השס הפונקציה יש להציב את הסימן =י. העמסת אופרטורים מאפשרת לדוגמה, להגדיר מחדש את פעולת הסימן (+), כדי שנוכל באמצעותו לחבר מחרוזת מסוימת למחרוזת נתונה. בתחילת הספר למדנו שטיפוס נתון (כגון +חו, +08, ז8ח6 וכוי) מגדיר את תחוס הערכיס שהמשתנה המוגדר יכול לאחסן בתוכו. בנוסף, הטיפוס הנתון קובע את הפעולות שניתן לבצע עס אותס המשתנים. הגדרת המחלקה במהותה היא הגדרת טיפוס כיוןו ששפת ++6 מאפשרת לקבוע מחדש את פעולת האופרטוריס עבור נתוני המחלקה. 4 ++6 בקלות תרגילים 1 כיתבו תוכנית המיישמת שימוש במפתח סודי, המופעל בעזרת מחלקה עָ6א. ממשק המחלקה הוא : ]1 ץ86 01885 :טס ; (1סט) ץ26 ; (0םס1) ץ6א ; (010ע) 86% ה1נסע ; (010ט) 510868 062%1 ב1ס ;ו > (6/)/0!0א - אתחול ערך המפתח לערך המציין שלמפתח עוד לא נקבע ערך אמיתי. + (סַחס!)/6א - אתחול ערך המפתח בהתאס לארגומנט. > 500 - קביעת ערך חדש למפתח, אחרי שמתבצע אימות, בו מתברר שהמשתמש אכן יודע מה ערכו הנוכחי של המפתח, או לחילופין, המפתת עדיין לא אותחל. > 607086806 - ייצור תעודה המכריזה כי מחזיק תעודה זו הוא בעליו החוקייס של מפתח בעל ערך %אאא (הערך אאאא נקבע על פי ערכו הנוכחי של המפתח), אחרי שמתבצע אימות, בו מתברר שהמשתמש אכן יודע מה ערכו הנוכחי של המפתח. כיתבו מחלקה +חוסק המייצגת נקודה במישור. הבנאי (0פ5006ח60) מאתחל את הנקודה (ברירת המחדל היא - 0,0) ומודיע על היווצרותה. המפרק (065070000) מודיע על השמדתה של הנקודה. פונקציית המחלקה >חוזק מדפיסה את ערך הנקודה. השתמשו בפונקציה הוח הבאה, כדי לבחון את תפקוד המחלקה שכתבתסם: (ס1סט) ת1נאת ב1סט | 12 ,(3)0,4.4ס ,(2)5.2ס ,(1)5.5,7.3ס %םנסק >מנעס.1ס ; ()6ם1עס.2ס %תגנעס.כדס %תגנעס.גס 0( 0( 0( 0 ;ק[081ם6 >> 00806 פרק 23: פונקציות בנייה ופונקציות פירוק | 235 206 כיתבו מחלקה ₪66 המנהלת עצ בינארי של ערכים שלמים טח). התכונה המאפיינת את העצ: אס מסתכלים על צומת נתון, אזּי כל הצמתיס בתת-העצ השמאלי שלו הס בעלי ערכיס קטניס משלו; וכל הצמתים בתת-העצ הימני שלו, הס בעלי ערכיס גדוליס משלו. המחלקה תתמוך בפעולות אלו: הכנסת ערך לעף, חיפוש ערך בעצ (האם נמצא - כן/לא), מציאת המקסימוס בעצ (העלה חימני ביותר), מציאת המינימוס בע (העלה השמאלי ביותר), בירור מספר הצמתים בעצ, בירור גובה העצ, וגם - בנאי ומפרק מתאימים. העדה : תרגיל וה קשה במעט, ולמי שאינו מכיר את נושא העץ הבינארי ורקורסיה מומלץ לעיין בספר 'המדריך השלס לשפת שיי בהוצאת הוד-עמי. כיתבו מחלקה ח081ח6 המנהלת שרשרת של אובייקטיס באורך א הנקבע עס יצירתה. לאובייקט [ בשרשרת יהיה מספר סידורי ( והוא יצביע אל האובייקט 1. האובייקט עס מספר סידורי 0 יצביע ל-ווטא. המחלקה גס תתמוך בפונקציית מחלקה זחוזם, שבה האובייקט [ מדפיס הודעה נתונה (כארגומנט) ומפעיל באופן רקורסיבי את ההדפסה של האובייקט 3-1 (עד לאובייקט 0). כיתבו גם בנאי ומפרק מתאימיס עבור המחלקה חו608. ++6 בקלות העמסת אוברטורים בפרקיס הקודמיס למדנו שטיפוס המשתנה קובע את הערכים שניתן לאחסן בו, ואת הפעולות החוקיות שניתן לבצע בו. לדוגמה, משתנה מטיפוס )ו מאפשר ביצוע פעולות אריתמטיות כגון: חיבור, חיסור, כפל וחילוק. לעומת זאת, אין כל משמעות לדוגמה, לאופרטור החיבור (+) כאשר האופרנדיס הס מחרוזות. הגדרת המחלקה במהותה היא הגדרת טיפוס, מכיון ששפת ++6 מאפשרת תכנון מחודש של פעולת האופרטוריס בהתאם לנתוני המחלקה. העמסת אופרטורים (פַחו0בּס!זסעס זוסז+בּז6ק0) היא הדרך בה משניסם את משמעות האופרטור עבור מחלקה מסוימת. בפרק זה נגדיר מחלקה 54 ונעמיס את האופרטוריס פלוס ומינוס. עבור עצמיס מטיפוס פַחו5%, העמסת האופרטור תגרוס להוספת התוויס של המחרוזת החדשה אל סוף המחרוזת הקיימת. בדרך דומה, האופרטור מינוס יגרוס להורדת התווים שנמצאיס במחרוזת נתונה מתוך המחרוזת הקיימת. בהמשך הפרק נדון בנושאיס הבאיס: > העמסת אופרטוריס גורמת לכך שהתוכנית תהיה קריאה יותר. על כן, לא רצוי להעמיס אופרטור, אס הדבר יגרוס לכך שהתוכנית תהיה פחות ברורה ומובנת. > המילה השמורה 0261960 משמשת להעמסת אופרטוריס. > כאשר מעמיסים אופרטור, יש לציין פונקציה שאליה תפנה ++6 בכל פעס שתשתמש באופרטור המועמס. > כאשר מעמיסים אופרטור עבור מחלקה מסוימת, הוא יפעל כאופרטור מועמס עבור מחלקה זו בלבד. שאר חלקי התוכנית ימשיכו להשתמש באופרטור על פי ההגדרה המקורית שלו. > ניתן להעמיס כל אופרטור, מלבד ארבעה, המפורטיס בטבלה 24.1. העמסת אופרטוריס מפשטת את הגדרת הפעולות הנפוצות במחלקה ומקלה על הבנת התוכנית. לכן, מומל\ להשקיע ומן בלימוד מפורט של התוכניות המוצגות בפרק זה. פרק 24: העמסת אופרטורים 237 העמסת האופרטורים פלוס ומינוס העמסת אופרטור והתאמתו לנתוני המחלקה אינו משפיע על פעולתס של שאר טיפוסי הנתוניסם המוגדריס בשפת ++6. למשל, אס נעמיס את האופרטור פלוס עבור נתוני המחלקה 8ח5%1 ניתן להמשיך ולהשתמש בו כרגיל לחיבור של שני מספרים. מהדר שפת ++6 קובע איוו פעולה להפעיל לפי טיפוס הנתון. בהמשך נגדיר את המחלקה 9חוז5. מחלקה זו כוללת משתנה אחד מטיפוס מחרוזת וסדרה של פונקציות, שבשלב זה אין הגדרה של אופרטורים כלשהם. התוכנית 2ק861455.0ז5 מתבססת על המחלקה פַחו5₪ לצורך יצירת שני עצמים מטיפוס מחלקה זו. <ת.ת108%268> 61066ת1+ <ת.6ם5621> 010₪6ם1+ ] 08ם1ע8% 01858 :טס ע0%0ט0ע8%ת00 //‏ ;(* ע8ם6)0םת1ע5% ; (* 82ת0)0ת6סק8 8565 6נסע ; (82ת0) פותנת מתס 16סע ; (0)07010ם5%6521 טסם8 16סע : טנס ; [256] 08%8 פַהַת0 ;ו (ע5%2* 8%ת6)0ם1ע06::562םת1ע562 ן ;(8%2 ,68%68) 562007 (8%2* 2ע6)028ם6ס0ק8 06::85%62ם5621 בנ1סע | 562086)08%8, 562(; (ע16%%662 8%8ם0)פמת1ת עם6::0םת8621 בנסט ו ; [256] תס עַַ8ם0 3 תד (++1 ;[08%8]1 ;0 = ך ,0 = 1) ע0ס1 ?טסתסע 0 ע16686 6ם₪ 18 // (ע16%6%662 =! [64868]1) 15 0ת68 סם 16 מם88916 ססם +1 // ;[9858]1 = [++ךר] 50 6600 05 םמש //‏ ;2תטסא = [4] קמ66 8 ++6 בקלות 8 סם 080% 8695ת56ת00 5'ת6ם צְ000 // ; (קת66 ,0808) 562007 (10סט)0ם8%21 חאסם6::58ם1ע86 6נסט ן 2 (6>>%6 08608 >> 0006 (ה1נסט)םנ1הת ב1סט ו ; ("++6 צץ8 61%16)"26580060 שַם1ע56 ; ("8ת006210801 006286058 0ם01ת62868תטס")ם16850 סַם5621 ; ()6ם5%621 שטסם61616.8 ; ("!סת 26800060 ")סתססקה 61616.865 ; ()06ם5%621 טסם61616.8 )ףם5521 שסם8.םת1658580 ת')פטתנת 5ם0.ם16580 )ףם5621 שסם8.םת16580 ; ( ;(' לש לצורך העמסת אופרטור משתמשים במילה השמורה :860ז6קס כדי לציין את האופרטור והשיטות (פונקציות) הקשורות אליו. בהגדרת המחלקה הבאה נשתמש במילה השמורה ז67800קס לשיוך האופרטוריס פלוס ומינוס לפונקציות 8006005 50 ו- זו\6 בהתאמה. ] 06ם1ע8% 018588 :טס %ע00%0ע8%ת00 //‏ ;(* ע8ם6)6ם1ע5% הגדרת אופרטורים של ; (* ע8ת0)+ ע860%ע62ק0ס 18בסט המחלקה 09 ; (82ם0)- 06286058 16סע ; (0)07010ם5%6521 טסם8 16סט : טנס ; [256] 68%8 08% ?ןז בדרך וו, העמסת האופרטורים פלוס ומינוס נעשית בתוך המחלקה. בהמשך, חייבים להגדיר את הפונקציות המיישמות את הפעולות החדשות של האופרטורים. להלן הגדרת הפונקציה של אופרטור פלוס: (ע5%2* ע8ת0)+ ע0::02628%0%םת1ע56 הנ1בסט ָ 562086)08%8, 862(; פרק 24: העמסת אופרטורים 239 בתוכנית 9ק6.פ וחפטספס מתואר השימוש בפונקציות המגדירות מחדש את פעולת האופרטוריס פלוס ומינולי: <ת.ת108%208> 6100₪6ם1 <ת.086ם5%21> 01066ם1 ] 08ם1ע8% 018558 :טס %צ0%0ט0ע8%ת00 //‏ ;(* ע8ם6)0םת1ע5% ; (* ע8ת0)+ ע860%ע62ק0ס 18בסט ; (ע8ת0)- ע62860%ק0ס 18סטע ; (06)7010ם5%651 טסם8 16סט : ס6הטנמס ; [256] 68%8 028% 2 (ע58%* 82ת6)0מם6::585621םת5621 562007 )0868, 5862(; (ע8%2* ע8ת0)+ ע0::02628%0%םת1ע56 הנ1בסט 562086)08%8, 5%62( ; (16%%62 ע28ת0)- ע06::02628%0%םת1ע56 ה1בסט ; [256] 600 ע8ם0 ל = שת (++1 ;[08%8]1 ;0 = ך ,0 = 1) ע0ס+ (166%62 =! [64868]1) +1 ;[0858]1 = [++ר] 66 ;2 = [7] סת66 ; (קת66 ,0808) 562007 ] (10סט)0ם8%21 חסם6::58ם1ע586 בנסט ן 12 )>>> 08608 >> 0006 0 ++6 בקלות (ס1סט)תנאת 18סט \ ; ("++0 צע ₪1616)"26800606 6םת1ע56 ; ("0ם6210801ט0 ע02628%0% 8מם061ת625%8התטש")ם16550 06ם1ע56 ; ()6ם5%621 טסם61616.8 ;"!סת 26800606 " + 61616 ; ()6ם5%621 טסם61616.8 ; ()0ם5%21 שסם8.ם16580 ;'םת' - ם16580 ; ()8ם5%21 שסם8.ם16580 נחזור ונראה את המשפטיס בתוכנית שבהס מופעליס האופרטוריס המועמסים: "!סת 26500606" 6א₪6 6ם6 6מס6ססת // ;"וספת 26850060 " + 61616 'ת' 16%66% 6תם פטסתפת // ;'ת' - מ16550 על אף שתחביר המשפטים חוקי ותקין, הוא נראה קצת משונה. בדרך כלל רגיליס להפעיל את האופרטור בביטוי אשר מחזיר ערך כלשהו, כמו במשפט זה, לדוגמה: ;"%א6ס" + 61616 = 562 5006 שפת ++6 מעניקה חופש פעולה רחב מספיק, המאפשר למתכנת לקבוע כיצד האופרטור יתנהג בתוכנית. במקרה זה, תחביר האופרטור פלוס (+) שונה ואף מוזר, למרות שהוא חוקי מבחינת כללי הכתיבה של ++6. בדרך כלל נוהגיס להשתמש באופרטור פלוס בביטוי אשר מחזיר ערך, כמו לדוגמה במשפט: ;"0א6)" + ₪06 = 57 50₪06. כאשר מתכנתיס ב- ++6, ניתן להגדיר ולקבוע את התנהגות האופרטוריס במידה גדולה של חופשיות. עס ואת, הבה נזכור שמטרת העמסת אופרטוריס היא הפיכת התוכנית לברורה וקלה יותר להבנה. בהתאס לכך, התוכנית 2ק6.אפט0 אד5 המוצגת להלן שונה במקצת מהתוכנית הקודמת. היא מאפשרת פעולות על משתני מחרוזת מטיפוס 50108 באמצעות התחביר האופייני לפעולות אופרטור ההשמה (ראה להלן). <ת.ת108%2608> 866ט610םת1+ <ת.06ם5621> 010₪6ם1+ ] 8ם1ע8% 01855 :טס ע00%0ע8%ם00 //‏ ;(* מ8ם6) שַם1ע5% ;(* 82ם0)+ ע00%ס628קס * ע8ם0ס ; (58₪ם0)- ע60ס8ע62קס * 82ם0 ; (07010) 6ם5%621 שסם8 16סט פרק 24: העמסת אופרטורים ‏ 241 222 :עס 08%8]256[;‏ 08% ן (ע5%* 82ת6)0מם6::585621םת56%21 562007 )68%68, 8%62(; (ע5%* 2ע8ת0)+ 0::00628%0%2םת1ע8%62 * ;((ע 86‏ ,56%2086)08%68) םעו266 (16%%62 ע8םת0)- 06::02628%0%2םת1ע8%62 * ; [256]קת66 ע8ם0 16 (++1 ;[8868]1 ;0 (ע16%%62 =! [1] 88%8) 15 2[] 6868 [++4] 69 ג[ ,0 = 1) ע0ס1+ = [7] 0ת66 ; ( (קת 66‏ ,08%8) 7ץ56200) םעט266 (0)0010ם5621 אסם5::סָת5621 12 >>> 08608 >> סגוסס שהתס ב סט (16סט) מ1את ב1סע ; ("++6 צֶ5 61616)"26580060 סְם1ע56 ; ("6ת6210801ט0 00628602 0ת01ם628568בתס")ם165950 06מם5621 ; ()0ם5%21 טסם61616.58 ; "!ספת 26800606 " ] 1 = 1 ; ()0ם8%21 שסם61616.58 , .ו , ) מ ) ++6 בקלות )סם1ע562 שסם8.םת16585580 ' - ת16880 = ם165880 ; ()טם8%621 אסם8.ם1658550 ָ על ידי שינוי האופרטורים פלוס ומינוס (+, -) המועמסים, כדי שיחזירו מצביעים למחרוזות תווים, התוכנית יכולה להשתמש בהם על פי התחביר של משפט השמה: ;"!סת 2680860 " + 1616 = 61616 ;'ת' - ם18890 = ת1659980 דוגמה נוספת השוואה בין ערכים מטיפוס המחלקה היא פעולה מקובלת כאשר נעזרים במחלקה ככלי ליצירת טיפוסי נתון חדשיס. לצורך זה ניתן להעמיס את האופרטור שווה (==), אינו שווה (=6, או כל אופרטור השוואה (יחס) אחר. בתוכנית 2ק6.אז5 605 מתוספת הגדרה של אופרטור במחלקה פַח5₪. האופרטור מאפשר לבדוק אס שני עצמים מטיפוס פַח5₪1 הינס שוויס. על ידי העמסת האופרטור ניתן לבדוק אס שני העצמיס מכילים את אותה מחרוזת : (סם5%21 6%ת0%םת8 == סם1ע8% 6ת850) 15 בעמודים הבאיס כתובה דוגמה ליישוס מלא של התוכנית 9ק6.א8ד5 >ואסס: <ת.ת108%268> 066ו61ת1+ <ת.06ם5621> 01086ם1+ ] 6ם1ע86 01888 :פטס %ע0%0ט0ע8%ת060 //‏ ;(* ע8ם6)0ם1ע5% ; (* ע8ת0)+ ע860%ע62ק0ס 1בסט ; (ע8ת0)- 0628608 18סטע ; (0ם8%21)== 860%8ע62ק0ס %6ם1 ; (0)07010ם5%6521 טסם8 16סט : 66הטנ1עס ; [256] 08%8 כַהַת0 ;ן (ע8%* 6)0282מם06::585621םת56%21 ו ; (862 ,08%68) 562007 ] (ע5%* 82םת0)+ ע62860%ק8::0ם8%21 * עַַַם0 ו ; ((ע5% ,562086)585%208%)08%8 (ע16%6%6 ע8%ת0)- ע62860%ק08::0ם8%21 * עַַַם0 | ; [256] 669 ע8ם0 ל 125 סת פרק 24: העמסת אופרטורים 243 (++1 ;[08%8]1 ;0 = ך ,0 = 1) ש0ס+ (ע16%%662 =! [64868]1) 15 ;[0858]1 = [++ר] 66 2 = [37] 6030 ; ( (קת6ס ,08%68) ץ56200) צץ56200 ] (ע8% 06ם1ע8%)== ע8::02628%0ם1ע582 6ם1 | 2 סת1 (++1 ;[8%2.08%68]1 == [08%68]1 ;0 = 1) ע0ס1 ((עתסא == [562.08%68[]1) 86 (עתטסא == [680₪8]1)) 15 1 // 0 ;(1)םמעטס260 1 ססא // ; (0) םמגו26%6 (10סט)0םת8%21 חסם6::8ם1ע5862 בנסט 0006 >> 08608 6>>%6 2 (16סט) מ1את 1סע ; ("++0 צ8 51616)"2680060 סַם5621 ; ("8ת6210801ט0 00628602 6ת601ם62568בתס")ם1689890 0מם5621 ; ("++0 צַ2 6500606ת")562 סַם5621 -2ן (ת0ס1688 == 51616) 5 ;601 >> "60081 826 ם1689890 בתה8 61616" >> סטסס (ת16880 == ע86) 15 ;1 >> "60081 826 ם16550 0ם8 562" >> סגוסס (852 == ₪18616) 15 ;601 >> "60081 826 562 בת8 61616" >> ס6טסס דרך העמסת אופרטוריס המתוארת בתוכנית הקודמת מקלה על הבנת התוכנית ומפשטת אותה. 4 ++6 בקלות אופרטורים שאינם ניתנים להעמסה בתוכנית בשפת ++6 ניתן להעמיס את רוב האופרטוריס. עס זּאת, בטבלה 24.1 מוצגת רשימת אופרטורים שאינס ניתניס להעמסה. טבלה 24.1: אופרטורים שאינם ניתנים להעמסה בתוכנית ++6. אופרטור דוגמה . אלמנט (6טוח6!י) במחלקה וס *. מצביע לאלמנט במחלקה ו ות* .160 ס 11 טווח ההכרה הכללי זו :ה 6550 143 משפט (ביטוי) תנאי מקוצר ;2 ( < 8) = 6 העמסת אופרטורים אונאריים בהעמסת אופרטוריס אונאריים, פונקציית האופרטור השייכת למחלקה לא צריכה לקבל שוס ארגומנט כפרמטר מכיון שהיא תפעל רק על הנתוניס של האובייקט שהפעיל אותה. בדוגמה להלן יש לשיס לב להבדל בין +הסוח6זסחו 6זכ ל- +הסוח6זסחו 005%. דוגמה : קכ6.זבּחטיוקס העדה : התוכנית נבדקה והורצת ב- 6.0 ++6 /508/. <ת.ת108%2608> 61086ת1+ 0188588 868 ָ : סספטנמס ;5ו2801 6םת1 :טטטוס [;2 = 280108+ (ע %6ם012016)1 [;0 = 80108ע2)+ ()012016 ; () ++600628%602 012016 ; (%ם1)++628%02ק0 012016 [ ;₪061 >> 280108 >> " = 280105" >> סטסס + ()טחסםפ5 ב1סט ;ו \תפתסעסת1 6עס // ()++ע628002ק8012016::0 012016 \ ;++85ו28061 ;18םת6* תעג26%0 פרק 24: העמסת אופרטורים 245 %תפסתסעסת1 08% //‏ (%6םת1)++ע0112016::00678%02 012016 % ום8 פע ת8סח8ס6ס %ם6ת011+02 6םם 10% פפטך 15 (6ם1) 6םם // + 7 + = תס 012016 ;++280108 ם80%10 5פסק 6ם₪ 61056 // ;קת םע6%0%ע2 (16סט) מ1את ה1סע 7 ,(01)3 012016 ד 1 6 ; () שטסם5. 01 := 7062 >> וסט ;++01 = 02 ; () שסם8. 62 6 = 7062 >> שטסס 12 = 02 ; () שסם8. 62 העמסת אופרטורים באמצעות פונקציות מטיפוס וחסו] פונקציה מסוג 611600 הינה פונקציה בעלת היתר גישה לכל משתני המחלקה. מומלצ לתת עדיפות לפונקציות המחלקה כדי לקייס את עקרון הריכוזיות, אולס קייס מקרה אחד אחרון בו נתקשה לטפל במסגרת פונקציות המחלקה והוא: ; 00760%ס + 7 מצד שמאל של האופרטור נמצא משתנה מטיפוס מערכת - זחו. לא ניתן להגדיר פונקציית מחלקה שתגדיר מקרה וה באופן הבא: 0% + מ860ע6ק7.0 הפתרון לבעיה הוא פונקציית חבר שתכיר את משתני המלבן: % 0188588 ז ;(80 00760% 0086 ,עססתטם 6ם1)+ע628602קס 6 007606 ₪מם1216+ ;ו נניח שעבור המקרה ההפוך (7 + 6%(פ0) העמסנו פונקציית מחלקה. אזי נממש את פונקציית החבר באופן הבא: (0ס68 00[60% 008% ,עססתטם 6ם1)+ע2ס6286קס 6 007606 6₪ם16ע12 ָ 6 ++6 בקלות כאן נפעיל את פונקציית המחלקה המממשת את - 7 + 00760% // ; עפסתטם + 0 םעג2660 דוגמה : קק6.6ח'ו1וקס הערה : התוכנית נבדקה והורצת ב- 6.0 ++6 /508/. <ת.ת108%20608> 61086ת1+ % 01885885 \ : טנס ;עססמתגום 6ם1 :טס 505)()[2רסס [;ם עססמתסם) (ם %ם60%)1רסס 5 + 02 = 01 // ; (ם %ת1)+628%02ק0 1606סס // 01 = 02 + 3‏ ;(80 007606)+628802ק0 606רסס 2 + 7 = 01 // ;(80 001608 ,ם 6ם1)+28602ס6קס 00[606ס 6ם1:16 [ ;01ת6 >> פססתגטת >> " = עססמחטת" >> סטסס +()חסםפ בנ1סע ;ו (ת %ם1)+628%02ק0[60%::0 606רכס ָ ;קת> 60%רס ;ם + ע6קתטםת = ש6מתגם. סת6 ; (קתס) תעט26%6 ] (0ס8 00[60%)+00760%::00628802 606רמס \ ;קתף 60%רכס כאן מופעל האופרטור (ם %ם1)+02ס86ע2סקס //‏ ; מססתטם + 0 = סת6 ; (קתס) מעט266 ] (ס8 02780% ,ם 6ם1)+628%0%ק0 6606₪[סמס \ ;קתף 60%רכס כאן מופעל האופרטור (םת %6ם1)+ת860%ת62ק0 // ;םת + 0 = סת6 ; קתס םעגו0ס26 (16סט) מ1את ב1ס7 \ ,02 ,(01)5 007606 2 ; () שסם8. 02 7 75 = 02 ; () שסם8. 02 ; () שסם8. (02 + 01) פרק 24: העמסת אופרטורים 247 הע מסת האופרטור [] העמסת אופרטור ה- [ ] נוחה לשימוש ומוסיפה לקריאות, לכן במקוס להשתמש בפונקציות להשמת ערך/שליפת ערך ממערך המיוצג על ידי מחלקה, נשתמש בהעמסה. תחביר דוגמה הערת: 208 העמסת האופרטור[ ]: (668ם1 6ם1) []678560%ק0::שם המחלקה א טיפוס המערך ו ;גוף ההגדרה : כן5.62+אוט'וקןס התוכנית נבדקה והורצה ב- 6.0 ++6 /508/. <ת.ת108%208> 01066ם1 <ם.58560110> 01066ם1 סץהעתה 0185858 ו ?ק%1 110386 7 סמסם1 :טס ; (%8ת06ת616 05 ע6מחטםת 6ם70)1ץ8228 2 (8א6₪0ם1 6ם8600628602][)1 11086 ; () 0ץצ82528< ;ן (%8ת610606 05 ע6שמתטת 6ת70)1ץ76::8228ץ8228 ָ (022א=! ([%68ם61606 05 מססמתטם][5108% שסם = ס5)) 15 ;%8ת61000 05 מססמתטם = 5126 1-6 5126 = 7 %פתסס (א06ם1 6ם1)[]ע628602ק70::0ץ68228 11086 \ (8126 >א006ת1 8686 0 =< א₪6ם11)1 ; ( [068ם1] ס1) פעגו26% 1-6 זָ ;"ת\06ם8ע2 01 סטס 18 8₪6%ם0006>>"1 ; (1) 6%1%6 ++6 בקלות ()70ץ8228-::2870עה ו ;ק? 661666 ( 10 ) 15 (16סט) מ1את ה1סע | 18)4(;‏ 809870 18]1[ = 2 12 >> [18]1 >> "=[58]1" >> סגטסס 18]3[ = 58]1[ + 7 ;[01ת8 >> [18]3 >> "= 3.215 + [18]1 = [18]3 " >> 6ט0סס סיכום העמסת אופרטור היא שיטה להקנות משמעות חדשה לאופרטור שמשתמשים בו במחלקה מסוימת. העמסת אופרטורים עשויה להקל על הבנת התוכניות, מכיון שאפשר לבטא פעולות הקשורות לעצמי המחלקה בצורה יותר מפורשת וברורה. לפני שנעבור לפרק הבא, נבחן אס מובניס לנו הנושאיס הבאים: * כדי להעמיס אופרטור, צריך להגדיר מחלקה שאליה הוא יהיה קשור. * כאשר מעמיסים אופרטור, ההעמסה פועלת רק בעצמים מטיפוס המחלקה שבה הוגדרה העמסת האופרטור. כאשר האופרטור מופעל על משתנים שאינס שייכים למחלקה, ישוב השימוש שלו למקור. * יש להשתמש במילה שמורה ז800ז6קס להגדרת פונקציית המחלקה אשר האופרטור קשור אליה. * שפת ++6 אינה מאפשרת העמסת אופרטור נקודה (.), מצביע לאלמנט המחלקה (*.), אופרטור טווח ההכרה (::) ואופרטורים של משפט תנאי מקוצר (:1). בפרק 25 נלמד כיצד לשתף מידע בין עצמים על ידי פונקציות סטטיות (58806), וכיצד להשתמש בפונקציות המחלקה (₪16%%005), כאשר לא יוצרים עצמים מטיפוס מחלקה. פרק 24: העמסת אופרטורים 249 תרגילים 200 יש להוסיף למחלקה 5108 המופיעה בגוף הפרק את האופרטור הבא : (ע5% 06ם1ע8%%)>ע628602ק0::0ת1ע562 6םת1 האופרטור יחזיר 1 אם המחרוזת 5% גדולה על פי סדר לקסיקוגרפי, ממחרוזת המחלקה. אחרת - הוא יחזיר 0. כיתבו מחלקה המייצגת שבר פשוט על ידי שני שלמים: מונה ומכנה. כיתבו פונקציית בנאי המקבלת ערכים למונה ולמכנה. כיתבו פונקציות להדפסת השבר, הכפלת שני שברים ואופרטור = של שבריס פשוטים. הפעילו את שגרת חוח הבאה המשתמשת במחלקה: (16סט) מ1את ה1ס7 זָ ;טפס ,(2)1,3+ ,(1)1,2+ מם1280%610+ 2 +*1+=11%ו68ת2 ;()%ם1ע2ק.1%ו65ת2 כיתבו מחלקה המייצגת נקודה על פי הקואורדינטות (ץ,א) של הנקודה במישור. יש לספק למחלקה פונקציות העמסה לאופרטוריס הבאיס: (10סעט) ++ ע628%0%קס::6ת1סק %תנ1נסק (ק %תנסק) = 628%0%2קס::6ת1סק >תנ1נסק (ק %תנסק) + ע0ס628%קס::6ת1סק >תנ1נסק (0=ץ 1108% ,0=א 1108%)%ם01סק::%ם1סק בנסט העדה : הפונקציה ++ מגדילה ב-1 את רכיב א ואת רכיב ץ של הנקודה. כיתבו מחלקה המנהלת מילון בן 50 מיליס לכל היותר. המילון יכלול שלוש שגרות : > פונקציית בנייה. > פונקציית הוספה של מחרוזת למילון, אשר מאפשרת להוסיף את אותה המחרוזת מספר פעמים. + העמסת האופרטור הבא המחזיר 1 אס המילה 5 נמצאת במילון, ואחרת - 0: (8 *82ם60) []ע62860ק0ס 6ם1 ++6 בקלות בונקציות סטטיות ונלעותני המלחלקה עד השלב הנוכחי, כל עצס שיצרנו בתוכנית, קיבל את סדרת המשתניסם הפרטיים שלו. ייתכן מצב שבו נרצה שאלמנטיס מסוימיס במחלקה יהיו משותפים לכל העצמיס מטיפוס המחלקה, על פי דרישות התוכנית והגדרת המשימות לביצוע. לשס כך ניתן להגדיר את האלמנטיס המשותפים לעצמים על ידי המילה השמורה 5%806. בהמשך הפרק נדון בנושאים הבאים : % ++6 מתירה שיתוף של משתנה אחד או יותר, על ידי עצמיס מאותו טיפוס מחלקה. %> כאשר מקציס ערך למשתנה משותף, הוא נגיש לכל העצמיס מאותו טיפוס מחלקה. % כדי ליצור משתנה מחלקה משותף, יש לכתוב את המילה השמורה 58866 לפני שס המשתנה. % לאחר שמגדיריס איבר במחלקה כסטטי, יש להצהיר על משתנה גלובלי (מחוצ להגדרת המחלקה), אשר מתאים למשתנה המשותף. % ניתן להשתמש במילה השמורה 5/9806 כדי לאפשר קריאה של שיטה (פונקציה) במחלקה, עוד לפני שהוגדר עצס כלשהו מטיפוס המחלקה. פרק 25: פונקציות סטטיות ומשתני המחלקה ‏ 251 שיתוף משתני המחלקה בדרך כלל, כל עצס מטיפוס מחלקה מסוימת אשר נוצר בתוכנית, מקבל קבוצה של משתני מחלקה לעצמו. אף על פי כן, ייתכן מצב שנרצה שמשתניס מסוימיס במחלקה יהיו משותפיס לכל העצמיםס מטיפוס המחלקה. במקרים אלה ניתן להגדיר את המשתניס גס בחלק הפרטי וגס בחלק הציבורי של המחלקה כמשתניםס משותפים, על ידי הצבת המילה 5806 לפני שס המשתנה. נעשה זאת כך: :עס 2 820₪ם8 6ם1 568610 לאחר הגדרת המחלקה, חייבים להגדיר את המשתניס המשותפים כמשתנים גלובלייס מחוץ למחלקה, כמו בדוגמה זו: 2 52820%0: נ6ת8ת 01888 6ת1 בתוכנית <ק6.ז1 53585 מוגדרת מחלקה בשס 56065 א00%ם. במחלקה זו מוגדר המשתנה 6000% שאק כמשתנה משותף לכל העצמים מטיפוס המחלקה הזו. כל שינוי בערך המשתנה ישתקף מייד בכל העצמיסם מטיפוס המחלקה הקיימים בתוכנית ברגע נתון. <ת.ת108%268> 61066ת1+ <ת.06ם5621> 010₪6ם1+ ] 802168 000% 01858 :טס ; (51080 ,* ע8םת0 ,* ע8םת562168)0 0%ססס ; (7010) 000% טסם8 16סע ; (8ת1) 08065 866 16סע :טנס ;%מטסס 6ש8ק 6םת1 568610 ;[1%16]64 עַַ8םת0 ;[02]64ם80% ע8םת0 7 11085 ;ן ;6מטסס 8562108::0886 00%מ 6ת1 (8068ק 6ת8008)1ק 562168::86% אססס בנסע ז ;685 = סתגוסס 6א 2 ++6 בקלות (106עק 51086 ,פסםתסט8* ע8ם0 ,61616* ע8ם562168)0 00%סס::562168 א%ססס / ;(%1%16 ,862108::61%616 00%ס) 562007 ; (עסםפט8 ,02ת8621058::80% 00%ס) 56200 2 = 802168::02106 00% (10סט)00%ס טחאסם562168::8 אססס בנסע ָ 12 >> 1616 >> " :71616" >> סגוסס 12 >> עסת806 >> " נעסתפטת" >> 0006 12 >> 106ע >> " :106עק" >> סגוסס 12 >> סתטסס 8066 >> " :ַפססָ8ק" >> סגוסס (ס1סט) מ1את 1סע \ 5008 "++60 צס 6500600") סםנתתהפססעק 8602168 אססס ; (95. 22 ,"הפתהה" ,"תסנפנגבם ; (66",19.95צא" ,"פחסבתגא 505 שמסח צס 24)"2650066סח 562168 0%סס ₪024.806%6 08065 )256( ; ; () 00% אסם5. חֶם נמתת28 טס ; () 0008 חאסם20.5סח ;601 >> " סתטסס 866 28ם61ת8םת0" >> 61ת6 >> סטסס ; (512) 8065 566. שת נמת28שס2ס ; () 00% אסם5. חֶם נתת28 טס ; () 0008 חאסם020.5סח ו ניתן לראות שהמשתנה +חטסס 6פָפּ שמוגדר במחלקה הוא מטיפוס זח! 5%806. מייד אחרי הגדרת המחלקה מוגדר משתנה המחלקה %ח6000 806 כמשתנה גלובלי בתוכנית. ברגע שנעשה שינוי בערך המשתנה 6חטסס 6אַּם, כל העצמים מטיפוס המחלקה 567166 00% הקיימים בתוכנית מתעדכנים גס הס. פרק 25: פונקציות סטטיות ומשתני המחלקה ‏ 253 שיתוף משתנים של המחלקה במצביס מסוימיס דרוש שמשתנים מסוימיס במחלקה יהיו משותפים לכל העצמים מטיפוס המחלקה. לצורך זה יש להגדיר את המשתניס האלה כ-5%806. בהמשך חייביס להגדיר את המשתניס המשותפיס האלה מחוצ למחלקה כמשתנים גלובלייס בתוכנית. כל שינוי בערך המשתנה ישתקף מייד בכל העצמים מטיפוס המחלקה הקיימים בתוכנית. השימוש במשתנים ציבוריים סטטיים טרם יצירתו של עצם המחלקה בפרק וה למדנו שהגדרת משתנה המחלקה על ידי שימוש במילה 50806 גורס לכך שהוא יהיה משותף לכל העצמיס מטיפוס המחלקה. אולס לפעמים, במהלך התוכנית, צריך להשתמש בעצם כלשהו עוד לפני שהוגדר. כדי לאפשר לתוכנית להשתמש במשתנה משותף, הוא צריך להיות מוגדר בחלק הציבורי של המחלקה. למשל, בתוכנית 699.אפוא פפט משתמשיס במשתנה 60% 0806, שהוא משתנה של המחלקה 5 000?6ט, לפני שנוצר עצס מטיפוס המחלקה הזו בתוכנית. <ת.ת108%268> 61066ת1+ <ת.6ם5621> 010₪6ם1+ ] 802168 000% 01858 :טס ;%תטסס 866 6םת1 568610 : 6 הטנ1עס ;[1%16]64 עַ8א8םת0 ;[64]עסם806 ע8ם0 7 11085 ;ו ;6מטסס 8562108::0886 00%מ 6ם1 (10סט) תנאת 18סע ו 2 = סמתטגסס 502168::0866 0%ססס >> " 18 סתטסס 0886 סת6עעטס 6ם17" >> סטסס 12 >> סתגסס 2806ש::802108 %ססמס 4 ++6 בקלות פונקציות מחלקה סטטיות בתוכניות הקודמות שבפרק זה הצגנו את השימוש במילה השמורה 54806 עבור משתני המחלקה. בדרך דומה, שפת ++6 מאפשרת שימוש במילה 5%806 להגדרת פונקציות מחלקה. כאשר מגדיריס פונקציה סטטית משותפת (חהסוז6הט1 וס הסוח 553016), או בשס אחר פונקציית מחלקה סטטית, אפשר לקרוא לה מכל מקוס בתוכנית, גם אס לא נוצרו כל עצמיס שהס. הגדרת פונקציית מחלקה סטטית מאפשרת לה לטפל בנתוניס המוגדריס מחוצ למחלקה. למשל, המחלקה טחפוח המתוארת בהמשך נעזרת בדרייבר 851 למחיקת הנתוניס המוצגיס על המסך. במערכות שבהן מותקן הקוב\ 5 ניתן להשתמש בפונקציית המחלקה 5607660 ז6!68 כדי למחוק את המסך. מכיון שפונקציית המחלקה מוגדרת 55806, ניתן להפעיל אותה ללא יצירת עצמיס מטיפוס טחסוח לפני כן. התוכנית 508.69 628 מפעילה את הפונקציה 507660 6|087 לניקוי המסך. <ת.ת108%2608> 610866םת1+ ] גותסת 01858 :טס ; (010ט) ת80208 01682 16סט 568610 6 6 16גוסח 66009 066% // :טנס 2 גתסת 0% עססתטת 6ת1 ?ןז (0010)ת80266 01082::גמטתסת ב1סע ן ;"20]" >> '033\' >> סטסס (16סט) מ1את ב1סע | ; () ם80266 ע61682::טתסת ו מכיון שפונקציית המחלקה ח50766₪ ]6168 מוגדרת 56806, ניתן להשתמש בה כדי למחוק את המסך אפילו בהיעדר עצס מטיפוס המחלקה טחסח. הפונקציה ח5066 6681 משתמשת בתווי הבקרה [556]2 של דרייבר 451 למחיקת המסך. מידע נוסף על דרייבר 51 מצוי בספר ''המדריך השלם לשפת 6'י שבהוצאת הוד-עמי. פרק 25: פונקציות סטטיות ומשתני המחלקה 255 שימוש בשיטות מחלקה (פונקציות) ישירות בתוכנית כאשר יוצריס שיטות מחלקה (פונקציות), קורה שפונקציה אשר נוצרה לשימושה של מחלקה מסוימת, יכולה לשמש את התוכנית גס בפעולות שאינן כוללות שימוש בעצמי המחלקה. לדוגמה, בתוכנית הקודמת הוגדרה הפונקציה ח66ז50 ז6!68 עבור המחלקה טחסוח, אך ניתן להתשמש בה במקומות נוספים במהלך התוכנית. כאשר מחלקה מכילה שיטה שאנו רוציס להשתמש בה מחוצ לעצס המחלקה שבו היא הוגדרה, יש לכתוב לפני אב הטיפוס של השיטה את המילה השמורה 5806 ולהצהיר על השיטה כציבורית: ופ 9 65 616 66 516 במהלך התוכנית נשתמש באופרטור טווח ההכרה כדי לקרוא לפונקציה: 2 ( | 565 361552 3 תומאות סיכום בפרק זה למדנו שהצבת המילה 5%816 לפני שס של משתנה במחלקה מאפשר גישה אליו מכל מקום בתוכנית. השימוש במילה שמורה 50806 הופך אותו למשותף (531660) לכל העצמים מטיפוס המחלקה הקיימים בתוכנית. לפני שנעבור לפרק הבא, נבדוק אס מובניס הנושאיס הבאים : / משתנה מחלקה שמוגדר 56806, הופך להיות משותף לכל העצמיםס מטיפוס המחלקה הזו. * לאחר שהתוכנית מגדירה משתנה מחלקה כ- 51806, היא חייבת להגדיר משתנה גלובלי מחוצ להגדרת המחלקה, שמתייחסת למשתנה המשותף. * כאשר מגדיריס משתנה מחלקה בתור סוופטק ו-50806, ניתן להשתמש בו גם אס לא הוגדרו עדיין עצמיס מטיפוס המחלקה הצו. כדי לגשת למשתנה כזה, התוכנית צריכה להשתמש באופרטור טווח ההכרה הכללי (:6, כמו למשל: חח ז6סוחסות::סוחגאת 6|]855. * פונקציית המחלקה שנמצאת בחלק הציבורי של המחלקה ומוגדרת 50806 ניתנת לקריאה על ידי התוכנית, עוד לפני שהוגדרו עצמיס מטיפוס המחלקה הזו. כדי לקרוא לפונקציה, התוכנית צריכה להשתמש באופרטור טווח ההכרה הכללי, כמו למשל: ()ח56766 -6!081:: טחסוח. בפרק 26 נציג את המונח הורשה (1806171%8806) ונראה כיצד ניתן להיעזר בהורשה לבניית עצס חדש מתוך עצמיס מטיפוסים אחרים. יישוס ההורשה ליצירת עצמיס חדשיס מאפשר חיסכון עצוס בשלב התכנות של יישומי מחשב. 6 ++6 בקלות תרגילים 1 מהו הפלט של התוכנית הבאה! ענו על שאלה זו לאחר שהפכתס את השורה השגויה (יש אחת כזו בפונקציה חוּח) להערה. <ת.ת108%268> 010₪6ם1 <ם. ק1ת8תס1> 01006ם1 ] 00760% 0185858 :טס [ ;0 קי 2 צ א + (10סט)00760% ;א 6ם1 ;ץ 6ףםת1 568610 ; (18סט)פת1עס פנסט ; (0010) 655800 סטקסטס 16סט 568610 : טנטס ;קש 6ם1 ;2 סת1 568610 ו ;ץ::0רסס %6ם1 7 סת1 (10סט)%ם1עק::00160% 18%בסט \ ;001 9 6 יש 5 7-7 א 9% 9 שיא 5% שנוסס (10סט) 685806 סגוקסטס: :001666 בנ1סע ָ 0 0 ₪886 ₪6 8%28%665מת0ת(ת₪0 תהעטססע2ס 18ם?7" >> סגוסס ;601 >> "פע6קתפת 0868 סם8 5בסת66ת (ס1סט)ת1נאת ה1סט | ; () 6558096 סטקסטוס: :001606 2( = צץ::760%ך00 7 = 007606::2 007606 851, 7 ; ()ףםת1צס.51 5 = א%.51 ; ()ףםת1עס.52 7 = .52 7 = א%.52 ; ()ףםת1עס. 51 007606 2 2 = .51 ; () 56ת1ע.52 ; () 6ת51ק.51 ;()ףם1עק.53 פרק 25: פונקציות סטטיות ומשתני המחלקה ‏ 257 חלק 5 הורעוה והצניות היתרון הגדול ביותר של תכנות מונחה עצמים (0171670%60-00[60% 9חווהוחהזפסזק) הוא יכולת השימוש החוזר בהגדרת המחלקה במספר רב של תוכניות. בחלק וה של הספר נראה ששפת ++6 מאפשרת שימוש חוזר של מחלקות בתוכניות רבות, ובנוסף לבנות מחלקות חדשות המתבססות על מחלקות קיימות. כאשר בוניס מחלקה חדשה לפי מחלקה שקיימת, מתאריס את תהליך הבנייה כהורשת תכונות של המחלקה המקורית למחלקה החדשה. בחלק הוה נראה כיצד ניתן לחסוך זמן רב של תכנות על ידי ניצול העוצמה הגלומה בהורשה. עס סיוס חלק גה של הספר נוכל לומר שלמדנו חלק ניכר של תכנות בשפת ++6 כשפה לתכנות מונחה עצמיס. חלק זה כולל את הפרקים הבאים: ד פרק 26 - הורשה (66ח8זוו6חח1) ד פרק 27 - הורשה מרובה (66ח8זוזסחח1 6|מטוטוש) ד פרק 28 - אלמנטיס פרטיים ואלמנטיס חברים (05ח6וז= .8 5ז6וח16\ 6סבעוזק) ד פרק 29 - תבניות פונקציה (306!קחח6ד חסטסחט=) ד פרק 30 - תבניות מחלקה (806!קוח6 ד 6!855) 209 0 ++6 בקלות הורשוה אחת המטרות של תכנות מונחה עצמים היא לעשות שימוש חוזר (86056) בחלקים, ולמעשה - מחלקות, שהוכנו עבור תוכנית אחת בתוך תוכנית אחרת. כך רוציס, למשל, שמחלקה שהוגדרה בתוכנית אחת תהיה ניתנת לשימוש חוזר במספר רב של תוכניות שונות, כדי לחסוך בומן התכנות. כאשר מגדיריס מחלקה חדשה, לפעמים היא משתמשת בתכונות של מחלקה קיימת ועליהן מתווספיס מספר אלמנטים חדשיס ובתוכס משתנים ופונקציות. במצביס אלה שפת ++6 מאפשרת לבנות עצמיס חדשיס המתבססיס על תכונות של עצמים קיימים. במיליס אחרות, העצס החדש יורש (06870%5ה1) את האלמנטיס של מחלקה קיימת, הנקראת מחלקה בסיסית (6]355 8856). כאשר בוניס מחלקה חדשה מתוך מחלקה קיימת, המחלקה החדשה תיקרא מחלקה נגזרת (6|]355 261/66). בפרק ה נסביר את המושג הורשה (00171+8066ה1) בשפת ++6. בהמשך הפרק נדון בנושאים הבאים : > ניצול מחלקה בסיסית לגזירת מחלקה חדשה - ווהי ההורשה. > קריאה לפונקציות בנייה של המחלקה הבסיסית והמחלקה הנגזרת כדי לאתחל איברי מחלקה. %> גישה לאלמנטיס של המחלקה הבסיסית ושל המחלקה הנגזרת באמצעות אופרטור הנקודה. %> האלמנטים המוגניס במחלקה, אשר ניתניס לגישה מהמחלקה הבסיסית ומהמחלקה הנגזרת. > שימוש באופרטור טווח ההכרה לפתרון ההתנגשויות בין שמות האלמנטים של המחלקה הבסיסית ובין שמות האלמנטיס של המחלקה הנגזרת. הורשה או ירושה, כפי שמקובל לעיתים לומר, הוא מושג יסודי בשיטת התכנות מונחה עצמים. לכן מומלץ לשנן היטב את התהליכים המתואריס בתוכניות המוצגות בפרק זה. בפרק וה נראה שההורשה היא שיטה קלה ליישוס, וגלומה בה עוצמה רבה המאפשרת לחסוך זמן רב בעבודת התכנות. פרק 26: הורשה ‏ 261 הורשה פשוטה ההורשה (0671%8066ח1) מתבטאת ביכולת של מחלקה בסיסית קיימת להעביר תכונות למחלקה הנגזרת ממנה. המחלקה הבסיסית מורישה תכונות, והמחלקה הנגזרת יורשת תכונות. נניח למשל, ש- 66ץ0ו00ח8 היא מחלקה בסיסית וזוהי הגדרתה: ] 766ץ10קתס 01855 :טס ;(1108%9 ,* ע8ת0 ,* מהּתס0) 786ץ10סחס ; (0106ט) 6107606 שסם8 16סע : טנס ;[64]סתאם עַַא8ם0 ;[64]ם051%10 ע8ם0 ;ץ818%פם 11086 ;ו בהמשך נניח, כי התוכנית זקוקה למחלקה 808867 המוסיפה לנתוני המחלקה 6 וח את המשתניס הבאים: ;פטתסס 1אמותת8 11086 ; [082[]64 שְםאסתסס מַַם0 ;פמסנ1סקס 8600% 6ת1 במקרה זה, ניתן לגוור את המחלקה זסְפַהח8ח מתוך המחלקה הבסיסית 66ץס!קוחס. כותרת הגדרת המחלקה החדשה מורכבת מהמילה 6!855, שס המחלקה זִסְסָהּחהחח, אחריו נקודתיים ושס המחלקה הבסיסית 66ץס|מוח6. מחלקה נגזרת ]) 60010766 110סטק : ע866םה8ת 01855 עסם 60ת 6611‏ פמס6מתסא // מחלקה בסיסית ;ן המילה ס6ו|פו שלפני שם המחלקה 6010/66 מציינת שהאלמנטיס הציבורייסם של המחלקה 600/66 הס אלמנטים ציבוריים גס במחלקה זסְהַהחהוח. 2 ++6 בקלות להלן דוגמה של המשפטיס המרכיבים את המחלקה הנגזרת ז806ח8חח : ]) 610766 110סגמק : ע866םהת 01855 :טס ;(%ם1 ,108% ,11086 ,* ע8%ם0 ,* עםת0ס ,* ש8ם0)עססתת ; (סנ1סט) צִסַסָ8ת8ת שטסם8 16סע :טנס ;טתסס 1אמתת8 11086 ; [082[]64 צשְםאסתסס פַַם0 ;פמסנ1סקס 8600% 6ת1 ;ו הערה הגישה לחלק הפרטי של המחלקה הבסיסית מתוך מחלקה הנגזרת ממנה, יכולה להיעשות באמצעות פונקציות ממשק בלבד. לכן, המחלקה הנגזרת 7 איננה יכולה לגשת בצורה ישירה לאלמנטים הפרטיים של המחלקה הבסיסית תוך שימוש באופרטור הנקודה. בתוכנית 99פס.פואם ₪68 מתואר יישוס של שיטת ההורשה בשפת ++6. בתוכנית ישנו תיאור הבנייה של המחלקה 808061 הנגזרת מהמחלקה הבסיסית 66ץסוקוח6. <ת.ת108%2068> 06100₪6ם1 <ת.08ם5%21> 01066ם1 רוס 018858 :פטס ;(51089 ,* ע8ם0 ,* עַַַם0) 766ץ10סתס ; (10סט) 6010766 טסם8 בנ1נסט : ספטנס ; [64 ] סתאם תס ;[64]ם0ס161פסס עַַַםת0 ;ץ8182פם 11086 ;ו (ץ2ת8818 1108% ,תס1ם1פסק* עאתס ,סתהםת* מ8ם0) 10766קתםף: : 66ץס נסת | ; (סתהת ,סתהּת: : 766ץ10קת6) ץ56200 ; (ת0ס1%1פסק ,ם1%10פסס: :766ץ10קת6) ץ56200 ;ץע5818 = צש766::58182ץ10סח0 (10סט) 107606קת6 שסם5: :60010766 בנ1סע ו ;ק[0ת6 >> סתהם >> " :פתהא" >> סגסס פרק 26: הורשה 263 2 > 051610 >> " :ם1610פסק" >> 0006 2 %>> שע8818 >> "5 :581827" >> 0006 ]) 610766 110סטק : שסש8םהת 01855 :טס ;(%ם1 ,108% ,1108%6,* ע8םת0 ,* עַהםת6 ,* עהםס0) ע6ס8תהת ; (10סט) 62ש8תהת חסם5 14סע : סספטנמס ;פמותססם 81גותת8 1108% ; [64] 082 שם8קתסס 085 2 80008 סת1 ;ן ,תס1נ1%פסק* ע8ם0 ,פתהםת* בַהַת0)עסחְבּתבת: :עִסחְַהםהת ,פטתסס 51086 ,ץ58182 11086 ,082 צתאקתסס* פַַַםס (צע85818 ,תס1ס1פסק ,פתת) 10766קת6 : (פםתס1נ6קס 8600% 6ת1 ו ; (082 שְם8קתסס ,082 צתהקתסס: נעִססְַתַת) 56200 ;טס = פטתסס 1א8טתת8: :ע6ט8תאת 2 80008 = 06108 5000%: נעס6סבםאת (010סט) 62ש8ת8ת אסם5::מַססָ8ת8ת ב1סע ז ; () 610766 אסם5 2 6>> 080 צשםהקתסס >> " :082 שתהקתסס" >> סגוסס 2 >> פטתסס 1אטתתה8 >> "5 :פטתסס 1ה8טתתת" >> 0006 2 >> פ8ם10סק0 8000% >> " :8ם0ס1סקס 5600%" >> סטסס (16סט) מ1את ב1סע ן ; (35000.0 ,"עסתתהעסס2ק" ,"ססע מםסנ")ע6אעסט צס1סת ,"פטאסת" ,"%ת65106ע2ק 7106" ,"פס 6םתהט")פפסס עססאתת ;(1000 ,5000 ,50000.0 ; () 6010766 אסם62.5א02%ח ; () 8962ת8ת חאסם0858.58ע ו בתוכנית הקודמת הגדרנו בשלב ראשון את המחלקה הבסיסית 600/66 ורק בהמשך הגדרנו את המחלקה הנגזרת זְסְהַהח8וח. שיס לב לפונקציית הבנייה של המחלקה החהוח. כאשר גוזריס מחלקה חדשה ממחלקה בסיסית, המחלקה הנגזרת חייבת לקרוא לאחת מפונקציות הבנייה של המחלקה הבסיסית. הקריאה לפונקציית הבנייה 4 ++6 בקלות של מחלקה בסיסית מתוך המחלקה הנגזרת מתבצעת על ידי רישוס שס המחלקה הבסיסית והפרמטרים שלה מייד לאחר הגדרת כותרת הבנאי של הפונקציה הנגזרת. יש להציב את התו נקודתיים בין שס המחלקה הבסיסית לבין כותרת הפונקציה הנגזרת, כמתואר בדוגמה הבאה: ,תס161פסק* 8%2ת0 ,פתהם* כַהַת0)עססחְבבבּת: :עִסחְַבםהת ,פטתסס 51086 ,7ץ58182 11086 ,082 צתאקתסס* פַַַםס (צע5818,תס161פסק,פתת) 10766קת6 : (8םמס61קס 8600% 6ת1 בנאי של מחלקה בסיסית ; (082 שְתאקחסס ,082 שְתהקתסס: :עסהְַַתאת) ץצק5620 ;טס = פטתסס 1א8טתת8: :ע6ט8תאת 2 80008 = 06108 5600%: :ע6טבםאת ו בתוכנית זו, הפונקציה 808061 צוסו\5 של המחלקה ז806ח8ח קוראת בצורה ישירה לפונקציה 66ץ0!0ח6 צוסח5, שהיא אלמנט המחלקה 6ס6ץס!קח6. מכיון שהמחלקה זו נגזרת מהמחלקה 66ץס!קוח6, הגישה לאלמנטים של המחלקה 66ץס!קוחס מתבצעת באופן והה לגישה לאלמנטיס השייכים למחלקה הנגזרת עצמה. ובמיליס אחרות - כאילו האלמנטיסם הוגדרו במחלקה ז806ח8 עצמה. ההורשה מה היא? ההורשה היא היכולת של מחלקה נגזרת לקבל בירושה את התכונות של מחלקה בסיסית קיימת. במיליס אחרות, ווהי בנייה של מחלקה חדשה על בסיס המשתניס והפונקציות של המחלקה הקיימת (בסיסית). המחלקה החדשה יורשת את האלמנטיס (תכונות) של המחלקה הבסיסית. יישוס שיטת ההורשה לבניית מחלקות חדשות מאפשר חיסכון משמעותי בזמן תכנות. דוגמה נוספת לפנינו הגדרת המחלקה הבסיסית 00% : 01858 000% ] :פטס ; (9םת1 ,* ע8ם0 ,* עַַַם0ס)אססס ; (10סט) 00% חסם8 14סע : 6 הטנעס ;[1616]64 עַהַת0ס ;[64]עסתסגו8 עַהַת0 ;65 סת1 ;ן פרק 26: הורשה 265 נניח כי בתוכנית נדרשת הגדרת המחלקה 6870 ץזפזטוו, האקוקה לאלמנטיס הבאיס של המחלקה אסספ. ;[08%8108]64 ע8ם0 0 186א%ע6ת0% ,006 0260%60 15 1 // ;טס 60%686ם0 6ם1 במקרה זה ניתן לגזור בדרך ו את המחלקה 6870 ץזפזפו!| מתוך המחלקה 00%: ] 00%סס 110סמטס : 0820 110282 01858 :טס ;(6ת1 ,* 85ם0 ,6ת1 ,* ע8ם0 ,* עַהת08264)0 צץ110285 ; (07010) 08206 שסם8 16סע : ססאטנסס ; [08%81008]64 ע8%ם0 ;6וס 60%60ם0 6ת1 ן בתוכנית 6385.692א800% מתבצעת גזירה של המחלקה 66 עזפּזם!ו! מתוך המחלקה %. <ת.ת108%268> 6100₪6ם1 <ת.086ם5%21> 01066ם1 01858 000% ] :טס ; (סת1 ,* ע8םת0 ,* עַַַם0)אססס ; (10סט) 00% חסם58 14סע : סספטנמס ;[1616]64 עַהַת0ס ;[64]עסתסגו8 עַַַת0 ;8065ס 6םת1 ;ו (8065ק 6ם1 ,עסםסטה8* ע8ת0 ,%1616* ע8ם00%)0כ::א%ססס \ ; (61%16 ,00%::%1%16) 562007 ; (עסםפט8 ,עסםסגו8::אססס) צץ56200 57 = 00%::08605ס (10סט)00%ס טחטסם8::אססס בנסע ָ ;ק[01ת6 >> 61616 >> " :171%16" >> סגטסס ;01ת6 >> עסםפטה8 >> " :עסםפגת" >> סגסס ;01ת6 >> 8068 >> " :8668ק" >> סגוסס 6 ++6 בקלות ] אססס 110סמטס : 0820 110282 01858 :טס ;(6ת1 ,* 8%ם0 ,6ת1 ,* ע8ם0 ,* עהם08264)0 צץ110285 ; (07010) 0820 שסם8 16סע : סש פטנמס ;[08%8108]64 ע8ם0 ;6ס 60%60ם0 6ת1 ו ,צסתסטה8* ע8ת0 ,6₪1616* 88םת0820)0 צ282ק0826::11 צץ5285מ11 (סטס 60%60ם0 %6ם1 ,60868100* ע8םת0 ,8668 6םת1 (08065 ,0%2ם80%6 ,00%)61%616סס ו ; (08%8109 ,0820::08%68100 צץ1105282) 56200 ;פס 0260%60 = 006 00%66ם0826::0 110285 ו (0820)010 אס0ם0826::58 צץ1102852 בנ1סט ו ; ()000% חאסם5 2 >> 0868106 >> " :08681006" >> סגוסס (סוס 606%60ם0) 15 2 >> "006 60%60ת0 :568608" >> 0006 1-6 ;01ם6 >> "118016הטת :568608" >> סטסס (ס1סט) מ1את 1סע | 7 , "הפתהט" ,"++0 צס 0820)"26580066 0826 110285 ?1 1" ; ()08206 חטסם0820.585 יש לשיס לב לקריאה של בנאי המחלקה 500% מתוך פונקציית הבנייה של המחלקה הנגזרת 6870 ץזפזטו|. כמו כן, נשיסם לב לאופן השימוש באלמנט 00% שוסח5 שבמחלקה 500% בתוך הפונקציה 6870 אוסח5 של המחלקה הנגזרת. פרק 26: הורשה 267 האלמנטים המוגנים בהגדרת המחלקות הבסיסיות ניתן למצוא אלמנטים פרטיים (סזפּעוזק), ציבוריים (סו!סטוק) ומוגנים (66%60+סזק). במחלקה הנגזרת ניתן לגשת לאלמנטיס הציבוריים של המחלקה הבסיסית בצורה ישירה, בדומה לאלו המוגדריס בתוך המחלקה הנגזרת. לעומת זאת, אין למחלקה הנגזרת גישה ישירה לאלמנטים הפרטיים של המחלקה הבסיסית. הגישה אליהס מתבצעת באמצעות פונקציות ממשק של המחלקה הבסיסית. תכונות האלמנטים המוגניס במחלקה הבסיסית הם יצור כלאיים בין האלמנטיס הפרטייס לבין האלמנטיס הציבוריים. המחלקה הנגזרת יכולה לגשת לאלמנט מוגן במחלקה הבסיסית, כמו שהיא ניגשת לאלמנט ציבורי. לעומת זאת, מבחינת שאר חלקי התוכנית האלמנטיסם המוגניס מתנהגים כאלמנטים פרטיים של המחלקה הבסיסית והגישה אליהם מתבצעת באמצעות פונקציות הממשק בלבד. בהגדרה הבאה של המחלקה 000% משתמשים בחלק המוגן כדי לאפשר למחלקות הנגזרות ממנה לגשת בצורה ישירה למשתנים 0₪06, זסחסטה ו-806ק על ידי שימוש באופרטור הנקודה. ] 000% 01858 :טס ; (סת1 ,* ע8ם0 ,* עַם0)א%ססס ; (10סט) 00% חסם58 14סע :0 ;[1616]64 עַהַת0ס ;[64]עסםסגו8 עַַַת0 ;5 סםב1 ;ו השימוש באלמנטיס המוגניס מאפשר לחשוב ייצעד קדימהיי כאשר מגדירים מחלקה. אם נרצה בעתיד לגזור מחלקה חדשה מתוך מחלקה שזה עתה הגדרנו, וגס נרצה לתת למחלקות הנגזרות גישה ישירה לאלמנטיס מסוימים - עלינו להגדיר לאלמנטיס אלה את התכונה 66060לסזכ (מוגן) ולא סזהטוזס (פרטי). אלמנטים מוגנים מספקים נגישות וביטחון כפי שלמדנו, הגדרת איברי מחלקה כפרטייס - 6זבּעזזם, מונעת מהתוכנית לגשת אליהס ישירות. על כן, כדי לגשת לאיבר פרטי כלשהו, התוכנית צריכה להשתמש בפונקציית ממשק (חסטס6חט 661806ח1). בעת השימוש בירושה, מלאכת התכנות פשוטה יותר, כאשר המחלקות הנגזרות יכולות לגשת לאיברי המחלקה הבסיסית על ידי שימוש באופרטור הנקודה. במקריס כאלה ניתן להשתמש באיברי מחלקה מוגנים (006%600זק). מחלקה נגזרת יכולה לגשת לאיברי מחלקה מוגניס באמצעות אופרטור הנקודה, אך משאר חלקי התוכנית ניתן לגשת אל האיבריס המוגניס באמצעות פונקציות הממשק בלבד. בדרך זו, מעמדם של איברי מחלקה מוגנים הוא בין איבריס 8 ++6 בקלות ציבוריים שו|פטק) שאליהס ניתן לגשת מכל חלקי התוכנית, לבין איבריס פרטיים (ססְהעוזק) שאליהם יכולה לגשת ישירות המחלקה שלהס בלבד. פתרון להתנגשות שמות אלמנטים במחלקה במהלך יצירת מחלקות נגזרות עלול להיות מצב, בו שמות אלמנטים של המחלקה הנגזרת וזהיס לשמות אלמנטיס של המחלקה הבסיסית. כאשר יש התנגשות שמות, ++6 משתמשת באלמנט של המחלקה הנגזרת בתוך הפונקציה של המחלקה הנגזרת. נניח שלכל אחת משתי המחלקות 500% ו- 6870 ץזפזטו! מוגדר אלמנט בשם 6סוזס. במחלקה 500% המשתנה פסוזם מקבל את המחיר המומלצ לצרכן, לדוגמה 80 שייח (15). במחלקה 6876 ץזפזפ!ו| המשתנה 6סוזס הינו המחיר לספריה לאחר הנחה, לדוגמה 55 שייח. על פי ההגדרה, מתוך המחלקה 6870 ץזפזטו! ניתן לגשת בצורה ישירה לכל האלמנטיס של המחלקה הנגזרת הזו. אולס, אס במחלקה 6870 עְזפּזטו! צריך לעדכן את המשתנה 6סוז שבמחלקה הבסיסית 200%, הגישה אליו מתבצעת תוך שימוש באופרטור טווח ההכרה ושס המחלקה הבסיסית (לפי התחביר 6סוזק::אססם). אס נרצה להציג על המסך את שני המחיריסם דרך פונקציית המחלקה הנגזרת 680 צוסח5, נשתמש במשפטיס הבאים: 7 6>> 106ע >> "%ף :106ע צעה28ס1ת" >> סגוסס 2 >> 106ע000%::02 >> "8 :106עק 26611" >> סטסס סיכום בפרק זה למדנו כיצד ניתן לבנות (לגזּור) מחלקה חדשה מתוך מחלקה קיימת על ידי יישוס תכונות ההורשה (67108066חח1) של שפת ++6. לפני שנמשיך, נבחן את עצמנו ונוודא שמובניס לנו הנושאיס הבאיס: * ההורשה היא שיטה המאפשרת למחלקה נגזרת לקבל בירושה את התכונות של מחלקה בסיסית (שממנה היא נגזרת). * המחלקה הנגורת היא המחלקה החדשה, והמחלקה הבסיסית היא המחלקה הקיימת. * הגדרת המחלקה הנגזרת מורכבת מהמילה 6855, שס המחלקה החדשה ושם המחלקה הבסיסית המופרד מהשס הקודם על ידי התו נקודתיים, לפי הדוגמה 9 : 8088 !08 6!355. * במחלקה הנגזרת ניתן לגשת לאלמנטים הציבוריים של המחלקה הבסיסית בצורה ישירה, כאילו הס מוגדריס בתוך המחלקה הנגזרת עצמה. הגישה לאלמנטיס הפרטייס של המחלקה הבסיסית מתבצעת באמצעות פונקציות הממשק בלבד. פרק 26: הורשה 269 פונקציית הבנייה של מחלקה נגזרת חייבת לקרוא לאחד הבנאיס של המחלקה הבסיסית על ידי כתיבת נקודתיים, שס הבנאי של המחלקה הבסיסית והפרמטרים המתאימים, מייד לאחר כותרת פונקציית הבנייה של המחלקה הנגזרת. כדי לאפשר למחלקות הנגזרות לגשת לאלמנטיס של המחלקה הבסיסית, אך בו בומן למנוע משאר מרכיבי התוכנית לגשת אליהם, מגדיריס את האלמנטים האלה בחלק המוגן של המחלקה הבסיסית. על ידי כך, המחלקות הנגזרות יכולות לגשת לאלמנטים במחלקה הבסיסית כשס שהן ניגשות לאלמנטיס המוגדריס בחלק הציבורי של המחלקה. לעומת זאת, שאר מרכיבי התוכנית רואיס אלמנטיסם אלה כאלמנטים פרטיים. במקרה של שמות זהיס לאלמנטיס במחלקה הבסיסית ובמחלקה הנגזרת, שפת ++6 פונה לשס האלמנט המוגדר במחלקה הנגזרת. הפתרון להתנגשות השמות הוא על ידי שימוש באופרטור טווח ההכרה לפי הדוגמה ז06וח6וח::6|855 856ם. בדרך זו ניתן לפנות לאלמנט שנמצא במחלקה הבסיסית. בפרק 27 נלמד כיצד מאפשרת ++6 לגזור מחלקה ממחלקה בסיסית אחת, או יותר. הניצול של מספר מחלקות בסיסיות לגזירת מחלקה חדשה אחת הינו תהליך של הורשה מרובה (66ח8>הוסחחו 6|קשוטש). תרגילים 1 2000 נתונה המחלקה הבאה: בה8ת1תה8 018589 :טס ; (סתהת *לַַַם0) 1הת1תה8 ; (ס1סט)6ת1עק ‏ הנ1בסע :עס ;[6]80ת8ם ‏ ע8ם0 ;ו יש לתכנת מחלקה חדשה, 008, היורשת מהמחלקה |הוחוח8 ומוסיפה למחלקה מחרוזת המציינת את גזע הכלב. כיתבו פונקציית בנייה של מחלקת (40, והגדירו מחדש את הפונקציה זשחוזק (על ידי העמסה - חַחוְ0ַה8100ע0) להדפסת תכונות הכלב, כולל הגזע. הוסיפו שגרת חו8וח לבדיקת המחלקה החדשה. כיתבו מחלקה בשס ז060קוהס6 המכילה מחרוזת המתארת את סוג המחשב, ומשתנה המתאר את כמות הזיכרון שלו. כעת יש ליצור שתי מחלקות היורשות מהמחלקה זססטקוחס6 ולכל אחת מהן יש מאפיין נוסף: המחלקה ותטחחסס היורשת מ-זספטקוחס6 ומוסיפה את תכונת מהירות המחשב ביחידות ?חוא; ומחלקה ח505ח861ח, הכוללת משתנה בוליאני 0ח1) המצייו אס המחשב הוא מסוג 6קזוסאוסק. כיתבו פונקציות להשמת ערכיס לתכונות, לקבלת ערכי התכונות, וגס להדפסת תכונות המחשבים השונים. ++6 בקלות כיתבו מחלקה היורשת מהמחלקה 6876 עזפּזפ!! (המופיעה גם בגוף הספר). ] 0%סס 110סמטס : 0820 110282 01858 :טס ;(0ת1 ,* ע8ם0 ,6םת1 ,* ע8ת08264)0 צץ110582 ; (0010) 08208 שסם8 16סע : סספטנמס ;[08%8108]64 עַ8ם0 ;פטס 60%60ם0 6ת1 ;ו המחלקה היורשת צריכה להכיל נתוניס על ספריס מושאליס: שס השואל, ומספר הימיס עד להחזרת הספר. יש להוסיף פונקציה ציבורית להדפסת כל נתוני הספר. הערה: מומלץ לבנות פרויקט כדי להריץ את התוכמית. הפרויקט *כיל את הקבציס השונים. 3.0 626 - הקובץ הראשי המכיל את הפונקציה חופחח. הקבציס האחריס הם: ח.%ססס .6870 ץזבּזסוו סק6.>ססט 687.60 ץזבּזסוו נתונה המחלקה הבאה: פתנגנםתס 018588 | :טס [ ;(5 ,505) צְ8₪200 + (8 *82ם0)שת1ם6 [ ;01ם6 >> ע56 >> סטס0ס + (10סט)6ת1עס הנ1בסט : טנטס ;[8%2]80 628% ;ן יש ליצור רשימה מקושרת של עצמיסם מסוג פַחוח%. לשס כך יש ליצור מחלקה בשס %ן פחווז היורשת מהמחלקה פחווח+ ומוסיפה משתנה פרטי המצביע לאיבר הבא ברשימה. כיתבו פונקציות של 96| סָחוח+ להוספת איבר לרשימה, ולהדפסת כל הרשימה, וגם פונקציות בנייה ופירוק. פרק 26: הורשה ‏ 271 הורעוה נלדובה בפרק הקודם למדנו כיצד ניתן לבנות מחלקה חדשה מתוך מחלקה קיימת תוך הורשת תכונות ממחלקה בסיסית למחלקה נגזרת. כעת נרחיב את הנושא ונציג כיצד ניתן לגזור מחלקה מתוך שתי מחלקות בסיסיות או יותר. הורשת התכונות של מספר מחלקות בסיסיות נקרא הורשה מרובה (1+3066ז6חח1 6!קזשוטוא). בפרק וה נלמד כיצד שפת ++6 תומכת בהורשה מרובה. בהמשך הפרק נדון בנושאיס הבאים : > גוירת מחלקה מתוך מספר מחלקות בסיסיות, הוא תהליך של הורשה מרובה. > הורשה מרובה גורמת לכך שהמחלקה הנגזרת מקבלת מאפיינים (תכונות) של מחלקה בסיסית אחת, או יותר. > בתהליך הורשה מרובה, הבנאי של המחלקה הנגזרת חייב לקרוא לפונקציות בנייה עבור כל אחת מהמחלקות הבסיסיות. > הורשה משורשרת, הינה גזירת מחלקה חדשה מתוך מחלקה נגזרת. ההורשה המרובה היא כלי תכנות מונחה-עצמים (סחווחוה8זססזק %60ח16ז60-0[טס) בעל עוצמה רבה. מומלץ ללמוד את הנושא על ידי הרצות חוזרות של התוכניות המוצגות בפרק זה. ניתן גס לערוך שינוייס קליס וללמוד על השפעתם. יישוס ההורשה המרובה חוסך ומן רב בעבודת התכנות. 2 ++6 בקלות דוגמה להורשה מרובה הנה הגדרת המחלקה 5607660 זססטקוחסס : ) ם802060 עססגוקתסס 01888 :טס ;(סת1 ,ס6ת1 ,סַת10 ,* ע8ם0)ם50266 מס6גוקתסס ; (010ט) ם50266 שטסם8 16סע :טנס ; [32] 6סץ6 שַהתס ;8 10% ;ת10סט26801 א 6ת1 ;ת10סט26801 ץ 6ת1 והנה הגדרת המחלקה 00876 טסו : ) 00828 ע6םס6סת 01889 :טס ; (6ם1 ,%ם1 ,%ת08264)1 65ם6סת ; (010ט)0820ס ע6ת%סת טסם8 בנסע : ס6אטנעס 7 סמסת1 2 סם1 ;אתת 6ם1 ;ו נוכל להשתמש במחלקות הקודמות לגזירת המחלקה זס)טקוחסס. 8 מסתססת 110סגוק ,ת50260 מססטקתסס 110סגוס : עססוקתסס 018585 \ :טס ,1% ,8ם0ס1 ,* עאםת0 ,1108% ,6ת1 ,* שַהַם0)עססגוקתסס ; (%ם1 ,%ת1 ,%םת1 ,6ם1 ; (016ט) עס6ס6טקתסס שסם8 16סע : סספטנמס ; [64 ] סת8ם בַהַת0ס %2 בועפם סת1 ;צְססס1ת 11086 ;ן יש לשיס לב לכך שבכותרת הגדרת המחלקה הנגזרת מופיעיס שני שמות של מחלקות בסיסיות : : עססטקתסס 018585 066 110סטק ,ם50260 מססטקתסס 116סטס שתי מחלקות בסיסיות | פרק 27: הורשה מרובה 273 בתוכנית 62.מפדטפו60 שלהלקן, גוזריסם את המחלקה זסטקוחס6 מתוך המחלקות ח50766 זססטוקרח 60 ו-0זהס זסהזסוח. <ת.ת108%208> 01066ם1 <ת.086ם5%21> 01066ם1 ) ם802060 עססוקתסס 01888 :טס ;(סת1 ,6ת1 ,סַת0ס1 ,* ע8ם0)ם50266 מס6גוקתסס ; (010ט) ם50266 שסם8 16סע : ס6הטנעס ; [32] 6סץ6 שהתס 7 ₪%ם10 ;תסנסט26501 א 6ת1 ;ת10סט26801 ץ 6ת1 ;ן ,6סץ>* ע0282)ם50260 פססוקתסס: :ת50266 ע66טקתסס (268 ץ 6ם1 ,268 א 6ת1 ,001028 סַם0ס1 ָ ; (6סץ6 ,06עץ56::ת502606 מע6סטקתסס) 560200 2 = 001028::ת50206 00000662 7 א = מ10םסט26801 א%::ת50266 מע6ס6טקתסס 7 ץצ = מ10םסט6801ע2 ץ::ת50266 מע6סטקתסס (0010) ת802066 שסם8::ם50200 מס6סטקתסס בנסע ָ ;01ת6 >> 6סץ₪ >> " :6סץעץ6₪ ם50266" >> סגוסס ;1 >> 001028 >> " :6001028" >> סגוסס >> " צס" >> םמ810ט26801 א% >> " :תסנסט1ספ6ת" >> סטסס 12 >> ם10סט6501ע2 ץ ) 008206 ע6םס6סת 01889 :טס ;(סת1 ,%ם1 ,%ת08264)1 65ם6סת ; (010ט)0820ס 62ת%סת טסם8 בנסע :טנס 7 סמסתם1 2 סת1 ;אתת 6ם1 ;ו (אתת %ת1 ,50600 6ם1 ,0068802ע2ק %6ם0828)1ק 62םס6סת::0820ס מ6תססת ו 2 = 00088502ע00820::02 מסתססת 2 = 00820::506060 עסתססת ;אתת = א00820::224 עסתססת ] 4 ++6 בקלות (010ע)00820 עסת6סת חאסם0820::5סס ע6ת6סת בנסע ָ 2 >> 20068808 >> " :220068802" >> סטסס ; [0םמ8 >> "2מ/" >> 580660 >> " :50660" >> סטסס ;61ת6 >> "סא " >> אתת >> " :נאתת" >> סגסס ,ת50266 עסס6גמקתסס 116מטק : מססטקתסס 01858 ) 00820 65ם₪0% 110סטס :טס ,0תס1 ,* ע8ת0 ,1108% ,%םת1 ,* שַהַת60)עססגוקתסס לת < סד ,םת ?שת ה ; (10סט) עססטקתסס טסם8 16סע : סספטנעס ;[64]סתאם עַַם0 ;8% העהם סת1 ;צְססס1ת 11086 ;ן ,018% ספת 6ם1 ,סתםת* ש8ם0)ע66גמקתס2::6ס66גוקתסס 7 1068 ,ת60ע8502* 82ם0 ,צְסקס51 11086 סמסם1 ,2000988020 סת1 ,268 ץ סת1 ,268 א 6ת1 17 א< ,001028 ,ת802600)ם50266 עס6סטקתסס : (אתת 6ת1 (אגת ,800600 ,0820)200659802סכ פפתססת , (2698 ץ ו ; (סת8ת , סַתהּת: : עססגוקתסס) ץצ56200 8% 6₪0פ8ם = א618% בַעהת::ש6סטקתסס ;ץסקס1ת = צץסקס1+::צ6סגמקתסס ] (010ט) ע6סטקתסס טסם8::ע6סטקתסס בנ1סע ז 2 >> שתהת >> " :6סץ7" >> סגוסס 12 >> "סא" >> 618% שעת >> " :618% 238260" >> סטסס 12 >> "סא" >> צססס11 >> " :015% צְססס1ע" >> שגוסס ; ()00820 62םס6סת חאסםפ5 ; () ם56266 חאסם5 (ס1סט) ת1נאת ה1סט ו ,"ת576" ,1.44 ,212 ,"שהקתס6")ס6ק צעת מס6גוקתסס ;(8 ,66 ,486 ,480 ,640 , 160000002 ; () 0662קת60 חאסם6.5ק צת ו פרק 27: הורשה מרובה 275 יש לשים לב, שמתוך פונקציית הבנייה של המחלקה זס%טקו 60 מתבצעת קריאה לשתי פונקציות הבנייה של המחלקות הבסיסיות ח50766 זסזטקוחס6 ו-70ה008 זסח+סוח. ,018% ספת 6ם1 ,סתםת* מ8ם0)ע66גמקתס2::6ס66גוקתסס ,8 א סת1 ,601028 סַת0ס1 ,ת50266* ע8םת0 ,צץססס51 11086 (אגתת %ת1 ,80600 %ם1 ,200085802 6ם1 ,268 ץ 6ת1 ,(2068 ץ ,268 א ,001028 ,ת50206)ת50266 מ66טקתסס (אגת ,50060 ,0820)20068802ס 62ם6סת בניית הורשה משורשרת כשמשתמשיס בשיטת ההורשה בשפת ++6 ייתכן מצב שבו נרצה לגזור מחלקה חדשה מתוך מחלקה שהיא עצמה נגזרת ממחלקה אחרת. ווהי הורשה משורשת (חו608 66חפטוזסתה1). לדוגמה, נרצה להשתמש במחלקה זס6)טק 60 כמחלקה בסיסית למחלקה נגזרת ח5%800 אזסצו. ] עססטקתסס 110סטס : ם568%10 אפסח 01858 :טס ,סתהת* ע8םת0 ,875660 0ם628%1ק0ס* 82ם0)ם568610 אמסח ,ת80206* 685 , צץס0ק0ס51 11086 ,418% העהםת 6ת1 17 7 סת1 ,268 א 6ת1 ,001028 שַם0ס1 ; (אתת %ם1 ,50060 %ם1 ,20068802 6ם1 ; (10סט) ם5%68%10 אמסח טסם8 16סע : טנס ; [64] מ78%60ץ58 6ם62861ס0 שַַַם0 ;ו פונקציית הבנייה של המחלקה ח50900 אזסעו קוראת לפונקציית הבנייה של המחלקה וקו 0ס6, אשר בתורה קוראת לפונקציות הבנייה של המחלקות ח56766 זסזטקוחסס ו- 0 הופח. ,ת8%6ץ8 סַת62861קס* 82ת0)ת5868%610 א%עסט::ם568610 אמסח ,צְססס1 51086 ,418% בעהם 6ת1 ,פתהת* מַהם0 ,7 ץ 6ם1 ,268 א 6ת1 ,001028 סַת0ס1 ,ת50206* מַהם0 (אתת %ם1 ,52060 6ם1 ,200659802 6ם1 ,ת50260 ,צְס0ק100? ,418% בַעהם ,סתאם) מ66טקתסס (אתת ,80660 ,20008802 ,268 ץ ,268 א ,0010258 ָ ; (ת8578%606 06ת575600,006028%1 סְםת62861קס::ת5868%10 %מסא) ץק5620 ו במקרה זה, המחלקה זפטקוחס6 מתפקדת כמחלקה בסיסית, על אף שהיא מחלקה נגזרת מהמחלקות 50706 זסזטקות60 ו-00870 הוהח. התוצאה הישירה משרשור המחלקות היא, שמחלקת ח50900 אזסשו יורשת את תכונותיהן של כל שלוש המחלקות האלו. בתרשיס 27.1 מוצגת גזּירת המחלקה וההורשה המשורשרת. ככל שמרביס להשתמש בשיטת ההורשה ובהורשה משורשרת, נראה שמחלקה נגזרת עשויה לקבל מספר רב של אלמנטיס שנובעיס משרשרת המחלקות שהיא נגזרת מהן. 6 ++6 בקלות 0 00 ות 00 0 %עסע 0 00160" 1 תרשים 27.1: בניית הורשה משורשרת. גזירת מחלקה חדשה באמצעות הרשאת ס6זהּטווק ב- ++6 אפשר להגדיר את המחלקה הנגזרת כך שתיגזר כ- :סופצוזם באופן הבא : 6 מפם8ט1מסש :840691076 01889 [ ; גוף המחלקה ] כל המשתניס והפונקציות שהוגדרו כ- :66060ססזס או כ- :סו|פטום במחלקת הבסיס, הופכיס להיות :6זפטוזן בתוך המחלקה הנגזרת. ולכן, המחלקה הנגזרת תוכל לגשת אליהס, אבל המחלקות שייגזרו ממנה לא יוכלו לגשת למשתנים. מחלקה שנגזרת כ- :ס66פעוק שוברת את שרשרת הגזירה. משתנים שהוגדרו במחלקת הבסיס כ- :%66000סז או כ- :6ו|פטם הופכים ל- :סהטוזם במחלקה הנגזרת מכיון שזו נגזרה באמצעות הרשאת :6זפטוזק. הפונקציות של המחלקה הנגזרת יכולות לגשת למשתניס שהפכו ל- :ס6זאטוזק בתוך המחלקה הנגזרת, אבל הן לא יכולות לגשת למשתניס שהוגדרו כ- :שופצוזק במחלקת הבסיס. פרק 27: הורשה מרובה 277 דוגמה : קכ6.%עיוקוחחו <ת.ת108%2608> 61086םת1+ 0188588 6% ָ : טנס ;א 1086" :0 ;ץ 1086" 6 טס 7 108" 4 > :5 ץצ ;8 א)(6 108% ,ס 5108% ,8 5108%) 886 [; (א)םעט266+()א 866 1086 [; (ץ) םעגוס6ע) ()ץ 866 1086 [; (2)םעג2)()260 666 1086 6)()חסם5 ה1סט ותמו תא 1 = ">>7ץ>>" =ץ ">6>א>>" =א ת\:856ס">>סטס ( ; 01מ2>>8>>" ;ו 6 6₪םַ8ט1עק :0621061 01858 | : טנס ;1 11086 :0 12 11086 :טס 12 11086 % ,81 51086 ,0 51086 ,מ 1108% ,8 5+108%) 0621061 (01 108%+ ,01 (ס ,5 ,856)8ס: [;(1א)ם1)(]26%02א 666 11086 [; (1ץ)ם1)()26%02ץ 666 11086 [;(21)ם21)(126%02 666 11086 ()טסם8 16סע ז =2 ">>צ>>" =ץ ">>()א ₪מ060>>" =א ם\:61ש0006>>"0621 ;21>>01>>" =21 ">>1ץ>>" =1ץ ">>1א>>" =1את\">>2>>" 8 ++6 בקלות 1 8606ט1עק :6621062 01888 : ססטנמס 2 1108 ו 2 110865 :טס 2 1108 ,1 108+ ,81 1108% ,0 108%+ ,0 11086 ,8 108%6+) 6671762 (62 1108% ,02 108%+ ,82 108%+,61 1108% (01 ,01 ,81 ,60 ,0 ,8) 062161 [; (2א)ם2)(]20%02א 66 11086 [; (2ץ) ם126%02) ()2ץ 66 11086 [; (22)ם22)(]20%02 666 11086 ()טסם5 18סט ָ =1>>"21ץ>>" =1ץ ">>()1א 066>>" =1א ם\:62ע0006>>"6621 =22 ">>72>>" =2ץ ">>()2א 066>>" =2אםת\">>21>>" ; 01מ22>>6>>" (13סט) מ באת 6621762 62)1.01, 2.0%, 3.05, 4.05, 5.05, 6.05, 7.05, ; (9.05 ; () שסם5 . 02 >>()72ץ 62.866>>" =2ץ ">>()2א 2=">>02.066א ם\: () מ1את">>0006 ;01מ02.22>>8>>" =22 " ָ נן ב סט ָ פרק 27: הורשה מרובה 279 סוגי הרשאה והיתרי גישה גזירה באמצעות 6וופשק 0 ++6 בקלות גזירה באמצעות 6זהּעווכ 0 60 פרק 27: הורשה מרובה ‏ 281 גזירה באמצעות 66%60>סיוכ 0 60 0 | מותרת סיכום סוגי הרשאה והיתרי גישה 6 גזּירה באמצעות גזּירה באמצעות גזירה באמצעות 6|!355 6העוזכן טווו 6וופטק \ 6זהּעצוזוכן :8 6|355 | 566500סזכ :₪ 61355 | ה ש6ו!פטכ :8 55בּ|ס :ו לא נגיש לא נגיש לא נגיש יי :ו ו :ו ו :ו :0-ו ו 2 ++6 בקלות תכנון עץ הורשה הסיבה העיקרית לבניית עצ הורשה היא שימוש בחלקיס מהקוד של מחלקת הבסיס במספר מחלקות נגזרות. אובייקט הנגזרת מקבל את המשתנים של מחלקת הבסיס גם אם הוא לא עושה שימוש בכולס. לכן, רצוי ליצור מחלקת בסיס עס מכנה משותף בסיסי ולהוסיף מידע במחלקות הנגזרות. אס ישנס משתניס במחלקת הבסיס שאנו לא עושיס בהס שימוש. מומלצ ליצור מחלקת בסיס צרה ובסיסית יותר. רצוי להגדיר פעולות כלליות במחלקת הבסיס כך שלא יידרש בהן שינוי במחלקות הנגזרות. במידה ופונקציות מחלקת הבסיס לא יעבדו בצורה והה במחלקות הנגזרות, יש להגדירן כ- |₪3שזו\. עצ הורשה רחב נוצר כאשר למחלקת הבסיס הרבה מחלקות נגזרות ישירות מהבסיס, כלומר, למחלקות הנגזרות יש מכנה משותף מרכזי אחד. כל שינוי במחלקת הבסיס ישפיע באופן ישיר על מספר רב של מחלקות. יצירת עצ הורשה עמוק מאפשר להגדיר מספר פונקציות במחלקת הבסיס שאינן דורשות הגדרה מחודשת במחלקות הנגזרות. שינוי במחלקת הבסיס ישפיע באופן ישיר על מספר קטן של מחלקות שיכולות לדאוג להמשך תפקוד תקין בהמשך עץ ההורשה. עצ הורשה עמוק מאפשר גמישות תכנותית. סיכום הורשה מרובה (1%3066ז6חח! 6!קש!טוא) היא שיטה לגזירת מחלקה מתוך מספר מחלקות בסיסיות. על ידי יישוס הורשה מרובה, המחלקה הנגזרת יורשת את התכונות (האלמנטיס) של המחלקות הבסיסיות. התמיכה ששפת ++6 נותנת להורשה מרובה מוסיפה לתוכניות עוצמה רבה. לפני שנמשיך לפרק הבא, נבחן אם מובניס הנושאים הבאים : * ההורשה המרובה היא היכולת לגזור מחלקה חדשה היורשת את תכונותיהן של מספר מחלקות בסיסיות. * כדי לגזור מחלקה חדשה ממספר מחלקות בסיסית יש לציין את שמות המחלקות הבסיסיות ולהפרידן בפסיקים בכותרת הגדרת המחלקה הנגזרת לפי דוגמה זו: א 6ו|ט טכ ,68% 6ו|סטוק : 680% 6|855. * בהגדרת פונקציית הבנייה של המחלקה הנגזרת חייבים לקרוא לפונקציות הבנייה של כל אחת מהמחלקות הבסיסיות, ולהעביר כראוי את הפרמטריס. * במהלך גזירת מחלקות חדשות ייתכן מצב בו המחלקה הבסיסית עצמה נגזרת ממחלקות נגזרות אחרות. במקריס אלה נוצרת בתוכנית הורשה משורשרת (חו8ח6 66ח671%8חח1). כאשר פונקציית הבנייה של המחלקה האחרונה בשרשרת קוראת לפונקציית הבנייה של המחלקה הבסיסית לה, שאר פונקציות הבנייה בשרשרת ההורשה מתבצעות לפי התור. פרק 27: הורשה מרובה 283 בפרק 28 נציג כיצד ניתן לגשת לאלמנטיס הפרטייס של מחלקה באמצעות פונקציות הנמצאות בתוך מחלקה אחרת אשר סווגה כחברה (6ח6זזת). על ידי שימוש בפונקציות חברות, מאפשרים גישה ישירה של פונקציות מסוימות אל אלמנטים של פונקציות אחרות, בשעה שממשיכים את ההגנה על אותס אלמנטים מגישה על ידי חלקיס אחריס של התוכנית. תרגילים 1 כיתבו תוכנית שתכלול: א) מחלקה 6!6וח6ע בעלת איברי מחלקה אלה : 6וחט|סץ, 50660 ,חש וסצו. ב) | מחלקה ח6ז( 586 זס? בעלת : סח 68%8|00, 6סוזס. ג מחלקה ז68 היורשת ממחלקות אי ו-בי ומוסיפה איברי מחלקה אלת: זס|ס6, 66|5חא\ פח. ד) | מחלקה 916/66 היורשת ממחלקות א' ו-בי ומוסיפה איבריס אלה: זסוסס, 5 פח. כיתבו את הבנאיס (500660175ח60) של כל המחלקות הללו. 2 כיתבו תוכנית שתכלול: א) מחלקה 6חסחק בעלת איברי מחלקה : פח 6חסחק ,6006 8768. ב) מחלקה 8007655 בעלת איברי מחלקה: הח 5766%, סח 50766%, סוחהח ו6. ג() | מחלקה 08%8 חספזסק היורשת ממחלקות אי ו-בי ומוסיפה איבר מחלקה: 6וחפח. כיתבו את הבנאים (5006%015ח60) של כל המחלקות הללו. הערה : בשני התרגילים צריך להוסיף את הפונקציה חופוח ואת הפונקציה ()/שסו/5, כדי להציג את משתני המחלקות. 4 ++6 בקלות אלמנטים פרטיים ואלנענטים חברים בפרקיס הקודמיס למדנו שהגישה לאלמנטים פרטיים של המחלקה מתאפשרת באמצעות פונקציות המחלקה בלבד. שימוש רב באלמנטיס פרטיים של המחלקה מקטין באופן משמעותי את הסיכוי לשימוש לא נכון באלמנטיס של המחלקה, מכיון שהגישה אליהסם נעשית באמצעות פונקציות ממשק בלבד. הדרך הזו היא המומלצת ביותר, וטוב לא לסטות ממנה. למרות ואת, לפעמיס גישה ישירה למרכיביס מסוימיס של התוכנית או לחלק פרטי של מחלקה מסוימת עשויה לשפר באופןו משמעותי את ביצועי התוכנית. הגישה הישירה לאלמנטיס במחלקה משפרת את זמני התגובה של התוכנית, מכיון שהתוכנית חוסכת את התהליכים הנלוויס לקריאת פונקציית הממשק. למקרים אלה, שפת ++6 מאפשרת להגדיר מחלקה חברה (6ח6וז-) אשר מותרת לה גישה ישירה לאלמנטים הפרטיים של חברותיה. בהמשך הפרק נדון בנושאיס הבאיס: > ציון קשרי חברות (0ח16=) בין מחלקות, כדי שמחלקות אחרות תוכלנה לגשת לאיבריס הפרטיים (סז8עוזק) של המחלקה המצהירה על חברותיה. % איבריס פרטייס במחלקה מגיניס על נתוני המחלקה - ולכן צריך להגביל את השימוש במחלקות חברות רק לאותן מחלקות שבאמת צריכות לגשת לאיברי המחלקה הפרטיים. > הגבלת הגישה של מחלקות חברות לפונקציות מסוימות בלבד. האלמנטיס הפרטייס של המחלקה מגינים עליה ומקטיניסם את הסיכוי לתקלות ושגיאות. לכן, יש לצמצס את השימוש במחלקות חברות. ככל שמרחיביס את אפשרות הגישה הישירה לאלמנטיס של המחלקה, גדל הסיכוי לשגיאות בתוכנית. פרק 28: אלמנטים פרטיים ואלמנטים חברים 285 הגדרת מחלקה חברה שפת ++6 מאפשרת גישה ישירה לאלמנטים הפרטייס של המחלקה ומחלקות אחרות שהן חברות למחלקה נתונה. כדי לציין איגו מחלקה חברה (0ח6וז=) למחלקה אחרת, יש לרשוס בתוך הגדרת המחלקה את שס המחלקה החברה, ולפני השס יש לכתוב את המילה השמורה 0ח816. לדוגמה, בהגדרה הבאה של המחלקה 006 מצייניס שהמחלקה חפוזפזפו!| היא מחלקה חברה למחלקה א0ס0. כתוצאה מהצהרת החברות הזו, העצמיס מטיפוס המחלקה חהחפזםו! יכוליס לגשת בצורה ישירה לאלמנטיס הפרטייס של המחלקה אססם. ם.אסססטח16ט // ;תהנעה8תסו+1 01889 01858 00% ] :טס ;(* 08% ,* 8%2ם0 ,* עַהַת0)א0%ססס ; (000%)7010 חאסם58 18סע ;ת8518עס11 06ם16ת1+ : 66 הטנס ;[61%16]64 088 ;[02]64ם80% 0852 ;[08%81006]64 028% ;ו ) ת18עה8עס11 01888 :טס ; (* ע8ת0 ,* 6868106)000% סִחַת8םת0 ב1סט ; (008ס0) 6868109 966ף* עהם0 לן בתוכנית 699.אסספשפנע נראה שהמחלקה חהופזפו! הינה חברה למחלקה >ססט. על כן, לפונקציות של המחלקה ח8חפזפטו| יש גישה ישירה לאלמנטים הפרטיים של המחלקה א0ספ. בתוכנית זו, הפונקציה 6819108 6חַח8ח6 של המחלקה חפוזהזטו! משנה את המספר הקטלוגי של ספר מסויס. המספר הקטלוגי הוא אלמנט פרטי של המחלקה %. ססס.אססס טסנבט // <ת.ת1085%208> 66ג610םת1+ <ת.0ת1ע56> 1066סת1+ "(.%ססכחטסנ1נט" 61066ת1+ (ס1סט) מנאת ה1סט ן ; ("101ע" ,"הפתה" ,"++0 צ2 060ו650ת")6םנתתהעטסעס אססס ;ץ82עס11 מ18ע110282 6 ++6 בקלות ; ()000% אסם5.סֶתנמתהצטסצ+ס ; ("101 ++0 צפתם" ,סַת1נתת20028ק08%68100)6 86ת8ת0.ץ110282 ; ()000% אסם5.סְָתנמתהצטסצ+ס (08%8100* ע8ת0 ,עסםת80%* 0282 ,%1616* ע8%ם0%)0סכ::א%ססס | ; (%1%16 ,00%8::61%616) 562007 ; (עסתסטו8 ,עסתסגו8::אססס) ץ56200 ; (08%8100 ,0868100::א8ססס) ץ56200 (ס1בסט)00%ס חטסם85::א0%סס ב1נסט ָ ;[0ת6 >> 61616 >> " :71616" >> שטסס ;01ת6 >> פסםסגטה8 >> " :עסםפטת" >> 00816 2 >%>> 0868106 >> " :0868100" >> 00016 ,א*סססם 18ם6* 08%8108)000% 06ם8ם0::ת11028218 ב1נסעט (08%8100 חטסםת* ע8ם0 ; (08%8100 חטסם ,08%8100<-00%ס 18ם6) ץ56200 (008ס 18ם6 08%81006)000% 066::םת11028218* מַא8ם0 | ;[068%8100]64 0282 568610 ; (000%.08%8100 18ם6 ,60868100) צץ56200 ; (08%68100) תעט26% ] ניתן לראות, שהתוכנית מעבירה את הפונקציה (68098|]0 68086 של המחלקה חאוזהזםו! אל העצס מטיפוס אססספ על ידי ציון כתובת הפונקציה. חייביס להעביר את הפרמטר על ידי ציון כתובתו, מכיון שהפונקציה משנה תוכן של אלמנט במחלקה. הגישה לאלמנט מתבצעת תוך שימוש במצביע. מומלצ להריץ את התוכנית שנית, אך לפני ההידור וההרצה החוזרת להסיר את המילה 11600 מתוך הגדרת המחלקה >ססם. כך אנו מסיריס מהמחלקה חאחפזטו! את הגישה הישירה לחלק הפרטי של המחלקה %ססם. המהדר מזהה את המצב ויוצר הודעת שגיאה בכל ניסיון של גישה ישירה לאלמנטיס הפרטיים של המחלקה אססם. פרק 28: אלמנטים פרטיים ואלמנטים חברים 287 מה הן מחלקות חברות? בדרך כלל, הדרך היחידה שבה אפשר לגשת לחלק הפרטי של מחלקה היא באמצעות פונקציות הממשק של המחלקה. בהתחשב בנסיבות שונות, יתכן מצב בו יהיה רצוי לאפשר למחלקה מסוימת לגשת ישירות לחלק הפרטי של מחלקה אחרת. אפשרות זו יש לציין למהדר, שמחלקה אחת הינה חברה (0ח16=) למחלקה אחרת. עושים ואת על ידי רישוס המילה 0ח6וז6 לפני שס המחלקה החברה ובתוך הגדרת החלק הציבורי של המחלקה שאליה מתאפשרת הגישה הישירה. ופ 9 ₪1 :טס 02 ₪ת216+ פס 066 // : 66 הטע 8 806ט1עלק // ;ו השוני בין אלמנטים מוגנים למחלקות חברות בפרק 26 למדנו, כי אלמנטים מוגניס מאפשריס למחלקות הנגזרות לגשת ישירות אל האלמנטיס הפרטייס של מחלקת הבסיס, על ידי שימוש באופרטור הנקודה. יש לזכור, כי רק מחלקות אשר נגזרו ממחלקת הבסיס יכולות לגשת ישירות אל האלמטיס המוגניס. במיליס אחרות, מחלקות אשר יורשות את האיבריס של מחלקת הבסיס. מחלקות חברות (635565 6חסוזת) הן בדרך כלל מחלקות שאין ביניהן קשר כלשהו, כלומר, אין ביניהן קשר ירושה. הדרך היחידה בה יכולה מחלקה לגשת אל אלמנטיס פרטיים של מחלקה אחרת, שאינה נמצאת איתה בקשר של ירושה, היא במקרה בו המחלקה האחרת מציינת למהדר שהמחלקה הפונה אליה הינה מחלקה חברה (0ח6וחת). הגבלת הגישה של מחלקות חברות הצהרת חברות מאפשרת למחלקה מסוימת לגשת בצורה ישירה לחלק הפרטי של מחלקה אחרת. ידוע כי פתיחת החלק הפרטי של המחלקה גוררת איתה סיכוי רב יותר לשגיאות ולתקלות בתוכנית. לכן, שפת ++6 מאפשרת לקבוע למי מהפונקציות של המחלקה ניתנת הרשות לגשת בצורה ישירה לחלק הפרטי של המחלקה החברה. לדוגמה, נניח שהמחלקה חפוזפזפו! שהצגנו בתוכנית הקודמת מורכבת ממספר רב של פונקציות. בנוסף נניח, שהפונקציות 68%3|00 608006 ו-6809|00 86% הן היחידות במחלקה הזו שבהן נדרשת גישה ישירה לנתוניסם הפרטייס של המחלקה אסספ. בתוך הגדרת המחלקה א0%ספ ניתן להגביל את הגישה הישירה לחלק הפרטי שלה למחלקות מסוימות בלבד, על ידי ציון הפונקציות החברות האלו בהגדרה. בדוגמה זו הפונקציות הן 68300 סְחַחַ8ח6 ו-6818|00 06%. 8 ++6 בקלות ] 00% 01858 :טס ;(* ע8ת0 ,* 8%ם0 ,* לַהַם0)אססס ; (010ט) 000% שסם8 16סע ; (000%) 0868100 06%6::ם11028218* עהםתס 6מם5216 ;(* 0282 ,* 000% 08%8108 06ם8ם0::ת11028218 16סט 6מם5216 : 66 הטנמס ;[₪1%16]64 עַַַםת0 ;[64]ע0סם16ו8 08% ;[08%8100]64 ע8ם0 ;ו כפי שניתן לראות, המשפטיס המתחילים במילה 0ח6ו17 כוללים תבניות שלמות של פונקציות עבור כל אחת מפונקציות המחלקה החברות שרשאיות לגשת ישירות אל האיבריס הפרטייס של המחלקה. מה הן פונקציות חברות ? פונקציות חברות (5חסשס6חוף חחסוז=) הן דרך להגביל את הגישה של מחלקות חברות אל נתוניס בחלק הפרטי של מחלקה אחרת. הגדרת פונקציה חברה בתוך המחלקה כוללת את המילה השמורה 0ח6ו17, ואת האב טיפוס המלא של הפונקציה, כמו בדוגמה זו: ו ; (68סץ6 828(6%62ק)סתהת מתסנססתט5::פת8ת 01858 06םת1016 רק הפונקציה המסוימת ששמה מפורט במשפט 0ח1116 יכולה לגשת ישירות לאיברי המחלקה הפרטיים, באמצעות אופרטור הנקודה שספ). נוכל לראות שהאלמנטיס החברים, המוגדריס עס המילה 8ח1716, כולליסם את הצהרת הפונקציה החברה במלואה. כאשר יש פניות ממחלקה אחת לחברתה, יכולות להיות שגיאות תחביר אס סדר הגדרת המחלקות אינו נכון. במקרה הקודס, המחלקה 00% כללה בהגדרתה הצהרות של פונקציות המוגדרות ושייכות למחלקה חהחפזטוו. לכן, הגדרת המחלקה 00%פ חייבת להופיע בתוכנית לפני הגדרת המחלקה חהחפזטו!. אולס הגדרת המחלקה חפוזפּזסו! כוללת פנייה למחלקה אססם, כדלקמן: ) ת18עה8עס11 01888 :טס ; (* ע8ת0 ,* 6)000%ש686810 סִחַתה8םת0 ב1סט ; (0008) 6868109 666* עהַם0 ;ו מרקס היחסיס בין המחלקה חהופזפו! לביו המחלקה 0%ספ מונע את כתיבת הגדרת המחלקה 000% לפני הגדרת המחלקה חהחפזטוו, ולהיפך. שפת ++6 מאפשרת פתרון לבעיה על ידי הצבת משפט הגדרה המציין למהדר שההגדרה המלאה של מחלקה נמצאת מאוחר יותר בתוכנית. פרק 28: אלמנטים פרטיים ואלמנטים חברים 289 הנה המשפט הפותר את הבעיה הקודמת: ;0% 0188585 בתוכנית 99ס.1ח;דנואנ: מתואר השימוש בפונקציות חברות. בתוכנית זו, פונקציות חברות משמשות להגבלת הגישה של המחלקה חהחפזסו! אל הנתוניס הפרטייס של המחלקה 00%פ. יש לשיס לב במיוחד לסדר הגדרת המחלקות. <ת.ת108%268> 61006ת1+ <ת.0ת1ע56> 61066ת1+ 018885 0%; ) ת18עהאעס11 018898 :פטס ;(* 82ם0 ,* 0868106)000% סִסֶתהתס בנ1סט ; (008ס) 08%8109 666* 0282 ;ו ] 00% 01858 :טס ;(* ע8ת0 ,* 8%ם0 ,* לַהַם0)אססס ; (010ט) 000% שסם8 16סע ; (0008) 08%8109 06%6::םת11028218* 085 6ת1216 ;(* 0282 ,* 08%81008)000% 06ם8ם0::ת11028218 16סט 6מם5216 : ספטנסס ;[₪1%16]64 עַַ8ם0 ;[64]ע0ם16ו8 08% ;[08%8100]64 ע8ם0 ;ו (08%8100* ע028 ,עסםת80%* 0282 ,%1616* ע8%ם00%)0כ::אססס | ; (%1%16 ,008::61%16) 562007 ; (0₪ם80%5 ,לסם806::אססס) צץ56200 ; (08%81009 ,08%68100::אססס) צץ56200 ] (ס1בסט)00%ס טחטסם85::א00%ס בנ1נסע ז 12 >> 61616 >> " :71616" >> 0086 ;01ת6 >> עסםפסגטה8 >> " :עסםתפטת" >> 008% 2 %>> 08681006 >> " :0868100" >> 00016 0 ++6 בקלות (08%8100 שסםת* עה8ת0 ,000% 18ם₪* 08%8108)000% ססַהםתס::תה28218ס11 בנסט ןָ ; (08%8100 חטסם ,08%8100<-00%ס 18ם6) צץ56200 (008ס 18ם6 08%81006)000% 066::םת11028218* מַאם0 | ;[08%8100]64 082 568610 ; (000%.08%8100 18ם6 ,60868100) ץ56200 ; (08%68100) תעט26% (ס1נסט) מנאת ה1סט | ; ("101ע" ,"הפתה" ,"++60 צ2 060ו650ת")6םנתתהעטסעס אססס ;ץע8ת5ס11 ם18ע28ס11 ; ()000% אסם5.סְָםנמתהצטסצ+ס ;("101 +60 צפתם" ,סַםת1תת20028ק08%68100)6 086םת8ת0.ץ11282 ; ()000% אסם5.סֶָתנמתהפטסצס מזהה מחלקה מזהה 10600860) הוא שם, כמו משתנה או טיפוס מחלקה. כאשר משתמשים במחלקות חברות בתוכנית, יכול להיווצר מצב, בו הגדרת מחלקה מסוימת מתייחסת אל מחלקה אחרת (לפי שס או לפי מאהה), אשר המהדר אינו מכיר עדיין. במקרה כזה, המהדר יודיע על שגיאת תחביר. כדי לפתור את הבעיה הזו, של ייאיזו מחלקה מוגדרת ראשונהיי, ניתן לכלול שורה אחת של מזהה מחלקה ליד תחילת קוד המקור: ;סתהת 61888 61888 המזהה מציין למהדר, כי המחלקה הנוספת תוגדר מאוחר יותר, ולכן התוכנית יכולה להתייחס לשס מחלקה כשסם חוקי. פרק 28: אלמנטים פרטיים ואלמנטים חברים ‏ 291 סיכום בפרק וה למדנו כיצד להשתמש במחלקות חברות (6|35565 6ח6וזח) כדי לאפשר שיתוף אלמנטיס פרטייס בין מחלקות שונות. לפני שנעבור לפרק הבא, נבחן אס מובניס הנושאיס הבאים : / / הצהרת חברות מאפשרת למחלקות שונות לגשת באופן ישיר לאלמנטיס פרטייס של מחלקות אחרות. כדי להצהיר על מחלקה חברה, יש לציין את המילה השמורה 0ח6ו, לאחריה את שס המחלקה - כל וה בתוך הגדרת המחלקה. המשמעות של הצהרת מחלקה חברה היא, שכל האלמנטים של אותה מחלקה יכולים לגשת בצורה ישירה לאלמנטיס הפרטיים של המחלקה. מגביליס את מספר פונקציות המחלקה המסוגלות לגשת לחלק הפרטי של המחלקה על ידי הגדרת פונקציות חברות. כדי להגדיר פונקציה חברה, כותביס את המילה השמורה 0ח6ו1 והצהרה מלאה של הפונקציה, אשר צריכה לפנות לחלק הפרטי של המחלקה. הגדרת פונקציות חברות עלולה לגרוס לשגיאות תחביר, בגלל סדר ההגדרה של המחלקות בתוכנית. לפתרון בעיה זו, שפת ++6 מאפשרת לציין למהדר שהגדרת המחלקה נמצאת במקוס מאוחר יותר בתוכנית, על ידי כתיבת משפט כמו זה: ;86 6|855 6|355. בפרק 29 נראה כיצד להשתמש בתבניות פונקציה (8005|קוח6+ חסטס6חטת) כדי לפשט הגדרות של פונקציות דומות. תרגילים 22 כיתבו שתי מחלקות. הראשונה, המחלקה 615% מייצגת דיסק מחשב, ומכילה משתנה מסוג %חו המתאר את כמות הדיסק הפנוי. משתנה נוסף מתאר את קיבולת האחסון של הדיסק. המחלקה השנייה, 8/6, אשר מוגדרת כמחלקה חברה של 615%, ומייצגת קובצ על הדיסק. פונקציית הבנייה של 8!6 תקבל כפרמטר את גודל הקוב, ומצביע אל הדיסק, ותעדכן במחלקת הדיסק הרלוונטי את נפח הדיסק הפנוי, בהתאם לגודל הקוב. ++6 בקלות התוכנית הבאה מראה את היתרון בפונקציות חברות, המוגדרות כ- 0חסוז1, על פונקציות המוגדרות במחלקה. נתונה המחלקה הבאת: 16%קתסס 01858 ו :טס (0=ת801ת1 51086 ,2681=0 1108%)א16%קתסס [ ;ץע8ת1ס8ת+=ת1 ;206-2681 ) (0ס 00001686 628802=)0025%ק0 16%86קתסס [;158םת%* תעטספע ;ת60.1=ת1 ;6=0.26ע2 + ; (10סט)6ת1עס 1סע :טס ;ת6,1ת 1108% השתמש בהגדרות 61600 כדי לאפשר את הפונקציונליות הבאה: (10סט) מ1את 18ס ז 5=3 51086 %2, (6)1,2 א16%קתסס 6 5111 6=++0 ; 6 5111 >=6+ 1 ; ; ()6מ1עס.0 ; () 6>ם1עס. 16גופ 6 ו הוסף לתוכנית הקודמת פונקציה חברה המאפשרת הדפסת המספר המרוכב לתוך 00 על ידי העמסת האופרטור >>. לשם כך, יש להוסיף פונקציה כזו: ;(0 000016%8 ,0 6ת628602>>)05%268ק0 056268[(6ס כעת ניתן להדפיס את המספר על ידי הפקודה הצו: 2 >> " 18 א16%קתסס" >> סגוסס בנוסף, בטל את הפונקציה זחוזס. לתוכנית 81.659;דנוינו שבגוף הפרק, העוסקת במחלקות א>ססס ו-חהחפזטוו, יש להוסיף טיפול בהשאלת ספרים. צריך ליצור מחלקה בשס חשוה|אסספ היורשת מהמחלקה 000% ומוסיפה את שם שואל הספר. הגדר במחלקה ההחפזטו! את הפונקציה 00%ם שסזזספ לשאילת ספרים, ואת הפונקציה %ססם חזוש6ז להחזרת ספרים. הגדר פונקציות אלו כחברות במחלקה 00%פ אוסזזסט, כדי שאפשר יהיה לגשת למשתנה המכיל את שס שואל הספר. פרק 28: אלמנטים פרטיים ואלמנטים חברים 293 הצניור ניונקציה במקריס רבים, כאשר מפתחים פונקציות בתוכנית, רואיס ששתי פונקציות מבצעות אותה משימה ומתקיים בהן אותו תהליך, והשוני היחיד הוא בטיפוסי המשתניס בהם הפונקציות מטפלות. בפרקיס הקודמיס למדנו שניתן להעמיס פונקציות וכך להשתמש באותו שם, ולהעביר להן פרמטריס מטיפוסים שונים. אולס, כאשר טיפוס הערך המוחזר שונה, אין מנוס מלהגדיר שתי פונקציות בעלות שמות ייחודיים. נניח שקיימת פונקציה בשס א8ח המחזירה את הערך הגבוה שבין שני ערכים מטיפוס 6חו. אם נצטרך להגדיר פונקציה המבצעת את אותה משימה על ערכים מטיפוס ₪086, נגדיר את אותה התבנית של הפונקציה, אך השס שלה יהיה א8ח1, למשל. בפרק זה נלמד כיצד להשתמש בתבניות (3%65!קו6ד) בשפת ++6, כדי להגדיר בצורה מהירה פונקציות המחצירות ערכים מטיפוסים שונים. בהמשך הפרק נדון בנושאים הבאים : > תבניות (8%65!קח6ד) מגדירות קבוצת משפטים שהתוכנית יכולה ליצור מהס פונקציות שונות. > תוכניות משתמשות לעיתיס קרובות בתבניות פונקציה להגדרה מהירה של שתי פונקציות או יותר, אשר מנצלות בדרך כלל את אותה קבוצת משפטים. עם ואת יש להן פרמטרים שוניס או ערכי החזרה מטיפוסים שונים. > לאחר שהתוכנית מגדירה תבנית פונקציה, היא יכולה אחר כך ליצור פונקציה על ידי שימוש בתבנית להגדרת אב טיפוס שיכלול את שס התבנית ואת ערך ההחזר של הפונקציה ואת סוגי הפרמטרים. > במהלך ההידור של התוכנית, המהדר ייצור בתוכנית את הפונקציות, על פי אבות הטיפוס שמיוחסים לשס התבנית. התחביר להגדרת התבנית של פונקציה תבנית עלול להיראות, במבט ראשון, מורכב וקשה להבנה. שימוש בתבניות אחדות, ישנה את ההתרשמות הזו במהירות. 4 ++6 בקלות הגדרה של תבנית פונקציה פשוטה הגדרת תבנית פונקציה (3+6!וח6+ חסושסחטת) היא הגדרה נטולת טיפוסי משתנים הקשוריס אליה - בשלב מתקדס בתוכנית ייקבעו הטיפוסים לפי הצורך. למשל, ההגדרה הבאה היא הגדרת תבנית לפונקציה אאוח, המחזירה את הערך הגבוה שבין שני הערכים המועבריס אליה: (ע 71 ,8 7)אהת 71 <71 18%66>01885קת56 | (עם < 8) +1 ; (8) ם2גו26%6 6 ; (ס) ם8גו26% האות ד מציינת טיפוס תבנית כללי (16ז8ח66). בשלב ההידור, המהדר ממיר את האות ד שבתבנית הפונקציה בטיפוסי הנתוניס הדרושיס לכל אחת מהפונקציות המוגדרות. בדוגמה הבאה נראה את היישוס ₪08 לתבנית הפונקציה אח, על ידי המרה של טיפוס המשתנים. ;(1108% , 108%+)אהת 1108% ------- ו (ס 71 ,8 7)אהת 7 <71 18%6>01855קת66 | (עם < 8) +1 ; (8) םשגו6%6ת 16 ; (ס) םשגו26%6 ו בתוכנית הבאה קק6.קאפד אגא מתואר השימוש בתבנית אאח להגדרת פונקציות מטיפוס 080ו1 ו-%חן. שיק 6 ! תוכנית זו פועלת בגירסה 5 ומעלה של ++6 |אטפו\ או בגירסה 1 ++6 6חפוזסם ומעלה בלבד. <ת.ת108%2608> 866ט610םת1+ (ע 71 ,8 7)אהת 7 <71 18%66>01885קת56 ן (ת < 8) +1 ; (8) ם8גו26% 6 ; (ס) ם8גו26% פרק 29: תבניות פונקציה 295 (16סט) מ1את ה1ס7 ן " 18 200 6ם8 100 01 גותבאהת 6ם7" >> סגוסס ;01ת6 >> (200 ,100)א8ת >> " 18 1.2345 בםת8 5.4321 +0 תטתנאהת 6ם7" >> סגסס 12 >> (1.2345 ,5.4321)אהת >> השימוש בתבנית הפונקציה בתוכניות מורכבות יש צורך להגדיר פונקציות דומות המבצעות אותן המשימות, אך משתמשות בטיפוסי ערכיס שוניס. תבנית הפונקציה מאפשרת להגדיר פונקציה כללית (6760ח06) או ללא טיפוסי ערכיס. כאשר התוכנית צריכה להשתמש בפונקציה מטיפוס מסוים, כמו %חו או 808%, כותבים את הצהרת הפונקציה ובה מצייניס את שס תבנית הפונקציה. המהדר ממיר את טיפוסי הנתוניס ויוצר פונקציות כנדרש. על ידי שימוש בתבנית הפונקציה חוסכיס את ההידור החוזר של פונקציות מצד אחד, ומצד שני ניתן להשתמש באותו שס של פונקציה המבצעת את אותן הפעולות. כאשר טיפוס הערך המוחזר וטיפוסי הפרמטרים שוניס. תבניות המטפלות במספר טיפוסים הגדרת תבנית הפונקציה א8ּוח הקודמת מתאימה לשימוש בפרמטר מטיפוס מטיפוס ך (0606110) בלבד. במקריס רביס צריך לציין מספר טיפוסיס שוניס. לדוגמה, בהמשך נגדיר תבנית לפונקציה עְא8זוה שוסח5, שתפקידה להציג על המסך תוכן של איברי מערך. בתבנית משתמשים באות ד לציון טיפוס המערך, ובאותיות 1ד לציון הטיפוס של 6% (מספר האיברים, במקרה זה). (סתטסס 71 ,7ץ8228* 7)7ץ8228 חסם8 בנגסט <71 71,01858 60001866>01855 ן ;אסת1 71 (++-006%ת1 ;%מט0סס > א06ם1 = 006%ם1) 08ס+ ;0 ;' ' >> [א66םת1] ץ8228 >> סגוסס 0006 >> 2 ו אפשר, אך אין זו חובה, להגדיר בתוכנית את התבניות של הפונקציות שמתאימות לטיפוסי הפונקציות הדרושיס. 6 ++6 בקלות הערה ייתכן והגדרות הפונקציות ייצרו שגיאות בעת הידור עם ++6 |1508/. 07 ; (%ם1 ,* 6ת1)ץ8228 טסם8 ב1סע ; (60ת10פםטט ,* 7)5108%6ץ8228 טסם5 ב1סעט בתוכנית <ק6.אפז ש5₪0 מתואר השימוש בתבניות פונקציה ליצירת פונקציות המציגות על המסך מערכים מטיפוס שחו ו- +8ס!8. שיק 6 !| תוכנית זו פועלת בגירסה 5 ומעלה של ++6 |8טפו/\ או בגירסה 1 ++6 6ח8!ז80 ומעלה בלבד. <ת.ת108%2608> 866ט610םת1+ (סתטסס 711 ,ץ8228* 7) צ8228 חסם8 6נ1נסט <71 17,01888 1866>018558קת66 ו ;אסבת1 71 (++-א068ת1 ;%תטסס > 08%ת1 ;0 = א06ם1) 102 ;' ' >> [א06םת1]ץ8228 >> סגוסס ;01ת6 >> 0006 ; (%ם1 ,* 6ת1)ץ8228 טסם8 ב1סע ; (60ת10פםט ,* 7)5108%6ץ8228 טסם8 ב1סע (ס1סט) מ1את 1סע | ;ן 500 ,400 ,300 ,200 ,100 + = []8665ק 6ם1 ;ן 30.15% ,20.101 ,10.05 + = []1065ע2ק 11086 ; (5 ,08068) 8258 חסםפ5 ;(3 ,210068ק)7ץ8228 חסם5 תבניות וטיפוסים מרובים ככל שתבניות פונקציה (0|8%65ו6₪+ חסחסחט=) הולכות ונעשות מורכבות יותר, הן מסוגלות לתמוך בטיפוסיס מרוביס. למשל, ניתן ליצור תבנית של פונקציה +50 זוה למיון האיבריס של מערך נתון. במקרה זה, עשויה הפונקציה להשתמש בשני פרמטרים, האחד יציין את שם המערך והשני - את מספר האיבריס הכלולים בו. אס נצא מנקודת הנחה שבמערך יהיו לא יותר מ- 32,767 ערכים, אצי נוכל להשתמש בטיפוס 6חו עבור הפרמטר של גודל המערך. פרק 29: תבניות פונקציה 297 עם זאת, תבנית כוללנית יותר תאפשר לתוכנית להגדיר בעצמה את טיפוס הפרמטר, כפי שנראה להלן: [ ] 56 67 6 הפה שגפש 781% ₪158 10 1365661555 ה (%5מ06ת616 71 // 5:8 ו השימוש בתבנית 507% שְפזזה8 מאפשר למשל ליצור פונקציה, שתמיין מערך קטן מטיפוס 808% (שבו פחות מ- 128 איברים), וגם מערך גדול מאוד מטיפוס >חו, על ידי שימוש באב-טיפוס שונה בכל אחד מהמקרים: 6 1 8 5% | סצפש 1609 קש ) סו 7 | ופ סיכום בפרק וה הראינו שהשימוש בתבניות פונקציה מקל על עבודת התכנות. מהדר שפת ++6 יוצר את משפטי הפונקציות הדרושות על פי התבנית, כאשר השוני ביניהן מתבטא בטיפוסי הפרמטריס ובטיפוס הערך המותזר. לפני שנמשיך, נבחן אס מובניס הנושאים הבאים : * תבנית פונקציה היא הגדרה של פונקציה בעלת טיפוסי נתוניס כלליים. / כאשר צריכים להשתמש בפונקציה עס טיפוסי נתונים מסוימים, מגדיריס בתוכנית תבנית של פונקציה, הכוללת את טיפוסי הנתוניס האלה. * מהדר שפת ++6 ממיר את הטיפוסים הכלליים שבתבנית הפונקציה לפי משפטי הפונקציה שנמצאים בתוכנית, או לפי הקריאה לפונקציה. * התוכנית צריכה ליצור תבנית עבור פונקציות נפוצות שפועלות עם טיפוסי נתוניס שוניס. במיליס אחרות, אם דרושה לך פונקציה עם טיפוס נתונים אחד, אינך צריך לבנות תבנית. / כאשר הפונקציה וקוקה ליותר מטיפוס נתוניס אחד, התבנית מקצה לכל טיפוס מציין יחודי, כמו ז, 11, 2ז. במהלך ההידור, מהדר ++6 מקצה לתבנית הפונקציה את הטיפוסים הנכוניס שכתבת. בפרק 30 נלמד להשתמש בתבניות מחלקה, כדי ליצור מחלקות חסרות טיפוס (1706!655), או מחלקות כלליות (6110ח06). 8 ++6 בקלות תרגילים שיק שו לפתרון תרגילים אלה השתמשו בגירסה 5 ומעלה של ++6 |08פו/ או בגירסה 3.1 ++6 0ח8!זספ ומעלה בלבד. 1 כיתבו תבנית פונקציה (866!קח8+ חסטסחט=) המבצעת החלפה (סאַאו5) בין שני ערכים. הכריזו על 6/065סלסוק של הפונקציה עבור הטיפוסיס ₪086 ו-)חו. בידקו את תבנית הפונקציה בעזרת פונקציה חו8ח מתאימה. 2 כיתבו תבנית פונקציה המאתחלת את חִ86ַח8! האיברים הראשוניס של מערך מטיפוס ד על פי ערך התחלתי מטיפוס ד. כיתבו תבנית פונקציה המדפיסה למסך את ח%פַח6! האיבריס הראשוניס של מערך מטיפוס ד. בידקו את התוכנית. 3 כיתבו שנית את תרגיל 2, אך הפעס אינדקס המערך הוא מטיפוס כללי 6 (נומרי). 4. כיתבו תבנית פונקציה הממיינת את %ַ0%ח6! האיבריס הראשונים של מערך מטיפוס ד בשיטת מיון בועות. כיתבו תבנית פונקציה המדפיסה למסך את 0%%ח6! האיבריס הראשוניס של מערך מטיפוס . השתמשו בפונקציות אלו כדי למיין מערך של 10 מספרים שלמים. פרק 29: תבניות פונקציה 299 החבניות הלקה בפרק 29 למדנו כיצד להשתמש בתבניות פונקציה להגדרת פונקציות כלליות נטולות ציון מפורש של טיפוסי נתוניס המופעלים בהן. כשס שמגדירים פונקציות כלליות להתאמה עתידית לטיפוסי נתוניס שונים, כך גס יש צורך לעיתיםס להגדיר מחלקות כלליות. בשפת ++6 ניתן להגדיר תבניות מחלקה (65+61213%+ 61355). בהמשך הפרק נדון בנושאים הבאים : % % כמו ניתן ליצור תבניות מחלקה (8%0!קוח%6 01855) על ידי שימוש במילה השמורה 6 הח ובסמלי טיפוס כלליים (610ח06), כמו למשל ד, 1ד ו- 2ד. בהגדרת תבנית המחלקה נוכל להשתמש בטיפוסים כלליים אלה, כדי לציין את הערכים של איברי המחלקה, את הערכים המותזרים על ידי פונקציות המחלקה, את הטיפוסים של ערכי הפרמטרים ועוד. ניתן ליצור עצס מחלקה 00660 01855) באמצעות תבנית מחלקה, על ידי כתיבת שס המחלקה ואחריה הטיפוסים שהמהדר יקצה לכל אחד מסמלי הטיפוסיס הכלליים (יש לכתוב זאת בין סוגרייס זוויתיים, כך למשל: <₪08% ,%חו>), ולבסוף יש לכתוב את שס המשתנה. כאשר המחלקה מספקת פונקציית בנייה כדי לאתחל את ערכי משתני המחלקה, ניתן לקרוא לפונקציית הבנייה כאשר יוצריס עצס בעזרת התבנית. כך נעשה זאת, לדוגמה : ;(65)200ט|89/ <1,8|08%חו>6רחהח. 6|855. כאשר המהדר מגלה בתוכנית הצהרה על עצס כזה, הוא יוצר מחלקה על פי התבנית ומשתמש בטיפוסים האקטואליים. בתבניות פונקציה ניווכח לדעת שאין השימוש בהן מסובך כפי שנראה במבט ראשון וזאת לאחר תרגול עס מספר תבניות מחלקה. 1000 ++6 בקלות הגדרה של תבנית מחלקה נגדיר מחלקה הכוללת את הפונקציות הדרושות לחישוב הסכוס והממוצע של הערכיס המאוחסנים באיברי מערך. במקרה זה המערך הוא מטיפוס 6ו. את המחלקה הזו אפשר להגדיר כך: ] ץ8ע82 01855 :טס ; (8126 %6ם7)1ץ8228 ; (10סט)תגו5 6ם0ס1 ; (10סט) 0גו781 8062806 6ת1 ; (ס1סט) ץצ8228 טסם8 16סע ; (6ת8106)1ט 8086 6ת1 : סספטנמס 2+ סם1 2 סמסם1 ;1668 6ם1 בתוכנית 699 צגאאא 1 מתואר השימוש במחלקה ש/א8זזג, עם ערכים מטיפוס +ח1: <ת.ת108%208> 010₪6ם1 <ם.8560110> 010₪6ם1 ] ץ8ע822 0185858 :טס ; (8126 %6ם1) 82287 ; (10סט)תגו5 6ם0ס1 ; (10סט) 0ו781 8062806 6ת1 ; (ס1סט) ץצ8228 טסם8 16סעט ; (6ת1) 78106 808086 6םת1 : ס6הטנעס %82* סםת1 2 סם1 ;068%סת1 %6ם1 (5126 6םת1) ץ82287::8228 | ;[8126]%ת1 טספם = 0868 (2תסא == 68%68) +1 ן ;601 >> "סְם1ת6 תהפפסעק-ץ2סתסת 6םת80111016ת1" >> 0625 ; (1) 61% ו פרק 30: תבניות מחלקה ‏ 301 22 7 = 82287::8126 7 = א00%ם82287::1 (ס1סט)תמפ::ץ8228 חם0ס1 ו ;7 = תגט5 8ם0ס1 (+1+4 ;א06ם1 > 1 ;0 = 1 6ם1) ש0ס+ ;[88%8]1 =+ תגטפ ; (תגופ5) ם12ו26% (10סט) 781006 7::8062806ץ8228 6ת1 ו 2 = תט5 8ם0ס1 (++1 ;06%ם1 > 1 0 = 1 %ם1) ש0ס+ ] 38%8 =+ תטפ ד ; (8668ם1 / תט5) ם5ט6%6ת (10סט)ץצ8228 חסם8::ץ8228 בנסט ָ (+1+4 ;א06ם1 > 1 ;0 = 1 6ם1) 108 ;' ' >> [0868]1 >> סוסס 0006 >> 601; (06ט81ט 6םת8106)1ט 7::806ץ8228 6ת1 ָ (8126 == א006%ם1) +1 1 18 ץְהעעת // ; (1-) מ2ו26% 1-6 | ;סגו1אט = [אפת1] 038%8 ; ++66%ת1 01 // ; (0) םמ2ו26% ++6 בקלות (ס1סט)ם1הת 16סט ו ץה8צעה8 %מ61606 100 // ; (100) פע6מתטםת 8-28 דל תד (++1 ;50 > 1 ;0 = 1) מ0+ ; (1) 8106 360. פשס6סתגות ; () ,8228 אסם5. פע6מחמתטות " 18 פע6סתטת 6םת6 0% תטפ 6ם7" >> סגוסס ;61ת6 >> ()תטפ. פ625סחתגוםת >> " 15 06ו81ט 8062806 6ם71" >> סטסס 12 >> ()78106 28.8762806סמתגת >> התוכנית מתחילה בהקצאת 100 איברים של המערך. בהמשך מוסיפים למערך 50 איבריס על ידי שימוש בפונקציית המחלקה 8!06/\ 800. המשתנה א06חו במחלקה משמש חסס עליון לגודל המערך. אס המשתמש ירצה להוסיף למערך איבריס מעבר למוגדר במשתנה זה, הפונקציה 6ט|8/ 800 של המחלקה תתזיר הודעת שגיאה. המשתנה א06ח1 משמש בפונקציית המחלקה 6ט81צ 86196 לחישוב הממוצע של ערכי האיבריס במערך. בתוכנית משתמשים באופרטור ששח להקצאת זיכרון הדרוש לאחסון המערך. נדון באופרטור הזה בפרק 31. תבניות מחלקה ככל שתיצור יותר מחלקות, תמצא שמחלקה שהגדרת עבור תוכנית אחת (או עבור התוכנית שאתה עוסק בה כעת), מתאימה גם עבור תוכנית אחרת. לעיתים נמצא שהשוני היחיד בין מחלקות המשמשות בפעולות או בתוכניות שונות, הוא טיפוס איברי המחלקה. לדוגמה, מחלקה התומכת בפעולות על שלמים, לעומת מחלקה דומה התומכת בפעולות על מספריס בנקודה צפה. תבניות מחלקה קיימות, כדי שנוכל לצמצם את כמות התכנות (כלומר, עבודת תכנות, ניפוי ותחזוקה) ולעשות שימוש חוזר בקוד של מחלקות קיימות - על ידי הגדרה מחודשת של מחלקות קיימות. השיטה היא להגדיר תבנית של מחלקה ללא טיפוס (מטיפוס כללי), אשר באמצעותה ניתן יהיה ליצור בעתיד עצמי מחלקה מטיפוסים שוניס רצוייס. כאשר המהדר מוהה הצהרת עצס המבוססת על תבנית מחלקה, הוא בונה מחלקה חדשה, שבה כל טיפוס כללי מוחלף בטיפוס המתאים לו על פי ההגדרה החדשה. האפשרות ליצור במהירות ובפשטות מחלקות שונות הנבדלות זו מזו בטיפוס בלבד, מפחיתה מאוד את כמות הקוד שצריך לכתוב, ותרומתה הגדולה הינה חיסכון זמן וכסף. פרק 30: תבניות מחלקה 303 נניח שבתוכנית זו צריך לטפל במערכיס מטיפוס 6חו ומטיפוס 08ו8. דרך אחת לתמיכה בשתי הטיפוסיס היא להגדיר שתי מחלקות שונות, שכל אחת מהן מטפלת בטיפוס מערך אחר. לעומת זאת, הגדרת תבנית מחלקה (%6₪1013%6 61355) מונעת כפילות בהגדרת המחלקות. להלן הגדרת תבנית המחלקה עאזזה - ווהי תבנית מחלקה כללית. <71 01858 ,7 668018%66>018585 ] צץ8ע82 0185858 :טס ; (8126 %6ם1) 82287 יח ; (0106ט) תגופ יח ; (010ט) 81116 80762806 ; (ס1סט) ץצ8228 טסם8 16סט ; (1) 6ו781 808086 6ת1 : 66הטנ1עס 2 ץ 7 סת1 ;1% 6ת1 ;ן בתבנית מוגדרים שני טיפוסי משתניס כלליים: ד ו-11. במקרה של מערך מטיפוס זחו, נגדיר את ד מטיפוס +חו ואת 1ד מטיפוס פַחס!. במקרה של מערך מטיפוס 808%, נגדיר את שני המשתניס ד ו-11 מטיפוס 8608%. מייד לאחר כל הגדרת פונקציה במחלקה, יש לציין | את הטיפוסים | הכלליים | המתאימיס | לפונקציה | לפי הדוגמה 6 1<::8/67806ד ,ך> עְפּזזה. להלן הגדרת פונקציית המחלקה 6[ 6סַפזס8, לפי כללי ההגדרה של תבנית מחלקה. <1?" 01858 ,7 018%66>018585ת66 (6)07010ט81ט 71<::8062806 ,7>1ץ8228 7 \ ;0 = תט5 71 יר (++14 ;068םת1 > 1 ;0 = 1) ש0ס+ ; [1] 08%8 =+ תטפ ; (068ת1 / מט5)מעגוססץ ] לאחר הגדרת התבנית יוצריס את המחלקות של הטיפוסיס הדרושיסם. עושיס זאת על ידי משפט הכולל את שם המחלקה של התבנית וציון טיפוסי הנתוניס בין סימני ייקטן מ..." ו-יגדול מ...", כמו בדוגמה הבאה: שם התבנית | ; (100) פעס6סמתטםת | <6ם10 ,%6ת287>1ע82 טיפוסי התבנית ;(200) 781068 <1108% ,82287>1108% עכשיו נראה כיצד התוכנית 699.+4554א65 משתמשת בתבנית המחלקה עאזוה. 4 ++6 בקלות שיק 6 ! תוכנית זו פועלת בגירסה 5 ומעלה של ++6 |8טפו/\ או בגירסה 1 ++6 6ח8!ז80 ומעלה בלבד. <ת.ת108%208> 010₪6ם1 <ם.8560110> 01066ם1 <711 01888 ,71 1866>01858קת60ם ] ץ8עע8 018558 :טס ; (8126 6ם1) 82287 ; (10סט) תג5 71 ; (010ט) 0ו781 8062806 ך ; (10סט) ץצ8228 טסם8 16סע ; (1) 06ו781 808086 6ת1 : סספטנמס 2+ ץ 7 סמסת1 ;668%ת1 %6ם1 ל <71 01858 ,7 018%66>018585ת66 (8126 %ם7)1ץ71<::8228 ,7>7ץ8228 ָ ;[1]8126 חסם = 0868 (2תסא == 68%68) +1 ן >> "6םת61ת6 תהעססע2ק-ץעסתסת 5ת11016+ט5ת1" >> שעסס ; 61ם6 ; (1) 6%1% ] 7 = 82287::8126 7 = א006%ם82287::1 <71 01858 ,7 668018%66>018585 (10סט)תט71<::80 ,7>1ץ3228 1ך ן 2 = תט5 71 (+1+4 ;א06ם1 > 1 ;0 = 1 %ם1) 0+ ;[68%8]1 =+ תגופ ; (תגופ5) ם12ו26% ו פרק 30: תבניות מחלקה 305 206 <71 01858 ,7 668018%66>01855 (6)07010ט81ט 71<::8062806 ,7>1ץ8228 7 ָ 2 = תט5 71 (+1+4 ;א06ם1 > 1 ;0 = 1 %6ם1) ש0ס+ ;[868%8]1 =+ תטפ ; (068ם1 / מט5)ם660%5? <1?" 01858 ,7 668018%66>01855 (10סט) ץ8228 חסם71<::8 ,7>1ץ8228 בנסעט ָ (++1 ;00%ם1 > 1 ;0 = 1 %ם1) 05ס+ ;' ' >> [0868]1 >> סגוסס 000% >> 601; <71 01858 ,7 018%66>018585ת66 (8106ט 8106)7ט 71<::806 ,7>1ץ8228 6םת1 ז (8126 == א006%ם1) 1% 1 18 ץצהפעת // ; (1-) משגו26% 16 ;16 = [א66%ת1] 0868 ; ++06%ת1 1 // ; (0) םשגו266 (ס1סט) תנאת ה1סט \ ץ8עת8 %ת6ת616 100 // ; (100) פ62מתוםת <6ם10 ,%6ת7>1ץ28ע82 ץ8ע82 %ת6ת616 200 // ; (200) 81068 <5108% ,7>1108%ץ8228 16 12 (++1 ;50 > 1 ;0 = 1) מ10 ; (1) 81106 380. 25 6סתגום ++6 בקלות ; () ,8218 אסם5. פמ6מחמתטת " 18 פעססתטת 6םת6 01 תטפ5 6ם7" >> 6טסס ;01ת6 >> ()תטפ.פל6סמחגטת >> " 18 6גו81ט 80762806 6ם7" >> סטסס ;6061 >> ()8106ט 62806ע628.8סתגות >> (++1 ;100 >0- 1 ;0 = 1) מ0ס+ ;(100.0 * 106)1א8ט 65.800מ81ט ; () ץ8228 אסם81065.5ט " 18 פעססתטת 6םת6 01 תטפ5 6ם7" >> 6ט0סס 012 >> ()תטפ65.5ט81ט >> " 18 6גו81ט 80762806 6ם7" >> סטסס 12 >> ()8106ט 81065.80702806 >> ו הדרך הטובה ביותר להבנת השימוש בתבנית מחלקה היא ליצור שני עותקים של התוכנית הקודמת, כאשר בקובץ המקור הראשון יש להחליף את ד ו-1ד ב-זחו וב-פַחסו בהתאמה. בקובץ המקור השני יש להחליף גם את ד וגם את 1ד ב-ז08!. הצהרה על עצמים בעזרת תבניות מחלקה כדי ליצור עצמיס באמצעות תבניות מחלקה, צריך לציין את שס תבנית המחלקה ולאחריה, בתוך סוגריים זוויתיים, את הטיפוסים האקטואליים המחליפים את הטיפוסיס הכלליים ד, 1ד, 2ד, וכוי. לאחר מכן יש לציין את שס העצס (המשתנה) ואת ערכי הפרמטרים שיועברו לפונקציית הבנייה של המחלקה, כפי שנראה להלן: סשתהת 007606 <62סץ6 ,1ַסִסִטְ6>סתאת 01855 01866ת60 ; (828(66622ס ,1עסססִתַ828כ) כאשר המהדר יפגוש בהצהרה כזו בתוכנית, הוא יצור מחלקה המבוססת על הטיפוסים המפורטים בהצהרה. במשפט הבא מודגם שימוש בתבנית המחלקה שאּזזה ליצירת מערך מטיפוס ז8ח6, המאחסן 100 איברים : ; (100) פע6מתות 50811 <6ת1 ,82ם82287>0 פרק 30: תבניות מחלקה 307 בניית רשימה מקושרת באמצעות פ5ס6זּבּ|כווסד יצירת טיפוס כללי נפוצה ביצירה של מבני נתוניס המחזיקיסם סוגיס שוניס של נתוניס באובייקטיס שוניס. בתוכנית הבאה נבנה טיפוס כללי של רשימה מקושרת, המאפשר להחזיק אובייקטים מסוגים שוניס. נחזיק שתי רשימות מקושרות כל אחת עבור טיפוס שונה של אובייקטים. עבור טיפוס חדש של אובייקטיס תיווצר רשימה נוספת ולכן קוב ה- 6א6 יגדל. יצירת טיפוס כללי של רשימה מקושרת באמצעות פולימורפיוס תיצור קוב 6%6 קטן יותר, אך תרוצ לאט יותר בגלל הקישור המאוחר. דוגמה: 2ק5%.6!!כוח+ הערתה : התוכנית נבדקה והורצה ב- 6.0 ++6 /609/. <ת.ת108%208> 6100₪6ם1 <ת.06ם5%21> 01066ם1 עססמתטם 0185858 : 66הטנ1עס 2 11086 :טס ;6אסת* מ6סמתטםת [ ;1+ = 5 ;תתסא = שאסם +(51 108%6+) פספמתגום (0100% טסת* עס6מתטת) 800 בנ1סע \ %2 שסתם = סאפת ] [ ;" -" >> 1 >>" > 2" >> סטסס +()חסםפ ב1סצ ;ן | ס0ם1ע86 01885 ָ : 66הטנ1עס ;[5]100 שַהַתס :טס 2 *+* סַם1ע562 (8%2* 8%ם0 86ם00) סַם5621 | 2 = סאס6ת ;(ע55 ,7)5ץ56200 8 ++6 בקלות (100%ע טסםת* ‏ סַת1ע800)5%6 בנסעט ןָ %2 חופת = סאסת ו [ ;" -" >> 58 >> " = 5" >> סטסס +()חסםפ8 ב1נסע 0 66001866 >01858 ?1< 018858558 % ,/ : סספטנמס ;+ ץ 1 :טס (010צ)115% ;טא 6 2 = 6811 1 ; (01008 טסם* 800)7 6נסט ; () פת1עס %נ1סט ;ו <1? 01858> 66801866 (01008 חטסם* 11586>7<::800)7 בנ1סט ָ (12סא == 686ם) +1 0% חשאסם = 680ם 06| ; (0100% ש6ם)800<-6811 % חשסתם = ₪811 <1? 01858> 66801866 ()6ם1עס::<115%6>1 ב1בסט ָ ;קת6ף* 7 (%א6ת<-קת> = קתחס ;2תסא =! סתף ;680ם = סתס) 102 ; () שסם5<-סת> פרק 30: תבניות מחלקה 309 (ס1סט)ת1נאת ה1סט \ ;קם* פ6מתגת ;ספ* 0ם5621 2 מססתטם <ע62מתטת> 1186 2 חש6ִת1ע80 < סַת1ע86> 11586 ; [6]100ע2סש מַהַם0ס ;ם1 1086: ;"ם\:העסח 8 0ם8 עס6קתטם 11086 8 מס6סםתםת" >> סטסס (++3 ק3י> 1 207= 31 %ת )1‏ ס= ָ 7 << ם1+ << ם01 ; (ם5) עסמתום שסם = סת ; (026א) סַם1ע8% שסם = ס5 ; (קם)115%6.800 ע6מתטת ; (ק11585%.860)5 סַם1ע56 ] ; () %מ21ק. 118% מ6מתטת ;1 >> סגוסס ; () 6ת1עק.118% חם5601 סיכום בפרק זה למדנו שהשימוש בתבנית מחלקה מונע כפילויות בהגדרת מחלקות דומות המטפלות בטיפוסי נתוניס שוניס. במבט ראשון, הגדרת תבנית מחלקה עלולה להיראות כעבודה מסובכת, בגלל המורכבות הקשורה בהגדרת המחלקה עצמה. לכן, הדרך הטובה להגדרת תבנית מחלקה היא להתחיל בהגדרה רגילה של המחלקה לטיפול בטיפוס נתון אחד. בהמשך חוזריס על הקוד המוגדר ומחליפים בו את טיפוסי הנתוניס בטיפוסיס כלליים כגון: ד, 1ד, 2ד. לפני שנעבור לפרק הבא נבדוק אס מובניס לנו הנושאיס הבאים: / שימוש בתבנית מחלקה מונע כפילויות בהגדרת מחלקות דומות המטפלות בטיפוסי נתוניס שוניס. * כותרת ההגדרה של תבנית מחלקה כוללת את המילה השמורה 866!מוח6ז ואת טיפוסי הנתון הכללייס המתוארים על ידי האותיות ד, 1ד, 2ד וכוי. / כל פונקציה הכלולה בהגדרת תבנית המחלקה, כוללת את משפט 0|8%66ח6+ של כותרת המחלקה. בנוסף, יש לצייו את טיפוסי הנתון הכלליים בין סוגרייס מחודדים (< >). בין שס הפונקציה לבין הצהרת התבנית יש להציב את אופרטור טווח ההכרה לפי הדוגמח: סתהת מתסנגססםט1,71<::1>סַתת 01858 0 ++6 בקלות * כדי ליצור מחלקה באמצעות תבנית, יש לציין את שם המחלקה ואחריו את טיפוסי הנתוניס הדרושים, אשר רשומים בין סוגריים מחודדים, לפי הדוגמח: 5% <68ת10 ,6ת1> סתהת 01858 תרגילים שיפ שךץן לפתרון תרגילים אלה השתמשו בגירסה 5 ומעלה של ++6 |508ו/ או בגירסה 3.1 ++6 0ח807!3 ומעלה בלבד. 1 כיתבו תבנית מחלקה (1806קוח6+ 6[255) לטיפול בווקטורים בעלי אורך קבוע. על התוכנית לבצע מספר פעולות בשיטה של העמסת האופרטור []: חיבור וחיסור של וקטוריס, הקצאת ערכים לווקטורים וגישה לאיברי הווקטור. 2 כיתבו תבנית מחלקה לניהול רשימות מקושרות של איבריס כללים. יש לספק שירותי הוספת איבר לרשימה, מחיקת איבר לפי מספרו הסידורי (דוגמה: מחק את איבר 3 מהרשימה), הדפסת כל האיברים למסך, וגם מחיקה של כל הרשימה. 3 הפוך את תבנית המחלקה שבתרגיל 2 לניהול רשומות מקושרות, לתבנית המחזיקה סוגיס שוניס של אובייקטים. הגדר תבנית מחלקה לניהול רשימה מקושרת ובדוק כיצד היא פועלת על אובייקטיס שוניס. 4 כיתבו את תבנית המחלקה הבאה, המנהלת עצ בינארי ממוין. <1 01885> 66001866 6 0188585 ז :טס ; (10סט) 6266 ; () 25260 ; (0 806)7 %נ1נסט ; (ס1סט)פת1עס ב1סטע : 66הטנ1עס 2 ל<200>7 2 %<206>7 ;156 זָ הע\ ממוין באופן הבא: כל ענף בעצ מכיל מצביעים לענפיס משמאלו ומימינו. איבריס משמאל לענף בהכרח קטניס מהאיבר, בעוד שאיברים מימין לו, גדולים או שוויס לו. הפונקציה %חוזק תדפיס את כל ערכי העץ בצורה ממוינת על ידי סריקה רקורסיבית של העצ מימין לשמאל. פרק 30: תבניות מחלקה ‏ 311 חלק 6 נועואינו רזל דנליבו ב" ++6 עד כה הצגנו את ++6 ונושאיס בתכנות מונחה-עצמים, אותס צריך להכיר כדי לכתוב תוכניות בעלות עוצמה. בחלק זה, המסייס את הספר, נרחיב את הידע בשפת ++6 ונראה כיצד אפשר להקצות זיכרון במהלך הרצת התוכנית. נלמד גס על פעולות קלט/פלט בקבציםס. למרות שהפרקיס בהמשך נחשבים נושאיס מתקדמים בשפת ++6, הקושי בהבנתס לא עולה על רמת הקושי שהצגנו בפרקיס הקודמיס בספר (מלבד 3 הפרקיס האחרונים). חלק זה כולל את הפרקים הבאים: פרק 31 - מאגר הזיכרון החופשי פרק 32 - פעולות במאגר הזיכרון החופשי פרק 33 - ניצול מירבי של חו6 ו- +60 פרק 34 - פעולות קלט/פלט בקבציס פרק 35 - פונקציות משולבות וקוד אסמבלי בתוכנית פרק 36 - ארגומנטיס של שורת הפקודה פרק 37 - שימוש בקבועיס ובהוראות מאקרו ב ב צ צ צנ ם פרק 38 - פולימורפיוס 3 פרק 39 - ניצול מצביס חריגיס של ++6 לטיפול בשגיאות פרק 40 - ספריית תבניות סטנדרטיות .511 פרק 41 - יצירת פרויקט ב ב נש ם פרק 42 - הרצת תוכנית ב-++6 |808ו/\ 4 ++6 בקלות לאגר הזיכרון החונעוי כפי שלמדנו, כאשר מוגדר מערך בתוכנית, מהדר ++6 מקצה עבורו שטח בזיכרון בגודל המתאיס לאחסון הערכים של המערך. במשך הזמן גודל המערך המוגדר עלול להיות קטן לצורכי התוכנית המשתניס. למשל, נניח שבתוכנית מוגדר מערך המתאיס לאחסון 100 ציוני תלמידים. אם במשך חיי התוכנית צריך לאחסן מספר גדול יותר של ציונים, נצטרך לשנות את התוכנית ולבצע הידור מחדש. דרך אלטרנטיבית היא לגרוס לכך שהתוכנית תקצה בעת ההרצה את המקוס הנוסף הדרוש בזיכרון המחשב. לצורך הקצאה דינמית של זיכרון יש לציין בתוכנית את גודל הזיכרון הדרוש. שפת ++6 מחזירה לתוכנית מצביע לויכרון שהוקצה עבור המערך. הזיכרון ששפת ++6 מקצה בצורה דינמית שייכת למאגר הזיכרון החופש? (5%076 66יות]). בהמשך הפרק נדון בנושאיס הבאיס: + האופרטור ש6ח משמש להקצאת זיכרון במהלך ריצת התוכנית. % השימוש באופרטור שפח מאפשר לתוכנית לציין באופן דינמי את כמות הזיכרון הנדרשת לה. > כאשר הקצאת הזיכרון מצליחה, האופרטור שו6ח מחזיר מצביע לתחילת מקטע הזיכרון שהוקצה. > אם פעולת ההקצאה נכשלה (לא קייס מספיק זיכרון, למשל), האופרטור שש6ח מחזיר מצביע וטא (ריק). > האופרטור 66166 משמש לשחרור זיכרון שהוקצה על ידי האופרטור צוסח. הקצאה ושחרור דינמי של ויכרון ממאגר הזיכרון החופשי היא תכונה בעלת עוצמה רבה. כפי שנלמד ונתרגל, הקצאת ויכרון קלה מאוד לביצוע, למעשה. פרק 31: מאגר הזיכרון החופשי 315 האופרטור שסו האופרטור ש6ח מאפשר לתוכנית להקצות זיכרון תוך כדי הרצה. כדי להקצות זיכרון על ידי האופרטור צופח, יש לציין את גודל הזיכרון הדרוש בבתים. הנה דוגמה למשפט של הקצאה דינמית של 50 בתים בזיכרון. בעזרת האופרטור צו6ח נעשה זאת כך : ; [0282]50 שטסשם = 56%+טס* םס כאשר האופרטור צש6ח מצליח במשימת הקצאת הציכרון, הוא מחזיר מצביע המורה על תחילת השטח שהוקצה. במקרה זה, מכיון שהתוכנית מקצה זיכרון לאחסנת מערך תוויס, היא מציבה את המצביע שקיבלה לתוך משתנה שמוגדר כמצביע אל טיפוס ז8ח6. כאשר האופרטור ושח אינו יכול להקצות את הזיכרון הדרוש, הוא מחזיר מצביע 011א, אשר מכיל את הערך 0. בכל פעס שהתוכנית מקצה זיכרון באופן דינמי באמצעות האופרטור אוסח, היא חייבת לבדוק את הערך המוחזר של וופח, כדי לוודא שאינו 1וטא. חשיבות ההקצאה הדינמית של זיכרון תוכניות רבות עושות שימוש נרחב במערכיס כדי לאחסן ערכיס רביס מאותו הטיפוס. כאשר מצהירים על מערך, נוהגיס בדרך כלל לקבוע את גודלו (מספר האיברים שיהיו כלולים בו). הבעיה היא בכך שלא תמיד יודעים מראש את המספר המקסימלי של איבריס בהס תצטרך התוכנית לטפל בזמן הריצה. וגם אס מספר זה ידוע מראש, אין זה תמיד יעיל להקצות מערך בעל גודל מקסימלי, כאשר לרוב דרוש רק חלק קטן ממנו. כאשר מתברר שהתוכנית וקוקה למערך גדול ממה שהוקצה לה בתחילה (למשל, יש מספר רב יותר של תלמידיס בקורס, או שמספר הפריטיס הלך וגדל במשך הזמן), צריך להגדיר בה מחדש את גודלי המערכים ולהדר אותה שוב. הקצאה דינמית של זיכרון עוקפת את המגבלות הללו וחוסכת את הטרחה לתקן את התוכנית ולהדר אותה שוב. ההקצאה מאפשרת לתוכנית לפעול בכל ריצה עס כמות הויכרון הדרושה לה בפועל, וכשזו אוזלת, להקצות באופן דינמי עוד זיכרוו באמצעות האופרטור צוסח. בתוכנית 9ק6.שפא 55ט מתואר השימוש באופרטור שפח. היא מבצעת הקצאה דינמית של ויכרון למערך בגודל 100 בתים. היא מגדירה מצביע בשם זסזחוססק לאותו קטע ציכרון. 6 ++6 בקלות <ת.ת108%2608> 61086ת1+ (16סט) מ1את ה1ס7 ן 2[ חשספת = עסס6ם1סק* ע8ם0 (12טסא =! עפסתנ1סס) +1 12 >> "8110080660 7ץ50006851011 צ2סתסא" >> סגוסס 16 ;601 >> "צץעסתסת 06ם811008%1 מספעם" >> ס6טס0ס במסגרת הקצאה דינמית של זיכרון, ייתכן שגודל הזיכרון הדרוש לא יהחיה זמין במאגר הזיכרון החופשי של המחשב. האופרטור ושפח לא יכול להקצות זיכרון וכתוצאה מכך הוא יציב את הערך 111)\ למצביע הספציפי. בתוכנית הקודמת מתבצעת בדיקת קיוס תנאי זה, כדי לקבוע אס הקצאת הזיכרון הושלמה בצורה תקינה. כאשר אופרטור שפח נכשל הוא מחזיר | וטא כאשר אין די וזיכרון במאגר הזיכרון החופשי, האופרטור שפח אינו יכול לבצע את משימתו. במקרה כזה, האופרטור מקצה למצביע את הערך 11וא. על ידי בדיקת ערך המצביע, כפי שמודגס בתוכנית הקודמת, ניתן לקבוע אס הדרישה להקצאת ציכרון אכן נענתה וכמות הויכרון הדרושה סופקה. המשפט הבא הוא דוגמה לשימוש באופרטור שפח להקצאת זיכרון למערך בעל 500 ערכיס מטיפוס ממשי: ;[500] 108% חאסם = צץ8ע822* 108%6+ כדי לקבוע אס הוקצה הזיכרון הנדרש, התוכנית משווה את ערך המצביע ל- 1וטא כפי שנראה להלן: (עעסא =! צ8עעה8) +15 > 11666 1 הכוה 6066555 6-6 שו 6/6 6 ; 61ת6 >> "צפסתסת 81100866 ססם 816 חסם" >> סגטסס בתוכנית הקודמת גודל הזיכרון להקצאה צוין בתוך התוכנית. בתוכנית הבאה, קסופו א5, גודל הזיכרון הדרוש ניתן על ידי המשתמש תוך כדי הרצת התוכנית - ראה להלן. פרק 31: מאגר הזיכרון החופשי 317 <ת.ת108%2608> 61086ת1+ (16סט) מ1את 1סע ן 2 סם1 22 *+ תס ;" :30000 סם קט ,8126 8228 6ם6 םת1 6סץ71" >> סגוסס 72 <<< ת01 (30000 => 8126) 1% ן ;[82]8126ם0 חסם = ע66ת1סק (12סא =! עססתנ1סס) 15 ;1 >> "811008660 צץ500068551011 צע2סתסא" >> סגוסס 16 ;1 >> "ץעסתסת 81100866 0סם 16סהםתט" >> סגוסס כאשר אין אפשרות להקצות את הזיכרון הדרוש, האופרטור ששח מציב את הערך למצביע הספציפי. בתוכנית 9ק6.צחסואפוזסא מתבצעת הקצאה חוזרת של זיכרון במנות של 10,000 בתים, עד לרגע שהזיכרון שבמאגר הזיכרון החופשי אוזל. כאשר ההקצאה מתבצעת בצורה תקינה, התוכנית מציגה הודעה מתאימה על המסך. ברגע שהזיכרון אוזל ולא ניתן לבצע הקצאת זיכרון, התוכנית מציגה הודעה מתאימה על מסך והרצת התוכנית מסתיימת. <ת.ת108%2608> 61086םת1+ (16סט) מ1את ה1סע ָ ;62תנ1סס* עַַַם0 + 00 ;[10000]ע8ת0 טסם = ע6סת1סס (ע2תטסא =! עפסתנ1סס) 15 2 >> "פססעץס 10,000 11008666ת" >> סגגוסס 16 ;01 >> "581160 מ811008610 צפסתסא" >> סטסס ; (22סא =! ע6סם1סק) 116םח [ 8 ++6 בקלות כאשר מריצים את התוכנית הקודמת בסביבת מערכת הפעלה 05כפ ניתן הערה לראות שהתוכנית תסתיים לאחר הקצאת זיכרון מעבר ל- 8א64. לפי 7 ברירת המחדל, רוב המהדרים בשפת ++6 בסביבת מערכת הפעלה 05 פועלים לפי מודל זיכרון קטן (|1006! ץץזסוחס!! וובּח5), שבו גודל מאגר הזיכרון החופשי הוא 64%5. בסביבת העבודה 05כ, שטח הזיכרון הרצוף הגדול ביותר שניתן לגשת אליו במסגרת התוכנית מוגבל ל- 64%5. יש אפשרות להגדיל את מאגר הזיכרון החופשי על ידי שינוי המודל במהדר. הסבר מפורט בעניין זה תמצא בספר "המדריך השלם לשפת 6" מאת רש-ליכטמן, בהוצאת הוד-עמי. מאגר הזיכרון החופשי, מה הוא? כל פעס שמריצים תוכנית, מהדר שפת ++6 שומר אזור בזיכרון המחשב הנקרא מאגר הזיכרון החופשי (6ז560 66ז=). באמצעות האופרטור צו6ח התוכנית מסוגלת להקצות זיכרון מתוך מאגר הזיכרון החופשי. על ידי ניצול של המאגר הזה, ניתן לשחרר את הגבלות התכנות הכרוכות בקביעת גודל המערך מראש. גודל מאגר הויכרון החופשי שונה בין מערכות מחשב לפי סביבת העבודה, מערכת ההפעלה ומודל הקצאת הציכרון של אותה מערכת מחשב. שחרור שטח זיכרון שאינו דרוש עוד האופרטור שפח מאפשר הקצאה דינמית של זיכרון ממאגר הזיכרון החופשי. כאשר הצורך בזיכרון המוקצה חולף, ניתן להשתמש באופרטור 6616%6 כדי לשחרר אותו. כדי לבצע את יש לציין את המצביע לויכרון המיועד לשחרור, לפי הדוגמה: 06160680 7 בתוכנית 5ק6.אפוא 5פפ מוצג השימוש באופרטור 06!6%66, המשחרר את הניכרון שהוקצה על ידי האופרטור צוסח: <ת.ת108%2608> 61086םת1+ <םת.6ם5621> 010₪6ם1+ (ס1סט) תנאת ה1סט \ 2] 082 חשם = ע66%ם1סס* ע8ם0 ; ("++6 צס 2650066" ,2ס6ת1סס) ץק5620 2 6>> עססת1סק >> סגוס0 0616060 7 פרק 31: מאגר הזיכרון החופשי 319 על פי ברירת המחדל, הזיכרון שהוקצה ואינו משוחרר במהלך התוכנית, משתחרר בצורה אוטומטית בסיוס התוכנית. כאשר משתמשים באופרטור 06!6%66 לשחרור הויכרון במהלך התוכנית, יהיה אפשר להקצות את הזיכרון החופשי הזה מייד למטרות אחרות. ההקצאה והשחרור של קטעי וזיכרון במהלך התוכנית, הופך אותן לפעולות דינמיות (שלא כמו הפעולות המוגדרות בעת הידור התוכנית, העוסקות בהגדרת משתניסם). דוגמה נוספת בתוכנית 06.88.6955 ווה מתבצעת הקצאת זיכרון המתאיס לאחסון מערך בגודל 1000 ערכים מטיפוס %חו. אחר כך מתבצעת השמה של הערכים 1 עד 1000 למערך זה. לבסוף, ערכיסם אלה מוצגיס על מסך. בשלב מתקדס יותר, התוכנית משחררת זיכרון של המערך הקודס ומקצה ויכרון למערך חדש בגודל 2000 בתים מטיפוס 808%. אחר כך מתבצעת השמה של הערכים 1.0 עד 2000.0 במערך זה. (16סט) מ1את 1סע ָ ;[1000]%ם1 חאסם = 7ץ8228 6םת1* 6ת1 ;ץהעעה 1086+* 11086 7 שת (12סא =! 8228 6ם1) 15 ן (++14 ;1000 > 1 ;0 = 1) עס+ 2 + 1 = [7]1ץ8228 6ת1 (++14 ;1000 > 1 ;0 = 1) עס+ ;' ' >> [7]1ץ8ע822 ס6ת1 >> סטסס ;ץ28עה 6ם1 061666 1 ;[2108%]2000 שסם = צץ8228 11086 (12סא =! ץ8228 51086) 15 ן (++1 ;2000 > 1 ;0 = 1) מ0ס+ 2 * (1 + 1) = [1]ץ8228 11086 (++1 ;2000 > 1 ;0 = 1) 108 ;' ' >> [7]1ץ8228 11086 >> 0006 ;ץה8תעה 51086 461666 ו 0 ++6 בקלות ככלל, התוכנית חייבת לשחרר זיכרון שאינו דרוש לה עוד. לצורך זה היא משתמשת באופרטור 06|6%6. סיכום בפרק וה למדנו כיצד להקצות ולשחרר זיכרון מתוך מאגר הזיכרון החופשי, באופן דינמי, במהלך ביצוע התוכנית. עושיס זאת על ידי האופרטוריס שפח ו- 08!6%6, אשר חוסכים את הצורך להדר תוכניות אשר וקוקות להקצאת זיכרון שונה מדי פעם. בפרק 32 נראה כיצד אפשר לנהל את מאגר הזיכרון החופשי ואת הקצאות הציכרון הנעשות מתוכו, ואת הפעולות שאופרטור ש6ח עושה כאשר אין לו אפשרות לענות על דרישת זיכרון. לפני שנעבור לפרק הבא, נבדוק אס מובניס הנושאיס הבאים : * יכולת הקצאת הזיכרון הדינמית מורידה את התלות של התוכנית במערכים בגודל קבוע. * האופרטור א6ח מחויר כתובת של האזור בויכרון כאשר הקצאת הזיכרון מצליחה; אחרת, הוא מחזיר את הערך 11א, כלומר 0. * בכל פעם שהתוכנית מקצה זיכרון באמצעות וסח, היא חייבת לבדוק את הערך שהוא מחזיר, כדי לוודא שהאופרטור מחזיר ערך של כתובת ויכרון ולא 0 (אין זיכרון פנוי). * הגישה לויכרון המוקצה על ידי אופרטור א6ח מתבצעת על ידי שימוש במצביע, או במערך. / האופרטור וששח מקצה זיכרון מתוך מאגר הזיכרון החופשי של המערכת - 6 66 * גודל מאגר הזיכרון החופשי שונה בין מערכות מחשב כתלות בסביבת העבודה של מערכת ההפעלה ובמודל הקצאת הציכרון של המהדר. בסביבת עבודה 205 מאגר הזיכרון החופשי מוגבל ל- 64%68. * כאשר חדל הצורך בזּיכרון המוקצה, צריך לשחרר אותו על ידי שימוש באופרטור 6, כדי להחצירו למאגר הזיכרון החופשי, ולאפשר שימוש חוזר שלו כשנדרש. פרק 31: מאגר הזיכרון החופשי ‏ 321 תרגילים 22 כיתבו תוכנית בה המשתמש נשאל כמה מספרים (מטיפוס +חו) הוא רוצה להזין. בהתאס לתשובתו, נוצר מערך דינמי (מטיפוס %חו) בגודל מתאיס ואז הוא מתבקש לספק ערך לכל אחד מאיברי המערך. לאחר הזנת הערכים מודפסים איברי המערך, ולאחר מכן, משחררים את שטח הציכרון שנתפס על ידי המערך. כיתבו מחלקה של מחסנית (5%866) דינמית, כזו שגדלה ומצטמצמת באופן דינמי. המחסנית תומכת בפעולות אלו: (א)ח5ו0 - הוספת א לראש המחסנית. ()קסק - סילוק והחזרת הערך מראש המחסנית. (0קוח6 - האס המחסנית ריקה? ())חוזס - מדפיסה את איברי המחסנית, מהעליון (זה שהוזן אחרון) ועד התחתון. איברי המחסנית הס מטיפוס זחו. ++6 בקלות פעולות במלאגר הזיכרון החוניעוי בפרק הקודם למדנו כיצד להשתמש באופרטור שוסח ולהקצות זיכרון מתוך מאגר הזיכרון החופשי. כאשר ההקצאה מושלמת, התוכנית מקבלת מצביע המכיל את הכתובת של קטע הזיכרון שהוקצה; אחרת, ++6 מחזירה את הערך 11/)\ למצביע זה. למרות זאת, לפעמים מתעורר הצורך לבצע משימות הדורשות ויכרון על אף אי היכולת של מהדר ++6 לספק את דרישות הזיכרון לתוכנית. בפרק זה נציג כיצד להנחות את המהדר לבצע משימות מסוימות גסם כאשר הבקשה להקצאת ציכרון נדחית. בהמשך הפרק נדון בנושאים הבאים : > הגדרת פונקציית מנהל, הנקראת כאשר בקשה להקצאת זיכרון אינה מקבלת את ההקצאה המספקת. > הגדרת אופרטור צוסח פרטי. > הגדרת אופרטור 06/66 פרטי. כפי שתראה בהמשך, על ידי יצירת אופרטוריס מסוג סח ו-06!606 המותאמיס לצרכיך, תוכל לשלוט בדרך טובה יותר בתוכנית במצביס של חוסר ציכרון, וגס תוכל לדווח ולטפל טוב יותר במצביס אלה. פרק 32: פעולות במאגר הזיכרון החופשי 323 יצירה של מנהל מאגר הזיכרון החופשי בפרק 31 למדנו שהאופרטור שפח מחזיר את הערך 111)א לתוכנית, כאשר אין הוא מוצא את המקוס הפנוי הדרוש במאגר הזיכרון החופשי, לפי בקשת התוכנית. בתוכנית קק6,פפא? 855 מתבצעת קריאה חוזרת של האופרטור אוסח. בכל פעם התוכנית מבקשת להקצות 1000 בתיס מתוך מאגר הזיכרון החופשי עד שהמאגר מתרוקן. <ת.ת108%2608> 610866םת1+ (16סט) מ1את ה1סע ן ;62ת1סס* עַַַם0 ) 60 ;[8%]1000ם0 שסם = ע6סת1סס (עתטסא =! עפסתנ1סס) 15 17 >> "פססץס 1000 11008666ת" >> סגוסס 1-6 12 >> "צסקת6 86026 266ע" >> סגסס ; (%62ם01סק) 116םח [ ו הלולאה שבתוכנית מתבצעת עד שמתקבל הערך !1!וא. ניתן להגדיר פונקציה שתפעל במצב זה, כאשר יש צורך לבצע משימה מסוימת והתוכנית דורשת הקצאת ציכרון שאינה נענית. לדוגמה, הפונקציה ותפזטסז 0ח6 מציגה הודעה על המסך ובהמשך היא נעזרת בפונקציית הספריה הסטנדרטית %וא6, כדי להפסיק את הרצת התוכנית. (10סט)תהעטָס2ק 6ת6 בנ1סט / 7 >> "580191100 06 06םם08 26006856 שעסתסא" >> סגוסס ;(1%6)1א0% ] כדי לבצע את הפונקציה ות8זפָסזק 600 במצב שבו המצביע מקבל ערך 1ועא, צריך לקרוא לפונקציה זס|0ח ששח 560 ולציין בה כפרמטר את שס הפונקציה וחהזססזכ 0ח6. הנה דוגמה: ; ((ת020028 ִת6)עַ16ֶת8ם שס6ם 566 בתוכנית 692.פפא? פאפ מתבצעת הפונקציה והפזפסזק 0ה6 כאשר נדתית הדרישה להקצאת ויכרון מתוך מאגר הזיכרון החופשי. חשוב מאוד לרשוס את הפונקציה (%1וא6 בסוף הפונקציה ווחפזפסז החס, כדי למנוע לולאה אינסופית. שיק 6 | תוכנית זו פועלת בגירסה 3.1 ++6 0ח807!8 ומעלה בלבד. 4 ++6 בקלות <ם.ת105%208> 61006ת1+ ססץססססצס 1%אם // <ם.560110> 66ג610ת1+ 86 מפסנָםם חסם 866 // <(.חסת> 61066םת1+ (16סט)תהעטָס2ק 6ת6 ב1סט \ 17 >> "5801911600 06 06םם08 26006856 שעסתסא" >> סגוסס ;(6%1%)1 (16סט) מ1את ב1סע | ;62תנ1סס* עַַַם0 ; ((ת020828 ִת6)ע6נ1ֶת8ם טסם 566 + 60 12 082 חסם = ע6סת1סס ;06[1ת8>> "פססץס 10000 11068%6686ת" >> סגוסס ; (1) 16נגנתח |[ 1 במקרה זה, כאשר אין מספיק ויכרון פנוי להקצאה, הפונקציה גורמת להפסקת התוכנית. בהתאס לדרישות התוכנית ניתן להיעזר בפונקציה ולהקצות זיכרון מתוך משאבי זיכרון נוספים, כמו לדוגמה, זיכרון מוגדל (ץזסוחסוח 060ח%6אם) בסביבת 5. אפשרות נוספת היא שחרור זיכרון שהוקצה לטובת משימה אחרת, והמשך הרצת התוכנית כשלרשותה ציכרון פנוי להקצאה. יצירת אופרטורים שסח ו-06!6%6 פרטיים אחת התכונות של שפת ++6 היא העמסת אופרטורים. לפי תכונה זו ניתן להגדיר מחדש גם את האופרטורים עוסח ו-86|606, ולשנות את התנהגותם הרגילה. נציג לדוגמה מקרה דימיוני, שבו צריך להקצות 100 בתים בויכרון לשס אחסון זמני של הסודות הכמוסים של החברה. כאשר משתמשים באופרטור 06!6066 לשחרור הציכרון שהוקצה, הזיכרון משתחרר, אך המידע נשאר בו עד לשימוש החוזר בשטח ויכרון זה ומחיקתו על ידי דריסה בנתונים חדשים. באופן תיאורטי, מרגל תעשייתי בעל ידע במחשבים ותכנות יכול לאתר את שטח הזיכרון הרגיש הזה ולגלות את סודות החברה. פרק 32: פעולות במאגר הזיכרון החופשי 325 על ידי העמסת האופרטור 06!606 ניתן לקבוע שלפני שהתוכנית המקורית משחררת את הויכרון, היא ממלאת אותו (דורסת) באפסים, או בתוויס אחרים נטולי משמעות. בתוכנית 699.פדפ ופפצוא מתוארת העמסת האופרטור 06!6%6. הפונקציה דורסת תחילה את מאה הבתיס שכתובתס נמצאת במצביע, ורק אחר כך היא משחררת את קטע הויכרון שהוקצה. את הזיכרון משחררים על ידי שימוש בפונקציית הספריה הסטנדרטית 1:66. שיק 6! תוכנית זו פועלת בגירסה 5 ומעלה של ++6 |אטפו\ או בגירסה 1 ++6 6ח8!זסה ומעלה בלבד. <ת.ת108%268> 61066ת1+ <ת.560110> 61066ת1+ <ת.ש0ם1ע5%6> 61006ת1+ (ע%56ם1סק* 016ט)061686 628602ק0ס סנסט 568610 ו 2 (* ע8ם0) = 0868* פַהת0 7 שת 105 )1 = 0; 10> 100; 1++( 38%8]1[ = 0; ;[0ת8 >> "!8816 826 56028668 6ם7" >> 6ט0ס0 ; (ע66ת1סס) 1266 (16סט) מ1את ב1סע | ;[82]100םת60 חטסםת = ע66%ם1סס* ע8ם0 ; ("56026%5 שםתהאקתס0ס צא" ,662>תנ1נסס) צץק0ס562 061606 2; ו בתחילת התוכנית היא מקצה זיכרון למערך תוויס על ידי שימוש באופרטור ששסח. נתוני החברה מועתקים למערך זה. מאוחר יותר, התוכנית משתמשת באופרטור 6 החדש (העמסת האופרטור) ומשחררת את הויכרון בתוך הפונקציה 06!6%. המשפט הבא מבצע השמה של מצביע מערך התוויס אל מצביע של מערך התוויס. 2 (* ע8ם0) = 0868* כַהַת0ס הביטוי (* ז608) נקרא מתאם (685). מטרת המתאס היא לציין למהדר ++6 שהפונקציה מודעת להיותה מציבה מצביע מטיפוס סוסצ (ראה את נושא הפרמטריס של הפונקציות) למצביע מטיפוס ז608. אי הצבת המתאס מונעת את ההידור של 6 ++6 בקלות התוכנית. בהמשך מועתקיס אפסיס אל 100 הבתים של הזיכרון המיועד לשחרור. שחרור הזיכרון נעשה על ידי הפונקציה הסטנדרטית 8:66. יש להדגיש שפונקציה זו פועלת על קטע זיכרון שגודלו 100 בתים, ומכיון שבתוכנית מתבצעת הקצאת זיכרון פעם אחת בלבד, הפעולות מתבצעות בצורה תקינה. אם משניםס את התוכנית כדי שתקצה 10 בתים בלבד ולא משניס את פונקציית השחרור בהתאם, התוצאה תהיה דריסה של 90 בתיס בזיכרון, אשר עלולים להיות בשימוש, ולגרוס לתקלה רצינית בביצוע התוכנית. השימוש בפונקציות סטנדרטיות לטיפול במאגר הזיכרון החופשי עשוי להביא תועלת מרובה למתכנת ולביצועי התוכנית. אפשר למשל לזהות את קטע הזיכרון שהמצביע מורה עליו וכך להתייחס אליו בלבד בצורה נכונה. ראוי להכיר היטב את פונקציות הספריה הסטנדרטיות. בתוכנית 5ק6.אפטס שפא מוגדרת העמסת האופרטור שופח. במקרה זה הפונקציה המועמסת מציבה בתחילת הזיכרון שהוקצה את המחרוות הזו: !++0 צץס 2650060 <ת.ת108%268> 61066ת1+ <ם.81106> 610886ת1+ <ת.ש6םת1ע5%6> 61006ת1+ (8126 6 8126)אס6ם פססהע6קס* ב1סט 568610 ו 22 + את ; (81100)8126ת (* ע8ם0) = עססתנסס ;(("!++60 צץס 26800606")ם86210 < 8126) 11 ; ("!++0 צסע 26500686" ,ע2סס6ם1סס) צץק0סע562 ; (%56₪ם1סס) פעגו26% (ס1סט) מ1את 1סע | 12 ע8אםת0 חפת = ע86* 88ם0 2 >6>> 8562 >> סטסס ] הקצאת הזיכרון בפונקציה ש6ח מתבצעת על ידי הפונקציה הסטנדרטית 6ס!|8ח. אס גודל הויכרון המוקצה גדול מאורך המחרוזת "!++6 עפ 656060ח'יי הפונקציה קוראת לפונקציה הסטנדרטית 5060 כדי להעתיק את המחרוזת לתחילת קטע הזיכרון שהוקצה. פרק 32: פעולות במאגר הזיכרון החופשי 327 סיכום בתוכניות מורכבות ברור הצורך והתועלת של השימוש באופרטור שפח להקצאת זיכרון במהלך ריצת התוכנית. בפרק זה למדנו כיצד ניתן לנווט את פעולת האופרטור ששח , על ידי הקריאה לפונקציה ז0!6ח8 שו6ח 566. זו תגרוס לקריאה אוטומטית של פונקציה מסוימת, כאשר האופרטור ששח אינו מסוגל להקצות זיכרון מתוך מאגר הזיכרון החופשי. הצגנו גם דרך אלטרנטיבית לפעולה זו: העמסת האופרטור סח עצמו. לפני / / שנעבור לפרק הבא, נבחן אס מובניס לנו הנושאיס הבאיס : כאשר האופרטור שפח אינו מסוגל להקצות את קטע הזיכרון הדרוש לתוכנית, הוא מחזיר את הערך 11 למצביע המתאיס. קיימת האפשרות להורות לתוכנית לבצע סדרה של פעולות מסוימות כאשר האופרטור ששח אינו מצליח להקצות את הזיכרון הדרוש. על ידי שימוש בפונקציה ז0|6ח8ח שו6ח 566 האופרטור שפח קורא לפונקציה מוגדרת בתוכנית כאשר הקצאת הציכרון נכשלת. / בשפת ++6 ניתן להעמיס את האופרטורים ששח ו-06!606. לפני העמסת האופרטוריס האלה, מומלצ ללמוד כראוי את תהליכי הקצאה והשחרור של הזיכרון ולהכיר את הפונקציות הסטנדרטיות המטפלות בנושא. תרגילים שיק 6 ! לפתרון תרגילים אלה השתמשו בגירסה 5 ומעלה של ++6 |פטפו/ או 28 בגירסה 3.1 ++6 6ח8!ז80 ומעלה בלבד. כיתבו תוכנית המגדירה את האופרטוריס שוסח ו-06!606 ובודקת שאין דליפות זיכרון, על ידי ספירת מספר פעולות ששח ו-06!606 שבוצעו והשוואת מספר פעולות צו6ח למספר פעולות 06!606, שבוצעו במהלך ריצת התוכנית. הגדירו פונקציה זסזום ח6800סו|8 ץזסוחפוח אשר מופעלת כאשר לא ניתן לספק בקשה להקצאת זיכרון. הפונקציה מדפיסה את נפח הזיכרון הכולל שנותר לשימוש. הפונקציה מנצלת את פונקציית הספריה 6076!6%. ++6 בקלות נתונה תוכנית המגדירה את המחלקה הבאה: 71 018898858 ;[68%58[]34 ע8ם0 ;ו התוכנית מבצעת מספר רב של פעולות צו6ח ו-06!66, אך עם ואת, קיימים לכל היותר 50 אובייקטים מסוג 88% בו-וּמנית. יש לכתוב את האופרטורים צוסח, ו-661606 מהירים, שכאשר הס נדרשים לספק בדיוק 34 בתי ויכרון, הס אינס מפעילים 06ו!8ח, אלא מנהלים הקצאות אובייקטים מסוג 18% מתוך מערך בן 50 אובייקטיס שהוקצה בתחילת התוכנית. מה עושה קטע התוכנית הבא: ) % 01888 :טס ] (8126 6 5126)א6םת ע628%0%ק0 *18סט ;++0068ת8%68ת1 ; (5126) 81100 מעטט26%6 ] 7 סמםם1 568610 ;ן ;065=0ת5%8ת1::א 6ת1 (10סט) ת81ת 18סע | ;% שחסת=א *א% ;א 061666 פרק 32: פעולות במאגר הזיכרון החופשי 329 ניצול מירבי של 1 |ו-ד600 במהלך הלימוד והצגת הדוגמאות, השתמשנו בערוצ הפלט ובפקודה 6006 להצגת הודעות ונתוניס על המסך. במקביל, השתמשנו בערוצ הקלט ובפקודה ח₪ לקליטת נתונים מהמקלדת. בפרק זה נציג את הפקודות חו6 ו-+60 כעצמים, המוגדרים בקובצ הכותר 5768₪.8סו (6] ז6806ת). על פי הגדרתםס כעצמים, 6 ו-600 תומכיס באופרטורים שוניס ובפעולות שונות. בפרק זה נראה כיצד נכיר את הדרכים לשכלל את התכונות של הקלט והפלט תוך כדי שימוש בפונקציות הבנויות לתוך מחלקות של חש ו .600- בפרק וה נדון בנושאיס הבאים: תוכן קובץ הכותר ח.וח105068, המכיל הגדרות מחלקה שאפשר לבחון כדי להבין טוב יותר את ערוצי הקלט/פלט. שליטה על הפלט באמצעות הפונקציה חַסואו.60%. המרת טאב ותו רווח בתו אחר, על ידי שימוש בפונקציה |600%.81. שליטה בהצגת מספר ספרות עשרוניות של משתנה מטיפוס ₪085 באמצעות הפונקציה חסןפו600%.56%0766. הצגה וקליטה של תוויס בודדיס על ידי שימוש בפונקציות %שק.600% ו-06%.חו6 בהתאמה. קליטה של שורה שלמה באמצעות הפונקציה 060106 .חוס. כמעט כל תוכנית בשפת ++6 משתמשת בתכונות וביכולת הקלט/פלט של העצמים ח!6 ו-0%ס. לכן מומלץ ללמוד נושא זה בקפידה על ידי התנסות בהרצת התוכניות המוצגות בפרק זה. ס22 ++6 בקלות קובץ הכותר ח.וב3ּ0זל05ו בכל התוכניות המוצגות בספר כלול תמיד קוב הכותר 0.ח0568ו. קובץ זה מאפשר להשתמש בתוכנית ב-חו6 לביצוע פעולות קלט וב- 004% - לביצוע פעולות פלט. קובצ זה מכיל את הגדרת המחלקות 1557631 (ערוץ הקלט) ו-63₪1ז05% (ערוץ הפלט), שבהן חס ו-%ס6 הם עצמים. בגין חשיבות הנושא מומלצ להדפיס את הקובצ וללמוד את תוכנו. הקוב צריך להיות בתת-הספריה פס 1%61 של המהדר. ההגדרות שבקובצ הן די מורכבות, אך לימוד קפדני של הקוב יגלה שרובו מורכב מהגדרות של מחלקות וקבועיס. בתוך הקוב ניתן למצוא את הגדרת העצמים חוס ו-+600. השימוש ב-+סס המחלקה 60% כוללת מספר שיטות או פונקציות שונות. בתוכניות שבהמשך נתאר את השימוש במספר פונקציות המשמשות לעיצוב פלט התוכנית. בפרק 3 למדנו שהמשפט 56% מאפשר לקבוע את מספר המקומות (פוזיציות) המינימלי שבו יוצג ערך הפלט על המסך (הכוונה תמיד לערך שאחרי 5604). <ת.0ת1085%2068> 61006ת1+ <ם. ק1תה8תס1> 61006םת1+ (10סט) ת81ת ב1סע ן ש560 >> "18 עסמחטם 02166ט8 צא" >> סטסס ש56% >> "18 עסמחטם 021%66ט8 צא" >> סטסס א560 >> "18 עססמחטם 02166ט18 צא" >> סטסס 2 >> 1001 >> 2 >> 1001 >> 2 >> 1001 >> 12 >> 1001 >> א560 >> "18 עססמחטם 166ע0ט5+8 צא" >> סטסס ו בצורה דומה, הפונקציה חזטוצו.)טס6 מאפשרת לקבוע את מספר התווים להצגת הפלט של הביטוי שאחרי הפונקציה. בתוכנית 9ק6.דפשדטס6 מתואר השימוש בפונקציה זו, כדי לבצע את הפעולות שתארנו. <ת.ת108%268> 610866ת1+ <ת.קנ1נתאתס1> 61006םת1+ (16סט) מ1את ה1ס7 ָ קר יע 3 (++1 ;7 > 1 ;3 = 1) ע0ס+ | ;"15 עססמתטם 166עסט8+ צשא" >> סגוסס ; (1) ם10%א. סגוסס 17 >> 1001 >> סגו00 פרק 33: ניצול מירבי של 600 ו- אז6 | 331 לאחר הידור והרצת התוכנית יוצגו על המסך השורות הבאות: <66%ת₪> 7כ1אצטסס <\:0 1 טסכסתטם 166ע02ט18 צא 1 טסכסתטם 166ע02ט18 שא 1 18 עססתטם 166עסט18 צא 1 18 עס6סתטם 166ע0ט18 צא להזכיר, בדומה למשפט ש560, גם הפונקציה חַשסו.%טס6 משפיעה על ביטוי הפלט הסמוך לה. תווי מילוי השימוש במשפט 560 או בפונקציה 00ו/.60% גורס להצבת מספר תווי רווח לפני או אחרי ערכי הפלט המטופלים בהם, כנדרש. ייתכן מצב שנרצה להשתמש בתו שונה מתו הרווח, כי כך הן דרישות התוכנית. למשל, נניח שהתוכנית יוצרת את הטבלה שלהלן: מס1נ8%ת02+ת1 0% 78016 10 שש 1 1 כ עשתב תס 1 005 - תה 6 05ם. עצמ בסו 6 83 ש שם שש) מ הצ 8 יש 9-5 שיש = סד ם סות בי ,רע סיסם. ץצ תב תס בטבלה זו מופיעות נקודות לפני מספר הדף, הנקראות נקודות מובילות (1630075 0%כ). הנקודה הינה במקרה זה תו מילוי (ִספסהּזבּת6 !!1=). באמצעות הפונקציה !604.81 ניתן להחליף את תווי הרווח בתו כלשהו אחר. בתוכנית פפס. | וזזזטס6 עורכיס טבלה דומה. <ת.0ת1085%2068> 61006ת1+ <ם. ק1תה8תס1> 61006ם1+ (10סט) ת81ת ב1סע \ 12 >> "תס0ס1ס8תלס+ת1 0% 78016" >> סוסס 6 2 >> 10 >> (20)א568 >> "05116עק צםת8קתס60" >> סגוסס 2 >> 11 >> (12)א560 >> "1085 06ם8 516סעק שְתהקתסס0ס" >> סגוסס 12 >> 13 >> (14)א566% >> "5ע62כמת6/ 20820 צץםתהקתס60" >> סגוסס ] הפונקציה !60.0 שומרת על התו המוגדר בה, עד לקריאה נוספת של הפונקציה ובה תו מילוי אחר. 2 ++6 בקלות הצגת מספר הספרות של משתנה זבסו1 לא ניתן לקבוע מראש את מספר הספרות העשרוניות ש- )60 יציג עבור ערך +03. אולס, על ידי שימוש בפונקציה 66500זקז56 ניתן לקבוע את מספר הספרות העשרוניות הרצוי להצגת המספר. בתוכנית 56.69 פד558 מתואר השימוש בפונקציה 00ו56%076615 לקביעת מספר הספרות שיוצגו מימין לנקודה העשרונית. <ת.ת108%268> 61066ת1+ <ת. ק1נתאתס1> 61006ת1+ (16סט) מ1את 1סע ן 72 = 6ט810ט 11086 12 6ם1 (1+4 ;6 106 ;1 = 1) מ0ס+ 2 6%>> 6ט810ט >> (1)ם2601910ק86% >> סגוסס לאחר הידור והרצת התוכנית נראה על המסך את השורות הבאות: <ע66םת> סמתק5₪1 <\: 2 .3 29 .6 .6 כ 2 3 -] ב- הפונקציה ח5660766500 שומרת את מספר הספרות העשרוניות להצגה, ומשתמשת בערך זה לקריאה נוספת של הפונקציה שבה יש שינוי ההגדרה. קלט ופלט של תווים בודדים לפעמים צריך להציג תוויס וה אחר זּה, או לקלוט תוויס בודדיס מהמקלדת. כדי להציג תו אחד בכל פעם, ניתן להשתמש בפונקציה %שק.%טס6. בתוכנית 9ק6.דטפדטס60 מתואר השימוש בפונקציה זו, אשר מציגה על המסך את המשפט: 1[++6 ץ0 ₪656060 - תו אחר תו. <ת.ת108%268> 61066ת1+ (16סט) מ1את ה1סע ז ;"!++0 צכ 6ַסטספפ26" = []0ם1ע50 פַַת0 7 סםת1 (++1 = 1) 102 [6]1ם1ע85%6 ;0 ([8]1ם6)5%21גוק.6גוסס , , פרק 33: ניצול מירבי של 600 ו- אז6 | 333 בספריית הפונקציות הסטנדרטיות קיימת הפונקציה ז6מקטסף, המתזירה את האות הגדולה המקבילה לאות שמתקבלת בה כפרמטר. בתוכנית ;ק6.אפקטדטסס מוצג השימוש בפונקציה וו, כדי להמיר את האותיות המתקבלות ואחר כך להציג אותן על המסך על ידי הפונקציה ז+טס.%טס6. <ת.ת108%2608> 86ט610ת1+ 6 עשעסססטסם // <ם. 6קץ6%6> 086ו61ת1+ (16סט) מ1את ב1ס7 ָ ;"!++0 צכ סַסטספפ2" = []0ם1ע80 פַַתס 2 די תד (++1 ;[06]1ם1ע86 ;0 = 1) 108 ; (([6]1ם1ע56) עס6סקטסם) סגוס. סגוסס 12 >> 8ם1ע85 >> " :שת1ע6פ5 6ש6תנ1נבתםע" >> 61ת6 >> סטסס לאחר הידור והרצת התוכנית נראה על המסך את השורות הבאות: <667ת₪> תפפטצטסס <\:0 !++0 צם כעשאטספמת ![++0 צס 269500606 :06ם5621 סמנסםם קליטה של תווים בודדים מהמקלדת כשם שהפונקציה +טס.זטס6 מציגה על המסך תו אחר תו, כך גם הפונקציה 6.96% קולטת תו אחר תו. הפונקציה 96%.חו6 קולטת את התו מהמקלדת ובמשפט ההשמה אנו מעביריס את הערך הזה למשתנה. ;()086%6.ם01 = 166662 במהלך ביצוע התוכנית 9פ6.זפ=6 אזס מוצגת על המסך הודעה המבקשת לתת תשובה מהסוג ץ או א (כן/לא). בתוכנית מתבצעת לולאה לקבלת התשובה. הלולאה מסתיימת כאשר מתקבלת אחת האותיות ץצ או א. <ת.ת108%268> 61066ת1+ <ת. 0קץ6%6> 61086ת1+ (16סט) מ1את ב1סע ן ;7 עאתס ;" :(א/צ) ?6טת1סתסס סם סתאח טסץ סק" >> סטסס 4 ++6 בקלות 60 1 ;()06%6.ם01 = ע16686 8 סם סעסעטם 60 // ; (ע166₪66)עסקקטס>ף = 166662 ;(('א' =! 16%662) 86 ('צ' =! 16%662)) 116םח [ן ;1 >16666%>6>> " 56160060 גוסצ" >> 01ם6 >> סגסס קליטת רצף תווים מהמקלדת כאשר משתמשים ב- חוס לקליטת נתוניס ברצף, דרוש תו הפרדה (רווח, 78 או זס%חם) בין הערכיס הנקלטים. במקריס רביס צריך לקלוט בתוכניות רצף של תוויס (שורה - 6חו|) ולהציב אותס במשתנה מטיפוס מחרוזת. לצורך זה ניתן להשתמש בפונקציה 6חו6ף. חוס. הפרמטריס של הפונקציה הס משתנה המחרוזת המיועד לאחסון התוויס וגודל המחרוזת. הנה דוגמה: ; (64 ,0ת1ע6)8%ם86%11.םת01 מכיון שהפונקציה 6ח4601.חו6 קולטת את התווים מהמקלדת, יש להקפיד שמספר התוויס הנקלטיסם לא יחרוג מגודל המחרוזת. הדרך המומלצת לציין את גודל המחרוזת היא השימוש באופרטור 51260, כפי שנראה בדוגמה הבאה: ; ((0ם1ע812601)8% ,0ת1ע6)86ם86%11.םת01 כאשר רוציס לשנות את גודל המחרוזת במועד מאוחר יותר, אין צורך לשנות כל משפט % וס בתוכנית. נראה שהאופרטור 512606 משתמש בגודל הנכון של המחרוזת בזמן הביצוע. בתוכנית 695.פאזודפ6 מתואר השימוש בפונקציה 6חו860.חו6 לקליטת רצף תוויס מהמקלדת. <ת.ת108%2608> 61086ת1+ (16סט) מ1את ב1סע \ ; [128]ן8ם1ע56 עַַאם0 12 >> "עססתם 655עק 06ם8 6א₪6% 05 6םת11 6שסץ2" >> שגוסס ; ((0ם21ע812601)8% ,0ת1ע6)56ם86%11.םת01 7 6%>> 6ם1ע8% >> " :666 טסצ" >> סגוסס פרק 33: ניצול מירבי של דע60 ו- א]0 | 335 בביצוע קליטה של מחרוזת מהמקלדת, יש צורך לפעמיס לקלוט תוויס עד למילוי המחרוזת, או עד לקליטת תו מסויס. כדי לבצע משימה זו, ניתן להעביר פרמטר נוסף לפונקציה 6חו960.חו6 הכולל בתוכו את התו המסוים הזה. לדוגמה, המשפט הבא קורא לפונקציה 6ח0601.חו6 לקליטת שורה. הקליטה מסתיימת כאשר המשתמש לוחצ על המקש זסשחם, כאשר נקלטים 64 תווים, או כאשר נקלטת האות 2. ;('2' ,64 ,0םת1ע6)85%מם66%11.ת01 בתוכנית הבאה 2.692 ונזאט מתואר שימוש בפונקציה 6ח0601.ח61 כאשר מתבצעת קליטה של שורת תווים. על פי פרמטר הפונקציה, הקליטה מסתיימת כאשר לוחציס על האות 2 במקלדת. מומלצ להדר את התוכנית ולהריצ אותה מספר פעמים. בפעם הראשונה לקלוט שורה המכילה את האות 2 בסוף השורה; פעם שנייה - כאשר האות 2 מופיעה ישר בהתחלת השורה. פעס נוספת כאשר אין האות 2 מופיעה כלל בשורת הקלט. <ת.ת108%2608> 610866ת1+ (16סט) מ1את ה1ס7 \ ; [128]ָ 8ם1ע562 עַַא8ם0 12 >> "עססתם 655עק 06ם8 6א₪6% 05 6םת11 6שסץעץ?2" >> סגוסס ;('9' , (06םת1ע512601)8% ,06ת1ע6)56ם86%11.םת01 7 >> 6ם1ע8% >> " :660 טסצ" >> סגוסס סיכום בכל תוכנית הכתובה בשפת ++6 קרוב לוודאי שיהיה צורך להשתמש בעצמיס ח6 ו-+טס6 לביצוע פעולות קלט/פלט. בפרק זה ראינו מספר פונקציות לטיפול בנתוניס, ופונקציות הפועלות בערוציס חו6₪ ו- +אוסס. ככל שהתוכניות נעשות מורכבות יותר, הן תשמורנה נתוניס בקבציס. בפרק 34 נלמד על פעולות קלט ופלט בקבציס. לפני שנמשיך, נבחן אס מובניס הנושאיס הבאים : / חוס ו-+טס6 הס עצמיס של המחלקות וח15768 ו-וח05068 המוגדרות בקובצ הכותר ח. 68 50סו. הס מציעים מיגוון של פונקציות המאפשרות לבצע פעולות קלט/פלט שונות בתוכנית. * הפונקציה הש0ואו.)טס6 מאפשרת לקבוע מספר תווים (פוזיציות) עבור ערך הפלט הנרשס לאחר הפונקציה. 6 ++6 בקלות הפונקציה !600.01 מאפשרת לציין תו כלשהו שיוצב כתו מילוי על ידי הפונקציה חז0וו.+ס6, או המשפט 560, במקוס תווי רוות. * הפונקציה ח56%0760500 מאפשרת לקבוע את מספר הספרות העשרוניות להצגת ערך מטיפוס 8%סו. * הפונקציות 96%.חו6 ו- זטס.)טס6 מאפשרות קליטה והצגה של תווים בודדים. * הפונקציה 6ח060.חו6 מאפשרת לקלוט שורת תוויסם (רצף) מהמקלדת. עם אפשרות להגבלת מספר תווים, או עד לקליטת תו כלשהו. תרגילים 1. כיתבו תוכנית המקבלת מהמשתמש כקלט שני מספרים שלמים פש6חו| טח ו- ח)סוצ 6חו! ומדפיסה פפחו| פח שורות של תווי '5' באורך של וזו 6חו! תוויס כל אחת. כיתבו תוכנית המדפיסה את , ולמעשה את הקירוב על פי 7/22, בדיוק של 0 ספרות אחרי הנקודה. כל התוצאות צריכות להיות מיושרות מימין, כך שהספרה האחרונה היא בעמודה ה-20 במסך. כיתבו תוכנית הקולטת 10 תוויס. לאחר מכן מדפיסה כל תו בשורה נפרדת. התו במקום | מודפס בעמודה !, ואס הוא גדול מהתו הגדול ביותר עד כה, הוא אינו מודפס אלא מודפסת כוכבית במקומו. כיתבו תוכנית אשר קוראת ח תוויס (באנגלית) מהקלט, עד אשר: א. הוזנו כבר ח תוויס ב. המשתמש הזין את התו נקודה (י.). התוכנית תציג כעת את התוויס שהוזנו. כל אות הקטנה מ-'ו', היא תציג באותיות (אנגלית) גדולות. פרק 33: ניצול מירבי של 600 ו- אז6 | 337 פעולות קלט/פלט בקבצים תוכניות מורכבות כוללות פעולות של אחסון ואחזור מידע מקבצים. בנושא טיפול בקבצים, כמו בהרבה תחומיס אחריס בשפה ניתן להשתמש בתוכניות הכתובות ב-++6, בטכניקות המוכרות משפת 6. המהדריס של ++6 מספקים קבוצות של מחלקות לביצוע פעולות קלט/פלט בקבצים, ומקליס בכך על ביצוע פעולות קלט פלט בקבצים. בהמשך נדון בנושאיס הבאיס: > פתיחת ערו פלט לקובצ ואחסון מידע על ידי שימוש באופרטור הפלט !>> (זס6]8%ק0 הסוז56ח1). + פתיחת ערוץ קלט לקובצ וקריאת המידע על ידי שימוש באופרטור הקלט "<<י (ז3%0וק0 חהסוז6הטאם). > פתיחה וסגירה של קבצים על ידי שימוש בפונקציות המחלקה. > קריאה וכתיבה של נתונים על ידי שימוש בפונקציות המחלקה. רוב התוכניות, ובמיוחד אלו המעבדות נתונים לשימוש חוזר, מאחסנות את הפלט בקבצים כדי לקרוא אותו בעת העיבוד הבא. לכן, מומלצ להשקיע ומן ולהעמיק בנושא המוצג בפרק זה. כפי שנראה בהמשך - פעולות קלט/פלט בקבציס פשוטות למדי. 8 ++6 בקלות ערוץ פלט לקובץ בפרק 33 למדנו ש-6000 הוא עצם מטיפוס 05680 (ערוצ פלט). על ידי שימוש במחלקה 05068 התוכנית מסוגלת לבצע פעולות בערוצ הפלט, כשהיא משתמשת באופרטור הפלט ובאופרטוריס והפונקציות של המחלקה. בצורה דומה, קובצ הכותר ח. רה15068 מגדיר מחלקה בשס ה650768ס. השימוש בעצמיס של המחלקה 0150768 מאפשר לבצע פעולות פלט לקובא. כדי להשתמש במחלקה זו, צריך ליצור תחילה עצס מטיפוס 015068 ולציין (בין גרשייס) את שס קוב הפלט, לפי הדוגמה הבאה: ; ("צאת. פאגא60%)"211רסס 5116 ת0185%268 שס הקוב\ הנמצא במשפט יצירת העצם מטיפוס ‏ 060688 גורס לדויסת (166ז/עיז6ש0) קובץ בשס וה הקיים בדיסק, או ליצירת קובץ חדש, אם קוב זה לא נמצא על הדיסק. בתוכנית 5.699 וז זטס מתואר השימוש בעצם מטיפוס וח01568 ליצירת קוב מסוים, אשר בהמשך התוכנית משתמשת באופרטור הפלט לכתיבת מספר שורות טקסט בקובצ. <(.ת15%768> 86ט610ת1+ (ס1סט)מ1נאת סנ1נסט זָ ; ("צתכ. 0עא1א5116)"500 אססס ת0185%268 12 >> "+01 צק 60גספ5פת" >> 1116 א%ססס 2 >> "688עק 08088" >> 5116 א0%ססס 12 >> "08608 315" >> 5116 אססס התוכנית הקודמת פתחה קוב בשס דגפ.סיואזאסספ, ואחר כך היא כתבה בו שלוש שורות טקסט. לאחר הידור והרצת התוכנית ניתן להשתמש בפקודה =5ק ץד של מערכת הפעלה 05 כדי להתבונן בתוכן הקוב שנוצר. <עססת> עתפ סעא200%1 | מעפצץ <\:0 ++0 צס 2650066 08058 58 315 5 פרק 34: פעולות פלט/קלט בקבצים 339 ערוץ קלט לקובץ בסעיף הקודס הצגנו את השימוש בעצס מטיפוס ו015068₪ אשר מקל על ביצוע פעולות בערו הפלט לקבציסם. באופן דומה ניתן לבצע פעולות בערוץ הקלט לקבצים על ידי שימוש בעצס מטיפוס ח5068)ו. כדי להשתמש במחלקה זו, יש ליצור תחילה עצס מטיפוס ו1)50768₪ ולצייו את שס הקוב\ המשמש לקלט, לפי הדוגמה שלהלן: ; ("דאם. פאתא10ע")2116 סטסת1 מ(158%268 בתוכנית 2ק6.אז1 115" פותחיסם את הקובצ זאפ.0ס;א4סספ שנוצר בתוכנית הקודמת. בהמשך קוראיס ומציגיס את שלושת האלמנטיס הראשוניס המאוחסנים בקוב\. <ת.ת108%2608> 86ט610םת1+ <(.ת15%768> 86ט610ת1+ (16סט) מ1את ה1סע | ; ("ץצהכ. סעא1116)"800%1 ס6טקם1 מ155%6268 ; [64] 6586 ,[64]סחם , [64]פםתס מַַַםס ;מס << 2116 סטסת1 2 << 2116 סטסת1 12 << 5116 סגוסםת1 ;01ת >> 6תס >> 0006 ;01ת8 >> סשטם >> 0006 ; 01ת6 >> 6פשעת6 >> שטסס לאחר הידור והרצת התוכנית אנו מצפיס להצגת שלוש השורות הראשונות של הקובצ. אולס כמו בפקודת הקריאה הרגילה חו6₪, גם ערוץ הקלט משתמש בתווי הפרדה בין האלמנטים הנקלטים, ולכן הרצת התוכנית תראה על המסך את השורות הבאות : <צס6ת₪> ‏ א1 אםת1עא <\:0 6 צס 0++[ קיבלנו שלוש מיליס בשורות נפרדות ולא שלוש שורות בנות מספר מילים כל אחת. המסקנה - צריך להשתמש בפקודה אחרת לקריאת השורה. 0 ++6 בקלות קריאה של שורה מתוך קובץ בפרק 33 הצגנו את פונקציית המחלקה 6ח4601.חו6, שמאפשרת לקלוט שורה שלמה מהמקלדת. בצורה דומה ניתן להפעיל את הפונקציה 6חו96% של המחלקה חח 50768)ו, כדי לקרוא שורה שלמה מתוך קובצ. בתוכנית 99ס6.פא11 וז" מוצג השימוש בפונקציה 06 לקריאת שלוש השורות המאוחסנות בקוב\ 0.63%)חו\ססט. <ת.ת108%2608> 866ט610םת1+ <(.ת1+5%768> 61086םת1+ (16סט) מ1את ב1ס7 | ; ("ץהכ. סעא1116)"800%1 ס6טסם1 מ155%6268 ; [64] 6586 , [64]סחם , [64]פתס מַַַםס ;((6ת812605)0 ,6תס)6ת5116.06611 סגוסםת1 ; ((סשף)812605 ,סשם)6ת5116.06611 סגוסםת1 ;( (2660ם812605)6 ,606ע2םת6)6ת5116.06611 סגוסםת1 ;01ת8 >> 6םתס >> 00806 ;01ת8 >> סשם >> 0006 ; 601 >> 6פשעת6 >> 0006 ] תוכנית וו מצליחה לקרוא את תוכן הקובצ במלואו, מכיון שהיה ידוע לה שבקובצ מאוחסנות שלוש שורות. ברוב המקריס אין המתכנת יודע את מספר השורות הקיימות בקובץ שהוא קורא ממנו. לכן, צריך לקרוא את שורות הקובץ עד למציאת ציון סוף קוב (8₪!6 +0 6חם). בדיקת ציון סוף הקובץ בדיקת ציון סוף קוב (₪1!6 +0 6חם - 0) היא אחת הפעולות הנפוצות ביותר כאשר קוראיס תוכן של קוב\. כדי לערוך בדיקה זו ניתן להשתמש בפונקציית המחלקה )60. הפונקציה מחזירה את הערך אפס כל עוד לא נמצא ציון סוף הקובצ, ולחילופין היא מחזירה את הערך 1, כאשר התנאי מתקיים ונמצא ציון סוף הקובצ. ניתן להיעזר בלולאת 6!וח/ו כדי לבצע פעולות קריאה חוזרות של תוכן הקוב\ עד למציאת ציון סוף קובא. (()2116.601 סטקם1 !) 16נםתח | // 8 פרק 34: פעולות פלט/קלט בקבצים ‏ 341 הלולאה הקודמת מתבצעת עד שהפונקציה 60 תחזיר את הערך אפס. בתוכנית .50 דפפד משתמשים בפונקציה )60 כדי לקרוא את תוכן הקובא 0.63%)חואססט עד למציאת ציון סוף הקוב>. <ת.ת105%268> שסגו] נ6תמנ+ <ת.ת15%268> 6בגו| 1מנגצ+ (16סט) מ1את 16סע ן ; ("ץהכ. סעא5116)"800%1 סטסם1 מ155%6268 ;[6]64ם11 מַַַם0ס (()5116.601 סטסם1 !) 16נםתט ו ;((6ם812605)11 ,6ת6)11ת5116.6611 סגוסםת1 ;01 >> 6ם11 >> סגוסס בצורה דומה, בתוכנית 505.09 פאס קוראים את המילים הכלולות בקובצ, עד למציאת ציון סוף הקוב\. <ת.ת105%268> שסגו] נ6תמנ+ <ת.ת15%6268> 6בגו| 1מנצ+ (16סט) מ1את ה1סע ן ; ("ץהכ. 0סעא5116)"800%1 סטסם1 מ155%6268 ; [64]עסש מַַַם0 ;סש << 6116 | שגוסת1 (()5116.601 סטסם1 !) 16נםתחט ן עתאם //‏ ;01ם6 >> בעסח >> סטסס << 5116 סגוסםת1 יר 1 >> בעסח >> 0006 2 ++6 בקלות בתוכנית 50.02 א.ה6 לדוגמה, קוראיס את התוויס הכלוליס בקובצ עד למציאת ציון סוף הקוב\. ראה להלן. <ת.ת108%2608> 610866םת1+ <(.ת15%768> 61086םת1+ (16סט) מ1את 1סע ן ; ("ץצהכ. סעא5116)"800%1 ס6טסם1 מ155%6268 ;7 עאתס ; ()1116.006%6 סטקם1 = 166665 (()2116.601 סטסם1 !) 16נםתט ;57 >> 6גמסס ; ()1116.006%6 סטקם1 = 166665 בדיקת שגיאה בפעולות קלט/פלט בקבצים בתוכניות קודמות איננו מניחיס התרחשות תקלה כלשהי במהלך ביצוע פעולות קלט/פלט. לצערנו אין זה נכון לנהוג כך. למשל, כשפותחיסם קוב1, יש לוודא כי הקוב\ אכן קייס בדיסק. כאשר כותביס לקובצ, יש לוודא שהפעולה הסתיימה בהצלחה, עלול להיות מצב שהדיסק מלא ואי אפשר לכתוב לקוב>. ניתן להשתמש בפונקציית המחלקה |ו% כדי לבדוק תקלות בביצוע פעולות קלט/פלט בקבצים. הפונקציה מחזירה את הערך 0 (אפס) כאשר מתרחשת תקלה בביצוע פעולה כלשהי. לעומת ואת, במקרה שלא מתרחשת תקלה הערך המוחזר יהיה 1 (אחד). לדוגמה, ניתן להשתמש בקטע תוכנית הבא הנעזר בפונקציה !₪1 כדי להתריע על תקלה בעת פתיחת הקוב\: ; ("דתכ. פאתא10ע")5116 סטסת1 מ1558%268 (()1116.1811 סטסם1) 15 ן ;1 >> "לאם.מ/האתת1ץ שת1תפקס עסעעםע" >> עע6ס ; (1) 681% בדרך דומה ניתן לכתוב קטע תוכנית שבודק אס פעולות הקריאה והכתיבה לקובצ\ מתבצעות בהצלחה. בתוכנית 411.69 זפפד מתואר השימוש בפונקציית המחלקה 18 לאיתור תקלות שונות - ראה להלן. פרק 34: פעולות פלט/קלט בקבצים 343 <ת.ת108%2608> 86ט610םת1+ <(.ת1+5%768> 610866םת1+ (16סט) מ1את ב1ס7 ן ;[6]256ם11 מַַַםס ; ("ץצהת. סעא1116)"8500%1 סטקם1 מ155%6268 (()1116.1811 סטסם1) 15 ;1 >> "עתכ.סעא1א2008 6ת1תסקס מסעעם" >> 5ש6ס 1-6 ו ((()5116.5811 6טסת1 )!‏ 68 (()2116.605 סטסם1 !))16ותש ו ;((6ם812605)11 ,6ת6)11ת5116.06611 סגוסםת1 (()5116.1811 6טסם1 !) 15 ;801 >> 6םת11 >> סטסס סגירת קובץ בסיוס הרצת התוכנית, מערכת ההפעלה סוגרת את כל הקבציס שנשארו פתוחים (אם לא נסגרו קודם לכן על ידי התוכנית). למרות זאת, טוב לסגור קבציס אשר אין להן שימוש במהלך ביצוע התוכנית. כדי לסגור קבציםס יש להשתמש בפונקציה 6|056 כפי שמוצג כאן: ;()5116.01086 סגוסת1 בעת סגירת הקובצ מתבצע עדכון של פרטי הקוב בטבלת ניהול הקבציס של מערכת ההפעלה. בחירת צורת הפתיחה של הקובץ בתוכניות הקודמות התבצעו פעולות הקלט/פלט בקבציסם חדשיס. במקריס רביס נרצה לכתוב את הנתוניס בקוב\ פלט בהמשך לנתוניס הקיימיס בו ועל כן יש לפתוח את הקוב באופן שהמידע יתוסף בסופו. כדי לבצע זאת, ניתן לקבוע את צורת הפתיחה של הקוב על ידי ציוו קוד מתאיס בפרמטר השני במשפט יצירת העצם. הנה דוגמה: ; (מק105::8 ,"דאם.טאתאםת11ת")5116 סגמקסטס מ155%6268 הפרמטר סס105::8 מציין את אופן הפתיחה של הקוב. בטבלה 34.1 מוצגיס הערכים המקובלים לציון אופן הפתיחה של קבצים. 4 ++6 בקלות טבלה 34.1: ערכי קוד הפתיחה הקבצים. קוד הפתיחה סס8:: 6 6 %טס: 6חטס:: 5 0 :פס 0: 0: 0: 5 מטרה פתיחת הקוב\ להוספה והצבת המצביע של הקובצ בסוף הקוב>. הצבת המצביע של הקובצ בסוף הקוב>. פתיחת הקוב\ לקריאה. אס הקוב אינו קיים, הוא אינו נוצר והפונקציה מחזירה ערך המציין תקלה. אם הקוב קיים, פעולת הפתיחה נכשלת, והפונקציה מחזירה ערך המציין תקלה. פתיחת הקוב> לכתיבה. דריסה של (כתיבה על...) תוכן הקובצ הקייס. הכתיבה לקובץ או הקריאה ממנו, מבוקרת באמצעות מצביע (ושזחוסט) הערה של הקובץ אל המקום שבו צריך לכתוב או לקרוא ממנו נתונים. בעת 7 פתיחת קובץ המצביע נמצא בתחילתו. כדי להוסיף נתונים בסוף קובץ קיים, או לקרוא נתונים מקובץ קיים, עלינו להעביר את המצביע אל המקום הרצוי בקובץ. עושים זאת בהוראה מתאימה על ידי הפרמטר השני 05:80 או 05:8%06ו, כפי שנראה בהמשך. במשפט הבא פותחים את הקוב\ לכתיבה. קוד הפתיחה 866!ק6זסח:105 מונע כתיבה על קוב קייס בשם ה (זוהי הגנה מפני טעות בכתיבת שס הקובצ). ; (1806ק6עסת: :108 6טס: :108 ,"שא . המאתא11ע")5116 6טקסטס 15562088 פעולות קריאה וכתיבה בתוכניות שהוצגו עד כאן התייחסו פעולות הקריאה וכתיבה בקוב למחרוזות תוויס. בתוכניות מורכבות יותר פעולות קריאה וכתיבה בקוב> תתייחסנה למערכים או רשומות. לפעולות בסוג וה של נתוניס יש להפעיל את הפונקציות 7680 ו-סזוזוו. לפני שנוכל לעשות זאת, עלינו להגדיר מאגר בזיכרון אשר יטפל בנתונים, וגם לצייו את גודלו הנמדד בבתיס ; ((051062ס)812601 ,05562מ)5116.2680 סגוסםת1 ;((ע156טק)812605 ,1562טס)2166ח.5116 סגמקסטס פרק 34: פעולות פלט/קלט בקבצים 345 בתוכנית ;<6.דטס טאז5 מתואר השימוש בפונקציה ‏ פוש כדי לכתוב בקובצ\ 3% את תוכן מבנה הרשומה 66עס!קוח6. <ת.ת108%208> 010₪6םת1 <ת(.ת5%268+> 0100₪66ם1 (ס10סט) ת1נאת ב1סט / ] 766ץ10קתס 06סטמ56 ;[64] סתאם עַַַםת0 7 ס>םב ;ץ58182 11086 ;[ן 25000.0 ,33 ,"ססכע מםסט" + = עסאמסש ן[ ; ( "לתס.. ספ ")5116 קתס ת0185%208 ; ( (766ץ60010) 812601 ,02%62ח8 (* 82ת2166))0ח.5116 קתס הפונקציה פפחצ\ מקבלת מצביע למחרוזת ו תווים, ולכן משתמשיס בביטוי המתאס (* ז8ה6) כדי לאפשר העברה לפונקציה של מצביע מטיפוס אחר. בצורה דומה, בתוכנית 9פס.א1 טפז5 מתואר השימוש בפונקציה 7680 לקריאת רשומת עובד מתוך הקוב>. ; ("7תס. ₪ <ת.0ת108%208> 01066ם1 <(.ת5%268+> 0100₪6ם1 (ס1סט)תנאת ה1סט \ ] 766ץ10קתס 6סטמ56 ;[64] סתאם עַאַםת0ס 7 ס>סם1 ;ץ58182 11086 ;ץסאתסט [ מצסתפאמ ")1116 קת6 מ(1556268 ; ( (60ץ10קת0) 812605 ,62א6₪02% (* 85ם5116.2680))0 קתס 1% ;1בם 6 ++6 בקלות 40 >> שתהת.62א2סח >> סגוסס 1 >> 62.866א2סח >> סגוסס 6 >> שע62.858182א2סח >> סגוסס סיכום בתוכניות שהן יותר מאשר תרגילי תכנות, דרושות פעולות בקבצים, המהווים את מאגר המידע של התוכנית. לפני שנעבור לפרק הבא, נבחן אם מובנים לנו הנושאיס הבאים: / / % / / בקובצ כותר ח.ו15068₪ מוגדרות המחלקות 1/5768 ו-0/507080, המאפשרות לבצע פעולות קלט/פלט בקבצים. כדי לפתוח קוב לפעולות קלט/פלט יש ליצור עצס מטיפוס 150768 או מטיפוס וח768ז015, ולהעביר לבנאי המחלקה את שס הקוב הרצוי. לאחר פתיחת הקוב לקריאה או כתיבה, ניתן להשתמש באופרטורים '<<' (ח0ו07860א6) או '>>' (חסוזז56ח1) כדי לקרוא נתונים מהקובצ או לכתוב בו נתונים, בהתאמה. הפונקציות 06% ו-+וק מאפשרות לקרוא תו בודד מקובצ ולכתוב תו בודד לקוב\, בהתאמה. הפונקציה 6חו96 מאפשרת לקרוא שורה שלמה מתוך הקוב\. הפונקציה 606 מאפשרת לבדוק את ציון סוף הקובצ. בדיקה זו חשובה מאוד, מכיוו שבדרך כלל מתבצעת בתוכנית סריקה של קבציס עד למציאת ציון סוף הקוב. הפונקציה |8|1 מאפשרת לבדוק את הסיוס המוצלח של פעולות קלט/פלט בקבצים. הפונקציות 680 ו-פואו מיועדות לקריאה, כתיבה וטיפול בקבציס המאחסניס מערכים או רשומות. בסוף הטיפול בקובצ מומלצ לסגור אותו על ידי שימוש בפונקציה 56ס|6. בפרק 35 נציג כיצד לשפר את ביצועי התוכניות על ידי שימוש בפונקציות משולבות (05ו6 10 6הוזוח1). פרק 34: פעולות פלט/קלט בקבצים 347 תרגילים 1 108 מה עושה התוכנית הבאת: <ם.105%26880> 61066ם1+ <ם.ת5%268+> 61066ם1+ (10סט) ת81ת 18סע ָ 7 עבת ;( תתדק )5 ת1556268 ((()1.605!) 886 (()5.5811!)) 16נ1תשט ָ ;(1 ,1.2686)80 2 >> סשטסס כיתבו תוכנית הכוללת מחלקה בשס 00!6ס6ק, בעלת הנתוניס הבאים: שס פרטי, שס משפחה, וגיל. כיתבו פונקציות לכתיבה וקריאה של תוכן האובייקט אל קבציס. הגדירו פונקציות 680ז ו-ווזאו מתאימות. כיתבו את הפעולות של התרגיל הקודס על ידי העמסת האופרטורים >>, << בפעולה עס קוב\: ; (ק 600168 ,0 0628%02>>)08%26808 055268(6ס 06ם16ת12+ ; (ק 600168 ,0 628%0%<<)18%26808ק0 6ת(055268ס 06ם16ת:1+ כיתבו תוכנית המאפשרת למשתמש לכתוב הערות לקובא. התוכנית תבקש מהמשתמש שם קובצ לעריכה, ואז תציג את הקוב אס הוא קייס, ותאפשר למשתמש להקליד הערות לסופו של הקובץ, עד להקשת צירוף התוויס ס-|60ח60 (04 ז8ח60). ++6 בקלות טונקציות לעוולבות וקוד אפלבלי בתוכנית בתוכניות ובמחלקות שהוצגו מהפרק השמיני ועד כאן השתמשנו בצורה מורחבת בפונקציות. למדנו שהחיסרון הבולט של שימוש בפונקציות הוא תקורת זמן הביצוע (630וסט0), כלומר - הארכת משך זמן ההרצה הנובעת מהעתקת הפרמטריס למחסנית בכל פעם שקוראיס לפונקציה. בפרק זה נציג שיטה מיוחדת להגדרת פונקציה המונעת את תהליך העתקת הפרמטריס של הפונקציה למחסנית שיטת הקוד המשולב (6006 6חווח1). דבר זה מוריד בצורה משמעותית את זמני הביצוע והתגובה של התוכנית על ידי חיסכון של זמן התקורה של הקריאה לפונקציה. פונקציות אלו נקראות פונקציות משולבות (6%1005ח0+ 6חזוח1). בהמשך הפרק נדון בנושאים הבאים : % כדי לשפר ביצועים על ידי חיסכון בוזמן התקורה לקריאה לפונקציות, אפשר להורות למהדר ++6 לשלב את קוד הפונקציה בין פקודות התוכנית, בדומה לפיתוח פקודות המאקרו במקוס שהמאקרו נכתב. > באמצעות פונקציות משולבות, התוכנית מובנת יותר וגם ארוכה יותר (הפונקציות מפורטות במקוס שהן דרושות), אך נמנעת התקורה שנובעת מהעברה ושליפה של פרמטרים למחסנית כאשר מבצעיס קריאה לפונקציה. > כתלות בדרישות התוכנית, צריך לפעמיס לצרף שגרות בשפת אסמבלי כדי להשלים מטלות תכנות מסוימות. > כדי לפשט את השימוש בתוכניות בשפת אסמבלי, אפשר להגדיר בתוכנית ++6 פונקציות אסמבלי משולבות. כפי שלמדנו, הדרך הטובה לשלוט בשפת ++6 היא לבצע ניסיונות שוניס וחוזרים בהרצת התוכניות המוצגות בספר. לכן נחזור ונמליץ להשקיע זמן בתרגול הנושאיס שבפרק וּה. פרק 35: פונקציות משולבות וקוד אסמבלי בתוכנית | 349 פונקציות משולבות כאשר מגדיריס פונקציה בתוך התוכנית, מהדר שפת ++6 ממיר את קוד הפונקציה לפקודות בשפת מכונה, והוא שומר העתק אחד בלבד של פקודות אלו בתוכנית. בכל פעס שהתוכנית קוראת לפונקציה, המהדר מציב במקוס הקריאה סדרה של פקודות המיועדות להעברת הפרמטריס של הפונקציה למחסנית לצורך הביצוע. בסיוס ביצוע הפונקציה, התוכנית ממשיכה במשפט הראשון הסמוך למשפט הקריאה לפונקציה. העברת הפרמטריס למחסנית וקפיצת התוכנית למקוס בו נמצא קוד הביצוע של הפונקציה מוסיף לתוכנית תקורת זמן (0ב6ז זסט0). דבר זה גורס להאטת ביצוע התוכנית. לחילופין נניח שבכל מקוס שבו קוראיס לפונקציה, המהדר היה מציב עותק של פקודות הפונקציה ומשתמש בפרמטריס הזמיניס לו מבלי לטרוח להעביר אותס למחסנית. כלומר, אנו משלבים את קוד הפונקציה בקוד התוכנית. כעת נתבונן בתוכנית ;ק0.ק855!ו68. בתוכנית ‏ וו מתבצעות שתי קריאות לפונקציה 6 שוסח5 המציגה הודעה על המסך תוך השמעת מספר צפצופים ברמקול המחשב. <ת.ת108%2608> 61086ת1+ (685806ת* 0282 ,6תטסס 6ם655806)1ת טסם8 בנסע ָ 12 16 (++1 ;%ם00%0 > 1 ;0 = 1) 1058 ;'ה8\' >> מגו0ס0ס ;1 >> 5866פסת >> סגוסס (16סט) מ1את ה1ס7 ן ; ("++6 צסם 26500686" ,655806)3ת חסם5 ; ("35 ם165880" ,655806)2ת אסם5 1 בתוכנית הבאה 611.69 סא, אין קריאות לפונקציה 655806 שצוסח5. במקוס בו היו צריכות להתבצע קריאות לפונקציה, מוצביס המשפטיס של הפונקציה עצמה. בדוגמה זו מופיע הקוד של הפונקציה פעמיים - ראה להלן. <ת.ת108%208> 610866ת1+ (16סט) מ1את ה1סע ן יתיר (++1 ;3 > 1 ;0 = 1) מ10 ;'ה8\' >> 000 0 ++6 בקלות ;601 >> "++0 צס 6טספ265ת" >> סגוסס (1+4 27 > 8 ;0 = 1) ע0ס1 ;'ה8\' >> 000 ;01ת6 >> "35 ת6550ת" >> 0006 ] שתי התוכניות הקודמות פועלות בצורה והה ומפיקות את אותו הפלט. מכיון שבתוכנית ||68 6ח לא מבצעיס קריאות לפונקציה 655806 שצוסח5, בביצוע מהיר ביחס למהירות הביצוע של תוכנית 68|!5660. במקרה וה קשה להבתין בהבדלי מהירות הביצוע מכיון שהתוכניות פשוטות ויש בהן שתי קריאות בלבד לפונקציה. אולס בתוכנית שקוראיס בה 1000 פעמים לפונקציה, ניתן להבחין בשיפור הביצוע. התוכנית ||68 סח מהירה יותר מתוכנת 68/0660 ולעומת ואת, התוכנית האחרונה ברורה ומובנת יותר. מן הראוי לציין, שהתוכנית ||₪3 סח עלולה להיות ארוכה יותר, מכיון שקוד הפונקציה מופיע פעמיים, ולא פעס אחת, כמו בתוכנית 660םו|68. בתהליך כתיבת מערכות מחשב עולה השאלה מתי להשתמש בפונקציות רגילות ומתי כדאי יותר להשתמש בפונקציות משולבות. התשובה תלויה בדרישות התוכנית: ניתן לומר, שבתוכניות רגילות שימוש בפונקציות רגילות טוב יותר. לעומת ואת, כאשר זמני התגובה בתוכנית חשובים במיוחד מומלצ להשתמש בפונקציות משולבות, מכיון שהן מורידות את הזמן המבוזבו בתהליכי הקריאה לפונקציה. אחת הדרכיס המוצעות להורדת תקורת הקריאה לפונקציות מתוארת בתוכנית 6414 סא. כפי שאנו רואים, יישוס וה מוריד את הבהירות ואת יכולת ההבנה של התוכנית. אך למזלנו, שפת ++6 מכילה את המילה השמורה פחווחו, המאפשרת לנו ליהנות מהטוב שבשני העולמות. המילה השמורה 6חווחו שפת ++6 מאפשרת להציב לפני כל הגדרת פונקציה את המילה השמורה שחווחו. בשלב ההידור, יוצב עותק מלא של משפטי הפונקציה בכל מקוס בו מתבצעת קריאה לפונקציה זו. המהדר יכתוב את המשפטים על פי הפרמטריס שבקריאה לפונקציה. בצורה זו אין מורידים מבהירות התוכנית, אך משפרים את זמני הביצוע שלה, כי מורידים את תקורת הזמן (0670680) הקשורה בתהליכי הקריאה לפונקציה. בתוכנית 9פס.פא1וא1 מוגדרות שתי הפונקציות חווח ו-א8וח כפונקציות משולבות. <ת.ת108%2608> 61086םת1+ (ע %ם1 ,8 %ם1)אהת %ם1 6ם11ם1 ן (סם < 8) +1 ; (8) תעט66? 16 ; (ס) םעט266 פרק 35: פונקציות משולבות וקוד אסמבלי בתוכנית ‏ 351 (ע %ת1 ,8 12%)תנת %6ם1 6ם11ם1 \ (ע > 8) 15 ; (8) ם2גו26%6 16 ; (ס) ם2גו26%6 (ס1סט) מ1את 1סע | " 18 2002 6םת8 1001 05 תנת 6ם7" >> 0006 ;01ת6 >> (2002 ,1001)מת1ת >> " 18 2002 6ם8 1001 01 אהת 6ם7" >> סגוסס ;01ת6 >> (2002 ,1001)א8ת >> בתוכנית וו, בכל מקוס שבו מתבצעת קריאה לפונקציות המשולבות יוצב עותק מלא של משפטי הפונקציה המתאימה. כך, ומני התגובה של התוכנית משתפרים מבלי לגרוע ביכולת הבנתן של התוכנית. נשיס לב לכך שתוכנית המקור נשארת ללא שינוי והיא ברורה, כפי שרצינו. השינוי הוא של המהדר בתוכנית הביצוע. פונקציה משולבת, מה היא? בכל מקוס בו מתבצעת קריאה לפונקציה זו יוצב עותק מלא של משפטי הפונקציה תוך התאמת משפטים אלה לפרמטרים הנדרשים. הדבר קורה כאשר המהדר מוהה את המילה 6ח!|חו לפני הגדרת הפונקציה. בדרך זו מקבליס פונקציה משולבת (חסט6חט 6חו!ח1) בקוד התוכנית בכל מקוס שהיא דרושה, לעומת פונקציה שנמצאת בתוכנית פעס אחת בלבד ו"קופציסיי אליה לשס ביצוע. בדרך וו משפרים את ומני הביצוע של התוכנית על ידי הורדת תקורת הזמן הקשורה בתהליכי הקריאה לפונקציה. יחד עס ואת, נשמרת בהירות התוכנית (מן הראוי לשיס לב שהתוכנית עלולה להיות ארוכה יותר כתוצאה משכפול הקוד של הפונקציה פעמיס רבות). פונקציות משולבות במחלקה ניתן להגדיר פונקציות מחלקה בתוך המחלקה עצמה, או מחוצה לה. לדוגמה, במחלקה 6010/66 פונקציות המחלקה מוגדרות בתוך המחלקה. ] 766ץ10קת6 0185855 :טס (צע5818 1108% ,ת0ס161פסק* 8%9ם0 ,פתהת* כַַםס) 766ץ10קתס ו ; (סתהת ,סתהּת: :766ץ10קת6) ץ56200 ; (ת0891%10סק ,ם1%10פסס::766ץ10קת6) 56200 2 ++6 בקלות ;ץע5818 = צץע10766::5818%סתס ] (10סט) 10760קת6 טסם8 16סע \ 12 >> סתת >> " :פתהא" >> סטסס 2 > 051810 >> " :ם1610פסק" >> 0006 17 >> 7ע88182 >> "5 :581827" >> 0006 ] : 66הטנ1עס ;[64][סתאם עַַ8ם0 ;[64]ם051%10 ע8ם0 ;ץ818%פם 11086 ;ו הגדרת פונקציות המחלקה בתוך המחלקה עצמה היא הדרך הרגילה ליצירת פונקציות משולבות בתוך המחלקה. בצורת הגדרה זו, קוד הפונקציה מועתק לכל עצס שנוצר מטיפוס המחלקה. יתרון השיטה הוא שיפור בביצוע התוכנית. התיסרון הוא שהתוכנית גדלה ככל שמרביסם ביצירת עצמים. חיסרון נוסף הוא הורדת רמת הבהירות של קוד המחלקה, בגלל הוספת הגדרות הפונקציות בתוך הגדרת המחלקה. כדי לשפר את רמת הבהירות של הגדרת המחלקות, ניתן להוציא את הגדרת הפונקציה מחוץ למחלקה ולהציב לפני שס הפונקציה את המילה השמורה 6חווחו. לדוגמה: הגדרת הפונקציה הבאה גורמת למהדר להפעיל את כללי הפונקציה המשולבת עבור הפונקציה 66ץסוקח6 ששסח5. (010סט) 10760קת6 שסם8: :6010766 16סט 6ם11ם1 ו 2 >> שתהת >> " :ס6תהא" >> סגוסס 2 > 051610 >> " :ם1610פסק" >> 0006 2 %>> 4ע88182 >> "5 :581827" >> 0006 שילוב קוד אסמבלי בתוכנית בפרק ראשון למדנו שניתן לכתוב תוכניות תוך שימוש במיגווו רחב של שפות תכנות. מהדר השפה מתרגם את משפטי התוכנית לקוד מכונה, שהוא השפה שבאמצעותה המחשב מסוגל לבצע את התוכנית. שפת אסמבלי היא שפת בינייס הנמצאת בין שפת תכנות עילית (כמו 6, ++6 או פסקל) לבין שפת מכונה. שפת אסמבלי משתמשת בקודיס ובסמליס שוניס המייצגיס את פקודות שפת המכונה. לפעמים, לפי דרישות התוכנית צריך לכתוב פקודות באסמבלי המשתלבות בתוכניות הכתובות בשפת ++6. כדי לבצע משימה זו יש להשתמש במשפט 850 של שפת ++6. אנו מציגיס את המשפט הזה כדי להשליס את המידע אודות השפה. ברוב התוכניות שנכתוב אין צורך לשלב משפטיס בשפת אסמבלי. פרק 35: פונקציות משולבות וקוד אסמבלי בתוכנית 353 בתוכנית 2ק₪5%.0 םפש מתואר השימוש במשפט ‏ 850. משפטי אסמבלי שבדוגמה גורמיס להשמעת צפצוף ברמקול המחשב הפועל בסביבת עבודה 05פ. שיק 6 ! תוכנית זו פועלת בגירסה 3.1 ++6 0ח8!ז80 ומעלה בלבד. <ת.ת108%20608> 61086ת1+ (16סט) מ1את ב1סע | 12 >> "!611ס פת6 6תט0פ5 60 סטססת" >> סטסס + תפה 2 טסא 7 טסא 12 אאך ] 12 >> "!פתסכק" >> סגסס סיכום פונקציות משולבות (60005ח0 6חו|ח1) משפרות את ביצועי התוכנית על ידי הקטנת התקורה של השימוש בפונקציות (אין צורך יילקרואיי להן). בפרק זה למדנו כיצד ומתי להשתמש בפונקציות משולבות בתוכניות שונות. למדנו גם שלפעמיס צריך לכתוב שגרות בשפת אסמבלי כדי לבצע משימות מיוחדות. בפרק 36 נראה כיצד התוכניות יכולות לגשת לארגומנטיס של שורת-פקודה, אשר המשתמש מקליד לצורך הרצת תוכנית. אך לפני שנעבור לפרק הבא, הבה נראה אם מובניס לנו הנושאיס שעברנו עד כה: * העברת פרמטרים של פונקציה לתוך המחסנית וקפיצה למקום בו נמצא קוד הפונקציה הן פעולות שגורמות להאטת ביצוע התוכנית עקב תקורת הזמן (680ה67ש0) הנובע מהן. / המילה השמורה 6חו!|חו גורמת שהמהדר יציב עותק של משפטי הפונקציה בכל מקוס בתוכנית שבו מתבצעת קריאה לפונקציה. על כן, תקורת הומן הדרושה לביצוע קריאת הפונקציה נעלמת וזמני ביצוע התוכנית משתפרים, אך התוכנית נעשית ארוכה יותר. / השימוש בפונקציות משולבות (60005ח0? 6חווח1) בתוך המחלקה גורס לשכפול קוד הפונקציה לכל עצס המחלקה שנוצר בתוכנית. בדרך כלל, עצמי המחלקה משתתפים בעותק אחד של קוד הפונקציה. * המילה השמורה 85 מאפשרת לשלב משפטים בשפת אסמבלי בתוך תוכנית הכתובה בשפת ++6. 4 ++6 בקלות תרגילים משולבת בקוד (סחו!חו) ופעס כפונקציה רגילה. בידקו את הפונקציה שנכתבה. :6++ (106ס %6ם1 ,ת6266 6ם1 ,260 סם1 ,א6ת1 ₪ 0 סת1)עס001 866 6% 5 ק0ס0010 מם880 ע0%+ 816886 ע0010 8 5ם681ם00 תס 6מך (6ו51 ,ת260,02066) 6ט810ט 00105 8 0 6 תסט1 8 108 ע010%ס 202 6ם 7 סמסמפעסס 0 א₪6%ם1 00105 6ם6 6ם1ם 1 סרפס 0 7ץ01811ת56006 1069 8 00102 6802 סעסתט .1 66מם28 6םת₪ ם1 ם680 % 8688 מסנ1נססםט+ 18מך 0 לס ,8א6₪60%ם1 00108 הט 302 266ם₪ 6םס בת8 אססת1 00108,א8% טסת 888 עס1סס 06םט0ע80%08%כ-ת502686 6םם 15 זָ 8 טסת 8980 1 סוס 888 א 0סם1 חתפ8 טסת חתפה 1 סגוס 888 מ%266,א8 טסת 898 1 סגוס 888 ס6ט1ס,אה8 טסת תפה8 1 סגוס 888 (10סט) מ1את 6 1% 0 066%ם1 00108 // (()1%םסא!) 16נ1תט 105 )1=0; 1>128; 1++( ] 566 00102)0, )1<=64( ? 127-1 : 1 0 ,)1<=64( ? 127-1 : 3(; ; (20) ץ8 661 0( ; 1 ו 566 00102)0, 0, 7, פרק 35: פונקציות משולבות וקוד אסמבלי בתוכנית כיתבו את הפונקציה כ5\8 להחלפה של ערכים שלמים טחו), פעס כפונקציה התבוננו בתוכנית הבאה, המדגימה שימוש בקוד אסמבלר המשולב בתוכנית בסט ָ // // // // // // ] 1 ְ 5 ארגוענטים עול עשורת הנצקודה כידוע, כאשר מבצעים פקודות דרך שורת הפקודה טקוחסזק וח5/5%6), רוב הפקודות מאפשרות לכלול מידע נוסף בשורת הפקודה, כמו למשל, שס הקובצ עליו הן תפעלנה. לדוגמה, כאשר משתמשים בפקודה ,605 של 05ס-65א, מצייניסם בשורת הפקודה גס את שמות שני הקבציס (המקור והמטרה). בדומה, כאשר מפעילים את המהדר דרך שורת הפקודה, יש להוסיף את שסם קוב המקור המיועד להידור. בפרק זה נראה כיצד יכולות תוכניות ++6 לקבל את הארגומנטיס של שורת הפקודה ולהשתמש בהסם. בהמשך הפרק נדון במושגי המפתח הבאיסם: %> תוכניות ++6 מתייחסות לארגומנטיס של שורת הפקודה כפרמטריס לפונקציה חוהּוח. + ++6 מעבירה שניים, ולפעמיסם שלושה פרמטרים אל הפונקציה חוח. רוב התוכניות מכנות אותס בשמות 8706 ו-צחז8. > הפרמטר 8706 מציין את מספר הארגומנטיס בשורת הפקודה. + הפרמטר צפָזגּ הוא מערך של מחרוזות תווים, המכילות בהתאמה את הפרמטרים של שורת הפקודה. + על פי המהדר שברשותך, התוכנית יכולה לפנות לפרמטר נוסף, צח6. פרמטר זה הוא מערך של מחרוזות המכילות את משתני הסביבה. היכולת לגשת לארגומנטי שורת הפקודה מגדילה את מספר הדרכיס בהם ניתן לקרוא לתוכנית כלשהי. למשל, אנו יכוליס ליצור תוכנת העתקה (ץְ600) משלנו, בה נוכל להשתמש להעתקת קוב\ מקור כלשהו (המוגדר כארגומנט הראשון בשורת הפקודה) אל קוב מטרה כלשהו אחר (המוגדר כארגומנט השני). 6 ++6 בקלות הגישה ל- 6אַזּבּ ו- צטיובּ כאשר מריצים תוכנית דרך שורת הפקודה ב-05כ, שורת הפקודה המוקלדת על ידי המשתמש מועברת לתוכנית : <ע6סתע> 7.200מ6תתץ 0סכ2.מס500 צפסס<\:0 שורת הפקודה מציינת במקרה וה את הפקודה (605%) וכוללת גם שני ארגומנטיס (שס קובצ המקור, 500₪65.006, ושס קובצ המטרה, 06. 14₪651). כדי לאפשר לתוכנית לגשת לשורת הפקודה, ++6 מעבירה שני פרמטרים לפונקציה חופח : ([]טףע8* ע8םת0 ,8260 6ם1)תנאת %הנ1בסט הפרמטר הראשון, ספָזה, מונה את מספר הכניסות במערך עִפָז8. לדוגמה, עבור הפקודה +60 הקודמת, יכיל הפרמטר סְפָזגּ את הערך 3 (שס הפקודה ושני הארגומנטים). התוכנית הבאה, 5₪0/4866.02, משתמשת בפרמטר ספָזג כדי להציג את מספר הארגומנטיס המופיעים בשורת הפקודה: <ת.ת108%268> 61066ת1+ ([]טש0ע8* ע8ת0 ,8280 סת1)תנ1את בנ1בסט ָ >> 8200 >> " 18 פ65םתס6תגו820 6ם11-סתהתתסס 05 מססתטא" >> סגטסס ; 601 1 הנה לפניך דוגמה נוספת להרצת תוכנית, שמזיניס לה מספר פרמטרים : <+6שת> ה 2 ב 2200ח0:\<580 מומלצ לנסות ולהריצ את התוכנית עס מספר שונה של פרמטריסם ולראות מהן התוצאות המתקבלות. המהדר שברשותך עשוי להתייחס אל ארגומנטיס המקובציס ביו מרכאות כפולות כאל ארגומנט יחיד: <ש66ת₪> "%ת6תו0ע8 6םס צץ1םס 18 18ם7" 60התא0:\<580 2 18 %8ם6(ט0ע80 6מם11-תה8תתסס 05 62מתטא צףָזג, הפרמטר השני של הפונקציה חופוח, הוא מערך של מחרוזות תווים, המכילות בהתאמה את מרכיבי שורת הפקודה. תרשיסם 36.1 ממחיש כיצד כניסות המערך צפָזּ מצביעות אל מרכיבים אלה. פרק 36: ארגומנטים של שורת הפקודה 357 1000 1001 1002 1003 34 | 1000 | [0] +פזפ | 0 [1] יפו | 1200 | [2] אפפ 0 1109 1108 1107 1106 1105 1104 1103 1102 1101 1100 [3] זפ 1200 1201 1202 1203 1204 1205 1206 | 1207 | 1208 1209 | ְ 0 תרשים 36.1: המערך עטפָזג3ּ מצביע אל ארגומנטים של שורת-פקודה. התוכנית הבאה, 059.ש53₪0/2₪6, משתמשת במשפט 0+ כדי להציג את כניסות המערך טטָזגּ (כלומר, את שורת הפקודה של התוכנית). התוכנית מתחילה באיבר הראשון של המערך (שס התוכנית) ואז מציגה את שאר האיברים, כל עוד משתנה הלולאה 1 קטן מ-8706 : <ת.ת108%2608> 86ט610םת1+ ([]ט0ע8* ע8ת0 ,82860 סת1)תנ1את ב1בסט ז שת (144 ;82060 > 1 ;0 = 1) 108 2 >> [1]ט7שע82 >> " פםמ1הסתסס [" >> 1 >> "]טסעב" >> סטסס הדרו והריצו את התוכנית הקודמת, והפעילו שורות פקודות שונות. למשל, עבור שורת הפקודה הבאה, נקבל: <צססםם> 0 25 תב טסתתחסם5 <\:0 מאם. טסהתא5308 5מ1ה6תסס [0]ע820 א 5מ681ת600 [1]ע820 9 5מ%81ת00 [2]ע820 0 5ם581ת00 [3]ע820 8 ++6 בקלות הגישה לארגומנטים שבשורת הפקודה כדי להגדיל את מיגווו המטלות שתוכניות מסוגלות לבצע, ++6 מאפשרת להן לגשת לארגומנטיס של שורת הפקודה באמצעות שני פרמטריםס המועבריס אוטומטית וישירות לפונקציה חופוח. הפרמטר הראשון, 96ז8, מכיל את מספר הארגומנטיס בשורת הפקודה (שס התוכנית נחשב כארגומנט וכלול בספירה). הפרמטר השני, עפָז, הינו מערך של מחרוזות תווים, שכל אחת מהן מתאימה לארגומנט בשורת הפקודה. כדי לגשת לארגומנטי שורת הפקודה יש לכתוב את כותרת הפונקציה חו8ח באופן הבא (ניתן כמובן, להחליף את השמות 66 ו-טִפָז3 בשמות אחרים, אך נוהג זה אינו מומלצ, מכיון ששמות אלה מקובליס בספרות כמינוח של ++6): ([]8200* 028% ,8260 6םת1)תנ1את בנ1נסט התקדמות בלולאה עד ש- טפזבּ יהיה | וטא כזכור, תוכניות ++6 משתמשות בתו 11\א (יש לו קוד 45611) כדי לציין את סיומה של מחרוזת תוויס. באופן דומה משתמשת ++6 בתו זה כדי לסמן את הכניסה האחרונה במערך טְ8ַז8. התוכנית הבאה, >קס. ווטאטס6פא, דומה לתוכנית הקודמת, אלא שהיא משנה בה את הפקודה זס1 כדי לבצע לולאה על איברי המערך טפַז8, עד אשר היא מזהה את האיבר האחרון, שערכו 11א (שימו לב - אין שימוש ב-06ז8) : <ת.ת108%2608> 61086םת1+ ([]טש0ע8* ע8ת0 ,8280 סת1)תנ1את בנ1בסט ָ קר תיה (++1 ;תתסא =! [1][ע826 ;0 = 1) ע0ס1 17 >> [1]ט0ע8 >> " 8ם681ת00ס [" >> 1 >> "]ט0ע82" >> ס6טסס ו הערל = ביצוע לולאה לסריקת איברי מערך נקראת לעיתים בשם "איטרציה". 07 פרק 36: ארגומנטים של שורת הפקודה 359 צפזהּ כמצביע כפי שלמדנו, ++6 מאפשרת לגשת למערכים באמצעות מצביעים. התוכנית הבאה, 6 דקשט6חה, מתייחסת ל-צפָזה כמצביע למצביע מחרוזת תוויס (במילים אחרות, מצביע למצביע) ומציגה את ארגומנטי שורת הפקודה באופן הבא : <ת.ת108%2608> 86ט610םת1+ (טףסע8** ע8םת0 ,8260 סםת1)תנ1את ב1בסט ן 2 = 1 %6ם1 (טףע8*) 116תט ;801 >> ++00ע8* >> " 8ם1א68ת0סס [" >> ++1 >> "]טשעה8" >> סגוסס בחנו את ההצהרה של הפרמטר צחז3 בכותרת פונקציה חו8וח הבאה: (צסע8** | ע8ת0 ,38280 סת1)םנהת בנ1סע הכוכבית הראשונה מציינת למהדר כי טפז הינו מצביע, והכוכבית השנייה מציינת כי צפָזֶהּ הינו מצביע למצביע - במקרה זה, צִפָז הינו מצביע אל מצביע מסוג ז8ח6. חישבו על צפָזה3 כעל מערך של מצביעים, שכל כניסה בו מצביעה למערך של תוויס - 6081 (מחרוזת). שימוש בארגומנטים של שורת הפקודה התוכנית הבאה, 5540.699 וזז, משתמשת בארגומנטיס של שורת הפקודה כדי להציג על המסך את תוכן הקובץ המצוין כארגומנט השני בשורת הפקודה. לדוגמה, הפעלת שורת הפקודה הבאה תגרוס להצגת תוכן הקוב אא6.0אאססאט8 (שנמצא בספריית השורש) על המסך: <+6סתם> - דתם.6מאתסדטסת\ 11₪5808ת<:0 התוכנית 622.ש55₪0ו1פ, מתחילה בבדיקת ערכו של הפרמטר 86ז8 כדי לוודא שהמשתמש אכן ציין קובצ מקור כלשהו בשורת הפקודה. אס שורת הפקודה אכן כוללת שס קובצ, ערכו של הפרמטר 87086 יהיה 2. לאחר מכן, התוכנית פותחת את הקובצ ומציגה את תוכנו תוך שימוש בטכניקות שנלמדו בפרק 34. אס התוכנית אינה מצליחה לפתוח את הקובצ, היא מציגה הודעת שגיאה ומפסיקה. 0 ++6 בקלות ([]טסע8* ע8םס ; [0ת6 >> "ספת8ת1110 8 , <ת.ת108%208> 010₪6ם1 <ת.ת5%268+> 010066ם1 <ם.58560110> 010₪6ם1 ,6 סת1)תנ1את %ה1סט | ;[6]256ם11 עַַַת0ס + \ ץ6015ק5 פפטת טסצ" >> עע6ס ; (0%1%6)1 (2 > 060ע82) ו ; ([1][ט1116)826 סטקם1 מ155%268 (()5116.1811 6טסם1) 15 ;601 >> "עתכע.סעא20081 6ת1תסקס מסעעם" >> שעסס 1-6 ו ((()52116.5811 סטסם1!) 86 (()5116.605 סטסם1 !)) 16נםט ו ;((6ם812605)11 ,6ת6)11ת5116.06611 סוסת1 0( , 1 סמסמססטסת1 2 >> 6ם11 >> סגו00 151 גישה למשתני הסביבה של מערכת ההפעלה רוב מערכות ההפעלה מאפשרות להגדיר משתני סביבה (560005 %חסוהחסזוטחם) שתוכניות יכולות לגשת אליהם כדי לנצל ואף לעדכן משתני סביבה שוניס. משתנה כזה, לדוגמה הוא נתיב הפקודה (8%7 חאו 60). בסביבת 05כ-65, למשל, יש להשתמש בפקודה 5%% כדי לקבוע או להציג משתני סביבה. כתלות בסוג המהדר שברשותך, ייתכן שבאפשרותך לגשת למשתני הסביבה מתוך תוכניותיך על ידי שימוש בפרמטר שלישי לפונקציה חו8חח, פרמטר צח6. כמו הפרמטר טפזג, גם פרמטר זה הינו מערך של מחרוזות המסתיים בכניסה 11(וא. אס ברשותך מהדר התומך בפרמטר צח6, תוכל לכתוב את כותרת הפונקציה חו8ח באופן הבא: ([] טםפ* עַםת0 ,[][צטסעה8* ע8ם0ס ,6 סת1)תנ1את ב1סט פרק 36: ארגומנטים של שורת הפקודה ‏ 361 התוכנית הבאה, 699.עאפששסו5, סורקת בלולאה את איברי המערך שחס6, כדי להציג את משתני הסביבה של התוכנית : <ת.ת108%2608> 61086םת1+ ([]טת8* ע8%םת60,[]טשע8* עאםת0ס ,8260 סםת1)תנ1נאת ב1בסט \ (טמת8*) 116גש ; [0ת6 >> ++טתה8* >> סטסס ו התוכנית מתקדמת בלולאה על פני כניסות המערך צח6 עד שהיא מגיעה לערך 1וטא (הכניסה האחרונה במערך). כאשר מהדריס ומריציס את התוכנית, יוצגו משתני הסביבה הקיימים במחשב, כמו למשל: <עס6תם> עאמאס58 <\:0 קאמ \ פסקא1א\ : 6=פאתד =דסתת אס . פא ס0\ פאספא1א\ : 286=6 005 6:\8; פ5אסקא1א\ : 6=מידתק גישה למשתני הסביבה כתלות בסוג המהדר שברשותך, התוכניות שתריצ תוכלנה לגשת להגדרות הסביבה של מערכת ההפעלה תוך שימוש בפרמטר שלישי, עח6, לפונקציה חו8ח. כמו הפרמטר צסְזה, גם צח6 הוא מערך של מצביעיס למחרוזות המצביעיס בהתאמה על הגדרות (פרמטריס) של הסביבה שנמצאות באיברי המערך. כדי לגשת אל הגדרות הסביבה האלו תוך שימוש בפרמטר שח6, יש לכתוב את כותרת הפונקציה חווח באופן הבא : ו |[ | א ו ה 56 ו ו ו סיכום כדי להעשיר את מיגוון המטלות שתוכניותיך מסוגלות לבצע, ++6 מאפשרת להן לגשת ולנצל את הארגומנטיס של שורת הפקודה. בפרק 37 נלמד כיצד יכולות פקודות מאקרו וקבועי שמות לפשט את התכנות ולהפיק קוד קריא וברור יותר. לפני שנמשיך, הבה נבחן את ידיעותינו: * כאשר מריצים תוכנית דרך שורת הפקודה טקוחסזס ה5/560) של 05כ, הנתונים שהוקלדו אחרי שס התוכנית הופכים לארגומנטיס של התוכנית. / כדי לאפשר לתוכנית לגשת לארגומנטיס של שורת הפקודה, ++6 מעבירה שני פרמטרים, 3706 ו-עחָזהּ, אל הפונקציה חופוח. 2 ++6 בקלות / / / הפרמטר 86זה מכיל את מספר הארגומנטיס בשורת הפקודה. הפרמטר עְפָז8 הינו מערך של מחרוזות, אשר כל אחת מהן מכילה בהתאמה ארגומנט של שורת פקודה. כתלות במהדר שברשותך, התוכניות שתריצ תוכלנה להוסיף לפונקציה חוח את הפרמטר טחס6, שהינו מערך של מחרוזות המכילות את הגדרות הסביבה. תרגילים כיתבו את הפונקציה ץק0ס: התוכנית מקבלת שני פרמטרים של שורת הרצה (שני שמות קבציס) ומעתיקה את תוכן הקוב\ הראשון (אם אינו קיים, היא מודיעה על שגיאה) אל הקוב השני. כיתבו את הפונקציה ק6זף: התוכנית מקבלת כפרמטריס בשורת ההרצה שם של קובצ ומחרוזות. התוכנית תדפיס את כל שורות הקובץ המכילות לפחות את אחת מהמחרוזות, ותציין עבור כל שורה כזו את מספרה הסידורי בקוב\. כיתבו תוכנית המדפיסה את צח6 ואת צפָזה, אבל בסדר הפוך לסדר קליטתן (מהסוף להתחלה). כיתבו תוכנית המקבלת פקודת 05 ושמות של קבצים, כפרמטרים בשורת הרצה, ותפעיל את הפקודה על כל אחד מהקבצים. העדת: מיצאו והיעזרו בפונקציית הספריה 5. פרק 36: ארגומנטים של שורת הפקודה 363 עיונלוש בקוצועים ו בהוראות מלאקרו כדי לסייע למתכנת לכתוב תוכניות קריאות יותר, ++6 תומכת בשימוש בקבועיס בעלי שמות (8ח5%9ח60 ססוחה8\) ובהוראות מאקרו (01766065. 0ז136). השימוש בקבועי שמות בקוד המקור מאפשר להחליף ערך מספרי, כמו 50, בקבוע שס בעל משמעות, כמו 'יגודל-כיתהיי, 5125 455 61. כאשר מתכנת אחר יקרא את התוכנית, לא יהיה עליו לנחש כל פעס מהי משמעות הערך המספרי 50 שהוא רואה כרגע בקוד. בכל פעס שייייתקליי בקבוע 5125 455 61, יהיה לו ברור, שקבוע זה מכיל ערך המתאיס למספר התלמידיסם בכיתה. באופן דומה, על ידי שימוש בהוראת מאקרו, ניתן להחליף שימוש מסורבל במשוואות מורכבות כמן: ; (ב-ץ*א) * (3-ץ*א) * (3-ץ*א) = 16גו268 בהוראות מאקרו 6085, כפי שנראה להלן (תחביר השימוש במאקרו דומה לוה של קריאה לפונקציה): ; (3-ץ*א) 0006 = 698016ע2 במקרה וּה, המאקרו לא רק משפר את קריאות הקוד, אלא גם מפשט את המשפט ובכך מפחית את הסיכוי לטעות. בהמשך הפרק נדון בנושאיס הבאים : + כדי להפוך תוכניות לקריאות יותר, נהוג ורצוי להחליף ערכיס מספרייס בקבועי שמות בעלי משמעות. > השימוש בקבועי שמות במקוס בערכים מספריים מקל על עריכת שינויים ועל הטיפול בתוכנית. > ++6 מאפשרת לפשט את כתיבתן של משוואות מורכבות, על ידי שימוש בשמות מאקרו בעלי משמעות. > לפני הידור התוכנית, מפעיל מהדר ++6 תוכנית מיוחדת הנקראת קדם-מעבד (ז066550זק6זק). תוכנית זו מחליפה כל משתנה שס והוראת מאקרו בערך המתאיס להם (ערך מספרי למשל, או ביטוי מתימטי, בהתאמה). % הוראות מאקרו מתבצעות מהר יותר מאשר קריאות לפונקציות, אך לעומת זאת, הן גורמות לגידול באורך הקוד (התוכנית בשפת מכונה). * רוב מהדרי ++6 מגדיריס מראש קבועי שמות והוראות מאקרו שבהס ניתן להשתמש בגוף התוכנית. 4 ++6 בקלות השימוש בקבועי שמות קבוע שם 60050800 60וח8\\) הוא אוסף תוויס חוקי, המקבל ערך קבוע, ואשר בניגוד לערכו של משתנה, אינו יכול להשתנות בעת ריצת התוכנית. ניתן ליצור קבוע שס על ידי שימוש בהוראה 6ח%666. הוראה זו מיוחדת המיועדת עבור קדס-המעבד של המהדר. לדוגמה, המשפט הבא מגדיר את קבוע השס 5125 61/55 כבעל ערך 50 : 50 ₪1 [(?517 01255 6ם0651+ כדי להבדיל בין קבוע שס לבין משתנה, נהוג להשתמש באותיות גדולות (0616856ם) לתיאור קבועי שמות. התוכנית הבאה, כק6005%80%.6, מגדירה ומציגה את קבוע השס 5125 61]255. <ת.ת108%2608> 61086ת1+ 8 6 ם1 88מ56006 0% פסשמתטא // 50 5128 01255 06116 (10סט) תנאת 18סע | 2 >> 5128 012585 >> " 18 סת568ת00 5128 61255" >> סטסס \ 1 1 כפי שניתן לראות, הגדרת הקבוע נעשית על ידי שימוש בהוראה 406806 שנמצאת סמוך לתחילת התוכנית. לאחר הגדרת הקבוע, ניתן להשתמש בערכו במהלך התוכנית על ידי התייחסות לשמו. שים לב שהגדרת הקבוע לא מסתיימת בנקודה-פסיק. כתיבת נקודה-פסיק הערה בסוף ההגדרה, תגרום לקדם-המעבד לכלול את התו נקודה-פסיק בתוך 7 ההגדרה. לדוגמה, אם כותבים נקודה-פסיק אחרי הערך 50 בהוראה וא של התוכנית ?ס.דאגזפאס6, קדם-המעבד יחליף כל הופעה של הקבוע 5125 61455 בערך ;50 (הערך 50 ולאחריו נקודה-פסיק). קרוב לוודאי, שהחלפה זו תגרום לשגיאת תחביר. פרק 37: שימוש בקבועים ובהוראות מאקרו 365 הבנת הגדרות קדם-המעבד כשלב ראשון בהידור התוכנית מריצ המהדר תוכנית מיוחדת הנקראת קדס-מעבד (ז607006550ק) קדס-המעבד בודק אילו שורות בתוכנית מתחילות בתו % (למשל 6ח06א, או 61006ח41). כאשר לדוגמה, תוכנית קדס-המעבד נתקלת בהוראה 61₪06ח81, היא מכניסה את הקובא הכתוב בהוראה זו אל קובצ המקור של התוכנית, כאילו התוכן שלו הוקלד ישירות לתוך קוד המקור (שים לב שכל התוכניות המופיעות בספר זה השתמשו בהוראה פסנטוסחוא, כדי להורות למעבד הראשוני לכלול את תוכן הקוב .105068 בקובצ המקור). כאשר קדס-המעבד נתקל בהוראה 806006 הוא יוצר קבוע שס, או מאקרו. כאשר הוא נתקל בשס קבוע או בשס מאקרו במהלך סריקת התוכנית, הוא מחליף את השס בערך המוגדר בהוראה 40606 המתאימה. כצפוי, הגדרת קבועיס אינה מוגבלת לערכים מספריים שלמים בלבד. ניתן להשתמש בקבועיס המייצגיס מחרוזות ומספרים בנקודה צפה. למשל, התוכנית הבאה, 7 ?אא 800, משתמשת בהוראות 6ח%060 כדי ליצור שלושה קבועיס, המכיליס מידע אודות ספר וה (במקור באנגלית): <ת.ת108%2608> 86ט610ת1+ "ת0ס601%1ת 86006 ,++0 צס 26500686" 711728 6םת4611+ 7 %א1₪550% 86ם8611+ 5 תמתסזתקע 6₪ת6611+ (ס1סט) מ1את 1סע \ ;[01ת8 >> 71708 >> " :71618 אססם" >> סטסס ;01ם6 >> א1₪590% >> " :ת265950 סתפעפטס" >> סגטסס ;01ת8 >> 108תק >> "9ף :2106ק" >> סגוסס כאשר מהדרים ומריצים תוכנית זו, הפלט הבא מופיע על המסך: <צססתם> 80א500%1 <\:0 מסנפנ1נסם 6ת8600 ,++0 צס 2650060 :71616 אססם 7 :6550 6ם6עעט0 5 ""1606סם 6 ++6 בקלות יצירת קבועי שמות בעזרת 6חו061 נוהל מומלצ ומקובל מאוד לשיפור קריאות ובהירות של תוכניות ++6 הוא החלפת ערך מסוים, העובר לאורך התוכנית, בקבוע שס בעל משמעות, המייצג את הערך הזה. כדי להגדיר קבוע שם, משתמשיסם בהוראה 8ח06א. יש לכתוב את ההגדרה הזו בסמוך לראש התוכנית (מכיון שהקבוע נכנס לתוקף מרגע הגדרתו). כמו כן, כדי להבדיל בין קבועיס למשתנים, נהוג להשתמש באותיות גדולות עבור שמות קבועים. למשל, ההוראה 40606 הבאה יוצרת קבוע בשס 008 אפק 5560%805: 0 תסטסם תמק 25א8800 6ם%4611 כשלב ראשון בהידור התוכנית, קדס-המעבד מחליף כל הופעה של השס המשמעותי ₪ םק 05א5560% בערך המספרי 3600. חשוב לשיס לב שהגדרת הקבוע אינה מסתיימת בנקודה-פסיק. אס יופיע התו נקודה-פסיק לאחר המספר 3600, הוא יובן כחלק מהערך להחלפה, כלומר - ';3600', וקרוב לוודאי, שהחלפה זו תגרוס לשגיאת תתביר. קבועי שמות מקלים על הכנסת שינויים בתוכנית השימוש בקבועי שמות לא רק תורס לשיפור קריאות התוכנית, אלא גס הופך אותה לקלה וגמישה יותר לשינוי. למשל, כפי שניתן לראות, קטע התוכנית הבא משתמש מספר פעמים בערך 50 (בדוגמה זו, מספר התלמידים בכיתה): <ת.ת108%2608> 610866םת1+ (16סט) מ1את 1סע | 2 8002608 ₪686 סת1 ; [50] 6280665 מַהַת0 16 500%; (4+%ת06ט560 ;50 > 6ת88006 ;0 = 6ת06ט560) תס" ; (800002%) 80026 ₪656 066 (4+%ת06ט560 ;50 > 6ת88006 ;0 = 6ת56006) עס" ; (%ם100ו850) 02800 081001866 (4+%ת086ט560 ;50 > 6ת88006 ;0 = 6ת56006) עס" ; (%מ50060) 2800 6סנ1צס פרק 37: שימוש בקבועים ובהוראות מאקרו 367 כעת, נניח לדוגמה, שמספר התלמידים בכיתה גדל לפתע ל- 55. שינוי זה מחייב החלפת המספר 50 במספר 55 בכל מקוס בתוכנית שבו הוא מוזכר. התוכנית הבאה, 55.07 ו6, ממחישה כיצד אפשר להימנע מעבודה מייגעת ומיותרת זו (העלולה לגרוס לטעויות ובלבול, אס אינה מתבצעת בקפדנות ובדיוק), על ידי שימוש בקבוע השס 5 55 ]6. תוכנית זו אינה שלמה ומטרתה להדגים הוראת מאקרו בלבד. כאשר תריצו את התוכנית תוצגנה הודעות שגיאה שאינן מפריעות להבנת התוכנית. הערה 07 <ת.ת108%2608> 86ט610ת1+ 0 5128 0185 6ת%8611 (16סט) מ1את ב1סע ָ = ₪6 ₪656 8002098 ]01255 5120[; 0282 6280665 ]01255 512₪[; = ;%מ56006 6ם (++%ת86006 ;51228 01255 > 6ת86006 ;0 = 6ם50060) מס: ; (800002%) 80026 ₪686 066 (++%ת86006 ;5128 01255 > 6ת86006 ;0 = 6ם56060) מס] ; (%ם100ו80) 02800 081001866 (++%ת86006 ;51228 01255 > 6ת86006 ;0 = 6ם56060) מס] ; (%מ50060) 02800 6סנ1עס בתוכנית זו ראינו, שכדי לשנות את מספר התלמידיס בכיתה, צריך לשנות רק את הקבוע המוגדר בהוראה 6חו8068: 55 1 [?50 01255 6ם0611+ 8 ++6 בקלות החלפת משוואות בהוראות מאקרו כאשר תוכניות מבצעות פעולות מעשיות (ולא תרגול), הן כוללות לעיתים קרובות גס ביטוייס ארוכים מסובכים, כמו (ויותר...): ; (ב-ץ*א) * (3-ץ*א) * (3-ץ*א) = 16גו268 במקרה וה, התוכנית מחשבת את החוקה השלישית של הביטוי (3-ץ*א). כדי שהתוכנית תהיה ברורה ופשוטה יותר, וכדי להפחית את הסיכוי לטעות (ולהתבלבל) במהלך הקלדת הביטוי, ניתן ליצור מאקרו בשס 6085 ולהשתמש בו באופן הבא : ; (3-ץ*א) 0028 = 698016ת2 את המאקרו מגדיריס (או יוצריס) באמצעות ההוראה 80606. שים לב, שכדי להבדיל בין הוראות מאקרו לפונקציות, נהוג להשתמש באותיות גדולות עבור שמות מאקרו. המשפט הבא יוצר, או מגדיר, את המאקרו 6085 : ((א)*(א)*(א)) (5)8פס6 | 6ת4611+ כפי שניתן לראות, התוכנית מגדירה את המאקרו 5 כמכפלת הפרמטר א בעצמו, פעמיים. התוכנית הבאה, 6085.622/ש5₪0, משתמשת במאקרו 655 כדי להציג את התחזקה השלישית של המספריס השלמים בטווח 1 עד 10 : <ת.ת108%2608> 86ט610ת1+ ((א)*(א)*(א)) (א)0028 6ם4611+ (16סט) מ1את ב1סע ן (1+4 ;10 >> 1 ;1 > 1 6ם1) ע0ס+ 2 >> (0028)1 >> " 18 00060 " >> 1 >> סטסס בומן הידור התוכנית, קדס המעבד מחליף כל הופעה של 60285 בביטוי המתאים (על-פי הגדרת המאקרו). במיליס אחרות, כך ייראה הקוד של התוכנית 6 א ט6/ש5₪0, אחרי פעולת קדס-המעבד: <ת.ת108%268> 61066ת1+ ((א)*(א)*(א)) (א)תפס0 6םת0611+ (ס1סט) מ1את 1סע ן (1+4 ;10 >> 1 ;1 > 1 6ם1) ע0ס+ 12 >> ((1(*)1(*)1)) >> " 18 00060 " >> 1 >> סטסס פרק 37: שימוש בקבועים ובהוראות מאקרו 369 חשוב לשיס לב, שבהגדרת המאקרו 685, כל הופעה של הפרמטר א הוקפה בסוגריים, כך (() * (א6) * 00) ולא כך: (א * א * א). ככלל, כאשר יוצריס מאקרו, צריך לכתוב את הפרמטרים בין סוגריים, כדי להבטיח כי ++6 תעריך את הביטוייס באופן הרצוי. כוכור משיעור 5, ++6 פועלת לפי סדר קדימויות של האופרטורים כדי לקבוע את סדר ביצוע הפעולות החשבוניות. נניח כעת, כי תוכנית כלשהי משתמשת במאקרו 6085 עס הביטוי 3+5-2 בצורה זו: ; (3+5-2) 00985 = 680116ע2 אס הגדרת המאקרו מקבצת את הפרמטריס בתוך סוגרייס, קדס-המעבד יצור את המשפט הבא: ;((3+5-2) * (3+5-2) * (3+5-2)) = 016ו68ע2 אבל, אס בהגדרת המאקרו מושמטיס הסוגרייס, קדס-המעבד ייצור את המשפט הבא: 1% ) 39 23+ 2 *37 2:7 אס נחשב את שני הביטויים, נמצא כמובן כי הס שונים וה מזה, והביטוי השני אינו משקף את מה שאנו התכוונו לו. כלומר, על ידי קיבוץ פרמטרי מאקרו בתוך סוגרייס ניתן למנוע שגיאות מסוג זה. ההבדל בין מאקרו לפונקציה הגדרת מאקרו היא אינה פונקציה כאשר תוכנית משתמשת בפונקציה, רק העתק אחד של משפטי הפונקציה מצוי בקוד המכונה של התוכנית. בזמן הריצה, בכל פעס שהתוכנית קוראת לפונקציה, היא דוחפת (חפטק) פרמטרים לתוך המחסנית ואז מדלגת אל קטע התוכנית של הפונקציה. כאשר הפונקציה מסיימת, התוכנית מסלקת ערכיס שהוכנסו למחסנית לפני הקריאה לפונקציה ומדלגת חזרה אל המשפט (הפקודה, או ההוראה) בתוכנית, שנמצא מייד אחרי משפט הקריאה לפונקציה. עס מאקרו לעומת זאת (כמו במקרה של הגדרת קבוע שם), המצב שונה. קדס-המעבד מחליף כל התייחסות למאקרו בגוף הקוד בהגדרת המאקרו המתאימה, שנכתבה בראש התוכנית, בדרך כלל. למשל, אס התוכנית הקודמת היתה משתמשת במאקרו 5 במאה מקומות שוניס, קדס-המעבד היה ישותליי את הקוד המתאיס של המאקרו 100 פעמיסם שונות. עס זאת, השימוש במאקרו חוסך את תקורת הפקודות הדרושות לקריאה לפונקציה (התקורה מתקבלת מהצורך לדחוף ולסלק פרמטריס מהמחסנית ומהצורך לקפוץ לקוד הפונקציה ולחזור ממנה). הסיבה לכך היא, שכל שימוש בהוראת מאקרו בגוף התוכנית, מוחלף על ידי קדם-המעבד בגוף המאקרו (המתקבל על פי הגדרת המאקרו והארגומנטיס האקטואלייס בעת השימוש בו). זהו שילוב של קוד המאקרו במלואו (פחווח1) בגוף התוכנית, בכל מקוס שבו יש שימוש במאקרו. על כן, השימוש בהוראות מאקרו מגדיל את נפח קוד המכונה של התוכנית (הקוד הנוצר כתוצאה מהידור התוכנית המתקבלת לאחר פעולת קדס-המעבד). 0 ++6 בקלות השימוש בהוראת מאקרו גמיש ביותר השימושיס בהוראות מאקרו מגווניס ביותר. יחד עם את יש לזכור, כי מטרת השימוש במאקרו היא פישוט קוד התוכנית ושיפור קריאותו. התוכנית הבאה, 2ק6.ץצג וםפ6אוו, ממחישה את הגמישות שבשימוש במאקרו. בנוסף לכך, היא גם יכולה לתת תמונה טובה יותר כיצד המאקרו מוחלף באוסף המשפטים המתאים על פי ההגדרה. <ת.ת108%2608> 866ט610ת1+ \) (א)ץ0618 6ת4611+ \ ;01ת6 >> א >> " ע20 6ם71ץ618כ" >> סטסס \ (++1 ;א > 1 ;0 = 1 ₪ם1 8ם10) :0+ ;- (16סט) מ1את ב1סע | ; (,1000002) ץצ8 361 ; (,2000002) ץצ8 361 ; (3000002) ץ8 361 1 במקרה זה, מכיון שהגדרת המאקרו נמשכת לאורך מספר שורות, יש להוסיף לוכסן הפוך () בסוף כל שורה, אשר אינה השורה האחרונה בהגדרת המאקרו. כאשר קדס-המעבד פוגש התייחסות למאקרו, הוא ישתול במקומה את כל המשפטיס המופיעים בהגדרת המאקרו. סיכום הוראות מאקרו וקבועי שמות יכוליס לשפר את קריאות התוכנית ובדרך זו - לפשט את התכנות. בפרק וה ראינו כיצד ליצור ולהשתמש בקבועי שמות ובהוראות מאקרו בתוך הקוד שאנו כותביס. בפרק 38 נלמד על פולימורפיזם (וחפוחקזסוחץ!וסק) - שיטה אשר מאפשרת לעצס 00[660) לשנות צורה במהלך ריצת התוכנית. אך לפני שנמשיך, הבה נחזור על עיקרי הדבריס שלמדנו בפרק זח: / הוראות מאקרו וקבועי שמות משפריםס את קריאות התוכנית על ידי החלפת משוואות מסובכות וקבועיס מספריים בשמות בעלי משמעות. * על ידי החלפת ערך מספרי בקבוע שס לאורך התוכנית, קטן מספר השינויים אשר יש לבצע מאוחר יותר, כאשר ערך הקבוע משתנה. פרק 37: שימוש בקבועים ובהוראות מאקרו ‏ 371 במהלך הידור תוכנית, מהדר ++6 מפעיל תוכנית מיוחדת, הנקראת קדס-מעבד (ז607066550זק), המחליפה כל קבוע שס או מאקרו בערך המתאיס לו. השימוש במאקרו מהיר יותר מאשר קריאה לפונקציה. כל שימוש בהוראת מאקרו מגדיל את קוד המכונה המתקבל. כאשר אורך הגדרת מאקרו עולה על שורה אחת, ניתן לכתוב לוכסן הפוך (\) בסוף השורה, אשר מסמן לקדס-המעבד שההגדרה ממשיכה בשורה הבאה. תרגילים 12 כיתבו תוכנית המגדירה קבוע 60815 פח ואז קוראת מהקלט מספר כזה של תוויס (אחרי הקלדת כל תו מקישים על זסשחם). לבסוף, התוכנית מדפיסה את המחרוזת שהם יוצרים. כיתבו מאקרו בשס 4/6 המקבל שני ארגומנטיס ומחזיר את הממוצע שלהם. שימו לב שהמאקרו הוא ללא הגדרת סוג (6/006!655), ולכן הוא יכול לפעול עס ארגומנטיס מטיפוסים נומריים שונים. בידקו זאת. מהו הפלט של התוכנית הבאה! שימו לב להבדל בין השימוש במאקרו לבין שימוש בפונקציה (או בפונקציה משולבת). <מ.ת105%268> 610066םת1+ 1 >> 6 >> 0006 ₪ 6מם4611+ 2 = 6 סת1 [ ;061םת₪ >> ₪0 >> 000% + (18סע)2 ב1סטע ] 12 >> ₪0 >> 0006 ו[ (10סט)% 18סט 6ם11ם1 ] 7 ] (7 = 6 6ם1)1ת 16סע א 6 %ם2)1ע ב1סע וור| שש לשה רש ₪ 2 %ר - -- -- 6 6ם3)1ע ה1סט (10סט) ת81ת 18סע ;()3ע ;(26ת ;(1)0תע ++6 בקלות כיתבו תוכנית למכונת המצבים (אוטומט סופי) הבאה: המכונה פועלת מעל האלף-בית (8,5). יש בה ארבעה מצביס: 51, 52, 53, ו-54. המצב ההתחלתי הוא 1. כל מצב יוגדר בעזרת ההוראה 6ח06/1א. כאשר המשתמש מקיש על תו שאינו שייך לאלף-בית של המכונה, מסתיימת הריבה (המכונה עוצרת). פרק 37: שימוש בקבועים ובהוראות מאקרו 373 בפולימורטיזם כאשר מדברים על ++6 ועל תכנות מונחה עצמים - 0075 (60%60ו0 00[666 9חוההוח8ז0סזפ) משתמשיס הרבה במונח פולימורפיזם (וחפוחקזסוהץוסק). אפשר לומר, שפולימורפיזם הוא יכולתו של עצס לשנות צורה. אס נפרק את המילה ייפולימורפיזם'י, נראה כי ייפולייי משמעותו הרבה ויימורפיזם'י מתייחס לשינוי צורה. עצם פולימורפי, אס כן, הוא עצם, אשר יכול להיות בעל צורות רבות. בפרק וה נלמד מהו פולימורפיוס וכיצד להשתמש בעצמיםס פולימורפיים בתוכניות, כדי לפשט ולהקטין את כמות הקוד שכותבים. במהלך הפרק נדון בנושאיס הבאיס: % פולימורפיום הוא יכולתו של עצס לשנות את צורתו במהלך ריצת התוכנית. > ++6 מאפשרת ליצור עצמים פולימורפיים בצורה פשוטה וברורה. > כדי ליצור עצמים פולימורפיים, על התוכנית להשתמש בפונקציות וירטואליות. + פונקציה וירטואלית היא פונקציית מחלקה בסיסית, אשר לפני שמה יש לכתוב את המילה השמורה וב3ּפזוץ/. > כל מחלקה הנגזרת ממחלקה בסיסית (0!855 8856) יכולה להשתמש בפונקציה וירטואלית ולהעמיס (0ַהּסוזפ0) אותה. + כדי ליצור עצם פולימורפי, צריך להשתמש במצביע לעצם מטיפוס המחלקה הבסיסית. 4 ++6 בקלות מהו פולימורפיזם עצס פולימורפי הוא עצם שיכול לשנות את צורתו בזמן ריצת התוכנית. נניח למשל, שתוכניתנית העובדת בחברת ייבזקיי צריכה לכתוב תוכנית, שמדמה פעולות טלפוניות. התוכניתנית יודעת שקיימות מספר פעולות פשוטות לחיוג בטלפון (חיוג, שיחה, ניתוק, פעולה במצב של ייתפוס'י וכדי). פעולות אלו מאפשרות להגדיר את המחלקה הבאה: )+ 6תסתס 018585 :פטס " 0ם1811כע" >> 6ט0ס0 + (עססתטת* ע82ם84181)0 ב1סט [ ;01ת6 >> מסמתטםת >> [ ;01ם6 >> "0811 עסחפםת8 סם 6ם161אא" >> סטסס + (18סט)עפחפם8 בנסט "סט סְמנסַתםת-0811 מ%ף1ש פתסקע" >> סגטסס + (ב1נסט) כגופם8ת בנ1נסט [ ;061ת6 >> [;01ם6 >> "שת1ע ,6ם1ע ,סתג1גת" >> פטסס + (18סט)6ם1ע סנסט ;[ ;(עססחטםת ,פססתטםת::6תסתס) עץק5620 + (עס6סתטםת* 8%ם6)0מסתס : סספטנמס ; [13] ע6מתגום תס ;ו התוכנית 699.פאספאסוופ, משתמשת במחלקה פחסתם: כדי ליצור עצם ייטלפוןיי: <ת.ת108%208> 01066ם1 <ת.086ם5%21> 01066ם1 )+ 6תסתס 01855 :טס " 0ת1811כת" >> סטסס + (ע6סמתטם* 3181)0282 בנסט [ ;061ת6 >> מסשסחגטם >> [ ;01ם6 >> "0811 עסחפםת8 סם 6ם161א8א" >> סטסס + (18סט)עפחטפם8 בנ1סט "סט סְמנסַתת-0811 מ%ף1ש פתסקע" >> סגסס + (ב1סט) כגופם8םת ב1נסט [ ;061ת6 >> [;01ם6 >> "שת1ע ,6ם1ע ,טסתג1גת" >> פטסס + (18סט)6ם1ע פנסט ;[; (עססחות ,פססמתטת::6תסתס) עץק620ס5 + (עס6סתטםת* 8%ם6)0מסתס : ספטנס ; [13] עס6מתגום תס ;ן (ס1סט) מ1את 1סע \ ; ("555-1212") 6מם0ם6₪61680 6שתסםס ; ("0181)"212-555-1212. 6616006 פרק 38: פולימורפיזם | 375 כאשר אותה עובדת 'יבוּקיי מראה את התוכנית למנהלת שלה, היא מציינת (בצער, כמובן), שלא קיימת בתוכנית הפרדה בין פעולה בטלפון חוגה לבין פעולה בטלפון לחצנים, וכי התוכנית לא מספקת תמיכה בטלפוניס ציבוריים, בהס צריך לשלם לפני השימוש. מכיון שהתוכניתנית המוכשרת מבינה ויודעת מהי ירושה, היא מחליטה לגזור (6שוז26) את המחלקות 606 006 ו- 6חסהק צְּק מהמחלקה 6חהסחק כפי שנראה להלן: ) סתסםק : פתסם םתסטסס 018858 :טס " 6מם1811כ 2660 2660" >> סטסס + (עססתטת* ע82ם84181)0 בנ1סט [ ;061ם6 >> עסשמתטת >> [ + (עפקתטת) פתסםס : (ע6סתגוםת* ע8ת6)0ת60 מסטסם ;ו ] 6תסםק : 6מסםתסק צ8ק 018895 :טס " 6600816 16886ק" >> סגמסס + (עססתטם* ע8םת3181)0 פנסט [ ;01ם6 >> "0668 " >> סתטסתה8 >> [ ;061ת 6‏ >> עססתטם >> " 6ם1811כע" >> סגגוסס ) (ע6סתטםת)ס6םסםק : (6תטסת8 6ת1 ,לססתטם* כַהַת0) ס6םסםס צֶס [ ;%תטסת8 = סתטסתה6::8םתסםס צֶאס : סספטנמס ;%תוסת8 %ם1 ; ן כפי שניתן לראות, המחלקות 6חסז חסטסץ ו- 6חסחכן עְ08 מגדירות פונקציות מחלקה 0081 משלהן. אס מניחיס, ששיטת החיוג של המחלקה פחסחק מבוססת על טלפון חוגה, אין צורך ליצור מחלקת טלפון חוגה עצמאית. התוכנית הבאה, =9ס6.פאסוופ/שפא, משתמשת במחלקות שהזכרנו, כדי ליצור אובייקטיםס מהטיפוסים 6חסחס, 06 חס6טסץ ו- 6חסחכ צהכ: <ת.ת108%268> 66מ61ת1+ <םת.6ם5621> 010₪6ם1+ )+ 6תסתס 01855 :פטס " 06ת1811כת" >> סטסס + (ע6סמתטם* 82ת3181)0 בנסט [ ;061ת6 >> מסשסחגטם >> [ ;01ם6 >> "0811 עסחפםת8 סם 86םת8161א" >> סטסס + (18סט)עפחפם8 בנסט "סו סְתנַסֶתאַםת-0811 מפ1ח 6תסכק" >> סטסס + (ב1סט) פגוסתאת 1סט [ ;061ת6 >> [;01ם6 >> "שםת1ע ,6ם1ע ,טסתג1ת" >> פטסס + (18סט)6ם1ע בנסט ;[; (עססחות ,פססתטת::6תסתס) ץק5620 + (עס6סתטםת* 82ם6)0מסתס :0 ; [13] עס6מתגום תס ;ן 6 ++6 בקלות ) 6תסםק : פ6תסם םתסטסס 01888 :טס " 8מם1811כ 2660 2660" >> סטסס + (עססתטת* ע8ם84181)0 בנ1סט [ ;061ם6 >> עסשמתטת >> [ + (עפסתטת) פתסםס : (ע6סתגום* ע8ם6)0ם60 מסטסם ;ו ] 6תסםק : 6מסםתסק צ8ק 0185895 :טס " 84600816 16886ק" >> סטמסס + (עססתטם* ע8םת3181)0 בנסט ;01ם6 >> "06658 " >> סתטסתה8 >> [ ;061ת6 >>ע62סתגת >> " 6ם1811כק" >> סגסס )+ (ע6סתטםת)6םסםק : (6תטסת8 6ת1 ,לססתטםת* כַהַת0) ס6םסםס צֶס [ ;%תטסת8 = סתטסתה6::8תסםס צֶאס : טנס ;%תגוסת8 %ם1 7 (ס1סט) מ1את 1סע ן ; ("06827)"303-555-1212ע2 6תסתס ; ("7.06181)"602-555-1212ע20%82 ; ("555-1212")םסםק6616 6מס6 תסטסם ; ("0181)"212-555-1212.ם0ם66160 ;(25 ,"6)"555-1111תסםתק צץ016 6תסםק צֶַס ; ("6.6181)"212-555-1212מסתס ץ016 ] כאשר מהדרים ומריציס את התוכנית, יופיע הפלט הבא על המסך: <עס6ת₪> | מאסמפאמא<\:0 2 %₪6ְ06מ1811כ 2 סשחשףת21811 2660 2660 8 25 0600816 216856 2 068%68מ1811כ כאמור, עצס פולימורפי הוא עצם אשר משנה את צורתו תוך כדי ריצת התוכנית. התוכנית הקודמת, למשל, לא השתמשה בעצמים פולימורפיים. ובמיליס אחרות, אף עצם לא שינה בה את צורתו. פרק 38: פולימורפיזם | 377 יצירת עצם 6חסווק פולימורפי לאחר שתוכניתנית ייבזקיי הראתה למנהלת שלה את התוכנית החדשה שפיתחה, אמרה המעבידה שעצס הטלפון חייב, על פי דרישה, לאפשר סימולציה של טלפון חוגה, טלפון לחצנים וגס טלפון ציבורי. במיליסם אחרות, בשיחה אחת יכול עצם הטלפון להיות טלפון חוגה, אך בשיחה הבאה אולי יהיה טלפון לחצנים, ובשיחה נוספת הוא עשוי להיות טלפון ציבורי, וכן הלאה. כלומר, משיחת טלפון אחת לבאה אחריה, על עצס הטלפון לשנות צורה. אס נתבונן בתוכנית, נראה, שבין המחלקות יש שוני בולט, והוא - פונקציית התיוג, 1 כדי ליצור עצס פולימורפי, צריך קודס כל להפוך את פונקציות מחלקת הבסיס, הנבדלות מהפונקציות הנגזרות, לפונקציות וירטואליות (פחססחט? |פטשזוצ) עושיס זאת על ידי כתיבת המילה השמורה |הטפוזוצ לפני כתיבת ההצהרה של הגדרת הפונקציה, כפי שנראה להלן: )+ 6תסתס 018585 :טס " 0ת1811כק" >> סטסס + (עפסתטת* 8%2ם84181)02 ב1נסט 81ט26נ1נט [;01ם6 >> מ6שמתטםת >> [;01ם6 >> "0811 עסחפת8 סם 8ם161אא" >> סטסס + (18סט)עפחפם8 בנ1סט "סט סְמנסתת-0811 מ1%ש פתסקע" >> סגסס + (ב1סט) כגופם8ת סנ1נסט [;061ת6 >> [;01ם6 >> "שת1ע ,6ם1ע ,סתג1גת" >> פטסס + (18סט)6ם1ע סנסט ;[; (עססחסות ,פססתטת::6םתסתס) עץק5620 + (עס6סתטםת* 8%ם6)0מסתס :0 ; [13] עס6מתגום םתס ;ו כעת, יש ליצור בתוכנית מצביע לאובייקט מטיפוס מחלקת בסיס. בתוכנית הטלפון הזו, ניצור מצביע אל המחלקה הבסיסית 6חסחק : ;סמ צץ01ק* 6מסםמס כדי לשנות את צורת העצם, יש להציב במצביע כתובת של עצס מטיפוס המחלקה הנגזרת ממחלקת הבסיס, כפי שנראה להלן: ;סתסתס 6תסםת6 (* 6תסםק) = 6תסםס צץ1סס צורת הכתיבה (* 6חסחק), לאחר אופרטור ההשמה הינו 68%, אשר מאשר למהדר ++6 להציב את הכתובת של משתנה מסוג אחד (6ח60 ח6006) במצביע למשתנה מסוג אחר שחסחק). | מכיון| שהתוכנית יכולה להציב כתובות | של עצמיםס שוניס ב- 6חסחק ץוסק, העצם יכול לשנות את צורתו ולכן הוא פולימורפי. התוכנית הבאה, 6 קא סו וספ, משתמשת בטכניקות אלו כדי ליצור עצס טלפון פולימורפי (למעשה, המצביע הוא הישות הפולימורפית. הוא יכול להצביע על כל עצס מטיפוס מחלקה נגורת כלשהי. אף על פי כן, נגיד כי העצס 6חסחק ץוסס הוא פולימורפי, ולא נבחין 8 ++6 בקלות מפורשות בעובדה שזהו למעשה מצביע פולימורפי). בומן ריצת התוכנית, העצס 6חסחק ץוסק משתנה מטלפון חוגה לטלפון לחצניס ולטלפון ציבורי: <ת.ת108%268> 6100₪6ם1 <ת.086ם5%21> 01066ם1 )+ 6תסתס 01855 :טס " 06ם1811כת" >> סטס0ס + (עפסתטםת* עַאַםת0181)0 ה1סט 81גט6ענט [ ;061ם6 >> עסשמתטת >> [ ;01ם6 >> "0811 עסחפת8 סם 6ם161אא" >> סטסס + (18סט)עפחפם8 בנסט "קט סְתנסֶתאַםת-0811 מפ1ח 6תסכק" >> סטסס + (ב1סט) קטוסת8ת 1סע [ ;061ת6 >> [;01ם6 >> "6שם1ע ,סםתנ1ע ,סם1ת" >> סטסס + (10סט)6ם1ע בנ1בסט ;[; (עססחסת ,פססתטםת::6םתסתק) ץס5620 + (ע6סתטםת* ע8ם6)0מסתס :0 ; [13] עס6מתגום עַַַת0 ;ו ) פתסםק : 6תס6 תסטסס 018588 :פטס " 8ם1811כ 2660 2660" >> סטסס + (עססתטת* ע8ם34181)0 ב1סט [ ;061ם6 >> עס6מתטת >> [ + (עססתטת) פתסםס : (ע6סתגום* ע8ת6)0ם60 מסטסם 7 ] 6תסםס : 6םמסםתסק צ8ק 01888 :טס " 0602081% 16856ק" >> 6טסס + (עפסתטםת* 84181)028%2 ב1בסט ;01ם6 >> "06658 " >> סתטסתה8 >> [ ;עססתגת >> " 6ם1811כק" >> סגסס )+ (עס6סתטםת)סםסםק : (6תטסת8 6ת1 ,לססתטם* כַהַת0) ס6םסםס צֶס [ ;%תטסת8 = סתטסתה6::8תסםס צאס : סספטנמס ;%תטסתה8 %ם1 2 (ס1סט)תנאת ה1סט / ;(25 ,"6)"702-555-1212תסםתק ץ016 6תסםק צֶַס ; ("6)"555-1212תסתק שחסם 6םס6 תסטסם ; ("06827)"201-555-1212ע2 6תסתס פרק 38: פולימורפיזם | 379 סמסתסק צץע068%ע 8 027608 626 ₪8%6 // ;ץע = 6מסתס צ1סק* 6מסםמס ; ("8181)"818-555-1212<-6תסתס צץ01ס סתסתק 60006086 8 60 תסע+ 00760%6'8 86ת8ם0 // ;סתסתס 6תסם6 (* 6תסםק) = 6תסםס צ1סס ; ("8181)"303-555-1212<-6תסתס צ1סס 6 8 סם תסל+ 00[606'8 6ם5 66םת8ם0 // ;סתסתס 8016 (* 6תסםתק) = 6תסםתס צ1סס ; ("0181)"212-555-1212<-6תסתס צ1סס כאשר מהדרים ומריציס את התוכנית, יופיע הפלט הבא על המסך: קתסאצעסק <\:60 2 068%68מ1811כ 2 סש6ףת21811 2660 2660 8 25 6460098916 216856 2 068%68מ1811כ העצס 6חסח0) שוסק משנה את צורתו בומן ריצת התוכנית, ולכן הוא עצם פולימורפי. עצמים פולימורפיים יכולים לשנות את צורתם בזמן ריצת התוכנית עצס פולימורפי הוא עצס, אשר יכול לשנות את צורתו במהלך ריצת התוכנית. כדי ליצור עצס פולימורפי, משתמשים במצביע לעצס מטיפוס מחלקת בסיס. לאחר מכן, התוכנית יכולה להציב במצביע את כתובתו של עצס כלשהו מטיפוס נגזר מתאיס (טיפוס מחלקה נגזרת ממחלקת הבסיס). כל הצבה כזו משנה את ייצורתויי של העצס המצביע (שהינו פולימורפי). אבן היסוד לבניית מצביעים פולימורפיים היא השימוש בפונקציות וירטואליות במחלקת הבסיס. 0 ++6 בקלות פונקציות וירטואליות טהורות כפי שלמדנו, כדי לאפשר עבודה עס עצמים (מצביעים) פולימורפיים, צריך להגדיר פונקציה אחת או יותר של מחלקת הבסיס כפונקציות וירטואליות. המחלקות הנגזרות יכולות להשתמש בפונקציות הווירטואליות הללו, או לספק פונקציות משלהן, אשר תתבצענה במקוס (סחו0וזפטס) הפונקציות הווירטואליות של מחלקת הבסיס. יש מקרים, בהס לא ניתן (או איןו שוס טעס) לממש פונקציה וירטואלית במחלקת הבסיס. למשל, כאשר כל מחלקה נגזרת תצטרך ממילא לממש פונקציה הייחודית רק לה. במקריס כאלה, בהסם ניתן להצהיר על הפונקציה הווירטואלית בלבד, אך אין רוציס לנצל אותה, משתמשיס בפונקציה וירטואלית טהורה (הסטסחט! |הטשזוע. 6זנוק) בפונקציה כזו אין משפטי ביצוע כלשהם. כדי ליצור פונקציה וירטואלית טהורה, על התוכנית לציין רק את כותרת הפונקציה ו'ילהציביי בה את הערך אפס, כפי שנראה להלן: )+ 6תסתס 018585 :טס 1סתוט שעטת // 0= (ע6סתטםת* ע28ת8181)0 ב1סט 81ט6ת1ט תס1נ66םט1 [ ;01ם6 >> "0811 עסחפםת8 סם 6ם8161א" >> סטמסס + (18סט)עפחטפם8 בנ1סט "סט סְמנסתאת-0811 מם1%ש פתסקע" >> סגסס + (ב1סט) כגופם8ת בנ1נסט [ ;061ת6 >> [;01ם6 >> "שתנ1ע ,6ם1ע ,סתג1גת" >> פטסס + (18סט)6ם1ע סנסט ;[; (עססחות ,פססתטםת::6םתסתק) עץס5620 + (עס6סתטת* 82ם6)0מסתס : ; [13] צסמתגום שַהַםת0 ;ו כל מחלקה נגזרת, חייבת להגדיר פונקציה עבור כל פונקציה וירטואלית טהורה של מחלקת הבסיס. אס מחלקה נגורת משמיטה את הגדרת הפונקציה המתאימה לפונקציה וירטואלית טהורה, מהדר ++6 יודיע על שגיאת תחתביר. מתי להשתמש בפולימורפיזם כאשר נגלה שיש צורך לשכפל קוד, כשברצוננו ליצור אלגוריתם לשימוש כללי - נפרק את האלגוריתס לפעולות קטנות. כל פעולה תוגדר כפונקציה וירטואלית. פולימורפיזס מאפשר תכנות נוח, יעילות ונוחות תחזוקה לכן מומלצ לשקול את אפשרות השימוש בו. אס כי יש לקחת בחשבון את מחיר הזמן כלומר, הקישור לפונקציה יתבצע בזמן ריצה (פַחו0ח81 18%6). מכיון שלפני ריצת התוכנית אי אפשר לדעת לאיזו פונקציה יש לקשר את הקריאה לפונקציה. בדוגמה הבאה נראה כיצד פרקנו את הנוסחה לחישוב נפח קוביה ותיבה לפונקציות וירטואליות. פרק 38: פולימורפיזם | 381 דוגמה : כקט1.6וחפץ!סק העדה : התוכנית נבדקה והורצה תחת 6.0 ++6 /508/. <ת.ת108%2608> 866ט610ת1+ ספוס 01888 ָ :0 לת ,8 6םד :טס [ ;1ם = םב ;81 = 8 + (ג1ם %םת1 ,81 6ם1)ססמטס [ ;(8 * 8)םעטס6ע + ()82608 סםת1 81ג26 נט [ ;(()8208 * םב)םעט60ע2 + (10סט)1סט 6ם1 ;ן סמס 110סטס :אסס 018558 ָ :0 ;ס 6ם1 :טס ([ ;81 =ס + (1 ,0006)01 :(1 6ם1 ,01 6םת1 ,01 סת1)אסס [ ;(ס * 8)םעט60ע2 + (10סט)8268 6ם1 ;ןו (ס1סט) מ1את 1%סע \ ;(8 ,60)5 6קטס ;(8 ,3 ,0)5 אסס ;אס טע ,6מ0ס טע 6ת1 ; ()60.001 = 6סטס טע ;()1סט.ס = אססם טע ;01ת6>>א00% טע>>" = 00% טעם\">>0006 טע>>" = שסטס טע">>0006 ?ןז מה השינוייס שנאלצ לבצע אס נרצה לחשב נפח גליל! פשוט נחשב מחדש את השטת 4 * 8 * 8 ונשתמש בפונקציה המחשבת נפח קוביה. נדרשת מחשבה רבה מראש להגדרת המבנה הבסיסי של המחלקות שאותם נוריש כבסיס למחלקות חדשות על פי הצרכיס העתידיים שאינס ידועיס מראש. 2 ++6 בקלות סיכום פולימורפיום הוא יכולת של עצס לשנות את צורתו במהלך ריצת התוכנית. בפרק וה למדנו את הצעדיס הדרושים ליצירת עצמים פולימורפיים. לפני שנמשיך לפרק 39, יש לוודא שהובנו מושגי המפתח והנושאיס הבאים : / / % עצם פולימורפי יכול לשנות את צורתו במהלך ריצת התוכנית. יוצרים עצמים פולימורפיים על ידי שימוש במחלקות הנגזרות ממחלקת בסיס קליימת. בתוך מחלקת הבסיס של עצס פולימורפי, מגדירים פונקציה אחת או יותר כפונקציה וירטואלית. עצמים פולימורפיים נבדלים זגה מזה בשימוש שלהס בפונקציות הווירטואליות של מחלקת הבסיס. כדי ליבור עצס (מצביע) פולימורפי יובריס מצביע לעצס מחלקת בסיס. כדי לשנות צורה של עצם פולימורפי, מכווניס שהמצביע אליו יופנה אל עצס אחר, על ידי הצבת כתובת העצס האחר במצביע הפולימורפי. פונקציה וירטואלית טהורה היא פונקציה שמחלקת הבסיס אינה מספקת עבורה הגדרה כלשהי. במקוס ואת, מחלקת הבסיס 'ימציבה'' בפונקציה את הערך אפס. מחלקות נגזרות חייבות לספק הגדרת פונקציה עבור כל פונקציה וירטואלית טהורה של מחלקת הבסיס. אס במחלקה הנגזרת לא מגדיריס מחדש את הפונקציה הווירטואלית, תופעל הפונקציה הווירטואלית השייכת למחלקת הבסיס. תרגילים נתונה המחלקה המופשטת הבאה: ]) םמ8%10ע62קס 01855 :טס = (2תגמת 108%+,1תטם 108%+)28501% 108%6+ 126081ט נ ן כיתבו מחלקות בשם טק ו-5טחוחח היורשות את חסטפזסקס ומפיקות את 6501%ז. בפונקציה חו8חח הגדירו משתנים פולימורפיים 1קס ו-2ק0 מטיפוס *חסחפזסקס ובידקו בעאגרתס את המחלקות פטוכ ו-5טחווח שכתבתס. פרק 38: פולימורפיזם | 383 24 הגדירו מחלקה וירטואלית בשס |8וחוח8 בעלת פונקציה וירטואלית טהורה בשס +חוזק, המדפיסה את שס החיה. השס נקבע בעזרת פונקציית הבנייה. יש ליצור מחלקות 1100 ו-680 היורשות מ-|8חוח8 ומפעילות אותה. בפונקציה ח|ח יש לכלול מצביע פולימורפי שיצביע פעם אל אובייקט מטיפוס 680, ופעם אל אובייקט מטיפוס 09ז1, ויפעיל את שניהם. הרחיבו את התרגיל הקודס לטיפול במערך של חיות (ייגן חיות"). בכל צעד ניתן להוסיף לגן החיות באופן אינטראקטיבי, אחד מאלה: (1) צפרדע, או (2) חתול. ניתן גס (3) להדפיס את שמות החיות בגן החיות או (4) לסיים את ריצת התוכנית. המספר המקסימלי של חיות בגן הוא 8|5חוחה סח. הגדירו מחלקה מופשטת בשס 50806 בעלת פונקציה וירטואלית טהורה בשס 8. המחלקה 66%8006] תירש את 50806 ותפעיל פונקציה וירטואלית 68ז8. המחלקה 6ז8טף5 תירש את 06ח66%8ז, תממש מחדש את 68זה וגם תוסיף פונקציה 676066 6זו6. בידקו בעזרת הפונקציה חו8וח את המחלקות שכתבתם. הסבירו מדוע הפקודה ()066ח6176+676<-51 אינה חוקית. (10סט) ת81ת 16סע ָ 2 *סס8ם5 5826* ;(7 ,8616)4ם26068 שסם 51 12 >> ()8268<-81 >> 0006 ; (5) 5011826 שטסם = 52 0006 >> 82-<8208)( >> 17 7 %6>> ()06ת012000+626<-82 >> 0006 2 = 51 12 >> ()8208<-81 >> 0006 :0 15 9815 צלתחעץל מצסא // 12 >> () 06ם01200%56826<-81 >> 00806 ) הגדירו מחלקה מופשטת בשס 50886 בעלת פונקציות וירטואלית טהורות בשס 8, 676006+ותט6ו6, חו-15 (הבודקת אס הנקודה הנתונה - כארגומנט - נמצאת בתוך הצורה). הגדירו מחלקה חסטופסק שלה פונקציות חסטופסק 56% ו-6עטסוח (הוזת הנקודה ב-0456065 המסופקים כארגומנטיסם). המחלקה 61766 תירש את 6 ואת חסטופסק (שתספק את קואורדינטות מרכז המעגל), תפעיל את הפונקציות הווירטואלית, ותוסיף פונקציה 80105 56%. בידקו את המחלקות בעזרת פונקציה חו8וח מתאימה. ++6 בקלות ניצולל עצבים חריגים עשל ++6 לטיטול בעוגיאות תוכניתנים מנוסים, אשר מאחוריהם עבר עשיר של כתיבה וניפוי של תוכניות (בדיקתן וסילוק הטעויות מהן), מסוגלים בדרך כלל לאפיין שגיאות טיפוסיות, שעלולות לצו בומן ריצת התוכנית. לדוגמה, תוכנית הקוראת נתונים מתוך קובץ, צריכה לוודא שהקוב> הנתון אכן קיים, וגם ניתן לגשת אליו. בצורה דומה, תוכנית המשתמשת באופרטור שפח כדי להקצות זיכרון, צריכה לבדוק מצב בו אין מספיק ויכרון למילוי הבקשה, וגם לטפל במצב כזה. מערכות תוכנה גדולות ומורכבות משופעות בבדיקות מעין אלו. בפרק זה, נלמד כיצד להשתמש במנגון המצבים החריגים של שפת ++6 (660%105א ++6), המיועד לפשט את תהליך גילוי שגיאות זמן-ריצה ואת הטיפול בהן. נדון בנקודות המפתח הבאות: > מצב חריג (חסשקססאם) הוא אירוע לא-צפוי, שגיאה המתרחשת בזמן ריצת התוכנית. > מצבים חריגיס מוגדריס בעזרת מחלקות. + כדי להנחות את התוכניות לתפוס מצביס חריגים, אנו משתמשיס במשפט ץזש. % כדי לתפוס מצב חריג ספציפי, משתמשיס במשפט חַ6זס. + כדי לעורר מצב חריג בשעה שמתגלית טעות, משתמשיס במשפט שסוח). > כאשר התוכנית מזהה (תופסת) מצב חריג, היא קוראת לפונקציה מיוחדת המטפלת בו. פונקציה זו נקראת פונקציית טיפול - זס!6ח3ּח ח%100ק66אם. > מהדרים ישנים אינס תומכים במנגנון המצבים החריגיס של ++6. פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות 385 ייצוג מצבים חריגים כמחלקות מטרת השימוש במנגנון המצביס החריגים של ++6 היא פישוט ושיפור של תהליך גילוי שגיאות וּמן הריצה (אשר מכנים אותן יימצבים חריגים'י), ושל תהליך הטיפול בשגיאות הללו. באופן אידאלי, היינו רוציס שתוכנית הנתקלת בטעות בלתי צפויה, תדע לטפל בה כראוי, ותנסה להתגבר על מצב זה, ולא 'יסתס'י תסיים את הריצה (עם, או בלי הודעת שגיאה מתאימה). בפועל, מצבים חריגים מוגדריס כמחלקות. לדוגמה, המשפטים הבאים מגדיריס שלושה מצביס חריגים, הקשוריס לטיפול בקבצים: קן) 02ע0ע62 מתססס 5116 018588 קן) 000ע62 2680 5116 018588 ;(] 625000 166עא 5116 018588 בשלב מאוחר יותר של פרק זה, ניצור מצביס חריגים המכיליס גס משתני מחלקה ופונקציות מחלקה. לעת עתה, די לנו לדעת שכל מצב חריג מיוצג על ידי מחלקה מתאימה. כיצד מורים ל- ++6 לתפוס מצבים חריגים (משפטי ץז ו-ה63+6) כדי לאפשר לתוכנית לתפוס מצב חריג ולטפל בו, יש להשתמש במשפט ץזצ של ++6. לדוגמה, משפט עש הבא מאפשר לתפוס מצבים חריגים בעת ביצוע הפונקציה ץ60 6ו: | ; ("דאץ. דמ6התל" ,"לשאד.מסתטספ5")צססס 1116 ?ןז מייד לאחר משפט ץ₪, צריכיס להופיע משפטי ח6800 (אחד או יותר), כדי לקבוע אס התרחש מצב חריג, ואס כן, איזה (דאד צחד): 4 על ; ("7אע. דפסתתד" ,"דאך.תסתס500")צססס 1116 ;ו ]) (9ע0ע6% מתסקס 5116) ם0860 >> "1116 082066 עס 800206 626 שםת1תספסס עסעעם" >> עע6ס ; 61ם6 ; (1%)1א6% ] 08602 )5116 2680 62202( ] ;1 >> "1116 58500206 6ם6 8ם268061 מספעעם" >> מ5ש6ס ; (1) 681% ] 6 ++6 בקלות ] (62208 166עא 5116) 08602 12 >> "1116 682866 6ם6 שם1םבעח מספעעם" >> מ5ש6ס ; (1) 6%1% ] כפי שניתן לראות, בקטע התוכנית הזה, בודקים (באמצעות 6806) לאחר הפקודה ץז אס התעורר אחד המצבים החריגים שהוגדרו קודם לכן. אם התרחש מצב חריג, מודפסת הודעה מתאימה והתוכנית מסיימת את פעולתה. במערכות תוכנה אמיתיות, התגובה רציונלית יותר, כלומר: התוכנית מנסה לתקן את הטעות ולהפעיל שנית את הפונקציה שבעקבות הקריאה לה התעורר המצב החריג. אס פונקציה מסתיימת בהצלחה (כלומר לא מתעורר מצב חריג), משפטי 680600 העוקביס אינס משפיעיםס על מהלך התוכנית. כיצד לעורר מצב חריג (משפט שסוח+) ? מצביס חריגים אינס מתעורריס מעצמס בזמן ריצת התוכנית. כדי לעורר מצב חריג יש להשתמש במשפט שסזח). לדוגמה, אס מתגלית שגיאה במהלך ביצוע הפונקציה ץ600 6 %א%5.ץ116600) הפונקציה מעוררת מצב חריג מתאים, שניתן לבדיקה: (682006%* 0282 ,5800206* מע8ם0)צץקסס 5116 בנסט ו ;[6]256ם11 ע8א8ם0 ; (800206) 2116 סטקם1 מ155%268 ; (5116)582060 סטק%טס םת0185%268 (()5116.5811 סטסת15)1 ; (62202 תססס 5116) טסעםם (()5116.1811 6טספטס) 15 6186 ; (62202 תססס 5116) טסעם 1-6 ָ ((()1116.5811 סטסת1 !) 86 (()5116.605 סשטסם1 !)) 16נםתש | ;((6ם812605)11 ,6ת6)11ת5116.06611 סגוסת1 (()5116.5811 סגוסם1 !)15 12 >> 6ם11 >> 5116 סגוקסטס 6 ; (62202 2680 1116)חסעם6 (()5116.5811 סוקסטס) 15 ; (62202 6ס1עש 1116) חאסעם6 (שיס לב שבקובצ שבתקליטור יש עליך לשנות את ( שנמצא אחרי 6!וחשו ל- ) ) פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות | 387 התוכנית משתמשת במשפט וסזחז כדי לעורר מצביס חריגים שונים, אשר מתאימים לשגיאה שקרתה במהלך הריצה. פעולת מנגנון המצבים החריגים כאשר מנצלים את מנגנוןו המצביס החריגיס, התוכניות בודקות שגיאות, ובמידה שדרוש, הן מעוררות מצב חריג (ח066000אם) על ידי משפט שצוסזח%. הפעלת משפט וה גוררת הפעלת פונקציה מיוחדת, המיועדת לטיפול במצב חריג זה -ז6|ח8ח חסטסססא= (פונקציה וו מוגדרת בתוך מחלקת המצב החריג). לאחר שפונקציית הטיפול מסיימת את פעולתה, התוכנית ממשיכה לרוצ מהשורה הראשונה שאחרי משפט עש. משפט ץט הוא וה שמאפשר לאתר ולתפוס מצב חריג. כעת, בעזרת משפטי 68600 מתאימים, התוכנית יכולה לתפוס את המצב החריג המסויס שהתעורר ולפעול בהתאס. הגדרת פונקציה לטיפול במצב חריג (וסוחּח הסו כס6אס6) כאשר מתעורר מצב חריג, ++6 מפעילה את פונקציית הטיפול המתאימה למצב חריג זה. פונקציית הטיפול מוגדרת במחלקת המצב התריג (6855 חסטק06סאם). לדוגמה, במחלקת המצב החריג הבאה, חצו00ש!6וח 6אטח, מוגדרת פונקציית הטיפול הבאה: ] תא1600פת שאגות 018588 :פטס ""ותטת !םתטת !םתטת8\8\8\" >> 5ע606 + (6נ1נסט) פש61600ת 6אגום [ ;01ת8 >> ;ו כאשר התוכנית מעוררת את המצב החריג חשו00ז!סוח 6אשח, ועוד לפני שהיא מחזירה את הבקרה לפקודה הבאה אחרי משפט שְש, ++6 מבצעת את משפטי הפונקציה השש6|?00וח שאטח. התוכנית הבאה, 692.אשספדופוא, מדגימה שימוש במצב החריג הצו\6!600ח 6אטח ובפונקציית הטיפול המתאימה לו. התוכנית משתמשת במשפט עט המאפשר את איתורו ותפיסתו של המצב התריג. הפונקציה 232ט 3800 תסייס בהצלחה, אס הארגומנט שהיא מקבלת קטן מ-255. אולס, אס הארגומנט גדול או שווה ל-255 הפונקציה חשש6!000וח 6אטח תעורר מצב חריג. הנה לפניך פירוט התוכנית. שיק 6 ! תוכנית זו פועלת בגירסה 5 ומעלה של ++6 |8טפו/\ או בגירסה 5 ++6 8011800 ומעלה בלבד. 8 ++6 בקלות <ת.ת108%2608> 866ט610םת1+ ) תא1600פ6ת שאגות 01888 :טס ""ותטת !םתטת !םתטת8\8\8\" >> 60625 + (6נ1נסט) פש61600ת 6אגום [ ;01םת8 >> 2 (סתטסת8 %ת90232)1 866 ב1סט | (255 > %תגוסת8) +1 12 >> "08 18 ₪232 05 סתטסחה" >> סגוסס 16 ; () תאס616ת 6אגוםת חסעם6 ] (ס1סט) ת1א8ת 16סע | + צעם ; (232)255 8006 ] ) (מא61600ת 6אטםת) ם0860 ; 61ת6 >> "ע89%62ע תגות" >> עת06 ו לאחר הידור והרצת התוכנית, יוצג על המסך הפלט הבא : <צססתם > אאספעתמא <\:0 !תטת !תטת !תטת 2 תגות אס תעיין בתשומת לב בתוכנית שיצרה את ההודעות על המסך, תוכל לעקוב אחר מהלך הטיפול במצב החריג ותפיסת התקלה. שורת הפלט הראשונה היא תוצאה של פונקציית הטיפול במצב התריג (הפונקציה חשס0סוסוח 6אטח). שורת הפלט השנייה היא תוצאת משפט ח6806 (התופס את המצב החריג). הגדרת פונקציה לטיפול במצבים חריגים התעוררות מצב חריג (משפט שוסזח)) מלווה אוטומטית בריצת פונקציית הטיפול המתאימה לו. כדי להגדיר פונקציה לטיפול במצב חריג, צריך להגדיר במחלקת המצב החריג פונקציה, שהיא בעלת שס זהה לשם המחלקה (בדומה לפונקציית בנייה של מחלקה). פונקציית הטיפול צריכה לנסות ולתקן את הבעייה, כדי שהתוכנית תוכל לחזור על הפעולה שגרמה למצב החריג. לאחר סיוס פונקציית הטיפול הזו, ריצת התוכנית ממשיכה מהמשפט העוקב למשפט ץ. פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות 389 שימוש במשתני מחלקת מצב חריג בדוגמאות שהוצגו עד כה, השתמשנו במשפט 68000 כדי לזהות את סוג המצב החריג שנוצר (אס בכלל), ולהגיב בהתאם. ככלל, ככל שכמות המידע שיש בידינו על המצב החריג, גדולה יותר, כך נוכל להגיב בצורה טובה יותר. לדוגמה, כשמתעורר המצב החריג זסזום חסקס ₪6 היינו רוציס, שהתוכנית תדע את שמו של הקובצ שהניסיון לפתוח אותו גרס לשגיאה. באותה מידה, כשמתעורריס מצביס חריגיס זסזחס 7680 ₪6 ו-זסזוס בסועט 6!₪, היינו רוציס שהתוכנית תדע את המקוס המדויק בויכרון (חסו68%ס! %6ץ) שבו קרתה השגיאה. אחסון מידע אודות מצב חריג מתבצע על ידי הוספת משתני מחלקה במחלקת המצב החריג. כעת, כאשר התוכנית מעוררת מצב חריג, היא תעביר את המידע הדרוש בצורת ארגומנטיס אל פונקציית הטיפול שלו: ; (206ו80) 62502 תסקס 5116 טסעם6 (622012)344 26806 5116 שסעם6 בדומה לפונקציית בנייה, גס פונקציית הטיפול במצב התחריג תכלול משפטים אשר יציבו את ערכי הפרמטריס הפורמליים (הארגומנטיס) לתוך המשתניס המתאימיס במחלקה. לדוגמה, המשפטיס הבאיס משניס את המצב החריג זסזו6 חסקס 6!₪, כדי שיציב את שס הקוב> שגרס למצב החריג לתוך משתנה המחלקה 6והפחסח!ו: ] 62008 תסקס 5116 01858 :טס ] (66ת8ת116?* ע8םת62202)0 תססס 1116 [ ; (6ת8ת5116 ,6ת8ת622029::1116 תסקס 5116) 56200 ; [255] 86ת8ם1116 עַַַםתס ;ן דוגמה: 2ק6%620%.60 בדוגמה וו בלוק ה- 686 מקבל כפרמטר מידע על מהות השגיאה. העדה : תוכנית זו פועלת ב- 5.0 ++6 /508 ומעלת. <ת.ת108%2608> 61086ת1+ (ע 1108% ,8 0810)1108%6 11086 (0 == ס) 15 ;"()0810 - תסנססםט2 ם1 0ע26 צץס מס1פנ1נטנ1ה - עסעעם" חאסעם6 ; (0פ/8) םע26%05 0 ++6 בקלות (ס1סט) מ1את 1סע ן ץצעם | ;1 >> (3 ,0810)7 >> " = 7/3" >> סגטסס ;1 >> (0 ,0810)4 >> " = 4/0" >> סגמסס ו (9פת* 82ם0)ם0860 ָ 12 >> 6שפת >> סגוסס טיפול במצבים חריגים בלתי-צפויים בשעור 11, למדנו שמהדרי ++6 מספקיס ספריות זמן-ריצה, המכילות פונקציות בהן ניתן להשתמש ישירות בתוכנית. פונקציות אלו מסוגלות לעורר מצביםס חריגיס למיניהס. לפיכך, במידה והתוכנית שכתבת קוראת לפונקציית ספריה מסוימת, היא צריכה גם לתפוס את המצבים החריגיס העלוליס להתעורר כתוצאה מהפעלת הפונקציה. מצב חריג שנוצר ואינו זוכה לפונקציית טיפול מתאימה, גורס להפעלת פונקציית הטיפול של ברירת המחדל 0|60חח ח00ק66א6 26/8|6). פונקציה זו מסופקת כברירת מחדל על ידי ++6. ברוב המקרים, פונקציית טיפול זו, תגרוס לסיוס ריצת התוכנית. התוכנית שלהלן - 699.דוּו6טג6אש, מדגימה זאת. <ת.ת1058%268> 61066ת1+ ;[ + ם000%10א6% 8086 01858 (ה1נסט)מנ1הת ב1סט ו 6012 >> "ם060610א6% חסעםם סם סטססמת" >> 6ט00 ; ()ת6%060%610 8006 טסעם6 ;601 >> "מחאסעםף תסב6סס6סאםע" >> סגוסס ו כאשר מתעורר המצב התריג ח060000א6 506, מופעלת פונקציית הטיפול של ברירת המחדל. פונקציה זו דואגת לסיוס התוכנית בצורה 'ימסודרת'יי, ככל שניתן. לפיכך, המשפט האחרון של התוכנית אינו מתבצע אף פעס. במקוס להשתמש בפונקציית ברירת המחדל המסופקת עם מהדר ++6, ניתן להשתמש בפונקציית ברירת מחדל לטיפול במצביס חריגיס, אשר מוגדרת על ידי התוכנית עצמה. כדי לעשות כך, צריך להשתמש בפונקציית הספריה 66060קא6חט 56% המוגדרת בקוב\ הכותר ח.660%א6. פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות 391 פונקציה לטיפול במצבים חריגים בלתי-צפויים פונקציה בשס ()66+601אחש תופעל במידה והפונקציה תשלח התראה מטיפוס שונה ממה שהוגדר עבורה. ברירת המחדל שלה: הפסקת ריצת התוכנית. אפשר להגדיר פונקציית ()66060קאפחט פרטית. ערכה המוחזר צריך להיות וסט והיא צריכה להיות פונקציה שלא מקבלת פרמטרים. ואז ב- ()ח|8ח יש לכתוב את התחביר הבא : ; (שם הפונקציה הפרטית שהגדרנו) 66%660כא6ת 566 דוגמה: קק6.חט]אחשט הערות : - תוכנית זו פועלת ב- 5.0 ++6 /508 ומעלה. 2 - מכיון שאין עדייון סטנדרטים לנושא זה, ++6 ו1508\ מתעלמת מאפשרות הגבלת ()\וסזת]). <ת.ת108%208> 010₪6ם1 <ת.ם8> 6100₪6ם1 <ם.8560110> 010₪6ם1 (010עצ)060%60א6ת8660ט1ע2ק בנסט ו ; 0ת60666">>6קאסתט ת%10ק06א0006>>"6 ; (0) 6%1%6 ] שףמנתעהאח // (1086+)חספתף (ס 11086 ,8 1086+)ם1אֶ6םת1+ 11086 | (0 > 8) 15 ;"0 > 8" חסעםם (0 > ס) +15 ;"0 > ס" חשסעםם (ע < 8) +1 ;5 ת26%0%2 1-6 ;8 מ6602ע ()תמ1את ב1סע / ; (060%6060א6%ת2178%00) 60660כא6ת 566 7 11086 ++6 בקלות ;(2.71- ,9.45)ם0%1םת11 = 1 1 (0פת* 82ם0)ם0860 ו ; 061ת6 >> 6פת >> סגסס קביעת המצבים החריגים אשר מותר לפונקציה לעורר כזכור, משפט הצהרה של פונקציה (6ק0%לסזן הסט6חט ,חסו066|3%8 הסססחט) מגדיר את טיפוסי הפרמטריס וטיפוס הערך המותחזר של הפונקציה. בנוסף לכך, ניתן להשתמש בהצהרה של הפונקציה כדי לציין וגסם לקבוע, איזה מצבים חריגים מותר לפונקציה לעורר. לדוגמה, ההצהרה הבאה מציינת למהדר כי לפונקציה %ח8!כ זסששסס מותר לעורר את מצב החריגים חאוס 66 ו-..68%] ח800ו80/ : ,תשסהף 61%6ת) טסעם6 (660060ם פפחסק שַם6)10ם18ק פצפחסס בנסעט ; (1688 מ28018%10 סגנון כתיבה כזה כדאי ביותר (מבחינת הנדסת תוכנה לפחות). כאשר הצהרת פונקציה כוללת את ציון המצביס החריגיס שהיא עשויה לעורר, תוכניתניס אחרים מסוגלים לדעת בקלות איזה מצביס חריגים עליהס לבחון ולתפוס, כאשר הס משתמשים בפונקציה זו. מצבים חריגים של מחלקות ++6 מאפשרת להגדיר מצביסם חריגיס השייכיס בלעדית למחלקה מסוימת. כדי ליצור מצב חריג השייך במיוחד למחלקה מסוימת, צריך לכלול אותו כאחד מאיברי המחלקה בחלק הציבורי (שו|סטם) של המחלקה. לדוגמה, הגדרת המחלקה 8ַח5₪1 שלהקן, כוללת שני מצביס חריגיס, 62 08ח501 ו- שסו וטס 8חו50 : ] 06ם1ע8% 01858 :טס ;(5%2* ע06)028ם1ע562 ; (ע0)*8%ם1ע8% 5116 14סעט ; (ע0)*8%2ם1ע5% חסם8 14סעט ; (10סט) 6מ8ת16 סַם8%621 6ת1 ;ן[ + צץס6סתס סְַם1ע856 01888 ;[+ אס1+על6טס שַם1ע86 01888 פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות 393 נ ססטנ1עס 12 סםת1 ;[8]255ם1ע56 עַהַםת0 ;ו כפי שיכולת לראות בדוגמה, המחלקה מגדירה את המצבים החריגיס 6 8ח501 ו- צשסוופטס 0חול5. בתוכנית אפשר לאתר ולתפוס מצב חריג על ידי שימוש באופרטור טווח ההכרה הגלובלי ובשס המחלקה. למשל: ) עע6 ; (9ם1ע56 שְתס1 6)8006ת1ע562 6.2111ת5621 5006 ;ן ] (אס51ע6טס פֶם1ם56::סַםת1ע56) 08602 ; 01ת6 >> "8600סתטע5 82808628ת060060-0א6 %6ם6ת16 שם1ע6פ" >> מעסס 1 פולימורפיזם ומנגנון ה- שחו!0ח3] הסוזקסס6א= פולימורפיוס הינה תכונה רבת עוצמה המייעלת מאוד את מנגנון הטיפול בשגיאות. בתוכנית הבאה ננצל תכונה זו כך שהאובייקט שנקלוט יהיה תמיד מטיפוס מחלקת הבסיס, ובתוך בלוק ה- ח6800 תופעל הפונקציה ()חוזס, שתהיה זו השייכת לאובייקט שנשלח בפועל על ידי אוסזח+ ולכן ההודעה שתודפס תהיה תמיד בעלת הפירוט הרב ביותר. בכל איטרציה של לולאת ה-זס+ נשלח כהתראה אובייקט מטיפוס של מחלקה שונה ולכן בכל פעס מופעלת פונקציית (חוזק המתאימה לאובייקט שנשלח. דוגמה: קכ6.ווו!ץסקאחט העדה : התוכנית פועלת ב- 5.0 ++6 5081 ומעלה. <ת.ת108%268> 61086ת1+ <ת.6ם5621> 010₪6ם1+ 6 01885885 ָ :טס [ ; 01ת0006>>"6222886">>6+ ()6ת21ק בנסט 1ה8גס2נ1ט ;ו 6 ס110סטס :6ת8ם622 01858 / :טס [; [0ת6>>"סתהםת 8ם10 - פתַַַתע1000%>>"622) ()%םת1עס בנסט ;ן 4 ++6 בקלות 68 ס110קגמק :%ם6220082 01855 \ :טס [ ; 01מ%6">>6ת000%>>"622008) ()>ת1עס בנסט ;ו %תטףתעס 110סגמק :622008261 01855 \ :טס [;01ם5000">>6 < %61ת0006>>"622008) ()%םת1עס בנסט ;ו %תהטתעס 110סגמק :6220082%2 01855 | :טס [;01ת0">>6 > %62ת10006>>"622008) ()%םת1עס בנסט ;ו 68 ס110כקגמק :62202106 01855 | :טס [ ; [0תמ106">>8ע02ע0006>>"622+) ()%ם1עק בנ1נסע ;ו 8% ס110קגטק :622021061 01885 \ :טס [;01ם500">>6 < 1061ע1000%>>"62202) ()6םת1עס בנסט ;ו 68% ס110קגמק :622221062 01855 \ :טס [;01ת0">>6 > 1062ע1000%>>"62202) ()%םת1עס בנסט ;ו ססגוססעס 0185859 \ : טנס ;[15]סתאם עַַַם0 ;6תהטס 108 000016 067 :טס (עס 000016 ,60 6םת0ס1 ,תם* ע66%6)028 %ה1בסט 1 (14 < (תם)ם86216) +1 ; () 86ת8ת622 שסעם6 פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות 395 16 ; (ותת ,סתהםת) צְ56200 (50000 < טש) 1% ; () %1ם622008 חאסעם> 16 (0 > ט6) 15 ; () %2ת622008 חסעם> 1-6 ;וס = סתהאטף (500 < עס) 1% ; () 62202106 חאסעם\ 16 (0 > עק) +1 ; () 622021062 חאסעם6 1-6 7 = 106עס ()שטסם5 1סע " >106עק ">>%ת008>> " =6ת8ו0 ">>תתַהַת>>" = סתהת">>0065 ; 60\1ת06>>6 21 ק>> 2 (16סט) מ1את ה1סע | ; [6]ק 06₪00%6סעס ,"5008 568","ת5020060","מססגמקתסס" ,"צ18ט6611") = [6]תם* עַַַםתס ; ("%*ססס","פסתהת סעסת סת8 סתהםת סתהּת" ;[692 ,2301 ,32- ,902 ,371 ,721001+ = [6]ג6 1026 ;[1.155 ,887.39% ,3.12% ,9.25% ,7.80%- ,46.25%+ = [6]צ5ס 16מט0ס3 (++1 ;6 1-06 ;0 = 1 שם1) ע0ס1 \ צעם \ ; [6ת0006>>6 ;01ת665">>6גמ6סע2ס 6טקם1">>םגו00 ; 01מ6>> [ 1] >>" ">> [1] גה6>>" ">>[1]תת>>0006 ; ([5]1ס ,[1]ג6 ,[1]תם)1[.66%]ס ; () זוסם8. [1] ס ] (0פ 08602)62208866 \ ; () 6ם1שס. 59 ] 6 ++6 בקלות מצבים חריגים בתוך הבנאי לבנאי אין כל ערך מוחזר. לכן, האמצעי היחיד בו הוא יכול להשתמש כדי להודיע לפונקציה, שממנה הוא הופעל, על כך שהתרחשה בו חריגה - הוא שליחת התראה. במקרה של שליחת התראה מתוך הבנאי (אוסזחד) בניית האובייקט עדיין לא הושלמה ולכן המפרק לא יופעל. לכן, במידה והוקצה זיכרון צריך לשחרר אותו לפני ששולחיס התראה. בהגדרת בנאי השייך למחלקה הנגזרת, במידה והתרחשה חריגה באתחול נתוני המחלקה, צריך לזכור לשחרר רק משאביס שהוקצו בתוך הבנאי ולא צריך לדאוג למשאביס שהוקצו על ידי הבנאי של מחלקת הבסיס, לכך דאגנו במימוש הבנאי של מחלקת הבסיס. דוגמה: כןק66075%.6א6 הערדת : התוכנית פועלת ב- 5.0 ++6 /508 ומעלה בלבד. <ת.ת108%2608> 61086ת1+ % 01885885 : טנס ;ס* 11086 :טס ;(5 5108%) 007606 ; () 00760%6= ;ו ()00[60%6-::606רכ0 ָ 12 >> 20* >> ":007608 06>>"46562006ו00 ;סת 061666 ] (2 60%::00[60%)5108%רכ0ס | 7 %>> 1 >007608:">6 00%ע8%2ם0006>>"00 ; (1108%)5 טסם = ס1 (0 > 1) 15 ן ;סק 061666 ;"סםת1אעסח 0%סם 18 עסססטעפפתסס 0 > 5 חסעםם" חאסעםם פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות | 397 (ס1סט)ת1נאת ה1סט ָ צעם ו ;(9.11-)02 , (01)7.45 606רכס ] (ספת* 8%ם08602)0 ו ; [06ת6 >> 6פת >> סגוסס סיכום מנגנון המצביס החריגים נועד לפשט ולשפר את היכולת של תוכניות ++6 לגלות ולטפל בשגיאות ומן ריצה. כדי לעורר ולתפוס מצביס חריגים, משתמשיס לשס כך במשפטים /₪, 68660 ו- צוסזו+. הכרת נושאיס אלה תורמת לשיפור רמת התכנות. לפני שנסייס, ראוי שנבדוק שוב את ידיעותינו בנושא 6060000005 : / / / / %-- % % :%.-% 108 מצב חריג הינו שגיאה בלתי צפויה המתרחשת בזמן ריצת התוכנית. תוכניותיך צריכות לעורר, לתפוס ולטפל במצביס חריגים. משפט ₪ מאפשר לתפוס מצבים חריגים. משפטי 69060 (אחד או יותר) צריכים להופיע מיידית אחרי משפט ץז, כדי לתפוס את המצב החריג שהתעורר (אס בכלל), וגם לזהות אותו. כדי לעורר מצב חריג, משתמשיס במשפט צוסזח). כאשר התוכנית מזאהה מצב חריג, היא גורמת אוטומטית להפעלת פונקציית טיפול (ז0|6חח הסטקססאם) המתאימה לו. הצהרת פונקציה יכולה לכלול את המצביס החריגיס שמותר לה לעורר. פונקציות ספריה (פ5חסט6חט+ עץזפזטו! 6וחט-חטח) עשויות לעורר מצביס חריגיס. מצב חריג שנוצר, ואשר אינו מזהה פונקציית טיפול מתאימה, עלול לגרוס להפעלת | פונקציית | הטיפול | של | ++6, שנקבעה כברירת | מחדל (ז6| חח ה66000א6 %|80ז6כ ++6). קוב הכותר ח.6670א6 כולל הצהרות פונקציות, בהן ניתן להשתמש כדי להגדיר פונקציית ברירת מחדל עצמאית לטיפול במצבים חריגים. ++6 בקלות תרגילים שיס שי לפתרון תרגילים אלה השתמשו בגירסה 5 ומעלה של ++6 |08פו/ או בגירסה 4.5 ++6 0ח8!זספ ומעלה בלבד. 1. כיתבו פונקציה 06ועו0 המקבלת שני מספרי נקודה צפה ומחזירה את תוצאת החלוקה של המספר הראשון במספר השני. הפונקציה מרימה אות חריג (ח0ו6600א6) במקרה של חלוקה באפס. יש לתפוס את ה- ח00ק66א6 בשגרת חוהוח. 2 כיתבו תוכנית המרימה אות חריג חסו 6600 במקרה של חריגה בהקצאת גציכרון של אופרטור ששסח. 3 כיתבו מחלקה עְאזזה, המספקת שירותי גישה לאיבריס במערך, תוך כדי בדיקת חריגות של גישות מעבר לגודל המערך. המחלקה תופעל על ידי תבנית (0!8%6ח6)), ותבצע העמסה של האופרטור [] לגישה לאיבריס. יש לזרוק מצב חריג (ח0ו0660%א6), במקרה של חריגה מגבולות המערך. פרק 39: ניצול מצבים חריגים של ++6 לטיפול בשגיאות 399 סצרייה תצבצניות סטנדרטיות .511 פרק וה נלקח מתוך הספר ''++6 ו- 00 למתכנת המקצועייי שכתב שמעון בהן. הפרק ניתן כתוספת למתקדמים ולא כחלק מהלימוד בספר. לא צירפנו את התוכניות בתקליטור ואנו מציעיס לא לנסות להריצ אותן כי הן מוצגות באופן חלקי כאן. יש לראות בפרק זה כמבוא לנושא זה. בפרק וה נלמד על ספויית התבניות הסטנדרטיות - 571 (8%|קוח6ד 0870ח568 ץזהזסו1) של ++6, ונסביר את עקרונות התכנון של הספריה שבה נעשה שימוש נרחב בתבניות ++6. למרות שהספריה סטנדרטית והתקבלה על ידי המועצה של ₪51ג, מרבית המהדריס עדיין אינסם תומכיס בה. בעת כתיבת ספר זה תומכים בספריה המהדריס של בורלנד, המהדר של 680 (++4), והמהדר ++6 [15088/ של מיקרוסופט. חברת חט5 הכריזה על מהדר שיתמוך בה גס הוא. הדוגמאות בפרק זה הורצו בעזרת המהדריס של בורלנד. עקרונות הספריה !511 הספריה הסטנדרטית .511 מורכבת ברובה ממחלקות תבנית ופונקציות תבנית. יש בה שימוש נרחב בתבניות ולכן נדרש לפחות ידע בסיסי בנושא, אס לא למעלה מזה. הספריה אינה מתבססת על ירושה, אלא על תכנות גנרי (סחוחחוחהזטסזק 060676). תכנות גנרי משתמש בפונקציות המקבלות איטרטוריס לתחום מסוים שעליהם הן עובדות. האיטרטורים מתנהגים כמו מצביעים, ולכן פונקציות גנריות טובות גס למצביעיס וגס למחלקות. על עקרונות אלו מבוססת הספריה הסטנדרטית של ++6. הספריה עצמה מחולקת לשלושה מרכיבים עיקריים, כשיש מספר מרכיבים משניים. מרכיביה העיקרייס הס: 0 ++6 בקלות + מכולות (5ז6ח!00%9, או אוספים) - אלו הס אובייקטים שמכילים אובייקטיס אחרים, כמו למשל רשימה או מערך. % איטרטורים - אובייקטים מסוג וה מאפשריס איטרציות על אוספים המכיליס אובייקטיס אחריס. % אלגוריתמים - אלה הם פונקציות תבנית, שאינן קשורות במחלקה מסוימת באופן מיוחד. פונקציות אלו מבצעות אלגוריתם, כמו 0חח, המוצא אובייקט באוסף כלשהו. +, אם כן, היא ספריה של אוספי אובייקטים שהס למעשה מחלקות שנבנו בצורה גנרית, ולכן אפשר להשתמש בהן כמעט בכל יישום. בהיסטוריה של ++6 כבר היו מספר לא קטן של ספריות כאלו, כמו למשל ספריית האובייקטים 14א, ספריית האובייקטיס של בורלנד וספריית האובייקטיס של פ65טִ8/\ ₪0006. החיסרון של כל הספריות שהזכרנו בכך שלא היו סטנדרטיות. הן פעלו בסביבה מסוימת, אך כשהעבירו את התוכנה שהשתמשה בהן לסביבה אחרת, היה צורך להעביר גס את הספריה. במקרים רביס היה הדבר קשה, ולעיתיםס בלתי אפשרי. ספריית .511 תצורף לכל מהדר עס ממשק 51אג, ולכן, תוכנה שתיכתב בעזרת .511 בסביבה מסוימת תפעל גס בסביבה אחרת. חיסרון אחר של הספריות הקודמות הוא האלגוריתמים. הספריות הקודמות לא תמכו באלגוריתמים כגון +וס5, או 6טףוחט. הן סיפקו מבני נתוניס שאיפשרו להכניס, להוציא ולמצוא אובייקטים, וגם סיפקו איטרטוריס. הגישה בספריית האובייקטים הסטנדרטית של ++6 שונת מהגישה המקובלת בתכנות מוכוון אובייקטים. לפי גישה זו, יש מחלקה מסוימת ופעולות ששייכות למחלקה, אך אין פונקציות חיצוניות שפועלות עליה. גישה וו אכן שומרת על עיקרון הסתרת המידע של המחלקה, אך אינה מאפשרת לנצל תכונות משותפות בין משתניס בסיסיים של השפה לבין מחלקות המייצגות אוספים של אובייקטים. גישה זו מתאימה לשפת תכנות מוכוונות אובייקטים טהורה (060ח6!זס 6066[פ0 6זטם 6), כמו א|9:!!ח5. ב-א|8|!58ח5 כל משתנה, או מצביע לאובייקט, שנגזר מאובייקט בסיסי נקרא 6[פ0. לכן, כל פונקציה שייכת למחלקה 09166 או מחלקה אחרת היורשת ממנה. ממילא, כל פונקציה שפועלת על אובייקטיס מסוג 00166 פועלת על אובייקט היורש ממנה. לכן, אין מקוס וצורך בפונקציות גנריות. לדבר זה יש יתרונות וחסרונות, והדעות בנושא ה חלוקות. ספר וה עוסק ב-++6 ולא בפילוסופיה, ולכן לא נעסוק בוויכוח זה. שפת ++6 מספקת משתנים בסיסיים ופונקציות, בנוסף לתמיכה בתכנות מוכוון אובייקטים, ולכן היא נקראת ++6 שפה משולבת (סוזסץו). כשאנו כותביס פונקציית מיון ב-++6 עבור מערך של אובייקטים כמו 8ח5₪1, נרצה להשתמש בפונקציה זו גס עבור מערך של מצביעים לתוויס. איננו רוציס להעתיק את מערך המצביעים לתוויס למערך של אובייקטיס ולבצע את המיון רק לאחר מכן. לכן, אם נכתוב פונקציית מיון עבור מחלקה המייצגת מערך של אובייקטים, היא לא תהיה טובה עבור מערך של משתניס בסיסיים של השפה. פרק 40: ספריית תבניות סטנדרטיות 511 401 תכנות גנרי הוא המונח העומד מאחורי הספריה הסטנדרטית, והוא הרעיון המרכזי בספריה זו. בתכנות גנרי אנו מנסיס להתעלס מסוג האובייקטיס, או המשתנים עליהס פועל האלגוריתם, ולהתרכז בפעולה הבסיסית של האלגוריתס עצמו. למשל, אלגוריתס מיוןו צריך רק לקבל יחס סדר בין האובייקטים ותחוס המתאר את קבוצת האובייקטיס שצריך למיין. סיבות אלו מראות מדוע ספריות האובייקטיס לא הצליחו ב-++6 כמו בשפות תכנות אחרות. 511 פותרת בעיות אלו ומספקת מבני נתוניס רביס ומורכבים ביעילות רבה, וגם אלגוריתמיס הפועלים על מבני נתוניס אלה ועל מערכיס בסיסייס של השפה. הקוד שפותח ב-511 יעיל מאוד, לכן אין כל צורך לשכתב את הספריה הבסיסית כדי להגיע לביצועים גבוהיס יותר, פרט לבעיה אחת. הבעיה בקוד וה היא שכולו מבוסס על תבניות, ולכן כמות הקוד שיוצר המהדר היא רבה כפי שנראה בהמשך. ספריית אובייקטיס המספקת מיגוון רב של אובייקטים מקלה באופן משמעותי על כתיבת התוכנה, חוסכת זמן וטעויות וגם יעילה מאוד. ספריה כזו הופכת את התכנות לפעולה נעימה, וחוסכת את הצורך לשוב ולדאוג למחלקות שכבר כתבנו. מכולות ב- 51 ב- 511 יש מספר מכולות (675חו69ח0ס) השונות זו מזו ביכולות שלהס, אשר מתאימות למצבים שונים. הממשק לאובייקטיס השייכיס למחלקות אלו דומה בדרך כלל לממשקים שאנו מכירים, ולכן הדבר מאפשר פיתוח אלגוריתמיס שעובדיס עבור מספר רב של מכולות ואינס קשוריס למחלקה יחידה. במיליס אחרות, האלגוריתמיס אינס פונקציות של מחלקה. המחלקות המייצגות מכולות, כוללות פונקציות הכנסה והוצאה, התלויות במבנה הנתוניס של המחלקה. כל המכולות מכילות אובייקטים, ולא מצביעים לאובייקטים. כלומר, כשמכניסים אובייקט למכולה, המכולה יוצרת תחילה העתק של האובייקט, ואת ההעתק הזה היא מצרפת לאוסף האובייקטיס שלה. מסיבה זו אין שיתוף בין אובייקטים במספר מכולות. המתכנת יכול ליצור אוסף של מצביעיס ואז ליצור שיתוף בין אובייקטיס במכולות שונות. במצב כזה אחראי המתכנת להקצאה ושחרור של אובייקטים. נניח, למשל, שקיימת מכולה כלשהל: 7 ,01 <*6ם62>9%21םת%81ת00 ; ("צ>ס") 8ם1ע556 שסם = ספ* 8מם1ע56 ; (קס080%)5 םפטק.01 ; (קס080%)5 ם5טק.01 הכנסנו מצביעים למכולות ולכן המתכנת גס חייב לבטל את האובייקטיס האלה. כשמוכנסים אובייקטים (ולא מצביעים), אחראי האוסף לשחרור והקצאת זיכרון עבור הצמתיס שבאוסף, וגס עבור האובייקטיס שצורפו לאוסף. המכולות מאפשרות למשתמש בהן לשנות את הדרך שבה מוקצה עבורן ויכרון. כך יכול המשתמש לקבוע את אופן הקצאת הזיכרון. לפי מודל התוכנית אפשר לקבוע את סוג המצביעים ל-ז68ח או ₪ במונחיס של מחשב אישי. הדבר מאפשר גם לקבוע זיכרון שיהיה ומין גס מעבר לתקופת החיים של התוכנית, כלומר 61'515%60%. 12 ++6 בקלות האוספיס הנתמכיס ב-511 הם: % ז66%0ט - אוסף הדומה לווקטור. האובייקטיס באוסף כזה אגוריס בצורה סדרתית בויכרון רציף. הגישה לאובייקטיס באוסף כזה היא אקראית בעזרת אופרטור []. > 18% - רשימה מעגלית כפולה. הגישה לאובייקטים באוסף זה היא סדרתית, קדימה או אחורה. + 66006 - תור כפול שמאפשר להכניס אובייקטים משני הצדדיס (תחילת התור וסופו). התור הכפול גס מאפשר להוציא אובייקטים משני צדדיו. % 56% - אוסף סדור (קבוצה) של אובייקטים. לאובייקטיס המוכנסיס לאוסף זה יש יחס של סדר. הדבר אינו דומה להגדרה המתמטית של אוסף (ההגדרה המתמטית של קבוצה היא: אוסף שאינו סדור של אובייקטים, ללא חזרות). באוסף זה אסורות החזרות של אובייקטים. התכונה החזקה של אוסף זה היא מהירות גבוהה של חיפוש אובייקטיס. > 850%!₪₪ - אוסף הדומה לאוסף הקודס. אוסף סדור של אובייקטים, אך החזרות מותרות. כלומר, מותר להכניס את אותו אובייקט מספר פעמים. + סח - מפה, לעיתים נקרא מבנה נתוניס זה בעגה המקצועית - מילון. והו אוסף של זוגות אובייקטים, שכל אחד מהס מורכב ממפתתח וערך. המפה היא אוסף סדור לפי המפתחות. באוסף מסוג זה ייתכן רק מפתח יחיד מערך מסויס. > סבה !טוח - אוסף סדור של זוגות אובייקטים, כשכל זוג מורכב ממפתח ומערך. במקרה וה מותר מספר זוגות עס מפתח זהה. כל המכולות, או האוספים, מאפשריס להכניס כל אובייקט לתוכם, כולל סוגיס בסיסייסם של השפה, כמו שלמים או 8%סו]. איטרטורים איטרטורים (16618+075) הם אובייקטיס שמאפשריס סריקה של אוספים, כלומר - של מכולות. לכל אחד מאוספים אלה יש הגדרה של איטרטור. איטרטור מסוג מסויס מתאיס אך ורק לאוסף מסוים. דבר וה מאפשר להפעלל פונקציות בצורה גנרית, ללא כל צורך בידיעת סוג האוסף. + רואה את האיטרטוריס כסוג מצביע מסויס. כשרוציס לקדס מצביע, מפעילים עליו אופרטור "++". כשרוציס להתזיר את המצביע לאחור מפעילים עליו את האופרטור --יי. האופרטור יימצביעיי לאובייקט נוכחי שנמצא באוסף. לכל איטרטור יש מידע המציין את האובייקט הנוכחי של האיטרציה. כשרוציס להשתמש בתכולת מצביע משתמשים באופרטור י*יי. בדומה, כשרוציס לקבל את האובייקט הנוכחי של האיטרציה משתמשים באופרטור 'י*יי. הדבר מאפשר לפתת אלגוריתמיס שוניסם המתאימיס למצביעים וגם לאיטרטורים. פרק 40: ספריית תבניות סטנדרטיות 511 403 מגדירה את סוגי האיטרטוריס הבאיס : ז%0]3%0! 366655 ו007ח₪3 (איטרטור לגישה אקראית) - איטרטור מסוג זה תומך באופרטוריס ‏ "++", "--! ו-יי[]יי והוא בעל כל התכונות של מצביעיס בסיסייס בשפה. האופרטור "++" מאפשר להתקדס באוסף שאליו מצביע האיטרטור. האופרטור "--" מאפשר לנוע לאחור באוסף שאליו מצביע האיטרטור. האופרטור "[)י" מאפשר גישה לכל מקוס באוסף שאליו מצביע האיטרטור. הגישה במקרה זה היא על פי אינדקס. ז5673%0! ה0וז01166 [3ח66%10ו₪10 (איטרטור דו-כיווני) - איטרטור מסוג וה מאפשר לנוע לשני הכיווניס באוסף שאליו הוא מצביע. התנועה עס איטרטור וה מתאפשרת על ידי האופרטורים "++" ו- --יי. איטרטור זה אינו מאפשר גישה אקראית בעזרת אופרטור ''י]''. איטרטור זה נחשב לבעל יכולות נמוכות יותר מהקודם. 156307 (זבּעזס= (איטרטור מתקדם) - איטרטור מסוג וה מאפשר לנוע קדימה בלבד באוסף שאליו הוא מצביע. הוא עושה ואת בעזרת האופרטור "++". 110307 236/11 (איטרטור נסוג) - איטרטור מסוג זה מאפשר תנועה לאחור בלבד באוסף אליו הוא מצביע. הוא עושה ואת בעזרת האופרטור *--. ז0+673%:! %₪קח1 (איטרטור קלט) - איטרטור וה מאפשר השמה בלבד של אובייקטים ממנו אל אובייקט כלשהו. בדרך כלל, הוא קשור לקובצ ומאפשר לחלצ ממנו נתוניס. 5 מ=>טק6ט0 (איטרטור פלט) - איטרטור זה מאפשר השמה של אובייקטיס לתוכו. בדרך כלל, האיטרטור קשור לקובצ ומשמש לפלט. לכל אוסף 61ח600%31 מוגדר האיטרטור בצורה הבאה: 12 16008%08::עסת1ה6תסס דבר זה מאפשר לאלגוריתמיס שוניס להשתמש באיטרטור של מכולה נתונה, מבלי לדעת את סוג המכולה או את סוג האיטרטור. שימוש באלגוריתמים ואיטרטורים האלגוריתמיס השוניס יכולים לפעול גם על מצביעיס בסיסייסם של השפה. במקריס כאלה יש להבדיל בין סוגי האיטרטורים כדי לממש את האלגוריתמים באופן יעיל. כדי להבין את משמעות הדבר נבחן דוגמה. נניח, שיש לנו פונקציה המקדמת איטרטור, או מצביע, במספר נתון ח. <%ע1662860 01858> 66801866 (ם %ת1 ,81662 1662860%) 08ת86078 ה1סטע ָ ;םת =+ 166% 4 ++6 בקלות הפונקציה הגנרית הזו יכולה לעבוד עבור איטרטורים מסוג מצביעים, או עס איטרטורים מסוג גישה אקראית. עבור איטרטורים דו-כיווניס אין פעולה '=+', ולכן קטע קוד וה אינו עובר הידור. אפשר לשנות את הפונקציה הזו בצורה הבאח: <1662860%> 66801866 (ם %ת1 ,81662 ע16062860%) 08ת86078 1%סטע ָ (0 < ם) +1 (0 < --ם) 16נתשט ;1567++ 1-6 (0 < ++ם) 16נתט --1? ו פונקציה גו מתאימה לפעולה עס איטרטורים מסוג גישה אקראית (860655 והססח8ז זססהזס)), או איטרטורים דו-כיוונים. הבעיה נוצרת כשמפעילים פונקציה זו על איטרטור דו-כיווני. במקרה כוּה מספיק המשפט הזה: ;םת =+ 1662 במקריס כאלה יעילות הפונקציה גרועה במיוחד, כי נדרשות ח פעולות במקוס פעולה אחת. כדי לפתור בעיה זו מוגדר המושג תווית (פָפד) עבור איטרטוריס (ראה להלן). תווית של איטרטור כפי שניתן לראות, קיימת בעיית הבחנה בין הפונקציות השונות. אס נכתוב פונקציה גנרית שתקדם איטרטור, היא תהיה בזבזנית מאוד עבור איטרטוריסם לגישה אקראית. פתרון אחד הוא להגדיר היררכיה של מחלקות איטרטורים. לדוגמה: <6קץ71 01858> 661866 01858 505820 1606280602 )] :טס [+ ()16628602 826ח100 ()++6000628%02 16628602 8206ח102 [ ;18םת6* מעט66ע2 ] // ;ו <6קץ71 01858> 661866 ] 10628602 800088 תסם8ע 01858 :טס [+ ()16628602 800688 מס6ם28 ;(ם %ם1)=+600028%02 1662860% 800688 מס6ם28 פרק 40: ספריית תבניות סטנדרטיות 511 405 כעת יכולנו לגזור את האיטרטוריסם שלנו מהאיטרטוריס הבסיסיים, למשל: <6קץ71 018585> 661866 ]) 6ו060 0185858 :טס ) <706ץ16028%02>1 800688 תססתה8ת 116מטק : 166286058 601858 (ם %ם1)=+8600628%02 16628602 [ ;15ת%ף* מעגמט66ע ;םת =+ מטס ) 2 עכשיו אפשר להשתמש ביכולת של ++6 להגדיר גירסה מסוימת של הפונקציה הגנרית ס6שחהטחהּ, באופן הבא : <6קץ71 01858> 661866 (ם %ת1 ,[8 <06ץ16628602>1 800688 תססםתהת) 8008206 בנ1סט הבעיה המתגלה בפתרון זה היא, שהוא אינו יכול לפעול עבור מצביעיס בסיסיים של השפה. הסיבה לכך היא שהמצביעיס הבסיסיים אינס יורשיס ממחלקה כלשהי, ובפרט אינס יורשיס מהמחלקה ז67800?! 806655 וחססתפז. הפתרון שמציגה הספריה ‏ 1ז5 לבעיה, הוא שימוש בתוויות איטרטורים (805+ ז1007860). תחילה מגדירים את התוויות השונות של האיטרטוריס: ;[) 680 16628608 סטקם1 6סגו562 ;[1 680 16028608 סטקפסגטס 6סגו562 ;[) 680 166286058 5029826 56206 ;[+ 680 16028608 81ת101260%10ס 56206 2 686 16628608 800688 מס6ם28 56206 לאחר מכן מוגדרים האיטרטוריס השוניס והקטגוריות הבסיסיות שלהם. קטגוריות אלו מספקות מחלקות בסיסיות עבור איטרטוריס המוגדריס במכולות השונות. ח ;(] 16628602 6טקם1 862006 <71 01888> 66001866 ;[) 16028608 סטקסטס 6סגו562 ק[) 16028602 0ע82אע20 06טע86 <7 618588> 66001866 ה ;[] 18628605 81ת161200%10ע 862008 <7 01888> 66001866 ח ;[] 10628602 800088 תס0םת28 862006 <7 01888> 66001866 לכל איטרטור מוגדרת הקטגוריה אליה הוא שייך. אין זו מחלקה בסיסית שממנה יורשיס האיטרטוריס, אלא הקטגוריה בלבד. כזכור, אין יחס של ירושה למצביעיס הבסיסיים של השפה. 6 ++6 בקלות 66801866 >01858 ?1< % 166028000 סטסת1 6ם11ם1 + (16628%02>1<8 סטמקת1 58%6ת00)ץ0866002 16628605 ;()680 16628608 סטקם1 םעט66ע2 %) צץ0806702 10628608 680 16628608 סטקפסגוס 6ם11ת1 ] (166286028 סגמוקסטס ; ()%80 16628602 סוקפטס םעט2660 66801866 >01858 ?1< 8 10628005 502826 6ם11ת1 ]1 (16628%02>1<8 5029826 8%6ם00) ,0866002 16628605 ;()680 166286028 5029826 םע2660 66801866 >01858 ?1< 8 100286008 81ת101260%10ס 6ם11ם1 1 (1%628602>1<8 81ת0101260%10 8%6ת00)ץ0856002 16628605 ; ()%80 16628602 81ת161260%10מ םעט260 66801866 >01858 ?1< 6% 10028005 800688 מס6ם28 6ם11ת1 1 (160628602>1<8 800688 מתססםת28 8%6ת00) 0866002 16628605 ; ()%80 16628602 800688 מססתה8ע םע2600 <1? 01858> 66801866 ] (*?7 8%ם7)00ץ08%6002 16628602 680 16628602 800688 תסבםתה8ת2 6ם11ת1 ; ()%680 16628602 800688 מססתה8ע םע2660 הערה בפונקציה ובמחלקות המקוריות יש פרמטר תבנית נוסף, 66ח560וכ. לצורך פשטות ההסבר הרשיתי לעצמי לבטל אותו. הורדת הפרמטר אינה משנה 7 את עקרון התוויות לאיטרטורים. פרק 40: ספריית תבניות סטנדרטיות 511 407 לאיטרטורים מסוג גישה אקראית (0793000)! 360655 ותססחהה) יש שתי פונקציות מועמסות המספקות תוויות. הפונקציה הראשונה מספקת תווית איטרטור מסוג גישה אקראית עבור איטרטוריס מסוג מחלקות, והפונקציה השנייה מספקת תווית מסוג של איטרטור גישה אקראית עבור איטרטוריס שהס מצביעיסם בסיסיים. כעת, באמצעות תוויות האיטרטוריס אנו יכולים לכתוב את הפונקציה 6סַחַ80/8 בצורה הבאה: <16062 01858> 66801866 (ת %תם1 ,[6 ע8078206)1862 10סט 6ם11םת1 זָ ; ((()ץ08%0002 16628602%,ת ,ך)06ם8008. <2065516628060%תת00ת38 01855> 66801866 ,[8 שַססַעַ66ב1ַפַפַ6ַסתתסְתַ8) 06ת8008 ב1סט 6ם11ת1 (%580 16628602 800688 מססםת8ע2 ,םת 6ת1 <%ע811%28%0ם216120%10 01855> 661866 ,8 811662860%ת101260%10ת) 06ת8008 | בנסעט (580 16628602 81ם161260%610ס ,ת 6ת1 (0 =< ם) +1 (--ת) 16נ1תש ;ר++ 1-6 (++ת) 16נ1תשט ;ךְ-- כלומר, הפונקציה הראשית שנקראת מפנה את הקריאה לפונקציה אחרת, שלה יש את אותס הארגומנטים, בתוספת תווית זיהוי של האיטרטור. מנגנוו ההעמסה של ++6 בוחר את הפונקציה המתאימה לפי סוג התווית! טכניקה זו מאפשרת הפעלה של פונקציות שונות בצורה פולימורפית סטטית (חפוחקזסוחץ!ס 50806). סוג הפונקציה נבחר על ידי המהדר לפי סוג הפרמטריס (התווית של האיטרטור) בזמן הידור, ולא בומן ריצה. 8 ++6 בקלות אלגוריתמים אחד הדבריס המייחדיס את 511 הס האלגוריתמים של ספריה זו. בניגוד לספריות אחרות, מספקת ‏ 511 מיגוון רחב של אלגוריתמים גנריס המתאימים ליישומיס ושימושיס רבים. אלגוריתמיס רביס מתוכס טובים גם לאוספים בסיסיים של השפה, כמו מערכים. אפשר לקחת את האלגוריתמיס של 511 ולהשתמש בהס עבור ספריות אחרות, שחסרות אלגוריתמיס כאלה. למשל, ספריית האובייקטיס של פפ89/\ ₪006 החדשה מאפשרת שימוש באלגוריתמיס של 511. בדרך כלל, האלגוריתמיס ב-511 פועליםס על תחום נתון. העיקרון המנחה הוא פעולה בעזרת איטרטורים. האלגוריתם מקבל, בדרך כלל, איטרטור להתחלת התחוס ואיטרטור לסוף התחוס. אלגוריתס כזה, למשל, הוא 0ח₪ המוצא אובייקט נתון בתחום. האלגוריתס ממומש בצורה הבאה: <16628602 01888 ,6קץ71 01855> 01866ת66 ,8%ע1 ע1562800% ,7ץ68%6 6קץ71 0)0028%6ם11 ע1662860% (1850 16628602 (ץ6א =! 1128%* 66 1886 =! 51286) 116תט ;08% 1+++ %2 מע6%0ע2 האלגוריתס הוא פונקציית תבנית בעלת שני פרמטרים; הראשון מייצג את סוג האובייקט והשני מייצג את סוג האיטרטור. הפונקציה מקבלת ייחוס לאובייקט שצריך למצוא, ותחום המאופיין על ידי האיטרטורים 85% ו-85%!. הפונקציה מחזירה איטרטור לאובייקט הוהה למפתח שנמסר לה, אם נמצא אובייקט כזה, אחרת היא מחזירה איטרטור הזהה לסוף התחוס. הפונקציה עשויה להחזיר מצביע לסוף האוסף, ולכן האובייקט האחרון בתחוס אינו נחשב בתוך התחום. דבר וה מתאפשר הודות לתכונה של ++6, שכתובת אחת אחרי המערך היא כתובת חוקית לקריאה, אבל לא לכתיבה. נוהל עבודה זה בעזרת אלגוריתמים הביא את המושג תכנות גנר? (סחוההותהופסזק 676ח06), שבו כותביס פונקציות שאינן מכירות את מבנה הנתוניס עליהן הן פועלות. הפונקציות, שמממשות אלגוריתס, מקבלות איטרטוריס לתחילת התחוס ולסופו. פונקציה כזו מניחה שיש לאיטרטור אופרטורים (++) המאפשריס לקדם אותו לאלמנט הבא. כמו כן, מניחה פונקציה כזו שיש אופרטור (*) המקבל את האובייקט הנוכתחי, כשהאופרטור מופעל על האיטרטור. על פי הנחות אלו יכולה הפונקציה לפעול גס על איטרטוריס של מחלקות יימכולהיי (או אוספים) וגם על מערכיס בסיסיים של השפה. דוגמה אחרת לאלגוריתס כזה, היא אלגוריתס המבצע היפוך סדר של אובייקטיס במכולה. אס האובייקטיס מסודריס בסדר עולה, מסדר אותס האלגוריתס בסדר יורד. פרק 40: ספריית תבניות סטנדרטיות 511 409 <%ע1662860 01858> 66801866 (188% 1%6028%0% ,1129% ע1%028%0) 6286ט6ע2 ב1סטע ָ -%2 ) (1858 =! 58%ת110) ש1ונתט ; (188%* ,1125%*) 587 ;68%עס (188% == 1128%++) 1% %2-- ו כפי שראינו קודס לכן, האלגוריתסם מקבל תחוס שעליו הוא פועל, ובכל שלב של הלולאה הוא מחליף את האובייקטיס בקצות התחוס וגס מקטין את התחום. כמו במקרה הקודם, גס כאן יכול אלגוריתס כזה לפעול על מערכיס בסיסייס של השפה, או על אוספים. כשהוא פועל על מערכים בסיסיים של השפה הוא מקבל מצביעים, וכשהוא פועל על אוספיס הוא מקבל את האיטרטור של האוסף. מתאמים (פ5וסזכְ₪03) מתאמים (5ז0ס4087%) הס אובייקטיס שמקבלים אובייקט אחר, ומשתמשים בו כדי לממש פונקציונליות מסוימת. המתאמיס אינם נחשביס כאחד מהמרכיבים העיקריים של הספריה, אבל הס מציגיס רעיון תכנות שראוי לציינו כאן. המתאם עצמו אינו מממש מבנה אלגוריתמים כלשהו, אלא משמש במעטפה של מחלקה אחרת שמממשת את מבנה הנתונים והפונקציונליות הבסיסית. המעטפה מתאמת את הממשק של המחלקה הבסיסית לממשק מבוקש. למשל, אס רוציס לממש מחסנית, עומדות בפנינו מספר אפשרויות. אפשר לממש מחסנית בעזרת מערך, בעזרת רשימה או בעזרת תור כפול. לכן, המחלקה מחסנית יכולה להיות מתאס שמקבל סוג של מחלקה ומממש את הפונקציונליות הדרושה. <1 601888 ,02ם%81ת00 01885> 1866קת66 ] 5680% 0185855 2 68ם6081ת00 :טס [) ()5680% (ט8 7 6פתסס)םפטס פנסט [ ;(ט)פםסע5 םפטק.6 ) ()ססס 7 [ ;()6ם0ע52 6.000 מעטס6עץ ) ;ו המחלקה 586% היא מעטפה (קסופצחם) למכולה אחרת, ומשתמשת בה כדי לממש את הפונקציונליות של המחלקה. כל הפונקציות של המחלקה מבוצעות בעזרת המכולה הנתונה לה. כשמגדיריס אובייקט ממחלקה זו, מספקים לו את המכולה ואת סוג האובייקטיס שבמכולה (ראינו שאפשר להסתדר גס ללא סוג האובייקט). למשל: 0 ++6 בקלות ;נעטפ <%ת1 ,<%ת5680%>60%02>1 52 <%ת1 ,<6ת5680%>1156>1 למעשה, הגדרנו מחסנית המבוססת על וקטור, או רשימה. לפי סוג השימוש שלנו במחסנית ניתן לבחור את מבנה הנתוניס המתאים יותר. אובייקטי פונקציות (00[66%5 חסוטסחש-) אובייקטי פונקציות (09[600 חסטסחטת) אינס נחשביס כאחד החלקים העיקריים של הספריה, אך ראוי להכיר מונח חשוב וה. אובייקט פונקציה מתנהג בצורה דומה לפונקציה. קיים אופרטור () שאפשר להפעילו כפונקציה. למשל: ) עסססםתטת 06וע5% ()()268%02ק0ס 6ם1 0 ו אובייקט ה מעמיס את אופרטור הפונקציה, ולכן אפשר להשתמש בו בצורה הבאה: ;+ עסססםתות + 6 05.0 5 יכולת וו חשובה כשרוציס להעביר פונקציה, או אובייקט, לאלגוריתמיס המשמשים להשוואה בין אובייקטים. האלגוריתס יכול להתייחס לאובייקט כפונקציה, ואו הדרך פתוחה בפני המשתמש להעביר לאלגוריתם פונקציה או אובייקט. האלגוריתס 050% בספריה הסטנדרטית של 6 מקבל פונקציה המאפשרת לקבוע את הסדר הערכי (מספרי או אלפביתי) בין שני אובייקטיס, באמצעות מיון המערך בויכרון. באופן דומה אפשר לכתוב אלגוריתם המבוסס על פונקציית תבנית ב-++6 למיון מערכים, או מכולות. עלינו לספק לאלגוריתס אובייקט, שמאפשר לקבוע את הסדר בין אובייקטיס שוניס, או לחילופין, לתת לו פונקציה שמאפשרת זאת. <קתס060 01888 ,10028002 0185585> 01866ת66 (קתס קת00 ,0ם6 166028602 ,8%82% ע1₪62860%)%ע802 בנ1סט ו 0 (0 > (06םת6* ,5682%*)קתס) 15 ָ הבמס תהם6 1688 18 %ע868 // ו לפני השימוש באלגוריתס עלינו להגדיר את האובייקט, או הפונקציה, שמאפשרים ביצוע השוואה בין אובייקטים, ולמסור אותם לפונקציית המיון. פרק 40: ספריית תבניות סטנדרטיות !571 411 סיכום בפרק זה הצגנו את ספריית האובייקטים הסטנדרטית של ++6. סקרנו את החלקיס העיקרייס שלה ואת רעיונות התכנון שהינחו את מתכנניה. רעיונות אלה לכשעצמס יכוליס לשמש אותנו כשאנו מפתחיס תוכנה לצרכינו. הספריה הסטנדרטית של ++6 מורכבת משלושה חלקים עיקרייסם: מכולות (5ז6חו%8ח00), איטרטורים ואלגוריתמים. בניגוד לגישה מוכוונת האובייקטיס שבה יש אובייקטים בלבד, ספריה זו מציגה גישה חדשה שמתאימה ל-++6. בגישה זו יש אלגוריתמיס נפרדיס שאינם קשוריס לאובייקטיס. אלגוריתמיסם אלה פועלים על תחומים נתוניס. האלגוריתמיס משמשים כהפשטה בפני עצמה, כי אין הס מכירים את מבנה הנתונים שעליו הס פועלים. האלגוריתס דורש איטרטורים, או מצביעיס למבנה נתוניס ה, שיאפשרו לו לסרוק את מבנה הנתוניס. אלמנטים אחרים המרכיביםס את הספריה כולליסם מתאמים (9ז0ס080%) ואובייקטי פונקציות (05[600 חסח6חטת). המתאמים מאפשרים שימוש במחלקה אחרת והתאמתה למבנה נתוניס מסויס. המתאס מאפשר גמישות למשתמש, בכך שהוא מאפשר לבחור את המחלקה המתאימה. לאובייקט המשמש כפונקציה יש אופרטור קריאה לפונקציה, ולכן אפשר להעבירו כפונקציה לאלגוריתס שצריך פונקציה המתארת את יחס הסדר בין אובייקטיס שעליו האלגוריתם פועל. מקורות ,"8165ז0!! 0606716 60 השס תוס" .טסחה500 .ה .ה 0חה .₪ .כ מספפט₪ .1 .4 +[ ,24)7(:623 ,06ח676קא= 0ח3 860066 500/86 :+ 6167066 30 |הוזסזטד 571 .וחו58 .ה סחהּ ₪.כ ₪556 .2 ,ץו65/\ ה200150 .ץזהזסו | !חס ד 0870ח3ז5 6רז וצו פהווחהזטסזק ++6 .6 ,1 ,0חו680 2 ++6 בקלות יצירת בצרויקט פרק גה נלקח מתוך הספר '"המדריך השלם לשפת 6 - מהדורה 5" שכתבו משה ליבטמן ועמית רש. הפרק נכתב על ידי אבי בו\. הפרק ניתן כתוספת לספר. התוכניות המוזכרות בפרק זה לא נמצאות בתקליטור. עד כה למדנו את טכניקת השימוש בפונקציות ספריה. למדנו שיש לכלול בתוכנית את הספריה הדרושה. למשל, נכתוב <ח.ו05068₪!> 06ט[6חו% לצורך שימוש בפונקציות הנמצאות בספריית קלט/פלט. מהי פונקציית ספריה? פונקציה היא תוכנית מחשב אשר כתובה בשפת 6 או בשפת ץו0וח1556, או שילוב של שתיהן. תוכנית מחשב זו נכתבה עבורנו במהדר 6 של בורלנד או מיקרוסופט (או מהדר אחר), בדרך בה אנו כותבים את תוכניותינו. כך נוצר קובצ 6 ובו מספר פונקציות בעלות מכנה משותף, כמו טיפול בקלט/פלט, למשל. בקובצ התוכנית שכתבנו, אשר קרוי גס קוב מקור (8/6 66זט50), אנו כוללים את הפונקציה הראשית חוּוח. את הקוב הזה אנו ממירים לספריה. לקובצ מתווסף קוב נוסף באותו שם, אך בעל הסיומת ח. למשל, 50610.6 ו-ח.5%010. בקובץ הכותר 8 (6| ז706806) נמצאות כל ההכרזות של הפונקציות, בדיוק כמו בשיטת חושסס-ססד. הכללת ספריה זו בתוכנית נועדה לשלב את ההכרזות בקובף, כדי שנוכל להשתמש בפונקציות שבקוב\ 0.6ו5%1. למעשה, מבלי שנדע, עבדנו עד היוס עס מספר קבצי מקור שכללו פונקציות שלא נכתבו על ידינו. כיצד, אס כך, נוכל לבנות קוב\ פונקציות משלנו, שנוכל להשתמש בו ככל שנמצא לנכון, בלי לכתוב שוב את הפונקציה, או מבלי להעביר אותה מתוכנית לתוכנית! פרק 41: יצירת פרויקט 413 יצירת תוכנית ממספר קבצי מקור שפת 6 מאפשרת לפרוש את כתיבת התוכנית על פני מספר קבצי מקור (1!65 06זט50), בעלי סיומת 6. כל קובצ כזה יכול להכיל פונקציה אחת או יותר, המוכרות באופן גלובלי וו לזו. קובצ מקור אחד בלבד חייב להכיל את הפונקציה (0חו8חח, שממנה מתחילה ריצת התוכנית. לדוגמה, ייתכן המצב המוצג להלן. הקוב 88161.6 מכיל: () מנאת \ ; () 61מגו+ ; () 62מגו ] ()61תט5 ן ()62מגו+ ] ()63תג ] ] הקובץ 162.6 מכיל: () 62תגו5 כלומר, למרות העובדה שהפונקציה (620ח%0 נמצאת בקוב> 8!62.6, ניתן לקרוא לה מתוך הפונקציות ()חו3ח ו-()61ח%0, המוגדרות בקובצ 8!61.6. לאחר תהליך ההידור של התוכניות שבקבציס ₪6!61.6 ו-62.6!₪, נוצריס קבצי בינייס בעלי השמות [61.00!₪ ו-[6!62.00 בהתאמה. תהליך הקישור (אחו1) מחבר את שני קבצי הבינייס הללו ואת קבצי ספריית המערכת לקוב\ ריצה אחד, המקבל סיומת שאם. ניתן להריצ אותו על ידי הקלדת שמו, כאשר נמצאיס בפיקוח מערכת 05פ. למעשה, כאן אנו רואיס באופן ברור יותר שהשתמשנו בשיטה זו באופן סמוי. כאשר כתבנו תוכניות 6 בקוב\ מקור אחד, קראנו למעשה לפונקציות של ספריות המערכת מתוך התוכניות. כידוע, פונקציות אלו הוגדרו בקבצי מקור אחרים, ושולבו בשעת ביצוע הקישור. 4 ++6 בקלות סוג נוסף של קבציס הינס קבצי ספריה, בעלי סיומת 115. בכל אחד מקבציס אלה משולביס כמה קבצי [פס., והמקשר יודע לשלוף מתוכס רק את הקטעיס הנחוציס לתוכנית. בקבציס אלה לא נעסוק כאן, אולס חשוב לדעת שקבצי ספריות המערכת של 6 0ח8וזסט למשל, הינס קבציס מהסוג הזה. מהו פרויקט? ב-6 6ח8!זסם מקובל לכנות בשם ייפרויקטיי תוכנית הפרושה על פני מספר קבצי מקור. התהליך ליצירת קוב 68א6 על ידי הידור וקישור נקרא עשיית פרויקט (6א18! ז66[סזק). כדי להגדיר ל-6 8078800 איזה קבצי מקור שייכים לפרויקט מסוים, מכינים קוב פרויקט בעל סיומת [זכ, שבו נמצאת רשימה של קבצי המקור. בדוגמה שלנו, קובצ הפרויקט [זק.1[סזכ יכיל את קבצי המקור 61.6!₪ ו-8!62.6. את קוב הפרויקט ניתן להכין באמצעות חלון העריכה. לשס כך, יש לבחור את הפריט 6065[סזם, בתפריט הראשי (או על ידי הקשת 46-75 בכל עת) ולבחור בו את הפריט 6ותפח 60[סזש. כעת יתקבל חלון קלט, שבו ניתן להקיש את שס קובא הפרויקט: 1[סזס. לאחר מכן, יש לבחור את הפריט 6!וקוחס60 מהתפריט הראשי, ובתפריט 6!וקוחס60 המתקבל יש לבחור את האופציה !31 801!6. מנקודה זו ואילך, ימשיך המהדר באופן עצמאי. תחילה, הוא יבצע הידור לקבצים 661.6 ו-8!62.6 ויקבל את הקבציס (61.00!₪ ו-[8162.00. אס ההידור מצליח עבור שני הקבצים, יחל תהליך הקישור. קובצ התוצר ייקרא על שס קובצ הפרויקט, 6א1.6[סזס אשר ניתן להריצ אותו. כעת נציג מהלך מפורט של עשיית פרויקט במערכת בורלנד. כיצד נבנה פרויקט כיצד נבנה פרויקט במערכת 6 סח8!זסם! 1. הצעד הראשון - פתיחת פרויקט חדש. ד 4- ]= 1:1 5 רת הנ ה החינ הפו תחפ 8 065600 165 הח 116+ 666[סעע 3 12086 | ₪612 | תרשים 41.1: פתיחת פרויקט חדש. פרק 41: יצירת פרויקט| 415 2 נבחר שם לפרויקט עם סיומת [זם.*. ומם ה 0000 8008 777 0 000000000 ]= ךס חב 6% 6% 6 הגו =[ + ]=1===== = 2) ו יי יי * ] 6 0166>6ע2 ה026 6 0760>6ע2 חש ככ ד דד? ]= 1:1 תרשים 41.2: קביעת שם לפרויקט. 3 נקבל חלון פרויקט ונכתוב את שמות הקבציםס אשר ישתתפו בפרויקט. 0 ה [1 211 | 119 5 160620 17260 ==[ , ] 8 06 8 1006100 6חהּה 116ק ו ד - ו [2 % 666 60 16860 חה 0800 610 | תרשים 41.3: נעבור לסימון הקבצים הדרושים. 4. נקבל תיבת דו-שית. נמקסם את הסמן על שס הקוב> ונבחר את הקבצים המשתתפים. ראה בתרשיס 41.4 להלן. 6 ++6 בקלות ₪ 0610550 1 6 ה 186 0[1606ע2 60 086 - 6 ה 6. 75 6פא 6 ה 76.6 2פא 6.אוזד תת 6 7 א 6 1]-- == =-------==11] 8 שחהּה 116ק 6:01.05 5.6 7 6 285% 61 9,1996 18:98 [ב< 1.4 3% ש0+ ע6כע₪ ,1165+ ע0+ ע6שס1 :[0ע568 6260670%81ה1 עס+ 6קע1 תרשים 41.4: סימון הקבצים "המשתתפים" בפרויקט. 5. כדי לבנות קובץ ריצה אחד (8א6), יש לבחור בפונקציה |!3 0!ו80 שבתפריט 6 60. [- | ו 0 1 [] (') ץ [י₪] 6002116 תּ ב || מ 4 ו 1 6וגטם 1 ]- , [== 172801865 50 4111 211 1[ * 8 06 8 0ב 100% שחהּה 116ק ו 8/ח 8/ח 8/ח 5 176 א8/ח 8/ח 8/ח 5 - 6. 105% ו 8/ח 8/ח 8/ח 5 7.6 נקקטת ד = ו תה 68 11 ו[נבטססת 1 | תרשים 41.5: הוראות ביצוע לבניית הפרויקט. למעשה, תהליכי ההידור ו/או הקישור לא מבוצעיס תמיד. המהדר בודק את התאריך של כל קובצ, ומשווה אותו לתאריך ולשעה של קובצ התוצר, שאמור להיווצר בכל שלב. רק כאשר קובצ המקור חדש יותר מקובא התוצר יבוצע ההידור. לדוגמה, לאחר עשיית הפרויקט נבצע שינוי (בחלון העריכה) לתוכנית 8!62.6, ומייד לאחר מכן נבצע תהליך עשיית פרויקט. המהדר יבצע את שלב ההידור לקוב\ 8!62.6 בלבד, כי על פי התאריך והשעה הוא חדש יותר יחסית ל-[862.00. לא יבוצע כל הידור ל-61.6!₪, כי הוא לא השתנה מאז ההידור הראשון. לאחר מכן יבוצע שלב הקישור, שכן [8|62.00 חדש יותר מקובצ התוצר 1.6%6[סזק. מסיבה זו, חשוב לעדכן את התאריך והשעה במחשב בכל פעם שמתחילים לעבוד (עדכון השעה מתבצע אוטומטית, אס מותקן במחשב כרטיס שעון מגובה סוללה). פרק 41: יצירת פרויקט | 417 מההסבר האחרון ניתן לראות שקיימת מערכת סמיכויות בין הקבציס: * [61.00! מסתמך על 8161.6. > [1!62.00 מסתמך על 8162.6. > 66א1.6₪[סזק מסתמך על [61.00!₪ ועל [00ס.8!62. תוכנית דוגמה לפרויקט התוכנית הבאה מורכבת משלושה קבציס: + קוב>\ ראשי, 86.6חו8ח המכיל את הפונקציה הראשית חופוח, ומפעיל פונקציות שנמצאות בקובצ 8.6 8!6. +> קוב המכיל פונקציות לחיבור ומכפלה של שני מספרים שלמים, וכן פונקציית הזדהות המדווחת על שס הקוב ומה הוא יודע לעשות. * קוב 0.6 8/6 היודע לספר שלוש בדיחות. את הבדיחות בוחרים על-פי מספר הבדיחה. פונקציה ואת מפעיליס מהקובא הראשי 6.6|חוהוח. תהליך חיבור הקבצים ויצירת קובצ הפרויקט הוסבר בסעיף הקודם. התהליך במלואו, על כל שלביו, בוצע על קבציס אלו. דוגמה: הקבציס המשתתפיס הס: .3 1116 - ו .₪ 1116 ם.ס 1116 0 נא */ 6 1 06 0 ₪0 6 1 %6ץ 16נ1ע קובצ ראשי / <ם.56010> 88ט61ת1+ <ם.10ם0ס> 61088ת1+ יש להכליל את ההכרצזות על הפונקציות שנמצאות בקבציס אשר בנינו. הכרזות - */ אלו נועדו לאפשר לנו להשתמש בפונקציות, כדי שהמהדר י'יערוך איתם היכרותיי, שידע על קיומן. הכרגות אלו מצטרפות להכרזות על פונקציות פנימיות המוגדרות בקוב זה. / * תהליך הבנייה של כל הקבציס לקובצ ריצה אחד מכוון לריכוז כל הפונקציות יחד. 8 ++6 בקלות "ת.8 5116" 01006ת1 "ת.ם 5116" 01006ת1 / * הכרזות על פונקציות ‏ */ ; (0010)ם80610 8 5116 16סט ; (7010)ם80%610 ₪0 1116 ב1סט (ס1סט)מ1נאת 6ם1 ן ;()0158502 ; () ם80%610 8 1116 ; () ם80610 ₪0 1116 ; ("ץ6א צְם8 6588תק")11תנ1צס ; () 9650 ; (0) םשגו26% ] בב כם-בבפכהבב-- בב בב כ ם - כב 8 א 0 סא ץק ; /% כמ תכ כ כ ה ו ה בב ימיו ב ו הכונח ה תב כ ןמוו הב וב הבו ב בב וכ ו ב ו (010ט)ם80%10 8 5116 בנ1סט /* הפעלת הפונקציות בקוב 8.6 1116 */ | ; ()תה8 1 8 1116 ;((4 ,880)3 ,"מ\%0 = (4 6ת1 ,3 6ת11)"8860)1תנ1צס ;((4 ,15)3טת ,"ת\%0 = (4 סת1 ,3 6םת1%)1גמת")11ת1צס (010ט)ם80%10 מס 5116 בנ1סט /* הפעלת הפונקציות בקובף 5.6 1116 */ | ; ()תה8 1 םס 1116 ;(56160%02)1 6א0%ך7 ; (856160602)3 6א0%ך4 */ 1 16 6 1 6 16ג1ע קוב פונקציות ראשון */ פרק 41: יצירת פרויקט | 419 <ת.856010> 0100₪6ם1 <ת.10תסס> 01066ם1 5 א 10 ץך 6 א ס ץח 0 (10סט)תה 1 8 5116 16סע ; ( "ם\שלום! אני קוב 3 5116 ואני יודע לחבר ולהכפיל 2 מספריס שלמיסם \") 65 נש (ע %ם1 ,8 %ם800)1 %6ם1 ; (ס + 8) םעגו66ץ (כ %ם1 ,8 6ם1%)1טת %ם1 ; (ס * 8) םמעגו6סץ / * ם.8 1116 : 16 2 1 6 16נ1ע קובץ הכרזות לפונקציות בקוב 8.6 1116 ,א ; (10סט)תה8 1 8 5116 שנסט ;(ע %ם1 ,8 6ת806)1 6ם1 ;(ע %ת1 ,8 6ת1%)1טחת 6ם1 */ 6 1 : 16 6 1 6 16ג1ע קוב\ פונקציות שני 7 <ת.856010> 010₪6ם1 <ת.10תסס> 01066ם1 (10סט)תה 1 ס 5116 בנסע | ; ("ם\שלוס! אני קוב ₪ 5116 ואני יודע לספר בדיחותם\") %5מ51ס ] 0 ++6 בקלות (עסמתטא6א0%[ 6ת56160002)1 70%6 בנ1סט ו (ע6סתטא70%6) ב160ח5 | ; ( "ם\מה אוכליס קניבליס בדיאטה ! גמדיסת\") %1ם21 :1 0886 ;268% "ת \ כמה גרוזיניס דרושיס בשביל להוריד תמונה מהקיר ?תמ\") %1ת1עס :2 0886 ; ( "ם\עשרה, אחד מחזיק את התמונה ותשעה שוברים תיקיר" ;268% "ת \ מדוע החבריה שתוזרים מגואה לא צריכים אוניברסיטה ?מ\")61ת21ק :3 0886 ; ( "ם\כל החומר בראש" 268%; ] ] * / ת.סם 5116 : 6 6806 : 86 16נ1ע קובצ הכרזות לפונקציות בקובצ 6.₪ 1116 / ; (10סט)תה8 1 ס 5116 בשנסט ; (ע6סמתטא10%6 6ת86160802)1 70%6 בנסע תוצאות ריצת התוכנית: שלום! אני קוב 3 5116 ואני יודע לחבר ולהכפיל 2 מספריס שלמים 7 = (4 %ם1 ,3 %םת864)1 2 = (4 6ם1 ,3 6ם16)1גטת שלום! אני קובץ פ 5116 ואני יודע לספר בדיחות מה אוכליס קניבליס בדיאטהז גמדיס מדוע החבריה שחוזרים מגואה לא צריכים אוניברסיטה? כל החומר בראש פרק 41: יצירת פרויקט ‏ 421 הרצח חהונניתת ב"++6 |בּטפוצ פרק זה נכתב על ידי אבי בוץ. הפרק ניתן כתוספת לספר. אין הוא מתיימר ללמד ++6 |1508/, אלא להראות לך את הדרך כיצד להריצ את התוכניות שבספר או כיצד להתחיל לבנות תוכנית חדשה. ההוראות מתאימות לגירסה 5 ומעלה. תיאור תהליך הרצת תוכנית חדשה ב - ++6 ובּטפו+ שלב 1 פתח פרויקט מסוג חסט8סו|סק 50!6ח60 32חו/), אשר יאפשר להריצ את התוכניות שבספר. תן לפרויקט שס <6וח89\ 60[סזק> ולתצ על לחצן 06. |<|?. סא :חב וספןסזק :סו]הסס | ₪ \8ב\:ם )סו ופה 0168/65 6 חס 0 47 קוש]סזזחס-) 6%ווס ה ו 85| ₪ (1) זקו/ו\םסה. הוחו 5! ב---3ק [6א6) 0זהקו יפקה ות 3135856 וו 62% וססןסז וו 1 הסוה וקב 132 | מ | וסוס 8016 חס 32תו/ ‏ | וזו | אחז 1-סותח מע 2 חואו > | :זט ]ובו אש מ 2 ++6 בקלות שלב 2 בחר פרויקט ריק <66[סז קוח6 חג> ולחץ על לחצן הפוחו=. פרויקט ריק מאפשר ליצור קובצ מס ריק, אשר בו תכתוב את התוכנית שלך. |<|?. יט שלב 3 בחלון וה תתבקש לאשר את סוג הפרויקט שבחרת. לת על לחצן 06. 1 8 פרק 42: הרצת תוכנית ב- ++6 |508ו\ | 423 שלב 4 לאחר בחירת הפרויקט יש ליצור קובץ סכ6 ריק עבור התוכנית. בתפריט ₪6 בחר אוס]. ב-80ד בחר 65!ו, וב-1!65= בחר 6 06זטס50 ++6. תן שס לקוב> 6וחפּח 6 ולחץ על 0% לאישור יצירת הקוב\. ₪ רתי שלב 5 בחלון זה תראה את התוצאה הסופית. ב- 39 בחר ש6ו/6!₪ כדי לראות את הקובצ שבחרת (00ש.6590+) כשהוא ריק. לאחר כתיבת התוכנית בדוק שגיאות בעזרת צירוף המקשים 7=+001 ובעזרת צירוף המקשים 5=+6₪1 תוכל להפעיל את התוכנית, כשתהיה כזו. 6[ יר | = | 8 ₪ | 5 ₪||*ף תה אפסו 0 <2.ת03ע105%> שבגו1סמ1+ |< | (בנסט)מנפת בנסט ‏ :1 >> "תהעפסעק ++₪ 5%ע12+ עת" >> פוסס 4 ++6 בקלות תיאור תהליך הרצת תוכנית קיימת ב - ++6 ובּטפו+ שלב 1 פתח פרויקט מסוג חסטהסו|ס 50!6ח60 32חו/), אשר יאפשר להריצ את התוכניות שבספר. תן לפרויקט שס <6וח89\ 60[סזק> ולתצ על לחצן 06. :שוחב זספןסזק :חסו)הסס 1 ווה 6016316 שזהקו/סזוחסכ) %שעוסג. הויו 85] / ((ם) טזקוא\םג, חן 9 +- ----כק [8א6) םזב2ו/יקק ה ]= קוא 3180390 אוסוא ‏ +ספןסז עווונ ו הסווהסווקק ג 32חו/\ | תד | וו סווקק ג 6ו0פססו תו .| עזבזס | אחז |-סוחזב חכ 2חו/\ > | םוט מ סמו 2ו שו שלב 2 בחר פרויקט ריק <66[סזק קוח6 חג> ולחץ על לחצן הפוחו=. פרויקט ריק מאפשר ליצור קוב\ מְק6 ריק, אשר בו תכתוב את התוכנית שלך. |<|?. 1 1 5660 - הסוזהּ6ו!קק4 6!ס5חס:) 32חו/א גוס ₪0 חסווהסווקק3, 6|ספחסם) וס טחו₪ )בח ? 0 זחה ו .₪ 0 ₪ הסווהסווסקב ט!זסעע ,46" א 7+ 5)זססקופ 081 הפווהסווקקה תה 7+ 06[ | פרק 42: הרצת תוכנית ב- ++6 |508\ 425 שלב 3 בחלון וה תתבקש לאשר את סוג הפרויקט שבחרת. לת על לחצן 06. ו שלב 4 מתפריט 0[66זק בחר 66%[סזק סד ₪00 -> ...₪165 כדי להוסיף את הקוב הקייס. 6 ++6 בקלות שלב 5 מחלון 0[606זק ספחו 1!65=₪ 156% בחר את הקובץ הרצוי ולח על לחצן 06. ]ןז סזחו 65!ו] ]ז56ח! | שלב 6 הצג את התוכנית, בדוק אותה (7"+601) והפעל אותה (5=+601). [<זם] = [פקס-1 5801] - ++2 05081 40105016 1 1055208+ 41145 [5)\ספוסום 1 "ס|קוחמאז" שן ₪ ו 3 (038ט)מ1בת הנסט -ר ;"מ149טבת 15 שתפת ע8" >% פגוסם 1 ו 1-0 (5)בַמ1מעהח 0 ,(5)ע0סעעש 0 - 5א64 16כת5>ם| פרק 42: הרצת תוכנית ב- ++6 |8שפו\ ‏ 427 בחלון וה נראה את התוצאה. 48 185 סחהּח ע!! 606 60 ע%6 עחה 655עק 8 ++6 בקלות מילון מונחים לעובר 6% לד ++6 כדי להשלים את הספר בחרנו להוסיף מילון מונחיס אשר יעזור למתכנתיס בשפת 6 לייעלות כיתהיי ולהכיר את המונחים הנוספיס או/ו השוניס ממה שמוכריס להס. מ-5 ל-6 ומ-6 ל- ++6 בשנת 1967 פותחה שפת תכנות שנקראה ]ק86, על ידי 65ז8ח6ו₪ החזבּוו. חספקוהסוד ה6א השתמש ביסודות משפה זו בצירוף יסודות משפת 8, אותה פיתח, על מנת ליצור את מערכת ההפעלה א1א(ו, בשנת 1970 במעבדות ||86. באותן מעבדות פיתח ₪116 5וח6 בשנת 1972, על בסיס שפת 5 את שפת 6. שפת 6, שהיתה ידועה כשפה לפיתוח עבור מערכות א1א!\, הוסבה במשך השניס לשימוש ברוב המחשבים. בשנת 1983 הוגדרו סטנדרטים בינלאומייס של השפה (1651). בשנת 1980 פיתת 5 6חז3[ במעבדות בל את השפה עליה נסוב ספר זה, ++6. השס כולל את אופרטור ההוספה של 6, כדי להורות ש- ++6 היא גירסה משופרת של 6. נכון להיוס, שפת 8 אינה עוד בשימוש. במקומה שולטת שפת 6 וייאחותהיי הצעירה, שפת ++6. נספת זה מכוון אל תוכניתני שפת 6 אשר עובריס לתכנות בשפת ++6. ראוי לציין שרוב התוספות שנעשו בשפה מכוונות לתמיכה בתכנות מונחה עצמים (סחווחהזססזק %60ח016) 00[66), ונושא זה מבואר בהרחבה בספר. עס זאת, כמה תכונות נוספו כדי לפשט, להרחיב או לשפר, את סביבת העבודה של התכנות ב-6. מטרת נספח זה להצביע על מספר שינוייס במינוח ובפקודות, אשר יקלו על תוכניתני שפת 6 בהגיעס ללימוד שפת ++6. הנושאיס ניתניס כאן בתמצית, מכיון שהס מוסבריס בהרחבה בגוף הספר. מן הראוי לציין שהשפות 6 ו-++6 מתפתחות בגרסאות שונות כל הזמן, ועל כן ייתכן שיימצאו הבדלים שונים, או שהבדליס שאנו מצייניס כאן אינס קיימים יותר. נספח: מילון מונחים לעובר מ-6 ל- ++6 429 מערכות קלט/פלט מבוססות מחלקה שפת ++6 תומכת בכל מערכות הקלט/פלט של 6, אולס בנוסף לכך, היא מגדירה מערכות מבוססות מחלקה. היתרון בשימוש במערכות מבוססות מחלקה של ++6 הוא בכך, שהן תומכות בתכנות מונחה עצמים ויכולות לפעול על אובייקטיס המוגדרים על ידי המשתמש. התמיכה של ++6 במערכות קלט/פלט נמצאת בקובצ הכותר .אפ דפסז. המחלקה 105 היא המחלקה הבסיסית שבה משתמשים בדרך כלל לצורכי קלט/פלט ב- ++6. בטבלה הבאה מוצגות מחלקות של ++6 והמטרות שלהן: מחלקה מטרה הח8 5 | קלט כללי וח8 05 | פלט כללי הה 05 | קלט/פלט כללי וו | קלט לקובצ 08 | פלט לקובצ וח168 | קלט/פלט לקובצ ה | קלט מבוסס-מערך 05050768 | פלט מבוסס-מערך 5568 | פלט/קלט מבוסס מערך ערוצים מובנים ב- ++6 כאשר תוכנית ++6 מתבצעת, נפתחים ארבעה ערוצים מובנים. ערו משמעות התקן חו₪ | ערוצ קלט בסיסי מקלדת | ערוצ פלט בסיסי מסך ץז | ערוץ פלט שגיאה בסיסי מסך 48 | גרסת מאגר של 0677 מסך 0 ++6 בקלות ערוצים חלופיים ב- ++6 הפקודה אחוזק המוכרת מ-6 נקראת 600% ב- ++6. הפקודה 56871 המוכרת מ-6 נקראת חס ב- ++6. לדוגמה: ; ("סתהת עטסצ ע6סםע") 65>תנגעס ; (סתהת6 ,"%6") +ת508 ; "סתאת עגטסץ שס6סםע" >> סגוסס ;ספת << םמ01 יש לשיס לב לסימן קטן מ- הכפול (>>) שנוסף ב- ++6. והו אופרטור הכנסה (0ז8ז6קס הסוז56חו וח50768). הסימן גדול מ- הכפול (<<) הוא אופרטור ההוצאה (ז0ז68ק0ס ה0 607860 הח5068). יש לשיס לב שסימנים אלה הס בעלי משמעות נוספת ב- ++6: הוחה לשמאל ולימין בהתאמה. המהדר יידע להבחין בין שתי המשמעויות בהתאם לתבנית שבה נמצאיס הסימנים. ראה הסבר מפורט על סימניס אלה בספר. כפי שרואיס בדוגמה ב- ++6 אין צורך להשתמש במצייניס %60 ו-6. אחת המטרות של שינוי וה היא הפיכת התוכניות של ++6 לקריאות יותר. קריאה לפי שם, או על ידי ייחוס בשפת 6 קוראיס לפונקציה נעשית על פי ערך. שפת ++6 מבצעת קריאה ישירה על פי שם, על ידי ייחוס (6+676066). כדי לציין שמשתנה הוא משתנה מיוחס, יש להוסיף לפני הטיפוס של המשתנה באב-טיפוס של הפונקציה (26ץ+ס%סיוק ח00וש6חט+) או בהצהרת הפונקציה (ח3%10ז666!3 ח0ופ6חט+) את הסימן 8. בקריאת הפונקציה יש לציין את שס המשתנה אשר יועבר על ידי ייחוס. באופן זה ניתן לעדכן את ערך המשתנה המקורי מתוך הפונקציה. משתנים מיוחסים יכולים להיווצר גם בתוך פונקציה. התבנית הכללית היא: סתהת 82806662ק 66ת1 הגדרות משתנים ב-++6 כל ההגדרות בשפת 6 חייבות להופיע לפני כל משפטי הרצה. שפת ++6 מאפשרת לתוכניתן למקס הגדרות קרוב למקוס בתוכנית שבו משתמשים במשתנים (אך כמובן לפני). דבר וה הופך את התוכניות לקריאות יותר. נספח: מילון מונחים לעובר מ-0 ל- ++6 431 ;803 %ם1 ,611 6ם1 ("806 עטסץ עס6סתםע") 65םתנ1נעק ; (11ב608 ,"%6") 5םת508 ("ץ58182 עטסץ ע66םע") 5ש>תנמס ; (82ת6880 ,"%6") +ת508 ("... 18 צץ58182 עטסצ")+ש>תנעס "800 עגמטסץ עססםם" >> סטסס 2 סם1 7 << ם01 "ץ58182 עגוסץ עס6סםע" >> סגוסס 2 סמסם1 "...18 581827 עטסצ" >> סגוסס 12 >> 0006 יש לשים לב שהגדרת המשתנים מופיעה אחרי משפטי הרצה שונים, אך סמוך ולפני השימוש במשתניס הכלוליס בהגדרה. כתיבת הערות בתוכנית כתיבת תוכניות מחייבת לפעמים הוספת הערות בגוף התוכנית, שמטרתן לעזור בהבנתה על ידי תוכניתניס אחרים, שלא כתבו אותה (ולעיתים על ידי התוכניתן עצמו, מכיון שלאחר זמן הוא עצמו עלול לשכוח את משמעות הפעולות או הפונקציות). פעולה שימושית זאת נעשית ב-6 באמצעות סימון של קו אלכסוני וכוכבית בתחילת ההערה ובסופה (/* גוף ההערה *). הערות ב- ++6 מסומנות בתחילתן בלבד בשני קוויס אלכסונייס בלבד (גוף ההערה //. לדוגמה: /* 6 ם1 %תסתתסס 8 18 18ם6 */ ++6 ם1 6ת6תתסס 8 18 18ם6 // %תסתתסס 8 18 18ם6 */ רש 18 86ם6 /*8ת028ס?ק 6 ם1 6 18 8פג1גםס // 8 סתתסס צץ₪8 // ++06 ם1 0866 סשע8 // 2 = 1 /* 6מסתתסס 8 18 18ם6 */ 6ם1 2 ++6 בקלות שימוש בסגנון ה לכתיבת הערות יכול למנוע היווצרות שגיאות, כמו בזמן ששוכחיס לסגור הערה עם סימן קו אלכסוני וכוכבית. יש לוכור, שאת הסימון להערות בשפת ++6 יש לרשוס בתחילת ההערה בכל שורה בה היא מופיעה. מכיון שהמהדריס של ++6 מביניס תוכניות הכתובות ב-6, התוכנית תובן גס אס ההערות נכתבו בסגנון של 6. מילים שמורות 2 מילים שמורות מוכרות הן ב- 6 והן ב- ++6: סטתנסתסס %פתסס צאתס 6 %עס ססגוף8 מ%67א0% תגוס 6 6 טס סס 6186 %תס1 1% 15 00 2ס+ 1% 10 2005 | %שמעסם5 םע 2600‏ 26818662 8 פ6ת16פתט מסנמגו 1 ץ 60 בשפ מסגוע56 86 שש 186116סע בשפת ++6 יש מיליס שמורות נוספות. אלו הן המיליס אשר בשימוש רק ב- ++6: 2 שילוב שפת אסמבלי בתוך תוכנית ++6. תבנית שימוש מקובלת : ;תס1נ%סטע58%ת1 תפה8 חתפה 6 מתמס1ש0גמע56ת1 ן 00 פעולה אשר מתבצעת בשילוב עם ץז ו-שסזח+ לטיפול במצבים חריגים בתוכנית: לכידה של המצב החריג. 58 הגדרת מחלקות. תבנית מקובלת : ] 0-118%ת168ע6תת1 : ₪088 018588 0% צ פעססתפת 178%66עק// :מ 8 00 צהת 8%6ם5 פפ6סתפת 866ט1עס // :טס פפפסת 116סגס // + 7+ נספח: מילון מונחים לעובר מ-6 ל- ++6 433 (מחליף את 1766 של 6) 1% משחרר (166)) או הורס 06507060) את האובייקט שהוכנס לזיכרון על ידי שסח (ראה בהמשך). תבנית מקובלת : ; ת8ת218016אט ק 461666 ו הגדרת פונקציה או מחלקה כחברה של פונקציה או מחלקה אחרת. פונקציה חברה יכולה לגשת לאלמנטים הציבורייס והפרטיים (ראה בהמשך) של המחלקה. תבנית מקובלת : ] שתאת מס61סםט5 01858 // :טס ; (כ 108%+ ,8 %ם1) תסנ1נפסםט+ ב1נסט 0₪ם1218+ // ;ן 16 ציוו למהדר לשלב את פקודות הפונקציה ברצף הפקודות שבקוב>, ולא כפונקציה נקראת (הגדרה מעין זו יכולה לחסוך בומן עבודה של התוכנית ובגודלה). תבנית מקובלת : ( 6ת1) סתהת מסנססתג? ב1סט 6ם11ת1 \ // ] (מחליף את 8|!06ח של 6) 10 הקצאת זיכרון עבור אובייקט. בשפת 6 היה צורך להגדיר את גודל הזיכרון שרוציס להקצות, ואילו ב- ++6 מספיק להוסיף ששח לפני שס האובייקט כדי לקבל את הקצאת הזיכרון הדרוש ולהחזיר מצביע אל הויכרון מהסוג המתאים. תבנית מקובלת : ; סתהתסקץ6 שסםת = (ת8ת218016א8ט כ יש הגדרות נלוות נוספות ל- ששס6ח (ראה בגוף הספר). סקס השפה מאפשרת שימוש שונה, המוגדר על ידי המשתמש, ברוב האופרטוריס הקיימיס בשפה (חוץ מ: . : *. 1).המהדר יפרש את האופרטור לפי ההקשר שלו.הפקודה הזו מגדירה פונקציה של אופרטור מועמס (ח60חט1 זסזבּוסקס 0ס6בּסווסעס).יש להבחין בין מונח זה לבין המונח פונקציה מועמסת (חסוז6חט? שַחוההּס!וסטס), אשר 4 ++6 בקלות מתאר את האפשרות שקיימת ב- ++6 להגדיר מספר פונקציות עס אותו השם, אבל עס פרמטריס שוניס. תבנית מקובלת לאלמנט של מחלקה: + (6%6%2-118%ת2828)% 628%0%8ק6::0ת8ת-01888 6סץ5 םע660ץ, // תבנית מקובלת לאלמנט שאינו של מחלקה: ] (118%5--ע828(6%6%ק)% 00628602 6ס7ץ6 םע660%ץ, // ] וו מציין הגישה של האלמנט הפרטי של המחלקה, הנגיש לפונקציות חברות מטיפוס של האלמנטיס הפרטיים. תבנית כללית : 1 ₪80 0185855 // 86 8866 // :6ס86ט1עק 58 66הט1עס // ;ן תבנית להגדרה של אלמנט פרטי כמוריש : 2 )+ 0896-01888 108%6עס : ₪86 01899 ו מציין הגישה המוגן הוא הגדרה לאלמנט מורחב של 6ספעוזק, הנגיש גם לפונקציות נגזרות. תבנית מקובלת : 1 0188585 // 8 8866 // :2065608560 58 20060060 // ;ן ו מציין הגישה הציבורי הוא הגדרה לאלמנט מחלקה הנגיש לכל פונקציה. תבנית מקובלת : 1 ₪080 018585585 8 ססהט1עס // 6שס 8%6ת // :116סגוס 8 1160סגס // ;ו נספח: מילון מונחים לעובר מ-6 ל- ++6 435 כאשר משתמשים בו כמציין מוריש, התבנית הכללית חיא : // ) 0886-01888 116קטק : 686 01889 ו המילה השמורה 6001866 (תבנית) מאפשרת ליצור תבניות של מחלקות ופונקציות כלליות. בפונקציות הכלליות מוגדר סוג הנתון כפרמטר, לכן פונקציה אחת יכולה לשרת מספר טיפוסים שוניס של נתוניס. מוגדר בה סדרה של אופרטוריס כללייסם אשר מיושמיס לטיפוסים שונים של נתוניס. תבנית מקובלת : <עקץס08%8-6 01888> 661866 (118% מִסַסַתתַה28ס) סת8ם-6מגו1 6סץ6 ו מסנססתט? 0% צְ08סס // ] 15 זהו מצביע (ז6זחוסס) לאובייקט, אשר פונקצית חברה קוראת לו. טצסיוו11 פעולה המתבצעת בשילוב עס ץש ו-ח68%6 לטיפול במצביס חריגים בתוכנית: הכרזת מצב חריג. יח פעולה המתבצעת בשילוב עס צוסזחץ ו-ח68%6 לטיפול במצביס חריגיס בתוכנית: בחינת מצב חריג. [ווו1ש מציין הפונקציה |פטשזוצ מגדיר פונקציה וירטואלית, שהיא טיפוס של חברה במחלקה בסיסית. התוכנית תשתמש במחלקה הבסיסית הווירטואלית במידה והיא לא תידרס על ידי מחלקה נגזרת. תבנית מקובלת : 7 = (1186-ת828ק)6ת8ם5 6קץ6 תעט66ע 81ט126ט 6 ++6 בקלות לחרו סינלנים >> אופרטור הכנסה 338 << אופרטור שליפה 338 8 ייכתובת שליי 130 % שימוש כמשתנה מיוחס 431 6% 00 92 94 חס0%‎ ! | זס 92 :: ייטווח ההכרה' 74, 145, 213, 223 / הערות 64, 432 . נקודה 74 % מודולו 73 + חיבור 237 - מינוס. 237 0\ |ו₪ 51, 175 אּ\ 51 ט\ 51 צ 51 ח\ 51 51 \0 ז\ 51 51 \ צ\ 51 הההא\ 51 [) סוגרייס מסולסלים 43 חוהוח סוסצ 41 נליודודים סקס חהסולז56חו 0 ה860י%א6 סקס 007655 61676006 /87180!6, ₪56 + סקס סאג והסוטסו ]סקס דא [הסוטסו סקס 0 [הסוטסו ]סקס הססט|650ז |הטסוף ו 5% סוטססרח פטוס 5טחווח טח הזה סוה 86650866 6 6 1660 סז 6 6חוועשסח 05 זה 6 הזו 68771806 "6 0 |הזחסקווסת 6 ל |68ס 6 |08חו8066א6ח 5 חוהחח סוסצ מפתח סימנים מיוחדים | 437 רעינלת טבלאות טבלה מס' 3.1: תוויס מיוחדים לשימוש בצירוף עס 600% טבלה מס' 4.1: רשימת טיפוסי משתניס נפוצים בשפת ++6 טבלה מס' 4.2: רשימת מילים שמורות ב-++6 טבלה מס' 5.1 : אופרטוריס אריתמטיים בסיסיים בשפת ++6 טבלה מס' 5.2: רשימת אופרטוריס בשימוש בתוכניות ++0 טבלה מס' 5.3: סדר קדימות של אופרטוריס טבלה מס' 7.1: אופרטורי היחס בשפת ++6 טבלה מס' 9.1: דוגמה של שמות בעלי משמעות לפונקציה טבלה מס' 24.1: אופרטוריס שאינס ניתניס להעמסה בתוכנית ++6 טבלה מס' 34.1 : ערכי קוד הפתיחה של קבציס 8 ++6 בקלות אינדקם עברי א אב-טיפוס של הפונקציה 212 אובייקט (ראה גם עצם) 210 פונקציה 411 אופרטור [] 248 סה 86 73 92 6 319 325 60 50 6% ! 94 זס וו 73, 92 צוסח 316, 325 אונארי 245 כתובת של 86 50, 130 הגדלה עצמית 70 מאוחרת 71 מוקדמת 71 הכנסה 48, 80, 431 העמסה 237 לא ניתניס ל 245 על ידי פונקציות מטיפוס 11600 246 הקטנה עצמית ‏ 72 מאוחרת 72 מוקדמת 72 הקלט/הכנסה 48 השמה 59, 143 טווח ההכרה 141, 145, 223 יחס 86 לא שווה =! 243 לוגי 92, 95 מינוס 238 מתמטי בסיסי 67 אינדקס עברי 6 ס6סזכ הסטסחות יי רו סה וי 60 %ח זס שוח 5 סח אפס אחסום חסו56חו ו 0הסוזסעס ו או50סק אחסום הסוח 3550 חסטטו650ז |הססוף |חס6|]3" |ה6ופסו חזהרח 8516 9 נקודה 211,186 סדר קדימות 74 פלוס 238 קביעת סדר הפעולות. 76 שווהת == 243 שליפה/הוצאה 80, 431 אחסון מידע 56 איגוד 192 אחסון מבנה 193 אנונימי 195 איטרציה 103, 401, 403 אלגוריתס 401, 404 אלמנט חברי 285 מוגן 268, 288 פרטי 211, 217, 220, 268, 285 ציבורי 211, 217, 220, 268, 285 סטטי 254 שמות 269 אמת/שקר 93 אסמבלי, קוד 349, 433 שילוב בתוכנית 353 ארגומנט 6 357 צףזהּ 357 של שורת פקודה 356 ב בנאי 226, 230, 264 מצביס חריגים 397 בנייה, פונקציה 226 בדיקת תנאי 95 בסיס אוקטלי והקסדצימלי 52 ד דיוק 63 0+ ++6 בקלות 00% 6 6 סחון|סישהסס ח0סוז86 אס סו רסחו פחוס50 חסוחט 0חוז5%0 פס הסחהּ הסחפ סו ו 0חסו 0 ס6פטוזס וסוס 6 6 6 06 חחהּ! !35560 595 35 החו5 ו ו 000 6% חסופוססזוס ה הודעות 46 הורשה 261 אלמנט (ראה אלמנט ומחלקה) מה זה 265 מרובה 272 משורשרת 276 עצ 283 פשוטה 262 האחה 91 הידור 33 הסתרת מידע 218 העברת פרמטריס 131, 155, 157 העמסת אופרטורים. 237, 245 על ידי פונקציות מטיפוס 171600 246 העמסת פונקציות 149 בנייה 230 הערות. 64, 432 הצהרה על משתניס 57 הצהרה על עצמים 307 הצהרת הפונקציה 123, 212 הרשאה סספטוזק 277 סוגים 280, 282 ספטוזסק 281 00 282 סווטטק 280 ז זיכרון 315 הקצאה דינמית 316 מאגר זיכרון חופשי 315, 323 מוגדל 325 מודל זיכרון קטן 319 מנהחל מאגר 324 שחרור שטח 319 פעולות. 323 חחח 6|סחוטווח חו8ח6 6וחופ הס חח חסחה!וקוחס6 הווח הסטהותזסזחו ו סהס!זסעס זססהוסקס 5חסוססחז סחוסהס!וסעס 65 ח066!87900 חסט6חט+ ץזסרחסרח 6 166 0 006 ססר |ורח5 !68 5ח וסקס אינדקס עברי ‏ 441 ט טווח ההכרה 146, 223 טיפוס 203, 297 זו 204 8% 171 וו 246 +חו 204 הַחס| 204 נתון מוחזר מפונקציה 124 תבנית כללי 295 , ייחוס. 153, 431 יצירה תוכנית ‏ 32 ירושה (ראה הורשה) 261 ל לולאות 100 6|וחצו-00 107 זז 101 6)וחצ\ 106 איטרציה 103 אינסופיות 104 קידוס לולאה 103 מ מאגר זיכרון חופשי 315, 323 מאקרו הוראות 364 החלפת משוואות 369 הבדל בין מאקרו לפונקציה 370 מבנה 184 איגוד 193 רשומה 184, 187 שס מבנה 185 מהדר 33 34 בורלנד 33 מוכללים, עצמים 217 מונחה עצמים, תכנות 210 12 ++6 בקלות 6 ב זו ו 0חסו +חו פחסו 6 הזוס 6 6 0 רחהזססזוס חח 5 6ווחצו-00 זסז 6ווחעצש חסספּזססו הוחו כקסס| +חה6וח6ז6חו 106 506 0זרח 5-ו 605 8חו36!כסז 05 6חטז חס 61067 86705 ששסת וב חסוחט 1-5 00 זס|וקוחסס סחהוזסם 5 ססחוהזחסס ]561 חורה וזכ 60סה6ווס 6[סס מזהה מחלקה 291 מחלקה 207, 209 5 ]0% 331 יי רהו 231 ויב 05 331 - וב איבר 223 אלמנט 211 זו ו הורשה 261 6ח סח חן מוגן 268 פרטי 211, 217, 268 ס6זהעוזק ציבורי 211, 217, 268 סווטגוס בסיסית 261 6 בנאי 226, 230, 264 יי גירה 376 6 חברה 285 0חסו הגדרה 286 וח הגבלת גישה 288 5 650086 מזהה 291 נוי מצב חריג 393 משתנים 251, 390 נגזרת 261 0 פונקציית 212 214 חסטסחט+ שיטות 210, 214 5 תבנית 300, 303 וי הגדרה 301 הצהרה על עצמים 307 תכנות מונחה עצמיס 210 חורה סז %60חסוזס ז66[סס מחסנית 129 ו מחרוזת 175 58 אתחול 179 0חולו|הטוחו הגדרה בתוכנית 176 060370 העברה לפונקציה 180 חססח? 60 חַחו55ה הצבת תו |ווח 177 ווח 05חסקסהּ קבוע 179 ו תוויס 47, 175 5 סריקה 202 מידע, הסתרה 218 מיליס שמורות. 59, 433 וס 6חווחו 351 אינדקס עברי 443 6% 185 |השזוצ 378 מכולה 401, 402 מספרים בבסיס אוקטלי והקסדצימלי. 52 בייצוג נקודה צפה. 47 שלמים 47 מערך 167 איבר 168 אחסון מידע 56 העברה לפונקציה 172 הפעלת מצביעים 203 משתנה 168, 171 ערך אינדקס 168 מצבים חריגיס של שפת ++6 385 386 68% צוסזו 387 צם 386 בלתי צפויים 391 בתוך הבנאי 397 פולימורפיזּס 394 פונקציית טיפול 388, 392 של ברירת המחדל 391 מחלקת המצב החריג 388 משתנים 390 קביעת המצביס החריגים 393 של מחלקות 393 מצביע. 127, 198 הפעלה 203 למחרוזת תוויס 199 לרשומה 190 משתנה 130 פעולה 198 קידוס למחרוזת תוויס 201 משפט אמסזט 97 68% 386 330 ,47 ,43 60 86 ]] 4 ++6 בקלות וס 5זסטוווח א 000 +חוסק פחההסח 5זסטוחטח 6|סחש ץפזוםּ 6% החסוהווסוחו חווסל5 חסוסחט? 60 חַחו55ה 5ססחוסכ 8חופ 6סה\ 6|/ע אססחו 5 +66 ו צוסזח+ צח זה הסוא 6 5 508000 65 זססחוסק 500 ז40ז3ח6 סש זססחוסק 5066 0 זוססחוסק 6 זססחוסס חסוזהוסקס 5 6סזם 6 0 ו 6ו סחוי 39, 40 חצפ 96 צוסזו 387 ץח 386 חוהוח סוסצ ‏ 39 41 ברירת מחדל 97 ביצוע חוזר 101, 102 הגדרה 171 הזחה 91 השמה 39 השפה/התוכנית. 39, 40 מורכב. 87, 89 פשוט 87 מיתוג 96 צמצוס עודפים 201 תוכנית 32 תנאי 39 6 90 ]\ 86 בדיקה 95 מורכב 92 משתנה 56, 58 1% 333 אחסון מידע 56 אינדקס 170 גלובלי 143 הצהרה/הגדרה 57, 431 הקצאת ערך 59 טווח ההכרה 146 טיפוסים 57 מחלקה 251 שיתוף 252 מחלקת מצב חריג 390 מיוחס ‏ 153 מצביע 130 מקומי 141 הגדרה 142 סביבה 361 6ווסחו ח6ו\\5 צוסזחץ צח חוהוח סוסצ וי 55 0חו680כס חסוז חח 3550 רחפוףסיוס סק 60 6וחופ ח6ו\\5 59305 606055 חהווהוחום רחפוטסיוס הסוח 60 56 + 6 הסוסה רסחו הַה0ס5 אססחן ו3סו 669 6 3 0חוח0ו855 0006 5 5 6660 6 זססחוסק |63ס! +חסוהחסזושצחס אינדקס עברי 445 ערך 61 גלישה 62 פרטי 219 ציבורי 219 סטטי 254 קביעת שמות משמעותיים 58 רשומה 187 שימוש בערכים. 61 שם 58, 142, 145 מתאם 326, 410 נ נקודה מובילה 332 נקודה צפה, מספרים בייצוג 47 נתונים, קליטה מהמקלדת 80 ל סביבת עבודה/סביבת תכנות 37 סוגרייס מסולסלים [ )+ 43 סוף קוב 341 סיומת קוב\ 33 סימן הנחיה ‏ 32 סימניס מיוחדים 437 סמלי הקבצה 40 ספריית הרצה 136, 182 פונקציות 137 ספריית תבניות סטנדרטיות 400 אוספיס נתמכים 403 עקרונות 400 עּ עיבוד מותנה 85 עורך 31 עצם 210, 212 הצהרה על 307 יורש 261 מוכלל 217 פולימורפי 374 6 ++6 בקלות 5 הוח סרח -] 6ט|פע 6'5|טהז3/ סחופט סח זמ \5 6 וי 5זסטוחטח ,הוסק פחטבּסה חס חסזו 6 ₪ הורחרחהזססזוס 5305 סחוסטסום 6 חס הסוזחזאס +קוחסוס 605 5סטהץ5 סחהוקטסום ץזהזסו! 6וחם-חוז 5חסססחט+ וב 0חו6655סזכן |החסטווסחס6 וי יי חח חח 60 ]56 ערוצ/יס רח3 57 מובנים 430 6 חלופיים 431 סוה הפלט 43 331 טס טס 0 43, 47, 330 יי הסטנדרטי 83 0 לקוב\ 339 6 סש הקלט 81, 331 %טסחו חס 82, 330 חוס הסטנדרטי 83 50 לקוב\ 340 6 ה 0 ערך 59 6|פצ אינדקס 168 אססחו ברירת מחדל 160 השוואה 86 וקו סס הקצאה 59 0חוח0ו355 פרמטר 127, 130, 162 6 | זסססוחבוהק סטטוס יציאה ‏ 42 6 55905 זוא פ פולימורפיום 374, 394 רחפוחוקזסוחץוסק יצירת עצם פוליפורמי 378 6וחקזסוחץוסק 3 8חואהוח מתי להשתמש 381 סטטי 408 6 פונקציה 111,42, 113 חסטסחו 1 139 ]ה 0% 331 ית ח56 182 בויב זאו\ש5 182 ויב זז 182 5 אב-טיפוס. 124, 213, 431 6 סז אובייקט 411 בנייה 226 ו העמסה 230 יבירה 227 ערכי מחדל של פרמטרים 229 החזרת ערכיס מפונקציה 121 5 חחות סז המרת הפלט 52 העברת מידע לפונקציה 117 הסטהוזסזחו חַחו355 אינדקס עברי 447 העברת מערך לפונקציה 172 העברת פרמטר לפונקציה 120 העמסה 149 הצהרה 123, 212, 431 וירטואלית 378 טהורה 381 חברה 289 טיפול 392 טיפוס ‏ 11600 246 טיפוס נתון מוחזר 124 יצירה 114 לשינוי ערכי שדות ברשומה 188 מחזירה ערך/לא מחזירה ערך. 121, 122 מחלקה 212, 255 מחלקה סטטית. 255 מחרוזת 182 ממשק 220, 223, 268 מערכת 138 משולבת. 212, 349, 352 במחלקה 352 סטטית 251 סטטית משותפת 255 ספריה 137, 182, 413 ספריות הרצה סטנדרטיות 136, 182 פירוק, מפרק 226, 232 פרטית 230 קוראת 123 קריאה לפונקציה ‏ 113, 117 שס 114 תבנית 294 הגדרה 295 טיפול במספר טיפוסים 296 פירוק, פונקציה 226, 232 פלט אורך 53 פונקציה להמרהה 52 סטנדרטי 53 ערו לקובצ 339 תוויס בודדיס 82, 333 8 ++6 בקלות ץפוה הַחו55הכ 5ז וה הק הַחו55הק וה סוסעס 0603780 |הוצ 6זגוס 0חסו זה הסוא ההשו 6 הזוס רת 5006 6306 סט|פע חזוססז 5 6 9 וח רח56ץ5 סחווחו 5 חן סרח 50806 ץזבזטוו 5 6חחוס-חט 5 ספטוזס חסססחט 3 חחז!|68 בי סוס 5 6חוז 8 8% 6 6חס פעולות אריתמטיות 67, 76 פעולות קריאה/כתיבה 345 פקודה ח₪ 330 0% 330 פרויקט, יצירה 213, 413, 415 תוכנית דוגמה 418 פרטי 217 פרמטר 127 ברירת מחדל 160 העברה לפי ייחוס. 155, 157 העברה לפי כתובת 131 שינוי ערכים. 127, 128, 130, 162 צ ציבורי 211, 217, 220, 268, 285 קִ קבוע בעל שס 364, 365 06 367 יצירה 367 קדס מעבד 366 קובצ אצווה 42 כותר 137,40, 331 ח.רח8 050 331 פעולות קלט/פלט 338 קריאת שורה 341 מקור 31 414 סגירה 344 סוף 341 פתיחה 347 פעולת קריאה וכתיבה 345 קוד אסמבלי 349 קישור 414 קלט מילים מהמקלדת ‏ 83 ניתוב 83 ערוץ לקובץ 340 חוס 60% ןי סזפטוז ההק 5 סרה הזה 0618016 6 זז עס 5 ההק סחוסחהת6 וסוס 605% 0סחחהח 06 60 כ סח 8% ו ןו ה רפסו פחסספזסקס 0/ו 6חון| 60606 3 0חו080ז 06 6059 0 9חוחססס וסקס שוש 8 7680 >חוו זטסחו ו אינדקס עברי 449 רצף תוויס מהמקלדת 335 שגיאות 82, 343 שורה שלמה מקובף 341 תוויס בודדים 82, 333, 334 קלט/פלט בקבצים 338 בדיקת שגיאה 343 מערכות מבוססות מחלקה 430 תוויס בודדים 82, 333 קריאה/כתיבה 345 " רשומה 184 מבנה 184, 187 שס מבנה 185 מצביע 190 משתנה 187 שדות 186 תבנית 185 רשימה מקושרת 308 בנייה באמצעות תבנית 308 ש שגיאות אי התאמה בסוג 82 גלישה ‏ 62, 77 דיוק 63 תחביר 36, 37 קלט/פלט בקבצים 345 שדה רשומה 185 שורת פקודה 356 6 357 צףָזהּ 357, 360 שינוי ערכי פרמטרים 127 שפת 8 429 6 429 ++6 429 0 ++6 בקלות סוט 6 ]0 6חו| 66!קח 60 ה סח 8 8% זְססהּזהח6 6חס סו 5חסחפזסקס סו 5 חל 0 6355 סח 8 8% זְסהּזה8ח6 6חס 0 56 00 5 הסוח / 86/05 קוח 5 התווח שק/ס צוסוס/ס חססוססזס א3זחץ5 5חסחפזסקס סוה זור 660 +וחסז וח5/506 חב 6++ ++6 |8פו/\ 422 תוכנית חדשה 422 תוכנית קיימת 425 אסמבלי 134, 349, 353, 433 מכונה 33 המעבר בין השפות. 429 תחביר 36 תכנות 31 תּ תבנית מחלקה 300 תבנית פונקציה 294 הגדרה 295 טיפול במספר טיפוסים 296 תבנית רשומה 185 תו וו ₪ 177 181, 317 בלתי נראה 82 מחרוזת 175 מיוחד 49 51 מילוי 332 מחרוזת. 47 נקודה מובילה 332 סוף שורה 50 קבוע 179 קלט/פלט בודד. 333 שורה חדשה 49 תווית :6ו|פטק 218 תוכנה 31 תוכנית 31 הידור 33 הרצה לפי תנאים 85 יצירת (כתיבת) 32 קריאות 152 ראשית 41 תיעוד 65 תחביר שפה 36 תיעוד התוכנית 65 \/1508| 6++ ץו0רח3556 6חוח86רח א%3חץ5 בחורה וסוס 6 6|355 6 !קרח הסטסחנ 6 66070 ןי |וטח 6 ססוח/ ו וסוס |506018 ווח 9 וי סחו! 0חס 60 סו ב 36 זַבח6 6חס 1/0 סחו|צ\סח :שווטטס 06 הטסוק חסטה!וקוחס6 9חו6655סזכן |ההסטוסהס6 ו חוהרח 0ו חר 0 אבזחץ5 הטסו זגוסץ ה חר סס אינדקס עברי ‏ 451 תכנות גנרי 400 מונחה עצמים 210 שפה 31 סביבה 37 תנאי הרצה 85 זו 86 6 90 תקורת זמן הביצוע 350 תקלות 067 53 2 ++6 בקלות 0ח\רחרחהזוטסוס 6 0 סוס ז60[סס ה +חסרתחסזושחס 0חו06655זכן |החסטווסחס6 ז 6-ו ו ב אינדקס לועזי לשס נוחות הקריאה התחלנו את האינדקס הלועזי מסוף הספר. כלומר, סופו בעמוד הבא ותחילתו כמו בספר באנגלית. אינדקס לועזי 453 אינדקט 1 ++6 בקלות לועזי ה ו 7 806 7 +30 7 ץפזזה 8 6!6060% 8 4|6/ אססחן 2 חסושחט סף 8חו355 56 חהסטפוזס)וחו פחוז560 3 5 זססחוסכ סחופגו 8, 171 880!6/ 9, 433 6006 0806חחה! !35560 3 5191006055 35 החופג 6 6, 410 ]3000 685%\80 3 67075 0677 ןי 9 %ַ6075%80 2 600| 00% 0 6חו! 600 2 ווח 32 חח 8 3% 687 שחס 0/ו 9 ס6חו!עשסח 7, 181, 317 ||גוח 9, 51 )וסוס |8ו5066 7, 175 8חו50 2 50866 שטוח/ש 0 חס 7, 209 6355 1 0856 6, 230, 264 6005066 1 600% 1, 376 00776 1 ז6סוחסרח/ח6רחס|ס 1 ססחלהסחחו 1, 217, 268 6םהעוז 8 06060600 1, 217, 268 ס6ו|טגוס 5 חס 6 (8חוח06 8 866655 650716000 2, 218 חהסטסחנם 1 66 1 5 0, 214 60005 0 >חווחרחה סז %60חסוזס ז66[סס 1( 050 0, 303 6סה|קוחסל 5 וההזססזק זטסץ פחטחסרהוהסס 4, 432 %5חסוח וח 60 3 חסספווקוהסס 3, 34 ז6!וח 60 3 סחהווסם 5 0ח|6655סזכן |ההסטוס0חסס6 6 ז 0 656-ו 6, 230, 264 600501066 1, 402 זסחובזח60 0 600% 2 ותחזחסז 6768000 פ 2 %קוחסזס 005 2 680 00% 5 1 ]600 ו 5 חס 1, 217, 220, 268, 285 6זהעוז 8, 288 06060ססז 1, 217, 220, 268, 285 6ו|סטס 4 50806 1 ₪ 06 0ח6 אינדקס לועזי ‏ 2 סז 3 5ח0ח80זסקס 6!ח 2, 77 ששס\סעס 2 חססחוססזס 6, 37 אהזחץ5 2 ה6)ה תפוח שכעט 5 0600095א6% 6 0800 8 682355 6062000 8, 392 0|6ח8ח הסוקס6אס 7 שוסזחץ 6 2 6006000795 508000 3 חסחח6אס 6 2 08000 4 8ח6|051 1 ₪0 0, 331 68001 1 חח סו 8 פחסחהזססס 0/ו 7 סחוחסקס 5 06800795 שוש 6 080 1 6חו! !60 3 0חו080ז 1, 414 500706 7 פזסטוחטח ,חוסק פחטפּסה 5, 323 50076 1606 112 113 חהסטסחטם 9 ]ה 3, 117 חסטשחט\ 3 סחוו|68 8 065 שרח 507060076 86ח3ח6 2, 255 0355 6 60576000 1 600% 3, 212, 431 ה00הזה!066 6, 232 0065006001 2 !חח חה0ו660א6 6, 289 חס 2, 349, 352 6חו!חן 3 ++6 בקלות 0, 223, 268 1806ו0שחו 7, 182, 413 /בּזסוו 9 8חו6080/ס 2 /הוה חַחו55 7 חססהותזסזחו חַחו355 0 6075רחה הק חַחו55 0 >66העזק 4, 213, 431 600/06סזס 1 650055 חנז 1, 122 6ט]|פע חזוחסז 4 06 הזוס 6, 182 65וזהזס!! סוחם-חטוז 5 חס הסוח 50006 2 8%חו50 2 ח560 2 ]5 2 5 8 \5/5068 2 6855 חן 4 05ה]|כוחס? 8 |הטזו/ 1 סמזגוס 6 3 ? + 5596600065 סחוקטסום 0 5!|סטחחץ5 סחוקטסום 1 סו 0 208560 0355 8 5ח800זסקס 6!ח 3 677075 05000 2, 333 6חם 8 8% זְססהּזְהח6 סחס 1 ח00להססחו 8 חחוסוח הסטהותזסזחו 1 ססחםסוסהחו 6 חוהחס 2 6וכחוטווח 2 6!כחופ אינדקס לועזי ‏ 4 זטסחו 1 ₪ +0 סחו| 666!קוחס6 4 2, 343 077075 2, 333 6 הב 8% ז660ההח6 סחס 3 6010605] 3, 401, 403 חססהזסטו % 9, 433 66/0/0705 1 6חו!חו 5 50005 8 |הטאוש 1 חב 4, 349, 353, 433 ]355600 9 8 9 6 9 ++6 3 6חוח86ח 1 פחוותפזססוס 6 אם%חץ5 2 ++6 |0פו/\ 4 >חון 0 פכסס! 7 6ווח/ש-00 1 הס 3 ססס! %חסוח6זסחן 4 >6וחוחן 3 הסספזססו 6 >ווח/ש א סזור 4 017000/05 0 5חסח6ח וחסי] ₪107 05זסוח שטסת 9 >חססהטף6 8חוסהו6ז 5 + סרסרח 5 6000000 5, 323 5006 106 23 95ח800זסקס 5 ++6 בקלות 9 68508 9 006 / הסרחסוח |ו3רח5 א 4, 365 6075%30% 0סרחהח 7 06005 7 06800 5זסטוהווח 7 >חוסק פחטהס 2 סח 000 7 5ז6סותטח 6|סח/ו 0 0, 212 00[60ס 1 %הסחחו 7 6₪ח%81ח00 ז|56 0 פחוחחה סז 60סה6וזס 66[סס 2 6 000 רו 8 [] 0, 130 -8 800655 3 2 88 80 9, 1423 %ח6וח0ו355 7 \380 3516 6 006 ₪6 פחוו|סשחסס 2 060760060% 2 אן50סם 2 אחסזס 9, 325 010|006 6, 211 00% 0 |0ח6 0 431 ח0ס07860אס 1, 185, 223 חהססט!650ז |הססוף 0 %5ח6ח6 חן 1 א\50סס 1 אהסזס 8, 80, 431 חסו56חון 2, 95 |הסוףסו 6, 325 /וסח 4 ! %סח 3 92 || זס אינדקס לועזי 6 7, 285 8חו80ס!סעס 4 606067066ז 6 |8ח0ם3ז סוס 2, 333 שח 8 85 66 סחס 3 500008 0 0/6680 9 >5חסטשחט פחוסהסוזסעס סִ 7 "הרבזה 5, 157 60676006 עס 7, 128, 130, 162 5ז600חח3 וה סחוסחהה6 0 8065 ]שרחה זכ 0618016 7, 198 זססחוסס 8 חסספזסקס 9 8ח57 זסז0בז3ח6 0+ וססחוסס 0 5060066 0ף זססחוסק 0 0!6החהּע זססחוס 4, 394 ותפוחסזסוחץוסם 8 00[66 6וחכןוסוחץ!סכן 3 הוח 8 5806 3 חסו5פ!וססזס 6 "066550ז60ז 7, 281 סספעוזק 1 ותהזססזוק 5 8 הרוח סס 3 חסספווקוהסס 5 8ח0655סזכן |ההסטוסהסס 2 008000 1 חופוח 0 \רחרחהוטסיוס 7 %חסרתחסזושחס 0 6 1 80806חה! 0 060000 66[סס 3, 413, 415 60[סזוק 2 66000סזו 1, 217, 220, 268, 285 6ו|סטס 8 :סו!טגוס 7 ++6 בקלות א 4 76000 6 065וח6וח / ₪6|05 5 סרח 4, 187 5060076 0 5 5 >06ה!קוחסל ]0]0700606 431 ,3 6, 182 /זבּזסו| 6וחס-חוז 7 פחסוסחום 5 6, 223 56006 7 0016005 66חוה%חסס ]561 1 5000876 9 50006 ו 9, 40 שסטוסחו 9 ]355006 7 >68זם 6 6800 7, 89 6חטסקוחסס 9 חססוסחסס 0 66 6 ז 3, 47, 330 600% 7 0690 6 + 1 חססםסחססחו 2, 39, 40 וחהזססוק 1, 102 5000006005 668000 7 6!קחופ 6 ח6סםוא\5 7 שוסזחץ 1 518060060%55 606655 חהורחוחוט 6 עֶט 9, 41 חוהוח סוסצ 00| 51 6 חסטהוזס)חו חַח50 5 1 6תַַח607/ אינדקס לועזי 8 1, 331 %טסחו 2, 330 חוס 3 50000810 0 ₪ 8 סט 3 331 מטסטס 3 47, 330 600% 3 5000080 9 6 8 0ס% 0 5766 5 8ח50 7 |!גוח 05חסכסבּ 7, 175 687860075 9 0005080 6 0608 9 פחולו!הםוחו 0 חססשחט 60 8חו355 566 4 ]66070 187 ,4 5 5 323 חסוחט 6 אםחץ5 6 >קותסזק 5506 7 8006 7, 360 שַחָזֶבּ ז 3 6/1856 3, 297 06 4 608 1 008% 6 סחסו 5 6 4 סחן 4 פחסן 4 6כ/ הזוס טִ 2 חסוחט 5 פטסהמץהסחהּ 3 5008 9 ++6 בקלות /\ 9 6נ|8 9 8חוח8550 6 הקוח סס 2 6ט]/ 55005 6%/6 8 אססחן 7, 130, 162 6גו|ה/ זס66וחבוהק 6, 58 8806 9 6ט|8/ 8 0חוח355!0 7, 431 066300 1 >חסותתסזושחס 0 6355 ח6%0620|0 3 08% 3 |0!005 0 אססחן 1 |6ס| 8 65ח | וח סרח 8, 142, 145 סההח 0 זססחוסק 7 6600 3 6676766 6 50006 6 חהסוהותזס)חו 8ַחו0סל5 7 065 1 6ט!הע 0|6'5החובע סחופט אינדקס לועזי ‏ 10