دالة لعرض جهة اتصال
جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 53 من 63.
التحدي
سهلبناءً على نظام إدارة جهات الاتصال الذي أنشأته في الدروس السابقة، أنشئ دالة تعرض معلومات جهة الاتصال بطريقة منسّقة. يقدّم هذا الدرس ثلاث دوال جديدة للسلاسل النصية ستحتاج إليها: fgets() وstrcspn() وstrchr()؛ وسيتم شرح كل منها أدناه قبل المتطلبات.
الدوال الجديدة المستخدمة في هذا الدرس:
fgets(buffer, size, stdin): تقرأ سطرًا من الإدخال، بما في ذلك المسافات (بخلافscanfالتي تتوقف عند المسافات البيضاء). وتخزّن الإدخال فيbuffer، وتقرأ بحد أقصىsize - 1من المحارف. كما تخزّن محرف السطر الجديد'\n'في النهاية.strcspn(str, "\n"): تُرجع فهرس أول ظهور لـ'\n'فيstr. وتُستخدم لإزالة محرف السطر الجديد الموجود في نهاية السلسلة بعد استخدامfgets:str[strcspn(str, "\n")] = '\0';strchr(str, ch): تبحث عن المحرفchفيstrوتُرجع مؤشرًا إلى موقعه، أوNULLإذا لم يتم العثور عليه.
يجب أن ينفّذ برنامجك ما يلي:
- استخدم تعريف
Contactنفسه من الدروس السابقة، مع الأعضاء التالية:- مصفوفة محارف
nameبحجم 50 - مصفوفة محارف
phoneبحجم 20 - مصفوفة محارف
emailبحجم 40 - عدد صحيح
age
- مصفوفة محارف
- استخدم دالة
createContactنفسها من الدروس السابقة، والتي:- تخصّص الذاكرة ديناميكيًا لبنية
Contact - تهيّئ جميع الأعضاء إلى قيم افتراضية
- تُرجع مؤشرًا إلى جهة الاتصال
- تخصّص الذاكرة ديناميكيًا لبنية
- اكتب دالة
populateContactالتي:- تأخذ مؤشرًا إلى بنية
Contactكمعامل لها - تستخدم
fgets()لقراءة كل حقل نصي (الاسم والهاتف والبريد الإلكتروني) حتى يتم قبول الأسماء التي تحتوي على مسافات - تستخدم
strcspn()لإزالة محرف السطر الجديد الموجود في نهاية كل حقل نصي بعد قراءته - تستخدم
scanf("%d", ...)لقراءة حقل العمر الصحيح - ملاحظة: لا يتضمن هذا الإصدار من
populateContactالتحقق من طول رقم الهاتف: لا تضفه، لأن مدخلات الاختبار تستخدم أرقام هواتف قصيرة مثل555-1234
- تأخذ مؤشرًا إلى بنية
- اكتب دالة باسم
displayContactالتي:- تأخذ مؤشرًا ثابتًا إلى بنية
Contactكمعامل لها:const struct Contact *contactPtr - لا تُرجع أي شيء (void)
- تطبع معلومات جهة الاتصال بالتنسيق الدقيق التالي:
=== CONTACT DETAILS ===Name: [name]Phone: [phone]Email: [email]Age: [age] years old========================
- بعد عرض المعلومات الأساسية، تحسب وتعرض تفاصيل إضافية:
- تحسب طول الاسم باستخدام
strlen()وتطبع:Name length: [length] characters - تحدّد فئة الجيل استنادًا إلى العمر وتطبع:
- إذا كان العمر بين 0 و12:
Generation: Child - إذا كان العمر بين 13 و19:
Generation: Teenager - إذا كان العمر بين 20 و39:
Generation: Young Adult - إذا كان العمر بين 40 و59:
Generation: Middle-aged Adult - إذا كان العمر 60 أو أكثر:
Generation: Senior
- إذا كان العمر بين 0 و12:
- تتحقق مما إذا كان البريد الإلكتروني يحتوي على المحرف
'@'باستخدامstrchr()، وتطبع:- إذا تم العثور على
'@':Email format: Valid - إذا لم يتم العثور على
'@':Email format: Invalid
- إذا تم العثور على
- تحسب طول الاسم باستخدام
- تأخذ مؤشرًا ثابتًا إلى بنية
- في الدالة main:
- أنشئ جهة اتصال باستخدام الدالة
createContact - تحقق مما إذا كان إنشاء جهة الاتصال قد نجح
- استدعِ الدالة
populateContactلملء بيانات جهة الاتصال - استدعِ الدالة
displayContactلعرض معلومات جهة الاتصال المنسّقة - حرّر الذاكرة المخصّصة ديناميكيًا
- اطبع
Program completed successfully
- أنشئ جهة اتصال باستخدام الدالة
يوضّح هذا التحدي كيفية إنشاء دالة عرض تأخذ مؤشرًا ثابتًا إلى بنية، مما يضمن عدم تمكّن الدالة من تعديل البيانات الأصلية. ستتدرّب على استخدام fgets() لقراءة السلاسل النصية التي تحتوي على مسافات، واستخدام strcspn() لإزالة محارف السطر الجديد الموجودة في النهاية، واستخدام معامل السهم للوصول إلى أعضاء البنية من خلال مؤشر، واستخدام strchr() للبحث عن المحارف، واستخدام المنطق الشرطي لتصنيف البيانات. ويُعد استخدام const في تعريف المعامل ممارسة جيدة تمنع التعديل غير المقصود لبيانات جهة الاتصال داخل دالة العرض.
جرّب بنفسك
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[50];
char phone[20];
char email[40];
int age;
} Contact;
Contact* createContact() {
Contact* contact = (Contact*)malloc(sizeof(Contact));
if (contact == NULL) {
return NULL;
}
strcpy(contact->name, "");
strcpy(contact->phone, "");
strcpy(contact->email, "");
contact->age = 0;
return contact;
}
void populateContact(Contact* contactPtr) {
printf("Enter name: ");
scanf("%s", contactPtr->name);
printf("Enter phone: ");
scanf("%s", contactPtr->phone);
printf("Enter email: ");
scanf("%s", contactPtr->email);
printf("Enter age: ");
scanf("%d", &contactPtr->age);
if (contactPtr->age < 0 || contactPtr->age > 120) {
printf("Invalid age entered\n");
} else if (strlen(contactPtr->phone) < 10) {
printf("Invalid phone number\n");
} else {
printf("Contact populated successfully\n");
}
}
int main() {
Contact* contact = createContact();
if (contact == NULL) {
return 1;
}
populateContact(contact);
printf("Contact Information:\n");
printf("Name: %s\n", contact->name);
printf("Phone: %s\n", contact->phone);
printf("Email: %s\n", contact->email);
printf("Age: %d\n", contact->age);
free(contact);
printf("Contact deleted 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 عبر الإنترنت