מניסיוני, פונקציות הוא נושא שגורם לתלמידים לקושי רב עד אשר הם מטמיעים את שיטפון המושגים החדשים הניחת על ראשם. מסיבה זאת אני נוטה לדחות את הוראת הנושא, וללמד ראשית פקודות בקרה, ומערכים. להתרשמותי הקושי הנגרם בהטמעת נושא זה אינו תוצאה של האתגר האינטלקטואלי הרב שמציבות הפונקציות, אלא נגרם מהמונחים הרבים הכרוכים בתכנות עם פונקציות. הנחמה היא שבסופו של דבר מרבית הכוח משתלט על היעד.
לפונקציות יש שמות רבים ושונים: פונקציות, רוטינות (routine), סברוטינות (subroutine), שגרות, פרוצידורות (procedure), שיטות (methods).
נציין כי אם מרכיבי השפה שלמדנו עד עתה אפשרו לנו לכתוב תכניות, אזי רק השימוש בפונקציות יאפשר לנו לכתוב תכניות כהלכה. על כן לא ניתן להפריז בחשיבות הנושא. ראשית נכיר אותו: נראה מה הכלי מעמיד לרשותנו ברמה הטכנית; רק אחר-כך נדון בחשיבותו, ונסביר כיצד יש לתכנת עם פונקציות. בכמה מלים, רק כדי לתת לכם על קצה המזלג את הרעיון הבסיסי אומר שעת אנו עובדים עם פונ' אנו משתדלים להקצות לכל תת-משימה של התכנית פונ' נפרדת שתהיה אמונה על השלמתה. באופן כזה התכנית הופכת להיות מודולארית, כלומר מורכבת מאוסף של מודולים, כל אחד, כאמור, מבצע תת-משימה של התכנית. באופן זה, ראשית, נקל יותר להבין מה התכנית, או מה כל קטע שבה, מבצע; ושנית, אם בשתי תכניות עלינו להשלים אותה תת-משימה נוכל להשתמש באותה פונ' אשר תיכלל בשתי התכניות, כך לא נצטרך בכל פעם 'להמציא את הגלגל מחדש'.
כתבו תכנית הכוללת שלוש פונ':
א. כזו המדפיסה את שמכם
ב. כזו המדפיסה את הרחוב בו אתם גרים, ומספר הבית
ג. כזו המדפיסה את עיר המגורים שלכם.
התכנית הראשית, תתחיל בשליחת הפלט: main start, עתה main תזמן את שלוש הפונ' (כך שתכניתכם תציג את שמם וכתובתכם המלאה), ולבסוף main תשלח פלט: bye ובזאת תסיים
(זכרו להצהיר על הפרוטוטיפים של הפונ').
כתבו תכנית המזמנת חמש פעמים (בלולאה) את הפונ': is_prime.
הפונ' is_prime קוראת מהמשתמש מספר טבעי >= 2 (ואפשר להניח שהקלט תקין), ומודיעה האם הוא ראשוני או פריק
כתבו תכנית המגדירה שני משתנים גלובליים: int num; bool is_prime;
עתה התכנית הראשית בלולאה, חמש פעמים: (א) תקרא ערך טבעי >= 2 לתוך המשתנה num (ב) תזמן את הפונ' check_prime אשר תבדוק האם num ראשוני, ותכניס למשתנה is_prime את הערך המתאים (ג) התכנית הראשית תשלח פלט המודיע האם המספר שנקרא הוא ראשוני או פריק.
כתבו תכנית בה התכנית הראשית מגדירה מערך של מספרים שלמים בן חמישה תאים, וקוראת לתוכו ערכים טבעיים >= 2 (אפשר להניח שהקלט כולל רק ערכים כמצופה).
עתה, בלולאה (שניה), התכנית הראשית קוראת חמש פעמים לפונ' check_prime, בכל פעם היא מעבירה לה ערך של תא בודד במערך; הפונ': check_prime בודקת האם הערך שהועבר לה הוא ראשוני או פריק, ושולחת פלט בהתאם (כלומר, את הפלט שולחת הפונ' check_prime).
כתבו תכנית בה התכנית הראשית מגדירה מערך של מספרים שלמים בן חמישה תאים, וקוראת לתוכו ערכים טבעיים >= 2 (אפשר להניח שהקלט כולל רק ערכים כמצופה).
עתה, בלולאה (שניה), התכנית הראשית קוראת חמש פעמים לפונ' check_prime, בכל פעם היא מעבירה לה ערך של תא בודד במערך, וכן משתנה בולאני is_prime; הפונ': check-prime בודקת האם הערך המספרי שהועבר לה הוא ראשוני או פריק, ומעדכנת את ערכו של פרמטר (ההפניה) הבולאני בהתאם. התכנית הראשית תשלח פלט המודיע האם הערך הוא ראשוני או פריק (על-סמך ערכו של הבולאני שעודכן ע"י הפונ')
כתבו תכנית בה התכנית הראשית מגדירה מערך של מספרים שלמים בן חמישה תאים, וקוראת לתוכו ערכים טבעיים >= 2 (אפשר להניח שהקלט כולל רק ערכים כמצופה).
עתה, בלולאה (שניה), התכנית הראשית קוראת חמש פעמים לפונ' check_prime, בכל פעם היא מעבירה לה ערך של תא בודד במערך; הפונ': check_prime בודקת האם הערך שהועבר לה הוא ראשוני או פריק, ומחזירה ערך בולאני לתכנית הראשית. התכנית הראשית מודיעה כמה ערכים במערך הם ראשוניים.
כתבו תכנית בה התכנית הראשית מגדירה מערך של מספרים שלמים בן חמישה תאים, וקוראת לתוכו ערכים שלמים (חיוביים או אי חיוביים).
עבור כל תא במערך התכנית מזמנת את הפונ' is_prime. הפונ' is_prime מחזירה באמצעות return ערך בולאני המורה האם המספר שהיא קיבלה הוא טבעי >= 1 (ולכן יש מקום לדון בראשוניותו), ואם הוא אכן כזה, אזי באמצעות פרמטר הפניה יוחזר האם הוא ראשוני או פריק. (אם הפונ' קיבלה מספר <= 0 היא מחזירה false, וערכו של פרמטר ההפניה אינו מעניין)
התכנית הראשית תודיע כמה ערכים ראשוניים נקראו.
חזרו על התכנית מהסעיףך הקודם, וכתבו שוב את הפונ': is-prime באופן הבא:
למעשה בסעיף זה אין שום חידוש. הוא מובן כאן כדי לעזור לתלמיד לעבור שוב על המושגים שהוצגו בסעיפים הקודמים, לחדד אותם, ולהיחשף לדוגמות נוספות. לעניות דעתי, השקעת הזמן הכרוכה בקריאתו מצדיקה זאת.
בסעיף זה אסביר כיצד יש לכתוב פונ' שמקבלת מערך חד-ממדי או רב ממדי. כיצד נכתוב את הפונ' במצב בו עליה רק להשתמש בנתונים השמורים כבר במערך (למשל: למצוא את הערך המרבי במערך), לעומת כיצד יש לכתבה עת עליה גם לעדכן את ערכם של תאי המערך (למשל: לקרוא נתונים למערך).
כתבו תכנית המגדירה מערך של מספרים שלמים בן עשרה תאים.
עתה ה: main מזמנת פונ' א' לקריאת נתונים למערך, ואח"כ פונ' ב' שתחזיר את ממוצע הערכים במערך. התכנית הראשית תודיע האם ממוצע הערכים במערך הוא חיובי או לא.
כתבו תכנית המגדירה מערך דו-ממדי של מספרים שלמים בן ארבע שורות ושלוש עמודות.
ראשית, ה: main מזמנת פונ' א' לקריאת נתונים למערך הדו-ממדי.
שנית, התכנית הראשית מזמנת פונ' אשר סופרת ומחזירה בכמה שורות במערך ממוצע הערכים הוא חיובי. התכנית הראשית תציג את הערך המוחזר ע"י הפונ' הסופרת בכמה שורות במערך הממוצע הוא חיובי.
פונ' הספירה תשתמש בפונ' לחישוב ממוצע הערכים במערך חד-ממדי, כפי שכתבתם בתרגיל הבסיסי הקודם.
מטרתו של סעיף זה לעזור לכם להבין בצורה שלמה יותר את נושא פרמטרי הערך ופרמטרי ההפניה, ואת ניהול הקריאות לפונ' ע"י המחשב. הבנת הנושא תהיה חיונית עת נלמד את נושא הרקורסיה, נושא בו נעשה שימוש רב במחסנית לצורך הבנת פעולת התכנית
בשני סעיפים קצרים אלה אתאר כמה היבטים טכניים, לא עמוקים, אך שימושיים של השפה. בפרט, בהעמסת פונ' נפגש עת נדון בתכניות רקורסיביות
כתבו תכנית המגדירה מערך arr של מספרים שלמים בן עשרה תאים.
עתה התכנית מזמנת פונ' לקריאת נתונים: read_data(arr)
הפונ' read_data מזמנת פונ' שניה עם אותו שם בדיוק, אשר מקבלת גם את גודלו של המערך לתוכו יש לקרוא נתונים, וקוראת נתונים לתוך המערך (כמובן תוך שימוש בפרמטר שלה, המורה מה גודלו של המערך).
לבסוף, התכנית הראשית תזמן פונ' עזר נוספת שתציג את הנתונים שבמערך.
סעיף זה מסכם את הפרק. לאורך הפרק למדנו את הכלים הטכניים הכרוכים בתכנות באמצעות פונ'. סעיף זה מסביר כיצד לעשות שימוש נכון בכלים אלה, לשם כתיבת תכניות כתובות כהלכה. לא ניתן להגזים בחשיבות הנושא של שימוש בפונ' לצורך תכנות ראוי לשמו.
כאמור: חשוב! חשוב!! חשוב!!! לתרגל
בסעיף זה נכללות שאלות מבחינות בהן יש לכתוב פונ' המבצעת משימה כלשהי על מערך חד-ממדי.
אני ממליץ לכם לפתור כמה שיותר שאלות כאלה, על דף עם עפרון. לעניות דעתי, חבל לבזבז את הזמן הדרוש לשם הזנת הפונ' כחלק מתכנית שלמה למחשב. אומנם פונ' שאתם כותבים רק על דף אין לכם דרך לבדוק, אולם אני מקווה שאם תסמלצו את הפונ' בצורה די קפדנית, תקבלו תמונה די מהימנה על נכונותה (ואם יש בה באג קטן זה רק בגדר ליקוי קטן, ולא פטלי)
לפניכם צרור שאלות נוספות מבחינות. הפעם בנושא פונ' ומערכים דו-ממדיים