פונקציה ליצירת איש קשר
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 51 מתוך 63.
אתגר
קלבהתבסס על מבנה ה־Contact שלך מהשיעור הקודם, צור פונקציה שמקצה באופן דינמי זיכרון לאיש קשר חדש. התוכנית שלך צריכה:
- להשתמש באותה הגדרת מבנה
Contactמהשיעור הקודם, עם האיברים הבאים:- מערך תווים
nameבגודל 50 - מערך תווים
phoneבגודל 20 - מערך תווים
emailבגודל 40 - מספר שלם
age
- מערך תווים
- לכתוב פונקציה בשם
createContactאשר:- אינה מקבלת פרמטרים
- מחזירה מצביע למבנה
Contact - משתמשת ב־
malloc()כדי להקצות באופן דינמי זיכרון למבנהContactאחד - בודקת אם הקצאת הזיכרון הצליחה:
- אם ההקצאה נכשלת (מחזירה NULL), מדפיסה
Memory allocation failedומחזירה NULL - אם ההקצאה מצליחה, מדפיסה
Contact created successfully
- אם ההקצאה נכשלת (מחזירה NULL), מדפיסה
- מאתחלת את כל איברי המבנה לערכי ברירת המחדל באמצעות אופרטור החץ:
- מגדירה את
nameכמחרוזת ריקה באמצעותcontactPtr->name[0] = '\0'; - מגדירה את
phoneכמחרוזת ריקה באמצעותcontactPtr->phone[0] = '\0'; - מגדירה את
emailכמחרוזת ריקה באמצעותcontactPtr->email[0] = '\0'; - מגדירה את
ageלערך 0 באמצעותcontactPtr->age = 0;
- מגדירה את
- מחזירה את המצביע לאיש הקשר החדש שנוצר
- בפונקציה הראשית:
- מצהירה על מצביע למבנה
ContactבשםnewContact - קוראת לפונקציה
createContactומשייכת את המצביע המוחזר ל־newContact - בודקת אם יצירת איש הקשר הצליחה:
- אם
newContactהוא NULL, מדפיסהFailed to create contactומסיימת את התוכנית - אם הפעולה הצליחה, מדפיסה
Contact initialized with default values
- אם
- מציגה את פרטי איש הקשר שאותחל באמצעות אופרטור החץ, בפורמט המדויק הבא:
Default Contact Values:Name: [name](יהיה ריק)Phone: [phone](יהיה ריק)Email: [email](יהיה ריק)Age: [age](יהיה 0)
- משחררת את הזיכרון שהוקצה באופן דינמי באמצעות
free(newContact) - מדפיסה
Memory freed successfully
- מצהירה על מצביע למבנה
האתגר הזה מציג את המושג פונקציות מפעל — פונקציות שיוצרות ומחזירות מצביעים למבנים שהוקצו באופן דינמי. תתרגל הקצאת זיכרון דינמית, בדיקת שגיאות תקינה, אתחול מבנים באמצעות מצביעים וניקוי זיכרון.
נסו בעצמכם
#include <stdio.h>
#include <string.h>
// TODO: Define the Contact struct here
struct Contact {
char name[50];
char phone[20];
char email[40];
int age;
};
int main() {
// TODO: Create a Contact variable named person
struct Contact person;
// Read input values
scanf("%s", person.name);
scanf("%s", person.phone);
scanf("%s", person.email);
scanf("%d", &person.age);
// TODO: Write your validation and output code below
if (person.age < 0 || person.age > 120) {
printf("Invalid age");
return 0;
}
if (strlen(person.phone) < 10) {
printf("Invalid phone number");
return 0;
}
printf("Contact Information:\n");
printf("Name: %s\n", person.name);
printf("Phone: %s\n", person.phone);
printf("Email: %s\n", person.email);
printf("Age: %d\n", person.age);
printf("Name length: %lu\n", strlen(person.name));
if (person.age >= 0 && person.age <= 17) {
printf("Category: Minor");
} else if (person.age >= 18 && person.age <= 64) {
printf("Category: Adult");
} else {
printf("Category: Senior");
}
return 0;
}כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיות6ניהול זיכרון
זיכרון מחסנית לעומת ערימההקצאה דינמית - malloc()שימוש ב-sizeof() להקצאהבדיקת כישלון בהקצאהשחרור זיכרון באמצעות free()הקצאה באמצעות calloc()סיכום: מערך דינמי9פרויקט: רישום איש קשר פשוט
פרויקט: הגדרת מבנה איש קשרפונקציה ליצירת איש קשרתרגלו בעצמכם: קומפיילר C אונליין