تحسين كود C++: إدارة الهياكل وتسهيل إدارة الإدخال
في هذا السياق، يظهر أنك تواجه مشكلة في الكود البرمجي حيث يتم عرض خطأ “expected primary-expression before ‘.’ token”. هذا الخطأ يشير عادةً إلى أن هناك شيئًا غير صحيح في استخدام النقطة (.) في الكود.
لحل هذا الخطأ، يجب أن نلقي نظرة عن كثب على الكود. في السطور:
cppcin>>Employee.Id; cin>>Employee.Name; cin>>Employee.Gender; cin>>Employee.Des; cin>>Employee.Date.day>>Employee.Date.month>>Employee.Date.year;
يبدو أنك تحاول قراءة الإدخال لهيكل Employee
، ولكن هنا تكون المشكلة. عند استخدام الدالة Setter
، يجب تمرير الهيكل بالإشارة (&
) لتحديث القيم داخله. لذلك، يجب تغيير تعريف الدالة Setter
كما يلي:
cppvoid Setter(Employee &E) //function for setting value in Employees
{
cout<<"Enter Id:";
cin>>E.Id;
cout<<"Enter Name:";
cin>>E.Name;
cout<<"Enter Gender:";
cin>>E.Gender;
cout<<"Enter Designation:";
cin>>E.Des;
cout<<"Enter Date of joining(DD/MM/YYYY):";
cin>>E.Date.day>>E.Date.month>>E.Date.year;
}
تحديث تعريف الدالة بإضافة الرمز &
يسمح بتمرير الهيكل بالمرجع، مما يعني أن التغييرات التي تحدث داخل الدالة ستؤثر على الهيكل الأصلي في الدالة main
.
أما بالنسبة للجزء الثاني من استفسارك حول كيفية قراءة سلسلة نصية باستخدام cin.getline
و gets()
، يفضل تجنب استخدام gets()
بسبب مشاكل أمان، ولكن بدلاً من ذلك يمكنك استخدام cin.getline
كالتالي:
cppcout << "Enter Name:";
cin.ignore(); // to clear the input buffer
cin.getline(E.Name, 40);
يتم استخدام cin.ignore()
لتجاوز أي حروف جديدة في الطابور قبل استخدام cin.getline
لتجنب مشاكل في الإدخال.
باختصار، يجب عليك تحديث الدالة Setter
بإضافة &
وتعديل قراءة السلسلة باستخدام cin.getline
لتحقيق الأداء المرجو.
المزيد من المعلومات
بالطبع، دعونا نوسع قليلاً على المواضيع ذات الصلة. فيما يخص الكود البرمجي الذي قدمته، يظهر أن لديك هياكل بيانات تمثل التواريخ والموظفين. إليك بعض التوجيهات الإضافية:
-
تحسين استخدام الهياكل:
يمكنك تحسين هياكل البيانات الخاصة بك باستخدامtypedef
لتسهيل الاستخدام. على سبيل المثال:cpptypedef struct { int day; int month; int year; } Date; typedef struct { int Id; char Name[40]; Date JoiningDate; char Gender; char Designation[40]; } Employee;
هذا يجعل تعريف الهياكل أكثر وضوحًا ويجعل من السهل استخدام الهياكل داخل الكود.
-
تحسين إدارة الإدخال:
يمكنك استخدام دوال أخرى لإدارة الإدخال بشكل أفضل. على سبيل المثال، يمكنك استخدام دالةgetline
لقراءة السلسلة النصية بأكملها بدلاً منcin.ignore()
وcin.getline()
:cppcout << "Enter Name:"; cin.ignore(numeric_limits
::max(), '\n'); // تجاوز البيانات الزائدة getline(cin, E.Name); يحدث ذلك لضمان قراءة السلسلة بشكل صحيح حتى لو كانت تحتوي على فراغات.
-
تحسين إدارة التاريخ:
يمكنك تجنب إدخال التاريخ يدويًا واستخدام دالةstd::cin
بشكل أفضل باستخدامgetline
ثم استخدامstringstream
لتحويل السلسلة إلى أرقام:cppcout << "Enter Joining Date (DD/MM/YYYY):"; string dateStr; getline(cin, dateStr); stringstream ss(dateStr); ss >> E.JoiningDate.day >> E.JoiningDate.month >> E.JoiningDate.year;
هذا يجعل التعامل مع التاريخ أكثر دقة ومرونة.
باختصار، يمكن تحسين الكود لجعله أكثر قوة وسهولة في الفهم والصيانة، والتحكم في الإدخال بشكل أفضل.