Menu
Coddy logo textTech

פונקציות סטטיות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 4 מתוך 61.

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

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

// math_utils.c
#include "math_utils.h"

// פונקציית עזר פרטית - גלויה רק בקובץ הזה
static int square(int x) {
    return x * x;
}

// פונקציה ציבורית - אפשר לקרוא לה מתוך main.c
int sum_of_squares(int a, int b) {
    return square(a) + square(b);
}

בדוגמה הזאת, sum_of_squares מוצהרת בקובץ הכותרת ואפשר להשתמש בה בכל מקום. עם זאת, square מסומנת כ-static, ולכן היא קיימת רק בתוך math_utils.c. אם main.c תנסה לקרוא ישירות ל-square(), המקשר יפיק שגיאה: הפונקציה פשוט לא קיימת מחוץ לקובץ שלה.

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

challenge icon

אתגר

קל

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

תיצרו שלושה קבצים:

  • distance.h: קובץ הכותרת שלכם, שמצהיר על פונקציה ציבורית יחידה distance_squared שמקבלת ארבעה מספרים שלמים (x1, y1, x2, y2) המייצגים שתי נקודות ומחזירה מספר שלם. הוסיפו הגנות הכללה באמצעות הסמל DISTANCE_H.
  • distance.c: קובץ המקור שלכם, שמכיל את המימוש. צרו פונקציית עזר static בשם square שמקבלת מספר שלם ומחזירה את הריבוע שלו. פונקציית העזר הזאת צריכה להיות גלויה רק בתוך distance.c. לאחר מכן, ממשו את distance_squared באמצעות פונקציית העזר הסטטית שלכם, כדי לחשב את (x2-x1)² + (y2-y1)².
  • main.c: הקובץ הראשי שלכם, שכולל את קובץ הכותרת ומשתמש בפונקציה הציבורית. פונקציית העזר square לא צריכה להיות נגישה כאן: רק distance_squared זמינה.

הפונקציה distance_squared מחשבת את ריבוע המרחק האוקלידי בין שתי נקודות. כשמגדירים את הפונקציה square כסטטית, אתם מסתירים את פרט המימוש הזה מכל קוד שמחוץ ל-distance.c.

תקבלו ארבעה קלטים של מספרים שלמים: x1, y1, x2, ו-y2.

הדפיסו את ריבוע המרחק בפורמט הזה:

Squared distance: {result}

לדוגמה, עבור הנקודות (0, 0) ו-(3, 4), הפלט יהיה:

Squared distance: 25

נסו בעצמכם

#include <stdio.h>
#include "distance.h"

int main() {
    int x1, y1, x2, y2;
    scanf("%d", &x1);
    scanf("%d", &y1);
    scanf("%d", &x2);
    scanf("%d", &y2);
    
    // TODO: קראו ל-distance_squared עם הקואורדינטות שהוזנו
    // והדפיסו את התוצאה בפורמט: "Squared distance: {result}"
    
    return 0;
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תכנות מונחה עצמים

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