هياكل البيانات Structure
توفر الهياكل في C++ طريقة قوية لتنظيم البيانات ذات الصلة وتخزينها تحت اسم واحد. إنها مفهوم أساسي في البرمجة كائنية التوجه (OOP) التي تسمح لك بإنشاء أنواع بيانات مخصصة لتناسب احتياجات برنامجك. في هذا الشرح، سنتعمق في أساسيات الهياكل في لغة C++.
ما هي هياكل البيانات؟
الـStructure عبارة عن نوع بيانات محدد من قبل المستخدم في لغة C++، وهو يمكّنك من تجميع أنواع بيانات مختلفة معًا تحت اسم واحد. وهذا يجعل من السهل إدارة وتنظيم المعلومات ذات الصلة. على عكس أنواع البيانات البدائية، يمكن للهياكل أن تحتوي على مجموعة من المتغيرات بأنواع بيانات مختلفة.
تعريف هياكل البيانات structure:
لإنشاء structure، يمكنك استخدام الكلمة المفتاحية structure، متبوعة باسم البنية والمتغيرات داخل الأقواس المتعرجة. إليك مثال بسيط:
// Define a structure named 'Person' struct Person { char name[50]; int age; float height; };
في هذا المثال، قمنا بإنشاء structure تسمى "Person" مع ثلاثة أعضاء: مصفوفة أحرف للاسم، وعدد صحيح للعمر، ,وعدد عشري للارتفاع.
الوصول إلى أعضاء الـstructure:
نستطيع الوصول إلى أعضاء الـstructure بإستخدام معامل النقطة (.).
مثال 1:
#include <iostream> using namespace std; struct car { string name; string color; int maxspeed; int model; }; int main() { car g; g.name = "Kia"; g.color = "red"; cout << g.name << endl; //Kia cout << g.color << endl; //red return 0; }
يعرف هذا الكود برنامجًا بسيطًا يستخدم structure يسمى car. يحتوي هيكل البيانات car على أربعة أعضاء: الاسم (نص)، واللون (نص)، والسرعة القصوى (عدد صحيح)، والطراز (عدد صحيح). يقوم البرنامج بعد ذلك بالإعلان عن متغير g من النوع car ويقوم بتعيين قيم لاسمه وأعضاء اللون. وأخيرًا، يقوم بطباعة قيم الاسم واللون على شاشة المخرجات.
إنشاء متغيرات للـstructure:
يمكنك إنشاء متغيرات لـstructure في وقت الإعلان، على غرار كيفية إنشاء المتغيرات الأولية:
// Initialize structure variables Person person3 = {"Alice", 30, 5.5};
مثال 2:
#include <iostream> using namespace std; struct car { string name; string color; int maxspeed; int model; }g, k; int main() { k = {"aa", "black", 300, 97}; g = {"kia", "red", 250, 96}; cout << g.maxspeed << endl; return 0; }
يعؤف هذا الكود هيكلًا يسمى car مكونة من أربعة أعضاء (الاسم واللون والسرعة القصوى والطراز). بالإضافة إلى ذلك، فإنه يعلن عن متغيرين، g وk، من النوع car. في الدالة الرئيسية، يقوم بتعيين قيم لمتغيرات الهيكل هذا باستخدام بناء جملة التهيئة ثم يطبع قيمة عضو maxspeed للمتغير g. وهنا شرح مفصل:
– تعريف الـstructure وإعلان المتغير:
struct car { string name; string color; int maxspeed; int model; } g, k; // Declaration of structure variables g and k of type car
يحدد structure مسمى car ويعلن عن متغيرين للهيكل g وk من النوع car.
- الدالة الرئيسة:
int main() { // Initialization of structure variable k k = {"aa", "black", 300, 97}; // Initialization of structure variable g g = {"kia", "red", 250, 96}; // Print the value of the maxspeed member of the g structure variable cout << g.maxspeed << endl; return 0; }
مسار التنفيذ:
- إنشاء المتغيرات:
k = {“aa”, “black”, 300, 97}؛ إنشاء أعضاء متغير الهيكل k بهذه القيم.
g = {“kia”, “red”, 250, 96}؛ إنشاء أعضاء متغير الهيكل k بهذه القيم. - طباعة إلى شاشة المخرجات:
cout << g.maxspeed << endl; يطبع قيمة عضو maxspeed للمتغير g إلى شاشة المخرجات، متبوعًا بسطر جديد. - جملة الإرجاع:
return 0؛ يشير إلى أن البرنامج قد تم تنفيذه بنجاح.
مخرجات هذا البرنامج ستكون كالتالي:
250
الدوال وهياكل البيانات Structures:
يمكن تمرير الهياكل كـarguments للدوال، مما يسمح لك بإنشاء تعليمات برمجية أكثر تنظيمًا.
مثال 3:
#include <iostream> #include <string> using namespace std; struct Distance { int feet; float inches; }; Distance add_distance(Distance d1, Distance d2) { Distance result; result.feet = d1.feet + d2.feet; result.inches = d1.inches + d2.inches; return result; } int main() { Distance x, y, z; cout << "Enter feet value \n"; cin >> x.feet >> y.feet; cout << "Enter inches value \n"; cin >> x.inches >> y.inches; z = add_distance(x, y); cout << "z.feet = " << z.feet << " z.inches = " << z.inches << endl; return 0; }
يوضح هذا الكود استخدام الهياكل لتمثيل المسافات بالأقدام والبوصات. يحدد مسافة الهيكل بعضوين: feet (عدد صحيح) وinches (عدد عشري). يتضمن البرنامج بعد ذلك دالة add_distance لإضافة هيكلين للمسافة، وتأخذ الدالة الرئيسية مدخلات المستخدم لمسافتين، وتضيفهما باستخدام دالة add_distance، وتطبع النتيجة. فيما يلي شرح خطوة بخطوة:
– تعريف الـstructure:
struct Distance { int feet; float inches; };
يعرف هيكل يسمى Distance مع عضوين: feet (عدد صحيح) وinches (عدد عشري).
- دالة لإضافة المسافات Distances:
Distance add_distance(Distance d1, Distance d2) { Distance result; result.feet = d1.feet + d2.feet; result.inches = d1.inches + d2.inches; return result; }
تحدد دالة add_distance التي تأخذ هيكلين للمسافة كـparameters، وتضيف أعضاء الـfeet والـinches المقابلة لهما، وترجع هيكل مسافة جديدة تمثل المجموع.
- الدالة الرئيسة:
int main() { Distance x, y, z; // User input for the first distance (x) cout << "Enter feet value \n"; cin >> x.feet; cout << "Enter inches value \n"; cin >> x.inches; // User input for the second distance (y) cout << "Enter feet value \n"; cin >> y.feet; cout << "Enter inches value \n"; cin >> y.inches; // Add the two distances using the add_distance function z = add_distance(x, y); // Print the result cout << "z.feet = " << z.feet << " z.inches = " << z.inches << endl; return 0; }
مسار التنفيذ:
- مدخلات المستخدم:
يُطلب من المستخدم إدخال قيم الـfeet والـinches لمسافتين (x وy). - إستدعاء الدالة:
يتم استدعاء الدالة add_distance باستخدام هياكل x وy كـarguments، ويتم تخزين النتيجة في الهيكل z. - طباعة إلى شاشة المخرجات:
يقوم البرنامج بطباعة النتيجة، ويعرض مجموع المسافات بالـfeet والـinches. - جملة الإرجاع:
return 0؛ يشير إلى أن البرنامج قد تم تنفيذه بنجاح.
مثال عن التنفيذ:
إذا أدخل المستخدم ما يلي:
Enter feet value 3 Enter inches value 6.5 Enter feet value 2 Enter inches value 3.2
ستكون المخرجات كالتالي:
z.feet = 5 z.inches = 9.7
مثال 4:
#include <iostream> #include <string> #include <cstring> #include <cstdlib> using namespace std; struct exam { float first; float second; float final; }; class subject { char name[10]; exam Exam; public: subject() { strcpy(name, "no name"); Exam = {0, 0, 0}; } subject(char n[], float fa, float s, float fi) { strcpy(name, n); Exam = {fa, s, fi}; } float total() { return Exam.first + Exam.second + Exam.final; } void print() { cout << "The subject = " << name << endl << "First Exam = " << Exam.first << endl << "Second Exam = " << Exam.second << endl << "Final Exam = " << Exam.final << endl << "The Total is = " << total() << endl; } }; int main() { subject e("OOP", 25, 24, 49); e.print(); return 0; }
يحدد هذا الكود برنامجًا يستخدم مجموعة من الهياكل structures والفئات classes لتصميم subject باستخدام درجات الاختبار. دعونا نحلل الكود خطوة بخطوة:
– تعريف الـstructure:
struct exam { float first; float second; float final; };
يعرف structure يسمى exam يضم ثلاثة أعضاء يمثلون درجات الاختبار: الأول والثاني والنهائي.
- تعريف الفئة class:
class subject { char name[10]; exam Exam; public: // Default constructor subject() { strcpy(name, "no name"); Exam = {0, 0, 0}; } // Parameterized constructor subject(char n[], float fa, float s, float fi) { strcpy(name, n); Exam = {fa, s, fi}; } // Member function to calculate the total exam score float total() { return Exam.first + Exam.second + Exam.final; } // Member function to print subject details void print() { cout << "The subject = " << name << endl << "First Exam = " << Exam.first << endl << "Second Exam = " << Exam.second << endl << "Final Exam = " << Exam.final << endl << "The Total is = " << total() << endl; } };
يحدد فئة class تسمى الـsubject مع private members:
- name: مجموعة من الأحرف التي تمثل اسم الـsubject.
- Exam: مثال على هيكل الامتحان الذي يمثل درجات الامتحان.
يتضمن هذا الـclass:
- A default constructor (subject()) يقوم بتهيئة الاسم إلى "no name" والـExam لجميع الأصفار.
- A parameterized constructor (subject(char n[], float fa, float s, float fi)) تهيئة الاسم والاختبار بالقيم التي تم توفيرها.
- دالة عضو Total() تحسب مجموع درجات الامتحان.
- تقوم دالة العضو print() بطباعة تفاصيل الموضوع.
- الدالة الرئيسة:
int main() { // Create an instance of the subject class subject e("OOP", 25, 24, 49); // Call the print() member function to display subject details e.print(); return 0; }
في الدالة الرئيسة:
- يتم إنشاء مثيل e لفئة الموضوع باستخدام parameterized constructor.
- يتم استدعاء دالة عضو print() على الكائن e، وتعرض تفاصيل الموضوع ودرجات الامتحان الخاص به.
مثال على المخرجات:
The subject = OOP First Exam = 25 Second Exam = 24 Final Exam = 49 The Total is = 98
تمثل هذه المخرجات تفاصيل “OOP” subject,، بما في ذلك درجات الامتحانات الأولى والثانية والنهائية، بالإضافة إلى الدرجة الإجمالية.