الهياكل المتداخلة في C++

الهياكل المتداخلة

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

ويتضمن البرنامج توصيفا للهيكل السابق , distance , عناصره المتغيران الأوليان inch , feet ثم توصيفا لهيكل جديد ؛ room , عناصره أبعاد الحجرة length , width وكلاهما متغير هيكلي منتم للهيكل الأول . وأخيرا يعرف متغير هيكلي منتم للهيكل room , وهو dining , ليعبر عن غرفة معينة , هي غرفة الطعام .

Englarea.cpp

englarea.cpp


 


// englarea.cpp


// demonstrates nested structures


#include <iostream.h>


 


struct Distance              // English distance


   {


   int feet;


   float inches;


   };


 


struct Room                  // rectangular area


   {


   Distance length;          // length of rectangle


   Distance width;           // width of rectangle


   };


 


void main()


   {


   Room dining;                  // define a room


 


   dining.length.feet = 13;      // assign values to room


   dining.length.inches = 6.5;


   dining.width.feet = 10;


   dining.width.inches = 0.0;


 


                 // convert length & width


   float l = dining.length.feet + dining.length.inches/12;


   float w = dining.width.feet  + dining.width.inches/12;


                 // find area and display it


   cout << "\nDining room area is " << l * w


        << " square feet" ; 


   }




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



Room dining;



كمتغير هيكلي ينتمي للهيكل room والذي تم توصيفه بكونه يضم متغيران length width هما بدورهما متغيران هيكليان ينتميان لهيكل distance , بمعني أن كلا منهما يتمن قياسا بالقدم يمثله المتغير feet وقياسا بالبوصة يمثله المتغير inchs , وهما المتغيران الأوليان للبرنامج .



أما طريقة التعامل مع المتغير الهيكلي dining , فكما تلاحظ احتجنا لمؤثر النقطة مرتين (لعلك توقعت ذلك ) , في كل مرة نشير فيها لأحد عناصره , فعنصر الطول بالأقدام للغرفة المبينة مبين بالعبارة :



Dining.length.feet = 13;



ومعناه أن عدد الأقدام في طول الغرفة هو 13 قدم , وكذلك لبقية الأبعاد . ويبين الشكل تخزين المتغير الهيكلي dining في الذاكرة كما يبين أبعاد الغرفة التي يمثلها هذا المتغير .



Object-Oriented Programming in C   _Page_0169_Image_0001





Object-Oriented Programming in C   _Page_0170_Image_0001



شكل أبعاد الغرفة بالأقدام والبوصات



ولإجراء حساب المساحة للغرفة حولت الأبعاد إلي أقدام , وعرف المتغير l ليخزن فيه الطول بالأقدام , والمتغير w ليخزن فيها العرض بالأقدام , وكلاهما من نوع العدد الكسري , ثم حسبت المساحة بضرب المتغيرين ببعضهما .



ومن وجهة النظر الصرفة لا يوجد حد لعمق التداخل في توصيف الهياكل , فيمكن مثلا توصيف هيكل يعبر عن شقة بالمسكن , ثم غرفة بهذا المسكن , ثم قطعة من الأثاث بهذه الغرفة , عناصرها الأولية طول وعرض . وفي مثال كهذا قد تصادف تحديدا لعدد الأقدام لعرض ألة الغسيل في غرفة الغسيل في الشقة رقم l بالصورة التالية :



Apartment1.laundry.washng_machin.width.feet



ويدل عدد مؤثرات النقطة علي عمق التداخل .



تحويل نوع المتغيرات



تلاحظ في المثال السابق أننا حولنا بعدين : length, width من نوع متغير هيكلي distance إلي بعدين هما l,w من نوع العدد الكسري float , وهو متغير أولي , تمهيدا لحساب المساحة , وتخزينها في متغير واحد هو area , بعد أن كانت مخزنة في أربعة متغيرات في الهيكل room . وتعتبر إمكانية تغيير نوع المتغيرات من الوسائل الهامة في استعمال أنواع المتغيرات التي يضعها المبرمج .



استهلاك الهياكل المتداخلة



كان تخصيص قيم لعناصر المتغير dining علي أربعة أسطر هي :



Dining.length.feet = 13;



Dining.length..inchs = 6.5;



Dining.width.feet = 10;



Dining.length.feet = 0.0;



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



Room dining = { {13, 6.5}, {10, 0.0 } };



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



مثال : لعبة الثلاث ورقات



سوف نقدم لك لعبة الثلاث ورقات الشهيرة كتطبيق علي استخدام الهياكل , حيث ننشئ هيكلا يعبر عن ورقة اللعب , والتي تتميز بصفتين , الرقم number والرسم suit .



فيكون الهيكل المعبر عنها موصف كالأتي :



Struct card



{



Int number;



Int suit;



}



وإليك البرنامج :



Cards.cpp




cards.cpp


// cards.cpp


// demonstrates structures using playing cards


// UCS Laboratories


#include <iostream.h>


 


const int clubs = 0;


const int diamonds = 1;


const int hearts = 2;


const int spades = 3;


 


const int jack = 11;


const int queen = 12;


const int king = 13;


const int ace = 14;


 


struct card


   {


   int number;   // 2 to 10, jack, queen, king, ace


   int suit;     // clubs, diamonds, hearts, spades


   };


 


void main()


   {


   card temp, chosen, prize;                  // define cards


   int position;


 


   card card1 = { 7, clubs };                 // initialize card1


   cout << "Card 1 is the 7 of clubs\n";


 


   card card2 = { jack, hearts };             // initialize card2


   cout << "Card 2 is the jack of hearts\n";  


 


   card card3 = { ace, spades };              // initialize card3


   cout << "Card 3 is the ace of spades\n";   


 


   prize = card3;               // copy this card, to remember it


 


   cout << "I'm swapping card 1 and card 3\n";


   temp = card3; card3 = card1; card1 = temp;


 


   cout << "I'm swapping card 2 and card 3\n";


   temp = card3; card3 = card2; card2 = temp;


 


   cout << "I'm swapping card 1 and card 2\n";


   temp = card2; card2 = card1; card1 = temp;


 


   cout << "Now, where (1, 2, or 3) is the ace of spades? ";


   cin >> position;


 


   switch (position)


      {


      case 1: chosen = card1; break;


      case 2: chosen = card2; break;


      case 3: chosen = card3; break;


      }


   if(chosen.number == prize.number &&          // compare cards


            chosen.suit == prize.suit)


      cout << "That's right!  You win!\n";


   else


      cout << "Sorry. You lose.\n";


   }




وقد يكون تشغيل البرنامج علي الوجه التالي :



Card 1 is the 7 of clubs



Card 2 is the jack of hearts



Card 3 is the ace of spades



Swapping card 1 and card 3



2 and card 3



1 and card 2



Now, where (1, 2, or 3) is the ace of spades? 3



Sorry, You lose.



لقد اختار اللاعب رقم 3 , وهو اختيار خاطئ فالأختيار الصحيح هو 2 .



ويبدأ البرنامج بتعريف عدد امن الأعداد الصحيحة تعبر عن الأربعة رسومات للأوراق :- 0: الأسباني :1 clubs الديناري :2 diamonds القلب :3 hearts البستوني spades . كما عرفت أربعة أعداد صحيحة أخري لقيم الأوراق : 11 الولد , و12 الملكة , و 13 الملك , و14 الأس . وليست كل هذه المتغيرات مستخدمة في البرنامج , ولكنها وضعت لإكمال المجموعة .



بعد ذلك عرف الهيكل المعبر عن ورقة اللعب مكونا من عنصرين : الرقم والرسم , ثم عرف من هذا النوع ستة متغيرات هيكلية ؛ ثلاثة منها غير مستهلة , تملأ قيمها أثناء اللعب , هي temp, chosen, prize وثلاثة مستهلة , تعبر عن ثلاثة أوراق , الأولي 7 من رسم الاستباتي , والثانية ولد قلب , الثالثة أس بستوني . وتخرج هذه القيم للاعب ليتعرف عليها .



تخرج قيمة الورقة التي يفترض أن يتعرف عليها اللاعب في المتغير prize , وهي الورقة الثالثة (الأس البستوني ) , وتبدل الأوراق الثلاثة , مع إخبار اللاعب بما يجري من تبديل . (يمكنك إضافة عند أكبر من مرات التبديل لمزيد من الإثارة ) . وأخيرا يسأل البرنامج اللعب إن كان قد تعرف علي الوضع الأخير للورقة الثالثة . تختزن الإجابة في المتغير chosen وتقارن بالمتغير prize , وتظهر رسالة بنتيجة الاختيار .



وتلاحظ أننا لإجراء المقارنة استعنا بثلاثة أرقام يدخل اللاعب أحدهما , يعبر كل رقم عن موضع , فللأسف لا يمكننا مقارنة هيكلين كما نفعل مع المتغيرات الأولية , علي الوجه التالي :



If chosen == prize



فكما قلنا في موضوع الجمع , لا يعرف المؤثر == شيئا عن المتغيرات الهيكلية , إذ لا توجد من بين روتينياته عملية لإجراء مثل هذه المقارنة . وسوف تعالج المسألة حينما نتعرض لموضوع زيادة تحميل المؤثرات .

تعليقات

المشاركات الشائعة من هذه المدونة

المؤثرات الحسابية في C++

الرسم Graphics

دوال النمط الرسومي في ++C