Menu
Coddy logo textTech

חיבור כל החלקים יחד

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

challenge icon

אתגר

קל

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

  1. להשתמש באותה הגדרת מבנה Contact מהשיעורים הקודמים, עם החברים:
    • מערך תווים בשם name בגודל 50
    • מערך תווים בשם phone בגודל 20
    • מערך תווים בשם email בגודל 40
    • מספר שלם בשם age
  2. להשתמש באותה פונקציה createContact מהשיעורים הקודמים, אשר:
    • מקצה זיכרון באופן דינמי למבנה Contact
    • מאתחלת את כל החברים לערכי ברירת מחדל
    • מחזירה מצביע לאיש הקשר
  3. להשתמש באותה פונקציה populateContact מהשיעורים הקודמים, אשר:
    • מקבלת מצביע למבנה Contact כפרמטר
    • מבקשת מהמשתמש להזין נתונים וממלאת את כל השדות של איש הקשר
    • מאמתת את הנתונים שהוזנו
  4. לכתוב פונקציה בשם displayContact אשר:
    • מקבלת מצביע קבוע למבנה Contact כפרמטר
    • מדפיסה כל שדה בשורה נפרדת, בדיוק בפורמט הזה:
      Name: John
      Phone: 555-1234
      Email: john@email.com
      Age: 25
  5. לכתוב פונקציה בשם updateContact אשר:
    • מקבלת מצביע למבנה Contact כפרמטר
    • לא מחזירה דבר (void)
    • מבקשת מהמשתמש לבחור איזה שדה לעדכן באמצעות הדפסת:
      • What would you like to update?
      • 1. Name
      • 2. Phone
      • 3. Email
      • 4. Age
      • Enter choice (1-4):
    • קוראת את הבחירה של המשתמש ומעדכנת את השדה המתאים:
      • אם הבחירה היא 1: מדפיסה Enter new name: ומעדכנת את השם
      • אם הבחירה היא 2: מדפיסה Enter new phone: ומעדכנת את מספר הטלפון
      • אם הבחירה היא 3: מדפיסה Enter new email: ומעדכנת את כתובת האימייל
      • אם הבחירה היא 4: מדפיסה Enter new age: ומעדכנת את הגיל
      • אם הבחירה אינה תקינה (לא 1–4): מדפיסה Invalid choice
    • לאחר עדכון מוצלח, מדפיסה Contact updated successfully
  6. בפונקציה הראשית, לממש תהליך עבודה מלא לניהול אנשי קשר:
    • ליצור איש קשר באמצעות הפונקציה 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;
}

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

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