Menu
Coddy logo textTech

דוגמה קלאסית: החלפה

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

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

חשבו מה קורה אם מנסים להחליף בין שני משתנים באמצעות העברה רגילה לפי ערך:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // זה מחליף רק את העותקים, לא את המשתנים המקוריים!
}

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

הפתרון דורש להעביר במקום זאת מצביעים למשתנים:

void swap(int *a, int *b) {
    int temp = *a;  // שמור את הערך שבכתובת a
    *a = *b;        // הכנס את הערך מכתובת b לכתובת a
    *b = temp;      // הכנס את הערך שנשמר לכתובת b
}

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

challenge icon

אתגר

קל

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

  1. ליצור פונקציה בשם swap שמקבלת שני מצביעים למספרים שלמים כפרמטרים
  2. בתוך הפונקציה swap, להחליף את הערכים בכתובות הזיכרון שאליהן מצביעים שני המצביעים, באמצעות משתנה זמני
  3. בפונקציה main, לקרוא שני מספרים שלמים מקלט המשתמש
  4. להדפיס את הערכים המקוריים בתבנית: Before swap: a = [value], b = [value]
  5. לקרוא לפונקציה swap ולהעביר את הכתובות של שני המשתנים באמצעות אופרטור קבלת הכתובת
  6. לאחר קריאת הפונקציה, להדפיס את הערכים שהוחלפו בתבנית: After swap: a = [value], b = [value]

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

Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]

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

נסו בעצמכם

#include <stdio.h>

// TODO: כתבו כאן את פונקציית ההחלפה שלכם

int main() {
    int a, b;
    
    // קראו קלט
    scanf("%d", &a);
    scanf("%d", &b);
    
    // הדפיסו את הערכים המקוריים
    printf("Before swap: a = %d, b = %d\n", a, b);
    
    // TODO: קראו כאן לפונקציית ההחלפה שלכם
    
    // הדפיסו את הערכים לאחר ההחלפה
    printf("After swap: a = %d, b = %d\n", a, b);
    
    return 0;
}
quiz iconבחנו את עצמכם

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

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

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