העברת מבנים לפי ערך
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 46 מתוך 63.
עכשיו, לאחר שלמדת לעבוד עם מבנים ומצביעים למבנים, הגיע הזמן ללמוד כיצד להעביר מבנים שלמים לפונקציות. כשמעבירים מבנה לפונקציה כפרמטר, C משתמשת בהעברה לפי ערך, כלומר הפונקציה מקבלת עותק מלא של המבנה.
הנה התחביר של פונקציה שמקבלת פרמטר מסוג struct:
void functionName(struct StructureName parameterName) {
// גוף הפונקציה
}בעזרת המבנה המוכר שלנו Point כדוגמה:
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}הרעיון המרכזי שחשוב להבין הוא שכל שינוי שתבצעו ב־struct בתוך הפונקציה לא ישפיע על ה־struct המקורי בפונקציה הקוראת. הסיבה לכך היא שהפונקציה עובדת עם עותק משלה של הנתונים.
הגישה הזו שימושית כשרוצים לקרוא או להציג נתוני מבנה בלי להסתכן בשינויים מקריים במקור. עם זאת, חשוב לזכור שהעתקה של מבנים גדולים עלולה להיות לא יעילה מבחינת זיכרון וביצועים.
אתגר
קלכתבו תוכנית C שמדגימה העברת מבנים לפונקציות לפי ערך. התוכנית שלכם צריכה:
- להגדיר
structבשםRectangleעם החברים הבאים:- מספר שלם
widthלאחסון רוחב המלבן - מספר שלם
heightלאחסון גובה המלבן - מערך תווים
colorבגודל 15 לאחסון צבע המלבן
- מספר שלם
- לכתוב פונקציה בשם
displayRectangleש:- מקבלת מבנה
Rectangleכפרמטר (העברה לפי ערך) - מדפיסה את פרטי המלבן בפורמט המדויק הבא:
Rectangle Details:Width: [width]Height: [height]Color: [color]Area: [area]
- מחשבת ומדפיסה את השטח (רוחב × גובה)
- מקבלת מבנה
- לכתוב פונקציה בשם
modifyRectangleש:- מקבלת מבנה
Rectangleכפרמטר (העברה לפי ערך) - מכפילה פי שניים גם את רוחב המלבן וגם את גובהו
- משנה את הצבע ל-"Modified"
- מדפיסה
Inside modifyRectangle function: - קוראת ל-
displayRectangleכדי להציג את המלבן ששונה
- מקבלת מבנה
- בפונקציה הראשית:
- יוצרת משתנה
Rectangleבשםrect - קוראת את הרוחב, הגובה והצבע מהקלט ומשייכת אותם לחברי המבנה
- מדפיסה
Original rectangle: - קוראת ל-
displayRectangleכדי להציג את המלבן המקורי - קוראת ל-
modifyRectangleעם המלבן - מדפיסה
After modifyRectangle call: - קוראת שוב ל-
displayRectangleכדי להראות שהמלבן המקורי לא השתנה
- יוצרת משתנה
אתגר זה מדגים את העיקרון המרכזי של העברה לפי ערך עם מבנים: כשמעבירים מבנה לפונקציה, הפונקציה מקבלת עותק מלא של המבנה. כל שינוי שנעשה בתוך הפונקציה משפיע רק על העותק, ולא על המבנה המקורי בפונקציה הקוראת.
נסו בעצמכם
#include <stdio.h>
#include <string.h>
// TODO: הגדירו כאן את המבנה Rectangle
// TODO: כתבו כאן את הפונקציה displayRectangle
// TODO: כתבו כאן את הפונקציה modifyRectangle
int main() {
// קראו את הקלט
int width, height;
char color[15];
scanf("%d", &width);
scanf("%d", &height);
scanf("%s", color);
// TODO: צרו משתנה מסוג Rectangle והקצו לו את ערכי הקלט
// TODO: הדפיסו "Original rectangle:" וקראו לפונקציה displayRectangle
// TODO: קראו לפונקציה modifyRectangle
// TODO: הדפיסו "After modifyRectangle call:" וקראו שוב לפונקציה displayRectangle
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה8מבנים ומצביעים
מצביעים למבניםאופרטור החץ (->)העברת מבנים לפי ערךהעברת מצביעים למבניםהקצאה דינמית של מבניםסיכום: שינוי מבנה באמצעות מצביע3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין