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

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

جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 54 من 63.

challenge icon

التحدي

سهل

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

  1. استخدم تعريف Contact نفسه لـ struct من الدروس السابقة، مع الأعضاء التالية:
    • مصفوفة محارف name بحجم 50
    • مصفوفة محارف phone بحجم 20
    • مصفوفة محارف email بحجم 40
    • عدد صحيح age
  2. استخدم دالة createContact نفسها من الدروس السابقة، والتي:
    • تخصص الذاكرة ديناميكيًا لـ Contact struct
    • تهيئ جميع الأعضاء إلى القيم الافتراضية
    • تعيد مؤشرًا إلى جهة الاتصال
  3. استخدم دالة populateContact نفسها من الدروس السابقة، والتي:
    • تأخذ مؤشرًا إلى Contact struct كمعامل لها
    • تطلب إدخال المستخدم وتملأ جميع حقول جهة الاتصال
    • تتحقق من صحة بيانات الإدخال
  4. اكتب دالة displayContact التي:
    • تأخذ مؤشرًا ثابتًا إلى Contact struct كمعامل لها
    • تطبع كل حقل في سطر مستقل بالتنسيق الدقيق التالي:
      Name: John
      Phone: 555-1234
      Email: john@email.com
      Age: 25
  5. اكتب دالة باسم updateContact التي:
    • تأخذ مؤشرًا إلى Contact struct كمعامل لها
    • لا تعيد أي شيء (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، نفّذ سير عمل كاملًا لإدارة جهات الاتصال:
    • أنشئ جهة اتصال باستخدام الدالة createContact
    • تحقق مما إذا كان إنشاء جهة الاتصال قد نجح
    • استدعِ الدالة populateContact لملء بيانات جهة الاتصال الأولية
    • اطبع --- Initial Contact ---
    • استدعِ الدالة displayContact لعرض معلومات جهة الاتصال الأولية
    • اطبع --- Updating Contact ---
    • استدعِ الدالة updateContact لتعديل أحد الحقول
    • اطبع --- Updated Contact ---
    • استدعِ الدالة displayContact مرة أخرى لعرض معلومات جهة الاتصال المحدّثة
    • حرّر الذاكرة المخصصة ديناميكيًا
    • اطبع Contact management completed

ملاحظة: تستخدم الدالة displayContact في هذا الدرس تنسيقًا بسيطًا: سطرًا واحدًا لكل حقل دون تفاصيل أو وحدات إضافية (على سبيل المثال، يُطبع العمر كرقم عادي، وليس "25 years old"). تأكد من أن الناتج يطابق التنسيق الموضح أعلاه تمامًا، لأن حالات الاختبار تعتمد عليه.

يجمع هذا التحدي النهائي جميع مكونات نظام إدارة جهات الاتصال لديك: تعريف struct، وتخصيص الذاكرة ديناميكيًا، وإدخال البيانات والتحقق منها، والعرض المنسق، وتعديل البيانات. ستوضح دورة الحياة الكاملة لـ struct مخصصة ديناميكيًا، بدءًا من الإنشاء وحتى التنظيف، مع التدرّب على تنظيم الدوال والاستخدام الصحيح للمؤشرات طوال العملية بأكملها.

جرّب بنفسك

#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 عبر الإنترنت