בכיתה
ביום ב'
1. מבוא לפעולות
הצעת הגדרה: קוד תכנותי הניתן לזימון פעם אחת או יותר מכל מקום בתכנית.
2. כתיבת פעולת פרוצדורה
פעולה שלא מקבלת פרמטר/ים ולא מחזירה ערך.
למשל פעולה המדפיסה כרטיס ביקור. תרגול.
הצעת הגדרה: קוד תכנותי הניתן לזימון פעם אחת או יותר מכל מקום בתכנית.
2. כתיבת פעולת פרוצדורה
פעולה שלא מקבלת פרמטר/ים ולא מחזירה ערך.
למשל פעולה המדפיסה כרטיס ביקור. תרגול.
3. כתיבת פעולה המחזירה ערך
למשל פעולה המחזירה את סכום המספרים 1-10. תרגול.
למשל פעולה המחזירה את סכום המספרים 1-10. תרגול.
ביום ג'
4. אודות פעולות
א. פעולות הקיימות בשפה
קיימות פעולות המוטבעות במערכת (בשפה). כמו: (...)Console.WriteLine(...), Math.Abs ועוד.
קיימות פעולות המוטבעות במערכת (בשפה). כמו: (...)Console.WriteLine(...), Math.Abs ועוד.
ב. מהי פעולה
* פעולה היא מנגנון הנוצר פעם אחת, ומאפשר למתכנת להשתמש בו כמות לא מוגבלת של פעמים
(במקום לכתוב קוד זה כל פעם מחדש).
* קטע קוד לביצוע משימה מוגדרת העונה לשם כלשהו ומפועל על-ידי הקלדת שמו.
* פעולה = פונקציה.
* פעולה היא אבן הבניין של תוכניות.
* פעולה היא מנגנון הנוצר פעם אחת, ומאפשר למתכנת להשתמש בו כמות לא מוגבלת של פעמים
(במקום לכתוב קוד זה כל פעם מחדש).
* קטע קוד לביצוע משימה מוגדרת העונה לשם כלשהו ומפועל על-ידי הקלדת שמו.
* פעולה = פונקציה.
* פעולה היא אבן הבניין של תוכניות.
ג. כללי
* פעולה היא למעשה "מיני תכנית" היכולה לכלול משתנים משל עצמה.
* כל פעולה מבצעת דבר אחד בלבד, על הפעולה להיות סגורה ומוגדרת.
* כל פעולה מבצעת דבר אחד בלבד, על הפעולה להיות סגורה ומוגדרת.
* אחת הסיבות לשימוש בפעולות - כדי "לא להמציא את הגלגל בכל פעם מחדש".
(למנוע הצורך בתכנות מחדש של דברים שיהיה צורך להשתמש בהם שוב).
* ככל שתוכניות גדולות יותר, כך קשה יותר לשלוט בהן ולהבין אותן. זאת סיבה טובה לחלקן לחלקים.
כלומר - להשתמש בפעולות.
(למנוע הצורך בתכנות מחדש של דברים שיהיה צורך להשתמש בהם שוב).
* ככל שתוכניות גדולות יותר, כך קשה יותר לשלוט בהן ולהבין אותן. זאת סיבה טובה לחלקן לחלקים.
כלומר - להשתמש בפעולות.
* זימון פעולה
* הפעולה הראשית:
אשר מריצים תכנית ב- #C (באמצעות Ctrl+F5), מתבצע באופן אוטומטי
חיפוש אחר הפעולה Main, והקוד הכתוב בבלוק שלה מורץ.
* מעקב:
אם מתוך תכנית (מתוך הקוד הנמצא בפעולה Main) נחליט לזמן פעולה כלשהי, הרי שבזמן ריצת
* הפעולה הראשית:
אשר מריצים תכנית ב- #C (באמצעות Ctrl+F5), מתבצע באופן אוטומטי
חיפוש אחר הפעולה Main, והקוד הכתוב בבלוק שלה מורץ.
* מעקב:
אם מתוך תכנית (מתוך הקוד הנמצא בפעולה Main) נחליט לזמן פעולה כלשהי, הרי שבזמן ריצת
התוכנית, יתבצע מעבר אל הקוד של בלוק הפעולה המזומנת והוא יתבצע מתחילתו ועד סופו.
בסיום, הפעולה תחזיר את הפיקוד למיקום ממנו היא זומנה הפעולה, כדי שקוד זה ימשיך להתבצע.
בסיום, הפעולה תחזיר את הפיקוד למיקום ממנו היא זומנה הפעולה, כדי שקוד זה ימשיך להתבצע.
* טווח הכרה של משתנים:
משתנים המוגדרים בפעולה (כפרמטרים בכותרת הפעולה או בגוף הפעולה)- מוכרים רק לה!
משתנים של פעולה אחת יהיו מחוץ לטווח ההכרה של יתר הפעולות. כלומר,
בפעולות שונות ניתן לתת שמות משתנים הזהים לשמות משתנים הנמצאים בפעולות אחרות.
משתנים המוגדרים בפעולה (כפרמטרים בכותרת הפעולה או בגוף הפעולה)- מוכרים רק לה!
משתנים של פעולה אחת יהיו מחוץ לטווח ההכרה של יתר הפעולות. כלומר,
בפעולות שונות ניתן לתת שמות משתנים הזהים לשמות משתנים הנמצאים בפעולות אחרות.
היתרון: מתכנת העסוק בקוד של פעולה מסוימת, לא יוכל לשנות בטעות ערכים של משתנים אשר
הוגדרו ונמצאים בשימוש בפעולה אחרת.
הוגדרו ונמצאים בשימוש בפעולה אחרת.
ד. יתרונות
* שימוש חוזר - ReUse
מרגע שקיימת פעולה, ניתן לבצע שימוש חוזר בקוד שלה.
כלומר, לזמן אותה ממקומות שונים בתכנית, ולזמן אותה כמה פעמים שנרצה.
* חיסכון במקום - Saving space
אחת הסיבות לכתיבת פעולות היא כדי לא לשכפל את הקוד במקומות אחרים.
כך "חוסכים" שטח כתיבה ונמנעים מעומס חזותי.
לדוגמה: קוד של 10,000 שורות יוכל להכין רק 1,000 שורות.
העיקרון של כתיבת קוד פעם אחת בלבד נקרא D.R.Y - Don't Repeat Yourself.
מרגע שקיימת פעולה, ניתן לבצע שימוש חוזר בקוד שלה.
כלומר, לזמן אותה ממקומות שונים בתכנית, ולזמן אותה כמה פעמים שנרצה.
* חיסכון במקום - Saving space
אחת הסיבות לכתיבת פעולות היא כדי לא לשכפל את הקוד במקומות אחרים.
כך "חוסכים" שטח כתיבה ונמנעים מעומס חזותי.
לדוגמה: קוד של 10,000 שורות יוכל להכין רק 1,000 שורות.
העיקרון של כתיבת קוד פעם אחת בלבד נקרא D.R.Y - Don't Repeat Yourself.
* תחזוקה קלה - Reduce Complexity
רוב העבודה על קוד אינה בכתיבתו, אלא בתחזוקתו.
אם עלינו לשנות משהו בתוכנית, בזכות תכנון נכון שלה (כתיבה ושימוש בפעולות משלנו), יהיה עלינו
לבצע שינויים במקום אחד בלבד - בפעולה הקשורה לעניין. באופן זה, הקוד שלנו "נשלט" טוב יותר.
לבצע שינויים במקום אחד בלבד - בפעולה הקשורה לעניין. באופן זה, הקוד שלנו "נשלט" טוב יותר.
אין צורך "לראות" עשרות ומאות אלפי שורות קוד כדי לתקן תקלה בתכנית. פשוט מגיעים לקוד
הפעולה הרלוונטית ומבצעים את השינוי המבוקש.
לדוגמה, אם פלט השכר של העובד שגוי, ניגש לפעולה האחראית על חישוב השכר ונבצע בה את
התיקון הנדרש. לא יהיה עלינו לחפש מבין אלפי או עשרות אלפי שורות קוד כדי למצוא את האזור
המטפל בחישוב השכר, דבר היכול לקחת זמן רב, מה גם שיתכן שחלק מן הקוד הרלוונטי נמצא גם
במקום אחד בקוד, כך ששוב נצטרך להקדיש זמן רב לחיפוש. בדוגמה זו, של פעולה לחישוב
ולהחזרת השכר, כל הקוד הרלוונטי לחישוב זה נמצא במקום אחד - בבלוק הפקודות שלה.
* הפחתת תלות - Limit dependencies
דרך כתיבת קוד באמצעות שימוש בפעולות ייעודיות, כל פעולה מבצעת דבר ספציפי, וניתן לזמן
פעולות אלה בלי תלות בקוד התוכנית הספציפית ממנה מתבצע הזימון.
לדוגמה:
* מקרה א' בתוכנית "משוב" של בי"ס, נרצה להחזיר את הממוצע בין שני הציונים של התלמיד:
במחצית א' ובמחצית ב'. נכתוב בקוד התכנית משהו כמו:
;double finalGrade = (gradeHalf1 + gradeHalf2) / 2.0.
הפעולה הרלוונטית ומבצעים את השינוי המבוקש.
לדוגמה, אם פלט השכר של העובד שגוי, ניגש לפעולה האחראית על חישוב השכר ונבצע בה את
התיקון הנדרש. לא יהיה עלינו לחפש מבין אלפי או עשרות אלפי שורות קוד כדי למצוא את האזור
המטפל בחישוב השכר, דבר היכול לקחת זמן רב, מה גם שיתכן שחלק מן הקוד הרלוונטי נמצא גם
במקום אחד בקוד, כך ששוב נצטרך להקדיש זמן רב לחיפוש. בדוגמה זו, של פעולה לחישוב
ולהחזרת השכר, כל הקוד הרלוונטי לחישוב זה נמצא במקום אחד - בבלוק הפקודות שלה.
* הפחתת תלות - Limit dependencies
דרך כתיבת קוד באמצעות שימוש בפעולות ייעודיות, כל פעולה מבצעת דבר ספציפי, וניתן לזמן
פעולות אלה בלי תלות בקוד התוכנית הספציפית ממנה מתבצע הזימון.
לדוגמה:
* מקרה א' בתוכנית "משוב" של בי"ס, נרצה להחזיר את הממוצע בין שני הציונים של התלמיד:
במחצית א' ובמחצית ב'. נכתוב בקוד התכנית משהו כמו:
;double finalGrade = (gradeHalf1 + gradeHalf2) / 2.0.
* מקרה ב' בתוכנית סטטיסטיקה של סלים שקלעו שחקני כדורסל, רוצים לחשב את ממוצע הסלים
שקלע השחקן בשני המשחקים האחרונים. נכתוב בקוד התכנית משהו כמו:
;double avgShoots = (game1Points + game2Points) / 2.0
אם היתה קיימת פעולה GetAvg המקבלת שני מספרים ומחזירה את הממוצע שלהם,
אזי בשני המקרים היינו מזמנים את הפעולה והקוד היה נראה כך:
שקלע השחקן בשני המשחקים האחרונים. נכתוב בקוד התכנית משהו כמו:
;double avgShoots = (game1Points + game2Points) / 2.0
אם היתה קיימת פעולה GetAvg המקבלת שני מספרים ומחזירה את הממוצע שלהם,
אזי בשני המקרים היינו מזמנים את הפעולה והקוד היה נראה כך:
;double finalGrade = GetAvg(gradeHalf1, gradeHalf2)
;double avgShoots = GetAvg(game1Points, game2Points)
כלומר: ניתן יהיה לחשב ממוצע בין שני מספרים בלי תלות בקוד הכללי של התוכנית.
נוסחת החישוב כתובה בפעולה ועלינו לשלוח אליה כפרמטרים את שני המספרים, בין אם אם
מייצגים ציונים או כמות סלים.
ללא שימוש בפעולה זו, בכל אחת משתי תוכניות הדוגמה, היה עלינו לכתוב בעצמנו את קוד החישוב
של הממוצע ולהשתמש בו במשתנים הרלוונטיים של אותה תוכנית. אם מסתבר שהיתה טעות בחישוב
הממוצע, והיינו מתקנים קוד זה בתוכנית ה"משוב", עדיין היתה קיימת הטעות התכנותית בתוכנית
הסטטיסטיקה של הסלים.
אם היינו משתמשים בפעולה GetAvg, הרי שהתיקון הנדרש היה מתבצע רק בה, אך משפיע על
כל מי שמזמן אותה, ובקיצור היינו פותרים כך את הבעיה שהשפיעה על שתי התוכניות.
לפעולה GetAvg אין תלות בתוכנית זו או אחרת ("משוב" או סטטיסטיקת סלים).
הדבר יצר שני יתרונות:
1) מזמנים פעולה עצמאית ולא כותבים את קוד החישוב בעצמנו
כאשר מזמנים את הפעולה, מתכנת הקצה - זה שזימן אותה, לא צריך לעסוק בכיצד מחשבים
ממוצע. כלומר, הוא לא מתכנת זאת בכלל. הוא רק קורא לפעולה ושולח לה את שני המספרים.
2) תיקון הפעולה בעלת הקוד העצמאי (הבלתי תלוי) הוא קל, ממוקד בעניין ומשפיע על כל מי שמזמן אותה
במקרה של בעייה בחישוב הממוצע, מבצעים את התיקון במקום אחד בלבד. בבלוק הפעולה.
כל מי שמזמן את הפעולה, אפילו אם היא מזומנת מתוכנית אחרת, יקבל את הערך המוחזר
ממנה, ערך נוסחת-חישוב שתוקנה ושניתן לתקן/לשנות במקום אחד בכל עת ככל שיהיה צורך.
גמישות זו יכולה להשפיע על חישובי ממוצע זה בתוכניות רבות המזמנות את הפעולה.
;double avgShoots = GetAvg(game1Points, game2Points)
כלומר: ניתן יהיה לחשב ממוצע בין שני מספרים בלי תלות בקוד הכללי של התוכנית.
נוסחת החישוב כתובה בפעולה ועלינו לשלוח אליה כפרמטרים את שני המספרים, בין אם אם
מייצגים ציונים או כמות סלים.
ללא שימוש בפעולה זו, בכל אחת משתי תוכניות הדוגמה, היה עלינו לכתוב בעצמנו את קוד החישוב
של הממוצע ולהשתמש בו במשתנים הרלוונטיים של אותה תוכנית. אם מסתבר שהיתה טעות בחישוב
הממוצע, והיינו מתקנים קוד זה בתוכנית ה"משוב", עדיין היתה קיימת הטעות התכנותית בתוכנית
הסטטיסטיקה של הסלים.
אם היינו משתמשים בפעולה GetAvg, הרי שהתיקון הנדרש היה מתבצע רק בה, אך משפיע על
כל מי שמזמן אותה, ובקיצור היינו פותרים כך את הבעיה שהשפיעה על שתי התוכניות.
לפעולה GetAvg אין תלות בתוכנית זו או אחרת ("משוב" או סטטיסטיקת סלים).
הדבר יצר שני יתרונות:
1) מזמנים פעולה עצמאית ולא כותבים את קוד החישוב בעצמנו
כאשר מזמנים את הפעולה, מתכנת הקצה - זה שזימן אותה, לא צריך לעסוק בכיצד מחשבים
ממוצע. כלומר, הוא לא מתכנת זאת בכלל. הוא רק קורא לפעולה ושולח לה את שני המספרים.
2) תיקון הפעולה בעלת הקוד העצמאי (הבלתי תלוי) הוא קל, ממוקד בעניין ומשפיע על כל מי שמזמן אותה
במקרה של בעייה בחישוב הממוצע, מבצעים את התיקון במקום אחד בלבד. בבלוק הפעולה.
כל מי שמזמן את הפעולה, אפילו אם היא מזומנת מתוכנית אחרת, יקבל את הערך המוחזר
ממנה, ערך נוסחת-חישוב שתוקנה ושניתן לתקן/לשנות במקום אחד בכל עת ככל שיהיה צורך.
גמישות זו יכולה להשפיע על חישובי ממוצע זה בתוכניות רבות המזמנות את הפעולה.
ה. פעולה 'מחזירת-ערך' לעומת פעולה 'מבצעת'
* כאשר פעולה מחזירה ערך, מציינים את טיפוסו לפני שמה (מסוג int, double, string...)
למשל: פעולה המחזירה את סכום המספרים השלמים ברצף שבין 1-10.
* כאשר פעולה לא מחזירה ערך, כותבים לפני שמה void.
למשל: פעולה המדפיסה כרטיס ביקור.
טיפ: כאשר קוד הפעולה מכיל Console.WriteLine, זו כנראה פעולת void שלא מחזירה ערך.
* כאשר פעולה מחזירה ערך, מציינים את טיפוסו לפני שמה (מסוג int, double, string...)
למשל: פעולה המחזירה את סכום המספרים השלמים ברצף שבין 1-10.
* כאשר פעולה לא מחזירה ערך, כותבים לפני שמה void.
למשל: פעולה המדפיסה כרטיס ביקור.
טיפ: כאשר קוד הפעולה מכיל Console.WriteLine, זו כנראה פעולת void שלא מחזירה ערך.
ו. מותר ואסור
* אסור לכתוב פעולה בתוך בלוק הפקודות של פעולה אחרת.
* ניתן לזמן פעולה מתוך בלוק הפקודות של פעולה אחרת.
דוגמאות:
* ניתן לזמן את הפעולה PrintStars מתוך הפעולה Main.
* ניתן לזמן את הפעולה PrintBC מתוך הפעולה Main. * ניתן לזמן את הפעולה PrintBC מתוך הפעולה PrintStars.
* ניתן לזמן את הפעולה PrintStars מתוך הפעולה PrintBC.
* לא ניתן לזמן את הפעולה Main מתוך פעולה אחרת כלשהי (הזימון שלה הוא באמצעות Ctrl+F5 בלבד).
* אסור לשכפל קוד, בשביל זה קיימות פעולות. הסיבות לאיסור שכפול קוד הן:
* קושי1: כמות הקוד הולכת וגדלה, כך גם מורכבות התכנית ולכן השליטה בקוד הופכת לקשה יותר.
נוצר עומס ויזואלי מבחינת כמות הטקסט וקשיי קריאות של קוד התכנית.
* קושי2: תחזוקת הקוד (הוספות, תיקונים, שינויים) הופכת בשלבים מסוימים לבלתי נשלטת.
למשל: מבצעים שינוי בקוד מסוים, אך קוד זהה שהועתק בעבר למקום אחר בתכנית לא עבר את השינוי
הנדרש, מה שגורם לתקלות בריצת התוכנית כמו הצגת פלטים שגויים. כאשר הקוד מסורבל כל שינוי בו
לוקח זמן רב, אם הוא בכלל אפשרי, עד כדי צורך בכתיבת כל התכנית מחדש.
* אסור לשכפל קוד, בשביל זה קיימות פעולות. הסיבות לאיסור שכפול קוד הן:
* קושי1: כמות הקוד הולכת וגדלה, כך גם מורכבות התכנית ולכן השליטה בקוד הופכת לקשה יותר.
נוצר עומס ויזואלי מבחינת כמות הטקסט וקשיי קריאות של קוד התכנית.
* קושי2: תחזוקת הקוד (הוספות, תיקונים, שינויים) הופכת בשלבים מסוימים לבלתי נשלטת.
למשל: מבצעים שינוי בקוד מסוים, אך קוד זהה שהועתק בעבר למקום אחר בתכנית לא עבר את השינוי
הנדרש, מה שגורם לתקלות בריצת התוכנית כמו הצגת פלטים שגויים. כאשר הקוד מסורבל כל שינוי בו
לוקח זמן רב, אם הוא בכלל אפשרי, עד כדי צורך בכתיבת כל התכנית מחדש.
ביום ה'
5. פעולות המקבלות פרמטר/ים.
לבית
ש.ב מיום ג', ה- 9.1.2024 ליום ה' הקרוב, ה- 11.1.2024:
1. בצעו 10 התרגילים בדף 'תרגילים בנושא פעולות המחזירות ערך ופעולות שלא מחזירות ערך" כאן.
2. מבדק שיעורי הבית ביום ה' הקרוב יהיה על 10 התרגילים הנ"ל (ולא יהיה בנושא לולאה מקוננת).
ש.ב מיום ה', ה- 11.1.24 ליום ב' הבא, ה- 15.1.24:
3. קראו 'הסבר אודות פעולות' כאן.
2. מבדק שיעורי הבית ביום ה' הקרוב יהיה על 10 התרגילים הנ"ל (ולא יהיה בנושא לולאה מקוננת).
ש.ב מיום ה', ה- 11.1.24 ליום ב' הבא, ה- 15.1.24:
3. קראו 'הסבר אודות פעולות' כאן.
4. בצעו התרגילים בנושא 'פעולות המקבלות פרמטר' כאן.
בשיעורים הבאים
1. פעולה המקבלת פרמטר/ים ומחזירות ערך.
2. העמסת פעולות (Overloading).