التعامل مع عناصر المتغير الهيكلي في C++

التعامل مع عناصر المتغير الهيكلي

ما أن يعرف المتغير الهيكلي , حتي تكون الإشارة لعناصره باستخدام ما يسمي مؤثر النقطة dot operator . وقد تم تخصيص قيمة أول عنصر كالتالي :

Part1.modelnimber = 6244;

بمعني أن الإشارة لعنصر المتغير الهيكلي يتضمن ثلاثة أجزاء : اسم المتغير ؛ part1 , ثم نقطة , ثم أسم العنصر نفسه . وتعني النقطة هنا أن البيان modelnumber هو عنصر من عناصر المتغير الهيكلي part1 .

ونذكرك بـأن الجزء الأول من التعريف هو اسم المتغير الهيكلي , وليس اسم الهيكل , فنرجو الانتباه لعدم الخلط . ويستعمل اسم المتغير للتمييز بين المتغيرات المنتمية لهذه الفئة من الهياكل , وهي مثلا المتغيرات : part1, part2, part3 . والشكل يبين وضع مثل هذه المتغيرات في الذاكرة .

Object-Oriented Programming in C   _Page_0163_Image_0001

شكل مؤشر النقطة

وتعامل المتغيرات الهيكلية كغيرها من المتغيرات سواء بسواء , كما هو ملاحظ في أوامر التخصيص أو أوامر الإظهار .

خواص أخري للهياكل

الهياكل مرنة الاستخدام بصورة مدهشة ؛ لننظر إلي خاصية أخري من خصائصها :

الجمع بين التوصيف والتعريف :

في البرنامج السابق كان توصيف الهيكل والتعريف بالمتغير الهيكلي في أمرين منفصلين , ولكنا في البرنامج التالي سوف ندمج العمليتين في أمر واحد :

partscom.cpp


 


// partcom.cpp


// uses parts inventory to demonstrate structures


#include <iostream.h>


 


struct                // no tag needed


   {


   int modelnumber;   // ID number of widget


   int partnumber;    // ID number of widget part


   float cost;        // cost of part


   } part1;           // definition goes here


 


void main()


   {


   part1.modelnumber = 6244;  // give values to structure members


   part1.partnumber = 373;


   part1.cost = 217.55;


                  // display structure members


   cout << "\nModel "  << part1.modelnumber;


   cout << ", part "   << part1.partnumber;


   cout << ", costs $" << part1.cost;



   }




وتلاحظ هنا أنه بدلا من أن يكون التعريف بالمتغير الهيكلي في أمر مستقل علي الصورة :





Part part1;





فإننا وضعنا اسم المتغير بعد القوس الحلزوني المحدد لنهاية عملية التوصيف , وقبل الفاصلة المنقوطة به :



Struct



{



Int modelnumber;



Int partnumber;



Float cost;



} part1;



كما تلاحظ أننا لم نحتج إلي وضع اسم معين للهيكل , إذا لم نكن محتاجين لتعريف عدد أخر من المتغيرات المنتمية إليه .



وهذا الدمج بين التوصيف والتعريف بالمتغيرات نوع من الاختزال في صياغة برامج السي , ولكنه قد يكون أقل وضوحا ومرونة عن حالة الفصل بين العمليتين .



استهلاك عناصر المتغيرات الهيكلية



يبين المثال التالي أن عناصر المتغيرات الهيكلية يمكن أن تأخذه قيما استهلاكية عند التعريف بها , وهو يتمن أيضا تعريف أكثر من متغير ينتمي للهيكل :



Partinit.cpp




partinit.cpp


 


// partinit.cpp


// shows initialization of structure variables


#include <iostream.h>


 


struct part           // specify a structure


   {


   int modelnumber;   // ID number of widget


   int partnumber;    // ID number of widget part


   float cost;        // cost of part


   };


 


void main()


   {


   part part1 = { 6244, 373, 217.55 };  // initialize variable


   part part2;                          // define variable


                  // display first variable


   cout << "\nModel "  << part1.modelnumber;


   cout << ", part "   << part1.partnumber;


   cout << ", costs $" << part1.cost;


 


   part2 = part1;             // assign first variable to second


                  // display second variable


   cout << "\nModel "  << part2.modelnumber;


   cout << ", part "   << part2.partnumber;


   cout << ", costs $" << part2.cost;


   }




ويعرف هذا البرنامج متغيرين هيكليين ينتميان للهيكل part , ألا وهما part1,part2 , كما يستهل الأول منهما .



وتلاحظ أن استهلاك عناصر المتغيرات الهيكلية كان علي الصورة :



Part part1 = { 6244, 373, 217.55};



فالاستهلاك يتم بإحاطة القيم بقوسين حلزونين , ويفصل بينهما بفاصلة , ويفهم البرنامج أن القيمة الأولي تخصص للعنصر الأول , والثانية للثاني وهكذا .



كما يبين البرنامج إمكانية تخصيص قيم متغير لمتغير أخر , طالما أنهما ينتميان لنفس الهيكل , فتتشابه قيم العناصر المتقابل فيها , كما خصصت قيم المتغير الأول للثاني في البرنامج بالأمر :



Part2 = part1;



ولذا فليس مستغربا أن يكون الخرج مكررا للمتغيرين .



مثال عن المقاييس الإنجليزية



تحسب المقاييس الإنجليزية كما هو معروف بالقدم والبوصة , والبوصة يمكن أن تكون كسرا , ولكن لا تزيد عن 12 , وإلا تحول إلي أقدام . ويبين الشكل مثالا لاستخدام المقاييس الإنجليزية . وسوف نضع في المثال التالي برنامجا يستخدم هيكلا للتعبير عن المقاييس الإنجليزية , ويجمع قيمها :



Englstrc.cpp






englstrc.cpp


 


// englstrc.cpp


// demonstrates structures using English measurements


// UCS Laboratories


#include <iostream.h>


 


struct Distance              // English distance


   {


   int feet;


   float inches;


   };


 


void main()


   {


   Distance ucs1, ucs3;            // define two lengths


   Distance ucs2 = { 11, 6.25 }; // define & initialize one length


 


                   // get length ucs1 from user


   cout << "\nEnter feet: ";  cin >> ucs1.feet;


   cout << "Enter inches: ";  cin >> ucs1.inches;


 


                   // add lengths ucs1 and ucs2 to get ucs3


   ucs3.inches = ucs1.inches + ucs2.inches;  // add the inches


   ucs3.feet = 0;                        // (for possible carry)


   if(ucs3.inches >= 12.0)               // if total exceeds 12.0,


      {                                // then decrease inches


      ucs3.inches -= 12.0;               // by 12.0 and


      ucs3.feet++;                       // increase feet


      }                                // by 1


   ucs3.feet += ucs1.feet + ucs2.feet;       // add the feet


 


                   // display all lengths


   cout << ucs1.feet << "\'-" << ucs1.inches << "\" + ";


   cout << ucs2.feet << "\'-" << ucs2.inches << "\" = ";


   cout << ucs3.feet << "\'-" << ucs3.inches << "\"\n";


   }


وفي هذا المثال , كان للهيكل


Distance عنصران , واحد للتعبير عن الأقدام , وهو feet , وهو من نوع العدد الصحيح , والأخر عن البوصات ؛ inches من النوع الكسري ثم عرفنا ثلاثة متغيرات d1, d2, d3 , للتعبير عن ثلاثة مسافات , الوسطي منهما مستهلة بالقيم المبينة , والأولي يدخل المستخدم قيمها , أما الثالثة فهي حاصل جمع المسافتين الأوليتين . ويكون خرج البرنامج علي الصورة التالية :



Enter feet: 10



Enter inches: 6.75



10' – 6.75'' + 11' – 6.25'' = 22' – 6.1''



وتلاحظ أننا لم نجمع المتغيرين مباشرة كالتالي :



D3 = d1 + d2;



حيث إن مؤثر الجمع لا يعمل إلا مع أنواع المتغيرات المعرفة في اللغة , وليس الموضوعة بمعرفة المترجم , كما هو الحال مع المتغير distance . ( سوف نري فيما بعد أنه من فوائد استخدام الفئات classes إمكانية إجراء العمليات عليها )



Object-Oriented Programming in C   _Page_0166_Image_0001



التسميات: