You are on page 1of 9

‫برمجة تراكيب البيانات‬

‫المحاضرة الرابعة‬
‫‪Structures‬‬ ‫التراكيب‬
‫مقدمة إلى تراكيب البيانات‬
‫‪int, float,‬‬ ‫ما زلنا حىت ىذه ادلرحلة من الربجمة بلغة ‪ C++‬نستخدم أنواع البيانات األساسية ادلعرفة يف لغة ‪ C++‬مثل‪:‬‬
‫‪ char, double, long int‬اخل‪ ،‬ويف بعض التطبيقات حنتاج إىل استخدام أنواع بيانات أخرى لتمثيل بعض البيانات‪،‬‬
‫ويف لغة ‪ C++‬ميكن للمربمج استحداث أنواع بيانات جديدة خاصة بو اعتماداً على أنواع البيانات األساسية يف لغة‬
‫‪ C++‬وىذه األنواع تسمى "أنواع بيانات معرفة من قبل ادلستخدم )‪ "(User defined data types‬ومن أىم ىذه‬
‫األنواع اليت ميكن للمستخدم تعريفها ومن مث استخدامها يف الربامج ىي الًتاكيب‪.‬‬
‫‪Structure Define‬‬ ‫تعريف التركيب‪:‬‬
‫ىو عبارة عن جمموعة من العناصر اليت تربطها مع بعضها البعض عالقات وثيقة وىذه العناصر من ادلمكن أن‬
‫تكون من أنواع خمتلفة من البيانات (…‪ )int,float,char,‬وختزن ىذه ادلعطيات يف الذاكرة بشكل متتايل حتت اسم‬
‫واحد‪ ،‬ويستخدم لتمثيل بيانات شيء ما‪ ،‬مثل سجل بيانات طالب‪ ،‬سجل بيانات سيارة وىكذا‪.‬‬
‫فمثالً التركيب التالي يوضح سجل طالب‪:‬‬

‫(احلقل) ‪Field:‬‬ ‫(الرقم) ‪No‬‬ ‫(االسم) ‪Name‬‬ ‫(ادلعدل) ‪Average‬‬


‫البيانات)‪Data Type:‬‬ ‫(نوع‬ ‫‪int‬‬ ‫* ‪char‬‬ ‫‪float‬‬
‫‪string‬‬ ‫وىو من نوع‬ ‫)‪(name‬‬ ‫وىو من نوع ‪ ،int‬االسم‬ ‫حيتوي ىذا الًتكيب على ثالثة حقول ىي‪ :‬الرقم‬
‫)‪(no‬‬
‫وادلعدل )‪ (average‬وىو من نوع ‪.float‬‬
‫ويتم تعريف الًتكيب يف لغة ‪ C++‬يف بداية الربنامج باستخدام األمر ‪ struct‬وضمن الدالة )(‪.main‬‬
‫الصيغة العامة لإلعالن عن التراكيب‪:‬‬

‫‪struct struct_name‬‬
‫{‬
‫‪data type‬‬ ‫;‪field1_name‬‬
‫‪data type‬‬ ‫;‪field2_name‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪data type‬‬ ‫;‪fieldn_name‬‬
‫;}‬

‫‪1‬‬ ‫إعداد األستاذ‪/‬حذيفة عبد الرحمن‬


‫برمجة تراكيب البيانات‬
‫حيث‪:‬‬
‫‪ struct -1‬كلمة حمجوزة لإلعالن عن الًتاكيب‪.‬‬
‫‪ struct_name-2‬اسم الًتكيب‪.‬‬
‫‪ data type -3‬نوع بيانات احلقل‪.‬‬
‫مثال‪ -:1‬لإلعالن عن تركيب يصف الطقس حيوي احلقول التالية(درجة احلرارة‪،‬الضغط‪،‬الرياح) نكتب التايل‪:‬‬
‫‪struct weather‬‬
‫{‬
‫;‪float temp‬‬
‫;‪float pressure‬‬
‫;‪float wind‬‬
‫;}‬
‫مثال‪ :2‬لإلعالن عن تركيب طالب حيوي احلقول (الرقم‪ ،‬االسم ‪ ،‬العنوان) نكتب التايل‪:‬‬

‫‪struct student‬‬
‫{‬
‫;‪int no‬‬
‫;]‪char name [20‬‬
‫;]‪char address[20‬‬
‫;}‬
‫مثال‪ :3‬لإلعالن عن تركيب موظف حيوي احلقول (الرقم‪ ،‬االسم‪ ،‬الراتب) نكتب التايل‪:‬‬

‫‪struct emp‬‬
‫{‬
‫;‪int emp_no‬‬
‫;]‪char emp_name[20‬‬
‫;‪float emp_salary‬‬
‫;}‬
‫التعامل مع التراكيب‪:‬‬
‫بعد تعريف الًتكيب وقبل استخدامو جيب اإلعالن او التصريح عن متغري أو متغريات من الًتكيب الستخدامها يف‬
‫الوصول إىل حقول الًتكيب ‪ .‬حيث أنو ال ميكن الوصول اىل حقول الًتكيب بشكل مباشر اال عن طريق متغري من نوع‬
‫الًتكيب‪.‬‬
‫فمثالً ميكن التصريح عن ادلتغريين ‪ std1, std2‬على أهنما متغريان من نوع الًتكيب ‪ student‬كما يلي‪:‬‬

‫;‪struct student std1,std2‬‬


‫كالً من الًتكيبني ‪ std1, std2‬سيحتويان على نفس احلقول وىي ‪.no, name, address‬‬ ‫‪‬‬
‫‪2‬‬ ‫إعداد األستاذ‪/‬حذيفة عبد الرحمن‬
‫برمجة تراكيب البيانات‬
‫وميكن الدمج بني تعريف الًتكيب وبني التصريح عن ادلتغريات يف عبارة واحدة كما يلي ‪:‬‬
‫‪struct student‬‬
‫{‬
‫;‪int no‬‬
‫;]‪char name [20‬‬
‫;]‪char address[20‬‬
‫;‪} std1, std2‬‬
‫وبنفس الطريقة بالنسبة لًتكيب ادلوظف نكتب اآليت‪:‬‬
‫;‪struct emp e1‬‬
‫حيث ‪ e1‬متغري من نوع الًتكيب ‪.emp‬‬
‫وميكن االستغناء عن مجلة ‪ struct‬إذا مت تعريف الًتكيب مسبقاً‪.‬‬
‫مثالً‪:‬‬
‫‪student‬‬ ‫;‪s1‬‬
‫‪emp‬‬ ‫;‪e1‬‬
‫ترتيب احلقول ضمن تعريف الًتكيب اختياري أي ميكن تعريف حقول الًتكيب بأي ترتيب‬ ‫‪‬‬
‫إذا كان يف الًتكيب عدة حقول من نفس النوع ميكن التصريح عنها بعبارة واحدة‪ ،‬فمثالً لو‬
‫كان الًتكيب حيتوي على احلقول ‪ x,y,z‬ومجيعها من نوع ‪ int‬فيمكن التصريح عنها بعبارة‬
‫تصريح واحدة كما يلي‪:‬‬
‫‪struct . . .‬‬ ‫‪‬‬
‫{‬
‫‪...‬‬
‫;‪int x,y,z‬‬
‫‪...‬‬
‫}‬

‫التعامل مع حقول التركيب‪:‬‬


‫يتم التعامل مع حقول الًتكيب كالقراءة والطباعة يف الربنامج باستخدام النقطة (‪ ).‬حيث يتم كتابة متغري الًتكيب تليو‬
‫نقطة (‪ ).‬مث اسم احلقل ادلراد التعامل معو أو الوصول اليو‪.‬‬
‫فمثالً إلسناد قيمة إىل احلقل ‪ no‬يف الًتكيب ‪ student‬ميكن أن نستخدم متغري الًتكيب ‪ std1‬كما بالشكل التايل‪-:‬‬
‫;‪std1.no=100‬‬

‫‪3‬‬ ‫إعداد األستاذ‪/‬حذيفة عبد الرحمن‬


‫برمجة تراكيب البيانات‬
‫مثال‪:‬‬
‫ادلقطع الربجمي التايل يوضح كيفية بناء تركيب والوصول إىل حقول الًتكيب لتخزين قيم فيها‬
‫‪struct person‬‬
‫{‬
‫;‪int no‬‬
‫; ]‪char name[30‬‬
‫; ]‪char tel[12‬‬
‫; ]‪char address[30‬‬
‫;‪} per1,per2‬‬
‫;"‪per1.name="ali";per1.tel="123456‬‬

‫وذلك باستعمال الكلمة احملجوزة ‪ struct‬مث‬ ‫)‪ (structure‬باالسم ‪person‬‬ ‫يف ادلقطع الربجمي أعاله مت تعريف تركيب‬
‫مت تعريف حقولو داخل القوسني { }‪ ،‬ىذا الًتكيب حيتوى على حقل من نوع صحيح ‪ int‬باالسم ‪ no‬وحقل حريف‬
‫باالسم ‪ name‬وىكذا ‪.‬ومت ختزين قيم يف بعض حقول الًتكيب عن طريق متغري الًتكيب ‪ per1‬مع أداة النقطة مثل‬
‫;"‪per1.name="ali";per1.tel="123456‬‬

‫تدخل كل حقول الًتكيب يف كل العمليات الرياضية وادلنطقية وكذالك عمليات اإلدخال واإلخراج‪.‬‬ ‫‪‬‬
‫مثال‪:‬‬
‫اكتب برنامج إلدخال بيانات الطالب (تركيب الطالب) وىي الرقم اجلامعي واالسم والعنوان والقسم وادلستوى وادلعدل‬
‫الفصلي وادلعدل الًتاكمي مث طباعتها باستخدام الًتكيب‪.‬‬

‫>‪#include<iostream.h‬‬
‫)( ‪int main‬‬
‫{‬
‫‪//Creating the Structure‬‬
‫‪struct student‬‬
‫{‬
‫;‪int no‬‬
‫;]‪char name[30‬‬
‫;]‪char address[20‬‬
‫;]‪char department[15‬‬
‫;‪int level‬‬
‫;‪float gpa‬‬
‫;‪float cgpa‬‬
‫;}‬
‫;‪student st‬‬
‫‪//end of Creating‬‬

‫‪4‬‬ ‫إعداد األستاذ‪/‬حذيفة عبد الرحمن‬


‫برمجة تراكيب البيانات‬

cout<<"enter the student number:\n";


cin>>st.no;
cout<<"enter the student name:\n";
cin>>st.name;
cout<<"enter the student address:\n";
cin>>st.address;
cout<<"enter the student department:\n";
cin>>st.department;
cout<<"enter the student level:\n";
cin>>st.level;
cout<<"enter the student gpa:\n";
cin>>st.gpa;
cout<<"enter the student cgpa:\n";
cin>>st.cgpa;
//end of filling
//printing the structure
cout<<"===============================\n";
cout<<"student number ="<<st.no<<"\n";
cout<<"student name ="<<st.name<<"\n";
cout<<"student address ="<<st.address<<"\n";
cout<<"student department ="<<st. department <<"\n";
cout<<"student level ="<<st.level<<"\n";
cout<<"student gpa ="<<st.gpa<<"\n";
cout<<"student cgpa ="<<st.cgpa<<"\n";
cout<<"==============================\n";
return 0;
}
: Structures Arrays ‫مصفوفات التراكيب‬
.‫تعترب من أىم تطبيقات الًتاكيب حيث يعلن عن الًتكيب أوالً مث عن متغري ادلصفوفة من نوع معطيات الًتكيب‬
:‫مثال‬
.)‫ الشارع‬،‫ ادلدينة‬،‫ أشخاص حيث يشمل العنوان احلقول التالية ( االسم‬5 ‫تعريف تركيب لعناوين‬
#include<iostream.h>
int main ()
{
struct address
{
char name[20];
char city[15];
char street[20];
};
address information[5];
5 ‫حذيفة عبد الرحمن‬/‫إعداد األستاذ‬
‫برمجة تراكيب البيانات‬
cout<<"Enter Information\n";
int i;
for(i=0;i<5;i++)
{
cin>>information[i].name;
cin>>information[i].city;
cin>>information[i].street;
}
cout<<"**** Print Information ****\n";
cout<<"===========================\n";
cout<<"No\tName\tCity\t Street\n";
for(i=0;i<5;i++)
{
cout<<i+1<<"\t";
cout<<information[i].name<<"\t";
cout<<information[i].city<<"\t";
cout<<information[i]. street<<"\t";
cout<<"\n";
}
return 0;
}
:‫إعطاء التراكيب قيم ابتدائية‬
:‫ميكن إعطاء الًتاكيب قيم ابتدائية من خالل متغري الًتكيب وادلثال التايل يوضح ذلك‬
#include<iostream.h>
int main ()
{
//Creating the structure
struct customer
{
int count_no;
char name[20];
};
struct customer c1;
struct customer c2={18922,"abdallah"};
cout<<"enter customer 1 name: \n";
cin>>c1.name;
cout<<"enter customer 1count_number: \n";
cin>>c1. count_no;
//printing the structure
cout<<"=== list of customers===\n";
cout<<"===================\n";
cout<<"name1:"<<c1.name<<"\n";
cout<<"count_number1::"<<c1.count_no<<"\n";
cout<<"name2:"<<c2.name<<"\n";
6 ‫حذيفة عبد الرحمن‬/‫إعداد األستاذ‬
‫برمجة تراكيب البيانات‬
‫;"‪cout<<"count_number2::"<<c2.count_no<<"\n‬‬
‫;‪return 0‬‬
‫}‬
‫التراكيب المتداخلة ‪:Nested Structures‬‬
‫قد يكون احد حقول السجل عبارة عن سجل آخر‪ ،‬ويف ىذه احلالة جيب اإلعالن أوالً عن نوع السجل‬
‫الداخلي قبل اإلعالن عن السجل اخلارجي‪.‬‬
‫مثال‪:‬‬
‫>‪#include<iostream.h‬‬
‫)( ‪int main‬‬
‫{‬
‫‪struct name‬‬
‫{‬
‫;]‪char first[20],middle[20],family[20‬‬
‫;}‬
‫‪struct full_name‬‬
‫{‬
‫;‪struct name n‬‬
‫;‪long university_no‬‬
‫;}‬
‫;}‪full_name f={{"Mohmmed","Abdallah","Ali"},1809992‬‬
‫;"‪cout<<"*** personal information ***\n‬‬
‫;"‪cout<<"-----------------------------------\n‬‬
‫;‪cout<<"full name:"<<f.n.first<<" "<<f.n.middle‬‬
‫;"‪cout<<" "<<f.n.family<<"\n‬‬
‫;"‪cout<<"university number:"<<f.university_no<<"\n‬‬
‫;‪return 0‬‬
‫}‬
‫مؤشر التراكيب ‪:Structures Pointer‬‬
‫يستخدم مؤشر الًتاكيب يف حالتني‪:‬‬
‫أ ‪-‬احلجز الديناميكي للذاكرة‪.‬‬
‫ب‪-‬يف حالة أن يؤشر مؤشر الًتكيب إىل متغري تركيب موجود مسبقاً‪.‬‬

‫) بدالً‬ ‫>‪-‬‬ ‫للوصول إىل حقول الًتكيب باستخدام مؤشر الًتكيب نستخدم أداة السهم (‬
‫‪‬‬
‫من (‪.).‬‬

‫‪7‬‬ ‫إعداد األستاذ‪/‬حذيفة عبد الرحمن‬


‫برمجة تراكيب البيانات‬
.ً‫ يوضح حالة حجز ادلؤشر ديناميكيا‬:1‫مثال‬
#include<iostream.h>
int main ()
{
struct time
{
int seconds,minutes,hour;
};
time *t1 = new time;
t1->seconds = 43;
t1->minutes = 13;
t1->hour = 12;
cout<<"time :"<<t1->hour<<":"<<t1->minutes<<":"
<<t1->seconds<<" \n";
return 0;
}

.‫ يوضح حالة إذا كان متغري الًتكيب موجود حيث يستخدم مؤشر الًتكيب لإلشارة إىل متغري الًتكيب‬:2‫مثال‬

#include<iostream.h>
int main ()
{
struct time
{
int seconds,minutes,hour;
};
time t1, *t2;
t2= & t1;
t2->seconds =22;
t2->minutes =45;
t2->hour =2;
//printing the structure by using structure variable
cout<<"time:"<<t1.hour<<":"<<t1.minutes
<<":"<<t1.seconds<<"\n";
//printing the structure by using structure pointer
cout<<"time:"<<t2->hour<<":"<<t2->minutes
<<":"<<t2->seconds<<"\n";
return 0;
}

8 ‫حذيفة عبد الرحمن‬/‫إعداد األستاذ‬


‫برمجة تراكيب البيانات‬
‫تدريبات‬

‫‪,‬االسم ‪ ,‬ادلعدل ( مث طباعتو‪.‬‬ ‫‪ .1‬اكتب برنامج إلدخال سجل لطالب مشتمالُ على احلقول التالية (الرقم‬

‫‪ .2‬اكتب برنامج إلدخال سجل دلوظف مشتمالُ على احلقول التالية( االسم‪ ،‬الراتب ) مث طباعتو مع الصايف بعد‬

‫استقطاع ‪. 15%‬‬

‫‪ .3‬اكتب برنامج إلدخال سجل لصنف مشتمالُ على احلقول التالية(االسم‪,‬السعر‪,‬العدد) مث طباعتها مع القيمة‬

‫اإلمجالية‪.‬‬

‫‪ .4‬اكتب برنامج إلدخال سجالت دلادة مشتمالُ على احلقول التالية (االسم ‪,‬درجة النظري ‪,‬درجة العملي) مث‬

‫جمموع‪.‬‬ ‫طباعتها مع جمموع درجيت النظري والعملي واكرب‬

‫‪9‬‬ ‫إعداد األستاذ‪/‬حذيفة عبد الرحمن‬

You might also like