Menu
Coddy logo textTech

העברת מערכים לפונקציות

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 29 מתוך 63.

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

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

void printArray(int arr[], int size) {
    // arr הוא למעשה מצביע לאיבר הראשון
    // הפונקציה יכולה לגשת למערך המקורי ולשנות אותו
}

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

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

challenge icon

אתגר

קל

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

  1. ליצור פונקציה בשם analyzeTemperatures שמקבלת מערך של מספרים שלמים ואת גודלו כפרמטרים
  2. בתוך הפונקציה analyzeTemperatures, לחשב ולהדפיס את הטמפרטורה הממוצעת עם ספרה אחת בדיוק אחרי הנקודה העשרונית, בפורמט: Average temperature: [value]
  3. בתוך הפונקציה analyzeTemperatures, למצוא ולהדפיס את הטמפרטורה הגבוהה ביותר בפורמט: Highest temperature: [value]
  4. בתוך הפונקציה analyzeTemperatures, לספור כמה טמפרטורות גבוהות מ-25 מעלות ולהדפיס את הספירה בפורמט: Days above 25 degrees: [count]
  5. בפונקציה main, לקרוא מספר שלם n שמייצג את מספר מדידות הטמפרטורה
  6. לקרוא n ערכי טמפרטורה ולאחסן אותם במערך של מספרים שלמים
  7. לקרוא לפונקציה analyzeTemperatures, ולהעביר לה את המערך ואת גודלו

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

5
20 28 15 32 26

הפלט שלכם צריך להיות:

Average temperature: 24.2
Highest temperature: 32
Days above 25 degrees: 3

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

נסו בעצמכם

#include <stdio.h>

// TODO: צרו כאן את הפונקציה analyzeTemperatures

int main() {
    // קראו את מספר מדידות הטמפרטורה
    int n;
    scanf("%d", &n);
    
    // הכריזו על מערך לאחסון הטמפרטורות
    int temperatures[n];
    
    // קראו את ערכי הטמפרטורה
    for (int i = 0; i < n; i++) {
        scanf("%d", &temperatures[i]);
    }
    
    // TODO: קראו כאן לפונקציה analyzeTemperatures
    
    return 0;
}
quiz iconבחנו את עצמכם

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

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

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