تجميع كل الأجزاء معاً
جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 54 من 63.
التحدي
سهلأكمل نظام إدارة جهات الاتصال لديك من خلال دمج جميع الدوال التي أنشأتها في الدروس السابقة. يجب أن يقوم برنامجك بما يلي:
- استخدم تعريف
Contactنفسه لـstructمن الدروس السابقة، مع الأعضاء التالية:- مصفوفة محارف
nameبحجم 50 - مصفوفة محارف
phoneبحجم 20 - مصفوفة محارف
emailبحجم 40 - عدد صحيح
age
- مصفوفة محارف
- استخدم دالة
createContactنفسها من الدروس السابقة، والتي:- تخصص الذاكرة ديناميكيًا لـ
Contactstruct - تهيئ جميع الأعضاء إلى القيم الافتراضية
- تعيد مؤشرًا إلى جهة الاتصال
- تخصص الذاكرة ديناميكيًا لـ
- استخدم دالة
populateContactنفسها من الدروس السابقة، والتي:- تأخذ مؤشرًا إلى
Contactstructكمعامل لها - تطلب إدخال المستخدم وتملأ جميع حقول جهة الاتصال
- تتحقق من صحة بيانات الإدخال
- تأخذ مؤشرًا إلى
- اكتب دالة
displayContactالتي:- تأخذ مؤشرًا ثابتًا إلى
Contactstructكمعامل لها - تطبع كل حقل في سطر مستقل بالتنسيق الدقيق التالي:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- تأخذ مؤشرًا ثابتًا إلى
- اكتب دالة باسم
updateContactالتي:- تأخذ مؤشرًا إلى
Contactstructكمعامل لها - لا تعيد أي شيء (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
- تأخذ مؤشرًا إلى
- في الدالة 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;
}جميع دروس المنطق وتدفق التنفيذ
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية6إدارة الذاكرة
ذاكرة Stack مقابل Heapالتخصيص الديناميكي - malloc()استخدام sizeof() للتخصيصالتحقق من فشل التخصيصتحرير الذاكرة باستخدام free()التخصيص باستخدام calloc()ملخص: المصفوفة الديناميكية9مشروع: إدخال جهة اتصال بسيطة
مشروع: تعريف Struct جهة الاتصالدالة لإنشاء جهة اتصالتدرّب بنفسك: مترجم C عبر الإنترنت