برمجة سي ++/الدرس الخامس عشر

« برمجة:سي ++
الدرس الخامس عشر
»
الدرس الرابع عشر الدرس السادس عشر

Structure أو البناء أو البنية هو مفهوم مفيد جدا في البرمجة، وهو يعتبر أحد الأسس التي أدت إلى ولادة البرمجة الكائنية التوجه. ويستخدم لجمع مجموعة من المتغيرات المختلفة المتعلقة بشيء ما معا، فعلى سبيل المثال، لو كان برنامجنا يسعى لبناء وتخزين ملفات طلبة المدارس، فما هي مجموعة المتغيرات التي نتحدث عنها، وما هو الشيء الذي نتحدث عنه.

إن الشيء الذي نتحدث عنه في مثل هذه الحالة هو الطالب، بالطبع ليس هناك في المدارس طالب واحد، ولكن وحدة البناء ستكون الطالب ، وعندها يمكننا تكرار هذه الوحدة بأي عدد نشاء من المرات. أما المتغيرات فهي قد تكون اسم الطالب مثلا! تاريخ ميلاده! علاماته...إلخ.

لو أردنا أن نجعل البرنامج يتعامل مع طالب مثلا دون استخدام وحدة البناء Struct ، وأردنا أن نتحدث عن سنة ميلاده ومجموع علاماته واسمه الأول فقط!! قد يكون شكل الإعلان عن هؤلاء الطلبية ربما كالآتي :

  • ملاحظة:إرساء قيم الاسم مكتوبة بشكل مبسط لأغراض التوضيح ، وهذه ليست الطريقة الصحيحة لعملها.
char firstName[15];
int birthYear;
int grades;
.
.
.
firstName="Ahmad";
birthYear="1995";
grades=84;

ماذا لو كان هناك 30 طالبا؟ طبعا، يمكن استخدام المصفوفات مثلا ، بالشكل الآتي:

char firstName[30][15];
int birthYear[30];
int grades[30];
.
.
.
for (int i =0; i <30 ; i++)
{
firstName[i]=FN;
birthYear[i]=Y;
grades[i]=G;
}

وبكلمات أخرى ، فإن ما يتم هو البحث عن الاسم Hanna في مصفوفة الأسماء، فنجد مثلا أن موقعه هو الموقع رقم 5 مثلا في مصفوفة الأسماء، ولمعرفة سنة ميلاده، فإننا سنبحث عن القيمة الموجودة في الموقع الخامس من مصفوفة أعوام الميلاد! وهكذا...

ألن يكون من الأفضل أن نرسي قيمة لاسم الطالب ، وبعدها وبسهولة نرسي قيمة لتاريخ ميلاده وأخرى لعلاماته، كل ذلك بمعاملة بناء من نوع طالب بمعلومات فرعيه عنه، بدلا من العديد من المصفوفات التي عليك تتبعها بشكل منفصل؟ ... إلخ. إذا شعرت أن هذا الحل هو الأنسب ، فما عليك إلا استخدام بناء أو Struct للطالب. وإليك مثال ذلك:

struct student
{
char firstName[15];
int birthYear;
int grades;
} student1;
.
.
.
student1.firstname="Ahmad";
student1.birthyear=1995;
student1.grades=85;

أما عند التعامل مع عدد كبير من الطلبة ، فإن الأمور ستكون أبسط، فبدلا من بناء مصفوفة بعدد الطلاب لأسماءهم ، وأخرى لسنوات ميلادهم وأخرى لعلاماتهم، فإن إنشاء مصفوفة واحدة من نوع طلاب سيكون أسهل، أبسط، وأوضح! إليك المثال الآتي:

typedef struct
{
char firstName[15];
int birthYear;
int grades;
} student;
.
.
.
student studentList[30];
.
.
.
for (int i =0; i <30 ; i++)
{
studentList[i].firstName=FN;
studentList[i].birthYear=Y;
studentList[i].grades=G;
}

بالأضافة إلى سهلولتها في البرمجة فانها أيضاً أكثر كفاءة من حيث سرعة تنفيذ البرنامج حيث انك عادة ما نطلب اسم الطالي مع ميلاده, وليس اسمين لطالبين وتاريخي ميلاد متتابعين. فعند استخدام المصفوفات المنفصلة سيكون هناك عبيء كبير في الوصول إلى الأماكن المختلفة من الذاكرة، وهذه فائدة آخر للبنيات.