الهياكل المتداخلة في 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 في الذاكرة كما يبين أبعاد الغرفة التي يمثلها هذا المتغير .
شكل أبعاد الغرفة بالأقدام والبوصات
ولإجراء حساب المساحة للغرفة حولت الأبعاد إلي أقدام , وعرف المتغير 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
فكما قلنا في موضوع الجمع , لا يعرف المؤثر == شيئا عن المتغيرات الهيكلية , إذ لا توجد من بين روتينياته عملية لإجراء مثل هذه المقارنة . وسوف تعالج المسألة حينما نتعرض لموضوع زيادة تحميل المؤثرات .
تعليقات
إرسال تعليق