دالة لإنشاء جهة اتصال
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 51 من 63.
التحدي
سهلبناءً على هيكل Contact من الدرس السابق، قم بإنشاء دالة تخصص ذاكرة ديناميكية لجهة اتصال جديدة. يجب أن يقوم برنامجك بما يلي:
- استخدام نفس تعريف هيكل
Contactمن الدرس السابق مع الأعضاء التالية:- مصفوفة أحرف
nameبحجم 50 - مصفوفة أحرف
phoneبحجم 20 - مصفوفة أحرف
emailبحجم 40 - عدد صحيح
age
- مصفوفة أحرف
- كتابة دالة باسم
createContactتقوم بما يلي:- لا تأخذ أي معاملات
- تعيد مؤشراً (pointer) إلى هيكل
Contact - تستخدم
malloc()لتخصيص ذاكرة ديناميكية لهيكلContactواحد - تتحقق مما إذا كان تخصيص الذاكرة ناجحاً:
- إذا فشل التخصيص (أعاد NULL)، تطبع
Memory allocation failedوتعيد NULL - إذا نجح التخصيص، تطبع
Contact created successfully
- إذا فشل التخصيص (أعاد NULL)، تطبع
- تهيئ جميع أعضاء الهيكل إلى قيم افتراضية باستخدام عامل السهم (arrow operator):
- تضبط
nameإلى سلسلة نصية فارغة باستخدامcontactPtr->name[0] = '\0'; - تضبط
phoneإلى سلسلة نصية فارغة باستخدامcontactPtr->phone[0] = '\0'; - تضبط
emailإلى سلسلة نصية فارغة باستخدامcontactPtr->email[0] = '\0'; - تضبط
ageإلى 0 باستخدامcontactPtr->age = 0;
- تضبط
- تعيد المؤشر إلى جهة الاتصال التي تم إنشاؤها حديثاً
- في الدالة الرئيسية (main function):
- الإعلان عن مؤشر لهيكل
ContactباسمnewContact - استدعاء دالة
createContactوتعيين المؤشر المعاد إلىnewContact - التحقق مما إذا كان إنشاء جهة الاتصال ناجحاً:
- إذا كان
newContactهو NULL، اطبعFailed to create contactواخرج من البرنامج - إذا كان ناجحاً، اطبع
Contact initialized with default values
- إذا كان
- عرض معلومات جهة الاتصال التي تمت تهيئتها باستخدام عامل السهم بهذا التنسيق الدقيق:
Default Contact Values:Name: [name](سيكون فارغاً)Phone: [phone](سيكون فارغاً)Email: [email](سيكون فارغاً)Age: [age](سيكون 0)
- تحرير الذاكرة المخصصة ديناميكياً باستخدام
free(newContact) - طباعة
Memory freed successfully
- الإعلان عن مؤشر لهيكل
يقدم هذا التحدي مفهوم دوال المصنع (factory functions) - وهي الدوال التي تنشئ وتعيد مؤشرات لهياكل مخصصة ديناميكياً. ستتدرب على تخصيص الذاكرة الديناميكية، والتحقق الصحيح من الأخطاء، وتهيئة الهياكل من خلال المؤشرات، وتنظيف الذاكرة.
جرّب بنفسك
#include <stdio.h>
#include <string.h>
// TODO: Define the Contact struct here
struct Contact {
char name[50];
char phone[20];
char email[40];
int age;
};
int main() {
// TODO: Create a Contact variable named person
struct Contact person;
// Read input values
scanf("%s", person.name);
scanf("%s", person.phone);
scanf("%s", person.email);
scanf("%d", &person.age);
// TODO: Write your validation and output code below
if (person.age < 0 || person.age > 120) {
printf("Invalid age");
return 0;
}
if (strlen(person.phone) < 10) {
printf("Invalid phone number");
return 0;
}
printf("Contact Information:\n");
printf("Name: %s\n", person.name);
printf("Phone: %s\n", person.phone);
printf("Email: %s\n", person.email);
printf("Age: %d\n", person.age);
printf("Name length: %lu\n", strlen(person.name));
if (person.age >= 0 && person.age <= 17) {
printf("Category: Minor");
} else if (person.age >= 18 && person.age <= 64) {
printf("Category: Adult");
} else {
printf("Category: Senior");
}
return 0;
}جميع دروس Logic & Flow
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 جهة الاتصالدالة لإنشاء جهة اتصال