التعامل مع عناصر المتغير الهيكلي في C++
التعامل مع عناصر المتغير الهيكلي
ما أن يعرف المتغير الهيكلي , حتي تكون الإشارة لعناصره باستخدام ما يسمي مؤثر النقطة dot operator . وقد تم تخصيص قيمة أول عنصر كالتالي :
Part1.modelnimber = 6244;
بمعني أن الإشارة لعنصر المتغير الهيكلي يتضمن ثلاثة أجزاء : اسم المتغير ؛ part1 , ثم نقطة , ثم أسم العنصر نفسه . وتعني النقطة هنا أن البيان modelnumber هو عنصر من عناصر المتغير الهيكلي part1 .
ونذكرك بـأن الجزء الأول من التعريف هو اسم المتغير الهيكلي , وليس اسم الهيكل , فنرجو الانتباه لعدم الخلط . ويستعمل اسم المتغير للتمييز بين المتغيرات المنتمية لهذه الفئة من الهياكل , وهي مثلا المتغيرات : part1, part2, part3 . والشكل يبين وضع مثل هذه المتغيرات في الذاكرة .
شكل مؤشر النقطة
وتعامل المتغيرات الهيكلية كغيرها من المتغيرات سواء بسواء , كما هو ملاحظ في أوامر التخصيص أو أوامر الإظهار .
خواص أخري للهياكل
الهياكل مرنة الاستخدام بصورة مدهشة ؛ لننظر إلي خاصية أخري من خصائصها :
الجمع بين التوصيف والتعريف :
في البرنامج السابق كان توصيف الهيكل والتعريف بالمتغير الهيكلي في أمرين منفصلين , ولكنا في البرنامج التالي سوف ندمج العمليتين في أمر واحد :
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 إمكانية إجراء العمليات عليها )
تعليقات
إرسال تعليق