Menu
Coddy logo textTech

פונקציות עם מספר משתנה של ארגומנטים (...)

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Lua של Coddy. שיעור 11 מתוך 54.

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

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

function sum(...)
    -- גוף הפונקציה
end

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

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- פלט: 30
print(sum(1, 2, 3, 4, 5))  -- פלט: 15

הביטוי {...} יוצר טבלה בסגנון רשימה המכילה את כל הארגומנטים שהועברו לפונקציה. לאחר מכן אפשר לעבור על הטבלה הזאת בדיוק כמו על כל טבלה אחרת, באמצעות אופרטור האורך # או ipairs().

challenge icon

אתגר

קל

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

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

הערה: קוד הפתיחה (שמסומן "Don't touch this code") קורא מספרים מהקלט, ממיר כל אחד מהם מטקסט למספר באמצעות tonumber(), ושומר אותם בטבלה בשם numbers. בסוף, הוא קורא לפונקציה שלכם באמצעות unpack(numbers), שפושט את ערכי הטבלה לארגומנטים נפרדים, כך שהפונקציה שלכם מקבלת אותם בתור .... אין צורך לשנות את הקוד הזה או להבין אותו לעומק; פשוט התמקדו בכתיבת calculateAverage.

לוגיקה:

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

פרמטרים:

  • ... (מספרים): מספר משתנה של ארגומנטים מספריים

ערך מוחזר: הממוצע של כל המספרים שסופקו (מספר)

נסו בעצמכם

-- אל תשנו את הקוד הזה --
local numbers = {}
while true do
    local input = io.read()
    if input == nil or input == "" then
        break
    end
    local num = tonumber(input)
    if num then
        table.insert(numbers, num)
    end
end
-------------------------

function calculateAverage(...)
    -- כתבו כאן קוד
end

local average = calculateAverage(unpack(numbers))
print("Average: " .. average)

quiz iconבחנו את עצמכם

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

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

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