في الكود الذي قدمته، تحاول تنفيذ برنامج لإنشاء دليل هاتف باستخدام لغة البرمجة C++. ومع ذلك، يبدو أن هناك بعض المشاكل في الشيفرة البرمجية تؤدي إلى توقف البرنامج عند إدخال عنوان “Address”. دعونا نقوم بتحليل الكود وتحديد الأخطاء:
-
التحجيم الخاطئ للذاكرة:
في بداية البرنامج، قمت بتخصيص ذاكرة باستخدامmalloc
لـPhonebook
، ولكن هناك تحجيم إضافي باستخدامrealloc
داخل الحلقة. هذا قد يؤدي إلى تكرار التخصيص مما يمكن أن يسبب مشكلات في الذاكرة. -
استخدام
gets
:
تستخدم دالةgets
للحصول على الاسم والعنوان. ومع ذلك، يفضل عدم استخدامgets
لأنها تفتقر إلى التحقق من الحدود، مما يمكن أن يؤدي إلى تجاوز حجم السلسلة وتلف الذاكرة. -
المشكلة في تقسيم المعلومات:
بعد كل إدخال، تزيد قيمةNumber
بمقدار واحد. هذا يجعل البرنامج يتوقف عند إدخال “Address” لأنه في الحلقة يجب أن تكون القراءة فيInformation[Number].Name
، ثمInformation[Number].Address
، وليسInformation[Number].Address
مباشرة.
اليك كود معدل لحل هذه المشاكل:
cpp#include
#include
typedef struct
{
char Name[50];
char Address[50];
long Phone_number;
} Phonebook;
int main()
{
int Counter;
long Number_of_residents;
printf("Enter the number of residents: ");
scanf("%ld", &Number_of_residents);
Phonebook *Information = (Phonebook *)malloc(Number_of_residents * sizeof(Phonebook));
for (Counter = 0; Counter < Number_of_residents; Counter++)
{
printf("Enter Name: ");
scanf("%s", Information[Counter].Name);
printf("Enter Address: ");
scanf("%s", Information[Counter].Address);
printf("Enter Phone Number: ");
scanf("%ld", &Information[Counter].Phone_number);
}
free(Information);
return 0;
}
قمت بتحسين التحجيم واستخدمت scanf
للحصول على الاسم والعنوان، وأيضًا قمت بتصحيح تقسيم المعلومات. يجب على هذا الكود أن يكون أكثر قدرة على التعامل مع إدخال العنوان دون توقف.
المزيد من المعلومات
في محاولتك لإنشاء دليل هاتف باستخدام لغة البرمجة C++، قد قمت بتعريف هيكل بيانات باسم Phonebook
يحتوي على حقول لاسم الشخص (Name
)، وعنوانه (Address
)، ورقم هاتفه (Phone_number
). كما استخدمت دالة malloc
لتخصيص ذاكرة ديناميكية للهيكل، واستخدمت realloc
داخل حلقة لتعديل حجم الذاكرة المخصصة.
ومع ذلك، كما تم التطرق إليه في الإجابة السابقة، واجهت بعض المشاكل في الكود، مثل استخدام gets
الذي يمكن أن يتسبب في مشاكل تجاوز الحدود، وتحجيم غير صحيح للذاكرة.
تم تصحيح الأخطاء في الكود المعدل وتحسينه بمراعاة الحدود أثناء الإدخال وضمان تحجيم الذاكرة بشكل صحيح.
هذا الكود المعدل يتيح للمستخدم إدخال عدد من السكان، ثم يقوم بقراءة الاسم والعنوان ورقم الهاتف لكل فرد ويخزنها في مصفوفة من هياكل Phonebook
. يتم تحرير الذاكرة المخصصة في النهاية باستخدام free
.
يمكنك أيضًا تحسين البرنامج بإضافة ميزات إضافية مثل البحث في دليل الهاتف أو طباعة المعلومات المخزنة بشكل منظم.