دالة لتعبئة بيانات جهة اتصال
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 52 من 63.
التحدي
سهلبناءً على وظيفة إنشاء جهة الاتصال من الدرس السابق، قم بإنشاء وظيفة تملأ جهة الاتصال بمدخلات المستخدم. يجب أن يقوم برنامجك بما يلي:
- استخدم نفس تعريف هيكل
Contactمن الدروس السابقة مع الأعضاء التالية:- مصفوفة أحرف
nameبحجم 50 - مصفوفة أحرف
phoneبحجم 20 - مصفوفة أحرف
emailبحجم 40 - عدد صحيح
age
- مصفوفة أحرف
- استخدم نفس وظيفة
createContactمن الدرس السابق التي تقوم بـ:- تخصيص الذاكرة ديناميكيًا لهيكل
Contact - تهيئة جميع الأعضاء للقيم الافتراضية
- إرجاع مؤشر (pointer) إلى جهة الاتصال
- تخصيص الذاكرة ديناميكيًا لهيكل
- اكتب وظيفة تسمى
populateContactتقوم بـ:- تأخذ مؤشرًا إلى هيكل
Contactكمعامل لها - لا تعيد شيئًا (void)
- تطلب من المستخدم إدخال البيانات وتقرأها بالترتيب الدقيق التالي:
- تطبع
Enter name:وتقرأ سلسلة نصية في حقل الاسم باستخدامscanf("%s", contactPtr->name) - تطبع
Enter phone:وتقرأ سلسلة نصية في حقل الهاتف باستخدامscanf("%s", contactPtr->phone) - تطبع
Enter email:وتقرأ سلسلة نصية في حقل البريد الإلكتروني باستخدامscanf("%s", contactPtr->email) - تطبع
Enter age:وتقرأ عددًا صحيحًا في حقل العمر باستخدامscanf("%d", &contactPtr->age)
- تطبع
- بعد قراءة جميع المدخلات، تتحقق من صحة البيانات:
- إذا كان العمر أقل من 0 أو أكبر من 120، تطبع
Invalid age entered - إذا كان طول رقم الهاتف أقل من 10 أحرف (استخدم
strlen())، تطبعInvalid phone number - إذا اجتازت جميع عمليات التحقق، تطبع
Contact populated successfully
- إذا كان العمر أقل من 0 أو أكبر من 120، تطبع
- تأخذ مؤشرًا إلى هيكل
- في الوظيفة الرئيسية (main function):
- أنشئ جهة اتصال باستخدام وظيفة
createContact - تحقق مما إذا كان إنشاء جهة الاتصال ناجحًا
- استدعِ وظيفة
populateContactلملء بيانات جهة الاتصال - بعد الملء، اعرض معلومات جهة الاتصال باستخدام عامل السهم (arrow operator) بهذا التنسيق الدقيق:
Contact Information:Name: [name]Phone: [phone]Email: [email]Age: [age]
- قم بتحرير الذاكرة المخصصة ديناميكيًا
- اطبع
Contact deleted successfully
- أنشئ جهة اتصال باستخدام وظيفة
يوضح هذا التحدي كيفية إنشاء وظائف تعدل بيانات الهيكل (struct) من خلال المؤشرات. تستقبل وظيفة populateContact مؤشرًا لجهة الاتصال وتستخدم عامل السهم لتعديل أعضاء الهيكل الأصلي مباشرةً. ستتدرب على التعامل مع مدخلات المستخدم، والتحقق من صحة البيانات، والعمل مع الهياكل المخصصة ديناميكيًا من خلال معاملات الوظائف.
جرّب بنفسك
#include <stdio.h>
#include <stdlib.h>
struct Contact {
char name[50];
char phone[20];
char email[40];
int age;
};
struct Contact* createContact() {
struct Contact* contactPtr = (struct Contact*)malloc(sizeof(struct Contact));
if (contactPtr == NULL) {
printf("Memory allocation failed\n");
return NULL;
}
printf("Contact created successfully\n");
contactPtr->name[0] = '\0';
contactPtr->phone[0] = '\0';
contactPtr->email[0] = '\0';
contactPtr->age = 0;
return contactPtr;
}
int main() {
struct Contact* newContact;
newContact = createContact();
if (newContact == NULL) {
printf("Failed to create contact\n");
return 1;
}
printf("Contact initialized with default values\n");
printf("Default Contact Values:\n");
printf("Name: %s\n", newContact->name);
printf("Phone: %s\n", newContact->phone);
printf("Email: %s\n", newContact->email);
printf("Age: %d\n", newContact->age);
free(newContact);
printf("Memory freed successfully\n");
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 جهة الاتصالدالة لإنشاء جهة اتصال