פרוצדורות, פונקציות ותכנות מבנה
הוצג| English | משמעות |
|---|---|
| subroutines/ˈsʌbruːtiːnz/ | תת-תוכניות |
| function/ˈfʌŋkʃn/ | פונקציה |
| procedure/prəˈsiːdʒə/ | פרוצדורה |
| structured programming/ˈstrʌktʃəd ˈprəʊɡræmɪŋ/ | תכנות מבנה-י |
| decomposition/ˌdiːkɒmpəˈzɪʃn/ | פירוק |
| parameters/pəˈræmɪtəz/ | פרמטרים |
| arguments/ˈɑːɡjuːmənts/ | ארגומנטים |
| signature/ˈsɪɡnɪtʃə/ | חתימה |
| pass by value/pæs baɪ ˈvæljuː/ | מעבר ערך |
| pass by reference/pæs baɪ ˈrefrəns/ | מעבר רפרנס |
| global variable/ˈɡləʊbl ˈveərɪəbl/ | משתנה גלובלי |
| local variable/ˈləʊkl ˈveərɪəbl/ | משתנה מקומי |
| scope/skəʊp/ | תחום |
רצועת תוכניות שכל אחד יכול היה להעתיק
- עד שנת 1951, צוות EDSAC בקמברידג' שמר ספריית תת-תוכניות על רצועת נייר מקורבת: שורשים ריבועיים, הדפסה, לוגריתמים. כל תוכנית יכלה לקרוא אחת ולקרוא אותה.
- החלק הקשה היה לחזור. הטריק של דויד וילר, "קפיצת וילר", שמר את כתובת החזרה כך שתת-תוכנית תוכל לחזור לנקודה ממנה נקראה.
- כל קריאת פונקציה שאתה כותב היום עושה את אותו דבר, וכל ספריית שפות נגזרת מרצועה זו.
- LESSON זו עוסקת בפרוצדורות ובפונקציות: כיצד להגדיר אותן, כיצד לעביר ערכים לתוכן ומחוץ, וכיצד לכתוב אותן כך שהPaper 2 תעניק עליהן נקודות.
הליכים ופונקציות
- תכנות מבני בונה תוכנית מתת-תוכניות קטנות וממונות, כל אחת עם משימה אחת.
- הליך הוא בלוק ממונה שעושה פעולה ואינו מחזיר שום דבר:
PROCEDURE Greet(Name : STRING) … ENDPROCEDURE, מורץ עםCALL Greet("Ada"). - פונקציה מחזירה ערך הופך לחלק מביטוי:
FUNCTION Square(X : INTEGER) RETURNS INTEGER … RETURN X * X … ENDFUNCTION, משמש כResult ← Square(5) + 1.

הליך עושה משהו; פונקציה מחזירה ערך
מטרת הקריאה: דחיפה בעת קריאה, הסרה בעת החזרה
קריאה לתת-תוכנית דוחפת מסגרת חדשה בראש; החזרה מורידה אותה ומחזירה ערך לקורא. הקריאה המתבצעת כרגע היא תמיד המסגרת בראש.
ההבדל המרכזי בין פרוצדורה לפונקציה הוא שפונקציה:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
פונקציה מחזירה ערך (שישמש בביטוי); פרוצדורה מבצעת פעולה ואינה מחזירה דבר.
פונקציה Square(x) מחזירה x * x. מה מחזירה הקריאה Square(5)?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
5 × 5 = 25 — הערך שהפונקציה מחזירה למכילה (המסגרת הוסרה מעמודת הקריאות).
היכן כל אחד מהם מתאים
- הליך כאשר אותה קבוצת שלבים נדרשת במספר נקודות: לאמת כניסה, להדפיס תפריט, להחליף שני ערכים. השלבים נכתבים פעם אחת ונקראים בשם.
- פונקציה כאשר יש לחשב ערך יחיד ולאחר מכן להשתמש בו בביטוי: סכום, תוצאת
TRUE/FALSE, הגדול מבין שני מספרים. הערך המוחזר מחליף את הקריאה. - השתמש בתת-תוכנית כאשר לוגיקה מופיעה במקום אחד או יותר, כאשר בלוק יש לו מטרה נקובה וברורה, כאשר התוכנית מספיק מורכבת כדי להצריך פירוק, או כאשר תרצה לבדוק חלק אחד בעצמו.
סיבה טובה לכתוב תת-תוכנית היא ש:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
תת-תוכניות מסירות כפילות, נותנות מטרה ממונוות, וניתן לבדוק אותן בודד.
פרמטרים, ארגומנטים והממשק
- פרמטרים הם המשתנים שמתגבשים בתוך תת-תוכנית לקבלת ערכים; הערכים שהקורא מספק הם ה-ארגומנטים.
- ה-כותרת היא השורה הראשונה:
PROCEDURE Name(Param : TYPE)אוFUNCTION Name(Param : TYPE) RETURNS TYPE. ה-ממשק, או ה-חתימה, הוא השם, הפרמטרים בסדר עם סוגיהם, וסוג ההחזרה: כל מה שקורא צריך לדעת. - ה-ערך החזרה הוא מה שפונקציה מחזירה עם
RETURN.
התאם כל מונח למשמעותו.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
פונקציה מול פרוצ'ורה = מחזירה ערך או לא; מעבר על ידי ערך מול על ידי הפניה = העתקה מול מקורי.
דוגמה פתורה: תאר כל איבר בכותרת
FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN.FUNCTION: תת-תוכנית המשבה ערך.Pass2: המזהה המשמש לקריאה אליה.Count: הפרמטר, המזהה המקבל את הארגומנט שעובר אליו.INTEGER: סוג הנתונים של פרמטר זה.RETURNS BOOLEAN: סוג הנתונים של הערך שמחזירה הפונקציה. חמישה חלקים, נקודה אחת לכל חלק.
ב-FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN, המזהה Count הוא ה____.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
הפרמטר מקבל את הארגומנט שמעביר הקורא ושימש בתוך הפונקציה כמו משתנה מקומי.
העברה על ידי ערך והעברה על ידי רפרנס
- העברה על ידי ערך: הרoutine מקבלת עתיקה, כך ששינויים בתוכה לא מגיעים לקורא. השתמש בו עבור כניסות שהroutine רק קורא.
- העברה על ידי רפרנס: הרoutine מקבלת רפרנס למשתנה עצמו של הקורא, כך ששינויים כן מגיעים לקורא. השתמש בו כאשר הרoutine צריכה לעדכן את הארגומנט, כמו ב
Swap. - Cambridge כותבת את המודל בכותרת,
BYVALאוBYREF, לפני כל פרמטר. אם אין כלום כתוב,BYVALמוסכם.

עתיקה, או קישור למשתנה של הקורא
דוגמה פתורה: מהי התוצאה?
PROCEDURE Adjust(BYREF X : INTEGER, BYVAL Y : INTEGER)
X <- X + Y
Y <- Y * 2
ENDPROCEDURE
A <- 5
B <- 3
CALL Adjust(A, B)
OUTPUT A, B
Xהוא ייחוס ל-A, ולכןAהופך ל-8.Yהיא העתק שלB, ולכן הכפלתYמשאירה אתBב-3.- התפוקה היא
8, 3. אילו הכותרת הייתה אומרתBYVAL X,Aעדיין היה 5.
בדוגמה המפורטת, מהו הערך של A לאחר CALL Adjust(A, B)?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
X עובר BYREF, ולכן X ← X + Y מוסיף 3 למשתנה A של הקורא: 5 + 3 = 8. B נשאר 3 כי Y הייתה העתקה.
משתנים מקומיים וגלובליים
- משתנה מקומי מתגבש בתוך תת-תוכנית ומתקיים רק בזמן הביצוע שלו; משתנה גלובלי מתגבש מחוץ ונראה בכל מקום. האזור שבו שם נתון נראה הוא ה-תחום (scope) שלו.
- משתנים מקומיים עדיפים: אותו מזהה ניתן לשימוש חוזר במקום אחר ללא התנגשות, הערך לא יכול להשתנות באופן מקרי על ידי חלקים אחרים בתוכנה, הזיכרון משוחרר בהחזרה, והתת-תוכנית עצמאית.
- משתנה מקומי נוצר מחדש בכל קריאה, ולכן אינו יכול לשאת ערך בין קריאות. שגרת בונה מחרוזת לאורך קריאות חוזרות זקוקה למחרוזת זו כגלובלית, או מעבירה אותה
BYREF.

משתנה גלובלי נראה בכל מקום; משתנה מקומי חי רק בתוך תת-תוכנית משלו
משתנה מקומי קיים רק בתוך התת-תוכנית שבה הוא מוגדר, בעוד שמשתנה גלוי נראה בכל רחבי התוכנית.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שמירת משתנים כמקומיים מגבילה את תחום הפעילות שלהם, מונעת התנגשויות בשמות, ומאפשרת בדיקת תת-תוכנית באופן עצמאי — יש להימנע ככל האפשר ממשתנים גלויים.
אילו יתרונות יש לשימוש במשתנים מקומיים? סמן את כולם החלים.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
משתנה מקומי נוצר מחדש בכל קריאה, ולכן אינו יכול לשמור ערך בין קריאות. זוהי הפעולה היחידה שמבצע במקום זאת משתנה גלוי, או פרמטר BYREF.
הפיכת תת-תוכנית לפונקציה
- שנה את
PROCEDUREלFUNCTIONוהוסףRETURNS <type>לכותרת. - החלף את ה
OUTPUT, או את הBYREFפרמטר שהעביר את התוצאה החוצה, עם הוראתRETURN. - שנה כל קריאה כך שערך ההחזרה יושמש:
Result ← Unpack(Text)במקוםCALL Unpack(Text, Result).
להמרת פרוצ'ורה לפונקציה, משנים את הכותרת ל-FUNCTION עם RETURNS, מחליפים את OUTPUT ב-RETURN, ומעדכנים את הקריאות כדי להשתמש בערך שהוחזר.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שלושה שינויים, שלושה נקודות: הכותרת, ה-RETURN והקריאות.
דוגמה פתורה: כתיבת מודול לבחינת נייר 2
- מערך גלובלי
Score : ARRAY[1:50] OF INTEGERאחסן ציוני מבחן. כתוב פונקציהCountAbove(Limit : INTEGER)שמחזירה כמה ציונים גדולים מLimit.
FUNCTION CountAbove(BYVAL Limit : INTEGER) RETURNS INTEGER
DECLARE Index, Count : INTEGER
Count <- 0
FOR Index <- 1 TO 50
IF Score[Index] > Limit THEN
Count <- Count + 1
ENDIF
NEXT Index
RETURN Count
ENDFUNCTION
- המערכת מעניקה נקודה לכל מאפיין: הכותרת עם הפרמטר וסוג ההחזרה, ההצהרות המקומיות, הספן המיוזם לפני הלולאה, הלולאה על כל אלמנט, התנאי עם ההשוואה הנכונה, עדכון בתוכו, סגירת המבנים, ו
RETURNאחד לאחר הלולאה. - מודול שלא הושלם עדיין זוכה נקודות על כל חלק נכון, לכן כתוב את כולם.

כל חלק בתשובת מודול נושא נקודה משלו
סדר את חלקי תשובה ליחידת Paper 2 בסדר הכתיבה שלהן.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
כותרת, הצהרה, לולאה, תנאי, עדכון, החזרת ערך. לכל חלק יש ניקוד, גם אם חלק אחר שגוי.
סימונים נופלים מהיד
- שגרת שחייבת לשנות משתנה של הקורא זקוקה ל
BYREFבכותרת; ללא זאתBYVALמופיע כברירת מחדל והשינוי אבוד. - לפונקציה יש
RETURNאחד, לאחר הלולאה, וENDFUNCTION. הוראתRETURNבתוך הלולאה מגמרת אותה באלמנט הראשון. DECLAREכל משתנה מקומי, והיזם ספן או סך כללי ל-0 לפני הלולאה.- "פסדו-קוד יעיל" פירונו העברת עבודה שאינה משתנה מחוץ ללולאה, עצירת חיפוש במציאה הראשונה, ואי-חזרה על קריאה whose result could be stored.
כדי להפוך לולאה ליעילה יותר, ערך שלא משתנה עם מדד הלולאה צריך להיות:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
העברת קבוע לולאה החוצה נמנעת מחישוב חוזר של אותו ערך בכל איטרציה.
הבנתך מושלמת
- תת-תוכנית (procedure) מבצעת פעולה ומוחזרת
CALL; פונקציה (function) מחזירה ערך המשמש ביטוי - הכותרת שמה את השגרת, את הפרמטרים שלה עם סוגים ואת סוג ההחזרה; ארגומנטים הם הערכים המועברים לתוכה
- BYVAL מעביר העתק (הברירת מחדל); BYREF מאפשר לרוטינה לשנות את המשתנה של הקורא
- העדיפו משתנים מקומיים; משתנה מקומית היא חדשה בכל קריאה, בעוד שגלובלי שומר על ערכו
- מודול ב-Paper 2: כותרת, הצהרות, התחלה, לולאה, תנאי, עדכון, מבנים סגורים,
RETURNאחד