Menu
Coddy logo textTech

העברת פונקציות כארגומנטים

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 45 מתוך 65.

בתכנות, פונקציות יכולות לעשות יותר מאשר רק לקבל ערכים פשוטים כמו מספרים או מחרוזות — הן יכולות לקבל גם פונקציות אחרות כפרמטרים. המושג העוצמתי הזה נקרא פונקציה מסדר גבוה, והוא פותח דרכים חדשות לחלוטין לכתיבת קוד גמיש ושימושי חוזר.

כשמעבירים פונקציה כארגומנט, בעצם נותנים לפונקציה אחרת את היכולת להחליט איזו פעולה לבצע. חשבו על זה כמו לתת למישהו כלי ולאפשר לו לבחור איך להשתמש בו על חומרים שונים.

void processNumbers(List<int> numbers, Function operation) {
  for (int number in numbers) {
    operation(number);
  }
}

בדוגמה הזו, processNumbers מקבלת רשימה ופונקציה כפרמטרים. פרמטר הפונקציה operation יכול להיות כל פונקציה שמקבלת מספר שלם. פירוש הדבר הוא שאפשר להעביר פונקציה שמדפיסה מספרים, מכפילה אותם פי שניים או מבצעת כל פעולה אחרת שנחוצה לך.

הגישה הזאת הופכת את הקוד שלך לגמיש להפליא — במקום לכתוב פונקציות נפרדות לכל פעולה אפשרית, כותבים פונקציה אחת שיכולה לעבוד עם פעולות רבות ושונות על ידי קבלתן כפרמטרים.

challenge icon

אתגר

קל

צרו תוכנית שמדגימה העברת פונקציות כארגומנטים, באמצעות בניית מעבד מספרים גמיש. התוכנית שלכם תיצור פונקציות עיבוד שונות ותעביר אותן לפונקציית מעבד ראשית, שתחיל את הפעולה על רשימת מספרים.

  1. קראו קלט מסוג מחרוזת שמכיל מספרים המופרדים בפסיקים (למשל, "1,2,3,4,5")
  2. קראו קלט מסוג מחרוזת שמייצג את סוג הפעולה ("double", "square" או "increment")
  3. פצלו את הקלט הראשון לרשימת מחרוזות והמירו כל אחת מהן למספר שלם
  4. צרו שלוש פונקציות נפרדות:
    • doubleNumber - מקבלת מספר שלם ומחזירה אותו כשהוא מוכפל ב-2
    • squareNumber - מקבלת מספר שלם ומחזירה אותו כשהוא מוכפל בעצמו
    • incrementNumber - מקבלת מספר שלם ומחזירה אותו בתוספת 1
  5. צרו פונקציה ראשית בשם processNumbers שמקבלת רשימה של מספרים שלמים ופונקציה כפרמטרים
  6. הפונקציה processNumbers צריכה להחיל את הפונקציה הנתונה על כל מספר ברשימה ולהחזיר רשימה חדשה עם התוצאות
  7. בהתאם לקלט של סוג הפעולה, העבירו את הפונקציה המתאימה אל processNumbers
  8. הציגו את התוצאות בדיוק בפורמט שמוצג למטה

לדוגמה, אם הקלטים הם "2,4,6,8" ו-"double", התוכנית שלכם אמורה להציג:

Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfully

אם הקלטים הם "3,5,7" ו-"square", התוכנית שלכם אמורה להציג:

Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfully

אם הקלטים הם "10,20,30" ו-"increment", התוכנית שלכם אמורה להציג:

Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfully

התוכנית שלכם חייבת להדגים את המושג פונקציות מסדר גבוה באמצעות העברת אחת משלוש פונקציות הפעולה כארגומנט לפונקציה processNumbers. השתמשו במשפטי תנאי כדי לקבוע איזו פונקציה להעביר, בהתאם לקלט של סוג הפעולה. הפונקציה processNumbers צריכה לעבור על רשימת הקלט, להחיל את הפונקציה הנתונה על כל איבר ולאסוף את התוצאות ברשימה חדשה.

נסו בעצמכם

import 'dart:io';

void main() {
  // קראו את הקלט
  String? numbersInput = stdin.readLineSync();
  String? operation = stdin.readLineSync();
  
  // המירו את מחרוזת הקלט לרשימת מספרים שלמים
  List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
  
  // TODO: צרו את שלוש פונקציות הפעולה (doubleNumber, squareNumber, incrementNumber)
  
  // TODO: צרו את הפונקציה processNumbers שמקבלת רשימה ופונקציה כפרמטרים
  
  // TODO: השתמשו בתנאים כדי לקבוע איזו פונקציה להעביר לפי סוג הפעולה
  
  // TODO: קראו ל-processNumbers עם הפונקציה המתאימה ושמרו את התוצאה
  
  // הדפיסו את התוצאות בפורמט הנדרש
  print('Number Processor');
  print('================');
  print('Original numbers: $numbers');
  print('Operation: $operation');
  print('Processing numbers...');
  // TODO: הדפיסו כאן את רשימת התוצאות
  print('Operation completed successfully');
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Dart אונליין