Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تجميع كل الأجزاء معاً

جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 54 من 63.

challenge icon

التحدي

سهل

أكمل نظام إدارة جهات الاتصال الخاص بك من خلال دمج جميع الوظائف التي أنشأتها في الدروس السابقة. يجب أن يقوم برنامجك بما يلي:

  1. استخدام نفس تعريف هيكل Contact من الدروس السابقة مع الأعضاء التالية:
    • مصفوفة أحرف name بحجم 50
    • مصفوفة أحرف phone بحجم 20
    • مصفوفة أحرف email بحجم 40
    • عدد صحيح age
  2. استخدام نفس دالة createContact من الدروس السابقة التي تقوم بـ:
    • تخصيص الذاكرة ديناميكيًا لهيكل Contact
    • تهيئة جميع الأعضاء للقيم الافتراضية
    • إرجاع مؤشر (pointer) إلى جهة الاتصال
  3. استخدام نفس دالة populateContact من الدروس السابقة التي تقوم بـ:
    • تأخذ مؤشرًا إلى هيكل Contact كمعامل لها
    • تطلب مدخلات من المستخدم وتملأ جميع حقول جهة الاتصال
    • تتحقق من صحة بيانات الإدخال
  4. كتابة دالة displayContact تقوم بـ:
    • تأخذ مؤشرًا ثابتًا (constant pointer) إلى هيكل 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. في الدالة الرئيسية (main function)، قم بتنفيذ سير عمل كامل لإدارة جهات الاتصال:
    • إنشاء جهة اتصال باستخدام دالة 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;
}

جميع دروس Logic & Flow