חיבור כל החלקים יחד
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 54 מתוך 63.
אתגר
קלהשלם את מערכת ניהול אנשי הקשר שלך באמצעות שילוב כל הפונקציות שיצרת בשיעורים הקודמים. התוכנית שלך צריכה:
- להשתמש באותה הגדרת מבנה
Contactמהשיעורים הקודמים, עם החברים:- מערך תווים בשם
nameבגודל 50 - מערך תווים בשם
phoneבגודל 20 - מערך תווים בשם
emailבגודל 40 - מספר שלם בשם
age
- מערך תווים בשם
- להשתמש באותה פונקציה
createContactמהשיעורים הקודמים, אשר:- מקצה זיכרון באופן דינמי למבנה
Contact - מאתחלת את כל החברים לערכי ברירת מחדל
- מחזירה מצביע לאיש הקשר
- מקצה זיכרון באופן דינמי למבנה
- להשתמש באותה פונקציה
populateContactמהשיעורים הקודמים, אשר:- מקבלת מצביע למבנה
Contactכפרמטר - מבקשת מהמשתמש להזין נתונים וממלאת את כל השדות של איש הקשר
- מאמתת את הנתונים שהוזנו
- מקבלת מצביע למבנה
- לכתוב פונקציה בשם
displayContactאשר:- מקבלת מצביע קבוע למבנה
Contactכפרמטר - מדפיסה כל שדה בשורה נפרדת, בדיוק בפורמט הזה:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- מקבלת מצביע קבוע למבנה
- לכתוב פונקציה בשם
updateContactאשר:- מקבלת מצביע למבנה
Contactכפרמטר - לא מחזירה דבר (void)
- מבקשת מהמשתמש לבחור איזה שדה לעדכן באמצעות הדפסת:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- קוראת את הבחירה של המשתמש ומעדכנת את השדה המתאים:
- אם הבחירה היא 1: מדפיסה
Enter new name:ומעדכנת את השם - אם הבחירה היא 2: מדפיסה
Enter new phone:ומעדכנת את מספר הטלפון - אם הבחירה היא 3: מדפיסה
Enter new email:ומעדכנת את כתובת האימייל - אם הבחירה היא 4: מדפיסה
Enter new age:ומעדכנת את הגיל - אם הבחירה אינה תקינה (לא 1–4): מדפיסה
Invalid choice
- אם הבחירה היא 1: מדפיסה
- לאחר עדכון מוצלח, מדפיסה
Contact updated successfully
- מקבלת מצביע למבנה
- בפונקציה הראשית, לממש תהליך עבודה מלא לניהול אנשי קשר:
- ליצור איש קשר באמצעות הפונקציה
createContact - לבדוק אם יצירת איש הקשר הצליחה
- לקרוא לפונקציה
populateContactכדי למלא את הנתונים הראשוניים של איש הקשר - להדפיס
--- Initial Contact --- - לקרוא לפונקציה
displayContactכדי להציג את פרטי איש הקשר הראשוניים - להדפיס
--- Updating Contact --- - לקרוא לפונקציה
updateContactכדי לשנות שדה אחד - להדפיס
--- Updated Contact --- - לקרוא שוב לפונקציה
displayContactכדי להציג את פרטי איש הקשר המעודכנים - לשחרר את הזיכרון שהוקצה באופן דינמי
- להדפיס
Contact management completed
- ליצור איש קשר באמצעות הפונקציה
הערה: הפונקציה displayContact בשיעור הזה משתמשת בפורמט פשוט: שורה אחת לכל שדה, ללא פרטים או יחידות נוספים (למשל, הגיל מודפס כמספר בלבד, ולא "25 years old"). ודא שהפלט שלך תואם בדיוק לפורמט שמוצג למעלה, כי מקרי הבדיקה תלויים בכך.
האתגר המסכם הזה משלב את כל הרכיבים של מערכת ניהול אנשי הקשר שלך: הגדרת מבנה, הקצאת זיכרון דינמית, קלט ואימות נתונים, הצגה מעוצבת ושינוי נתונים. תדגים את מחזור החיים המלא של מבנה שהוקצה באופן דינמי, מיצירתו ועד לניקויו, תוך תרגול ארגון פונקציות והשימוש הנכון במצביעים לאורך כל התהליך.
נסו בעצמכם
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Contact {
char name[50];
char phone[20];
char email[40];
int age;
};
struct Contact* createContact() {
struct Contact* contact = (struct Contact*)malloc(sizeof(struct Contact));
if (contact != NULL) {
strcpy(contact->name, "");
strcpy(contact->phone, "");
strcpy(contact->email, "");
contact->age = 0;
}
return contact;
}
void populateContact(struct Contact* contactPtr) {
printf("Enter name: ");
fgets(contactPtr->name, sizeof(contactPtr->name), stdin);
contactPtr->name[strcspn(contactPtr->name, "\n")] = '\0';
printf("Enter phone: ");
fgets(contactPtr->phone, sizeof(contactPtr->phone), stdin);
contactPtr->phone[strcspn(contactPtr->phone, "\n")] = '\0';
printf("Enter email: ");
fgets(contactPtr->email, sizeof(contactPtr->email), stdin);
contactPtr->email[strcspn(contactPtr->email, "\n")] = '\0';
printf("Enter age: ");
scanf("%d", &contactPtr->age);
}
void displayContact(const struct Contact *contactPtr) {
printf("=== CONTACT DETAILS ===\n");
printf("Name: %s\n", contactPtr->name);
printf("Phone: %s\n", contactPtr->phone);
printf("Email: %s\n", contactPtr->email);
printf("Age: %d years old\n", contactPtr->age);
printf("========================\n");
printf("Name length: %lu characters\n", strlen(contactPtr->name));
if (contactPtr->age >= 0 && contactPtr->age <= 12) {
printf("Generation: Child\n");
} else if (contactPtr->age >= 13 && contactPtr->age <= 19) {
printf("Generation: Teenager\n");
} else if (contactPtr->age >= 20 && contactPtr->age <= 39) {
printf("Generation: Young Adult\n");
} else if (contactPtr->age >= 40 && contactPtr->age <= 59) {
printf("Generation: Middle-aged Adult\n");
} else if (contactPtr->age >= 60) {
printf("Generation: Senior\n");
}
if (strchr(contactPtr->email, '@') != NULL) {
printf("Email format: Valid\n");
} else {
printf("Email format: Invalid\n");
}
}
int main() {
struct Contact* contact = createContact();
if (contact != NULL) {
populateContact(contact);
displayContact(contact);
free(contact);
printf("Program completed successfully\n");
}
return 0;
}כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיות6ניהול זיכרון
זיכרון מחסנית לעומת ערימההקצאה דינמית - malloc()שימוש ב-sizeof() להקצאהבדיקת כישלון בהקצאהשחרור זיכרון באמצעות free()הקצאה באמצעות calloc()סיכום: מערך דינמי9פרויקט: רישום איש קשר פשוט
פרויקט: הגדרת מבנה איש קשרפונקציה ליצירת איש קשרתרגלו בעצמכם: קומפיילר C אונליין