سي بلص بلص: الدرس الخامس عشر

من كتب

«الدرس السابق العودة للصفحة الرئيسية الدرس التالي»

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;
}

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

«الدرس السابق العودة للصفحة الرئيسية الدرس التالي»