Download as pdf or txt
Download as pdf or txt
You are on page 1of 2380

‫جامعة القدس المفتوحة‬

‫مركز التعليم المفتوح ‪OLC‬‬

‫”تطوير البرامج الكينونية“‬


‫”المفاهيم االساسية لتطوير البرامج الكينونية“‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫مصطلح الكينونية‬

‫• مصطلح الكينونية من المصطلحات المهمة في عالم الحاسوب‬


‫في هذه االيام‪.‬‬
‫• يرتبط هذا المصطلح بمفاهيم كثيرة منها التحليل الكينوني‬
‫والتصميم الكينوني والبرمجة الكينونية‪.‬‬
‫• ال يوجد تعريف دقيق لمصطلح كينونية‪.‬‬
‫نعرف مصطلح الكينونية؟؟؟‬
‫كيف ّ‬

‫هو اسلوب جديد في تطوير البرامج واألنظمة الحاسوبية من‬


‫خالل التركيز على الكينونات ‪ /‬الكائنات الرئيسية بدال من‬
‫التركيز على الوظائف التي يجب ان يؤديها هذا النظام‪.‬‬
‫اذن ما هو التطوير الكينوني؟؟‬

‫هو اسلوب جديد في تطوير البرامج واألنظمة الحاسوبية من خالل‬


‫التركيز على الكينونات ‪ /‬الكائنات الرئيسية بدال من التركيز على‬
‫الوظائف التي يجب ان يؤديها هذا النظام‪.‬‬
‫ما هو الكينون؟؟‬

‫ان مفهوم الكائن ‪ )(Object‬مرتبط بمجموعة من الخصائص التي‬


‫تحدد من خالل مجموعة من المتغيرات التي تصف حالة الكينون‬
‫ومجموعة من العمليات التي يستطيع انجازها‪.‬‬
‫ما هو الكينون؟؟‬
‫تعرف الكينونة انها شيء ما او شخص او مكان او حدث او مفهوم‬
‫في البيئة التي يتم دراستها ‪.‬‬
‫مثال على ذلك ‪ :‬شخص معين داخل النظام ‪ ,‬او قسم معين او‬
‫سلعة معينة أو طالب معين‪.‬‬
‫رقم المريض‪12 :‬‬
‫اسم المريض‪ :‬سعيد‬
‫العنوان‪ :‬جنين‬
‫العمر‪30 :‬‬
‫كيف تحصل على الكينون؟؟‬

‫ان االصناف )‪ (Classes‬تعد مصنعاً للكينونات‪ ،‬حيث تستخدم‬


‫إلنشاء الكائنات التي تحتوي على المتغيرات والدوال المنتمية‪.‬‬
‫ما هي امكانيات البرمجة الكينونية؟؟‬

‫•التنظيم الجيد‪.‬‬
‫•االستخدام المتعدد‪.‬‬
‫•التوارث‪.‬‬
‫•المقاطع البرمجية المتكاملة‪.‬‬
‫تطوير البرامج الكينونية‬

‫عند تطوير البرامج الكينونية‪ ،‬تستخدم الكينونات لمحاكاة الواقع قيد‬


‫الدراسة‪.‬‬
‫مثال ‪:‬تطوير البرامج الكينونية‬

‫اكتب برنامجا لحساب صافي راتب عدد من الموظفين في دائرة ما‪.‬‬


‫عند تحليل المسألة‪ :‬نجد ان النظام يحوي على كينون الموظف‬
‫وكينون الدائرة‪.‬‬
‫‪‬تذكر عزيزي الطالب‪ :‬كل كينون له مجموعة من الخصائص‬
‫وتجري عليه مجموعة من العمليات‪.‬‬
‫مثال ‪:‬تطوير البرامج الكينونية‬

‫خصائص كينون الموظف‪:‬‬


‫‪‬اسم الموظف‬
‫‪‬الراتب االساسي‬
‫‪‬االقتطاعات‬
‫‪‬صافي الراتب‬
‫مثال ‪:‬تطوير البرامج الكينونية‬
‫مجموعة رموز‬ ‫اسم الموظف‬

‫عدد حقيقي‬ ‫الراتب االساسي‬

‫عدد حقيقي‬ ‫االقتطاعات‬

‫عدد حقيقي‬ ‫صافي الراتب‬


‫مثال ‪:‬تطوير البرامج الكينونية‬
‫عمليات كينون الموظف‪:‬‬
‫‪‬بناء أو انشاء الكينون وتحديد المعطيات االولية‪.‬‬
‫‪‬تحديد اسم الموظف واسناده‬
‫‪‬تعيين البيانات الخاصة بالموظف‬
‫‪‬حساب صافي راتب الموظف‬
‫‪‬طباعة اسم الموظف وصافي راتبه‬
‫‪‬انهاء وجود الكينون‬
‫التحليل الكينوني‬
‫• يهدف إلى معرفة متطلبات البرنامج أو النظام و البدء في‬
‫عملية بناء نموذج أولي للبرنامج من خالل التركيز على‬
‫الكائنات األساسية و تلخص هذه العملية كما يلي‪:‬‬
‫• تحديد الكائنات في هذا النموذج األولي‪.‬‬
‫• وصف خصائص الكائنات‪.‬‬
‫• ربط الكائنات المختلفة مع بعضها‪.‬‬
‫• تجميع الكائنات المختلفة‪.‬‬
‫الكائن ‪object‬‬
‫الكائنً‪ : Object‬عبارةًعنًوحدةًتحويًمجموعةًمنًالبياناتً‬
‫تسميً( خصائصً) ‪ properties‬أوًصفاتًومعرفًعليهاً‬
‫مجموعةًمنًالعملياتً‪.‬‬
‫مثالً‪ :‬كائنًالسيارة‬
‫الخصائصً‪:‬‬
‫▫ ‪Model :Mercedes‬‬
‫▫ ‪Color : Blue‬‬
‫▫ ‪Year : 2010‬‬
‫العملياتً‪:‬‬
‫‪ ' Start‬االنطالقً'‬
‫‪ ' Stop‬التوقفً'‬
‫‪' Speed‬التسارع'‬
‫‪ Class‬الصنف‬
‫منًأينًنحصلًعلىًالكائنات؟ً‬
‫تعد األصناف ‪ Classes‬مصنعاً للكائنات‪.‬‬
‫الصنف ‪ Class:‬الكائنات ذات الخصائص واألفعال المشتركة‬
‫بحاجة آلن تجمع مع بعضها البعض حتى يمكن استخدامها في‬
‫برنامج ما‪.‬‬
‫وبالتالي فإن الصنف ‪ :‬عبارة عن مجموعة من الكائنات التي تشترك‬
‫في الخصائص والعمليات‪.‬‬
‫مثالً ‪:‬‬
‫الطالب كائن >> الطالب صنف‪.‬‬
‫الموظف كائن >> الموظفين صنف‪.‬‬
‫وصف خصائص الكائنات‬
‫تمثيل الصنف (سيارة)‬
‫وصف خصائص الكائنات‬
‫تمثيل الصنف‬
‫وصف خصائص الكائنات‬
‫تمثيل الصنف‬
‫وصف خصائص الكائنات‬
‫تمثيل الصنف والوارثة من الصنف‬
‫الصنف يشتق منه كائنات‬
‫الصنف يشتق منه كائنات‬
‫تحديد العالقات بين الكينونات‬
‫• عالقةًيعرفً)‪(knows‬‬
‫• عالقةًيكونً)‪(is‬‬
‫• عالقةًيملكً)‪(has‬‬
‫تحديد العالقات بين الكينونات‬
‫• عالقة يعرف )‪: (knows‬مثل عالقة الطالب بالمقرر اذ على الطالب‬
‫معرفة المقرر الذي سيسجله في الجامعة‪.‬‬
‫• عالقة يكون )‪ : (is‬تصف حقيقة ان كائناً معيناً يكون له خصائص‬
‫عامة مشتركة يشترك بها مع اصناف اخرى حيث يتم وصف‬
‫الخصائص العامة من خالل صنف رئيسي‪.‬‬
‫اجزاء‬
‫• عالقة يملك )‪ :(has‬تصف حقيقة ان كائناً معيناً مكون من ً‬
‫اخرى حيث ان كل جزء يمثل كائنا آخر‪.‬‬
‫تحديد العالقات بين الكينونات‬
‫تحديد العالقات بين الكينونات‬
‫عالقة يكون )‪(is‬‬
‫تحديد العالقات بين الكينونات‬
‫عالقة يكون )‪(is‬‬
‫في مثال المركبة واألصناف الفرعية منها‪ ،‬فان هناك بعض االصناف‬
‫الفرعية التي تمتلك بعض الخصائص المحلية والتي ال تنطبق على‬
‫الصنف الرئيسي‪.‬‬
‫نطلق على هذه الخاصية خاصية التوارث في البرمجة الكينونية‪ ،‬حيث‬
‫يمكن مثال للدراجة النارية او السيارة او القطار ان يمتلك خصائص ال‬
‫يمتلكها الصنف الرئيسي وهو العربة‪.‬‬
‫تجميع الكائنات‬
‫عزيزي الطالب‪:‬‬
‫‪‬ان البرامج الكبيرة عادة ما تحتوي على عدد كبير نسبيا من‬
‫االصناف‪.‬‬
‫‪‬توفر البرمجة الكينونية ما يسمى بالحزم )‪ ،(Packages‬وهي‬
‫تعمل على تجميع عدد من االصناف المترابطة مع بعضها‬
‫البعض وذلك لتسهيل التعامل معها‪.‬‬
‫‪‬يمكن التعديل والصيانة على االصناف داخل الحزم بسهولة‬
‫كبيرة جدا‪.‬‬
‫التصميم الكينوني‬

‫هي المرحلة الثانية من مراحل بناء البرنامج الكينوني‪ ،‬حيث تمثل‬


‫التحليل الكينوني المرحلة االولى‪ ،‬ويتم فيها عمل الرس ًومات والنماذج‬
‫الكينوني‬ ‫بالبرنامج‬ ‫الخاصة‬
‫ويتم هنا التركيز على كيفية عمل األشياء و ليس فقط على مجرد‬
‫التركيز على تحديد هذه األشياء‪.‬‬
‫تتكون من مرحلتين‪:‬‬
‫▫ بناء العمليات‪.‬‬
‫▫ اختيار لغة البرمجة الكينونية‪.‬‬
‫التصميم الكينوني‪ /‬بناء العمليات‬

‫ففي هذه المرحلة نبدأ بتحديد كيفية انجاز العمليات المختلفة على‬
‫الكائنات التي تم تحديدها في المرحلة السابقة‪ ،‬وتحديد المعلمات‬
‫)‪ (Parameters‬التي تلزم لتنفيذ هذه العمليات‪.‬‬
‫التصميم الكينوني‪ /‬بناء العمليات‬
‫لحسابًمساحةًالمستطيلًالذيًيعتبرًصنفاًاساسياًضمنً‬
‫مجموعةًاالصنافًالرئيسيةًعندًالتعاملًمعًاالشكالًالهندسية‪ً،‬‬
‫فانهًيلزمنا‪:‬‬
‫العرض‬ ‫‪‬معرفةًالمعلماتًوهي‪:‬‬

‫الطول‬

‫المستطيل = الطول × العرض‬ ‫• مساحة‬


‫التصميم الكينوني‪ /‬بناء العمليات‬
‫التصميم الكينوني‪ /‬اختيار لغة البرمجة‬

‫لغة جافا؟؟؟‬

‫لغة ‪ C++‬؟؟‬

‫ام يمكن اختيار‬


‫أي لغة‬
‫برمجة اخرى‬
‫غير كينونية؟؟؟‬
‫هل يمكن ان تتم عملية تنفيذ التصميم الكينوني لغة‬
‫غير كينونية؟‬

‫‪‬نعم‪ ،‬يمكن ان تتم عملية تنفيذ التصميم الكينوني بلغة غير كينونية‪،‬‬
‫وذلك من خالل التعامل مع االصناف وكأنها تراكيب تجريدية‪.‬‬
‫‪ ‬إال ان ذلك غير محبذ ألننا سنفقد الخصائص والحسنات االساسية‬
‫المرتبطة بتطوير البرامج الكينونية وخاصة الفائدة من اعادة استخدام‬
‫بعض االصناف والوراثة واخفاء المعلومات وغيرها من الميزات الجيدة‬
‫للغات البرمجة الكينونية‪.‬‬
‫البرمجة الكينونية‬
‫ان الهدف من مرحلة البرمجة هو تنفيذ النظم التي تم تحليلها‬
‫وتصميمها في مراحل سابقة والوصول الى برامج قابلة للتنفيذ‪.‬‬
‫انتبه‪:‬‬
‫‪ ‬كون البرنامج قابالً للتنفيذ ال يعني بالضرورة ان البرنامج جيد‪ ،‬اذ‬
‫يوجد مجموعة من الخصائص الجيدة للبرامج‪ ،‬وهناك خصائص‬
‫اساسية للغات البرمجة الكينونية‪.‬‬
‫البرمجة الكينونية‬

‫‪‬ما هي خصائص البرامج الجيدة؟‬


‫‪‬ما هي الخصائص األساسية في لغات البرمجة الكينونية؟‬
‫ما هي خصائص البرامج الجيدة؟‬

‫‪‬أن يكون برنامجاً صحيحاً أن يقوم بالوظيفة كاملة أي خالي من‬


‫األخطاء‪.‬‬
‫‪‬أن يكون برنامجاً فعاالً أن يستغل إمكانيات الحاسوب‬
‫ومكوناته على أكمل وجه بأن يحل مسألة معينة بأقصر وقت‬
‫‪‬أن يكون برنامجاً قابالً إلعادة االستخدام‪.‬‬
‫ما هي خصائص البرامج الجيدة؟‬

‫من الخصائص األخرى أن يكون‬


‫برنامجاً مرناً يتكيف‬
‫مع الظروف و البيئات التي سيعمل به‬
‫وأن تكون تكلفة صيانته قليلة‪.‬‬
‫ما هي الخصائص األساسية في لغات البرمجة‬
‫الكينونية؟‬
‫ما هي الخصائص األساسية في لغات البرمجة‬
‫الكينونية؟‬
‫هل هناك خصائص اخرى؟‬

‫من الخصائص األخرى‬


‫امكانية بناء برامج فرعية عامة‬
‫اهداف القسم‬
‫يتوقع منك عزيزي الطالب بعد مشاهدتك الفيديو أن‪:‬‬
‫▫ تكتب برنامجك االول بلغة سي‬
‫▫ ان تتعرف على المكونات االساسية لبرنامج لغة سي‪.‬‬
‫البرنامج االول‬
#include<iostream>
#include<string>
using namespace std;
class person{
public: ‫البرنامج الثاني‬
void setname(string x){ name=x;}
string getname(){return name;}
private: string name; };
main(){
person taroub;
taroub.setname("hello c++");
cout<<taroub.getname()<<endl;
system("PAUSE"); }
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫تعريف التراكيب‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫األهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫يوضح المقصود بمصطلح التركيب في لغة ‪.c++‬‬ ‫‪.1‬‬

‫تعرف التراكيب في لغة ‪.c++‬‬


‫ّ‬ ‫‪.1‬‬
‫مصطلح التركيب ‪Structure‬‬

‫• مجموعة من العناصر ترتبط مع بعضها البعض عالقات وثيقة‪،‬‬


‫وهذه العناصر قد تكون من أنواع مختلفة من البيانات‪.‬‬

‫• كل حقل يمثل معلومة مفردة من معلومات التركيب‪.‬‬

‫• يعرف التركيب في بداية البرنامج وقبل الدالة ‪ main‬الرئيسية‪.‬‬


Structure ‫تعريف التركيب‬
:‫الصيغة العامة لإلعالن عن التراكيب‬
struct struct_name
{
data type field1_name;
data type field2_name;
.
.
data type fieldn_name;
};
‫تعريف التركيب ‪Structure‬‬
‫‪‬مثال ‪: 1‬‬
‫لإلعالن عن تركيب طالب يحوي الحقول (الرقم ‪،‬االسم ‪،‬العنوان)‬
‫نكتب التالي‪:‬‬
‫‪struct student‬‬
‫{‬
‫;‪int no‬‬
‫;]‪char name [20‬‬
‫;]‪char address[20‬‬
‫;}‬
‫تعريف التركيب ‪Structure‬‬
‫‪‬مثال ‪: 2‬‬
‫لإلعالن عن تركيب موظف يحوي الحقول (الرقم‪ ،‬االسم‪ ،‬الراتب)‬
‫نكتب التالي‪:‬‬
‫‪struct emp‬‬
‫{‬
‫;‪int emp_no‬‬
‫;]‪char emp_name[20‬‬
‫;‪float emp_salary‬‬
‫;}‬
‫اإلعالن عن المتغير المركب‬
‫الطريقة األولى‪:‬‬

‫يتم االعالن عن المتغير المركب بعد تعريف التركيب وحقوله‪ ،‬كما‬


‫في المثال التالي‪:‬‬
‫‪struct student‬‬
‫{‬
‫;‪int no‬‬
‫;]‪char name [20‬‬
‫;]‪char address[20‬‬
‫;}‬
‫;‪struct student std1,std2‬‬
‫اإلعالن عن المتغير المركب‬
‫الطريقة الثانية‪:‬‬
‫يمكن االستغناء عن كلمة ‪ struct‬إذا تم اإلعالن مسبقا عن التركيب‪،‬‬
‫كما في المثال التالي‪:‬‬
‫;‪student s1‬‬
‫;‪emp e1‬‬
‫اإلعالن عن المتغير المركب‬
‫الطريقة الثالثة‬
‫يمكن الدمج بين تعريف التركيب وبين التصريح عن المتغيرات في‬
‫عبارة واحدة كما يلي ‪:‬‬
‫‪struct student‬‬
‫{‬
‫;‪int no‬‬
‫;]‪char name [20‬‬
‫;]‪char address[20‬‬
‫;‪} std1, std2‬‬
‫التعامل مع حقول التركيب‬
‫يتم التعامل مع حقول التركيب كالقراءة والطباعة في البرنامج‬
‫باستخدام النقطة (‪).‬‬

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

struct students{
int num;
char name[20];
int age;
string address;
double phone;
date birthdate; ‫هو حقل من نوع التركيب‬
}; date
‫تمهيد‬
‫الفرق بين التركيب والمصفوفة ‪:‬‬

‫•التركيب ال يستطيع خزن بيانات أكثر من سجل واحد‪.‬‬

‫•مصفوفة من التراكيب يتم خزن بيانات بشكل دائم والوصول لها‬


‫عند الحاجة‪.‬‬
‫تعريف مصفوفة التركيب‬
‫لتمثيل شعبة من الطلبة في مقرر ما فإننا نستطيع استخدام مصفوفة‬
‫من التراكيب من نوع ‪ Student‬يمثل كل عنصر فيها طالباً‪،‬‬
‫بحيث يتكون سجل كل طالب من عدة حقول مختلفة‪.‬‬
‫مثال‪:‬‬
‫;]‪struct Student CS[50‬‬
‫لمعالجة أي تركيب في هذه المصفوفة يكتب اسم المصفوفة ورقم التركيب‬
‫داخل اقواس مربعة مثل ]‪.CS [50‬‬
‫التعامل مع حقول مصفوفة التركيب‬
‫يتم التعامل مع حقول التركيب كالقراءة والطباعة في البرنامج‬
‫باستخدام النقطة (‪).‬‬

‫مثال‪:‬‬
‫;‪CS[5].no=100‬‬
‫;”‪Cs[5].address=“jenin‬‬
‫;"‪CS[5].name="ali‬‬
‫;"‪CS[5].tel="123456‬‬
‫التعامل مع عناصر مصفوفة التركيب‬
‫مثال‪:‬‬
‫المقطع البرمجي التالي يوضح كيفية استخدام المصفوفة ‪ CS‬من خالل دالة‬
‫‪ ،function‬وأطلقنا عليها اسم ‪ Average‬والتي ستقوم بحساب الوسط الحسابي‬
‫لعالمات ‪ N‬من الطلبة وتعيد المجموع‪:‬‬
‫{)‪float Average (student* St , int N‬‬
‫;‪float sum=0.0‬‬
‫;‪int I‬‬
‫)‪For (i=0;i<=N; i++‬‬
‫;‪Sum+=St[i].Grade‬‬
‫};‪Return sum/N‬‬
‫التعامل مع حقول مصفوفة التركيب‬

‫يتم استدعاء البرنامج السابق عن طريق جملة االستدعاء التالية‪:‬‬

‫;)‪float av= Average(CS, 50‬‬


‫ما هو الصنف ‪ Class‬في لغة ‪C++‬؟‬
‫مميزات الصنف ‪Class‬‬
‫يتميز الصنف في ‪ C++‬بالمالمح األربعة التالية ‪-:‬‬
‫‪ ‬اسم الصنف ‪ :‬يعمل كنوع البيانات الذي ستمثله الصنف‪.‬‬
‫‪ ‬مجموعة من األعضاء البيانية في الصنف)‪((data members‬المنتمية) ‪:‬حيث يمكن أن‬
‫تحتوى الصنف على صفر أو أكثر من أي نوع من أنواع البيانات في ‪. C++‬‬
‫‪ ‬مجموعة من األعضاء الدالية )‪((member functions‬المنتمية) ‪ :‬تمثل مجموعة‬
‫العمليات التي سيتم تنفيذها على كائنات الصنف‪.‬‬
‫‪ ‬محددات وصول )‪ :(access specifiers‬تكتب قبل األعضاء البيانية واألعضاء الدالية‬
‫لتحدد إمكانية الوصول إلى هذه األجزاء من األجزاء األخرى في البرنامج‪.‬‬
‫األصناف والتراكيب‬

‫‪ ‬يعد الفرق الرئيسي بين األصناف والتراكيب هو أن األول ال يعرف فقط حزمة‬
‫يعرف الدوال الالزمة لمعالجة هذه‬
‫من الحقول مثل التراكيب ولكن أيضا ّ‬
‫الحقول‪.‬‬
‫تعريف الصنف ‪Class‬‬
‫‪ ‬يتألف تعريف الصنف من الكلمة األساسية ‪ class‬يليها اسم الصنف ثم جسم‬
‫الصنف بين قوسين حاصرين } { ويجب أن ينهي تعريف الصنف بفاصلة‬
‫منقوطة أو عبارة إعالن عن كائنات تنتمي إلى الفئة كما في المثال التالي‪:‬‬

‫;} ‪class anyclass { /* class body*/‬‬


‫أو‬
‫;‪class anyclass { /* class body */ } obj1, obj2‬‬
‫تعريف الصنف ‪Class‬‬
‫غالبا ما يكتب الصنف في ‪ C++‬على النحو التالي في البرنامج ‪:‬‬
‫{‪class class_name‬‬
‫‪private:‬‬
‫‪data members‬‬
‫‪public:‬‬
‫‪member functions‬‬
‫;}‬

‫‪‬إن مواصفففات الصففنف ال تففىدي إلففى إنشففاء أي كففائن‪ ،‬بففل سففتقوم فقففط بتحديففد كي فف سففيبدو‬
‫الكائن عند إنشاءه‪.‬‬
Class ‫تعريف الصنف‬
: 1 ‫مثال‬

-:stack ‫المثال التالي يوضح كيفية تعريف صنفي يدعى‬


// This creates the class stack >
class stack {
private:
int stck[SIZE];
int tos;
public:
void init ( );
void push(int i);
int pop ( );
};
‫المكدس )‪(stack‬‬
‫)‪ :(stack‬ه ففو ن ففوع م ففن بني ففات التخف فزين(تراكي ففب البيان ففات) يسف فتخدم‬ ‫‪‬المك ففد‬
‫عنففدما نريففد الوصففول إلففى خففر عنصففر تففم تخزينففه ‪ .‬يشففار إلففى هففذه البنيففة عففادة‬
‫‪ lifo‬اختصا ار لف ‪ last in first out‬والتي تعنى (المدخل خ ار هو المخرج أوال)‪.‬‬

‫تستطيع المكدسات )‪ (stacks‬تخزين أي نوع من البيانات ‪ .‬لكن كما هو الحفال‬


‫خليطففا‬ ‫نوعففا واحففدا مففن البيانففات ‪ ،‬ولكففن لففي‬ ‫مففع المصفففوفات يخففزن كففل مكففد‬
‫من األنواع‪.‬‬
‫تعريف الصنف ‪stack‬‬

‫‪،‬‬ ‫‪ ،‬يقففال أننففا دفعناهففا )‪ (push‬فففي المكففد‬ ‫عنففدما نضففع قيمففة فففي المكففد‬
‫وعنففدما نخففرج القيمففة منففه يقففال أننففا سففحبناها )‪ .(pop‬يبففين الشففكل التففالي كيففف‬
‫يبدو هذا‪:‬‬
‫تعريف الصنف ‪stack‬‬
‫داخل جسم الصنف ‪ stack‬يتم اإلعالن عن األعضاء البيانية‬
‫المنتمية واألعضاء الدالية المنتمية ومحددات الوصول لها وفيما‬
‫يلي سنتعرف على هذه األجزاء ‪:‬‬
‫;]‪int stck[SIZE‬‬
‫;‪int tos‬‬
‫االعالن عن الدوال المنتمية‪:‬‬
‫;) ( ‪void init‬‬
‫;)‪void push (int i‬‬
‫;) ( ‪int pop‬‬
class ‫تعريف الصنف‬
: 2 ‫مثال‬
class Rectangle{
private:
int x, y;
public:
void setValues( int, int );
int area(){ return ( x * y ); }
};
void Rectangle::setValues( int a, int b ){
x = a;
y = b;
}
: 3 ‫مثال‬
• #include <iostream>

• using namespace std;

• class Box

• {

• public:

• double length; // Length of a box

• double breadth; // Breadth of a box

• double height; // Height of a box

• };

• int main( )

• {

• Box Box1; // Declare Box1 of type Box

• Box Box2; // Declare Box2 of type Box

• Box Box2; // Declare Box2 of type Box

• double volume = 0.0; // Store the volume of a box here


: 3 ‫تابع مثال‬
// box 1 specification

Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// box 2 specification
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// volume of box 1
volume = Box1.height * Box1.length * Box1.breadth;
cout << "Volume of Box1 : " << volume <<endl;
// volume of box 2
volume = Box2.height * Box2.length * Box2.breadth;
cout << "Volume of Box2 : " << volume <<endl;
return 0;
‫األهداف‬
‫يتوقع منك عزيزي الطالب بعد مشاهدة الفيديو أن‪:‬‬
‫تنشئ كائنات من األصناف‪.‬‬ ‫‪‬‬
‫تستخدم الكائنات في لغة ‪.C++‬‬ ‫‪‬‬
‫إنشاء مثيالت (كائنات) من الصنف‬
‫يمكن إنشاء الكائنات باستعمال نف التركيب المستخدم إلنشاء متغير من نوع‬
‫‪ int‬مثال وذلك أن الكائنات في ‪ C++‬تتم معاملتها كأنواع‬ ‫أساسي كف‬
‫متغيرات كما تتم معاملة الفئات كأنواع بيانات وعليه إلنشاء كائن تابع للفئة‬
‫‪ stack‬نكتب‪-:‬‬
‫;‪stack stack1‬‬
‫عند تنفيذ العبارة يحسب البرنامج حجم الكائن ويخصص مساحة كافية‬
‫له من الذاكرة ويعطى مساحة الذاكرة هذه اسما ‪. stack1‬‬

‫الطريقة يمكننا إنشاء قدر ما نشاء من الكائنات ‪-:‬‬ ‫وبنف‬


‫;‪stack stack1, stack2 ,stack3‬‬
‫كيف نتعامل مع الكائنات؟‬
‫يتم التفاعل مع الكائنات من خالل استدعاء أحد أعضاءها الدالية والثاني‬
‫يبدو كإرسال رسالة إلى الكائن‪ .‬نحتاج إلى تركيب مىلف من قسمين ‪:‬‬
‫اسم الكائن واسم العضو الدالة‪ ،‬ويتم ربط اسم الكائن واسم الدالة بواسطة‬
‫نقطة(‪ ).‬التي تسمى عامل الوصول إلى أعضاء الصنف‪.‬‬

‫مثال‪:‬‬
‫;)‪stack1.push (100‬‬

‫حيث هنا تم استدعاء الدالة ‪ push‬من خالل الكائن ‪ stack1‬وتمرير القيمة‬


‫العددية الصحيحة ‪ 100‬لها‪.‬‬
‫عامل دقة المدى‬
‫‪scope resolution operator‬‬
‫يففتم ربففط اسففم الدالففة مففع اسففم الصففنف باسففتعمال مففا يسففمى بعامففل دقففة المففدى‪.‬‬
‫يتألف هذا العامل من نقطتين مزدوجتين ‪::‬‬

‫المثال التالي يوضح تعريف الدالة ‪ Push‬التي تنتمي إلى الصنف ‪. stack‬‬
‫)‪void stack::push(int i‬‬
‫{‬
‫{ )‪if(tos==SIZE‬‬
‫;”‪cout << “stack is full.\n‬‬
‫;‪return‬‬
‫}‬
‫;‪stck[tos] = i‬‬
‫;‪tos++‬‬
‫}‬
stack1 ‫ عن طريق الكائن‬stack ‫ امثلة على استدعاء الدوال المنتمية للصنف‬

stack1.init ( );
stack2.init ( );
stack1.push (1);
stack2.push (2);
stack1.push (3);
stack2.push (4);
‫األهداف‬
‫يتوقع منك عزيزي الطالب بعد مشاهدة الفيديو أن‪:‬‬
‫‪ ‬تعرف محددات الوصول إلى أعضاء الصنف‪.‬‬
‫‪ ‬تقارن بين محددات الوصول إلى أعضاء الصنف‪.‬‬
‫الوصول إلى أعضاء األصناف‬
‫‪Access Modifiers‬‬
‫يتم تحديد إمكانية الوصول إلى أعضاء الصنف (متغيرات‪ ،‬أعضاء‬
‫دوال) باستخدام أربع كلمات أساسية(محددات الوصول) في ‪C++‬‬
‫وهي‪:‬‬
‫‪( public ‬عام)‪.‬‬
‫‪( private‬خاص)‪.‬‬
‫‪( protected‬محمي)‪.‬‬
‫‪( friend‬صديق)‪.‬‬
‫والتي تتم كتابتها داخل جسم الفئة تليها نقطتان) ‪.( :‬‬
‫الوصول إلى أعضاء األصناف‬
‫‪Access Modifiers‬‬

‫العضو العام ‪public‬في الصنف يمكن الوصول إليه من أي مكان داخل البرنامج‪.‬‬ ‫‪.1‬‬
‫العضو المحمي ‪ protected‬في الصنف يمكن الوصول إليه فقط من فئته أو الفئات‬ ‫‪.2‬‬
‫المشتقة منها ‪.‬‬
‫العضو الخاص ‪ private‬يمكن الوصول إليه فقط من األعضاء الدوال المعرفة في صنفه‬ ‫‪.3‬‬
‫(المنتمية له)‪.‬‬
‫العضو الصديق ‪ friend‬يمكن الوصول إليه فقط من األعضاء الدوال المعرفة في صنفه أو‬ ‫‪.4‬‬
‫األصناف الصديقة لها‪.‬‬
‫الوصول إلى أعضاء األصناف‬
‫‪Access Modifiers‬‬
‫تذكر ‪:‬‬
‫إذا لم يتم ذكر محدد وصول لعضو في فئة ما سيفترض المترجم أن محدد الوصول لهذا‬ ‫‪.1‬‬
‫العضو هو‪. private:‬‬

‫‪c++‬‬ ‫كل البيانات خاصة وكل األعضاء الدالية عامة‪ ،‬وهذه هي الحالة العامة في‬ ‫‪.2‬‬
‫ألننا نريد أن نخفى البيانات عن العالم الخارجي ال يمكن أن تكون محمية ‪ ،‬بينما نريد‬
‫أن تكون األعضاء الدوال عامة حتى تستطيع األجزاء األخرى من البرنامج استدعائها‪.‬‬
‫األهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن يكون قاد ار على أن‬


‫يعرف الدوال المنتمية في لغة ‪.C++‬‬
‫الدوال المنتمية في لغة ‪C++‬‬

‫مجموعة من األعضاء الدالية )‪((member functions‬المنتمية) المعلن‬


‫عنها داخل الصنف وهي تمثل مجموعة العمليات التي سيتم تنفيذها‬
‫على كائنات الصنف‪.‬‬
‫الدوال المنتمية في لغة ‪C++‬‬
‫مثال ‪:‬‬

‫يوضح المثال التالي كيفية اإلعالن عن صنف يدعى ‪ stack‬وثالث دوال منتمية للصنف‪-:‬‬
‫> ‪// This creates the class stack‬‬
‫{ ‪class stack‬‬
‫‪private:‬‬
‫;]‪int stck[SIZE‬‬
‫;‪int tos‬‬
‫‪public:‬‬
‫;) ( ‪void init‬‬
‫;)‪void push(int i‬‬ ‫جمل تعريف دوال الصنف الثالثة‬
‫;) ( ‪int pop‬‬
‫;}‬
‫الدوال المنتمية في لغة ‪C++‬‬
‫مثال‪:‬‬
‫يوضفح المثفال التفالي تعريفف (كتابفة) الدالفة ‪ Push‬التفي تنتمفي إلفى‬
‫الصنف ‪ stack‬وذلك بعد اإلعالن عنها في مقطع تعريف الصنف‪:‬‬

‫)‪void stack::push(int i‬‬


‫{‬
‫{ )‪if(tos==SIZE‬‬
‫;”‪cout << “stack is full.\n‬‬
‫;‪return‬‬
‫}‬
‫;‪stck[tos] = i‬‬
‫;‪tos++‬‬
‫}‬
C++ ‫الدوال المنتمية في لغة‬
:‫مثال‬

:‫ ودواله المنتمية‬Rectangle ‫المثال التالي عملية تعريف الصنف‬


class Rectangle{
private:
int x, y;

public:
void setValues( int, int );
int area(){ return ( x * y ); }
};

void Rectangle::setValues( int a, int b ){


x = a;
y = b;
}
C++ ‫الدوال المنتمية في لغة‬
:‫مثال‬-‫تابع‬
int main(){
Rectangle rect, rectb;
rect.setValues( 3, 4 );
rectb.setValues( 5, 6 );
cout << "rect area: " << rect.area() << endl;//cout and endl comes from
namespace
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
‫األهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن يوضح المقصود‬


‫بمصطلح (البناىون) في لغة ‪.C++‬‬
‫البناؤون‬

‫كيف يمكن إعطاء قيمة ابتدائية ‪ initial values‬للمتغيرات المنتمية إلى كائن‬
‫معين؟‬
‫أننا نستطيع إعطاء المتغير ‪ MonthRentVal‬الخاص بالكائن ‪ p1‬القيمة‬
‫‪ 200.0‬بكتابة الجملة ‪:‬‬
‫;‪p1.MonthRentVal=200.0‬‬
‫مالحظة ‪:‬‬
‫‪private‬‬ ‫•أن المتغير المنتمي ‪ MonthRentVal‬معرف في القسم الخاص‬
‫للصنف ‪ ،property‬وعليه فإننا ال نستطيع معالجته والتعامل معه في داخل ‪ main‬إال من‬
‫خالل الدوال المنتمية‪.‬‬
‫• يمكن التعامل معها داخل ‪ main‬لو كانت المتغيرات المنتمية إلى ‪ property‬معرفة في‬
‫الجزء العام ‪ public‬للصنف ‪.property‬‬
‫البناؤون‬

‫•في الصنف ‪ stack‬والتي تم تعريفها سابقا‪ ،‬المتغير ‪ tos‬تم تمهيد قيمته عند ‪0‬‬
‫وذلك باستعمال الدالة ) (‪.int‬‬

‫ايضا أسلوبا‬ ‫• إن تمهيد المتغير ‪ tos‬عند ‪ 0‬باستعمال دالة كف ) (‪ int‬مثال لي‬


‫مفضال في ‪ ،OOP‬أحد أسباب هذا أن المبرمج الذي يكتب الدالة ) (‪main‬‬
‫يجب أن يتذكر ضرورة استدعاء هذه الدالة كلما تم استدعاء كائن تابع للفئة‬
‫‪ ،stack‬لذلك تسمح ‪ C++‬للكائنات بتمهيد نفسها عند إنشائها هذا التمهيد يتم‬
‫البناء‪.‬‬
‫استعمال دالة خاصة تسمى ّ‬
‫البناؤون‬
‫• البنّاء ‪ : Constructors‬هو دالة خاصة تحمل نفس اسم الصنف ويتم‬
‫استعماله لتمهيد الكائنات ‪.‬‬
‫النموذج التالي يوضح كيف تبدو الصنف ‪ stack‬عند استعمال البناء لتمهيد‬
‫المتغير ‪.tos‬‬
‫;‪const int SIZE= 100‬‬
‫{ ‪class stack‬‬
‫;]‪int stck[size‬‬
‫;‪int tos‬‬
‫‪public:‬‬
‫;) (‪stack‬‬ ‫‪constructor‬‬
‫;)‪void push (int i‬‬
‫;) (‪int pop‬‬
‫;}‬
Constructors
//example: constructor is automatically called with a new object; RectangleEG3.cpp
#include <iostream>
using namespace std;
class Rectangle{
private:
int width, height;
public:
Rectangle( int a, int b ){
width = a; height = b;
}
int area(){ return (width * height ); }
};
int main(){
Rectangle rect( 3, 4 );
Rectangle rectb( 5, 6 );
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
Overloading Constructors
#include <iostream>
using namespace std;
class Rectangle{
private:
int width, height;
public:
Rectangle(){
width = 5; height = 5;
}
Rectangle( int a, int b ){
width = a; height = b;
}
int area( void ){ return ( width * height ); }
int area( int a, int b ){ return ( a * b ); }
};
int main(){
Rectangle rect( 3, 4 ); Rectangle rectb;
cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl;
cout << "area of 5 x 5: " << rectb.area( 5, 5 ) << endl;
return 0;
}
‫األهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن يوضح المقصود‬


‫الهدامون) في لغة ‪.C++‬‬
‫بمصطلح ( ّ‬
‫الهدامون‬
‫ّ‬
‫• تستخدم دالة الهدامون ‪ Destructors‬عند انتهاء الحاجة إلى الكائن المنشأ‪.‬‬
‫• إذا كان الكائن يستخدم ذاكرة محجوزة ديناميكيا بوساطة إحدى دوال الحجز مثل‬
‫‪calloc‬و‪ ، new‬يقوم الهدام بتحرير هذه الذاكرة بحيث تتاح الفرصة الستخدامها‬
‫ألغراض أخرى‪.‬‬

‫• ال يرجع الهدامون قيمة وبالتالي ال نعرف نوعا لهذه القيمة‪ .‬ويحمل الهدام نفس اسم‬

‫الصنف الذي ينتمي إليه مسبوقا بالرمز ~‪ .‬والدالة التالية تمثل مثاال على هدام بسيط‬

‫)(‪property::~property‬‬
‫{‬
‫}‬
‫الهدامون‬
‫ّ‬
‫•يجب وضع نموذج للهدام داخل تعريف الصنف لإلشارة إلى أنها دالة‬
‫منتمية‪ .‬ويستدعى الهدام كأي دالة منتمية أخرى بكتابة اسم الكائن‪ ،‬ثم‬
‫نقطة متبوعة باسم الهدام (أي اسم الصنف مسبوقا بف ~) كما في‬
‫الجملة‪:‬‬
‫;)(‪p1.~property‬‬
‫األهداف‬
‫يتوقع منك عزيزي الطالب بعد مشاهدة الفيديو أن‪:‬‬
‫توضح المقصود بالدوال السطرية في لغة ‪.c++‬‬ ‫‪.1‬‬
Inline functions ‫الدوال السطرية‬
‫تعرف الدوال السطرية؟؟‬
‫ّ‬ ‫كيف‬
‫الطريقة األولى لتعريف الدوال السطرية‬
class property{
private:
float Area;
float MonthRentVal;
float Price;
public:
property::property()
property(float sz, float Rent, float prc);
float increase_rent(float Incr) {MonthRentVal+=Incr
return MonthRentVal ;}
float decrease_rent(float Decr);
float increase_price(float Incr);
float decrease_price(float Decr)
float yearly_rent();
float get_price() {return Price;}
float get_area();
float get_MonthRent();
};
‫الطريقة الثانية لتعريف الدوال السطرية‬

inline float increase_rent(float Incr)


{ Price+=Incr;
return Price;}
‫األهداف‬
‫يتوقع منك عزيزي الطالب بعد مشاهدة الفيديو أن‪:‬‬
‫توضح المقصود إعادة تحميل االقترانات ‪Function‬‬ ‫‪.1‬‬
‫‪ Overloading‬في لغة ‪.C++‬‬
Function Overloading
Function Overloading

:‫التعريف األول‬
int power(int x, int n)
{int p=x;
for(int i=0;i<n;i++)
p*=x;
return p;
}
Function Overloading

:‫التعريف الثاني‬
int power(int x)
{ return x*x;
}
‫‪Function Overloading‬‬
‫وعند استدعاء إحدى هذه الدوال فإن مترجم ‪ C++‬يستخدم اسم الدالة‬
‫وكذلك عدد و نوع العوامل في تحديد أي التعريفين يستخدم‪ ،‬فمثال‬
‫الجملة‬

‫;)‪cout<<power(2,3‬‬
‫‪Function Overloading‬‬
‫أما الجملة‬

‫;)‪cout<<power(2‬‬

‫فتستدعي التعريف الثاني لـ ‪power‬؛ ولذا فإن النتيجة تكون‬


‫عرض القيمة ‪ 4‬على شاشة العرض‪.‬‬
Function Overloading
class property{
private:
float Area;
float MonthRentVal;
float Price;
public:
property::property()
property(float sz, float Rent, float prc);
float increase_rent(float Incr);
float decrease_rent(float Decr);
float increase_price(float Incr);
float decrease_price(float Decr)
float yearly_rent();
float get_price();
float get_area();
float get_MonthRent();
};
‫األهداف‬
‫يتوقع منك عزيزي الطالب بعد مشاهدة الفيديو أن تستخدم الكائن‬
‫‪ cin‬في عمليات اإلدخال في لغة ‪.C++‬‬
‫اإلدخال في لغة ‪C++‬‬
‫• تزودنا لغة سي‪ ++‬بالكثير من العمليات ‪ operators‬والكثير‬
‫من الدوال الخاصة باإلدخال واالخراج باإلضافة الى تلك التي‬
‫تم استخدامها في لغة سي مثل ‪ scanf‬و ‪ printf‬وغيرها من‬
‫الدوال‪.‬‬
‫اإلدخال في لغة ‪C++‬‬
‫>‪#include<iostream.h‬‬

‫يسمى هذا بمرشد التهيئة ‪ ،Preprocessor directive‬وهو عبارة عن‬


‫تعليمة للمترجم أن يدرج كل النص الموجود في الملف ‪iostream.h‬‬
‫في البرنامج‪ ،‬وهو ملف يجب تضمينه مع أي برنامج يحتوي على‬
‫عبارات تطبع بيانات على الشاشة أو تستقبل بيانات من لوحة المفاتيح‪.‬‬
‫اإلدخال في لغة ‪C++‬‬
‫يسمى ‪ iostream‬ملف ترويسة )‪ ،(header file‬وهنالك الكثير من‬
‫ملفات الترويسة األخرى‪ ،‬فمثال نستعمل في برنامجنا داالت رياضية كف‬
‫) (‪ sin‬و) (‪ cos‬نحتاج إلى شمل ملف ترويسة يدعى ‪،math.h‬‬
‫نتعامل مع سالسل األحرف سنحتاج للملف ‪sring.h‬‬

‫تعتبر ملفات الترويسات جزء مهم من برامج لغة ‪ C++‬وسنحتاج إلى‬


‫شمل الملف ‪ iostream.h‬لتشغيل أي برنامج يقوم بعمليات إدخال‬
‫واخراج‪.‬‬
‫اإلدخال في لغة ‪C++‬‬
‫يستخدم الكائن ‪ cin‬في إلدخال قيم للمتغيرات عن طريق لوحة المفاتيح‪.‬‬
‫‪cin>>integer1‬‬

‫هذه العبارة تخزن الرقم الذي يكتبه المستخدم من لوحة المفاتيح في‬
‫متغير يدعي ‪ . integer1‬ويأخذ عامل الحصول )>>( ‪get from‬‬
‫األشياء الموضوعة على يساره ويضعها في المتغير الموجود على‬
‫يمينه‪ ،‬عند تنفيذ هذه العبارة ينتظر البرنامج أن يكتب المستخدم رقما ً من‬
‫النوع ‪ integer‬ويضغط على مفتاح ‪ ، Enter‬يتم تعيين القيمة التي‬
‫أدخلها المستخدم إلى المتغير ‪. integer1‬‬
‫اإلدخال في لغة ‪C++‬‬
‫يمكن استعمال عامل الحصول عدة مرات في نف العبارة‪:‬‬
‫‪cin >> integer1>>integer2‬‬

‫يضغط المستخدم هنا ‪ ،Enter‬أو مفتاح المسافة ‪ ،Space‬أو‬


‫مفتاح ‪ Tab‬بعد كل قيمة‪ ،‬قبل أن يكتب القيمة التالية‪ ،‬ولكنه من‬
‫األفضل عادة إدخال قيمة واحدة في كل مرة لتجنب الخطأ‪.‬‬
‫اإلدخال في لغة ‪C++‬‬
‫الكلمة المفتاحية ‪endl‬‬
‫العبارة ‪:‬‬
‫‪cout<<''sum= ''<<sum<<endl‬‬

‫تطبع النص =‪ sum‬متبوعا بقيمة ‪ ، sum‬نالحظ أننا استخدمنا‬


‫‪ endl‬وهو وسيلة أخرى في ‪C++‬لالنتقال إلى سطر جديد‪ ،‬ويسمى‬
‫مناور‪ manipulator‬و‪ endl‬اختصا ار لف ‪ ،end line‬وهو يعمل‬
‫تماما كما يعمل تتابع الهروب‪. \n‬‬
‫األهداف‬
‫يتوقع منك عزيزي الطالب بعد مشاهدة الفيديو أن‪:‬‬
‫تستخدم الكائن ‪ cout‬في عمليات اإلخراج في لغة ‪.C++‬‬ ‫‪.1‬‬
‫اإلخراج في لغة ‪C++‬‬
‫يستخدم الكائن ‪ cout‬في عرض النتائج على طريق شاشة العرض‪.‬‬

‫;'' ‪cout<<'' welcome to C+ + !\n‬‬

‫هذه العبارة )‪ (statement‬تجبر الحاسوب أن يظهر على الشاشة‬


‫النص المحصور بين عالمتي االقتباس '' '' ويسمى هذا النص ثابت‬
‫سلسلي‪.‬‬
‫اإلخراج في لغة ‪C++‬‬

‫يجب أن تنتهي كل عبارة في برنامج ‪ C++‬بفاصلة منقوطة‬


‫)‪.; (semi colon‬‬

‫االسم ‪ cout‬يمثل كائن في ‪ C++‬مقترن مع الشاشة والعامل <<والذي‬


‫يسمى بعامل الوضع ‪ Put to operator‬يجبر على إرسال األشياء‬
‫التي على يمينه إلى أي شيء يظهر على يساره‪.‬‬
‫شكل اإلخراج في لغة ‪C++‬‬

‫متغير‬
C++ ‫اإلخراج في لغة‬
:‫مثال‬
#include <iostream.h>
main ( )
{
cout << 7 << " is an integer.\n";
cout << 'a' << "is a character.\n";
}
:‫النتائج‬
7 is an integer.
a is a character
‫اإلخراج في لغة ‪C++‬‬

‫من نتائج البرنامج السابق يتضح لنا اآلتي‪:‬‬


‫‪ -1‬يتم حصر النص المطلوب ظهوره على الشاشة بين عالمتي اقتباس" ‪is‬‬
‫‪." an integer‬‬
‫‪ -2‬تتم كتابة الثوابت الرقمية بدون عالمتي اقتباس ‪.<< 7‬‬
‫‪ -3‬يتم حصر حرف واحد مطلوب ظهوره على الشاشة بعالمة اقتباس فردية‬
‫’‪.<<’a‬‬
‫‪.4‬ال ينشئ الكائن ‪ cout‬أسطرا ً جديدة تلقائيا ً‪.‬‬
‫اإلخراج في لغة ‪C++‬‬

‫الوصف‬ ‫واصف الطباعة‬


‫سطر جديد‪.‬‬ ‫‪\n‬‬
‫مسافة أفقية‪.‬‬ ‫‪\t‬‬
‫حرف التراجع ‪.back space‬‬ ‫‪\b‬‬
‫لطباعة شرطة خلفية‪.‬‬ ‫\\‬
‫حرف اإلرجاع‪ ،‬يجبر المؤشر على االنتقال إلى‬ ‫‪\r‬‬
‫بداية هذا السطر‪.‬‬
‫لطباعة عالمة اقتباس‬ ‫''\‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫المصفوفات والنصناف‬
‫مصفوفات من الكائنات‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫توضح المقصود بمصطلح قائمة ‪.List‬‬ ‫‪.1‬‬

‫تعرر ف مصفوفة من الكائنات‪.‬‬ ‫‪.2‬‬


‫مصطلح قائمة من الكائنات‬

‫هنالممك طريقتان رئيسممتان لتمثيممل قائمممة من‬


‫الكائنات‪:‬‬
‫• باستخدام المصفوفات‪ :‬حيث يمثل كل عنصر من‬
‫المصفوفة كائن من صنف ما‪ .‬ويمكن احتواء هذه‬
‫المصممفوفة مممن الكائنات مممع الدوال اللمزمة‬
‫لمعالجتها في صنف واحد‪.‬‬
‫• باسممتخدام القوائممم المتصمملة‪ :‬وتعر ف القائمة‬
‫المتص لة عل ى أنه ا مجموع ة م ن العق د‪ ،‬حيث‬
‫تحم ل ك ل عقدة‪ ،‬باس تثناء آخر عقدة‪ ،‬عنوان‬
‫العقدة التي تليها‪ .‬وتمثل كل عقدة إما كتركيب‬
‫أو ككائن من صنف ما‪.‬‬
‫مصفوفة من الكائنات‪Arrays of Objects‬‬

‫كثيرا م ا تس تخدم مص فوفات م ن الكائنات لتمثيل‬


‫قائمة ‪ list‬من اليشياء المتجانسة )من نفس النوع(‪.‬‬
‫فمثل نستخدم مصفوفة من الكائنات لتمثيل قائمة‬
‫من الكتب أو الطلبة أو الموظفين وما إلى ذلك من‬
‫قوائم‪.‬‬
Arrays of‫مصفوفة من الكائنات‬
Objects
: 1 ‫مثال‬
‫ المسجلين في‬students ‫على سبيل المثال لتمثيل قائمة من الطلبة‬
‫ كما‬student ‫ علينا أول أن نعر ف الصنف‬،‫يشعبة معينة من مادة ما‬
‫يلي‬
class student{
long stno;
int csno;
char StName[20];
public:
void initialize();
long get_stno() {return stno;}
char* get_stname(){return StName;}
};
‫مصفوفة من الكائنات‪Arrays of‬‬
‫‪Objects‬‬
‫‪‬مثال ‪: 1‬‬

‫يتضح من تعريف الصنف ‪ student‬أن لكل طالب‬


‫المتغيرات المنتمية التالية‪:‬‬
‫‪.stno .1‬ويرمز إلى رقم الطالب‬
‫‪csno .2‬ويرمز إلى عدد المواد التي أنهى الطالب‬
‫‪.‬دراستها‬
‫‪.StName .3‬ويمثل اسم الطالب )مصفوفة رمزية(‬
‫مصفوفة من الكائنات‪Arrays of‬‬
‫‪Objects‬‬
‫‪‬مثال ‪: 1‬‬
‫ك ما ي ضم تعر يف ال صنف ‪ student‬الدوال المنتمية‬
‫التالية‪:‬‬
‫البيانات ()وتستخدم هذه‬ ‫• ‪initialize‬‬
‫‪.‬الخاصة بطالب معين‬
‫وهي دالة‬
‫‪inline function‬‬ ‫سطرية ()‬ ‫• ‪get_stno‬‬
‫‪.‬تستخدم لسترجاع رقم طالب معين‬
‫وهي أيضا دالة‬
‫تستخدم ()‬ ‫• ‪get_stname‬‬
‫ل سترجاع ا سم طا لب (كا ئن) معين‪ .‬لحظ‪ ،‬عزيزي‬
‫الدارس‪ ،‬أن نوع القي مة المرجعة‪return type‬لهذه‬
‫مصفوفة *وذلك لن اس‬ ‫الدالة هو‪char‬‬
‫رمز ية ولذا فإن نا ن سترجع عنوان أول عنصر (حر ف)‬
‫‪ .  ‬بها‬
‫مصفوفة من الكائنات‪Arrays of‬‬
‫‪Objects‬‬
‫‪‬مثال ‪: 1‬‬

‫• وع لى افتراض أن نا نود تمث يل يشع بة من ‪ 50‬طالبا‪ ،‬فإننا‬


‫نستخدم الجملة التالية‪:‬‬
‫;]‪student st[50‬‬
‫• ح يث تعر ف هذه الجم لة الم صفوفة ‪ st‬من ‪ 50‬طالبا‪.‬‬
‫وكالعادة فإن ]‪ st[0‬يمثل أول طالب في المصفوفة وأن‬
‫]‪ st[49‬يمثل الطالب الخير (رقم ‪ )50‬في المصفوفة‪.‬‬

‫‪ ‬‬
‫مصفوفة من الكائنات وبناءات‬
‫الصنف‬
‫ع ند تعر يف م صفوفة من الكائنات ‪ objects‬فإن البناء‬
‫‪ constructor‬الخاص بصنف هذه الكائنات‪ ،‬إن وجد‪،‬‬
‫يستدعى لعطاء كل كائن قيمة ابتدائية‪ .‬وعليه فإن الجملة‬
‫]‪;student st[50‬‬
‫صحيحة فقط إذا ‪:‬‬
‫‪ .1‬لم يكن هنالك بناء معر ف للصنف ‪ student‬كما هو الحال‬
‫في مثالنا‪  .‬‬
‫‪ .2‬إذا كان هنالك بناء ليس له عوامل أو أن هنالك قيم‬
‫تلقائية ‪ default values‬معرفة لهذه العوامل كما ناقشنا في‬
‫الوحدة السابقة‪  .‬‬
‫‪.‬‬

‫‪ ‬‬
‫مصفوفة من الكائنات وبناءات‬
‫الصنف‬
‫إن جملة مثل‬
‫;]‪student st[3‬‬
‫ما هي في حقيقة المر إل اختصار للجملة‬
‫})(‪student st[3]={student(),student(),student‬‬
‫والتي تعني أن العناصر ]‪ st[0‬و ]‪ st[1‬و ]‪ st[2‬تعطى قيما‬
‫ابتدائية باستدعاء البناء ‪( )(student‬دون عوامل) لكل منها‪.‬‬
‫‪.‬‬

‫‪ ‬‬
‫مصفوفة من الكائنات وبناءات‬
‫الصنف‬
‫أما في حالة وجود البناء‬
‫)‪student::student(long s‬‬
‫};‪{stno=s‬‬
‫والذي يأ خذ عامل واحدا يستخدمه لعطاء المتغير المنتمي‬
‫‪ stno‬قيمة ابتدائية ( أما بقية المتغيرات المنتمية فتبقى دون‬
‫ق يم ابتدائ ية) ‪ ،‬فان هنا لك طريقتان صحيحتان لتعريف‬
‫المصفوفة بوجود هذا البناء‪ .‬إما أن نكتب‬
‫;}‪student std[3]={96010,97030,98060‬‬
‫أو نكتب‬
‫‪ ‬‬
‫;})‪student std[3]={student(96010),student(97030),student(98060‬‬
‫حيث ان الجملة الولى اختصار للجملة الثانية‪.‬‬
‫‪ ‬‬
‫مصفوفة من الكائنات والدوال‬
‫المنتمية‬
‫وت ستخدم الكائنات الم صفوفة بش كل فردي ( أي عنصرا‬
‫عنصرا) من خلل الدوال المنتمية المعرفة للصنف ‪.student‬‬
‫فمثل الجملة‬
‫‪ ‬‬
‫;)(‪st[5].initialize‬‬
‫تستدعي الدالة ‪ )(initialize‬الخاصة بالصنف ‪ student‬على‬
‫الكا ئن ال سادس‪ .‬أي أن هذه الدا لة ستقوم بقرا ءة قيم‬
‫للمتغيرات المنتمية الخاصة بالكائن السادس‪.‬‬
‫ولقراءة قيم لجميع عناصر المصفوفة المائة نستدعي الدالة‬
‫‪ )(initialize‬لكل من هذه الكائنات داخل جملة دوران كما‬
‫يلي‬

‫)‪for(int I=0;I<100;I++‬‬
‫;)(‪st[I].initialize‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫تعرر ف مص فوفات باعتباره ا متغيرات منتمي ة داخل‬ ‫‪.1‬‬


‫الصنف‪.‬‬
‫المصفوفات باعتباردها متغيرات‬
‫منتمية‬
‫لقد رأينا‪ ،‬عزيزي الطالب‪ ،‬كيف يمكن أن تحتوي‬
‫المصفوفات على كائنات‪ ،‬والسؤال الن هل يمكن‬
‫أ ن يحدث العكس ‪ .‬أ ي أ ن يحتوي كائ ن م ا على‬
‫مصفوفة كمتغير منتم؟ للجابة على هذا السؤال‬
‫تأمل تعريف الصنف ‪ student‬الذي قمنا بتعريفه‬
‫سابقا ا ‪:‬‬
‫{‪class student‬‬ ‫المتغير هو ‪ StName‬الذي هو في حقيقة المر مصفوفة من‬
‫الحرف‪.‬‬
‫;‪long stno‬‬
‫;‪int csno‬‬
‫;]‪char StName[20‬‬
‫‪public:‬‬
‫;)(‪void initialize‬‬
‫};‪long get_stno() {return stno‬‬
‫المصفوفات باعتباردها متغيرات‬
‫منتمية‬
‫والجواب على السؤال السابق بالطبع نعم‪.‬‬
‫وق د س بق أ ن رأين ا ف ي تعري ف الصنف‬
‫‪ student‬متغيرا ا منتميا ا هممو فممي الواقع‬
‫مص فوفة م ن العناص ر وذل ك المتغي ر هو‬
‫‪ StName‬الذي هممو فممي حقيقممة المر‬
‫مصفوفة من الحر ف‪.‬‬
‫المصفوفات باعتباردها متغيرات‬
‫منتمية‬
‫وسنضيف الن إلى تعريف الصنف ‪student‬‬
‫مصممفوفة أخرى‪ ،grades ،‬كمتغيممر منتم‬
‫يمثل علمات الطالب في المواد التي أنهى‬
‫دراستها‪ .‬وسنضيف دالتين منتميتين لمعالجة‬
‫هذه المصفوفة‪:‬‬
‫‪average .1‬وتس تخدم هذه الدالة )(‬
‫‪.‬لحساب معدل علمات طالب ما )كائن(‬
‫‪get_grade(int i) .2‬وتستخدم هذه‬
‫الدالة لسترجاع العلمة‪. i‬لطالب معين‬
‫المصفوفات باعتباردها متغيرات‬
‫منتمية‬
:‫ بعد هذه الضافات كما يلي‬student ‫وهكذا يصبح تعريف الصنف‬

class student{
long stno;
int csno;
double grades[100];
char StName[20];
public: ‫المنتمية‬ ‫ للدوال‬Prototype
‫للدوال المنتمية‬ Prototype‫اا‬
double average(); ‫بعلمات‬
‫الخاصة بعلمات‬
‫المصفوفة الخاصة‬
‫لمعالجة المصفوفة‬
‫لمعالجة‬
void initialize(); ‫الطلب‬
‫الطلب‬
long get_stno() {return stno;}
char* get_stname(){return StName;}
double get_grade(int i);
};
.
‫المصفوفات باعتباردها متغيرات‬
‫منتمية‬
‫وتعر ف الدالة المنتمية ‪ ()average‬كما يلي‪:‬‬

‫)(‪double student::average‬‬
‫;‪{ double sum=0.0‬‬
‫)‪for(int i=0;i<csno;i++‬‬
‫;]‪sum=sum+grades[i‬‬
‫;‪return sum/csno‬‬
‫}‬
‫وتس تخدم هذه الدال ة لحس اب معدل طال ب معي ن فمثل الجملة‬
‫التالية تستدعي ‪ ()average‬لحساب معدل الطالب الخامس في‬
‫المصفوفة ‪ ، st‬حيث تخزن القيمة المسترجعة في المتغير ‪:x‬‬
‫;)(‪double x=st[4].average‬‬
‫المصفوفات باعتباردها متغيرات‬
‫منتمية‬
‫وتعر ف الدالة ‪ ()get_grade‬كما يلي‪:‬‬
‫{ )‪ double student::get_grade(int i‬‬
‫)‪if (i<csno&& i>=0‬‬
‫;]‪return grades[i‬‬
‫‪else‬‬
‫} ;‪return -1‬‬
‫‪ ‬لحظ‪ ،‬عزيزي الطالب أن هذه الدالة تقوم بالتأكد من أن‬
‫رق م العلم ة المطلوب ة والممثل ة بالعام ل ‪ i‬تق ع بين ‪ 0‬و‬
‫‪ csno-1‬فإ ن تحق ق هذا الشرط تس ترجع لن ا العلمة‬
‫المطلوبة وإل فإنها تعيد لنا القيمة ‪ 1-‬للدللة على أن رقم‬
‫العلمممة المطلوبممة غيممر صممحيح‪ .‬فمثل لطباعممة العلمة‬
‫الخامس ة للطال ب الثان ي ف ي المص فوفة ‪ st‬نستخدم‬
‫الجملة‪:‬‬
‫;)‪cout<<st[1].get_grade(4‬‬
‫المصفوفات باعتباردها متغيرات‬
‫منتمية‬
‫وبالط بع علي نا تعد يل الدا لة ‪ )(initialize‬بحيث تقرأ أيضا‬
‫علمات الطا لب وتخزن ها في الم صفوفة المنتمية ‪.grades‬‬
‫بحيث يصبح كما يلي‪:‬‬
‫‪)(void student::initialize ‬‬
‫{‬
‫;"‪cout<<"enter student's number‬‬
‫;‪cin>>stno‬‬
‫;" ‪cout<<"enter student's name‬‬
‫;‪cin>>StName‬‬
‫;"‪cout<<"enter no. of courses taken by the student‬‬
‫;‪cin>>csno‬‬
‫)‪for(int i=0;i<csno;i++‬‬
‫;‪{cout<<"enter grade no."<<i+1‬‬
‫} } ;]‪cin>>grades[i‬‬
‫ل حظ‪ ،‬عزيزي الدارس‪ ،‬أن نا أضف نا إ لى هذه الدا لة جملة‬
‫دوران ‪ for‬لقراءة العدد المطلوب من العلمات لكل طالب‪.‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫ان تتعر ف على كيفية تمرير مصفوفة من الكائنات‬ ‫‪.1‬‬


‫الى دالة غير منتمية‪.‬‬
‫الدوال ومصفوفات الكائنات‬
‫‪ ‬تذكر عزيزي الطالب انه يمكن تمرير مصفوفة‬
‫كوسيطة لدالة وذلك بذكر اسم المصفوفة‪.‬‬
‫مثل ا إذا تممممم العلن عممممن مصفوفة‬
‫‪ hourlyTemperature‬كالتي‪-:‬‬
‫;]‪int hourlyTemperatures[24‬‬
‫عبارة استدعاء الدالة‪-:‬‬
‫‪modify_Array(Int‬‬
‫;)‪hourlyTemperatures,24‬‬
‫‪ ‬‬
‫تمرر المصفوفة ‪ hourlyTemperature‬وحجمها‬
‫كوسائط للدالة ‪.modify Array‬‬
‫الدوال ومصفوفات الكائنات‬
‫‪ ‬تذك ر عزيزي الطال ب ان تمري ر المص فوفة إلى‬
‫دال ة معين ة يت م من خلل العنوان ‪address‬‬
‫الخاص بأول عنصر في المصفوفة والممثل باسم‬
‫المصفوفة مجردا من أي مؤيشر‪.‬‬
‫‪ ‬وتذكر أيضا ا أنه عند تمرير مصفوفة ما كوسيطة‬
‫لدالة يجب تمرير حجم المصفوفة حتى يتسنى‬
‫للدالة معالجة كل عناصر المصفوفة‪.‬‬

‫‪modify_Array(Int‬‬
‫)‪;hourlyTemperatures,24‬‬
‫‪.‬اسم المصفوفة مجردا من أي مؤشر‬ ‫‪‬حجم المصفوفة حتى يتسنى للدالة معالجة‬
‫كل عناصر المصفوفة‪.‬‬
‫الدوال ومصفوفات الكائنات‬
‫وم ا ذك ر س ابقا ا ينطب ق تمام ا على‬
‫المصممفوفات المكونممة من كائنات‬
‫‪ .arrays of objects‬حيممث يمكن‬
‫تمري ر مص فوفات م ن الكائنات الى‬
‫دوال غي ر منتمي ة للص نف‪ ،‬وسنتناول‬
‫عدة امثل ة حول ذل ك وسنبدأ بالمثال‬
‫البسيط التالي‪:‬‬

‫;}‬
‫الدوال ومصفوفات الكائنات‬
class student{
long stno;
int csno;
double grades[100];
char StName[20];
public:
double average();
void initialize();
long get_stno() {return stno;}
char* get_stname(){return StName;}
double get_grade(int i);
};
‫الدوال ومصفوفات الكائنات‬
‫عل ى س بيل المثال الدال ة التالي ة تج د لنا معدل‬
‫معدلت الطلبة في الشعبة )المصفوفة( كاملة‪.‬‬
‫)لح ظ أ ن هذا يختل ف ع ن معدل علمات جميع‬
‫الطلبة في الشعبة(‪.‬‬
‫)‪double SectionAv(student* ar, int n‬‬
‫;‪{ double sum=0‬‬
‫)‪for(int i=0;i<n;i++‬‬
‫;)(‪sum+=ar[i].average‬‬
‫;‪return sum/n‬‬
‫}‬
‫الدوال ومصفوفات الكائنات‬
‫من المهم أن تلحظ‪ ،‬عزيزي الطالب ما يلي‪:‬‬
‫‪ .1‬أن هذه الدالة غير منتمية للصنف ‪ student‬و عليه يجب‬
‫عليها أن تتعامل مع الكائنات من الصنف ‪ student‬من‬
‫خلل الدوال المعرفة عليها مثل الدالة ‪.)(average‬‬
‫‪ .2‬أن العامل ‪ ar‬يمثل عنوان ‪ address‬لكائن من نوع‬
‫‪ ،student‬إذ أن نا سنستخدمه لتمر ير عنوان أول عنصر‬
‫في المصفوفة‪.‬‬
‫‪ .3‬عندما نستدعي هذه الدالة فإننا نرسل اسم المصفوفة‬
‫مجردا من أي مؤيشر وعدد الطلبة في المصفوفة‪ .‬فمثل‬
‫ليجاد معدل معدلت الطل بة في الم صفوفة ‪ stu‬والتي‬
‫تحتوي ع لى ‪ 40‬طالبا فإننا نستدعي الدالة ‪SectionAv‬‬
‫كما في الجملة‬
‫)‪double x=SectionAv(stu,40‬‬
‫}‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫ان تتعر ف على كيفية ترتيب مصفوفة من الكائنات‬ ‫‪.1‬‬


‫باستخدام الفرمز النتقائي ‪.Selection Sort‬‬
‫الفرز التنتقائي ‪Selection Sort‬‬
‫‪ ‬كأمثل ة أخرى عل ى الدوال الت ي تستخدم‬
‫مصفوفة من الكائنات سندرس كيف يمكن‬
‫ترتي ب )فرمز( مص فوفة م ن ‪ n‬م ن الطلبة‬
‫ترتيبا تصاعديا حسب حقل معين‪.‬‬
‫‪ ‬هناك عدة خوارمزميات للفرمز‪ ،‬ومن ايشهرها‬
‫‪ :‬الفرمز الفقاعي والفرمز النتقائي‪.‬‬
‫‪ ‬س نتناول ف ي هذه الجلس ة كيفي ة تمرير‬
‫مص فوفة م ن الكائنات ال ى دالة تقوم‬
‫بالفرمز النتقائي‪.‬‬
‫خوارزمية الفرز التنتقائي‬
‫‪Selection Sort‬‬
‫س نستخدم خوارمزمي ة الفرمز النتقائي ‪selection‬‬
‫‪ sort‬وهي خوارمزمية بسيطة جدا تقوم على فكرة‪:‬‬
‫‪ ‬إيجاد أقل قيمة ثم استبدالها بالقيمة الموجودة‬
‫في بداية المصفوفة‪،‬‬
‫‪ ‬ث م تكرار العملي ة ليجاد ثان ي أص غر قيم ة في‬
‫المص فوفة ث م اس تبدالها بالقيم ة الثاني ة في‬
‫المص فوفة وهكذا نكرر الخطوات الس ابقة حتى‬
‫نضع ‪ n-1‬من العناصر في مكانهم الصحيح‪.‬‬
‫‪ ‬عندها تتوقف الخوارمزمية )لحظ عزيزي الطالب‬
‫أن العنصر رقم ‪ n‬يكون أيضا في المكان الصحيح‬
‫في هذه الحالة(‪.‬‬
‫خوارزمية الفرز التنتقائي‬
‫‪Selection Sort‬‬
‫‪ ‬ف ي المرة الول ى الت ي نقوم بالبح ث عن‬
‫أق ل قيم ة نبدأ م ن العنص ر الول في‬
‫المص فوفة ولك ي نضم ن أنن ا س نجد ثاني‬
‫أقل قيمة في المصفوفة في المرة التالية‬
‫فإننا نبدأ البحث ابتداء من العنصر الثاني‬
‫ف ي المص فوفة وف ي المرة الثالثة نبدأ‬
‫البحث ابتداء من العنصر الثالث وهكذا…‬
‫‪ ‬‬
‫خوارزمية الفرز التنتقائي‬
Selection Sort
void sort(student* st, int n)
{ for(int i=0;i<n-1;i++)
{ // find the ith minimum starting the search from the ith
// location
long min=st[i].get_stno();
int pos=i;
for(int j=i+1; j<m;j++)
if (st[j].get_stno()<min)
{min=st[j].get_stno();
pos=j;}
// swap the minimum with the ith element
student a=st[pos];
st[pos]=st[i];
st[i]=a;
} //for i
}
 
‫خوارزمية الفرز التنتقائي‬
‫‪Selection Sort‬‬
‫إن الدالة ‪ sort‬تحتوي على جملتي دوران ‪for‬‬
‫الولى تتكرر ‪ n-1‬من المرات وتتكرر داخلها‬
‫عمليتان رئيستان‪:‬‬
‫‪‬عملية إيجاد أقل قيمة‪ ،‬ويبدأ البحث في كل‬
‫مرة من الموقع ‪ i‬والذي يزداد بمقدار ‪ 1‬في‬
‫كل دورة‪ ،‬و تحديد مكان (موقع ) تلك القيمة‬
‫حيث يستخدم المتغير ‪ pos‬للحتفاظ بمكان‬
‫أقل قيمة‪.‬‬
‫‪ ‬ثم يتم استبدال الطالب صاحب أقل رقم‬
‫(أي ]‪ )st[pos‬مع العنصر ]‪.st[i‬‬
‫كيف تتم عملية إيجاد الطالب نصاحب أقل‬
‫رقم ومكاتنه؟‬
‫نفترض أن الطالب ]‪ st[i‬هو صاحب أقل رقم ‪:‬‬
‫` ;)(‪long min=st[i].get_stno‬‬
‫وعليه فأن موقع ‪ pos‬الطالب صاحب أقل قيمة هو ‪ i‬أي أن‬
‫;‪int pos=i‬‬
‫والن علينا مقارنة أقل قيمة لرقم الطالب ‪ min‬بأرقام باقي‬
‫الطلبة وفي كل مرة نجد طالب برقم أقل من ‪ min‬نجعل‬
‫‪ min‬تساوي هذه القيمة ونحتفظ بمكان الطالب ذو أقل رقم‬
‫باستخدام المتغير ‪ .pos‬وجملة الدوران الداخلية تقوم بهذه‬
‫المهمة‬
‫‪ ‬‬
‫)‪for(int j=i+1; j<m;j++‬‬
‫)‪if (st[j].get_stno()<min‬‬
‫;)(‪{min=st[j].get_stno‬‬
‫};‪pos=j‬‬
‫كيف تتم عملية إيجاد الطالب نصاحب‬
‫أقل رقم ومكاتنه؟‬
‫‪ ‬‬
‫أما عملية تبديل موقع الطالب ذو أقل رقم ]‪st[pos‬‬
‫مع العنصر ]‪ st[i‬فتتم من خلل الجمل‬
‫‪ ‬‬
‫;]‪student a=st[pos‬‬
‫;]‪st[pos]=st[i‬‬
‫‪st[i]=a; ‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫ان تتعر ف عل ى كيفي ة البح ث ع ن عنص ر في‬ ‫‪.1‬‬


‫مص فوفة م ن الكائنات باس تخدام البح ث الثنائي‬
‫‪.Binary Search‬‬
‫خوارزمية البحث الثنائي ‪Binary‬‬
‫‪Search‬‬
‫تستخدم هذه الخوارمزمية للبحث عن عنصر معين‬
‫في مصفوفة مرتبة ترتيبا تصاعديا )أو تنامزليا( إذا‬
‫عرفنا بعض البيانات الخاصة بهذا العنصر‪.‬‬
‫فمثل للبحث عن طالب معين في مصفوفة مرتبة‬
‫ترتيبا تصاعديا حسب رقم الطالب‪ ،‬يلزمنا معرفة‬
‫رقم ذلك الطالب‪ .‬وتكون نتيجة البحث تحديد موقع‬
‫الطال ب ف ي المص فوفة إ ن وج د وإ ن ل م تجد‬
‫الخوارمزمية ذلك الطالب تعيد قيمة خاصة لليشارة‬
‫إلى ذلك كالقيمة ‪ -1‬على سبيل المثال‪.‬‬
‫خوارزمية البحث الثنائي ‪Binary‬‬
‫‪Search‬‬
‫تعتمد هذه الخوارمزمية على كون المصفوفة مرتبة‬
‫ت صاعديا للب حث عن الطا لب المطلوب بطريقة ل‬
‫تتط لب إجراء العد يد من المقارنات‪ ،‬وذ لك لتقليل‬
‫ممنمم اللمزم لعملمميةمم البحث‪ .‬تقوم الخوارمزمية‬
‫الز م‬
‫بمقار نة ر قم الطا لب المراد الب حث ع نه برقم‬
‫الطالب الواقع في منتصف المصفوفة‪.‬‬
‫خوارزمية البحث الثنائي ‪Binary‬‬
‫‪Search‬‬
‫وهنالك ثلث نتائج محتملة لنتيجة المقارنة‪:‬‬
‫‪ .1‬أ ن يكون الرقمان متس اويين‪ :‬ف ي هذه الحالة‬
‫نكون قممد وجدنمما ضالتنمما وبالطبممع ترجع‬
‫الخوارمزمية موقع العنصر الواقع في منتصف‬
‫المصفوفة وتتوقف‪.‬‬
‫‪ .2‬أ ن يكون رقم الطال ب الذي نبح ث عنه أكبر‬
‫مممن رقممم الطالممب الموجود فممي منتصف‬
‫المصفوفة‪ :‬في هذه الحالة نحتاج فقط للبحث‬
‫في النصف الثاني من المصفوفة‪ ،‬وذلك لكون‬
‫المصفوفة مرتبة تصاعديا إذ ل يمكن أن نجد‬
‫الطالممب المطلوب فممي النصممف الول من‬
‫المصفوفة‪.‬‬
‫‪ .3‬أن يكون رقم الطالب الذي نبحث عنه أقل من‬
‫خوارزمية البحث الثنائي ‪Binary‬‬
‫‪Search‬‬
‫وتستمر عملية البحث في النصف الول أو النصف‬
‫الثان ي م ن المص فوفة بطريق ة مشابهة‪ .‬إذ نقارن‬
‫رق م الطال ب الذي نبح ث عن ه برق م الطال ب في‬
‫منتصف الجزء الول )أو الجزء الثاني( لتحديد الربع‬
‫الذي يق ع الطال ب الذي نبح ث عنه فيه‪ .‬وهكذا‬
‫تستمر الخوارمزمية في البحث حتى نجد الطالب أو‬
‫أن نستنتج أن الطالب ل يمكن أن يكون موجودا‬
‫في المصفوفة‪.‬‬
Binary ‫خوارزمية البحث الثنائي‬
Search
:‫ تطبق هذه الخوارمزمية‬bsearch ‫والدالة‬
// binary search
int bsearch(student* st,int n, long sn){
int lo=0;
int hi=n-1;
while (lo <= hi)
{ int mid =(lo+hi) /2;
long r=st[mid].get_stno();
if (r== sn)
return mid;
else
if (sn>r)
lo=mid+1;
else
hi = mid-1;
} //while
return -1;}
‫الية عمل دالة البحث الثنائي‬
‫‪‬تس تخدم هذه الخوارمزمي ة المتغير ‪ lo‬لليشارة‬
‫إلى رقم أول عنصر في الجزء الذي نبحث به‪،‬‬
‫والمتغي ر ‪ hi‬لليشارة إل ى رق م آخ ر عنص ر في‬
‫الجزء الذي نبحث به‪.‬‬
‫‪‬ول ن الخوارمزمي ة تبدأ البح ث ف ي المصفوفة‬
‫كاملة فإن القيمة البتدائية لم ‪ lo‬صفر و قيمة ‪hi‬‬
‫البتدائي ة ه ي ‪ ،n-1‬حي ث ‪ n‬عدد العناص ر في‬
‫المصفوفة‪.‬‬
‫‪‬وتستخدم هذه الخوارمزمية المتغير ‪ mid‬لليشارة‬
‫إلى رقم العنصر الواقع في منتصف الجزء الذي‬
‫نبحث به ولهذا فإن قيمته ‪. (lo+hi)/2‬‬
‫الية عمل دالة البحث الثنائي‬
‫‪‬لحظ‪ ،‬عزيزي الدارس‪ ،‬كيف تتغير حدود الجزء‬
‫الذي نبح ث ب ه اعتمادا عل ى نتيج ة مقارن ة رقم‬
‫الطالب الذي نبحث عنه مع رقم الطالب الواقع‬
‫ف ي منتص ف الجزء الذي نبح ث ب ه )أ ي رقم‬
‫الطال ب ]‪ .(st[mid‬فإذا كان الرق م الذي نبحث‬
‫عنه هو الكبر فإن قيمة ‪ lo‬تصبح ‪ mid+1‬وذلك‬
‫كي تستمر عملية البحث في المرحلة التالية في‬
‫النصف الثاني من الجزء الذي نبحث به‪ .‬وإل فإن‬
‫قيمة ‪ hi‬تصبح ‪ mid-1‬وذلك كي تستمر عملية‬
‫البحث في النصف الول من الجزء الذي نبحث‬
‫به‪.‬‬
‫الية عمل دالة البحث الثنائي‬
‫وتتوقف عملية البحث في حالتين ‪:‬‬
‫‪ .1‬في حالة إيجاد الطالب الذي نبحث عنه‪ ،‬وفي‬
‫هذه الحالة تعيد الدالة قيمة ‪.mid‬‬
‫‪ .2‬في حالة انتهاء جملة دوران ‪ while‬لن قيمة‬
‫‪ lo‬أصبحت أكبر من قيمة ‪ ،hi‬وهذا ممكن أن‬
‫يحصل فقط إذا لم نجد العنصر الذي نبحث عنه‬
‫داخل المصفوفة‪ .‬وفي هذه الحالة فإن الدالة‬
‫تعيد القيمة الخاصة ‪.1-‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫ان تعرر ف مصفوفة من الكائنات في صنف‪.‬‬ ‫‪.1‬‬


‫احتواء مصفوفة من الكائنات في‬
‫نصنف‬
‫لقد رأينا كيف يمكن أن نستخدم المصفوفة‪:‬‬
‫‪ .1‬كمتغيرات منتمية الى صنف‪.‬‬
‫‪ .2‬كوعاء لكائنات ‪ objects‬من صنف معين وننفذ‬
‫بعض العمليات مثل عملية الترتيب والبحث‪.‬‬
‫وفي هذا القسم سنرى استخداما ا جديدا ا‬
‫للم صفوفات‪ ،‬و سنرى ك يف يم كن أن نعر ف هذا‬
‫الوعاء كصنف ‪ class‬سندعوه ‪ section‬أي يشعبة‪ .‬أي‬
‫أن ال صنف الجد يد سيحتوي ع لى م صفوفة من‬
‫الكائنات بالضافة إلى الدوال اللمزمة لمعالجة هذه‬
‫المصفوفة‪.‬‬
‫احتواء مصفوفة من الكائنات في‬
‫نصنف‬
‫ حيث يمثل كل كائن‬، section ‫وكمثال ع لى ذ لك سنعر ف ال صنف‬
.‫ من هذا الصنف يشعبة من الطلبة في مادة ما‬object
 
class section{
student sec[50];
int size;
int bsearch(long stno);
public:
section(){size=0;}
void StAdd(student s);
int StDelete(long stno);
void Stlist();
void StRetrieve(long stno);
};
‫شرح مفصل لتعريف الصنف‬
‫‪section‬‬
‫المتغيرات المنتمية‪:‬‬
‫‪sec .1‬وه ي مص فوفة م ن الكائنات من نوع‬
‫‪ student‬تتسع لم ‪ . 50‬كائنا على الكثر‬
‫‪size .2‬ويمث ل الحج م الحقيق ي للمص فوفة‪ ،‬أي‬
‫‪.‬عدد الطلبة الفعلي في المصفوفة‬
‫شرح مفصييل لتعريييف الصنف‬
‫‪section‬‬
‫الدوال المنتمية‪:‬‬
‫‪section .1‬وهذا ه و البناء الخاص بالصنف )(‬
‫‪section‬وكل ما يفعله هو جعل قيمة المتغير ‪،‬‬
‫‪size‬ص فرا وذل ك‪ ،‬ل ن المص فوفة فارغ ة في‬
‫البداية‪ .‬وهذه الدال ة ه ي دال ة س طرية لنها‬
‫‪.‬معرفة داخل الصنف نفسه‬
‫شرح مفصييل لتعريييف الصنف‬
‫‪section‬‬
‫الدوال المنتمية‪:‬‬
‫‪bsearch(long stno). 2‬تس تخدم هذه الدالة‬
‫خوارمزمية البحث الثنائي للبحث عن طالب معين‬
‫ذي رقم معطى‪ .‬لحظ‪ ،‬عزيزي الدارس‪ ،‬أن هذه‬
‫الدال ة معرف ة ف ي القس م الخاص‪private‬من‬
‫تعريف الصنف مما يجعل استدعاءها ممكنا فقط‬
‫م ن خلل بقي ة الدوال المنتمي ة‪ ،‬فل نستطيع‬
‫استدعاءها مبايشرة من خلل‪main‬على سبيل )(‬
‫‪.‬المثال‬
‫لح ظ أيض ا‪ ،‬عزيزي الدارس‪ ،‬أ ن عوامل هذه‬
‫الدالة قد اختلفت عن عوامل ‪ bsearch‬التي كتبت‬
‫في القسم السابق‪ ،‬إذ ل نحتاج لتمرير المصفوفة‬
‫شرح مفصييل لتعريييف الصنف‬
section
:bsearch ‫اليك عزيزي الطالب النص البرمجي الخاص بالدالة‬
// binary search
int section::bsearch(long sn){
int lo=0;
int hi=size-1;
while (lo <= hi)
{ int mid =(lo+hi) /2;
long r=sec[mid].get_stno();
if (r== sn)
return mid;
else
if (sn>r)
lo=mid+1;
else
hi = mid;
} //while
return -1;}
‫شرح مفصييل لتعريييف عنانصر‬
‫الصنف ‪section‬‬
‫الدوال المنتمية‪:‬‬
‫‪StAdd(student s). 3‬وتقوم هذه الدال ة بإضاف ة طالب‬
‫‪،‬جديد‪ s‬إلى المصفوفة ‪sec،‬في الموقع المناسب بحيث‬
‫تبق ى قائم ة الطلب ة مرتب ة تص اعديا حسب أرقام الطلبة‪.‬‬
‫‪:‬وتقوم هذه الدالة بإجراء أربع خطوات رئيسة هي‬
‫• إيجاد موقع إضافة العنصر الجديد ويتم ذلك من خلل جملة‬
‫دوران ‪.while‬‬
‫• عملي ة إمزاح ة ‪ shift‬للعناص ر وذل ك لفراغ موق ع الضافة‬
‫ويت م ذل ك م ن خلل جمل ة الدوران ‪ for‬والت ي تبدأ بآخر‬
‫عنصر وتنقله إلى أول موقع يشاغر في المصفوفة‪ ،‬ثم تنتقل‬
‫إلى العنصر قبل الخير وتنقله إلى الموقع السابق للعنصر‬
‫الخير وهكذا إلى أن نحرك العنصر الموجود أصل في موقع‬
‫الضافة‪ .‬والشكل في الشريحة التالية يوضح هذه العملية‪.‬‬
‫• عملية إضافة العنصر في الموقع المخصص ‪.pos‬‬
‫شرح مفصييل لتعريييف عنانصر‬
‫‪section‬‬ ‫الصنف‬
‫الي ك عزيزي الطال ب شك ل يوض ح عملي ة الزاح ة الواجب‬
‫عملها لضافة الرقم ‪ 6‬إلى المصفوفة‪:‬‬
‫شرح مفصييل لتعريييف عنانصر‬
section ‫الصنف‬
:StAdd ‫اليك عزيزي الطالب النص البرمجي الخاص بالدالة‬
void section::StAdd(student s)
{int pos=0;
// search for the proper insertion position
while(s.get_stno() > sec[pos].get_stno() && pos<size)
pos++;
// shift element up one position
for(int i=size-1;i>=pos;i--)
sec[i+1]=sec[i];
// insert element
sec[pos]=s;
// modify size
size++;
}
‫شرح مفصييل لتعريييف عنانصر‬
‫الصنف ‪section‬‬
‫الدوال المنتمية‪:‬‬
‫‪StDelete(long stno).: 4‬وتقوم هذه الدالة بشطب طالب‬
‫معين ذي الرقم‪. stno‬المعطى كعامل للدالة‬
‫تستخدم هذه الدالة ‪ bsearch‬لتحديد موقع العنصر المراد‬
‫يشطبه‪ .‬وقبل عملية الشطب الفعلية نتأكد من أن ‪bsearch‬‬
‫ق د وج د فعل الطال ب المراد حذف ه )تذك ر بأن ‪bsearch‬‬
‫يرجع القيمة ‪ 1-‬إذا لم يجد العنصر المطلوب(‪ .‬وتتم عملية‬
‫الحذ ف بإمزاحة العناصر الواقعة في المصفوفة بعد العنصر‬
‫المراد حذف ه موقع ا واحدا إل ى اليس ار والشك ل في‬
‫الشريح ة التالي ة يوض ح هذه العملية‪ .‬وتعدل قيمة ‪size‬‬
‫بطرح ‪.1‬‬
‫تعيد هذه الدالة قيمة صحيحة أكبر من ‪ 1-‬لليشارة إلى أن‬
‫عملية الشطب تمت بنجاح‪ .‬أما إذا لم تتم عملية الشطب‬
‫بنجاح )لن الطال ب ل م يك ن موجودا أص ل( فإ ن القيمة‬
‫شرح مفصييل لتعريييف عنانصر‬
‫‪section‬‬ ‫الصنف‬
‫الي ك عزيزي الطال ب شك ل يوض ح عملي ة الزاح ة اللزمة‬
‫لحذف العنصر ‪ 5‬من المصفوفة‪:‬‬
‫شرح مفصييل لتعريييف عنانصر‬
section ‫الصنف‬
:StDelete ‫اليك عزيزي الطالب النص البرمجي الخاص بالدالة‬

int section::StDelete(long stno)


{int i=bsearch(stno);
if(i>-1)
{for(int j=i;j<size-1;j++)
sec[j]=sec[j+1];
size--;
}
return i;
}

}
‫شرح مفصييل لتعريييف عنانصر‬
‫الصنف ‪section‬‬
‫الدوال المنتمية‪:‬‬
‫‪Stlist. 5‬تقوم هذه الدالة بطباعة قائمة بأسماء الطلبة )(‬
‫الموجدين في الشعبة‪ ،‬بالضافة إلى بعض المعلومات عن‬
‫‪.‬كل منهم‬
‫‪ ‬‬
‫)(‪void section::Stlist‬‬
‫)‪{ for(int i=0;i<size;i++‬‬
‫"<<)(‪cout<<sec[i].get_stname‬‬
‫" "<<)(‪"<<sec[i].get_stno‬‬
‫;‪<<sec[i].average()<<endl‬‬
‫}‬
‫لح ظ‪ ،‬عزيزي الدارس‪ ،‬أ ن طباع ة ‪ endl‬ف ي جملة ‪cout‬‬
‫تتسبب في النتقال إلى سطر جديد‪ ،‬أي أن عملها هو نفس‬
‫عمل ‘\‪.’n‬‬
‫شرح مفصييل لتعريييف عنانصر‬
section ‫الصنف‬
:‫الدوال المنتمية‬
‫تقوم هذه الدال ة بطباعة‬StRetrieve(long stno). 6
.stno‫بع ض المعلومات الخاص ة بالطال ب ص احب الرقم‬
‫لتحديد موقع الطالب في‬bsearch‫وتستخدم هذه الدالة‬
‫المصفوفة‬:
void section::StRetrieve(long stno)
{int i=bsearch(stno);
if(i>-1) {
cout<<"Student infromation \n \t";
cout<<sec[i].get_stname()<<"
"<<sec[i].get_stno()<<" "
<<sec[i].average()<<endl; }
else
cout<<"Student no "<<stno<<" was not found
‫المقط ع ال برمجي في ‪ main‬اللزم‬
‫لتستدعاء الدوال‬
‫والبرنامج التالي يستخدم الصنف ‪ section‬لتعريف‬
‫الكائ ن)الشعب ة( ‪ ،cs100‬ثم يقوم بعرض عدة‬
‫خيارات للمس تخدم مث ل إضاف ة طال ب أ و يشطب‬
‫طال ب ويقوم ال برنامج باس تدعاء الدال ة المنتمية‬
‫المناسبة لتنفيذ المر‪ .‬ويتم تحديد الدالة المطلوب‬
‫تنفيذها من خلل جملة ‪.switch‬‬
‫ اللزم‬main ‫المقط ع ال برمجي في‬
‫لتستدعاء الدوال‬
main()
{ section cs100;
int choice;
do
{cout<<"\n\n \t Enter 1 to add a new
student \n";
cout<<"\t Enter 2 to delete a student \n";
cout<<"\t Enter 3 to some information
about a student \n ";
cout<<"\t Enter 4 to get a list of all
students \n";
cout<<"\t Enter 5 to Exit \n";
cin>>choice;
‫ اللزم‬main ‫المقط ع ال برمجي في‬
‫لتستدعاء الدوال‬
switch(choice){
case 1: // student add
student s;
s.initialize();
cs100.StAdd(s);
break;
case 2: // delete a student
long sn;
cout<<"Enter student number ";
cin>>sn;
cs100.StDelete(sn);
break;
‫ اللزم‬main ‫المقط ع ال برمجي في‬
‫لتستدعاء الدوال‬
case 3: // retrieve some data about an employee
cout<<"Enter student number ";
cin>>sn;
cs100.StRetrieve(sn);
break;
case 4: // list information about all students
cout<<"Students information \n\n";
cs100.Stlist();
break;
case 5: cout<<"End of program \n";
break;
default: cout<<"invalid choice ... Try again ";
}}
while(choice!=5);
}
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫ان توضممح المقصممود بالمؤيشرات)مؤيشرات من‬ ‫‪.1‬‬


‫التراكيب‪ ،‬مؤيشرات من الصنا ف(‪.‬‬
‫المؤشرات‬

‫‪‬تعلم‪ ،‬عزيزي الدارس‪ ،‬أن الجملة‬


‫;‪int *p‬‬
‫تعر ف المتغير ‪ p‬على أنه مؤيشر ‪ pointer‬إلى موقع‬
‫في الذاكرة ‪ memory location‬مخصص للرقام‬
‫الصحيحة‪ .‬مما يعني أننا نستطيع تخزين عنوان‬
‫‪ address‬متغير صحيح في المتغير ‪.p‬‬
‫المؤشرات‬
‫على سبيل المثال ‪:‬‬
‫;‪int k=10‬‬
‫;‪p=&k‬‬
‫فالجملة الولى تعر ف المتغير ‪ k‬على أنه من النوع‬
‫‪ .int‬والجملة الثانية تخزن عنوان المتغير ‪ k‬في‬
‫المتغ ير المؤ يشر ‪ .p‬والشكل التالي يوضح بالرسم‬
‫هذا المر‪.‬‬
‫‪k‬‬

‫‪p‬‬

‫المتغير ‪ P‬يحمل عنوان المتغير ‪ K‬أي أنه يشير إليه‪.‬‬


‫المؤشرات‬

‫مما يسمح لنا بالتعامل مع المتغير ‪ k‬من‬


‫خلل ا سمه‪ ،K ،‬أو من خلل عنوانه‬
‫المخزن في المتغير المؤيشر ‪ .p‬إذ أن *‪p‬‬
‫تع ني المتغ ير المشار إل يه من قبل‬
‫المتغير المؤيشر ‪.p‬‬
‫‪‬لحظ عزيزي الطالب ان المؤيشر هنا‬
‫يت سخدم لتخز ين عنوان متغ ير اولي‬
‫(عدد صحيح‪ ،‬حقيقي‪.. ،‬الخ)‬
‫المؤشرات والتراكيب‬

‫ون ستطيع ا ستخدام المؤيشرات مع التراك يب بنفس‬


‫الطريقة‪ .‬على سبيل المثال لنعر ف التركيب ‪ Book‬كما‬
‫يلي‬

‫{‪struct Book‬‬
‫;]‪char author[20‬‬
‫;]‪char title[20‬‬
‫;‪int pages‬‬
‫;‪float price‬‬
‫;}‬
‫المؤشرات والتراكيب‬

‫‪ ‬والن ن ستطيع تعريف المتغير المؤ يشر ‪ q‬على أنه‬


‫مؤيشر لتراكيب ‪ structures‬من نوع ‪ Book‬كما يلي‪:‬‬
‫;‪Book *q‬‬
‫مما يعني أننا نستطيع تخزين عنوان لتركيب من نوع‬
‫‪ Book‬داخله‪.‬‬
‫لنعر ف التركيب ‪: BK1‬‬
‫;‪Book BK1‬‬
‫‪ ‬والن نستطيع تخزين عنوان ‪ BK1‬في ‪ q‬كما يلي‪:‬‬
‫;‪q=&BK1‬‬
‫‪ ‬‬
‫المؤشرات والتراكيب‬
‫وعليه فإننا نستطيع التعامل مع التركيب ‪ BK1‬من خل ل اسمه أو‬
‫من خل ل التعبير *‪.q‬‬
‫تستطيع‪ ،‬عزيزي الطالب‪ ،‬أن تعتبر *‪ q‬لقبا ‪ alias‬آخر لـ ‪.BK1‬‬
‫فمثل نستطيع تخزين القيمة ‪15.5‬في الحقل )أو المتغير المنتمي(‬
‫‪ price‬الخاص بالتركيب ‪ BK1‬باستخدام الجملة‬
‫;‪BK1.price=15.5‬‬
‫أو من خل ل الجملة‬
‫;‪(*q).price=15.5‬‬
‫إذ أن كل من هاتين الجملتين تقومان بنفس العمل‪.‬‬
‫المؤشرات والتراكيب‬
‫من المهم أن تدرك‪ ،‬عزيزي الطالب‪ ،‬أن القواس في‬
‫الت عبير (*‪ price.)q‬ضرورية وذلك لن المعملية ‪ .‬لها‬
‫أولوية (أسبقية) ‪ priority‬أعلى من أولوية العملية * ‪.‬‬
‫ولتبسيط التعبير (*‪ price.)q‬نستطيع أن نستخدم ما‬
‫ي سمى بعمل ية ال سهم ‪ arrow operator‬إذ أن ‪q-‬‬
‫‪ >price‬مكافئة تماما لم (*‪. price.)q‬‬
‫أي أن نا ن ستطيع أن نك تب الجم لة التال ية كبديل‬
‫للجملتين السابقتين‬
‫;‪q->price=15.5‬‬
‫‪ ‬‬
‫المؤشرات والنصناف‬
‫وبنفس الطريقة نستطيع التعامل مع الكائنات ‪ objects‬من خل ل‬
‫المؤشرات‪ .‬فمثل نستطيع تعريف الكائن ‪ St1‬على أنه من الصنف‬
‫‪)student‬الذي سبق تعريفه في تسجيلت سابقة( كما يلي‪:‬‬
‫;‪student St1‬‬
‫ثم نستطيع تخزين عنوان المتغير ‪ St1‬في المتغير المؤشر ‪ p1‬كما‬
‫يلي‪:‬‬
‫;‪student *p1=&St1‬‬

‫لظحظ أن هذه الجملة تعرف المتغي ر ‪ p1‬على أنه مؤشر للنوع‬


‫‪ student‬وتعطيه عنوان الكائن ‪ St1‬كقيمة ابتدائية‪.‬‬
‫المؤشرات والنصناف‬
‫وعلي نا مراعاة كون المتغيرات المنتم ية للصنف‬
‫‪ student‬متغيرات خاصة ( معرفة في القسم‬
‫الخاص) لذا فإننا ل نستطيع التعامل معها من خلل‬
‫المتغ ير المؤ يشر إل دا خل الدوال المنتمية‪ .‬على‬
‫سبيل المثال ل نستطيع أن نستخدم الجملة التالية‬
‫داخل ‪main‬‬
‫;‪(*p1).stno=123‬‬
‫ونفس الشيء ينطبق على الجملة ‪:‬‬
‫;‪p1->stno=333‬‬
‫المؤشرات والنصناف‬
‫وعلي نا مراعاة كون المتغيرات المنتم ية للصنف‬
‫‪ student‬متغيرات خاصة ( معرفة في القسم‬
‫الخاص) لذا فإننا ل نستطيع التعامل معها من خلل‬
‫المتغ ير المؤ يشر إل دا خل الدوال المنتمية‪ .‬على‬
‫سبيل المثال ل نستطيع أن نستخدم الجملة التالية‬
‫داخل ‪main‬‬
‫;‪(*p1).stno=123‬‬
‫ونفس الشيء ينطبق على الجملة ‪:‬‬
‫;‪p1->stno=333‬‬
‫المؤشرات والنصناف‬
‫ولكن نا ن ستطيع أن ن ستدعي دا لة منتم ية لل صنف ‪ student‬بواسطة‬
‫المتغ ير المؤ يشر ع لى أن تكون ت لك الدا لة معر فة في القسم العام‬
‫‪ public‬من الصنف‪ .‬فمثل نستطيع استدعاء الدالة ‪ average‬لحساب‬
‫معدل علمات الكائن ‪ St1‬من خلل المؤيشر ‪ p1‬كما يلي‪:‬‬
‫;)(‪(*p1).average‬‬
‫أو باستخدام عملية السهم كما يلي‬
‫;)(‪p1->average‬‬
‫‪ ‬‬
‫ون ستطيع ا ستدعاء الدا لة ‪ )(get_stname‬من خلل المتغير المؤيشر‬
‫‪p1‬لطباعة اسم الطالب كما يلي‬
‫‪ ‬‬
‫;)(‪cout<<(*p1).get_stname‬‬
‫أو‬
‫;)(‪cout<<p1->get_stname‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫ان تتعر ف علممى كيفيممة حجممز الذاكرة بطريقة‬ ‫‪.1‬‬


‫ديناميكية‬
‫طرق حجز الذاكرة‬
‫‪‬هنالك طريقتان لحجز الذاكرة لكائن ما‪:‬‬
‫‪‬الطريقة الستاتيكية‬
‫‪‬والطريقة الديناميكية‪.‬‬
‫‪‬تقض ي الطريق ة الول ى بأ ن يقوم مترج م لغة ‪++C‬‬
‫بحجز الذاكرة‪ ،‬عند ترجمة البرنامج‪ ،‬لجميع المتغيرات‬
‫المس تخدمة ف ي ال برنامج وتبقى هذه الذاكرة محجوزة‬
‫للبرنامج طيلة فترة التنفيذ ظحتى وإن لم تستخدم‪ ،‬ولهذا‬
‫مــا تســمى هذه الطريقــة بالطريقــة الســتاتيكية‪ .‬وقد‬
‫استخدمنا هذه الطريقة في جميع برامج هذه الوظحدة لغاية‬
‫الن‪.‬‬
‫طرق حجز الذاكرة‬

‫‪‬أما الطريقة الديناميكية فتسمح لنا بحجز الذاكرة التي نحتاج‬


‫عند الحاجة إليها في أثناء التنفيذ‪ .‬وعند انتهاء الحاجة إليها‬
‫نستطيع تحريرها بحيث تستخدم لرغراض أخرى‪ .‬تتم عملية‬
‫الحجز في لغة ‪ ++C‬من خل ل الدالة ‪ new‬وتتم عملية التحرير‬
‫من خل ل الدالة ‪.delete‬‬
‫حجز الذاكرة بطريقة ديناميكية‬

‫مثا ل‪:‬‬
‫على سبيل المثا ل لحجز موقع لعدد صحيح نستخدم الدالة ‪new‬‬
‫كما يلي‪:‬‬
‫;‪int *p‬‬
‫;‪p=new int‬‬
‫تقوم الجمل ة الول ى بتعري ف ‪ p‬كمتغي ر مؤش ر لقيم ة صحيحة‪.‬‬
‫وتقوم الجملة الثانية بحجز موقع في الذاكرة لعدد صحيح وتخزن‬
‫عنوان هذا الموقع في المتغير المؤشر ‪.p‬‬
‫حجز الذاكرة بطريقة ديناميكية‬

‫والشكل التالي يوضح هذا المر‪:‬‬

‫‪*p‬‬

‫‪p‬‬

‫ومن الممكن اختصار هاتين الجملتين بجملة واحدة‬


‫هي‬
‫;‪int *p=new int‬‬
‫حجز الذاكرة بطريقة ديناميكية‬

‫والطريقة الوحيدة للتعامل مع هذا الموقع المحجومز‬


‫هي من خلل المتغير المؤيشر ‪ .p‬إذ أن التعبير *‪p‬‬
‫يعود ع لى هذا المو قع المحجومز‪ .‬لندرس الجمل‬
‫التالية‬
‫;‪*p=10‬‬
‫;‪*p=*p+5‬‬
‫;‪cout<<*p‬‬
‫الجملة الولى تقوم بتخزين العدد ‪ 10‬في الموقع *‪p‬‬
‫و الجملة الثانية تقوم بزيادة قيمة *‪ p‬بم ‪ 5‬والجملة‬
‫الثال ثة تعرض قي مة *‪ p‬على الشايشة وهي طبعا‬
‫القيمة ‪.15‬‬
‫حجز الذاكرة بطريقة ديناميكية‬
‫وبعد ان استعرضنا ظحجز الذاكرة بطريقة ديناميكية لمتغير اولي‬
‫)عدد صحيح(‪.‬‬
‫بطريقة مشابهة نستطيع ظحجز ذاكرة لكائن من صنف ما‪ .‬فمثل‬
‫لحجز ذاكرة لكائن من الصنف ‪ student‬نستخدم الجملة‪:‬‬
‫;‪student *q=new student‬‬
‫وهذه الجملة في الواقع تقوم بعمل الجملتين‬
‫;‪student *q‬‬
‫;‪q=new student‬‬
‫ظحي ث تعرف المتغي ر ‪ q‬عل ى أن ه مؤش ر لكائ ن م ن الصنف‬
‫‪ student‬وتحجز موقعا لكائن من هذا الصنف وتخزن عنوانه‬
‫في المتغير ‪.q‬‬
‫حجز الذاكرة بطريقة ديناميكية‬
‫وهذه الجملة السابقة صحيحة فقط في حالة عدم‬
‫وجود بناء للصنف ‪ ،student‬أو في حالة وجود بناء ل‬
‫يحتاج إلى عوامل‪.‬‬
‫أما في حالة وجود بناء يأخذ عوامل فل بد من تزويد‬
‫هذا البناء بقيم لهذه العوامل عند حجز ذاكرة الكائن‪.‬‬
‫ع لى سبيل المثال في حا لة وجود البناء التالي‬
‫للصنف ‪:student‬‬
‫)‪student::student(long s,char* na,int cn‬‬
‫;‪{stno=s‬‬
‫;)‪strcpy(StName,na‬‬
‫};‪csno=cn‬‬
‫فإننا نستخدم الدالة ‪ new‬كما يلي‪:‬‬
‫حجز الذاكرة بطريقة ديناميكية‬
‫وبالط بع ن ستطيع ا ستخدام هذا الكا ئن من خلل‬
‫المتغ ير المؤ يشر ‪ q‬والدوال المعرفة على الصنف‬
‫‪ student‬كما في الجمل‪:‬‬
‫‪ ‬‬
‫;)(‪cout<<(*q).get_stname‬‬
‫;)(‪cout<<q->get_stno‬‬
‫‪ ‬‬
‫وعند انتهاء الحاجة للكائن المحجومز نستطيع تحرير‬
‫الذاكرة المخصصة له باستخدام الدالة ‪ delete‬مما‬
‫يع طي الفر صة لنظام التشغ يل لستخدام هذه‬
‫الذاكرة لمور أخرى‪.‬‬
‫حجز الذاكرة بطريقة ديناميكية‪/‬الدالة ‪delete‬‬
‫على سبيل المثال الجملة‪:‬‬
‫;‪delete q‬‬
‫تحرر الذاكرة المحجومزة للكا ئن الذي يش ير إليه‬
‫المتغير المؤيشر‪.‬‬

‫‪‬تذ كر عزيزي الطا لب أ نه في حالة وجود هدام‬


‫‪ destructor‬للصنف ‪ student‬فإن هذا الهدام‬
‫يستدعى تلقائيا‪.‬‬
‫‪‬واي ضا تذ كر أن الكا ئن الذي يح جز بطريقة‬
‫ديناميكية يبقى في الذاكرة إلى أن نستخدم الدالة‬
‫‪ delete‬لتحرير الذاكرة الخاصة به أو إلى أن ينتهي‬
‫البرنامج‪.‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫‪ .1‬ان تتعر ف عل ى كيفي ة حج ز المص فوفات بصورة‬


‫ديناميكية‪.‬‬
‫حجز المصفوفات بصورة ديناميكية‬
‫إن ظحجز المصفوفات بطريقة ستاتيكية كما فعلنا لغاية الن يعني‬
‫أن هذه المصفوفات تحجز طيلة وقت تنفيذ البرنامج ظحتى وإن لم‬
‫تستخدم بشكل كامل‪ ،‬مما قد يزيد من ظحجم الذاكرة المطلوبة لتنفيذ‬
‫البرنامج بشكل كبير‪ .‬ومما يزيد في ظحجم المشكلة أننا ل نعرف‬
‫دائما‪ ،‬عند كتابة البرنامج‪ ،‬ظحجم المصفوفة الفعلي الذي سنحتاجه‬
‫عند تنفيذ البرنامج ولذلك فإننا قد نضطر إلى ظحجز مصفوفة كبيرة‬
‫جدا تحسبا لسوأ الظروف‪.‬‬
‫حجز المصفوفات بصورة ديناميكية‬
‫فمثل فــي مثالنــا الخاص بتعريــف الصــنف ‪ section‬عرفنا‬
‫المص فوفة ‪ sec‬بحج م ‪ 50‬عنص را وعن د تنفي ذ ال برنامج قد ل‬
‫يس جل ‪ 50‬طالب ا ف ي هذه الشعب ة و م ع ذل ك س تبقى المصفوفة‬
‫محجوزة للبرنامج بشكل كامل طيلة فترة تنفيذه‪.‬‬
‫والح ل يكم ن ف ي أ ن تحج ز ذاكرة المص فوفة بطريق ة ديناميكية‬
‫باس تخدام الدال ة ‪ new‬وبحج م مبدئ ي ص غير وعن د الحاج ة إلى‬
‫مصفوفة بحجم أكبر )لن طالبا جديدا سجل في المادة على سبيل‬
‫المثا ل( نستطيع أن نحجز مصفوفة أكبر ونقل عناصر المصفوفة‬
‫القديمة إليها ومن ثم تحرير الذاكرة الخاصة بالمصفوفة القديمة‪.‬‬
‫حجز المصفوفات بصورة ديناميكية‬
‫مثا ل بسيط‪:‬‬
‫;‪float *p‬‬
‫;]‪p=new float[50‬‬
‫تعرف الجملة الولى المتغي ر المؤشر ‪ p‬على أنه مؤشر للنوع‬
‫‪ .float‬وتقوم الجمل ة الثاني ة بحج ز مص فوفة من نوع ‪float‬‬
‫وبحجم ‪ 50‬عنصرا‪ .‬وتقوم أيضا بتخزين عنوان أو ل عنصرا في‬
‫المتغير المؤشر ‪ .p‬وبالطبع نستطيع اختصار الجملتين السابقتين‬
‫إلى جملة واظحدة هي‬
‫;]‪float *p=new float[50‬‬
‫حجز المصفوفات بصورة ديناميكية‬
‫تابع‪...‬مثا ل بسيط‪:‬‬
‫و الن نستطيع استخدام هذه المصفوفة الجديدة من خل ل ‪ p‬كأي مصفوفة‬
‫أخرى‪ .‬فمثل نستطيع قراءة قيم لعناصر هذه المصفوفة كما يلي‬
‫)‪for(i=0;i<50;i++‬‬
‫;]‪cin>>p[i‬‬
‫ونستطيع كتابة عناصر هذه المصفوفة كل على سطر مستقل كما يلي‬
‫)‪for(i=0;i<50;i++‬‬
‫;‪cout<<p[i]<<endl‬‬

‫وعند انتهاء الحاجة لهذه المصفوفة نس تطيع تحرير الذاكرة المحجوزة لها‬
‫بوساطة الدالة ‪ delete‬كما يلي‪:‬‬
‫;‪delete p‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫‪ .1‬ان تتعر ف علممى كيفيممة تعريممف الصممنف بصورة‬


‫ديناميكية‪.‬‬
‫تعريف الصنف ‪ section‬بصورة ديناميكية‬
‫الطريقة الولى‬

‫وتكم ن الفكرة ف ي ظحج ز مص فوفة ص غيرة عن د البدء بطريقة‬


‫ديناميكية ثم توسعتها عند الضرورة فقط‪ ،‬أي عندما نحاو ل إضافة‬
‫طالب جديد ول نتمكن بسبب صغر ظحجم المصفوفة المحجوزة‪.‬‬
‫وســتتم عمليــة التوســعة هذه بواســطة الدالــة المنتمية الجديدة‬
‫‪.()expand‬‬
‫وبهذا نتجنب الحاجة إلى ظحجز مصفوفة أكبر بكثير مما نحتاج‪.‬‬
‫لندرس التعريف التالي ليلصنف‬
section
class section{
student *sec;
int MaxSize;
int size;
int bsearch(long stno);
void expand();
public:
section(){sec=new student[20];
MaxSize=20;
size=0;}
void StAdd(student s);
int StDelete(long stno);
void Stlist();
void StRetrieve(long stno);
};
 
‫الختلفات في التعريف الجديد‬
‫ليلصنف ‪section‬‬
‫‪‬المتغير المنتمي ‪ sec‬ليس مصفوفة هذه المرة‪ ،‬بل انه متغير مؤشر للصنف‬
‫‪ . student‬وذلك لننا سنستخدمه في ظحجز المصفوفة بطريقة ديناميكية‬
‫لوضع عنوان هذه المصفوفة به‪.‬‬
‫‪ ‬هنالك متغير منتم جديد‪ ،MaxSize ،‬ف ي التعريف الجديد ويمثل هذا‬
‫المتغير ظحجم الذاكرة المحجوزة‪ .‬لظحظ‪ ،‬عزيزي الدارس‪ ،‬أن هذا المتغير‬
‫يختلف عن المتغير ‪ size‬والذي يمثل عدد الطلبة )الكائنات( الفعلي في‬
‫المص فوفة )أ ي الذي ن أضفناه م إل ى المص فوفة(‪ .‬وكم ا سنرى فان بناء‬
‫الصنف ‪ section‬يعطي هذا المتغير ‪ MaxSize‬القيمة البتدائية ‪ 20‬على‬
‫أن تزداد هذه القيمة بمقدار الضعف عند الحاجة‪.‬‬
‫الختلفات في التعريف الجديد‬
‫ليلصنف ‪section‬‬
‫‪ ‬إن بناء الصنف ‪ section‬الجديد يختلف كثيرا عن‬
‫ممفممموفة من نوع‬
‫جممم م ص‬
‫ممومم يقوم بحممز‬
‫ممممبق‪ .‬ف ه‬
‫المماس‬
‫‪ student‬وبحجم ‪ 20‬عنصرا ويخزن عنوان أول‬
‫عن صر في هذه الم صفوفة في المتغ ير ‪ .sec‬كما‬
‫يعطي المتغيرات المنتمية ‪ MaxSize‬و ‪ size‬القيم‬
‫‪ 20‬و ‪ 0‬على الترتيب‪.‬‬
‫الختلفات في التعريف الجديد‬
‫ليلصنف ‪section‬‬
‫‪‬هنالك أيضا دالة منتمية جديدة ‪ )(expand‬تستدعى‬
‫ع ند الحا جة إ لى تو سعة المصفوفة المحجومزة‪.‬‬
‫وتستدعى هذه الدالة من قبل الدالة ‪ StAdd‬عند‬
‫ممد واكتشا ف أن‬ ‫ممرممم جد ي‬
‫ممةمم عن ص‬
‫محاومملةمم إضا ف‬
‫المصفوفة المحجومزة ل تتسع للمزيد من العناصر‪.‬‬
‫تقوم الدا لة ‪ expand‬بحجز مصفوفة من النوع‬
‫‪ student‬ولكن بحجم مقداره ‪ .MaxSize*2‬ثم‬
‫ممةمم إلى‬
‫ممفممموفة القدي م‬
‫ممرممم الم ص‬
‫مممم عنا ص‬
‫س‬‫تقوم بنممخ‬
‫الم صفوفة الجديدة‪ .‬بعد ئذ تقوم بتحرير الذاكرة‬
‫المحجومزة للمصفوفة القدي مة‪ ،‬ثم تجعل المتغير‬
‫‪ sec‬يشير إلى المصفوفة الجديدة‪ ،‬وتعدل قيمة‬
‫الختلفات في التعريف الجديد‬
section ‫ليلصنف‬
:‫ كما يلي‬++C ‫ويتم ذلك بلغة‬
void section::expand()
{student *p=new student[2*MaxSize];
for(int i=0;i<size;i++)
p[i]=sec[i];
delete sec;
sec=p;
MaxSize *=2;
}
‫الختلفات في التعريف الجديد‬
‫ليلصنف ‪section‬‬
‫ممل الدامملةمم ‪ StAdd‬بحيث‬ ‫ممامم نحتاج إمملىمم تعد ي‬
‫‪‬ك م‬
‫تستدعي الدالة ‪ expand‬عند الحاجة‪ .‬أي إذا كان‬
‫عدد الطلبة الفعلي في المصفوفة مزائد واحد أكبر‬
‫من ح جم الم صفوفة الك لي (‪ .)MaxSize‬بحيث‬
‫تصبح كما في الشريحة التالية‪:‬‬
‫الختلفات في التعريف الجديد‬
section ‫ليلصنف‬
void section::StAdd(student s)
{int pos=0;
// expand array if necessary
if(size+1>MaxSize) expand();
// search for the proper insertion position
while(s.get_stno() > sec[pos].get_stno() && pos<size)
pos++;
// shift element up one position
for(int i=size-1;i>=pos;i--)
sec[i+1]=sec[i];
sec[pos]=s;
size++;}
‫ أن ل تغيير ينبغي أن يحصل على بقية‬،‫ عزيزي الدارس‬،‫ من المهم أن تلحظ‬  
.‫الدوال المنتمية‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫‪ .1‬ان تتعر ف علممى كيفيممة تعريممف الصممنف بصورة‬


‫ديناميكية‪.‬‬
‫تعريف الصنف ‪ section‬بصورة ديناميكية‬
‫الطريقة الثاتنية‬

‫ممنمممف ‪ section‬بطريقة أكثر‬ ‫ممنمم ال ص‬


‫ممنمممعر ف ا ل‬
‫س‬
‫ديناميك ية ب حث تخ صص الذاكرة بطري قة ديناميكية‬
‫ليس فقط للمصفوفة التي تحوي الكائنات إنما أيضا‬
‫لكل كائن (طالب) في المصفوفة‪ .‬في هذا التعريف‬
‫سنستخدم المصفوفة ليس لتخزين الكائنات نفسها‬
‫إن ما لتخز ين عناوين هم في الذاكرة‪ .‬و قد تتساءل‪،‬‬
‫عزيزي الدارس‪ ،‬ما الحكمة من عمل ذلك؟‬
‫تعريف الصنف ‪ section‬بصورة ديناميكية‬
‫الطريقة الثاتنية‬

‫ل يشك بأن مصفوفة من العناوين ستأخذ حجما أقل‬


‫من مصفوفة من الكائنات من النوع ‪ .student‬فقط‬
‫عند ما نض يف طال با جديدا سنحجز له الذاكرة‬
‫المطلوبة بشكل كامل وسنخزن عنوان هذا الكائن‬
‫في الم صفوفة‪ .‬وع ند حذ ف هذا الطا لب نستطيع‬
‫تحر ير الذاكرة الخا صة به‪ .‬ك ما أن عمل ية ن قل أو‬
‫نسخ العناوين عند توسعة المصفوفة تتطلب وقت‬
‫أقل من عملية نقل الكائنات نفسها‪.‬‬
‫ بصورة ديناميكية‬section ‫تعريف الصنف‬
‫الطريقة الثاتنية‬
section ‫لندرس التعريف التالي لم‬
class section{
student **sec;
int MaxSize;
int size;
int bsearch(long stno);
void expand();
public:
section(){sec=new student*[20];
MaxSize=20;
size=0;}
void StAdd(student* s);
int StDelete(long stno);
void Stlist();
void StRetrieve(long stno);};
‫تعريف الصنف ‪ section‬بصورة ديناميكية‬
‫الطريقة الثاتنية‬
‫ل يشك أ نك لح ظت ب عض الختلفات عن التعريف‬
‫السابق لم ‪ section‬وهي‪:‬‬
‫‪‬تلحظ أن تعريف المتغير ‪ sec‬أصبح‬
‫;‪student **sec‬‬
‫وذ لك لن ‪ sec‬الن متغير يحوي عنوانا لموقع من‬
‫النوع ‪ student *sec‬والذي يحتوي بدوره على‬
‫عنوان لكائن من النوع ‪.student‬‬
‫‪‬ل حظ أي ضا أن البناء الخاص بالصنف ‪section‬‬
‫يح جز م صفوفة من النوع ‪ *student‬وذلك لننا‬
‫سنستخدم هذه المصفوفة لتخزين عناوين لكائنات‬
‫من الصنف ‪ student‬وليس الكائنات نفسها‪.‬‬
‫ بصورة ديناميكية‬section ‫تعريف الصنف‬
‫الطريقة الثاتنية‬
expand ‫وبطري قة مشاب هة نحتاج لتعد يل الدالة‬
:‫بحيث تصبح‬
 
void section::expand()
{student **p=new student*[2*MaxSize];
for(int i=0;i<size;i++)
p[i]=sec[i];
delete sec;
sec=p;
MaxSize *=2; }
‫تعريف الصنف ‪ section‬بصورة ديناميكية‬
‫الطريقة الثاتنية‬
‫الدالة ‪ StAdd‬أيضا بحاجة لبعض التعديلت‪ ،‬فهي تستقبل الن‬
‫عنوانا لكائن )بواسطة العامل ‪ (s‬وليس الكائن نفسه‪ .‬بالطبع الكائن‬
‫نفسه يجب أن يحجز من قبل الدالة المستدعية مثل ‪ main‬على‬
‫سبيل المثا ل‪ .‬وهذا سبب تغيير تعريف العامل ‪ s‬في ترويسة الدالة‪.‬‬
‫لظحظ أيضا أن طريقة استدعاء الدالة ‪ ()get_stno‬قد تغيرت في‬
‫جملة الدوران ‪ while‬وذلك لن كل من ‪ s‬و ]‪ sec[pos‬يحتويان‬
‫الن على عناوين الكائنات‪ .‬فمثل لستدعاء الدالة ‪()get_stno‬‬
‫للكائــن صــاظحب العنوان المخزن فــي ‪ s‬نســتخدم الجملة‬
‫)*‪.()get_stno.(s‬‬
‫ بصورة ديناميكية‬section ‫تعريف الصنف‬
‫الطريقة الثاتنية‬
void section::StAdd(student* s)
{int pos=0;
// expand array if necessary
if(size+1>MaxSize) expand();
// search for the proper insertion position
while((*s).get_stno() > (*sec[pos]).get_stno() &&
pos<size)
pos++;
// shift element up one position
for(int i=size-1;i>=pos;i--)
sec[i+1]=sec[i];
sec[pos]=s;
size++;}
‫ بصورة ديناميكية‬section ‫تعريف الصنف‬
‫الطريقة الثاتنية‬
‫ بحيث تصبح كما‬Stlist ‫ولنفس السباب نحتاج لتعديل الدوال‬
‫يلي‬

void section::Stlist()
{ for(int i=0;i<size;i++)
cout<<(*sec[i]).get_stname()<<"
"<<(*sec[i]).get_stno()<<"
"<<(*sec[i]).average()<<endl;
}
‫ بصورة ديناميكية‬section ‫تعريف الصنف‬
:‫ بحيث تصبح كما يلي‬bsearch ‫ولنفس السباب نحتاج لتعديل الدوال‬
int section::bsearch(long sn){
int lo=0;
int hi=size-1;
while (lo <= hi)
{ int mid =(lo+hi) /2;
long r=(*sec[mid]).get_stno();
if (r== sn)
return mid;
else
if (sn>r)
lo=mid+1;
else
hi = mid;
} //while
return -1;}
‫ بصورة ديناميكية‬section ‫تعريف الصنف‬
‫الطريقة الثاتنية‬
‫ بحيث‬StRetrieve ‫ولن فس ال سباب نحتاج لتعد يل الدا لة‬
:‫تصبح كما يلي‬
void section::StRetrieve(long stno)
{int i=bsearch(stno);
if(i>-1) {
cout<<"Student infromation \n \t";
cout<<(*sec[i]).get_stname()<<"
"<<(*sec[i]).get_stno()<<"
"<<(*sec[i]).average()<<endl; }
else
cout<<"Student no "<<stno<<" was not found
\n"; }
‫تعريف الصنف ‪ section‬بصورة ديناميكية‬
‫الطريقة الثاتنية‬
‫ونحتاج لع مل تعد يل ب سيط للدا لة ‪ StDelete‬بحيث تحرر‬
‫الذاكرة المحجومزة للطالب الذي تشطبه بحيث تصبح‪:‬‬
‫)‪int section::StDelete(long stno‬‬
‫;)‪{int i=bsearch(stno‬‬
‫;]‪delete sec[i‬‬
‫)‪if(i>-1‬‬
‫)‪{for(int j=i;j<size-1;j++‬‬
‫;]‪sec[j]=sec[j+1‬‬
‫;‪size--‬‬ ‫}‬
‫} ;‪return i‬‬
‫} ;"‪\n‬‬
‫تعريف الصنف ‪ section‬بصورة ديناميكية‬
‫الطريقة الثاتنية‬
‫ونحتاج أيضا لتعديل الدالة ‪ main‬بحيث تقوم بحجز الذاكرة‬
‫الخاصة بالطالب الجديد عند الضافة‪ .‬أن ما نحتاج لتعديله هو‬
‫فقط الحالة الولى من جملة ‪ switch‬بحيث تصبح‬
‫{)‪switch(choice‬‬
‫‪case 1: // student add‬‬
‫;‪student *p=new student‬‬
‫;)(‪p->initialize‬‬
‫;)‪cs100.StAdd(p‬‬
‫;‪break‬‬
‫‪:‬‬
‫‪:‬‬
‫‪ ‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫ان توضح المقصود بالقائمة المتصلة‪.‬‬ ‫‪.1‬‬


‫ان تتعر ف على كيفية انشاء قائمة متصلة بطريقة‬ ‫‪.2‬‬
‫ديناميكية‪.‬‬
‫القوائم المتصلة ‪Linked Lists‬‬
‫تعر ف القائمة المتصلة ‪ linked list‬على أنها‬
‫مجمو عة من الع قد ‪ nodes‬المتجانسة (من‬
‫نفس النوع) مرتبة بشكل خطي بحيث تحمل‬
‫كل عقدة عنوان العقدة التي تليها‪ ،‬باستثناء‬
‫آ خر عقدة إذ تح مل القي مة الخاصة ‪NULL‬‬
‫لليشارة إ لى انتهاء القائ مة المت صلة‪ .‬وتمثل‬
‫كل عقدة كا ئن أو ترك يب من نوع ما‪ ،‬فقد‬
‫تم ثل العقدة كا ئن من نوع ‪ student‬أو من‬
‫نوع ‪ … Book‬الخ‪ .‬والشكل ‪ 5‬يبين بالرسم‬
‫قائمة متصلة افتراضية‪.‬‬
‫القوائم المتصلة ‪Linked Lists‬‬

‫يظهر في الشكل قائمة متصلة من أربعة عقد‪ ،‬حيث تحمل كل‬


‫عقدة عنوان العقدة التي تليها‪ .‬ويمثل ذلك بالر سم باستخدام‬
‫ال سهم‪ .‬بين ما تح مل العقدة الخيرة القي مة الخاصة ‪NULL‬‬
‫وتمثل بالرسم باستخدام الخط المائل‪.‬‬
‫‪ ‬‬
‫القوائم المتصلة ‪Linked Lists‬‬
‫وتشكل القوائم المتصلة بديل مفضل للم صفوفات في كثير من‬
‫الحيان وذلك لعدة أسباب منها‪:‬‬
‫‪ .1‬إن عملية إضافة أو شطب عنصر (عقدة )ل تتطلب عملية‬
‫إزاحة للبيانات كما هي الحال عند استخدام المصفوفات‪.‬‬
‫‪ .2‬ذلك تمكننا القوائم المتصلة من استخدام الذاكرة بطريقة‬
‫اقت صادية بح يث نح جز الذاكرة الخا صة بالع قد ف قط عند‬
‫ااااا بطريقة‬
‫ااةااا إلي ه‬
‫ااااا ونحرراااهااا فور انتهاء الحا ج‬
‫ااةااا إلي ه‬
‫الحا ج‬
‫ديناميكية باستخدام الدوال ‪ new‬و ‪.delete‬‬
‫‪ ‬‬
‫القوائم المتصلة ‪Linked Lists‬‬
‫وم ع ذل ك هنال ك بع ض المس اوئ للقوائ م المتصلة عن د مقارنتها‬
‫بالمصفوفات منها‬
‫‪ .1‬المعالج ة التتابعي ة‪ :‬إ ذ للوص و ل إل ى عنص ر م ا ل ب د من‬
‫استعراض القائمة المتصلة عنصرا عنصرا من بداية القائمة‬
‫إل ى أ ن نص ل إل ى العنص ر المطلوب‪ .‬قارن هذا بالمعالجة‬
‫المباشرة الخاص ة بالمص فوفات إ ذ أنن ا نس تطيع معالج ة أي‬
‫عنصر بمعرفة ترتيبه في المصفوفة مما يمكننا من استخدام‬
‫خوارزميات بح ث فعال ة )ل تتطل ب وق ت تنفي ذ ك بير( مثل‬
‫خوارزمية البحث الثنائي‪.‬‬
‫‪ .2‬تتطل ب بع ض ال برمجيات المعقدة للتعام ل معه ا إ ذ تعتبر‬
‫المصفوفات أقل تعقيدا للبرمجة‪.‬‬
‫كيفية اتنشاء القوائم المتصلة‬
‫أن تعريف أي عقدة سواء كان تركيبا ‪ structure‬أو‬
‫صنفا ‪ class‬لبد من أن يحتوي على متغير منتم قادر‬
‫ممن عنوان العقدة التالمميةمم سندعو هذا‬
‫عمملىمم تخز ي‬
‫المتغير ‪ next‬في أمثلتنا‪ .‬فمثل لنشاء قائمة متصلة‬
‫من الطلبة حيث تمثل كل عقدة طالبا معينا نمثل‬
‫العقدة كصنف ‪ student‬كما يلي‪:‬‬
‫كيفية اتنشاء القوائم المتصلة‬
class student{
long stno;
int csno;
char StName[20];
student* next;
public:
void initialize();
long get_stno() {return stno;}
char* get_stname(){return StName;}
};
‫كيفية اتنشاء القوائم المتصلة‬
‫أن تعريف أي عقدة سواء كان تركيبا ‪ structure‬أو‬
‫صنفا ‪ class‬لبد من أن يحتوي على متغير (حقل)‬
‫منتم قادر على تخزين عنوان العقدة التالية سندعو‬
‫هذا المتغير ‪ next‬في أمثلتنا‪.‬‬
‫وسنعر ف كمثال على القوائم المتصلة قائمة متصلة‬
‫من الطلبة أي من صنف ‪ .student‬أي أن العقدة في‬
‫القائ مة ستحتوي ع لى كا ئن من نوع ‪student‬‬
‫بالضا فة إ لى عنوان العقدة التالية‪ .‬وفي ما يلي‬
‫تعربف ‪:node‬‬
‫{‪struct node‬‬
‫;‪student data‬‬
‫;‪node* next‬‬
‫كيفية اتنشاء القوائم المتصلة‬
‫ل حظ عزيزي الطا لب وجود حقل ين في التركيب‬
‫‪:node‬‬
‫ويستخدم لتخزين كا‬
‫نوع ‪.student‬‬ ‫‪data .1‬‬
‫وستخدم لتخز‬
‫العقدة ‪node‬‬ ‫‪next .2‬‬
‫التالية ولذا فهو من النوع‪*.node‬‬
‫‪ ‬‬
‫كيفية اتنشاء القوائم المتصلة‬
‫ممنمممف سندعوه‬
‫مملمممة ك ص‬
‫ممةمم المت ص‬
‫ممنمممعر ف القائ م‬
‫و س‬
: ‫ كما يلي‬LinkedList
class LinkedList{
node* head;
public:
LinkedList(){head=NULL;}
void ListAdd(student s);
int ListDelete(long stno);
void ListTraverse();
};
‫كيفية اتنشاء القوائم المتصلة‬
‫حيث يحتوي تعريف هذا الصنف على متغير منتم واحد هو‬
‫‪ head‬ويستخدم للحتفاظ بعنوان أول عقدة في القائمة‬
‫المتصلة ولذا فهو من النوع ‪ .*node‬وهنالك أيضا أربع دوال‬
‫منتمية هي ‪:‬‬
‫‪ .1‬البناء ‪ LinkedList‬وكل ما يعمله هو جعل ‪ head‬مساويا‬
‫لقيمة المؤيشر الخاصة ‪ NULL‬لليشارة إلى أن القائمة‬
‫فارغة في البداية‪.‬‬
‫القائمة وتقوم بإض‬ ‫‪ListAdd .2‬‬
‫المت صلة‪ ،‬و في المو قع المنا سب بح يث تب قى القائمة‬
‫‪.‬مرتبة تصاعديا حسب رقم الطالب‬
‫منبحذ ف الطال‬‫وتقوم‬
‫الرقم ‪stno‬‬ ‫‪ListDelete .3‬‬
‫‪.‬القائمة المتصلة‬
‫في وتقوم هذه‬ ‫‪ListTraverse .4‬‬
‫القائ مة ع لى الترت يب وتعرض ب عض المعلومات عن‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫تمرير العوامل بالقيمة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫يوضح المقصود بمصطلح تمرير العوامل بالقيمة‪.‬‬ ‫‪.1‬‬


‫تمرير العوامل‬
‫بالقيمة‬
‫تأمل عزيزي الطالب تعريف الدالة التالية‪:‬‬
‫تسمى المتغيرات‬
‫)‪void swap1(int X, int Y‬‬ ‫‪ A,B‬بالعوامل‬
‫الرسمية‬
‫;‪{ int T=X‬‬
‫;‪X=Y‬‬
‫;‪Y=T‬‬ ‫}‬
‫تمرير العوامل‬
‫بالقيمة‬
‫لندرس نتيجة استدعاء الدالة أعل ه من خلل المثال التالي‪:‬‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap1(A,B‬تسمى المتغيرات‬
‫‪ A,B‬بالعوامل‬
‫الفعلية‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬
‫تمرير العوامل‬
‫بالقيمة‬

‫لغ ة ‪ C‬تمرر قي م العوام ل إل ى الدوال وبالتال ي فإ ن أي‬


‫تغيير تجريه الدالة على هذ ه القيم ل يؤدي إلى تغيير قيم‬
‫العوامل الحقيقية‪.‬‬
‫تمرير العوامل‬
‫بالقيمة‬

‫تستدعي هذ ه الدالة ‪ swap1‬لتبديل قيم العوامل الحقيقية‬


‫‪ A‬و ‪ B‬وتقوم بطباع ة قي م ‪ A‬و ‪ B‬قب ل وبع د استدعاء‬
‫‪ .swap1‬إن نتيجة تنفيذ هذا البرنامج هي طباعة ‪:‬‬
‫‪A=10 B=20‬‬
‫‪A=10 B=20‬‬
‫تمرير العوامل‬
‫بالقيمة‬

‫أي أن قيم ‪ A‬و ‪ B‬وهي العوامل الحقيقية لم تبدل بعد‬


‫استدعاء الدالة ‪ ،swap1‬وذلك لن الدالة ‪ swap1‬تستقبل‬
‫قيم العوامل ‪ A‬و ‪ B‬وليس عناوينها‪.‬‬
‫تمرير العوامل‬
‫بالقيمة‬

‫أ ن القي م ‪ 10‬و ‪ 20‬ف ي مثالن ا أعل ه تخزن ف ي مواقع‬


‫جديدة في الذاكرة تختلف عن مواقع المتغيرات ‪ A‬و ‪B‬‬
‫ولذا فإ ن أ ي تغيي ر عل ى العوام ل الرسمية ‪ X‬و ‪ Y‬ل‬
‫يقابله تغيير على قيم العوامل الحقيقية ‪ A‬و ‪.B‬‬

‫تسمى دهذه الطريقة لتمرير العوامل بالتمرير‬


‫بالقيمة‪.‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫توضح المقصود بمصطلح تمرير العوامل بالشارة‪.‬‬ ‫‪.1‬‬


‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫تمرير العوامل بالاشارة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫تمرير العوامل‬
‫بالاشارة‬
‫تذك ر عزيزي الطال ب ان لغة ‪ C‬تمرر قيم العوام ل إلى‬
‫الدوال وبالتال ي فإ ن أ ي تغيي ر تجري ه الدال ة على هذ ه‬
‫القيم ل يؤدي إلى تغيير قيم العوامل الحقيقية‪.‬‬

‫دهكذا دهي عملية تمرير المعامل ت بالقيمة‬


‫تمرير العوامل‬
‫بالاشارة‬
‫ول حل المشك لة أعل ه فإن نا بدل من أن نر سل قيمة‬
‫‪A‬‬ ‫الحقيقةةةةةةةةةةةةةيةةة‬ ‫ةةةةةةةةةةةةةلةة‬
‫م‬ ‫العوا‬
‫و ‪ B‬في مثال الدالة ‪ ،swap1‬ي جب أن نر سل للدالة‬
‫عنوانهما حتى تستطيع هذ ه الدالة تغيير القيم المخزنة في‬
‫هذ ه المواقع‪  .‬‬

‫هناك طريقتان لعمل ذلك‪...............‬‬


‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الولى‬
‫)‪void swap2(int* X,int* Y‬‬ ‫يتعامل‬ ‫مع‬ ‫‪swap2‬‬
‫المواقع التي نود تغييرها‬
‫* من خلل اللقاب‪X‬‬
‫;‪{ int T=*X‬‬ ‫* و‪.Y‬‬

‫;‪*X=*Y‬‬
‫;‪*Y=T‬‬
‫}‬
‫تمرير العوامل‬
‫بالاشارة‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap2(&A,&B‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬
‫أر سلنا عناو ين المتغيرين‬
‫‪ A‬و ‪) B‬أي &‪ A‬و&‪(B‬‬
‫عند ما ا ستدعينا الدالة‬
‫‪.swap2‬‬
‫تمرير العوامل بالشارة‬
‫وبالطبع تقوم الن الدالة ‪ swap2‬بتغيير قيم ‪ A‬و ‪ B‬كما يجب‬
‫حيث تكون النتائج كما يلي‪:‬‬

‫‪A=10 B=20‬‬
‫‪A=20 B=10‬‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫)‪void swap3(int &X, int &Y‬‬ ‫ظظظظظظ وجود العملية &‬‫لح‬
‫ظظلظظ ظظمنظظظ العوامل‬
‫ظظلظظ ك‬
‫قب‬
‫;‪{ int T=X‬‬ ‫الرظظمسظظظظية وذلك للشارة‬
‫;‪X=Y‬‬ ‫إلى أن العوامل الحقيقية‬
‫ستمرر بالشارة ) ‪by‬‬
‫;‪Y=X‬‬ ‫‪( ( reference‬‬

‫}‬
‫تمرير العوامل‬
‫بالاشارة‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap3(A,B‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬
‫من الم هم أن تلحظ‬
‫‪ ‬‬
‫عزيزي الدارس أننا‬
‫ا ستخدمنا أ سماء العوامل‬
‫‪ X‬و ‪ Y‬داخل الدالة بطريقة‬
‫مباشرة بدون أن نسبقها بـ‬
‫*‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫لحظ وجود العملية & قبل كل من العوامل الرسمية وذلك‬
‫للشارة إلى أن العوامل الحقيقية ستمرر بالشارة ) ‪by‬‬
‫‪ ( reference‬وليس بالقيمة )‪ ( by value‬مما يعني أن أي‬
‫تغيير على قيم العوامل الرسمية سيقابله تغيير على قيم‬
‫العوامل الحقيقية‪.‬‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫ومن الممكن أيضا أن ترجع الدالة قيمة بالاشارة‬
‫كما في مثالنا التالي‪:‬‬

‫)‪int& max(int A, int B‬‬


‫)‪{if (A>B‬‬
‫;‪return A‬‬
‫‪else‬‬
‫;‪return B‬‬
‫}‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن نوع القيمة المرجعة هو ‪&int‬‬
‫أي إشارة ‪ reference‬لمتغير صحيح‪ .‬تقوم الدالة ‪max‬‬
‫بتحديد العامل صاحب القيمة الكبر وإعادة إشارة إليه‪  .‬‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫ولذا فإننا نستطيع أن نستدعي الدالة ‪ max‬كما يلي ‪:‬‬

‫;‪int A=10‬‬
‫;‪int B=100‬‬
‫;‪max(A,B)=5‬‬
‫إن نتي جة تنف يذ هذ ه الجم لة هي تخز ين القي مة ‪ 5‬في‬
‫المتغير صاحب أكبر قيمة وهو المتغير ‪.B‬‬
‫‪ ‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫الدوال الصديقة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالدوال الصديقة‪.‬‬


‫• ان تقارن ببن الدوال الصديقة والدوال المنتمية‪.‬‬
‫الدوال الصديقة‬

‫كم ا درس ت س ابقا عزيزي الطال ب فان الدوال المنتمية‬


‫للصنف هي فقط التي يحق لها معالجة الجزاء الخاصة‬
‫للصةةنف )المعرفةةة فةةي الجزء الخاص ‪ private‬من‬
‫الصنف(‪.‬‬
‫ف ي الواق ع أ ن هنال ك نوع ا آخ ر م ن الدوال يستطيع‬
‫معالج ة الجزاء الخاص ة للص نف وهذ ه الدوال تدعى‬
‫الدوال الصديقة‪.‬‬
‫ما معنى الدوال‬
‫الصديقة؟‬
‫‪ .‬وتعرف الدالة على أنها دالة صديقة لصنف ما بوضع نموذج‬
‫‪ prototype‬لهذ ه الدال ة داخةةل تعريةف الصةةنف مسبوقا‬
‫بالكلمة ‪.friend‬‬

‫‪ ‬مثال‪:‬‬
‫لتعريف الدالة ‪ average‬والتي تجد معدل علمات طالب ما‬
‫كدالة صديقة للصنف ‪ student‬نضع النموذج‪:‬‬
‫‪ ‬‬
‫;)‪friend double average(student s‬‬

‫داخل تعريف الصنف ‪student‬‬


‫ما معنى الدوال‬
‫الصديقة؟‬
:student ‫تأمل عزيزي الطالب تعريف الصنف‬

• class student{
• long stno;
• int csno;
• double grades[100];
• char StName[20]; average ‫الدالة‬
‫الحق في معالجة‬
• public: ‫الجزاء الخاصة‬
• friend double average(student s); student ‫للصنف‬
‫كما لو كانت دالة‬
• void initialize(); ‫منتمية للصنف‬
student
• long get_stno() {return stno;}
• char* get_stname(){return StName;}
• };
‫ما معنى الدوال‬
‫الصديقة؟‬
‫و تختلف طريقة استدعاء الدالة الصديقة عن طريقة استدعاء‬
‫الدالة المنتمية‪ .‬فمثل لستدعاء الدالة الصديقة ‪ average‬لحساب‬
‫معدل علمات الطالب )الكائن( ‪ S‬فإننا نستدعيها كما يلي‪:‬‬

‫)‪;average(S‬‬

‫بينما لو كانت الدالة ‪ average‬دالة منتمية للصنف ‪ student‬فإننا‬


‫نستدعيها كما يلي‪:‬‬
‫‪();S.average‬‬
‫كيف تكتب الدالة‬
‫الصديقة؟‬
‫تكتب الدالة الصديقة مثل أي دالة أخرى ليس لها علقة بالصنف‪.‬‬
‫فمثل تعرف الدالة ‪ average‬كما يلي‪:‬‬
‫أننا لم نستخدم اسم‬
‫ال صنف ول عملية‬
‫)‪double average(student S‬‬ ‫تقر ير المجال ‪ ::‬في‬
‫ترويسة هذه الدالة‪.‬‬
‫;‪{ double sum=0.0‬‬
‫)‪for(int i=0;i<S.csno;i++‬‬
‫;]‪sum=sum+S.grades[i‬‬
‫;‪return sum/S.csno‬‬
‫}‬
‫كيف تكتب الدالة‬
‫الصديقة؟‬
‫لحظ‪ ،‬عزيزي الدارس ايضا في جملة تعريف الدالة‪:‬‬

‫لهذ ه الدالة عامل واحد هو ‪ student S‬وذلك لتمرير اسم‬


‫الكائن الذي نود حساب المعدل له من خلله‪ ،‬ولو كانت‬
‫هذ ه الدالة دالة منتمية لما احتجنا إلى هذا العامل‬
‫امثلة منوعة على الدوال‬
‫الصديقة‬
class Accumulator
{
private:
int m_nValue;
public:
Accumulator() { m_nValue = 0; }
void Add(int nValue) { m_nValue += nValue; }

// Make the Reset() function a friend of this class


friend void Reset(Accumulator &cAccumulator);
};

// Reset() is now a friend of the Accumulator class


void Reset(Accumulator &cAccumulator)
{
// And can access the private data of Accumulator objects
cAccumulator.m_nValue = 0;
}
‫امثلة منوعة على الدوال‬
‫الصديقة‬
class Value
{
private:
int m_nValue;
public:
Value(int nValue) { m_nValue = nValue; }
friend bool IsEqual(const Value &cValue1, const Value &cValue2);
};

bool IsEqual(const Value &cValue1, const Value &cValue2)


{
return (cValue1.m_nValue == cValue2.m_nValue);
}
‫امثلة منوعة على الدوال‬
‫الصديقة‬
• class Humidity;

• class Temperature
• {
• private:
• int m_nTemp;
• public:
• Temperature(int nTemp) { m_nTemp = nTemp; }

• friend void PrintWeather(Temperature &cTemperature, Humidity &cHumidity);
• };

• class Humidity
• {
• private:
• int m_nHumidity;
• public: ‫يمكن ان‬
• Humidity(int nHumidity) { m_nHumidity = nHumidity; } ‫تكون الدالة‬
• ‫صديقة لكثر‬
• friend void PrintWeather(Temperature &cTemperature, Humidity &cHumidity);
• };
‫من صنف‬

• void PrintWeather(Temperature &cTemperature, Humidity &cHumidity)
• {
• std::cout << "The temperature is " << cTemperature.m_nTemp <<
• " and the humidity is " << cHumidity.m_nHumidity << std::endl;
• }
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫النصناف الصديقة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالصناف الصديقة‪.‬‬


‫النصناف الصديقة‬

‫من الممكن أن تكون دالة ما منتمية إلى صنف ما وصديقة‬


‫إلى صنف آخر‪ .‬وأحيانا قد نضطر إلى تعريف عدد كبير من‬
‫الدوال المنتمية إلى صنف كدوال صديقة إلى صنف آخر‪،‬‬
‫مما قد يؤدي إلى وضع عدد كبير من النماذج داخل تعريف‬
‫الصنف‪.‬‬
‫النصناف الصديقة‬

‫ولتج نب و ضع هذا العدد ال كبير من النماذج دا خل تعريف‬


‫ال صنف ن ستطيع تعر يف ال صنف بأكم له ك صنف صديق‬
‫للصنف الخر‪ .‬مما يعطي جميع الدوال المنتمية إلى الصنف‬
‫الول القدرة ع لى معال جة الجزاء الخا صة في الصنف‬
‫الخر‪.‬‬
‫النصناف الصديقة‬

‫‪‬مثال‪:‬‬
‫ع لى سبيل المثال لنفرض أن لدي نا الصنفين ‪manager‬‬
‫) مدير( والصنف ‪ ) employee‬موظف( وأننا نود إعطاء‬
‫جميع الدوال المنتمية للصنف ‪ manager‬إمكانية معالجة‬
‫جم يع المتغيرات والدوال الخا صة بالصنف ‪employee‬‬
‫فبدل من أن نعرف كل من هذ ه الدوال كدا لة صديقة‬
‫ةةنةةةف ‪ manager‬كصديق للصنف‬ ‫ةةف ال ص‬‫ةةةةطيع تعر ي‬
‫نةةتس‬
‫‪ employee‬مما يحقق نفس الغاية‪ .‬ويتم ذلك بوضع الجملة‬
‫‪friend manager‬‬
‫داخل تعريف الصنف ‪.employee‬‬
‫النصناف الصديقة‬
:‫ مثال‬
:‫مثال‬..‫ تتمة‬
#include<iostream.h>
• int main( )
class TwoValues {
• {
//continue
• TwoValues ob(10, 20);
int a;
• Min m;
int b;
• cout<< m.min(ob);
public:
• return 0;
TwoValues(int i, int j) {a = i, b=
• }
j;}
friend class Min;
};
class Min {
public:
int min(TwoValues x);
};
int Min::min (TwoValues x)
{
return x.a< x.b? x.a: x.b;
}
‫النصناف الصديقة‬
‫نةةة الفةةئةةة ‪ Min‬كفئة صديقة للفئة‬‫ةةم العلن ةةع‬
‫ت‬
‫‪ TwoValues‬في السطر التالي‪:‬‬
‫;‪friend class Min‬‬
‫‪ ‬‬
‫لذ لك تم الو صول إ لى العضاء الخا صة ‪ a‬و‪ b‬في الفئة‬
‫‪ TowValues‬من قبل الفئة ‪.Min‬‬
‫)‪int Min::min (TwoValues x‬‬
‫{‬
‫;‪return x.a< x.b? x.a: x.b‬‬
‫}‬
‫مثال على النصناف‬
class Storage ‫الصديقة‬
{
private:
int m_nValue;
double m_dValue;
public:
Storage(int nValue, double dValue)
{
m_nValue = nValue;
m_dValue = dValue; }

friend class Display;};


class Display{
private:
bool m_bDisplayIntFirst;
public:
‫امثلة منوعة على‬
‫الصديقة‬ ‫النصناف‬
    Display(bool bDisplayIntFirst) 
{ m_bDisplayIntFirst = 
bDisplayIntFirst; }
     void DisplayItem(Storage 
&cStorage)    {
        if (m_bDisplayIntFirst)
            std::cout << cStorage.m_nValue 
<< " " << cStorage.m_dValue << 
std::endl;
        else // display double first
            std::cout << cStorage.m_dValue 
<< " " << cStorage.m_nValue << 
std::endl;    }};
 
‫امثلة منوعة على‬
‫الصديقة‬
    int main() ‫النصناف‬
{
    Storage cStorage(5, 6.7);
    Display cDisplay(false);
 
    cDisplay.DisplayItem(cStorage);
 
    return 0;
}
‫تذكر!!!!‬
‫تذكر عزيزي الطالب‪:‬‬
‫‪  ‬تستعمل الفئات الصديقة إذا كان هنالك فئتين مرتبطتين ببعضهما كثيرا ا‬
‫لدرجة أن أحدهما تحتاج إلى الوصول إلى بيانات الخرى الخاصة بشكل‬
‫مباشر ‪.‬‬

‫‪ ‬أننا ل نريد أن نجعل البيانات عامة لن هذا سيتيح لي شخص تعديلها‬


‫بطريق الخطأ‪.‬‬

‫‪ ‬كما أن الفئة هي ليست مشتركة في صفات مع الفئة الخرى وعليه ل‬


‫يمكن استخدام الوراثة لذا فإن استعمال الفئات الصديقة هو السلوب‬
‫الوحيد لجعل إحدى الفئتين تصل إلى العضاء الخاصة في الفئة الخرى‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫اعادة تحميل العمليا ت‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالعمليات ‪Operators‬‬


‫• ان تتعرف على كيفية اعادة تحميل العمليات‪.‬‬
‫اعادة تحميل العمليا ت ‪Operators‬‬
‫‪Overloading‬‬
‫من المميزات الجميلة للغة ‪ ++C‬أنها تمكننا من إعادة‬
‫تعري ف العمليات ‪ operator‬المختلف ة بم ا يتناس ب مع‬
‫تطبيقاتنا‪ .‬فمثل نستطيع تعريف العملية ‪ +‬كعملية منتمية‬
‫للصنف ‪ section‬لتعني إضافة طالب معين إلى الشعبة‬
‫والعملي ة – لتعن ي شط ب طال ب معي ن من الشعبة‪ .‬ان‬
‫هذ ه التعريفات الجديدة لة ‪ +‬و – م ا هي إل تعريفات‬
‫إضافي ة لهذ ه العمليات‪ ،‬أ ي أنن ا نحمل هذ ه العمليات‬
‫تعريفات جديدة ‪ operator overloading‬وهذا ممكن‬
‫ل ن م ا يحدد تعري ف العملي ة المطلوب تنفيذه ا هو عدد‬
‫ونوع العوامل وليس فقط رمز العملية‪.‬‬
‫اعادة تحميل العمليا ت ‪Operators‬‬
‫‪Overloading‬‬
‫ف ي الواق ع إ ن الكثي ر م ن العمليات له ا أص ل أكث ر من‬
‫تعري ف ف ي لغ ة ‪ . ++C‬فمثل العملي ة ‪ +‬له ا أكث ر من‬
‫تعريف واحد فهي تعني الشارة الموجبة عندما تأتي مع‬
‫عام ل واح د‪ ،‬وتعن ي عملي ة جم ع ص حيحة وعملي ة جمع‬
‫حقيقية وغير ذلك‪ .‬ويقوم مترجم ‪ ++C‬بتحديد التعريف‬
‫المطلوب من عدد و نوع العوامل‪.‬‬
‫متى يقال ان العامل تم تحميله بشكل‬
‫زائد؟‬
‫عندما يعطى عامل موجود أصل ل كة‬
‫‪ +‬أو – القدرة على العمل على‬
‫أنواع بيانات جديدة يقال أ نه تم‬
‫تحميله بشكل زائد ‪.overloaded‬‬
‫‪‬تذكر‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
‫إن تعريف العمليات ل يختلف كثير عن تعريف الدوال وفي‬
‫الواقع إن العمليات هي نوع خاص من الدوال في لغة ‪++C‬‬
‫يختلف تعريف العملية عن تعريف الدالة فقط في أن اسم‬
‫العملية يتكون من الكلمة ‪ operator‬متبوعا برمز العملية‬
‫على سبيل المثال ‪.+operator‬‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
‫تأ خذ دا لة العا مل ‪ operator function‬عندما تكون عضوا ل‬
‫في الفئة الشكل العام التي‪:‬‬
‫)‪return_type operator#(arg_list‬‬
‫{‬
‫‪// operations‬‬
‫}‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
‫‪‬حيث ‪-:‬‬
‫•‪ return_type‬هو قيمة إعادة الدالة ‪#operator :‬والتي‬
‫غالبا ل م ا ترج ع كائنا ل تابعا ل للفئ ة الت ي تعم ل عل ى كائناتها‬
‫ولكن يمكن أن يكون‪.return_type‬من أي نوع آخر‬
‫•‪ ++Operator‬كلمة أساسية في ‪.C :-‬‬
‫• ‪ -: #‬تستبدل بالعامل المراد تحميله بشكل زائد ‪ ،‬فمثل ل‬
‫إذا كن ا نقوم بتحمي ل العام ل ‪ +‬بشك ل زائ د نكتب‬
‫‪.operator‬‬
‫•‪Arg_list‬وه ى لئح ة الوس يطات الممرة إل ى الدالة ‪:-‬‬
‫‪ #operator‬والتي تحتوى على عنصر واحد إذا كنا نقوم‬
‫بتحميل عامل ثنائي )‪ (.... ،/ ،- ،+‬وتكون فارغة إذا كنا‬
‫‪++‬نقوم بتحميل عامل‪ (++، -- ، ....).C‬أحادى‬
‫•‪Operations‬العمليات المراد م ن العام ل المحمل ‪:-‬‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
‫وك ما ن ضع نموذ جا للدا لة المنتم ية دا خل تعر يف الصنف‬
‫يجب أيضا أن نضيف نموذجا للعملية المنتمية داخل تعريف‬
‫ال صنف‪ .‬فمثل لتعر يف العمل ية ‪ +‬كعمل ية منتم ية للصنف‬
‫‪ section‬بحيث تستخدم لضافة طالب جديد للشعبة يجب‬
‫أول أن نضع النموذج التالي‬
‫)‪;void operator+(student s‬‬
‫‪ ‬‬
‫داخل تعريف الصنف ‪. section‬‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
:‫ كما يلي‬section ‫بحيث يصبح تعريف الصنف‬
 
class section{
student sec[50];
int size;
int bsearch(long stno);
public:
section(){size=0;}
void operator+(student s); ‫عملية اعادة تحميل العمليات‬
void StAdd(student s);
int StDelete(long stno);
void Stlist();
void StRetrieve(long stno);
};
 
‫؟‬+operator ‫تعريف العملية‬
:  StAdd ‫ل يختلف عن نموذج الدالة‬+ operator ‫كما أن تعريف العملية‬

void section::operator+(student s)
{int pos=0;
// search for the proper insertion position
while(s.get_stno() > sec[pos].get_stno() && pos<size)
pos++;
// shift element up one position
for(int i=size-1;i>=pos;i--)
sec[i+1]=sec[i];
sec[pos]=s;
size++;
}
‫استدعاء ‪+operator‬؟‬
‫أما بالنسبة لستدعاء العملية فيمكننا استدعاءها كأي دالة‬
‫منتمية‪ ،‬فمثل لضافة الطالب ‪ S‬للشعبة ‪ cs100‬يمكننا أن‬
‫نستدعي العملية ‪ +‬كما يلي‬
‫)‪;cs100.operator+(S‬‬
‫‪ ‬‬
‫أما الطريقة الفضل لستدعاء العملية فهي أن‬
‫نستخدمها كأي عملية جمع أخرى كما يلي‪:‬‬
‫‪ ‬‬
‫‪;cs100 + S‬‬
‫استدعاء ‪+operator‬؟‬
‫‪‬تذكر عزيزي الطالب‪:‬‬

‫وبالط بع ف إن متر جم ل غة ‪ ++C‬يعرف بأن هذ ه العملية‬


‫ليست عملية جمع عادية بسبب نوع العوامل ‪ cs100‬و ‪S‬‬
‫ولذا فإ نه يقوم با ستدعاء العمل ية ‪ +‬ال تي قم نا نحن‬
‫بتعريفها‪.‬‬
‫اعادة تعريف‬
‫العمليا ت‬
‫العمليات التي يمكن اعادة تحميلها ‪:‬‬
‫‪+‬‬ ‫‪-‬‬ ‫*‬ ‫‪/‬‬ ‫‪%‬‬ ‫^‬
‫&‬ ‫|‬ ‫~‬ ‫!‬ ‫‪,‬‬ ‫=‬
‫<‬ ‫>‬ ‫=<‬ ‫=>‬ ‫‪++‬‬ ‫‪--‬‬
‫<<‬ ‫>>‬ ‫==‬ ‫=!‬ ‫&&‬ ‫||‬
‫=‪+‬‬ ‫=‪-‬‬ ‫=‪/‬‬ ‫=‪%‬‬ ‫=^‬ ‫=&‬
‫=|‬ ‫=*‬ ‫=<<‬ ‫=>>‬ ‫][‬ ‫)(‬
‫>‪-‬‬ ‫*>‪-‬‬ ‫‪new‬‬ ‫][ ‪new‬‬ ‫‪delete‬‬ ‫‪delete‬‬
‫][‬
‫اعادة تعريف‬
‫العمليا ت‬
‫العمليات التي يمكن ل اعادة تحميلها ‪:‬‬

‫‪::‬‬ ‫*‪.‬‬ ‫‪.‬‬ ‫‪?:‬‬


‫تذكر‪:‬‬
‫ل يمكن تغيير الخصائص التالية للعمليا ت عند إعادة‬
‫تعريفها ودهي ‪:‬‬

‫‪ ‬عدد العوامل‪ :‬فإذا كانت العملية في لغة ‪ ++C‬تأخذ عاملين ل‬


‫يمكن تعريفها بحيث تأخذ عامل واحدا على سبيل المثال‪.‬‬
‫‪ ‬أسبقية )أو أولوية( ‪ priority‬العملية‪ :‬فل يمكن إعادة تعريف‬
‫العملية ‪ +‬وإعطاؤها أولوية أعلى من تلك الخاصة بالعملية *‪.‬‬
‫‪ ‬ترتيب التنفيذ ‪ :associativity‬فإذا كان ترتيب تنفيذ العملية‬
‫من اليسار إلى اليمين ل يمكن تغيير هذا الترتيب وجعله من‬
‫اليمين إلى اليسار‪.‬‬
Unary ‫اعادة تعريف‬
Operators
include <iostream> // overloaded minus (-)
using namespace std; operator
class Distance{ Distance operator- ()
private: {
int feet; // 0 to feet = -feet;
infinite inches = -inches;
int inches; // 0 to return Distance(feet,
12 inches); }};
public: int main(){
// required constructors Distance D1(11, 10),
Distance(){ D2(-5, 11);
feet = 0; -D1; // apply
inches = 0; } negation
Distance(int f, int i){
D1.displayDistance(); //
feet = f;
display D1
inches = i; }
-D2; // apply
// method to display negation
distance
void displayDistance() D2.displayDistance(); //
{ display D2
cout << "F: " << feet return 0;}
‫اعادة تعريف‬
‫العمليا ت‬
‫الناتج من البرنامج السابق ‪:‬‬
‫‪F: -11 I:-10‬‬
‫‪F: 5 I:-11‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫أاشكال اعادة تحميل‬


‫للعمليا ت المختلفة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان تتعرف على اشكال اعادة تحميل العمليات‪.‬‬


‫ااشكال اعادة تحميل العمليا ت‬
‫م ن المميزات الجميل ة للغ ة ‪ ++C‬أنه ا تمكنن ا من إعادة‬
‫تعري ف العمليات ‪ operator‬المختلف ة بم ا يتناس ب مع‬
‫تطبيقاتنا‪.‬‬

‫وكما يمكننا أن نعرف الدالة كدالة منتمية أو صديقة فإنه‬


‫يمكنن ا أيض ا أ ن نعرف العملي ة كعملي ة منتمي ة أ و عملية‬
‫صديقة‪.‬‬

‫وكما أن تعريف العملية المنتمية ل يختلف كثيرا عن تعريف‬


‫الدالة المنتمية ل يختلف تعريف العملية الصديقة كثيرا عن‬
‫تعريف الدالة الصديقة‪.‬‬
‫ااشكال اعادة تحميل العمليا ت‬

‫وكمثال عل ى تعري ف الدوال الص ديقة س نعرف الن دالة‬


‫ص ديقة للص نف ‪ time‬الذي يمث ل وقت ا معين ا يتكون من‬
‫الس اعة والدقيق ة والثانية‪ .‬يمكنن ا أ ن نعرف هذا الصنف‬
‫باس تخدام ثلث ة متغيرات منتمية ‪ hour‬و ‪ min‬و ‪sec‬‬
‫لتمثيل الساعة والدقيقة والثانية على الترتيب‪.‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫لنفرض أنن ا نري د تعري ف العملي ة >> بحي ث تعرض لنا‬
‫الوق ت عل ى الشاش ة بطريق ة مناس بة فمثل عن د تنفيذ‬
‫العملية‬
‫;‪cout<<T‬‬
‫تكون النتيجة عرض الوقت كما يلي‬
‫‪The time is 12:23:30‬‬

‫على افتراض أن قيم المتغيرات المنتمية لة ‪T : hour‬‬


‫و‪ min‬و ‪ sec‬هي ‪ 12‬و ‪ 23‬و ‪ 30‬على الترتيب‪.‬‬
‫‪ ‬انتبه‪ :‬عزيزي الطالب‪ ،‬أن للعملية >> عاملن الول‬
‫هو ‪ cout‬والثاني كائن من الصنف ‪.time‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫في الواقع أن ‪ cout‬هو كائن من الصنف ‪ ostream‬كما‬
‫أن ‪ cin‬كائن من الصنف ‪.istream‬‬
‫إن العملية >> معرفة كعملية صديقة للصنف ‪ostream‬‬
‫كم ا أ ن العملي ة << معرف ة كعملي ة ص ديقة للصنف‬
‫‪.istream‬‬
‫وهذ ه العمليات معرفة بحيث يسمحن للعامل الثاني أن‬
‫يكون عددا صحيحا أو حقيقيا أو سلسلة رمزية … الخ‪.‬‬
‫وهذ ه التعاريف موجودة في المكتبة ‪.iostream‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫في الواقع أن ‪ cout‬هو كائن من الصنف ‪ ostream‬كما‬
‫أن ‪ cin‬كائن من الصنف ‪.istream‬‬

‫إن العملية >> معرفة كعملية صديقة للصنف ‪ostream‬‬


‫كم ا أ ن العملي ة << معرف ة كعملي ة ص ديقة للصنف‬
‫‪.istream‬‬

‫وهذ ه العمليات معرفة بحيث يسمحن للعامل الثاني أن‬


‫يكون عددا صحيحا أو حقيقيا أو سلسلة رمزية … الخ‪.‬‬
‫وهذ ه التعاريف موجودة في المكتبة ‪.iostream‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫وما نريد فعله هو إعطاء العملية >> تعريفا جديدا يسمح‬
‫للعام ل الثان ي بأ ن يكون م ن الص نف ‪ ،time‬لذا فإننا‬
‫سةةنعرفها كعمليةةة صةةديقة للصةةنف ‪ .time‬ولذا فإننا‬
‫سنضيف النموذج‪:‬‬

‫‪friend‬‬ ‫&‪osrteam‬‬ ‫&‪operator<<(ostream‬‬


‫;)‪c,time t‬‬

‫للصنف ‪. time‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
:‫ يصبح تعريفه‬time ‫الصنف‬
 
#include<iostream.h>
class time{
int hour;
int min;
int sec;
     public:
  time(int h, int m, int s){hour=h;
          min=m;
          sec=s;}
friend osrteam& operator<<(ostream& c,time t);
       };
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
:‫أما العملية نفسها فتعرف كما يلي‬

ostream& operator<<(ostream& C, time t)
{
  C<<”the time is 
“<<t.hour<<’:’<<t.min<<’:’<<t.sec<<endl;
  return C;
}
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن للعملية >> عاملين هما‪:‬‬

‫‪ .1‬العامل ‪ c‬وهو من النوع ‪ &ostream‬ويمثل الكائن‬


‫الذي نود عرض القيم ة عليه‪ .‬لح ظ أيضا‪ ،‬عزيزي‬
‫الدارس‪ ،‬أ ن هذا العام ل س يمرر بالشارة وذل ك لنه‬
‫من النوع ‪.&ostream‬‬
‫‪ .2‬والعام ل ‪ t‬وه و كائ ن م ن الصنف ‪ time‬والذي نود‬
‫عرض قيمته‪.‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫و الن نستطيع استخدام دهذه العملية كما يلي‬
‫;)‪time tt(12,30,23‬‬
‫;‪cout<<tt‬‬
‫إ ن العام ل الحقيق ي الول ‪ cout‬يمرر للعملي ة >> من‬
‫خلل العامل الرسمي ‪ C‬وأن العامل الحقيقي الثاني ‪tt‬‬
‫يمرر للعملية >> من خلل العامل الرسمي الثاني ‪.t‬‬
‫‪ ‬تذكر الجملة ‪:‬‬
‫)‪ostream& operator<<(ostream& C, time t‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫من المهم أن تلحظ‪ ،‬عزيزي الطالب ما يلي‪:‬‬
‫‪ ‬أنن ا عرفن ا للعملي ة >> عاملي ن وذل ك لنه ا عملية‬
‫ص ديقة وليس ت منتمي ة‪ ،‬إ ذ ل و كان ت منتمي ة لكتفينا‬
‫بتعري ف العام ل الثان ي عل ى اعتبار أ ن العامل الول‬
‫يعتبر تلقائيا على أنه من الصنف الذي تنتمي إليه هذ ه‬
‫العملية‪.‬‬
‫‪ ‬لح ظ أيض ا أ ن هذ ه العملي ة ترج ع قيم ة العامل ‪C‬‬
‫)لذلك فإن نوع القيمة المرجعة هو ‪ (&ostream‬وذلك‬
‫حتى نتمكن من استخدامها في سلسلة من العمليات‬
‫كما في الجملة‪:‬‬
‫;‪cout<<tt<<ss<<t2‬‬
‫حيث ‪ tt‬و ‪ ss‬و ‪ t2‬كائنات من الصنف ‪.time‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫الكلمة المفتاحية ‪This‬‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالكلمة المفتاحية ‪.This‬‬


‫الكلمة المفتاحية ‪This‬‬

‫يمتلك كل كائن في فئة مؤشرا ل خاصا ل يسمى ‪ this‬يشةةةةةةةةير إليةةةةةةةةةةه‪،‬‬


‫وباستخدام هذا المؤشر يستطيع أي عضو دالي في الفئة معرفة عنوان‬
‫الكائن الذي استدعا ه ‪.‬‬
This ‫الكلمة المفتاحية‬
-:where ‫المثال التالي يوضح هذا والذي يعرف الصنف‬
 

#include<iostream.h>
class where
{
private:
char chararray[10];
public:
//Continued
void reveal( )
{ cout <<”My Objects address is “<<this;
};
‫الكلمة المفتاحية ‪This‬‬
‫وهذا هو جزء ‪ main‬الذي يستدعي الدوال‪:‬‬
‫) (‪main‬‬
‫{‬
‫;‪where w1,w2‬‬
‫;) (‪w1.reveal‬‬
‫;) (‪w2.reveal‬‬
‫}‬
‫الكلمة المفتاحية ‪This‬‬
‫ينش ئ هذا ال برنامج كائنات م ن النوع ‪ ،where‬ويطلب‬
‫من كل منها عرض عنوانه باستعمال الدالة ‪،( )reveal‬‬
‫والتي تعرض قيمة المؤشر ‪.this‬‬
‫الخرج من البرنامج يبدو كالتالي‪:‬‬

‫‪My object’s address is ox8f4effec‬‬


‫‪My object’s address us ox8f4effe2‬‬
‫الكلمة المفتاحية ‪This‬‬

‫نلحظ إن عنوان الكائن ‪ w2‬يبتعد ‪ Bytes 10‬عن عنوان ‪،w1‬‬


‫وذلك لن البيانات في كل كائن تتألف من مصفوفة من ‪10‬‬
‫‪.Bytes‬‬
‫الكلمة المفتاحية ‪This‬‬
‫يم كن معام لة المؤ شر ‪ this‬كأي مؤشر كائنات آخر‪ ،‬لذا‬
‫يم كن استخدامه للو صول إ لى بيانات الكا ئن الذي يشير‬
‫إليه كما هو مبين في البرنامج أدنا ه‪.‬‬
This ‫الكلمة المفتاحية‬
-:test ‫المثال التالي يوضح دهذا والذي يعرف الصنف‬
#include<iostream.h>
class test {
public:
test(int=0);
void print( ) const;
private:
int x;
};
void test::print( ) const
//Continued
{
cout <<” X=”<<x<<endl
<<”this-> x= “<<this->x<<endl;
<<”(*this).x=”<<(*this).x<<endl;
}
‫الكلمة المفتاحية ‪This‬‬
‫وهذا هو جزء ‪ main‬الذي يستدعي الدوال‪:‬‬

‫) ( ‪main‬‬
‫{‬
‫;)‪test a(12‬‬
‫;) (‪a.print‬‬
‫;‪return 0‬‬
‫}‬
‫الكلمة المفتاحية ‪This‬‬
‫وللتوضيح فإن العضو الدالي ‪ print‬يقوم أول ل بطباعة ‪x‬‬
‫مباشرة‪ ،‬ثم يستعمل طريقتين للوصول إلى ‪ x‬باستعمال‬
‫المؤشر ‪: this‬‬

‫‪‬الولى‪ :‬باستعمال العامل )‪.(<-‬‬


‫‪‬الثانية‪ :‬باستعمال العامل )‪.(.‬‬
‫الكلمة المفتاحية ‪This‬‬
‫لحظ القواس التي تحيط بة *‪ ،this‬عندما نقوم باستخدام‬
‫العا مل )‪ (.‬للو صول إ لى أعضاء الف ئة نستعمل القواس‪،‬‬
‫وذلك لن العامل )‪ (.‬له أولوية أعلى من العامل *‪ ،‬وعليه‬
‫بدون القواس يتم تقييم التعبير *‪ this.x‬كالتي‪:‬‬
‫)‪*(this.x‬‬
‫والذي ينتج عرض رسالة خطأ من المصرف لن العامل )‪(.‬‬
‫ل يستخدم مع المؤشرات‪.‬‬
‫هنا لك ا ستعمالت أخرى للمؤ شر ‪ this‬ويظهر استعمالها‬
‫عند تحميلنا للعوامل بشكل زائد‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫العنانصر الثابتة )‪(static‬‬


‫إعداد‪ :‬أ‪ .‬طروب عيسى‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالعناصر الثابتة‪.‬‬


‫البيانا ت الساكنة‬
‫استعملنا حتى الن أعضاء بيانية مثيلية)‪ (instant‬أي أن‬
‫هنالك نسخة واحدة منها لكل كائن يتم إنشاؤ ه ولكن قد‬
‫نحتاج لمتغير ينطبق على كل كائنات الفئة‪.‬‬
‫لتحقيق ذلك نستعمل عضوا ل بيانيا ل ساكنا ل ‪static data‬‬
‫‪ member‬فعندما نعلن عن متغير في بيانات فئة ما على‬
‫أ نه ساكن ‪ static‬نعنى بذلك أنه ستكون هنالك نسخة‬
‫واحدة فقط من هذا المتغير في الذاكرة وستتشارك كل‬
‫الكائنات التاب عة لهذ ه الف ئة في هذا المتغ ير ب غض النظر‬
‫عن عدد هذ ه الكائنات ‪ .‬يتم تمهيد كل المتغيرات الساكنة‬
‫عند ‪ 0‬قبل إنشاء أي كائن ‪.‬‬
‫البيانا ت الساكنة‬
‫يتم تصريح المتغير الساكن ضمن الفئة باستعمال الكلمة‬
‫الساسية ‪:‬‬
‫‪static‬‬
‫ويتم تعريفه خارجها ‪ ،‬وذلك لنه إذا افترضنا أن البيانات‬
‫المعرفة داخل الفئة هي بيانات مثيلية مكررة لكل كائن‪.‬‬

‫إذن لتعر يف متغ ير يتوا جد مرة ل كل الف ئة علي نا تعريفه‬


‫خارج الفئة وتصريحه داخلها ليكون معروفا ل لبقية أعضائها‪.‬‬
‫البيانا ت الساكنة‬
:‫مثال توضيحي‬
#include<iostream.h>
class shared {
static int a;
‫العلن عن‬
int b; ‫ على انه‬a ‫المتغير‬
//Continued ‫ساكن‬

public:
void set(int i,int j) { a=i; b=j;}
void show( );};
int shared :: a; // define a
void shared :: show( ){
cout <<” This is static a: "<< a;
cout<<”\nThis is non_static b: " << b;
cout << "\n";}
‫العنانصر الثابتة )‪(static‬‬
‫يمك ن ف ي لغ ة س ي ‪ ++‬اس تعمال متغيرات ثابتة ذات أنواع‬
‫أس اسية ‪ ،‬حي ث ت م اس تعمالها لتعري ف ثاب ت كحج م مصفوفة ‪،‬‬
‫يمكن جعل كائن تابع لفئة ما ثابتا ل إذا كنا نريد ضمان عدم تغير‬
‫البيانات في الكائن‪.‬‬
‫وكمثال عل ى ذل ك ف ي الص نف‪ Time‬والت ي رأيناه ا ف ي امثلة‬
‫س ابقة‪ ،‬لنفترض أنن ا نري د إنشاء كائ ن يدعى )‪noon (12, 0, 0‬‬
‫سيكون من الجيد ضمان عدم تغيير قيمة هذا الكائن‪.‬‬
‫لتحقيق هذا نكتب العبارة ‪:‬‬
‫;)‪const Time noon( 12, 0, 0‬‬
‫والتي تعلن عن كائن ثابت ‪ noon‬في الفئة ‪ Time‬وتمهد قيمته عند‬
‫‪. 12‬‬
‫الكائنا ت الثابتة‬
‫‪Constant Objects‬‬

‫في مثالنا السابق ‪:‬‬


‫ل تسمح مصرفات ‪ ++C‬باستدعاء الكائنات الثابتة من قبل‬
‫العضاء الدالية في الفئة لضمان عدم تعديل بيانات هذ ه‬
‫الكائنات ‪ ،‬ول كن قد نر غب في ب عض الحيان في عرض‬
‫قي مة هذ ه الكائنات وال تي ل تؤ ثر ب أي حال من الحوال‬
‫على بياناتها‪.‬‬
‫‪ ‬فما هو الحل؟؟؟؟؟؟؟؟؟؟؟؟؟؟‬
‫الكائنا ت الثابتة‬
‫‪Constant Objects‬‬
‫لحل هذ ه المشكلة يمكن للمبرمج العلن عن دالت ثابتة‬
‫)‪ (const‬وهي عبارة عن أعضاء دالية تضمن أنه لن يتم‬
‫تغيير بيانات الكائن الذي استدعي من أجلها ‪.‬‬
‫ولجعل عضوا ل داليا ل ثابتا ل تتم كتابة الكلمة الساسية ‪const‬‬
‫في تعريف العضو الدالي وتصريحه مباشرة بعد القواس‬
‫التي تلي اسمه ‪.‬‬
‫الدال ت الثابتة‬
Constant Functions
:‫اليك عزيزي الطالب المثال التالي‬
-: Time ‫ التابع للفئة‬printMilitary ‫أدنا ه يبدو العضو الدالي‬
void Time::printMilitary( ) const

{
cout<< (hour < 10 ? “0” : “ “ ) << hour << “:”
<< (minute < 10 ? “0” : “ “) << minute << “:”
<< (second < 10 ? “0” : “ “ )<< second;
}
‫المعامل ت الساكنة‬
‫نفترض ان نا نر غب في تمر ير احدى المعاملت كمرجع‬
‫لزيادة كفاءة البرنامج مع عدم تمكين الدوال في العبث‬
‫في قيمة هذا المعامل‪ ،‬فماذا نفعل؟؟؟؟‬

‫يمكن في مثل هذ ه الحالة استخدام الكلمة المفتاحية‪:‬‬


‫‪const‬‬
‫قبل المعامل في جملة العلن عن الدالة‪ .‬مثال‪:‬‬
‫)‪;Void aFunc(int& a, const int& b‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫نصنف المجموعا ت ‪Class Set‬‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان تتعرف على مفهوم صنف المجموعات‪.‬‬


‫• ان تتعرف على العمليات المختلفة لصنف المجموعات‪.‬‬
‫نصنف المجموعا ت‬
‫تعرف المجمو عة بأن ها عدد من الشياء غ ير المرتبة‬
‫المأخوذة بدون تكرار من مدى ‪ Universe‬محدد‪ .‬ويحدد‬
‫المدى بأ صغر قي مة وأ كبر قي مة يم كن أن تنتم يا إلى‬
‫المجموعة‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫وهنالك العديد من العمليات التي تستخدم على المجموعات‬
‫أهمها‪:‬‬
‫‪ ‬إنشاء المجمو عة‪ :‬وسنعرف بناء ‪ constructor‬يقوم بهذ ه‬
‫العملية‪.‬‬
‫‪ ‬إضافة عنصر للمجموعة‪ :‬وسنعرف العملية ‪ +‬لتقوم بذلك‪.‬‬
‫‪ ‬إزالة عنصر من المجموعة‪ :‬وسنعرف العملية – لتقوم بهذ ه‬
‫المهمة‪.‬‬
‫‪ ‬تقا طع المجموعات ‪ :set intersection‬حيث يتكون حاصل‬
‫تقا طع مجموعت ين من جم يع العنا صر المشتر كة بين‬
‫المجموعتين ) أي ال تي تظ هر في المجموعتين(‪ .‬وسنعرف‬
‫العملية * لتنفيذ هذ ه العملية‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫‪ ‬اتحاد المجموعات ‪ :set union‬حيث يتكون حاصل اتحاد‬
‫مجموعتين من جميع العناصر التي تظهر في أي من هذ ه‬
‫المجموعات‪ .‬و سنعرف العمل ية ‪ +‬لتنفيذ هذ ه العملية‪.‬‬
‫لحظ أننا بذلك نكون قد أضفنا تعريفين للعملية ‪.+‬‬
‫‪ ‬النتماء إ لى المجمو عة‪ :‬ح يث يع تبر عن صرا ما منتميا‬
‫للمجموعة إذا ظهر في هذ ه المجموعة‪ .‬وسنكتب الدالة‬
‫‪ IN‬لتنفيذ هذ ه العملية‪.‬‬
‫‪ ‬تعيين المجموعات‪ :‬وتقوم هذ ه العملية بجعل مجموعة ما‬
‫مساوية لمجموعة أخرى‪ .‬وسنكتب العملية = لتنفيذ ذلك‪.‬‬
‫‪. ‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫‪‬التأكد من أن المجموعة خالية‪ :‬وتستخدم لفحص فيما‬
‫إذا كا نت المجمو عة خال ية أم ل‪ .‬و سنستخدم الدالة‬
‫‪ SetEmpty‬لعمل ذلك‪.‬‬
‫‪‬فرق المجموعات ‪ :set difference‬وتستخدم هذ ه‬
‫العملية ليجاد العناصر الموجودة في مجموعة وليست‬
‫موجودة في مجموعة أخرى‪.‬‬
‫‪‬عرض عنا صر المجمو عة ع لى الشا شة‪ :‬وسنعرف‬
‫العملية >> لعمل ذلك‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫سنفترض هنا أن مدى المجموعة مدى محدود بمعنى أننا‬
‫نس تطيع أ ن نعدد جميع عناص ر ه‪ .‬وذل ك لننا سنستخدم‬
‫مصفوفة ذات بعد واحد لتمثيل أي مجموعة حيث أن كل‬
‫عنصر في المدى يمثل بموقع في هذ ه المصفوفة‪.‬‬
‫فإذا كان ذلك العنصر منتميا إلى المجموعة نضع القيمة‬
‫‪ 1‬ف ي الموق ع المخص ص ل ه وإ ن ل م يك ن منتمي ا نضع‬
‫القيمة ‪ 0‬في الموقع المخصص له‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫فمثل لنفرض أن مدى المجموعة هو أسماء أيام السبوع‬
‫السبعة‪.‬‬
‫لتمثي ل هذ ه المجموع ة نس تخدم مص فوفة م ن سبعة‬
‫مواقع‪ ،‬موقع لكل عنصر في المدى‪.‬‬
‫إذا كان يوم الس بت عنص را ف ي المجموع ة فإننا نخزن‬
‫القيمة‪ 1‬في الموقع الول المخصص له وإذا لم يكن فإننا‬
‫نخزن القيمة ‪ 0‬في الموقع المخصص له‪.‬‬
‫ثم نأتي للموقع الثاني في المصفوفة و المخصص ليوم‬
‫الحد ونضع فيه القيمة ‪ 1‬إذا كان يوم الحد عنصرا في‬
‫المجموعة و ‪ 0‬إذا لم يكن وهكذا‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫يبين الش كل التا لي بالر سم م صفوفة تم ثل المجمو عة {‬
‫سبت‪،‬أثنين‪،‬خميس }‪:‬‬

‫مصفوفة تمثل المجموعة {سبت‪ ،‬أثنين‪،‬‬


‫خميس}‬
‫العمليا ت على نصنف المجموعا ت‬
:‫وسنستخدم الصنف التالي لتمثيل مجموعة من أيام السبوع‬
 
class Set{
int weekdays[7];
public:
Set();
void operator+(int i);
void operator-(int i);
friend Set operator*(Set S, Set T);
friend Set operator+(Set S, Set T);
int IN(int i);
void operator=(Set S);
int SetEmpty();
friend Set operator-(Set S, Set T);
friend ostream& operator<<(ostream& C, Set S);
};
‫العمليا ت على نصنف المجموعا ت‬
‫لح ظ‪ ،‬عزيزي الدارس‪ ،‬أ ن هذا الص نف يحتوي على‬
‫متغير منتم واحد هو ‪ weekdays‬والذي هو في الحقيقة‬
‫مصفوفة من سبعة مواقع كل موقع مخصص ليوم من‬
‫أيام السبوع‪.‬‬
‫كم ا يحتوي عل ى العدي د من نماذج الدوال والعمليات‬
‫المنتمية والصديقة‪.‬‬

‫سيتم مناقشتها في الفيديو المسجل العملي‪..........‬‬


‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫الوراثة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫يوضح المقصود بمصطلح الوراثة‬ ‫‪.1‬‬


‫الصنف المشتق‬

‫• إن الصنف المشت ق يرر ث جميع المتغيرات والدوال المنتمي ة للصنف‬


‫الاساس‪ .‬بمعنى أننا نستطيع أن نستخدمها تماما كما لو كانت معرفة‬
‫داخل الصنف المشتق‪ .‬على اسبيل المثال‪ ،‬بما أن لكل العقارات أعل ه‬
‫اسعرا وأجرة شهرية فإننا اسنعرفها بالاضافة للدوال الخاصة بمعالجتها‬
‫داخل الصنف الاساس ‪ ،property‬مما يمكن جميع الصناف المشتقة‬
‫من ااستخدامها دون الحاجة إلى إعادة تعريفها‪.‬‬
‫الصنف المشتق‬

‫ولكن بقي أن نقرر في أي قسم من أقسام الصنف الاساس ‪property‬‬


‫يجإإب أإإن نعرف هذ ه المتغيرات والدوال المنتمية‪ .‬إإإن تعريف هذ ه‬
‫المتغيرات والدوال في القسم الخاص من الصنف الاساس يجعلنا قادرين‬
‫على معالجته ا فقط م ن خلل الدوال المنتمي ة للصنف الاساس والدوال‬
‫الصديقة له‪ ،‬ول يمكننا ذلك من معالجة هذ ه المتغيرات والدوال المنتمية‬
‫من خلل الدوال المنتمية للصناف المشتقة‪ .‬وبالطبع يؤدي تعريفها في‬
‫القسم العام إلى السماح لجميع دوال البرنامج‪ ،‬دون ااستثناء‪ ،‬بمعالجتها مما‬
‫يشكل خرقا لمبدأ إخفاء البيانات‪.‬‬
‫الصنف المشتق‬

‫ولحل هذ ه المشكلة تزودنا لغة ‪ ++ C‬بنوع ثالث من القسام يدعى بالقسم المحمي‬
‫‪ . protected‬نعرف في هذا القسم جميع المتغيرات والدوال المنتمية والتي نريد‬
‫أن نكون قادرين على ااستخدامها من قبل الدوال المنتمية للصناف المشتقة‪.‬‬
‫وكمثال على ذلك اسنعرف الصنف ‪ property‬بحيث يحتوي على المتغيرين‬
‫المنتميي ن ‪ Price‬و ‪ Monthly_Rent‬والدوال الخاص ة بمعالجتهما كالبناء‬
‫لعطائهإإا قيمإإا ابتدائية و ‪ increase_rent‬و ‪ decrease_rent‬لزيادة‬
‫وإنقاص الجرة علإإإى الترتيإإإب‪ ،‬بالاضافإإإة إلى ‪ increae_price‬و‬
‫‪ decrease_price‬لزيادة وإنقاص السعر على الترتيب‪ .‬لحظ إن تعريف هذ ه‬
‫المتغيرات والدوال الخاص ة بمعالجته ا ف ي الصنف الاساس يجعلن ا قادرين على‬
‫توريثها لجميع الصناف المشتقة بحيث تستخدم عليها من دون الحاجة إلى كتابتها‬
‫مرة أخرى‪.‬‬
‫مثال‬
class property{
protected:
float Price;
float Monthly_Rent;
public:
property (float P=10000.0, float Rent=100.0)
{Price=P;
Monthly_Rent=Rent;
}
float increase_rent(float amt)
{ Monthly_Rent +=amt;
return Monthly_Rent;}
float decrease_rent(float amt)
{ Monthly_Rent -=amt;
return Monthly_Rent;}
float increase_price(float amt)
{ Price+=amt;
return Price;}
decrease_price(float amt)
{ Price -=amt;
return Price;}
};
‫الصنف المشتق‬

‫لحظ‪ ،‬عزيزي الدارس‪ ،‬وجود القس م المحمي ‪ protected‬في تعريف‬


‫هذا الصإإنف حيإإث عرفنإإا فيإإه المتغيريإإن المنتميين ‪ Price‬و‬
‫‪ ، Monthly_Rent‬مما يجعلها قابلة للمعالجة من قبل الدوال المنتمية‬
‫للصناف المشتقة من هذا الصنف‪ .‬لحظ أيضا أننا ااستخدمنا قيما تلقائية‬
‫في كتابة البناء كما أننا كتبنا جميع الدوال المنتمية للصنف ‪property‬‬
‫كدوال اسطرية وذلك لصغر حجمها‪.‬‬
‫إن تعريف صنف مشتق ل يختلف كثيرا عن تعريف الصنف الاساس إل‬
‫في تحديد الصنف أو الصناف التي اشتق منها وتحديد نوع الوراثة‪ .‬ويتم‬
‫ذلك بواضع العملية ‪ :‬بعد ااسم الصنف المشتق ثم تعدد أاسماء الصناف‬
‫الاساس على أن يسبق كل ااسم بنوع الوراثة‪ .‬ويفصل ااسم كل صنف عن‬
‫الذي يليه بفاصلة‪.‬‬
‫الصنف المشتق‬

‫ حيث يحتوي هذا الصنف‬،house ‫وكمثال على ذلك اسنعرف الن أول صنف مشتق وهو الصنف‬
‫ مساحة‬BArea ‫ يمثل المتغير‬.GArea ‫ و‬BArea ‫على متغيرين منتميين جديدين خاصين به هما‬
.‫ مساحة الحديقة‬GArea ‫البناء بينما يمثل المتغير‬

class house:public property


{private:
float BArea;
float GArea;
public:
house(float P=10000.0,float Rent=100.0,float B=150.0,float G=0.0);
float area(){return BArea+GArea;}
void print_info();
};
‫الصنف المشتق‬

‫والسؤال الن هو كيف اسنتعامل مع هذ ه المتغيرات و الدوال المنتمية التي‬


‫ورثها الصنف ‪ house‬هل نتعامل معها كمتغيرات خاصة أم عامة داخل‬
‫الص نف ‪ . house‬إ ن م ا يحدد ذل ك ه و نوع الوراث ة )المحدد بالكلمة‬
‫الواردة قبل ااسم الصنف الاساس في تعريف الصنف المشتق(‪ ،‬وهذا النوع‬
‫في مثالنا أعل ه هو ‪ public‬أي وراثة عامة‪.‬‬
‫الصنف المشتق‬

‫إن نوع الوراثة ‪ public‬يعني أن‪:‬‬

‫• المتغيرات والدوال المعرفة في القسم الخاص من الصنف الاساس تصبح غير‬


‫قابلة للمعالجة من قبل الدوال المنتمية للصنف المشتق‪.‬‬
‫• المتغيرات المعرفة في القسم المحمي ‪ protected‬من الصنف الاساس تبقى‬
‫محمية بالنسبة للصنف المشتق )أي كما لو كانت معرفة في القسم ‪protected‬‬
‫من الصنف المشتق(‪ .‬مما يعني أنه من الممكن معالجتها من قبل الدوال المنتمية‬
‫والصديقة للصنف المشتق ولي صنف مشتق منه‪.‬‬
‫• أما المتغيرات والدوال المعرفة في القسم العام ‪ public‬من الصنف الاساس‬
‫فإنها تبقى عامة بالنسبة للصنف المشتق )أي كما لو كانت معرفة في القسم‬
‫‪ public‬الخاص بالصنف المشتق( مما يعني إمكانية معالجتها من قبل أي دالة‪.‬‬
‫الصنف المشتق‬

‫لنعرف الن الدوال المنتمية للصنف المشتق ‪ house‬ولنبدأ بالبناء‪ .‬لحظ‪ ،‬عزيزي الدارس‪ ،‬أن لهذا البناء قيما‬
‫تلقائية‪.‬‬

‫)‪house::house(float P,float Rent,float B,float G‬‬


‫)‪: property(P,Rent‬‬
‫;‪{BArea=B‬‬
‫};‪GArea=G‬‬

‫إن كل ما يفعله هذا البناء هو ااستدعاء البناء الخاص بالصنف الاساس وذلك حتى يتم إعطاء قيم ابتدائية للمتغيرات‬
‫المعرفة في الصنف الاساس وهي ‪ Price‬و ‪ Monthly_Rent‬في مثالنا‪ .‬لحظ أننا واضعنا العبارة‬
‫)‪: property(P,Rent‬‬
‫في نهاية ترويسة البناء حتى تتم عملية ااستدعاء البناء ‪ property‬الخاص بالصنف الاساس‪ .‬وبالطبع ليس من‬
‫الضروري واضع هذ ه العبارة على اسطر جديد‪ .‬بعد ااستدعاء البناء ‪ property‬يتم تنفيذ الجمل الموجودة داخل‬
‫البناء ‪ house‬والتي تقوم بإعطاء المتغيرين ‪ BArea‬و ‪ GArea‬قيما ابتدائية‪ .‬أن هذا شكل آخر لعادة ااستخدام‬
‫الدوال عن طريق ااستدعائها في الموقع المنااسب‪.‬‬
‫الصنف المشتق‬

‫ والتي تقوم بطباعة كافة‬.house ‫ والمنتمية للصنف‬print_info ‫لنعرف الن الدالة‬


‫ مثل اسعر ه وأجرته الشهرية واساحة الحديقة‬house ‫المعلومات عن كائن من الصنف‬
.‫ومساحة البناء والمساحة الكلية‬

void house::print_info()
{cout<<endl<<"The Price is "<<Price
<<"\n The Montly Rent is "<<Monthly_Rent
<<"\n The house area is "<<BArea
<<"\n The area of the Garden is "<<GArea
<<"\n The Total Area(Garden+Building) is "<<area()
<<endl;
};
‫الصنف المشتق‬

‫و الن نستطيع إنشاء كائن من الصنف ‪ house‬وااستدعاء بعض الدوال عليه‪.‬‬


‫;‪house h‬‬
‫تقوم هذ ه الجملة بإنشاء الكائن ‪ h‬من الصنف ‪ house‬وااستدعاء البناء ‪house‬‬
‫لعطاء متغيراته المنتمية القيم التلقائية‪ .‬أما الجملة‬

‫‪cout<<"\n Rent after increment‬‬


‫;)‪"<<h.increase_rent(100.0‬‬

‫فتقوم بااستدعاء الدالة ‪ increase_rent‬لزيادة الجرة الشهرية الخاصة بالكائن‬


‫‪ h‬بمقدار ‪ 50.0‬وطباعة القيمة الجديدة لليجار‪ .‬لحظ‪ ،‬عزيزي الدارس‪ ،‬كيف أننا‬
‫ااستخدمنا الدالة ‪ increase_Rent‬كما لو كانت معرفة داخل الصنف ‪.house‬‬
‫والجملة‬
‫;)(‪h.print_info‬‬
‫تقوم باستدعاء الدالة ‪ print_info‬المنتمية للصنف ‪ house‬لطباعة كافة البيانات الخاصة بالكائن ‪.h‬‬

‫لنعرف ال ن الصنف المشتق ‪ flat‬والذي هو أيضا مشتق من الصنف ‪.property‬‬

‫‪class flat:public property‬‬


‫‪{ protected:‬‬
‫;‪float Area‬‬
‫‪public:‬‬
‫;)‪flat(float P=5000.0,float Rent=50.0,float A=120.0‬‬
‫;)(‪void print_info‬‬
‫;}‬

‫لظحظ‪ ،‬عزيزي الدارس‪ ،‬أ ن هذا الصنف يضم بالاضافة إلى المتغيرين ‪ price‬و ‪ Monthly_Rent‬المتغير ‪ Area‬والذي يمثل مساظحة الشقة‪ .‬ولذا فإ ن البناء‬
‫الخاص بهذا الصنف يقوم بعد استدعاء البناء الخاص بالصنف الساس بإعطاء هذا المتغير قيمة ابتدائية‪.‬‬

‫)‪flat::flat(float P,float Rent,float A): property(P,Rent‬‬


‫;‪{ Area=A‬‬
‫}‬

‫وتقوم الدالة ‪ print_info‬بطباعة كافة البيانات الخاصة بكائن من الصنف ‪.flat‬‬


‫)(‪void flat::print_info‬‬
‫‪{cout<<endl<<"The Price is "<<Price‬‬
‫‪<<"\n The Montly Rent is "<<Monthly_Rent‬‬
‫;‪<<"\n The flat area is "<<Area<<endl‬‬
‫;}‬
‫الصنف المشتق‬

‫ واسنعرف هذا الصنف كصنف‬.‫ والذي يمثل عمارة متعددة الطوابق‬Multi_Building ‫واسنعرف الن الصنف‬
‫ )والذي يمثل مساحة كل شقة لهذا الصنف( بالاضافة إلى‬Area ‫ وذلك حتى نور ث المتغير‬flat ‫مشتق من الصنف‬
.Monthly_Rent ‫ و‬Price ‫المتغيران‬

class Multi_Building: public flat


{private:
int NoStory;
int NoFlats;
public:

Multi_Building(float P=20000.0,float Rent=100.0,


float A=120.0,int S=1,int F=2);
float area(){return NoStory*NoFlats*Area;}
void print_info();
};
‫الصنف المشتق‬

Multi_Building::Multi_Building(float P,float Rent,float A,int S,int F)


: flat(P,Rent,A)
{NoStory=S;
NoFlats=F;
}
‫ والتي تقوم بحساب المساحة الكلية للمبنى بضرب عدد الطوابق بعدد الشقق‬area ‫ أننا عرفنا الدالة السطرية‬،‫ عزيزي الدارس‬،‫لحظ أيضا‬
.Area ‫في كل طابق ثم بمساحة الشقة‬
.Multi_Building ‫ تقوم بعرض جميع البيانات الخاصة بكائن من الصنف‬print_info ‫والدالة‬

void Multi_Building::print_info()
{cout<<endl<<"The Price is "<<Price
<<"\n The Montly Rent is "<<Monthly_Rent
<<"\n The flat area is "<<Area<<endl
<<"\n No of Stories is "<<NoStory
<<"\n No of flats per story is "<<NoFlats
<<endl;

}
. ++C ‫في الحقيقة نحن لم نستفد في مثالنا أعل ه من جميع المزايا التي تمنحنا إياها لغة‬
‫انواع الوراثة‬

‫أنواع الوراثة الخرى‬


‫ذكرنا فيما اسبق أن ما يحدد كيفية التعامل مع المتغيرات والدوال المنتمية‬
‫يعتمد على نوع الوراثة )والذي يحدد بالكلمة التي تسبق ااسم الصنف‬
‫الاساس عند تعريف الصنف المشتق(‪ .‬وااستخدمنا في مثالنا أعل ه نوعا‬
‫واحدا م ن أنواع الوراث ة وه و الوراث ة العام ة ‪ .public‬وهنالك أنواع‬
‫أخرى م ن الوراث ة ه ي الوراث ة خاص ة ‪ private‬و الوراث ة المحمية‬
‫‪ .protected‬وتعرف كل منهم ا بااس تخدام الكلم ة ‪ private‬والكلمة‬
‫‪ protected‬على الترتيب قبل ااسم الصنف الاساس في تعريف الصنف‬
‫المشتق‪.‬‬
‫انواع الوراثة‬

‫• الوراثة الخاصة‪:‬‬
‫• إذا اسبق ااسم الصنف الاساس بالكلمة ‪ private‬فهذا يعني أن نوع الوراثة‬
‫هي وراثة خاصة‪ .‬وفي هذ ه الحالة تور ث جميع المتغيرات والدوال المعرفة‬
‫في القسم المحمي ‪ protected‬والعام ‪ public‬من الصنف الاساس بحيث‬
‫تصبح خاصة في الصنف المشتق )كما لو كانت معرفة في القسم الخاص‬
‫من الصنف المشتق(‪.‬‬
‫• أم ا بالنس بة للمتغيرات والدوال المعرف ة ف ي القس م الخاص م ن الصنف‬
‫الاساس فإن الدوال المنتمية للصنف المشتق ل تستطيع معالجتها‪ .‬ويقال في‬
‫هذ ه الحالة أنها غير قابلة للمعالجة ‪ inaccessible.‬وهي عبارة غير دقيقة‬
‫تماما إذ يمكن معالجتها في الصنف المشتق لكن بااستخدام الدوال المنتمية‬
‫للصنف الاساس فقط والمعرفة )أي الدوال( في القسم العام أو المحمي‪.‬‬
‫انواع الوراثة‬

‫الوراثة المحمية‪:‬‬
‫أما إذا اسبق ااسم الصنف الاساس بالكلمة ‪ protected‬فإن الوراثة في هذ ه‬
‫الحالة وراثة محمية ‪ . protected‬وفي هذ ه الحالة فإن المتغيرات والدوال‬
‫المعرف ة ف ي القس م المحم ي ‪ protected‬والعام ‪ public‬م ن الصنف‬
‫الاساس تصبح محمية في الصنف المشتق )كما لو كانت معرفة في القسم‬
‫المحمي من الصنف المشتق(‪.‬‬
‫أم ا بالنس بة للمتغيرات والدوال المعرف ة ف ي القس م الخاص م ن الصنف‬
‫الاساس فإن الدوال المنتمية للصنف المشتق ل تستطيع معالجتها‪ .‬ويقال في‬
‫هذ ه الحالة أنها غير قابلة للمعالجة ‪ inaccessible‬؛ إذ ل يمكن معالجتها‬
‫ف ي الص نف المشت ق إل بااس تخدام الدوال المنتمي ة للص نف الاس اس فقط‬
‫والمعرفة )أي الدوال( في القسم العام أو المحمي‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫القوالب‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫يوضح المقصود بمصطلح النصناف القالبية‬ ‫‪.1‬‬


‫القوالب‬

‫• من المميزات المهمة للغة ‪ ++C‬والتي تجنبنا الحاجة إلى كتابة دوال‬


‫متشابهة إلى حد كبير هي أنها تمنحنا إمكانية تعريف دوال و أصناف‬
‫قال بية‪ .‬تس مح لن ا هذ ه الدوال و الص ناف القالبي ة القدرة عل ى تأجيل‬
‫تحديد نوع البيانات إلى حين الحاجة إلى هذ ه القوالب؛ مما يسمح لنا‬
‫بإعادة ااستخدام هذ ه القوالب مرة بعد مرة ولنواع مختلفة من البيانات‪.‬‬
‫وبذلك تعطينا لغة ‪ ++C‬طريقة أخرى لعادة ااستخدام البرامج ‪code‬‬
‫‪ reuse‬ل تقل أهمية عن الوراثة والصناف المشتقة‪ .‬وهنالك نوعان‬
‫من القوالب‪ :‬الدوال القالبية والصناف القالبية‪ .‬وفيما يلي اسنناقش كل‬
‫منها‪.‬‬
‫الدوال القالبية ‪Template Functions‬‬

‫يواج ه م برمجو اللغات الجرائي ة ‪ procedural languages‬مثل‬


‫البااسكال في كثير من الحيان مشكلة الحاجة إلى تكرار كتابة نفس الدالة‬
‫لنواع مختلفة من البيانات‪ .‬فمثل نضطر أحيانا إلى كتابة دالة لترتيب‬
‫قائمة من الطلبة ودالة أخرى لترتيب قائمة من الموظفين‪ ،‬ول تختلف‬
‫هاتان الدالتان إل في نوع البيانات التي يتعاملن معها‪ .‬تمنحنا لغة ‪++C‬‬
‫إمكاني ة تعري ف الدال ة كدال ة قالبي ة ل نحدد به ا نوع ال بيانات بل نوع‬
‫البيانات كعامل يحدد من قبل المبرمج عند الحاجة إلى تلك الدالة‪ .‬وعليه‬
‫يمكن تمرير نوع البيانات على أنه قائمة من الطلبة أو قائمة من الموظفين‬
‫وااس تخدام نف س الدال ة القلبي ة م ن دون الحاج ة إل ى إعادة كتابتها مرة‬
‫أخرى‪.‬‬
‫القوالب‬
‫وكمثال بسيط على كيفية تعريف دالة قالبية اسنعرف الدالة ‪ IsGreater‬والتي تأخذ عاملين من أي نوع‬
‫من البيانات و تقارن بينهما‪ .‬فإذا كان العامل الول هو الكبر تعيد القيمة ‪ 1‬وإل فإنها تعيد القيمة ‪.0‬‬

‫)‪template<class T> int IsGreater(T x,T y‬‬


‫)‪{ if (x>y‬‬
‫;‪return 1‬‬
‫‪else‬‬
‫;‪return 0‬‬
‫}‬
‫إن تعريف الدوال القالبية ل يختلف عن تعريف الدوال العتيادية إل في أول جملة أو ما يسمى بترويسة‬
‫الدالة‪ .‬إذ تبدأ الدالة القالبية بالكلمة ‪ template‬للشارة إلى أنها دالة قالبية‪ ،‬ثم بقائمة من العوامل تبدأ‬
‫بالرمز > و تنتهي بالرمز <‪ .‬وفي مثالنا أعل ه هنالك عامل واحد لهذ ه الدالة القالبية وهو ‪ class T‬وتعني‬
‫الكلمة ‪ class‬أن نوع العامل ‪ T‬هو ااسم لنوع من أنواع البيانات مثل ‪ int‬و ‪ float‬و ‪ … student‬الخ‪.‬‬
‫وقد ااستخدم هذا العامل في تعريف ‪ x‬و ‪ y‬إذ أنها من النوع ‪.T‬‬
‫استدعاء الدالة القالبية‬

‫أما بالنسبة لطريقة ااستدعاء الدالة القالبية فل تختلف عن طريقة ااستدعاء الدالة‬
‫العتيادية‪ ،‬والمثال التالي يواضح كيفية ااستدعاء الدالية القالبية أعل ه للمقارنة بين‬
‫رقمين صحيحين‪.‬‬

‫)(‪main‬‬
‫;‪{ int a=2,b=1‬‬
‫;)‪int z=IsGreater(a,b‬‬
‫;‪cou<<z‬‬
‫}‬
‫نستطيع ااستخدام هذ ه الدالة القالبية للمقارنة بين أي قيمتين مهما كان نوعهما شريطة‬
‫أن تكون العملية < معرفة لهذا النوع من البيانات‪ .‬فمثل لو أردنا ااستخدام الدالة‬
‫أعل ه للمقارنة بين موظفين من الصنف ‪ employee‬فل بد من أن نعرف أول‬
‫العملية < لهذا الصنف كما دراسنا في الوحدة السابقة‪.‬‬
‫مثال اخر‬
‫وكمثال آخر على الدوال القالبية اسنعرف الدالة القالبية ‪ sort‬والتي تقوم بترتيب مصفوفة من الكائنات من النوع‬
‫العام ‪ ،T‬حيث ‪ T‬هو عامل يحدد وفق الحاجة فقد يكون النوع ‪ student‬أو النوع ‪ employee‬أو ‪ int‬أو‬
‫‪ … float‬الخ‪ .‬تستخدم هذ ه الدالة خوارزمية الفرز النتقائي ‪ selection sort‬والتي اسبق مناقشتها‪.‬‬
‫)‪template<class T> void sort(T* st, int m‬‬
‫)‪{ for(int i=0;i<m-1;i++‬‬
‫;‪{ int pos=i‬‬
‫;]‪T min=st[i‬‬
‫)‪for(int j=i+1; j<m;j++‬‬
‫)‪if (st[j]<min‬‬
‫;]‪{ min=st[j‬‬
‫;‪pos=j‬‬
‫}‬
‫;]‪T a=st[pos‬‬
‫;]‪st[pos]=st[i‬‬
‫;‪st[i]=a‬‬
‫‪} //for i‬‬
‫‪} //sort‬‬
‫مثال اخر‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن العامل ‪ st‬هو عنوان أول عنصر في المصفوفة لذا فهو‬
‫من النوع ‪ ،*T‬بينما يمثل العامل ‪ m‬عدد عناصر المصفوفة لذا فهو من النوع ‪.int‬‬
‫لحظ أيضا‪ ،‬عزيزي الدارس‪ ،‬كيف ااستخدمنا النوع العام ‪ T‬لتعريف متغيرات محلية‬
‫داخل الدالة مثل ‪ min‬و ‪ . a‬والمثال التالي يبين كيفية ااستخدام الدالة ‪ sort‬لترتيب‬
‫مصفوفة من الموظفين ومصفوفة أخرى من الطلبة‪ .‬ومن المهم هنا أن نعررف العملية‬
‫> للصنف ‪ employee‬وأيضا للصنف ‪ student‬حيث أنها تستخدم داخل الدالة‬
‫‪ sort‬لمقارن ة ]‪ st[j‬م ع ‪ . min‬ويعود الم ر للم برمج ف ي كيفي ة تعريف هذ ه‬
‫العمليات‪ .‬ف ي مثالن ا التال ي اس نعرف العملي ة > للص نف ‪ employee‬على أاساس‬
‫مقارنة راتبي الموظفين‪ .‬أما بالنسبة للصنف ‪ sutdent‬فسنعرف العملية > على‬
‫أاساس مقارنة معدل علمات الطالبين‪ .‬وبالتالي فإننا عندما نستدعي ‪ sort‬لترتيب‬
‫مصفوفة من الموظفين فإنه اسيرتب تلك المصفوفة حسب رواتب هؤلء الموظفين‪.‬‬
‫أما عندما نستدعيه لترتيب مصفوفة من الطلبة‪ ،‬فانه اسيرتبها حسب معدل علمات‬
‫الطلبة‪.‬‬
‫مثال اخر‬
#include<iostream.h>
class employee{
long empNo;
char empName[20];
double salary;
public:
void initialize();
double get_salary(){return salary;}
friend int operator<(employee s1, employee s2);
};
void employee::initialize()
{cout<<"enter emp name ";
cin>>empName;
cout<<"enter emp Number ";
cin>>empNo;
cout<<"enter emp salary ";
cin>>salary;
}
int operator<(employee s1,employee s2)
{if (s1.salary<s2.salary)
return 1;
else
return 0;
}
‫مثال اخر‬
class student{
long stno;
int csno;
int courses[100];
char stName[20];
public:
double average();
void initialize();
long get_stno() {return stno;}
char* get_stname(){return stName;}
friend int operator<(student s1,student s2);
};
double student::average()
{ double sum=0;
for(int i=0;i<csno;i++)
sum=sum+courses[i];
return sum/csno;
}
int operator<(student s1,student s2)
{if (s1.average()<s2.average())
return 1;
else
return 0;
}
‫مثال اخر‬
template<class T> void sort(T* st, int m)
{ for(int i=0;i<m-1;i++)
{ int pos=i;
T min=st[i];
for(int j=i+1; j<m;j++)
if (st[j]<min)
{ min=st[j];
pos=j;
}
T a=st[pos];
st[pos]=st[i];
st[i]=a;
} //for i
} //sort

void student::initialize()
{
cout<<"enter student's number";
cin>>stno;
cout<<"enter student's name ";
cin>>stName;
cout<<"enter no. of courses taken by the student";
cin>>csno;
for(int i=0;i<csno;i++)
{cout<<"enter grade no."<<i+1;
cin>>courses[i];
}
}
‫مثال اخر‬
main()
{ student stu[100];
int n;
cout<<"Enter no. of students";
cin>> n;
for(int i=0;i<n;i++)
stu[i].initialize();
// call sort to sort the students according to average
sort(stu,n);
for(i=0; i<n;i++)
cout<<stu[i].average()<<"\n";

employee emp[100];
cout<<"enter number of employees"<<endl;
cin>>n;
for(i=0;i<n;i++)
emp[i].initialize();
sort(emp,n);
for(i=0;i<n;i++)
cout<<emp[i].get_salary()<<"\n";
}
‫الصناف القالبية ‪Template Classes‬‬

‫• تذك ر‪ ،‬عزيزي الدارس‪ ،‬أنن ا عرفن ا الص نف ‪) section‬شعب ة( ف ي الوحدة الس ابعة عل ى أنها‬
‫مجموعة من الطلبة )من الصنف ‪ ( student‬وعرفنا الدوال المنتمية اللزمة لمعالجتها )لاضافة‬
‫طالب جديد أو حذف طالب … الخ(‪ .‬تصور الن أننا بحاجة إلى شعبة من نوع جديد من الطلبة‪،‬‬
‫طلبة درااسات عليا ‪ Postgrads‬على اسبيل المثال )والذي قد يختلف عن الصنف ‪student‬‬
‫لوجود متغير منتمي يمثل ااسم المشرف‪ ،‬ومتغير منتمي آخر يمثل اسنة إنهاء الشهادة الجامعية‬
‫الولى(‪ .‬ولنفرض أننا بحاجة إلى نفس الدوال لمعالجة هذا النوع الجديد من الشعب‪ .‬وااضح أننا لو‬
‫عرفنا هذا النوع الجديد من الشعب لكررنا كتابة الكثير من الدوال والتعاريف ل تختل ف عن‬
‫الصنف ‪ section‬إل في نوع البيانات التي تعالج‪ .‬ولتجنب ذلك تسمح لنا لغة ‪ ++C‬بأن نعرف‬
‫الصنف ونستخدم في تعريف متغيراته المنتمية أنواعا عامة تمرر كعوامل‪ .‬يسمى ذلك الصنف‬
‫بالصنف القالبي ‪ .Template Class‬فمثل لو عرفنا الصنف ‪ section‬كصنف قالبي فإن هذا‬
‫يمكننا من ااستخدام هذا الصنف لنشاء شعبة متغيراتها المنتمية من نوع ‪ student‬وشعبة أخرى‬
‫متغيراتها المنتمية من الصنف ‪ PsotGrad‬دون الحاجة إلى تكرار تعريف الصنف ‪section‬‬
‫أو أيا من دواله المنتمية‪.‬‬
Template Classes ‫الصناف القالبية‬
‫ الذي‬T ‫ من النوع العام‬sec ‫ كصنف قالبي حيث اسنعرف المصفوفة‬section ‫اسنعرف الن الصنف‬
‫ ويمثل‬MaxSize ‫هو عامل من عوامل هذا الصنف القالبي كما اسنستخدم عامل آخر لهذا الصنف‬
.‫عدد عناصر الشعبة‬

template <class T, int MaxSize> class section{


T sec[MaxSize];
int size;
int bsearch(long stno);
public:
section(){size=0;}
void StAdd(T s);
int StDelete(long stno);
void Stlist();
void StRetrieve(long stno);
};
‫الصناف القالبية ‪Template Classes‬‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن تعريف هذا الصنف اختلف عن تعري ف الصنف ‪ section‬المعرف في الوحدة‬
‫السابعة من النواحي التالية‪:‬‬
‫• بدأنا تعريف الصنف بالعبارة‬
‫>‪template <class T, int MaxSize‬‬
‫والتي تدل على أن هذا الصنف هو صنف قالبي له عاملين الول ‪ T‬ويمثل نوع البيانات والثاني ‪MaxSize‬‬
‫ويمثل حجم المصفوفة‪.‬‬
‫• إن المصفوفة ‪ sec‬هي الن من النوع ‪ T‬وحجمها أي عدد عناصرها هو ‪.MaxSize‬‬

‫عند إنشاء كائن من هذا الصنف القالبي يجب تزويد هذ ه العوامل )‪ T‬و ‪ (MaxSize‬بالقيم الفعلية لها‪ .‬على اسبيل‬
‫المثال لنشاء شعبة من الطلبة من النوع ‪ student‬و بحجم ‪ 50‬عنصرا فإننا نستخدم الجملة‬
‫;‪section<student, 50> cs100‬‬
‫والن نستطيع ااستخدام الكائن ‪) cs100‬وهو شعبة من الطلبة( كأي كائن آخر مستخدمين الدوال المنتمية له‪.‬‬
‫ولنشاء شعبة من الطلبة من الصنف ‪ postgrad‬وبحجم ‪ 20‬طالب فإننا نستخدم الجملة‬
‫;‪section<postgrad, 20> cs700‬‬
‫والن لدينا الكائن ‪ cs700‬الذي يمثل شعبة من طلبة الدرااسات العليا؛ ونستطيع ااستخدام هذا الكائن من خلل‬
‫الدوال المنتمية المعرفة للصنف القالبي‪.‬‬
‫الصناف القالبية ‪Template Classes‬‬
‫أما بالنسبة لتعريف الدوال المنتمية للصنف القالبي ‪ section‬فيجب أن يسبق تعريف‬
‫أي دالة بالعبارة‬
‫‪>template<class T, int MaxSize‬‬
‫ثم يأتي نوع القيمة المرجعة ثم ااسم الصنف القالبي فالعوامل )بدون تحديد النوع( بين‬
‫الرمزين > <‪ .‬وفيما يلي نعرف الدوال المنتمية للصنف القالبي ‪.section‬‬
Template Classes ‫الصناف القالبية‬
section ‫ إلى الإ‬T ‫ من النوع العام‬s ‫ وتقوم هذ ه الدالة بإاضافة الكائن‬StAdd •
template<class T, int MaxSize>
void section<T,MaxSize>::StAdd(T s)
{int pos=0;
// search for the proper insertion position
while(s.get_stno() > sec[pos].get_stno() && pos<size)
pos++;
// shift elements one position up
for(int i=size-1;i>=pos;i--)
sec[i+1]=sec[i];
sec[pos]=s;
size++;
}
‫الصناف القالبية ‪Template Classes‬‬
‫• ‪ Stlist‬وتقوم هذ ه بعرض البيانات الخاصة بكل طالب في الشعبة‬
‫قد تختلف البيانات الخاصة بالطالب والتي نود عراضها حسب نوع الطالب فإذا كان‬
‫م ن النوع ‪) PostGrad‬طال ب درااس ات علي ا( عل ى اس بيل المثال فق د نحتاج إلى‬
‫طباعة ااسم المشرف‪ .‬و هذا المر غير وارد لطالب من نوع النوع ‪ .student‬ولحل‬
‫هذ ه المشكلة علينا تعريف العملية >> للصنف ‪ PostGrad‬والعملية نفسها للصنف‬
‫‪ student‬؛ بحيث تقوم هذ ه العملية بطباعة البيانات المطلوبة لكل نوع من الطلبة‪.‬‬
‫راجع‪ ،‬عزيزي الدارس‪ ،‬الوحدة السابقة لمعرفة كيف تعرف العمليات‪.‬‬

‫>‪template<class T, int MaxSize‬‬


‫)(‪void section<T,MaxSize>::Stlist‬‬
‫)‪{ for(int i=0;i<size;i++‬‬
‫} ;]‪cout<<sec[i‬‬
‫الصناف القالبية ‪Template Classes‬‬
‫‪bsearch‬‬
‫وتقوم هذ ه الدالة بااس تخدام خوارزمي ة البح ث الثنائ ي للبح ث ع ن طال ب معي ن في‬
‫الشعبة مستخدمين رقمه‪ .‬ومن المهم جدا أن تلحظ‪ ،‬عزيزي الدارس‪ ،‬أن هذ ه الدالة‬
‫تفترض أن لكل طالب مهما كان نوعه )‪ PsotGrad‬أو ‪ (student‬رقما وأن الدالة‬
‫‪ get_stno‬تسترجع قيمة هذا الرقم لي طالب‪ .‬مما يعني أن علينا تعريف الدالة‬
‫‪ ()get_stno‬للصنف ‪ student‬وللصنف ‪.PostGrad‬‬
Template Classes ‫الصناف القالبية‬
bsearch
// binary search
template<class T, int MaxSize>
int section<T,MaxSize>::bsearch(long sn)
{
int lo=0;
int hi=size-1;
while (lo <= hi)
{ int mid =(lo+hi) /2;
long r=sec[mid].get_stno();
if (r== sn)
return mid+1;
else
if (sn>r)
lo=mid+1;
else
hi = mid;
} //while
return -1;
}
Template Classes ‫الصناف القالبية‬
‫وتقوم هذ ه الدالة بشطب طالب ذي رقم معين من الشعبة‬. StDelete •
template<class T, int MaxSize>
int section<T,MaxSize>::StDelete(long stno)
{int i=bsearch(stno);
if(i>-1)
{for(int j=i;j<size-2;j++)
sec[j]=sec[j+1];
size--;
}
return i;
}
Template Classes ‫الصناف القالبية‬
StDelete •
‫ عزيزي‬،‫ لحظ‬.‫تقوم هذ ه الدال ة بالبح ث ع ن طال ب ذي رق م معي ن وعرض ال بيانات الخاص ة به‬
.‫ أن هذ ه الدالة أيضا تفترض أن العملية >> معرفة لنوع الطلبة‬،‫الدارس‬

template<class T, int MaxSize>


void section<T,MaxSize>::StRetrieve(long stno)
{int i=bsearch(stno);
if(i>-1)
cout<<sec[i];
else
cout<<"Student no "<<stno<<" was not found \n";
}
Template Classes ‫الصناف القالبية‬
.student ‫ باستخدام الصنف القالبي أعل ه لبد أول من تعريف الصنف‬student ‫• لنشاء شعبة من الطلبة من النوع‬
‫ وفيم ا يلي تعريفا محتمل للنوع‬.>> ‫ و العملي ة‬get_stno ‫ يج ب أ ن نعرف لهذا الص نف الدالة‬،‫وكم ا قلن ا س ابقا‬
student
• #include<iostream.h>
• class student{
• long stno;
• int csno;
• double grades[100];
• char StName[20];
• public:
• double average();
• void initialize();
• long get_stno() {return stno;}
• char* get_stname(){return StName;}
• double get_grade(int i);
• friend ostream& operator<<(ostream& c, student t);
• };
• ostream& operator<<(ostream& c, student t)
• {c<<"\n Student Name "<<t.StName;
• c<<"\n Student No "<<t.stno;
• c<<"\n Number of courses "<<t.csno;
• c<<"\n the average grades is"<<t.average()<<endl;
• return c;
• }
Template Classes ‫الصناف القالبية‬
.‫ وكيفية استخدامه‬section ‫والدالة الرئيسة التالية تعطي مثال على كيفية إنشاء كائن من الصنف‬
main()
{ // create a section of type student
section<student, 50> cs100;
int choice;
do
{cout<<"\n\n \t Enter 1 to add a new student \n";
cout<<"\t Enter 2 to delete a student \n";
cout<<"\t Enter 3 to some information about a student \n ";
cout<<"\t Enter 4 to get a list of all students \n";
cout<<"\t Enter 5 to Exit \n";
cin>>choice;
switch(choice){
case 1: // student add
student s;
s.initialize();
cs100.StAdd(s);
break;
case 2: // delete a student
long sn;
cout<<"Enter student number ";
cin>>sn;
cs100.StDelete(sn);
break;
case 3: // retrieve some data about an employee
cout<<"Enter student number ";
cin>>sn;
cs100.StRetrieve(sn);
break;
case 4: // list information about all students
cout<<"Students information \n\n";
cs100.Stlist();
break;
case 5: cout<<"End of program \n";
break;
default: cout<<"invalid choice ... Try again ";
}}
while(choice!=5); }
(1) ‫برمجة‬

‫الوحدة الخامسة‬
‫الوراثة‬
Inheritance

AbdulRahman M.Baraka
2012
‫الوراثة‬
‫هي عملية اشتقاق صنف من صنف آخر‪.‬‬ ‫‪‬‬

‫‪Student‬‬
‫‪:‬‬ ‫(‪.‬‬ ‫‪Super‬‬ ‫)‬ ‫(‬‫‪Base‬‬ ‫)‬ ‫القاعدة‬ ‫صنف‬ ‫‪‬‬

‫هو الصنف الذي يحتوي العمليات والبيانات المراد‪<<private>> name:String‬‬


‫‪<<public>> String‬‬ ‫توريثها‪.‬‬
‫‪getName().‬‬
‫‪<<public>> void‬‬
‫‪changeName().‬‬ ‫‪ ‬صنف مشتق )‪:(Sub) (Derived‬‬
‫هو الصنف الذي يحتوي العمليات والبيانات‬
‫‪GraduatedStudent‬‬ ‫الموروثة بالاضافة الى بياناته وعملياته‬
‫‪<<private>> GradYear:int‬‬ ‫الخاصة به‪.‬‬
‫‪<<public>> int getYear ().‬‬
‫‪<<public>> void‬‬
‫‪changeYear().‬‬ ‫‪Inheritance1.cp‬‬
‫الوراثة‬
‫اذا كان لدين ا عملي ة ف ي الص نف المورث والص نف المشتق‬ 
.‫ويحملن نفس المسم‬
‫يمك ن امس تدعاء الدال ة الت ي بالص نف المورث م ن الدال ة التي‬ 

Student :‫بالصنف المشتق على النحو التالي‬


<<private>> name:String
<<public>> String ()Student::print 
getName().
<<public>> void
changeName().
<<public>> void print().
GraduatedStudent
<<private>> GradYear:int
<<public>> int getYear ().
<<public>> void
Inheritance1a.c
changeYear().
‫الوراثة ‪ :‬البناء والهدام‬
‫‪‬‬ ‫;‪GraduatedStudent x‬‬

‫‪Student‬‬
‫عند تعريف كائن مشتق ‪:‬‬ ‫‪‬‬

‫;‪<<private>> string name‬‬ ‫يتم امستدعاء البناء الخاص بالصنف المورث‬ ‫‪‬‬

‫‪<<public>> Student().‬‬ ‫أول بشكل تلقائي ثم يتم امستدعاء البناء‬


‫‪<<public>> ~Student().‬‬ ‫الخاص بالصنف المشتق ثانيا وبشكل تلقائي‪.‬‬

‫عند حذف كائن مشتق – أو النتهاء‪: -‬‬ ‫‪‬‬


‫‪GraduatedStudent‬‬ ‫يتم امستدعاء الهدام الخاص بالصنف المشتق‬ ‫‪‬‬
‫;‪<<private>> string Year‬‬ ‫أول بشكل تلقائي ثم يتم امستدعاء الهدام‬
‫‪<<public‬‬ ‫الخاص بالصنف المورث ثانيا وبشكل تلقائي‪.‬‬
‫‪GraduatedStudent().‬‬
‫~ >>‪<<public‬‬ ‫‪Inheritance2.cp‬‬
‫‪GraduatedStudent().‬‬
‫ البناء والهدام‬: ‫الوراثة‬
 GraduatedStudent x;

Student
‫اذا كان لدينا اكثر من بناء في الصنف‬ 
.‫المورث‬
<<public>> Student(). : ‫في بناء الصنف المشتق‬ 
<<public>> Student(int ‫يمكن تحديد البناء المراد تنفيذه في الصنف‬ 
x).
<<public>> ~Student().
.‫المورث‬

GraduatedStudent

<<public
GraduatedStudent().
<<public>> ~ Inheritance3.cp
GraduatedStudent().
‫مستوى الوصول )‪Access‬‬
‫‪(Modifier‬‬
‫خاص )‪:(Private‬‬ ‫‪‬‬

‫ل يسمح بالتعامل معه إل اعضاء نفس الصنف )‪.(Class‬‬ ‫‪‬‬

‫عام )‪:(Public‬‬ ‫‪‬‬

‫مسموح بالتعامل معه مع جميع الصناف الخرى‪.‬‬ ‫‪‬‬

‫صديق )‪:(Friend‬‬ ‫‪‬‬

‫ل يسمح بالتعامل معه إل اعضاء نفس الصنف )‪ .(Class‬أو‬ ‫‪‬‬


‫اعضاء الصنف الصديق معه‪.‬‬
‫محمي )‪:(Protected‬‬ ‫‪‬‬

‫ل يسمح بالتعامل معه إل اعضاء نفس الصنف )‪ .(Class‬أو‬ ‫‪‬‬


‫اعضاء الصنف المورث وراثة عامة‪.‬‬
‫‪Inheritance4.cp‬‬
‫الوراثة ‪ :‬مستوى الوصول )انواع الوراثة(‬
‫أنواع الوراثة تحدد كيفية تعامل أنواع البيانات والدوال بين الصناف المورثة‪.‬‬ ‫‪‬‬

‫قاعدة عامة ‪ :‬البيانات والدوال الخاصة )‪ (Private‬ل تورث أبدا‪.‬‬ ‫‪‬‬

‫الوراثة الخاصة )‪:(Private‬‬ ‫‪.1‬‬


‫‪ ‬البيانات في الصنف المورث – المساس – تصبح خاصة في المشتق‪.‬‬
‫‪All type -> Private ‬‬

‫الوراثة المحمية )‪:(Protected‬‬ ‫‪.2‬‬


‫‪ ‬البيانات في الصنف المورث – المساس – تصبح محمية في المشتق‪.‬‬
‫‪All type -> Protected ‬‬

‫الوراثة العامة )‪:(Public‬‬ ‫‪.3‬‬


‫‪ .1‬البيانات في الصنف المورث – المساس – تصبح عامة في المشتق‪.‬‬
‫‪Protected -> Protected .2‬‬
‫‪Other type (except private)-> Public‬‬ ‫‪.3‬‬
(‫ مستوى الوصول )انواع الوراثة‬: ‫الوراثة‬
‫أنواع الوراثة تحدد كيفية تعامل أنواع البيانات والدوال بين الصناف‬ 
.‫المورثة‬

Type of Inheritance
Access Control

private protected public


for Members

private - - -
protected private protected protected
public private protected public

Inheritance4.cp
‫الوراثة المتعددة‬

‫‪‬‬ ‫ـ‬

‫‪Inheritance5.cp‬‬
‫ البناء والهدام‬: ‫الوراثة المتعددة‬
Constructor

3 1 2
ass C : public A, public B
1 3 2

Destructor
Template ‫الصناف والدوال القالبية‬
.‫هي المقدرة على تأجيل تحديد نوع البيانات المستخدمة‬ 

:‫الصيغة العامة‬ 

template <class T> int Max(T x, T y)


{
if (x>y)
return x;
else
return y;};

int main()
{

cout<<Max(10,50)<<endl;

system ("pause");
return 0;
} template.cpp
‫تعدد الوجه )‪(Polymorphism‬‬
‫هي المقدرة على تأجيل تحديد هوية الدالة المراد امستعمالها من وقت‬ ‫‪‬‬
‫الترجمة )‪ (Compile Time‬الى وقت التنفيذ )‪Run‬‬
‫‪.(Time‬‬

‫‪Inheritance4.cp‬‬
‫نهاية‬
‫الوحدة‬
)1( ‫برمجة‬

AbdulRahman M.Baraka
2017
AbdulRahman M.Baraka (2017) 1
AbdulRahman M.Baraka (2017) 2
‫• هي عملية اشتقاق صنف من صنف آخر‪.‬‬

‫• صنف القاعدة (‪Base) (Super). :‬‬


‫‪Student‬‬
‫‪ o‬هو الصنف الذي يحتوي العمليات والبيانات المراد توريثها‪.‬‬
‫;‪<<private>> string name‬‬
‫‪<<protected>> void changeName().‬‬ ‫• صنف مشتق ( ‪Derived) (Sub):‬‬
‫‪<<public>> string getName().‬‬
‫‪ o‬هو الصنف الذي يحتوي العمليات والبيانات الموروثة باإلضافة‬
‫الى بياناته وعملياته الخاصة به‪.‬‬

‫‪GraduatedStudent‬‬ ‫• المتغيرات والدوال الخاصة ال تورث أبدا‪.‬‬


‫‪<<private>> int GradYear:int‬‬
‫‪<<public>> string getName().‬‬
‫‪<<public>> void changeYear().‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪3‬‬


Class Student
{
private:
string name;
protected:
Student void changeName(){};
<<private>> string name; Public:
string getName(){};
<<protected>> void changeName(). };
<<public>> string getName().

Class GraduatedStudent : public Student


{
private:
GraduatedStudent int GradYear:int;
<<private>> int GradYear:int Public:
void changeYear(){};
<<public>> string getName(). string getName(){};
<<public>> void changeYear(). };

AbdulRahman M.Baraka (2017) 4


Class Student
{ :)Student( ‫ الصنف‬-)private( •
private:
string name; .‫ متاح فقط للصنف نفسه‬.)name( ‫ المتغير‬o
protected:
void changeName(){}; :)changeName()( ‫• الدالة‬
Public:
string getName(){};
}; :)getName()( ‫• الدالة‬
Class GraduatedStudent : public Student
{
private:
int GradYear:int;
Public:
string getName(){};
};

Void main(){
Student s;
GraduatedStudent gs;
}; AbdulRahman M.Baraka (2017) 5
Class Student
{ :)Student( ‫ الصنف‬- )protected( •
private:
string name; .‫ متاح فقط للصنف نفسه‬.)name( ‫ المتغير‬o
protected:
void changeName(){}; :)changeName()( ‫• الدالة‬
Public:
string getName(){}; .‫ متاح للصنف نفسه‬o
};
.‫ وللصنف المشتق‬o
Class GraduatedStudent : public Student
{ :)getName()( ‫• الدالة‬
private:
int GradYear:int;
Public:
string getName(){};
};

Void main(){
Student s;
GraduatedStudent gs;
}; AbdulRahman M.Baraka (2017) 6
Class Student
{ :)Student( ‫ الصنف‬- )public( •
private:
string name; .‫ متاح فقط للصنف نفسه‬.)name( ‫ المتغير‬o
protected:
void changeName(){}; :)changeName()( ‫• الدالة‬
Public:
string getName(){}; .‫ متاح للصنف نفسه‬o
};
.‫ وللصنف المشتق‬o
Class GraduatedStudent : public Student
{ :)getName()( ‫• الدالة‬
private:
int GradYear:int; .‫ متاح للصنف نفسه‬o
Public:
string getName(){}; .‫ وللصنف المشتق‬o
}; .‫ ولجميع الدوال واألصناف األخرى‬o

Void main(){
Student s;
GraduatedStudent gs;
}; AbdulRahman M.Baraka (2017) 7
.‫• اذا كان لدينا عملية في الصنف المورث والصنف المشتق ويحمالن نفس االسم‬

.)::( ‫• يتم استدعاء الدالة مسبوقا باسم الصنف والعالمة‬


Student Student::getName() •
<<private>> string name;
<<protected>> void changeName().
<<public>> string getName().

GraduatedStudent
<<private>> int GradYear:int
<<public>> string getName().
<<public>> void changeYear().

AbdulRahman M.Baraka (2017) 8


‫• يتم استدعاء البناء الخاص بالصنف المورث أوال بشكل تلقائي ثم يتم استدعاء البناء‬
‫الخاص بالصنف المشتق ثانيا وبشكل تلقائي‪.‬‬

‫• يتم استدعاء الهدام الخاص بالصنف المشتق أوال بشكل تلقائي ثم يتم استدعاء الهدام‬
‫الخاص بالصنف المورث ثانيا وبشكل تلقائي‪.‬‬
‫‪Student‬‬
‫;‪<<private>> string name‬‬
‫‪<< public >> void Student().‬‬
‫‪<< public >> ~Student().‬‬

‫‪GraduatedStudent‬‬
‫‪<<private>> int GradYear:int‬‬
‫‪<<public>> GraduatedStudent().‬‬
‫‪<<public>> ~GraduatedStudent().‬‬
‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪9‬‬
‫مستوى الوصول )‪:(Access Modifier‬‬ ‫•‬

‫خاص (‪:)Private‬‬ ‫•‬


‫ال يسمح بالتعامل معه إال اعضاء نفس الصنف (‪.)Class‬‬ ‫‪o‬‬

‫عام (‪:)Public‬‬ ‫•‬


‫مسموح بالتعامل معه مع جميع االصناف االخرى‪.‬‬ ‫‪o‬‬

‫صديق (‪:)Friend‬‬ ‫•‬


‫ال يسمح بالتعامل معه إال اعضاء نفس الصنف (‪ .)Class‬أو اعضاء الصنف الصديق معه‪.‬‬ ‫‪o‬‬

‫محمي (‪:)Protected‬‬ ‫•‬


‫ال يسمح بالتعامل معه إال اعضاء نفس الصنف (‪ .)Class‬أو اعضاء الصنف المورث وراثة عامة‪.‬‬ ‫‪o‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪10‬‬


‫• أنواع الوراثة تحدد كيفية تعامل أنواع البيانات والدوال بين االصناف المورثة‪.‬‬

‫• الوراثة الخاصة (‪:)Private‬‬

‫• جميع الدوال والمتغيرات الموروثة تصبح خاصة (‪ )private‬في المشتق‪.‬‬

‫• الوراثة المحمية (‪:)Protected‬‬

‫• جميع الدوال والمتغيرات الموروثة تصبح محمية (‪ )protected‬في المشتق‪.‬‬

‫• الوراثة العامة (‪:)Public‬‬

‫• جميع الدوال والمتغيرات الموروثة المحمية تصبح محمية في المشتق‪.‬‬

‫• جميع الدوال والمتغيرات الموروثة العامة تصبح عامة في المشتق‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪11‬‬


‫• تتحق الوراثة المتعددة بطريقتين‪:‬‬

‫‪ .1‬يمكن أن يرث الصنف أكثر من صنف‪.‬‬

‫‪ .2‬أن يرث الصنف من صنف مشتق‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪12‬‬


Class Student
{
private: string name;
protected:
void changeName(){};
Public:
string getName(){};
};

Class Human
{string name;
protected:
int ID;
};

Class GraduatedStudent : protected Human , public Student


{
private: int GradYear:int;
Public:
string getName(){};
};

AbdulRahman M.Baraka (2017) 13


.‫• يتم تطبيق البناء لآلباء أوال حسب الترتيب‬

Constructor

3 1 2

Class C : public A, public B.

AbdulRahman M.Baraka (2017) 14


‫• يتم تطبيق الهدام لألبناء أوال ثم لآلباء بترتيب عكسي‪(.‬عكس البناء)‪.‬‬

‫‪Class C : public A, public B.‬‬


‫‪1‬‬ ‫‪3‬‬ ‫‪2‬‬

‫‪Destructor‬‬
‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪15‬‬
AbdulRahman M.Baraka (2017) 16
.‫• هي المقدرة على تأجيل تحديد نوع البيانات المستخدمة‬

.‫) نوع البيانات وتستخدم كنوع عام للبيانات‬T( ‫• تمثل‬

template <class T> int Max(T x, T y) :‫• الصيغة العامة‬


{
if (x>y)
return x;
else
return y;};

int main()
{
cout<<Max(10,50)<<endl;

system ("pause");
return 0;
}

AbdulRahman M.Baraka (2017) 17


‫• هي المقدرة على تأجيل تحديد هوية الدالة المراد استعمالها من وقت الترجمة‬
‫(‪ ) Compile Time‬إلى وقت التنفيذ (‪.)Run Time‬‬

‫• أنواعه‪:‬‬

‫• الثابت‪ :‬إعادة التحميل (‪.)Overload‬‬

‫• الديناميكي‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪18‬‬


AbdulRahman M.Baraka (2017) 19
‫برمجة )‪(1‬‬

‫الوحدة السادسة‬
‫التعامل مع الملفات‬

‫‪AbdulRahman M.Baraka‬‬
‫‪2012‬‬
‫هيكلية البيانات‬
‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪14/2/1998‬‬ ‫محمد غزة‬
‫‪1/5/2000‬‬ ‫رفح‬ ‫علي‬ ‫ملف‬

‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪14/2/1998‬‬ ‫محمد غزة‬ ‫سجل‬

‫محمد‬ ‫حقل‬

‫‪11011101‬‬ ‫بايت‬

‫بايت‬
‫‪1‬‬
‫تنظيم الملفات‬
‫التنظيم التتابعي‪:‬‬ ‫‪‬‬
‫يتم تخزين السجلت بشكل تسلسلي‪.‬‬ ‫‪‬‬

‫أول سجل يحمل أصغر رقم وهكذا‪..‬‬ ‫‪‬‬

‫للوصول الى السجل رقم ) ‪ (n‬يجب المرور على العدد )‪ (n-1‬من‬ ‫‪‬‬
‫السجلت‪.‬‬

‫‪.‬‬ ‫‪.‬‬ ‫‪14/2/1998‬‬ ‫غزة‬ ‫محمد‬ ‫‪1‬‬


‫‪1/5/2000‬‬ ‫رفح‬ ‫علي‬ ‫‪2‬‬
‫‪11/12/1997‬‬ ‫خانيونس‬ ‫منى‬ ‫‪3‬‬

‫‪template.cpp‬‬
‫تنظيم الملفات‬
‫التنظيم العشوائي‪:‬‬ ‫‪‬‬
‫يتم تخزين السجلت بشكل عشوائي‪.‬‬ ‫‪‬‬

‫يتم الوصول الى السجل المراد بشكل مباشر‪.‬‬ ‫‪‬‬

‫‪.‬‬ ‫‪.‬‬ ‫‪14/2/1998‬‬ ‫غزة‬ ‫محمد‬ ‫‪32‬‬


‫‪1/5/2000‬‬ ‫رفح‬ ‫علي‬ ‫‪1‬‬
‫‪11/12/1997‬‬ ‫خانيونس‬ ‫منى‬ ‫‪30‬‬
‫‪0‬‬
‫‪Sequential Files‬‬
‫تنظر لغة )‪ (++C‬الى الملفات كمجموعة من البايتات المخزنة واحدا‬ ‫‪‬‬
‫تلو الرخر‪.‬‬
‫كل ملف ينتهي بعلمة )‪.(EOF – End Of File‬‬ ‫‪‬‬

‫عند فتح ملف يتم فتح )‪ (stream‬معه يستقبل البايتات الخاصة بهذا‬ ‫‪‬‬
‫الملف‪.‬‬

‫تعتمد طريقة )‪ (stream‬على أجهزة الدرخال والرخراج مثل الشاشة‬ ‫‪‬‬


‫أيضا‪.‬‬
‫يتم فتح )‪ (stream‬الخاص بالملفات من رخلل المكتبة‬ ‫‪‬‬
‫>‪.<fstream‬‬
‫يتم التعامل مع )‪ (cout‬للملفات‪.‬‬ ‫‪‬‬

‫يتم التعامل مع )‪ (cerr‬للعرض على الشاشة بشكل رخاص‪.‬‬ ‫‪‬‬


Files and Stream
.‫( أي شكل أو تركيب على الملفات‬++C) ‫ل تفرض لغة‬ 

.(‫كتابة‬/‫عند فتح ملف يجب تحديد الغرض من فتحه )قراء‬ 

.‫( للكتابة على ملف‬ofstream) ‫يستخدم التعريف‬ 

.‫( للقراءة من ملف‬ifstream) ‫يستخدم التعريف‬ 

:‫الكتابة الى ملف تسلسلي‬ 


#include <iostream>
#include <fstream>
int main()
{
int sno;
string sname;
ofstream StudentFile("student.txt", ios::out);
cout<<"Enter students numbers and names... <Ctrl+Z> to end:"<<endl;

while(cin>>sno>>sname)
{ StudentFile<<sno<<","<<sname<<endl; }

StudentFile.close();} seqFiles1.cpp
‫‪Files and Stream‬‬
‫ملحظة هامة‪:‬‬ ‫‪‬‬

‫عند فتح الملف باستخدام ‪.ios::out‬‬ ‫‪‬‬

‫فإنه يتم انشاء الملف من جديد اذا لم يكن موجودا‪.‬‬ ‫‪‬‬

‫أما اذا كان موجودا فإنه يقوم بحذفه جميع البيانات الموجودة بدارخله‪.‬‬ ‫‪‬‬

‫ويقوم بإدرخال البيانات الجديدة من بداية الملف‪.‬‬ ‫‪‬‬

‫عند فتح الملف باستخدام ‪.ios::app‬‬ ‫‪‬‬

‫فإنه يتم انشاء الملف من جديد اذا لم يكن موجودا‪.‬‬ ‫‪‬‬

‫أما اذا كان موجودا فإنه يبدأ بإدرخال البيانات الجديدة من نهاية الملف‪.‬‬ ‫‪‬‬

‫أي تتم اضافة البيانات الجديدة في نهاية الملف وتبقى البيانات القديمة كما هي ول تحذف‪.‬‬ ‫‪‬‬

‫(‪ (app‬هي ارختصار ل )‪).append‬‬ ‫‪‬‬

‫>‪#include <iostream‬‬
‫>‪#include <fstream‬‬
‫)(‪int main‬‬
‫{‬
‫;‪int sno‬‬
‫;‪string sname‬‬
‫;)‪ofstream StudentFile("student.txt", ios::out‬‬
‫;‪cout<<"Enter students numbers and names... <Ctrl+Z> to end:"<<endl‬‬

‫)‪while(cin>>sno>>sname‬‬
‫{‬ ‫;‪StudentFile<<sno<<","<<sname<<endl‬‬ ‫}‬

‫};)(‪StudentFile.close‬‬ ‫‪seqFiles2.cpp‬‬
Files and Stream
.‫( أي شكل أو تركيب على الملفات‬++C) ‫ل تفرض لغة‬ 

.(‫كتابة‬/‫عند فتح ملف يجب تحديد الغرض من فتحه )قراء‬ 


.‫( للقراءة من ملف‬ifstream) ‫يستخدم التعريف‬ 
:‫القراءة من ملف تسلسلي‬ 
int sno;
string sname;
int count=0 ;
ifstream StudentFile("student.txt", ios::in);

while(StudentFile>>sno>>sname)
{
cerr<<"Student no:"<<sno<<endl<<"Student
name:"<<sname<<endl;
count++;
}
cerr<<"Number of Students: "<<count<<end;
StudentFile.close();
seqFiles3.cpp
‫نهاية‬
‫الوحدة‬
)1( ‫برمجة‬

AbdulRahman M.Baraka
2017
AbdulRahman M.Baraka (2017) 1
‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪14/2/1998‬‬ ‫غزة‬ ‫محمد‬
‫‪1/5/2000‬‬ ‫رفح‬ ‫علي‬ ‫ملف‬

‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪14/2/1998‬‬ ‫غزة‬ ‫محمد‬ ‫سجل‬

‫محمد‬ ‫حقل‬

‫‪11011101‬‬ ‫بايت‬

‫بت‬
‫‪1‬‬
‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪2‬‬
‫• التنظيم التتابعي‪:‬‬
‫‪.‬‬ ‫‪.‬‬ ‫‪14/2/1998‬‬ ‫غزة‬ ‫محمد‬ ‫‪1‬‬
‫يتم تخزين السجالت بشكل تسلسلي‪.‬‬ ‫•‬
‫‪1/5/2000‬‬ ‫رفح‬ ‫علي‬ ‫‪2‬‬
‫‪11/12/1997‬‬ ‫خانيونس‬ ‫منى‬ ‫‪3‬‬ ‫• أول سجل يحمل أصغر رقم وهكذا‪..‬‬

‫• للوصول الى السجل رقم ( ‪ (n‬يجب المرور على العدد ‪ n- 1‬من السجالت‪.‬‬

‫‪.‬‬ ‫‪.‬‬ ‫‪14/2/1998‬‬ ‫غزة‬ ‫محمد‬ ‫‪32‬‬ ‫• التنظيم العشوائي‪:‬‬


‫‪1/5/2000‬‬ ‫رفح‬ ‫علي‬ ‫‪1‬‬
‫يتم تخزين السجالت بشكل عشوائي‪.‬‬ ‫•‬
‫‪11/12/1997‬‬ ‫خانيونس‬ ‫منى‬ ‫‪300‬‬
‫• يتم الوصول الى السجل المراد بشكل مباشر‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪3‬‬


‫• تنظر لغة ( )‪C++‬الى الملفات كمجموعة من البايتات المخزنة واحدا تلو االخر‪.‬‬

‫• كل ملف ينتهي بعالمة (‪.)EOF – End Of File‬‬

‫• عند فتح ملف يتم فتح )‪ )stream‬معه يستقبل البايتات الخاصة بهذا الملف‪.‬‬

‫• تعتمد طريقة (‪)stream‬على أجهزة االدخال واالخراج مثل الشاشة أيضا‪.‬‬

‫• يتم فتح (‪ )stream‬الخاص بالملفات من خالل المكتبة <‪< fstream‬‬

‫• يتم التعامل مع )‪(cout‬للملفات‪.‬‬

‫• يتم التعامل مع )‪(cerr‬للعرض على الشاشة بشكل خاص‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪4‬‬


‫• ال تفرض لغة ( )‪C++‬أي شكل أو تركيب على الملفات‪.‬‬

‫• عند فتح ملف يجب تحديد الغرض من فتحه (قراء‪/‬كتابة) وال يجوز فتحه للقراءة‬
‫والكتابة معا‪.‬‬

‫• يستخدم التعريف )‪ (ofstream‬للكتابة على ملف‪.‬‬

‫• يستخدم التعريف )‪ (ifstream‬للقراءة من ملف‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪5‬‬


:‫• الكتابة الى ملف تسلسلي‬
#include <iostream>
#include <fstream>

int main()
{
int sno;
string sname;
ofstream StudentFile("student.txt", ios::out);
cout<<"Enter students numbers and names... <Ctrl+Z> to
end:"<<endl;

while(cin>>sno>>sname)
{ StudentFile<<sno<<","<<sname<<endl; }

StudentFile.close();

AbdulRahman M.Baraka (2017) 6


‫• عند الكتابة على الملف باستخدام ‪ios::out.‬‬
‫‪ o‬فإنه يتم انشاء الملف من جديد اذا لم يكن موجودا‪.‬‬

‫‪ o‬أما اذا كان موجودا فإنه يقوم بحذفه جميع البيانات الموجودة بداخله‪.‬‬

‫‪ o‬ثم يقوم بإدخال البيانات الجديدة من بداية الملف‪.‬‬

‫• عند الكتابة على الملف باستخدام ‪ios::app.‬‬


‫‪ o‬فإنه يتم انشاء الملف من جديد اذا لم يكن موجودا‪.‬‬

‫‪ o‬أما اذا كان موجودا فإنه يبدأ بإدخال البيانات الجديدة من نهاية الملف‪.‬‬

‫‪ o‬أي تتم اضافة البيانات الجديدة في نهاية الملف وتبقى البيانات القديمة كما هي وال تحذف‪.‬‬

‫‪ app o‬هي اختصار ل ‪.append‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪7‬‬


:‫• القراءة من ملف تسلسلي‬
#include <iostream>
#include <fstream>

int main()
{
int sno;
string sname;
int count=0 ;
ifstream StudentFile("student.txt", ios::in);

while(StudentFile>>sno>>sname)
{
cerr<<"Student no:"<<sno<<endl<<"Student name:"<<sname<<endl;
count++;
}
cerr<<"Number of Students: "<<count<<end;
StudentFile.close();
}

AbdulRahman M.Baraka (2017) 8


‫• الدالة (‪:)seekg‬‬

‫‪ o‬إلعادة المششر الى موضع معين في وضع القراءة‪.‬‬

‫• الدالة (‪:)seekp‬‬

‫‪ o‬إلعادة المششر الى موضع معين في وضع الكتابة‪.‬‬

‫• البحث في الملف‪:‬‬

‫‪ o‬للبحث من بداية الملف نستخدم (‪.)ios::beg‬‬

‫‪ o‬للبحث من موضع معين داخل الملف نستخدم (‪.)ios::cur‬‬

‫‪ o‬للبحث من نهاية الملف نستخدم (‪.)ios::end‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪9‬‬


‫• الملفات العشوائية هي الملفات التي يتم الوصول الى سجالتها بشكل مباشر‪.‬‬

‫• نفترض أن الملف يتكون من سجالت متساوية في الحجم‪.‬‬

‫• يبدأ السجل األول من الموقع ‪.0‬‬

‫• الموقع الفعلي للسجل (‪ =)n‬موقع بداية الملف ‪ +‬حجم السجل * (‪.)n-1‬‬

‫مثال‪:‬‬ ‫•‬

‫• اذا علمت أن موقع تخزين بداية ملف (‪ )1000‬وأن حجم السجالت التي سوف تخزن‬
‫(‪ )100‬لكل سجل‪ .‬فاحسب موقع تخزين السجل الثامن‪.‬‬

‫• الموقع الفعلي (‪)1-7( * 100 + 1000 =)8‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬


‫= ‪1600‬‬ ‫‪10‬‬
‫• يمكن فتح الملفات العشوائية للقراءة والكتابة معا في آن واحد على خالف التتابعية‪.‬‬

‫• يتم استخدام الصورة الثنائية للتخزين في الملفات العشوائية ‪.ios::binary‬‬

‫• تستخدم العالقة | لدمج جميع التعابير‪.‬‬

‫‪• ios::in| ios::out | ios::binary‬‬

‫• تستخدم الدالة ()(‪ )write‬للكتابة والدالة ()(‪ )read‬للقراءة‪.‬‬

‫• الدالة (‪ )reinterpret_cast‬تقوم بتحويل مششر من نوع الى نوع آخر‪.‬‬

‫• تحديث الملفات العشوائية أسهل بكثير من عملية تحديث الملفات التتابعية‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪11‬‬


AbdulRahman M.Baraka (2017) 12
‫برمجة ‪ - 1‬لغة ‪++C‬‬
‫جامعة القدس المفتوحة‬
‫رقم المقرر ‪1291‬‬

‫‪1‬‬
‫الوحدة الرابعة‬
‫الدوال الصديقة والعمليات‬
‫‪FRIEND FUNCTIONS‬‬
‫‪AND OPERATORS‬‬
‫‪2‬‬
‫مقدمة‬
‫في‪ ‬هذه‪ ‬الوحدة‪ ،‬عزيزي‪ ‬الدارس‪ ،‬سنعرض‪ ‬بالتفصيل‪ ‬الى‪ :‬‬
‫‪            ‬الدوال‪ ‬والنصناف‪ ‬الصديقة‬
‫‪            ‬العمليات‪ Operttor   s‬‬
‫‪           ‬المجموعات‪.Class Set  ‬‬

‫‪3‬‬
‫اهداف الوحدة‬
‫ينتظر منك‪ ،‬عزيزي الدارس‪ ،‬بعد فراغك من دراسة هذه الوحدة أن تكون‬
‫قادرا على أن‪:‬‬
‫‪ ‬تستخدم‪ ‬الدوال‪ ‬التي‪ ‬تستقبل‪ ‬العوامل‪ ‬بالاشارة‪Reference ‬‬
‫‪Parameters‬‬
‫‪‬تميز‪ ‬بين‪ ‬الدوال‪ ‬المنتمية‪ ‬والدوال‪ ‬الصديقة‪ ‬وتعرف‪ ‬متى‪ ‬تستخدم‪ ‬كل‪ ‬منها‪.‬‬
‫‪‬تكتب‪ ‬الدوال‪ ‬الصديقة‪ ‬وتستدعيها‪ ‬بشكل‪ ‬نصحيح‪.‬‬
‫‪‬تعرف‪ ‬النصناف‪ ‬الصديقة‪.‬‬
‫‪‬تكتب‪ ‬تعريفات‪ ‬جديدة‪ ‬للعمليات‪ ‬المختلفة‪.‬‬
‫‪‬تميز‪ ‬بين‪ ‬العمليات‪ ‬المنتمية‪ ‬والصديقة‬

‫‪4‬‬
‫تمرير العوامل بالاشارة‬
‫‪PARAMETER PASSING BY‬‬
‫‪REFERENCE‬‬
‫تعلم‪ ،‬عزيزي الدارس أن لغة ‪ ++C‬تمرر قيم العوامل إلى الدوال وبالتالي فإن أي تغيير‬ ‫‪‬‬

‫تجريه الدالة على هذه القيم ل يؤدي إلى تغيير قيم العوامل الحقيقية‪ .‬فمثل الدالة التالية‬
‫)‪void swap1(int X, int Y‬‬
‫;‪{ int T=X‬‬
‫;‪X=Y‬‬
‫;‪Y=T‬‬
‫}‬
‫‪ ‬والتي‪ ‬يبدو‪ ‬أنها‪ ‬تبدل‪ ‬قيمة‪ X  ‬مع‪ ‬قيمة‪ Y   ‬وهما‪ ‬ما‪ ‬يدعيان‪ ‬بالعوامل‪ ‬الرسمية‪Formal   ‬‬ ‫‪‬‬

‫‪ Aguments‬لوجودهم‪ ‬في‪ ‬تروسية‪ ‬الدالة‪ ،‬ال‪ ‬أن‪ ‬هذا‪ ‬نصحيح‪ ‬فقط‪ ‬داخل‪ ‬الدالة‪ ‬نفسها‪ ،‬ول‪ ‬‬
‫يرافق‪ ‬هذا‪ ‬التغيير‪ ‬تغيير‪ ‬على‪ ‬العوامل‪ ‬الحقيقية‪actual arguments ‬‬
‫‪ ( ‬الموجودة‪ ‬في‪ ‬جملة‪ ‬الستدعاء(‪ ‬التي‪ ‬أرسلت‪ ‬للدالة‪ .‬ولتوضيح‪ ‬ذلك‪ ‬لندرس‪ ‬نتيجة‪ ‬استدعاء‪ ‬‬ ‫‪‬‬

‫الدالة‪ ‬‬
‫أعله‪ ‬من‪ ‬خلل‪ ‬المثال‪ ‬التالي‪ ) ‬الشريحة‪ ‬التالية(‪ ‬‬ ‫‪5‬‬
‫استدعاء‪SWAP1‬‬
‫)( ‪int Main‬‬
‫;‪{ int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap1(A,B‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬

‫تستدعي‪ ‬هذه‪ ‬الدالة‪ swap1  ‬لتبديل‪ ‬قيم‪ ‬العوامل‪ ‬الحقيقية‪ A ‬و‪ B ‬وتقوم‪ ‬بطباعة‪ ‬قيم‪ A ‬و‪ B  ‬قبل‪ ‬وبعد‪ ‬‬
‫استدعاء‪ .swap1  ‬إن‪ ‬نتيجة‪ ‬تنفيذ‪ ‬هذا‪ ‬البرنامج‪ ‬هي‪ ‬طباعة‬
‫‪A=10 B=20‬‬
‫‪A=10 B=20‬‬

‫أي‪ ‬أن‪ ‬قيم‪ A  ‬و‪  B ‬وهي‪ ‬العوامل‪ ‬الحقيقية‪ ‬لم‪ ‬تبدل‪ ‬بعد‪ ‬استدعاء‪ ‬الدالة‪  swap1 ‬وذلك‪ ‬لن‪ ‬الدالة‪ ‬‬
‫‪  swap1‬تستقبل‪ ‬قيم‪ ‬العوامل‪ A ‬و‪ B ‬وليس‪ ‬عناوينها‪ .‬أن‪ ‬القيم‪10  ‬و‪ 20 ‬في‪ ‬مثالنا‪ ‬أعله‪ ‬تخزن‪ ‬في‪ ‬‬
‫مواقع‪ ‬جديدة‪ ‬في‪ ‬الذاكرة‪ ‬تختلف‪ ‬عن‪ ‬مواقع‪ ‬المتغيرات‪  A ‬و‪  B ‬ولذا‪ ‬فإن‪ ‬أي‪ ‬تغيير‪ ‬على‪ ‬العوامل‪ ‬‬
‫الرسمية‪ X  ‬و‪  Y ‬ل‪ ‬يقابله‪ ‬تغيير‪ ‬على‪ ‬قيم‪ ‬العوامل‪ ‬الحقيقية‪ A  ‬و‪.B  ‬‬ ‫‪6‬‬
‫حل مشكلة من خلل العناوين‬
‫‪ ‬ولحل‪ ‬المشكلة‪ ‬السابقة‪ ‬فإننا‪ ‬بدل‪ ‬من‪ ‬أن‪ ‬نرسل‪ ‬قيمة‪ ‬العوامل‪ ‬الحقيقية‪  A ‬و‪  B ‬‬
‫يجب‪ ‬أن‪ ‬نرسل‪ ‬للدالة‪ ‬عنوانهما‪ ‬حتى‪ ‬تستطيع‪ ‬هذه‪ ‬الدالة‪ ‬تغيير‪ ‬القيم‪ ‬المخزنة‪ ‬في‪ ‬‬
‫هذه‪ ‬المواقع‪ .‬وبالطبع‪ ‬يجب‪ ‬إعادة‪ ‬كتابة‪ swap1 ‬بحيث‪ ‬يتمكن‪ ‬من‪ ‬استخدام‪ ‬هذه‪ ‬‬
‫العناوين‪ ‬لتغيير‪ ‬قيم‪  A ‬و‪  B ‬كما‪ ‬في‪swap2 ‬‬
‫)‪void swap2(int *X,int *Y‬‬
‫;‪{ int T=*X‬‬
‫;‪*X=*Y‬‬
‫;‪*Y=T‬‬
‫}‬
‫‪ ‬إن‪ ‬عوامل‪ swap2 ‬الرسمية‪ Y  ‬و‪ X ‬هي‪ ‬مؤاشرات‪ ‬لمتغيرات‪ ‬نصحيحيه‪ ‬ولذا‪ ‬‬
‫فان‪ sawp2 ‬يتعامل‪ ‬مع‪ ‬المواقع‪ ‬التي‪ ‬نود‪ ‬تغيرها‪ ‬من‪ ‬خلل‪ ‬اللقاب‪ Y * ‬و‪.X* ‬‬
‫‪7‬‬
‫استدعاء دالة‪SWAP2‬‬
‫‪ ‬وبالطبع‪ ‬عند‪ ‬استدعاء‪ ‬الدالة‪  swap2 ‬يجب‪ ‬أن‪ ‬نبعث‪ ‬لها‪ ‬عناوين‪ ‬‬
‫المتغيرات‪ ‬التي‪ ‬نود‪ ‬تبديل‪ ‬قيمها‪) ‬العوامل‪ ‬الحقيقية(‪ ‬كما‪ ‬في‪ ‬المثال‪ ‬التالي‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap2(&A,&B‬‬

‫} ;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫لحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أننا‪ ‬أرسلنا‪ ‬عناوين‪ ‬المتغيرين‪ A ‬و‪  B ‬أي‪ & (A ‬و‪ (& B‬عندما‪ ‬‬ ‫‪‬‬

‫استدعينا‪ ‬الدالة‪  swap2 ‬بتغيير‪ ‬قيم‪  A ‬و‪  B ‬كما‪ ‬يجب‪ ‬حيث‪ ‬تكون‪ ‬النتائج‪ ‬كما‪ ‬يلي‪ ‬‬
‫‪A=10 B=20‬‬
‫‪A=20 B=10‬‬
‫‪8‬‬
‫دالة‪SWAP3‬‬
‫وهنالك‪ ‬طريقة‪ ‬أخرى‪ ‬لتحقيق‪ ‬نفس‪ ‬النتيجة‪  ‬تسمح‪ ‬لنا‪ ‬باستخدام‪ ‬عدد‪ ‬أقل‪ ‬من‪ ‬عمليات‪ * ‬و‪ ‬‬ ‫‪‬‬

‫&‪ .‬تدعى‪ ‬هذه‪ ‬الطريقة‪ ‬بطريقة‪ ‬تمرير‪ ‬العوامل‪ ‬بالاشارة‪parameter passing ‬‬
‫‪  .by reference‬ولتوضيح‪ ‬هذه‪ ‬الطريقة‪ ‬سنعيد‪ ‬كتابة‪ ‬الدالة‪ swap2 ‬كما‪ ‬يلي‬
‫)‪void swap3(int &X, int &Y‬‬
‫;‪{ int T=X‬‬
‫;‪X=Y‬‬
‫;‪Y=X‬‬
‫}‬
‫لحظ‪ ‬وجود‪ ‬العملية‪ & ‬قبل‪ ‬كل‪ ‬من‪ ‬العوامل‪ ‬الرسمية‪ ‬وذلك‪ ‬للاشارة‪ ‬إلى‪ ‬أن‪ ‬العوامل‪ ‬الحقيقية‪ ‬ستمرر‪ ‬بالاشارة)‪by   ‬‬ ‫‪‬‬
‫‪ (  reference‬وليس‪ ‬بالقيمة‪ (   by value ) ‬مما‪ ‬يعني‪ ‬أن‪ ‬أي‪ ‬تغيير‪ ‬على‪ ‬قيم‪ ‬العوامل‪ ‬الرسمية‪ ‬سيقابله‪ ‬تغيير‪ ‬على‪ ‬‬
‫قيم‪ ‬العوامل‪ ‬الحقيقية‪ .‬من‪ ‬المهم‪ ‬أن‪ ‬تلحظ‪ ‬عزيزي‪ ‬الدارس‪ ‬أننا‪ ‬استخدمنا‪ ‬أسماء‪ ‬العوامل‪ X ‬و‪ Y ‬داخل‪ ‬الدالة‪ ‬بطريقة‪ ‬‬
‫مبااشرة‪ ‬بدون‪ ‬أن‪ ‬نسبقها‪ ‬بـ‪ * ‬إذ‪ ‬يتم‪ ‬عمل‪ ‬ذلك‪ ‬تلقائيا‪ ‬من‪ ‬قبل‪ ‬مترجم‪.++C ‬‬

‫‪‬‬
‫‪9‬‬
‫استدعاء‪SWAP3‬‬
‫‪ ‬وأيضا‪ ‬عند‪ ‬استدعاء‪ ‬الدالة‪ swap3 ‬فإننا‪ ‬نرسل‪ ‬العوامل‪ ‬الحقيقية‪ ‬بدون‪ ‬‬
‫استخدام‪ ‬العملية‪ & ‬كما‪ ‬يتضح‪ ‬في‪ ‬المثال‪ ‬التالي‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap3(A,B‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬

‫‪10‬‬
‫طريقة اخرى ترجع الدالة قيمة بالاشارة‬
‫‪ ‬ومن‪ ‬الجدير‪ ‬بالذكر‪ ‬أننا‪ ‬ل‪ ‬نستطيع‪ ‬تمرير‪ ‬المصفوفات‪ ‬بالاشارة‪ ‬إنما‪ ‬يجب‪ ‬أن‪ ‬‬
‫نمررها‪ ‬بوساطة‪ ‬عنوان‪ ‬أول‪ ‬عنصر‪ ‬كما‪ ‬درسنا‪ ‬سابقا‪  .‬ومن‪ ‬الممكن‪ ‬أيضا‪ ‬أن‪ ‬ترجع‪ ‬‬
‫الدالة‪ ‬قيمة‪ ‬بالاشارة‪ ‬كما‪ ‬في‪ ‬مثالنا‪ ‬التالي‬
‫)‪int& max(int A, int B‬‬
‫)‪{if (A>B‬‬
‫;‪return A‬‬
‫‪else‬‬
‫;‪return B‬‬
‫}‬
‫لحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أن‪ ‬نوع‪ ‬القيمة‪ ‬المرجعة‪ ‬هو‪  int& ‬أي‪ ‬إاشارة‪  reference ‬لمتغير‪ ‬‬ ‫‪‬‬

‫نصحيح‪ .‬تقوم‪ ‬الدالة‪   max ‬بتحديد‪ ‬العامل‪ ‬نصاحب‪ ‬القيمة‪ ‬الكبر‪ ‬وإعادة‪ ‬إاشارة‪ ‬إليه‪ .‬ولذا‪ ‬فإننا‪ ‬نستطيع‪ ‬‬
‫أن‪ ‬نستدعي‪ ‬الدالة‪ max ‬كما‪ ‬يلي‪ ‬‬
‫;‪int A=10‬‬
‫;‪int B=100‬‬
‫;‪max(A,B)=5‬‬ ‫‪11‬‬

‫إن‪ ‬نتيجة‪ ‬تنفيذ‪ ‬هذه‪ ‬الجملة‪ ‬هي‪ ‬تخزين‪ ‬القيمة‪ 5 ‬في‪ ‬المتغير‪ ‬نصاحب‪ ‬أكبر‪ ‬قيمة‪ ‬وهو‪ ‬المتغير‪.B    ‬‬ ‫‪‬‬


‫الدوال الصديقة والنصناف‬

‫‪ ‬لقد‪ ‬أاشرنا‪ ‬سابقا‪ ،‬عزيزي‪ ‬الدارس‪ ،‬إلى‪ ‬أن‪ ‬الدوال‪ ‬المنتمية‪ ‬للصنف‪ ‬هي‪ ‬فقط‪ ‬‬
‫التي‪ ‬يحق‪ ‬لها‪ ‬معالجة‪ ‬الجزاء‪ ‬الخانصة‪ ‬للصنف‪) ‬المعرفة‪ ‬في‪ ‬الجزء‪ ‬‬
‫الخاص‪  private ‬من‪ ‬الصنف(‪.‬‬
‫‪ ‬في‪ ‬الواقع‪ ‬أن‪ ‬هنالك‪ ‬نوعا‪ ‬آخر‪ ‬من‪ ‬الدوال‪ ‬يستطيع‪ ‬معالجة‪ ‬الجزاء‪ ‬الخانصة‪ ‬‬
‫للصنف‪ ‬وهذه‪ ‬الدوال‪ ‬تدعى‪ ‬الدوال‪ ‬الصديقة‪ .‬وتعرف‪ ‬الدالة‪ ‬على‪ ‬أنها‪ ‬دالة‪ ‬‬
‫نصديقة‪ ‬لصنف‪ ‬ما‪ ‬بوضع‪ ‬نموذج‪  prototype ‬لهذه‪ ‬الدالة‪ ‬داخل‪ ‬تعريف‪ ‬‬
‫الصنف‪ ‬مسبوقا‪ ‬بالكلمة‪friend ‬‬
‫‪ ‬فمثل‪ ‬لتعريف‪ ‬الدالة‪ average ‬والتي‪ ‬تجد‪ ‬معدل‪ ‬علمات‪ ‬طالب‪ ‬ما‪ ‬كدالة‪ ‬‬
‫نصديقة‪ ‬للصنف‪  student ‬نضع‪ ‬النموذج‪    ‬‬
‫‪friend double average(student s  ;( ‬‬
‫‪ ‬داخل‪ ‬تعريف‪ ‬الصنف‪ student  ‬فيصبح‪ ‬كما‪ ‬يلي‬ ‫‪12‬‬
‫العلن عن الدالة الصديقة‬
‫مما‪ ‬يعني‪ ‬أن‪ ‬الدالة‪ average  ‬الحق‪ ‬في‪ ‬معالجة‪ ‬‬ ‫‪‬‬
‫{‪class student‬‬ ‫الجزاء‪ ‬الخانصة‪ ‬للصنف‪  student ‬كما‪ ‬لو‪ ‬كانت‪ ‬‬
‫;‪long stno‬‬ ‫دالة‪ ‬منتمية‪ ‬للصنف‪   student ‬و‪ ‬تختلف‪ ‬طريقة‪ ‬‬
‫;‪int csno‬‬
‫استدعاء‪ ‬الدالة‪ ‬الصديقة‪ ‬عن‪ ‬طريقة‪ ‬استدعاء‪ ‬الدالة‪ ‬‬
‫;]‪double grades[100‬‬
‫;]‪char StName[20‬‬ ‫المنتمية‪.‬‬
‫‪public:‬‬ ‫فمثل‪ ‬لستدعاء‪ ‬الدالة‪ ‬الصديقة‪  average ‬‬ ‫‪‬‬
‫;)‪friend double average(student s‬‬ ‫لحساب‪ ‬معدل‪ ‬علمات‪ ‬الطالب‪) ‬الكائن(‪  S ‬فإننا‪ ‬‬
‫;)(‪void initialize‬‬ ‫نستدعيها‪ ‬كما‪ ‬يلي‬
‫};‪long get_stno() {return stno‬‬
‫};‪char* get_stname(){return StName‬‬ ‫;)‪average(S‬‬
‫;}‬ ‫بينما‪ ‬لو‪ ‬كانت‪ ‬الدالة‪  average ‬دالة‪ ‬منتمية‪ ‬‬ ‫‪‬‬
‫للصنف‪  student ‬فإننا‪ ‬نستدعيها‪ ‬كما‪ ‬يلي‬
‫;)(‪S.average‬‬

‫‪13‬‬
‫كتابة الدالة الصديقة‬
‫تكتب‪ ‬الدالة‪ ‬الصديقة‪ ‬مثل‪ ‬أي‪ ‬دالة‪ ‬أخرى‪ ‬ليس‪ ‬لها‪ ‬علقة‪ ‬بالصنف‪.‬‬ ‫‪‬‬

‫‪ ‬فمثل‪ ‬تعرف‪ ‬الدالة‪ average  ‬كما‪ ‬يلي‬ ‫‪‬‬
‫)‪double average(student S‬‬
‫لحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬مايلي‬ ‫‪‬‬
‫{‬
‫;‪double sum=0.0‬‬
‫)‪for(int i=0;i<S.csno;i++‬‬ ‫في‪ ‬‬ ‫‪     .1‬أننا‪ ‬لم‪ ‬نستخدم‪ ‬اسم‪ ‬الصنف‪ ‬ول‪ ‬عملية‪ ‬تقرير‪ ‬المجال‪ :: ‬‬
‫;]‪sum=sum+S.grades[i‬‬ ‫ترويسة‪ ‬هذه‪ ‬الدالة‪.‬‬
‫;‪return sum/S.csno‬‬
‫}‬
‫‪   .2‬لهذه‪ ‬الدالة‪ ‬عامل‪ ‬واحد‪ ‬هو‪ student S ‬وذلك‪ ‬لتمرير‪ ‬اسم‪ ‬‬
‫الكائن‪ ‬الذي‪ ‬نود‪ ‬حساب‪ ‬المعدل‪ ‬له‪ ‬من‪ ‬خلله‪ ،‬ولو‪ ‬كانت‪ ‬هذه‪ ‬الدالة‪ ‬‬
‫دالة‪ ‬منتمية‪ ‬لما‪ ‬احتجنا‪ ‬إلى‪ ‬هذا‪ ‬العامل‪) ‬كما‪ ‬فعلنا‪ ‬عندما‪ ‬عرفناها‪ ‬في‪ ‬‬
‫الوحدة‪ ‬السابقة‪ ‬كدالة‪ ‬منتمية(‪.‬‬
‫‪ . 3‬تستخدم‪ ‬المتغيرات‪ ‬المنتمية‪ ‬داخل‪ ‬الدوال‪ ‬الصديقة‪ ‬بكتابة‪ ‬اسم‪ ‬الكائن‪ ‬‬
‫ثم‪ ‬عملية‪ ‬النقطة‪ .  ‬ثم‪ ‬اسم‪ ‬المتغير‪ ‬المنتمي‪) ‬مثل‪ ‬المتغيرات‪  ‬‬
‫‪ S.grades‬و‪  S.csno ‬في‪ ‬مثالنا(‪ .‬بينما‪ ‬تستخدم‪ ‬هذه‪ ‬المتغيرات‪ ‬‬
‫‪ 14‬مبااشرة‪) ‬دون‪ ‬كتابة‪ ‬اسم‪ ‬الكائن‪ ‬واستخدام‪ ‬النقطة(‪ ‬داخل‪ ‬الدوال‪ ‬‬
‫المنتمية‪ .‬‬
‫متي يفضل استخدام الدوال الصديقة‬
‫ول اشك أنك تتساءل‪ ،‬عزيزي الدارس‪ ،‬متى نفضل استخدم الدوال المنتمية‪ ،‬ومتى نفضل‬ ‫‪‬‬
‫استخدام الدوال الصديقة؟ بشكل‪ ‬عام‪ ‬يفضل‪ ‬دائما‪ ‬استخدام‪ ‬الدوال‪ ‬المنتمية‪ ‬إل‪ ‬في‪ ‬الحالت‪ ‬‬
‫التالية‪ :‬‬
‫إذا‪ ‬كانت‪ ‬الدالة‪ ‬تحتاج‪ ‬إلى‪ ‬عاملين‪ ‬أو‪ ‬أكثر‪ ‬خصونصا‪ ‬إذا‪ ‬انتمى‪ ‬كل‪ ‬منهما‪ ‬إلى‪ ‬نصنف‪ ‬‬ ‫‪‬‬

‫‪  class‬مختلف‪ ،‬في‪ ‬هذه‪ ‬الحالة‪ ‬يفضل‪ ‬أن‪ ‬تعرف‪ ‬الدالة‪ ‬كدالة‪ ‬نصديقة‪ ‬لكل‪ ‬النصناف‪ ‬التي‪ ‬‬
‫تعالج‪ ‬كائناتها‪ .‬فمثل‪ ‬تصور‪ ‬أننا‪ ‬نود‪ ‬أن‪ ‬نكتب‪ ‬دالة‪ ‬ما‪ ‬تنقل‪ ‬طالبا‪ ‬ما‪ ‬من‪ ‬اشعبة‪ section ‬‬
‫إلى‪ ‬اشعبة‪ ‬أخرى‪ ‬لحظ‪ ‬أننا‪ ‬نحتاج‪ ‬في‪ ‬هذه‪ ‬الحالة‪ ‬إلى‪ ‬عاملين‪ ‬يمثل‪ ‬كل‪ ‬منهما‪ ‬اشعبة‪ ‬وعامل‪ ‬‬
‫أخر‪ ‬يمثل‪ ‬الطالب‪ ‬في‪ ‬هذه‪ ‬الحالة‪ ‬يفضل‪ ‬كتابة‪ ‬هذه‪ ‬الدالة‪ ‬كدالة‪ ‬نصديقة‪ ‬للصنف‪.section ‬‬
‫إذا‪ ‬أردنا‪ ‬تحميل‪ ‬الدالة‪ ‬أكثر‪ ‬من‪ ‬تعريف‪ ‬بحيث‪ ‬تتحدد‪ ‬الدالة‪ ‬التي‪ ‬نود‪ ‬استخدامها‪ ‬من‪ ‬خلل‪ ‬‬ ‫‪‬‬
‫عدد‪ ‬ونوع‪ ‬العوامل‪ .‬فمثل‪ ‬لو‪ ‬كان‪ ‬لدينا‪ ‬أكثر‪ ‬من‪ ‬نصنف‪ ‬من‪ ‬العقارات‪ ،‬مثل‪ ‬اشقة‪ ‬وعمارة‪ ‬‬
‫ومنزل‪ ‬مستقل‪ ،‬وأردنا‪ ‬كتابة‪ ‬الدالة‪  area(p) ‬والتي‪ ‬تحسب‪ ‬المساحة‪ ‬للعقار‪ p ‬حسب‪ ‬‬
‫نوعه‪ .‬في‪ ‬هذه‪ ‬الحالة‪ ‬قد‪ ‬نفضل‪ ‬أن‪ ‬نعرف‪ ‬ثل ث‪ ‬دوال‪ ‬نصديقة‪ ،‬واحدة‪ ‬لكل‪ ‬نصنف‪ ‬بحيث‪ ‬‬
‫تتحدد‪ ‬الدالة‪ ‬التي‪ ‬ستستخدم‪ ‬من‪ ‬خلل‪ ‬نوع‪ ‬العامل‪ ‬الممرر‪ ‬إليها‪ ‬في‪ ‬جملة‪ ‬الستدعاء‪.‬‬
‫‪15‬‬
#include<iostream.h>
class section{
student sec[50];
int size; 1 ‫تدريب‬
int bsearch(long stno);
public:
section(){size=0;}
void StAdd(student s);
int StDelete(long stno);
void Stlist();  ‫ الدالة‬ ‫ الدارس‬ ‫ عزيزي‬ ‫اكتـــب‬ 
void StRetrieve(long stno);
void section::sort();
 ‫طالب‬ ‫بنقل‬ ‫تقوم‬ ‫والتي‬   transfer
};
friend int transfer(long stno, section& C1, section& C2);
 ‫بحيث‬ ‫أخرى‬ ‫اشعبة‬ ‫إلى‬ ‫ما‬ ‫اشعبة‬ ‫من‬
int transfer(long stno, section& C1, section& C2)
{
 ‫ اشعبة‬ ‫ للصــنف‬ ‫ نصــديقة‬ ‫ دالــة‬ ‫تكون‬
// delete student from class C1
int i=C1.bsearch(stno);
 ‫ الوحدة‬ ‫ في‬ ‫ المعرف‬ section
student s;
if(i>-1)
.‫السابقة‬
{s=C1.sec[i];
for(int j=i;j<C1.size-2;j++)
C1.sec[j]=C1.sec[j+1];
C1.size--;
//
// insert student in the class C2
int pos=0;
// search for the proper insertion position
while(s.get_stno() > C2.sec[pos].get_stno() && pos<C2.size)
pos++;
// shift element up one position
for(int j=C2.size-1;j>=pos;j--)
C2.sec[j+1]=C2.sec[j];
C2.sec[pos]=s; 16
C2.size++;
} // if (i>-1)
return i; // to indicate if the student was transfered succefuly
}
#include<iostream.h>
#include<conio.h>
class student{
long stno;
int csno;
double grades[100];
char StName[20];
public:
‫نشاط عملي‬
friend double average(student s);
void initialize();
long get_stno() {return stno;} ‫عزيزي الدارس‬
char* get_stname(){return StName;}
};
void student::initialize()
student ‫اكتب برنامج يعمل على تعريف الصنف‬
{ .‫ثم يعرف دالة المعدل كدالة نصديقة‬
cout<<"enter student's number";
cin>>stno;
cout<<"enter student's name ";
‫اكتب البرنامج الرئيس؟‬
cin>>StName;
cout<<"enter no. of courses taken by the student";
cin>>csno;
for(int i=0;i<csno;i++)
{cout<<"enter grade no."<<(i+1);
cin>>grades[i];
}
}
double average(student S)
{ double sum=0.0;
for(int i=0;i<S.csno;i++)
sum=sum+S.grades[i];
return sum/S.csno;
}
main()
{
student s1;
s1.initialize(); 17
cout<<"\n student name : "<<s1.get_stname();
cout<<"\n student number : "<<s1.get_stno();
cout<<"\n student average : "<<average(s1);
getch();
‫النصناف الصديقة ‪FRIEND CLASSES‬‬
‫‪  ‬من‪ ‬الممكن‪ ‬أن‪ ‬تكون‪ ‬دالة‪ ‬ما‪ ‬منتمية‪ ‬إلى‪ ‬نصنف‪ ‬ما‪ ‬ونصديقة‪ ‬إلى‪ ‬نصنف‪ ‬آخر‪ .‬‬
‫وأحيانا‪ ‬قد‪ ‬نضطر‪ ‬إلى‪ ‬تعريف‪ ‬عدد‪ ‬كبير‪ ‬من‪ ‬الدوال‪ ‬المنتمية‪ ‬إلى‪ ‬نصنف‪ ‬‬
‫كدوال‪ ‬نصديقة‪ ‬إلى‪ ‬نصنف‪ ‬آخر‪ ،‬مما‪ ‬قد‪ ‬يؤدي‪ ‬إلى‪ ‬وضع‪ ‬عدد‪ ‬كبير‪ ‬من‪ ‬‬
‫النماذج‪ ‬داخل‪ ‬تعريف‪ ‬الصنف‪.‬‬
‫‪ ‬ولتجنب‪ ‬وضع‪ ‬هذا‪ ‬العدد‪ ‬الكبير‪ ‬من‪ ‬النماذج‪ ‬داخل‪ ‬تعريف‪ ‬الصنف‪ ‬نستطيع‪ ‬‬
‫تعريف‪ ‬الصنف‪ ‬بأكمله‪ ‬كصنف‪ ‬نصديق‪ ‬للصنف‪ ‬الخر‪ .‬مما‪ ‬يعطي‪ ‬جميع‪ ‬‬
‫الدوال‪ ‬المنتمية‪ ‬إلى‪ ‬الصنف‪ ‬الول‪ ‬القدرة‪ ‬على‪ ‬معالجة‪ ‬الجزاء‪ ‬الخانصة‪ ‬في‪ ‬‬
‫الصنف‪ ‬الخر‪.‬‬
‫‪‬‬

‫‪18‬‬
‫مثال ‪1‬‬
‫‪ ‬على‪ ‬سبيل‪ ‬المثال‪ ‬لنفرض‪ ‬أن‪ ‬لدينا‪ ‬الصنفين‪)  manager ‬مدير(‪ ‬والصنف‪ ‬‬
‫(‪ employee ‬موظف(‪ ‬وأننا‪ ‬نود‪ ‬إعطاء‪ ‬جميع‪ ‬الدوال‪ ‬المنتمية‪ ‬للصنف‪  ‬‬
‫‪  manager‬إمكانية‪ ‬معالجة‪ ‬جميع‪ ‬المتغيرات‪ ‬والدوال‪ ‬الخانصة‪ ‬بالصنف‪ ‬‬
‫‪ employee‬فبدل‪  ‬من‪ ‬أن‪ ‬نعرف‪ ‬كل‪ ‬من‪ ‬هذه‪ ‬الدوال‪ ‬كدالة‪ ‬نصديقة‪ ‬نستطيع‪ ‬‬
‫تعريف‪ ‬الصنف‪ manager ‬كصديق‪ ‬للصنف‪  employee ‬مما‪ ‬يحقق‪ ‬‬
‫نفس‪ ‬الغاية‪.‬‬
‫‪  ‬ويتم‪ ‬ذلك‪ ‬بوضع‪ ‬الجملة‬
‫‪;friend manager        ‬‬
‫‪ ‬داخل‪ ‬تعريف‪ ‬الصنف‪ employee‬‬

‫‪19‬‬
‫مثال ‪2‬‬
‫وكمثال‪ ‬آخر‪ ،‬تذكر‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أننا‪ ‬عرفنا‪ ‬في‪ ‬الوحدة‪ ‬السابقة‪ ‬الصنف‪ LinkedList ‬‬ ‫‪‬‬
‫والذي‪ ‬يحتوي‪ ‬على‪ ‬العديد‪ ‬من‪ ‬الدوال‪ ‬المنتمية‪ ‬مثل‪ ListAdd ‬و‪ ListDelete ‬وجميع‪ ‬هذه‪ ‬‬
‫الدوال‪ ‬تعالج‪ ‬المتغيرات‪ ‬الخانصة‪ ‬بالصنف‪ node ‬ولجعل‪ ‬ذلك‪ ‬ممكنا‪ ‬عرفنا‪ node ‬كتركيب‪ ‬‬
‫باستخدام‪ ‬الكلمة‪   (struct ‬وليس‪ ‬كصنف‪ ‬وذلك‪ ‬لجعل‪ ‬المتغيرات‪ ‬المنتمية‪ ‬إليه‪ ‬عامة‪ ‬بحيث‪ ‬‬
‫تستطيع‪ ‬الدوال‪ ‬الخانصة‪ ‬بالصنف‪ LinkedList ‬التعامل‪ ‬مع‪ ‬هذه‪ ‬المتغيرات‪ ‬المنتمية‪.‬‬
‫ولكن‪ ‬هذا‪ ‬يعطي‪ ‬جميع‪ ‬الدوال‪ ،‬دون‪ ‬استثناء‪ ،‬القدرة‪ ‬على‪ ‬معالجة‪ ‬هذه‪ ‬المتغيرات‪ ‬الخانصة‪ ‬‬ ‫‪‬‬

‫بالتركيب‪ node ‬مما‪ ‬يعد‪ ‬انتهاكا‪ ‬لمبدأ‪ ‬إخفاء‪ ‬البيانات‪.Data Hiding ‬‬
‫والطريقة‪ ‬الفضل‪ ‬هي‪ ‬أن‪ ‬نعرف‪ node ‬كصنف‪) ‬باستخدام‪ ‬الكلمة‪ (class ‬مما‪ ‬يجعل‪ ‬متغيراته‪ ‬‬ ‫‪‬‬

‫المنتمية‪ ‬خانصة‪ ،private ‬ثم‪ ‬نعرف‪ ‬الصنف‪ LinkedList ‬كصنف‪ ‬نصديق‪ ‬كما‪ ‬يلي‬
‫{ ‪class node‬‬
‫;‪student data‬‬
‫;‪node* next‬‬
‫;‪friend LinkedList‬‬
‫‪20‬‬
‫;}‬
5 ‫نشاط‬
 ‫التعريف‬ ‫مستخدما‬ ‫السابقة‬ ‫الوحدة‬ ‫في‬ ‫المعرف‬  LinkedList ‫الصنف‬ ‫تنفيذ‬ ‫لعادة‬ ‫الحاسوب‬ ‫باستخدام‬ ،‫الدارس‬ ‫عزيزي‬ ،‫قم‬ 
.node ‫تعريف‬ ‫باستثناء‬ ‫اشيء‬ ‫أي‬ ‫لتغيير‬ ،‫الدارس‬ ‫عزيزي‬ ،‫تضطر‬ ‫لن‬ ‫الواقع‬ ‫في‬ .node ‫لـ‬ ‫الجديد‬
#include<iostream.h>
#include<conio.h>
class student{
long stno;
void LinkedList::ListAdd(student s)
int csno; { // allocate memory
char StName[20]; node* ptr=new node;
student* next; // check if the memory was not sufficient
public: if(ptr==NULL)
void initialize();
long get_stno() {return stno;}
cout<<"Error : insufficient memory \n";
char* get_stname(){return else // sufficient memory
StName;} { ptr->data=s;
}; // find insertion position
void student::initialize() node* prev=NULL;
{
cout<<"enter student's number";
node* Q=head;
cin>>stno; while(Q!=NULL &&
cout<<"enter student's name "; s.get_stno()>(*Q).data.get_stno())
cin>>StName; {prev=Q;
cout<<"enter no. of courses taken by the Q=Q->next;
student";
cin>>csno;
}
} if(prev==NULL) // insertion at front
class node{ { ptr->next=head;
student data; head=ptr;
node* next; }
friend class LinkedList;
else //insertion in the middle
};
{ ptr->next=prev->next;
class LinkedList{ prev->next=ptr;
node* head; }
public: } //else 21
LinkedList(){head=NULL;}
} //ListAdd
void ListAdd(student s);
int ListDelete(long stno);
void ListTraverse();
node* Search(long stno);
int LinkedList::ListDelete(long stno)
{ node* prev=NULL; main()
node* p=head; { LinkedList n;
while(p && p->data.get_stno()!=stno) student st;
{ prev=p; int i;
p=p->next; do {
} cout<<"\n Enter your choies 1=add 2=delete 3=travers
if(!p) return 0;
4:search 5=exit";cin>> i;
if(!prev) // i.e. prev=NULL
head=head->next; switch(i)
else {
prev->next=p->next; case 1 : cout<<"\n Enter student data:\n";
delete p; st.initialize();
return 1; n.ListAdd(st);
} // listDelete cout<<"\n*********** ADD OK ************** \n ";
break;
void LinkedList::ListTraverse() case 2 :{ int stno; cout<<"\n Enter student no to
{node*p=head; delete :";cin>>stno ;
while(p) n.ListDelete(stno);
{
} break;
cout<<"\n"<<(*p).data.get_stno()<<"
"<<(*p).data.get_stname();endl;
case 3 : n.ListTraverse(); break;
p=p->next; case 4 :{ int stno; cout<<"\n Enter student no to
} search :";cin>>stno ;
} n.Search(stno);
cout<<"\n "<<st.get_stname();endl;
node* LinkedList::Search(long stno) } break;
{node* p=head; }
while(p)
if(p->data.get_stno()==stno) return p; } while(i!=5 );
else cout<<"\n End of program ";
p=p->next;
getch();
return NULL;
}
}
22
‫العمليات‪OPERATORS‬‬
‫من‪ ‬المميزات‪ ‬الجميلة‪ ‬للغة‪  ++C ‬أنها‪ ‬تمكننا‪ ‬من‪ ‬إعادة تعريف العمليات ‪  operator‬‬ ‫‪‬‬
‫المختلفة‪ ‬بما‪ ‬يتناسب‪ ‬مع‪ ‬تطبيقاتنا‪.‬‬
‫فمثل‪ ‬نستطيع‪ ‬تعريف‪ ‬العملية‪ + ‬كعملية‪ ‬منتمية‪ ‬للصنف‪ section  ‬لتعني‪ ‬إضافة‪ ‬طالب‪ ‬‬ ‫‪‬‬

‫معين‪ ‬إلى‪ ‬الشعبة‪  ‬والعملية‪ – ‬لتعني‪ ‬اشطب‪ ‬طالب‪ ‬معين‪ ‬من‪ ‬الشعبة‪.‬‬
‫ان‪ ‬هذه‪ ‬التعريفات‪ ‬الجديدة‪ ‬لـ‪ + ‬و – ما‪ ‬هي‪ ‬إل‪ ‬تعريفات إضافية‪ ‬لهذه‪ ‬العمليات‪ ،‬أي‪ ‬‬ ‫‪‬‬

‫أننا‪ ‬نحمل‪ ‬هذه‪ ‬العمليات‪ ‬تعريفات جديدة‪  operator overloading ‬وهذا‪  ‬ممكن‪ ‬لن‪ ‬‬


‫ما‪ ‬يحدد‪ ‬تعريف‪ ‬العملية‪ ‬المطلوب‪ ‬تنفيذها‪ ‬هو‪ ‬عدد ونوع العوامل وليس فقط رمز‬
‫العملية ‪ .‬في‪ ‬الواقع‪ ‬إن‪ ‬الكثير‪ ‬من‪ ‬العمليات‪ ‬لها‪ ‬أنصل‪ ‬أكثر‪ ‬من‪ ‬تعريف‪ ‬في‪ ‬لغة‪. ++C ‬‬
‫فمثل‪ ‬العملية‪  + ‬لها‪ ‬أكثر‪ ‬من‪ ‬تعريف‪ ‬واحد‪ ‬فهي‪ ‬تعني‪ ‬الاشارة‪ ‬الموجبة‪ ‬عندما‪ ‬تأتي‪ ‬مع‪ ‬‬ ‫‪‬‬

‫عامل‪ ‬واحد‪ ،‬وتعني‪ ‬عملية‪ ‬جمع‪ ‬نصحيحة‪ ‬وعملية‪ ‬جمع‪ ‬حقيقية‪ ‬وغير‪ ‬‬
‫ذلك‪ .‬ويقوم مترجم ‪ ++C‬بتحديد التعريف المطلوب من عدد و نوع العوامل‪.‬‬

‫‪23‬‬
‫مثال‬
‫إن‪ ‬تعريف‪ ‬العمليات‪ ‬ل‪ ‬يختلف‪ ‬كثير‪ ‬عن‪ ‬تعريف‪ ‬الدوال‪ ‬‬ ‫‪‬‬

‫{‪class section‬‬ ‫وفي‪ ‬الواقع‪ ‬إن‪ ‬العمليات‪ ‬هي‪ ‬نوع‪ ‬خاص‪ ‬من‪ ‬الدوال‪ ‬في‪ ‬‬


‫;]‪student sec[50‬‬ ‫لغة‪   ++C ‬يختلف‪ ‬تعريف‪ ‬العملية‪ ‬عن‪ ‬تعريف‪ ‬الدالة‪ ‬فقط‪ ‬‬
‫;‪int size‬‬ ‫ف ي‪  ‬أ ن‪  ‬اس م‪  ‬العملي ة‪  ‬يتكون‪  ‬م ن‪  ‬الكلمة‪ operator  ‬‬
‫;)‪int bsearch(long stno‬‬ ‫متبوعا‪ ‬برمز‪ ‬العملية‪ ‬على‪ ‬سبيل‪ ‬المثال‪.+operator ‬‬
‫‪public:‬‬ ‫وكما‪ ‬نضع‪ ‬نموذجا‪ ‬للدالة‪ ‬المنتمية‪ ‬داخل‪ ‬تعريف‪ ‬الصنف‪ ‬‬ ‫‪‬‬
‫};‪section(){size=0‬‬ ‫يجب‪  ‬أيضا‪ ‬أ ن‪  ‬نضي ف‪  ‬نموذجا‪ ‬للعملي ة‪ ‬المنتمي ة‪  ‬داخل‪ ‬‬
‫;)‪void operator+(student s‬‬ ‫تعريف‪ ‬الصنف‪ .‬فمثل‪ ‬لتعريف‪ ‬العملية‪ +  ‬كعملية‪ ‬منتمية‪ ‬‬
‫;)‪void StAdd(student s‬‬ ‫للصنف‪  section  ‬بحيث‪ ‬تستخدم‪  ‬لضافة‪ ‬طالب‪ ‬جديد‪ ‬‬
‫;)‪int StDelete(long stno‬‬ ‫للشعبة‪ ‬يجب‪ ‬أول‪ ‬أن‪ ‬نضع‪ ‬النموذج‪ ‬التالي‬
‫;)(‪void Stlist‬‬
‫;)‪void operator+(student s‬‬
‫;)‪void StRetrieve(long stno‬‬
‫;}‬ ‫داخل‪ ‬تعريف‪ ‬الصنف‪  section  ‬بحيث‪ ‬يصبح‪ ‬كما‪ ‬يلي‬ ‫‪‬‬

‫‪ ‬‬ ‫‪‬‬

‫‪24‬‬
+OPERATOR ‫تعريف العملية‬
‫السم‬ ‫في‬ ‫إل‬ ‫يختلف‬ ‫ل‬ +operator ‫العملية‬ ‫تعريف‬ ‫أن‬ ‫ كما‬

void section::operator+(student s)
{int pos=0;
// search for the proper insertion position
while(s.get_stno() > sec[pos].get_stno() && pos<size)
pos++;
// shift element up one position
for(int i=size-1;i>=pos;i--)
sec[i+1]=sec[i];
sec[pos]=s;
size++;
25
}
‫استدعاء العملية‬
‫أما‪ ‬بالنسبة‪ ‬لستدعاء‪ ‬العملية‪ ‬فيمكننا‪ ‬استدعاءها‪ ‬كأي‪ ‬دالة‪ ‬منتمية‪ ،‬فمثل‪ ‬لضافة‪ ‬الطالب‪ S ‬‬ ‫‪‬‬
‫للشعبة‪ cs100 ‬يمكننا‪ ‬أن‪ ‬نستدعي‪ ‬العملية‪ + ‬كما‪ ‬يلي‬
‫;)‪cs100.operator+(S‬‬
‫‪  ‬أما‪ ‬الطريقة‪ ‬الفضل‪ ‬لستدعاء‪ ‬العملية‪ ‬فهي‪ ‬أن‪ ‬نستخدمها‪ ‬كأي‪ ‬عملية‪ ‬جمع‪ ‬أخرى‪ ‬كما‪ ‬يلي‬ ‫‪‬‬

‫;‪cs100 + S‬‬
‫وبالطبع‪ ‬فإن‪ ‬مترجم‪ ‬لغة‪ ++C ‬يعرف‪ ‬بأن‪ ‬هذه‪ ‬العملية‪ ‬ليست‪ ‬عملية‪ ‬جمع‪ ‬عادية‪ ‬بسبب‪ ‬نوع‪ ‬‬ ‫‪‬‬

‫العوامل‪ cs100 ‬و‪  S ‬ولذا‪ ‬فإنه‪ ‬يقوم‪ ‬باستدعاء‪ ‬العملية‪ + ‬التي‪ ‬قمنا‪ ‬نحن‪ ‬بتعريفها‪.‬‬
‫لحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أننا‪ ‬عرفنا‪ ‬عامل‪ ‬واحدا‪ ‬للعملية‪ +operator ‬هو‪  student S ‬‬ ‫‪‬‬

‫بالرغم‪ ‬من‪ ‬أن‪ ‬للعملية‪ ‬عاملين‪ ‬هما‪ ‬الشعبة‪ cs100) ‬في‪ ‬مثالنا(‪ ‬و‪ ‬الطالب‪ S) ‬في‪ ‬مثالنا(‪ ‬وذلك‪ ‬‬
‫لن‪ ‬هذه‪ ‬العملية‪ ‬عملية‪ ‬منتمية‪ ‬للصنف‪ section ‬وبالتالي‪ ‬فإن‪ ‬العامل‪ ‬الول‪ ‬معرف‪ ‬تلقائيا‪ ‬من‪ ‬‬
‫الصنف‪ student ‬أما‪ ‬العامل‪ student S ‬الذي‪ ‬يظهر‪ ‬في‪ ‬تعريف‪ ‬ترويسة‪ ‬العملية‪ ‬فهو‪ ‬‬
‫العامل‪ ‬الثاني‪ ‬وليس‪ ‬الول‪.‬‬
‫‪26‬‬
‫ملحظات هامة‬
‫‪ ‬هنالك‪ ‬بعض‪ ‬العمليات‪ ‬ل‪ ‬تسمح‪ ‬لغة‪  ++C ‬لنا‪ ‬بإعادة‪ ‬تعريفها‪ ‬وهذه‪ ‬‬
‫العمليات‪ ‬هي‬
‫‪            ::           ‬عملية‪ ‬تقرير‪ ‬المجال‪      ‬‬
‫‪         .           ‬عملية‪ ‬النقطة‬
‫‪     *          ‬‬
‫‪sizeof         ‬‬
‫‪     :?         ‬الخانصة‪ ‬بالتعابير‪ ‬الشرطية‬
‫‪ ‬عزيزي‪ ‬الدارس‪ ‬نشاط‬
‫‪  ‬أعد‪ ‬تعريف‪ ‬الصنف‪ section ‬باستخدام‪ ‬دالة‪  ‬اضافة‪ ‬الطالب‪ ‬جديد‪ ‬من‪ ‬‬
‫خلل‪ ‬الدالة‪ ‬السابقة‪   operator+ ‬بدل‪  stAdd ‬من‪ ‬الوحدة‪ ‬السابعة‪ ‬ثم‪ ‬‬
‫نفذ‪ ‬البرنامج؟‬ ‫‪27‬‬
‫عدم تغيير الخصائص التالية للعمليات عند اعادة تعريفها‬
‫‪ ‬كما‪ ‬ل‪ ‬يمكن‪ ‬تغيير‪ ‬الخصائص‪ ‬التالية‪ ‬للعمليات‪ ‬عند‪ ‬إعادة‪ ‬تعريفها‪ ‬وهي‬
‫‪  .1‬عدد‪ ‬العوامل‪ :‬فإذا‪ ‬كانت‪ ‬العملية‪ ‬في‪ ‬لغة‪   ++C‬تأخذ‪ ‬عاملين‪ ‬ل‪ ‬يمكن‪ ‬‬
‫تعريفها‪ ‬بحيث‪ ‬تأخذ‪ ‬عامل‪ ‬واحدا‪ ‬على‪ ‬سبيل‪ ‬المثال‪.‬‬
‫‪  .2‬أسبقية‪) ‬أو‪ ‬أولوية(‪   priority ‬العملية‪ :‬فل‪ ‬يمكن‪ ‬إعادة‪ ‬تعريف‪ ‬العملية‪ + ‬‬
‫وإعطاؤها‪ ‬أولوية‪ ‬أعلى‪ ‬من‪ ‬تلك‪ ‬الخانصة‪ ‬بالعملية‪.* ‬‬
‫‪ .3‬ترتيب‪ ‬التنفيذ‪ : associativi ‬فإذا‪ ‬كان‪ ‬ترتيب‪ ‬تنفيذ‪ ‬العملية‪ ‬من‪ ‬اليسار‪ ‬إلى‪ ‬‬
‫اليمين‪ ‬ل‪ ‬يمكن‪ ‬تغيير‪ ‬هذا‪ ‬الترتيب‪ ‬وجعله‪ ‬من‪ ‬اليمين‪ ‬إلى‪ ‬اليسار‪.‬‬

‫‪28‬‬
‫تعريف العمليات‬
‫كما‪ ‬يمكننا‪ ‬أن‪ ‬نعرف‪ ‬الدالة‪ ‬كدالة‪ ‬منتمية‪ ‬أو‪ ‬نصديقة‪ ‬فإنه‪ ‬يمكننا‪ ‬أيضا‪ ‬أن‪ ‬نعرف‪ ‬العملية‪ ‬‬ ‫‪‬‬
‫كعملية‪ ‬منتمية‪ ‬أو‪ ‬عملية‪ ‬نصديقة‪ .‬وكما‪ ‬أن‪ ‬تعريف‪ ‬العملية‪ ‬المنتمية‪ ‬ل‪ ‬يختلف‪ ‬كثيرا‪ ‬عن‪ ‬‬
‫تعريف‪ ‬الدالة‪ ‬المنتمية‪ ‬ل‪ ‬يختلف‪ ‬تعريف‪ ‬العملية‪ ‬الصديقة‪ ‬كثيرا‪ ‬عن‪ ‬تعريف‪ ‬الدالة‪ ‬الصديقة‪ .‬‬
‫وكمثال‪ ‬على‪ ‬تعريف‪ ‬الدوال‪ ‬الصديقة‪ ‬سنعرف‪ ‬الن‪ ‬دالة‪ ‬نصديقة‪ ‬للصنف‪ time ‬الذي‪ ‬يمثل‪ ‬‬
‫وقتا‪ ‬معينا‪ ‬يتكون‪ ‬من‪ ‬الساعة‪ ‬والدقيقة‪ ‬والثانية‪ .‬يمكننا‪ ‬أن‪ ‬نعرف‪ ‬هذا‪ ‬الصنف‪ ‬باستخدام‪ ‬ثلثة‪ ‬‬
‫متغيرات‪ ‬منتمية‪ hour ‬و‪ min ‬و‪  sec ‬لتمثيل‪ ‬الساعة‪ ‬والدقيقة‪ ‬والثانية‪ ‬على‪ ‬الترتيب‪.‬‬
‫لنفرض‪ ‬أننا‪ ‬نريد‪ ‬تعريف‪ ‬العملية‪  >> ‬بحيث‪ ‬تعرض‪ ‬لنا‪ ‬الوقت‪ ‬على‪ ‬الشااشة‪ ‬بطريقة‪ ‬مناسبة‬ ‫‪‬‬

‫فمثل‪ ‬عند‪ ‬تنفيذ‪ ‬العملية‬ ‫‪‬‬

‫‪‬‬ ‫;‪cout<<T‬‬
‫‪  ‬تكون‪ ‬النتيجة‪ ‬عرض‪ ‬الوقت‪ ‬كما‪ ‬يلي‬ ‫‪‬‬

‫‪‬‬ ‫‪The time is 12:23:30‬‬


‫‪  ‬على‪ ‬افتراض‪ ‬أن‪ ‬قيم‪ ‬المتغيرات‪ ‬المنتمية‪ ‬لـ‪  T : hour ‬و‪ min‬و‪ sec ‬هي‪ 12 ‬و‪ 23 ‬و‪ ‬‬ ‫‪‬‬

‫‪ 30‬على‪ ‬الترتيب‪.‬‬ ‫‪29‬‬
‫العملية >>‬
‫‪ ‬لحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أن‪ ‬للعملية‪ >> ‬عاملن‪ ‬الول‪ ‬هو‪ cout ‬والثاني‪ ‬كائن‪ ‬من‪ ‬‬ ‫‪‬‬
‫الصنف‪.time ‬‬
‫‪ ‬‬
‫في‪ ‬الواقع‪ ‬أن‪ cout  ‬هو‪ ‬كائن‪ ‬من‪ ‬الصنف‪  ostream ‬كما‪ ‬أن‪  cin ‬كائن‪ ‬من‪ ‬الصنف‪ ‬‬ ‫‪‬‬
‫‪ .istream‬إن‪ ‬العملية‪ >> ‬معرفة‪ ‬كعملية‪ ‬نصديقة‪ ‬للصنف‪ ostream ‬كما‪ ‬أن‪ ‬العملية‪ ‬‬
‫<<‪ ‬معرفة‪ ‬كعملية‪ ‬نصديقة‪ ‬للصنف‪.istream ‬‬
‫وهذه‪ ‬العمليات‪ ‬معرفة‪ ‬بحيث‪ ‬يسمحن‪ ‬للعامل‪ ‬الثاني‪ ‬أن‪ ‬يكون‪ ‬عددا‪ ‬نصحيحا‪ ‬أو‪ ‬حقيقيا‪ ‬أو‪ ‬‬ ‫‪‬‬

‫سلسلة‪ ‬رمزية‪ … ‬الخ‪ .‬وهذه‪ ‬التعاريف‪ ‬موجودة‪ ‬في‪ ‬المكتبة‪ .iostream ‬وما‪ ‬نريد‪ ‬فعله‪ ‬‬
‫هو‪ ‬إعطاء‪ ‬العملية‪ >> ‬تعريفا‪ ‬جديدا‪ ‬يسمح‪ ‬للعامل‪ ‬الثاني‪ ‬بأن‪ ‬يكون‪ ‬من‪ ‬الصنف‪ ،time ‬لذا‪ ‬‬
‫فإننا‪ ‬سنعرفها‪ ‬كعملية‪ ‬نصديقة‪ ‬للصنف‪ .time ‬ولذا‪ ‬فإننا‪ ‬سنضيف‪ ‬النموذج‬
‫‪ ‬‬
‫;)‪friend osrteam& operator<<(ostream& c,time t‬‬
‫‪30‬‬
‫مثال ‪TIME‬‬
‫>‪#include<iostream.h‬‬
‫{‪class time‬‬ ‫لحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أن‪ ‬للعملية‪ >> ‬عاملين‪ ‬هما‬ ‫‪‬‬

‫;‪int hour‬‬ ‫‪ .1‬العامل‪ c ‬وهو‪ ‬من‪ ‬النوع‪ &ostream ‬ويمثل‪ ‬‬ ‫‪‬‬


‫;‪int min‬‬ ‫الكائن‪ ‬الذي‪ ‬نود‪ ‬عرض‪ ‬القيمة‪ ‬عليه‪ .‬لحظ‪ ‬أيضا‪ ،‬‬
‫;‪int sec‬‬ ‫عزيزي‪ ‬الدارس‪ ،‬أن‪ ‬هذا‪ ‬العامل‪ ‬سيمرر‪ ‬بالاشارة‪ ‬‬
‫‪public:‬‬
‫وذلك‪ ‬لنه‪ ‬من‪ ‬النوع‪.&ostream ‬‬
‫)‪time(int h, int m, int s‬‬
‫;‪{hour=h‬‬ ‫‪ .2‬والعامل‪ t ‬وهو‪ ‬كائن‪ ‬من‪ ‬الصنف‪ time ‬والذي‪ ‬‬ ‫‪‬‬
‫;‪min=m‬‬ ‫نود‪ ‬عرض‪ ‬قيمته‪.‬‬
‫};‪sec=s‬‬
‫و‪ ‬الن‪ ‬نستطيع‪ ‬استخدام‪ ‬هذه‪ ‬العملية‪ ‬كما‪ ‬يلي‬ ‫‪‬‬
‫<<‪friend osrteam& operator‬‬
‫;)‪(ostream& c,time t‬‬ ‫‪;time tt(12,30,23)          ‬‬
‫;}‬ ‫‪;cout<<tt‬‬
‫أما العملية نفسها فتعرف كما يلي‬
‫)‪ostream& operator<<(ostream& C, time t‬‬ ‫إن‪ ‬العامل‪ ‬الحقيقي‪ ‬الول‪ cout ‬يمرر‪ ‬للعملية‪ >> ‬من‪ ‬‬ ‫‪‬‬

‫{‬ ‫خلل‪ ‬العامل‪ ‬الرسمي‪ C ‬وأن‪ ‬العامل‪ ‬الحقيقي‪ ‬الثاني‪ ‬‬
‫‪C<<”the time is “<<t.hour<<’:’<<t.min‬‬ ‫‪ tt‬يمرر‪ ‬للعملية‪ >> ‬من‪ ‬خلل‪ ‬العامل‪ ‬الرسمي‪ ‬الثاني‪ ‬‬
‫;‪<<’:’<<t.sec<<endl; return C‬‬ ‫‪.t‬‬
‫}‬ ‫‪31‬‬
‫تدريب ‪3‬‬
‫من‪ ‬المهم‪ ‬أن‪ ‬تلحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أننا‪ ‬عرفنا‪ ‬للعملية‪ >> ‬عاملين‪ ‬وذلك‪ ‬لنها‪ ‬عملية‪ ‬‬ ‫‪‬‬
‫نصديقة‪ ‬وليست‪ ‬منتمية‪ ،‬إذ‪ ‬لو‪ ‬كانت‪ ‬منتمية‪ ‬لكتفينا‪ ‬بتعريف‪ ‬العامل‪ ‬الثاني‪ ‬على‪ ‬اعتبار‪ ‬أن‪ ‬‬
‫العامل‪ ‬الول‪ ‬يعتبر‪ ‬تلقائيا‪ ‬على‪ ‬أنه‪ ‬من‪ ‬الصنف‪ ‬الذي‪ ‬تنتمي‪ ‬إليه‪ ‬هذه‪ ‬العملية‪ .‬لحظ‪ ‬أيضا‪ ‬أن‪ ‬‬
‫هذه‪ ‬العملية‪ ‬ترجع‪ ‬قيمة‪ ‬العامل‪) C ‬لذلك‪ ‬فإن‪ ‬نوع‪ ‬القيمة‪ ‬المرجعة‪ ‬هو‪ (&ostream ‬‬
‫وذلك‪ ‬حتى‪ ‬نتمكن‪ ‬من‪ ‬استخدامها‪ ‬في‪ ‬سلسلة‪ ‬من‪ ‬العمليات‪ ‬كما‪ ‬في‪ ‬الجملة‬
‫‪‬‬ ‫;‪cout<<tt<<ss<<t2‬‬
‫حيث‪ tt ‬و‪ ss ‬و‪ t2 ‬كائنات‪ ‬من‪ ‬الصنف‪.time ‬‬ ‫‪‬‬

‫‪  ‬يبقى‪ ‬أن‪ ‬نجيب‪ ‬على‪ ‬السؤال‪ ‬متى‪ ‬يفضل‪ ‬استخدام‪ ‬العمليات‪ ‬المنتمية‪ ‬ومتى‪ ‬يفضل‪ ‬استخدام‪ ‬‬ ‫‪‬‬
‫العمليات‪ ‬الصديقة؟‬
‫يفضل‪ ‬استخدام‪ ‬العمليات‪ ‬المنتمية‪ ‬إذا‪ ‬كان‪ ‬للعملية‪ ‬عاملن‪ ‬وكانت‪ ‬العملية‪ ‬تغيير‪ ‬من‪ ‬قيمة‪ ‬‬ ‫‪‬‬

‫العامل‪ ‬الول‪ ‬في‪ ‬هذه‪ ‬الحالة‪ ‬يفضل‪ ‬أن‪ ‬تعرف‪ ‬العملية‪ ‬كعملية‪ ‬منتمية‪ ‬الصنف‪ ‬العامل‪ ‬الول‪ .‬‬
‫أما‪ ‬العملية‪ ‬التي‪ ‬ل‪ ‬تغيير‪ ‬في‪  ‬قيم‪ ‬عواملها‪ has no side effect ‬فيفضل‪ ‬أن‪ ‬تعرف‪ ‬‬
‫كعوامل‪ ‬نصديقة‪.‬‬
‫‪32‬‬
‫الجابة‬
istream& operator>>(istream& c, time& t)
{
c>>t.hour>>t.min>>t.sec;
return c;
}

33
‫نصنف المجموعات ‪CLEASS SET‬‬
‫سنختتم‪ ‬هذه‪ ‬الوحدة‪ ،‬عزيزي‪ ‬الدارس‪ ،‬بتعريف‪ ‬المجموعة‪ ‬كصنف‪  class set  ‬ونعرف‪ ‬العديد‪ ‬من‪ ‬‬ ‫‪‬‬
‫العمليات‪ ‬التي‪ ‬تستخدم‪ ‬عليها‪.‬‬
‫تعرف‪ ‬المجموعة‪ ‬بأنها‪ ‬عدد‪ ‬من‪ ‬الاشياء‪ ‬غير‪ ‬المرتبة‪ ‬المأخوذة‪ ‬بدون‪ ‬تكرار‪ ‬من‪ ‬مدى‪ Universe ‬‬ ‫‪‬‬
‫محدد‪ .‬ويحدد‪ ‬المدى‪ ‬بأنصغر‪ ‬قيمة‪ ‬وأكبر‪ ‬قيمة‪ ‬يمكن‪ ‬أن‪ ‬تنتميا‪ ‬إلى‪ ‬المجموعة‪.‬‬
‫وهنالك‪ ‬العديد‪ ‬من‪ ‬العمليات‪ ‬التي‪ ‬تستخدم‪ ‬على‪ ‬المجموعات‪ ‬أهمها‪:‬‬ ‫‪‬‬

‫‪     .1‬إنشاء‪ ‬المجموعة‪ :‬وسنعرف‪ ‬بناء‪ constructor  ‬يقوم‪ ‬بهذه‪ ‬العملية‪.‬‬
‫‪     .2‬إضافة‪ ‬عنصر‪ ‬للمجموعة‪ :‬وسنعرف‪ ‬العملية‪ + ‬لتقوم‪ ‬بذلك‪.‬‬
‫‪      .3‬إزالة‪ ‬عنصر‪ ‬من‪ ‬المجموعة‪ :‬وسنعرف‪ ‬العملية‪ – ‬لتقوم‪ ‬بهذه‪ ‬المهمة‪.‬‬
‫‪  .4‬تقاطع‪ ‬المجموعات‪  : set intersection ‬حيث‪ ‬يتكون‪ ‬حانصل‪ ‬تقاطع‪ ‬مجموعتين‪ ‬من‪ ‬جميع‪ ‬‬
‫العنانصر‪ ‬المشتركة‪ ‬بين‪ ‬المجموعتين‪) ‬أي‪ ‬التي‪ ‬تظهر‪ ‬في‪ ‬المجموعتين(‪ .‬وسنعرف‪ ‬العملية‪ * ‬لتنفيذ‪ ‬‬
‫هذه‪ ‬العملية‪.‬‬
‫‪   .5‬اتحاد‪ ‬المجموعات‪  :set union ‬حيث‪ ‬يتكون‪ ‬حانصل‪ ‬اتحاد‪ ‬مجموعتين‪ ‬من‪ ‬جميع‪ ‬العنانصر‪ ‬التي‪ ‬‬
‫تظهر‪ ‬في‪ ‬أي‪ ‬من‪ ‬هذه‪ ‬المجموعات‪ .‬وسنعرف‪ ‬العملية‪ + ‬لتنفيذ‪ ‬هذه‪ ‬العملية‪ .‬لحظ‪ ‬أننا‪ ‬بذلك‪ ‬نكون‪ ‬قد‪ ‬‬
‫أضفنا‪ ‬تعريفين‪ ‬للعملية‪.+ ‬‬ ‫‪34‬‬
‫العلميات المستخدمة على المجموعات‬
‫‪     .6 ‬النتماء‪ ‬إلى‪ ‬المجموعة‪ :‬حيث‪ ‬يعتبر‪ ‬عنصرا‪ ‬ما‪ ‬منتميا‪ ‬للمجموعة‪ ‬إذا‪ ‬‬
‫ظهر‪ ‬في‪ ‬هذه‪ ‬المجموعة‪ .‬وسنكتب‪ ‬الدالة‪ IN ‬لتنفيذ‪ ‬هذه‪ ‬العملية‪.‬‬
‫‪     .7‬تعيين‪ ‬المجموعات‪ :‬وتقوم‪ ‬هذه‪ ‬العملية‪ ‬بجعل‪ ‬مجموعة‪ ‬ما‪ ‬مساوية‪ ‬‬
‫لمجموعة‪ ‬أخرى‪ .‬وسنكتب‪ ‬العملية‪ = ‬لتنفيذ‪ ‬ذلك‪.‬‬
‫‪  .8‬التأكد‪ ‬من‪ ‬أن‪ ‬المجموعة‪ ‬خالية‪ :‬وتستخدم‪ ‬لفحص‪ ‬فيما‪ ‬إذا‪ ‬كانت‪ ‬المجموعة‪ ‬‬
‫خالية‪ ‬أم‪ ‬ل‪ .‬وسنستخدم‪ ‬الدالة‪   SetEmpty   ‬لعمل‪ ‬ذلك‪.‬‬
‫‪  .9‬فرق‪ ‬المجموعات‪ :set difference ‬وتستخدم‪ ‬هذه‪ ‬العملية‪ ‬ليجاد‪ ‬‬
‫العنانصر‪ ‬الموجودة‪ ‬في‪ ‬مجموعة‪ ‬وليست‪ ‬موجودة‪ ‬في‪ ‬مجموعة‪ ‬أخرى‪.‬‬
‫‪ .10‬عرض‪ ‬عنانصر‪ ‬المجموعة‪ ‬على‪ ‬الشااشة‪ :‬وسنعرف‪ ‬العملية‪ >> ‬لعمل‪ ‬ذلك‪.‬‬

‫‪35‬‬
‫مدى المجموعة‬
‫‪ ‬سنفترض‪ ‬هنا‪ ‬أن‪ ‬مدى‪ ‬المجموعة‪ ‬مدى‪ ‬محدود‪ ‬بمعنى‪ ‬أننا‪ ‬نستطيع‪ ‬أن‪ ‬نعدد‪ ‬‬
‫جميع‪ ‬عنانصره‪ .‬وذلك‪ ‬لننا‪ ‬سنستخدم‪ ‬مصفوفة‪ ‬ذات‪ ‬بعد‪ ‬واحد‪ ‬لتمثيل‪ ‬أي‪ ‬‬
‫مجموعة‪ ‬حيث‪ ‬أن‪ ‬كل‪ ‬عنصر‪ ‬في‪ ‬المدى‪ ‬يمثل‪ ‬بموقع‪ ‬في‪ ‬هذه‪ ‬المصفوفة‪ .‬فإذا‪ ‬‬
‫كان‪ ‬ذلك‪ ‬العنصر‪ ‬منتميا‪ ‬إلى‪ ‬المجموعة‪ ‬نضع‪ ‬القيمة‪ 1 ‬في‪ ‬الموقع‪ ‬‬
‫المخصص‪ ‬له‪ ‬وإن‪ ‬لم‪ ‬يكن‪ ‬منتميا‪ ‬نضع‪ ‬القيمة‪ 0 ‬في‪ ‬الموقع‪ ‬المخصص‪ ‬له‪ .‬‬
‫فمثل‪ ‬لنفرض‪ ‬أن‪ ‬مدى‪ ‬المجموعة‪ ‬هو‪ ‬أسماء‪ ‬أيام‪ ‬السبوع‪ ‬السبعة‪ ‬لتمثيل‪ ‬هذه‪ ‬‬
‫المجموعة‪ ‬نستخدم‪ ‬مصفوفة‪ ‬من‪ ‬سبعة‪ ‬مواقع‪ ،‬موقع‪ ‬لكل‪ ‬عنصر‪ ‬في‪ ‬المدى‪ .‬‬
‫إذا‪ ‬كان‪ ‬يوم‪ ‬السبت‪ ‬عنصرا‪ ‬في‪ ‬المجموعة‪ ‬فإننا‪ ‬نخزن‪ ‬القيمة‪ 1‬في‪ ‬الموقع‪ ‬‬
‫الول‪ ‬المخصص‪ ‬له‪ ‬وإذا‪ ‬لم‪ ‬يكن‪ ‬فإننا‪ ‬نخزن‪ ‬القيمة‪ 0 ‬في‪ ‬الموقع‪ ‬المخصص‪ ‬‬
‫له‪ .‬ثم‪ ‬نأتي‪ ‬للموقع‪ ‬الثاني‪ ‬في‪ ‬المصفوفة‪ ‬و‪ ‬المخصص‪ ‬ليوم‪ ‬الحد‪ ‬ونضع‪ ‬فيه‪ ‬‬
‫القيمة‪ 1 ‬إذا‪ ‬كان‪ ‬يوم‪ ‬الحد‪ ‬عنصرا‪ ‬في‪ ‬المجموعة‪ ‬و‪ 0 ‬إذا‪ ‬لم‪ ‬يكن‪ ‬وهكذا‪.‬‬
‫‪36‬‬
‫تعريف‪ ‬نصنف‪ ‬يمثل‪ ‬مجموعة‪ ‬من‪ ‬اليام‪ ‬من‪ ‬نوع ‪SET‬‬
‫وسنستخدم‪ ‬الصنف‪ ‬المقابل‪ ‬لتمثيل‪ ‬مجموعة‪ ‬من‪ ‬أيام‪ ‬‬ ‫‪‬‬
‫{‪class Set‬‬ ‫السبوع‬
‫;]‪int weekdays[7‬‬
‫‪public:‬‬
‫;)(‪Set‬‬ ‫لحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أن‪ ‬هذا‪ ‬الصنف‪ ‬يحتوي‪ ‬على‪ ‬‬ ‫‪‬‬
‫;)‪void operator+(int i‬‬ ‫متغير‪ ‬منتم‪ ‬واحد‪ ‬هو‪ weekdays ‬والذي‪ ‬هو‪ ‬في‪ ‬‬
‫;)‪void operator-(int i‬‬ ‫الحقيقة‪ ‬مصفوفة‪ ‬من‪ ‬سبعة‪ ‬مواقع‪ ‬كل‪ ‬موقع‪ ‬مخصص‪ ‬‬
‫;)‪friend Set operator*(Set S, Set T‬‬ ‫ليوم‪ ‬من‪ ‬أيام‪ ‬السبوع‪ .‬كما‪ ‬يحتوي‪ ‬على‪ ‬العديد‪ ‬من‪ ‬‬
‫;)‪friend Set operator+(Set S, Set T‬‬
‫نماذج‪ ‬الدوال‪ ‬والعمليات‪ ‬المنتمية‪ ‬والصديقة‬
‫;)‪int IN(int i‬‬
‫;)‪void operator=(Set S‬‬
‫;)(‪int SetEmpty‬‬ ‫‪ ‬وفيما‪ ‬يلي‪ ‬سنناقش‪ ‬كل‪ ‬من‪ ‬هذه‪ ‬الدوال‪ ‬والعمليات‬ ‫‪‬‬
‫;)‪friend Set operator-(Set S, Set T‬‬
‫<<‪friend ostream& operator‬‬
‫;)‪(ostream& C, Set S‬‬ ‫‪  ‬البناء‪ Set() ‬‬ ‫‪‬‬
‫;}‬

‫‪37‬‬
‫البناء ‪SET‬‬
‫)(‪Set::Set‬‬
‫{‬
‫)‪for(int i=0;i<7;i++‬‬
‫;‪weekdays[i]=0‬‬
‫}‬
‫‪‬يقوم‪ ‬هذا‪ ‬البناء‪ ‬بإنشاء‪ ‬مجموعة‪ ‬فارغة‪ ‬بوضع‪ ‬القيمة‪ 0 ‬في‪ ‬كل‪ ‬موقع‪ ‬من‪ ‬‬
‫مواقع‪ ‬المصفوفة‪.‬‬

‫‪38‬‬
‫اضافة‪ ‬عنصر‪ ‬للمجموعة ‪OPERATOR+‬‬

‫)‪void Set::operator+(int i‬‬


‫)‪{if(i>=1 && i<=7‬‬
‫};‪weekdays[i-1]=1‬‬

‫‪  ‬وتقوم‪ ‬هذه‪ ‬العملية‪ ‬بإضافة‪ ‬عنصر‪ ‬جديد‪ ‬للمجموعة‪ ،‬وذلك‪ ‬بتخزين‪ ‬الرقم‪ 1 ‬في‪ ‬المكان‪ ‬‬
‫المخصص‪ ‬له‪ .‬يمثل‪ ‬العامل‪  i ‬رقم‪ ‬اليوم‪ ‬الذي‪ ‬نود‪ ‬إضافته‪ (7..1) ‬ولكون‪ ‬عنانصر‪ ‬المصفوفة‪ ‬‬
‫تبدأ‪ ‬من‪ 0 ‬وليس‪ ‬بواحد‪ ‬في‪ ‬الموقع‪ ‬المخصص‪ ‬لهذا‪ ‬اليوم‪ ‬هو‪ ‬الموقع‪ . i-1  ‬لقد‪ ‬فضلنا‪ ‬أن‪ ‬‬
‫نعرف‪ ‬هذه‪ ‬العملية‪ ‬كعملية‪ ‬منتمية‪ ‬لنها‪ ‬تغيير‪ ‬قيمة‪ ‬العامل‪ ‬الول‪ ‬وهو‪ ‬كائن‪ ‬من‪ ‬الصنف‪.Set ‬‬
‫‪ ‬ونستطيع‪ ‬استخدام‪ ‬هذه‪ ‬العملية‪ ‬لنشاء‪ ‬مجموعة‪ ‬تحتوي‪ ‬على‪ ‬أيام‪ ‬السبت‪ ‬والحد‪ ‬والجمعة‪ ‬كما‪ ‬‬
‫يلي‬
‫;‪Set S1‬‬ ‫;‪S1+1‬‬ ‫;‪S1+2‬‬ ‫;‪S1+7‬‬
‫‪39‬‬
‫تقاطع‪ ‬المجموعات * ‪OPERATOR‬‬
‫)‪Set operator*(Set S, Set T‬‬
‫;‪{Set R‬‬
‫)‪for(int i=0;i<7;i++‬‬
‫;]‪R.weekdays[i]=S.weekdays[i] && T.weekdays[i‬‬
‫;‪return R‬‬
‫}‬
‫‪‬تقوم‪ ‬هذه‪ ‬العملية‪ ‬بإنشاء‪ ‬المجموعة‪ ‬المحلية‪ R ‬لتخزين‪ ‬العنانصر‪ ‬المشتركة‪ ‬في‪ ‬المجموعة‪ S ‬والمجموعة‪ ‬‬
‫‪.T‬‬
‫‪ ‬ثم‪ ‬إعادة‪ ‬هذه‪ ‬المجموعة‪ .‬وقد‪ ‬فضلنا‪ ‬تعريف‪ ‬هذه‪ ‬العملية‪ ‬كعملية‪ ‬نصديقة‪ ‬للصنف‪ Set ‬وذلك‪ ‬لنها‪ ‬تأخذ‪ ‬‬
‫عاملين‪ ‬من‪ ‬الصنف‪  Set ‬ول‪ ‬تغيير‪ ‬قيمة‪ ‬أي‪ ‬منهما‪ .‬وبالطبع‪ ‬نستطيع‪ ‬إيجاد‪ ‬العنانصر‪ ‬المشتركة‪ ‬في‪ ‬‬
‫المجموعة‪ S1 ‬والمجموعة‪ S2 ‬باستخدام‪ ‬هذه‪ ‬العملية‪ ‬كما‪ ‬يلي‬
‫‪‬‬ ‫;‪S1*S2‬‬
‫‪‬لحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أن‪ ‬قيمتا‪ ‬العاملن‪  S‬و‪  T ‬يمرران‪ ‬إلى‪ ‬هذه‪ ‬العملية‪parameter ) ‬‬
‫‪  (  passing by value‬مم‪   ‬تحتوي‪ S ‬و‪  T ‬قد‪ ‬يجعل‪ ‬الحاسوب‪ ‬يستغرق‪ ‬وقتا‪ ‬أطول‪ ‬في‪ ‬عملية‪ ‬نسخ‪ ‬‬ ‫‪40‬‬
‫هذه‪ ‬القيم‪ ‬عند‪ ‬تمريرها‪ ‬وذلك‪ ‬لن‪ ‬كل‪ ‬من‪    ‬على‪ ‬مصفوفة‪.‬‬
‫تمرير العوامل بالاشارة‬
‫‪ ‬ولختصار‪ ‬هذا‪ ‬الوقت‪ ‬نفضل‪ ‬تمرير‪ ‬العوامل‪ ‬بالاشارة‪.by reference ‬‬ ‫‪‬‬

‫في‪ ‬هذه‪ ‬الحالة‪ ‬فقط‪ ‬عنوان‪ ‬العوامل‪ ‬سيمرر‪ ‬مما‪ ‬يعني‪ ‬وقت‪ ‬تنفيذ‪ ‬أقل‪ .‬ولمنع‪ ‬هذه‪ ‬العملية‪ ‬من‪ ‬أن‪ ‬تغيير‪ ‬‬ ‫‪‬‬
‫)بالخطأ(‪ ‬قيم‪ ‬هذه‪ ‬العوامل‪ ‬فإننا‪ ‬نمررها‪ ‬كعوامل‪ ‬ثابتة‪ ،‬وذلك‪ ‬بأن‪ ‬نسبقها‪ ‬بالكلمة‪ const ‬في‪ ‬ترويسة‪ ‬‬
‫العملية‪ ‬فتصبح‪ ‬العملية‪ ‬كما‪ ‬يلي‬

‫)‪Set operator*(const Set& S, const Set& T‬‬


‫;‪{Set R‬‬
‫)‪for(int i=0;i<7;i++‬‬
‫;]‪R.weekdays[i]=S.weekdays[i] && T.weekdays[i‬‬
‫;‪return R‬‬
‫}‬
‫بالطبع‪ ‬علينا‪ ‬الن‪ ‬تغيير‪ ‬نموذج‪ ‬هذه‪ ‬العملية‪ ‬داخل‪ ‬تعريف‪ ‬الصنف‪ Set ‬بحيث‪ ‬يصبح‬

‫‪41‬‬
‫)‪friend Set operator*(const Set& S, const Set& T‬‬
‫النتماء للمجموعة‬
‫)‪int Set::IN(int i‬‬
‫)‪{if(i>0&&i<7‬‬
‫;]‪return weekdays[i-1‬‬
‫‪else‬‬
‫‪return -1; // to indicate an error in the range‬‬
‫}‬
‫‪‬تقوم‪ ‬هذه‪ ‬الدالة‪ ‬بإرجاع‪ 1 ‬إذا‪ ‬كان‪ ‬رقم‪ ‬اليوم‪ i ‬منتميا‪ ‬للمجموعة‪ ،‬وإن‪ ‬لم‪ ‬يكن‪ ‬‬
‫ترجع‪ ‬القيمة‪ .0 ‬وإذا‪ ‬حصل‪ ‬خطأ‪ ‬وكان‪ ‬رقم‪ ‬اليوم‪ ‬قيمة‪ ‬غير‪ ‬مقبولة‪ ‬ترجع‪ ‬هذه‪ ‬‬
‫الدالة‪ ‬القيمة‪ ‬الخانصة‪ 1- ‬للدللة‪ ‬على‪ ‬ذلك‪.‬‬

‫‪42‬‬
‫تعين المجموعات‬
‫)‪void Set::operator=(Set S‬‬
‫)‪{for(int i=0;i<7;i++‬‬
‫;]‪weekdays[i]=S.weekdays[i‬‬
‫}‬

‫‪‬لحظ‪ ،‬عزيزي‪ ‬الدارس‪ ،‬أن‪ ‬هذه‪ ‬العملية‪ ‬عملية‪ ‬منتمية‪ ‬للصنف‪ Set ‬ولذا‪ ‬فإن‪ ‬‬
‫العامل‪ S ‬المعرف‪ ‬هو‪ ‬العامل‪ ‬الثاني‪ ‬وليس‪ ‬الول‪.‬‬
‫‪‬وتستخدم‪ ‬هذه‪ ‬العملية‪ ‬لجعل‪ ‬المجموعة‪ R ‬مساوية‪ ‬للمجمعة‪ T ‬كما‪ ‬يلي‬
‫‪R=T‬‬

‫‪43‬‬
‫الخلنصة‬
‫نستطيع‪ ‬تمرير‪ ‬عوامل‪ ‬الدوال‪ ‬والعمليات‪ ‬بالاشارة‪ ،‬ونعني‪ ‬بذلك‪ ‬تمرير‪ ‬عناوين‪ ‬العوامل‪ ‬‬ ‫‪‬‬
‫الحقيقية‪ ‬بدل‪ ‬من‪ ‬قيمها‪ .‬مما‪ ‬يعطي‪ ‬الدالة‪ ‬أو‪ ‬العملية‪ ‬القدرة‪ ‬على‪ ‬تغيير‪ ‬هذه‪ ‬العوامل‪ .‬‬
‫ونستخدم‪ ‬هذه‪ ‬الطريقة‪ ‬في‪ ‬بعض‪ ‬الحيان‪ ‬حتى‪ ‬وإن‪ ‬لم‪ ‬تكن‪ ‬الدالة‪ ‬أو‪ ‬العملية‪ ‬لتغير‪ ‬قيم‪ ‬‬
‫العوامل‪ ‬وذلك‪ ‬لتقليل‪ ‬الوقت‪ ‬اللزم‪ ‬لتمرير‪ ‬المصفوفات‪ ‬على‪ ‬سبيل‪ ‬المثال‪ .‬إذ‪ ‬لو‪ ‬أردنا‪ ‬‬
‫تمرير‪ ‬قيمتها‪) ‬بدل‪ ‬من‪ ‬عنوانها(‪ ‬سيستغرق‪ ‬ذلك‪ ‬وقتا‪ ‬بسبب‪ ‬حجمها‪.‬‬
‫هنالك‪ ‬نوع‪ ‬آخر‪ ‬من‪ ‬الدوال‪ ،‬بالضافة‪ ‬إلى‪ ‬الدوال‪ ‬المنتمية‪ ،‬تستطيع‪ ‬معالجة‪ ‬الجزاء‪ ‬‬ ‫‪‬‬

‫الخانصة‪ ‬بصنف‪ ‬ما‪ ‬وهي‪ ‬الدوال‪ ‬الصديقة‪ .‬وتعرف‪ ‬دالة‪ ‬ما‪ ‬كدالة‪ ‬نصديقة‪ ‬للصنف‪ ‬بوضع‪ ‬‬
‫نموذجا‪ ‬لتلك‪ ‬الدالة‪ ‬مسبوقا‪ ‬بالكلمة‪ friend ‬داخل‪ ‬تعريف‪ ‬الصنف‪ .‬ونستطيع‪ ‬تعريف‪ ‬‬
‫نصنف‪ ‬ما‪ ‬كصنف‪ ‬نصديق‪ ‬لصنف‪ ‬آخر‪ ‬مما‪ ‬يجعل‪ ‬تلقائيا‪ ‬جميع‪ ‬الدوال‪ ‬المنتمية‪ ‬للصنف‪ ‬‬
‫الول‪ ‬دوال‪ ‬نصديقة‪ ‬للصنف‪ ‬الثاني‪ .‬ويتم‪ ‬ذلك‪ ‬بوضع‪ ‬جملة‪ ‬تحوي‪ ‬اسم‪ ‬الصنف‪ ‬الول‪ ‬‬
‫مسبوقا‪ ‬بالكلمة‪ friend ‬داخل‪ ‬تعريف‪ ‬الصنف‪ ‬الثاني‪.‬‬
‫تمكننا‪ ‬لغة‪  ++C ‬من‪ ‬تعريف‪ ‬الكثير‪ ‬من‪ ‬العمليات‪ ‬مثل‪ + ‬و‪ – ‬و‪ * ‬الخ‪ ‬بالطريقة‪ ‬المناسبة‪ ‬‬ ‫‪‬‬

‫لنا‪ .‬ول‪ ‬يختلف‪ ‬تعريف‪ ‬العملية‪ ‬عن‪ ‬تعريف‪ ‬الدالة‪ ‬إل‪ ‬بالسم‪ ‬حيث‪ ‬يتكون‪ ‬اسم‪ ‬العملية‪ ‬من‪ ‬‬
‫رمزها‪ ‬مسبوقا‪ ‬بالكلمة‪  .operator ‬ويمكننا‪ ‬تعريف‪ ‬العملية‪ ‬إما‪ ‬كعملية‪ ‬منتمية‪ ‬أو‪ ‬كعملية‪ ‬‬ ‫‪44‬‬
‫نصديقة‪.‬‬
‫انتهت الوحدة الرابعة‬
‫تمنياتي لكم بالتوفيق‬

‫‪45‬‬
‫اسم الطالب‪........................... :‬‬ ‫بسم هللا الرحمن الرحيم‬ ‫اسم المقرر‪ :‬برمجة ‪1‬‬
‫رقم الطالب‪........................... :‬‬ ‫رقم المقرر‪1291 :‬‬
‫جامعة القدس المفتوحة‬
‫تاريخ االمتحان‪……./......../......... :‬‬ ‫مدة االمتحان‪ :‬ساعة ونصف‪.‬‬
‫إجابة االمتحان النهائي‬ ‫عدد األسئلة‪ :‬ستة ‪.‬‬
‫للفصل األول "‪"1141‬‬
‫‪2015/2014‬‬
‫‪ --‬نظري‪--‬‬
‫‪ 20‬عالمة)‬ ‫(‬ ‫أجب ب(نعم أو ال )‬ ‫السؤال األول‪:‬‬
‫وضع رمز اإلجابة الصحيحة في جدول (‪ )1‬من دفتر اإلجابة‪ .‬لكل ما يلي‬
‫‪162‬‬ ‫‪ .1‬الدالة الصديقة لصنف ما يمكنها معالجة القسم الخاص لذلك الصنف‪.‬‬
‫‪ .2‬نستخدم الكلمة المفتاحية ‪ static‬إذا أردنا تمرير المعامالت كمرجع مع عدم السماح للدالة تغيير قيمة المعامل‪181 .‬‬
‫‪214‬‬ ‫‪ .3‬الصنف المشتق هو الصنف الذي يرث خصائص وعمليات الصنف األساس‪.‬‬
‫‪ .4‬يمكننا التنظيم العشوائي للملفات من الوصول إلى السجل المطلوب مباشرة دون المرور بالسجالت التي تسبقه‪.‬‬
‫‪315‬‬ ‫‪ .5‬تحديث الملفات التتابعية أسهل بكثير من تحديث الملفات العشوائية‪.‬‬
‫‪ streams .6‬طرق لتوضيح بنية عناصر البيانات‪324 .‬‬
‫‪ .7‬صنف القاعدة او األساس هو الصنف الوارث لخصائص الصنف األساس وعملياته ‪286‬‬
‫‪ .8‬العوامل الشكلية هي العوامل الموجودة في ترويسة الدالة ‪204‬‬
‫‪ .9‬يسمح بإعادة تعريف العملية ‪ . Sizeof‬ص ‪173‬‬
‫‪ .10‬الكلمة ‪ this‬تعني يعد معامال ضمنيا لجميع الدوال المنتمية ويستعمل لإلشارة إلى الكينونة المستدعاة ويستخدم كذلك في إرجاع‬
‫القيم من الدوال المنتمية والمعامالت المستنسخة ص ‪178‬‬
‫جدول رقم (‪)1‬‬
‫عالمة)( عالمتان لكل فرع)‬ ‫إجابة السؤال رقم (األول ) من نوع ( أجب بنعم أو ال ) أو ( √ أو× ) ( ‪20‬‬
‫‪10 9‬‬ ‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫الفرع‬
‫ال نعم ال نعم‬ ‫ال‬ ‫الصحيحة نعم ال نعم نعم ال‬

‫‪ 30‬عالمات)‬ ‫(‬ ‫السؤال الثاني‪ :‬اختيار من متعدد ‪:‬‬


‫ضع رمز اإلجابة الصحيحة في جدول (‪ )2‬من دفتر اإلجابة ‪:‬‬
‫‪ -1‬اذا سبق اسم الصنف كلمة ‪ Frind‬تعني ان الصنف ‪168 :‬‬
‫د‪ -‬صديق‬ ‫جـ ‪-‬خاص‬ ‫ب‪ -‬عام‬ ‫ا‪ -‬محمي‬
‫‪ -2‬الدالة التالية };]‪ void set::operator=(set s) {for(int i=0;i<5;i++) weekd[i]=s.weekd[i‬تعني ‪186‬‬
‫د‪ -‬طباعة المجموعة‬ ‫جـ ‪ -‬تعيين المجموعة‬ ‫ب‪ -‬إنشاء المجموعة‬ ‫ا‪ -‬االنتماء للمجموعة‬
‫‪214‬‬ ‫‪ -3‬الصنف الوارث لخصائص الصنف األساس وعملياته هو ‪:‬‬
‫د‪-‬أ‪+‬ب‬ ‫جـ ‪public class -‬‬ ‫ب‪derived class -‬‬ ‫ا‪base class -‬‬
‫‪ -4‬اذا سبق اسم الصنف كلمة ‪ protected‬تعني ان الوراثة هي وراثه ص‪225‬‬
‫د‪ -‬مجرده‬ ‫جـ ‪ -‬خاصه‬ ‫ب‪ -‬عامه‬ ‫ا‪ -‬محمية‬
‫‪305‬‬ ‫‪ -5‬دالة ‪ Seekg‬تعني ‪:‬‬
‫د‪ -‬ال شيء مما ذكر‬ ‫جـ ‪ -‬تحديد موقع السجل‬ ‫ب‪ -‬تحديد موقع تخزين سجل‬ ‫ا‪-‬تحديد موقع السجل المنوي‬
‫المنوي كتابته في الملف‬ ‫جديد في الملف‬ ‫قراءته من الملف‬
‫‪ -6‬هي طرق لربط البرنامج أثناء تنفيذها مع أدوات اإلدخال واإلخراج ‪:‬‬
‫د‪file-‬‬ ‫جـ ‪public -‬‬ ‫ب‪streams -‬‬ ‫ا‪class -‬‬
‫‪302‬‬ ‫‪ ios:: in‬يمثل نمط فتح ملف ‪:‬‬ ‫‪ -7‬الكائن‬
‫د‪ -‬ا ‪ +‬ب‬ ‫جـ ‪ -‬للقراءة‬ ‫ب‪ -‬للكتابة‬ ‫ا‪ -‬للتحديث‬
‫‪310‬‬ ‫‪ inemployeefile.close(); -8‬تعني ‪:‬‬
‫د‪ -‬إغالق الملف‬ ‫جـ ‪ -‬فتح الملف‬ ‫ب‪ -‬يمنع تعديل الملف‬ ‫ا‪ -‬يمنع الكتابة على الملف‬
‫‪ -9‬لتعريف قيمة متغير ثابته في كل مراحل البرنامج نستخدم جملة‬
‫د‪ -‬ال شيء مما ذكر‬ ‫جـ ‪protect -‬‬ ‫ب‪const -‬‬ ‫ا‪class prototype-‬‬

‫‪ -10‬طرق معينه لربط البرامج لثناء تنفيذها مع أدوات اإلدخال واإلخراج نعني‬
‫د‪return-‬‬ ‫جـ ‪Data dictionary -‬‬ ‫ب‪streams -‬‬ ‫ا‪file -‬‬

‫‪1‬‬
‫‪10‬‬ ‫‪9‬‬ ‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫الفرع‬
‫ب‬ ‫ب‬ ‫د‬ ‫ج‬ ‫ب‬ ‫ا‬ ‫ب ا‬ ‫ج‬ ‫اإلجابة د‬

‫(‪ 16‬عالمة)‬ ‫السؤال الثالث‪:‬‬


‫‪ .1‬فرق بين تمرير المعامالت بالقيمة وتمريرها باإلشارة‪ 8( .‬عالمات) ص‪155‬‬
‫‪ .1‬تمرير المعامالت بالقيمة ‪ :‬يسمح بتمرير قيم العوامل إلى الدوال وأي تغيير تجريه الدالة على القيم ال يؤثر على قيم‬
‫العوامل الحقيقية‬
‫‪ .2‬تمرير المعامالت باإلشارة ‪ :‬يسمح بإرسال عناوين العوامل إلى الدوال حتى تستطيع هذه الدالة تغير القيم المخزنة في هذه‬
‫العوامل‬

‫‪ -2‬اكتب دالة قالبية لتبديل قيم متغيرين بغض النظر عن نوعهما (مثال‪ :‬إذا أدخلنا قيمة ‪ b=6‬و ‪ a=3‬تصبح ‪ b=3‬و ‪8( )a=6‬‬
‫عالمة ص‪236‬‬

‫)‪Template<class T> void swap(T& b, T& a‬‬


‫;‪{T temp‬‬
‫;‪temp=b‬‬
‫;‪b=a‬‬
‫};‪b=temp‬‬

‫( ‪ 16‬عالمة)‬ ‫السؤال الرابع ‪:‬‬


‫‪ -1‬اذا علمت انه اسم الكائن ‪ istream‬هو ‪ inEmployeeFile‬فاكتب صيغة الدالة المنتمية لوضع مؤشر القراءة من الملف عند‬
‫ص ‪ 8( 305‬عالمات )‬ ‫‪ -1‬البايت رقم ‪ k‬من الملف‬
‫; )‪inEmployeeFile.seekg(k‬‬
‫‪ -2‬البايت رقم ‪ k‬نسبة الى الموقع‬
‫;)‪inEmployeeFile.seekg(k,ios::cur‬‬

‫‪ -2‬يمنحنا مفهوم تعدد األوجه ميزتين مهمتين وضحهما‪8( .‬عالمات) ص‪249‬‬


‫‪ .a‬تأجيل تحديد هوية الدالة المراد استدعائها من وقت الترجمة إلى وقت تنفيذ البرنامج‬
‫‪ .b‬وضع عنوان كائن من صنف مشتق في متغير مؤشر معرف على انه مؤشر للصنف األساس‬

‫مالحظة‪ :‬اجب عن احد السؤالين التاليين‪:‬‬


‫( ‪ 18‬عالمة)‬ ‫السؤال الخامس ‪:‬‬
‫‪ -1‬توفر لغة ‪ c++‬ثالثة أنواع من الوراثة‪ ،‬ومن هذه األنواع الوراثة العامة ‪ .Public Inheritance‬وضح مستوى الوصول‬
‫للعناصر المورثة في هذا النوع‪ 12( .‬عالمات لكل إجابة ‪ 3‬عالمات )ص‪225‬‬
‫‪ .a‬المحمي ‪ protected‬في صنف األساس يصبح محمي في الصنف المشتق‬
‫‪ .b‬العام ‪ public‬في صنف األساس يصبح عاما في الصنف المشتق‬
‫‪ .c‬الخاص ‪ private‬ال يورث أبدا‬

‫‪ -2‬اكتب البرنامج المقطعي الالزم لفتح الملف ‪ Employee.dat‬في اسلوب الملف العشوائي للقراءة منه ‪ 6( .‬عالمات ) ص ‪316‬‬
‫;)‪ifstream inemployeefile ("Employee.dat",ios::in‬‬

‫‪2‬‬
)‫ عالمة‬18 ( : ‫السؤال السادس‬
‫ ثم يطبعها على‬Books.txt ‫ دار النشر) من ملف تتابعي اسمه‬،‫ المؤلف‬،‫ عنوان الكتاب‬،‫اكتب برنامج يقوم بقراءة بيانات الكتاب (الرقم‬
303‫ عالمات) ص‬10( .‫الشاشة‬

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main()
{
int bNum;
char title[30];
char author[30];
char publisher[30];

ifstream inBooks("Books.txt",ios::in);
if (!inBooks)
{cerr<<"File not opened"<<endl;
exit(1);
}
cout<<"Book number, Title, Author, Publisher"<<endl;
while(inBooks >>bNum>>title>>author>>publisher)
{
cout<< bNum<<" "<< title <<" "<< author <<" << publisher <<endl;
}
inBooks.close();
return 0;
}

‫انتهت اإلجابة‬

3
‫اسم الطالب‪........................... :‬‬ ‫بسم هللا الرحمن الرحيم‬ ‫اسم المقرر‪ :‬برمجة ‪1‬‬
‫رقم الطالب‪........................... :‬‬ ‫رقم المقرر‪1291 :‬‬
‫جامعة القدس المفتوحة‬
‫تاريخ االمتحان‪……./......../......... :‬‬ ‫مدة االمتحان‪ :‬ساعة ونصف‬
‫إجابة االمتحان النهائي‬ ‫عدد األسئلة‪ :‬ستة اسئلة‬
‫للفصل األول "‪"1141‬‬
‫‪2015/2014‬‬
‫‪ --‬نظري‪--‬‬
‫( ‪ 20‬عالمة)‬ ‫السؤال االول‪:‬‬
‫او × ) عالمتان لكل اجابة صحيحة‬ ‫√‬ ‫اجابة السؤال رقم ( االول ) من نوع ( أجب بنعم أو ال ) او (‬
‫‪10 9 8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5 4‬‬ ‫‪3‬‬ ‫‪2 1‬‬ ‫الفرع‬
‫ال‬ ‫نعم نعم‬ ‫نعم‬ ‫ال‬ ‫نعم‬ ‫ال‬ ‫نعم نعم‬ ‫الصحيحه ال‬

‫(‪ 30‬عالمة)‬ ‫السؤال الثاني‪:‬‬


‫اجابة السؤال رقم ( الثاني ) من نوع ( اختيار من متعدد ) ‪ 3‬عالمات لكل اجابة صحيحة‬
‫‪10 9‬‬ ‫‪8 7 6 5‬‬ ‫‪4‬‬ ‫‪3 2 1‬‬ ‫الفرع‬
‫‪d‬‬ ‫‪a‬‬ ‫‪a‬‬ ‫‪d‬‬ ‫‪c‬‬ ‫‪c‬‬ ‫‪a‬‬ ‫‪a‬‬ ‫‪d‬‬ ‫‪b‬‬ ‫الصحيحة‬

‫(‪ 15‬عالمة)‬ ‫السؤال الثالث‪:‬‬

‫‪ .1‬أكتب دالة فرعية تقوم بتبديل قيم متغيرين من نوع عدد صحيح حيث تم تمرير عناوين هذه المتغير إلى هذه الدالة‪ ،‬وتطبع‬
‫الدالة قيم المتغير قبل عملية التبديل وبعدها؟ (‪ 9‬عالمات )‬
‫{)‪void swap(int *a, int *b‬‬
‫;‪int temp=*a‬‬
‫;‪cout << " before swapping" <<*a << *b‬‬
‫;‪*a=*b‬‬
‫;‪*b=temp‬‬
‫;‪cout << " after swapping" << *a << *b‬‬
‫}‬
‫‪ .2‬وضح االستخدامات المختلفة لمفهوم تعدد االوجه ‪ 6 ( .Polymorphism‬عالمات)‬
‫‪ ‬تعدد االوجه الثابت‪ :‬هو ان تأخذ الدالة عدة اشكال وذلك عن طريق اعادة تعريف الدالة لتقوم باعمال مختلفة‬
‫‪ ‬تعدد االوجه الشكلي او الديناميكي‪ :‬القدرة على ربط كائن من فئة رئيسة ‪ base class‬بكائن من فئة مشتقة ‪derived class‬‬

‫(‪ 15‬عالمة)‬ ‫السؤال الرابع‪:‬‬


‫‪ .1‬اكتب برنامج لتخزين النص التالي في ملف نصي‪:‬‬
‫‪This is a line.‬‬
‫‪This is another line.‬‬
‫>‪#include <iostream‬‬
‫>‪#include <fstream‬‬
‫;‪using namespace std‬‬
‫{ )( ‪int main‬‬
‫;)‪ofstream myfile ("example.txt", ios::out‬‬
‫)‪if (myfile‬‬
‫{‬
‫;"‪myfile << "This is a line.\n‬‬
‫;"‪myfile << "This is another line.\n‬‬
‫;)(‪myfile.close‬‬
‫}‬
‫;"‪else cout << "Unable to open file‬‬
‫;‪return 0‬‬
‫}‬

‫‪1‬‬
‫مالحظة‪ :‬اجب عن احد السؤالين التاليين‪:‬‬
‫(‪ 20‬عالمة)‬ ‫السؤال الخامس‪:‬‬
‫‪ )6 .2‬أكتب دالة قالبية والتي تقوم بحساب مجموع أي قيمتين ثم تعيد النتيجة للدالة الرئيسية ‪ .main‬كذلك أكتب الدالة ‪ main‬ثم‬
‫عرف متغيرات من نوع ‪ int , float, double‬ثم قم باستدعاء الدالة القالبية وطباعة النتائج‪ 13( .‬عالمة)‬
‫>‪#include<iostream.h‬‬
‫>‪#include<string.h‬‬
‫>‪#include<conio.h‬‬
‫)‪template <class t> t sumv(t a,t b‬‬
‫{‬
‫;)‪return (a+b‬‬
‫}‬
‫{)‪void main(void‬‬
‫;‪int a=2,b=2‬‬
‫;‪float x=4.5, y=2.3‬‬
‫;‪cout << sumv(a,b) << endl‬‬
‫;)‪cout << sums(x,y‬‬
‫;)(‪getch‬‬
‫}‬

‫‪ .1‬وضح الفرق األساسي بين التنظيم التتابعي والتنظيم العشوائي للملفات من حيث كيفية الوصول للبيانات (سجالت الملف)‪ ،‬ثم‬
‫بين كيف يتم بناء الملفات العشوائية؟(‪ 7‬عالمات)‬
‫يتم الوصول للسجالت في الملفات التتابعية من بداية الملف بالسجل األول ثم التالي وهكذا (أي بالتتالي) أما في الملفات العشوائية‬
‫فإنه يتم الوصول للسجل المطلوب مباشرة دون المرور على السجالت السابقة‪ .‬ويتم بناء الملف العشوائي على افتراض أن جميع‬
‫السجالت متساوية في الحجم أو الطول مما يمكننا ذلك من إضافة أو حذف أو تعديل سجل معين في الملف العشوائي دون أن يؤثر‬
‫ذلك على بقية السجالت‪.‬‬
‫( ‪ 20‬عالمة)‬ ‫السؤال السادس‪:‬‬
‫(‪ 13‬عالمة)‬ ‫‪ .1‬مستخدما تعريف الصنف التالي‪:‬‬
‫اكتب دالة صديقة لهذا الصنف تقوم بطباعة قيم متغيراته واكتب كذلك تعريف هذه الدالة داخل الصنف‪.‬‬
‫‪class Employee‬‬
‫;‪{int Eno‬‬
‫;‪float ESalary‬‬
‫‪public:‬‬
‫;)‪friend void prt( Employee & E1‬‬
‫}‬
‫)‪void prt( Employee & E1‬‬
‫;‪{cout<<Eno<<endl<<ESalary<< endl‬‬
‫}‬
‫‪ .2‬اكتب ما يقابل الشكل التالي بلغة ‪7( .c++‬عالمات)‬

‫;}{ ‪class Person‬‬


‫;}{ ‪class Employee: public Person‬‬
‫;}{ ‪class Student: public Person‬‬
‫;}{ ‪class Manager: public Employee‬‬

‫انتهت االجابة‬

‫‪2‬‬
‫اسم الطالب‪........................... :‬‬ ‫بسم هللا الرحمن الرحيم‬ ‫اسم المقرر‪ :‬برمجة ‪1‬‬
‫رقم الطالب‪........................... :‬‬ ‫رقم المقرر‪1291 :‬‬
‫تاريخ االمتحان‪……./......../......... :‬‬ ‫مدة االمتحان‪ :‬ساعة ونصف‬
‫جامعة القدس المفتوحة‬
‫عدد األسئلة‪ :‬ستة اسئلة‬
‫‪ --‬نظري‪--‬‬ ‫االمتحان النهائي للفصل األول "‪"1141‬‬
‫‪2015/2014‬‬
‫‪ . 1‬عبىء كافة المعلومات المطلوبة عنك في دفتر االجابة وعلى ورقة االسئلة‪.‬‬ ‫عزيزي الطالب‪:‬‬
‫‪ . 2‬ضع رقم السؤال ورموز االجابة الصحيحة لالسئلة الموضوعية (ان وجدت) على الجدول المخصص في دفتر االجابة‬
‫‪ .3‬ضع رقم السؤال لالسئلة المقالية واجب على دفتر االجابة‪.‬‬

‫( ‪ 20‬عالمة)‬ ‫اجب ب (نعم‪/‬ال) للعبارات التالية وانقل رمز االجابة الى الجدول المخصص‬ ‫السؤال االول‪:‬‬
‫‪ .1‬ال يجوز في لغة سي‪ ++‬ان يرث صنف ما خصائصه من اكثر من صنف اساس واحد‬
‫‪ .2‬من الممكن انشاء دالة منتمية لصنف ما وصديقة لصنف اخر‪.‬‬
‫‪ .3‬المؤشر ‪ this‬يعتبر معامال ضمنيا لجميع الدوال المنتمية‪.‬‬
‫‪ .4‬تسمح لنا ‪ C++‬بإعادة تحميل العمليات مع امكانية تغيير اولوياتها‪.‬‬
‫‪ .5‬يمكننا التنظيم العشوائي للملفات من الوصول إلى السجل المطلوب مباشرة دون المرور بالسجالت التي تسبقه‪.‬‬
‫‪ .6‬تحديث الملفات التتابعية أسهل بكثير من تحديث الملفات العشوائية‪.‬‬
‫‪ .7‬الدالة الصديقة لصنف ما يمكنها معالجة القسم الخاص لذلك الصنف‪.‬‬
‫‪ .8‬يجوز ان تجعل صنفا ما صديقا لصنف اخر‬
‫‪ .9‬يستخدم الكائن ‪ cerr‬لعرض رسائل االخطاء على الشاشة‪.‬‬
‫‪ .10‬لطباعة الكلمة ‪ Quds‬على الشاشة نستخدم االمر ;"‪cout>>"Quds‬‬

‫(‪ 30‬عالمة)‬ ‫اختر االجابة الصحيحة للعبارات التالية وانقل رمز االجابة الى الجدول المخصص‬ ‫السؤال الثاني‪:‬‬
‫‪ )1‬عند تمرير معامل باالشارة الى دالة ما فانه يجب ان يسبق اسم المعامل االشارة‬
‫‪& )b‬‬ ‫‪$ )a‬‬
‫‪% )d‬‬ ‫‪@ )c‬‬
‫‪ )2‬عند تعريف دالة على انها صديقة لصنف يجب وضع نموذج هذه الدالة داخل تعريف الصنف مسبوقة بكلمة‬
‫‪Function )b‬‬ ‫‪prototype )a‬‬
‫‪friend )d‬‬ ‫‪inline )c‬‬
‫‪ )3‬من العمليات التي ال يسمح بإعادة تعريفها ‪overloading‬‬
‫‪* )b‬‬ ‫‪:: )a‬‬
‫‪& )d‬‬ ‫‪-- )c‬‬
‫‪ )4‬اذا كانت الوراثة بين صنفين وراثة محمية فان البيانات المعرفة في القسم الخاص للصنف االساس‬
‫‪ )b‬تصبح محمية في الصنف المشتق‬ ‫‪ )a‬ال تورث‬
‫‪ )d‬تصبح خاصة في الصنف المشتق‬ ‫‪ )c‬تصبح عامة في الصنف المشتق‬
‫‪ )5‬ترويسة الدالة القالبية تكتب بالصيغة التالية‪:‬‬
‫‪Template student T:: void fun() )b‬‬ ‫‪Template <class T> void fun() )a‬‬
‫‪void template <class T> fun() )d‬‬ ‫‪template <class T> void fun() )c‬‬
‫‪ )6‬النشاء ملف تتابعي اسمه ‪ cat.txt‬للكتابة فيه نستخدم االمر التالي‪:‬‬
‫‪ofstream file1 (<<cat.txt >>, ios::in); )b‬‬ ‫‪ofstream cat.txt (<<file>>, ios::out); )a‬‬
‫‪ifstream file1 (<<cat.txt >>, ios::in); )d‬‬ ‫‪ofstream file1 (<<cat.txt >>, ios::out); )c‬‬
‫‪ )7‬اذا رغبنا في تمرير احد المعامالت باالشارة (كمرجع) مع عدم تمكين الدوال من تغيير قيمته فاننا نستخدم الكلمة المفتاحية‬
‫‪private )b‬‬ ‫‪this )a‬‬
‫‪const )d‬‬ ‫‪end )c‬‬
‫‪ )8‬الصنف الذي يرث خصائص وعمليات صنف اخر يسمى‬
‫‪ )b‬الصنف االساس‬ ‫‪ )a‬الصنف المشتق‬
‫‪ )d‬الصنف االب‬ ‫‪ )c‬الصنف الصديق‬
‫‪ )9‬مجموعة من الحقول المترابطة منطقيا تشكل ما يسمى‬
‫‪ )b‬ملف‬ ‫‪ )a‬سجل‬
‫‪ )d‬بايت‬ ‫‪ )c‬قاعدة بيانات‬
‫‪ )10‬العادة وضع مؤشر بداية الكتابة عند رقم بايت معين في حالة الكتابة في ملف تتابعي نستخدم الدالة‬
‫‪beg )b‬‬ ‫‪seekg )a‬‬
‫‪seekp )d‬‬ ‫‪write )c‬‬

‫‪1‬‬
‫(‪ 15‬عالمة)‬ ‫السؤال الثالث‪:‬‬

‫‪ .1‬أكتب دالة فرعية تقوم بتبديل قيم متغيرين من نوع عدد صحيح حيث تم تمرير عناوين هذه المتغيرات إلى هذه الدالة‪ ،‬وتطبع‬
‫(‪ 9‬عالمات)‬ ‫الدالة قيم المتغيرات قبل عملية التبديل وبعدها‪.‬‬
‫‪ .2‬وضح االستخدامات المختلفة لمفهوم تعدد االوجه ‪ 6 ( .Polymorphism‬عالمات)‬

‫(‪ 15‬عالمة)‬ ‫السؤال الرابع‪:‬‬


‫اكتب برنامج لتخزين النص التالي في ملف نصي‪:‬‬
‫‪This is a line.‬‬
‫‪This is another line.‬‬

‫مالحظة‪ :‬اجب عن احد السؤالين التاليين‪:‬‬


‫(‪ 20‬عالمة)‬ ‫السؤال الخامس‪:‬‬
‫أكتب دالة قالبية تقوم بحساب مجموع أي قيمتين ثم تعيد النتيجة للدالة الرئيسية ‪ .main‬كذلك أكتب الدالة ‪ main‬ثم عرف‬ ‫‪.1‬‬
‫(‪13‬عالمات )‬ ‫متغيرات من نوع ‪ int , float, double‬ثم قم باستدعاء الدالة القالبية وطباعة النتائج‪.‬‬

‫‪ .2‬وضح الفرق األساسي بين التنظيم التتابعي والتنظيم العشوائي للملفات من حيث كيفية الوصول للبيانات (سجالت الملف)‪ ،‬ثم‬
‫بين كيف يتم بناء الملفات العشوائية؟(‪ 7‬عالمات)‬

‫‪ 20‬عالمة)‬ ‫(‬ ‫السؤال السادس‪:‬‬


‫‪ .1‬مستخدما تعريف الصنف التالي‪ 13( :‬عالمات)‬
‫‪class Employee‬‬
‫;‪{int Eno‬‬
‫;‪float ESalary‬‬
‫‪public:‬‬
‫‪……….‬‬
‫}‬
‫اكتب دالة صديقة لهذا الصنف تقوم بطباعة قيم متغيراته واكتب كذلك تعريف هذه الدالة داخل الصنف‪.‬‬

‫(‪7‬عالمات)‬ ‫اكتب ما يقابل الشكل التالي بلغة ‪.c++‬‬ ‫‪.2‬‬


‫‪Person‬‬

‫‪Employee‬‬ ‫‪Student‬‬

‫‪Manager‬‬

‫انتهت االسئلة‬

‫‪2‬‬
‫ﺍﺳﻢ ﺍﻟﻄﺎﻟﺐ‪........................... :‬‬ ‫ﺑﺴﻢ ﷲ ﺍﻟﺮﺣﻤﻦ ﺍﻟﺮﺣﻴﻢ‬ ‫ﺍﺳﻢ ﺍﻟﻤﻘﺮﺭ‪ :‬ﺑﺮﻣﺠﺔ ‪1‬‬
‫ﺭﻗﻢ ﺍﻟﻄﺎﻟﺐ‪........................... :‬‬ ‫ﺭﻗﻢ ﺍﻟﻤﻘﺮﺭ‪1291 :‬‬
‫ﺗﺎﺭﻳﺦ ﺍﻻﻣﺘﺤﺎﻥ‪……./......../......... :‬‬ ‫ﻣﺪﺓ ﺍﻻﻣﺘﺤﺎﻥ‪ :‬ﺳﺎﻋﺔ ﻭﻧﺼﻒ‬
‫ﺟﺎﻣﻌﺔ ﺍﻟﻘﺪﺱ ﺍﻟﻤﻔﺘﻮﺣﺔ‬
‫ﻋﺪﺩ ﺍﻷﺳﺌﻠﺔ‪ :‬ﺳﺘﺔ‬
‫‪ --‬ﻧﻈﺮﻱ‪--‬‬ ‫ﺍﻻﻣﺘﺤﺎﻥ ﺍﻟﻨﻬﺎﺋﻲ ﻟﻠﻔﺼﻞ ﺍﻷﻭﻝ "‪"1141‬‬
‫‪2015/2014‬‬
‫‪ .1‬ﻋﺒﻰء ﻛﺎﻓﺔ ﺍﻟﻤﻌﻠﻮﻣﺎﺕ ﺍﻟﻤﻄﻠﻮﺑﺔ ﻋﻨﻚ ﻓﻲ ﺩﻓﺘﺮ ﺍﻻﺟﺎﺑﺔ ﻭﻋﻠﻰ ﻭﺭﻗﺔ ﺍﻻﺳﺌﻠﺔ‪.‬‬ ‫ﻋﺰﻳﺰﻱ ﺍﻟﻄﺎﻟﺐ‪:‬‬
‫‪ .2‬ﺿﻊ ﺭﻗﻢ ﺍﻟﺴﺆﺍﻝ ﻭﺭﻣﻮﺯ ﺍﻻﺟﺎﺑﺔ ﺍﻟﺼﺤﻴﺤﺔ ﻟﻼﺳﺌﻠﺔ ﺍﻟﻤﻮﺿﻮﻋﻴﺔ )ﺍﻥ ﻭﺟﺪﺕ( ﻋﻠﻰ ﺍﻟﺠﺪﻭﻝ ﺍﻟﻤﺨﺼﺺ ﻓﻲ ﺩﻓﺘﺮ ﺍﻻﺟﺎﺑﺔ‬
‫‪ .3‬ﺿﻊ ﺭﻗﻢ ﺍﻟﺴﺆﺍﻝ ﻟﻼﺳﺌﻠﺔ ﺍﻟﻤﻘﺎﻟﻴﺔ ﻭﺍﺟﺐ ﻋﻠﻰ ﺩﻓﺘﺮ ﺍﻻﺟﺎﺑﺔ‪.‬‬

‫‪ 20‬ﻋﻼﻣﺔ(‬ ‫)‬ ‫ﺃﺟﺐ ﺏ)ﻧﻌﻢ ﺃﻭ ﻻ (‬ ‫ﺍﻟﺴﺆﺍﻝ ﺍﻷﻭﻝ‪:‬‬


‫ﻭﺿﻊ ﺭﻣﺰ ﺍﻹﺟﺎﺑﺔ ﺍﻟﺼﺤﻴﺤﺔ ﻓﻲ ﺟﺪﻭﻝ )‪ (1‬ﻣﻦ ﺩﻓﺘﺮ ﺍﻹﺟﺎﺑﺔ‪ .‬ﻟﻜﻞ ﻣﺎ ﻳﻠﻲ‬
‫‪ .1‬ﺍﻟﺪﺍﻟﺔ ﺍﻟﺼﺪﻳﻘﺔ ﻟﺼﻨﻒ ﻣﺎ ﻳﻤﻜﻨﻬﺎ ﻣﻌﺎﻟﺠﺔ ﺍﻟﻘﺴﻢ ﺍﻟﺨﺎﺹ ﻟﺬﻟﻚ ﺍﻟﺼﻨﻒ‪.‬‬
‫‪ .2‬ﻧﺴﺘﺨﺪﻡ ﺍﻟﻜﻠﻤﺔ ﺍﻟﻤﻔﺘﺎﺣﻴﺔ ‪ static‬ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺗﻤﺮﻳﺮ ﺍﻟﻤﻌﺎﻣﻼﺕ ﻛﻤﺮﺟﻊ ﻣﻊ ﻋﺪﻡ ﺍﻟﺴﻤﺎﺡ ﻟﻠﺪﺍﻟﺔ ﺗﻐﻴﻴﺮ ﻗﻴﻤﺔ ﺍﻟﻤﻌﺎﻣﻞ‪.‬‬
‫‪ .3‬ﺍﻟﺼﻨﻒ ﺍﻟﻤﺸﺘﻖ ﻫﻮ ﺍﻟﺼﻨﻒ ﺍﻟﺬﻱ ﻳﺮﺙ ﺧﺼﺎﺋﺺ ﻭﻋﻤﻠﻴﺎﺕ ﺍﻟﺼﻨﻒ ﺍﻷﺳﺎﺱ‪.‬‬
‫‪ .4‬ﻳﻤﻜﻨﻨﺎ ﺍﻟﺘﻨﻈﻴﻢ ﺍﻟﻌﺸﻮﺍﺋﻲ ﻟﻠﻤﻠﻔﺎﺕ ﻣﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻰ ﺍﻟﺴﺠﻞ ﺍﻟﻤﻄﻠﻮﺏ ﻣﺒﺎﺷﺮﺓ ﺩﻭﻥ ﺍﻟﻤﺮﻭﺭ ﺑﺎﻟﺴﺠﻼﺕ ﺍﻟﺘﻲ ﺗﺴﺒﻘﻪ‪.‬‬
‫‪ .5‬ﺗﺤﺪﻳﺚ ﺍﻟﻤﻠﻔﺎﺕ ﺍﻟﺘﺘﺎﺑﻌﻴﺔ ﺃﺳﻬﻞ ﺑﻜﺜﻴﺮ ﻣﻦ ﺗﺤﺪﻳﺚ ﺍﻟﻤﻠﻔﺎﺕ ﺍﻟﻌﺸﻮﺍﺋﻴﺔ‪.‬‬
‫‪ streams .6‬ﻁﺮﻕ ﻟﺘﻮﺿﻴﺢ ﺑﻨﻴﺔ ﻋﻨﺎﺻﺮ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬
‫‪ .7‬ﺻﻨﻒ ﺍﻟﻘﺎﻋﺪﺓ ﺍﻭ ﺍﻷﺳﺎﺱ ﻫﻮ ﺍﻟﺼﻨﻒ ﺍﻟﻮﺍﺭﺙ ﻟﺨﺼﺎﺋﺺ ﺍﻟﺼﻨﻒ ﺍﻷﺳﺎﺱ ﻭﻋﻤﻠﻴﺎﺗﻪ‬
‫‪ .8‬ﺍﻟﻌﻮﺍﻣﻞ ﺍﻟﺸﻜﻠﻴﺔ ﻫﻲ ﺍﻟﻌﻮﺍﻣﻞ ﺍﻟﻤﻮﺟﻮﺩﺓ ﻓﻲ ﺗﺮﻭﻳﺴﺔ ﺍﻟﺪﺍﻟﺔ ‪.‬‬
‫‪ .9‬ﻳﺴﻤﺢ ﺑﺈﻋﺎﺩﺓ ﺗﻌﺮﻳﻒ ﺍﻟﻌﻤﻠﻴﺔ ‪. Sizeof‬‬
‫‪ .10‬ﺍﻟﻜﻠﻤﺔ ‪ this‬ﺗﻌﻨﻲ ﻳﻌﺪ ﻣﻌﺎﻣﻼ ﺿﻤﻨﻴﺎ ﻟﺠﻤﻴﻊ ﺍﻟﺪﻭﺍﻝ ﺍﻟﻤﻨﺘﻤﻴﺔ ﻭﻳﺴﺘﻌﻤﻞ ﻟﻺﺷﺎﺭﺓ ﺇﻟﻰ ﺍﻟﻜﻴﻨﻮﻧﺔ ﺍﻟﻤﺴﺘﺪﻋﺎﺓ ﻭﻳﺴﺘﺨﺪﻡ ﻛﺬﻟﻚ ﻓﻲ ﺇﺭﺟﺎﻉ‬
‫ﺍﻟﻘﻴﻢ ﻣﻦ ﺍﻟﺪﻭﺍﻝ ﺍﻟﻤﻨﺘﻤﻴﺔ ﻭﺍﻟﻤﻌﺎﻣﻼﺕ ﺍﻟﻤﺴﺘﻨﺴﺨﺔ ﺯ‬

‫‪ 30‬ﻋﻼﻣﺎﺕ(‬ ‫)‬ ‫ﺍﻟﺴﺆﺍﻝ ﺍﻟﺜﺎﻧﻲ‪ :‬ﺍﺧﺘﻴﺎﺭ ﻣﻦ ﻣﺘﻌﺪﺩ ‪:‬‬


‫ﺿﻊ ﺭﻣﺰ ﺍﻹﺟﺎﺑﺔ ﺍﻟﺼﺤﻴﺤﺔ ﻓﻲ ﺟﺪﻭﻝ )‪ (2‬ﻣﻦ ﺩﻓﺘﺮ ﺍﻹﺟﺎﺑﺔ ‪:‬‬
‫‪ -1‬ﺍﺫﺍ ﺳﺒﻖ ﺍﺳﻢ ﺍﻟﺼﻨﻒ ﻛﻠﻤﺔ ‪ Frind‬ﺗﻌﻨﻲ ﺍﻥ ﺍﻟﺼﻨﻒ ‪:‬‬
‫ﺩ‪ -‬ﺻﺪﻳﻖ‬ ‫ﺟـ ‪-‬ﺧﺎﺹ‬ ‫ﺏ‪ -‬ﻋﺎﻡ‬ ‫ﺍ‪ -‬ﻣﺤﻤﻲ‬
‫‪ -2‬ﺍﻟﺪﺍﻟﺔ ﺍﻟﺘﺎﻟﻴﺔ };]‪ void set::operator=(set s) {for(int i=0;i<5;i++) weekd[i]=s.weekd[i‬ﺗﻌﻨﻲ‬
‫ﺩ‪ -‬ﻁﺒﺎﻋﺔ ﺍﻟﻤﺠﻤﻮﻋﺔ‬ ‫ﺟـ ‪ -‬ﺗﻌﻴﻴﻦ ﺍﻟﻤﺠﻤﻮﻋﺔ‬ ‫ﺏ‪ -‬ﺇﻧﺸﺎء ﺍﻟﻤﺠﻤﻮﻋﺔ‬ ‫ﺍ‪ -‬ﺍﻻﻧﺘﻤﺎء ﻟﻠﻤﺠﻤﻮﻋﺔ‬
‫‪ -3‬ﺍﻟﺼﻨﻒ ﺍﻟﻮﺍﺭﺙ ﻟﺨﺼﺎﺋﺺ ﺍﻟﺼﻨﻒ ﺍﻷﺳﺎﺱ ﻭﻋﻤﻠﻴﺎﺗﻪ ﻫﻮ ‪:‬‬
‫ﺩ‪-‬ﺃ‪+‬ﺏ‬ ‫ﺟـ ‪public class -‬‬ ‫ﺏ‪derived class -‬‬ ‫ﺍ‪base class -‬‬
‫‪ -4‬ﺍﺫﺍ ﺳﺒﻖ ﺍﺳﻢ ﺍﻟﺼﻨﻒ ﻛﻠﻤﺔ ‪ protected‬ﺗﻌﻨﻲ ﺍﻥ ﺍﻟﻮﺭﺍﺛﺔ ﻫﻲ ﻭﺭﺍﺛﻪ‬
‫ﺩ‪ -‬ﻣﺠﺮﺩﻩ‬ ‫ﺟـ ‪ -‬ﺧﺎﺻﻪ‬ ‫ﺏ‪ -‬ﻋﺎﻣﻪ‬ ‫ﺍ‪ -‬ﻣﺤﻤﻴﺔ‬
‫‪ -5‬ﺩﺍﻟﺔ ‪ Seekg‬ﺗﻌﻨﻲ ‪:‬‬
‫ﺩ‪ -‬ﻻ ﺷﻲء ﻣﻤﺎ ﺫﻛﺮ‬ ‫ﺟـ ‪ -‬ﺗﺤﺪﻳﺪ ﻣﻮﻗﻊ ﺍﻟﺴﺠﻞ‬ ‫ﺏ‪ -‬ﺗﺤﺪﻳﺪ ﻣﻮﻗﻊ ﺗﺨﺰﻳﻦ ﺳﺠﻞ‬ ‫ﺍ‪-‬ﺗﺤﺪﻳﺪ ﻣﻮﻗﻊ ﺍﻟﺴﺠﻞ ﺍﻟﻤﻨﻮﻱ‬
‫ﺍﻟﻤﻨﻮﻱ ﻛﺘﺎﺑﺘﻪ ﻓﻲ ﺍﻟﻤﻠﻒ‬ ‫ﺟﺪﻳﺪ ﻓﻲ ﺍﻟﻤﻠﻒ‬ ‫ﻗﺮﺍءﺗﻪ ﻣﻦ ﺍﻟﻤﻠﻒ‬
‫‪ -6‬ﻫﻲ ﻁﺮﻕ ﻟﺮﺑﻂ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺃﺛﻨﺎء ﺗﻨﻔﻴﺬﻫﺎ ﻣﻊ ﺃﺩﻭﺍﺕ ﺍﻹﺩﺧﺎﻝ ﻭﺍﻹﺧﺮﺍﺝ ‪:‬‬
‫ﺩ‪file-‬‬ ‫ﺟـ ‪public -‬‬ ‫ﺏ‪streams -‬‬ ‫ﺍ‪class -‬‬
‫‪ ios:: in‬ﻳﻤﺜﻞ ﻧﻤﻂ ﻓﺘﺢ ﻣﻠﻒ ‪:‬‬ ‫‪ -7‬ﺍﻟﻜﺎﺋﻦ‬
‫ﺩ‪ -‬ﺍ ‪ +‬ﺏ‬ ‫ﺟـ ‪ -‬ﻟﻠﻘﺮﺍءﺓ‬ ‫ﺏ‪ -‬ﻟﻠﻜﺘﺎﺑﺔ‬ ‫ﺍ‪ -‬ﻟﻠﺘﺤﺪﻳﺚ‬
‫‪ inemployeefile.close(); -8‬ﺗﻌﻨﻲ ‪:‬‬
‫ﺩ‪ -‬ﺇﻏﻼﻕ ﺍﻟﻤﻠﻒ‬ ‫ﺟـ ‪ -‬ﻓﺘﺢ ﺍﻟﻤﻠﻒ‬ ‫ﺏ‪ -‬ﻳﻤﻨﻊ ﺗﻌﺪﻳﻞ ﺍﻟﻤﻠﻒ‬ ‫ﺍ‪ -‬ﻳﻤﻨﻊ ﺍﻟﻜﺘﺎﺑﺔ ﻋﻠﻰ ﺍﻟﻤﻠﻒ‬
‫‪ -9‬ﻟﺘﻌﺮﻳﻒ ﻗﻴﻤﺔ ﻣﺘﻐﻴﺮ ﺛﺎﺑﺘﻪ ﻓﻲ ﻛﻞ ﻣﺮﺍﺣﻞ ﺍﻟﺒﺮﻧﺎﻣﺞ ﻧﺴﺘﺨﺪﻡ ﺟﻤﻠﺔ‬
‫ﺩ‪ -‬ﻻ ﺷﻲء ﻣﻤﺎ ﺫﻛﺮ‬ ‫ﺟـ ‪protect -‬‬ ‫ﺏ‪const -‬‬ ‫ﺍ‪class prototype-‬‬

‫‪ -10‬ﻁﺮﻕ ﻣﻌﻴﻨﻪ ﻟﺮﺑﻂ ﺍﻟﺒﺮﺍﻣﺞ ﻟﺜﻨﺎء ﺗﻨﻔﻴﺬﻫﺎ ﻣﻊ ﺃﺩﻭﺍﺕ ﺍﻹﺩﺧﺎﻝ ﻭﺍﻹﺧﺮﺍﺝ ﻧﻌﻨﻲ‬
‫ﺩ‪return-‬‬ ‫ﺟـ ‪Data dictionary -‬‬ ‫ﺏ‪streams -‬‬ ‫ﺍ‪file -‬‬

‫‪1‬‬
‫)‪ 16‬ﻋﻼﻣﺔ(‬ ‫ﺍﻟﺴﺆﺍﻝ ﺍﻟﺜﺎﻟﺚ‪:‬‬
‫)‪ 8‬ﻋﻼﻣﺎﺕ(‬ ‫‪.1‬ﻓﺮﻕ ﺑﻴﻦ ﺗﻤﺮﻳﺮ ﺍﻟﻤﻌﺎﻣﻼﺕ ﺑﺎﻟﻘﻴﻤﺔ ﻭﺗﻤﺮﻳﺮﻫﺎ ﺑﺎﻹﺷﺎﺭﺓ‪.‬‬
‫‪.2‬ﺍﻛﺘﺐ ﺩﺍﻟﺔ ﻗﺎﻟﺒﻴﺔ ﻟﺘﺒﺪﻳﻞ ﻗﻴﻢ ﻣﺘﻐﻴﺮﻳﻦ ﺑﻐﺾ ﺍﻟﻨﻈﺮ ﻋﻦ ﻧﻮﻋﻬﻤﺎ )ﻣﺜﻼ‪ :‬ﺇﺫﺍ ﺃﺩﺧﻠﻨﺎ ﻗﻴﻤﺔ ‪ =6‬ﻭ‪ a=3‬ﺗﺼﺒﺢ‪ b=3‬ﻭ ‪ 8) . (a=6‬ﻋﻼﻣﺎﺕ(‬

‫) ‪ 16‬ﻋﻼﻣﺔ(‬ ‫ﺍﻟﺴﺆﺍﻝ ﺍﻟﺮﺍﺑﻊ ‪:‬‬


‫‪ -1‬ﺍﺫﺍ ﻋﻠﻤﺖ ﺍﻧﻪ ﺍﺳﻢ ﺍﻟﻜﺎﺋﻦ ‪ istream‬ﻫﻮ ‪ inEmployeeFile‬ﻓﺎﻛﺘﺐ ﺻﻴﻐﺔ ﺍﻟﺪﺍﻟﺔ ﺍﻟﻤﻨﺘﻤﻴﺔ ﻟﻮﺿﻊ ﻣﺆﺷﺮ ﺍﻟﻘﺮﺍءﺓ ﻣﻦ ﺍﻟﻤﻠﻒ‬
‫)‪ 8‬ﻋﻼﻣﺎﺕ (‬ ‫‪ -2‬ﺍﻟﺒﺎﻳﺖ ﺭﻗﻢ ‪ k‬ﻧﺴﺒﺔ ﺍﻟﻰ ﺍﻟﻤﻮﻗﻊ ‪.‬‬ ‫ﻋﻨﺪ ‪ -1‬ﺍﻟﺒﺎﻳﺖ ﺭﻗﻢ ‪ k‬ﻣﻦ ﺍﻟﻤﻠﻒ‬
‫)‪ 8‬ﻋﻼﻣﺎﺕ (‬ ‫‪ -2‬ﻳﻤﻨﺤﻨﺎ ﻣﻔﻬﻮﻡ ﺗﻌﺪﺩ ﺍﻷﻭﺟﻪ ﻣﻴﺰﺗﻴﻦ ﻣﻬﻤﺘﻴﻦ ﻭﺿﺤﻬﻤﺎ‪.‬‬

‫ﺍﺟﺐ ﻋﻦ ﺍﺣﺪ ﺍﻟﺴﺆﺍﻟﻴﻦ ﺍﻟﺘﺎﻟﻴﻴﻦ‪:‬‬


‫) ‪ 18‬ﻋﻼﻣﺔ(‬ ‫ﺍﻟﺴﺆﺍﻝ ﺍﻟﺨﺎﻣﺲ ‪:‬‬
‫‪ -1‬ﺗﻮﻓﺮ ﻟﻐﺔ ‪ c++‬ﺛﻼﺛﺔ ﺃﻧﻮﺍﻉ ﻣﻦ ﺍﻟﻮﺭﺍﺛﺔ‪ ،‬ﻭﻣﻦ ﻫﺬﻩ ﺍﻷﻧﻮﺍﻉ ﺍﻟﻮﺭﺍﺛﺔ ﺍﻟﻌﺎﻣﺔ ‪ .Public Inheritance‬ﻭﺿﺢ ﻣﺴﺘﻮﻯ ﺍﻟﻮﺻﻮﻝ‬
‫)‪ 12‬ﻋﻼﻣﺔ (‬ ‫ﻟﻠﻌﻨﺎﺻﺮ ﺍﻟﻤﻮﺭﺛﺔ ﻓﻲ ﻫﺬﺍ ﺍﻟﻨﻮﻉ‪.‬‬
‫)‪ 6‬ﻋﻼﻣﺎﺕ (‬ ‫‪ -2‬ﺍﻛﺘﺐ ﺍﻟﺒﺮﻧﺎﻣﺞ ﺍﻟﻤﻘﻄﻌﻲ ﺍﻟﻼﺯﻡ ﻟﻔﺘﺢ ﺍﻟﻤﻠﻒ ‪ Employee.dat‬ﻓﻲ ﺍﺳﻠﻮﺏ ﺍﻟﻤﻠﻒ ﺍﻟﻌﺸﻮﺍﺋﻲ ﻟﻠﻘﺮﺍءﺓ ﻣﻨﻪ ‪.‬‬

‫) ‪ 18‬ﻋﻼﻣﺔ(‬ ‫ﺍﻟﺴﺆﺍﻝ ﺍﻟﺴﺎﺩﺱ ‪:‬‬


‫ﺍﻛﺘﺐ ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﺑﻘﺮﺍءﺓ ﺑﻴﺎﻧﺎﺕ ﺍﻟﻜﺘﺎﺏ )ﺍﻟﺮﻗﻢ‪ ،‬ﻋﻨﻮﺍﻥ ﺍﻟﻜﺘﺎﺏ‪ ،‬ﺍﻟﻤﺆﻟﻒ‪ ،‬ﺩﺍﺭ ﺍﻟﻨﺸﺮ( ﻣﻦ ﻣﻠﻒ ﺗﺘﺎﺑﻌﻲ ﺍﺳﻤﻪ ‪ Books.txt‬ﺛﻢ‬
‫ﻳﻄﺒﻌﻬﺎ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪.‬‬

‫ﺍﻧﺘﻬﺖ ﺍﻷﺳﺌﻠﺔ‬

‫‪2‬‬
‫اسم الطالب‪........................... :‬‬ ‫بسم ﷲ الرحمن الرحيم‬ ‫اسم المقرر‪ :‬برمجة ‪1‬‬
‫رقم الطالب‪........................... :‬‬ ‫رقم المقرر‪1291 :‬‬
‫تاريخ االمتحان‪……./......../......... :‬‬ ‫مدة االمتحان‪ :‬ساعة ونصف‪.‬‬
‫جامعة القدس المفتوحة‬
‫عدد االسئلة‪ 6 :‬اسئلة‬
‫‪ --‬نظري‪--‬‬ ‫االمتحان النھائي للفصل الثاني "‪"1142‬‬
‫‪2015/2014‬‬
‫‪ .1‬عبىء كافة المعلومات المطلوبة عنك في دفتر االجابة وعلى ورقة االسئلة‪.‬‬ ‫عزيزي الطالب ‪:‬‬
‫‪ .2‬ضع رقم السؤال ورموز االجابة الصحيحة لالسئلة الموضوعية )ان وجدت( على الجدول المخصص في دفتر االجابة‬
‫‪ .3‬ضع رقم السؤال لالسئلة المقالية واجب على دفتر االجابة‪.‬‬
‫)‪ 20‬عالمة(‬ ‫السؤال األول‪ :‬اجب بنعم او ال على العبارات التالي واضعا االجابة في الجدول المخصص من دفتر االجابة‪:‬‬
‫‪Emp *e; .1‬فان الجملة التالية صحيحة ;‪ e.id=15001‬على اعتبار ‪ e‬كائن مؤشري‪.‬‬
‫‪ .2‬اليمكن الوصول للمتغيرات من خارج الصنف الى المتغيرات التي لم يتم تحديد طريقة الوصول في الصنف ‪.‬‬
‫‪ .3‬يمرر بصورة تلقائيا مؤشر يدعى ‪ this‬عند استدعاء في حالة استدعاء الدالة المنتمية‪.‬‬
‫‪ .4‬الدالة الثابته المنتمية لصنف تستطيع تعديل قيم المتغيرات المنتمية لنفس الصنف‪.‬‬
‫‪ .5‬طريقة استدعاء الدالة الصديقة المنتمية نفس طريقة استدعاء الدالة المنتمية‪.‬‬
‫‪Friend Function .6‬الدالة الصديقة تستطيع معالجة االجزاء الخاصة في نفس الصنف‪.‬‬
‫‪ Overloading .7‬تعني اعادة تعريف العمليات‪.‬‬
‫‪ .8‬الدالة الصديقة يمكن ان تكون صديقة الكثر من صنف‪.‬‬
‫‪ .9‬ان لغة ‪ C++‬تنظر الى الملف كمجموعة من البايتات المخزنة واحدا تلو االخر‪.‬‬
‫‪ .10‬الينابيع طريقة معينة لربط البرامج مع ادوات االدخال واالخراج‪.‬‬
‫)‪ 30‬عالمة(‬ ‫السؤال الثاني‪ :‬اختر االجابة الصحيحة للعبارات التالية واضعا االجابة في الجدول المخصص من دفتر االجابة‪:‬‬
‫ھي‪:‬‬ ‫} { ‪public class Test‬‬ ‫‪ (1‬حالة البناء الصحيحة لـ‬
‫}……{)‪Test(char c‬‬ ‫‪(B‬‬ ‫}‪Test(int x ){….‬‬ ‫‪(A‬‬
‫جميع ما ذكر صحيح‬ ‫‪(D‬‬ ‫‪Test( ){…..} (C‬‬

‫‪ DBMS (2‬تساعد على مايلي‪:‬‬


‫‪ (B‬ﻣﻌﺎﻟﺟﺔ اﻟﺑﻳﺎﻧﺎت‬ ‫انشاء قاعدة البيانات‬ ‫‪(A‬‬
‫‪ (D‬جميع ما ذكر‬ ‫‪ (C‬ادارة ﻗﺎﻋدة اﻟﺑﻳﺎﻧﺎت‬
‫‪ (3‬أي من العبرات التالية صحيحة‪:‬‬
‫الصنف االساس يورث العمليات الى الصنف المشتق‬ ‫‪(B‬‬ ‫الصنف االساس يورث الخصائص الى الصنف المشتق‬ ‫‪(A‬‬
‫ليس مما ذكر‬ ‫‪(D‬‬ ‫الصنف االساس يورث الخصائص والعمليات الى الصنف المشتق‬ ‫‪(C‬‬
‫‪ (4‬ﻫﻳﻛﻠﻳﺔ اﻟﺑﻳﺎﻧﺎت ﻓﻲ ﻟﻐﺔ ‪:c++‬‬
‫‪(B‬‬
‫يمكن تكرار نفس االسم للدالة مع اختالف عدد المعامالت وعدم اختالف نوعھا‬ ‫‪(A‬‬
‫خطوات معالجة البيانات في الملفات‬
‫‪ (D‬ﺟﻣﻳﻊ ﻣﺎ ذﻛر ﺻﺣﻳﺢ‪.‬‬ ‫‪ (C‬ﺑﻧﻳﺔ ﻋﻧﺎﺻر اﻟﺑﻳﺎﻧﺎت اﻟﺗﻲ ﻳﺗم اﻟﺗﻌﺎﻣﻝ ﻣﻌﻬﺎ ﻓﻲ‬
‫اﻟﺣﺎﺳوب‬
‫‪ (5‬اﻟﻛﻠﻣﺔ اﻟﻣﺣﺟوزة )‪ (reserved word‬ﻓﻲ ﻟﻐﺔ ‪ C++‬ﻫﻲ ‪:‬‬
‫‪Subclasses‬‬ ‫‪(B‬‬ ‫‪Method‬‬ ‫‪(A‬‬
‫‪class‬‬ ‫‪(D‬‬ ‫‪Array‬‬ ‫‪(C‬‬
‫‪ (6‬ﻓﻲ اﻟﺑﺣث اﻟﺛﻧﺎﺋﻲ‪:‬‬
‫‪ (B‬ﻣﻘﺎرﻧﺔ اﻟﻘﻳﻣﺔ ﻣﻊ ﻗﻳم اﻟﻣﺻﻔوﻓﺔ ﺑطرﻳﻘﺔ ﺗﺗﺎﺑﻌﻳﺔ‬ ‫‪ (A‬اﺳرع طرﻳﻘﺔ ﺑﺣث‬
‫‪.(D‬ﺟﻣﻳﻊ ﻣﺎ ذﻛر‪.‬‬ ‫‪ (C‬ﺗرﺗﻳب اﻟﺑﻳﺎﻧﺎت ﻏﻳر ﻣﻬم‬
‫‪ (7‬اﻟﻌﻼﻗﺔ ﺑﻳن اﻻﺻﻧﺎف اﻟﺻدﻳﻘﺔ‪:‬‬
‫‪ (B‬ﻋﻼﻗﺔ ﺗﻌدي‬ ‫‪ (A‬ﻋﻼﻗﺔ ﺗﺑﺎدﻟﻳﺔ‬
‫‪.(D‬ﻟﻳﺳت ﻋﻼﻗﺔ ﺗﻌدي و ﺗﺑﺎدﻟﻳﺔ‪.‬‬ ‫‪ (C‬ﻋﻼﻗﺔ ﺗﺑﺎدﻟﻳﺔ وﺗﻌدي‬
‫‪ (8‬اﻟداﻟﺔ اﻟﺻدﻳﻘﺔ ﺗﺳﺗﺧدم ﻓﻲ اﻟﺣﺎﻟﺔ اﻟﺗﺎﻟﻳﺔ‪:‬‬
‫‪ (B‬ﻫﻲ ﻧﻔس اﻟﺻﻧف اﻟﺻدﻳق‬ ‫‪ (A‬ﻫﻲ ﻧﻔس اﻟداﻟﺔ اﻟﻣﻧﺗﻣﻳﺔ‬
‫‪ (D‬ﻏﻳر ذﻟك‪.‬‬ ‫‪ (C‬ﻫﻲ ﻧﻔس اﻟداﻟﺔ ﻏﻳر اﻟﻣﻧﺗﻣﻳﺔ‬

‫‪1‬‬
‫‪ (9‬ﺗﻣرﻳر اﻟﻌواﻣﻝ ﺑﺎﻟﻘﻳم‪:‬‬
‫‪ (B‬اي ﺗﻐﻳﻳر ﻋﻠﻰ اﻟﻘﻳم ﻓﻲ اﻟداﻟﺔ ﻳؤﺛر ﻋﻠﻰ ﻗﻳم اﻟﻌواﻣﻝ‬ ‫‪ (A‬اي ﺗﻐﻳﻳر ﻋﻠﻰ اﻟﻘﻳم ﻓﻲ اﻟداﻟﺔ ﻳؤﺛر ﻋﻠﻰ ﻗﻳم اﻟﻌواﻣﻝ‬
‫اﻟﺣﻘﻳﻘﻳﺔ ﻓﻲ ﺣﺎﻟﺔ وﺟود ﻗﻳﻣﺔ اﻓﺗراﺿﻳﺔ ﻟﻠﻌواﻣﻝ‬ ‫اﻟﺣﻘﻳﻘﻳﺔ‬
‫‪(D‬ﺟﻣﻳﻊ ﻣﺎ ذﻛر‪.‬‬ ‫‪ (C‬اي ﺗﻐﻳﻳر ﻋﻠﻰ اﻟﻘﻳم ﻓﻲ اﻟداﻟﺔ ﻻﻳؤﺛر ﻋﻠﻰ ﻗﻳم اﻟﻌواﻣﻝ‬
‫اﻟﺣﻘﻳﻘﻳﺔ‪.‬‬
‫‪ (10‬ﻳﻔﺿﻝ اﺳﺗﺧدام اﻟداﻟﺔ اﻟﺻدﻳﻘﺔ‪:‬‬
‫‪ (B‬ﺗﺣﻣﻳﻝ اﻟداﻟﺔ اﻛﺛر ﻣن ﺗﻌرﻳف وﺗﺗﺣدد اﻟداﻟﺔ ﻣن‬ ‫‪ (A‬اﻟداﻟﺔ ﺗﺣﺗوي ﻋﻠﻰ اﻛﺛر ﻣن ﻣﻌﺎﻣﻝ وﻛﻝ ﻋﺎﻣﻝ ﻳﻧﺗﻣﻲ‬
‫ﺧﻼﻝ ﻋدد اﻟﻌواﻣﻝ وﻧوﻋﻬﺎ‪.‬‬ ‫اﻟﻰ ﺻﻧف‬
‫‪(D‬ﻏﻳر ذﻟك‪.‬‬ ‫‪.A+B (C‬‬

‫‪ 15‬عالمة‬ ‫السؤال الثالث‪:‬‬


‫‪(1‬اكتب دالة تستقبل قيمتين من نوع ‪ int‬وعمل تبديل على القيم باستخدام طريقة التمرير بالمرجعية واستخدام * مع العوامل مع‬
‫‪5‬عالمات‬ ‫بيان طريقة االستدعاء اسم الدالة ‪ s‬واسماء المعامالت ‪.a,b‬‬
‫‪(2‬عرف دالة قالبية اسمھا ‪ power‬ولھا معامل واحد )‪,(y‬حيث تعمل ھذه الدالة حساب قيمه حاصل تربيع ‪ y‬وطباعته‪,‬وبين أيضا‬
‫‪ 5‬عالمات‬ ‫طريقة استدعائھا من داخل الدالة الرئيسية ) (‪ main‬؟‬
‫‪ 5‬عالمات‬ ‫‪(3‬اذا توفر لديك صنف اسمه ‪ Sdt‬عرف كائن اسمه ‪ s1‬وكائن مصفوفي اسمه ‪ s2‬من ‪ 5‬كائنات ‪.‬‬

‫‪ 15‬عالمة‬ ‫السؤال الرابع ‪ :‬اكتب برامج بلغة ‪ C++‬يقابل الشكل التالي)‪:(Class Diagram‬‬
‫‪L‬‬

‫‪B3‬‬
‫‪B2‬‬ ‫‪o : L‬‬
‫‪x : Integer‬‬

‫)(‪printx‬‬

‫‪D‬‬

‫)(‪printd‬‬

‫اجب على سؤال واحد فقط من االسئلة التالية‪:‬‬


‫‪ 20‬عالمة‬ ‫السؤال الخامس ‪:‬‬
‫‪ 10‬عالمات‬ ‫‪ (1‬ماوظيفة كل مما يلي‪:‬‬
‫‪ ios::app ،ifstream‬وظيفة ‪ end ، seekg () ،app‬في ‪.ios::end‬‬
‫‪10‬عالمات‬ ‫‪ (2‬عرف كائن من نوع ملف للكتابة وفتحه للكتابة اليه‪.‬‬
‫‪ 20‬عالمة‬ ‫السؤال السادس ‪:‬‬
‫‪ 10‬عالمات‬ ‫‪ (1‬ا كتب برنامج لعرض محتوى الملف النصي واسمه ‪.pro1.java‬‬
‫‪ 10‬عالمات‬ ‫‪ (2‬وضح طريقة الوصول الى ‪ R50‬في مايلي‪:‬‬
‫السجالت منظمة بصورة تتابعية‪:‬‬
‫‪R1 R2‬‬ ‫‪…….‬‬ ‫‪R50‬‬ ‫‪R51‬‬ ‫‪…..‬‬
‫السجالت منظمة بصورة عشوائية‪:‬‬
‫‪R1 R2‬‬ ‫‪…….‬‬ ‫‪R50‬‬ ‫‪R51‬‬ ‫‪…..‬‬

‫انتھت االسئلة‬

‫‪2‬‬
‫‪  ...........................‬‬ ‫اسم الطالب‪:‬‬ ‫بسم ﷲ الرحمن الرحيم‬ ‫م المقرر‪....... :‬برمجة ‪...........1‬‬
‫رقم الطالب‪........................... :‬‬ ‫رقم المقرر‪..............1291..........:‬‬
‫تاريخ االمتحان‪……/......../......... :‬‬ ‫مدة االمتحان‪...... :‬ساعة ونصف‪.......‬‬
‫عدد األسئلة‪  ................6........... :‬‬
‫جامعة القدس المفتوحة‬

‫‪ --‬نظري‪--‬‬ ‫االمتحان النھائي للدورة الصيفية الثانية "‪"1144‬‬


‫‪2015/2014‬‬
‫‪ .1‬عبئ كافة المعلومات المطلوبة عنك في دفتر اإلجابة وعلى ورقة األسئلة‪.‬‬ ‫عزيزي الطالب‪:‬‬
‫‪ .2‬ضع رقم السؤال ورموز اإلجابة الصحيحة لألسئلة الموضوعية )إن وجدت( على الجدول المخصص في دفتر اإلجابة‬
‫‪ .3‬ضع رقم السؤال لألسئلة المقالية واجب على دفتر اإلجابة‪.‬‬

‫السؤال األول‪ 30) -:‬عالمة(‬


‫ضع رمز اإلجابة الصحيحة في الجدول المخصص لھذا السؤال‪:‬‬
‫‪ .1‬إذا كانت الوراثة بين صنفين وراثة محمية فإن البيانات المعرفة في القسم الخاص للصنف األساس ‪:‬‬
‫د‪ .‬غير ذلك‬ ‫ج‪ .‬تصبح عامة في الصنف المشتق‬ ‫ب‪ .‬تصبح محمية في الصنف المشتق‬ ‫أ‪ .‬ال تورث‬
‫‪ .2‬الصنف الذي يرث خصائص وعمليات صنف آخر يسمى‪:‬‬
‫د‪ .‬الصنف القالبي‬ ‫ب‪ .‬الصنف األساس ج‪ .‬الصنف الصديق‬ ‫أ‪ .‬الصنف المشتق‬
‫‪ .3‬أي العمليات التالية ال يمكن إعادة تحميلھا ‪:overloading‬‬
‫د‪sizeof .‬‬ ‫ج‪++ .‬‬ ‫ب‪&& .‬‬ ‫أ‪>> .‬‬
‫‪ .4‬عند إعادة تحميل عملية اإلضافة ‪ +‬مثالً نكتبھا‪:‬‬
‫د‪object+ .‬‬ ‫ج‪+operator.‬‬ ‫ب‪Operand+ .‬‬ ‫أ‪Operator+ .‬‬
‫‪ .5‬نمط فتح الملف الذي يمكن استخدامه لإلضافة فقط في نھاية ملف موجود‪:‬‬
‫د‪ios::out .‬‬ ‫ج‪ios::trunk .‬‬ ‫ب‪ios::app .‬‬ ‫أ‪ios::in .‬‬
‫‪ .6‬يتم تحقيق مفھوم تعدد األوجه الذي يعمل وقت التنفيذ باستخدام‪:‬‬
‫د‪ .‬الدوال القالبية‬ ‫ج‪ .‬الدوال الوھمية‬ ‫ب‪ .‬الدوال السطرية‬ ‫أ‪ .‬الدوال الصديقة‬
‫‪ .7‬أحد المعامالت التالية ال يستخدم كمعامل مع الدالة )(‪:seekg‬‬
‫د‪ios::mid .‬‬ ‫ج‪ios::end .‬‬ ‫ب‪ios::cur .‬‬ ‫أ‪ios::beg .‬‬
‫‪ .8‬لجعل الصنف ‪ A‬صديق للصنف ‪ B‬نضع العبارة "‪ "friend class A‬في‪:‬‬
‫د‪ .‬الدالة ‪main‬‬ ‫ج‪ .‬الصنفين ‪A, B‬‬ ‫ب‪ .‬الصنف ‪B‬‬ ‫أ‪ .‬الصنف ‪A‬‬
‫‪ .9‬تعتبر جملة صحيحة لإلعالن عن صنف مشتق اسمه ‪ d‬من أصناف األساس ‪:b1,b2‬‬
‫ب‪Class d : b1,b2 .‬‬ ‫أ‪Class d : public b1, b2 .‬‬
‫د‪class d: class b1, class b2 .‬‬ ‫ج‪class d : public b1, public b2 .‬‬
‫‪ .10‬لمعالجة الملفات في لغة سي‪ ++‬يجب تضمين ملفات الترويسة‪:‬‬
‫د‪ .‬غير ذلك‬ ‫ج‪fstream/cstdio .‬‬ ‫ب‪iostream/cstdio .‬‬ ‫أ‪iostream/fstream .‬‬
‫‪ .11‬إن عملية بناء صنف جديد من صنف قديم )موجود من قبل( تدعى‪:‬‬
‫د‪ .‬التغطية‬ ‫ج‪ .‬الوراثة‬ ‫ب‪ .‬تعدد األوجه‬ ‫أ‪ .‬إعادة التحميل‬
‫‪ .12‬واحدة من التالية ال تعتبر من أنواع الوراثة‪:‬‬
‫د‪protected .‬‬ ‫ج‪friend .‬‬ ‫ب‪Private .‬‬ ‫أ‪Public .‬‬
‫‪ .13‬نستخدم ")‪ "ifstream fin(---‬لما نريد‪:‬‬
‫د‪ .‬قراءة ملف‬ ‫ج‪ .‬اإلضافة إلى الملف‬ ‫ب‪ .‬إزالة ملف‬ ‫أ‪ .‬إنشاء ملف‬
‫‪ .14‬الدوال القالبية‪:‬‬
‫د‪ .‬كل ما ذكر‬ ‫ب‪ .‬ال يمكن أن تكون وھمية ج‪ .‬ليس لھا معامالت تلقائية‬ ‫أ‪ .‬يتم خلقھا وقت الترجمة‬
‫‪ .15‬الصنف الذي يحتوي على دالة وھمية نقية يعرف بالصنف‪:‬‬
‫د‪ .‬القالبي‬ ‫ج‪ .‬المجرد‬ ‫ب‪ .‬الوھمي‬ ‫أ‪ .‬المشتق‬

‫السؤال الثاني‪ 20) -:‬عالمة(‬


‫أجب ب نعم أو ال عن العبارات التالية في الجدول رقم )‪ (1‬من دفتر اإلجابة‪.‬‬
‫التمرير بالقيمة يعني أي تغير يتم على العوامل الرسمية )الشكلية( سيقابله تغير على قيم العوامل الحقيقية‪.‬‬ ‫‪.1‬‬
‫تختلف دوال تعريف العملية )دوال إعادة التحميل( عن تعريف الدوال فقط باالسم‪.‬‬ ‫‪.2‬‬
‫الدوال الصديقة لصنف ما تستطيع معالجة األجزاء الخاصة لھذا الصنف‪.‬‬ ‫‪.3‬‬
‫من الممكن إنشاء دالة منتمية لصنف ما وصديقة لصنف آخر‪.‬‬ ‫‪.4‬‬
‫الكلمة ‪ this‬تعني يعد معامالً ضمنيا ً لجميع الدوال المنتمية‪.‬‬ ‫‪.5‬‬
‫الصنف الذي ال ينشأ منه كائنات يعرف بالصنف المجرد‪.‬‬ ‫‪.6‬‬
‫تستخدم الدالة ‪ Seekg‬لوضع مؤشر بداية الكتابة عند رقم بايت معين في حالة الكتابة في ملف‪.‬‬ ‫‪.7‬‬
‫يستخدم الكائن ‪ cerr‬لعرض رسائل األخطاء على الشاشة‪.‬‬ ‫‪.8‬‬
‫‪ .9‬العوامل الفعلية ھي العوامل الموجودة في ترويسة الدالة‬
‫‪ .10‬إذا كان موقع تخزين بداية ملف ما ھو ‪ 100‬وان حجم السجالت التي سيتم تخزينھا في ھذا الملف ھو ‪ 10‬بايت لكل سجل فإن‬
‫الموقع الفعلي لتخزين السجل السادس ھو ‪.160‬‬

‫السؤال الثالث‪ 15) -:‬عالمة(‬

‫اكتب برنامجا ً بلغة ‪ c++‬يحتوي على دالة قالبية باسم ‪ AbsoluteValue‬تعيد القيمة المطلقة للرقم )من أي نوع(؟ افحص البرنامج على‬
‫أنواع مختلفة من البيانات‪.‬‬

‫السؤال الرابع‪ 15) -:‬عالمة(‬


‫اكتب برنامجا ً بلغة ‪ C++‬يتكون من صنف باسم ‪ Shape‬يحتوي على دالة وھمية نقية باسم ‪ draw‬ال تعيد قيمة‪ ،‬اكتب صنفا ً باسم ‪Circle‬‬
‫يرث الصنف ‪ Shape‬ويحتوي على دالة وھمية باسم ‪ ،draw‬اكتب تعريف الدالة ‪ draw‬التابعة للصنفين‪ .‬اكتب الدالة الرئيسية التي تنشأ‬
‫كائنا ً من الصنف ‪ Circle‬ويؤشر عليه بمرجع الصنف ‪ .Shape‬ثم استدعي الدالة ‪ draw‬للتنفيذ‪.‬‬

‫أجب عن أحد السؤالين التاليين‬


‫السؤال الخامس‪ 20) -:‬عالمة(‬
‫اكتب برنامجا ً بلغة ‪ c++‬يتكون من صنفا ً باسم ‪ Square‬ويحتوي على متغير منتمي ‪ Side‬ودالة صديقة تحسب وتعيد مساحة المربع‪،‬‬
‫ودالة بناء تسند القيمة ‪ 10‬للمتغير ‪ .Side‬ثم اكتب الدالة الرئيسة إلنشاء كائن وتطبيق الدالة ‪.Area‬‬

‫السؤال السادس‪ 20) -:‬عالمة(‬


‫اكتب برنامجا ً بلغة ‪ c++‬لنسخ محتويات ملف نصي حرفا ً حرفا‪ ،‬إلى ملف آخر‬

‫انتھت األسئلة‬
‫اسم الطالب‪........................... :‬‬ ‫بسم ﷲ الرحمن الرحيم‬ ‫اسم المقرر‪ :‬برمجة ‪1‬‬
‫رقم الطالب‪........................... :‬‬ ‫رقم المقرر‪1291 :‬‬
‫تاريخ االمتحان‪……./......../......... :‬‬ ‫مدة االمتحان‪ :‬ساعة و نصف‬
‫جامعة القدس المفتوحة‬
‫عدد االسئلة‪ 6 :‬أسئلة‬
‫‪ --‬نظري‪--‬‬ ‫االمتحان النھائي للفصل األول "‪"1151‬‬
‫‪2016/2015‬‬
‫‪ .1‬عبىء كافة المعلومات المطلوبة عنك في دفتر االجابة وعلى ورقة االسئلة‪.‬‬ ‫عزيزي الطالب‪:‬‬
‫‪ .2‬ضع رقم السؤال ورموز االجابة الصحيحة لالسئلة الموضوعية )ان وجدت( على الجدول المخصص في دفتر االجابة‬
‫‪ .3‬ضع رقم السؤال لالسئلة المقالية واجب على دفتر االجابة‪.‬‬

‫)‪ 20‬عالمة(‬ ‫السؤال األول‪ :‬أجب بنعم أو ال على األسئلة التالية واضعا اإلجابة في الجدول رقم )‪ (1‬في دفتر اإلجابة‪.‬‬
‫‪ .1‬ال نستطيع تمرير المصفوفات باإلشارة إنما يجب أن نمررھا بوساطة عنوان أول عنصر‪.‬‬
‫‪ .2‬من الممكن أن تكون دالة ما منتمية إلى صنف ما‪ ،‬وصديقة إلى صنف آخر‪.‬‬
‫‪ .3‬إذا كان الصنف ‪ A‬صديق الصنف ‪ ، B‬و ‪ B‬صديق الصنف ‪ ، C‬فھذا يعني ضمنا أن الصنف ‪ A‬صديق للصنف ‪.C‬‬
‫‪ .4‬الجملة التالية تعبر عن مفھوم الوراثة المنفردة ;}{‪class A:public B, public C‬‬
‫‪ .5‬يتم إرسال المعامالت لدالة بناء الصنف الموروث عبر دالة بناء الصنف الوارث‪.‬‬
‫‪ .6‬يمكن دمج عمليات القراءة و الكتابة معا في أسلوب الملفات التتابعي ‪.‬‬
‫‪ .7‬يمكن انشاء كائن من صنف مجرد‪.‬‬
‫‪ .8‬تسمح لغة ‪ C++‬بإعادة تعريف العمليات دون السماح بتغيير عدد عوامل العملية‪.‬‬
‫‪ .9‬تستخدم الدالة ‪ seekp‬لتحديد الموقع المناسب لتخزين سجل في الملفات العشوائية دون ان يؤثر على السجالت األخرى‪.‬‬
‫‪ .10‬تستخدم الدالة الوھمية )‪ (virtual function‬من أجل إجبار المترجم على تحديد ھوية الدالة وقت الترجمة وليس وقت التنفيذ‪.‬‬

‫)‪ 30=15×2‬عالمة(‬ ‫السؤال الثاني‪-:‬‬


‫اختر رمز االجابه الصحيحه ومن ثم ضعھا في الجدول المخصص لذلك في دفتر االجابة‪:‬‬
‫‪ (1‬العمليات التي ال تسمح لغة ‪ C++‬بإعادة تحميلھا ھي‪:‬‬
‫د( &‬ ‫ج( ‪new‬‬ ‫ب( ‪sizeof‬‬ ‫أ( ‪delete‬‬
‫‪ (2‬الجملة ;)‪ replace(&x, &y‬تبين‪:‬‬
‫ج( أن كل من ‪ x‬و‪ y‬مؤشرات‪.‬‬ ‫أ( تمرير عناوين المتغيرات‬
‫د( أ ‪ +‬ج‬ ‫ب( تمرير قيم المتغيرات‬
‫‪ (3‬أي من الجمل التالية ال ينطبق على الكملة المفتاحية )‪:(this‬‬
‫ج( يمكن من خالله استرجاع القيم من الدوال المنتمية‪.‬‬ ‫أ( يستعمل لإلشارة إلى الكينونة المستدعاة‪.‬‬
‫د( يمكن استخدامه من داخل الدوال الصديقة‪.‬‬ ‫ب( يعتبر معامال ضمنيا للدوال المنتمية‪.‬‬
‫‪ (4‬المتغيرات المعرفة في القسم المحمي ‪ protected‬في تعريف الصنف يجعلھا قابلة للوصول و المعالجة من خالل‪.‬‬
‫ج( أ ‪ +‬ب‬ ‫أ( الدوال المنتمية لألصناف المشتقة من ھذا الصنف‪.‬‬
‫د( ال شيء مما ذكر‪.‬‬ ‫ب( الدوال المنتمية للصنف نفسه‪.‬‬
‫‪ (5‬المتغيرات والدوال المعرفة في القسم الخاص ‪ private‬من الصنف يمكن معالجتھا من داخل الدوال‪:‬‬
‫ج( المنتمية للصنف نفسه‬ ‫أ( المنتمية لألصناف المشتقة من ذلك الصنف‬
‫د( ال شيء مما ذكر‬ ‫ب( المنتمية ألي صنف‬
‫‪ (6‬تمكننا الدوال القالبية من‪:‬‬
‫ج( ال شيء مما ذكر‬ ‫أ( تعريف دالة دون تحديد نوع المعامالت‬
‫د( جميع ما ذكر‬ ‫ب( تعريف دالة يكون نوع معامالتھا محددة‪.‬‬
‫‪ (7‬في الوراثة المتعددة يمكن عمل مايلي‪:‬‬
‫ج( أ ‪ +‬ب‪.‬‬ ‫أ( الصنف الوارث يمكن أن يرث من أكثر من صنف‪.‬‬
‫د( ال يمكن عمل وراثة متعددة في لغة ‪. C++‬‬ ‫ب( الصنف الوارث يمكن أن يورث أصنافا أخرى‪.‬‬
‫‪ (8‬ترتيب تنفيذ البناء عند عمل مثيل من الصنف ‪ C‬المعرف بالجملة }{‪ public class C: public A, public B‬ھو‪:‬‬
‫د( ‪ A‬ثم ‪ B‬ثم ‪.C‬‬ ‫ج( ‪ C‬ثم ‪ B‬ثم ‪.A‬‬ ‫ب( ‪ B‬ثم ‪ A‬ثم ‪.C‬‬ ‫أ( ‪ C‬ثم ‪ A‬ثم ‪. B‬‬
‫‪ (9‬الكلمة ‪ const‬في التعريف ;‪ void foo() const‬تعني‪:‬‬
‫ج( ينتج خطأ بسبب عدم التعرف على الكلمة‬ ‫أ( تجعل المتغيرات المعرفة داخل الدالة ‪ foo‬من نوع ‪const‬‬
‫د( الكلمة ليس لھا أي تأثير على الدالة‬ ‫ب( تمنع الدالة من تعديل عناصر البيانات المعرفة في الصنف‬
‫‪ (10‬ترتيب تنفيذ الھدام عند انھاء مثيل الصنف ‪ C‬المعرف بالجملة }{‪ public class C: public A, public B‬ھو‪:‬‬
‫د( ‪ A‬ثم ‪ B‬ثم ‪.C‬‬ ‫ج( ‪ C‬ثم ‪ B‬ثم ‪.A‬‬ ‫ب( ‪ B‬ثم ‪ A‬ثم ‪.C‬‬ ‫أ( ‪ C‬ثم ‪ A‬ثم ‪. B‬‬
‫‪ (11‬يتم اختيار نمط فتح الملف ‪ ios::app‬من أجل‪:‬‬
‫ب( استبدال محتوى الملف ج( قراءة محتوى الملف د( مسح محتوى الملف‬ ‫أ( اإلضافة على محتوى الملف‬
‫‪ (12‬بإمكان المبرمج إغالق الملف بعد فتحه من خالل استخدام الدالة المنتمية‪:‬‬
‫د( ‪close‬‬ ‫ج( ‪end‬‬ ‫ب( ‪finish‬‬ ‫أ( ‪exit‬‬
‫‪ (13‬أي من ملفات الترويسة التالية يلزم تضمينه من أجل القراءة من الملفات‪:‬‬
‫د( ‪console.h‬‬ ‫ج( ‪ifstream.h‬‬ ‫ب( ‪fstream.h‬‬ ‫أ( ‪ofstream.h‬‬

‫‪1‬‬
‫‪ (14‬عند التعامل مع الملفات التتابعبة تستخدم الدالة ;)‪ seekg(n‬من أجل‪:‬‬
‫ج( البحث عن الحرف ‪ n‬داخل الملف‪.‬‬ ‫أ( وضع مؤشر بداية القراءة عند البايت رقم ‪ n‬من الملف‪.‬‬
‫د( ال شيء مما ذكر‬ ‫ب( إرجاع قيمة البايت المخزن في الموقع رقم ‪.n‬‬
‫‪ (15‬المعامالت ‪ ios::out|ios::binary‬تستخدم من اجل فتح ملف‪:‬‬
‫د( تتابعي للكتابة‬ ‫ج( تتابعي للقراءة‬ ‫ب( عشوائي للكتابة‬ ‫أ( عشوائي للقراءة‬

‫) ‪ 15‬عالمة(‬ ‫السؤال الثالث‪-:‬‬


‫ادرس المثال التالي ثم أجب عن االسئلة التي تليه‪:‬‬

‫‪class A‬‬
‫{‬
‫‪int H:‬‬
‫‪protected :‬‬
‫;‪int S‬‬
‫‪public :‬‬
‫;)‪void PUT (int‬‬
‫;)(‪void GET‬‬
‫;}‬
‫‪class B : private A‬‬
‫{‬
‫;‪int T‬‬
‫‪protected :‬‬
‫;‪int U‬‬
‫‪public :‬‬
‫;)‪void PUTDATA(int, int‬‬
‫;)(‪void GETDATA‬‬
‫;}‬
‫‪class C : public B‬‬
‫{‬
‫;‪int M‬‬
‫‪public :‬‬
‫;)(‪void DISP‬‬
‫;}‬

‫أي األصناف تعتبر صنفا أساسا )‪ (Base Class‬وأيھا مشتقة )‪(Derived Class‬؟‬ ‫‪.1‬‬
‫أذكر اسماء المتغيرات التي يمكن الوصول إليھا من الدالة )(‪.DISP‬‬ ‫‪.2‬‬
‫أذكر أسماء الدوال التي يمكن الوصول إليھا من مثيل الصنف ‪.C‬‬ ‫‪.3‬‬
‫ھل يمكن الوصول إلى الدالة )(‪ GET‬المعرفة في الصنف ‪ A‬من داخل الصنف ‪ B‬؟ لماذا؟‬ ‫‪.4‬‬
‫ھل يمكن الوصول إلى المتغير ‪ H‬من داخل الدوال المنتمية للصنف ‪ B‬؟ لماذا؟‬ ‫‪.5‬‬

‫)‪ 15‬عالمة(‬ ‫السؤال الرابع‪-:‬‬


‫الفرع االول‪ :‬أوضح كل مما يلي‪3) :‬ع×‪ 9=3‬عالمات(‬
‫‪ (1‬الوراثة المحمية ‪. Protected Inheritance‬‬
‫‪ (2‬الدوال الصديقة ‪Friend Functions‬‬
‫‪ (3‬الفرق األساسي بين الملف التتابعي والملف العشوائي من حيث كيفية الوصول للبيانات‪.‬‬

‫الفرع الثاني‪ :‬أوجد ناتج تنفيذ البرنامج التالي‪ 6) :‬عالمات(‬


‫) ‪void foo( int & a, int & b, int c‬‬
‫{‬
‫;‪a = b + c‬‬
‫;‪b = 0‬‬
‫;‪c = 0‬‬
‫}‬
‫)(‪int main‬‬
‫{‬
‫;‪int x = 0, y = 1, z = 2‬‬

‫‪2‬‬
‫;)‪foo(x, y, z‬‬
‫;"‪cout <<"X= "<< x <<endl<< "Y=" << y <<endl<< "Z= " << z<<"\n‬‬
‫;)‪foo(x, y, z‬‬
‫;<<‪cout <<"X= "<< x <<endl<< "Y=" << y <<endl<< "Z= " << z‬‬
‫}‬

‫أجب عن سؤال واحد من األسئلة التالية )السؤال الخامس أو السؤال السادس(‬


‫) ‪ 20‬عالمة(‬ ‫السؤال الخامس‪:‬‬
‫‪ (1‬اكتب برنامج لتخزين الجملة ‪ Welcome to QOU‬في ملف نصي باسم ‪ 10).final.txt‬عالمات(‬
‫‪ (2‬اكتب برنامج يعرض محتوى الملف النصي السابق على الشاشة‪ 10) .‬عالمات(‬

‫) ‪ 20‬عالمة(‬ ‫السؤال السادس‪:‬‬


‫الفرع األول‪ :‬أذكر الحاالت التي نفضل فيھا استخدام الدوال الصديقة‪ 6 ) .‬عالمات(‬
‫الفرع الثاني‪ :‬اكتب النص البرمجي الذي يحقق مايلي‪:‬‬
‫‪ .1‬جملة تعريف الدالة ‪ isEqual‬لتستقبل معاملين من نوع ‪ int‬وتعيد قيمة صح أو خطأ وأن تكون دالة صديقة‪).‬عالمتان(‬
‫‪ .2‬جملة استدعاء الدالة )‪ void switch(int*X, int* Y‬من أجل تبديل قيم المتغيران ‪ A‬و‪) .B‬عالمتان(‬
‫‪ .3‬دالة قالبية باسم ‪ GetMin‬والتي تعيد أصغر كائن من الكائنين الممررين إليھا‪ ،‬ثم استدع ھذه الدالة من الدالة الرئيسية مرة‬
‫لمقارنة عددين صحيحين‪ ،‬ومرة أخرى لتقارن عددين من نوع ‪ 10 ) .float‬عالمات (‬

‫‪ - - -‬انتھت األسئلة ‪- -‬‬

‫‪3‬‬
‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬

‫مقرر برمجة)‪1291 (1‬‬

‫لقاء إفتراضي بعنوان‬


‫مناقشة مواضيع هامة لمادة قبل النهائي )أمثلة وتدريبات(‬

‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى أسعد ‪ /‬منسق المقرر‬
‫فرع رام ال والبيرة‬

‫الخميس ‪3/12/2015‬‬
‫‪‬الصناف‬
‫‪‬الوراثة وأنواعها‬
‫‪‬محددات الوراثة‬
‫‪‬الكتابة في الملفات‬
‫‪‬القراءة من الملفات‬
‫الوراثة‬
‫مثال على الوراثة‬
class Shape {
protected:
float width, height;
public:
void set_data (float a, float b) { width = a; height
= b; }
};
class Rectangle: public Shape { class Triangle: public Shape {
public: public:
float area () { return (width * height); } float area () {
}; return (width * height / 2); }
};
int main () {
Rectangle rect;
Triangle tri; output
rect.set_data (5,3); :
tri.set_data (2,5); 15
cout << rect.area() << endl; cout << tri.area() << 5
endl; return 0;
}
‫ماذا يرث الصنف‬
class base1 {
public:
‫غموض‬
void some_function( ) { .... ... .... }
};
class base2 {
void some_function( ) { .... ... .... }
};
class derived : public base1, public base2 {
};
int main() { ‫ما الهدف من وضع‬
derived obj; ‫محدد للوراثة؟؟‬
obj.same_function( ) ; // Error!!
} :‫الحل‬
int main() {
...
‫ما نوع الوراثة في المثال السابق؟‬
obj.base1::same_function( )
;
‫محددات الوراثة‬
 Class Father{

};
 class son: public Father{

}
‫أسئلة وتمارين حول الوراثة‬
‫‪‬اكتب النص البرمجي الذي يحقق الوراثة المنفردة‬
‫الموضحة في الشكل التالي علما بان الصنفان‬
‫المشتقان يحتويان دوال حساب المساحة‪.‬‬
‫‪CPolygon‬‬
‫‪width : Integer‬‬
‫‪height : Integer‬‬

‫)(‪set_values‬‬

‫‪CRectangle‬‬ ‫‪CTriangle‬‬

‫)( ‪area‬‬ ‫)( ‪area‬‬


‫معالجة الملفات بلغة ‪++C‬‬
‫‪ ‬إذا أحببت أن تتعامل مع قنوات الملفات يجب أن نستخدم الملف‬
‫الرأسي ‪ fstream.h‬أي قنوات الملفات ‪File Stream‬‬
‫إذا يجب أن تكون العبارة ‪:‬‬
‫>‪#include <fstream.h‬‬
‫‪ ‬للكتابة داخل أي ملف توجد ‪ 3‬خطوات وهي‪:‬‬
‫نعرف كائن من نوع ملف‪:‬‬ ‫‪.1‬‬
‫نفتح الملف للكتابة‬ ‫‪.2‬‬
‫نكتب داخل الملف‬ ‫‪.3‬‬

‫; ‪1. ofstream fout‬‬


‫;)‪2. fout.open("file path",iostream family‬‬
‫;"‪3. fout<<"data‬‬
‫ برنامج لكتابة أكثر من سطر في ملف‬:‫مثال‬
#include <fstream.h>
int main()
{
ofstream fout;
fout.open("D:\\firstExa.txt");
fout << "HELLO C++ Programmer.\n"
<< “This is the first line\n"
<< “this is the second line\n";
fout.close();
}
‫ الملفات‬... ‫تابع‬
‫ سلسلة من‬.‫البايتات‬ : Stream 
‫للكتابة على‬: ‫الملف‬ ofstream 
‫للقراءة من‬: ‫ملف‬ ifstream 
‫للقراءة‬: ‫والكتابة‬ fstream 

:‫ فتح الملف‬
‫فتح باستخدام البناء‬

ofstream outFile("sample.txt");    //output only


ifstream inFile(“sample.txt”);  //input only
()open ‫ فتح الملف باستخدام الدالة‬
 Stream-object.open(“filename”, mode)
  ofstream outFile;
  outFile.open("sample.txt");
     
      ifstream inFile;
      inFile.open("sample.txt");
fstream file;
file.open ("example.bin", ios::out | ios::app |
ios::binary);
‫الكتابة في ملف‬
‫نربط الملف الرأسي الذي يحوي كلسات قنوات الملفات‪//‬‬
‫>‪#include <fstream‬‬
‫)(‪void main‬‬
‫{‬
‫أي للكتابة على الملف ‪ out‬نعرف متغير قناة خرج‪//‬‬
‫;‪ofstream fout‬‬
‫نفتح القناة الن على ملف محدد باسمه ونضع لفتة على القناة أو راية تدل أنها قناة من البرنامج وتودي‪//‬‬
‫للملف‬
‫;)‪fout.open("D:\\MyFile.txt" , ios::out‬‬
‫الن جاهزون لستخدام القناة ‪//‬‬
‫;"‪fout << "Hello this is my first file test‬‬
‫الن لنغلق القناة‪//‬‬
‫;)(‪fout.close‬‬
‫}‬
‫كتابة في ملف أم قراءة ؟؟‬
#include<iostream.h>
#include<fstream.h>
void main()
{
ifstream fin;
fin.open("MyFile.txt");
char c;
while( ! fin.eof())
{
fin >> c;
cout << c;
}
fin.close();
}
‫الكتابة في ملف! لماذا مصفوفة؟؟‬
#include<fstream>

int main()
{
     ofstream fout;
     fout.open("out.txt");
     char str[300]=“Welcome to C++ course.
Have a nice day.";
     fout<<str;
     fout.close();
     return 0;
}
‫كتابة أم قراءة من ملف؟‬
#include<fstream.h>
#include<conio.h>
int main()
{
     ifstream fin;
     fin.open("out.txt");
     char ch;
     while(!fin.eof())
     {
          fin.get(ch);
          cout<<ch;
     }
     fin.close();
}
‫ما عمل البرنامج التالي؟‬
#include<fstream.h>
#include<conio.h>
int main()
{
     ifstream fin;
     fin.open("out.txt");
     clrscr();
     char ch; int count=0;
     while(!fin.eof())
     {
          fin.get(ch);
          count++;
     }
     cout<<"Number of characters in file is "<<count;
     fin.close();
     getch();
     return 0;
}
‫بعض السئلة والتمارين حول الملفات‬
‫‪‬اكتب برنامجا لكتابة نصا في سطرين داخل ملف‬
‫‪ .example.txt‬موضحا كيفية فتح الملف للكتابة دون‬
‫مسح محتويات الملف إن كان موجودا من قبل‪.‬‬
‫‪‬اكتب برنامجا يقوم بقراءة محتويات الملف المذكور في‬
‫التمرين السابق وطباعة محتوياته على الشاشة‪ .‬وإن‬
‫كان الملف غير موجود فإنه يطبع رسالة تبين ذلك‪.‬‬
‫‪‬اكتب برنامجا لحساب حجم الملف ‪example.txt‬‬

‫المصدر‪ :‬الدليل العملي للمقرر‬


‫انتهى اللقاء‬
‫مع أطيب التمنيات للجميع بالنجاح والتوفيق‬
‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬
‫مقرر برمجة)‪1291 (1‬‬

‫لقاء إفتراضي بعنوان‬


‫مراجعة ومناقشة أسئلة امتحانات لمادة المتحان النهائي‬
‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى أسعد ‪ /‬منسق المقرر‬
‫فرع رام ال والبيرة‬

‫الخميس ‪3/12/2015‬‬
‫مواضيع اللقاء‬

‫يحتوي اللقاء على مناقشة أسئلة وردت في‬


‫امتحانات نهائية لسنوات سابقة‪.‬‬
‫السؤال الول‪ :‬أجب بنعم أو ل على السئلة التالية واضعا الجابة في‬
‫الجدول رقم )‪ (1‬في دفتر الجابة‪.‬‬
‫‪ .1‬البرمجة الكينونية )‪ (OOP‬هي التي تستخدم الجراءات )‪ (Procedures‬أساسا في عملية البرمجة‪.‬‬
‫‪ .2‬التصميم الكينوني هو التصميم الذي يستند إلى أساسيات البرمجة الكينونية ويستخدم أساسا‬
‫لتصميم النظام‪.‬‬
‫‪ .3‬يمكن استدعاء حقول التراكيب ‪ struct‬مباشرة دون تعريف متغير من نوع تلك التراكيب‪.‬‬
‫‪ .4‬المحدد الصديق يتيح التعامل مع المتغيرات المنتمية والدوال المنتمية من خلل جميع الصناف‬
‫الخرى‪.‬‬
‫‪ .5‬البناء )‪ (constructor‬هو دالة منتمية للصنف يمكن استدعاءه تلقائيا عند إنشاء كائن من ذلك‬
‫الصنف‪.‬‬
‫‪ .6‬حجز الذاكرة بطريقة ديناميكية يتم أثناء التنفيذ‪.‬‬
‫‪ .7‬يمثل الرمز "‪ "\0‬نهاية السلسلة الرمزية‪.‬‬
‫‪ .8‬يستخدم الرمز &‪ A‬للدللة على تمرير قيم المتغير ‪.A‬‬
‫‪ .9‬ميزات الدوال القالبية بأنها تسمح بإعادة استخدام البرامج ‪.‬‬
‫‪ .10‬الصنف المشتق له القدرة على استدعاء جميع المتغيرات في الصنف الساس ‪.‬‬
‫‪ .11‬تعدد الوجه )‪ (polymorphism‬يمنحنا القدرة على تأجيل هوة الدالة المراد استدعاؤها من وقت‬
‫الترجمة إلى وقت التنفيذ‬
‫صحيح‪.‬مؤشر ب‬ ‫تعرف على‬‫أن ‪P‬‬ ‫‪Int*P .12‬‬

‫الفرع‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫‪9‬‬ ‫‪10 11 12‬‬
‫الصحيح‬ ‫ل‬ ‫نع‬ ‫ل‬ ‫ل‬ ‫نع‬ ‫نع‬ ‫نع‬ ‫ل‬ ‫نع‬ ‫نع نع ل‬
‫ه‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬
‫اختر رمز الجابة الصحيحة وضعه في الجدول‬
‫رقم ‪ 2‬في دفتر الجابة‪.‬‬
‫‪ (1‬إذا سبق اسم الصنف الساس بالكلمة ‪ ,protected‬فهذا يعني بأن الوراثة هي وراثة‪............‬‬
‫د‪ -‬مجردة‪.‬‬ ‫ج‪ -‬خاصة‪.‬‬ ‫ب ‪ -‬عامة ‪.‬‬ ‫أ ‪ -‬محمية‬

‫‪ (2‬تعريف أكثر من دالة تحت السم نفسه يسمى ‪:‬‬


‫د‪implement -‬‬ ‫ج‪overloading -‬‬ ‫ب‪overriding-‬‬ ‫أ‪Protected -‬‬
‫‪ ‬‬
‫‪ (3‬جملة ‪ .............‬تستخدم لحجز الكائنات في الذاكرة‪.‬‬
‫د‪expand-‬‬ ‫ج‪* -‬‬ ‫ب‪delete -‬‬ ‫أ‪new -‬‬

‫‪ (4‬دالة منتمية تستخدم لعادة وضع مؤشر بداية القراءة عند رقم بايت معين في الملف‪:‬‬
‫د‪seek-‬‬ ‫ج‪seekg -‬‬ ‫ب‪seekp-‬‬ ‫أ‪Beg-‬‬

‫‪ (5‬الكائن ‪ ios::in‬يمثل نمط فتح الملف‪:‬‬


‫د‪ -‬القراءة والكتابة‪.‬‬ ‫ج‪ -‬للتحديث‪.‬‬ ‫ب‪ -‬للكتابة‪.‬‬ ‫أ ‪ -‬للقراءة ‪.‬‬
‫‪ ‬‬
‫‪ (6‬طريقة استدعاء الدالة التالية)‪ void swap(int*x,int*y‬من البرنامج الرئيس هي‪:‬‬
‫د‪swap(*a,*b) -‬‬ ‫ج‪swap(a,b)-‬‬ ‫ب‪swap(&a,&b)-‬‬ ‫أ‪swap(int*a,int*b) -‬‬
‫الفرع‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬
‫‪ ‬‬ ‫الصحيحه‬ ‫أ‬ ‫ج‬ ‫أ‬ ‫ج‬ ‫أ‬ ‫ب‬
‫‪ ‬‬
‫سؤال ‪ : :‬وضح الفرق بين دالة ‪ seekg‬و دالة‬
‫‪ 6 ) .seekp‬علمات ‪ 3‬علمات لكل نقطة(‬
‫الجابة‪:‬‬
‫الملف‪ :.‬تستخدم لتحديد موق‬ ‫• ‪Seekg‬‬
‫الملف‪.‬تستخدم لتحديد موقع تخز‬
‫‪:‬‬ ‫• ‪Seekp‬‬

‫سؤال‪ :‬وضح الحالت التي يفضل فيها استخدام الدوال الصديقة‬


‫) ‪ 6‬علمات علمتان لكل نقطة(‬
‫الجابة‪:‬‬
‫• إذا كانت الدالة تحتاج لعاملين أو أكثر وخصوصا إذا انتمى كل منهما إلى صنف مختلف‪.‬‬
‫إذا أردنا تحميل الدالة أكثر من تعريف بحيث تتحدد الدالة التي نود استخدامها من خلل عدد من‬ ‫•‬
‫العوامل ونوعها‪.‬‬
‫• قدرة الدوال الصديقة الوصول إلى المتغيرات المنتمية الخاصة في الصنف‪.‬‬
‫ ثم‬,‫ والتي تعيد اكبر كائن من الكائنين الممررين إليها‬GetMax ‫ اكتب قالبا للدالة‬:‫سؤال‬
‫ ومرة أخرى لتقارن عددين من‬, ‫ مرة لمقارنة عددين صحيحين‬, ‫استدع هذه الدالة مرتين‬
( ‫ علمات‬10 ) .float ‫نوع‬

1. // function template
2. #include <iostream>
3. #include <conio.h>
4. template <class S>
5. S GetMax (S a, S b) {
6. S result;
7. return ( result = (a>b)? a : b );
8. }
9. int main () {
10.int i=5, j=6, k;
11.float l=10.0, m=5.0, n;
12.k=GetMax<int>(i,j);
13.n=GetMax<float>(l,m);
14.cout << k << "\n" << n << endl;
15.getch();
16.}
‫أ – اكتب المقطع البرمجي اللزم لفتح الملف ‪ student.dat‬في‬
‫أسلوب الملف التتابعي للقراءة منه‪ 4 ) .‬علمات(‬

‫• الجابة‪:‬‬
‫‪ifstream instudent‬‬
‫;)‪file("student.dat",ios::in‬‬
‫• توفر لغة ‪ ++c‬ثلثة أنواع من الوراثة‪ ،‬ومن هذه النواع الوراثة العامة‬
‫‪ .Public Inheritance‬وضح مستوى الوصول للعناصر المورثة في هذا‬
‫النوع‪ 6) .‬علمات( ص‪225‬‬

‫الجابة‪:‬‬
‫‪ -‬المحمي ‪ protected‬في صنف الساس يصبح محمي في الصنف المشتق‬
‫‪ -‬العام ‪ public‬في صنف الساس يصبح عاما في الصنف المشتق‬
‫‪ -‬الخاص ‪ private‬ل يورث أبدا‬
‫يمنحنا مفهوم تعدد الوجه ميزتين مهمتين وضحهما‪4) .‬‬
‫علمات( ص‪249‬‬

‫الجابة‪:‬‬
‫– تأجيل تحديد هوية الدالة المراد استدعائها من وقت الترجمة إلى وقت‬
‫تنفيذ البرنامج‬
‫– وضع عنوان كائن من صنف مشتق في متغير مؤشر معرف على انه‬
‫مؤشر للصنف الساس‬
(‫ دار النشر‬،‫ المؤلف‬،‫ عنوان الكتاب‬،‫اكتب برنامج يقوم بقراءة بيانات الكتاب )الرقم‬
303‫ علمات( ص‬10) .‫ ثم يطبعها على الشاشة‬Books.txt ‫من ملف تتابعي اسمه‬
:‫الجابة‬
1.#include <iostream.h>
2.#include <fstream.h>
3.#include <stdlib.h>
4.int main()
5.{
6.int bNum;
7.char title[30];
8.char author[30];
9.char publisher[30];
10.
 
11.
ifstream inBooks("Books.txt",ios::in);
12.
if (!inBooks)
13.
{cerr<<"File not opened"<<endl;
14.
exit(1);
15.
}
16.
cout<<"Book number, Title, Author, Publisher"<<endl;
17.
while(inBooks >>bNum>>title>>author>>publisher)
18.
{
19.
cout<< bNum<<" "<< title <<" "<< author <<" << publisher <<endl;
20.
}
21.
inBooks.close();
22.
return 0;
23.
}
‫ كتابة في ملف ثم القراءة منه‬:‫مثال‬
1. #include <fstream>
2. #include <iostream>
string lineText;
3. #include <conio.h> getline(infile,lineText); 
4. using namespace std;
5. int main ()
6. {
7. char data[100];
8. // open a file in write mode.
9. ofstream outfile;
10. outfile.open("c:\\newcpp\\mydata.txt",ios::app);
11. string name;
12. cout<<"enter your name: ";
13. cin>>name;
14. outfile<<"\nHello! "<<name<<endl;
15. outfile.close();
16. // now we will read from that file
17. cout<<"\n\n the file has the following data:\n";
18. ifstream infile;
19. infile.open("c:\\newcpp\\mydata.txt"); //file name with path
20. while(!infile.eof()) //while not end of file
21. {
22. char c; 
23. infile>>c; //read the current character and put it into c
24. cout<<c<<endl; //print each character in a separate line.
25. }
26. }
‫اكتب دالة قالبية لتبديل قيم متغيرين بغض النظر عن نوعهما )مثل‪ :‬إذا أدخلنا قيمة‬
‫‪ x=2‬و ‪ y=7‬تصبح ‪ x=7‬و ‪ 5) (y=2‬علمات( ص‪236‬‬

‫الجابة‪:‬‬
‫)‪Template<class T> void swap(T& x, T& y‬‬
‫;‪{T temp‬‬
‫;‪temp=x‬‬
‫;‪x=y‬‬
‫};‪y=temp‬‬
‫أجب بنعم او ل‬
‫‪ .1‬الدالة الصديقة لصنف ما يمكنها معالجة القسم الخاص لذلك الصنف‪162.‬‬
‫‪ .2‬نستخدم الكلمة المفتاحية ‪ const‬إذا أردنا تمرير المعاملت كمرجع مع عدم‬
‫السماح للدالة تغيير قيمة المعامل‪181.‬‬
‫‪ .3‬الصنف المشتق هو الصنف الذي يرث خصائص وعمليات الصنف الساس‪.‬‬
‫‪214‬‬
‫‪ .4‬يمكننا التنظيم العشوائي للملفات من الوصول إلى السجل المطلوب‬
‫مباشرة دون المرور بالسجلت التي تسبقه‪298 .‬‬
‫‪ .5‬تحديث الملفات التتابعية أسهل بكثير من تحديث الملفات العشوائية‪315.‬‬

‫الفرع‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬


‫الصحيحة‬ ‫نعم‬ ‫نعم‬ ‫نعم‬ ‫نعم‬ ‫ل‬
‫أجب بنعم أو ل‬
‫سطر الملحظات يبدأ بــ ‪.*/‬وينتهي بنهاية السطر‬ ‫‪.1‬‬
‫الجملة )*‪ ;x=5.(p‬تختلف عن الجملة ‪.;p->x=5‬‬ ‫‪.2‬‬
‫مؤشري كائن‬ ‫على‬‫التالية اعتبار ;‪e‬‬
‫‪e.id=15001‬‬
‫صحيحة ;فان الجملة‬ ‫‪Emp *e .3‬‬
‫ليمكن الوصول للمتغيرات من خارج الصنف الى المتغيرات التي لم يتم تحديد‬ ‫‪.4‬‬
‫طريقة الوصول في الصنف ‪.‬‬
‫العلقة بين الصناف الصديقة ليست تبادلية‪.‬‬ ‫‪.5‬‬
‫يمرر بصورة تلقائيا مؤشر يدعى ‪ this‬عند استدعاء في حالة استدعاء الدالة‬ ‫‪.6‬‬
‫المنتمية‪.‬‬
‫‪ .7‬الدالة الثابته المنتمية لصنف تستطيع تعديل قيم المتغيرات المنتمية لنفس الصنف‪.‬‬
‫طريقة استدعاء الدالة الصديقة المنتمية نفس طريقة استدعاء الدالة المنتمية‪.‬‬ ‫‪.8‬‬
‫المتغير ‪ number‬مماثل للمتغير ‪ numBer‬في لغة ‪.++C‬‬ ‫‪.9‬‬
‫لغة ‪ ++C‬تعتمد على مفاهيم ‪.Object Oriented‬‬ ‫‪.10‬‬
‫الفرع‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫‪9‬‬ ‫‪10‬‬
‫الجابة‬ ‫ل‬ ‫ل‬ ‫ل‬ ‫نعم‬ ‫نعم‬ ‫نعم‬ ‫ل‬ ‫ل‬ ‫ل‬ ‫نعم‬
‫} { ‪ public class Test‬حالة البناء الصحيحة لـ )‪1‬‬ ‫‪:‬هي‬
‫}‪(A Test(int x ){….‬‬ ‫}……{)‪(B Test(char c‬‬

‫}‪(C Test( ){…..‬‬ ‫جميع ما ذكر صحيح ‪(D‬‬

‫‪:‬تساعد على مايلي ‪2) DBMS‬‬


‫انشاء قاعدة البيانات ‪(A‬‬ ‫معالجة البيانات ‪(B‬‬

‫ادارة قاعدة البيانات ‪(C‬‬ ‫جميع ما ذكر ‪(D‬‬


‫‪:‬أي من العبرات التالية صحيحة )‪3‬‬
‫الصنف الاساس ييرورث الخصائص الى الصنف المشتق ‪(A‬‬ ‫الصنف الاساس ييرورث العمليات الى الصنف المشتق ‪(B‬‬

‫الصنف الاساس ييرورث الخصائص والعمليات الى الصنف المشتق ‪(C‬‬ ‫ليس مما ذكر ‪(D‬‬

‫‪ c++ :‬الدالة في لغة )‪4‬‬


‫يمكن تكرار نفس الاسم للدالة مع تساوي عدد المعاملت واختل ف نروعها ‪(A‬‬ ‫يمكن تكرار نفس الاسم للدالة مع اختل ف عدد المعاملت وعدم اختل ف نروعها ‪(B‬‬
‫كتابة الدوال باسماء مختلفة مع تساوي عدد المعاملت ونوعها ‪(C‬‬ ‫‪.‬جميع ما ذكر صحيح ‪(D‬‬

‫‪:‬هي ‪ C++‬في لغة )‪ (reserved word‬الكلمة المحجوزة )‪5‬‬


‫‪(A Method‬‬ ‫‪(B Subclasses‬‬

‫‪(C Array‬‬ ‫‪(D class‬‬

‫‪:‬تظهر ;} ‪ class S: public Emp, public Stu{ …..‬الجملة)‪6‬‬


‫تعدد المستويات الوراثة ‪(A‬‬ ‫‪.‬وراثة مفردة ‪(B‬‬

‫وراثة متعددة ‪(C‬‬ ‫‪.‬جميع ما ذكر‪(D.‬‬

‫‪ Recursion:‬مفهوم الستدعاء الذاتي )‪7‬‬


‫‪ c‬هذا المفهوم متوفر في لغة ‪(A‬‬ ‫‪ c++.‬هذا المفهوم متوفر في لغة‪(B‬‬

‫‪ Java‬هذا المفهوم متوفر في لغة ‪(C‬‬ ‫‪.‬جميع ما ذكر‪(D.‬‬

‫‪:‬في الوراثة )‪ (private‬الخاص )‪8‬‬


‫يورث ‪(A‬‬ ‫ليورث‪(B‬‬
‫الفرع‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫‪9‬‬ ‫‪10‬‬
‫الجابة ‪.‬غير موجود في مفاهيم الوراثة ‪(C‬‬ ‫‪D‬‬ ‫‪D‬‬ ‫‪C‬‬ ‫ذكر‪D (D.‬‬
‫‪.‬جميع ما ‪D‬‬
‫‪C‬‬ ‫‪D‬‬ ‫‪B‬‬ ‫‪B‬‬ ‫‪B‬‬
‫عرف دالة قالبية اسمها ‪ power‬ولها معامل واحد )‪,(y‬حيث تعمل هذه الدالة‬
‫حساب قيمه حاصل تربيع ‪, y‬وبين أيضا طريقة استدعائها من داخل الدالة‬
‫الرئيسية ‪ ( )main‬؟ )‪ 12‬علمات(‬

‫)‪Template <class T> int power(T y‬‬


‫} ;‪{ return y*y‬‬
‫) ( ‪main‬‬
‫{‬
‫;‪int z=5‬‬
‫;)‪cout<< power(z‬‬
‫}‬
‫ علمة‬13 c++: ‫اكتب ما يقابل الشكل التالي بلغة‬-2
Person

Employee Student

Manager

class Person {};


class Employee: public Person {};
class Student: public Person {};
class Manager: public Employee {};
‫( اكتب برنامج لتخزين نص في سطرين في ملف‬
‫ علمة‬12 :‫نصي‬
• // writing on a text file
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream myfile ("example.txt");
if (myfile.is_open())
{
myfile << "This is a line.\n";
myfile << "This is another line.\n";
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
•  
• This is a line.
This is another line.
‫ علمة‬13.‫اعد كتابة البرنامج لعرض محتوى الملف النصي السابق‬

• // reading a text file


#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open()){
while (! myfile.eof() ) {
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
‫ما المقصود بالهيمنة ‪overriding‬؟‬
‫اعط مثال يوضح ذلك؟‬
‫ما المقصود بالهيمنة ‪overriding‬؟ اعط مثال يوضح‬
‫ذلك؟‬

‫تعريف دالة في الصنف المشتق تكون مشابهة تماما لدالة في الصنف‬


‫الب )الساس( دون ان تختلف في نوع أو عدد معاملتها‪ .‬مثال‪:‬‬
‫…‬
‫{‪Class Base‬‬
‫};”‪void print( ) {cout<<“Base Class‬‬
‫}‬
‫{‪Class Derived:public Base‬‬
‫};”‪void print( ) { cout <<“Derived Class‬‬
‫…‬
‫انتهى اللقاء‬
‫• تمنياتي لكم بالنجاح والتوفيق في المتحان‬
‫النهائي‬
)1( ‫برمجة‬

AbdulRahman M.Baraka
2017
AbdulRahman M.Baraka (2017) 1
‫اشرح باختصار الخصائص االساسية للغات البرمجة الكينونية‬

‫• اخفاء المعلومات ‪:‬‬


‫• وضع متغيرات ودوال الكائن في مكان واحد بحيث ال تتمكن الكائنات االخرى‬
‫من الوصول اليھا‪.‬‬
‫• الوراثة ‪:‬‬
‫• اعادة استخدام كائنات معرفة سابقا وتعديلھا بما يتناسب مع متطلبات‬
‫البرنامج الجديد‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪2‬‬


#include<iostream.h>
struct employee{
int eno;
string ename;
float esalary;
};

int main(){
employee E1;
E1->eno=100;
E1->ename=”Mohamed”;
E1->esalary=1550;
return 0;
} AbdulRahman M.Baraka (2017) 3
‫ال تنسى الصيغة العامة للدالة‪::‬‬

‫نوع القيمة المرجعة‬ ‫} { ( المعامالت أو المدخالت ) اسم الدالة‬

‫‪Void‬‬ ‫إذا كانت الدالة بحاجة إلى تمرير‬


‫‪int, string…..‬‬
‫إذا لم ترجع قيمة‬ ‫معامالت فإنھا تكتب هنا‪.‬‬
‫حسب نوع القيمة المرجع‬
‫ويجب استخدام الكلمة ‪return‬‬ ‫وإذا لم تكن بحاجة فإنھا تترك فارغة‬
‫داخل الدالة‬

‫أمثلة‪:‬‬
‫} { )‪int getNumber ( string name‬‬
‫مالحظة هاااامة‪:‬‬ ‫} { )‪void printName (int Number‬‬
‫البناء والھداء هما الدالتان اللتان ال‬ ‫} { ) (‪string getName‬‬
‫يكتب في بدايتھما نوع القيمة‬
‫} { ) (‪void printReport‬‬
‫المرجعة‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪4‬‬


int mult(int x)
{return x*x;}

int mult (int x,int y)


{return x*y;}

AbdulRahman M.Baraka (2017) 5


‫أكتب دالة تحسب تقدير قيمة من نوع عدد صحيح ثم ترجع هذه القيمة‪ .‬التقديرات‬
‫كما يلي‪:‬‬
‫‪ :100-90‬يرجع التقدير ‪A‬‬
‫‪ | 80-89:‬يرجع التقدير ‪B‬‬
‫‪ | 70-79:‬يرجع التقدير ‪C‬‬
‫‪ | 60-69:‬يرجع التقدير ‪D‬‬
‫{)‪char result(int a‬‬ ‫‪50-59:‬يرجع التقدير ‪E‬‬
‫غير ذلك‪ :‬يرجع التقدير ‪F‬‬
‫;’‪if(a>=90 && a<=100) return ‘A‬‬
‫;’‪else if(a>=80 && a<=89) return ‘B‬‬
‫;’‪else if(a>=70 && a<=79) return ‘C‬‬
‫;’‪else if(a>=60 && a<=69) return ‘D‬‬
‫;’‪else if(a>=50 && a<=59) return ‘E‬‬
‫;’‪else return ‘F‬‬
‫}‬
‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪6‬‬
class CAT {
int Age;
int Weight;
public:
CAT() {cin>>Age>>Weight;}
void display) ({cout<<Age<<”\t”<< Weight<<endl;}
};

void main()
{ CAT c[30];}

AbdulRahman M.Baraka (2017) 7


‫البرنامج التالي مكتوب بلغة سي‪ ++‬وهو برنامج متكامل ‪ ,‬بين االخطاء الموجودة فيه ثم صححھا‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪8‬‬


‫البرنامج التالي مكتوب بلغة سي‪ ++‬وهو برنامج متكامل ‪ ,‬بين االخطاء الموجودة فيه ثم صححھا‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪9‬‬


‫ال تنسى‪:‬‬

‫تمرير = في المعامالت‪.‬‬
‫ادخال أو قراءة = ‪cin‬‬
‫ارجاع = ‪return‬‬
‫طباعة = ‪cout‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪10‬‬


‫ عالمات وبناء يقوم‬10 ‫عرف صنف الطالب والذي يحتوي على مصفوفة مكونة من‬
‫بادخال العالمات ودالة تقوم بارجاع أعلى عالمة موجودة ودالة تقوم بالبحث عن‬
.‫) اذا تم العثور عليھا‬found( ‫عالمة داخل المصفوفة وطباعة‬
.‫قم بانشاء كائن من الصنف واستدعي كافة الدوال‬
class Student{
int marks[30];
void search(int m){
public:
for(int i=0; i<10;i++)
student(){
if(marks[i]==m)
for(int i=0; i<10;i++)
cout<<“found”;}
cin>>marks[i];}
};
int getMax(){
void main(){
int max=mark[0];
Student s;
for(int i=0; i<10;i++)
cout<<s.getMax();
if(marks[i]>max)
s.search(88);
max=marks[i];
return max;}
AbdulRahman M.Baraka (2017) 11
:‫ما هو ناتج تنفيذ البرنامج التالي‬
int x=70;
int *y= &x;
cout<< x<<endl;
cout<< *y<<endl;
*y=20;
cout<< x<<endl;
cout<< *y<<endl;

:‫الحل‬
70
70
20
20

AbdulRahman M.Baraka (2017) 12


‫‪ (1‬اكتب الصنف كتاب ‪ Book‬بحيث يحتوي على مايلي‪:‬‬
‫المتغيرات المنتميه‪:‬‬
‫أسم الكتاب ‪( title‬مصفوفة من ‪ 30‬حرف)‬
‫سعر الكتاب ‪ ( price‬عدد حقيقي )‬
‫الدوال المنتمية‪:‬‬
‫ــ دالة بناء (‪ )Constructor‬إلعطاء قيم ابتدائية إلسم الكتاب (‪ , )title‬السعر (‪)price‬‬
‫ــ دالة بأسم ‪ setName‬لتغيير اسم الكتاب‬
‫ــ داله بأسم ‪ getName‬والتي تعمل على ارجاع اسم الكتاب‬
‫ــ دالة بأسم ‪ increasePrice‬لزيادة سعر الكتاب‬
‫ــ دالة بأسم ‪ print‬لطباعة بيانات الكتاب (أالسم والسعر)‬
‫مالحظة ‪ :‬الوصول للمتغيرات المنتمية للصنف ‪ Book‬يتم عن طريق الدوال المنتميه له فقط‬
‫‪ (2‬اكتب الدالة الرئيسية ‪ main‬وع ّرف كائن بأسم ‪ myBook‬من الصنف ‪ Book‬الذي تم انشاءه في الفرع األول‬
‫من السؤال‪ ،‬ثم ع ّرف مؤشر بأسم ‪ myPtr‬يؤشر على الكائن ‪ myBook‬واستخدم هذا المؤشر إلستدعاء‬
‫الدالة ‪ setName‬والدالة ‪ increasePrice‬والدالة ‪ getName‬والدالة ‪print‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪13‬‬


class Book{
char title[30];
float price;
public:
Book(char t[],float salary)
{ strcpy(title,t); price=salary; }
void setName(char t[])
{ strcpy(title,t); }
char *getName()
{ return title; }
void increasePrice(float pr)
{ price+= pr; }
void print()
{ cout<<title<<" "<<price; }};
main(){
Book myBook("c++",30);
Book *myPtr=&myBook;
myPtr->setName("java");
myPtr-> increasePrice(10.0);
cout<<myPtr->getName()<<"\n";
AbdulRahman M.Baraka (2017) 14
myPtr->print(); }
‫تعد االصناف (‪ )Classes‬مصنعا للكائنات (‪.)Objects‬‬ ‫‪.1‬‬
‫كل كائن (‪ )Object‬له خصائص وليس له عمليات‪.‬‬ ‫‪.2‬‬
‫التركيب (‪ )structure‬يحتوي على مجموعة من الحقول والعمليات‪.‬‬ ‫‪.3‬‬
‫عادة ما يرجع الھدام (‪ )Destructor‬القيمة صفر‪.‬‬ ‫‪.4‬‬
‫يعتبر البناء من الدوال المنتمية ويمكن استخدام القيم التلقائية لعواملھا‪.‬‬ ‫‪.5‬‬
‫الكائن (‪ )cin‬و الكائن (‪ )cout‬من الصنف (‪.)istream‬‬ ‫‪.6‬‬
‫ال يمكن حجز المصفوفات بطريقة ديناميكية‪.‬‬ ‫‪.7‬‬
‫إن عملية إضافة عقدة في القوائم المتصلة بحاجة لعملية إزاحة للبيانات‪.‬‬ ‫‪.8‬‬
‫يمكن ان يحتوي الصنف على اكثر من بناء ولكن يجب أن ال يحتوي على أكثر من هدام‪.‬‬ ‫‪.9‬‬
‫عند عدم تحديد نوع القسم في الصنف‪,‬خاصا ً أو عاما ً أو محمياً‪ ,‬تعد ‪ C++‬تلقائيا ً ذلك القسم خاصا ً ‪private‬‬ ‫‪.10‬‬

‫‪10 9 8‬‬ ‫‪7‬‬ ‫‪6 5 4‬‬ ‫‪3‬‬ ‫‪2 1‬‬


‫ال نعم نعم‬ ‫ال‬ ‫ال نعم ال‬ ‫ال‬ ‫نعم ال‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪15‬‬


: )1
. )b . )a
. )d . )c
: )2
Destructor )b Constructor )a
)d inline function )c
: ) ( )3
Array )b Class )a
main )d Structure )c
: )4
Protected )b Private )a
Public )d Friend )c
: )void method1(int x){}( )5
.)int( )b )int( )a
.)int(
. )d . )int( )c
: )6
Polymorphism. )b inheritance )a
Default Arguments. )d Overload )c

: )7
) Destructor ( )b ) Constructor ( )a
)d ) inline function ( )c
: )8
int f*; )b int f*=new int; )a
int *f=new int; )d int f; )c

AbdulRahman M.Baraka (2017) 16


‫تقسيم البرامج الكبيرة الى دوال اصغر حجما يستدعي بعضھا بعضا يقلل من الوقت والذاكرة الالزمين لتنفيذ‬ ‫‪.1‬‬
‫البرنامج‬
‫البرمجة الكينونية ) ‪ ( OOP‬هي البرمجة التي تستخدم الدوال )‪ (Functions‬اساسا ً لبناء البرامج‬ ‫‪.2‬‬
‫يمكن الوصول الى أي عقدة بالقائمة المتصلة بشكل مباشر أي بدون المرور على جميع العقد التي تسبقھا‬ ‫‪.3‬‬
‫األصناف ‪ Classes‬هي جزء من لغة ‪ C++‬وليست جزءاً من لغة ‪ C‬األصلية‬ ‫‪.4‬‬
‫يمكن القول ان البرنامج فعال إذا ُبني من مكونات يمكن االستفادة منھا في بناء برامج أخرى‬ ‫‪.5‬‬
‫العوامل التلقائية للدالة ُتستخدم في حالة عدم تزويد الدالة بعوامل حقيقية عند استدعائھا‬ ‫‪.6‬‬
‫في لغة ‪C++‬ال نستطيع تعريف اكثر من كائن ( ‪( Object‬من الصنف الواحد‬ ‫‪.7‬‬
‫تمكننا لغة ‪ C++‬من تعريف أكثر من هدام ) ‪( Destructor‬للصنف بأعداد وأنواع مختلفة من العوامل‬ ‫‪.8‬‬
‫الصنف هو بمثابة القالب الذي على اساسه نستطيع استخراج أعضاء وكائنات تشترك في الصفات والسلوكيات‬ ‫‪.9‬‬
‫عند عدم تحديد نوع القسم في الصنف‪,‬خاصا ً أو عاما ً أو محمياً‪ ,‬تعد ‪ C++‬تلقائيا ً ذلك القسم خاصا ً ‪private‬‬ ‫‪.10‬‬

‫‪10 9‬‬ ‫‪8‬‬ ‫‪7 6‬‬ ‫‪5 4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫الفرع ‪1‬‬
‫نعم نعم‬ ‫ال‬ ‫نعم ال‬ ‫نعم ال‬ ‫ال‬ ‫ال‬ ‫ال‬ ‫ج‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪17‬‬


: )1
)Object( )b )Packages( )a
)d )Structures( )c
)2
:
public )b private )a
friend )d protected )c
)3
Destructor )b Constructor )a
)d inline function )c
: Employee )4
Employee *e; )b Employee e; )a
Employee *e=new Employee; )d Employee e=new Employee; )c
: )5
)b )a
)d )c
: 20 ‫بحجم‬
double )6
double d[ ]=new double[20]; )b double d[20]; )a
double *d[20]=new double; )d double *d=new double[20]; )c
strcpy )7
#include<string.h> )b #include<iomanip.h> )a
#include<iostream.h> )d #include<conio.h> )c

: )8
) Destructor ( )b ) Constructor ( )a
)d ) inline function ( )c
AbdulRahman M.Baraka (2017) 18
‫أكتب برنامج بلغة سي‪ ++‬باستخدام جملة الدوران ( )‪while‬لطباعة السلسلة‬
‫الرمزية " ")‪programming (1‬‬
‫حرفا حرفا وكل حرف على سطر مستقل مستخدما مفھوم المؤشر ‪p‬؟‬

‫{)(‪void main‬‬
‫;")‪char *p="computer programming (1‬‬
‫{)'‪while(*p != '\0‬‬
‫;"‪cout<<*p<<"\n‬‬
‫;‪p++‬‬
‫}‬
‫}‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪19‬‬


‫اذكر مع التوضيح محددات الوصول الى حقول الصنف؟‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪20‬‬


AbdulRahman M.Baraka (2017) 21
:W"I).l.l1 ~I
...........................
:(..J-'I...)\JJ\ ~..)
•••••••••••••••••••••••••••
2011/•• jg..I.J.?•.. :wb:i..'11 C=-a....)l:i
.t:..jii.&lI~~

.t:.~
"1 Ill" Jill J..:a.ilI ~ uw..~1
--'i~--
2011/2010
.11l...'i1 ~.lJ~.,,4+'i1 jiA.l~~~.,u....n.::.L..o~ ~l.h~.1
~'+'i\ jiA.l ~ ~ ~ ~ (~." 0) ~.".w.~ ~~ 4+'i1 j."...lJ J.;,...Jl r-IJ ~ .2
.4+'i1 jiA.l ~~." ~ ~ J.;,...Jl r-IJ ~ .3

(~18 ) . . .. :~Cl11 JI,.:,.JI


(wl....)\.c. 6) ~u.fol.¥~! ~~\ u.~jJ~..l~ w~ts...! ~jJ-I
(wl....)\.c. 8) ~(¥..#ll ~~I) ..l:l.l;JI ~~I y).....lJ (¥Iy:-.'ll ~~I) f':l~1 ~~I y).....l0M ";JAlI ~J-2
(wl....)\.c. 4) ~ul.i....:a'il i"1~1 ~ u~1 ~J -3

.int a[ 4] (jc. ~.)4c- ~I J max J compare ~ u-k- 'i ~ array 1"'"""4 class u .;c.-I
.a[4] ~~I ~"s.) JP.14..c:.~ i"fo ~max ~I ~1-2

IH 7
[
H 8 ["ml
node -
~

.~I ~ ~\\~I WWI (jc. ~:::u i"j)ll\ ~ftl ~LI


.~IWWI~I~~NodeJI~~'J~j)llIC++~~L2
.B JA 0.!y!.yJI 0MNode JI ~~'J ~j)llIC++ ~~1-3
.~I WWI ~~~Node JI ~~'J ~j)llIC++ ~ ~1-4
.B ~ y!.y~INode JI u1lJ~j)llIC++ ~ ~L5

1
~ W;l1.J.wa (.p ~i

(~i5 ) :~I Jly.JI


:~WlI JIJ.lli .)c. t..ijJ.:...;J ~ ~ ~12 w~ ~ 4j~.)c. t..ijJ.:...; t..i~\ salesperson i...li......:J1 uy::.
t..iJW.;:JIJw~\ 4j~~12Jw~\ ~~I~';:ll~: ~t..i~IJsalesperson ~1..:411 .a
.0
.t"~1 J)l.:.. ~~ 12J w~l ~ Jl;,.~1 ~ \..e.i:!..;.b we- .;:JIJgetsalesfromuser 4..l1.ll\ .b

w~\ 4j~,} ~ JSJ w~1 ~ ~ ~ 4J)\..:.. ~ .;:JIJsetsales 4..l1.ll\ .c

.~ 12 y..';:l w~1 t~ ~~ t".fo .;:JIJprintannualsales 4..l1.ll\ .d

(~15 )

(~.15 )

.~jlfill ~~I y).J t"\~4b b~\.ill J..,bJh 4..c.w) urw~L......~J ~C++ ~ ~1Jy' ~
:~WlI JIJ.llI.)c. t..ijJ.:...;J~1 t..i~..a.ll tjlll ~b Jh ~I W\~1 .)c. t..ijJ.:...; ~trian Ul.- uy::.
. wI ~\ ,} ~I~I ~ ~..,1 constructor ~ ~ 4..l\~ .1
.b J h ~ JS ~ Jl;,.~H t".fo 4..l\~ .2
.~t.......J\ ~ 4-bJ y~ 4..l1~ .3
.~t.......J\ ~4-bJ .4j,j4-:o~l..;il ~UI JIJ.ll1 ~lc..:i1...';:l wI..#> uy::. ~main ~y\ ~1Jy,l1 ~l

4.u.,i~1 ~I

2
‫‪Tv‬‬ ‫الدالة )‪:(setBrand‬‬ ‫•‬
‫تقوم بتغيير الماركة )‪ (Brand‬بقيمة المعامل ) ‪.(b‬‬ ‫•‬
‫‪;string Brand‬‬
‫الدالة )‪:(getBrand‬‬ ‫•‬
‫‪;int Size‬‬ ‫إرجاع الماركة )‪.(Brand‬‬ ‫•‬
‫‪;double Price‬‬ ‫الدالة )‪:(setSize‬‬ ‫•‬
‫•‬ ‫‪void setBrand(string‬‬ ‫تغيير الحجم )‪ (Size‬بقراءتها من لوحة المفاتيح‪.‬‬ ‫•‬
‫;)‪b‬‬ ‫الدالة )‪:(getSize‬‬ ‫•‬
‫•‬ ‫;)(‪string getBrand‬‬ ‫إرجاع الحجم )‪.(Size‬‬ ‫•‬
‫•‬ ‫;)(‪void setSize‬‬ ‫الدالة )‪:(setPrice‬‬ ‫•‬
‫تغيير السعر )‪ (Price‬بقيمة المعامل ) ‪.(p‬‬ ‫•‬
‫•‬ ‫;)(‪int getSize‬‬
‫الدالة )‪:(getPrice‬‬ ‫•‬
‫•‬ ‫‪void setPrice(double‬‬ ‫•‬
‫إرجاع السعر )‪.(Price‬‬
‫;)‪b‬‬
‫البناء )(‪:‬‬ ‫•‬
‫•‬ ‫;)(‪string getPrice‬‬ ‫تعيين قيم افتراضية لجميع المتغيرات‪.‬‬ ‫•‬
‫•‬ ‫;)(‪TV‬‬ ‫البناء )(‪:‬‬ ‫•‬
‫•‬ ‫‪TV(string b, int s,‬‬ ‫يقوم بإسناد القيم الممررة )‪ (arguments‬الى المتغيرات‪.‬‬ ‫•‬
‫;)‪double p‬‬ ‫الهدام يقوم بطباعة كلمة )‪.(Bye‬‬ ‫•‬
‫•‬ ‫;)(‪~TV‬‬ ‫الدالة )‪:(printInfo‬‬ ‫•‬
‫‪1‬‬
‫•‬ ‫;)(‪void printInfo‬‬
‫)‪AbdulRahman M.Baraka (2017‬‬
‫تقوم بطباعة قيم جميع المتغيرات على الشاشة‪.‬‬ ‫•‬
(1) ‫برمجة‬

‫الوحدة اللولى‬

AbdulRahman M.Baraka
2012
‫مفهوم البرمجة الكينونية‬
‫الكينون‪:‬‬ ‫‪‬‬

‫لوحدة برمجية لها استقللها‪.‬‬ ‫‪‬‬

‫مشتقة من الصنف‪.‬‬ ‫‪‬‬

‫تجسيد لشيء لواقعي يؤدي مهمة محددة‪.‬‬ ‫‪‬‬

‫يحتوي بياناته الخاصة به‪.‬‬ ‫‪‬‬

‫يحتوي على العمليات على تلك البيانات‪.‬‬ ‫‪‬‬

‫المزايا‪:‬‬ ‫‪‬‬

‫خصوصية المعلومات لواخفائها )‪Information Privacy and‬‬ ‫‪‬‬

‫‪.(Hiding‬‬
‫التوارث )‪.(Inheritance‬‬ ‫‪‬‬

‫الستعمال المتعدد )‪.(Polymorphism‬‬ ‫‪‬‬

‫استخدام الكينونات الديناميكية‪.‬‬ ‫‪‬‬


‫التحليل الكينوني‬
‫‪Object-Oriented Analysis‬‬
‫تحديد الكينونات‪.‬‬ ‫‪‬‬
‫الكتاب‬
‫تحديد خصائص الكينونات‪.‬‬ ‫‪‬‬
‫العنوان‬
‫تحديد العلقات بين الكينونات‪.‬‬ ‫‪‬‬
‫دار النشر‬
‫يعرف )‪ :(Knows‬المقرر – الطالب‪.‬‬ ‫‪‬‬
‫المؤلف‬
‫يكون )‪ :(Is‬الحاسوب‪ :‬ذاكرة لو معالج ‪...‬‬ ‫‪‬‬
‫‪ISBN‬‬ ‫يملك )‪ :(Has‬السرعة ‪ :‬القطار لو السيارة‪.‬‬ ‫‪‬‬

‫الاعارة‬ ‫تجميع الكينونات‪.‬‬ ‫‪‬‬


‫التصميم الكينوني‬
‫‪Object-Oriented Design‬‬
‫بناء العمليات‪.‬‬ ‫‪‬‬

‫تحديد المعاملت )‪.(Parameters‬‬ ‫‪‬‬

‫اختيار لغة البرمجة‪.‬‬ ‫‪‬‬

‫لغة كينونية‪.‬‬ ‫‪‬‬


‫البرمجة الكينونية‬
‫‪Object-Oriented‬‬
‫‪Programming‬‬
‫خصائص البرامج الجيدة‪:‬‬ ‫‪‬‬

‫أن يكون البرنامج صحيحا‪ :‬تنفيذ المهام بدون اخطاء‪.‬‬ ‫‪.1‬‬

‫فعال‪ :‬استغل ل امثل لمكونات الحاسوب‪.‬‬ ‫‪.2‬‬

‫قابل لعادة الستخدام‪ :‬يمكن الستفادة من مكوناته في برامج أخرى‪.‬‬ ‫‪.3‬‬

‫الخصائص الساسية للغات البرمجة الكينونية‪:‬‬ ‫‪‬‬

‫خصوصية المعلومات لوإخفائها )‪Information Privacy‬‬ ‫‪.1‬‬


‫‪.(and Hiding‬‬
‫التوارث )‪.(Inheritance‬‬ ‫‪.2‬‬

‫الستعمال المتعدد )‪.(Polymorphism‬‬ ‫‪.3‬‬


‫نهاية‬
‫الوحدة‬
)1( ‫برمجة‬

AbdulRahman M.Baraka
2017
AbdulRahman M.Baraka (2017) 1
AbdulRahman M.Baraka (2017) 2
.‫قالب عام نستنسخ منه كائنات تحمل نفس الصفات‬ •
.)Data Type( ‫يعتبر نوع بيانات‬ •
Member ( ‫) ودوال‬Member Variables( ‫يحتوي على متغيرات‬ •
.)Functions
class class_name
{
private:
variable declarations;//class
function declarations;//members
public:
variable declarations;//class
function declarations;//members
}

AbdulRahman M.Baraka (2017) 3


:‫قم بانشاء الصنف التالي‬ •
class time
{
private: Time
int hour;
int min;
Hour
int sec; Minute
public: Second
int gethour();
int getmin(); -Change Hour.
int getsec(); -Change Minute.
void sethour(int h);
void setmin(int m); -Change Second.
void setsec(int s);
;} -Get Hour,

AbdulRahman M.Baraka (2017)


Minute,
4
Second.
.‫تشبه الدوال العادية ولكن يجب تحديد الصنف مرتبطة به‬
void Class_name :: member_function_name{ }
Example:
class time
{
private:
int hour; void time::setsec(int h)
int min;
int sec;
{ … };
public:
int gethour();
int getmin();
int getsec();
void sethour(int h);
void setmin(int m);
void setsec(int s);
;}

AbdulRahman M.Baraka (2017) 5


.‫ هو أخذ نسخة من صنف معرف مسبقا‬:‫الكائن‬ •
:‫الصيغة العامة لتعريف الكائن‬ •

• Object declaration:
o class_name obj1;

o class_name obj2,obj3;

o class class_name{……}obj1,obj2,obj3;

AbdulRahman M.Baraka (2017) 6


‫خاص (‪:)Private‬‬ ‫•‬

‫ال يسمح بالتعامل معه إال اعضاء نفس الصنف (‪.)Class‬‬ ‫‪o‬‬

‫عام (‪:)Public‬‬ ‫•‬

‫مسموح بالتعامل معه مع جميع االصناف االخرى‪.‬‬ ‫‪o‬‬

‫صديق (‪:)Friend‬‬ ‫•‬

‫ال يسمح بالتعامل معه إال اعضاء نفس الصنف (‪ .)Class‬أو اعضاء الصنف‬ ‫‪o‬‬
‫الصديق معه‪.‬‬

‫محمي (‪:)Protected‬‬ ‫•‬

‫الصنف‬ ‫ال يسمح بالتعامل معه إال اعضاء نفس الصنف (‪ .)Class‬أو اعضاء‬
‫)‪AbdulRahman M.Baraka (2017‬‬
‫‪o‬‬ ‫‪7‬‬
‫دالة منتمية لصنف تحمل نفس اسم الصنف‪.‬‬ ‫•‬

‫ال يجوز أن ترجع أي قيمة‪.‬‬ ‫•‬

‫ال تبدأ ب (‪ )void‬وال بنوع بيانات‪.‬‬ ‫•‬

‫يمكن أن يكون هناك أكثر من بناء للصنف‪.‬‬ ‫•‬

‫تستدعى تلقائيا عند انشاء كائن من صنفها‪.‬‬ ‫•‬

‫اذا كان هناك معامالت لها فانه ال يجوز انشاء كائن من الصنف إال بتمرير قيمة لهذه‬ ‫•‬
‫المعامالت‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪8‬‬


person :: person()

age=20; height=170; weight=70;

AbdulRahman M.Baraka (2017) 9


class time
{
private:
int hour;
int min;
int sec;
public:
int gethour();
int getmin();
int getsec();
time(int h, int min, int sec);
void sethour(int h);
void setmin(int m);
void setsec(int s);
;}

AbdulRahman M.Baraka (2017) 10


‫دالة منتمية لصنف تحمل نفس اسمه ولكنها تبدأ باالشارة (~)‪.‬‬ ‫•‬

‫ال يجوز أن ترجع أي قيمة‪.‬‬ ‫•‬

‫ال يستقبل معامالت‪.‬‬ ‫•‬

‫ال يمكن أن يكون هناك أكثر من هدام للصنف‪.‬‬ ‫•‬

‫تستدعى تلقائيا عند االنتهاء استخدام الكائن‪.‬‬ ‫•‬


‫)(‪person ::~ person‬‬
‫{‬
‫}‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪11‬‬


‫وضع قيمة اولية للمعامالت‪.‬‬ ‫•‬

‫اذا تم االستدعاء بمعامالت جديدة يتم اعتمادها واال فانه يتم استخدام القيم االولية‪.‬‬ ‫•‬

‫ترتيب قيم اسناد المعامالت مهم جدا‪.‬‬ ‫•‬

‫•‬ ‫)‪int sum(int x, int y, int z=0‬‬

‫}‪{return x+y+z‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪13‬‬


‫ال يمكن ان يجري عبرها أي تعديل على متغير‪.‬‬ ‫•‬
‫ال تستدعي اال دالة منتمية ثابتة فقط‪.‬‬ ‫•‬
‫يمكن تعريفها باستخدام كلمة (‪ )const‬بعد اسم الدالة‪.‬‬ ‫•‬

‫•‬ ‫}{ ‪void test1() const‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪14‬‬


‫اسم الصنف‬

‫الخصائص‬
class Circle
{ ‫قيم اولية‬
private:
double radius;
public:
Circle() { radius = 0.0;}
Circle(int r)
{ radius = r;}

void setRadius(double r) ‫بناء‬


{radius = r;}
double getArea();
{ return radius * radius * (22.0/7);} ‫عمليات خاصة بالصنف‬
~Circle(){ cout<<“end”;}
};

‫هدام‬

AbdulRahman M.Baraka (2017) 15


‫استبدال جملة استدعاء الدالة بمجموعة الجمل المشكلة لجسم الدالة‪.‬‬ ‫•‬

‫طرق تعريفها‪:‬‬ ‫•‬


‫تعرف الدالة بشكل كامل داخل الصنف‪.‬‬ ‫‪.1‬‬

‫تضاف كلمة (‪ )inline‬في بداية الدالة‪(.‬منفصلة عن الصنف)‪.‬‬ ‫‪.2‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪16‬‬


class Circle ‫اسم الصنف‬
{
private:
double radius;
‫الخصائص‬
public:
Circle() { radius = 0.0;} ‫قيم اولية‬
Circle(int r);
void setRadius(double r){radius = r;}
double getDiameter(){ return radius *2;} ‫العمليات‬
double getArea();
double getCircumference();
};
Circle::Circle(int r)
{ ‫بناء‬
radius = r;
}
double Circle::getArea() ‫عمليات خاصة بالصنف‬
{
return radius * radius * (22.0/7);
}
double Circle:: getCircumference()
{
return 2 * radius * (22.0/7);
AbdulRahman M.Baraka (2017) 17
}
AbdulRahman M.Baraka (2017) 18
)1( ‫برمجة‬

AbdulRahman M.Baraka
2017
AbdulRahman M.Baraka (2017) 1
AbdulRahman M.Baraka (2017) 2
.‫• عند تعريف المتغير فإنه يتم اسناد قيمة له بحسب نوع بياناته‬
.)&( ‫• يمكن الوصول الى عنوان الذاكرة للمتغير من خالل العملية‬

Address Variable
(&) Name Value int x = 22;
1161 x 22
cout <<"Value of x:"<<x<<endl;
cout <<"Address of x:"<<&x<<endl;
1162
cout <<"Size of x:"<< sizeof(x)<<"byte"<<endl;
1163
1164
1165
…..

Value of x: 22
Address of x: 1161
Size of x: 4 byte

AbdulRahman M.Baraka (2017) 3


..)*( ‫• يمكن تعريف متغير يحتوي على عنوان (وليس قيمة) باستخدام‬

Address Variable
(&) Name Value int x = 22;
1161 x 22
cout <<"Value of x:" << x << endl;
cout << "Address of x:" << &x << endl;
1162 (*) p 1161
cout << "Size of x:" << sizeof(x) << endl;
1163 int *p= &x;
1164 cout << "Address of p:" << &p << endl;
1165 cout << "Value of p:" <<p<< endl;
cout << "Value of Value:" << *p << endl;
…..

Value of x: 22
Address of x: 1161
Size of x: 4 byte
Address of p: 1162
Value of p: 1161
Value of Value: 22
AbdulRahman M.Baraka (2017) 4
‫أنواع حجز الذاكرة‪:‬‬ ‫‪‬‬

‫‪ -1‬الستاتيكية‪:‬‬
‫يقوم مترجم اللغة بحجز الذاكرة لجميع المتغيرات عند ترجمة البرنامج‪.‬‬ ‫‪‬‬

‫تبقى الذاكرة محجوزة طوال فترة التنفيذ حتى وان لم تستخدم‪.‬‬ ‫‪‬‬

‫مثال‪int x; :‬‬ ‫‪‬‬

‫‪ -2‬الديناميكية‪:‬‬
‫يتم الحجز وقت تنفيذ البرنامج‪.‬‬ ‫‪‬‬

‫يتم حجز الذاكرة التي نحتاج لها فقط وقت التنفيذ‪.‬‬ ‫‪‬‬

‫استخدام للذاكرة بشكل أفضل‪.‬‬ ‫‪‬‬

‫يتم استخدام الذاكرة بالدالة (‪ )new‬وتحرر باستخدام (‪.)delete‬‬ ‫‪‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪5‬‬


.)new( ‫• يمكن تعريف متغير ديناميكي من خالل تعريف مؤشر وكلمة‬

Address Variable
Value int *q;
(&) Name
q = new int;
1210 (*) q 1211 *q = 23;
1211 23 cout << "Address of q:" << &q << endl;
1212 cout << "Value of q:" << q << endl;
1213
cout << "Value of Value:" << *q << endl;
1214
……

Address of q: 1210
Value of q: 1211
Value of Value: 23

AbdulRahman M.Baraka (2017) 6


.)new( ‫• يمكن تعريف متغير ديناميكي من خالل تعريف مؤشر وكلمة‬

Address Variable
Value int *q;
(&) Name
q = new int;
1210 (*) q 1211 *q = 23;
1211 25 *q=*q+2;
1212 cout << "Address of q:" << &q << endl;
1213
cout << "Value of q:" << q << endl;
cout << "Value of Value:" << *q << endl;
1214
……

Address of q: 1210
Value of q: 1211
Value of Value: 25

AbdulRahman M.Baraka (2017) 7


.)new( ‫• يمكن تعريف متغير ديناميكي من خالل تعريف مؤشر وكلمة‬

Address Variable
Value int *q;
(&) Name
q = new int;
1210 *q = 23;
1211 *q=*q+2;
1212 cout << "Address of q:" << &q << endl;
1213
cout << "Value of q:" << q << endl;
cout << "Value of Value:" << *q << endl;
1214
……
delete q;
Address of q: 1210
Value of q: 1211
Value of Value: 25

AbdulRahman M.Baraka (2017) 8


.)new( ‫• يمكن تعريف متغير ديناميكي من خالل تعريف مؤشر وكلمة‬
Address Variable
(&) Name Value

1210 (*) x 1213


1211 int *x = new int[3];
1212
for (int i = 0; i<3; i++)
1213 x[0] 50
x[i] = i + 50;
1214 x[1] 51
1215 x[2] 52 for (int i = 0; i < 3; i++) {
1216 cout << "Address :" << &x[i] << endl;
cout << "Value :" << x[i] << endl;
Address : 1213 }
Value : 50
Address : 1214
Value : 51
Address : 1215
Value : 52

AbdulRahman M.Baraka (2017) 9


.)new( ‫• يمكن تعريف متغير ديناميكي من خالل تعريف مؤشر وكلمة‬
Address Variable
(&) Name Value

1210
1211 int *x = new int[3];
1212
for (int i = 0; i<3; i++)
1213
x[i] = i + 50;
1214
1215 for (int i = 0; i < 3; i++) {
1216 cout << "Address :" << &x[i] << endl;
cout << "Value :" << x[i] << endl;
}

delete x;

AbdulRahman M.Baraka (2017) 10


:‫• ما هو ناتج تنفيذ البرنامج التالي‬
Address Variable
(&) Name Value

1210 int *q;


1211 int x;
q = new int;
1212
1213 x = 10;
1214 *q = 5;
1215 cout << x << "-" << *q << endl;
1216
q = &x;
cout << x << "-" << *q << endl;
10-5
10-10

AbdulRahman M.Baraka (2017) 11


AbdulRahman M.Baraka (2017) 12
class Student
‫مصفوفة من صنف الطالب‬
{ void main()
private: {
string name; Student s[5];
float Avg;
for (int i=0; i<5; i++)
float mark[3];
public: cout<<s[i].getAvg()<<endl;
string getName(); }
void ChangeName(string x);
double getAvg();
Student() ‫مصفوفة عالمات داخل الصنف‬
{ float sum;
for(int y=0;y<3;y++){
cout<<“Enter Student Name:”;
cin>>name;
cout<<"enter mark("<<y+1<<"):";
cin>>mark[y];
sum += mark[y];
}
Avg=sum/3;}
};

AbdulRahman M.Baraka (2017) 13


class Student ‫حجز ستاتيكي للذاكرة‬
{ void main()
private: {
string name; Student s[5];
float Avg;
for (int i=0; i<5; i++)
float mark[3];
public: cout<<s[i].getAvg()<<endl;
string getName(); ‫حجز ديناميكي لمصفوفة كائنات‬
void ChangeName(string x);
double getAvg(); Student *DA;
Student() DA = new Student[5];
{ float sum; for (int i=0; i<5; i++)
for(int y=0;y<3;y++){ cout<< DA[i].getAvg()<<endl;
cout<<“Enter Student Name:”;
cin>>name;
cout<<"enter mark("<<y+1<<"):"; ‫حجز ديناميكي لكائن‬
cin>>mark[y]; Student *d;
sum += mark[y]; d= new Student[5];
} cout<<d->getAvg()<<endl;
Avg=sum/3;}
};
}
AbdulRahman M.Baraka (2017) 14
class Student
{ void main()
private: {
string name; Student s[5];
float Avg;
for (int i=0; i<5; i++)
float mark[3];
public: cout<<s[i].getAvg()<<endl;
string getName();
void ChangeName(string x);
double getAvg(); Student *DA;
Student() DA = new Student[5];
{ float sum; for (int i=0; i<5; i++)
for(int y=0;y<3;y++){ cout<< DA[i].getAvg()<<endl;
cout<<“Enter Student Name:”;
cin>>name; ‫الحظ استخدام النقطة للوصول الى الدوال المنتمية عند التعامل مع‬
cout<<"enter mark("<<y+1<<"):"; .‫مصفوفة الكائنات المعرفة ديناميكيا‬
cin>>mark[y]; Student *d;
sum += mark[y]; d= new Student[5];
} cout<<d->getAvg()<<endl;
Avg=sum/3;}
}; ‫الحظ استخدام السهم للوصول الى الدوال المنتمية عند التعامل مع‬
.)‫الكائنات المعرفة ديناميكيا (ليس مصفوفة‬
}
AbdulRahman M.Baraka (2017) 15
.‫• إذا أردنا تمرير مصفوفة في المعامالت فإننا نمررها باستخدام المؤشر‬
#include "iostream" :‫ دالة تقوم بارجاع أعلى قيمة في مصفوفة‬:‫• مثال‬
using namespace std;

int getMax(int* m, int n){ // n is length of array


int max = m[0];
for (int i = 0; i<n; i++)
if (max < m[i])
max = m[i];
return max;}

void main(){
int x[3];
for (int i = 0; i < 3; i++)
cin >> x[i];
cout << getMax(x,3);
system("pause");
}

AbdulRahman M.Baraka (2017) 16


.‫• إذا أردنا تمرير مصفوفة في المعامالت فإننا نمررها باستخدام المؤشر‬
:‫• مثال البحث الثنائي‬
int bsearch(Student* st, int n , string sn)
{
int lo=0;
int hi=n-1;
while (lo<=hi)
{
int mid = (lo+hi)/2;
string r=st[mid].getName();
if(r==sn)
return mid;
else
if( sn>r) ( )‫الحظ أنه في الحروف حرف االلف أصغر من الباء‬
lo=mid+1;
else
hi=mid-1;
}
return -1; // not found
}

AbdulRahman M.Baraka (2017) 17


‫‪ ‬يجب أن تكون المصفوفة مرتبة تصاعديا‪.‬‬
‫‪ ‬نبحث عن الرقم ‪.11‬‬
‫‪ Step 1:‬‬
‫‪high‬‬
‫‪mid‬‬

‫‪4‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪11‬‬ ‫‪28‬‬

‫‪low‬‬
 Step 2:

high
mid

4 6 7 11 28

low
 Step 2:

high
mid

4 6 7 11 28

low
 Example: we
are given an
70
array of six
integers that 60

we want to 50
sort from 40
smallest to 30
largest
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
 Start by
finding the 70
smallest 60
entry. 50
40
30

20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
 Swap the
smallest 70
entry with 60
the first 50
entry. 40
30

20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
 Swap the
smallest 70
entry with 60
the first 50
entry. 40
30

20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
Sorted side Unsorted side

70
 Part of the 60
array is 50
now sorted. 40
30

20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
Sorted side Unsorted side

70
 Find the 60
smallest 50
element in 40
the 30
unsorted
20
side.
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
Sorted side Unsorted side

70
 Swap with 60
the front of
50
the unsorted
side. 40
30

20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
Sorted side Unsorted side

70
 We have 60
increased 50
the size of 40
the sorted 30
side by one
20
element.
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
Sorted side Unsorted side

70
60
50
40
30

20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
Sorted side Unsorted side

70
 The process 60
continues... 50
40
30

20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
 The process Sorted side Unsorted side
keeps adding one
70
more number to
the sorted side. 60
 The sorted side 50
has the smallest 40
numbers, 30
arranged from
20
small to large.
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
 We can stop Sorted side Unsorted side
when the
70
unsorted side has
just one number, 60
since that 50
number must be 40
the largest 30
number.
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
 The array is now
sorted.
70
 We repeatedly
60
selected the
smallest element, 50

and moved this 40


element to the 30
front of the
20
unsorted side.
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
‫‪ ‬اضافة عنصر الى مصفوفة مرتبة تصاعديا‪:‬‬
‫‪ ‬اضافة الرقم ‪:8‬‬

‫‪4‬‬ ‫‪6‬‬ ‫‪9‬‬ ‫‪11‬‬

‫‪ ‬حذف عنصر من مصفوفة مرتبة تصاعديا‪:‬‬


‫‪ ‬حذف العنصر ‪:8‬‬

‫‪4‬‬ ‫‪6‬‬ ‫‪8‬‬ ‫‪9‬‬ ‫‪11‬‬


‫‪NULL‬‬
‫‪Head‬‬

‫‪8‬‬

‫‪ ‬سلسلة من العقد المتصلة تمثل نوع واحد من البيانات‪.‬‬


‫‪ ‬تتكون كل عقدة من حقلين ‪:‬‬
‫حقل يحتوي على البيانات المخزنة به‪.‬‬ ‫‪‬‬
‫حقل يحتوي على عنوان العقدة التالية له‪ .‬أو القيمة (‪ )NULL‬اذا كانت اخر عقدة‪.‬‬ ‫‪‬‬
 :‫تعريف القائمة المتصلة‬
struct node
{
int data;
node* next;
};
Head
class linklist
{
private:
node* head;
public:
linklist(){head=NULL;}
.
. Head
void addNode(int n);
node* Search(int x);
};
head
void linklist::addNode(int n)
{
node* newNode= new node;
newlink->data=n;
newlink->next=head;
head=newlink; newNode n
}
void linklist::display()
{
node* current=head;
while(current != NULL)
{
cout<<current->data<<endl;
current=current->next;

}
6 8 10 12
head
node* linklist::Search(int x)
{
node* p=head;
while (p)
if (p->data==x)
return p;
else
p=p->next;

return NULL; 6 8 10 12
}
void linklist::addNode2(int n)
{
node* newNode= new node;
node* pre= NULL;
node* current=head;
while (current!=NULL && n < (*current)->data)
{
pre=current;
current=current->next; newNode n
}
newNode->data=n;
newNode->next=current;
pre->next=newNode;
} 6 8 10 12
Head Pre Current
void linklist::addNode3(int n)
{
node* newNode= new node;
newNode->data=n;
newNode->next=NULL; newNode

if (head==NULL)
head=newNode; n
else
{
node* _node= head;
while (_node->next!=NULL)
_node=_node->next;
6 8 10 12
_node->next=newNode;
} Head End
}
int linklist::DeleteNode(int n)
{
node* pre= NULL;
node* current=head;
while (current !=NULL && n != (*current)->data)
{
pre=current;
current=current->next;
}
if (current=NULL)
return 0;
if ((pre=NULL)
head =head->next;
else
6
pre->next=current->next; 8 10 12
delete current;
return 1; Head Pre Current
}
AbdulRahman M.Baraka (2017) 43
(1) ‫برمجة‬

‫الوحدة الرابعة‬
‫الدوال الصديقة والعمليات‬
Friend Functions &
Operators
AbdulRahman M.Baraka
2012
‫تمرير العوامل للدوال‬
Parameters Passing
‫( الى الدوال‬Parameters) ‫ يتم تمرير العوامل بالقيمة‬
‫( وأي تغيير على القيم داخل الدالة لا يغير القيم‬Function)
.‫للعوامل‬
Variab ‫الحقيقية‬Valu
Referen
les ce e
a 1214 10
b 1215 20
1216
1217
1218
int main() {
int a=10; 1219
int b=20; 1220
a:10
cout << “a: " << a << endl; b:20
cout << “b: " << b <<endl<<endl;
} Passing.cpp
‫تمرير العوامل للدوال‬
Parameters Passing
‫( الى الدوال‬Parameters) ‫ يتم تمرير العوامل بالقيمة‬
‫( وأي تغيير على القيم داخل الدالة ل يغير القيم‬Function)
.‫للعوامل‬
Variab ‫الحقيقية‬Valu
Referen
void swap1 (int x, int y) les ce e
{ a 1214 10
int z;
20 b 1215 20
z=x;
x=y; 10 x 1216 10
y=z;} y 1217 20
z 1218 10
int main() {
int a=10; 1219
int b=20; 1220
swap1(a,b); X:10
cout << “a: " << a << endl; Y:20
cout << “b: " << b <<endl<<endl;
} Passing.cpp
‫تمرير العوامل للدوال‬
Parameters Passing
.‫يمكن تمرير العوامل بالقيمة مع تغيير القيم الحقيقية للعوامل‬ 

Variab Referen Valu


void swap2 (int *x, int *y) les ce e
{ a 1214 10
int z;
121 B 1215 20
z=*x;
5
*x=*y;1214 x* 1216 1214
*y=z;} y* 1217 1215
Z 1218 10
int main() {
int a=10; 1219
int b=20; 1220
swap2(&a,&b); X:20
cout << “a: " << a << endl; Y:10
cout << “b: " << b <<endl<<endl;
} Passing.cpp
‫تمرير العوامل للدوال‬
Parameters Passing
.‫يمكن تمرير العوامل بالاشارة‬ 
.‫( ممن ثم يتم تغيير القيم الحقيقية للعوامل‬Reference)‫يتم ارسال‬ 
Variab Referen Valu
void swap3 (int &x, int &y) les ce e
{ a 1214 10
int z;
121 b 1215 20
z=x;
5
x=y; 1214 x 1214
y=z; y 1215
}
z 1218 10
int main() {
int a=10; 1219
int b=20; 1220
swap3(a,b); a:20
cout << “a: " << a << endl; b:10
cout << “b: " << b <<endl<<endl;
} Passing.cpp
‫تمرير العوامل للدوال‬
‫‪Parameters Passing‬‬
‫ل يمكن تمرير المصفوفة بالاشارة‪.‬‬ ‫‪‬‬

‫يتم التمرير بواسطة عنوان أول عنصر‪.‬‬ ‫‪‬‬


‫الدوال والنصناف الصديقة‬
‫& ‪Friend Functions‬‬
‫‪Classes‬‬
‫الدوال الصديقة يحق لها معالجة النصناف الخانصة بالصنف‬ ‫‪‬‬
‫)‪.(Private‬‬

‫تضاف كلمة )‪ (Friend‬للدالة وللصنف لتصبح الدالة نصديقة‬ ‫‪‬‬


‫للصنف‪.‬‬
‫تستدعى الدالة الصديقة بدون اضافة اسم الصنف قبلها‪.‬‬ ‫‪‬‬

‫مثال‪:‬‬ ‫‪‬‬
‫اذا كانت الدالة )‪ (Add‬هي دالة منتمية فإنها تستدعى كالتالي‬ ‫‪‬‬
‫)‪.(Calc.Add‬‬

‫اذا كانت الدالة )‪ (Add‬هي دالة نصديقة فإنها تستدعى كالتالي ))‪.(Add(C‬‬ ‫‪‬‬
‫‪Friends.cpp‬‬
‫الدوال والنصناف الصديقة‬
‫& ‪Friend Functions‬‬
‫‪Classes‬‬
‫الدوال الصديقة يحق لها معالجة النصناف الخانصة بالصنف‬ ‫‪‬‬
‫)‪.(Private‬‬

‫تضاف كلمة )‪ (Friend‬للدالة وللصنف لتصبح الدالة نصديقة‬ ‫‪‬‬


‫للصنف‪.‬‬
‫تستدعى الدالة الصديقة بدون اضافة اسم الصنف قبلها‪.‬‬ ‫‪‬‬

‫مثال‪:‬‬ ‫‪‬‬
‫اذا كانت الدالة )‪ (Add‬هي دالة منتمية فإنها تستدعى كالتالي‬ ‫‪‬‬
‫)‪.(Calc.Add‬‬

‫اذا كانت الدالة )‪ (Add‬هي دالة نصديقة فإنها تستدعى كالتالي ))‪.(Add(C‬‬ ‫‪‬‬
‫‪Friends.cpp‬‬
‫‪Function Overloading‬‬
‫تحميل الدوال‪.‬‬ ‫‪‬‬

‫استخدام نفس اسم الدالة مع تغيير نوع او عدد المعاملت‬ ‫‪‬‬


‫الخانصة بالدالة‪.‬‬
‫يمكن استخدامها في جميع الدوال ما عدا الدوال الهدامة‪.‬‬ ‫‪‬‬

‫ل يمكن تعريف أكثر من دالة لها نفس المعاملت ونفس القيمة‬ ‫‪‬‬
‫المرجعة‪.‬‬

‫‪Overloading.cp‬‬
‫نهاية‬
‫الوحدة‬
)1( ‫برمجة‬

AbdulRahman M.Baraka
2017
AbdulRahman M.Baraka (2017) 1
AbdulRahman M.Baraka (2017) 2
:‫هناك طريقتان للتمرير‬ •
:)By Value( ‫التمرير بالقيم‬ •
.‫يتم تمرير العوامل بالقيمة الى الدوال وأي تغيير على القيم داخل الدالة ال يغير القيم الحقيقية للعوامل‬ •

void swap1 (int x, int y) Memory


{ Reference Variable Name Value
int z;
z=x; 1214 a 10
x=y; 1215 b 20
y=z;} 1216 x 10
int main() { 1217 y 20
int a=10; 1218 z 10
int b=20;
……
swap1(a,b);
cout << “a: " << a << endl;
cout << “b: " << b <<endl; a:10
} b:20

AbdulRahman M.Baraka (2017) 3


:)By Reference( ‫التمرير باإلشارة أو المرجع‬ •
.‫يتم تمرير العوامل برقم المرجع الى الدوال وأي تغيير على القيم داخل الدالة يغير على قيم للعوامل‬ •

void swap2 (int &x, int &y) Memory


{ Reference Variable Name Value
int z;
z=x; 1214 a 10
x=y; 1215 b 20
y=z;} 1216 x 20
int main() { 1217 y 10
int a=10; 1218 z 10
int b=20;
……
swap2(a,b);
cout << “a: " << a << endl;
cout << “b: " << b <<endl; a:20
} b:10

AbdulRahman M.Baraka (2017) 4


‫مالحظات هامة‪:‬‬ ‫•‬
‫ال يمكن تمرير المصفوفة باإلشارة‪.‬‬ ‫•‬
‫يتم التمرير بواسطة عنوان أول عنصر‪.‬‬ ‫•‬
‫يمكن تمرير العوامل بالقيم (باستخدام المؤشرات) مع تغيير القيم كما يلي‪:‬‬ ‫•‬
‫{ )‪void swap3 (int *x, int *y‬‬
‫;‪int z‬‬
‫;‪z=*x‬‬
‫;‪*x=*y‬‬
‫};‪*y=z‬‬

‫{ )(‪int main‬‬
‫;‪int a=10‬‬
‫;‪int b=20‬‬
‫;)‪swap3(&a,&b‬‬
‫;‪cout << “a: " << a << endl‬‬
‫;‪cout << “b: " << b <<endl<<endl‬‬
‫}‬
‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪5‬‬
AbdulRahman M.Baraka (2017) 6
‫تتيح الصداقة صالحية الوصول للمتغيرات والدوال لخاصة (‪.)Private‬‬ ‫•‬

‫تضاف كلمة (‪ .)Friend‬للدالة وللصنف لتصبح الدالة صديقة للصنف‪.‬‬ ‫•‬

‫يمكن أن تكون الدالة (أو الصنف) صديقة ألكثر من صنف‪.‬‬ ‫•‬

‫عالقة الصداقة ليست عكسية‪:‬‬ ‫•‬


‫أي أنه إذا كان الصنف (‪ )T1‬صديق للصنف (‪ .)T2‬فهذا ال يعني أن الصنف (‪ )T2‬صديق للصنف (‪.)T1‬‬ ‫‪o‬‬

‫اذا كانت الدالة ‪ Add‬هي دالة منتمية فإنها تستدعى كالتالي ‪Calc.Add‬‬ ‫•‬

‫اذا كانت الدالة ‪ Add‬هي دالة صديقة فإنها تستدعى كالتالي )‪Add(C‬‬ ‫•‬
‫يمكن عمل صداقة بين كل من‪:‬‬ ‫•‬
‫صنف ودالة‪.‬‬ ‫‪o‬‬
‫صنفيين معا‪.‬‬ ‫‪o‬‬
‫)‪AbdulRahman M.Baraka (2017‬‬
‫صنف ودالة منتمية‪.‬‬ ‫‪o‬‬ ‫‪7‬‬
‫صداقة صنفيين‪:‬‬ ‫•‬
‫ال حظ الصنفيين المقابلين (‪.)T1, T2‬‬ ‫•‬

‫تم عمل صداقة للصنف األول مع الصنف الثاني‪ .‬أي أن الصنف (‪ )T2‬صديق للصنف (‪.)T1‬‬ ‫•‬

‫عالقة الصداقة ليست عكسية‪ .‬أي أن الصنف (‪ )T1‬ليس صديق للصنف (‪.)T2‬‬ ‫•‬

‫الحظ أن الصداقة أتاحت للصنف (‪ )T2‬الوصول للمتغير (‪ )x‬الخاص للصنف (‪ .)T1‬كما هو موضح‬ ‫•‬
‫‪Class T1‬‬ ‫في الدالة()(‪.)print‬‬
‫{‬
‫;‪Private: int x‬‬ ‫بعد عمل الصداقة يتم التعامل مع جميع دوال ومتغيرات‬ ‫•‬
‫;‪Public : int y‬‬
‫;‪friend T2‬‬
‫;}‬
‫الصنف الصديق كدوال ومتغيرات منتمية‪.‬‬
‫‪Class T2‬‬
‫};‪{ public:void print(){cout<<x‬‬
‫;}‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪8‬‬


‫صداقة صنف ودالة منتمية‪:‬‬ ‫•‬
‫يسبق اسم الدالة إسم الصنف متبوعا باالشارة (‪.)::‬‬ ‫•‬
‫صداقة صنف ودالة‪:‬‬ ‫•‬
‫يجب كتابة تعريف الدالة كامال عند عمل الصداقة (القيمة المرجعة والعوامل)‪.‬‬ ‫•‬
‫الحظ الصداقة بين الصنف الثاني ودالة ()(‪.)main‬‬ ‫•‬
‫‪Class T1‬‬
‫{‬
‫;‪Private: int x‬‬
‫;‪Public : int y‬‬
‫;)(‪friend T2::print‬‬
‫;}‬
‫‪Class T2‬‬
‫};‪{ public:void print(){cout<<x‬‬
‫;)(‪friend int main‬‬
‫;}‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪9‬‬


‫استخدام الدوال المنتمية أفضل من الصديقة إال في الحاالت التالية‪:‬‬ ‫•‬

‫إذا كانت الدالة تحتاج ‘لى عاملين أو أكثر‪ .‬وانتمى كل واحد منهما الى صنف مختلف‪.‬‬ ‫‪.1‬‬

‫إذا أردنا تحميل الدالة أكثر من تعريف من خالل عدد العوامل ونوعهم‪.‬‬ ‫‪.2‬‬

‫إذا كانت الدالة تستخدم متغيرات منتمية لعملها‪.‬‬ ‫‪.3‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪10‬‬


AbdulRahman M.Baraka (2017) 11
‫• تتيح لغة (‪ )C++‬إعادة تعريف بعض العمليات من خالل مفهوم إعادة التحميل‬
‫(‪ .)Overload‬ألن العمليات تعد نوع خاص من الدوال‪.‬‬

‫• ال يمكن تعريف أكثر من دالة لها نفس المعامالت ونفس القيمة المرجعة‪.‬‬

‫• ال يختلف تعريف العملية عن تعريف الدالة إال باألسم‪.‬‬

‫• تعرف العملية باستخدام الكلمة (‪ )operator‬متبوعة برمز العملية‪.‬‬

‫• مثال‪. operator+ :‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪12‬‬


class Time {
private:
int main() {
int hours; // 0 to 23
Time T1(11, 59), T2(10,40);
int minutes; // 0 to 59
public:
++T1; // increment T1
Time(){ hours = 0; T1.displayTime(); // display T1
minutes = 0; } ++T1; // increment T1
Time(int h, int m){ again
hours = h; T1.displayTime(); // display T1
minutes = m;}
void displayTime() { T2++; // increment T2
cout << "H: " << hours << " M:" << minutes <<endl; } T2.displayTime(); // display T2
T2++; // increment T2
// overloaded prefix ++ operator again
Time operator++ () { ++minutes; T2.displayTime(); // display T2
if(minutes >= 60) { ++hours; minutes -= 60;} return 0;
return Time(hours, minutes); }
}

// overloaded postfix ++ operator


Time operator++( int ) {
// save the orignal value
Time T(hours, minutes);
// increment this object
++minutes;
if(minutes >= 60) { ++hours; minutes -= 60; }
return T; }
};
13
AbdulRahman M.Baraka (2017)
‫• العمليات المتاحة إلعادة التحميل‪:‬‬

‫• العمليات التي يمنع إعادة التحميل لها‪:‬‬

‫)(‪sizeof‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪14‬‬


‫• ال يمكن تغيير الخصائص التالية للعمليات عند إعادة تعريفها‪:‬‬

‫‪ .1‬عدد العوامل‪.‬‬

‫‪ .2‬األسبقية (األولوية)‪.‬‬

‫‪ .3‬رتيب التنفيذ‪:‬‬
‫‪ o‬إذا كانت من اليمين الى اليسار فال يجوز تغييرها للعكس‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪15‬‬


AbdulRahman M.Baraka (2017) 16
‫• عند استدعاء الدوال المنتمية فإن هناك مؤشر يمرر ضمنيا يدعى (‪.)this‬‬

‫• الدوال الصديقة ال تملك هذا المؤشر ألنها ليست منتمية‪.‬‬

‫• يستخدم عادة لتمييز بين الدوال والمتغيرات المنتمية أوالصديقة أو الممررة‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪17‬‬


class Box {
public:
Box(double l = 2.0, double b = 2.0, double h = 2.0) {
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h; }

double Volume() { return length * breadth * height; }

int compare(Box box) {


return this->Volume() > box.Volume(); }

private:
double length; double breadth; double height;
};

void main(void) {
Box Box1(3.3, 1.2, 1.5); // Declare box1
Box Box2(8.5, 6.0, 2.0); // Declare box2

if(Box1.compare(Box2))
cout << "Box2 is smaller than Box1" <<endl;
else
cout << "Box2 is equal to or larger than Box1" <<endl;
} AbdulRahman M.Baraka (2017) 18
‫• نستخدم الدوال الثابتة لضمان عدم تعديل هذه الدوال الي قيمة الي متغير منتمي‪.‬‬

‫• تستخدم الكلمة (‪ )const‬لتعريف الدالة الثابتة‪ .‬وتوضع بعد تعريف الدالة‪.‬‬

‫‪Class T1‬‬
‫{‬
‫;‪Private: int x‬‬
‫‪Public :‬‬
‫;};‪void print() const {cout <<y‬‬
‫;}‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪19‬‬


AbdulRahman M.Baraka (2017) 20
(1) ‫برمجة‬
‫مقدمة‬

AbdulRahman M.Baraka
2012
Hello World
/* Simple hello world program*/
# include <iostream>// This is include
directive
using namespace std;
int main()
{
cout << “Hello World!”; //C++ statement
return 0;
}
Constant
 Refer to fixed values that do not change
in thw execution of the program.
 123 //decimal integer
 12.34 //floating point integer
 037 //octal integer
 0x2 //Hexa decimal
 “C++” //string constant
 ‘A’ //character constant
 L’ab’ //wide-character constant
 Using the qualifier const
 const float pi = 3.14;
Variables
 String Variables that can store non-numerical values
that are longer than one single character are known
as strings.
 Before use, variables must be declared.
 Variable declaration :
double rate;
int hours;
float x;
 The C++ language library provides support for
strings through the standard string class.
Example:
int main ()
{
string mystring = "This is a string";
cout << mystring;
return 0;
}
DATA
Type
Type
Bytes
and
Range
Ranges
char 1 -128 to 127
signed: -128 to 127
unsigned: 0 to 255
short int 2 -31768 to 32767
signed: -32768 to 32767
unsigned: 0 to 65535
int 2 -32768 to 32767
signed: -31768 to 32767
unsigned: 0 to 65535
long int 4 -2147483648 to 2147483647
signed: -2147483648 to
2147483647
unsigned: 0 to 4294967295
float 4 3.4E-38 to 3.4E+38
double 8 1.7E-308 to 1.7E+308
Operating
== equal to
< less than
<= less than or equal
> greater than
>= greater than or equal
!= not equal
&& logical and
|| logical or
! logical not
+ plus + for addition
- minus - for
* mult subtraction
/ divide * for
% modulo multiplication
IF-ELSE (Condition)
 The if-else statement in C++ is
used to compare two options:
 if (condition)
{statement1; }
will execute if the condition is "True"
 else
{statement2;}
will execute if the condition is "False"
IF-ELSE (Condition)

Logical:
AND, OR, NOT operators are called logical operators.
These operators are represented by the symbols &&, || and !,
respectively.
)grade>89 )&& (semester <3)
Loop
 The three different forms of loops:

 • while (expression) {statement; }


 • do {statement; } while (expression)
 • for (inital statement, expression,
increment statement) {statement;}
SWITCH
 Switch (case) statements are a substitute for long if
statements. The basic format for using switch case is
outlined below:
 switch (variable)
 {
case expression1:
do something 1;
break;
case expression2:
do something 2;
break;
....
default:
do default processing;
}
Example(A)
 int main(int argc, char* argv[])
{
for (int i=1; i<=10; i++)
{cout << i << " hello world" << endl ;
if ( i == 7 )
{ cout << "that was lucky!" << endl ; }
else
{ cout << endl ; }
}
}
Exampl(B)
 #include "stdafx.h"
 #include <string>

 int _tmain(int argc, _TCHAR* argv[])


 {
 char myname[10]="Ali";
 printf("Welcome,,, My name is: %s\n",myname);
 for (int i=1; i<=10; i++)
 {
 printf("Line number : %d",i ) ;
 if ( i == 7 )
 { printf(" that was lucky!\n"); }
 else
 { printf("\n"); }
 }
 return 0;
 }
‫نهاية‬
)1( ‫برمجة‬

AbdulRahman M.Baraka
2017
AbdulRahman M.Baraka (2017) 1
/* Simple hello world program*/

# include <iostream>

using namespace std;

int main()
{
cout << “Hello World!”; //C++ statement
return 0;
}

AbdulRahman M.Baraka (2017) 2


• After you write a C++ program you compile it
• Checks whether the program follows the C++
syntax
• if it finds errors, it lists them
• If there are no errors, it translates the C++
program into a program in machine language
which you can execute

AbdulRahman M.Baraka (2017) 3


‫• يجب االعالن عن أي متغير في بداية البرنامج و قبل استخدامه‪.‬‬
‫• يتم االعالن عن المتغير من خالل الصيغة التالية‪:‬‬
‫;‪Type Variable-name‬‬
‫‪Ex:‬‬
‫;‪int num‬‬
‫• حيث (‪ )Type‬يمثل نوع المتغير‪.‬‬
‫• وتمثل (‪ )Variable-name‬اسم المتغير المستخدم‪:‬‬
‫• ال يبدأ برقم وال برمز خاص‪.‬‬
‫• ال يحتوي على رموز خاصة‪.‬‬
‫• ال يحتوي على فراغات‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪4‬‬


:)Type( ‫• أنواع البيانات‬
Type Bytes Range
-128 to 127
char 1 signed: -128 to 127
unsigned: 0 to 255
-31768 to 32767
short int 2 signed: -32768 to 32767
unsigned: 0 to 65535
-32768 to 32767
int 2 signed: -31768 to 32767
unsigned: 0 to 65535
-2147483648 to 2147483647
long int 4 signed: -2147483648 to 2147483647
unsigned: 0 to 4294967295
float 4 3.4E-38 to 3.4E+38

double 8 1.7E-308 to 1.7E+308

long double 10 3.4E-4932 to 1.1E+4932


AbdulRahman M.Baraka (2017) 5
.‫• هي قيم ثابتة ال تتغير طيلة تنفيذ البرنامج‬

• 123 //decimal integer


• 12.34 //floating point integer
• 037 //octal integer
• 0x2 //Hexa decimal
• “C++” //string constant
• ‘A’ //character constant
• L’ab’ //wide-character constant
• Using the qualifier const
• const float pi = 3.14;
AbdulRahman M.Baraka (2017) 6
‫• تستخدم ( ‪ )cout‬لالخراج على الشاشة‪.‬‬
‫• واالمر( ‪ )cin‬لالدخال من لوحة المفاتيح‪.‬‬
‫• يفصل بين أي مدخلين بفراغ او بسطر جديد‪.‬‬
‫• كال االمرين موجودين في مكتبة <>‪iostream.h‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪7‬‬


• cin>>num1;
• cout<<“Number 1 is :”<<num1;
• cin.getline(str,length,terminating character);
• cin.getline(myname,10,”X”);
• \n new line
• \a alert
• \” “
• \’ \’
AbdulRahman M.Baraka (2017) 8
‫• تستخدم لتنفيذ مجموعة من األوامر بناء على تحقق شرط معين‪:‬‬

‫)‪if (condition‬‬
‫} ;‪{statement1‬‬
‫مجموعة من الجمل تنفذ في حال تحقق الشرط‪.‬‬ ‫‪True‬‬ ‫‪False‬‬
‫‪condition‬‬
‫‪else‬‬
‫};‪{statement2‬‬
‫مجموعة من الجمل تنفذ في حال عدم تحقق الشرط‪.‬‬ ‫‪S1‬‬ ‫‪S2‬‬

‫‪S3‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪9‬‬


: ‫• يمكن استخدام عمليتين منطقيتين في نفس الشرط باستخدام‬
• symbols &&, || and !.
• And (&&):
)grade>89 )&& (semester <3)
• Or (|| ):
)age>25) || (average > 90)
• Not (!):
(female= !male)

AbdulRahman M.Baraka (2017) 10


..are built using
:‫• بعض الروابط المنطقية‬
 Comparison operators
== equal
!= not equal
< less than
> greater than
<= less than or equal
>= greater than or equal

 Boolean operators
&& and
|| or
! not

AbdulRahman M.Baraka (2017) 11


• Examples:

Assume we declared the following variables:


int a = 2, b=5, c=10;

Here are some examples of boolean conditions we can


use:
 if (a == b) …
 if (a != b) …
 if (a <= b+c) …
 if(a <= b) && (b <= c) …
 if !((a < b) && (b<c)) …

AbdulRahman M.Baraka (2017) 12


• Examples:
#include <iostream.h>

void main() {
int a,b;
cin >> a >> b;

if (a <=b) {
cout << “min is “ << a << endl;
}
else {
cout << “ min is “ << b << endl;
}
cout << “happy now?” << endl;
}
system(“pause”);
AbdulRahman M.Baraka (2017) 13
:‫• هناك ثالثة أنواع مختلفة لجمل الدوران‬

The three different forms of loops:

1. for (inital statement, expression, increment statement)


{statement;}
2. while (expression) {statement; }

3. do {statement; } while (expression)

AbdulRahman M.Baraka (2017) 14


‫• الفكرة العامة للدوران هو أننا نقوم بتعريف متغير ونسند له قيمة ابتدائية‪.‬‬
‫• ثم نقوم بزيادة هذه القيمة في كل دورة حتى نصل لقيمة يتوقف عندها الدوران‪.‬‬
‫• فبالتالي فإن جميع هذه األنواع يجب أن تحتوي على ثالثة قيم‪:‬‬
‫‪ .1‬قيمة البداية‪:‬‬
‫• وهي القيمة البدائية للدوران‪.‬‬
‫‪ .2‬شرط التكرار‪:‬‬
‫• هو الشرط الذي اذا لم يتحقق يتوقف التكرار‪.‬‬
‫‪ .3‬قيمة الزيادة‪:‬‬
‫• وهي مقدار الزيادة التي سوف تزداد في كل دورة‪.‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪15‬‬


• Examples: Sum for 10 Numbers
#include <iostream.h>
void main() { .‫) اذا كان عدد مرات التكرار محدد سلفا‬if( ‫عادة ما تستعمل جملة‬

int i, sum, x; ‫القيمة البدائية‬ ‫شرط التكرار‬


‫مقدار الزيادة‬
sum = 0;

for (i = 0; i < 10;i++) {


cin >> x;
sum = sum + x;
}

cout << "sum is " << sum << endl;

system(“pause”);
AbdulRahman M.Baraka (2017) 16
• Examples: Sum for 10 Numbers
#include <iostream.h>
void main() { ‫) اذا كان عدد مرات التكرار غير‬Whileً( ‫عادة ما تستعمل جملة‬
int i, sum, x;
sum=0; ‫شرط التكرار‬ .‫محدد سلفا‬
‫القيمة البدائية‬
i=1;

while (i <= 10) {


cin >> x; ‫مقدار الزيادة‬
sum = sum + x;
i = i+1;
}

cout << “sum is “ << sum << endl;


system(“pause”);
AbdulRahman M.Baraka (2017) 17
• Examples: Sum for 10 Numbers
#include <iostream.h>
void main() { ‫مرة‬ ‫) اذا أردنا تنفيذ الدوران‬do..While( ‫عادة ما تستعمل جملة‬
int i, sum, x; .‫واحدة على األقل‬
sum = 0;
i = 0; ‫القيمة البدائية‬
do
{
cin >> x;
sum = sum + x; ‫مقدار الزيادة‬
i++;
} while (i < 10); ‫شرط التكرار‬

cout << "sum is " << sum << endl;

system(“pause”);
AbdulRahman M.Baraka (2017) 18
• Examples: Check Odd or Even for 5 numbers.
#include "stdafx.h"
#include "iostream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int x;
int i;
for(i=1; i<=5;i++)
{
cin>>x;

if(x % 2 ==0)
{cout<<"Even"<<endl;}
else
{cout<<"Odd"<<endl;}
}
cout<<endl<<"End";

system("pause");
AbdulRahman M.Baraka (2017) 19
return 0;}
• Examples: Check Odd or Even for 5 numbers.

int x;

do{
cin>>x;

if(x % 2 ==0)
{cout<<"Even"<<endl;}
else
{cout<<"Odd"<<endl;}

}while(x !=0);

cout<<endl<<"End";
AbdulRahman M.Baraka (2017) 20
:‫الختيار خيار واحد من مجموعة اختيارات‬ •
• switch (variable)
• {
case expression1:
do something 1;
break;
case expression2:
do something 2;
break;
....
default:
do default processing;
}
AbdulRahman M.Baraka (2017) 21
AbdulRahman M.Baraka (2017) 22
‫• يتم تقسيم البرنامج الرئيسي إلى مجموعة من البرامج الفرعية (دوال)‪.‬‬

‫• كل برنامج فرعي (دالة) يقوم بمهمة صغيرة محددة‪.‬‬

‫• كل برنامج فرعي (دالة) له اسم ومدخالت ومخرجات خاصة به‪.‬‬

‫• هناك نوعان من البرامج الفرعية‪:‬‬


‫‪ ‬برامج (دوال) تقوم بإرجاع قيمة‪ :‬يتم تحديد نوع البيانات المرجعة قبل اسم الدالة‪.‬‬
‫)(‪float avg‬‬
‫} ‪{ ….. return‬‬
‫‪ ‬برامج ال تقوم بارجاع قيمة‪ :‬تبدأ بالكلمة (‪.)void‬‬

‫)(‪void printReport‬‬
‫} ‪{ …..‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪23‬‬


‫• الصيغة العامة‪:‬‬
‫)‪Return-DataType Function-Name (Parameters‬‬
‫} ‪{ …..‬‬

‫• القيمة المرجعة (‪: )Return-Datatype‬‬


‫‪ o‬تحدد نوع البيانات المخرجة (التي سوف ترجعها الدالة)‪.‬‬
‫‪ o‬تستخدم كلمة (‪ )return‬لتحديد القيمة المرجعة‪.‬‬
‫‪ o‬إذا لم يكن هناك قيمة مخرجة فإنه يتم استخدام الكلمة (‪.)void‬‬

‫• اسم الدالة (‪: )Function-Name‬‬


‫‪ o‬هو االسم الذي سوف تستدعى به الدالة في الدالة الرئيسية‪.‬‬

‫• البارامترات (القيم الممررة)(‪: )Parameters‬‬


‫)‪int sum(int x ; int y‬‬
‫‪ o‬بمثابة المدخالت للدالة‪.‬‬
‫} ;‪{return x+y‬‬
‫)‪AbdulRahman M.Baraka (2017‬‬
‫‪ o‬يجب تحديد نوع كل مدخل واسمه‪.‬‬ ‫‪24‬‬
int main(int argc, char* argv)][
{
int x;
int y;
int sum;

cin>>x>>y;

sum=x+y;

cout<<"\n SUM: “<<sum;

return 0 ;
}

AbdulRahman M.Baraka (2017) 25


int sum(int x, int y)
{
return x + y;
}

int main(int argc, char* argv)][


{
int x;
int y;

cin>>x>>y;

cout << "\n SUM: “ << sum(x,y);

return 0 ;
}

AbdulRahman M.Baraka (2017) 26


int sum (int x, int y)
{
return x + y;
}

void printSum (int s)


{
cout << "\n SUM: “ << s;
}

int main(int argc, char* argv)][


{
int x;
int y;
int sum1;
cin>>x>>y;

sum1=sum(x,y)
printSum(sum1);
return 0 ;
AbdulRahman M.Baraka (2017)
} 27
AbdulRahman M.Baraka (2017) 28
‫• مجموعة من العناصر مشتركة في نوع البيانات‪.‬‬

‫• وضعت في الذاكرة بشكل متسلسل‪.‬‬


‫‪X‬‬
‫العنوان‬
‫العنوان‬ ‫القيمة‬ ‫• يتم ترقيم عناوين العناصر تلقائيا ويبدأ بالرقم ‪.0‬‬
‫‪0‬‬
‫• مثال‪int x[4] ; :‬‬
‫‪1‬‬
‫‪2‬‬ ‫‪100‬‬ ‫• للوصول الى أي عنصر يتم ذكر اسم المصفوفة ثم رقم العنصر‪.‬‬
‫‪3‬‬
‫• مثال‪x[2] = 100; :‬‬

‫• إذا تم كتابة عنوان للعنصر أكبر من العناصر المحجوزة فإنه يتم اصدار رسالة خطأ‪.‬‬

‫• مثال‪- Error - x[5]; :‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪29‬‬


‫• يتم تعريف المصفوفة أوال ثم تتم عملية اسناد القيم‪.‬‬
‫‪X‬‬ ‫;]‪int x[4‬‬
‫العنوان‬ ‫القيمة‬ ‫;‪x[0]=5‬‬
‫‪0‬‬ ‫‪5‬‬ ‫;‪x[1]=-1‬‬
‫;‪x[2]=53‬‬
‫‪1‬‬ ‫‪-1‬‬
‫;‪x[3]=20‬‬
‫‪2‬‬ ‫‪53‬‬
‫‪3‬‬ ‫‪20‬‬
‫• ويمكن عمل االسناد مع نفس سطر التعريف‪.‬‬
‫‪ar‬‬ ‫;}’‪char ar[4] = {‘N’,‘e’,‘W’,‘s‬‬
‫العنوان‬ ‫القيمة‬
‫‪0‬‬ ‫‪N‬‬
‫‪1‬‬ ‫‪e‬‬
‫‪2‬‬ ‫‪W‬‬
‫‪3‬‬ ‫‪s‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪30‬‬


‫• غالبا ما يتم استخدام الدوران في عملية اسناد القيم (أو قراءتها)‪:‬‬

‫;]‪int x[4‬‬
‫;‪int i‬‬

‫)‪for ( i=0 ; i<4 ; i++‬‬


‫; ]‪cin>> x[i‬‬
‫عدد عناصر المصفوفة‬

‫)‪for ( i=0 ; i<4 ; i++‬‬


‫; ]‪cout<< x[i‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪31‬‬


• /* define an array of 4 chars */
• char x[4] = {‘t’,’e’,’s’,’t’};

• /* accessing element 0 */
• x[0] = ‘T’;

• char y[5];

• int i;
• for (i=0; i<5; i++)
• {
• cout<<y[i]<<“\n”;
• }AbdulRahman M.Baraka (2017) 32
• # include <iostream.h>
• int main(int argc, char* argv[])
• {
• int y[5];
• int i;
• cout<<"Please enter five numbers:";

• for (i=0; i<5; i++)


• {
• cout<<"\nnumber("<<i<<"):";
• cin>>y[i];
• }

• for (i=0; i<5; i++)


• {
• cout<<y[i];
• }
• cin>>i;
• return 0;
AbdulRahman M.Baraka (2017) 33
• }
AbdulRahman M.Baraka (2017) 34
‫مجموعة من الحقول خاصة بكائن معين (تختلف‪/‬تتفق) في نوع البيانات‪.‬‬ ‫‪‬‬
‫تستخدم لوصف خصائص كائن معين‪.‬‬ ‫‪‬‬
‫‪struct structure name‬‬ ‫‪struct Book‬‬
‫{‬ ‫{‬
‫;‪Variables‬‬ ‫;‪int pages‬‬
‫;‪string Author‬‬
‫;}‬ ‫;}‬

‫يتم تعريف التركيب قبل الدالة ()(‪.)main‬‬ ‫‪‬‬


‫يعامل التركيب كنوع من أنواع البيانات‪.‬‬ ‫‪‬‬
‫يتم الوصول الى الحقول من خالل النقطة‪.‬‬ ‫‪‬‬
‫;‪Book x‬‬
‫;‪x.pages=350‬‬
‫;’‪x.Author=‘Qou‬‬

‫)‪AbdulRahman M.Baraka (2017‬‬ ‫‪35‬‬


#include <iostream.h>
struct Time
{
int hour;
int min;
int sec ;
};

int main(int argc, char* argv)][


{
int no;
Time t ;

cout<<"Please enter the time: \nHoure;":


cin>>t.hour;
cout<<"\nMinute;":
cin>>t.min;
cout<<"\nSecond;":
cin>>t.sec;
cout<<"\nTime is : "<<t.hour<<":"<<t.min<<":"<<t.sec;
return 0 ;
} AbdulRahman M.Baraka (2017) 36
• struct Student
• {
• char name[10];
• int Mid; int Ass1; int Ass2; int final l; int practical;
• float avg;
• };

• int main(int argc, char* argv[])
• {
• int no;
• Student std;
• cout<<"Please enter the below informations: \nName:";
• cin>>std.name;
• cout<<"\nMidterm exam:"; cin>>std.Mid;
• cout<<"\nAssignment 1:"; cin>>std.Ass1;
• cout<<"\nAssignment 2:"; cin>>std.Ass2;
• cout<<"\nFinal exam:"; cin>>std.final;
• cout<<"\nPractical:"; cin>>std.practical;
• std.avg=(std.Ass1*0.05)+(std.Ass2*0.05)+(std.Mid*0.24)+(std.final*0.36)+(std.practical*0.3);
• cout<<"\nStudent Name : "<<std.name;
• cout<<"\nHis average is : "<<std.avg<<" %.";
• cin>>no;
• return 0;
• }
• AbdulRahman M.Baraka (2017) 37
.‫يمكن انشاء مصفوفة من تركيب معين‬ 
‫يتم الوصول الي عنصر من خالل اسم المصفوفة ثم رقم العنصر ثم القيمة‬ 
.‫المرادة‬
struct Book
{ X
int pages;
string Author;
‫العنوان‬ ‫القيمة‬
}; Pages Author
0
int main
{ Pages Author
Book x[3]; 1 350
X[1].pages=350;
X[2].Author=‘Qou’; Pages Author

}
2 Qou

AbdulRahman M.Baraka (2017) 38


#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;
struct Book
{
string Name;
int Pages;
int Year;
;}
void Print(string n,int p,int y)
{
cout<<"**************************"<<endl;
cout<<" Book Name.: "<<n<<endl;
cout<<" Book Pages: "<<p<<endl;
cout<<" Book Year.: "<<y<<endl;
cout<<"**************************"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{Book x[3];

for(int i=0;i<3;i++){
cout<<"Please enter Book"<<i+1<<" Name:";
cin>>x[i].Name;
cout<<"Please enter Book"<<i+1<<" Pages:";
cin>>x[i].Pages;
cout<<"Please enter Book"<<i+1<<" Year:";
cin>>x[i].Year;}

for(int i=0;i<3;i++)
{Print(x[i].Name,x[i].Pages,x[i].Year);}

system("pause");
return 0;} 39
AbdulRahman M.Baraka (2017) 40
(1) ‫برمجة‬

‫الوحدة الثانية‬

AbdulRahman M.Baraka
2012
‫الخدرخال والرخراج‬
.‫( للرخراج على الشاشة‬Cout) ‫تستخدم‬ 

.‫( للخدرخال من لوحة المفاتيح‬Cin) ‫والمر‬ 

.‫يفصل بين أي مدرخلين بفراغ او بسطر جديد‬ 

<iostream.h> ‫كل المرين موجوخدين في مكتبة‬ 


 cin>>num1;
 cout<<“Number 1 is :”<<num1;
 cin.getline(str,length,terminating
character);
 cin.getline(myname,10,”X”);
 \n new line
 \a alert
 \” “
 \’ \’
‫‪Structures‬‬
‫مجموعة من الحقول رخاصة بكائن معين )تختلف‪/‬تتفق( في‬ ‫‪‬‬
‫نوع البيانات‪.‬‬
‫تستخدم لوصف رخصائص كائن معين‪.‬‬ ‫‪‬‬

‫‪‬‬ ‫‪struct structure name‬‬


‫‪‬‬ ‫{‬
‫;‪Variables‬‬

‫‪‬‬ ‫;‪} variables‬‬


Structures-Example(p1)
 # include <iostream.h>
 struct Time
 {
 int hour;
 int min;
 int sec ;
 };

 int main(int argc, char* argv[])
 {
 int no;
 Time t;

 cout<<"Please enter the time: \nHoure:";
 cin>>t.hour;
 cout<<"\nMinute:";
 cin>>t.min;
 cout<<"\nSecond:";
 cin>>t.sec;
 cout<<"\nTime is : "<<t.hour<<":"<<t.min<<":"<<t.sec;
 return 0;
 }
Example(p2)
 struct Student
 {
 char name[10];
 int Mid; int Ass1; int Ass2; int final l; int practical;
 float avg;
 };

 int main(int argc, char* argv[])
 {
 int no;
 Student std;
 cout<<"Please enter the below informations: \nName:";
 cin>>std.name;
 cout<<"\nMidterm exam:"; cin>>std.Mid;
 cout<<"\nAssignment 1:"; cin>>std.Ass1;
 cout<<"\nAssignment 2:"; cin>>std.Ass2;
 cout<<"\nFinal exam:"; cin>>std.final;
 cout<<"\nPractical:"; cin>>std.practical;
 std.avg=(std.Ass1*0.05)+(std.Ass2*0.05)+(std.Mid*0.24)+(std.final*0.36)+
(std.practical*0.3);
 cout<<"\nStudent Name : "<<std.name;
 cout<<"\nHis average is : "<<std.avg<<" %.";
 cin>>no;
 return 0;
 }

‫‪Array‬‬
‫مجموعة من العناصر مشتركة النوع البيانات‪.‬‬ ‫‪‬‬

‫وضعت في الذاكرة بشكل متسلسل‪.‬‬ ‫‪‬‬

‫للوصول الى أي عنصر في المصفوفة يكتفي بمعرفة بداية‬ ‫‪‬‬


‫المصفوفة وعدخد رخطوات التقدم‪.‬‬
Array-Example
 /* define an array of 10 chars */
 char x[4] = {‘t’,’e’,’s’,’t’};

 /* accessing element 0 */
 x[0] = ‘T’;

 char y[5];
 int i;
 for (i=0; i<5; i++)
 {
 cout<<y[i]<<“\n”;
 }
Array-Example (p3)
 # include <iostream.h>
 int main(int argc, char* argv[])
 {
 int y[5];
 int i;
 cout<<"Please enter five numbers:";
 for (i=0; i<5; i++)
 {
 cout<<"\nnumber("<<i<<"):";
 cin>>y[i];
 }

 for (i=0; i<5; i++)


 {
 cout<<y[i];
 }
 cin>>i;
 return 0;
 }
Classes and Objects
.‫قالب عام نستنسخ منه كائنات تحمل نفس الصفات‬ 

.(Data Type) ‫يعتبر نوع بيانات‬ 

Member) ‫( وخدوال‬Member Variables) ‫يحتوي على متغيرات‬ 


.(Functions

class class_name
{
private:
variable declarations;//class
function declarations;//members
public:
variable declarations;//class
function declarations;//members
} Object_Name;
‫‪Access Modifier‬‬
‫رخاص )‪:(Private‬‬ ‫‪‬‬

‫ل يسمح بالتعامل معه إل اعضاء نفس الصنف )‪.(Class‬‬ ‫‪‬‬

‫عام )‪:(Public‬‬ ‫‪‬‬

‫مسموح بالتعامل معه مع جميع الصناف الرخرى‪.‬‬ ‫‪‬‬

‫صديق )‪:(Friend‬‬ ‫‪‬‬

‫ل يسمح بالتعامل معه إل اعضاء نفس الصنف )‪ .(Class‬أو‬ ‫‪‬‬


‫اعضاء الصنف الصديق معه‪.‬‬
‫محمي )‪:(Protected‬‬ ‫‪‬‬

‫ل يسمح بالتعامل معه إل اعضاء نفس الصنف )‪ .(Class‬أو‬ ‫‪‬‬


‫اعضاء الصنف المورث وراثة عامة‪.‬‬
Classes
:‫قم بانشاء الصنف التالي‬ 

class time
{
Time
private: Hour
int hour;
int min; Minute
int sec;
Second
public: -Change
int gethour();
int getmin();
Hour.
int getsec(); -Change
void sethour(int h);
void setmin(int m);
Minute.
void setsec(int s); -Change
};
Second.
Classes and Object
.‫ هو أرخذ نسخة من صنف معرف مسبقا‬:‫الكائن‬ 

:‫الصيغة العامة‬ 

 Object declaration:
 class_name obj1;
 class_name obj2,obj3;
 class class_name
 {……}obj1,obj2,obj3;
Member Function
.‫تشبه الدوال العاخدية ولكن يجب تحديد الصنف مرتبطة به‬ 
 void Class_name :: member_function_name()
 {}
Example:
class time
{
private:
int hour;
void time::setsec(int h)
int min; { … };
int sec;
public:
int gethour();
int getmin();
int getsec();
void sethour(int h);
void setmin(int m);
void setsec(int s);
};
‫‪Constructor Function‬‬
‫‪ ‬خدالة منتمية لصنف تحمل نفس اسمه‪.‬‬
‫‪ ‬ل يجوز أن ترجع أي قيمة‪.‬‬
‫‪ ‬تستدعى تلقائيا عند انشاء كائن من صنفها‪.‬‬
‫)(‪ person :: person‬‬
‫{ ‪‬‬
‫‪‬‬ ‫;‪age=20; height=170; weight=70‬‬
‫} ‪‬‬

‫‪ ‬اذا كان هناك معاملت لها فانه ل يجوز انشاء كائن من الصنف‬
‫إل بتمرير قيمة لهذه المعاملت‪.‬‬
‫;)‪ person p(180,73‬‬
Example of Constructor
 Example:
class time
{
private:
int hour;
int min;
int sec; void time::time(int h)
public: { … };
int gethour();
int getmin();
int getsec();
Void time(int h, int min, int sec);
void sethour(int h);
void setmin(int m);
void setsec(int s);
};
‫‪Destructor Function‬‬
‫خدالة منتمية لصنف تحمل نفس اسمه‪.‬‬ ‫‪‬‬

‫ل يجوز أن ترجع أي قيمة‪.‬‬ ‫‪‬‬

‫تستدعى تلقائيا عند النتهاء استخدام الكائن‪.‬‬ ‫‪‬‬

‫‪‬‬ ‫)(‪person ::~ person‬‬


‫‪‬‬ ‫{‬
‫‪‬‬ ‫}‬
‫‪Inline Functions‬‬
‫استبدال جملة استدعاء الدالة بمجموعة الجمل المشكلة لجسم‬ ‫‪‬‬
‫الدالة‪.‬‬
‫طرق تعريفها‪:‬‬ ‫‪‬‬

‫تعرف الدالة بشكل كامل خدارخل الصنف‪.‬‬ ‫‪.1‬‬

‫تضاف كلمة )‪ (inline‬في بداية الدالة‪).‬منفصلة عن الصنف(‪.‬‬ ‫‪.2‬‬


‫‪Default Arguments‬‬
‫وضع قيمة اولية للمعاملت‪.‬‬ ‫‪‬‬

‫اذا تم الستدعاء بمعاملت جديدة يتم اعتماخدها وال فانه يتم‬ ‫‪‬‬
‫استخدام القيم الولية‪.‬‬
‫ترتيب قيم اسناخد المعاملت مهم جدا‪.‬‬ ‫‪‬‬

‫‪‬‬ ‫‪person :: person (int age, float‬‬


‫)‪tall=166, float weight=89‬‬
‫‪‬‬ ‫{‬
‫‪‬‬ ‫}‬
‫‪Const Functions and Const‬‬
‫‪Objects‬‬
‫ل يمكن ان يجري عبرها أي تعديل على متغير‪.‬‬ ‫‪‬‬

‫ل تستدعي ال خدالة منتمية ثابتة فقط‪.‬‬ ‫‪‬‬

‫يمكن تعريفها باستخدام كلمة )‪ (const‬بعد اسم الدالة‪.‬‬ ‫‪‬‬

‫‪‬‬ ‫‪void test1() const‬‬


‫‪‬‬ ‫{‬
‫‪‬‬ ‫}‬
class Circle ‫اسم الصنف‬
{
private:
double radius;
‫الخصائص‬
public:
Circle() { radius = 0.0;} ‫قيم اولية‬
Circle(int r);
void setRadius(double r){radius = r;}
double getDiameter(){ return radius *2;} ‫العمليات‬
double getArea();
double getCircumference();
};
Circle::Circle(int r)
{ ‫بناء‬
radius = r;
}
double Circle::getArea() ‫عمليات خاصة بالصنف‬
{
return radius * radius * (22.0/7);
}
double Circle:: getCircumference()
{
return 2 * radius * (22.0/7);
}
‫نهاية‬
‫الوحدة‬
(1) ‫برمجة‬

‫الوحدة الثالثة‬

AbdulRahman M.Baraka
2012
‫المصفوفات والنصناف‬
:‫مصفوفة أعداد‬ 
 int x[10];
1 55 6 8 0 15 26 74 10 65

0 1 2 3
4 …. :‫ايجاد أكبر عدد في مصفوفة‬ 

int max=x[0];
for (int i=0 ; i<10 ; i++)
{
if (max<x[i])
max=x[i]
}
cout<<max Max-Array.cpp
‫المصفوفات والنصناف‬
:‫مصفوفة داخل نصنف‬ 
 class Student
 {
 private:
 string name;
 int no;
 double Avg;  void Student::Readmark()
 float mark[3];  {
 public:  float sum;
 string getName();  for(int y=0;y<3;y++)
  x); {
void ChangeName(string
 double getAvg();  cout<<"enter
 void Readmark(); mark("<<y+1<<"):";
 };  cin>>mark[y];
 sum += mark[y];
 }
 Avg=sum/3;
 }

Student2.cpp
‫المصفوفات والنصناف‬
:‫مصفوفة كائنات‬ 
 Student x[3]; Stude Stude Stude
nt1 nt2 nt3
No Name Mark[ Av
3] g
()getName
()ChangeName
void Student::Readmark()
()readmark
{
.
float sum; .
for(int y=0;y<3;y++)
{
cout<<endl<<"enter
mark("<<y+1<<"):";
cin>>mark[y];
sum += mark[y];
} Student3.cpp
Avg=sum/3;
‫التنتقائي‬ ‫الفرز‬
Sorting an Array of
Integers
Example 
: we are 70

given an 60

array of 50
40
six
30
integers
20
that we 10
want to 0
sort [1] [5][2] [4][3] [3][4] [2][5] [1][6] [0]

from
‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
Start by 
finding 70
the 60
smallest 50
40
.entry
30

20

10

0
[1] [5[2]
] [4[3]
] [3[4]
] [2[5]
] [1[6]
] [0]
‫الفرز التنتقائي‬
The Selection Sort
Algorithm
Swap 
the 70
smallest 60
entry 50
40
with the
30
first
20
.entry 10
0
[1] [5[2]
] [4[3]
] [3[4]
] [2[5]
] [1[6]
] [0]
‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
Swap 
the 70
smallest 60
entry 50
40
with the
30
first
20
.entry 10
0
[1] [5] [2] [4] [3] [3] [4] [2] [5] [1] [6] [0]
‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
Sorted side Unsorted side

70
Part of  60

the array 50

is now 40

.sorted 30

20

10

0
[1] [5] [2] [4] [3] [3] [4] [2] [5] [1] [6] [0]
‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
Sorted side Unsorted side

Find the 
smallest
element
in the
unsorted
.side
[5] [4] [3] [2] [1] [0]
‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
Sorted side Unsorted side

Swap 
with the
front of
the
unsorted
.side
[5] [4] [3] [2] [1] [0]
‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
Sorted side Unsorted side

We have 
increase
d the
size of
the
sorted
side by [5] [4] [ 3] [2] [1] [0]
one
‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
Sorted side Unsorted side

The 
process Smallest
Smallest
from
from
continue unsorted
unsorted
...s

[5] [4] [3] [2] [1] [0]


‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
Sorted side Unsorted side

The 
process w aapp
SSw th
continue wwi ith t
nt
frfroon
...s

[5] [4] [3] [2] [1] [0]


‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
Sorted
Sortedside
side
is Sorted side Unsorted side
isbigger
bigger

The 
process
continue
...s

[5] [4] [3] [2] [1] [0]


‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
The  Sorted side Unsorted side

process
keeps
adding one
more
number to
the sorted
.side
The sorted  [5] [4] [3] [2] [1] [0]
‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
We can  Sorted side Unsorted sid

stop when
the
unsorted
side has
just one
number,
since that
number [5] [4] [3] [2] [1] [0]

must be
‫التنتقائي‬ ‫الفرز‬
The Selection Sort
Algorithm
The array 
is now
.sorted
We 
repeatedly
selected
the
smallest
element, [5] [4] [3] [2] [1] [0]
‫المصفوفات والنصناف‬
:(‫تمرير مصفوفة كائنات الى نصنف )الفرز التنتقائي‬ 
void ssort(Student* st,int n)
n j
{ 1 0
for(int i=0; i<n-1 ; i++) 2
{ st Stude Stude Stude
double min=st[i].getAvg(); nt1 nt2 nt3
int pos=i; Name: Ali Name: Name:
for (int j=i+1 ; j<n ; j++) Avg: 66 Omar Mona
Avg: 99 Avg: 53
{
if (st[j].getAvg()<min)
i=0
{
min=66
min=st[j].getAvg();
Pos=0
pos=j;
j=1
}
Student a= st[pos]; Step-1
st[pos]= st[i];
st[i]=a;
ssort.cpp
} }}
(‫المصفوفات والنصناف )تابع‬
:‫تمرير مصفوفة كائنات الى نصنف‬ 
void ssort(Student* st,int n)
n j
{ 1 0
for(int i=0; i<n-1 ; i++) 2
{ st Stude Stude Stude
double min=st[i].getAvg(); nt1 nt2 nt3
int pos=i; Name: Ali Name: Name:
for (int j=i+1 ; j<n ; j++) Avg: 66 Omar Mona
Avg: 99 Avg: 53
{
if (st[j].getAvg()<min)
i=0
{
min=53
min=st[j].getAvg();
Pos=2
pos=j;
j=2
}
Student a= st[pos]; Step-2
st[pos]= st[i];
st[i]=a;
ssort.cpp
} }}
(‫المصفوفات والنصناف )تابع‬
:‫تمرير مصفوفة كائنات الى نصنف‬ 
void ssort(Student* st,int n)
n j
{ 1 0
for(int i=0; i<n-1 ; i++) 2
{ st Stude Stude Stude
double min=st[i].getAvg(); nt1 nt2 nt3
int pos=i; Name: Ali Name: Name:
for (int j=i+1 ; j<n ; j++) Avg: 66 Omar Mona
Avg: 99 Avg: 53
{
if (st[j].getAvg()<min)
Name: i=0
{ a Mona min=53
min=st[j].getAvg(); Avg: 53 Pos=2
pos=j;
j=2
}
Student a= st[pos]; Step-3
st[pos]= st[i];
st[i]=a;
ssort.cpp
} }}
(‫المصفوفات والنصناف )تابع‬
:‫تمرير مصفوفة كائنات الى نصنف‬ 
void ssort(Student* st,int n)
n j
{ 1 0
for(int i=0; i<n-1 ; i++) 2
{ st Stude Stude Stude
double min=st[i].getAvg(); nt1 nt2 nt3
int pos=i; Name: Name: Name: Ali
for (int j=i+1 ; j<n ; j++) Mona Omar Avg: 66
Avg: 53 Avg: 99
{
if (st[j].getAvg()<min)
Name: i=0
{ a Mona min=53
min=st[j].getAvg(); Avg: 53 Pos=2
pos=j;
j=2
}
Student a= st[pos]; Step-4
st[pos]= st[i];
st[i]=a;
ssort.cpp
} }}
‫البحث الثنائي‬
‫يجب أن تكون المصفوفة مرتبة تصاعديا‪.‬‬ ‫‪‬‬
‫تنبحث عن الرقم ‪.11‬‬ ‫‪‬‬
‫‪‬‬ ‫‪Step 1:‬‬ ‫‪high‬‬
‫‪mid‬‬

‫‪4‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪11‬‬ ‫‪28‬‬

‫‪low‬‬
‫البحث الثنائي‬
‫يجب أن تكون المصفوفة مرتبة تصاعديا‪.‬‬ ‫‪‬‬
‫تنبحث عن الرقم ‪.11‬‬ ‫‪‬‬
‫‪‬‬ ‫‪Step 2:‬‬ ‫‪high‬‬
‫‪mid‬‬

‫‪4‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪11‬‬ ‫‪28‬‬

‫‪low‬‬
‫البحث الثنائي‬
‫يجب أن تكون المصفوفة مرتبة تصاعديا‪.‬‬ ‫‪‬‬
‫تنبحث عن الرقم ‪.11‬‬ ‫‪‬‬
‫‪‬‬ ‫‪Step 2:‬‬ ‫‪high‬‬
‫‪mid‬‬

‫‪4‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪11‬‬ ‫‪28‬‬

‫‪low‬‬
‫البحث الثنائي‬
‫يجب أن تكون المصفوفة مرتبة تصاعديا‪.‬‬ ‫‪‬‬
‫تنبحث عن الرقم ‪.11‬‬ ‫‪‬‬
‫‪‬‬ ‫‪Step 2:‬‬ ‫‪high‬‬
‫‪mid‬‬

‫‪4‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪11‬‬ ‫‪28‬‬

‫‪low‬‬
‫المصفوفات والنصناف‬
:(‫تمرير مصفوفة كائنات الى نصنف )البحث الثنائي‬ 
int bsearch(Student* st, int n , string sn)
{
int lo=0;
int hi=n-1;
while (lo<=hi)
‫المسم المراد البحث عنه‬
{
int mid = (lo+hi)/2;
string r=st[mid].getName(); ‫حجم المصفوفة‬
if(r==sn)
return mid; ‫مصفوفة المسماء‬
else
if( sn>r) (‫) لحظ أتنه في الحروف حرف اللف أنصغر من الباء‬
lo=mid+1;
else
hi=mid-1;
}
return -1; // not found
} bsearch.cpp
‫المصفوفات والنصناف‬
‫اضافة عنصر الى مصفوفة مرتبة تصاعديا‪:‬‬ ‫‪‬‬
‫اضافة الرقم ‪:8‬‬ ‫‪‬‬

‫‪4‬‬ ‫‪6‬‬ ‫‪9‬‬ ‫‪11‬‬

‫حذف عنصر من مصفوفة مرتبة تصاعديا‪:‬‬ ‫‪‬‬


‫حذف العنصر ‪:8‬‬ ‫‪‬‬

‫‪4‬‬ ‫‪6‬‬ ‫‪8‬‬ ‫‪9‬‬ ‫‪11‬‬

‫‪AddRemoveArray.cpp‬‬
‫المؤشرات‬

‫‪Memory‬‬
‫‪Attribute Location‬‬ ‫‪Value‬‬
‫‪16‬‬
‫‪17‬‬
‫‪18‬‬
‫‪19‬‬
‫‪20‬‬
‫‪21‬‬
‫ملظحظة ‪ :‬الكشكال هي للتوضيح فقط وليست كما يحدث بالذاكرة تماما‬ ‫‪22‬‬
‫المؤشرات‬
 int x=10;

Memory
Attribute Location Value
x 16 10
17
18
19
20
21
22
‫المؤشرات‬
 int x=10;
 String name=“Ali”;

Memory
Attribute Location Value
x 16 10
name 25 A
26 l
27 i
‫المؤشرات‬
 int x=10;
 String name=“Ali”;
 cout<<x; => 10

Memory
Attribute Location Value
x 16 10
name 25 A
26 l
27 i
‫المؤشرات‬
 int x=10;
 String name=“Ali”;
 cout<<x; => 10
 cout<<&x; => 16
Memory
Attribute Location Value
x 16 10
name 25 A
26 l
27 i
‫المؤشرات‬
 int x=10;
 String name=“Ali”;
 cout<<x; => 10
 cout<<&x; => 16
Memory
 int *p=&x; Variab Locati Value
les on
x 16 10
name 25 A
26 l
27 i
p* 28 16
Address
29
‫المؤشرات‬
 int x=10;
 String name=“Ali”;
 cout<<x; => 10
 cout<<&x; => 16
Memory
 int *p=&x; Variab Locati Value
 cout<<p; => 16 les on
x 16 10
name 25 A
26 l
27 i
p* 28 16
29
‫المؤشرات‬
 int x=10;
 String name=“Ali”;
 cout<<x; => 10
 cout<<&x; => 16
Memory
 int *p=&x; Variab Locati Value
 cout<<p; => 16 les on
x 16 10
 cout<<*p; => 10
name 25 A
26 l
27 i
p* 28 16
29
‫المؤشرات‬
 int x=10;
 String name=“Ali”;
 cout<<x; => 10
 cout<<&x; => 16
Memory
 int *p=&x; Variab Locati Value
 cout<<p; => 16 les on
x 16 10
 cout<<*p; => 10
name 25 A
26 l
 string *s=&name; 27 i
p* 28 16
s* 29 25
‫المؤشرات‬
 int x=10;
 String name=“Ali”;
 cout<<x; => 10
 cout<<&x; => 16
Memory
 int *p=&x; Variab Locati Value
 cout<<p; => 16 les on
x 16 10
 cout<<*p; => 10
name 25 A
26 l
 string *s=&name; 27 i
 cout<<s; =>25 p* 28 16
s* 29 25
‫المؤشرات‬ *
p= x
m e *
int x=10;
s=na

 String name=“Ali”;
 cout<<x; => 10
 cout<<&x; => 16
Memory
 int *p=&x; Variab Locati Value
 cout<<p; => 16 les on
x 16 10
 cout<<*p; => 10
name 25 A
26 l
 string *s=&name; 27 i
 cout<<s; =>25 p* 28 16
 cout<<*s; =>”Ali” s* 29 25
‫المؤشرات‬ *
p= x
m e *
s=na
 int x=10;
 String name=“Ali”;
 cout<<x; => 10
 cout<<&x; => 16

int *p=&x;
Memory

 cout<<p; => 16
 cout<<*p; => 10
Variab Locati Value
les on
 string *s=&name;
x 16 10
 cout<<s; =>25
 cout<<*s; =>”Ali” name 25 A

cout<<&s?
26 l
27 i
p* 28 16
s* 29 25
‫المؤشرات‬
class Student
{
private:
string name;
int no;
public:
string getName();
void changeNo();
Memory
}; Variab Locati Value
les on
Student s; s 215 :Student
)getName
(
ChangeN
)(o
‫المؤشرات‬
class Student
{
private:
string name;
int no;
public:
string getName();
void changeNo();
Memory
}; Variab Locati Value
les on
Student s; s 215 :Student
Student *p=&s; 216 name
217 no
218 ..…
p* 300 215
‫المؤشرات‬
class Student
{
private:
string name;
int no;
public:
string getName();
void changeNo();
Memory
}; Variab Locati Value
les on
Student s; s 215 :Student
Student *p=&s; 216 name
217 no
s.getName();
218 ..…
p* 300 215
‫المؤشرات‬
class Student
{
private:
string name;
int no;
public:
string getName();
void changeNo();
Memory
}; Variab Locati Value
les on
Student s; s 215 :Student
Student *p=&s; 216 name
217 no
s.getName();
218 ..…
(*p).getName();
p* 300 215
‫المؤشرات‬
class Student
{
private:
string name;
int no;
public:
string getName();
void changeNo();
Memory
}; Variab Locati Value
les on
Student s; s 215 :Student
Student *p=&s; 216 name
217 no
s.getName();
218 ..…
(*p).getName();
p* 300 215
P->getName();
‫حجز الذاكرة‬
‫‪ ‬أتنواع حجز الذاكرة‪:‬‬
‫‪ -1‬الستاتيكية‪:‬‬
‫‪ ‬يقوم مترجم اللغة بحجز الذاكرة لجميع المتغيرات عند ترجمة البرتنامج‪.‬‬
‫‪ ‬تبقى الذاكرة محجوزة طوال فترة التنفيذ حتى وان لم تستخدم‪.‬‬
‫‪ ‬مثال‪;int x :‬‬

‫‪ -2‬الديناميكية‪:‬‬
‫‪ ‬يتم الحجز وقت تنفيذ البرتنامج‪.‬‬
‫‪ ‬يتم حجز الذاكرة التي تنحتاج لها فقط وقت التنفيذ‪.‬‬
‫‪ ‬امستخدام للذاكرة بشكل أفضل‪.‬‬
‫‪ ‬يتم امستخدام الذاكرة بالدالة )‪ (new‬وتحرر بامستخدام )‪.(delete‬‬
‫الحجز الديناميكي للذاكرة‬

 int *p;
 P= new int;

Memory
Variab Locati Value
les on
p* 1214
1215
1216
1217
1218
1219
‫الحجز الديناميكي للذاكرة‬

 int *p;
 P= new int;
 *p=10;
Memory
Variab Locati Value
les on
p* 1214 10
1215
1216
1217
1218
1219
‫الحجز الديناميكي للذاكرة‬
 int *p;
 P= new int;
 *p=10;
 *p=*p+5;
Memory
Variab Locati Value
les on
p* 1214 15
1215
1216
1217
1218
1219
‫الحجز الديناميكي للذاكرة‬
 int *p;
 P= new int;
 *p=10;
 *p=*p+5;
Memory
 int *x=new int[3]; Variab Locati Value
les on
p* 1214 15
x* 1215
1216
1217
1218
1219
‫الحجز الديناميكي للذاكرة‬
 int *p;
 P= new int;
 *p=10;
 *p=*p+5;
Memory
 int *x=new int[3]; Variab Locati Value
 for(int i=0;i<3;i++) les on
x[i]=i+2; p* 1214 15
x* 1215 2
1216 3
1217 4
1218
1219
‫الحجز الديناميكي للذاكرة‬
 int *p;
 P= new int;
 *p=10;
 *p=*p+5;
Memory
 int *x=new int[3]; Variab Locati Value
 for(int i=0;i<3;i++) les on
x[i]=i+2; p* 1214 15
1215
1216
 delete x; 1217
1218
1219
‫القوائم المتصلة‬
‫‪NULL‬‬
‫‪Head‬‬

‫‪8‬‬

‫مسلسلة من العقد المتصلة تمثل تنوع واحد من البياتنات‪.‬‬ ‫‪‬‬


‫تتكون كل عقدة من حقلين ‪:‬‬ ‫‪‬‬
‫حقل يحتوي على البياتنات المخزتنة به‪.‬‬ ‫‪‬‬

‫حقل يحتوي على عنوان العقدة التالية له أو القيمة )‪ (NULL‬اذا كاتنت اخر‬ ‫‪‬‬
‫عقدة‪.‬‬
‫القوائم المتصلة‬
:‫تعريف القائمة المتصلة‬ 
struct node
{
int data;
node* next;
};
Head
class linklist
{
private:
node* head;
public:
linklist(){head=NULL;}
. Hea
. d
void addNode(int n);
node* Search(int x);
};
‫إضافة عقدة جديدة الى بداية قائمة متصلة‬
head
void linklist::addNode(int n)
{
node* newNode= new node;
newlink->data=n;
newlink->next=head;
head=newlink; newNode n
}
‫عرض محتويات قائمة متصلة‬
void linklist::display()
{
node* current=head;
while(current != NULL)
{
cout<<current->data<<endl;
current=current->next;

}
6 8 10 12
head
‫البحث في قائمة متصلة‬
node* linklist::Search(int x)
{
node* p=head;
while (p)
if (p->data==x)
return p;
else
p=p->next;

6
return NULL; 8 10 12
}
‫إضافة عقدة جديدة داخل قائمة متصلة‬
void linklist::addNode2(int n)
{
node* newNode= new node;
node* pre= NULL;
node* current=head;
while (current!=NULL && n < (*current)->data)
{
pre=current;
current=current->next; newNode n
}
newNode->data=n;
newNode->next=current;
pre->next=newNode;
} 6 8 10 12
Head Pre Current
‫إضافة عقدة جديدة في تنهاية قائمة متصلة‬
void linklist::addNode3(int n)
{
node* newNode= new node;
newNode->data=n;
newNode->next=NULL; newNode

if (head==NULL)
head=newNode;
n
else
{
node* _node= head;
while (_node->next!=NULL)
_node=_node->next;
6 8 10 12
_node->next=newNode;
} Head End
}
‫حذف عقدة من داخل قائمة متصلة‬
int linklist::DeleteNode(int n)
{
node* pre= NULL;
node* current=head;
while (current !=NULL && n != (*current)->data)
{
pre=current;
current=current->next;
}
if (current=NULL)
return 0;
if ((pre=NULL)
head =head->next;
else
6
pre->next=current->next; 8 10 12

X
delete current;
return 1; Pre
Head Current
}
‫تنهاية‬
‫الوحدة‬
‫من أسئلة سنوت سابقة‪:‬‬

‫‪.1‬عدد محددات حقول الصنف؟ الاجابة ص ‪ 39‬و ‪2‬‬

‫‪ .2‬اذكر مساوئ لقوائم لمتصلة ؟ ص ‪ 124‬و ‪3‬‬

‫‪ .3‬اذكر مزايا القوئم المتصلة؟ ص ‪ 124‬و ‪3‬‬

‫‪ .4‬اكتب لكود لبرمجي لحذف عنصر من قائمة متصلة مع‬


‫مراعاة لحالت اجميعها؟ و ‪3‬‬

‫‪ .5‬اعط مثل على اعادة التحميل؟ و ‪ 2‬ص ‪49‬‬

‫‪ .6‬اذكر طرق حجز الذكرة؟ و ‪3‬‬

‫‪ .7‬اكتب خوازمية البحث الثنائي؟ و ‪3‬‬

‫‪ .7‬اذكر طرق تعريف لدوال السطرية مع مثال؟ و ‪ 2‬ص ‪49‬‬

‫‪ .8‬كتب كود تعريف عقدة في قائمة؟ و ‪ 3‬ص ‪125‬‬


‫االكادٌمٌة الذهبٌة لنظم المعلومات واالتصاالت‬

‫اسئلة فً مقرر برمجة ‪1‬‬


‫إعداد ‪ :‬بالل جناجرة‬
‫التخصص ‪ :‬أنظمة المعلومات الحاسوبٌة‬
‫طالب ماجستٌر تخصص علم الحاسوب‬
‫دورات متخصصة فً نظم المعلومات‬
‫اوركل واروكل دفلبر‬
‫تطوٌر وبرمجة مواقع وانظمة وٌب‬
‫تحلٌل االنظمة وهندسة البرمجٌات‬
‫مؤلفات سابقة ‪:‬‬
‫كتاب معالجة البٌانات‬
‫كتاب فً تحلٌل االنظمة وتصمٌمها وهندسة البرمجٌات‬
‫مجموعة شروحات فً تركٌب البٌانات وتصمٌم الخوارزمٌات‬
‫الوسٌط المساند فً تحلٌل االنظمة وهندسة البرمجٌات‬
‫كتاب ٌشرح مبادئ ‪SQL‬‬

‫كتاب برمجة ‪C/C++‬‬


‫مشارٌع ‪:‬‬
‫مبرمج نظام بنك االسئلة‬
‫مبرمج انظمة وٌب‬
‫مشرف انظمة التعلٌم االلكترونً فً عده مدارس‬
‫س‪ :1‬اوجد قٌمة المعادلة التالٌة من خالل ادخال قٌم المتغٌرات ‪ x=y+z+f‬؟‬
‫الحل ‪:‬‬
‫نعرف المتغيرات وندخل القيم التي نريدها ‪.‬‬

‫>‪#include<iostream.h‬‬

‫)(‪void main‬‬

‫{‬

‫;‪int x,y,z,f‬‬

‫;‪cin>>y‬‬

‫;‪cin>>z‬‬

‫;‪cin>>f‬‬

‫;‪x=y+z+f‬‬

‫;‪cout<<x<<endl‬‬

‫}‬

‫س ‪ :2‬اكتب برنامج لحساب وطباعة مساحة دائرة (‪ ) area = PI * r * r‬ومحيطها‬

‫(‪ ) circumference = 2 * PI * r‬إذا علمت أن نصف قطرها )‪ٌ(r‬ساوي ‪5.2‬‬

‫وان ‪. PI=31415926‬‬

‫الحل ‪:‬‬
‫نعرف المتغيرات‬
#include <iostream.h>

main()

float r, PI;

r = 5.2;

PI = 3.1415926;

cout<<"area = "<< PI * r * r<<"\n";

cout<<"circumference = "<< 2 * PI * r;

‫( مستطٌل وٌحسب وٌطبع‬width) ‫(وعرض‬length)‫ اكتب برنامج إلدخال طول‬: 3‫س‬

.(area=length*width)‫( ومساحته‬perimeter = 2*(length+width))‫حافة المستطٌل‬

: ‫الحل‬
#include <iostream.h>

main()

int length, width;

cout<<"length = "; cin>>length;

cout<<"width = "; cin>>width;

cout<<"perimeter = "<<2*(length+width)<<"\n";

cout<<"area = "<<length*width;

‫( ثم ٌحسب وٌطبع المعدل‬m1,m2,m3,m4)‫ اكتب برنامج لقراءة درجات أربع مواد‬:4‫س‬

.)avg = (m1+m2+m3+m4)/4(
: ‫الحل‬
#include <iostream.h>

main()

int m1, m2, m3, m4;

cout<<"Enter marks \n";

cin>>m1>>m2>>m3>>m4;

cout<<"avg = "<< (m1+m2+m3+m4)/4;

‫ وعنوانك فً وسط‬،‫ اكتب برنامج لطباعة اسمك فً السطر األول من الجهة الٌسرى‬:5‫س‬
.‫ والجنسٌة فً الجهة الٌمنى‬،‫السطر الثالث‬
: ‫الحل‬
#include <iostream.h>

main()

cout<<"belal janajreh \n\n\t\t\t";

cout<<"Palestine \t\t\t Palestinian"<<endl;

‫( ثم ٌحسبها بالمئوٌة‬f)‫ اكتب برنامج ٌقرأ درجة الحرارة بالفهرانهاٌت‬: 6‫س‬

.‫ ) وٌطبعها‬c= (f-32)*5/9 (

: ‫الحل‬
#include <iostream.h>

main()
{

float f;

cout<<"f = "; cin>>f;

cout<<"c = "<< (f-32)*5.0/9.0 <<endl;

4.5( x  2.3 y ) 2 5 x y
b ‫و‬ a  ‫ اكتب برنامج الٌجاد‬: 7‫س‬
zw z 2.7 w

: ‫الحل‬
#include <iostream.h>

#include <math.h>

main()

Float w,x,y,z;

cout<<"Enter w,x,y,z\n";

cin>>w>>x>>y>>z;

cout<<"a = \n"<< ((5+x)/z) + (y/2.7*w);

cout<<"b = "<< (4.5*pow(x+2.3*y,2)) / (z+w);

‫ ثم ٌحسب وٌطبع المسافة‬، (t)‫( والزمن‬a)‫ اكتب برنامج ٌقرأ العجلة الثابتة‬: 8‫س‬

. (v=a*t) ‫ ( والسرعة النهائٌة‬d=0.5*a*pow (t,2) (


: ‫الحل‬
#include <iostream.h>

#include <math.h>

main()

{
float a, t;

cout<<"a = "; cin>>a;

cout<<"t = "; cin>>t;

cout<<"d = \n"<< 0.5*a*pow(t,2);

cout<<"v = "<< a*t;

‫( إذا كان العدد موجب‬Positive)‫( ثم ٌطبع كلمة‬n)ً‫ اكتب برنامج ٌقرأ عدد حقٌق‬:9‫س‬

. ‫( إذا كان سالب‬Negative) ‫(أو كلمة‬n>=0(

: ‫الحل‬
#include <iostream.h>

main()

float n;

cout<<"n = "; cin>>n;

if(n>=0) cout<<"Positive"<<endl;

else cout<<"Negative"<<endl;

‫( ويرتبهما تصاعدٌا‬a,b) ‫ اكتب برنامج ٌقرأ عددٌن صحٌحٌن‬:10‫س‬


. )‫(إذا كان األول أكبر من الثانً بدل بٌن قٌمتهما‬
: ‫الحل‬
#include <iostream.h>

main()

int a, b, t;
cout<<"a = "; cin>>a;

cout<<"b = "; cin>>b;

if(a>b)

t=a; a=b; b=t;

cout<<a<<" "<<b<<endl;

(n%2!=0) ‫ اذا كان فردي‬odd ‫( ثم ٌطبع كلمة‬n)‫ اكتب برنامج ٌقرأ عدد صحٌح‬:11‫س‬

. ً‫ اذا كان زوج‬Even ‫أو كلمة‬

: ‫الحل‬
#include <iostream.h>

main()

int n;

cout<<"n = "; cin>>n;

if(n % 2 != 0) cout<<"Odd"<<endl;

else cout<<"Even"<<endl;

. ‫ اكتب برنامج لقراءة عددٌن صحٌحٌن ثم ٌطبع الرقم األكبر‬:12‫س‬


: ‫الحل‬
#include <iostream.h>

main()

{
‫;‪int a, b‬‬

‫;‪cout<<"a = "; cin>>a‬‬

‫;‪cout<<"b = "; cin>>b‬‬

‫;‪if(a>b) cout<<a‬‬

‫;‪else cout<<b<<endl‬‬

‫}‬

‫س‪ : 13‬اكتب برنامج ٌقرأ الراتب األساسً)‪(bsalary‬والمبٌعات )‪ (sales‬ثم ٌحسب‬

‫وٌطبع الراتب الصافً(الراتب األساسً ‪+(bsalary‬العمولة )‪(net salary= (comm‬‬


‫وإذا علمت أن العمولة تحسب كتالً‬
‫‪ %2 .a‬من الراتب األساسً‪ ،‬إذا كانت المبٌعات أقل أو تساوي ثالثة أضعاف الراتب األساسً‬
‫))‪(comm=0.02*bsalary, if(sales<=3*bsalary‬‬

‫‪ %3 .b‬من الراتب األساسً‪ ،‬إذا كانت المبٌعات أكثر من ثالثة أضعاف الراتب األساسً‬
‫))‪(comm=0.03*bsalary, if(sales>3*bsalary‬‬

‫‪ %5 .c‬من الراتب األساسً‪ ،‬إذا زادت المبٌعات على خمسة أضعاف الراتب األساسً‬
‫))‪(comm=0.05*bsalary, if(sales>5*bsalary‬‬

‫الحل‪:‬‬

‫>‪#include <iostream.h‬‬

‫)(‪main‬‬

‫{‬

‫;‪float bsalary, sales, comm‬‬

‫;‪cout<<"basic salary = "; cin>>bsalary‬‬

‫;‪cout<<"sales = "; cin>>sales‬‬

‫;‪if(sales>5*bsalary) comm=0.05*bsalary‬‬
else

if(sales>3*bsalary) comm=0.03*bsalary;

else

if(sales<=3*bsalary) comm=0.02*bsalary;

cout<<"net salary = "<< bsalary + comm;

. )f = n*(n-1)*(n-2) ...( ‫المضروب‬ ‫( وٌحسب وٌطبع‬n)‫ أكتب برنامج ٌقرأ عدد صحٌح‬: 14‫س‬
: ‫الحل‬
#include <iostream.h>

main()

int n, f=1;

cout<<"n = "; cin>>n;

for(int i=0; i<n; i++)

f *= (n-i);

cout<<"f = "<< f<<endl;

.4 , 4.5 , 5 , … , 9.5 , 10‫ أكتب برنامج لحساب وطباعة مجموعة األعداد‬:15‫س‬


: ‫الحل‬
#include <iostream.h>

main()

float n=4, sum=0;

do {
sum += n;

n += 0.5;

} while(n<=10);

cout<<"sum = "<< sum<<endl;

.(n) ‫( لمجموعة من األعداد الصحٌحة عددها‬avg) ‫ أكتب برنامج لحساب وطباعة المعدل‬: 16‫س‬
#include <iostream.h>

main()

int n, sum = 0, x;

cout<<"n = "; cin>>n;

for(int i=1; i<=n; i++)

cout<<"x"<<i<<" = "; cin>>x;

sum += x;

cout<<"avg = "<< sum/n<<endl;

‫ ثم‬.5 ‫ اكتب برنامج لقراءة عناصر مصفوفتٌن ذات أعداد صحٌحة عددها‬.‫ باستخدام الدوال‬: 17‫س‬
.‫( مصفوفة‬Odd)‫( والفردٌة‬Even)‫طباعة العناصر الزوجٌة‬
#include <iostream.h>

read(int ar[]) {

cout<<"Enter 5 numbers:";

for(int i=0; i<=4; i++)


cin>>ar[i];

isEven(int x) {

if(x % 2 == 0) return 1;

return 0;

isOdd(int x) {

return (!isEven(x));

printEven(int ar[]) {

cout<<"Even numbers: ";

for(int i=0; i<=4; i++)

if(isEven(ar[i])) cout<<ar[i]<<" ";

cout<<endl;

printOdd(int ar[]) {

cout<<"Odd numbers: ";

for(int i=0; i<=4; i++)

if(isOdd(ar[i])) cout<<ar[i]<<" ";

cout<<endl;

}
main() {

int a[5];

read(a);

printEven(a);

printOdd(a);

int b[5];

read(b);

printEven(b);

printOdd(b);

‫ اكتب برنامج لقراءة عناصر مصفوفتٌن ذات أعداد صحٌحة عددها‬.‫ باستخدام الدوال‬: 18‫س‬
. ‫( لكل مصفوفة‬Negative) ‫( والسالبة‬postive)‫ ثم طباعة العناصر الموجبة‬.5
: ‫الحل‬
#include <iostream.h>

read(int ar[]) {

cout<<"Enter 5 numbers:";

for(int i=0; i<=4; i++)

cin>>ar[i];

isPositive(int x) {

if(x >= 0) return 1;


return 0;

isNegative(int x) {

return (!isPositive(x));

printPositive(int ar[]) {

cout<<"Positive numbers: ";

for(int i=0; i<=4; i++)

if(isPositive(ar[i])) cout<<ar[i]<<" ";

cout<<endl;

printNegative(int ar[]) {

cout<<"Negative numbers: ";

for(int i=0; i<=4; i++)

if(isNegative(ar[i])) cout<<ar[i]<<" ";

cout<<endl;

main() {

int a[5];

read(a);

printPositive(a);
printNegative(a);

int b[5];

read(b);

printPositive(b);

printNegative(b);

‫ اكتب برنامج لقراءة عناصر مصفوفتٌن ذات أعداد حقٌقٌة عددها‬.‫ باستخدام الدوال‬: 20 ‫س‬
.‫ ثم طباعة ناتج جمع وطرح وضرب وقسمة كل عنصر من األولى مع ما ٌقابله من الثانٌة‬.5
: ‫الحل‬
#include <iostream.h>

read(float ar[]) {

cout<<"Enter 5 numbers:";

for(int i=0; i<=4; i++)

cin>>ar[i];

calc(float a[], char p, float b[], float c[]) {

for(int i=0; i<=4; i++) {

if(p=='+') c[i]=a[i]+b[i];

if(p=='-') c[i]=a[i]-b[i];

if(p=='*') c[i]=a[i]*b[i];

if(p=='/') c[i]=a[i]/b[i];
}

print(char *msg, float ar[]) {

cout<<msg;

for(int i=0; i<=4; i++)

cout<<ar[i]<<" ";

cout<<endl;

main() {

float a[5], b[5], c[5];

read(a);

read(b);

calc(a, '+', b, c);

print("Addition: ",c);

calc(a, '-', b, c);

print("Subtraction: ",c);

calc(a, '*', b, c);

print("Multiply: ",c);
calc(a, '/', b, c);

print("Diving: ",c);

.)‫ صنف حد أقصى‬50( ‫ اكتب برنامج لحساب كمٌات اصناف مخزن‬.‫ باستخدام الدوال‬:21‫س‬
‫( وذلك بادخال اسم الصنف‬in)‫إذا علمت انه ٌتم زٌادة كمٌة الصنف باختٌار عملٌة التورٌد‬

)out) ‫( إنقاص كمٌة الصنف باختٌار عملٌة الصرف‬qty)‫( والكمٌة‬name(


.‫وذلك بادخال اسم الصنف وكمٌته‬
: ‫الحل‬
#include<iostream.h>

#include<string.h>

struct ITEM {

char name[20];

int qty;

} ar[50];

int cnt=0;

read(ITEM &val) {

cout<<"Enter item name:";

cin>>val.name;

cout<<"Enter qty:";

cin>>val.qty;

search(ITEM val, int &r) {

r = -1;

for(int i=0; i<=cnt; i++)

if(strcmp(ar[i].name,val.name)==0) r=i;
}

process(char t) {

ITEM val;

read(val);

int r;

search(val,r);

if(t=='i') {

if(r != -1) ar[r].qty += val.qty;

else {

ar[cnt] = val;

cnt++;

if(t=='o') {

if(r != -1) ar[r].qty -= val.qty;

else cout<<"Item not found!\n";

print() {

for(int i=0; i<cnt; i++)

cout<<ar[i].name<<"\t"<<ar[i].qty<<"\n";

main() {

int s;

do {
‫;" ‪cout<<"(1-in 2-out 3-print 4-exit):‬‬

‫;‪cin>>s‬‬

‫;)'‪if(s==1) process('i‬‬

‫;)'‪if(s==2) process('o‬‬

‫;)(‪if(s==3) print‬‬

‫} ;)‪} while(s!=4‬‬

‫سؤال هام لمن يتقن البرمجة بشكل عام ويرجى فهمه فهذا النظام قمت ببرمجته كمشروع‬
‫لماده برمجة ‪ 1‬وهذا النظام يرجى فهمه وتطبيقه لمن يريد ان يصبح مبرمجا ‪:‬‬
‫النظام هو عبارة عن مكتبة في حالة استعارة الكتب منها‬
‫نفتح برنامج السي ونقوم باختيار ملف ‪ heder‬ونعرف به كتالي ‪:‬‬
‫‪class Book‬‬

‫{‬

‫;‪int id‬‬

‫;‪char* Name‬‬

‫;‪char* Author‬‬

‫;‪int year‬‬

‫;‪int status‬‬

‫‪public:‬‬

‫};‪Book(){ status = 0‬‬

‫;)(‪void print_book_info‬‬

‫)‪void AddBook(int i, char* n, char* a,int y‬‬

‫{‬

‫;‪id = i‬‬
Name = n;

Author = a;

year = y;

int GetBookID()

return id;

void SetStatus(int s)

status = s;

int GetStatus()

return status;

};

void Book::print_book_info()

cout<<”ID: “<<id<<endl;

cout<<”Name: “<<Name<<endl;

cout<<”Author: “<<Author<<endl;

cout<<”year: “<<year<<endl;

}
Source file ‫ثم نفتح ملف‬
: ‫نكتب فيه كتالي‬
#include <iostream.h>

#include “Book.h”

void search (Book book[5]);

void reserve_book (Book* book);

void return_book (Book* book);

void main()

Book book[5];

book[0].AddBook(1,”History”, “Ali”, 2008);

book[1].AddBook(2,”Math”, “Sameer”, 2008);

book[2].AddBook(3,”Science”, “Ahmad”, 2010);

book[3].AddBook(4,”Animals”, “Rana”, 2008);

book[4].AddBook(5,”Cars”, “Shahd”, 2008);

search(book);

void search (Book book[5])

cout<<”please insert book number to see its info. Please type 0 to exit”<<endl;

int book_no = 0;
cin >> book_no;

while(book_no !=0)

for(int i=0; i<5; i++)

if(book[i].GetBookID() == book_no) break;

if (i<5)

book[i].print_book_info();

reserve_book(&book[i]);

else cout<<”Error: book not found”<<endl;

cout<<”-----------------------------------------------------------------------“<<endl;

cout<<”please insert book number to see its info. Please type 0 to exit”<<endl;

cin >> book_no;

void reserve_book (Book* book)

char r = ‘ ‘;
if(book->GetStatus())

cout<<”book is already reserved”<<endl;

cout<<”insert r to return. Any other charachter to skip”<<endl;

cin>> r;

if(r==’r’)

return_book (book);

else

cout<<”book is avialable”<<endl;

cout<<”insert r to reserve. Any other charachter to skip”<<endl;

cin>> r;

if(r==’r’)

book->SetStatus(1);

cout<<”book is reserved successfully”<<endl;

void return_book (Book* book)

{
‫;)‪book->SetStatus(0‬‬

‫;‪cout<<”book is returned successfully”<<endl‬‬

‫}‬

‫اسئلة اتركها لكم ٌرجى محاولة حلها ‪:‬‬


‫س‪ :1‬باستخدام الدوال‪ .‬اكتب برنامج لقراءة عناصر مصفوفة أعداد صحٌحة عددها ثم‬
‫البحث عن قٌمة فً المصفوفة وطباعة اسم موقعها‪.‬‬
‫)‪.‬‬ ‫س‪ : 2‬اكتب برنامج الدارة معرض سٌارات (نفس فكرة نظام المكتبة‬

‫مـــــــــــــــــع تمنٌاتً لكم بالتوفٌق والنجاح الدائم‬

‫‪Belal janajreh‬‬
‫ﺑﺴﻢ ﺍ‪ ‬ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬

‫ﺍﻟﺪﻭﺍﻝ )ﲤﺮﻳﺮ ﺍﳌﻌﺎﻣﻼﺕ ﻭﺇﺭﺟﺎﻉ ﺍﻟﻘﻴﻢ(‬

‫‪ 3‬ﺍﺴﺘﺩﻋﺎﺀ ﺩﺍﻟﺔ ﺩﻭﻥ ﺘﻤﺭﻴﺭ ﻤﻌﺎﻤﻼﺕ ﻭﺩﻭﻥ ﺇﺭﺠﺎﻉ ﻗﻴﻤﺔ ﻟﻠـ‪main‬‬


‫ﺍﻟﺘﻌﺭﻴﻑ ﻭﺍﻟﻁﺒﺎﻋﺔ ﺩﺍﺨل ﺍﻟﺩﺍﻟﺔ ﺍﻟﻔﺭﻋﻴﺔ‪.‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬

‫;)( ‪void sum‬‬

‫)( ‪void main‬‬


‫{‬
‫;)( ‪sum‬‬

‫;)( ‪getch‬‬
‫}‬

‫)( ‪void sum‬‬


‫{‬
‫;‪int a=5,b=4‬‬
‫;‪int s = a + b‬‬
‫;)‪printf ("%d" , s‬‬
‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪9 :‬‬


main‫ ﺍﺴﺘﺩﻋﺎﺀ ﺩﺍﻟﺔ ﻤﻊ ﺘﻤﺭﻴﺭ ﻤﻌﺎﻤﻼﺕ ﻭﺩﻭﻥ ﺇﺭﺠﺎﻉ ﻗﻴﻤﺔ ﻟﻠـ‬3
.‫ ﻭﺍﻟﻁﺒﺎﻋﺔ ﺩﺍﺨل ﺍﻟﺩﺍﻟﺔ ﺍﻟﻔﺭﻋﻴﺔ‬main‫ﺍﻟﺘﻌﺭﻴﻑ ﺩﺍﺨل ﺍﻟـ‬

#include <stdio.h>
#include <conio.h>

void sum (int,int);

void main ()
{
int f=5,e=4;
sum(f,e);

getch ();
}

void sum (int a, int b)


{
int s = a + b;
printf ("%d" , s);
}

9 :‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3
‫‪ 3‬ﺍﺴﺘﺩﻋﺎﺀ ﺩﺍﻟﺔ ﺩﻭﻥ ﺘﻤﺭﻴﺭ ﻤﻌﺎﻤﻼﺕ ﻭﻤﻊ ﺇﺭﺠﺎﻉ ﻗﻴﻤﺔ ﻟﻠـ‪main‬‬
‫ﺍﻟﺘﻌﺭﻴﻑ ﺩﺍﺨل ﺍﻟﺩﺍﻟﺔ ﺍﻟﻔﺭﻋﻴﺔ ﻭﺍﻟﻁﺒﺎﻋﺔ ﻓﻲ ﺍﻟـ‪) main‬ﻭﺠﻭﺩ ﻜﻠﻤﺔ ‪(return‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬

‫;)( ‪int sum‬‬

‫)( ‪void main‬‬


‫{‬
‫;))(‪printf ("%d" , sum‬‬

‫;)( ‪getch‬‬
‫}‬

‫)( ‪int sum‬‬


‫{‬
‫;‪int a=5,b=4‬‬
‫;‪int s = a + b‬‬

‫;‪return s‬‬
‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪9 :‬‬


main‫ ﺍﺴﺘﺩﻋﺎﺀ ﺩﺍﻟﺔ ﻤﻊ ﺘﻤﺭﻴﺭ ﻤﻌﺎﻤﻼﺕ ﻭﻤﻊ ﺇﺭﺠﺎﻉ ﻗﻴﻤﺔ ﻟﻠـ‬3
.‫ ﺃﻴﻀﺎﹰ‬main‫ ﻭﺍﻟﻁﺒﺎﻋﺔ ﺩﺍﺨل ﺍﻟـ‬main‫ﺍﻟﺘﻌﺭﻴﻑ ﺩﺍﺨل ﺍﻟـ‬

#include <stdio.h>
#include <conio.h>

int sum (int,int);

void main ()
{
int f=5,e=4;
printf ("%d" , sum(f,e));

getch ();
}

int sum (int a,int b)


{
int s = a + b;

return s;
}

9 :‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3
‫التراكيب والنصناف‬

‫اعداد ‪ :‬أ‪.‬عصام حطاب‬

‫برمجة ‪1‬‬
‫منطقة طولكرم‬
‫التركيب‬
‫يتكون من مجموعة من العناصر )البيانات(المختلفة من حيث النوع‬
‫بحيث يتم التعامل معها كوحدة واحدة‬
‫الحقول(( يمكن تصور التركيب على انه سجل من البيانات‬
‫‪:‬مثال‪1‬‬
‫يمكن ان ننشا تركيبا)سجل( للموظف في الشركة بحيث يتكون من‬
‫البيانات)الحقول( التالية‪ :‬اسم الموظف ‪ ,‬رقم الموظف ‪ ,‬راتب الموظف‬
‫‪ .......‬رقم هاتف الموظف‬
‫‪:‬مثال ‪2‬‬
‫يمكن ان ننشا تركيبا لجهاز الحاسوب بحيث يتكون من نوع‬
‫‪......‬الجهاز‪,‬سعر الجهاز‪ ,‬نوع نظام التشغيل فيه‬
‫الشكل العام للتركيب في لغة ‪C++‬‬
‫اسم التركيب ‪Struct‬‬
‫{‬
‫اسم المتغير نوع المتغير‬
‫اسم المتغير نوع المتغير‬
‫‪.‬‬
‫‪.‬‬ ‫;}‬

‫اذا‪ ,‬لتعريف تركيب ما نستخدم الكلمة المحجوزة ‪struct‬‬


‫ونضع جميع مكونات ھذا التركيب ضمن قوسين ونختم التعريف‬
‫‪:‬بفاصلة منقوطة بعد القوس الثاني كالتالي‬
#include <iostream.h>
Struct ‫اسم السجل‬
{
--------;
--------;
--------; };‫ ل ننسى الفاصلة المنقوطة ھنا‬.
‫راتبه‬, ‫رقمه‬,‫عنوانه‬, ‫ لنعرف تركيب الموظف الذي يتكون من الحقول اسمه‬: 1‫مثال‬
#include <iostream.h>
struct employee
{
char name[40 ];
char address[ 40];
int no;
float salary;
};
‫الن بعد ان عرفنا هذا التركيب ‪,‬نريد ان نعرف متغير من نوع ذلك‬
‫التركيب يسمى متغير مركب‬
‫‪:‬يتم ذلك ب‪ 3‬طرق‬
‫فمثل لنعرف متغير اسمه‪ em‬على انه متغير مركب‬
‫‪:‬الطريقة الولى‬
‫>‪#include <iostream.h‬‬
‫‪struct employee‬‬
‫{‬
‫;] ‪char name[40‬‬
‫;]‪char address[ 40‬‬
‫;‪int no‬‬
‫;‪float salary‬‬
‫;‪} em‬‬
‫الطريقة الثانية‬:
Main‫داخل الدالة‬
#include <iostream.h>
struct employee
{
char name[40 ];
char address[ 40];
int no;
float salary;
};
Void main ( )
{
struct employee em;
‫الطريقة الثالثة‬:
struct ‫ لكن بدون وضع كلمة‬Main ‫ايضا داخل الدالة‬
#include <iostream.h>
struct employee
{
char name[40 ];
char address[ 40];
int no;
float salary;
};
Void main ( )
{
employee em;
‫كيفية إدخال وإخراج واسناد المعلومات داخل ھذا السجل‬
‫ل إدخال عمر الموظف فإننا نكتب‬ ‫عندما نريد مث ل‬
‫; ‪cin >> em. age‬‬
‫وعندما نريد إدخال اسم الموظف نكتب‬
‫;‪cin >> em. name‬‬
‫أما عندما نريد إخراج أي قيمة فإننا نستبدل ‪ cin‬ب ‪cout‬‬
‫ل طباعة عمر الموظف فإننا نكتب‬ ‫عندما نريد مث ل‬
‫; ‪cout<< em. age‬‬
‫عندما نريد مث ل‬
‫ل تخزين او اسناد القيمة ‪ 5‬في الحقل عمر الموظف فإننا‬
‫نكتب‬
‫;‪em. Age= 5‬‬
‫طبعا اي من هذه الجمل تكتب داخل الدالة‪main‬‬
‫‪:‬مثال عملي لبرنامج متكامل‬
‫اكتب برنامج تعرف به تركيبا لموظف بحيث يتكون من الحقول التالية‬
‫يقوم باستقبال قيم من المستخدم لتخزن بها‪ ,‬عرف متغير مركب اسمه ‪em‬‬
‫من نوع ذلك التركيب‬
‫‪ -١‬اسم الموظف‬
‫‪ -٢‬عنوانھ‬
‫‪ -٣‬عمره‬
‫‪ -٤‬راتبھ‬
#include<iostream.h>
struct employee
{
char name[20];
char address[20];
int age;
float salary;
};
void main()
{
employee em;
cout<<"enter name\n";
cin>>em.name;
cout<<"enter address\n"
cin>>em.address;
cout<<"enter age\n";
cin>>em.age;
cout<<"enter salary\n";
cin>>em.salary; }
‫مصفوفة التراكيب‬

‫قمنا من خلل المثال السابق بتعريف متغيرمركب واحد بمعنى اخر لموظف‬
‫واحد‪,‬لكن بالتاكيد يوجد في المؤسسة او الشركة اكثر من موظف‪ ,‬وكل‬
‫‪ .‬موظف له نفس الحقول السابقة‪ .‬لذا نقوم باستخدام مصفوفة التراكيب‬
‫تتشابه مصفوفة التراكيب مع غيرها من المصفوفات الخرى ال ان النوع‬
‫‪:‬يختلف فمثل‬
‫تعني هذة الجملة تعريف مصفوفة من‪ 10‬عناصر من نوع;]‪int a[10‬‬
‫عدد صحيح‬
‫تعني هذة الجملة تعريف مصفوفة من‪ 6‬عناصر من نوع]‪char z[6‬‬
‫رموز‬
‫تعريف مصفوفة من‪ 6‬عناصر من;]‪Employee em[6‬‬ ‫التركيب‬
‫نوع‬
‫‪:‬مثال عملي لبرنامج متكامل‬
‫اكتب برنامج تعرف به تركيبا لموظف بحيث يتكون من الحقول التالية‬
‫‪ -١‬اسم الموظف‬
‫‪ -٢‬عنوانھ‬
‫‪ -٣‬عمره‬
‫‪ -٤‬راتبھ‬
‫ومن ثم عرف مصفوفة من التراكيب من ‪ 10‬عناصر كل عنصر فيها‬
‫هو موظف واسند لكل )عنصر( موظف بيانات يقوم المستخدم بادخالها‬
‫ومن ثم اطبعها بشكل مناسب‬
#include<iostream.h>
struct employee
{
char name[20];
char address[20];‫تعريف التركيب‬
int age;
float salary;
};
void main()
{
employee em[10];‫تعريف مصفوفة التراكيب‬
for(int i=0;i<9;i++)
{
cout<<"enter name\n";
cin>>em[i].name;
cout<<"enter address\n";
cin>>em[i].address;
cout<<"enter age\n";
cin>>em[i].age;
cout<<"enter salary\n";
cin>>em[i].salary;
}
for(i=0;i<9;i++)
cout<<em[i].name<<em[i].address<<em[i].age<<em[i].salary<<"\n
‫الدوال و التراكيب‬
‫يتم التعامل مع التراكيب من خلل الدوال تماما مثل التعامل مع‬
‫المتغيرات الخرى مع الدوال‬
‫‪:‬لناخذ المثلة التالية‬
‫‪#include<iostre‬‬ ‫>‪#include<iostream.h‬‬
‫>‪am.h‬‬ ‫‪struct employee{int no; char‬‬
‫;};]‪name[5‬‬
‫)‪void func(int x‬‬ ‫)‪void func(employee x‬‬
‫};‪{cout<< x‬‬ ‫};‪{cout<< x.no‬‬
‫)( ‪void main‬‬ ‫)( ‪void main‬‬
‫{‬ ‫{‬
‫;‪int a‬‬ ‫;‪employee a‬‬
‫;‪cin >>a‬‬ ‫;‪cin >>a.no‬‬
‫;)‪func(a‬‬ ‫;)‪func(a‬‬
‫}‬ ‫}‬

‫لحظ ان طريقة التعامل مع الدوال نفسها في كل البرنامجين ال ان‬


‫هناك اختلف في نوع المعاملت الممررة‬
‫ففي البرنامج الول كانت من نوع العدد الصحيح اما الثاني فهي من‬
‫نوع تركيب‬
‫ستكون النتيجة لكل البرنامجين هي طباعة الرقم الذي يدخله المستخدم‬
‫تتبع البرنامجين التاليين واكتب ناتج تنفيذهما‬:‫سؤال‬
#include<iostream.h>
struct fruit{float price ; int quant;};
int increase_quant (fruit f,int t){f.quant +=
t; return f.quant;}
void print(fruit x) {cout<<x.quant;}

void main ()
{
fruit orange;
orange.quant =25;
orange.price=2;
increase_quant(orange,75);
print(orange);
}
#include<iostream.h>
struct fruit{float price ; int quant;};
int increase_quant (fruit f,int t){f.quant +=
t; return f.quant;}
void print(fruit x) {cout<<x.quant;}

void main ()
{
fruit orange;
orange.quant =25;
orange.price=2;
orange.quant=increase_quant(orange,75);
print(orange);
}

‫ما السبب؟؟؟‬, ‫اختلف ناتج تنفيذ البرنامج الول عن الثاني‬:‫ملحظة هامة‬


‫عند تنفيذ البرنامج الول فان نتيجة تنفيذ الدالة‪Increase_quant‬‬
‫ل يخزن في مكان معين فالنتيجة هي ‪Return f.quant‬‬
‫ام نتيجة تنفيذ الدالة‪Increase_quant‬في البرنامج الثاني فسيحفظ‬
‫في المتغير ‪orange .quant‬‬
‫ تتبع تنفيذ البرنامج التالي‬:‫سؤال‬:
#include<iostream.h>
struct student { int no; int mark[3]; };
void main() {
student st[2];
for (int i=0;i<=1;i++)
{cout<< "enter the student number";
cin >>st[i].no;
for (int j=0;j<=2;j++)
{cout<<"enter the marks for student
number"<<st[i].no;
cin>>st[i].mark[j]; } }
for (int h=0;h<=1;h++)
{cout <<"\nstudent number
is :"<<st[h].no<<"\n" ;
cout<<"marks are:\t" ;
for(int z=0;z<=2;z++)
‫الكائنات والنصناف‬
‫الكائن‪:‬مجموعة من البيانات )الخصائص( و العمليات التي تجري‬
‫على هذه البيانات او الخصائص‬
‫من ناحية برمجية الكائن هو ‪ :‬مجموعة من المتغيرات و الدوال التي‬
‫تعالج تلك المتغيرات‬
‫‪ :‬مثال‪ :1‬كائن البيت يتكون من‬
‫‪:‬المتغيرات‬ ‫‪:‬الخصائص او البيانات‬
‫;‪Int no‬‬ ‫رقم البيت‬
‫‪Float price‬‬ ‫سعر البيت‬
‫‪Float area‬‬ ‫مساحة البيت‬
‫‪:‬العمليات‬ ‫‪:‬العمليات‬
‫}( ‪Print‬‬ ‫اظهار رقم البيت‬
‫)(‪Area‬‬ ‫ايجاد المساحة‬
‫)(‪Pri‬‬ ‫ايجاد السعر‬
‫الصنف‪ :‬تجميع للكائنات ذات الخصائص والفعال المشتركة‬
‫فهو التعريف او المكان الذي يصنع الكائن منه‬
‫البيوت صنف‬ ‫مثال‪ :‬البيت كائن‬
‫السيارات صنف‬ ‫السيارة كائن‬
‫حيث ان الكائن ياتي من الصنف فل بد لتعريف الصنف اول لنشاء‬
‫الكائن الذي نريد‬
‫{ اسم الصنف‪class‬‬
‫‪Private:‬‬
‫;اسم المتغير نوع المتغير‬ ‫الشكل العام للصنف في‪C++‬‬
‫;اسم المتغير نوع المتغير‬
‫‪Public:‬‬
‫;)( اسم الدالة نوع الدالة‬
‫اسم الدالة نوع الدالة‬
‫;} ;)(‬
‫لناخذ المثال السابق ونعرف الصنف تمهيدا لنشاء كائن او كائنات‬
‫ذلك الصنف‬
#include<iostream.h>
class houses {
‫المثال هو صنف البيوت‬
private:
int no;
float price;
float area;
public:
void print();
float price();
float area(); };
‫لناخذ مثال اخر ونعرف الصنف تمهيدا لنشاء كائن او كائنات ذلك‬
‫>‪#include<iostream.h‬‬ ‫الصنف‬
‫{‪class rectangle‬‬ ‫المثال هو صنف المستطيل‬
‫; ‪int x,y‬‬
‫‪public:‬‬
‫;)‪void set (int,int‬‬
‫;)(‪int area‬‬
‫;}‬

‫‪:‬لحظ ما يلي‬
‫اننا لم نضع الكلمة‪ private‬و هذا جائز بلغة ‪C++‬ل ن المترجم يتعرف عليها تلقائيا‬
‫الدالة‪Void set‬لم نضع المعاملت لكن النوع ضروري وضعه‬
‫الن وبعد تعريفنا للصنف نريد ان ننشا كائن ويتم ذلك وفق الصيغة‬
‫التالية‬:
‫; اسم الكائن اسم الصنف‬ main‫داخل الدالة‬
1 ‫المثال‬
2 ‫المثال‬ #include<iostream.h>
#include<iostream.h> class houses {
class rectangle{ private:
int no;
int x,y ; float pric;
public: float ar;
void set (int,int); public:
int area(); void print();
}; float price();
float area(); };
void main(){
rectangle rec ; void main (){
houses hous;
‫واذا اردنا ان نعرف اكثر من كائن للصنف فيتم ذلك بنفس الطريقة‬
‫السابقة لكن مع فصل الكائنات بفواصل اي مثل تعريف المتغيرات‬
#include<iostream.h> ‫العادية‬
class houses {
private: ‫مثال‬:
int no;
float pric;
float ar;
public:
void print();
float price();
float area(); };

void main (){


houses
hous1,hous2,hous3 ;
‫الن وبعد ان قمنا بانشاء الكائنات التي نريدها‪ ,‬نريد ان نتعامل مع‬
‫‪.‬تلك المتغيرات المنتمية والمعرفة بالصنف‬
‫هل نستطيع ان نتعامل معها من خلل دالة‪main‬كما هو الحال بالتراكيب‬
‫>‪#include<iostream.h‬‬ ‫‪:‬اي كما في المثال التالي‬
‫{ ‪class houses‬‬
‫‪private:‬‬ ‫الجواب‪ :‬بالطبع ل‬
‫;‪int no‬‬ ‫فالجمل الخيرة خاطئة‬
‫;‪float pric‬‬
‫;‪float ar‬‬ ‫حيث ل يمكن للدالة‪main‬‬
‫‪public:‬‬
‫;)(‪void print‬‬
‫رؤية المتغيرات المنتمية‬
‫;)(‪float price‬‬ ‫المعرفة بالقسم الخاص‬
‫;} ;)( ‪float area‬‬
‫{)( ‪void main‬‬
‫; ‪houses hous‬‬
‫;‪hous . Pric=4‬‬
‫;‪cout<< pric‬‬
‫انما يتم التعامل معهم من خلل الدوال المنتمية والمعرفة في القسم‬
‫العام‪public‬‬
‫>‪#include<iostream.h‬‬
‫{ ‪class houses‬‬ ‫‪:‬لحظ الفرق‬
‫‪private:‬‬
‫;‪int no;float pric;float ar‬‬ ‫الدوال المنتمية والمعرفة‬
‫‪public:‬‬
‫};‪void print(){cout<<pric‬‬
‫بالقسم العام هي المخولة‬
‫};‪float price(){return pric=4‬‬ ‫والمسموح لها التعامل‬
‫;} ;)( ‪float area‬‬
‫{)( ‪void main‬‬ ‫مع المتغيرات المنتمية في‬
‫; ‪houses hous‬‬ ‫القسم الخاص‬
‫;)(‪hous .price‬‬
‫;)(‪hous.print‬‬
‫}‬
‫ اكتب برنامجا يقوم بايجاد المساحة لمستطيلين الطول والعرض‬:‫سؤال‬
‫باستخدام الصناف‬3,9 ‫ و‬2,6 ‫لهما‬
#include<iostream.h>
class rectangles { ‫الجواب‬:
private:
float length;float width;
public:
void area(float x ,float y)
{length=x; width=y;
cout<<"the area is
"<<length*width<<"\n";} };

void main (){


rectangles rec1,rec2 ;
rec1 .area(2,6);
rec2.area(3,9);
}
‫لحظ ان هذه الدالة تم العلن عنها وتعريف جسمها في نفس المكان‬
#include<iostream.h> ‫لذا هي من النوع‬
class rectangles {
private: ‫دالة سطرية‬
float length;float width;
public:
void area(float x ,float ‫هناك طريقة اخرى لتعريف‬
y)
{length=x; width=y; ‫الدالة وهي ان نعلن عنها فقط‬
cout<<"the area is ‫ونعرف جسمها لحقا‬
"<<length*width<<"\n";
} }; ‫كما في المثال اللحق‬

void main (){


rectangles rec1,rec2 ;
rec1 .area(2,6);
rec2.area(3,9);
#include<iostream.h>
‫لحظ ان الدالة تم العلن‬
class rectangles { ‫عنها فقط‬
private:
float length;float width;
public: ‫ولحقا تم تعريف جسمها‬
void area(float x ,float y); };

void main (){


rectangles rec1,rec2 ; ‫وهنا ملحظة هامة اننا نضع‬
rec1 .area(2,6); ‫ اسم الصنف متبوعا ب‬::
rec2.area(3,9);
} ‫وبعدها اسم الدالة والمعاملت‬
void rectangles:: area(float
x ,float y)
{length=x;width=y;
cout<<"the area is
"<<length*width<<"\n";}
‫كل البرنامجين السابقين وان اختلفت طريقة تعريف الدالة فانهما‬
‫يعطيان نفس المخرجات ال انه في البرنامج الول تم العلن‬
‫وتعريف جسم الدالة معا)في ان واحد( اي انها دالة سطرية‬
‫لكن السؤال هل نستطيع في البرنامج الثاني البقاء على تعريف الدالة‬
‫كما هو)اعلنها مسبقا وتعريفها لحقا( مع جعلها دالة سطرية‬
‫الجواب نعم‬
‫‪:‬فجعل الدالة سطرية يتم بطريقتين‬
‫فالطريقة الولى ‪ :‬كما هو الحال في البرنامج الول العلن عنها‬
‫وتعريف جسمها معا‬
‫الطريقة الثانية‪ :‬ان نضيف‪:inline‬كما هو الحال في المثال التالي‬
‫كلمة‬
#include<iostream.h> ‫لحظ ان الدالة تم العلن‬
class rectangles {
private: ‫عنها فقط‬
float length;float width;
public:
void area(float x ,float y); ‫ولحقا تم تعريف جسمها‬
};

inline void rectangles:: ‫وهنا خارج الصنف‬


area(float x ,float y)
{length=x;width=y; main ‫ لكن قبل‬inline ‫نضع كلمة‬
cout<<"the area is
"<<length*width<<"\n";}
‫لنجعلها سطرية‬
void main (){
rectangles rec1,rec2 ;
rec1 .area(2,6);
rec2.area(3,9);
‫‪:‬الدالة البناءة‬
‫في البرامج السابقة قمنا بانشاء كائنات من الصناف حسب الطريقة‬
‫‪:‬اسم الصنف متبوعا باسم الكائن والفاصلة المنقوطة كما في التالي‬
‫‪#include<iostr‬‬ ‫لكن هذه الطريقة صحيحة طالما‬
‫>‪eam.h‬‬
‫‪class‬‬ ‫انه ل يوجد دالة بناءة في البرنامج‬
‫{‪rectangle‬‬ ‫او انه يوجد بناء لكن ل ياخذ عوامل‬
‫; ‪int x,y‬‬
‫‪public:‬‬ ‫لكن كيف عرفنا انه ل يوجد دالة بناءة‬
‫‪void set‬‬
‫;)‪(int,int‬‬
‫وما هي الدالة البناءة؟‬
‫;)(‪int area‬‬ ‫الدالة البناءة دالة تعطي المتغيرات المنتمية قيما‬
‫;}‬
‫ابتدائية ويكون اسمها نفس اسم الصنف وليس‬
‫{)(‪void main‬‬
‫لها نوع اي انهال تسبق ب ‪int ,float ,void‬‬
‫; ‪rectangle rec‬‬
‫‪#include<iostrea‬‬ ‫لحظ ان الجملة انشاء الكائن صحيحة‬
‫>‪m.h‬‬
‫{ ‪class houses‬‬
‫بالرغم من وجود الدالة البناءة‬
‫‪private:‬‬ ‫‪ :‬وعرفنا انها دالة بناءة‬
‫;‪int no‬‬
‫;‪float pric‬‬
‫لنها تاخذ نفس اسم الصنف‬
‫;‪float ar‬‬ ‫لنها غير مسبوقة بنوع الدالة‬
‫‪public:‬‬
‫)( ‪houses‬‬
‫لكن لماذا كانت جملة انشاء الكائن صحيحة‬
‫};‪{no=5‬‬ ‫بالرغم من وجود الدالة البناءة؟‬
‫)(‪void print‬‬ ‫الجواب‪ :‬لنها ل تاخذ عوامل انما قيمة‬
‫;};‪{cout<<no‬‬
‫;}‬ ‫ثابته هي‪5‬‬
‫فلو ان البناء كان ياخذ معاملت بالشكل التالي‬
‫{)( ‪void main‬‬
‫;‪houses hous‬‬ ‫};‪houses (int x){no=x‬‬
‫لكانت جملة انشاء الكائن السابقة خاطئة‬
‫};)(‪hous.print‬‬
#include<iostream.h> ‫لحظ ان جملة انشاء الكائن‬
class houses {
private: ‫خاطئة‬
int no;
float pric;
‫لن الدالة البناءة موجودة وتاخذ‬
float ar; X,y‫عوامل‬
public:
houses (int x, float y)
{no=x; pric=y;}
void print(){cout<<no;};
};

void main (){


houses hous;

hous.print();}
‫‪#include<iostream.‬‬ ‫قلنا انه في حالة ل يوجد دالة بناءة او انها‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫توجد‬
‫‪private:‬‬ ‫لكن بدو ن ا ن تاخذ معاملت فا ن جملة انشاء‬
‫;‪int no‬‬
‫;‪float pric‬‬ ‫الكائن نصحيحة‪ ,‬لكن كيف ننشا الكائن في‬
‫;‪float ar‬‬ ‫حالة وجود دالة بناءة وبها معاملت؟؟‬
‫‪public:‬‬
‫‪houses (int x, float‬‬
‫‪:‬الجواب‬
‫};‪y) {no=x;pric=y‬‬ ‫هو ا ن ننشا كائن واستدعاء البناء واسناد‬
‫)(‪void print‬‬ ‫القيم مباشرة‬
‫;};‪{cout<<no‬‬
‫;}‬ ‫‪:‬لحظ المثال التالي‬
‫الدالة البناءة تضمت معاملت هي‪X,y‬‬
‫{)( ‪void main‬‬
‫;)‪houses hous(5,3‬‬ ‫وليس قيم لذا عندما اردنا انشاء كائن قد تطلب‬
‫منا ا ن نستدعي البناء ونسند القيم مباشرة‬
‫};)(‪hous.print‬‬
‫‪#include<iostream.‬‬ ‫مثال اخر على البناء‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫هل كا ن انشاء الكائن بهذه الطريقة‬
‫‪private:‬‬
‫;‪int no‬‬
‫نصحيح بدو ن ا ن نستدعي البناء ونسند‬
‫;‪float pric‬‬ ‫الى المتغيرات قيم كما في المثال السابق‬
‫;‪float ar‬‬
‫‪public:‬‬
‫)( ‪houses‬‬ ‫الجواب‪ :‬نعم نصحيحة طالما انها لم تاخذ‬
‫};‪{no=0;pric=0‬‬
‫)(‪void print‬‬ ‫معاملت‬
‫;};‪{cout<<no‬‬
‫;}‬ ‫فهنا تم اسناد قيم للمتغيرات وهي‪0,0‬‬
‫وليس معاملت مثل‪X,y‬لذا فجملة انشاء‬
‫{)( ‪void main‬‬
‫;‪houses hous‬‬ ‫الكائن صحيحة‬
‫};)(‪hous.print‬‬
‫‪#include<iostream.‬‬ ‫هل نستطيع ان نعرف الدالة البناءة‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫بطريقة اخرى اي ان البناء في كل‬
‫‪private:‬‬
‫;‪int no‬‬
‫المثلة السابقة كان دالة سطرية لنه تم‬
‫;‪float pric‬‬ ‫العلن عنه وتعريف جسمه معا‬
‫;‪float ar‬‬
‫‪public:‬‬ ‫‪:‬الجواب‬
‫;)( ‪houses‬‬ ‫نعم هناك الطريقة الخرى وهي‬
‫)(‪void print‬‬
‫;};‪{cout<<no‬‬ ‫ان نعلن عنه فقط ونعرف جسمه لحقا‬
‫;}‬
‫كما في الدالت الخرى‬
‫{)( ‪void main‬‬ ‫لحظ نفس البناء السابق قمنا بكتابته‬
‫;‪houses hous‬‬
‫بالطريقة الخرى‬
‫};)(‪hous.print‬‬
‫)(‪houses::houses‬‬
‫‪#include<iostream.‬‬ ‫‪:‬الدالة الهدامة‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫~ ويكو ن اسمها نفس اسم الصنف لكن مسبوقا باشارة‬
‫‪private:‬‬ ‫و ليس لها نوع اي انهال تسبق ب ‪int ,float ,void‬‬
‫;‪int no‬‬
‫اليك المثال التالي وهو نفس المثال السابق‬
‫;‪float pric‬‬
‫;‪float ar‬‬ ‫لكن بوجود هدام‬
‫‪public:‬‬
‫;)( ‪houses‬‬ ‫‪:‬لحظ ما يلي‬
‫}{)(‪~houses‬‬ ‫الدالة الهدامة تاخذ نفس اسم الصنف‬
‫)(‪void print‬‬
‫;};‪{cout<<no‬‬ ‫~ مسبوقا باشارة‬
‫;}‬
‫تعريف جسمها فارغ اي يكون}{‬
‫{)( ‪void main‬‬ ‫استدعاؤها مثل استدعاء الدوال المنتمية‬
‫;‪houses hous‬‬
‫;)(‪hous.~houses‬‬ ‫الخرى اي من خلل اسم الكائن متبوعا‬
‫};)(‪hous.print‬‬ ‫باسم هذه الدالة‬
‫‪#include<iostream.‬‬ ‫هل نستطيع ان نعرف الدالة الهدامة‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫بطريقة اخرى اي ان الهدام في‬
‫‪private:‬‬
‫;‪int no‬‬
‫المثال السابق كان دالة سطرية لنه تم‬
‫;‪float pric‬‬ ‫العلن عنه وتعريف جسمه معا‬
‫;‪float ar‬‬
‫‪public:‬‬ ‫‪:‬الجواب‬
‫;)( ‪houses‬‬ ‫نعم هناك الطريقة الخرى وهي‬
‫;)(‪~houses‬‬
‫)(‪void print‬‬ ‫ان نعلن عنه فقط ونعرف جسمه لحقا‬
‫;};‪{cout<<no‬‬
‫;}‬ ‫كما في الدالت الخرى‬
‫لحظ نفس الهدام السابق لكن قمنا بكتابته‬
‫{)( ‪void main‬‬
‫;‪houses hous‬‬ ‫بالطريقة الخرى‬
‫;)(‪hous.~houses‬‬
‫};)(‪hous.print‬‬
‫>‪#include<iostream.h‬‬ ‫اعادة التحميل للدوال‬
‫{ ‪class houses‬‬
‫‪private:‬‬ ‫اي اننا نستطيع تعريف اكثر من دالة لها‬
‫;‪int no‬‬ ‫نفس السم لكن يختلفو ن في عدد المعاملت‬
‫;‪float pric‬‬ ‫وهذا ينطبق على الدالة البناءة‬
‫;‪float ar‬‬ ‫اي يمكن ا ن نعرف اكثر من بناء لكن‬
‫‪public:‬‬ ‫يختلفو ن بعدد المعاملت‬
‫};‪houses (){no=pric=2‬‬ ‫‪:‬لحظ ما يلي‬
‫) ‪houses(int x,float‬‬ ‫لدينا بناءين يختلفو ن في عدد المعاملت‬
‫};‪{no=x;pric=y‬‬
‫لحظ انا انشانا كائنا جديدا بهذه الطريقة اي‬
‫)(‪void print‬‬
‫};‪{cout<<no<<pric‬‬ ‫بدو ن استدعاء البناء واسناد قيم وهذا جائز‬
‫;}‬ ‫ل ن البناء الموجود يسند قيمة ثابته هي‪2‬‬
‫{)( ‪void main‬‬ ‫وليس معاملت‬
‫;‪houses hous‬‬ ‫في حين اننا انشانا كائنا اخر بالطريقة الخرى‬
‫;)‪houses hous1(3,5‬‬ ‫لنه لو تم انشاؤه بالطريقة الخرى سيكو ن‬
‫;)(‪hous.print‬‬ ‫خاطئا لنه يتضمن معاملت هي‪X,y‬‬
‫;)(‪hous1.print‬‬
‫‪#include<iostream.‬‬ ‫‪:‬سؤال‬
‫>‪h‬‬
‫‪class student‬‬ ‫‪:‬لديك تعريف صنف الطالب التالي‬
‫{‬ ‫عرف دالة بناءة لسناد المتغيرات المنتمية‬
‫‪private :‬‬
‫;‪int stud_no‬‬
‫بقيم ابتدائية‬
‫;‪float stud_avg‬‬ ‫اكتب تعريفا لجسم الدالة ‪setup‬لتستقبل‬
‫قيم رقم الطالب و معدله من المستخدم‬
‫‪public:‬‬
‫;)(‪void setup‬‬ ‫اكتب تعريفا لجسم الدالة‪print‬لتقوم‬
‫;)(‪void print‬‬ ‫بطباعة رقم الطالب ومعدله‬
‫;}‬
‫اجعل الدالة ‪Print‬دالة سطرية‬
‫عرف كائنا من ذلك الصنف وسمه‪st‬‬
‫استدع الدوال السابقة من داخل الدلة ‪main‬‬
#include<iostream.h>
class student{
private :
int stud_no;
float stud_avg;
public:
student(int x,int y){stud_no=x; stud_avg=y;}
void setup();
void print(); } ;
inline void student::print() {cout<<"\n";
cout<<"the student number is "<<stud_no<<"\n";
cout<<"the student average is";
cout<<stud_avg; }

void main(){
student st(102,66);
st.setup();
st.print();}
void student::setup(){ cout<<"enter no" ;
cin >>stud_no ;
cout<<"enter avg";
cin>>stud_avg; }
‫التراكيب والنصناف‬

‫معاذ أبو الهيجاء‬

‫برمجة ‪1‬‬
‫التركيب‬
‫يتكون من مجموعة من العناصر )البيانات(المختلفة من حيث النوع‬
‫بحيث يتم التعامل معها كوحدة واحدة‬
‫الحقول(( يمكن تصور التركيب على انه سجل من البيانات‬
‫‪:‬مثال‪1‬‬
‫يمكن ان ننشا تركيبا)سجل( للموظف في الشركة بحيث يتكون من‬
‫البيانات)الحقول( التالية‪ :‬اسم الموظف ‪ ,‬رقم الموظف ‪ ,‬راتب الموظف‬
‫‪ .......‬رقم هاتف الموظف‬
‫‪:‬مثال ‪2‬‬
‫يمكن ان ننشا تركيبا لجهاز الحاسوب بحيث يتكون من نوع‬
‫‪......‬الجهاز‪,‬سعر الجهاز‪ ,‬نوع نظام التشغيل فيه‬
‫الشكل العام للتركيب في لغة ‪C++‬‬
‫اسم التركيب ‪Struct‬‬
‫{‬
‫اسم المتغير نوع المتغير‬
‫اسم المتغير نوع المتغير‬
‫‪.‬‬
‫‪.‬‬ ‫;}‬

‫اذا‪ ,‬لتعريف تركيب ما نستخدم الكلمة المحجوزة ‪struct‬‬


‫ونضع جميع مكونات ھذا التركيب ضمن قوسين ونختم التعريف‬
‫‪:‬بفاصلة منقوطة بعد القوس الثاني كالتالي‬
#include <iostream.h>
Struct ‫اسم السجل‬
{
--------;
--------;
--------; };‫ ل ننسى الفاصلة المنقوطة ھنا‬.
‫راتبه‬, ‫رقمه‬,‫عنوانه‬, ‫ لنعرف تركيب الموظف الذي يتكون من الحقول اسمه‬: 1‫مثال‬
#include <iostream.h>
struct employee
{
char name[40 ];
char address[ 40];
int no;
float salary;
};
‫الن بعد ان عرفنا هذا التركيب ‪,‬نريد ان نعرف متغير من نوع ذلك‬
‫التركيب يسمى متغير مركب‬
‫‪:‬يتم ذلك ب‪ 3‬طرق‬
‫فمثل لنعرف متغير اسمه‪ em‬على انه متغير مركب‬
‫‪:‬الطريقة الولى‬
‫>‪#include <iostream.h‬‬
‫‪struct employee‬‬
‫{‬
‫;] ‪char name[40‬‬
‫;]‪char address[ 40‬‬
‫;‪int no‬‬
‫;‪float salary‬‬
‫;‪} em‬‬
‫الطريقة الثانية‬:
Main‫داخل الدالة‬
#include <iostream.h>
struct employee
{
char name[40 ];
char address[ 40];
int no;
float salary;
};
Void main ( )
{
struct employee em;
‫الطريقة الثالثة‬:
struct ‫ لكن بدون وضع كلمة‬Main ‫ايضا داخل الدالة‬
#include <iostream.h>
struct employee
{
char name[40 ];
char address[ 40];
int no;
float salary;
};
Void main ( )
{
employee em;
‫كيفية إدخال وإخراج واسناد المعلومات داخل ھذا السجل‬
‫ل إدخال عمر الموظف فإننا نكتب‬ ‫عندما نريد مث ل‬
‫; ‪cin >> em. age‬‬
‫وعندما نريد إدخال اسم الموظف نكتب‬
‫;‪cin >> em. name‬‬
‫أما عندما نريد إخراج أي قيمة فإننا نستبدل ‪ cin‬ب ‪cout‬‬
‫ل طباعة عمر الموظف فإننا نكتب‬ ‫عندما نريد مث ل‬
‫; ‪cout<< em. age‬‬
‫عندما نريد مث ل‬
‫ل تخزين او اسناد القيمة ‪ 5‬في الحقل عمر الموظف فإننا‬
‫نكتب‬
‫;‪em. Age= 5‬‬
‫طبعا اي من هذه الجمل تكتب داخل الدالة‪main‬‬
‫‪:‬مثال عملي لبرنامج متكامل‬
‫اكتب برنامج تعرف به تركيبا لموظف بحيث يتكون من الحقول التالية‬
‫يقوم باستقبال قيم من المستخدم لتخزن بها‪ ,‬عرف متغير مركب اسمه ‪em‬‬
‫من نوع ذلك التركيب‬
‫‪ -١‬اسم الموظف‬
‫‪ -٢‬عنوانھ‬
‫‪ -٣‬عمره‬
‫‪ -٤‬راتبھ‬
#include<iostream.h>
struct employee
{
char name[20];
char address[20];
int age;
float salary;
};
void main()
{
employee em;
cout<<"enter name\n";
cin>>em.name;
cout<<"enter address\n"
cin>>em.address;
cout<<"enter age\n";
cin>>em.age;
cout<<"enter salary\n";
cin>>em.salary; }
‫مصفوفة التراكيب‬

‫قمنا من خلل المثال السابق بتعريف متغيرمركب واحد بمعنى اخر لموظف‬
‫واحد‪,‬لكن بالتاكيد يوجد في المؤسسة او الشركة اكثر من موظف‪ ,‬وكل‬
‫‪ .‬موظف له نفس الحقول السابقة‪ .‬لذا نقوم باستخدام مصفوفة التراكيب‬
‫تتشابه مصفوفة التراكيب مع غيرها من المصفوفات الخرى ال ان النوع‬
‫‪:‬يختلف فمثل‬
‫تعني هذة الجملة تعريف مصفوفة من‪ 10‬عناصر من نوع;]‪int a[10‬‬
‫عدد صحيح‬
‫تعني هذة الجملة تعريف مصفوفة من‪ 6‬عناصر من نوع]‪char z[6‬‬
‫رموز‬
‫تعريف مصفوفة من‪ 6‬عناصر من;]‪Employee em[6‬‬ ‫التركيب‬
‫نوع‬
‫‪:‬مثال عملي لبرنامج متكامل‬
‫اكتب برنامج تعرف به تركيبا لموظف بحيث يتكون من الحقول التالية‬
‫‪ -١‬اسم الموظف‬
‫‪ -٢‬عنوانھ‬
‫‪ -٣‬عمره‬
‫‪ -٤‬راتبھ‬
‫ومن ثم عرف مصفوفة من التراكيب من ‪ 10‬عناصر كل عنصر فيها‬
‫هو موظف واسند لكل )عنصر( موظف بيانات يقوم المستخدم بادخالها‬
‫ومن ثم اطبعها بشكل مناسب‬
#include<iostream.h>
struct employee
{
char name[20];
char address[20];‫تعريف التركيب‬
int age;
float salary;
};
void main()
{
employee em[10];‫تعريف مصفوفة التراكيب‬
for(int i=0;i<9;i++)
{
cout<<"enter name\n";
cin>>em[i].name;
cout<<"enter address\n";
cin>>em[i].address;
cout<<"enter age\n";
cin>>em[i].age;
cout<<"enter salary\n";
cin>>em[i].salary;
}
for(i=0;i<9;i++)
cout<<em[i].name<<em[i].address<<em[i].age<<em[i].salary<<"\n
‫الدوال و التراكيب‬
‫يتم التعامل مع التراكيب من خلل الدوال تماما مثل التعامل مع‬
‫المتغيرات الخرى مع الدوال‬
‫‪:‬لناخذ المثلة التالية‬
‫‪#include<iostre‬‬ ‫>‪#include<iostream.h‬‬
‫>‪am.h‬‬ ‫‪struct employee{int no; char‬‬
‫;};]‪name[5‬‬
‫)‪void func(int x‬‬ ‫)‪void func(employee x‬‬
‫};‪{cout<< x‬‬ ‫};‪{cout<< x.no‬‬
‫)( ‪void main‬‬ ‫)( ‪void main‬‬
‫{‬ ‫{‬
‫;‪int a‬‬ ‫;‪employee a‬‬
‫;‪cin >>a‬‬ ‫;‪cin >>a.no‬‬
‫;)‪func(a‬‬ ‫;)‪func(a‬‬
‫}‬ ‫}‬

‫لحظ ان طريقة التعامل مع الدوال نفسها في كل البرنامجين ال ان‬


‫هناك اختلف في نوع المعاملت الممررة‬
‫ففي البرنامج الول كانت من نوع العدد الصحيح اما الثاني فهي من‬
‫نوع تركيب‬
‫ستكون النتيجة لكل البرنامجين هي طباعة الرقم الذي يدخله المستخدم‬
‫تتبع البرنامجين التاليين واكتب ناتج تنفيذهما‬:‫سؤال‬
#include<iostream.h>
struct fruit{float price ; int quant;};
int increase_quant (fruit f,int t){f.quant +=
t; return f.quant;}
void print(fruit x) {cout<<x.quant;}

void main ()
{
fruit orange;
orange.quant =25;
orange.price=2;
increase_quant(orange,75);
print(orange);
}
#include<iostream.h>
struct fruit{float price ; int quant;};
int increase_quant (fruit f,int t){f.quant +=
t; return f.quant;}
void print(fruit x) {cout<<x.quant;}

void main ()
{
fruit orange;
orange.quant =25;
orange.price=2;
orange.quant=increase_quant(orange,75);
print(orange);
}

‫ما السبب؟؟؟‬, ‫اختلف ناتج تنفيذ البرنامج الول عن الثاني‬:‫ملظحظة هامة‬


‫عند تنفيذ البرنامج الول فان نتيجة تنفيذ الدالة‪Increase_quant‬‬
‫ل يخزن في مكان معين فالنتيجة هي ‪Return f.quant‬‬
‫ام نتيجة تنفيذ الدالة‪Increase_quant‬في البرنامج الثاني فسيحفظ‬
‫في المتغير ‪orange .quant‬‬
‫ تتبع تنفيذ البرنامج التالي‬:‫سؤال‬:
#include<iostream.h>
struct student { int no; int mark[3]; };
void main() {
student st[2];
for (int i=0;i<=1;i++)
{cout<< "enter the student number";
cin >>st[i].no;
for (int j=0;j<=2;j++)
{cout<<"enter the marks for student
number"<<st[i].no;
cin>>st[i].mark[j]; } }
for (int h=0;h<=1;h++)
{cout <<"\nstudent number
is :"<<st[h].no<<"\n" ;
cout<<"marks are:\t" ;
for(int z=0;z<=2;z++)
‫الكائنات والنصناف‬
‫الكائن‪:‬مجموعة من البيانات )الخصائص( و العمليات التي تجري‬
‫على هذه البيانات او الخصائص‬
‫من ناحية برمجية الكائن هو ‪ :‬مجموعة من المتغيرات و الدوال التي‬
‫تعالج تلك المتغيرات‬
‫‪ :‬مثال‪ :1‬كائن البيت يتكون من‬
‫‪:‬المتغيرات‬ ‫‪:‬الخصائص او البيانات‬
‫;‪Int no‬‬ ‫رقم البيت‬
‫‪Float price‬‬ ‫سعر البيت‬
‫‪Float area‬‬ ‫مساظحة البيت‬
‫‪:‬العمليات‬ ‫‪:‬العمليات‬
‫}( ‪Print‬‬ ‫اظهار رقم البيت‬
‫)(‪Area‬‬ ‫ايجاد المساظحة‬
‫)(‪Pri‬‬ ‫ايجاد السعر‬
‫الصنف‪ :‬تجميع للكائنات ذات الخصائص والفعال المشتركة‬
‫فهو التعريف او المكان الذي يصنع الكائن منه‬
‫البيوت صنف‬ ‫مثال‪ :‬البيت كائن‬
‫السيارات صنف‬ ‫السيارة كائن‬
‫حيث ان الكائن ياتي من الصنف فل بد لتعريف الصنف اول لنشاء‬
‫الكائن الذي نريد‬
‫{ اسم الصنف‪class‬‬
‫‪Private:‬‬
‫;اسم المتغير نوع المتغير‬ ‫الشكل العام للصنف في‪C++‬‬
‫;اسم المتغير نوع المتغير‬
‫‪Public:‬‬
‫;)( اسم الدالة نوع الدالة‬
‫اسم الدالة نوع الدالة‬
‫;} ;)(‬
‫لناخذ المثال السابق ونعرف الصنف تمهيدا لنشاء كائن او كائنات‬
‫ذلك الصنف‬
#include<iostream.h>
class houses {
‫المثال هو صنف البيوت‬
private:
int no;
float price;
float area;
public:
void print();
float price();
float area(); };
‫لناخذ مثال اخر ونعرف الصنف تمهيدا لنشاء كائن او كائنات ذلك‬
‫>‪#include<iostream.h‬‬ ‫الصنف‬
‫{‪class rectangle‬‬ ‫المثال هو صنف المستطيل‬
‫; ‪int x,y‬‬
‫‪public:‬‬
‫;)‪void set (int,int‬‬
‫;)(‪int area‬‬
‫;}‬

‫‪:‬لظحظ ما يلي‬
‫اننا لم نضع الكلمة‪ private‬و هذا جائز بلغة ‪C++‬ل ن المترجم يتعرف عليها تلقائيا‬
‫الدالة‪Void set‬لم نضع المعاملت لكن النوع ضروري وضعه‬
‫الن وبعد تعريفنا للصنف نريد ان ننشا كائن ويتم ذلك وفق الصيغة‬
‫التالية‬:
‫; اسم الكائن اسم الصنف‬ main‫داخل الدالة‬
1 ‫المثال‬
2 ‫المثال‬ #include<iostream.h>
#include<iostream.h> class houses {
class rectangle{ private:
int no;
int x,y ; float pric;
public: float ar;
void set (int,int); public:
int area(); void print();
}; float price();
float area(); };
void main(){
rectangle rec ; void main (){
houses hous;
‫واذا اردنا ان نعرف اكثر من كائن للصنف فيتم ذلك بنفس الطريقة‬
‫السابقة لكن مع فصل الكائنات بفواصل اي مثل تعريف المتغيرات‬
#include<iostream.h> ‫العادية‬
class houses {
private: ‫مثال‬:
int no;
float pric;
float ar;
public:
void print();
float price();
float area(); };

void main (){


houses
hous1,hous2,hous3 ;
‫الن وبعد ان قمنا بانشاء الكائنات التي نريدها‪ ,‬نريد ان نتعامل مع‬
‫‪.‬تلك المتغيرات المنتمية والمعرفة بالصنف‬
‫هل نستطيع ان نتعامل معها من خلل دالة‪main‬كما هو الحال بالتراكيب‬
‫>‪#include<iostream.h‬‬ ‫‪:‬اي كما في المثال التالي‬
‫{ ‪class houses‬‬
‫‪private:‬‬ ‫الجواب‪ :‬بالطبع ل‬
‫;‪int no‬‬ ‫فالجمل الخيرة خاطئة‬
‫;‪float pric‬‬
‫;‪float ar‬‬ ‫حيث ل يمكن للدالة‪main‬‬
‫‪public:‬‬
‫;)(‪void print‬‬
‫رؤية المتغيرات المنتمية‬
‫;)(‪float price‬‬ ‫المعرفة بالقسم الخاص‬
‫;} ;)( ‪float area‬‬
‫{)( ‪void main‬‬
‫; ‪houses hous‬‬
‫;‪hous . Pric=4‬‬
‫;‪cout<< pric‬‬
‫انما يتم التعامل معهم من خلل الدوال المنتمية والمعرفة في القسم‬
‫العام‪public‬‬
‫>‪#include<iostream.h‬‬
‫{ ‪class houses‬‬ ‫‪:‬لحظ الفرق‬
‫‪private:‬‬
‫;‪int no;float pric;float ar‬‬ ‫الدوال المنتمية والمعرفة‬
‫‪public:‬‬
‫};‪void print(){cout<<pric‬‬
‫بالقسم العام هي المخولة‬
‫};‪float price(){return pric=4‬‬ ‫والمسموح لها التعامل‬
‫;} ;)( ‪float area‬‬
‫{)( ‪void main‬‬ ‫مع المتغيرات المنتمية في‬
‫; ‪houses hous‬‬ ‫القسم الخاص‬
‫;)(‪hous .price‬‬
‫;)(‪hous.print‬‬
‫}‬
‫ اكتب برنامجا يقوم بايجاد المساحة لمستطيلين الطول والعرض‬:‫سؤال‬
‫باستخدام الصناف‬3,9 ‫ و‬2,6 ‫لهما‬
#include<iostream.h>
class rectangles { ‫الجواب‬:
private:
float length;float width;
public:
void area(float x ,float y)
{length=x; width=y;
cout<<"the area is
"<<length*width<<"\n";} };

void main (){


rectangles rec1,rec2 ;
rec1 .area(2,6);
rec2.area(3,9);
}
‫لحظ ان هذه الدالة تم العلن عنها وتعريف جسمها في نفس المكان‬
#include<iostream.h> ‫لذا هي من النوع‬
class rectangles {
private: ‫دالة سطرية‬
float length;float width;
public:
void area(float x ,float ‫هناك طريقة اخرى لتعريف‬
y)
{length=x; width=y; ‫الدالة وهي ان نعلن عنها فقط‬
cout<<"the area is ‫ونعرف جسمها لحقا‬
"<<length*width<<"\n";
} }; ‫كما في المثال اللحق‬

void main (){


rectangles rec1,rec2 ;
rec1 .area(2,6);
rec2.area(3,9);
#include<iostream.h>
‫لحظ ان الدالة تم العلن‬
class rectangles { ‫عنها فقط‬
private:
float length;float width;
public: ‫ولحقا تم تعريف جسمها‬
void area(float x ,float y); };

void main (){


rectangles rec1,rec2 ; ‫وهنا ملحظة هامة اننا نضع‬
rec1 .area(2,6); ‫ اسم الصنف متبوعا ب‬::
rec2.area(3,9);
} ‫وبعدها اسم الدالة والمعاملت‬
void rectangles:: area(float
x ,float y)
{length=x;width=y;
cout<<"the area is
"<<length*width<<"\n";}
‫كل البرنامجين السابقين وان اختلفت طريقة تعريف الدالة فانهما‬
‫يعطيان نفس المخرجات ال انه في البرنامج الول تم العلن‬
‫وتعريف جسم الدالة معا)في ان واحد( اي انها دالة سطرية‬
‫لكن السؤال هل نستطيع في البرنامج الثاني البقاء على تعريف الدالة‬
‫كما هو)اعلنها مسبقا وتعريفها لحقا( مع جعلها دالة سطرية‬
‫الجواب نعم‬
‫‪:‬فجعل الدالة سطرية يتم بطريقتين‬
‫فالطريقة الولى ‪ :‬كما هو الحال في البرنامج الول العلن عنها‬
‫وتعريف جسمها معا‬
‫الطريقة الثانية‪ :‬ان نضيف‪:inline‬كما هو الحال في المثال التالي‬
‫كلمة‬
#include<iostream.h> ‫لحظ ان الدالة تم العلن‬
class rectangles {
private: ‫عنها فقط‬
float length;float width;
public:
void area(float x ,float y); ‫ولحقا تم تعريف جسمها‬
};

inline void rectangles:: ‫وهنا خارج الصنف‬


area(float x ,float y)
{length=x;width=y; main ‫ لكن قبل‬inline ‫نضع كلمة‬
cout<<"the area is
"<<length*width<<"\n";}
‫لنجعلها سطرية‬
void main (){
rectangles rec1,rec2 ;
rec1 .area(2,6);
rec2.area(3,9);
‫‪:‬الدالة البناءة‬
‫في البرامج السابقة قمنا بانشاء كائنات من الصناف حسب الطريقة‬
‫‪:‬اسم الصنف متبوعا باسم الكائن والفاصلة المنقوطة كما في التالي‬
‫‪#include<iostr‬‬ ‫لكن هذه الطريقة صحيحة طالما‬
‫>‪eam.h‬‬
‫‪class‬‬ ‫انه ل يوجد دالة بناءة في البرنامج‬
‫{‪rectangle‬‬ ‫او انه يوجد بناء لكن ل ياخذ عوامل‬
‫; ‪int x,y‬‬
‫‪public:‬‬ ‫لكن كيف عرفنا انه ل يوجد دالة بناءة‬
‫‪void set‬‬
‫;)‪(int,int‬‬
‫وما هي الدالة البناءة؟‬
‫;)(‪int area‬‬ ‫الدالة البناءة دالة تعطي المتغيرات المنتمية قيما‬
‫;}‬
‫ابتدائية ويكون اسمها نفس اسم الصنف وليس‬
‫{)(‪void main‬‬
‫لها نوع اي انهال تسبق ب ‪int ,float ,void‬‬
‫; ‪rectangle rec‬‬
‫‪#include<iostrea‬‬ ‫لحظ ان الجملة انشاء الكائن صحيحة‬
‫>‪m.h‬‬
‫{ ‪class houses‬‬
‫بالرغم من وجود الدالة البناءة‬
‫‪private:‬‬ ‫‪ :‬وعرفنا انها دالة بناءة‬
‫;‪int no‬‬
‫;‪float pric‬‬
‫لنها تاخذ نفس اسم الصنف‬
‫;‪float ar‬‬ ‫لنها غير مسبوقة بنوع الدالة‬
‫‪public:‬‬
‫)( ‪houses‬‬
‫لكن لماذا كانت جملة انشاء الكائن صحيحة‬
‫};‪{no=5‬‬ ‫بالرغم من وجود الدالة البناءة؟‬
‫)(‪void print‬‬ ‫الجواب‪ :‬لنها ل تاخذ عوامل انما قيمة‬
‫;};‪{cout<<no‬‬
‫;}‬ ‫ثابته هي‪5‬‬
‫فلو ان البناء كان ياخذ معاملت بالشكل التالي‬
‫{)( ‪void main‬‬
‫;‪houses hous‬‬ ‫};‪houses (int x){no=x‬‬
‫لكانت جملة انشاء الكائن السابقة خاطئة‬
‫};)(‪hous.print‬‬
#include<iostream.h> ‫لحظ ان جملة انشاء الكائن‬
class houses {
private: ‫خاطئة‬
int no;
float pric;
‫لن الدالة البناءة موجودة وتاخذ‬
float ar; X,y‫عوامل‬
public:
houses (int x, float y)
{no=x; pric=y;}
void print(){cout<<no;};
};

void main (){


houses hous;

hous.print();}
‫‪#include<iostream.‬‬ ‫قلنا انه في حالة ل يوجد دالة بناءة او انها‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫توجد‬
‫‪private:‬‬ ‫لكن بدو ن ا ن تاخذ معاملت فا ن جملة انشاء‬
‫;‪int no‬‬
‫;‪float pric‬‬ ‫الكائن نصحيحة‪ ,‬لكن كيف ننشا الكائن في‬
‫;‪float ar‬‬ ‫ظحالة وجود دالة بناءة وبها معاملت؟؟‬
‫‪public:‬‬
‫‪houses (int x, float‬‬
‫‪:‬الجواب‬
‫};‪y) {no=x;pric=y‬‬ ‫هو ا ن ننشا كائن واستدعاء البناء واسناد‬
‫)(‪void print‬‬ ‫القيم مباشرة‬
‫;};‪{cout<<no‬‬
‫;}‬ ‫‪:‬لظحظ المثال التالي‬
‫الدالة البناءة تضمت معاملت هي‪X,y‬‬
‫{)( ‪void main‬‬
‫;)‪houses hous(5,3‬‬ ‫وليس قيم لذا عندما اردنا انشاء كائن قد تطلب‬
‫منا ا ن نستدعي البناء ونسند القيم مباشرة‬
‫};)(‪hous.print‬‬
‫‪#include<iostream.‬‬ ‫مثال اخر على البناء‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫هل كا ن انشاء الكائن بهذه الطريقة‬
‫‪private:‬‬
‫;‪int no‬‬
‫نصحيح بدو ن ا ن نستدعي البناء ونسند‬
‫;‪float pric‬‬ ‫الى المتغيرات قيم كما في المثال السابق‬
‫;‪float ar‬‬
‫‪public:‬‬
‫)( ‪houses‬‬ ‫الجواب‪ :‬نعم نصحيحة طالما انها لم تاخذ‬
‫};‪{no=0;pric=0‬‬
‫)(‪void print‬‬ ‫معاملت‬
‫;};‪{cout<<no‬‬
‫;}‬ ‫فهنا تم اسناد قيم للمتغيرات وهي‪0,0‬‬
‫وليس معاملت مثل‪X,y‬لذا فجملة انشاء‬
‫{)( ‪void main‬‬
‫;‪houses hous‬‬ ‫الكائن صحيحة‬
‫};)(‪hous.print‬‬
‫‪#include<iostream.‬‬ ‫هل نستطيع ان نعرف الدالة البناءة‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫بطريقة اخرى اي ان البناء في كل‬
‫‪private:‬‬
‫;‪int no‬‬
‫المثلة السابقة كان دالة سطرية لنه تم‬
‫;‪float pric‬‬ ‫العلن عنه وتعريف جسمه معا‬
‫;‪float ar‬‬
‫‪public:‬‬ ‫‪:‬الجواب‬
‫;)( ‪houses‬‬ ‫نعم هناك الطريقة الخرى وهي‬
‫)(‪void print‬‬
‫;};‪{cout<<no‬‬ ‫ان نعلن عنه فقط ونعرف جسمه لحقا‬
‫;}‬
‫كما في الدالت الخرى‬
‫{)( ‪void main‬‬ ‫لحظ نفس البناء السابق قمنا بكتابته‬
‫;‪houses hous‬‬
‫بالطريقة الخرى‬
‫};)(‪hous.print‬‬
‫)(‪houses::houses‬‬
‫‪#include<iostream.‬‬ ‫‪:‬الدالة الهدامة‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫~ ويكو ن اسمها نفس اسم الصنف لكن مسبوقا باشارة‬
‫‪private:‬‬ ‫و ليس لها نوع اي انهال تسبق ب ‪int ,float ,void‬‬
‫;‪int no‬‬
‫اليك المثال التالي وهو نفس المثال السابق‬
‫;‪float pric‬‬
‫;‪float ar‬‬ ‫لكن بوجود هدام‬
‫‪public:‬‬
‫;)( ‪houses‬‬ ‫‪:‬لحظ ما يلي‬
‫}{)(‪~houses‬‬ ‫الدالة الهدامة تاخذ نفس اسم الصنف‬
‫)(‪void print‬‬
‫;};‪{cout<<no‬‬ ‫~ مسبوقا باشارة‬
‫;}‬
‫تعريف جسمها فارغ اي يكون}{‬
‫{)( ‪void main‬‬ ‫استدعاؤها مثل استدعاء الدوال المنتمية‬
‫;‪houses hous‬‬
‫;)(‪hous.~houses‬‬ ‫الخرى اي من خلل اسم الكائن متبوعا‬
‫};)(‪hous.print‬‬ ‫باسم هذه الدالة‬
‫‪#include<iostream.‬‬ ‫هل نستطيع ان نعرف الدالة الهدامة‬
‫>‪h‬‬
‫{ ‪class houses‬‬ ‫بطريقة اخرى اي ان الهدام في‬
‫‪private:‬‬
‫;‪int no‬‬
‫المثال السابق كان دالة سطرية لنه تم‬
‫;‪float pric‬‬ ‫العلن عنه وتعريف جسمه معا‬
‫;‪float ar‬‬
‫‪public:‬‬ ‫‪:‬الجواب‬
‫;)( ‪houses‬‬ ‫نعم هناك الطريقة الخرى وهي‬
‫;)(‪~houses‬‬
‫)(‪void print‬‬ ‫ان نعلن عنه فقط ونعرف جسمه لحقا‬
‫;};‪{cout<<no‬‬
‫;}‬ ‫كما في الدالت الخرى‬
‫لحظ نفس الهدام السابق لكن قمنا بكتابته‬
‫{)( ‪void main‬‬
‫;‪houses hous‬‬ ‫بالطريقة الخرى‬
‫;)(‪hous.~houses‬‬
‫};)(‪hous.print‬‬
‫>‪#include<iostream.h‬‬ ‫اعادة التحميل للدوال‬
‫{ ‪class houses‬‬
‫‪private:‬‬ ‫اي اننا نستطيع تعريف اكثر من دالة لها‬
‫;‪int no‬‬ ‫نفس السم لكن يختلفو ن في عدد المعاملت‬
‫;‪float pric‬‬ ‫وهذا ينطبق على الدالة البناءة‬
‫;‪float ar‬‬ ‫اي يمكن ا ن نعرف اكثر من بناء لكن‬
‫‪public:‬‬ ‫يختلفو ن بعدد المعاملت‬
‫};‪houses (){no=pric=2‬‬ ‫‪:‬لظحظ ما يلي‬
‫) ‪houses(int x,float‬‬ ‫لدينا بناءين يختلفو ن في عدد المعاملت‬
‫};‪{no=x;pric=y‬‬
‫لظحظ انا انشانا كائنا جديدا بهذه الطريقة اي‬
‫)(‪void print‬‬
‫};‪{cout<<no<<pric‬‬ ‫بدو ن استدعاء البناء واسناد قيم وهذا جائز‬
‫;}‬ ‫ل ن البناء الموجود يسند قيمة ثابته هي‪2‬‬
‫{)( ‪void main‬‬ ‫وليس معاملت‬
‫;‪houses hous‬‬ ‫في ظحين اننا انشانا كائنا اخر بالطريقة الخرى‬
‫;)‪houses hous1(3,5‬‬ ‫لنه لو تم انشاؤه بالطريقة الخرى سيكو ن‬
‫;)(‪hous.print‬‬ ‫خاطئا لنه يتضمن معاملت هي‪X,y‬‬
‫;)(‪hous1.print‬‬
‫‪#include<iostream.‬‬ ‫‪:‬سؤال‬
‫>‪h‬‬
‫‪class student‬‬ ‫‪:‬لديك تعريف صنف الطالب التالي‬
‫{‬ ‫عرف دالة بناءة لسناد المتغيرات المنتمية‬
‫‪private :‬‬
‫;‪int stud_no‬‬
‫بقيم ابتدائية‬
‫;‪float stud_avg‬‬ ‫اكتب تعريفا لجسم الدالة ‪setup‬لتستقبل‬
‫قيم رقم الطالب و معدله من المستخدم‬
‫‪public:‬‬
‫;)(‪void setup‬‬ ‫اكتب تعريفا لجسم الدالة‪print‬لتقوم‬
‫;)(‪void print‬‬ ‫بطباعة رقم الطالب ومعدله‬
‫;}‬
‫اجعل الدالة ‪Print‬دالة سطرية‬
‫عرف كائنا من ذلك الصنف وسمه‪st‬‬
‫استدع الدوال السابقة من داخل الدلة ‪main‬‬
#include<iostream.h>
class student{
private :
int stud_no;
float stud_avg;
public:
student(int x,int y){stud_no=x; stud_avg=y;}
void setup();
void print(); } ;
inline void student::print() {cout<<"\n";
cout<<"the student number is "<<stud_no<<"\n";
cout<<"the student average is";
cout<<stud_avg; }

void main(){
student st(102,66);
st.setup();
st.print();}
void student::setup(){ cout<<"enter no" ;
cin >>stud_no ;
cout<<"enter avg";
cin>>stud_avg; }
‫ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ‬
‫ﻛﻠﻳﺔ ﻟﺗﻛﻧوﻟوﺟﻳﺎ واﻟﻌﻠوم اﻟﺗطﺑﻳﻘﻳﺔ‬

‫اﻟدﻟﻳﻝ اﻟﻌﻣﻠﻲ ﻟﻣﻘرر‬


‫ﺑرﻣﺟﺔ )‪ (1‬رﻗم ‪1291‬‬

‫إﻋداد‬
‫أ‪ .‬ﻋﻳﺳﻰ أﺳﻌد‬ ‫د‪ .‬ﻳوﺳف اﺑو زر‬

‫‪2013‬‬
‫اﻟﻣﺣﺗوﻳﺎت‬
‫‪.1‬ااﻟﻣﺧﺗﺑر اﻟﻌﻣﻠﻲ اﻻوﻝ‪ :‬اﻟﺗراﻛﻳب واﻷﺻﻧﺎف‬
‫اﻟﺗراﻛﻳب ‪ :‬اﻟﺷﺧص ‪Person‬‬ ‫‪‬‬
‫اﻟﺗراﻛﻳب ‪ :‬اﻟﻧﻘطﺔ ‪Point‬‬ ‫‪‬‬
‫اﻟﺻﻧف ‪ :‬اﻟﻧﻘطﺔ ‪Point‬‬ ‫‪‬‬
‫اﻟﺑﻧﺎء ‪Constructor‬‬ ‫‪‬‬
‫‪ -2‬اﻟﻣﺧﺗﺑر اﻟﺛﺎﻧﻲ اﻟﻣﺻﻔوﻓﺎت واﻻﺻﻧﺎف ‪Arrays and Classes‬‬
‫اﻟﻣؤﺷرات و ﻣﺻﻔوﻓﺔ ﻣن اﻟﻛﺎﺋﻧﺎت‬ ‫‪‬‬
‫اﻟﻘواﺋم اﻟﻣﺗﺻﻠﺔ‬ ‫‪‬‬
‫‪ -3‬اﻟﻣﺧﺗﺑر اﻟﺛﺎﻟث اﻟدواﻝ واﻷﺻﻧﺎف اﻟﺻدﻳﻘﺔ‪Friend Functions and Operators‬‬
‫اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻟﺗﻣرﻳر اﻟﻌواﻣﻝ‬ ‫‪‬‬
‫اﻟدواﻝ اﻟﺻدﻳﻘﺔ ‪Friend Functions‬‬ ‫‪‬‬
‫اﻷﺻﻧﺎف اﻟﺻدﻳﻘﺔ‬ ‫‪‬‬
‫‪ -4‬اﻟﻣﺧﺗﺑر اﻟراﺑﻊ اﻷﺻﻧﺎف اﻟﻣﺷﺗﻘﺔ واﻟﻘواﻟب‪Derived Classes and Templates‬‬
‫اﻟوراﺛﺔ اﻟﻣﻧﻔردة ‪Single Inheritance‬‬ ‫‪‬‬
‫اﻟوراﺛﺔ اﻟﻣﺗﻌددة ‪Multiple Inheritance‬‬ ‫‪‬‬
‫ﺗﻌدد اﻻوﺟﻪ ‪Polymorphism‬‬ ‫‪‬‬
‫اﻟﻘواﻟب ‪Templates‬‬ ‫‪‬‬
‫‪ -5‬اﻟﻣﺧﺗﺑر اﻟﺧﺎﻣس ﻣﻌﺎﻟﺟﺔ اﻟﻣﻠﻔﺎت ﺑﻠﻐﺔ ‪File Processing with C++ C++‬‬

‫‪-6‬اﻟﻣﻼﺣق ﻣﺗرﺟﻣﺎت ﻟﻐﺔ‪C++‬‬


‫‪ ‬إعداد بيئة تطوير ضمن برنامج ‪Code::Blocks‬‬
‫‪ -‬مقدمة‬
‫‪ -‬إعداد بيئة تطوير ضمن برنامج ‪.Code::Blocks‬‬
‫‪ -‬تحميل برنامج ‪.Code::Blocks‬‬
‫‪ -‬تنصيب برنامج ‪ Code::Blocks‬على الحاسوب‪.‬‬
‫‪ -‬شرح واجھة التطبيق‬
‫‪ -‬تشغيل برنامج ‪ Code::Blocks‬من خالل إنشاء مشروع جديد و تطبيق مثال بسيط‬

‫‪ ‬إعداد بيئة تطوير ضمن برنامج ‪.Visual C++‬‬


‫اﻟﻮﺣﺪة اﻟﺜﺎﻧﻴﺔ‬
‫التراكيب واألصناف‬
‫‪Structures and Classes‬‬
‫ﻓﻲ ﻫذا اﻟﻣﺧﺗﺑر ‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺳ ـ ـﻳﻌرض ﻋﺿـ ــو ﻫﻳﺋﺔ اﻟﺗدرﻳس ﻓﻲ ﻓرع اﻟﺟﺎﻣﻌﺔ ﺑﻌض اﻟﺗدرﻳﺑﺎت‬
‫اﻟﻌﻣﻠﻳﺔ ﻟﻣﻔﻬوﻣﻳن ﻣﻬﻣﻳن وﻫﻣﺎ اﻟﺗراﻛﻳب واﻷﺻ ــﻧﺎف‪ .‬ﺗﻘﺎﺑﻝ اﻟﺗراﻛﻳب ‪ Structures‬اﻟﺳ ــﺟﻼت ‪Records‬‬
‫ﻓﻬﻲ اﻟﻔﻛرة اﻟرﺋﻳﺳ ـ ـ ـ ـ ـ ــﺔ ﻓﻲ ﻟﻐﺎت اﻟﺑرﻣﺟﺔ اﻟﻛﻳﻧوﻧﻳﺔ‬ ‫ﻓﻲ ﻟﻐﺎت ﺑرﻣﺟﺔ أﺧرى‪ .‬أﻣﺎ اﻷﺻ ـ ـ ـ ـ ـ ــﻧﺎف ‪Classes‬‬
‫‪ Object Oriented Languages‬وﻫﻲ ﺟزء ﻣن ﻟﻐﺔ ‪ C++‬وﻟﻳﺳت ﺟزءا ﻣن ﻟﻐﺔ ‪ C‬اﻷﺻﻠﻳﺔ‪.‬‬
‫ﻛﻣـﺎ ﺳـ ـ ـ ـ ـ ـ ـﻳﻌرض ﺑراﻣﺞ ﺑﻠﻐــﺔ ‪ C++‬ﺗﻧـﺎﻗش ﻣﻔــﺎﻫﻳم رﺋﻳﺳ ـ ـ ـ ـ ـ ــﺔ أﺧرى ﻓﻲ ﻟﻐـﺎت اﻟﺑرﻣﺟـﺔ اﻟﻛﻳﻧوﻧﻳـﺔ‪ ،‬ﻣﺛــﻝ‬
‫اﻟﻛــﺎﺋﻧــﺎت واﻟﻣﺗﻐﻳرات واﻟــدواﻝ اﻟﻣﻧﺗﻣﻳــﺔ وﻛﻳﻔﻳــﺔ ﺗﻌرﻳﻔﻬــﺎ واﺳ ـ ـ ـ ـ ـ ــﺗﺧــداﻣﻬــﺎ ﻓﻲ ﻟﻐــﺔ ‪ .C++‬وﺗﻌﺗﺑر ﻫــذﻩ اﻟﻣﻔــﺎﻫﻳم‬
‫أﺳـ ـ ـ ـ ــﺎﺳـ ـ ـ ـ ــﻳﺔ ﻟﻔﻬم ﺑﻘﻳﺔ اﻟﺗدرﻳﺑﺎت ﻓﻲ ﻫذا اﻟﻣﻘرر‪ ،‬ﻟذا ﻧرﺟو ﻣﻧك‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬اﻟﺗﺄﻛد ﻣن ﺗﻧﻔﻳذ وﻓﻬم ﻫذﻩ‬
‫اﻟﺑرﻣﺟﻳﺎت ﻓﻲ اﻟﻣﺧﺗﺑر ﺑﺈﺷـ ـ ـراف ﻋﺿ ـ ــو ﻫﻳﺋﺔ اﻟﺗدرﻳس ﻗﺑﻝ اﻻﻧﺗﻘﺎﻝ إﻟﻰ ﺑﻘﻳﺔ اﻟوﺣدات‪ .‬وﻗد ﺗم ﺗزوﻳدك ﻓﻲ‬
‫ﺗـدرﻳﺑـﺎت ﻫـذﻩ اﻟوﺣـدة ﺑـﺎﻟﻌـدﻳـد ﻣن اﻷﻣﺛﻠـﺔ واﻟﺗﻣـﺎرﻳن اﻟﺗﻲ ﻧرﺟو ﻣﻧـك إﻋطﺎءﻫﺎ اﻟوﻗت واﻟﺟﻬد اﻟﻼزﻣﻳن ﻟﺣﻠﻬﺎ‬
‫وﺗﻧﻔﻳــذﻫــﺎ‪ .‬ﺗــذﻛر‪ ،‬ﻋزﻳزي اﻟطــﺎﻟــب‪ ،‬أن أﺟوﺑــﺔ ﻫــذﻩ اﻟﺗﻣــﺎرﻳن ﻣوﺟودة ﻓﻲ ﻧﻬــﺎﻳــﺔ ﻫــذﻩ اﻟوﺣــدة‪ ،‬وﻟﻛن وﺣﺗﻰ‬
‫ﺗﺗﺣﻘق اﻟﻔــﺎﺋــدة اﻟﻘﺻ ـ ـ ـ ـ ـ ــوى ﻋﻠﻳــك‪ ،‬ﻋزﻳزي اﻟطــﺎﻟــب ‪ ،‬أن ﺗﺣــﺎوﻝ ﺑﻛــﻝ ﺟــد ﺣــﻝ ﻫــذﻩ اﻟﺗﻣــﺎرﻳن وﺗﻧﻔﻳــذﻫــﺎ ﻋﻠﻰ‬
‫اﻟﺣﺎﺳوب ﻗﺑﻝ اﻟﻧظر إﻟﻰ اﻟﺣﻝ‪.‬‬

‫أﻫداف اﻟﺗدرﻳﺑﺎت‬
‫ﻳﻧﺗظر ﻣﻧك‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺑﻌد ﻓراﻏك ﻣن ﺗﻧﻔﻳذ ﻫذﻩ اﻟﺗدرﻳﺑﺎت أن ﺗﻛون ﻗﺎد ار ﻋﻠﻰ أن‪:‬‬
‫‪ .1‬ﺗﻌرﻳف واﺳﺗﺧدام اﻟﺗراﻛﻳب ‪.structures‬‬
‫‪ .2‬اﺳﺗﺧدام ﻣﺻﻔوﻓﺎت ﻣن اﻟﺗراﻛﻳب ‪.arrays of structures‬‬
‫‪ .3‬ﺗﻌرﻳف واﺳﺗﺧدام اﻷﺻﻧﺎف ‪.classes‬‬
‫‪ .4‬اﻟﺗﻣﻳﻳز ﺑﻳن اﻟﺗراﻛﻳب واﻷﺻﻧﺎف‪.‬‬
‫‪ .5‬إﻧﺷﺎء اﻟﻛﺎﺋﻧﺎت واﺳﺗﺧداﻣﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ‪.‬‬
‫‪ .6‬ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﻣﻧﺗﻣﻳﺔ واﺳﺗدﻋﺎﺋﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ‪.‬‬
‫‪ .7‬ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﺳطرﻳﺔ ‪.‬‬
‫‪ .8‬ﺗﺣﻣﻳﻝ اﻟدواﻝ أﻛﺛر ﻣن ﺗﻌرﻳف واﺣد‪.‬‬
‫‪ .9‬إدﺧﺎﻝ اﻟﺑﻳﺎﻧﺎت ٕواﺧراﺟﻬﺎ ﺑوﺳﺎطﺔ ‪ cin‬و ‪.cout‬‬

‫اﻟﺗدرﻳب رﻗم )‪(1‬‬


‫ﻋرف ﺗرﻛﻳب ﻳﺻف اﻟﺷﺧص ‪ Person‬ﻳﺗﻛون ﻣن اﻟﺣﻘوﻝ اﻟﺗﺎﻟﻳﺔ‪ name :‬اﻻﺳم ‪ age ،‬اﻟﻌﻣر ‪gender ،‬‬
‫اﻟﺟﻧس‪ ،‬واﻛﺗب اﻟﺑرﻧﺎﻣﺞ اﻟرﺋﻳﺳﻲ اﻟذي ﻳﻌرف ﻣﺗﻐﻳر ﻣن اﻟﻧوع ﺷﺧص وﻳﻘوم ﺑﺈﺳﻧﺎد ﻗﻳم ﻟﻠﻣﺗﻐﻳرات وطﺑﺎﻋﺔ‬
‫اﻟﻧﺗﺎﺋﺞ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫>‪#include <iostream‬‬
‫>‪#include <string‬‬
‫{‪struct Person‬‬
‫;‪string name‬‬
‫;‪int age‬‬
‫;‪char gender‬‬
‫;}‬
‫{)(‪int main‬‬
‫;‪Person p‬‬
‫;"‪p.name = "Christopher‬‬
‫;‪p.age = 34‬‬
‫;'‪p.gender = 'M‬‬
‫;‪cout << "Name: " << p.name << endl‬‬
‫;‪cout << "Age: " << p.age << endl‬‬
‫;‪cout << "Gender: " << p.gender << endl‬‬
‫;‪return 0‬‬
‫}‬
‫اﻟﺗدرﻳب رﻗم )‪(2‬‬
‫ﻋرف ﺗرﻛﻳب ﻳﺻف اﻟﻧﻘطﺔ ‪ Point‬ﺗﺗﻛون إﺣداﺛﻳﺎت ‪ x‬و ‪ ،y‬واﻛﺗب اﻟﺑرﻧﺎﻣﺞ اﻟرﺋﻳﺳﻲ اﻟذي ﻳﻌرف ﻣﺗﻐﻳر‬
‫ﻣؤﺷري ﻣن اﻟﻧوع ﻧﻘطﺔ وﻳﻘوم ﺑﺈﺳﻧﺎد ﻗﻳم ﻟﻠﻣﺗﻐﻳرات وطﺑﺎﻋﺔ اﻟﻧﺗﺎﺋﺞ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫>‪include <iostream‬‬
‫{‪struct Point‬‬
‫;‪int x‬‬
‫;‪int y‬‬
‫;}‬
‫{)(‪int main‬‬
‫;‪Point* p = new Point‬‬
‫;‪p->x = 9‬‬
‫;‪p->y = 4‬‬
‫;‪cout << p->x << " " << p->y << endl‬‬
‫;‪return 0‬‬
‫}‬

‫اﺳﺋﻠﺔ ﻟﻠﺣﻝ ﻋﻠﻰ اﻟﺣﺎﺳوب )‪(1‬‬


‫‪‬‬
‫ﻋزﻳزي اﻟطـﺎﻟـب اﻋـد ﻛﺗـﺎﺑﺔ اﻟﺗدرﻳب اﻟﺳ ـ ـ ـ ـ ـ ــﺎﺑق ﺑﺣﻳث ﻧﻌرف ﻣﺻ ـ ـ ـ ـ ـ ــﻔوﻓﺔ ﺗﺗﻛون ﻣن ‪ 6‬ﻧﻘﺎط ٕواﻳﺟﺎد‬
‫اﻟﻣﺳﺎﻓﺔ ﺑﻳن ﻛﻝ ﻧﻘطﺗﻳن ﺣﺳب اﻟﻌﻼﻗﺔ اﻟﺗﺎﻟﻳﺔ‪:‬‬
‫اﻟﻣﺳﺎﻓﺔ = ‪(x2 + y2)0.5‬‬

‫ﻣﺳﺎﻋدة اﻟﺣﻝ‪:‬‬

‫‪-1‬ﺗﻌرﻳف اﻟﻣﺻﻔوﻓﺔ‬

‫‪.Point pts[6]; // array to hold up to 6 points‬‬

‫‪-2‬اﻻﻗﺗران ﻹﻳﺟﺎد اﻟﻣﺳﺎﻓﺔ ﺑﻳن اﻟﻧﻘﺎط‪:‬‬

‫{ )‪float dist(Point p‬‬


‫‪// Compute the distance from the origin‬‬
‫;)‪return sqrt(p.x*p.x + p.y*p.y‬‬

‫ﺟﻣﻠﺔ اﻻﺳﺗدﻋﺎء )]‪dist(pt[i‬‬


‫اﻟﺗدرﻳب رﻗم )‪(3‬‬
‫اﻋد ﻛﺗﺎﺑﺔ اﻟﺗدرﻳب اﻟﺳﺎﺑق اﻟﻧﻘطﺔ ‪ Point‬ﺗﺗﻛون إﺣداﺛﻳﺎت ‪ x‬و ‪ y‬ﺑﺎﺳﺗﺧدام اﻷﺻﻧﺎف ‪ ، class‬واﻛﺗب‬
‫اﻟﺑرﻧﺎﻣﺞ اﻟرﺋﻳﺳﻲ اﻟذي ﻳﻌرف ﻣﺗﻐﻳر ﻣؤﺷري ﻣن اﻟﻧوع ﻧﻘطﺔ وﻳﻘوم ﺑﺈﺳﻧﺎد ﻗﻳم ﻟﻠﻣﺗﻐﻳرات وطﺑﺎﻋﺔ اﻟﻧﺗﺎﺋﺞ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫>‪#include <iostream‬‬
‫{‪class Point‬‬
‫‪public:‬‬
‫;‪int x, y‬‬
‫{)(‪Point‬‬
‫;‪x = 0; y = 0‬‬
‫}‬
‫;}‬
‫{)(‪int main‬‬
‫;‪Point* p = new Point‬‬
‫;‪p->x = 9‬‬
‫;‪p->y = 4‬‬
‫;‪cout << p->x << " " << p->y << endl‬‬
‫;‪return 0‬‬
‫}‬

‫اﻟﺗدرﻳب رﻗم )‪(4‬‬


‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﺟﻳدا واﻟذي ﻳﺻف ﺻﻧف ﻣن ﻧوع ﻣﺳﺗطﻳﻝ ‪ Rectangle‬وﻳﻘوم ﺑﺈﻋطﺎء إﺑﻌﺎد اﻟﻣﺳﺗطﻳﻝ‬
‫ٕواﻳﺟﺎد ﻣﺳﺎﺣﺗﻪ ﺑﺎﺳﺗﺧدام داﻟﺔ ﺳطرﻳﻪ وطﺑﺎﻋﺔ اﻟﻧﺗﺎﺋﺞ‪ .‬اﻋد ﻛﺗﺎﺑﺔ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﺑﺎﺳﺗﺧدام اﻟﺑﻧﺎء ‪constructor‬‬

‫>‪#include <iostream‬‬
‫{ ‪class CRectangle‬‬
‫;‪int x, y‬‬
‫‪public:‬‬
‫;)‪void set_values (int,int‬‬
‫};)‪int area () {return (x*y‬‬
‫;}‬

‫{ )‪void CRectangle::set_values (int a, int b‬‬


‫;‪x = a‬‬
‫;‪y = b‬‬
‫}‬

‫{ )( ‪int main‬‬
‫;‪CRectangle rect, rectb‬‬
‫;)‪rect.set_values (3,4‬‬
‫;)‪rectb.set_values (5,6‬‬
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}

:‫اﻟﺣﻝ‬

// ‫ باستخدام‬constructor
#include <iostream>
class CRectangle {
int width, height;
public:
CRectangle (int,int);
int area () {return (width*height);}
};

CRectangle::CRectangle (int a, int b) {


width = a;
height = b;
}

int main () {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}

(2) ‫اﺳﺋﻠﺔ ﻟﻠﺣﻝ ﻋﻠﻰ اﻟﺣﺎﺳوب‬



‫ﻋزﻳزي اﻟطﺎﻟب اﻋد ﻛﺗﺎﺑﺔ اﻟﺗدرﻳب اﻟﺳﺎﺑق ﺑﺣﻳث ﻧﻌرف اﻟﻬدام‬
:‫ﻣﺳﺎﻋدة اﻟﺣﻝ‬
~CRectangle (); : ‫اﻟﻬدام‬

(3) ‫اﺳﺋﻠﺔ ﻟﻠﺣﻝ ﻋﻠﻰ اﻟﺣﺎﺳوب‬



‫ﻋزﻳزي اﻟطــﺎﻟــب‪ ،‬اﻛﺗــب ﺑرﻧــﺎﻣﺞ ﺑﻠﻐــﺔ ‪ C++‬ﻟﺗﻌرﻳف ﺻ ـ ـ ـ ـ ـ ــﻧف طــﺎﻟــب ‪ STUDENT‬ﻳﺗﻛون ﻣن‬
‫اﻟﻣﺗﻐﻳرات اﻟﻣﻧﺗﻣﻳﺔ اﻟﺗﺎﻟﻳﺔ ‪ :‬اﻟرﻗم اﻟﺟﺎﻣﻲ ﻟﻠطﺎﻟب ‪ ، USN‬اﻻﺳــم ‪ ،name‬وﻋﻼﻣﺎت ‪ m‬ﻓﻲ ‪ 3‬اﺧﺗﺑﺎرات ﻓﻲ‬
‫ﻣوﺿـوع ﻣﺎ‪. ,‬واﻟﻣﻌدﻝ ‪ . avg‬ﻋرف ﻣﺻـﻔوﻓﺔ ﺗﻣﺛﻝ ﻣﺟﻣوﻋﺔ ﻣن ‪ 10‬ﻛﺎﺋﻧﺎت ﻣن اﻟﺻﻧف‪. STUDENT.‬‬
‫ﺑﺎﺳ ـ ــﺗﺧدام اﻗﺗراﻧﺎت ﻣﻧﺗﻣﻳﺔ ﻣﻧﺎﺳ ـ ــﺑﺔ‪ ،‬اوﺟد ﻣﺗوﺳ ـ ــط اﻋﻠﻰ ﻋﻼﻣﺗﻳن ﻋﻼﻣﺎت ﻟﻛﻝ طﺎﻟب ‪ .‬وأطﺑﻊ اﻟﻧﺗﺎﺋﺞ ﻣﺛﻝ‪:‬‬
‫‪ ،USN‬واﻻﺳم وﻣﻌدﻝ ﻋﻼﻣﺎت اﻟطﻼب ﻛﺎﻓﺔ‪.‬‬

‫اﻟﺗدرﻳب رﻗم )‪(5‬‬


‫ادرس اﻟﺗدرﻳب رﻗم )‪ (4‬واﻋد ﻛﺗﺎﺑﺔ اﻟﺑﻧﺎء ﻣن ﺧﻼﻝ ﻣﻔﻬوم اﻋﺎدة اﻟﺗﺣﻣﻳﻝ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫‪// overloading class constructors‬‬
‫>‪#include <iostream‬‬

‫{ ‪class CRectangle‬‬
‫;‪int width, height‬‬
‫‪public:‬‬
‫;)( ‪CRectangle‬‬
‫;)‪CRectangle (int,int‬‬
‫};)‪int area (void) {return (width*height‬‬
‫;}‬

‫{ )( ‪CRectangle::CRectangle‬‬
‫;‪width = 5‬‬
‫;‪height = 5‬‬
‫}‬

‫{ )‪CRectangle::CRectangle (int a, int b‬‬


‫;‪width = a‬‬
‫;‪height = b‬‬
‫}‬

‫{ )( ‪int main‬‬
‫;)‪CRectangle rect (3,4‬‬
‫;‪CRectangle rectb‬‬
‫;‪cout << "rect area: " << rect.area() << endl‬‬
‫;‪cout << "rectb area: " << rectb.area() << endl‬‬
‫;‪return 0‬‬
‫}‬
‫إﺟﺎﺑﺎت اﻷﺳﺋﻠﺔ‬
(1) ‫ﺳؤاﻝ‬
struct Point {
float x; // x coordinate
float y; // y coordinate
};

Point pts[6]; // array to hold up to 6 points.


int n = 0; // number of points in the array.

while (cin >> pts[n].x >> pts[n].y) {


n++;
}

float dist(Point p) {
// Compute the distance from the origin
return sqrt(p.x*p.x + p.y*p.y);
}

void findDistance(Point pt[], int size) {


for (int i=0; i<size-1; i++) {
cout<< dist(pt[i
}
}

(2) ‫ﺳؤاﻝ‬

// Solution on constructors and destructors


#include <iostream>
class CRectangle {
int *width, *height;
public:
CRectangle (int,int);
~CRectangle ();
int area () {return (*width * *height);}
};

CRectangle::CRectangle (int a, int b) {


width = new int;
height = new int;
*width = a;
*height = b;
}

CRectangle::~CRectangle () {
delete width;
delete height;
}

int main () {
CRectangle rect (3,4), rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
‫ﻧﺗﻳﺟﺔ اﻟﺗﻧﻔﻳذ‬
rect area: 12
rectb area: 30
(3) ‫ﺳؤاﻝ‬

#include<iostream.h>
#include<conio.h>
class student
{
private :
int usn,m[4];
char name[20];
float avg;
public :
void read();
void avgm();
void print();
};
void student :: read()
{
cout<<"Enter the USA no. :";
cin>>usn;
cout<<"Enter the name of the student :";
cin>>name;
cout<<name<<endl;
cout<<"Enter the marks of 3 subjects :";
cin>>m[1]>>m[2]>>m[3];
avgm();
}

void student :: avgm()


{
if(m[1]<=m[2] && m[1]<=m[3])
avg=(float)(m[2]+m[3])/2;
if(m[2]<=m[1] && m[2]<=m[3])
avg=(float)(m[1]+m[3])/2;
if(m[3]<=m[1] && m[3]<=m[2])
avg=(float)(m[1]+m[2])/2;
}
void student :: print()
{

cout<<"\n"<<usn<<"\t"<<name<<"\t\t"<<avg;

/* cout<<"USA No.:"<<usn<<"\n";
cout<<"Name :"<<name<<endl;
cout<<"Average marks :"<<avg<<"\n"; */
}
void main()
{
int n,i;
student s[10];
clrscr();
cout<<"Enter the no of students :";
cin>>n;
for(i=0;i<n;i++)
s[i].read();
cout<<"USN\tNAME\t\tAVVEAGE MARKS\n";
for(i=0;i<n;i++)
s[i].print();
getch();
}
‫اﻟﻮﺣﺪة اﻟﺜﺎﻟﺜﺔ‬
‫المصفوفات واألصناف‬
‫‪Arrays and Classes‬‬

‫إن ﻣﻌظم اﻟﺗطﺑﻳﻘﺎت اﻟﻌﻣﻠﻳﺔ ﺗﺗطﻠب اﺳ ـ ـ ــﺗﺧدام ﻗواﺋم ﻣن اﻟﻛﺎﺋﻧﺎت ‪ ،list of objects‬وﻏﺎﻟﺑﺎ ﻣﺎ ﺗﻧﻔذ ﻫذﻩ‬
‫اﻟﻘواﺋم ﺑﺎﺳ ـ ـ ــﺗﺧدام ﻣﺻ ـ ـ ــﻔوﻓﺎت ﻣن اﻟﻛﺎﺋﻧﺎت ‪ Arrays of objects‬أو ﺑﺎﺳ ـ ـ ــﺗﺧدام ﻗواﺋم ﻣﺗﺻ ـ ـ ــﻠﺔ ﻣن اﻟﻛﺎﺋﻧﺎت‬
‫‪ .linked lists of objects‬ﻓﻲ ﻫذﻩ اﻟوﺣدة‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺳـ ـ ــﻧﻧﺎﻗش ﻛﻳﻔﻳﺔ إﻧﺷ ـ ــﺎء واﺳـ ـ ــﺗﺧدام ﻣﺻـ ـ ــﻔوﻓﺎت‬
‫وﻗواﺋم ﻣﺗﺻﻠﺔ ﻣن اﻟﻛﺎﺋﻧﺎت ﻣن ﺧﻼﻝ أﻣﺛﻠﺔ ﻋﻣﻠﻳﺔ وﺗدرﻳﺑﺎت ﻣﺧﺗﻠﻔﺔ‪.‬‬

‫أﻫداف اﻟوﺣدة‬
‫ﻳﻧﺗظر ﻣﻧك‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺑﻌد ﻓراﻏك ﻣن ﺗﻧﻔﻳذ اﻟﺑراﻣﺞ ﻓﻲ ﻫذﻩ اﻟوﺣدة‪ ،‬أن ﺗﻛون ﻗﺎد ار ﻋﻠﻰ أن‪:‬‬

‫‪ .1‬ﺗﻌرف ﻣﺻﻔوﻓﺎت ﻣن اﻟﻛﺎﺋﻧﺎت ﺑﻠﻐﺔ ‪.C++‬‬

‫‪ .2‬ﺗﻣرر اﻟﻣﺻﻔوﻓﺎت ﻛﻌواﻣﻝ إﻟﻰ دواﻝ ﻣﺧﺗﻠﻔﺔ‪.‬‬

‫‪ .3‬ﺗﺳﺗﺧدم ﻫذﻩ اﻟﻣﺻﻔوﻓﺎت ﻓﻲ ﺗطﺑﻳﻘﺎت ﻣﺧﺗﻠﻔﺔ ﻣﺛﻝ ﻋﻣﻠﻳﺎت اﻟﻔرز واﻟﺑﺣث‪.‬‬

‫‪ .4‬ﺗﻧﺷﺊ اﻟﻛﺎﺋﻧﺎت ﺑطرﻳﻘﺔ دﻳﻧﺎﻣﻳﻛﻳﺔ‪.‬‬

‫‪ .5‬ﺗﺗﻌﺎﻣﻝ ﻣﻊ اﻟﻛﺎﺋﻧﺎت ﻣن ﺧﻼﻝ ﻋﻧﺎوﻳﻧﻬﺎ وﻣﺗﻐﻳرات ﻣؤﺷرة ‪.pointer variables‬‬


.‫ أن ﺗﻧﺷﺊ ﻗواﺋم ﻣﺗﺻﻠﺔ ﻣن اﻟﻛﺎﺋﻧﺎت وﺗﺳﺗﺧدﻣﻬﺎ ﻓﻲ ﺗطﺑﻳﻘﺎت ﻣﺧﺗﻠﻔﺔ‬.6

(1) ‫اﻟﺗدرﻳب‬
.‫اﻋد ﻛﺗﺎﺑﺔ ﻣﺛﺎﻝ اﻟﻣﺳﺗطﻳﻝ ﻣن ﺧﻼﻝ ﻓﻛرة ﻣؤﺷر اﻟﻰ اﻟﺻﻧف وﻣؤﺷر اﻟﻰ ﻣﺻﻔوﻓﺔ ﻣن اﻟﻛﺎﺋﻧﺎت‬

:‫اﻟﺣﻝ‬

// pointer to classes example


#include <iostream>

class CRectangle {
int width, height;
public:
void set_values (int, int);
int area (void) {return (width * height);}
};

void CRectangle::set_values (int a, int b) {


width = a;
height = b;
}

int main () {
CRectangle a, *b, *c;
CRectangle * d = new CRectangle[2];
b= new CRectangle;
c= &a;
a.set_values (1,2);
b->set_values (3,4);
d->set_values (5,6);
d[1].set_values (7,8);
cout << "a area: " << a.area() << endl;
cout << "*b area: " << b->area() << endl;
cout << "*c area: " << c->area() << endl;
cout << "d[0] area: " << d[0].area() << endl;
cout << "d[1] area: " << d[1].area() << endl;
delete[] d;
delete b;
return 0;
}
(2) ‫اﻟﺗدرﻳب‬
‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﺟﻳدا وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب اﺟب ﻋن اﻷﺳﺋﻠﺔ اﻟﺗﺎﻟﻳﺔ ﺑﺎﻟﺗﻌﺎون ﻣﻊ ﻋﺿو ﻫﻳﺋﺔ اﻟﺗدرﻳس ﻓﻲ‬
‫اﻟﻣﺧﺗﺑر‬
#include <iostream.h>

class CAT
{
public:
CAT() { itsAge = 1; itsWeight=5; }
~CAT() {} // destructor
int GetAge() const { return itsAge; }
int GetWeight() const { return itsWeight; }
void SetAge(int age) { itsAge = age; }

private:
int itsAge;
int itsWeight;
};

int main()
{
CAT * Family[500];
int i;
CAT * pCat;
for (i = 0; i < 10; i++)
{
pCat = new CAT;
pCat->SetAge(2*i +1);
Family[i] = pCat;
}

for (i = 0; i < 10; i++)


{
cout << "Cat #" << i+1 << ": ";
cout << Family[i]->GetAge() << endl;
}
return 0;
}

__________________________________________________ ‫ ﻣﺎ اﺳم اﻟﺻﻧف‬.1


______________________ CAT() { itsAge = 1; itsWeight=5; } :‫ ﻣﺎ وظﻳﻔﺔ اﻟداﻟﺔ اﻟﺗﺎﻟﻳﺔ‬.2
___________________________________________________________ ‫ ﻣﺎ اﺳم اﻟﺑﻧﺎء‬.3
‫‪ .4‬ﻫﻝ ﻳوﺟد ﻫدام ‪ ،‬واذا ﻛﺎﻧت اﺟﺎﺑﺗك ﺑﻧﻌم ﻓﻣﺎ ﻫﻲ اﻟداﻟﺔ اﻟﻬدام‪______________________________ .‬‬
‫‪ .5‬ﻣﺎ ﻫﻲ اﻟﻣﺗﻐﻳرات اﻟﻣﻧﺗﻣﻳﺔ ﻓﻲ اﻟﺻﻧف _____________________________________________‬
‫‪ .6‬أﻋطﻲ أﻣﺛﻠﺔ ﻋﻠﻰ اﻟدواﻝ اﻟﻣﻧﺗﻣﻳﺔ ___________________________________________‬
‫‪ .7‬اﻛﺗب اﻟﺟﻣﻠﺔ اﻟﺗﻲ ﺗﻌرف ﻣﺻﻔوﻓﺔ ﻣن اﻟﻣؤﺷرات ﻟﻠﺻﻧف ‪_______________________ CAT‬‬
‫‪ .8‬ﻣﺎ اﻟﻬدف ﻣن اﺳﺗﺧدام اﻟﺟﻣﻝ اﻟﺗﺎﻟﻳﺔ‪___________________________________ :‬‬
‫;‪pCat = new CAT‬‬
‫;)‪pCat->SetAge(2*i +1‬‬
‫‪ .9‬ﻣﺎ ﻫو ‪____________________________________________ pCat‬‬
‫‪ .10‬ﻣﺎ وظﻳﻔﺔ ‪__________________________________________ new‬‬
‫‪ .11‬ﻟﻣﺎذا اﺳﺗﺧدﻣﻧﺎ اﻟرﻣز >‪ -‬ﻓﻲ اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﻳﺔ ________________________________‬
‫‪ .12‬أﻋطﻲ ﻣﺛﺎﻝ ﻋﻠﻰ داﻟﺔ ﺳطرﻳﺔ _______________________________________________‬
‫‪ .13‬ﻫﻝ اﻟﻧﺗﻳﺟﺔ اﻟﺗﻲ ﺣﺻﻠت ﻋﻠﻳﻬﺎ ﺑﻌد اﻟﺗﻧﻔﻳذ ﻫﻲ‪:‬‬
‫‪Output: Cat #1: 1‬‬
‫‪Cat #2: 3‬‬
‫‪Cat #3: 5‬‬

‫اﻟﺗدرﻳب )‪(3‬‬
‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳوﺿﺢ ﻣﺛﺎﻝ اﻟﻧﻘطﺔ ﺑﺣﻳث ﻳﻘدم ﻓﻛرة اﺳﺗﺧدام ﺧوارزﻣﻳﺎت اﻟﻔرز ‪ bubbleSort‬ﻟﺗرﺗﻳب اﻟﻧﻘط‬
‫ﺗﺻﺎﻋدﻳﺎ ﺣﺳب اﻟﻣﺳﺎﻓﺔ ﻣن ﻧﻘطﺔ اﻷﺳﺎس‪ .‬اﻛﺗب اﻟداﻟﺔ اﻟرﺋﻳﺳﻳﺔ ﻟﻠﺑرﻧﺎﻣﺞ‬
‫>‪include <iostream‬‬
‫{ ‪struct Point‬‬
‫‪float x; // x coordinate‬‬
‫‪float y; // y coordinate‬‬
‫‪char name[20]; // name of the point‬‬
‫;}‬

‫‪Point pts[10]; // array to hold up to 10 points.‬‬


‫‪int n = 0; // number of points in the array.‬‬

‫{ )‪while (cin >> pts[n].name >> pts[n].x >> pts[n].y‬‬


‫;‪n++‬‬
‫}‬

‫{ )‪float dist(Point p‬‬


‫‪// Compute the distance from the origin‬‬
‫;)‪return sqrt(p.x*p.x + p.y*p.y‬‬
‫}‬
void bubbleSort(Point pt[], int size) {
bool doMore = true;
while (doMore) {
doMore = false; // Assume no more passes unless exchange made.
for (int i=0; i<size-1; i++) {
if (dist(pt[i]) > dist(pt[i+1])) {
// Exchange elements
Point temp = pt[i]; pt[i] = pt[i+1]; pt[i+1] = temp;
doMore = true; // Exchange requires another pass.
}
}
}
}

‫( ﻣﺛﺎﻝ ﻋﻠﻰ اﻟﻘواﺋم اﻟﻣﺗﺻﻠﺔ‬4) ‫ﺗدرﻳب‬


‫ واالقترانات المنتمية التي تدخل عمر‬itsAge ‫ ﻳﺣﺗوي ﻋﻠﻰ ﻣﺗﻐﻳر ﻣﻧﺗﻣﻲ‬CAT ‫ ﻳﻌرف ﺻﻧف ﻣن ﻧوع‬C++ ‫اﻛﺗب ﺑرﻧﺎﻣﺞ ﺑﻠﻐﺔ‬
‫ تحتوي على‬Node ‫القطة وترجع عمر ألقطة استخدم القوائم المتصلة لتمثيل المشكلة عن طريق تعريف عقدة من نوع‬
. ‫ الى القائمة المتصلة‬CAT ‫االقترانات الالزمة إلضافة معلومات القطة‬
// Linked list simple implementation

#include <iostream.h>

// object to add to list


class CAT
{
public:
CAT() { itsAge = 1;}
CAT(int age):itsAge(age){}
~CAT(){};
int GetAge() const { return itsAge; }
private:
int itsAge;
};

// manages list, orders by cat's age!


class Node
{
public:
Node (CAT*);
~Node();
void SetNext(Node * node) { itsNext = node; }
Node * GetNext() const { return itsNext; }
CAT * GetCat() const { return itsCat; }
void Insert(Node *);
void Display();
private:
CAT *itsCat;
Node * itsNext;
};

Node::Node(CAT* pCat):
itsCat(pCat),
itsNext(0)
{}

Node::~Node()
{
cout << "Deleting node...\n";
delete itsCat;
itsCat = 0;
delete itsNext;
itsNext = 0;
}

// ************************************
// Insert
// Orders cats based on their ages
// Algorithim: If you are last in line, add the cat
// Otherwise, if the new cat is older than you
// and also younger than next in line, insert it after
// this one. Otherwise call insert on the next in line
// ************************************
void Node::Insert(Node* newNode)
{
if (!itsNext)
itsNext = newNode;
else
{
int NextCatsAge = itsNext->GetCat()->GetAge();
int NewAge = newNode->GetCat()->GetAge();
int ThisNodeAge = itsCat->GetAge();

if ( NewAge >= ThisNodeAge && NewAge < NextCatsAge )


{
newNode->SetNext(itsNext);
itsNext = newNode;
}
else
itsNext->Insert(newNode);
}
}

void Node::Display()
{
if (itsCat->GetAge() > 0)
{
cout << "My cat is ";
cout << itsCat->GetAge() << " years old\n";
}
if (itsNext)
itsNext->Display();
}

int main()
{

Node *pNode = 0;
CAT * pCat = new CAT(0);
int age;

Node *pHead = new Node(pCat);

while (1)
{
cout << "New Cat's age? (0 to quit): ";
cin >> age;
if (!age)
break;
pCat = new CAT(age);
pNode = new Node(pCat);
pHead->Insert(pNode);
}
pHead->Display();
delete pHead;
cout << "Exiting...\n\n";
return 0;
}
‫‪ ‬‬
‫‪ ‬‬
‫الوحدة الرابعة‬
‫الدوال الصديقة والعمليات ‪ ‬‬
‫‪Friend Functions and Operators‬‬
‫‪ ‬‬
‫في ھذه الوحدة‪ ،‬عزيزي الطالب‪ ،‬سندرس الدوال واألصناف الصديقة‪ ،‬وكيفية تعريفھا واستخدامھا‪ .‬ثم سندرس‬
‫كيفية تعريف العمليات مثل) ‪ +‬و * و ‪ (-‬بحيث نجعلھا تتصرف كما نريد حسب نوعية العوامل‪ .‬وفي‬
‫القسم األخير سوف نتحدث عن المجموعات‬

‫‪ 2.1‬أھداف الوحدة‬
‫ينتظر منك‪ ،‬عزيزي الطالب‪ ،‬بعد تنفيذ البرامج أن تكون قادرا على أن‪:‬‬

‫تكتب وتستخدم الدوال التي تستقبل العوامل باإلشارة ‪.Reference Parameters.‬‬ ‫‪.1‬‬
‫تكتب الدوال الصديقة وتستدعيھا بشكل صحيح‪.‬‬ ‫‪.2‬‬
‫تعرف األصناف الصديقة‪.‬‬ ‫‪.3‬‬
‫تكتب تعريفات جديدة للعمليات المختلفة‪.‬‬ ‫‪.4‬‬
‫تعرف وتستخدم ‪. this‬‬ ‫‪.5‬‬

‫ﺗدرﻳب )‪(1‬‬
‫اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻟﺗﻣرﻳر اﻟﻌواﻣﻝ‪ ،‬اﻛﺗب اﻟﺑراﻣﺞ اﻟﺗﺎﻟﻳﺔ وﻧﻔذﻫﺎ ﻋﻠﻰ اﻟﺣﺎﺳوب ‪ ،‬وﻋﻠﻝ ﻧﺗﺎﺋﺞ اﻟﺗﻧﻔﻳذ‪.‬‬

‫تمرير العوامل باإلشارة ‪ parameter passing by reference.‬تمرير العوامل بالقيمة ‪parameter‬‬


‫‪passing by value.‬‬
void swap1(int X, int Y) void swap2(int* X,int* Y) void swap3(int
{ int T=X; { int T=*X; &X, int &Y)
X=Y; *X=*Y; { int
Y=T; *Y=T; T=X;
} }
X=Y;

Y=X;
}

main() main() main()


{int A=10; {int A=10; {int A=10;
int B=20; int B=20; int B=20;

cout<<"A="<<A<<" cout<<"A="<<A<<" cout<<"A="<<A


B="<<B<<endl; B="<<B<<endl; <<"
swap1(A,B); swap2(&A,&B);
B="<<B<<endl;
swap3(A,B);
cout<<"A="<<A<<" cout<<"A=‫<<ط‬A<<"
B="<<B<<endl; B="<<B<<endl;
} } cout<<"A="<<A
<<"

B="<<B<<endl;
}

A=10 B=20 A=10 B=20 A=10


A=10 B=20 A=20 B=10 B=20
A=20
B=10

(2) ‫ﺗدرﻳب‬
Friend Functions ‫الدوال الصديقة‬
‫ لھذه الدالة داخل تعريف الصنف‬prototype ‫تعرف الدالة على أنھا دالة صديقة لصنف ما بوضع نموذج‬
‫ مما يعني أن الدالة الصديقة لھا الحق في معالجة األجزاء الخاصة للصنف كما لو‬. friend ‫مسبوقا بالكلمة‬
.‫ وتختلف طريقة استدعاء الدالة الصديقة عن طريقة استدعاء الدالة المنتمية‬.‫كانت دالة منتمية للصنف‬
‫ إليجاد مربع المسافة‬Distance ‫ حيث يقوم البرنامج بتعريف صنف اسمه مسافة‬،‫ادرس البرنامج التالي جيدا‬
:‫ ثم اجب عن األسئلة التالية‬،‫المعطاة بالقدم والبوصة بالقياس قدم مربع‬

// friend square() function for Distance


#include <iostream>
////////////////////////////////////////////////////////////////
class Distance //English Distance class
{
private:
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0) //constructor (no args)
{ }
//constructor (two args)
Distance(int ft, float in) : feet(ft), inches(in)
{ }
void showdist() //display distance
{ cout << feet << "\'-" << inches << '\"'; }
friend float square(Distance); //friend function
};
//--------------------------------------------------------------
float square(Distance d) //return square of
{ //this Distance
float fltfeet = d.feet + d.inches/12; //convert to float
float feetsqrd = fltfeet * fltfeet; //find the square
return feetsqrd; //return square feet
}
////////////////////////////////////////////////////////////////
int main()
{
Distance dist(3, 6.0); //two-arg constructor (3'-6")
float sqft;

sqft = square(dist); //return square of dist


//display distance and square
cout << "\nDistance = "; dist.showdist();
cout << "\nSquare = " << sqft << " square feet\n";
return 0;
}

......................................................... ‫ ما ھي الدالة الصديقة من البرنامج‬.1


‫‪ .2‬ھل نستخدم اسم الصنف او عملية تقرير المجال ‪ ::‬في ترويسة ھذه الدالة ‪.............................‬‬
‫‪ .3‬كيف يتم استدعاء الدالة الصديقة ) اكتب جملة االستدعاء من البرنامج السابق( ‪............................‬‬
‫‪ .4‬كيف تستخدم المتغيرات المنتمية داخل الدوال الصديقة اعطي مثال على ذلك ‪..............................‬‬
‫‪ .5‬نفذ البرنامج واكتب نتيجة التنفيذ ‪..............................................................................‬‬

‫ﺗدرﻳب )‪ (3‬اﻷﺻﻧﺎف اﻟﺻدﻳﻘﺔ‬


‫لتجنب وضع عدد كبير من الدوال المنتمية إلى صنف كدوال صديقة إلى صنف آخر‪ ،‬نستطيع تعريف الصنف‬
‫بأكمله كصنف صديق للصنف اآلخر‪ .‬مما يعطي جميع الدوال المنتمية إلى الصنف األول القدرة على معالجة‬
‫األجزاء الخاصة في الصنف اآلخر‪ .‬على سبيل المثال لنفرض أن لدينا الصنفين ‪ beta‬والصنف ‪ alpha‬وأننا‬
‫نود إعطاء جميع الدوال المنتمية للصنف ‪ beta‬إمكانية معالجة جميع المتغيرات والدوال الخاصة بالصنف‬
‫‪ employee‬فبدال من أن نعرف كل من ھذه الدوال كدالة صديقة نستطيع تعريف الصنف ‪ beta‬كصديق‬
‫للصنف ‪ alpha‬مما يحقق نفس الغاية‪.‬‬
‫ادرس اﻟﺑرﻧﺎﻣﺞ اﻟﺗﺎﻟﻲ ﺟﻳدا وﻧﻔذة ﻋﻠﻰ اﻟﺣﺎﺳوب واطﺑﻊ ﻧﺗﻳﺟﺔ اﻟﺗﻧﻔﺑذ‪:‬‬
‫‪// friend classes‬‬
‫>‪#include <iostream‬‬
‫‪////////////////////////////////////////////////////////////////‬‬
‫‪class alpha‬‬
‫{‬
‫‪private:‬‬
‫;‪int data1‬‬
‫‪public:‬‬
‫‪alpha() : data1(99) { } //constructor‬‬
‫;‪friend class beta‬‬ ‫‪//beta is a friend class‬‬
‫;}‬
‫‪////////////////////////////////////////////////////////////////‬‬
‫‪class beta‬‬
‫{‬ ‫‪//all member functions can‬‬
‫‪public:‬‬ ‫‪//access private alpha data‬‬
‫} ;‪void func1(alpha a) { cout << "\ndata1=" << a.data1‬‬
‫} ;‪void func2(alpha a) { cout << "\ndata1=" << a.data1‬‬
‫;}‬
‫‪////////////////////////////////////////////////////////////////‬‬
‫)(‪int main‬‬
‫{‬
‫;‪alpha a‬‬
‫;‪beta b‬‬

‫;)‪b.func1(a‬‬
‫;)‪b.func2(a‬‬
‫;‪cout << endl‬‬
‫;‪return 0‬‬
‫}‬
( 4) ‫تدريب‬
‫إعادة تحميل عملية اإلسناد المساواة‬
‫ المختلفة بما يتناسب مع‬operator ‫ أنھا تمكننا من إعادة تعريف العمليات‬C++ ‫من المميزات الجميلة للغة‬
‫ لتعني اسناد – لتعني اسناد كائن الى‬alpha ‫ فمثال نستطيع تعريف العملية = كعملية منتمية للصنف‬.‫تطبيقاتنا‬
.‫اخر‬
// overloads assignment operator (=)
#include <iostream>
////////////////////////////////////////////////////////////////
class alpha
{
private:
int data;
public:
alpha() //no-arg constructor
{}
alpha(int d) //one-arg constructor
{ data = d; }
void display() //display data
{ cout << data; }
alpha operator = (alpha& a) //overloaded = operator
{
data = a.data; //not done automatically
cout << "\nAssignment operator invoked";
return alpha(data); //return copy of this alpha
}
};
////////////////////////////////////////////////////////////////
int main()
{
alpha a1(37);
alpha a2;

a2 = a1; //invoke overloaded =


cout << "\na2="; a2.display(); //display a2

alpha a3 = a2; //does NOT invoke =


cout << "\na3="; a3.display(); //display a3
cout << endl;
return 0;
}
(5) ‫تدريب‬
‫إعادة تحميل عملية اإلسناد المساواة‬
2 ‫استخدم فكرة إعادة التحميل إلسناد المساواة في التدريب‬
// friend overloaded + operator
#include <iostream>
////////////////////////////////////////////////////////////////
class Distance //English Distance class
{
private:
int feet;
float inches;
public:
Distance() //constructor (no args)
{ feet = 0; inches = 0.0; }
Distance( float fltfeet ) //constructor (one arg)
{ //convert float to Distance
feet = int(fltfeet); //feet is integer part
inches = 12*(fltfeet-feet); //inches is what's left
}
Distance(int ft, float in) //constructor (two args)
{ feet = ft; inches = in; }
void showdist() //display distance
{ cout << feet << "\'-" << inches << '\"'; }
friend Distance operator + (Distance, Distance); //friend
};
//--------------------------------------------------------------
Distance operator + (Distance d1, Distance d2) //add D1 to d2
{
int f = d1.feet + d2.feet; //add the feet
float i = d1.inches + d2.inches; //add the inches
if(i >= 12.0) //if inches exceeds 12.0,
{ i -= 12.0; f++; } //less 12 inches, plus 1 foot
return Distance(f,i); //return new Distance with sum
}
//--------------------------------------------------------------
int main()
{
Distance d1 = 2.5; //constructor converts
Distance d2 = 1.25; //float-feet to Distance
Distance d3;
cout << "\nd1 = "; d1.showdist();
cout << "\nd2 = "; d2.showdist();

d3 = d1 + 10.0; //distance + float: OK


cout << "\nd3 = "; d3.showdist();
‫;‪d3 = 10.0 + d1‬‬ ‫‪//float + Distance: OK‬‬
‫;)(‪cout << "\nd3 = "; d3.showdist‬‬
‫;‪cout << endl‬‬
‫;‪return 0‬‬
‫}‬

‫ﺗدرﻳب )‪(6‬‬
‫في ك ّل مرة يتم فيھا استدعاء الدوال المنتمية ‪ ،‬فانه يمرر بصورة اتوماتيكية مؤشر يدعى ‪ ، this‬إلى‬
‫الكينونة التي تم استدعائھا‪ .‬ھذا المؤشر يدعى ‪ this‬ويعتبر معامل ضمني لجميع الدوال المنتمية‪ .‬لذا ‪،‬في‬
‫داخل اي دوال منتمية‪ ،‬المؤشر ‪ this‬قد يستعمل لإلشارة إلى الكينونة المستدعاة‪.‬‬

‫نفذ البرنامج التالي وبين النتيجة التي حصلت عليھا ‪ ،‬ونقاش النتيجة التي حصلت عليھا‬

‫‪// this‬‬
‫>‪#include <iostream‬‬

‫{ ‪class CDummy‬‬
‫‪public:‬‬
‫;)‪int isitme (CDummy& param‬‬
‫;}‬

‫)‪int CDummy::isitme (CDummy& param‬‬


‫{‬
‫;‪if (&param == this) return true‬‬
‫;‪else return false‬‬
‫}‬

‫{ )( ‪int main‬‬
‫;‪CDummy a‬‬
‫;‪CDummy* b = &a‬‬
‫) )‪if ( b->isitme(a‬‬
‫;"‪cout << "yes, &a is b‬‬
‫;‪return 0‬‬
‫}‬
‫اﻟﻮﺣﺪة اﻟﺨﺎﻣﺴﺔ‬
‫األصناف المشتقة والقوالب‬
‫‪Derived Classes and Templates‬‬

‫ﻓﻲ ﻫـذﻩ اﻟوﺣـدة‪ ،‬ﻋزﻳزي اﻟـدارس‪ ،‬ﺳ ـ ـ ـ ـ ـ ــﻧﻧـﺎﻗش أﺳ ـ ـ ـ ـ ـ ــﺎﻟﻳـب ﻣﺧﺗﻠﻔـﺔ ﻟﺗﺣﻘﻳق اﻟﻬـدف اﻷﻫم ﻟﻠﻐـﺎت اﻟﺑرﻣﺟﺔ‬
‫اﻟﻛﻳﻧوﻧﻳﺔ وﻫو ﺗﻘﻠﻳﻝ اﻟﺣﺎﺟﺔ إﻟﻰ ﻛﺗﺎﺑﺔ دواﻝ ﺟدﻳدة ﻋن طرﻳق إﻋﺎدة اﺳـ ــﺗﺧدام اﻟدواﻝ اﻟﻘدﻳﻣﺔ ‪.Code Reuse‬‬
‫إذ ﺳ ـ ــﻧﻧﺎﻗش ﻓﻲ ﻫذﻩ اﻟوﺣدة ﻛﻳﻔﻳﺔ اﺷ ـ ــﺗﻘﺎق ﺻ ـ ــﻧف ﺟدﻳد‪ ،‬ﻳدﻋﻰ ﺑﺎﻟﺻ ـ ــﻧف اﻟﻣﺷ ـ ــﺗق ‪ ، Derived Class‬ﻣن‬
‫ﺻــﻧف )أو أﻛﺛر( آﺧر ﻳدﻋﻰ ﺑﺎﻟﺻــﻧف اﻷﺳــﺎس ‪ Base Class‬؛ ﻣﻣﺎ ﻳﺳــﻣﺢ ﻟﻧﺎ‪ ،‬إذا أﺣﺳــﻧﺎ ﺗﺻــﻣﻳم اﻟﻧظﺎم‪،‬‬
‫اﺳـ ــﺗﺧدام اﻟﻛﺛﻳر ﻣن اﻟدواﻝ اﻟﺧﺎﺻـ ــﺔ ﺑﺎﻟﺻـ ــﻧف اﻷﺳـ ــﺎس ﻟﻠﺻـ ــﻧف اﻟﻣﺷـ ــﺗق دون اﻟﺣﺎﺟﺔ إﻟﻰ إﻋﺎدة ﻛﺗﺎﺑﺗﻬﺎ ﻣن‬
‫ﺗورث إﻟﻰ اﻟﺻ ــﻧف اﻟﻣﺷ ــﺗق‪ .‬ﻻﺣظ‪ ،‬ﻋزﻳزي‬
‫ﺟدﻳد‪ .‬وذﻟك ﻷن اﻟﻣﺗﻐﻳرات واﻟدواﻝ اﻟﺧﺎﺻ ــﺔ ﺑﺎﻟﺻ ــﻧف اﻷﺳ ــﺎس ّ‬
‫اﻟدارس‪ ،‬أن إﻋﺎدة اﺳﺗﺧدام اﻟدواﻝ ‪ Code Reuse‬ﻻ ﻳﻘﻠﻝ‪ ،‬ﻓﻘط‪ ،‬ﻣن اﻟﺟﻬد واﻟوﻗت اﻟﻼزﻣﻳن ﻟﺗطوﻳر اﻟﺑراﻣﺞ‪،‬‬
‫إﻧﻣﺎ أﻳﺿـ ـ ـ ـ ـ ـﺎً ﻳﻘﻠﻝ ﻣن اﻟوﻗت واﻟﺟﻬد اﻟﻼزﻣﻳن ﻟﺻ ـ ـ ـ ـ ــﻳﺎﻧﺗﻬﺎ‪ .‬وﻳﺳ ـ ـ ـ ـ ــﺎﻋدﻧﺎ أﻳﺿـ ـ ـ ـ ـ ـﺎً ﻋﻠﻰ إﻧﺗﺎج ﺑراﻣﺞ ﻳﻌﺗﻣد ﻋﻠﻳﻬﺎ‬
‫‪ ،reliable‬إذ إن اﺳﺗﺧدام داﻟﺔ ﻣﺟرﺑﺔ ﺧﻳر ﻣن ﻛﺗﺎﺑﺔ داﻟﺔ ﺟدﻳدة ﻗد ﺗﺣوي أﺧطﺎء ﺧﻔﻳﺔ‪.‬‬

‫وﻣن اﻟطرق اﻷﺧرى اﻟﺗﻲ ﺗزودﻧﺎ ﺑﻬﺎ ﻟﻐﺔ ‪ C ++‬ﻟﺗﺳــﺎﻋدﻧﺎ ﻓﻲ ﺗﺣﻘﻳق ﻫدﻓﻧﺎ ﻓﻲ إﻋﺎدة اﺳــﺗﺧدام اﻟﺑراﻣﺞ‬
‫ﻫو ﻣﺎ ﻳﺳ ــﻣﻰ ﺑﺎﻟدواﻝ اﻟﻘﺎﻟﺑﻳﺔ ‪ Template Functions‬وﻫﻲ دواﻝ ﺗﻛﺗب ﺑطرﻳﻘﺔ ﺗﺳ ــﻣﺢ ﻟﻧﺎ ﺑﺎﺳ ــﺗﺧداﻣﻬﺎ ﻋﻠﻰ‬
‫أﻧواع ﻣﺧﺗﻠﻔـﺔ ﻣن اﻟﺑﻳـﺎﻧـﺎت دون اﻟﺣـﺎﺟﺔ إﻟﻰ ﻛﺗﺎﺑﺔ ﻧﺳ ـ ـ ـ ـ ـ ــﺧﺔ ﻣن ﻫذﻩ اﻟدواﻝ ﻟﻛﻝ ﻧوع ﻣن أﻧواع اﻟﺑﻳﺎﻧﺎت‪ .‬ﻛذﻟك‬
‫ﺗﺳ ـ ـ ــﻣﺢ ﻟﻧﺎ ﻟﻐﺔ ‪ C ++‬ﺑﺗﻌرﻳف أﺻ ـ ـ ــﻧﺎف ﻗﺎﻟﺑﻳﺔ وﻫﻲ أﺻ ـ ـ ــﻧﺎف ﻋﺎﻣﺔ ﺗﺳ ـ ـ ــﻣﺢ ﻟﻧﺎ ﺑﺗﺄﺟﻳﻝ ﺗﺣدﻳد ﻧوع اﻟﻣﺗﻐﻳرات‬
‫اﻟﻣﻧﺗﻣﻳﺔ إﻟﻰ ﺣﻳن اﺳــﺗﺧداﻣﻬﺎ‪ ،‬وﺑذﻟك ﻓﻬﻲ ﺗﻣﻧﺣﻧﺎ اﻟﻘدرة ﻋﻠﻰ ﺗﻌرﻳف أﺻــﻧﺎف ﺧﺎﺻــﺔ ﺗﻌﻣﻝ ﻋﻠﻰ أﻧواع ﺑﻳﺎﻧﺎت‬
‫ﻣﺧﺗﻠﻔﺔ دون اﻟﺣﺎﺟﺔ إﻟﻰ ﻛﺗﺎﺑﺔ ﻫذﻩ اﻷﺻﻧﺎف اﻟﻣﺧﺗﻠﻔﺔ وﺗﻌرﻳف دواﻟﻬﺎ‪.‬‬

‫وﻣﻣن اﻟﻣﻣﻳزات اﻟﻬﺎﻣﺔ ﻟﻠﻐﺔ ‪ C ++‬ﻣﺎ ﻳدﻋﻰ ﺑﺗﻌدد اﻷوﺟﻪ ‪ ،polymorphism‬ﺣﻳث ﺗﺳـ ـ ـ ـ ــﻣﺢ ﻟﻧﺎ ﻟﻐﺔ‬
‫‪ C ++‬ﺑﺗﺄﺧﻳر ﺗﺣدﻳد ﻫوﻳﺔ اﻟداﻟﺔ اﻟﺗﻲ ﺳﺗﺳﺗدﻋﻰ إﻟﻰ وﻗت ﺗﻧﻔﻳذ اﻟﺑرﻧﺎﻣﺞ )وﻟﻳس وﻗت ﺗرﺟﻣﺗﻪ ﻛﻣﺎ ﻫﻲ اﻟﻌﺎدة(‬
‫ﻣﻣﺎ ﻳﻣﻧﺣﻧﺎ اﻟﻘدرة ﻋﻠﻰ ﻛﺗﺎﺑﺔ ﺑراﻣﺞ ﺗﻘوم ﺑﻣﻬﺎم ﻣن اﻟﺻ ـ ـ ـ ـ ـ ــﻌب ﻛﺗﺎﺑﺗﻬﺎ ﺑﻠﻐﺎت اﻟﺑرﻣﺟﺔ اﻟﺗﻘﻠﻳدﻳﺔ أو ﻣﺎ ﻳﺳ ـ ـ ـ ـ ـ ــﻣﻰ‬
‫ﺑﻠﻐﺎت اﻟﺑرﻣﺟﺔ اﻹﺟراﺋﻳﺔ ﻛﺎﻟﺑﺎﺳﻛﺎﻝ‪ ،‬ﻋﻠﻰ ﺳﺑﻳﻝ اﻟﻣﺛﺎﻝ‪.‬‬

‫أﻫداف اﻟوﺣدة‬
‫ﻳﺗوﻗﻊ ﻣﻧك‪ ،‬ﻋزﻳزي اﻟدارس‪ ،‬ﻋﻧد ﻓراﻏك ﻣن دراﺳﺔ ﻫذﻩ اﻟوﺣدة‪ ،‬أن ﺗﻛون ﻗﺎد اًر ﻋﻠﻰ أن ‪:‬‬
‫‪ .1‬ﺗﺻﻣم ﻣﺎ ﻳﺳﻣﻰ ﺑﺷﺟرة اﻷﺻﻧﺎف اﻟﻬرﻣﻳﺔ ﺑﺣﻳث ﺗﻘﻠﻝ اﻟﺣﺎﺟﺔ إﻟﻰ إﻋﺎدة ﻛﺗﺎﺑﺔ دواﻝ ﺟدﻳدة ﻗدر اﻹﻣﻛﺎن‪.‬‬
‫‪ .2‬ﺗﻌرف أﺻﻧﺎﻓًﺎ ﺟدﻳدة ﻣﺷﺗﻘﺔ ﻣن أﺻﻧﺎف أﺧرى ﻣﻔردة أو ﻣﺗﻌددة‪.‬‬
‫‪ .3‬ﺗﺑﻳن أﻧواع اﻟوراﺛﺔ اﻟﻣﺧﺗﻠﻔﺔ وﻛﻳف ﺗﺳﺗﺧدﻣﻬﺎ‪.‬‬
‫‪ .4‬ﺗﻌرف دواﻝ ﻗﺎﻟﺑﻳﺔ ‪ Template Functions‬وﺗﺳﺗﺧدﻣﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ‪.‬‬
‫‪ .5‬ﺗﻌرف ﺻﻧﻔﺎً ﻗﺎﻟﺑﻳﺎً ‪ Template Class‬وﺗﻌرف ﻛﻳف ﺗﺳﺗﺧدﻣﻪ ﻟﻌﻣﻝ أﺻﻧﺎف ﺟدﻳدة‪.‬‬
‫‪ .6‬ﺗﻌرف ﻛﻳف وﻣﺗﻰ ﺗﺳﺗﺧدم ﺧﺎﺻﻳﺔ ﺗﻌدد اﻷوﺟﻪ ‪ polymorphism‬اﻟﻣﻬﻣﺔ‪.‬‬

‫اﻟوراﺛﺔ اﻟﻣﻧﻔردة ‪:Single Inheritance‬‬


‫ﻟو ﻓرﺿﻧﺎ ان ﻟدﻳﻧﺎ اﻟﺻﻧف ‪ Shape‬واﻟذي ﻳﻌﺗﺑر اﻟﺻﻧف اﻷﺳﺎس ﻷي ﺷﻛﻝ ﻫﻧدﺳﻲ ﻓﺈﻧﻪ ﻳﻣﻛﻧﻧﺎ أن ﻧﻛﺗب‬
‫اﻟﺻﻧف ‪ Rectangle‬واﻟذي ﻳﻣﺛﻝ اﻟﻣﺳﺗطﻳﻝ ﺑﺄن ﻳﻛون ﻣﺷﺗﻘﺎ )أن ﻳرث( ﻣن اﻟﺻﻧف ‪ ،Shape‬أدرس اﻟﻣﺛﺎﻝ‬
‫اﻟﺗﺎﻟﻲ وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب‪:‬‬

‫>‪#include <iostream‬‬
‫>‪#include <conio.h‬‬

‫‪// Base class‬‬


‫‪class Shape‬‬
‫{‬
‫‪public:‬‬
‫)‪void setWidth(int w‬‬
‫{‬
‫;‪width = w‬‬
‫}‬
‫)‪void setHeight(int h‬‬
‫{‬
‫;‪height = h‬‬
‫}‬
‫‪protected:‬‬
int width;
int height;
};

// Derived class
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};

int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);

// Print the area of the object.


cout << "Total area: " << Rect.getArea() << endl;
getch();
}

:‫ﻧﺎﺗﺞ ﺗﻧﻔﻳذ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻫو‬


Total area: 35

:Multiple Inheritance ‫اﻟوراﺛﺔ اﻟﻣﺗﻌددة‬


.‫أدرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳوﺿﺢ ﻣﻔﻬوم اﻟوراﺛﺔ اﻟﻣﺗﻌددة وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب‬
#include <iostream>
#include <conio.h>

// Base class Shape


class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};

// Base class PaintCost


class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};

// Derived class
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};

int main(void)
{
Rectangle Rect;
int area;

Rect.setWidth(5);
Rect.setHeight(7);

area = Rect.getArea();

// Print the area of the object.


cout << "Total area: " << Rect.getArea() << endl;

// Print the total cost of painting


cout << "Total paint cost: $" << Rect.getCost(area) << endl;

getch();
}

:‫ﻧﺎﺗﺞ ﺗﻧﻔﻳذ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻫو‬


‫‪Total area: 35‬‬
‫‪Total paint cost: $2450‬‬

‫ﺗﻣرﻳن)‪ :(1‬اﻛﺗب اﻟﻧص اﻟﺑرﻣﺟﻲ اﻟذي ﻳﺣﻘق اﻟوراﺛﺔ اﻟﻣﻧﻔردة اﻟﻣوﺿﺣﺔ ﻓﻲ اﻟﺷﻛﻝ اﻟﺗﺎﻟﻲ ﻋﻠﻣﺎ ﺑﺎن اﻟﺻﻧﻔﺎن‬
‫اﻟﻣﺷﺗﻘﺎن ﻳﺣﺗوﻳﺎن دواﻝ ﺣﺳﺎب اﻟﻣﺳﺎﺣﺔ‪.‬‬

‫‪CPolygon‬‬
‫‪width : Integer‬‬
‫‪height : Integer‬‬

‫)(‪set_values‬‬

‫‪CRectangle‬‬ ‫‪CTriangle‬‬

‫)( ‪area‬‬ ‫)( ‪area‬‬

‫ﻣﺳﺎﻋدة‪ :‬اﻟﻧص اﻟﺑرﻣﺟﻲ ﻟﻠﺻﻧف ‪ CPolygon‬ﻫو‪:‬‬

‫‪// derived classes‬‬


‫>‪#include <iostream‬‬
‫>‪#include <conio.h‬‬
‫{ ‪class CPolygon‬‬
‫‪protected:‬‬
‫;‪int width, height‬‬
‫‪public:‬‬
‫)‪void set_values (int a, int b‬‬
‫};‪{ width=a; height=b‬‬
‫;}‬

‫ﻋرﻓﻧﺎ ﺻﻧﻔﺎ أﺳﺎﺳﻳﺎ اﺳﻣﻪ ‪ COutput‬وأردﻧﺎ ﻣن اﻟﺻﻧﻔﻳن ‪CTriangle, CRectangle‬‬


‫ﺗﻣرﻳن)‪ :(2‬ﻟو ّ‬
‫أن ﻳرﺛﺎ ﻣن ﻫذا اﻟﺻﻧف ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ اﻟوراﺛﺔ ﻣن اﻟﺻﻧف ‪ CPolygon‬اﻟﺳﺎﺑق‪ .‬اﻋﻣﻝ اﻟﺗﻌدﻳﻝ اﻟﻼزم‬
‫ﻋﻠﻰ اﻟﺑرﻧﺎﻣﺞ اﻟﺳﺎﺑق ﻟﺗﺣﻘﻳق ﻣﻔﻬوم اﻟوراﺛﺔ اﻟﻣﺗﻌددة‪.‬‬
‫ﻣﺳﺎﻋدة‪ :‬ﺗﻌرﻳف اﻟﺻﻧف ‪ COutput‬ﻫو‪:‬‬

‫{ ‪class COutput‬‬
‫‪public:‬‬
void output (int i);
};

Polymorphism ‫ﺗﻌدد اﻻوﺟﻪ‬


‫ ﻻﺣظ ﻧﺎﺗﺞ اﻟﺗﻧﻔﻳذ ﺛم‬.C++ ‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳﺑﻳن ﻣﻔﻬوم اﻟوراﺛﺔ اﻟﻣﺗﻌددة وﻧﻔذﻩ ﺑﺎﺳﺗﺧدام ﻣﺗرﺟم‬
.‫أﺟب ﻋن اﻟﺳؤاﻝ اﻟذي ﻳﻠﻳﻪ‬
#include <iostream>
#include <conio.h>
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height / 2);
}
};
// Main function for the program
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);

// store the address of Rectangle


shape = &rec;
// call rectangle area.
shape->area();

// store the address of Triangle


shape = &tri;
// call triangle area.
shape->area();
getch();
}
‫ﻧﺎﺗﺞ ﺗﻧﻔﻳذ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻫو‬
Parent class area
Parent class area

‫ وﻳﻌطﻲ‬Polymorphism ‫ أﻋﻣﻝ اﻟﺗﻌدﻳﻝ اﻟﻼزم ﻋﻠﻰ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻟﻳﺣﻘق ﻣﻔﻬوم ﺗﻌدد اﻻوﺟﻪ‬:(3) ‫ﺗﻣرﻳن‬
:‫اﻟﻧﺗﻳﺟﺔ اﻟﺗﺎﻟﻳﺔ‬
Rectangle class area
Triangle class area

:‫اﻟﻘواﻟب‬

.‫ واﻟﺗﻲ ﺗﻌﻣﻝ ﻋﻠﻰ ﺗﺑدﻳﻝ ﻣﺗﻐﻳران ﻣن ﻧوع ﻛﺎﺋن ﻣن ﻧﻔس اﻟﺻﻧف‬Swap ‫اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﻳﻌرف ﻗﺎﻟﺑﺎ ﻟﻠداﻟﺔ‬

template <class Type>


void Swap (Type &x, Type &y)
{
Type tmp = x;
x = y;
y = tmp;
}
‫ﺗﻣرﻳن)‪ :(4‬اﻛﺗب ﻗﺎﻟﺑﺎ ﻟﻠداﻟﺔ ‪ GetMax‬واﻟﺗﻲ ﺗﻌﻳد أﻛﺑر ﻛﺎﺋن ﻣن اﻟﻛﺎﺋﻧﻳن اﻟﻣﻣررﻳن إﻟﻳﻬﺎ‪ ،‬ﺛم اﺳﺗدع ﻫذﻩ‬
‫اﻟداﻟﺔ ﻣرﺗﻳن‪ ،‬اﻷوﻟﻰ ﻟﻣﻘﺎرﻧﺔ ﻋددﻳن ﺻﺣﻳﺣﻳن ‪ ،‬وﻣرة أﺧرى ﻟﺗﻘﺎرن ﻋددﻳن ﻣن ﻧوع ‪.float‬‬

‫ﺗﻣرﻳن)‪ :(5‬اﻛﺗب اﻟﻘﺎﻟب ‪ GetMin‬واﻟذي ﻳﻘﺑﻝ ﻧوﻋﻳن ﻣﺧﺗﻠﻔﻳن ﻣن اﻟﺑﻳﺎﻧﺎت‪ .‬وﻗم ﺑﺗﻧﻔﻳذﻩ‪.‬‬

‫ﺗﻣرﻳن)‪ :(6‬اﻛﺗب ﺻﻧﻔﺎ ﻳﻘﺑﻝ أﻋﺿﺎء ﻣن أﻧواع ﻋﺎﻣﺔ وﻳﺳطﻳﻊ أن ﻳﺧزن ﻋﻧﺻرﻳن ﻣن أي ﻧوع ﻣﻘﺑوﻝ وﻳﺣﺗوي‬
‫داﻟﺔ ﺗﻌﻳد أﻛﺑر ﻗﻳﻣﺔ‪.‬‬
‫ﺣﻠوﻝ ﺗﻣرﻳﻧﺎت اﻟوﺣدة اﻟﺧﺎﻣﺳﺔ‬
:(1) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// derived classes
#include <iostream>
#include <conio.h>
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};

class CRectangle: public CPolygon {


public:
int area (void)
{ return (width * height); }
};
class CTriangle: public CPolygon {
public:
int area (void)
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
cout << rect.area() << endl;
cout << trgl.area() << endl;
getch();
}

:(2) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// multiple inheritance
#include <iostream>
#include <conio.h>
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};
class COutput {
public:
void output (int i);
};
void COutput::output (int i) {
cout << i << endl;
}
class CRectangle: public CPolygon, public
COutput {
public:
int area (void)
{ return (width * height); }
};
class CTriangle: public CPolygon, public
COutput {
public:
int area (void)
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
rect.output (rect.area());
trgl.output (trgl.area());
getch();
}

‫ ﺑﺄن ﻳﺳﺑق ﺗﻌرﻳﻔﻬﺎ اﻟﻛﻠﻣﺔ‬Shape ‫ ﻓﻲ اﻟﺻﻧف‬area ‫ اﻟﺗﻌدﻳﻝ ﻫو ﻋﻠﻰ ﺗﻌرﻳف اﻟداﻟﺔ‬:(3) ‫ﺣﻝ اﻟﺗﻣرﻳن‬
.Polymorphism ‫ ﻣن أﺟﻝ ﺗﺣﻘﻳق ﻣﻔﻬوم ﺗﻌدد اﻷﺷﻛﺎﻝ‬virtual

class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
virtual int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};

:(4) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// function template
#include <iostream>
#include <conio.h>
template <class S>
S GetMax (S a, S b) {
S result;
return ( result = (a>b)? a : b );
}
int main () {
int i=5, j=6, k;
float l=10.0, m=5.0, n;
k=GetMax<int>(i,j);
n=GetMax<float>(l,m);
cout << k << "\n" << n << endl;
getch();
}

:(5) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// function template
#include <iostream>
#include <conio.h>
template <class T, class U>
T GetMin (T a, U b) {
return ( a < b ? a : b ) ;
}
int main () {
int i=5, j=6, k;
float l=10.0, m=5.0, n;
k = GetMin<int,float> (j,l);
n = GetMin (j,l);
cout << k << "\n" << n << endl;
getch();
}

:(6) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// class templates
#include <iostream>
#include <conio.h>
template <class T>
class mypair {
T a, b;
public:
mypair (T first, T second)
{a=first; b=second;}
T getmax ();
};
template <class T>
T mypair<T>::getmax ()
{
T retval;
retval = a>b? a : b;
return retval;
}
int main () {
mypair <int> myobject (100, 75);
cout << myobject.getmax()<<endl;
getch();
}
‫اﻟﻮﺣﺪة اﻟﺴﺎدﺳﺔ‬
‫معالجة الملفات بلغة ‪C++‬‬
‫‪File Processing with C++‬‬

‫ﻋﻣﺎ ﻳﺗﻌﻠق ﺑﻣﻌﺎﻟﺟﺔ اﻟﻣﻠﻔﺎت ﻓﻲ‬


‫ﻋزﻳزي اﻟدارس‪ ،‬ﺗﻬدف ﻫذﻩ اﻟوﺣدة إﻟﻰ إﻋطﺎﺋك ﻣﻌﻠوﻣﺎت أﺳ ـ ــﺎﺳ ـ ــﻳﺔ ّ‬
‫ﻟﻐﺔ ‪ C ++‬وﺗوﺿﻳﺢ ﺑﻌض اﻟﻌﻣﻠﻳﺎت اﻷﺳﺎﺳﻳﺔ ﻋﻠﻰ اﻟﻣﻠﻔﺎت ﺑﺄﻧواﻋﻬﺎ اﻟﻣﺧﺗﻠﻔﺔ‪.‬‬

‫ﺗﺗﻧــﺎوﻝ ﻫــذﻩ اﻟوﺣــدة ﺗﻌرﻳف ﻣﻔﻬوم ﻫﻳﻛــﻝ اﻟﺑﻳــﺎﻧــﺎت وﻣوﻗﻊ اﻟﻣﻠﻔــﺎت ﺑﻳﻧﻬــﺎ ٕواﻋطــﺎء ﻟﻣﺣــﺔ ﻣﺧﺗﺻ ـ ـ ـ ـ ـ ــرة ﻋن‬
‫اﻷﻧواع اﻟﻣﺧﺗﻠﻔﺔ ﻣن اﻟﺑﻳﺎﻧﺎت‪ .‬وﻳﺗﻠو ذﻟك ﻣﻧﺎﻗﺷﺔ اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻓﻲ ﺗﻧظﻳم اﻟﻣﻠﻔﺎت وﺗﻌرﻳف اﻟﻣﻠﻔﺎت واﻟﻳﻧﺎﺑﻳﻊ‪،‬‬
‫وﻣن ﺛم ﺗوﺿــﻳﺢ ﻛﻳﻔﻳﺔ إﻧﺷــﺎء اﻟﻣﻠﻔﺎت اﻟﺗﺗﺎﺑﻌﻳﺔ واﻟﻌﺷ ـواﺋﻳﺔ وﻗراءﺗﻬﺎ وﺗﺣدﻳﺛﻬﺎ‪ ،‬وأﺧﻳ اًر ﺗم ﺗوﺿ ــﻳﺢ ﻛﻳﻔﻳﺔ اﻟﺗﻌﺎﻣﻝ‬
‫ﻣﻊ اﻟﻛﺎﺋﻧﺎت ﻣن ﺣﻳث اﻹدﺧﺎﻝ واﻹﺧراج ﻓﻲ اﻟﻣﻠﻔﺎت‪.‬‬

‫أﻫداف اﻟوﺣدة‬
‫ﻳﻧﺗظر ﻣﻧك‪ ،‬ﻋزﻳزي اﻟدارس‪ ،‬ﺑﻌد ﻓراﻏك ﻣن دراﺳﺔ ﻫذﻩ اﻟوﺣدة‪ ،‬أن ﺗﻛون ﻗﺎد اًر ﻋﻠﻰ أن‪:‬‬

‫ﺗﻌرف ﻫﻳﻛﻝ اﻟﺑﻳﺎﻧﺎت وﻣوﻗﻊ اﻟﻣﻠﻔﺎت ﺑﻳﻧﻬﺎ‪.‬‬


‫‪ّ .1‬‬

‫ﺗﻌرف اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻓﻲ ﺗﻧظﻳم اﻟﻣﻠﻔﺎت )‪  .(File Organization‬‬


‫‪ّ .2‬‬

‫ﺗﻌرف اﻟﻣﻠﻔﺎت واﻟﻳﻧﺎﺑﻳﻊ )‪  (Files and Streams‬‬


‫‪ّ .3‬‬

‫‪ .4‬ﺗﻧﺷﺊ اﻟﻣﻠﻔﺎت اﻟﺗﺗﺎﺑﻌﻳﺔ وﺗﻘرؤﻫﺎ وﺗﺣدﺛﻬﺎ‪  .‬‬

‫‪ .5‬ﺗﻧﺷﺊ اﻟﻣﻠﻔﺎت اﻟﻌﺷواﺋﻳﺔ وﺗﻘرؤﻫﺎ وﺗﺣدﺛﻬﺎ‪  .‬‬

‫‪ .6‬ﺗدﺧﻝ اﻟﻛﺎﺋﻧﺎت وﺗﺧرﺟﻬﺎ )‪.(Input/Output of Objects‬‬


‫ أدرس اﻟﻣﺛﺎﻝ اﻟﻣﻛﺗوب وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب ﺛم ﻗم ﺑﻣﺎ‬،‫اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﻳوﺿﺢ ﻛﻳﻔﻳﺔ اﻟﻘراءة واﻟﻛﺗﺎﺑﺔ ﻓﻲ ﻣﻠف‬
:‫ﻳﻠﻲ‬
.‫ أدﺧﻝ اﻟﺑﻳﺎﻧﺎت اﻟﻣطﻠوﺑﺔ أﺛﻧﺎء اﻟﺗﻧﻔﻳذ‬-1
.(‫ أﻧظر ﻧﺎﺗﺞ اﻟﺗﻧﻔﻳذ ﻋﻠﻰ اﻟﺷﺎﺷﺔ )ﺳﻳظﻬر ﻣن ﺿﻣﻧﻬﺎ اﻟﻣﻌﻠوﻣﺎت اﻟﺗﻲ ﻗﻣت ﺑﺈدﺧﺎﻟﻬﺎ‬-2
.‫ ﻋﻠﻰ ﻣﺟﻠد اﻟﻌﻣﻝ‬afile.dat ‫ ﺑﻌد ﺗﻧﻔﻳذ اﻟﺑرﻧﺎﻣﺞ ﺳﻳﺗم اﻧﺷﺎء ﻣﻠف ﺑﺎﺳم‬-3
‫ ﻣﺎ ﻣﺣﺗوﻳﺎت اﻟﻣﻠف؟‬،‫ ﻣﺛﻼ‬notepad ‫ ﺑواﺳطﺔ ﻣﺣرر ﻧﺻوص ﻣﺛﻝ ﺑرﻧﺎﻣﺞ‬afile.dat ‫اﻓﺗﺢ اﻟﻣﻠف‬-4

#include <fstream>
#include <iostream>
#include <conio.h>
int main ()
{
char data[100];
// open a file in write mode.
ofstream outfile;
outfile.open("afile.dat");

cout << "Writing to the file" << endl;


cout << "Enter your name: ";
cin.getline(data, 100);

// write inputted data into the file.


outfile << data << endl;

cout << "Enter your age: ";


cin >> data;
cin.ignore();

// again write inputted data into the file.


outfile << data << endl;

// close the opened file.


outfile.close();

// open a file in read mode.


ifstream infile;
infile.open("afile.dat");

cout << "Reading from the file" << endl;


infile >> data;
‫‪// write the data at the screen.‬‬
‫;‪cout << data << endl‬‬

‫‪// again read the data from the file and display it.‬‬
‫;‪infile >> data‬‬
‫;‪cout << data << endl‬‬

‫‪// close the opened file.‬‬


‫;)(‪infile.close‬‬

‫;)(‪getch‬‬
‫}‬

‫ﺗﻣرﻳن )‪ :(1‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻟﻛﺗﺎﺑﺔ ﻧﺻﺎ ﻓﻲ ﺳطرﻳن داﺧﻝ ﻣﻠف ‪ .example.txt‬ﻣوﺿﺣﺎ ﻛﻳﻔﻳﺔ ﻓﺗﺢ اﻟﻣﻠف‬
‫ﻟﻠﻛﺗﺎﺑﺔ دون ﻣﺳﺢ ﻣﺣﺗوﻳﺎت اﻟﻣﻠف إن ﻛﺎن ﻣوﺟودا ﻣن ﻗﺑﻝ‪.‬‬

‫ﺗﻣرﻳن )‪ :(2‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻘراءة ﻣﺣﺗوﻳﺎت اﻟﻣﻠف اﻟﻣذﻛور ﻓﻲ اﻟﺗﻣرﻳن اﻟﺳﺎﺑق وطﺑﺎﻋﺔ ﻣﺣﺗوﻳﺎﺗﻪ ﻋﻠﻰ‬
‫اﻟﺷﺎﺷﺔ‪ٕ .‬وان ﻛﺎن اﻟﻣﻠف ﻏﻳر ﻣوﺟود ﻓﺈﻧﻪ ﻳطﺑﻊ رﺳﺎﻟﺔ ﺗﺑﻳن ذﻟك‪.‬‬

‫ﺗﻣرﻳن )‪ :(3‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻟﺣﺳﺎب ﺣﺟم اﻟﻣﻠف ‪example.txt‬‬

‫ﺗﻣرﻳن )‪ :(4‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻛﺗﺎﺑﺔ ﻋدد ﻣن ﺳﺟﻼت طﻠﺑﺔ ﻓﻲ ﻣﻠف ﻋﺷواﺋﻲ‪ ،‬ﺣﻳث ﻳﺗوﻗف اﻟﺑرﻧﺎﻣﺞ‬
‫ﻋﻧدﻣﺎ ﻳﻘوم اﻟﻣﺳﺗﺧدم ﺑﺈدﺧﺎﻝ رﻗم طﺎﻟب أﻗﻝ ﻣن ‪ 0‬أو أﻛﺑر ﻣن ‪ ، 100‬وﻫﻲ ﻣﺟﻣوﻋﺔ أرﻗﺎم اﻟطﻠﺑﺔ اﻟﻣراد‬
‫اﻧﺷﺎء ﺳﺟﻼت ﻟﻬم‪.‬‬
‫ﻣﻼﺣظﺔ‪ :‬ﺑﻌد ﻛﺗﺎﺑﺔ اﻟﺑرﻧﺎﻣﺞ وﺗﻧﻔﻳذﻩ ﺑﻧﺟﺎح‪ ،‬ﺣﺎوﻝ ﻓﺗﺢ اﻟﻣﻠف اﻟﻣﻧﺷﺄ ﺑواﺳطﺔ ﻣﺣرر ﻧﺻوص ﺛم ﻻﺣظ ﻛﻳف‬
‫ﺗظﻬر ﻣﺣﺗوﺑﺎت اﻟﻣﻠف!!‬

‫ﺗﻣرﻳن )‪ :(5‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻘراءة ﻋدد ﻣن اﻟﺳﺟﻼت ﻣن ﻣﻠف اﻟﺗﻣرﻳن اﻟﺳﺎﺑق ﺑﺎﺳﺗﺧدام اﻟداﻟﺔ ‪read‬‬
‫واﻟداﻟﺔ ‪. seekg‬‬
‫ﺣﻠوﻝ ﺗﻣرﻳﻧﺎت اﻟوﺣدة اﻟﺳﺎدﺳﺔ‬
:(1) ‫ﺣﻝ ﺗﻣرﻳن‬
// writing on a text file
#include <iostream>
#include <fstream>
int main () {
ofstream myfile ("example.txt", ios::app);
if (myfile.is_open())
{
myfile << "This is a line.\n";
myfile << "This is another line.\n";
myfile.close();
}
else cout << "Unable to open file";
return 0;
}

:(2) ‫ﺣﻝ اﻟﺗﻣرﻳن‬


// reading a text file
#include <iostream>
#include <fstream>
#include <string>

int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}

else cout << "Unable to open file";


return 0;
}
:(3) ‫ﺣﻝ اﻟﺗﻣرﻳن‬
// obtaining file size
#include <iostream>
#include <fstream>

int main () {
long begin, end;
ifstream myfile ("example.txt");
begin = myfile.tellg();
myfile.seekg (0, ios::end);
end = myfile.tellg();
myfile.close();
cout << "size is: " << (end-begin) << " bytes.\n";
return 0;
}

:(4) ‫ﺣﻝ ﺗﻣرﻳن‬


#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>

//using namespace std;


const int No_Of_Records =100;
struct student
{
int no;
char name[32];
float average;
};

int main(void)
{
student studentrecord;
int sno;
char sname[32];
float saverage;
ofstream outStudentFile("studrf.dat",ios::in|ios::out|ios::binary);
if(!outStudentFile)
{
cerr << "File could not be opened" << endl;
exit(1);
}
cout <<"\nEnter student no (1 to 100), any number else to end input: ";
cin >> sno;
while(sno >0 && sno<=No_Of_Records)
{
cout << "\nEnter student name: ";
cin >> sname;
cout << "\nEnter student average: ";
cin >> saverage;
studentrecord.no=sno;
strcpy(studentrecord.name,sname);
studentrecord.average=saverage;
outStudentFile.seekp((studentrecord.no-1)* sizeof(struct student));
outStudentFile.write(reinterpret_cast <const char *>
(&studentrecord),sizeof(struct student));
cout <<"\n\nEnter student no (1 to 100), any number else to end input: ";
cin >> sno;
} // end while
outStudentFile.close();
return 0;
}

:(5) ‫ﺣﻝ اﻟﺗﻣرﻳن‬


#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
const int No_Of_Records =100;
int main(void)
{
struct student
{
int no;
char name[32];
float average;
};
student studentrecord;
int sno;
ifstream inStudentFile("studrf.dat",ios::in);
if(!inStudentFile)
{
cerr << "File could not be opened" << endl;
exit(1);
}
cout <<"\nEnter student no (1 to 100), any number else to end displaying records: ";
cin >> sno;
while (sno >0 && sno<=No_Of_Records)
{
inStudentFile.seekg((sno-1)* sizeof(struct student));
inStudentFile.read(reinterpret_cast <char *>
(&studentrecord),sizeof(struct student));
cout << "\nStudent Data for student no " << studentrecord.no;
cout << "\nName: " << studentrecord.name;
cout << "\nAverage: " << studentrecord.average;
cout <<"\n\nEnter student no (1 to 100), any number else to end displaying records: ";
cin >> sno;
} // end while
inStudentFile.close();
return 0;
}
‫اﻟﻤﻼﺣﻖ‬
‫إعداد بيئة التطوير‬
‫‪Preparing Integrated Development‬‬
‫‪Environment‬‬
‫ﻣﻘدﻣﺔ‪:‬‬
‫عزيزي الطالب‪ ،‬إن أھم ما تحتاجه قبل الدخول في عالم البرمجة ھو‪ :‬برنامج تحرير النصوص‪ :‬لتكتب فيه‬
‫برنامج بلغة الـ ‪ C‬أو الـ ‪ ،C++‬المصنف من أن يح ّول المصدر للغة مزدوجة‪ .‬المكتشف و الذي يحدد لك‬
‫أخطائك التي تقع فيھا أثناء كتابتك للبرنامج‪ .‬يمكننا ‪ -‬عزيزي الطالب – أن نحصل على برنامج "‪ 3‬في واحد"‬
‫يقوم باألعمال الثالثة في آن واحد‪ ،‬و ھذا النوع من البرامج نسميھا الـ ‪ IDE‬أو ما يعرف ببيئات التطوير‪.‬‬

‫عزيزي الطالب‪ ،‬توجد الكثير من بيئات التطوير)‪ (IDEs‬المعتمدة ومنھا برنامج ‪ Code::Blocks‬و برنامج‬
‫‪ Visual C++ Express‬ويعتبران من البرامج المجانية‪ ،‬كما يوجد برامج أخرى مثل ‪Borland C++‬‬
‫وبرنامج ‪ Visual C++‬وأخرى عديدة غير مجانية‪.‬‬

‫في ھذه الوحدة – عزيزي الطالب – سنتطرق إلى شرح كيفية إعداد واستخدام بيئات التطوير التالية‪:‬‬
‫‪) Code::Blocks -‬مجاني ومفتوح المصدر(‬
‫‪ Visual C++ -‬من شركة ميكروسوفت وھو غير مجاني‪ ،‬ولكن الشركة أصدرت نسخة مجانية منه اسمھا‬
‫‪.Visual C++ Express‬‬

‫اﻟﻘﺳم اﻷوﻝ‪ :‬ﺗﺣﻣﻳﻝ وﺗﻧﺻﻳب وﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ ‪Code::Blocks‬‬

‫في ھذا القسم –عزيزي الطالب‪ -‬إن شاء ﷲ سنتطرق لشرح مصور لبرنامج ‪. Code::Blocks‬‬
‫البعض يعتبره البرنامج االكثر سھولة في االستخدام والسالسة‪ ،‬كما أنه يعمل جيدا على وندوز‪ 7‬على عكس‬
‫بعض من البرامج األخرى‪.‬‬
‫برنامج الـ ‪ :Code::Blocks‬ھو ‪ IDE‬مالئم جدا‪ ،‬مجاني و يعمل على الـ‪ ،Windows‬و الـ‪،Mac OS‬‬
‫والـ‪ .Linux‬لغته المتوفرة حاليا ھي االنجليزية‪.‬‬

‫يحتوي ھذا القسم على المواضيع التالية‪:‬‬


‫‪ -‬تحميل ملف التنصيب‪.‬‬
‫‪ -‬شرح عملية تنصيب البرنامج‬
‫‪ -‬شرح واجھة البرنامج‬
‫‪ -‬تشغيل البرنامج من خالل إنشاء مشروع جديد و تطبيق مثال بسيط‬
‫‪ .1‬تحميل ملف التنصيب‪:‬‬
‫يمكنك تحميل ملف تنصيب البرنامج إلى جھازك من خالل النقر على الرابط التالي‪:‬‬
‫‪http://www.codeblocks.org/downloads/binaries‬‬

‫‪ .2‬شرح عملية التنصيب‪:‬‬


‫بعد تحميل ملف التنصيب‪ ،‬انقر عليه لتشغيله‪.‬‬

‫صورة ‪ :1‬الملف الذي قمنا بتحميله‬


‫ھنا أنھى التنصيب ويسألك بأن يقوم بتشغيل البرنامج؟ انقر ‪.NO‬‬

‫تم تنصيب البرنامج بنجاح‪ ،‬نقوم بفتح البرنامج‪.‬‬


‫ستجده في قائمة ابدأ‪.‬‬
‫‪ .3‬شرح واجھة التطبيق‬
‫شرح دالالت االرقام‪:‬‬

‫‪ -1‬شريط األدوات‬

‫‪ -2‬قائمة ملفات المشروع ‪ :‬توجد بيسار النافذة‪ ،‬تحتوى على كل ملفات السورس المتعلقة بالبرنامج الذي‬
‫تعمل عليه‪ .‬و بما أنھا فارغة حسب ما يظھر في الصورة ھذا دليل على عدم وجود مصادر سورس‬
‫في الالئحة حتى ھذه اللحظة‪.‬‬

‫‪ -3‬المنطقة الرئيسية ‪ :‬ھنا المساحة التي تكتب فيھا الكودسورس للغتك الـ ‪.C++‬‬

‫‪ -4‬منطقة البيان‪ :‬و يسميھا المبرمجون منطقة الموت‪ ،‬و ھي المنطقة التي تعرض لك األخطاء التي‬
‫وقعت فيھا أثناء كتابتك للكود سورس‪ ،‬طبعا متسلسلة بانتظام‪.‬‬
‫ما يھمنا اآلن ھو منطقة معينة خاصة من شريط األدوات‬

‫‪1-Compile :‬‬

‫كل الكود سورس الخاصة ببرنامجكم ستبعث لمصنف يقوم بالترجمة ثم يستخرج لنا الـ ‪ Code::Blocks‬ملفا‬
‫قابل للتنفيذ أو باألحرى ملف تنفيذي‪ .‬لكن إن اقترفت خطأ في الكتابة لن يترجم لك المصنف شيئا و ستظھر‬
‫األخطاء في منطقة البيان‪.‬‬

‫‪2- Execute :‬‬

‫تقوم بتشغيل آخر ملف تنفيذي قمت بكتابة الكود السورس الخاص به‪ .‬و ھذا عندما تريد تجريب البرنامج قبل‬
‫االنتھاء منه‪ .‬وستعرف بنفسك أنه قبل التشغيل ‪ Execute‬يجب الترجمة ‪ Compile‬ولكى نجرب ما توصلنا‬
‫إليه نضغط على األيقونة ‪.3‬‬

‫‪3- Compile & Execute:‬‬


‫لن تحتاج عبقرية زائدة لتعرف ماذا يمثل جمع وظيفتي األيقونتين السابقتين‪ ،‬أضف لمعلوماتك ‪-‬عزيزي‬
‫الطالب‪ -‬أنھا األيقونة التي سنكثر من استخدامھا أكثر من باقيھا‪ ،‬و أكرر ثانية بأنه إذا اقترفت خطأ في وضع‬
‫الكود سورس لن يتم ترجمة األكواد و ال تشغيل البرنامج! بل سيكون عليك تصحيح قائمة من األكواد التي‬
‫سبق و أخطأت فيھا‪.‬‬

‫‪4- Recompile everything:‬‬

‫عندما نقوم بالـ"ترجمة" فإن ‪ Code::Blocks‬لن يقوم بتشغيل سوى الملفات التي ّعدلت عليھا أو أضفتھا‪.‬‬
‫أحيانا فقط‪ ،‬تضطر بأن تأمر الـ ‪ Code::Blocks‬بترجمة و تشغيل كل شيء ‪.Recompile everything‬‬

‫اآلن سنتطرق للمرحلة األھم في البرنامج وھي تشغيل البرنامج‪.‬‬

‫‪ .4‬ﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ ‪ :Code blocks‬ﺑداﻳﺔ ﻣﺷروع ﺟدﻳد‬

‫على المستخدم انشاء مشروع جديد خاص به‬


‫الشرح كالتالي‪:‬‬

‫كي تبدأ مشروعا جديدا‪ ،‬توجه نحو ‪ ، : File / New / Project‬ستظھر لك نافذة اختر منھا ‪"Console‬‬
‫"‪application‬‬
‫كما تالحظ‪-‬عزيزي الطالب‪ ،‬برنامج الـ ‪ Code::Blocks‬يسمح بالعمل على أنماط كثيرة من البرامج‬
‫المختلفة‪ ،‬منھا التي تعمل بمكتبات مشھورة كالـ ‪ SDL‬للـ ‪ 2D‬و ألـ ‪ OpenGL‬للـ ‪ 3D‬و الـ ‪Qt‬‬
‫و ‪ wxWidgets‬للـ نوافذ ‪ ..‬إلخ‪ ،‬ھذه المكتبات غير مثبتة على جھازكم بعد‪ ،‬و بھذا ال يمكنكم جعلھا تعمل‪.‬‬

‫سنبدأ أ ّوال بالـ "‪:"Console‬‬

‫أنقر على "‪ "Go‬للشروع في المشروع الجديد‪.‬‬

‫بعدھا سيأتيك اختيار بين لغتي الـ ‪ C‬أو الـ ‪ ،C++‬اختر الـ ‪.C++‬‬
‫سيطلب منك اآلن أن تدخل اسم المشروع‪ ،‬و كذا المسار الذي تختاره كي يحفظ فيه‪.‬‬
‫آخر خطوة تطلب منك ھي ‪ ،‬كيف ينبغى أن يترجم البرنامج‪ ،‬يمكنك ترك االختيارات على حالھا‪ ،‬لن يكون‬
‫لھذا أي تأثير على ما سنقوم به اآلن‪ ،‬قم بتحديد زر‪"Release" .‬‬

‫إظغط على ‪ ، Finish‬إنتھى ! ‪ .‬ماالذي قمنا به اآلن يا ترى ؟‬


‫لقد قام البرنامج ‪ Code::Blocks‬بفتح مشروع جديد لنا مع احتواءه بعض الكود سورس التي سنحتاجھا‪.‬‬

‫في الخانة الخاصة بالمشاريع على اليسار‪ ،‬إضغط على '‪ '+‬لتوسيعھا قليال‪ ،‬و تظھر قائمة الملفات في‬
‫المشروع‪.‬‬
‫اآلن تم فتح مشروع خاص بك وما عليك اال بكتابة الكود والباقي على البرنامج‪،‬‬
‫سيقوم بفتح ملف تنفيذي يفتح بواسطة ال‪: MsDos‬‬
‫تشغيل مثال بسيط‪:‬‬

‫النتيجة‪:‬‬
‫اﻟﻘﺳم اﻟﺛﺎﻧﻲ‪ :‬ﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ ‪Microsoft Visual C++‬‬

‫ﻳﻣﻛﻧك ﻋزﻳزي اﻟطﺎﻟب ﺗﻧﻔﻳذ ﺑراﻣﺞ ﻟﻐﺔ ﺳﻲ ﺑﻠص ﺑﻠص ﺑﺎﺳﺗﺧدام اﻟﻌدﻳد ﻣن اﻟﻣﺗرﺟﻣﺎت ﻣﺛﻝ‪، Borland :‬‬
‫‪ Microsoft Visual Studio 6.0 ،Turbo c++‬ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو ﻧﻣط ‪ 6‬او اﺣدث ﻣن ذﻟك‪.‬‬

‫ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو‪Microsoft Visual Studio‬‬


‫ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو )ﺑﺎﻹﻧﺟﻠﻳزﻳﺔ ‪ : (Microsoft Visual Studio‬ﻫﻲ ﺑﻳﺋﺔ اﻟﺗطوﻳر اﻟﻣﺗﻛﺎﻣﻠﺔ‬
‫اﻟرﺋﻳﺳﻳﺔ ﻣن ﻣﺎﻳﻛروﺳوﻓت‪ .‬ﺗﺗﻳﺢ ﺑرﻣﺟﺔ واﺟﻬﺔ اﻟﻣﺳﺗﺧدم اﻟرﺳوﻣﻳﺔ واﻟﺑراﻣﺞ اﻟﻧﺻﻳﺔ إﻟﻰ ﺟﺎﻧب وﻳﻧدوز ﻓورم‬
‫وﻣواﻗﻊ وﻳب وﺗطﺑﻳﻘﺎت وﻳب وﺧدﻣﺎت اﻟوﻳب ﻣدﻋوﻣﺔ ب ﻣﺎﻳﻛروﺳوﻓت وﻳﻧدوز ووﻳﻧدوز ﻣوﺑﺎﻳﻝ ٕواطﺎر ﻋﻣﻝ‬
‫دوت ﻧت وﻣﺎﻳﻛروﺳوﻓت ﺳﻳﻠﻔرﻻﻳت‪.‬‬
‫ﻳﺣﺗوى ﻓﻳﺟواﻝ اﺳﺗودﻳو ﻋﻠﻰ ﻣﺣرر أﻛواد ﻳدﻋم ﺗﻘﻧﻳﺔ اﻧﺗﻠﻳﺳﻧس واﻋﺎدة ﻛﺗﺎﺑﺔ اﻟﻛود‪ ,‬وﻳﺣﺗوى أﻳﺿﺎ ﻋﻠﻰ ﻣﺗرﺟم‬
‫ﻳﻛﺷف أﺧطﺎء وﻗت اﻟﺗﺷﻐﻳﻝ وﻣﻔﺳر ﻳﻛﺷف اﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ ﻓﻲ اﻷﻛواد وﻳﺣﺗوى أﻳﺿﺎ ﻋﻠﻰ ﻣﺻﻣم ﻧﻣﺎذج‬
‫ﻟﺑﻧﺎء واﺟﻬﺔ ﻣﺳﺗﺧدم رﺳوﻣﻳﺔ وﻏﻳرﻫﺎ‪.‬‬
‫ﻳدﻋم ﻓﻳﺟواﻝ اﺳﺗودﻳو اﻟﻌدﻳد ﻣن ﻟﻐﺎت اﻟﺑرﻣﺟﺔ ﻣﺛﻝ ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟواﻝ ﺳﻲ‪ ++‬وﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟواﻝ ﺳﻲ‪#‬‬
‫وﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟواﻝ ﺑﻳﺳك وﺟﺎﻓﺎ ﺳﻛرﻳﺑت واﻟﻌدﻳد أﻳﺿﺎ ﻣن ﻟﻐﺎت اﻟﺗرﻣﻳز ﻣﺛﻝ ‪ html‬و‪ xml‬و ‪xhtml‬‬
‫و‪. xsl‬‬

‫ﻣﺣرر اﻷﻛواد‬
‫ﻣﺛﻝ ﺑﺎﻗﻰ ﺑﻳﺋﺎت اﻟﺗطوﻳر ﻳﺣﺗوى اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو ﻋﻠﻰ ﻣﺣرر أﻛواد ﻳدﻋم ﺗﻌﻠﻳم اﻟﺻﻳﻐﺔ واﻻﻛﻣﺎﻝ اﻟﺗﻠﻘﺎﺋﻰ‬
‫وﻳﺳﺗﺧدم أﻳﺿﺎ ﺗﻘﻧﻳﺔ اﻧﺗﻠﻳﺳﻧس ﻟﺗﺳﺎﻋد اﻟﻣﺑرﻣﺞ ﻓﻲ ﻛﺗﺎﺑﺔ اﻟﻣﺗﻐﻳرات واﻟدواﻝ واﻟوﺳﺎﺋﻝ واﻟدورات ﺑﺳرﻋﺔ‪ ،‬وﻳدﻋﻣﻬﺎ‬
‫اﻟﻣﺣرر ﻓﻲ ﻛﺗﺎﺑﺔ ﺟﻣﻳﻊ ﻟﻐﺎت اﻟﺑرﻣﺟﺔ واﻟﺗرﻣﻳز اﻟﺗﻲ ﻳﺣﺗوى ﻋﻠﻳﻬﺎ اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو‪.‬‬
‫ﻳدﻋم ﻣﺣرر أﻛواد ﻓﻳﺟواﻝ اﺳﺗودﻳو أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ وﺿﻊ ﻋﻼﻣﺎت ﻣرﺟﻌﻳﺔ ﻓﻲ اﻟﻛود ﻟﻠﻣﺳﺎﻋدة ﻓﻲ اﻟﺗﺻﻔﺢ اﻟﺳرﻳﻊ‪،‬‬
‫ﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ ‪ collapsing and expanding‬ﻣﺟﻣوﻋﺎت اﻷﻛواد واﻟﺑﺣث واﻻﺳﺗﺑداﻝ ﻓﻲ اﻟﻛود‪ ,‬وﻳدﻋم‬
‫أﻳﺿﺎ ‪ code snippets‬وﻫﻰ ﻗواﻟب ﺟﺎﻫزة ﻣن اﻟﻛود ﻳﻛﻣن ادراﺟﻬﺎ وادﺧﺎﻝ ﺗﻐﻳﻳرات ﻋﻠﻳﻬﺎ داﺧﻝ اﻟﻣﺷروﻋﺎت‬
‫اﻟﺟﺎرى اﻟﻌﻣﻝ ﻋﻠﻳﻬﺎ وﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ اﻋﺎدة ﻛﺗﺎﺑﺔ اﻟﻛود‪.‬‬
‫ﻳﻘوم ﻣﺣرر اﻷﻛواد أﻳﺿﺎ ﺑوﺿﻊ ﺧطوط ﺣﻣراء أﺳﻔﻝ اﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﺧطوط ﺧﺿراء أﺳﻔﻝ اﻻﻧذرات‪.‬‬
‫ﻣﺗﻌﻘب اﻷﺧطﺎء‬
‫ﻳﺣﺗوى ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻋﻠﻰ ﻣﺗﻌﻘب أﺧطﺎء ﺗدﻋﻣﻪ ﺟﻣﻳﻊ اﻟﻠﻐﺎت اﻟﻣدﻋوﻣﺔ ﻳﻛﺷف أﺧطﺎء وﻗت اﻟﺗﺷﻐﻳﻝ‬
‫واﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﻳﺳﻣﺢ ﺑوﺿﻊ ﻧﻘﺎط ﺗوﻗف ﻋﻧد ﺳطور اﻟﻛود واﻟﺗﻲ ﻳﺗوﻗف اﻟﺑرﻧﺎﻣﺞ ﻋن اﻟﻌﻣﻝ ﻋﻧدﻣﺎ‬
‫ﻳﺻﻝ ﻟﻬذا اﻟﺳطر‪.‬‬
‫ﻳوﺟد أﻳﺿﺎ ﻓﻲ ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻧﺎﻓذة ‪ immediate window‬واﻟﺗﻲ ﺗﺳﻣﺢ ﺑﺗﺟرﻳب اﻟدواﻝ أﺛﻧﺎء ﻛﺗﺎﺑﺗﻬﺎ‪.‬‬

‫ﻣﺎﻫﻲ اﻟﻣراﺣﻝ اﻟﺗﻲ ﻳﻣر ﺑﻬﺎ اﻟﺑرﻧﺎﻣﺞ ﺑﻠﻐﺔ ‪ ++C‬ﻗﺑﻝ ﺗﻧﻔﻳذﻩ؟‬


‫ﻳﻣر اﻟﺑرﻧﺎﻣﺞ ﺑﻠﻐﺔ ﺳﻲ ‪ ++‬ﺑﺳت ﻣراﺣﻝ ﻗﺑﻝ ﺗﻧﻔﻳذﻩ وﻫﻲ‪:‬‬
‫‪ .1‬ﻛﺗﺎﺑﺔ اﻟﺑرﻧﺎﻣﺞ‪Edit .‬‬
‫‪ .2‬ﻣرﺣﻠﺔ ﻣﺎ ﻗﺑﻝ اﻟﺗرﺟﻣﺔ او اﻟﻣﻌﺎﻟﺟﺔ ‪Preprocess‬‬
‫‪ .3‬اﻟﺗرﺟﻣﺔ ‪Compile‬‬
‫‪ .4‬اﻟرﺑط ‪Link‬‬
‫‪ .5‬اﻟﺗﺣﻣﻳﻝ ‪Load‬‬
‫‪ .6‬اﻟﺗﻧﻔﻳذ ‪Execute‬‬

‫في ھذا القسم – عزيزي الطالب – سوف نشرح كيفية كتابة أول برنامج لك بلغة الـ ‪ C++‬وباستخدام ‪Microsoft ‬‬
‫‪ Visual C++‬وھي بيئة تطويرية أخرى يمكن أن تتعامل معھا من أجل التمكن من االنتقال إلى برمجة تطبيقات ويندوز‬
‫باستخدامھا‪.‬‬

‫‪ -‬من أجل البدء بأي مشروع قم بالخطوات التالية‪:‬‬

‫‪ -1‬اختر ‪ New‬من القائمة ‪  File‬‬


‫‪ ‬‬

‫‪ -2‬تحصل على النافذة كما في الشكل التالي‪ ،‬من الصفحة ‪ Workspaces‬سيظھر ‪ Blank Workspace‬وھو‬
‫مكان العمل الذي سوف توضع فيه مشاريعك‪  .‬‬

‫‪ -3‬عند خانة ‪ Workspace name‬أدخل اسم ) مثالً اسمك(‪ ،‬يمكنك تغيير مكان التخزين عن طريق الخانة‬
‫‪  .Location‬‬
‫‪ -4‬اآلن ولنقوم بتشكيل أول مشروع يحب علينا اختيار األمر ‪ New‬من القائمة ‪ File‬لتحصل على نفس الشاشة‬
‫التي حصلت عليھا مسبقا ً ولكن الصفحة ‪ Projects‬ھي التي ستظھر أمامك بدالً عن ‪  .Workspaces‬‬
‫‪ -5‬اختر ‪ ،Win32 Console Application‬على يمين النافذة وعند خانة ‪ Project Name‬اكتب اسم‬
‫مشروعك وليكن ‪ ،Prog1‬بشكل افتراضي سوف يقوم الفيجول سي‪ ++‬بإنشاء دليل بنفس اسم المشروع‬
‫ويضع فيه جميع الملفات التي سوف تضيفھا الحقا ً لمشروعك‪  .‬‬

‫‪ -6‬يجب اختيار ‪ Add to current workspace‬ليتم إضافة مشروعك ‪ Prog1‬إلى الـ ‪ Workspace‬الذي‬


‫قمت بإنشائه في الخطوتين ‪  .3-2‬‬
‫‪ -7‬اضغط على زر ‪ OK‬لتحصل على النافذة التالية ‪ ‬‬
‫‪ -8‬تأكد من اختيار ‪ An empty Project‬ومن ثم اضغط على زر ‪  .Finish‬‬
‫‪ -9‬اآلن ولنقوم بكتابة أول برنامج يحب علينا إنشاء ملف جديد باختيار األمر ‪ New‬من القائمة ‪ File‬لتحصل‬
‫على نفس الشاشة التي حصلت عليھا مسبقا ً ولكن الصفحة ‪ Files‬ھي التي ستظھر أمامك بدالً عن‬
‫‪  .Projects‬‬
‫‪ -10‬اختر ‪ C++ Source file‬واكتب اسم ملفك عند خانة ‪ File Name‬وليكن ‪ test‬واضغط زر ‪  .Ok‬‬

‫‪ -11‬الحظ أن في مجلد ‪ Source files‬تم إضافة اسم الملف ‪  .test.cpp‬‬


‫‪ -12‬ابدأ بكتابة البرنامج التالي‪  :‬‬
‫‪#include <iostream.h> ‬‬
‫)(‪void main‬‬
‫{‬
‫‪int x; ‬‬
‫‪cout<<"Please enter a number: "; ‬‬
‫‪cin>>x; ‬‬
‫‪cout<<"The number is: "; ‬‬
‫‪cout<<x<<endl; ‬‬
‫‪} ‬‬
‫يجب االنتباه إلى حالة األحرف الكبيرة والصغيرة ألن لغة الـ ‪ C++‬تفرق بينھما‪ .‬‬

‫‪ -13‬لتنفيذ البرنامج السابق وبناء ملف تنفيذي قابل للتنفيذ بأي وقت قم بالخطوات التالية‪:‬‬
‫من القائمة ‪ Build‬اختر األمر ‪ compile test.cpp‬سوف يتم ترجمة الملف وتحويله من اللغة‬ ‫أ‪-‬‬
‫المقروءة إلى لغة اآللة وذلك بعد فحصه من األخطاء وتصحيحھا‪  .‬‬
‫ب‪ -‬من القائمة ‪ Build‬اختر األمر ‪ Build‬ليتم تشكيل الملف التنفيذي ‪  .test.exe‬‬
‫ت‪ -‬من القائمة ‪ Build‬اختر األمر ‪ Execute test.exe‬لتنفيذه‪  .‬‬
‫ث‪ -‬إذا كان كل شيء صحيح سوف تظھر نافذة مثل نافذة نظام التشغيل دوس في أعالھا اسم الملف‬
‫‪  test.exe‬‬
‫ج‪ -‬ظھرت لك عبارة ‪ Please enter a number‬واآلن ھو في حالة انتظار إدخال العدد ‪  .‬‬
‫ح‪ -‬أدخل العدد واضغط ‪  .Enter‬‬
‫خ‪ -‬سوف تجد العبارة ‪ The number is‬والعدد الذي قمت بإدخاله‪  .‬‬

‫‪ -‬عليك اآلن إكمال كتابة البرنامج التالي ليقوم بإضافة العدد ‪ 2‬إلى العدد المدخل وطباعة الناتج‪  .‬‬
‫استخدم الخطوات ‪ 4‬حتى ‪ 10‬إلضافة مشروع جديد إلى نفس الـ ‪ Workspace‬وليكن اسمه‬
‫‪  .prog2‬‬
‫قم بكتابة البرنامج بعد أن تكمل الفراغات‪:‬‬
‫‪#include <iostream.h> ‬‬
‫‪void main() ‬‬
‫{‬
‫‪const int s=2 ; ‬‬
‫‪int  n , sum ; ‬‬
‫‪cout<<" Enter a number: " ; ‬‬
‫‪cin>>n ; ‬‬
‫‪sum = n + s ; ‬‬
‫;‪cout<<"plus 2= "<<sum<<endl‬‬
‫‪} ‬‬
‫‪ ‬‬

‫انتقل إلى مرحلة تنفيذ البرنامج ) انتبه أنه سيقوم بتنفيذ المشروع الثاني وذلك بضغط زر اليمين‬
‫على ‪ prog2‬وتفعيل ھذا المشروع باختيار ‪ .(Set as Active project‬‬
‫ﺗدرﻳب‪ :‬ﺑﺎﻻﺳﺗﻔﺎدة ﻣن اﻟﻣﻌﻠوﻣﺎت اﻟﺗﻲ ﻗدﻣت ﻟك ﻓﻲ اﻟﻘﺳﻣﻳن اﻟﺳﺎﺑﻘﻳن‪ ،‬ﺣﺎوﻝ – ﻋزﻳزي اﻟدارس– أن ﺗﻧﺷﻲء ﻣﺷروﻋﺎ ﺟدﻳد‬

‫‪ prog3‬ﺿﻣن أﺣد ﺑﻳﺋﺎت اﻟﺗطوﻳر اﻟﺳﺎﺑﻘﺔ ﻟﻳﻘوم ﺑﺣﺳﺎب ﻣﺳﺎﺣﺔ داﺋرة ﺣﺳب اﻟﻧﺻف ﻗطر اﻟﻣدﺧﻝ وطﺑﺎﻋﺔ اﻟﻧﺎﺗﺞ‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫تمرير العوامل بالقيمة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫يوضح المقصود بمصطلح تمرير العوامل بالقيمة‪.‬‬ ‫‪.1‬‬


‫تمرير العوامل‬
‫بالقيمة‬
‫تأمل عزيزي الطالب تعريف الدالة التالية‪:‬‬
‫تسمى المتغيرات‬
‫)‪void swap1(int X, int Y‬‬ ‫‪ A,B‬بالعوامل‬
‫الرسمية‬
‫;‪{ int T=X‬‬
‫;‪X=Y‬‬
‫;‪Y=T‬‬ ‫}‬
‫تمرير العوامل‬
‫بالقيمة‬
‫لندرس نتيجة استدعاء الدالة أعل ه من خلل المثال التالي‪:‬‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap1(A,B‬تسمى المتغيرات‬
‫‪ A,B‬بالعوامل‬
‫الفعلية‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬
‫تمرير العوامل‬
‫بالقيمة‬

‫لغ ة ‪ C‬تمرر قي م العوام ل إل ى الدوال وبالتال ي فإ ن أي‬


‫تغيير تجريه الدالة على هذ ه القيم ل يؤدي إلى تغيير قيم‬
‫العوامل الحقيقية‪.‬‬
‫تمرير العوامل‬
‫بالقيمة‬

‫تستدعي هذ ه الدالة ‪ swap1‬لتبديل قيم العوامل الحقيقية‬


‫‪ A‬و ‪ B‬وتقوم بطباع ة قي م ‪ A‬و ‪ B‬قب ل وبع د استدعاء‬
‫‪ .swap1‬إن نتيجة تنفيذ هذا البرنامج هي طباعة ‪:‬‬
‫‪A=10 B=20‬‬
‫‪A=10 B=20‬‬
‫تمرير العوامل‬
‫بالقيمة‬

‫أي أن قيم ‪ A‬و ‪ B‬وهي العوامل الحقيقية لم تبدل بعد‬


‫استدعاء الدالة ‪ ،swap1‬وذلك لن الدالة ‪ swap1‬تستقبل‬
‫قيم العوامل ‪ A‬و ‪ B‬وليس عناوينها‪.‬‬
‫تمرير العوامل‬
‫بالقيمة‬

‫أ ن القي م ‪ 10‬و ‪ 20‬ف ي مثالن ا أعل ه تخزن ف ي مواقع‬


‫جديدة في الذاكرة تختلف عن مواقع المتغيرات ‪ A‬و ‪B‬‬
‫ولذا فإ ن أ ي تغيي ر عل ى العوام ل الرسمية ‪ X‬و ‪ Y‬ل‬
‫يقابله تغيير على قيم العوامل الحقيقية ‪ A‬و ‪.B‬‬

‫تسمى دهذه الطريقة لتمرير العوامل بالتمرير‬


‫بالقيمة‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫تمرير العوامل بالاشارة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫توضح المقصود بمصطلح تمرير العوامل بالشارة‪.‬‬ ‫‪.1‬‬


‫تمرير العوامل‬
‫بالاشارة‬
‫تذك ر عزيزي الطال ب ان لغة ‪ C‬تمرر قيم العوام ل إلى‬
‫الدوال وبالتال ي فإ ن أ ي تغيي ر تجري ه الدال ة على هذه‬
‫القيم ل يؤدي إلى تغيير قيم العوامل الحقيقية‪.‬‬

‫دهكذا دهي عملية تمرير المعامل ت بالقيمة‬


‫تمرير العوامل‬
‫بالاشارة‬
‫ول حل المشك لة أعله فإن نا بدل من أن نر سل قيمة‬
‫‪A‬‬ ‫الحقيقةةةةةةةةةةةةةيةةة‬ ‫ةةةةةةةةةةةةةلةة‬
‫م‬ ‫العوا‬
‫و ‪ B‬في مثال الدالة ‪ ،swap1‬ي جب أن نر سل للدالة‬
‫عنوانهما حتى تستطيع هذه الدالة تغيير القيم المخزنة في‬
‫هذه المواقع‪  .‬‬

‫هناك طريقتان لعمل ذلك‪...............‬‬


‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الولى‬
‫)‪void swap2(int* X,int* Y‬‬ ‫يتعامل‬ ‫مع‬ ‫‪swap2‬‬
‫المواقع التي نود تغييرها‬
‫* من خلل اللقاب‪X‬‬
‫;‪{ int T=*X‬‬ ‫* و‪.Y‬‬

‫;‪*X=*Y‬‬
‫;‪*Y=T‬‬
‫}‬
‫تمرير العوامل‬
‫بالاشارة‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap2(&A,&B‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬
‫أر سلنا عناو ين المتغيرين‬
‫‪ A‬و ‪) B‬أي &‪ A‬و&‪(B‬‬
‫عند ما ا ستدعينا الدالة‬
‫‪.swap2‬‬
‫تمرير العوامل بالشارة‬
‫وبالطبع تقوم الن الدالة ‪ swap2‬بتغيير قيم ‪ A‬و ‪ B‬كما يجب‬
‫حيث تكون النتائج كما يلي‪:‬‬

‫‪A=10 B=20‬‬
‫‪A=20 B=10‬‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫)‪void swap3(int &X, int &Y‬‬ ‫ظظظظظظ وجود العملية &‬‫لح‬
‫ظظلظظ ظظمنظظظ العوامل‬
‫ظظلظظ ك‬
‫قب‬
‫;‪{ int T=X‬‬ ‫الرظظمسظظظظية وذلك للشارة‬
‫;‪X=Y‬‬ ‫إلى أن العوامل الحقيقية‬
‫ستمرر بالشارة ) ‪by‬‬
‫;‪Y=X‬‬ ‫‪( ( reference‬‬

‫}‬
‫تمرير العوامل‬
‫بالاشارة‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap3(A,B‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬
‫من الم هم أن تلحظ‬
‫‪ ‬‬
‫عزيزي الدارس أننا‬
‫ا ستخدمنا أ سماء العوامل‬
‫‪ X‬و ‪ Y‬داخل الدالة بطريقة‬
‫مباشرة بدون أن نسبقها بـ‬
‫*‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫لحظ وجود العملية & قبل كل من العوامل الرسمية وذلك‬
‫للشارة إلى أن العوامل الحقيقية ستمرر بالشارة ) ‪by‬‬
‫‪ ( reference‬وليس بالقيمة )‪ ( by value‬مما يعني أن أي‬
‫تغيير على قيم العوامل الرسمية سيقابله تغيير على قيم‬
‫العوامل الحقيقية‪.‬‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫ومن الممكن أيضا أن ترجع الدالة قيمة بالاشارة‬
‫كما في مثالنا التالي‪:‬‬

‫)‪int& max(int A, int B‬‬


‫)‪{if (A>B‬‬
‫;‪return A‬‬
‫‪else‬‬
‫;‪return B‬‬
‫}‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن نوع القيمة المرجعة هو ‪&int‬‬
‫أي إشارة ‪ reference‬لمتغير صحيح‪ .‬تقوم الدالة ‪max‬‬
‫بتحديد العامل صاحب القيمة الكبر وإعادة إشارة إليه‪  .‬‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫ولذا فإننا نستطيع أن نستدعي الدالة ‪ max‬كما يلي ‪:‬‬

‫;‪int A=10‬‬
‫;‪int B=100‬‬
‫;‪max(A,B)=5‬‬
‫إن نتي جة تنف يذ هذه الجم لة هي تخز ين القي مة ‪ 5‬في‬
‫المتغير صاحب أكبر قيمة وهو المتغير ‪.B‬‬
‫‪ ‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫اعادة تحميل العمليات‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالعمليات ‪Operators‬‬


‫• ان تتعرف على كيفية اعادة تحميل العمليات‪.‬‬
‫اعادة تحميل العمليات ‪Operators‬‬
‫‪Overloading‬‬
‫من المميزات الجميلة للغة ‪ ++C‬أنها تمكننا من إعادة‬
‫تعري ف العمليات ‪ operator‬المختلف ة بم ا يتناس ب مع‬
‫تطبيقاتنا‪ .‬فمثل نستطيع تعريف العملية ‪ +‬كعملية منتمية‬
‫للصنف ‪ section‬لتعني إضافة طالب معين إلى الشعبة‬
‫والعملي ة – لتعن ي شط ب طال ب معي ن من الشعبة‪ .‬ان‬
‫هذه التعريفات الجديدة لـ ‪ +‬و – م ا هي إل تعريفات‬
‫إضافي ة لهذه العمليات‪ ،‬أ ي أنن ا نحمل هذه العمليات‬
‫تعريفات جديدة ‪ operator overloading‬وهذا ممكن‬
‫ل ن م ا يحدد تعري ف العملي ة المطلوب تنفيذه ا هو عدد‬
‫ونوع العوامل وليس فقط رمز العملية‪.‬‬
‫اعادة تحميل العمليات ‪Operators‬‬
‫‪Overloading‬‬
‫ف ي الواق ع إ ن الكثي ر م ن العمليات له ا أص ل أكث ر من‬
‫تعري ف ف ي لغ ة ‪ . ++C‬فمثل العملي ة ‪ +‬له ا أكث ر من‬
‫تعريف واحد فهي تعني الشارة الموجبة عندما تأتي مع‬
‫عام ل واح د‪ ،‬وتعن ي عملي ة جم ع ص حيحة وعملي ة جمع‬
‫حقيقية وغير ذلك‪ .‬ويقوم مترجم ‪ ++C‬بتحديد التعريف‬
‫المطلوب من عدد و نوع العوامل‪.‬‬
‫متى يقال ان العامل تم تحميله بشكل‬
‫زائد؟‬
‫عندما يعطى عامل موجود أصل ل كـ‬
‫‪ +‬أو – القدرة على العمل على‬
‫أنواع بيانات جديدة يقال أ نه تم‬
‫تحميله بشكل زائد ‪.overloaded‬‬
‫‪‬تذكر‬
‫كيف تتم عملية اعادة تحميل العمليات؟‬
‫إن تعريف العمليات ل يختلف كثير عن تعريف الدوال وفي‬
‫الواقع إن العمليات هي نوع خاص من الدوال في لغة ‪++C‬‬
‫يختلف تعريف العملية عن تعريف الدالة فقط في أن اسم‬
‫العملية يتكون من الكلمة ‪ operator‬متبوعا برمز العملية‬
‫على سبيل المثال ‪.+operator‬‬
‫كيف تتم عملية اعادة تحميل العمليات؟‬
‫تأ خذ دا لة العا مل ‪ operator function‬عندما تكون عضوا ل‬
‫في الفئة الشكل العام التي‪:‬‬
‫)‪return_type operator#(arg_list‬‬
‫{‬
‫‪// operations‬‬
‫}‬
‫كيف تتم عملية اعادة تحميل العمليات؟‬
‫‪‬حيث ‪-:‬‬
‫•‪ return_type‬هو قيمة إعادة الدالة ‪#operator :‬والتي‬
‫غالبا ل م ا ترج ع كائنا ل تابعا ل للفئ ة الت ي تعم ل عل ى كائناتها‬
‫ولكن يمكن أن يكون‪.return_type‬من أي نوع آخر‬
‫•‪ ++Operator‬كلمة أساسية في ‪.C :-‬‬
‫• ‪ -: #‬تستبدل بالعامل المراد تحميله بشكل زائد ‪ ،‬فمثل ل‬
‫إذا كن ا نقوم بتحمي ل العام ل ‪ +‬بشك ل زائ د نكتب‬
‫‪.operator‬‬
‫•‪Arg_list‬وه ى لئح ة الوس يطات الممرة إل ى الدالة ‪:-‬‬
‫‪ #operator‬والتي تحتوى على عنصر واحد إذا كنا نقوم‬
‫بتحميل عامل ثنائي )‪ (.... ،/ ،- ،+‬وتكون فارغة إذا كنا‬
‫‪++‬نقوم بتحميل عامل‪ (++، -- ، ....).C‬أحادى‬
‫•‪Operations‬العمليات المراد م ن العام ل المحمل ‪:-‬‬
‫كيف تتم عملية اعادة تحميل العمليات؟‬
‫وك ما ن ضع نموذ جا للدا لة المنتم ية دا خل تعر يف الصنف‬
‫يجب أيضا أن نضيف نموذجا للعملية المنتمية داخل تعريف‬
‫ال صنف‪ .‬فمثل لتعر يف العمل ية ‪ +‬كعمل ية منتم ية للصنف‬
‫‪ section‬بحيث تستخدم لضافة طالب جديد للشعبة يجب‬
‫أول أن نضع النموذج التالي‬
‫)‪;void operator+(student s‬‬
‫‪ ‬‬
‫داخل تعريف الصنف ‪. section‬‬
‫كيف تتم عملية اعادة تحميل العمليات؟‬
:‫ كما يلي‬section ‫بحيث يصبح تعريف الصنف‬
 
class section{
student sec[50];
int size;
int bsearch(long stno);
public:
section(){size=0;}
void operator+(student s); ‫عملية اعادة تحميل العمليات‬
void StAdd(student s);
int StDelete(long stno);
void Stlist();
void StRetrieve(long stno);
};
 
‫؟‬+operator ‫تعريف العملية‬
:  StAdd ‫ل يختلف عن نموذج الدالة‬+ operator ‫كما أن تعريف العملية‬

void section::operator+(student s)
{int pos=0;
// search for the proper insertion position
while(s.get_stno() > sec[pos].get_stno() && pos<size)
pos++;
// shift element up one position
for(int i=size-1;i>=pos;i--)
sec[i+1]=sec[i];
sec[pos]=s;
size++;
}
‫استدعاء ‪+operator‬؟‬
‫أما بالنسبة لستدعاء العملية فيمكننا استدعاءها كأي دالة‬
‫منتمية‪ ،‬فمثل لضافة الطالب ‪ S‬للشعبة ‪ cs100‬يمكننا أن‬
‫نستدعي العملية ‪ +‬كما يلي‬
‫)‪;cs100.operator+(S‬‬
‫‪ ‬‬
‫أما الطريقة الفضل لستدعاء العملية فهي أن‬
‫نستخدمها كأي عملية جمع أخرى كما يلي‪:‬‬
‫‪ ‬‬
‫‪;cs100 + S‬‬
‫استدعاء ‪+operator‬؟‬
‫‪‬تذكر عزيزي الطالب‪:‬‬

‫وبالط بع ف إن متر جم ل غة ‪ ++C‬يعرف بأن هذه العملية‬


‫ليست عملية جمع عادية بسبب نوع العوامل ‪ cs100‬و ‪S‬‬
‫ولذا فإ نه يقوم با ستدعاء العمل ية ‪ +‬ال تي قم نا نحن‬
‫بتعريفها‪.‬‬
‫اعادة تعريف‬
‫العمليات‬
‫العمليات التي يمكن اعادة تحميلها ‪:‬‬
‫‪+‬‬ ‫‪-‬‬ ‫*‬ ‫‪/‬‬ ‫‪%‬‬ ‫^‬
‫&‬ ‫|‬ ‫~‬ ‫!‬ ‫‪,‬‬ ‫=‬
‫<‬ ‫>‬ ‫=<‬ ‫=>‬ ‫‪++‬‬ ‫‪--‬‬
‫<<‬ ‫>>‬ ‫==‬ ‫=!‬ ‫&&‬ ‫||‬
‫=‪+‬‬ ‫=‪-‬‬ ‫=‪/‬‬ ‫=‪%‬‬ ‫=^‬ ‫=&‬
‫=|‬ ‫=*‬ ‫=<<‬ ‫=>>‬ ‫][‬ ‫)(‬
‫>‪-‬‬ ‫*>‪-‬‬ ‫‪new‬‬ ‫][ ‪new‬‬ ‫‪delete‬‬ ‫‪delete‬‬
‫][‬
‫اعادة تعريف‬
‫العمليات‬
‫العمليات التي يمكن ل اعادة تحميلها ‪:‬‬

‫‪::‬‬ ‫*‪.‬‬ ‫‪.‬‬ ‫‪?:‬‬


‫تذكر‪:‬‬
‫ل يمكن تغيير الخصائص التالية للعمليات عند إعادة‬
‫تعريفها ودهي ‪:‬‬

‫‪ ‬عدد العوامل‪ :‬فإذا كانت العملية في لغة ‪ ++C‬تأخذ عاملين ل‬


‫يمكن تعريفها بحيث تأخذ عامل واحدا على سبيل المثال‪.‬‬
‫‪ ‬أسبقية )أو أولوية( ‪ priority‬العملية‪ :‬فل يمكن إعادة تعريف‬
‫العملية ‪ +‬وإعطاؤها أولوية أعلى من تلك الخاصة بالعملية *‪.‬‬
‫‪ ‬ترتيب التنفيذ ‪ :associativity‬فإذا كان ترتيب تنفيذ العملية‬
‫من اليسار إلى اليمين ل يمكن تغيير هذا الترتيب وجعله من‬
‫اليمين إلى اليسار‪.‬‬
Unary ‫اعادة تعريف‬
Operators
include <iostream> // overloaded minus (-)
using namespace std; operator
class Distance{ Distance operator- ()
private: {
int feet; // 0 to feet = -feet;
infinite inches = -inches;
int inches; // 0 to return Distance(feet,
12 inches); }};
public: int main(){
// required constructors Distance D1(11, 10),
Distance(){ D2(-5, 11);
feet = 0; -D1; // apply
inches = 0; } negation
Distance(int f, int i){
D1.displayDistance(); //
feet = f;
display D1
inches = i; }
-D2; // apply
// method to display negation
distance
void displayDistance() D2.displayDistance(); //
{ display D2
cout << "F: " << feet return 0;}
‫اعادة تعريف‬
‫العمليات‬
‫الناتج من البرنامج السابق ‪:‬‬
‫‪F: -11 I:-10‬‬
‫‪F: 5 I:-11‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫أشكال اعادة تحميل‬


‫للعمليات المختلفة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان تتعرف على اشكال اعادة تحميل العمليات‪.‬‬


‫اشكال اعادة تحميل العمليات‬
‫م ن المميزات الجميل ة للغ ة ‪ ++C‬أنه ا تمكنن ا من إعادة‬
‫تعري ف العمليات ‪ operator‬المختلف ة بم ا يتناس ب مع‬
‫تطبيقاتنا‪.‬‬

‫وكما يمكننا أن نعرف الدالة كدالة منتمية أو صديقة فإنه‬


‫يمكنن ا أيض ا أ ن نعرف العملي ة كعملي ة منتمي ة أ و عملية‬
‫صديقة‪.‬‬

‫وكما أن تعريف العملية المنتمية ل يختلف كثيرا عن تعريف‬


‫الدالة المنتمية ل يختلف تعريف العملية الصديقة كثيرا عن‬
‫تعريف الدالة الصديقة‪.‬‬
‫اشكال اعادة تحميل العمليات‬

‫وكمثال عل ى تعري ف الدوال الص ديقة س نعرف الن دالة‬


‫ص ديقة للص نف ‪ time‬الذي يمث ل وقت ا معين ا يتكون من‬
‫الس اعة والدقيق ة والثانية‪ .‬يمكنن ا أ ن نعرف هذا الصنف‬
‫باس تخدام ةثلةث ة متغيرات منتمية ‪ hour‬و ‪ min‬و ‪sec‬‬
‫لتمثيل الساعة والدقيقة والثانية على الترتيب‪.‬‬
‫العملية >> معرفة كعملية صديقة‬
‫للصنف‬
‫لنفرض أنن ا نري د تعري ف العملي ة >> بحي ث تعرض لنا‬
‫الوق ت عل ى الشاش ة بطريق ة مناس بة فمثل عن د تنفيذ‬
‫العملية‬
‫;‪cout<<T‬‬
‫تكون النتيجة عرض الوقت كما يلي‬
‫‪The time is 12:23:30‬‬

‫على افتراض أن قيم المتغيرات المنتمية لـ ‪T : hour‬‬


‫و‪ min‬و ‪ sec‬هي ‪ 12‬و ‪ 23‬و ‪ 30‬على الترتيب‪.‬‬
‫‪ ‬انتبه‪ :‬عزيزي الطالب‪ ،‬أن للعملية >> عاملن الول‬
‫هو ‪ cout‬والثاني كائن من الصنف ‪.time‬‬
‫العملية >> معرفة كعملية صديقة‬
‫للصنف‬
‫في الواقع أن ‪ cout‬هو كائن من الصنف ‪ ostream‬كما‬
‫أن ‪ cin‬كائن من الصنف ‪.istream‬‬
‫إن العملية >> معرفة كعملية صديقة للصنف ‪ostream‬‬
‫كم ا أ ن العملي ة << معرف ة كعملي ة ص ديقة للصنف‬
‫‪.istream‬‬
‫وهذه العمليات معرفة بحيث يسمحن للعامل الثاني أن‬
‫يكون عددا صحيحا أو حقيقيا أو سلسلة رمزية … الخ‪.‬‬
‫وهذه التعاريف موجودة في المكتبة ‪.iostream‬‬
‫العملية >> معرفة كعملية صديقة‬
‫للصنف‬
‫في الواقع أن ‪ cout‬هو كائن من الصنف ‪ ostream‬كما‬
‫أن ‪ cin‬كائن من الصنف ‪.istream‬‬

‫إن العملية >> معرفة كعملية صديقة للصنف ‪ostream‬‬


‫كم ا أ ن العملي ة << معرف ة كعملي ة ص ديقة للصنف‬
‫‪.istream‬‬

‫وهذه العمليات معرفة بحيث يسمحن للعامل الثاني أن‬


‫يكون عددا صحيحا أو حقيقيا أو سلسلة رمزية … الخ‪.‬‬
‫وهذه التعاريف موجودة في المكتبة ‪.iostream‬‬
‫العملية >> معرفة كعملية صديقة‬
‫للصنف‬
‫وما نريد فعله هو إعطاء العملية >> تعريفا جديدا يسمح‬
‫للعام ل الثان ي بأ ن يكون م ن الص نف ‪ ،time‬لذا فإننا‬
‫ســنعرفها كعمليــة صــديقة للصــنف ‪ .time‬ولذا فإننا‬
‫سنضيف النموذج‪:‬‬

‫‪friend‬‬ ‫&‪osrteam‬‬ ‫&‪operator<<(ostream‬‬


‫;)‪c,time t‬‬

‫للصنف ‪. time‬‬
‫العملية >> معرفة كعملية صديقة‬
‫للصنف‬
:‫ يصبح تعريفه‬time ‫الصنف‬
 
#include<iostream.h>
class time{
int hour;
int min;
int sec;
public:
time(int h, int m, int s){hour=h;
min=m;
sec=s;}
friend osrteam& operator<<(ostream& c,time t);
};
‫العملية >> معرفة كعملية صديقة‬
‫للصنف‬
:‫أما العملية نفسها فتعرف كما يلي‬

ostream& operator<<(ostream& C, time t)


{
C<<”the time is
“<<t.hour<<’:’<<t.min<<’:’<<t.sec<<endl;
return C;
}
‫العملية >> معرفة كعملية صديقة‬
‫للصنف‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن للعملية >> عاملين هما‪:‬‬

‫‪ .1‬العامل ‪ c‬وهو من النوع ‪ &ostream‬ويمثل الكائن‬


‫الذي نود عرض القيم ة عليه‪ .‬لح ظ أيضا‪ ،‬عزيزي‬
‫الدارس‪ ،‬أ ن هذا العام ل س يمرر بالشارة وذل ك لنه‬
‫من النوع ‪.&ostream‬‬
‫‪ .2‬والعام ل ‪ t‬وه و كائ ن م ن الصنف ‪ time‬والذي نود‬
‫عرض قيمته‪.‬‬
‫العملية >> معرفة كعملية صديقة‬
‫للصنف‬
‫و ال ن نستطيع استخدام دهذه العملية كما يلي‬
‫;)‪time tt(12,30,23‬‬
‫;‪cout<<tt‬‬
‫إ ن العام ل الحقيق ي الول ‪ cout‬يمرر للعملي ة >> من‬
‫خلل العامل الرسمي ‪ C‬وأن العامل الحقيقي الثاني ‪tt‬‬
‫يمرر للعملية >> من خلل العامل الرسمي الثاني ‪.t‬‬
‫‪ ‬تذكر الجملة ‪:‬‬
‫)‪ostream& operator<<(ostream& C, time t‬‬
‫العملية >> معرفة كعملية صديقة‬
‫للصنف‬
‫من المهم أن تلحظ‪ ،‬عزيزي الطالب ما يلي‪:‬‬
‫‪ ‬أنن ا عرفن ا للعملي ة >> عاملي ن وذل ك لنه ا عملية‬
‫ص ديقة وليس ت منتمي ة‪ ،‬إ ذ ل و كان ت منتمي ة لكتفينا‬
‫بتعري ف العام ل الثان ي عل ى اعتبار أ ن العامل الول‬
‫يعتبر تلقائيا على أنه من الصنف الذي تنتمي إليه هذه‬
‫العملية‪.‬‬
‫‪ ‬لح ظ أيض ا أ ن هذه العملي ة ترج ع قيم ة العامل ‪C‬‬
‫)لذلك فإن نوع القيمة المرجعة هو ‪ (&ostream‬وذلك‬
‫حتى نتمكن من استخدامها في سلسلة من العمليات‬
‫كما في الجملة‪:‬‬
‫;‪cout<<tt<<ss<<t2‬‬
‫حيث ‪ tt‬و ‪ ss‬و ‪ t2‬كائنات من الصنف ‪.time‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫الكلمة المفتاحية ‪This‬‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالكلمة المفتاحية ‪.This‬‬


‫الكلمة المفتاحية ‪This‬‬

‫يمتلك كل كائن في فئة مؤشرا ا خاصا ا يسمى ‪ this‬يشــــــــير إليــــــــــه‪،‬‬


‫وباستخدام هذا المؤشر يستطيع أي عضو دالي في الفئة معرفة عنوان‬
‫الكائن الذي استدعاه ‪.‬‬
This ‫الكلمة المفتاحية‬
-:where ‫المثال التالي يوضح هذا والذي يعرف الصنف‬
 

#include<iostream.h>
class where
{
private:
char chararray[10];
public:
//Continued
void reveal( )
{ cout <<”My Objects address is “<<this;
};
‫الكلمة المفتاحية ‪This‬‬
‫وهذا هو جزء ‪ main‬الذي يستدعي الدوال‪:‬‬
‫) (‪main‬‬
‫{‬
‫;‪where w1,w2‬‬
‫;) (‪w1.reveal‬‬
‫;) (‪w2.reveal‬‬
‫}‬
‫الكلمة المفتاحية ‪This‬‬
‫ينش ئ هذا ال برنامج كائنات م ن النوع ‪ ،where‬ويطلب‬
‫من كل منها عرض عنوانه باستعمال الدالة ‪،( )reveal‬‬
‫والتي تعرض قيمة المؤشر ‪.this‬‬
‫الخرج من البرنامج يبدو كالتالي‪:‬‬

‫‪My object’s address is ox8f4effec‬‬


‫‪My object’s address us ox8f4effe2‬‬
‫الكلمة المفتاحية ‪This‬‬

‫نلحظ إن عنوان الكائن ‪ w2‬يبتعد ‪ Bytes 10‬عن عنوان ‪،w1‬‬


‫وذلك لن البيانات في كل كائن تتألف من مصفوفة من ‪10‬‬
‫‪.Bytes‬‬
‫الكلمة المفتاحية ‪This‬‬
‫يم كن معام لة المؤ شر ‪ this‬كأي مؤشر كائنات آخر‪ ،‬لذا‬
‫يم كن استخدامه للو صول إ لى بيانات الكا ئن الذي يشير‬
‫إليه كما هو مبين في البرنامج أدناه‪.‬‬
This ‫الكلمة المفتاحية‬
-:test ‫المثال التالي يوضح دهذا والذي يعرف الصنف‬
#include<iostream.h>
class test {
public:
test(int=0);
void print( ) const;
private:
int x;
};
void test::print( ) const
//Continued
{
cout <<” X=”<<x<<endl
<<”this-> x= “<<this->x<<endl;
<<”(*this).x=”<<(*this).x<<endl;
}
‫الكلمة المفتاحية ‪This‬‬
‫وهذا هو جزء ‪ main‬الذي يستدعي الدوال‪:‬‬

‫) ( ‪main‬‬
‫{‬
‫;)‪test a(12‬‬
‫;) (‪a.print‬‬
‫;‪return 0‬‬
‫}‬
‫الكلمة المفتاحية ‪This‬‬
‫وللتوضيح فإن العضو الدالي ‪ print‬يقوم أول ا بطباعة ‪x‬‬
‫مباشرة‪ ،‬ثم يستعمل طريقتين للوصول إلى ‪ x‬باستعمال‬
‫المؤشر ‪: this‬‬

‫‪‬الولى‪ :‬باستعمال العامل )‪.(<-‬‬


‫‪‬الثانية‪ :‬باستعمال العامل )‪.(.‬‬
‫الكلمة المفتاحية ‪This‬‬
‫لحظ القواس التي تحيط بـ *‪ ،this‬عندما نقوم باستخدام‬
‫العا مل )‪ (.‬للو صول إ لى أعضاء الف ئة نستعمل القواس‪،‬‬
‫وذلك لن العامل )‪ (.‬له أولوية أعلى من العامل *‪ ،‬وعليه‬
‫بدون القواس يتم تقييم التعبير *‪ this.x‬كالتي‪:‬‬
‫)‪*(this.x‬‬
‫والذي ينتج عرض رسالة خطأ من المصرف لن العامل )‪(.‬‬
‫ل يستخدم مع المؤشرات‪.‬‬
‫هنا لك ا ستعمالت أخرى للمؤ شر ‪ this‬ويظهر استعمالها‬
‫عند تحميلنا للعوامل بشكل زائد‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫العناصر الثابتة )‪(static‬‬


‫إعداد‪ :‬أ‪ .‬طروب عيسى‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالعناصر الثابتة‪.‬‬


‫البيانات الساكنة‬
‫استعملنا حتى الن أعضاء بيانية مثيلية)‪ (instant‬أي أن‬
‫هنالك نسخة واحدة منها لكل كائن يتم إنشاؤه ولكن قد‬
‫نحتاج لمتغير ينطبق على كل كائنات الفئة‪.‬‬
‫لتحقيق ذلك نستعمل عضوا ا بيانيا ا ساكنا ا ‪static data‬‬
‫‪ member‬فعندما نعلن عن متغير في بيانات فئة ما على‬
‫أ نه ساكن ‪ static‬نعنى بذلك أنه ستكون هنالك نسخة‬
‫واحدة فقط من هذا المتغير في الذاكرة وستتشارك كل‬
‫الكائنات التاب عة لهذه الف ئة في هذا المتغ ير ب غض النظر‬
‫عن عدد هذه الكائنات ‪ .‬يتم تمهيد كل المتغيرات الساكنة‬
‫عند ‪ 0‬قبل إنشاء أي كائن ‪.‬‬
‫البيانات الساكنة‬
‫يتم تصريح المتغير الساكن ضمن الفئة باستعمال الكلمة‬
‫الساسية ‪:‬‬
‫‪static‬‬
‫ويتم تعريفه خارجها ‪ ،‬وذلك لنه إذا افترضنا أن البيانات‬
‫المعرفة داخل الفئة هي بيانات مثيلية مكررة لكل كائن‪.‬‬

‫إذن لتعر يف متغ ير يتوا جد مرة ل كل الف ئة علي نا تعريفه‬


‫خارج الفئة وتصريحه داخلها ليكون معروفا ا لبقية أعضائها‪.‬‬
‫البيانات الساكنة‬
:‫مثال توضيحي‬
#include<iostream.h>
class shared {
static int a;
‫العلن عن‬
int b; ‫ على انه‬a ‫المتغير‬
//Continued ‫ساكن‬

public:
void set(int i,int j) { a=i; b=j;}
void show( );};
int shared :: a; // define a
void shared :: show( ){
cout <<” This is static a: "<< a;
cout<<”\nThis is non_static b: " << b;
cout << "\n";}
‫العناصر الثابتة )‪(static‬‬
‫يمك ن ف ي لغ ة س ي ‪ ++‬اس تعمال متغيرات ثابتة ذات أنواع‬
‫أس اسية ‪ ،‬حي ث ت م اس تعمالها لتعري ف ثاب ت كحج م مصفوفة ‪،‬‬
‫يمكن جعل كائن تابع لفئة ما ثابتا ا إذا كنا نريد ضمان عدم تغير‬
‫البيانات في الكائن‪.‬‬
‫وكمثال عل ى ذل ك ف ي الص نف‪ Time‬والت ي رأيناه ا ف ي امثلة‬
‫س ابقة‪ ،‬لنفترض أنن ا نري د إنشاء كائ ن يدعى )‪noon (12, 0, 0‬‬
‫سيكون من الجيد ضمان عدم تغيير قيمة هذا الكائن‪.‬‬
‫لتحقيق هذا نكتب العبارة ‪:‬‬
‫;)‪const Time noon( 12, 0, 0‬‬
‫والتي تعلن عن كائن ثابت ‪ noon‬في الفئة ‪ Time‬وتمهد قيمته عند‬
‫‪. 12‬‬
‫الكائنات الثابتة‬
‫‪Constant Objects‬‬

‫في مثالنا السابق ‪:‬‬


‫ل تسمح مصرفات ‪ ++C‬باستدعاء الكائنات الثابتة من قبل‬
‫العضاء الدالية في الفئة لضمان عدم تعديل بيانات هذه‬
‫الكائنات ‪ ،‬ول كن قد نر غب في ب عض الحيان في عرض‬
‫قي مة هذه الكائنات وال تي ل تؤ ثر ب أي حال من الحوال‬
‫على بياناتها‪.‬‬
‫‪ ‬فما هو الحل؟؟؟؟؟؟؟؟؟؟؟؟؟؟‬
‫الكائنات الثابتة‬
‫‪Constant Objects‬‬
‫لحل هذه المشكلة يمكن للمبرمج العلن عن دالت ثابتة‬
‫)‪ (const‬وهي عبارة عن أعضاء دالية تضمن أنه لن يتم‬
‫تغيير بيانات الكائن الذي استدعي من أجلها ‪.‬‬
‫ولجعل عضوا ا داليا ا ثابتا ا تتم كتابة الكلمة الساسية ‪const‬‬
‫في تعريف العضو الدالي وتصريحه مباشرة بعد القواس‬
‫التي تلي اسمه ‪.‬‬
‫الدالت الثابتة‬
Constant Functions
:‫اليك عزيزي الطالب المثال التالي‬
-: Time ‫ التابع للفئة‬printMilitary ‫أدناه يبدو العضو الدالي‬
void Time::printMilitary( ) const

{
cout<< (hour < 10 ? “0” : “ “ ) << hour << “:”
<< (minute < 10 ? “0” : “ “) << minute << “:”
<< (second < 10 ? “0” : “ “ )<< second;
}
‫المعاملت الساكنة‬
‫نفترض ان نا نر غب في تمر ير احدى المعاملت كمرجع‬
‫لزيادة كفاءة البرنامج مع عدم تمكين الدوال في العبث‬
‫في قيمة هذا المعامل‪ ،‬فماذا نفعل؟؟؟؟‬

‫يمكن في مثل هذه الحالة استخدام الكلمة المفتاحية‪:‬‬


‫‪const‬‬
‫قبل المعامل في جملة العلن عن الدالة‪ .‬مثال‪:‬‬
‫)‪;Void aFunc(int& a, const int& b‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫الدوال الصديقة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالدوال الصديقة‪.‬‬


‫• ان تقارن ببن الدوال الصديقة والدوال المنتمية‪.‬‬
‫الدوال الصديقة‬

‫كم ا درس ت س ابقا عزيزي الطال ب فان الدوال المنتمية‬


‫للصنف هي فقط التي يحق لها معالجة الجزاء الخاصة‬
‫للصففنف )المعرفففة فففي الجزء الخاص ‪ private‬من‬
‫الصنف(‪.‬‬
‫ف ي الواق ع أ ن هنال ك نوع ا آخ ر م ن الدوال يستطيع‬
‫معالج ة الجزاء الخاص ة للص نف وهذه الدوال تدعى‬
‫الدوال الصديقة‪.‬‬
‫ما معنى الدوال‬
‫الصديقة؟‬
‫‪ .‬وتعرف الدالة على أنها دالة صديقة لصنف ما بوضع نموذج‬
‫‪ prototype‬لهذه الدال ة داخففل تعريفف الصففنف مسبوقا‬
‫بالكلمة ‪.friend‬‬

‫‪ ‬مثال‪:‬‬
‫لتعريف الدالة ‪ average‬والتي تجد معدل علمات طالب ما‬
‫كدالة صديقة للصنف ‪ student‬نضع النموذج‪:‬‬
‫‪ ‬‬
‫;)‪friend double average(student s‬‬

‫داخل تعريف الصنف ‪student‬‬


‫ما معنى الدوال‬
‫الصديقة؟‬
:student ‫تأمل عزيزي الطالب تعريف الصنف‬

• class student{
• long stno;
• int csno;
• double grades[100];
• char StName[20]; average ‫الدالة‬
‫الحق في معالجة‬
• public: ‫الجزاء الخاصة‬
• friend double average(student s); student ‫للصنف‬
‫كما لو كانت دالة‬
• void initialize(); ‫منتمية للصنف‬
student
• long get_stno() {return stno;}
• char* get_stname(){return StName;}
• };
‫ما معنى الدوال‬
‫الصديقة؟‬
‫و تختلف طريقة استدعاء الدالة الصديقة عن طريقة استدعاء‬
‫الدالة المنتمية‪ .‬فمثل لستدعاء الدالة الصديقة ‪ average‬لحساب‬
‫معدل علمات الطالب )الكائن( ‪ S‬فإننا نستدعيها كما يلي‪:‬‬

‫)‪;average(S‬‬

‫بينما لو كانت الدالة ‪ average‬دالة منتمية للصنف ‪ student‬فإننا‬


‫نستدعيها كما يلي‪:‬‬
‫‪();S.average‬‬
‫كيف تكتب الدالة‬
‫الصديقة؟‬
‫تكتب الدالة الصديقة مثل أي دالة أخرى ليس لها علقة بالصنف‪.‬‬
‫فمثل تعرف الدالة ‪ average‬كما يلي‪:‬‬
‫أننا لم نستخدم اسم‬
‫ال صنف ول عملية‬
‫)‪double average(student S‬‬ ‫تقر ير المجال ‪ ::‬في‬
‫ترويسة هذه الدالة‪.‬‬
‫;‪{ double sum=0.0‬‬
‫)‪for(int i=0;i<S.csno;i++‬‬
‫;]‪sum=sum+S.grades[i‬‬
‫;‪return sum/S.csno‬‬
‫}‬
‫كيف تكتب الدالة‬
‫الصديقة؟‬
‫لحظ‪ ،‬عزيزي الدارس ايضا في جملة تعريف الدالة‪:‬‬

‫لهذه الدالة عامل واحد هو ‪ student S‬وذلك لتمرير اسم‬


‫الكائن الذي نود حساب المعدل له من خلله‪ ،‬ولو كانت‬
‫هذه الدالة دالة منتمية لما احتجنا إلى هذا العامل‬
‫امثلة منوعة على الدوال‬
‫الصديقة‬
class Accumulator
{
private:
int m_nValue;
public:
Accumulator() { m_nValue = 0; }
void Add(int nValue) { m_nValue += nValue; }

// Make the Reset() function a friend of this class


friend void Reset(Accumulator &cAccumulator);
};

// Reset() is now a friend of the Accumulator class


void Reset(Accumulator &cAccumulator)
{
// And can access the private data of Accumulator objects
cAccumulator.m_nValue = 0;
}
‫امثلة منوعة على الدوال‬
‫الصديقة‬
class Value
{
private:
int m_nValue;
public:
Value(int nValue) { m_nValue = nValue; }
friend bool IsEqual(const Value &cValue1, const Value &cValue2);
};

bool IsEqual(const Value &cValue1, const Value &cValue2)


{
return (cValue1.m_nValue == cValue2.m_nValue);
}
‫امثلة منوعة على الدوال‬
‫الصديقة‬
• class Humidity;

• class Temperature
• {
• private:
• int m_nTemp;
• public:
• Temperature(int nTemp) { m_nTemp = nTemp; }

• friend void PrintWeather(Temperature &cTemperature, Humidity &cHumidity);
• };

• class Humidity
• {
• private:
• int m_nHumidity;
• public: ‫يمكن ان‬
• Humidity(int nHumidity) { m_nHumidity = nHumidity; } ‫تكون الدالة‬
• ‫صديقة لكثر‬
• friend void PrintWeather(Temperature &cTemperature, Humidity &cHumidity);
• };
‫من صنف‬

• void PrintWeather(Temperature &cTemperature, Humidity &cHumidity)
• {
• std::cout << "The temperature is " << cTemperature.m_nTemp <<
• " and the humidity is " << cHumidity.m_nHumidity << std::endl;
• }
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫النصناف الصديقة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالنصناف الصديقة‪.‬‬


‫النصناف الصديقة‬

‫من الممكن أن تكون دالة ما منتمية إلى نصنف ما ونصديقة‬


‫إلى نصنف آخر‪ .‬وأحيانا قد نضطر إلى تعريف عدد كبير من‬
‫الدوال المنتمية إلى نصنف كدوال نصديقة إلى نصنف آخر‪،‬‬
‫مما قد يؤدي إلى وضع عدد كبير من النماذج داخل تعريف‬
‫الصنف‪.‬‬
‫النصناف الصديقة‬

‫ولتج نب و ضع هذا العدد ال كبير من النماذج دا خل تعريف‬


‫ال صنف ن ستطيع تعر يف ال صنف بأكم له ك صنف نصديق‬
‫للصنف الخر‪ .‬مما يعطي جميع الدوال المنتمية إلى الصنف‬
‫الول القدرة ع لى معال جة الجزاء الخا نصة في الصنف‬
‫الخر‪.‬‬
‫النصناف الصديقة‬

‫‪‬مثال‪:‬‬
‫ع لى سبيل المثال لنفرض أن لدي نا الصنفين ‪manager‬‬
‫) مدير( والصنف ‪ ) employee‬موظف( وأننا نود إعطاء‬
‫جميع الدوال المنتمية للصنف ‪ manager‬إمكانية معالجة‬
‫جم يع المتغيرات والدوال الخا نصة بالصنف ‪employee‬‬
‫فبدل من أن نعرف كل من هذه الدوال كدا لة نصديقة‬
‫ننننننف ‪ manager‬كصديق للصنف‬ ‫ننف ال ص‬‫ننننطيع تعر ي‬
‫نننتس‬
‫‪ employee‬مما يحقق نفس الغاية‪ .‬ويتم ذلك بوضع الجملة‬
‫‪friend manager‬‬
‫داخل تعريف الصنف ‪.employee‬‬
‫النصناف الصديقة‬
:‫ مثال‬
:‫مثال‬..‫ تتمة‬
#include<iostream.h>
• int main( )
class TwoValues {
• {
//continue
• TwoValues ob(10, 20);
int a;
• Min m;
int b;
• cout<< m.min(ob);
public:
• return 0;
TwoValues(int i, int j) {a = i, b=
• }
j;}
friend class Min;
};
class Min {
public:
int min(TwoValues x);
};
int Min::min (TwoValues x)
{
return x.a< x.b? x.a: x.b;
}
‫النصناف الصديقة‬
‫نننن الفننئةنن ‪ Min‬كفئة نصديقة للفئة‬
‫ننم العلن ننع‬
‫ت‬
‫‪ TwoValues‬في السطر التالي‪:‬‬
‫;‪friend class Min‬‬
‫‪ ‬‬
‫لذ لك تم الو نصول إ لى العضاء الخا نصة ‪ a‬و‪ b‬في الفئة‬
‫‪ TowValues‬من قبل الفئة ‪.Min‬‬
‫)‪int Min::min (TwoValues x‬‬
‫{‬
‫;‪return x.a< x.b? x.a: x.b‬‬
‫}‬
‫مثال على النصناف‬
class Storage ‫الصديقة‬
{
private:
int m_nValue;
double m_dValue;
public:
Storage(int nValue, double dValue)
{
m_nValue = nValue;
m_dValue = dValue; }

friend class Display;};


class Display{
private:
bool m_bDisplayIntFirst;
public:
‫امثلة منوعة على‬
‫الصديقة‬ ‫النصناف‬
    Display(bool bDisplayIntFirst) 
{ m_bDisplayIntFirst = 
bDisplayIntFirst; }
     void DisplayItem(Storage 
&cStorage)    {
        if (m_bDisplayIntFirst)
            std::cout << cStorage.m_nValue 
<< " " << cStorage.m_dValue << 
std::endl;
        else // display double first
            std::cout << cStorage.m_dValue 
<< " " << cStorage.m_nValue << 
std::endl;    }};
 
‫امثلة منوعة على‬
‫الصديقة‬
    int main() ‫النصناف‬
{
    Storage cStorage(5, 6.7);
    Display cDisplay(false);
 
    cDisplay.DisplayItem(cStorage);
 
    return 0;
}
‫تذكر!!!!‬
‫تذكر عزيزي الطالب‪:‬‬
‫‪  ‬تستعمل الفئات الصديقة إذا كان هنالك فئتين مرتبطتين ببعضهما كثيرا ا‬
‫لدرجة أن أحدهما تحتاج إلى الوصول إلى بيانات الخرى الخاصة بشكل‬
‫مباشر ‪.‬‬

‫‪ ‬أننا ل نريد أن نجعل البيانات عامة لن هذا سيتيح لي شخص تعديلها‬


‫بطريق الخطأ‪.‬‬

‫‪ ‬كما أن الفئة هي ليست مشتركة في صفات مع الفئة الخرى وعليه ل‬


‫يمكن استخدام الوراثة لذا فإن استعمال الفئات الصديقة هو السلوب‬
‫الوحيد لجعل إحدى الفئتين تصل إلى العضاء الخاصة في الفئة الخرى‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫صنف المجموعات ‪Class Set‬‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان تتعرف على مفهوم صنف المجموعات‪.‬‬


‫• ان تتعرف على العمليات المختلفة لصنف المجموعات‪.‬‬
‫صنف المجموعات‬
‫تعرف المجمو عة بأن ها عدد من الشياء غ ير المرتبة‬
‫المأخوذة بدون تكرار من مدى ‪ Universe‬محدد‪ .‬ويحدد‬
‫المدى بأ صغر قي مة وأ كبر قي مة يم كن أن تنتم يا إلى‬
‫المجموعة‪.‬‬
‫العمليات على صنف المجموعات‬
‫وهنالك العديد من العمليات التي تستخدم على المجموعات‬
‫أهمها‪:‬‬
‫‪ ‬إنشاء المجمو عة‪ :‬وسنعرف بناء ‪ constructor‬يقوم بهذه‬
‫العملية‪.‬‬
‫‪ ‬إضافة عنصر للمجموعة‪ :‬وسنعرف العملية ‪ +‬لتقوم بذلك‪.‬‬
‫‪ ‬إزالة عنصر من المجموعة‪ :‬وسنعرف العملية – لتقوم بهذه‬
‫المهمة‪.‬‬
‫‪ ‬تقا طع المجموعات ‪ :set intersection‬حيث يتكون حاصل‬
‫تقا طع مجموعت ين من جم يع العنا صر المشتر كة بين‬
‫المجموعتين ) أي ال تي تظ هر في المجموعتين(‪ .‬وسنعرف‬
‫العملية * لتنفيذ هذه العملية‪.‬‬
‫العمليات على صنف المجموعات‬
‫‪ ‬اتحاد المجموعات ‪ :set union‬حيث يتكون حاصل اتحاد‬
‫مجموعتين من جميع العناصر التي تظهر في أي من هذه‬
‫المجموعات‪ .‬و سنعرف العمل ية ‪ +‬لتنفيذ هذه العملية‪.‬‬
‫لحظ أننا بذلك نكون قد أضفنا تعريفين للعملية ‪.+‬‬
‫‪ ‬النتماء إ لى المجمو عة‪ :‬ح يث يع تبر عن صرا ما منتميا‬
‫للمجموعة إذا ظهر في هذه المجموعة‪ .‬وسنكتب الدالة‬
‫‪ IN‬لتنفيذ هذه العملية‪.‬‬
‫‪ ‬تعيين المجموعات‪ :‬وتقوم هذه العملية بجعل مجموعة ما‬
‫مساوية لمجموعة أخرى‪ .‬وسنكتب العملية = لتنفيذ ذلك‪.‬‬
‫‪. ‬‬
‫العمليات على صنف المجموعات‬
‫‪‬التأكد من أن المجموعة خالية‪ :‬وتستخدم لفحص فيما‬
‫إذا كا نت المجمو عة خال ية أم ل‪ .‬و سنستخدم الدالة‬
‫‪ SetEmpty‬لعمل ذلك‪.‬‬
‫‪‬فرق المجموعات ‪ :set difference‬وتستخدم هذه‬
‫العملية ليجاد العناصر الموجودة في مجموعة وليست‬
‫موجودة في مجموعة أخرى‪.‬‬
‫‪‬عرض عنا صر المجمو عة ع لى الشا شة‪ :‬وسنعرف‬
‫العملية >> لعمل ذلك‪.‬‬
‫العمليات على صنف المجموعات‬
‫سنفترض هنا أن مدى المجموعة مدى محدود بمعنى أننا‬
‫نس تطيع أ ن نعدد جميع عناص ره‪ .‬وذل ك لننا سنستخدم‬
‫مصفوفة ذات بعد واحد لتمثيل أي مجموعة حيث أن كل‬
‫عنصر في المدى يمثل بموقع في هذه المصفوفة‪.‬‬
‫فإذا كان ذلك العنصر منتميا إلى المجموعة نضع القيمة‬
‫‪ 1‬ف ي الموق ع المخص ص ل ه وإ ن ل م يك ن منتمي ا نضع‬
‫القيمة ‪ 0‬في الموقع المخصص له‪.‬‬
‫العمليات على صنف المجموعات‬
‫فمثل لنفرض أن مدى المجموعة هو أسماء أيام السبوع‬
‫السبعة‪.‬‬
‫لتمثي ل هذه المجموع ة نس تخدم مص فوفة م ن سبعة‬
‫مواقع‪ ،‬موقع لكل عنصر في المدى‪.‬‬
‫إذا كان يوم الس بت عنص را ف ي المجموع ة فإننا نخزن‬
‫القيمة‪ 1‬في الموقع الول المخصص له وإذا لم يكن فإننا‬
‫نخزن القيمة ‪ 0‬في الموقع المخصص له‪.‬‬
‫ثم نأتي للموقع الثاني في المصفوفة و المخصص ليوم‬
‫الحد ونضع فيه القيمة ‪ 1‬إذا كان يوم الحد عنصرا في‬
‫المجموعة و ‪ 0‬إذا لم يكن وهكذا‪.‬‬
‫العمليات على صنف المجموعات‬
‫يبين الش كل التا لي بالر سم م صفوفة تم ثل المجمو عة {‬
‫سبت‪،‬أثنين‪،‬خميس }‪:‬‬

‫مصفوفة تمثل المجموعة {سبت‪ ،‬أثنين‪،‬‬


‫خميس}‬
‫العمليات على صنف المجموعات‬
:‫وسنستخدم الصنف التالي لتمثيل مجموعة من أيام السبوع‬
 
class Set{
int weekdays[7];
public:
Set();
void operator+(int i);
void operator-(int i);
friend Set operator*(Set S, Set T);
friend Set operator+(Set S, Set T);
int IN(int i);
void operator=(Set S);
int SetEmpty();
friend Set operator-(Set S, Set T);
friend ostream& operator<<(ostream& C, Set S);
};
‫العمليات على صنف المجموعات‬
‫لح ظ‪ ،‬عزيزي الدارس‪ ،‬أ ن هذا الص نف يحتوي على‬
‫متغير منتم واحد هو ‪ weekdays‬والذي هو في الحقيقة‬
‫مصفوفة من سبعة مواقع كل موقع مخصص ليوم من‬
‫أيام السبوع‪.‬‬
‫كم ا يحتوي عل ى العدي د من نماذج الدوال والعمليات‬
‫المنتمية والصديقة‪.‬‬

‫سيتم مناقشتها في الفيديو المسجل العملي‪..........‬‬


‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬

‫مقرر برمجة)‪1291 (1‬‬

‫لقاء إفتراضي بعنوان‬

‫مناقشة مواضيع هامة لمادة قبل النهائي )أمثلة وتدريبات(‬

‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى المصري‪ /‬منسق المقرر‬
‫فرع الخلي‬

‫الربعاء ‪23/12/2017‬‬
‫يحتوي اللقاء على شرح أمثلة تتعلق‬
‫بالمواضيع التالية‪:‬‬
‫تمرير‬ ‫‪‬‬

‫‪ ‬الوراثة)‪:(Inheritance‬‬

‫وراثة متعددة المستويات )‪(Multilevel Inheritance‬‬ ‫‪‬‬

‫ورثة متعددة )‪(Multiple Inheritance‬‬ ‫‪‬‬

‫محددات الوراثة‬ ‫‪‬‬

‫الملفات‬ ‫‪‬‬
(Inheritance) ‫وراثة‬
SuperClas
s
OR
SubClass BaseClass
OR OR
DrivedCla Parent
ss
OR
Child
(Type of Inheritance) ‫انواع الوراثة‬

public, protected or private

https://www.tutorialspoint.com/cplusplus/cpp_inheritanc
e.htm
Access Control and Inheritance
Access public protected private
Same class yes yes yes

Derived yes yes no


classes
Outside yes no no
classes
(Inheritance) ‫وراثة‬
‫محددات الوراثة‬
(Multilevel Inheritance) ‫وراثة متعددة المستويات‬
(Multilevel Inheritance) ‫وراثة متعددة المستويات‬

Class Person {……};

Class Doctor: public Person {……..};

Class Surgeon:public Doctor {……};


Example program

#include<iostream>
using namespace std;
class person{
protected:
string name;
int phone_No;
public:
void setdata(string n,int p){
name=n;
phone_No=p;
}
Example program

void showData(){
cout<<"name="<<name<<endl;
cout<<"phoneno="<<phone_No<<endl;
}
};
Example program

class doctor: public person{


protected:
int Id;
public:
void tr (){
cout<<"patients"<<endl;
}
};
Example program

class surgeon:public doctor{


public:
void operate(){
cout<<"surgeon operates....."<<endl;
}
};
Example program

int main() {
;surgeon s
s.setdata(“mehak",123);
)(;s.showData
s.operate();
s.treat();
}
:Multiple Inheritance
Multiple Inheritance:Syntax

Class A {….};

Class B {…};

Class C :public A , Public B {….};


Multiple Inheritance: Example

#include<iostream>
using namespace std;
class father {
private:
string name;
int phone_No;
public:
void function() {
cout<<"father function....."<<endl;
}
};
class mother{
public:
void cook() {
cout<<"mother cook food...."<<endl;
}
};
Multiple Inheritance: Example

class son
public:
void learn() {
cout<<"son learn from books....."<<endl;
}
};
int main() {
son s1;
s1.function();
s1.cook();
s1.learn();
}
‫‪Multiple Inheritance: Example‬‬

‫ـــ؟ــس‪:‬‬
‫عرف صنف يحتوي على صنف اسمه ‪ Polygon‬يحتوي على‬
‫المتغير ‪ width‬و ‪ height‬معرفة في القسم الخاص وكذلك دالة‬
‫لسناد القيم من خلل القراءة او ارسال القيم اثناء الستدعاء وصنف‬
‫اخر ‪ Rectangle‬يحتوي على دالة لحساب المساحة وتعرف في‬
‫القسم العام وصنف ‪ Triangle‬لتعريف دالة لحساب المساحة‪.‬‬
‫عرف كائن من نوع ‪ Rectangle‬واسند القيم ثم اطبع المساحة‬
‫وكذلك بالمثل مع الصنف ‪ Triangle‬وراثة عامة‪.‬‬
#include <iostream>
using namespace std;
 
class Polygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};
 
class Rectangle: public Polygon {
public:
int area ()
{ return width * height; }
};
 
class Triangle: public Polygon {
public:
int area ()
{ return width * height / 2; }
};
int main () {
Rectangle rect;
Triangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
cout << rect.area() << '\n';
cout << trgl.area() << '\n';
return 0;
}
‫مثال على الوراثة‬
class Shape {
protected:
float width, height;
public:
void set_data (float a, float b) { width = a; height
= b; }
};
class Rectangle: public Shape { class Triangle: public Shape {
public: public:
float area () { return (width * float area () {
height); } return (width * height / 2); }
}; };
int main () {
Rectangle rect;
Triangle tri; output
rect.set_data (5,3); :
tri.set_data (2,5); 15
cout << rect.area() << endl; cout << tri.area() << 5
endl; return 0;
}
class base1 { ‫غموض‬
public:
void some_function( ) { .... ... .... }
};
class base2 {
void some_function( ) { .... ... .... }
};
class derived : public base1, public base2 {
};
‫ما الهدف من وضع‬
int main() { ‫محدد للوراثة؟؟‬
derived obj;
obj.same_function( ) ; // Error!!
:‫الحل‬
}
int main() {
...
‫ما نوع الوراثة في المثال السابق؟‬
obj.base1::same_function( )
;
‫أسئلة وتمارين حول الوراثة‬
‫‪‬اكتب النص البرمجي الذي يحقق الوراثة المنفردة الموضحة‬
‫في الشكل التالي علما بان الصنفان المشتقان يحتويان‬
‫‪CPolygon‬‬
‫‪width : Integer‬‬

‫دوال حساب المساحة‪.‬‬


‫‪height : Integer‬‬

‫)(‪set_values‬‬

‫‪CRectangle‬‬ ‫‪CTriangle‬‬

‫)( ‪area‬‬ ‫)( ‪area‬‬


‫معالجة الملفات بلغة ‪++C‬‬
‫‪ ‬إذا أحببت أن تتعامل مع قنوات الملفات يجب أن نستخدم الملف الرأسي‬
‫‪ fstream.h‬أي قنوات الملفات ‪File Stream‬‬
‫إذا يجب أن تكون العبارة ‪:‬‬
‫>‪#include <fstream.h‬‬
‫‪ ‬للكتابة داخل أي ملف توجد ‪ 3‬خطوات وهي‪:‬‬
‫نعرف كائن من نوع ملف‪:‬‬ ‫‪.1‬‬
‫نفتح الملف للكتابة‬ ‫‪.2‬‬
‫نكتب داخل الملف‬ ‫‪.3‬‬

‫; ‪1. ofstream fout‬‬


‫;)‪2. fout.open("file path",iostream family‬‬
‫;"‪3. fout<<"data‬‬
++C ‫معالجة الملفات بلغة‬

https://www.tutorialspoint.com/cplusplus/cpp_files_stream
s.htm
‫ برنامج لكتابة أكثر من سطر في ملف‬:‫مثال‬
#include <fstream.h>
int main()
{
ofstream fout;
fout.open("D:\\firstExa.txt");
fout << "HELLO C++ Programmer.\n"
<< “This is the first line\n"
<< “this is the second line\n";
fout.close();
}
‫ الملفات‬... ‫تابع‬
‫سلسلة من‬.‫البايتات‬ : Stream 
‫للكتابة على‬: ‫الملف‬ ofstream 
‫للقراءة من‬: ‫ملف‬ ifstream 
‫للقراءة‬: ‫والكتابة‬ fstream 
:‫ فتح الملف‬
‫فتح باستخدام البناء‬

ofstream outFile("sample.txt");    //output only


ifstream inFile(“sample.txt”);  //input only
()open ‫ فتح الملف باستخدام الدالة‬
 Stream-object.open(“filename”, mode)
  ofstream outFile;
  outFile.open("sample.txt");
     
      ifstream inFile;
      inFile.open("sample.txt");
fstream file;
file.open ("example.bin", ios::out | ios::app |
ios::binary);
‫الكتابة في ملف‬
‫نربط الملف الرأسي الذي يحوي كلسات قنوات الملفات‪//‬‬
‫>‪#include <fstream‬‬
‫)(‪void main‬‬
‫{‬
‫أي للكتابة على الملف ‪ out‬نعرف متغير قناة خرج‪//‬‬
‫;‪ofstream fout‬‬
‫نفتح القناة الن على ملف محدد باسمه ونضع لفتة على القناة أو راية تدل أنها قناة من البرنامج وتودي للملف‪//‬‬
‫;)‪fout.open("D:\\MyFile.txt" , ios::out‬‬
‫الن جاهزون لستخدام القناة ‪//‬‬
‫;"‪fout << "Hello this is my first file test‬‬
‫الن لنغلق القناة‪//‬‬
‫;)(‪fout.close‬‬
‫}‬
‫كتابة في ملف أم قراءة ؟؟‬
#include<iostream.h>
#include<fstream.h>
void main()
{
ifstream fin;
fin.open("MyFile.txt");
char c;
while( ! fin.eof())
{
fin >> c;
cout << c;
}
fin.close();
}
‫الكتابة في ملف! لماذا مصفوفة؟؟‬
#include<fstream>

int main()
{
     ofstream fout;
     fout.open("out.txt");
     char str[300]=“Welcome to C++ course. Have a
nice day.";
     fout<<str;
     fout.close();
     return 0;
}
‫ملف؟‬ ‫كتابة أم قراءة من‬
#include<fstream.h>
#include<conio.h>
int main()
{
     ifstream fin;
     fin.open("out.txt");
     char ch;
     while(!fin.eof())
     {
          fin.get(ch);
          cout<<ch;
     }
     fin.close();
}
‫ما عمل البرنامج التالي؟‬
#include<fstream.h>
#include<conio.h>
int main()
{
     ifstream fin;
     fin.open("out.txt");
     clrscr();
     char ch; int count=0;
     while(!fin.eof())
     {
          fin.get(ch);
          count++;
     }
     cout<<"Number of characters in file is "<<count;
     fin.close();
     getch();
     return 0;
}
‫بعض السئلة والتمارين حول‬
‫الملفات‬
‫‪‬اكتب برنامجا لكتابة نصا في سطرين داخل ملف‬
‫‪ .example.txt‬موضحا كيفية فتح الملف للكتابة دون مسح‬
‫محتويات الملف إن كان موجودا من قبل‪.‬‬
‫‪‬اكتب برنامجا يقوم بقراءة محتويات الملف المذكور في‬
‫التمرين السابق وطباعة محتوياته على الشاشة‪ .‬وإن كان‬
‫الملف غير موجود فإنه يطبع رسالة تبين ذلك‪.‬‬
‫‪‬اكتب برنامجا لحساب حجم الملف ‪example.txt‬‬

‫المصدر‪ :‬الدليل العملي للمقرر‬


‫انتهى اللقاء‬

‫مع تمنياتي لكم بالنجاح والتوفيق‬


Learning Objectives

 C++ I/O streams.


 Reading and writing sequential files.
 Reading and writing random access files.

CPSC 231 D.H. C++ 1


C++ Files and Streams
 C++ views each files as a sequence of bytes.
 Each file ends with an end-of-file marker.
 When a file is opened, an object is created and
a stream is associated with the object.
 To perform file processing in C++, the header
files <iostream.h> and <fstream.h> must be
included.
 <fstream.> includes <ifstream> and <ofstream>

CPSC 231 D.H. C++ 2


Creating a sequential file
// Fig. 14.4: fig14_04.cpp D&D p.708
// Create a sequential file
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main()
{
// ofstream constructor opens file
ofstream outClientFile( "clients.dat", ios::out );

if ( !outClientFile ) { // overloaded ! operator


cerr << "File could not be opened" << endl;
exit( 1 ); // prototype in stdlib.h
}

CPSC 231 D.H. C++ 3


Sequential file
cout << "Enter the account, name, and balance.\n"
<< "Enter end-of-file to end input.\n? ";
int account;
char name[ 30 ];
float balance;

while ( cin >> account >> name >> balance ) {


outClientFile << account << ' ' << name
<< ' ' << balance << '\n';
cout << "? ";
}

return 0; // ofstream destructor closes file


}

CPSC 231 D.H. C++ 4


Question.
 What does the above program do?

CPSC 231 D.H. C++ 5


How to open a file in C++ ?

Ofstream outClientFile(“clients.dat”, ios:out)


OR
Ofstream outClientFile;
outClientFile.open(“clients.dat”, ios:out)

CPSC 231 D.H. C++ File Processin 6


g
File Open Modes
ios:: app - (append) write all output to the end of
file
ios:: ate - data can be written anywhere in the file
ios:: binary - read/write data in binary format
ios:: in - (input) open a file for input
ios::out - (output) open afile for output
ios: trunc -(truncate) discard the files’ contents if
it exists CPSC 231 D.H. C++ File Processin 7
g
File Open Modes cont.

ios:nocreate - if the file does NOT exists, the


open operation fails
ios:noreplace - if the file exists, the open
operation fails

CPSC 231 D.H. C++ File Processin 8


g
How to close a file in C++?
The file is closed implicitly when a
destructor for the corresponding object is
called
OR
by using member function close:
outClientFile.close();

CPSC 231 D.H. C++ File Processin 9


g
Reading and printing a
sequential file
// Reading and printing a sequential file
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <stdlib.h>
void outputLine( int, const char *, double );
int main()
{
// ifstream constructor opens the file
ifstream inClientFile( "clients.dat", ios::in );

if ( !inClientFile ) {
cerr << "File could not be opened\n";
exit( 1 );
CPSC 231 D.H. C++ File Processin 10
} g
int account;
char name[ 30 ];
double balance;

cout << setiosflags( ios::left ) << setw( 10 ) << "Account"


<< setw( 13 ) << "Name" << "Balance\n";

while ( inClientFile >> account >> name >> balance )


outputLine( account, name, balance );

return 0; // ifstream destructor closes the file


}

void outputLine( int acct, const char *name, double bal )


{
cout << setiosflags( ios::left ) << setw( 10 ) << acct
<< setw( 13 ) << name << setw( 7 ) << setprecision( 2 )
<< resetiosflags( ios::left )
<< setiosflags( ios::fixed | ios::showpoint )
<< bal << '\n';
}
CPSC 231 D.H. C++ 11
File position pointer
<istream> and <ostream> classes provide
member functions for repositioning the file
pointer (the byte number of the next byte in the
file to be read or to be written.)
These member functions are:
seekg (seek get) for istream class
seekp (seek put) for ostream class

CPSC 231 D.H. C++ File Processin 12


g
Examples of moving a file
pointer
inClientFile.seekg(0) - repositions the file get pointer to
the beginning of the file
inClientFile.seekg(n, ios:beg) - repositions the file get
pointer to the n-th byte of the file
inClientFile.seekg(m, ios:end) -repositions the file get
pointer to the m-th byte from the end
of file
nClientFile.seekg(0, ios:end) - repositions the file get
pointer to the end of the file
The same operations can be performed with <ostream>
function member seekp.
CPSC 231 D.H. C++ File Processin 13
g
Member functions tellg() and
tellp().
Member functions tellg and tellp are provided
to return the current locations of the get and put
pointers, respectively.
long location = inClientFile.tellg();
To move the pointer relative to the current
location use ios:cur
inClientFile.seekg(n, ios:cur) - moves the file
get pointer n bytes forward.

CPSC 231 D.H. C++ File Processin 14


g
Updating a sequential file
Data that is formatted and written to a
sequential file cannot be modified
easily without the risk of destroying
other data in the file.
If we want to modify a record of data,
the new data may be longer than the
old one and it could overwrite parts of
the record following it.
CPSC 231 D.H. C++ File Processin 15
g
Problems with sequential files
Sequential files are inappropriate for so-
called “instant access” applications in
which a particular record of information
must be located immediately.
These applications include banking
systems, point-of-sale systems, airline
reservation systems, (or any data-base
system.)

CPSC 231 D.H. C++ File Processin 16


g
Random access files
Instant access is possible with random
access files.

Individual records of a random access file


can be accessed directly (and quickly)
without searching many other records.

CPSC 231 D.H. C++ File Processin 17


g
Example of a Program that
Creates a Random Access File
// Fig. 14.11: clntdata.h
// Definition of struct clientData used in
// Figs. 14.11, 14.12, 14.14 and 14.15.
#ifndef CLNTDATA_H
#define CLNTDATA_H
struct clientData {
int accountNumber;
char lastName[ 15 ];
char firstName[ 10 ];
float balance;
};
#endif
CPSC 231 D.H. C++ File Processin 18
g
Creating a random access file
// Creating a randomly accessed file sequentially
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include "clntdata.h"
int main()
{
ofstream outCredit( "credit1.dat", ios::out);
if ( !outCredit ) {
cerr << "File could not be opened." << endl;
exit( 1 );
}

CPSC 231 D.H. C++ File Processin 19


g
clientData blankClient = { 0, "", "", 0.0 };

for ( int i = 0; i < 100; i++ )


outCredit.write
(reinterpret_cast<const char *>( &blankClient ),

sizeof( clientData ) );
return 0;
}

CPSC 231 D.H. C++ 20


<ostream> memebr function
write
The <ostream> member function
write outputs a fixed number of bytes
beginning at a specific location in
memory to the specific stream. When
the stream is associated with a file,
the data is written beginning at the
location in the file specified by the
“put” file pointer.
CPSC 231 D.H. C++ File Processin 21
g
The write function expects a first
argument of type const char *, hence
we used the reinterpret_cast <const
char *> to convert the address of the
blankClient to a const char *.
The second argument of write is an
integer of type size_t specifying the
number of bytes to written. Thus the
sizeof( clientData
CPSC 231 )D.H.
. C++ 22
Writing data randomly to a
random file
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include "clntdata.h"
int main()
{
ofstream outCredit( "credit.dat", ios::ate );

if ( !outCredit ) {
cerr << "File could not be opened." << endl;
exit( 1 );
}
CPSC 231 D.H. C++ File Processin 23
g
cout << "Enter account number "
<< "(1 to 100, 0 to end input)\n? ";

clientData client;
cin >> client.accountNumber;

while ( client.accountNumber > 0 &&


client.accountNumber <= 100 ) {
cout << "Enter lastname, firstname, balance\n? ";
cin >> client.lastName >> client.firstName
>> client.balance;

CPSC 231 D.H. C++ 24


outCredit.seekp( ( client.accountNumber - 1 ) *
sizeof( clientData ) );
outCredit.write(
reinterpret_cast<const char *>( &client ),
sizeof( clientData ) );

cout << "Enter account number\n? ";


cin >> client.accountNumber;
}

return 0;
}

CPSC 231 D.H. C++ 25


Reading data from a random file
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <stdlib.h>
#include "clntdata.h"
void outputLine( ostream&, const clientData & );
int main()
{
ifstream inCredit( "credit.dat", ios::in );
if ( !inCredit ) {
cerr << "File could not be opened." << endl;
exit( 1 );
}
CPSC 231 D.H. C++ File Processin 26
g
cout << setiosflags( ios::left ) << setw( 10 ) << "Account"
<< setw( 16 ) << "Last Name" << setw( 11 )
<< "First Name" << resetiosflags( ios::left )
<< setw( 10 ) << "Balance" << endl;

clientData client;

inCredit.read( reinterpret_cast<char *>( &client ),


sizeof( clientData ) );

CPSC 231 D.H. C++ 27


while ( inCredit && !inCredit.eof() ) {

if ( client.accountNumber != 0 )
outputLine( cout, client );

inCredit.read( reinterpret_cast<char *>( &client ),


sizeof( clientData ) );
}

return 0;
}

CPSC 231 D.H. C++ 28


void outputLine( ostream &output, const clientData &c )
{
output << setiosflags( ios::left ) << setw( 10 )
<< c.accountNumber << setw( 16 ) << c.lastName
<< setw( 11 ) << c.firstName << setw( 10 )
<< setprecision( 2 ) << resetiosflags( ios::left )
<< setiosflags( ios::fixed | ios::showpoint )
<< c.balance << '\n';
}

CPSC 231 D.H. C++ 29


The <istream> function read
inCredit.read (reinterpret_cast<char *>(&client),
sizeof(clientData));

The <istream> function inputs a specified


(by sizeof(clientData)) number of bytes
from the current position of the specified
stream into an object.

CPSC 231 D.H. C++ File Processin 30


g
‫المؤشرات ‪Pointers‬‬

‫معاذ أبو الهيجاء‬


‫برمجة ‪1‬‬
‫المؤشرات‬
‫‪:‬عندما نعرف متغير على انه مؤشر فيجب ان‬
‫نعرف نوع ذلك المتغير)اي نوع البيانات التي يؤشر عليها( ‪1-‬‬
‫ان نضع الرمز * قبل المتغير المؤشر لنعلن انه مؤشر وليس متغير عادي ‪2-‬‬
‫‪:‬مثال‬
‫‪#include<iostream.h‬‬ ‫لنعرف المتغير‪p‬على انه مؤشر لموقع‬
‫>‬
‫في الذاكرة مخصص للقرقام الصحيحة‬
‫)(‪void main‬‬
‫{‬ ‫‪:‬الن‬
‫;‪int *p‬‬ ‫اذا اقردنا ان نجعل المؤشر‪p‬يؤشر على‬
‫متغير اخر فانه يجب ان يكون من نفس نوعه‬
‫‪:‬ويتم كما هو موضح بالمثال اللقحق‬
‫في هذا المثال يوجد لدينا متغير من نوع عدد صحيح اسمه‪x‬لكي نجعل‬
‫المؤشر ‪ P‬يؤشر على هذا المتغير ‪:x‬فانه يتم كالتالي‬
‫هل نوع المؤشر هو من نوع المتغير المراد التاشيرعليه؟‬
‫‪#include<iostream.h‬‬ ‫الجواب نعم‪ ,‬اذا يجوز‬
‫>‬ ‫المؤشر‪ p‬يؤشر على المتغير ‪x‬‬
‫{)(‪void main‬‬
‫;‪int x‬‬ ‫ويمكن اختصاقرا ان ننفذ لك من خلل‬
‫;‪int *p‬‬ ‫الجملة التالية ;‪int *p =&x‬‬
‫};‪p=&x‬‬
‫الن اصبح لدينا المتغير ‪X‬له اسم اخر‬
‫‪#include<iostream.h‬‬
‫>‬ ‫هو‪*p‬‬
‫)(‪void main‬‬ ‫مثال‪:‬سيكون الناتج ‪ 7‬لن ‪X‬هي نفسها‬
‫{‬
‫;‪int x=5‬‬ ‫‪*p‬‬
‫;‪int *p =&x‬‬
‫;‪cout<< *p +2‬‬
‫}‬
‫التاشير على التركيب‬
‫ل يختلف التاشير على التركيب عما ذكرنا ه سابق‬
‫‪:‬ال ان‬
‫نوع المؤشر سيكون من نوع تركيب‬
‫‪#include<iostream.h‬‬ ‫سيؤشر على متغير من ذلك التركيب‬
‫>‬ ‫)اي متغير مركب(‬
‫{‪struct car‬‬ ‫‪:‬لنفترض ان لدينا التركيب التالي‬
‫;‪int no‬‬ ‫هنا عرفنا متغير مركب)كائن( من نوع‬
‫;‪float price‬‬ ‫هذاالتركيب‬
‫;}‬ ‫هنا عرفنا متغير مؤشر من نوع هذا‬
‫)(‪void main‬‬ ‫التركيب‬
‫{‬
‫هنا جعلنا المؤشر‪*p‬يؤشر على الكائن‬
‫;‪car bmw‬‬
‫‪bmw‬‬
‫;‪car *p‬‬
‫} ;‪p=&bmw‬‬ ‫وتذكر اننا نستطيع ان نجعله يؤشر عليه‬
‫بطريقة اخرى هي‬
‫;‪car *p=&bmw‬‬
‫اصبح لدينا الن اسم اخر ل ‪ bmw‬هو ‪*p‬لنه يؤشر عليه‬
‫فاذا اقردنا ندخل قيم او طباعتها او‪ ....‬من خلل المؤشر ‪ *p‬فاننا نستبدل‬
‫المتغير ‪Bmw‬بهذا المؤشر‬
‫‪Cin>>bmw.no‬‬
‫تعادل‬
‫‪Cin>>(*p).no‬‬
‫وهي تعادل ايضا‬
‫‪Cin p->no‬‬
‫التاشير على النصناف والكائنات‬
‫ل يختلف التاشير على الكائن غن غيره من المتغيرات‬
‫‪#include<iostream.h‬‬
‫نوع المؤشر سيكون من نوع الصنف‬
‫>‬ ‫و سيؤشر على كائن من ذلك الصنف‬
‫{‪Class car‬‬
‫;‪int no‬‬ ‫‪:‬فلنفرض ان لدينا تعريف الصنف التالي‬
‫;‪float price‬‬
‫‪public:‬‬ ‫هنا عرفنا كائن من نوع‬
‫)(‪void set‬‬ ‫هذا الصنف‬
‫;‪{cin>>no;cin>>price‬‬ ‫هنا عرفنا متغير مؤشر من نوع هذا‬
‫}‬ ‫الصنف‬
‫;}‬ ‫هنا جعلنا المؤشر‪*p‬يؤشر على الكائن‬
‫)(‪void main‬‬
‫‪bmw‬‬
‫{‬
‫;‪car bmw‬‬
‫وتذكر اننا نستطيع ان نجعله يؤشر عليه‬
‫;‪car *p‬‬ ‫بطريقة اخرى هي‬
‫} ;‪p=&bmw‬‬ ‫;‪car *p=&bmw‬‬
‫اصبح لدينا الن اسم اخر ل ‪ bmw‬هو ‪*p‬لنه يؤشر عليه‬
‫فاذا اقردنا ندخل قيم او طباعتها او‪ ....‬من خلل المؤشر ‪ *p‬فاننا نستبدل‬
‫المتغير ‪Bmw‬بهذا المؤشر‬
‫لكن ايضا تذكر هنا‪ :‬اننا ليمكن ان نتعامل من خلل ال ‪main‬‬
‫‪:‬مع المتغيرات المعرفة في القسم الخاص فمثل‬
‫‪Cin>>bmw.no‬هي خاطئة‬
‫تعادل‬
‫‪Cin>>(*p).no‬وهي خاطئة‬
‫وهي تعادل ايضا‬
‫‪....Cin p->no‬وهي خاطئة لكن‬
‫;)(‪Cin>>bmw.set(); cin>>(*p).set‬كلها صحيحة‬
‫;)(‪cin>>p->set‬‬
‫لنها تتعامل مع المتغيرات من خلل دالة منتمية هي)(‪Set‬‬
‫الحجز الديناميكي‬
‫حجز الذاكرة بالطريقة الديناميكية يتم ايضا من خل ل المؤشرات لكن باستخدام‬
‫‪#include<iostream.h‬‬ ‫الدالة‪ new‬ويتم تحريرها من خل ل الدالة ‪delete‬‬
‫>‬ ‫‪:‬فمثل‬
‫)(‪void main‬‬ ‫‪ ...‬لحظ الختلف‬
‫{‬ ‫فهنا المؤشر ليؤشر على متغير معين‬
‫;‪int *p‬‬ ‫انما على موقع لعدد نصحيح‬
‫;‪P=new int‬‬ ‫بنفس الطريقة يتم التعامل مع التراكيب‬
‫‪#include<iostrea‬‬ ‫فلحجزموقع في الذاكرة لكائن او متغير مركب من نوع تركيب ما فان‬
‫>‪m.h‬‬ ‫المؤشر‪p‬ل يؤشر على كائن معين او محدد‬
‫{‪struct car‬‬ ‫انما يحجز مكان في الذاكرة لكائن جديد‬
‫;‪int no‬‬
‫;};‪float price‬‬
‫{)(‪void main‬‬
‫;‪car *p‬‬
‫;‪p=new car‬‬
‫يتم التعامل مع النصناف والكائنات بنفس الطريقة ال انه يجب النتباه فيما اذا‬
‫كان هناك دالة بناءة ام ل‬
‫‪#include<iostream‬‬ ‫‪:‬فمثل‬
‫>‪.h‬‬ ‫فهنا المؤشر ليؤشر على كائن معين‬
‫{‪Class car‬‬ ‫انما على موقع لكائن جديد‬
‫;‪int no‬‬ ‫ولحظ ان هذا التعريف نصحيح‬
‫;‪float price‬‬ ‫لنه ل يوجد دالة بناءة‬
‫‪public:‬‬
‫)(‪void set‬‬
‫‪{cin>>no;cin>>pri‬‬
‫;}};‪ce‬‬
‫)(‪void main‬‬
‫{‬ ‫لكن في حا ل وجود دالة بناءة ولها معاملت‬
‫;‪car *p‬‬ ‫فان التعريف المتعلق بحجز الذاكرة بطريقة ديناميكية‬
‫};‪p=new car‬‬ ‫لكائن من ذلك الصنف سيكون كما في المثا ل اللحق‬
‫ل حظ وجود دالة بناءة في الصنف ولها معاملت‬
‫لذا فان التعريف سيكون‬

‫‪#include<iostream‬‬
‫>‪.h‬‬
‫{‪Class car‬‬
‫اي اننا اعطينا قيم ابتدائية في اثناء مرحلة التعريف‬
‫;‪int no‬‬
‫;‪float price‬‬
‫‪public:‬‬
‫طبعا تستطيع ان تغير هذه القيم وتضع ما تريد لكن‬
‫‪void‬‬
‫النتباه ان تكون بنفس نوع المعامل‬
‫)‪Car(int,float‬‬
‫};‪{no=x; price=y‬‬
‫)(‪set‬‬
‫‪{cin>>no;cin>>pri‬‬
‫;}};‪ce‬‬
‫)(‪void main‬‬
‫{‬
‫;‪car *p‬‬
‫‪p=new‬‬
‫وبالنسبة للمتغير ‪P‬الذي استعملناه في جميع المثلة السابقة المتعلقة بحجز الذاكرة‬
‫بطريقة ديناميكية فاننا نضع الجملة;‪delete p‬بعد النتهاء من الحاجة الى الكائن‬
‫الذي حجزت له هذه الذاكرة‬

‫اي اننا نحررها ليستفاد منها مرة اخرى في وقت لحق‬


‫الوراثة والملفات‬

‫معاذ أبو الهيجاء‬


‫برمجة ‪1‬‬
‫الوراثة‬
‫السؤال الول‪:‬‬

‫اكتب برنامج بلغة ‪ ++C‬يحسب ويطبع الرقم الكبر بين رقمين وكذلك يحسب‬
‫و يطبع الرقم الغصغر بين رقمين باستخدام مفهوم التوارث حسب التالي‪:‬‬
‫عرف غصنف الساس باسم ‪ calc‬وعرف الدوال ‪:‬‬
‫‪f‬وظيفتها حساب الرقم الكبر بين رقمين‬
‫‪Output‬وظيفتها طباعة هذا الرقم الكبر‬
‫عرف غصنف مشتق اشتقاق عام من ذلك الصنف باسم ‪ sample‬وعرف‬
‫الدوال‪:‬‬
‫‪f‬وظيفتها حساب الرقم الغصغر بين رقمين‬
‫‪Outputt‬وظيفتها طباعة ذلك الرقم الغصغر‬
‫>‪#include<iostream.h‬‬
‫{‪class calc‬‬ ‫لحظ مايلي‪ :‬اننا عرفنا المتغير ‪ max‬في القسم الخاص حيث لم تكن حاجة‬
‫لتعريفه في القسم المحمي مع انه سوف يعطي النتيجة والسبب في ذلك اننا لم‬
‫نحتاج لتعريف دالة داخل الصنف الموروث لتتعامل مع المتغير ‪max‬‬
‫ولو قمنا بذلك لكان خطا لن هذه الدوال لن يكون لديها القدرة على رؤية‬
‫المتغير ‪ max‬لنه في القسم الخاص ول يورث ‪,‬لغصبح بحاجة ان يوضع في‬
‫;‪int max‬‬ ‫القسم المحمي لتتمكن الدوال من رؤيته فمثل‪:‬‬
‫‪public:‬‬ ‫افترض حسب هذا البرنامج اننا نريد ان ننعرف الدالة ‪ fun‬داخل الصنف‬
‫};‪calc(){max=0‬‬ ‫‪sample‬كالتالي‪/:‬‬
‫{)‪void f(int x,int y‬‬ ‫};‪Void fun(){cout<<max‬‬
‫بالتاكيد سيعطي البرنامج خطا حيث ان الدالة ‪ fun‬ل ترى المتغير ‪ max‬حيث ‪if (x>y) max=x;else‬‬
‫};‪max=y‬‬ ‫انه‬
‫)(‪void output‬‬ ‫ل يورث لنه في القسم الخاص‬
‫;}};‪{cout<<max‬‬ ‫بينما يحق لنا استدعاء الدوال مثل ‪ f‬و ‪ output‬من خلل كائنات من الصنف‬
‫‪class sample:public‬‬ ‫‪ sample‬التي تتعامل مع‪ max‬كما هو تم هنا‬
‫{‪calc‬‬
‫;‪int min‬‬
‫‪public:‬‬
‫};‪sample(){min=0‬‬
‫{)‪void f(int x,int y‬‬
‫‪if (x<y)min=x;else‬‬
‫};‪min=y‬‬
‫الدوال البناءة في الوراثة‬
‫يجب النتباه في الوراثة عند وجود الدالة البناءة في الصنف المورث ‪,‬لن التعامل مع الكائنا‬
‫ت سيختلف‬
‫نحن نعرف بشكل عام ان وجود الدالة البناءة في الصنف ممكن ان يكون على شكلين‬
‫الول ان تكون الدالة البناءة في الصنف بدون معاملت وعليه تعريف كائن من هذا الصنف‬
‫سيكون عادي اي بدون وضع قيمة ابتدائية في هذا الكائن‬
‫الثاني ان تكون الدالة البناءة في الصنف بها معاملت وعليه تعريف كائن من هذا الصنف‬
‫يجب وضع قيم ابتدائية به وعدد هذه القيم يكون بعدد المعاملت‬
‫وكذلك المر في التعامل مع الوراثة فيجب النتباه الى الصنف المورث ما هي الدالة او‬
‫الدوال البناءة به هل هي بوجود معاملت او بدون‬

‫المثال التالي يوضح وجود وراثة من غصنف اسمه الب وبه دالة بناءة لكن بدون وجود‬
‫معاملت‬
‫لحظ وجود دالة بناءة‬
‫>‪#include <iostream.h‬‬ ‫في الصنف المورث‬
‫{ ‪class father‬‬ ‫لكن بدون معاملت‬
‫‪public:‬‬ ‫وعليه كان تعريف‬
‫<< ‪father() { cout‬‬ ‫كائن من الصنف الوراث‬
‫;}};"‪"hello‬‬
‫البن تم بشكل عادي بدون‬
‫{ ‪class son : public father‬‬
‫وضع‬
‫‪public:‬‬ ‫قيم ابتدائية وبدون خطا‬
‫;}‬ ‫ستكون النتيجة هي طباعة‬
‫‪Hello‬‬
‫)(‪void main‬‬ ‫لتنسى لن تلك الدالة ا‬
‫{‬ ‫لبناءة موروثة اي اغصبحت‬
‫};‪son ahmad‬‬ ‫في القسم العام في الصنف‬
‫البن‬
‫لحظ وجود دالة بناءة‬
‫في الصنف المورث‬
‫لكن بوجود معاملت‬
‫>‪#include <iostream.h‬‬
‫وعليه كان تعريف‬
‫{ ‪class father‬‬ ‫كائن من الصنف الوارث‬
‫‪public:‬‬ ‫البن ب تم شكل عادي و‬
‫‪father(int x){ cout << endl‬‬ ‫بدون وضع‬
‫;} }; " ‪<< " I am Alive‬‬ ‫قيم ابتدائية هو خطا‬
‫{ ‪class son : public father‬‬ ‫ستكون النتيجة هي‬
‫خطا‬
‫‪public:‬‬ ‫‪::‬انتبه‬
‫;}‬ ‫ايضا لو وضعنا قيمة ابتدائية‬
‫سيكون خطا‬
‫)(‪void main‬‬ ‫لن الوضع ليس مجرد‬
‫{‬ ‫غصنف عادي‬
‫تذكر‪ ::‬هنا وراثة‬
‫;‪son ahmad‬‬ ‫ما الحل اذا في مثل هذا الوضع‬
‫};)‪son ali(5‬‬ ‫اي بوجود وراثة ودالة بناءة‬
‫بها معامل؟؟؟‬
‫هذا هو الحل لكيفية التعامل‬
‫>‪#include <iostream.h‬‬ ‫في حالة وجود غصنف‬
‫{ ‪class father‬‬ ‫مورث به دالة بناءة‬
‫‪public:‬‬ ‫بها معاملت‬
‫‪father(int x){ cout << endl‬‬
‫;} }; " )‪<< " I am Alive (int‬‬ ‫هو ان نعرف دالة بناءة‬
‫داخل الصنف الوراث‬
‫{ ‪class son : public father‬‬ ‫بهذا الشكل‬
‫‪public:‬‬ ‫ليصبح تعريف الكائن‬
‫‪son(int y): father(y) {cout‬‬ ‫غصحيح‬
‫; }};" ‪<< "Hello son‬‬ ‫‪:‬تذكر‬
‫هذا يلزم فقط في حالة‬
‫)(‪void main‬‬
‫وجود دالة بناءة بها‬
‫{‬
‫معاملت داخل الصنف المورث‬
‫};)‪son ali(5‬‬
‫ول يلزم في حالة ول يلزم في حالة‬
‫وجود دالة بناءة بدون معاملت‬
‫سؤال‬
‫اكتب برنامج بلغة ‪ ++C‬يحسب ويطبع مساحة مستطيل ومساحة مثلث‬
‫باستخدام اسلوب البرمجة الكينيونية ‪,‬عرف الغصناف المشتقة التالية‪:‬‬
‫غصنف المتسطيل ‪rec‬‬
‫غصنف المثلث ‪tri‬‬
‫بحيث تكون مشتقة من الصنف متعدد الضل ع ‪ poly‬وان نو ع الوراثة‬
‫)الشتقاق( عام وكل منهما يرث المتغيرات والدوال المنتمية للصنف ‪poly‬‬
‫وهي‪:‬‬
‫الرتفا ع ‪h‬‬
‫والعرض ‪w‬‬
‫ودالة البناء‬
#include<iostream.h> ‫لظحظ وجود دالة بناءة‬
class poly{
protected: ‫ وهي‬poly ‫في الصنف‬
int l , w;
public:
‫من الشكل التي بها معاملت‬
poly(int x,int y){l=x;w=y;}}; ‫وعليه يجب ان يتم وضع‬
class rec:public poly{
public: ‫نسخة منها في كل صنف‬
rec(int x,int y):poly(x,y){} ‫يرثها بالشكل الذي اوضحناه‬
void area(){cout<<l*w;}};
class tri:public poly{ ‫سابقا‬
public:
tri(int x,int y):poly(x,y){}
void area(){cout<<w*l/2;}};
void main(){
rec rect(2,3);
tri tr(2,4);
rect.area();
‫السؤال‬
‫هل سيعمل البرنامج في السؤال السابق لو غيرنا نو ع الوراثة الى النو ع خاص‬
‫او محمي‬
‫الجواب بالتاكيد نعم‬
‫لحظ‪:‬‬
#include<iostream.h> ‫لظحظ ان كل المتغرات‬
class poly{
protected: poly‫والدوال في الصنف‬
int l , w;
public:
‫اصبح منها نسخة الى القسم‬
poly(int x,int y){l=x;w=y;}}; rec‫الخاص في الصنف‬
class rec:private poly{
public: ‫ونسخة اخرى في القسم‬
rec(int x,int y):poly(x,y){} tri ‫الخاص في الصنف‬
void area(){cout<<l*w;}};
class tri:private poly{ ‫وعليه يجب التعامل معها‬
public:
tri(int x,int y):poly(x,y){}
‫من خلل دوال منتمية في‬
void area(){cout<<w*l/2;}}; ‫القسم العام لكل من الصنفين‬
void main(){
rec rect(2,3); ‫وهذا ما هو ظحاصل‬
tri tr(2,4);
rect.area();
‫سؤال‪:‬‬
‫تتبع هذا البرنامج التالي وانتبه الن لما حصل وانتبه الى الملحظات المكتوبة‬
‫‪:‬لحظ الفرق‬
‫>‪#include<iostream.h‬‬ ‫اجميع الدوال والمتغيرات‬
‫{‪class poly‬‬ ‫المنتمية في الصنف‪Poly‬‬
‫‪protected:‬‬ ‫اغصبحت الن في القسم‬
‫;‪int l , w‬‬ ‫الخاص في الصنف‪rect‬‬
‫‪public:‬‬ ‫وعليه التعامل معهم يتم‬
‫)(‪void set‬‬ ‫عن طريق دوال منتمية للقسم العام‬
‫به وهذا ما حصل من خلل الدالة‬
‫;}};‪{cin>>l>>w‬‬
‫‪Area‬‬
‫{‪class rec:private poly‬‬
‫لكن هذه الجملة ستكون خطا‪.‬لماذا؟‬
‫‪public:‬‬ ‫لن الدالة ‪Set‬اغصبحت في القسم‬
‫الخاص في الصنف‪rect‬‬
‫)(‪void area‬‬ ‫وعليه ليجوزالتعامل معها داخل‬
‫;}};‪{cout<<l*w‬‬ ‫الدالة الرئيسية بشكل مباشر‬
‫انما يجب ان يتم من خلل دالة منتمية في القسم‬
‫{)(‪void main‬‬ ‫العام في الصنف‪ rect‬كما حصل في الدالة ‪area‬‬
‫;‪rec rect‬‬ ‫وكما سنرى في البرنامج اللحق‬
‫;)(‪rec.set‬‬
‫;)(‪rect.area‬‬
#include<iostream.h> ‫لحظ الفرق‬:
class poly{
protected: ‫اغصبحت الجملة غصحيحة الن‬
int l , w; ‫لنه لم يتم التعامل مع‬
public:
void set() ‫مباشرة في‬Set ‫الدالة‬
{cin>>l>>w;}};
class rec:private poly{ main‫في الدالة الرئيسية‬
public: ‫انما من خلل دالة اخرى منتمية‬
void sett(){set();}
void area() ‫في القسم العام في الصنف‬
{cout<<l*w;}};
rect
void main(){
rec rect;
rect.sett();
rect.area();
‫سؤال‪:‬‬
‫اكتب برنامج بحيث تكتب دالة قالبية لحساب مستطيل ثم اكتب الدالة الرئيسية‬
‫التي تستدعي الدالة القالبية وتطبع مساحة المستطيل بحيث يتم الستدعاء‬
‫مرتين‬
‫المرة الولى تكون اغصل ع المستطيل من نو ع عدد غصحيح‬
‫والمرة الثانية تكون اضلعه من نو ع عدد حقيقي‬
‫هذه الجملة تبلغ المترجم‬
‫‪#include<iostream.‬‬ ‫ان هناك نوع لتعريف المتغيرات‬
‫>‪h‬‬
‫هذا النوع تم تسميته ‪ t‬لكن لم يحدد‬
‫>‪template <class t‬‬
‫‪void area(t length,t‬‬ ‫ما هو هذا النوع بعد‬
‫{)‪width‬‬ ‫لن ‪ x,y‬تم وضعهم هنا‬
‫انت تعلم انهم سيحلوا مكان ‪length‬‬
‫‪cout<<length*width‬‬
‫};‬
‫و ‪ width‬ولن كليهما من النوع‬
‫‪ Int‬فعليه تم تحديد هنا ان ‪ t‬تعني‬
‫)(‪void main‬‬ ‫الن نوع ‪int‬‬
‫;‪{ int x,y‬‬
‫;‪x=2;y=3‬‬
‫;‪float a,b‬‬
‫لن ‪ a,b‬تم وضعهم هنا‬
‫;‪a=2.5;b=3.5‬‬ ‫انت تعلم انهم سيحلوا مكان ‪length‬‬
‫;)‪area(x,y‬‬ ‫و ‪ width‬ولن كليهما من النوع‬
‫};)‪area(a,b‬‬ ‫‪ float‬فعليه تم تحديد هنا ان ‪ t‬تعني‬
‫الملفات‬
‫هذه بعض البرامج والمثلة على الملفات‬
‫تذكر دائما‬
‫ان تتعامل مع ملف فيجب تعريف كائن ليمث هذا الملف ويتم تعريف الكائن‬
‫اما من نو ع كتابة على الملف او للقراءة منه‬
‫وللسهولة عندما تريد ان تكتب على ملف تخيل انك تريد ان تعرض البيانات‬
‫على الشاشة‬
‫اما في حال القراءة فتخيل انك تكتب برنامج لقراءة القيم من لوحة المفاتيح‬
‫مع بعض الفروقات التي تتعلق‬
‫باستخدام الكائن المعرف بدل من جمل ‪cin ,cout‬‬
‫يجب وضع هذه الجملة‬
‫لخبار المترجم الى اننا‬
‫سوف نتعامل مع سريان او‬
‫>‪#include<iostream.h‬‬
‫تدفق بيانات من والى الملفات‬
‫>‪#include<fstream.h‬‬ ‫بالضافة الى التعامل مع سريانها‬
‫{ )(‪void main‬‬ ‫بين الشاشة ولوظحة المفاتيح‬
‫لظحظ دائما‬
‫;‪int x=10‬‬ ‫اول عملية نعملها للتعامل‬
‫;‪int y=3‬‬ ‫مع الملفات هو ان نعرف كائن‬
‫;'‪char z='a‬‬ ‫ليمثل الملف الذي سنتعامل معه‬
‫وهو هنا ‪ st‬وهو من ملف للكتابة عليه‬
‫‪ofstream‬‬ ‫مرة اخرى عندما تتعامل‬
‫‪st("d:\\student0.txt",ios‬‬ ‫مع ملف لتكتب بداخله تخيل‬
‫;)‪::app‬‬ ‫انك تتعامل مع شاشة‬
‫لكن بدل ‪cout‬‬
‫;‪st<<x<<y<<z‬‬
‫هنا اسم الكائن‬
‫اما الجملة فهي اختيارية لكن هنا تدل‬
‫}‬ ‫على اننا في كل مرة ندخل هذه المتغيرات الى الملف‬
‫فلن يحذف السابق انما تضاف اليهم اي يبقوا‬
‫موجودين‬
‫‪#include<iostream.h‬‬
‫السابق‬ ‫البرنامج‬ ‫عكس‬ ‫البرنامج‬ ‫هذا‬
‫>‬ ‫تماما فهو بدل من ان يضع قيم المتغيرات‬
‫>‪#include<fstream.h‬‬
‫{ )(‪void main‬‬ ‫منها الى الملف فهنا‬
‫يقوم بقراءتها من الملف ويضعها‬
‫;‪int x‬‬
‫;‪int y‬‬ ‫في تلك المتغيرات‬
‫;‪char z‬‬
‫وتذكر ان تتخيل عملية قراءة الملف‬
‫عملية قراءة من لوظحة المفاتيح‬
‫‪ifstream‬‬
‫‪st("d:\\student0.txt",i‬‬ ‫وهذه الجملة عادية هي ليست لها علقة‬
‫;)‪os::app‬‬
‫;‪st>>x>>y>>z‬‬ ‫بالملف انما لتظهر قيم تلك المتغيرات‬
‫};‪cout <<x<<y<<z‬‬ ‫المقروءة من الملف الى الشاشة‬
‫>‪#include<iostream.h‬‬ ‫ظحسب هذه الجملة سيبقى البرنامج‬
‫>‪#include<fstream.h‬‬
‫{)(‪void main‬‬ ‫يستقبل من المستخدم قيم وخزنها في‬
‫;‪int no‬‬ ‫تلك المتغيرات ثم يكتبها الى الملف‬
‫;]‪char name[10‬‬
‫;‪int avg‬‬ ‫الى ان يضغط المستخدم على‬
‫‪ofstream‬‬ ‫‪ctrl+z‬‬
‫;)"‪of("d:\\student.txt‬‬
‫‪cout<<"please enter‬‬
‫; "‪number\n‬‬ ‫هذه الجملة اختيارية هي للغلق‬
‫‪cout<<"please enter‬‬
‫; "‪name\n‬‬ ‫الملف بعد النتهاء‬
‫‪cout<<"please enter‬‬ ‫عليه ما يقوم به البرنامج‬
‫; "‪avg\n‬‬
‫هو استقبال قيم من المستخدم‬
‫>‪while(cin>>no>>name‬‬ ‫ويضعها في تلك المتغيرات ثم‬
‫)‪>avg‬‬
‫<‪of<<avg<<"\t"<<name‬‬
‫ينقلها الى الملف‬
‫>‪#include<iostream.h‬‬ ‫ظحسب هذه الجملة سيبقى البرنامج‬
‫>‪#include<fstream.h‬‬
‫)(‪void main‬‬ ‫يقرا من الملف قيم ويخزنها في‬
‫{‬
‫;‪int no‬‬
‫تلك المتغيرات ثم يكتبها الى الشاشة‬
‫;]‪char name[10‬‬ ‫الى ان يصل الى نهاية تلك القيم‬
‫;‪int avg‬‬

‫‪ifstream‬‬
‫;)"‪of("d:\\student.txt‬‬ ‫لظحظ ان البرنامج ظحتى في‬
‫>>‪while(of>>no>>name‬‬
‫قواعده البرمجية وجمله هو عكسي‬
‫)‪avg‬‬ ‫تمام لبرنامج الكتابة الى الملف‬
‫<"‪cout<<"\n"<<no<<"\t‬‬
‫;‪<name<<"\t"<<avg‬‬ ‫السابق‬
‫الملفات العشوائية‬
‫نحن نعرف ان الملفات العشوائية هي تختلف عن التتابعية في امكانية الوغصول‬
‫الى السجلت بطريقة مباسرة بدل المرور على كافة السجلت‪.‬‬
‫وفي لغة ‪ ++c‬ل يوجد تعريف معين او جملة تستخدمها لتحدد الى ان الملف‬
‫الذي تريد ان تتعامل معه تريده ملف مباشر‬
‫الحل لذلك هو ان تتصور انك تتعامل مع مصفوفة تراكيب وان كل خلية في‬
‫هذه المصفوفة هي سجل وانها متساوية الطول وان تعرف بالتاكيد ان عناغصر‬
‫خليا المصفوفة معنونة وعليه عندادخالك للسجلت تدخلها بطريقة تمكنك‬
‫من معرفة مواضع السجلت ‪.‬توفر لغة‪ ++c‬امكانية لذلك عن طريق استعمال‬
‫دوال جاهزة تتعامل مع الملفات الثنائية‬
‫هذه الدوال‪:‬‬
‫‪ Write‬للكتابة في الملف‬
‫‪Read‬للقراءة من الملف‬
‫‪Seekg‬لتحدد من اين تبدا القارءة‬
#include<iostream.h> ‫لظحظ الختلفات مع البرامج‬
#include<stdio.h>
#include <fstream.h> :‫السابقة‬
struct student
{char name[20];
‫هذه الجملة لتدل على ان الملف‬
char family[20]; }; ‫من النوع الثنائي‬
void main()
{int i; ‫هذه الجملة تقوم بكتابة كل عناصر‬
student studentss[6]; ‫المصفوفة اي المصفوفة باكملها‬
for(i=0;i<6;i++){
cout<<"\nenter student ‫دفعة واظحدة على الملف‬
name: ";
cin>>studentss[i]. name; ;
cout<<"enter family: ";
cin>> studentss[i].
family;}
ofstream fout;
fout.open("D:\\upp.txt",ios
#include<iostream.h> ‫هذا البرنامج هو عكس البرنامج‬
#include<stdio.h>
#include <fstream.h> ‫ فهذه الجملة تقرا‬,‫السابق تماما‬
struct student
{char name[20];
‫المصفوفة دفعة واظحدة من الملف‬
char family[20]; }; ‫وتخزنها في المصفوفة‬
void main() ‫وهنا يتم عرض عناصر‬
{int i; ‫المصفوفة‬
student studentss[6];
ifstream fout; ‫على الشاشة‬
fout.open("D:\\upp.txt",ios
::binary);
fout.read((char*)&
studentss,sizeof( students
s));
for(i=0;i<6;i++){
cout<<studentss[i]. name;
‫في البرنامجين السابقين لم نقم بتحديد اين تتم عملية الكتابفة في‬
‫الملف‬
‫بدايته ام وسطه ام‪ .....‬حيث لم نضع دالة او جملة تحدد موقع الكتابة على‬
‫الملف‬
‫وكذلك المر بالنسبة للبرنامج الثاني حيث لم نحدد من اين ستبدا عملية‬
‫القراءة‬
‫بما اننا لم نحدد اي لم نستعمل جمل ‪ seek‬التي تحدد مكان الكتابة او‬
‫القراءة‬
‫فان المترجم افترضيا ودائما سيبدا من بداية الملف‬
‫ال اذا اخبرناه بغير ذلكمن خلل جملة ‪seek‬‬
‫كما هو في البرنامجين التاليين‬
‫>‪#include<iostream.h‬‬ ‫في هذا البرنامج يختلف عن‬
‫>‪#include<stdio.h‬‬
‫>‪#include <fstream.h‬‬ ‫السابق اننا قمنا بتحديد من‬
‫‪struct student‬‬
‫;]‪{char name[20‬‬
‫اين تبدا عملية الكتابة في الملف‬
‫;} ;]‪char family[20‬‬ ‫بدل تركها افتراضيا من بدايته‬
‫)(‪void main‬‬ ‫ظحيث ان هذه الجملة تحدد‬
‫;‪{int i‬‬ ‫ان المؤشر سيبعد ‪ 3‬خطوات‬
‫;]‪student studentss[6‬‬
‫{)‪for(i=0;i<3;i++‬‬ ‫من بداية الملف ظحيث ان طول‬
‫;‪cout<<studentss[i]. name‬‬
‫;‬
‫الخطوةهي بطول خلية المصفوفة‬
‫‪cout<< studentss[i].‬‬ ‫ثم تبدا عملية الكتابة‬
‫};‪family‬‬
‫;‪ofstream fout‬‬
‫‪fout.open("D:\\upp.txt",ios‬‬
‫;)‪::binary‬‬
‫>‪#include<iostream.h‬‬ ‫هذا البرنامج عكس‬
‫>‪#include <fstream.h‬‬
‫‪struct student‬‬ ‫السابق اننا قمنا بتحديد من‬
‫;]‪{char name[20‬‬
‫;} ;]‪char family[20‬‬
‫اين تبدا عملية القراءة من الملف‬
‫بدل تركها افتراضيا من بدايته‬
‫)(‪void main‬‬
‫;‪{int i‬‬ ‫ظحيث ان هذه الجملة تحدد‬
‫;]‪student studentss[6‬‬ ‫ان المؤشر سيبعد ‪ 3‬خطوات‬
‫;‪ifstream fout‬‬
‫من بداية الملف ظحيث ان طول‬
‫‪out.open("D:\\upp.txt",ios:‬‬
‫;)‪:binary‬‬
‫الخطوةهي بطول خلية المصفوفة‬
‫ثم تبدا عملية الكتابة‬
‫‪fout.seekg(3*sizeof(stude‬‬
‫;))]‪ntss[0‬‬
‫&)*‪fout.read((char‬‬
‫‪studentss,sizeof( students‬‬
‫الوراثة والملفات‬

‫اعداد ‪ :‬أ‪.‬عصام حطاب‬

‫برمجة ‪1‬‬
‫منطقة طولكرم‬
‫الوراثة‬
‫السؤال الول‪:‬‬

‫اكتب برنامج بلغة ‪ ++C‬يحسب ويطبع الرقم الكبر بين رقمين وكذلك يحسب‬
‫و يطبع الرقم الغصغر بين رقمين باستخدام مفهوم التوارث حسب التالي‪:‬‬
‫عرف غصنف الساس باسم ‪ calc‬وعرف الدوال ‪:‬‬
‫‪f‬وظيفتها حساب الرقم الكبر بين رقمين‬
‫‪Output‬وظيفتها طباعة هذا الرقم الكبر‬
‫عرف غصنف مشتق اشتقاق عام من ذلك الصنف باسم ‪ sample‬وعرف‬
‫الدوال‪:‬‬
‫‪f‬وظيفتها حساب الرقم الغصغر بين رقمين‬
‫‪Outputt‬وظيفتها طباعة ذلك الرقم الغصغر‬
‫>‪#include<iostream.h‬‬
‫{‪class calc‬‬ ‫لحظ مايلي‪ :‬اننا عرفنا المتغير ‪ max‬في القسم الخاص حيث لم تكن حاجة‬
‫لتعريفه في القسم المحمي مع انه سوف يعطي النتيجة والسبب في ذلك اننا لم‬
‫نحتاج لتعريف دالة داخل الصنف الموروث لتتعامل مع المتغير ‪max‬‬
‫ولو قمنا بذلك لكان خطا لن هذه الدوال لن يكون لديها القدرة على رؤية‬
‫المتغير ‪ max‬لنه في القسم الخاص ول يورث ‪,‬لغصبح بحاجة ان يوضع في‬
‫;‪int max‬‬ ‫القسم المحمي لتتمكن الدوال من رؤيته فمثل‪:‬‬
‫‪public:‬‬ ‫افترض حسب هذا البرنامج اننا نريد ان ننعرف الدالة ‪ fun‬داخل الصنف‬
‫};‪calc(){max=0‬‬ ‫‪sample‬كالتالي‪/:‬‬
‫{)‪void f(int x,int y‬‬ ‫};‪Void fun(){cout<<max‬‬
‫بالتاكيد سيعطي البرنامج خطا حيث ان الدالة ‪ fun‬ل ترى المتغير ‪ max‬حيث ‪if (x>y) max=x;else‬‬
‫};‪max=y‬‬ ‫انه‬
‫)(‪void output‬‬ ‫ل يورث لنه في القسم الخاص‬
‫;}};‪{cout<<max‬‬ ‫بينما يحق لنا استدعاء الدوال مثل ‪ f‬و ‪ output‬من خلل كائنات من الصنف‬
‫‪class sample:public‬‬ ‫‪ sample‬التي تتعامل مع‪ max‬كما هو تم هنا‬
‫{‪calc‬‬
‫;‪int min‬‬
‫‪public:‬‬
‫};‪sample(){min=0‬‬
‫{)‪void f(int x,int y‬‬
‫‪if (x<y)min=x;else‬‬
‫};‪min=y‬‬
‫الدوال البناءة في الوراثة‬
‫يجب النتباه في الوراثة عند وجود الدالة البناءة في الصنف المورث ‪,‬لن التعامل مع الكائنا‬
‫ت سيختلف‬
‫نحن نعرف بشكل عام ان وجود الدالة البناءة في الصنف ممكن ان يكون على شكلين‬
‫الول ان تكون الدالة البناءة في الصنف بدون معاملت وعليه تعريف كائن من هذا الصنف‬
‫سيكون عادي اي بدون وضع قيمة ابتدائية في هذا الكائن‬
‫الثاني ان تكون الدالة البناءة في الصنف بها معاملت وعليه تعريف كائن من هذا الصنف‬
‫يجب وضع قيم ابتدائية به وعدد هذه القيم يكون بعدد المعاملت‬
‫وكذلك المر في التعامل مع الوراثة فيجب النتباه الى الصنف المورث ما هي الدالة او‬
‫الدوال البناءة به هل هي بوجود معاملت او بدون‬

‫المثال التالي يوضح وجود وراثة من غصنف اسمه الب وبه دالة بناءة لكن بدون وجود‬
‫معاملت‬
‫لحظ وجود دالة بناءة‬
‫>‪#include <iostream.h‬‬ ‫في الصنف المورث‬
‫{ ‪class father‬‬ ‫لكن بدون معاملت‬
‫‪public:‬‬ ‫وعليه كان تعريف‬
‫<< ‪father() { cout‬‬ ‫كائن من الصنف الوراث‬
‫;}};"‪"hello‬‬
‫البن تم بشكل عادي بدون‬
‫{ ‪class son : public father‬‬
‫وضع‬
‫‪public:‬‬ ‫قيم ابتدائية وبدون خطا‬
‫;}‬ ‫ستكون النتيجة هي طباعة‬
‫‪Hello‬‬
‫)(‪void main‬‬ ‫لتنسى لن تلك الدالة ا‬
‫{‬ ‫لبناءة موروثة اي اغصبحت‬
‫};‪son ahmad‬‬ ‫في القسم العام في الصنف‬
‫البن‬
‫لحظ وجود دالة بناءة‬
‫في الصنف المورث‬
‫لكن بوجود معاملت‬
‫>‪#include <iostream.h‬‬
‫وعليه كان تعريف‬
‫{ ‪class father‬‬ ‫كائن من الصنف الوارث‬
‫‪public:‬‬ ‫البن ب تم شكل عادي و‬
‫‪father(int x){ cout << endl‬‬ ‫بدون وضع‬
‫;} }; " ‪<< " I am Alive‬‬ ‫قيم ابتدائية هو خطا‬
‫{ ‪class son : public father‬‬ ‫ستكون النتيجة هي‬
‫خطا‬
‫‪public:‬‬ ‫‪::‬انتبه‬
‫;}‬ ‫ايضا لو وضعنا قيمة ابتدائية‬
‫سيكون خطا‬
‫)(‪void main‬‬ ‫لن الوضع ليس مجرد‬
‫{‬ ‫غصنف عادي‬
‫تذكر‪ ::‬هنا وراثة‬
‫;‪son ahmad‬‬ ‫ما الحل اذا في مثل هذا الوضع‬
‫};)‪son ali(5‬‬ ‫اي بوجود وراثة ودالة بناءة‬
‫بها معامل؟؟؟‬
‫هذا هو الحل لكيفية التعامل‬
‫>‪#include <iostream.h‬‬ ‫في حالة وجود غصنف‬
‫{ ‪class father‬‬ ‫مورث به دالة بناءة‬
‫‪public:‬‬ ‫بها معاملت‬
‫‪father(int x){ cout << endl‬‬
‫;} }; " )‪<< " I am Alive (int‬‬ ‫هو ان نعرف دالة بناءة‬
‫داخل الصنف الوراث‬
‫{ ‪class son : public father‬‬ ‫بهذا الشكل‬
‫‪public:‬‬ ‫ليصبح تعريف الكائن‬
‫‪son(int y): father(y) {cout‬‬ ‫غصحيح‬
‫; }};" ‪<< "Hello son‬‬ ‫‪:‬تذكر‬
‫هذا يلزم فقط في حالة‬
‫)(‪void main‬‬
‫وجود دالة بناءة بها‬
‫{‬
‫معاملت داخل الصنف المورث‬
‫};)‪son ali(5‬‬
‫ول يلزم في حالة ول يلزم في حالة‬
‫وجود دالة بناءة بدون معاملت‬
‫سؤال‬
‫اكتب برنامج بلغة ‪ ++C‬يحسب ويطبع مساحة مستطيل ومساحة مثلث‬
‫باستخدام اسلوب البرمجة الكينيونية ‪,‬عرف الغصناف المشتقة التالية‪:‬‬
‫غصنف المتسطيل ‪rec‬‬
‫غصنف المثلث ‪tri‬‬
‫بحيث تكون مشتقة من الصنف متعدد الضل ع ‪ poly‬وان نو ع الوراثة‬
‫)الشتقاق( عام وكل منهما يرث المتغيرات والدوال المنتمية للصنف ‪poly‬‬
‫وهي‪:‬‬
‫الرتفا ع ‪h‬‬
‫والعرض ‪w‬‬
‫ودالة البناء‬
#include<iostream.h> ‫لظحظ وجود دالة بناءة‬
class poly{
protected: ‫ وهي‬poly ‫في الصنف‬
int l , w;
public:
‫من الشكل التي بها معاملت‬
poly(int x,int y){l=x;w=y;}}; ‫وعليه يجب ان يتم وضع‬
class rec:public poly{
public: ‫نسخة منها في كل صنف‬
rec(int x,int y):poly(x,y){} ‫يرثها بالشكل الذي اوضحناه‬
void area(){cout<<l*w;}};
class tri:public poly{ ‫سابقا‬
public:
tri(int x,int y):poly(x,y){}
void area(){cout<<w*l/2;}};
void main(){
rec rect(2,3);
tri tr(2,4);
rect.area();
‫السؤال‬
‫هل سيعمل البرنامج في السؤال السابق لو غيرنا نو ع الوراثة الى النو ع خاص‬
‫او محمي‬
‫الجواب بالتاكيد نعم‬
‫لحظ‪:‬‬
#include<iostream.h> ‫لظحظ ان كل المتغرات‬
class poly{
protected: poly‫والدوال في الصنف‬
int l , w;
public:
‫اصبح منها نسخة الى القسم‬
poly(int x,int y){l=x;w=y;}}; rec‫الخاص في الصنف‬
class rec:private poly{
public: ‫ونسخة اخرى في القسم‬
rec(int x,int y):poly(x,y){} tri ‫الخاص في الصنف‬
void area(){cout<<l*w;}};
class tri:private poly{ ‫وعليه يجب التعامل معها‬
public:
tri(int x,int y):poly(x,y){}
‫من خلل دوال منتمية في‬
void area(){cout<<w*l/2;}}; ‫القسم العام لكل من الصنفين‬
void main(){
rec rect(2,3); ‫وهذا ما هو ظحاصل‬
tri tr(2,4);
rect.area();
‫سؤال‪:‬‬
‫تتبع هذا البرنامج التالي وانتبه الن لما حصل وانتبه الى الملحظات المكتوبة‬
‫‪:‬لحظ الفرق‬
‫>‪#include<iostream.h‬‬ ‫اجميع الدوال والمتغيرات‬
‫{‪class poly‬‬ ‫المنتمية في الصنف‪Poly‬‬
‫‪protected:‬‬ ‫اغصبحت الن في القسم‬
‫;‪int l , w‬‬ ‫الخاص في الصنف‪rect‬‬
‫‪public:‬‬ ‫وعليه التعامل معهم يتم‬
‫)(‪void set‬‬ ‫عن طريق دوال منتمية للقسم العام‬
‫به وهذا ما حصل من خلل الدالة‬
‫;}};‪{cin>>l>>w‬‬
‫‪Area‬‬
‫{‪class rec:private poly‬‬
‫لكن هذه الجملة ستكون خطا‪.‬لماذا؟‬
‫‪public:‬‬ ‫لن الدالة ‪Set‬اغصبحت في القسم‬
‫الخاص في الصنف‪rect‬‬
‫)(‪void area‬‬ ‫وعليه ليجوزالتعامل معها داخل‬
‫;}};‪{cout<<l*w‬‬ ‫الدالة الرئيسية بشكل مباشر‬
‫انما يجب ان يتم من خلل دالة منتمية في القسم‬
‫{)(‪void main‬‬ ‫العام في الصنف‪ rect‬كما حصل في الدالة ‪area‬‬
‫;‪rec rect‬‬ ‫وكما سنرى في البرنامج اللحق‬
‫;)(‪rec.set‬‬
‫;)(‪rect.area‬‬
#include<iostream.h> ‫لحظ الفرق‬:
class poly{
protected: ‫اغصبحت الجملة غصحيحة الن‬
int l , w; ‫لنه لم يتم التعامل مع‬
public:
void set() ‫مباشرة في‬Set ‫الدالة‬
{cin>>l>>w;}};
class rec:private poly{ main‫في الدالة الرئيسية‬
public: ‫انما من خلل دالة اخرى منتمية‬
void sett(){set();}
void area() ‫في القسم العام في الصنف‬
{cout<<l*w;}};
rect
void main(){
rec rect;
rect.sett();
rect.area();
‫سؤال‪:‬‬
‫اكتب برنامج بحيث تكتب دالة قالبية لحساب مستطيل ثم اكتب الدالة الرئيسية‬
‫التي تستدعي الدالة القالبية وتطبع مساحة المستطيل بحيث يتم الستدعاء‬
‫مرتين‬
‫المرة الولى تكون اغصل ع المستطيل من نو ع عدد غصحيح‬
‫والمرة الثانية تكون اضلعه من نو ع عدد حقيقي‬
‫هذه الجملة تبلغ المترجم‬
‫‪#include<iostream.‬‬ ‫ان هناك نوع لتعريف المتغيرات‬
‫>‪h‬‬
‫هذا النوع تم تسميته ‪ t‬لكن لم يحدد‬
‫>‪template <class t‬‬
‫‪void area(t length,t‬‬ ‫ما هو هذا النوع بعد‬
‫{)‪width‬‬ ‫لن ‪ x,y‬تم وضعهم هنا‬
‫انت تعلم انهم سيحلوا مكان ‪length‬‬
‫‪cout<<length*width‬‬
‫};‬
‫و ‪ width‬ولن كليهما من النوع‬
‫‪ Int‬فعليه تم تحديد هنا ان ‪ t‬تعني‬
‫)(‪void main‬‬ ‫الن نوع ‪int‬‬
‫;‪{ int x,y‬‬
‫;‪x=2;y=3‬‬
‫;‪float a,b‬‬
‫لن ‪ a,b‬تم وضعهم هنا‬
‫;‪a=2.5;b=3.5‬‬ ‫انت تعلم انهم سيحلوا مكان ‪length‬‬
‫;)‪area(x,y‬‬ ‫و ‪ width‬ولن كليهما من النوع‬
‫};)‪area(a,b‬‬ ‫‪ float‬فعليه تم تحديد هنا ان ‪ t‬تعني‬
‫الملفات‬
‫هذه بعض البرامج والمثلة على الملفات‬
‫تذكر دائما‬
‫ان تتعامل مع ملف فيجب تعريف كائن ليمث هذا الملف ويتم تعريف الكائن‬
‫اما من نو ع كتابة على الملف او للقراءة منه‬
‫وللسهولة عندما تريد ان تكتب على ملف تخيل انك تريد ان تعرض البيانات‬
‫على الشاشة‬
‫اما في حال القراءة فتخيل انك تكتب برنامج لقراءة القيم من لوحة المفاتيح‬
‫مع بعض الفروقات التي تتعلق‬
‫باستخدام الكائن المعرف بدل من جمل ‪cin ,cout‬‬
‫يجب وضع هذه الجملة‬
‫لخبار المترجم الى اننا‬
‫سوف نتعامل مع سريان او‬
‫>‪#include<iostream.h‬‬
‫تدفق بيانات من والى الملفات‬
‫>‪#include<fstream.h‬‬ ‫بالضافة الى التعامل مع سريانها‬
‫{ )(‪void main‬‬ ‫بين الشاشة ولوظحة المفاتيح‬
‫لظحظ دائما‬
‫;‪int x=10‬‬ ‫اول عملية نعملها للتعامل‬
‫;‪int y=3‬‬ ‫مع الملفات هو ان نعرف كائن‬
‫;'‪char z='a‬‬ ‫ليمثل الملف الذي سنتعامل معه‬
‫وهو هنا ‪ st‬وهو من ملف للكتابة عليه‬
‫‪ofstream‬‬ ‫مرة اخرى عندما تتعامل‬
‫‪st("d:\\student0.txt",ios‬‬ ‫مع ملف لتكتب بداخله تخيل‬
‫;)‪::app‬‬ ‫انك تتعامل مع شاشة‬
‫لكن بدل ‪cout‬‬
‫;‪st<<x<<y<<z‬‬
‫هنا اسم الكائن‬
‫اما الجملة فهي اختيارية لكن هنا تدل‬
‫}‬ ‫على اننا في كل مرة ندخل هذه المتغيرات الى الملف‬
‫فلن يحذف السابق انما تضاف اليهم اي يبقوا‬
‫موجودين‬
‫‪#include<iostream.h‬‬
‫السابق‬ ‫البرنامج‬ ‫عكس‬ ‫البرنامج‬ ‫هذا‬
‫>‬ ‫تماما فهو بدل من ان يضع قيم المتغيرات‬
‫>‪#include<fstream.h‬‬
‫{ )(‪void main‬‬ ‫منها الى الملف فهنا‬
‫يقوم بقراءتها من الملف ويضعها‬
‫;‪int x‬‬
‫;‪int y‬‬ ‫في تلك المتغيرات‬
‫;‪char z‬‬
‫وتذكر ان تتخيل عملية قراءة الملف‬
‫عملية قراءة من لوظحة المفاتيح‬
‫‪ifstream‬‬
‫‪st("d:\\student0.txt",i‬‬ ‫وهذه الجملة عادية هي ليست لها علقة‬
‫;)‪os::app‬‬
‫;‪st>>x>>y>>z‬‬ ‫بالملف انما لتظهر قيم تلك المتغيرات‬
‫};‪cout <<x<<y<<z‬‬ ‫المقروءة من الملف الى الشاشة‬
‫>‪#include<iostream.h‬‬ ‫ظحسب هذه الجملة سيبقى البرنامج‬
‫>‪#include<fstream.h‬‬
‫{)(‪void main‬‬ ‫يستقبل من المستخدم قيم وخزنها في‬
‫;‪int no‬‬ ‫تلك المتغيرات ثم يكتبها الى الملف‬
‫;]‪char name[10‬‬
‫;‪int avg‬‬ ‫الى ان يضغط المستخدم على‬
‫‪ofstream‬‬ ‫‪ctrl+z‬‬
‫;)"‪of("d:\\student.txt‬‬
‫‪cout<<"please enter‬‬
‫; "‪number\n‬‬ ‫هذه الجملة اختيارية هي للغلق‬
‫‪cout<<"please enter‬‬
‫; "‪name\n‬‬ ‫الملف بعد النتهاء‬
‫‪cout<<"please enter‬‬ ‫عليه ما يقوم به البرنامج‬
‫; "‪avg\n‬‬
‫هو استقبال قيم من المستخدم‬
‫>‪while(cin>>no>>name‬‬ ‫ويضعها في تلك المتغيرات ثم‬
‫)‪>avg‬‬
‫<‪of<<avg<<"\t"<<name‬‬
‫ينقلها الى الملف‬
‫>‪#include<iostream.h‬‬ ‫ظحسب هذه الجملة سيبقى البرنامج‬
‫>‪#include<fstream.h‬‬
‫)(‪void main‬‬ ‫يقرا من الملف قيم ويخزنها في‬
‫{‬
‫;‪int no‬‬
‫تلك المتغيرات ثم يكتبها الى الشاشة‬
‫;]‪char name[10‬‬ ‫الى ان يصل الى نهاية تلك القيم‬
‫;‪int avg‬‬

‫‪ifstream‬‬
‫;)"‪of("d:\\student.txt‬‬ ‫لظحظ ان البرنامج ظحتى في‬
‫>>‪while(of>>no>>name‬‬
‫قواعده البرمجية وجمله هو عكسي‬
‫)‪avg‬‬ ‫تمام لبرنامج الكتابة الى الملف‬
‫<"‪cout<<"\n"<<no<<"\t‬‬
‫;‪<name<<"\t"<<avg‬‬ ‫السابق‬
‫الملفات العشوائية‬
‫نحن نعرف ان الملفات العشوائية هي تختلف عن التتابعية في امكانية الوغصول‬
‫الى السجلت بطريقة مباسرة بدل المرور على كافة السجلت‪.‬‬
‫وفي لغة ‪ ++c‬ل يوجد تعريف معين او جملة تستخدمها لتحدد الى ان الملف‬
‫الذي تريد ان تتعامل معه تريده ملف مباشر‬
‫الحل لذلك هو ان تتصور انك تتعامل مع مصفوفة تراكيب وان كل خلية في‬
‫هذه المصفوفة هي سجل وانها متساوية الطول وان تعرف بالتاكيد ان عناغصر‬
‫خليا المصفوفة معنونة وعليه عندادخالك للسجلت تدخلها بطريقة تمكنك‬
‫من معرفة مواضع السجلت ‪.‬توفر لغة‪ ++c‬امكانية لذلك عن طريق استعمال‬
‫دوال جاهزة تتعامل مع الملفات الثنائية‬
‫هذه الدوال‪:‬‬
‫‪ Write‬للكتابة في الملف‬
‫‪Read‬للقراءة من الملف‬
‫‪Seekg‬لتحدد من اين تبدا القارءة‬
#include<iostream.h> ‫لظحظ الختلفات مع البرامج‬
#include<stdio.h>
#include <fstream.h> :‫السابقة‬
struct student
{char name[20];
‫هذه الجملة لتدل على ان الملف‬
char family[20]; }; ‫من النوع الثنائي‬
void main()
{int i; ‫هذه الجملة تقوم بكتابة كل عناصر‬
student studentss[6]; ‫المصفوفة اي المصفوفة باكملها‬
for(i=0;i<6;i++){
cout<<"\nenter student ‫دفعة واظحدة على الملف‬
name: ";
cin>>studentss[i]. name; ;
cout<<"enter family: ";
cin>> studentss[i].
family;}
ofstream fout;
fout.open("D:\\upp.txt",ios
#include<iostream.h> ‫هذا البرنامج هو عكس البرنامج‬
#include<stdio.h>
#include <fstream.h> ‫ فهذه الجملة تقرا‬,‫السابق تماما‬
struct student
{char name[20];
‫المصفوفة دفعة واظحدة من الملف‬
char family[20]; }; ‫وتخزنها في المصفوفة‬
void main() ‫وهنا يتم عرض عناصر‬
{int i; ‫المصفوفة‬
student studentss[6];
ifstream fout; ‫على الشاشة‬
fout.open("D:\\upp.txt",ios
::binary);
fout.read((char*)&
studentss,sizeof( students
s));
for(i=0;i<6;i++){
cout<<studentss[i]. name;
‫في البرنامجين السابقين لم نقم بتحديد اين تتم عملية الكتابفة في‬
‫الملف‬
‫بدايته ام وسطه ام‪ .....‬حيث لم نضع دالة او جملة تحدد موقع الكتابة على‬
‫الملف‬
‫وكذلك المر بالنسبة للبرنامج الثاني حيث لم نحدد من اين ستبدا عملية‬
‫القراءة‬
‫بما اننا لم نحدد اي لم نستعمل جمل ‪ seek‬التي تحدد مكان الكتابة او‬
‫القراءة‬
‫فان المترجم افترضيا ودائما سيبدا من بداية الملف‬
‫ال اذا اخبرناه بغير ذلكمن خلل جملة ‪seek‬‬
‫كما هو في البرنامجين التاليين‬
‫>‪#include<iostream.h‬‬ ‫في هذا البرنامج يختلف عن‬
‫>‪#include<stdio.h‬‬
‫>‪#include <fstream.h‬‬ ‫السابق اننا قمنا بتحديد من‬
‫‪struct student‬‬
‫;]‪{char name[20‬‬
‫اين تبدا عملية الكتابة في الملف‬
‫;} ;]‪char family[20‬‬ ‫بدل تركها افتراضيا من بدايته‬
‫)(‪void main‬‬ ‫ظحيث ان هذه الجملة تحدد‬
‫;‪{int i‬‬ ‫ان المؤشر سيبعد ‪ 3‬خطوات‬
‫;]‪student studentss[6‬‬
‫{)‪for(i=0;i<3;i++‬‬ ‫من بداية الملف ظحيث ان طول‬
‫;‪cout<<studentss[i]. name‬‬
‫;‬
‫الخطوةهي بطول خلية المصفوفة‬
‫‪cout<< studentss[i].‬‬ ‫ثم تبدا عملية الكتابة‬
‫};‪family‬‬
‫;‪ofstream fout‬‬
‫‪fout.open("D:\\upp.txt",ios‬‬
‫;)‪::binary‬‬
‫>‪#include<iostream.h‬‬ ‫هذا البرنامج عكس‬
‫>‪#include <fstream.h‬‬
‫‪struct student‬‬ ‫السابق اننا قمنا بتحديد من‬
‫;]‪{char name[20‬‬
‫;} ;]‪char family[20‬‬
‫اين تبدا عملية القراءة من الملف‬
‫بدل تركها افتراضيا من بدايته‬
‫)(‪void main‬‬
‫;‪{int i‬‬ ‫ظحيث ان هذه الجملة تحدد‬
‫;]‪student studentss[6‬‬ ‫ان المؤشر سيبعد ‪ 3‬خطوات‬
‫;‪ifstream fout‬‬
‫من بداية الملف ظحيث ان طول‬
‫‪out.open("D:\\upp.txt",ios:‬‬
‫;)‪:binary‬‬
‫الخطوةهي بطول خلية المصفوفة‬
‫ثم تبدا عملية الكتابة‬
‫‪fout.seekg(3*sizeof(stude‬‬
‫;))]‪ntss[0‬‬
‫&)*‪fout.read((char‬‬
‫‪studentss,sizeof( students‬‬
<string.h> ‫أواﻣﺮ اﻟﺴﻼﺳﻞ‬

.(‫ )ﺗﺘﻐﯿﺮ اﻷوﻟﻰ وﺗﺒﻘﻰ اﻟﺜﺎﻧﯿﺔ ﻛﻤﺎ ھﻲ‬strcat :‫ وﺻﻞ ﺳﻠﺴﻠﺘﯿﻦ‬v

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main (void)
{
char A1[60] = "eng. Safa Jaidi & ";
char A2[40] = "eng. Hani Jaidi & ";
char A3[20] = "eng. Hana Jaidi.";
strcat (A1,A3);
strcat (A2,A3);
printf ("%s\n\n%s", A1 , A2 );
getch ();

strncat :‫ وﺻﻞ ﻋﺪد ﻣﺤﺪد ﻣﻦ اﻟﺮﻣﻮز‬v

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main (void)
{
char A1[26] = "Jaidi: Safa & ";
char A2[13] = "Hani & ";
char A3[6] = "Hana.";
strncat (A1,A2,4);
strncat (A2,A3,5);
printf ("%s\n\n%s", A1 , A2 );
getch ();
}
.(‫ )ﺗﻐﻄﻲ اﻟﺜﺎﻧﯿﺔ اﻷوﻟﻰ ﺑﺸﻜﻞ ﻛﺎﻣﻞ‬strcpy :‫ ﻧﺴﺦ ﺳﻠﺴﻠﺔ‬v

#include <stdio.h>
#include <conio.h>
#include <string.h>

void main (void)


{
char A1[20] = "Jaidi: Safa.";
char A2[10] = "Hani & ";
char A3[6] = "Hana.";

strcpy (A1,A3);
strcpy (A2,A3);

printf ("%s\n\n%s", A1 , A2 );

getch ();
}

strncpy :‫ ﻧﺴﺦ ﻋﺪد ﻣﺤﺪد ﻣﻦ رﻣﻮز ﺳﻠﺴﻠﺔ‬v

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main (void)
{
char A1[20] = "Jaidi: Safa.";
char A3[20] = "Hana & hani ";
strncpy (A1,A3,6);

printf ("%s", A1 );

getch ();
}
(‫ )ﻋﺪد اﻟﺮﻣﻮز ﺑﺪون اﻟﺮﻣﺰ اﻷﺧﯿﺮ‬strlen :‫ ﻣﻌﺮﻓﺔ ﻃﻮل ﺳﻠﺴﻠﺔ‬v

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main (void)
{
char A1[] = "eng.Safa2 Jaidi";
char A2[] = "eng.Hani Jaidi";
char A3[] = "eng.Hana Jaidi";
printf ("A1= %s A1 length = %d\n\A2= %s A2 length =
%d\nA3= %s A3 length = %d",A1, strlen (A1) ,A3, strlen
(A2),A3, strlen (A3));
getch ();
}

strcmp :‫ﻣﻘﺎرﻧﺔ ﺳﻠﺴﻠﺘﯿﻦ‬

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main (void)
{
char A1[] = "eng.Safa2 Jaidi";
char A2[] = "eng.Hani Jaidi";
printf ("A1=%s", A1);
printf ("\nA2=%s\n\n", A2);

if (strcmp (A1,A2) < 0)


printf ("A1<A2");
else if (strcmp (A1,A2) == 0)
printf ("A1=A2");
else printf ("A1>A2");
getch ();
}
strstr :‫ اﻟﺒﺤﺚ ﻋﻦ ﺳﻠﺴﻠﺔ داﺧﻞ ﺳﻠﺴﻠﺔ‬v

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main (void)
{
char A1[] = "eng.Safa2 Jaidi";
char A2[] = "Jaidi";
printf ("A1=%s", A1);
printf ("\nA2=%s\n\n", A2);

printf ("strstr (A1,A2) = %s", strstr (A1,A2));

getch ();
}

:‫وإن ﻟﻢ ﯾﺠﺪھﺎ ﯾﻌﯿﺪ اﻟﺮﻣﺰ اﻟﺨﺎﻣﻞ‬

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main (void)
{
char A1[] = "eng.Safa2 Jaidi";
char A2[] = "Hana";
printf ("A1=%s", A1);
printf ("\nA2=%s\n\n", A2);

printf ("strstr (A1,A2) = %s", strstr (A1,A2));

getch ();
}
gets :‫ﻗﺮاءة ﺳﻠﺴﻠﺔ‬

#include <stdio.h>
#include <conio.h>
#include <string.h>

void main (void)


{
char employee_name[120];
Gets(employee_name);
printf("Employee: %s\n",employee_name);

getch ();
}

puts :‫ﻛﺘﺎﺑﺔ ﺳﻠﺴﻠﺔ‬

#include <stdio.h>
#include <conio.h>
#include <string.h>

void main (void)


{
char A[] = "Qalqilia";
puts (A);

getch ();
}

:‫أواﻣﺮ اﻟﺴﻼﺳﻞ‬

strcat :‫وﺻﻞ ﺳﻠﺴﻠﺘﯿﻦ‬ .1


strcpy :‫ﻧﺴﺦ ﺳﻠﺴﻠﺔ‬ .2
strlen :‫ﻣﻌﺮﻓﺔ ﻃﻮل ﺳﻠﺴﻠﺔ‬ .3
strcmp :‫ﻣﻘﺎرﻧﺔ ﺳﻠﺴﻠﺘﯿﻦ‬ .4
strstr :‫اﻟﺒﺤﺚ ﻋﻦ ﺳﻠﺴﻠﺔ داﺧﻞ ﺳﻠﺴﻠﺔ‬ .5
gets :‫ﻗﺮاءة ﺳﻠﺴﻠﺔ‬ .6
puts :‫ﻛﺘﺎﺑﺔ ﺳﻠﺴﻠﺔ‬ .7
// – ‫ الكلمات المفتاحية باللون الرزرق – الدوال باللون البرتقالي – أسماء النصناف باللون الرمادي‬: ‫ملحظات‬
‫الشرح باللون الحمر‬

#include<iostream.h>

class employee //‫نصنف موظف‬


{
public:
int number;
char name[20];
int salary;
employee(){number=0;salary=100;}; //‫بناء الصنف‬
int get_salary(){return salary;}; //(‫دالة ارحاع قيمة الراتب )دالة سطرية‬
int increase_salary(int s){salary+=s; return salary;}; // ‫دالة ارجاع قيمة الراتب بعد‬
(‫الزيادة)دالة سطرية‬
friend int salary_tax(employee z);// ‫تعريق دالة نصديقة لرجاع قيمة الراتب بعد خصم‬
‫الضريبة‬
};
int salary_tax(employee z) //‫كتابة او تحميل دالة الضريبة‬
{
return z.salary-(0.07*z.salary);
}
class department // ‫نصنف القسم‬
{
public:
int deparment_number;
employee emp[10];
department();
};
department::department()// ‫دالة بناء للقسم‬
{
for (int i=0;i<10;i++)
{
cout<<"please enter #"<<i+1<<" employee number :";
cin>>emp[i].number;
}
}
class worker:public employee // ‫نصنف من نوع عامل يتورث الصفات الموجودة في الصنف موظف‬
{
public:
int dep_number;
worker(){dep_number=25;};
};
void main()
{
department x; // ‫تعريف كائن من نوع قسم بالتالي سوف يقوم بتعريف عشر موظفين تلقائيا‬
cout<<"real salary ="<<x.emp[3].get_salary()<<endl; // ‫رسالة تظهر لنا الراتب النصلي‬
‫للموظف الرابع‬
x.emp[3].increase_salary(50); // 50 ‫دالة رزيادة قيمة راتب الموظف بمقدار‬
‫اظهار رسالة بقيمة الراتب ‪cout<<"salary after increase ="<<x.emp[3].get_salary()<<endl; //‬‬
‫بعد الزيادة‬
‫رسالة بقيمة الراتب بعد الضريبة ‪cout<<"salary after tax ="<<salary_tax(x.emp[3])<<endl;//‬‬
‫من خلل استدعاء الدالة الخانصة‬
‫تعريف كائن من نوع عامل ‪worker y; //‬‬
‫رسالة اظهار رقم القسم للعامل و هو ‪cout<<"worker dep number="<<y.dep_number<<endl; //‬‬
‫‪25‬‬
‫رسالة اظهار الراتب الساسي للعامل و ‪cout<<"worker real salary="<<y.get_salary()<<endl;//‬‬
‫هي تدخل على ان التوريث يعمل بشكل سليم‬

‫}‬
‫ﺣﺼﺮﯾﺎً‪ :‬ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ ‪www.stqou.com‬‬
‫ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ ‪ :‬ﺑﺮﻣﺠﺔ ‪1‬‬
‫ﺑﺴﻢ ﺍ‪ ‬ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬

‫‪ sizeof‬ﻟﻤﻌﺮﻓﺔ ﺳﻌﺔ أي ﻣﺘﻐﯿﺮ‪:‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪int x‬‬
‫;))‪printf ("%d",sizeof (x‬‬
‫;)( ‪getch‬‬
‫}‬

‫أو‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪char x‬‬
‫;))‪printf ("%d",sizeof (x‬‬
‫;)( ‪getch‬‬
‫}‬

‫ﻣﻼﺣﻈﺔ‪ sizeof :‬ﺗﺮﺟﻊ ﻗﯿﻤﺔ ﺻﺤﯿﺤﺔ )ﺳﻌﺔ اﻟﻤﺘﻐﯿﺮ(‬


‫ﻟﺬﻟﻚ ‪ d‬ﻻ ﺗﺘﻐﯿﺮ ﻓﻲ ﻛﻞ اﻟﺤﺎﻻت‬
‫***‬

‫اﻷﺳﻜﻲ ﻛﻮد ‪ASCII‬‬


‫اﻷﻋﺪاد اﻟﺼﺤﯿﺤﺔ اﻟﻤﻜﺎﻓﺌﺔ ﻟﻠﺮﻣﻮز‬
‫‪A = 65‬‬
‫‪Z = 90‬‬
‫‪a = 97‬‬
‫‪z = 122‬‬
‫ﻟﻄﺒﺎﻋﺔ ﺣﺮف ﺑﺎﺳﺘﺨﺪام اﻟﻌﺪد اﻟﺼﺤﯿﺢ اﻟﻤﻜﺎﻓﺊ ﻟﮫ‪:‬‬
‫اﻟﺤﺮف ‪ L‬ﯾﻜﺎﻓﺊ اﻟﻌﺪد ‪ 76‬ﻓﻨﻜﺘﺐ اﻟﻜﻮد اﻟﺘﺎﻟﻲ ﻟﻄﺒﺎﻋﺔ ﺣﺮف‪L‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪int d‬‬
‫;‪d = 76‬‬
‫;)‪printf ("%c",d‬‬
‫;)( ‪getch‬‬
‫}‬
‫ﺣﺼﺮﯾﺎً‪ :‬ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ ‪www.stqou.com‬‬
‫ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ ‪ :‬ﺑﺮﻣﺠﺔ ‪1‬‬

‫أو‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪char d‬‬
‫;‪d = 76‬‬
‫;)‪printf ("%c",d‬‬
‫;)( ‪getch‬‬
‫}‬

‫ﻣﻼﺣﻈﺔ ‪:‬إذا أردﻧﺎ اﻟﺮﻣﺰ ﻧﻌﺘﻤﺪ ‪ c‬وإذا أردﻧﺎ اﻟﻌﺪد اﻟﺼﺤﯿﺢ ﻧﻌﺘﻤﺪ ‪d‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪char d‬‬
‫;'‪d = 'L‬‬
‫;)‪printf ("%c %d",d,d‬‬
‫;)( ‪getch‬‬
‫}‬

‫اﻟﻨﺘﺎﺋﺞ‪L 76 :‬‬

‫اﻟﻔﺮق ﺑﯿﻦ اﻷﺣﺮف اﻟﻜﺒﯿﺮة واﻟﺼﻐﯿﺮة = ‪32‬‬


‫* ﻟﻠﺘﺤﻮﯾﻞ ﻣﻦ ﻛﺒﯿﺮ إﻟ ﻰ ﺻ ﻐﯿﺮ ﻧ ﻀﯿﻒ ‪ 32‬وﯾﻮﺟ ﺪ اﻗﺘ ﺮان ﺟ ﺎھﺰ ﯾﻘ ﻮم ﺑﺎﻟﺘﺤﻮﯾ ﻞ ھ ﻮ ‪، toupper‬‬
‫وﻟﻠﺘﺤﻮﯾﻞ ﻣﻦ ﺻﻐﯿﺮ إﻟﻰ ﻛﺒﯿﺮ ﻧﻄﺮح ‪ 32‬واﻗﺘﺮان ‪ tolower‬ﯾﻘﻮم ﺑﮭﺬه اﻟﻤﮭﻤﺔ‪.‬‬

‫‪A = a - 32‬‬
‫‪a = A + 32‬‬

‫وھﻜﺬا ﺑﻘﯿﺔ اﻟﺤﺮوف‪...‬‬

‫اﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎً ﺑﺎﺳﺘﺨﺪام ﺟﻤﻠﺔ اﻟﺪوران ﻟﻄﺒﺎﻋﺔ اﻷﻋ ﺪاد اﻟ ﺼﺤﯿﺤﺔ ﻣ ﻦ ‪ 122 - 65‬وﻣ ﺎ ﯾﻜﺎﻓﺆھ ﺎ ﻣ ﻦ‬
‫اﻟﺮﻣﻮز )اﻷﺳﻜﻲ ﻛﻮد(‪.‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫)‪for (int x=65;x<=122;x++‬‬
‫;)‪printf ("%d %c \n" ,x,x‬‬
‫;)( ‪getch‬‬
‫}‬
www.stqou.com ‫ ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ‬:ً‫ﺣﺼﺮﯾﺎ‬
1 ‫ ﺑﺮﻣﺠﺔ‬: ‫ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ‬

122-97 ‫ وﻣﻦ‬90-65 ‫ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺔ اﻟﺮﻣﻮز ﻣﻦ‬

#include <stdio.h>
#include <conio.h>
void main (void)
{
for (int x=65;x<=90;x++)
printf ("%d %c \n" ,x,x);
for (int x=97;x<=122;x++)
printf ("%d %c \n" ,x,x);
getch ();
}

.‫اﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎً ﯾﻘﻮم ﺑﻘﺮاءة أﺣﺮف ﻛﺒﯿﺮة وﻃﺒﺎﻋﺔ اﻷﺣﺮف اﻟﺼﻐﯿﺮة اﻟﻤﻘﺎﺑﻠﺔ ﻟﮭﺎ‬

#include <stdio.h>
#include <conio.h>
void main (void)
{
char X;
printf ("Enter the uppercase letter: \n");
L: scanf ("%c",&X);
printf ("%c\n",X+32);
goto L;
getch ();
}

x ‫ وﻃﺒﺎﻋﺔ‬x=X+32 ‫ ﺻﻐﯿﺮة ﺑﺤﺴﺐ اﻟﻤﻌﺎدﻟﺔ‬x ‫وﺑﺈﻣﻜﺎﻧﻨﺎ ﺗﻌﺮﯾﻒ‬


www.stqou.com ‫ ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ‬:ً‫ﺣﺼﺮﯾﺎ‬
1 ‫ ﺑﺮﻣﺠﺔ‬: ‫ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ‬

:‫واﺟﺒﺎت اﻟﻤﺤﺎﺿﺮة اﻟﺜﺎﻟﺜﺔ‬


‫ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬‫ﺑﺴﻢ ﺍ‬

:‫ اﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎً ﺑـ )ﺟﻤﻞ اﻟﺸﺮط اﻟﻤﺨﺘﺼﺮة( ﻟﺤﺴﺎب اﻟﺮﻗﻢ اﻷﻛﺒﺮ ﺑﯿﻦ ﺛﻼﺛﺔ أرﻗﺎم‬.1
a=2,b=3,c=5

#include <stdio.h>
#include <conio.h>
void main (void)
{
int a=2,b=3,c=5,max1,max2;

max1 = (a > b ) ? a:b;


max2 = (max1>c) ? max1:c;
printf ("%d",max2);
getch ();
}

:‫ ﯾﻜﻮن اﻟﺒﺮﻧﺎﻣﺞ ﻛﺎﻟﺘﺎﻟﻲ‬،‫وإذا أردﻧﺎ إدﺧﺎل اﻷرﻗﺎم ﻣﻦ ﻟﻮﺣﺔ اﻟﻤﻔﺎﺗﯿﺢ‬

#include <stdio.h>
#include <conio.h>

void main (void)


{
int a,b,c,max1,max2;
printf ("Enter Three numbers:\n");

scanf ("%d\n%d\n%d",&a,&b,&c);
max1 = (a > b ) ? a:b;
max2 = (max1>c) ? max1:c;

printf ("The max number between three numbers is:


%d",max2);

getch ();
}
‫ﺣﺼﺮﯾﺎً‪ :‬ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ ‪www.stqou.com‬‬
‫ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ ‪ :‬ﺑﺮﻣﺠﺔ ‪1‬‬

‫‪ .2‬اﻛﺘ ﺐ ﺑﺎﻟﻄﺮﯾﻘ ﺔ اﻟﻤﺨﺘ ﺼﺮة ﺑﺮﻧﺎﻣﺠ ﺎً ﻟﺤ ﺴﺎب ﺻ ﺎﻓﻲ راﺗ ﺐ ﻣﻮﻇ ﻒ ﺑﻌ ﺪ ﺧ ﺼﻢ‬
‫اﻟﻀﺮﯾﺒﺔ ﺑﺤﺴﺐ اﻟﺸﺮوط اﻟﺘﺎﻟﯿﺔ‪:‬‬

‫ﯾُﺨﺼﻢ ‪ %2‬ﻟﻠﺮاﺗﺐ أﻗﻞ ﻣﻦ أو ﯾﺴـﺎوي ‪1000‬‬


‫وﯾﺨﺼﻢ ‪ %3‬ﻟﻠﺮاﺗﺐ ﺑﯿﻦ اﻟـ ‪ 1000‬واﻟـ ‪2000‬‬
‫وﯾﺨﺼﻢ ‪ %4‬ﻟﻠﺮاﺗﺐ أﻛﺒﺮ ﻣﻦ أو ﯾﺴﺎوي ‪2000‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬

‫)‪void main (void‬‬


‫{‬
‫;‪float s,tax‬‬
‫;)"‪printf ("Enter your salary:\n‬‬

‫;)‪scanf ("%f",&s‬‬

‫;‪tax =(s<=1000) ? s-s*.02 : tax‬‬


‫;‪tax = (s>1000 && s<2000) ? s-s*.03 : tax‬‬
‫;‪tax = (s>=2000) ? s-s*.04 : tax‬‬

‫;)‪printf ("Net salary after tax is: %.1f",tax‬‬

‫;)(‪getch‬‬
‫}‬

‫ﻗﻤﺖُ –ﺑﺤﻤﺪ اﷲ‪ -‬ﺑﺘﻨﻔﯿﺬ اﻟﺒﺮاﻣﺞ اﻟﺜﻼﺛﺔ ﺑﻨﺠﺎح‬


‫ﻣﻼﺣﻈﺔ‪:‬‬
‫ﻋﻨ ﺪ ﺗﻌﺮﯾ ﻒ اﻟﺮاﺗ ﺐ ‪ s‬وﺻ ﺎﻓﻲ اﻟﺮاﺗ ﺐ ‪ tax‬ﻛﻤﺘﻐﯿ ﺮات ﺻ ﺤﯿﺤﺔ ‪ int‬ﻟ ﻢ ﺗﻜ ﻦ‬
‫اﻹﺟﺎﺑ ﺎت ﻛﻠﮭ ﺎ دﻗﯿﻘ ﺔ‪ ،‬وﻟﻜ ﻦ ﻋﻨ ﺪ ﺗﻌﺮﯾﻔﮭ ﺎ ﻛﻤﺘﻐﯿ ﺮات ﺣﻘﯿﻘﯿ ﺔ ‪ float‬ﻛﺎﻧ ﺖ اﻹﺟﺎﺑ ﺎت‬
‫دﻗﯿﻘ ﺔ ‪ ،%100‬وﻗ ﺪ ﺟﺮﺑ ﺖُ اﻟﺒﺮﻧ ﺎﻣﺞ ﻋﻠ ﻰ أرﻗ ﺎم ﻛﺜﯿ ﺮة ﺿ ﻤﻦ اﻟﻔﺘ ﺮات اﻟ ﺜﻼث‪.‬‬

‫ﺳﯿﺘﻢ اﻹﺿﺎﻓﺔ ﻟﻠﻤﻠﻒ وﺗﺠﺪﯾﺪ رﻓﻌﮫ ﺑﺈذن اﷲ ﺗﻌﺎﻟﻰ‬


‫ﻣﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ‬
‫‪www.stqou.com‬‬
‫اسم الطالب‪........................... :‬‬ ‫بسم ﷲ الرحمن الرحيم‬ ‫اسم المقرر‪ :‬برمجة ‪1‬‬
‫رقم الطالب‪........................... :‬‬ ‫رقم المقرر‪1291 :‬‬
‫تاريخ االمتحان‪……./......../......... :‬‬ ‫مدة االمتحان‪ :‬ساعة و نصف‬
‫جامعة القدس المفتوحة‬
‫عدد االسئلة‪ 6 :‬أسئلة‬
‫‪ --‬نظري‪--‬‬ ‫االمتحان النھائي للفصل األول "‪"1151‬‬
‫‪2016/2015‬‬
‫‪ .1‬عبىء كافة المعلومات المطلوبة عنك في دفتر االجابة وعلى ورقة االسئلة‪.‬‬ ‫عزيزي الطالب‪:‬‬
‫‪ .2‬ضع رقم السؤال ورموز االجابة الصحيحة لالسئلة الموضوعية )ان وجدت( على الجدول المخصص في دفتر االجابة‬
‫‪ .3‬ضع رقم السؤال لالسئلة المقالية واجب على دفتر االجابة‪.‬‬

‫)‪ 20‬عالمة(‬ ‫السؤال األول‪ :‬أجب بنعم أو ال على األسئلة التالية واضعا اإلجابة في الجدول رقم )‪ (1‬في دفتر اإلجابة‪.‬‬
‫‪ .1‬ال نستطيع تمرير المصفوفات باإلشارة إنما يجب أن نمررھا بوساطة عنوان أول عنصر‪.‬‬
‫‪ .2‬من الممكن أن تكون دالة ما منتمية إلى صنف ما‪ ،‬وصديقة إلى صنف آخر‪.‬‬
‫‪ .3‬إذا كان الصنف ‪ A‬صديق الصنف ‪ ، B‬و ‪ B‬صديق الصنف ‪ ، C‬فھذا يعني ضمنا أن الصنف ‪ A‬صديق للصنف ‪.C‬‬
‫‪ .4‬الجملة التالية تعبر عن مفھوم الوراثة المنفردة ;}{‪class A:public B, public C‬‬
‫‪ .5‬يتم إرسال المعامالت لدالة بناء الصنف الموروث عبر دالة بناء الصنف الوارث‪.‬‬
‫‪ .6‬يمكن دمج عمليات القراءة و الكتابة معا في أسلوب الملفات التتابعي ‪.‬‬
‫‪ .7‬يمكن انشاء كائن من صنف مجرد‪.‬‬
‫‪ .8‬تسمح لغة ‪ C++‬بإعادة تعريف العمليات دون السماح بتغيير عدد عوامل العملية‪.‬‬
‫‪ .9‬تستخدم الدالة ‪ seekp‬لتحديد الموقع المناسب لتخزين سجل في الملفات العشوائية دون ان يؤثر على السجالت األخرى‪.‬‬
‫‪ .10‬تستخدم الدالة الوھمية )‪ (virtual function‬من أجل إجبار المترجم على تحديد ھوية الدالة وقت الترجمة وليس وقت التنفيذ‪.‬‬

‫)‪ 30=15×2‬عالمة(‬ ‫السؤال الثاني‪-:‬‬


‫اختر رمز االجابه الصحيحه ومن ثم ضعھا في الجدول المخصص لذلك في دفتر االجابة‪:‬‬
‫‪ (1‬العمليات التي ال تسمح لغة ‪ C++‬بإعادة تحميلھا ھي‪:‬‬
‫د( &‬ ‫ج( ‪new‬‬ ‫ب( ‪sizeof‬‬ ‫أ( ‪delete‬‬
‫‪ (2‬الجملة ;)‪ replace(&x, &y‬تبين‪:‬‬
‫ج( أن كل من ‪ x‬و‪ y‬مؤشرات‪.‬‬ ‫أ( تمرير عناوين المتغيرات‬
‫د( أ ‪ +‬ج‬ ‫ب( تمرير قيم المتغيرات‬
‫‪ (3‬أي من الجمل التالية ال ينطبق على الكملة المفتاحية )‪:(this‬‬
‫ج( يمكن من خالله استرجاع القيم من الدوال المنتمية‪.‬‬ ‫أ( يستعمل لإلشارة إلى الكينونة المستدعاة‪.‬‬
‫د( يمكن استخدامه من داخل الدوال الصديقة‪.‬‬ ‫ب( يعتبر معامال ضمنيا للدوال المنتمية‪.‬‬
‫‪ (4‬المتغيرات المعرفة في القسم المحمي ‪ protected‬في تعريف الصنف يجعلھا قابلة للوصول و المعالجة من خالل‪.‬‬
‫ج( أ ‪ +‬ب‬ ‫أ( الدوال المنتمية لألصناف المشتقة من ھذا الصنف‪.‬‬
‫د( ال شيء مما ذكر‪.‬‬ ‫ب( الدوال المنتمية للصنف نفسه‪.‬‬
‫‪ (5‬المتغيرات والدوال المعرفة في القسم الخاص ‪ private‬من الصنف يمكن معالجتھا من داخل الدوال‪:‬‬
‫ج( المنتمية للصنف نفسه‬ ‫أ( المنتمية لألصناف المشتقة من ذلك الصنف‬
‫د( ال شيء مما ذكر‬ ‫ب( المنتمية ألي صنف‬
‫‪ (6‬تمكننا الدوال القالبية من‪:‬‬
‫ج( ال شيء مما ذكر‬ ‫أ( تعريف دالة دون تحديد نوع المعامالت‬
‫د( جميع ما ذكر‬ ‫ب( تعريف دالة يكون نوع معامالتھا محددة‪.‬‬
‫‪ (7‬في الوراثة المتعددة يمكن عمل مايلي‪:‬‬
‫ج( أ ‪ +‬ب‪.‬‬ ‫أ( الصنف الوارث يمكن أن يرث من أكثر من صنف‪.‬‬
‫د( ال يمكن عمل وراثة متعددة في لغة ‪. C++‬‬ ‫ب( الصنف الوارث يمكن أن يورث أصنافا أخرى‪.‬‬
‫‪ (8‬ترتيب تنفيذ البناء عند عمل مثيل من الصنف ‪ C‬المعرف بالجملة }{‪ public class C: public A, public B‬ھو‪:‬‬
‫د( ‪ A‬ثم ‪ B‬ثم ‪.C‬‬ ‫ج( ‪ C‬ثم ‪ B‬ثم ‪.A‬‬ ‫ب( ‪ B‬ثم ‪ A‬ثم ‪.C‬‬ ‫أ( ‪ C‬ثم ‪ A‬ثم ‪. B‬‬
‫‪ (9‬الكلمة ‪ const‬في التعريف ;‪ void foo() const‬تعني‪:‬‬
‫ج( ينتج خطأ بسبب عدم التعرف على الكلمة‬ ‫أ( تجعل المتغيرات المعرفة داخل الدالة ‪ foo‬من نوع ‪const‬‬
‫د( الكلمة ليس لھا أي تأثير على الدالة‬ ‫ب( تمنع الدالة من تعديل عناصر البيانات المعرفة في الصنف‬
‫‪ (10‬ترتيب تنفيذ الھدام عند انھاء مثيل الصنف ‪ C‬المعرف بالجملة }{‪ public class C: public A, public B‬ھو‪:‬‬
‫د( ‪ A‬ثم ‪ B‬ثم ‪.C‬‬ ‫ج( ‪ C‬ثم ‪ B‬ثم ‪.A‬‬ ‫ب( ‪ B‬ثم ‪ A‬ثم ‪.C‬‬ ‫أ( ‪ C‬ثم ‪ A‬ثم ‪. B‬‬
‫‪ (11‬يتم اختيار نمط فتح الملف ‪ ios::app‬من أجل‪:‬‬
‫ب( استبدال محتوى الملف ج( قراءة محتوى الملف د( مسح محتوى الملف‬ ‫أ( اإلضافة على محتوى الملف‬
‫‪ (12‬بإمكان المبرمج إغالق الملف بعد فتحه من خالل استخدام الدالة المنتمية‪:‬‬
‫د( ‪close‬‬ ‫ج( ‪end‬‬ ‫ب( ‪finish‬‬ ‫أ( ‪exit‬‬
‫‪ (13‬أي من ملفات الترويسة التالية يلزم تضمينه من أجل القراءة من الملفات‪:‬‬
‫د( ‪console.h‬‬ ‫ج( ‪ifstream.h‬‬ ‫ب( ‪fstream.h‬‬ ‫أ( ‪ofstream.h‬‬

‫‪1‬‬
‫‪ (14‬عند التعامل مع الملفات التتابعبة تستخدم الدالة ;)‪ seekg(n‬من أجل‪:‬‬
‫ج( البحث عن الحرف ‪ n‬داخل الملف‪.‬‬ ‫أ( وضع مؤشر بداية القراءة عند البايت رقم ‪ n‬من الملف‪.‬‬
‫د( ال شيء مما ذكر‬ ‫ب( إرجاع قيمة البايت المخزن في الموقع رقم ‪.n‬‬
‫‪ (15‬المعامالت ‪ ios::out|ios::binary‬تستخدم من اجل فتح ملف‪:‬‬
‫د( تتابعي للكتابة‬ ‫ج( تتابعي للقراءة‬ ‫ب( عشوائي للكتابة‬ ‫أ( عشوائي للقراءة‬

‫) ‪ 15‬عالمة(‬ ‫السؤال الثالث‪-:‬‬


‫ادرس المثال التالي ثم أجب عن االسئلة التي تليه‪:‬‬

‫‪class A‬‬
‫{‬
‫‪int H:‬‬
‫‪protected :‬‬
‫;‪int S‬‬
‫‪public :‬‬
‫;)‪void PUT (int‬‬
‫;)(‪void GET‬‬
‫;}‬
‫‪class B : private A‬‬
‫{‬
‫;‪int T‬‬
‫‪protected :‬‬
‫;‪int U‬‬
‫‪public :‬‬
‫;)‪void PUTDATA(int, int‬‬
‫;)(‪void GETDATA‬‬
‫;}‬
‫‪class C : public B‬‬
‫{‬
‫;‪int M‬‬
‫‪public :‬‬
‫;)(‪void DISP‬‬
‫;}‬

‫أي األصناف تعتبر صنفا أساسا )‪ (Base Class‬وأيھا مشتقة )‪(Derived Class‬؟‬ ‫‪.1‬‬
‫أذكر اسماء المتغيرات التي يمكن الوصول إليھا من الدالة )(‪.DISP‬‬ ‫‪.2‬‬
‫أذكر أسماء الدوال التي يمكن الوصول إليھا من مثيل الصنف ‪.C‬‬ ‫‪.3‬‬
‫ھل يمكن الوصول إلى الدالة )(‪ GET‬المعرفة في الصنف ‪ A‬من داخل الصنف ‪ B‬؟ لماذا؟‬ ‫‪.4‬‬
‫ھل يمكن الوصول إلى المتغير ‪ H‬من داخل الدوال المنتمية للصنف ‪ B‬؟ لماذا؟‬ ‫‪.5‬‬

‫)‪ 15‬عالمة(‬ ‫السؤال الرابع‪-:‬‬


‫الفرع االول‪ :‬أوضح كل مما يلي‪3) :‬ع×‪ 9=3‬عالمات(‬
‫‪ (1‬الوراثة المحمية ‪. Protected Inheritance‬‬
‫‪ (2‬الدوال الصديقة ‪Friend Functions‬‬
‫‪ (3‬الفرق األساسي بين الملف التتابعي والملف العشوائي من حيث كيفية الوصول للبيانات‪.‬‬

‫الفرع الثاني‪ :‬أوجد ناتج تنفيذ البرنامج التالي‪ 6) :‬عالمات(‬


‫) ‪void foo( int & a, int & b, int c‬‬
‫{‬
‫;‪a = b + c‬‬
‫;‪b = 0‬‬
‫;‪c = 0‬‬
‫}‬
‫)(‪int main‬‬
‫{‬
‫;‪int x = 0, y = 1, z = 2‬‬

‫‪2‬‬
‫;)‪foo(x, y, z‬‬
‫;"‪cout <<"X= "<< x <<endl<< "Y=" << y <<endl<< "Z= " << z<<"\n‬‬
‫;)‪foo(x, y, z‬‬
‫;<<‪cout <<"X= "<< x <<endl<< "Y=" << y <<endl<< "Z= " << z‬‬
‫}‬

‫أجب عن سؤال واحد من األسئلة التالية )السؤال الخامس أو السؤال السادس(‬


‫) ‪ 20‬عالمة(‬ ‫السؤال الخامس‪:‬‬
‫‪ (1‬اكتب برنامج لتخزين الجملة ‪ Welcome to QOU‬في ملف نصي باسم ‪ 10).final.txt‬عالمات(‬
‫‪ (2‬اكتب برنامج يعرض محتوى الملف النصي السابق على الشاشة‪ 10) .‬عالمات(‬

‫) ‪ 20‬عالمة(‬ ‫السؤال السادس‪:‬‬


‫الفرع األول‪ :‬أذكر الحاالت التي نفضل فيھا استخدام الدوال الصديقة‪ 6 ) .‬عالمات(‬
‫الفرع الثاني‪ :‬اكتب النص البرمجي الذي يحقق مايلي‪:‬‬
‫‪ .1‬جملة تعريف الدالة ‪ isEqual‬لتستقبل معاملين من نوع ‪ int‬وتعيد قيمة صح أو خطأ وأن تكون دالة صديقة‪).‬عالمتان(‬
‫‪ .2‬جملة استدعاء الدالة )‪ void switch(int*X, int* Y‬من أجل تبديل قيم المتغيران ‪ A‬و‪) .B‬عالمتان(‬
‫‪ .3‬دالة قالبية باسم ‪ GetMin‬والتي تعيد أصغر كائن من الكائنين الممررين إليھا‪ ،‬ثم استدع ھذه الدالة من الدالة الرئيسية مرة‬
‫لمقارنة عددين صحيحين‪ ،‬ومرة أخرى لتقارن عددين من نوع ‪ 10 ) .float‬عالمات (‬

‫‪ - - -‬انتھت األسئلة ‪- -‬‬

‫‪3‬‬
‫التمرير بالقيم والتمرير بالاشارة‬
‫النصناف والدوال الصديقة ‪+‬‬
: 1‫سؤال‬

:‫ما هو مخرج البرنامج التالي‬


#include<iostream.h>
void swa(int x,int y);
void main()
{
int a=10;
int b=15;
cout <<a<<b;
swa(a,b);
cout<<a<<b;}
void swa(int x,int y)
{x=22;y=33;}
‫الاجابة‪:‬‬

‫‪10151015‬‬
‫لماذا؟‬
‫تذكر تمرير المعاملت بالقيم هنا فالعمليات التي تجري على العوامل‬
‫‪ A,b‬مستقلة عن ‪x,y‬‬
‫تذكر العبارة انه يتم عمل نسخة مستقلة‬

‫‪a‬‬ ‫‪b‬‬ ‫‪x‬‬ ‫‪y‬‬


: 2‫سؤال‬

:‫ما هو مخرج البرنامج التالي‬


#include<iostream.h>
void swa(int &x,int &y);
void main()
{
int a=10;
int b=15;
cout <<a<<b;
swa(a,b);
cout<<a<<b;}
void swa(int &x,int &y)
{x=22;y=33;}
‫الاجابة‪:‬‬

‫‪10152233‬‬
‫لماذا؟‬
‫تذكر تمرير المعاملت بالاشارة هنا فالمعاملت تمرر من خلل‬
‫عناوينها فالعمليات التي تجري على العوامل‬
‫‪ A,b‬ليست مستقلة عن ‪x,y‬‬
‫تذكر العبارة انه يتم عمل نسخة متصلة بالنصل او بمعنى اخر‬
‫‪y‬‬ ‫‪x‬‬ ‫انصبح اسمين للخلية‬

‫‪b‬‬ ‫‪a‬‬
: 3‫سؤال‬

:‫ما هو مخرج البرنامج التالي‬


#include<iostream.h>
void swa(int x,int y);
void main()
{
int a=10;
int b=15;
cout <<a<<b;
swa(a,b);
cout<<a<<b;}
void swa(int x,int y)
{int t =x;x=y;y=t;}
: 4‫سؤال‬

:‫ما هو مخرج البرنامج التالي‬


#include<iostream.h>
void swa(int &x,int &y);
void main()
{
int a=10;
int b=15;
cout <<a<<b;
swa(a,b);
cout<<a<<b;}
void swa(int &x,int &y)
{int t =x;x=y;y=t;}
‫سؤال‪: 5‬‬

‫اكتب برنامجا بلغة ‪ ++C‬تعرف فيه نصنفا اسمه ‪rectangle‬‬


‫بحيث يحتوي على متغير منتمي اسمه ‪ l‬و متغير منتمي اسمه‬
‫‪w‬ودالة بناء لسناد قيم للمتغيرات ‪ l=10‬و ‪w=4‬ودالة نصديقة‬
‫اسمها ‪ area‬لحساب مساحة المستطيل‪.‬‬
‫ثم اكتب الدالة الرئيسية لنشاء كائن اسمه ‪rec‬‬
‫وقم بطباعة مساحة ذلك المستطيل‬
#include<iostream.h>
class rectangle{
int l,w;
public:
rectangle () {l =10;w=4;}
friend int area(rectangle x){return x.l
* x.w;}
};

void main ()
{
rectangle rec;
cout <<"the area is "<<area(rec);
‫لحظ مايلي بالنسبة للدالة الصديقة‪:‬‬
‫‪-‬هي مسبوقة بالكلمة ‪friend‬‬
‫‪ --‬معاملتها وهنا معامل واحد فقط هو ‪ x‬كائن من نفس الصنف التي هي نصديقة‬
‫له اي نصديقة للصنف ‪rectangle‬‬
‫‪ - -‬كيف تم التعامل مع المتغيرات المنتمية في الدالة الصديقة؟‬
‫‪ -‬لحظ ان التعامل معهم ليس مثل تعامل الدوال المنتمية معهم‬
‫‪-‬حيث تم التعامل مع المتغير ‪ l‬من خلل الكائن ‪x‬‬
‫‪-‬وكذلك التعامل مع المتغير المنتمي ‪ w‬من خلل الكائن ‪x‬‬
‫كالتالي‪x.l * x.w :‬‬
‫بينما لو كانت دالة منتمية سيكون التعامل مع تلك المتغيرات المنتمية كالتالي ‪:‬‬
‫‪L*w‬‬
‫اما بالنسبة لستدعاء الدالة الصديقة فتم مثل استدعاء دالة عادية وليست منتمية‬
‫كالتالي ‪area(rec) :‬‬
‫بينما لوكانت الدالة ‪ area‬دالة منتمية سيكون استدعاؤها كما هو مر سابقا‬
‫من خلل الكائن الذي يريد ان يستدعيها اي بالشكل التالي‪:‬‬
‫‪)(;rec.area‬‬
‫سؤال‪: 6‬‬
‫اكتب برنامجا بلغة ‪ ++C‬خاص بحجز غرف في فندق بحيث يتضمن‪:‬‬
‫انشاء نصنف باسم ‪ hotel‬يحتوي على المتغيرات المنتمية التالية‪:‬‬
‫رقم الغرفة من نوع عدد نصحيح‬
‫اسم الضيف على اشكل مصفوفة من ‪ 10‬رموز‬
‫عددايام القامة من نوع عدد نصحيح‬
‫والدوال التالية‪:‬‬
‫دالة منتمية باسم ‪ getdata‬لقراءة قيم لتلك المتغيرات من المستخدم‬
‫دالة نصديقة باسم ‪ price‬من نوع حقيقي لحساب ااجرة الغرفة حيث يتم‬
‫حساب ااجرة الغرفة ب ‪ 50‬دينار في حالة عدد ايام القامة اقل او تساوي‬
‫‪ 3‬ايام و ‪ 30‬دينار في حالة عدد ايام القامة اكثر من ‪ 3‬ايام‬
‫دالة منتمية لطباعة اجميع القيم التي تم ادخالها‬
‫استدع الدوال السابقة‬
‫وقم بطباعة تكلفة الحجز التي تراجعها الدالة الصديقة‬
#include<iostream.h>
class hotel
{int room_no; char name[10];int days;
public:
void getdata(){cout<<"enter the room number:" ;
cin>>room_no; cout<<"enter the customer name: " ;
cin>>name; cout<<"enter how many days for staying ";
cin>>days; }
friend float price (hotel &ho)
{if (ho.days<=3) return ho.days*50;
else return ho.days*30;}
void print(){cout<<"\nthe room number is: "<<room_no ;
cout<<"\nthe customer name is: "<<name;
cout<<"\nthe number of days for staying are: "<<days;}};
void main()
{
hotel htl;
htl.getdata();
htl.print();
cout<<"\nSo,the total price is: "<<price(htl);}
‫سؤال‪: 7‬‬
‫افترض ان لديك الصنفين التاليين ‪manager,employee‬‬
‫اكتب الجمل اللزمة ل‪:‬‬
‫تعريف دالة ‪ max‬كدالة نصديقة من نوع نصحيح للصنف‬
‫‪employee‬‬

‫الاجابة‪:‬‬
‫)‪;friend int max (employee x‬‬
‫رااجع الملحظات في الشريحة الثالثة تجد اننا طبقنا كيف نعرف دالة‬
‫نصديقة هنا‬
:8‫سؤال‬

:‫ما هو مخراجات البرنامجين التاليين ولماذا‬


-1
#include<iostream.h>
class rectangle
{
int l,w,result;
public:
rectangle (){result=30;l =10;w=4;}
friend void area(rectangle x){x.result=x.l * x.w;}
void print(){cout<<result;}
};

void main ()
{
rectangle rec;
area(rec);
rec.print();
}
30: ‫الجواب‬
-2
#include<iostream.h>
class rectangle
{
int l,w,result;
public:
rectangle (){result=30;l =10;w=4;}
friend void area(rectangle &x){x.result=x.l * x.w;}
void print(){cout<<result;}
};

void main ()
{
rectangle rec;
area(rec);
rec.print();
}
40: ‫الجواب‬
‫لحظ ان سبب الختلف هو ان البرنامج الول يمرر المعاملت بالقيم‬
‫في حين هذا البرنامج الثاني هو نفسه لكن واجود ااشارة & اجعلت المعاملت تمرر بالعنوان‬
‫نصنف نصديق لصنف‬

‫تتبع البرنامج التالي ونفذه واقرا الملحظات‪:‬‬


#include<iostream.h>
class table;
class product{
int price;
char name[10];
public:
product(){price=20;}
friend class table;
};
class table{
int price;char name[10];
public:
void set() {cout<<"enter the price";cin>>price; product
cout<<"enter the name";cin>>name;}
void add(){price+2;}
void print(){cout<<"the price became "<<price;}
void add(product &x) {x.price=x.price+price;}
void print(product y) {cout<<"the total price for both is
"<<y.price;}};
void main(){
product pr;
table tp;
tp.set();
tp.add();
tp.print();
tp.add(pr);
tp.print(pr);
}
‫لحظ ما يلي‪:‬‬
‫اجميع الدوال المعرفة في القسم ‪ public‬للصنف ‪ table‬بالطبع هي دوال منتمية لهذا الصنف‬
‫فيحق لها التعامل مع المتغيرات المعرفة في القسم ‪ private‬بشكل نصريح ودون وساطة‬
‫لكن‪:‬‬
‫الدوال التي هي باللون الحمر فبالاضافة الى انها منتمية للصنف ‪table ,‬ويحق لها التعامل مع متغيرات الصنف‬
‫‪ table‬بشكل نصريح ال انها هي دوال نصديقة للصنف ‪ product‬ايضا بمعنى انها تستطيع التعامل مع المتغيرات‬
‫المعرفة في القسم الخاص للصنف ‪ product‬لكن عن طريق وسيط وليس بشكل نصريح لنها ليست منتمية للصنف‬
‫‪ product‬انما هي نصديقة له‬
‫لكن لماذا هذه الدوال هي الدوال الصديقة للصنف ‪product‬‬
‫لن لحظ الجملة باللون الخضر تشير الى ان الصنف ‪ table‬هو نصديق للصنف ‪ product‬بمعنى ان دوال‬
‫الصنف‬
‫‪ Table‬هي نصديقة للصنف ‪product‬‬
‫ثانيا لن بها معاملت هي كائنات من نوع ذلك الصنف التي هي نصديقة له وهو ‪product‬‬

‫فمثل الدالة };‪void add(product &x){x.price=x.price+price‬‬


‫تتعامل مع المتغير‪ price‬المعرف في الصنف ‪ product‬عن طريق او بوساطة الكائن ‪ x‬لنها نصديقة للصنف‬
‫‪product‬‬
‫في حين انها تستطيع التعامل مع ‪ price‬بشكل نصريح وبيدون وساطة الكائن ‪ x‬مثل بالشكل ‪ ;price=3‬بصفتها‬
‫دالة منتمية للصنف ‪ table‬لذا على فرض اننا واضعنا اجملة ‪ ;price=3‬داخل اهذه لدالة الى اي من المتغيرات‬
‫تشير؟‬
‫‪ Price‬التابع للصنف ‪product‬‬
‫ام ‪ price‬التابعة للصنف ‪table‬؟؟؟؟؟‬
‫بالتاكيد الاجابة هي للصنف ‪ table‬لن التعامل كان نصريحا مع هذا المتغير وليس بوساطة كائن اي ان الدالة تعاملت‬
‫لماذا تم استدعاء الدوال الصديقة داخل ال‪ main‬بهذه الطريقة؟؟؟؟؟‬

‫;)‪tp.add(pr‬‬
‫;)‪tp.print(pr‬‬

‫نحن نعلم ان استدعاء الدالة الصديقة يتم مثل استدعاء اي دالة عادية‬
‫اخرى‪..‬انتبه مثل دالة عادية وليس منتمية اي بالطريقة‪;add(pr):‬‬
‫و)‪ ;print(pr‬لماذا لم يتم استدعاؤهم بهذه الطريقة فهم دوال نصديقة؟؟؟‬

‫الاجابة لنهم دوال منتمية ايضا وليست نصديقة فقط‪ ,‬فهم دوال منتمية للصنف‬
‫‪ table‬ونحن نعلم ان استدعاء الدوال المنتمية يتم عن طريق كائن من ذلك‬
‫الصنف لذا‪:‬‬
‫لحظ ان استدعاء هذه الدوال تم بصفتها منتمية وبصفتها نصديقة‬
‫;)‪tp.add(pr‬‬
‫;)‪tp.print(pr‬‬
‫اعادة تحميل العمليات‬
‫اول يجب النتباه والتفريق بين اعادة تحميل الدوال التي تعني تعريف نفس الدالة بنفس السم مع اختلف معاملتها عن‬
‫هذا المفهوم الجديد اعادة تحميل العمليات والذي يعني‪:‬‬
‫ان العمليات الساسية والمعرفة في لغة ‪ ++c‬على المعاملت الساسية نستطيع ان نعيد تعريفها بالطريقة التي نريد وعلى‬
‫الكائنات مثل في النصناف‬
‫; ‪ ;int x,y‬العملية)‪(+‬تعني اجمع ولو كان ‪ x‬هو كائن من نصنف وليس متغير من نوع ‪int‬‬ ‫فمثل‪x+y:‬‬
‫لكانت تلك العملية خاطئة لن عملية )‪ (+‬ليست معرفة في لفة ‪ ++c‬للكائنات ‪ .‬اعادة تحميل العملية تعني تعريف ما لم‬
‫تعرفة ‪ ++c‬بالطريقة التي نريد و على الكائنات مثل‪ .‬لحظ اننا نستطيع استخدام العملية )‪ (+‬واعادة تعريفها لتعني‬
‫عملية اجديدة مثل عملة طرح او اضرب فليس بالضرورة ان تلتزم بما تعنيه انصل‬

‫هناك بعض العمليات)الاشارات( التي ليمكن اعادة تعريفها ‪...‬رااجع الجدول في الكتاب‪..‬‬
‫لكن كيف يتم ذلك؟؟؟‬
‫يجب ان نعلم ان تعريف اي عملية يتم من خلل دالة ‪ ,‬فمثل اذار اردنا ان نعرف العملية )‪ (+‬على انها عملية لاضافة كائن‬
‫لكائن فيتم ذلك من خلل دالة تقوم بهذه المهمة لنرى المثال التالي‪:‬‬
#include<iostream.h>
class student{
int no,mark;
public:
void set(){cin>>no>>mark;}
void add(student x){
no=no+x.no;
mark=mark+x.mark;}
void print(){cout<<no<<mark;}};
void main() {
student st,c;
st.set();
c.set();
st.add(c);
st.print();}
‫الدالة ‪ )(void set‬هي دالة منتمية تقوم بادخال قيم متغيرين لي كائن يستدعيها‬
‫الدالة ‪ void add(student x) i‬هي دالة منتمية ايضا ‪...‬انتبه ليست نصديقة فواجود معامل ‪ x‬من نوع نفس‬
‫الصنف التي هي معرفة في داخله ل يعني اناها نصديقة فههو من نفس الصنف وليس من نصنف اخر وايضا ليست مسبوقة‬
‫بكلمة ‪friend‬‬
‫ل حظ ما تقوم به الدالة هذه‬
‫اي كائن يواضع داخل القوس لهذه الدالة سيتم ااضافة قيمة متغيره ‪ no‬الى قيمة المتغير ‪ no‬المتعلق بالكائن المستدعي‬

‫مثل )‪ ;bb.add(w‬تعني ان لدينا كائنين الول هو ‪ bb‬والثاني ‪w‬‬


‫من هو الكائن المستدعي لهذه الدالة؟؟؟ الجواب هو ‪ bb‬لنه قبل النقطة وماذا عن الكائن ‪w‬‬
‫الكائن ‪ w‬هومحل الكائن ‪ x‬وعليه المتغير ‪ no‬المتعلق بالكائن ‪ x‬اي ‪ ww‬يختلف عن المتغير ‪ no‬المتعلق بالكائن‬
‫‪bb‬‬
‫حيث ان ‪ no‬للكائن ‪ w‬هي تلك ‪ w.no‬في حين ان ‪ no‬المتعلقة بالكائن ‪ bb‬هي تلك ‪ no‬الصريحة‬
‫كالتالي‪:‬‬

‫}‪bb.add(w) {no=no+w.no‬‬
‫ولو كان المر )‪ w.add(bb‬فان }‪{no=no+bb.no‬‬

‫لنعود للبرنامج لحظ ان ‪;st.add(c) :‬تقوم بااضافة الكائن ‪ c‬للكائن ‪st‬‬


‫سيكون الواضع‪ st.+(c) :‬وهي‬ ‫الن تخيل لو بدلنا السم ‪ add‬بالسم ‪+‬‬
‫وعليه نستطيع ان نكتب البرنامج بطريقة اخرى وهي‬
#include<iostream.h>
class student{
int no,mark;
public:
void set(){cin>>no>>mark;}
void operator +(student x){
no=no+x.no;
mark=mark+x.mark;}
void print(){cout<<no<<mark;}};
void main() {
student st,c;
st.set();
c.set();
st+c;
st.+(c) ‫تخيلها‬
st.print();}
‫ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬‫ﺑﺴﻢ ﺍ‬

‫ﺣﻞ ﺳﺆﺍﻝ ﺣﻠﻘﺔ ﺍﻟﻨﻘﺎﺵ‬


١ ‫ﺨﺎﺹ ﺒﻤﺎﺩﺓ ﺒﺭﻤﺠﺔ‬

#include <iostream.h>
#include <conio.h>

class account
{
float balance;
char name[20];
public:
account(){balance=1000;strcpy(name,"Safa2 Jaidi");}
float retb(){return balance;}
char* retn(){return name;}
float deposite();
float withdraw();
};

float account::deposite()
{
float x;
cout << "How much of the money deposited in the bank? ";
cin >> x;
balance=balance+x;
return balance;
}

float account::withdraw()
{
float y;
cout << "How much of the money withdrawn from the bank? ";
cin >> y;
balance=balance-y;
return balance;
}

void main()
{
account op;
op.deposite();
op.withdraw();

cout << "\nName: " << op.retn();


cout << "\nbalance= " << op.retb();

getch();
}
‫‪ t‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬

‫ﻧﺺ اﻟﺴﺆال‪:‬‬

‫ﻋﺰﻳﺰي اﻟﺪارس\ة‪:‬‬

‫ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﺤﺘﻮي ﻋﻠﻰ ﺻﻨﻒ اﺳﻤﻪ )‪ (account‬ﻳﻤﺜـﻞ ﺣـﺴﺎب ﺑﻨﻜـﻲ ﻷﺣـﺪ اﻟﺰﺑـﺎﺋﻦ وﺑـﻪ اﻟﻤﺘﻐﯿـﺮات‬
‫واﻟﺪوال اﻟﻤﻨﺘﻤﯿﺔ اﻟﺘﺎﻟﻲ‪:‬‬

‫اﻟﻘﺴﻢ اﻟﺨﺎص‪:‬‬

‫‪ -‬ﻣﺘﻐﯿﺮ ﻣﻦ ﻧﻮع ﻋﺪد ﺣﻘﯿﻘﻲ اﺳﻤﻪ اﻟﺮﺻﯿﺪ )‪.(balance‬‬

‫‪ -‬اﺳﻢ اﻟﺰﺑﻮن ﻣﺼﻔﻮﻓﺔ ﻃﻮﻟﮫﺎ ‪.٣٠‬‬

‫اﻟﻘﺴﻢ اﻟﻌﺎم‪:‬‬

‫‪ -‬داﻟﺔ ﺑﻨﺎء ﻟﺘﮫﯿﺌﺔ اﻟﻤﺘﻐﯿﺮات اﻟﺴﺎﺑﻘﺔ‪.‬‬

‫‪ -‬داﻟﺔ ﻹرﺟﺎع ﻗﯿﻤﺔ اﻟﺮﺻﯿﺪ اﻟﺤﺎﻟﻲ‪.‬‬

‫‪ -‬داﻟﺔ إرﺟﺎع اﺳﻢ ﺻﺎﺣﺐ اﻟﺤﺴﺎب‪.‬‬

‫‪ -‬داﻟﺔ ﻹﺟﺮاء ﻋﻤﻠﯿﺔ إﻳﺪاع ﻋﻠﻰ اﻟﺮﺻﯿﺪ )‪ (deposite‬ﻟﻘﺮاءة ﻗﯿﻤﺔ ﻣﺒﻠﻎ ﻣﻌﯿﻦ وﺗﻌﺪﻳﻞ ﻗﯿﻤﺔ اﻟﺮﺻﯿﺪ‪.‬‬

‫‪ -‬داﻟﺔ ﻹﺟﺮاء ﻋﻤﻠﯿﺔ ﺳﺤﺐ ﻣﻦ اﻟﺮﺻﯿﺪ )‪ (withdraw‬ﻟﺘﻌﺪﻳﻞ ﻗﯿﻤـﺔ اﻟﺮﺻـﯿﺪ ﺣـﺴﺐ اﻟﻘﯿﻤـﺔ اﻟﻤﻘـﺮوءة اﻟﻤـﺮاد‬
‫ﺳﺤﺒﮫﺎ ﻣﻦ اﻟﺮﺻﯿﺪ‪.‬‬

‫أﻛﺘﺐ اﻟﺪاﻟﺔ اﻟﺮﺋﯿﺴﯿﺔ ﺛﻢ ﻋﺮف ﻛﯿﺎن ﻣﻦ اﻟﺼﻨﻒ ‪ account‬ﺛﻢ اﺳﺘﺪﻋﻲ داﻟﺔ اﻹﻳﺪاع وداﻟﺔ اﻟﺴﺤﺐ ﺛـﻢ اﻃﺒـﻊ‬
‫اﺳﻢ ﺻﺎﺣﺐ اﻟﺤﺴﺎب وﻗﯿﻤﺔ اﻟﺮﺻﯿﺪ‪.‬‬
‫ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬‫ﺑﺴﻢ ﺍ‬

:‫ اﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎً ﺑـ )ﺟﻤﻞ اﻟﺸﺮط اﻟﻤﺨﺘﺼﺮة( ﻟﺤﺴﺎب اﻟﺮﻗﻢ اﻷﻛﺒﺮ ﺑﯿﻦ ﺛﻼﺛﺔ أرﻗﺎم‬.1
a=2,b=3,c=5

#include <stdio.h>
#include <conio.h>

void main (void)


{
int a=2,b=3,c=5,max1,max2;
max1 = (a > b ) ? a:b;
max2 = (max1>c) ? max1:c;
printf ("%d",max2);
getch ();
}

:‫ ﯾﻜﻮن اﻟﺒﺮﻧﺎﻣﺞ ﻛﺎﻟﺘﺎﻟﻲ‬،‫وإذا أردﻧﺎ إدﺧﺎل اﻷرﻗﺎم ﻣﻦ ﻟﻮﺣﺔ اﻟﻤﻔﺎﺗﯿﺢ‬

#include <stdio.h>
#include <conio.h>

void main (void)


{
int a,b,c,max1,max2;
printf ("Enter Three numbers:\n");

scanf ("%d\n%d\n%d",&a,&b,&c);
max1 = (a > b ) ? a:b;
max2 = (max1>c) ? max1:c;

printf ("The max number between three numbers is: %d",max2);

getch ();
}
‫‪ .2‬اﻛﺘ ﺐ ﺑﺎﻟﻄﺮﯾﻘ ﺔ اﻟﻤﺨﺘ ﺼﺮة ﺑﺮﻧﺎﻣﺠ ﺎً ﻟﺤ ﺴﺎب ﺻ ﺎﻓﻲ راﺗ ﺐ ﻣﻮﻇ ﻒ ﺑﻌ ﺪ ﺧ ﺼﻢ‬
‫اﻟﻀﺮﯾﺒﺔ ﺑﺤﺴﺐ اﻟﺸﺮوط اﻟﺘﺎﻟﯿﺔ‪:‬‬

‫ﯾُﺨﺼﻢ ‪ %2‬ﻟﻠﺮاﺗﺐ أﻗﻞ ﻣﻦ أو ﯾﺴـﺎوي ‪1000‬‬


‫وﯾﺨﺼﻢ ‪ %3‬ﻟﻠﺮاﺗﺐ ﺑﯿﻦ اﻟـ ‪ 1000‬واﻟـ ‪2000‬‬
‫وﯾﺨﺼﻢ ‪ %4‬ﻟﻠﺮاﺗﺐ أﻛﺒﺮ ﻣﻦ أو ﯾﺴﺎوي ‪2000‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬

‫)‪void main (void‬‬


‫{‬
‫;‪float s,tax‬‬
‫;)"‪printf ("Enter your salary:\n‬‬

‫;)‪scanf ("%f",&s‬‬

‫;‪tax =(s<=1000) ? s-s*.02 : tax‬‬


‫;‪tax = (s>1000 && s<2000) ? s-s*.03 : tax‬‬
‫;‪tax = (s>=2000) ? s-s*.04 : tax‬‬

‫;)‪printf ("Net salary after tax is: %.1f",tax‬‬

‫;)(‪getch‬‬
‫}‬

‫ﻗﻤﺖُ –ﺑﺤﻤﺪ اﷲ‪ -‬ﺑﺘﻨﻔﯿﺬ اﻟﺒﺮاﻣﺞ اﻟﺜﻼﺛﺔ ﺑﻨﺠﺎح‬

‫ﻣﻼﺣﻈﺔ‪ :‬ﻋﻨﺪ ﺗﻌﺮﯾﻒ اﻟﺮاﺗﺐ ‪ s‬وﺻﺎﻓﻲ اﻟﺮاﺗﺐ ‪ tax‬ﻛﻤﺘﻐﯿﺮات ﺻﺤﯿﺤﺔ ‪ int‬ﻟ ﻢ ﺗﻜ ﻦ‬


‫اﻹﺟﺎﺑ ﺎت ﻛﻠﮭ ﺎ دﻗﯿﻘ ﺔ‪ ،‬وﻟﻜ ﻦ ﻋﻨ ﺪ ﺗﻌﺮﯾﻔﮭ ﺎ ﻛﻤﺘﻐﯿ ﺮات ﺣﻘﯿﻘﯿ ﺔ ‪ float‬ﻛﺎﻧ ﺖ اﻹﺟﺎﺑ ﺎت‬
‫دﻗﯿﻘ ﺔ ‪ ،%100‬وﻗ ﺪ ﺟﺮﺑ ﺖُ اﻟﺒﺮﻧ ﺎﻣﺞ ﻋﻠ ﻰ أرﻗ ﺎم ﻛﺜﯿ ﺮة ﺿ ﻤﻦ اﻟﻔﺘ ﺮات اﻟ ﺜﻼث‪.‬‬

‫وﺟﺰاﻛﻢ اﷲ ﻋﻨﺎ ﻛﻞ ﺧﯿﺮ‪.‬‬


‫ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ‬
‫ﻛﻠﻳﺔ ﻟﺗﻛﻧوﻟوﺟﻳﺎ واﻟﻌﻠوم اﻟﺗطﺑﻳﻘﻳﺔ‬

‫اﻟدﻟﻳﻝ اﻟﻌﻣﻠﻲ ﻟﻣﻘرر‬


‫ﺑرﻣﺟﺔ )‪ (1‬رﻗم ‪1291‬‬

‫إﻋداد‬
‫أ‪ .‬ﻋﻳﺳﻰ أﺳﻌد‬ ‫د‪ .‬ﻳوﺳف اﺑو زر‬

‫‪2013‬‬
‫اﻟﻣﺣﺗوﻳﺎت‬
‫‪.1‬ااﻟﻣﺧﺗﺑر اﻟﻌﻣﻠﻲ اﻻوﻝ‪ :‬اﻟﺗراﻛﻳب واﻷﺻﻧﺎف‬
‫اﻟﺗراﻛﻳب ‪ :‬اﻟﺷﺧص ‪Person‬‬ ‫‪‬‬
‫اﻟﺗراﻛﻳب ‪ :‬اﻟﻧﻘطﺔ ‪Point‬‬ ‫‪‬‬
‫اﻟﺻﻧف ‪ :‬اﻟﻧﻘطﺔ ‪Point‬‬ ‫‪‬‬
‫اﻟﺑﻧﺎء ‪Constructor‬‬ ‫‪‬‬
‫‪ -2‬اﻟﻣﺧﺗﺑر اﻟﺛﺎﻧﻲ اﻟﻣﺻﻔوﻓﺎت واﻻﺻﻧﺎف ‪Arrays and Classes‬‬
‫اﻟﻣؤﺷرات و ﻣﺻﻔوﻓﺔ ﻣن اﻟﻛﺎﺋﻧﺎت‬ ‫‪‬‬
‫اﻟﻘواﺋم اﻟﻣﺗﺻﻠﺔ‬ ‫‪‬‬
‫‪ -3‬اﻟﻣﺧﺗﺑر اﻟﺛﺎﻟث اﻟدواﻝ واﻷﺻﻧﺎف اﻟﺻدﻳﻘﺔ‪Friend Functions and Operators‬‬
‫اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻟﺗﻣرﻳر اﻟﻌواﻣﻝ‬ ‫‪‬‬
‫اﻟدواﻝ اﻟﺻدﻳﻘﺔ ‪Friend Functions‬‬ ‫‪‬‬
‫اﻷﺻﻧﺎف اﻟﺻدﻳﻘﺔ‬ ‫‪‬‬
‫‪ -4‬اﻟﻣﺧﺗﺑر اﻟراﺑﻊ اﻷﺻﻧﺎف اﻟﻣﺷﺗﻘﺔ واﻟﻘواﻟب‪Derived Classes and Templates‬‬
‫اﻟوراﺛﺔ اﻟﻣﻧﻔردة ‪Single Inheritance‬‬ ‫‪‬‬
‫اﻟوراﺛﺔ اﻟﻣﺗﻌددة ‪Multiple Inheritance‬‬ ‫‪‬‬
‫ﺗﻌدد اﻻوﺟﻪ ‪Polymorphism‬‬ ‫‪‬‬
‫اﻟﻘواﻟب ‪Templates‬‬ ‫‪‬‬
‫‪ -5‬اﻟﻣﺧﺗﺑر اﻟﺧﺎﻣس ﻣﻌﺎﻟﺟﺔ اﻟﻣﻠﻔﺎت ﺑﻠﻐﺔ ‪File Processing with C++ C++‬‬

‫‪-6‬اﻟﻣﻼﺣق ﻣﺗرﺟﻣﺎت ﻟﻐﺔ‪C++‬‬


‫‪ ‬إعداد بيئة تطوير ضمن برنامج ‪Code::Blocks‬‬
‫‪ -‬مقدمة‬
‫‪ -‬إعداد بيئة تطوير ضمن برنامج ‪.Code::Blocks‬‬
‫‪ -‬تحميل برنامج ‪.Code::Blocks‬‬
‫‪ -‬تنصيب برنامج ‪ Code::Blocks‬على الحاسوب‪.‬‬
‫‪ -‬شرح واجھة التطبيق‬
‫‪ -‬تشغيل برنامج ‪ Code::Blocks‬من خالل إنشاء مشروع جديد و تطبيق مثال بسيط‬

‫‪ ‬إعداد بيئة تطوير ضمن برنامج ‪.Visual C++‬‬


‫اﻟﻮﺣﺪة اﻟﺜﺎﻧﻴﺔ‬
‫التراكيب واألصناف‬
‫‪Structures and Classes‬‬
‫ﻓﻲ ﻫذا اﻟﻣﺧﺗﺑر ‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺳ ـ ـﻳﻌرض ﻋﺿـ ــو ﻫﻳﺋﺔ اﻟﺗدرﻳس ﻓﻲ ﻓرع اﻟﺟﺎﻣﻌﺔ ﺑﻌض اﻟﺗدرﻳﺑﺎت‬
‫اﻟﻌﻣﻠﻳﺔ ﻟﻣﻔﻬوﻣﻳن ﻣﻬﻣﻳن وﻫﻣﺎ اﻟﺗراﻛﻳب واﻷﺻ ــﻧﺎف‪ .‬ﺗﻘﺎﺑﻝ اﻟﺗراﻛﻳب ‪ Structures‬اﻟﺳ ــﺟﻼت ‪Records‬‬
‫ﻓﻬﻲ اﻟﻔﻛرة اﻟرﺋﻳﺳ ـ ـ ـ ـ ـ ــﺔ ﻓﻲ ﻟﻐﺎت اﻟﺑرﻣﺟﺔ اﻟﻛﻳﻧوﻧﻳﺔ‬ ‫ﻓﻲ ﻟﻐﺎت ﺑرﻣﺟﺔ أﺧرى‪ .‬أﻣﺎ اﻷﺻ ـ ـ ـ ـ ـ ــﻧﺎف ‪Classes‬‬
‫‪ Object Oriented Languages‬وﻫﻲ ﺟزء ﻣن ﻟﻐﺔ ‪ C++‬وﻟﻳﺳت ﺟزءا ﻣن ﻟﻐﺔ ‪ C‬اﻷﺻﻠﻳﺔ‪.‬‬
‫ﻛﻣـﺎ ﺳـ ـ ـ ـ ـ ـ ـﻳﻌرض ﺑراﻣﺞ ﺑﻠﻐــﺔ ‪ C++‬ﺗﻧـﺎﻗش ﻣﻔــﺎﻫﻳم رﺋﻳﺳ ـ ـ ـ ـ ـ ــﺔ أﺧرى ﻓﻲ ﻟﻐـﺎت اﻟﺑرﻣﺟـﺔ اﻟﻛﻳﻧوﻧﻳـﺔ‪ ،‬ﻣﺛــﻝ‬
‫اﻟﻛــﺎﺋﻧــﺎت واﻟﻣﺗﻐﻳرات واﻟــدواﻝ اﻟﻣﻧﺗﻣﻳــﺔ وﻛﻳﻔﻳــﺔ ﺗﻌرﻳﻔﻬــﺎ واﺳ ـ ـ ـ ـ ـ ــﺗﺧــداﻣﻬــﺎ ﻓﻲ ﻟﻐــﺔ ‪ .C++‬وﺗﻌﺗﺑر ﻫــذﻩ اﻟﻣﻔــﺎﻫﻳم‬
‫أﺳـ ـ ـ ـ ــﺎﺳـ ـ ـ ـ ــﻳﺔ ﻟﻔﻬم ﺑﻘﻳﺔ اﻟﺗدرﻳﺑﺎت ﻓﻲ ﻫذا اﻟﻣﻘرر‪ ،‬ﻟذا ﻧرﺟو ﻣﻧك‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬اﻟﺗﺄﻛد ﻣن ﺗﻧﻔﻳذ وﻓﻬم ﻫذﻩ‬
‫اﻟﺑرﻣﺟﻳﺎت ﻓﻲ اﻟﻣﺧﺗﺑر ﺑﺈﺷـ ـ ـراف ﻋﺿ ـ ــو ﻫﻳﺋﺔ اﻟﺗدرﻳس ﻗﺑﻝ اﻻﻧﺗﻘﺎﻝ إﻟﻰ ﺑﻘﻳﺔ اﻟوﺣدات‪ .‬وﻗد ﺗم ﺗزوﻳدك ﻓﻲ‬
‫ﺗـدرﻳﺑـﺎت ﻫـذﻩ اﻟوﺣـدة ﺑـﺎﻟﻌـدﻳـد ﻣن اﻷﻣﺛﻠـﺔ واﻟﺗﻣـﺎرﻳن اﻟﺗﻲ ﻧرﺟو ﻣﻧـك إﻋطﺎءﻫﺎ اﻟوﻗت واﻟﺟﻬد اﻟﻼزﻣﻳن ﻟﺣﻠﻬﺎ‬
‫وﺗﻧﻔﻳــذﻫــﺎ‪ .‬ﺗــذﻛر‪ ،‬ﻋزﻳزي اﻟطــﺎﻟــب‪ ،‬أن أﺟوﺑــﺔ ﻫــذﻩ اﻟﺗﻣــﺎرﻳن ﻣوﺟودة ﻓﻲ ﻧﻬــﺎﻳــﺔ ﻫــذﻩ اﻟوﺣــدة‪ ،‬وﻟﻛن وﺣﺗﻰ‬
‫ﺗﺗﺣﻘق اﻟﻔــﺎﺋــدة اﻟﻘﺻ ـ ـ ـ ـ ـ ــوى ﻋﻠﻳــك‪ ،‬ﻋزﻳزي اﻟطــﺎﻟــب ‪ ،‬أن ﺗﺣــﺎوﻝ ﺑﻛــﻝ ﺟــد ﺣــﻝ ﻫــذﻩ اﻟﺗﻣــﺎرﻳن وﺗﻧﻔﻳــذﻫــﺎ ﻋﻠﻰ‬
‫اﻟﺣﺎﺳوب ﻗﺑﻝ اﻟﻧظر إﻟﻰ اﻟﺣﻝ‪.‬‬

‫أﻫداف اﻟﺗدرﻳﺑﺎت‬
‫ﻳﻧﺗظر ﻣﻧك‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺑﻌد ﻓراﻏك ﻣن ﺗﻧﻔﻳذ ﻫذﻩ اﻟﺗدرﻳﺑﺎت أن ﺗﻛون ﻗﺎد ار ﻋﻠﻰ أن‪:‬‬
‫‪ .1‬ﺗﻌرﻳف واﺳﺗﺧدام اﻟﺗراﻛﻳب ‪.structures‬‬
‫‪ .2‬اﺳﺗﺧدام ﻣﺻﻔوﻓﺎت ﻣن اﻟﺗراﻛﻳب ‪.arrays of structures‬‬
‫‪ .3‬ﺗﻌرﻳف واﺳﺗﺧدام اﻷﺻﻧﺎف ‪.classes‬‬
‫‪ .4‬اﻟﺗﻣﻳﻳز ﺑﻳن اﻟﺗراﻛﻳب واﻷﺻﻧﺎف‪.‬‬
‫‪ .5‬إﻧﺷﺎء اﻟﻛﺎﺋﻧﺎت واﺳﺗﺧداﻣﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ‪.‬‬
‫‪ .6‬ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﻣﻧﺗﻣﻳﺔ واﺳﺗدﻋﺎﺋﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ‪.‬‬
‫‪ .7‬ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﺳطرﻳﺔ ‪.‬‬
‫‪ .8‬ﺗﺣﻣﻳﻝ اﻟدواﻝ أﻛﺛر ﻣن ﺗﻌرﻳف واﺣد‪.‬‬
‫‪ .9‬إدﺧﺎﻝ اﻟﺑﻳﺎﻧﺎت ٕواﺧراﺟﻬﺎ ﺑوﺳﺎطﺔ ‪ cin‬و ‪.cout‬‬

‫اﻟﺗدرﻳب رﻗم )‪(1‬‬


‫ﻋرف ﺗرﻛﻳب ﻳﺻف اﻟﺷﺧص ‪ Person‬ﻳﺗﻛون ﻣن اﻟﺣﻘوﻝ اﻟﺗﺎﻟﻳﺔ‪ name :‬اﻻﺳم ‪ age ،‬اﻟﻌﻣر ‪gender ،‬‬
‫اﻟﺟﻧس‪ ،‬واﻛﺗب اﻟﺑرﻧﺎﻣﺞ اﻟرﺋﻳﺳﻲ اﻟذي ﻳﻌرف ﻣﺗﻐﻳر ﻣن اﻟﻧوع ﺷﺧص وﻳﻘوم ﺑﺈﺳﻧﺎد ﻗﻳم ﻟﻠﻣﺗﻐﻳرات وطﺑﺎﻋﺔ‬
‫اﻟﻧﺗﺎﺋﺞ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫>‪#include <iostream‬‬
‫>‪#include <string‬‬
‫{‪struct Person‬‬
‫;‪string name‬‬
‫;‪int age‬‬
‫;‪char gender‬‬
‫;}‬
‫{)(‪int main‬‬
‫;‪Person p‬‬
‫;"‪p.name = "Christopher‬‬
‫;‪p.age = 34‬‬
‫;'‪p.gender = 'M‬‬
‫;‪cout << "Name: " << p.name << endl‬‬
‫;‪cout << "Age: " << p.age << endl‬‬
‫;‪cout << "Gender: " << p.gender << endl‬‬
‫;‪return 0‬‬
‫}‬
‫اﻟﺗدرﻳب رﻗم )‪(2‬‬
‫ﻋرف ﺗرﻛﻳب ﻳﺻف اﻟﻧﻘطﺔ ‪ Point‬ﺗﺗﻛون إﺣداﺛﻳﺎت ‪ x‬و ‪ ،y‬واﻛﺗب اﻟﺑرﻧﺎﻣﺞ اﻟرﺋﻳﺳﻲ اﻟذي ﻳﻌرف ﻣﺗﻐﻳر‬
‫ﻣؤﺷري ﻣن اﻟﻧوع ﻧﻘطﺔ وﻳﻘوم ﺑﺈﺳﻧﺎد ﻗﻳم ﻟﻠﻣﺗﻐﻳرات وطﺑﺎﻋﺔ اﻟﻧﺗﺎﺋﺞ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫>‪include <iostream‬‬
‫{‪struct Point‬‬
‫;‪int x‬‬
‫;‪int y‬‬
‫;}‬
‫{)(‪int main‬‬
‫;‪Point* p = new Point‬‬
‫;‪p->x = 9‬‬
‫;‪p->y = 4‬‬
‫;‪cout << p->x << " " << p->y << endl‬‬
‫;‪return 0‬‬
‫}‬

‫اﺳﺋﻠﺔ ﻟﻠﺣﻝ ﻋﻠﻰ اﻟﺣﺎﺳوب )‪(1‬‬


‫‪‬‬
‫ﻋزﻳزي اﻟطـﺎﻟـب اﻋـد ﻛﺗـﺎﺑﺔ اﻟﺗدرﻳب اﻟﺳ ـ ـ ـ ـ ـ ــﺎﺑق ﺑﺣﻳث ﻧﻌرف ﻣﺻ ـ ـ ـ ـ ـ ــﻔوﻓﺔ ﺗﺗﻛون ﻣن ‪ 6‬ﻧﻘﺎط ٕواﻳﺟﺎد‬
‫اﻟﻣﺳﺎﻓﺔ ﺑﻳن ﻛﻝ ﻧﻘطﺗﻳن ﺣﺳب اﻟﻌﻼﻗﺔ اﻟﺗﺎﻟﻳﺔ‪:‬‬
‫اﻟﻣﺳﺎﻓﺔ = ‪(x2 + y2)0.5‬‬

‫ﻣﺳﺎﻋدة اﻟﺣﻝ‪:‬‬

‫‪-1‬ﺗﻌرﻳف اﻟﻣﺻﻔوﻓﺔ‬

‫‪.Point pts[6]; // array to hold up to 6 points‬‬

‫‪-2‬اﻻﻗﺗران ﻹﻳﺟﺎد اﻟﻣﺳﺎﻓﺔ ﺑﻳن اﻟﻧﻘﺎط‪:‬‬

‫{ )‪float dist(Point p‬‬


‫‪// Compute the distance from the origin‬‬
‫;)‪return sqrt(p.x*p.x + p.y*p.y‬‬

‫ﺟﻣﻠﺔ اﻻﺳﺗدﻋﺎء )]‪dist(pt[i‬‬


‫اﻟﺗدرﻳب رﻗم )‪(3‬‬
‫اﻋد ﻛﺗﺎﺑﺔ اﻟﺗدرﻳب اﻟﺳﺎﺑق اﻟﻧﻘطﺔ ‪ Point‬ﺗﺗﻛون إﺣداﺛﻳﺎت ‪ x‬و ‪ y‬ﺑﺎﺳﺗﺧدام اﻷﺻﻧﺎف ‪ ، class‬واﻛﺗب‬
‫اﻟﺑرﻧﺎﻣﺞ اﻟرﺋﻳﺳﻲ اﻟذي ﻳﻌرف ﻣﺗﻐﻳر ﻣؤﺷري ﻣن اﻟﻧوع ﻧﻘطﺔ وﻳﻘوم ﺑﺈﺳﻧﺎد ﻗﻳم ﻟﻠﻣﺗﻐﻳرات وطﺑﺎﻋﺔ اﻟﻧﺗﺎﺋﺞ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫>‪#include <iostream‬‬
‫{‪class Point‬‬
‫‪public:‬‬
‫;‪int x, y‬‬
‫{)(‪Point‬‬
‫;‪x = 0; y = 0‬‬
‫}‬
‫;}‬
‫{)(‪int main‬‬
‫;‪Point* p = new Point‬‬
‫;‪p->x = 9‬‬
‫;‪p->y = 4‬‬
‫;‪cout << p->x << " " << p->y << endl‬‬
‫;‪return 0‬‬
‫}‬

‫اﻟﺗدرﻳب رﻗم )‪(4‬‬


‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﺟﻳدا واﻟذي ﻳﺻف ﺻﻧف ﻣن ﻧوع ﻣﺳﺗطﻳﻝ ‪ Rectangle‬وﻳﻘوم ﺑﺈﻋطﺎء إﺑﻌﺎد اﻟﻣﺳﺗطﻳﻝ‬
‫ٕواﻳﺟﺎد ﻣﺳﺎﺣﺗﻪ ﺑﺎﺳﺗﺧدام داﻟﺔ ﺳطرﻳﻪ وطﺑﺎﻋﺔ اﻟﻧﺗﺎﺋﺞ‪ .‬اﻋد ﻛﺗﺎﺑﺔ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﺑﺎﺳﺗﺧدام اﻟﺑﻧﺎء ‪constructor‬‬

‫>‪#include <iostream‬‬
‫{ ‪class CRectangle‬‬
‫;‪int x, y‬‬
‫‪public:‬‬
‫;)‪void set_values (int,int‬‬
‫};)‪int area () {return (x*y‬‬
‫;}‬

‫{ )‪void CRectangle::set_values (int a, int b‬‬


‫;‪x = a‬‬
‫;‪y = b‬‬
‫}‬

‫{ )( ‪int main‬‬
‫;‪CRectangle rect, rectb‬‬
‫;)‪rect.set_values (3,4‬‬
‫;)‪rectb.set_values (5,6‬‬
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}

:‫اﻟﺣﻝ‬

// ‫ باستخدام‬constructor
#include <iostream>
class CRectangle {
int width, height;
public:
CRectangle (int,int);
int area () {return (width*height);}
};

CRectangle::CRectangle (int a, int b) {


width = a;
height = b;
}

int main () {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}

(2) ‫اﺳﺋﻠﺔ ﻟﻠﺣﻝ ﻋﻠﻰ اﻟﺣﺎﺳوب‬



‫ﻋزﻳزي اﻟطﺎﻟب اﻋد ﻛﺗﺎﺑﺔ اﻟﺗدرﻳب اﻟﺳﺎﺑق ﺑﺣﻳث ﻧﻌرف اﻟﻬدام‬
:‫ﻣﺳﺎﻋدة اﻟﺣﻝ‬
~CRectangle (); : ‫اﻟﻬدام‬

(3) ‫اﺳﺋﻠﺔ ﻟﻠﺣﻝ ﻋﻠﻰ اﻟﺣﺎﺳوب‬



‫ﻋزﻳزي اﻟطــﺎﻟــب‪ ،‬اﻛﺗــب ﺑرﻧــﺎﻣﺞ ﺑﻠﻐــﺔ ‪ C++‬ﻟﺗﻌرﻳف ﺻ ـ ـ ـ ـ ـ ــﻧف طــﺎﻟــب ‪ STUDENT‬ﻳﺗﻛون ﻣن‬
‫اﻟﻣﺗﻐﻳرات اﻟﻣﻧﺗﻣﻳﺔ اﻟﺗﺎﻟﻳﺔ ‪ :‬اﻟرﻗم اﻟﺟﺎﻣﻲ ﻟﻠطﺎﻟب ‪ ، USN‬اﻻﺳــم ‪ ،name‬وﻋﻼﻣﺎت ‪ m‬ﻓﻲ ‪ 3‬اﺧﺗﺑﺎرات ﻓﻲ‬
‫ﻣوﺿـوع ﻣﺎ‪. ,‬واﻟﻣﻌدﻝ ‪ . avg‬ﻋرف ﻣﺻـﻔوﻓﺔ ﺗﻣﺛﻝ ﻣﺟﻣوﻋﺔ ﻣن ‪ 10‬ﻛﺎﺋﻧﺎت ﻣن اﻟﺻﻧف‪. STUDENT.‬‬
‫ﺑﺎﺳ ـ ــﺗﺧدام اﻗﺗراﻧﺎت ﻣﻧﺗﻣﻳﺔ ﻣﻧﺎﺳ ـ ــﺑﺔ‪ ،‬اوﺟد ﻣﺗوﺳ ـ ــط اﻋﻠﻰ ﻋﻼﻣﺗﻳن ﻋﻼﻣﺎت ﻟﻛﻝ طﺎﻟب ‪ .‬وأطﺑﻊ اﻟﻧﺗﺎﺋﺞ ﻣﺛﻝ‪:‬‬
‫‪ ،USN‬واﻻﺳم وﻣﻌدﻝ ﻋﻼﻣﺎت اﻟطﻼب ﻛﺎﻓﺔ‪.‬‬

‫اﻟﺗدرﻳب رﻗم )‪(5‬‬


‫ادرس اﻟﺗدرﻳب رﻗم )‪ (4‬واﻋد ﻛﺗﺎﺑﺔ اﻟﺑﻧﺎء ﻣن ﺧﻼﻝ ﻣﻔﻬوم اﻋﺎدة اﻟﺗﺣﻣﻳﻝ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫‪// overloading class constructors‬‬
‫>‪#include <iostream‬‬

‫{ ‪class CRectangle‬‬
‫;‪int width, height‬‬
‫‪public:‬‬
‫;)( ‪CRectangle‬‬
‫;)‪CRectangle (int,int‬‬
‫};)‪int area (void) {return (width*height‬‬
‫;}‬

‫{ )( ‪CRectangle::CRectangle‬‬
‫;‪width = 5‬‬
‫;‪height = 5‬‬
‫}‬

‫{ )‪CRectangle::CRectangle (int a, int b‬‬


‫;‪width = a‬‬
‫;‪height = b‬‬
‫}‬

‫{ )( ‪int main‬‬
‫;)‪CRectangle rect (3,4‬‬
‫;‪CRectangle rectb‬‬
‫;‪cout << "rect area: " << rect.area() << endl‬‬
‫;‪cout << "rectb area: " << rectb.area() << endl‬‬
‫;‪return 0‬‬
‫}‬
‫إﺟﺎﺑﺎت اﻷﺳﺋﻠﺔ‬
(1) ‫ﺳؤاﻝ‬
struct Point {
float x; // x coordinate
float y; // y coordinate
};

Point pts[6]; // array to hold up to 6 points.


int n = 0; // number of points in the array.

while (cin >> pts[n].x >> pts[n].y) {


n++;
}

float dist(Point p) {
// Compute the distance from the origin
return sqrt(p.x*p.x + p.y*p.y);
}

void findDistance(Point pt[], int size) {


for (int i=0; i<size-1; i++) {
cout<< dist(pt[i
}
}

(2) ‫ﺳؤاﻝ‬

// Solution on constructors and destructors


#include <iostream>
class CRectangle {
int *width, *height;
public:
CRectangle (int,int);
~CRectangle ();
int area () {return (*width * *height);}
};

CRectangle::CRectangle (int a, int b) {


width = new int;
height = new int;
*width = a;
*height = b;
}

CRectangle::~CRectangle () {
delete width;
delete height;
}

int main () {
CRectangle rect (3,4), rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
‫ﻧﺗﻳﺟﺔ اﻟﺗﻧﻔﻳذ‬
rect area: 12
rectb area: 30
(3) ‫ﺳؤاﻝ‬

#include<iostream.h>
#include<conio.h>
class student
{
private :
int usn,m[4];
char name[20];
float avg;
public :
void read();
void avgm();
void print();
};
void student :: read()
{
cout<<"Enter the USA no. :";
cin>>usn;
cout<<"Enter the name of the student :";
cin>>name;
cout<<name<<endl;
cout<<"Enter the marks of 3 subjects :";
cin>>m[1]>>m[2]>>m[3];
avgm();
}

void student :: avgm()


{
if(m[1]<=m[2] && m[1]<=m[3])
avg=(float)(m[2]+m[3])/2;
if(m[2]<=m[1] && m[2]<=m[3])
avg=(float)(m[1]+m[3])/2;
if(m[3]<=m[1] && m[3]<=m[2])
avg=(float)(m[1]+m[2])/2;
}
void student :: print()
{

cout<<"\n"<<usn<<"\t"<<name<<"\t\t"<<avg;

/* cout<<"USA No.:"<<usn<<"\n";
cout<<"Name :"<<name<<endl;
cout<<"Average marks :"<<avg<<"\n"; */
}
void main()
{
int n,i;
student s[10];
clrscr();
cout<<"Enter the no of students :";
cin>>n;
for(i=0;i<n;i++)
s[i].read();
cout<<"USN\tNAME\t\tAVVEAGE MARKS\n";
for(i=0;i<n;i++)
s[i].print();
getch();
}
‫اﻟﻮﺣﺪة اﻟﺜﺎﻟﺜﺔ‬
‫المصفوفات واألصناف‬
‫‪Arrays and Classes‬‬

‫إن ﻣﻌظم اﻟﺗطﺑﻳﻘﺎت اﻟﻌﻣﻠﻳﺔ ﺗﺗطﻠب اﺳ ـ ـ ــﺗﺧدام ﻗواﺋم ﻣن اﻟﻛﺎﺋﻧﺎت ‪ ،list of objects‬وﻏﺎﻟﺑﺎ ﻣﺎ ﺗﻧﻔذ ﻫذﻩ‬
‫اﻟﻘواﺋم ﺑﺎﺳ ـ ـ ــﺗﺧدام ﻣﺻ ـ ـ ــﻔوﻓﺎت ﻣن اﻟﻛﺎﺋﻧﺎت ‪ Arrays of objects‬أو ﺑﺎﺳ ـ ـ ــﺗﺧدام ﻗواﺋم ﻣﺗﺻ ـ ـ ــﻠﺔ ﻣن اﻟﻛﺎﺋﻧﺎت‬
‫‪ .linked lists of objects‬ﻓﻲ ﻫذﻩ اﻟوﺣدة‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺳـ ـ ــﻧﻧﺎﻗش ﻛﻳﻔﻳﺔ إﻧﺷ ـ ــﺎء واﺳـ ـ ــﺗﺧدام ﻣﺻـ ـ ــﻔوﻓﺎت‬
‫وﻗواﺋم ﻣﺗﺻﻠﺔ ﻣن اﻟﻛﺎﺋﻧﺎت ﻣن ﺧﻼﻝ أﻣﺛﻠﺔ ﻋﻣﻠﻳﺔ وﺗدرﻳﺑﺎت ﻣﺧﺗﻠﻔﺔ‪.‬‬

‫أﻫداف اﻟوﺣدة‬
‫ﻳﻧﺗظر ﻣﻧك‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺑﻌد ﻓراﻏك ﻣن ﺗﻧﻔﻳذ اﻟﺑراﻣﺞ ﻓﻲ ﻫذﻩ اﻟوﺣدة‪ ،‬أن ﺗﻛون ﻗﺎد ار ﻋﻠﻰ أن‪:‬‬

‫‪ .1‬ﺗﻌرف ﻣﺻﻔوﻓﺎت ﻣن اﻟﻛﺎﺋﻧﺎت ﺑﻠﻐﺔ ‪.C++‬‬

‫‪ .2‬ﺗﻣرر اﻟﻣﺻﻔوﻓﺎت ﻛﻌواﻣﻝ إﻟﻰ دواﻝ ﻣﺧﺗﻠﻔﺔ‪.‬‬

‫‪ .3‬ﺗﺳﺗﺧدم ﻫذﻩ اﻟﻣﺻﻔوﻓﺎت ﻓﻲ ﺗطﺑﻳﻘﺎت ﻣﺧﺗﻠﻔﺔ ﻣﺛﻝ ﻋﻣﻠﻳﺎت اﻟﻔرز واﻟﺑﺣث‪.‬‬

‫‪ .4‬ﺗﻧﺷﺊ اﻟﻛﺎﺋﻧﺎت ﺑطرﻳﻘﺔ دﻳﻧﺎﻣﻳﻛﻳﺔ‪.‬‬

‫‪ .5‬ﺗﺗﻌﺎﻣﻝ ﻣﻊ اﻟﻛﺎﺋﻧﺎت ﻣن ﺧﻼﻝ ﻋﻧﺎوﻳﻧﻬﺎ وﻣﺗﻐﻳرات ﻣؤﺷرة ‪.pointer variables‬‬


.‫ أن ﺗﻧﺷﺊ ﻗواﺋم ﻣﺗﺻﻠﺔ ﻣن اﻟﻛﺎﺋﻧﺎت وﺗﺳﺗﺧدﻣﻬﺎ ﻓﻲ ﺗطﺑﻳﻘﺎت ﻣﺧﺗﻠﻔﺔ‬.6

(1) ‫اﻟﺗدرﻳب‬
.‫اﻋد ﻛﺗﺎﺑﺔ ﻣﺛﺎﻝ اﻟﻣﺳﺗطﻳﻝ ﻣن ﺧﻼﻝ ﻓﻛرة ﻣؤﺷر اﻟﻰ اﻟﺻﻧف وﻣؤﺷر اﻟﻰ ﻣﺻﻔوﻓﺔ ﻣن اﻟﻛﺎﺋﻧﺎت‬

:‫اﻟﺣﻝ‬

// pointer to classes example


#include <iostream>

class CRectangle {
int width, height;
public:
void set_values (int, int);
int area (void) {return (width * height);}
};

void CRectangle::set_values (int a, int b) {


width = a;
height = b;
}

int main () {
CRectangle a, *b, *c;
CRectangle * d = new CRectangle[2];
b= new CRectangle;
c= &a;
a.set_values (1,2);
b->set_values (3,4);
d->set_values (5,6);
d[1].set_values (7,8);
cout << "a area: " << a.area() << endl;
cout << "*b area: " << b->area() << endl;
cout << "*c area: " << c->area() << endl;
cout << "d[0] area: " << d[0].area() << endl;
cout << "d[1] area: " << d[1].area() << endl;
delete[] d;
delete b;
return 0;
}
(2) ‫اﻟﺗدرﻳب‬
‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﺟﻳدا وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب اﺟب ﻋن اﻷﺳﺋﻠﺔ اﻟﺗﺎﻟﻳﺔ ﺑﺎﻟﺗﻌﺎون ﻣﻊ ﻋﺿو ﻫﻳﺋﺔ اﻟﺗدرﻳس ﻓﻲ‬
‫اﻟﻣﺧﺗﺑر‬
#include <iostream.h>

class CAT
{
public:
CAT() { itsAge = 1; itsWeight=5; }
~CAT() {} // destructor
int GetAge() const { return itsAge; }
int GetWeight() const { return itsWeight; }
void SetAge(int age) { itsAge = age; }

private:
int itsAge;
int itsWeight;
};

int main()
{
CAT * Family[500];
int i;
CAT * pCat;
for (i = 0; i < 10; i++)
{
pCat = new CAT;
pCat->SetAge(2*i +1);
Family[i] = pCat;
}

for (i = 0; i < 10; i++)


{
cout << "Cat #" << i+1 << ": ";
cout << Family[i]->GetAge() << endl;
}
return 0;
}

__________________________________________________ ‫ ﻣﺎ اﺳم اﻟﺻﻧف‬.1


______________________ CAT() { itsAge = 1; itsWeight=5; } :‫ ﻣﺎ وظﻳﻔﺔ اﻟداﻟﺔ اﻟﺗﺎﻟﻳﺔ‬.2
___________________________________________________________ ‫ ﻣﺎ اﺳم اﻟﺑﻧﺎء‬.3
‫‪ .4‬ﻫﻝ ﻳوﺟد ﻫدام ‪ ،‬واذا ﻛﺎﻧت اﺟﺎﺑﺗك ﺑﻧﻌم ﻓﻣﺎ ﻫﻲ اﻟداﻟﺔ اﻟﻬدام‪______________________________ .‬‬
‫‪ .5‬ﻣﺎ ﻫﻲ اﻟﻣﺗﻐﻳرات اﻟﻣﻧﺗﻣﻳﺔ ﻓﻲ اﻟﺻﻧف _____________________________________________‬
‫‪ .6‬أﻋطﻲ أﻣﺛﻠﺔ ﻋﻠﻰ اﻟدواﻝ اﻟﻣﻧﺗﻣﻳﺔ ___________________________________________‬
‫‪ .7‬اﻛﺗب اﻟﺟﻣﻠﺔ اﻟﺗﻲ ﺗﻌرف ﻣﺻﻔوﻓﺔ ﻣن اﻟﻣؤﺷرات ﻟﻠﺻﻧف ‪_______________________ CAT‬‬
‫‪ .8‬ﻣﺎ اﻟﻬدف ﻣن اﺳﺗﺧدام اﻟﺟﻣﻝ اﻟﺗﺎﻟﻳﺔ‪___________________________________ :‬‬
‫;‪pCat = new CAT‬‬
‫;)‪pCat->SetAge(2*i +1‬‬
‫‪ .9‬ﻣﺎ ﻫو ‪____________________________________________ pCat‬‬
‫‪ .10‬ﻣﺎ وظﻳﻔﺔ ‪__________________________________________ new‬‬
‫‪ .11‬ﻟﻣﺎذا اﺳﺗﺧدﻣﻧﺎ اﻟرﻣز >‪ -‬ﻓﻲ اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﻳﺔ ________________________________‬
‫‪ .12‬أﻋطﻲ ﻣﺛﺎﻝ ﻋﻠﻰ داﻟﺔ ﺳطرﻳﺔ _______________________________________________‬
‫‪ .13‬ﻫﻝ اﻟﻧﺗﻳﺟﺔ اﻟﺗﻲ ﺣﺻﻠت ﻋﻠﻳﻬﺎ ﺑﻌد اﻟﺗﻧﻔﻳذ ﻫﻲ‪:‬‬
‫‪Output: Cat #1: 1‬‬
‫‪Cat #2: 3‬‬
‫‪Cat #3: 5‬‬

‫اﻟﺗدرﻳب )‪(3‬‬
‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳوﺿﺢ ﻣﺛﺎﻝ اﻟﻧﻘطﺔ ﺑﺣﻳث ﻳﻘدم ﻓﻛرة اﺳﺗﺧدام ﺧوارزﻣﻳﺎت اﻟﻔرز ‪ bubbleSort‬ﻟﺗرﺗﻳب اﻟﻧﻘط‬
‫ﺗﺻﺎﻋدﻳﺎ ﺣﺳب اﻟﻣﺳﺎﻓﺔ ﻣن ﻧﻘطﺔ اﻷﺳﺎس‪ .‬اﻛﺗب اﻟداﻟﺔ اﻟرﺋﻳﺳﻳﺔ ﻟﻠﺑرﻧﺎﻣﺞ‬
‫>‪include <iostream‬‬
‫{ ‪struct Point‬‬
‫‪float x; // x coordinate‬‬
‫‪float y; // y coordinate‬‬
‫‪char name[20]; // name of the point‬‬
‫;}‬

‫‪Point pts[10]; // array to hold up to 10 points.‬‬


‫‪int n = 0; // number of points in the array.‬‬

‫{ )‪while (cin >> pts[n].name >> pts[n].x >> pts[n].y‬‬


‫;‪n++‬‬
‫}‬

‫{ )‪float dist(Point p‬‬


‫‪// Compute the distance from the origin‬‬
‫;)‪return sqrt(p.x*p.x + p.y*p.y‬‬
‫}‬
void bubbleSort(Point pt[], int size) {
bool doMore = true;
while (doMore) {
doMore = false; // Assume no more passes unless exchange made.
for (int i=0; i<size-1; i++) {
if (dist(pt[i]) > dist(pt[i+1])) {
// Exchange elements
Point temp = pt[i]; pt[i] = pt[i+1]; pt[i+1] = temp;
doMore = true; // Exchange requires another pass.
}
}
}
}

‫( ﻣﺛﺎﻝ ﻋﻠﻰ اﻟﻘواﺋم اﻟﻣﺗﺻﻠﺔ‬4) ‫ﺗدرﻳب‬


‫ واالقترانات المنتمية التي تدخل عمر‬itsAge ‫ ﻳﺣﺗوي ﻋﻠﻰ ﻣﺗﻐﻳر ﻣﻧﺗﻣﻲ‬CAT ‫ ﻳﻌرف ﺻﻧف ﻣن ﻧوع‬C++ ‫اﻛﺗب ﺑرﻧﺎﻣﺞ ﺑﻠﻐﺔ‬
‫ تحتوي على‬Node ‫القطة وترجع عمر ألقطة استخدم القوائم المتصلة لتمثيل المشكلة عن طريق تعريف عقدة من نوع‬
. ‫ الى القائمة المتصلة‬CAT ‫االقترانات الالزمة إلضافة معلومات القطة‬
// Linked list simple implementation

#include <iostream.h>

// object to add to list


class CAT
{
public:
CAT() { itsAge = 1;}
CAT(int age):itsAge(age){}
~CAT(){};
int GetAge() const { return itsAge; }
private:
int itsAge;
};

// manages list, orders by cat's age!


class Node
{
public:
Node (CAT*);
~Node();
void SetNext(Node * node) { itsNext = node; }
Node * GetNext() const { return itsNext; }
CAT * GetCat() const { return itsCat; }
void Insert(Node *);
void Display();
private:
CAT *itsCat;
Node * itsNext;
};

Node::Node(CAT* pCat):
itsCat(pCat),
itsNext(0)
{}

Node::~Node()
{
cout << "Deleting node...\n";
delete itsCat;
itsCat = 0;
delete itsNext;
itsNext = 0;
}

// ************************************
// Insert
// Orders cats based on their ages
// Algorithim: If you are last in line, add the cat
// Otherwise, if the new cat is older than you
// and also younger than next in line, insert it after
// this one. Otherwise call insert on the next in line
// ************************************
void Node::Insert(Node* newNode)
{
if (!itsNext)
itsNext = newNode;
else
{
int NextCatsAge = itsNext->GetCat()->GetAge();
int NewAge = newNode->GetCat()->GetAge();
int ThisNodeAge = itsCat->GetAge();

if ( NewAge >= ThisNodeAge && NewAge < NextCatsAge )


{
newNode->SetNext(itsNext);
itsNext = newNode;
}
else
itsNext->Insert(newNode);
}
}

void Node::Display()
{
if (itsCat->GetAge() > 0)
{
cout << "My cat is ";
cout << itsCat->GetAge() << " years old\n";
}
if (itsNext)
itsNext->Display();
}

int main()
{

Node *pNode = 0;
CAT * pCat = new CAT(0);
int age;

Node *pHead = new Node(pCat);

while (1)
{
cout << "New Cat's age? (0 to quit): ";
cin >> age;
if (!age)
break;
pCat = new CAT(age);
pNode = new Node(pCat);
pHead->Insert(pNode);
}
pHead->Display();
delete pHead;
cout << "Exiting...\n\n";
return 0;
}
‫‪ ‬‬
‫‪ ‬‬
‫الوحدة الرابعة‬
‫الدوال الصديقة والعمليات ‪ ‬‬
‫‪Friend Functions and Operators‬‬
‫‪ ‬‬
‫في ھذه الوحدة‪ ،‬عزيزي الطالب‪ ،‬سندرس الدوال واألصناف الصديقة‪ ،‬وكيفية تعريفھا واستخدامھا‪ .‬ثم سندرس‬
‫كيفية تعريف العمليات مثل) ‪ +‬و * و ‪ (-‬بحيث نجعلھا تتصرف كما نريد حسب نوعية العوامل‪ .‬وفي‬
‫القسم األخير سوف نتحدث عن المجموعات‬

‫‪ 2.1‬أھداف الوحدة‬
‫ينتظر منك‪ ،‬عزيزي الطالب‪ ،‬بعد تنفيذ البرامج أن تكون قادرا على أن‪:‬‬

‫تكتب وتستخدم الدوال التي تستقبل العوامل باإلشارة ‪.Reference Parameters.‬‬ ‫‪.1‬‬
‫تكتب الدوال الصديقة وتستدعيھا بشكل صحيح‪.‬‬ ‫‪.2‬‬
‫تعرف األصناف الصديقة‪.‬‬ ‫‪.3‬‬
‫تكتب تعريفات جديدة للعمليات المختلفة‪.‬‬ ‫‪.4‬‬
‫تعرف وتستخدم ‪. this‬‬ ‫‪.5‬‬

‫ﺗدرﻳب )‪(1‬‬
‫اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻟﺗﻣرﻳر اﻟﻌواﻣﻝ‪ ،‬اﻛﺗب اﻟﺑراﻣﺞ اﻟﺗﺎﻟﻳﺔ وﻧﻔذﻫﺎ ﻋﻠﻰ اﻟﺣﺎﺳوب ‪ ،‬وﻋﻠﻝ ﻧﺗﺎﺋﺞ اﻟﺗﻧﻔﻳذ‪.‬‬

‫تمرير العوامل باإلشارة ‪ parameter passing by reference.‬تمرير العوامل بالقيمة ‪parameter‬‬


‫‪passing by value.‬‬
void swap1(int X, int Y) void swap2(int* X,int* Y) void swap3(int
{ int T=X; { int T=*X; &X, int &Y)
X=Y; *X=*Y; { int
Y=T; *Y=T; T=X;
} }
X=Y;

Y=X;
}

main() main() main()


{int A=10; {int A=10; {int A=10;
int B=20; int B=20; int B=20;

cout<<"A="<<A<<" cout<<"A="<<A<<" cout<<"A="<<A


B="<<B<<endl; B="<<B<<endl; <<"
swap1(A,B); swap2(&A,&B);
B="<<B<<endl;
swap3(A,B);
cout<<"A="<<A<<" cout<<"A=‫<<ط‬A<<"
B="<<B<<endl; B="<<B<<endl;
} } cout<<"A="<<A
<<"

B="<<B<<endl;
}

A=10 B=20 A=10 B=20 A=10


A=10 B=20 A=20 B=10 B=20
A=20
B=10

(2) ‫ﺗدرﻳب‬
Friend Functions ‫الدوال الصديقة‬
‫ لھذه الدالة داخل تعريف الصنف‬prototype ‫تعرف الدالة على أنھا دالة صديقة لصنف ما بوضع نموذج‬
‫ مما يعني أن الدالة الصديقة لھا الحق في معالجة األجزاء الخاصة للصنف كما لو‬. friend ‫مسبوقا بالكلمة‬
.‫ وتختلف طريقة استدعاء الدالة الصديقة عن طريقة استدعاء الدالة المنتمية‬.‫كانت دالة منتمية للصنف‬
‫ إليجاد مربع المسافة‬Distance ‫ حيث يقوم البرنامج بتعريف صنف اسمه مسافة‬،‫ادرس البرنامج التالي جيدا‬
:‫ ثم اجب عن األسئلة التالية‬،‫المعطاة بالقدم والبوصة بالقياس قدم مربع‬

// friend square() function for Distance


#include <iostream>
////////////////////////////////////////////////////////////////
class Distance //English Distance class
{
private:
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0) //constructor (no args)
{ }
//constructor (two args)
Distance(int ft, float in) : feet(ft), inches(in)
{ }
void showdist() //display distance
{ cout << feet << "\'-" << inches << '\"'; }
friend float square(Distance); //friend function
};
//--------------------------------------------------------------
float square(Distance d) //return square of
{ //this Distance
float fltfeet = d.feet + d.inches/12; //convert to float
float feetsqrd = fltfeet * fltfeet; //find the square
return feetsqrd; //return square feet
}
////////////////////////////////////////////////////////////////
int main()
{
Distance dist(3, 6.0); //two-arg constructor (3'-6")
float sqft;

sqft = square(dist); //return square of dist


//display distance and square
cout << "\nDistance = "; dist.showdist();
cout << "\nSquare = " << sqft << " square feet\n";
return 0;
}

......................................................... ‫ ما ھي الدالة الصديقة من البرنامج‬.1


‫‪ .2‬ھل نستخدم اسم الصنف او عملية تقرير المجال ‪ ::‬في ترويسة ھذه الدالة ‪.............................‬‬
‫‪ .3‬كيف يتم استدعاء الدالة الصديقة ) اكتب جملة االستدعاء من البرنامج السابق( ‪............................‬‬
‫‪ .4‬كيف تستخدم المتغيرات المنتمية داخل الدوال الصديقة اعطي مثال على ذلك ‪..............................‬‬
‫‪ .5‬نفذ البرنامج واكتب نتيجة التنفيذ ‪..............................................................................‬‬

‫ﺗدرﻳب )‪ (3‬اﻷﺻﻧﺎف اﻟﺻدﻳﻘﺔ‬


‫لتجنب وضع عدد كبير من الدوال المنتمية إلى صنف كدوال صديقة إلى صنف آخر‪ ،‬نستطيع تعريف الصنف‬
‫بأكمله كصنف صديق للصنف اآلخر‪ .‬مما يعطي جميع الدوال المنتمية إلى الصنف األول القدرة على معالجة‬
‫األجزاء الخاصة في الصنف اآلخر‪ .‬على سبيل المثال لنفرض أن لدينا الصنفين ‪ beta‬والصنف ‪ alpha‬وأننا‬
‫نود إعطاء جميع الدوال المنتمية للصنف ‪ beta‬إمكانية معالجة جميع المتغيرات والدوال الخاصة بالصنف‬
‫‪ employee‬فبدال من أن نعرف كل من ھذه الدوال كدالة صديقة نستطيع تعريف الصنف ‪ beta‬كصديق‬
‫للصنف ‪ alpha‬مما يحقق نفس الغاية‪.‬‬
‫ادرس اﻟﺑرﻧﺎﻣﺞ اﻟﺗﺎﻟﻲ ﺟﻳدا وﻧﻔذة ﻋﻠﻰ اﻟﺣﺎﺳوب واطﺑﻊ ﻧﺗﻳﺟﺔ اﻟﺗﻧﻔﺑذ‪:‬‬
‫‪// friend classes‬‬
‫>‪#include <iostream‬‬
‫‪////////////////////////////////////////////////////////////////‬‬
‫‪class alpha‬‬
‫{‬
‫‪private:‬‬
‫;‪int data1‬‬
‫‪public:‬‬
‫‪alpha() : data1(99) { } //constructor‬‬
‫;‪friend class beta‬‬ ‫‪//beta is a friend class‬‬
‫;}‬
‫‪////////////////////////////////////////////////////////////////‬‬
‫‪class beta‬‬
‫{‬ ‫‪//all member functions can‬‬
‫‪public:‬‬ ‫‪//access private alpha data‬‬
‫} ;‪void func1(alpha a) { cout << "\ndata1=" << a.data1‬‬
‫} ;‪void func2(alpha a) { cout << "\ndata1=" << a.data1‬‬
‫;}‬
‫‪////////////////////////////////////////////////////////////////‬‬
‫)(‪int main‬‬
‫{‬
‫;‪alpha a‬‬
‫;‪beta b‬‬

‫;)‪b.func1(a‬‬
‫;)‪b.func2(a‬‬
‫;‪cout << endl‬‬
‫;‪return 0‬‬
‫}‬
( 4) ‫تدريب‬
‫إعادة تحميل عملية اإلسناد المساواة‬
‫ المختلفة بما يتناسب مع‬operator ‫ أنھا تمكننا من إعادة تعريف العمليات‬C++ ‫من المميزات الجميلة للغة‬
‫ لتعني اسناد – لتعني اسناد كائن الى‬alpha ‫ فمثال نستطيع تعريف العملية = كعملية منتمية للصنف‬.‫تطبيقاتنا‬
.‫اخر‬
// overloads assignment operator (=)
#include <iostream>
////////////////////////////////////////////////////////////////
class alpha
{
private:
int data;
public:
alpha() //no-arg constructor
{}
alpha(int d) //one-arg constructor
{ data = d; }
void display() //display data
{ cout << data; }
alpha operator = (alpha& a) //overloaded = operator
{
data = a.data; //not done automatically
cout << "\nAssignment operator invoked";
return alpha(data); //return copy of this alpha
}
};
////////////////////////////////////////////////////////////////
int main()
{
alpha a1(37);
alpha a2;

a2 = a1; //invoke overloaded =


cout << "\na2="; a2.display(); //display a2

alpha a3 = a2; //does NOT invoke =


cout << "\na3="; a3.display(); //display a3
cout << endl;
return 0;
}
(5) ‫تدريب‬
‫إعادة تحميل عملية اإلسناد المساواة‬
2 ‫استخدم فكرة إعادة التحميل إلسناد المساواة في التدريب‬
// friend overloaded + operator
#include <iostream>
////////////////////////////////////////////////////////////////
class Distance //English Distance class
{
private:
int feet;
float inches;
public:
Distance() //constructor (no args)
{ feet = 0; inches = 0.0; }
Distance( float fltfeet ) //constructor (one arg)
{ //convert float to Distance
feet = int(fltfeet); //feet is integer part
inches = 12*(fltfeet-feet); //inches is what's left
}
Distance(int ft, float in) //constructor (two args)
{ feet = ft; inches = in; }
void showdist() //display distance
{ cout << feet << "\'-" << inches << '\"'; }
friend Distance operator + (Distance, Distance); //friend
};
//--------------------------------------------------------------
Distance operator + (Distance d1, Distance d2) //add D1 to d2
{
int f = d1.feet + d2.feet; //add the feet
float i = d1.inches + d2.inches; //add the inches
if(i >= 12.0) //if inches exceeds 12.0,
{ i -= 12.0; f++; } //less 12 inches, plus 1 foot
return Distance(f,i); //return new Distance with sum
}
//--------------------------------------------------------------
int main()
{
Distance d1 = 2.5; //constructor converts
Distance d2 = 1.25; //float-feet to Distance
Distance d3;
cout << "\nd1 = "; d1.showdist();
cout << "\nd2 = "; d2.showdist();

d3 = d1 + 10.0; //distance + float: OK


cout << "\nd3 = "; d3.showdist();
‫;‪d3 = 10.0 + d1‬‬ ‫‪//float + Distance: OK‬‬
‫;)(‪cout << "\nd3 = "; d3.showdist‬‬
‫;‪cout << endl‬‬
‫;‪return 0‬‬
‫}‬

‫ﺗدرﻳب )‪(6‬‬
‫في ك ّل مرة يتم فيھا استدعاء الدوال المنتمية ‪ ،‬فانه يمرر بصورة اتوماتيكية مؤشر يدعى ‪ ، this‬إلى‬
‫الكينونة التي تم استدعائھا‪ .‬ھذا المؤشر يدعى ‪ this‬ويعتبر معامل ضمني لجميع الدوال المنتمية‪ .‬لذا ‪،‬في‬
‫داخل اي دوال منتمية‪ ،‬المؤشر ‪ this‬قد يستعمل لإلشارة إلى الكينونة المستدعاة‪.‬‬

‫نفذ البرنامج التالي وبين النتيجة التي حصلت عليھا ‪ ،‬ونقاش النتيجة التي حصلت عليھا‬

‫‪// this‬‬
‫>‪#include <iostream‬‬

‫{ ‪class CDummy‬‬
‫‪public:‬‬
‫;)‪int isitme (CDummy& param‬‬
‫;}‬

‫)‪int CDummy::isitme (CDummy& param‬‬


‫{‬
‫;‪if (&param == this) return true‬‬
‫;‪else return false‬‬
‫}‬

‫{ )( ‪int main‬‬
‫;‪CDummy a‬‬
‫;‪CDummy* b = &a‬‬
‫) )‪if ( b->isitme(a‬‬
‫;"‪cout << "yes, &a is b‬‬
‫;‪return 0‬‬
‫}‬
‫اﻟﻮﺣﺪة اﻟﺨﺎﻣﺴﺔ‬
‫األصناف المشتقة والقوالب‬
‫‪Derived Classes and Templates‬‬

‫ﻓﻲ ﻫـذﻩ اﻟوﺣـدة‪ ،‬ﻋزﻳزي اﻟـدارس‪ ،‬ﺳ ـ ـ ـ ـ ـ ــﻧﻧـﺎﻗش أﺳ ـ ـ ـ ـ ـ ــﺎﻟﻳـب ﻣﺧﺗﻠﻔـﺔ ﻟﺗﺣﻘﻳق اﻟﻬـدف اﻷﻫم ﻟﻠﻐـﺎت اﻟﺑرﻣﺟﺔ‬
‫اﻟﻛﻳﻧوﻧﻳﺔ وﻫو ﺗﻘﻠﻳﻝ اﻟﺣﺎﺟﺔ إﻟﻰ ﻛﺗﺎﺑﺔ دواﻝ ﺟدﻳدة ﻋن طرﻳق إﻋﺎدة اﺳـ ــﺗﺧدام اﻟدواﻝ اﻟﻘدﻳﻣﺔ ‪.Code Reuse‬‬
‫إذ ﺳ ـ ــﻧﻧﺎﻗش ﻓﻲ ﻫذﻩ اﻟوﺣدة ﻛﻳﻔﻳﺔ اﺷ ـ ــﺗﻘﺎق ﺻ ـ ــﻧف ﺟدﻳد‪ ،‬ﻳدﻋﻰ ﺑﺎﻟﺻ ـ ــﻧف اﻟﻣﺷ ـ ــﺗق ‪ ، Derived Class‬ﻣن‬
‫ﺻــﻧف )أو أﻛﺛر( آﺧر ﻳدﻋﻰ ﺑﺎﻟﺻــﻧف اﻷﺳــﺎس ‪ Base Class‬؛ ﻣﻣﺎ ﻳﺳــﻣﺢ ﻟﻧﺎ‪ ،‬إذا أﺣﺳــﻧﺎ ﺗﺻــﻣﻳم اﻟﻧظﺎم‪،‬‬
‫اﺳـ ــﺗﺧدام اﻟﻛﺛﻳر ﻣن اﻟدواﻝ اﻟﺧﺎﺻـ ــﺔ ﺑﺎﻟﺻـ ــﻧف اﻷﺳـ ــﺎس ﻟﻠﺻـ ــﻧف اﻟﻣﺷـ ــﺗق دون اﻟﺣﺎﺟﺔ إﻟﻰ إﻋﺎدة ﻛﺗﺎﺑﺗﻬﺎ ﻣن‬
‫ﺗورث إﻟﻰ اﻟﺻ ــﻧف اﻟﻣﺷ ــﺗق‪ .‬ﻻﺣظ‪ ،‬ﻋزﻳزي‬
‫ﺟدﻳد‪ .‬وذﻟك ﻷن اﻟﻣﺗﻐﻳرات واﻟدواﻝ اﻟﺧﺎﺻ ــﺔ ﺑﺎﻟﺻ ــﻧف اﻷﺳ ــﺎس ّ‬
‫اﻟدارس‪ ،‬أن إﻋﺎدة اﺳﺗﺧدام اﻟدواﻝ ‪ Code Reuse‬ﻻ ﻳﻘﻠﻝ‪ ،‬ﻓﻘط‪ ،‬ﻣن اﻟﺟﻬد واﻟوﻗت اﻟﻼزﻣﻳن ﻟﺗطوﻳر اﻟﺑراﻣﺞ‪،‬‬
‫إﻧﻣﺎ أﻳﺿـ ـ ـ ـ ـ ـﺎً ﻳﻘﻠﻝ ﻣن اﻟوﻗت واﻟﺟﻬد اﻟﻼزﻣﻳن ﻟﺻ ـ ـ ـ ـ ــﻳﺎﻧﺗﻬﺎ‪ .‬وﻳﺳ ـ ـ ـ ـ ــﺎﻋدﻧﺎ أﻳﺿـ ـ ـ ـ ـ ـﺎً ﻋﻠﻰ إﻧﺗﺎج ﺑراﻣﺞ ﻳﻌﺗﻣد ﻋﻠﻳﻬﺎ‬
‫‪ ،reliable‬إذ إن اﺳﺗﺧدام داﻟﺔ ﻣﺟرﺑﺔ ﺧﻳر ﻣن ﻛﺗﺎﺑﺔ داﻟﺔ ﺟدﻳدة ﻗد ﺗﺣوي أﺧطﺎء ﺧﻔﻳﺔ‪.‬‬

‫وﻣن اﻟطرق اﻷﺧرى اﻟﺗﻲ ﺗزودﻧﺎ ﺑﻬﺎ ﻟﻐﺔ ‪ C ++‬ﻟﺗﺳــﺎﻋدﻧﺎ ﻓﻲ ﺗﺣﻘﻳق ﻫدﻓﻧﺎ ﻓﻲ إﻋﺎدة اﺳــﺗﺧدام اﻟﺑراﻣﺞ‬
‫ﻫو ﻣﺎ ﻳﺳ ــﻣﻰ ﺑﺎﻟدواﻝ اﻟﻘﺎﻟﺑﻳﺔ ‪ Template Functions‬وﻫﻲ دواﻝ ﺗﻛﺗب ﺑطرﻳﻘﺔ ﺗﺳ ــﻣﺢ ﻟﻧﺎ ﺑﺎﺳ ــﺗﺧداﻣﻬﺎ ﻋﻠﻰ‬
‫أﻧواع ﻣﺧﺗﻠﻔـﺔ ﻣن اﻟﺑﻳـﺎﻧـﺎت دون اﻟﺣـﺎﺟﺔ إﻟﻰ ﻛﺗﺎﺑﺔ ﻧﺳ ـ ـ ـ ـ ـ ــﺧﺔ ﻣن ﻫذﻩ اﻟدواﻝ ﻟﻛﻝ ﻧوع ﻣن أﻧواع اﻟﺑﻳﺎﻧﺎت‪ .‬ﻛذﻟك‬
‫ﺗﺳ ـ ـ ــﻣﺢ ﻟﻧﺎ ﻟﻐﺔ ‪ C ++‬ﺑﺗﻌرﻳف أﺻ ـ ـ ــﻧﺎف ﻗﺎﻟﺑﻳﺔ وﻫﻲ أﺻ ـ ـ ــﻧﺎف ﻋﺎﻣﺔ ﺗﺳ ـ ـ ــﻣﺢ ﻟﻧﺎ ﺑﺗﺄﺟﻳﻝ ﺗﺣدﻳد ﻧوع اﻟﻣﺗﻐﻳرات‬
‫اﻟﻣﻧﺗﻣﻳﺔ إﻟﻰ ﺣﻳن اﺳــﺗﺧداﻣﻬﺎ‪ ،‬وﺑذﻟك ﻓﻬﻲ ﺗﻣﻧﺣﻧﺎ اﻟﻘدرة ﻋﻠﻰ ﺗﻌرﻳف أﺻــﻧﺎف ﺧﺎﺻــﺔ ﺗﻌﻣﻝ ﻋﻠﻰ أﻧواع ﺑﻳﺎﻧﺎت‬
‫ﻣﺧﺗﻠﻔﺔ دون اﻟﺣﺎﺟﺔ إﻟﻰ ﻛﺗﺎﺑﺔ ﻫذﻩ اﻷﺻﻧﺎف اﻟﻣﺧﺗﻠﻔﺔ وﺗﻌرﻳف دواﻟﻬﺎ‪.‬‬

‫وﻣﻣن اﻟﻣﻣﻳزات اﻟﻬﺎﻣﺔ ﻟﻠﻐﺔ ‪ C ++‬ﻣﺎ ﻳدﻋﻰ ﺑﺗﻌدد اﻷوﺟﻪ ‪ ،polymorphism‬ﺣﻳث ﺗﺳـ ـ ـ ـ ــﻣﺢ ﻟﻧﺎ ﻟﻐﺔ‬
‫‪ C ++‬ﺑﺗﺄﺧﻳر ﺗﺣدﻳد ﻫوﻳﺔ اﻟداﻟﺔ اﻟﺗﻲ ﺳﺗﺳﺗدﻋﻰ إﻟﻰ وﻗت ﺗﻧﻔﻳذ اﻟﺑرﻧﺎﻣﺞ )وﻟﻳس وﻗت ﺗرﺟﻣﺗﻪ ﻛﻣﺎ ﻫﻲ اﻟﻌﺎدة(‬
‫ﻣﻣﺎ ﻳﻣﻧﺣﻧﺎ اﻟﻘدرة ﻋﻠﻰ ﻛﺗﺎﺑﺔ ﺑراﻣﺞ ﺗﻘوم ﺑﻣﻬﺎم ﻣن اﻟﺻ ـ ـ ـ ـ ـ ــﻌب ﻛﺗﺎﺑﺗﻬﺎ ﺑﻠﻐﺎت اﻟﺑرﻣﺟﺔ اﻟﺗﻘﻠﻳدﻳﺔ أو ﻣﺎ ﻳﺳ ـ ـ ـ ـ ـ ــﻣﻰ‬
‫ﺑﻠﻐﺎت اﻟﺑرﻣﺟﺔ اﻹﺟراﺋﻳﺔ ﻛﺎﻟﺑﺎﺳﻛﺎﻝ‪ ،‬ﻋﻠﻰ ﺳﺑﻳﻝ اﻟﻣﺛﺎﻝ‪.‬‬

‫أﻫداف اﻟوﺣدة‬
‫ﻳﺗوﻗﻊ ﻣﻧك‪ ،‬ﻋزﻳزي اﻟدارس‪ ،‬ﻋﻧد ﻓراﻏك ﻣن دراﺳﺔ ﻫذﻩ اﻟوﺣدة‪ ،‬أن ﺗﻛون ﻗﺎد اًر ﻋﻠﻰ أن ‪:‬‬
‫‪ .1‬ﺗﺻﻣم ﻣﺎ ﻳﺳﻣﻰ ﺑﺷﺟرة اﻷﺻﻧﺎف اﻟﻬرﻣﻳﺔ ﺑﺣﻳث ﺗﻘﻠﻝ اﻟﺣﺎﺟﺔ إﻟﻰ إﻋﺎدة ﻛﺗﺎﺑﺔ دواﻝ ﺟدﻳدة ﻗدر اﻹﻣﻛﺎن‪.‬‬
‫‪ .2‬ﺗﻌرف أﺻﻧﺎﻓًﺎ ﺟدﻳدة ﻣﺷﺗﻘﺔ ﻣن أﺻﻧﺎف أﺧرى ﻣﻔردة أو ﻣﺗﻌددة‪.‬‬
‫‪ .3‬ﺗﺑﻳن أﻧواع اﻟوراﺛﺔ اﻟﻣﺧﺗﻠﻔﺔ وﻛﻳف ﺗﺳﺗﺧدﻣﻬﺎ‪.‬‬
‫‪ .4‬ﺗﻌرف دواﻝ ﻗﺎﻟﺑﻳﺔ ‪ Template Functions‬وﺗﺳﺗﺧدﻣﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ‪.‬‬
‫‪ .5‬ﺗﻌرف ﺻﻧﻔﺎً ﻗﺎﻟﺑﻳﺎً ‪ Template Class‬وﺗﻌرف ﻛﻳف ﺗﺳﺗﺧدﻣﻪ ﻟﻌﻣﻝ أﺻﻧﺎف ﺟدﻳدة‪.‬‬
‫‪ .6‬ﺗﻌرف ﻛﻳف وﻣﺗﻰ ﺗﺳﺗﺧدم ﺧﺎﺻﻳﺔ ﺗﻌدد اﻷوﺟﻪ ‪ polymorphism‬اﻟﻣﻬﻣﺔ‪.‬‬

‫اﻟوراﺛﺔ اﻟﻣﻧﻔردة ‪:Single Inheritance‬‬


‫ﻟو ﻓرﺿﻧﺎ ان ﻟدﻳﻧﺎ اﻟﺻﻧف ‪ Shape‬واﻟذي ﻳﻌﺗﺑر اﻟﺻﻧف اﻷﺳﺎس ﻷي ﺷﻛﻝ ﻫﻧدﺳﻲ ﻓﺈﻧﻪ ﻳﻣﻛﻧﻧﺎ أن ﻧﻛﺗب‬
‫اﻟﺻﻧف ‪ Rectangle‬واﻟذي ﻳﻣﺛﻝ اﻟﻣﺳﺗطﻳﻝ ﺑﺄن ﻳﻛون ﻣﺷﺗﻘﺎ )أن ﻳرث( ﻣن اﻟﺻﻧف ‪ ،Shape‬أدرس اﻟﻣﺛﺎﻝ‬
‫اﻟﺗﺎﻟﻲ وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب‪:‬‬

‫>‪#include <iostream‬‬
‫>‪#include <conio.h‬‬

‫‪// Base class‬‬


‫‪class Shape‬‬
‫{‬
‫‪public:‬‬
‫)‪void setWidth(int w‬‬
‫{‬
‫;‪width = w‬‬
‫}‬
‫)‪void setHeight(int h‬‬
‫{‬
‫;‪height = h‬‬
‫}‬
‫‪protected:‬‬
int width;
int height;
};

// Derived class
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};

int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);

// Print the area of the object.


cout << "Total area: " << Rect.getArea() << endl;
getch();
}

:‫ﻧﺎﺗﺞ ﺗﻧﻔﻳذ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻫو‬


Total area: 35

:Multiple Inheritance ‫اﻟوراﺛﺔ اﻟﻣﺗﻌددة‬


.‫أدرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳوﺿﺢ ﻣﻔﻬوم اﻟوراﺛﺔ اﻟﻣﺗﻌددة وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب‬
#include <iostream>
#include <conio.h>

// Base class Shape


class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};

// Base class PaintCost


class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};

// Derived class
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};

int main(void)
{
Rectangle Rect;
int area;

Rect.setWidth(5);
Rect.setHeight(7);

area = Rect.getArea();

// Print the area of the object.


cout << "Total area: " << Rect.getArea() << endl;

// Print the total cost of painting


cout << "Total paint cost: $" << Rect.getCost(area) << endl;

getch();
}

:‫ﻧﺎﺗﺞ ﺗﻧﻔﻳذ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻫو‬


‫‪Total area: 35‬‬
‫‪Total paint cost: $2450‬‬

‫ﺗﻣرﻳن)‪ :(1‬اﻛﺗب اﻟﻧص اﻟﺑرﻣﺟﻲ اﻟذي ﻳﺣﻘق اﻟوراﺛﺔ اﻟﻣﻧﻔردة اﻟﻣوﺿﺣﺔ ﻓﻲ اﻟﺷﻛﻝ اﻟﺗﺎﻟﻲ ﻋﻠﻣﺎ ﺑﺎن اﻟﺻﻧﻔﺎن‬
‫اﻟﻣﺷﺗﻘﺎن ﻳﺣﺗوﻳﺎن دواﻝ ﺣﺳﺎب اﻟﻣﺳﺎﺣﺔ‪.‬‬

‫‪CPolygon‬‬
‫‪width : Integer‬‬
‫‪height : Integer‬‬

‫)(‪set_values‬‬

‫‪CRectangle‬‬ ‫‪CTriangle‬‬

‫)( ‪area‬‬ ‫)( ‪area‬‬

‫ﻣﺳﺎﻋدة‪ :‬اﻟﻧص اﻟﺑرﻣﺟﻲ ﻟﻠﺻﻧف ‪ CPolygon‬ﻫو‪:‬‬

‫‪// derived classes‬‬


‫>‪#include <iostream‬‬
‫>‪#include <conio.h‬‬
‫{ ‪class CPolygon‬‬
‫‪protected:‬‬
‫;‪int width, height‬‬
‫‪public:‬‬
‫)‪void set_values (int a, int b‬‬
‫};‪{ width=a; height=b‬‬
‫;}‬

‫ﻋرﻓﻧﺎ ﺻﻧﻔﺎ أﺳﺎﺳﻳﺎ اﺳﻣﻪ ‪ COutput‬وأردﻧﺎ ﻣن اﻟﺻﻧﻔﻳن ‪CTriangle, CRectangle‬‬


‫ﺗﻣرﻳن)‪ :(2‬ﻟو ّ‬
‫أن ﻳرﺛﺎ ﻣن ﻫذا اﻟﺻﻧف ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ اﻟوراﺛﺔ ﻣن اﻟﺻﻧف ‪ CPolygon‬اﻟﺳﺎﺑق‪ .‬اﻋﻣﻝ اﻟﺗﻌدﻳﻝ اﻟﻼزم‬
‫ﻋﻠﻰ اﻟﺑرﻧﺎﻣﺞ اﻟﺳﺎﺑق ﻟﺗﺣﻘﻳق ﻣﻔﻬوم اﻟوراﺛﺔ اﻟﻣﺗﻌددة‪.‬‬
‫ﻣﺳﺎﻋدة‪ :‬ﺗﻌرﻳف اﻟﺻﻧف ‪ COutput‬ﻫو‪:‬‬

‫{ ‪class COutput‬‬
‫‪public:‬‬
void output (int i);
};

Polymorphism ‫ﺗﻌدد اﻻوﺟﻪ‬


‫ ﻻﺣظ ﻧﺎﺗﺞ اﻟﺗﻧﻔﻳذ ﺛم‬.C++ ‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳﺑﻳن ﻣﻔﻬوم اﻟوراﺛﺔ اﻟﻣﺗﻌددة وﻧﻔذﻩ ﺑﺎﺳﺗﺧدام ﻣﺗرﺟم‬
.‫أﺟب ﻋن اﻟﺳؤاﻝ اﻟذي ﻳﻠﻳﻪ‬
#include <iostream>
#include <conio.h>
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height / 2);
}
};
// Main function for the program
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);

// store the address of Rectangle


shape = &rec;
// call rectangle area.
shape->area();

// store the address of Triangle


shape = &tri;
// call triangle area.
shape->area();
getch();
}
‫ﻧﺎﺗﺞ ﺗﻧﻔﻳذ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻫو‬
Parent class area
Parent class area

‫ وﻳﻌطﻲ‬Polymorphism ‫ أﻋﻣﻝ اﻟﺗﻌدﻳﻝ اﻟﻼزم ﻋﻠﻰ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻟﻳﺣﻘق ﻣﻔﻬوم ﺗﻌدد اﻻوﺟﻪ‬:(3) ‫ﺗﻣرﻳن‬
:‫اﻟﻧﺗﻳﺟﺔ اﻟﺗﺎﻟﻳﺔ‬
Rectangle class area
Triangle class area

:‫اﻟﻘواﻟب‬

.‫ واﻟﺗﻲ ﺗﻌﻣﻝ ﻋﻠﻰ ﺗﺑدﻳﻝ ﻣﺗﻐﻳران ﻣن ﻧوع ﻛﺎﺋن ﻣن ﻧﻔس اﻟﺻﻧف‬Swap ‫اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﻳﻌرف ﻗﺎﻟﺑﺎ ﻟﻠداﻟﺔ‬

template <class Type>


void Swap (Type &x, Type &y)
{
Type tmp = x;
x = y;
y = tmp;
}
‫ﺗﻣرﻳن)‪ :(4‬اﻛﺗب ﻗﺎﻟﺑﺎ ﻟﻠداﻟﺔ ‪ GetMax‬واﻟﺗﻲ ﺗﻌﻳد أﻛﺑر ﻛﺎﺋن ﻣن اﻟﻛﺎﺋﻧﻳن اﻟﻣﻣررﻳن إﻟﻳﻬﺎ‪ ،‬ﺛم اﺳﺗدع ﻫذﻩ‬
‫اﻟداﻟﺔ ﻣرﺗﻳن‪ ،‬اﻷوﻟﻰ ﻟﻣﻘﺎرﻧﺔ ﻋددﻳن ﺻﺣﻳﺣﻳن ‪ ،‬وﻣرة أﺧرى ﻟﺗﻘﺎرن ﻋددﻳن ﻣن ﻧوع ‪.float‬‬

‫ﺗﻣرﻳن)‪ :(5‬اﻛﺗب اﻟﻘﺎﻟب ‪ GetMin‬واﻟذي ﻳﻘﺑﻝ ﻧوﻋﻳن ﻣﺧﺗﻠﻔﻳن ﻣن اﻟﺑﻳﺎﻧﺎت‪ .‬وﻗم ﺑﺗﻧﻔﻳذﻩ‪.‬‬

‫ﺗﻣرﻳن)‪ :(6‬اﻛﺗب ﺻﻧﻔﺎ ﻳﻘﺑﻝ أﻋﺿﺎء ﻣن أﻧواع ﻋﺎﻣﺔ وﻳﺳطﻳﻊ أن ﻳﺧزن ﻋﻧﺻرﻳن ﻣن أي ﻧوع ﻣﻘﺑوﻝ وﻳﺣﺗوي‬
‫داﻟﺔ ﺗﻌﻳد أﻛﺑر ﻗﻳﻣﺔ‪.‬‬
‫ﺣﻠوﻝ ﺗﻣرﻳﻧﺎت اﻟوﺣدة اﻟﺧﺎﻣﺳﺔ‬
:(1) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// derived classes
#include <iostream>
#include <conio.h>
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};

class CRectangle: public CPolygon {


public:
int area (void)
{ return (width * height); }
};
class CTriangle: public CPolygon {
public:
int area (void)
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
cout << rect.area() << endl;
cout << trgl.area() << endl;
getch();
}

:(2) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// multiple inheritance
#include <iostream>
#include <conio.h>
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};
class COutput {
public:
void output (int i);
};
void COutput::output (int i) {
cout << i << endl;
}
class CRectangle: public CPolygon, public
COutput {
public:
int area (void)
{ return (width * height); }
};
class CTriangle: public CPolygon, public
COutput {
public:
int area (void)
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
rect.output (rect.area());
trgl.output (trgl.area());
getch();
}

‫ ﺑﺄن ﻳﺳﺑق ﺗﻌرﻳﻔﻬﺎ اﻟﻛﻠﻣﺔ‬Shape ‫ ﻓﻲ اﻟﺻﻧف‬area ‫ اﻟﺗﻌدﻳﻝ ﻫو ﻋﻠﻰ ﺗﻌرﻳف اﻟداﻟﺔ‬:(3) ‫ﺣﻝ اﻟﺗﻣرﻳن‬
.Polymorphism ‫ ﻣن أﺟﻝ ﺗﺣﻘﻳق ﻣﻔﻬوم ﺗﻌدد اﻷﺷﻛﺎﻝ‬virtual

class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
virtual int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};

:(4) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// function template
#include <iostream>
#include <conio.h>
template <class S>
S GetMax (S a, S b) {
S result;
return ( result = (a>b)? a : b );
}
int main () {
int i=5, j=6, k;
float l=10.0, m=5.0, n;
k=GetMax<int>(i,j);
n=GetMax<float>(l,m);
cout << k << "\n" << n << endl;
getch();
}

:(5) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// function template
#include <iostream>
#include <conio.h>
template <class T, class U>
T GetMin (T a, U b) {
return ( a < b ? a : b ) ;
}
int main () {
int i=5, j=6, k;
float l=10.0, m=5.0, n;
k = GetMin<int,float> (j,l);
n = GetMin (j,l);
cout << k << "\n" << n << endl;
getch();
}

:(6) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// class templates
#include <iostream>
#include <conio.h>
template <class T>
class mypair {
T a, b;
public:
mypair (T first, T second)
{a=first; b=second;}
T getmax ();
};
template <class T>
T mypair<T>::getmax ()
{
T retval;
retval = a>b? a : b;
return retval;
}
int main () {
mypair <int> myobject (100, 75);
cout << myobject.getmax()<<endl;
getch();
}
‫اﻟﻮﺣﺪة اﻟﺴﺎدﺳﺔ‬
‫معالجة الملفات بلغة ‪C++‬‬
‫‪File Processing with C++‬‬

‫ﻋﻣﺎ ﻳﺗﻌﻠق ﺑﻣﻌﺎﻟﺟﺔ اﻟﻣﻠﻔﺎت ﻓﻲ‬


‫ﻋزﻳزي اﻟدارس‪ ،‬ﺗﻬدف ﻫذﻩ اﻟوﺣدة إﻟﻰ إﻋطﺎﺋك ﻣﻌﻠوﻣﺎت أﺳ ـ ــﺎﺳ ـ ــﻳﺔ ّ‬
‫ﻟﻐﺔ ‪ C ++‬وﺗوﺿﻳﺢ ﺑﻌض اﻟﻌﻣﻠﻳﺎت اﻷﺳﺎﺳﻳﺔ ﻋﻠﻰ اﻟﻣﻠﻔﺎت ﺑﺄﻧواﻋﻬﺎ اﻟﻣﺧﺗﻠﻔﺔ‪.‬‬

‫ﺗﺗﻧــﺎوﻝ ﻫــذﻩ اﻟوﺣــدة ﺗﻌرﻳف ﻣﻔﻬوم ﻫﻳﻛــﻝ اﻟﺑﻳــﺎﻧــﺎت وﻣوﻗﻊ اﻟﻣﻠﻔــﺎت ﺑﻳﻧﻬــﺎ ٕواﻋطــﺎء ﻟﻣﺣــﺔ ﻣﺧﺗﺻ ـ ـ ـ ـ ـ ــرة ﻋن‬
‫اﻷﻧواع اﻟﻣﺧﺗﻠﻔﺔ ﻣن اﻟﺑﻳﺎﻧﺎت‪ .‬وﻳﺗﻠو ذﻟك ﻣﻧﺎﻗﺷﺔ اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻓﻲ ﺗﻧظﻳم اﻟﻣﻠﻔﺎت وﺗﻌرﻳف اﻟﻣﻠﻔﺎت واﻟﻳﻧﺎﺑﻳﻊ‪،‬‬
‫وﻣن ﺛم ﺗوﺿــﻳﺢ ﻛﻳﻔﻳﺔ إﻧﺷــﺎء اﻟﻣﻠﻔﺎت اﻟﺗﺗﺎﺑﻌﻳﺔ واﻟﻌﺷ ـواﺋﻳﺔ وﻗراءﺗﻬﺎ وﺗﺣدﻳﺛﻬﺎ‪ ،‬وأﺧﻳ اًر ﺗم ﺗوﺿ ــﻳﺢ ﻛﻳﻔﻳﺔ اﻟﺗﻌﺎﻣﻝ‬
‫ﻣﻊ اﻟﻛﺎﺋﻧﺎت ﻣن ﺣﻳث اﻹدﺧﺎﻝ واﻹﺧراج ﻓﻲ اﻟﻣﻠﻔﺎت‪.‬‬

‫أﻫداف اﻟوﺣدة‬
‫ﻳﻧﺗظر ﻣﻧك‪ ،‬ﻋزﻳزي اﻟدارس‪ ،‬ﺑﻌد ﻓراﻏك ﻣن دراﺳﺔ ﻫذﻩ اﻟوﺣدة‪ ،‬أن ﺗﻛون ﻗﺎد اًر ﻋﻠﻰ أن‪:‬‬

‫ﺗﻌرف ﻫﻳﻛﻝ اﻟﺑﻳﺎﻧﺎت وﻣوﻗﻊ اﻟﻣﻠﻔﺎت ﺑﻳﻧﻬﺎ‪.‬‬


‫‪ّ .1‬‬

‫ﺗﻌرف اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻓﻲ ﺗﻧظﻳم اﻟﻣﻠﻔﺎت )‪  .(File Organization‬‬


‫‪ّ .2‬‬

‫ﺗﻌرف اﻟﻣﻠﻔﺎت واﻟﻳﻧﺎﺑﻳﻊ )‪  (Files and Streams‬‬


‫‪ّ .3‬‬

‫‪ .4‬ﺗﻧﺷﺊ اﻟﻣﻠﻔﺎت اﻟﺗﺗﺎﺑﻌﻳﺔ وﺗﻘرؤﻫﺎ وﺗﺣدﺛﻬﺎ‪  .‬‬

‫‪ .5‬ﺗﻧﺷﺊ اﻟﻣﻠﻔﺎت اﻟﻌﺷواﺋﻳﺔ وﺗﻘرؤﻫﺎ وﺗﺣدﺛﻬﺎ‪  .‬‬

‫‪ .6‬ﺗدﺧﻝ اﻟﻛﺎﺋﻧﺎت وﺗﺧرﺟﻬﺎ )‪.(Input/Output of Objects‬‬


‫ أدرس اﻟﻣﺛﺎﻝ اﻟﻣﻛﺗوب وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب ﺛم ﻗم ﺑﻣﺎ‬،‫اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﻳوﺿﺢ ﻛﻳﻔﻳﺔ اﻟﻘراءة واﻟﻛﺗﺎﺑﺔ ﻓﻲ ﻣﻠف‬
:‫ﻳﻠﻲ‬
.‫ أدﺧﻝ اﻟﺑﻳﺎﻧﺎت اﻟﻣطﻠوﺑﺔ أﺛﻧﺎء اﻟﺗﻧﻔﻳذ‬-1
.(‫ أﻧظر ﻧﺎﺗﺞ اﻟﺗﻧﻔﻳذ ﻋﻠﻰ اﻟﺷﺎﺷﺔ )ﺳﻳظﻬر ﻣن ﺿﻣﻧﻬﺎ اﻟﻣﻌﻠوﻣﺎت اﻟﺗﻲ ﻗﻣت ﺑﺈدﺧﺎﻟﻬﺎ‬-2
.‫ ﻋﻠﻰ ﻣﺟﻠد اﻟﻌﻣﻝ‬afile.dat ‫ ﺑﻌد ﺗﻧﻔﻳذ اﻟﺑرﻧﺎﻣﺞ ﺳﻳﺗم اﻧﺷﺎء ﻣﻠف ﺑﺎﺳم‬-3
‫ ﻣﺎ ﻣﺣﺗوﻳﺎت اﻟﻣﻠف؟‬،‫ ﻣﺛﻼ‬notepad ‫ ﺑواﺳطﺔ ﻣﺣرر ﻧﺻوص ﻣﺛﻝ ﺑرﻧﺎﻣﺞ‬afile.dat ‫اﻓﺗﺢ اﻟﻣﻠف‬-4

#include <fstream>
#include <iostream>
#include <conio.h>
int main ()
{
char data[100];
// open a file in write mode.
ofstream outfile;
outfile.open("afile.dat");

cout << "Writing to the file" << endl;


cout << "Enter your name: ";
cin.getline(data, 100);

// write inputted data into the file.


outfile << data << endl;

cout << "Enter your age: ";


cin >> data;
cin.ignore();

// again write inputted data into the file.


outfile << data << endl;

// close the opened file.


outfile.close();

// open a file in read mode.


ifstream infile;
infile.open("afile.dat");

cout << "Reading from the file" << endl;


infile >> data;
‫‪// write the data at the screen.‬‬
‫;‪cout << data << endl‬‬

‫‪// again read the data from the file and display it.‬‬
‫;‪infile >> data‬‬
‫;‪cout << data << endl‬‬

‫‪// close the opened file.‬‬


‫;)(‪infile.close‬‬

‫;)(‪getch‬‬
‫}‬

‫ﺗﻣرﻳن )‪ :(1‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻟﻛﺗﺎﺑﺔ ﻧﺻﺎ ﻓﻲ ﺳطرﻳن داﺧﻝ ﻣﻠف ‪ .example.txt‬ﻣوﺿﺣﺎ ﻛﻳﻔﻳﺔ ﻓﺗﺢ اﻟﻣﻠف‬
‫ﻟﻠﻛﺗﺎﺑﺔ دون ﻣﺳﺢ ﻣﺣﺗوﻳﺎت اﻟﻣﻠف إن ﻛﺎن ﻣوﺟودا ﻣن ﻗﺑﻝ‪.‬‬

‫ﺗﻣرﻳن )‪ :(2‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻘراءة ﻣﺣﺗوﻳﺎت اﻟﻣﻠف اﻟﻣذﻛور ﻓﻲ اﻟﺗﻣرﻳن اﻟﺳﺎﺑق وطﺑﺎﻋﺔ ﻣﺣﺗوﻳﺎﺗﻪ ﻋﻠﻰ‬
‫اﻟﺷﺎﺷﺔ‪ٕ .‬وان ﻛﺎن اﻟﻣﻠف ﻏﻳر ﻣوﺟود ﻓﺈﻧﻪ ﻳطﺑﻊ رﺳﺎﻟﺔ ﺗﺑﻳن ذﻟك‪.‬‬

‫ﺗﻣرﻳن )‪ :(3‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻟﺣﺳﺎب ﺣﺟم اﻟﻣﻠف ‪example.txt‬‬

‫ﺗﻣرﻳن )‪ :(4‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻛﺗﺎﺑﺔ ﻋدد ﻣن ﺳﺟﻼت طﻠﺑﺔ ﻓﻲ ﻣﻠف ﻋﺷواﺋﻲ‪ ،‬ﺣﻳث ﻳﺗوﻗف اﻟﺑرﻧﺎﻣﺞ‬
‫ﻋﻧدﻣﺎ ﻳﻘوم اﻟﻣﺳﺗﺧدم ﺑﺈدﺧﺎﻝ رﻗم طﺎﻟب أﻗﻝ ﻣن ‪ 0‬أو أﻛﺑر ﻣن ‪ ، 100‬وﻫﻲ ﻣﺟﻣوﻋﺔ أرﻗﺎم اﻟطﻠﺑﺔ اﻟﻣراد‬
‫اﻧﺷﺎء ﺳﺟﻼت ﻟﻬم‪.‬‬
‫ﻣﻼﺣظﺔ‪ :‬ﺑﻌد ﻛﺗﺎﺑﺔ اﻟﺑرﻧﺎﻣﺞ وﺗﻧﻔﻳذﻩ ﺑﻧﺟﺎح‪ ،‬ﺣﺎوﻝ ﻓﺗﺢ اﻟﻣﻠف اﻟﻣﻧﺷﺄ ﺑواﺳطﺔ ﻣﺣرر ﻧﺻوص ﺛم ﻻﺣظ ﻛﻳف‬
‫ﺗظﻬر ﻣﺣﺗوﺑﺎت اﻟﻣﻠف!!‬

‫ﺗﻣرﻳن )‪ :(5‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻘراءة ﻋدد ﻣن اﻟﺳﺟﻼت ﻣن ﻣﻠف اﻟﺗﻣرﻳن اﻟﺳﺎﺑق ﺑﺎﺳﺗﺧدام اﻟداﻟﺔ ‪read‬‬
‫واﻟداﻟﺔ ‪. seekg‬‬
‫ﺣﻠوﻝ ﺗﻣرﻳﻧﺎت اﻟوﺣدة اﻟﺳﺎدﺳﺔ‬
:(1) ‫ﺣﻝ ﺗﻣرﻳن‬
// writing on a text file
#include <iostream>
#include <fstream>
int main () {
ofstream myfile ("example.txt", ios::app);
if (myfile.is_open())
{
myfile << "This is a line.\n";
myfile << "This is another line.\n";
myfile.close();
}
else cout << "Unable to open file";
return 0;
}

:(2) ‫ﺣﻝ اﻟﺗﻣرﻳن‬


// reading a text file
#include <iostream>
#include <fstream>
#include <string>

int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}

else cout << "Unable to open file";


return 0;
}
:(3) ‫ﺣﻝ اﻟﺗﻣرﻳن‬
// obtaining file size
#include <iostream>
#include <fstream>

int main () {
long begin, end;
ifstream myfile ("example.txt");
begin = myfile.tellg();
myfile.seekg (0, ios::end);
end = myfile.tellg();
myfile.close();
cout << "size is: " << (end-begin) << " bytes.\n";
return 0;
}

:(4) ‫ﺣﻝ ﺗﻣرﻳن‬


#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>

//using namespace std;


const int No_Of_Records =100;
struct student
{
int no;
char name[32];
float average;
};

int main(void)
{
student studentrecord;
int sno;
char sname[32];
float saverage;
ofstream outStudentFile("studrf.dat",ios::in|ios::out|ios::binary);
if(!outStudentFile)
{
cerr << "File could not be opened" << endl;
exit(1);
}
cout <<"\nEnter student no (1 to 100), any number else to end input: ";
cin >> sno;
while(sno >0 && sno<=No_Of_Records)
{
cout << "\nEnter student name: ";
cin >> sname;
cout << "\nEnter student average: ";
cin >> saverage;
studentrecord.no=sno;
strcpy(studentrecord.name,sname);
studentrecord.average=saverage;
outStudentFile.seekp((studentrecord.no-1)* sizeof(struct student));
outStudentFile.write(reinterpret_cast <const char *>
(&studentrecord),sizeof(struct student));
cout <<"\n\nEnter student no (1 to 100), any number else to end input: ";
cin >> sno;
} // end while
outStudentFile.close();
return 0;
}

:(5) ‫ﺣﻝ اﻟﺗﻣرﻳن‬


#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
const int No_Of_Records =100;
int main(void)
{
struct student
{
int no;
char name[32];
float average;
};
student studentrecord;
int sno;
ifstream inStudentFile("studrf.dat",ios::in);
if(!inStudentFile)
{
cerr << "File could not be opened" << endl;
exit(1);
}
cout <<"\nEnter student no (1 to 100), any number else to end displaying records: ";
cin >> sno;
while (sno >0 && sno<=No_Of_Records)
{
inStudentFile.seekg((sno-1)* sizeof(struct student));
inStudentFile.read(reinterpret_cast <char *>
(&studentrecord),sizeof(struct student));
cout << "\nStudent Data for student no " << studentrecord.no;
cout << "\nName: " << studentrecord.name;
cout << "\nAverage: " << studentrecord.average;
cout <<"\n\nEnter student no (1 to 100), any number else to end displaying records: ";
cin >> sno;
} // end while
inStudentFile.close();
return 0;
}
‫اﻟﻤﻼﺣﻖ‬
‫إعداد بيئة التطوير‬
‫‪Preparing Integrated Development‬‬
‫‪Environment‬‬
‫ﻣﻘدﻣﺔ‪:‬‬
‫عزيزي الطالب‪ ،‬إن أھم ما تحتاجه قبل الدخول في عالم البرمجة ھو‪ :‬برنامج تحرير النصوص‪ :‬لتكتب فيه‬
‫برنامج بلغة الـ ‪ C‬أو الـ ‪ ،C++‬المصنف من أن يح ّول المصدر للغة مزدوجة‪ .‬المكتشف و الذي يحدد لك‬
‫أخطائك التي تقع فيھا أثناء كتابتك للبرنامج‪ .‬يمكننا ‪ -‬عزيزي الطالب – أن نحصل على برنامج "‪ 3‬في واحد"‬
‫يقوم باألعمال الثالثة في آن واحد‪ ،‬و ھذا النوع من البرامج نسميھا الـ ‪ IDE‬أو ما يعرف ببيئات التطوير‪.‬‬

‫عزيزي الطالب‪ ،‬توجد الكثير من بيئات التطوير)‪ (IDEs‬المعتمدة ومنھا برنامج ‪ Code::Blocks‬و برنامج‬
‫‪ Visual C++ Express‬ويعتبران من البرامج المجانية‪ ،‬كما يوجد برامج أخرى مثل ‪Borland C++‬‬
‫وبرنامج ‪ Visual C++‬وأخرى عديدة غير مجانية‪.‬‬

‫في ھذه الوحدة – عزيزي الطالب – سنتطرق إلى شرح كيفية إعداد واستخدام بيئات التطوير التالية‪:‬‬
‫‪) Code::Blocks -‬مجاني ومفتوح المصدر(‬
‫‪ Visual C++ -‬من شركة ميكروسوفت وھو غير مجاني‪ ،‬ولكن الشركة أصدرت نسخة مجانية منه اسمھا‬
‫‪.Visual C++ Express‬‬

‫اﻟﻘﺳم اﻷوﻝ‪ :‬ﺗﺣﻣﻳﻝ وﺗﻧﺻﻳب وﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ ‪Code::Blocks‬‬

‫في ھذا القسم –عزيزي الطالب‪ -‬إن شاء ﷲ سنتطرق لشرح مصور لبرنامج ‪. Code::Blocks‬‬
‫البعض يعتبره البرنامج االكثر سھولة في االستخدام والسالسة‪ ،‬كما أنه يعمل جيدا على وندوز‪ 7‬على عكس‬
‫بعض من البرامج األخرى‪.‬‬
‫برنامج الـ ‪ :Code::Blocks‬ھو ‪ IDE‬مالئم جدا‪ ،‬مجاني و يعمل على الـ‪ ،Windows‬و الـ‪،Mac OS‬‬
‫والـ‪ .Linux‬لغته المتوفرة حاليا ھي االنجليزية‪.‬‬

‫يحتوي ھذا القسم على المواضيع التالية‪:‬‬


‫‪ -‬تحميل ملف التنصيب‪.‬‬
‫‪ -‬شرح عملية تنصيب البرنامج‬
‫‪ -‬شرح واجھة البرنامج‬
‫‪ -‬تشغيل البرنامج من خالل إنشاء مشروع جديد و تطبيق مثال بسيط‬
‫‪ .1‬تحميل ملف التنصيب‪:‬‬
‫يمكنك تحميل ملف تنصيب البرنامج إلى جھازك من خالل النقر على الرابط التالي‪:‬‬
‫‪http://www.codeblocks.org/downloads/binaries‬‬

‫‪ .2‬شرح عملية التنصيب‪:‬‬


‫بعد تحميل ملف التنصيب‪ ،‬انقر عليه لتشغيله‪.‬‬

‫صورة ‪ :1‬الملف الذي قمنا بتحميله‬


‫ھنا أنھى التنصيب ويسألك بأن يقوم بتشغيل البرنامج؟ انقر ‪.NO‬‬

‫تم تنصيب البرنامج بنجاح‪ ،‬نقوم بفتح البرنامج‪.‬‬


‫ستجده في قائمة ابدأ‪.‬‬
‫‪ .3‬شرح واجھة التطبيق‬
‫شرح دالالت االرقام‪:‬‬

‫‪ -1‬شريط األدوات‬

‫‪ -2‬قائمة ملفات المشروع ‪ :‬توجد بيسار النافذة‪ ،‬تحتوى على كل ملفات السورس المتعلقة بالبرنامج الذي‬
‫تعمل عليه‪ .‬و بما أنھا فارغة حسب ما يظھر في الصورة ھذا دليل على عدم وجود مصادر سورس‬
‫في الالئحة حتى ھذه اللحظة‪.‬‬

‫‪ -3‬المنطقة الرئيسية ‪ :‬ھنا المساحة التي تكتب فيھا الكودسورس للغتك الـ ‪.C++‬‬

‫‪ -4‬منطقة البيان‪ :‬و يسميھا المبرمجون منطقة الموت‪ ،‬و ھي المنطقة التي تعرض لك األخطاء التي‬
‫وقعت فيھا أثناء كتابتك للكود سورس‪ ،‬طبعا متسلسلة بانتظام‪.‬‬
‫ما يھمنا اآلن ھو منطقة معينة خاصة من شريط األدوات‬

‫‪1-Compile :‬‬

‫كل الكود سورس الخاصة ببرنامجكم ستبعث لمصنف يقوم بالترجمة ثم يستخرج لنا الـ ‪ Code::Blocks‬ملفا‬
‫قابل للتنفيذ أو باألحرى ملف تنفيذي‪ .‬لكن إن اقترفت خطأ في الكتابة لن يترجم لك المصنف شيئا و ستظھر‬
‫األخطاء في منطقة البيان‪.‬‬

‫‪2- Execute :‬‬

‫تقوم بتشغيل آخر ملف تنفيذي قمت بكتابة الكود السورس الخاص به‪ .‬و ھذا عندما تريد تجريب البرنامج قبل‬
‫االنتھاء منه‪ .‬وستعرف بنفسك أنه قبل التشغيل ‪ Execute‬يجب الترجمة ‪ Compile‬ولكى نجرب ما توصلنا‬
‫إليه نضغط على األيقونة ‪.3‬‬

‫‪3- Compile & Execute:‬‬


‫لن تحتاج عبقرية زائدة لتعرف ماذا يمثل جمع وظيفتي األيقونتين السابقتين‪ ،‬أضف لمعلوماتك ‪-‬عزيزي‬
‫الطالب‪ -‬أنھا األيقونة التي سنكثر من استخدامھا أكثر من باقيھا‪ ،‬و أكرر ثانية بأنه إذا اقترفت خطأ في وضع‬
‫الكود سورس لن يتم ترجمة األكواد و ال تشغيل البرنامج! بل سيكون عليك تصحيح قائمة من األكواد التي‬
‫سبق و أخطأت فيھا‪.‬‬

‫‪4- Recompile everything:‬‬

‫عندما نقوم بالـ"ترجمة" فإن ‪ Code::Blocks‬لن يقوم بتشغيل سوى الملفات التي ّعدلت عليھا أو أضفتھا‪.‬‬
‫أحيانا فقط‪ ،‬تضطر بأن تأمر الـ ‪ Code::Blocks‬بترجمة و تشغيل كل شيء ‪.Recompile everything‬‬

‫اآلن سنتطرق للمرحلة األھم في البرنامج وھي تشغيل البرنامج‪.‬‬

‫‪ .4‬ﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ ‪ :Code blocks‬ﺑداﻳﺔ ﻣﺷروع ﺟدﻳد‬

‫على المستخدم انشاء مشروع جديد خاص به‬


‫الشرح كالتالي‪:‬‬

‫كي تبدأ مشروعا جديدا‪ ،‬توجه نحو ‪ ، : File / New / Project‬ستظھر لك نافذة اختر منھا ‪"Console‬‬
‫"‪application‬‬
‫كما تالحظ‪-‬عزيزي الطالب‪ ،‬برنامج الـ ‪ Code::Blocks‬يسمح بالعمل على أنماط كثيرة من البرامج‬
‫المختلفة‪ ،‬منھا التي تعمل بمكتبات مشھورة كالـ ‪ SDL‬للـ ‪ 2D‬و ألـ ‪ OpenGL‬للـ ‪ 3D‬و الـ ‪Qt‬‬
‫و ‪ wxWidgets‬للـ نوافذ ‪ ..‬إلخ‪ ،‬ھذه المكتبات غير مثبتة على جھازكم بعد‪ ،‬و بھذا ال يمكنكم جعلھا تعمل‪.‬‬

‫سنبدأ أ ّوال بالـ "‪:"Console‬‬

‫أنقر على "‪ "Go‬للشروع في المشروع الجديد‪.‬‬

‫بعدھا سيأتيك اختيار بين لغتي الـ ‪ C‬أو الـ ‪ ،C++‬اختر الـ ‪.C++‬‬
‫سيطلب منك اآلن أن تدخل اسم المشروع‪ ،‬و كذا المسار الذي تختاره كي يحفظ فيه‪.‬‬
‫آخر خطوة تطلب منك ھي ‪ ،‬كيف ينبغى أن يترجم البرنامج‪ ،‬يمكنك ترك االختيارات على حالھا‪ ،‬لن يكون‬
‫لھذا أي تأثير على ما سنقوم به اآلن‪ ،‬قم بتحديد زر‪"Release" .‬‬

‫إظغط على ‪ ، Finish‬إنتھى ! ‪ .‬ماالذي قمنا به اآلن يا ترى ؟‬


‫لقد قام البرنامج ‪ Code::Blocks‬بفتح مشروع جديد لنا مع احتواءه بعض الكود سورس التي سنحتاجھا‪.‬‬

‫في الخانة الخاصة بالمشاريع على اليسار‪ ،‬إضغط على '‪ '+‬لتوسيعھا قليال‪ ،‬و تظھر قائمة الملفات في‬
‫المشروع‪.‬‬
‫اآلن تم فتح مشروع خاص بك وما عليك اال بكتابة الكود والباقي على البرنامج‪،‬‬
‫سيقوم بفتح ملف تنفيذي يفتح بواسطة ال‪: MsDos‬‬
‫تشغيل مثال بسيط‪:‬‬

‫النتيجة‪:‬‬
‫اﻟﻘﺳم اﻟﺛﺎﻧﻲ‪ :‬ﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ ‪Microsoft Visual C++‬‬

‫ﻳﻣﻛﻧك ﻋزﻳزي اﻟطﺎﻟب ﺗﻧﻔﻳذ ﺑراﻣﺞ ﻟﻐﺔ ﺳﻲ ﺑﻠص ﺑﻠص ﺑﺎﺳﺗﺧدام اﻟﻌدﻳد ﻣن اﻟﻣﺗرﺟﻣﺎت ﻣﺛﻝ‪، Borland :‬‬
‫‪ Microsoft Visual Studio 6.0 ،Turbo c++‬ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو ﻧﻣط ‪ 6‬او اﺣدث ﻣن ذﻟك‪.‬‬

‫ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو‪Microsoft Visual Studio‬‬


‫ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو )ﺑﺎﻹﻧﺟﻠﻳزﻳﺔ ‪ : (Microsoft Visual Studio‬ﻫﻲ ﺑﻳﺋﺔ اﻟﺗطوﻳر اﻟﻣﺗﻛﺎﻣﻠﺔ‬
‫اﻟرﺋﻳﺳﻳﺔ ﻣن ﻣﺎﻳﻛروﺳوﻓت‪ .‬ﺗﺗﻳﺢ ﺑرﻣﺟﺔ واﺟﻬﺔ اﻟﻣﺳﺗﺧدم اﻟرﺳوﻣﻳﺔ واﻟﺑراﻣﺞ اﻟﻧﺻﻳﺔ إﻟﻰ ﺟﺎﻧب وﻳﻧدوز ﻓورم‬
‫وﻣواﻗﻊ وﻳب وﺗطﺑﻳﻘﺎت وﻳب وﺧدﻣﺎت اﻟوﻳب ﻣدﻋوﻣﺔ ب ﻣﺎﻳﻛروﺳوﻓت وﻳﻧدوز ووﻳﻧدوز ﻣوﺑﺎﻳﻝ ٕواطﺎر ﻋﻣﻝ‬
‫دوت ﻧت وﻣﺎﻳﻛروﺳوﻓت ﺳﻳﻠﻔرﻻﻳت‪.‬‬
‫ﻳﺣﺗوى ﻓﻳﺟواﻝ اﺳﺗودﻳو ﻋﻠﻰ ﻣﺣرر أﻛواد ﻳدﻋم ﺗﻘﻧﻳﺔ اﻧﺗﻠﻳﺳﻧس واﻋﺎدة ﻛﺗﺎﺑﺔ اﻟﻛود‪ ,‬وﻳﺣﺗوى أﻳﺿﺎ ﻋﻠﻰ ﻣﺗرﺟم‬
‫ﻳﻛﺷف أﺧطﺎء وﻗت اﻟﺗﺷﻐﻳﻝ وﻣﻔﺳر ﻳﻛﺷف اﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ ﻓﻲ اﻷﻛواد وﻳﺣﺗوى أﻳﺿﺎ ﻋﻠﻰ ﻣﺻﻣم ﻧﻣﺎذج‬
‫ﻟﺑﻧﺎء واﺟﻬﺔ ﻣﺳﺗﺧدم رﺳوﻣﻳﺔ وﻏﻳرﻫﺎ‪.‬‬
‫ﻳدﻋم ﻓﻳﺟواﻝ اﺳﺗودﻳو اﻟﻌدﻳد ﻣن ﻟﻐﺎت اﻟﺑرﻣﺟﺔ ﻣﺛﻝ ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟواﻝ ﺳﻲ‪ ++‬وﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟواﻝ ﺳﻲ‪#‬‬
‫وﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟواﻝ ﺑﻳﺳك وﺟﺎﻓﺎ ﺳﻛرﻳﺑت واﻟﻌدﻳد أﻳﺿﺎ ﻣن ﻟﻐﺎت اﻟﺗرﻣﻳز ﻣﺛﻝ ‪ html‬و‪ xml‬و ‪xhtml‬‬
‫و‪. xsl‬‬

‫ﻣﺣرر اﻷﻛواد‬
‫ﻣﺛﻝ ﺑﺎﻗﻰ ﺑﻳﺋﺎت اﻟﺗطوﻳر ﻳﺣﺗوى اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو ﻋﻠﻰ ﻣﺣرر أﻛواد ﻳدﻋم ﺗﻌﻠﻳم اﻟﺻﻳﻐﺔ واﻻﻛﻣﺎﻝ اﻟﺗﻠﻘﺎﺋﻰ‬
‫وﻳﺳﺗﺧدم أﻳﺿﺎ ﺗﻘﻧﻳﺔ اﻧﺗﻠﻳﺳﻧس ﻟﺗﺳﺎﻋد اﻟﻣﺑرﻣﺞ ﻓﻲ ﻛﺗﺎﺑﺔ اﻟﻣﺗﻐﻳرات واﻟدواﻝ واﻟوﺳﺎﺋﻝ واﻟدورات ﺑﺳرﻋﺔ‪ ،‬وﻳدﻋﻣﻬﺎ‬
‫اﻟﻣﺣرر ﻓﻲ ﻛﺗﺎﺑﺔ ﺟﻣﻳﻊ ﻟﻐﺎت اﻟﺑرﻣﺟﺔ واﻟﺗرﻣﻳز اﻟﺗﻲ ﻳﺣﺗوى ﻋﻠﻳﻬﺎ اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو‪.‬‬
‫ﻳدﻋم ﻣﺣرر أﻛواد ﻓﻳﺟواﻝ اﺳﺗودﻳو أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ وﺿﻊ ﻋﻼﻣﺎت ﻣرﺟﻌﻳﺔ ﻓﻲ اﻟﻛود ﻟﻠﻣﺳﺎﻋدة ﻓﻲ اﻟﺗﺻﻔﺢ اﻟﺳرﻳﻊ‪،‬‬
‫ﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ ‪ collapsing and expanding‬ﻣﺟﻣوﻋﺎت اﻷﻛواد واﻟﺑﺣث واﻻﺳﺗﺑداﻝ ﻓﻲ اﻟﻛود‪ ,‬وﻳدﻋم‬
‫أﻳﺿﺎ ‪ code snippets‬وﻫﻰ ﻗواﻟب ﺟﺎﻫزة ﻣن اﻟﻛود ﻳﻛﻣن ادراﺟﻬﺎ وادﺧﺎﻝ ﺗﻐﻳﻳرات ﻋﻠﻳﻬﺎ داﺧﻝ اﻟﻣﺷروﻋﺎت‬
‫اﻟﺟﺎرى اﻟﻌﻣﻝ ﻋﻠﻳﻬﺎ وﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ اﻋﺎدة ﻛﺗﺎﺑﺔ اﻟﻛود‪.‬‬
‫ﻳﻘوم ﻣﺣرر اﻷﻛواد أﻳﺿﺎ ﺑوﺿﻊ ﺧطوط ﺣﻣراء أﺳﻔﻝ اﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﺧطوط ﺧﺿراء أﺳﻔﻝ اﻻﻧذرات‪.‬‬
‫ﻣﺗﻌﻘب اﻷﺧطﺎء‬
‫ﻳﺣﺗوى ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻋﻠﻰ ﻣﺗﻌﻘب أﺧطﺎء ﺗدﻋﻣﻪ ﺟﻣﻳﻊ اﻟﻠﻐﺎت اﻟﻣدﻋوﻣﺔ ﻳﻛﺷف أﺧطﺎء وﻗت اﻟﺗﺷﻐﻳﻝ‬
‫واﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﻳﺳﻣﺢ ﺑوﺿﻊ ﻧﻘﺎط ﺗوﻗف ﻋﻧد ﺳطور اﻟﻛود واﻟﺗﻲ ﻳﺗوﻗف اﻟﺑرﻧﺎﻣﺞ ﻋن اﻟﻌﻣﻝ ﻋﻧدﻣﺎ‬
‫ﻳﺻﻝ ﻟﻬذا اﻟﺳطر‪.‬‬
‫ﻳوﺟد أﻳﺿﺎ ﻓﻲ ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻧﺎﻓذة ‪ immediate window‬واﻟﺗﻲ ﺗﺳﻣﺢ ﺑﺗﺟرﻳب اﻟدواﻝ أﺛﻧﺎء ﻛﺗﺎﺑﺗﻬﺎ‪.‬‬

‫ﻣﺎﻫﻲ اﻟﻣراﺣﻝ اﻟﺗﻲ ﻳﻣر ﺑﻬﺎ اﻟﺑرﻧﺎﻣﺞ ﺑﻠﻐﺔ ‪ ++C‬ﻗﺑﻝ ﺗﻧﻔﻳذﻩ؟‬


‫ﻳﻣر اﻟﺑرﻧﺎﻣﺞ ﺑﻠﻐﺔ ﺳﻲ ‪ ++‬ﺑﺳت ﻣراﺣﻝ ﻗﺑﻝ ﺗﻧﻔﻳذﻩ وﻫﻲ‪:‬‬
‫‪ .1‬ﻛﺗﺎﺑﺔ اﻟﺑرﻧﺎﻣﺞ‪Edit .‬‬
‫‪ .2‬ﻣرﺣﻠﺔ ﻣﺎ ﻗﺑﻝ اﻟﺗرﺟﻣﺔ او اﻟﻣﻌﺎﻟﺟﺔ ‪Preprocess‬‬
‫‪ .3‬اﻟﺗرﺟﻣﺔ ‪Compile‬‬
‫‪ .4‬اﻟرﺑط ‪Link‬‬
‫‪ .5‬اﻟﺗﺣﻣﻳﻝ ‪Load‬‬
‫‪ .6‬اﻟﺗﻧﻔﻳذ ‪Execute‬‬

‫في ھذا القسم – عزيزي الطالب – سوف نشرح كيفية كتابة أول برنامج لك بلغة الـ ‪ C++‬وباستخدام ‪Microsoft ‬‬
‫‪ Visual C++‬وھي بيئة تطويرية أخرى يمكن أن تتعامل معھا من أجل التمكن من االنتقال إلى برمجة تطبيقات ويندوز‬
‫باستخدامھا‪.‬‬

‫‪ -‬من أجل البدء بأي مشروع قم بالخطوات التالية‪:‬‬

‫‪ -1‬اختر ‪ New‬من القائمة ‪  File‬‬


‫‪ ‬‬

‫‪ -2‬تحصل على النافذة كما في الشكل التالي‪ ،‬من الصفحة ‪ Workspaces‬سيظھر ‪ Blank Workspace‬وھو‬
‫مكان العمل الذي سوف توضع فيه مشاريعك‪  .‬‬

‫‪ -3‬عند خانة ‪ Workspace name‬أدخل اسم ) مثالً اسمك(‪ ،‬يمكنك تغيير مكان التخزين عن طريق الخانة‬
‫‪  .Location‬‬
‫‪ -4‬اآلن ولنقوم بتشكيل أول مشروع يحب علينا اختيار األمر ‪ New‬من القائمة ‪ File‬لتحصل على نفس الشاشة‬
‫التي حصلت عليھا مسبقا ً ولكن الصفحة ‪ Projects‬ھي التي ستظھر أمامك بدالً عن ‪  .Workspaces‬‬
‫‪ -5‬اختر ‪ ،Win32 Console Application‬على يمين النافذة وعند خانة ‪ Project Name‬اكتب اسم‬
‫مشروعك وليكن ‪ ،Prog1‬بشكل افتراضي سوف يقوم الفيجول سي‪ ++‬بإنشاء دليل بنفس اسم المشروع‬
‫ويضع فيه جميع الملفات التي سوف تضيفھا الحقا ً لمشروعك‪  .‬‬

‫‪ -6‬يجب اختيار ‪ Add to current workspace‬ليتم إضافة مشروعك ‪ Prog1‬إلى الـ ‪ Workspace‬الذي‬


‫قمت بإنشائه في الخطوتين ‪  .3-2‬‬
‫‪ -7‬اضغط على زر ‪ OK‬لتحصل على النافذة التالية ‪ ‬‬
‫‪ -8‬تأكد من اختيار ‪ An empty Project‬ومن ثم اضغط على زر ‪  .Finish‬‬
‫‪ -9‬اآلن ولنقوم بكتابة أول برنامج يحب علينا إنشاء ملف جديد باختيار األمر ‪ New‬من القائمة ‪ File‬لتحصل‬
‫على نفس الشاشة التي حصلت عليھا مسبقا ً ولكن الصفحة ‪ Files‬ھي التي ستظھر أمامك بدالً عن‬
‫‪  .Projects‬‬
‫‪ -10‬اختر ‪ C++ Source file‬واكتب اسم ملفك عند خانة ‪ File Name‬وليكن ‪ test‬واضغط زر ‪  .Ok‬‬

‫‪ -11‬الحظ أن في مجلد ‪ Source files‬تم إضافة اسم الملف ‪  .test.cpp‬‬


‫‪ -12‬ابدأ بكتابة البرنامج التالي‪  :‬‬
‫‪#include <iostream.h> ‬‬
‫)(‪void main‬‬
‫{‬
‫‪int x; ‬‬
‫‪cout<<"Please enter a number: "; ‬‬
‫‪cin>>x; ‬‬
‫‪cout<<"The number is: "; ‬‬
‫‪cout<<x<<endl; ‬‬
‫‪} ‬‬
‫يجب االنتباه إلى حالة األحرف الكبيرة والصغيرة ألن لغة الـ ‪ C++‬تفرق بينھما‪ .‬‬

‫‪ -13‬لتنفيذ البرنامج السابق وبناء ملف تنفيذي قابل للتنفيذ بأي وقت قم بالخطوات التالية‪:‬‬
‫من القائمة ‪ Build‬اختر األمر ‪ compile test.cpp‬سوف يتم ترجمة الملف وتحويله من اللغة‬ ‫أ‪-‬‬
‫المقروءة إلى لغة اآللة وذلك بعد فحصه من األخطاء وتصحيحھا‪  .‬‬
‫ب‪ -‬من القائمة ‪ Build‬اختر األمر ‪ Build‬ليتم تشكيل الملف التنفيذي ‪  .test.exe‬‬
‫ت‪ -‬من القائمة ‪ Build‬اختر األمر ‪ Execute test.exe‬لتنفيذه‪  .‬‬
‫ث‪ -‬إذا كان كل شيء صحيح سوف تظھر نافذة مثل نافذة نظام التشغيل دوس في أعالھا اسم الملف‬
‫‪  test.exe‬‬
‫ج‪ -‬ظھرت لك عبارة ‪ Please enter a number‬واآلن ھو في حالة انتظار إدخال العدد ‪  .‬‬
‫ح‪ -‬أدخل العدد واضغط ‪  .Enter‬‬
‫خ‪ -‬سوف تجد العبارة ‪ The number is‬والعدد الذي قمت بإدخاله‪  .‬‬

‫‪ -‬عليك اآلن إكمال كتابة البرنامج التالي ليقوم بإضافة العدد ‪ 2‬إلى العدد المدخل وطباعة الناتج‪  .‬‬
‫استخدم الخطوات ‪ 4‬حتى ‪ 10‬إلضافة مشروع جديد إلى نفس الـ ‪ Workspace‬وليكن اسمه‬
‫‪  .prog2‬‬
‫قم بكتابة البرنامج بعد أن تكمل الفراغات‪:‬‬
‫‪#include <iostream.h> ‬‬
‫‪void main() ‬‬
‫{‬
‫‪const int s=2 ; ‬‬
‫‪int  n , sum ; ‬‬
‫‪cout<<" Enter a number: " ; ‬‬
‫‪cin>>n ; ‬‬
‫‪sum = n + s ; ‬‬
‫;‪cout<<"plus 2= "<<sum<<endl‬‬
‫‪} ‬‬
‫‪ ‬‬

‫انتقل إلى مرحلة تنفيذ البرنامج ) انتبه أنه سيقوم بتنفيذ المشروع الثاني وذلك بضغط زر اليمين‬
‫على ‪ prog2‬وتفعيل ھذا المشروع باختيار ‪ .(Set as Active project‬‬
‫ﺗدرﻳب‪ :‬ﺑﺎﻻﺳﺗﻔﺎدة ﻣن اﻟﻣﻌﻠوﻣﺎت اﻟﺗﻲ ﻗدﻣت ﻟك ﻓﻲ اﻟﻘﺳﻣﻳن اﻟﺳﺎﺑﻘﻳن‪ ،‬ﺣﺎوﻝ – ﻋزﻳزي اﻟدارس– أن ﺗﻧﺷﻲء ﻣﺷروﻋﺎ ﺟدﻳد‬

‫‪ prog3‬ﺿﻣن أﺣد ﺑﻳﺋﺎت اﻟﺗطوﻳر اﻟﺳﺎﺑﻘﺔ ﻟﻳﻘوم ﺑﺣﺳﺎب ﻣﺳﺎﺣﺔ داﺋرة ﺣﺳب اﻟﻧﺻف ﻗطر اﻟﻣدﺧﻝ وطﺑﺎﻋﺔ اﻟﻧﺎﺗﺞ‪.‬‬
‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬
‫مقرر برمجة)‪1291 (1‬‬

‫لقاء إفتراضي بعنوان‬


‫مناقشة مواضيع هامة لمادة قبل النصفي )أمثلة وتدريبات(‬
‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى أسعد ‪ /‬منسق المقرر‬
‫فرع رام ال والبيرة‬

‫السبت ‪18/10/2014‬‬
‫مواضيع اللقاء‬

‫يحتوي اللقاء على شرح أمثلة تتعلق بالمواضيع التالية‪:‬‬


‫‪ ‬المصفوفات و كيفية تعريفها والتعامل معها‬
‫‪ ‬الصناف‬
‫‪ ‬الدوال المنتمية‬
‫‪ ‬تعريف مصفوفة من الكينونات‬
‫‪ ‬البناء والهدام‬
‫‪ ‬إعادة التعريف ‪Overloading‬‬
‫‪ ‬حجز الذاكرة بطريقة ديناميكية‬
 int foo [5];

 int foo [5] = { 16, 2, 77, 40, 12071 };

 int bar [5] = { 10, 20, 30 };

 int baz [5] = { };

 foo [2] = 75;


 x = foo[2];
‫مثال على تعريف المصفوفات‬

1. // arrays example
2. #include <iostream>
3. using namespace std;
4. int foo [] = {16, 2, 77, 40, 12071};
5. int n, result=0;

6. int main ()
7. {
8. for ( n=0 ; n<5 ; ++n )
9. {
10. result += foo[n];
11. }
12. cout << result;
13. return 0;
14.}
‫مثال‬
1. #include <iostream>
2. using namespace std;
3. int main()
4. {
5. float mark=0, total=0 ,average=0;
6. for(float a=1;a<=3;a++)
7. {
8. total=0;
9. for(float b=1;b<=3;b++)
10. {
11. cin>>mark;
12. total+=mark;
13. }
14. average=total/3;
15. cout<<"average="<<average<<endl;
16. }
17. }
‫لماذا نحتاج إلى جملة تعريف‬
using namespace std;
1. #include <iostream>
2. using namespace std;
3. // first name space
4. namespace first_space{
5. void func(){
6. cout << "Inside first_space" << endl;
7. }
8. }
9. // second name space
10. namespace second_space{
11. void func(){
12. cout << "Inside second_space" << endl;
13. }
14. }
15. int main ()
16. {
17. // Calls function from first name space.
18. first_space::func();
19. // Calls function from second name space.
20. second_space::func();
21. return 0;
22. }
using namespace std;
1. #include <iostream>
2. using namespace std;
3. // first name space
4. namespace first_space{
5. void func(){
6. cout << "Inside first_space" << endl;
7. }
8. }
9. // second name space
10. namespace second_space{
11. void func(){
12. cout << "Inside second_space" << endl;
13. }
14. }
15. using namespace first_space;
16. int main ()
17. {
18. // This calls function from first name space.
19. func();
20. return 0;
21. }
‫الصناف‬

class Rectangle {
int width,height;
public:
Rectangle(int,int);
int area() { return width*height;} };
 The constructor for this class could be defined, as usual, as:

 Rectangle::Rectangle (int x, int y) { width=x; height=y; }


 But it could also be defined using member initialization as:

 Rectangle::Rectangle (int x, int y) : width(x) { height=y; }


 Or even:

 Rectangle::Rectangle (int x, int y) : width(x), height(y) { }


‫مثال على البناء‬
Example on constructors

1. //example on constructor
2. #include <iostream>
3. using namespace std;
4. class Student
5. {
6. public:
7. Student()
8. {
9. cout<<"\nHello from constructor";
10. }
11. ~Student()
12. {
13. cout<<"\nGoodbye from constructor";
14. }
15.};
16.int main()
17.{
18. Student s;
19.}
Example using constructor
1. #include <iostream>
2. using namespace std;
3. class CRectangle {
4. int width, height;
5. public:
6. CRectangle (int,int);
7. int area () {return (width*height);}
8. };
9. CRectangle::CRectangle (int a, int b) {
10. width = a; height = b;
11.}
12.int main () {
13. CRectangle rect (3,4);
14. CRectangle rectb (5,6);
15. cout << "rect area: " << rect.area() << endl;
16. cout << "rectb area: " << rectb.area() << endl;
17.return 0;
18.}
‫إعادة تحميل البناء‬
1.
Constructor Overloading
#include <iostream>
2. using namespace std;
3. class CRectangle {
4. int width, height;
5. public:
6. CRectangle ();
7. CRectangle (int,int);
8. int area (void) {return (width*height);}
9. };
10. CRectangle::CRectangle () {
11. width = 5; height = 5; }
12. CRectangle::CRectangle (int a, int b) {
13. width = a; height = b; }
14. int main () {
15. CRectangle rect (3,4);
16. CRectangle rectb;
17. cout << "rect area: " << rect.area() << endl;
18. cout << "rectb area: " << rectb.area() << endl;
19. return 0;
20. }
‫مصفوفة من الكينونات‬
Array of Objects
1. #include <iostream>
2. #include <string>
3. using namespace std;
4. class Student
5. {
6. public:
7. string name;
8. int id;
9. };
10. int main()
11. {
12. Student s[3];
13. for(int i=0;i<3;i++)
14. {
15. cout<<endl<<"enter name for student number "<<i+1<<": ";
16. cin>>s[i].name;
17. cout<<"enter id for student number "<<i+1<<": ";
18. cin>>s[i].id;
19. }
20. for(int i=0;i<3;i++)
21. cout<<endl<<s[i].name<<" has id# "<<s[i].id;
22. }
‫مثال يوضح مصفوفة من الكينونات‬
Example on array of objects
1. #include <iostream>
2. #include <string>
3. using namespace std;
4. class Student {
5. public:
6. string name;
7. Student(string n) { name=n;}
8. Student() { cout<<"\nHello from constructor";}
9. ~Student() { cout<<"\nGoodbye from constructor";}
10. };
11. int main()
12. {
13. Student s[3]; //calls the default constructor
14. for(int i=0;i<3;i++)
15. s[i]= Student("Ali"); //calls the second constructor
16. for(int i=0;i<3;i++)
17. cout<<endl<<s[i].name;
18. }
Pointers ‫المؤشرات‬
k= 10
(&k)=
0x28ff0c
p=
1. #include <iostream> 0x28ff0c
2. using namespace std;
(*p)= 10
3. int main()
4. { (&p)=
5. int k=10; 0x28ff08
6. int *p;
7. p=&k;
8.
9. cout<<"value of k="<<k;
10. cout <<endl<<"address of k (&k)= "<< (&k) ;
11. cout<<endl<<"\n p="<<p;
12. cout<<"\n (*p)="<<(*p);
13. cout<<"\n (&p)="<<(&p);
14. return 0;
15.}
‫ ما هو ناتج تنفيذ‬:‫تدريب على المؤشرات‬
1.
‫التالي؟‬
#include <iostream>
‫البرنامج‬
2. using namespace std;
3. int main()
4. {
5. int a = 5, b = 10;
6. int *p1, *p2;
7. p1 = &a;
8. p2 = &b;
9. *p1 = 10;
10. p1 = p2;
11. *p1 = 20;
12. cout<<endl<<"a ="<<a;
13. cout<<endl<<"b ="<< b;
14.}
‫حجز الذاكرة بطريقة ديناميكية‬
Dynamic Memory Allocation
1. #include <iostream> .‫ مستخدمين دالة‬y ‫ و‬x ‫نريد تبديل قيم‬ .1

2. using namespace std;


3. void swap(int x,int y) Main() Swap(X , Y)
X= 5 T=
4. { Y=10 X=
5. int t; Y=
6. t=x;
7. x=y;
8. y=t;
9. }
10. int main()
11. {
12. int x=5;
13. int y=10;
14. swap(x,y);
15. }
‫حجز الذاكرة بطريقة ديناميكية‬
Dynamic Memory Allocation
1. ‫في الذاكرة يتم حجز‬ 1. #include <iostream>
‫ مساحة للمتغير‬X 2. using namespace std;
‫ ومساحة للمتغير‬Y 3. void swapByRef(int *n,int *m)
Main() 4. { int t=(*n);
X= 5 5. *n=*m;
Y= 10 6. *m=t;
7. }
swapByRef() 8. void swapByRef2(int &n, int &m)
Value of n= &X 9. { int t;
Value of m= &Y 10. t=n;
11. n=m;
*n= Value of X 12. m=t;
*m=Value of Y 13. }
14. int main()
15. { int x=5;
16. int y=10;
17. swapByRef(&x, &y);
18. cout<<"\n\n after swapByRef: x="<<x<<"\ty="<<y;
19. swapByRef2(x, y);
20. cout<<"\n\n after swapByRef2: x="<<x<<"\ty="<<y;
21. }
1. #include <iostream>
2. using namespace std;
‫مؤشرات من الكينونات‬
3. class CAT
4. {
5. public:
6. CAT() { itsAge = 1; itsWeight=5; }
7. CAT(int a, int w) { itsAge = a; itsWeight=w; }
8. ~CAT();
9. int GetAge() const { return itsAge; }
10. int GetWeight() const { return itsWeight; }
11. void SetAge(int age) { itsAge = age; }
12.private:
13. int itsAge;
14. int itsWeight;
15.};
16.CAT::~CAT()
17.{
18. cout<<"\nGoodbye!";
19.}

20.int main()
21.{
22. CAT c;
23. CAT c1(1,6);
24. cout<<"c="<<c.GetWeight()<<endl;
25. cout<<"c1="<<c1.GetWeight()<<endl;
26.
27. CAT *Family[500];
28. int i;
29. CAT *pCat;
30. for (i = 0; i < 10; i++)
31. {
32. pCat = new CAT;
33. cout<<endl<<"Age="<<(*pCat).GetAge();
34. pCat->SetAge(2*i +1); // (*pCat).SetAge(2*i +1);
35. cout<<endl<<"Age="<<(*pCat).GetAge();
36. Family[i] = pCat;
37. }
38. for (i = 0; i < 10; i++)
39. {
40. cout << "Cat #" << i+1 << ": ";
41. cout << Family[i]->GetAge() << endl;
42.
43. }
44. cout<<"end of main";
45. return 0;
46.}
‫ المتغيرات المحلية‬:‫تدريب‬
1. #include <iostream>
2. using namespace std;
3. void addTwo(int x, int y)
4. {
5. int z=x+y;
6. cout<<"\nx="<<x<<"\t y="<<y<<"\tz="<<z<<endl;
7. }
8. void greetings()
9. { cout<<" Hello"; }
10. int main()
11. {
12. greetings();
13. int z=250;
14. addTwo(5,8);
15. addTwo(50,13);
16. cout<<endl<<z;
17. return 0;
18. }
‫انتهى اللقاء‬
‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬
‫مقرر برمجة)‪1291 (1‬‬

‫لقاء إفتراضي بعنوان‬


‫مراجعة ومناقشة أسئلة امتحانات لمادة المتحان النصفي‬
‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى أسعد ‪ /‬منسق المقرر‬
‫فرع رام ال والبيرة‬

‫الثلثاء ‪21/10/2014‬‬
‫مواضيع اللقاء‬

‫يحتوي اللقاء على حل أسئلة وردت في‬


‫امتحانات نصفية لسنوات سابقة في مختلف‬
‫مواضيع مادة المتحان النصفي‪.‬‬
‫السؤال الول‪ :‬أجب بنعم أو ل على السئلة التالية واضعا الجابة في‬
‫الجدول رقم )‪ (1‬في دفتر الجابة‪.‬‬
‫اخرى‪.‬تتضمن‬ ‫‪Aggregation .1‬‬
‫‪ .2‬يمكن للقوائم المتصلة ‪ linked list‬أن تحتوي عناصر من أنواع مختلفة‪.‬‬
‫‪ .3‬الوراثة )‪ (Inheritance‬تكون بين الصناف )‪ (Classes‬وليس الكائنات )‪.(Objects‬‬
‫‪ .4‬البرمجة الكينونية )‪ (OOP‬هي هي التي تستخدم الكائنات )‪ (Objects‬اساسا في عملية البرمجة‪.‬‬
‫‪ .5‬إن عملية التحليل الكينوني )‪ (OOA‬توضح العلقات والروابط بين الكائنات من خلل التركيز على‬
‫التفاعلت المختلفة بينها وعلقتها ببعضها البعض‪.‬‬
‫‪ .6‬ل يمكن استخدام المؤشرات مع التراكيب و الصناف‪.‬‬
‫‪ .7‬البناء ‪ Constructor‬يمكن استدعائه من داخل دالة في الكائن‪.‬‬
‫‪ .8‬الصنف عبارة عن مجموعة من الكائنات المشتركة في قيم الصفات والسلوك‪.‬‬
‫‪ .9‬حجزة الذاكرة بالطريقة الديناميكية يتم اثناء التنفيذ‪.‬‬
‫‪ .10‬في حال عدم تبيان محدد الوصول عند تعريف عناصر الصنف فإن المحدد يعد تلقائيا من النوع‬
‫الخاص‪.‬‬
‫‪ .11‬الجملة ‪ ; cin >> a >> b‬صحيحة و تستخدم لدخال أكثر من قيمة‪.‬‬
‫‪ .12‬ل يمكن ان تحتوي المصفوفات على كائنات‪.‬‬
‫‪ .13‬الكائن ‪ cin‬يتوقف عن قراءة السلسة الرمزية عند أول فراغ أو رمز السطر الجديد "\‪."n‬‬
‫‪ .14‬عند تعريف مصفوفة داخل دالة ول نضع قيم لعناصرها فإن قيم العناصر ستبقى عشوائية ما لم‬
‫نسند قيم لهذه العناصر‪.‬‬
‫المتغير ‪ b‬في المتغير ‪.a‬‬ ‫عنوان‬
‫الفرع‬ ‫‪1‬‬
‫ستضع‬
‫‪2‬‬
‫‪ .15‬الجملة ‪;a=&b‬‬
‫‪3 4 5 6 7‬‬ ‫‪8 9 10 11 12 13 14 15‬‬
‫الصحيح‬ ‫ل‬ ‫ل‬ ‫ل‬ ‫نع‬ ‫نع‬ ‫ل‬ ‫ل‬ ‫ل‬ ‫نع‬ ‫نع‬ ‫نع‬ ‫ل‬ ‫نع‬ ‫نع‬ ‫نع‬
‫ه‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬
: ‫سؤال‬
:++C ‫اكتب ما يقابل الشكل التالي بلغة‬

Students
<<public>> id : Integer
<<private>> name : String
<<protected>> birthdata : Date

<<public and return int>> age()


Students
<<public>> id : Integer
<<private>> name : String
<<protected>> birthdata : Date

<<public and return int>> age()

‫الجابة‬
class Students {
private:
char name[30];
protected:
Date birthdata;
public:
int id;
int age(){ return now -birthdata;}
};
‫اذكر ثلثة من الخصائص الساسية للغات البرمجة‬
‫الكينونية الجيدة‪.‬‬

‫• الجابة‪:‬‬
‫– أن يكون يرنامجا صحيحا‪ :‬وذلك بان يقوم بأداء الوظيفة‬
‫المحددة في مرحلة التحليل و التصميم دون وجود أخطاء‪.‬‬
‫– أن يكون برنامجا فعال‪ :‬يقوم بوظيفته من خلل الستغلل‬
‫المثل لنظام الحاسوب ومكوناته‪.‬‬
‫– قابل لعادة الستخدام‪ :‬وذلك بان يبنى من مكونات يمكن‬
‫الستفادة منها في بناء برامج أخرى‪.‬‬
‫– أن يكون برنامجا مرنا وقابل للتكيف مع الظروف والبيئات‬
‫التي سيعمل بها‪.‬‬
‫– أن تكون تكلفة صيانته منخفضة‪.‬‬
‫هناك طريقتان لحجز الذاكرة‬
‫لكائن ما‪ ،‬اشرحهما مدعما الجابة‬
‫بجمل لغة ‪ ++C‬المستخدمة لكل‬
‫طريقة‪.‬‬
‫هناك طريقتان لحجز الذاكرة لكائن ما‪ ،‬اشرحهما مدعما‬
‫الجابة بجمل لغة ‪ ++C‬المستخدمة لكل طريقة‪.‬‬

‫الطريقة الستاتيكية ‪ :static memory allocation‬يقوم المترجم بحجز الذاكرة‬ ‫–‬


‫للمتغيرات المستخدمة لتبقى محجوزة طوال فترة التنفيذ وإن لم تستخدم‪.‬‬
‫مثال‪:‬‬
‫‪;int p=5‬‬

‫الطريقة الديناميكية ‪ :dynamic memory allocation‬تسمح لنا هذه الطريقة بحجز‬ ‫–‬
‫الذاكرة التي نحتاج عند الحاجة اليها في فترة التنفيذ‪ ،‬وعند انتهاء الحاجة نستطيع تحريرها‬
‫كي تستخدم لغراض أخرى‪.‬‬

‫مثال‪ :‬هنا ‪ p‬هو المتغر المؤشر لموقع الذاكرة المحجوزة و *‪ p‬هو الموقع المشار‬
‫اليه‪.‬‬
‫‪;int *p‬‬
‫‪;p=new int‬‬
‫اكتب المقطع البرمجي الذي يقابل الشكل التالي مستخدما )& و*(‪:‬‬

‫الجابة‪:‬‬
‫;‪int y = 5‬‬
‫;‪int *yPtr‬‬
‫;‪yPtr = &y‬‬
‫ما المقصود بإعادة التحميل‬
‫‪ overloading‬للدوال؟ اعط مثال‬
‫يوضح ذلك؟‬
‫ما المقصود بإعادة التحميل ‪ overloading‬للدوال؟‬
‫اعط مثال يوضح ذلك؟‬

‫الجابة‪:‬‬
‫المقصود هو‪ :‬امكانية كتابة أكثر من دالة تحت السم نفسه في الصنف‬
‫الواحد شرط ان تختلف في نوع أو عدد معاملتها أو في النوع والعدد‬
‫معا‪ .‬مثال‪:‬‬
‫…‬
‫};‪int power(int x) {return x*x‬‬
‫)‪int power(int x, int n‬‬
‫;‪{ int p=x‬‬
‫} ;‪for(int i=0;i<n;i++) p*=x; return p‬‬
‫…‬
‫وضح كل مما يلي‪ 8=4+4) :‬علمات(‬

‫‪ .1‬المحدد الخاص‪ private‬والمحدد العام‬


‫‪public‬‬
‫‪ .2‬البناء ‪ constructor‬والهدام ‪destructor‬‬
‫‪ .3‬أوجد ناتج تنفيذ النص البرمجي التالي‪ ،‬ثم أوضح‬
‫الهدف من عمل الدالة ‪ 3+3=6) .abc‬علمات(‬

‫>‪#include <iostream‬‬
‫)‪int abc(int x, int n‬‬
‫;‪{ int p‬‬
‫;‪if(n==0) p=1‬‬
‫};‪else{ p=x; for(int i=1;i<n;i++) p*=x‬‬
‫;‪return p‬‬
‫;}‬
‫)(‪main‬‬ ‫الجابة‪:‬‬
‫الناتج هو ‪125‬‬
‫{‬ ‫والهدف هو ايجاد قيمة العدد ‪ x‬مرفوعا للقوة ‪ .n‬أي‬
‫;)‪cout<<abc(5,3‬‬ ‫)‪power(x,n‬‬
‫}‬
‫)‪ 15‬علمة(‬ ‫السؤال الرابع‪-:‬‬
‫‪ .1‬عرف القوائم المتصلة ثم أوضح آلية عملها‪3) .‬‬
‫علمات(‬
‫‪ .2‬تعتبر القوائم المتصلة ‪ linked list‬بديل مفضل‬
‫للمصفوفات في كثير من الحيان لعدة اسباب‪،‬‬
‫اذكرها‪ 6=3+3) .‬علمات(‬
‫‪ .3‬ما مساوىء القوائم المتصلة عند مقارنتها مع‬
‫المصفوفات‪ 6=3+3).‬علمات(‬
‫عرف القوائم المتصلة ثم أوضح آلية عملها‪ 3) .‬علمات(‬
‫مجموعة من العقد ‪ nodes‬المتجانسة )من النوع نفسه( مرتبة بشكل خطي بحيث تحمل كل عقدة‬
‫عنوان العقدة التي تليها باستثناء آخر عقدة إذ تحمل القيمة الخاصة ‪ null‬للشارة إلى انتهاء‬
‫القائمة المتصلة‪.‬‬

‫تعتبر القوائم المتصلة ‪ linked list‬بديل مفضل للمصفوفات‬


‫في كثير من الحيان لعدة أسباب‪ ،‬اذكرها‪6=3+3) .‬‬
‫علمات(‬
‫اضافة عنصر او شطبه ل يطلب عملية إزاحة البيانات كما هو الحال في المصفوفات‪.‬‬ ‫‪.1‬‬
‫تمكننا من استخدام الذاكرة بطريقة اقتصادية بحيث نحجز الذاكرة الخاصة بالعقد فقط عند الحاجة‬ ‫‪.2‬‬
‫إليها ونحررها فور انتهاء الحاجة إليها بطريقة ديناميكية‪ .‬‬

‫ما مساوىء القوائم المتصلة عند مقارنتها مع المصفوفات‪ 6=3+3).‬علمات(‬


‫المعالجة التتابعية ‪:‬ل بد من استعراض القائمة المتصلة عنصرا عنصرا من بدايتها إلى أن نصل‬
‫العنصر المطلوب‪ .‬مما يتطلب وقت تنفيذ طويل‪.‬‬
‫تتطلب بعض البرمجيات المعقدة للتعامل معها‪ ،‬بينما المصفوفات أقل تعقيدا للبرمجة‪.‬‬
‫سؤال حول التراكيب ‪Structs‬‬
‫• اكتب تركيب ‪ Structure‬باسم ‪ employee‬بحيث يصف بيانات‬
‫الموظف التالية ‪:‬اسم الموظف ) مصفوفة رمزية بحد أقصى ‪20‬‬
‫رمز(‪ ,‬رقم الموظف )عدد صحيح(‪ ,‬والراتب الشهري للموظف‬
‫)عدد حقيقي(‪ .‬ثم انشئ كائن )عبارة عن مصفوفة مكونة من ‪5‬‬
‫عناصر( ‪,‬وذلك لدخال خمسة موظفين من التركيب أعله داخل‬
‫الدالة الرئيسية ‪ .( )main‬ثم بين كيف يمكن إدخال )قراءة(‬
‫البيانات )السم والرقم والمعدل ( ثم طباعتها على الشاشة؟‬
#include <iostream>
struct employee
{
;int no
;char name[20]
;float salary
};
int main ()
{
;employee emp
";cout<<"enter the employee number:\n
;cin>>emp.no
";cout<<"enter the employee name:\n
;cin>>emp.name
";cout<<"enter the employee salary:\n
;cin>>emp.salary
 
cout<<"=============================================\
";n
";cout<<"employee number ="<<emp.no<<"\n
";cout<<"employee name ="<<emp.name<<"\n
";cout<<"employee salary ="<<emp.salary<<"\n
cout<<"=============================================\
";n
}
‫‪1132‬‬
‫• ‪ :1132‬هناك طريقتين لحجز الذاكرة وضحهما؟‬
‫)‪9‬علمات(‬
‫– الجابة‪ :‬تم شرحها سابقا‬
‫• ‪ :1132‬اكتب تركيب لشخص ‪ person‬يحتوي على السم‬
‫‪,‬العمر ‪,‬الطول ‪,‬الوزن ثم عرف متغير من نوع شخص‬
‫واسند القيمة ‪ 22‬للعمر و‪ 70‬للوزن‪10).‬علمات(‬
‫– الجابة‪ :‬مشابهة لجابة سابقة‪.‬‬
‫أسئلة سابقة حول البناء‬
‫‪1132‬‬
‫وضح خصائص الدالة البناءة؟)‪4‬علمات(‬ ‫•‬
‫لديك الصنف التالي ‪:‬‬ ‫•‬

‫اكتب ببنائين لهذا الصنف بحيث نستطيع إنشاء كائنات من هذا الصنف‬
‫بطريقتين‪:‬‬
‫الولى مع إعطاء قيم ابتدائية للكائن‬ ‫–‬
‫والخرى بدون إعطاء قيم حيث يتم إعطاء قيمة تلقائية تساوي صفر لرقم الطالب‪.‬‬ ‫–‬
‫)‪16‬علمة(‬
‫‪1132‬‬
‫السؤال‪ :‬اكتب دالة سمها ‪ myfunc‬ولها صيغتين ‪:‬الصيغة الولى‬
‫تعمل على إعادة العدد الصحيح نفسه المرسل لها‪ ,‬الصيغة الثانية‬
‫تعيد عددا ا صحيحا ا يمثل ناتج جمع العددين الصحيحين المرسلين‬
‫لها‪10).‬علمة(‬

‫– مناقشة‪:‬‬
‫• ما هو المصطلح المستخدم هنا‪.‬‬
‫‪1101‬‬
‫• أكتب داله بلغة السي تقوم بتعريف مصفوفة‬
‫إحادية بالقيم الوليه )‪ ،(3،5,8,0,1,11,9‬ومن ثم‬
‫البحث عن العدد ‪ 1‬اذا كان موجود فيها‪ ،‬وطباعة‬
‫كلمة ‪ yes‬اذا كان موجود بالضافه لطباعة العدد‬
‫وال طباعه ‪ .no‬واستدعائها من خلل الداله‬
‫الرئيسية ‪()main‬‬
#include <iostream>
using namespace std;
int findnum()
{
One Solution
int n;
int num[]={3,5,8,1,11,9};
for(int i = 1; i < 6; i++)
{
if(if(num[i] == 1))
{
n= num[i];
break;
}
}
if (n==1) return n;
else
cout<<"the number 1 does not exisit";
}

int main()
{
int n ;
n = findnum();
cout<<"the num number :"<<n<<" is found";
}
#include <iostream>
using namespace std;
int findnum()
{
Another Solution
int n;
int num[]={3,5,8,1,11,9};
for(int i = 1; i < 6; i++)
if(num[i] == 1) return num[i];

cout<<"the number 1 does not exist";


}

int main()
{
int n ;
n = findnum();
cout<<"the num number :"<<n<<" is found";
}
‫أكتب داله بلغة السي تقوم بتعريف مصفوفة إحادية بالقيم‬
،‫ ومن ثم طباعة العدد الكبر فيها‬،(3،5,8,0,1,11,9) ‫الوليه‬
.‫واستدعائها من خلل الدالة الرئيسية‬
#include <iostream>
using namespace std;
int findMax()
{
int num[]={3,5,8,1,11,9};
int max=num[0];
for(int i = 1; i < 6; i++)
{
if(num[i] > max)
max = num[i];
}
return max;
}
int main()
{
int max ;
max = findMax();
cout<<"the max number is :"<<max;
}
‫احسب قيمة التعابير التاليه اذا كانت‬
‫‪z=8, y=3, x=4‬‬

‫التعبير‬ ‫القيم‬
‫ة‬
‫‪y&x != z/x+3‬‬
‫)‪z++ || (!(--y<=1) && x-- != 2‬‬
‫)‪++x | --y || !(y++ <= z/a‬‬
: ‫أوجد ناتج تنفيذ الرنامج التالي‬
#include <iostream>
using namespace std;

int main()
{
int x[5], y[5] ;
for(int i=0;i<5;i++)
{
x[i]=i;
y[i]=i*i;
cout<<"\n"<<x[i]<<"\t"<<y[i];
}
}
‫عرف المصطلحات التالية ‪:‬‬
‫خاصية إخفاء المعلومات ‪information‬‬ ‫•‬
‫‪hiding‬‬
‫المحدد الخاص ‪private‬‬ ‫•‬
‫البناء ‪constructor‬‬ ‫•‬
‫القائمة المتصلة ‪linked list‬‬ ‫•‬
‫انتهى اللقاء‬
‫• تمنياتي لكم بالنجاح والتوفيق في المتحان‬
‫النصفي‬
‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬
‫مقرر برمجة)‪1291 (1‬‬

‫لقاء إفتراضي بعنوان‬


‫مناقشة مواضيع هامة لمادة قبل النصفي )أمثلة وتدريبات(‬
‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى أسعد ‪ /‬منسق المقرر‬
‫فرع رام ال والبيرة‬

‫السبت ‪18/10/2014‬‬
‫مواضيع اللقاء‬

‫يحتوي اللقاء على شرح أمثلة تتعلق بالمواضيع التالية‪:‬‬


‫‪ ‬المصفوفات و كيفية تعريفها والتعامل معها‬
‫‪ ‬الصناف‬
‫‪ ‬الدوال المنتمية‬
‫‪ ‬تعريف مصفوفة من الكينونات‬
‫‪ ‬البناء والهدام‬
‫‪ ‬إعادة التعريف ‪Overloading‬‬
‫‪ ‬حجز الذاكرة بطريقة ديناميكية‬
• int foo [5];

• int foo [5] = { 16, 2, 77, 40, 12071 };

• int bar [5] = { 10, 20, 30 };

• int baz [5] = { };

• foo [2] = 75;


• x = foo[2];
‫مثال على تعريف المصفوفات‬
1. // arrays example
2. #include <iostream>
3. using namespace std;
4. int foo [] = {16, 2, 77, 40, 12071};
5. int n, result=0;

6. int main ()
7. {
8. for ( n=0 ; n<5 ; ++n )
9. {
10. result += foo[n];
11. }
12. cout << result;
13. return 0;
14.}
‫مثال‬
1. #include <iostream>
2. using namespace std;
3. int main()
4. {
5. float mark=0, total=0 ,average=0;
6. for(float a=1;a<=3;a++)
7. {
8. total=0;
9. for(float b=1;b<=3;b++)
10. {
11. cin>>mark;
12. total+=mark;
13. }
14. average=total/3;
15. cout<<"average="<<average<<endl;
16. }
17. }
‫لماذا نحتاج إلى جملة تعريف‬
;using namespace std
1. #include <iostream>
2. using namespace std;
3. // first name space
4. namespace first_space{
5. void func(){
6. cout << "Inside first_space" << endl;
7. }
8. }
9. // second name space
10. namespace second_space{
11. void func(){
12. cout << "Inside second_space" << endl;
13. }
14. }
15. int main ()
16. {
17. // Calls function from first name space.
18. first_space::func();
19. // Calls function from second name space.
20. second_space::func();
21. return 0;
22. }
;using namespace std
1. #include <iostream>
2. using namespace std;
3. // first name space
4. namespace first_space{
5. void func(){
6. cout << "Inside first_space" << endl;
7. }
8. }
9. // second name space
10. namespace second_space{
11. void func(){
12. cout << "Inside second_space" << endl;
13. }
14. }
15. using namespace first_space;
16. int main ()
17. {
18. // This calls function from first name space.
19. func();
20. return 0;
21. }
‫الصناف‬
class Rectangle {
int width,height;
public:
; Rectangle(int,int)
{;int area() { return width*height;}

• The constructor for this class could be defined, as usual, as:

 Rectangle::Rectangle (int x, int y) { width=x; height=y; }

• But it could also be defined using member initialization as:

 Rectangle::Rectangle (int x, int y) : width(x) { height=y; }


• Or even:

 Rectangle::Rectangle (int x, int y) : width(x), height(y) { }


‫مثال على البناء‬
Example on constructors
1. //example on constructor
2. #include <iostream>
3. using namespace std;
4. class Student
5. {
6. public:
7. Student()
8. {
9. cout<<"\nHello from constructor";
10. }
11. ~Student()
12. {
13. cout<<"\nGoodbye from constructor";
14. }
15.};
16.int main()
17.{
18. Student s;
19.}
Example using constructor
1. #include <iostream>
2. using namespace std;
3. class CRectangle {
4. int width, height;
5. public:
6. CRectangle (int,int);
7. int area () {return (width*height);}
8. };
9. CRectangle::CRectangle (int a, int b) {
10. width = a; height = b;
11.}
12.int main () {
13. CRectangle rect (3,4);
14. CRectangle rectb (5,6);
15. cout << "rect area: " << rect.area() << endl;
16. cout << "rectb area: " << rectb.area() << endl;
17.return 0;
18.}
‫إعادة تحميل البناء‬
Constructor Overloading
1. #include <iostream>
2. using namespace std;
3. class CRectangle {
4. int width, height;
5. public:
6. CRectangle ();
7. CRectangle (int,int);
8. int area (void) {return (width*height);}
9. };
10. CRectangle::CRectangle () {
11. width = 5; height = 5; }
12. CRectangle::CRectangle (int a, int b) {
13. width = a; height = b; }
14. int main () {
15. CRectangle rect (3,4);
16. CRectangle rectb;
17. cout << "rect area: " << rect.area() << endl;
18. cout << "rectb area: " << rectb.area() << endl;
19. return 0;
20. }
‫مصفوفة من الكينونات‬
Array of Objects
1. #include <iostream>
2. #include <string>
3. using namespace std;
4. class Student
5. {
6. public:
7. string name;
8. int id;
9. };
10. int main()
11. {
12. Student s[3];
13. for(int i=0;i<3;i++)
14. {
15. cout<<endl<<"enter name for student number "<<i+1<<": ";
16. cin>>s[i].name;
17. cout<<"enter id for student number "<<i+1<<": ";
18. cin>>s[i].id;
19. }
20. for(int i=0;i<3;i++)
21. cout<<endl<<s[i].name<<" has id# "<<s[i].id;
22. }
‫مثال يوضح مصفوفة من الكينونات‬
Example on array of objects
1. #include <iostream>
2. #include <string>
3. using namespace std;
4. class Student {
5. public:
6. string name;
7. Student(string n) { name=n;}
8. Student() { cout<<"\nHello from constructor";}
9. ~Student() { cout<<"\nGoodbye from constructor";}
10. };
11. int main()
12. {
13. Student s[3]; //calls the default constructor
14. for(int i=0;i<3;i++)
15. s[i]= Student("Ali"); //calls the second constructor
16. for(int i=0;i<3;i++)
17. cout<<endl<<s[i].name;
18. }
Pointers ‫المؤشرات‬
1. #include <iostream> k= 10
2. using namespace std; (&k)=
3. int main() 0x28ff0c
4. { p=
0x28ff0c
5. int k=10;
(*p)= 10
6. int *p;
(&p)=
7. p=&k;
0x28ff08
8.
9. cout<<"value of k="<<k;
10. cout <<endl<<"address of k (&k)= "<< (&k) ;
11. cout<<endl<<"\n p="<<p;
12. cout<<"\n (*p)="<<(*p);
13. cout<<"\n (&p)="<<(&p);
14. return 0;
15.}
‫ ما هو ناتج تنفيذ‬:‫تدريب على المؤشرات‬
‫البرنامج التالي؟‬
1. #include <iostream>
2. using namespace std;
3. int main()
4. {
5. int a = 5, b = 10;
6. int *p1, *p2;
7. p1 = &a;
8. p2 = &b;
9. *p1 = 10;
10. p1 = p2;
11. *p1 = 20;
12. cout<<endl<<"a ="<<a;
13. cout<<endl<<"b ="<< b;
14.}
‫حجز الذاكرة بطريقة ديناميكية‬
Dynamic Memory Allocation
1. #include <iostream> .‫ مستخدمين دالة‬y ‫ و‬x ‫نريد تبديل قيم‬ .1

2. using namespace std;


Main() Swap(X , Y)
3. void swap(int x,int y)
X= 5 T=
4. { Y=10 X=
5. int t; Y=

6. t=x;
7. x=y;
8. y=t;
9. }
10.int main()
11.{
12. int x=5;
13. int y=10;
14. swap(x,y);
15.}
‫حجز الذاكرة بطريقة ديناميكية‬
Dynamic Memory Allocation
‫في الذاكرة يتم حجز‬ .1 1. #include <iostream>
X ‫مساحة للمتغير‬ 2. using namespace std;
Y ‫ومساحة للمتغير‬ 3. void swapByRef(int *n,int *m)
Main() 4. { int t=(*n);
X= 5 5. *n=*m;
Y= 10 6. *m=t;
7. }
swapByRef() 8. void swapByRef2(int &n, int &m)
Value of n= &X 9. { int t;
Value of m= &Y 10. t=n;
11. n=m;
*n= Value of X 12. m=t;
*m=Value of Y 13. }
14. int main()
15. { int x=5;
16. int y=10;
17. swapByRef(&x, &y);
18. cout<<"\n\n after swapByRef: x="<<x<<"\ty="<<y;
19. swapByRef2(x, y);
20. cout<<"\n\n after swapByRef2: x="<<x<<"\ty="<<y;
21. }
‫انتهى اللقاء‬
1. #include <iostream>
2. using namespace std;
‫مؤشرات من الكينونات‬
3. class CAT
4. {
5. public:
6. CAT() { itsAge = 1; itsWeight=5; }
7. CAT(int a, int w) { itsAge = a; itsWeight=w; }
8. ~CAT();
9. int GetAge() const { return itsAge; }
10. int GetWeight() const { return itsWeight; }
11. void SetAge(int age) { itsAge = age; }
12.private:
13. int itsAge;
14. int itsWeight;
15.};
16.CAT::~CAT()
17.{
18. cout<<"\nGoodbye!";
19.}

20.int main()
21.{
22. CAT c;
23. CAT c1(1,6);
24. cout<<"c="<<c.GetWeight()<<endl;
25. cout<<"c1="<<c1.GetWeight()<<endl;
26.
27. CAT *Family[500];
28. int i;
29. CAT *pCat;
30. for (i = 0; i < 10; i++)
31. {
32. pCat = new CAT;
33. cout<<endl<<"Age="<<(*pCat).GetAge();
34. pCat->SetAge(2*i +1); // (*pCat).SetAge(2*i +1);
35. cout<<endl<<"Age="<<(*pCat).GetAge();
36. Family[i] = pCat;
37. }
38. for (i = 0; i < 10; i++)
39. {
40. cout << "Cat #" << i+1 << ": ";
41. cout << Family[i]->GetAge() << endl;
42.
43. }
44. cout<<"end of main";
45. return 0;
46.}
‫ المتغيرات المحلية‬:‫تدريب‬
1. #include <iostream>
2. using namespace std;
3. void addTwo(int x, int y)
4. {
5. int z=x+y;
6. cout<<"\nx="<<x<<"\t y="<<y<<"\tz="<<z<<endl;
7. }
8. void greetings()
9. { cout<<" Hello"; }
10. int main()
11. {
12. greetings();
13. int z=250;
14. addTwo(5,8);
15. addTwo(50,13);
16. cout<<endl<<z;
17. return 0;
18. }
‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬

‫مقرر برمجة)‪1291 (1‬‬


‫لقاء إفتراضي بعنوان‬
‫مناقشة مواضيع هامة لمادة قبل النصفي )أمثلة وتدريبات(‬
‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى المصري‪ /‬منسق المقرر‬
‫فرع الخليل‬

‫السبت ‪2017-10-14‬‬
‫مواضيع اللقاء‬

‫يحتوي اللقاء على شرح أمثلة تتعلق بالمواضيع التالية‪:‬‬

‫‪ ‬النصناف والتراكيب‬
‫‪ ‬الدوال‬
‫‪ ‬المؤشرات‬
‫السؤال ‪:+++++‬‬

‫‪ (1‬نصنف السيارة التي لها الخصائص " السرعة)‪ (s‬و اللون )‪ (c‬و الوزن )‪ "(w‬والعملية " تغيير‬
‫السرعة)‪"(change‬اجب على ما يلي‪:‬‬
‫‪ (1‬مثل نصنف السيارة باستخدام الرمز الخاص بذلك ‪.‬‬
‫‪ (2‬اكتب المقطع البرمجي لصنف السيارة مستخدما مفهوم التركيب‪.‬‬
‫‪ ( 3‬اكتب المقطع البرمجي لصنف السيارة مستخدما مفهوم الصنف‪.‬‬
‫‪ (4‬عرف مصفوفة بحجم ‪ 40‬عنصرا من نوع التركيب السابق‪ ،‬ثم خزن القيمة ‪ 100‬للسرعة‬
‫للعنصر السادس‪.‬‬
‫السؤال ‪:+++++‬‬

‫قبل الجابة على هذا السؤال يجب ان يمتلك معرفة بــ ‪:‬‬

‫‪ (1‬الشكل الخاص بالصنف‪.‬‬

‫‪ (2‬الصيغة العامة للتركيب‪.‬‬

‫‪ (3‬الصيغة العامة للصنف‪.‬‬

‫‪.‬‬ ‫‪ (4‬تعريف الكائن والمصفوفات‬


‫السؤال ‪:+++++‬‬

‫قبل الجابة على هذا السؤال يجب ان يمتلك معرفة بــ ‪:‬‬

‫‪ (1‬الشكل الخاص بالصنف‪.‬‬

‫‪ (2‬الصيغة العامة للصنف‪.‬‬


‫السؤال ‪:+++++‬‬
‫قبل الجابة على هذا السؤال يجب ان يمتلك معرفة بــ ‪:‬‬

‫‪ (1‬الصيغة العامة للتركيب‪.‬‬


‫السؤال ‪:+++++‬‬
‫‪ (1‬تعريف الكائن المصفوفي‬

‫‪;Class_name‬‬ ‫]‪object_name[n‬‬
‫السؤال ‪:+++++‬‬
‫السيارة‬
‫السرعة‬
‫اللون‬
‫الوزن‬

‫تغيير السرعة )(‬

‫‪}struc car‬‬
‫;‪int w,c,s‬‬
‫;}‬
:+++++ ‫السؤال‬
}class car
;int w,c,s
void change_s(int new_s)
{s=new_s;}
;}

car a[40];
a[5].s=100;
‫يوجد دليل عمل للمقرر يمكن الحصول عليه من‬
‫صحح‬
‫ صحح البرنامج التالي بحيث التعديل في الدالة يؤثر على المتغيرات‬x, y, z
void duplicate (int a, int b, int c){

a*=2;

b*=2;

c*=2;}

void main (){

int x=1, y=3, z=7; duplicate (x, y, z);}


‫صحح‬
‫‪ 3‬البرنامج التالي بحيث التعديل في الدالة يؤثر على المتغيرات ‪. x, y, z‬‬
‫)‪void duplicate (int &a, int &b, int &c‬‬
‫}‬
‫‪;a*=2‬‬
‫‪;b*=2‬‬
‫‪;c*=2‬‬
‫}‬
‫‪ ‬‬
:‫تتبع البرنامج التالي واستخرج ناتج تنفيذه‬
char text[10]={'s','X','A','q',L','X','r','A','c','W'};
for(int i=0;i<text.length();i++){
if(toascii(text[i])>=65 && toascii(text[i])<=77)
cout<<text[i];
else continue;
if(i>=7){
cout<<"Next statement is break";
break;
}
}
:‫ماهو ناتج تنفيذ ما يلي‬
int a[]={1,3,9,2,0};
for(int i=0;i<a.length()-1;i++){
for(int j=i+1;j<a.length();j++){
if(a[i]<a[j]){
t=a[i]; a[i]=a[j]; a[j]=t;
}
:‫ماهو ناتج تنفيذ ما يلي‬
int a[]={1,3,9,2,0};
for(int i=0;i<a.length()-1;i++){
for(int j=i+1;j<a.length();j++){
if(a[i]<a[j]){
t=a[i]; a[i]=a[j]; a[j]=t;
}

‫يؤدي الى ترتيب القيم تنازلي‬


‫‪(1‬أكتب برنامج بلغة سي‪ ++‬باستخدام جملة‬
‫الدوران )‪ (while‬لطباعة السلسلة الرمزية‬
‫")‪ “programming (1‬حرفا حرفا‬
‫وكل حرف على سطر مستقل مستخدما مفهوم‬
‫المؤشر ‪ p‬؟‬
programming" ‫السلسلة الرمزية‬
“(1)
#include<iostream.h>
void main(){
char *p="computer programming (1)";
while(*p != '\0'){
cout<<*p<<"\n";
p++;
}
}
‫‪(2‬اكتب دالة تستقبل قيمة صحيحة ثم تعيد مضروب‬
‫الرقم اذا كانت القيمة اكبر من واحد وال تعيد واحد‬
‫مستخدما مفهوم الستدعاء الذاتي‪.‬‬
‫مضروب‬
long factorial (long a){
if (a > 1)
return (a * factorial (a-1));
else
return (1);}
‫‪(3‬أكتب دالة تحسب تقدير قيمة من نوع عدد صحيح ثم ترجع هذه القيمة‪ .‬التقديرات كما‬

‫يلي‪:‬‬

‫| ‪ :A‬يرجع التقدير ‪B‬‬ ‫‪ :90-100‬يرجع التقدير ‪80-89‬‬

‫‪ :C‬يرجع التقدير ‪D‬‬ ‫|‬ ‫‪ :70-79‬يرجع التقدير ‪60-69‬‬

‫‪ :50-59‬يرجع التقدير ‪ | E‬غير ذلك‪ :‬يرجع التقدير ‪F‬‬


‫التقديرات‬
char result(int a){

if(a>=90 && a<=100) return ‘A’;

else if(a>=80 && a<=89) return ‘B’;

else if(a>=70 && a<=79) return ‘C’;

else if(a>=60 && a<=69) return ‘D’;

else if(a>=50 && a<=59) return ‘E’;

else return ‘F’;

}
https://www.tutorialspoint.com/cplusplus/

http://www.cplusplus.com/doc/tutorial/

https://www.youtube.com/watch?v=Rub-
JsjMhWY
‫• ‪(4‬اذا حصلت على التركيب التالي‪:‬‬
‫{‪struc ListE‬‬
‫‪public:‬‬
‫;‪int datum‬‬
‫;‪ListElement* next‬‬
‫}‬
‫•‬ ‫‪ ‬‬
‫• اكتب الجمل لنشاء عقدة اسمها ‪ node‬واسناد القيمة ‪ 20‬ثم وضح طريقة اضافتها في بداية‬
‫القائمة المتصلة قبل ‪ h‬وبعدها على اعتبار انها اخر القائمة و على اعتبار ليست نهاية القائمة‪..‬‬
‫• ‪(4‬اذا حصلت على التركيب التالي‪:‬‬
‫{‪struc ListE‬‬
‫‪public:‬‬
‫;‪int datum‬‬
‫;‪ListElement* next‬‬
‫}‬
‫•‬ ‫‪ ‬‬
‫• اكتب الجمل لنشاء عقدة اسمها ‪ node‬واسناد القيمة ‪ 20‬ثم وضح طريقة اضافتها في بداية‬
‫القائمة المتصلة قبل ‪ h‬وبعدها على اعتبار انها اخر القائمة و على اعتبار ليست نهاية القائمة‪..‬‬
‫عقدة‬
node= new ListE;
node->datum=20;
node->next=null;
 
node->next=h; h=node;
 
h->next=node; h=node;
 
node->next=h->next;
h->next=node;h=node;
‫أنظر الشكل المجاور والذي يمثل قائمة متصلة ثم أجب عن السئلة التي أدناه‪:‬‬

‫‪ - 1‬اكتب التركيب اللزم للعلن عن القائمة المتصلة الممثلة في الشكل أعل‪.‬ه‪.‬‬


‫‪ -2‬أكتب جمل ‪ ++C‬اللزمة لضافة ‪ Node‬تحتوي على العدد ‪ 2‬في بداية‬
‫القائمة المتصلة‪.‬‬
‫‪ -3‬أكتب جمل ‪ ++C‬اللزمة لضافة ‪ Node‬بين المؤشرين ‪ A‬و ‪.B‬‬
‫‪ -4‬اكتب جمل ‪ ++C‬اللزمة لضافة ‪ Node‬تحتوي على العدد ‪ 9‬في نهاية‬
‫القائمة المتصلة‪.‬‬
‫‪ -5‬أكتب جمل ‪ ++C‬اللزمة لحذف ال ‪ Node‬التي تؤشر عليها ‪B‬‬
‫أنظر الشكل المجاور والذي يمثل قائمة متصلة ثم أجب عن السئلة التي أدناه‪:‬‬

‫‪ - 1‬اكتب التركيب اللزم للعلن عن القائمة المتصلة الممثلة في الشكل أعل‪.‬ه‪.‬‬


‫‪ -2‬أكتب جمل ‪ ++C‬اللزمة لضافة ‪ Node‬تحتوي على العدد ‪ 2‬في بداية‬
‫القائمة المتصلة‪.‬‬
‫‪ -3‬أكتب جمل ‪ ++C‬اللزمة لضافة ‪ Node‬بين المؤشرين ‪ A‬و ‪.B‬‬
‫‪ -4‬اكتب جمل ‪ ++C‬اللزمة لضافة ‪ Node‬تحتوي على العدد ‪ 9‬في نهاية‬
‫القائمة المتصلة‪.‬‬
‫‪ -5‬أكتب جمل ‪ ++C‬اللزمة لحذف ال ‪ Node‬التي تؤشر عليها ‪B‬‬
Struct cnode {
Int data;
Node* next;
}
Cnode* node;
2-
Node ->next=head;
Head=node;
3-
Node->next =B;
A->next = node;
 
4-
C->next = node;
5-
C->next=b->next;
Delete(B);
 
4-
C->next = node;
5-
C->next=b->next;
Delete(B);
‫السؤال‬
‫أكتب برنامجا بلغة ‪ ++C‬يحسب و يطبع مساحة مثلث )‪(Triangle‬‬
‫ارتفاعه ‪ h‬و طول القاعدة ‪ b‬باستخدام البرمجة الكينونية ‪.‬‬
‫عرف نصنف ‪ t‬بحيث يحتوي على المتغيرات المنتمية ‪ h, b‬من‬
‫النوع العددي الصحيح و يحتوي على الدوال التالية ‪:‬‬
‫دالة بناء تقوم بإدخال قيم ‪ h‬و ‪.b‬‬

‫دالة تحسب المساحة ‪ ).‬مساحة المثلث = نصف القاعدة * الرتفاع(‬


‫دالة طباعة المساحة‬
‫البرنامج الرئيسي الذي يستدعي الدوال السابقة ‪.‬‬
‫السؤال‬
# include <stdio.h>
#include <iostream.h>
class x{
private :
int h,b;
public :
void initialization();
void printarea();
int area();
int geth();
int getb():
};
‫السؤال‬
Void x:: initailzation() {
Cout << "enter h";
Cin >> h;
Cout << "enter b"
Cin >> b;
}
Int x:: geth()
|{return(h);}
Int x::getb()
{return(b);
}
‫السؤال‬
int x::area(){ return b/2*h; }
void x::printarea() {
cout << geth();
Cout <<area();
}
void main () {
x y;
y.initialization();
y.printarea();
getch();
}
‫السؤال‬
‫عرف الصنف ‪ Book‬لتمثيل كتاب يباع في مكتبة لبيع الكتب حيث‬
‫يحتوي هذا الصنف على المتغيرات المنتمية التالية‪:‬‬
‫‪. Price‬ويمثل سعر الكتاب‬
‫‪. Tilte‬ويمثل اسم الكتاب‬
‫‪. Quantity‬ويمثل عدد النسخ المباعة من ذلك الكتاب‬
‫والدوال المنتمية التالية‪:‬‬
‫دالة لحساب السعر الكلي لجميع الكتب المباعة‬
‫دالة لنقاص سعر الكتاب‬
‫بناء لقراءة جميع المتغيرات المنتمية للصنف‪.‬‬
‫دالة لطباعة قيم متغيرات الصنف‪.‬‬
‫السؤال‬
class book{
private:
double price;
int quantity;
char title[20];
public:
double total_price();
double decrease_price(double decr);
book();
void print_book();
};
 
‫السؤال‬
double book::total_price(){ return
price*quantity;}
double book::decrease_price(double
decr)
{price-=decr;}
book::book(){
cin>>title;
cin>>price;
cin>> quantity;
}
‫السؤال‬
 void book::print_book()
{
cout<< title<<endl;
cout <<price<<endl;
cout<<quantity<<endl;
}
‫الصناف‬
class Rectangle {
int width,height;
public:
Rectangle(int,int);
int area() { return width*height;} };

• The constructor for this class could be defined, as usual, as:

 Rectangle::Rectangle (int x, int y) { width=x; height=y; }

• But it could also be defined using member initialization as:

 Rectangle::Rectangle (int x, int y) : width(x) { height=y; }


• Or even:

 Rectangle::Rectangle (int x, int y) : width(x), height(y) { }


‫مثال على البناء‬
Example on constructors
1. //example on constructor
2. #include <iostream>
3. using namespace std;
4. class Student
5. {
6. public:
7. Student()
8. {
9. cout<<"\nHello from constructor";
10. }
11. ~Student()
12. {
13. cout<<"\nGoodbye from constructor";
14. }
15. };
16. int main()
17. {
18. Student s;
19. }
Example using constructor
1. #include <iostream>
2. using namespace std;
3. class CRectangle {
4. int width, height;
5. public:
6. CRectangle (int,int);
7. int area () {return (width*height);}
8. };
9. CRectangle::CRectangle (int a, int b) {
10. width = a; height = b;
11. }
12. int main () {
13. CRectangle rect (3,4);
14. CRectangle rectb (5,6);
15. cout << "rect area: " << rect.area() << endl;
16. cout << "rectb area: " << rectb.area() << endl;
17. return 0;
18. }
‫إعادة تحميل البناء‬
Constructor Overloading
1. #include <iostream>
2. using namespace std;
3. class CRectangle {
4. int width, height;
5. public:
6. CRectangle ();
7. CRectangle (int,int);
8. int area (void) {return (width*height);}
9. };
10. CRectangle::CRectangle () {
11. width = 5; height = 5; }
12. CRectangle::CRectangle (int a, int b) {
13. width = a; height = b; }
14. int main () {
15. CRectangle rect (3,4);
16. CRectangle rectb;
17. cout << "rect area: " << rect.area() << endl;
18. cout << "rectb area: " << rectb.area() << endl;
19. return 0;
20. }
‫مصفوفة من الكينونات‬
Array of Objects
1. #include <iostream>
2. #include <string>
3. using namespace std;
4. class Student
5. {
6. public:
7. string name;
8. int id;
9. };
10. int main()
11. {
12. Student s[3];
13. for(int i=0;i<3;i++)
14. {
15. cout<<endl<<"enter name for student number "<<i+1<<": ";
16. cin>>s[i].name;
17. cout<<"enter id for student number "<<i+1<<": ";
18. cin>>s[i].id;
19. }
20. for(int i=0;i<3;i++)
21. cout<<endl<<s[i].name<<" has id# "<<s[i].id;
22. }
‫مثال يوضح مصفوفة من الكينونات‬
1.
Example on array of objects
#include <iostream>
2. #include <string>
3. using namespace std;
4. class Student {
5. public:
6. string name;
7. Student(string n) { name=n;}
8. Student() { cout<<"\nHello from constructor";}
9. ~Student() { cout<<"\nGoodbye from constructor";}
10. };
11. int main()
12. {
13. Student s[3]; //calls the default constructor
14. for(int i=0;i<3;i++)
15. s[i]= Student("Ali"); //calls the second constructor
16. for(int i=0;i<3;i++)
17. cout<<endl<<s[i].name;
18. }
Pointers ‫المؤشرات‬
1. #include <iostream> k= 10
2. using namespace std; (&k)=
3. int main() 0x28ff0c
4. { p=
5. int k=10; 0x28ff0c
6. int *p; (*p)= 10
7. p=&k; (&p)=
8. 0x28ff08
9. cout<<"value of k="<<k;
10. cout <<endl<<"address of k (&k)= "<< (&k) ;
11. cout<<endl<<"\n p="<<p;
12. cout<<"\n (*p)="<<(*p);
13. cout<<"\n (&p)="<<(&p);
14. return 0;
15. }
‫ ما هو ناتج تنفيذ البرنامج التالي؟‬:‫تدريب على المؤشرات‬
1. #include <iostream>
2. using namespace std;
3. int main()
4. {
5. int a = 5, b = 10;
6. int *p1, *p2;
7. p1 = &a;
8. p2 = &b;
9. *p1 = 10;
10. p1 = p2;
11. *p1 = 20;
12. cout<<endl<<"a ="<<a;
13. cout<<endl<<"b ="<< b;
14. }
‫حجز الذاكرة بطريقة ديناميكية‬
Dynamic Memory Allocation
1. #include <iostream> .‫ مستخدمين دالة‬y ‫ و‬x ‫نريد تبديل قيم‬ .1
2. using namespace std;
3. void swap(int x,int y) Main() Swap(X , Y)
4. } X= 5 T=
5. int t; Y=10 X=
6. t=x; Y=
7. x=y;
8. y=t;
9. }
10. int main()
11. }
12. int x=5;
13. int y=10;
14. swap(x,y);

15. }
‫حجز الذاكرة بطريقة ديناميكية‬
Dynamic Memory Allocation
‫في الذاكرة يتم حجز‬ .1 1. #include <iostream>
X ‫مساحة للمتغير‬ 2. using namespace std;
Y ‫ومساحة للمتغير‬ 3. void swapByRef(int *n,int *m)
Main() 4. } int t=(*n);
X= 5 5. *n=*m;
Y= 10 6. *m=t;
7. }
swapByRef() 8. void swapByRef2(int &n, int &m)
Value of n= &X 9. } int t;
Value of m= &Y 10. t=n;
11. n=m;
*n= Value of X 12. m=t;
*m=Value of Y 13. }
14. int main()
15. } int x=5;
16. int y=10;
17. swapByRef(&x, &y);
18. cout<<"\n\n after swapByRef: x="<<x<<"\ty="<<y;
19. swapByRef2(x, y);
20. cout<<"\n\n after swapByRef2: x="<<x<<"\ty="<<y;
21. }
‫انتهى اللقاء‬
‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬

‫مقرر برمجة)‪1291 (1‬‬

‫لقاء إفتراضي بعنوان‬


‫مناقشة مواضيع هامة لمادة قبل النهائي )أمثلة وتدريبات(‬

‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى أسعد ‪ /‬منسق المقرر‬
‫فرع رام ال والبيرة‬

‫السبت ‪29/11/2014‬‬
‫‪‬الصناف‬
‫‪‬الوراثة وأنواعها‬
‫‪‬محددات الوراثة‬
‫‪‬الكتابة في الملفات‬
‫‪‬القراءة من الملفات‬
‫الوراثة‬
‫مثال على الوراثة‬
class Shape {
protected:
float width, height;
public:
void set_data (float a, float b) { width = a; height
= b; }
};
class Rectangle: public Shape { class Triangle: public Shape {
public: public:
float area () { return (width * height); } float area () {
}; return (width * height / 2); }
};
int main () {
Rectangle rect;
Triangle tri; output
rect.set_data (5,3); :
tri.set_data (2,5); 15
cout << rect.area() << endl; cout << tri.area() << 5
endl; return 0;
}
‫ماذا يرث الصنف‬
class base1 {
public:
‫غموض‬
void some_function( ) { .... ... .... }
};
class base2 {
void some_function( ) { .... ... .... }
};
class derived : public base1, public base2 {
};
int main() { ‫ما الهدف من وضع‬
derived obj; ‫محدد للوراثة؟؟‬
obj.same_function( ) ; // Error!!
} :‫الحل‬
int main() {
...
‫ما نوع الوراثة في المثال السابق؟‬
obj.base1::same_function( )
;
‫محددات الوراثة‬
 Class Father{

};
 class son: public Father{

}
‫أسئلة وتمارين حول الوراثة‬
‫‪‬اكتب النص البرمجي الذي يحقق الوراثة المنفردة‬
‫الموضحة في الشكل التالي علما بان الصنفان‬
‫المشتقان يحتويان دوال حساب المساحة‪.‬‬
‫‪CPolygon‬‬
‫‪width : Integer‬‬
‫‪height : Integer‬‬

‫)(‪set_values‬‬

‫‪CRectangle‬‬ ‫‪CTriangle‬‬

‫)( ‪area‬‬ ‫)( ‪area‬‬


‫معالجة الملفات بلغة ‪++C‬‬
‫‪ ‬إذا أحببت أن تتعامل مع قنوات الملفات يجب أن نستخدم الملف‬
‫الرأسي ‪ fstream.h‬أي قنوات الملفات ‪File Stream‬‬
‫إذا يجب أن تكون العبارة ‪:‬‬
‫>‪#include <fstream.h‬‬
‫‪ ‬للكتابة داخل أي ملف توجد ‪ 3‬خطوات وهي‪:‬‬
‫نعرف كائن من نوع ملف‪:‬‬ ‫‪.1‬‬
‫نفتح الملف للكتابة‬ ‫‪.2‬‬
‫نكتب داخل الملف‬ ‫‪.3‬‬

‫; ‪1. ofstream fout‬‬


‫;)‪2. fout.open("file path",iostream family‬‬
‫;"‪3. fout<<"data‬‬
‫ برنامج لكتابة أكثر من سطر في ملف‬:‫مثال‬
#include <fstream.h>
int main()
{
ofstream fout;
fout.open("D:\\firstExa.txt");
fout << "HELLO C++ Programmer.\n"
<< “This is the first line\n"
<< “this is the second line\n";
fout.close();
}
‫ الملفات‬... ‫تابع‬
‫ سلسلة من‬.‫البايتات‬ : Stream 
‫للكتابة على‬: ‫الملف‬ ofstream 
‫للقراءة من‬: ‫ملف‬ ifstream 
‫للقراءة‬: ‫والكتابة‬ fstream 

:‫ فتح الملف‬
‫فتح باستخدام البناء‬

ofstream outFile("sample.txt");    //output only


ifstream inFile(“sample.txt”);  //input only
()open ‫ فتح الملف باستخدام الدالة‬
 Stream-object.open(“filename”, mode)
  ofstream outFile;
  outFile.open("sample.txt");
     
      ifstream inFile;
      inFile.open("sample.txt");
fstream file;
file.open ("example.bin", ios::out | ios::app |
ios::binary);
‫الكتابة في ملف‬
‫نربط الملف الرأسي الذي يحوي كلسات قنوات الملفات‪//‬‬
‫>‪#include <fstream‬‬
‫)(‪void main‬‬
‫{‬
‫أي للكتابة على الملف ‪ out‬نعرف متغير قناة خرج‪//‬‬
‫;‪ofstream fout‬‬
‫نفتح القناة الن على ملف محدد باسمه ونضع لفتة على القناة أو راية تدل أنها قناة من البرنامج وتودي‪//‬‬
‫للملف‬
‫;)‪fout.open("D:\\MyFile.txt" , ios::out‬‬
‫الن جاهزون لستخدام القناة ‪//‬‬
‫;"‪fout << "Hello this is my first file test‬‬
‫الن لنغلق القناة‪//‬‬
‫;)(‪fout.close‬‬
‫}‬
‫كتابة في ملف أم قراءة ؟؟‬
#include<iostream.h>
#include<fstream.h>
void main()
{
ifstream fin;
fin.open("MyFile.txt");
char c;
while( ! fin.eof())
{
fin >> c;
cout << c;
}
fin.close();
}
‫الكتابة في ملف! لماذا مصفوفة؟؟‬
#include<fstream>

int main()
{
     ofstream fout;
     fout.open("out.txt");
     char str[300]=“Welcome to C++ course.
Have a nice day.";
     fout<<str;
     fout.close();
     return 0;
}
‫كتابة أم قراءة من ملف؟‬
#include<fstream.h>
#include<conio.h>
int main()
{
     ifstream fin;
     fin.open("out.txt");
     char ch;
     while(!fin.eof())
     {
          fin.get(ch);
          cout<<ch;
     }
     fin.close();
}
‫ما عمل البرنامج التالي؟‬
#include<fstream.h>
#include<conio.h>
int main()
{
     ifstream fin;
     fin.open("out.txt");
     clrscr();
     char ch; int count=0;
     while(!fin.eof())
     {
          fin.get(ch);
          count++;
     }
     cout<<"Number of characters in file is "<<count;
     fin.close();
     getch();
     return 0;
}
‫بعض السئلة والتمارين حول الملفات‬
‫‪‬اكتب برنامجا لكتابة نصا في سطرين داخل ملف‬
‫‪ .example.txt‬موضحا كيفية فتح الملف للكتابة دون‬
‫مسح محتويات الملف إن كان موجودا من قبل‪.‬‬
‫‪‬اكتب برنامجا يقوم بقراءة محتويات الملف المذكور في‬
‫التمرين السابق وطباعة محتوياته على الشاشة‪ .‬وإن‬
‫كان الملف غير موجود فإنه يطبع رسالة تبين ذلك‪.‬‬
‫‪‬اكتب برنامجا لحساب حجم الملف ‪example.txt‬‬

‫المصدر‪ :‬الدليل العملي للمقرر‬


‫انتهى اللقاء‬
‫مع أطيب التمنيات للجميع بالنجاح والتوفيق‬
‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬

‫مقرر برمجة)‪1291 (1‬‬

‫لقاء إفتراضي بعنوان‬


‫مناقشة مواضيع هامة لمادة قبل النهائي )أمثلة وتدريبات(‬

‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى أسعد ‪ /‬منسق المقرر‬
‫فرع رام ال والبيرة‬

‫السبت ‪29/11/2014‬‬
‫‪‬الصناف‬
‫‪‬الوراثة وأنواعها‬
‫‪‬محددات الوراثة‬
‫‪‬الكتابة في الملفات‬
‫‪‬القراءة من الملفات‬
‫الوراثة‬
‫مثال على الوراثة‬
class Shape {
protected:
float width, height;
public:
void set_data (float a, float b) { width = a; height
= b; }
};
class Rectangle: public Shape { class Triangle: public Shape {
public: public:
float area () { return (width * height); } float area () {
}; return (width * height / 2); }
};
int main () {
Rectangle rect;
Triangle tri; output
rect.set_data (5,3); :
tri.set_data (2,5); 15
cout << rect.area() << endl; cout << tri.area() << 5
endl; return 0;
}
‫ماذا يرث الصنف‬
class base1 {
public:
‫غموض‬
void some_function( ) { .... ... .... }
};
class base2 {
void some_function( ) { .... ... .... }
};
class derived : public base1, public base2 {
};
int main() { ‫ما الهدف من وضع‬
derived obj; ‫محدد للوراثة؟؟‬
obj.same_function( ) ; // Error!!
} :‫الحل‬
int main() {
...
‫ما نوع الوراثة في المثال السابق؟‬
obj.base1::same_function( )
;
‫محددات الوراثة‬
 Class Father{

};
 class son: public Father{

}
‫أسئلة وتمارين حول الوراثة‬
‫‪‬اكتب النص البرمجي الذي يحقق الوراثة المنفردة‬
‫الموضحة في الشكل التالي علما بان الصنفان‬
‫المشتقان يحتويان دوال حساب المساحة‪.‬‬
‫‪CPolygon‬‬
‫‪width : Integer‬‬
‫‪height : Integer‬‬

‫)(‪set_values‬‬

‫‪CRectangle‬‬ ‫‪CTriangle‬‬

‫)( ‪area‬‬ ‫)( ‪area‬‬


‫معالجة الملفات بلغة ‪++C‬‬
‫‪ ‬إذا أحببت أن تتعامل مع قنوات الملفات يجب أن نستخدم الملف‬
‫الرأسي ‪ fstream.h‬أي قنوات الملفات ‪File Stream‬‬
‫إذا يجب أن تكون العبارة ‪:‬‬
‫>‪#include <fstream.h‬‬
‫‪ ‬للكتابة داخل أي ملف توجد ‪ 3‬خطوات وهي‪:‬‬
‫نعرف كائن من نوع ملف‪:‬‬ ‫‪.1‬‬
‫نفتح الملف للكتابة‬ ‫‪.2‬‬
‫نكتب داخل الملف‬ ‫‪.3‬‬

‫; ‪1. ofstream fout‬‬


‫;)‪2. fout.open("file path",iostream family‬‬
‫;"‪3. fout<<"data‬‬
‫ برنامج لكتابة أكثر من سطر في ملف‬:‫مثال‬
#include <fstream.h>
int main()
{
ofstream fout;
fout.open("D:\\firstExa.txt");
fout << "HELLO C++ Programmer.\n"
<< “This is the first line\n"
<< “this is the second line\n";
fout.close();
}
‫ الملفات‬... ‫تابع‬
‫ سلسلة من‬.‫البايتات‬ : Stream 
‫للكتابة على‬: ‫الملف‬ ofstream 
‫للقراءة من‬: ‫ملف‬ ifstream 
‫للقراءة‬: ‫والكتابة‬ fstream 

:‫ فتح الملف‬
‫فتح باستخدام البناء‬

ofstream outFile("sample.txt");    //output only


ifstream inFile(“sample.txt”);  //input only
()open ‫ فتح الملف باستخدام الدالة‬
 Stream-object.open(“filename”, mode)
  ofstream outFile;
  outFile.open("sample.txt");
     
      ifstream inFile;
      inFile.open("sample.txt");
fstream file;
file.open ("example.bin", ios::out | ios::app |
ios::binary);
‫الكتابة في ملف‬
‫نربط الملف الرأسي الذي يحوي كلسات قنوات الملفات‪//‬‬
‫>‪#include <fstream‬‬
‫)(‪void main‬‬
‫{‬
‫أي للكتابة على الملف ‪ out‬نعرف متغير قناة خرج‪//‬‬
‫;‪ofstream fout‬‬
‫نفتح القناة الن على ملف محدد باسمه ونضع لفتة على القناة أو راية تدل أنها قناة من البرنامج وتودي‪//‬‬
‫للملف‬
‫;)‪fout.open("D:\\MyFile.txt" , ios::out‬‬
‫الن جاهزون لستخدام القناة ‪//‬‬
‫;"‪fout << "Hello this is my first file test‬‬
‫الن لنغلق القناة‪//‬‬
‫;)(‪fout.close‬‬
‫}‬
‫كتابة في ملف أم قراءة ؟؟‬
#include<iostream.h>
#include<fstream.h>
void main()
{
ifstream fin;
fin.open("MyFile.txt");
char c;
while( ! fin.eof())
{
fin >> c;
cout << c;
}
fin.close();
}
‫الكتابة في ملف! لماذا مصفوفة؟؟‬
#include<fstream>

int main()
{
     ofstream fout;
     fout.open("out.txt");
     char str[300]=“Welcome to C++ course.
Have a nice day.";
     fout<<str;
     fout.close();
     return 0;
}
‫كتابة أم قراءة من ملف؟‬
#include<fstream.h>
#include<conio.h>
int main()
{
     ifstream fin;
     fin.open("out.txt");
     char ch;
     while(!fin.eof())
     {
          fin.get(ch);
          cout<<ch;
     }
     fin.close();
}
‫ما عمل البرنامج التالي؟‬
#include<fstream.h>
#include<conio.h>
int main()
{
     ifstream fin;
     fin.open("out.txt");
     clrscr();
     char ch; int count=0;
     while(!fin.eof())
     {
          fin.get(ch);
          count++;
     }
     cout<<"Number of characters in file is "<<count;
     fin.close();
     getch();
     return 0;
}
‫بعض السئلة والتمارين حول الملفات‬
‫‪‬اكتب برنامجا لكتابة نصا في سطرين داخل ملف‬
‫‪ .example.txt‬موضحا كيفية فتح الملف للكتابة دون‬
‫مسح محتويات الملف إن كان موجودا من قبل‪.‬‬
‫‪‬اكتب برنامجا يقوم بقراءة محتويات الملف المذكور في‬
‫التمرين السابق وطباعة محتوياته على الشاشة‪ .‬وإن‬
‫كان الملف غير موجود فإنه يطبع رسالة تبين ذلك‪.‬‬
‫‪‬اكتب برنامجا لحساب حجم الملف ‪example.txt‬‬

‫المصدر‪ :‬الدليل العملي للمقرر‬


‫انتهى اللقاء‬
‫مع أطيب التمنيات للجميع بالنجاح والتوفيق‬
‫جامعة القدس المفتوحة‬
‫كلية التكنولوجيا والعلوم التطبيقية‬
‫مقرر برمجة)‪1291 (1‬‬

‫لقاء إفتراضي بعنوان‬


‫مراجعة ومناقشة أسئلة امتحانات لمادة المتحان النصفي‬
‫إعداد وتقديم‪:‬‬
‫أ‪ .‬عيسى أسعد ‪ /‬منسق المقرر‬
‫فرع رام ال والبيرة‬

‫الثلثاء ‪21/10/2014‬‬
‫مواضيع اللقاء‬

‫يحتوي اللقاء على حل أسئلة وردت في‬


‫امتحانات نصفية لسنوات سابقة في مختلف‬
‫مواضيع مادة المتحان النصفي‪.‬‬
‫السؤال الول‪ :‬أجب بنعم أو ل على السئلة التالية واضعا الجابة في‬
‫الجدول رقم )‪ (1‬في دفتر الجابة‪.‬‬
‫اخرى‪.‬تتضمن‬ ‫‪Aggregation .1‬‬
‫‪ .2‬يمكن للقوائم المتصلة ‪ linked list‬أن تحتوي عناصر من أنواع مختلفة‪.‬‬
‫‪ .3‬الوراثة )‪ (Inheritance‬تكون بين الصناف )‪ (Classes‬وليس الكائنات )‪.(Objects‬‬
‫‪ .4‬البرمجة الكينونية )‪ (OOP‬هي هي التي تستخدم الكائنات )‪ (Objects‬اساسا في عملية البرمجة‪.‬‬
‫‪ .5‬إن عملية التحليل الكينوني )‪ (OOA‬توضح العلقات والروابط بين الكائنات من خلل التركيز على‬
‫التفاعلت المختلفة بينها وعلقتها ببعضها البعض‪.‬‬
‫‪ .6‬ل يمكن استخدام المؤشرات مع التراكيب و الصناف‪.‬‬
‫‪ .7‬البناء ‪ Constructor‬يمكن استدعائه من داخل دالة في الكائن‪.‬‬
‫‪ .8‬الصنف عبارة عن مجموعة من الكائنات المشتركة في قيم الصفات والسلوك‪.‬‬
‫‪ .9‬حجزة الذاكرة بالطريقة الديناميكية يتم اثناء التنفيذ‪.‬‬
‫‪ .10‬في حال عدم تبيان محدد الوصول عند تعريف عناصر الصنف فإن المحدد يعد تلقائيا من النوع‬
‫الخاص‪.‬‬
‫‪ .11‬الجملة ‪ ; cin >> a >> b‬صحيحة و تستخدم لدخال أكثر من قيمة‪.‬‬
‫‪ .12‬ل يمكن ان تحتوي المصفوفات على كائنات‪.‬‬
‫‪ .13‬الكائن ‪ cin‬يتوقف عن قراءة السلسة الرمزية عند أول فراغ أو رمز السطر الجديد "\‪."n‬‬
‫‪ .14‬عند تعريف مصفوفة داخل دالة ول نضع قيم لعناصرها فإن قيم العناصر ستبقى عشوائية ما لم‬
‫نسند قيم لهذه العناصر‪.‬‬
‫المتغير ‪ b‬في المتغير ‪.a‬‬ ‫عنوان‬
‫الفرع‬ ‫‪1‬‬
‫ستضع‬
‫‪2‬‬
‫‪ .15‬الجملة ‪;a=&b‬‬
‫‪3 4 5 6 7‬‬ ‫‪8 9 10 11 12 13 14 15‬‬
‫الصحيح‬ ‫ل‬ ‫ل‬ ‫ل‬ ‫نع‬ ‫نع‬ ‫ل‬ ‫ل‬ ‫ل‬ ‫نع‬ ‫نع‬ ‫نع‬ ‫ل‬ ‫نع‬ ‫نع‬ ‫نع‬
‫ه‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬ ‫م‬
: ‫سؤال‬
:++C ‫اكتب ما يقابل الشكل التالي بلغة‬

Students
<<public>> id : Integer
<<private>> name : String
<<protected>> birthdata : Date

<<public and return int>> age()


Students
<<public>> id : Integer
<<private>> name : String
<<protected>> birthdata : Date

<<public and return int>> age()

‫الجابة‬
class Students {
private:
char name[30];
protected:
Date birthdata;
public:
int id;
int age(){ return now -birthdata;}
};
‫اذكر ثلثة من الخصائص الساسية للغات البرمجة‬
‫الكينونية الجيدة‪.‬‬

‫• الجابة‪:‬‬
‫– أن يكون يرنامجا صحيحا‪ :‬وذلك بان يقوم بأداء الوظيفة‬
‫المحددة في مرحلة التحليل و التصميم دون وجود أخطاء‪.‬‬
‫– أن يكون برنامجا فعال‪ :‬يقوم بوظيفته من خلل الستغلل‬
‫المثل لنظام الحاسوب ومكوناته‪.‬‬
‫– قابل لعادة الستخدام‪ :‬وذلك بان يبنى من مكونات يمكن‬
‫الستفادة منها في بناء برامج أخرى‪.‬‬
‫– أن يكون برنامجا مرنا وقابل للتكيف مع الظروف والبيئات‬
‫التي سيعمل بها‪.‬‬
‫– أن تكون تكلفة صيانته منخفضة‪.‬‬
‫هناك طريقتان لحجز الذاكرة‬
‫لكائن ما‪ ،‬اشرحهما مدعما الجابة‬
‫بجمل لغة ‪ ++C‬المستخدمة لكل‬
‫طريقة‪.‬‬
‫هناك طريقتان لحجز الذاكرة لكائن ما‪ ،‬اشرحهما مدعما‬
‫الجابة بجمل لغة ‪ ++C‬المستخدمة لكل طريقة‪.‬‬

‫الطريقة الستاتيكية ‪ :static memory allocation‬يقوم المترجم بحجز الذاكرة‬ ‫–‬


‫للمتغيرات المستخدمة لتبقى محجوزة طوال فترة التنفيذ وإن لم تستخدم‪.‬‬
‫مثال‪:‬‬
‫‪;int p=5‬‬

‫الطريقة الديناميكية ‪ :dynamic memory allocation‬تسمح لنا هذه الطريقة بحجز‬ ‫–‬
‫الذاكرة التي نحتاج عند الحاجة اليها في فترة التنفيذ‪ ،‬وعند انتهاء الحاجة نستطيع تحريرها‬
‫كي تستخدم لغراض أخرى‪.‬‬

‫مثال‪ :‬هنا ‪ p‬هو المتغر المؤشر لموقع الذاكرة المحجوزة و *‪ p‬هو الموقع المشار‬
‫اليه‪.‬‬
‫‪;int *p‬‬
‫‪;p=new int‬‬
‫اكتب المقطع البرمجي الذي يقابل الشكل التالي مستخدما )& و*(‪:‬‬

‫الجابة‪:‬‬
‫;‪int y = 5‬‬
‫;‪int *yPtr‬‬
‫;‪yPtr = &y‬‬
‫ما المقصود بإعادة التحميل‬
‫‪ overloading‬للدوال؟ اعط مثال‬
‫يوضح ذلك؟‬
‫ما المقصود بإعادة التحميل ‪ overloading‬للدوال؟‬
‫اعط مثال يوضح ذلك؟‬

‫الجابة‪:‬‬
‫المقصود هو‪ :‬امكانية كتابة أكثر من دالة تحت السم نفسه في الصنف‬
‫الواحد شرط ان تختلف في نوع أو عدد معاملتها أو في النوع والعدد‬
‫معا‪ .‬مثال‪:‬‬
‫…‬
‫};‪int power(int x) {return x*x‬‬
‫)‪int power(int x, int n‬‬
‫;‪{ int p=x‬‬
‫} ;‪for(int i=0;i<n;i++) p*=x; return p‬‬
‫…‬
‫وضح كل مما يلي‪ 8=4+4) :‬علمات(‬

‫‪ .1‬المحدد الخاص‪ private‬والمحدد العام‬


‫‪public‬‬
‫‪ .2‬البناء ‪ constructor‬والهدام ‪destructor‬‬
‫‪ .3‬أوجد ناتج تنفيذ النص البرمجي التالي‪ ،‬ثم أوضح‬
‫الهدف من عمل الدالة ‪ 3+3=6) .abc‬علمات(‬

‫>‪#include <iostream‬‬
‫)‪int abc(int x, int n‬‬
‫;‪{ int p‬‬
‫;‪if(n==0) p=1‬‬
‫};‪else{ p=x; for(int i=1;i<n;i++) p*=x‬‬
‫;‪return p‬‬
‫;}‬
‫)(‪main‬‬ ‫الجابة‪:‬‬
‫الناتج هو ‪125‬‬
‫{‬ ‫والهدف هو ايجاد قيمة العدد ‪ x‬مرفوعا للقوة ‪ .n‬أي‬
‫;)‪cout<<abc(5,3‬‬ ‫)‪power(x,n‬‬
‫}‬
‫)‪ 15‬علمة(‬ ‫السؤال الرابع‪-:‬‬
‫‪ .1‬عرف القوائم المتصلة ثم أوضح آلية عملها‪3) .‬‬
‫علمات(‬
‫‪ .2‬تعتبر القوائم المتصلة ‪ linked list‬بديل مفضل‬
‫للمصفوفات في كثير من الحيان لعدة اسباب‪،‬‬
‫اذكرها‪ 6=3+3) .‬علمات(‬
‫‪ .3‬ما مساوىء القوائم المتصلة عند مقارنتها مع‬
‫المصفوفات‪ 6=3+3).‬علمات(‬
‫عرف القوائم المتصلة ثم أوضح آلية عملها‪ 3) .‬علمات(‬
‫مجموعة من العقد ‪ nodes‬المتجانسة )من النوع نفسه( مرتبة بشكل خطي بحيث تحمل كل عقدة‬
‫عنوان العقدة التي تليها باستثناء آخر عقدة إذ تحمل القيمة الخاصة ‪ null‬للشارة إلى انتهاء‬
‫القائمة المتصلة‪.‬‬

‫تعتبر القوائم المتصلة ‪ linked list‬بديل مفضل للمصفوفات‬


‫في كثير من الحيان لعدة أسباب‪ ،‬اذكرها‪6=3+3) .‬‬
‫علمات(‬
‫اضافة عنصر او شطبه ل يطلب عملية إزاحة البيانات كما هو الحال في المصفوفات‪.‬‬ ‫‪.1‬‬
‫تمكننا من استخدام الذاكرة بطريقة اقتصادية بحيث نحجز الذاكرة الخاصة بالعقد فقط عند الحاجة‬ ‫‪.2‬‬
‫إليها ونحررها فور انتهاء الحاجة إليها بطريقة ديناميكية‪ .‬‬

‫ما مساوىء القوائم المتصلة عند مقارنتها مع المصفوفات‪ 6=3+3).‬علمات(‬


‫المعالجة التتابعية ‪:‬ل بد من استعراض القائمة المتصلة عنصرا عنصرا من بدايتها إلى أن نصل‬
‫العنصر المطلوب‪ .‬مما يتطلب وقت تنفيذ طويل‪.‬‬
‫تتطلب بعض البرمجيات المعقدة للتعامل معها‪ ،‬بينما المصفوفات أقل تعقيدا للبرمجة‪.‬‬
‫سؤال حول التراكيب ‪Structs‬‬
‫• اكتب تركيب ‪ Structure‬باسم ‪ employee‬بحيث يصف بيانات‬
‫الموظف التالية ‪:‬اسم الموظف ) مصفوفة رمزية بحد أقصى ‪20‬‬
‫رمز(‪ ,‬رقم الموظف )عدد صحيح(‪ ,‬والراتب الشهري للموظف‬
‫)عدد حقيقي(‪ .‬ثم انشئ كائن )عبارة عن مصفوفة مكونة من ‪5‬‬
‫عناصر( ‪,‬وذلك لدخال خمسة موظفين من التركيب أعله داخل‬
‫الدالة الرئيسية ‪ .( )main‬ثم بين كيف يمكن إدخال )قراءة(‬
‫البيانات )السم والرقم والمعدل ( ثم طباعتها على الشاشة؟‬
#include <iostream>
struct employee
{
;int no
;char name[20]
;float salary
};
int main ()
{
;employee emp
";cout<<"enter the employee number:\n
;cin>>emp.no
";cout<<"enter the employee name:\n
;cin>>emp.name
";cout<<"enter the employee salary:\n
;cin>>emp.salary
 
cout<<"=============================================\
";n
";cout<<"employee number ="<<emp.no<<"\n
";cout<<"employee name ="<<emp.name<<"\n
";cout<<"employee salary ="<<emp.salary<<"\n
cout<<"=============================================\
";n
}
‫‪1132‬‬
‫• ‪ :1132‬هناك طريقتين لحجز الذاكرة وضحهما؟‬
‫)‪9‬علمات(‬
‫– الجابة‪ :‬تم شرحها سابقا‬
‫• ‪ :1132‬اكتب تركيب لشخص ‪ person‬يحتوي على السم‬
‫‪,‬العمر ‪,‬الطول ‪,‬الوزن ثم عرف متغير من نوع شخص‬
‫واسند القيمة ‪ 22‬للعمر و‪ 70‬للوزن‪10).‬علمات(‬
‫– الجابة‪ :‬مشابهة لجابة سابقة‪.‬‬
‫أسئلة سابقة حول البناء‬
‫‪1132‬‬
‫وضح خصائص الدالة البناءة؟)‪4‬علمات(‬ ‫•‬
‫لديك الصنف التالي ‪:‬‬ ‫•‬

‫اكتب ببنائين لهذا الصنف بحيث نستطيع إنشاء كائنات من هذا الصنف‬
‫بطريقتين‪:‬‬
‫الولى مع إعطاء قيم ابتدائية للكائن‬ ‫–‬
‫والخرى بدون إعطاء قيم حيث يتم إعطاء قيمة تلقائية تساوي صفر لرقم الطالب‪.‬‬ ‫–‬
‫)‪16‬علمة(‬
‫‪1132‬‬
‫السؤال‪ :‬اكتب دالة سمها ‪ myfunc‬ولها صيغتين ‪:‬الصيغة الولى‬
‫تعمل على إعادة العدد الصحيح نفسه المرسل لها‪ ,‬الصيغة الثانية‬
‫تعيد عددا ا صحيحا ا يمثل ناتج جمع العددين الصحيحين المرسلين‬
‫لها‪10).‬علمة(‬

‫– مناقشة‪:‬‬
‫• ما هو المصطلح المستخدم هنا‪.‬‬
‫‪1101‬‬
‫• أكتب داله بلغة السي تقوم بتعريف مصفوفة‬
‫إحادية بالقيم الوليه )‪ ،(3،5,8,0,1,11,9‬ومن ثم‬
‫البحث عن العدد ‪ 1‬اذا كان موجود فيها‪ ،‬وطباعة‬
‫كلمة ‪ yes‬اذا كان موجود بالضافه لطباعة العدد‬
‫وال طباعه ‪ .no‬واستدعائها من خلل الداله‬
‫الرئيسية ‪()main‬‬
#include <iostream>
using namespace std;
int findnum()
{
One Solution
int n;
int num[]={3,5,8,1,11,9};
for(int i = 1; i < 6; i++)
{
if(if(num[i] == 1))
{
n= num[i];
break;
}
}
if (n==1) return n;
else
cout<<"the number 1 does not exisit";
}

int main()
{
int n ;
n = findnum();
cout<<"the num number :"<<n<<" is found";
}
#include <iostream>
using namespace std;
int findnum()
{
Another Solution
int n;
int num[]={3,5,8,1,11,9};
for(int i = 1; i < 6; i++)
if(num[i] == 1) return num[i];

cout<<"the number 1 does not exist";


}

int main()
{
int n ;
n = findnum();
cout<<"the num number :"<<n<<" is found";
}
‫أكتب داله بلغة السي تقوم بتعريف مصفوفة إحادية بالقيم‬
،‫ ومن ثم طباعة العدد الكبر فيها‬،(3،5,8,0,1,11,9) ‫الوليه‬
.‫واستدعائها من خلل الدالة الرئيسية‬
#include <iostream>
using namespace std;
int findMax()
{
int num[]={3,5,8,1,11,9};
int max=num[0];
for(int i = 1; i < 6; i++)
{
if(num[i] > max)
max = num[i];
}
return max;
}
int main()
{
int max ;
max = findMax();
cout<<"the max number is :"<<max;
}
‫احسب قيمة التعابير التاليه اذا كانت‬
‫‪z=8, y=3, x=4‬‬

‫التعبير‬ ‫القيم‬
‫ة‬
‫‪y&x != z/x+3‬‬
‫)‪z++ || (!(--y<=1) && x-- != 2‬‬
‫)‪++x | --y || !(y++ <= z/a‬‬
: ‫أوجد ناتج تنفيذ الرنامج التالي‬
#include <iostream>
using namespace std;

int main()
{
int x[5], y[5] ;
for(int i=0;i<5;i++)
{
x[i]=i;
y[i]=i*i;
cout<<"\n"<<x[i]<<"\t"<<y[i];
}
}
‫انتهى اللقاء‬
‫• تمنياتي لكم بالنجاح والتوفيق في المتحان‬
‫النصفي‬
‫عرف المصطلحات التالية ‪:‬‬
‫خاصية إخفاء المعلومات ‪information‬‬ ‫•‬
‫‪hiding‬‬
‫المحدد الخاص ‪private‬‬ ‫•‬
‫البناء ‪constructor‬‬ ‫•‬
‫القائمة المتصلة ‪linked list‬‬ ‫•‬
‫مقدمة في البرمجة‬
‫الوحدة اللولى‪ :‬مقدمة‬ ‫‪‬‬

‫الوحدة الثانية‪ :‬البيانات لوالعمليات‬ ‫‪‬‬

‫الوحدة الثالثة‪ :‬التحكم‬ ‫‪‬‬

‫الوحدة الرابعة‪ :‬المؤشرات لوالمصفوفات لوالسللسل‬ ‫‪‬‬

‫الوحدة الخامسة‪ :‬الدلوال‬ ‫‪‬‬

‫الوحدة السادلسة‪ :‬التراكيب لوالنصناف‬ ‫‪‬‬

‫الوحدة السابعة‪ :‬المصفوفات لوالقوائم المتصلة‬ ‫‪‬‬

‫الوحدة الثامنة‪ :‬الدلوال الصديقة لوالعمليات‬ ‫‪‬‬

‫الوحدة التالسعة‪ :‬النصناف المشتقه لوالقوالب‬ ‫‪‬‬

‫‪1‬‬
‫برمجة ‪1‬‬

‫‪2‬‬
‫الوحدة السادلسة‬

‫التراكيب لوالنصناف‬

‫‪3‬‬
structure ‫التراكيب‬
‫ مجموعة من الحقول المتعلقة بكائن معين مثل الطالب‬
Stdname, stdnumber, dept, grade
:‫يتم تعريف التركيب في لغة لسي كالتالي‬
Struct student
{char stdname[20];
Int stdnumber;
Char dept[7];
Float grade;
};

4
‫‪ ‬يستخدم التركيب لتعريف نوع جديد من البيانات يمكن انشاء متغيرات من‬
‫هذا النوع أي انشاء متغير من نوع ‪student‬‬
‫;‪Struct student x,y‬‬
‫في لغة ‪ ++C‬لوليس ‪ C‬يمكن كتابة التعريف بدلون كلمة ‪struct‬‬
‫‪OR‬‬
‫تعريف المتغيرات مباشرة بعد تعريف التركيب‬
‫‪Struct student‬‬
‫;]‪{char name[20‬‬
‫‪--‬‬
‫;‪--} x,y‬‬

‫‪5‬‬
‫لمعالجة أي حقل في التركيب نذكر السم المتغير ثم نقطة‬ ‫‪‬‬

‫ثم السم الحقل‬


‫;‪X.stdnumber=100‬‬
‫;”‪Y.stdname=“ali ahmad‬‬

‫‪6‬‬
‫التراكيب لوالمصفوفات‬
‫‪ ‬يمكن انشاء مصفوفة من التراكيب مثل شعبة من الطلبة‬
‫;]‪Struct student cs[40‬‬
‫لولمعالجة أي حقل في أي تركيب يتم الونصول اليه كالتالي‪:‬‬
‫;‪Cs[3].stdnumer=20‬‬
‫)‪Float average(student st[], int n‬‬
‫;‪{float sum=0; int I‬‬
‫)‪For (i=0; i<n; i++‬‬
‫;‪sum+=st[i].grade‬‬
‫};‪return sum/n‬‬

‫‪7‬‬
‫النصناف ‪Classes‬‬
‫يختلف الصنف عن التركيب في انه بالاضافة الى الحقول‬ ‫‪‬‬

‫يعرف مجموعة من الدلوال القادرة على التعامل مع هذه‬


‫الحقول‪ .‬يسمى كل حقل في الصنف بالمتغير المنتمي لوكل‬
‫دالة تدعى داله منتمية‪.‬‬

‫‪8‬‬
‫مثال‬
Class property {
private:
float area;
float monthRentVal;
float price;
public:
float increseRent(float incr);
float decreaseRent(float decr);
float incresePrice(float incr);
float decreasePrice(float decr);
float yearlyRent();
float getPrice();
float getArea();
float getMonthRent();};
9
‫الكائنات ‪Objects‬‬
‫تعريف الصنف هو تعريف لنوع جديد من البيانات‪،‬‬ ‫‪‬‬

‫يستخدم هذا الصنف لتعريف متغيرات تسمى كائنات‬


‫;‪Property P1, P2‬‬
‫يمكن الستخدام الكائنات من خلل الدلوال المنتمية كالتالي‪:‬‬ ‫‪‬‬

‫;)‪P1.increaseRent(100.0‬‬

‫‪10‬‬
‫الدلوال المنتمية‬
‫كتابة الدالة المنتمية تشبه الدالة العادية بالاضافة الى تحديد‬ 

‫الصنف الذي تنتمي اليه‬


Float property::increaseRent(float incr)
{monthRentVal+=incr;
return monthRentVal;
}
Float property:: yearlyRent()
{return 12*monthRentVal;}
11
‫البناءلون لوالهدامون ‪constructor & destructor‬‬

‫يستخدم البناء لعطاء قيم الولية للمتغيرات الموجودة في‬ ‫‪‬‬

‫القسم ‪ private‬لننا ل نستطيع الونصول اليها مباشرة‬


‫ال من خلل دالة فل يجوز ان نقول‬
‫‪;p1.price=200.0‬‬
‫لذلك نقوم بواضع بناء داخل الصنف لعطاء القيم اللولية‬ ‫‪‬‬

‫للمتغيرات المنتمية في القسم الخاص‬

‫‪12‬‬
Class property {
private:
float area;
float monthRentVal;
float price;
public:
property(float sz, float rent, float prc);
float increseRent(float incr);
float decreaseRent(float decr);
float incresePrice(float incr);
float decreasePrice(float decr);
float yearlyRent();
float getPrice();
float getArea();
float getMonthRent();};
13
‫من خلل البناء نقوم بإعطاء القيم اللولية للمتغيرات عند انشاء أي كائن‬ 
‫جديد‬
‫السم البناء هو نفس السم الصنف‬ 

void ‫ليس لها قيمة راجعة لول حتى‬ 

Property::Property (float sz, float rent, float


prc)
{area=sz;
monthRentVal=rent;
Price=prc;}
Property p1=property (150.0,10.0, 250.0);
OR property p1 (150.0,10.0, 250.0);
14
Property::property()
{area=0.0;
mothRenVal=0.0;
Price=0.0}

15
‫الهدامون‬
‫يقوم الهدام بإنهاء حياة الكائن لوتحرير الذاكرة المحجوزة‬ ‫‪‬‬

‫له‪ ،‬الو انهاء العمل الذي قام به الكائن الو طباعة رلسالة‬
‫معينة‬
‫ل يرجع الهدام أي شيء لويكون السمه نفس السم الصنف‬ ‫‪‬‬

‫)(‪Property::~property‬‬
‫}{‬

‫;)(‪P1.~property‬‬
‫‪16‬‬
++C ‫الدخال لوالخراج في لغة‬
‫الخراج‬ 

Cout<<“hello world”;
Cout<<“hello” <<“world”;
Cout<<“hello \n”<<“world”;
‫الموجود في‬ostream ‫ هي كائن من الصنف‬Cout
iostream.h‫المكتبة‬

17
‫الدخال‬ 

Float x;
Int y;
Cin>>x>>y;

18
‫ادخال السللسل الرمزية‬
‫‪ ‬يمكن ادخال السللسل الرمزية بالستخدام ‪ cin‬لولكن القراءة تقف‬
‫عند الول فراغ‬
‫;]‪Char name[30‬‬
‫‪Cin>>name; mohammad ali‬‬
‫يقرأ ‪ mohammad‬فقط‪ .‬لولحل هذه المشكلة نستخدم الدالة‬
‫‪ getline‬التي تقرأ لسطر كامل‬
‫;)‪Cin.getline(str,length, terminating_char‬‬
‫;]‪Char name[30‬‬
‫تقرأ‪ 29‬حرف;)’‪Cin.getline(name, 30, ‘\n‬‬
‫‪19‬‬
‫تحميل الدلوال ‪overloading‬‬
‫ما يعرف الدالة ليس السمها فقط بل عدد العوامل لونوعها‪.‬‬ ‫‪‬‬

‫لذلك يمكننا كتابة اكثر من دالة بنفس اللسم لولكن باختلف‬


‫عدد العوامل الو نوعها‬
‫)‪Int pwr(int x, int y‬‬
‫;‪{int p=x‬‬
‫)‪For (int i=0; i<n; i++‬‬
‫;‪P*=x‬‬
‫});‪return p‬‬
‫‪20‬‬
‫)‪Int pwr(int x‬‬
‫};‪{return x*x‬‬
‫;)‪Cout<< pwr(2,3‬‬
‫;)‪Cout<<pwr(2‬‬
‫كما يمكننا من خلل هذه الخانصية كتابة اكثر من بناء‬
‫للصنف الواحد‪ ،‬بناء يأخذ عوامل لوأخر بدلون عوامل أي‬
‫يعطي المتغيرات قيم نصفر‬
‫لولكن ل يجوز لواضع اكثر من هدام‬
‫‪21‬‬
‫الدلوال السطرية‬
‫هي الدلوال الصغيرة التي ل داعي لكتابتها بالطريقة العادية لن‬ ‫‪‬‬

‫الدالة العادية تأخذ لوقت لومساحة في الذاكرة عند الستعدائها‪ .‬هناك‬


‫طريقتان لكتابة الدالة السطرية‪:‬‬
‫‪ ‬تعريف الدالة كاملة داخل تعريف الصنف‬
‫‪ ‬تعريف الدالة خارج الصنف لولكن نذكر انها دالة لسطرية كالتالي‪:‬‬
‫)‪Inline float increase_rent(float incr‬‬
‫;‪{price += incr‬‬
‫};‪Return price‬‬
‫‪Inline‬ل تكتب في النموذج‬

‫‪22‬‬
Class property {
private:
float area;
float monthRentVal;
float price;
public:
property(float sz, float rent, float prc);
float increseRent(float incr);
float decreaseRent(float decr);
float incresePrice(float incr);
float decreasePrice(float decr);
float yearlyRent();
float getPrice(){return price;}
float getArea();
float getMonthRent();};

23
‫العوامل التلقائية ‪default‬‬
‫‪arguments‬‬
‫‪ ‬يمكن لواضع عوامل بقيم تلقائية في نموذج الدالة بحيث اذا لم‬
‫نعطي قيمة لهذا المعامل عند اللستدعاء يستخدم القيمة التلقائية‬
‫)‪Float inctrease_rent (float incr=100.0‬‬
‫عند اللستدعاء‬
‫يزيد اليجار بقيمة‪P1.increase_rent(); 100‬‬
‫يزيد اليجار بقيمة‪P1.increase_rent(150.0)150‬‬
‫يمكن عمل البناء بنفس الطريقة‬

‫‪24‬‬
‫الوحدة السابعة‬

‫المصفوفات لوالقوائم المتصلة‬

‫‪25‬‬
‫مصفوفة من الكائنات‬
‫لتمثيل الطالب نقوم ببناء نصنف خاص بالطالب‬ 

Class student {
Long stno;
Int csno;
Char stName[20];
Public:
void initialize();
long get_stno() {return stno;}
char * get_stName() {return stName;}
};

26
Void student::initialize()
{cout<<“enter student number,
name, courses”;
Cin>>stno;
Cin>>stName;
Cin>>csno;}

27
‫‪ ‬اذا اردنا تمثيل شعبة من ‪ 30‬طالب نحتاج مصفوفة من الكائنات‬
‫نصحيحة في حال عدم لوجود بناء ;]‪Student st[30‬‬
‫اذا كان هناك بناء كالتالي‪:‬‬
‫};‪Student::student (long s) {stno=s‬‬
‫في هذه الحالة الجملة السابقة خطأ‪ .‬لذلك نستخدم احدى الطريقتين‬
‫;}‪Student st[3]={999,888,777‬‬
‫‪Student st[3]={ student(999),‬‬
‫;})‪student(888), student(777‬‬
‫‪28‬‬
‫يمكن الستخدام الكائنات في المصفوفة كل على حدة‬ 

St[3].initialize();
OR
For (int i=0; i<30; i++)
st[i].initialize();
OR
For (int i=0; i<30; i++)
cout<<st[i].get_stno();
29
‫المصفوفات كمتغيرات منتمية‬
‫‪ ‬لو ااضفنا الى الصنف ‪ student‬متغير اخر من نوع مصفوفة مثل ‪grade‬‬
‫;]‪Float grade[5‬‬
‫لودالة لحساب معدل الطالب‬
‫;)(‪Double student::average‬‬
‫;‪{double sum=0.0‬‬
‫)‪For (int i=0; i<csno; i++‬‬
‫;]‪sum+=grades[i‬‬
‫};‪Return sum/csno‬‬

‫الستدعاء الدالة لحساب معدل الطالب ;)(‪Double x=st[4].average‬‬


‫الخامس‬

‫‪30‬‬
‫الدلوال لومصفوفات الكائنات‬
‫يمكن ارلسال مصفوفة من الكائنات الى دالة كما في المصفوفات‬ ‫‪‬‬
‫العادية لولكن التعامل داخل الكائن يكون من خلل الدلوال المنتمية‬
‫فقط‬
‫مثل نريد كتابة دالة لحساب معدل معدلت كل الشعبة‬ ‫‪‬‬

‫)‪Double sectionAv(student* ar, int n‬‬


‫;‪{double sum=0.0‬‬
‫)‪For (int i=0; i<n; i++‬‬
‫;)(‪sum+=ar[i].average‬‬
‫};‪Return sum/n‬‬
‫;)‪Double x=sectionAv(stu, 30‬‬
‫‪31‬‬
‫ترتيب مصفوفة من الكائنات‬
‫الفرز النتقائي ‪selection sort‬‬ ‫‪‬‬

‫نبحث عن انصغر قيمة لونضعها في المكان اللول ثم نبحث عن ثاني‬ ‫‪‬‬

‫انصغر قيمة من ‪2‬الى ‪ n-1‬لونضعها في المكان الثاني‬


‫البحث الثنائي ‪binary search‬‬ ‫‪‬‬

‫يجب ان تكون المصفوفة مرتبة‬ ‫‪‬‬

‫نقسم المصفوفة من المنتصف‬ ‫‪‬‬

‫اذا كان الرقم المطلوب نفس الرقم الذي في المنتصف فقد لونصلنا‬ ‫‪‬‬

‫اما اذا كان الرقم اكبر من القيمة في المنتصف نبحث في القسم الخير‬ ‫‪‬‬

‫لوال نبحث في القسم اللول‬

‫‪32‬‬
‫احتواء مصفوفة من الكائنات في نصنف‬
‫ الن نريد تعريف نصنف‬،‫كنا نعرف نصنف مكون من متغيرات لودلوال منتمية‬ 

‫يحتوي بالاضافة الى ذلك مصفوفة من الكائنات‬


Class section{
student sec[5];
int size;
int bSearch(long stno);
public:
section(){size=0;}
void stAdd(student s);
int stDelete(long stno);
void stList();
void stRetreave(long stno);};
33
‫ايجاد المكان المنالسب لاضافة الطالب حسب الترتيب لوإزاحة الطلبة الذين بعده‬
void section::stAdd(student s)
{int pos =0;
while (s.get_stno()>sec[pos].get_stno()&& pos<size)
pos++;
For (int i=size-1; i>=pos; i--)
sec[i+1]=sec[i];
Sec[pos]=s
Size++
}

34
‫البحث عن الطالب المطلوب لوإزاحة جميع الطلبة الذين بعده‬
int section::stDelete(long stno)
{ int i=bsearch(stno);
If(i>-1)
{For (int j=i; j<size; j++)
sec[j]=sec[j+1];
size--;}
Return I;
}

35
void section::stList()
{for (int i=0; i<=size; i++)
cout<<sec[i].get_stName()<<“ “<<
sec[i].get_stno()<<“
“<<sec[i].average()<<endl;}

void section::stRetreave(long stno)


{ int i=bsearch(stno);
if (i>-1)
cout<<sec[i].get_stno()<<“
“<<sec[i].average()<<endl;
else cout<<“student not found\n”;}

36
‫المؤشرات‬
‫هي متغيرات تحتوي قيم تسمى عنالوين لوتستخدم للشارة‬ ‫‪‬‬

‫الى اماكن في الذاكرة‬


‫المؤشرات باعتبارها متغيرات‬ ‫‪‬‬

‫‪‬‬ ‫;‪Type *name‬‬


‫المؤشرات تحتوي عنالوين مواقع فقط‬ ‫‪‬‬

‫‪‬‬ ‫;‪Int x‬‬


‫‪‬‬ ‫;‪Int *y‬‬
‫‪‬‬ ‫;‪Y=&x‬‬

‫‪37‬‬
‫اذا اردنا لواضع قيمة في المتغير الذي يشير اليه المؤشر ‪ y‬نكتبه‬ ‫‪‬‬

‫كالتالي‬
‫;‪ *y=4‬‬

‫أي اننا لواضعنا ‪ 4‬في المتغير الذي يشير اليه ‪ y‬لوهو ‪ x‬أي ان‬ ‫‪‬‬

‫قيمة ‪ x‬انصبحت ‪4‬‬


‫‪4650‬‬
‫‪x‬‬ ‫‪y 4650‬‬
‫‪x‬‬ ‫‪4‬‬ ‫‪y 4650‬‬

‫‪*Y=4‬‬ ‫‪Y=&x‬‬
‫‪38‬‬
‫ عنوان المتغير‬:& 

‫ القيمة المؤشر عليها‬:* 


Name addres conten
s t
 Int y,z, *ptr;
Y 555 6
 Y=6;
 Ptr=&y;
Z 666 6  Z=*ptr;

Ptr 777 555

39
Char x1=‘a’, x2=‘z’, t, *p;
P=&x1;
T=*p;
*p=x2;
X2=t;

40
x1 x2 t p
P=&x1;
A Z A 1293
T=*p;
1293 7794 2311 4441

*p=x2; x1 x2 t p

z Z A 1293

1293 7794 2311 4441

x1 x2 t p
X2=t; z A A 1293

1293 7794 2311 4441

41
‫مؤشر الى مؤشر‬
‫مؤشر يؤشر على مؤشر اخر‬ ‫‪‬‬

‫يمكن الونصول الى متغير معين من خلل لسلسلة من المؤشرات‬ ‫‪‬‬

‫;’‪Char p1=‘a‬‬
‫;‪Char *p2‬‬
‫;‪Char **p3‬‬

‫‪p3‬‬ ‫‪p2‬‬ ‫‪p1‬‬


‫‪2311‬‬ ‫‪4441‬‬ ‫‪a‬‬
‫‪7794‬‬ ‫‪2311‬‬ ‫‪4441‬‬

‫‪42‬‬
‫المؤشرات لوالنصناف‬
‫يمكن الستخدام المؤشرات للتاشير على كائن الو تركيب كما هو الحال في المتغيرات العادية‬ ‫‪‬‬

‫;‪Int k=10, *p‬‬


‫;‪P=&k‬‬
‫{‪Struct book‬‬
‫;]‪char author[20‬‬
‫;]‪char title[20‬‬
‫;‪int pages‬‬
‫;};‪float price‬‬
‫;‪Book bk1; book *p‬‬
‫;‪P=&bk1‬‬
‫الجمل التالية نفس العمل ;‪Bk1.price=1.5‬‬
‫;‪(*p).price=1.5‬‬
‫;‪P->price=1.5‬‬

‫‪43‬‬
‫كذلك نتعامل مع الكائنات بنفس الطريقة‬ ‫‪‬‬

‫;‪Student st, *p‬‬


‫;‪P=&st‬‬
‫;‪(*p).stno=123‬‬
‫;‪P->stno=123‬‬

‫‪44‬‬
‫حجز الذاكرة ديناميكيا‬
‫‪ ‬عندما كنا نعرف متغير بالطريقة العادية كان يتم حجز مكان في‬
‫الذاكرة لهذا المتغير لويبقى هذا المكان محجوز طيلة تنفيذ‬
‫البرنامج‪.‬‬
‫‪ ‬اما الطريقة الديناميكية فيتم حجز الذاكرة لوتحريرها عند الحاجة‬
‫بالستخدام الدلوال ‪new, delete‬‬
‫;‪Int *p=new int‬‬
‫;‪*p=10‬‬
‫;‪*p=*p+7‬‬
‫هذه الطريقة الوحيدة للتعامل مع المتغيرات من ;‪Cout<<*p‬‬
‫هذا النوع‬
‫‪45‬‬
‫‪ ‬لوبنفس الطريقة نقوم بحجز كائن بطريقة ديناميكية‬
‫;‪Student *s=new student‬‬
‫هذه الجملة نصحيحة فقط في حالة عدم لوجود بناء الو لوجود بناء بدلون معاملت‪.‬‬
‫اما اذا كان هناك بناء فيجب تمرير القيم عند التعريف‬
‫)‪Student:: student (long s, char *na, int cn‬‬
‫;‪{stno= s‬‬
‫;)‪Strcpy(stName,na‬‬
‫};‪Csno=cn‬‬
‫;)‪Student *s=new student(888,”ahmad”, 6‬‬
‫;)(‪cout<<(*s).get_stName‬‬
‫;)(‪Cout<<s->get_stno‬‬
‫لحذف الكائن بعد انهاء الحاجة اليه ;‪Delete s‬‬
‫‪46‬‬
‫حجز المصفوفات بطريقة ديناميكية‬
‫في السابق عندما كنا نعرف مصفوفة كنا نحدد حجمها‬ ‫‪‬‬

‫مسبقا لوقد ل نستخدم كل هذا الحجم لوتبقى الذاكرة‬


‫محجوزة لها طوال البرنامج‪ .‬لوالحل ان نحجز مصفوفة‬
‫نصغيرة بطريقة ديناميكية لواذا احتجنا الى زيادة حجمها‬
‫نستطيع ان نفعل لوكذلك يمكن حذفها‪.‬‬
‫;]‪Float *p=new float[50‬‬
‫)‪For(i=0; i<50; i++‬‬
‫;]‪cin>>p[i‬‬
‫‪47‬‬
‫ بطريقة‬section ‫تعريف الصنف‬
‫ديناميكية‬
:‫الطريقة اللولى‬ 

Class section{
student *sec; ‫كان مصفوفة لوالن انصبح مؤشر‬
int maxSize;
int size;
int bSearch(long stno);
void expand();
public:
section(){sec=new student[20]; 20‫البناء يحجز مصفوفة بحجم‬
maxSize=20; sec ‫لويخزن عنوان الول عنصر في المتغير‬
size=0}
void stAdd(student s);
int stDelete(long stno);
void stList();
void stRetreave(long stno);};

48
‫هذه الدالة تحجز مصفوفة اضعف حجم المصفوفة السابقة لوتنسخ‬
‫جميع عنانصر المصفوفة القديمة اليها ثم تلغي المصفوفة القديمة‬
‫)(‪Void section::expand‬‬
‫;]‪{student *p=new student[2*maxSize‬‬
‫)‪For (int i=0;i<size; i++‬‬
‫;]‪p[i]=sec[i‬‬
‫;‪Delete sec‬‬
‫;‪Sec=p‬‬
‫};‪maxSize*=2‬‬

‫‪49‬‬
‫الطريقة الثانية‪ :‬اكثر ديناميكية‬ ‫‪‬‬

‫في الطريقة اللولى جعلناها ديناميكية على مستوى‬ ‫‪‬‬

‫المصفوفة كاملة‪ ،‬اما الن نريد ان نجعل الكائنات ايضا‬


‫ديناميكية‪ .‬أي ان المصفوفة ل تحتوي على كائنات بل‬
‫مؤشرات على كائنات‪.‬‬

‫‪50‬‬
Class section{
student **sec; ‫مصفوفة من المؤشرات‬
int maxSize;
int size;
int bSearch(long stno);
void expand();
public:
section(){sec=new student*[20];
maxSize=20;
size=0}
void stAdd(student *s);
int stDelete(long stno);
void stList();
void stRetreave(long stno);};

51
Void section::expand()
{student **p=new student*[2*maxSize];
For (int i=0;i<size; i++)
p[i]=sec[i];
Delete sec;
Sec=p;
maxSize*=2;}

52
‫القوائم المتصلة ‪linked lists‬‬
‫مجموعة من العقد التي من نفس النوع‬ ‫‪‬‬

‫السباب تفضيلها على المصفوفات‬ ‫‪‬‬

‫عند شطب الو ااضافة عنصر ل نحتاج لزاحة البيانات كما في‬ ‫‪‬‬

‫المصفوفات‬
‫الستخدام امثل للذاكرة حيث اننا ل نحجز عقدة ال عند الحاجة‬ ‫‪‬‬

‫لسيئاتها‬ ‫‪‬‬

‫المعالجة التتابعية‬ ‫‪‬‬

‫برمجتها معقدة‬ ‫‪‬‬

‫‪53‬‬
‫كل عقدة تحوي مؤشر يؤشر على العقدة التالية‪ ،‬لذلك كل‬ ‫‪‬‬

‫عقدة لسواء نصنف الو تركيب يجب ان يحوي متغير منتمي‬


‫يخزن فيه عنوان العقدة التالية ‪next‬‬
‫يجب ان يكون هناك مؤشر يؤشر على بداية السلسلة‬ ‫‪‬‬

‫‪ head/first‬ل يجب تغيير قيمته‬


‫{‪Struct node‬‬
‫;‪student data‬‬
‫};‪node * next‬‬
‫‪54‬‬
Class linkedList{
node *head;
public:
linkedList(){head=NULL;}
void listAdd(student s);
int listDelete (long stno);
void listTraverse();};
55
‫ااضافة عنصر الى السلسلة‬
Void linkedList::listAdd(student s)
{node *ptr=new node; ‫حجز عقدة جديدة‬
If (ptr==NULL)
cout<<“insufficient memory”;
Else {ptr->data=s;
node *prev=NULL;
node *q=head; ‫البحث عن مكان الاضافة‬
While (q!=NULL && s.get_stno()>q->data.get_stno())
{prev=q;
Q=q->next;}

56
If (prev==NULL) ‫الاضافة في البداية‬
{ptr->next=head;
Head=ptr;}
else ‫الاضافة في المنتصف‬
{ptr->next=prev->next;
Prev->next=ptr;}
}
}
57
‫حذف عنصر من السلسلة‬
Int linkedList::listDelete(long stno)
{node *prev=NULL;
Node *p=head;
While(p && p->data.get_stno()!=stno)
{prev=p;
P=p->next;}
If(!p) return 0; //p=NULL‫العنصر غير موجود‬
If(!prev) ‫العنصر في البداية‬
Head=head->next;
Else prev->next=p->next
Delete p;
Return 1;}
58
‫الستعراض السلسلة‬
Void linkedList::listTraverse()
{node *p=head;
While(p)
{
Cout<<p->data.get_stno()<<“”<<p-
>data.get_stName() endl;
P=p->next;}
}
59
‫الوحدة الثامنة‬

‫الدلوال الصديقة لوالعمليات‬

‫‪60‬‬
‫تمرير العوامل بالشارة‬
Void swap1(int x, int y) Void swap3(int &x, int
{int t=x; &y)
X=y; {int t=x;
Y=t;} X=y;
Swap1(a,b); Y=t;}
Swap3(a,b);
Void swap2(int *x, int *y)
{int t=*x;
‫اذا اردنا ارجاع قيمة بالشارة‬
*X=*y;
Int & max(int a, int b)
*Y=t;}
Swap2(&a,&b); ……

61
‫الدلوال لوالنصناف الصديقة‬
‫ دلوال يمكنها معالجة الجزء الخاص في نصنف معين مع انها غير منتمية‬:‫الدلوال الصديقة‬ 
friend ‫ يتم لواضع تعريفها في داخل الصنف مع ااضافة كلمة‬.‫اليه‬
Class student {
Long stno;
Int csno;
double grades[100]
Char stName[20];
Public:
friend double average(student s);
void initialize();
long get_stno() {return stno;}
char * get_stName() {return stName;}
};

62
‫;)‪Double average(student s‬‬
‫;‪{double sum=0.0‬‬
‫)‪For (int i=0; i<s.csno; i++‬‬
‫;]‪sum+=s.grades[i‬‬
‫};‪Return sum/s.csno‬‬
‫عند اللستدعاء نكتب )‪;average(s‬‬
‫بينما لو كانت منتمية ‪;()s.average‬‬
‫داخل الدالة اذا اردنا ان نتعامل مع القسم الخاص نذكر السم الصنف‬
‫ثم السم المتغير مثل ‪s.csno‬‬

‫‪63‬‬
‫متى تستخدم الدلوال الصديقة‬
‫اذا كانت الدالة تتعامل مع كائنات من انصناف مختلفة في‬ ‫‪‬‬

‫نفس الوقت‬
‫اذا اردنا تحميل الدالة اكثر من تعريف‬ ‫‪‬‬

‫‪ overloading‬مثل دالة ‪ power‬السابقة الذكر‬

‫‪64‬‬
‫النصناف الصديقة‬
‫من الممكن ان يكون هناك عدد كبير من الدلوال المنتمية الى‬ ‫‪‬‬
‫نصنف معين لوفي نفس الوقت نصديقة لصنف آخر‪ ،‬هذا يؤدي الى‬
‫لواضع عدد كبير من النماذج داخل النصناف‪.‬‬
‫لذلك نضع الصنف نفسه نصديق لصنف آخر‪ ،‬هذا يمكن الدلوال‬ ‫‪‬‬
‫المنتمية للصنف اللول قادرة على التعامل مع القسم الخاص في‬
‫الصنف الثاني‬
‫{‪Class node‬‬
‫;‪student data‬‬
‫;‪node *next‬‬
‫};‪friend linkedList‬‬
‫‪65‬‬
‫العمليات ‪operator‬‬
‫يمكن اعادة تعريف العمليات لتقوم باعمال اخرى مثل‬ ‫‪‬‬

‫ااضافة طالب الو حذف طالب‬


‫تعريف العمليات نفس تعريف الدلوال لولكن عنوان الدالة‬ ‫‪‬‬

‫يكون فيه كلمة ‪ operator‬بالاضافة لرمز العملية‬


‫المرادة‬

‫‪66‬‬
‫ااضافة طالب بالطريقة العادية‬
‫ايجاد المكان المنالسب لاضافة الطالب حسب الترتيب لوإزاحة الطلبة الذين بعده‬
void section::stAdd(student s)
{int pos =0;
while (s.get_stno()>sec[pos].get_stno()&& pos<size)
pos++;
For (int i=size-1; i>=pos; i--)
sec[i+1]=sec[i];
Sec[pos]=s
Size++
}

67
‫ااضافة طالب بالستخدام العمليات‬
void section::operator +(student s)
{int pos =0;
while (s.get_stno()>sec[pos].get_stno()&& pos<size)
pos++;
For (int i=size-1; i>=pos; i--)
sec[i+1]=sec[i];
Sec[pos]=s
Size++
}
Cs.operator+(s);‫الستدعاء الدالة‬
Or cs + s;

68
‫نصنف المجموعات ‪class set‬‬
‫تمثيل المجموعات لوالعمليات عليها على شكل نصنف‬ ‫‪‬‬

‫لسوف نفرض ان هناك مجموعة مكونة من ايام اللسبوع‪ ،‬لسوف‬ ‫‪‬‬

‫نمثلها على شكل مصفوفة اذا كان العنصر منتمي للمجموعة‬


‫نضع مقابله ‪ 1‬لوإذا لم يكن نضع ‪0‬‬

‫جمعة‬ ‫خميس‬ ‫اربعاء‬ ‫ثلثاء‬ ‫اثنين‬ ‫احد‬ ‫لسبت‬


‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬

‫‪69‬‬
Class set {
int weekDays[7];
public:
set();
void operator +(int i);
void operator –(int i);
friend set operator *(set s, set t);
….};
70
Set ::set()
{for (int i=0; i<7; i++)
weekDays[i]=0;}
Void set:: operator+(int i)
{if (i>=1 && i<=7)
weekDays[i-1]=1;}
Set operator*(set s, set t)
{set r;
For (int i=0; i<7; i++)
r.weekDays[i]=s. weekDays[i] && t. weekDays[i];
Return r;}

71
‫‪this‬‬
‫الوحدة التالسعة‬

‫النصناف المشتقه لوالقوالب‬

‫‪72‬‬
‫النصناف المشتقة لوالوراثة‬
‫مثال موظفي الجامعة‬ ‫‪‬‬

‫مثال مكتب عقاري‬ ‫‪‬‬

‫‪House‬لكل منزل حديقة خانصة‪ ،‬مساحة المنزل تسالوي ‪:‬‬ ‫‪‬‬

‫مساحة البناء ‪ +‬مساحة الحديقة‬


‫‪Flat‬لكل شقة مساحة محددة ‪:‬‬ ‫‪‬‬

‫‪Multistory building‬مساحة العمارة تسالوي مجموع ‪:‬‬ ‫‪‬‬

‫مساحات الشقق التي تتكون منها‬


‫جميع هذه العقارات تشترك في انه له لسعر محدد لواجرة شهرية‬ ‫‪‬‬

‫‪73‬‬
‫جميع الدلوال لوالمتغيرات الموجودة في الصنف اللساس )الب(‬ ‫‪‬‬

‫يمكن معالجتها من النصناف المشتقة‬


‫لكن المشكلة في اين نضع المتغيرات هل في القسم الخاص ام‬ ‫‪‬‬

‫العام‬
‫اذا كانت في القسم الخاص ل يمكن معالجتها ال من خلل دلوال منتمية‬ ‫‪‬‬

‫للصنف نفسه‬
‫اذا كانت في القسم العام يمكن الونصول اليها من جميع النصناف‬ ‫‪‬‬

‫الموجودة في البرنامج‬
‫الحل لوجود قسم جديد السمه ‪ protected‬ل يمكن معالجة متغيراته‬ ‫‪‬‬

‫ال من خلل الصنف نفسه الو أي نصنف مشتق منه‬

‫‪74‬‬
class property{
protected:
float price;
float month_rent;
public:
property(float p=1000.0; float r=100.0)
{price =p; month_rent=r;}
float increase_rent(float amt)
{month_rent+=amt; return month_rent;}
float increse_price(float amt)
{price+=amt; return price;}
};

75
class house:public property
{private:
float bArea;
float gArea;
public:
house(float p=1000.0, float r=100.0, float b=150.0,
float g=0.0);
float area(){return bArea+gArea;};
void print_info();};

house::house(float p, float r, float b, float g): property(p,r)


{bArea=b;
gArea=g;}

76
class flat: public property
{protected:
float area;
public:
flat(float p=5000.0, float r=50.0, float
a=120.0)
void print_info();};
flat :: flat(float p, float r, float
a):property(p,r)
{area=a;}
77
void property::print_info()
{cout<<price<<month_rent;}

void flat::print_info()
{property::print_info();
cout<<area;}

void multistory::print_info()
{flat::print_info();
cout<<noStory<<noFlats;

78
‫الوراثة الخانصة‪ :‬تورث كل المتغيرات لوالدلوال التي في‬ ‫‪‬‬

‫القسمين المحمي لوالعام من الصنف اللساس لوتصبح‬


‫خانصة في الصنف المشتق‬
‫الوراثة المحمية‪ :‬تورث كل المتغيرات لوالدلوال التي في‬ ‫‪‬‬

‫القسمين المحمي لوالعام من الصنف اللساس لوتصبح‬


‫محمية في الصنف المشتق‬

‫‪79‬‬
‫الدلوال لوالنصناف القالبية‬
‫الدلوال القالبية‪ :‬تعريف دالة بحيث تقبل أي نوع من البيانات‪ ،‬أي تأجيل تحديد‬ ‫‪‬‬

‫نوع البيانات الى حين اللستدعاء‬


‫)‪template<class T> int isGreater(T x, T y‬‬
‫)‪{if (x>y‬‬
‫;‪return 1‬‬
‫‪else‬‬
‫};‪return 0‬‬
‫)(‪main‬‬
‫;‪{int a=2, b=1‬‬
‫الستدعاء };)‪cout<<isGreater(a,b‬‬

‫‪80‬‬
‫النصناف القالبية‬
‫بناء نصنف عامم بحيث يكون نوع المتغيرات فيه غير محددة أي‬ ‫‪‬‬

‫تقبل أي نوع من المتغيرات‬


‫مثل‪ student & postGrad :‬كل منها له متغيرات‬ ‫‪‬‬

‫مختلفة مثل السم المشرف لولسنة التخرج‪ ،‬لولكن الدلوال الزمة‬


‫لمعالجة الصنفين داخل الصنف ‪ section‬هي نفسها‪ .‬لذلك‬
‫نعرف الصنف ‪ section‬على شكل قالب بحيث اذا كانت‬
‫متغيراته من نوع ‪ student‬الو‪ postGrad‬فان الدلوال‬
‫المنتمية ل يحدث عليها أي تغيير‬

‫‪81‬‬
template <class T, int maxSize>
class section{
T sec [maxSize];
….};
‫ لوقيمة‬T ‫لتعريف كائن من هذا الصنف يجب ان نحدد نوع‬
maxSize
section<student, 50>cs90;
section<postGrade, 50>cs90;
82
‫اما عند تعريف دالة منتمية لصنف قالبي يجب ان تسبق‬ 

template <class T, int maxSize>

template <class T, int maxSize>


void section <T, maxSize>::stAdd(T s)
{int pos =0;
while (s.get_stno()>sec[pos].get_stno()&& pos<size)
pos++;
For (int i=size-1; i>=pos; i--)
sec[i+1]=sec[i];
Sec[pos]=s
Size++
}
slide 129

83
‫تعدد اللوجه ‪polymorphism‬‬
‫لو عرفنا مصفوفة من النوع ‪ property‬تحتوي‬ ‫‪‬‬

‫كائنات من نوع ‪ flat, house, multistory‬لوكل‬


‫منها لديه دالة منتمية السمها ‪ print_info‬يمكننا‬
‫الستخدام هذه الدالة لطباعة معلومات كل هذه الكائنات‬
‫في كل مرة يستدعي الدالة الخانصة بذلك الكائن‬ ‫‪‬‬

‫لنتمكن من ذلك يجب تعريف هذه الدلوال على انها‬ ‫‪‬‬

‫‪ virtual‬في كل نصنف‬

‫‪84‬‬
class house:public property
{private:
float bArea;
float gArea;
public:
house(float p=1000.0, float r=100.0,
float b=150.0, float g=0.0);
float area(){return bArea+gArea;};
virtual void print_info();};

85
for (int i=0; i<10; i++)
a[i].print_info();

86
‫هيكلية البيانات‬
‫ملف‬ ‫‪‬‬

‫لسجل‬ ‫‪‬‬

‫حقل‬ ‫‪‬‬

‫بايت‬ ‫‪‬‬

‫بت‬ ‫‪‬‬

‫‪87‬‬
‫تنظيم الملفات‬
‫التنظيم التتابعي‬ ‫‪‬‬

‫التنظيم العشوائي‬ ‫‪‬‬

‫‪88‬‬
‫الملفات لوالينابيع‬
‫الملف‪ :‬مجموعة من البايت المتتالية تنتهي بعلمة ‪End-‬‬ ‫‪‬‬

‫‪of-file‬‬
‫عند فتح ملف يتم انشاء كائن‬ ‫‪‬‬

‫‪89‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫الوراثة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫يوضح المقصود بمصطلح الوراثة‬ ‫‪.1‬‬


‫الصنف المشتق‬

‫• إن الصنف المشت ق يرر ث جميع المتغيرات والدوال المنتمي ة للصنف‬


‫الاساس‪ .‬بمعنى أننا نستطيع أن نستخدمها تماما كما لو كانت معرفة‬
‫داخل الصنف المشتق‪ .‬على اسبيل المثال‪ ،‬بما أن لكل العقارات أعل ه‬
‫اسعرا وأجرة شهرية فإننا اسنعرفها بالاضافة للدوال الخاصة بمعالجتها‬
‫داخل الصنف الاساس ‪ ،property‬مما يمكن جميع الصناف المشتقة‬
‫من ااستخدامها دون الحاجة إلى إعادة تعريفها‪.‬‬
‫الصنف المشتق‬

‫ولكن بقي أن نقرر في أي قسم من أقسام الصنف الاساس ‪property‬‬


‫يجإإب أإإن نعرف هذ ه المتغيرات والدوال المنتمية‪ .‬إإإن تعريف هذ ه‬
‫المتغيرات والدوال في القسم الخاص من الصنف الاساس يجعلنا قادرين‬
‫على معالجته ا فقط م ن خلل الدوال المنتمي ة للصنف الاساس والدوال‬
‫الصديقة له‪ ،‬ول يمكننا ذلك من معالجة هذ ه المتغيرات والدوال المنتمية‬
‫من خلل الدوال المنتمية للصناف المشتقة‪ .‬وبالطبع يؤدي تعريفها في‬
‫القسم العام إلى السماح لجميع دوال البرنامج‪ ،‬دون ااستثناء‪ ،‬بمعالجتها مما‬
‫يشكل خرقا لمبدأ إخفاء البيانات‪.‬‬
‫الصنف المشتق‬

‫ولحل هذ ه المشكلة تزودنا لغة ‪ ++ C‬بنوع ثالث من القسام يدعى بالقسم المحمي‬
‫‪ . protected‬نعرف في هذا القسم جميع المتغيرات والدوال المنتمية والتي نريد‬
‫أن نكون قادرين على ااستخدامها من قبل الدوال المنتمية للصناف المشتقة‪.‬‬
‫وكمثال على ذلك اسنعرف الصنف ‪ property‬بحيث يحتوي على المتغيرين‬
‫المنتميي ن ‪ Price‬و ‪ Monthly_Rent‬والدوال الخاص ة بمعالجتهما كالبناء‬
‫لعطائهإإا قيمإإا ابتدائية و ‪ increase_rent‬و ‪ decrease_rent‬لزيادة‬
‫وإنقاص الجرة علإإإى الترتيإإإب‪ ،‬بالاضافإإإة إلى ‪ increae_price‬و‬
‫‪ decrease_price‬لزيادة وإنقاص السعر على الترتيب‪ .‬لحظ إن تعريف هذ ه‬
‫المتغيرات والدوال الخاص ة بمعالجته ا ف ي الصنف الاساس يجعلن ا قادرين على‬
‫توريثها لجميع الصناف المشتقة بحيث تستخدم عليها من دون الحاجة إلى كتابتها‬
‫مرة أخرى‪.‬‬
‫مثال‬
class property{
protected:
float Price;
float Monthly_Rent;
public:
property (float P=10000.0, float Rent=100.0)
{Price=P;
Monthly_Rent=Rent;
}
float increase_rent(float amt)
{ Monthly_Rent +=amt;
return Monthly_Rent;}
float decrease_rent(float amt)
{ Monthly_Rent -=amt;
return Monthly_Rent;}
float increase_price(float amt)
{ Price+=amt;
return Price;}
decrease_price(float amt)
{ Price -=amt;
return Price;}
};
‫الصنف المشتق‬

‫لحظ‪ ،‬عزيزي الدارس‪ ،‬وجود القس م المحمي ‪ protected‬في تعريف‬


‫هذا الصإإنف حيإإث عرفنإإا فيإإه المتغيريإإن المنتميين ‪ Price‬و‬
‫‪ ، Monthly_Rent‬مما يجعلها قابلة للمعالجة من قبل الدوال المنتمية‬
‫للصناف المشتقة من هذا الصنف‪ .‬لحظ أيضا أننا ااستخدمنا قيما تلقائية‬
‫في كتابة البناء كما أننا كتبنا جميع الدوال المنتمية للصنف ‪property‬‬
‫كدوال اسطرية وذلك لصغر حجمها‪.‬‬
‫إن تعريف صنف مشتق ل يختلف كثيرا عن تعريف الصنف الاساس إل‬
‫في تحديد الصنف أو الصناف التي اشتق منها وتحديد نوع الوراثة‪ .‬ويتم‬
‫ذلك بواضع العملية ‪ :‬بعد ااسم الصنف المشتق ثم تعدد أاسماء الصناف‬
‫الاساس على أن يسبق كل ااسم بنوع الوراثة‪ .‬ويفصل ااسم كل صنف عن‬
‫الذي يليه بفاصلة‪.‬‬
‫الصنف المشتق‬

‫ حيث يحتوي هذا الصنف‬،house ‫وكمثال على ذلك اسنعرف الن أول صنف مشتق وهو الصنف‬
‫ مساحة‬BArea ‫ يمثل المتغير‬.GArea ‫ و‬BArea ‫على متغيرين منتميين جديدين خاصين به هما‬
.‫ مساحة الحديقة‬GArea ‫البناء بينما يمثل المتغير‬

class house:public property


{private:
float BArea;
float GArea;
public:
house(float P=10000.0,float Rent=100.0,float B=150.0,float G=0.0);
float area(){return BArea+GArea;}
void print_info();
};
‫الصنف المشتق‬

‫والسؤال الن هو كيف اسنتعامل مع هذ ه المتغيرات و الدوال المنتمية التي‬


‫ورثها الصنف ‪ house‬هل نتعامل معها كمتغيرات خاصة أم عامة داخل‬
‫الص نف ‪ . house‬إ ن م ا يحدد ذل ك ه و نوع الوراث ة )المحدد بالكلمة‬
‫الواردة قبل ااسم الصنف الاساس في تعريف الصنف المشتق(‪ ،‬وهذا النوع‬
‫في مثالنا أعل ه هو ‪ public‬أي وراثة عامة‪.‬‬
‫الصنف المشتق‬

‫إن نوع الوراثة ‪ public‬يعني أن‪:‬‬

‫• المتغيرات والدوال المعرفة في القسم الخاص من الصنف الاساس تصبح غير‬


‫قابلة للمعالجة من قبل الدوال المنتمية للصنف المشتق‪.‬‬
‫• المتغيرات المعرفة في القسم المحمي ‪ protected‬من الصنف الاساس تبقى‬
‫محمية بالنسبة للصنف المشتق )أي كما لو كانت معرفة في القسم ‪protected‬‬
‫من الصنف المشتق(‪ .‬مما يعني أنه من الممكن معالجتها من قبل الدوال المنتمية‬
‫والصديقة للصنف المشتق ولي صنف مشتق منه‪.‬‬
‫• أما المتغيرات والدوال المعرفة في القسم العام ‪ public‬من الصنف الاساس‬
‫فإنها تبقى عامة بالنسبة للصنف المشتق )أي كما لو كانت معرفة في القسم‬
‫‪ public‬الخاص بالصنف المشتق( مما يعني إمكانية معالجتها من قبل أي دالة‪.‬‬
‫الصنف المشتق‬

‫لنعرف الن الدوال المنتمية للصنف المشتق ‪ house‬ولنبدأ بالبناء‪ .‬لحظ‪ ،‬عزيزي الدارس‪ ،‬أن لهذا البناء قيما‬
‫تلقائية‪.‬‬

‫)‪house::house(float P,float Rent,float B,float G‬‬


‫)‪: property(P,Rent‬‬
‫;‪{BArea=B‬‬
‫};‪GArea=G‬‬

‫إن كل ما يفعله هذا البناء هو ااستدعاء البناء الخاص بالصنف الاساس وذلك حتى يتم إعطاء قيم ابتدائية للمتغيرات‬
‫المعرفة في الصنف الاساس وهي ‪ Price‬و ‪ Monthly_Rent‬في مثالنا‪ .‬لحظ أننا واضعنا العبارة‬
‫)‪: property(P,Rent‬‬
‫في نهاية ترويسة البناء حتى تتم عملية ااستدعاء البناء ‪ property‬الخاص بالصنف الاساس‪ .‬وبالطبع ليس من‬
‫الضروري واضع هذ ه العبارة على اسطر جديد‪ .‬بعد ااستدعاء البناء ‪ property‬يتم تنفيذ الجمل الموجودة داخل‬
‫البناء ‪ house‬والتي تقوم بإعطاء المتغيرين ‪ BArea‬و ‪ GArea‬قيما ابتدائية‪ .‬أن هذا شكل آخر لعادة ااستخدام‬
‫الدوال عن طريق ااستدعائها في الموقع المنااسب‪.‬‬
‫الصنف المشتق‬

‫ والتي تقوم بطباعة كافة‬.house ‫ والمنتمية للصنف‬print_info ‫لنعرف الن الدالة‬


‫ مثل اسعر ه وأجرته الشهرية واساحة الحديقة‬house ‫المعلومات عن كائن من الصنف‬
.‫ومساحة البناء والمساحة الكلية‬

void house::print_info()
{cout<<endl<<"The Price is "<<Price
<<"\n The Montly Rent is "<<Monthly_Rent
<<"\n The house area is "<<BArea
<<"\n The area of the Garden is "<<GArea
<<"\n The Total Area(Garden+Building) is "<<area()
<<endl;
};
‫الصنف المشتق‬

‫و الن نستطيع إنشاء كائن من الصنف ‪ house‬وااستدعاء بعض الدوال عليه‪.‬‬


‫;‪house h‬‬
‫تقوم هذ ه الجملة بإنشاء الكائن ‪ h‬من الصنف ‪ house‬وااستدعاء البناء ‪house‬‬
‫لعطاء متغيراته المنتمية القيم التلقائية‪ .‬أما الجملة‬

‫‪cout<<"\n Rent after increment‬‬


‫;)‪"<<h.increase_rent(100.0‬‬

‫فتقوم بااستدعاء الدالة ‪ increase_rent‬لزيادة الجرة الشهرية الخاصة بالكائن‬


‫‪ h‬بمقدار ‪ 50.0‬وطباعة القيمة الجديدة لليجار‪ .‬لحظ‪ ،‬عزيزي الدارس‪ ،‬كيف أننا‬
‫ااستخدمنا الدالة ‪ increase_Rent‬كما لو كانت معرفة داخل الصنف ‪.house‬‬
‫والجملة‬
‫;)(‪h.print_info‬‬
‫تقوم باستدعاء الدالة ‪ print_info‬المنتمية للصنف ‪ house‬لطباعة كافة البيانات الخاصة بالكائن ‪.h‬‬

‫لنعرف ال ن الصنف المشتق ‪ flat‬والذي هو أيضا مشتق من الصنف ‪.property‬‬

‫‪class flat:public property‬‬


‫‪{ protected:‬‬
‫;‪float Area‬‬
‫‪public:‬‬
‫;)‪flat(float P=5000.0,float Rent=50.0,float A=120.0‬‬
‫;)(‪void print_info‬‬
‫;}‬

‫لظحظ‪ ،‬عزيزي الدارس‪ ،‬أ ن هذا الصنف يضم بالاضافة إلى المتغيرين ‪ price‬و ‪ Monthly_Rent‬المتغير ‪ Area‬والذي يمثل مساظحة الشقة‪ .‬ولذا فإ ن البناء‬
‫الخاص بهذا الصنف يقوم بعد استدعاء البناء الخاص بالصنف الساس بإعطاء هذا المتغير قيمة ابتدائية‪.‬‬

‫)‪flat::flat(float P,float Rent,float A): property(P,Rent‬‬


‫;‪{ Area=A‬‬
‫}‬

‫وتقوم الدالة ‪ print_info‬بطباعة كافة البيانات الخاصة بكائن من الصنف ‪.flat‬‬


‫)(‪void flat::print_info‬‬
‫‪{cout<<endl<<"The Price is "<<Price‬‬
‫‪<<"\n The Montly Rent is "<<Monthly_Rent‬‬
‫;‪<<"\n The flat area is "<<Area<<endl‬‬
‫;}‬
‫الصنف المشتق‬

‫ واسنعرف هذا الصنف كصنف‬.‫ والذي يمثل عمارة متعددة الطوابق‬Multi_Building ‫واسنعرف الن الصنف‬
‫ )والذي يمثل مساحة كل شقة لهذا الصنف( بالاضافة إلى‬Area ‫ وذلك حتى نور ث المتغير‬flat ‫مشتق من الصنف‬
.Monthly_Rent ‫ و‬Price ‫المتغيران‬

class Multi_Building: public flat


{private:
int NoStory;
int NoFlats;
public:

Multi_Building(float P=20000.0,float Rent=100.0,


float A=120.0,int S=1,int F=2);
float area(){return NoStory*NoFlats*Area;}
void print_info();
};
‫الصنف المشتق‬

Multi_Building::Multi_Building(float P,float Rent,float A,int S,int F)


: flat(P,Rent,A)
{NoStory=S;
NoFlats=F;
}
‫ والتي تقوم بحساب المساحة الكلية للمبنى بضرب عدد الطوابق بعدد الشقق‬area ‫ أننا عرفنا الدالة السطرية‬،‫ عزيزي الدارس‬،‫لحظ أيضا‬
.Area ‫في كل طابق ثم بمساحة الشقة‬
.Multi_Building ‫ تقوم بعرض جميع البيانات الخاصة بكائن من الصنف‬print_info ‫والدالة‬

void Multi_Building::print_info()
{cout<<endl<<"The Price is "<<Price
<<"\n The Montly Rent is "<<Monthly_Rent
<<"\n The flat area is "<<Area<<endl
<<"\n No of Stories is "<<NoStory
<<"\n No of flats per story is "<<NoFlats
<<endl;

}
. ++C ‫في الحقيقة نحن لم نستفد في مثالنا أعل ه من جميع المزايا التي تمنحنا إياها لغة‬
‫انواع الوراثة‬

‫أنواع الوراثة الخرى‬


‫ذكرنا فيما اسبق أن ما يحدد كيفية التعامل مع المتغيرات والدوال المنتمية‬
‫يعتمد على نوع الوراثة )والذي يحدد بالكلمة التي تسبق ااسم الصنف‬
‫الاساس عند تعريف الصنف المشتق(‪ .‬وااستخدمنا في مثالنا أعل ه نوعا‬
‫واحدا م ن أنواع الوراث ة وه و الوراث ة العام ة ‪ .public‬وهنالك أنواع‬
‫أخرى م ن الوراث ة ه ي الوراث ة خاص ة ‪ private‬و الوراث ة المحمية‬
‫‪ .protected‬وتعرف كل منهم ا بااس تخدام الكلم ة ‪ private‬والكلمة‬
‫‪ protected‬على الترتيب قبل ااسم الصنف الاساس في تعريف الصنف‬
‫المشتق‪.‬‬
‫انواع الوراثة‬

‫• الوراثة الخاصة‪:‬‬
‫• إذا اسبق ااسم الصنف الاساس بالكلمة ‪ private‬فهذا يعني أن نوع الوراثة‬
‫هي وراثة خاصة‪ .‬وفي هذ ه الحالة تور ث جميع المتغيرات والدوال المعرفة‬
‫في القسم المحمي ‪ protected‬والعام ‪ public‬من الصنف الاساس بحيث‬
‫تصبح خاصة في الصنف المشتق )كما لو كانت معرفة في القسم الخاص‬
‫من الصنف المشتق(‪.‬‬
‫• أم ا بالنس بة للمتغيرات والدوال المعرف ة ف ي القس م الخاص م ن الصنف‬
‫الاساس فإن الدوال المنتمية للصنف المشتق ل تستطيع معالجتها‪ .‬ويقال في‬
‫هذ ه الحالة أنها غير قابلة للمعالجة ‪ inaccessible.‬وهي عبارة غير دقيقة‬
‫تماما إذ يمكن معالجتها في الصنف المشتق لكن بااستخدام الدوال المنتمية‬
‫للصنف الاساس فقط والمعرفة )أي الدوال( في القسم العام أو المحمي‪.‬‬
‫انواع الوراثة‬

‫الوراثة المحمية‪:‬‬
‫أما إذا اسبق ااسم الصنف الاساس بالكلمة ‪ protected‬فإن الوراثة في هذ ه‬
‫الحالة وراثة محمية ‪ . protected‬وفي هذ ه الحالة فإن المتغيرات والدوال‬
‫المعرف ة ف ي القس م المحم ي ‪ protected‬والعام ‪ public‬م ن الصنف‬
‫الاساس تصبح محمية في الصنف المشتق )كما لو كانت معرفة في القسم‬
‫المحمي من الصنف المشتق(‪.‬‬
‫أم ا بالنس بة للمتغيرات والدوال المعرف ة ف ي القس م الخاص م ن الصنف‬
‫الاساس فإن الدوال المنتمية للصنف المشتق ل تستطيع معالجتها‪ .‬ويقال في‬
‫هذ ه الحالة أنها غير قابلة للمعالجة ‪ inaccessible‬؛ إذ ل يمكن معالجتها‬
‫ف ي الص نف المشت ق إل بااس تخدام الدوال المنتمي ة للص نف الاس اس فقط‬
‫والمعرفة )أي الدوال( في القسم العام أو المحمي‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫القوالب‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫يوضح المقصود بمصطلح النصناف القالبية‬ ‫‪.1‬‬


‫القوالب‬

‫• من المميزات المهمة للغة ‪ ++C‬والتي تجنبنا الحاجة إلى كتابة دوال‬


‫متشابهة إلى حد كبير هي أنها تمنحنا إمكانية تعريف دوال و أصناف‬
‫قال بية‪ .‬تس مح لن ا هذ ه الدوال و الص ناف القالبي ة القدرة عل ى تأجيل‬
‫تحديد نوع البيانات إلى حين الحاجة إلى هذ ه القوالب؛ مما يسمح لنا‬
‫بإعادة ااستخدام هذ ه القوالب مرة بعد مرة ولنواع مختلفة من البيانات‪.‬‬
‫وبذلك تعطينا لغة ‪ ++C‬طريقة أخرى لعادة ااستخدام البرامج ‪code‬‬
‫‪ reuse‬ل تقل أهمية عن الوراثة والصناف المشتقة‪ .‬وهنالك نوعان‬
‫من القوالب‪ :‬الدوال القالبية والصناف القالبية‪ .‬وفيما يلي اسنناقش كل‬
‫منها‪.‬‬
‫الدوال القالبية ‪Template Functions‬‬

‫يواج ه م برمجو اللغات الجرائي ة ‪ procedural languages‬مثل‬


‫البااسكال في كثير من الحيان مشكلة الحاجة إلى تكرار كتابة نفس الدالة‬
‫لنواع مختلفة من البيانات‪ .‬فمثل نضطر أحيانا إلى كتابة دالة لترتيب‬
‫قائمة من الطلبة ودالة أخرى لترتيب قائمة من الموظفين‪ ،‬ول تختلف‬
‫هاتان الدالتان إل في نوع البيانات التي يتعاملن معها‪ .‬تمنحنا لغة ‪++C‬‬
‫إمكاني ة تعري ف الدال ة كدال ة قالبي ة ل نحدد به ا نوع ال بيانات بل نوع‬
‫البيانات كعامل يحدد من قبل المبرمج عند الحاجة إلى تلك الدالة‪ .‬وعليه‬
‫يمكن تمرير نوع البيانات على أنه قائمة من الطلبة أو قائمة من الموظفين‬
‫وااس تخدام نف س الدال ة القلبي ة م ن دون الحاج ة إل ى إعادة كتابتها مرة‬
‫أخرى‪.‬‬
‫القوالب‬
‫وكمثال بسيط على كيفية تعريف دالة قالبية اسنعرف الدالة ‪ IsGreater‬والتي تأخذ عاملين من أي نوع‬
‫من البيانات و تقارن بينهما‪ .‬فإذا كان العامل الول هو الكبر تعيد القيمة ‪ 1‬وإل فإنها تعيد القيمة ‪.0‬‬

‫)‪template<class T> int IsGreater(T x,T y‬‬


‫)‪{ if (x>y‬‬
‫;‪return 1‬‬
‫‪else‬‬
‫;‪return 0‬‬
‫}‬
‫إن تعريف الدوال القالبية ل يختلف عن تعريف الدوال العتيادية إل في أول جملة أو ما يسمى بترويسة‬
‫الدالة‪ .‬إذ تبدأ الدالة القالبية بالكلمة ‪ template‬للشارة إلى أنها دالة قالبية‪ ،‬ثم بقائمة من العوامل تبدأ‬
‫بالرمز > و تنتهي بالرمز <‪ .‬وفي مثالنا أعل ه هنالك عامل واحد لهذ ه الدالة القالبية وهو ‪ class T‬وتعني‬
‫الكلمة ‪ class‬أن نوع العامل ‪ T‬هو ااسم لنوع من أنواع البيانات مثل ‪ int‬و ‪ float‬و ‪ … student‬الخ‪.‬‬
‫وقد ااستخدم هذا العامل في تعريف ‪ x‬و ‪ y‬إذ أنها من النوع ‪.T‬‬
‫استدعاء الدالة القالبية‬

‫أما بالنسبة لطريقة ااستدعاء الدالة القالبية فل تختلف عن طريقة ااستدعاء الدالة‬
‫العتيادية‪ ،‬والمثال التالي يواضح كيفية ااستدعاء الدالية القالبية أعل ه للمقارنة بين‬
‫رقمين صحيحين‪.‬‬

‫)(‪main‬‬
‫;‪{ int a=2,b=1‬‬
‫;)‪int z=IsGreater(a,b‬‬
‫;‪cou<<z‬‬
‫}‬
‫نستطيع ااستخدام هذ ه الدالة القالبية للمقارنة بين أي قيمتين مهما كان نوعهما شريطة‬
‫أن تكون العملية < معرفة لهذا النوع من البيانات‪ .‬فمثل لو أردنا ااستخدام الدالة‬
‫أعل ه للمقارنة بين موظفين من الصنف ‪ employee‬فل بد من أن نعرف أول‬
‫العملية < لهذا الصنف كما دراسنا في الوحدة السابقة‪.‬‬
‫مثال اخر‬
‫وكمثال آخر على الدوال القالبية اسنعرف الدالة القالبية ‪ sort‬والتي تقوم بترتيب مصفوفة من الكائنات من النوع‬
‫العام ‪ ،T‬حيث ‪ T‬هو عامل يحدد وفق الحاجة فقد يكون النوع ‪ student‬أو النوع ‪ employee‬أو ‪ int‬أو‬
‫‪ … float‬الخ‪ .‬تستخدم هذ ه الدالة خوارزمية الفرز النتقائي ‪ selection sort‬والتي اسبق مناقشتها‪.‬‬
‫)‪template<class T> void sort(T* st, int m‬‬
‫)‪{ for(int i=0;i<m-1;i++‬‬
‫;‪{ int pos=i‬‬
‫;]‪T min=st[i‬‬
‫)‪for(int j=i+1; j<m;j++‬‬
‫)‪if (st[j]<min‬‬
‫;]‪{ min=st[j‬‬
‫;‪pos=j‬‬
‫}‬
‫;]‪T a=st[pos‬‬
‫;]‪st[pos]=st[i‬‬
‫;‪st[i]=a‬‬
‫‪} //for i‬‬
‫‪} //sort‬‬
‫مثال اخر‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن العامل ‪ st‬هو عنوان أول عنصر في المصفوفة لذا فهو‬
‫من النوع ‪ ،*T‬بينما يمثل العامل ‪ m‬عدد عناصر المصفوفة لذا فهو من النوع ‪.int‬‬
‫لحظ أيضا‪ ،‬عزيزي الدارس‪ ،‬كيف ااستخدمنا النوع العام ‪ T‬لتعريف متغيرات محلية‬
‫داخل الدالة مثل ‪ min‬و ‪ . a‬والمثال التالي يبين كيفية ااستخدام الدالة ‪ sort‬لترتيب‬
‫مصفوفة من الموظفين ومصفوفة أخرى من الطلبة‪ .‬ومن المهم هنا أن نعررف العملية‬
‫> للصنف ‪ employee‬وأيضا للصنف ‪ student‬حيث أنها تستخدم داخل الدالة‬
‫‪ sort‬لمقارن ة ]‪ st[j‬م ع ‪ . min‬ويعود الم ر للم برمج ف ي كيفي ة تعريف هذ ه‬
‫العمليات‪ .‬ف ي مثالن ا التال ي اس نعرف العملي ة > للص نف ‪ employee‬على أاساس‬
‫مقارنة راتبي الموظفين‪ .‬أما بالنسبة للصنف ‪ sutdent‬فسنعرف العملية > على‬
‫أاساس مقارنة معدل علمات الطالبين‪ .‬وبالتالي فإننا عندما نستدعي ‪ sort‬لترتيب‬
‫مصفوفة من الموظفين فإنه اسيرتب تلك المصفوفة حسب رواتب هؤلء الموظفين‪.‬‬
‫أما عندما نستدعيه لترتيب مصفوفة من الطلبة‪ ،‬فانه اسيرتبها حسب معدل علمات‬
‫الطلبة‪.‬‬
‫مثال اخر‬
#include<iostream.h>
class employee{
long empNo;
char empName[20];
double salary;
public:
void initialize();
double get_salary(){return salary;}
friend int operator<(employee s1, employee s2);
};
void employee::initialize()
{cout<<"enter emp name ";
cin>>empName;
cout<<"enter emp Number ";
cin>>empNo;
cout<<"enter emp salary ";
cin>>salary;
}
int operator<(employee s1,employee s2)
{if (s1.salary<s2.salary)
return 1;
else
return 0;
}
‫مثال اخر‬
class student{
long stno;
int csno;
int courses[100];
char stName[20];
public:
double average();
void initialize();
long get_stno() {return stno;}
char* get_stname(){return stName;}
friend int operator<(student s1,student s2);
};
double student::average()
{ double sum=0;
for(int i=0;i<csno;i++)
sum=sum+courses[i];
return sum/csno;
}
int operator<(student s1,student s2)
{if (s1.average()<s2.average())
return 1;
else
return 0;
}
‫مثال اخر‬
template<class T> void sort(T* st, int m)
{ for(int i=0;i<m-1;i++)
{ int pos=i;
T min=st[i];
for(int j=i+1; j<m;j++)
if (st[j]<min)
{ min=st[j];
pos=j;
}
T a=st[pos];
st[pos]=st[i];
st[i]=a;
} //for i
} //sort

void student::initialize()
{
cout<<"enter student's number";
cin>>stno;
cout<<"enter student's name ";
cin>>stName;
cout<<"enter no. of courses taken by the student";
cin>>csno;
for(int i=0;i<csno;i++)
{cout<<"enter grade no."<<i+1;
cin>>courses[i];
}
}
‫مثال اخر‬
main()
{ student stu[100];
int n;
cout<<"Enter no. of students";
cin>> n;
for(int i=0;i<n;i++)
stu[i].initialize();
// call sort to sort the students according to average
sort(stu,n);
for(i=0; i<n;i++)
cout<<stu[i].average()<<"\n";

employee emp[100];
cout<<"enter number of employees"<<endl;
cin>>n;
for(i=0;i<n;i++)
emp[i].initialize();
sort(emp,n);
for(i=0;i<n;i++)
cout<<emp[i].get_salary()<<"\n";
}
‫الصناف القالبية ‪Template Classes‬‬

‫• تذك ر‪ ،‬عزيزي الدارس‪ ،‬أنن ا عرفن ا الص نف ‪) section‬شعب ة( ف ي الوحدة الس ابعة عل ى أنها‬
‫مجموعة من الطلبة )من الصنف ‪ ( student‬وعرفنا الدوال المنتمية اللزمة لمعالجتها )لاضافة‬
‫طالب جديد أو حذف طالب … الخ(‪ .‬تصور الن أننا بحاجة إلى شعبة من نوع جديد من الطلبة‪،‬‬
‫طلبة درااسات عليا ‪ Postgrads‬على اسبيل المثال )والذي قد يختلف عن الصنف ‪student‬‬
‫لوجود متغير منتمي يمثل ااسم المشرف‪ ،‬ومتغير منتمي آخر يمثل اسنة إنهاء الشهادة الجامعية‬
‫الولى(‪ .‬ولنفرض أننا بحاجة إلى نفس الدوال لمعالجة هذا النوع الجديد من الشعب‪ .‬وااضح أننا لو‬
‫عرفنا هذا النوع الجديد من الشعب لكررنا كتابة الكثير من الدوال والتعاريف ل تختل ف عن‬
‫الصنف ‪ section‬إل في نوع البيانات التي تعالج‪ .‬ولتجنب ذلك تسمح لنا لغة ‪ ++C‬بأن نعرف‬
‫الصنف ونستخدم في تعريف متغيراته المنتمية أنواعا عامة تمرر كعوامل‪ .‬يسمى ذلك الصنف‬
‫بالصنف القالبي ‪ .Template Class‬فمثل لو عرفنا الصنف ‪ section‬كصنف قالبي فإن هذا‬
‫يمكننا من ااستخدام هذا الصنف لنشاء شعبة متغيراتها المنتمية من نوع ‪ student‬وشعبة أخرى‬
‫متغيراتها المنتمية من الصنف ‪ PsotGrad‬دون الحاجة إلى تكرار تعريف الصنف ‪section‬‬
‫أو أيا من دواله المنتمية‪.‬‬
Template Classes ‫الصناف القالبية‬
‫ الذي‬T ‫ من النوع العام‬sec ‫ كصنف قالبي حيث اسنعرف المصفوفة‬section ‫اسنعرف الن الصنف‬
‫ ويمثل‬MaxSize ‫هو عامل من عوامل هذا الصنف القالبي كما اسنستخدم عامل آخر لهذا الصنف‬
.‫عدد عناصر الشعبة‬

template <class T, int MaxSize> class section{


T sec[MaxSize];
int size;
int bsearch(long stno);
public:
section(){size=0;}
void StAdd(T s);
int StDelete(long stno);
void Stlist();
void StRetrieve(long stno);
};
‫الصناف القالبية ‪Template Classes‬‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن تعريف هذا الصنف اختلف عن تعري ف الصنف ‪ section‬المعرف في الوحدة‬
‫السابعة من النواحي التالية‪:‬‬
‫• بدأنا تعريف الصنف بالعبارة‬
‫>‪template <class T, int MaxSize‬‬
‫والتي تدل على أن هذا الصنف هو صنف قالبي له عاملين الول ‪ T‬ويمثل نوع البيانات والثاني ‪MaxSize‬‬
‫ويمثل حجم المصفوفة‪.‬‬
‫• إن المصفوفة ‪ sec‬هي الن من النوع ‪ T‬وحجمها أي عدد عناصرها هو ‪.MaxSize‬‬

‫عند إنشاء كائن من هذا الصنف القالبي يجب تزويد هذ ه العوامل )‪ T‬و ‪ (MaxSize‬بالقيم الفعلية لها‪ .‬على اسبيل‬
‫المثال لنشاء شعبة من الطلبة من النوع ‪ student‬و بحجم ‪ 50‬عنصرا فإننا نستخدم الجملة‬
‫;‪section<student, 50> cs100‬‬
‫والن نستطيع ااستخدام الكائن ‪) cs100‬وهو شعبة من الطلبة( كأي كائن آخر مستخدمين الدوال المنتمية له‪.‬‬
‫ولنشاء شعبة من الطلبة من الصنف ‪ postgrad‬وبحجم ‪ 20‬طالب فإننا نستخدم الجملة‬
‫;‪section<postgrad, 20> cs700‬‬
‫والن لدينا الكائن ‪ cs700‬الذي يمثل شعبة من طلبة الدرااسات العليا؛ ونستطيع ااستخدام هذا الكائن من خلل‬
‫الدوال المنتمية المعرفة للصنف القالبي‪.‬‬
‫الصناف القالبية ‪Template Classes‬‬
‫أما بالنسبة لتعريف الدوال المنتمية للصنف القالبي ‪ section‬فيجب أن يسبق تعريف‬
‫أي دالة بالعبارة‬
‫‪>template<class T, int MaxSize‬‬
‫ثم يأتي نوع القيمة المرجعة ثم ااسم الصنف القالبي فالعوامل )بدون تحديد النوع( بين‬
‫الرمزين > <‪ .‬وفيما يلي نعرف الدوال المنتمية للصنف القالبي ‪.section‬‬
Template Classes ‫الصناف القالبية‬
section ‫ إلى الإ‬T ‫ من النوع العام‬s ‫ وتقوم هذ ه الدالة بإاضافة الكائن‬StAdd •
template<class T, int MaxSize>
void section<T,MaxSize>::StAdd(T s)
{int pos=0;
// search for the proper insertion position
while(s.get_stno() > sec[pos].get_stno() && pos<size)
pos++;
// shift elements one position up
for(int i=size-1;i>=pos;i--)
sec[i+1]=sec[i];
sec[pos]=s;
size++;
}
‫الصناف القالبية ‪Template Classes‬‬
‫• ‪ Stlist‬وتقوم هذ ه بعرض البيانات الخاصة بكل طالب في الشعبة‬
‫قد تختلف البيانات الخاصة بالطالب والتي نود عراضها حسب نوع الطالب فإذا كان‬
‫م ن النوع ‪) PostGrad‬طال ب درااس ات علي ا( عل ى اس بيل المثال فق د نحتاج إلى‬
‫طباعة ااسم المشرف‪ .‬و هذا المر غير وارد لطالب من نوع النوع ‪ .student‬ولحل‬
‫هذ ه المشكلة علينا تعريف العملية >> للصنف ‪ PostGrad‬والعملية نفسها للصنف‬
‫‪ student‬؛ بحيث تقوم هذ ه العملية بطباعة البيانات المطلوبة لكل نوع من الطلبة‪.‬‬
‫راجع‪ ،‬عزيزي الدارس‪ ،‬الوحدة السابقة لمعرفة كيف تعرف العمليات‪.‬‬

‫>‪template<class T, int MaxSize‬‬


‫)(‪void section<T,MaxSize>::Stlist‬‬
‫)‪{ for(int i=0;i<size;i++‬‬
‫} ;]‪cout<<sec[i‬‬
‫الصناف القالبية ‪Template Classes‬‬
‫‪bsearch‬‬
‫وتقوم هذ ه الدالة بااس تخدام خوارزمي ة البح ث الثنائ ي للبح ث ع ن طال ب معي ن في‬
‫الشعبة مستخدمين رقمه‪ .‬ومن المهم جدا أن تلحظ‪ ،‬عزيزي الدارس‪ ،‬أن هذ ه الدالة‬
‫تفترض أن لكل طالب مهما كان نوعه )‪ PsotGrad‬أو ‪ (student‬رقما وأن الدالة‬
‫‪ get_stno‬تسترجع قيمة هذا الرقم لي طالب‪ .‬مما يعني أن علينا تعريف الدالة‬
‫‪ ()get_stno‬للصنف ‪ student‬وللصنف ‪.PostGrad‬‬
Template Classes ‫الصناف القالبية‬
bsearch
// binary search
template<class T, int MaxSize>
int section<T,MaxSize>::bsearch(long sn)
{
int lo=0;
int hi=size-1;
while (lo <= hi)
{ int mid =(lo+hi) /2;
long r=sec[mid].get_stno();
if (r== sn)
return mid+1;
else
if (sn>r)
lo=mid+1;
else
hi = mid;
} //while
return -1;
}
Template Classes ‫الصناف القالبية‬
‫وتقوم هذ ه الدالة بشطب طالب ذي رقم معين من الشعبة‬. StDelete •
template<class T, int MaxSize>
int section<T,MaxSize>::StDelete(long stno)
{int i=bsearch(stno);
if(i>-1)
{for(int j=i;j<size-2;j++)
sec[j]=sec[j+1];
size--;
}
return i;
}
Template Classes ‫الصناف القالبية‬
StDelete •
‫ عزيزي‬،‫ لحظ‬.‫تقوم هذ ه الدال ة بالبح ث ع ن طال ب ذي رق م معي ن وعرض ال بيانات الخاص ة به‬
.‫ أن هذ ه الدالة أيضا تفترض أن العملية >> معرفة لنوع الطلبة‬،‫الدارس‬

template<class T, int MaxSize>


void section<T,MaxSize>::StRetrieve(long stno)
{int i=bsearch(stno);
if(i>-1)
cout<<sec[i];
else
cout<<"Student no "<<stno<<" was not found \n";
}
Template Classes ‫الصناف القالبية‬
.student ‫ باستخدام الصنف القالبي أعل ه لبد أول من تعريف الصنف‬student ‫• لنشاء شعبة من الطلبة من النوع‬
‫ وفيم ا يلي تعريفا محتمل للنوع‬.>> ‫ و العملي ة‬get_stno ‫ يج ب أ ن نعرف لهذا الص نف الدالة‬،‫وكم ا قلن ا س ابقا‬
student
• #include<iostream.h>
• class student{
• long stno;
• int csno;
• double grades[100];
• char StName[20];
• public:
• double average();
• void initialize();
• long get_stno() {return stno;}
• char* get_stname(){return StName;}
• double get_grade(int i);
• friend ostream& operator<<(ostream& c, student t);
• };
• ostream& operator<<(ostream& c, student t)
• {c<<"\n Student Name "<<t.StName;
• c<<"\n Student No "<<t.stno;
• c<<"\n Number of courses "<<t.csno;
• c<<"\n the average grades is"<<t.average()<<endl;
• return c;
• }
Template Classes ‫الصناف القالبية‬
.‫ وكيفية استخدامه‬section ‫والدالة الرئيسة التالية تعطي مثال على كيفية إنشاء كائن من الصنف‬
main()
{ // create a section of type student
section<student, 50> cs100;
int choice;
do
{cout<<"\n\n \t Enter 1 to add a new student \n";
cout<<"\t Enter 2 to delete a student \n";
cout<<"\t Enter 3 to some information about a student \n ";
cout<<"\t Enter 4 to get a list of all students \n";
cout<<"\t Enter 5 to Exit \n";
cin>>choice;
switch(choice){
case 1: // student add
student s;
s.initialize();
cs100.StAdd(s);
break;
case 2: // delete a student
long sn;
cout<<"Enter student number ";
cin>>sn;
cs100.StDelete(sn);
break;
case 3: // retrieve some data about an employee
cout<<"Enter student number ";
cin>>sn;
cs100.StRetrieve(sn);
break;
case 4: // list information about all students
cout<<"Students information \n\n";
cs100.Stlist();
break;
case 5: cout<<"End of program \n";
break;
default: cout<<"invalid choice ... Try again ";
}}
while(choice!=5); }
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫تمرير العوامل بالقيمة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫يوضح المقصود بمصطلح تمرير العوامل بالقيمة‪.‬‬ ‫‪.1‬‬


‫تمرير العوامل‬
‫بالقيمة‬
‫تأمل عزيزي الطالب تعريف الدالة التالية‪:‬‬
‫تسمى المتغيرات‬
‫)‪void swap1(int X, int Y‬‬ ‫‪ A,B‬بالعوامل‬
‫الرسمية‬
‫;‪{ int T=X‬‬
‫;‪X=Y‬‬
‫;‪Y=T‬‬ ‫}‬
‫تمرير العوامل‬
‫بالقيمة‬
‫لندرس نتيجة استدعاء الدالة أعل ه من خلل المثال التالي‪:‬‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap1(A,B‬تسمى المتغيرات‬
‫‪ A,B‬بالعوامل‬
‫الفعلية‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬
‫تمرير العوامل‬
‫بالقيمة‬

‫لغ ة ‪ C‬تمرر قي م العوام ل إل ى الدوال وبالتال ي فإ ن أي‬


‫تغيير تجريه الدالة على هذ ه القيم ل يؤدي إلى تغيير قيم‬
‫العوامل الحقيقية‪.‬‬
‫تمرير العوامل‬
‫بالقيمة‬

‫تستدعي هذ ه الدالة ‪ swap1‬لتبديل قيم العوامل الحقيقية‬


‫‪ A‬و ‪ B‬وتقوم بطباع ة قي م ‪ A‬و ‪ B‬قب ل وبع د استدعاء‬
‫‪ .swap1‬إن نتيجة تنفيذ هذا البرنامج هي طباعة ‪:‬‬
‫‪A=10 B=20‬‬
‫‪A=10 B=20‬‬
‫تمرير العوامل‬
‫بالقيمة‬

‫أي أن قيم ‪ A‬و ‪ B‬وهي العوامل الحقيقية لم تبدل بعد‬


‫استدعاء الدالة ‪ ،swap1‬وذلك لن الدالة ‪ swap1‬تستقبل‬
‫قيم العوامل ‪ A‬و ‪ B‬وليس عناوينها‪.‬‬
‫تمرير العوامل‬
‫بالقيمة‬

‫أ ن القي م ‪ 10‬و ‪ 20‬ف ي مثالن ا أعل ه تخزن ف ي مواقع‬


‫جديدة في الذاكرة تختلف عن مواقع المتغيرات ‪ A‬و ‪B‬‬
‫ولذا فإ ن أ ي تغيي ر عل ى العوام ل الرسمية ‪ X‬و ‪ Y‬ل‬
‫يقابله تغيير على قيم العوامل الحقيقية ‪ A‬و ‪.B‬‬

‫تسمى دهذه الطريقة لتمرير العوامل بالتمرير‬


‫بالقيمة‪.‬‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫توضح المقصود بمصطلح تمرير العوامل بالشارة‪.‬‬ ‫‪.1‬‬


‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫تمرير العوامل بالاشارة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫تمرير العوامل‬
‫بالاشارة‬
‫تذك ر عزيزي الطال ب ان لغة ‪ C‬تمرر قيم العوام ل إلى‬
‫الدوال وبالتال ي فإ ن أ ي تغيي ر تجري ه الدال ة على هذ ه‬
‫القيم ل يؤدي إلى تغيير قيم العوامل الحقيقية‪.‬‬

‫دهكذا دهي عملية تمرير المعامل ت بالقيمة‬


‫تمرير العوامل‬
‫بالاشارة‬
‫ول حل المشك لة أعل ه فإن نا بدل من أن نر سل قيمة‬
‫‪A‬‬ ‫الحقيقةةةةةةةةةةةةةيةةة‬ ‫ةةةةةةةةةةةةةلةة‬
‫م‬ ‫العوا‬
‫و ‪ B‬في مثال الدالة ‪ ،swap1‬ي جب أن نر سل للدالة‬
‫عنوانهما حتى تستطيع هذ ه الدالة تغيير القيم المخزنة في‬
‫هذ ه المواقع‪  .‬‬

‫هناك طريقتان لعمل ذلك‪...............‬‬


‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الولى‬
‫)‪void swap2(int* X,int* Y‬‬ ‫يتعامل‬ ‫مع‬ ‫‪swap2‬‬
‫المواقع التي نود تغييرها‬
‫* من خلل اللقاب‪X‬‬
‫;‪{ int T=*X‬‬ ‫* و‪.Y‬‬

‫;‪*X=*Y‬‬
‫;‪*Y=T‬‬
‫}‬
‫تمرير العوامل‬
‫بالاشارة‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap2(&A,&B‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬
‫أر سلنا عناو ين المتغيرين‬
‫‪ A‬و ‪) B‬أي &‪ A‬و&‪(B‬‬
‫عند ما ا ستدعينا الدالة‬
‫‪.swap2‬‬
‫تمرير العوامل بالشارة‬
‫وبالطبع تقوم الن الدالة ‪ swap2‬بتغيير قيم ‪ A‬و ‪ B‬كما يجب‬
‫حيث تكون النتائج كما يلي‪:‬‬

‫‪A=10 B=20‬‬
‫‪A=20 B=10‬‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫)‪void swap3(int &X, int &Y‬‬ ‫ظظظظظظ وجود العملية &‬‫لح‬
‫ظظلظظ ظظمنظظظ العوامل‬
‫ظظلظظ ك‬
‫قب‬
‫;‪{ int T=X‬‬ ‫الرظظمسظظظظية وذلك للشارة‬
‫;‪X=Y‬‬ ‫إلى أن العوامل الحقيقية‬
‫ستمرر بالشارة ) ‪by‬‬
‫;‪Y=X‬‬ ‫‪( ( reference‬‬

‫}‬
‫تمرير العوامل‬
‫بالاشارة‬
‫)(‪main‬‬
‫;‪{int A=10‬‬
‫;‪int B=20‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫;)‪swap3(A,B‬‬
‫;‪cout<<”A=”<<A<<” B=”<<B<<endl‬‬
‫}‬
‫من الم هم أن تلحظ‬
‫‪ ‬‬
‫عزيزي الدارس أننا‬
‫ا ستخدمنا أ سماء العوامل‬
‫‪ X‬و ‪ Y‬داخل الدالة بطريقة‬
‫مباشرة بدون أن نسبقها بـ‬
‫*‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫لحظ وجود العملية & قبل كل من العوامل الرسمية وذلك‬
‫للشارة إلى أن العوامل الحقيقية ستمرر بالشارة ) ‪by‬‬
‫‪ ( reference‬وليس بالقيمة )‪ ( by value‬مما يعني أن أي‬
‫تغيير على قيم العوامل الرسمية سيقابله تغيير على قيم‬
‫العوامل الحقيقية‪.‬‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫ومن الممكن أيضا أن ترجع الدالة قيمة بالاشارة‬
‫كما في مثالنا التالي‪:‬‬

‫)‪int& max(int A, int B‬‬


‫)‪{if (A>B‬‬
‫;‪return A‬‬
‫‪else‬‬
‫;‪return B‬‬
‫}‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن نوع القيمة المرجعة هو ‪&int‬‬
‫أي إشارة ‪ reference‬لمتغير صحيح‪ .‬تقوم الدالة ‪max‬‬
‫بتحديد العامل صاحب القيمة الكبر وإعادة إشارة إليه‪  .‬‬
‫تمرير العوامل‬
‫بالاشارة‪/‬‬
‫الطريقة الثانية‬
‫ولذا فإننا نستطيع أن نستدعي الدالة ‪ max‬كما يلي ‪:‬‬

‫;‪int A=10‬‬
‫;‪int B=100‬‬
‫;‪max(A,B)=5‬‬
‫إن نتي جة تنف يذ هذ ه الجم لة هي تخز ين القي مة ‪ 5‬في‬
‫المتغير صاحب أكبر قيمة وهو المتغير ‪.B‬‬
‫‪ ‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫الدوال الصديقة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالدوال الصديقة‪.‬‬


‫• ان تقارن ببن الدوال الصديقة والدوال المنتمية‪.‬‬
‫الدوال الصديقة‬

‫كم ا درس ت س ابقا عزيزي الطال ب فان الدوال المنتمية‬


‫للصنف هي فقط التي يحق لها معالجة الجزاء الخاصة‬
‫للصةةنف )المعرفةةة فةةي الجزء الخاص ‪ private‬من‬
‫الصنف(‪.‬‬
‫ف ي الواق ع أ ن هنال ك نوع ا آخ ر م ن الدوال يستطيع‬
‫معالج ة الجزاء الخاص ة للص نف وهذ ه الدوال تدعى‬
‫الدوال الصديقة‪.‬‬
‫ما معنى الدوال‬
‫الصديقة؟‬
‫‪ .‬وتعرف الدالة على أنها دالة صديقة لصنف ما بوضع نموذج‬
‫‪ prototype‬لهذ ه الدال ة داخةةل تعريةف الصةةنف مسبوقا‬
‫بالكلمة ‪.friend‬‬

‫‪ ‬مثال‪:‬‬
‫لتعريف الدالة ‪ average‬والتي تجد معدل علمات طالب ما‬
‫كدالة صديقة للصنف ‪ student‬نضع النموذج‪:‬‬
‫‪ ‬‬
‫;)‪friend double average(student s‬‬

‫داخل تعريف الصنف ‪student‬‬


‫ما معنى الدوال‬
‫الصديقة؟‬
:student ‫تأمل عزيزي الطالب تعريف الصنف‬

• class student{
• long stno;
• int csno;
• double grades[100];
• char StName[20]; average ‫الدالة‬
‫الحق في معالجة‬
• public: ‫الجزاء الخاصة‬
• friend double average(student s); student ‫للصنف‬
‫كما لو كانت دالة‬
• void initialize(); ‫منتمية للصنف‬
student
• long get_stno() {return stno;}
• char* get_stname(){return StName;}
• };
‫ما معنى الدوال‬
‫الصديقة؟‬
‫و تختلف طريقة استدعاء الدالة الصديقة عن طريقة استدعاء‬
‫الدالة المنتمية‪ .‬فمثل لستدعاء الدالة الصديقة ‪ average‬لحساب‬
‫معدل علمات الطالب )الكائن( ‪ S‬فإننا نستدعيها كما يلي‪:‬‬

‫)‪;average(S‬‬

‫بينما لو كانت الدالة ‪ average‬دالة منتمية للصنف ‪ student‬فإننا‬


‫نستدعيها كما يلي‪:‬‬
‫‪();S.average‬‬
‫كيف تكتب الدالة‬
‫الصديقة؟‬
‫تكتب الدالة الصديقة مثل أي دالة أخرى ليس لها علقة بالصنف‪.‬‬
‫فمثل تعرف الدالة ‪ average‬كما يلي‪:‬‬
‫أننا لم نستخدم اسم‬
‫ال صنف ول عملية‬
‫)‪double average(student S‬‬ ‫تقر ير المجال ‪ ::‬في‬
‫ترويسة هذه الدالة‪.‬‬
‫;‪{ double sum=0.0‬‬
‫)‪for(int i=0;i<S.csno;i++‬‬
‫;]‪sum=sum+S.grades[i‬‬
‫;‪return sum/S.csno‬‬
‫}‬
‫كيف تكتب الدالة‬
‫الصديقة؟‬
‫لحظ‪ ،‬عزيزي الدارس ايضا في جملة تعريف الدالة‪:‬‬

‫لهذ ه الدالة عامل واحد هو ‪ student S‬وذلك لتمرير اسم‬


‫الكائن الذي نود حساب المعدل له من خلله‪ ،‬ولو كانت‬
‫هذ ه الدالة دالة منتمية لما احتجنا إلى هذا العامل‬
‫امثلة منوعة على الدوال‬
‫الصديقة‬
class Accumulator
{
private:
int m_nValue;
public:
Accumulator() { m_nValue = 0; }
void Add(int nValue) { m_nValue += nValue; }

// Make the Reset() function a friend of this class


friend void Reset(Accumulator &cAccumulator);
};

// Reset() is now a friend of the Accumulator class


void Reset(Accumulator &cAccumulator)
{
// And can access the private data of Accumulator objects
cAccumulator.m_nValue = 0;
}
‫امثلة منوعة على الدوال‬
‫الصديقة‬
class Value
{
private:
int m_nValue;
public:
Value(int nValue) { m_nValue = nValue; }
friend bool IsEqual(const Value &cValue1, const Value &cValue2);
};

bool IsEqual(const Value &cValue1, const Value &cValue2)


{
return (cValue1.m_nValue == cValue2.m_nValue);
}
‫امثلة منوعة على الدوال‬
‫الصديقة‬
• class Humidity;

• class Temperature
• {
• private:
• int m_nTemp;
• public:
• Temperature(int nTemp) { m_nTemp = nTemp; }

• friend void PrintWeather(Temperature &cTemperature, Humidity &cHumidity);
• };

• class Humidity
• {
• private:
• int m_nHumidity;
• public: ‫يمكن ان‬
• Humidity(int nHumidity) { m_nHumidity = nHumidity; } ‫تكون الدالة‬
• ‫صديقة لكثر‬
• friend void PrintWeather(Temperature &cTemperature, Humidity &cHumidity);
• };
‫من صنف‬

• void PrintWeather(Temperature &cTemperature, Humidity &cHumidity)
• {
• std::cout << "The temperature is " << cTemperature.m_nTemp <<
• " and the humidity is " << cHumidity.m_nHumidity << std::endl;
• }
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫النصناف الصديقة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالصناف الصديقة‪.‬‬


‫النصناف الصديقة‬

‫من الممكن أن تكون دالة ما منتمية إلى صنف ما وصديقة‬


‫إلى صنف آخر‪ .‬وأحيانا قد نضطر إلى تعريف عدد كبير من‬
‫الدوال المنتمية إلى صنف كدوال صديقة إلى صنف آخر‪،‬‬
‫مما قد يؤدي إلى وضع عدد كبير من النماذج داخل تعريف‬
‫الصنف‪.‬‬
‫النصناف الصديقة‬

‫ولتج نب و ضع هذا العدد ال كبير من النماذج دا خل تعريف‬


‫ال صنف ن ستطيع تعر يف ال صنف بأكم له ك صنف صديق‬
‫للصنف الخر‪ .‬مما يعطي جميع الدوال المنتمية إلى الصنف‬
‫الول القدرة ع لى معال جة الجزاء الخا صة في الصنف‬
‫الخر‪.‬‬
‫النصناف الصديقة‬

‫‪‬مثال‪:‬‬
‫ع لى سبيل المثال لنفرض أن لدي نا الصنفين ‪manager‬‬
‫) مدير( والصنف ‪ ) employee‬موظف( وأننا نود إعطاء‬
‫جميع الدوال المنتمية للصنف ‪ manager‬إمكانية معالجة‬
‫جم يع المتغيرات والدوال الخا صة بالصنف ‪employee‬‬
‫فبدل من أن نعرف كل من هذ ه الدوال كدا لة صديقة‬
‫ةةنةةةف ‪ manager‬كصديق للصنف‬ ‫ةةف ال ص‬‫ةةةةطيع تعر ي‬
‫نةةتس‬
‫‪ employee‬مما يحقق نفس الغاية‪ .‬ويتم ذلك بوضع الجملة‬
‫‪friend manager‬‬
‫داخل تعريف الصنف ‪.employee‬‬
‫النصناف الصديقة‬
:‫ مثال‬
:‫مثال‬..‫ تتمة‬
#include<iostream.h>
• int main( )
class TwoValues {
• {
//continue
• TwoValues ob(10, 20);
int a;
• Min m;
int b;
• cout<< m.min(ob);
public:
• return 0;
TwoValues(int i, int j) {a = i, b=
• }
j;}
friend class Min;
};
class Min {
public:
int min(TwoValues x);
};
int Min::min (TwoValues x)
{
return x.a< x.b? x.a: x.b;
}
‫النصناف الصديقة‬
‫نةةة الفةةئةةة ‪ Min‬كفئة صديقة للفئة‬‫ةةم العلن ةةع‬
‫ت‬
‫‪ TwoValues‬في السطر التالي‪:‬‬
‫;‪friend class Min‬‬
‫‪ ‬‬
‫لذ لك تم الو صول إ لى العضاء الخا صة ‪ a‬و‪ b‬في الفئة‬
‫‪ TowValues‬من قبل الفئة ‪.Min‬‬
‫)‪int Min::min (TwoValues x‬‬
‫{‬
‫;‪return x.a< x.b? x.a: x.b‬‬
‫}‬
‫مثال على النصناف‬
class Storage ‫الصديقة‬
{
private:
int m_nValue;
double m_dValue;
public:
Storage(int nValue, double dValue)
{
m_nValue = nValue;
m_dValue = dValue; }

friend class Display;};


class Display{
private:
bool m_bDisplayIntFirst;
public:
‫امثلة منوعة على‬
‫الصديقة‬ ‫النصناف‬
    Display(bool bDisplayIntFirst) 
{ m_bDisplayIntFirst = 
bDisplayIntFirst; }
     void DisplayItem(Storage 
&cStorage)    {
        if (m_bDisplayIntFirst)
            std::cout << cStorage.m_nValue 
<< " " << cStorage.m_dValue << 
std::endl;
        else // display double first
            std::cout << cStorage.m_dValue 
<< " " << cStorage.m_nValue << 
std::endl;    }};
 
‫امثلة منوعة على‬
‫الصديقة‬
    int main() ‫النصناف‬
{
    Storage cStorage(5, 6.7);
    Display cDisplay(false);
 
    cDisplay.DisplayItem(cStorage);
 
    return 0;
}
‫تذكر!!!!‬
‫تذكر عزيزي الطالب‪:‬‬
‫‪  ‬تستعمل الفئات الصديقة إذا كان هنالك فئتين مرتبطتين ببعضهما كثيرا ا‬
‫لدرجة أن أحدهما تحتاج إلى الوصول إلى بيانات الخرى الخاصة بشكل‬
‫مباشر ‪.‬‬

‫‪ ‬أننا ل نريد أن نجعل البيانات عامة لن هذا سيتيح لي شخص تعديلها‬


‫بطريق الخطأ‪.‬‬

‫‪ ‬كما أن الفئة هي ليست مشتركة في صفات مع الفئة الخرى وعليه ل‬


‫يمكن استخدام الوراثة لذا فإن استعمال الفئات الصديقة هو السلوب‬
‫الوحيد لجعل إحدى الفئتين تصل إلى العضاء الخاصة في الفئة الخرى‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫اعادة تحميل العمليا ت‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالعمليات ‪Operators‬‬


‫• ان تتعرف على كيفية اعادة تحميل العمليات‪.‬‬
‫اعادة تحميل العمليا ت ‪Operators‬‬
‫‪Overloading‬‬
‫من المميزات الجميلة للغة ‪ ++C‬أنها تمكننا من إعادة‬
‫تعري ف العمليات ‪ operator‬المختلف ة بم ا يتناس ب مع‬
‫تطبيقاتنا‪ .‬فمثل نستطيع تعريف العملية ‪ +‬كعملية منتمية‬
‫للصنف ‪ section‬لتعني إضافة طالب معين إلى الشعبة‬
‫والعملي ة – لتعن ي شط ب طال ب معي ن من الشعبة‪ .‬ان‬
‫هذ ه التعريفات الجديدة لة ‪ +‬و – م ا هي إل تعريفات‬
‫إضافي ة لهذ ه العمليات‪ ،‬أ ي أنن ا نحمل هذ ه العمليات‬
‫تعريفات جديدة ‪ operator overloading‬وهذا ممكن‬
‫ل ن م ا يحدد تعري ف العملي ة المطلوب تنفيذه ا هو عدد‬
‫ونوع العوامل وليس فقط رمز العملية‪.‬‬
‫اعادة تحميل العمليا ت ‪Operators‬‬
‫‪Overloading‬‬
‫ف ي الواق ع إ ن الكثي ر م ن العمليات له ا أص ل أكث ر من‬
‫تعري ف ف ي لغ ة ‪ . ++C‬فمثل العملي ة ‪ +‬له ا أكث ر من‬
‫تعريف واحد فهي تعني الشارة الموجبة عندما تأتي مع‬
‫عام ل واح د‪ ،‬وتعن ي عملي ة جم ع ص حيحة وعملي ة جمع‬
‫حقيقية وغير ذلك‪ .‬ويقوم مترجم ‪ ++C‬بتحديد التعريف‬
‫المطلوب من عدد و نوع العوامل‪.‬‬
‫متى يقال ان العامل تم تحميله بشكل‬
‫زائد؟‬
‫عندما يعطى عامل موجود أصل ل كة‬
‫‪ +‬أو – القدرة على العمل على‬
‫أنواع بيانات جديدة يقال أ نه تم‬
‫تحميله بشكل زائد ‪.overloaded‬‬
‫‪‬تذكر‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
‫إن تعريف العمليات ل يختلف كثير عن تعريف الدوال وفي‬
‫الواقع إن العمليات هي نوع خاص من الدوال في لغة ‪++C‬‬
‫يختلف تعريف العملية عن تعريف الدالة فقط في أن اسم‬
‫العملية يتكون من الكلمة ‪ operator‬متبوعا برمز العملية‬
‫على سبيل المثال ‪.+operator‬‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
‫تأ خذ دا لة العا مل ‪ operator function‬عندما تكون عضوا ل‬
‫في الفئة الشكل العام التي‪:‬‬
‫)‪return_type operator#(arg_list‬‬
‫{‬
‫‪// operations‬‬
‫}‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
‫‪‬حيث ‪-:‬‬
‫•‪ return_type‬هو قيمة إعادة الدالة ‪#operator :‬والتي‬
‫غالبا ل م ا ترج ع كائنا ل تابعا ل للفئ ة الت ي تعم ل عل ى كائناتها‬
‫ولكن يمكن أن يكون‪.return_type‬من أي نوع آخر‬
‫•‪ ++Operator‬كلمة أساسية في ‪.C :-‬‬
‫• ‪ -: #‬تستبدل بالعامل المراد تحميله بشكل زائد ‪ ،‬فمثل ل‬
‫إذا كن ا نقوم بتحمي ل العام ل ‪ +‬بشك ل زائ د نكتب‬
‫‪.operator‬‬
‫•‪Arg_list‬وه ى لئح ة الوس يطات الممرة إل ى الدالة ‪:-‬‬
‫‪ #operator‬والتي تحتوى على عنصر واحد إذا كنا نقوم‬
‫بتحميل عامل ثنائي )‪ (.... ،/ ،- ،+‬وتكون فارغة إذا كنا‬
‫‪++‬نقوم بتحميل عامل‪ (++، -- ، ....).C‬أحادى‬
‫•‪Operations‬العمليات المراد م ن العام ل المحمل ‪:-‬‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
‫وك ما ن ضع نموذ جا للدا لة المنتم ية دا خل تعر يف الصنف‬
‫يجب أيضا أن نضيف نموذجا للعملية المنتمية داخل تعريف‬
‫ال صنف‪ .‬فمثل لتعر يف العمل ية ‪ +‬كعمل ية منتم ية للصنف‬
‫‪ section‬بحيث تستخدم لضافة طالب جديد للشعبة يجب‬
‫أول أن نضع النموذج التالي‬
‫)‪;void operator+(student s‬‬
‫‪ ‬‬
‫داخل تعريف الصنف ‪. section‬‬
‫كيف تتم عملية اعادة تحميل العمليا ت؟‬
:‫ كما يلي‬section ‫بحيث يصبح تعريف الصنف‬
 
class section{
student sec[50];
int size;
int bsearch(long stno);
public:
section(){size=0;}
void operator+(student s); ‫عملية اعادة تحميل العمليات‬
void StAdd(student s);
int StDelete(long stno);
void Stlist();
void StRetrieve(long stno);
};
 
‫؟‬+operator ‫تعريف العملية‬
:  StAdd ‫ل يختلف عن نموذج الدالة‬+ operator ‫كما أن تعريف العملية‬

void section::operator+(student s)
{int pos=0;
// search for the proper insertion position
while(s.get_stno() > sec[pos].get_stno() && pos<size)
pos++;
// shift element up one position
for(int i=size-1;i>=pos;i--)
sec[i+1]=sec[i];
sec[pos]=s;
size++;
}
‫استدعاء ‪+operator‬؟‬
‫أما بالنسبة لستدعاء العملية فيمكننا استدعاءها كأي دالة‬
‫منتمية‪ ،‬فمثل لضافة الطالب ‪ S‬للشعبة ‪ cs100‬يمكننا أن‬
‫نستدعي العملية ‪ +‬كما يلي‬
‫)‪;cs100.operator+(S‬‬
‫‪ ‬‬
‫أما الطريقة الفضل لستدعاء العملية فهي أن‬
‫نستخدمها كأي عملية جمع أخرى كما يلي‪:‬‬
‫‪ ‬‬
‫‪;cs100 + S‬‬
‫استدعاء ‪+operator‬؟‬
‫‪‬تذكر عزيزي الطالب‪:‬‬

‫وبالط بع ف إن متر جم ل غة ‪ ++C‬يعرف بأن هذ ه العملية‬


‫ليست عملية جمع عادية بسبب نوع العوامل ‪ cs100‬و ‪S‬‬
‫ولذا فإ نه يقوم با ستدعاء العمل ية ‪ +‬ال تي قم نا نحن‬
‫بتعريفها‪.‬‬
‫اعادة تعريف‬
‫العمليا ت‬
‫العمليات التي يمكن اعادة تحميلها ‪:‬‬
‫‪+‬‬ ‫‪-‬‬ ‫*‬ ‫‪/‬‬ ‫‪%‬‬ ‫^‬
‫&‬ ‫|‬ ‫~‬ ‫!‬ ‫‪,‬‬ ‫=‬
‫<‬ ‫>‬ ‫=<‬ ‫=>‬ ‫‪++‬‬ ‫‪--‬‬
‫<<‬ ‫>>‬ ‫==‬ ‫=!‬ ‫&&‬ ‫||‬
‫=‪+‬‬ ‫=‪-‬‬ ‫=‪/‬‬ ‫=‪%‬‬ ‫=^‬ ‫=&‬
‫=|‬ ‫=*‬ ‫=<<‬ ‫=>>‬ ‫][‬ ‫)(‬
‫>‪-‬‬ ‫*>‪-‬‬ ‫‪new‬‬ ‫][ ‪new‬‬ ‫‪delete‬‬ ‫‪delete‬‬
‫][‬
‫اعادة تعريف‬
‫العمليا ت‬
‫العمليات التي يمكن ل اعادة تحميلها ‪:‬‬

‫‪::‬‬ ‫*‪.‬‬ ‫‪.‬‬ ‫‪?:‬‬


‫تذكر‪:‬‬
‫ل يمكن تغيير الخصائص التالية للعمليا ت عند إعادة‬
‫تعريفها ودهي ‪:‬‬

‫‪ ‬عدد العوامل‪ :‬فإذا كانت العملية في لغة ‪ ++C‬تأخذ عاملين ل‬


‫يمكن تعريفها بحيث تأخذ عامل واحدا على سبيل المثال‪.‬‬
‫‪ ‬أسبقية )أو أولوية( ‪ priority‬العملية‪ :‬فل يمكن إعادة تعريف‬
‫العملية ‪ +‬وإعطاؤها أولوية أعلى من تلك الخاصة بالعملية *‪.‬‬
‫‪ ‬ترتيب التنفيذ ‪ :associativity‬فإذا كان ترتيب تنفيذ العملية‬
‫من اليسار إلى اليمين ل يمكن تغيير هذا الترتيب وجعله من‬
‫اليمين إلى اليسار‪.‬‬
Unary ‫اعادة تعريف‬
Operators
include <iostream> // overloaded minus (-)
using namespace std; operator
class Distance{ Distance operator- ()
private: {
int feet; // 0 to feet = -feet;
infinite inches = -inches;
int inches; // 0 to return Distance(feet,
12 inches); }};
public: int main(){
// required constructors Distance D1(11, 10),
Distance(){ D2(-5, 11);
feet = 0; -D1; // apply
inches = 0; } negation
Distance(int f, int i){
D1.displayDistance(); //
feet = f;
display D1
inches = i; }
-D2; // apply
// method to display negation
distance
void displayDistance() D2.displayDistance(); //
{ display D2
cout << "F: " << feet return 0;}
‫اعادة تعريف‬
‫العمليا ت‬
‫الناتج من البرنامج السابق ‪:‬‬
‫‪F: -11 I:-10‬‬
‫‪F: 5 I:-11‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫أاشكال اعادة تحميل‬


‫للعمليا ت المختلفة‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان تتعرف على اشكال اعادة تحميل العمليات‪.‬‬


‫ااشكال اعادة تحميل العمليا ت‬
‫م ن المميزات الجميل ة للغ ة ‪ ++C‬أنه ا تمكنن ا من إعادة‬
‫تعري ف العمليات ‪ operator‬المختلف ة بم ا يتناس ب مع‬
‫تطبيقاتنا‪.‬‬

‫وكما يمكننا أن نعرف الدالة كدالة منتمية أو صديقة فإنه‬


‫يمكنن ا أيض ا أ ن نعرف العملي ة كعملي ة منتمي ة أ و عملية‬
‫صديقة‪.‬‬

‫وكما أن تعريف العملية المنتمية ل يختلف كثيرا عن تعريف‬


‫الدالة المنتمية ل يختلف تعريف العملية الصديقة كثيرا عن‬
‫تعريف الدالة الصديقة‪.‬‬
‫ااشكال اعادة تحميل العمليا ت‬

‫وكمثال عل ى تعري ف الدوال الص ديقة س نعرف الن دالة‬


‫ص ديقة للص نف ‪ time‬الذي يمث ل وقت ا معين ا يتكون من‬
‫الس اعة والدقيق ة والثانية‪ .‬يمكنن ا أ ن نعرف هذا الصنف‬
‫باس تخدام ثلث ة متغيرات منتمية ‪ hour‬و ‪ min‬و ‪sec‬‬
‫لتمثيل الساعة والدقيقة والثانية على الترتيب‪.‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫لنفرض أنن ا نري د تعري ف العملي ة >> بحي ث تعرض لنا‬
‫الوق ت عل ى الشاش ة بطريق ة مناس بة فمثل عن د تنفيذ‬
‫العملية‬
‫;‪cout<<T‬‬
‫تكون النتيجة عرض الوقت كما يلي‬
‫‪The time is 12:23:30‬‬

‫على افتراض أن قيم المتغيرات المنتمية لة ‪T : hour‬‬


‫و‪ min‬و ‪ sec‬هي ‪ 12‬و ‪ 23‬و ‪ 30‬على الترتيب‪.‬‬
‫‪ ‬انتبه‪ :‬عزيزي الطالب‪ ،‬أن للعملية >> عاملن الول‬
‫هو ‪ cout‬والثاني كائن من الصنف ‪.time‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫في الواقع أن ‪ cout‬هو كائن من الصنف ‪ ostream‬كما‬
‫أن ‪ cin‬كائن من الصنف ‪.istream‬‬
‫إن العملية >> معرفة كعملية صديقة للصنف ‪ostream‬‬
‫كم ا أ ن العملي ة << معرف ة كعملي ة ص ديقة للصنف‬
‫‪.istream‬‬
‫وهذ ه العمليات معرفة بحيث يسمحن للعامل الثاني أن‬
‫يكون عددا صحيحا أو حقيقيا أو سلسلة رمزية … الخ‪.‬‬
‫وهذ ه التعاريف موجودة في المكتبة ‪.iostream‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫في الواقع أن ‪ cout‬هو كائن من الصنف ‪ ostream‬كما‬
‫أن ‪ cin‬كائن من الصنف ‪.istream‬‬

‫إن العملية >> معرفة كعملية صديقة للصنف ‪ostream‬‬


‫كم ا أ ن العملي ة << معرف ة كعملي ة ص ديقة للصنف‬
‫‪.istream‬‬

‫وهذ ه العمليات معرفة بحيث يسمحن للعامل الثاني أن‬


‫يكون عددا صحيحا أو حقيقيا أو سلسلة رمزية … الخ‪.‬‬
‫وهذ ه التعاريف موجودة في المكتبة ‪.iostream‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫وما نريد فعله هو إعطاء العملية >> تعريفا جديدا يسمح‬
‫للعام ل الثان ي بأ ن يكون م ن الص نف ‪ ،time‬لذا فإننا‬
‫سةةنعرفها كعمليةةة صةةديقة للصةةنف ‪ .time‬ولذا فإننا‬
‫سنضيف النموذج‪:‬‬

‫‪friend‬‬ ‫&‪osrteam‬‬ ‫&‪operator<<(ostream‬‬


‫;)‪c,time t‬‬

‫للصنف ‪. time‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
:‫ يصبح تعريفه‬time ‫الصنف‬
 
#include<iostream.h>
class time{
int hour;
int min;
int sec;
     public:
  time(int h, int m, int s){hour=h;
          min=m;
          sec=s;}
friend osrteam& operator<<(ostream& c,time t);
       };
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
:‫أما العملية نفسها فتعرف كما يلي‬

ostream& operator<<(ostream& C, time t)
{
  C<<”the time is 
“<<t.hour<<’:’<<t.min<<’:’<<t.sec<<endl;
  return C;
}
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫لحظ‪ ،‬عزيزي الدارس‪ ،‬أن للعملية >> عاملين هما‪:‬‬

‫‪ .1‬العامل ‪ c‬وهو من النوع ‪ &ostream‬ويمثل الكائن‬


‫الذي نود عرض القيم ة عليه‪ .‬لح ظ أيضا‪ ،‬عزيزي‬
‫الدارس‪ ،‬أ ن هذا العام ل س يمرر بالشارة وذل ك لنه‬
‫من النوع ‪.&ostream‬‬
‫‪ .2‬والعام ل ‪ t‬وه و كائ ن م ن الصنف ‪ time‬والذي نود‬
‫عرض قيمته‪.‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫و الن نستطيع استخدام دهذه العملية كما يلي‬
‫;)‪time tt(12,30,23‬‬
‫;‪cout<<tt‬‬
‫إ ن العام ل الحقيق ي الول ‪ cout‬يمرر للعملي ة >> من‬
‫خلل العامل الرسمي ‪ C‬وأن العامل الحقيقي الثاني ‪tt‬‬
‫يمرر للعملية >> من خلل العامل الرسمي الثاني ‪.t‬‬
‫‪ ‬تذكر الجملة ‪:‬‬
‫)‪ostream& operator<<(ostream& C, time t‬‬
‫العملية >> معرفة كعملية نصديقة‬
‫للصنف‬
‫من المهم أن تلحظ‪ ،‬عزيزي الطالب ما يلي‪:‬‬
‫‪ ‬أنن ا عرفن ا للعملي ة >> عاملي ن وذل ك لنه ا عملية‬
‫ص ديقة وليس ت منتمي ة‪ ،‬إ ذ ل و كان ت منتمي ة لكتفينا‬
‫بتعري ف العام ل الثان ي عل ى اعتبار أ ن العامل الول‬
‫يعتبر تلقائيا على أنه من الصنف الذي تنتمي إليه هذ ه‬
‫العملية‪.‬‬
‫‪ ‬لح ظ أيض ا أ ن هذ ه العملي ة ترج ع قيم ة العامل ‪C‬‬
‫)لذلك فإن نوع القيمة المرجعة هو ‪ (&ostream‬وذلك‬
‫حتى نتمكن من استخدامها في سلسلة من العمليات‬
‫كما في الجملة‪:‬‬
‫;‪cout<<tt<<ss<<t2‬‬
‫حيث ‪ tt‬و ‪ ss‬و ‪ t2‬كائنات من الصنف ‪.time‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫الكلمة المفتاحية ‪This‬‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالكلمة المفتاحية ‪.This‬‬


‫الكلمة المفتاحية ‪This‬‬

‫يمتلك كل كائن في فئة مؤشرا ل خاصا ل يسمى ‪ this‬يشةةةةةةةةير إليةةةةةةةةةةه‪،‬‬


‫وباستخدام هذا المؤشر يستطيع أي عضو دالي في الفئة معرفة عنوان‬
‫الكائن الذي استدعا ه ‪.‬‬
This ‫الكلمة المفتاحية‬
-:where ‫المثال التالي يوضح هذا والذي يعرف الصنف‬
 

#include<iostream.h>
class where
{
private:
char chararray[10];
public:
//Continued
void reveal( )
{ cout <<”My Objects address is “<<this;
};
‫الكلمة المفتاحية ‪This‬‬
‫وهذا هو جزء ‪ main‬الذي يستدعي الدوال‪:‬‬
‫) (‪main‬‬
‫{‬
‫;‪where w1,w2‬‬
‫;) (‪w1.reveal‬‬
‫;) (‪w2.reveal‬‬
‫}‬
‫الكلمة المفتاحية ‪This‬‬
‫ينش ئ هذا ال برنامج كائنات م ن النوع ‪ ،where‬ويطلب‬
‫من كل منها عرض عنوانه باستعمال الدالة ‪،( )reveal‬‬
‫والتي تعرض قيمة المؤشر ‪.this‬‬
‫الخرج من البرنامج يبدو كالتالي‪:‬‬

‫‪My object’s address is ox8f4effec‬‬


‫‪My object’s address us ox8f4effe2‬‬
‫الكلمة المفتاحية ‪This‬‬

‫نلحظ إن عنوان الكائن ‪ w2‬يبتعد ‪ Bytes 10‬عن عنوان ‪،w1‬‬


‫وذلك لن البيانات في كل كائن تتألف من مصفوفة من ‪10‬‬
‫‪.Bytes‬‬
‫الكلمة المفتاحية ‪This‬‬
‫يم كن معام لة المؤ شر ‪ this‬كأي مؤشر كائنات آخر‪ ،‬لذا‬
‫يم كن استخدامه للو صول إ لى بيانات الكا ئن الذي يشير‬
‫إليه كما هو مبين في البرنامج أدنا ه‪.‬‬
This ‫الكلمة المفتاحية‬
-:test ‫المثال التالي يوضح دهذا والذي يعرف الصنف‬
#include<iostream.h>
class test {
public:
test(int=0);
void print( ) const;
private:
int x;
};
void test::print( ) const
//Continued
{
cout <<” X=”<<x<<endl
<<”this-> x= “<<this->x<<endl;
<<”(*this).x=”<<(*this).x<<endl;
}
‫الكلمة المفتاحية ‪This‬‬
‫وهذا هو جزء ‪ main‬الذي يستدعي الدوال‪:‬‬

‫) ( ‪main‬‬
‫{‬
‫;)‪test a(12‬‬
‫;) (‪a.print‬‬
‫;‪return 0‬‬
‫}‬
‫الكلمة المفتاحية ‪This‬‬
‫وللتوضيح فإن العضو الدالي ‪ print‬يقوم أول ل بطباعة ‪x‬‬
‫مباشرة‪ ،‬ثم يستعمل طريقتين للوصول إلى ‪ x‬باستعمال‬
‫المؤشر ‪: this‬‬

‫‪‬الولى‪ :‬باستعمال العامل )‪.(<-‬‬


‫‪‬الثانية‪ :‬باستعمال العامل )‪.(.‬‬
‫الكلمة المفتاحية ‪This‬‬
‫لحظ القواس التي تحيط بة *‪ ،this‬عندما نقوم باستخدام‬
‫العا مل )‪ (.‬للو صول إ لى أعضاء الف ئة نستعمل القواس‪،‬‬
‫وذلك لن العامل )‪ (.‬له أولوية أعلى من العامل *‪ ،‬وعليه‬
‫بدون القواس يتم تقييم التعبير *‪ this.x‬كالتي‪:‬‬
‫)‪*(this.x‬‬
‫والذي ينتج عرض رسالة خطأ من المصرف لن العامل )‪(.‬‬
‫ل يستخدم مع المؤشرات‪.‬‬
‫هنا لك ا ستعمالت أخرى للمؤ شر ‪ this‬ويظهر استعمالها‬
‫عند تحميلنا للعوامل بشكل زائد‪.‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫العنانصر الثابتة )‪(static‬‬


‫إعداد‪ :‬أ‪ .‬طروب عيسى‬
‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان توضح المقصود بالعناصر الثابتة‪.‬‬


‫البيانا ت الساكنة‬
‫استعملنا حتى الن أعضاء بيانية مثيلية)‪ (instant‬أي أن‬
‫هنالك نسخة واحدة منها لكل كائن يتم إنشاؤ ه ولكن قد‬
‫نحتاج لمتغير ينطبق على كل كائنات الفئة‪.‬‬
‫لتحقيق ذلك نستعمل عضوا ل بيانيا ل ساكنا ل ‪static data‬‬
‫‪ member‬فعندما نعلن عن متغير في بيانات فئة ما على‬
‫أ نه ساكن ‪ static‬نعنى بذلك أنه ستكون هنالك نسخة‬
‫واحدة فقط من هذا المتغير في الذاكرة وستتشارك كل‬
‫الكائنات التاب عة لهذ ه الف ئة في هذا المتغ ير ب غض النظر‬
‫عن عدد هذ ه الكائنات ‪ .‬يتم تمهيد كل المتغيرات الساكنة‬
‫عند ‪ 0‬قبل إنشاء أي كائن ‪.‬‬
‫البيانا ت الساكنة‬
‫يتم تصريح المتغير الساكن ضمن الفئة باستعمال الكلمة‬
‫الساسية ‪:‬‬
‫‪static‬‬
‫ويتم تعريفه خارجها ‪ ،‬وذلك لنه إذا افترضنا أن البيانات‬
‫المعرفة داخل الفئة هي بيانات مثيلية مكررة لكل كائن‪.‬‬

‫إذن لتعر يف متغ ير يتوا جد مرة ل كل الف ئة علي نا تعريفه‬


‫خارج الفئة وتصريحه داخلها ليكون معروفا ل لبقية أعضائها‪.‬‬
‫البيانا ت الساكنة‬
:‫مثال توضيحي‬
#include<iostream.h>
class shared {
static int a;
‫العلن عن‬
int b; ‫ على انه‬a ‫المتغير‬
//Continued ‫ساكن‬

public:
void set(int i,int j) { a=i; b=j;}
void show( );};
int shared :: a; // define a
void shared :: show( ){
cout <<” This is static a: "<< a;
cout<<”\nThis is non_static b: " << b;
cout << "\n";}
‫العنانصر الثابتة )‪(static‬‬
‫يمك ن ف ي لغ ة س ي ‪ ++‬اس تعمال متغيرات ثابتة ذات أنواع‬
‫أس اسية ‪ ،‬حي ث ت م اس تعمالها لتعري ف ثاب ت كحج م مصفوفة ‪،‬‬
‫يمكن جعل كائن تابع لفئة ما ثابتا ل إذا كنا نريد ضمان عدم تغير‬
‫البيانات في الكائن‪.‬‬
‫وكمثال عل ى ذل ك ف ي الص نف‪ Time‬والت ي رأيناه ا ف ي امثلة‬
‫س ابقة‪ ،‬لنفترض أنن ا نري د إنشاء كائ ن يدعى )‪noon (12, 0, 0‬‬
‫سيكون من الجيد ضمان عدم تغيير قيمة هذا الكائن‪.‬‬
‫لتحقيق هذا نكتب العبارة ‪:‬‬
‫;)‪const Time noon( 12, 0, 0‬‬
‫والتي تعلن عن كائن ثابت ‪ noon‬في الفئة ‪ Time‬وتمهد قيمته عند‬
‫‪. 12‬‬
‫الكائنا ت الثابتة‬
‫‪Constant Objects‬‬

‫في مثالنا السابق ‪:‬‬


‫ل تسمح مصرفات ‪ ++C‬باستدعاء الكائنات الثابتة من قبل‬
‫العضاء الدالية في الفئة لضمان عدم تعديل بيانات هذ ه‬
‫الكائنات ‪ ،‬ول كن قد نر غب في ب عض الحيان في عرض‬
‫قي مة هذ ه الكائنات وال تي ل تؤ ثر ب أي حال من الحوال‬
‫على بياناتها‪.‬‬
‫‪ ‬فما هو الحل؟؟؟؟؟؟؟؟؟؟؟؟؟؟‬
‫الكائنا ت الثابتة‬
‫‪Constant Objects‬‬
‫لحل هذ ه المشكلة يمكن للمبرمج العلن عن دالت ثابتة‬
‫)‪ (const‬وهي عبارة عن أعضاء دالية تضمن أنه لن يتم‬
‫تغيير بيانات الكائن الذي استدعي من أجلها ‪.‬‬
‫ولجعل عضوا ل داليا ل ثابتا ل تتم كتابة الكلمة الساسية ‪const‬‬
‫في تعريف العضو الدالي وتصريحه مباشرة بعد القواس‬
‫التي تلي اسمه ‪.‬‬
‫الدال ت الثابتة‬
Constant Functions
:‫اليك عزيزي الطالب المثال التالي‬
-: Time ‫ التابع للفئة‬printMilitary ‫أدنا ه يبدو العضو الدالي‬
void Time::printMilitary( ) const

{
cout<< (hour < 10 ? “0” : “ “ ) << hour << “:”
<< (minute < 10 ? “0” : “ “) << minute << “:”
<< (second < 10 ? “0” : “ “ )<< second;
}
‫المعامل ت الساكنة‬
‫نفترض ان نا نر غب في تمر ير احدى المعاملت كمرجع‬
‫لزيادة كفاءة البرنامج مع عدم تمكين الدوال في العبث‬
‫في قيمة هذا المعامل‪ ،‬فماذا نفعل؟؟؟؟‬

‫يمكن في مثل هذ ه الحالة استخدام الكلمة المفتاحية‪:‬‬


‫‪const‬‬
‫قبل المعامل في جملة العلن عن الدالة‪ .‬مثال‪:‬‬
‫)‪;Void aFunc(int& a, const int& b‬‬
‫جامعة القدس المفتوحة‬
‫مركز التعليم المفتوح ‪OLC‬‬

‫نصنف المجموعا ت ‪Class Set‬‬

‫إعداد‪ :‬أ‪ .‬طروب عيسى‬


‫الدهداف‬

‫يتوقع من الطالب بعد مشاهدة الفيديو أن‪:‬‬

‫• ان تتعرف على مفهوم صنف المجموعات‪.‬‬


‫• ان تتعرف على العمليات المختلفة لصنف المجموعات‪.‬‬
‫نصنف المجموعا ت‬
‫تعرف المجمو عة بأن ها عدد من الشياء غ ير المرتبة‬
‫المأخوذة بدون تكرار من مدى ‪ Universe‬محدد‪ .‬ويحدد‬
‫المدى بأ صغر قي مة وأ كبر قي مة يم كن أن تنتم يا إلى‬
‫المجموعة‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫وهنالك العديد من العمليات التي تستخدم على المجموعات‬
‫أهمها‪:‬‬
‫‪ ‬إنشاء المجمو عة‪ :‬وسنعرف بناء ‪ constructor‬يقوم بهذ ه‬
‫العملية‪.‬‬
‫‪ ‬إضافة عنصر للمجموعة‪ :‬وسنعرف العملية ‪ +‬لتقوم بذلك‪.‬‬
‫‪ ‬إزالة عنصر من المجموعة‪ :‬وسنعرف العملية – لتقوم بهذ ه‬
‫المهمة‪.‬‬
‫‪ ‬تقا طع المجموعات ‪ :set intersection‬حيث يتكون حاصل‬
‫تقا طع مجموعت ين من جم يع العنا صر المشتر كة بين‬
‫المجموعتين ) أي ال تي تظ هر في المجموعتين(‪ .‬وسنعرف‬
‫العملية * لتنفيذ هذ ه العملية‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫‪ ‬اتحاد المجموعات ‪ :set union‬حيث يتكون حاصل اتحاد‬
‫مجموعتين من جميع العناصر التي تظهر في أي من هذ ه‬
‫المجموعات‪ .‬و سنعرف العمل ية ‪ +‬لتنفيذ هذ ه العملية‪.‬‬
‫لحظ أننا بذلك نكون قد أضفنا تعريفين للعملية ‪.+‬‬
‫‪ ‬النتماء إ لى المجمو عة‪ :‬ح يث يع تبر عن صرا ما منتميا‬
‫للمجموعة إذا ظهر في هذ ه المجموعة‪ .‬وسنكتب الدالة‬
‫‪ IN‬لتنفيذ هذ ه العملية‪.‬‬
‫‪ ‬تعيين المجموعات‪ :‬وتقوم هذ ه العملية بجعل مجموعة ما‬
‫مساوية لمجموعة أخرى‪ .‬وسنكتب العملية = لتنفيذ ذلك‪.‬‬
‫‪. ‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫‪‬التأكد من أن المجموعة خالية‪ :‬وتستخدم لفحص فيما‬
‫إذا كا نت المجمو عة خال ية أم ل‪ .‬و سنستخدم الدالة‬
‫‪ SetEmpty‬لعمل ذلك‪.‬‬
‫‪‬فرق المجموعات ‪ :set difference‬وتستخدم هذ ه‬
‫العملية ليجاد العناصر الموجودة في مجموعة وليست‬
‫موجودة في مجموعة أخرى‪.‬‬
‫‪‬عرض عنا صر المجمو عة ع لى الشا شة‪ :‬وسنعرف‬
‫العملية >> لعمل ذلك‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫سنفترض هنا أن مدى المجموعة مدى محدود بمعنى أننا‬
‫نس تطيع أ ن نعدد جميع عناص ر ه‪ .‬وذل ك لننا سنستخدم‬
‫مصفوفة ذات بعد واحد لتمثيل أي مجموعة حيث أن كل‬
‫عنصر في المدى يمثل بموقع في هذ ه المصفوفة‪.‬‬
‫فإذا كان ذلك العنصر منتميا إلى المجموعة نضع القيمة‬
‫‪ 1‬ف ي الموق ع المخص ص ل ه وإ ن ل م يك ن منتمي ا نضع‬
‫القيمة ‪ 0‬في الموقع المخصص له‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫فمثل لنفرض أن مدى المجموعة هو أسماء أيام السبوع‬
‫السبعة‪.‬‬
‫لتمثي ل هذ ه المجموع ة نس تخدم مص فوفة م ن سبعة‬
‫مواقع‪ ،‬موقع لكل عنصر في المدى‪.‬‬
‫إذا كان يوم الس بت عنص را ف ي المجموع ة فإننا نخزن‬
‫القيمة‪ 1‬في الموقع الول المخصص له وإذا لم يكن فإننا‬
‫نخزن القيمة ‪ 0‬في الموقع المخصص له‪.‬‬
‫ثم نأتي للموقع الثاني في المصفوفة و المخصص ليوم‬
‫الحد ونضع فيه القيمة ‪ 1‬إذا كان يوم الحد عنصرا في‬
‫المجموعة و ‪ 0‬إذا لم يكن وهكذا‪.‬‬
‫العمليا ت على نصنف المجموعا ت‬
‫يبين الش كل التا لي بالر سم م صفوفة تم ثل المجمو عة {‬
‫سبت‪،‬أثنين‪،‬خميس }‪:‬‬

‫مصفوفة تمثل المجموعة {سبت‪ ،‬أثنين‪،‬‬


‫خميس}‬
‫العمليا ت على نصنف المجموعا ت‬
:‫وسنستخدم الصنف التالي لتمثيل مجموعة من أيام السبوع‬
 
class Set{
int weekdays[7];
public:
Set();
void operator+(int i);
void operator-(int i);
friend Set operator*(Set S, Set T);
friend Set operator+(Set S, Set T);
int IN(int i);
void operator=(Set S);
int SetEmpty();
friend Set operator-(Set S, Set T);
friend ostream& operator<<(ostream& C, Set S);
};
‫العمليا ت على نصنف المجموعا ت‬
‫لح ظ‪ ،‬عزيزي الدارس‪ ،‬أ ن هذا الص نف يحتوي على‬
‫متغير منتم واحد هو ‪ weekdays‬والذي هو في الحقيقة‬
‫مصفوفة من سبعة مواقع كل موقع مخصص ليوم من‬
‫أيام السبوع‪.‬‬
‫كم ا يحتوي عل ى العدي د من نماذج الدوال والعمليات‬
‫المنتمية والصديقة‪.‬‬

‫سيتم مناقشتها في الفيديو المسجل العملي‪..........‬‬


‫د‬ ‫د ة حد د‬ ‫د‬ ‫دس دج‬ ‫م د د د‬ ‫د‬ ‫د‬ ‫ز ز دا س يد دمس‬ ‫س‬
‫س د ما‬ ‫د‬ ‫د‬ ‫خد‬ ‫د‬ ‫د أ د‬ ‫د ‪، stdio.h‬‬ ‫يد‬ ‫د‬ ‫د )( ‪، printf‬‬ ‫د‬ ‫س د ما‬
‫دم‬ ‫د اخ د يد‬ ‫مدز‬ ‫س ما‬ ‫‪،‬‬ ‫س‬ ‫ي‬ ‫أ‬ ‫)( ‪scanf‬‬ ‫س ما‬
‫‪:‬‬ ‫م خ‬
‫;‪int x‬‬
‫;)‪scanf ("% d" ,&x‬‬
‫س س‪.‬‬ ‫س‬ ‫ي‬ ‫خ‬ ‫ف‬ ‫يس‬ ‫س ‪،‬أ‬ ‫خص‬ ‫ذ‬ ‫أ‬

‫جطضةػاضطبارةػ‪cout‬‬
‫د‬ ‫د‬ ‫س د ما‬ ‫د‬
‫د‬ ‫سد ي‬ ‫د‬ ‫س د ما ‪،‬‬ ‫د‬ ‫د‬ ‫د ‪ cout‬إ خ د‬ ‫د‬ ‫س د ما‬
‫د‬ ‫)( ‪ printf‬أ ا‬ ‫س‬ ‫م ف ذ‬ ‫غم ‪،‬‬ ‫م‬ ‫ذ‬ ‫ض‬
‫‪:‬‬ ‫ص‬ ‫م ‪، %d ….‬‬ ‫ا‬
‫; "‪cout << "yousef anaya‬‬
‫‪:‬‬ ‫ص‬ ‫م ي‬ ‫س‬ ‫ي‬ ‫‪،‬‬ ‫ض‬ ‫سس س ز أ‬ ‫أس‬ ‫ذ ي‬
‫; ‪cout << x‬‬
‫صد‬ ‫ا‬ ‫ذ‬ ‫ض‬ ‫ص‬ ‫أ‬ ‫ما‬ ‫ا‬ ‫زز اس‬ ‫ا‬
‫د‬ ‫دم ي د‬ ‫د د‬ ‫د‬ ‫‪ ،‬د يد‬ ‫ص‬ ‫""‪ ،‬ذ‬ ‫ز‬
‫‪.‬‬ ‫ء‬ ‫‪ ،‬ا‬ ‫ص‬ ‫س ‪ ،‬ذ‬ ‫ض‬ ‫مي‬ ‫س‬
‫‪:‬‬ ‫س ما‬ ‫م خ ذ م ‪،‬ي‬ ‫ذ‬ ‫م ‪،‬أ‬ ‫س‬ ‫ي‬
‫; ‪cout << &x‬‬
‫د‬ ‫د يد‬ ‫دم س د دذ‬ ‫د سد‬ ‫د يد دس د‬ ‫د دم د‬ ‫فس‬ ‫س‬
‫‪.‬‬ ‫مي ا م‬ ‫م خم ذ ‪،‬‬ ‫م‬
‫سد ما‬ ‫ضد‬ ‫د‬ ‫دم د‬ ‫د‬ ‫س س م م ي س ما ذ‬ ‫س‬ ‫ا يم‬
‫‪:‬‬ ‫ص‬ ‫ا‬
‫; "‪cout << "yousef" << "anaya‬‬
‫د دم س أ دم د دم سد ما‬ ‫<< ‪ ،‬د‬ ‫د ا خد‬ ‫د‬ ‫د‬ ‫اس‬ ‫زز‬ ‫سا‬
‫م يد‬ ‫ساس م ز‬ ‫ض‬ ‫ا ‪،‬‬
‫‪:‬‬ ‫ا‬
‫;‪int x=5‬‬
‫; ‪cout << "yousef" << "anaya" << x‬‬

‫‪:‬‬ ‫س‬ ‫ة‬ ‫س ا‬


‫‪yousefanaya5‬‬

‫‪:‬‬ ‫ة‬ ‫ا‬ ‫س‬ ‫اص ي‬ ‫س‬ ‫أ‬


‫;‪cout << "yousef " << "anaya "<< x‬‬
‫د ‪، anaya‬‬ ‫دا‬ ‫د‬ ‫س ي ي سغد‬ ‫ذ‬ ‫‪yousef‬‬ ‫ا‬ ‫س ي ي سغ‬ ‫ضي‬ ‫ا‬ ‫زز‬ ‫ا‬
‫‪:‬‬ ‫ة‬ ‫س‬
‫‪Yousef anaya 5‬‬
‫د سد ي أ م دا‬ ‫د‬ ‫دم م دا‬ ‫م‬ ‫ذ ذ س‬ ‫ا ‪،‬‬ ‫م ض‬ ‫ص‬
‫‪:‬‬ ‫ا‬
‫………… ‪1 2 3 44‬‬
‫‪:‬‬ ‫س‬ ‫ةح ‪،‬‬ ‫سي‬ ‫أ‬
‫; ‪cout << x << " " << y‬‬

‫دم ‪y=5.8‬‬ ‫دذ‬ ‫دم ‪x=4‬‬ ‫د‬ ‫د‬ ‫د‬ ‫دم‬ ‫د ضد ي سد ي ي سغد د‬ ‫اس‬ ‫زز‬ ‫ا‬
‫‪:‬‬ ‫س‬ ‫ذ‬ ‫يس‬
‫‪4 5.8‬‬
‫د‬ ‫ما‬ ‫ةح‬ ‫ي س م‬ ‫س‬ ‫ذ‬ ‫م ض ا ‪،‬‬ ‫ص‬
‫ذ ‪:‬‬ ‫س م اا‬ ‫‪yousef anaya‬‬
‫‪yousef‬‬
‫‪anaya‬‬
‫‪:‬‬ ‫أ‬ ‫م‬ ‫س ما‬ ‫س‬
‫;"‪cout << "yousef‬‬
‫;"‪cout << "anaya‬‬

‫‪:‬‬ ‫سي‬ ‫ا‬ ‫س س م ا‬ ‫ا‬ ‫س‬


‫‪yousefanaya‬‬

‫ا‬ ‫ج‬ ‫حم‬ ‫ةح ‪،‬‬ ‫أ‬ ‫ا‬ ‫زز اس‬ ‫سا‬
‫دا ا د مد ف يد ذ د‬ ‫ة حد سد د دا صد‬ ‫ةح ‪،‬‬ ‫‪ ، 1,1‬ا‬
‫د س دا‬ ‫ذ د سد‬ ‫ا خم م‬ ‫حم‬ ‫ذ‬ ‫سا‬ ‫‪،‬‬
‫د‬ ‫د ‪ ،‬دا يدم د د‬ ‫ا ا ي د سد ي‬ ‫أ سي ا‬ ‫س س م ذ ا ا‬
‫سد م ا دا دا‬ ‫حم‬ ‫ذ‬ ‫"‪"\n‬‬ ‫ةح‬ ‫حم‬ ‫ي‬
‫‪:‬‬ ‫س‬ ‫ذ‪،‬ي‬
‫;"‪cout << "yousef \n anaya‬‬
‫‪:‬‬ ‫س م‬ ‫ذ‬ ‫س‬
‫‪yousef‬‬
‫‪anaya‬‬
‫‪:‬‬ ‫س م‬ ‫س‬ ‫ا‬ ‫غم‬ ‫سي‬
‫;"‪cout << "yousef\nanaya‬‬
‫ا مج ‪.‬‬ ‫ض‬ ‫ذ‬ ‫سي‬ ‫س س‬
‫س م ا ا د ‪ endl‬د خ صد س د ‪end line‬‬ ‫حم‬ ‫ا خم‬ ‫س‬
‫‪:‬‬ ‫س ما‬ ‫س م اا‪،‬‬
‫;"‪cout << "yousef"<<endl << "anaya‬‬
‫خ ص س ‪input output stream‬‬ ‫‪iostream.h‬‬ ‫ذ‬ ‫سا‬
‫اخم ‪.‬‬ ‫اي ا خ‬ ‫ص‬ ‫اي‬ ‫‪stream‬‬
‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػادطكػرضىػاضذاذةػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;"‪cout << "yousef anaya‬‬
‫‪6.‬‬ ‫;) ( ‪getch‬‬
‫‪7.‬‬ ‫}‬
‫ػ‬
‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػادطكػسيػدطرغنػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;"‪cout << "yousef \n anaya‬‬
‫‪6.‬‬ ‫;) ( ‪getch‬‬
‫‪7.‬‬ ‫}‬
‫ػ‬
‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػااردادػاضصحغحةػطنػ‪-1‬ػ‪11‬ػصلػرشمػرضىػدطرػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫)‪for (int i=1;i<=10;i++‬‬
‫‪6.‬‬ ‫;"‪cout << i << "\n‬‬
‫‪7.‬‬ ‫;) ( ‪getch‬‬
‫‪8.‬‬ ‫}‬

‫‪:‬‬ ‫س ا‬
‫;‪cout << i << endl‬‬

‫ا ة‬ ‫ة رة‬ ‫ة‬ ‫ج‬ ‫‪،‬‬ ‫أ ج‬ ‫فص‬ ‫ص‪:‬ا‬


‫‪.‬‬ ‫ئف‬ ‫ج فا‬
‫ة‬ ‫جة اظة ج ة ا ة‬ ‫أ‬ ‫ج‬ ‫ا‬
‫ة ‪ tab‬ة ظة‬ ‫ةف‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ظ أ‬ ‫ف‬ ‫ض ظص‬ ‫ظث‬
‫ة ف ‪tab‬‬ ‫ة ة‬ ‫ة ة‬ ‫ج ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ثا ف‬ ‫أ ج‬ ‫ف ح‪،‬‬
‫ضح ‪.‬‬ ‫ج‬
‫ر ظ اظ ‪.‬‬ ‫)( ‪getch‬‬ ‫‪conio.h‬‬
‫جطضةػاادخالػ‪ cin‬ػ‬
‫ساسد‬ ‫خد‬ ‫د‬ ‫دذ‬ ‫سد ما‬ ‫س‬ ‫س ما ‪،‬‬ ‫ا خ ‪ cin‬ا خ‬ ‫س ما‬
‫‪:‬‬ ‫خذ ة‬ ‫‪iostream.h‬‬ ‫م‬ ‫خ‬ ‫ذ‬ ‫مز‬
‫>> ‪cin‬‬
‫د سد ء‬ ‫ددا‬ ‫د‬ ‫د‬ ‫د ‪،‬‬ ‫ز‬ ‫د ح د س اص د م‬ ‫د‬ ‫د ا خد‬ ‫حد‬ ‫دداس‬ ‫ز ددز‬ ‫ا د‬
‫‪:‬‬ ‫س ما ‪ ،‬أ‬ ‫ما خ‬ ‫م‬
‫; ‪int x‬‬
‫; ‪cin >> x‬‬
‫‪:‬‬ ‫س ص‬ ‫م‬ ‫ا م‬ ‫خ‬ ‫سا‬
‫; ‪cin >> x >> y‬‬
‫طثالػاصتبػبرظاطجػادخالػاضرشمػاضعدديػاضصحغحػ‪5‬ػػ‪،‬ػثمػشمػبطبارتهػرضىػاضذاذةػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;‪int x‬‬
‫‪6.‬‬ ‫;‪cin >> x‬‬
‫‪7.‬‬ ‫;‪cout << x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫د د‬ ‫د دذ م د‬ ‫د يد سد‬ ‫دذ د‬ ‫سد‬ ‫د‬ ‫د‬ ‫دذ م د‬ ‫دا س‬ ‫زز‬ ‫ا‬


‫د‬ ‫دا ةد ا د د د‬ ‫‪،‬أ‬ ‫د ضد‬ ‫د أ‬ ‫د ا د‬ ‫د ‪ ،‬د‬ ‫دم‬ ‫اا ص‬
‫خم س ما‬ ‫أ حم‬ ‫م‬ ‫ما‪ ،‬ذ‬ ‫س‬ ‫‪ ،‬يا‬
‫ا م ا س‬ ‫م‬ ‫أ م‬ ‫ا‬ ‫س سم ي س‬ ‫سا‬ ‫ذ‬ ‫ا‬
‫د‬ ‫د‬ ‫س ا ذ م د دم س دز ‪ ،‬ي د دذ م ا س سد دا ي دم دذ‬ ‫اس‬ ‫ذم ج‬ ‫ز‬
‫‪:‬‬ ‫م‬ ‫ص‬ ‫‪،‬‬ ‫م‬ ‫ض‬ ‫ض‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;‪int x‬‬
‫‪6.‬‬ ‫" ‪cout << "Enter your Integer number :‬‬
‫‪7.‬‬ ‫;‪cin >> x‬‬
‫‪8.‬‬ ‫" ‪cout << "Enterane number is :‬‬
‫‪9.‬‬ ‫;‪cout << x‬‬
‫‪10.‬‬ ‫;) ( ‪getch‬‬
‫‪11.‬‬ ‫}‬

‫م ‪.‬‬ ‫س‬ ‫م ض‬ ‫ذ ص‬ ‫اس‬ ‫زز‬ ‫ا‬


‫د‬ ‫دم‬ ‫د‬ ‫دم‬ ‫خدم‬ ‫خد‬ ‫د‬ ‫د‬ ‫سد‬ ‫د‬ ‫يد‬ ‫د‬ ‫خ‬ ‫ا‬ ‫اا‬
‫‪:‬‬ ‫ح ح س ما ‪،‬‬
‫اضداضةػ) ( ‪gets‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪puts‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪getch‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪putch‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪getche‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪ getchar‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪putchar‬ػ‪:‬ػ ػ‬
‫ػ‬

‫اضداضةػ) ( ‪ getch‬ػ‬
‫د‬ ‫دذ ا د ا خدذ أ‬ ‫ة حد ‪ ،‬د‬ ‫س‬ ‫س ما‬ ‫ا‬ ‫م‬ ‫خ‬ ‫ذ ا‬
‫خ‬ ‫ذ ا‬ ‫‪ int‬أ‬ ‫ص‬ ‫ا‬ ‫م‬ ‫‪،‬‬ ‫س حم ا ا‬
‫د‬ ‫د دذ م دز دذ د خ د اسد‬ ‫د س د‬ ‫سد ما‬ ‫ايد ‪ ،‬د‬ ‫أ س زخص‬ ‫س‬ ‫م‬
‫‪ ،‬دذ ا د د خ صد س د‬ ‫دا صد‬ ‫دم د د‬ ‫د يد‬ ‫دذ‬ ‫د ا د‬ ‫أ ‪ ،‬د‬ ‫س‬
‫د‬ ‫يد‬ ‫د‬ ‫د‬ ‫‪ conio.h‬د‬ ‫خ‬ ‫م‬ ‫ص‬ ‫‪get character‬‬
‫سا ج ‪.‬‬ ‫م‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػرطزػطنػاضطدتخدمػثمػاطبدػطعاطضهػباادصيػ‪ .‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ػ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬ ‫ػ‬
‫‪4.‬‬ ‫{‬ ‫ػ‬
‫‪5.‬‬
‫ػ‬
‫‪6.‬‬ ‫" ‪cout << "Enter your code :‬‬
‫‪7.‬‬ ‫;) ( ‪int x = getch‬‬ ‫ػ‬
‫‪8.‬‬ ‫; ‪cout << "value in ascii : " << x‬‬ ‫ػ‬
‫‪9.‬‬ ‫;) ( ‪getch‬‬
‫‪10.‬‬ ‫}‬ ‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػطػتخصصػاظظطةػطعضوطاتػحادوبغةػطػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫دذ‬ ‫ة حد ‪،‬‬ ‫زس دا ي د سد م س د د‬ ‫زس س‬ ‫أ زس‬ ‫ا‬ ‫زز اس‬ ‫ا‬
‫دذ‬ ‫ةح‬ ‫س‬ ‫ا‬ ‫سا‬ ‫‪،‬‬ ‫اس‬ ‫ي زس‬
‫د‬ ‫دم خدم دا‬ ‫م خ‬ ‫م‬ ‫أ‬ ‫س‬ ‫ذ م‬ ‫ا‬ ‫‪،‬‬ ‫م‬ ‫ي‬ ‫س‬
‫د‬ ‫‪ ،‬د اد س‬ ‫ذ ا م د‬ ‫ا ا اخ‬ ‫مم‬ ‫زس س‬ ‫أ زس‬
‫اخ دم ‪،‬‬ ‫د‬ ‫دز ي‬ ‫د ة حد ‪ ،‬د سد ما‬ ‫مم د‬ ‫ذ ا س‬
‫س س ما ذ مف س حم ا ‪.‬‬
‫د‬ ‫د‬ ‫د‬ ‫د ا م دا‬ ‫د س م دز أ‬ ‫م د سد ا خد أ س دز‬ ‫سد ما‬
‫‪:‬‬ ‫مي‬ ‫ي‬ ‫م‬ ‫م ذ ما‬ ‫مف‬ ‫ي‬ ‫‪،‬ي‬ ‫اس‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ػ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫ػ‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬ ‫ػ‬
‫‪5.‬‬ ‫" ‪cout << "Enter your code :‬‬ ‫ػ‬
‫‪6.‬‬ ‫;) ( ‪char x = getch‬‬
‫‪7.‬‬ ‫; ‪cout << "value in ascii : " << x‬‬ ‫ػ‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬ ‫ػ‬
‫‪9.‬‬ ‫}‬
‫ػ‬
‫ػ‬
‫‪.‬‬ ‫اس‬ ‫ي‬ ‫س‬ ‫مز‬ ‫اخ‬ ‫م‬ ‫س‬

‫س ما ‪.‬‬ ‫م س ا خ س سم‬ ‫م‬ ‫ي‬ ‫س ما‬ ‫ذ ا‬ ‫ز‬ ‫اس ما‬

‫اصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػرشمػدريػطنػاضطدتخدمػبطولػ‪5‬ػحروفػثمػاطبعكاػرضىػاضذاذةػ‪ .‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫ػ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫ػ‪3.‬‬ ‫) ( ‪void main‬‬
‫ػ‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;]‪char password [5‬‬
‫ػ‪6.‬‬ ‫;" ‪cout << "Enter your password of five character :‬‬
‫ػ‪7.‬‬ ‫)‪for (int i=0;i<5;i++‬‬
‫‪8.‬‬ ‫;) ( ‪password [i]= getch‬‬
‫ػ‬
‫‪9.‬‬ ‫;" ‪cout << endl << "your password is :‬‬
‫ػ‬
‫‪10.‬‬ ‫)‪for (int i=0;i<5;i++‬‬
‫ػ‬
‫‪11.‬‬ ‫;]‪cout << password[i‬‬
‫‪12.‬‬
‫ػ‬
‫‪13.‬‬

‫د‬ ‫‪ ،‬ا د‬ ‫م‬ ‫ز‬ ‫س سم ا‬ ‫ا‬ ‫ة ا‬ ‫يذ‬ ‫م‬ ‫س‬ ‫ز ز اس‬ ‫ا‬
‫‪.‬‬ ‫اس‬ ‫مف ض‬
‫اضدضةػ) ( ‪putch‬‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫اضدضةػ) ( ‪getchar‬‬
‫صد‬ ‫دا‬ ‫دا د د د‬ ‫دذ‬ ‫د دم ‪،‬‬ ‫ا س ‪ ،‬ي ا خدذ أ‬ ‫ا م‬ ‫ذ ا‬ ‫ة‬
‫ةح ‪،‬‬ ‫م‬ ‫اخ‬ ‫م‬ ‫س ما‬ ‫ا‬ ‫م‬ ‫س ما ذ ا ا خ‬ ‫خ ‪،‬‬ ‫ا سز‬
‫خد‬ ‫د‬ ‫دم داخ أ د‬ ‫د‬ ‫د د مز د‬ ‫ةح‬ ‫م‬ ‫ا م‬ ‫خ‬ ‫ذ‬
‫د س دز ا خد ‪ enter‬د‬ ‫ا‬ ‫س زي‬ ‫ا‬ ‫ةح‬ ‫سس س ز ي م‬
‫سا ج ‪.‬‬ ‫‪ stdio.h‬ي‬ ‫خ‬ ‫ا ذ ا‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػادطكػبادتخدامػعذهػاضداضةػثمػاطبدػطعاطلػاوػحرفػضهػباادصي ػ‬
‫ػ‬
‫ػ ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫ػ‬
‫‪3.‬‬ ‫>‪#include <stdio.h‬‬ ‫ػ‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬ ‫ػ‬
‫‪6.‬‬ ‫;" ‪cout << "Enter your name :‬‬ ‫ػ‬
‫‪7.‬‬ ‫;) ( ‪char x= getchar‬‬ ‫ػ‬
‫‪8.‬‬ ‫;‪cout << "your first character in your name is : " << x‬‬
‫‪9.‬‬ ‫;) ( ‪getch‬‬ ‫ػ‬
‫‪10.‬‬ ‫}‬ ‫ػ‬
‫ػ‬
‫د‬ ‫دم‬ ‫د‬ ‫زس ا خد ‪ enter‬سد‬ ‫ا‬ ‫ةح‬ ‫س‬ ‫اس‬ ‫خ‬ ‫س‬
‫‪. int char‬‬ ‫ا‬ ‫ا‬ ‫ذ‬ ‫اس‬ ‫س‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫اضداضةػ) ( ‪getche‬‬
‫صد‬ ‫دا‬ ‫د‬ ‫ا‬ ‫‪،‬‬ ‫مس‬ ‫س ما ‪ ،‬ا خذ أ‬ ‫اي‬ ‫ذ اخ سز‬ ‫س ما‬
‫د س دم‬ ‫د‬ ‫د‬ ‫د‬ ‫د أ زس د‬ ‫د‬ ‫ا‬ ‫ذ ا‬ ‫ا ‪،‬‬ ‫س‬ ‫ز‬ ‫‪، int‬‬
‫‪. conio.h‬‬ ‫خ‬ ‫ةح ‪،‬‬ ‫حم‬
‫ػ‬
‫ػ‬
‫طثالػاصتبػبضغةػاضديػادخالػاضرشمػ‪5‬ػبادتخدامػعذهػاضداضةػثمػاطبدػطعاطضةػباادصيػ‪ .‬ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;" ‪cout << "Enter your value :‬‬
‫‪6.‬‬ ‫;) ( ‪int x= getche‬‬
‫‪7.‬‬ ‫;‪cout << endl << "value Equivalent : " << x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫ق‬ ‫ف‬ ‫ج‬ ‫ف‬ ‫شر‬ ‫اظ‬


‫‪.‬‬ ‫ا‬

‫تدرغبػ‪:‬ػػاصتبػبضغةػاضديػادخالػاضرشمػ‪5‬ػبادتخدامػعذهػاضداضةػثمػاطبعهػصرشمػرضىػاضذاذةػػ‪ .‬ػ‬
‫اضداضةػ) ( ‪putchar‬‬
‫مس‬ ‫ا ي‬ ‫خذ‬ ‫ذ‬ ‫ةح ‪،‬‬ ‫اي‬ ‫م‬ ‫ذ ا‬ ‫س ما‬
‫ذ ا ا س‬ ‫م ز اس‬ ‫ي‬ ‫مم‬ ‫ةح‬ ‫ا س‬ ‫‪ ،‬ذ‬ ‫ص‬ ‫ا‬
‫ا ذ ا ي‬ ‫‪،‬‬ ‫م اس‬ ‫ص‬ ‫ا‬ ‫ا ذ ا‬ ‫ةح ذ‬
‫‪stdio.h‬‬
‫‪:‬‬ ‫ص‬
‫)‪int putchar ( int x‬‬
‫‪.‬‬ ‫اس‬ ‫ةح‬ ‫س‬ ‫م‬ ‫مز‬ ‫‪:x‬‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػاظكارػاضرطزػ(ػ‪a‬ػ)ػرضىىػاضذاذىةػبادىتخدامػعىذهػاضداضىةػثىمػاطبىدػاضقغطىةػ‬
‫اضطصاسئةػضهػباادصيػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;) ‪int x= putchar ( 97‬‬
‫‪6.‬‬ ‫;‪cout << endl << "value Equivalent : " << x‬‬
‫‪7.‬‬ ‫;) ( ‪getch‬‬
‫‪8.‬‬ ‫}‬
‫‪9.‬‬

‫‪a‬ي‬ ‫م‬ ‫يئ‬ ‫ذ ا‬ ‫ص‬ ‫ا‬ ‫م م م ‪97‬‬ ‫زز اس‬ ‫ا‬


‫م‪.x‬‬ ‫‪97‬‬ ‫م‬ ‫اس‬
‫‪.‬‬ ‫اس‬ ‫م‬ ‫‪ cout‬س‬ ‫ةح‬ ‫س م ‪a‬‬ ‫ا )( ‪ putch‬س‬

‫تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػ‪،‬ػضتطوغرػبرظاطجػاضرشمػاضدريػاضدابقػ‪،‬ػبحغثػغظكرػظجطهػرظدػادخالػ‬
‫أيػرطزػطنػرطوزػاضبادوردػبادتخدامػاضداضةػ) ( ‪putchar‬ػ‪،‬ػثمػاطبدػاضرشمػاضدريػرضىػاضذاذةػ ػ‬
‫اضداضةػ) ( ‪ puts‬ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫طاػعيػاضداضهػ؟ ػ‬
‫خدم‬ ‫خد‬ ‫د‬ ‫سد ء‬ ‫د‬ ‫د‬ ‫د‬ ‫د‬ ‫مء‬ ‫م‬ ‫س‬ ‫ا‬
‫صد‬ ‫مد‬ ‫د‬ ‫زء‬ ‫أ‬ ‫م‬ ‫خذ ذ ا‬ ‫س‬
‫ي‬ ‫‪،‬‬ ‫م‬ ‫سخصي‬ ‫ء‬ ‫ا‬ ‫س‬ ‫س س‬ ‫س‬
‫‪.‬‬ ‫اا‬ ‫مج س ‪main‬‬ ‫‪،‬ي ا‬ ‫ء‬ ‫ا‬ ‫ذ ا‬ ‫‪.‬‬ ‫م‬

‫اعطغةػاضدوالػ‪ :‬ػ‬
‫ضضدوالػاعطغةػصبغرةػطظكاػ‪ :‬ػ‬
‫‪.‬‬ ‫ذم س ي‬ ‫سا ء ا‬ ‫ذ‬ ‫م‬ ‫خصس‬ ‫‪ .‬س ا‬
‫دا‬ ‫د دم‬ ‫ةد س "‬ ‫ا ح ‪،‬ي‬ ‫ا‬ ‫ذ‬ ‫م‬ ‫مسي خ‬ ‫‪ .‬اي‬
‫ة ء" ‪.‬‬ ‫سا‬ ‫ي‬
‫م‬ ‫خ ا ي‬ ‫ذ م‬ ‫يم‬ ‫م‬ ‫م‬ ‫س‬ ‫‪ .‬يم‬
‫مي ذ م ذ س ا ‪.‬‬ ‫ئ‬ ‫يذ‬
‫‪.‬‬ ‫سم‬ ‫ذ م‬ ‫م‬ ‫‪ .‬خصس‬
‫د‬ ‫دا‬ ‫دز ء أ‬ ‫د‬ ‫سد م د‬ ‫‪،‬أ‬ ‫ا‬ ‫ص‬ ‫مي م‬ ‫‪ .‬س‬
‫م‬ ‫اا‬ ‫ا‬ ‫ذ‬ ‫أ خ‬ ‫مص ا‬
‫ا‪.‬‬ ‫يم‬ ‫خم‬

‫اظواعػاضدوالػسيػضغةػاضديػبضسػبضسػ‪ :‬ػ‬
‫‪.‬‬ ‫مم س‬ ‫م ق‬ ‫خذ‬ ‫‪.‬‬
‫‪.‬‬ ‫س‬ ‫مم ا‬ ‫ا‬ ‫ا م ق‬ ‫ا خذ‬ ‫‪.‬‬
‫‪.‬‬ ‫مم ا س‬ ‫ا م ق‬ ‫خذ‬ ‫‪.‬‬
‫‪.‬‬ ‫س‬ ‫مم ا‬ ‫ا‬ ‫ا م ق‬ ‫ا خذ‬ ‫‪.‬‬

‫‪:‬‬ ‫ق‬ ‫ا‬


‫‪.‬‬ ‫خ‬ ‫س‬ ‫‪.‬‬
‫‪.‬‬ ‫م‬ ‫‪.‬‬

‫د خدذ د‬ ‫سد‬ ‫دم سد ا ج ي د ‪،‬‬ ‫د‬ ‫يد‬ ‫د سد‬ ‫د د ذد‬ ‫د‬ ‫د سد ا ء ا د‬ ‫د‬
‫‪.‬‬ ‫حم ذ ا‬ ‫س‬ ‫ا‬ ‫س‬ ‫ا‬

‫ة ق ة‬ ‫ثة‬ ‫ة‬ ‫ة‬ ‫ة ا‬ ‫ة ‪،‬‬ ‫ة شة‬ ‫ة قة‬ ‫ة‬ ‫ج‬ ‫اظ‬


‫ر ‪.‬‬ ‫ظ ش‬
‫ػ‬
‫ػ‬
‫ػ‬
‫صغفغهػبظاءػاضداضةػ‪ :‬ػ‬
‫مسد‬ ‫س مس ا " أ‬ ‫ا‬ ‫ح‬ ‫زز اس‬ ‫ا‬
‫د‬ ‫د د‬ ‫ا‬ ‫د‬ ‫دا‬ ‫‪،‬ي ا ءأ‬ ‫م‬ ‫س أ‬ ‫ا‬ ‫ذ س‬ ‫"‬
‫د‬ ‫د ا د سد م د‬ ‫ذ اد‬ ‫‪int , float , char …void‬‬ ‫ء‬ ‫ا‬ ‫ا‬ ‫س ا‬
‫د‬ ‫د‬ ‫د د‬ ‫د‬ ‫سد ا د‬ ‫م‬ ‫م‬ ‫ض أ س ا‬ ‫ء ا‬
‫ذ ‪:‬‬ ‫ح‬ ‫ي‬ ‫مس‬ ‫م اس‬ ‫أ‬ ‫س مس ذ ا‬

‫‪:‬‬ ‫ش‬ ‫ج‬ ‫ا‬ ‫ث‬

‫نوع القيمه المرجعه‬ ‫)……‪ , ………..,‬اسم المعامل الممر نوع المعامل ( اسم الداله ‪-‬‬

‫) ‪1. Type function_name ( Type parameter 1 , Type parameter 2 , ...‬‬


‫{ ‪2.‬‬
‫‪3.‬‬ ‫الجملة ; ‪……………………..‬‬
‫‪4.‬‬ ‫الجملة ; ‪……………………..‬‬
‫‪5.‬‬ ‫الجملة ; ‪……………………..‬‬
‫‪6.‬‬ ‫; ‪return value‬‬
‫} ‪7.‬‬

‫د‬ ‫د‬ ‫صم } {‬ ‫ص س خ‬ ‫س ا‬ ‫ف‬ ‫زز اس‬ ‫ا‬


‫د‬ ‫د‬ ‫د‬ ‫د د ا د صد‬ ‫د دا‬ ‫د‬ ‫د‬ ‫صد‬ ‫خ س ا‬
‫د خد ا د مج سد د‬ ‫ةدم‬ ‫ةدم ‪ ، if‬أ‬ ‫د‬ ‫ا س ‪ ... wihle for‬ذ‬ ‫ا‬ ‫خ‬
‫د‬ ‫د ا د ذ د اس د‬ ‫د س د يد‬ ‫د‬ ‫ا سد‬ ‫‪ ،‬د‬ ‫خ أ‬ ‫س‬
‫د‬ ‫اأ‬ ‫ا‬ ‫سا ج ذ ي‬ ‫ذ ي‬ ‫ء‬ ‫ا‬ ‫س س ا‬ ‫ا‬ ‫مز‬
‫دم ذ د‬ ‫ذ‬ ‫اذ ي‬ ‫أ ا‬ ‫ء‬ ‫ا‬ ‫ا‬ ‫ا‬
‫اس ا ء ‪.‬‬
‫طرقػادتخدامػاضداضةػسيػاضبرظاطجػ‪:‬ػ ػ‬
‫‪:‬‬ ‫ف ا‬ ‫ا‬ ‫‪.‬‬
‫‪.‬‬ ‫س‬ ‫ذ حم‬ ‫س ة‬ ‫ء ا‬ ‫ح‬ ‫‪main‬‬ ‫ا مج س‬ ‫ي‬ ‫ء ا‬
‫‪:‬‬
‫…………… ‪#include‬‬
‫…………… ‪#include‬‬
‫‪//------------------------------------------------------------------------B‬‬ ‫دد م دد‬ ‫ا دد ز ددز ددا س‬
‫م ض‬ ‫ء‬ ‫سيا‬
‫) ‪Type function_name ( Type parameter1 , Type parameter2 , ...‬‬ ‫دددد م دددد ‪ B‬دددد‬ ‫ددددم ي دددد‬
‫{‬ ‫د‬ ‫د ددا س د ا ء‬ ‫م ددف د‬
‫;………………‬
‫;………………‬
‫خد ا د‬ ‫ا مج س‬
‫;………………‬ ‫د‬ ‫مج سد سد ا ء ددذ ا د ذ د‬
‫;………………‬ ‫م دددم ددد ا م صددد ددد‬ ‫سددد‬
‫;………………‬ ‫دددم‬ ‫دد ا‬ ‫دددا‬ ‫دد‬ ‫دد‬
‫}‬
‫‪//------------------------------------------------------------------------A‬‬ ‫دا د ء سد ا د‬ ‫د ا‬ ‫س ا‬
‫)( ‪void main‬‬ ‫‪.B‬‬ ‫ي‬
‫{‬
‫;) ‪function_name ( parameter1 , parameter2 , ...‬‬
‫;‪……………….‬‬
‫;‪……………….‬‬
‫;‪……………….‬‬
‫}‬

‫ا ف ‪:‬‬ ‫ف‬ ‫ث‬


‫ا‬ ‫ا‬ ‫ذ‬ ‫مج س‬ ‫س س ا‬ ‫ء ا‬
‫مج س ‪.‬‬ ‫ا ا‬ ‫ء س ا‬ ‫مج س‬ ‫ا‬
‫…………… ‪1. #include‬‬
‫…………… ‪2. #include‬‬
‫د‬ ‫د‬ ‫دذ‬ ‫ي‬ ‫زز اس‬ ‫ا‬
‫) ‪3. Type function_name ( Type , Type , ...‬‬ ‫;‬ ‫مد ص د د‬ ‫ذ‬ ‫م ددف ا د د‬
‫‪//------------------------------------------------------------------------A‬‬ ‫د‬ ‫د‬ ‫د‬ ‫يد م د س د‬
‫)( ‪4. void main‬‬ ‫ددم‬ ‫د‬ ‫د‬ ‫ا د‬ ‫خد ا د‬
‫{ ‪5.‬‬ ‫د‬ ‫د د‬ ‫د‬ ‫د‬ ‫يد‬
‫‪6.‬‬ ‫;) ‪function_name (parameter1 , parameter2 , ...‬‬ ‫ا‬ ‫دددم د د‬ ‫دددم دددذ سد د‬
‫‪7.‬‬ ‫;‪……………….‬‬ ‫م دف‬ ‫ا د‬ ‫ص‬ ‫س‬
‫‪8.‬‬ ‫;‪……………….‬‬
‫‪9.‬‬ ‫;‪……………….‬‬
‫خ ‪.‬‬ ‫ذ ا‬
‫} ‪10.‬‬ ‫د‬ ‫د‬ ‫س‬ ‫ي‬ ‫م‬
‫‪//------------------------------------------------------------------------B‬‬ ‫مجسد ا د‬ ‫ء س ا س ا د‬
‫) ‪11. Type function_name ( Type parameter1 ,Type parameter2 , ...‬‬ ‫‪.B‬‬ ‫م‬
‫{ ‪12.‬‬
‫‪13.‬‬ ‫;………………‬
‫‪14.‬‬ ‫;………………‬
‫‪15.‬‬ ‫;………………‬
‫‪16.‬‬ ‫;………………‬
‫‪17.‬‬ ‫;………………‬
‫} ‪18.‬‬
‫‪:‬‬ ‫ق‬ ‫ف غ‬
‫‪ .1‬اضدوالػاضجاعزةػ‬
‫‪.‬‬ ‫مص‬ ‫سا‬ ‫ا‬ ‫س‬ ‫حم‬ ‫سا ج‬ ‫س س‬ ‫س‬ ‫خ م‬
‫‪:‬‬ ‫ج‬ ‫ث‬
‫‪pow‬‬ ‫ذ‬ ‫ز مص‬ ‫ا‬ ‫سا‬ ‫س س‬ ‫ما‬ ‫ا‬
‫‪:‬‬ ‫ا‬ ‫مي‬
‫‪pow ( 4‬‬ ‫‪,‬‬ ‫)‪2‬‬
‫ا‬ ‫س‬ ‫م‬ ‫‪،‬‬ ‫ا‬

‫ذ ا‬ ‫سا‬ ‫ذس أ س‬ ‫س‬ ‫ما‬ ‫) ‪ sqrt‬ي ا‬ ‫ذس م‬ ‫ز‬ ‫خم‬


‫‪:‬‬ ‫ذس‬ ‫س‬ ‫ما‬
‫( ‪sqrt‬‬ ‫) ‪4‬‬
‫ا‬ ‫س‬ ‫م‬

‫سا‬ ‫س‬ ‫س ما ا‬ ‫ا‬ ‫م‬ ‫ا‬ ‫ي‬ ‫ذ ا‬ ‫ا س‬


‫مص‪.‬‬ ‫ز‬ ‫اا‬ ‫م ض‬ ‫‪ math.h‬م ص‬
‫> ‪#include < math . h‬‬

‫ج ‪:‬‬ ‫ف‬ ‫جا‬ ‫ش‬ ‫‪.‬‬


‫ػأ‪ .‬داضةػاػتاخذػشغمػواػتعغدػأيػشغطةػ‪:‬‬

‫‪. name‬‬ ‫ف‬ ‫ج غ‬ ‫ث‬

‫د ‪ B‬د دء د‬ ‫ز دز دا س يد‬ ‫ا‬


‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫–‬ ‫م‬ ‫ةح‬ ‫اس‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫دد ز‬ ‫دد‬ ‫د د سدد ا د د‬ ‫دددا ضدد‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬
‫ددذ‬ ‫د اا د د‬ ‫‪ void‬د سد ما ددذ‬
‫‪4.‬‬ ‫) ( ‪void name‬‬
‫‪ ،‬دذ د د م دم‬ ‫م‬ ‫ا ا اأ‬
‫‪5.‬‬ ‫{‬
‫ا د ‪،‬‬ ‫ذ ا د اد‬ ‫ا‬ ‫أ‬
‫‪6.‬‬ ‫;"‪cout << "yousef anay‬‬
‫‪.‬‬ ‫ذ ا ا ا خذ أ‬
‫‪7.‬‬ ‫}‬
‫‪8.‬‬ ‫‪//------------------------------A‬‬
‫ددذ‬ ‫دد‬ ‫دد ز ددز ددا س‬ ‫دد‬ ‫دد‬
‫‪9.‬‬ ‫) ( ‪void main‬‬
‫خد د ا د د‬ ‫دد‬ ‫دد‬ ‫دددا د د‬ ‫م دد‬
‫‪10.‬‬ ‫{‬
‫م دد‬ ‫دد ا دد )( ‪ name‬دد دد‬ ‫مج سدد‬
‫‪11.‬‬ ‫;)( ‪name‬‬
‫د‬ ‫ذ اس‬ ‫ا‬ ‫ذ‬
‫‪12.‬‬ ‫;) ( ‪getch‬‬
‫د د د د ا د‬ ‫ددذ‬ ‫م د ‪ B‬د د‬
‫‪13.‬‬ ‫}‬
‫د‬ ‫د‬ ‫د‬ ‫د د‬ ‫دذ‬ ‫د‬ ‫مج س‬
‫دذ ا د‬ ‫د سد ما‬ ‫دم‬ ‫دم خد‬ ‫د اسد د ة حد د‬ ‫سد‬ ‫)( ‪ getch‬أ‬ ‫ا‬
‫‪.‬‬ ‫س‬ ‫ي‬ ‫سا ء ا‬ ‫ا‬ ‫يص‬ ‫ةح ‪،‬‬ ‫ز ا س‬
‫ق‪:‬‬ ‫ث‬ ‫ف‬ ‫خ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ا دد ز ددز ددا س دد دد دد دد دد ء ا دد‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫د‬ ‫م د )( ‪ name‬سد ا د مج سد ي دذ‬
‫‪3.‬‬ ‫;)( ‪void name‬‬ ‫د د‬ ‫ذ‬ ‫ذ ذ ا‬
‫‪4.‬‬ ‫‪//------------------------------A‬‬ ‫‪.‬‬ ‫ي م‬
‫‪5.‬‬ ‫) ( ‪void main‬‬ ‫ددذ‬ ‫دد د ز ددز ددا س‬ ‫د س ددا‬
‫‪6.‬‬ ‫{‬ ‫ددذ‬ ‫د سد‬ ‫ددا د ا د مج س د‬ ‫د‬
‫‪7.‬‬ ‫;)( ‪name‬‬ ‫د د ذ‬ ‫د يد د د‬ ‫د يد س د‬ ‫د‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬ ‫خ د‬ ‫م‬ ‫س‬ ‫ي م‬ ‫ا‬
‫‪9.‬‬ ‫}‬ ‫ذد‬ ‫م‬ ‫ا ‪ name‬غ م م ي ي‬
‫‪10.‬‬ ‫‪//------------------------------B‬‬ ‫م د‬ ‫دم‬ ‫د‬ ‫دذ د‬ ‫ا‬
‫‪11.‬‬ ‫) ( ‪void name‬‬ ‫د ددا د‬ ‫ددذ‬ ‫ددذ‬ ‫د د‬ ‫م د‬
‫‪12.‬‬ ‫{‬ ‫د صد‬ ‫د خ د سد‬ ‫د يد م د‬
‫‪13.‬‬ ‫;"‪cout << "yousef anay‬‬ ‫دددذ دددا دد‬ ‫دد‬ ‫دد دد م دد‬ ‫دد‬
‫‪14.‬‬ ‫}‬ ‫دددذ دددا د د خد د ا د د‬ ‫م دد س د د أ‬
‫د‬ ‫د خد‬ ‫م د ددا د‬ ‫مج سد‬
‫دا‬ ‫ا‬ ‫دذ م د‬ ‫د ي دا‬ ‫‪ name‬خد م‬ ‫ا‬ ‫ذ ا ي م ا‬ ‫ض‬ ‫ي‬
‫ا غ م مي ‪.‬‬ ‫خ‬ ‫ي‬

‫‪.1‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػادطكػرضىػاضذاذةػبادتخدامػداضةػادطكاػ ‪read‬ػثمػاطبدػطحتوغىاتػطىاػتىمػ‬
‫ادخاضهػبظفسػاضداضةػ‪ .‬ػ‬
‫ػ‬
‫‪.2‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػرشطغنػطنػاضطدتخدمػثمػاطبدػاضرشمػااصبرػبغظكمػبادتخدامػداضةػادىطكاػ‬
‫‪max‬ػ‪ .‬ػ‬
‫ػ‬
‫‪.3‬ػتدرغبػاصتبػبرظاطجػبضغىةػاضدىيػبضىسػبضىسػادخىالػ‪8‬ػ راطىاتػضطاضىبػثىمػادخىالػاادىمػوشىمػبحدىابػاضطعىدلػثىمػاطبىدػاادىمػ‬
‫واضطعدلػرضىػاضذاذةػ‪ .‬ػ‬
‫ػ‬
‫‪.4‬ػتىىدرغبػاصتىىبػبرظىىاطجػبضغىىةػاضدىىيػبضىىسػبضىىسػادخىىالػطصىىفوسهػطىىنػاضظىىوعػاضعىىدديػاضصىىحغحػطوضكىاػػ‪5‬ػارشىىامػغىىتمػادخاضكىىاػطىىنػ‬
‫اضطدتخدمػثمػشمػبطبارةػطجطوركاػرضىػاضذاذةػبادتخدامػداضةػسررغهػادطكاػ‪ sum‬ػ‬
‫ػ‬
‫‪.5‬ػ تدرغبػاصتبػبرظىاطجػبضغىةػاضدىيػبضىسػبضىسػادخىالػرشىمػرىدديػصىحغحػبداضىةػسررغىهػواعىربهػبظفدىهػرىددػطىنػاضطىراتػغىتمػ‬
‫تحدغدعاػبادخالػرشمػاخرػطنػاضظوعػاضعدديػاضصحغحػثمػاطبدػاضظاتجػرضىػاضذاذةػ‪ .‬ػ‬
‫ػ‬
‫‪.6‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضحدابػطعروبػرددػغتمػادخالػطنػاضطدتخدمػثمػاطبعهػرضىػاضذاذةػ‪ .‬ػ‬
‫ػ‬
‫‪.7‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػطعدلػطاضبػطنػاضظوعػاضحقغقيػثمػاطبدػتقدغرهػاذاػصانػاصبرػطنػ‪51‬ػغىتمػ‬
‫طبارةػظاجحػواذاػاشلػغتمػطبارةػرادبػ‪ .‬ػ‬
‫‪.8‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػأيػرطزػطنػاضطدتخدمػبطاضةػسررغهػثمػاطبدػطعاطضةػباادصيػصودػ‪ .‬ػ‬
‫ػ‬
‫‪.9‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػااردادػاضزوجغهػاضطحصورهػبىغنػ‪51‬ػطػ‪111‬ػبداضىةػسررغىةػبحغىثػغصىونػصىلػ‬
‫رشمػرضىػدطرػ‪ .‬ػ‬
‫ػ‬
‫‪.11‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػاارشامػاضتيػتقبلػاضقدىطهػرضىىػ‪5‬ػطىنػدونػبىاشيػاضطصىحورهػبىغنػ‪-29‬ػ‪81‬ػ‬
‫سيػداضةػسررغهػبحغثػغصونػصلػرشمػرضىػدطرػثمػشمػبعدعاػواطبدػرددعاػ‪ .‬ػ‬
‫ػ‬
‫‪.11‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػرشمػطنػاضطدتخدمػرنػطرغقػداضةػسررغةػثمػاطبدػاذاػصانػاضىرشمػسىرديػاوػ‬
‫زوجيػ‪ .‬ػ‬
‫ػ‬
‫‪.12‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػادطكػثمػشمػبفحصػصمػرىددػتصىرارػاضحىرفػ‪a‬ػسغىهػثىمػشىمػبطارتكىاػرضىىػ‬
‫اضذاذةػبادتخدامػداضةػسررغةػ‪ .‬ػ‬
‫ػ‬
‫‪.13‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػرشطغنػطنػاضظوعػاضعدديػاضصحغحػبداضةػسررغةػثمػشمػبتبدغلػشغطىةػصىلػ‬
‫طظكاػواطبدػاضظاتجػشبلػوبعدػاضتبدغلػ‪.‬‬
‫ب‪.‬ػداضةػتاخذػشغمػواػتعغدػأيػشغطةػ‪:‬ػ ػ‬
‫‪:‬‬ ‫ص‬
‫)……‪void function_name (type x, type y,‬‬
‫{‬

‫}‬

‫د ا‬ ‫ا د‬ ‫دم د‬ ‫د‬ ‫ذ ا د ‪ ،‬ا دا أ‬ ‫م‬ ‫ا‬ ‫خذ‬ ‫ا‬ ‫ذ‬


‫‪.‬‬ ‫ا‬ ‫ذ ا ا‬ ‫‪ void‬أ‬ ‫س س‬ ‫س‬ ‫س‬ ‫ز ي‬ ‫‪،‬‬ ‫اأ‬

‫ث ق‬ ‫ئ‬ ‫صح ح خ‬ ‫ق‬ ‫اخ‬ ‫ج غ‬ ‫ث‬


‫‪.‬‬ ‫ف‬ ‫ق‬ ‫شر‬ ‫ث‬ ‫ف‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫د‬ ‫د خد‬ ‫ا د ز ددز ددا س‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫د د ‪ x‬يد د ا د د‬ ‫دددم دددا صد د‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬ ‫د سد ا ء ا د ) ( ‪print‬‬ ‫مج س‬
‫‪4.‬‬ ‫)‪void print (int y‬‬ ‫دد‬ ‫دددم ‪ x‬دددذ ا دد‬ ‫دد مس دد‬
‫‪5.‬‬ ‫{‬ ‫د د د د م دددم د د ج د د د د خد د‬
‫‪6.‬‬ ‫)‪for (int i=1;i<=y;i++‬‬ ‫ا دد دد يدد م دد ‪ 15‬دد‬ ‫ا دد‬
‫‪7.‬‬ ‫;‪cout << y << endl‬‬ ‫ددددم‬ ‫ددددم‬ ‫ددددذ‬ ‫دد د‬ ‫سدد د‬
‫‪8.‬‬ ‫}‬ ‫دددذ‬ ‫د د ‪ y‬د د سد د‬ ‫ا دد‬ ‫خد د‬
‫‪9.‬‬ ‫‪//------------------------------A‬‬ ‫ذ ا‬ ‫مم مم‬
‫‪10.‬‬ ‫) ( ‪void main‬‬ ‫م خم خ ص ا‬ ‫سم‬ ‫مس‬
‫‪11.‬‬ ‫{‬ ‫ز ددز‬ ‫د‬ ‫ددم ا ددا‬ ‫د‬ ‫سد‬
‫‪12.‬‬ ‫;‪int x‬‬ ‫دم أ سد خدم‬ ‫ذ‬ ‫س‬ ‫اس‬
‫‪13.‬‬ ‫; " ‪cout << "Enter your number :‬‬ ‫د س سد‬ ‫س‬ ‫غم‪y‬‬
‫‪14.‬‬ ‫;‪cin >> x‬‬ ‫دددم ددد‬ ‫دددم ‪ ، x‬ذ ددد ا دددذ‬
‫‪15.‬‬ ‫;) ‪print ( x‬‬ ‫د يدا‬ ‫د‬ ‫سد‬ ‫مخص ا‬
‫‪16.‬‬ ‫;) ( ‪getch‬‬ ‫د‬ ‫خ دء‬ ‫د ذد ي ا د د‬ ‫د‬
‫‪17.‬‬ ‫}‬ ‫د‬ ‫خ ص ‪ ،‬دذ‬ ‫م‬ ‫ذ‬
‫دم‬ ‫س‬ ‫م‬ ‫مف‬
‫يذ‬ ‫م ا‬ ‫اا س‬ ‫ذ‬ ‫أ‬ ‫ص‬ ‫ا‬ ‫‪ y‬ذ اس‬
‫د د‬ ‫د‬ ‫سدم ي د ضد ‪ float‬دا ‪ int y‬د س د‬ ‫دا‬ ‫م ا د د د‬
‫د‬ ‫د‬ ‫دم د‬ ‫دا سد‬ ‫سيص‬ ‫ض يص‬ ‫ذ‬ ‫س‬ ‫مم م‬
‫س ‪.‬‬
‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػرشطغنػطنػاضطدتخدمػسىيػاضداضىةػاضرئغدىغةػثىمػشىمػبتطرغرعىاػاضىىػ‬
‫داضهػسررغةػضطبارةػاضرشمػااصبرػبغظكمػ‪ .‬ػ‬

‫د‬ ‫خد دم‬ ‫زز اس‬ ‫ا‬


‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫د يد‬ ‫د د‬ ‫س د ما د د مددز‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫د سد ا ء ا د‬ ‫ددم ‪ x,y‬د ددا ذ د‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬ ‫دم‬ ‫;) ‪ print_max ( x,y‬د م دم‬
‫‪4.‬‬ ‫) ‪void print_max (int x , int y‬‬ ‫دذ‬ ‫اخ د ي د ‪ ،‬د‬
‫‪5.‬‬ ‫{‬ ‫دد م دد ‪ B‬دد‬ ‫دد‬ ‫د د سد د‬
‫‪6.‬‬ ‫;‪cout << endl‬‬ ‫دددم ‪ x,y‬م ددد أ‬ ‫مز ددد يددد‬
‫‪7.‬‬ ‫) ‪if (x>y‬‬ ‫خ ا مج س سد‬ ‫م‬
‫‪8.‬‬ ‫;‪cout << "The max is : " << x‬‬ ‫يد‬ ‫م‬ ‫خ ا‬ ‫س‬
‫‪9.‬‬ ‫‪else‬‬ ‫مم‬ ‫مم س‬ ‫‪ B‬ذ‬ ‫م‬
‫‪10.‬‬ ‫; ‪cout << "The max is : " << y‬‬ ‫دم‬ ‫دم يد‬ ‫ي سخ‬ ‫ا‬
‫‪11.‬‬ ‫}‬ ‫مم‪.‬‬ ‫ا‬ ‫ا‬
‫‪12.‬‬ ‫‪//------------------------------A‬‬ ‫د يد‬ ‫د م د ي د د‬ ‫د د‬
‫‪13.‬‬ ‫) ( ‪void main‬‬ ‫‪.‬‬
‫‪14.‬‬ ‫{‬
‫‪15.‬‬ ‫;‪int x,y‬‬
‫‪16.‬‬ ‫; " ‪cout << "Enter first number :‬‬
‫‪17.‬‬ ‫;‪cin >> x‬‬
‫‪18.‬‬ ‫; " ‪cout << "Enter secand number :‬‬
‫‪19.‬‬ ‫;‪cin >> y‬‬
‫‪20.‬‬
‫‪21.‬‬ ‫;) ‪print_max ( x,y‬‬
‫‪22.‬‬ ‫;) ( ‪getch‬‬
‫‪23.‬‬ ‫}‬

‫ث‬ ‫ئ‬ ‫ف‬ ‫ظ‬ ‫ا‬ ‫اخ‬ ‫ج غ‬ ‫‪:‬‬


‫ف‬ ‫ف‬ ‫ج‬ ‫‪ sum_avg‬ث ح‬ ‫ف‬
‫ضح ‪.‬‬ ‫ج‬ ‫شر‬

‫صح ح ش‬ ‫ق‬ ‫اخ‬ ‫ج غ‬


‫ف‬ ‫ث‬ ‫ا‬ ‫خ‬ ‫خ غ‬ ‫ث‬ ‫ا‬
‫‪.‬‬ ‫حص‬ ‫ا‬ ‫ق أ ج‬ ‫ا‬ ‫‪rang‬‬

‫ث ق‬ ‫ئ‬ ‫صح ح ف‬ ‫ق‬ ‫اخ‬ ‫ج غ‬


‫ث‬ ‫ف‬ ‫شر ث‬ ‫ف‬
‫‪ x=10 y=5‬ث‬ ‫‪ y=10 x=5‬ق‬ ‫أ‬ ‫غ‬ ‫خ‬ ‫‪swap‬‬
‫‪.‬‬ ‫شر ف‬ ‫ج‬
‫اخ ‪.‬‬ ‫غ‬ ‫ث‬ ‫ف ث‬ ‫ا‬ ‫غ‬ ‫ق‬ ‫حف‬ ‫خ‬ ‫ف‬ ‫غ‬ ‫اظ‬
‫ج‪.‬ػداضةػاػتاخذػشغمػوتعغدػشغطةػ‪ :‬ػ‬

‫طثالػ‪:‬ػاصتبػبرظاطجػبادتخدامػاضديػبضسػبضسػادخالػرشمػطنػاضطدتخدمػطنػاضظوعػاضعدديػاضصحغحػسيػداضةػ‬
‫سررغةػثمػشمػبحدابػتصعغبهػثمػارجدػاضقغطهػاضطربعهػواطبعكاػسيػاضداضةػاضرئغدغةػ‪ .‬ػ‬
‫ػ‬
‫‪18.‬‬ ‫>‪#include <iostream.h‬‬ ‫ػ‬
‫‪19.‬‬ ‫>‪#include <conio.h‬‬ ‫ز ز ا س د د د د ضد‬ ‫ا‬
‫‪20.‬‬ ‫‪//------------------------------B‬‬ ‫د س ‪ return‬خددم ا د د‬ ‫د‬
‫‪21.‬‬ ‫) ( ‪int cube‬‬ ‫ا‬ ‫اس‬ ‫س ما ذ‬
‫‪22.‬‬ ‫{‬ ‫د‬ ‫د ‪ x*x*x‬د‬ ‫ض‬ ‫ا‬
‫‪23.‬‬ ‫;‪int x‬‬ ‫دداخ ‪ ،‬دد س ددا دد‬ ‫دد ددم‬
‫‪24.‬‬ ‫;‪cout << "Enter your number : " << x‬‬ ‫دددا دد دد دد‬ ‫دددذ ا دد‬ ‫دد‬
‫‪25.‬‬ ‫;‪return x*x*x‬‬ ‫ددا د‬ ‫د‬ ‫ي ددذ‬ ‫صد‬ ‫ددا‬
‫‪26.‬‬ ‫}‬ ‫د سد‬ ‫د د ضد‬ ‫د م د‬
‫‪27.‬‬ ‫‪//------------------------------A‬‬ ‫‪،‬أ‬ ‫ا دد ددا ج دد ا د م دد‬
‫‪28.‬‬ ‫) ( ‪void main‬‬ ‫دددا‬ ‫دددا د د د د د د‬ ‫دددذ ا د د‬
‫‪29.‬‬ ‫{‬ ‫دددذ ا د د ا خدددذ أ‬ ‫‪، int‬‬ ‫صد د‬
‫‪30.‬‬ ‫;) ( ‪cout << cube‬‬ ‫ددد ددد ا ددد‬ ‫ددد أ‬ ‫ددد ي ددد‬
‫‪31.‬‬ ‫;) ( ‪getch‬‬ ‫دد ي دد‬ ‫دد سدد‬ ‫ا دد ‪ ،‬دد‬
‫‪32.‬‬ ‫}‬ ‫د‬ ‫خ س ا‬ ‫مز‬
‫حم خد ا د مج سد ا د م د‬
‫‪.‬‬ ‫س‬

‫ػ‬
‫‪ fact‬ح‬ ‫ف‬ ‫ق ف‬ ‫اخ‬ ‫ج غ‬
‫ق‬ ‫ث‬ ‫خ‬ ‫خ‬ ‫خ‬ ‫ق‬ ‫ش‬
‫ضح ‪.‬‬ ‫ج‬ ‫ئ‬

‫ػادخالػطصفوسهػطنػ‪5‬ػرظاصرػطنػاضظوعػاضعدديػاضصحغحػسيػداضةػسررغةػ‬ ‫ج غ‬
‫ثمػشمػبحدابػطجطوركاػوارجدػاضقغطةػاضىػاضداضةػاضرئغدغةػضطبارتكاػطدػجطلػتوعغحغةػ‪ .‬ػ‬
‫ػ‬
‫ػادخالػطصفوسهػثظائغةػاضبعدػسيػداضةػسررغةػرددػرظاصرعاػ‪4‬ػثمػشمػ‬ ‫ج غ‬
‫بحدابػطجطوعػاضقطرػوشمػبارجارهػرضىػاضداضةػاضرئغدغةػضطبارتةػ‪ .‬ػ‬
‫ػ‬
‫ػادخالػرشطغنػطنػاضطدتخدمػسيػداضةػسررغهػثمػشمػبعدػاارشامػ‬ ‫ج غ‬
‫اضفردغةػاضطحصورهػبغظكمػبذرطػانػغصونػااولػاصبرػطنػاضثاظيػوزغرػذضكػاردػادخالػااولػثمػرددػاارشامػ‬
‫اضفردغةػاضىػاضداضةػاضرئغدغةػضطبارتةػطدػجطلػتوعغحغةػ‪ .‬ػ‬
‫د‪.‬ػداضةػتاخذػشغمػوتعغدػشغطةػ‪ :‬ػ‬
‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػادخالػرشطغنػطنػاضطدتخدمػسيػاضداضةػاضرئغدغةػثمػشمػبتطرغرػاضرشطغنػ‬
‫اضىػداضةػسررغةػضحدابػطجطوركطاػثمػارجدػاضطجطوعػاضىػاضداضةػاضرئغدغةػوشمػبطبارتةػ‪ .‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ػ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫ػ‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬
‫‪4.‬‬ ‫) ‪int sum (int x , int y‬‬ ‫ػ‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫;‪return x+y‬‬
‫‪7.‬‬ ‫}‬
‫‪8.‬‬ ‫‪//------------------------------A‬‬
‫‪9.‬‬ ‫) ( ‪void main‬‬
‫‪10.‬‬ ‫{‬
‫‪11.‬‬ ‫;‪int x,y‬‬
‫‪12.‬‬ ‫;" ‪cout << "Enter your first number :‬‬
‫‪13.‬‬ ‫;‪cin >> x‬‬
‫‪14.‬‬ ‫;"‪cout << "Enter your secand number :‬‬
‫‪15.‬‬ ‫;‪cin >> y‬‬
‫‪16.‬‬ ‫;) ‪cout << "The sum is : " << sum (x,y‬‬
‫‪17.‬‬ ‫;) ( ‪getch‬‬
‫‪18.‬‬ ‫}‬

‫ج غ‬
‫ػ‬
‫ػ‬
‫ص‬ ‫‪5‬‬ ‫صح ح‬ ‫صف ف‬ ‫ج غ‬ ‫طثال‬
‫‪{5,8,2,0,9} :‬ػطررعاػرضىػداضةػسررغةػضحدابػطجطوعػرظاصرعاػثمػاطبعةػباضداضةػاضفررغةػ‪ .‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫د‬ ‫مف ص ي‬ ‫زز اس‬ ‫ا‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫دد‬ ‫دد ددا ذ دد‬ ‫سدد يدد م دد س س دد‬ ‫يدد‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬
‫دد د ‪ add‬دد د م ددددم سدد د‬ ‫دد د‬ ‫سدد د ا ء دد د‬
‫‪4.‬‬ ‫) ]‪void add (int x [5‬‬
‫د‬ ‫د ددا‬ ‫ددذ ددمس ص د ي‬ ‫صد ي‬
‫‪5.‬‬ ‫{‬
‫د مددز يد ددذ اسد‬ ‫ددمس سد صد ي ي د‬
‫‪6.‬‬ ‫;‪int sum=0‬‬
‫د‬ ‫ذ‬ ‫س‬ ‫ي ‪،‬‬
‫‪7.‬‬ ‫)‪for (int i=0;i<5;i++‬‬
‫د م د ‪ B‬د س دا د‬ ‫ي ا ا د‬
‫‪8.‬‬ ‫;]‪sum += x[i‬‬
‫د‬ ‫دم د‬ ‫صد ي‬ ‫ا س‬
‫‪9.‬‬ ‫;‪cout << "The sum is : " << sum‬‬
‫د دا‬ ‫سد‬ ‫س ص ي ذ‬
‫‪10.‬‬ ‫}‬
‫د‬ ‫م د‬ ‫ص د ي ددذ ]‪ ، int x [5‬د‬ ‫د‬
‫‪11.‬‬ ‫‪//------------------------------A‬‬
‫حم س ‪.‬‬
‫‪12.‬‬ ‫) ( ‪void main‬‬
‫‪13.‬‬ ‫{‬
‫‪14.‬‬ ‫;}‪int x [5]= {5,8,2,0,9‬‬
‫‪15.‬‬ ‫;)‪add (x‬‬
‫‪16.‬‬ ‫;) ( ‪getch‬‬
‫‪17.‬‬ ‫}‬
‫ة ة‬ ‫ة ثة قة‬ ‫ة‬ ‫ة‬ ‫صةف ف‬ ‫ة‬ ‫ة‬ ‫ج غ‬ ‫ج ‪:‬‬ ‫ث‬
‫ا‬ ‫اصغ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫دد يد د‬ ‫ا دد دددا م دددم صدد ي د د أ‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫دس صد ي أ‬ ‫م ذ‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬ ‫دذ سد‬ ‫د‬ ‫دس‬ ‫مم د د د م‬
‫‪4.‬‬ ‫) ]‪void swap (int x [5‬‬ ‫حم ا ‪.‬‬
‫‪5.‬‬ ‫{‬ ‫ص د ي اص د‬ ‫د د م د‬ ‫د ي د ددذ‬
‫‪6.‬‬ ‫;]‪int temp =x[0‬‬ ‫دددا د د‬ ‫خد د ا د د مج سد د أ‬ ‫دد‬
‫‪7.‬‬ ‫)‪for (int i=0;i<5;i++‬‬ ‫ا اص ‪.‬‬
‫‪8.‬‬ ‫)‪for (int j=i+1;j<4;j++‬‬
‫‪9.‬‬ ‫{‬
‫‪10.‬‬ ‫) ]‪if (x[j] < x[i‬‬
‫‪11.‬‬ ‫{‬
‫‪12.‬‬ ‫;]‪temp=x[j‬‬
‫‪13.‬‬ ‫;]‪x[j]=x[i‬‬ ‫ػ‬
‫‪14.‬‬ ‫;‪x[i]=temp‬‬
‫‪15.‬‬ ‫}‬ ‫ػ‬
‫‪16.‬‬ ‫}‬ ‫ػ‬
‫‪17.‬‬ ‫}‬
‫‪18.‬‬ ‫‪//------------------------------A‬‬ ‫ػ‬
‫‪19.‬‬ ‫) ( ‪void main‬‬
‫‪20.‬‬ ‫{‬
‫ػ‬
‫‪21.‬‬ ‫;}‪int x [5]= {5,8,2,0,9‬‬ ‫ػ‬
‫‪22.‬‬ ‫;)‪swap (x‬‬
‫‪23.‬‬ ‫;) ( ‪getch‬‬ ‫ػ‬
‫‪24.‬‬ ‫}‬ ‫ػ‬
‫ػ‬
‫تدرغبػشمػبتطوغرػاضطثالػاضدابقػضتطرغرػاضطصفوسةػرضىػداضةػسررغةػضطابعتكاػشبلػوبعدػ‬
‫اضترتغب‪ .‬ػ‬
‫ػ‬
‫تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضظفسػاضطثالػاضدابقػحغثػشمػبتطرغرػاضطصفوسهػرضىػ‬
‫داضةػسررغةػثمػشمػباغجادػاضرشمػااصبرػسغكاػثمػشمػبارجارهػاضىػاضداضةػاضفررغةػثمػاطبعهػرضىػ‬
‫اضذاذةػطدػجطلػتوعغحغةػ‪ .‬ػ‬
‫ػ‬
‫ػ‬
‫خد سد ا د د‬ ‫د‬ ‫د‬ ‫د‬ ‫د‬ ‫د‬ ‫د‬ ‫سد ا ء سد‬ ‫س ما‬
‫دم‬ ‫دم سد‬ ‫دم‬ ‫داي مد د د‬ ‫م‬ ‫ا ا ا خذ ا ي م‬ ‫س‬ ‫سا ء ا‬
‫دم‬ ‫س‬ ‫س‬ ‫ا‪،‬أ‬ ‫م م‬ ‫م ي س ي‬ ‫مس س م‬ ‫س‬
‫‪.‬‬ ‫م‬ ‫ص‬ ‫ذ‬ ‫م ذ س‬ ‫م‬ ‫م ذ س‬ ‫م م‬ ‫اي‬ ‫م‬
‫ػ‬
‫طثالػاصتبػبرظاطجػبغضةػاضديػبضسػبضسػضطبارةػااردادػطنػالػ‪111‬ػطػ‪51‬ػبفصرةػاادتدراءػاضذاتيػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ء د خدذ‬ ‫‪B‬‬ ‫م‬ ‫زز اس ي‬ ‫ا‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫د‬ ‫ض حم‬ ‫ص‬ ‫ا‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬ ‫د‬ ‫د‬ ‫‪ 5‬يد ذ د ةدم د‬ ‫م ‪ x‬دم سد‬
‫‪4.‬‬ ‫) ‪void print (int x‬‬ ‫دم خدم‬ ‫د سد ا ء ا د‬ ‫م ‪ x‬د يد م د س د‬
‫‪5.‬‬ ‫{‬ ‫خد دس‬ ‫س ا ء ا م خم‬ ‫‪ x-1‬ي‬
‫‪6.‬‬ ‫)‪if (x>=50‬‬ ‫د ةدم‬ ‫د ا دا د ‪ x-1‬ي د‬ ‫ا‬ ‫ا‬
‫‪7.‬‬ ‫{‬ ‫د ا دا‬ ‫دس ا د دم خدم‬ ‫د ‪ x-1‬د سد ا‬ ‫ي‬
‫‪8.‬‬ ‫;‪cout << x << endl‬‬ ‫د د ‪5‬‬ ‫د ‪x‬‬ ‫د سد م د صد د‬ ‫د ددذ‬
‫‪9.‬‬ ‫;)‪print (x-1‬‬ ‫ددذ‬ ‫د‬ ‫ددذ‬ ‫د اس د ا ء ددذ‬ ‫د‬ ‫ي مددم م د‬
‫‪10.‬‬ ‫}‬ ‫سا ‪.‬‬ ‫ا ا‬ ‫خ ا مج س‬
‫‪11.‬‬ ‫}‬
‫‪12.‬‬ ‫‪//------------------------------A‬‬
‫‪13.‬‬ ‫) ( ‪void main‬‬
‫‪14.‬‬ ‫{‬
‫‪15.‬‬ ‫;)‪print (100‬‬
‫‪16.‬‬ ‫;) ( ‪getch‬‬
‫‪17.‬‬ ‫}‬
‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػبفصرهػاادتدراءػاضذاتيػضتطرغرػرشمػرضىػداضةػسررغةػبحغثػغتمػ‬
‫ادخاضهػطنػاضطدتخدمػسيػاضداضةػاضرئغدغةػوعوػطنػاضظوعػاضعدديػاضصحغحػوذضكػضحدابػطعروبهػ‪ .‬ػ‬
‫ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬
‫‪4.‬‬ ‫) ‪int multiplic (int x‬‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫)‪if (x==0‬‬
‫‪7.‬‬ ‫;‪return 1‬‬
‫‪8.‬‬ ‫‪else‬‬
‫‪9.‬‬ ‫;)‪return x*=multiplic (x-1‬‬
‫‪10.‬‬ ‫}‬
‫‪11.‬‬ ‫‪//------------------------------A‬‬
‫‪12.‬‬ ‫) ( ‪void main‬‬
‫‪13.‬‬ ‫{‬
‫‪14.‬‬ ‫;‪int x‬‬
‫‪15.‬‬ ‫;"‪cout << "Enter your number :‬‬
‫‪16.‬‬ ‫;‪cin >> x‬‬
‫‪17.‬‬ ‫;)‪multiplic (x‬‬
‫‪18.‬‬ ‫;) ( ‪getch‬‬
‫‪19.‬‬ ‫}‬

‫ػ‬
‫تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػااردادػاضزوجغةػاضطحصورهػبغنػ‪111-1‬ػسصرهػاادتدراءػاضذاتيػ‬
‫صلػرشمػرضىػدطرػ‪ .‬ػ‬
‫ػ‬
‫تدرغبػ‪:‬ػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػبادتخدامػسصرهػاادتدراءػاضذاتيػادخالػرشمػطنػاضطدتخدمػثمػطررػ‬
‫عذاػاضرشمػرضىػداضةػضطبارتهػرددػطراتػشغطتةػ‪ .‬ػ‬
‫ػ‬
‫تدرغبػاصتبػبرظاطجػبفصرهػاادتدراءػاضذاتيػضحدابػطجطوعػاارشامػبغنػ‪11-1‬ػثمػاطبدػاضظاتجػسيػاضداضةػ‬
‫اضرئغدغةػ‪ .‬ػ‬
‫ػ‬
‫تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػاارشامػاضفردغةػبغنػ‪11-1‬ػبفصرهػاادتدراءػاضذاتيػ ػ‬
‫‪:‬‬ ‫ص‬ ‫س‬ ‫خ‬ ‫ا‬ ‫ا‬ ‫ذ‬
‫; ‪(x>y)? 7 : 10‬‬
‫مجس‬ ‫ا‬ ‫ذ‬ ‫اس‬ ‫ا ا‬ ‫‪y‬ي‬ ‫م‬ ‫‪x‬‬ ‫ذ‬ ‫سم‬
‫ةم ا ‪.‬‬ ‫ذ‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػاخالػرشطغنػطنػاضطدتخدمػثمػاطبدػاضرشمػااصبرػبغظكمػبفصرهػ‬
‫اضطعاطلػاضذرطيػاضثاثيػ‪ :‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫ػ‬
‫‪3.‬‬ ‫‪//------------------------------A‬‬ ‫ػ‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬ ‫ػ‬
‫‪6.‬‬ ‫;‪int x,y‬‬ ‫ػ‬
‫‪7.‬‬ ‫;"‪cout << "Enter your number :‬‬
‫ػ‬
‫‪8.‬‬ ‫;‪cin >> x‬‬
‫‪9.‬‬ ‫; " ‪cout << "Enter your secand number :‬‬ ‫ػ‬
‫‪10.‬‬ ‫;‪cin >> y‬‬ ‫ػ‬
‫‪11.‬‬ ‫;‪int max=(x>y)? x : y‬‬
‫‪12.‬‬ ‫; ‪cout << "The max is : " << max‬‬ ‫ػ‬
‫‪13.‬‬ ‫;) ( ‪getch‬‬ ‫ػ‬
‫‪14.‬‬ ‫}‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ ػ‬:‫ظفسػاضطثالػبادتخدامػداضةػسررغةػ‬
‫ػ‬
1. #include <iostream.h> ‫ػ‬
2. #include <conio.h> ‫ػ‬
3. //---------------------------- B
4. int max (int x,int y) ‫ػ‬
5. { ‫ػ‬
6. return (x>y)? x : y;
‫ػ‬
7. }
8. //------------------------------A ‫ػ‬
9. void main ( ) ‫ػ‬
10. {
11. int x,y; ‫ػ‬
12. cout << "Enter your number :"; ‫ػ‬
13. cin >> x;
‫ػ‬
14. cout << "Enter your secand number : " ;
15. cin >> y; ‫ػ‬
16. cout << "The max is : " << max (x,y) ; ‫ػ‬
17. getch ( );
18. } ‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫‪ ،‬أ دا‬ ‫د‬ ‫م د د‬ ‫د أد‬ ‫د‬ ‫‪ ،‬د‬ ‫صف ح ء‬ ‫م‬ ‫س‬ ‫اضترصغب‬
‫دا ‪،‬‬ ‫د‬ ‫ي‬ ‫م ‪،‬‬ ‫‪ ،‬غم‬ ‫ز‬ ‫ساس م ز‬ ‫م‬ ‫أ‬ ‫أ‬ ‫ص‬
‫ة حة‬ ‫صةف ف‬ ‫ة‬ ‫دم ‪ ،‬ة‬ ‫دم د د‬ ‫د أ‬ ‫س‬ ‫م‬ ‫أ‬
‫س س س‪.‬‬ ‫س‬ ‫م ي م‬ ‫م‬ ‫‪ ،‬ذ‬ ‫ف‬ ‫ص‬
‫ذ د‬ ‫ذ‬ ‫ف‪،‬ي فس‬ ‫أ‬ ‫س‬ ‫ص م‬ ‫أس‬ ‫زز اس‬ ‫م‬
‫دذ‬ ‫د‬ ‫مدز‬ ‫د أ سد ما صد ي‬ ‫ة ظجة غ ة ‪ ،‬ي د صد‬ ‫صة‬ ‫رة‬ ‫(‬
‫أ دم ‪ ،‬د‬ ‫د دذ‬ ‫م‬ ‫ء‬ ‫‪،‬‬ ‫م‬ ‫أ‬ ‫أ‬ ‫ص ي ا‬ ‫‪،‬ا‬
‫د ‪ :‬سد م‬ ‫دذ صد ف أ دم د خ صد‬ ‫دف د " ةد " د ا د‬ ‫ا صف د د‬ ‫أخذ ا‬
‫‪ ،‬د‬ ‫سد‬ ‫د‬ ‫" خد م‬ ‫د دذ صد ف " ةد‬ ‫دف سد‬ ‫ذ ‪ ،‬ي ذ سد‬ ‫اس‬
‫‪،‬ي ذ‬ ‫صفح‬ ‫ا‬ ‫ا ي‬ ‫م‪ ،‬ذ‬ ‫م‬ ‫م اس‬ ‫سم‬ ‫س م‬
‫دذ د د‬ ‫‪،‬‬ ‫ذ صف‬ ‫اا‬ ‫م‬ ‫مف‬ ‫س صف‪ ،‬س‬ ‫ةم أ‬ ‫ا‬
‫د‬ ‫س د‬ ‫ا‬ ‫ا ا ‪،‬‬ ‫م‬ ‫‪ ،‬ا سص‬ ‫ف خم ‪ ،‬أ ا‬ ‫ا‬
‫د د سد‬ ‫د ‪ ،‬د يدم‬ ‫د احد اسد ما يد م‬ ‫م د ا صد ا د حد‬ ‫‪ ،‬ذ ذ‬ ‫ص‬
‫د صد‬ ‫د‬ ‫دم يد دذ‬ ‫م‬ ‫س‬ ‫‪،‬‬ ‫م‬ ‫ء م‬ ‫م م‬ ‫س س سي‬
‫ج " ة "‪.‬‬ ‫م‬ ‫م‬

‫دا ‪،‬‬ ‫د‬ ‫م ص ة ء س يد‬ ‫مص ج‬ ‫ج ‪،‬‬ ‫س‬ ‫ح ء خ م‬ ‫أ‬


‫د د‬ ‫غم د ‪ ،‬دج‬ ‫ساسد م ز د ا دا صد‬ ‫م‬ ‫ذ ج‬ ‫أ‬
‫د‬ ‫د‬ ‫د‬ ‫خص جص‬ ‫ج‬ ‫س‬ ‫خص ج ي س س ا‬ ‫ح ء‬ ‫زز اس‬
‫صد ‪ .....‬دخ ‪ ،‬د‬ ‫ةدم‬ ‫سد‬ ‫خص جص سم‬ ‫ج‬ ‫س‬ ‫س‬ ‫يخم ‪،‬‬
‫د د ‪ :‬اسد‬ ‫د س د د ج ‪ ،‬ا د خصد ج‬ ‫ة‬ ‫ف‬ ‫مص‬ ‫ي م‬
‫د‬ ‫د د د دا‬ ‫دذ‬ ‫ةد‬ ‫د د‬ ‫ةد م يد‬ ‫دذ مصد ج‬ ‫‪،‬‬ ‫غم‬ ‫سم‬
‫س م ‪.‬‬ ‫خم س‬

‫اضفرقػبغنػاضبرطجةػاإجرائغةػواضبرطجةػاضذغئغةػ"ػاضصغظوظغة" ػ‬
‫ػ‬
‫ذ ‪:‬‬ ‫صفح‬ ‫س‬ ‫إ مج‬ ‫م‬ ‫س ما‬ ‫م‬ ‫اس‬ ‫زز‬

‫>‪1. #include <iostream.h‬‬


‫>‪2. #include <conio.h‬‬
‫) ( ‪3. void main‬‬
‫{ ‪4.‬‬
‫;] ‪5. char shampo_name [ 20‬‬
‫; ‪6. float shamop_price‬‬
‫;]‪7. char shampo_size [20‬‬
‫;) ( ‪8. getch‬‬
‫} ‪9.‬‬
‫س سد‬ ‫د د د د‬ ‫د‬ ‫دم‬ ‫د‬ ‫د‬ ‫صد ف حد‬ ‫ا‬ ‫زز اس‬ ‫ا‬
‫دم‬ ‫سد‬ ‫ز يد ذ دم‬ ‫يسد‬ ‫د ةد‬ ‫خدم‬ ‫مف‬ ‫‪،‬ي س‬ ‫ا‬ ‫اخم‬ ‫مز‬
‫م دذ صد ف‬ ‫يم‬ ‫يم م م‬ ‫؟؟‬ ‫ذ س‬ ‫ة‬ ‫م ‪5‬‬ ‫ا‬ ‫خم ذ ي‬
‫د‬ ‫دم ي د د‬ ‫س‬ ‫ي‬ ‫م‬ ‫ص ي ا‬ ‫خ ص ي‬
‫ددم‬ ‫د‬ ‫د ي ددم خددم‬ ‫‪ ،‬س د م ددم‬ ‫ساسد س ز د د خددم‬ ‫د‬ ‫ددا‬ ‫صد ي ددا صد‬
‫ز د دأ م‬ ‫ا د‬ ‫صف‬ ‫‪ ،‬خص ج‬ ‫ة‬ ‫ص ي سم‬ ‫ص ي أس ء ص ي أ‬
‫م د‬ ‫د س صد‬ ‫دف‬ ‫خدم د د‬ ‫ا صد‬ ‫ا صف اي‬ ‫ذ ي‬
‫ا ا ‪.‬‬
‫ذ ة ‪.‬‬ ‫س م‬ ‫يم‬

‫اضبرطجةػاضذغئغةػاوػاضبرطجةػاضصائظغة ػ‬

‫ي ا‬ ‫ا‬ ‫" ‪" struct‬‬ ‫س س س‬ ‫س‬ ‫ز ي‬ ‫م‬


‫خد ا د‬ ‫د‬ ‫د‬ ‫" ) ( ‪" main‬‬ ‫دا " ‪ " #include ….‬د ا د مج سد‬ ‫حدم أ‬ ‫مد‬
‫‪:‬‬ ‫ة‬ ‫‪،‬ا‬ ‫س م‬ ‫اةء ج‬ ‫ا‬ ‫م‬ ‫ا‬ ‫مج س ‪main‬‬
‫>‪# include <…….h‬‬
‫‪# ….‬‬
‫‪struct struct_name‬‬
‫‪.‬‬ ‫م‬ ‫ز مص‬ ‫‪: struct‬‬
‫) ( ‪void main‬‬ ‫‪.‬‬ ‫‪ : struct_name‬س م‬
‫{‬ ‫}‬

‫‪:‬‬ ‫ئ‬ ‫إش‬ ‫ج‬ ‫ف‬ ‫ف‬ ‫ا‬

‫بظاءػاضترصغب ػ‬
‫ػ‬
‫> ‪#include < ___________ .h‬‬ ‫د ز‬ ‫د‬ ‫د‬ ‫د‬ ‫م ددا م ددف أ م د‬ ‫ددا‬
‫> ‪#include < ___________ .h‬‬
‫> ‪#include < ___________ .h‬‬ ‫م صد م‬ ‫" ‪" struct‬‬ ‫مص‬
‫م د ددذ م ددا ج د‬ ‫حددم س د‬ ‫ددا‬ ‫د‬ ‫ددم د‬ ‫دس‬
‫ئ ‪1. struct‬‬ ‫م د يد ذ د حدم‬ ‫أ س م د ةدم‬
‫{ ‪2.‬‬ ‫‪:‬‬ ‫م ‪،‬‬ ‫مف‬
‫‪3. ………………….‬‬ ‫;‬ ‫س ج‬ ‫م‬ ‫دم‬ ‫د س اسد‬ ‫ي ا س م د سد‬ ‫ا‬ ‫‪.‬‬
‫‪4. ………………….‬‬ ‫;‬ ‫م ‪.‬‬ ‫مف‬ ‫م‬
‫‪5. ………………….‬‬ ‫;‬
‫‪6. ………………….‬‬ ‫;‬ ‫م‬ ‫ذ‬ ‫س م‬ ‫سي‬ ‫ا‬ ‫ذ‬ ‫‪.‬‬
‫‪7. ………………….‬‬ ‫;‬ ‫ددم دداس سدد س " _ "‬ ‫د‬ ‫دد‬ ‫دد ي دد‬ ‫د‬
‫‪8. ………………….‬‬ ‫;‬ ‫س ج‬ ‫م‬ ‫ا ا ‪.‬‬ ‫ا أ سي ا‬
‫; } ‪9.‬‬ ‫د د‬ ‫د ز‬ ‫د‬ ‫ددا‬ ‫ا د سد م د‬ ‫‪.‬‬
‫) ( ‪void main‬‬ ‫س ما دس‬ ‫‪ ....... delete new‬غ م ‪ ،‬ذ س‬
‫{‬ ‫دد حددم‬ ‫دد‬ ‫دد ز دد ‪ new‬دد ا‬ ‫دد‬
‫خم ‪.‬‬ ‫س‬ ‫ا اس س س‬
‫}‬
‫‪-‬‬ ‫‪-‬‬ ‫ر‬
‫دم أ س دز خد ص حد س سد‬ ‫ي س‬ ‫ا‬ ‫‪.‬‬
‫‪.‬‬ ‫س‬ ‫‪ ، + ، ! ، @ ، # ( :‬ط ‪ .... ، . ، / ، = ،‬خ ‪ ،‬ا ح س ا اس س س ي‬
‫اس د‬ ‫ا د‬ ‫د سد ا د أ‬ ‫د‬ ‫ددم د م د سد‬ ‫ا د سد م د د ددا سد ء‬ ‫‪.‬‬
‫س ما س ‪.‬‬

‫د‬ ‫ا د‬ ‫د‬ ‫د د يد‬ ‫‪،‬‬ ‫د يد خ د‬ ‫م‬ ‫ا‬ ‫م‬ ‫صم } {‬


‫‪.‬‬ ‫ء س م‬ ‫سس ذ‬
‫خ أ‪.‬‬ ‫ا‬ ‫ي خ‬ ‫حم‬ ‫م‬ ‫ا‬ ‫ض فص‬
‫ة‬ ‫ا حة‬ ‫دم ‪ ،‬شة‬ ‫د د سد‬ ‫خد ا‬ ‫ما م‬ ‫م‬ ‫خ م‬
‫غة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة شة‬ ‫ة‬ ‫ةف ‪،‬‬ ‫ق‬ ‫أ ق‬ ‫ئ ا‬ ‫أ ق‬ ‫غ‬
‫صد‬ ‫د‬ ‫د‬ ‫جد ‪،‬‬ ‫د سدخ س د‬ ‫د‬ ‫سد‬ ‫ة ‪ ،‬ذد ا م د د دس د د‬ ‫خة ج ة‬
‫( ط ‪. 8‬‬ ‫س‬ ‫ي م‬ ‫م‬ ‫مف‬ ‫ي‬
‫يد‬ ‫س م‬ ‫س‬ ‫ء‬ ‫س‬ ‫س ما‬ ‫ي‬ ‫م‬ ‫ج ذ‬ ‫س‬ ‫ي‬
‫حدم ا د ‪.‬‬ ‫خد م د ‪ ،‬د سد‬ ‫د‬ ‫دم‬ ‫د د د م دا سد ا د دذ‬ ‫س ذ ا‬
‫‪:‬‬ ‫ا‬ ‫م س (‪a‬‬ ‫اخ‬ ‫" ‪ " car‬س س‬ ‫س م‬ ‫ذ ا‬ ‫ح‬

‫} ; ‪car ( ) { a = 0‬‬

‫ص‬ ‫‪،‬أ‬ ‫غ‬ ‫خ‬ ‫ف‬ ‫اس‬ ‫مي ز ز‬


‫‪.‬‬ ‫م‬ ‫مج س‬ ‫س ء ا‬ ‫م‬ ‫أ‬

‫؟‬ ‫ق‬ ‫" ‪ " student‬ح‬ ‫ف‬ ‫‪.‬‬ ‫ث‬

‫‪1. struct student‬‬ ‫‪student‬‬ ‫س م‬ ‫ز م‬ ‫ي خ‬


‫{ ‪2.‬‬ ‫‪،‬‬ ‫ي م‬ ‫م‬ ‫س‬ ‫صم ا‬ ‫ض‬ ‫ازس‬
‫; ] ‪3. char st_name [ n‬‬ ‫س‬ ‫د اسد د‬ ‫د‬ ‫سد‬ ‫د‬ ‫م ذ ما‬ ‫ي خ‬
‫; ‪4. int st_number‬‬ ‫س‬ ‫دم ) ‪( n‬‬ ‫د د‬ ‫مز‬ ‫س ما ص ي‬ ‫سس س ز ذ‬
‫; ‪5. float st_age‬‬ ‫م‬
‫; ‪6. float st_avg‬‬ ‫ا‬
‫‪.‬‬ ‫ي خ‬ ‫ذ ما‬ ‫س س م ز اس س‬
‫; } ‪7.‬‬ ‫ا اي س س‪.‬‬ ‫‪ ، int‬ا س‬ ‫ا ص‬ ‫س‬ ‫خ‬
‫ر ‪- -‬‬ ‫د‬ ‫د دا د‬ ‫دم‬ ‫د ‪ float‬ا‬ ‫دا‬ ‫م‬ ‫خ‬
‫‪.‬‬ ‫‪.‬‬ ‫س س‬
‫ةس‪.‬‬ ‫ا‬ ‫ا‬ ‫‪ ، float‬ا‬ ‫ا‬ ‫ا‬ ‫خ‬
‫‪.‬‬ ‫ء م‬ ‫صم اا‬ ‫ا‬ ‫ص‬ ‫ا س‬ ‫ي خ‬ ‫مف م‬
‫ج‬ ‫ةء‬ ‫ا س‬ ‫ا‬ ‫ي‬ ‫م‬ ‫ء م‬ ‫زز اس‬ ‫ا‬
‫ذ م‬
‫اظذاءػاضصائظاتػطنػاضتراصغب ػ‬
‫ػ‬
‫صغفغهػتورغثػطحتوغاتػاضترصغبػضضصائظاتػ‪:‬ػ ػ‬

‫ئ ‪:‬‬ ‫ث خص ئص‬ ‫ث‬


‫ئ ‪1. struct‬‬
‫{ ‪2.‬‬ ‫ددا صددم د‬ ‫د ددا د م د أ‬ ‫د‬ ‫‪.‬‬
‫; ‪3. ………………….‬‬ ‫س ج‬ ‫م‬ ‫م دا س د م د‬ ‫س ء ج‬ ‫ص‬
‫; ‪4. ………………….‬‬ ‫س ج‬ ‫م‬ ‫دم ةدم‬ ‫ج‬
‫ئ } ‪5.‬‬ ‫ئ ‪,‬‬ ‫ئ ‪, ...... n‬‬ ‫;‬ ‫ي‬ ‫سيص‬ ‫ج‬ ‫ا‬ ‫يص‬
‫س ‪.‬‬
‫‪-‬‬ ‫‪-‬‬ ‫ر‬

‫يد‬ ‫‪،‬‬ ‫س‬ ‫م‬ ‫ا ا‬ ‫‪ .‬م خم‬


‫> ‪#include < ___________ .h‬‬
‫> ‪#include < ___________ .h‬‬ ‫ئ‬ ‫ث‬ ‫ا مج س ‪main‬‬
‫> ‪#include < ___________ .h‬‬ ‫د سد م د‬ ‫م د د سد ي‬ ‫د‬ ‫ما س‬
‫د د ج ددا س د‬ ‫ددم‬ ‫ددم‬ ‫د‬ ‫دج ا ‪،‬‬
‫ئ ‪1. struct‬‬ ‫ددا م ددف‬ ‫دج‬ ‫د ي ص د ددا د‬ ‫م د ةددم‬
‫{ ‪2.‬‬ ‫د سد‬ ‫ي‬ ‫‪.‬‬ ‫ص‬ ‫ج‬
‫س ج ; ‪3. ………………….‬‬ ‫م‬
‫‪.‬‬
‫س ج ; ‪8. ………………….‬‬ ‫م‬
‫; } ‪9.‬‬
‫د ز ‪ struct‬د سد‬ ‫د‬ ‫د‬ ‫د‬ ‫د‬ ‫د‬
‫) ( ‪void main‬‬ ‫ذ ‪:‬‬ ‫ةء ج‬ ‫خ ا مج س‬ ‫م‬
‫{‬ ‫)( ‪void main‬‬
‫; ‪x1 , x2 , x3 , ……xN‬‬ ‫{‬
‫‪struct‬‬ ‫; ‪x1 , x2 , x3 , ….. ,xn‬‬
‫}‬
‫‪- -‬‬ ‫ر‬
‫‪…..‬‬
‫‪…..‬‬
‫}‬

‫> ‪#include < ___________ .h‬‬


‫ةج ‪.‬‬ ‫ا خم ج‬ ‫ص‬ ‫ا س‬
‫ئ ‪1. struct‬‬
‫{ ‪2.‬‬ ‫د م د‬ ‫صد‬ ‫ددم‬ ‫د‬ ‫د ددا‬ ‫د‬ ‫‪.‬‬
‫س ج ; ‪3. ………………….‬‬ ‫م‬ ‫‪:‬‬
‫س ج ; ‪8. ………………….‬‬ ‫م‬ ‫دا صدم‬ ‫م ا د أ‬ ‫ج‬ ‫م‬
‫; ‪9. } x1 , x2 , x3 , ….. xn‬‬ ‫ج‬ ‫م‬ ‫‪،‬‬ ‫ص‬ ‫م‬ ‫ي‬
‫م د ذ د خد ا د‬ ‫د‬ ‫س د ددس‬ ‫خددم‬
‫( ‪void main‬‬ ‫)‬ ‫ا د‬ ‫د سد م د‬ ‫مج سد ) ( ‪ main‬ةدم‬
‫{‬
‫; ‪y1 , y2 , y3 , ……yN‬‬ ‫س اسد دذ د ةد ج ‪ ،‬د يد‬ ‫ا‬ ‫ج‬
‫}‬ ‫‪.‬‬ ‫س‬
‫ر ‪- -‬‬
‫م د‬ ‫س د خصد ج‬ ‫دف د‬ ‫ضد‬ ‫ا‬ ‫م د ‪ ،‬يدا‬ ‫ج‬ ‫ةء‬ ‫م‬ ‫حم‬ ‫ا‬ ‫ذ‬
‫‪:‬‬ ‫ة‬ ‫ج‬

‫‪:‬‬ ‫صف‬ ‫ف‬ ‫أ‬ ‫ئ‬ ‫ث‬ ‫ف‬ ‫ضح‬

‫د دج د‬ ‫س مص ج ‪،‬‬ ‫ج‬ ‫م‬ ‫س‬ ‫س‬


‫‪.‬‬ ‫ا‬ ‫ج‬ ‫س‬ ‫زذ‬ ‫س اس ذ‬ ‫س‬ ‫ة‬ ‫اخم ‪،‬‬ ‫خص م ف‬
‫ذ م د أ خ صد د د‬ ‫م‬ ‫ج‬ ‫س‬ ‫م‬ ‫زز‬ ‫يا‬
‫ج س ‪،‬أ‬ ‫س‬ ‫ا‬ ‫ز‬ ‫‪،‬‬ ‫‪ ،‬س اس ء ا‬ ‫مص‬ ‫م‬ ‫ج‬
‫ج‬ ‫ذم س‬ ‫ز ا‬ ‫‪،‬‬ ‫ج ‪ y‬س اس ء‬ ‫م‬ ‫س‬ ‫ج ‪x‬‬ ‫م‬
‫ا‪.‬‬ ‫س حم ذ ي‬
‫د‬ ‫دم‬ ‫دم ا دا ةد ء د ج ‪ ،‬أ‬ ‫سد ما دذ‬ ‫ا‬ ‫سا‬
‫يد ذ دم‬ ‫دم‬ ‫دز دذ‬ ‫ةد ء د ج د دذ م د د‬ ‫دا د‬ ‫م يد‬ ‫خ م‬
‫ةء ‪.‬‬ ‫ج ذ‬ ‫س‬

‫( ‪: main‬‬ ‫ئ‬ ‫خ‬ ‫ج‬ ‫ئ‬ ‫ف‬

‫") ( ‪: " main‬‬ ‫ئ‬ ‫خ‬ ‫ئ‬ ‫خ‬ ‫ق ث‬


‫دم‬ ‫د د خد م د ‪ ،‬د‬ ‫خ ا مج س س‬ ‫م‬ ‫ج‬ ‫ما‬ ‫ا‬
‫م ‪،‬‬ ‫ذ‬ ‫م‬ ‫أ‬ ‫م ي ا ما ص‬ ‫اا‬ ‫خز‬ ‫س‬ ‫م‬
‫اد‬ ‫د‬ ‫د د‬ ‫م دذ م دا‬ ‫س‬ ‫ا‬ ‫ذ مز‬ ‫ج‬ ‫س‬
‫‪:‬‬ ‫ي ة‬ ‫م‬ ‫ذ‬ ‫ما س‬ ‫=‬ ‫س‬

‫; ‪x.avg=90.5‬‬
‫م‪.‬‬ ‫م‬ ‫ض‬ ‫ا‬ ‫أخذ‬
‫ظث‬ ‫‪(:‬‬ ‫غ‬ ‫" ‪ ، " car‬ح‬ ‫ف‬ ‫ث ‪:‬‬
‫صح ح ‪.‬‬ ‫‪ 2‬ظ ف‪،‬‬
‫>‪1. #include <iostream.h‬‬
‫>‪2. #include <conio.h‬‬ ‫س م‬ ‫ي م‬ ‫زز اس‬ ‫ا‬
‫‪3. struct car‬‬ ‫ددم دد دد سدد سدد س‬ ‫دد م ددف‬ ‫‪ car‬دد يدد م دد‬
‫{ ‪4.‬‬ ‫د‬ ‫د دء م د‬ ‫د يد خ د‬ ‫ذ‬
‫‪5.‬‬ ‫;]‪char car_name [20‬‬ ‫دم يد ا د مج سد ‪ ،‬يد‬ ‫دذ‬ ‫د‬ ‫د د س د‬ ‫صد‬
‫‪6.‬‬ ‫; ‪int car_model‬‬ ‫‪ car‬د م د س‬ ‫م‬ ‫‪x‬‬ ‫اي‬ ‫ةء ج‬ ‫‪5‬‬ ‫م‬
‫;} ‪7.‬‬
‫) ( ‪8. void main‬‬
‫م ةء ج ‪.‬‬ ‫ي س ما أ م‬
‫{ ‪9.‬‬ ‫د دج ‪x‬‬ ‫م‬ ‫ي م‬
‫‪10.‬‬ ‫;‪car x‬‬ ‫دذ ‪،‬‬ ‫م‬ ‫س‬ ‫ج‬ ‫س‬ ‫س‬
‫‪11.‬‬ ‫;‪cin >> x.car_name‬‬ ‫س‪.‬‬ ‫ة‬ ‫ا‬
‫‪12.‬‬ ‫;‪cin >> x.car_model‬‬ ‫د د خد سد سد س‬ ‫د ددا‬ ‫صد‬ ‫ا سد‬ ‫د‬
‫‪13.‬‬ ‫;)(‪getch‬‬ ‫دم ي د س‬ ‫د د د خ د د دذ‬ ‫ذ س د‬
‫} ‪14.‬‬
‫ذ ‪:‬‬ ‫اس‬

‫;‪cout << x.car_name‬‬


‫;‪cout << x.car_model‬‬

‫د‬ ‫ا د يد ذ د ي‬ ‫دس د أ‬ ‫اخدم‬ ‫م د سد ء ا خد‬ ‫س ‪،‬‬ ‫س اس‬


‫م ‪.‬‬ ‫خا‬ ‫ذ‬ ‫زء‬ ‫م‬ ‫خ‬
‫ة‬ ‫ة‬ ‫ة جة‬ ‫ة‬ ‫ظ صة‬ ‫ة شة ة‬ ‫ة ة رة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة ة‬
‫‪.‬‬ ‫‪- 2‬‬ ‫ف‬ ‫خ‬ ‫ف ‪ tap‬ف‬ ‫ظ ث‬

‫ة‬ ‫ة‬ ‫صة‬ ‫ة ‪ ( :‬ة شة‬ ‫ة‬ ‫غة‬ ‫‪ TV‬ظ ث‬ ‫ف‬ ‫ف‬ ‫‪:‬‬
‫ة‬ ‫ة‬ ‫ثة ة ة‬ ‫صح ح ‪ ،‬ثة شةئ ة ئ‬ ‫ص‬ ‫‪ 2‬ظ ف‪،‬‬
‫ج‪.‬‬ ‫ث‬ ‫ئ ث‬ ‫ا‬ ‫ئ ا‬ ‫ث أ‬ ‫ا‬ ‫ئ‬ ‫ش‬

‫صف ف‬ ‫‪ 8 ،‬ا‬ ‫ا‬ ‫‪2‬‬ ‫‪ student‬ح‬ ‫ف‬ ‫‪:‬‬


‫‪.‬‬ ‫ظ‬ ‫ث‬ ‫ا‬ ‫ا‬ ‫خ‬ ‫‪،‬ث ق‬ ‫ظ‬ ‫ف غ‬ ‫‪،‬‬ ‫ظ‬

‫‪:‬‬ ‫ئ‬ ‫غ‬

‫م د سد أ‬ ‫د‬ ‫ز‬ ‫خ ا مج س ‪ ، main‬ا‬ ‫م‬ ‫ج‬ ‫ا س سس س ز‬


‫ز ‪strcpy‬‬ ‫س ما‬ ‫ذ‬ ‫س يذ خ ‪،‬‬ ‫م‬ ‫م‬ ‫ز س سس‬ ‫ا‬
‫‪:‬‬ ‫ض‬ ‫ص م ‪ ،‬ذ‬ ‫م‬ ‫‪iostream.h‬‬

‫‪strcpy‬‬ ‫ج‬ ‫‪ .‬س‬ ‫ج‬ ‫م‬ ‫‘‬ ‫"‬ ‫ج‬ ‫م‬ ‫خ‬ ‫سم‬ ‫ما‬ ‫"‬ ‫;‬
‫ضد‬ ‫د‬ ‫ة ‪،‬‬ ‫ةئ‬ ‫ة‬ ‫غ‬ ‫ح‬ ‫خ‬ ‫ما‬ ‫ا‬
‫د‬ ‫دج‬ ‫دم د‬ ‫خد‬ ‫سدم‬ ‫د م دا‬ ‫م زد‬ ‫س سد‬ ‫د‬ ‫د‬ ‫د‬ ‫‪،‬‬ ‫ص‬ ‫ا‬
‫‪:‬‬ ‫ا‬ ‫سي‬ ‫س‬ ‫‪n -1‬‬ ‫م‬

‫; ) "‪strcpy ( x . name , " yousef anaya‬‬

‫د‬ ‫د‬ ‫سي د‬ ‫" ‪" yousef anaya‬‬ ‫ص‬ ‫ا‬ ‫ص س‬ ‫ا سس م ز‬


‫ص ي أ سس س ز ا سس م زد ‪+‬‬ ‫سم ي‬ ‫م ذ ما‬ ‫ز‬ ‫‪،‬ي‬ ‫س‬
‫د صد ي‬ ‫‪ \0‬ذ اا د د‬ ‫اخ‬ ‫ص ي‬ ‫ي‬ ‫اخ م‬ ‫ذ ا‬ ‫‪ ،‬أ ‪n+1‬‬
‫د‬ ‫صم‬ ‫سخ ذ اس ي ص ي‬ ‫ا‬ ‫ا ز ص ي ي ذ م ‪،‬‬ ‫ج‬ ‫ذ‬
‫ا س ‪.‬‬ ‫م‬ ‫ذ ما‬ ‫م ص ي‬
‫د سد أ‬ ‫حم‬ ‫س ما ي ذ‬ ‫خ‬ ‫س‬ ‫‪،‬‬ ‫خ م‬ ‫سس م ز‬ ‫ذ ي‬
‫‪.‬‬ ‫م ذ م ا اخ‬ ‫س‬ ‫ج‬ ‫س‬

‫ئ خ ‪:‬‬ ‫غ‬ ‫ح‬ ‫ئ‬ ‫غ‬ ‫ح‬ ‫خ‬ ‫ف‬

‫د دس م د‬ ‫خ ‪،‬ي‬ ‫ئ‬ ‫غ‬ ‫ئ‬ ‫غ‬ ‫خ ح‬ ‫خ‬ ‫ي س‬ ‫م‬


‫ج اخدم د‬ ‫م‬ ‫س‬ ‫يص‬ ‫سخ س س‬ ‫ما‬ ‫م ذ‬ ‫م س‬ ‫س‬
‫ج‬ ‫م‬ ‫سخ‬
‫سس س ‪،‬أ‬ ‫ذ‬
‫‪1. struct student‬‬ ‫سدخ‬ ‫س د‬ ‫س‬ ‫ج خم ‪ ،‬ي‬ ‫م‬ ‫ي‬
‫{ ‪2.‬‬ ‫دج ‪ y‬د‬ ‫دم ‪ name‬د‬ ‫د ج ‪ x‬يد‬ ‫‪ name‬د‬ ‫د‬
‫; ] ‪3. char st_name [ 13‬‬ ‫‪:‬‬ ‫س ‪.‬‬ ‫م‬ ‫س‬
‫; ‪4. }x , y‬‬
‫) ( ‪5. void main‬‬
‫م‬ ‫سخ س س م ز خ‬ ‫س‬ ‫م‬ ‫ا‬
‫{ ‪6.‬‬
‫; ) " ‪7. strcpy (x . st_name , " yousef anaya‬‬ ‫دم‬ ‫دذ د ج د‬ ‫سدخ د‬ ‫دج ‪ x‬د س د‬ ‫اس د‬
‫; ) ‪8. strcpy (y . st_name , x . st_name‬‬ ‫ا د‬ ‫ج خدم ي سد ما دس م د ا د م د س د‬
‫} ‪9.‬‬ ‫د ‪ y . st_name‬د سد‬ ‫سدخ ا خ د‬ ‫م دذ م دا‬ ‫س‬
‫‪. x . st_name‬‬ ‫سخ‬ ‫م ذ ما‬

‫‪:‬‬ ‫ا‬ ‫اخ س س‬ ‫يذ س‬ ‫م‬ ‫ي‬ ‫سس م ز‬ ‫‪ :‬ذ ي‬ ‫اظ‬


‫ددذ‬ ‫د‬ ‫د‬ ‫ددم ‪ ، y . st_name‬يددا‬ ‫خد‬ ‫سددم‬ ‫سد ما س د‬ ‫‪ x . st_name‬د‬
‫‪:‬‬ ‫م‬
‫; ‪y . st_name = x . st_name‬‬
‫‪.‬‬ ‫س‬ ‫م‬ ‫س‬ ‫يذ خ‬

‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة ا ة‬ ‫غ‬ ‫ر ص ‪ person‬ظ ث ح‬ ‫‪ :‬ف‬


‫ثة‬ ‫ةئ‬ ‫ا‬ ‫ئ ا ث‬ ‫ث خ ا‬ ‫ف ئ‬ ‫‪ 2‬ظ ف‪،‬ث‬
‫ئ ث ‪.‬‬ ‫ا‬ ‫ث‬
‫ة‬ ‫ة‬ ‫ةف‬ ‫‪(:‬‬ ‫غ‬ ‫ف ح‬ ‫( ‪Officer‬‬ ‫‪ .‬ف‬ ‫ث‬
‫‪:‬‬ ‫ف‬ ‫‪ ،‬حث‬ ‫ظ‬ ‫ف‬ ‫صح ح ‪،‬‬ ‫ف‬ ‫‪ 2‬ظ ف‪ ،‬ق‬
‫ة ‪ 255.5( :‬؟‬ ‫( ‪ ، yousef anaya‬ق ة ‪، 550( :‬‬
‫> ‪1. #include < iostream.h‬‬ ‫ة ش رة ة‬ ‫ة ‪ y‬ثة ة‬ ‫فة ة ئ خة‬ ‫ة‬ ‫ثة‬
‫> ‪2. #include < conio.h‬‬ ‫ئ ‪ y‬؟‬
‫‪3. struct Officer‬‬
‫ددد‬ ‫م ددد ‪ Officer‬يددد خ ددد‬ ‫ددد سددد‬
‫{ ‪4.‬‬
‫‪5.‬‬ ‫ف; ]‪char offi_name[13‬‬ ‫س‬ ‫د ز يد د سد ‪ struct‬دذ حدم د ء‬ ‫ض‬
‫‪6.‬‬ ‫; ‪int offi_number‬‬ ‫ف‬ ‫س‬ ‫‪-‬‬ ‫د يد خ د‬ ‫دم‬ ‫سد ء‬ ‫د مي د د‬ ‫م‬
‫‪7.‬‬ ‫ف ; ‪float offi_Salary‬‬ ‫س‬ ‫ي س ‪.‬‬
‫; ‪8. } x , y‬‬
‫) ( ‪9. void main‬‬ ‫د يد سد ا د‬ ‫د د‬ ‫ةد ء د ج‬
‫{ ‪10.‬‬
‫د‬ ‫دم‬ ‫دا م دف د ج سد ا د د‬ ‫خ‬
‫‪11.‬‬ ‫; ) "‪strcpy ( x . offi_name , "yousef anaya‬‬
‫‪12.‬‬ ‫; ‪x .offi_number = 550‬‬ ‫دد م دد‬ ‫‪-‬‬ ‫دد ‪ x‬دد يدد م دد‬ ‫دد ج ا‬
‫‪13.‬‬ ‫; ‪x .offi_Salary = 2455.5‬‬ ‫‪ ،‬د ددا‬ ‫سددخ ساس د م ز د د ي د خ د‬ ‫حددم‬
‫س د ‪ ،‬ي مي د‬ ‫س د ي د حددم‬ ‫ددم د‬ ‫س سد د‬
‫‪14.‬‬ ‫; ) ‪strcpy ( y . offi_name , x . offi_name‬‬ ‫ذ سس خ‬ ‫م ذ ما‬ ‫سس‬
‫‪15.‬‬ ‫; ‪y.offi_number = x . offi_number‬‬ ‫ذد ا‬ ‫ي خ د‬ ‫صم‬ ‫ص ي‬ ‫م‬
‫‪16.‬‬ ‫; ‪y. offi_Salary = x . offi_Salary‬‬
‫د م ددز ‪ \0‬اا د‬ ‫د‬ ‫صد ي‬ ‫صددم اخ ددم يد‬
‫‪17.‬‬ ‫; ‪cout << y.offi_name << endl‬‬ ‫سد ي د‬ ‫ضد‬ ‫د‬ ‫د‬ ‫ص ي‬
‫‪18.‬‬ ‫; ‪cout << y.offi_number << endl‬‬ ‫سس ‪.‬‬ ‫س ي‬ ‫ي خ‬ ‫ص‬ ‫ا‬
‫‪19.‬‬ ‫; ‪cout << y.offi_Salary << endl‬‬ ‫صددم‬ ‫ددز د‬ ‫صددم‬ ‫د‬ ‫ا سد‬ ‫د‬
‫‪20.‬‬ ‫;)(‪getch‬‬ ‫د زد‬ ‫‪ ،‬غ دم سد ما د‬ ‫سس م ز خ م‬
‫} ‪21.‬‬ ‫ي ذ م ‪.‬‬ ‫م‬

‫سدخ‬ ‫حدم‬ ‫م د‬ ‫د‬ ‫–‬ ‫د‬ ‫م د‬ ‫دج ‪ y‬ا د‬ ‫دج ‪ x‬د‬ ‫د‬
‫‪.‬‬ ‫م‬ ‫ي‬ ‫مز‬ ‫ساس‬
‫‪.‬‬ ‫‪-‬‬ ‫م‬ ‫ي‬ ‫‪Officer‬‬ ‫م‬ ‫ج ‪y‬‬

‫‪:‬‬ ‫ئ‬ ‫غ‬ ‫ج‬


‫م د‬ ‫د‬ ‫دا‬ ‫د‬ ‫جد‬ ‫دم سد‬ ‫د‬ ‫د‬ ‫د‬ ‫‪،‬‬ ‫د‬ ‫م د‬ ‫د‬ ‫ج‬ ‫م‬ ‫ما‬ ‫ا‬
‫‪:‬‬ ‫ذ‬ ‫ا‬ ‫خذ‬ ‫ذ‬ ‫مص‬
‫ة‬ ‫ة‬
‫ة ة‬ ‫ة ‪ (:‬ة‬ ‫ة‬ ‫غة‬ ‫ة‬ ‫ة ‪ student‬ة ح ة‬ ‫ة‬ ‫‪ :‬ف‬ ‫ث‬
‫ة‬ ‫ظ ة ‪ ،‬ثة ة ف ة ئ‬ ‫صح ح ‪،‬‬ ‫‪ 2‬ظ ف‪ ،‬ق‬
‫ة‬ ‫ة ‪ ، mohamd samer‬ق ة ‪،‬‬ ‫خة‬ ‫ف ئ‬ ‫‪ 80.7‬ث‬ ‫‪ ، yousef anay‬ق‬
‫شر ‪.‬‬ ‫ئ‬ ‫ح‬ ‫‪ 8..‬ث‬

‫>‪1. #include <iostream.h‬‬ ‫سددد‬ ‫سددد‬ ‫ةددد ء م ددد‬ ‫ددد يددد خ ددد‬
‫>‪2. #include <conio.h‬‬ ‫د يد م د‬ ‫د‬ ‫دم‬ ‫مف‬ ‫‪student‬‬
‫‪3. struct student‬‬
‫{ ‪4.‬‬
‫‪. y x‬‬ ‫ي م‬ ‫ج‬ ‫ة‬ ‫‪-‬‬
‫‪5.‬‬ ‫;]‪char st_name[20‬‬ ‫‪-‬‬ ‫د ج ا ‪ x‬يد م د‬ ‫م‬ ‫سا‬
‫‪6.‬‬ ‫;‪int st_number‬‬ ‫‪-‬‬ ‫‪y‬ي م‬ ‫ج‬ ‫م‬ ‫سا‬
‫‪7.‬‬ ‫;‪float st_avg‬‬ ‫–‬ ‫دد ج ‪ x‬دد يدد م دد‬ ‫ددم‬ ‫دد دد‬
‫; ‪8. } x , y‬‬ ‫‪– 5‬‬ ‫ي م‬ ‫ج ‪y‬‬ ‫م‬
‫) ( ‪9. void main‬‬ ‫‪.‬‬
‫{ ‪10.‬‬
‫‪11.‬‬ ‫;) "‪strcpy ( x . st_name , "yousef anaya‬‬
‫‪12.‬‬ ‫; ‪x .st_number = 1‬‬ ‫دددس‬ ‫د د ددد ‪ y x‬س د د‬ ‫ددد‬ ‫ا د د ز دددز‬
‫‪13.‬‬ ‫; ‪x .st_avg = 80.7‬‬ ‫ميد‬ ‫س ج‬ ‫م‬ ‫مص ج ‪،‬‬ ‫ص‬
‫م د‬ ‫د دج د‬ ‫خ د م د ‪ student‬س د ‪ ،‬أ‬
‫‪14.‬‬ ‫;) "‪strcpy ( y . st_name , "mohamed samer‬‬ ‫م اخم‪.‬‬ ‫س أ ا‬ ‫مص‬
‫‪15.‬‬ ‫; ‪y .st_number = 2‬‬
‫‪16.‬‬ ‫; ‪y .st_avg = 87.3‬‬
‫ث ؟؟‬ ‫حج‬
‫‪17.‬‬ ‫; ‪cout << x.st_name << endl‬‬ ‫دز أ‬ ‫جد ا‬ ‫د‬ ‫م د‬ ‫ا‬
‫‪18.‬‬ ‫; ‪cout << x.st_number << endl‬‬ ‫م د‬ ‫ةء دج أ‬ ‫ز‬ ‫ي ذ م‬
‫‪19.‬‬ ‫; ‪cout << x.st_avg << endl‬‬ ‫‪ main‬ذ دد ا‬ ‫دد ا دد مج سدد‬ ‫دد‬ ‫ددا‬ ‫دد‬
‫مد‬ ‫اس‬ ‫م سم م سس‬
‫‪20.‬‬ ‫; ‪cout << y.st_name << endl‬‬ ‫م د م د د دداخ د‬ ‫ددم‬ ‫‪ main‬ي د‬ ‫د‬
‫‪21.‬‬ ‫; ‪cout << y.st_number << endl‬‬
‫‪22.‬‬ ‫; ‪cout << y.st_avg << endl‬‬
‫ةء جد‬ ‫زي ذ م‬ ‫‪main‬‬
‫‪.‬‬ ‫ذ م‬
‫‪23.‬‬ ‫;)(‪getch‬‬ ‫د‬ ‫د‬ ‫ددذ م د‬ ‫د‬ ‫د‬ ‫د‬ ‫د‬
‫} ‪24.‬‬ ‫د حد ء‬ ‫ذ ح ء م‬ ‫خ ا مج س أ‬
‫خم ‪.‬‬

‫د ددم خص د ج‬ ‫سد ‪ ،‬ي د ج‬ ‫ددز د ددذ م‬ ‫د دج د‬ ‫د سد سد‬ ‫د سد‬ ‫يد‬


‫ي‬ ‫ز(‬ ‫ا ‪char‬‬ ‫صم‬ ‫‪5‬‬ ‫مي س س س ز‬ ‫‪،‬‬ ‫ذ‬ ‫م‬
‫سس م ز ‪.‬‬ ‫‪ 5‬ي ز( *‪2= 2‬‬ ‫‪char‬‬ ‫ص ي‬ ‫ذم‬
‫‪.‬‬ ‫ز(‬ ‫ذ‬ ‫‪ int‬ي خ‬ ‫ا ص‬ ‫مفس‬
‫دا يد‬ ‫دج‬ ‫دز‬ ‫د د‬ ‫د ي د‬ ‫ة‬ ‫أ ‪ float‬ي دز د (‬ ‫ا‬ ‫مف ا‬
‫ا‪.‬‬ ‫ج‬ ‫‪ 8 = + + 2( :‬أ‬ ‫س‬ ‫ذ م‬
‫ذ ‪.‬‬ ‫ج‬ ‫ج ا ضم ا‬ ‫ج‬ ‫ز‬ ‫أ‬ ‫ج (‪= * 8‬‬

‫م‬ ‫ا‬ ‫أ‬ ‫ذ اس‬ ‫م‬ ‫ج‬ ‫م‬ ‫س‬ ‫زز‬ ‫ا‬
‫‪:‬‬ ‫خذ‬ ‫ذ‬ ‫س ما‬ ‫خ‬ ‫أ‬ ‫م ذ‬ ‫س‬ ‫‪،‬ي ذ‬ ‫م‬ ‫خ‬
‫ظة ف‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ج ة‬ ‫ة‬ ‫ة‬ ‫‪ laptob‬ح ة‬ ‫ة‬ ‫ا ة‬ ‫ة‬ ‫‪ :‬ة ف‬ ‫ثة‬
‫ة ‪ 2‬ظة ف ثة ة ف ة ئ‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫‪float‬‬ ‫ظ‬ ‫غ خ‬
‫؟‬ ‫ح‬ ‫ج‬ ‫ئ‬ ‫خ‬ ‫‪ x‬حث‬

‫>‪1. #include <iostream.h‬‬ ‫سد‬ ‫‪-‬‬ ‫م د‬ ‫يد‬


‫ء م‬
‫>‪2. #include <conio.h‬‬ ‫د‬ ‫د‬ ‫د‬ ‫د‬ ‫د يد سد‬ ‫د‬
‫‪3. struct laptop‬‬ ‫ا دددد م دددد‬ ‫ضدددد‬ ‫دددد‬
‫{ ‪4.‬‬ ‫سد ما أ د‬ ‫د‬ ‫خ‬ ‫ذ‬
‫‪5.‬‬ ‫;]‪char lap_name[22‬‬
‫ي د يد دذ‬ ‫م د‬ ‫س ا‬
‫‪6.‬‬ ‫;‪float lap_price‬‬
‫‪7.‬‬ ‫;]‪char lap_serial [20‬‬ ‫ضد‬ ‫>> ‪cin‬‬ ‫ز اخ‬
‫; ‪8. } x‬‬ ‫ددم ددذ م ددا‬ ‫د د سد‬ ‫د‬ ‫سد د ج‬
‫) ( ‪9. void main‬‬ ‫دذ د دا‬ ‫سد ما‬ ‫ذ اخ‬ ‫مز ي‬
‫{ ‪10.‬‬ ‫دج‬ ‫م‬ ‫س ما ‪،‬‬ ‫حم ي م ا خ‬
‫‪11.‬‬ ‫; "‪cout << "Enter your laptop name :‬‬ ‫‪.‬‬ ‫م‬
‫‪12.‬‬ ‫; ‪cin >> x . lap_name‬‬

‫‪13.‬‬ ‫; "‪cout << "Enter your laptop price :‬‬ ‫د‬ ‫خ د‬ ‫د‬ ‫د‬ ‫د‬ ‫د‬ ‫–‬ ‫م د‬
‫‪14.‬‬ ‫; ‪cin >> x . lap_price‬‬ ‫‪.‬‬ ‫س‬ ‫ا‬ ‫ذ‬ ‫س ما‬

‫‪15.‬‬ ‫; "‪cout << "Enter your laptpp serial :‬‬ ‫د س سد س ز د‬ ‫د‬ ‫اظ ة ‪ :‬ددا خد‬
‫‪16.‬‬ ‫; ‪cin >> x . lap_serial‬‬ ‫ددا‬ ‫د‬ ‫أ صد ي س ز د د يد م د‬
‫دد يدد‬ ‫اخ دد‬ ‫دددم‬ ‫صدددم اخ دد‬ ‫دددا‬
‫‪17.‬‬ ‫;"‪cout << endl << x.lap_name << "\t‬‬
‫‪18.‬‬ ‫;"‪cout << x . lap_price <<"\t‬‬ ‫د د‬ ‫د‬ ‫سا ا اخ س س‬ ‫م‬
‫‪19.‬‬ ‫; ‪cout << x . lap_serial‬‬ ‫مي خ م د‬ ‫سس‬ ‫م م‬
‫د مد د س مد‬ ‫د‬ ‫د‬ ‫ز‬ ‫ي‬
‫‪20.‬‬ ‫;)(‪getch‬‬ ‫‪.‬‬ ‫س‬ ‫ا‬ ‫ا‬ ‫ي‬
‫} ‪21.‬‬
sizeof ()‫داضةػسحصػحجمػاضطتغغراتػ‬
. ‫ذ ا‬ ‫م ي‬ ‫م‬ ‫مم ذ‬ ‫م ذ‬ ‫ذ ا‬ ‫س ما‬

. ‫صح ح‬ ‫غ‬ ‫ظج‬ ‫ج غ‬ ‫ث‬

1. #include <iostream.h>
2. #include <conio.h>
3. //------------------------------A
4. void main ( )
5. {
6. int x=9;
7. cout << "The size of Integer is : " << sizeof (x);
8. getch ( );
9. }

. ‫ح‬ ‫غ‬ ‫ظج‬ ‫ج غ‬ ‫ث‬

1. #include <iostream.h>
2. #include <conio.h>
3. //------------------------------A
4. void main ( )
5. {
6. float x=9;
7. cout << "The size of float is : " << sizeof (x);
8. getch ( );
9. }

.‫ف‬ ‫ح‬ ‫غ‬ ‫ظج‬ ‫ج غ‬ ‫ث‬

1. #include <iostream.h>
2. #include <conio.h>
3. //------------------------------A
4. void main ( )
5. {
6. double x=9;
7. cout << "The size of double is : " << sizeof (x);
8. getch ( );
9. }
.‫ف‬ ‫صح ح‬ ‫غ‬ ‫ظج‬ ‫ج غ‬ ‫ث‬

1. #include <iostream.h>
2. #include <conio.h>
3. //------------------------------A
4. void main ( )
5. {
6. long x=9;
7. cout << "The size of long is : " << sizeof (x);
8. getch ( );
9. }

. ‫غ‬ ‫ظج‬ ‫ج غ‬ ‫ث‬

1. #include <iostream.h>
2. #include <conio.h>
3. //------------------------------A
4. void main ( )
5. {
6. bool x;
7. cout << "The size of bool is : " << sizeof (x);
8. getch ( );
9. }

. short ‫غ‬ ‫ظج‬ ‫ج غ‬ ‫ث‬

1. #include <iostream.h>
2. #include <conio.h>
3. //------------------------------A
4. void main ( )
5. {
6. short x;
7. cout << "The size of short is : " << sizeof (x);
8. getch ( );
9. }

. char ‫ح ف‬ ‫غ‬ ‫ظج‬ ‫ج غ‬ ‫ث‬


1. #include <iostream.h>
2. #include <conio.h>
3. //------------------------------A
4. void main ( )
5. {
6. char x;
7. cout << "The size of char is : " << sizeof (x);
8. getch ( );
9. }

. string ‫غ‬ ‫ظج‬ ‫ج غ‬ ‫ث‬

1. #include <iostream.h>
2. #include <conio.h>
3. #include <string>
4. //------------------------------A
5. void main ( )
6. {
7. char x[]="yousef anaya";
8. cout << "The size of string is : " << sizeof (x);
9. getch ( );
10. }

‫صح ح ث ق فحص‬ ‫ص‬ ‫ف صف ف‬ ‫ج غ‬


. ‫شر‬ ‫ث‬ ‫ظج‬

. ‫ف‬ ‫ق‬ ‫أ‬ ‫ئ‬ ‫ظج‬ ‫ج غ‬


‫غة‬ ‫ ظة ف‬2 ‫ة‬ ‫ة‬ ‫ة‬ ‫ة ة‬ ‫ة‬ ‫ة‬ ‫ح‬ car ‫ف‬ : ‫ث‬
‫ة‬ ‫ح ة‬ ‫خة ة‬ ‫ف ئ‬ ‫صح ح ث‬ ‫غ‬ ‫ظ‬ ‫ث‬
‫ئ خ ؟‬ ‫ح‬ ‫ث‬

1. #include <iostream.h>
2. #include <conio.h>
3. struct car
4. {
5. char car_name[10];
6. float car_price;
7. int car_model;
8. } x , y ;
9. void main ( )
10. {
11. cout << "Enter your car name :" ;
12. cin >> x.car_name ;

13. cout << "Enter your car price :" ;


14. cin >> x.car_price ;

15. cout << "Enter your car model :" ;


16. cin >> x.car_model ;

17. strcpy (y.car_name , x.car_name ) ;


18. y.car_price = x.car_price ;
19. y.car_model = x.car_model;

20. cout << endl << y.car_name << "\t";


21. cout << y.car_price <<"\t";
22. cout << y.car_model ;

23. getch();
24. }
‫اظذاءػطصفوسهػطنػاضصائظات ػ‬

‫؟‬ ‫ج د ‪ ،‬د ذ سد‬ ‫دم د‬ ‫ا‬ ‫‪،‬‬ ‫م‬ ‫س خص ج‬ ‫س‬ ‫زز اس‬ ‫م‬
‫ةدئ‬ ‫جد ‪،‬ي دذ د س د‬ ‫د‬ ‫دا د‬ ‫اخم ؟ ذ يد د د دا‬ ‫ا‬ ‫ج‬ ‫مف ذ‬ ‫س‬
‫د د د سد ‪ ،‬ي دذ‬ ‫دج‬ ‫د‬ ‫ةد ء د‬ ‫د‬ ‫دا دا اسسد يدا د‬ ‫د ج د ا ‪ 555‬د ج‬ ‫‪55‬‬
‫د‬ ‫د د ةد ‪ ،‬سد‬ ‫صد ي‬ ‫ج د ي د جد‬ ‫م ف ا دم د‬ ‫ا ‪ ،‬ا ص‬ ‫ص‬ ‫م‬
‫ص ي ‪.‬‬ ‫م‬ ‫ج‬ ‫ةء اا‬ ‫م‬
‫د‬ ‫د‬ ‫د‬ ‫جد‬ ‫مددز‬ ‫س د ي ددف س د‬ ‫صددم‬ ‫د‬ ‫د‬ ‫صد ي‬ ‫د د‬ ‫د سد‬
‫د‬ ‫سد‬ ‫صدم‬ ‫د‬ ‫ص ي‬ ‫س أ‬ ‫س ج‬ ‫مز‬ ‫م ‪،‬‬ ‫م‬
‫أ س ج ‪.‬‬ ‫ج‬

‫ج‬ ‫ةء ص ي‬ ‫‪.‬ي خ‬ ‫س‬ ‫ج‬ ‫ةء ص ي‬ ‫ف‬


‫د‬ ‫ص ي ] [‪،‬‬ ‫ا‬ ‫ص ي أ‬ ‫ا ة ء ج مي‬ ‫ةء ج ‪،‬‬ ‫سخ‬
‫دم‬ ‫د س ا خد‬ ‫د د أ‬ ‫صد ي ج د ي د‬ ‫‪،‬‬ ‫ا‬ ‫ذ ما ةج‬ ‫ج‬ ‫ا‬
‫د دا س ‪for‬‬ ‫د دا س ذ سد ما‬ ‫صدم } {‬ ‫ا س ض‬ ‫س ‪،‬‬ ‫ج س ‪ ،‬ذ‬
‫ا سد‬ ‫دا دم ء دا س ‪ ،‬د‬ ‫دذ‬ ‫د سد‬ ‫م‬ ‫ا‬ ‫ا س ‪ ،‬ذ‬ ‫ا ‪ ،‬صم‬
‫د‬ ‫د‬ ‫دذ‬ ‫صد س د ] [ ‪،‬‬ ‫دم د دا س‬ ‫د‬ ‫ا س ‪،‬‬ ‫حم خ‬ ‫ا ج‬
‫ذ ‪:‬‬ ‫س م‬ ‫س‬ ‫س ما‬

‫ئ‬ ‫[‬ ‫‪ ].‬غ‬ ‫ج‬ ‫غ‬ ‫;‬

‫ص ي‬ ‫ي‬ ‫اخم‬ ‫ا اخ‬ ‫س‬ ‫ذ‬


: ‫ة‬ ‫غ‬ ‫ ح ث ح‬، Telephone Directory ( ‫ف‬ ‫ف‬ : ‫ث‬
‫ة صةح ح‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ قة‬، douple ‫ف ة ة‬ ‫ ق‬،‫ ظ ف‬2 (
‫ة حة‬ ‫ثة‬ ‫ة‬ ‫ئة‬ ‫ ثة ة ف صةف ف ة‬، ‫ ظة ف‬2 ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬
‫ئ ؟‬ ‫خ خ صف ف‬ ‫ئ ا‬ ‫ح‬ ‫أ‬ ‫ش‬ ‫ئ‬
1. #include <iostream.h>
2. #include <conio.h>
3. struct Telephone_Directory
4. {
5. char name[20];
6. double tel_number ;
7. int person_number ;
8. char person_address [20];
9. } x [ 3 ] ;
10. void main ( )
11. {
12. for (int i=0;i<3;i++)
13. {
14. cout << "Enter yor name :" ;
15. cin >> x [ i ] . name ;

16. cout << "Enter your phone number :" ;


17. cin >> x [ i ] . tel_number ;

18. cout << "Enter your number :" ;


19. cin >> x [ i ] . person_number ;

20. cout << "Enter your address :" ;


21. cin >> x [ i ] . person_address ;
22. cout << endl<< endl;
23. }

24. cout << "name" <<"\t" << "tel_number" << "\t" << "person_number" << "\t" << "person_address" << endl;
cout << "------------------------------------------------------";

25. for (int i=2 ; i>=0;i--)


26. {
27. cout << endl << x [ i ] . name << "\t";
28. cout << x [ i ] . tel_number <<"\t\t";
29. cout << x [ i ] . person_number <<"\t\t" ;
30. cout << x [ i ] . person_address ;
31. }
32. getch();
33. }

. ‫ض‬ ‫ ف‬for ‫ا س‬ ‫ص‬ ‫ا‬ ‫م‬ ‫ف‬ ‫اس‬ ‫زز‬ ‫ا‬


‫د ف ‪ Telephone_Directory‬د ض د ا دداس س د س د‬ ‫د‬ ‫د‬ ‫د م ددف س د م د‬ ‫يد م د‬
‫د د د‬ ‫دم ي دذ د جز‬ ‫دم‬ ‫د‬ ‫دم ا يد دا‬ ‫ذ‬ ‫م‬ ‫مف‬ ‫حم‬ ‫ا ذ‬
‫د ‪،‬ا د‬ ‫د‬ ‫دم‬ ‫دذ د‬ ‫سد‬ ‫س‬ ‫ذ‬ ‫–‬ ‫ي م‬ ‫ء س م‬
‫د‬ ‫جد‬ ‫د‬ ‫د‬ ‫د‬ ‫صدم أ‬ ‫د‬ ‫د‬ ‫سد ‪ x‬د‬ ‫ج‬ ‫ةء ص ي‬ ‫س‬ ‫م‬
‫جد‬ ‫د دذ‬ ‫د‬ ‫د‬ ‫ج د سد‬ ‫ةء ص ي‬ ‫م‬ ‫ا ء م‬ ‫ا‬ ‫‪،‬‬ ‫م‬
‫‪ -‬ي د د خد د‬ ‫د‬ ‫صدم صد ي ا د م د‬ ‫م س‬ ‫س‬ ‫مي‬ ‫س‬ ‫م‬ ‫ا‬
‫جد أ‬ ‫د‬ ‫د سد مس‬ ‫ذ د ا دذ‬ ‫ي م‬ ‫صم‬ ‫ا س‬ ‫ج‬ ‫م‬
‫دا‬ ‫د ا د د د‬ ‫صم سد مس ي د‬ ‫ذ‬ ‫ا س ا‬ ‫ا‬
‫د‬ ‫د‬ ‫م ‪ .‬ا‬ ‫ما مس ي‬ ‫ا س‬ ‫صم‬ ‫حم ي ‪ ،‬ذ‬
‫ا د‬ ‫د‬ ‫دج‬ ‫د‬ ‫د‬ ‫م دا‬ ‫د سد‬ ‫د‬ ‫دج‬ ‫ذ‬ ‫ج‬ ‫ذ‬
‫صددم ا يد‬ ‫ذد ا س د‬ ‫صد ي ي د م د س د‬ ‫د‬ ‫د‬ ‫د‬ ‫دج‬ ‫د‬ ‫د‬ ‫د ا‬ ‫د‬
‫د م د‬ ‫خم خ‬ ‫ج‬ ‫ا س‬ ‫ا‬ ‫م س صم‪،‬ي‬ ‫ص‬ ‫ص ي‬
‫د‬ ‫–‬ ‫د م د‬ ‫سد‬ ‫م‬ ‫م صما‬ ‫م ا‬ ‫ص‬
‫س ‪.‬‬ ‫خ‬
: ‫غ‬ ‫ ح ث ح‬، Telephone Directory ( ‫ف‬ ‫ف‬ :. ‫ث‬
‫صح ح‬ ‫ ق‬douple ‫ف‬ ‫ ظ ف ق‬2 (
‫ئ‬ ‫ف صف ف خ‬ ‫ث‬ ‫ئ‬ ‫ف صف ف‬ ‫ث‬، 2
‫ث ؟‬ ‫صف ف ا ف ث‬ ‫خ ح‬ ‫حج‬ ‫ف‬
1. #include <iostream.h>
2. #include <conio.h>
3. struct Telephone_Directory
4. {
5. char name[20];
6. double tel_number ;
7. int person_number ;
8. char person_address [20];
9. } x [ 3 ] , y [ 3 ] ;
10. void main ( )
11. {
12. for (int i=0;i<3;i++)
13. {
14. cout << "Enter yor name :" ;
15. cin >> x[i].name ;
16. strcpy (y[i].name , x[i].name ) ;
17. cout << "Enter your phone number :" ;
18. cin >> x[i].tel_number ;
19. y[i].tel_number = x[i].tel_number ;
20. cout << "Enter your number :" ;
21. cin >> x[i].person_number ;
22. y[i].person_number = x[i].person_number ;
23. cout << "Enter your address :" ;
24. cin >> x[i].person_address ;
25. strcpy ( y[i].person_address , x[i].person_address );
26. cout << endl<< endl;
27. }
28. cout << "name" <<"\t" << "tel_number" << "\t" << "person_number" << "\t" << "person_address" <<
endl;
cout << "------------------------------------------------------";
29. for (int i=0 ; i<3;i++)
30. {
31. cout << endl << x[i].name << "\t";
32. cout << y[i].tel_number <<"\t\t";
33. cout << y[i].person_number <<"\t\t" ;
34. cout << y[i].person_address ;
35. }
36. getch();
37. }

. ‫ذ‬ ‫م س‬ ‫ا‬ ‫س‬ ‫س‬ ‫ي‬ ‫ةم‬ ‫ا‬


‫سدم يد‬ ‫ا د‬ ‫ج‬ ‫خ ص ي‬ ‫‪ ،‬ا‬ ‫ذ م‬ ‫ا‬ ‫ا‬ ‫سا‬
‫يد‬ ‫صدم‬ ‫خد‬ ‫د‬ ‫‪ ،‬س دا د‬ ‫‪-‬‬ ‫د يد م د‬ ‫ي دس د دا س‬ ‫ج‬ ‫ص ي‬
‫ج‬ ‫س أ‬ ‫م‬ ‫ص ي‬ ‫خ‬ ‫ص ي ا‬ ‫سخ‬ ‫اذ‬ ‫ا‪،‬‬ ‫ا‬
‫د س خ صد غ دم د دا س‬ ‫دذ يد‬ ‫ص ي‬ ‫صم اخ م ي‬ ‫ص ي ا‬ ‫ا ي‬
‫صد ي‬ ‫د ج اخ دم يد‬ ‫أ‬ ‫س‬ ‫م‬ ‫ص ي‬ ‫ج‬ ‫س ما اخ ‪،‬‬
‫د د خ د‬ ‫م د ا خد أ‬ ‫جد‬ ‫د‬ ‫س‬ ‫س‬ ‫ا‪ ،‬م‬
‫‪.‬‬ ‫م‬ ‫ا س‬ ‫ا‬ ‫س‬ ‫س‬ ‫ا‪.‬‬ ‫ذ س‬ ‫م‬ ‫اي ا‬

‫ردةػتراصغبػسيػبرظاطجػواحد ػ‬

‫د خدذ ي دم د ء دم د م د خد‬ ‫دا خد م د‬ ‫ةء م د‬ ‫س‬ ‫ا‬ ‫ا‬


‫د دا د ء‬ ‫د د‬ ‫د ء دم د م د ي د دس م د‬ ‫‪ ،‬خ د‬ ‫ج‬ ‫م‬
‫دس م د‬ ‫خم ي‬ ‫م‬ ‫ج‬ ‫م‬ ‫ج ي م‬ ‫م‬ ‫سخ‬ ‫خ‬ ‫‪،‬‬ ‫م‬
‫‪.‬‬ ‫س م‬ ‫ج خم‬ ‫ج‬ ‫ا‬

‫ة ‪2‬‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫‪(:‬‬ ‫غ‬ ‫‪ boy‬ح‬ ‫ف‬ ‫ث ‪:8‬‬
‫ثة ة ف‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫ة‬ ‫خة‬ ‫ة‬ ‫فة‬ ‫ة‬ ‫ة ف ةئ‬ ‫صح ح ‪ ،‬ث‬ ‫ظ ف‪ ،‬ق‬
‫ة ‪2‬‬ ‫ة‬ ‫ة‬ ‫ة شة ص ة ة‬ ‫ة ‪(:‬‬ ‫ة‬ ‫غة‬ ‫ة‬ ‫‪ person‬ح ة‬ ‫خ‬
‫ثة‬ ‫ئ‬ ‫ا ‪ boy‬خ‬ ‫ئ‬ ‫خ ح‬ ‫صح ح ‪ ،‬ث‬ ‫ظ ف‪ ،‬ق‬
‫‪ person‬؟‬

‫>‪1. #include <iostream.h‬‬ ‫د‬ ‫–‬ ‫ددا س ي د م د‬ ‫ا د ز ددز‬


‫>‪2. #include <conio.h‬‬ ‫–‬ ‫د ‪ boy‬د ي د م د‬ ‫دء م د ا‬
‫‪3. struct boy‬‬
‫م دد‬ ‫دد ‪ person‬أ‬ ‫دد‬ ‫دد دد ء م دد‬
‫{ ‪4.‬‬
‫‪5.‬‬ ‫;]‪char name[20‬‬ ‫مي د د م د د ج‬ ‫م‬
‫‪6.‬‬ ‫; ‪int number‬‬ ‫ي دد دددس‬ ‫م دد‬ ‫دد دد‬ ‫دد يدد م دد‬
‫; ‪7. }x‬‬ ‫دج‬ ‫د‬ ‫سدخ‬ ‫سد أ‬ ‫حدم‬ ‫م‬
‫‪8. struct person‬‬ ‫دددا سدددخ‬ ‫دد دد دددس م دد‬ ‫اخدددم دد دددس م‬
‫{ ‪9.‬‬ ‫خم ‪.‬‬ ‫م‬ ‫ج خم‬ ‫م‬ ‫ج‬
‫‪10.‬‬ ‫;]‪char name[20‬‬
‫‪11.‬‬ ‫; ‪int number‬‬
‫; ‪12. }y‬‬
‫) ( ‪13. void main‬‬
‫{ ‪14.‬‬
‫‪15.‬‬ ‫; "‪cout << "Enter your name :‬‬
‫‪16.‬‬ ‫;‪cin >> x.name‬‬
‫‪17.‬‬ ‫;) ‪strcpy ( y . name , x.name‬‬
‫‪18.‬‬ ‫; "‪cout << "Enter your number :‬‬
‫‪19.‬‬ ‫; ‪cin >> x . number‬‬
‫‪20.‬‬ ‫; ‪y . number = x.number‬‬
‫‪21.‬‬ ‫; "‪cout << endl << "name" << "\t" << "number‬‬
‫‪22.‬‬ ‫;"‪cout << endl << "----------------‬‬
‫‪23.‬‬ ‫; ‪cout << endl << y.name << "\t" << y.number‬‬
‫‪24.‬‬ ‫;)( ‪getch‬‬
‫} ‪25.‬‬
‫ترصغبػغحتويػرضىػطتغغرػعوػصائنػطنػترصغبػاخرػ ػ‬

‫‪.‬‬ ‫خم‬ ‫م‬ ‫ج‬ ‫م‬ ‫ذ‬ ‫م‬ ‫م‬ ‫أ‬


‫م دف د ج د م د خد م د خدم ‪ ،‬د د‬
‫‪struct student‬‬
‫{‬ ‫س د‬ ‫س‬ ‫ا‬ ‫ذ‬ ‫ذ ج ؟‬
‫;] ‪char stu_name [20‬‬ ‫ا خ دد ؟ ا دد‬ ‫دد م دد ‪ ،‬دد ددف دد ةدد ء ددذ م دد‬ ‫دد‬
‫;] ‪char stu_father_name [20‬‬ ‫دذ م د‬ ‫د‬ ‫د‬ ‫د‬ ‫ء م د سد‬ ‫س‬ ‫زز اس‬
‫;] ‪char stu_mother_name [20‬‬ ‫ئة‬ ‫ة‬ ‫ة ا‬ ‫ة ا‬ ‫( ا ة‬ ‫د‬ ‫د‬ ‫ددم‬ ‫د‬
‫;] ‪char stu_family_name [20‬‬ ‫د س‪ ،‬د س د‬ ‫ا د ‪ ،‬ا د ةد‬ ‫د‬ ‫ا‬ ‫م‬
‫; ‪float age‬‬
‫د ‪(:‬‬ ‫د‬ ‫دم‬ ‫د‬ ‫د‬ ‫دف د‬ ‫د‬ ‫خدم‬ ‫ء م‬
‫;‪float mark1‬‬
‫;‪float mark2‬‬ ‫د‬ ‫ددم ‪ ،‬يا د‬ ‫دس‬ ‫ئة ‪،‬‬ ‫ة‬ ‫ة ا‬ ‫ة ا‬ ‫ا ة‬
‫;‪float mark3‬‬ ‫د ‪:‬‬ ‫د‬ ‫م د ةد م ي د خصد ج‬ ‫ددذ‬ ‫ز ددز ددا س‬
‫;‪float mark4‬‬ ‫دم‬ ‫د م دف دذ‬ ‫ئة ‪،‬يد‬ ‫ا‬ ‫ا‬ ‫ا‬
‫;‪float mark5‬‬ ‫دم‬ ‫د سد خذ د‬ ‫م د خد م د‬ ‫ا‬ ‫خ م‬
‫;‪float mark6‬‬ ‫س ذ‬ ‫ةم‬ ‫م‬ ‫م‬ ‫ا‬ ‫‪ ،‬ذ ذ‬ ‫م‬ ‫ي‬
‫;‪float mark7‬‬
‫ذ م‬ ‫ي‬ ‫ذ م‬ ‫ة م ‪ ،‬ي س مس‬ ‫مص ج‬
‫;‪float mark8‬‬
‫;}‬ ‫م دف‬ ‫د‬ ‫د‬ ‫م د سد‬ ‫م م د سدم د‬ ‫م‬ ‫؟ي‬
‫سد ا سد‬ ‫اسد سد ا‬ ‫م‬ ‫ةم ي‬ ‫ذ مص‬
‫ذ مصد ج ‪ ،‬د د د‬ ‫ذ‬ ‫خ م‬ ‫ذ م‬ ‫ةء ج‬ ‫خم ‪،‬‬ ‫‪،‬ي م‬ ‫ج‬
‫د ج خد م د‬ ‫د سد م د د‬ ‫دا ي د ‪ ،‬د‬ ‫دم‬ ‫أ‬ ‫خ م‬ ‫م‬ ‫مف ذ‬
‫خم ‪.‬‬ ‫مي م‬ ‫س‬ ‫م‬ ‫ج‬ ‫ا ة‬ ‫ذ‬ ‫م ‪،‬‬ ‫س‬ ‫يص‬

‫‪:‬‬ ‫ذ‬ ‫ا‬ ‫خذ‬


name ‫ة‬ ‫ئ‬ ‫ق‬ : ‫غ‬ ‫ ظ ث ح‬student ‫ف‬
. ‫ ا‬8 ‫ ح‬mark ‫ئ خ‬ ، ‫ئ‬ ‫ا‬ ‫ا‬ ‫( ا‬ ‫ح‬

1. struct name ‫د‬ ‫د م د اس د‬ - ‫د‬ ‫ا د ز ددز ددا س م د‬


2. { – ‫د م د‬ ‫ا د‬ ‫ي د م د‬ ‫د‬ ‫د‬ ‫م د‬
3. char first_name [ 20 ];
‫ي د سد‬ ‫د د د م د سد‬ ‫ د‬، ‫د‬ ‫ي د م د‬
4. char fater_name [ 20 ];
5. char mother_name [ 20 ]; ‫يد م د‬ ‫ م د‬x ‫د‬ ‫ةد ء د ج د‬ name ‫م‬
6. char family [ 20 ]; ‫دم‬ ‫ ي دذ‬، y ‫د د‬ ‫حء ج د‬ mark ‫ا‬
7. }; ‫د‬ ‫دم‬ ‫د‬ ‫ د‬student ‫م‬ ‫أ‬ ‫م‬ ‫ج‬
8. struct mark ‫م‬ ‫ذ‬ ‫ف‬ ‫خم‬ ‫م‬ ‫ج‬
9. { ‫ ا ج د ميد خد م د‬name mark ‫يد م د‬
10. float mark1;
‫د م د‬ ‫ددم‬ ‫د‬ ‫ د ددذ م ددف د د‬، student
11. float mark2;
12. float mark3; ‫د‬ ‫دم دذ م دا‬ ‫د د سد‬ ‫ج‬ ‫س‬
13. float mark4; ‫د صد د م د‬ ‫ا خ د ا ددم س د أ‬ ‫د ي د ددذ م د‬
14. float mark5; ‫دد ج مدد ص دد دد دد م دد‬ ‫ دد م دد‬student ‫دد‬ ‫مدد س‬
15. float mark6; ‫د ج مد ص د‬ ‫مي ا خ د م د‬ ‫اخ‬ ‫م‬ ‫مس‬
16. float mark7; ‫د‬ ‫د‬ ‫س د ج مد س‬ ‫ أ‬mark name ‫م‬
17. float mark8;
‫دم‬ ‫د د سد‬ ‫مس‬ ‫خ م‬ ‫ج ذ ةأ‬ ‫س‬
18. };
19. struct student : ‫ذ‬ ‫ذ ما‬
20. {
21. int student_number; cin >> w . x . first_name ;
22. float student_age; cin >> w . y . mark1 ;
23. name x;
24. mark y;
25. } w;

‫م‬ ‫س‬ ‫اخ‬ ‫م‬ ‫ج‬ ‫س‬ ‫ا‬ ‫ ي‬student ‫م‬ ‫ج‬ w ‫ج‬
. ‫ذ ما‬
‫صغفغهػاضوصولػوطعاضجةػطتغغراتػاضترصغبػاضداخضيػ‪ :‬ػ‬
‫‪A,‬‬ ‫صا‬ ‫ا س ا‬ ‫ذ‬ ‫ة‬ ‫اخ‬ ‫م‬ ‫‪،‬ي‬ ‫اس‬ ‫زز‬
‫صد ا ‪A‬‬ ‫د‬ ‫صا ‪B‬اا‬ ‫خ صا ‪A‬ي ا ما‬ ‫‪ B‬صا ‪B‬‬
‫د‬ ‫د م د‬ ‫‪B‬‬ ‫د ‪A‬‬ ‫اخ ي‬ ‫ي م‬ ‫ذ‬ ‫صا ‪،B‬‬ ‫ص‬ ‫ا‬
‫د‬ ‫" دذ‬ ‫ج‬ ‫"‬ ‫ا‬ ‫ص‬ ‫ج‬ ‫ي‬ ‫ذ ص‬
‫ذ ‪.‬‬ ‫ذ‬ ‫ا‬ ‫صا اا‬ ‫ي ا ما ص‬
‫د ددا د‬ ‫ددم أ‬ ‫د م د‬ ‫د سد د ج‬ ‫ا د‬ ‫م د ددا خ‬ ‫د‬ ‫د‬ ‫د‬ ‫ي ددا‬
‫صد ا اخدم د‬ ‫د دج د‬ ‫د‬ ‫ص د‬ ‫صا ‪،‬‬ ‫م‬ ‫صا‬
‫س‬ ‫ص م‬ ‫صا‬ ‫اي‬ ‫ذ‬ ‫اخ‬ ‫م‬ ‫م‬ ‫ج ذ‬ ‫س‬
‫س ‪.‬‬ ‫مء‬ ‫اخ‬ ‫م‬ ‫ا ص‬ ‫ذ‬ ‫م ذ ما‬

‫د‬ ‫م‬ ‫س‬ ‫م‬ ‫ا‬ ‫مس‬ ‫مأ‬ ‫ا م‬ ‫اخ‬ ‫ا ز ض م‬ ‫ا‬


‫د‬ ‫ي دا ا خ د م د‬ ‫مد س‬ ‫م‬ ‫م‬ ‫س‬ ‫مس‬ ‫م‬ ‫اخ س‬ ‫م‬ ‫اس ي‬
‫يذ خ ‪.‬‬

‫>‪1. #include <__________.h‬‬


‫‪2. #.....‬‬
‫‪3. #.....‬‬
‫ا خ ‪4. struct s_name‬‬ ‫م‬
‫{ ‪5.‬‬
‫‪6.‬‬ ‫; ] ‪char father [ n‬‬
‫‪7.‬‬ ‫; ] ‪char father [ n‬‬
‫; ……… ‪8.‬‬
‫;} ‪9.‬‬
‫‪10. struct student‬‬ ‫مس‬ ‫م‬
‫{ ‪11.‬‬
‫‪12.‬‬ ‫; ‪s_name x‬‬
‫‪13.‬‬ ‫; ‪float avg‬‬
‫; ‪14. } y‬‬

‫ي ص ي‬ ‫ج‬ ‫**‬
‫مصص‬ ‫س‬ ‫س‬ ‫‪student‬‬ ‫س‬ ‫م‬ ‫م‬
‫اضداضةػحدابػطولػاضطصفوسةػ)( ‪strlen‬‬
‫ػاضداضةػ) ( ‪getline‬‬
‫بعدػاضظصفيػ ػ‬
‫غم د ‪،‬‬ ‫د د اصد‬ ‫س‬ ‫يم‬ ‫ا‬ ‫خم‬ ‫صا‬ ‫ا‬
‫دا‬ ‫صد ف سد ‪ ،‬أ د‬ ‫د‬ ‫خ م ف صد ف د‬ ‫ا‬ ‫زز اس‬ ‫ا‬
‫سد مد ص ‪ ، private‬ي م د‬ ‫خد‬ ‫د‬ ‫د‬ ‫م د‬ ‫دا‬ ‫دذ صد ف دذ‬ ‫ا‬ ‫س‬
‫سد‬ ‫د دمف د د‬ ‫د صد ف د‬ ‫س ا أ‬ ‫م صف ةم‬ ‫ا‬ ‫زز اس‬
‫دا د‬ ‫يد دا صد‬ ‫اس ء ا ‪ ،‬أ‬ ‫س س‬ ‫‪ ،‬ص ف خم‬ ‫س‬
‫د يد صد ف‬ ‫دذ ا د‬ ‫مف دء‬ ‫ي س‬ ‫م ‪،‬ي ا ما ةء ص‬ ‫س‬ ‫س‬
‫د‬ ‫خ م‬ ‫اخم‬ ‫اص‬ ‫‪،‬يم‬ ‫ج ي صف‬ ‫م‬ ‫ا‬
‫م‬ ‫ء ذ ا‬ ‫ي‬ ‫م‬ ‫خذ‬ ‫ج ‪،‬‬ ‫س‬ ‫اص‬ ‫م ‪،‬ي ي‬ ‫س‬
‫د س دذ ؟ ي دا يدم د د‬ ‫د اصد‬ ‫دا ذ د يد‬ ‫ذ ا ي د سد‬ ‫مءص‬ ‫ا‬ ‫س‬
‫دذ د ي م سد‬ ‫مد‬ ‫سم ي د ء‬ ‫ذ س‬ ‫ا ذ ة‬ ‫اس‬ ‫ا‬ ‫س‬
‫د ‪،‬ي د د د‬ ‫د‬ ‫اص‬ ‫ذ ا صا‬ ‫صا أ‬ ‫ا‬ ‫س ‪،‬ي ء‬ ‫ي ذ م‬
‫ذ ‪:‬‬ ‫خذ ا‬ ‫‪.‬‬ ‫خ اص‬ ‫ذ‬ ‫ا ي ‪،‬‬ ‫ء س ا م‬ ‫ي‬
‫ة‬ ‫ة‬ ‫ة‬ ‫‪ (:‬ا‬ ‫غ‬ ‫‪ person‬ح ث ح‬ ‫صف‬ ‫ث ‪:‬‬
‫ثة ة ف ة صة‬ ‫غة‬ ‫خ‬ ‫ص‬ ‫ف‬ ‫‪،‬ث‬ ‫ظ‬ ‫‪ 2‬ظ ف‪،‬‬
‫صف‪.‬‬ ‫ث شئ ئ ظ‬ ‫خ‬

‫دء‬ ‫خ د‬ ‫ا د ز ددز ددا س‬


‫>‪1. #include <iostream.h‬‬ ‫د سد‬ ‫د د‬ ‫د‬ ‫صد ف د س د‬
‫>‪2. #include <conio.h‬‬
‫ة ء أ صد ف ‪ ،‬د مصد ص‬ ‫ا‬
‫‪3. class person‬‬
‫{ ‪4.‬‬ ‫ي ددا د‬ ‫صددا يا د م د‬ ‫ددا‬
‫‪5.‬‬ ‫; ]‪char person_name [20‬‬ ‫دددددم ء‬ ‫ضددد د ددد د ذ دددددا‬ ‫م دددددف‬
‫‪6.‬‬ ‫; ‪float avg‬‬ ‫د ‪ ، public‬ي د خ د‬ ‫د‬ ‫يد‬
‫‪7.‬‬ ‫‪public :‬‬ ‫د س ‪friend‬‬ ‫د‬ ‫د ددم ء ‪ ،‬ض د‬
‫‪8.‬‬ ‫;)‪friend void read (person & x‬‬ ‫د صدا‬ ‫دذ ا د د‬ ‫ذ اا د د‬
‫‪9.‬‬ ‫;)‪friend void print (person x‬‬
‫د د‬ ‫د‬ ‫ددذ ص د ف ‪ ،‬د د‬
‫;} ‪10.‬‬
‫‪//---------------------------‬‬ ‫دددذ ا ددد ا‬ ‫ددد ‪ ،‬أ‬ ‫دددذ ا ددد غ دددم‬
‫)‪11. void read (person & x‬‬ ‫خددد‬ ‫ددد‬ ‫دددم‬ ‫صددد‬ ‫سددد‬
‫{ ‪12.‬‬ ‫ة ذ دف‬ ‫س ‪، private‬‬ ‫صفي‬
‫‪13.‬‬ ‫; " ‪cout << "Enter your name :‬‬ ‫صد د ف م صد د‬ ‫دد‬ ‫دد‬ ‫دد‬ ‫دد‬
‫‪14.‬‬ ‫;‪cin >> x . person_name‬‬ ‫س م ص ‪ private‬؟‬ ‫ي‬
‫‪15.‬‬ ‫;" ‪cout << "Enter your avg :‬‬
‫شةئ‬ ‫د د د‬ ‫د‬ ‫ي‬
‫‪16.‬‬ ‫;‪cin >> x .avg‬‬
‫} ‪17.‬‬ ‫ثة ة‬ ‫ئ‬ ‫صفف‬ ‫ئ‬
‫‪//---------------------------‬‬ ‫د‬ ‫" ذ‬ ‫" ص‬
‫)‪18. void print (person x‬‬ ‫س‬ ‫مي ي‬ ‫م‬ ‫ص‬ ‫س‬
‫{ ‪19.‬‬ ‫م د ص ‪ private‬خ د ص د ف ‪ ،‬ددذ م ددف‬
‫‪20.‬‬ ‫د‬
‫; ‪cout << "your name is : " << x . person_name << endl‬‬ ‫دا‬ ‫ا‬ ‫ي‬ ‫ا‬
‫‪21.‬‬ ‫; ‪cout << "your avg is : " << x . avg‬‬
‫س مص‪،‬‬ ‫م‬ ‫أ‬
‫} ‪22.‬‬
‫‪//---------------------------‬‬ ‫د دج ‪،‬ي د‬ ‫حددم ي د ذ د‬ ‫د‬
‫) ( ‪23. void main‬‬ ‫ةد ء د ج يد ا د مج سد ‪،‬‬ ‫خ‬
‫{ ‪24.‬‬ ‫م م م د دم ء د ) ( ‪، read‬‬
‫‪25.‬‬ ‫;‪person opj‬‬ ‫د ) ( ‪ ، print‬ا د‬ ‫دم د‬ ‫ـــدـذ‬
‫م دددم‬ ‫دد‬ ‫‪ ،‬دد‬ ‫م دد‬
‫‪26.‬‬ ‫;)‪read (opj‬‬
‫ةئ‬ ‫ة‬ ‫غ‬ ‫ض (‬
‫‪27.‬‬ ‫;)‪print (opj‬‬
‫‪28.‬‬ ‫;)(‪getch‬‬ ‫ا د‬ ‫ا‬ ‫ا‬ ‫مم‬ ‫ذ‬
‫} ‪29.‬‬ ‫س ا ‪.‬‬
‫ددد سددد ا ء‬ ‫ي ددد م ددد‬
‫‪.‬‬ ‫ص ف ‪person‬‬ ‫مم ج‬ ‫صف‬ ‫صا‬ ‫ا‬
‫ة ا خة‬
‫اف‬ ‫مم‬ ‫مم‬ ‫ج س ذ ؟ ذ‬ ‫مم‬ ‫ا س‬
‫س ذ ؟‬ ‫س‬ ‫م خم ‪،‬‬ ‫ي س‬ ‫أ‬ ‫مس أ‬ ‫ار ‪ ،‬ي ا‬ ‫ف‬
‫ي‬ ‫‪،‬‬ ‫‪int‬‬ ‫م‬ ‫س‬ ‫‪ int‬ا ‪ ،‬ي ا‬ ‫ا‬ ‫مس‬ ‫ا‬ ‫أ‬
‫صد ف دذ مس د د ا د ‪،‬‬ ‫دس د‬ ‫دج د‬ ‫س‬ ‫ص ف ‪ ، person‬ي‬ ‫ج‬ ‫مم‬
‫د ج دذ مس د د‬ ‫سد‬ ‫ا ا‬ ‫اخ ا‬ ‫مم‬ ‫‪،‬ي‬ ‫م‬ ‫ا‬
‫صف‪.‬‬ ‫س‬ ‫ج‬ ‫ا مج س‬
‫ا‬ ‫‪ x‬ا ض‬ ‫ج‬ ‫س‬ ‫اخ‬ ‫مء‬ ‫ي ا ا‬ ‫م ‪،‬ا‬
‫د‬ ‫د‬ ‫ا د يد‬ ‫ا‬ ‫م‬ ‫ج‬ ‫مء م ف‬ ‫ج ‪ x‬ي ا صا‬ ‫مي‬ ‫‪،‬ي‬
‫مص ‪.‬‬ ‫خص ص‬ ‫‪ ،‬ذ ا‬ ‫ي خ‬
‫د‬ ‫يد‬
‫د دم ء د د دذ‬ ‫د ج يد‬ ‫د ضد حد س & د‬ ‫م د دذ‬ ‫سم م‬
‫د‬ ‫د‬ ‫د ا خد‬ ‫د يد‬ ‫‪ ،‬يسد‬ ‫اح س‬ ‫) ( ‪read‬‬ ‫مء‬ ‫ممي‬ ‫‪،‬‬
‫د د د د م دم د ج احد س ي د ا‬ ‫د ‪،‬أ‬ ‫دم‬ ‫اخ د خد‬ ‫مز د‬ ‫ج اح س ذ‬
‫دذ حد س & د‬ ‫سد‬ ‫ا ذ د ي دم‬ ‫صف‪ ،‬ذ س‬ ‫م‬ ‫اخ‬ ‫م‬ ‫اخ‬ ‫مز‬
‫ا خد‬ ‫د سد م‬ ‫د‬ ‫خ‬ ‫س ا ي خ‬ ‫ذ‬ ‫ذ‬ ‫ذ خ صفي خ‬
‫اخ د د‬ ‫د‬ ‫د دذ م ‪ ،‬دذ د‬ ‫د د ةد ج‬ ‫‪،‬أ‬ ‫دس د د خ د‬ ‫ي‬ ‫‪،‬‬
‫ذ ‪.‬‬ ‫يا‬ ‫م ي صف‪،‬‬ ‫مز ي‬

‫ء س ا د د دس‬ ‫ةء س ‪،‬‬ ‫ف‬ ‫ا ة ء ذ ا صا ‪ ،‬س س‬


‫د‬ ‫‪،‬يد خ د‬ ‫–‬ ‫د‬ ‫‪،‬ا د م د‬ ‫دم ء‬ ‫ء س‬ ‫ف‬ ‫م‬ ‫‪،‬‬ ‫ء س ا‬
‫د ‪ friend‬ذ‬ ‫د د د ذ‬ ‫د د ا د ز‬ ‫د خ ددف‬ ‫خد صد ف‬ ‫ض د ددس د ذ ددذ ض د‬
‫د‬ ‫ي د ضد سد د ج دذ‬ ‫‪ ،‬د يد خ د‬ ‫خ د‬ ‫ي‬ ‫ض‬ ‫يذ خ ‪،‬‬ ‫ض‬
‫د د‬ ‫دم دذ د‬ ‫د د سد‬ ‫د ضد‬ ‫اخ ‪،‬‬ ‫س ‪،‬ف ف‬ ‫م م اح س‬ ‫مم‬
‫صف‪.‬‬
‫دج ي د ا‬ ‫د‬ ‫–‬ ‫م‬ ‫ي‬ ‫اخ‬ ‫سي م‬ ‫ي ء س‬ ‫س ا‬
‫اح س ‪.‬‬

‫ة ء خد‬ ‫ج ذ‬ ‫س‬ ‫س ا ا‬ ‫س‬ ‫حم ذ‬ ‫ا‬


‫د د خص صد‬ ‫د‬ ‫ددا د ي د سد‬ ‫د د‬ ‫ددا يد ذ د‬ ‫د ‪ opj‬سد ‪ x‬؟ ي ددم‬ ‫ا د مج سد‬
‫ا د‬ ‫ئ ة ‪،‬أ‬ ‫ة‬ ‫ج ة ة‬ ‫ف‬ ‫مص ي س ‪،‬‬
‫ص‬ ‫ي س ‪،‬‬ ‫ا ذ خم‬ ‫ا م‬ ‫م‬ ‫مج س‬
‫د د‬ ‫دمس د ج ا د‬ ‫د‬ ‫‪ ،‬ي د ا د صدا‬ ‫م د‬ ‫ة ‪،‬ا د‬ ‫ف‬
‫س ‪. opj‬‬ ‫ةأ ي ا مج س‬

‫ة‬ ‫اة‬ ‫ضة ‪::‬‬ ‫ة‬ ‫ئ ة خة ص ج ة صة ف ف ة ة‬ ‫ة‬ ‫ة ق‬ ‫ة صة‬ ‫ة ‪ :‬فة‬ ‫اظ‬


‫ر‬ ‫ف‬ ‫ق‬ ‫صفف‬ ‫ص‬ ‫أ‬ ‫ا‬
‫صة ف‬ ‫خة‬ ‫فة‬ ‫ة‬ ‫ة خة ص صة ف ة ‪ friend‬ف ة‬ ‫ة ة ص ة‬ ‫ة فة‬ ‫ا ج‬
‫‪.‬‬ ‫اظ‬ ‫صف‬ ‫خ‬ ‫ج‬ ‫ق‬ ‫ج‬
‫ارة‬ ‫ة‬ ‫ة‬ ‫جة‬ ‫ةق ة صة‬ ‫أ ق ة ة‬ ‫ة خة‬ ‫خ‬ ‫‪:‬‬ ‫اظ‬
‫‪.‬‬ ‫قص‬ ‫غ‬ ‫أ ق‬ ‫ح‬

‫تضخغصػ‪ :‬ػ‬
‫‪.1‬ػاضداضهػاضصدغقهػرظدػادتدرائكاػغجبػانػظطررػضكاػصائنػطنػظفسػاضصظفػاضتىيػتصىونػصىدغقهػضىهػ‪،‬ػحغىثػانػاضداضىهػ‬
‫اضصدغقهػعيػداضهػزغرػػػػطظتطغهػأيػاػتدتطغدػاضوصولػاضىػاضطتغغراتػاضطظتطغهػضضصظفػبذصلػطباذرػااػرىنػطرغىقػ‬
‫صائنػ‪ .‬ػ‬
‫‪.2‬ػرظىىدػاظذىىاءػداضىىهػشىىراءهػصىىدغقه ػايػصىىظفػغجىىبػانػغصىىونػتطرغىىرػاضصىىائنػػبااذىىارهػوذضىىكػضحفىىظػاضقىىغمػداخىىلػ‬
‫اضطتغغراتػاضطظتطغهػضضصظفػ‪ .‬ػ‬
‫‪. 3‬ػسيػحالػوجودػاصثرػطنػداضهػصدغقهػسإدمػاضصائنػاضططررػضكاػضىغسػضىهػأيػراشىهػ‪،‬ػباضىدوالػااخىرىػوانػتذىابهػ‪،‬ػأيػ‬
‫باطصاظظاػادتخدامػظفسػادمػاضصائنػاوػاضعاطلػاضططرػسيػجطغدػاضدوالػحتىػاضداضهػاضرئغدغهػ‪ .‬ػ‬
‫‪.4‬ػغطظدػطظعاػباتاػاعاسهػاضصضطهػ‪friend‬ػسيػظطوذجػاضبظاءػاضخارجيػضضداضهػاضصدغقهػأيػاضذيػظبظغهػخارجػاضصظفػ‪ .‬ػ‬
‫‪.5‬ػشضبػاضبرظاطجػعوػاضداضىهػاضرئغدىغهػ) ( ‪main‬ػ ‪،‬ػأيػانػتظفغىذػاضصىودػاضبرطجىيػغبىداػطىنػاولػجطضىهػسىيػعىذهػاضداضىهػ‬
‫وغظتكيػباخرػجطضهػسغكاػ‪ .‬ػ‬
‫ػ‬
‫تطرغنػ‪:‬ررفػصظفػادطهػ‪TV‬ػ‪،‬ػبحغثػغحتويػرضىػاضطتغغراتػاضطظتطغهػاضتاضغىهػ‪:‬ػ(ػادىمػاضتضفزغىونػوػصىذضكػ‬
‫دعرهػبحغثػغصونػادمػاضتضفزغونػعوػ‪sony‬ػوصذضكػدعرهػ‪5111‬ػسيػداضهػصدغقهػوضغسػرىنػطرغىقػبظىػاءػ‪،‬ػأيػارغىدػ‬
‫انػتدظدػعذهػاضعواطلػاضتضقائهػرنػطرغقػداضهػصىدغقهػ‪،‬ػ ثىمػاظذىكػصىائنػواحىدػسقىطػسىيػاضداضىهػاضرئغدىغهػ‪،‬ػواطبىدػ‬
‫اضقغمػرنػطرغقػداضهػصدغقهػاغعاػ‪ .‬ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫د‬ ‫د‬ ‫دا‬ ‫د‬ ‫د‬ ‫دم د صد ف ‪،‬‬ ‫ا د يد‬ ‫د‬ ‫ا د‬ ‫م‬ ‫زز اس ‪،‬ي‬
‫د د‬ ‫‪ ،‬ي دذ دا‬ ‫س ا‬ ‫خص صف س ‪ ،‬ذ‬
‫د ا د ةد م‬ ‫دم د صد ف‬ ‫م ص ص ف س ‪ ،‬د يد د د دا‬ ‫صا يا‬
‫دف دا م د د د س‬ ‫دذ دا يد دا صد‬ ‫ام اأ‬ ‫س س‬ ‫ف ذ‬ ‫س س‬
‫د‬ ‫أ‬ ‫خ ص‬ ‫ء ا‬ ‫ي‬ ‫يم‬ ‫ا ص‬ ‫صا‬ ‫ةء‬ ‫ي‬ ‫س‬ ‫أ‬
‫صف ذ د‬ ‫ج‬ ‫ذ ا س مس‬ ‫أ‬ ‫خ ا ص‬ ‫م‬ ‫ا‬ ‫ء س ا م‬
‫خد‬ ‫د ذ ا د صدا‬ ‫دم‬ ‫ةء صف ا‬ ‫ا‬ ‫مي‬ ‫حم س‬
‫ذ د ا دذ ا د‬ ‫ذ د خد صد ف د ج د صد ف ا د د ج د صد ف د‬ ‫دم‬ ‫صف ا‬
‫د‬ ‫دا دا م د د دذ‬ ‫ةد يد م‬ ‫د‬ ‫‪ ،‬د‬ ‫ي ا صد‬ ‫س‬ ‫ص‬
‫ا د‬ ‫ا د ذ ا د صدا سد ا د ا د‬ ‫ا ص‬ ‫س مي‬ ‫ا‬ ‫ي‬
‫دا دذ ةد‬ ‫د‬ ‫د خ د دذ‬ ‫ذ ج أ ح ء‬ ‫ا‬ ‫صفغم م أ‬ ‫س ج‬
‫سد‬ ‫صف ا ‪،‬‬ ‫ذ ص ف اخم ا‬ ‫أ‬ ‫ة‬ ‫سس‬
‫دا د‬ ‫د دج‬ ‫داخ‬ ‫م ف ا صدا ا خ د د س ي دم ا د ا د أ د د‬ ‫ي‬ ‫صف‬
‫م ‪.‬‬ ‫صف‬ ‫صف ا‬

‫صورةػتوعغحغهػ‪ :‬ػ‬

‫ددد ددددا صددد‬ ‫ا ددد ز ددددز ددددا س‬


‫مي د خ د ص د ف‬ ‫ددا ا د صددا‬ ‫ددم‬
‫‪ first‬ي دد ا دد دد ددذ صدد ف ددذ دد م ددم‬
‫د‬ ‫دا م د د د‬ ‫دم‬ ‫س‬ ‫ي‬
‫ددا‬ ‫ص د ف د ‪ secand‬ددم‬ ‫د‬ ‫اس د‬
‫دد‬ ‫دد‬ ‫دد خ دد‬ ‫صد د ف ا ي د د‬
‫م ف ء صد ف ا‬ ‫ذ صف‬
‫د‬ ‫ددا د‬ ‫د‬ ‫د ي س سد م د‬ ‫ددذ‬
‫ذ ‪:‬‬ ‫ذ‬ ‫س‬
‫; ‪class secand‬‬
‫ضدد‬ ‫ددا دد‬ ‫ا دد ز ددز ددا س‬
‫د صد ف ا ي دا دا‬ ‫ذ صف‬
‫د ذ‬ ‫ددا ددذ‬ ‫م د د ي د صد‬ ‫ددم‬
‫ا سد‬ ‫د‬ ‫دا صد ف دذ اسد‬ ‫ي‬
‫حدددم‬ ‫ددد دددا ددد ذ‬ ‫صددد‬ ‫ددد‬
‫خ ‪.‬‬ ‫ا‬
‫ددم ددم‬ ‫د صد‬ ‫د خددذ د ا د ذ د‬
‫ض ‪:‬‬
‫>‪1. #include <iostream.h‬‬ ‫طثىىالػ‪:‬ػرىىرفػصىىظفغنػاىىاولػادىىطهػ‪TV‬ػ‬
‫>‪2. #include <conio.h‬‬
‫; ‪3. class radio‬‬ ‫بحغثػغحتويػرضىػاضطتغغراتػاضطظتطغهػاضتاضغهػ‬
‫‪//-------------------------------------------------------------- 1‬‬
‫‪4. class TV‬‬ ‫‪:‬ػ(ػاادمػطنػظوعػدضدضهػرطزغهػطوضكاػ‪21‬ػحرفػ‪،‬ػ‬
‫{ ‪5.‬‬
‫‪6.‬‬ ‫;]‪char TV_name [20‬‬ ‫واضثاظيػاضدعرػطنػظوعػرددػحقغقيػ)ػ‪،‬ػثمػررفػ‬
‫‪7.‬‬ ‫; ‪float price‬‬
‫‪8. public :‬‬ ‫صىىىظفػاخىىىرػادىىىطهػ‪radio‬ػػبحغىىىثػغحتىىىويػرضىىىىػ‬
‫اضطتغغراتػاضطظتطغهػاضتاضغهػ‪:‬ػ(ػاادىمػطىنػظىوعػ‬
‫‪9.‬‬ ‫;)& ‪friend void rest (TV &, radio‬‬
‫‪10.‬‬ ‫;)& ‪friend void read (TV &, radio‬‬
‫دضدضهػرطزغهػطوضكاػ‪21‬ػحىرفػ‪،‬ػواضثىاظيػاضدىعرػ‬
‫‪11.‬‬ ‫;) ‪friend void print(TV , radio‬‬
‫;} ‪12.‬‬
‫طنػظىوعػرىددػحقغقىيػ)ػ‪،‬ػثىمػرىرفػداضىهػصىػدغقهػ‬
‫‪//-------------------------------------------------------------- 2‬‬
‫‪13. class radio‬‬
‫ضادخىىىالػوداضىىىهػصىىىدغقهػضضطبارىىىهػورىىىرفػداضىىىهػ‬
‫{ ‪14.‬‬
‫‪15.‬‬ ‫;]‪char radio_name [20‬‬
‫صدغقهػتقومػبوعدػشىغمػصىفرغهػوضغدىتػبظىاءػ‬
‫‪16.‬‬ ‫; ‪float price‬‬
‫‪17. public :‬‬
‫‪18.‬‬
‫‪19.‬‬
‫;)& ‪friend void rest (TV & , radio‬‬
‫;)& ‪friend void read (TV & , radio‬‬ ‫ضصاػاضداضتغنػثمػاظذكػصائنػضصلػصظفػ؟ ػ‬
‫‪20.‬‬ ‫;) ‪friend void print (TV , radio‬‬ ‫د س‪،‬‬ ‫يد ةد‬ ‫م‬ ‫ا‬
‫; } ‪21.‬‬
‫‪//------------------------------------------------------------- 3‬‬ ‫دم‬ ‫د يد‬ ‫ي دم‬ ‫ي ا د زج د د‬
‫)‪22. void rest (TV &a, radio &b‬‬ ‫د سد‬ ‫ذ د‬ ‫مف ا ص‬ ‫يا‬
‫{ ‪23.‬‬
‫‪24.‬‬ ‫; )" "‪strcpy ( a .TV_name ,‬‬
‫د د‬ ‫س د س د ي ددذ د صددا‬ ‫د يد‬
‫‪25.‬‬ ‫; ‪a . price=0‬‬ ‫يا‬ ‫ا ص‬ ‫م‬ ‫صم‬ ‫ض‬
‫‪26.‬‬ ‫; )" "‪strcpy (b . radio_name,‬‬ ‫أ د‬ ‫ذ دذ ا د دا ضد يد دا صد‬
‫‪27.‬‬ ‫; ‪b . price =0‬‬
‫} ‪28.‬‬ ‫د د م دم د د ج د‬ ‫ي م‬
‫‪//------------------------------------------------------------ 4‬‬ ‫د ص د ف د ددذ د ج د م ددم اح د س‬
‫)‪29. void read (TV &a, radio &b‬‬
‫{ ‪30.‬‬
‫دم أ مدز أ‬ ‫ا م دا‬ ‫س‬ ‫ي‬
‫‪31.‬‬ ‫;"‪cout << "Enter you TV name :‬‬ ‫م‬ ‫ا صف‬ ‫م‬
‫‪32.‬‬ ‫;‪cin >> a . TV_name‬‬ ‫د‬ ‫م دم احد س‬ ‫د‬ ‫د‬ ‫صا‬
‫‪33.‬‬ ‫;"‪cout << "Enter your TV price :‬‬
‫‪34.‬‬ ‫; ‪cin >> a . price‬‬ ‫ج ي خ ص ف سد يد‬ ‫ض س‬
‫‪35.‬‬ ‫;"‪cout << "Enter your Radio name :‬‬ ‫ددذ‬ ‫د ض د حد س‬ ‫ي ددا‬ ‫م د‬
‫‪36.‬‬
‫‪37.‬‬
‫; ‪cin >> b . radio_name‬‬
‫;"‪cout << "Enter your radio price :‬‬
‫د‬ ‫د سد يددا د‬ ‫د‬ ‫د‬ ‫د جز‬
‫‪38.‬‬ ‫;‪cin >> b . price‬‬ ‫دذ ا دم دذ‬ ‫ذ‬ ‫ذ‬
‫}‪39.‬‬ ‫د‬ ‫م ء ) ( ‪ read‬ا‬ ‫ي س‬
‫‪//------------------------------------------------------------ 5‬‬
‫)‪40. void print (TV a, radio b‬‬ ‫خد‬ ‫د د ذ ا د صددا‬ ‫م د د ضد‬
‫{ ‪41.‬‬ ‫‪.‬‬ ‫‪5‬‬ ‫ي م‬ ‫ا ص‬
‫‪42.‬‬
‫‪43.‬‬
‫" ‪cout << "your TV name is :‬‬
‫" ‪cout << "your TV price is :‬‬
‫;‪<< a . TV_name << endl‬‬
‫; ‪<< a . price << endl << endl‬‬
‫ي دد‬ ‫ا د د ز دددز دددا س م د د‬
‫‪44.‬‬ ‫;‪cout << "your Radio name is : " << b . radio_name << endl‬‬ ‫دد‬ ‫د د س د د د د ذ صد د ف ‪ radio‬د د‬
‫‪45.‬‬ ‫; ‪cout << "your Radio price is : " << b . price‬‬ ‫دا د سد ما صد ف ‪radio‬‬ ‫د‬ ‫د يد‬
‫}‪46.‬‬
‫‪//----------------------------------------------------------6‬‬ ‫د يد‬ ‫د ا‬ ‫خ ص ف ا ‪ TV‬ي‬
‫) ( ‪47. void main‬‬ ‫ددددد ء‬ ‫ددددد‬ ‫ي دددددذ‬ ‫‪5‬‬ ‫م ددددد‬
‫{ ‪48.‬‬
‫;‪49. TV a ; radio b‬‬
‫د سد ما‬ ‫‪tv‬‬ ‫م‬ ‫‪ radio‬س‬ ‫م‬
‫د ذ‬ ‫دم‬ ‫د‬ ‫ا ذاا‬ ‫م‬ ‫ي‬
‫;) ‪50. rest (a , b‬‬ ‫د‬ ‫حم س‬ ‫ذ صف ذ‬
‫;) ‪51. read (a , b‬‬
‫;) ‪52. print (a , b‬‬ ‫‪.‬‬ ‫ي‬ ‫م‬
‫;)(‪53. getch‬‬
‫}‪54.‬‬
‫صدا دذ د‬ ‫ا‬ ‫مم‬ ‫صف‬ ‫ةء ج‬ ‫ي ا مج س ي‬
‫م د‬ ‫سد‬ ‫د‬ ‫سسد يد ا د مج سد‬ ‫ا‬ ‫ام‬ ‫مم ج‬
‫د س يد‬ ‫صدا يد ةد‬ ‫دا‬ ‫صفا‬ ‫صا ي‬ ‫ذ ا‬ ‫ي‬ ‫ذ‬ ‫س ما‬ ‫ي‬
‫‪.‬‬ ‫ذ م‬ ‫ي ا مج س‬ ‫ذ‬ ‫ا‬ ‫ا‬ ‫ي‬ ‫م‬ ‫ص ف ‪tv‬‬ ‫ج‬
‫س اس ا د م د‬ ‫ي سم‬ ‫خ صف ا‬ ‫ا‬ ‫ا م اخم ذ‬
‫خد صد ف د س د أ ا د د اخم د د ا د م دم‬ ‫دم‬ ‫م د‬ ‫صا ذ‬ ‫‪،‬‬
‫د د سد‬ ‫دذ صد ف د‬ ‫ضد سد د ج د‬ ‫د ذد‬ ‫دم ي د‬ ‫ف س ز د دا‬ ‫يم‬
‫ذ ‪.‬‬ ‫م‬ ‫ص‬ ‫ج‬ ‫يس‬ ‫م‬ ‫ما‬
‫د س سد م ز د ا د ا د م د‬ ‫سد أ‬ ‫ي دا سد‬ ‫س ص م سس م ز ي‬
‫ي ة ‪.‬‬ ‫ش‬ ‫ض‬ ‫ص م سس م ز‬ ‫م‬ ‫ما‬ ‫سخ خ‬

‫ػ‬
‫ػ‬
‫طاػارجوهػطظكػعوػانػتتطعنػجغداػسيػاضصودػاضبرطجيػوتفكطهػجغداػواػتقمػبحفظهػبلػاسكمػصغفغهػبظاءهػ‪ .‬ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
#include <iostream.h> ‫ػ‬
#include <conio.h> ‫ػ‬
class person;
//-------------------------------> ‫ػ‬
‫ػ‬
class student
{
int x; ‫ػ‬
float y;
public : ‫ػ‬
‫ػ‬
friend person;
}; ‫ػ‬
//------------------------------->
class person ‫ػ‬
{ ‫ػ‬
int e;
int r; ‫ػ‬
public :
void read (student w){cin >> w.x >> w.y >> e >>r ;} ‫ػ‬
}; ‫ػ‬
//------------------------------>
void main () ‫ػ‬
{
student a ; person d ;
‫ػ‬
d.read (a); ‫ػ‬
‫ػ‬
getch();
‫ػ‬
}
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫طثالػ‪:‬ػطبارةػاضتارغخػبطتغغرػواحدػوحغثػانػاضقغمػثابتهػ ػ‬
‫ػ‬
‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬ ‫ػ‬
‫‪class date‬‬
‫{‬ ‫ػ‬
‫;‪int day‬‬ ‫ػ‬
‫;‪int month‬‬
‫;‪int year‬‬ ‫ػ‬
‫‪public :‬‬
‫} ; ‪date (int d,int m,int y) {day = d ; month = m ; year = y‬‬ ‫ػ‬
‫;)‪friend ostream & operator << (ostream &c , date s‬‬ ‫ػ‬
‫;}‬
‫‪//------------------------------------------‬‬ ‫ػ‬
‫)‪ostream &operator << (ostream &c , date s‬‬
‫{‬ ‫ػ‬
‫; ‪c << "the date is :" << s.day << " / " << s.month << " / "<<s.year‬‬ ‫ػ‬
‫; ‪return c‬‬
‫}‬ ‫ػ‬
‫‪//------------------------------------‬‬
‫ػ‬
‫) ( ‪void main‬‬
‫{‬ ‫ػ‬
‫;)‪date T (12,5,2011‬‬
‫ػ‬
‫; ‪cout << T‬‬ ‫ػ‬
‫;) (‪getch‬‬
‫}‬ ‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫احظػرزغزيػاضىدارسػانػاضصىودػعظىاػثابىتػأيػانػاضتىارغخػعىوػثابىتػبىظفسػاضبرظىاطجػسىدرظاػاىانػظصتىبػصىوداػاخىرػ‬
‫بظفسػسصراػاذصالػاضعطضغاتػضادخالػواصنػبطتغغرػواحدػسكظاػشطظاػبطبارهػصائنػحغثػغحتويػرضىػ‪3‬ػطتغغىراتػ‬
‫واطاػاانػسدظقومػبتعرغفػرطضغهػادخالػرظاصرػصائنػواحدػطرهػواحدهػدرظاػظرىػاضصودػاضتاضيػ ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫طثالػ‪:‬ػررفػصظفػادطهػ‪date‬ػبحغثػغحتويػرضىػاضطتغغراتػاضطظتطغهػاضتاضغهػ‪:‬ػ(ػاضغومػواضذكرػواضتىارغخػ)ػثىمػرىرفػ‬
‫داضهػبظاءػضوعدػرواطلػتضقائغهػصىفرغهػضكىذهػاضطتغغىراتػ)ػثىمػرىرفػرطضغىهػادخىالػعىذهػاضطتغغىراتػطىنػاضطدىتخدمػ‬
‫وررفػرطضغهػاخرىػضطبارهػعذهػاضطتغغراتػطدػجطلػتوعغحغهػ؟ ػ‬
‫ػ‬
‫>‪#include <iostream.h‬‬ ‫د‬ ‫د د‬ ‫د سد‬ ‫خ ف‬
‫>‪#include <conio.h‬‬ ‫د‬ ‫جد ا د دء د‬
‫‪//------------------------------------------------------------1‬‬
‫‪class date‬‬
‫صف د مد‬ ‫م‬ ‫خ‬
‫{‬ ‫اد‬ ‫س‬ ‫ا‬
‫;‪int day‬‬ ‫د‬ ‫ا خد‬
‫;‪int month‬‬ ‫ددم‬ ‫دد‬ ‫دد ج ددذ‬ ‫دد‬
‫;‪int year‬‬ ‫ددد‬ ‫ددددمس احددد س ا ددد ددد ذ‬
‫‪public :‬‬ ‫دا‬ ‫د د سد‬ ‫ذ د‬ ‫اخ‬
‫};‪date ( ){day = 0 ; month = 0 ; year = 0‬‬
‫;) ‪friend istream &operator >> (istream &c , date &s‬‬
‫د‬ ‫صا ‪ ،‬دا‬ ‫ا‬ ‫حم‬
‫;) ‪friend ostream &operator << (ostream &c , date s‬‬ ‫دم يد ا د مج سد‬ ‫خ ذ‬
‫;}‬ ‫د‬ ‫خد سد د ج ا د‬ ‫يد‬
‫‪//------------------------------------------------------------------2‬‬ ‫‪.‬‬ ‫ذ‬ ‫اخ‬
‫)‪istream &operator >> ( istream &c , date &s‬‬
‫{‬
‫;‪cout << "Enter your day : " ; c >> s.day‬‬
‫;‪cout << "Enter your month :"; c >> s.month‬‬
‫;‪cout << "Enter your year :" ; c >> s.year‬‬
‫}‬
‫‪//-------------------------------------------------------------------3‬‬
‫)‪ostream &operator << (ostream &c , date s‬‬
‫{‬
‫; ‪c << "the date is :" << s.day << " / " << s.month << " / "<<s.year‬‬
‫;‪return c‬‬
‫}‬
‫‪//------------------------------------------------------------------------4‬‬
‫) ( ‪void main‬‬
‫{‬
‫;‪date t‬‬
‫;‪cin >> t‬‬
‫;‪cout << t‬‬
‫;)(‪getch‬‬
‫}‬
‫تطرغنػ‪:‬ػررفػصظفػادطهػ‪laptop‬ػ بحغثػغحتويػرضىىػاضطتغغىراتػاضطظتغطىهػاضتاضغىهػ(ػادىمػاضابتىوبػ‪،‬ػودىعرهػ)ػثىمػ‬
‫ررفػبظاءػضوعدػشغمػصفرغهػضكذهػاضطتغغراتػ‪،‬ػوسيػداخلػاضداضهػاضرئغدغهػشمػبادخالػشغمػضكذهػاضطتغغراتػوطررعىاػ‬
‫اضىػاضصظفػباضتطرغرػثمػاطبدػاضظاتجػرنػطرغقػرطضغهػأيػاطبدػاضصائنػ‪ .‬ػ‬
‫اضفصرهػعيػادخلػشغمػطتغغراتػاضصظفػسيػداخلػػاضداضهػاضرئغدغهػ‪،‬ػثمػطررعاػاضىػاضصظفػباضتطرغرػواطبعكاػبعطضغهػ‬
‫ااخراجػأيػاطبدػاضصائنػصاطلػ‪ .‬ػ‬
‫اضفصرهػبدغطهػوطاػاختضفػرنػاضدابقػعوػسقطػاادخالػسيػاضداضهػاضرئغدغهػ ػ‬

‫دؤالػ‪:‬ػصححػاضخطاػسيػاضداضهػاضطجاورهػدؤالػاضظصفيػ ػ‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬
‫;)‪int maximum (int ,int ,int‬‬
‫‪//----------------------------------‬‬
‫)( ‪void main‬‬
‫{‬
‫;)‪cout << maximum(6,2,5‬‬
‫;)(‪getch‬‬
‫}‬
‫)‪int maximum (int x,int y,int z‬‬
‫{‬
‫;‪int max=x‬‬
‫)‪if (y>max‬‬
‫;‪max=y‬‬
‫)‪if (z>max‬‬
‫;‪max=z‬‬
‫;‪return max‬‬
‫}‬
‫ ػ‬:‫ػدؤالػاضطؤذراتػسيػاضظصفيػ‬:‫تتبدػظاتجػطاػغضيػ‬

#include <iostream.h>
#include <conio.h>
void main ()
{
int firstvalue = 5, secondvalue = 15;
int * p1, * p2;

p1 = &firstvalue;
p2 = &secondvalue;
*p1 = 10;
*p2 = *p1;
p1 = p2;
*p1 = 20;
cout << "firstvalue is " << firstvalue << endl;
cout << "secondvalue is " << secondvalue << endl;
getch();
}
‫ػدؤالػاضظصفي ػ‬:‫اصتبػبرظاطجػضطبارةػتقدغرػطاضبػ‬

#include <iostream.h>
#include <conio.h>
char * print (int );

void main ()
{
int x;
cout << "Enter your avg :";
cin >> x;

cout << print (x);

getch();
}
char *print (int x)
{
if (x>=90&&x<=100)
return "Excellent";
else if (x>=80&&x<=89)
return "Very good";
else if (x>=70&&x<=79)
return "Good";
else if (x>=60&&x<=69)
return "Intermediate";
else if (x>=50&&x<=59)
return "Accepted";
else return "Filed";
}
‫ػدؤالػااخغرػباضظصفيػ ػ‬:‫ػ‬rec‫اصتبػصظفػادطهػ‬

#include <iostream.h>
#include <conio.h>
class rec
{
float h;
float w;
public :
rec (int Hi=0,int Wed=0){h=Hi;w=Wed;}
float get_h(){return h;}
float get_w(){return w;}
float area_rec(){float return =h*w;}
};
void main ()
{
float hieght,width;
cout << "Enter The hieght of rectangle :";
cin >> hieght;
cout << "Enter The wideth of rectangle :";
cin >> width;
rec x(width,hieght);

cout << endl <<endl;


cout << "The hieght is : " << get_h();
cout << endl ;
cout << "The width is : " << get_w();
cout << endl;
cout << "The area is : " << area_rec ();

getch();
}
‫اصتبػترصغبػضتضفزغونػ‪:‬ػاضدؤالػشبلػااخغرػباضظصفيػ‪ :‬ػ‬
‫م د‬ ‫م د ا د‬ ‫اا‬ ‫ا ‪،‬‬ ‫م خم‬ ‫ح‬ ‫ا‬
‫حد ء‬ ‫د‬ ‫د‬ ‫د د د ا د‬ ‫د م دم أ د‬ ‫‪،‬أ‬ ‫ذ م‬ ‫س‬ ‫سا ج‬
‫م د د سد ‪ ،‬د د ذ د‬ ‫د‬ ‫د يد د‬ ‫دم‬ ‫د‬ ‫س د‬ ‫ز‬ ‫ز‬ ‫ذ‬
‫د‬ ‫دء د د‬ ‫س ا د س دم م د د س‬ ‫يا‬ ‫ا م‬ ‫اس ا ء ؟‬ ‫اا‬
‫ء م سد ا د د ذ‬ ‫ي س‬ ‫‪،‬‬ ‫ا ص‬ ‫ذ‬ ‫م‬ ‫مس‬
‫ة ‪:‬‬

‫)‪int max (int a , int b‬‬


‫{‬
‫;‪………..‬‬
‫}‬

‫ذد ا د د‬ ‫صد‬ ‫دا‬ ‫ا م‪،‬‬ ‫م‬ ‫اس‬ ‫زز‬ ‫ا‬


‫ازس ‪ ،‬يد دذ د ا صد ا ا دا‬ ‫م‬ ‫ص‬ ‫ا‬ ‫ا‬ ‫مس‬
‫‪ float‬ا ي ذ خ ‪ ،‬ا‬ ‫ا‬ ‫مم‬ ‫ا ‪،‬يذ‬ ‫ذ ا‬ ‫‪ ، ( int‬أ‬ ‫ص‬
‫د‬ ‫د‬ ‫س م‬ ‫س‬ ‫‪،‬‬ ‫م‬ ‫‪ int‬ذ‬ ‫مي‬ ‫س مس‬ ‫ا ا‬
‫ج د د ء د خدم‬ ‫‪ ، float‬د دم ا دم د ‪ ،‬ي د سد‬ ‫ا‬ ‫ا سم أ‬
‫‪:‬‬ ‫ح‬ ‫ذ س‬ ‫ذ ‪ ،‬س ذ ؟‬

‫)‪float max (float a , float b‬‬


‫{‬
‫;‪………..‬‬
‫}‬

‫د سد‬ ‫د ‪ float‬ذ د ا د‬ ‫د ا د د ‪ int‬د‬ ‫ددم د‬ ‫د‬ ‫د‬ ‫د‬‫ا د ز ددز ددا س‬


‫د ا د‬ ‫د دس د‬ ‫س‬ ‫م‬ ‫س ا ي ا‬ ‫ا‬ ‫ا‬ ‫مم‬
‫د ا ي د سد‬ ‫دم‬ ‫د سد‬ ‫س‬ ‫‪ ، float ،‬م‬ ‫ا‬ ‫ا مي‬ ‫ا ا‬
‫م دف د د د‬ ‫د‬ ‫د‬ ‫د د ذد‬ ‫م د دم‬ ‫د‬ ‫د سد د‬ ‫م ‪،‬ي‬ ‫خم‬
‫ا د سد‬ ‫ا دا دذ ا د‬ ‫د سد ا ج ي د‬ ‫د ا د‬ ‫مف‬ ‫م‬ ‫أ‬
‫س ذ ‪.‬‬ ‫ج يذ‬ ‫ذ‬ ‫خصس مي‬ ‫‪،‬‬ ‫م‬
‫د د م دف د د دا‬ ‫دا‬ ‫سد ا د د دس سد ا د‬ ‫س ذ ا د ‪ ،‬يد‬ ‫ح‬ ‫ف‬
‫ح ‪:‬‬ ‫ف‬ ‫م‬ ‫ي م س ا‬
‫س‬ ‫م‬ ‫سي‬ ‫اس ة‬ ‫زز‬ ‫د ‪ templeat‬ا‬ ‫ز يد د سد د‬
‫د‬ ‫ددا‬ ‫صد م ‪ ،‬د د‬ ‫د م‬ ‫د د‬ ‫د‬ ‫د‬ ‫د د‬ ‫‪ ،‬ي دا د ء د‬ ‫د د‬ ‫د‬
‫> < اح س اص م ا م‬ ‫‪ ،‬ي خ ذ اح س‬ ‫س‬ ‫ز ‪class‬ي م‬
‫د اد‬ ‫د‬ ‫د د د‬ ‫دم د‬ ‫دذ‬ ‫م‬ ‫م‬ ‫م سأ س‬ ‫يم‬ ‫ا م ص م‬
‫ذ ا ‪.‬‬ ‫مم‬
‫ا‬ ‫ذ‬ ‫ء‬ ‫سس ي‬ ‫خ‬ ‫ي م‬
‫>‪1. #include <iostream.h‬‬
‫>‪2. #include <conio.h‬‬ ‫ة ق ا ة‬ ‫ح‬ ‫ث ‪:‬ق‬
‫ة ة‬ ‫ة ار ة‬ ‫ة ق ة ة‬
‫‪3. int &max ( int &a , int &b ) //---------- B‬‬
‫ة ا ة‬ ‫صةةح ح ‪ ، int‬ف‬ ‫ة‬ ‫ة‬
‫{ ‪4.‬‬ ‫ث ف‬ ‫غ ‪،a‬‬
‫‪5.‬‬ ‫;‪cout << endl << &a‬‬ ‫ث ‪ ،‬ث فة‬ ‫غ ‪ ،b‬أ‬ ‫‪2‬‬
‫‪6.‬‬ ‫)‪if (a>b‬‬ ‫‪a‬‬ ‫ث‬
‫‪7.‬‬ ‫;‪return a‬‬ ‫ج ةة ‪ .‬ثةة‬ ‫ةة‬ ‫ةة فةة‬ ‫‪ b‬ضةة‬
‫‪8.‬‬ ‫‪else‬‬ ‫ج‪.‬‬
‫‪9.‬‬ ‫;‪return b‬‬
‫} ‪10.‬‬ ‫د‬ ‫ء س ا مج سد‬ ‫‪A‬‬ ‫ي‬
‫‪//------------------------- //-------------- A‬‬ ‫دددم ‪ b a‬ضد د ي د د د د‬ ‫مي د د‬
‫) ( ‪11. void main‬‬ ‫د ي د سد ‪ ،‬د س د‬ ‫اي م ضد‬
‫{ ‪12.‬‬ ‫د يد‬ ‫د ا د د‬ ‫سد‬ ‫م د سد‬
‫;‪13. int a=5,b=50,y‬‬ ‫د‬ ‫س مس‬ ‫سا ء‬ ‫خ‬
‫;‪14. cout << &a‬‬ ‫ا د رة‬ ‫ا اد‬ ‫ض‬
‫دددد‬ ‫ضدددد يدددد‬ ‫ةةةة‬ ‫ةةةة‬
‫;‪15. y=max (a,b)=3‬‬
‫‪،‬‬ ‫م‬
‫;‪16. cout << y << endl << b‬‬
‫دم‬ ‫د يد‬ ‫د‬ ‫د د‬ ‫ذ م‬
‫;) (‪17. getch‬‬ ‫دم ‪b‬‬ ‫د د‬ ‫د يد‬ ‫س د دا ا د‬
‫} ‪18.‬‬ ‫دم ‪ ، 50>5 a‬أ‬ ‫دم د‬ ‫ا‬
‫ا د د‬ ‫ا‬ ‫ص‬ ‫‪b‬س‬
‫د‬ ‫م ددم‬ ‫د‬ ‫اح د س ‪ ،‬د‬ ‫اس د‬ ‫ددذ‬ ‫م ددم اح د س‬ ‫د ذد ا‬ ‫د‬ ‫د د‬ ‫د‬ ‫د‬
‫دم د‬ ‫سد ء‬ ‫د أ‬ ‫د د مم‬ ‫ا د‬ ‫دمس د‬ ‫د‬ ‫د ا‬ ‫م د‬ ‫اح س ي ذ خ‬ ‫اس‬
‫دم يد دا‬ ‫م دم احد س ي د د د‬ ‫د‬ ‫ا د م ج سد‬ ‫دم‬ ‫ا‬ ‫س‬ ‫خص‬ ‫ا‬
‫د يا د د س‬ ‫سد دذ‬ ‫حم‬ ‫ا اس ء م ‪،‬‬ ‫س‬ ‫أ‬ ‫س‬ ‫ا‬
‫د‬ ‫د دا يد‬ ‫دم‬ ‫م د سد‬ ‫د م د سد‬ ‫ضد‬ ‫جم ي ا دم دذ‬ ‫س‬ ‫ةم ‪،‬‬
‫‪.‬‬ ‫س اس‬ ‫م‬ ‫م م ذ ذ‬

‫د‬ ‫د‬ ‫ي م ضد‬ ‫د سد‬ ‫دم ‪y‬‬ ‫ذ‬ ‫م‪ b‬ا سا ء ا‬ ‫س‬ ‫م‬ ‫ي‬
‫‪.‬‬ ‫سس‬

‫م دا‬ ‫دا‬ ‫سد‬ ‫ةح ‪،‬ي‬ ‫س‬ ‫م‬ ‫ا‬ ‫ا‬ ‫سا‬
‫ذ‬ ‫حم ي‬ ‫ا‬
‫;‪cout << max ( a,b)=3‬‬
‫د خدذ‬ ‫سد ‪ ،‬ذ‬ ‫ا د ‪ ،‬دم‬ ‫جا د‬ ‫م‬ ‫س‬ ‫ذ ا‬ ‫خ‬ ‫م‬ ‫ذ‬
‫خم‬ ‫م‬

‫*****************************************************************‬
‫;‪max( a, b )=3‬‬
‫; ) ‪cout << max ( a , b‬‬

‫جدا د ا د‬ ‫د‬ ‫دم د‬ ‫مص‬ ‫ي‬ ‫سا ء ا‬ ‫ا‬ ‫زز اس‬ ‫ا‬
‫س ا ء ا د دم خدم‬ ‫ي ذ ا س‬ ‫ي‬ ‫م‬
‫ددذ‬ ‫ددم خددم ‪ ،‬د يد‬ ‫د ذ د د مز د‬ ‫ددا د‬ ‫د‬ ‫ددا د‬ ‫د سد د ا د د‬ ‫ا د‬
‫د د دا خ‬ ‫ا د‬ ‫ا م ي اسد ا ء د‬ ‫ا‬ ‫م‪ b‬م‬ ‫‪ b=3 a=5‬أ‬ ‫اس ا ء‬
‫د سد‬ ‫دا دا‬ ‫د‬ ‫أ‬ ‫م‬ ‫ا‬ ‫م خم ا‬ ‫مم‬
‫م‪.a‬‬
‫د ةد ا‬ ‫سد د‬ ‫يد ا د‬ ‫د‬ ‫دف م د‬ ‫د‬ ‫‪ ،‬سا‬ ‫م‬ ‫ص‬
‫ذ س ص ‪.‬‬ ‫م‪ b a‬سم‬ ‫‪add whach‬‬

‫طضخصػ‪ :‬ػ‬
‫‪-‬ػػاضتطرغرػبااذارهػغعظيػانػرظاوغنػاضطتغغرػاضططرهػعيػظفسػرظاوغنػطتغغراتػاضطعاطاتػسىيػاضداضىهػاضطدىتقبضهػ‬
‫ضضقغمػوضصنػبادمػاخرػاوػبضقبػاخرػانػصحػاضتعبغرػ‪ .‬ػ‬
‫‪-‬ػاضقغطهػاضطرجعهػبااذارهػتخزنػحدبػاضذرطػوعظاػسيػطثاضظاػدتخزنػبطتغغرػاصبرػشغطهػ‪ .‬ػ‬
‫‪-‬ػ اظتبهػرظدػادتدراءػاضداضهػاضتيػتعغدػشغطهػبااذارهػسكيػتقومػبتغغرػشغطهػاضطتغغرػااصضيػسفيػطثاضظاػاضىرشمػ‬
‫ااصبرػعوػاضطتغغرػ‪b‬ػواصنػبعدػاضتعدغلػاضذيػشطظاػبهػسيػاضذرحػرظدػاضظجمػ‪،‬ػدىوفػغصىبحػاضطتغغىرػ ‪a‬ػعىوػااصبىرػ‬
‫وعذاػطاػذرحظاهػدابقاػ‪ .‬ػ‬
‫‪-‬ػاذاػاردظاػاارجاعػبااذارهػسغجبػانػغصونػاضتطرغرػبااذارهػ‪،‬ػوضوػصانػباضقغطهػساضطتغغراتػطختضفهػ‪ .‬ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫>‪#include <iostream.h‬‬ ‫‪ const‬ذ‬ ‫ض‬ ‫ي‬
‫>‪#include <conio.h‬‬ ‫ددددم ‪ b‬سدددد ء دددد‬ ‫ددددم دددد‬ ‫ا دددد دددد‬
‫‪//-----------------------------‬‬ ‫د‬ ‫‪ ،‬ي سد ا د‬ ‫م اح س‬
‫)‪void afunc (int &a ,const int & b‬‬ ‫د‬ ‫د‬ ‫ضد‬ ‫د‬ ‫دم د ‪ b‬د‬
‫ددم ددمي ذ د‬ ‫د ي ددذ خ د د‬
‫{‬ ‫د‬ ‫ددذ‬ ‫د س د م م د ي ددم د ض د‬
‫‪// b=2; //-----------------------‬‬ ‫ذ س ص ‪ ،‬ا ص‬ ‫‪void‬‬ ‫‪const‬‬
‫;‪a=10‬‬ ‫حدد ء دد دد دددا ‪ void‬دد سدد ا دد ‪،‬‬
‫}‬ ‫د أ حد ئ ‪ ،‬أ د‬ ‫د ا د‬ ‫ي مد‬
‫د د ا‬ ‫د‬ ‫د‬ ‫د ‪،‬‬ ‫ددذ د‬
‫‪ const‬يد‬ ‫ز‬ ‫ز‬
‫‪//------------------------------‬‬ ‫حددم ‪،‬‬ ‫خددم م س د ا د ا د ددا س د‬
‫) ( ‪void main‬‬ ‫دذ‬ ‫د خ د ا د‬ ‫ي‬ ‫ذ ا‬
‫{‬ ‫ا د‬ ‫خد ا د‬ ‫د ضد‬ ‫‪،‬‬ ‫م‬
‫;‪int a=5,b=6‬‬ ‫دد‬ ‫ددم ي ددذ دد جز دد دد‬ ‫دد دد‬
‫; ‪cout << "befor ( a ) : " << a << endl‬‬ ‫د‬ ‫اسد د د‬ ‫ا‬ ‫ذ‬
‫مي ذ خ‬ ‫ا‬ ‫ز‬ ‫ض‬
‫; ‪cout << "befor ( b ) : " << b << endl‬‬ ‫‪.‬‬ ‫ذ‬ ‫م‬ ‫ا‬
‫; ‪cout << endl << endl‬‬
‫;)‪afunc (a,b‬‬
‫; ‪cout << "after ( a ) : " << a << endl‬‬

‫;) ( ‪getch‬‬
‫}‬
‫>‪#include <iostream.h‬‬ ‫د صد ف ي م ضد‬ ‫صد‬ ‫د د‬
‫>‪#include <conio.h‬‬ ‫د‬ ‫د ي د د دز‬ ‫م خص ا ذ‬
‫‪//--------------------------------------‬‬ ‫(‬ ‫سد ا د )‬ ‫د ‪ ،‬د‬ ‫‪ private‬يد ددذ‬
‫‪class ConstFuncClass‬‬ ‫دم‬ ‫س‬ ‫‪ normalFunc‬ي ذ ا‬
‫{‬ ‫سد د ء د ا د‬ ‫د‬ ‫ذ ا د د‬ ‫‪age‬‬
‫ز ‪//private : //------------------‬‬
‫; ‪int age‬‬
‫ددم دد اس دد‬ ‫دد دد‬ ‫دد ي دد سدد‬
‫‪public :‬‬ ‫دا د دس‬ ‫د‬ ‫ض أ د د د‬ ‫ة‬
‫} ;‪void normalFunc ( ){age =55‬‬ ‫د‬ ‫ا د ميد د‬ ‫ددم ا‬ ‫ددم يددا د د‬
‫‪void conFunc ( ) const {age = 55 ;} //--------------- error‬‬ ‫دد‬ ‫دد‬ ‫دد دد‬ ‫دد‬ ‫ا دد‬ ‫‪ const‬دد‬
‫;}‬ ‫ذ جز‬ ‫ا ا‬ ‫ا ا‬ ‫ز‬
‫‪//--------------------------------------‬‬ ‫‪.‬‬ ‫ذ ا‬ ‫ي ي ا‬
‫) ( ‪void main‬‬
‫{‬
‫;‪ConstFuncClass opj1‬‬

‫;)( ‪getch‬‬
‫}‬

‫>‪1. #include <iostream.h‬‬ ‫دؤالػتصحغحػاضداضهػسيػاضظصفيػ‪:‬ػداضهػاضطاصسػ‪ :‬ػ‬


‫>‪2. #include <conio.h‬‬
‫;)‪3. int maximum (int ,int ,int‬‬ ‫باضظدبهػادتخدامػصضطهػ‪else‬ػوعيػحدىبػاضطظطىقػاضخىاصػ‬
‫‪//----------------------------------‬‬ ‫باضدؤالػظفدهػسفيػعذاػاضدىؤالػضطىاذاػادىتخداطكاػخطىاػ‪،‬ػ‬
‫( ‪4. void main‬‬ ‫)‬
‫اولػرظىىدطاػظعىىدػصضطىىةػ‪else‬ػضضذىىرطػاضثىىاظيػرظىىدػاضدىىكمػ‬
‫{ ‪5.‬‬
‫;)‪6. cout << maximum(6,2,5‬‬ ‫سكىىذاػغصىىبحػذىىرطػطتىىداخلػأيػاظىىهػسىىيػحىىالػصىىانػجىىوابػ‬
‫;)(‪7. getch‬‬ ‫اضذرطػااولػساظهػدغدخلػرضغهػواذاػصانػاضجوابػظعمػأيػ‬
‫} ‪8.‬‬
‫‪//-----------------------------------‬‬ ‫انػاضذرطػااولػاظطبىقػساظىهػاػغىدخلػاضىىػاضذىرطػاضثىاظيػ‬
‫)‪9. int maximum (int x,int y,int z‬‬ ‫اظهػاػغدخلػرضغهػااػاذاػصانػاضجوابػاػوظحنػطتفقىانػاضىىػ‬
‫{ ‪10.‬‬
‫عظاػاضغسػصذضكػ؟ ػ‬
‫;‪11. int max=x‬‬
‫)‪12. if (y>max‬‬ ‫درظاػظفترضػاظظاػوععظاػصضطةػ‪else‬ػشبلػاضذىرطػاضثىاظيػ‬
‫;‪13. max=y‬‬ ‫سيػاضداضهػ‪،‬ػسدظقومػاولػشغطهػدتقومػاضداضهػبطقارظتكاػ‬
‫)‪14. if (z>max‬‬
‫;‪15. max=z‬‬ ‫عىىيػ‪6‬ػوعىىيػاضتىىيػططرظاعىىاػطىىنػاضداضىىهػاضرئغدىىغهػسجعضظىىاػ‬
‫;‪16. return max‬‬ ‫اضقغطهػااوضىػعىيػااصبىرػاحىظػخطىوهػرشىمػ‪11‬ػوسىيػاضذىرطػػ‬
‫} ‪17.‬‬
‫ااولػوعوػسيػاضخطوهػ‪12‬ػظقارنػعذهػاضقغطهػطدػاضقغطهػاضثاظغهػاضتيػشطظىاػبتطرغرعىاػاغىنػاظظىاػظقىارنػشغطىهػ‪x‬ػوعىيػ‬
‫اضتيػتمػتخزغظكاػسيػ‪max‬ػػأيػاظظاػارتبرظاعاػااصبرػطدػاضقغطهػاضثاظغهػوعيػ‪y‬ػػوعظاػسيػطثاضظاػضمػغظطبىقػاضذىرطػ‬
‫سظدخلػرضىػاضذرطػاضثاظيػ‪،‬ػطغبػدرظاػظغغرػاضقغطهػااوضىػطنػ‪6‬ػاضىػاضرشمػ‪1‬ػثمػظعغىدػاضتتبىدػسىيػاضداضىهػظجعىلػػاولػ‬
‫شغطهػعىيػاضصبىريػوظخزظكىاػسىيػ‪max‬ػػ ثىمػظقىارنػعىذهػاضقغطىهػطىدػاضقغطىهػاضثاظغىهػ‪y‬ػوعظىاػشغطىةػاضطتغغىرػ‪y‬ػاصبىرػ‬
‫سدتقومػاضداضهػبارجىاعػاضقغطىهػ‪2‬ػ عىيػااصبىرػاظكىاػاػتىدخلػضضذىرطػاضثىاظيػاظىهػطعرسىهػرضىىػاظىهػطتىداخلػوعىذاػطىاػ‬
‫ذرحظاهػدابقاػ‪،‬ػستصبحػعذهػاضخوارزطغهػخاطئهػواضصوابػاظه ػاػغجوزػوعدػاضصضطهػ ‪else‬ػسيػطثاضظىاػعىذاػشبىلػاضذىرطػ‬
‫اضثاظيػسفيػصلػاضحااتػرظدػردمػوععكاػدظدخلػرضىػاضذرطػاضثاظيػوظقارنػجطغدػاضقغمػوضغسػسقطػشغطتغنػ‪ .‬ػ‬
. ‫م صم‬ ‫س‬ ‫ي‬ ‫ذ ا م ف‬ ‫ا‬
‫ (ػثمػ‬2 , 4 , 1 , 9 , 0 ‫ػ(ػ‬:‫ػرظاصرػثمػخزنػسغكاػاضعظاصرػاضتاضغةػ‬5‫ػطوضكاػ‬،‫ػررفػطصفوسهػطنػظوعػرددػحقغقيػ‬:‫طثالػ‬
‫رتبكاػطنػااصبرػاضىػااصغرػواطبعكاػشبلػاضترتغبػوبعدهػ؟‬
1. #include <iostream.h>
b ‫م‬ ‫ي‬ ‫م‬
2. #include <conio.h>
//----------------------------- B
3. void sort ( int x [ ] )
4. {
5. int t ;
6. for ( int i=0 ; i <5 ; i++ )
7. for ( int j =i+1 ; j <5 ; j++ )
8. if ( x[i] > x[j] )
9. {
10. t= x[ i ] ;
11. x[i]=x[j];
12. x[j]=t;
13. }
14. }
//----------------------------- A
15. void main ( )
16. {
17. int x[5]={2,4,1,9,0} ;
18. cout << "Before : " ;

19. for (int i=0;i<5;i++)


20. cout << x[i] << " " ;
21. sort (x) ;

22. cout << endl << "After : " ;


23. for (int i=0;i<5;i++)
24. cout << x[i] << " " ;
25. getch( );
26.}
‫طثالػ‪:‬ػررفػصظفػادطهػ‪student‬ػ بحغىثػغحتىويػرضىىػاضطتغغىراتػاضطظتطغىهػاضتاضغىةػ‪:‬ػ(ػاادىمػواضطعىدلػ)ػ‪،‬ػثىمػرىرفػ‬
‫صائظانػطنػعذاػاضصظفػوطررعمػرضىػداضهػاضترتغبػضترتغبكمػحدىبػاضطعىدلػطىنػاارضىىػاضىىػااصىغرػػثىمػاطبىدػاضظىاتجػ‬
‫شبلػوبعدػاضترتغبػ؟ ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫‪.1‬ػتطرغرػاضعواطلػباضقغطةػ‪ :‬ػ‬
‫طثالػاحدبػطجطوعػراطتغنػسيػداضهػواطبدػاضظاتجػسيػاضداضهػاضرئغدغةػ ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
May 2002

‫ﻠﻜﻤﺒﻴﻮﺗﺮ واﻻﻧﺘﺮﻧ ﺖ‬
‫ اﻟﻤﻮﺳﻮﻋ ﺔ اﻟﻌﺮﺑﻴ ﺔﻟ‬- ٢٠٠٠-٢٠٠٢ © ‫ﻔﻮ ﻇ ﺔ‬
‫ﺟﻤﻴ ﻊ اﻟﺤﻘﻮ ق ﻣﺤ‬
http://www.c4arab.com/

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


‫ﻟﻜﺎﺌﻨﺎ ﺕ‬
‫ﻟ ﻰﺍ‬
‫ﻤﺩﺨ ل ﺇ‬
‫ﻟﻜﺎﺌ ﻥ‪:‬‬
‫ﻤﻔ ﻬ ﻭ ﻡﺍ‬ ‫‪١‬‬

‫ﺍﺒ ﻁﺔ ﺘ ﻀﻡ ﺒﻴﺎﻨﺎ ﺕ ﻭﻜﻭﺩ ﻴﻌﻤل ﻓﻲ ﻫﺫﻩﺍﻟﺒﻴﺎﻨﺎ ﺕ‪.‬ﺃﻤﺎ‬


‫ﺍﺀ ﻤﺘﺭ‬ ‫ﺍﻟﻜﺎﺌ ﻥ ‪ Object‬ﻫﻭﺃﺠ ﺯ‬
‫‪ ،‬ﻨﻌﺘﺒﺭ‬‫‪ ،‬ﻋﻠﻰ ﻜل‬ ‫ﺍﻟ ﺼﻨ ﻑ ‪ Class‬ﻓﻴﻤﻜ ﻥﺍﻋﺘﺒﺎﺭﻩ ﻜﻘﺎﻟ ﺏ ﺤﻴﺙ ﻤ ﻥ ﺨﻼﻟﻪ ﻴﻤﻜ ﻥ ﺨﻠﻕ ﻜﺎﺌﻨﺎ ﺕ‬
‫‪ ،‬ﻭ ﻫﺫﻩﺍﻷﺨﻴﺭﺓ ﻫﻲ ﻤﺜﻴﻼ ﺕ ‪ Instances‬ﻋ ﻥ‬ ‫ﺍﺌﻤﺎ ﺒﺄ ﻥﺍﻷ ﺼﻨﺎ ﻑ ﻫﻲﺃﻭ ﺼﺎ ﻑﻟﻠﻜﺎﺌﻨﺎ ﺕ‬‫ﺩ‬
‫ﺃ ﺼﻨﺎﻓﻬﺎ‪.‬‬

‫‪،‬ﺍﻟﺒﻴﺎﻨﺎ ﺕﺍﻟﺘﻲ‬
‫ﺍﺨﻠﻲﻟﻠﻜﺎﺌ ﻥ‬‫ﺍﺍﻟﺘﻌﻘﻴﺩ؟ ﻴﻤﻜ ﻥﺍﻟﻘﻭلﺃ ﻥﺍﻟ ﺼﻨ ﻑ ﻴ ﺼ ﻑﺍﻟﻬﻴﻜلﺍﻟﺩ‬ ‫ﺍ ﻫﺫ‬‫ﻟﻤﺎﺫ‬
‫‪،‬ﺍﻷﻨﺸ ﻁﺔﺍﻟﺘﻲ ﻴﻘﺩﺭ ﺘ ﺤﻘﻴﻘﻬﺎ ﻋﻠﻰ ﻫﺫﻩﺍﻟﺒﻴﺎﻨﺎ ﺕ‪.‬ﺍﻟﻜﺎﺌ ﻥ ﻫﻭ ﺤﺎﻟﺔﻟ ﺼﻨﻔﻪ‪.‬‬ ‫ﻴ ﺤﻭﻴﻬﺎ‬

‫ﺍﺍﻟﺘ ﺼﻤﻴﻡ‪.‬‬
‫‪ ،‬ﻜﻤﺎ ﻴﻤﺜﻠﻬﺎ ﻫﺫ‬
‫ﻟﻨﻌﺘﺒﺭ ﻤﺜﻼ ﻨﻤﻭﺫﺝ ﻤ ﺭﻜﺒﺔ‬

‫‪Vehicle‬‬ ‫‪name of the class‬‬

‫‪#NumberOfVehicles: integer‬‬
‫‪description of attributes‬‬
‫‪#mark : string‬‬ ‫‪or member data‬‬
‫‪#speed maximal : integer‬‬
‫‪#speed courante : integer‬‬

‫)( ‪+ CreateVehicle‬‬
‫= ‪description of methods‬‬
‫)( ‪+ DestroyVehicle‬‬
‫‪associate code to data‬‬
‫)( ‪+ Start‬‬
‫)‪+ Accelerate(rate : integer‬‬
‫)( ‪+ Advance‬‬
‫)( ‪+ MoveBack‬‬

‫ﻤ ﺭﻜﺒﺔ‬ ‫اﺳﻢ اﻟ ﺼﻨ ﻒ‬

‫ﺍﻜ ﺏ‪ :‬ﺼ ﺤﻴﺢ‬


‫‪ #‬ﻋﺩﺩﺍﻟﻤﺭ‬
‫‪#‬ﺍﻟﻨﻭﻉ‪ :‬ﺤ ﺯﻤﺔ ﺭﻤﻭ ﺯ‬ ‫و ﺻ ﻒ اﻟﺨ ﺼﺎﺋ ﺺ‬
‫‪#‬ﺍﻟﺴﺭﻋﺔﺍﻟﻘ ﺼﻭﻯ ‪ :‬ﺼ ﺤﻴﺢ‬ ‫أو اﻟﺒﻴﺎﻧﺎ ت اﻷﻋ ﻀﺎء‬
‫‪#‬ﺍﻟﺴﺭﻋﺔﺍﻟﺩﻨﻴﺎ ‪ :‬ﺼ ﺤﻴﺢ‬
‫‪‬ﺩ ﻤﺭﻜﺒﺔ )(‬‫‪ +‬ﺸﻴ‬
‫‪‬ﻡ ﻤﺭﻜﺒﺔ )(‬‫‪ +‬ﻫﺩ‬
‫و ﺻ ﻒ اﻟﻤﻨﺎﻫﺞ =‬
‫‪+‬ﺃﻗﻠﻊ )(‬ ‫ﻠﺒﻴﺎﻧﺎ ت‬
‫ﺗﺨ ﺼﻴ ﺺﻛﻮدﻟ‬
‫ﺍﻟﻨﺴﺒﺔ ‪ :‬ﺼ ﺤﻴﺢ(‬‫‪ +‬ﺴﺎﺭﻉ )‬
‫‪ +‬ﺘﻘﺩﻡ )(‬
‫ﺍﺠﻊ )(‬ ‫‪ +‬ﺘﺭ‬

‫‪ ،‬ﻭﻗﻴﻤﺘﻴ ﻥ ﺼ ﺤﻴ ﺤﺘﻴ ﻥ‪:‬‬‫ﺍﻟﻨﻭﻉ(‬‫‪‬ﻤ ﺕ ﻋﻠﻰ ﺸﻜل ﺤ ﺯﻤﺔ ﺭﻤﻭ ﺯ )‬‫‪ ،‬ﻤ ﺭﻜﺒﺔ ﻗ ﺩ‬
‫ﺍﺍﻟﻤﺜﺎل‬
‫ﻓﻲ ﻫﺫ‬
‫‪ ،‬ﻜل‬ ‫‪ ،‬ﺒﻤﻌﻨﻰ ﺁﺨﺭ‬ ‫ﺍﻟﺴﺭﻋﺔﺍﻟﺩﻨﻴﺎ‪ .‬ﻜل ﻫﺫﻩﺍﻟﺒﻴﺎﻨﺎ ﺕ ﺘﺨ ﺹ ﻤﺭﻜﺒﺔﺃﻴﺎ ﻜﺎﻨ ﺕ‬‫‪،‬ﻭ‬ ‫ﺍﻟﺴﺭﻋﺔﺍﻟﻘ ﺼﻭﻯ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﻜﺎﺌ ﻥ ﻤ ﻥ ﻨﻭﻉ ﻤ ﺭﻜﺒﺔ ﺴﻴﻜﻭ ﻥ ﻟﻪ ﻨﺴﺨﺘﻪﺍﻟﺨﺎ ﺼﺔ ﻤ ﻥ ﻫﺫﻩﺍﻟﺒﻴﺎﻨﺎ ﺕ‪ :‬ﻨﺘﻜﻠﻡ ﺇﺫ ﻥ ﻋ ﻥ ﺨ ﺼﺎﺌ ﺹ‬
‫ﺍﻟﻤﺜﻴل )‪.(instance attributes‬‬

‫‪،‬ﺍﻟﺘﻲ ﺘﺴﻤﺢ ﺒﺨﻠﻕ ﻜﺎﺌ ﻥﺍﻨ ﻁﻼﻗﺎ ﻤ ﻥ ﺼﻨ ﻑ ﺘﻨ ﺹ‬ ‫ﻋﻤﻠﻴﺔ ﺨﻠﻕﺍﻟﻤﺜﻴل )‪(instanciation‬‬


‫ﻋﻠﻰ ﻤﻨﺢ ﻗﻴﻡ ﻤﻤﻴﺯﺓﻟﻜل ﺨ ﺼﺎﺌ ﺹﺍﻟﻤﺜﻴل‪.‬‬
‫‪،‬‬
‫ﺍﻟﺘ ﺼﻤﻴﻡﺍﻟﺴﺎﺒﻕ ﻴﺴﻤﺢﻟﻨﺎ ﺒﺘﻘﺩﻴﻡﺍﻟ ـ‪(Unified Modeling Language) UML‬‬
‫ﺍﻭﻟﺔ ﻓﻲ ﻫﺫﻩﺍﻷﻴﺎﻡ‪.‬‬ ‫ﺍﻟﻤﺘﺩ‬
‫‪،‬ﻭ‬ ‫ﻭ ﻫﻲ ﻟﻐﺔ ﺘﺴﻤﺢ ﺒﺘﻘﺩﻴﻡﺃﻨ ﻅﻤﺔﺍﻟﻜﺎﺌ ﻥﺍﻟﻌﺎﻟﻤﻴﺔ ﺘﻘﺭﻴﺒﺎ‬

‫ﺍﻟﻤﺩﺨلﺍﻟ ﺤﺎﻟﻲ ﻻ ﻴﺴﻤﺢ ﺇﻻ ﺒﺎﻹ ﻁﻼﻉ ﻋﻠﻰ ﺠ ﺯﺀ ﺒﺴﻴ ﻁ ﻤ ﻥ ﻫﺫﻩﺍﻟﻠﻐﺔ ﻤ ﻥ ﺨﻼل‬


‫ﺍﻓﻘﺔ ﻋﻼﻗﺎﺘﻬﺎ‬
‫‪ ،‬ﺒﻤﺭ‬ ‫ﺍﺨﻠﺔ ﻓﻲﺍﻟﻨﻤﻭﺫﺝ‬ ‫ﺍﻟﻤﺘﻌﻠﻕ ﺒﺘﻘﺩﻴﻡ ﻤﺨﺘﻠ ﻑﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺘﺩ‬ ‫ﺘ ﺼﻤﻴﻤﻬﺎﺍﻟﺜﺎﺒ ﺕ ﻭ‬
‫ﺍﻷﺴﺎﺴﻴﺔ‪ .‬ﻨﻼ ﺤ ﻅ ﺇﺫ ﻥﺃ ﻥﺍﻟ ﺼﻨ ﻑ ﻴﺘﻡ ﺘﻤﺜﻴﻠﻪﺃﻭ ﺘﻘﺩﻴﻤﻪ ﺒﻤﺴﺘ ﻁﻴل ﻴﺘﺄﻟ ﻑ ﻤ ﻥ ﺜﻼﺙﺃﻗﺴﺎﻡ‪:‬‬

‫‪ v‬ﺍﻟﻘﺴﻡﺍﻟﻌﻠﻭ ﻱ ﻴﺸﻴﺭ ﺇﻟﻰ ﺇﺴﻡﺍﻟ ﺼﻨ ﻑ‬


‫ﺍﻋﻬﺎ ﻋﻠﻰ ﺸﻜل‪:‬‬‫‪ v‬ﺍﻟﻘﺴﻡﺍﻷﻭﺴ ﻁ ﻴ ﺤﺩﺩﺍﻟﺨ ﺼﺎﺌ ﺹ ﻭﺃﻨﻭ‬
‫‪: IdentifierType IdentifierAttribut‬‬

‫ﺍﻉﺍﻟﻘﻴﻡ‬
‫ﺍﺃﻨﻭ‬
‫‪ ،‬ﻭﻜﺫ‬
‫ﺍﺘﻬﺎ ) ﺤﺠﺠﻬﺎ(‬ ‫‪ v‬ﺍﻟﻘﺴﻡﺍﻟﺴﻔﻠﻲ ﻴﻘﺩﻡﺍﻟﻤﻨﺎ ﻫﺞ ﻤﺭﻓﻘﺔ ﺒﺒﺎﺭ‬
‫ﺍﻤﺘﺭ‬
‫ﺍﻟﻤﻌﺎﺩﺓ‪.‬‬

‫ﺍ ﺀ ﺘﻌﻠﻕﺍﻷﻤﺭ ﺒﺎﻟﺨ ﺼﺎﺌ ﺹ‬


‫‪ ،‬ﺴﻭ‬
‫ﺍﻟﺘﺴ ﻁﻴﺭ ﻴﺸﻴﺭ ﺇﻟﻰﺃ ﻥﺍﻟﻌﻨ ﺼﺭ ﻫﻭ ﻋ ﻀﻭﻟﻠ ﺼﻨ ﻑ‬
‫ﺃﻭﺍﻟﻤﻨﺎ ﻫﺞ‪.‬‬

‫‪،‬ﺍﻟﻤﺴﺘ ﻁﻴﻼ ﺕﺍﻟﻤﻌﻠﹼﻤﺔ ﺒﺭﻜ ﻥ ﻤ ﻁﻭ ﻱ ﺘﺨ ﺼ ﺹﻟﻠﺘﻌﻠﻴﻘﺎ ﺕﺃﻭﺍﻟﻤﻼ ﺤ ﻅﺎ ﺕ‪.‬‬


‫ﻓﻲﺍﻷﺨﻴﺭ‬

‫ﺍﻜ ﺏ )‪(NumberOfVehicles‬ﺍﻟﻤﺴﺅﻭﻟﺔ‬ ‫‪،‬ﻨﻼ ﺤ ﻅﺃ ﻥﺍﻟﺨﺎ ﺼﻴﺔ ﻋﺩﺩﺍﻟﻤﺭ‬ ‫ﺒﺎﻟﻤﻘﺎﺒل‬


‫ﺍ ﻫﺎ ﺒﻔ ﻀل‬‫ﻋ ﻥ ﺘ ﺤﺩﻴﺩ ﻋﺩﺩﺍﻟﻤﺭﻜﺒﺎ ﺕ ﻓﻲﺃ ﻱ ﻭﻗ ﺕ ﻓﻲﺍﻟ ﺼﻨ ﻑ‪ .‬ﺇ ﻥ ﻫﺫﻩﺍﻟﺨﺎ ﺼﻴﺔ ﻴﺘﻡ ﺯﻴﺎﺩﺓ ﻤ ﺤﺘﻭ‬
‫‪‬ﻡ ﻤ ﺭﻜﺒﺔ )‬
‫ﺍ ﻫﺎ ﻤ ﻥ ﺨﻼلﺍﻟﻌﻤﻠﻴﺔ ﻫﺩ‬ ‫‪ ،‬ﻭﻴﺘﻡ ﺇﻨﻘﺎ ﺹ ﻤ ﺤﺘﻭ‬
‫‪‬ﺩ ﻤ ﺭﻜﺒﺔ )‪(CreateVehicle‬‬ ‫ﺍﻟﻌﻤﻠﻴﺔ ﺸﻴ‬
‫ﺍ ﺹﻟﻤﺠﻤﻭﻋﺔ ﻜﺎﺌﻨﺎ ﺕ ﺘﻨﺘﻤﻲﻟﻨﻔ ﺱ‬ ‫ﺍ ﻤﺜﺎل ﻨﻤﻭﺫﺠﻲﻟﺘﻘﺎﺴﻡﺍﻟﺨﻭ‬
‫‪ .(DestroyVehicle‬ﻫﺫ‬
‫‪ ،‬ﺒل ﻭﻴﻌﺘﺒﺭ‬ ‫ﺍ ﻴﻌﺘﺒﺭ ﻏﻴﺭ ﻤﺠﺩ ﻱﺍﻤﺘﻼ ﻙ ﻜل ﻜﺎﺌ ﻥﻟﻨﺴﺨﺔ ﻤﻨﻔﺭﺩﺓ ﻤ ﻥ ﻫﺫﻩﺍﻟﺨﺎ ﺼﻴﺔ‬ ‫ﺍﻟ ﺼﻨ ﻑ‪.‬ﻟﻬﺫ‬
‫‪ ،‬ﺇﺫ ﻥ ﻤ ﻥﺍﻟﻤﺴﺘ ﺤﺴ ﻥﺃ ﻥ ﺘﺘﻘﺎﺴﻡﺍﻟﻜﺎﺌﻨﺎ ﺕ ﻨﺴﺨﺔ ﻭ ﺤﻴﺩﺓ‬
‫ﺍﺩ(‬
‫ﺍ )ﺘﺨﻴل ﻋﻤﻠﻴﺎ ﺕﺍﻹﻋﺩ‬ ‫ﻋﻤﻼ ﺨ ﻁﻴﺭ‬
‫ﺘﻨﺘﻤﻲﻟﻠ ﺼﻨ ﻑ‪ .‬ﻨﺘﻜﻠﻡ ﺇﺫ ﻥ ﻋ ﻥ ﺨﺎ ﺼﻴﺔﺍﻟ ﺼﻨ ﻑ )‪.(Class Attribut‬‬

‫ﺍﻟﻤﺜﺎلﺍﻵﺘﻲ ﻴﻭ ﻀﺢ ﻋﻤﻠﻴﺔ ﺨﻠﻕ ﻤﺜﻴﻠﻴ ﻥﻟﻜﺎﺌﻨﻴ ﻥ ﻤﺨﺘﻠﻔﻴ ﻥ ﻤ ﻥ ﻨﻔ ﺱﺍﻟ ﺼﻨ ﻑ‪:‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫‪Class‬‬ ‫‪Instances‬‬

‫‪Vehicle‬‬
‫"‪Mark = "Peugeot‬‬
‫‪#NumberOfVehicles: integer‬‬ ‫‪MaximalSpeed=200‬‬
‫‪CouranteSpeed=165‬‬
‫‪# Mark : string‬‬
‫‪# MaximalSpeed: integer‬‬
‫‪# CouranteSpeed: integer‬‬ ‫‪Instanciation‬‬

‫)( ‪+ CreateVehicle‬‬
‫)( ‪+ DestroyVehicle‬‬
‫)( ‪+ Start‬‬ ‫"‪Mark = "Renault‬‬
‫)‪+ Accelerate(rate : integer‬‬ ‫‪MaximalSpeed=230‬‬
‫)( ‪+ Advance‬‬ ‫‪CouranteSpeed=140‬‬
‫)( ‪+ MoveBack‬‬

‫‪Class‬‬ ‫‪Instances‬‬

‫ﻤ ﺭﻜﺒﺔ‬
‫"‪Mark = "Peugeot‬‬
‫‪MaximalSpeed=200‬‬
‫ﺍﻜ ﺏ‪ :‬ﺼ ﺤﻴﺢ‬
‫‪ #‬ﻋﺩﺩﺍﻟﻤﺭ‬
‫‪CouranteSpeed=165‬‬
‫‪#‬ﺍﻟﻨﻭﻉ‪ :‬ﺤ ﺯﻤﺔ ﺭﻤﻭ ﺯ‬
‫‪#‬ﺍﻟﺴﺭﻋﺔﺍﻟﻘ ﺼﻭﻯ ‪ :‬ﺼ ﺤﻴﺢ‬
‫‪Instanciation‬‬
‫‪#‬ﺍﻟﺴﺭﻋﺔﺍﻟﺩﻨﻴﺎ ‪ :‬ﺼ ﺤﻴﺢ‬
‫‪‬ﺩ ﻤﺭﻜﺒﺔ )(‬‫‪ +‬ﺸﻴ‬
‫‪‬ﻡ ﻤﺭﻜﺒﺔ )(‬‫‪ +‬ﻫﺩ‬ ‫"‪Mark = "Renault‬‬
‫‪+‬ﺃﻗﻠﻊ )(‬ ‫‪MaximalSpeed=230‬‬
‫ﺍﻟﻨﺴﺒﺔ ‪ :‬ﺼ ﺤﻴﺢ(‬‫‪ +‬ﺴﺎﺭﻉ )‬ ‫‪CouranteSpeed=140‬‬
‫‪ +‬ﺘﻘﺩﻡ )(‬
‫ﺍﺠﻊ )(‬ ‫‪ +‬ﺘﺭ‬
‫ﻋﻤﻠﻴﺔ ﺨﻠﻕ ﻤﺜﻴﻠﻴﻥﻟ ﺼﻨ ﻑ ﻭﺍﺤﺩ‬

‫‪ ،‬ﺒﻤﺎﺃﻨﻨﺎ ﻤﻴ ﺯﻨﺎ ﺒﻴ ﻥ ﺨ ﺼﺎﺌ ﺹ‬


‫ﻨﻔ ﺱﺍﻟﻤﻌﺎﻴﻴﺭ ﺘﻨ ﻁﺒﻕ ﻤﺒﺎﺸﺭﺓ ﻋﻠﻰﺍﻟﻤﻨﺎ ﻫﺞ‪ .‬ﻜﺫﻟ ﻙ‬
‫‪ ،‬ﻓﺴﻨﻤﻴ ﺯﺃﻴ ﻀﺎ ﺒﻴ ﻥ ﻤﻨﺎ ﻫﺞﺍﻟ ﺼﻨ ﻑ ﻭﻤﻨﺎ ﻫﺞﺍﻟﻤﺜﻴل‪.‬‬‫‪ ،‬ﻭﺨ ﺼﺎﺌ ﺹﺍﻟﻤﺜﻴل‬ ‫ﺍﻟ ﺼﻨ ﻑ‬

‫ﺍﺍﻟﻤﻨﻬﺎﺝ ﻴ ﻁﺒﻕ ﻋﻠﻰ ﻜل‬ ‫‪ ،‬ﻴ ﻅﻬﺭ ﺒﻭ ﻀﻭ ﺡﺃ ﻥ ﻫﺫ‬


‫ﻟﻨﺄﺨﺫ ﻤﺜﻼﺍﻟﻤﻨﻬﺎﺝﺃﻗﻠﻊ )(‪Start‬‬
‫ﺍﻟﺘﻲ‬
‫‪،‬ﻭ‬ ‫ﺍﻟﻜﺎﺌ ﻥﺍﻟﺠﺩﻴﺩ(‬
‫ﺍﺍﻟﻤﻨﻬﺎﺝ ﺴﻴﺴﺘﻌﻤل ﺨ ﺼﺎﺌ ﺹﺍﻟﻤﺜﻴل )‬ ‫‪ ،‬ﻫﺫ‬ ‫ﺍﺩﻴﺔ‪ .‬ﺒﺎﻟﻤﻘﺎﺒل‬‫ﻋﺭﺒﺔ ﺒ ﺼﻔﺔﺍﻨﻔﺭ‬
‫‪ ،‬ﺇﺫ ﻥ ﻨ ﺤ ﻥ ﻨﺘﻜﻠﻡ ﻋ ﻥ ﻤﻨﻬﺎﺝﺍﻟﻤﺜﻴل )ﻤﻨﻬﺎﺝ ﻴﺠ ﺏﻟﻜل ﻤﺜﻴلﺃ ﻥ ﻴﺘﻭﻓﺭ ﻋﻠﻰ‬
‫ﻴﺠﺭ ﻱ ﻋﻠﻴﻬﺎ ﺘ ﻁﺒﻴﻘﺎﺘﻪ‬
‫ﻨﺴﺨﺔ ﻤﻨﻪ(‪.‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫‪،‬‬‫‪ ،‬ﻫﺩﻓﻪ ﻫﻭ ﺨﻠﻕ ﻋﺭﺒ ﺔ ﺠﺩﻴﺩﺓ‬ ‫ﻭﻟﻨﻌﺘﺒﺭ ﻤﺜﻼﺍﻟﻤﻨﻬﺎﺝ ﺸﻴﺩ ﻋ ﺭﺒﺔ )(‪CreateVehicle‬‬
‫ﺍﺍﻋﺘﺒﺭﻨﺎ ﺒﺎﻟﺘﺩﻗﻴﻕ‬
‫ﺍﺌﻴﺔﻟﻜل ﺨ ﺼﺎﺌ ﺹﺍﻟﻤﺜﻴل‪ .‬ﺇﺫ‬ ‫‪ ،‬ﻤ ﻥ ﺘ ﺤﺩﻴﺩ ﻗﻴﻡ ﺒﺩ‬
‫ﺍﻟﺫ ﻱ ﻴﻤﻜﻨﻪ ﻓﻲ ﻭﻗ ﺕ ﺜﺎ ﻥ‬ ‫ﻭ‬
‫ﺍﻜﺭ ﻱ ﻟﻠﻜﺎﺌ ﻥﺍﻟﺠﺩﻴﺩ‪ .‬ﻭﻟﻜ ﻥ‬‫‪،‬ﻨﻼ ﺤ ﻅﺃ ﻥﺍﻟﻤﺭ ﺤﻠﺔﺍﻷﻭﻟﻰ ﺘﺘﻌﻠﻕ ﺒ ﺤﺠ ﺯ ﻤﻜﺎ ﻥ ﺫ‬ ‫ﻋﻤﻠﻴﺔ ﺨﻠﻕ ﻜﺎﺌ ﻥ‬
‫‪ ،‬ﻓﻘ ﻁﺍﻟ ﺼﻨ ﻑ ﻫﻭﺍﻟﺫ ﻱ ﻴﻤﻠ ﻙﺍﻟﻤﻌﻠﻭﻤﺎ ﺕﺍﻟﻼ ﺯﻤﺔ‬ ‫ﺍﺘﻪ‬
‫ﻫﺫﻩﺍﻟﻤﺭ ﺤﻠﺔ ﻻ ﻋﻼﻗﺔﻟﻬﺎ ﺒﺎﻟﻜﺎﺌ ﻥ ﻓﻲ ﺤﺩ ﺫ‬
‫ﻟﻌﻤﻠﻴﺔﺍﻟ ﺤﺠ ﺯ‪ :‬ﺇﺫ ﻥ ﺨﻠﻕ ﻜﺎﺌ ﻥ ﻫﻭ ﻤﻨﻬﺎﺝ ﻤ ﻥ ﻤﻨﺎ ﻫﺞﺍﻟ ﺼﻨ ﻑ‪.‬ﻨﺸﻴﺭ ﻜﺫﻟ ﻙ ﺇﻟﻰﺃﻨﻪ ﻓﻲ ﻫﺫﻩ‬
‫ﺍ‬‫‪ ،‬ﻤﺜﻼ‪ :‬ﻤﻌﻠﻭﻤﺎ ﺕ ﺘﺸﻴﺭ ﺇﻟﻰﺃ ﻱ ﺼﻨ ﻑ ﻴﻨﺘﻤﻲ ﻫﺫ‬ ‫ﺍ ﺕ ﺇ ﻀﺎﻓﻴﺔ‬ ‫‪ ،‬ﻴﺴﺘﻘﺒلﺍﻟﻜﺎﺌ ﻥ ﺇﺸﺎﺭ‬ ‫ﺍﻟﻤﺭ ﺤﻠﺔ‬
‫ﺍﻟﺫ ﻱ‬‫ﺍ‪ :‬ﻭ‬‫‪ ،‬ﺘ ﻁﺒﻕ ﻓﻘ ﻁ ﻓﻲ ﻜﺎﺌ ﻥ ﻤ ﺤﺩﺩ ﺠﻴﺩ‬‫‪ ،‬ﻓﻴﻡ ﻴﺨ ﺹ ﻋﻤﻠﻴﺔ ﺘﻬﻴﺌﺔﺍﻟﺨ ﺼﺎﺌ ﺹ‬ ‫ﺍﻟﻜﺎﺌ ﻥ‪ .‬ﺒﺎﻟﻤﻘﺎﺒل‬
‫ﻫﻭ ﻗﻴﺩﺍﻟﺘﺸﻴﻴﺩ‪ .‬ﺘﻬﻴﺌﺔﺍﻟﺨ ﺼﺎﺌ ﺹ ﺇﺫ ﻥ ﻫﻲ ﻤﻨﻬﺎﺝ ﻤ ﻥ ﻤﻨﺎ ﻫﺞﺍﻟﻤﺜﻴل ﻭﻟﻴ ﺱﺍﻟ ﺼﻨ ﻑ‪.‬‬

‫ﻨﺴﺘﺨﻠ ﺹ ﻓﻲﺍﻟﻨﻬﺎﻴﺔﺍﻟﻌﻼﻗﺔﺍﻵﺘﻴﺔ‪ :‬ﻋﻤﻠﻴﺔ ﺨﻠﻕ ﻜﺎﺌ ﻥ ﺘﻤﺭ ﻋﻠﻰ ﻤﺭ ﺤﻠﺘﻴ ﻥ‪:‬‬

‫‪ ،‬ﻭﺘﻭﻓﻴﺭﺃﺩﻨﻰ‬
‫ﺍﻜﺭ ﻱ ﻤ ﻥ ﻗﺒلﺍﻟ ﺼﻨ ﻑ ﻟﻠﻜﺎﺌ ﻥﺍﻟﺠﺩﻴﺩ‬
‫‪ ،‬ﻭ ﻫﻲ ﺤﺠ ﺯ ﻤﻜﺎ ﻥ ﺫ‬ ‫ﻤﺭ ﺤﻠﺔﺃﻭﻟﻰ‬
‫ﺍﻟﻤﻌﻠﻭﻤﺎ ﺕﻟﺠﻌلﺍﻟﻜﺎﺌ ﻥ ﻴﻨﻔﺫ‪.‬‬

‫‪ ،‬ﻭﺘﺘﻌﻠﻕ ﺒﺘﻬﻴﺌ ﺔ ﺨ ﺼﺎﺌ ﺹﺍﻟﻤﺜﻴل‪.‬‬


‫ﻤﺭ ﺤﻠﺔ ﺜﺎﻨﻴﺔ ﺘﺨ ﺹﺍﻟﻜﺎﺌ ﻥ‬

‫ﻟﻜﺒ ﺴﻠﺔ‪encapsulation :‬‬


‫ﻤﻔ ﻬ ﻭ ﻡﺍ‬ ‫‪٢‬‬

‫‪،‬ﻟﻘﺩ ﺨ ﻁﻭ ﺕ ﺨ ﻁﻭﺘ ﻙﺍﻷﻭﻟﻰ ﻨ ﺤﻭﺃ ﺤﺩ ﻋﻨﺎ ﺼﺭﺍﻟﻜﺒﺴﻠﺔﺍﻟﺜﻼﺜﺔ‪.‬ﺍﻟﻜﺒﺴﻠﺔ‬ ‫ﺒﺩﻭ ﻥ ﻤﻌﺭﻓﺔ‬


‫ﺘﺭﺘﻜ ﺯ ﻋﻠﻰ ﺜﻼﺜﺔ ﻤﻔﺎ ﻫﻴﻡ‪:‬‬

‫ﺍﻟﻜﻭﺩﺍﻟﻘﺎﺩﺭ ﻋﻠﻰ ﻤﻌﺎﻟﺠﺘﻬﺎ‬‫‪،‬ﻭ‬ ‫‪ v‬ﺍﻟﻜﺎﺌ ﻥ ﻴﺠﻤﻊ ﻓﻲ ﻤ ﻀﻤﻭﻨﻪﺒﻴﺎﻨﺎﺘﻪ )ﺨ ﺼﺎﺌ ﺼﻪ(‬


‫ﺍﻟﻤﻨﺎ ﻫﺞ(‪.‬‬
‫)‬
‫‪ ،‬ﺸﻜﻠﻪ ﻴﺘﺭﻜ ﺏ ﻤ ﻥ ﺭﺴﺎﺌل‬ ‫‪ v‬ﺘﺠﺭﻴﺩﺍﻟﺒﻴﺎﻨﺎ ﺕ‪ :‬ﻫﻴﻜل ﻜﺎﺌ ﻥ ﻤﺎ ﻻ ﻴ ﻅﻬﺭ ﻤ ﻥﺍﻟﺨﺎﺭﺝ‬
‫ﺍﺴﺘﻘﺒﺎل ﻷ ﻱ ﺭﺴﺎﻟﺔ ﻴﻨﺠﻡ ﻋﻨﻪ ﺘﻨﻔﻴﺫ ﻤﺠﻤﻭﻋﺔ ﻤ ﻥﺍﻟﻤﻨﺎ ﻫﺞ‪.‬‬ ‫‪،‬ﻭ‬ ‫ﻏﻴﺭﺍ ﺼ ﻁﻼ ﺤﻴﺔ‬
‫‪،‬‬‫ﺍ ﻤﺎ ﻨ ﻅﺭﻨﺎ ﻤ ﻥﺍﻟﺨﺎﺭﺝ )ﺒﺎﻟﻨﺴﺒﺔ ﻟﻤﺴﺘﺨﺩﻡﺍﻟﻜﺎﺌ ﻥ(‬‫ﺍ ﺕ‪ :‬ﺇﺫ‬‫ﺍﺀ‬‫‪ v‬ﺘﺠﺭﻴﺩﺍﻹﺠﺭ‬
‫‪ ،‬ﻓﻤﺜﻼ‪ :‬ﻫﻭ ﻻ‬ ‫ﺍﺨﻠﻲﺍﻟﻤ ﻁﺒﻕ‬‫ﺍﻟﻤﺴﺘﺨﺩﻡ ﻻ ﻴﻤﻠ ﻙﺃﺩﻨﻰ ﻤﻌﻠﻭﻤﺔ ﺤﻭلﺍﻟﻨﺸﺎ ﻁﺍﻟﺩ‬
‫‪ ،‬ﻴ ﺤﺘﺎﺝ ﺇﻟﻰ ﺘﻨﻔﻴﺫ ﺒﻌ ﺽﺃﻭ ﻜلﺍﻟﻤﻨﺎ ﻫﺞﺃﻡ‬ ‫ﺍ ﻜﺎ ﻥﺍﻟﻌﻤلﺍﻟﻤ ﻁﻠﻭ ﺏ‬ ‫ﻴﺩﺭ ﻱ ﻤﺎ ﺇﺫ‬
‫ﺍﻟﺦ‪.‬‬
‫‪،‬ﺃﻭ ﺴﻴﻘﻭﻡ ﺒﺨﻠﻕ ﻜﺎﺌ ﻥ ﻤﺅﻗ ﺕ‪...‬‬ ‫ﻻ‬

‫‪ ،‬ﺨﺩﻤﺎ ﺕﺍﻟﻜﺎﺌ ﻥ ﻟﻴﺴ ﺕ ﺇ ﺼ ﻁﻼ ﺤﻴﺔ ) ﻻ ﻴﻤﻜ ﻥ‬‫ﺤﺴ ﺏﺍﻟﻘﻴﻡﺍﻟﻘﺎﻨﻭﻨﻴﺔﺍﻟﻨﻤﻭﺫﺠﻴﺔ ﻟﻠﻜﺎﺌ ﻥ‬


‫ﺍﻟﺘﻲ ﻫﻲ ﻤﺭﻜﺒﺔ ﻤ ﻥ‪:‬‬ ‫‪،‬ﻭ‬ ‫ﺘ ﺤﻘﻴﻘﻬﺎ( ﺇﻻ ﻤ ﻥ ﺨﻼل ﺭﺴﺎﺌل‬

‫‪ v‬ﺇﺴﻡ‬
‫ﺍ ﺕﺍﻟﺩﺨﻭل‬ ‫‪ v‬ﻗﺎﺌﻤﺔ ﺒﺎﺭ‬
‫ﺍﻤﺘﺭ‬
‫ﺍ ﺕﺍﻟﺨﺭﻭﺝ‬ ‫‪ v‬ﻗﺎﺌﻤﺔ ﺒﺎﺭ‬
‫ﺍﻤﺘﺭ‬

‫‪ ،‬ﺇﻨﻬﺎ‬
‫ﺍﺠﻬﺘﻪ ‪interface‬‬ ‫ﻗﺎﺌﻤ ﺔﺍﻟﺭﺴﺎﺌلﺍﻟﺘﻲ ﻴﻘﺩﺭ ﺒﻔ ﻀﻠﻬﺎﺍﻟﻜﺎﺌ ﻥ ﻤ ﻥﺍﻻﺴﺘﺠﺎﺒﺔ ﺘﻤﺜل ﻭ‬
‫‪ ،‬ﻓﻴﺠ ﺏﺃ ﻥ ﻴﺒﻘﻰ ﻤﺨﻔﻴﺎ ﻋ ﻥ‬ ‫ﺍﻟﻘﺴﻡﺍﻟﻌﺎﻡ ‪ public‬ﻤ ﻥﺍﻟﻜﺎﺌ ﻥ‪.‬ﺃﻤﺎ ﻜل ﻤﺎ ﻴﺨ ﺹﺍﻟﻤﻌﺎﻟﺠﺔ‬
‫‪ ،‬ﻜلﺍﻟﻜﺎﺌﻨﺎ ﺕ‬ ‫‪ ،‬ﺘﻤﺎﻤﺎ‬‫ﺍ ﻤﺎ ﻴﻤﺜلﺍﻟﻘﺴﻡﺍﻟﺨﺎ ﺹ ‪ private‬ﻤ ﻥﺍﻟﻜﺎﺌ ﻥ‬ ‫ﺍﻟﻤﺴﺘﺨﺩﻡﺍﻟﻨﻬﺎﺌﻲ‪ :‬ﻭ ﻫﺫ‬
‫ﺍﻥ‬‫‪ ،‬ﻴﻘﺩﺭ‬ ‫‪ ،‬ﺒﺎﻟﻤﻘﺎﺒل ﻜﺎﺌﻨﻴ ﻥ ﻴﻨﺘﻤﻴﺎ ﻥﻟ ﺼﻨﻔﻴ ﻥ ﻤﺨﺘﻠﻔﻴ ﻥ‬
‫ﺍﺠﻬﺔ‬
‫ﺍ ﺕﺍﻟﻭ‬‫ﺍﻟﻤﻨﺘﻤﻴﺔ ﻟﻨﻔ ﺱﺍﻟ ﺼﻨ ﻑ ﺘﺘﻤﺘﻊ ﺒﺫ‬
‫ﺍﺠﻬﺔ ﻴﻤﻜ ﻥ ﺘﻤﺜﻴﻠﻬﺎ ﻋﻠﻰ ﺸﻜل ﺨﺎ ﺼﻴﺔ‬ ‫‪،‬ﺍﻟﻭ‬‫ﺍﺠﻬﺔ‪ .‬ﻤ ﻥ ﻭﺠﻬﺎ ﺕ ﻨ ﻅﺭ ﻤﺨﺘﻠﻔﺔ‬ ‫ﻋﻠﻰ ﺘﻘﺩﻴﻡ ﻨﻔ ﺱﺍﻟﻭ‬
‫ﻤﺘﻤﻴﺯﺓﻟﻠ ﺼﻨ ﻑ‪.‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﺍﺠﻬﺔ ﺘﻤﺜل‬
‫‪،‬ﺍﻟﻭ‬
‫ﺍ ﺕﺍﻟﺘﻭﺠﻪﺍﻟﻜﺎﺌﻨﻲ ‪oop‬‬‫‪ ،‬ﻓﻲ ﻤﻌ ﻅﻡﻟﻐﺎ ﺕﺍﻟﺒﺭﻤﺠﺔﺍﻟ ﺤﺩﻴﺜﺔ ﺫ‬ ‫ﺘ ﻁﺒﻴﻘﻴﺎ‬
‫ﻗﺎﺌﻤﺔﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﺘﻲ ﻴﻤﻜ ﻥﺍﻟﻨﻔﺎﺫ ﺇﻟﻴﻬﺎ ﻤ ﻥ ﻗﺒلﺍﻟﻤﺴﺘﺨﺩﻡ‪.‬‬

‫‪ ،‬ﺒ ﺤﻴﺙ ﻴﺴﻤﺢ ﺫﻟ ﻙ‬ ‫ﻤ ﻥﺍﻟﻤﺴﺘ ﺤﺴ ﻥ ﺇﺨﻔﺎﺀ ﺘﻔﺎ ﺼﻴل ﻤﻌﺎﻟﺠﺔﺍﻟﻜﺎﺌﻨﺎ ﺕ ﻋ ﻥﺃﻋﻴ ﻥﺍﻟﻤﺴﺘﺨﺩﻡ‬
‫ﺍﺨﻠﻲﻟﺒﻴﺎﻨﺎ ﺕﺍﻟ ﺼﻨ ﻑ )ﺘﺒﺩﻴل ﺠﺩﻭل ﺒ ﺤ ﺯﻤﺔ ﺭﻤﻭ ﺯ( ﻤ ﻥ ﺩﻭ ﻥﺍﻟﻠﺠﻭﺀ ﺇﻟﻰ‬ ‫ﺒﺘﻐﻴﻴﺭ ﻤﺜﻼﺍﻟﻬﻴﻜلﺍﻟﺩ‬
‫‪،‬‬‫ﺍﺜﻴﺘﻴ ﻥ )ﺒﻌﺩﻴ ﻥ(‬
‫ﺘﻌﺩﻴل ﻜﻭﺩﺍﻟﻤﺴﺘﺨﺩﻡ‪.‬ﺃﻭ ﻜﻤﺜﺎل ﺁﺨﺭ‪:‬ﻟﻨﻌﺘﺒﺭﺃ ﻥ ﺼﻨﻔﺎ ﻤﺎ ﻴﺸﻜلﻟﻨﺎ ﻨﻘ ﻁﺔ ﺒﺈ ﺤﺩ‬
‫ﺍﺘﻴ ﺏ‬‫ﺍﻟﺘﺭ‬‫ﺍ ﺼل ﻭ‬ ‫ﺍﻟﻲ ﻤﻭﻗﻊﺍﻟﻨﻘ ﻁﺔ ﻤ ﻥ ﻤ ﺤﻭﺭ ﻱﺍﻟﻔﻭ‬‫ﺍ ﻥ ﻋﻠﻰﺍﻟﺘﻭ‬‫ﺍﻟﺘﻲ ﺘﻌ ﻁﻴﻨﺎ ﻤﻨﻬﺎﺠﻴ ﻥ ﻴ ﺤﺩﺩ‬
‫ﻭ‬
‫ﺍﺨل‬ ‫ﺍ ﻜﺎﻨ ﺕﺍﻟﻨﻘ ﻁﺔ ﻤﻤﺜﻠﺔ ﺩ‬ ‫ﺍﻋﻲ ﺇﻋﻼﻡﺍﻟﻤﺴﺘﺨﺩﻡ ﻤﺎ ﺇﺫ‬ ‫‪ ،‬ﻭﺒﺎﻟﺘﺎﻟﻲﻟﻴ ﺱ ﻤ ﻥﺍﻟﺩ‬ ‫ﺍﻟﻌﻤﻭﺩ(‬‫ﺍﻟﺴ ﻁﺭ ﻭ‬‫)‬
‫ﺍﻟ ﺼﻨ ﻑ ﻋﻠﻰ ﺸﻜل ﻗ ﻁﺒﻲﺃﻭ ﺨ ﻁﻲ‪.‬‬

‫‪ ،‬ﺇﺫ ﻥ ﻫﻭ ﻤ ﻥ‬
‫ﺍﻹﺨﻔﺎﺀ(‬
‫ﺍﻡ ﺒﻤﺒﺩﺃﺍﻟﻜﺒﺴﻠﺔ )‬
‫ﻜلﺍﻟﻠﻐﺎ ﺕﺍﻟﻜﺎﺌﻨﻴﺔﺍﻟﺘﻭﺠﻪ ﻻ ﺘﺸﺘﺭ ﻁﺍﻻﻟﺘ ﺯ‬
‫ﺨ ﺼﻭ ﺼﻴﺎ ﺕ ﻭ ﻁﺭﻴﻘﺔ ﺘﻔﻜﻴﺭﺍﻟﻤ ﺼﻤﻡ‪.‬‬

‫ﻟ ﻭﺭﺍﺜﺔ‪Heritage :‬‬
‫‪ ٣‬ﺍ‬

‫ﺍﺜﺔ ﻫﻭ ﺜﺎﻨﻲ ﻤﺒﺩﺃ ﻤ ﻥﺍﻟﻤﺒﺎﺩ ﺉﺍﻷﺴﺎﺴﻴﺔﺍﻟﺜﻼﺜﺔ‪ .‬ﻭﻴﺘﻌﻠﻕ ﺒﺘﺭﺠﻤﺔﺍﻟﻤﻔﻬﻭﻡﺍﻟ ﻁﺒﻴﻌﻲ‬


‫ﺍﻟﻭﺭ‬
‫ﻟﻠﺘﻌﻤﻴﻡ ‪/‬ﺍﻟﺘﺨ ﺼﻴ ﺹ‪.‬‬

‫‪،‬ﺃ ﻏﻠ ﺏﺍﻷﻨ ﻅﻤﺔﺍﻟ ﺤﻘﻴﻘﻴﺔ ﺘﺴﻌﻰ ﺇﻟﻰ ﺠﻌلﺍﻟﻌﻨﺎ ﺼﺭﺍﻟﺘﻲ ﺘﺭﻜﺒﻬﺎ ﻋﻠﻰ ﺸﻜل ﺘﺴﻠﺴﻠﻲ‬ ‫ﺇﺫ ﻥ‬
‫‪ ،‬ﻭﺒﺎﻟﺘﻔ ﺼﻴل‬
‫ﺍﺍﻟﻤﻭ ﻀﻭﻉ ﻜﺎﻨ ﺕ ﻋﻠﻰ ﻋﻼﻗﺔ ﺒﻌﻠﻡﺍﻷ ﺤﻴﺎﺀ‬‫) ﻫﻴﺎﺭﺸ ﻲ(‪.‬ﺍﻟﻔﻜﺭﺓﺍﻷﻭﻟﻰ ﺤﻭل ﻫﺫ‬
‫ﺍ ﻋﻠﻰ ﻤﻌﺎﻴﻴﺭ ﻤﺨﺘﻠﻔﺔ‪.‬‬
‫ﺍ ﺕﺍﻋﺘﻤﺎﺩ‬
‫ﻜﺎﻨ ﺕ ﺒﺨ ﺼﻭ ﺹ ﺘﻘﻨﻴﺔ ﺘﺭﺘﻴ ﺏﺍﻟ ﺤﺸﺭ‬

‫ﺍﺍﻟﻤﻔﻬﻭﻡ ﻋﻠﻰﺃﻨﻪ ﺒﺈﻤﻜﺎ ﻥ ﻜﺎﺌ ﻥ ﻤﺎ ﻤ ﻥﺍﻻﺴﺘﻔﺎﺩﺓ‬


‫ﺍﺜﺔ‪ .‬ﻴﺭﺘﻜ ﺯ ﻫﺫ‬
‫ﻋﻭﺩﺓ ﺇﻟﻰ ﻤﻭ ﻀﻭﻉﺍﻟﻭﺭ‬
‫ﺍ ﺹ ﺘﺘﻌﻠﻕ ﺒﻪ‬‫ﺍﻟﺫ ﻱ ﻴﻤﻜ ﻥ ﻟﻪﺃ ﻥ ﻴ ﻀﻴ ﻑ ﻤﺠﻤﻭﻋﺔ ﻤ ﻥﺍﻟﺨﻭ‬ ‫‪،‬ﻭ‬‫ﺍ ﺹﺍﻟﻜﺎﺌ ﻥﺍﻷﻋﻠﻰ ﻤﻨﻪ‬
‫ﻤ ﻥ ﺨﻭ‬
‫ﻟﻭ ﺤﺩﻩ‪.‬‬

‫ﺍﺍﻟﻤﻔﻬﻭﻡ ﺒﺎﻟ ﻁﺭﻴﻘﺔﺍﻵﺘﻴﺔ‪:‬‬


‫‪ ،‬ﻴﻤﻜ ﻥ ﺘﺭﺠﻤﺔ ﻫﺫ‬
‫ﻤ ﻥﺍﻟﺠﺎﻨ ﺏﺍﻟﻜﺎﺌﻨﻲ‬

‫ﺍﺍﻟ ﺼﻨ ﻑ ﺒﺎﻟ ﺼﻨ ﻑ‬‫‪ ،‬ﻭﻨﺴﻤﻲ ﻫﺫ‬ ‫‪ v‬ﻨﺨ ﺼ ﺹ ﺼﻨ ﻑ ﺇﻟﻰﺍﻟﻤﺴﺘﻭﻯﺍﻷﻜﺜﺭ ﻋﻤﻭﻤﻴﺔ‬


‫‪،‬ﺃﻭﺍﻟ ﺼﻨ ﻑﺍﻷ ﺏﺃﻭ ﻜﺫﻟ ﻙ ﺒﺎﻟ ﺼﻨ ﻑﺍﻟﻤﻤﺘﺎ ﺯ‪.‬‬‫ﺍﻟﻘﺎﻋﺩ ﻱ‬
‫‪ ،‬ﻨﺸﺘﻕ ﻤﻔﻬﻭﻤﺎ ﻗﺎﻋﺩﻴﺎ‪.‬ﺍﻟ ﺼﻨ ﻑﺍﻟﺠﺩﻴﺩ ﻴ ﻁﻠﻕ ﻋﻠﻴﻪ‬ ‫‪ v‬ﻟﻜل ﻤﻔﻬﻭﻡ ﻤﺘﺨ ﺼ ﺹ‬
‫ﺍﻟ ﺼﻨ ﻑﺍﻟﻤﺸﺘﻕﺃﻭﺍﻟ ﺼﻨ ﻑﺍﻹﺒ ﻥﺃﻭ ﻜﺫﻟ ﻙ ﺒﺎﻟ ﺼﻨ ﻑﺍﻟﻔﺭﻋﻲ‪.‬‬

‫ﺍﺜﻴﺔ‬
‫‪ ،‬ﻭﺒﺎﻟﺘﺎﻟﻲ ﻴﻤﻜﻨﻨﺎ ﺘﺭﺠﻤﺔ ﻜل ﻋﻼﻗﺔ ﻭﺭ‬
‫ﺍﺜﺔ ﺘﻌﺒﺭ ﻋ ﻥ ﻋﻼﻗﺔ ﺘﻌﻤﻴﻡ ‪ /‬ﺘﺨ ﺼﻴ ﺹ‬
‫ﺍﻟﻭﺭ‬
‫ﺒﺎﻟﺠﻤﻠﺔﺍﻵﺘﻴﺔ‪:‬‬

‫ﻟﻘﺎ ﻋﺩ ﻱ‬
‫ﻟ ﻤﺸﺘﻕ ﻫﻭﺇ ﺼﺩﺍ ﺭ ﺨﺎ ﺹ ﻤﻥ ﺼﻨﻔ ﻪﺍ‬
‫ﻟ ﺼﻨ ﻑﺍ‬
‫ﺍ‬

‫ﺍﺜﺔ‪:‬‬
‫ﺴﻨﻘﺩﻡ ﻤﺜﺎﻟﻴ ﻥ ﻜﻼﺴﻴﻜﻴﻴ ﻥﻟﺘﻤﺜﻴل ﻓﻜﺭﺓﺍﻟﻭﺭ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫‪ .١‬اﻟﻤﺜﺎلاﻷول‪:‬اﻟﻜﺎﺋﻨﺎ تاﻟﺒﻴﺎﻧﻴﺔ ‪Graphic objects‬‬ ‫‪.٣‬‬

‫‪ ،‬ﻭ ﻫﺫﻩﺍﻷﺨﻴﺭﺓ‬ ‫‪ ،‬ﻜل ﻜﺎﺌ ﻥ ﺒﻴﺎﻨﻲ ﻴﻤﻜ ﻥﺍﻟﺘﻌﺒﻴﺭ ﻋﻨﻪ ﺒﻨﻘ ﻁﺔ‬
‫ﻟﻨﻌﺘﺒﺭ ﻤﺠﻤﻭﻋﺔ ﻜﺎﺌﻨﺎ ﺕ ﺒﻴﺎﻨﻴﺔ‬
‫‪ ،‬ﺴﻭ ﻑ‬‫ﺍ ﺨﻠﻕ ﻭ ﻫﺩﻡﺍﻟﻜﺎﺌ ﻥ‬ ‫‪ ،‬ﻭﻨ ﺤﺩﺩﻟﻬﺎﻟﻭﻨﻬﺎ‪ .‬ﻤﺎﻋﺩ‬ ‫ﺍﺜﻴﺘﻴ ﻥﺍﻟﺨ ﻁﻴﺘﻴ ﻥ ‪ X‬ﻭ‪Y‬‬ ‫ﻴﺘﻡ ﺘﻤﺜﻴﻠﻬﺎ ﺒﺎﻹ ﺤﺩ‬
‫ﺍﺍﻟﻜﺎﺌ ﻥﺍﻟﺒﻴﺎﻨﻲ‪:‬‬ ‫ﻨﻌﻴ ﻥﺍﻟﻤﻨﺎ ﻫﺞﺍﻵﺘﻴﺔﻟﻬﺫ‬

‫ﺍﻟﺒﻴﺎﻨﺎ ﺕ(‬
‫ﺍﺀﺓ ﺇﻟﻰﺍﻟﺨ ﺼﺎﺌ ﺹ )‬
‫ﺍﻟﻘﺭ‬
‫ﺃﻨﻔﺫ ﺒﺎﻟﻜﺘﺎﺒﺔ ﻭ‬ ‫‪v‬‬
‫ﺃﻨﺸﺭ‬ ‫‪v‬‬
‫ﺃﻤ ﺤﻭ‬ ‫‪v‬‬
‫ﺤﺭ ﻙﺍﻟﻜﺎﺌ ﻥ‪.‬‬ ‫‪v‬‬

‫ﺇﺫ ﻥ ﺴﻨ ﺤ ﺼل ﻋﻠﻰ ﺸﻜلﺍﻟ ﺼﻨ ﻑ ‪ObjetGraphic‬ﺍﻟﻤﻘﺩﻡ ﻓﻲﺍﻟ ﺼﻔ ﺤﺔﺍﻵﺘﻴﺔ‪.‬‬

‫‪ ،‬ﻜل ﻤﻨﻬﻤﺎ‬ ‫ﺍﺌﺭﺓ ‪Line & Circle‬‬ ‫ﺍﻟﺩ‬


‫ﻨ ﻀﻴ ﻑ ﺒﻌﺩ ﺫﻟ ﻙ ﺼﻨﻔﻴ ﻥ ﻤﺘﺨ ﺼ ﺼﻴ ﻥ‪:‬ﺍﻟﺴ ﻁﺭ ﻭ‬
‫ﺍﻭﻴﺔ‬
‫ﺍﻟ ﺯ‬
‫‪،‬ﺍﻟ ﻁﻭل ﻭ‬ ‫ﺍﺌﺭﺓ‬
‫ﺍ ﺹﺍﻟﻤﺘﻌﻠﻘﺔ ﺒﻪ‪:‬ﺍﻟﻘ ﻁﺭ ‪ Rayon‬ﺒﺎﻟﻨﺴﺒﺔﻟﻠﺩ‬ ‫ﺍﺘﻪ ﺒﻌ ﺽﺍﻟﺨﻭ‬ ‫ﻴ ﻀﻴ ﻑﻟﺫ‬
‫ﻟﺩﺍﺌ ﺭﺓ‬
‫ﻟﺴﻁ ﺭ ﻭﺍ‬‫‪،‬ﺃﻴ ﻀﺎ ﻴﺘﻤﺘﻊ ﻜل ﻤ ﻥﺍﻟ ﺼﻨﻔﻴ ﻥ‪:‬ﺍ‬‫ﺒﺎﻟﻨﺴﺒﺔ ﻟﻠﺴ ﻁﺭ ‪Length & Angle‬‬
‫ﺍ ﺕ ﻜل ﺼﻨ ﻑ ﺯﻴﺎﺩﺓ ﻋﻠﻰ ﺨ ﺼﺎﺌ ﺹﺍﻟ ﺼﻨ ﻑ‬ ‫ﺍﻟﺘﻲ ﺘﺘﺭﺠﻡ ﻤﻤﻴ ﺯ‬
‫ﺒﺨ ﺼﺎﺌ ﺼﻪ )ﺒﻴﺎﻨﺎﺘﻪ(ﺍﻟﺨﺎ ﺼﺔ ﺒﻪ ﻭ‬
‫ﺍﻟﻘﺎﻋﺩ ﻱﺍﻟﺫ ﻱ ﻭﺭﺜﺎ ﻋﻨﻪ‪.‬‬

‫ﺍﻟ ﺼﻨﻔﻴ ﻥ‪ :‬ﺴﻁ ﺭ ﻭﺩﺍﺌ ﺭﺓ ﻟﻴﺴﺎ ﺒﺈﻤﻜﺎﻨﻬﻤﺎ ﺘ ﺤﻘﻴﻕﺍﻟﻜﻭﺩ ﻟﻠﻤﻨﻬﺎﺝ ‪GetX‬ﺍﻟﻤﺴﺅﻭل ﻋ ﻥ‬


‫‪ ،‬ﻭﻟﻜ ﻥ ﺒﺈﻤﻜﺎﻨﻬﻤﺎ ﺇ ﻀﺎﻓﺔ ﻤﻨﺎ ﻫﺞﺃﺨﺭﻯ ﻟﻠﻭ ﺼﻭل ﺇﻟﻰ‬
‫ﺍ ﺼل‬
‫ﺘ ﺤﺩﻴﺩ ﻤﻭﻗﻊﺍﻟﻨﻘ ﻁﺔ ﻤ ﻥ ﻤ ﺤﻭﺭﺍﻟﻔﻭ‬
‫ﺨ ﺼﺎﺌ ﺼﻬﻤﺎﺍﻟﺠﺩﻴﺩﺓ‪.‬‬

‫‪ ،‬ﻓﺈﻨﻨﺎ ﺴﻨﻼ ﺤ ﻅﺃ ﻥ ﻜﻼﺍﻟ ﺼﻨﻔﻴ ﻥ‬‫ﺍ ﻓﻲﺍﻟﺘ ﺼﻤﻴﻡ‬‫ﺍ ﻤﺎ ﻗﻤﻨﺎ ﺒﺎﻟﺘﻤﻌ ﻥ ﺠﻴﺩ‬‫‪ ،‬ﺇﺫ‬
‫ﺒﺎﻹ ﻅﺎﻓﺔ ﺇﻟﻰ ﺫﻟ ﻙ‬
‫‪ ،‬ﺒ ﺤﻴﺙﺃ ﻥ ﻁﺭﻴﻘﺔ‬ ‫ﺍﺍﻟﻤﻨﻬﺎﺝ ‪Clear‬‬ ‫ﺍﺌﺭﺓ ﻗﺩ ﻗﺎﻡ ﺒﺈﻋﺎﺩﺓ ﺘﻌﺭﻴ ﻑﺍﻟﻤﻨﻬﺎﺝ ‪ Display‬ﻭﻜﺫ‬ ‫ﺴ ﻁﺭ ﻭﺩ‬
‫‪ ،‬ﻭﻨﻔ ﺱﺍﻟﻔﻜﺭﺓ ﺘﻨ ﻁﺒﻕ ﻋﻠﻰ ﻁﺭﻴﻘﺔﺍﻟﻤ ﺤﻭ‪ :‬ﺇﻨﻪ‬ ‫ﺍﺌﺭﺓ‬‫ﻨﺸﺭﺍﻟﺴ ﻁﺭ ﻤﺜﻼ ﺘﺨﺘﻠ ﻑ ﻋ ﻥ ﻁﺭﻴﻘﺔ ﻨﺸﺭ ﺩ‬
‫ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ‪Polymorphism‬ﺍﻟﻤ ﻁﺒﻕ ﻋﻠﻰﺍﻟﻤﻨﻬﺎﺠﻴ ﻥ ‪ Display‬ﻭ ‪ Clear‬ﻓﻲ ﺇ ﻁﺎﺭ‬
‫ﺍﻟ ﺼﻨﻔﻴ ﻥ ﺴﻁ ﺭ ﻭﺩﺍﺌ ﺭﺓ‪.‬‬
‫‪ ،‬ﻭﻟﻜ ﻥ ﻓﻲﺍﻟﻭﻗ ﺕﺍﻟ ﺤﺎﻟﻲ ﻴﻜﻔﻴ ﻙ ﻤﻌﺭﻓﺔ‬
‫ﺴﻨﻌﻭﺩ ﺒﺎﻟﺘﻔ ﺼﻴل ﺤﻭل ﻤﻔﻬﻭﻡ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ‬
‫ﺍﻟﺔ( ﻴﻤﻜﻨﻪﺍﺘﺨﺎﺫ ﻋﺩﺓﺃﺸﻜﺎل‪:‬‬ ‫ﺍﺀ ‪/‬ﺍﻟﺩ‬‫ﺃ ﻥﺍﻟﻤﻨﻬﺎﺝ )ﺃﻭﺍﻹﺠﺭ‬

‫ﺍﻡ ﻨﻔ ﺱﺍﻹﺴﻡ‬ ‫ﺍﺌﺩ ‪overload‬ﺍﻟﺫ ﻱ ﻴﺴﻤﺢ ﺒﺎﺴﺘﺨﺩ‬ ‫‪ v‬ﺸﻜل ﻗﻭ ﻱ‪:‬ﺍﻟﺘ ﺤﻤﻴلﺍﻟ ﺯ‬


‫ﺍ ﺕﺍﻟﻤﺨﺘﻠﻔﺔ‪.‬‬‫ﺍﻤﺘﺭ‬
‫ﺍﻟﺔ ﻤﻊ ﻗﺎﺌﻤﺔ ﻤ ﻥﺍﻟﺒﺎﺭ‬‫ﺍﺀ ‪/‬ﺍﻟﺩ‬ ‫ﻟﻠﻤﻨﻬﺎﺝ ‪/‬ﺍﻹﺠﺭ‬
‫‪ v‬ﺍﻟﺸﻜلﺍﻟﻘﻭ ﻱﻟﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕﺍﻟﺫ ﻱ ﻴﺘﻌﻠﻕ ﺒﺈﻋﺎﺩﺓ ﺘﻌﺭﻴ ﻑﺍﻟﻤﻨﻬﺎﺝﺍﻟﺘﺎﺒﻊ‬
‫ﻟﻠ ﺼﻨ ﻑﺍﻷ ﺏ ﻤ ﻥ ﻗﺒلﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺸﺘﻘﺔ ﻤﻨﻪ ﻤﻊﺍﺴﺘﻌﻤﺎل ﻨﻔ ﺱﺍﻟﺘﻭﻗﻴﻊ‬
‫ﺍ ﺕ ﻭﻨﻔ ﺱ ﻨﻭﻉ ﻗﻴﻤﺔﺍﻟﻌﻭﺩﺓ(‪.‬‬ ‫ﺍﻤﺘﺭ‬
‫)ﻨﻔ ﺱ ﻗﺎﺌﻤﺔﺍﻟﺒﺎﺭ‬

‫ﺍ ﺕ ﻭﻨﻭﻉ ﻗﻴﻤﺔﺍﻟﻌﻭﺩﺓ(ﺍﻟﻤﻨﻬﺎﺠﻴ ﻥﺃﻨﺸ ﺭ‬‫ﺍﻤﺘﺭ‬


‫ﻤ ﻥﺍﻟﻤﻬﻡ ﻤﻼ ﺤ ﻅﺔﺃ ﻥ ﺘﻭﻗﻴﻌﺎ ﺕ ) ﻗﺎﺌﻤﺔﺍﻟﺒﺎﺭ‬
‫ﺍ ﻴﺴﻤﺢ ﺒ ﻁﻠ ﺏﺍﻟﻤﻨﻬﺎﺝ‬‫ﺃﻤﺤﻭ‪ ،‬ﻫﻲ ﻨﻔﺴﻬﺎ ﻓﻲﺍﻟ ﺼﻨ ﻑﺍﻷ ﺏﺃﻜﺜﺭ ﻤﻨﻪ ﻓﻲﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺸﺘﻘﺔ‪ .‬ﻫﺫ‬ ‫ﻭ‬
‫‪ ،‬ﻭﻤ ﻥ ﺩﻭ ﻥﺍﻟ ﺤﺎﺠﺔﻟﻤﻌﺭﻓﺔ ﺇﻟﻰﺃ ﻱ ﺼﻨ ﻑ‬ ‫ﻓﻲﺃ ﻱ ﻜﺎﺌ ﻥ ﻤ ﻥ ﻨﻔ ﺱﺍﻟﺘﺴﻠﺴل ﻭﺒﻨﻔ ﺱﺍﻷﺴﻠﻭ ﺏ‬
‫ﻴﻨﺘﻤﻲﺍﻟﻤﻨﻬﺎﺝﺍﻟﻤ ﻁﻠﻭ ﺏ‪ .‬ﻗﻭﺓ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ‪ polymorphism‬ﻏﻴﺭ ﻤ ﺤﺩﻭﺩﺓ‪.‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


GraphicObject

#NumberOfGraphicObjects: integer

# Color : ColorType
# X: integer
# Y: integer Base class:
+ Create () general concept
+ Destroy ()
+ GetX()
+ GetY()
+ SetX()
+ SetY()
+ MoveTo(ToX : integer, ToY : integer)
+ Display ()
+ Clear ()

Derived class:
specialized concept

Line Circle
# Length: integer
# Rayon: integer
# Angle: float
+ Create () + Create ()
+ Destroy () + Destroy ()
+ GetLength(): Integer + GetRayon(): Integer
+ SetLength(Value: Integer) + SetRayon(Value: Integer)
+ Display () + Display ()
+ Clear () + Clear ()

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


‫‪ ،‬ﺘﻡﺍﻻﺴﺘﻐﻨﺎﺀ‬
‫ﺍﺍﻟﺘ ﺼﻤﻴﻡ‬ ‫ﺍﻜﻡ ﻓﻲ ﻫﺫ‬
‫ﻤ ﻥﺃﺠل ﺘﻔﺎﺩ ﻱﺍﻟﺘﺭ‬
‫ﺍ ﺕﺍﻟﻤﻨﺎ ﻫﺞ‪.‬‬‫ﺍﻤﺘﺭ‬
‫ﻋ ﻥﺒﺎﺭ‬

‫ﻜﺎﺌﻥ ﺒﻴﺎﻨﻲ‬

‫‪ #‬ﻋﺩﺩﺍﻟﻜﺎﺌﻨﺎ ﺕﺍﻟﺒﻴﺎﻨﻴﺔ‪ :‬ﺼ ﺤﻴﺢ‬ ‫اﻟ ﺼﻨ ﻒ اﻟﻘﺎﻋﺪ ي‪:‬‬


‫ﻔﻬﻮم اﻟﻌﺎم‬‫اﻟﻤ‬
‫‪#‬ﺍﻟﻠﻭ ﻥ‪ :‬ﻨﻭﻉﺍﻟﻠﻭ ﻥ‬
‫‪ #‬ﺱ‪ :‬ﺼ ﺤﻴﺢ‬
‫‪ #‬ﻉ‪ :‬ﺼ ﺤﻴﺢ‬
‫‪‬ﺩ )(‬
‫ﺸﻴ‬
‫‪‬ﻡ )(‬
‫‪ +‬ﻫﺩ‬
‫‪ +‬ﺨﺫ ﺱ )(‬
‫‪ +‬ﺨﺫ ﻉ )(‬
‫‪ +‬ﻀﻊ ﺱ )(‬
‫‪ +‬ﻀﻊ ﻉ )(‬
‫‪ ،‬ﻤﻭ ﻀﻊ ﻉ ‪ :‬ﺼ ﺤﻴﺢ(‬
‫‪ +‬ﺘ ﺤﺭ ﻙ ﺇﻟﻰ )ﻤﻭ ﻀﻊ ﺱ‪ :‬ﺼ ﺤﻴﺢ‬
‫‪+‬ﺃﻨﺸﺭ )(‬
‫‪+‬ﺃﻤ ﺤﻭ )(‬

‫اﻟ ﺼﻨ ﻒ اﻟﻤﺸﺘ ﻖ‪:‬‬


‫ﻔﻬﻮم اﻟﻤﺘﺨ ﺼ ﺺ‬ ‫اﻟﻤ‬

‫ﺴﻁ ﺭ‬ ‫ﺩﺍﺌ ﺭﺓ‬

‫‪ #‬ﻁﻭل‪ :‬ﺼ ﺤﻴﺢ‬


‫‪ #‬ﻗ ﻁﺭ‪ :‬ﺼ ﺤﻴﺢ‬
‫ﺍﻭﻴﺔ‪ :‬ﺤﻘﻴﻘﻲ‬
‫‪ #‬ﺯ‬
‫‪‬ﺩ )(‬
‫ﺸﻴ‬ ‫‪‬ﺩ )(‬
‫ﺸﻴ‬
‫‪‬ﻡ )(‬
‫‪ +‬ﻫﺩ‬ ‫‪‬ﻡ )(‬
‫‪ +‬ﻫﺩ‬
‫‪ +‬ﺨﺫﺍﻟ ﻁﻭل )(‬ ‫‪ +‬ﺨﺫﺍﻟﻘ ﻁﺭ )(‬
‫‪ +‬ﻀﻊﺍﻟ ﻁﻭل )ﻗﻴﻤﺔ‪ :‬ﺼ ﺤﻴﺢ(‬ ‫‪ +‬ﻀﻊﺍﻟﻘ ﻁﺭ )(‬
‫‪+‬ﺃﻨﺸﺭ )(‬ ‫‪+‬ﺃﻨﺸﺭ )(‬
‫‪+‬ﺃﻤ ﺤﻭ )(‬ ‫‪+‬ﺃﻤ ﺤﻭ )(‬

‫ﻟ ﺼﻨ ﻑ ‪GraphicObject‬‬ ‫ﺘ ﺴﻠ ﺴلﺍ‬
‫‪ ،‬ﻭ ﺤﻴﺙ‬
‫ﺍﺜﺔ ﻴﺘﻡﺍﻹﺸﺎﺭﺓ ﺇﻟﻴﻬﺎ ﺒﺴﻬﻡ ﺫﻭ ﻨﻬﺎﻴﺔ ﻤﺜﻠﺜﻴﺔ‬
‫‪ ،‬ﻋﻼﻗﺔﺍﻟﻭﺭ‬ ‫ﺤﺴ ﺏﺍﻟ ـ ‪UML‬‬
‫ﺍﻻﺘﺠﺎﻩ ﻴﻜﻭ ﻥ ﻨ ﺤﻭﺍﻟ ﺼﻨ ﻑﺍﻷ ﺏ‪.‬‬

‫ﺍ ﺕﺍﻹﺴﻡ‬
‫ﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﻤﻜﺘﻭﺒﺔ ﺒﺨ ﻁ ﻤﺎﺌل ﻫﻲ ﻤﺠﺭﺩﺓ‪ .‬ﻓﻨﺴﺘﻨﺘﺞ ﻤﺒﺎﺸﺭﺓﺃ ﻥﺍﻷ ﺼﻨﺎ ﻑ ﺫ‬
‫‪ ،‬ﻭﺒﺎﻟﺘﺎﻟﻲ ﻻ ﻴﻤﻜﻨﻨﺎ ﺨﻠﻕ ﻤﺜﻴﻼ ﺕ ﻋﻨﻬﺎ ﻤﺒﺎﺸﺭﺓ‪.‬‬
‫ﺍﻟﻤﺎﺌل )‪ (italic‬ﻫﻲﺃﻴ ﻀﺎ ﻤﺠﺭﺩﺓ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫‪ ،‬ﻭﺒﺎﻟﺘﺎﻟﻲ ﻻ ﻴﻤﻜﻨﻨﺎ ﺨﻠﻕ ﻤﺜﻴﻼ ﺕ ﻋﻨﻬﺎ ﻤﺒﺎﺸﺭﺓ‪.‬‬
‫ﺍﻟﻤﺎﺌل )‪ (italic‬ﻫﻲﺃﻴ ﻀﺎ ﻤﺠﺭﺩﺓ‬

‫ﺍﻟﺨ ﺼﺎﺌ ﺹﺍﻟﻤﺴ ﻁﺭﺓ ﻫﻲﺃﻋ ﻀﺎ ﺀﻟﻠ ﺼﻨ ﻑ‪.‬‬


‫‪،‬ﺍﻟﻤﻨﺎ ﻫﺞ ﻭ‬
‫ﻟﻠﺘﺫﻜﻴﺭ‬

‫‪،‬‬‫‪ ،‬ﺒﺄﺴﻠﻭ ﺏﺃﺩﺒﻲ‬


‫‪ ،‬ﺇﺫ ﻥ‬
‫‪ ‬ﻑ ﻤﺭﺓ ﺜﺎﻨﻴﺔ‬
‫ﺃﺠﻠ ﺏﺍﻨﺘﺒﺎ ﻫ ﻙ ﺇﻟﻰﺃ ﻥﺍﻟﻤﻨﻬﺎﺝ ‪ MoveTo‬ﻟﻡ ﻴﻌﺭ‬
‫ﺍﺍﻟﺸﻜل‪:‬‬ ‫ﻴﻤﻜﻨﻨﺎ ﺘﺭﻜﻴﺒﻪ ﻋﻠﻰ ﻫﺫ‬
‫)‪method GraphicObject :: MoveTo (Pos X: Integer, Pos Y: Integer‬‬
‫{‬
‫]‪[object Clear‬‬
‫]‪[object Set X : Pos X‬‬
‫]‪[object Set Y : Pos Y‬‬
‫]‪[object Display‬‬
‫}‬

‫ﻟﻌﺎ ﻡﻟﻠﻤﻨ ﻬﺎﺝ ‪MoveTo‬‬


‫ﻟﻜ ﻭﺩﺍ‬
‫ﺍ‬

‫ﺍﺍﻟﺘﺭﻜﻴ ﺏ ﺴﻠﻴﻡ ﻤ ﻥ ﺤﻴﺙﺃ ﻥ ﻤﻨﻬﺎﺝ ﻤ ﺤﻭﺍﻟﺴ ﻁﺭ ‪Clear‬‬ ‫ﺇﻨﻪ ﻤ ﻥﺍﻟﺴﻬل ﻤﻼ ﺤ ﻅﺔﺃ ﻥ ﻫﺫ‬
‫‪ ،‬ﻭﻨﻔ ﺱﺍﻟﺸﻲﺀ‬ ‫ﺍ ﻤﺎ ﺘﻡ ﺘﻨﻔﻴﺫﺍﻟﻤﻨﻬﺎﺝ ‪ MoveTo‬ﻷ ﻱ ﻜﺎﺌ ﻥ ﻤﺸﺘﻕ ﻤ ﻥﺍﻟ ﺼﻨ ﻑ ‪Line‬‬ ‫ﻴﺘﻡ ﻁﻠﺒﻪ ﺇﺫ‬
‫ﺍ ﺘﻡ‬‫ﻟﻠﻜﺎﺌﻨﺎ ﺕﺍﻟﻤﺸﺘﻘﺔ ﻤ ﻥﺍﻟ ﺼﻨ ﻑ ‪ .Circle‬ﻤﺭﺓﺃﺨﺭﻯ ﻨﺴﺘﻌﻤل ﻫﻨﺎ ﻤﺒﺩﺃ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ‪ .‬ﻓﺈﺫ‬
‫ﺍﺍﻟﻤﻨﻬﺎﺝ ﻴﻘﻭﻡ ﺒ ﻁﻠ ﺏ ‪Clear‬‬ ‫‪ ،‬ﻓﺈ ﻥ ﻫﺫ‬
‫ﺘ ﻁﺒﻴﻕﺍﻟﻤﻨﻬﺎﺝ ‪ MoveTo‬ﻋﻠﻰ ﻜﺎﺌ ﻥ ﻤ ﻥ ﻨﻭﻉ ‪Circle‬‬
‫‪،‬‬‫ﻭ ‪Display‬ﺍﻟﺘﺎﺒﻌﻴ ﻥﻟﻠ ﺼﻨ ﻑ ‪) Circle‬ﻨﺸﻴﺭ ﺇﻟﻰ ‪ Circle::Display‬ﻭ ‪( Circle::Clear‬‬
‫ﺍ‬‫‪ ،‬ﻓﻔﻲ ﻫﺫﻩﺍﻟ ﺤﺎﻟﺔ ﻴﻘﻭﻡ ﻫﺫ‬ ‫ﺃﻤﺎﻟﻭ ﺘﻡ ﺘ ﻁﺒﻴﻕﺍﻟﻤﻨﻬﺎﺝ ‪ MoveTo‬ﻋﻠﻰ ﻜﺎﺌ ﻥ ﻤ ﻥ ﻨﻭﻉ ‪Line‬‬
‫ﺍﻟﻤﻨﻬﺎﺝﺒ ﻁﻠ ﺏ ‪ Clear‬ﻭ ‪Display‬ﺍﻟﺘﺎﺒﻌﻴ ﻥﻟﻠ ﺼﻨ ﻑ ‪) Line‬ﻭ ﻫﻤﺎﺍﻟﻤﻨﻬﺎﺠﻴ ﻥ ‪Line::Clear‬‬
‫ﻭ‪.( Line::Display‬‬

‫ﺍﻟﺘﻲ ﻨﻭﺭﺩ ﺒﻌ ﻀﻬﺎ‪:‬‬


‫ﺍﻴﺎ ﻭ‬
‫‪ ،‬ﻨﺴﺘﺨﻠ ﺹ ﺠﻤﻠﺔ ﻤ ﻥﺍﻟﻤ ﺯ‬
‫ﺍﺍﻟﻤﺜﺎل‬
‫ﻤﻊ ﺒﺴﺎ ﻁﺔ ﻫﺫ‬

‫ﺍﺩﺍﻟﻤﺘﺸﺎﺒﻬﺔ ﻭﺠﻌﻠﻨﺎ ﻫﺎ ﻓﻲﺍﻷ ﺼﻨﺎ ﻑ‬ ‫ﺍﻟﻜﻭﺩ ﻴﻜﻭ ﻥﺃﻗل ﺤﺠﻤﺎ ﻷﻨﻨﺎ ﺠﻤﻌﻨﺎﺍﻷﻜﻭ‬ ‫‪v‬‬
‫ﺍﻷﻜﺜﺭ ﻋﻤﻭﻤﻴﺔ‪.‬‬ ‫ﺍﻟﻘﺎﻋﺩﻴﺔ ﻭ‬
‫‪ ،‬ﺒ ﺤﻴﺙﻟﻴ ﺱ‬ ‫‪ ،‬ﻓﻘ ﻁ ﻨﻜﺘ ﺏﺍﻟﻜﻭﺩﺍﻟﺨﺎ ﺹ ﻟﻠ ﺼﻨ ﻑ‬‫ﻋﻠﻰ ﻤﺴﺘﻭﻯﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺸﺘﻘﺔ‬ ‫‪v‬‬
‫‪ ،‬ﻭﺒﺎﻟﺘﺎﻟﻲ ﻴﺴﻴﺭﺍﻟﺘ ﻁﻭﻴﺭ‬ ‫ﺍﻋﻲ ﺇﻋﺎﺩﺓ ﻨﻔ ﺱﺍﻟﺘﻌﻠﻴﻤﺎ ﺕ ﻋﻨﺩ ﻜل ﻤﺭ ﺤﻠﺔ‬ ‫ﻤ ﻥﺍﻟﺩ‬
‫ﺒﻭﺜﻴﺭﺓ ﺴﺭﻴﻌﺔ‪.‬‬
‫‪ ،‬ﻭﺒﺎﻟﺘﺎﻟﻲ ﻴﻤﻜ ﻥ‬‫‪ ،‬ﻴﺠﻌل ﻨ ﻅﺎﻡﺍﻟﻌﻤل ﻤﻬﻴﻜﻼ ﺒﺄﺴﻠﻭ ﺏ ﺠﻤﻴل‬ ‫ﻗﻭﻟﺒﺔ ﻤﻔﻬﻭﻡ ﻤﺎ‬ ‫‪v‬‬
‫ﺘ ﻁﻭﻴﺭﻩ‪.‬‬
‫ﺍﻩ ﻻ ﺤﻘﺎ‪.‬‬‫‪ ،‬ﻜﻤﺎ ﺴﻨﺭ‬ ‫ﺍﺜﺔ‬
‫ﻤﻴﻜﺎﻨﻴ ﺯﻡ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕﺍﻟﻘﻭ ﻱ ﻴﻌﺘﻤﺩ ﺘﻤﺎﻤﺎ ﻋﻠﻰﺍﻟﻭﺭ‬ ‫‪v‬‬
‫‪ ،‬ﻤﻤﺎ‬ ‫ﺍﻤﻪ ﻏﺎﻟﺒﺎ‬‫ﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻌﺎﻤﺔ( ﻴﺘﻡﺍﺴﺘﺨﺩ‬ ‫ﻜﻭﺩﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻌﻠﻴﺎ ﻓﻲﺍﻟﺘﺴﻠﺴل )‬ ‫‪v‬‬
‫ﺍﻷﺨ ﻁﺎﺀ ‪.debug‬‬ ‫ﺍﺕﻭ‬ ‫ﻴﺴﻬل ﻋﻤﻠﻴﺔﺍﻜﺘﺸﺎ ﻑﺍﻟﺜﻐﺭ‬
‫‪ ،‬ﻓﺈﻨﻪ ﻴ ﺼﻴﺭ ﻤ ﻥﺍﻟﺴﻬل ﺇ ﻀﺎﻓﺔﺃ ﺼﻨﺎ ﻑ‬ ‫ﺍ ﺒ ﻁﺭﻴﻘﺔ ﺠﻴﺩﺓ‬‫‪‬ﺭ‬‫ﺍ ﻜﺎ ﻥﺍﻟﺘﺴﻠﺴل ﻤ ﺼﻭ‬ ‫ﺇﺫ‬ ‫‪v‬‬
‫‪ ،‬ﻤﻊﺍﻷﺨﺫ ﺒﻌﻴ ﻥﺍﻻﻋﺘﺒﺎﺭﺍﻻﺨﺘﻼﻓﺎ ﺕﺍﻟﻤﻭﺠﻭﺩﺓ ﺒﻴ ﻥﺍﻟ ﺼﻨ ﻑﺍﻟﺠﺩﻴﺩ‬ ‫ﺠﺩﻴﺩﺓ‬
‫ﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﻭﺠﻭﺩﺓ ﻀﻤ ﻥﺍﻟﺘﺴﻠﺴل‪:‬ﻨﺘﻜﻠﻡ ﺇﺫ ﻥ ﻋ ﻥﺍﻟﺒﺭﻤﺠﺔﺍﻟﻤﺘﻨﻭﻋﺔ‬ ‫ﻭ‬
‫‪.differential programming‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﻟﺒﺔ ﺤﻅﻴﺭﺓﻟﻠﻌﺭﺒﺎﺕ‬
‫ﻟﺜﺎﻨﻲ‪:‬ﻗ ﻭ‬
‫ﻟﻤﺜﺎلﺍ‬
‫‪ .٢‬ﺍ‬ ‫‪.٣‬‬

‫ﺍﻟﺘﺨ ﺼﻴ ﺹ ﻤ ﻥﺃﺠل ﺘﺭﻜﻴ ﺏ ﻨ ﻅﺎﻡ ﺫﻭ‬


‫ﺍﻡﺍﻟﺘﻌﻤﻴﻡ‪/‬‬
‫ﺍﺍﻟﻤﺜﺎلﺃﺴﻠﻭ ﺏﺍﺴﺘﺨﺩ‬
‫ﺴﻴﺒﻴ ﻥﻟﻨﺎ ﻫﺫ‬
‫ﺘﻭﺠﻪ ﻜﺎﺌﻨﻲ ﻨﺎﺠﻊ‪.‬‬

‫ﺘﺘﻭﻓﺭ ﻤﺅﺴﺴﺔ ﻋﻠﻰ ﺤ ﻅﻴﺭﺓ ﻋﺭﺒﺎ ﺕ ﺘ ﻀﻡ‪:‬‬

‫ﺍ ﺕ ‪Cars‬‬ ‫ﺴﻴﺎﺭ‬ ‫‪v‬‬


‫ﺸﺎ ﺤﻨﺎ ﺕ ‪Trucks‬‬ ‫‪v‬‬
‫ﺍﻓﺎ ﺕ ‪Helicopters‬‬
‫ﻁﻭ‬ ‫‪v‬‬
‫ﺴﻔ ﻥ ‪Boats‬‬ ‫‪v‬‬

‫ﺘﻭﺩ ﻫﺫﻩﺍﻟﻤﺅﺴﺴﺔ ﺇﻨﺠﺎ ﺯ ﻨﻤﻭﺫﺝ ﻴﻤﻜ ﻥ ﻤ ﻥ ﺨﻼﻟﻪ ﻭ ﻀﻊﺃ ﻱ ﻨﻭﻉ ﻤ ﻥﺍﻟﻌﺭﺒﺎ ﺕ ﻀﻤ ﻥ‬


‫ﺍﻟﻘﺎﻟ ﺏﺍﻟﻤﻼﺌﻡﻟﻪ‪.‬ﺍﻟﻬﺩ ﻑ ﻫﻭ ﺨﻠﻕ ﻨ ﻅﺎﻡﺃ ﺼﻨﺎ ﻑ ﻴﺘﻡ ﻋ ﻥ ﻁﺭﻴﻘﻪﺍﻟﺘﻌﺎﻤل ﺒﻨ ﻅﺎﻡ ﻤﻊ ﺨ ﺼﻭ ﺼﻴﺎ ﺕ‬
‫ﺍﻟﺸﺎ ﺤﻨﺔ‬
‫‪ ،‬ﻓﻨﻼ ﺤ ﻅﺃ ﻥﺍﻟﺴﻴﺎﺭﺓ ﻭ‬‫ﺍﻉﺍﻟﺘﻲ ﻴﻤﻜ ﻥ ﻗﻭﻟﺒﺘﻬﺎ‬‫ﻜل ﻨﻭﻉ ﻤ ﻥﺍﻟﻌﺭﺒﺎ ﺕ‪ .‬ﻨﻨ ﻁﻠﻕ ﻤ ﻥﺍﻷﻨﻭ‬
‫ﺍﻓﺔ ﻭﺴﻔﻴﻨﺔ ﻓﻲﺍﻟﺠﺎﻨ ﺏﺍﻵﺨﺭ‪.‬‬ ‫‪ ،‬ﻭﻨﺘﺭ ﻙﺍﻟ ﺼﻨﻔﻴ ﻥﺍﻵﺨﺭﻴ ﻥ‪ :‬ﻁﻭ‬ ‫ﻴﻤﻜ ﻥﺍﺸﺘﻘﺎﻗﻬﻤﺎ ﻤ ﻥ ﻨﻔ ﺱﺍﻟ ﺼﻨ ﻑ‬
‫‪ ،‬ﺇﻻﺃﻨﻬﺎ ﺘﺘﻘﺎﺴﻡﺍﻟﻌﺩﻴﺩ ﻤ ﻥ‬‫ﺍ ﻀﺢ ﺒﻴ ﻥﺍﻟﻌﺭﺒﺎ ﺕ‬ ‫‪ ،‬ﻓﻌﻠﻰﺍﻟﺭ ﻏﻡ ﻤ ﻥﺍﻻﺨﺘﻼ ﻑﺍﻟﻭ‬ ‫ﻭ ﺯﻴﺎﺩﺓ ﻋﻠﻰ ﺫﻟ ﻙ‬
‫‪،‬ﺍﻟﺘﺒﺎ ﻁﺅ‬ ‫ﺍﻉ‬‫‪،‬ﺍﻹﺴﺭ‬ ‫ﺍﻟﺨ ﺼﻭ ﺼﻴﺎ ﺕ ﻤ ﻥ ﺤﻴﺙ ﺸﻜﻠﻬﺎﺍﻟﻤﺘ ﺤﺭ ﻙ‪ .‬ﻭﺃﻴ ﻀﺎ ﺒﺒﻌ ﺽﺍﻟﻨﺸﺎ ﻁﺎ ﺕ ﻜﺎﻹﻗﻼﻉ‬
‫‪ ،‬ﻜلﺃ ﺼﻨﺎﻓﻨﺎﻟﻬﺎ‬ ‫ﺍﻉﺍﻟﻌﺭﺒﺎ ﺕ‪.‬ﺃﻴ ﻀﺎ‬ ‫ﺃﻭﺍﻟﺘﻭﻗ ﻑ‪ .‬ﻓﻜل ﻫﺫﻩﺍﻷﻋﻤﺎلﻟﻬﺎ ﻤﻌﺎ ﻥ ﻟﻜل ﻨﻭﻉ ﻤ ﻥﺃﻨﻭ‬
‫ﺍﻟﺫ ﻱ ﻨﺴﻤﻴﻪ‪ :‬ﻋ ﺭﺒﺔ‪.‬‬
‫‪،‬ﻭ‬ ‫ﺍ ﺤﺩ‬‫ﺃ ﺼلﺃﻭ ﺠﺩ ﻭ‬

‫ﺇﺫ ﻥ ﻨ ﺤ ﺼل ﻋﻠﻰﺍﻟﻨﻤﻭﺫﺝﺍﻵﺘﻲ‪:‬‬

‫‪Vehicle‬‬

‫‪RollingVehicle‬‬ ‫‪Helicopter‬‬ ‫‪Boat‬‬

‫‪Car‬‬ ‫‪Truck‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﻋﺭﺒﺔ‬

‫‪‬ﺍﺭﺓ‬
‫ﻋﺭﺒﺔ ﺩ ﻭ‬ ‫ﻁﻭﺍﻓﺔ‬ ‫ﺴﻔﻴﻨﺔ‬

‫ﺘﺴﻠﺴل ﻤﻤﻜ ﻥﻟﻸ ﺼﻨﺎ ﻑ ﻤ ﻥﺃﺠل ﺤ ﻅﻴﺭﺓ‬


‫ﺴﻴﺎ ﺭﺓ‬ ‫ﺸﺎﺤﻨﺔ‬ ‫ﻋﺭﺒﺎ ﺕ ﻨﻤﻭﺫﺠﻴﺔ ﻏﻴﺭ ﻤﺘﺠﺎﻨﺴﺔ‬

‫ﻨﻤ ﻭﺫﺝﻟﺤﻅﻴﺭﺓ ﻋﺭﺒﺎﺕ‬

‫‪،‬‬‫‪،‬ﺍﺘﺒﻌﻨﺎﺃﺴﻠﻭ ﺏﺍﻟﺘﻌﻤﻴﻡ‪ :‬ﻤ ﻥ ﺨﻼل ﻤﺠﻤﻭﻉﺍﻟﻜﺎﺌﻨﺎ ﺕ‬ ‫ﺍﺍﻟﻨﻤﻭﺫﺝ‬‫ﻤ ﻥﺃﺠل ﺘ ﺤﻘﻴﻕ ﻫﺫ‬


‫ﺍﺍﻷﺴﻠﻭ ﺏ‬ ‫ﺍﺴﺘﺨﻠ ﺼﻨﺎﺍﻟﻌﻨﺎ ﺼﺭﺍﻟﻤﺸﺘﺭﻜﺔﺍﻟﺘﻲ ﺘﺴﻤﺢﻟﻨﺎ ﺒﺠﻤﻌﻬﺎ ﻭﻭ ﻀﻌﻬﺎ ﻓﻲ ﺇ ﻁﺎﺭ ﻋﺎﻡ‪ .‬ﻫﺫ‬
‫‪ ،‬ﻭ ﻫﻭ ﻨﻤ ﻁ ﻤﺴﺘ ﺤﺴ ﻥﻟﺨﻠﻕ ﺘﺴﻠﺴلﺃ ﺼﻨﺎ ﻑ‪.‬‬
‫ﻴﺴﻤﻰﺍﻟﺘﻌﻤﻴﻡ‬

‫ﺍﺝﺃ ﺼﻨﺎ ﻑ ﺠﺩﻴﺩﺓ ﻀﻤ ﻥ ﻨ ﻅﺎﻡ‬ ‫ﺍ ﺘﻌﻠﻕﺍﻷﻤﺭ ﺒﺈﺩﺭ‬‫ﺃﺴﻠﻭ ﺏﺍﻟﺘﺨ ﺼﻴ ﺹ ﻴﺴﺘﺨﺩﻡ ﺒﻜﺜﺭﺓ ﺇﺫ‬
‫‪ ،‬ﻓﺈﻨﻪ ﻴﻜﻭ ﻥ ﺒﺎﻹﻤﻜﺎ ﻥ‬
‫ﺍﺕ‬‫ﺍﺭﺓ ﺇﻟﻰﺍﻗﺘﻨﺎﺀ ﺒﻌ ﺽﺍﻟ ﻁﺎﺌﺭ‬
‫ﺍ ﺴﻌ ﺕﺍﻹﺩ‬ ‫‪ ،‬ﺇﺫ‬
‫ﻤﻭﺠﻭﺩ ﻤﺴﺒﻘﺎ‪ .‬ﻋﻠﻰ ﻜل‬
‫‪،‬‬
‫ﺍﻟﺘﻲ ﻨﺸﺘﻕ ﻤﻨﻬﺎ ﻁﺎﺌ ﺭﺓ ﻭ ﻁﻭﺍﻓﺔ‬ ‫‪،‬ﻭ‬ ‫ﺇ ﻀﺎﻓﺔ ﺼﻨ ﻑ ﺠﺩﻴﺩ )ﻤ ﻥ ﺨﻼلﺍﻟﺘﻌﻤﻴﻡ( ‪AerialVehicle‬‬
‫ﻓﻨ ﺤ ﺼل ﺇﺫ ﻥ ﻋﻠﻰﺍﻟﺘ ﺼﻤﻴﻡﺍﻵﺘﻲ‪:‬‬
‫‪Vehicle‬‬

‫‪RollingVehicle‬‬ ‫‪AerialVehicle‬‬ ‫‪Boat‬‬

‫‪Car‬‬ ‫‪Truck‬‬ ‫‪Helicopter‬‬ ‫‪Airplane‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﻋﺭﺒﺔ‬
‫ﺘﺴﻠﺴل ﻤﻤﻜ ﻥﻟﻸ ﺼﻨﺎ ﻑ ﻤ ﻥﺃﺠل‬
‫‪،‬‬
‫ﺤ ﻅﻴﺭﺓ ﻨﻤﻭﺫﺠﻴﺔ ﻋﺭﺒﺎ ﺕ ﻏﻴﺭ ﻤﺘﺠﺎﻨﺴﺔ‬
‫ﺍﺕ‬‫ﺒﻌﺩ ﺇ ﻀﺎﻓﺔﺍﻟ ﻁﺎﺌﺭ‬

‫‪‬ﺍﺭﺓ‬
‫ﻋﺭﺒﺔ ﺩ ﻭ‬ ‫ﻋﺭﺒﺔ ﻁﻴﺎﺭﺓ‬ ‫ﺴﻔﻴﻨﺔ‬

‫ﺴﻴﺎ ﺭﺓ‬ ‫ﺸﺎﺤﻨﺔ‬ ‫ﻁﻭﺍﻓﺔ‬ ‫ﻁﺎﺌ ﺭﺓ‬

‫‪ ،‬ﻓﻤ ﻥﺃﺠل ﻭ ﻀﻊ ﺘﻘﺩﻴﻡ ﻟﻬﺫﻩ‬ ‫ﺍﺍﻟﻨﻭﻉ ﻤ ﻥﺍﻟﺘﺭﺘﻴ ﺏ ﻴﺄﺨﺫﺃ ﺤﻴﺎﻨﺎ ﺇﺴﻡ ‪taxonomy‬‬ ‫ﻫﺫ‬
‫ﺍﺒ ﻁﺔﻟﺠﻌل ﺘ ﺼﻨﻴ ﻑ‬ ‫ﺍ ﺕ ﺩﻭﻤﺎ ﻋ ﻥ ﻭﺴﺎﺌل ﺘ ﻁﺒﻴﻘﻴﺔ ﻤﺘﺭ‬
‫ﺍﻟﻤﺒﺎﺩﺭﺓ‪ :‬ﻴﺒ ﺤﺙﺍﻟﻤﺘﺨ ﺼ ﺼﻭ ﻥ ﻓﻲﺍﻟ ﺤﺸﺭ‬
‫ﺍ ﺕ ﻴﺴﻴﺭ ﻓﻲﺃ ﺤﺴ ﻥ ﻤﺎ ﻴﻤﻜ ﻥ‪.‬‬
‫ﺍﻟ ﺤﺸﺭ‬

‫ﻤﺒﺩﺃﺍﻟﺘﻌﻤﻴﻡ‪/‬ﺍﻟﺘﺨ ﺼﻴ ﺹ ﻫﻭ ﺒﺩﻴﻬﻲ ﻭﻗﻭ ﻱ ﻷﻨﻪ ﻴﺴﻤﺢ ﺒﺘﻌﺭﻴ ﻑﺍﻟﺘ ﺼﺭﻓﺎ ﺕﺍﻟﻤﺘﺸﺎﺒﻬﺔ‬


‫‪ ،‬ﻜل ﺼﻨ ﻑ ﻓﺭﻋﻲ ﻴﻤﻜﻨﻨﺎﺍﻻﺨﺘﻴﺎﺭ ﺒﻴ ﻥ ﺇﻋﺎﺩﺓ ﺘﻌﺭﻴﻔﻪﺃﻭ ﺘﻭﺭﻴﺜﻪ‬
‫ﻋﻠﻰ ﻁﻭل ﺸﺠﺭﺓﺍﻹﺸﺘﻘﺎﻗﺎ ﺕ‬
‫ﻤ ﻥﺍﻟ ﺼﻨ ﻑﺍﻷﻋﻠﻰ ﻤﻨﻪ‪.‬‬

‫ﻟﻤﺠﺭﺩﺓ‪abstract :‬‬
‫‪ .٣ .٣‬ﺍﻷ ﺼﻨﺎ ﻑﺍ‬

‫‪ ،‬ﻋﺭﺒﺔ ﺩﻭﺍﺭﺓ ﻭ ﻋﺭﺒﺔ ﻁﻴﺎ ﺭﺓ‬


‫‪،‬‬ ‫‪ ،‬ﻻﺒﺩ ﻭﺃﻨﻨﺎ ﻻ ﺤ ﻅﻨﺎﺃ ﻥﺍﻷ ﺼﻨﺎ ﻑ ﻋﺭﺒﺔ‬‫ﺍﺀﺓ ﻤﺘﻤﻌﻨﺔ‬
‫ﺒﻘﺭ‬
‫‪ ،‬ﻭﻟﻜ ﻥ ﻷ ﻥ ﻫﺫﻩ‬
‫ﺍ ﻟﻴ ﺱ ﻤ ﻥ ﺒﺎ ﺏ ﺘﻨﻤﻴﻕﺍﻟﺘ ﺼﻤﻴﻡ‬
‫ﻤﻜﺘﻭﺒﺔ ﺒﺨ ﻁ ﻤﺎﺌل ﻓﻲ ﺍﻟﺘ ﺼﻤﻴﻡﺍﻟﺴﺎﺒﻕ‪ .‬ﻫﺫ‬
‫ﺍﻷ ﺼﻨﺎ ﻑ ﻫﻲ ﻤﺠﺭﺩﺓ‪.‬‬

‫ﺍ ﻜﺎﻨ ﺕ ﻻ ﺘﻤﻨﺢ ﻋﻤﻼ ﺒﺭﻤﺠﻴﺎ ‪implementation‬‬ ‫ﻨﻘﻭل ﻋ ﻥﺃ ﺼﻨﺎ ﻑﺃﻨﻬﺎ ﻤﺠﺭﺩﺓ ﺇﺫ‬
‫‪ ،‬ﻻ‬
‫‪،‬ﺍﻟ ﺼﻨ ﻑﺍﻟﻤﺠﺭﺩ‬ ‫ﺍلﺍﻟﻐﻤﻭ ﺽ؟ ﻋﻠﻰ ﻜل‬ ‫‪ ،‬ﻭﻤﻨﺎ ﻫﺠﻬﺎ ﺘ ﺼﻴﺭﺃﻴ ﻀﺎ ﻤﺠﺭﺩﺓ‪ .‬ﺭﺒﻤﺎ ﻤﺎ ﺯ‬ ‫ﻟﻤﻨﺎ ﻫﺠﻬﺎ‬
‫‪ ،‬ﻴﻤﻜ ﻥ ﺫﻟ ﻙﻟﻸ ﺼﻨﺎ ﻑﺍﻟﻤﺸﺘﻘﺔ ﻤﻨﻪ ﻤ ﻥ ﺨﻼل ﺘﻭﻓﻴﺭﺍﻟﻜﻭﺩﻟﻜل‬ ‫ﻴﻤﻜﻨﻪﺃ ﻥ ﻴﺨﻠﻕ ﻤﺜﻴﻼ ﺕ )ﻜﺎﺌﻨﺎ ﺕ(‬
‫‪ ،‬ﻭﺒﺎﻟﺘﺎﻟﻲ ﻴ ﺯﻭل ﻋﻨﻬﺎﺍﻟﺘﺠﺭﻴﺩ ﻭﺘ ﺼﻴﺭ ﻗﺎﺩﺭﺓ ﻋﻠﻰﺍﻟﻘﻴﺎﻡ ﺒﻌﻤل‬‫ﻤ ﻥﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﺘﻲ ﻜﺎﻨ ﺕ ﻤﺠﺭﺩﺓ‬
‫‪ ،‬ﻨﺘﻜﻠﻡ ﺇﺫ ﻥ ﻋﻡﺃ ﺼﻨﺎ ﻑ ﺤﺴﻴﺔ ‪.concrete‬ﺍﻷ ﺼﻨﺎ ﻑﺍﻟ ﺤﺴﻴﺔ ﻫﻲﺍﻟﻭ ﺤﻴﺩﺓﺍﻟﻘﺎﺩﺭﺓ ﻋﻠﻰ‬ ‫ﺒﺭﻤﺠﻲ‬
‫ﺨﻠﻕ ﻤﺜﻴﻼ ﺕ‪.‬‬

‫ﻤﺎ ﻫﻭ ﻫﺩ ﻑﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺠﺭﺩﺓ؟ ﻫﻭ ﺨﻠﻕ ﺇ ﻁﺎﺭ ﻋﻤلﻟﻸ ﺼﻨﺎ ﻑﺍﻟﻤﺸﺘﻘﺔ ﻤ ﻥ ﺨﻼل‬
‫ﺍﻟﺘﺴﻠﺴل ﻓﻲﺍﻷ ﺼﻨﺎ ﻑ‬‫ﺘﻘﺩﻴﻡ ﻤﺠﻤﻭﻋﺔ ﻤ ﻥﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﺘﻲ ﻨﺠﺩ ﻫﺎ ﻋﻠﻰ ﻁﻭلﺍﻟﺘﻔﺭﻉ )‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫‪ ،‬ﺘﻌﺘﺒﺭ ﻫﺫﻩﺍﻵﻟﻴﺔﺃﺴﺎﺴﻴﺔﻟﺘ ﺤﻘﻴﻕ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ‪.polymorphism‬‬ ‫ﺍﻹﺒ ﻥ‪(...‬‬‫ﺍﻷ ﺏ‪/‬‬ ‫ﺍﻟﺠﺩ‪/‬‬
‫‪ ،‬ﻓﻤ ﻥﺍﻟ ﻁﺒﻴﻌﻲﺃﻨﻪ ﻻ ﻴﻤﻜﻨﻨﺎﺃ ﻥ ﻨﺨﻠﻕ ﻤﺜﻴﻼ ﺕ ﻋﻨﻪ‪ :‬ﻋ ﺭﺒﺔ‬ ‫ﺍ ﻤﺎﺍﻋﺘﺒﺭﻨﺎﺍﻟ ﺼﻨ ﻑ ﻋ ﺭﺒﺔ‬ ‫‪ ،‬ﺇﺫ‬‫ﺒﺎﻟﻤﻘﺎﺒل‬
‫‪،‬‬
‫‪ ،‬ﻭﻟﻜ ﻥ ﺘﺭﻤ ﺯ ﺇﻟﻰ ﻤﻔﻬﻭﻡ ﻜﺎﺌ ﻥ ﻴﻘﻠﻊ ﻭﻴﺒ ﻁ ﺊ ﻭﻴﺴﺎﺭﻉﺃﻭ ﻴﺘﻭﻗ ﻑ‬
‫ﻻ ﺘﺭﻤ ﺯ ﺇﻟﻰﺃ ﻱ ﻜﺎﺌ ﻥ ﺤﺴﻲ‬
‫ﺍﺍﻟﻜﺎﺌ ﻥ ﺴﻴﺎﺭﺓﺃﻭ ﻁﺎﺌﺭﺓﺃﻭ ﺸﺎ ﺤﻨﺔ‪.‬‬ ‫ﺍﺀ ﻜﺎ ﻥ ﻫﺫ‬‫ﺴﻭ‬

‫ﺍﺴﺔ‬
‫ﺍ ﻴﺘﻌﻠﻕ ﻏﺎﻟﺒﺎ ﺒﺩﻓﺘﺭ ﺤﻤﻭﻟﺔﺍﻟﺒﺭﻨﺎﻤﺞ‪ .‬ﺒﺩﺭ‬
‫‪ ،‬ﻫﺫ‬ ‫ﺍﺍﻟﻜﺎﺌ ﻥ ﺤﺴﻲﺃﻭ ﻤﺠﺭﺩ‬ ‫ﺘ ﺤﺩﻴﺩ ﻤﺎ ﺇﺫ‬
‫‪ ،‬ﻴﻤﻜ ﻥ ﺘ ﺤﺩﻴﺩ ﻤﺎ ﻫﻲﺍﻷ ﺼﻨﺎ ﻑﺍﻟ ﺤﺴﻴﺔ‪:‬ﺍﻟﺘﻲ ﺘﻤﺘﻠ ﻙ ﻤﺜﻴﻼ ﺕ‪ .‬ﻭﻤ ﻥ ﺨﻼل‬‫ﺍﺍﻷﺨﻴﺭ‬ ‫ﻤﺘﻌﻤﻘﺔ ﻟﻬﺫ‬
‫ﺍﻟﺘﻲ ﺘﺴﻤﺢﺒﺎﻻﺴﺘﻔﺎﺩﺓ ﻤ ﻥ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ‬ ‫ﻫﺫﻩﺍﻷﺨﻴﺭﺓ ﻴﻤﻜ ﻥ ﺘ ﺤﺩﻴﺩﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺠﺭﺩﺓ ﻭ‬
‫ﺍﺒﺎﺘﺒﺎﻉﺃﺴﻠﻭ ﺏﺍﻟﺘﻌﻤﻴﻡ‪.‬‬
‫‪ ،polymorphism‬ﻭ ﻫﺫ‬

‫ﻟ ﻭﺭﺍﺜﺔ‪:‬‬
‫ﻟﻤﺭﺘﺒﻁﺔ ﺒﺎ ﺴﺘﺨﺩﺍ ﻡﺍ‬
‫ﻟ ﺼﻌ ﻭﺒﺎﺕﺍ‬
‫‪ .٤‬ﺍ‬ ‫‪.٣‬‬

‫ﺴﻨﺭﻯ ﻨﻤﻭﺫﺠﻴ ﻥ ﺤﻴﺙ ﻜﺎ ﻥﺍﻟﺘﻘﺴﻴﻡ ﻭ ﻫﻤﻲ‪ .‬ﻏﺎﻟﺒﺎ ﻤﺎ ﻴﻜﻭ ﻥ ﺘ ﺤﺩﻴﺩﺍﻟﺘﺴﻠﺴلﺍﻟﻤﻨﺎﺴ ﺏ‬


‫ﺍﺭ ﺨﺎ ﺹ‬‫ﺍﺜﺔ ﻴﺠ ﺏﺃ ﻥ ﺘﺘﺭﺠﻡ ﺇﻟﻰ "ﺍﻟ ﺼﻨ ﻑﺍﻟﻤﺸﺘﻕ ﻫﻭ ﺇ ﺼﺩ‬ ‫‪ ،‬ﻋﻼﻗﺔﺍﻟﻭﺭ‬ ‫ﺼﻌﺒﺎ‪.‬ﺍﻟﻘﺎﻋﺩﺓ ﺴﻬﻠﺔ‬
‫ﻤ ﻥ ﺼﻨﻔﻪﺍﻟﻘﺎﻋﺩ ﻱ "‪.‬‬

‫ﺪا‪:‬‬
‫‪ .٠ ١ .٤‬ﺗﺴﻠﺴ ﻞ ﻣ ﻜﺜ ﻒ ﺟ‬ ‫‪.٣‬‬

‫ﻴﺠ ﺏﺍﻻﻨﺘﺒﺎﻩ ﺇﻟﻰ ﻋﺩﻡ ﺘﻜﺜﻴ ﻑ ﻭﺇﺜﻘﺎلﺍﻟﺘﺴﻠﺴل ﺒﺎﻻﺸﺘﻘﺎﻕﺍﻟﻐﻴﺭ ﻤﻨ ﻅﻡ‪ .‬ﻓﻠﻨﻌﺘﺒﺭ ﻤﺜﻼ‬
‫‪ ،‬ﻷﻨﻨﺎ ﻨﻔﻬﻡ‬‫‪ ،‬ﻻ ﻴﻤﻜﻨﻨﺎﺍﻟﺘﻌﻠﻴﻕ‬ ‫ﺍﻟﺫ ﻱ ﻤﻨﻪ ﻨﺸﺘﻕﺍﻟ ﺼﻨﻔﻴ ﻥ ﻗﻁ ﻭ ﻜﻠﺏ‪ .‬ﻓﻠ ﺤﺩﺍﻵ ﻥ‬ ‫‪،‬ﻭ‬ ‫ﺍﻟ ﺼﻨ ﻑ ﺤﻴﻭﺍﻥ‬
‫‪ ،‬ﻴﻌﺘﺒﺭ‬ ‫ﺒﺄ ﻥﺍﻻﺨﺘﻼ ﻑﺍﻟﻤﻭﺠﻭﺩ ﺒﻴ ﻥ ﻫﺫﻴ ﻥﺍﻟﻨﻭﻋﻴ ﻥ ﻴﺘ ﻁﻠ ﺏ ﻤﻨﺎ ﺨﻠﻕ ﺼﻨﻔﻴ ﻥ ﻤﺨﺘﻠﻔﻴ ﻥ‪ .‬ﺒﺎﻟﻤﻘﺎﺒل‬
‫‪،‬‬
‫‪ ،‬ﻓﺒﺴﺒ ﺏﻟﻭ ﻥﺍﻟﺸﻌﺭ‬ ‫‪ ،‬ﺴﻭﺀﻟﻠﺘﻘﺩﻴﺭ‬ ‫ﺃ ﺼﻔ ﺭ ﻤ ﻥﺍﻟ ﺼﻨ ﻑ ﻜﻠﺏ‬ ‫ﺃﺴﻭﺩ ﻭ ﻜﻠﺏ_‬ ‫ﺍﺸﺘﻘﺎﻕﺍﻟ ﺼﻨﻔﻴ ﻥ ﻜﻠﺏ_‬
‫‪ ،‬ﻤﻤﺎ ﺴﻴﺜﻘلﺍﻟﺘﺴﻠﺴل ﻷﺴﺒﺎ ﺏ ﺒﺴﻴ ﻁﺔ‪ .‬ﻜﺎ ﻥ ﻤ ﻥﺍﻷ ﺤﺴ ﻥ ﺩﻤﺞ‬ ‫‪،‬ﺃﻭ ﻋﺩﺓﺃ ﺼﻨﺎ ﻑ‬ ‫ﺘﻡ ﺨﻠﻕ ﺼﻨﻔﻴ ﻥ‬
‫ﺼﻔﺔﺍﻟﻠﻭ ﻥ )ﺃﻭ ﺒﻌ ﺽﺍﻟ ﺼﻔﺎ ﺕﺍﻟﺒﺴﻴ ﻁﺔ( ﻀﻤ ﻥ ﺨ ﺼﺎﺌ ﺹ )ﺒﻴﺎﻨﺎ ﺕ(ﺍﻟ ﺼﻨ ﻑﺍﻷﺴﺎﺴﻲ ﻜﻠﺏ‪.‬‬

‫‪ ،‬ﻓﺎﻟﺘ ﺼﻤﻴﻡﺍﻵﺘﻲ‬
‫‪ ،‬ﻴﺠ ﺏﺍﻟ ﺤﺭ ﺱ ﻋﻠﻰ ﻋﺩﻡ ﺩﻤﺞﺃ ﺼﻨﺎ ﻑ ﻭﺴﻴ ﻁﺔ ﻜﺜﻴﺭﺓ‬
‫ﺒﻨﻔ ﺱﺍﻷﺴﻠﻭ ﺏ‬
‫ﺍ ﻴﺠ ﺏ ﺤﺫﻓﻪ‪.‬‬‫‪،‬ﻟﺫ‬ ‫ﻴﺒﻴ ﻥﺃ ﻥ ﻫﻨﺎ ﻙ ﺼﻨ ﻑ ﻭﺴﻴ ﻁ ﻏﻴﺭ ﻀﺭﻭﺭ ﻱ ﻭﻻ ﻴﻤﻠ ﻙﺃ ﻱﺍﺸﺘﻘﺎﻕ ﺤﻘﻴﻘﻲ‬

‫‪base‬‬

‫‪paper 1‬‬ ‫‪intermediary1‬‬


‫‪example of a‬‬
‫‪superfluous class‬‬
‫)‪( intermediary1‬‬
‫‪intermediary2‬‬ ‫)ﻭﺴﻴ ﻁ ‪(١‬‬

‫‪paper 2‬‬ ‫‪paper 3‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﻗﺎﻋﺩﺓ‬

‫ﻭ ﺭﻗﺔ ‪١‬‬ ‫ﻭ ﺴﻴﻁ ‪١‬‬ ‫ﻤﺜﺎل ﻋ ﻥ ﺼﻨ ﻑ ﻁﻔﻴﻠﻲ‬


‫)ﻭﺴﻴ ﻁ ‪(١‬‬

‫ﻭﺴﻴﻁ‪٢‬‬

‫ﻭ ﺭﻗﺔ‪٢‬‬ ‫ﻭ ﺭﻗﺔ‪٣‬‬

‫‪ ،‬ﺍﻟ ﺼﻨ ﻑ ﻭﺴﻴﻁ ‪ ١‬ﻻ ﻴﻌﻤل ﺇﻻ ﻋﻠﻰ‬ ‫ﺍ ﻜﺎ ﻥﺍﻟ ﺼﻨ ﻑ ﻗﺎﻋﺩ ﻱ ﻴﻤﺘﻠ ﻙ ﺼﻨﻔﻴ ﻥﺍﺒﻨﻴ ﻥ‬‫‪ ،‬ﺇﺫ‬ ‫ﺇﺫ ﻥ‬
‫ﺇﺜﻘﺎل ﻏﻴﺭ ﻀﺭﻭﺭ ﻱﻟﻠﺘﺴﻠﺴل‪ .‬ﺇﺫ ﻥ ﻫﻭ ﺼﻨ ﻑ ﻤﺠﺭﺩ )ﻜﻤﺎ ﻨﺸﻴﺭ ﺇﻟﻰ ﺨ ﻁﻪ ﺒﻨﻭﻉ ﻤﺎﺌل( ﻭﻻ‬
‫ﺍ ﺤﺩﺓ‪ .‬ﻴﻤﻜﻨﻨﺎ ﺇﺫ ﻥ ﺤﺫﻓﻪ‬
‫‪ ،‬ﻭﻓﻲ ﻨﻔ ﺱﺍﻟﻭﻗ ﺕ ﻻ ﻴ‪‬ﺸﺘﻕ ﺇﻻ ﻤﺭﺓ ﻭ‬ ‫ﻴﻤﻜﻨﻪﺃ ﻥ ﻴﻤﺘﻠ ﻙ ﻤﺜﻴﻼ ﺕ )ﻜﺎﺌﻨﺎ ﺕ(‬
‫ﺍﺍﻟﻤﺜﺎلﻴﺴﻤﺢ ﺒ ﺯﻴﺎﺩﺓ ﻗﺎﻋﺩﺓﻟﻐﻭﻴﺔ‪ :‬ﻨﺴ ﻤﻲ ﻭ ﺭﻗﺔ‬ ‫ﻤﻊ ﺇ ﻀﺎﻓﺔ ﺨ ﺼﺎﺌ ﺼﻪ ﻓﻲﺍﻟ ﺼﻨ ﻑ ﻭﺴﻴﻁ‪ .٢‬ﻫﺫ‬
‫ﺫ ﻱ ﻻ ﻴ ﻤﻠﻙ ﻤﺸﺘﻘﺎ ﺕ‪.‬‬ ‫ﻟ‬‫ﻟ ﺼﻨ ﻑﺍ‬‫ﺍ‬
‫ﺪ‪construction inheritance :‬‬
‫‪ .٠ ٢ .٤‬وراﺛﺔاﻟﺘﺸﻴﻴ‬ ‫‪.٣‬‬

‫‪ ،‬ﺤﻴﺙ ﻴﻨ ﺹ ﻋﻠﻰﺍﺸﺘﻘﺎﻕ‬ ‫ﺍﺜﺔ‬‫ﺍﺜﺔﺍﻟﺘﺸﻴﻴﺩ ﻫﻭ ﻤﺜﺎل ﺁﺨﺭ ﺴﻴ ﺊ ﻓﻴﻡ ﻴﺨ ﺹﺍﺴﺘﻌﻤﺎلﺍﻟﻭﺭ‬‫ﻭﺭ‬


‫ﺍ ﻤﺎ ﺘﻡﺍﻋﺘﺒﺎﺭ‬
‫‪ ،‬ﺇﺫ‬‫‪ ،‬ﻤﻊ ﺇ ﻀﺎﻓﺔ ﻟﻪ ﺨ ﺼﺎﺌ ﺹ ﺘﻐﻴﺭ ﺠﺫﺭﻴﺎ ﻤ ﻥﺍﻟﻤﻔﻬﻭﻡﺍﻟﻤﺴﺘﺨﺩﻡ‪ .‬ﻓﻜﻤﺜﺎل‬‫ﺼﻨ ﻑ‬
‫‪ ،‬ﻴﻤﻜ ﻥ ﻤﻼ ﺤ ﻅﺔﺃ ﻥ‬‫‪ ،‬ﺜﻡ ﻨﻘﻭﻡ ﺒﺈ ﻀﺎﻓﺔ ﺒﻌﺩ ﺜﺎﻨﻲﻟﻪ‪ .‬ﻋﻠﻰ ﻜل‬
‫ﺃ ﻥﺍﻟﻤﺴﺘ ﻁﻴل ﻫﻭ ﻋﺒﺎﺭﺓ ﻋ ﻥ ﺴ ﻁﺭ‬
‫ﺍﺭ ﺨﺎ ﺹ ﻤ ﻥ‬ ‫‪ ،‬ﻷ ﻥﺍﻟﺠﻤﻠﺔ‪" :‬ﺍﻟﻤﺴﺘ ﻁﻴل ﻫﻭ ﺇ ﺼﺩ‬‫ﺍﺜﺔ ﻓﻲﺍﻟ ﺤﺎﻟﺔﺍﻷﺨﻴﺭﺓ ﺼﺎﺭ ﺕ ﻏﻴﺭ ﻤﻨﺎﺴﺒﺔ‬ ‫ﺍﻟﻭﺭ‬
‫ﺍﻟﺴ ﻁﺭ "ﻟﻴ ﺱﻟﻬﺎﺃ ﻱ ﻤﻌﻨﻰ‪.‬‬

‫ﺎﺳﻘﺔ‪the conceptual incoherence :‬‬


‫‪ .٠ ٣‬اﻟﺘﺼﻮراتاﻟﻐﻴﺮ ﻣﺘﻨ‬ ‫‪.٤‬‬ ‫‪.٣‬‬

‫ﺍ ﺕ ﻀﺎﻟﺔ‪ .‬ﻓﻠﻨﻌﺘﺒﺭ ﻤﺜﻼﺍﻟ ﺼﻨ ﻑ ﻁﺎﺌ ﺭﺍﻟﻤ ﺯﻭﺩ‬ ‫ﺍﺜﺔ ﺒﻌ ﺽﺍﻷ ﺤﻴﺎ ﻥ ﺇﻟﻰ ﺘ ﺼﻭﺭ‬ ‫ﺘﺅﺩ ﻱﺍﻟﻭﺭ‬
‫ﺍﺀ‬‫‪ ،‬ﺴﻭ‬ ‫‪ ،‬ﻨﺴﺘ ﻁﻴﻊ ﻤﺜﻼﺍﺸﺘﻘﺎﻕﺍﻟ ﺼﻨ ﻑ ﺩﺠﺎﺠﺔﺍﻟﺘﻲ ﻫﻲ ﻤ ﻥ ﻓ ﺼﻴﻠﺔﺍﻟ ﻁﻴﻭﺭ‬ ‫ﺒﺎﻟﻤﻨﻬﺎﺝﻴﻁﻴ ﺭ‬
‫‪ ،‬ﻭﻟﻜ ﻥ ﻜل ﻤﻨﺎ ﻴﻌﻠﻡﺃ ﻥﺍﻟﺩﺠﺎﺠﺔ ﻻ ﺘ ﻁﻴﺭ ﺭ ﻏﻡ‬ ‫ﺍﺜﺔﺃﻭ ﻋ ﻥ ﻁﺭﻴﻕ ﺇﻋﺎﺩﺓﺍﻟﺘﻌﺭﻴ ﻑ‬ ‫ﺒﺄﺴﻠﻭ ﺏﺍﻟﻭﺭ‬
‫ﺃﻨﻬﺎ ﻤ ﻥ ﻓ ﺼﻴﻠﺔﺍﻟ ﻁﻴﻭﺭ‪ .‬ﺇﺫ ﻥ ﻓﻲ ﻫﺫﻩﺍﻟ ﺤﺎﻟﺔ ﻨﺴﺘ ﻁﻴﻊﺃ ﻥ ﻨﻘﻭل " ﺩﺠﺎﺠﺔ ﻫﻲ ﻁﺎﺌﺭ ﻤﺘﺨ ﺼ ﺹ"‪.‬‬
‫ﺍﺜﺔﺍﻻﺨﺘﻴﺎﺭﻴﺔ‪:‬ﺍﻟﻤﺒﺭﻤﺞ ﻤﺩﻋﻭ ﻻﺨﺘﻴﺎﺭ ﻤﺎ ﻫﻲﺍﻟﻤﻨﺎ ﻫﺞ‬ ‫‪ ،‬ﺘ ﻁﺭ ﺡ ﺒﻌ ﺽﺍﻟﻠﻐﺎ ﺕﺍﻟﻭﺭ‬ ‫ﻜﺫﻟ ﻙ‬
‫‪ ،‬ﻓﺈﻨﻪ‬‫ﺍ ﻥ ﻤ ﻥ ﺘﺴﻠﺴل ﻁﺎﺌ ﺭ‬ ‫ﺍﻟﺨ ﺼﺎﺌ ﺹﺍﻟﺘﻲ ﻴﻤﻜﻨﻬﺎﺃ ﻥ ﺘﻭﺭﺙ‪ .‬ﻭﺇ ﻥﻟ ﺯﻡﺍﻷﻤﺭ ﻤ ﺤﻭ ﻤﻨﻬﺎﺝﺍﻟ ﻁﻴﺭ‬ ‫ﻭ‬
‫ﺍ ﻴﻌﺘﻡ ﻜﻠﻴﺔ ﻤﻔﻬﻭﻡ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ‪polymorphism‬ﺍﻟﺫ ﻱ‬ ‫‪ ،‬ﻫﺫ‬‫ﻻ ﻴ ﻁﺭ ﺡﺃ ﻱ ﻤﺸﻜﻠﺔ‪ .‬ﺒﺎﻟﻤﻘﺎﺒل‬
‫ﺍ ﻓﻲﺍﻷ ﺼﻨﺎ ﻑ‬ ‫ﺍ ﻓﻲﺍﻟ ﺼﻨ ﻑﺍﻟﻘﺎﻋﺩ ﻱ ﻴﻤﻜ ﻥﺃ ﻥ ﻴﻜﻭ ﻥ ﻤﻭﺠﻭﺩ‬ ‫ﻴﻨ ﺹ ﻋﻠﻰﺃ ﻥ ﻤﻨﻬﺎﺠﺎ ﻤﻭﺠﻭﺩ‬
‫ﺍﻟﻭﺭﻴﺜﺔ‪.‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﻟﻤﺘﻌﺩﺩﺓ ‪the multiple inheritance :‬‬
‫ﻟ ﻭﺭﺍﺜﺔﺍ‬
‫‪ . ٥ .٣‬ﺍ‬

‫‪ ،‬ﺤﻴﺙﻨﺴﻤﺢ ﻟ ﺼﻨ ﻑ ﻤ ﻥﺃ ﻥ ﻴﻤﺘﻠ ﻙﺍﻟﻌﺩﻴﺩ‬


‫ﺍﺜﺔﺍﻟﻌﺎﺩﻴﺔ‬‫ﺍﺜﺔﺍﻟﻤﺘﻌﺩﺩﺓ ﻫﻲ ﺘﻭﺴﻊﻟﻠﻭﺭ‬ ‫ﺍﻟﻭﺭ‬
‫ﺍﻷ ﺼﻨﺎ ﻑﺍﻷﺒﺎﺀﻟﻜﻲ ﻨﻌ ﻁﻲ ﻗﺎﻟﺒﺎﻟﻠﺘﻌﻤﻴﻡﺍﻟﻤﺘﻌﺩﺩ‪.‬‬

‫ﺍﺍﻟﻤﺜﺎل‪:‬ﻟﻨﻔﺭ ﺽﺃﻨﻨﺎ ﻨﺭﻴﺩ ﺯﻴﺎﺩﺓﺍﻟ ﺼﻨ ﻑ‬ ‫‪ ،‬ﻓﻠﻨﻨﺘﺒﻪ ﺇﻟﻰ ﻫﺫ‬


‫ٌﺸﻜل ﻋﻠﻴﻨﺎﺍﻟﻔﻬﻡ‬‫ﺍ ﻤﺎﺃ‬
‫ﺇﺫ‬
‫ﻫﻭﻓ ﺭﻜﺭﺍﻓ ﺕ ‪) Hovercraft‬ﻟﻡﺃﺠﺩﻟﻬﺎ ﻤ ﺼ ﻁﻠ ﺤﺎ ﻤﻨﺎﺴﺒﺎ( ﻟﻨﻤﻭﺫﺝ ﺤ ﻅﻴﺭﺓﺍﻟﻌﺭﺒﺎ ﺕﺍﻟﺴﺎﺒﻘﺔ‪.‬‬
‫‪ ،‬ﺇﺫ ﻥ ﻨﻘﺩﺭ‬
‫‪‬ﻴﺔ‬
‫‪ ،‬ﻭﻓﻲ ﻨﻔ ﺱﺍﻟﻭﻗ ﺕ ﻋﺭﺒﺔ ﺒﺭ‬ ‫‪ ،‬ﻋﺒﺎﺭﺓ ‪(..‬‬ ‫ﺍﻓ ﺕ ﻫﻭ ﺴﻔﻴﻨﺔ )ﺒﺎﺨﺭﺓ‬ ‫ﻭﻨﻌﻠﻡﺃ ﻥ ﻫﻭﻓﺭﻜﺭ‬
‫ﺍﺍﻟﺸﻜل‪:‬‬ ‫ﻋﻠﻰﺃ ﻥ ﻨﻘﻭﻟﺒﻬﺎ ﻋﻠﻰ ﻫﺫ‬
‫‪RollingVehicle‬‬ ‫‪Boat‬‬

‫‪Hovercraft‬‬

‫ﻋﺭﺒﺔ ﺩﻭﺍ ﺭﺓ‬ ‫ﺴﻔﻴﻨﺔ‬

‫ﻫﻭﻓ ﺭﻜﺭﺍﻓ ﺕ‬

‫ﻟﻤﺘﻌﺩﺩﺓ‬
‫ﻟ ﻭﺭﺍﺜﺔﺍ‬
‫ﻤﺜﺎل ﻋ ﻥﺍ ﺴﺘﻌﻤﺎلﺍ‬

‫‪ ،‬ﺒل ﺘ ﻁﺭ ﺡ ﻨﻔﺴﻬﺎ ﻓﻲﺃﺸﻜﺎل‬ ‫ﺍﺍﻟ ﺤﺩ‬‫ﺍﺜﺔﺍﻟﻤﺘﻌﺩﺩﺓ ﻻ ﺘﻨﺘﻬﻲ ﻋﻨﺩ ﻫﺫ‬ ‫ﻤﺸﺎﻜلﺍﺴﺘﻌﻤﺎلﺍﻟﻭﺭ‬


‫‪ ،‬ﻓﺈﻨﻨﺎ ﻨﺠﺩ‬
‫‪ ،‬ﻓﻤﺜﻼﻟﻭ ﻜﺎ ﻥ ﻋﻨﺩﻨﺎ ﺼﻨﻔﻴ ﻥ ﻗﺎﻋﺩﻴﻴ ﻥ ﻴﻤﻠﻜﺎ ﻥ ﺨ ﺼﺎﺌ ﺹﺃﻭ ﻤﻨﺎ ﻫﺞ ﻤﺘﺸﺎﺒﻬﺔ‬‫ﺃﺨﺭﻯ‬
‫ﺍﻟﺘﻲ ﻴﺠ ﺏﺃ ﻥ ﻨ ﺤﻠﻬﺎ‪ .‬ﺒﻌ ﺽﺍﻟﻠﻐﺎ ﺕ ﺘﺸﺘﺭ ﻁ ﺇﺫ ﻥ‬
‫‪،‬ﻭ‬ ‫ﺍﺠﻬﺔ ﻤﺸﻜﻠﺔ ﺘﺸﺎﺒ ﻙ ﻓﻲﺍﻟﺘﺴﻤﻴﺔ‬ ‫ﺃﻨﻔﺴﻨﺎ ﻓﻲ ﻤﻭ‬
‫ﺍﺍﻹﺸﻜﺎل ﺇﻟ ﺤﺎﻕﺍﻟﻤﻨﻬﺎﺝﺃﻭﺍﻟﺨﺎ ﺼﻴﺔ ﺒﺎﺴﻡﺍﻟ ﺼﻨ ﻑﺍﻟﺘﺎﺒﻌﺔﻟﻪ‪.‬‬ ‫ﻟ ﺤل ﻫﺫ‬

‫ﺍﺭﻴﺔ‪ .‬ﻓﻔﻲﺍﻟﻤﺜﺎل‬‫ﺍﺜﺔ ﺘﻜﺭ‬


‫ﺍﺜﺔﺍﻟﻤﺘﻌﺩﺩﺓ ﺇﻟﻰ ﻭﺭ‬ ‫‪ ،‬ﻭ ﻫﻲﺃﻨﻪﺃ ﺤﻴﺎﻨﺎ ﺘﺘ ﺤﻭلﺍﻟﻭﺭ‬
‫ﻤﺸﻜﻠﺔﺃﺨﺭﻯ‬
‫ﺍﻷﺨﺭﻯ‬ ‫‪،‬ﻭ‬ ‫ﺍ ﺤﺩﺓ ﻤ ﻥ ﺨﻼلﺍﻟ ﺼﻨ ﻑ ‪B‬‬ ‫‪،‬ﻭ‬ ‫ﺍﻵﺘﻲ ﻨﺠﺩﺍﻟ ﺼﻨ ﻑ ‪ D‬ﻴﺭ ﺙ ﻨﺴﺨﺘﻴ ﻥ ﻤ ﻥﺍﻟ ﺼﻨ ﻑ ‪A‬‬
‫ﺍلﺍﻟﻤ ﻁﺭﻭ ﺡ ﺒﺄ ﻱ ﻤ ﻥﺍﻟﻨﺴﺨﺘﻴ ﻥ ﺴﻴ ﺤﺘﻔ ﻅ؟ ﺒﻌ ﺽﺍﻟﻠﻐﺎ ﺕ ﻜﺎﻟﺴﻲ‬ ‫ﺍﻟﺴﺅ‬
‫‪،‬ﻭ‬ ‫ﻋ ﻥ ﻁﺭﻴﻕﺍﻟ ﺼﻨ ﻑ ‪C‬‬
‫ﺍ ﻤﺎ ﺤﺩﺜ ﺕ‪.‬‬‫ﺒﻠ ﺱ ﺒﻠ ﺱ ﺘﻘﺘﺭ ﺡ ﺁﻟﻴﺔ ﺘﺴﻤﺢﺒﻤﻌﺎﻟﺠﺔ ﻫﺫﻩﺍﻟﻤﻌ ﻀﻠﺔﺍﻟﺸﺎﺌﻜﺔ ﺇﺫ‬
‫‪A‬‬

‫‪B‬‬ ‫‪C‬‬

‫‪D‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﺍﻟﻌﺩﻴﺩ ﻤ ﻥ ﻤﻜﺘﺒﺎ ﺕﺍﻷ ﺼﻨﺎ ﻑ ﺘﺴﺘﺨﺩﻡ ﺼﻨ ﻑ ﻗﺎﻋﺩ ﻱ ﻤﺠﺭﺩ ﻷﺠلﺍﻻﺴﺘﻔﺎﺩﺓ ﻤ ﻥ ﺁﻟﻴﺎ ﺕ‬
‫ﺍﺭﻴﺔ ﻜﻠﻤﺎ‬ ‫ﺍﺜﺔﺍﻟﺘﻜﺭ‬‫ﺍﻡﺍﻟﻭﺭ‬‫ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ‪ .polymorphism‬ﻭﺃﻴ ﻀﺎ ﻗﺩ ﻨﻘﻊ ﻓﻲ ﻤﺸﺎﻜلﺍﺴﺘﺨﺩ‬
‫ﺍﺜﺔﺍﻟﻤﺘﻌﺩﺩﺓ‬ ‫ﺍﺠﻬﺎ ﺕﺍﻟﻤﻭﻓﺭﺓ ﻤ ﻥ ﻗﺒل ﺒﻌ ﺽﺍﻟﻠﻐﺎ ﺕﺍﻟﺘﻲ ﺘﻨﻔﻲﺍﻟﻭﺭ‬ ‫ﺍﺜﺔﺍﻟﻤﺘﻌﺩﺩﺓ‪.‬ﺍﻟﻭ‬‫ﺍﺴﺘﻌﻤﻠﻨﺎﺍﻟﻭﺭ‬
‫ﺍﺜﺔ‪.‬‬
‫)ﻜﺎﻟﺴﻲ ﺒﻠ ﺱ ﺒﻠ ﺱ ﻭﺍﻟﺠﺎﻓﺎ( ﺘﻘﺘﺭ ﺡ ﺘﻨﺎﻭﺒﺎ ﻫﺎﻤﺎ ﻭﻤﻨﺎﺴﺒﺎ ﻟﺘﻌﺩﺩﺍﻟﻭﺭ‬

‫ﻟﻭﺍﺠ ﻬﺎﺕ‪the interfaces :‬‬


‫‪ . ٦ .٣‬ﺍ‬

‫ﺍ ﺡ ﻋﺩﺓ‬‫ﺍﺜﺔﺍﻟﻤﺘﻌﺩﺩﺓ ﺩﻓﻌ ﺕ ﺒﻌ ﺽﺍﻟﻤ ﺼﻤﻤﻴ ﻥ ﻟﻠﻐﺎ ﺕ ﺇﻟﻰﺍﻗﺘﺭ‬


‫ﺍﻟﻤﺸﺎﻜلﺍﻟﻤﺭﺘﺒ ﻁﺔ ﺒﺎﻟﻭﺭ‬
‫ﺍﺠﻬﺔ ﺸﺒﻴﻬﺔ ﺒ ﺼﻨ ﻑ ﻤ ﻥ ﺩﻭ ﻥ‬‫ﻟﻭﺍﺠﻬﺎ ﺕ‪.‬ﺍﻟﻭ‬‫ﺤﻠﻭل‪ .‬ﺇﻟﻰﺃ ﻥ ﺭﺃﻴﻨﺎ ﻅﻬﻭﺭ ﺁﻟﻴﺎ ﺕﺃﺨﺭﻯ ﻜﺎ‬
‫‪،‬ﺃﻤﺎ ﻤﻨﺎ ﻫﺠﻬﺎ ﻓﻬﻲ ﻜﻠﻬﺎ ﻤﺠﺭﺩﺓ‪.‬‬‫ﺍﺒ ﺕ‬
‫ﺍ ﺀ ﺜﻭ‬
‫‪ ،‬ﻭﻟﻜﻨﻬﺎ ﺘﻘﺩﺭ ﻋﻠﻰﺍ ﺤﺘﻭ‬‫ﺨ ﺼﺎﺌ ﺹ )ﺒﻴﺎﻨﺎ ﺕ(‬

‫ﺍﺠﻬﺔ ﻗﻴﺩ‬ ‫‪ ،‬ﻓﺈﻨﻪ ﻴﻘﺩﺭ ﻋﻠﻰ ﻭ ﻀﻊﺍﻟﻭ‬ ‫ﺍﺜﺔﺍﻟﺘﻲ ﻴﺘﻤﺘﻊ ﺒﻬﺎﺍﻟ ﺼﻨ ﻑ‬ ‫ﺍ ﺕﺍﻟﻭﺭ‬ ‫ﺯﻴﺎﺩﺓ ﻋﻠﻰ ﻤﻤﻴ ﺯ‬
‫ﺍﻟﻜلﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻴﻬﺎ‪ .‬ﻫﺫﻩﺍﻵﻟﻴﺔ ﻗﻭﻴﺔﻟﻠﻐﺎﻴﺔ‬ ‫ﺍ ﻜﺎﻨ ﺕ ﺘﻤﻠ ﻙ ﺘﻨﻔﻴﺫ‬‫ﺍﻟﺘﻨﻔﻴﺫ ‪ Implement‬ﺇﺫ‬
‫ﺍﺠﻬﺎ ﺕ ﻤ ﻥ ﺩﻭ ﻥﺃ ﻥ ﺘﻜﻭ ﻥﻟﻬﺎ‬ ‫ﻷﻨﻬﺎ ﺘﺨﻠﻕ ﻋﻼﻗﺎ ﺕ ﻗﻭﻴﺔ ﺒﻴ ﻥ ﻤﺨﺘﻠ ﻑﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﻨﻔﹼﺫﺓﻟﻨﻔ ﺱﺍﻟﻭ‬
‫ﺍﺠﻬﺎ ﺕ ﻫﻲ ﻤﺘﻌﺩﺩﺓﺍﻟ ﺼﻔﺎ ﺕ‬‫‪،‬ﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﻤﻭﺠﻭﺩﺓ ﻀﻤ ﻥﺍﻟﻭ‬ ‫ﻋﻼﻗﺔﺃﺒﻭﻴﺔ‪ .‬ﻋﻠﻰﺍﻟﺨ ﺼﻭ ﺹ‬
‫ﺍﺠﻬﺔ‪.‬‬‫‪ ،‬ﻷﻨﻬﺎ ﺘﻨﻔﺫ ﺒ ﺼﻔﺔ ﻤ ﺤﺎﻴﺩﺓ ﻓﻲ ﻜل ﺼﻨ ﻑ ﻴﺴﺘﺨﺩﻡ ﻨﻔ ﺱﺍﻟﻭ‬ ‫‪polymorphs‬‬

‫ﺍﺠﻬﺎ ﺕ‪ .‬ﻫﺫﻩﺍﻵﻟﻴﺔﺍﻟ ﺼﺎﺩﺭﺓ ﻋ ﻥ‬‫‪ ،‬ﻜل ﺼﻨ ﻑ ﻴﻤﻜﻨﻪ ﺘﻨﻔﻴﺫ ﻤﺎ ﻴ ﺤﻠﻭﻟﻪ ﻤ ﻥﺍﻟﻭ‬ ‫ﺒﺎﻟﻤﻘﺎﺒل‬
‫ﺍﻟﺠﺎﻓﺎ‪.‬‬
‫‪ Smalltalk‬ﺘﻡ ﺘﺒﻨﻴﻬﺎ ﻤ ﻥ ﻗﺒل ﻟﻐﺔﺍﻟﺴﻲﺍﻟﻜﺎﺌﻨﻴﺔ )ﺃﻭ ﻜﻤﺎ ﻴﺴﻤﻴﻬﺎﺍﻟﺒﻌ ﺽ‪:‬ﺍﻟﺸﻴﺌﻴﺔ( ﻭ‬

‫‪،‬‬ ‫ﺍ ﺼﺔﻨﻭﻭﻴﺔ‬ ‫‪ ،‬ﻟﻨﻔﺭ ﺽ ﻤﺜﻼﺃ ﻥ ﻨ ﻅﺎﻡ ﻜﺎﺌﻨﺎ ﺕ ﻴﺭﻴﺩ ﻗﻭﻟﺒﺔ ﻏﻭ‬ ‫ﻤ ﻥﺃﺠل ﺘﺜﺒﻴ ﺕﺍﻷﻓﻜﺎﺭ‬
‫ﺍﺠﺩ ﻋﻠﻰﺍﻟﺘ ﺼﻤﻴﻡ‪ .‬ﻓﺒﺩلﺍﺸﺘﻘﺎﻕ ﻜل‬ ‫ﻭ ﺤﻴﺙ ﺒﻌ ﺽ ﻤﺭﻜﺒﺎﺘﻬﺎ ﺘﺎﺒﻌﺔﻟﻔﺭﻭﻉ ﺘﺴﻠﺴﻠﻴﺔ ﻴﺠ ﺏﺃ ﻥ ﺘﺘﻭ‬
‫ﺍﻟﺘﻲ ﺘﻘﺘﺭ ﺡ ﻋﺭ ﻀﻬﺎ ﻋﻠﻰﺍﻟﺘ ﺼﻤﻴﻡ )ﺒﻌ ﺽﺍﻷ ﺼﻨﺎ ﻑ ﻻ ﻴﺠ ﺏﺃ ﻥ‬ ‫‪،‬ﻭ‬ ‫ﺍﻷ ﺼﻨﺎ ﻑ ﻟﻨﻔ ﺱﺍﻟﻌﺎﺌﻠﺔ‬
‫ﺍﺠﻬﺔ ﻗﺎﺒﻠﺔﻟﻠﻌﺭ ﺽ ﺇﻟﻰﺍﻟﺘﻲ‬ ‫‪ ،‬ﻴﺴﺘ ﺤﺴ ﻥ ﺭﺒ ﻁ ﻭ‬ ‫‪ ،‬ﻓﺒﺩل ﺫﻟ ﻙ‬
‫ﺍ ﺴﻴﺌﺎ‬
‫ﺍ ﻤﺎ ﻴﻌﺘﺒﺭ ﺘ ﺼﻭﺭ‬‫‪ ،‬ﻭ ﻫﺫ‬‫ﺘﻌﺭ ﺽ(‬
‫ﻴﺠ ﺏﺃ ﻥ ﺘ ﻅﻬﺭ ﻓﻲﺍﻟﺘ ﺼﻤﻴﻡ‪ .‬ﻨﺸﻴﺭﺃﻴ ﻀﺎ ﺇﻟﻰﺃﻨﻪ ﻟﻭ ﻜﺎﻨ ﺕ ﻜلﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺸﺘﻘﺔ ﻤ ﻥ ﺼﻨ ﻑ‬
‫‪ ،‬ﻓﺈ ﻥ ﻜلﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻐﻴﺭ ﺒﻴﺎﻨﻴﺔ ﺴﺘﺜﻘل ﺒﺎﻟﻌﺩﻴﺩ ﻤ ﻥﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﻐﻴﺭ‬ ‫ﻗﺎﻋﺩ ﻱ ﻴﻘﺘﺭ ﺡ ﻤﻨﺎ ﻫﺞﻟﻠﺭﺴﻡ‬
‫ﻀﺭﻭﺭﻴﺔ‪.‬‬

‫‪ ،‬ﻭﻟﻜﻨﻪ ﻴﺘﻌﻠﻕ ﺒﻨ ﻅﺭﺓ‬


‫‪،‬ﻟﻴ ﺱﺒﺎﻟﺒﺴﺎ ﻁﺔ ﺒﻤﺎ ﻜﺎ ﻥ‬ ‫ﺍﺠﻬﺎ ﺕ‬
‫ﺍﻡﺍﻟﻭ‬‫ﺍﺴﺘﺨﺩ‬ ‫ﺍﻟﺘﻤﻴﻴ ﺯ ﺒﻴ ﻥﺍﻻﺸﺘﻘﺎﻕ ﻭ‬
‫‪ ،‬ﺒﺎﻟﺭﺠﻭﻉ ﺇﻟﻰ ﻤﺜﺎل‬ ‫ﺍﺩ ﺇﻨﺠﺎ ﺯﻩ‪ .‬ﺇﺫ ﻥ‬‫‪ ،‬ﻭﺃﻴ ﻀﺎ ﺒﺒﻴﺌﺔﺍﻟﺒﺭﻨﺎﻤﺞﺍﻟﻤﺭ‬‫ﺍﻟﻤ ﺼﻤﻡ(‬‫ﺍﻟﻤﺘ ﺼﻭﺭ )‬
‫‪،‬ﺃﻭ‬ ‫ﺍﺠﻬﺔ ﻤ ﻥ ﻋﺭﺒﺔ ﺒﺤﺭﻴﺔ‬ ‫‪ ،‬ﻭﺘ ﺯﻭﻴﺩﻩ ﺒﻭ‬ ‫‪ ،‬ﻫلﻴﺠ ﺏﺍﺸﺘﻘﺎﻗﻪ ﻓﻘ ﻁ ﻤ ﻥ ﻋﺭﺒﺔ ﺩﻭﺍﺭﺓ‬ ‫ﻫﻭﻓ ﺭﻜﺭﺍﻓ ﺕ‬
‫‪،‬‬‫‪ ،‬ﺨﻠﻕ ﺼﻨ ﻑ ﺠﺩﻴﺩ ﻤﺴﺘﻘل‬ ‫‪،‬ﺃﻭﺃﻴ ﻀﺎ‬ ‫ﺍﺠﻬﺔ ﻤ ﻥ ﻋﺭﺒﺔ ﺒﺭﻴﺔ‬ ‫ﺍﺜﺔ ﻤ ﻥ ﺴﻔﻴﻨﺔ ﻭﺘ ﺯﻭﻴﺩﻩ ﺒﻭ‬‫ﺍ ﺀ ﻭﺭ‬‫ﺇﺠﺭ‬
‫‪ ،‬ﻭﻟﻜ ﻥ ﺘﺘﻌﻠﻕ ﺒﺎﻷﻭﻟﻭﻴﺎ ﺕﺍﻟﺘﻲ‬ ‫ﺍلﻟﻴﺴ ﺕ ﺒﺴﻴ ﻁﺔ‬ ‫ﺍﺍﻟﺴﺅ‬‫ﺍﺠﻬﺘﻴ ﻥ ﻤﻌﺎ‪.‬ﺍﻹﺠﺎﺒﺔ ﻋ ﻥ ﻫﺫ‬ ‫ﻭﺘ ﺯﻭﻴﺩﻩ ﺒﺎﻟﻭ‬
‫ﺍﺜﺔ‪ .‬ﻤﺭﺓﺃﺨﺭﻯ ﻴ ﻁﺭ ﺡ ﻤﺸﻜل ﻁﺒﻴﻌﺔ‬ ‫ﻨﺭﻴﺩ ﺇﻋ ﻁﺎﺀ ﻫﺎ ﻟﻠﻨﻤﻭﺫﺝ‪:‬ﺍﻟﻤﻌﻴﺎﺭﺍﻷﻓ ﻀل ﻫﻭ ﻋﻤلﺍﻟﻭﺭ‬
‫ﺍﺩ‪.‬‬
‫‪ ،‬ﻭﺒﺒﻴﺌﺔﺍﻟﺘ ﻁﺒﻴﻕﺍﻟﻤﺭ‬ ‫ﺍﻟﺘﻲ ﺘﺘﻌﻠﻕ ﺒﺸﺨ ﺼﻴﺔ ﺼﺎﻨﻊﺍﻟﻨﻤﻭﺫﺝ‬ ‫‪،‬ﻭ‬ ‫ﺍﻟﺘﻘﺴﻴﻡ‬

‫ﻟﺘﺭﻜﻴﺏ ‪:aggregation‬‬
‫‪ ٤‬ﺍ‬

‫‪ .١‬ﺘﻌﺭﻴ ﻑ‪:‬‬ ‫‪.٤‬‬

‫‪‬ﻥ‬
‫ﺍﻟﺘﻲﻴﺘﺭﺠﻡ ﻫﺫﻩﺍﻟﻤﺭﺓﺍﻟﻌﻼﻗﺔ "ﻤﻜ ﻭ‬ ‫‪،‬ﻭ‬ ‫ﺍﻟﺘﺭﻜﻴ ﺏ ﻫﻭ ﻨﻭﻉ ﺁﺨﺭ ﻤ ﻥﺍﻟﻌﻼﻗﺔ ﺒﻴ ﻥ ﺼﻨﻔﻴ ﻥ‬
‫‪ ،‬ﻴﻤﻜﻨﻨﺎﺃ ﻥ ﻨﻘﻭلﺃ ﻥﺍﻟ ﺼﻨ ﻑ‬
‫‪ ،‬ﻓﻲ ﻨ ﻅﺎﻡ ﻤﻴﻜﺎﻨﻴﻜﻲ‬‫ﻟﻪ‪ ."...‬ﻓﻤﺜﻼ‬
‫ﻤ ﻥ‪"...‬ﺃﻭ "ﻴﻤﻠﻙ‪"...‬ﺃﻭﺃﻴ ﻀﺎ "‬
‫‪ ،‬ﻭ ﺼﻨ ﻑ ﻤ ﻥ ﺇﻁﺎ ﺭ‪ .‬ﺨﻠﻕ ﻤﺜﻴﻼ ﺕ‬
‫‪،‬ﺃﺭﺒﻌﺔﺃ ﺼﻨﺎ ﻑ ﻤ ﻥ ﻋﺠﻠﺔ‬
‫ﺴﻴﺎ ﺭﺓ ﻤﻜﻭ ﻥ ﻤ ﻥ ﺼﻨ ﻑ ﻤ ﻥ ﻤﺤ ﺭﻙ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﺍ ﺕ ﻋﻠﻰ‬‫ﺍﺘﻬﺎ ﻜﺎﺌﻨﺎ ﺕﺃﻭ ﻤﺅﺸﺭ‬‫ﺍﻟﺘﻲ ﻫﻲ ﻓﻲ ﺤﺩ ﺫ‬ ‫ﺍﻤﻴﺔ ﺇﻟﻰﺍﺴﺘﻌﻤﺎلﺍﻟﺨ ﺼﺎﺌ ﺹ ﻭ‬ ‫ﻴﻤﺭ ﺒ ﺼﻔﺔ ﺇﻟ ﺯ‬
‫ﻜﺎﺌﻨﺎ ﺕﺃﻭﺃﻴ ﻀﺎ ﻤﺜﻴل ﻋ ﻥ ﺼﻨ ﻑ ﺤﺎﻭ ﻴ ﺤﻘﻕ ﻫﻭ ﻜﺫﻟ ﻙ ﻤﺒﺩﺃﺍﻟﺘﺭﻜﻴ ﺏ‪.‬ﺍﻟﺸﻲﺀﺍﻟﻬﺎﻡ ﻓﻲﺍﻟﺘﺭﻜﻴ ﺏ‬
‫ﻫﻭ ﻜﺎﺭﺩﻴﻨﺎﻟﻴﺘﻪ‪ .‬ﻟﻨﻌﺘﺒﺭ ﻤﺜﻼ ﺘﺭﻜﻴ ﺏ ﻋﺠﻼ ﺕ ﻤ ﻥ ﺴﻴﺎﺭﺓ‪.‬ﺃ ﻱ ﺴﻴﺎﺭﺓ ﺘﺘﺭﻜ ﺏ ﻤ ﻥﺃﺭﺒﻊ ﻋﺠﻼ ﺕ‬
‫‪ ،‬ﻭﺃ ﻱ ﻋﺠﻠﺔ ﻻ ﻴﻤﻜﻨﻬﺎﺃ ﻥ‬‫ﺍ ﺕﺍﻟﺜﻼﺙ ﻋﺠﻼ ﺕ(‬ ‫ﺍ ﺕﺍﻟﺸﺎﺫﺓ ﺫ‬
‫‪،‬ﺃﻭﺍﻟﺴﻴﺎﺭ‬ ‫)ﻤﻊ ﺇ ﻫﻤﺎل ﻋﺠﻠﺔﺍﻟﻨﺠﺩﺓ‬
‫‪ ،‬ﻭ ‪ ٤‬ﻤ ﻥ ﺠﺎﻨ ﺏ‬
‫ّﺏ‬‫ﺘﹸﻤﺘﻠ ﻙ ﻤ ﻥﺃﻜﺜﺭ ﻤ ﻥ ﺴﻴﺎﺭﺓ‪ .‬ﻜﺎﺭﺩﻴﻨﺎﻟﻴﺔﺍﻟﺘﺭﻜﻴ ﺏ ﻫﻲ ﺇﺫ ﻥ ‪ ١‬ﻤ ﻥ ﺠﺎﻨ ﺏﺍﻟﻤﺭﻜِ‬
‫ﺍﻟﻤﺭﻜﱠ ﺏ‪.‬‬

‫ﺍﻟﻤﺜﺎلﺍﻵﺘﻲﻴﺴﻤﺢ ﺒﺘﺜﺒﻴ ﺕﺍﻟﻤﻔﺎ ﻫﻴﻡ‪:‬‬

‫‪Motor‬‬ ‫‪Chassis‬‬ ‫‪Wheel‬‬

‫‪١‬‬ ‫‪١‬‬ ‫‪٤‬‬

‫‪١‬‬ ‫‪١‬‬ ‫‪١‬‬


‫‪Car‬‬

‫ﻤﺤ ﺭﻙ‬ ‫ﺇﻁﺎ ﺭ‬ ‫ﻋﺠﻠﺔ‬

‫‪١‬‬ ‫‪١‬‬ ‫‪٤‬‬

‫‪١‬‬ ‫‪١‬‬ ‫‪١‬‬


‫ﺴﻴﺎ ﺭﺓ‬

‫ﻟﻨ ﺴﺒﺔﻟﻠ ﺼﻨ ﻑ ﻋﺭﺒﺔ‬


‫ﻤﺜﺎلﻟﺘﺭﻜﻴﺏ ﺒﺎ‬
‫ﺍﻋﺩﺃﻨ ﻅﻤﺔﺍﻟﻜﺎﺌ ﻥﺍﻟﻌﺎﻟﻤﻴﺔ ‪ UML‬ﺘﺴﺘﻌﻤل ﺴﻬﻤﺎ ﻴﻜﻭ ﻥ ﺸﻜل ﻤﻘﺩﻤﺘﻪ ﻤﻌﻴ ﻥ ﻟﺘﻘﺩﻴﻡ‬ ‫ﻗﻭ‬
‫ّ ﺏ‪.‬ﺃﻤﺎﺍﻟﻜﺎﺭﺩﻴﻨﺎﻻ ﺕ ﻓﺘﻜﻭ ﻥ ﻤ ﺤﺩﺩﺓ‪.‬‬
‫ﺍﻟﺘﺭﻜﻴ ﺏ ‪.aggregation‬ﺍﻟﻤﻌﻴ ﻥ ﻴﻜﻭ ﻥ ﺠﻬﺔﺍﻟﻤﺭﻜِ‬

‫ﺍ ﺤﺩﺓ(‪.‬‬ ‫‪ v‬ﻜﺎﺭﺩﻴﻨﺎﻟﻴﺔﺍﻟﻤﺭﻜِ‬
‫ّ ﺏ ﺘﻜﻭ ﻥ ﺒﺠﺎﻨ ﺏﺍﻟﻤﻌﻴ ﻥ )ﻓﻲﺍﻟﺒﻴﺎ ﻥ‪ :‬ﻋﺠﻠﺔ ﺘﻨﺘﻤﻲﻟﺴﻴﺎﺭﺓ ﻭ‬
‫ﻜ ﺏ ﺘﻜﻭ ﻥ ﺒﺠﺎﻨ ﺏﺍﻟﺨ ﻁ )ﻓﻲﺍﻟﺒﻴﺎ ﻥ‪ :‬ﺴﻴﺎﺭﺓ ﺘﻤﺘﻠ ﻙﺃﺭﺒﻊ ﻋﺠﻼ ﺕ(‪.‬‬‫‪ v‬ﻜﺎﺭﺩﻴﻨﺎﻟﻴﺔﺍﻟﻤﺭﱠ‬

‫ﻟﻭﺍﺠ ﻬﺎﺕ‪:‬‬
‫ﻟﻤﺘﻌﺩﺩﺓﺃ ﻭﺍ‬
‫ﻟﺘﺭﻜﻴﺏ ﻜﺘﻨﺎ ﻭﺏﻟﻠ ﻭﺭﺍﺜﺔﺍ‬
‫‪ .٢‬ﺍ‬ ‫‪.٤‬‬

‫ﺍﺜﺔﺍﻟﻤﺘﻌﺩﺩﺓﺃﻭ ﻓﻲ‬‫ﺃ ﺤﻴﺎﻨﺎ ﻴﻜﻭ ﻥ ﺒﺎﻹﻤﻜﺎ ﻥ ﺘﺭﺠﻤﺔ ﺒﻤﻔﻬﻭﻡﺍﻟﺘﺭﻜﻴ ﺏ ﻤﻔﺎ ﻫﻴﻡ ﺘ ﻅﻬﺭ ﻓﻲﺍﻟﻭﺭ‬
‫ﺍ ﺕ‪ .‬ﻭﻓﺠﺄﺓ ﻨﺭﻴﺩ ﺩﻤﺞﺃﻭﺍﻜ ﺱ‬‫ﺍﺭ‬‫ﺍﺩ‬‫ﺍ ﺕ ﻭﺭ‬ ‫ﺍﺠﻬﺎ ﺕ‪ .‬ﻓﻠﻨﻔﺭ ﺽ ﻤﺜﻼ ﻨ ﻅﺎﻡ ﻋﺴﻜﺭ ﻱ ﻴﺠﻤﻊ ﻁﺎﺌﺭ‬ ‫ﺍﻟﻭ‬
‫ﺍ‪ .‬ﻓﻜﻴ ﻑ ﻨﻘﻭﻟ ﺏ )ﻨ ﺼﻨﻊ ﻨﻤﻭﺫﺝﺃﻭ ﻗﺎﻟ ﺏ( ﻫﺫﻩ‬‫ﺍﺭ‬‫ﺍﺩ‬‫ﺍﻟﺘﻲ ﻫﻲ ﻁﺎﺌﺭﺓ ﺘﻤﺘﻠ ﻙ ﺭ‬‫‪،‬ﻭ‬ ‫‪AWACS‬‬
‫ﺍﻟﻭ ﻀﻌﻴﺔ؟‬

‫ﺍﺜﺔﺍﻟﻤﺘﻌﺩﺩﺓ‪:‬ﻨﺸﺘﻕﺍﻟ ﺼﻨ ﻑﺃﻭﺍﻜ ﺱ ﻤ ﻥﺍﻟ ﺼﻨﻔﻴ ﻥ ﺭﺍﺩﺍ ﺭ ﻭ ﻁﺎﺌ ﺭﺓ‪.‬‬


‫ﺍﻟﻭﺭ‬ ‫‪١‬‬

‫ﺍﺠﻬﺎ ﺕ‪:‬‬
‫ﻨﺴﺘﻌﻤلﺍﻟﻭ‬ ‫‪٢‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﺍﺠﻬﺔ ﻻﻗﻁ ) ﺼﻨ ﻑ ﻴﺠﻤﻊ ﻜل‬
‫‪ ،‬ﻭﻨ ﻅﻴ ﻑﻟﻬﺎ ﻭ‬
‫ﻨﺸﺘﻕﺃﻭﺍﻜ ﺱ ﻤ ﻥ ﻁﺎﺌ ﺭﺓ‬
‫ﺍ ﺕ(‪.‬‬‫ﺍﺭ‬
‫ﺍﺩ‬‫ﺍﻉﺍﻟﺭ‬‫ﺃﻨﻭ‬
‫ﻟﺔ ﻁﻴﺎ ﺭﺓ ) ﺼﻨ ﻑ ﻴﺠﻤﻊ‬
‫ﺍﺠﻬﺔﺁ‬
‫‪ ،‬ﻭﻨ ﻅﻴ ﻑﻟﻬﺎ ﻭ‬‫ﻨﺸﺘﻕﺃﻭﺍﻜ ﺱ ﻤ ﻥ ﺭﺍﺩﺍ ﺭ‬
‫ﺍ ﺕ(‪.‬‬ ‫ﺍﻉﺍﻟ ﻁﺎﺌﺭ‬
‫ﻜلﺃﻨﻭ‬
‫ﻟﺔ ﻁﻴﺎ ﺭﺓ‪.‬‬
‫ﺍﺠﻬﺘﻴ ﻥ ﻻﻗﻁ ﻭﺁ‬
‫ﻨﺨﻠﻕ ﺼﻨ ﻑﺃﻭﺍﻜ ﺱ ﺠﺩﻴﺩ ﻭﻨ ﺯﻭﺩﻩ ﺒﻭ‬

‫ﺍﺴﺘﻌﻤﺎلﺍﻟﺘﺭﻜﻴ ﺏ‪:‬‬
‫‪ ،‬ﻭﻨ ﻅﻴ ﻑﻟﻬﺎ ﺨﺎ ﺼﻴﺔ ﺭﺍﺩﺍ ﺭ‪.‬‬
‫ﻨﺸﺘﻕﺃﻭﺍﻜ ﺱ ﻤ ﻥ ﻁﺎﺌ ﺭﺓ‬
‫ﻨﺸﺘﻕﺃﻭﺍﻜ ﺱ ﻤ ﻥ ﺭﺍﺩﺍ ﺭﻟﻬﺎ ﺨﺎ ﺼﻴﺔ ﻁﺎﺌ ﺭﺓ‬
‫ﻨﺨﻠﻕ ﺼﻨ ﻑﺃﻭﺍﻜ ﺱ ﺠﺩﻴﺩ ﻭﻨ ﺯﻭﺩﻩ ﺒﺨﺎ ﺼﻴﺘﻴ ﻥ‪ :‬ﺭﺍﺩﺍ ﺭ ﻭ ﻁﺎﺌ ﺭﺓ‪.‬‬

‫‪...‬‬

‫ﺍ ﻤﺎ ﻅﻬﺭﺃ ﻥ ﺒﻌ ﺽ‬ ‫ﻫﺫﻩﺍﻹﻤﻜﺎﻨﻴﺎ ﺕﺍﻟﻤﺘﻌﺩﺩﺓ ﺘﻭ ﻀﺢ ﻤﺩﻯ ﻏﻨﻰﺍﻟﻜﺎﺌ ﻥ ﻭﻓﻌﺎﻟﻴﺘﻪ‪ .‬ﻭﺇﺫ‬


‫‪ ،‬ﻓﺒﺘﻐﻴﺭﺍﻟﻤﻌ ﻁﻴﺎ ﺕ ﺘﺘﻐﻴﺭﺍﻟ ﻁﺭﻕ‪ .‬ﻜﻤﺎﺃﻨﻪ‬ ‫‪ ،‬ﻓﺈﻨﻬﺎ ﻟﻴﺴ ﺕﻨﺘﻴﺠﺔ ﺜﺎﺒﺘﺔ‬
‫ﺍﻟﻨﻤﺎﺫﺝﺃ ﺤﺴ ﻥ ﻤ ﻥ ﻏﻴﺭ ﻫﺎ‬
‫ﺍﺜﺔ ﻤﻊﺍﻟﺘﺭﻜﻴ ﺏ ﻜﻤﺎ ﺴﻨﺸﻴﺭ ﺇﻟﻰ‬ ‫‪،‬ﺃﻭﺍﻟﻭﺭ‬ ‫ﺍ ﺤﺩ‬
‫ﺍﺠﻬﺎ ﺕ ﻤﻊﺍﻟﺘﺭﻜﻴ ﺏ ﻓﻲ ﺁ ﻥ ﻭ‬ ‫ﺍﻡﺍﻟﻭ‬ ‫ﻴﻤﻜ ﻥﺍﺴﺘﺨﺩ‬
‫ﺫﻟ ﻙ‪.‬‬

‫ﺍﻟﺘﻲ ﻟﻴﺴ ﺕ ﺒﺎﻟ ﻀﺭﻭﺭﺓ‬


‫‪،‬ﻭ‬ ‫‪٣ ,٢ ،‬‬‫‪٢ ,٢ ،‬‬‫ﺍ ﺕ ﻴﻔ ﻀلﺍﻟ ﺤﺎﻻ ﺕ ‪١‬‬
‫ﺍﺭ‬‫ﺍﺩ‬
‫‪،‬ﺃ ﻱ ﻤ ﺼﻤﻡ ﺭ‬ ‫ﺍ ﺫﻟ ﻙ‬
‫ﻋﺩ‬
‫‪.١,٣ ،‬‬‫‪١,٢ ،‬‬ ‫ﺍﻟﺘﻲ ﻗﺩ ﺘﻜﻭ ﻥ‪١ :‬‬‫ﺍ ﺕﺍﻟﺫ ﻱ ﻗﺩ ﻴﻔ ﻀل ﺤﺎﻻ ﺕﺃﺨﺭﻯ ﻭ‬‫ﻨﻔ ﺱ ﻓﻜﺭﺓ ﺼﺎﻨﻊﺍﻟ ﻁﺎﺌﺭ‬

‫ﺍﻟﺘ ﺼﻤﻴﻤﺎ ﺕﺍﻵﺘﻴﺔ ﺘﺒﻴ ﻥ ﻤﺨﺘﻠ ﻑﺍﻟ ﺤﺎﻻ ﺕﺍﻟﺘﻲ ﻴﻤﻜﻨﻨﺎ ﺘ ﺤﻘﻴﻘﻬﺎ‪.‬‬

‫‪Airplane‬‬ ‫‪Radar‬‬ ‫‪Interfacing‬‬ ‫‪Interfacing‬‬


‫‪Detector‬‬ ‫‪plots flying‬‬

‫‪AWACS 2.3‬‬
‫‪AWACS 2.2‬‬
‫‪AWACS 2.1‬‬
‫‪AWACS 1‬‬

‫ﻟﻭﺍﺠ ﻬﺎﺕ‬
‫ﻟﺒﺔﺃﻭﺍﻜ ﺱ ﺒﺎ ﺴﺘﺨﺩﺍ ﻡﺍ‬
‫ﻗﻭ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﻁﺎﺌ ﺭﺓ‬ ‫ﺭﺍﺩﺍ ﺭ‬ ‫ﻭﺍﺠ ﻬﺔ ﻻﻗﻁ‬ ‫‪ǎ‬‬ ‫‪ǚ‬‬
‫‪Ǜ‬‬

‫واﻛ ﺲ ‪٣٫٢‬‬
‫أ‬
‫واﻛ ﺲ ‪٢ ٫٢‬‬
‫أ‬
‫واﻛ ﺲ ‪١ ٫٢‬‬
‫أ‬
‫واﻛ ﺲ ‪١‬‬
‫أ‬

‫ﻟ ﻰ ﺇﺩﺭﺍﺝ‬
‫ﻟﻤﺘﻘﻁﻌﺔﺘﺸﻴ ﺭ ﺇ‬
‫ﺍﻷﺴﻬﻡﺍ‬
‫ﻟ ﺼﻨ ﻑ‪.‬‬
‫ﻭﺍﺠﻬﺔ ﻀﻤﻥﺍ‬

‫ﺍﺠﻬﺎ ﺕ ﻓﻲ ﻟﻐﺔﺃﻨ ﻅﻤﺔ‬‫‪ ،‬ﻻ ﻴﻭﺠﺩ ﻤﺒﺩﺃ ﺜﺎﺒ ﺕ ﻓﻴﻡ ﻴﺨ ﺹ ﺘﻘﺩﻴﻡ ﻭﺘﻤﺜﻴلﺍﻟﻭ‬
‫ﻓﻲﺍﻟﻭﻗ ﺕﺍﻟ ﺤﺎﻟﻲ‬
‫‪،‬ﺍﻟﻭﺴﻴﻠﺔﺍﻷﻜﺜﺭ ﺒﺴﺎ ﻁﺔ ﺘﺘﻤﺜل ﻓﻲﺍﻟﺘ ﺼﺭﻴﺢ ﺒ ﺼﻨ ﻑ ﻤﺠﺭﺩ )ﻤ ﻥ ﺩﻭ ﻥ‬ ‫ﺍﻟﻜﺎﺌ ﻥ ‪.UML‬ﺃﻴ ﻀﺎ‬
‫ﺨ ﺼﺎﺌ ﺹ( ﻭ ﺤﻴﺙﺍﻹﺴﻡ ﻴﻜﻭ ﻥ ﻤﺴﺒﻭﻗﺎ ﺒﺎﻟﻤ ﺼ ﻁﻠﺢ ‪.Interface‬‬

‫ﺍﻟﺘﺨ ﺼﻴ ﺹ ﻭﻟﻜ ﻥ ﻤﻊ ﺨ ﻁ ﻤﺘﻘ ﻁﻊ‬‫ﺍﺴﺘﺨﺩﻤﻨﺎ ﺴﻬﻤﺎ ﻴﺸﺒﻪ ﺫﻟ ﻙﺍﻟﻤﺴﺘﻌﻤل ﻓﻲ ﺘﻤﺜﻴلﺍﻟﺘﻌﻤﻴﻡ‪/‬‬


‫ﺍﺠﻬﺔ‪.‬‬‫ﺍﺠﻬﺔ ﻤ ﻥ ﻗﺒلﺍﻟ ﺼﻨ ﻑ‪ .‬ﺭﺃ ﺱﺍﻟﺴﻬﻡ ﻴﻜﻭ ﻥ ﻤﻭﺠﻪ ﻨ ﺤﻭﺍﻟﻭ‬ ‫ﺍﺝ ﻟﻭ‬ ‫ﻟﺘﻭ ﻀﻴﺢﺃﻨﻪ ﺇﺩﺭ‬
‫‪Airplane‬‬ ‫‪Interfacing‬‬
‫‪plots flying‬‬

‫‪AWACS 3.1‬‬ ‫‪AWACS 3.2‬‬

‫‪AWACS 3.3‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﻁﺎﺌ ﺭﺓ‬ ‫ﺭﺍﺩﺍ ﺭ‬

‫ﺃﻭﺍﻜ ﺱ ‪١,٣‬‬ ‫ﺃﻭﺍﻜ ﺱ ‪٢,٣‬‬

‫ﺃﻭﺍﻜ ﺱ ‪٣,٣‬‬

‫ﻟ ﻭﺭﺍﺜﺔ‬
‫ﻟﺘﺭﻜﻴﺏ ﻭﺍ‬
‫ﻟﺒﺔﺃﻭﺍﻜ ﺱ ﺒﺎ ﺴﺘﺨﺩﺍ ﻡﺍ‬
‫ﻗﻭ‬

‫ﻟ ﺼﻔﺎﺕ ‪: Polymorphisme‬‬
‫ﺘﻌﺩﺩﺍ‬ ‫‪٥‬‬

‫‪ .١‬ﺘﻌﺭﻴ ﻑ‪:‬‬ ‫‪.٥‬‬

‫ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ﻫﻭﺍﻟﻤﺒﺩﺃﺍﻟﺜﺎﻟﺙ ﻤ ﻥﺍﻟﻤﺒﺎﺩ ﺉﺍﻟﺘﻲ ﻴﺭﺘﻜ ﺯ ﻋﻠﻴﻬﺎ ﻭﺠﻭﺩﺍﻟﻜﺎﺌ ﻥ‪.‬ﺃﻭ‬


‫‪ ،‬ﻓﺈ ﻥ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ﻴﺴﻤﺢ ﻷ ﻱ‬
‫ﺍﻷﻗﻭﻯ‪ .‬ﻭﻜﻤﺎ ﻴﺸﻴﺭ ﺇﻟﻴﻪﺍﺴﻤﻪ‬ ‫ﺍﻭ‬ ‫ﺒﺎﻷ ﺤﺭﻯ ﻫﻭﺍﻟﻤﺒﺩﺃﺍﻷﻜﺜﺭ ﺘﺄﺜﻴﺭ‬
‫‪ ،‬ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ﻴﻤﻜ ﻥ‬
‫ﻤﻨﻬﺎﺝ ﻤ ﻥﺃ ﻥ ﻴﺘﺨﺫ ﻋﺩﺓ ﻭﺠﻭﻩ ﻓﻲﺃ ﺼﻨﺎ ﻑ ﻤﺨﺘﻠﻔﺔ‪ .‬ﻓﻤ ﻥ ﺨﻼلﺍﻟﻠﻐﺎ ﺕ‬
‫‪ ،‬ﻓﻲ ﺤﻴ ﻥ ﻴ ﺼﻨﻔﻪ ﺁﺨﺭﻭ ﻥ ﻀﻤ ﻥﺍﻷ ﺼﻨﺎ ﻑﺍﻟﺘﺎﺒﻌﺔ‬ ‫ﺍﻟﺘﻌﺒﻴﺭ ﻋﻨﻪ ﻓﻲ ﻤﺠﻤﻭﻉﺃ ﺼﻨﺎ ﻑ ﻨ ﻅﺎﻡ ﻤﺎ‬
‫ﻟﻨﻔ ﺱﺍﻟﺘﺴﻠﺴل‪.‬‬

‫ةﺗﻌﺪداﻟ ﺼﻔﺎ ت‪:‬‬


‫‪ .٢ .٥‬ﻗﻮ‬

‫ﺴﻭ ﻑ ﻨﺒﻴ ﻥ ﻗﻭﺓ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ﻤ ﻥ ﺨﻼل ﻤﻌﺎﻟﺠﺔﻟﻤﺜﺎل ﻜﺎﺌﻥ ﺒﻴﺎﻨﻲ ‪GraphicObject‬‬
‫ﺍﺌﺭ ﻭﺃﺸﻴﺎﺀ‬
‫‪ ،‬ﺩﻭ‬‫‪ ،‬ﻤﺜﻠﺜﺎ ﺕ‬
‫‪.‬ﺃ ﻱ ﺼﻭﺭﺓ ﻴﻤﻜ ﻥ ﺭﺅﻴﺘﻬﺎ ﻜﻤ ﺯﻴﺞ ﻤ ﻥﺍﻷﺸﻜﺎلﺍﻟﻬﻨﺩﺴﻴﺔ‪ :‬ﻤﺭﺒﻌﺎ ﺕ‬
‫ﺍﺍﻟﺸﻜل ﻤﻤﻜ ﻥ ﻤ ﻥ ﺨﻼل ﻤﺒﺩﺃ‬ ‫ﺃﺨﺭﻯ ﻴﻤﻜ ﻥﺍﺸﺘﻘﺎﻗﻬﺎ ﻤ ﻥﺍﻟ ﺼﻨ ﻑ ﻜﺎﺌﻥ ﺒﻴﺎﻨﻲ‪ .‬ﺘﺭﻜﻴ ﺏ ﻋﻠﻰ ﻫﺫ‬
‫ﺍ ﺕ )‪ .(notion of pointers downward compatibility‬ﻋﻠﻰ‬ ‫ﺍﻓﻕﺍﻟﺘﻨﺎ ﺯﻟﻲﻟﻠﻤﺅﺸﺭ‬
‫ﺍﻟﺘﻭ‬
‫ﻟ ﻤ ﺭﺠﻊ ‪ ("Reference‬ﻋﻠﻰ ﻜﺎﺌ ﻥﻟ ﺼﻨ ﻑ ﻤﺘﺨ ﺼ ﺹ ﻴﻤﻜ ﻥ‬ ‫‪ ،‬ﻤﺅﺸﺭ )ﺃﻭ ﻓﻲ ﺒﻌ ﺽﺍﻟﻠﻐﺎ ﺕ "ﺍ‬ ‫ﻜل‬
‫ﺍﺌﻤﺎﺃ ﻥ ﻴﺅﺸﺭ ﻋﻠﻰ ﻜﺎﺌ ﻥ ﻤ ﻥ ﺼﻨ ﻑ ﻋﺎﻡ‪.‬‬‫ﺩ‬

‫ﺍﻤﺎ ﻋﻠﻴﻨﺎ ﻁﻠ ﺏﺍﻟﻤﻨﻬﺎﺝﺃﻨﺸ ﺭ ‪Display‬‬ ‫‪ ،‬ﻓﺈﻨﻪ ﻴﻜﻭ ﻥﻟ ﺯ‬


‫ﺍ ﻤﺎﺃﺭﺩﻨﺎ ﺘﺨ ﻁﻴ ﻁ ﺭﺴﻡ ﺘﺎﻡ‬ ‫ﺇﺫ‬
‫‪،‬ﻟﻘﺩ ﺤﺎﻓ ﻅﻨﺎ ﻋﻠﻰ ﺘﻭﻗﻴﻌﺎ ﺕ‬
‫ﺍﺭ ﺫﻟ ﻙ‬
‫ﻟﻜل ﻨﻭﻉ ﻤ ﻥﺍﻟﻜﺎﺌﻨﺎ ﺕﺍﻟﺘﻲ ﺘﺩﺨل ﻓﻲ ﺭﺴﻤﻨﺎ‪ .‬ﻋﻠﻰ ﻏﺭ‬
‫ﺍﻡ‬
‫ﻤﺨﺘﻠ ﻑ ﻤﻨﺎ ﻫﺞﺍﻟﻨﺸﺭﻟﻜلﺍﻟﻜﺎﺌﻨﺎ ﺕﺍﻟﻤﻨﺘﻤﻴﺔﻟﻨﻔ ﺱ ﺘﺴﻠﺴل ﻜﺎﺌﻥ ﺒﻴﺎﻨﻲ‪ :‬ﺇﻨﻪﺍﻟﺸﺭ ﻁ ﻗﺒلﺍﺴﺘﺨﺩ‬
‫‪ ،‬ﻴﻤﻜﻨﻨﺎﺍﻵ ﻥﺍﺴﺘﻌﻤﺎل ﻜﻭﺩﺍﻟﺸﻜل‪:‬‬ ‫ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ‪ .‬ﺇﺫ ﻥ‬
‫‪method Drawing :: Display‬‬
‫{‬
‫‪for every GraphicObject include‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫{‬
‫]‪[Object Display‬‬
‫}‬
‫}‬

‫ﻟ ﺼﻔﺎﺕﻓﻲ ﻤﺠﻤ ﻭﻋﺔ‬


‫ﺇ ﺴﺘﻌﻤﺎل ﺘﻌﺩﺩﺍ‬

‫ﺍﺓﺍﻟﻤﻨﻬﺎﺝﺍﻟﻤﻨﺎﺴ ﺏﻟﻠﻜﺎﺌ ﻥﺍﻟﻤﻨﺎﺴ ﺏ‪.‬ﺍﻵﻟﻴﺔ‬ ‫ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕﻟﻠﻤﻨﻬﺎﺝﺃﻨﺸ ﺭ ﻴ ﻀﻤ ﻥ ﻤﻨﺎﺩ‬


‫ﺍﺘﻴﺠﻴﺔﺍﻟﺭﺒ ﻁﺍﻟﻤﺘﺄﺨﺭﺃﻭ ‪.late Bending‬‬ ‫ﺍﺍﻟﻤﻴﻜﺎﻨﻴ ﺯﻡﺍﻟﻌﺠﻴ ﺏ ﺘﺭﺘﻜ ﺯ ﻋﻠﻰﺍﺴﺘﺭ‬ ‫ﺍﺨﻠﻴﺔﻟﻬﺫ‬
‫ﺍﻟﺩ‬
‫‪ ،‬ﻭﻴ‪‬ﺸﻔﹼﺭ‬‫ﺍﺒ ﻁ‬
‫ﺍﻟﺔ ﻴ‪ ‬ﺤﺴ ﺏﺃﺜﻨﺎﺀ ﺘ ﺤﺭﻴﺭﺍﻟﺭﻭ‬‫ﺍﺀﺃﻭ ﺩ‬ ‫ﺍ ﻥ ﻁﻠ ﺏ ﺇﺠﺭ‬‫‪ ،‬ﻋﻨﻭ‬ ‫ﻟﻨﻔﺭ ﺽ ﺒﺭﻨﺎﻤﺠﺎ ﻜﻼﺴﻴﻜﻴﺎ‬
‫‪ ،‬ﻤﻜﺎ ﻥ‬ ‫‪‬ﺭﻉ )‪ .(early Bending‬ﻓﻲ ﺤﺎﻟﺔﺍﻟﺭﺒ ﻁﺍﻟﻤﺘﺄﺨﺭ‬ ‫ﺒﺩﻗﺔ ﻓﻲﺍﻟﺒﺭﻨﺎﻤﺞ‪ :‬ﺇﻨﻪﺍﻟﺭﺒ ﻁﺍﻟﻤﺘﺴ‬
‫ﺍ ﻥﺍﻟ ﻁﻠ ﺏ‪.‬‬
‫ﺍﻟﻤﻨﻬﺎﺝﺍﻟﻤ ﻁﻠﻭ ﺏ ﻴﻘﻊ ﻓﻲﺍﻟﻜﺎﺌ ﻥ ﻨﻔﺴﻪ‪ .‬ﺇﺫ ﻥ ﻓﻲﺃﺜﻨﺎﺀﺍﻟﺘﻨﻔﻴﺫ ﻴﻨﺸ ﺊﺍﻟﺒﺭﻨﺎﻤﺞ ﻋﻨﻭ‬

‫ﻟﻰ‬‫‪ ،‬ﻭﻴﺘﻌﻠﻕﺍﻷﻤﺭ ﺒﺎﻟﻤﻨﻬﺎﺝﺘﺤ ﺭﻙ ﺇ‬ ‫‪ ،‬ﻓﻠﻨﻔﺭ ﺽ ﻤﺜﺎﻻ ﺁﺨﺭ‬ ‫ﺍﺍﻟﻤﺜﺎل ﻤﺒﻬﻤﺎ‬‫ﻗﺩ ﻴﻜﻭ ﻥ ﻫﺫ‬
‫ﺍﻉﺍﻟﻜﺎﺌ ﻥﺍﻟﺒﻴﺎﻨﻲ‬‫ﺍﺍﻟﻜﻭ ﺩ ﻴﻌﺩ ﺼﺎﻟ ﺤﺎ ﻷ ﻱ ﻨﻭﻉ ﻤ ﻥﺃﻨﻭ‬‫ﺍﻟﺫ ﻱ ﺸﺭ ﺤﻨﺎﻩ ﺴﺎﺒﻘﺎ‪ .‬ﺇﺫ ﻥ ﻫﺫ‬‫‪،‬ﻭ‬‫‪MoveTo‬‬
‫ﺍﺜﻴﺎ ﺕ ﺜﻡ ﻨﺸﺭ‪ .‬ﻤﺭﺓ‬‫‪ ،‬ﺘﻐﻴﻴﺭﻟ ﻺ ﺤﺩ‬‫ﺍ ﺼل‬‫ﺍﺌﻤﺎ ﻋﻠﻰ ﻤ ﺤﻭ ﻤﺘﻭ‬‫ﺍﻟﺫ ﻱ ﻨ ﻁﺒﻘﻪ ﻋﻠﻴﻪ‪:‬ﺍﻟﺘ ﺤﺭﻴ ﻙ ﻴﻌﺘﻤﺩ ﺩ‬
‫ﺍﺍﻟﻜﻭﺩ ﺒﻔ ﻀل ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ‪ polymorphism‬ﻷﻨﻪ ﻤ ﻁﻠﻭ ﺏﺃ ﻥ ﺘﻜﻭ ﻥ ﻤﻨﺎ ﻫﺞ‬ ‫‪ ،‬ﻴﻌﻤل ﻫﺫ‬‫ﺃﺨﺭﻯ‬
‫ﺍﺩ ﻫﻲﺍﻟﺘﻲ ﺘﻡ ﻁﻠﺒﻬﺎ‪.‬‬ ‫ﺍﻟﻨﺸﺭﺍﻟﻤﻨﺎﺴﺒﺔ ﻟﻠﻜﺎﺌ ﻥﺍﻟﻤﺭ‬ ‫ﺍﻟﻤ ﺤﻭ ﻭ‬

‫‪،‬‬
‫ﺍﺍﻋﺘﺒﺭﻨﺎﺃ ﻥﺍﻟﻤ ﺤﻭ ﻴﺘﻠﺨ ﺹ ﻓﻲ ﺇﻋﺎﺩﺓ ﺭﺴﻡﺍﻟﻜﺎﺌ ﻥ ﻭﻟﻜ ﻥ ﺒﻠﻭ ﻥﺍﻟﺨﻠﻔﻴﺔ‬‫‪ ،‬ﺇﺫ‬
‫ﻨﻔ ﺱﺍﻟﺸﻲ ﺀ‬
‫ﺍﺍﻟﺸﻜل‪:‬‬ ‫ﻓﺈﻨﻪ ﻴﻤﻜﻨﻨﺎ ﺘﻌﺭﻴ ﻑ ﻤﻨﻬﺎﺝﺍﻟﻤ ﺤﻭ ﺒﻬﺫ‬
‫‪method GraphicObject :: Delete‬‬
‫{‬
‫]‪[Object SetColor: BackgroundColor‬‬
‫]‪[Object Display‬‬
‫}‬

‫ﻟﻤﻨ ﻬﺎﺝ ‪delete‬‬


‫ﻟ ﺼﻔﺎﺕﻓﻲﺍ‬
‫ﺇ ﺴﺘﻌﻤﺎل ﺘﻌﺩﺩﺍ‬

‫اﺋﺪ ‪Overloading‬‬
‫ﺷﻜﻞ ﻧﺎﺟﻊﻟﺘﻌﺪداﻟ ﺼﻔﺎ ت‪:‬اﻟﺘﺤﻤﻴﻞاﻟﺰ‬ ‫‪.٣‬‬ ‫‪.٥‬‬

‫ﺍﻟﺫ ﻱ ﻴﺴﻤﺢ‬
‫‪،‬ﻭ‬‫ﺍﺌﺩ ﻫﻭ ﺁﻟﻴﺔ ﻤﻘﺘﺭ ﺤﺔ ﺒﻜﺜﺭﺓ ﻤ ﻥ ﻗﺒلﻟﻐﺎ ﺕﺍﻟﺘﻭﺠﻪﺍﻟﻜﺎﺌﻨﻲ‬
‫ﺍﻟﺘ ﺤﻤﻴلﺍﻟ ﺯ‬
‫ﺍ ﺕ ﺘ ﺤﻤل ﻨﻔ ﺱﺍﻹﺴﻡ‪.‬‬‫ﺍﺀ‬‫ﺍل ‪ /‬ﺇﺠﺭ‬‫ﺒﺘﺨ ﺼﻴ ﺹ ﺘﻭﻗﻴﻌﺎ ﺕ ﻤﺨﺘﻠﻔﺔﻟﻤﻨﺎ ﻫﺞ ‪ /‬ﺩﻭ‬

‫‪ ،‬ﻨﻘﺩﺭﺃ ﻥ ﻨﻘﺘﺭ ﺡ ﺘﻭﻗﻴﻌﻴ ﻥ ﻤﺨﺘﻠﻔﻴ ﻥ ﻟﻠﻤﻨﻬﺎﺝﺃﻨﺸ ﺭ‬


‫ﻜﻤﺜﺎل‬

‫ﺍ ﻤﺎﺃﺭ ﺩﻨﺎﺍﺴﺘﻌﻤﺎل ﻭﺴﻴ ﻁ ﻨﺸﺭ ﺒﺎﻟﻐﻴﺎ ﺏ ‪.Default‬‬


‫ﺍ ﺕ ﺇﺫ‬
‫ﺍﻤﺘﺭ‬ ‫‪ v‬ﻤ ﻥ ﺩﻭ ﻥ ﺒﺎﺭ‬
‫ﺍﻤﺘﺭ‪.‬‬‫‪ v‬ﺘ ﺤﺩﻴﺩ ﻭﺴﻴ ﻁ ﺒﺒﺎﺭ‬

‫ﻛﺔ ‪The Relation of Association :‬‬


‫ا‬‫ﻋﻼﻗﺔاﻟﺸﺮ‬ ‫‪٦‬‬
‫ﺍﻟﺒﺭﻤﺠﻴﺔ ﻭﻟﻴﺴ ﺕﺍﻻﻗﺘ ﺼﺎﺩﻴﺔ( ﻫﻲ ﺜﺎﻟﺙ ﻨﻭﻉ ﻤﻬﻡ ﻤ ﻥﺍﻟﻌﻼﻗﺔﺍﻟﺘﻲ ﻓﺭ ﻀﻨﺎ ﻫﺎ‬
‫ﺍﻜﺔ )‬‫ﺍﻟﺸﺭ‬
‫ﺍﺜﺔ ﻻ ﺘﻌﺎﻨﻲ ﻤ ﻥﺃ ﻱ‬‫ﺍ ﻜﺎﻨ ﺕﺍﻟﻭﺭ‬‫‪ ،‬ﻓﺈﺫ‬
‫ﺍﻟﺘﺭﻜﻴ ﺏ ‪Aggregation‬‬ ‫ﺍﺜﺔ ‪ Heritage‬ﻭ‬ ‫ﺒﻌﺩ ﻜل ﻤ ﻥﺍﻟﻭﺭ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﺍﻜﺔ ﻴ ﺼﻌ ﺏ‬‫‪ ،‬ﻷﻨﻬﺎ ﺘﺘﺭﺠﻡﺍﻟﺠﻤﻠﺔ "‪ ...‬ﻫﻲ ﺸﻜل ﺨﺎ ﺹ ﻤ ﻥ ‪ ."(IS A) ...‬ﻓﺈ ﻥ ﻋﻼﻗﺔﺍﻟﺸﺭ‬ ‫ﺇﻟﺘﺒﺎ ﺱ‬
‫‪ ،‬ﻓﺈﻨﻬﺎ ﻴﻤﻜﻨﻨﺎﺍﻟﻘﻭل‪ ..." :‬ﻴﺘ ﺼل ﻤﻊ‬
‫‪ ،‬ﻓ ﺤﺴ ﺏ ﻤﺨﺘﻠ ﻑﺍﻟﻨﺎﺸﺭﻴ ﻥ‬
‫ﺍﻟﺭﻤ ﺯ ﺇﻟﻴﻬﺎ‪ .‬ﻋﻠﻰ ﻜل‬
‫ﺘﻤﺜﻴﻠﻬﺎ ﻭ‬
‫‪ ،‬ﻴﻤﻜ ﻥ ﺒﺴﻬﻭﻟﺔ‬
‫‪،‬ﺃﻭ ﺒﺎﻹﻨﺠﻠﻴ ﺯﻴﺔ " ‪ ." USES A‬ﻓﻔﻲ ﺒﻌ ﺽﺍﻟ ﺤﺎﻻ ﺕ‬ ‫‪،"...‬ﺃﻭ "‪ ...‬ﻴﺴﺘﻌﻤل ‪"...‬‬
‫ﺃ ﻥ ﺘﺨﺘﻠ ﻁﺍﻷﻤﻭﺭ ﻤﻊ ﻋﻼﻗﺔﺍﻟﺘﺭﻜﻴ ﺏ ‪ ...") aggregation‬ﻴﺘﺭﻜ ﺏ ﻤ ﻥ ‪ ("...‬ﻜﻤﺎ ﺴﻨﺭﻯ ﻓﻲ‬
‫ﺍﻟﻤﺜﺎلﺍﻟﺫ ﻱ ﺴﻴﺄﺘﻲ ﻻ ﺤﻘﺎ‪.‬‬

‫ﺍﻨﺎ ﺕ‪.‬‬
‫‪ ،‬ﻓﻠﻨﻔﺭ ﺽ ﻤﺜﺎﻻ ﻜﻼﺴﻴﻜﻴﺎ‪ ،‬ﻭﻴﺘﻌﻠﻕﺍﻷﻤﺭ ﺒ ﺤﺩﻴﻘﺔﺍﻟ ﺤﻴﻭ‬
‫ﻤ ﻥﺃﺠل ﺘﺜﺒﻴ ﺕﺍﻟﻤﻔﺎ ﻫﻴﻡ‬
‫‪ ،‬ﻭﻴﺘﺠﺎﻭ ﺏ ﻤﻊ ﺘﻔﻜﻴﺭﺍﻟﻤ ﺼﻤﻡ‪.‬‬
‫ﻓﻤ ﻥ ﺠﻬﺔ ﻨﺫﻜﹼﺭﺃ ﻥ ﻤﺒﺩﺃﺍﻟﻜﺒﺴﻠﺔ ﺸﺨ ﺼﻲ‬

‫ﺍﻨﺎ ﺕ ﺇﺫ ﻥ ﺘﺘﻜﻭ ﻥ ﻤ ﻥ‪:‬‬


‫ﺤﺩﻴﻘﺔﺍﻟ ﺤﻴﻭ‬

‫‪ v‬ﻤﺠﻤﻭﻉﺃﻗﻔﺎ ﺹ‬
‫‪ v‬ﻤﺠﻤﻭﻋﺔ ﺤﻴﻭ‬
‫ﺍﻨﺎ ﺕ‬
‫ﺍﺱ‬ ‫‪ v‬ﻤﺠﻤﻭﻋﺔ ﺤﺭ‬

‫ﻴ ﻅﻬﺭ ﺒﻭ ﻀﻭ ﺡﺃ ﻥ ﻫﺫﻩﺍﻟﻌﻼﻗﺎ ﺕ ﻤ ﻥﺍﻟﺘﺭﻜﻴ ﺏ ‪.aggregation‬‬

‫ﺍﺭﺓ‬‫ﺍﻨﻴ ﻥ ﺇﺩ‬
‫ﺍﻨﺎ ﺕ ) ﺤﺴ ﺏ ﻗﻭ‬
‫ﺍ ﻤﻌﻴﻨﺎ ﻤ ﻥﺍﻟ ﺤﻴﻭ‬‫ﺍﻗ ﺏ ﻋﺩﺩ‬
‫‪،‬ﺃ ﻱ ﺤﺎﺭ ﺱ ﻴﺠ ﺏﺃ ﻥ ﻴﺭ‬ ‫ﻋﻭ ﺽ ﺫﻟ ﻙ‬
‫ﺍ ﻤﻌﻴﻨﺎ ﻤ ﻥ‬
‫‪،‬ﺃ ﻱ ﻗﻔ ﺹ ﻴ ﺤﻭ ﻱ ﻋﺩﺩ‬ ‫ﺍل‬ ‫ﺍ ﺁﺨﺭ ﻤ ﻥﺍﻷﻗﻔﺎ ﺹ‪ .‬ﻋﻠﻰ ﻨﻔ ﺱﺍﻟﻤﻨﻭ‬ ‫‪ ،‬ﻭﻴﻨ ﻅ ﻑ ﻋﺩﺩ‬‫ﺍﻟ ﺤﺩﻴﻘﺔ(‬
‫ﺍﺭﺓﺍﻟ ﺤﺩﻴﻘﺔ(‪.‬‬
‫ﺍﺌﻤﺎ ﺤﺴ ﺏ ﺇﺩ‬‫ﺍﻨﺎ ﺕ ) ﺩ‬
‫ﺍﻟ ﺤﻴﻭ‬

‫ﺍﻟﻌﻼﻗﺎ ﺕﺍﻷﺨﻴﺭﺓ ﻻ ﺼﻠﺔﻟﻬﺎ ﺒﺎﻟﺘﺭﻜﻴ ﺏ ‪) aggregation‬ﻋﺎﺩﺓ ﻤﺎ ﻨﻌﺘﺒﺭﺃ ﻥ ﻨﻔ ﺱﺍﻟﻜﺎﺌ ﻥ‬


‫ﺍﻜﺎ ﺕ‪ .‬ﺇﺫ ﻥ ﻨﻘﻭﻡ ﺒﺠﻌل ﻜل ﻋﻼﻗﺔ ﻻ ﺘﺘﻨﺎﺴ ﺏ‬ ‫ﺍ ﻤ ﻥ ﻗﺒلﺍﻟﻜﺎﺌﻨﺎ ﺕﺍﻷﺨﺭﻯ( ﻭﻟﻜﻨﻬﺎ ﺸﺭ‬
‫ﻟﻴ ﺱ ﻤﻌﺘﻤﺩ‬
‫‪ ،‬ﻓﻨ ﺤ ﺼل ﺇﺫ ﻥ ﻋﻠﻰﺍﻟﺘ ﺼﻤﻴﻡﺍﻟﺫ ﻱ ﺴﻴﺄﺘﻲ ﻻ ﺤﻘﺎ‪.‬‬
‫ﺍﻜﺔ‬
‫ﺍﺜﺔﺃﻭﺍﻟﺘﺭﻜﻴ ﺏ ﻀﻤ ﻥ ﺤﺎﻟﺔﺍﻟﺸﺭ‬ ‫ﻤﻊﺍﻟﻭﺭ‬

‫‪ ،‬ﺴﻭ ﻑ ﻨ ﺤﺩﺩ ﻜﺎﺭﺩﻴﻨﺎﻟﻴﺎ ﺕ ﻭﻤﻬﺎﻡ ﻋﻠﻰ ﻋﻼﻗﺔ‬


‫ﻋﻠﻰ ﻁﺭﻴﻘﺔﺍﻟﺘﺭﻜﻴ ﺏ ‪aggregation‬‬
‫ﺍﺀﺓ‪:‬‬
‫‪ ،‬ﻨﺴﺘ ﻁﻴﻊ ﻗﺭ‬
‫ﺍ ﻤﺎﺍﻋﺘﺒﺭﻨﺎﺍﻟﻌﻼﻗﺔ ﺒﻴ ﻥﺍﻟ ﺼﻨﻔﻴ ﻥ ﻗﻔ ﺹ ﻭ ﺤﺎ ﺭ ﺱ‬
‫‪ ،‬ﺇﺫ‬
‫ﺍﻜﺔ‪ .‬ﻜﻤﺜﺎل‬
‫ﺍﻟﺸﺭ‬

‫ﱠ ﻑ ﻤﻥ ﻗﺒل ﺤﺎ ﺭ ﺱ ﻭﺍ ﺤﺩﻓﻘﻁ"‬
‫‪‬ﻨﻅ‬
‫ﻟﻰ ﻥ ﻗﻔ ﺹ ‪ /‬ﺃ ﻱ ﻗﻔ ﺹ ﻴ‬
‫ّ ﻑ ﻤﻥ ‪٠‬ﺇ‬
‫‪‬ﻨﻅ‬
‫ِ‬ ‫"ﺃ ﻱ ﺤﺎ ﺭ ﺱ ﻴ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫‪Zoo‬‬

‫*‬ ‫*‬
‫‪is cleaned by ١‬‬
‫‪Guardian‬‬ ‫‪Cage‬‬
‫‪clean‬‬ ‫*‬
‫‪feeds١‬‬ ‫‪١‬‬ ‫‪containing‬‬

‫‪n‬‬ ‫*‬
‫‪Animal‬‬
‫‪is fed by‬‬ ‫‪is contained‬‬

‫ﺤﺩﻴﻘﺔ ﺤﻴﻭﺍﻨﺎ ﺕ‬

‫*‬ ‫*‬
‫ﻳُﻨ ﻈَ ﻒ ﻣ ﻦ ﻗﺒﻞ ‪١‬‬
‫ﺤﺎ ﺭ ﺱ‬ ‫ﻗﻔ ﺹ‬
‫*‬ ‫ِﻒ‬
‫ﻳﻨ ﻈ‬
‫ﻳﻄﻌﻢ‬ ‫‪١‬‬ ‫‪١‬‬ ‫ﻳﺤﻮ ي‬

‫*‬
‫‪n‬‬ ‫ﺤﻴﻭﺍﻥ‬
‫ﻳُﻄﻌﻢ ﻣ ﻦ ﻗﺒﻞ‬ ‫ﻣﺤﺘﻮ ى ﻣ ﻦ ﻗﺒﻞ‬

‫ﻟﺸﺭﺍﻜﺔ‬
‫ﻟﺘﺭﻜﻴﺏ ﻭﺍ‬
‫ﻟﺒﺔ ﺤﺩﻴﻘﺔ ﺤﻴﻭﺍﻨﺎﺕ ﺒﺎ‬
‫ﻗﻭ‬

‫‪ ،‬ﻨﻤﻭﺫﺝ‬‫ﺍﻜﺔ‪ .‬ﻓﻜﻤﺜﺎل ﺜﺎﻨﻲ‬


‫‪ ،‬ﻏﺎﻟﺒﺎ ﻤﺎﻴ ﺼﻌ ﺏ ﺘ ﺤﺩﻴﺩ ﻤﺎ ﻫﻭ ﺘﺭﻜﻴ ﺏ ﻤﻡ ﻫﻭ ﺸﺭ‬
‫ﺭ ﻏﻡ ﺫﻟ ﻙ‬
‫ﺍﻨﺎ ﺕ‪.‬‬
‫‪ ،‬ﻭ ﻫﺫﻩﺍﻷﺨﻴﺭﺓ ﺘﺭﻜ ﺏ ﺤﻴﻭ‬
‫ﺍﻷﻗﻔﺎ ﺹ‬ ‫ﺍ ﺱﻭ‬ ‫ﻤﺎ ﻴ ﺤﺩﺩﺃ ﻥﺍﻟ ﺤﺩﻴﻘﺔ ﺘﺭﻜ ﺏ ‪aggregate‬ﺍﻟ ﺤﺭ‬

‫ﺍﺍﻟﺸﻜل‪:‬‬
‫ﻫﺫﻩﺍﻟ ﺤﺎﻟﺔ ﺘ ﺼﻤﻡ ﺒﻬﺫ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫‪Zoo‬‬

‫‪١‬‬ ‫‪١‬‬

‫‪n‬‬ ‫‪n‬‬
‫‪١‬‬ ‫‪is cleaned by‬‬
‫‪Guardian‬‬ ‫‪Cage‬‬
‫‪clean‬‬ ‫‪0..n‬‬
‫‪feeds١‬‬ ‫‪١‬‬

‫‪0..n‬‬ ‫‪Animal‬‬
‫‪is fed by‬‬ ‫‪٠‬‬

‫ﺤﺩﻴﻘﺔ ﺤﻴﻭﺍﻨﺎ ﺕ‬

‫‪١‬‬ ‫‪١‬‬

‫‪n‬‬ ‫‪n‬‬
‫‪١‬‬ ‫ﹶ ﻑ ﻤ ﻥ ﻗﺒل‬
‫ﻴ‪‬ﻨ ﻅ‬
‫ﺤﺎ ﺭ ﺱ‬ ‫ﻗﻔ ﺹ‬
‫ﻴ‪‬ﻨ ﻅِ ﻑ‬ ‫‪0..n‬‬
‫ِﻢ‬
‫ﻳُﻄﻌ‬ ‫‪١‬‬ ‫‪١‬‬

‫‪0..n‬‬ ‫ﺤﻴﻭﺍﻥ‬
‫ﻳُﻄﻌﻢ ﻣ ﻦ ﻗﺒﻞ‬ ‫‪٠‬‬

‫ﻟﺸﺭﺍﻜﺔ‬
‫ﻟﺘﺭﻜﻴﺏ ﻭﺍ‬
‫ﻟﺏﺁﺨﺭﻟﺤﺩﻴﻘﺔ ﺤﻴﻭﺍﻨﺎﺕ ﺒﺎ‬
‫ﻗﺎ‬

‫ذجاﻟﻜﺎﺋﻦ‪:‬‬
‫‪ ٧‬ﺧﺘﺎم ﻧﻤﻮ‬
‫ﺍﺭ‬ ‫‪ ،‬ﻭﻟﻜ ﻥﺍﻟﻤﺸﻭ‬‫ﺍﺴﺔ ﻤﺒﺴ ﻁﺔﻟﺠ ﺯﺀ ﻗﻠﻴل ﻤ ﻥﺍﻟﻤﻔﺎ ﻫﻴﻡﺍﻟﻤﺘﻌﻠﻘﺔ ﺒﻤﻔﻬﻭﻡﺍﻟﻜﺎﺌ ﻥ‬ ‫ﻟﻘﺩ ﺭﺃﻴﻨﺎ ﺩﺭ‬
‫ﺍﻜﺔ ﻫﻲ‬ ‫ﺍﻟﺸﺭ‬‫‪،‬ﺍﻟﺘﺭﻜﻴ ﺏ ﻭ‬ ‫ﺍﺜﺔ‬
‫ﺍﺴﻌﺔ‪ .‬ﻋﻼﻗﺎ ﺕﺍﻟﻭﺭ‬ ‫ﺍﺘﻬﺎ ﻭ‬
‫‪ ،‬ﻷ ﻥﺍﻟﻤﻔﺎ ﻫﻴﻡ ﻜﺜﻴﺭﺓ ﻭﻤﻤﻴ ﺯ‬ ‫ﺍل ﻁﻭﻴﻼ‬ ‫ﻤﺎ ﺯ‬
‫ﺍﻷﺴﺎﺴﻴﺔ ﻓﻲﺍﻟﻜﺎﺌﻨﺎ ﺕ‪ .‬ﻓﺒﻌ ﺽﺍﻟﻤﺒﺭﻤﺠﻴ ﻥ ﻴﺭﻯﺃﻨﻪ ﻤ ﻥ ﺨﻼل ﻫﺫﻩﺍﻟﻌﻨﺎ ﺼﺭﺍﻟﺜﻼﺜﺔ ﻴﻤﻜ ﻥ ﻓﻌل‬
‫ﺍﺠ ﺏ‬ ‫‪ ،‬ﻭﻴﻌﻤﻠﻭ ﻥ ﺒﻬﺎ‪.‬ﺍﻟﻨﻘ ﻁﺔﺍﻷﺴﺎﺴﻴﺔﺍﻟﻭ‬ ‫ﺍﻉﺃﺨﺭﻯ ﻤ ﻥﺍﻟﻌﻼﻗﺎ ﺕ‬ ‫‪ ،‬ﺁﺨﺭﻭ ﻥ ﻴﺘﻨﺎﻭﻟﻭ ﻥﺃﻨﻭ‬ ‫ﻜل ﺸﻲﺀ‬
‫‪ ،‬ﻭﺒ ﺤﺎﻟﺔ‬‫ﺍﻟﻤﺭﺘﺒ ﻁ ﺒﺘﻔﻜﻴﺭﺍﻟﻤ ﺼﻤﻡ‬
‫ﺍ ﻜﻠﻴﺎ ﻋﻠﻰ ﻤﻔﻬﻭﻡﺍﻟﻜﺒﺴﻠﺔ ﻭ‬ ‫ﺤﻔ ﻅﻬﺎ ﻫﻲﺃ ﻥﺍﻟﻘﻭﻟﺒﺔ ﺘﻌﺘﻤﺩﺍﻋﺘﻤﺎﺩ‬
‫ﺍﺩ ﺇﻨﺠﺎ ﺯﻩ‪.‬‬‫ﺍﻟﺘ ﻁﺒﻴﻕﺍﻟﻤﺭ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﺍ‬
‫‪ ،‬ﻭﻴﻌﺩ ﺒﺫﻟ ﻙﺍﺠﺘﻬﺎﺩ‬
‫ﺍﺍﻟﻌﻤل ﻫﻭﺍﻷﻭل ﻤ ﻥ ﻨﻭﻋﻪ ﺒﺎﻟﻨﺴﺒﺔﻟﻲ‬‫‪،‬ﺃﺸﻴﺭ ﺇﻟﻰﺃ ﻥ ﻫﺫ‬ ‫ﻗﺒلﺍﻟﺨﺘﺎﻡ‬
‫ﺍ‬‫‪ ،‬ﻓﻼ ﻻ ﺘﺘﺭﺩﺩﻭ‬‫ﺸﺨ ﺼﻴﺎ‪ .‬ﻗﺩ ﻴﻨﻘ ﺼﻪﺍﻟﻜﺜﻴﺭ ﻤ ﻥﺍﻟﻤﻔﺎ ﻫﻴﻡﺃﻭﺍﻟﺘﻨ ﻅﻴﻡﺃﻭ ﺤﺘﻰ ﻁﺭﻴﻘﺔﺍﻟﺸﺭ ﺡ‬
‫ﺍ‪.‬‬‫‪ ،‬ﻭﺸﻜﺭ‬ ‫ﺍ ﺤﺎﺘﻜﻡ ﻭﺇ ﻀﺎﻓﺎﺘﻜﻡ‬
‫ﺒﺎﻗﺘﺭ‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ا ت‪:‬‬
‫‪ ٨‬ﻗﺎﻣﻮ ساﻟﻤﻔﺮد‬
‫ﻟﻤﺭﺍﺩ ﻑ‬‫ﻟﻤ ﺼﻁﻠ ﺢ ﺍ‬ ‫ﺍ‬
‫ﻟﺸ ﺭﺡ‬
‫ﺍ‬
‫ﻟﻌ ﺭﺒﻲ‬
‫ﺍ‬ ‫ﺍ ﻹﻨﺠﻠﻴ ﺯ ﻱ‬
‫ﺍﻟﺒﻴﺎﻨﺎ ﺕﺍﻟﺘﻲ ﺘﻌﻤل ﻓﻲ ﺇ ﻁﺎﺭ‬ ‫ﺍل ﻭ‬ ‫ﻫﻭ ﻤﺠﻤﻭﻋﺔ ﻤ ﻥﺍﻟﺩﻭ‬
‫ﻜﺎﺌ ﻥ‬ ‫‪Object‬‬
‫ﻤﻭ ﺤﺩ ﻤﺸﻜﻠﺔ ﺸﻴﺌﺎ ﻤﺘﻨﺎﺴﻘﺎ‪.‬‬
‫ﻫﻭ ﺼﻭﺭﺓ ﻤﻨﻔ ﺼﻠﺔ ﻤ ﻥﺍﻟ ﺼﻭﺭﺍﻟﺘﻲ ﺘﻡ ﺘﺸﻜﻴﻠﻬﺎ ﻤ ﻥ‬
‫ﻤﺜﻴل‬ ‫‪Instance‬‬
‫ﺼﻨ ﻑ ﻤﺎ‪.‬‬
‫ﻋﻤﻠﻴﺔ ﺘﺸﻜﻴل ﻜﺎﺌ ﻥﺃﻭ ﻜﺎﺌﻨﺎ ﺕ ﻋﺩﻴﺩﺓ ﻤ ﻥ ﻨﻔ ﺱ‬
‫ﺨﻠﻕ ﻤﺜﻴل‬ ‫‪Instanciation‬‬
‫ﺍﻟ ﺼﻨ ﻑ‪.‬‬
‫ﻋﻤﻠﻴﺔﺍﺸﺘﻘﺎﻕﺃ ﺼﻨﺎ ﻑ ﺠﺩﻴﺩﺓ ﻤ ﻥﺃ ﺼﻨﺎ ﻑﺃﻜﺜﺭ‬
‫‪ ،‬ﻤﻊﺍﻟﻘﺩﺭﺓ ﻋﻠﻰ‬ ‫ﺍﺘﻬﺎ‬‫ﻋﻤﻭﻤﻴﺔﻟﺘ ﺤﻭ ﻱ ﺒﺫﻟ ﻙ ﻋﻠﻰ ﻤﻤﻴ ﺯ‬
‫ﺍﺜﺔ‬ ‫ﻭﺭ‬ ‫‪Heritage‬‬
‫ﺍ ﺕ ﺠﺩﻴﺩﺓ ﻭﻋﻼﻗﺘﻬﺎ ﻫﻲ‪:‬‬ ‫ﺇ ﻀﺎﻓﺔ ﻤﻤﻴ ﺯ‬
‫اﻟ ﺼﻨ ﻒاﻟﻤﺸﺘﻖﻫﻮإ ﺻﺪار ﺧﺎ ص ﻣﻦاﻟ ﺼﻨ ﻒاﻟﻘﺎ ﻋﺪي‬
‫ﺇﺨﻔﺎﺀ ﺒﻌ ﺽﺍﻟﺒﻴﺎﻨﺎ ﺕ ﻋ ﻥﺍﻟﻤﺴﺘﺨﺩﻡﻟ ﺤﻤﺎﻴﺔﺍﻟﻜﺎﺌ ﻥ ﻤ ﻥ‬
‫‪ Encapsulation‬ﻜﺒﺴﻠﺔ‬
‫ﺘﻌﺩﻴﻼ ﺕ ﻏﻴﺭ ﻤﺭ ﻏﻭﺒﺔ‪.‬‬
‫ﻫﻭﺃﺴﻠﻭ ﺏ ﻴﺴﻤﺢ ﺒﺘ ﺤﺩﻴﺩ ﻤﺭﻜﺒﺎ ﺕ ﻜل ﺼﻨ ﻑ )ﺃﻭ‬
‫‪،‬ﺍﻟﻌﻼﻗﺔ ﺒﻴ ﻥ‬ ‫‪،‬ﺃﻭ ﺒﻤﻌﻨﻰ ﺁﺨﺭ‬ ‫ﻜﺎﺌ ﻥ( ﻭﻋﺩﺩ ﻫﺎ‬ ‫ﺘﺭﻜﻴ ﺏ‬ ‫‪Aggregation‬‬
‫‪،‬ﻟﺘﺭﻜﻴ ﺏ ﺼﻨ ﻑ ﺠﺎﻤﻊ‪.‬‬ ‫ﺍﻷ ﺼﻨﺎ ﻑ‬
‫‪،‬‬ ‫ﻫﻭﺃﺴﻠﻭ ﺏ ﻴﺴﻤﺢﻟ ﺼﻨ ﻑ ﻤﺎ ﻤ ﻥﺃ ﻥ ﻴﺘﺨﺫ ﻋﺩﺓﺃﺸﻜﺎل‬
‫‪ Polymorphism‬ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ﻭﻤﻊ ﻨﻔ ﺱﺍﻷﺴﻤﺎﺀ ﻴﻤﻜ ﻥ ﻁﻠ ﺏ ﻤﻨﺎ ﻫﺞ ﻤﺨﺘﻠﻔﺔ ﺘ ﺤﻤل‬
‫‪ ،‬ﻭﻟﻜ ﻥ ﺘﺨﺘﻠ ﻑ ﻓﻲ ﺘﺭﻜﻴﺒﻬﺎ‪.‬‬ ‫ﻨﻔ ﺱﺍﻹﺴﻡ‬
‫ﻫﻭ ﻗﺎﻟ ﺏ ﻴﺘﻡ ﻤ ﻥ ﺨﻼﻟﻪ ﺨﻠﻕ ﻜﺎﺌﻨﺎ ﺕ ﻤﺘﺸﺎﺒﻬﺔﺃﻭ‬
‫ﺼﻨ ﻑ‬ ‫‪Class‬‬
‫ﻤﺨﺘﻠﻔﺔ‪.‬‬
‫‪ ،‬ﻭﻤ ﻥ ﺒﻴﻨﻬﺎﺍﻟﻤﺸﻴﺩ‬ ‫ﺍلﺍﻟﺘﺎﺒﻌﺔﻟﻜﺎﺌ ﻥ ﻤﺎ‬ ‫ﺍﻟﺔ ﻤ ﻥﺍﻟﺩﻭ‬ ‫ﻫﻭ ﺩ‬
‫ﻤﻨﻬﺎﺝ‬ ‫‪Method‬‬
‫ﺍﻟﻤﻬﺩﻡ‪.‬‬‫ﻭ‬
‫ﺍﺀﺍﻟﻤ ﺤﻤﻴﺔﺃﻭ‬ ‫‪ ،‬ﺴﻭ‬ ‫ﻤﺨﺘﻠ ﻑﺍﻟﺒﻴﺎﻨﺎ ﺕﺍﻟﺘﺎﺒﻌﺔﻟﻜﺎﺌ ﻥ ﻤﺎ‬
‫ﺨ ﺼﺎﺌ ﺹ‬ ‫‪Attributes‬‬
‫ﺍﻟﻌﺎﻤﺔﺃﻭﺍﻟﺨﺎ ﺼﺔ‪.‬‬
‫ﺍﻟﺒﻴﺎﻨﺎ ﺕ‬
‫ﻫﻭﺍﻟﻤﻨﻬﺎﺝﺍﻟﺫ ﻱ ﻴﻘﻭﻡ ﺒﺘﻬﻴﺌﺔﺍﻟﺨ ﺼﺎﺌ ﺹ ﻭ‬
‫‪‬ﺩ‬‫ﻤﺸﻴ‬ ‫‪Constructor‬‬
‫ﺍﻟﺘﺎﺒﻌﺔﻟﻠﻜﺎﺌ ﻥ ﻋﻨﺩﺃﻭل ﻋﻤﻠﻴﺔﻟﺨﻠﻕﺍﻟﻜﺎﺌ ﻥ‪.‬‬
‫‪،‬‬‫ﻫﻭﺍﻟﻤﻨﻬﺎﺝﺍﻟﺫ ﻱ ﻴﻘﻭﻡ ﺒﺘ ﺤ ﻁﻴﻡﺍﻟﻜﺎﺌ ﻥﺒﻌﺩ ﻨﻬﺎﻴﺔﺍﻟﻌﻤل‬
‫‪‬ﻡ‬‫ﻤﻬ ﺩ‬ ‫‪Destructor‬‬
‫ﺍﻜﺭﺓﺍﻟﻤ ﺤﺠﻭﺯﺓ‪.‬‬ ‫ﻟﺘ ﺤﺭﻴﺭﺍﻟﺫ‬
‫‪،‬‬‫ﺍلﺃ ﻥ ﺘﻜﻭ ﻥﻟﻬﺎﺃﺴﻤﺎﺀ ﻤﺘﺸﺎﺒﻬﺔ‬ ‫ﻴﺴﻤﺢﻟﻠﻤﻨﺎ ﻫﺞﺃﻭﺍﻟﺩﻭ‬
‫ﺍﺌﺩ‬
‫ﺍﻟﺘ ﺤﻤﻴلﺍﻟ ﺯ‬ ‫‪Overload‬‬
‫ﺍ ﺕ ﻤﺨﺘﻠﻔﺔ‪.‬‬ ‫ﺍﻤﺘﺭ‬ ‫ﻭﻟﻜ ﻥ ﺒﺒﺎﺭ‬
‫‪،‬‬
‫‪ ،‬ﻤ ﺤﻤﻲ‬ ‫‪ ،‬ﺨﺎ ﺹ‬ ‫ﺘﻤﺜل ﻤﺨﺘﻠ ﻑﺃﻗﺴﺎﻡﺍﻟ ﺼﻨ ﻑ )ﻋﺎﻡ‬
‫ﺍﺠﻬﺔ‬ ‫ﺍﻟﻭ‬ ‫‪Interface‬‬
‫ﺍ ﻀﻲ‪(...‬ﺃﻭ ﺒﻤﻔﻬﻭﻡ ﺁﺨﺭ ﻗﺎﺌﻤﺔ ﻤﻨﺎ ﻫﺞﺍﻟ ﺼﻨ ﻑ‪.‬‬ ‫ﺍﻓﺘﺭ‬
‫ﺍﺀ ﺘ ﺼﻨﻴ ﻑﻟﻠﻜﺎﺌﻨﺎ ﺕﺍﻟﻤﺘﺸﺎﺒﻬﺔ )ﻓﻲﺃ ﻱ ﺼﻔﺔ(‬ ‫ﺇﺠﺭ‬
‫ﻗﻭﻟﺒﺔ‬ ‫‪Modeling‬‬
‫ﺍﻟ ﺏ ﺠﺎﻤﻌﺔ ﻭﻤﺘﺴﻠﺴﻠﺔ‪.‬‬ ‫ﻻﺴﺘﺨﻼ ﺹ ﻋﺩﺓ ﻗﻭ‬
‫ﻫﻭﺍﻟ ﺼﻨ ﻑﺍﻟﺫ ﻱ ﻻ ﻴﻤﺘﻠ ﻙ ﻤﺸﺘﻘﺎ ﺕ‬ ‫ﻭﺭﻗﺔ‬ ‫‪Page‬‬
‫ﻋﻼﻗﺔ ﺘﺭﺒ ﻁ ﺒﻴ ﻥﺍﻷ ﺼﻨﺎ ﻑ ﻭﻻ ﺘﻜﻭ ﻥ ﻤ ﺤﺩﺩﺓ ﻜﺎﻟﺘﺭﻜﻴ ﺏ‬
‫ﺍﻜﺔ‬‫‪ Association‬ﺍﻟﺸﺭ‬
‫‪aggregation.‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫ﺕ‪2 ......................................................................................................‬‬ ‫ﻟﻜﺎﺌﻨﺎ‬
‫ﻟ ﻰﺍ‬
‫ﻤﺩﺨ ل ﺇ‬

‫ﻟﻜﺎﺌﻥ‪2 ............................................................................................................ :‬‬


‫‪ 1‬ﻤﻔﻬﻭﻡﺍ‬

‫ﻟﻜﺒﺴﻠﺔ‪5 ........................................................................ : ENCAPSULATION‬‬


‫‪ 2‬ﻤﻔﻬﻭﻡﺍ‬

‫ﻟﻭﺭﺍﺜﺔ‪6 .............................................................................................. HERITAGE:‬‬


‫‪3‬ﺍ‬

‫ﻟﺒﻴﺎﻨﻴﺔ ‪7 .................................................. GRAPHIC OBJECTS‬‬ ‫ﻟﻜﺎﺌﻨﺎ ﺕﺍ‬


‫ﻟﻤﺜﺎ لﺍﻷﻭ ل‪:‬ﺍ‬‫‪3. 1.‬ﺍ‬
‫ﻟﺒﺔ ﺤﻅﻴ ﺭﺓﻟﻠﻌ ﺭﺒﺎ ﺕ‪11 .......................................................................‬‬ ‫ﻟﺜﺎﻨﻲ‪ :‬ﻗﻭ‬‫ﻟﻤﺜﺎ لﺍ‬
‫‪3. 2.‬ﺍ‬
‫ﻟﻤﺠ ﺭﺩﺓ‪13 ............................................................................ABSTRACT :‬‬ ‫‪3. 3.‬ﺍﻷ ﺼﻨﺎ ﻑﺍ‬
‫ﻟﻭﺭﺍﺜﺔ‪14 ................................................................... :‬‬ ‫ﻟﻤ ﺭﺘﺒﻁﺔ ﺒﺎﺴﺘﺨﺩﺍﻡﺍ‬ ‫ﻟ ﺼﻌﻭﺒﺎ ﺕﺍ‬‫‪3. 4.‬ﺍ‬
‫ﻠ ﺴﻞ ﻣﻜﺜ ﻒ ﺟﺪا‪14 .......................................................................................:‬‬‫‪3. 4. 01.‬ﺗ ﺴ‬
‫‪3. 4. 02.‬وراﺛ ﺔ اﻟﺘﺸﻴﻴﺪ‪15 .............................................. CONSTRUCTION INHERITANCE :‬‬
‫ﺎﺳﻘ ﺔ‪15 ............................ THE CONCEPTUAL INCOHERENCE :‬‬ ‫‪3. 4. 03.‬اﻟﺘ ﺼﻮرا ت اﻟﻐﻴﺮ ﻣﺘﻨ‬
‫ﻟﻤﺘﻌﺩﺩﺓ ‪16 ............................................... THE MULTIPLE INHERITANCE:‬‬ ‫ﻟﻭﺭﺍﺜﺔﺍ‬ ‫‪3. 5.‬ﺍ‬
‫ﻟﻭﺍﺠﻬﺎ ﺕ‪17 ............................................................................. THE INTERFACES :‬‬ ‫‪3. 6.‬ﺍ‬

‫ﻟﺘ ﺭﻜﻴﺏ ‪17 .................................................................................. AGGREGATION:‬‬


‫‪4‬ﺍ‬

‫‪4. 1.‬ﺘﻌ ﺭﻴ ﻑ‪17 ............................................................................................................ :‬‬


‫ﻟﻭﺍﺠﻬﺎ ﺕ‪18 ........................................................:‬‬ ‫ﻟﻤﺘﻌﺩﺩﺓﺃﻭﺍ‬ ‫ﻟﺘ ﺭﻜﻴﺏ ﻜﺘﻨﺎﻭﺏﻟﻠﻭﺭﺍﺜﺔﺍ‬ ‫‪4. 2.‬ﺍ‬

‫ﻟ ﺼﻔﺎ ﺕ ‪21 ..................................................................... POLYMORPHISME :‬‬


‫‪5‬ﺘﻌﺩﺩﺍ‬

‫‪5. 1.‬ﺘﻌ ﺭﻴ ﻑ‪21 ............................................................................................................ :‬‬


‫ﻟ ﺼﻔﺎ ﺕ‪21 .............................................................................................. :‬‬ ‫‪5. 2.‬ﻗﻭﺓﺘﻌﺩﺩﺍ‬
‫ﻟﺯﺍﺌﺩ ‪22 ........................................OVERLOADING‬‬ ‫ﻟﺘﺤﻤﻴ لﺍ‬ ‫ﻟ ﺼﻔﺎ ﺕ‪:‬ﺍ‬ ‫‪ 5. 3.‬ﺸﻜ ل ﻨﺎﺠﻊﻟﺘﻌﺩﺩﺍ‬

‫‪ 6‬ﻋﻼﻗﺔاﻟﺸﺮاﻛﺔ ‪22 .......................................THE RELATION OF ASSOCIATION :‬‬

‫ﻜﺎﺋﻦ‪25 ................................................................................................... :‬‬


‫‪7‬ﺧﺘﺎمﻧﻤﻮذجاﻟ‬

‫‪8‬ﻗﺎﻣﻮ ساﻟﻤﻔﺮدات‪27 ..................................................................................................... :‬‬

‫‪PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com‬‬


‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫رقٍّذ سبثمب فز‪٠‬ز‪ ٞ‬اٌدااس يد‪ِ ٟ‬مدمس ِقبٌغدخ اٌج‪١‬بٔدبد اٌغم‪٠‬مدخ اٌزد‪ ٟ‬رمد‪ َٛ‬ثئؽ‪ٙ‬دبس ٔزدبجظ اٌج‪١‬بٔدبد فٍد‪ ٝ‬اٌةبحدخ ؽ‪١‬دش وٕدذ‬
‫رسددزماَ عٍّددخ اٌغجبفددخ )( ‪ ، printf‬اٌّ‪ٛ‬عدد‪ ٛ‬ح يدد‪ ٟ‬اٌّىزجددخ ‪ٚ ، stdio.h‬رقٍّددذ أ‪٠‬ضددب و‪١‬ف‪١‬ددخ إ خددبي اٌج‪١‬بٔددبد ِددٓ اٌّسددزماَ‬
‫ثبسزمااَ اٌغٍّخ )( ‪ٚ scanf‬اٌّ‪ٛ‬ع‪ ٛ‬ح أ‪٠‬ضب ي‪ٔ ٟ‬فس اٌّىزجخ ‪ ،‬ؽ‪١‬ش وٕذ رسزماَ اٌقٕ‪ٛ‬اْ ٌزمدز‪ ٓ٠‬اٌم‪ّ١‬دخ اٌّاخٍدخ يد‪ ٟ‬اٌّز ‪١‬دم‬
‫اٌّما إ خبي ث‪١‬بٔبرٗ وّب ‪: ٍٟ٠‬‬
‫;‪int x‬‬
‫;)‪scanf ("% d" ,&x‬‬
‫ؽ‪١‬ش أْ ٘ذٖ اٌغًّ خبصخ ٌٍ خ اٌس‪ ، ٟ‬أِب ا‪ ْ٢‬يسٕزقٍُ و‪١‬ف ‪٠‬زُ إ خبي اٌج‪١‬بٔبد ي‪ ٌ ٟ‬خ اٌس‪ ٟ‬ثٍس ثٍس ‪.‬‬

‫جطضةػاضطبارةػ‪cout‬‬
‫رسددزماَ عٍّددخ اٌغجبفددخ ‪ cout‬إل خددبي اٌج‪١‬بٔددبد ِددٓ اٌّسددزماَ ‪ٚ ،‬رٍفددؼ سدد‪ ٟ‬ي‪ٚ‬د ؽ‪١‬ددش ‪ّ٠‬ىددٓ ثبسددزمااِ‪ٙ‬ب عجبفددخ اٌغّددً‬
‫اٌز‪ٛ‬ض‪١‬ؾ‪١‬خ ‪ٚ‬وذٌه و‪ ُ١‬اٌّز ‪١‬ماد ‪ٚ‬غ‪١‬م٘ب ‪ ،‬ؽ‪١‬ش رمزٍف ٘ذٖ اٌغٍّخ فٓ سبثمز‪ٙ‬ب )( ‪ printf‬ثإٔٔب ال ٔضـ ِقبًِ ٔ‪ٛ‬ؿ اٌج‪١‬بٔدبد‬
‫فٕا عجبفخ ل‪ّ١‬خ اٌّز ‪١‬ماد ‪ ٟ٘ٚ ، %d ….‬فٍ‪ ٝ‬اٌص‪ ١‬خ اٌزبٌ‪١‬خ ‪:‬‬
‫; "‪cout << "yousef anaya‬‬
‫٘ذا ي‪ ٟ‬ؽبي أس ٔب عجبفخ سٍسٍخ سِز‪٠‬خ أ‪ ٚ‬عًّ ر‪ٛ‬ض‪١‬ؾ‪١‬خ ‪ ،‬اِب ي‪ ٟ‬ؽبي اس ٔب عجبفخ ل‪ِ ُ١‬ز ‪١‬ماد ي‪ ٟٙ‬فٍ‪ ٝ‬اٌص‪ ١‬خ اٌزبٌ‪١‬خ ‪:‬‬
‫; ‪cout << x‬‬
‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس فٕاِب ٔم‪٠‬ا عجبفخ أ‪ ٞ‬عًّ ٔص‪١‬خ ا‪ ٚ‬عًّ ر‪ٛ‬ض‪١‬ؾ‪١‬خ ‪٠‬غت اْ ٔضـ ٘ذٖ اٌغًّ ث‪ ٓ١‬فالِز‪ ٟ‬اٌزٕصد‪١‬‬
‫اٌّز ‪ٚ‬عخ " " ‪ٚ ،‬وذٌه ‪٠‬ؾت اْ ٔزجـ ٔ‪ٙ‬ب‪٠‬خ اٌغٍّخ ثفبصٍخ ِٕم‪ٛ‬عٗ ‪ ،‬اِدب يد‪ ٟ‬عجبفدخ ِؾز‪٠ٛ‬دبد لد‪ ُ١‬اٌّز ‪١‬دماد ي‪١‬غدت اْ ٔضدـ‬
‫اسُ اٌّز ‪١‬م يمظ وّب رُ ر‪ٛ‬ضؾ‪ ٗ١‬سبثمب ‪ٚ ،‬وذٌه ِزج‪ٛ‬فب ثفبصٍخ ِٕم‪ٛ‬عٗ ‪ٌٍ ،‬ااٌخ فٍ‪ ٝ‬أز‪ٙ‬بء عٍّخ اٌغجبفخ ‪.‬‬
‫اِب ي‪ ٟ‬ؽبي اس ٔب عجبفخ فٕ‪ٛ‬اْ ِز ‪١‬م ِب ‪ ،‬أ‪ِٛ ٞ‬لـ ٘ذا اٌّز ‪١‬م اخً اٌذاومٖ ‪ ،‬يجبِىبٕٔب اْ ٔسزماَ ِقبًِ اٌقٕ‪ٛ‬اْ وّب ‪: ٍٟ٠‬‬
‫; ‪cout << &x‬‬
‫‪ٌٚ‬ىٓ ٌٕب سؤاي ٕ٘ب ‪ ٛ٘ٚ‬و‪١‬ف سٕم‪ َٛ‬ثغجبفدخ اوضدم ِدٓ عٍّدخ يد‪ٔ ٟ‬فدس اٌ‪ٛ‬لدذ ٘دً سدٕم‪ َٛ‬ثزىدماس وزبثدخ ٘دذٖ اٌغٍّدخ يد‪ ٟ‬عّ‪١‬دـ‬
‫اٌغًّ اٌّما عجبفز‪ٙ‬ب اَ اْ ٕ٘بن عم‪٠‬مخ اخم‪ٌ ٜ‬ذٌه ‪ ،‬فٕب ٔفىم ي‪ ٟ‬االِم ُِّّّّّّ ‪.‬‬
‫ٌما ‪ٚ‬يمد ٌٕب ٌ خ اٌس‪ ٟ‬ثٍس ثٍس اوضم ِم‪ ٗٔٚ‬ي‪ ٟ‬اسزماَ ٘ذٖ اٌغٍّخ ‪ ٟ٘ٚ‬ثبِىبٕٔب عجبفدخ اوضدم ِدٓ عٍّدخ ر‪ٛ‬ضد‪١‬ؾ‪١‬خ ثبسدزماَ‬
‫عٍّخ عجبفخ ‪ٚ‬اؽاٖ ‪ ٟ٘ٚ‬فٍ‪ ٝ‬اٌص‪ ١‬خ اٌزبٌ‪١‬خ ‪:‬‬
‫; "‪cout << "yousef" << "anaya‬‬
‫‪ِٚ‬ب اس‪٠‬اٖ ِٕه اْ رقٍّٗ فز‪٠‬ز‪ ٞ‬اٌااس ا‪٠‬ضدب ارغدبٖ ِقبِدً اال خدبي << ‪ ،‬ؽ‪١‬دش ثئِىبٕٔدب رىدماسٖ أوضدم ِدٓ ِدمٖ ثبسدزمااَ‬
‫عٍّخ عجبفخ ‪ٚ‬اؽاٖ ‪ٚ ،‬ثبِىبٕٔب ا‪٠‬ضب اْ ٔغّـ ِب ث‪ ٓ١‬اٌغًّ اٌز‪ٛ‬ض‪١‬ؾ‪١‬خ ا‪ ٚ‬اٌسالسً اٌمِز‪ٚ ٗ٠‬عجبفخ ِؾز‪٠ٛ‬بد اٌّز ‪١‬ماد يد‪ٟ‬‬
‫عٍّخ ‪ٚ‬اؽاٖ ا‪٠‬ضب وّب ‪: ٍٟ٠‬‬
‫;‪int x=5‬‬
‫; ‪cout << "yousef" << "anaya" << x‬‬

‫‪ٌٚ‬ىٓ ٕ٘ب سزؾاس ِةىٍٗ ‪ ٟ٘ٚ‬اْ ٔبرظ اٌغجبفخ س‪١‬ى‪ ْٛ‬وّب ‪: ٍٟ٠‬‬
‫‪yousefanaya5‬‬

‫أ‪ ٞ‬اْ ٔبرظ اٌغجبفخ س‪١‬ى‪ِ ْٛ‬زالصك ي‪ ٟ‬اٌغًّ اٌسبثمخ ‪ٚ‬ثبِىبٕٔب فالط اٌّةىٍٗ وّب ‪: ٍٟ٠‬‬
‫;‪cout << "yousef " << "anaya "<< x‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌاا اْ ِب لّٕب ثٗ ٘‪ ٛ‬اضبيخ ِسبيٗ يبسغخ ثقا وٍّخ ‪ٚ yousef‬وذٌه ِسبيٗ يبسغدخ ا‪٠‬ضدب ثقدا وٍّدخ ‪، anaya‬‬
‫ؽ‪١‬ش س‪١‬ى‪ٔ ْٛ‬برظ اٌغجبفخ فٍ‪ ٝ‬اٌةىً اٌزبٌ‪: ٟ‬‬
‫‪Yousef anaya 5‬‬
‫ؽ‪١‬ش اصجؾذ اٌغٍّخ اوضم ‪ٚ‬ض‪ٛ‬ؽب االْ ‪ٌٚ ،‬ىٓ ِبذا اذا اس ٔب عجبفخ اوضم ِٓ ِز ‪١‬دم ‪ٔٚ‬م‪٠‬دا اْ رىد‪ ْٛ‬ث‪ٕٙ١‬دب ِسدبيبد أ‪ٔ ٞ‬م‪٠‬دا‬
‫اْ ‪٠‬ى‪ ْٛ‬إٌبرظ ِضال وّب ‪: ٍٟ٠‬‬
‫………… ‪1 2 3 44‬‬
‫أ‪ِ ٞ‬سبيخ ث‪ ٓ١‬وً ل‪ّ١‬خ ِغج‪ٛ‬فخ فٍ‪ ٝ‬اٌةبحخ ‪ ،‬ؽ‪١‬ش سزى‪ ْٛ‬عٍّخ اٌغجبفخ وّب ‪: ٍٟ٠‬‬
‫; ‪cout << x << " " << y‬‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس إٔب لّٕدب ثبضدبيخ ِسدبيخ يبسغدخ ثد‪ ٓ١‬اٌّز ‪١‬دماْ ‪ٌٚ‬د‪ ٛ‬وبٔدذ ل‪ّ١‬دخ اٌّز ‪١‬دم ‪ٚ x=4‬ودذٌه اٌّز ‪١‬دم ‪y=5.8‬‬
‫يسى‪ٔ ْٛ‬برظ رٕف‪١‬ذ اٌغٍّخ اٌسبثمخ وّب ‪: ٍٟ٠‬‬
‫‪4 5.8‬‬
‫ؽ‪١‬ش اصجؼ اٌغٍّخ اوضم ‪ٚ‬ض‪ٛ‬ػ االْ ‪ٌٚ ،‬ىٓ ِبذا ٌ‪ ٛ‬اس ٔب عجبفخ عٍّخ ي‪ ٟ‬سغم‪ ٓ٠‬فٍ‪ ٝ‬اٌةبحخ ا‪ ٞ‬إٔب ٔم‪٠‬ا اْ ٔغجـ اٌغٍّدخ‬
‫‪ yousef anaya‬وً ِٕ‪ٙ‬ب فٍ‪ ٝ‬سغم عا‪٠‬ا ٘ىذا ‪:‬‬
‫‪yousef‬‬
‫‪anaya‬‬
‫ً٘ سٕم‪ َٛ‬ثبسزمااَ اوضم ِٓ عٍّخ عجبفخ أ‪ ٞ‬وّب ‪: ٍٟ٠‬‬
‫;"‪cout << "yousef‬‬
‫;"‪cout << "anaya‬‬

‫‪ٌٚ‬ىٓ ٕ٘ب إٌز‪١‬غخ سزى‪ ْٛ‬وال اٌىٍّز‪ ٓ١‬فٍ‪ٔ ٝ‬فس اٌسغم ‪ٚ‬ال ‪ٛ٠‬عا ث‪ّٕٙ١‬ب ِسبيخ وّب ‪: ٍٟ٠‬‬
‫‪yousefanaya‬‬

‫‪ِٚ‬ب اس‪٠‬ان اْ رقٍّٗ فز‪٠‬ز‪ ٞ‬اٌااس ٕ٘ب فٕا عجبفخ أ‪ ٞ‬عٍّخ فٍ‪ ٝ‬اٌةبحخ ‪٠ ،‬ى‪ِ ْٛ‬ؤحم اٌغجبفخ اجّب فٍ‪ ٝ‬اؽااص‪١‬بد إٌمغٗ‬
‫‪ ، 1,1‬فٕا ا‪ٚ‬ي فٍّ‪١‬خ عجبفخ فٍ‪ ٝ‬اٌةبحخ ‪ ،‬ؽ‪١‬ش اْ اٌةبحدخ ِمسدّخ اٌد‪ ٝ‬فداح صدف‪ٚ ٛ‬افّداٖ ال افد‪ٌٍ ٟ‬مد‪ٛ‬ف يد‪ ٟ‬ذٌده‬
‫ؽبٌ‪١‬خ ‪ِٚ ،‬ب اس‪٠‬ان اْ رقٍّٗ اْ عٍّخ اٌغجبفخ رٕمً ٘ذا اٌّؤحم اٌ‪ِ ٝ‬ب ثقا اخم ؽم رُ عجبفزٗ ‪٘ٚ‬ذا ٘د‪ ٛ‬سدجت ؽ‪ٙ‬د‪ٛ‬س ودال‬
‫اٌغٍّز‪ ٓ١‬فٍ‪ٔ ٝ‬فس اٌسغم ‪ٚ‬وذٌه ال ‪ٛ٠‬عا ث‪ٕٙ١‬ب أ‪ِ ٞ‬سبيخ الْ اٌغًّ ال‪ٛ٠‬عا ي‪ٙ١‬دب ِسدبيٗ ا‪٠‬ضدب ‪ٚ ،‬لدا ‪ٚ‬يدمد ٌٕدب اٌٍ دٗ ِقبِدً‬
‫ٌٍزؾىُ ي‪ِ ٟ‬ؤحم اٌىزبثٗ فٍ‪ ٝ‬اٌةبحٗ ‪ ٛ٘ٚ‬اٌّقبًِ "‪ "\n‬ؽ‪١‬ش ‪٠‬م‪٘ َٛ‬ذا اٌّقبًِ ثٕمً ِؤحم اٌغجبفخ اٌ‪ ٝ‬ا‪ٚ‬ي سدغم عا‪٠‬دا ثقدا‬
‫اٌزٕف‪١‬ذ ‪ ،‬يجبِىبٕٔب عجبفخ اٌغٍّخ اٌسبثمخ وّب ‪: ٍٟ٠‬‬
‫;"‪cout << "yousef \n anaya‬‬
‫ؽ‪١‬ش سى‪ٔ ْٛ‬برظ اٌزٕف‪١‬ذ ٕ٘ب وً ِٓ اٌغٍّز‪ ٓ١‬فٍ‪ ٝ‬سغم وّب ‪: ٍٟ٠‬‬
‫‪yousef‬‬
‫‪anaya‬‬
‫‪ٕ٘ٚ‬ب اٌّسبيخ ث‪ٕٙ١‬ب غ‪١‬م ِ‪ ّٗٙ‬الْ إٌبرظ س‪١‬ى‪ ْٛ‬فٍ‪ ٝ‬سغم‪ ٓ٠‬ؽ‪١‬ش ثبِىبٔه وزبثز‪ٙ‬ب وّب ‪: ٍٟ٠‬‬
‫;"‪cout << "yousef\nanaya‬‬
‫‪ٌٚ‬ىٓ ‪٠‬سزؾسٓ اْ رى‪ ْٛ‬اٌّسبيخ ِ‪ٛ‬ع‪ٚ ٖ ٛ‬ذٌه ٌ‪ٛ‬ض‪ٛ‬ػ اٌغٍّخ فٕا لماجز‪ٙ‬ب ‪.‬‬
‫‪ِٚ‬ب اس‪٠‬ه اْ رقٍّٗ ا‪٠‬ضب اْ ٕ٘بن ِقبِال اخم ٌٕمً ِؤحم اٌغجبفخ اٌ‪ ٝ‬سغم عا‪٠‬ا ‪٘ٚ‬د‪٘ٚ endl ٛ‬د‪ ٟ‬اخزصدبس اٌد‪end line ٝ‬‬
‫‪ٚ‬رقٕ‪ ٟ‬سغم عا‪٠‬ا ‪ ،‬ؽ‪١‬ش ‪ّ٠‬ىٓ اسزماِ‪ٙ‬ب وّب ‪: ٍٟ٠‬‬
‫;"‪cout << "yousef"<<endl << "anaya‬‬
‫‪ِٚ‬ب اس‪٠‬ان اْ رقٍّخ ا‪٠‬ضب اْ ٘ذٖ اٌغٍّخ ربثقخ ٌٍّىزجخ ‪ ٟ٘ٚ iostream.h‬اخزصبس اٌ‪input output stream ٝ‬‬
‫ؽ‪١‬ش اْ ‪ stream‬رقٕ‪ٕ٘ ٟ‬ب رايك ‪ٚ‬رصجؼ عٍّخ وبٍِخ رايك اال خبي ‪ٚ‬االخماط ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػادطكػرضىػاضذاذةػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;"‪cout << "yousef anaya‬‬
‫‪6.‬‬ ‫;) ( ‪getch‬‬
‫‪7.‬‬ ‫}‬
‫ػ‬
‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػادطكػسيػدطرغنػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;"‪cout << "yousef \n anaya‬‬
‫‪6.‬‬ ‫;) ( ‪getch‬‬
‫‪7.‬‬ ‫}‬
‫ػ‬
‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػاالردادػاضصحغحةػطنػ‪-1‬ػ‪11‬ػصلػرشمػرضىػدطرػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫)‪for (int i=1;i<=10;i++‬‬
‫‪6.‬‬ ‫;"‪cout << i << "\n‬‬
‫‪7.‬‬ ‫;) ( ‪getch‬‬
‫‪8.‬‬ ‫}‬

‫‪ٚ‬ثبِىبٔه ا‪٠‬ضب اسزجااي عٍّخ اٌغجبفخ وّب ‪: ٍٟ٠‬‬


‫;‪cout << i << endl‬‬

‫ٍيخص ‪ :‬ال رْغ‪ ٚ‬اُ رضـ اىفبصيخ اىَْق٘عٔ ثقذ أ‪ ٛ‬جَيخ عجبفخ ‪ٗ ،‬مزىل ا‪ٝ‬ضب إُ ٍقبٍو جَيخ اىغجبفةخ ٕة٘ ارةبسح االمجةش‬
‫اىَضدٗجٔ فال رخغئ ف‪ٖٞ‬ب ‪.‬‬
‫ٍٗب اس‪ٝ‬ذٓ ٍْل فض‪ٝ‬ض‪ ٛ‬اىذاسط ٕٗ‪ ٍِ ٜ‬االٍ٘س اىََٖٔ جذا اىزشر‪ٞ‬ت فْذ مزبثخ أ‪ ٛ‬م٘د ثشٍجة‪ ٜ‬الظةؼ جَ‪ٞ‬ةـ االمة٘د اىغةبثقخ‬
‫ظ‪ٞ‬ث فْذ ٗضـ ظبصشٓ اىجذا‪ٝ‬خ ٗمزىل اىْٖب‪ٝ‬خ فٖ‪ ٜ‬في‪ ٚ‬اعزقبٍٔ ٗاظذٓ أ‪ ٛ‬اّْةب ثقةذٕب اثقةذّب ٍغةبفخ ٕٗة‪ tab ٜ‬فية‪ ٚ‬ى٘ظةخ‬
‫اىَفبر‪ٞ‬ح ‪ٗ ،‬مزىل فْذ اعزخذاً أ‪ ٛ‬جَيخ مبىذٗساُ ٍثال فَب اس‪ٝ‬ةذٓ ٍْةل اُ رضةـ اىجَةو اىزبثقةٔ ىٖةب ا‪ٝ‬ضةب فية‪ٍ ٚ‬غةبفخ ‪tab‬‬
‫ىن‪ٝ ٜ‬نُ٘ رشر‪ٞ‬ت رزبثـ اىجَو ٗاضح ‪.‬‬
‫اٍب اىَنزجخ ‪ ٗ conio.h‬اىذاىخ )( ‪ getch‬ع‪ٞ‬زٌ رشظٖب الظقب ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫جطضةػاالدخالػ‪ cin‬ػ‬
‫رسزماَ عٍّخ اال خبي ‪ cin‬ال خبي اٌج‪١‬بٔبد ِٓ اٌّسزماَ ‪ٚ ،‬رٍفؼ س‪ ٟ‬إْ ؽ‪١‬ش ‪ّ٠‬ىٓ ثبسدزمااَ ٘دذٖ اٌغٍّدخ ا خدبي اٌسالسدً‬
‫اٌمِز‪ٚ ٗ٠‬وذٌه ا خبي ل‪ ُ١‬اٌّز ‪١‬ماد ‪ ٟ٘ٚ‬ربثقخ ٌٍّىزجخ ‪ٚ iostream.h‬ربخذ اٌةىً اٌزبٌ‪: ٟ‬‬
‫>> ‪cin‬‬
‫الؽددؼ فز‪٠‬ددز‪ ٞ‬اٌدداسا اْ حددىً ِقبِددً اال خددبي ٘دد‪ِ ٛ‬قبِددً احددبسح االص د م اٌّز ‪ٚ‬عددٗ ‪ ،‬ؽ‪١‬ددش ثبِىبٔدده ثقدداٖ وزبثددخ اسددّبء‬
‫اٌّز ‪١‬ماد اٌز‪ ٟ‬رم‪٠‬ا ا خبٌ‪ٙ‬ب ِٓ اٌّسزماَ ‪ ،‬أ‪ ٞ‬وّب ‪: ٍٟ٠‬‬
‫; ‪int x‬‬
‫; ‪cin >> x‬‬
‫‪ِٚ‬ب اس‪٠‬ان اْ رقٍّٗ ا‪٠‬ضب أٗ ثبِىبٔه ا خبي ل‪ ُ١‬الوضم ِٓ ِز ‪١‬م ثٕفس اٌص‪ ١‬خ وّب ‪: ٍٟ٠‬‬
‫; ‪cin >> x >> y‬‬
‫طثالػاصتبػبرظاطجػالدخالػاضرشمػاضعدديػاضصحغحػ‪5‬ػػ‪،‬ػثمػشمػبطبارتهػرضىػاضذاذةػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;‪int x‬‬
‫‪6.‬‬ ‫;‪cin >> x‬‬
‫‪7.‬‬ ‫;‪cout << x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌدااس اْ ٘دذا اٌجمٔدبِظ لدبَ ثؾدً اٌّسدبٌخ ‪٘ٚ‬دذا ٘د‪ ٛ‬اٌّغٍد‪ٛ‬ة يد‪ ٟ‬اٌسدؤاي ‪ٌٚ‬ىدٓ ٘دذا اٌجمٔدبِظ ثؾبعدٗ ٌدجق‬
‫اٌزقا‪٠‬الد ٌ‪١‬صجؼ اوضدم ؽ‪٠ٛ١‬دٗ ‪ ،‬ؽ‪١‬دش أدٗ ال ‪٠‬ؾزد‪ ٞٛ‬فٍد‪ ٝ‬أ‪ ٞ‬عٍّدخ ر‪ٛ‬ضد‪١‬ؾ‪١‬خ ‪ ،‬أ‪ ٞ‬اْ فٕدا رةد ‪ ٍٗ١‬ال ٔقٍدُ ِدب ٘د‪ ٛ‬اٌّغٍد‪ٛ‬ة‬
‫ثبٌضجظ ‪ ،‬يال رم‪ٛ‬ي ٌ‪ ٟ‬ثبٔ‪ ِٓ ٟ‬وزت اٌسؤاي ‪ٚ‬افٍُ ِب ‪٠‬م‪٠‬ا ‪٘ ،‬ذا ِٓ ‪ٚ‬ع‪ٙ‬خ ٔؾمن أذ ‪ٌٚ‬ىٓ ٌ‪ ٛ‬لبَ أ‪ ٞ‬حم اخم ثبسزماِٗ‬
‫ال ‪٠‬قٍُ ِب ٘‪ ٛ‬اٌّغٍ‪ٛ‬ة ‪٘ٚ‬ذا ِب اس‪٠‬اٖ اْ ‪٠‬ى‪ ْٛ‬ساسمب ي‪ٔ ٟ‬فسه فٕا وزبثخ أ‪ ٞ‬ثمٔبِظ ا‪ِ ٚ‬مغـ ثمِغ‪ ٟ‬اْ ال رٕؾم ٌالِ‪ٛ‬س ِٓ‬
‫زا‪٠ٚ‬زه أذ ‪ٚ‬رذوم اجّب اْ االٔسبْ ‪ٕ٠‬س‪ٚ ٝ‬ال ‪٠‬زذوم ِدـ ِدم‪ٚ‬س اٌدزِٓ ‪ ،‬يّدب رزدذومٖ االْ سزٕسدبٖ ثقدا يزدمٖ ٌدذٌه اوزدت عّدً‬
‫ر‪ٛ‬ض‪١‬ؾ‪١‬خ ٌزى‪ٚ ْٛ‬اضؾٗ ٌه ‪١ ٌٚ‬من ‪ ،‬ؽ‪١‬ش ‪٠‬صجؼ اٌّمغـ اٌجمِغ‪ ٟ‬وّب ‪: ٍٟ٠‬‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;‪int x‬‬
‫‪6.‬‬ ‫" ‪cout << "Enter your Integer number :‬‬
‫‪7.‬‬ ‫;‪cin >> x‬‬
‫‪8.‬‬ ‫" ‪cout << "Enterane number is :‬‬
‫‪9.‬‬ ‫;‪cout << x‬‬
‫‪10.‬‬ ‫;) ( ‪getch‬‬
‫‪11.‬‬ ‫}‬

‫٘ىذا اٌصجؼ إٌزبط اوضم ‪ٚ‬ض‪ٛ‬ػ فٓ سبثمٗ ٌه ‪١ ٌٚ‬من ‪.‬‬ ‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ا‪ ٚ‬لد‪ ُ١‬اٌّز ‪١‬دماد فٍد‪ٝ‬‬ ‫ٕ٘بن اٌقا‪٠‬ا ِٓ اٌا‪ٚ‬اي اٌّ‪ٛ‬ع‪ ٖ ٛ‬اخً ِىزجدبد يد‪ ٌ ٟ‬دخ اٌسد‪ٌٍ ٟ‬زقبِدً ِدـ ا خدبي ا‪ ٚ‬اخدماط اٌؾدم‪ٚ‬‬
‫حبحخ اٌّسزماَ ‪ِٕٙٚ ،‬ب ‪:‬‬
‫اضداضةػ) ( ‪gets‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪puts‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪getch‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪putch‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪getche‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪ getchar‬ػ‪ :‬ػ‬
‫اضداضةػ) ( ‪putchar‬ػ‪:‬ػ ػ‬
‫ػ‬

‫اضداضةػ) ( ‪ getch‬ػ‬
‫ؽ‪١‬ش رم‪٘ َٛ‬ذٖ اٌااٌٗ ثب خبي ؽم ‪ٚ‬اؽا ِٓ اٌّسزماَ ‪ٌٚ‬ىٓ ‪ ْٚ‬ؽ‪ٛٙ‬سٖ فٍ‪ ٝ‬اٌةبحدخ ‪ ،‬ؽ‪١‬دش اْ ٘دذٖ اٌااٌدخ ال ربخدذ أ‪ ٞ‬ل‪ّ١‬دٗ‬
‫وّقبًِ س‪١‬زُ حمػ اٌا‪ٚ‬اي الؽمب ‪ٚ ،‬اْ اٌم‪ ّٗ١‬اٌّمعقٗ ٌ‪ٙ‬ب ٘‪ ِٓ ٟ‬إٌ‪ٛ‬ؿ اٌقا ‪ ٞ‬اٌصؾ‪١‬ؼ ‪ int‬أ‪ ٞ‬اْ ٘ذٖ اٌااٌخ رم‪ َٛ‬ثب خبي‬
‫ؽم ا‪ ٚ‬سلُ ا‪ ٚ‬أ‪ ٞ‬سِز خبص ‪ٚ‬اؽا يمدظ ‪ِ ،‬دٓ اٌّسدزماَ ‪ٚ‬رمد‪ َٛ‬ثبسعدبؿ ِقبِدً ٘دذا اٌمِدز اٌدذ‪ ٞ‬ردُ ا خبٌدٗ ثبالسدى‪ ٟ‬ود‪ٛ‬‬
‫ساعـ اٌٍّؾك أ ‪ ،‬ؽ‪١‬دش ثبِىبٔده االؽزفدب ػ ث‪ٙ‬دذٖ اٌم‪ّ١‬دٗ يد‪ِ ٟ‬ز ‪١‬دم ِدٓ ٔد‪ٛ‬ؿ فدا ‪ ٞ‬صدؾ‪١‬ؼ ‪٘ٚ ،‬دذٖ اٌااٌدخ ٘د‪ ٟ‬اخزصدبس اٌد‪ٝ‬‬
‫اٌغٍّخ ‪ٚ get character‬رقٕ‪ ٟ‬اٌؾص‪ٛ‬ي فٍ‪ ٝ‬ؽم ‪ِٛ ٟ٘ٚ‬ع‪ ٖ ٛ‬اخً اٌّىزجخ ‪ conio.h‬ؽ‪١‬دش ‪٠‬غدت رضدّ‪ٕٙ١‬ب يد‪ ٟ‬اٌّمغدـ‬
‫اٌجمِغ‪ ٟ‬فٓ اسزافبج‪ٙ‬ب ‪.‬‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرطزػطنػاضطدتخدمػثمػاطبدػطعاطضهػباالدصيػ‪ .‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ػ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬ ‫ػ‬
‫‪4.‬‬ ‫{‬ ‫ػ‬
‫‪5.‬‬
‫ػ‬
‫‪6.‬‬ ‫" ‪cout << "Enter your code :‬‬
‫‪7.‬‬ ‫;) ( ‪int x = getch‬‬ ‫ػ‬
‫‪8.‬‬ ‫; ‪cout << "value in ascii : " << x‬‬ ‫ػ‬
‫‪9.‬‬ ‫;) ( ‪getch‬‬
‫‪10.‬‬ ‫}‬ ‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس فٕا اٌض ظ فٍ‪ ٝ‬أ‪ ٞ‬زس ِٓ ازساس ٌ‪ٛ‬ؽخ اٌّفبر‪١‬ؼ زس ‪ٚ‬اؽدا يمدظ سد‪١‬ؾ‪ٙ‬م سلدُ فٍد‪ ٝ‬اٌةبحدخ ‪٘ٚ ،‬دذا‬
‫٘‪ ٛ‬اٌم‪ ّٗ١‬اٌّىبيئخ ٌٍزس اٌّض ‪ٛ‬ط ثبالسى‪ ٟ‬و‪ِٚ ، ٛ‬ب اس‪٠‬اٖ ِٕه اْ رقٍّٗ ا‪٠‬ضب ثقا ؽ‪ٛٙ‬س اٌم‪ ّٗ١‬فٍ‪ ٝ‬اٌةبحخ ‪ٔ ٛ٘ٚ‬برظ رٕف‪١‬دذ‬
‫اٌغٍّخ سلُ ‪ 8‬ي‪ ٟ‬اٌّمغـ اٌجمِغ‪٠ ، ٟ‬زُ االٔزمبي ٌزٕف‪١‬ذ اٌمغ‪ ٖٛ‬سلُ ‪ 9‬أ‪ ٞ‬اْ اٌجمٔبِظ ‪ٕ٠‬زؾم ا خبي ؽدم اخدم ‪ٚ‬فٕدا اٌضد ظ‬
‫فٍ‪ ٝ‬أ‪ ٞ‬زس ِٓ ازساس ٌ‪ٛ‬ؽخ اٌّفبر‪١‬ؼ ‪٠‬زُ اٌمم‪ٚ‬ط ِٓ اٌجٕبِظ الٔٗ ال ‪ٛ٠‬عا خغ‪ٛ‬اد رٕفذ ثقا اٌمغد‪ِٚ ، 9 ٖٛ‬دٓ االِد‪ٛ‬س اٌّ‪ّٙ‬دٗ‬
‫اٌز‪٠ ٟ‬غت اْ رقٍّ‪ٙ‬ب اْ ٘ذٖ اٌااٌخ ٌ‪١‬سذ اٌٗ رضج‪١‬ذ اٌّممعدبد فٍد‪ ٝ‬اٌةبحدخ ‪ٌٚ ،‬ىدٓ ٔسدزماِ‪ٙ‬ب ِغدبزا يبؽبعدخ اَ االخزدماؿ ‪،‬‬
‫‪ٕ٘ٚ‬بن اٌخ ل‪١‬بس‪١‬خ رسزماَ ٌ‪ٙ‬ذا اٌ مف س‪١‬زُ حمؽ‪ٙ‬ب الؽمب ‪.‬‬
‫‪ٚ‬ثبِىبٔه ا‪٠‬ضب اْ رم‪ َٛ‬ثبسدزمااَ اٌغم‪٠‬مدخ اٌسدبثمخ ال خدبي أ‪ ٞ‬سِدز ‪ٚ‬اؽ‪ٙ‬دبسٖ ومِدز أ‪ ٞ‬إٔدب ال ٔم‪٠‬دا اْ ٔمد‪ َٛ‬ثغجبفدخ ِقبٍِدٗ‬
‫ثبالسى‪ ٟ‬و‪ ، ٛ‬يّب فٍ‪١‬ه يقٍٗ ٕ٘ب ٘‪ ٛ‬رقم‪٠‬ف اٌّز ‪١‬م اٌذ‪ ٞ‬رم‪٠‬ا اْ رؾزفؼ ثبٌم‪ ّٗ١‬اٌّمعقٗ ي‪ ِٓ ٗ١‬إٌ‪ٛ‬ؿ اٌؾمي‪ ٟ‬وّب ‪: ٍٟ٠‬‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ػ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫ػ‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬ ‫ػ‬
‫‪5.‬‬ ‫" ‪cout << "Enter your code :‬‬ ‫ػ‬
‫‪6.‬‬ ‫;) ( ‪char x = getch‬‬
‫‪7.‬‬ ‫; ‪cout << "value in ascii : " << x‬‬ ‫ػ‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬ ‫ػ‬
‫‪9.‬‬ ‫}‬
‫ػ‬
‫ػ‬
‫اٌّاخً ومِز ‪١ٌٚ‬س لم‪ّ١‬خ ِىبيئخ ثٕؾبَ االسى‪. ٟ‬‬ ‫ؽ‪١‬ش ٕ٘ب س‪١‬زُ عجبفخ ل‪ّ١‬خ اٌؾم‬

‫‪ ِٓٚ‬االسزمااِبد اٌّّ‪١‬زٖ ٌ‪ٙ‬ذٖ اٌااٌخ ٘‪ ٛ‬اسزمااِ‪ٙ‬ب ي‪ ٟ‬ثماِظ وٍّبد اٌّم‪ٚ‬س ال خبي سلُ سم‪ ِٓ ٞ‬اٌّسزماَ ‪.‬‬

‫اصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرشمػدريػطنػاضطدتخدمػبطولػ‪5‬ػحروفػثمػاطبعكاػرضىػاضذاذةػ‪ .‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫ػ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫ػ‪3.‬‬ ‫) ( ‪void main‬‬
‫ػ‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;]‪char password [5‬‬
‫ػ‪6.‬‬ ‫;" ‪cout << "Enter your password of five character :‬‬
‫ػ‪7.‬‬ ‫)‪for (int i=0;i<5;i++‬‬
‫‪8.‬‬ ‫;) ( ‪password [i]= getch‬‬
‫ػ‬
‫‪9.‬‬ ‫;" ‪cout << endl << "your password is :‬‬
‫ػ‬
‫‪10.‬‬ ‫)‪for (int i=0;i<5;i++‬‬
‫‪11.‬‬
‫ػ‬ ‫;]‪cout << password[i‬‬
‫‪12.‬‬ ‫;) ( ‪getch‬‬
‫ػ‬
‫‪13.‬‬ ‫}‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌاسا ثسبعخ اٌى‪ ٛ‬اٌجمِغ‪ ٟ‬ي‪ٙ‬ذا ِب وٕذ رةب٘اٖ فٕاِب رضـ سلُ سم‪ ٞ‬ال‪ ٞ‬ع‪ٙ‬بز ا‪ ٚ‬ثمٔبِظ ‪ٚ ،‬لا ودبْ ِدٓ‬
‫اٌّفزمف اْ اضقٗ ٌىُ وزاس‪٠‬ت ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اضدضةػ) ( ‪putch‬‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اضدضةػ) ( ‪getchar‬‬
‫رزةبثٗ ٘ذٖ اٌااٌخ اٌ‪ ٝ‬ؽا وج‪١‬م ِـ اٌااٌخ اٌسبثمخ ‪ ،‬ي‪ ٟٙ‬ال ربخدذ أ‪ ٞ‬ل‪ّ١‬دخ ِّدمٖ ‪ٚ ،‬ودذٌه رق‪١‬دا ل‪ّ١‬دٗ ِدٓ إٌد‪ٛ‬ؿ اٌقدا ‪ ٞ‬اٌصدؾ‪١‬ؼ‬
‫ال‪ ٞ‬سِز رُ ا خبٌٗ ‪ ،‬ؽ‪١‬ش رسزماَ ٘ذٖ اٌااٌخ ال خبي ؽم ‪ٚ‬اؽا ِٓ اٌّسزماَ ‪ٌٚ‬ىٓ ٕ٘ب اٌؾم اٌّاخً ‪٠‬ؾ‪ٙ‬م فٍ‪ ٝ‬اٌةبحخ ‪،‬‬
‫‪ٚ‬وذٌه ثبِىبٔه ا خبي فا وج‪١‬م ِٓ اٌؾم‪ ٚ‬فٍ‪ ٝ‬اٌةبحخ ‪ٌٚ‬ىٓ ِدب ‪٠‬دزُ رمز‪ٕ٠‬دٗ ٘د‪ ٛ‬ا‪ٚ‬ي ؽدم ِداخً أ‪ ٞ‬أدٗ ثبِىدبْ ا خدبي‬
‫سٍسٍٗ سِز‪ ٗ٠‬يزؾ‪ٙ‬م عّ‪١‬ق‪ٙ‬ب فٍ‪ ٝ‬اٌةبحخ ‪ِٚ‬ب ‪٠‬زُ االؽزفبػ ثٗ ٘‪ ٛ‬ا‪ٚ‬ي سِز يمظ ثقا اٌض ظ فٍد‪ ٝ‬سِدز اال خدبي ‪ enter‬ؽ‪١‬دش‬
‫ر‪ٛ‬عا ٘ذٖ اٌااٌخ اخً اٌّىزجخ ‪ stdio.h‬ي‪١‬غت رضّ‪ٕٙ١‬ب لجً اسزافبج‪ٙ‬ب ‪.‬‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػادطكػبادتخدامػعذهػاضداضةػثمػاطبدػطعاطلػاوػحرفػضهػباالدصي ػ‬
‫ػ‬
‫ػ ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫ػ‬
‫‪3.‬‬ ‫>‪#include <stdio.h‬‬ ‫ػ‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬ ‫ػ‬
‫‪6.‬‬ ‫;" ‪cout << "Enter your name :‬‬ ‫ػ‬
‫‪7.‬‬ ‫;) ( ‪char x= getchar‬‬ ‫ػ‬
‫‪8.‬‬ ‫;‪cout << "your first character in your name is : " << x‬‬
‫‪9.‬‬ ‫;) ( ‪getch‬‬ ‫ػ‬
‫‪10.‬‬ ‫}‬ ‫ػ‬
‫ػ‬
‫ِدٓ‬ ‫ؽ‪١‬ش ٕ٘ب س‪١‬زُ ا خبي االسُ وبًِ ِـ ؽ‪ٛٙ‬سٖ فٍ‪ ٝ‬اٌةبحخ ‪ٚ‬ثقا اٌض ظ فٍ‪ ٝ‬زس اال خدبي ‪ enter‬سد‪١‬زُ عجبفدخ ا‪ٚ‬ي ؽدم‬
‫اسّه ‪ٚ‬ثبِىبٔه ا‪٠‬ضب عجبفخ ِقبٍِٗ ثبالسى‪ٚ ٟ‬ذٌه ثزجا‪ ً٠‬إٌ‪ٛ‬ؿ اال‪ char ٌٟٚ‬اٌ‪. int ٝ‬‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اضداضةػ) ( ‪getche‬‬
‫رسزماَ ٘ذا ال خبي سِز ‪ٚ‬اؽا يمظ ِٓ اٌّسزماَ ‪ٚ ،‬ال ربخذ أ‪ ٞ‬ل‪ِّ ّٗ١‬مسٖ وّقبًِ ‪ٚ ،‬رق‪١‬ا ل‪ّ١‬خ ِٓ إٌد‪ٛ‬ؿ اٌقدا ‪ ٞ‬اٌصدؾ‪١‬ؼ‬
‫‪ٌٚ ، int‬ىٓ ِب ‪١ّ٠‬ز٘ب فٓ سبثمبر‪ٙ‬ب ِٓ اٌا‪ٚ‬اي ‪ ،‬اْ ٘ذٖ اٌااٌخ ثقا اٌضد ظ فٍد‪ ٝ‬أ‪ ٞ‬زس ِدٓ ٌ‪ٛ‬ؽدخ اٌّفدبر‪١‬ؼ ‪٠‬دزُ اؽ‪ٙ‬دبس اٌؾدم‬
‫ِجبحمٖ فٍ‪ ٝ‬اٌةبحخ ‪ِٛ ٟ٘ٚ ،‬ع‪ ٖ ٛ‬اخً اٌّىزجخ ‪. conio.h‬‬
‫ػ‬
‫ػ‬
‫طثالػاصتبػبضغةػاضديػالدخالػاضرشمػ‪5‬ػبادتخدامػعذهػاضداضةػثمػاطبدػطعاطضةػباالدصيػ‪ .‬ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;" ‪cout << "Enter your value :‬‬
‫‪6.‬‬ ‫;) ( ‪int x= getche‬‬
‫‪7.‬‬ ‫;‪cout << endl << "value Equivalent : " << x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫الظؼ فض‪ٝ‬ض‪ ٛ‬اىذاه اُ اىق‪َٞ‬خ اىز‪ ٜ‬ؽٖشد في‪ ٚ‬اىشبرخ ثقذ رْف‪ٞ‬ز ٕزا اىجشّبٍج ٕ‪ ٜٕٗ 53 ٜ‬اىق‪َٞ‬خ اىَنبفئخ ىشقٌ ‪ 5‬ثْؾبً‬
‫االعن‪ ٜ‬م٘د ‪.‬‬

‫تدرغبػ‪:‬ػػاصتبػبضغةػاضديػالدخالػاضرشمػ‪5‬ػبادتخدامػعذهػاضداضةػثمػاطبعهػصرشمػرضىػاضذاذةػػ‪ .‬ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اضداضةػ) ( ‪putchar‬‬
‫ؽ‪١‬ش رسزماَ ٘ذٖ اٌااٌخ ٌغجبفخ ؽم ‪ٚ‬اؽا يمظ فٍ‪ ٝ‬اٌةبحخ ‪ٚ ،‬وذٌه ربخذ ل‪ّ١‬خ ‪ٚ‬اؽاٖ يمظ وّقبًِ ِّمس ٌ‪ٙ‬ب ‪ ِٓ ٛ٘ٚ‬إٌ‪ٛ‬ؿ‬
‫اٌقا ‪ ٞ‬اٌصؾ‪١‬ؼ ‪ٚ ،‬ذٌه الؽ‪ٙ‬بسٖ فٍ‪ ٝ‬اٌةبحخ ؽ‪١‬ش ‪٠‬زُ رّم‪٠‬م اٌم‪ّ١‬خ اٌّىبيئخ ٌٍمِز ثبالسى‪ ٟ‬و‪ ٛ‬اٌ‪٘ ٝ‬ذٖ اٌااٌخ الؽ‪ٙ‬بسٖ فٍ‪ٝ‬‬
‫اٌةبحخ ‪ٚ‬وذٌه ا‪٠‬ضب رق‪١‬ا ٘ذٖ اٌااٌخ ل‪ّ١‬خ ِٓ إٌ‪ٛ‬ؿ اٌقا ‪ ٞ‬اٌصؾ‪١‬ؼ ‪ ٟ٘ٚ‬اٌ‪ّ١‬خ اٌّّمٖ ثبالسى‪ ، ٟ‬ؽ‪١‬ش ر‪ٛ‬عا ٘ذٖ اٌااٌخ ي‪ٟ‬‬
‫اٌّىزجخ ‪stdio.h‬‬
‫‪ ٟ٘ٚ‬فٍ‪ ٝ‬اٌص‪ ١‬خ اٌزبٌ‪١‬خ ‪:‬‬
‫)‪int putchar ( int x‬‬
‫ؽ‪ ٛ٘ : x ٟ‬ل‪ّ١‬خ اٌمِز اٌّما اؽ‪ٙ‬بسٖ فٍ‪ ٝ‬اٌةبحخ ثبالسى‪ ٟ‬و‪. ٛ‬‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالظكارػاضرطزػ(ػ‪a‬ػ)ػرضىىػاضذاذىةػبادىتخدامػعىذهػاضداضىةػثىمػاطبىدػاضقغطىةػ‬
‫اضطصاسئةػضهػباالدصيػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫) ( ‪void main‬‬
‫‪4.‬‬ ‫{‬
‫‪5.‬‬ ‫;) ‪int x= putchar ( 97‬‬
‫‪6.‬‬ ‫;‪cout << endl << "value Equivalent : " << x‬‬
‫‪7.‬‬ ‫;) ( ‪getch‬‬
‫‪8.‬‬ ‫}‬
‫‪9.‬‬

‫‪ a‬ي‪ٔ ٟ‬ؾبَ‬ ‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس لّٕب ثزّم‪٠‬م اٌملُ ‪ ِٓ ٛ٘ٚ 97‬إٌ‪ٛ‬ؿ اٌقا ‪ ٞ‬اٌصؾ‪١‬ؼ اٌ‪٘ ٝ‬ذٖ اٌااٌخ ‪٠ٚ‬ىبيئ اٌؾم‬
‫االسى‪ ٟ‬صُ اؽزفؾٕب ثبٌم‪ّ١‬خ اٌّمعقٗ ‪ 97 ٟ٘ٚ‬ثبٌّز م ‪. x‬‬
‫ثبالسى‪. ٟ‬‬ ‫ؽ‪١‬ش اْ اٌااٌخ )( ‪ putch‬سزم‪ َٛ‬ثبؽ‪ٙ‬بس اٌؾم ‪ a‬فٍ‪ ٝ‬اٌةبحخ عٍّخ اٌغجبفخ ‪ cout‬سزم‪ َٛ‬ثغجبفخ ل‪ّ١‬خ اٌؾم‬

‫تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػ‪،‬ػضتطوغرػبرظاطجػاضرشمػاضدريػاضدابقػ‪،‬ػبحغثػغظكرػظجطهػرظدػادخالػ‬
‫أيػرطزػطنػرطوزػاضبادوردػبادتخدامػاضداضةػ) ( ‪putchar‬ػ‪،‬ػثمػاطبدػاضرشمػاضدريػرضىػاضذاذةػ ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اضداضةػ) ( ‪ puts‬ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫طاػعيػاضداضهػ؟ ػ‬
‫اٌااٌٗ ٘‪ ٟ‬فجبسح فٓ ِمغـ ثمِغ‪ ٠ ٟ‬م‪ َٛ‬ثبعماء فٍّ‪١‬دٗ ا‪ِ ٚ‬غّ‪ٛ‬فدٗ ِدٓ اٌقٍّ‪١‬دبد سد‪ٛ‬اء فٍّ‪١‬دبد ا خدبي ا‪ ٚ‬اخدماط ا‪ٚ‬‬
‫فٍّ‪١‬بد ؽسبث‪١‬خ ا‪ِٕ ٚ‬غم‪ٚ ٗ١‬ربخذ ٘ذٖ اٌااٌٗ ِ‪ٛ‬لـ ِٓ اٌجمٔبِظ أ‪ ٞ‬رى‪ ْٛ‬عزء ِٕٗ ؽ‪١‬ش ‪ّ٠‬ىٕٕب اٌم‪ٛ‬ي ٕ٘دب اْ اٌجمٔدبِظ اٌّصدُّ‬
‫ثٍ خ اٌس‪ ٟ‬ثٍس ثٍس ٘‪ ٛ‬فجبسح فٓ ِغّ‪ٛ‬فخ ِٓ اٌا‪ٚ‬اي اٌز‪ ٟ‬رم‪ َٛ‬وً ِٕ‪ٙ‬ب ثب اء ‪ٚ‬س خبص ي‪ ٟ‬اٌجمٔبِظ ‪ ،‬ثؾ‪١‬ش رقًّ ِقب ي‪ٟ‬‬
‫ثمٔبِظ ِزىبًِ ‪ .‬صُ رٕز‪٘ ٟٙ‬ذٖ اٌااٌٗ ثقا أز‪ٙ‬بء فٍّ‪ٙ‬ب ‪ ،‬يبٌااٌٗ اٌمج‪١‬سٗ ‪ ٟ٘ main‬اٌٗ ا‪٠‬ضب رم‪ َٛ‬ثبٌقا‪٠‬ا ِٓ اٌقٍّ‪١‬بد ‪.‬‬

‫اعطغةػاضدوالػ‪ :‬ػ‬
‫ضضدوالػاعطغةػصبغرةػطظكاػ‪ :‬ػ‬
‫‪ .1‬رسبفأب فٍ‪ ٝ‬اخزصبس وزبثخ و‪ ٛ‬اٌجمٔبِظ اذ ‪٠‬ىزف‪ ٟ‬ثبسزافبء اٌااٌخ اٌّغٍ‪ٛ‬ثٗ ثذوم اسّ‪ٙ‬ب يمظ ٌزم‪ َٛ‬ثبٌقًّ اٌّغٍ‪ٛ‬ة ‪.‬‬
‫‪ .2‬رالي‪ ٟ‬فٍّ‪ ٗ١‬اٌزىماس ي‪ ٟ‬خغ‪ٛ‬اد اٌجمٔبِظ اٌذ‪٠ ٞ‬زغٍت فّال ع‪٠ٛ‬ال ‪ٚ‬حبلب ‪ ،‬يٍٕب اٌىٍّخ اٌّةد‪ٛٙ‬سٖ "وزج‪ٙ‬دب ِدمٖ ‪ٚ‬اؽداٖ‬
‫يمظ ‪ٚ‬اسزاف‪ٙ١‬ب ِز‪ ٝ‬رةبء" ‪.‬‬
‫‪ .3‬ر‪ٛ‬يم ٌٕب ِسبؽٗ وج‪١‬مٖ ِٓ اٌجمٔبِظ يزم‪ ٌٛ ً١‬إٔب ٔم‪ َٛ‬ثىزبثٗ ٘ذٖ اٌمغ‪ٛ‬اد اٌّ‪ٛ‬ع‪ ٖ ٛ‬اخً اٌااٌٗ ي‪ ٟ‬وً ِمٖ ٔؾزبع‪ٙ‬ب‬
‫ي‪ٙ‬ذا ‪٠‬ؤ ‪ ٞ‬اٌ‪ ٝ‬فجئ ‪ٚ‬ؽغُ وج‪١‬م ي‪ ٟ‬اٌذاومٖ ‪٘ٚ‬ذا ٌ‪١‬س ع‪١‬اا ‪.‬‬
‫‪ .4‬اخزصبس فٍّ‪ ٗ١‬اٌجمِغٗ ‪ٚ‬رٕف‪١‬ذ اٌجمٔبِظ ثبسمؿ ‪ٚ‬لذ ِّىٓ ‪.‬‬
‫‪ .5‬رس‪ ًٙ‬فٍ‪ ٕ١‬ب اٌىض‪١‬م ي‪ِ ٟ‬ماعقٗ ‪ٚ‬رصؾ‪١‬ؼ اٌى‪ٚ ٛ‬اٌزقا‪ ً٠‬فٍ‪ ، ٗ١‬أ‪٠ ٞ‬زُ رمسدُ اٌجمٔدبِظ فٍد‪ ٝ‬اعدزاء أ‪ ٞ‬فداٖ ‪ٚ‬اي ٌىدً‬
‫اٌٗ فٍّ‪ٙ‬ب اٌمبص ‪ٚ‬فٕا ‪ٚ‬ع‪ ٛ‬أ‪ ٞ‬خًٍ ٔم‪ٔ َٛ‬ذ٘ت اٌ‪ ٝ‬اٌااٌٗ اٌّقٕ‪ٔٚ ٗ١‬قبٌغٗ ثاال ِٓ اٌجؾش ثغّ‪١‬ـ و‪ ٛ‬اٌجمٔبِظ ِٓ‬
‫ا‪ ٌٗٚ‬ؽز‪ ٝ‬اخمٖ ِّب ‪ٚ‬يم فٍ‪ٕ١‬ب اٌ‪ٛ‬لذ ‪ٚ‬اٌغ‪ٙ‬ا ‪.‬‬

‫اظواعػاضدوالػسيػضغةػاضديػبضسػبضسػ‪ :‬ػ‬
‫رّم‪٠‬م ‪ٚ‬اسعبؿ ‪.‬‬ ‫ربخذ ل‪ٚ ُ١‬رمعـ ق‪َٔٞ‬‬ ‫‪.1‬‬
‫ثا‪ ْٚ‬رّم‪٠‬م ‪ٚ‬ثا‪ ْٚ‬اسعبؿ ‪.‬‬ ‫ال ربخذ ل‪ٚ ُ١‬ال رمعـ ق‪َٔٞ‬‬ ‫‪.2‬‬
‫رّم‪٠‬م ‪ٚ‬ثا‪ ْٚ‬اسعبؿ ‪.‬‬ ‫ربخذ ل‪ٚ ُ١‬ال رمعـ ق‪َٔٞ‬‬ ‫‪.3‬‬
‫ثا‪ ْٚ‬رّم‪٠‬م ‪ٚ‬ثا‪ ْٚ‬اسعبؿ ‪.‬‬ ‫ال ربخذ ل‪ٚ ُ١‬ال رمعـ ق‪َٔٞ‬‬ ‫‪.4‬‬

‫ٗرقغٌ ٕزٓ االّ٘اؿ اى‪ ٚ‬قغَ‪: ِٞ‬‬


‫‪ٚ .1‬اي ل‪١‬بس‪١‬خ ِ‪ٛ‬ع‪ ٖ ٛ‬اخً ِىزجبد اٌٍ خ ‪.‬‬
‫‪ٚ .2‬اي ‪٠‬م‪ َٛ‬اٌّجمِظ ثىزبثز‪ٙ‬ب ‪.‬‬

‫ؽ‪١‬دش ‪٠‬دزُ اسددزافبء اٌااٌدٗ ‪ٚ‬لددذ اٌؾبعدٗ ٌ‪ٙ‬دب ‪ٚ‬ذٌدده ثىزبثدخ اسددّ‪ٙ‬ب يد‪ ٟ‬اٌّىددبْ اٌّدما اسدزافبج‪ٙ‬ب ي‪١‬ددٗ ‪ٚ ،‬ثؾسدت ِددب ربخدذ ِددٓ‬
‫ِقبِالد ؽست إٌ‪ٛ‬ؿ ‪ٚ‬اٌقا ؽ‪١‬ش س‪١‬زُ حمػ ذٌه الؽمب ‪.‬‬

‫ٍالظؾٔ ٍَٖٔ ٍب ‪ٝ‬جت في‪ٞ‬ل اُ رقئَ ْٕب أّ ثبٍنبّْةب رَش‪ٝ‬ةش قة‪ ٌٞ‬مَةب رشةب ىيذاىةخ ‪ٗ ،‬ىنةِ ال ‪َٝ‬نةِ اُ ّق‪ٞ‬ةذ امثةش ٍةِ ق‪َٞ‬ةٔ‬
‫ٗاظذٓ ثشنو ٍجبرش‪.‬‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ػ‬
‫صغفغهػبظاءػاضداضةػ‪ :‬ػ‬
‫ا‪ٚ‬ال ‪٠‬غت اْ رقٍُ فز‪٠‬ز‪ ٞ‬اٌااس اْ ٌىً اٌٗ ح‪١‬ئب اصٕبْ ال صبٌش ٌ‪ّٙ‬ب ‪ٛٔ ٛ٘ٚ‬ؿ اٌم‪ ُ١‬اٌز‪ ٟ‬سزّمس ٌٍااٌٗ " أ‪ٔ ٞ‬مسدٍ‪ٙ‬ب‬
‫ٌ‪ٙ‬ب " ‪ٛٔٚ‬ؿ إٌبرظ اٌذ‪ ٞ‬سزم‪ َٛ‬اٌااٌٗ ثؾسبثٗ أ‪ ٞ‬اٌم‪ّ١‬خ اٌّمعقخ ‪ ،‬يقٕا ثٕبء أ‪ ٞ‬اٌٗ ِٓ اٌدا‪ٚ‬اي ‪٠‬غدت ا‪ٚ‬ال اْ ٔضدـ ٔد‪ٛ‬ؿ اٌم‪ّ١‬دٗ‬
‫اٌز‪ ٟ‬سزق‪١‬ا٘ب اٌااٌٗ ثقا أز‪ٙ‬بء فٍّ‪ٙ‬ب ِضً ‪ٚ int , float , char …void‬ا‪٘ ِٓ ٞ‬ذٖ االٔد‪ٛ‬اؿ ‪٠‬ىزدت ثاا‪٠‬دخ اٌسدغم اٌزد‪ ٟ‬رٕد‪ٞٛ‬‬
‫صدُ ٔضدـ ٔد‪ٛ‬ؿ اٌمد‪ ُ١‬اٌزد‪ٟ‬‬ ‫ثٕبء اٌااٌٗ فٍ‪ ٗ١‬صُ ٔم‪ َٛ‬ث‪ٛ‬ضـ أ‪ ٞ‬اسُ ٌٍااٌٗ ِٓ اعً رقم‪٠‬ف‪ٙ‬ب ٌٍجمٔبِظ صُ ٔضـ ل‪ ٛ‬سدبْ ٘الٌ‪١‬دبْ‬
‫سزّمس ٌ‪ٙ‬ذٖ اٌااٌٗ ِـ أ‪ِ ٞ‬ز ‪١‬م السزمجبي اٌم‪ ّٗ١‬اٌّّمسٖ ٌ‪ٙ‬ب ٌؾفؾ‪ٙ‬ب ي‪٠ٚ ٗ١‬ى‪ ْٛ‬حىٍ‪ٙ‬ب ٘ىذا ‪:‬‬

‫ثٌ ّبر‪ ٜ‬االُ ىجْب جغٌ اىذاىخ ٗ‪ٝ‬نُ٘ ثبىشنو اىزبى‪: ٜ‬‬

‫نوع القيمه المرجعه‬ ‫)……‪ , ………..,‬اسم المعامل الممر نوع المعامل ( اسم الداله ‪-‬‬

‫) ‪1. Type function_name ( Type parameter 1 , Type parameter 2 , ...‬‬


‫{ ‪2.‬‬
‫‪3.‬‬ ‫الجملة ; ‪……………………..‬‬
‫‪4.‬‬ ‫الجملة ; ‪……………………..‬‬
‫‪5.‬‬ ‫الجملة ; ‪……………………..‬‬
‫‪6.‬‬ ‫; ‪return value‬‬
‫} ‪7.‬‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس و‪١‬ف ‪٠‬ى‪ ْٛ‬عسُ اٌااٌخ ‪ ٛ٘ٚ‬اٌغًّ اٌز‪ ٟ‬رى‪ِ ْٛ‬ؾص‪ٛ‬سٖ اخً اٌؾ‪ٛ‬اصم } { صُ ‪٠‬غدت اْ ‪٠‬زجدـ‬
‫ٔ‪ٙ‬ب‪ ٗ٠‬اٌغٍّٗ اخً عسُ اٌااٌٗ اٌفبصدٍٗ إٌّم‪ٛ‬عدٗ ‪٠ٚ‬غدت اْ ٕٔزجدٗ ع‪١‬داا اْ اٌغّدً اٌزد‪ ٟ‬ال رزجدـ ثفبصدٍٗ ِٕم‪ٛ‬عدٗ رٕغجدك ا‪٠‬ضدب‬
‫اخً اٌااٌٗ ِضً عًّ اٌا‪ٚ‬ساْ ‪ٚ ... wihle ٚ for‬وذٌه عٍّدخ اٌةدمط ‪ ، if‬أ‪ ٞ‬اْ اٌةدم‪ٚ‬ط اٌّزجقدٗ اخدً اٌااٌدٗ اٌمج‪١‬سد‪٘ ٗ١‬د‪ٟ‬‬
‫ٔفس‪ٙ‬ب اٌز‪٠ ٟ‬غت اْ رزجق‪ٙ‬ب اخً أ‪ ٞ‬اٌخ ‪٠ٚ ،‬غدت اْ ال رٕسد‪ ٝ‬اْ رضدـ اٌغٍّدخ سلدُ ‪ 6‬يد‪ٙٔ ٟ‬ب‪٠‬دخ اٌااٌدخ ‪ٚ‬ذٌده السعدبؿ اٌم‪ّ١‬دٗ‬
‫ؽ‪١‬ش ‪٠‬زُ رمز‪ ٓ٠‬اٌم‪ ّٗ١‬اٌااٌٗ ثٕفس اسُ اٌااٌخ ثقا أز‪ٙ‬بء فٍّ‪ٙ‬ب ‪ٚ‬ذٌه ي‪ِ ٟ‬ىبْ اسزافبج‪ٙ‬ب ٘ذا ي‪ ٟ‬ؽبي وبٔذ اٌااٌٗ رق‪١‬ا أ‪ ٞ‬ل‪ّ١‬دٗ‬
‫‪٠ٚ‬غت اْ ٔالؽؼ ٕ٘ب اْ اٌااٌٗ رّ‪ٛ‬د ثقا أز‪ٙ‬بء فٍّ‪ٙ‬ب أ‪ ٞ‬ال رؾزفؼ ثبٌم‪ ّٗ١‬ثقا ذٌه يجبِىبٕٔب اْ ٔؾفؼ ٘ذٖ اٌم‪ ّٗ١‬ثّز ‪١‬دم ‪ٚ‬ذٌده‬
‫ثّىبْ االسزافبء ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫طرقػادتخدامػاضداضةػسيػاضبرظاطجػ‪:‬ػ ػ‬
‫‪ .1‬اىغش‪ٝ‬قخ االٗى‪ ٍِ ٜٕٗ ٚ‬اعفو الفي‪: ٚ‬‬
‫ثؾ‪١‬ش ‪٠‬ى‪ ْٛ‬ثٕبء اٌااٌٗ ي‪ٛ‬ق اٌااٌٗ اٌمج‪١‬س‪٠ٚ main ٗ١‬ى‪ ْٛ‬حىً ثٕبء اٌااٌٗ ٔفس اٌةىً اٌقبَ اٌذ‪ ٞ‬حمؽٕبٖ سبثمب ‪.‬‬
‫وّب ‪: ٍٟ٠‬‬
‫…………… ‪#include‬‬
‫…………… ‪#include‬‬
‫‪//------------------------------------------------------------------------B‬‬ ‫الؽددؼ فز‪٠‬ددز‪ ٞ‬اٌددااس اٌّمغددـ اٌجمِغدد‪ٟ‬‬
‫اٌّغب‪ٚ‬س يما وّب ثجٕبء ِمغـ ِغم ٌز‪ٛ‬ض‪١‬ؼ‬
‫) ‪Type function_name ( Type parameter1 , Type parameter2 , ...‬‬ ‫اٌفىددددمٖ يفدددد‪ ٟ‬اٌّمغددددـ اٌجمِغدددد‪ B ٟ‬لّٕددددب‬
‫{‬ ‫ثزقم‪٠‬ددف اٌددخ ‪٘ٚ‬دد‪ ٟ‬ثقددا اسددزافبء اٌّىزجددبد‬
‫;………………‬
‫;………………‬
‫‪ٚ‬لجً اٌااٌخ اٌمج‪١‬س‪١‬خ صُ لّٕب ِٓ اخدً اٌااٌدخ‬
‫;………………‬ ‫اٌمج‪١‬سدد‪١‬خ ثبسددزافبء ٘ددذٖ اٌااٌددخ ‪ٚ‬ذٌدده ثىزبثددخ‬
‫;………………‬ ‫اسدددّ‪ٙ‬ب ‪ٚ‬رّم‪٠‬دددم اٌّقدددبِالد اٌمبصدددٗ ث‪ٙ‬دددب‬
‫;………………‬ ‫‪٠ٚ‬غدددت اْ ‪٠‬ىددد‪ ْٛ‬فدددا اٌّقدددبِالد اٌّّدددمٖ‬
‫}‬
‫‪//------------------------------------------------------------------------A‬‬ ‫ثٕفس فا اٌّقدبِالد فٕدا ثٕدبء عسدُ اٌااٌدخ‬
‫)( ‪void main‬‬ ‫وّب ي‪ ٟ‬اٌّمغـ ‪. B‬‬
‫{‬
‫;) ‪function_name ( parameter1 , parameter2 , ...‬‬
‫;‪……………….‬‬
‫;‪……………….‬‬
‫;‪……………….‬‬
‫}‬

‫اٍب اىغش‪ٝ‬قخ اىثبّ‪ ٔٞ‬فٖ‪ ٍِ ٜ‬افي‪ ٚ‬العفو ‪:‬‬


‫ثؾ‪١‬ش ‪٠‬ى‪ ْٛ‬ثٕبء اٌااٌٗ ‪ٚ‬عسّ‪ٙ‬ب اسفً اٌااٌٗ اٌمج‪١‬س‪ٕ٘ٚ ٗ١‬ب ‪٠‬غت اْ ٔضـ ّٔ‪ٛ‬ذط ٌٍااٌٗ ثقا رضّ‪ ٓ١‬اٌّىزجبد ‪ٚ‬لجً‬
‫اٌااٌٗ اٌمج‪١‬س‪ ٗ١‬صُ ٔم‪ َٛ‬ثجٕبء عسُ اٌااٌٗ ثقا اٌااٌٗ اٌمج‪١‬س‪. ٗ١‬‬
‫…………… ‪1. #include‬‬
‫…………… ‪2. #include‬‬
‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس ي‪٘ ٟ‬دذا اٌّمغدـ لّٕدب‬
‫) ‪3. Type function_name ( Type , Type , ...‬‬ ‫;‬ ‫ثزقم‪٠‬ددف اٌااٌددخ ثددبٌّٕ‪ٛ‬ذط اٌمددبص ث‪ٙ‬ددب ‪٘ٚ‬دد‪ٛ‬‬
‫‪//------------------------------------------------------------------------A‬‬ ‫يدد‪ ٟ‬اٌمغدد‪ٛ‬ح سلددُ ‪ٕ٘ٚ 3‬ددب ثبِىبٔدده اْ رضددـ‬
‫)( ‪4. void main‬‬ ‫اخددً االلدد‪ٛ‬ا اٌ‪ٙ‬الٌ‪١‬ددخ ٔدد‪ٛ‬ؿ اٌم‪ّ١‬ددخ اٌّّددمٖ‬
‫{ ‪5.‬‬ ‫يمددظ ‪ٚ‬ثبِىبٔدده ا‪٠‬ضددب اْ رضددـ ٔدد‪ٛ‬ؿ اٌم‪ّ١‬ددٗ‬
‫‪6.‬‬ ‫;) ‪function_name (parameter1 , parameter2 , ...‬‬ ‫اٌّّدددمح ‪ٚ‬ودددذٌه اسدددُ اٌّز ‪١‬دددم ‪٠ٚ‬غدددت اْ ال‬
‫‪7.‬‬ ‫;‪……………….‬‬ ‫رٕس‪ ٝ‬اٌفبصٍخ إٌّم‪ٛ‬عٗ ثقا عٍّدخ اٌزقم‪٠‬دف‬
‫‪8.‬‬ ‫;‪……………….‬‬
‫‪9.‬‬ ‫;‪……………….‬‬
‫٘ذٖ ‪ٚ‬ثا‪ٙٔٚ‬ب خغب ‪.‬‬
‫} ‪10.‬‬ ‫اِب ثبل‪ ٟ‬اٌمغ‪ٛ‬اد ي‪ ٟٙ‬وسبثمز‪ٙ‬ب ‪ٌٚ‬ىدٓ لّٕدب‬
‫‪//------------------------------------------------------------------------B‬‬ ‫ثجٕبء عسُ اٌااٌخ اسفً اٌااٌدخ اٌمجسد‪١‬خ الؽدؼ‬
‫) ‪11. Type function_name ( Type parameter1 ,Type parameter2 , ...‬‬ ‫اٌّمغـ اٌجمِغ‪. B ٟ‬‬
‫{ ‪12.‬‬
‫‪13.‬‬ ‫;………………‬
‫‪14.‬‬ ‫;………………‬
‫‪15.‬‬ ‫;………………‬
‫‪16.‬‬ ‫;………………‬
‫‪17.‬‬ ‫;………………‬
‫} ‪18.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫رقغٌ اىذٗاه ف‪ ٜ‬ىغخ اىغ‪ ٜ‬ثيظ ثيظ اى‪ ٚ‬قغَ‪َٕٗ ِٞ‬ب ‪:‬‬
‫‪ .1‬اضدوالػاضجاعزةػ‬
‫‪ٚ‬رى‪ ْٛ‬اخً ِزمعُ اٌس‪ ٟ‬ثٍس ثٍس ؽ‪١‬ش ‪٠‬زُ اسزافبج‪ٙ‬ب ِجبحمح ثىزبثٗ اسّ‪ٙ‬ب ‪ٌٚ‬ىٓ ثقا اْ ٔسزاف‪ ٟ‬اٌّىزجٗ اٌمبصٗ ث‪ٙ‬ب‪.‬‬
‫ٍثبه في‪ ٚ‬اىذٗاه اىجبٕضح ‪:‬‬
‫فٕاِب ٔم‪٠‬ا اْ ٔؾست سلُ ٌٗ ا ا‪ ٚ‬ل‪ ٖٛ‬ثبِىبٕٔب اْ ٔسزاف‪ ٟ‬اٌااٌٗ اٌغب٘زٖ اٌمبصٗ ث‪ٙ‬ذٖ اٌقٍّ‪ pow ٟ٘ٚ ٗ١‬صُ ٔىزت اٌم‪ّٗ١‬‬
‫ِمي‪ٛ‬فٗ ثبال وّب ‪: ٍٟ٠‬‬
‫‪pow ( 4‬‬ ‫‪,‬‬ ‫)‪2‬‬
‫اسُ اٌااٌٗ‬ ‫‪ ،‬اٌملُ‬ ‫اٌم‪ ٖٛ‬ا‪ ٚ‬اال‬

‫اٌٗ اخم‪ ٜ‬عب٘زٖ ‪ ٟ٘ٚ‬اٌٗ اٌغذس اٌزمث‪١‬ق‪ sqrt ) ٟ‬يقٕاِب ٔم‪٠‬ا اْ ٔؾست عذس أ‪ ٞ‬سلُ ٔسزاف‪٘ ٟ‬ذٖ اٌااٌٗ صُ ٔىزت اٌم‪ّٗ١‬‬
‫اٌز‪ٔ ٟ‬م‪٠‬ا اْ ٔؾست عذس٘ب وّب ‪: ٍٟ٠‬‬
‫( ‪sqrt‬‬ ‫) ‪4‬‬
‫اسُ اٌااٌٗ‬ ‫اٌملُ‬

‫‪ٕ٘ٚ‬ب ‪٠‬غت اْ ال ٕٔس‪ ٝ‬اْ ٔضّٓ اٌّىزجٗ اٌز‪ ٟ‬رزجـ ٌ‪ٙ‬ب ٘ذٖ اٌا‪ٚ‬اي ي‪ ٟ‬ثاا‪ ٗ٠‬اٌجمٔبِظ ‪ٚ‬فٕاِب ٔسزماَ اٌااٌز‪ ٓ١‬اٌسبثمز‪ٔ ٓ١‬سزاف‪ٟ‬‬
‫اٌّىزجٗ ‪ math.h‬اٌمبصٗ ثبٌقٍّ‪١‬بد اٌم‪٠‬بض‪ٕ٘ٚ ٗ١‬بن اٌقا‪٠‬ا ِٓ اٌّىزجبد اٌغب٘زٖ اٌز‪ٌ ٟ‬ىً ِٕ‪ٙ‬ب فٍّٗ اٌمبص ‪.‬‬
‫> ‪#include < math . h‬‬

‫‪ .2‬اىذٗاه اىز‪ْٝ ٜ‬شئٖب اىَجشٍج العزخذاٍٖب ف‪ ٜ‬ثشّبٍجٔ ‪:‬‬


‫ػأ‪ .‬داضةػالػتاخذػشغمػوالػتعغدػأيػشغطةػ‪:‬‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ اعَل ف‪ ٜ‬داىخ اعَٖب ‪. name‬‬

‫الؽؼ فز‪٠‬دز‪ ٞ‬اٌدااس يد‪ ٟ‬اٌّمغدـ ‪ B‬لّٕدب ثجٕدبء اٌدخ‬


‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫رم‪ َٛ‬ثغجبفخ االسُ فٍ‪ ٝ‬اٌةبحخ ‪ ٟ٘ٚ‬اٌمغ‪ٛ‬اد ‪– 4‬‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪ٚ 7‬لدددا ‪ٚ‬ضدددقٕب لجدددً اسدددُ اٌااٌدددخ اٌىٍّدددخ اٌّؾغددد‪ٛ‬زٖ‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬
‫‪ void‬ؽ‪١‬ددش رسددزماَ ٘ددذٖ اٌغٍّددٗ ٌٍاالٌددخ فٍدد‪ ٝ‬اْ ٘ددذٖ‬
‫‪4.‬‬ ‫) ( ‪void name‬‬
‫اٌااٌخ ال رق‪١‬ا أ‪ ٞ‬ل‪ِ ّٗ١‬معقٗ ‪ٚ ،‬ودذٌه ٌدُ ٔمدُ ثزّم‪٠‬دم‬
‫‪5.‬‬ ‫{‬
‫أ‪ ٞ‬ل‪ ّٗ١‬وّقبِالد ٌ‪ٙ‬ذٖ اٌااٌخ ثد‪ ٓ١‬االلد‪ٛ‬ا اٌ‪ٙ‬الٌ‪١‬دخ ‪،‬‬
‫‪6.‬‬ ‫;"‪cout << "yousef anay‬‬
‫‪ٚ‬ذٌه الْ اٌااٌخ ال ربخذ أ‪ ٞ‬ل‪ ّٗ١‬ا‪٠‬ضب ‪.‬‬
‫‪7.‬‬ ‫}‬
‫‪8.‬‬ ‫‪//------------------------------A‬‬
‫‪ِٚ‬ددٓ اٌّ‪ٙ‬ددُ اْ رقٍّددٗ فز‪٠‬ددز‪ ٞ‬اٌددااس ٕ٘ددب اْ رٕف‪١‬ددذ‬
‫‪9.‬‬ ‫) ( ‪void main‬‬
‫اٌجمٔدددبِظ ‪٠‬جددداا ِدددٓ ا‪ٚ‬ي عٍّدددٗ ِ‪ٛ‬عددد‪ ٖ ٛ‬اخدددً اٌااٌدددخ‬
‫‪10.‬‬ ‫{‬
‫اٌمج‪١‬سدد‪٘ٚ ٗ١‬دد‪ ٟ‬اٌااٌددخ )( ‪ name‬صددُ ‪٠‬مدد‪ َٛ‬اٌجمٔددبِظ‬
‫‪11.‬‬ ‫;)( ‪name‬‬
‫ثبٌذ٘بة اٌ‪ ٝ‬اٌااٌٗ اٌز‪ ٟ‬رؾًّ ٘ذا االسُ ‪ ٟ٘ٚ‬ثدبٌّمغـ‬
‫‪12.‬‬ ‫;) ( ‪getch‬‬
‫اٌمِغدد‪ B ٟ‬صددُ ‪٠‬ددزُ رٕف‪١‬ددذ ِؾز‪ٛ‬ا٘ددب صددُ ‪٠‬قدد‪ ٛ‬اٌدد‪ ٝ‬اٌااٌددخ‬
‫‪13.‬‬ ‫}‬
‫اٌمج‪١‬س‪١‬خ ٌ‪١‬ىّدً رٕف‪١‬دذ اٌغّدً اٌزد‪ ٟ‬رزجق‪ٙ‬دب ‪ٕ٘ٚ‬دب اٌغٍّدٗ‬
‫اٌالؽمخ ٘‪ getch () ٟ‬أ‪ ٞ‬أٗ سد‪١‬م‪ َٛ‬ثغجبفدخ االسدُ فٍد‪ ٝ‬اٌةبحدخ صدُ ‪ٕ٠‬زؾدم ا خدبي ؽدم ؽ‪١‬دش اسدزمإِب ٘دذٖ اٌااٌدخ‬
‫ِغبزا الؽ‪ٙ‬بس إٌبرظ فٍ‪ ٝ‬اٌةبحخ ‪٠ٚ ،‬غت اْ رضـ يبصٍٗ ِٕم‪ٛ‬عٗ ثقا فٍّ‪١‬خ اسزافبء اٌااٌخ وّب ي‪ ٟ‬اٌغٍّخ سلُ ‪. 11‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫عش‪ٝ‬قخ اخش‪ ٙ‬ىْفظ اىَثبه اىغبثق ‪:‬‬


‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫الؽددؼ فز‪٠‬ددز‪ ٞ‬اٌددااس ِددب لّٕددب ثددٗ ٘دد‪ ٛ‬ثٕددبء اٌااٌددخ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫اٌفمف‪١‬دخ )( ‪ name‬اسدفً اٌااٌدخ اٌمج‪١‬سد‪١‬خ يٍدذٌه ‪٠‬غدت‬
‫‪3.‬‬ ‫;)( ‪void name‬‬ ‫اْ ٔضـ ّٔ‪ٛ‬ذط ٌ‪ٙ‬ذٖ اٌااٌخ لجً رٕف‪١‬ذ٘ب ‪ِ ٛ٘ٚ‬ب لّٕدب ثدٗ‬
‫‪4.‬‬ ‫‪//------------------------------A‬‬ ‫ي‪ ٟ‬اٌمغ‪.3 ٖٛ‬‬
‫‪5.‬‬ ‫) ( ‪void main‬‬ ‫‪ِٚ‬ددب اس‪٠‬ددان اْ رقٍّددٗ ٕ٘ددب فز‪٠‬ددز‪ ٞ‬اٌددااس اْ رٕف‪١‬ددذ‬
‫‪6.‬‬ ‫{‬ ‫اٌجٕددبِظ ‪٠‬جدداا ِددٓ اٌااٌددخ اٌمج‪١‬سدد‪١‬خ ؽ‪١‬ددش سدد‪١‬زُ رٕف‪١‬ددذ ا‪ٚ‬‬
‫‪7.‬‬ ‫;)( ‪name‬‬ ‫عٍّددخ ‪٘ٚ‬دد‪ ٟ‬يدد‪ ٟ‬سلددُ ‪ٕ٘ٚ 7‬ددب يدد‪ ٟ‬ؽددبي ٌددُ ٔضددـ ٔدد‪ٛ‬ذط‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬ ‫ٌٍااٌٗ وّب ي‪ ٟ‬اٌمغ‪ 3 ٖٛ‬س‪١‬قغ‪ٕ١‬ب اٌّزمعُ اْ ٕ٘ب خغدب‬
‫‪9.‬‬ ‫}‬ ‫‪ ٛ٘ٚ‬اْ اٌااٌخ ‪ name‬غ‪١‬م ِقم‪ٚ‬يٗ ي‪ ٟ‬اٌجمٔبِظ ‪ٚ‬ذٌده‬
‫‪10.‬‬ ‫‪//------------------------------B‬‬ ‫الٔٗ لجً اْ ٔم‪ َٛ‬ثزٕف‪١‬دذ اٌجٕدبِظ ‪٠‬مد‪ َٛ‬اٌّزدمعُ ثزمعّدخ‬
‫‪11.‬‬ ‫) ( ‪void name‬‬ ‫ثمٔبِغدده ٌزؾ‪ٍ٠ٛ‬ددٗ اٌدد‪ ٝ‬رٕف‪١‬ددذ‪٘ٚ ٞ‬ددذٖ اٌقٍّ‪١‬ددخ رجدداا ِددٓ‬
‫‪12.‬‬ ‫{‬ ‫ا‪ٚ‬ي عٍّددخ يدد‪ ٟ‬اٌجمٔددبِظ ‪٘ٚ‬دد‪ ٟ‬خغدد‪ ٖٛ‬سلددُ ‪ 1‬صددُ ‪٠‬صددً‬
‫‪13.‬‬ ‫;"‪cout << "yousef anay‬‬ ‫اٌددد‪ ٝ‬إٌ‪ٙ‬ب‪٠‬دددخ اٌدددخ اٌمغددد‪ٌٚ 14 ٖٛ‬ىدددٓ اٌزٕف‪١‬دددذ ‪٠‬جددداا ِدددٓ‬
‫‪14.‬‬ ‫}‬ ‫اٌمغددد‪ ٖٛ‬سلدددُ ‪ 7‬أ‪ ٞ‬اْ اٌزٕف‪١‬دددذ ‪٠‬جددداا ِدددٓ اخدددً اٌااٌدددخ‬
‫اٌمج‪١‬سدد‪١‬خ ‪ٚ‬اٌزمعّددٗ رجدداا ِددٓ ا‪ٚ‬ي عٍّددٗ اخددً اٌجٕددبِظ‬
‫يف‪ ٟ‬ؽبي ٌُ ٔمُ ث‪ٛ‬ضـ ّٔ‪ٛ‬ذط ٌٍااٌٗ يبٌّزمعُ ال ‪٠‬قٍُ ِب ٘‪ ٟ‬اٌااٌخ ‪ name‬اخدً ثمٔبِغٕدب يقٕدا رٕف‪١‬دذ اٌجمٔدبِظ ال ‪٠‬غدا‬
‫فٕ‪ٛ‬اْ ٌ‪ٙ‬ب ي‪ٕٙ‬ب ‪٠‬قغ‪ٕ١‬ب خغب اْ اٌااٌخ غ‪١‬م ِقميخ ‪.‬‬

‫‪.1‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػادطكػرضىػاضذاذةػبادتخدامػداضةػادطكاػ ‪read‬ػثمػاطبدػطحتوغىاتػطىاػتىمػ‬
‫ادخاضهػبظفسػاضداضةػ‪ .‬ػ‬
‫ػ‬
‫‪.2‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرشطغنػطنػاضطدتخدمػثمػاطبدػاضرشمػاالصبرػبغظكمػبادتخدامػداضةػادىطكاػ‬
‫‪max‬ػ‪ .‬ػ‬
‫ػ‬
‫‪.3‬ػتدرغبػاصتبػبرظاطجػبضغىةػاضدىيػبضىسػبضىسػالدخىالػ‪8‬ػ رالطىاتػضطاضىبػثىمػادخىالػاالدىمػوشىمػبحدىابػاضطعىدلػثىمػاطبىدػاالدىمػ‬
‫واضطعدلػرضىػاضذاذةػ‪ .‬ػ‬
‫ػ‬
‫‪.4‬ػتىىدرغبػاصتىىبػبرظىىاطجػبضغىىةػاضدىىيػبضىىسػبضىىسػالدخىىالػطصىىفوسهػطىىنػاضظىىوعػاضعىىدديػاضصىىحغحػطوضكىاػػ‪5‬ػارشىىامػغىىتمػادخاضكىىاػطىىنػ‬
‫اضطدتخدمػثمػشمػبطبارةػطجطوركاػرضىػاضذاذةػبادتخدامػداضةػسررغهػادطكاػ‪ sum‬ػ‬
‫ػ‬
‫‪.5‬ػ تدرغبػاصتبػبرظىاطجػبضغىةػاضدىيػبضىسػبضىسػالدخىالػرشىمػرىدديػصىحغحػبداضىةػسررغىهػواعىربهػبظفدىهػرىددػطىنػاضطىراتػغىتمػ‬
‫تحدغدعاػبادخالػرشمػاخرػطنػاضظوعػاضعدديػاضصحغحػثمػاطبدػاضظاتجػرضىػاضذاذةػ‪ .‬ػ‬
‫ػ‬
‫‪.6‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضحدابػطعروبػرددػغتمػادخالػطنػاضطدتخدمػثمػاطبعهػرضىػاضذاذةػ‪ .‬ػ‬
‫ػ‬
‫‪.7‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػطعدلػطاضبػطنػاضظوعػاضحقغقيػثمػاطبدػتقدغرهػاذاػصانػاصبرػطنػ‪51‬ػغىتمػ‬
‫طبارةػظاجحػواذاػاشلػغتمػطبارةػرادبػ‪ .‬ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫‪.8‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػأيػرطزػطنػاضطدتخدمػبطاضةػسررغهػثمػاطبدػطعاطضةػباالدصيػصودػ‪ .‬ػ‬


‫ػ‬
‫‪.9‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػاالردادػاضزوجغهػاضطحصورهػبىغنػ‪51‬ػ–ػ‪111‬ػبداضىةػسررغىةػبحغىثػغصىونػصىلػ‬
‫رشمػرضىػدطرػ‪ .‬ػ‬
‫ػ‬
‫‪.11‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػاالرشامػاضتيػتقبلػاضقدىطهػرضىىػ‪5‬ػطىنػدونػبىاشيػاضطصىحورهػبىغنػ‪-29‬ػ‪81‬ػ‬
‫سيػداضةػسررغهػبحغثػغصونػصلػرشمػرضىػدطرػثمػشمػبعدعاػواطبدػرددعاػ‪ .‬ػ‬
‫ػ‬
‫‪.11‬ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرشمػطنػاضطدتخدمػرنػطرغقػداضةػسررغةػثمػاطبدػاذاػصانػاضىرشمػسىرديػاوػ‬
‫زوجيػ‪ .‬ػ‬
‫ػ‬
‫‪.12‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػادطكػثمػشمػبفحصػصمػرىددػتصىرارػاضحىرفػ‪a‬ػسغىهػثىمػشىمػبطارتكىاػرضىىػ‬
‫اضذاذةػبادتخدامػداضةػسررغةػ‪ .‬ػ‬
‫ػ‬
‫‪.13‬ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرشطغنػطنػاضظوعػاضعدديػاضصحغحػبداضةػسررغةػثمػشمػبتبدغلػشغطىةػصىلػ‬
‫طظكاػواطبدػاضظاتجػشبلػوبعدػاضتبدغلػ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ب‪.‬ػداضةػتاخذػشغمػوالػتعغدػأيػشغطةػ‪:‬ػ ػ‬
‫‪ٌٙٚ‬ب اٌص‪ ١‬خ اٌزب‪٠‬خ ‪:‬‬
‫)……‪void function_name (type x, type y,‬‬
‫{‬

‫}‬

‫ؽ‪١‬ش اْ ٘ذا إٌ‪ٛ‬ؿ ِٓ اٌا‪ٚ‬اي ‪٠‬بخذ ل‪ ُ١‬وّقبِالد ِّمٖ اٌ‪٘ ٝ‬ذٖ اٌااٌدخ ‪ٚ ،‬ال ‪٠‬ق‪١‬دا أ‪ ٞ‬ل‪ّ١‬دخ ‪ٌٚ‬زقج‪١‬دم فدٓ اٌااٌدخ اٌزد‪ ٟ‬ال‬
‫رق‪١‬ا أ‪ ٞ‬ل‪ّ١‬خ ‪ٔ ،‬ضـ اٌىٍّخ اٌّؾغ‪ٛ‬زح ي‪ ٌ ٟ‬خ اٌس‪ٚ ٟ‬اٌس‪ ٟ‬ثٍس ثٍس ‪ void ٟ٘ٚ‬أ‪ ٞ‬اْ ٘ذٖ اٌااٌخ ال رق‪١‬ا ل‪ّ١‬خ ‪.‬‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ الدخبه سقٌ فذد‪ ٛ‬صح‪ٞ‬ح داخو اىذاىخ اىشئ‪ٞ‬غ‪ٞ‬خ ثٌ قٌ‬
‫ثزَش‪ٝ‬شٓ في‪ ٚ‬داىخ فشف‪ٞ‬خ ثٌ اعجـ ٕزا اىقذد في‪ ٚ‬اىشبرخ ثقذد ٍشاد ق‪َٞ‬زٔ ف‪ ٜ‬مو عغش ‪.‬‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫الؽددؼ فز‪٠‬ددز‪ ٞ‬اٌددااس لّٕددب ثب خددبي ل‪ّ١‬ددخ‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫ِز ‪١‬دددم فدددا ‪ ٞ‬صدددؾ‪١‬ؼ ‪٘ٚ‬ددد‪ x ٛ‬يددد‪ ٟ‬اٌااٌدددخ‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬ ‫اٌمج‪١‬س‪١‬خ صُ لّٕدب ثبسدزافبء اٌااٌدخ ) ( ‪print‬‬
‫‪4.‬‬ ‫)‪void print (int y‬‬ ‫صدددُ ِمسٔدددب اٌّز ‪١‬دددم ‪ٌٙ x‬دددذٖ اٌااٌدددخ وّقبِدددً‬
‫‪5.‬‬ ‫{‬ ‫ؽ‪١‬دددش ‪٠‬دددزُ رّم‪٠‬دددم اٌمددد‪ ُ١‬اجّدددب ِدددٓ اخدددً‬
‫‪6.‬‬ ‫)‪for (int i=1;i<=y;i++‬‬ ‫االلدد‪ٛ‬ا اٌ‪ٙ‬الٌ‪١‬ددخ وّددب يدد‪ ٟ‬اٌمغدد‪ 15 ٖٛ‬صددُ‬
‫‪7.‬‬ ‫;‪cout << y << endl‬‬ ‫اسددددزمجٍٕب ِؾز‪٠ٛ‬ددددبد ٘ددددذا اٌّز ‪١‬ددددم ثّز ‪١‬ددددم‬
‫‪8.‬‬ ‫}‬ ‫خدددبٌ ثبٌااٌدددخ ‪٘ٚ‬ددد‪ y ٛ‬ؽ‪١‬دددش ‪٠‬سدددّ‪٘ ٝ‬دددذا‬
‫‪9.‬‬ ‫‪//------------------------------A‬‬ ‫اٌزّم‪٠‬م رّم‪٠‬م ثبٌم‪ّ١‬خ ‪ٚ‬ذٌه الْ اٌم‪ ّٗ١‬اٌز‪ٟ‬‬
‫‪10.‬‬ ‫) ( ‪void main‬‬ ‫ِمسٔب٘ب رُ ٔسم‪ٙ‬ب ِز ‪١‬م اخم خبص ثبٌااٌخ‬
‫‪11.‬‬ ‫{‬ ‫ٔفسدد‪ٙ‬ب ‪٘ٚ‬دد‪ِ ٛ‬ز ‪١‬ددم عا‪٠‬ددا ‪ٚ‬ثبِىددبْ فز‪٠‬ددز‪ٞ‬‬
‫‪12.‬‬ ‫;‪int x‬‬ ‫اٌااس اْ رسّ‪٘ ٝ‬ذا اٌّز ‪١‬دم أ‪ ٞ‬اسدُ اخدم‬
‫‪13.‬‬ ‫; " ‪cout << "Enter your number :‬‬ ‫غ‪١‬م ‪ٚ y‬ثبِىبٔه ا‪٠‬ضب اْ رسّ‪ ٗ١‬ثدٕفس اسدُ‬
‫‪14.‬‬ ‫;‪cin >> x‬‬ ‫اٌّز ‪١‬دددم ‪ٚ ، x‬ذٌددده الْ ٘دددذا اٌّز ‪١‬دددم ٘ددد‪ٛ‬‬
‫‪15.‬‬ ‫;) ‪print ( x‬‬ ‫ِز ‪١‬م خبص ثبٌااٌخ ٔفسد‪ٙ‬ب ‪٘ٚ‬د‪ِ ٛ‬ؾّد‪ ٟ‬يدال‬
‫‪16.‬‬ ‫;) ( ‪getch‬‬ ‫ِددبٔـ ِددٓ ذٌدده يبٌااٌددخ رمدد‪ َٛ‬ثبخفددبء ‪ٚ‬ؽّب‪٠‬ددخ‬
‫‪17.‬‬ ‫}‬ ‫٘ذا اٌّز ‪١‬م ‪ٚ‬عقٍٗ خبص ث‪ٙ‬ب ‪ٚ ،‬ودذٌه لّٕدب‬
‫ثزقم‪٠‬ف ٔ‪ٛ‬ؿ اٌم‪ ّٗ١‬اٌّّمٖ لجً اسُ اٌّز ‪١‬دم‬
‫‪ٌٚ y‬ذٌه السزمجبي ل‪ّ١‬خ ِٓ إٌ‪ٛ‬ؿ اٌقا ‪ ٞ‬اٌصؾ‪١‬ؼ أ‪ ٞ‬اْ ٘ذا إٌ‪ٛ‬ؿ ‪٠‬زُ رؾا‪٠‬اٖ ؽست ٔ‪ٛ‬ؿ اٌم‪ّ١‬خ اٌّّمٖ ٌٍااٌخ يبذا وبْ‬
‫ٔ‪ٛ‬ك اٌم‪ّ١‬خ اٌّّمٖ ٌٍااٌخ ٘د‪ِ ٛ‬دٓ إٌد‪ٛ‬ؿ اٌقدا ‪ ٞ‬اٌىسدم‪ ٞ‬ي‪١‬دزُ ‪ٚ‬ضدـ ‪ float‬ثداي ‪ِٚ int y‬دب اس‪٠‬ده اْ رقٍّدٗ ا‪٠‬ضدب أدٗ‬
‫ثبِىبٔه رّم‪٠‬م اوضم ِٓ ل‪ ّٗ١‬ثٕفس اٌ‪ٛ‬لذ ‪ٚ‬ذٌه ث‪ٛ‬ضـ يبصٍٗ ‪١ٌٚ‬س يبصٍٗ ِٕم‪ٛ‬عٗ ثقدا اسدُ اٌّز ‪١‬دم صدُ وزبثدخ ٔ‪ٛ‬فدٗ‬
‫‪ٚ‬اسّٗ ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرشطغنػطنػاضطدتخدمػسىيػاضداضىةػاضرئغدىغةػثىمػشىمػبتطرغرعىاػاضىىػ‬
‫داضهػسررغةػضطبارةػاضرشمػاالصبرػبغظكمػ‪ .‬ػ‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس لّٕب ثب خدبي اٌدملّ‪ِ ٓ١‬دٓ‬


‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫اٌّسددزماَ ؽ‪١‬ددش رددُ رمددز‪ ٓ٠‬ل‪ّ١‬ددخ وددً ِٕ‪ّٙ‬ددب يدد‪ٟ‬‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫اٌّز ‪١‬ددم ‪ x,y‬صددُ ثقددا ذٌدده لّٕددب ثبسددزافبء اٌااٌددخ‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬ ‫;) ‪ِ print_max ( x,y‬دـ رّم‪٠‬دم اٌّز ‪١‬دماد‬
‫‪4.‬‬ ‫) ‪void print_max (int x , int y‬‬ ‫اٌز‪ ٟ‬رُ ؽفؼ اٌم‪ ُ١‬اٌّاخٍدٗ ي‪ّٙ١‬دب ‪ ،‬ؽ‪١‬دش اْ ٘دذٖ‬
‫‪5.‬‬ ‫{‬ ‫اٌمددد‪ ُ١‬سدددزٕزمً فٍددد‪ ٝ‬اٌّمغدددـ اٌجمِغددد‪٠ٚ B ٟ‬دددزُ‬
‫‪6.‬‬ ‫;‪cout << endl‬‬ ‫رمز‪ٕٙ٠‬دددب يددد‪ ٟ‬اٌّز ‪١‬دددم‪ x,y ٓ٠‬ثبٌزمر‪١‬دددت أ‪ ٞ‬اْ‬
‫‪7.‬‬ ‫) ‪if (x>y‬‬ ‫اٌّز ‪١‬ماد اٌّ‪ٛ‬ع‪ ٖ ٛ‬اخً اٌااٌخ اٌمج‪١‬س‪١‬خ ٌ‪١‬سدذ‬
‫‪8.‬‬ ‫;‪cout << "The max is : " << x‬‬ ‫٘‪١‬ب ٔفس‪ٙ‬ب اٌّ‪ٛ‬ع‪ ٖ ٛ‬اخً اٌااٌخ اٌفمف‪١‬خ وّب يد‪ٟ‬‬
‫‪9.‬‬ ‫‪else‬‬ ‫اٌّمغـ اٌجمِغ‪٘ٚ B ٟ‬ذا اٌزّم‪٠‬م ‪٠‬سّ‪ ٝ‬اٌزّم‪٠‬م‬
‫‪10.‬‬ ‫; ‪cout << "The max is : " << y‬‬ ‫ثبٌم‪ّ١‬خ الٔٗ ‪٠‬زُ ي‪ٔ ٗ١‬سخ ل‪ّ١‬خ اٌّز ‪١‬دم يد‪ِ ٟ‬ز ‪١‬دم‬
‫‪11.‬‬ ‫}‬ ‫اٌااٌخ فٕا فٍّ‪١‬خ اٌزّم‪٠‬م ‪.‬‬
‫‪12.‬‬ ‫‪//------------------------------A‬‬ ‫اِددب ثددبل‪ ٟ‬اٌّمغددـ اٌجمِغدد‪ ٟ‬ي‪ٙ‬دد‪ِ ٛ‬ددب رقٍّزددٗ يدد‪ٟ‬‬
‫‪13.‬‬ ‫) ( ‪void main‬‬ ‫ِقبٌغخ اٌج‪١‬بٔبد ‪.‬‬
‫‪14.‬‬ ‫{‬
‫‪15.‬‬ ‫;‪int x,y‬‬
‫‪16.‬‬ ‫; " ‪cout << "Enter first number :‬‬
‫‪17.‬‬ ‫;‪cin >> x‬‬
‫‪18.‬‬ ‫; " ‪cout << "Enter secand number :‬‬
‫‪19.‬‬ ‫;‪cin >> y‬‬
‫‪20.‬‬
‫‪21.‬‬ ‫;) ‪print_max ( x,y‬‬
‫‪22.‬‬ ‫;) ( ‪getch‬‬
‫‪23.‬‬ ‫}‬

‫رذس‪ٝ‬ت ‪ :‬امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ الدخبه فالٍز‪ ِٞ‬ىغبىت ٍِ ّ٘ؿ ظق‪ٞ‬ق‪ ٜ‬ف‪ ٜ‬اىذاىخ اىشئ‪ٞ‬غ‪ٞ‬خ ثٌ‬
‫ٍشسٕب في‪ ٚ‬داىخ فشف‪ٞ‬خ اعَٖب ‪ sum_avg‬ثٌ اعحت اىَجَ٘ؿ ٗاىَقذه ف‪ ٜ‬اىذاىخ اىفشف‪ٞ‬خ ٗاعجقٌٖ في‪ٚ‬‬
‫اىشبرخ ٍـ جَو ر٘ض‪ٞ‬ح‪ٞ‬خ ‪.‬‬

‫رذس‪ٝ‬ت امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ الدخبه سقَ‪ ٍِ ِٞ‬اىَغزخذً ٍِ اىْ٘ؿ اىقذد‪ ٛ‬اىصح‪ٞ‬ح ثششط اُ‬
‫‪ٝ‬نُ٘ االٗه امجش ٍِ اىثبّ‪ٗ ٜ‬ارا رٌ ادخبه غ‪ٞ‬ش رىل افذ ادخبه االٗه ثٌ ٍشس ٕز‪ ِٝ‬اىقذد‪ ِٝ‬في‪ ٚ‬داىخ فشف‪ٞ‬خ‬
‫اعَٖب ‪ rang‬ىغجبفخ االفذاد ٍِ ٗاى‪ ٚ‬اىشقَ‪ ِٞ‬أ‪ ٛ‬جَ‪ٞ‬ـ االفذاد اىَحص٘سٓ ث‪. ٌْٖٞ‬‬

‫رذس‪ٝ‬ت امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ الدخبه سقَ‪ ٍِ ِٞ‬اىْ٘ؿ اىقذد‪ ٛ‬اىصح‪ٞ‬ح ف‪ ٜ‬اىذاىخ اىشئ‪ٞ‬غ‪ٞ‬خ ثٌ قٌ‬
‫ثزَش‪ٝ‬ش ٕزٓ اىق‪ ٌٞ‬في‪ ٚ‬داىخ فشف‪ ٔٞ‬ىغجبفخ اىق‪ ٌٞ‬في‪ ٚ‬اىشبرخ ثٌ ٍشس ٕزٓ اىق‪ ٌٞ‬في‪ ٚ‬داىخ فشف‪ٞ‬خ ثبّ‪ٞ‬خ اعَٖب‬
‫‪ swap‬ىزجذ‪ٝ‬و اىق‪ ٌٞ‬داخو ٍزغ‪ٞ‬شارٖب أ‪ ٛ‬ارا مبّذ ‪ y=10 ٗ x=5‬قٌ ثزجذ‪ٝ‬و اىق‪ x=10 ٗy=5 ٌٞ‬ثٌ اعجـ‬
‫اىْز‪ٞ‬جٔ في‪ ٚ‬اىشبرخ ثْفظ اىذاىخ ‪.‬‬
‫ٍالظؾخ ‪ٝ‬يضً ٍز غ‪ٞ‬ش ٍِ ّفظ ّ٘ؿ اىق‪ ٌٞ‬داخو داىخ اىزجذ‪ٝ‬و ىحزفبػ ق‪َٞ‬خ اىَزغ‪ٞ‬ش االٗه ف‪ ٔٞ‬ثٌ فَي‪ٞ‬خ اىزجذ‪ٝ‬و ثٌ افبدح اىق‪َٞ‬خ اى‪ ٚ‬اىَزغ‪ٞ‬ش االخش ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ج‪.‬ػداضةػالػتاخذػشغمػوتعغدػشغطةػ‪ :‬ػ‬

‫طثالػ‪:‬ػاصتبػبرظاطجػبادتخدامػاضديػبضسػبضسػالدخالػرشمػطنػاضطدتخدمػطنػاضظوعػاضعدديػاضصحغحػسيػداضةػ‬
‫سررغةػثمػشمػبحدابػتصعغبهػثمػارجدػاضقغطهػاضطربعهػواطبعكاػسيػاضداضةػاضرئغدغةػ‪ .‬ػ‬
‫ػ‬
‫‪18.‬‬ ‫>‪#include <iostream.h‬‬ ‫ػ‬
‫‪19.‬‬ ‫>‪#include <conio.h‬‬ ‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس ِدب لّٕدب ثدٗ ٘د‪ٚ ٛ‬ضدـ‬
‫‪20.‬‬ ‫‪//------------------------------B‬‬ ‫اٌىٍّددخ اٌّؾغدد‪ٛ‬سٖ ‪ return‬اخددم اٌااٌددخ ؽ‪١‬ددش‬
‫‪21.‬‬ ‫) ( ‪int cube‬‬ ‫رسزماَ ٘ذٖ اٌغٍّخ السعبؿ ل‪ّ١‬خ ‪ٚ‬اؽاٖ ‪ٚ‬لّٕب‬
‫‪22.‬‬ ‫{‬ ‫ثقا٘ب ث‪ٛ‬ضـ اٌقٍّ‪١‬دبد ‪٘ٚ x*x*x‬د‪ ٟ‬فٍّ‪١‬دخ‬
‫‪23.‬‬ ‫;‪int x‬‬ ‫رىق‪١‬ددت اٌددملُ اٌّدداخً ‪ِٚ ،‬ددب اس‪٠‬دداٖ ِٕدده اْ‬
‫‪24.‬‬ ‫;‪cout << "Enter your number : " << x‬‬ ‫رقٍّدددٗ اْ ٘دددذٖ اٌااٌدددخ رق‪١‬دددا ل‪ّ١‬دددٗ ِدددٓ إٌددد‪ٛ‬ؿ‬
‫‪25.‬‬ ‫;‪return x*x*x‬‬ ‫اٌقددا ‪ ٞ‬اٌصددؾ‪١‬ؼ يٍددذٌه ‪٠‬غددت اْ ٔؾددا ٔدد‪ٛ‬ؿ‬
‫‪26.‬‬ ‫}‬ ‫اٌم‪ّ١‬ددخ اٌّمعقددٗ ‪٘ٚ‬دد‪ِ ٛ‬ددب ‪ٚ‬ضددقٕ‪ٙ‬ب لجددً اسددُ‬
‫‪27.‬‬ ‫‪//------------------------------A‬‬ ‫اٌااٌددخ فٕددا ثٕبج‪ٙ‬ددب الؽددؼ اٌمغدد‪ ، 4 ٖٛ‬أ‪ ٞ‬اْ‬
‫‪28.‬‬ ‫) ( ‪void main‬‬ ‫٘دددذٖ اٌااٌدددخ رق‪١‬دددا ل‪ّ١‬دددٗ ِدددٓ إٌددد‪ٛ‬ؿ اٌقدددا ‪ٞ‬‬
‫‪29.‬‬ ‫{‬ ‫اٌصدددؾ‪١‬ؼ ‪ٚ ، int‬اْ ٘دددذا اٌااٌدددخ ال ربخدددذ أ‪ٞ‬‬
‫‪30.‬‬ ‫;) ( ‪cout << cube‬‬ ‫ل‪ّ١‬دددٗ يٍدددُ ٔضدددـ أ‪ِ ٞ‬قبِدددً ثددد‪ ٓ١‬االلدددد‪ٛ‬ا‬
‫‪31.‬‬ ‫;) ( ‪getch‬‬ ‫اٌ‪ٙ‬الٌ‪١‬ددخ ‪ ،‬اِددب ٔز‪١‬غددٗ ؽسددبة اٌقٍّ‪١‬ددبد ي‪١‬ددزُ‬
‫‪32.‬‬ ‫}‬ ‫رمز‪ٕٙ٠‬ب اخً اسُ اٌااٌخ لّٕب ثغجبفخ إٌز‪١‬غدخ‬
‫ِجبحمٖ اخدً اٌااٌدخ اٌمج‪١‬سد‪١‬خ الؽدؼ اٌمغد‪ٖٛ‬‬
‫سلُ ‪. 13‬‬

‫ػ‬
‫رذس‪ٝ‬ت امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ الدخبه سقٌ ف‪ ٜ‬داىخ فشف‪ٞ‬خ اعَٖب ‪ fact‬ىحغبة ٍضشٗة ٕزا‬
‫اىقذد ثششط اُ ‪ٝ‬نُ٘ اىشقٌ اىَذخو امجش ٍِ ‪ٗ 1‬ارا ادخو ‪ 1‬افذ ادخبىٔ ثٌ افذ ق‪َٞ‬خ ٍضشٗة اىقذد اىخ اىذاىخ‬
‫اىشئ‪ٞ‬غ‪ٞ‬خ ٗاعجقٖب ٍـ جَو ر٘ض‪ٞ‬ح‪ٞ‬خ ‪.‬‬

‫رذس‪ٝ‬ت امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظػالدخالػطصفوسهػطنػ‪5‬ػرظاصرػطنػاضظوعػاضعدديػاضصحغحػسيػداضةػسررغةػ‬


‫ثمػشمػبحدابػطجطوركاػوارجدػاضقغطةػاضىػاضداضةػاضرئغدغةػضطبارتكاػطدػجطلػتوعغحغةػ‪ .‬ػ‬
‫ػ‬
‫رذس‪ٝ‬ت امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظػالدخالػطصفوسهػثظائغةػاضبعدػسيػداضةػسررغةػرددػرظاصرعاػ‪4‬ػثمػشمػ‬
‫بحدابػطجطوعػاضقطرػوشمػبارجارهػرضىػاضداضةػاضرئغدغةػضطبارتةػ‪ .‬ػ‬
‫ػ‬
‫رذس‪ٝ‬ت امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظػالدخالػرشطغنػطنػاضطدتخدمػسيػداضةػسررغهػثمػشمػبعدػاالرشامػ‬
‫اضفردغةػاضطحصورهػبغظكمػبذرطػانػغصونػاالولػاصبرػطنػاضثاظيػوزغرػذضكػاردػادخالػاالولػثمػرددػاالرشامػ‬
‫اضفردغةػاضىػاضداضةػاضرئغدغةػضطبارتةػطدػجطلػتوعغحغةػ‪ .‬ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫د‪.‬ػداضةػتاخذػشغمػوتعغدػشغطةػ‪ :‬ػ‬
‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرشطغنػطنػاضطدتخدمػسيػاضداضةػاضرئغدغةػثمػشمػبتطرغرػاضرشطغنػ‬
‫اضىػداضةػسررغةػضحدابػطجطوركطاػثمػارجدػاضطجطوعػاضىػاضداضةػاضرئغدغةػوشمػبطبارتةػ‪ .‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ػ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫ػ‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬
‫‪4.‬‬ ‫) ‪int sum (int x , int y‬‬ ‫ػ‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫;‪return x+y‬‬
‫‪7.‬‬ ‫}‬
‫‪8.‬‬ ‫‪//------------------------------A‬‬
‫‪9.‬‬ ‫) ( ‪void main‬‬
‫‪10.‬‬ ‫{‬
‫‪11.‬‬ ‫;‪int x,y‬‬
‫‪12.‬‬ ‫;" ‪cout << "Enter your first number :‬‬
‫‪13.‬‬ ‫;‪cin >> x‬‬
‫‪14.‬‬ ‫;"‪cout << "Enter your secand number :‬‬
‫‪15.‬‬ ‫;‪cin >> y‬‬
‫‪16.‬‬ ‫;) ‪cout << "The sum is : " << sum (x,y‬‬
‫‪17.‬‬ ‫;) ( ‪getch‬‬
‫‪18.‬‬ ‫}‬

‫رذس‪ٝ‬ت امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ػ‬
‫ػ‬
‫طثال امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىزَش‪ٝ‬ش ٍصف٘فخ ٍِ اىْ٘ؿ اىقذد‪ ٛ‬اىصح‪ٞ‬ح ع٘ىٖب ‪ٗ 5‬فْبصشٕب‬
‫مَب ‪ٝ‬ي‪{5,8,2,0,9} : ٜ‬ػطررعاػرضىػداضةػسررغةػضحدابػطجطوعػرظاصرعاػثمػاطبعةػباضداضةػاضفررغةػ‪ .‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس لّٕب ثزقم‪٠‬ف اٌّصف‪ٛ‬يخ اٌّغٍ‪ٛ‬ثدخ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫يدد‪ ٟ‬اٌّسددبٌخ يددد‪ ٟ‬اٌمغدد‪ٛ‬سح سلددُ ‪ 14‬صدددُ ثقددا ذٌدده لّٕدددب‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬
‫ثبسددددزافبء اٌددددخ اٌغّدد دـ ‪٘ٚ‬دددد‪ِ add ٟ‬ددددـ رّم‪٠‬ددددم اسددددُ‬
‫‪4.‬‬ ‫) ]‪void add (int x [5‬‬
‫اٌّصددف‪ٛ‬يخ ‪٘ٚ‬ىددذا رّددمس اٌّصددف‪ٛ‬يبد اٌدد‪ ٝ‬اٌددا‪ٚ‬اي ؽ‪١‬ددش‬
‫‪5.‬‬ ‫{‬
‫رّددمس ثبسددُ اٌّصددف‪ٛ‬يخ يمددظ ؽ‪١‬ددش ‪٠‬مددزْ يدد‪٘ ٟ‬ددذا االسددُ‬
‫‪6.‬‬ ‫;‪int sum=0‬‬
‫فٕ‪ٛ‬اْ ا‪ٚ‬ي ل‪ِٛ ّٗ١‬ع‪ ٖ ٛ‬ي‪ٙ١‬ب ‪ ،‬ؽ‪١‬ش اسزمجٍٕب ٘ذٖ اٌم‪ّ١‬دخ‬
‫‪7.‬‬ ‫)‪for (int i=0;i<5;i++‬‬
‫ي‪ ٟ‬اٌااٌخ الؽدؼ اٌّمغدـ اٌجمِغد‪ِٚ B ٟ‬دب اس‪٠‬داٖ ِٕده اْ‬
‫‪8.‬‬ ‫;]‪sum += x[i‬‬
‫رقٍّٗ أٗ فٕا اسزمجبي اٌّصدف‪ٛ‬يٗ اٌّّدمٖ ‪٠‬غدت اْ ٔضدـ‬
‫‪9.‬‬ ‫;‪cout << "The sum is : " << sum‬‬
‫اسُ ٌٍّصف‪ٛ‬يٗ ‪ٚ‬وذٌه ٔضـ ال‪ٛ‬ا ِسدزم‪ّ١‬خ ‪ٚ‬ث‪ٕٙ١‬دب فدا‬
‫‪10.‬‬ ‫}‬
‫لدد‪ ُ١‬اٌّصددف‪ٛ‬يٗ ٘ىددذا ]‪ ، int x [5‬ثددبل‪ ٟ‬اٌمغدد‪ٛ‬اد رددُ‬
‫‪11.‬‬ ‫‪//------------------------------A‬‬
‫حمؽ‪ٙ‬ب سبثمب ‪.‬‬
‫‪12.‬‬ ‫) ( ‪void main‬‬
‫‪13.‬‬ ‫{‬
‫‪14.‬‬ ‫;}‪int x [5]= {5,8,2,0,9‬‬
‫‪15.‬‬ ‫;)‪add (x‬‬
‫‪16.‬‬ ‫;) ( ‪getch‬‬
‫‪17.‬‬ ‫}‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ٍثبه ٌٍٖ جذا ‪ :‬امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيةظ ىزَش‪ٝ‬ةش اىَصةف٘فخ اىغةبثقخ فية‪ ٚ‬داىةخ ثةٌ قةٌ ثزش‪ٝ‬جٖةب ٍةِ‬
‫االصغش اى‪ ٚ‬االمجش‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ِالؽؾدددخ فٕدددا رّم‪٠‬دددم اٌّصدددف‪ٛ‬يخ فٍددد‪ ٝ‬أ‪ ٞ‬اٌدددخ يدددبْ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫اٌز ‪١١‬م اٌذ‪٠ ٞ‬زُ فٍ‪ٙ١‬ب ‪٠‬زُ فٍ‪ٔ ٝ‬فدس اٌّصدف‪ٛ‬يخ أ‪ ٞ‬اْ‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬ ‫اٌزّم‪٠‬م ٕ٘دب ‪٠‬ىد‪ ْٛ‬ثدبٌّمعـ ‪ٌٚ‬د‪١‬س ثبٌم‪ّ١‬دخ ‪٘ٚ‬دذا سد‪١‬زُ‬
‫‪4.‬‬ ‫) ]‪void swap (int x [5‬‬ ‫حمؽٗ الؽمب ‪.‬‬
‫‪5.‬‬ ‫{‬ ‫‪ٕ٘ٚ‬ددب يدد‪٘ ٟ‬ددذا اٌّضددبي ‪٠‬ددزُ رمر‪١‬ددت اٌّصددف‪ٛ‬يخ االصددٍ‪١‬خ‬
‫‪6.‬‬ ‫;]‪int temp =x[0‬‬ ‫اٌّ‪ٛ‬عددد‪ ٖ ٛ‬اخدددً اٌااٌدددخ اٌمج‪١‬سددد‪١‬خ أ‪ ٞ‬اْ اٌزقدددا‪٠ ً٠‬دددزُ‬
‫‪7.‬‬ ‫)‪for (int i=0;i<5;i++‬‬ ‫ثزقا‪ ً٠‬االصً ‪.‬‬
‫‪8.‬‬ ‫)‪for (int j=i+1;j<4;j++‬‬
‫‪9.‬‬ ‫{‬
‫‪10.‬‬ ‫) ]‪if (x[j] < x[i‬‬
‫‪11.‬‬ ‫{‬
‫‪12.‬‬ ‫;]‪temp=x[j‬‬
‫‪13.‬‬ ‫;]‪x[j]=x[i‬‬ ‫ػ‬
‫‪14.‬‬ ‫;‪x[i]=temp‬‬
‫‪15.‬‬ ‫}‬ ‫ػ‬
‫‪16.‬‬ ‫}‬ ‫ػ‬
‫‪17.‬‬ ‫}‬
‫‪18.‬‬ ‫‪//------------------------------A‬‬ ‫ػ‬
‫‪19.‬‬ ‫) ( ‪void main‬‬
‫‪20.‬‬ ‫{‬
‫ػ‬
‫‪21.‬‬ ‫;}‪int x [5]= {5,8,2,0,9‬‬ ‫ػ‬
‫‪22.‬‬ ‫;)‪swap (x‬‬
‫‪23.‬‬ ‫;) ( ‪getch‬‬ ‫ػ‬
‫‪24.‬‬ ‫}‬ ‫ػ‬
‫ػ‬
‫تدرغبػشمػبتطوغرػاضطثالػاضدابقػضتطرغرػاضطصفوسةػرضىػداضةػسررغةػضطابعتكاػشبلػوبعدػ‬
‫اضترتغب‪ .‬ػ‬
‫ػ‬
‫تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضظفسػاضطثالػاضدابقػحغثػشمػبتطرغرػاضطصفوسهػرضىػ‬
‫داضةػسررغةػثمػشمػباغجادػاضرشمػاالصبرػسغكاػثمػشمػبارجارهػاضىػاضداضةػاضفررغةػثمػاطبعهػرضىػ‬
‫اضذاذةػطدػجطلػتوعغحغةػ‪ .‬ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ٕ٘بن ثق اٌقٍّ‪١‬بد رغٍت اسزمااَ اٌخ رم‪ َٛ‬ثبسدزافبء ٔفسد‪ٙ‬ب ِدٓ اعدً رؾم‪١‬دك فٍّ‪١‬دخ ِقٍ‪ٕ١‬دٗ ؽ‪١‬دش اْ اخدً عسدُ اٌااٌدخ ‪٠‬دزُ‬
‫اسزافبء اٌااٌخ ٔفس‪ٙ‬ب ثم‪ِ ُ١‬قبِالد عا‪٠‬اٖ ٌٕبخذ ِضال يىمٖ اٌّضم‪ٚ‬ة ِدضال يفىمردٗ رمد‪ٛ‬ي ثدبْ اٌدملُ اٌّدما ؽسدبة ِضدم‪ٚ‬ثٗ‬
‫٘‪ ٛ‬فجبسٖ فٓ فٍّ‪١‬خ ِزىمسٖ ٌٕفس اٌملُ ِضم‪ٚ‬ة ي‪ٔ ٟ‬فسٗ ‪ٚ‬ي‪ ٟ‬وً ِمٖ ٔغمػ ِٓ ‪ٚ‬اؽا ‪ ،‬أ‪ ٞ‬إٔب ٌ‪ ٛ‬اس ٔب ؽسبة ِضدم‪ٚ‬ة‬
‫اٌملُ ‪ِ 3‬ضال يٕم‪ َٛ‬ثضمة اٌملُ ِـ اٌملُ اٌذ‪٠ ٞ‬سجمخ صُ ثضمة إٌبرظ ِـ اٌملُ اٌذ‪٠ ٞ‬سجمٗ ‪٘ٚ‬ىذا ؽز‪ٔ ٝ‬صً اٌ‪ ٝ‬اٌملُ ‪. 1‬‬
‫ػ‬
‫طثالػاصتبػبرظاطجػبغضةػاضديػبضسػبضسػضطبارةػاالردادػطنػالػ‪111‬ػ–ػ‪51‬ػبفصرةػاالدتدراءػاضذاتيػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس ي‪ ٟ‬اٌّمغـ اٌجمِغ‪ B ٟ‬لّٕب ثجٕبء اٌدخ ربخدذ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫ل‪ّ١‬خ ِٓ إٌ‪ٛ‬ؿ اٌقا ‪ ٞ‬اٌصؾ‪١‬ؼ صُ لّٕب ث‪ٛ‬ضـ حمط ‪ ً٘ ٛ٘ٚ‬ل‪ّ١‬دخ‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬ ‫اٌّز‪ ١‬م ‪ x‬اوجدما‪ ٚ‬رسدب‪ 55 ٞٚ‬يدبذا رؾمدك اٌةدمط ‪٠‬دزُ عجبفدخ ل‪ّ١‬دخ‬
‫‪4.‬‬ ‫) ‪void print (int x‬‬ ‫اٌّز ‪١‬م ‪ x‬صدُ يد‪ ٟ‬اٌمغد‪ ٖٛ‬سلدُ ‪ 9‬لّٕدب ثبسدزافبء اٌااٌدخ ِدمٖ اخدم‪ٜ‬‬
‫‪5.‬‬ ‫{‬ ‫‪ٌٚ‬ىٓ ثم‪ّ١‬خ ‪ x-1‬ي‪ٕٙ‬ب ‪٠‬زُ اسزافبء اٌااٌخ ِمٖ اخم‪ ِٓ ٜ‬اخدً ٔفدس‬
‫‪6.‬‬ ‫)‪if (x>=50‬‬ ‫اٌااٌخ اٌّزاف‪ٌٚ ٗ١‬ىٓ ثم‪ّ١١‬دٗ عا‪٠‬داٖ ‪٘ٚ‬د‪ x-1 ٟ‬يف‪ٙ١‬دب ‪٠‬زؾمدك اٌةدمط‬
‫‪7.‬‬ ‫{‬ ‫ي‪١‬غجـ ل‪ّ١‬دٗ ‪ x-1‬صدُ ‪٠‬سدزاف‪ٔ ٟ‬فدس اٌااٌدٗ ِدمٖ اخدم‪ ٜ‬ثم‪ّ١‬دٗ عا‪٠‬داٖ‬
‫‪8.‬‬ ‫;‪cout << x << endl‬‬ ‫‪ٚ‬رجمدد‪٘ ٝ‬ددذٖ اٌقٍّ‪١‬ددخ ِسددزّمٖ ؽزدد‪ٔ ٝ‬ص دً اٌدد‪ ٝ‬ل‪ّ١‬ددٗ ‪ x‬الددً ِددٓ ‪55‬‬
‫‪9.‬‬ ‫;)‪print (x-1‬‬ ‫ي‪١‬مددمط اٌجمٔددبِظ ِددٓ فٍّ‪١‬ددخ االسددزافبء اٌددذار‪٘ ٟ‬ددذا ‪٠ٚ‬قدد‪ٌ ٛ‬زٕف‪١‬ددذ‬
‫‪10.‬‬ ‫}‬ ‫اٌغٍّٗ اخً اٌااٌخ اٌمج‪١‬س‪١‬خ ثقا اٌااٌخ اٌّسزاف‪١‬خ ‪.‬‬
‫‪11.‬‬ ‫}‬
‫‪12.‬‬ ‫‪//------------------------------A‬‬
‫‪13.‬‬ ‫) ( ‪void main‬‬
‫‪14.‬‬ ‫{‬
‫‪15.‬‬ ‫;)‪print (100‬‬
‫‪16.‬‬ ‫;) ( ‪getch‬‬
‫‪17.‬‬ ‫}‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػبفصرهػاالدتدراءػاضذاتيػضتطرغرػرشمػرضىػداضةػسررغةػبحغثػغتمػ‬
‫ادخاضهػطنػاضطدتخدمػسيػاضداضةػاضرئغدغةػوعوػطنػاضظوعػاضعدديػاضصحغحػوذضكػضحدابػطعروبهػ‪ .‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫‪//------------------------------B‬‬
‫‪4.‬‬ ‫) ‪int multiplic (int x‬‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫)‪if (x==0‬‬
‫‪7.‬‬ ‫;‪return 1‬‬
‫‪8.‬‬ ‫‪else‬‬
‫‪9.‬‬ ‫;)‪return x*=multiplic (x-1‬‬
‫‪10.‬‬ ‫}‬
‫‪11.‬‬ ‫‪//------------------------------A‬‬
‫‪12.‬‬ ‫) ( ‪void main‬‬
‫‪13.‬‬ ‫{‬
‫‪14.‬‬ ‫;‪int x‬‬
‫‪15.‬‬ ‫;"‪cout << "Enter your number :‬‬
‫‪16.‬‬ ‫;‪cin >> x‬‬
‫‪17.‬‬ ‫;)‪multiplic (x‬‬
‫‪18.‬‬ ‫;) ( ‪getch‬‬
‫‪19.‬‬ ‫}‬

‫ػ‬
‫تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػاالردادػاضزوجغةػاضطحصورهػبغنػ‪111-1‬ػسصرهػاالدتدراءػاضذاتيػ‬
‫صلػرشمػرضىػدطرػ‪ .‬ػ‬
‫ػ‬
‫تدرغبػ‪:‬ػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػبادتخدامػسصرهػاالدتدراءػاضذاتيػالدخالػرشمػطنػاضطدتخدمػثمػطررػ‬
‫عذاػاضرشمػرضىػداضةػضطبارتهػرددػطراتػشغطتةػ‪ .‬ػ‬
‫ػ‬
‫تدرغبػاصتبػبرظاطجػبفصرهػاالدتدراءػاضذاتيػضحدابػطجطوعػاالرشامػبغنػ‪11-1‬ػثمػاطبدػاضظاتجػسيػاضداضةػ‬
‫اضرئغدغةػ‪ .‬ػ‬
‫ػ‬
‫تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػاالرشامػاضفردغةػبغنػ‪11-1‬ػبفصرهػاالدتدراءػاضذاتيػ ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫٘ذا ٘‪ ٛ‬اٌّقبًِ اٌضالص‪ ٟ‬اٌ‪ٛ‬ؽ‪١‬ا اٌّ‪ٛ‬ع‪ ٛ‬اخً ٌ خ اٌس‪ ٛ٘ٚ ٟ‬فٍ‪ ٝ‬اٌص‪ ١‬خ اٌزبٌ‪١‬خ ‪:‬‬
‫; ‪(x>y)? 7 : 10‬‬
‫اٌزفس‪١‬م ‪ ٛ٘ٚ‬اذا وبٔذ ل‪ّ١‬خ ‪ x‬اوجم ِٓ ل‪ y ّٗ١‬يّب ثقا فالِخ االسزف‪ٙ‬بَ ٘‪ ٛ‬اذا وبْ اٌغ‪ٛ‬اة ٔقُ ‪ِٚ‬ب ثقا إٌمغزبْ اٌمجس‪١‬زبْ‬
‫٘‪ ٛ‬اذا وبْ ع‪ٛ‬اة اٌةمط ال ‪.‬‬

‫طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالخالػرشطغنػطنػاضطدتخدمػثمػاطبدػاضرشمػاالصبرػبغظكمػبفصرهػ‬
‫اضطعاطلػاضذرطيػاضثالثيػ‪ :‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫ػ‬
‫‪3.‬‬ ‫‪//------------------------------A‬‬ ‫ػ‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬ ‫ػ‬
‫‪6.‬‬ ‫;‪int x,y‬‬ ‫ػ‬
‫‪7.‬‬ ‫;"‪cout << "Enter your number :‬‬
‫ػ‬
‫‪8.‬‬ ‫;‪cin >> x‬‬
‫‪9.‬‬ ‫; " ‪cout << "Enter your secand number :‬‬ ‫ػ‬
‫‪10.‬‬ ‫;‪cin >> y‬‬ ‫ػ‬
‫‪11.‬‬ ‫;‪int max=(x>y)? x : y‬‬
‫‪12.‬‬ ‫; ‪cout << "The max is : " << max‬‬ ‫ػ‬
‫‪13.‬‬ ‫;) ( ‪getch‬‬ ‫ػ‬
‫‪14.‬‬ ‫}‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ظفسػاضطثالػبادتخدامػداضةػسررغةػ‪ :‬ػ‬
‫ػ‬
‫‪1.‬‬ ‫>‪#include <iostream.h‬‬ ‫ػ‬
‫‪2.‬‬ ‫>‪#include <conio.h‬‬ ‫ػ‬
‫‪3.‬‬ ‫‪//---------------------------- B‬‬
‫‪4.‬‬ ‫)‪int max (int x,int y‬‬ ‫ػ‬
‫‪5.‬‬ ‫{‬ ‫ػ‬
‫‪6.‬‬ ‫;‪return (x>y)? x : y‬‬
‫ػ‬
‫‪7.‬‬ ‫}‬
‫‪8.‬‬ ‫‪//------------------------------A‬‬ ‫ػ‬
‫‪9.‬‬ ‫) ( ‪void main‬‬ ‫ػ‬
‫‪10.‬‬ ‫{‬
‫‪11.‬‬ ‫;‪int x,y‬‬ ‫ػ‬
‫‪12.‬‬ ‫;"‪cout << "Enter your number :‬‬ ‫ػ‬
‫‪13.‬‬ ‫;‪cin >> x‬‬
‫ػ‬
‫‪14.‬‬ ‫; " ‪cout << "Enter your secand number :‬‬
‫‪15.‬‬ ‫;‪cin >> y‬‬ ‫ػ‬
‫‪16.‬‬ ‫; )‪cout << "The max is : " << max (x,y‬‬ ‫ػ‬
‫‪17.‬‬ ‫;) ( ‪getch‬‬
‫‪18.‬‬ ‫}‬ ‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اضترصغب ٘‪ ٛ‬فجبسح فٓ ِمغـ ثمِغ‪٠ ٟ‬صف ح‪ٟ‬ء ِق‪ ، ٓ١‬ؽ‪١‬دش ‪٠‬زىد‪ِ ْٛ‬دٓ أٔد‪ٛ‬اؿ ِمزٍفدخ ِدٓ اٌج‪١‬بٔدبد ‪ ،‬وبألفداا‬
‫اٌصؾ‪١‬ؾخ أ‪ ٚ‬اٌؾم‪١‬م‪١‬خ أ‪ ٚ‬اٌؾم‪ ٚ‬ا‪ ٚ‬اٌسالسً اٌمِز‪٠‬خ ا‪ِ ٚ‬ز‪٠‬ظ ِٕ‪ّٙ‬ب ‪ٚ ،‬غ‪١‬م٘ب ِٓ أ‪ٛ‬اؿ اٌّز ‪١‬ماد ‪ ،‬وٍ‪ٙ‬ب ي‪ ٟ‬لبٌدت ‪ٚ‬اؽدا ‪،‬‬
‫أ‪ ٞ‬اْ اٌزمو‪١‬ت ٘‪ ٛ‬فجبسح فٓ لبٌت ‪٠‬ؾز‪ ٞٛ‬فٍ‪ٔ ٝ‬د‪ٛ‬ؿ أ‪ ٚ‬اوضدم ِدٓ أد‪ٛ‬اؿ اٌّز ‪١‬دماد ‪ ،‬فية‪ ٚ‬فنةظ اىَصةف٘فبد اىزة‪ ٜ‬رحزة٘‪ٛ‬‬
‫في‪ ٚ‬فْبصش ٍِ ّفظ اىْ٘ؿ ‪٘ٚ ،‬ذا ا ‪ ٜ‬اٌ‪ ٝ‬اٌىض‪١‬م ِٓ اٌّم‪ٔٚ‬خ ي‪ ٟ‬اٌجمِغخ ثٍ خ اٌس‪ٚ ٟ‬اٌس‪ ٟ‬ثٍس ثٍس ‪.‬‬
‫رم‪ ً١‬فز‪٠‬ز‪ ٞ‬اٌااس ٌ‪ ٛ‬أس د رصّ‪ ُ١‬ثمٔبِظ ؽبس‪ٛ‬ث‪ٌّ ٟ‬ؾً أ ‪ٚ‬اد رٕؾ‪١‬ف ‪ ،‬يى‪١‬ف سززقبًِ ِـ ٘ذٖ اٌّ‪ٛ‬ا إذا ودبْ‬
‫ٌىً ِب ح ( اعٌ ٗرةشمخ ٍصةْقٔ ٗعةقش ٗظجةٌ ٗغ‪ٞ‬شٕةب ‪ ،‬يّدٓ اٌصدقت فٍ‪ٕ١‬دب أْ ٔسدزماَ اٌّصدف‪ٛ‬يبد ٌزمدز‪ ٓ٠‬ث‪١‬بٔدبد ٘دذٖ‬
‫اٌّ‪ٛ‬ا ‪ ،‬الْ اٌّصف‪ٛ‬يخ ال ‪ّ٠‬ىٓ أْ رؾز‪ ٞٛ‬فٍ‪ ٝ‬أٔ‪ٛ‬اؿ ِمزٍفخ ِٓ اٌج‪١‬بٔبد ‪ٕ٘ٚ ،‬ب عبءد اٌزماو‪١‬ت ٌزقبٌظ ٌٕدب ٘دذا األِدم ‪ ،‬فٕدب‬
‫ٔأخذ ِضبال ٌ‪ ٛ‬وبْ ٌا‪٠‬ه صٕف ِدٓ ِد‪ٛ‬ا اٌزٕؾ‪١‬دف ‪٘ٚ‬د‪" ٛ‬اٌةدبِج‪ِ "ٛ‬دضال ‪ٚ‬ودبْ ٌ‪ٙ‬دذا اٌصدٕف أوضدم ِدٓ خبصد‪١‬خ ِضدً ‪ :‬اٌسدقم‬
‫‪ٚ‬اٌؾغُ ‪ٚ‬االسُ ‪ٔٚ‬ىزف‪ ٟ‬ثذٌه ‪ ،‬يّبذا سدٕفقً ‪ٚ‬و‪١‬دف سدٕزقبًِ ِدـ ٘دذا اٌصدٕف " اٌةدبِج‪ " ٛ‬اخدً ثمٔبِغٕدب اٌؾبسد‪ٛ‬ث‪٘ ، ٟ‬دً‬
‫سٕقم وً ِٓ اٌسقم وّز ‪١‬م ‪ٚ‬االسُ وّز ‪١‬م ‪ٚ‬اٌؾغُ وّز ‪١‬م ‪٘ ،‬ذا ٌ‪ ٛ‬وبْ ٌا‪ٕ٠‬ب يمظ ٔ‪ٛ‬ؿ ‪ٚ‬اؽا ِٓ اٌصٕف حبِج‪ ، ٛ‬يّبذا ٌ‪ٛ‬‬
‫وبْ ٌا‪ٕ٠‬ب فةمح أٔ‪ٛ‬اؿ ِٓ ٔفس اٌصٕف ‪ ً٘ ،‬سٕم‪ َٛ‬ثزقم‪٠‬ف ِز ‪١‬ماد عا‪٠‬اح ٌىً ٔ‪ٛ‬ؿ ِٓ ٘ذا اٌصٕف ُِّّّ ‪ِٚ ،‬دبذا ٌد‪ ٛ‬ودبْ‬
‫ٌا‪ٕ٠‬ب ِ‪ٛ‬ا رٕؾ‪١‬ف اخم‪ٚ ، ٜ‬ثأفاا ‪ٚ‬أ‪ٛ‬اؿ ا‪٠‬ضب ‪ ،‬فٕا٘ب س‪١‬صجؼ اٌى‪ ٛ‬اٌجمِغ‪ِ ٟ‬قما عاا ‪ ،‬ؽ‪١‬ش ال ‪ّ٠‬ىٓ رزجقٗ ‪ٚ‬سثّدب ا‪٠‬ضدب‬
‫‪٠‬صقت وزبثزٗ ‪ ،‬اذا ٘ذٖ اٌغم‪٠‬مدخ ال رصدٍؼ ‪ٚ‬ال ثدب‪ ٞ‬حدىً ِدٓ االحدىبي السدزمااِ‪ٙ‬ب يد‪ ٟ‬ثمٔبِغٕدب ‪ٕ٘ٚ ،‬دب ‪ٚ‬يدمد ٌٕدب ٌ دخ اٌسد‪ٟ‬‬
‫‪ٚ‬اٌس‪ ٟ‬ثٍس ثٍس يٌ‪ ٗ١‬اوضم ِم‪ٔٚ‬خ ٌجٕبء اٌجمٔبِظ ‪ ٟ٘ٚ‬اٌزماو‪١‬ت ‪ِّ ،‬ب س‪ ًٙ‬فٍ‪ٕ١‬ب اٌىض‪١‬م اٌىض‪١‬دم يد‪٘ ٟ‬دذا اٌّغدبي ؽ‪١‬دش اصدجؾذ‬
‫اٌجمِغخ رزغٗ ٔؾ‪ ٛ‬اٌجمِغخ اٌىبجٕ‪١‬خ " اٌة‪١‬ئ‪١‬خ "‪.‬‬

‫أ‪ ٞ‬اْ ٔغقً وً ح‪ٟ‬ء اخً اٌجمٔبِظ فجبسح فٓ وبجٓ ‪٠ ،‬ؾًّ وً اٌمصبج اٌمبصخ ثبٌة‪ٟ‬ء ٔفسٗ يد‪ ٟ‬لبٌدت ‪ٚ‬اؽدا ‪،‬‬
‫أ‪ ٞ‬اْ ‪٠‬ؾز‪٘ ٞٛ‬ذا اٌىبجٓ فٍ‪ ٝ‬أ‪ٛ‬اؿ ِمزٍفخ ِٓ اٌج‪١‬بٔبد وبٌسالسدً اٌمِز‪٠‬دخ ‪ٚ‬االفداا اٌصدؾ‪١‬ؾخ ‪ٚ‬غ‪١‬م٘دب ‪ٚ ،‬اٌىدبجٓ وّدب رقٍدُ‬
‫فز‪٠‬ز‪ ٞ‬اٌااس ٘‪ ٛ‬وً ح‪ٟ‬ء ؽم‪١‬م‪ ٌٗ ٟ‬خصبج يبٌس‪١‬بسح ِضال ٘‪ ٟ‬فجبسح فٓ وبجٓ ‪ ِٓٚ‬خصبجص‪ٙ‬ب إٌد‪ٛ‬ؿ ‪ٚ‬اٌّ‪٠ ٛ‬دً ‪ٚ‬اٌٍد‪ْٛ‬‬
‫اٌ‪ ٝ‬يخمٖ ‪ٚ ،‬اٌؾبس‪ٛ‬ة ا‪٠‬ضب ٘‪ ٛ‬فجبسح فٓ وبجٓ ‪ ِٓٚ‬خصبجصٗ اٌسمفخ ‪ٚ‬إٌ‪ٛ‬ؿ ‪ٚ‬اٌسدقٗ ‪ٚ‬اٌةدموخ اٌّصدٕقخ ‪ .....‬اٌدخ ‪ٕ٘ٚ ،‬دب‬
‫ي‪ ٟ‬ثمٔبِغٕب اٌمبص ثّؾً ا ‪ٚ‬اد اٌزٕؾ‪١‬ف ‪ّ٠‬ىٓ اْ ٔغقً اٌةبِج‪ ٛ‬فجدبسح فدٓ ودبجٓ ‪ ،‬الْ ٌدٗ خصدبج فبِدٗ ِضدً ‪ :‬االسدُ‬
‫‪ٚ‬اٌسقم ‪ٚ‬اٌؾغُ ‪ٚ‬غ‪١‬م٘ب ‪ ،‬ؽ‪١‬ش اْ ٘دذا اٌمصدبج ِةدزموٗ يد‪ ٟ‬عّ‪١‬دـ أد‪ٛ‬اؿ اٌةدبِج‪ٚ ٛ‬ودذٌه ا‪٠‬ضدب ٌد‪ ٛ‬ودبْ ٌدا‪ٕ٠‬ب ِٕؾفدبد‬
‫اخم‪ ٜ‬سٕزجـ ٔفس اٌغم‪٠‬مخ ‪.‬‬

‫اضفرقػبغنػاضبرطجةػاإلجرائغةػواضبرطجةػاضذغئغةػ"ػاضصغظوظغة" ػ‬
‫ػ‬
‫ٔىزت و‪ ٛ‬ثمِغ‪ ٟ‬ثبسزمااَ اٌجمِغخ اإلعماج‪١‬خ وّب رقٍّذ سبثمب ٌٍصٕف حبِج‪٠ٚ ٛ‬ى‪٘ ْٛ‬ىذا ‪:‬‬ ‫فٕب فز‪٠‬ز‪ ٞ‬اٌااس‬

‫>‪1. #include <iostream.h‬‬


‫>‪2. #include <conio.h‬‬
‫) ( ‪3. void main‬‬
‫{ ‪4.‬‬
‫;] ‪5. char shampo_name [ 20‬‬
‫; ‪6. float shamop_price‬‬
‫;]‪7. char shampo_size [20‬‬
‫;) ( ‪8. getch‬‬
‫} ‪9.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس اْ إٌ‪ٛ‬ؿ اال‪ٚ‬ي ِٓ اٌصدٕف حدبِج‪ ٛ‬اؽزدبط اٌد‪ِ 3 ٝ‬ز ‪١‬دماد اصٕدبْ ِٕ‪ٙ‬دب ٘د‪ِ ٛ‬دٓ إٌد‪ٛ‬ؿ اٌسٍسدٍخ‬
‫اٌمِز‪٠‬خ ‪ٚ‬االخم ٘‪ٛٔ ِٓ ٛ‬ؿ اٌقا اٌؾم‪١‬م‪ ، ٟ‬يٍ‪ ٛ‬اس ٔب رقم‪٠‬ف ٔ‪ٛ‬ؿ اخدم ِدٓ اٌةدبِج‪ ٛ‬يسدٕؾغز يد‪ ٟ‬ذاودمٖ اٌؾبسد‪ٛ‬ة ِز ‪١‬دماد‬
‫اخم‪ٌ ٜ‬ذٌه يٍ‪ ٛ‬وبْ ٌا‪ٕ٠‬ب اوضم ِٓ ‪ 15‬أ‪ٛ‬اؿ ِٓ اٌةبِج‪ِ ٛ‬بذا سٕفقً ؟؟ يمثّب ‪٠‬مغم ثجبٌه يىمٖ ‪ ٟ٘ٚ‬اْ ٔقم ٘دذا اٌصدٕف‬
‫اخً ِصف‪ٛ‬يٗ ‪ٌٚ‬ىٓ اٌّصف‪ٛ‬يخ ال ‪ّ٠‬ىٓ اْ رؾز‪ ٞٛ‬فٍ‪ ٝ‬اوضم ِٓ ٔ‪ٛ‬ؿ ي‪ٔ ٟ‬فس اٌ‪ٛ‬لذ ِٓ أ‪ٛ‬اؿ اٌّز ‪١‬دماد ي‪ٙ‬د‪ ٟ‬اِدب اْ رىد‪ْٛ‬‬
‫ِصددف‪ٛ‬يٗ افدداا صددؾ‪١‬ؾٗ ا‪ ٚ‬افدداا ؽم‪١‬م‪١‬ددٗ ا‪ ٚ‬سالسددً سِز‪٠‬ددٗ اٌدد‪ ٝ‬اخددمٖ ‪ٚ ،‬سثّ دب ‪٠‬مغددم ثجبٌدده يىددمٖ اخددم‪٘ٚ ٜ‬دد‪ ٟ‬اْ ٔقددم‬
‫ِصف‪ٛ‬يٗ ٌألسّبء ‪ِٚ‬صف‪ٛ‬يٗ ٌألٔ‪ٛ‬اؿ ‪ِٚ‬صف‪ٛ‬يٗ ٌٍسقم ‪ٕ٘ٚ‬ب رىّٓ اٌّةىٍخ ‪ ،‬اْ خصبج اٌصٕف اٌ‪ٛ‬اؽا رىد‪ِٛ ْٛ‬زفدٗ ثدأوضم‬
‫ِٓ ِىبْ ٘ذا ي‪ ٟ‬ؽبي وبْ ٌا‪ٕ٠‬ب صٕف ‪ٚ‬اؽا يّب ثبٌه ٌ‪ ٛ‬وبْ ٌ ا‪ٕ٠‬ب اصدٕب اخدم‪ِ ٜ‬دٓ ِد‪ٛ‬ا اٌزٕؾ‪١‬دف ‪ٚ‬لز‪ٙ‬دب سزصدجؼ اٌجمِغدخ‬
‫ِقماٖ عاا ‪.‬‬
‫‪ٕ٘ٚ‬ب ‪ٚ‬يمد ٌٕب ٌ خ اٌس‪ ٟ‬اٌزماو‪١‬ت ٌؾً ٘ذا اٌّةىٍخ ‪.‬‬

‫اضبرطجةػاضذغئغةػاوػاضبرطجةػاضصائظغة ػ‬

‫‪ٚ‬اٌزماو‪١‬ت ٌ‪ٙ‬ب وٍّخ ِؾغ‪ٛ‬زح ي‪ ٌ ٟ‬خ اٌس‪ٚ ٟ‬اٌس‪ ٟ‬ثٍس ثٍس ‪ٚ " struct " ٟ٘ٚ‬رىزت ثقا رضّ‪ ٓ١‬اٌّىزجبد ي‪ ٟ‬ثاا‪٠‬خ‬
‫اٌجمٔدبِظ ِجبحدمح أ‪ ٞ‬ثقدا " ‪ٚ " #include ….‬لجدً اٌااٌدخ اٌمج‪١‬سد‪١‬خ " ) ( ‪ٚ " main‬ثئِىبٕٔدب وزبثز‪ٙ‬دب اخدً اٌااٌدخ‬
‫اٌمج‪١‬س‪١‬خ ‪ main‬ا‪ ٚ‬اٌا‪ٚ‬اي اٌفمف‪١‬خ فٕا اٌؾبعٗ الٔةبء وبجٓ ِٓ ٔفس اٌزمو‪١‬ت ‪ ،‬الؽؼ اٌةىً اٌزبٌ‪: ٟ‬‬
‫>‪# include <…….h‬‬
‫‪# ….‬‬
‫‪struct struct_name‬‬
‫‪ : struct‬اٌىٍّخ اٌّؾغ‪ٛ‬زح اٌمبصخ ثبٌزماو‪١‬ت ‪.‬‬
‫) ( ‪void main‬‬ ‫‪ : struct_name‬اسُ اٌزمو‪١‬ت ‪.‬‬
‫{‬ ‫}‬

‫اٍب االُ عْبر‪ ٜ‬اى‪ ٚ‬م‪ٞ‬ف‪ٞ‬خ رقش‪ٝ‬ف ٗثْب جغٌ اىزشم‪ٞ‬ت ٗرىل إلّشب اىنبئْبد ٍْٔ ‪:‬‬

‫بظاءػاضترصغب ػ‬
‫ػ‬
‫> ‪#include < ___________ .h‬‬ ‫فٕدداِب ٔم‪٠‬ددا رقم‪٠‬ددف أ‪ ٞ‬رمو‪١‬ددت ‪٠‬غددت اْ ٔىزددت اٌىٍّ دخ اٌّؾغدد‪ٛ‬زح‬
‫> ‪#include < ___________ .h‬‬
‫> ‪#include < ___________ .h‬‬ ‫اٌمبصخ ثٗ ‪ ٟ٘ٚ‬وٍّخ " ‪٠ٚ " struct‬غت اْ رىزت ثؾم‪ ٚ‬صد ‪١‬مٖ‬
‫‪ٌٚ‬دد‪١‬س وج‪١‬ددمح صددُ ٔىزددت ثقددا٘ب ِجبحددمح اسددُ اٌزمو‪١‬ددت اٌددذ‪ٔ ٞ‬م‪٠‬ددا ثٕبجددٗ‬
‫اعٌ اىزشم‪ٞ‬ت اىز‪ّ ٛ‬ش‪ٝ‬ذ ثْبئٔ ‪1. struct‬‬ ‫‪ٚ‬ثئِىبٕٔب اْ ٔضـ أ‪ ٞ‬اسُ ٌٍزمو‪١‬دت ثةدمط اْ ‪٠‬مافد‪ ٝ‬يد‪ ٟ‬ذٌده حدم‪ٚ‬ط‬
‫{ ‪2.‬‬ ‫رقم‪٠‬ف اٌّز ‪١‬ماد ‪ ،‬وّب ‪: ٍٟ٠‬‬
‫أ‪ٛ‬اؿ اٌّز ‪١‬ماد ِـ اسّبج‪ٙ‬ب ; ‪3. ………………….‬‬ ‫‪ .1‬اْ ال ‪٠‬ى‪ ْٛ‬ي‪ ٟ‬ثاا‪٠‬خ اسُ اٌزمو‪١‬دت اسلدبَ ثبفزجدبس االسدُ ِز ‪١‬دم‬
‫; ‪4. ………………….‬‬ ‫صبثذ ‪٠ٚ‬غت اٌمض‪ٛ‬ؿ اٌ‪ ٝ‬ل‪ٛ‬أ‪ ٓ١‬رقم‪٠‬ف اٌّز ‪١‬ماد ‪.‬‬
‫; ‪5. ………………….‬‬
‫; ‪6. ………………….‬‬ ‫‪ٚ .2‬وذٌه اْ ال ‪٠‬ى‪ٕ٘ ْٛ‬بن ِسبيٗ ث‪ ٓ١‬اسُ اٌزمو‪١‬ت اذا وبْ اوضم‬
‫; ‪7. ………………….‬‬ ‫ِددٓ وٍّددٗ ي‪١‬غددت اْ ٔضددـ ِىددبْ اٌفددماك أدداس سددى‪ٛ‬س " _ "‬
‫أ‪ٛ‬اؿ اٌّز ‪١‬ماد ِـ اسّبج‪ٙ‬ب ; ‪8. ………………….‬‬ ‫‪ٚ‬ثا‪ ْٚ‬أ‪ِ ٞ‬سبيٗ ال لجٍ‪ٙ‬ب ‪ٚ‬ال ثقا٘ب ‪.‬‬
‫; } ‪9.‬‬ ‫‪ .3‬اْ ال ‪٠‬ىدد‪ ْٛ‬اسددُ اٌزمو‪١‬ددت اؽددا اٌىٍّددبد اٌّؾغدد‪ٛ‬زح ٌٍ ٍددخ ِضددً‬
‫) ( ‪void main‬‬ ‫‪ new‬ا‪ٚ ....... delete ٚ‬غ‪١‬م٘ب ‪ٚ ،‬اذا اس ٔب اْ ٔسزماَ ٔفدس‬
‫{‬ ‫اٌىٍّددبد اٌّؾغدد‪ٛ‬زح ِضددً ‪ِ new‬ددضال ٔىزج‪ٙ‬ددب ‪٠ٚ‬زجق‪ٙ‬ددب ِجبحددمٖ‬
‫االٔاس سى‪ٛ‬س ا‪ٔ ٚ‬ضـ ِق‪ٙ‬ب اسلبَ ا‪ ٚ‬وٍّٗ اخم‪.ٜ‬‬
‫}‬
‫رنو ‪- 1 -‬‬
‫‪ .4‬اْ ال ‪٠‬ى‪ ْٛ‬ي‪ ٟ‬اسُ اٌّز ‪١‬دم أ‪ ٞ‬سِدز خدبص ا‪ ٚ‬احدبسح ؽسدبث‪ٗ١‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ِضً ‪ .... ، . ، / ، = ، – ، + ، ! ، @ ، # ( :‬اىخ ‪ ،‬اال احبسح االٔاس سى‪ٛ‬س ي‪ِ ٟٙ‬سّ‪ٛ‬ؽٗ‪.‬‬


‫‪ .5‬اْ ال ‪٠‬ىدد‪ ْٛ‬اسددُ اٌزمو‪١‬ددت ٘دد‪ ٛ‬اؽددا اسددّبء ِز ‪١‬ددم رددُ رقم‪٠‬فددٗ ِسددجمب ا‪ ٚ‬اْ ‪٠‬ىدد‪٘ ْٛ‬دد‪ ٛ‬اسددُ ٌااٌددخ أ‪ ٞ‬اْ ال ‪٠‬ىدد‪ ْٛ‬االسددُ‬
‫ِسزماَ ِسجمب ‪.‬‬

‫صُ ٔم‪ َٛ‬ثفزؼ ؽ‪ٛ‬اصم } { ٌٍزقج‪١‬م فٓ ثاا‪٠‬خ اٌزمو‪١‬ت ‪ٙٔٚ‬ب‪٠‬زٗ وّدب يد‪ ٟ‬خغد‪ٛ‬ح ‪ٚ ، 9 ٚ 2‬وّدب ٘د‪ ٟ‬يد‪ ٟ‬اٌّضدبي اٌجاا‪٠‬دخ ثبرغدبٖ‬
‫اٌ‪ٚ ٓ١ّ١‬إٌ‪ٙ‬ب‪٠‬خ ثبرغبٖ اٌ‪١‬سبس ‪ٚ‬ذٌه ٌجٕبء عسُ اٌزمو‪١‬ت ‪.‬‬
‫صُ ٔم‪ َٛ‬ث‪ٛ‬ضـ اىفبصيخ اىَْق٘عخ ثقا ٔ‪ٙ‬ب‪٠‬خ اٌزمو‪١‬ت ِجبحمٖ وّب ي‪ ٟ‬خغ‪ٚ 9 ٖٛ‬ثا‪ٙٔٚ‬ب خغأ ‪.‬‬
‫صُ ٔىزت اخً اٌزمو‪١‬ت أ‪ٛ‬اؿ اٌّز ‪١‬ماد اٌز‪ٔ ٟ‬م‪٠‬ا رقم‪٠‬ف‪ٙ‬ب فٍ‪ ٝ‬اخدزال أ‪ٛ‬اف‪ٙ‬دب صدُ اسدُ اٌّز ‪١‬دم ‪ ،‬ثشةشط اُ ال رحزة٘‪ٕ ٛ‬ةزٓ‬
‫اىَزغ‪ٞ‬شاد في‪ ٚ‬أ‪ ٛ‬ق‪ َٔٞ‬ثذائ‪ٞ‬خ ٗال ‪ٝ‬غْذ ىٖب أ‪ ٛ‬ق‪َٞ‬خ ٗقذ اىزقش‪ٝ‬ةف ‪ٍ ،‬ةـ ٍشافةبح اىشةشٗط اىقبٍةخ ىنزبثةخ اعةَب اىَزغ‪ٞ‬ةشاد‬
‫داخةو جغةٌ اىزشم‪ٞ‬ةت ‪ٚ ،‬ذٌده الْ اٌزمو‪١‬ددت ٘د‪ ٛ‬فجدبسح فدٓ لبٌددت سد‪١‬زُ فّدً فٕدٗ ٔسدخ ٌز‪ٛ‬س‪٠‬ض‪ٙ‬ددب ٌٍىبجٕدبد ‪ ،‬صدُ ٔضدـ اٌفبصددٍخ‬
‫إٌّم‪ٛ‬عخ ي‪ٙٔ ٟ‬ب‪٠‬خ اٌزقم‪٠‬ف اٌ‪ ٝ‬عّ‪١‬ـ اٌّز ‪١‬ماد وّب ي‪ ٟ‬اٌمغ‪ٛ‬اد اٌسبثمخ ِٓ ( ‪. 8 – 3‬‬
‫‪ٌٚ‬ىٓ ي‪ ٟ‬ؽبي اس ٔب اْ ٔضـ ل‪ ُ١‬ا‪ ٚ‬ف‪ٛ‬اًِ رٍمبج‪ٌٙ ٗ١‬ذٖ اٌّز ‪١‬ماد يئٕٔب ٔسزماَ اٌٗ رسّ‪ ٝ‬اٌجٕبء رؾًّ ٔفس اسُ اٌزمو‪١‬ت ‪ٚ‬يد‪ٟ‬‬
‫عسُ ٘ذٖ اٌااٌخ ٔضدـ اٌمد‪ ُ١‬اٌزد‪ٔ ٟ‬م‪٠‬دا اْ ٔسدٕا٘ب اٌد‪٘ ٝ‬دذٖ اٌّز ‪١‬دماد اٌّ‪ٛ‬عد‪ ٛ‬ح اخدً اٌزمو‪١‬دت ‪ ،‬ؽ‪١‬دش سد‪١‬زُ حدمؽ‪ٙ‬ب الؽمدب ‪.‬‬
‫‪٠ٚ‬ى‪ ْٛ‬حىٍ‪ٙ‬ب ٘ىذا ِضال ٌ‪ ٛ‬وبْ اسُ اٌزمو‪١‬ت ٘‪ " car "ٛ‬س‪١‬بسح ‪ٚ‬ثااخٍٗ ِز ‪١‬م اسّٗ ( ‪ٛٔ ِٓ a‬ؿ فا ؽم‪١‬م‪: ٟ‬‬

‫} ; ‪car ( ) { a = 0‬‬

‫‪ِٚ‬ب ‪٠‬غت فٍ‪١‬ه اْ رقميٗ فز‪٠‬ز‪ ٞ‬اٌااس ٕ٘ اُ مو ٍب ‪ٝ‬زٌ رقش‪ٝ‬فٔ داخو اىزشم‪ٞ‬ت ٕ٘ ٍزغ‪ٞ‬شاد فبٍٔ ‪ ،‬أ‪ّ٠ ٞ‬ىٓ اٌ‪ٛ‬ص‪ٛ‬ي ٌٗ‬
‫ِٓ أ‪ِ ٞ‬ىبْ ثبٌجمٔبِظ س‪ٛ‬اء اٌااٌخ اٌمج‪١‬س‪١‬خ ا‪ ٚ‬اٌفمف‪١‬خ ‪.‬‬

‫ٍثبه ‪ .1‬فشف رشم‪ٞ‬ت ىغبىت اعَٔ " ‪ٝ " student‬حز٘‪ ٛ‬في‪ ٚ‬اعٌ اىغبىت ٗسقَخ ٗفَشٓ ٍٗقذىٔ ؟‬

‫‪1. struct student‬‬ ‫ي‪ ٟ‬خغ‪ٛ‬ح ‪ 1‬وزجٕب اٌىٍّخ اٌّؾغ‪ٛ‬زح ٌٍزمو‪١‬ت صُ اسُ رمو‪١‬ت ‪ ٟ٘ٚ student ٛ٘ٚ‬ثبٌٍ‪ْٛ‬‬
‫{ ‪2.‬‬ ‫االزسق صُ ‪ٚ‬ضقٕب ؽ‪ٛ‬اصم اٌجاا‪٠‬خ ‪ٚ‬إٌ‪ٙ‬ب‪٠‬خ ٌىزبثخ عسُ اٌزمو‪١‬ت وّب ي‪ ٟ‬اٌمغ‪ٛ‬ح ‪، 7ٚ 2‬‬
‫اسُ اٌغبٌت ; ] ‪3. char st_name [ n‬‬ ‫ي‪ ٟ‬خغ‪ 3 ٖٛ‬وزجٕب ٔ‪ٛ‬ؿ اٌّز ‪١‬م اٌذ‪ٔ ٞ‬م‪٠‬ا ِقبٌغزٗ ‪٘ٚ‬د‪ ٛ‬اسدُ اٌغبٌدت ‪٠ٚ‬زىد‪ ْٛ‬االسدُ ِدٓ‬
‫; ‪4. int st_number‬‬ ‫سلُ اٌغبٌت‬ ‫سٍسٍٗ سِز‪ٌ ٗ٠‬ذٌه ‪٠‬غت اْ ٔسزماَ اٌّصف‪ٛ‬يبد اٌمِز‪٠‬خ ‪ٔٚ‬ضدـ ِىدبْ اٌؾدم ) ‪( n‬‬
‫; ‪5. float st_age‬‬ ‫فّم اٌغبٌت‬
‫; ‪6. float st_avg‬‬ ‫ِقاي اٌغبي‬
‫ع‪ٛ‬ي اٌسٍسٍخ اٌمِز‪٠‬خ ٌالسُ ؽست اٌغ‪ٛ‬ي اٌذ‪ ٞ‬رم‪٠‬اٖ وّب ي‪ ٟ‬خغ‪. 3 ٖٛ‬‬
‫; } ‪7.‬‬ ‫خغ‪ 4 ٖٛ‬سلُ اٌغبٌت ‪ ٛ٘ٚ‬فا صؾ‪١‬ؼ ‪ ، int‬الْ سلُ اٌغبٌت ال ‪ٛ٠‬عا ي‪ ٗ١‬وس‪ٛ‬س ‪.‬‬
‫رنو ‪- 2 -‬‬ ‫خغ‪ 5 ٖٛ‬فّم اٌغبٌت ‪ ٛ٘ٚ‬فدا ؽم‪١‬مد‪ float ٟ‬الْ فّدم اٌغبٌدت لدا ‪٠‬ؾزد‪ ٞٛ‬فٍد‪ٝ‬‬
‫وس‪ٛ‬س ِضً ‪. 23.5‬‬
‫خغ‪ِ 6 ٖٛ‬قاي اٌغبٌت ‪ ٛ٘ٚ‬فا ؽم‪١‬م‪ ، float ٟ‬الْ اٌّقاي لا ‪٠‬ؾز‪ ٞٛ‬فٍ‪ ٝ‬افةبس ‪.‬‬
‫صُ ٕٔ‪ ٟٙ‬رقم‪٠‬ف اٌزمو‪١‬ت وّب ي‪ ٟ‬خغ‪ٚ 7 ٖٛ‬ال ٕٔس‪ ٝ‬اٌفبصٍخ إٌّم‪ٛ‬عخ ثقا ٔ‪ٙ‬ب‪٠‬خ اٌؾبصمح ٌٍاالٌخ فٍ‪ ٝ‬أز‪ٙ‬بء اٌزمو‪١‬ت ‪.‬‬
‫ِب لّٕب ثئفاا ٖ فز‪٠‬ز‪ ٞ‬اٌااس ٘‪ ٛ‬ثٕبء رمو‪١‬ت ‪٠‬غّـ أ‪ٛ‬اؿ ِمزٍفخ ِٓ اٌج‪١‬بٔبد ي‪ٚ ٟ‬لذ ‪ٚ‬اؽا اِب االْ سٕم‪ َٛ‬ثئٔةبء اٌىبجٕبد‬
‫ِٓ ٘ذا اٌزمو‪١‬ت‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اظذاءػاضصائظاتػطنػاضتراصغب ػ‬
‫ػ‬
‫صغفغهػتورغثػطحتوغاتػاضترصغبػضضصائظاتػ‪:‬ػ ػ‬

‫ْٕبك امثش ٍِ عش‪ٝ‬قخ ىز٘س‪ٝ‬ث خصبئص اىزشم‪ٞ‬ت اى‪ ٚ‬اىنبئْبد ‪:‬‬


‫اعٌ اىزشم‪ٞ‬ت اىز‪ّ ٛ‬ش‪ٝ‬ذ ثْبئٔ ‪1. struct‬‬
‫{ ‪2.‬‬ ‫‪ .1‬ثئِىبٕٔددب اْ ٔضددـ ثقددا ٔ‪ٙ‬ب‪٠‬ددخ اٌزمو‪١‬ددت أ‪ ٞ‬ثقددا اٌؾبصددمح ‪ٚ‬لجددً‬
‫أ‪ٛ‬اؿ اٌّز ‪١‬ماد ِـ اسّبج‪ٙ‬ب ; ‪3. ………………….‬‬ ‫اٌفبصٍخ إٌّم‪ٛ‬عخ اسّبء اٌىبجٕبد اٌز‪ٔ ٟ‬م‪٠‬دا ر‪ٛ‬س‪٠‬ض‪ٙ‬دب اٌزمو‪١‬دت‬
‫أ‪ٛ‬اؿ اٌّز ‪١‬ماد ِـ اسّبج‪ٙ‬ب ; ‪4. ………………….‬‬ ‫ثىً ِؾز‪٠ٛ‬برٗ ؽ‪١‬ش ثئِىبٕٔب اْ ٔضـ وبجٓ ا‪ ٚ‬اوضدم ثةدمط اْ‬
‫; اعٌ اىنبئِ ‪ , ...... n‬اعٌ اىنبئِ‪ , 2‬اعٌ اىنبئِ‪5. } 1‬‬ ‫ٔضـ يبصٍٗ ثقا وً وبجٓ ‪١ٌٚ‬س يبصٍٗ ِٕم‪ٛ‬عٗ وّب ي‪ ٟ‬اٌّضبي‬
‫اٌّغب‪ٚ‬س ‪.‬‬
‫رنو ‪- 3 -‬‬

‫‪ .2‬عم‪٠‬مخ اخم‪ ٜ‬ثقا افاا اٌزمو‪١‬ت ثبسّٗ ‪ِٚ‬ؾز‪٠ٛ‬برٗ ‪ٔ ،‬ىزت يد‪ٟ‬‬


‫> ‪#include < ___________ .h‬‬
‫> ‪#include < ___________ .h‬‬ ‫اٌااٌخ اٌمج‪١‬سخ ‪ main‬اعٌ اىزشم‪ٞ‬ت ثٌ اعَب اىنبئْبد اٌز‪ٟ‬‬
‫> ‪#include < ___________ .h‬‬ ‫ٔم‪٠‬ا ر‪ٛ‬س‪٠‬ض‪ٙ‬ب ِؾز‪٠ٛ‬دبد اٌزمو‪١‬دت ِدـ ِسدبيٗ ثد‪ ٓ١‬اسدُ اٌزمو‪١‬دت‬
‫‪ٚ‬اٌىددبجٓ اال‪ٚ‬ي ‪ٚ ،‬ثئِىبٕٔددب اْ ٔقددم اوضددم ِددٓ وددبجٓ ثقددا اسددُ‬
‫اعٌ اىزشم‪ٞ‬ت اىز‪ّ ٛ‬ش‪ٝ‬ذ ثْبئٔ ‪1. struct‬‬ ‫اٌزمو‪١‬ددت ثةددمط اْ ٔضددـ يبصددٍٗ ثقددا وددً وددبجٓ ‪ٚ‬ثقددا رقم‪٠‬ددف‬
‫{ ‪2.‬‬ ‫عّ‪١‬ـ اٌىبجٕبد ٔضـ اٌفبصٍخ إٌّم‪ٛ‬عخ ‪ .‬وّب ي‪ ٟ‬اٌّضدبي سلدُ ‪4‬‬
‫أ‪ٛ‬اؿ اٌّز ‪١‬ماد ِـ اسّبج‪ٙ‬ب ; ‪3. ………………….‬‬
‫‪.‬‬
‫أ‪ٛ‬اؿ اٌّز ‪١‬ماد ِـ اسّبج‪ٙ‬ب ; ‪8. ………………….‬‬
‫; } ‪9.‬‬
‫‪ٚ‬وّدب ثئِىبٔده ا‪٠‬ضدب اْ رضدـ اٌىٍّدخ اٌّؾغد‪ٛ‬زح ‪ struct‬لجدً اسدُ‬
‫) ( ‪void main‬‬ ‫اٌزمو‪١‬ت اخً اٌااٌخ اٌمج‪١‬س‪١‬خ صُ رم‪ َٛ‬ثئٔةبء اٌىبجٕبد ٘ىذا ‪:‬‬
‫{‬ ‫)( ‪void main‬‬
‫; ‪ x1 , x2 , x3 , ……xN‬اعٌ اىزشم‪ٞ‬ت‬ ‫{‬
‫; ‪ x1 , x2 , x3 , ….. ,xn‬اعٌ اىزشم‪ٞ‬ت ‪struct‬‬
‫}‬
‫رنو ‪-4 -‬‬ ‫‪…..‬‬
‫‪…..‬‬
‫}‬

‫> ‪#include < ___________ .h‬‬


‫‪ٚ‬ال رٕس‪ ٝ‬اْ رضـ اٌفبصٍخ إٌّم‪ٛ‬عخ ثقا اخم وبجٓ لّذ ثئٔةبجٗ ‪.‬‬
‫اعٌ اىزشم‪ٞ‬ت اىز‪ّ ٛ‬ش‪ٝ‬ذ ثْبئٔ ‪1. struct‬‬
‫{ ‪2.‬‬ ‫‪ .3‬ثئِىبٕٔددب ا‪٠‬ضددب اٌدداِظ ثدد‪ ٓ١‬اٌغددم‪٠‬مز‪ٔٚ ٓ١‬ؾصددً فٍدد‪ ٝ‬عم‪٠‬مددخ‬
‫أ‪ٛ‬اؿ اٌّز ‪١‬ماد ِـ اسّبج‪ٙ‬ب ; ‪3. ………………….‬‬ ‫صبٌضخ وّب ‪:ٍٟ٠‬‬
‫أ‪ٛ‬اؿ اٌّز ‪١‬ماد ِـ اسّبج‪ٙ‬ب ; ‪8. ………………….‬‬ ‫اْ ٔقم ثق اٌىبجٕبد ثبٌغم‪٠‬مخ اال‪ٌٚ‬د‪ ٝ‬أ‪ ٞ‬ثقدا اٌؾبصدمح‬
‫; ‪9. } x1 , x2 , x3 , ….. xn‬‬ ‫ي‪ٙٔ ٟ‬ب‪٠‬خ اٌزمو‪١‬ت ‪ٚ‬لجً اٌفبصٍخ إٌّم‪ٛ‬عخ ‪ ،‬صُ ٔقم وبجٕبد‬
‫اخددم‪ٌ ٜ‬ز‪ٛ‬س‪٠‬ض‪ٙ‬ددب ٔفددس ِؾز‪٠ٛ‬ددبد اٌزمو‪١‬ددت ‪ٚ‬ذٌدده اخددً اٌااٌددخ‬
‫) ( ‪void main‬‬ ‫اٌمج‪١‬سدخ ) ( ‪ main‬ثةدمط اْ ٔىزدت اسدُ اٌزمو‪١‬دت ا‪ٚ‬ال صدُ‬
‫{‬
‫; ‪ y1 , y2 , y3 , ……yN‬اعٌ اىزشم‪ٞ‬ت‬ ‫اٌىبجٕبد ‪ٚ‬اْ ال رى‪ ْٛ‬ثٕفس االسدُ اٌدذ‪ ٞ‬ردُ أةدبجٗ ‪ ،‬وّدب يد‪ٟ‬‬
‫}‬ ‫اٌّضبي سلُ ‪. 5‬‬
‫رنو‪-5-‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اٌزمو‪١‬دت‬ ‫‪٘ٚ‬ىذا ٔى‪ ْٛ‬لا أز‪ٕ١ٙ‬ب ِٓ حمػ عمق أةبء اٌىبجٕبد ِٓ اٌزمو‪١‬دت ‪ ،‬يدافٕب االْ ٔ‪ٛ‬ضدؼ و‪١‬دف ‪٠‬دزُ ر‪ٛ‬س‪٠‬دش خصدبج‬
‫ٌٍىبجٕبد ‪ٚ‬اٌ‪١‬ه اٌةىً اٌزبٌ‪: ٟ‬‬

‫سعٌ ر٘ض‪ٞ‬ح‪ ٜ‬ىج‪ٞ‬بُ م‪ٞ‬ف‪ٞ‬خ ر٘س‪ٝ‬ث اىنبئْبد اىَْزَ‪ٞ‬خ ىيزشم‪ٞ‬ت أ‪ ٛ‬اىزبثقخ ىٔ ّفظ اىصفبد ‪:‬‬

‫‪ٕ٘ٚ‬ب رُ ر‪ٛ‬س‪٠‬ش ٔفس اٌّؾز‪ ِٓ ٜٛ‬اٌزمو‪١‬ت اٌ‪ ٝ‬عّ‪١‬ـ اٌىبجٕبد إٌّزّ‪١‬خ ٌٗ ‪ ٟ٘ٚ‬ثٕفس اٌمصبج ‪ٌٚ ،‬ىٓ ودً ودبجٓ ٌدٗ‬
‫ِؾز‪ ٜٛ‬خبص ثٗ ‪٠‬مزٍف فٓ االخم ‪ ،‬ؽ‪١‬ش ‪٠‬زةبثٗ ثٕفس إٌ‪ٛ‬ؿ ‪ٔٚ‬فس االسُ ‪ٚ‬اٌذ‪١ّ٠ ٞ‬ز ذٌه ٘‪ ٛ‬اسُ اٌىبجٓ فٕا ِقبٌغزٗ ‪.‬‬
‫يالؽؼ فز‪٠‬ز‪ ٞ‬اْ وً اٌّز ‪١‬ماد اٌز‪ ٟ‬رُ ر‪ٛ‬س‪٠‬ض‪ٙ‬ب اٌ‪ ٝ‬اٌىبجٕبد ٘‪ِ ٟ‬ز ‪١‬ماد ِٕزّ‪١‬خ ٌ‪ٙ‬ذا اٌزمو‪١‬دت أ‪ ٞ‬خبصدٗ ثدٗ ‪ٚ‬ودً‬
‫وبجٓ ٌٗ ِز ‪١‬مارٗ إٌّزّ‪١‬خ اٌمبصخ ثٗ ا‪٠‬ضب ‪ٚ ،‬ثٕفس االسّبء ‪ٚ‬االٔ‪ٛ‬اؿ ‪ِٚ ،‬ب ‪١ّ٠‬ز٘ب فٕا ِقبٌغز‪ٙ‬ب ٘‪ ٛ‬اسُ اٌىبجٓ ٔفسٗ ‪ ،‬أ‪ ٞ‬اْ‬
‫ِز ‪١‬ماد اٌىبجٓ ‪ٔ ٟ٘ x‬فس ِز ‪١‬ماد اٌىبجٓ ‪ٚ y‬ثٕفس االسّبء ‪ٚ‬إٌ‪ٛ‬ؿ ا‪٠‬ضب ‪ٕ٘ٚ ،‬ب رّ‪١‬ز فٕا ِقبٌغز‪ٙ‬ب ثذوم اسُ اٌىبجٓ اٌزبثقخ‬
‫ٌٗ ؽ‪١‬ش س‪١‬زُ حمػ ذٌه ي‪ّ١‬ب ثقا ‪.‬‬
‫‪ِٚ‬ب اس‪٠‬اٖ ِٕه اْ رقٍّٗ ٕ٘ب أٗ ال ‪ّ٠‬ىٓ اسدزمااَ ٘دذٖ اٌّز ‪١‬دماد اال فٕدا أةدبء اٌىدبجٓ ‪ ،‬أ‪ ٞ‬اْ اٌّز ‪١‬دماد اٌّ‪ٛ‬عد‪ ٛ‬ح‬
‫اخً اٌزمو‪١‬ت رى‪ِ ْٛ‬قٍ‪ِٛ‬خ ٌٍّزمعُ يمدظ ‪ٚ‬فٕداِب ٔمد‪ َٛ‬ثئٔةدبء اٌىدبجٓ ِدٓ ٘دذا اٌزمو‪١‬دت ‪٠‬دزُ ؽغدز ٘دذٖ اٌّز ‪١‬دماد يد‪ ٟ‬ذاودمٖ‬
‫اٌؾبس‪ٛ‬ة ٌٍىبجٓ اٌذ‪ ٞ‬لّذ ثبٔةبءٖ ‪.‬‬

‫م‪ٞ‬ف‪ ٔٞ‬اىزقبٍو ٍـ اىنبئْبد اىزبثقخ ىيزشم‪ٞ‬ت ٍٗقبىجزٖب داخو اىذاىخ اىشئ‪ٞ‬غ‪ٞ‬خ ( ‪: main‬‬

‫اعْبد ق‪ ٌٞ‬ثبثزٔ اٗ ادخبىٖب ىينبئِ اىَْزَ‪ ٜ‬ىيزشم‪ٞ‬ت داخو اىذاىخ اىشئ‪ٞ‬غ‪ٞ‬خ ") ( ‪: " main‬‬
‫فٕاِب ٔم‪٠‬ا ِقبٌغٗ اٌىبجٕبد اٌزبثقخ ٌٍزمو‪١‬ت اخً اٌااٌخ اٌمج‪١‬سخ وئسٕب ل‪ ُ١‬صبثزدٗ ٌ‪ٙ‬دب اخدً اٌجمٔدبِظ ‪ٔ ،‬ؾدٓ ٔقزجدم اْ‬
‫اٌزمو‪١‬ت فجبسٖ فٓ خزأٗ رؾز‪ ٞٛ‬فٍ‪ ٝ‬اٌقا‪٠‬ا ِٓ اٌّز ‪١‬ماد يقٕاِب ٔم‪٠‬ا اٌ‪ٛ‬ص‪ٛ‬ي اٌ‪ ٝ‬أ‪ِ ٞ‬ز ‪١‬م ِٓ ٘ذٖ اٌّز ‪١‬ماد ‪٠ ،‬غت اْ‬
‫ٔضـ اسُ اٌىبجٓ صُ ٔزجقٗ ثٕمغٗ ‪ ٟ٘ٚ‬ثّضبثٗ ِفزبػ ٘ذٖ اٌمزأخ ‪ٚ‬ثقا٘ب ٔضـ اسُ اٌّز ‪١‬م اٌدذ‪ٔ ٞ‬م‪٠‬دا ِقبٌغزدٗ صدُ ٔضدـ فالِدخ‬
‫اٌّسب‪ٚ‬اح = صُ ٔضـ اٌم‪ّ١‬خ اٌز‪ٔ ٟ‬م‪٠‬ا اسٕب ٘ب اٌ‪٘ ٝ‬ذا اٌّز ‪١‬م وّب ي‪ ٟ‬اٌةىً اٌزبٌ‪: ٟ‬‬

‫; ‪x.avg=90.5‬‬
‫فٕب ٔأخذ ِضبال ٌز‪ٛ‬ض‪١‬ؼ اٌفىمح اوضم‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ٍثبه ‪ :‬فشف رشم‪ٞ‬ت ىغ‪ٞ‬بسح اعَٔ " ‪ٝٗ ، " car‬حز٘‪ ٙ‬في‪ ٚ‬اىَزغ‪ٞ‬شاد اىَْزَ‪ٞ‬خ اىزبى‪ٞ‬خ ‪ ( :‬اعٌ اىغ‪ٞ‬بسح ظ‪ٞ‬ث ‪ٝ‬زنُ٘ ٍِ‬
‫عيغئ سٍض‪ ٔٝ‬ع٘ىٖب ‪ 22‬ظشف ‪ٍ٘ٗ ،‬د‪ٝ‬و اىغ‪ٞ‬بسح ٍِ ّ٘ؿ فذد صح‪ٞ‬ح ‪.‬‬
‫>‪1. #include <iostream.h‬‬
‫>‪2. #include <conio.h‬‬ ‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس إٔب ي‪ ٟ‬اٌمغ‪ٛ‬ح ‪ 3‬افٍٕب فٓ اسُ اٌزمو‪١‬ت ‪ٛ٘ٚ‬‬
‫‪3. struct car‬‬ ‫‪ car‬صددُ يدد‪ ٟ‬اٌمغدد‪ٛ‬اد ‪ 6 ٚ 5‬لّٕددب ثزقم‪٠‬ددف ِز ‪١‬ددم ٌىددً ِددٓ اسددُ اٌسدد‪١‬بسح‬
‫{ ‪4.‬‬ ‫‪ٚ‬اٌّ‪٘ٚ ً٠ ٛ‬ذا ٘‪ِ ٛ‬غٍت اٌّضبي صدُ يد‪ ٟ‬خغد‪ 7 ٖٛ‬أ‪ٕ١ٙ‬دب ثٕدبء اٌزمو‪١‬دت ِزجد‪ٛ‬ؿ‬
‫‪5.‬‬ ‫;]‪char car_name [20‬‬ ‫ثفبصدٍٗ ِٕم‪ٛ‬عدٗ صدُ اس ٔدب اْ ٔقدبٌظ ٘دذٖ اٌّز ‪١‬دماد يد‪ ٟ‬اٌااٌدخ اٌمج‪١‬سد‪١‬خ ‪ ،‬يدد‪ٟ‬‬
‫‪6.‬‬ ‫; ‪int car_model‬‬ ‫اٌمغ‪ٛ‬ح ‪ 15‬لّٕب ثئٔةبء وبجٓ ‪ٚ‬اؽا يمظ ‪ ِٓ x ٛ٘ٚ‬اٌزمو‪١‬ت ‪ٌٚ car‬ده اٌم‪١‬دبس‬
‫;} ‪7.‬‬
‫) ( ‪8. void main‬‬ ‫ي‪ ٟ‬اسزماَ أ‪ ٞ‬عم‪٠‬مٗ ِٓ عمق أةبء اٌىبجٕبد ‪.‬‬
‫{ ‪9.‬‬ ‫اِب ي‪ ٟ‬اٌمغ‪ٛ‬اد ‪ 12 ٚ 11‬لّٕب ثّقبٌغٗ اٌّز ‪١‬ماد اٌزبثقدخ ٌٍىدبجٓ ‪x‬‬
‫‪10.‬‬ ‫;‪car x‬‬ ‫وّب ارفمٕب سبثمب ‪ ٟ٘ٚ‬اسُ اٌىبجٓ ِزج‪ٛ‬ؿ ثٕمغٗ صُ اسُ اٌّز ‪١‬م إٌّزّ‪٘ٚ ٟ‬ىدذا ‪،‬‬
‫‪11.‬‬ ‫;‪cin >> x.car_name‬‬ ‫الؽؼ اٌةىً اٌّغب‪ٚ‬س‪.‬‬
‫‪12.‬‬ ‫;‪cin >> x.car_model‬‬ ‫‪٠ٚ‬غددت اْ ال رٕس د‪ ٝ‬اٌفبصددٍخ إٌّم‪ٛ‬عددخ ثقددا٘ب ‪ٕ٘ٚ‬ددب ‪٠‬ددزُ ا خددبي اسددُ اٌسدد‪١‬بسح‬
‫‪13.‬‬ ‫;)(‪getch‬‬ ‫‪ٚ‬اٌّ‪ٚ ً٠ ٛ‬اذا اس ٔدب اْ ٔغجدـ اٌمد‪ ُ١‬اٌزد‪ ٟ‬ا خٍٕب٘دب اٌد‪٘ ٝ‬دذٖ اٌّز ‪١‬دماد يجدٕفس‬
‫} ‪14.‬‬
‫االسٍ‪ٛ‬ة ‪٘ ٟ٘ٚ‬ىذا ‪:‬‬

‫;‪cout << x.car_name‬‬


‫;‪cout << x.car_model‬‬

‫‪ ٟ٘ٚ‬ثٕفس االسٍ‪ٛ‬ة اٌسبثك ‪ِ ،‬ـ اٌقٍُ اْ اٌزمر‪١‬دت سد‪ٛ‬اء اال خدبي ا‪ ٚ‬االخدماط ٌد‪١‬س ٌدٗ أ‪ ٞ‬فاللدٗ يد‪ ٟ‬ذٌده يجئِىبٔده‬
‫ا خبي اٌّز ‪١‬ماد عّ‪١‬ق‪ٙ‬ب ا‪ ٚ‬ؽز‪ ٝ‬عزء ِٕ‪ٙ‬ب ‪ٚ‬وذٌه اٌغجبفخ ا‪٠‬ضب فٍ‪ ٝ‬اخزال اٌزمر‪١‬ت ‪.‬‬
‫ٍٗةةب اس‪ٝ‬ةةذٓ ٍْةةل فض‪ٝ‬ةةض‪ ٛ‬اىةةذاسط ْٕةةب ٍٗةةب ارةةذد في‪ٞ‬ةةٔ ثشةةذٓ ٕةة٘ اُ ظ٘اصةةش اىجذا‪ٝ‬ةةخ ٗاىْٖب‪ٝ‬ةةخ ‪ٝ‬جةةت اُ رنةةُ٘ فيةة‪ٚ‬‬
‫اعزقبٍخ ٗاظذح ثٌ ّجقذ ٍغبفخ ‪ tap‬ىَب ف‪ ٜ‬داخيٖب مَب ف‪ ٜ‬اىخغ٘اد ‪. 13 -12‬‬

‫رذس‪ٝ‬ت ‪ :‬فشف رشم‪ٞ‬ت ىزيفض‪ ُ٘ٝ‬اعَٔ ‪ TV‬ظ‪ٞ‬ث ‪ٝ‬زنُ٘ ٍِ اىَزغ‪ٞ‬ةشاد اىَْزَ‪ٞ‬ةخ اىزبى‪ٞ‬ةخ ‪ ( :‬اعةٌ اىشةشمخ اىَصةْقخ ٍةِ ّة٘ؿ‬
‫عيغئ سٍض‪ ٔٝ‬ع٘ىٖب ‪ 22‬ظشف ‪ٗ ،‬عْخ اىزصْ‪ٞ‬ـ ٍِ ّ٘ؿ فذد صح‪ٞ‬ح ‪ ،‬ثةٌ اّشةئ مةبئْ‪ ِٞ‬اثْة‪ٍ ِٞ‬ةِ ٕةزا اىزشم‪ٞ‬ةت ثغش‪ٝ‬قةٔ‬
‫اّشب اىنبئْبد االٗى‪ٗ ٚ‬اىثبّ‪ٞ‬خ أ‪ ٛ‬اُ اىنبئِ االٗه ٕ٘ ثبىغش‪ٝ‬قخ االٗى‪ٗ ٚ‬اىنبئِ اىثبّ‪ ٕ٘ ٜ‬ثبىغش‪ٝ‬قخ اىثبّ‪ٞ‬خ ٗاعجـ اىْبرج ‪.‬‬

‫رذس‪ٝ‬ت ‪ :‬فشف رشم‪ٞ‬ت اعَٔ ‪ٝ student‬حز٘‪ ٛ‬في‪ ٚ‬اعٌ اىغبىت ثغ٘ه ‪ 12‬عالعو ‪ 8ٗ ،‬فالٍبد ىٔ ثَصف٘فخ ٍِ ّ٘ؿ فذد‬
‫ظق‪ٞ‬ق‪ٗ ، ٜ‬فشف ٍزغ‪ٞ‬ش ىيَقذه ٍِ ّ٘ؿ فذد ظق‪ٞ‬ق‪ ، ٜ‬ثٌ قٌ ثبدخبه االعٌ ٗاىقالٍبد ثٌ اعجـ اعٌ اىغبىت ٍٗقذىٔ ثقذ ظغبثٔ‪.‬‬

‫اعْبد عيغئ سٍض‪ ٔٝ‬ىَزغ‪ٞ‬ش ٍْزَ‪ ٜ‬ىنبئِ ربثـ ىزشم‪ٞ‬ت ٍق‪: ِٞ‬‬

‫فٕا اسٕب سٍسٍٗ سِز‪ ٗ٠‬اٌ‪ ٝ‬وبجٓ ِٕزّ‪ٌٍ ٟ‬زمو‪١‬ت اخً اٌااٌخ اٌمج‪١‬س‪١‬خ ‪ ، main‬ال ‪٠‬غ‪ٛ‬ز اْ ٔزجدـ اٌغم‪٠‬مدخ اٌسدبثمخ أ‪ٞ‬‬
‫أٗ ال ‪٠‬غ‪ٛ‬ز اسٕب سٍسٍٗ اٌ‪ِ ٝ‬ز ‪١‬م ثغم‪٠‬مٗ اٌّسب‪ٚ‬اح ي‪ٙ‬ذا خغب ‪ٌّٚ ،‬قبٌغخ ذٌه ‪٠‬غت اْ ٔسزماَ اٌىٍّخ اٌّؾغ‪ٛ‬زح ‪strcpy‬‬
‫اٌزبثقخ ٌٍّىزجخ ‪ ٟ٘ٚ iostream.h‬ثبٌؾم‪ ٚ‬اٌص ‪١‬مح ‪ٚ ،‬ذٌه ث‪ٛ‬ضـ اٌىٍّخ وّب ‪: ٍٟ٠‬‬

‫‪strcpy‬‬ ‫ِز ‪١‬م اٌىبجٓ ‪ .‬اسُ اٌىبجٓ‬ ‫‘‬ ‫" اٌغٍّٗ اٌز‪ٔ ٟ‬م‪٠‬ا اْ ٕٔسم‪ٙ‬ب اخً ِز ‪١‬م اٌىبجٓ "‬ ‫;‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫‪ٌٚ‬ىٓ ِـ االٔزجبٖ اٌ‪ ٝ‬اْ اٌىٍّخ اٌز‪ٔ ٟ‬م‪٠‬ا اْ ّْغخٖب داخو ٍحز٘‪ ٙ‬اىَزغ‪ٞ‬ش اىزةبثـ ىينةبئِ اىَْزَة‪٠ ، ٜ‬غدت اْ ر‪ٛ‬ضدـ‬
‫ث‪ ٓ١‬فالِز‪ ٟ‬اٌزٕص‪٠ٚ ، ١‬غدت اْ ‪٠‬ىد‪ ْٛ‬عد‪ٛ‬ي اٌسٍسدٍخ اٌمِز‪٠‬دخ اٌزد‪ٔ ٟ‬م‪٠‬دا اْ ٕٔسدم‪ٙ‬ب اخدً اٌّز ‪١‬دم اٌزدبثـ ٌٍىدبجٓ إٌّزّد‪ٟ‬‬
‫ٌٍزمو‪١‬ت ة ‪ِ n -1‬ـ ؽسجبْ اٌّسبيخ ا‪٠‬ضب الؽؼ اٌّضبي اٌزبٌ‪: ٟ‬‬

‫; ) "‪strcpy ( x . name , " yousef anaya‬‬

‫ٕ٘ب فا اٌسٍسٍخ اٌمِز‪٠‬خ اٌّؾص‪ٛ‬سح ث‪ ٓ١‬فالِز‪ ٟ‬اٌزٕص‪ِ 12 ٛ٘ " yousef anaya " ١‬ـ اٌّسبيخ ثد‪ ٓ١‬اٌىٍّزد‪٠ ٓ١‬غدت اْ‬
‫رؾست ا‪٠‬ضب ‪ ،‬ي‪١‬غت اْ ٔؾغز ٌٍّز ‪١‬م اٌذ‪ٔ ٞ‬م‪٠‬ا اْ ٕٔسم‪ٙ‬ب ي‪ِ ٛ٘ٚ ٗ١‬صف‪ٛ‬ي‪ٙ‬ب ألٔ‪ٙ‬ب سٍسٍٗ سِز‪ ٗ٠‬فا اٌسٍسٍخ اٌمِز‪٠‬دخ ‪1+‬‬
‫‪ ،‬أ‪ٚ n + 1 ٞ‬ذٌه الْ اٌّؾز‪ ٜٛ‬االخ‪١‬م اٌّ‪ٛ‬ع‪ ٛ‬ي‪ ٟ‬اٌّصف‪ٛ‬يخ ‪٠‬ؾًّ ثااخٍٗ ‪ٚ \0‬ذٌه ٌٍاالٌدخ فٍد‪ٙٔ ٝ‬ب‪٠‬دخ اٌّصدف‪ٛ‬يخ‬
‫‪٘ٚ‬ذا ‪٠‬زُ رٍمبج‪١‬ب فٕا ؽغز اٌّصف‪ٛ‬يخ ي‪ ٟ‬اٌذاومح ‪ٕ٘ٚ ،‬ب ال ‪ّ٠‬ىٓ اْ ٕٔسخ ٘ذا االسُ ي‪ِ ٟ‬صف‪ٛ‬يٗ الً ِٓ ‪ 13‬فٕصم ‪ٚ‬ثئِىبٕٔدب‬
‫اْ ٔقم ِصف‪ٛ‬يٗ ثبٌؾغُ اٌذ‪ٔ ٞ‬م‪٠‬ا ِـ ِمافبح اٌمبفاح اٌسبثمخ ‪.‬‬
‫٘ذا ي‪ ٟ‬ؽبي وبٔذ اٌسٍسٍخ اٌمِز‪٠‬خ صبثزٗ اخً اٌجمٔبِظ ‪ ٌٛٚ ،‬اس ٔب ا خبٌ‪ٙ‬ب ِٓ اٌّسزماَ ي‪١‬زُ ذٌه ِجبحمٖ وّب رقٍّدب سدبثمب أ‪ٞ‬‬
‫اسُ اٌىبجٓ ِزج‪ٛ‬ؿ ثٕمغٗ صُ اسُ اٌّز ‪١‬م اٌذ‪ٔ ٞ‬م‪٠‬ا اْ ٔاخً اٌج‪١‬بٔبد ٌٗ ‪.‬‬

‫م‪ٞ‬ف‪ٞ‬خ ّغخ عيغٔ سٍض‪ٍ ٍِ ٔٝ‬حز٘‪ٍ ٙ‬زغ‪ٞ‬ش مبئِ اى‪ٍ ٚ‬حز٘‪ٍ ٙ‬زغ‪ٞ‬ش مبئِ اخش ‪:‬‬

‫يٍ‪ ٛ‬اس ٔب اخً اٌجمٔبِظ اُ ّْغخ ٍحز٘‪ٍ ٙ‬زغ‪ٞ‬ش ٍْزَ‪ ٜ‬ىنبئِ اى‪ٍ ٚ‬زغ‪ٞ‬ش ٍْزَ‪ ٜ‬ىنبئِ اخش ‪ ،‬يئٕٔب ٔزجدـ ٔفدس اٌغم‪٠‬مدخ‬
‫اٌسبثمخ ِـ ر ‪١١‬م ثس‪١‬ظ ‪ ٛ٘ٚ‬اْ ٔضـ اٌّز ‪١‬م اٌذ‪ٔ ٞ‬م‪٠‬ا اْ ٕٔسخ ٌٗ اٌسٍسٍخ صُ يبصٍٗ صُ اسُ اٌّز ‪١‬م اٌزبثـ ٌٍىبجٓ االخدم ‪٘ٚ‬د‪ٛ‬‬
‫اٌذ‪٠ ٞ‬ؾز‪ ٞٛ‬فٍ‪ ٝ‬اٌسٍسٍخ ٔفس‪ٙ‬ب ‪ ،‬أ‪ ٞ‬إٔب ٕٔسخ ِؾز‪ِ ٜٛ‬ز ‪١‬م ربثـ ٌىبجٓ‬
‫‪1. struct student‬‬ ‫ي‪ِ ٟ‬ؾز‪ِ ٜٛ‬ز ‪١‬م ربثـ ٌىبجٓ اخم ‪ٚ ،‬ي‪ ٟ‬اٌّضبي اٌسبثك ٌ‪ ٛ‬اس ٔدب اْ ٕٔسدخ‬
‫{ ‪2.‬‬ ‫ِؾزد‪ name ٜٛ‬اٌزدبثـ ٌٍىدبجٓ ‪ x‬يد‪ِ ٟ‬ز ‪١‬دم ‪ name‬اٌزدبثـ ٌٍىدبجٓ ‪ٔ y‬زجدـ‬
‫; ] ‪3. char st_name [ 13‬‬ ‫ٔفس اٌغم‪٠‬مخ اٌسبثمخ ‪ِ .‬ضبي ‪:‬‬
‫; ‪4. }x , y‬‬
‫) ( ‪5. void main‬‬
‫الؽؼ ٕ٘ب اٌمغ‪ٛ‬ح سلُ ‪ 7‬لّٕب ثٕسخ اٌسٍسٍخ اٌمِز‪٠‬خ اخً ِز ‪١‬م‬
‫{ ‪6.‬‬
‫; ) " ‪7. strcpy (x . st_name , " yousef anaya‬‬ ‫االسُ اٌزدبثـ ٌٍىدبجٓ ‪ x‬صدُ اس ٔدب اْ ٕٔسدخ ِؾزد‪٘ ٜٛ‬دذا اٌىدبجٓ اٌد‪ِ ٝ‬ز ‪١‬دم‬
‫; ) ‪8. strcpy (y . st_name , x . st_name‬‬ ‫ربثـ ٌىبجٓ اخدم يٕسدزماَ ٔفدس اٌغم‪٠‬مدخ الؽدؼ اٌمغد‪ٛ‬ح سلدُ ‪ 8‬ا‪ٚ‬ال ٔضدـ‬
‫} ‪9.‬‬ ‫اسُ اٌّز ‪١‬م اٌدذ‪ٔ ٞ‬م‪٠‬دا اْ ٕٔسدخ ثااخٍدٗ ‪٘ٚ‬د‪ y . st_name ٛ‬صدُ اسدُ‬
‫‪. x . st_name‬‬ ‫اٌّز ‪١‬م اٌذ‪ٔ ٞ‬م‪٠‬ا اْ ٕٔسخ ِٕٗ ‪ٛ٘ٚ‬‬

‫ٍالظؾٔ ٍَٖٔ ‪٘ :‬ذا ي‪ ٟ‬ؽبي وبٔذ اٌسٍسٍخ اٌمِز‪٠‬خ صبثزٗ ي‪ ٟ‬اٌجمٔبِظ يبذا اس ٔب اْ ٔاخً اٌسٍسٍخ اال‪: ٟ٘ٚ ٌٝٚ‬‬
‫‪ِ x . st_name‬ددٓ اٌّسددزماَ ‪ٚ‬اس ٔددب اْ ٕٔسددم‪ٙ‬ب اخددً اٌّز ‪١‬ددم ‪ ، y . st_name‬يددال ‪ّ٠‬ىددٓ وزبثز‪ٙ‬ددب ث‪ٙ‬ددذٖ‬
‫اٌغم‪٠‬مخ ‪:‬‬
‫; ‪y . st_name = x . st_name‬‬
‫ي‪ٙ‬ذا خغب ثً ‪٠‬غت اْ ٔزجـ ٔفس اٌغم‪٠‬مخ اٌسبثمخ ‪.‬‬

‫رذس‪ٝ‬ت ‪ :‬فشف رشم‪ٞ‬ت اعَٔ رخص ‪ person‬ظ‪ٞ‬ث ‪ٝ‬حز٘‪ ٛ‬في‪ٍ ٚ‬زغ‪ٞ‬ش ٍْزَ‪ٕٗ ٜ‬ة٘ االعةٌ ٍةِ ّة٘ؿ عيغةئ سٍض‪ٝ‬ةٔ ع٘ىٖةب‬
‫‪ 22‬ظشف ‪ ،‬ثٌ فشف مبئْ‪ٕ ٍِ ِٞ‬زا اىزشم‪ٞ‬ت ثٌ ادخو االعٌ ٍِ اىَغزخذً ىينبئِ االٗه ثٌ اعْذ ٕزا االعٌ اى‪ ٚ‬اىنةبئِ اىثةبّ‪ٜ‬‬
‫ثٌ اعجـ ٕزا االعٌ ٍِ اىنبئِ اىثبّ‪. ٜ‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ٍثبه ‪ .2‬فشف رشم‪ٞ‬ت اعَٔ ( ‪ Officer‬ىَ٘ؽف ‪ٝ‬حز٘‪ ٛ‬في‪ ٚ‬اىَزغ‪ٞ‬شاد اىَْزَ‪ٞ‬خ اىزبى‪ٞ‬خ ‪ ( :‬اعٌ اىَ٘ؽةف عيغةئ سٍض‪ٝ‬ةخ‬
‫ع٘ىٖب ‪ 22‬ظشف ‪ ،‬سقٌ اىَ٘ؽف ٍِ ّ٘ؿ فذد صح‪ٞ‬ح ‪ ،‬سارت اىَ٘ؽف ٍِ ّ٘ؿ فذد ظق‪ٞ‬ق‪ ، ٜ‬ثح‪ٞ‬ث ‪ٝ‬نُ٘ اعٌ اىَ٘ؽف ٕ٘‪:‬‬
‫( ‪ٗ ، yousef anaya‬سقَةٔ ‪ٗ ، 550( :‬سارجةٔ ‪ 255.5( :‬؟‬
‫> ‪1. #include < iostream.h‬‬ ‫ثةٌ اّغةخٌٖ فةة‪ ٜ‬مةبئِ اخةش اعةةَٔ ‪ y‬ثةٌ اعةجقٌٖ فيةة‪ ٚ‬اىشبرةخ ٍةةِ‬
‫> ‪2. #include < conio.h‬‬ ‫اىنبئِ ‪ y‬؟‬
‫‪3. struct Officer‬‬
‫لّٕدددب ثزسدددّ‪١‬خ اٌزمو‪١‬دددت ‪ Officer‬يددد‪ ٟ‬خغددد‪ٚ 3 ٖٛ‬لجٍ‪ٙ‬دددب‬
‫{ ‪4.‬‬
‫‪5.‬‬ ‫اسُ اٌّ‪ٛ‬ؽف; ]‪char offi_name[13‬‬ ‫‪ٚ‬ضقٕب اٌىٍّٗ اٌّؾغد‪ٛ‬زٖ يد‪ ٌ ٟ‬دخ اٌسد‪٘ٚ struct ٟ‬دذا حدمط ثٕدبء‬
‫‪6.‬‬ ‫; ‪int offi_number‬‬ ‫سلُ اٌّ‪ٛ‬ؽف‬ ‫اٌزمو‪١‬ت صدُ فميٕدب أد‪ٛ‬اؿ ‪ٚ‬اسدّبء اٌّز ‪١‬دماد وّدب يد‪ ٟ‬خغد‪7-5 ٖٛ‬‬
‫‪7.‬‬ ‫سارت اٌّ‪ٛ‬ؽف ; ‪float offi_Salary‬‬ ‫‪ ٟ٘ٚ‬اٌّقغ‪١‬بد اٌّغٍ‪ٛ‬ثٗ ي‪ ٟ‬اٌسؤاي ‪.‬‬
‫; ‪8. } x , y‬‬
‫) ( ‪9. void main‬‬ ‫صُ لّٕب ثبٔةدبء ودبجٕ‪ ٓ١‬وّدب ٘د‪ِ ٛ‬غٍد‪ٛ‬ة يد‪ ٟ‬اٌسدؤاي الؽدؼ‬
‫{ ‪10.‬‬
‫خغ‪ٚ 8 ٖٛ‬ثقدا رقم‪٠‬دف اٌىدبجٕ‪ ٓ١‬اسدٕأب اٌمد‪ ُ١‬اٌد‪ ٝ‬اٌّز ‪١‬دماد اٌزدبثـ‬
‫‪11.‬‬ ‫; ) "‪strcpy ( x . offi_name , "yousef anaya‬‬
‫‪12.‬‬ ‫; ‪x .offi_number = 550‬‬ ‫ٌٍىددبجٓ اال‪ٚ‬ي ‪٘ٚ‬ددد‪ x ٛ‬وّدددب يددد‪ ٟ‬اٌمغددد‪ٛ‬اد ‪ِ 13 -11‬دددـ ِمافدددبد‬
‫‪13.‬‬ ‫; ‪x .offi_Salary = 2455.5‬‬ ‫حددم‪ٚ‬ط ٔسددخ اٌسالسددً اٌمِز‪٠‬ددٗ وّددب يدد‪ ٟ‬خغدد‪ٕ٘ٚ ، 11 ٖٛ‬ددب فددا‬
‫اٌسٍسددٍٗ ٘دد‪ 12 ٛ‬ؽددم ِددـ اٌّسددبيٗ وّددب حددمؽٕبٖ سددبثمب ‪ ،‬يقميٕددب‬
‫‪14.‬‬ ‫; ) ‪strcpy ( y . offi_name , x . offi_name‬‬ ‫ع‪ٛ‬ي اٌسٍسٍٗ ٌٍّز ‪١‬م اٌذ‪ٔ ٞ‬م‪٠‬ا اْ ‪٠‬ؾز‪ ٞٛ‬فٍ‪٘ ٝ‬ذٖ اٌسٍسٍٗ اخً‬
‫‪15.‬‬ ‫; ‪y.offi_number = x . offi_number‬‬ ‫اٌزمو‪١‬ت ‪ِ ٛ٘ٚ‬صف‪ٛ‬يٗ ة ‪ 13‬فٕصم وّب ي‪ ٟ‬خغد‪ٚ 5 ٖٛ‬ذٌده الْ‬
‫‪16.‬‬ ‫; ‪y. offi_Salary = x . offi_Salary‬‬
‫اٌقٕصددم االخ‪١‬ددم يدد‪ ٟ‬اٌّصددف‪ٛ‬يٗ ‪٠‬ؾزدد‪ ٞٛ‬فٍدد‪ ٝ‬اٌمِددز ‪ٌٍ \0‬االٌددٗ‬
‫‪17.‬‬ ‫; ‪cout << y.offi_name << endl‬‬ ‫فٍ‪ٙٔ ٝ‬ب‪٠‬خ اٌّصف‪ٛ‬يٗ ‪٠ٚ‬غت اْ ٕٔزجدٗ ا‪٠‬ضدب اْ ‪ٚ‬ضدقٕب ِسدبيٗ لجدً‬
‫‪18.‬‬ ‫; ‪cout << y.offi_number << endl‬‬ ‫فالِخ اٌزٕص‪ ١‬ي‪ ٟ‬خغ‪ 11 ٖٛ‬اْ ٔؾسج‪ٙ‬ب ي‪ ٟ‬ع‪ ٌٗٛ‬اٌسٍسٍٗ ‪.‬‬
‫‪19.‬‬ ‫; ‪cout << y.offi_Salary << endl‬‬ ‫‪٠ٚ‬غددت اْ ال ٕٔسدد‪ ٝ‬اْ وددً فٕصددم ٔؾغددزٖ ِددٓ فٕبصددم‬
‫‪20.‬‬ ‫;)(‪getch‬‬ ‫اٌسٍسٍٗ اٌمِز‪ ٗ٠‬اخً اٌزمو‪١‬ت ‪ٚ ،‬غ‪١‬دم ِسدزماَ ‪٠‬د‪ ٞ ٛ‬اٌد‪ ٝ‬ز‪٠‬دب ٖ‬
‫} ‪21.‬‬ ‫ؽغُ اٌجمٔبِظ ي‪ ٟ‬اٌذاومٖ ‪.‬‬

‫ثم‪ ٟ‬فٍ‪ٕ١‬ب اْ ٕٔمً اٌّؾز‪٠ٛ‬بد ِدٓ اٌىدبجٓ ‪ x‬اٌد‪ ٝ‬اٌىدبجٓ ‪ y‬الؽدؼ اٌمغد‪ٛ‬اد ِدٓ ‪ِ 16 – 14‬دـ ِمافدبد حدم‪ٚ‬ط ٔسدخ‬
‫اٌسالسً اٌمِز‪ ٗ٠‬وّب ي‪ ٟ‬اٌمغ‪. 14 ٖٛ‬‬
‫صُ لّٕب ثغجبفخ ِؾز‪٠ٛ‬بد اٌىبجٓ ‪ y‬إٌّزّ‪ٌٍ ٟ‬زمو‪١‬ت ‪ Officer‬وّب ي‪ ٟ‬اٌمغ‪ٛ‬اد ‪. 19 -17‬‬

‫ٍقبىجخ ٍزغ‪ٞ‬شاد اىنبئْبد اىَْزَ‪ٞ‬خ ىيزشم‪ٞ‬ت ‪:‬‬


‫فٕاِب ٔم‪٠‬ا اْ ٔقبٌظ ِز ‪١‬ماد ٌىبجٕبد ِٕزّ‪١‬دخ ٌزمو‪١‬دت ِقد‪ٔ ، ٓ١‬زقبِدً ِدـ ودً ِز ‪١‬دم ثبسدُ وبجٕدٗ فٍد‪ ٝ‬ؽداٖ ‪ٔٚ‬قدبٌظ ِز ‪١‬ماردٗ‬
‫اٌمبصٗ ثٗ ‪٘ٚ‬ىذا فٕب ٔبخذ ِضبال فٍ‪ ٝ‬ذٌه ‪:‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ٍثبه ‪ : 3‬فشف رشم‪ٞ‬ةت اعةَٔ ‪ student‬ىغبىةت ‪ٝ‬حزة٘‪ ٛ‬فية‪ ٚ‬اىَزغ‪ٞ‬ةشاد اىَْزَ‪ٞ‬ةٔ اىزبى‪ٞ‬ةٔ ‪ ( :‬اعةٌ اىغبىةت ٍةِ ّة٘ؿ عيغةئ‬
‫سٍض‪ ٔٝ‬ع٘ىٖب ‪ 22‬ظشف ‪ ،‬سقٌ اىغبىت ٍِ ّ٘ؿ فذد صح‪ٞ‬ح ‪ٍٗ ،‬قذه اىغبىت ٍِ ّ٘ؿ فذد ظق‪ٞ‬قة‪ ، ٜ‬ثةٌ فةشف مةبئِ ىغبىةت‬
‫اعَٔ ‪ ، yousef anay‬سقَٔ ‪ٍٗ 1‬قذىٔ ‪ 80.7‬ثٌ فشف مبئِ ىغبىت اخةش اعةَٔ ‪ ، mohamd samer‬سقَةٔ ‪ٍ ، 2‬قذىةٔ‬
‫‪ 8..3‬ثٌ اعجـ ٍحز٘‪ٝ‬بد اىنبئْ‪ ِٞ‬في‪ ٚ‬اىشبرٔ ‪.‬‬

‫>‪1. #include <iostream.h‬‬ ‫لّٕددددب يدددد‪ ٟ‬خغدددد‪ 3 ٖٛ‬ثبٔةددددبء اٌزمو‪١‬ددددت ‪ٚ‬رسددددّ‪١‬زٗ ثبسددددُ‬
‫>‪2. #include <conio.h‬‬ ‫‪ student‬صُ لّٕب ثزقم‪٠‬ف اٌّز ‪١‬دماد ِدـ أ‪ٛ‬اف‪ٙ‬دب يد‪ ٟ‬اٌمغد‪ٛ‬اد‬
‫‪3. struct student‬‬
‫{ ‪4.‬‬
‫‪ 7-5‬صُ أةئٕب وبجٕ‪ ٓ١‬وّب ي‪ ٟ‬اٌمغ‪ّ٘ٚ 8 ٖٛ‬ب ‪. y ٚ x‬‬
‫‪5.‬‬ ‫;]‪char st_name[20‬‬ ‫صُ اسٕأب اٌم‪ٌّ ُ١‬ز ‪١‬ماد اٌىدبجٓ اال‪ٚ‬ي ‪ x‬يد‪ ٟ‬اٌمغد‪ٛ‬اد ‪13 -11‬‬
‫‪6.‬‬ ‫;‪int st_number‬‬ ‫صُ اسٕأب ل‪ٌّ ُ١‬ز ‪١‬ماد اٌىبجٓ اٌضبٔ‪ y ٟ‬ي‪ ٟ‬اٌمغ‪ٛ‬اد ‪ 16 -14‬صُ‬
‫‪7.‬‬ ‫;‪float st_avg‬‬ ‫عجقٕددب لدد‪ِ ُ١‬ز ‪١‬ددماد اٌىددبجٓ ‪ x‬وّددب يدد‪ ٟ‬اٌمغدد‪ٛ‬اد ‪ٚ 19 – 17‬‬
‫; ‪8. } x , y‬‬ ‫عجقٕب ا‪٠‬ضب ل‪ ُ١‬اٌّز ‪١‬ماد ٌٍىبجٓ ‪ y‬وّب ي‪ ٟ‬اٌمغ‪ٛ‬اد ‪22 – 25‬‬
‫) ( ‪9. void main‬‬ ‫‪.‬‬
‫{ ‪10.‬‬
‫‪11.‬‬ ‫;) "‪strcpy ( x . st_name , "yousef anaya‬‬
‫‪12.‬‬ ‫; ‪x .st_number = 1‬‬ ‫الؽدددؼ فز‪٠‬دددز‪ٕ٘ ٞ‬دددب اْ ودددً ِدددٓ ‪ٚ y ٚ x‬سصدددذ ٔفدددس‬
‫‪13.‬‬ ‫; ‪x .st_avg = 80.7‬‬ ‫اٌصفبد ‪ٚ‬اٌمصبج ‪ ٟ٘ٚ ،‬أ‪ٛ‬اؿ اٌّز ‪١‬ماد ‪ٚ‬اسّبج‪ٙ‬ب اٌّقميدٗ‬
‫اخددً اٌزمو‪١‬ددت ‪ٔ student‬فسددٗ ‪ ،‬أ‪ ٞ‬اْ وددً وددبجٓ ٌددٗ ِز ‪١‬مارددٗ‬
‫‪14.‬‬ ‫;) "‪strcpy ( y . st_name , "mohamed samer‬‬ ‫اٌمبصٗ ‪١ٌٚ‬س ٌٗ أ‪ ٞ‬فاللخ ثبٌّز ‪١‬م االخم‪.‬‬
‫‪15.‬‬ ‫; ‪y .st_number = 2‬‬
‫‪16.‬‬ ‫; ‪y .st_avg = 87.3‬‬
‫ٗىنِ ىْب ْٕب عؤاه ٕٗ٘ مٌ ثب‪ٝ‬ذ ‪ٝ‬حجض ثبىزامشٓ ىٖزا اىَثبه ؟؟‬
‫‪17.‬‬ ‫; ‪cout << x.st_name << endl‬‬ ‫ثاا‪٠‬زب ‪٠‬غت اْ ٔقٍُ اْ اٌزمو‪١‬دت ‪ٚ‬لدذ ثٕبجدٗ ال ‪٠‬ؾغدز أ‪ٞ‬‬
‫‪18.‬‬ ‫; ‪cout << x.st_number << endl‬‬ ‫ل‪ ُ١‬ي‪ ٟ‬اٌذاومٖ ‪ٚ‬أّب ‪٠‬ؾغز ٌٗ ‪ٚ‬لذ أةبء اٌىدبجٓ أ‪ ٞ‬اْ اٌزمو‪١‬دت‬
‫‪19.‬‬ ‫; ‪cout << x.st_avg << endl‬‬ ‫‪٠‬ىزددت ثقددا اٌّىزجددبد ‪ٚ‬لجددً اٌااٌددٗ اٌمج‪١‬سدد‪ٚ main ٗ١‬ذٌدده الْ‬
‫اٌّزمعُ ‪٠‬س‪١‬م ثمظ ِزسٍسً ِٓ افٍ‪ ٝ‬السفً ‪ٌٚ‬ىٓ لٍت اٌجمٔدبِظ‬
‫‪20.‬‬ ‫; ‪cout << y.st_name << endl‬‬ ‫٘دد‪ ٛ‬اي ‪ main‬ي‪١‬مدد‪ َٛ‬اٌّزددمعُ ثزمعّددٗ اٌزمو‪١‬ددت صددُ ‪٠‬دداخً اٌدد‪ٝ‬‬
‫‪21.‬‬ ‫; ‪cout << y.st_number << endl‬‬
‫‪22.‬‬ ‫; ‪cout << y.st_avg << endl‬‬
‫اي ‪ٕ٘ٚ main‬ب رزُ فٍّ‪ ٗ١‬اٌؾغز ي‪ ٟ‬اٌذاومٖ ‪ٚ‬لذ أةبء اٌىبجٕدبد‬
‫اٌزبثقٗ ٌ‪ٙ‬ذا اٌزمو‪١‬ت ‪.‬‬
‫‪23.‬‬ ‫;)(‪getch‬‬ ‫‪ٌٚ‬ىددٓ ‪٠‬غددت اْ رقٍددُ ا‪٠‬ضددب اْ رٕف‪١‬ددذ اٌجمٔددبِظ ‪٠‬ىدد‪ِ ْٛ‬ددٓ‬
‫} ‪24.‬‬ ‫اخً اٌااٌٗ اٌمج‪١‬س‪ ٗ١‬أ‪ ٞ‬اْ اٌزٕف‪١‬ذ ٘‪ ٛ‬ح‪ٟ‬ء ‪ٚ‬اٌزمعّٗ ٘د‪ ٟ‬حد‪ٟ‬ء‬
‫اخم ‪.‬‬

‫‪ٚ‬يدد‪ِ ٟ‬ضبٌٕددب اٌسددبثك فٕددب ٔسددؾت سدد‪٠ٛ‬ب وددً وددبجٓ وددُ ‪٠‬ؾغددز ٌددٗ ثددذاومٖ اٌؾبسدد‪ٛ‬ة ‪ ،‬يبٌىددبجٓ إٌّزّدد‪٠ ٟ‬ددمس خصددبج‬
‫اٌزمو‪١‬ت اٌذ‪ٕ٠ ٞ‬زّ‪ ٟ‬اٌ‪ٕ٘ٚ ، ٗ١‬ب فميٕب سٍسٍٗ سِز‪ ٗ٠‬ع‪ٌٙٛ‬ب ‪ 25‬فٕصم ‪ٔٚ‬ؾٓ ٔقٍُ اْ وً ‪ٚ‬اؽا ‪٠ char‬ؾغز ( ‪ 1‬ثب‪ٝ‬ذ ي‪ٟ‬‬
‫اٌذومٖ ‪ٕ٘ٚ‬ب ِصف‪ٛ‬يٗ ِٓ اي ‪ char‬ع‪ٌٙٛ‬ب ‪ 25‬ي‪١‬ؾغز ( ‪ 22 = 22 *1‬ثب‪ٝ‬ذ ٌٍسٍسٍٗ اٌمِز‪. ٗ٠‬‬
‫صُ لّٕب ثزقم‪٠‬ف سلُ ٌٍغبٌت ِٓ ٔ‪ٛ‬ؿ فا صؾ‪١‬ؼ ‪ int‬ي‪ ٟ‬خغ‪٘ٚ 6 ٖٛ‬ذا ‪٠‬ؾغز ( ‪ 4‬ثب‪ٝ‬ذ ا‪٠‬ضب ‪.‬‬
‫صُ لّٕب ثزقم‪٠‬ف اٌّقاي ِٓ ٔ‪ٛ‬ؿ فا ؽم‪١‬م‪ ٟ‬أ‪ float ٞ‬ي‪١‬ؾغدز ٌدٗ ( ‪ 4‬ثب‪ٝ‬ةذ ا‪٠‬ضدب يّغّد‪ٛ‬ؿ ِدب ردُ ؽغدزٖ ٌٍىدبجٓ اٌ‪ٛ‬اؽدا يد‪ٟ‬‬
‫ذاومٖ اٌؾبس‪ٛ‬ة ٘‪ 28 = 4+4+22( : ٛ‬أ‪ 28 ٞ‬ثب‪٠‬ذ ٌٍىبجٓ اٌ‪ٛ‬اؽا ‪.‬‬
‫‪ٕ٘ٚ‬ب وبجٕ‪ 56 = 2*28 ( ٓ١‬أ‪ِ ٞ‬ب ‪٠‬زُ ؽغزٖ ٌٍىبجٕ‪ِ ٛ٘ ٓ١‬غّ‪ٛ‬ؿ ؽغُ اٌىبجٓ اال‪ٚ‬ي ضمة فا اٌىبجٕبد ‪٘ٚ‬ىذا ‪.‬‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬ثّب إٔب لّٕب ثبسٕب ل‪ٌّ ُ١‬ز ‪١‬ماد اٌىبجٕبد إٌّزّ‪ٌ ٗ١‬زمو‪١‬ت ِق‪ٌٚ ٓ١‬ىٓ ٘ذا االسٕب صبثذ أ‪ ٞ‬أٗ ال ‪٠‬ز ‪١‬م‬
‫اخً اٌجمٔبِظ ‪ ،‬يّبذا ٌ‪ ٛ‬اس ٔب ر ‪١‬م ٘ذٖ اٌم‪ ُ١‬أ‪ ٞ‬ا خبٌ‪ٙ‬ب ِٓ اٌّسزماَ ِبذا ٔفقً فٕب ٔبخذ اٌّضبي اٌزبٌ‪: ٟ‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ٍثةةبه ‪ : 4‬فةةشف رشم‪ٞ‬ةةت ىالثزةة٘ة اعةةَٔ ‪ٝ laptob‬حزةة٘‪ ٛ‬فيةة‪ ٚ‬اعةةٌ اىجٖةةبص ٗ‪ٝ‬زنةةُ٘ ٍةةِ عيغةةئ سٍض‪ٝ‬ةةٔ ع٘ىٖةةب ‪ 22‬ظةةشف‬
‫ٍٗزغ‪ٞ‬ش اخش ىيغقش ٍِ ّ٘ؿ فذد ظق‪ٞ‬ق‪ٗ float ٜ‬ع‪ٞ‬ش‪ٝ‬و َّجةش ‪ٝ‬زنةُ٘ ٍةِ عيغةئ سٍض‪ٝ‬ةٔ ع٘ىٖةب ‪ 22‬ظةشف ثةٌ فةشف مةبئِ‬
‫اعَٔ ‪ x‬ثح‪ٞ‬ث ‪ٝ‬زٌ ادخبه اىنبئْبد اى‪ ٍِ ٔٞ‬اىن‪ٞ‬ج٘سد ٗاعجـ ّبرج ٕزٓ اىَحز٘‪ٝ‬بد ؟‬

‫>‪1. #include <iostream.h‬‬ ‫ٕ٘ب لّٕب ثجٕبء اٌزمو‪١‬ت يد‪ ٟ‬اٌمغد‪ٛ‬اد ‪ 8 -3‬ؽسدت‬
‫>‪2. #include <conio.h‬‬ ‫اٌّقغ‪١‬ددبد اٌّغٍ‪ٛ‬ثددٗ يدد‪ ٟ‬اٌسددؤاي ‪ٌٚ‬ىددٓ ٕ٘ددب لّٕددب ثغجبفددخ‬
‫‪3. struct laptop‬‬ ‫اٌغّددددً اٌز‪ٛ‬ضدددد‪١‬ؾ‪ ٗ١‬الؽددددؼ اٌمغدددد‪ٛ‬اد ‪15 ٚ 13 ٚ 11‬‬
‫{ ‪4.‬‬ ‫‪ٚ‬وذٌه لّٕب ثقٍّ‪١‬خ ا خبي اٌّقٍ‪ِٛ‬بد ِدٓ اٌّسدزماَ أ‪ِ ٞ‬دٓ‬
‫‪5.‬‬ ‫;]‪char lap_name[22‬‬
‫اٌى‪١‬ج‪ٛ‬س الؽؼ اٌمغد‪ٛ‬اد ‪ 16 ٚ 14 ٚ 12‬يىزجٕدب يد‪٘ ٟ‬دذٖ‬
‫‪6.‬‬ ‫;‪float lap_price‬‬
‫‪7.‬‬ ‫;]‪char lap_serial [20‬‬ ‫اٌغًّ اٌىٍّٗ اٌّؾغ‪ٛ‬زٖ ٌال خبي ‪ cin >> ٟ٘ٚ‬صُ ‪ٚ‬ضدقٕب‬
‫; ‪8. } x‬‬ ‫اسددُ اٌىددبجٓ ِزجدد‪ٛ‬ؿ ثٕمغددٗ صددُ اسددُ اٌّز ‪١‬ددم اٌددذ‪ٔ ٞ‬م‪٠‬ددا اْ‬
‫) ( ‪9. void main‬‬ ‫ٔمزْ ي‪ ٗ١‬اٌّؾز‪ ٜٛ‬اٌذ‪٠ ٞ‬اخٍٗ اٌّسدزماَ ‪٘ٚ‬ىدذا ٔىد‪ ْٛ‬لدا‬
‫{ ‪10.‬‬ ‫حمؽٕب يىمٖ اال خبي ِٓ اٌّسزماَ ‪ ،‬اٌ‪ِ ٝ‬ز ‪١‬م ربثـ ٌىدبجٓ‬
‫‪11.‬‬ ‫; "‪cout << "Enter your laptop name :‬‬ ‫ِٕزّ‪ٌ ٟ‬زمو‪١‬ت ‪.‬‬
‫‪12.‬‬ ‫; ‪cin >> x . lap_name‬‬

‫‪13.‬‬ ‫; "‪cout << "Enter your laptop price :‬‬ ‫‪ٚ‬اٌمغدد‪ٛ‬اد ‪ 19 – 17‬لّٕددب ثغجبفددخ ِددب لّٕددب ثب خبٌددٗ ِددٓ‬
‫‪14.‬‬ ‫; ‪cin >> x . lap_price‬‬ ‫اٌّسزماَ ‪٘ٚ‬ىذا ٔى‪ ْٛ‬لا لّٕب ثؾً اٌسؤاي ‪.‬‬

‫‪15.‬‬ ‫; "‪cout << "Enter your laptpp serial :‬‬ ‫ٍالظؾةةٔ ‪ :‬فٕددا ا خددبي وٍّددبد اٌدد‪ ٝ‬سٍسددٍٗ سِز‪٠‬ددٗ‬
‫‪16.‬‬ ‫; ‪cin >> x . lap_serial‬‬ ‫أ‪ِ ٞ‬صددف‪ٛ‬يٗ سِز‪٠‬ددٗ وّددب يدد‪ ٟ‬اٌمغدد‪٠ 7 ٚ 5 ٖٛ‬غددت اٌزم‪١‬ددا‬
‫ثقدددا اٌقٕبصدددم اٌّاخٍدددٗ ا‪ ٚ‬اٌؾدددم‪ ٚ‬اٌّاخٍدددٗ ‪ٌٚ‬ىدددٓ يددد‪ٟ‬‬
‫‪17.‬‬ ‫;"‪cout << endl << x.lap_name << "\t‬‬
‫‪18.‬‬ ‫;"‪cout << x . lap_price <<"\t‬‬ ‫ثمٔبِظ اٌج‪ٛ‬سالٔا ‪٠‬اخً اٌسٍسٍٗ وبٍِٗ ِ‪ّٙ‬ب ودبْ ع‪ٌٙٛ‬دب ٌد‪ٛ‬‬
‫‪19.‬‬ ‫; ‪cout << x . lap_serial‬‬ ‫وبٔذ اوجم ثىض‪١‬م ِٓ ع‪ٛ‬ي اٌسٍسٍٗ اٌّقميٗ اخً اٌزمو‪١‬دت‬
‫ي‪١‬م‪ َٛ‬ثؾغز٘ب ‪ٚ‬اٌزقبِدً ِق‪ٙ‬دب ‪ٕ٘ٚ‬دب اٌمٍدً ثدٕفس اٌجمٔدبِظ‬
‫‪20.‬‬ ‫;)(‪getch‬‬ ‫ي‪١‬غت اٌزم‪١‬ا ثم‪ٛ‬افا ٌ خ اٌس‪ ٟ‬ثٍ ثٍ ‪.‬‬
‫} ‪21.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫داضةػسحصػحجمػاضطتغغراتػ)( ‪sizeof‬‬
‫ؽغّٗ وّقبًِ اٌ‪٘ ٝ‬ذٖ اٌااٌخ ‪.‬‬ ‫ؽغُ اٌّز ‪١‬م ‪ٚ‬ذٌه ثزّم‪٠‬م ٘ذا اٌّز ‪١‬م اٌّما يؾ‬ ‫رسزماَ ٘ذٖ اٌااٌخ ٌفؾ‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ ظجٌ ٍزغ‪ٞ‬ش ٍِ اىْ٘ؿ اىقذد‪ ٛ‬اىصح‪ٞ‬ح ‪.‬‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫‪//------------------------------A‬‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫;‪int x=9‬‬
‫‪7.‬‬ ‫;)‪cout << "The size of Integer is : " << sizeof (x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ ظجٌ ٍزغ‪ٞ‬ش ٍِ اىْ٘ؿ اىقذد‪ ٛ‬اىحق‪ٞ‬ق‪. ٜ‬‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫‪//------------------------------A‬‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫;‪float x=9‬‬
‫‪7.‬‬ ‫;)‪cout << "The size of float is : " << sizeof (x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ ظجٌ ٍزغ‪ٞ‬ش ٍِ اىْ٘ؿ اىقذد‪ ٛ‬اىحق‪ٞ‬ق‪ ٜ‬اىَضبفف ‪.‬‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫‪//------------------------------A‬‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫;‪double x=9‬‬
‫‪7.‬‬ ‫;)‪cout << "The size of double is : " << sizeof (x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ ظجٌ ٍزغ‪ٞ‬ش ٍِ اىْ٘ؿ اىقذد‪ ٛ‬اىصح‪ٞ‬ح اىَضبفف ‪.‬‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫‪//------------------------------A‬‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫;‪long x=9‬‬
‫‪7.‬‬ ‫;)‪cout << "The size of long is : " << sizeof (x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ ظجٌ ٍزغ‪ٞ‬ش ٍِ اىْ٘ؿ اىَْغق‪. ٜ‬‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫‪//------------------------------A‬‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫;‪bool x‬‬
‫‪7.‬‬ ‫;)‪cout << "The size of bool is : " << sizeof (x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ ظجٌ ٍزغ‪ٞ‬ش ٍِ اىْ٘ؿ ‪. short‬‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫‪//------------------------------A‬‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫;‪short x‬‬
‫‪7.‬‬ ‫;)‪cout << "The size of short is : " << sizeof (x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ ظجٌ ٍزغ‪ٞ‬ش ٍِ اىْ٘ؿ اىحشف‪. char ٜ‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫‪//------------------------------A‬‬
‫‪4.‬‬ ‫) ( ‪void main‬‬
‫‪5.‬‬ ‫{‬
‫‪6.‬‬ ‫;‪char x‬‬
‫‪7.‬‬ ‫;)‪cout << "The size of char is : " << sizeof (x‬‬
‫‪8.‬‬ ‫;) ( ‪getch‬‬
‫‪9.‬‬ ‫}‬

‫ٍثبه امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ ظجٌ ٍزغ‪ٞ‬ش ٍِ اىْ٘ؿ اىغيغخ اىشٍض‪ٝ‬خ ‪. string‬‬

‫‪1.‬‬ ‫>‪#include <iostream.h‬‬


‫‪2.‬‬ ‫>‪#include <conio.h‬‬
‫‪3.‬‬ ‫>‪#include <string‬‬
‫‪4.‬‬ ‫‪//------------------------------A‬‬
‫‪5.‬‬ ‫) ( ‪void main‬‬
‫‪6.‬‬ ‫{‬
‫‪7.‬‬ ‫;"‪char x[]="yousef anaya‬‬
‫‪8.‬‬ ‫;)‪cout << "The size of string is : " << sizeof (x‬‬
‫‪9.‬‬ ‫;) ( ‪getch‬‬
‫‪10.‬‬ ‫}‬

‫رذس‪ٝ‬ت امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىزقش‪ٝ‬ف ٍصف٘فخ رزنُ٘ ٍِ ‪ 5‬فْبصش ٍِ اىْ٘ؿ اىقذد‪ ٛ‬اىصح‪ٞ‬ح ثٌ قٌ ثفحص‬
‫ظجَٖب ثٌ اعجقخ في‪ ٚ‬اىشبرخ ‪.‬‬

‫رذس‪ٝ‬ت امزت ثشّبٍج ثيغخ اىغ‪ ٜ‬ثيظ ثيظ ىغجبفخ ظجٌ مبئِ ٍِ أ‪ ٛ‬رشم‪ٞ‬ت قَذ ثزقش‪ٝ‬فخ ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫ػبلػارغدػانػاصبحػصغاداػ ػ‬،‫ػاظاػالػارغدػدَطَصاَػ‬:‫طبدأػطاضبػبرطجهػ‬

‫ةش‬ٞ‫ ظةشٗف ٗ ٍزغ‬12 ‫ةٔ ع٘ىٖةب‬ٝ‫بسٓ ٍةِ ّة٘ؿ عيغةئ سٍض‬ٞ‫ ّة٘ؿ اىغة‬ٚ‫ في‬ٛ٘‫حز‬ٝٗ car َٔ‫بسٓ اع‬ٞ‫ت ىغ‬ٞ‫ فشف رشم‬:5 ‫ٍثبه‬
ٔ‫ة‬ٞ‫ةبد اى‬ٝ٘‫ح ثٌ فشف مبئِ ٗادخةبه ٕةزٓ اىَحز‬ٞ‫بسٓ ٍِ ّ٘ؿ فذد صح‬ٞ‫و اىغ‬ٝ‫ش ىَ٘د‬ٞ‫ ٍٗزغ‬ٜ‫ق‬ٞ‫بسٓ ٍِ ّ٘ؿ فذد ظق‬ٞ‫ىثَِ اىغ‬
‫بد ٍِ مبئِ اخش ؟‬ٝ٘‫ٍِ اىَغزخذً ثٌ اعجـ ٕزٓ اىَحز‬

1. #include <iostream.h>
2. #include <conio.h>
3. struct car
4. {
5. char car_name[10];
6. float car_price;
7. int car_model;
8. } x , y ;
9. void main ( )
10. {
11. cout << "Enter your car name :" ;
12. cin >> x.car_name ;

13. cout << "Enter your car price :" ;


14. cin >> x.car_price ;

15. cout << "Enter your car model :" ;


16. cin >> x.car_model ;

17. strcpy (y.car_name , x.car_name ) ;


18. y.car_price = x.car_price ;
19. y.car_model = x.car_model;

20. cout << endl << y.car_name << "\t";


21. cout << y.car_price <<"\t";
22. cout << y.car_model ;

23. getch();
24. }

‫ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬:‫اردادػوتقدغمػاضطاضبػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اظذاءػطصفوسهػطنػاضصائظات ػ‬

‫فٕب ٔزم‪ ً١‬فز‪٠‬ز‪ ٞ‬اٌااس ٌ‪ ٛ‬اس ٔب اْ ٔ‪ٛ‬سس خصبج رمو‪١‬ت ِق‪ ، ٓ١‬اٌ‪ ٝ‬فا وج‪١‬دم ِدٓ اٌىبجٕدبد ‪ِ ،‬دبذا سدٕفقً ؟‬
‫ً٘ سٕم‪ َٛ‬ثزقم‪٠‬ف ٘ذٖ اٌىبجٕبد ‪ٚ‬اؽا رٍ‪ ٛ‬االخم ؟ ٘ذا يد‪ ٟ‬ؽدبي ودبْ ٌدا‪ٕ٠‬ب فدا لٍ‪١‬دً ِدٓ اٌىبجٕدبد ‪ ،‬يّدبذا ٌد‪ ٛ‬اس ٔدب اْ ٕٔةدئ‬
‫‪ 155‬ودبجٓ ِدضال ا‪ 1555 ٚ‬ودبجٓ وقدا عدالة ِاسسدٗ يدال ‪٠‬قمدً اْ ٔمد‪ َٛ‬ثبٔةدبء ٌىدً عبٌدت ودبجٓ وّدب وٕدب ٔفقدً سدبثمب ‪ ،‬ي‪ٙ‬دذا‬
‫اٌغم‪٠‬مٗ رصجؼ ِقماٖ ‪ٚ ،‬ال رصٍؼ ٌزقم‪٠‬ف فا وج‪١‬دم ِدٓ اٌىبجٕدبد ي‪ٕٙ‬دب عبجدذ اٌّصدف‪ٛ‬يبد ٌزؾدً ٌٕدب اٌّةدىٍٗ ‪ٚ ،‬رسد‪ ًٙ‬فٍ‪ٕ١‬دب‬
‫وزبثخ اٌجماِظ ‪ٚ‬أةبء اٌقا‪٠‬ا ِٓ اٌىبجٕبد ثغم‪٠‬مٗ اٌّصف‪ٛ‬يبد ‪.‬‬
‫‪ٕ٘ٚ‬ددب سددزم‪ٛ‬ي ٌدد‪ ٟ‬ثددبْ اٌّصددف‪ٛ‬يٗ رؾزدد‪ ٞٛ‬فٍدد‪ ٝ‬فٕبصددم ِزغبٔسددٗ يى‪١‬ددف سددٕم‪ َٛ‬ثزمددز‪ ٓ٠‬اٌىبجٕددبد اٌزدد‪ ٟ‬رؾزدد‪ ٞٛ‬فٍدد‪ٝ‬‬
‫ِز ‪١‬ماد ِمزٍفٗ ‪ٕ٘ٚ ،‬ب ال‪ٛ‬ي ٌه ثبٔه رم‪ َٛ‬ثزمز‪ٔ ٓ٠‬فس اٌىبجٕبد ثبسّ‪ٙ‬ب أ‪ ٞ‬اْ اٌّصف‪ٛ‬يٗ رزى‪ِ ْٛ‬دٓ فٕبصدم ِزغبٔسدٗ ‪٘ٚ‬د‪ٟ‬‬
‫اٌىبجٕبد أ‪ٔ ٞ‬فس اٌىبجٓ ‪.‬‬

‫‪ٌٚ‬ىٓ ثم‪ ٟ‬فٍ‪ٕ١‬ب اْ ٔقٍُ و‪١‬ف ‪٠‬زُ أةبء ِصف‪ٛ‬يٗ ِٓ اٌىبجٕبد ‪ٚ‬اسٕب ل‪ٌٙ ُ١‬ب ‪ .‬يبْ خغ‪ٛ‬اد أةبء ِصف‪ٛ‬يٗ ِٓ اٌىبجٕبد‬
‫٘‪ٔ ٟ‬فس خغ‪ٛ‬اد أةبء اٌىبجٓ ‪ٌٚ ،‬ىٓ فٕا أةبء اٌىبجٓ ٔقميٗ فٍ‪ ٝ‬أٗ ِصف‪ٛ‬يٗ أ‪ ٞ‬ثقاٖ ٔفزؼ ال‪ٛ‬ا اٌّصف‪ٛ‬يٗ ] [ ‪ٔٚ ،‬ضدـ‬
‫فا اٌىبجٕبد اٌذ‪ٔ ٞ‬م‪٠‬ا أةبج‪ٙ‬ب ث‪ ٓ١‬االل‪ٛ‬ا ‪ٚ ،‬ثّب أ‪ٙ‬ب ِصدف‪ٛ‬يٗ وبجٕدبد يبٕٔدب ثؾبعدٗ اٌد‪ ٝ‬أ‪ ٞ‬عٍّدٗ ‪ٚ‬ساْ ال خدبي ِز ‪١‬دماد‬
‫اٌىبجٓ ٔفسٗ ‪٘ٚ ،‬ذا ِب رقٍّٕبٖ سبثمب ‪٠ٚ ،‬غت اْ ال ٕٔس‪ٚ ٝ‬ضـ ؽ‪ٛ‬اصدم } { ٌغٍّدٗ اٌدا‪ٚ‬ساْ اذا اسدزمإِب عٍّدٗ اٌدا‪ٚ‬ساْ ‪for‬‬
‫ِضال ‪ٌ ،‬ؾصم اٌغًّ اٌزبثقٗ ٌٍا‪ٚ‬ساْ ‪ ،‬اذا وبْ ٌا‪ٕ٠‬ب اوضم ِٓ عٍّدٗ سد‪١‬زُ رٕف‪١‬دذ٘ب فٕدا اعدماء اٌدا‪ٚ‬ساْ ‪٠ٚ ،‬غدت اْ ال ٕٔسد‪ ٝ‬اْ‬
‫ٔضـ ثقا اٌىبجٓ ِجبحمٖ اخً ِمغـ اٌا‪ٚ‬ساْ ‪ٚ ،‬لجً إٌمغدٗ ِز ‪١‬دم عٍّدٗ اٌدا‪ٚ‬ساْ ِؾصد‪ٛ‬س ثد‪٘ٚ ، [ ] ٓ١‬ىدذا ا‪٠‬ضدب ٌٍغجبفدٗ‬
‫‪٠‬غت اْ ٔسزماَ عٍّخ ‪ٚ‬ساْ ‪ٚ‬ثٕفس اٌغم‪٠‬مٗ ٘ىذا ‪:‬‬

‫; ٍزغ‪ٞ‬ش اىَشاد ٍقبىجزٔ ‪ٍ ] .‬زغ‪ٞ‬ش اىذٗساُ [ اعٌ اىنبئِ‬

‫‪٘ٚ‬ذا ِب رقٍّٕبٖ سبثمب فٕا اال خبي ‪ٚ‬االخماط ي‪ ٟ‬اٌّصف‪ٛ‬يبد‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫ػبلػارغدػانػاصبحػصغاداػ ػ‬،‫ػاظاػالػارغدػدَطَصاَػ‬:‫طبدأػطاضبػبرطجهػ‬

: ٔ‫ة‬ٞ‫ٔ اىزبى‬َٞ‫شاد اىَْز‬ٞ‫ اىَزغ‬ٚ‫ في‬ٛ٘‫حز‬ٝ ‫ث‬ٞ‫ ثح‬، Telephone Directory ( َٔ‫و ٕبرف اع‬ٞ‫ت ىذى‬ٞ‫ فشف رشم‬: 6 ‫ٍثبه‬
ٗ ‫ح‬ٞ‫ةو ٍةِ ّة٘ؿ فةذد صةح‬َٞ‫ ٗسقةٌ اىق‬، douple ‫ ٗ سقٌ اىٖبرف ٍةِ ّة٘ؿ‬، ‫ ظشف‬22 ٔٝ‫و ٍِ ّ٘ؿ عيغئ سٍض‬َٞ‫( اعٌ اىق‬
ٙ٘‫ ثةٌ اعجةـ ٍحزة‬3 ‫ ثةٌ فةشف ٍصةف٘فٔ ٍةِ اىنبئْةبد فةذدٕب‬، ‫ ظةشف‬22 ‫ةٔ ع٘ىٖةب‬ٝ‫ةو ٍةِ ّة٘ؿ عيغةئ سٍض‬َٞ‫فْ٘اُ اىق‬
‫بد اىنبئِ االٗه رغجـ اخشا داخو ٍصف٘فٔ اىنبئْبد ؟‬ٝ٘‫ اُ ٍحز‬ٛ‫ أ‬ٜ‫اىنبئْبد ثشنو فنغ‬
1. #include <iostream.h>
2. #include <conio.h>
3. struct Telephone_Directory
4. {
5. char name[20];
6. double tel_number ;
7. int person_number ;
8. char person_address [20];
9. } x [ 3 ] ;
10. void main ( )
11. {
12. for (int i=0;i<3;i++)
13. {
14. cout << "Enter yor name :" ;
15. cin >> x [ i ] . name ;

16. cout << "Enter your phone number :" ;


17. cin >> x [ i ] . tel_number ;

18. cout << "Enter your number :" ;


19. cin >> x [ i ] . person_number ;

20. cout << "Enter your address :" ;


21. cin >> x [ i ] . person_address ;
22. cout << endl<< endl;
23. }

24. cout << "name" <<"\t" << "tel_number" << "\t" << "person_number" << "\t" << "person_address" << endl;
cout << "------------------------------------------------------";

25. for (int i=2 ; i>=0;i--)


26. {
27. cout << endl << x [ i ] . name << "\t";
28. cout << x [ i ] . tel_number <<"\t\t";
29. cout << x [ i ] . person_number <<"\t\t" ;
30. cout << x [ i ] . person_address ;
31. }
32. getch();
33. }

. ٗ‫اضؾ‬ٚ ْٛ‫ف رى‬١‫ و‬for ْ‫سا‬ٚ‫اصً عًّ اٌا‬ٛ‫ضب ؽ‬٠‫ الؽؼ ا‬ٛ‫ت اٌى‬١‫َ ثزمر‬ٛ‫ف ٔم‬١‫و‬ ‫ اٌااس‬ٞ‫ز‬٠‫الؽؼ فز‬

‫ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬:‫اردادػوتقدغمػاضطاضبػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫يدد‪ ٟ‬اٌمغدد‪ 3 ٖٛ‬لّٕددب ثزقم‪٠‬ددف اسددُ اٌزمو‪١‬ددت ‪٘ٚ‬دد‪١ٌ ٛ‬ددً اٌ‪ٙ‬ددبرف ‪ٕ٘ٚ Telephone_Directory‬ددب ‪ٚ‬ضددقٕب االٔدداس سددى‪ٛ‬س ثدد‪ٓ١‬‬
‫اٌىٍّز‪ ٓ١‬الْ ٘ذا ِٓ حم‪ٚ‬ط رقم‪٠‬ف اٌّز ‪١‬ماد ‪ٚ‬وذٌه اٌؾدم اال‪ٚ‬ي يد ‪ ٟ‬ودال اٌغٍّزد‪ ٓ١‬ؽدم وج‪١‬دم ي‪ٙ‬دذا عدبجز ا‪٠‬ضدب صدُ لّٕدب‬
‫ثجٕبء عسُ اٌزمو‪١‬ت وّب ي‪ ٟ‬اٌمغ‪ٛ‬اد ‪ٚ 9 – 4‬ذٌه ؽست ِقغ‪١‬بد اٌسدؤاي ‪ٚ‬ودذٌه ثدبٔ‪ٛ‬اؿ اٌّز ‪١‬دماد اٌّغٍ‪ٛ‬ثدٗ ا‪٠‬ضدب ‪ ،‬الؽدؼ‬
‫اٌمغ‪ ٖٛ‬سلُ ‪ 9‬لّٕب ثبٔةبء ِصف‪ٛ‬يٗ ِٓ اٌىبجٕبد اسدّ‪ٙ‬ب ‪ x‬ؽ‪١‬دش رؾزد‪ ٞٛ‬فٍد‪ 3 ٝ‬فٕبصدم أ‪ ٞ‬أ‪ٙ‬دب رؾزد‪ ٞٛ‬فٍد‪ 3 ٝ‬وبجٕدبد ِدٓ‬
‫اٌزمو‪١‬ت ‪ٚ ،‬اِب االْ ‪ٚ‬ثقا ثٕبء اٌزمو‪١‬ت ‪ِٚ‬ز ‪١‬مارٗ إٌّزّ‪ٚ ٗ١‬أةبء ِصف‪ٛ‬يٗ اٌىبجٕدبد سدٕبر‪ ٟ‬فٍد‪ ٝ‬و‪١‬ف‪١‬دٗ ِقبٌغدٗ ٘دذٖ اٌىبجٕدبد‬
‫الؽؼ اٌمغ‪ ٖٛ‬سلُ ‪ 12‬فميٕب عٍّٗ س‪ٚ‬اْ ٌٍّم‪ٚ‬س فٍ‪ ٝ‬فٕبصدم اٌّصدف‪ٛ‬يٗ الؽدؼ اٌمغد‪ٛ‬اد ِدٓ ‪ 23- 13‬ي‪ٕٙ‬دب ردُ ا خدبي لد‪ُ١‬‬
‫ٌّز ‪١‬ماد اٌىبجٕبد ‪٠ٚ‬غت اْ ال ٕٔس‪ ٝ‬اٌؾ‪ٛ‬اصم وّب ي‪ ٟ‬اٌمغ‪ٚ 23 ٚ 13 ٖٛ‬ذٌده الْ ٘دذا اٌغّدً سدزىمس ٌغّ‪١‬دـ اٌىبجٕدبد أ‪ٞ‬‬
‫أ‪ٙ‬ب ربثقٗ ٌّمغـ اٌا‪ٚ‬اْ ‪ٔٚ‬ؾٓ ٔقٍُ ا‪٠‬ضب اْ عٍّٗ اٌا‪ٚ‬ساْ ثا‪٘ ْٚ‬ذٖ اٌؾ‪ٛ‬اصم سدزىمس يمدظ اٌغٍّدٗ اال‪ٌٚ‬د‪ ٝ‬اٌزد‪ ٟ‬رىد‪ ْٛ‬ثقدا٘ب‬
‫ِجبحمٖ يمظ ‪ٌ ،‬ذٌه ‪٠‬غت اْ ٔؾصم اٌغًّ اٌزبثقٗ ٌٍا‪ٚ‬ساْ ‪ٚ‬اٌز‪ٔ ٟ‬م‪٠‬ا رىماس٘ب ي‪ ٟ‬وً ِمٖ ‪ٚ .‬ثقا ا ؽبي اٌّقٍ‪ِٛ‬دبد اٌّغٍ‪ٛ‬ثدٗ‬
‫ٌ‪ٙ‬ذٖ اٌىبجٕبد ثم‪ ٟ‬فٍ‪ٕ١‬ب اْ ٔغجـ ٘ذٖ اٌّقٍ‪ِٛ‬بد ٌىً ودبجٓ ‪ٌٚ‬ىدٓ ِغٍدت اٌسدؤاي ‪٠‬م‪٠‬دا عجبفدٗ ِؾز‪٠ٛ‬دبد اٌىدبجٓ اٌضبٌدش ا‪ٚ‬ال صدُ‬
‫اٌضددبٔ‪ ٟ‬صددُ اال‪ٚ‬ي ‪ٔٚ‬ؾددٓ ٔقٍددُ اْ اٌىددبجٓ اٌضبٌددش ‪٠‬ىدد‪ِٛ ْٛ‬لقددٗ ثبٌّصددف‪ٛ‬يٗ يدد‪ ٟ‬اٌمبٔددٗ سلددُ ‪ٚ 2‬ذٌدده الْ سلددُ اٌقٕصددم اال‪ٚ‬ي يدد‪ٟ‬‬
‫اٌّصف‪ٛ‬يٗ ‪٠‬ى‪ ْٛ‬صبؽت اٌمبٔٗ سلُ صفم ‪ ،‬ي‪١‬غت اْ رجاا عٍّٗ اٌا‪ٚ‬ساْ ٌغجبفٗ ِؾز‪٠ٛ‬بد اٌىبجٕبد ِٓ اخم خبٔٗ ‪٘ٚ‬د‪ ٟ‬اٌمبٔدٗ‬
‫اٌضبٔ‪ ٗ١‬صُ رزٕبل ؽز‪ ٝ‬رصً اٌ‪ ٝ‬اٌمبٔٗ اال‪ ٟ٘ٚ ٌٝٚ‬رؾًّ اٌملُ صفم الؽؼ اٌمغ‪ ٖٛ‬سلدُ ‪ٚ 25‬اِدب اٌمغد‪ٛ‬اد ‪٘ 31 – 26‬د‪ٟ‬‬
‫خغ‪ٛ‬اد اٌغجبفٗ ‪ ٟ٘ٚ‬اٌز‪ ٟ‬رقٍّٕب٘ب سبثمب ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫ػبلػارغدػانػاصبحػصغاداػ ػ‬،‫ػاظاػالػارغدػدَطَصاَػ‬:‫طبدأػطاضبػبرطجهػ‬

: ٔٞ‫ٔ اىزبى‬َٞ‫شاد اىَْز‬ٞ‫ اىَزغ‬ٚ‫ في‬ٛ٘‫حز‬ٝ ‫ث‬ٞ‫ ثح‬، Telephone Directory ( َٔ‫و ٕبرف اع‬ٞ‫ت ىذى‬ٞ‫ فشف رشم‬: . ‫ٍثبه‬
ُ‫ح ٗ فْ٘ا‬ٞ‫و ٍِ ّ٘ؿ فذد صح‬َٞ‫ ٗسقٌ اىق‬douple ‫ ظشف ٗ سقٌ اىٖبرف ٍِ ّ٘ؿ‬22 ٔٝ‫و ٍِ ّ٘ؿ عيغئ سٍض‬َٞ‫( اعٌ اىق‬
‫ ٍِ اىنبئْبد‬ٙ‫ ثٌ فشف ٍصف٘فٔ اخش‬3 ‫ ثٌ فشف ٍصف٘فٔ ٍِ اىنبئْبد فذدٕب‬، 22 ‫ٔ ع٘ىٖب‬ٝ‫و ٍِ ّ٘ؿ عيغئ سٍض‬َٞ‫اىق‬
‫خ ؟‬ّٞ‫خ ٗاعجـ اىثب‬ّٞ‫ اىثب‬ٜ‫ ف‬ٚ‫بد اىَصف٘فٔ االٗى‬ٝ٘‫ٍِ ّفظ اىحجٌ ٗاّغخ ٍحز‬
1. #include <iostream.h>
2. #include <conio.h>
3. struct Telephone_Directory
4. {
5. char name[20];
6. double tel_number ;
7. int person_number ;
8. char person_address [20];
9. } x [ 3 ] , y [ 3 ] ;
10. void main ( )
11. {
12. for (int i=0;i<3;i++)
13. {
14. cout << "Enter yor name :" ;
15. cin >> x[i].name ;
16. strcpy (y[i].name , x[i].name ) ;
17. cout << "Enter your phone number :" ;
18. cin >> x[i].tel_number ;
19. y[i].tel_number = x[i].tel_number ;
20. cout << "Enter your number :" ;
21. cin >> x[i].person_number ;
22. y[i].person_number = x[i].person_number ;
23. cout << "Enter your address :" ;
24. cin >> x[i].person_address ;
25. strcpy ( y[i].person_address , x[i].person_address );
26. cout << endl<< endl;
27. }
28. cout << "name" <<"\t" << "tel_number" << "\t" << "person_number" << "\t" << "person_address" <<
endl;
cout << "------------------------------------------------------";
29. for (int i=0 ; i<3;i++)
30. {
31. cout << endl << x[i].name << "\t";
32. cout << y[i].tel_number <<"\t\t";
33. cout << y[i].person_number <<"\t\t" ;
34. cout << y[i].person_address ;
35. }
36. getch();
37. }

. ‫أذ االْ اوضم ا ساوب ٌذٌه‬ٚ ‫ اٌسبثك‬ٛ‫ ٔفس اٌى‬ٛٙ‫ ي‬ٛ‫ ٌةمػ اٌى‬ٟ‫ال اف‬

‫ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬:‫اردادػوتقدغمػاضطاضبػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫‪ِٚ‬ب اس‪٠‬اٖ ِٕه االْ ٘‪ ٛ‬اْ رم‪ َٛ‬ثبٌزقا‪ ً٠‬فٍ‪٘ ٝ‬ذا اٌجمٔبِظ ‪ ،‬ثاي اْ ‪٠‬زُ ا خبي ِصف‪ٛ‬يٗ اٌىبجٕبد اال‪ٌٚ‬د‪ٔٚ ٝ‬سدم‪ٙ‬ب يد‪ٟ‬‬
‫ِصف‪ٛ‬يٗ اٌىبجٕبد اٌضبٔ‪ ٗ١‬ي‪ٔ ٟ‬فدس عٍّدخ اٌدا‪ٚ‬ساْ وّدبْ يد‪ ٟ‬اٌمغد‪ٛ‬اد ‪ ، 27 -13‬اس‪٠‬دا ِٕده اْ رمد‪ َٛ‬ثب خدبي فٕبصدم اٌّف‪ٛ‬يدٗ‬
‫اال‪ ٌٝٚ‬ا‪ٚ‬ال ‪ ،‬صُ رم‪ َٛ‬ثقا ذٌه ثٕسخ ِؾز‪٠ٛ‬بد اٌّصف‪ٛ‬يٗ اال‪ ٌٝٚ‬اخً اٌّصف‪ٛ‬يٗ اٌضبٔ‪ ٗ١‬ثغم‪٠‬مٗ فىس‪ ٗ١‬أ‪ ٞ‬اْ ِؾز‪٠ٛ‬بد اٌىبجٓ‬
‫اال‪ٚ‬ي ي‪ ٟ‬اٌّصف‪ٛ‬يٗ اال‪٠ ٌٝٚ‬ى‪ ٛ٘ ْٛ‬اٌقٕصم االخ‪١‬م ي‪ ٟ‬اٌّصف‪ٛ‬يٗ اٌضبٔ‪٘ٚ ٗ١‬دذا يد‪ ٟ‬عٍّدٗ ‪ٚ‬ساْ خبصدٗ غ‪١‬دم عٍّدخ اٌدا‪ٚ‬ساْ‬
‫اٌّسزماَ ٌالخبي ‪ ،‬صُ اعجـ ِؾز‪٠ٛ‬بد اٌىبجٕبد ِٓ اٌّصف‪ٛ‬يٗ اٌضبٔ‪ ٗ١‬ثغم‪٠‬مٗ فىس‪ ٗ١‬ا‪٠‬ضب أ‪ ٞ‬اْ اٌىدبجٓ االخ‪١‬دم يد‪ ٟ‬اٌّصدف‪ٛ‬يٗ‬
‫اٌضبٔ‪٠ ٗ١‬زُ عجبفزٗ ا‪ٚ‬ال ‪ٍِ ،‬م ٌّب سجك ٘‪ ٛ‬اْ ِب س‪١‬زُ عجبفزٗ ٘‪ِ ٛ‬ؾز‪٠ٛ‬دبد اٌىبجٕدبد ثزمر‪١‬دت اال خدبي أ‪ ٞ‬اْ ِدب ردُ ا خبٌدٗ‬
‫ا‪ٚ‬ال ي‪ ٟ‬ثاا‪ ٗ٠‬اٌجمٔبِظ ٘‪ ٛ‬اٌذ‪ ٞ‬س‪١‬زُ عجبفٗ ا‪ٚ‬ال ‪ .‬اٌى‪ٔ ٛ‬فس اٌّ‪ ٛ‬اٌسبثك ‪ٚ‬الوٓ ثؾبعٗ ٌزقا‪ ً٠‬ثس‪١‬ظ ارمن ؽٍٗ ٌه ‪.‬‬

‫ردةػتراصغبػسيػبرظاطجػواحد ػ‬

‫اِب االْ ‪ٚ‬ثقا اْ رقٍّٕب سبثمب و‪١‬ف‪ ٗ١‬أ ةبء رمو‪١‬دت ‪ٚ‬اؽدا اخدً اٌجمٔدبِظ فٕدب ٔبخدذ يىدمٖ ثٕدبء اوضدم ِدٓ رمو‪١‬دت اخدً‬
‫اٌجمٔبِظ ‪ٚ‬و‪١‬ف‪ِ ٗ١‬قبٌغخ ِؾز‪٠ٛ‬بد وبجٕبر‪ٙ‬ب ‪ ،‬اِب خغد‪ٛ‬اد ثٕدبء اوضدم ِدٓ رمو‪١‬دت ي‪ٙ‬د‪ٔ ٟ‬فدس اٌمغد‪ٛ‬اد اٌزد‪ٔ ٟ‬مد‪ َٛ‬ث‪ٙ‬دب فٕدا ثٕدبء‬
‫اٌزمو‪١‬ت ‪ ،‬اِب خغ‪ٛ‬اد ٔسخ ِؾز‪٠ٛ‬بد ِز ‪١‬م ربثـ ٌىبجٓ ي‪ ٟ‬رمو‪١‬ت اٌ‪ِ ٝ‬ز ‪١‬م رجبؿ ٌىبجٓ ِٓ رمو‪١‬ت اخم ي‪ٔ ٟٙ‬فدس اٌمغد‪ٛ‬اد‬
‫اٌز‪ٔ ٟ‬م‪ َٛ‬ث‪ٙ‬ب فٕا ٔمً ِؾز‪ ٜٛ‬وبجٓ اٌ‪ِ ٝ‬ؾز‪ ٜٛ‬وبجٓ اخم ِٕزّ‪ٌٕ ٟ‬فس اٌزمو‪١‬ت ‪.‬‬

‫ٍثبه ‪ :8‬فشف رشم‪ٞ‬ت اعَٔ ‪ٝ boy‬حز٘‪ ٛ‬في‪ ٚ‬اىَزغ‪ٞ‬شاد اىَْزَ‪ ٔٞ‬اىزبى‪ ( : ٔٞ‬اعٌ ى٘ىةذ ٍةِ ّة٘ؿ عيغةئ سٍض‪ٝ‬ةٔ ع٘ىٖةب ‪22‬‬
‫ظشف ‪ٗ ،‬سقَٔ ٍِ ّ٘ؿ فذد صح‪ٞ‬ح ‪ ،‬ثٌ فةشف مةبئِ ٍةِ ّفةظ اىزشم‪ٞ‬ةت ٗادخةو اىَقيٍ٘ةبد اى‪ٞ‬ةٔ ٍةِ اىَغةزخذً ثةٌ فةشف‬
‫رشم‪ٞ‬ت اخش اعَٔ ‪ٝ person‬حزة٘‪ ٛ‬فية‪ ٚ‬اىَزغ‪ٞ‬ةشاد اىَْزَ‪ٞ‬ةٔ اىزبى‪ٞ‬ةٔ ‪ ( :‬اعةٌ ىشةخص ٍةِ ّة٘ؿ عيغةئ سٍض‪ٝ‬ةٔ ع٘ىٖةب ‪22‬‬
‫ظشف ‪ٗ ،‬سقَٔ ٍِ ّ٘ؿ فذد صح‪ٞ‬ح ‪ ،‬ثٌ اّغخ ٍحز٘‪ٝ‬بد اىنبئِ اىزبثـ ىيزشم‪ٞ‬ت االٗه ‪ boy‬داخو مبئِ ربثـ ىيزشم‪ٞ‬ت اىثةبّ‪ٜ‬‬
‫‪ person‬؟‬

‫>‪1. #include <iostream.h‬‬ ‫الؽددؼ فز‪٠‬ددز‪ ٞ‬اٌددااس يدد‪ ٟ‬اٌمغدد‪ٛ‬اد ‪ 7 – 3‬لّٕددب‬


‫>‪2. #include <conio.h‬‬ ‫ثجٕددبء اٌزمو‪١‬ددت اال‪ٚ‬ي ‪٘ٚ‬دد‪ boy ٛ‬صددُ يدد‪ ٟ‬اٌمغدد‪ٛ‬اد ‪12 – 8‬‬
‫‪3. struct boy‬‬
‫لّٕددب ثجٕدددبء اٌزمو‪١‬دددت اٌضددبٔ‪٘ٚ ٟ‬ددد‪ person ٛ‬أ‪ ٞ‬اْ اٌجمٔدددبِظ‬
‫{ ‪4.‬‬
‫‪5.‬‬ ‫;]‪char name[20‬‬ ‫‪٠‬ؾز‪ ٞٛ‬فٍ‪ ٝ‬رمو‪١‬جٓ اصٕبْ ؽ‪١‬ش فميٕب ِدٓ ودً رمو‪١‬دت ودبجٓ‬
‫‪6.‬‬ ‫; ‪int number‬‬ ‫وّدددب يددد‪ ٟ‬اٌمغددد‪ 12 ٚ 7 ٖٛ‬اِدددب ثدددبل‪ ٟ‬اٌمغددد‪ٛ‬اد ي‪ٙ‬ددد‪ٔ ٟ‬فدددس‬
‫; ‪7. }x‬‬ ‫اٌمغ‪ٛ‬اد اٌز‪ ٟ‬رُ حدمؽ‪ٙ‬ب سدبثمب أ‪ ٞ‬اْ ٔسدخ ِؾز‪٠ٛ‬دبد ودبجٓ‬
‫‪8. struct person‬‬ ‫الخدددم ِدددٓ ٔفدددس اٌزمو‪١‬دددت ٘ددد‪ٔ ٟ‬فدددس اٌمغددد‪ٛ‬اد فٕدددا ٔسدددخ‬
‫{ ‪9.‬‬ ‫ِؾز‪٠ٛ‬بد وبجٓ ِٓ رمو‪١‬ت اٌ‪ ٝ‬وبجٓ اخم ِٓ رمو‪١‬ت اخم ‪.‬‬
‫‪10.‬‬ ‫;]‪char name[20‬‬
‫‪11.‬‬ ‫; ‪int number‬‬
‫; ‪12. }y‬‬
‫) ( ‪13. void main‬‬
‫{ ‪14.‬‬
‫‪15.‬‬ ‫; "‪cout << "Enter your name :‬‬
‫‪16.‬‬ ‫;‪cin >> x.name‬‬
‫‪17.‬‬ ‫;) ‪strcpy ( y . name , x.name‬‬
‫‪18.‬‬ ‫; "‪cout << "Enter your number :‬‬
‫‪19.‬‬ ‫; ‪cin >> x . number‬‬
‫‪20.‬‬ ‫; ‪y . number = x.number‬‬
‫‪21.‬‬ ‫; "‪cout << endl << "name" << "\t" << "number‬‬
‫‪22.‬‬ ‫;"‪cout << endl << "----------------‬‬
‫‪23.‬‬ ‫; ‪cout << endl << y.name << "\t" << y.number‬‬
‫‪24.‬‬ ‫;)( ‪getch‬‬
‫} ‪25.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ترصغبػغحتويػرضىػطتغغرػعوػصائنػطنػترصغبػاخرػ ػ‬

‫أ‪ ٞ‬اْ ‪٠‬ى‪ٕ٘ ْٛ‬بن رمو‪١‬ت ‪٠‬ؾز‪ ٞٛ‬فٍ‪ِ ٝ‬ز ‪١‬م ‪٠‬ى‪٘ ْٛ‬ذا اٌّز ‪١‬م ٘‪ ٛ‬وبجٓ ِٓ رمو‪١‬ت اخم ا‪٠‬ضب ‪.‬‬
‫ً٘ ثبِىبٕٔب اْ ٔم‪ َٛ‬ثزقم‪٠‬دف ودبجٓ ِدٓ رمو‪١‬دت اخدً رمو‪١‬دت اخدم ‪ ،‬ثؾ‪١‬دش ‪٠‬دزُ‬
‫‪struct student‬‬
‫{‬ ‫ِقبٌغٗ ث‪١‬بٔبد ٘ذا اٌىبجٓ ؟ ثبٌغجـ ٔقُ ‪٘ٚ‬ذا ِب رماِٗ ٌٕب ٌ ٗ اٌس‪ٚ ٟ‬اٌس‪ ٟ‬ثٍد‬
‫;] ‪char stu_name [20‬‬ ‫ثٍدد ِددٓ ِم‪ٔٚ‬ددٗ ‪ٌٚ ،‬ىددٓ و‪١‬ددف ‪٠‬ددزُ أةددبء ٘ددذٖ اٌزماو‪١‬ددت اٌّزااخٍددٗ ؟ الؽددؼ‬
‫;] ‪char stu_father_name [20‬‬ ‫فز‪٠‬ز‪ ٞ‬اٌااس ٌ‪ ٛ‬اس ٔب ثٕبء رمو‪١‬دت اسدّٗ عبٌدت ثؾ‪١‬دش ‪٠‬ؾزد‪٘ ٞٛ‬دذا اٌزمو‪١‬دت‬
‫;] ‪char stu_mother_name [20‬‬ ‫فٍدد‪ِ ٝ‬ز ‪١‬ددماد ِٕزّ‪١‬ددٗ ‪٘ٚ‬دد‪ ( ٟ‬االعةةٌ ٗاعةةٌ االة ٗاعةةٌ االً ٗاعةةٌ اىقبئيةةٔ‬
‫;] ‪char stu_family_name [20‬‬ ‫‪ٚ‬اٌقّم ‪ٚ‬اٌقالِبد ؽ‪١‬ش اْ ٌدٗ ‪ 8‬فالِدبد ‪ ،‬الؽدؼ اٌةدىً اٌّغدب‪ٚ‬س ‪ ،‬صدُ اس ٔدب‬
‫; ‪float age‬‬
‫ثٕبء رمو‪١‬ت اخدم ا‪٠‬ضدب ٌّ‪ٛ‬ؽدف ؽ‪١‬دش ‪٠‬ؾزد‪ ٞٛ‬فٍد‪ِ ٝ‬ز ‪١‬دماد ِٕزّ‪١‬دٗ ‪٘ٚ‬د‪( : ٟ‬‬
‫;‪float mark1‬‬
‫;‪float mark2‬‬ ‫االعةةٌ ٗاع ةٌ االة ٗاعةةٌ االً ٗاعةةٌ اىقبئيةةٔ ‪ٚ ،‬اٌغددٕس ‪ٚ‬اٌقّددم ‪ ،‬يالؽددؼ ٕ٘ددب‬
‫;‪float mark3‬‬ ‫فز‪٠‬ددز‪ ٞ‬اٌددااس اْ ٘ددذاْ اٌزمو‪١‬جددبْ ِةددزموبْ يدد‪ ٟ‬خصددبج ِق‪ٕ١‬ددٗ ‪٘ٚ‬دد‪: ٟ‬‬
‫;‪float mark4‬‬ ‫االعٌ ٗاعٌ االة ٗاعٌ االً ٗاعٌ اىقبئيةٔ ‪ ،‬يٍد‪ ٛ‬لّٕدب ثزقم‪٠‬دف ٘دذا اٌّز ‪١‬دماد‬
‫;‪float mark5‬‬ ‫اخً اٌزمو‪١‬ت اال‪ٚ‬ي صُ لّٕب ثزقم‪٠‬ف‪ٙ‬دب اخدً اٌزمو‪١‬دت اٌضدبٔ‪ ٟ‬سد‪١‬بخذ ‪ٚ‬لدذ وج‪١‬دم‬
‫;‪float mark6‬‬ ‫ي‪ ٟ‬وزبثٗ اٌجمٔبِظ ‪ِٚ ،‬بذا اذا وبْ ٌا‪ٕ٠‬ب اوضم ِٓ رمو‪١‬ت ا‪٠‬ضب ِةزمن ثٕفس ٘ذٖ‬
‫;‪float mark7‬‬
‫اٌمصبج اٌّةزموٗ ‪ ،‬ي‪ ًٙ‬سٕىمس وزبثٗ ٘ذٖ اٌمغ‪ٛ‬اد ي‪ ٟ‬عّ‪١‬ـ ٘ذٖ اٌزماو‪١‬ت‬
‫;‪float mark8‬‬
‫;}‬ ‫؟ ي‪ٕٙ‬ب عم‪٠‬مٗ اوضم ِم‪ٔٚ‬دٗ ‪ٚ‬اسدمؿ ِدٓ اٌغم‪٠‬مدٗ اٌسدبثمخ ‪٘ٚ‬د‪ ٟ‬اْ ٔمد‪ َٛ‬ثزقم‪٠‬دف‬
‫٘ذٖ اٌمبص‪ ٗ١‬اٌّةزموٗ ي‪ ٟ‬اٌزماو‪١‬ت ‪ ٟ٘ٚ‬االسدُ ‪ٚ‬اسدُ االة ‪ٚ‬اسدُ االَ ‪ٚ‬اسدُ‬
‫اٌقبجٍٗ ‪ ،‬ي‪ ٟ‬رمو‪١‬ت اخم ‪ ،‬صُ ٔم‪ َٛ‬ثبٔةبء وبجٓ ِٓ ٘ذا اٌزمو‪١‬ت اخً اٌزمو‪١‬ت اٌذ‪٠ ٞ‬ؾزبط ٘ذٖ اٌمصدبج ‪ٕ٘ٚ ،‬دب ِدب ٔمد‪َٛ‬‬
‫ثٗ ٘‪ ٛ‬رقم‪٠‬ف ٘ذٖ اٌّز ‪١‬ماد اخً رمو‪١‬ت أ‪ ٞ‬اْ ٔىزج‪ٙ‬ب ِدمٖ ‪ٚ‬اؽدا يمدظ ‪ ،‬صدُ ٔضدـ اسدُ اٌزمو‪١‬دت ِدـ اٌىدبجٓ اخدً اٌزمو‪١‬دت‬
‫اٌّقٕ‪ِ ٟ‬ـ يبصٍٗ ِٕم‪ٛ‬عٗ ثبفزجبسٖ ِز ‪١‬ما ‪٘ٚ ،‬ىذا ٔى‪ ْٛ‬لا أةبٔب وبجٓ ِٓ رمو‪١‬ت ٘‪ ٛ‬فجبسٖ فٓ ِز ‪١‬م ي‪ ٟ‬رمو‪١‬ت اخم ‪.‬‬

‫فٕب ٔبخذ ِضبال فٍ‪ ٝ‬ذٌه ‪:‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫فشف رشم‪ٞ‬ت اعَٔ ‪ student‬ظ‪ٞ‬ث ‪ٝ‬حز٘‪ ٛ‬في‪ ٚ‬اىَزغ‪ٞ‬شاد اىَْزَ‪ ٔٞ‬اىزبى‪ : ٔٞ‬اىقَش ٗاىشقٌ ٗ مبئِ ٍِ رشم‪ٞ‬ت اعةَٔ ‪name‬‬
‫‪ٝ‬حز٘‪ ٛ‬في‪ ( ٚ‬االعٌ ٗاعٌ االة ٗاعٌ االً ٗاعٌ اىقبئئ ‪ٗ ،‬مبئِ اخش ٍِ رشم‪ٞ‬ت اعَٔ ‪ٝ mark‬حز٘‪ ٛ‬في‪ 8 ٚ‬فالٍبد ‪.‬‬

‫‪1. struct name‬‬ ‫الؽددؼ فز‪٠‬ددز‪ ٞ‬اٌددااس اٌمغدد‪ٛ‬اد ِددٓ ‪٘ 7 -1‬دد‪ ٟ‬رمو‪١‬ددت االسددُ اِددب‬
‫{ ‪2.‬‬ ‫اٌمغدد‪ٛ‬اد ِددٓ ‪ 8‬اٌدد‪ 18 ٝ‬ي‪ٙ‬دد‪ ٟ‬رمو‪١‬ددت اٌقالِددبد ‪ٚ‬اِددب اٌمغدد‪ٛ‬اد ‪25 – 19‬‬
‫‪3.‬‬ ‫;] ‪char first_name [ 20‬‬
‫ي‪ٙ‬دد‪ ٟ‬رمو‪١‬ددت اٌغبٌددت ‪ِٚ ،‬ددب ‪ّٕٙ٠‬ددب ٕ٘ددب ٘دد‪ ٛ‬اٌمغدد‪ ٖٛ‬سلددُ ‪ 24 ٚ 23‬ي‪ٙ‬دد‪ ٟ‬اسددُ‬
‫‪4.‬‬ ‫;] ‪char fater_name [ 20‬‬
‫‪5.‬‬ ‫;] ‪char mother_name [ 20‬‬ ‫اٌزمو‪١‬ت ‪ name‬ؽ‪١‬ش رُ أةدبء ودبجٓ ِٕدٗ ‪٘ٚ‬د‪ٚ x ٛ‬اٌمغد‪ 24 ٖٛ‬ي‪ٙ‬د‪ ٟ‬رمو‪١‬دت‬
‫‪6.‬‬ ‫;] ‪char family [ 20‬‬ ‫اٌقالِبد ‪ mark‬ؽ‪١‬ش رُ اْ حبء وبجٓ ِٕدٗ ا‪٠‬ضدب ‪٘ٚ‬د‪ ، y ٛ‬ي‪ٙ‬دذاْ اٌّز ‪١‬دماد‬
‫;} ‪7.‬‬ ‫ّ٘ب وبجٕبد ِٓ رمو‪١‬ت أ‪ ٞ‬اْ اٌزمو‪١‬ت ‪ student‬اؽزد‪ ٜٛ‬فٍد‪ِ ٝ‬ز ‪١‬دماد ٘د‪ٟ‬‬
‫‪8. struct mark‬‬ ‫وبجٕبد ِٓ رماو‪١‬ت اخم‪ٚ ٜ‬ثم‪ ٟ‬فٍ‪ٕ١‬ب اْ ٔقٍُ و‪١‬ف ‪٠‬زُ ِقبٌغٗ ٘ذٖ اٌّز ‪١‬ماد‬
‫{ ‪9.‬‬ ‫اٌّ‪ٛ‬ع‪ ٖ ٛ‬يد‪ ٟ‬اٌزماو‪١‬دت ‪ name ٚ mark‬الْ وبجٕبر‪ٙ‬دب ِقميدٗ اخدً اٌزمو‪١‬دت‬
‫‪10.‬‬ ‫;‪float mark1‬‬
‫‪ ، student‬فٕددب ٔزددذوم و‪١‬ددف وٕددب ٔمدد‪ َٛ‬ثّقبٌغددٗ اٌّز ‪١‬ددماد اٌزبثقددٗ ٌٍزمو‪١‬ددت‬
‫‪11.‬‬ ‫;‪float mark2‬‬
‫‪12.‬‬ ‫;‪float mark3‬‬ ‫‪ٚ‬لز‪ٙ‬ب وٕب ٔم‪ َٛ‬ثىزبثٗ اسُ اٌىبجٓ صُ ٔمغدٗ صدُ اسدُ اٌّز ‪١‬دم اٌدذ‪ٔ ٞ‬م‪٠‬دا ِقبٌغزدٗ‬
‫‪13.‬‬ ‫;‪float mark4‬‬ ‫‪ٕ٘ٚ‬ددب يدد‪٘ ٟ‬ددذا اٌزماو‪١‬ددت اٌّزااخٍددٗ االِددم ٔفسددٗ أ‪ ٞ‬إٔددب ٔصددً اٌدد‪ ٝ‬اٌزمو‪١‬ددت‬
‫‪14.‬‬ ‫;‪float mark5‬‬ ‫اٌمددبسع‪٘ٚ ٟ‬دد‪ student ٛ‬فددٓ عم‪٠‬ددك اٌىددبجٓ اٌمددبص ثددٗ صددُ ِددٓ اٌزمو‪١‬ددت‬
‫‪15.‬‬ ‫;‪float mark6‬‬ ‫اٌمبسع‪ ٟ‬اٌ‪ ٝ‬اٌزمو‪١‬ت اٌااخٍ‪ ٟ‬اٌّقميٗ ثااخٍٗ فدٓ عم‪٠‬دك اٌىدبجٓ اٌمدبص ثدٗ‬
‫‪16.‬‬ ‫;‪float mark7‬‬ ‫‪ ٛ٘ٚ‬اٌزمو‪١‬ت ‪ mark ٚ name‬أ‪ ٞ‬إٔب ٔىزت اسُ اٌىدبجٓ اٌمدبسع‪ ٟ‬صدُ إٌمغدٗ‬
‫‪17.‬‬ ‫;‪float mark8‬‬
‫صُ اسُ اٌىبجٓ اٌذ‪ ٞ‬أةأٔبٖ اخً اٌزمو‪١‬ت اٌمبسع‪ ٟ‬صُ إٌمغدٗ صدُ اسدُ اٌّز ‪١‬دم‬
‫;} ‪18.‬‬
‫‪19. struct student‬‬ ‫اٌذ ٔم‪٠‬ا ِقبٌغزٗ ‪٠ٚ‬ى‪٘ ْٛ‬ىذا ‪:‬‬
‫{ ‪20.‬‬
‫‪21.‬‬ ‫;‪int student_number‬‬ ‫; ‪cin >> w . x . first_name‬‬
‫‪22.‬‬ ‫;‪float student_age‬‬ ‫; ‪cin >> w . y . mark1‬‬
‫‪23.‬‬ ‫;‪name x‬‬
‫‪24.‬‬ ‫;‪mark y‬‬
‫;‪25. } w‬‬

‫اٌىبجٓ ‪ ٛ٘ w‬وبجٓ ربثـ ٌٍزمو‪١‬ت ‪ student‬يمّٕب ثىزبثزٗ ا‪ٚ‬ال صُ إٌمغٗ صُ اسُ اٌىبجٓ اٌزبثـ ٌٍزماو‪١‬ت اٌااخٍ‪ ٗ١‬صُ اسُ اٌّز ‪١‬م‬
‫اٌذ‪ٔ ٞ‬م‪٠‬ا ِقبٌغزٗ ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫صغفغهػاضوصولػوطعاضجةػطتغغراتػاضترصغبػاضداخضيػ‪ :‬ػ‬
‫فز‪٠‬ز‪ ٞ‬اٌااس ‪ ،‬ي‪ ٟ‬اٌزماو‪١‬ت اٌّزااخٍٗ فٕب ٔةج‪ٙٙ‬ب ث‪ٙ‬ذا اٌّضبي صُ فٕب ٔزفك فٍ‪ ٝ‬ثق االِ‪ٛ‬س ٌا‪ٕ٠‬ب صٕا‪ٚ‬ل‪A , ٓ١‬‬
‫‪ B‬اٌصٕا‪ٚ‬ق ‪ِ B‬مفً ‪ِٚ‬فزبؽٗ ِ‪ٛ‬ع‪ ٛ‬اخً اٌصٕا‪ٚ‬ق ‪ A‬يقٕاِب ٔم‪٠‬ا اْ ٔفزؼ اٌصٕا‪ٚ‬ق ‪ B‬الثا ٌٕب اْ ٔم‪ َٛ‬ثفدزؼ اٌصدٕا‪ٚ‬ق ‪A‬‬
‫ا‪ٚ‬ال صُ ٔؾصً فٍ‪ ٝ‬اٌّفزبػ ‪ٔٚ‬م‪ َٛ‬ثفزؼ اٌصٕا‪ٚ‬ق ‪٘ٚ ، B‬ىذا اٌؾبي ي‪ ٟ‬اٌزماو‪١‬ت اٌّزااخٍٗ يىً ِدٓ ‪٘ B ٚ A‬د‪ ٟ‬رماو‪١‬دت اِدب‬
‫ِفبر‪١‬ؼ وً ِٓ ٘ذ‪ ٓ٠‬اٌصٕب ‪٠‬ك ي‪ ٟٙ‬اٌىبجٕبد ‪ٚ‬اث‪ٛ‬اة اٌصٕب ‪٠‬ك ٕ٘ب ٘‪ ٟ‬إٌمغٗ اٌز‪ٔ ٟ‬ضق‪ٙ‬ب ثقا اٌّفزبػ " اٌىبجٓ " ‪٘ٚ‬دذا اٌقّدً‬
‫ِٕغم‪١‬ب يقٕاِب ٔم‪٠‬ا اْ ٔصً ٌّؾز‪ ٜٛ‬اٌصٕا‪ٚ‬ق الثا اْ ‪٠‬ى‪ٌ ْٛ‬ا‪ٕ٠‬ب ِفزبػ ٌذٌه ‪٘ٚ‬ىذا ‪.‬‬
‫يقٕددا ِقبٌغددٗ ث‪١‬بٔددبد ربثقددٗ ٌٍزمو‪١‬ددت اٌددااخٍ‪ ٟ‬ا‪ٚ‬ال ٔمدد‪ َٛ‬ثىزبثددٗ اسددُ اٌىددبجٓ إٌّزّدد‪ٌٍ ٟ‬زمو‪١‬ددت اٌىج‪١‬ددم أ‪ ٞ‬إٔددب ٔجدداا ثفددزؼ‬
‫اٌصٕا‪ٚ‬ق اٌىج‪١‬م صُ ٔضـ إٌمغٗ ‪ ٟ٘ٚ‬ثّضبثٗ اث‪ٛ‬اة اٌصٕا‪ٚ‬ق ‪ ،‬صُ ٔؾصً فٍد‪ ٝ‬اٌّفزدبػ ‪٘ٚ‬د‪ ٛ‬اٌىدبجٓ ٌفدزؼ اٌصدٕا‪ٚ‬ق االخدم صدُ‬
‫ٔضـ اسُ اٌىبجٓ اٌذ‪ ٞ‬لّٕب ثزقم‪٠‬فٗ ‪٠ٚ‬ى‪ ْٛ‬ربثـ ٌٍزمو‪١‬ت اٌااخٍ‪ ٟ‬صُ ٔمغٗ ‪٘ٚ‬ىذا ٔى‪ ْٛ‬لا يزؾٕب اٌصٕا‪ٚ‬ق اٌص ‪١‬م صُ ٔضـ اسُ‬
‫اٌّز ‪١‬م اٌذ‪ٔ ٞ‬م‪٠‬ا ِقبٌغزٗ ‪٘ٚ‬ىذا ٔى‪ ْٛ‬لا ‪ٚ‬صٍٕب اٌ‪ ٝ‬اٌزمو‪١‬ت اٌااخٍ‪ٚ ٟ‬ثبِىبٕٔب اعماء اٌقٍّ‪١‬بد وّب رقٍّٕب سبثمب ‪.‬‬

‫ِالؽؾٗ ال ‪٠‬غ‪ٛ‬ز ‪ٚ‬ضـ اٌزمو‪١‬ت اٌااخٍ‪ ٟ‬ثقا اٌزمو‪١‬ت اٌىج‪١‬م أ‪ ٞ‬اٌمبسع‪ ٟ‬الْ ِزمعُ اٌٍ ٗ وّب ارفمٕب سبثمب ‪٠‬م‪ َٛ‬ثبٌزمعّٗ ِدٓ‬
‫افٍ‪ ٝ‬السفً يٍ‪ ٛ‬وبْ اٌزمو‪١‬ت اٌااخٍ‪ ٟ‬اسفً اٌزمو‪١‬ت اٌمبسع‪ ٟ‬س‪٠ ٛ‬م‪ َٛ‬ثزمعّٗ اٌزمو‪١‬ت اٌمدبسع‪ ٟ‬ي‪١‬غدا ثااخٍدٗ رمو‪١‬دت ٌدُ‬
‫‪٠‬قٍُ ثٗ ي‪ٙ‬ذا خغب ‪.‬‬

‫>‪1. #include <__________.h‬‬


‫‪2. #.....‬‬
‫‪3. #.....‬‬
‫اٌزمو‪١‬ت اٌااخٍ‪4. struct s_name ٟ‬‬
‫{ ‪5.‬‬
‫‪6.‬‬ ‫; ] ‪char father [ n‬‬
‫‪7.‬‬ ‫; ] ‪char father [ n‬‬
‫; ……… ‪8.‬‬
‫;} ‪9.‬‬
‫اٌزمو‪١‬ت اٌمبسع‪10. struct student ٟ‬‬
‫{ ‪11.‬‬
‫‪12.‬‬ ‫; ‪s_name x‬‬
‫‪13.‬‬ ‫; ‪float avg‬‬
‫; ‪14. } y‬‬

‫** عجبفخ ِؾز‪ ٜٛ‬وبجٓ ِق‪ ٓ١‬ي‪ِ ٟ‬صف‪ٛ‬يٗ‬


‫فم رمو‪١‬ت عبٌت اسّٗ ‪٠ student‬ؾز‪ ٞٛ‬فٍ‪ ٝ‬اسُ اٌغبٌت ‪ٚ‬سلّٗ ‪ٚ‬رمصصٗ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اضداضةػحدابػطولػاضطصفوسةػ)( ‪strlen‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ػاضداضةػ) ( ‪getline‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫بعدػاضظصفيػ ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اٌا‪ٚ‬اي اٌصا‪٠‬مٗ ٘‪ٛٔ ٟ‬ؿ اخم ِٓ أ‪ٛ‬اؿ اٌا‪ٚ‬اي اٌز‪ٚ ٟ‬يمر‪ٙ‬ب ٌٕب ٌ خ اٌس‪ ٟ‬ثٍ ثٍ ٌٍزقبِدً ِدـ االصدٕب ‪ٚ‬غ‪١‬م٘دب ‪،‬‬
‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس اْ اٌا‪ٚ‬اي إٌّزّ‪ ٗ١‬اٌز‪ ٟ‬رى‪ ْٛ‬اخً رقم‪٠‬ف اٌصدٕف ٘د‪ٚ ٟ‬اي ِٕزّ‪١‬دٗ ٌٍصدٕف ٔفسدٗ ‪ ،‬أ‪٘ ٞ‬د‪ ٟ‬اٌ‪ٛ‬ؽ‪١‬داٖ‬
‫اٌمب سٖ فٍ‪ ٝ‬رقا‪ِ ً٠‬ؾز‪٠ٛ‬بد ٘دذا اٌصدٕف ‪ٚ‬ودذٌه رقدا‪ِ ً٠‬ز ‪١‬ماردٗ إٌّزّ‪١‬دٗ اٌّ‪ٛ‬عد‪ ٖ ٛ‬اخدً اٌمسدُ اٌمدبص ‪ ، private‬يزم‪١‬دً‬
‫فز‪٠‬ز‪ ٞ‬اٌااس ٌ‪ ٛ‬وبْ ٌا‪ٕ٠‬ب اوضم ِٓ صٕف ‪٠‬ةزموبْ ثٕفس اٌااٌٗ أ‪ ٞ‬اْ ‪٠‬ؾزد‪ ٞٛ‬صدٕف فٍد‪ ٝ‬اٌدٗ ٔفدمف أ‪ٙ‬دب رمد‪ َٛ‬ثؾسدبة‬
‫سارت اٌّ‪ٛ‬ؽف‪ٚ ، ٓ١‬صٕف اخم ‪٠‬ؾز‪ ٞٛ‬فٍ‪ ٝ‬اٌٗ ِٕزّ‪ ٗ١‬رم‪ َٛ‬ثؾسبة سارت اٌّاساء ِضال ‪ ،‬أ‪ ٞ‬اْ يد‪ ٟ‬ودال اٌصدٕف‪ٛ٠ ٓ١‬عدا اٌدٗ‬
‫رم‪ َٛ‬ثٕفس اٌقًّ ‪ ٟ٘ٚ‬ؽسبة اٌمارت ‪ ،‬يقٕاِب ٔم‪٠‬ا أةبء اٌصٕف‪ ٓ١‬يبٕٔب سٕم‪ َٛ‬ثزقم‪٠‬ف ‪ٚ‬ثٕدبء ٘دذٖ اٌااٌدٗ إٌّزّ‪١‬دٗ يد‪ ٟ‬اٌصدٕف‬
‫اال‪ٚ‬ي صُ ٔم‪ َٛ‬ثزقم‪٠‬ف‪ٙ‬ب ‪ٚ‬ثٕبج‪ٙ‬ب ي‪ ٟ‬اٌصٕف اٌضبٔ‪ ، ٟ‬يزم‪ ً١‬ا‪٠‬ضب ‪ٚ‬ع‪ ٛ‬ثق االصٕب االخم‪ ٜ‬اخً اٌجمٔبِظ رؾزبط اٌ‪ ٝ‬اٌدٗ‬
‫ٌؾسبة اٌمارت ‪ ،‬يبٕٔب ي‪ ٟ‬وً االصٕب سٕم‪ َٛ‬ثجٕبج‪ٙ‬ب ‪ِّ ،‬ب ‪٠‬بخذ اٌىض‪١‬م ِٓ اٌ‪ٛ‬لذ ‪ٚ‬اٌؾغُ ي‪ ٟ‬ثٕبء ٘ذٖ اٌا‪ٚ‬اي ‪ٚ‬رم‪ ً١‬ا‪٠‬ضب إٔب‬
‫اس ٔب رقا‪ ً٠‬ا‪ ٚ‬اعماء ص‪١‬بٔخ فٍ‪٘ ٝ‬ذٖ اٌا‪ٚ‬اي يبٕٔدب سدٕم‪ َٛ‬ثزقدا‪ ً٠‬ذٌده يد‪ ٟ‬عّ‪١‬دـ االصدٕب اٌد‪١‬س ودذٌه ؟ يمدا ‪ٚ‬يدمد ٌٕدب ٌ دخ‬
‫اٌس‪ ٟ‬ثٍ ثٍ اٌؾً االِضً ‪ٚ‬االس‪ٌ ًٙ‬قالط ٘ذٖ اٌّةىٍٗ ‪ٚ‬وذٌه اٌس‪ٚ ٌٗٛٙ‬اٌسمفٗ ي‪ ٟ‬ثٕدبء اٌجمٔدبِظ ‪ٚ‬ودذٌه رد‪ٛ‬ي‪١‬م اٌّسدبؽٗ‬
‫ي‪ ٟ‬ذاومٖ اٌؾبس‪ٛ‬ة ‪ ،‬يغبءد ٌٕب ثبٌا‪ٚ‬اي اٌصا‪٠‬مٗ أ‪ ٞ‬اْ ٔغقً ٘ذٖ اٌااٌٗ صا‪٠‬مٗ ٌغّ‪١‬ـ االصٕب اٌزد‪ ٟ‬رؾزبع‪ٙ‬دب ‪ ،‬ي‪ٕٙ‬دب ودً ِدب‬
‫ٔم‪ َٛ‬ثٗ ٘‪ ٛ‬يمظ ثٕبء عسُ اٌااٌٗ ِمٖ ‪ٚ‬اؽاٖ يمظ ‪ٔٚ ،‬ضـ ّٔ‪ٛ‬ذط ٌ‪ٙ‬ب اخً االصٕب اٌز‪ ٟ‬رؾزبع‪ٙ‬ب ‪ .‬فٕب ٔبخذ ِضال فٍ‪ ٝ‬ذٌه ‪:‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ٍثبه ‪ :‬امزت صْف اعَٔ ‪ person‬ثح‪ٞ‬ث ‪ٝ‬حز٘‪ ٛ‬في‪ ٚ‬اىَزغ‪ٞ‬شاد اىَْزَ‪ ٔٞ‬اىزبى‪ ( : ٔٞ‬االعٌ ٍِ ّة٘ؿ عيغةئ سٍض‪ٝ‬ةٔ‬
‫ع٘ىٖب ‪ 22‬ظشف ‪ٗ ،‬اىَقذه ٍِ ّ٘ؿ فذد ظق‪ٞ‬ق‪ ، ٜ‬ثٌ فشف داىٔ صذ‪ٝ‬قٔ رقً٘ ثبدخبه ٕزٓ اىَزغ‪ٞ‬ةشاد ثةٌ فةشف داىةٔ صةذ‪ٝ‬قٔ‬
‫اخش‪ ٙ‬ىغجبفٔ ٕزٓ اىق‪ ٌٞ‬ثٌ اّشئ مبئِ ٗاظذ ٍِ ٕزا اىصْف ‪.‬‬

‫الؽددؼ فز‪٠‬ددز‪ ٞ‬اٌددااس اْ خغدد‪ٛ‬اد ثٕددبء‬


‫>‪1. #include <iostream.h‬‬ ‫اٌصددٕف ٘دد‪ٔ ٟ‬فسد‪ٙ‬ب اٌزدد‪ ٟ‬وٕددب ٔمدد‪ َٛ‬ثبرجبف‪ٙ‬ددب سددبثمب‬
‫>‪2. #include <conio.h‬‬
‫فٕاِب وٕب ٔم‪ َٛ‬ثبٔةبء أ‪ ٞ‬صدٕف ‪ ،‬اِدب ثمصد‪ٛ‬ص‬
‫‪3. class person‬‬
‫{ ‪4.‬‬ ‫اٌددا‪ٚ‬اي اٌصددا‪٠‬مٗ يالؽددؼ اٌمغدد‪ 9 ٚ 8 ٖٛ‬يمددا لّٕددب‬
‫‪5.‬‬ ‫; ]‪char person_name [20‬‬ ‫ثزقم‪٠‬دددددف ا‪ ٚ‬ث‪ٛ‬ضدددددـ ّٔددددد‪ٛ‬ذط ٌدددددااٌز‪ ٓ١‬اٌمدددددماءٖ‬
‫‪6.‬‬ ‫; ‪float avg‬‬ ‫‪ٚ‬اٌغجبفٗ يد‪ ٟ‬اٌّىدبْ اٌقدبَ ‪ ، public‬يفد‪ ٟ‬خغد‪ٖٛ‬‬
‫‪7.‬‬ ‫‪public :‬‬ ‫‪ 8‬اٌددٗ ٌٍمددماءٖ ‪ٚٚ ،‬ضددقٕب لجٍ‪ٙ‬ددب اٌقجددبسٖ ‪friend‬‬
‫‪8.‬‬ ‫;)‪friend void read (person & x‬‬ ‫‪ٚ‬ذٌه ٌٍاالٌدٗ فٍد‪ ٝ‬اْ ٘دذٖ اٌااٌدٗ ٘د‪ ٟ‬اٌدٗ صدا‪٠‬مٗ‬
‫‪9.‬‬ ‫;)‪friend void print (person x‬‬
‫ٌ‪ٙ‬ددذا اٌصددٕف ‪ِٚ ،‬ددب ‪٠‬غددت فٍ‪١‬دده اْ رقٍّددٗ ٕ٘ددب اْ‬
‫;} ‪10.‬‬
‫‪//---------------------------‬‬ ‫٘دددذٖ اٌااٌدددٗ غ‪١‬دددم ِٕزّ‪١‬دددٗ ‪ ،‬أ‪ ٞ‬اْ ٘دددذٖ اٌااٌدددٗ ال‬
‫)‪11. void read (person & x‬‬ ‫رسدددزغ‪١‬ـ اٌ‪ٛ‬صددد‪ٛ‬ي ٌٍّز ‪١‬دددماد اٌّ‪ٛ‬عددد‪ ٖ ٛ‬اخدددً‬
‫{ ‪12.‬‬ ‫اٌصٕف ي‪ ٟ‬اٌمسُ ‪ٕ٘ٚ ، private‬ب ِةىٍٗ اذ و‪١‬دف‬
‫‪13.‬‬ ‫; " ‪cout << "Enter your name :‬‬ ‫ٌٕدددب اْ ٔمددد‪ َٛ‬ثّقبٌغدددٗ ث‪١‬بٔدددبد اٌصدددٕف اٌمبصدددٗ‬
‫‪14.‬‬ ‫;‪cin >> x . person_name‬‬ ‫اٌّ‪ٛ‬ع‪ ٖ ٛ‬ي‪ ٟ‬اٌمسُ اٌمبص ‪ private‬؟‬
‫‪15.‬‬ ‫;" ‪cout << "Enter your avg :‬‬
‫يّب ‪٠‬غت فٍ‪١‬ده اْ رمد‪ َٛ‬ثدٗ ٘د‪ ٛ‬اْ رْشةئ‬
‫‪16.‬‬ ‫;‪cin >> x .avg‬‬
‫} ‪17.‬‬ ‫مبئِ ٍِ ٕزا اىصْف ف‪ ٜ‬اىذاىٔ اىشئ‪ٞ‬غ‪ ٔٞ‬ثةٌ رقةً٘‬
‫‪//---------------------------‬‬ ‫ثزَش‪ٝ‬شٓ في‪ٕ ٚ‬زٓ اىذاىٔ " اىصذ‪ٝ‬قٔ " ‪ٚ‬ذٌه ٌىد‪ٟ‬‬
‫)‪18. void print (person x‬‬ ‫رسزغ‪١‬ـ اْ رصً اٌ‪ ٝ‬اٌّز ‪١‬ماد اٌّقميٗ ي‪ ٟ‬اٌمسُ‬
‫{ ‪19.‬‬ ‫اٌمددبص ‪ private‬اخددً اٌصددٕف ‪٘ٚ ،‬ددذا ‪٠‬مزٍددف‬
‫‪20.‬‬ ‫; ‪cout << "your name is : " << x . person_name << endl‬‬ ‫فٓ اٌا‪ٚ‬اي إٌّزّ‪ ٗ١‬يف‪ ٟ‬اٌا‪ٚ‬اي إٌّزّ‪ ٗ١‬فٕداِب وٕدب‬
‫‪21.‬‬ ‫; ‪cout << "your avg is : " << x . avg‬‬
‫ٔم‪ َٛ‬ثّقبٌغٗ أ‪ِ ِٓ ٞ‬ز ‪١‬ماد اٌمسُ اٌمبص ‪ ،‬وٕب‬
‫} ‪22.‬‬
‫‪//---------------------------‬‬ ‫ٔمدد‪ِ َٛ‬جبحددمٖ يدد‪ ٟ‬ذٌدده ‪ ْٚ‬اٌؾبعددٗ ٌىددبجٓ ‪ ،‬يفدد‪ٟ‬‬
‫) ( ‪23. void main‬‬ ‫خغ‪ 25 ٖٛ‬لّٕب ثبٔةدبء ودبجٓ يد‪ ٟ‬اٌااٌدٗ اٌمج‪١‬سد‪، ٗ١‬‬
‫{ ‪24.‬‬ ‫‪ٚ‬لّٕب ثزّم‪٠‬مٖ فجم اٌدٗ اٌمدماءٖ ‪٘ٚ‬د‪، read ( ) ٟ‬‬
‫‪25.‬‬ ‫;‪person opj‬‬ ‫‪ٚ‬وـــدـذٌه فجدم اٌدٗ اٌغجبفدٗ ) ( ‪ ، print‬الؽددؼ‬
‫اٌمغددد‪ٛ‬اد ‪ٔٚ ، 27ٚ 26‬ؾدددٓ ِزفمدددبْ اْ اٌزّم‪٠‬دددم‬
‫‪26.‬‬ ‫;)‪read (opj‬‬
‫‪٠‬ى‪ ْٛ‬ث‪ٛ‬ضـ ( اعٌ اىَزغ‪ٞ‬ش اٗ اىق‪َٞ‬ةٔ اٗ اىنةبئِ‬
‫‪27.‬‬ ‫;)‪print (opj‬‬
‫‪28.‬‬ ‫;)(‪getch‬‬ ‫اٌذ‪ ٕٞٛٔ ٞ‬رّم‪٠‬مٖ ث‪ ٓ١‬االل‪ٛ‬ا اٌ‪ٙ‬الٌ‪ ٗ١‬ثقا وزبثدٗ‬
‫} ‪29.‬‬ ‫اسُ اٌااٌٗ ‪.‬‬
‫يفدددد‪ ٟ‬اٌمغدددد‪ 27 ٚ 26 ٖٛ‬لّٕددددب ثسددددزافبء‬
‫اٌا‪ٚ‬اي ‪ ٟ٘ٚ‬صا‪٠‬مٗ ٌٍصٕف صُ لّٕب ثزّم‪٠‬م وبجٓ ِٓ اٌصٕف ‪ person‬اٌ‪ٙ١‬ب ‪.‬‬
‫‪ٌٚ‬ىٓ ‪٠‬غت اْ ال رٕس‪ ٝ‬اْ ِب لّٕب ثزّم‪٠‬مٖ ٘‪ ٛ‬وبجٓ اٌ‪١‬س وذٌه ؟ ‪٘ٚ‬ذا اٌزّم‪٠‬م ٘‪ ٛ‬رّم‪٠‬م ثبٌم‪ ّٗ١‬اال ف‪ ٜ‬داىةٔ االدخةبه‬
‫فٖ٘ ثبالربسٓ ‪ ،‬يقٕاِب وٕب ّٔمس أ‪ ٞ‬ل‪ ّٗ١‬اٌ‪ ٝ‬أ‪ ٞ‬اٌٗ يبٕٔب ٔسزمجٍ‪ٙ‬ب ثّز ‪١‬م اخم ‪ٌٚ ،‬ىٓ ثٕفس ٔ‪ٛ‬ف‪ٙ‬ب اٌ‪١‬س وذٌه ؟‬
‫أ‪ ٞ‬فٕاِب وٕب ّٔمس اٌ‪ ٝ‬اٌااٌٗ ل‪ ِٓ ّٗ١‬إٌ‪ٛ‬ؿ ‪ِ int‬ضال ‪ ،‬يما وٕب ٔسزمجٍ‪ٙ‬ب ثّز ‪١‬م ِٓ إٌ‪ٛ‬ؿ ‪ int‬ا‪٠‬ضب ‪ٕ٘ٚ ،‬ب ثبٌّضً يّب‬
‫لّٕب ثزّم‪٠‬مٖ ٘‪ ٛ‬وبجٓ ِٓ اٌصٕف ‪ ، person‬ي‪١‬غت فٍ‪١‬ه اْ رسزمجٍٗ ثىدبجٓ ِدٓ ٔفدس ٔد‪ٛ‬ؿ اٌصدٕف اٌدذ‪ِ ٞ‬مسردٗ اٌد‪ ٝ‬اٌااٌدٗ ‪،‬‬
‫الؽؼ اٌمغ‪ ، 9 ٚ 8 ٖٛ‬يىّب ارفمٕب اْ اٌزّم‪٠‬م ‪٠‬ى‪ ْٛ‬ثااخً االل‪ٛ‬ا اٌ‪ٙ‬الٌ‪ٌٍ ٗ١‬ااٌٗ ‪ٕ٘ٚ‬ب لّٕب ثبسدزمجبي اٌىدبجٓ اٌدذ‪ِ ٞ‬مسٔدبٖ ِدٓ‬
‫اٌااٌٗ اٌمج‪١‬س‪ ٗ١‬ثىبجٓ ِٓ ٔفس ٔ‪ٛ‬ؿ اٌصٕف ‪.‬‬
‫‪ٚ‬ا‪ ٚ‬اْ اٌفذ أزجب٘ه ٕ٘ب اٌ‪ ٝ‬اِم ِب ‪ ،‬الؽؼ اْ ي‪ ٟ‬وال اٌااٌز‪ ٓ١‬اٌمماءٖ ‪ٚ‬اال خبي اسُ اٌىبجٓ ٘‪ٚ x ٛ‬لا ‪ٚ‬ضقزٗ فبِاا‬
‫‪ ،‬يّب ‪٠‬غت اْ رقميٗ اْ اٌىبجٓ ‪ x‬ي‪ ٟ‬اٌااٌٗ اٌصا‪٠‬مٗ ٌٍمماءٖ ‪٠‬مزٍف فٓ اٌىبجٓ اٌّقم ث‪ ٓ١‬االل‪ٛ‬ا اٌ‪ٙ‬الٌ‪١‬دٗ يد‪ ٟ‬اٌدٗ اٌغجبفدٗ‬
‫ي‪ ٟ‬خغ‪ٚ، 9 ٖٛ‬ذٌه الْ وً اٌٗ ٌ‪ٙ‬ب خص‪ٛ‬ص‪١‬ز‪ٙ‬ب ‪ٚ‬ؽّب‪٠‬ز‪ٙ‬ب اٌمبصٗ ‪.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫‪ٚ‬أب افٍُ أٗ س‪١‬مغم ثجبٌه اِم ‪٘ٚ‬د‪ٌّ ٛ‬دبذا لّٕدب ث‪ٛ‬ضدـ احدبسٖ & لجدً اٌىدبجٓ يد‪ ٟ‬اٌدٗ اٌمدماءٖ ‪ٌٚ‬دُ ٔمدُ ثدذٌه يد‪ ٟ‬اٌدٗ‬
‫اٌغجبفٗ ‪ٔٚ ،‬ؾٓ ِزفمبْ ٕ٘ب اْ اٌزّم‪٠‬م ي‪ ٟ‬اٌٗ اٌمماءٖ ) ( ‪ ٛ٘ read‬ثبالحبسٖ ‪ ،‬يسدبل‪ٛ‬ي ٌده يد‪ ٟ‬اٌدٗ اال خدبي ‪٠‬غدت اْ ‪٠‬ىد‪ْٛ‬‬
‫اٌىبجٓ ثبالحبسٖ ‪ٚ‬ذٌه ٌى‪ٔ ٟ‬مزْ اٌمد‪ ُ١‬اٌّاخٍدٗ اخدً اٌّز ‪١‬دماد إٌّزّ‪١‬دٗ ‪ ،‬أ‪ ٞ‬إٔدب ٌد‪ٌ ٛ‬دُ ٔمدُ ثزّم‪٠‬دم اٌىدبجٓ ثبالحدبسٖ ي‪ٕٙ‬دب ال‬
‫رمزْ اٌم‪ ُ١‬اٌز‪ ٟ‬راخٍ‪ٙ‬ب فجم اٌٗ اال خبي اٌ‪ِ ٝ‬ز ‪١‬ماد اٌصٕف ‪ ،‬اذا ٌسذ ِزبوا ِٓ ذٌده يغدمة ثٕفسده اؽدذ احدبسٖ & ِدٓ‬
‫إٌّ‪ٛ‬ذط اخً اٌصٕف ي‪ ٟ‬خغ‪ٚ 8 ٖٛ‬وذٌه ِٓ ّٔ‪ٛ‬ذط عسُ اٌااٌٗ ي‪ ٟ‬خغ‪ٚ 11 ٖٛ‬لُ ثب خبي ل‪ ُ١‬صدُ اعجق‪ٙ‬دب سدزم‪ ٜ‬اْ اال خدبي‬
‫رُ ‪ٌٚ ،‬ىٓ ي‪ ٟ‬اٌغجبفٗ ‪٠‬ى‪ ْٛ‬إٌبرظ ٌد‪١‬س ِدب ردُ ا خبٌدٗ ‪ ،‬أ‪ ٞ‬رىد‪ ْٛ‬لد‪ ُ١‬فةد‪ٛ‬اج‪ِ ٗ١‬دٓ اٌدذاومٖ ‪٘ٚ ،‬دذا ‪٠‬قٕد‪ ٟ‬اْ اٌمد‪ ُ١‬اٌّاخٍدٗ ٌدُ‬
‫رمزْ ي‪ِ ٟ‬ز ‪١‬مار‪ٙ‬ب ي‪ ٟ‬اٌصٕف ‪ ،‬اِب ٌٍغجبفٗ يال اف‪ٌ ٟ‬ذٌه ‪.‬‬

‫‪ٌٚ‬ىٓ ‪ٚ‬ثقا أةبء ّٔ‪ٛ‬ذط ٌٍااٌٗ اٌصا‪٠‬مٗ ‪ ،‬سزسبٌٕ‪ٚ ٟ‬و‪١‬ف ال‪ َٛ‬ثبٔةبء عسّ‪ٙ‬ب ‪ ُِّّّّّ ،‬اْ ثٕبء عسُ اٌااٌدٗ ٘د‪ٔ ٛ‬فدس‬
‫ثٕبء عسُ اٌااٌٗ اٌقب ‪ ، ٗ٠‬فٕب ٔم‪ ٜ‬و‪١‬ف لّٕب ثجٕبء عسُ اٌٗ اٌمدماءٖ ‪ ،‬الؽدؼ اٌمغد‪ٛ‬اد ِدٓ ‪ ، 17 – 11‬يفد‪ ٟ‬خغد‪ 11 ٖٛ‬لّٕدب‬
‫ث‪ٛ‬ضددـ ٔفددس إٌّدد‪ٛ‬ذط اٌددذ‪ٚ ٞ‬ضددقٕبٖ اخددً اٌصددٕف ‪ِٚ‬ددب اخزٍددف ٕ٘ددب أددٗ ال ‪٠‬غدد‪ٛ‬ز اْ ٔضددـ لجددً إٌدد‪ٛ‬ذط وٍّددٗ ‪ٚ friend‬اذا‬
‫‪ٚ‬ضقٕب٘ب ي‪ٙ‬ذا خغب ‪ ،‬صُ لّٕب ثغجبفٗ عٍّٗ ر‪ٛ‬ض‪١‬ؾ‪ ٗ١‬ي‪ ٟ‬خغد‪ ، 13 ٖٛ‬اِدب يد‪ ٟ‬خغد‪ 14 ٖٛ‬يمّٕدب ث‪ٛ‬ضدـ اسدُ اٌىدبجٓ اٌدذ‪ ٞ‬لّٕدب‬
‫ثزّم‪٠‬مٖ ‪ٕ٘ٚ‬ب اٌزّم‪٠‬م ثبالحبسٖ وّب ارفمٕب سبثمب ‪ ،‬فقظ ف‪ ٜ‬االدخبه ‪ ،‬صدُ ‪ٚ‬ضدقٕب ٔمغدٗ صدُ اسدُ اٌّز ‪١‬دم اٌدذ‪ٕٔ ٞ‬د‪ِ ٞٛ‬قبٌغزدٗ ِدٓ‬
‫اٌصٕف ‪.‬‬
‫اِب ثبٌٕسجٗ ٌااٌٗ اٌغجبفٗ يجٕبء عسّ‪ٙ‬ب ٘‪ ٛ‬ثٕفس يىمٖ اٌٗ اال خبي وّب ي‪ ٟ‬اٌمغ‪ٛ‬اد ‪ٌٚ 22 – 18‬ىدٓ اٌىدبجٓ ي‪ٙ١‬دب ال‬
‫‪٠‬ى‪ ْٛ‬ثبالحبسٖ ‪.‬‬

‫‪ٚ‬ثقا اْ أز‪ٕ١ٙ‬ب ِٓ حمػ ٘ذا اٌّضبي فٕ‪ ٟ‬اسبٌه سؤاال اال ‪ ً٘ ٛ٘ٚ‬ثبِىبٕٔب أ‪ٔ ٟ‬سّ‪ ٟ‬اٌىبجٓ اٌذ‪ ٞ‬لّٕب ثبٔةبءٖ اخدً‬
‫اٌااٌددٗ اٌمج‪١‬سدد‪٘ٚ ٗ١‬دد‪ opj ٛ‬ثبسددُ ‪ x‬؟ يىددم ع‪١‬دداا يدد‪ ٟ‬ذٌدده ‪ٕ٘ٚ‬ددب اٌغدد‪ٛ‬اة ثبٌزبو‪١‬ددا ٔقددُ يبرفٕددب سددبثمب اْ وددً اٌددٗ ٌ‪ٙ‬ددب خص‪ٛ‬صدد‪١‬ز‪ٙ‬ب‬
‫‪ٚ‬ؽّب‪٠‬ز‪ٙ‬ب اٌمبصٗ ي‪ ٟ‬عسّ‪ٙ‬ب ‪ِٚ ،‬ب ‪٠‬غت فٍ‪١‬ه اْ رقٍّٗ ٕ٘ اُ اعبط رْف‪ٞ‬ز اىجشّبٍج ٕة٘ ٍةِ اىذاىةٔ اىشئ‪ٞ‬غة‪ ، ٔٞ‬أ‪ ٞ‬اْ اٌااٌدٗ‬
‫اٌمج‪١‬س‪ ٟ٘ ٗ١‬لٍت اٌجمٔبِظ ‪ِٕٙٚ‬ب ‪٠‬جاا اٌجمٔبِظ ثبٌقًّ ‪ٕ٠ٚ‬ز‪ ٟٙ‬فٕا رٕف‪١‬ذ اخم عٍّٗ ي‪ ٟ‬عسّ‪ٙ‬ب ‪ٗ ،‬ىنِ اعزذفب اىذاىٔ اىصذ‪ٝ‬قٔ‬
‫‪ٝ‬خزيف فِ اعزذفب اىذاىٔ اىَْزَ‪ٞ‬ةٔ ‪ ،‬الؽدؼ اٌمغد‪ٛ‬اد ‪ ، 27 ٚ 26‬يفد‪ ٟ‬اٌااٌدٗ اٌصدا‪٠‬مٗ ‪٠‬غدت اْ ّٔدمس ودبجٓ ٌٍااٌدٗ ‪٘ٚ‬د‪ِ ٛ‬دب‬
‫أةأٔبٖ ي‪ ٟ‬اٌااٌٗ اٌمج‪١‬س‪ ٛ٘ٚ ٗ١‬ثبسُ ‪. opj‬‬

‫ٍالظؾٔ ٍَٖةٔ ‪ :‬فة‪ ٜ‬اىذاىةٔ اىصةذ‪ٝ‬قٔ فْةذٍب قَْةب ثجْبئٖةب خةبسص جغةٌ اىصةْف ّفغةٔ ىةٌ ّقةٌ ث٘ضةـ ‪ ::‬ىيذالىةٔ فية‪ٚ‬‬
‫االّزَب أ‪ ٛ‬اُ اىذٗاه اىصذ‪ٝ‬قٔ ى‪ٞ‬غذ ٍْزَ‪ ٔٞ‬ىيصْف فقظ ٍب قَْب ثٔ ْٕب ٕ٘ رقش‪ٝ‬ف اىذاىٔ ٍجبرشٓ مب‪ ٛ‬داىٔ فبد‪ٗ ٔٝ‬اّ٘ٓ ْٕب‬
‫ا‪ٝ‬ضب أّ ال ‪ ٝ‬ج٘ص اُ ّضةـ فة‪ ٜ‬ثذا‪ٝ‬ةٔ َّة٘رص اىذاىةٔ ارا مةبُ خةبسص اىصةْف اىقجةبسٓ ‪ friend‬فقةظ ّضةقٖب فة‪ ٜ‬داخةو اىصةْف‬
‫ٗ‪ٝ‬جت اُ رنزت قجو ّ٘ؿ اىق‪ َٔٞ‬اىَشجقٔ ٍِ اىذاىٔ داخو اىصْف ٕٗزا ٍب الظؾزٔ عبثقب ‪.‬‬
‫ٍالظؾٔ ٍَٖٔ ‪ٍ :‬شٓ اخش‪ ٙ‬فْذٍب ّش‪ٝ‬ةذ ادخةبه أ‪ ٛ‬ق‪َٞ‬ةٔ فةِ عش‪ٝ‬ةق داىةٔ صةذ‪ٝ‬قٔ ‪ٝ‬جةت اُ ‪ٝ‬نةُ٘ اىزَش‪ٝ‬ةش ثبالرةبسٓ‬
‫ٗمزىل اىحبه فْذٍب ّش‪ٝ‬ذ اعْبد أ‪ ٛ‬ق‪ َٔٞ‬ىيَزغ‪ٞ‬شاد اىَْزَ‪ْٕٗ ٔٞ‬ب ٍب اقصذٓ ى‪ٞ‬ظ اىجْب ٗارشك ىل رَش‪ ِٝ‬ىزىل ‪.‬‬

‫تضخغصػ‪ :‬ػ‬
‫‪.1‬ػاضداضهػاضصدغق هػرظدػادتدرائكاػغجبػانػظطررػضكاػصائنػطنػظفسػاضصظفػاضتىيػتصىونػصىدغقهػضىهػ‪،‬ػحغىثػانػاضداضىهػ‬
‫اضصدغقهػعيػداضهػزغرػػػػطظتطغهػأيػالػتدتطغدػاضوصولػاضىػاضطتغغراتػاضطظتطغهػضضصظفػبذصلػطباذرػاالػرىنػطرغىقػ‬
‫صائنػ‪ .‬ػ‬
‫‪.2‬ػرظىىدػاظذىىاءػداضىىهػشىىراءهػصىىدغقه ػاليػصىىظفػغجىىبػانػغصىىونػتطرغىىرػاضصىىائنػػباالذىىارهػوذضىىكػضحفىىظػاضقىىغمػداخىىلػ‬
‫اضطتغغراتػاضطظتطغهػضضصظفػ‪ .‬ػ‬
‫‪. 3‬ػسيػحالػوجودػاصثرػطنػداضهػصدغقهػسإدمػاضصائنػاضططررػضكاػضىغسػضىهػأيػرالشىهػ‪،‬ػباضىدوالػاالخىرىػوانػتذىابهػ‪،‬ػأيػ‬
‫باطصاظظاػادتخدامػظفسػادمػاضصائنػاوػاضعاطلػاضططرػسيػجطغدػاضدوالػحتىػاضداضهػاضرئغدغهػ‪ .‬ػ‬
‫‪.4‬ػغطظدػطظعاػباتاػاعاسهػاضصضطهػ‪friend‬ػسيػظطوذجػاضبظاءػاضخارجيػضضداضهػاضصدغقهػأيػاضذيػظبظغهػخارجػاضصظفػ‪ .‬ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫‪.5‬ػشضبػاضبرظاطجػعوػاضداضىهػاضرئغدىغهػ) ( ‪main‬ػ ‪،‬ػأيػانػتظفغىذػاضصىودػاضبرطجىيػغبىداػطىنػاولػجطضىهػسىيػعىذهػاضداضىهػ‬


‫وغظتكيػباخرػجطضهػسغكاػ‪ .‬ػ‬
‫ػ‬
‫تطرغنػ‪:‬ررفػصظفػادطهػ‪TV‬ػ‪،‬ػبحغثػغحتويػرضىػاضطتغغراتػاضطظتطغهػاضتاضغىهػ‪:‬ػ(ػادىمػاضتضفزغىونػوػصىذضكػ‬
‫دعرهػبحغثػغصونػادمػاضتضفزغونػعوػ‪sony‬ػوصذضكػدعرهػ‪5111‬ػسيػداضهػصدغقهػوضغسػرىنػطرغىقػبظىػاءػ‪،‬ػأيػارغىدػ‬
‫انػتدظدػعذهػاضعواطلػاضتضقائهػرنػطرغقػداضهػصىدغقهػ‪،‬ػ ثىمػاظذىكػصىائنػواحىدػسقىطػسىيػاضداضىهػاضرئغدىغهػ‪،‬ػواطبىدػ‬
‫اضقغمػرنػطرغقػداضهػصدغقهػاغعاػ‪ .‬ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫فز‪٠‬ز‪ ٞ‬اٌااس ‪ ،‬ي‪ ٟ‬وض‪١‬م ِٓ االؽ‪١‬دبْ ٔؾزدبط ٌااٌدٗ يد‪ ٟ‬اوضدم ِدٓ صدٕف ‪ٔٚ ،‬ؾدٓ ٔقٍدُ اْ اٌدا‪ٚ‬اي إٌّزّ‪١‬دٗ ٘د‪ٚ ٟ‬اي‬
‫خبصٗ ثبٌصٕف ٔفسٗ ‪ٚ ،‬وذٌه اٌؾبي ثبٌٕسجٗ ٌٍا‪ٚ‬اي اٌقب ‪ ٗ٠‬اٌز‪ ٟ‬وٕب ٔجٕ‪ٙ١‬ب ٌّقبٌغٗ ث‪١‬بٔبد ِق‪ ، ٕٗ١‬يبْ ٘دذٖ اٌدا‪ٚ‬اي اْ ٌدُ رىدٓ‬
‫صا‪٠‬مٗ يال ‪٠‬ؾك ٌ‪ٙ‬ب ِقبٌغٗ اٌج‪١‬بٔبد اٌمبصٗ ثبٌصٕف ٔفسٗ ‪ٕ٘ٚ ،‬دب يد‪ ٟ‬ؽدبي ودبْ ٌدا‪ٕ٠‬ب اوضدم ِدٓ صدٕف ثؾبعدٗ ٌااٌدٗ ِةدزموٗ‬
‫وؾسبة سارت ِ‪ٛ‬ؽف ‪ٚ‬وذٌه ؽسبة سارت ِا‪٠‬م ِضال أ‪ ٞ‬اْ ٘دذٖ اٌدا‪ٚ‬اي يد‪ ٟ‬ودال اٌصدٕف‪ ٓ١‬اٌّ‪ٛ‬ؽدف ‪ٚ‬اٌّدا‪٠‬م ٘د‪ ٟ‬رمد‪ َٛ‬ثدٕفس‬
‫اٌقًّ أ‪ٌٙ ٞ‬ب ٔفس اٌجٕ‪ ٗ١‬ي‪ٕٙ‬ب ٔم‪ َٛ‬ثبٔةبء اٌٗ صا‪٠‬مٗ ٌىال اٌصٕف‪ِّ ٓ١‬ب ‪ٛ٠‬يم فٍ‪ٕ١‬ب اٌ‪ٛ‬لذ ي‪ ٟ‬ثٕبء اٌااٌٗ اخً اٌصٕف‪ ٓ١‬أ‪ ٞ‬إٔدب‬
‫ٔم‪ َٛ‬ثجٕبء عسُ اٌااٌٗ ِمٖ ‪ٚ‬اؽا ‪ٔٚ‬م‪ َٛ‬ثزقم‪٠‬ف‪ٙ‬ب اخً وال اٌصٕف‪ ٓ١‬أ‪ ٞ‬اْ ٘ذٖ اٌااٌٗ س‪ّ١‬مس فٍ‪ٙ١‬ب وبجٓ ِٓ وً صٕف ‪٘ٚ‬ذا ِدب‬
‫حمؽٕب سبثمب ‪ٌٚ‬ىٓ ٕ٘ب ِب ‪٠‬غت فٍ‪١‬ه اْ رقميٗ ٘‪ ٛ‬إٔب فٕاِب ٔم‪ َٛ‬ثبٔةبء اٌصٕف اال‪ٚ‬ي صُ ٔقدم ّٔد‪ٛ‬ذط ٌااٌدٗ صدا‪٠‬مٗ اخدً‬
‫اٌصٕف اال‪ٚ‬ي صُ ٔقدم ثّٕ‪ٛ‬ذع‪ٙ‬دب اخدً اٌصدٕف ودبجٓ ِدٓ اٌصدٕف اال‪ٚ‬ي صدُ ودبجٓ ِدٓ اٌصدٕف اٌضدبٔ‪ٚ ٟ‬ذٌده الْ ٘دذٖ اٌااٌدٗ‬
‫ٌصٕف‪ ٓ١‬اصٕ‪ٚ ٓ١‬سزم‪ َٛ‬ثّقبٌغٗ ث‪١‬بٔبد ي‪ ٟ‬وال اٌصدٕف‪ٕ٘ٚ ، ٓ١‬دب رىّدٓ اٌّةدىٍٗ يدبٌّزمعُ فٕداِب ‪٠‬جداا ثزمعّدٗ اٌىد‪ ٛ‬اٌدذ‪ ٞ‬لّدذ‬
‫ثىزبثزٗ ي‪٠ ٛٙ‬جاا ِٓ ا‪ٚ‬ي وٍّٗ ثب‪ٚ‬ي سغم ي‪ ٟ‬افٍ‪ ٝ‬اٌى‪ٚ ٛ‬فٕاِب ‪٠‬صً فٕا ٔد‪ٛ‬ذط اٌااٌدٗ اٌصدا‪٠‬مٗ سد‪١‬غا ثد‪ ٓ١‬االلد‪ٛ‬ا اٌ‪ٙ‬الٌ‪١‬دٗ‬
‫اسُ وبجٓ ِٓ صٕف غ‪١‬م ِقم أ‪ ٞ‬أٗ ال ‪٠‬قٍُ فٓ ٘ذا اٌىبجٓ أ‪ ٞ‬ح‪ٟ‬ء ‪ٕ٘ٚ‬ب ‪٠‬قغ‪ٕ١‬دب خغدب ‪٘ٚ‬دذا ِٕغم‪١‬دب ‪ٌٚ‬قدالط ٘دذٖ اٌّةدىٍٗ‬
‫‪٠‬غت اْ ‪٠‬ى‪ ْٛ‬رسٍسً اٌقٍّ‪١‬بد ثةىً ِٕغم‪ ٟ‬أ‪ ٞ‬إٔب ‪٠‬غت اْ ٔضـ ّٔ‪ٛ‬ذط ٌٍصٕف االخم ثقا لجً اٌصٕف اال‪ٚ‬ي ‪ ،‬اِب ثبٌٕسدجٗ‬
‫ٌٍصٕف اٌضبٔ‪ ٟ‬يٕم‪ َٛ‬ثزقم‪٠‬ف اٌااٌٗ اٌصدا‪٠‬مٗ ثااخٍدٗ ثدٕفس يىدمٖ اٌااٌدٗ اال‪ٌٚ‬د‪ ٝ‬أ‪ ٞ‬أدٗ ‪٠‬غدت اْ ‪٠‬داخً فٍ‪ٙ١‬دب ودبجٕ‪ٚ ٓ١‬اؽدا ِدٓ‬
‫اٌصٕف اال‪ٚ‬ي ‪ٚ‬اٌضبٔ‪ ِٓ ٟ‬اٌصٕف اٌضبٔ‪ ٟ‬فٍ‪ ٝ‬اٌزمر‪١‬ت ‪.‬‬

‫صورةػتوعغحغهػ‪ :‬ػ‬

‫الؽدددؼ فز‪٠‬ددددز‪ ٞ‬اٌددددااس أددددٗ فٕدددداِب ‪٠‬صددددً‬


‫اٌّزددمعُ فٕددا اٌااٌددٗ اٌصددا‪٠‬مٗ اٌّقميددٗ اخددً اٌصددٕف‬
‫‪ first‬يبٔددٗ ال ‪٠‬قٍددُ ِددب ٘ددذا اٌصددٕف اٌددذ‪ ٞ‬رددُ رّم‪٠‬ددمٖ‬
‫يبرفم ٕب سبثمب ثبْ اٌّزدمعُ ‪٠‬جداا رمعّدٗ اٌىد‪ِ ٛ‬دٓ افٍد‪ٝ‬‬
‫السددفً ‪ٚ‬ثّددب اْ اٌصددٕف اٌضددبٔ‪ِ secand ٟ‬قددم ثقددا‬
‫اٌصدددٕف اال‪ٚ‬ي ي‪ٕٙ‬دددب ‪٠‬قغ‪ٕ١‬ددد‪ ٟ‬خغدددب ‪٠ٚ‬غدددت اْ ٔضدددـ‬
‫ّٔ‪ٛ‬ذط ٌٍصٕف اٌضبٔ‪ ٟ‬لجً رقم‪٠‬ف ‪ٚ‬ثٕبء اٌصدٕف اال‪ٚ‬ي‬
‫‪٘ٚ‬ددذا ِٕغم‪١‬ددب يزسٍسددً رمعّددٗ اٌقٍّ‪١‬ددبد ‪٠‬جدداا ِددٓ افٍدد‪ٝ‬‬
‫اٌ‪ ٝ‬اسفً ‪٠ٚ‬ى‪ ْٛ‬إٌّ‪ٛ‬ذط ٘ىذا ‪:‬‬
‫; ‪class secand‬‬
‫الؽددؼ فز‪٠‬ددز‪ ٞ‬اٌددااس فٕدداِب ٔمدد‪ َٛ‬ث‪ٛ‬ضددـ‬
‫إٌّ‪ٛ‬ذط ٌٍصٕف اٌضبٔ‪ ٟ‬لجدً اٌصدٕف اال‪ٚ‬ي يقٕداِب ‪٠‬جداا‬
‫اٌّزددمعُ ثزمعّددٗ اٌىدد‪ ٛ‬يبٔددٗ ‪٠‬صددً فٕددا ٘ددذا إٌّدد‪ٛ‬ذط‬
‫ي‪١‬قٍُ ثبٔٗ ‪ٛ٠‬عدا صدٕف ث‪ٙ‬دذا االسدُ ‪٠ٚ‬غدت اْ ال رٕسد‪ٝ‬‬
‫اْ رضدددـ اٌفبصدددٍٗ إٌّم‪ٛ‬عدددٗ ثقدددا إٌّددد‪ٛ‬ذط ِجبحدددمٖ‬
‫‪ٚ‬ثا‪ٙٔٚ‬ب خغب ‪.‬‬
‫فٕددب ٔبخددذ ِضددبال فٍدد‪ ٝ‬ذٌدده ٌىدد‪ ٟ‬رصددجؼ اٌفىددمٖ اوضددم‬
‫‪ٚ‬ض‪ٛ‬ػ ‪:‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫>‪1. #include <iostream.h‬‬ ‫طثىىالػ‪:‬ػرىىرفػصىىظفغنػاىىالولػادىىطهػ‪TV‬ػ‬


‫>‪2. #include <conio.h‬‬
‫; ‪3. class radio‬‬ ‫بحغثػغحتويػرضىػاضطتغغراتػاضطظتطغهػاضتاضغهػ‬
‫‪//-------------------------------------------------------------- 1‬‬
‫‪4. class TV‬‬ ‫‪:‬ػ(ػاالدمػطنػظوعػدضدضهػرطزغهػطوضكاػ‪21‬ػحرفػ‪،‬ػ‬
‫{ ‪5.‬‬
‫‪6.‬‬ ‫;]‪char TV_name [20‬‬ ‫واضثاظيػاضدعرػطنػظوعػرددػحقغقيػ)ػ‪،‬ػثمػررفػ‬
‫‪7.‬‬ ‫; ‪float price‬‬
‫‪8. public :‬‬ ‫صىىىظفػاخىىىرػادىىىطهػ‪radio‬ػػبحغىىىثػغحتىىىويػرضىىىىػ‬
‫‪9.‬‬ ‫;)& ‪friend void rest (TV &, radio‬‬
‫‪10.‬‬ ‫;)& ‪friend void read (TV &, radio‬‬ ‫اضطتغغراتػاضطظتطغهػاضتاضغهػ‪:‬ػ(ػاالدىمػطىنػظىوعػ‬
‫‪11.‬‬ ‫;) ‪friend void print(TV , radio‬‬
‫;} ‪12.‬‬ ‫دضدضهػرطزغهػطوضكاػ‪21‬ػحىرفػ‪،‬ػواضثىاظيػاضدىعرػ‬
‫طنػظىوعػرىددػحقغقىيػ)ػ‪،‬ػثىمػرىرفػداضىهػصىػدغقهػ‬
‫‪//-------------------------------------------------------------- 2‬‬
‫‪13. class radio‬‬
‫ضالدخىىىالػوداضىىىهػصىىىدغقهػضضطبارىىىهػورىىىرفػداضىىىهػ‬
‫{ ‪14.‬‬
‫‪15.‬‬ ‫;]‪char radio_name [20‬‬
‫صدغقهػتقومػبوعدػشىغمػصىفرغهػوضغدىتػبظىاءػ‬
‫‪16.‬‬ ‫; ‪float price‬‬
‫‪17. public :‬‬
‫‪18.‬‬
‫‪19.‬‬
‫;)& ‪friend void rest (TV & , radio‬‬
‫;)& ‪friend void read (TV & , radio‬‬ ‫ضصالػاضداضتغنػثمػاظذكػصائنػضصلػصظفػ؟ ػ‬
‫‪20.‬‬ ‫;) ‪friend void print (TV , radio‬‬ ‫الؽؼ اٌى‪ ٛ‬اٌجمِغ‪ ٟ‬يد‪ ٟ‬اٌةدىً اٌّغدب‪ٚ‬س ‪،‬‬
‫; } ‪21.‬‬
‫‪//------------------------------------------------------------- 3‬‬ ‫يما ردُ رغزجزدٗ اٌد‪ 6 ٝ‬يمدماد اِدب يد‪ ٟ‬اٌفمدمٖ ‪2 ٚ 1‬‬
‫)‪22. void rest (TV &a, radio &b‬‬ ‫يما رُ رقم‪٠‬ف وال اٌصٕف‪٘ٚ ٓ١‬ذا ٘د‪ِ ٛ‬غٍدت اٌسدؤاي‬
‫{ ‪23.‬‬
‫‪24.‬‬ ‫; )" "‪strcpy ( a .TV_name ,‬‬
‫اِددب يدد‪ ٟ‬اٌمسددُ سلددُ ‪ 3‬ي‪ٙ‬ددذٖ اٌددٗ صددا‪٠‬مٗ ‪٘ٚ‬دد‪ ٟ‬رمدد‪َٛ‬‬
‫‪25.‬‬ ‫; ‪a . price=0‬‬ ‫ث‪ٛ‬ضـ اٌم‪ ُ١‬اٌصفم‪ٌّ ٗ٠‬ز ‪١‬ماد وال اٌصٕف‪ ٓ١‬يالؽؼ‬
‫‪26.‬‬ ‫; )" "‪strcpy (b . radio_name,‬‬ ‫ّٔ‪ٛ‬ذط ٘دذٖ اٌااٌدٗ لدا ‪ٚ‬ضدـ يد‪ ٟ‬ودال اٌصدٕف‪ ٓ١‬أ‪٠‬ضدب‬
‫‪27.‬‬ ‫; ‪b . price =0‬‬
‫} ‪28.‬‬ ‫وّب ي‪ ٟ‬اٌمغ‪ 18 ٚ 9 ٖٛ‬صدُ ردُ رّم‪٠‬دم ٌ‪ٙ‬دب ودبجٓ ِدٓ‬
‫‪//------------------------------------------------------------ 4‬‬ ‫وددً صددٕف ‪ٌٚ‬ىددٓ ٘ددذا اٌىددبجٓ رددُ رّم‪٠‬ددمٖ ثبالحددبسٖ‬
‫)‪29. void read (TV &a, radio &b‬‬
‫{ ‪30.‬‬
‫يبرفمٕب سبثمب اْ فٕاِب ٔم‪٠‬دا اْ ٔغدم‪ ٞ‬أ‪ٔ ٞ‬مدزْ أ‪ٞ‬‬
‫‪31.‬‬ ‫;"‪cout << "Enter you TV name :‬‬ ‫ل‪ ّٗ١‬فٍ‪ ٝ‬اٌّز ‪١‬ماد إٌّزّ‪ ٗ١‬ال‪ ٞ‬صٕف فٓ عم‪٠‬ك‬
‫‪32.‬‬ ‫;‪cin >> a . TV_name‬‬ ‫اٌٗ صا‪٠‬مٗ ‪٠‬غدت اْ ‪٠‬ىد‪ ْٛ‬اٌزّم‪٠‬دم ثبالحدبسٖ ‪ٌٚ‬ىدٓ‬
‫‪33.‬‬ ‫;"‪cout << "Enter your TV price :‬‬
‫‪34.‬‬ ‫; ‪cin >> a . price‬‬ ‫ٌُ ٔمُ ث‪ٛ‬ضـ اسُ ٌٍىبجٓ ي‪ ٟ‬اخً اٌصٕف ٔفسدٗ يد‪ٟ‬‬
‫‪35.‬‬ ‫;"‪cout << "Enter your Radio name :‬‬ ‫اٌمغدد‪ 18ٚ 9 ٖٛ‬يمددا اوزف‪ٕ١‬ددب ث‪ٛ‬ضددـ احددبسٖ ‪٘ٚ‬ددذا‬
‫‪36.‬‬
‫‪37.‬‬
‫; ‪cin >> b . radio_name‬‬
‫;"‪cout << "Enter your radio price :‬‬
‫عددبجز ‪ٚ‬ثبِىبٔدده ا‪٠‬ضددب اْ رضددـ اسددّـ يددال ِددبٔـ ِددٓ‬
‫‪38.‬‬ ‫;‪cin >> b . price‬‬ ‫ذٌه ‪ٕ٘ٚ‬ب لّٕب ثذٌه ٌٍفذ أزجب٘ه ٌ‪ٙ‬دذا االِدم ‪ٚ‬ودذٌه‬
‫}‪39.‬‬ ‫اٌؾبي ي‪ٔ ٟ‬فس اٌٗ اٌمماءٖ ) ( ‪ read‬الؽؼ اٌّمغدـ‬
‫‪//------------------------------------------------------------ 5‬‬
‫)‪40. void print (TV a, radio b‬‬ ‫اٌماثددـ صددُ ‪ٚ‬ضددقٕب ٌ‪ٙ‬ددب ّٔدد‪ٛ‬ذط اٌااٌددٗ اٌصددا‪٠‬مٗ اخددً‬
‫{ ‪41.‬‬ ‫وال اٌصٕف‪ ٓ١‬وّب ي‪ ٟ‬اٌمغ‪. 19 ٚ 15 ٖٛ‬‬
‫‪42.‬‬
‫‪43.‬‬
‫" ‪cout << "your TV name is :‬‬
‫" ‪cout << "your TV price is :‬‬
‫;‪<< a . TV_name << endl‬‬
‫; ‪<< a . price << endl << endl‬‬
‫الؽدددؼ فز‪٠‬دددز‪ ٞ‬اٌدددااس اٌمغددد‪ 3 ٖٛ‬ي‪ٙ‬ددد‪ٟ‬‬
‫‪44.‬‬ ‫;‪cout << "your Radio name is : " << b . radio_name << endl‬‬ ‫فجدددبسٖ فدددٓ ّٔددد‪ٛ‬ذط ٌٍصدددٕف ‪٘ٚ radio‬ددد‪ ٛ‬اٌّمغدددـ‬
‫‪45.‬‬ ‫; ‪cout << "your Radio price is : " << b . price‬‬ ‫اٌضدبٔ‪ ٟ‬يد‪ ٟ‬اٌىد‪ٚ ٛ‬لدا وّدب ثبسدزمااَ اٌصددٕف ‪radio‬‬
‫}‪46.‬‬
‫‪//----------------------------------------------------------6‬‬ ‫اخً اٌصٕف اال‪ٚ‬ي ‪ TV‬ي‪ ٟ‬اٌّمغدـ اال‪ٚ‬ي وّدب يد‪ٟ‬‬
‫) ( ‪47. void main‬‬ ‫اٌمغددددد‪ٛ‬اد ‪ 11 ٚ 15 ٚ 9‬يٍدددددذٌه ‪ٚ‬ثّدددددب اْ ثٕدددددبء‬
‫{ ‪48.‬‬
‫;‪49. TV a ; radio b‬‬
‫اٌزمو‪١‬ت ‪ radio‬اسفً اٌزمو‪١‬ت ‪ٚ tv‬لّٕدب ثبسدزمااِٗ‬
‫ي‪ ٟ‬اٌزمو‪١‬ت اال‪ٚ‬ي اذ الثا اْ ٔضدـ ٌٍّزدمعُ ّٔد‪ٛ‬ذط‬
‫;) ‪50. rest (a , b‬‬ ‫ٌى‪٠ ٟ‬قٍُ ِب ٘ذا اٌصٕف ‪٘ٚ‬ذا ِب رُ حمؽٗ سبثمب اِدب‬
‫;) ‪51. read (a , b‬‬
‫;) ‪52. print (a , b‬‬ ‫ثبل‪ ٟ‬اٌمغ‪ٛ‬اد ي‪ ٟٙ‬وّب رقٍّٕب اْ ٔىزج‪ٙ‬ب ‪.‬‬
‫;)(‪53. getch‬‬
‫}‪54.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اِب ي‪ ٟ‬اٌااٌٗ اٌمج‪١‬س‪ ٗ١‬يمّٕب ثبٔةبء وبجٓ ِٓ وً صٕف ‪ٚ‬لّٕب ثزّم‪٠‬مٖ فٍ‪ ٝ‬اٌا‪ٚ‬اي اٌّقٕ‪ٚ ٟ٘ٚ ٗ١‬اي صدا‪٠‬مٗ ٌدذا ‪٠‬غدت‬
‫رّم‪٠‬م اٌىبجٓ ‪ٌٚ‬ىٓ ٕ٘ب ا‪ ٚ‬اْ اٌفذ أزجب٘ه الِم ِ‪ ُٙ‬عاا ‪ِ ٛ٘ٚ‬ب رم‪ َٛ‬ثبسسدبٌٗ يد‪ ٟ‬اٌااٌدٗ اٌمج‪١‬سد‪٠ ٗ١‬غدت اْ رسدزفجٍٗ ثبٌزمر‪١‬دت‬
‫ي‪ ٟ‬وً ِىبْ رسزماِٗ ‪ٚ‬وذٌه اٌؾبي ي‪ّٔ ٟ‬بذط اٌا‪ٚ‬اي اٌصا‪٠‬مٗ ي‪ ٟ‬وً صٕف الؽؼ اٌدا‪ٚ‬اي اٌصدا‪٠‬مٗ يد‪ ٟ‬اٌةدىً اٌّغدب‪ٚ‬س يدب‪ٚ‬ي‬
‫وبجٓ ٘‪ ِٓ ٛ‬اٌصٕف ‪ ٛ٘ٚ tv‬ثبٌ‪ ْٛ‬اٌجمرمبٌ‪ ٟ‬يف‪ ٟ‬عّ‪١‬ـ االِبوٓ ٘‪ ٛ‬اال‪ٚ‬ي ‪ٚ‬وذٌه اٌؾبي ي‪ ٟ‬اٌااٌٗ اٌمج‪١‬س‪٘ٚ ٗ١‬ذا اِم ِ‪. ُٙ‬‬
‫اِب االِم االخم اٌذ‪ ٞ‬أ‪ ٞٛ‬رٕ‪ٙ٠ٛ‬ه اٌ‪ ٗ١‬الؽؼ اخً اٌصٕف اال‪ٚ‬ي ‪ٚ‬اٌضبٔ‪ ٟ‬يبٌسقم ٘‪ ٛ‬ثٕفس االسُ الؽدؼ اٌمغد‪ٚ 7 ٖٛ‬‬
‫‪ٕ٘ٚ ، 16‬ب لصأب ذٌه ٌٕقٍّه اْ وً ِز ‪١‬م ‪٠‬ىد‪ِ ْٛ‬قدم اخدً صدٕف ٌد‪١‬س ٌدٗ أ‪ ٞ‬فاللدٗ ثدبالخم ‪ٚ‬أدب افٍدُ االْ أدٗ ‪٠‬مغدم‬
‫ثجبٌه يىمٖ ‪ ٟ٘ٚ‬و‪١‬ف سزّ‪١‬ز ثد‪ ٓ١‬ودال اٌّز ‪١‬دماْ يبع‪١‬جده فٍد‪ ٝ‬ذٌده ث‪ٛ‬ضدـ اسدُ اٌىدبجٓ اٌزدبثـ ٌ‪ٙ‬دذا اٌصدٕف صدُ إٌمغدٗ صدُ اسدُ‬
‫اٌّز ‪١‬م الؽؼ اٌمغ‪ 27 ٚ 25 ٖٛ‬يبسُ اٌىبجٓ ٘‪ٌٍٛ ٛ‬ص‪ٛ‬ي اٌ‪ ٝ‬اٌّز ‪١‬م اٌّقٕ‪٘ٚ ٟ‬ىذا ‪.‬‬
‫اِب ثبٌٕسجٗ ٌزصف‪١‬م اٌسٍسٍٗ اٌمِز‪ ٗ٠‬يبرفمٕب ي‪ ٟ‬ؽدا‪٠‬ش سدبثك اْ اسدٕب أ‪ ٞ‬ل‪ّ١‬دٗ ٌٍسٍسدٗ اٌمِز‪٠‬دٗ ال ‪٠‬دزُ اال فدٓ عم‪٠‬دك‬
‫اٌٗ ٌٍٕسخ اخً ِؾز‪ ٜٛ‬اٌّز ‪١‬م الؽؼ اٌمغ‪ٚ 26 ٚ 24 ٖٛ‬رصف‪١‬م اٌسٍسٍٗ اٌمِز‪ ٛ٘ ٗ٠‬ث‪ٛ‬ضـ اٌضجً و‪ٛ‬ر‪١‬ش وّب ي‪ ٟ‬اٌةىً ‪.‬‬

‫ػ‬
‫ػ‬
‫طاػارجوهػطظكػعوػانػتتطعنػجغداػسيػاضصودػاضبرطجيػوتفكطهػجغداػوالػتقمػبحفظهػبلػاسكمػصغفغهػبظاءهػ‪ .‬ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ػ‬
‫ػ‬
‫>‪#include <iostream.h‬‬ ‫ػ‬
‫>‪#include <conio.h‬‬ ‫ػ‬
‫;‪class person‬‬
‫>‪//-------------------------------‬‬ ‫ػ‬
‫‪class student‬‬
‫{‬
‫ػ‬
‫;‪int x‬‬ ‫ػ‬
‫;‪float y‬‬
‫‪public :‬‬ ‫ػ‬
‫ػ‬
‫;‪friend person‬‬
‫;}‬ ‫ػ‬
‫>‪//-------------------------------‬‬
‫‪class person‬‬ ‫ػ‬
‫{‬ ‫ػ‬
‫;‪int e‬‬
‫;‪int r‬‬ ‫ػ‬
‫‪public :‬‬
‫}; ‪void read (student w){cin >> w.x >> w.y >> e >>r‬‬ ‫ػ‬
‫;}‬ ‫ػ‬
‫>‪//------------------------------‬‬
‫)( ‪void main‬‬ ‫ػ‬
‫{‬
‫; ‪student a ; person d‬‬ ‫ػ‬
‫;)‪d.read (a‬‬ ‫ػ‬
‫ػ‬
‫;)(‪getch‬‬
‫ػ‬
‫}‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ػ‬
‫ػ‬
‫ػ‬
‫طثالػ‪:‬ػطبارةػاضتارغخػبطتغغرػواحدػوحغثػانػاضقغمػثابتهػ ػ‬
‫ػ‬
‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬ ‫ػ‬
‫‪class date‬‬
‫{‬ ‫ػ‬
‫;‪int day‬‬ ‫ػ‬
‫;‪int month‬‬
‫;‪int year‬‬ ‫ػ‬
‫‪public :‬‬
‫} ; ‪date (int d,int m,int y) {day = d ; month = m ; year = y‬‬ ‫ػ‬
‫;)‪friend ostream & operator << (ostream &c , date s‬‬ ‫ػ‬
‫;}‬
‫‪//------------------------------------------‬‬ ‫ػ‬
‫)‪ostream &operator << (ostream &c , date s‬‬
‫{‬ ‫ػ‬
‫; ‪c << "the date is :" << s.day << " / " << s.month << " / "<<s.year‬‬ ‫ػ‬
‫; ‪return c‬‬
‫}‬ ‫ػ‬
‫‪//------------------------------------‬‬
‫ػ‬
‫) ( ‪void main‬‬
‫{‬ ‫ػ‬
‫;)‪date T (12,5,2011‬‬
‫ػ‬
‫; ‪cout << T‬‬ ‫ػ‬
‫;) (‪getch‬‬
‫}‬ ‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫الحظػرزغزيػاضىدارسػانػاضصىودػعظىاػثابىتػأيػانػاضتىارغخػعىوػثابىتػبىظفسػاضبرظىاطجػسىدرظاػاىالنػظصتىبػصىوداػاخىرػ‬
‫بظفسػسصراػاذصالػاضعطضغاتػضالدخالػوالصنػبطتغغرػواحدػسكظاػشطظاػبطبارهػصائنػحغثػغحتويػرضىػ‪3‬ػطتغغىراتػ‬
‫واطاػاالنػسدظقومػبتعرغفػرطضغهػالدخالػرظاصرػصائنػواحدػطرهػواحدهػدرظاػظرىػاضصودػاضتاضيػ ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫طثالػ‪:‬ػررفػصظفػادطهػ‪date‬ػبحغثػغحتويػرضىػاضطتغغراتػاضطظتطغهػاضتاضغهػ‪:‬ػ(ػاضغومػواضذكرػواضتىارغخػ)ػثىمػرىرفػ‬
‫داضهػبظاءػضوعدػرواطلػتضقائغهػصىفرغهػضكىذهػاضطتغغىراتػ)ػثىمػرىرفػرطضغىهػالدخىالػعىذهػاضطتغغىراتػطىنػاضطدىتخدمػ‬
‫وررفػرطضغهػاخرىػضطبارهػعذهػاضطتغغراتػطدػجطلػتوعغحغهػ؟ ػ‬
‫ػ‬
‫>‪#include <iostream.h‬‬ ‫ِب اخزٍف فٓ اٌىد‪ ٛ‬اٌسدبثك إٔدب ٕ٘دب لّٕدب‬
‫>‪#include <conio.h‬‬ ‫ثغقً اٌق‪ٛ‬اًِ اٌزٍمبج‪١‬دٗ ثااٌدٗ ثٕدبء صدُ لّٕدب‬
‫‪//------------------------------------------------------------1‬‬
‫‪class date‬‬
‫ثب خبي ل‪ٌّ ُ١‬ز ‪١‬ماد اٌصٕف فدٓ عم‪٠‬دك‬
‫{‬ ‫فٍّ‪ ٗ١‬الؽؼ اٌّمغـ سلُ ‪ٚ 2‬الودٓ ا‪ ٚ‬اْ‬
‫;‪int day‬‬ ‫اٌفذ أزجب٘ه ٕ٘ب اْ فٍّ‪ ٗ١‬اال خدبي ‪٠‬غدت‬
‫;‪int month‬‬ ‫اْ ‪٠‬ىدد‪ ْٛ‬اٌىددبجٓ اٌددذ‪٠ ٞ‬قددبٌظ اٌّز ‪١‬ددماد‬
‫;‪int year‬‬ ‫ِّددددمس ثبالحددددبسٖ الؽددددؼ ّٔدددد‪ٛ‬ذط فٍّ‪١‬ددددٗ‬
‫‪public :‬‬ ‫اال خبي ‪٘ٚ‬ذا ِدب ارفمٕدب فٍ‪١‬دٗ سدبثمب فٕداِب‬
‫};‪date ( ){day = 0 ; month = 0 ; year = 0‬‬
‫;) ‪friend istream &operator >> (istream &c , date &s‬‬
‫حمؽٕب اٌا‪ٚ‬اي اٌصا‪٠‬مٗ ‪ٚ ،‬فٕدا عجبفدٗ ا‪ٚ‬‬
‫;) ‪friend ostream &operator << (ostream &c , date s‬‬ ‫ا خبي ٘ذٖ اٌّز ‪١‬دماد يد‪ ٟ‬اٌااٌدٗ اٌمج‪١‬سد‪ٗ١‬‬
‫;}‬ ‫لّٕب يمدظ ثب خدبي اسدُ اٌىدبجٓ الؽدؼ عٍّدٗ‬
‫‪//------------------------------------------------------------------2‬‬ ‫اال خبي ‪ٚ‬وذٌه اٌغجبفٗ ‪.‬‬
‫)‪istream &operator >> ( istream &c , date &s‬‬
‫{‬
‫;‪cout << "Enter your day : " ; c >> s.day‬‬
‫;‪cout << "Enter your month :"; c >> s.month‬‬
‫;‪cout << "Enter your year :" ; c >> s.year‬‬
‫}‬
‫‪//-------------------------------------------------------------------3‬‬
‫)‪ostream &operator << (ostream &c , date s‬‬
‫{‬
‫; ‪c << "the date is :" << s.day << " / " << s.month << " / "<<s.year‬‬
‫;‪return c‬‬
‫}‬
‫‪//------------------------------------------------------------------------4‬‬
‫) ( ‪void main‬‬
‫{‬
‫;‪date t‬‬
‫;‪cin >> t‬‬
‫;‪cout << t‬‬
‫;)(‪getch‬‬
‫}‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫تطرغنػ‪:‬ػررفػصظفػادطهػ‪laptop‬ػ بحغثػغحتويػرضىىػاضطتغغىراتػاضطظتغطىهػاضتاضغىهػ(ػادىمػاضالبتىوبػ‪،‬ػودىعرهػ)ػثىمػ‬
‫ررفػبظاءػضوعدػشغمػصفرغهػضكذهػاضطتغغراتػ‪،‬ػوسيػداخلػاضداضهػاضرئغدغهػشمػبادخالػشغمػضكذهػاضطتغغراتػوطررعىاػ‬
‫اضىػاضصظفػباضتطرغرػثمػاطبدػاضظاتجػرنػطرغقػرطضغهػأيػاطبدػاضصائنػ‪ .‬ػ‬
‫اضفصرهػعيػادخلػشغمػطتغغراتػاضصظفػسيػداخلػػاضداضهػاضرئغدغهػ‪،‬ػثمػطررعاػاضىػاضصظفػباضتطرغرػواطبعكاػبعطضغهػ‬
‫االخراجػأيػاطبدػاضصائنػصاطلػ‪ .‬ػ‬
‫اضفصرهػبدغطهػوطاػاختضفػرنػاضدابقػعوػسقطػاالدخالػسيػاضداضهػاضرئغدغهػ ػ‬

‫دؤالػ‪:‬ػصححػاضخطاػسيػاضداضهػاضطجاورهػدؤالػاضظصفيػ ػ‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬
‫;)‪int maximum (int ,int ,int‬‬
‫‪//----------------------------------‬‬
‫)( ‪void main‬‬
‫{‬
‫;)‪cout << maximum(6,2,5‬‬
‫;)(‪getch‬‬
‫}‬
‫)‪int maximum (int x,int y,int z‬‬
‫{‬
‫;‪int max=x‬‬
‫)‪if (y>max‬‬
‫;‪max=y‬‬
‫)‪if (z>max‬‬
‫;‪max=z‬‬
‫;‪return max‬‬
‫}‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫تتبدػظاتجػطاػغضيػ‪:‬ػدؤالػاضطؤذراتػسيػاضظصفيػ‪ :‬ػ‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬
‫)( ‪void main‬‬
‫{‬
‫;‪int firstvalue = 5, secondvalue = 15‬‬
‫;‪int * p1, * p2‬‬

‫;‪p1 = &firstvalue‬‬
‫;‪p2 = &secondvalue‬‬
‫;‪*p1 = 10‬‬
‫;‪*p2 = *p1‬‬
‫;‪p1 = p2‬‬
‫;‪*p1 = 20‬‬
‫;‪cout << "firstvalue is " << firstvalue << endl‬‬
‫;‪cout << "secondvalue is " << secondvalue << endl‬‬
‫;)(‪getch‬‬
‫}‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫ػبلػارغدػانػاصبحػصغاداػ ػ‬،‫ػاظاػالػارغدػدَطَصاَػ‬:‫طبدأػطاضبػبرطجهػ‬

‫ػدؤالػاضظصفي ػ‬:‫اصتبػبرظاطجػضطبارةػتقدغرػطاضبػ‬

#include <iostream.h>
#include <conio.h>
char * print (int );

void main ()
{
int x;
cout << "Enter your avg :";
cin >> x;

cout << print (x);

getch();
}
char *print (int x)
{
if (x>=90&&x<=100)
return "Excellent";
else if (x>=80&&x<=89)
return "Very good";
else if (x>=70&&x<=79)
return "Good";
else if (x>=60&&x<=69)
return "Intermediate";
else if (x>=50&&x<=59)
return "Accepted";
else return "Filed";
}

‫ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬:‫اردادػوتقدغمػاضطاضبػ‬
‫ػبلػارغدػانػاصبحػصغاداػ ػ‬،‫ػاظاػالػارغدػدَطَصاَػ‬:‫طبدأػطاضبػبرطجهػ‬

‫ػدؤالػاالخغرػباضظصفيػ ػ‬:‫ػ‬rec‫اصتبػصظفػادطهػ‬

#include <iostream.h>
#include <conio.h>
class rec
{
float h;
float w;
public :
rec (int Hi=0,int Wed=0){h=Hi;w=Wed;}
float get_h(){return h;}
float get_w(){return w;}
float area_rec(){float return =h*w;}
};
void main ()
{
float hieght,width;
cout << "Enter The hieght of rectangle :";
cin >> hieght;
cout << "Enter The wideth of rectangle :";
cin >> width;
rec x(width,hieght);

cout << endl <<endl;


cout << "The hieght is : " << get_h();
cout << endl ;
cout << "The width is : " << get_w();
cout << endl;
cout << "The area is : " << area_rec ();

getch();
}

‫ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬:‫اردادػوتقدغمػاضطاضبػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اصتبػترصغبػضتضفزغونػ‪:‬ػاضدؤالػشبلػاالخغرػباضظصفيػ‪ :‬ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫اٌااٌٗ اٌمبٌج‪ ٟ٘ ٗ١‬حىً ا‪ ٚ‬عم‪٠‬مٗ اخم‪ٌ ٜ‬ىزبثٗ اٌااٌٗ ‪ ،‬ؽ‪١‬ش إٔب ٔم‪ َٛ‬ثزبع‪ ً١‬رؾا‪٠‬ا ٔ‪ٛ‬ؿ اٌج‪١‬بٔبد اٌّّمٖ اٌد‪ ٝ‬اٌااٌدٗ ا‪ ٚ‬اٌّمعقدٗ‬
‫ِٕ‪ٙ‬ب اٌ‪ ٝ‬ؽ‪ ٓ١‬اسزافبج‪ٙ‬ب ‪١ٌٚ‬س ‪ٚ‬لذ رٕف‪١‬ذ اٌجمٔبِظ ‪ ،‬أ‪ ٞ‬ثبِىبٕٔدب رّم‪٠‬دم أ‪ٔ ٞ‬د‪ٛ‬ؿ ِدٓ اٌمد‪ ُ١‬اٌد‪ ٝ‬اٌااٌدٗ ٌّقبٌغدٗ فٍّ‪١‬دٗ ا‪ ٚ‬حد‪ٟ‬ء‬
‫ِق‪٘ٚ ٓ١‬ذٖ ِ‪١‬زٖ ِٓ ِ‪١‬زاد ٌ خ اٌس‪ ٟ‬ثٍد ثٍد ا ٌ ‪١‬دم ِ‪ٛ‬عد‪ ٖ ٛ‬يد‪ ٟ‬ثقد ٌ دبد اٌجمِغدٗ ِضدً ثبسدىبي ‪ٌٚ ،‬ىدٓ ٌّدبذا ٔبعدً‬
‫رؾا‪٠‬ا ٔ‪ٛ‬ؿ اٌج‪١‬بٔبد فٍ‪ٚ ٝ‬لذ االسزافبء ؟ ‪ٕ٘ٚ‬ب اال ِم اٌّ‪ ُٙ‬يافٕب ثسظ االِد‪ٛ‬س اوضدم رم‪١‬دً أده اس د ثٕدبء اٌدٗ رمد‪ َٛ‬ثفؾد‬
‫اوجم سلُ ِٓ اصٕ‪ٔ ٓ١‬م‪ َٛ‬ثزّم‪ ُٙ٠‬اٌ‪ٙ١‬ب ثؾ‪١‬ش رى‪٘ ْٛ‬ذٖ اٌم‪ٛٔ ِٓ ُ١‬ؿ فا صؾ‪١‬ؼ ‪ٕ٘ٚ ،‬ب يبٔه سزم‪ َٛ‬ثجٕبء رم‪٠ٚ‬سدخ اٌااٌدٗ ث‪ٙ‬دبذا‬
‫اٌةىً ‪:‬‬

‫)‪int max (int a , int b‬‬


‫{‬
‫;‪………..‬‬
‫}‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس ٕ٘ب اْ ٔ‪ٛ‬ؿ اٌم‪ ّٗ١‬اٌّمعقٗ ‪ ٟ٘ٚ‬ثبٌٍ‪ ْٛ‬االؽّم ‪ ِٓ ٟ٘ ،‬إٌ‪ٛ‬ؿ اٌقدا ‪ ٞ‬اٌصدؾ‪١‬ؼ ‪ٚ‬ذٌده الْ اٌمد‪ ُ١‬اٌزد‪ٟ‬‬
‫ِمسٔب٘ب اٌ‪ ٝ‬اٌااٌٗ ٘‪ ِٓ ٟ‬إٌ‪ٛ‬ؿ اٌقا ‪ ٞ‬اٌصؾ‪١‬ؼ ا‪٠‬ضب ‪ ٟ٘ٚ‬ثبٌ‪ ْٛ‬اٌجمرمبٌ‪ٚ ٟ‬االزسق ‪ ،‬يدبْ ٘دذا اٌىد‪ ٛ‬ال ‪٠‬صدٍؼ اال ٌالفداا‬
‫اٌصؾ‪١‬ؾٗ ‪ ، ( int‬أ‪ ٞ‬اْ ٘ذٖ اٌااٌٗ ِؾا‪ ، ٖ ٚ‬يبذا لّٕب ثزّم‪٠‬م ل‪ ِٓ ّٗ١‬إٌ‪ٛ‬ؿ اٌقا اٌؾم‪١‬م‪ِ float ٟ‬ضال يبْ ٘ذا خغب ‪ ،‬الْ‬
‫ِقبِالد اٌااٌٗ اٌز‪ ٟ‬سّٕمس اٌم‪ ُ١‬اٌ‪ٙ١‬ب ِقميٗ ِٓ إٌ‪ٛ‬ؿ ‪ٚ int‬وذٌه اٌم‪ ّٗ١‬اٌّمعقٗ ‪ٌٚ ،‬ىٓ اس ٔب ا‪٠‬ضب ثٕفس ثمٔبِغٕدب اْ ٔمد‪َٛ‬‬
‫ثفؾ افاا وسم‪ ٗ٠‬أ‪ ٞ‬أ‪ٙ‬ب ِٓ ٔ‪ٛ‬ؿ اٌقا اٌؾم‪١‬م‪٠ٚ ، float ٟ‬غدب اٌدملُ االوجدم ث‪١‬دٕ‪ ، ُٙ‬يبٕٔدب سدٕم‪ َٛ‬رٍمبج‪١‬دب ثجٕدبء اٌدٗ اخدم‪ٜ‬‬
‫ٌذٌه ‪ ،‬اٌ‪١‬س وذٌه ؟ ‪٘ٚ‬ىذا س‪١‬ى‪ ْٛ‬حىٍ‪ٙ‬ب ‪:‬‬

‫)‪float max (float a , float b‬‬


‫{‬
‫;‪………..‬‬
‫}‬

‫الؽددؼ فز‪٠‬ددز‪ ٞ‬اٌددااس ٕ٘ددب إٔددب لّٕددب ثز ‪١‬ددم أدد‪ٛ‬اؿ اٌّقددبِالد ِددٓ إٌدد‪ٛ‬ؿ ‪ int‬اٌدد‪ ٝ‬إٌدد‪ٛ‬ؿ ‪ٚ float‬ذٌدده الْ اٌمدد‪ ُ١‬اٌزدد‪ ٟ‬سددٕم‪َٛ‬‬
‫ثزّم‪٠‬م٘ب ٘‪ ٟ‬افاا ؽم‪١‬م‪ٚ ٗ١‬ثّب اْ اٌااٌٗ رم‪ َٛ‬ثّمبسٔٗ فا ‪ ٓ٠‬يبو‪١‬ا اٌم‪ ّٗ١‬اٌّمعقٗ سػ رى‪ِ ْٛ‬دٓ ٔفدس ٔد‪ٛ‬ؿ اٌّقبٌّدبد الؽدؼ‬
‫ثاا‪ ٗ٠‬اٌااٌٗ ثبٌٍ‪ ْٛ‬االؽّم ي‪ ِٓ ٟٙ‬إٌ‪ٛ‬ؿ اٌقا ‪ ٞ‬اٌؾم‪١‬م‪ٚ ، float ، ٟ‬رم‪ ً١‬إٔب اس ٔب ا‪٠‬ضدب ِمبسٔدٗ اٌؾدم‪ِ ٚ‬دضال يبٕٔدب سدٕم‪َٛ‬‬
‫ثىزبثٗ اٌٗ اخم‪ٌٍ ٜ‬ؾم‪ ، ٚ‬يف‪ ٌ ٟ‬دخ اٌسد‪ ٟ‬ثٍد ثٍد عم‪٠‬مدٗ اوضدم فٍّ‪١‬دٗ ِدٓ ذٌده ‪٘ٚ‬د‪ ٟ‬اْ ٔمد‪ َٛ‬ثزقم‪٠‬دف اٌدٗ ِدٓ إٌد‪ٛ‬ؿ‬
‫اٌمبٌج‪ ٟ‬أ ‪ ٞ‬اْ ٔغقٍُ ِزمعُ اٌٍ خ ‪٠‬بعً رقم‪٠‬ف أ‪ٛ‬اؿ اٌّقدبِالد اٌد‪ٚ ٝ‬لدذ اسدزافبج‪ٙ‬ب ي‪١‬مد‪ َٛ‬ثزؾا‪٠‬دا ٘دذٖ االٔد‪ٛ‬اؿ ٌٍااٌدٗ ؽسدت‬
‫اٌم‪ ُ١‬اٌّّمٖ اٌ‪ٙ١‬ب ‪ٕ٘ٚ ،‬ب اخزصبس وج‪١‬م ي‪ ٟ‬اٌ‪ٛ‬لذ ‪ٚ‬وذٌه اٌىفبجٗ ي‪ٙ‬ذا ِضبي ثس‪١‬ظ ٌذٌه ‪.‬‬
‫‪ٌٚ‬ىٓ و‪١‬ف ‪٠‬ى‪ ْٛ‬حىً ‪ٚ‬عسُ ٘ذٖ اٌااٌدٗ ‪ ،‬يدبْ عسدُ اٌااٌدٗ ٘د‪ٔ ٛ‬فدس اٌغسدُ ٌٍااٌدٗ اٌّؾدا‪ٌٚ ٖ ٚ‬ىدٓ ِدب ‪٠‬مزٍدف ٕ٘دب فدٓ اٌدا‪ٚ‬اي‬
‫اٌقب ‪ ٛ٘ ٗ٠‬يمظ رم‪٠ٚ‬س‪ ٗ١‬اٌااٌٗ فٕب ٔم‪ ٜ‬و‪١‬ف ‪٠‬ى‪ ْٛ‬حىٍ‪ٙ‬ب ‪:‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫٘‪ ٟ‬وٍّخ ِؾغ‪ٛ‬زح يد‪ ٌ ٟ‬دخ اٌسد‪ ٟ‬ثٍد ثٍد ‪ templeat‬الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس اٌةىً اٌّغب‪ٚ‬س يف‪ ٟ‬اٌمغ‪ ٖٛ‬سلُ ‪ 1‬اٌىٍّخ‬
‫‪٘ٚ‬دد‪ ٟ‬ثّقٕدد‪ ٝ‬لددبٌج‪ ، ٟ‬يقٕدا ثٕددبء اٌددخ لبٌج‪١‬ددخ ‪٠‬غددت اْ ٔىزددت اٌىٍّددخ وّددب ٘دد‪ ٟ‬ثددبٌؾم‪ ٚ‬اٌصد ‪١‬مٖ ‪ ،‬صددُ ‪٠‬غددت ثقددا٘ب اْ ٔزجق‪ٙ‬ددب‬
‫اٌّؾغ‪ٛ‬زح ‪class‬ي‪ ٟ‬اٌمغ‪ٛ‬ح سلُ ‪ٚ ، 2‬ي‪ ٟ‬اخً ٘ذٖ االحبسار‪٠ ٓ١‬غت اْ ٔىزت اٌىٍّخ > <ثبالحبسر‪ ٓ١‬االص م ‪ٚ‬االوجم وّب‬
‫‪ ٟ٘ٚ‬ثبالؽم اٌص ‪١‬مح صُ يماك ‪ٔٚ‬مزبس أ‪ ٞ‬اسُ ا‪ ٚ‬ؽم ٌّز ‪١‬م ‪٘ٚ‬دذا اٌّز ‪١‬د م ٘د‪ ٛ‬ثّضبثدخ لبٌدت فدبَ ٌ‪١‬ؾزد‪ ٞٛ‬فٍد‪ ٝ‬االٔد‪ٛ‬اؿ‬
‫اٌز‪ ٟ‬رم‪ َٛ‬ثزّم‪٠‬م٘ب اٌ‪٘ ٝ‬ذٖ اٌااٌٗ ‪.‬‬
‫يبٌمغ‪ٛ‬اد ‪ ٟ٘ 4 ٚ 3ٚ 2 ٚ 1‬خغ‪ٛ‬اد اسبس‪١‬خ ي‪ ٟ‬ثٕبء ّٔ‪ٛ‬ذط اٌااٌٗ اٌمبٌج‪١‬خ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫>‪1. #include <iostream.h‬‬


‫>‪2. #include <conio.h‬‬ ‫ٍثبه ‪ :‬قٌ ثجْب داىٔ ىزقً٘ ثحغبة اىةشقٌ االمجةش‬
‫ٍةةِ سقَةة‪ٝ ِٞ‬ةةزٌ رَش‪ٝ‬شَٕةةب ثبالرةةبسٓ َٕٗةةب ٍةةِ‬
‫‪3. int &max ( int &a , int &b ) //---------- B‬‬
‫اىْةة٘ؿ اىقةةذد‪ ٛ‬اىصةةح‪ٞ‬ح ‪ ، int‬فبىق‪َٞ‬ةةٔ االٗىةة‪ٚ‬‬
‫{ ‪4.‬‬ ‫ٕ‪ٗ 5 ٜ‬اعٌ اىَزغ‪ٞ‬ش ‪ ، a‬اٍب اىق‪َٞ‬خ اىثبّ‪ٞ‬خ فٖ‪ٜ‬‬
‫‪5.‬‬ ‫;‪cout << endl << &a‬‬ ‫‪ٗ52‬اعٌ اىَزغ‪ٞ‬ش ‪ ،b‬أ‪ ٛ‬اُ اىق‪ ٌٞ‬ثبثزٔ ‪ ،‬ثٌ فة‪ٜ‬‬
‫‪6.‬‬ ‫)‪if (a>b‬‬ ‫اثْب اعزذفب ٕزٓ اىذاىٔ ٗرَش‪ٝ‬ش اىق‪ ٌٞ‬في‪ٖٞ‬ب ‪a‬‬
‫‪7.‬‬ ‫;‪return a‬‬ ‫ٗ ‪ b‬ضةةـ اىق‪َٞ‬ةةٔ ‪ 3‬فةة‪ ٜ‬اىق‪َٞ‬ةةٔ اىَشجقةةٔ ‪ .‬ثةةٌ‬
‫‪8.‬‬ ‫‪else‬‬ ‫اعجـ اىْبرج ‪.‬‬
‫‪9.‬‬ ‫;‪return b‬‬
‫} ‪10.‬‬ ‫ي‪ ٟ‬اٌّمغـ ‪ A‬لّٕب ثجٕبء عسُ اٌااٌٗ اٌمج‪١‬سد‪ ٗ١‬صدُ‬
‫‪//------------------------- //-------------- A‬‬ ‫فميٕدددب اٌّز ‪١‬دددماد ‪ٚٚ b ٚ a‬ضدددقٕب ي‪ٙ١‬دددب اٌمددد‪ُ١‬‬
‫) ( ‪11. void main‬‬ ‫االيزماضدد‪ ٗ١‬اٌّغٍ‪ٛ‬ثددٗ يدد‪ ٟ‬اٌسددؤاي ‪ ،‬اِددب ثبٌٕسددجخ‬
‫{ ‪12.‬‬ ‫ٌٍمغدد‪ ٖٛ‬سلددُ ‪ 14‬سددبٔز‪ٌٙ ٟ‬ددب الؽمددب صددُ لّٕددب يدد‪ٟ‬‬
‫;‪13. int a=5,b=50,y‬‬ ‫خغ‪ 15 ٖٛ‬ثبسزافبء اٌٗ اٌّبوس ‪ِٚ‬مسٔب فٍ‪ٙ١‬دب‬
‫;‪14. cout << &a‬‬ ‫اٌم‪ّ١‬ز‪ ٓ١‬صُ ‪ٚ‬ضقٕب ثقا االلد‪ٛ‬ا اٌ‪ٙ‬الٌ‪١‬دٗ ارةبسٓ‬
‫اىَغةةةةةبٗآ ٗاىق‪َٞ‬ةةةةةٔ ‪ٌٛ 3‬ضدددددق‪ٙ‬ب يدددد‪ ٟ‬اٌم‪ّ١‬دددددٗ‬
‫;‪15. y=max (a,b)=3‬‬
‫اٌّمعقٗ ‪ِٚ ،‬ب ا‪ ٚ‬اْ اٌفذ أزجب٘ه اٌ‪ٕ٘ ٗ١‬ب ثبْ‬
‫;‪16. cout << y << endl << b‬‬
‫٘ذٖ اٌمغ‪ ٖٛ‬رقٕد‪ ٟ‬ثدبْ ٔضدـ اٌم‪ّ١‬دٗ ‪ 3‬يد‪ ٟ‬اوجدم‬
‫;) (‪17. getch‬‬ ‫سلدُ رق‪١‬داٖ اٌااٌدٗ ‪ٕ٘ٚ‬دب يد‪ِ ٟ‬ضبٌٕدب ٘د‪ ٛ‬اٌّز ‪١‬دم ‪b‬‬
‫} ‪18.‬‬ ‫الْ ل‪ّ١‬زٗ اوجدم ِدٓ اٌّز ‪١‬دم ‪ ، 50>5 a‬أ‪ٞ‬‬
‫اْ ل‪ b ّٗ١‬س‪ ٛ‬رصجؼ ثقا اْ رٕز‪ ٟٙ‬اٌااٌدٗ ِدٓ‬
‫فٍّ‪ٙ‬ددب ثبٌم‪ّ١‬ددٗ ‪ٕ٘ٚ 3‬ددب ٔؾددٓ ِزفم د بْ فٍدد‪ ٝ‬ذٌدده الْ اٌزّم‪٠‬ددم ثبالحددبسٖ ‪ٚ‬وددذٌه االسعددبؿ ثبالحددبسٖ ‪ٌٚ ،‬دد‪ ٛ‬وددبْ اٌزّم‪٠‬ددم ثبٌم‪ّ١‬ددٗ‬
‫‪ٚ‬االسعبؿ ثبالحبسٖ ي‪ٙ‬ذا خغب ‪ٚ‬اٌمغدب ِٕغم‪١‬دب الْ اٌم‪ّ١‬دٗ اٌّّدمسٖ اٌد‪ ٝ‬اٌااٌدٗ ٘د‪ ٟ‬ثدبٌزّم‪٠‬م ثبٌم‪ّ١‬دٗ أ‪ ٞ‬اْ اسدّبء اٌّز ‪١‬دم اٌزد‪ٟ‬‬
‫رى‪ ْٛ‬ثبٌااٌٗ ٘‪ ٟ‬خبصٗ ث‪ٙ‬ب ‪١ٌٚ‬س ٌ‪ٙ‬ب فاللٗ ثّز ‪١‬دماد اٌااٌدٗ اٌم ج‪١‬سد‪ ٗ١‬اِدب رّم‪٠‬دم االحدبسٖ يبٔزجدٗ ٕ٘دب ثدبْ اٌّز ‪١‬دماد يد‪ ٟ‬ودال‬
‫اٌااٌز‪ّ٘ ٓ١‬ب ٌٕفس اٌقٕ‪ٛ‬اْ أ‪ ٞ‬اْ فٕ‪ٛ‬أ‪ٔ ٟ٘ ُٙ‬فس‪ٙ‬ب ‪ٚ‬الوٓ االسّبء ِمزٍفٗ ‪ ،‬وّضً حم ٌٗ اسدُ ‪ٚ‬ودذٌه وٕ‪١‬دٗ يىالّ٘دب ٌدٕفس‬
‫اٌةم ‪ ُِّّّّّّّ ،‬اسان ؽبجما ي‪ ٟ‬االِدم ٌدذٌه ‪ٚ‬ضدقذ ٌده اٌمغد‪ ٖٛ‬سلدُ ‪ٚ 14‬اٌمغد‪ ٖٛ‬سلدُ ‪ 5‬أؾدم اٌ‪ّٙ١‬دب ع‪١‬داا يد‪ ٟ‬وٍزدب‬
‫اٌغٍّز‪ٔ ٓ١‬م‪ َٛ‬ثغجبفٗ فٕ‪ٛ‬اْ اٌّز ‪١‬م عمة ٔفذ ٘ذا اٌجمٔبِظ ‪ٚ‬سزاسن ِب ال‪ٛ‬ي ‪.‬‬

‫اِب ي‪ ٟ‬اٌمغ‪ ٖٛ‬سلُ ‪ 16‬لّٕب ثغجبفٗ ل‪ ّٗ١‬اٌّز ‪١‬م ‪ b‬ثقا اسزافبء اٌااٌٗ ‪ٚ‬وذٌه اٌّز ‪١‬دم ‪٘ٚ y‬د‪٠ ٛ‬سدب‪ ٞٚ‬ايزماضد‪١‬ب اٌم‪ّ١‬دٗ ‪ِ 3‬دٓ‬
‫ٔفس س‪١‬بق اٌغٍّٗ ‪.‬‬

‫‪ِٚ‬ب اس‪٠‬اٖ ِٕه االْ اْ رم‪ َٛ‬ثغجبفٗ ٔبرظ اٌااٌٗ ٌٕم‪ِ ٜ‬ب ٘‪ ٟ‬اٌم‪ ّٗ١‬اٌز‪ ٟ‬س‪١‬زُ عجبفز‪ٙ‬ب فٍ‪ ٝ‬اٌةبحٗ ‪ ،‬يزقٍّٕب سدبثمب فٕداِب ٔم‪٠‬دا‬
‫اْ ٔغجـ اٌم‪ ِٓ ّٗ١‬اٌااٌٗ اْ ٔضق‪ٙ‬ب ِجبحمٖ ي‪ ٟ‬عٍّٗ اٌغجبفٗ ٘ىذا‬
‫;‪cout << max ( a,b)=3‬‬
‫‪٘ٚ‬ذٖ اٌغم‪٠‬مٗ خبعئٗ اذا ال ‪ّ٠‬ىٓ عجبفٗ ٔبرظ ‪ٚ‬ثٕفس اٌ‪ٛ‬لذ ر ‪١‬م ل‪ ّٗ١‬اٌم‪ ّٗ١‬اٌقبجاٖ ِدٓ اٌااٌدٗ ‪ ،‬عدمة ثٕفسده ‪ ،‬اذا فٕدب ٔبخدذ‬
‫عم‪٠‬مخ اخم‪ٚ ٜ‬اٌزىٓ‬

‫*****************************************************************‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫;‪max( a, b )=3‬‬
‫; ) ‪cout << max ( a , b‬‬

‫الؽؼ فز‪٠‬ز‪ ٞ‬اٌااس ثبْ اٌغٍّٗ اال‪ ٟ٘ ٌٝٚ‬اسزافبء ٌٍااٌٗ صُ ٔضـ ‪ 3‬ي‪ ٟ‬اٌّز ‪١‬م صبؽت اوجدم ل‪ّ١‬دٗ ‪٘ٚ‬د‪ ٛ‬اٌقبجدا ِدٓ اٌااٌدٗ‬
‫اِب اٌمغ‪ ٖٛ‬اٌضبٔ‪ ٗ١‬يٕم‪ َٛ‬ثغجبفٗ إٌبرظ ‪ِٚ‬ب ا‪ ٚ‬اْ اٌفذ أزجب٘ه اٌ‪ٕ٘ ٗ١‬ب اْ ي‪٘ ٟ‬ذٖ اٌااٌٗ س‪٠ ٛ‬زُ اسزافبء اٌااٌدٗ ِدمٖ اخدم‪ٜ‬‬
‫ٌالٕٔددب ِزفمدد‪ ٓ١‬سددبثمب ثددبْ اٌااٌددٗ رّدد‪ٛ‬د ثقددا أز‪ٙ‬ددب فٍّ‪ٙ‬ددب ‪ٔٚ‬فمددا عّ‪١‬ددـ ل‪ّٙ١‬ددب اذا ٌددُ ٔمددُ ثزمز‪ٕٙ٠‬ددب ثّز ‪١‬ددم اخددم ‪ٕ٘ٚ ،‬ددب ‪ٚ‬يدد‪٘ ٟ‬ددذا‬
‫االسزافبء رى‪ ْٛ‬ل‪ b=3ٚ a=5 ّٗ١‬أ‪ ٞ‬اْ اٌّز ‪١‬م ‪ b‬ر ‪١‬مد ل‪ّ١‬زٗ الٔٗ ٘‪ ٛ‬االوجم ‪ٚ‬ي‪ ٟ‬االسدزافبء اٌضدبٔ‪ٌٍ ٟ‬ااٌدٗ ‪٘ٚ‬د‪ِ ٛ‬دب ثدااخً‬
‫عٍّخ اٌغجبفٗ ‪٠‬زُ رّم‪٠‬م اٌم‪ِ ُ١‬مٖ اخم‪ٌٍ ٜ‬ااٌٗ صُ رفؾ ‪ٚ‬رق‪١‬ا ٌٕب اوجم ل‪ ّٗ١‬صُ رغجق‪ٙ‬ب أ‪ ٞ‬أب إٌدبرظ ثقدا اٌزقدا‪ٕ٘ ً٠‬دب سد‪١‬ى‪ْٛ‬‬
‫٘‪ ٟ٘ٚ 5 ٛ‬ل‪ ّٗ١‬اٌّز ‪١‬م ‪. a‬‬
‫‪ٌٚ‬ى‪ ٟ‬رصجؼ اوضم ‪٠‬م‪ِ ، ٓ١‬ب اس‪٠‬اٖ ِٕه ٘‪ ٛ‬اْ رضـ ٔمدبط اٌز‪ٛ‬لدف اٌجم‪٠‬ده ث‪ٕ٠ٛ‬دذ يد‪ ٟ‬االِدبوٓ إٌّبسدجٗ صدُ رضدـ ِةدب٘اٖ‬
‫‪ٌ add whach‬ىً ِٓ اٌّز ‪١‬م ‪ٚ b ٚ a‬سزم‪ِ ٜ‬ب اٌذ‪ ٞ‬س‪١‬ؾصً ‪.‬‬

‫طضخصػ‪ :‬ػ‬
‫‪-‬ػػاضتطرغرػباالذارهػغعظيػانػرظاوغنػاضطتغغرػاضططرهػعيػظفسػرظاوغنػطتغغراتػاضطعاطالتػسىيػاضداضىهػاضطدىتقبضهػ‬
‫ضضقغمػوضصنػبادمػاخرػاوػبضقبػاخرػانػصحػاضتعبغرػ‪ .‬ػ‬
‫‪-‬ػاضقغطهػاضطرجعهػباالذارهػتخزنػحدبػاضذرطػوعظاػسيػطثاضظاػدتخزنػبطتغغرػاصبرػشغطهػ‪ .‬ػ‬
‫‪-‬ػ اظتبهػرظدػادتدراءػاضداضهػاضتيػتعغدػشغطهػباالذارهػسكيػتقومػبتغغرػشغطهػاضطتغغرػاالصضيػسفيػطثاضظاػاضىرشمػ‬
‫االصبرػعوػاضطتغغرػ‪b‬ػوالصنػبعدػاضتعدغلػاضذيػشطظاػبهػسيػاضذرحػرظدػاضظجمػ‪،‬ػدىوفػغصىبحػاضطتغغىرػ ‪a‬ػعىوػاالصبىرػ‬
‫وعذاػطاػذرحظاهػدابقاػ‪ .‬ػ‬
‫‪-‬ػاذاػاردظاػاالرجاعػباالذارهػسغجبػانػغصونػاضتطرغرػباالذارهػ‪،‬ػوضوػصانػباضقغطهػساضطتغغراتػطختضفهػ‪ .‬ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫>‪#include <iostream.h‬‬ ‫ي‪ ٟ‬اٌّضبي اٌزبٌ‪ ٟ‬لّٕب ث‪ٛ‬ضـ وٍّخ ‪ٚ const‬ذٌه ٌّٕـ‬
‫>‪#include <conio.h‬‬ ‫اٌااٌددددٗ ِددددٓ ر ‪١‬ددددم ل‪ّ١‬دددددخ اٌّز ‪١‬ددددم ‪ b‬سدددد‪ٛ‬اء ودددددبْ‬
‫‪//-----------------------------‬‬ ‫ِّمثبالحبسح ا‪ ٚ‬ؽز‪ ٝ‬ثبٌم‪ٚ ، ّٗ١‬ي‪ ٟ‬عسدُ اٌااٌدٗ لّٕدب‬
‫)‪void afunc (int &a ,const int & b‬‬ ‫ثزقغ‪ ً١‬ر ‪١‬دم ل‪ّ١‬دٗ ‪ِ b‬دٓ اعدً اٌز‪ٛ‬ضد‪١‬ؼ ‪ٌٚ‬د‪ ٛ‬لّٕدب‬
‫ثزفقٍ‪ٙ١‬ددب ي‪ٙ‬ددذا خغددب ؽ‪١‬ددش اْ اٌّزددمعُ ‪٠‬ددمي ذٌدده‬
‫{‬ ‫‪ٕ٘ٚ‬ددب سدد‪١‬مغم ثجبٌدده يىددمٖ ٌدد‪ٚ ٛ‬ضددقٕب ٘ددذٖ اٌغٍّددٗ‬
‫‪// b=2; //-----------------------‬‬ ‫‪ const‬لجً ‪ِ void‬ب اٌذ‪ ٞ‬س‪١‬ؾصً ‪ٕ٘ ،‬ب ال ‪٠‬ؾصً‬
‫;‪a=10‬‬ ‫حدد‪ٟ‬ء ‪ٌٚ‬دد‪ ٛ‬ؽزدد‪ ٝ‬ثقدددا اي ‪ٚ void‬لجددً اسددُ اٌااٌدددٗ ‪،‬‬
‫}‬ ‫يبٌجمٔددبِظ ‪٠‬قّددً ‪ٚ‬ال ‪٠‬مدد‪ َٛ‬ثزضج‪١‬ددذ أ‪ ٞ‬حدد‪١‬ئ ‪ ،‬أ‪ ٞ‬أددٗ‬
‫‪ٕ٠‬فددذ اٌىدد‪ٕ٘ ٛ‬ددب ‪ٚ ،‬ا‪ ٚ‬اْ اٌفددذ أزجب٘دده ٕ٘ددب أددٗ ال‬
‫‪٠‬غ‪ٛ‬ز اْ ٔضـ اٌىٍّخ اٌّؾغ‪ٛ‬زٖ ٌٍزضج‪١‬ذ ‪ const‬يد‪ٟ‬‬
‫‪//------------------------------‬‬ ‫اخددم رم‪٠ٚ‬سددٗ اٌااٌددٗ ‪ٚ‬ال ؽزدد‪ ٝ‬ثقددا اسددّ‪ٙ‬ب ِجبحددمٖ ‪،‬‬
‫) ( ‪void main‬‬ ‫‪٘ٚ‬ذٖ ِالؽؾبد ِ‪ ّٗٙ‬ي‪ٕٙ‬ب ‪٠‬ىد‪ ْٛ‬خغدب ‪ٚ‬ال ‪٠‬دزُ رٕف‪١‬دذ‬
‫{‬ ‫اٌجمٔبِظ ‪ ،‬اِب ٌد‪ٚ ٛ‬ضدقٕب٘ب اخدً االلد‪ٛ‬ا اٌ‪ٙ‬الٌ‪١‬دخ‬
‫;‪int a=5,b=6‬‬ ‫ا‪ ٞ‬لجددً ٔدد‪ٛ‬ؿ اٌّز ‪١‬ددم ي‪ٙ‬ددذا عددبجز ‪ٕ٘ٚ‬ددب رددزُ فٍّ‪١‬ددٗ‬
‫; ‪cout << "befor ( a ) : " << a << endl‬‬ ‫اٌزضج‪١‬ذ ‪ٚ‬وذٌه ٌ‪ ٛ‬ثقا إٌ‪ٛ‬ؿ ‪ٚ‬لجً االسدُ اِدب ٌد‪ ٛ‬لّٕدب‬
‫ث‪ٛ‬ضـ اٌىٍّٗ اٌّغ‪ٛ‬زٖ ٌٍزضج‪١‬ذ ثقا اٌّز ‪١‬م ي‪ٙ‬ذا خغب‬
‫; ‪cout << "befor ( b ) : " << b << endl‬‬ ‫‪ٕ٘ٚ‬ب ال ‪٠‬م‪ َٛ‬اٌجمٔبِظ ثبٌزٕف‪١‬ذ ‪٘ٚ‬ب ٘‪ ٛ‬اٌى‪. ٛ‬‬
‫; ‪cout << endl << endl‬‬
‫;)‪afunc (a,b‬‬
‫; ‪cout << "after ( a ) : " << a << endl‬‬

‫;) ( ‪getch‬‬
‫}‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫>‪#include <iostream.h‬‬ ‫٘ب اٌّضبي اٌد‪ ٟ‬ثدبفٍ‪ ٝ‬اٌصدفؾٗ عجقدب اٌصدٕف ايزماضد‪ٟ‬‬
‫>‪#include <conio.h‬‬ ‫ثى‪ِ ْٛ‬ز ‪١‬مارٗ خبصٗ اال اذا فّّٕدب يّدب اٌ‪ٙ‬دب ٌدز‪ َٚ‬وٍّدخ‬
‫‪//--------------------------------------‬‬ ‫(‬ ‫‪ private‬يدد‪٘ ٟ‬ددذا اٌّضددبي ‪ ،‬اِددب ثبٌٕسددجٗ ٌٍااٌددٗ)‬
‫‪class ConstFuncClass‬‬ ‫‪ normalFunc‬ي‪ٙ‬ذٖ اٌااٌٗ رم‪ َٛ‬ثبسٕب ل‪ ّٗ١‬اٌ‪ ٝ‬اٌّز ‪١‬دم‬
‫{‬ ‫‪ٕ٘ٚ age‬ب ٘ذا اٌااٌدٗ اٌدٗ ِٕزّ‪١‬دٗ ‪١ٌٚ‬سدذ ثٕدبء اِدب اٌااٌدٗ‬
‫ِب اٌ‪ٙ‬ب ٌز‪//private : //------------------ َٚ‬‬
‫; ‪int age‬‬
‫اٌضبٔ‪١‬ددٗ يزمدد‪ َٛ‬ثبسددٕب اٌم‪ّ١‬ددٗ اٌدد‪ ٝ‬اٌّز ‪١‬ددم ‪ٕ٘ٚ‬ددب االسلددبَ‬
‫‪public :‬‬ ‫ِزةبثٗ ٌٍز‪ٛ‬ض‪١‬ؼ أ‪ ٞ‬أدٗ ؽزد‪ٌ ٝ‬د‪ ٛ‬ودبْ اٌزقدا‪ِ ً٠‬دٓ ٔفدس‬
‫} ;‪void normalFunc ( ){age =55‬‬ ‫اٌددملُ يددال ‪ّ٠‬ىددٓ ٕ٘ددب ر ‪١١‬ددمٖ الْ اٌااٌددٗ ِقميددٗ فٍدد‪ ٝ‬أ‪ٙ‬ددب‬
‫‪void conFunc ( ) const {age = 55 ;} //--------------- error‬‬ ‫‪ِٚ const‬دددٓ اٌّالؽدددؼ ٕ٘دددب اأدددب لّٕدددب ثىزبثدددٗ اٌىٍّددٗ‬
‫;}‬ ‫اٌّؾغ‪ٛ‬زٖ ٌٍزضج‪١‬ذ ثقا االل‪ٛ‬ا اٌ‪ٙ‬الٌ‪ٌٍ ٗ١‬ااٌٗ ‪٘ٚ‬ذا عبجز‬
‫‪//--------------------------------------‬‬ ‫يمظ ي‪ ٟ‬اٌا‪ٚ‬اي إٌّزّ‪٘ٚ ٗ١‬ذٖ ِالؽؾٗ ِ‪. ّٗٙ‬‬
‫) ( ‪void main‬‬
‫{‬
‫;‪ConstFuncClass opj1‬‬

‫;)( ‪getch‬‬
‫}‬

‫>‪1. #include <iostream.h‬‬ ‫دؤالػتصحغحػاضداضهػسيػاضظصفيػ‪:‬ػداضهػاضطاصسػ‪ :‬ػ‬


‫>‪2. #include <conio.h‬‬
‫;)‪3. int maximum (int ,int ,int‬‬ ‫باضظدبهػالدتخدامػصضطهػ‪else‬ػوعيػحدىبػاضطظطىقػاضخىاصػ‬
‫‪//----------------------------------‬‬ ‫باضدؤالػظفدهػسفيػعذاػاضدىؤالػضطىاذاػادىتخداطكاػخطىاػ‪،‬ػ‬
‫( ‪4. void main‬‬ ‫)‬
‫اولػرظىىدطاػظعىىدػصضطىىةػ‪else‬ػضضذىىرطػاضثىىاظيػرظىىدػاضدىىكمػ‬
‫{ ‪5.‬‬
‫;)‪6. cout << maximum(6,2,5‬‬ ‫سكىىذاػغصىىبحػذىىرطػطتىىداخلػأيػاظىىهػسىىيػحىىالػصىىانػجىىوابػ‬
‫;)(‪7. getch‬‬ ‫اضذرطػاالولػساظهػدغدخلػرضغهػواذاػصانػاضجوابػظعمػأيػ‬
‫} ‪8.‬‬
‫‪//-----------------------------------‬‬ ‫انػاضذرطػاالولػاظطبىقػساظىهػالػغىدخلػاضىىػاضذىرطػاضثىاظيػ‬
‫)‪9. int maximum (int x,int y,int z‬‬ ‫الظهػالػغدخلػرضغهػاالػاذاػصانػاضجوابػالػوظحنػطتفقىانػاضىىػ‬
‫{ ‪10.‬‬
‫عظاػاضغسػصذضكػ؟ ػ‬
‫;‪11. int max=x‬‬
‫)‪12. if (y>max‬‬ ‫درظاػظفترضػاظظاػوععظاػصضطةػ‪else‬ػشبلػاضذىرطػاضثىاظيػ‬
‫;‪13. max=y‬‬ ‫سيػاضداضهػ‪،‬ػسدظقومػاولػشغطهػدتقومػاضداضهػبطقارظتكاػ‬
‫)‪14. if (z>max‬‬
‫;‪15. max=z‬‬ ‫عىىيػ‪6‬ػوعىىيػاضتىىيػططرظاعىىاػطىىنػاضداضىىهػاضرئغدىىغهػسجعضظىىاػ‬
‫;‪16. return max‬‬ ‫اضقغطهػاالوضىػعىيػاالصبىرػالحىظػخطىوهػرشىمػ‪11‬ػوسىيػاضذىرطػػ‬
‫} ‪17.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫االولػوعوػسيػاضخطوهػ‪12‬ػظقارنػعذهػاضقغطهػطدػاضقغطهػاضثاظغهػاضتيػشطظىاػبتطرغرعىاػاغىنػاظظىاػظقىارنػشغطىهػ‪x‬ػوعىيػ‬
‫اضتيػتمػتخزغظكاػسيػ‪max‬ػػأيػاظظاػارتبرظاعاػاالصبرػطدػاضقغطهػاضثاظغهػوعيػ‪y‬ػػوعظاػسيػطثاضظاػضمػغظطبىقػاضذىرطػ‬
‫سظدخلػرضىػاضذرطػاضثاظيػ‪،‬ػطغبػدرظاػظغغرػاضقغطهػاالوضىػطنػ‪6‬ػاضىػاضرشمػ‪1‬ػثمػظعغىدػاضتتبىدػسىيػاضداضىهػظجعىلػػاولػ‬
‫شغطهػعىيػاضصبىريػوظخزظكىاػسىيػ‪max‬ػػ ثىمػظقىارنػعىذهػاضقغطىهػطىدػاضقغطىهػاضثاظغىهػ‪y‬ػوعظىاػشغطىةػاضطتغغىرػ‪y‬ػاصبىرػ‬
‫سدتقومػاضداضهػبارجىاعػاضقغطىهػ‪2‬ػ عىيػاالصبىرػالظكىاػالػتىدخلػضضذىرطػاضثىاظيػالظىهػطعرسىهػرضىىػاظىهػطتىداخلػوعىذاػطىاػ‬
‫ذرحظاهػدابقاػ‪،‬ػستصبحػعذهػاضخوارزطغهػخاطئهػواضصوابػاظه ػالػغجوزػوعدػاضصضطهػ ‪else‬ػسيػطثاضظىاػعىذاػشبىلػاضذىرطػ‬
‫اضثاظيػسفيػصلػاضحاالتػرظدػردمػوععكاػدظدخلػرضىػاضذرطػاضثاظيػوظقارنػجطغدػاضقغمػوضغسػسقطػشغطتغنػ‪ .‬ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫ِالؽؾٗ ٘ذٖ اٌااٌٗ رمزٍف فٓ اٌّ‪ٛ‬ع‪ ٖ ٛ‬ي‪ ٟ‬اٌىزبة ‪ٌٚ‬ىٕ‪ٙ‬ب رم‪ َٛ‬ثٕفس اٌقًّ ‪ِ ٟ٘ٚ‬مزصمٖ ‪.‬‬
‫طثالػ‪:‬ػررفػطصفوسهػطنػظوعػرددػحقغقيػ‪،‬ػطوضكاػ‪5‬ػرظاصرػثمػخزنػسغكاػاضعظاصرػاضتاضغةػ‪:‬ػ(ػ ‪( 2 , 4 , 1 , 9 , 0‬ػثمػ‬
‫رتبكاػطنػاالصبرػاضىػاالصغرػواطبعكاػشبلػاضترتغبػوبعدهػ؟‬
‫>‪1. #include <iostream.h‬‬
‫اٌٗ اٌزمر‪١‬ت ٘‪ ٟ‬ي‪ ٟ‬اٌّمغـ اٌجمِغ‪b ٟ‬‬
‫>‪2. #include <conio.h‬‬
‫‪//----------------------------- B‬‬
‫) ] [ ‪3. void sort ( int x‬‬
‫{ ‪4.‬‬
‫‪5.‬‬ ‫; ‪int t‬‬
‫‪6.‬‬ ‫) ‪for ( int i=0 ; i <5 ; i++‬‬
‫‪7.‬‬ ‫) ‪for ( int j =i+1 ; j <5 ; j++‬‬
‫‪8.‬‬ ‫) ]‪if ( x[i] > x[j‬‬
‫‪9.‬‬ ‫{‬
‫‪10.‬‬ ‫; ] ‪t= x[ i‬‬
‫‪11.‬‬ ‫;]‪x[i]=x[j‬‬
‫‪12.‬‬ ‫;‪x[j]=t‬‬
‫‪13.‬‬ ‫}‬
‫} ‪14.‬‬
‫‪//----------------------------- A‬‬
‫) ( ‪15. void main‬‬
‫{ ‪16.‬‬
‫‪17.‬‬ ‫; }‪int x[5]={2,4,1,9,0‬‬
‫‪18.‬‬ ‫; " ‪cout << "Before :‬‬

‫‪19.‬‬ ‫)‪for (int i=0;i<5;i++‬‬


‫‪20.‬‬ ‫; " " << ]‪cout << x[i‬‬
‫‪21.‬‬ ‫; )‪sort (x‬‬

‫‪22.‬‬ ‫; " ‪cout << endl << "After :‬‬


‫‪23.‬‬ ‫)‪for (int i=0;i<5;i++‬‬
‫‪24.‬‬ ‫; " " << ]‪cout << x[i‬‬
‫‪25.‬‬ ‫;) (‪getch‬‬
‫}‪26.‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫طثالػ‪:‬ػررفػصظفػادطهػ‪student‬ػ بحغىثػغحتىويػرضىىػاضطتغغىراتػاضطظتطغىهػاضتاضغىةػ‪:‬ػ(ػاالدىمػواضطعىدلػ)ػ‪،‬ػثىمػرىرفػ‬
‫صائظانػطنػعذاػاضصظفػوطررعمػرضىػداضهػاضترتغبػضترتغبكمػحدىبػاضطعىدلػطىنػاالرضىىػاضىىػاالصىغرػػثىمػاطبىدػاضظىاتجػ‬
‫شبلػوبعدػاضترتغبػ؟ ػ‬
‫ػ‬
‫ػ‬
‫ػ‬

‫___‬
‫‪/‬‬ ‫\‬
‫‪o‬‬ ‫‪o‬‬
‫******====================******‬
‫\\‪//----------------------------------------------------------------------------------------------------------‬‬
‫\\‪//------------------------------------------------------------------------------------------------------------‬‬
‫\\‪//--------------------------------------------------------------------------------------------------------------‬‬
‫\\‪//----------------------------------------------------------------------------------------------------------------‬‬
‫\\‪//--------------------------------------------------------------------------------------------------------------‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫طبدأػطاضبػبرطجهػ‪:‬ػاظاػالػارغدػدَطَصاَػ‪،‬ػبلػارغدػانػاصبحػصغاداػ ػ‬

‫‪.1‬ػتطرغرػاضعواطلػباضقغطةػ‪ :‬ػ‬
‫طثالػاحدبػطجطوعػرالطتغنػسيػداضهػواطبدػاضظاتجػسيػاضداضهػاضرئغدغةػ ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫ػ‬
‫___‬
‫\‪/‬‬
‫)‪(oo‬‬
‫******====================******‬
‫\\‪//--------------------------------------------------------------------------------------------------------------------‬‬
‫\\‪//----------------------------------------------------------------------------------------------------------------------‬‬
‫\\‪//------------------------------------------------------------------------------------------------------------------------‬‬
‫\\‪//--------------------------------------------------------------------------------------------------------------------------‬‬
‫\\‪//----------------------------------------------------------------------------------------------------------------------------‬‬

‫اردادػوتقدغمػاضطاضبػ‪:‬ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ‬
‫ﺍﻟﻮﺣﺪﺓ ﺍﻷﻭﱃ‬ ‫‪1.0‬‬
‫‪C++‬‬ ‫ﻣﻘﺪﻣﺔ ﺇﱃ ﺍﻟﱪﳎﺔ ﺑﻠﻐﺔ‬

‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪:‬‬


‫ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﻛﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ‪ C++‬ﺑﺴﻴﻄﺔ‪.‬‬ ‫♦‬
‫ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﺨﺪﺍﻡ ﻋﺒﺎﺭﺍﺕ ﺍﻹﺩﺧﺎﻝ ﻭﺍﻹﺧﺮﺍﺝ‪.‬‬ ‫♦‬
‫ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻷﺳﺎﺳﻴﺔ ﰲ ‪.C++‬‬ ‫♦‬
‫ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺇﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﻮﺍﻣﻞ ﺍﳊﺴﺎﺑﻴﺔ ﰲ ‪.C++‬‬ ‫♦‬
‫ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺍﻟﻌﻮﺍﻣﻞ ﺍﻟﻌﻼﺋﻘﻴﺔ ﰲ ‪.C++‬‬ ‫♦‬

‫‪1‬‬
‫ﺍﳌﻘﺪﻣﺔ‬ ‫‪1.1‬‬

‫ﺗﻌﺘﱪ ﻟﻐﺔ ‪ C++‬ﻣﻦ ﺃﺷﻬﺮ ﺍﻟﻠﻐﺎﺕ ﺍﻟﱵ ﺗﺘﻤﺘﻊ ﺑﻄﺎﺑﻊ ﺍﻟﻘﻮﺓ ﻭﺍﳌﺮﻭﻧﺔ ﻹﻧﺘـﺎﺝ ﺃﺳـﺮﻉ‬
‫ﺑﺮﺍﻣﺞ ﻭﺃﻓﻀﻠﻬﺎ ﺃﺩﺍﺀﹰﺍ‪ .‬ﻭﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﻭﺟﻮﺩ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﺍﻷﺧﺮﻯ ﺇﻻ ﺃ‪‬ﺎ ﺗﻔﺘﻘـﺮ‬
‫ﴰﻮﻟﻴﺔ ﻟﻐﺔ ‪ C++‬ﻭﻗﻮ‪‬ﺎ ‪ .‬ﻓﺎﻟﻠﻐﺔ ‪ C++‬ﺗﺘﻤﻴﺰ ﺑﻘﺎﺑﻠﻴﺘﻬﺎ ﻋﻠـﻰ ﻣﻌﺎﳉـﺔ ﺍﻟﺘﻄﺒﻴﻘـﺎﺕ ﺍﻟﻜـﺒﲑﺓ‬
‫ﻭﺍﳌﻌﻘﺪﺓ‪ ،‬ﻭﺍﻟﻘﻮﺓ ﰲ ﺻﻴﺎﻧﺔ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻜﺘﻮﺑﺔ ‪‬ﺎ ﳑﺎ ﻳﻮﻓﺮ ﻭﻗﺘﹰﺎ ﰲ ﺗﺼﻤﻴﻢ ﺍﻟﱪﺍﻣﺞ ﻭﺗﻄﻮﻳﺮﻫﺎ ‪.‬‬
‫ﺗﻌﺘﱪ ﺍﻟﻠﻐﺔ ‪ C++‬ﺍﻣﺘﺪﺍﺩﹰﺍ ﻟﻠﻐﺔ ‪ .C‬ﻭﻗﺪ ﺃﻧﺸـﺄﻫﺎ ‪ Bjarne Stroustrup‬ﻋـﺎﻡ‬
‫‪ 1979‬ﻡ‪ ،‬ﻭﻛﺎﻧﺖ ﺗﺴﻤﻰ ﺣﻴﻨﻬﺎ ‪ C‬ﻣﻊ ﻓﺌﺎﺕ) ‪ ،(C with classes‬ﻭﺗﻐـﲑ ﺍﲰﻬـﺎ ﺇﱃ‬
‫‪ C++‬ﰲ ﺍﻟﻌﺎﻡ ‪1983‬ﻡ‪.‬‬
‫ﺗﻌﺘﻤﺪ ﺍﻟﻠﻐﺔ ‪ C++‬ﺃﺳﻠﻮﺏ ﺍﻟﱪﳎـﺔ ﻛﺎﺋﻨﻴـﺔ ﺍﳌﻨﺤـﻰ ‪Object Oriented‬‬
‫‪ ،Programming‬ﻭﺍﻟﺬﻱ ﻳﻌﺮﻑ ﺍﺧﺘﺼﺎﺭﹰﺍ ﺑـ )‪ ،(OOP‬ﻭﺍﻟﺬﻱ ﰎ ﺗﻄﻮﻳﺮﻩ ﺑﺴﺒﺐ ﻗﻴـﻮﺩ‬
‫ﻛﺎﻧﺖ ﺃﺳﺎﻟﻴﺐ ﺍﻟﱪﳎﺔ ﺍﻟﻘﺪﳝﺔ ﺍﳌﺘﻤﺜﻠﺔ ﰲ ﺍﻟﻠﻐﺎﺕ ﺍﻹﺟﺮﺍﺋﻴﺔ ﺗﻔﺮﺿﻬﺎ ﻋﻠـﻰ ﺍﳌـﱪﳎﲔ‪ .‬ﻭﻟﻜـﻲ‬
‫ﻧﺘﻌﺮﻑ ﻋﻠﻰ ﻃﺒﻴﻌﺔ ﺗﻠﻚ ﺍﻟﻘﻴﻮﺩ ﳚﺐ ﺃﻥ ﻧﻠﻘﻰ ﺍﻟﻀﻮﺀ ﻋﻠﻰ ﻣﺎ ﳛﺪﺙ ﰲ ﺍﻟﻠﻐﺎﺕ ﺍﻹﺟﺮﺍﺋﻴﺔ‪.‬‬
‫ﺍﻟﻠﻐﺎﺕ ﺍﻹﺟﺮﺍﺋﻴﺔ‪:‬‬
‫ﻟﻐﺎﺕ ‪ Basic ،C ،Pascal‬ﻭ ‪ Fortran‬ﻭﻏﲑﻫﺎ ﻣﻦ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ ﺍﻟﺘﻘﻠﻴﺪﻳﺔ ﻫﻲ‬
‫ﻟﻐﺎﺕ ﺇﺟﺮﺍﺋﻴﺔ )‪ .(Procedural‬ﺃﻱ ﺃﻥ ﻛﻞ ﻋﺒﺎﺭﺓ ﰲ ﺍﻟﻠﻐﺔ ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﺗﻌﻠﻴﻤﺔ ﻟﻠﺤﺎﺳﻮﺏ‬
‫ﺃﻥ ﻳﻨﻔﺬ ﺷﻴﺌﹰﺎ ﻣﺎ ‪ :‬ﺃﺣﺼﻞ ﻋﻠﻰ ﺩﺧﻞ ﺃﻭ ﺃﲨﻊ ﺃﺭﻗﺎﻡ ﺍﱁ‪. … ..‬‬
‫ﻟﺬﺍ ﳒﺪ ﺃﻥ ﺍﻟﱪﻧﺎﻣﺞ ﺍﳌﻜﺘﻮﺏ ﺑﻠﻐﺔ ﺇﺟﺮﺍﺋﻴﺔ ﻫﻮ ﻋﺒﺎﺭﺓ ﻋﻦ ﻻﺋﺤﺔ ﻣـﻦ ﺍﻟﺘﻌﻠﻴﻤـﺎﺕ‪ .‬ﻻ‬
‫ﺗﺒﺪﻭ ﻫﻨﺎﻟﻚ ﻣﺸﻜﻠﺔ ﻣﻊ ﺍﻟﱪﺍﻣﺞ ﺍﻹﺟﺮﺍﺋﻴﺔ ﺍﻟﺼﻐﲑﺓ‪ ،‬ﻓﺎﳌﱪﻣﺞ ﻳﻨﺸﺊ ﻻﺋﺤﺔ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﻭﻳﻘـﻮﻡ‬
‫ﺍﳊﺎﺳﻮﺏ ﺑﺘﻨﻔﻴﺬﻫﺎ‪ .‬ﻭﻟﻜﻦ ﻣﻊ ﻛﱪ ﺣﺠﻢ ﺍﻟﱪﺍﻣﺞ ﻻ ﺗﻌﻮﺩ ﻻﺋﺤﺔ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﻓﻌﺎﻟﺔ ﺣﻴـﺚ‬
‫ﻳﺼﻌﺐ ﻓﻬﻢ ﺑﺮﻧﺎﻣﺞ ﻳﺘﺄﻟﻒ ﻣﻦ ﻣﺌﺎﺕ ﻣﻦ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺇﻻ ﺇﺫﺍ ﻛﺎﻧﺖ ﻣﻘﺴﻤﺔ ﺇﱃ ﺃﺟﺰﺍﺀ ﺃﺻﻐﺮ‪ ،‬ﻟﺬﺍ‬
‫ﰎ ﺍﻋﺘﻤﺎﺩ ﺃﺳﻠﻮﺏ ﺍﻟﺪﺍﻻﺕ )‪ (Functions‬ﻭﺍﻹﺟـﺮﺍﺀﺍﺕ )‪ (Procedures‬ﻛﻮﺳـﻴﻠﺔ‬
‫ﳉﻌﻞ ﺍﻟﱪﺍﻣﺞ ﺃﺳﻬﻞ ﻟﻠﻘﺮﺍﺀﺓ ﻭﺍﻟﻔﻬﻢ‪ ،‬ﺣﻴﺚ ﲤﺘﻠﻚ ﻛﻞ ﺩﺍﻟﺔ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﻭﺍﺟﻬﺔ ﳏﺪﺩﺓ‪ ،‬ﻭﺗﻨﻔـﺬ‬
‫ﻫﺪﻓﹰﺎ ﳏﺪﺩﹰﺍ‪ .‬ﻭﻟﻜﻦ ﺍﳌﺸﻜﻠﺔ ﻣﺎ ﺗﺰﺍﻝ ﻗﺎﺋﻤﺔ ‪ :‬ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺗﻨﻔﺬ ﻣﻬﺎﻣﹰﺎ ﳏﺪﺩﺓ‪.‬‬
‫ﻭ ﻣﻊ ﺗﺰﺍﻳﺪ ﺣﺠﻢ ﺍﻟﱪﺍﻣﺞ ﻭﺗﻌﻘﻴﺪﻫﺎ‪ ،‬ﻳﻈﻬﺮ ﺿﻌﻒ ﺍﻷﺳﻠﻮﺏ ﺍﻹﺟﺮﺍﺋﻲ‪ ،‬ﺣﻴﺚ ﺗﺼﺒﺢ‬
‫ﺍﻟﱪﺍﻣﺞ ﺍﻟﻀﺨﻤﺔ ﻣﻌﻘﺪﺓ ﺇﱄ ﺣﺪ ﻛﺒﲑ‪ .‬ﻣﻦ ﺃﻫﻢ ﺃﺳﺒﺎﺏ ﻓﺸﻞ ﺍﻟﻠﻐﺎﺕ ﺍﻹﺟﺮﺍﺋﻴﺔ ﻫﻮ ﺍﻟﺪﻭﺭ ﺍﻟﺬﻱ‬
‫ﺗﻠﻌﺒﻪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻓﻴﻬﺎ‪ ،‬ﺣﻴﺚ ﺗﻌﻄﻰ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺃﳘﻴﺔ ﺛﺎﻧﻮﻳﺔ ﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃ‪‬ﺎ ﻫﻲ ﺍﻟﺴﺒﺐ ﰲ ﻭﺟﻮﺩ‬

‫‪2‬‬
‫ﺍﻟﱪﺍﻣﺞ‪ ،‬ﻭﻳﻜﻮﻥ ﺍﻟﺘﺸﺪﻳﺪ ﻋﻠﻰ ﺍﻟﺪﺍﻻﺕ ﺍﻟﱵ ﺗﻌﻤﻞ ﻋﻠﻰ ﻫﺬﻩ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﺣﻴـﺚ ﻳـﺘﻢ ﺗﻌﺮﻳـﻒ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ ﺧﺎﺭﺝ ﺃﻱ ﺩﺍﻟﺔ ﻟﻜﻲ ﻳﺼﺒﺢ ﺑﺎﻹﻣﻜﺎﻥ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻣﻦ ﻛﻞ ﺍﻟﺪﺍﻻﺕ ﰲ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﻟﺬﺍ‬
‫ﻏﺎﻟﺒﹰﺎ ﻣﺎ ﺗﻜﻮﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﺮﺿﺔ ﻟﻠﺘﻐﻴﲑ ﺃﻭ ﺍﻟﺘﻌﺪﻳﻞ ﺍﳋﻄﺄ‪ .‬ﻭﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ ﻫﻨﺎﻟـﻚ ﺑﻌـﺾ‬
‫ﺍﻟﻠﻐﺎﺕ ﻛـ ‪ Pascal‬ﻭ‪ C‬ﺗﻌﺮﻑ ﻣﺘﻐﲑﺍﺕ ﳏﻠﻴﺔ )‪ ،( Local‬ﻭﻫﻲ ﻣﺘﻐﲑﺍﺕ ﻣﻌﺮﻓﺔ ﰲ ﺩﺍﻟـﺔ‬
‫ﻭﺍﺣﺪﺓ‪ .‬ﻟﻜﻦ ﺍﳌﺘﻐﲑﺍﺕ ﺍﶈﻠﻴﺔ ﻏﲑ ﻣﻔﻴﺪﺓ ﻟﻠﺒﻴﺎﻧﺎﺕ ﺍﳌﻬﻤﺔ ﺍﻟﱵ ﳚﺐ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻣـﻦ ﻋـﺪﺓ‬
‫ﺩﺍﻻﺕ ﰲ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﺃﻳﻀﹰﺎ ﻫﻨﺎﻙ ﻣﺸﻜﻠﺔ ﻃﺮﻳﻘﺔ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﺴﺒﺐ ﺇﻣﻜﺎﻧﻴـﺔ ﻋـﺪﺓ ﺩﺍﻻﺕ‬
‫ﻟﻠﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ‪ .‬ﻻ ﳝﻜﻦ ﺗﻐﻴﲑ ﺗﺮﺗﻴﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺩﻭﻥ ﺗﻐﻴﲑ ﻛﻞ ﺍﻟﺪﺍﻻﺕ ﺍﻟﱵ ﺗﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ‪.‬‬
‫ﻭﺇﺫﺍ ﺃﺿﻔﻨﺎ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪﺓ ﳓﺘﺎﺝ ﻟﺘﻌﺪﻳﻞ ﻛﻞ ﺍﻟﺪﺍﻻﺕ ﺣﱴ ﺗﺴﺘﻄﻴﻊ ﻫﺬﻩ ﺍﻟـﺪﺍﻻﺕ ﺍﺳـﺘﻌﻤﺎﻝ‬
‫ﻫﺬﻩ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳉﺪﻳﺪﺓ ‪.‬‬
‫ﻏﺎﻟﺒﹰﺎ ﻣﺎ ﻳﻜﻮﻥ ﺗﺼﻤﻴﻢ ﺍﻟﱪﺍﻣﺞ ﺍﻹﺟﺮﺍﺋﻴﺔ ﺻﻌﺒﺎﹰ‪ ،‬ﻷﻥ ﻣﻜﻮﻧﺎ‪‬ﺎ ﺍﻟﺮﺋﻴﺴـﻴﺔ )ﺍﻟـﺪﺍﻻﺕ(‬
‫ﻋﺒﺎﺭﺓ ﻋﻦ ﺑﻨﻴﺔ ﺑﻴﺎﻧﺎﺕ ﻻ ﺗﻘﻠﺪ ﺍﻟﻌﺎﱂ ﺍﳊﻘﻴﻘﻲ ﺟﻴﺪﹰﺍ ‪.‬ﻭ ﻳﺼﻌﺐ ﰲ ﺍﻟﻠﻐﺎﺕ ﺍﻹﺟﺮﺍﺋﻴﺔ ﺇﻧﺸـﺎﺀ ﺃﻱ‬
‫ﻼ ﰲ ﺗﻠﻚ ﺍﻟﻠﻐﺎﺕ ‪ ،‬ﻟﻜﻞ ﻫﺬﻩ ﺍﻷﺳﺒﺎﺏ ﰎ ﺗﻄﻮﻳﺮ‬ ‫ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪ ﲞﻼﻑ ﺍﻷﻧﻮﺍﻉ ﺍﳌﻌﺮﻓﺔ ﺃﺻ ﹰ‬
‫ﺍﻷﺳﻠﻮﺏ ﺍﻟﻜﺎﺋﲏ ﺍﳌﻨﺤﻰ‪.‬‬
‫ﺍﻷﺳﻠﻮﺏ ﺍﻟﻜﺎﺋﲏ ﺍﳌﻨﺤﻰ‪-:‬‬
‫ﺍﻟﻔﻜﺮﺓ ﺍﻷﺳﺎﺳﻴﺔ ﻭﺭﺍﺀ ﺍﻟﻠﻐﺎﺕ ﻛﺎﺋﻨﻴﺔ ﺍﳌﻨﺤﻰ ﻫﻲ ﺩﻣﺞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺍﻟﺪﺍﻻﺕ ﺍﻟﱵ ﺗﻌﻤـﻞ‬
‫ﻋﻠﻰ ﺗﻠﻚ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﻛﻴﻨﻮﻧﺔ ﻭﺍﺣﺪﺓ ﺗﺴﻤﻰ ﻛﺎﺋﻦ )‪ ،(Object‬ﻭﻋﺎﺩﺓ ﺗﺰﻭﺩ ﺩﺍﻻﺕ ﺍﻟﻜﺎﺋﻦ‬
‫‪-‬ﻭﺍﻟﱵ ﺗﺴﻤﻰ ﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ )‪ -(Member functions‬ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﻮﺣﻴﺪﺓ ﻟﻠﻮﺻـﻮﻝ ﺇﱄ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻟﺬﺍ ﺗﻜﻮﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﳏﻤﻴﺔ ﻣﻦ ﺍﻟﺘﻌﺪﻳﻼﺕ ﺍﳋﻄﺄ ﻭﻳﻘﺎﻝ ﺃﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺩﺍﻻ‪‬ـﺎ ﻣﻐﻠﻔـﺔ‬
‫)‪ (Encapsulated‬ﰲ ﻛﻴﻨﻮﻧﺔ ﻭﺍﺣﺪﺓ‪.‬‬
‫ﳑﻴﺰﺍﺕ ﺍﻟﻠﻐﺎﺕ ﻛﺎﺋﻨﻴﺔ ﺍﳌﻨﺤﻰ ‪:‬‬
‫ﻫﻨﺎﻟﻚ ﺗﻄﺎﺑﻖ ﺑﲔ ﺍﻟﻜﺎﺋﻨﺎﺕ ﰲ ﺍﻟﱪﳎﺔ ﻭﻛﺎﺋﻨﺎﺕ ﺍﳊﻴﺎﺓ ﺍﻟﻔﻌﻠﻴﺔ‪ ،‬ﻓﺎﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ‬
‫ﺍﻟﻔﻌﻠﻴﺔ ﳍﺎ ﻭﺿﻌﻴﺔ ) ﺧﺼﺎﺋﺺ ﳝﻜﻦ ﺃﻥ ﺗﺘﻐﲑ ( ﻭﻗﺪﺭﺍﺕ )ﺃﺷﻴﺎﺀ ﳝﻜﻦ ﺃﻥ ﺗﻘﻮﻡ ‪‬ﺎ(‪.‬‬
‫ﰲ ‪ C++‬ﺗﺴﺠﻞ ﺑﻴﺎﻧﺎﺕ ﺍﻟﻜﺎﺋﻦ ﻭﻭﺿﻌﻴﺘﻪ ﻛﻤﺎ ﺗﺘﻮﺍﻓﻖ ﺃﻋﻀﺎﺀﻩ ﺍﻟﺪﺍﻟﻴﺔ ﻣـﻊ ﻗﺪﺭﺍﺗـﻪ‪،‬‬
‫ﺗﺪﻣﺞ ﺍﻟﱪﳎﺔ ﻛﺎﺋﻨﻴﺔ ﺍﳌﻨﺤﻰ ﺍﳌﺮﺍﺩﻑ ﺍﻟﱪﳎﻲ ﻟﻠﻮﺿﻌﻴﺎﺕ ﻭﺍﻟﻘﺪﺭﺍﺕ ﰲ ﻛﻴﻨﻮﻧﺔ ﻭﺍﺣﺪﺓ ﺗﺴـﻤﻰ‬
‫ﻛﺎﺋﻦ ﺍﻟﻨﺘﻴﺠﺔ ﻟﺬﻟﻚ ﻛﻴﻨﻮﻧﺔ ﺑﺮﳎﻴﺔ ﺗﺘﻄﺎﺑﻖ ﺑﺸﻜﻞ ﺟﻴﺪ ﻣﻊ ﺍﻟﻜﺜﲑ ﻣﻦ ﻛﺎﺋﻨﺎﺕ ﺍﳊﻴﺎﺓ ﺍﻟﻔﻌﻠﻴﺔ‪.‬‬
‫ﺍﻟﻔﺌﺎﺕ ﻭﺍﻟﻮﺭﺍﺛﺔ )‪:(Inheritance‬‬
‫ﺍﻟﻜﺎﺋﻨﺎﺕ ﰲ ‪ OOP‬ﻫﻲ ﻣﺜﻴﻼﺕ ﻣﻦ ﺍﻟﻔﺌﺎﺕ‪ ،‬ﺣﻴﺚ ﳝﻜﻨﻨﺎ ﺗﻌﺮﻳﻒ ﻛﺜﲑ ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ‬
‫ﺗﺎﺑﻌﺔ ﻟﻔﺌﺔ ﻣﻌﻴﻨﺔ‪ ،‬ﻭﺗﻠﻌﺐ ﺩﻭﺭ ﺧﻄﺔ ﺃﻭ ﻗﺎﻟﺐ ﻳﺘﻢ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻋﻠﻰ ﺃﺳﺎﺳﻪ‪ ،‬ﻭﻫﻲ ﺍﻟﱵ ﲢﺪﺩ‬

‫‪3‬‬
‫ﻣﺎ ﻫﻲ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺍﻟﺪﺍﻻﺕ ﺍﻟﱵ ﺳﻴﺘﻢ ﴰﻠﻬﺎ ﰲ ﻛﺎﺋﻨﺎﺕ ﺗﻠﻚ ﺍﻟﻔﺌﺔ‪ .‬ﻟﺬﺍ ﻓﺎﻟﻔﺌﺔ ﻫﻲ ﻭﺻﻒ ﻟﻌـﺪﺩ‬
‫ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﳌﺘﺸﺎ‪‬ﺔ‪ .‬ﻭﺗﺆﺩﻯ ﻓﻜﺮﺓ ﺍﻟﻔﺌﺎﺕ ﺇﱄ ﻓﻜﺮﺓ ﺍﻟﻮﺭﺍﺛﺔ‪ ،‬ﺣﻴﺚ ﳝﻜﻦ ﺍﺳـﺘﻌﻤﺎﻝ ﻓﺌـﺔ‬
‫‪ OOP‬ﻛﺄﺳﺎﺱ ﻟﻔﺌﺔ ﻓﺮﻋﻴﺔ ﻭﺍﺣﺪﺓ ﺃﻭ ﺃﻛﺜﺮ ﺗﺴﻤﻰ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ )‪ ،(Base class‬ﻭﳝﻜﻦ‬
‫ﺗﻌﺮﻳﻒ ﻓﺌﺎﺕ ﺃﺧﺮﻯ ﺗﺘﺸﺎﺭﻙ ﰲ ﺧﺼﺎﺋﺼﻬﺎ ﻣﻊ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻭﻟﻜﻨﻬﺎ ﺗﻀﻴﻒ ﺧﺼﺎﺋﺼﻬﺎ ﺍﻟﺬﺍﺗﻴﺔ‬
‫ﺃﻳﻀﹰﺎ‪ ،‬ﺗﺴﻤﻰ ﻫﺬﻩ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ )‪.(Derived classes‬‬
‫ﻗﺎﺑﻠﻴﺔ ﺇﻋﺎﺩﺓ ﺍﻻﺳﺘﻌﻤﺎﻝ ‪:Reusability‬‬
‫ﺑﻌﺪ ﻛﺘﺎﺑﺔ ﺍﻟﻔﺌﺔ ﳝﻜﻦ ﺗﻮﺯﻳﻌﻬﺎ ﻋﻠﻰ ﺍﳌﱪﳎﲔ ﻟﻜﻲ ﻳﺴﺘﻌﻤﻠﻮﻫﺎ ﰲ ﺑﺮﺍﳎﻬﻢ ‪ ،‬ﻳﺴﻤﻰ ﻫﺬﺍ‬
‫ﺍﻷﻣﺮ ﻗﺎﺑﻠﻴﺔ ﺇﻋﺎﺩﺓ ﺍﻻﺳﺘﻌﻤﺎﻝ ‪ Reusability‬ﻭﻳﺰﻭﺩ ﻣﻔﻬﻮﻡ ﺍﻟﻮﺭﺍﺛﺔ ﻣﻠﺤﻘﹰﺎ ﻫﺎﻣﹰﺎ ﺇﱄ ﻓﻜـﺮﺓ‬
‫ﻼ ﻭﻣﻦ ﺩﻭﻥ ﺗﻐﻴﲑﻫـﺎ ﻳﻀـﻴﻒ‬ ‫ﺇﻋﺎﺩﺓ ﺍﻻﺳﺘﻌﻤﺎﻝ ﺣﻴﺚ ﻳﺴﺘﻄﻴﻊ ﺍﳌﱪﻣﺞ ﺃﺧﺬ ﻓﺌﺔ ﻣﻮﺟﻮﺩﺓ ﺃﺻ ﹰ‬
‫ﻣﻴﺰﺍﺕ ﻭﻗﺪﺭﺍﺕ ﺟﺪﻳﺪﺓ ﺇﻟﻴﻬﺎ ﻭﺫﻟﻚ ﻣﻦ ﺧﻼﻝ ﺍﺷﺘﻘﺎﻕ ﻓﺌﺔ ﺟﺪﻳﺪﺓ ﻣﻦ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺪﳝﺔ‪.‬‬
‫ﺇﻧﺸﺎﺀ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪﺓ‪-:‬‬
‫ﻣﻦ ﺃﻫﻢ ﻓﻮﺍﺋﺪ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺃ‪‬ﺎ ﺗﻌﻄﻰ ﺍﳌﱪﻣﺞ ﻭﺳﻴﻠﺔ ﻹﻧﺸﺎﺀ ﺃﻧـﻮﺍﻉ ﺑﻴﺎﻧـﺎﺕ ﺟﺪﻳـﺪﺓ‪،‬‬
‫ﻛﺎﻷﺭﻗﺎﻡ ﺍﳌﺮﻛﺒﺔ ﺃﻭ ﺍﻹﺣﺪﺍﺛﻴﺎﺕ ﺛﻨﺎﺋﻴﺔ ﺍﻷﺑﻌﺎﺩ ﺃﻭ ﺍﻟﺘﻮﺍﺭﻳﺦ ﺃﻭ ﺃﻱ ﻧﻮﻉ ﻣﻦ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻗـﺪ‬
‫ﳛﺘﺎﺝ ﺍﳌﱪﻣﺞ ﺇﱄ ﺍﺳﺘﻌﻤﺎﳍﺎ‪.‬‬
‫‪Polymorphism and overloading‬‬ ‫ﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ ﻭﺍﻟﺘﺤﻤﻴﻞ ﺍﻟﺰﺍﺋﺪ ‪:‬‬
‫ﻳﺴﻤﻰ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﺍﻻﺕ ﻭﺍﻟﻌﻮﺍﻣﻞ ﰲ ﺃﺳﺎﻟﻴﺐ ﳐﺘﻠﻔﺔ ﻭﻓﻘﹰﺎ ﳌﺎ ﻳﺘﻢ ﺍﺳـﺘﻌﻤﺎﳍﺎ ﻋﻠﻴـﻪ‬
‫ﺑﺘﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ‪ .‬ﻻ ﺗﻀﻴﻒ ﺍﻟﻠﻐﺔ ‪ C++‬ﺇﻣﻜﺎﻧﻴﺔ ﺇﻧﺸﺎﺀ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪﺓ ﻓﻘﻂ‪ ،‬ﺑﻞ ﻭﺗﺘـﻴﺢ‬
‫ﺃﻳﻀﹰﺎ ﻟﻠﻤﱪﻣﺞ ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﺍﻟﻌﻤﻞ ﻋﻠﻰ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳉﺪﻳﺪﺓ ﺗﻠﻚ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻧﻔﺲ ﺍﻟﻌﻮﺍﻣـﻞ‬
‫ﺍﻟﱵ ﺗﺴﺘﺨﺪﻣﻬﺎ ﺍﻷﻧﻮﺍﻉ ﺍﻷﺳﺎﺳﻴﺔ ﻛـ ‪ +‬ﺃﻭ = ﻭﻳﻘﺎﻝ ﻋﻨﺪﻫﺎ ﺃﻧﻪ ﰎ ﲢﻤﻴﻞ ﻫﺬﻩ ﺍﻟﻌﻮﺍﻣﻞ ﺑﺸﻜﻞ‬
‫ﺯﺍﺋﺪ ﻟﺘﻌﻤﻞ ﻣﻊ ﺍﻷﻧﻮﺍﻉ ﺍﳉﺪﻳﺪﺓ‪.‬‬

‫ﻛﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﺑـ ‪C++‬‬


‫‪1.2‬‬

‫ﺳﻨﺒﺪﺃ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﻌﺮﺽ ﻧﺼﹰﺎ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪-:‬‬

‫‪//Program 1-1:‬‬
‫‪//This program will display a message on the screen.‬‬
‫>‪#include<iostream.h‬‬
‫) ( ‪main‬‬
‫{‬

‫‪4‬‬
‫;''‪cout <<''welcome to C++ !\n‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫! ‪welcome to C++‬‬

‫ﻳﻘﻮﻡ ﺍﳊﺎﺳﻮﺏ ﺑﺘﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﻭﻳﻌﻮﺩ ﺳﺮﻳﻌﹰﺎ ﻟﻠﻤﺤﺮﺭ ‪.IDE‬‬


‫ﻣﻦ ﺍﻵﻥ ﻓﺼﺎﻋﺪﺍﹰ‪ ،‬ﺇﺫﺍ ﺃﺭﺩﺕ ﺗﺜﺒﺖ ﺍﳌﺨﺮﺟﺎﺕ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﻋﻠﻴﻚ ﺇﺿﺎﻓﺔ ﺍﻟﺘﺎﱄ ﺇﱃ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬
‫>‪#include <conio.h‬‬
‫ﰲ ﺃﻭﻝ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﻭﺇﺿﺎﻓﺔ ﺍﻟﻌﺒﺎﺭﺓ‪:‬‬
‫) (‪getch‬‬
‫ﰲ ﺍﻟﺴﻄﺮ ﺍﻟﺬﻱ ﻳﺴﺒﻖ ﺍﻟﻌﺒﺎﺭﺓ ‪.return 0‬‬

‫ﺍﻟﺘﻌﻠﻴﻘﺎﺕ‪Comments:‬‬
‫‪// Program 1-1:‬‬
‫‪//This program will display a message on the screen.‬‬

‫ﻳﺒﺪﺃ ﻫﺬﺍ ﺍﻟﺴﻄﺮ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺎﻟﺸﺮﻃﺔ ﺍﳌﺰﺩﻭﺟﺔ )‪ (//‬ﺍﻟﺪﺍﻟﺔ ﻋﻠﻰ ﺃﻥ ﺑﻘﻴﺔ ﺍﻟﺴﻄﺮ ﻋﺒﺎﺭﺓ‬
‫ﻋﻦ ﺗﻌﻠﻴﻖ )‪ ،(comment‬ﺗﻀﺎﻑ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﺇﱃ ﺍﻟﱪﺍﻣﺞ ﻟﺘﺴﺎﻋﺪ ﺍﳌﱪﻣﺞ ﺃﻭ ﺃﻱ ﺷﺨﺺ ﺁﺧﺮ‬
‫ﻗﺪ ﳛﺘﺎﺝ ﺇﱃ ﻗﺮﺍﺀﺓ ﺍﻟﱪﻧﺎﻣﺞ ﻋﻠﻰ ﻓﻬﻢ ﻣﺎ ﺍﻟﺬﻱ ﻳﻔﻌﻠﻪ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﻟﺬﺍ ﻣﻦ ﺍﳌﺴﺘﺤﺴﻦ ﺃﻥ ﻳﺒﺪﺃ ﻛﻞ‬
‫ﺑﺮﻧﺎﻣﺞ ﰲ ﻟﻐﺔ ‪ C++‬ﺑﺘﻌﻠﻴﻖ ﻳﻮﺿﺢ ﺍﻟﻐﺮﺽ ﺍﻟﺬﻱ ﻣﻦ ﺃﺟﻠﻪ ﻛﺘﺐ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫ﺗﺴﺘﺨﺪﻡ ﺍﻟﺸﺮﻃﺔ ﺍﳌﺰﺩﻭﺟﺔ )‪ (//‬ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﺘﻌﻠﻴﻖ ﳝﺘﺪ ﻟﺴﻄﺮ ﻭﺍﺣﺪ ﻓﻘـﻂ ‪single-‬‬
‫‪.line comment‬‬
‫ﻫﻨﺎﻟﻚ ﻧﻮﻉ ﺁﺧﺮ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﻳﺘﻴﺢ ﻟﻨﺎ ﻛﺘﺎﺑﺔ ﺗﻌﻠﻴﻘﺎﺕ ﲤﺘﺪ ﺇﱃ ﻋﺪﺓ ﺃﺳﻄﺮ‪multi-‬‬
‫‪ ، line comments‬ﻧﺴﺘﻄﻴﻊ ﻛﺘﺎﺑﺔ ﺍﻟﺘﻌﻠﻴﻖ ﺍﻟﺴﺎﺑﻖ ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ‪:‬‬
‫‪/* Program 1-1:‬‬
‫‪This program will display a message on the screen‬‬
‫‪*/‬‬

‫‪5‬‬
‫ﻳﺒﺪﺃ ﺍﻟﺮﻣﺰ *‪ /‬ﺍﻟﺘﻌﻠﻴﻖ ﻭﻳﻨﻬﻴﻪ ﺍﻟﺮﻣﺰ ‪ . */‬ﳒﺪ ﺃﻥ ‪‬ﺎﻳﺔ ﺍﻟﺴﻄﺮ ﻻ ﺗﻌﲎ ﺍﻧﺘﻬﺎﺀ ﺍﻟﺘﻌﻠﻴﻖ ﻟﺬﺍ‬
‫ﳝﻜﻨﻨﺎ ﻛﺘﺎﺑﺔ ﻣﺎ ﻧﺸﺎﺀ ﻣﻦ ﺃﺳﻄﺮ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﻗﺒﻞ ﺍﻻﻧﺘﻬﺎﺀ ﺑﺎﻟﺮﻣﺰ ‪.*/‬‬

‫‪6‬‬
‫)‪-:(Preprocessor Directive‬‬ ‫ﻣﺮﺷﺪﺍﺕ ﺍﳌﻬﻴﺊ‬
‫>‪#include<iostream.h‬‬
‫ﻳﺴﻤﻰ ﻫﺬﺍ ﲟﺮﺷﺪ ﺍﳌﻬﻴﺊ ‪ ،Preprocessor directive‬ﻭﻫﻮ ﻋﺒـﺎﺭﺓ ﻋـﻦ‬
‫ﺗﻌﻠﻴﻤﺔ ﻟﻠﻤﺼﺮﻑ ﺃﻥ ﻳﺪﺭﺝ ﻛﻞ ﺍﻟﻨﺺ ﺍﳌﻮﺟﻮﺩ ﰲ ﺍﳌﻠﻒ ‪ iostream.h‬ﰲ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﻭﻫـﻮ‬
‫ﻣﻠﻒ ﳚﺐ ﺗﻀﻤﻴﻨﻪ ﻣﻊ ﺃﻱ ﺑﺮﻧﺎﻣﺞ ﳛﺘﻮﻯ ﻋﻠﻰ ﻋﺒﺎﺭﺍﺕ ﺗﻄﺒﻊ ﺑﻴﺎﻧﺎﺕ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﺃﻭ ﺗﺴـﺘﻘﺒﻞ‬
‫ﺑﻴﺎﻧﺎﺕ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‪.‬‬
‫ﻳﺴﻤﻰ ‪ iostream‬ﻣﻠﻒ ﺗﺮﻭﻳﺴﺔ )‪ ،(header file‬ﻭﻫﻨﺎﻟﻚ ﺍﻟﻜﺜﲑ ﻣﻦ ﻣﻠﻔﺎﺕ‬
‫ﻼ ﺇﺫﺍ ﻛﻨﺎ ﻧﺴﺘﻌﻤﻞ ﰲ ﺑﺮﻧﺎﳎﻨﺎ ﺩﺍﻻﺕ ﺭﻳﺎﺿﻴﺔ ﻛـ ) (‪ sin‬ﻭ) (‪cos‬‬ ‫ﺍﻟﺘﺮﻭﻳﺴﺔ ﺍﻷﺧﺮﻯ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﳓﺘﺎﺝ ﺇﱃ ﴰﻞ ﻣﻠﻒ ﺗﺮﻭﻳﺴﺔ ﻳﺪﻋﻰ ‪ ،math.h‬ﻭﺇﺫﺍ ﻛﻨﺎ ﻧﺘﻌﺎﻣﻞ ﻣـﻊ ﺳﻼﺳـﻞ ﺍﻷﺣـﺮﻑ‬
‫ﺳﻨﺤﺘﺎﺝ ﻟﻠﻤﻠﻒ ‪ .string.h‬ﻭﻋﻤﻮﻣﹰﺎ ﻫﻨﺎﻟﻚ ﻋﺪﺩ ﻛﺒﲑ ﻣﻦ ﻣﻠﻔﺎﺕ ﺍﻟﺘﺮﻭﻳﺴﺎﺕ ﺍﻟﱵ ﳚـﺐ‬
‫ﺗﻀﻤﻴﻨﻬﺎ ﻋﻠﻰ ﺣﺴﺐ ﻃﺒﻴﻌﺔ ﺍﻟﱪﻧﺎﻣﺞ ‪ ،‬ﺗﻌﺘﱪ ﻣﻠﻔﺎﺕ ﺍﻟﺘﺮﻭﻳﺴﺎﺕ ﺟﺰﺀ ﻣﻬﻢ ﻣﻦ ﺑـﺮﺍﻣﺞ ﻟﻐـﺔ‬
‫‪ C++‬ﻭﺳﻨﺤﺘﺎﺝ ﺇﱃ ﴰﻞ ﺍﳌﻠﻒ ‪ iostream.h‬ﻟﺘﺸﻐﻴﻞ ﺃﻱ ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺎﺕ ﺇﺩﺧـﺎﻝ‬
‫ﻭﺇﺧﺮﺍﺝ‪.‬‬
‫ﺍﻟﺪﺍﻟﺔ ‪-: main‬‬
‫) (‪main‬‬
‫ﻳﺒﺪﺃ ﺗﺸﻐﻴﻞ ﺃﻱ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﻣﻦ ﺩﺍﻟﺔ ﺗﺪﻋﻲ ) (‪ ،main‬ﻭﻫﻲ ﺩﺍﻟﺔ ﻣﺴـﺘﻘﻠﺔ ﻳﻨﻘـﻞ‬
‫ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﺘﺤﻜﻢ ﺇﻟﻴﻬﺎ‪ .‬ﻭﻫﻲ ﺟﺰﺀ ﺃﺳﺎﺳﻲ ﰲ ﺑﺮﻧﺎﻣﺞ ‪.C++‬‬
‫ﺍﻷﻗﻮﺍﺱ ﺑﻌﺪ ‪ main‬ﺗﺸﲑ ﺇﱃ ﺃﻥ ‪ main‬ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﺩﺍﻟﺔ‪ .‬ﻗﺪ ﳛﺘﻮﻯ ﺑﺮﻧـﺎﻣﺞ‬
‫‪ C++‬ﻋﻠﻰ ﺃﻛﺜﺮ ﻣﻦ ﺩﺍﻟﺔ ﺇﺣﺪﺍﳘﺎ ﺑﺎﻟﻀﺮﻭﺭﺓ ﻫﻲ ‪ .main‬ﳛﺘﻮﻯ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻋﻠﻰ ﺩﺍﻟـﺔ‬
‫ﻭﺍﺣﺪﺓ‪.‬‬
‫ﻳﺒﺪﺃ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﻣﻦ ﺍﻟﺪﺍﻟﺔ ‪ main‬ﺣﱴ ﻟﻮ ﱂ ﺗﻜﻦ ﻫﻲ ﺍﻷﻭﱃ ﰲ ﺳﻴﺎﻕ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫ﻳﺘﻢ ﺣﺼﺮ ﺟﺴﻢ ﺍﻟﺪﺍﻟﺔ ‪ main‬ﺑﺄﻗﻮﺍﺱ ﺣﺎﺻﺮﺓ } { ‪.‬‬
‫ﺍﳋﺮﺝ ﺇﱃ ﺍﻟﺸﺎﺷﺔ‪-:‬‬
‫;'' ‪cout<<'' welcome to C++ !\n‬‬
‫ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ )‪ (statement‬ﲡﱪ ﺍﳊﺎﺳﻮﺏ ﺃﻥ ﻳﻈﻬﺮ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﺍﻟﻨﺺ ﺍﶈﺼﻮﺭ‬
‫ﺑﲔ ﻋﻼﻣﱵ ﺍﻻﻗﺘﺒﺎﺱ '' ''‪ .‬ﻭﻳﺴﻤﻰ ﻫﺬﺍ ﺍﻟﻨﺺ ﺛﺎﺑﺖ ﺳﻠﺴﻠﻲ‪.‬‬
‫ﳚﺐ ﺃﻥ ﺗﻨﺘﻬﻲ ﻛﻞ ﻋﺒﺎﺭﺓ ﰲ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﺑﻔﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ ; )‪.(semi colon‬‬

‫‪7‬‬
‫ﺍﻻﺳﻢ ‪ cout‬ﻭﺍﻟﺬﻱ ﻳﻠﻔﻆ ﻛـ ‪ C out‬ﳝﺜﻞ ﻛﺎﺋﻦ ﰲ ‪ C++‬ﻣﻘﺘﺮﻥ ﻣﻊ ﺍﻟﺸﺎﺷﺔ‬
‫ﻭﺍﻟﻌﺎﻣﻞ << ﻭﺍﻟﺬﻱ ﻳﺴﻤﻰ ﺑﻌﺎﻣﻞ ﺍﻟﻮﺿﻊ ‪ Put to operator‬ﳚﱪ ﻋﻠﻰ ﺇﺭﺳﺎﻝ ﺍﻷﺷـﻴﺎﺀ‬
‫ﺍﻟﱵ ﻋﻠﻰ ﳝﻴﻨﻪ ﺇﱃ ﺃﻱ ﺷﺊ ﻳﻈﻬﺮ ﻋﻠﻰ ﻳﺴﺎﺭﻩ‪.‬‬
‫ﺍﻟﺸﻜﻞ ‪ 1-1‬ﻳﻮﺿﺢ ﺍﳋﺮﺝ ﺑﻮﺍﺳﻄﺔ ‪.cout‬‬

‫ﺍﻟﺸﺎﺷﺔ‬ ‫‪cout‬‬ ‫<<‬ ‫ﻣﺘﻐﲑ‬

‫ﺷﻜﻞ )‪ (1-1‬ﺍﳋﺮﺝ ﺑﻮﺍﺳﻄﺔ ‪cout‬‬ ‫ﻣﺜﺎﻝ‪:‬‬


‫‪//Program 1-2: Output‬‬
‫>‪#include <iostream.h‬‬
‫) ( ‪main‬‬

‫{‬
‫;"‪cout << 7 << " is an integer.\n‬‬
‫;"‪cout << 'a' << "is a character.\n‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪7 is an integer.‬‬
‫‪a is a character‬‬

‫ﻣﻦ ﺧﺮﺝ ﺍﻟﱪﻧﺎﻣﺞ ﻳﺘﻀﺢ ﻟﻨﺎ ﺍﻵﰐ‪:‬‬


‫‪ -1‬ﻳﺘﻢ ﺣﺼﺮ ﺍﻟﻨﺺ ﺍﳌﻄﻠﻮﺏ ﻇﻬﻮﺭﻩ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﺑﲔ ﻋﻼﻣﱵ ﺍﻗﺘﺒﺎﺱ"‪." is an integer‬‬
‫‪ -2‬ﺗﺘﻢ ﻛﺘﺎﺑﺔ ﺍﻟﺜﻮﺍﺑﺖ ﺍﻟﺮﻗﻤﻴﺔ ﺑﺪﻭﻥ ﻋﻼﻣﱵ ﺍﻗﺘﺒﺎﺱ ‪.<< 7‬‬
‫‪ -3‬ﻳﺘﻢ ﺣﺼﺮ ﺣﺮﻑ ﻭﺍﺣﺪ ﻣﻄﻠﻮﺏ ﻇﻬﻮﺭﻩ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﺑﻌﻼﻣﺔ ﺍﻗﺘﺒﺎﺱ ﻓﺮﺩﻳﺔ ’‪.<<’a‬‬

‫‪8‬‬
‫ﻼ ﺑﺎﻻﻧﺘﻘﺎﻝ ﺇﱃ ﺳﻄﺮ ﺟﺪﻳﺪ ﺗﻠﻘﺎﺋﻴﹰﺎ ﰲ ‪‬ﺎﻳﺔ ﻛﻞ‬
‫ﺗﻘﻮﻡ ﺑﻌﺾ ﺍﻟﻠﻐﺎﺕ ﻛـ ‪ Basic‬ﻣﺜ ﹰ‬
‫ﻋﺒﺎﺭﺓ ﺧﺮﺝ ‪ ،‬ﻟﻜﻦ ‪ C++‬ﻻ ﺗﻔﻌﻞ ﺫﻟﻚ ﻛﻤﺎ ﺃﻥ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﳌﺨﺘﻠﻔﺔ ﻭﺍﳌﻮﺿﻮﻋﺔ ﰲ ﺃﺳﻄﺮ ﳐﺘﻠﻔﺔ‬
‫ﻻ ﺗﺆﺩﻱ ﺇﱃ ﺫﻟﻚ ‪.‬‬
‫ﻻ ﻳﻨﺸﺊ ﺍﻟﻜﺎﺋﻦ ‪ cout‬ﺃﺳﻄﺮﹰﺍ ﺟﺪﻳﺪﺓ ﺗﻠﻘﺎﺋﻴﺎﹰ‪ ،‬ﻭﺍﳌﺨﺮﺟﺎﺕ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﺗﻮﺿﺢ‬
‫ﺫﻟﻚ‪-:‬‬
‫‪//Program 1-3:This program displays output on the screen‬‬
‫>‪#include<iostream.h‬‬
‫) ( ‪main‬‬
‫{‬
‫;‪cout<<10‬‬
‫;‪cout<<20<<30‬‬
‫;‪return 0‬‬
‫}‬

‫ﺗﻈﻬﺮ ﺍﳋﺮﺝ‪-:‬‬

‫‪102030‬‬

‫ﺣﻴﺚ ﻳﻠﺘﺼﻖ ﻛﻞ ﺍﳋﺮﺝ ﺑﺒﻌﻀﻪ ﺍﻟﺒﻌﺾ ‪ ،‬ﻟﺬﺍ ﻣﻦ ﺍﳉﻴﺪ ﺃﻥ ﻳﻜﻮﻥ ﻟﺪﻳﻨﺎ ﻃﺮﻕ ﰲ ‪C++‬‬
‫ﻟﻠﺘﺤﻜﻢ ﺑﻄﺮﻳﻘﺔ ﺗﻨﺴﻴﻖ ﺍﳋﺮﺝ ﻭﺍﻟﱵ ﻣﻨﻬﺎ ﺗﺘﺎﺑﻌﺎﺕ ﺍﳍﺮﻭﺏ)‪.(Escape Sequences‬‬
‫ﺗﺘﺎﺑﻌﺎﺕ ﺍﳍﺮﻭﺏ )‪:(Escape Sequences‬‬
‫‪(Back‬‬ ‫ﻧﻼﺣﻆ ﺃﻧﻪ ﱂ ﺗﺘﻢ ﻃﺒﺎﻋﺔ ‪ \n‬ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ‪ \ ،‬ﺗﺴﻤﻰ ﺍﻟﺸﺮﻃﺔ ﺍﳋﻠﻔﻴـﺔ‬
‫)‪ slash‬ﺃﻭ ﺣﺮﻑ ﻫﺮﻭﺏ )‪ (Escape character‬ﻭﺗﺴﻤﻰ ﻫﻲ ﻭﺍﳊﺮﻑ ﺍﻟﺬﻱ ﻳﻠﻴﻬﺎ‬
‫ﺗﺘﺎﺑﻊ ﻫﺮﻭﺏ‪ .‬ﺗﺘﺎﺑﻊ ﺍﳍﺮﻭﺏ ‪ \n‬ﻳﻌﲎ ﺍﻻﻧﺘﻘﺎﻝ ﺇﱃ ﺳﻄﺮ ﺟﺪﻳﺪ ﺣﻴﺚ ﳚﱪ ﺍﳌﺆﺷﺮ ﻋﻠﻰ ﺍﻻﻧﺘﻘﺎﻝ‬
‫ﺇﱃ ﺑﺪﺍﻳﺔ ﺍﻟﺴﻄﺮ ﺍﻟﺘﺎﱄ ‪ ،‬ﺍﻵﻥ ﺇﻟﻴﻚ ﺑﻌﺾ ﺗﺘﺎﺑﻌﺎﺕ ﺍﳍﺮﻭﺏ ﺍﻟﺸﺎﺋﻌﺔ‪-:‬‬
‫ﺍﻟﻮﺻﻒ‬ ‫ﺗﺘﺎﺑﻊ ﺍﳍﺮﻭﺏ‬
‫ﺳﻄﺮ ﺟﺪﻳﺪ‪.‬‬ ‫‪\n‬‬
‫ﻣﺴﺎﻓﺔ ﺃﻓﻘﻴﺔ‪.‬‬ ‫‪\t‬‬
‫ﺣﺮﻑ ﺍﻟﺘﺮﺍﺟﻊ ‪.back space‬‬ ‫‪\b‬‬

‫‪9‬‬
‫ﻟﻄﺒﺎﻋﺔ ﺷﺮﻃﺔ ﺧﻠﻔﻴﺔ‪.‬‬ ‫\\‬
‫ﺣﺮﻑ ﺍﻹﺭﺟﺎﻉ‪ ،‬ﳚﱪ ﺍﳌﺆﺷﺮ ﻋﻠﻰ ﺍﻻﻧﺘﻘﺎﻝ ﺇﱃ‬ ‫‪\r‬‬
‫ﺑﺪﺍﻳﺔ ﻫﺬﺍ ﺍﻟﺴﻄﺮ‪.‬‬
‫ﻟﻄﺒﺎﻋﺔ ﻋﻼﻣﺔ ﺍﻗﺘﺒﺎﺱ‬ ‫''\‬
‫ﺍﻟﻌﺒــﺎﺭﺓ ‪-: return 0‬‬
‫ﺗﻜﺘﺐ ﺍﻟﻌﺒﺎﺭﺓ ;‪ return 0‬ﰲ ‪‬ﺎﻳﺔ ﺍﻟﺪﺍﻟﺔ ) (‪ .main‬ﺍﻟﻘﻴﻤﺔ ‪ 0‬ﺗﺸـﲑ‬
‫ﺇﱃ ﺃﻥ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻧﺘﻬﻰ ‪‬ﺎﻳﺔ ﺻﺤﻴﺤﺔ ﻭﺳﻴﺒﺪﻭ ﻟﻨﺎ ﺳﺒﺐ ﺗﻀﻤﲔ ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ ﻭﺍﺿـﺤﺎ ﻋﻨـﺪﻣﺎ‬
‫ﻧﺘﻌﺮﻑ ﻋﻠﻰ ﺍﻟﺪﻭﺍﻝ ﰲ ‪ C++‬ﺑﺎﻟﺘﻔﺼﻴﻞ‪.‬‬
‫ﻣﺜﺎﻝ ﺁﺧﺮ ﻟﱪﻧﺎﻣﺞ ‪-: C++‬‬
‫ﺇﻟﻴﻚ ﺍﻵﻥ ﻣﺜﺎ ﹰﻻ ﻟﱪﻧﺎﻣﺞ ﻳﺴﺘﻘﺒﻞ ﺭﻗﻤﲔ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﻭﳚﻤﻌﻬﻤﺎ ﻭﻳﻌﺮﺽ ﻧﺎﺗﺞ ﺍﳉﻤﻊ‪-:‬‬

‫‪// Program 1-4: Addition program‬‬


‫>‪#include<iostream.h‬‬
‫>‪#include<conio.h‬‬
‫{ ) ( ‪main‬‬
‫;‪int integer1, integer2, sum‬‬
‫;"‪cout <<"Enter first integer\n‬‬
‫;‪cin >> integer1‬‬
‫;"‪cout <<"Enter second integer\n‬‬
‫;‪cin >> integer2‬‬
‫;‪sum= integer1+integer2‬‬
‫;‪cout <<"sum="<<sum<<endl‬‬
‫;)(‪getch‬‬
‫;‪return 0‬‬
‫}‬

‫‪Enter first integer‬‬


‫‪7‬‬
‫‪Enter second integer‬‬
‫‪3‬‬
‫‪sum= 10‬‬

‫‪10‬‬
‫‪ .1‬ﺣﺪﺩ ﻣﺎ ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻵﺗﻴﺔ ﺻﺤﻴﺤﺔ ﺃﻡ ﺧﻄﺄ‪:‬‬
‫ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﲡﱪ ﺍﳊﺎﺳﻮﺏ ﻋﻠﻰ ﻃﺒﺎﻋﺔ ﺍﻟﻨﺺ ﺍﻟﺬﻱ ﻳﻠﻲ ‪ //‬ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﻋﻨﺪ‬
‫ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫ ﺗﺘﺎﺑﻊ ﺍﳍﺮﻭﺏ ‪ \n‬ﳚﱪ ﺍﳌﺆﺷﺮ ﻋﻠﻰ ﺍﻻﻧﺘﻘﺎﻝ ﺇﱃ ﺳﻄﺮ ﺟﺪﻳﺪ‪.‬‬
‫ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﻭﺍﻟﺬﻱ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺛﻼﺙ ﺃﺳﻄﺮ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﳚﺐ ﺃﻥ‬
‫ﳛﺘﻮﻯ ﻋﻠﻰ ﺛﻼﺙ ﻋﺒﺎﺭﺍﺕ ﺗﺴﺘﻌﻤﻞ ‪.cout‬‬
‫‪ .2‬ﻣﺎ ﻫﻮ ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻵﺗﻴﺔ‪:‬‬
‫;”‪cout << “\n **\n ***\n ****\n‬‬

‫‪11‬‬
‫‪C ++‬‬ ‫ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻷﺳﺎﺳﻴﺔ ﰲ ﻟﻐﺔ‬ ‫‪1.3‬‬

‫ﻫﻨﺎﻟﻚ ﺳﺒﻌﺔ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﺃﺳﺎﺳﻴﺔ ﰲ ‪ ، C++‬ﻭﺍﺣﺪ ﻣﻨﻬﺎ ﳝﺜﻞ ﺍﻷﺣﺮﻑ ﻭﺛﻼﺛﺔ‬
‫ﲤﺜﻞ ﺃﺭﻗﺎﻣﹰﺎ ﻛﺎﻣﻠﺔ )ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ( ﻭﺛﻼﺛﺔ ﲤﺜﻞ ﺃﺭﻗﺎﻣﹰﺎ ﺣﻘﻴﻘﻴﺔ‪ .‬ﺍﳉﺪﻭﻝ ﺍﻵﰐ ﻳﻠﺨـﺺ ﻫـﺬﻩ‬
‫ﺍﻷﻧﻮﺍﻉ‪.‬‬
‫ﺃﻣﺜﻠﺔ ﻋﻦ ﺍﻟﻘﻴﻢ ﺍﳌﺨﺰﻧﺔ‬ ‫ﻳﺴﺘﻌﻤﻞ ﻟﺘﺨﺰﻳﻦ‬ ‫ﺍﺳﻢ ﺍﻟﻨﻮﻉ‬
‫''‪''a‬‬ ‫ﺃﺣﺮﻑ‬ ‫‪char‬‬
‫‪222‬‬ ‫ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ ﻗﺼﲑﺓ‬ ‫‪short‬‬
‫‪153,406‬‬ ‫ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ ﻋﺎﺩﻳﺔ ﺍﳊﺠﻢ‬ ‫‪int‬‬
‫‪123,456,789‬‬ ‫ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ ﻃﻮﻳﻠﺔ‬ ‫‪long‬‬
‫‪3,7‬‬ ‫ﺃﺭﻗﺎﻡ ﺣﻘﻴﻘﻴﺔ ﻗﺼﲑﺓ‬ ‫‪float‬‬
‫‪7,533,039,395‬‬ ‫ﺃﺭﻗﺎﻡ ﺣﻘﻴﻘﻴﺔ ﻣﺰﺩﻭﺟﺔ‬ ‫‪double‬‬
‫‪9,176,321,236,01202,6‬‬ ‫ﺃﺭﻗﺎﻡ ﺣﻘﻴﻘﻴﺔ ﺿﺨﻤﺔ‬ ‫‪long double‬‬
‫‪ /1‬ﺍﻷﺣﺮﻑ ‪-: char‬‬
‫ﻳﺘﻢ ﲣﺰﻳﻦ ﺍﻷﺣﺮﻑ ﰲ ﻣﺘﻐﲑﺍﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ char‬ﺍﻟﻌﺒﺎﺭﺓ‪-:‬‬
‫;‪char ch‬‬
‫ﺗﻨﺸﺊ ﻣﺴﺎﺣﺔ ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ ﳊﺮﻑ ﻭﺗﺴﻤﻴﻪ ‪ .ch‬ﻟﺘﺨﺰﻳﻦ ﺣﺮﻑ ﻣﺎ ﰲ ﻫﺬﺍ ﺍﳌﺘﻐﲑ ﻧﻜﺘﺐ‬
‫’‪ch=’z‬‬
‫ﻭﺩﺍﺋﻤﹰﺎ ﺗﻜﻮﻥ ﺍﻷﺣﺮﻑ ﺍﻟﺜﺎﺑﺘﺔ ﻛـ ’‪ ‘a‬ﻭ’‪ ’b‬ﳏﺼﻮﺭﺓ ﺑﻌﻼﻣﺔ ﺍﻗﺘﺒﺎﺱ ﻓﺮﺩﻳﺔ‪.‬‬
‫ﻼ ﳝﻜﻨﻨﺎ‬
‫ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﻝ ﺍﳌﺘﻐﲑﺍﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ char‬ﻟﺘﺨﺰﻳﻦ ﺃﺭﻗﺎﻡ ﻛﺎﻣﻠﺔ ﺑﺪ ﹰﻻ ﻣﻦ ﺃﺣﺮﻑ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﻛﺘﺎﺑﺔ‪-:‬‬
‫;‪ch=2‬‬
‫ﻟﻜﻦ ﻧﻄﺎﻕ ﺍﻟﻘﻴﻢ ﺍﻟﺮﻗﻤﻴﺔ ﺍﻟﱵ ﳝﻜﻦ ﲣﺰﻳﻨﻬﺎ ﰲ ﺍﻟﻨﻮﻉ ‪ char‬ﻳﺘﺮﺍﻭﺡ ﺑﲔ‬
‫‪ –128‬ﺇﱃ ‪ 127‬ﻟﺬﺍ ﻓﺈﻥ ﻫﺬﻩ ﺍﻟﻄﺮﻳﻘﺔ ﺗﻌﻤﻞ ﻣﻊ ﺍﻷﺭﻗﺎﻡ ﺍﻟﺼﻐﲑﺓ ﻓﻘﻂ‪.‬‬
‫‪ /2‬ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ‪:‬‬

‫‪12‬‬
‫ﲤﺜﻞ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﺃﺭﻗﺎﻣﹰﺎ ﻛﺎﻣﻠﺔ ﺃﻱ ﻗﻴﻢ ﳝﻜﻦ ﺗﻌﺪﺍﺩﻫﺎ ‪ ،‬ﻛﻌﺪﺩ ﺃﺷﺨﺎﺹ ﺃﻭ ﺃﻳـﺎﻡ‬
‫ﻼ ‪ ،‬ﻭﻻ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﺃﺭﻗﺎﻣﹰﺎ ﺫﺍﺕ ﻧﻘﻄـﺔ ﻋﺸـﺮﻳﺔ‬ ‫ﺃﻭ ﻋﺪﺩ ﺻﻔﺤﺎﺕ ﻣﺜ ﹰ‬
‫ﻭﻟﻜﻨﻬﺎ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺳﺎﻟﺒﺔ‪.‬‬
‫ﻫﻨﺎﻟﻚ ﺛﻼﺛﺔ ﺃﻧﻮﺍﻉ ﻣﻦ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﰲ ‪ short:C++‬ﻗﺼﲑ‪ int ،‬ﻋﺪﺩ‬
‫ﺻﺤﻴﺢ‪ long ،‬ﻃﻮﻳﻞ ﻭﻫﻲ ﲢﺘﻞ ﻣﺴﺎﺣﺎﺕ ﳐﺘﻠﻔﺔ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪ .‬ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳـﺒﲔ ﻫـﺬﻩ‬
‫ﺍﻷﻧﻮﺍﻉ ﻭﺍﳌﺴﺎﺣﺔ ﺍﻟﱵ ﺗﺄﺧﺬﻫﺎ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻭﻧﻄﺎﻕ ﺍﻷﺭﻗﺎﻡ ﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﺗﺄﺧﺬﻫﺎ‪:‬‬

‫ﺍﻟﻨﻄﺎﻕ‬ ‫ﺍﳊﺠﻢ‬ ‫ﺍﺳﻢ ﺍﻟﻨﻮﻉ‬


‫‪ -128‬ﺇﱃ ‪127‬‬ ‫‪1byte‬‬ ‫‪char‬‬
‫‪ -32,768‬ﺇﱃ ‪32,767‬‬ ‫‪2byte‬‬ ‫‪short‬‬
‫ﻣﺜﻞ ‪ short‬ﰲ ﺃﻧﻈﻤﺔ ‪ 16bit‬ﻭﻣﺜﻞ ‪ long‬ﰲ ﺃﻧﻈﻤﺔ ‪32bit‬‬ ‫‪int‬‬
‫ﺇﱃ‬ ‫‪-2,147,483,648‬‬ ‫‪4byte‬‬ ‫‪long‬‬
‫‪2,147,483,647‬‬

‫‪ /3‬ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﻏﲑ ﺍﳌﻌﻠﻤﺔ) ‪-:(Unsigned‬‬


‫ﻛﻞ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﳍﺎ ﺇﺻﺪﺍﺭﺍﺕ ﻏﲑ ﻣﻌﻠﻤﺔ )‪ . (unsigned‬ﻻ ﺗﺴﺘﻄﻴﻊ‬
‫ﺍﳌﺘﻐﲑﺍﺕ ﺍﻟﱵ ﻟﻴﺲ ﳍﺎ ﻋﻼﻣﺔ ﲣﺰﻳﻦ ﻗﻴﻢ ﺳﺎﻟﺒﺔ‪ ،‬ﻭﳒﺪ ﺃﻥ ﻧﻄﺎﻕ ﻗﻴﻤﻬﺎ ﺍﳌﻮﺟﺒﺔ ﻳﺴﺎﻭﻯ ﺿـﻌﻒ‬
‫ﻣﺜﻴﻼ‪‬ﺎ ﺍﻟﱵ ﳍﺎ ﻋﻼﻣﺔ‪ ،‬ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﻫﺬﺍ‪-:‬‬
‫ﺍﻟﻨﻄﺎﻕ‬ ‫ﺍﳊﺠﻢ‬ ‫ﺍﺳﻢ ﺍﻟﻨﻮﻉ‬
‫‪ 0 1byte‬ﺇﱃ ‪255‬‬ ‫‪unsigned‬‬
‫‪char‬‬
‫‪ 0‬ﺇﱃ ‪65,535‬‬ ‫‪2byte‬‬ ‫‪unsigned‬‬
‫‪short‬‬
‫ﻣﺜﻞ‪ unsigned short‬ﰲ ﺃﻧﻈﻤﺔ ‪16bit‬‬ ‫‪unsigned int‬‬
‫ﻭﻣﺜﻞ ‪unsigned long‬ﰲ ﺃﻧﻈﻤﺔ ‪32bit‬‬
‫‪ 0 4byte‬ﺇﱃ ‪4,294.967.295‬‬ ‫‪unsigned‬‬
‫‪long‬‬

‫‪ /4‬ﺍﻷﺭﻗﺎﻡ ﺍﻟﻌﺎﺋﻤﺔ )‪:(Float‬‬

‫‪13‬‬
‫ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻷﺭﻗﺎﻡ ﺍﻟﻌﺎﺋﻤﺔ ﻟﺘﻤﺜﻴﻞ ﻗﻴﻢ ﳝﻜﻦ ﻗﻴﺎﺳـﻬﺎ ﻛـﺎﻷﻃﻮﺍﻝ ﺃﻭ ﺍﻷﻭﺯﺍﻥ‪.‬‬
‫ﻭﻳﺘﻢ ﲤﺜﻴﻞ ﺍﻷﺭﻗﺎﻡ ﺍﻟﻌﺎﺋﻤﺔ ﻋﺎﺩﺓ ﺑﺮﻗﻢ ﻛﺎﻣﻞ ﻋﻠﻰ ﺍﻟﻴﺴﺎﺭ ﻣﻊ ﻧﻘﻄﺔ ﻋﺸﺮﻳﺔ ﻭﻛﺴﺮ ﻋﻠﻰ ﺍﻟﻴﻤﲔ‪.‬‬
‫ﻫﻨﺎﻟﻚ ﺛﻼﺛﺔ ﺃﻧﻮﺍﻉ ﻣﻦ ﺍﻷﺭﻗﺎﻡ ﺍﻟﻌﺎﺋﻤﺔ ﰲ ﺃﻧﻈﻤﺔ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﺸﺎﺋﻌﺔ ﺍﻻﺳﺘﻌﻤﺎﻝ‪ .‬ﻭﺃﺷـﻬﺮ‬
‫ﻧﻮﻉ ﺃﺭﻗﺎﻡ ﻋﺎﺋﻤﺔ ﻫﻮ ﺍﻟﻨﻮﻉ ‪ double‬ﻭﺍﻟﺬﻱ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﳌﻌﻈـﻢ ﺩﺍﻻﺕ ‪ C++‬ﺍﻟﺮﻳﺎﺿـﻴﺔ‪.‬‬
‫ﻳﺘﻄﻠﺐ ﺍﻟﻨﻮﻉ ‪ float‬ﺫﺍﻛﺮﺓ ﺃﻗﻞ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ . double‬ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻫﺬﻩ ﺍﻷﻧـﻮﺍﻉ‬
‫ﻭﺍﳊﺠﻢ ﺍﻟﺬﻱ ﺗﺄﺧﺬﻩ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬
‫ﺍﳊﺠﻢ‬ ‫ﺍﺳﻢ ﺍﻟﻨﻮﻉ‬
‫‪4byte‬‬ ‫‪float‬‬
‫‪8byte‬‬ ‫‪double‬‬
‫‪10byte‬‬ ‫‪long double‬‬

‫ﺗﻌﺮﻳﻒ ﺍﳌﺘﻐﲑﺍﺕ‬ ‫‪1.4‬‬


‫ﻋﻨﺪ ﻛﺘﺎﺑﺔ ﺃﻱ ﺑﺮﻧﺎﻣﺞ ﺑﻠﻐﺔ ‪ ،C++‬ﳓﺘﺎﺝ ﻟﺘﺨﺰﻳﻦ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺍﻟﻮﺍﺭﺩﺓ ﻟﻠﱪﻧﺎﻣﺞ ﰲ‬
‫ﺫﺍﻛﺮﺓ ﺍﳊﺎﺳﻮﺏ ﲢﺖ ﻋﻨﺎﻭﻳﻦ ﻳﻄﻠﻖ ﻋﻠﻴﻬﺎ ﺃﲰﺎﺀ ﺍﳌﺘﻐﲑﺍﺕ‪ ،‬ﻭﲟﺎ ﺃﻥ ﺃﻧﻮﺍﻉ ﺍﳌﻌﻠﻮﻣـﺎﺕ ﺍﳌـﺮﺍﺩ‬
‫ﲣﺰﻳﻨﻬﺎ ﺗﻜﻮﻥ ﻋﺎﺩﺓ ﳐﺘﻠﻔﺔ ﻣﺜﻞ ﺍﻟﻘﻴﻢ ﺍﳊﻘﻴﻘﻴﺔ ﺃﻭ ﺍﻟﺼﺤﻴﺤﺔ ﺃﻭ ﺍﻟﺮﻣﺰﻳﺔ ﻓﺈﻧﻨﺎ ﳓﺘـﺎﺝ ﺃﻥ ﻧﻌﻠـﻢ‬
‫ﻼ ‪-:‬‬ ‫ﺍﳌﺘﺮﺟﻢ ﰲ ﺑﺪﺍﻳﺔ ﺍﻟﱪﻧﺎﻣﺞ ﻋﻦ ﺃﻧﻮﺍﻉ ﺍﳌﺘﻐﲑﺍﺕ ﺍﻟﱵ ﻧﺮﻳﺪ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻓﻤﺜ ﹰ‬
‫ﺍﻟﻜﻠﻤﺎﺕ ‪ sum ,integer2 , integer1‬ﻫﻲ ﺃﲰﺎﺀ ﳌﺘﻐﲑﺍﺕ ﻋﺒﺎﺭﺓ ﻋـﻦ‬
‫ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ)ﺍﻟﻨﻮﻉ ‪ ( int‬ﻭﻫﻮ ﺃﺣﺪ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺘﻮﻓﺮﺓ ﰲ ‪. C++‬‬
‫ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﺍﳌﺘﻐﲑﺍﺕ ﰲ ﺃﻱ ﻣﻜﺎﻥ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﻟﻜﻦ ﳚـﺐ ﺗﻌﺮﻳﻔﻬـﺎ ﻗﺒـﻞ‬
‫ﺍﺳﺘﻌﻤﺎﳍﺎ‪ ،‬ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﺍﳌﺘﻐﲑﺍﺕ ﺍﻟﱵ ﺗﻨﺘﻤﻲ ﺇﱃ ﻧﻔﺲ ﺍﻟﻨﻮﻉ ﰲ ﺳﻄﺮ ﻭﺍﺣﺪ‪.‬‬
‫ﺗﺴﻤﻴﺔ ﺍﳌﺘﻐﲑ‪:‬‬
‫ﻳﺘﻢ ﺗﻌﺮﻳﻒ ﺍﳌﺘﻐﲑ ﺑﺬﻛﺮ ﺍﻻﺳﻢ ﻭﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﳛﻤﻠﻬﺎ ﻫﺬﺍ ﺍﳌﺘﻐﲑ ﻣـﻦ‬
‫ﺃﻱ ﺳﻠﺴﻠﺔ ﲢﺘﻮﻯ ﻋﻠﻰ ﺃﺣﺮﻑ ‪ Letters‬ﺃﻭ ﺃﺭﻗﺎﻡ ‪ Digits‬ﺃﻭ ﺧﻄـﹰﺎ ﲢﺘﻴـﹰﺎ ‪Under‬‬
‫)_(‪ ،score‬ﻋﻠﻰ ﺃﻥ ﻻ ﻳﺒﺪﺃ ﺍﺳﻢ ﺍﳌﺘﻐﲑ ﺑﺮﻗﻢ‪ .‬ﻭﻣﻦ ﺍﳉﺪﻳﺮ ﺑﺎﻟﺬﻛﺮ ﺃﻥ ﻟﻐﺔ ‪ C++‬ﺗﻔﺮﻕ ﺑﲔ‬
‫ﻼ ﺍﻷﲰـﺎﺀ ‪ Integer1 , integer1‬ﺗﻌﺎﻣـﻞ‬ ‫ﺍﳊﺮﻭﻑ ﺍﻷﲜﺪﻳﺔ ﺍﻟﺼﻐﲑﺓ ﻭﺍﻟﻜﺒﲑﺓ‪ ،‬ﻓﻤـﺜ ﹰ‬
‫ﻛﻤﺘﻐﲑﺍﺕ ﳐﺘﻠﻔﺔ‪.‬‬
‫ﺍﻟﺪﺧﻞ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‪-:‬‬
‫‪cin>>integer1‬‬

‫‪14‬‬
‫ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ ﲣﺰﻥ ﺍﻟﺮﻗﻢ ﺍﻟﺬﻱ ﻳﻜﺘﺒﻪ ﺍﳌﺴﺘﺨﺪﻡ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﰲ ﻣﺘﻐﲑ ﻳﺪﻋﻲ‬
‫‪ .integer1‬ﳝﺜﻞ ﺍﻟﻜﺎﺋﻦ ‪- cin‬ﻭﺍﻟﺬﻱ ﻳﻠﻔﻆ ﻛـ ‪ -C in‬ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‪ ،‬ﻭﻳﺄﺧﺬ ﻋﺎﻣﻞ‬
‫ﺍﳊﺼﻮﻝ ‪ (>>) get from‬ﺍﻷﺷﻴﺎﺀ ﺍﳌﻮﺿﻮﻋﺔ ﻋﻠﻰ ﻳﺴﺎﺭﻩ ﻭﻳﻀﻌﻬﺎ ﰲ ﺍﳌﺘﻐﲑ ﺍﳌﻮﺟﻮﺩ ﻋﻠـﻰ‬
‫ﳝﻴﻨﻪ‪ ،‬ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ ﻳﻨﺘﻈﺮ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻥ ﻳﻜﺘﺐ ﺍﳌﺴﺘﺨﺪﻡ ﺭﻗﻤﹰﺎ ﻣﻦ ﺍﻟﻨـﻮﻉ ‪integer‬‬
‫ﻭﻳﻀﻐﻂ ﻋﻠﻰ ﻣﻔﺘﺎﺡ ‪ ، Enter‬ﻳﺘﻢ ﺗﻌﻴﲔ ﺍﻟﻘﻴﻤـﺔ ﺍﻟـﱵ ﺃﺩﺧﻠـﻬﺎ ﺍﳌﺴـﺘﺨﺪﻡ ﺇﱃ ﺍﳌـﺘﻐﲑ‬
‫‪. integer1‬‬
‫ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻋﺎﻣﻞ ﺍﳊﺼﻮﻝ ﻋﺪﺓ ﻣﺮﺍﺕ ﰲ ﻧﻔﺲ ﺍﻟﻌﺒﺎﺭﺓ‪:‬‬
‫‪cin >> integer1>>integer2‬‬
‫ﻳﻀﻐﻂ ﺍﳌﺴﺘﺨﺪﻡ ﻫﻨﺎ ‪ ،Enter‬ﺃﻭ ﻣﻔﺘﺎﺡ ﺍﳌﺴﺎﻓﺔ ‪ ،Space‬ﺃﻭ ﻣﻔﺘﺎﺡ ‪Tab‬‬
‫ﺑﻌﺪ ﻛﻞ ﻗﻴﻤﺔ‪ ،‬ﻗﺒﻞ ﺃﻥ ﻳﻜﺘﺐ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺘﺎﻟﻴﺔ‪ ،‬ﻭﻟﻜﻨﻪ ﻣﻦ ﺍﻷﻓﻀﻞ ﻋﺎﺩﺓ ﺇﺩﺧﺎﻝ ﻗﻴﻤﺔ ﻭﺍﺣـﺪﺓ ﰲ‬
‫ﻛﻞ ﻣﺮﺓ ﻟﺘﺠﻨﺐ ﺍﳋﻄﺄ‪.‬‬
‫ﺍﻟﺸﻜﻞ)‪ (1-2‬ﻳﻮﺿﺢ ﺍﻟﺪﺧﻞ ﺑﻮﺍﺳﻄﺔ ‪.cin‬‬

‫ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‬ ‫>>‬ ‫ﻣﺘﻐﲑ‬


‫‪cin‬‬

‫ﺷﻜﻞ )‪ (1-2‬ﻳﻮﺿﺢ ﺍﻟﺪﺧﻞ ﺑﻮﺍﺳﻄﺔ ‪C++‬‬

‫ﺍﳌﻨﺎﻭﺭ ‪-:endl‬‬
‫ﺍﻟﻌﺒﺎﺭﺓ‪:‬‬
‫‪cout<<''sum= ''<<sum<<endl‬‬
‫ﺗﻄﺒﻊ ﺍﻟﻨﺺ =‪ sum‬ﻣﺘﺒﻮﻋﹰﺎ ﺑﻘﻴﻤﺔ ‪ ، sum‬ﻧﻼﺣﻆ ﺃﻧﻨﺎ ﺍﺳﺘﺨﺪﻣﻨﺎ ‪ endl‬ﻭﻫـﻮ‬
‫ﻭﺳﻴﻠﺔ ﺃﺧﺮﻯ ﰲ‪ C++‬ﻟﻼﻧﺘﻘﺎﻝ ﺇﱃ ﺳﻄﺮ ﺟﺪﻳﺪ‪ ،‬ﻭﻳﺴﻤﻰ ﻣﻨـﺎﻭﺭ‪ manipulator‬ﻭ‪endl‬‬
‫ﺍﺧﺘﺼﺎﺭﹰﺍ ﻟـ ‪ ،end line‬ﻭﻫﻮ ﻳﻌﻤﻞ ﲤﺎﻣﹰﺎ ﻛﻤﺎ ﻳﻌﻤﻞ ﺗﺘﺎﺑﻊ ﺍﳍﺮﻭﺏ‪. \n‬‬

‫‪ .1‬ﺃﻛﺘﺐ ﻋﺒﺎﺭﺓ ‪ C++‬ﺻﺤﻴﺤﺔ ﺗﻘﻮﻡ ﺑﺎﻵﰐ‪:‬‬


‫ﺗﻌﺮﻳﻒ ﺍﳌﺘﻐﲑﺍﺕ ‪ z ، y، x‬ﻭ ‪ result‬ﻟﺘﻜﻮﻥ ﻣﻦ ﺍﻟﻨﻮﻉ ‪.int‬‬ ‫‬

‫ﺍﻟﻄﻠﺐ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ ﺛﻼﺛﺔ ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ‪.‬‬ ‫‬

‫‪ .2‬ﺣﺪﺩ ﻣﺎ ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻵﺗﻴﺔ ﺻﺤﻴﺤﺔ ﺃﻡ ﺧﻄﺄ‪:‬‬


‫ﳚﺐ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﳌﺘﻐﲑﺍﺕ ﻗﺒﻞ ﺍﺳﺘﻌﻤﺎﳍﺎ ﰲ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬ ‫‬

‫ﳚﺐ ﲢﺪﻳﺪ ﻧﻮﻉ ﺍﳌﺘﻐﲑﺍﺕ ﻋﻨﺪ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ‪.‬‬ ‫‬

‫ﺍﳌﺘﻐﲑﺍﺕ ‪ Number‬ﻭ ‪. number‬‬ ‫‪15‬‬ ‫ﻻ ﺗﻔﺮﻕ ‪ C++‬ﺑﲔ‬ ‫‬


‫) ‪( Math Operators‬‬ ‫ﺍﻟﻌﻮﺍﻣﻞ ﺍﳊﺴﺎﺑﻴﺔ‬ ‫‪1.5‬‬

‫ﻟﻘﺪ ﺍﺳﺘﻌﻤﻠﻨﺎ ﻋﺎﻣﻞ ﺍﳉﻤﻊ )‪ (+‬ﳉﻤﻊ ‪ integer1‬ﺇﱄ ‪ ،integer2‬ﺗﺘﻀﻤﻦ‬


‫‪ C++‬ﺍﻟﻌﻮﺍﻣﻞ ﺍﳊﺴﺎﺑﻴﺔ ﺍﻷﺭﺑﻌﺔ ﺍﻻﻋﺘﻴﺎﺩﻳﺔ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﻋﺎﻣﻞ ﺧﺎﻣﺲ ﻛﻤﺎ ﻣﺒﲔ ﰲ ﺍﳉـﺪﻭﻝ‬
‫ﺍﻟﺘﺎﱄ‪:‬‬

‫ﺍﻟﺘﻌﺒﲑ ﰲ ‪C++‬‬ ‫ﺍﻟﺘﻌﺒﲑ ﺍﳉﱪﻱ‬ ‫ﺍﻟﻮﻇﻴﻔﺔ‬ ‫ﺍﻟﻌﺎﻣﻞ‬


‫‪B+h‬‬ ‫‪B+h‬‬ ‫ﲨﻊ‬ ‫‪+‬‬
‫‪B-h‬‬ ‫‪B-h‬‬ ‫ﻃﺮﺡ‬ ‫‪-‬‬
‫‪B*h‬‬ ‫‪Bh‬‬ ‫ﺿﺮﺏ‬ ‫*‬
‫‪B/h‬‬ ‫‪B/h,‬‬ ‫ﻗﺴﻤﺔ‬ ‫‪/‬‬
‫‪B%h‬‬ ‫‪B mod h‬‬ ‫ﺍﻟﺒﺎﻗﻲ‬ ‫‪%‬‬

‫ﺍﻟﻌﻮﺍﻣﻞ ﺍﻷﺭﺑﻌﺔ ﺍﻷﻭﱃ ﺗﻨﺠﺰ ﺃﻋﻤﺎ ﹰﻻ ﻣﺄﻟﻮﻓﺔ ﻟﺪﻳﻨﺎ‪ ،‬ﺃﻣﺎ ﻋﺎﻣﻞ ﺍﻟﺒﺎﻗﻲ ‪ %‬ﺍﳌﺴـﻤﻰ‬
‫ﺃﻳﻀﹰﺎ ﺍﳌﻌﺎﻣﻞ ‪ ،modulus‬ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﳊﺴﺎﺏ ﺑﺎﻗﻲ ﺍﻟﻘﺴﻤﺔ ﻟﻌﺪﺩ ﺻﺤﻴﺢ ﻋﻠﻰ ﻋﺪﺩ ﺁﺧﺮ‪،‬‬
‫ﻟﺬﻟﻚ ﻓﺎﻟﺘﻌﺒﲑ ‪ 20%3‬ﻳﺴﺎﻭﻯ ‪ . 2‬ﺗﺴﻤﻰ ﻫﺬﻩ ﺍﻟﻌﻮﺍﻣﻞ ﺍﳊﺴﺎﺑﻴﺔ ﺑﺎﻟﻌﻮﺍﻣﻞ ﺍﻟﺜﻨﺎﺋﻴـﺔ ﻷ‪‬ـﺎ‬
‫ﺗﻌﻤﻞ ﻋﻠﻰ ﻗﻴﻤﺘﲔ‪.‬‬
‫ﻼ ﺍﻟﺘﻌﺒﲑ‪:‬‬
‫ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﻝ ﺃﻛﺜﺮ ﻣﻦ ﻋﺎﻣﻞ ﰲ ﺗﻌﺒﲑ ﺭﻳﺎﺿﻲ ﻭﺍﺣﺪ‪ ،‬ﻓﻤﺜ ﹰ‬
‫;‪C=(f-32)*5/9‬‬
‫ﳛﻮﻝ ﺩﺭﺟﺔ ﺍﳊﺮﺍﺭﺓ ﻣﻦ ﻣﺌﻮﻳﺔ ﺇﱃ ﻓﻬﺮ‪‬ﺎﻳﺖ‪ ).‬ﺍﺳﺘﻌﻤﻠﺖ ﺍﻷﻗﻮﺍﺱ ﻟﻜﻲ ﻳﺘﻢ ﺗﻨﻔﻴﺬ‬
‫ﺍﻟﻄﺮﺡ ﺃﻭ ﹰﻻ ﺑﺎﻟﺮﻏﻢ ﻣﻦ ﺃﻭﻟﻮﻳﺘﻪ ﺍﳌﺘﺪﻧﻴﺔ‪ ،‬ﻳﺸﲑ ﺍﳌﺼﻄﻠﺢ ﺃﻭﻟﻮﻳﺔ ‪ Precedence‬ﺇﱃ ﺗﺮﺗﻴـﺐ‬
‫ﺗﻨﻔﻴﺬ ﺍﻟﻌﻮﺍﻣﻞ‪ ،‬ﺍﻟﻌﺎﻣﻼﻥ * ﻭ ‪ /‬ﳍﻤﺎ ﺃﻭﻟﻮﻳﺔ ﺃﻋﻠﻰ ﻣﻦ ‪+‬ﻭ‪.( -‬ﻭﻫﺬﺍ ﻣﺎ ﺳﻨﺮﺍﻩ ﻻﺣﻘـﹰﺎ ﺑﻌـﺪ ﺃﻥ‬
‫ﻧﺘﻌﺮﻑ ﻋﻠﻰ ﺑﻘﻴﺔ ﻋﻮﺍﻣﻞ ‪. C++‬‬

‫)‪(Relational Operators‬‬ ‫‪ 1.6‬ﺍﻟﻌﻮﺍﻣﻞ ﺍﻟﻌﻼﺋﻘﻴﺔ‬

‫‪16‬‬
‫ﺗﻘﺎﺭﻥ ﺍﻟﻌﻮﺍﻣﻞ ﺍﻟﻌﻼﺋﻘﻴﺔ ﻗﻴﻤﺘﲔ‪ ،‬ﻭﺗﺆﺩﻯ ﺇﱃ ﻧﺘﻴﺠﺔ ﺻﺤﻴﺢ‪/‬ﺧﻄﺄ ﻭﻓﻘـﹰﺎ ﳌـﺎ ﺇﺫﺍ‬
‫ﻛﺎﻧﺖ ﺍﳌﻘﺎﺭﻧﺔ ﺻﺤﻴﺢ‪/‬ﺧﻄﺄ‪ .‬ﻫﻨﺎﻟﻚ ﺳﺘﺔ ﻋﻮﺍﻣﻞ ﻋﻼﺋﻘﻴﺔ ﻣﺒﻴﻨﺔ ﰲ ﺍﳉﺪﻭﻝ ﺃﺩﻧﺎﻩ‪:‬‬
‫ﻣﺜﺎﻝ‬ ‫ﺍﳌﻌﲎ‬ ‫ﺍﻟﺮﻣﺰ‬
‫‪a==b‬‬ ‫ﻳﺴﺎﻭﻯ‬ ‫==‬
‫‪a!=b‬‬ ‫ﻻ ﻳﺴﺎﻭﻯ‬ ‫=!‬
‫‪a>b‬‬ ‫ﺃﻛﱪ ﻣﻦ‬ ‫>‬
‫‪a<b‬‬ ‫ﺃﺻﻐﺮ ﻣﻦ‬ ‫<‬
‫‪a>=b‬‬ ‫ﺃﻛﱪ ﻣﻦ ﺃﻭ ﻳﺴﺎﻭﻯ‬ ‫=>‬
‫‪a<=b‬‬ ‫ﺃﺻﻐﺮ ﻣﻦ ﺃﻭ ﻳﺴﺎﻭﻯ‬ ‫=<‬

‫ﺗﻜﻮﻥ ﺍﻟﺘﻌﺎﺑﲑ ﺍﳌﺒﻴﻨﺔ ﰲ ﻋﻤﻮﺩ ﺍﳌﺜﺎﻝ ﺻﺤﻴﺤﺔ ﺃﻭ ﺧﻄﺄ ﻭﻓﻘﺎ ﻟﻘﻴﻢ ﺍﳌـﺘﻐﲑﻳﻦ ‪ a‬ﻭ‬
‫‪.b‬‬
‫ﻼ ﺃﻥ‪:‬‬
‫ﻓﻠﻨﻔﺮﺽ ﻣﺜ ﹰ‬
‫‪ a‬ﻳﺴﺎﻭﻯ ‪9‬‬ ‫‬

‫ ﻭ‪ b‬ﻳﺴﺎﻭﻯ ‪.10‬‬
‫ﺍﻟﺘﻌﺒﲑ ‪ a==b‬ﺧﻄﺄ‪.‬‬
‫ﺍﻟﺘﻌﺒﲑ ‪ a!=b‬ﺻﺤﻴﺢ ﻭﻛﺬﻟﻚ ﺍﻟﺘﻌﺒﲑﻳﻦ ‪ a<b‬ﻭ ‪، a<=b‬‬
‫ﻭﺍﻟﺘﻌﺒﲑﻳﻦ ‪ a>b‬ﻭ ‪ a>=b‬ﺧﻄﺄ‪..‬‬

‫‪17‬‬
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﺗﺒﺪﺃ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﰲ ‪ C++‬ﻭﺍﻟﱵ ﺗﺘﻜﻮﻥ ﻣﻦ ﺳﻄﺮ ﻭﺍﺣﺪ ﺑﺸﺮﻃﺔ ﻣﺰﺩﻭﺟﺔ )‪.(//‬‬


‫♦ ﺗﺒﺪﺃ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﰲ ‪ C++‬ﻭﺍﻟﱵ ﲤﺘﺪ ﻟﻌﺪﺓ ﺃﺳﻄﺮ ﺑﺎﻟﺮﻣﺰ *‪ /‬ﻭﺗﻨﺘﻬﻲ ﺑﺎﻟﺮﻣﺰ ‪.*/‬‬
‫♦ ﺍﻟﺴﻄﺮ >‪ #include<iostream.h‬ﻳﺴﻤﻰ "ﻣﺮﺷﺪ ﺍﳌﻬﻴﺊ" ﻭﻫﻮ ﻋﺒﺎﺭﺓ ﻋﻦ ﺗﻌﻠﻴﻤﺔ‬
‫ﻟﻠﻤﺼﺮﻑ ﺃﻥ ﻳﻀﻤﻦ ﺍﳌﻠﻒ ‪ iostream.h‬ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﻭﺍﻟﺬﻱ ﳚـﺐ ﺗﻀـﻤﻴﻨﻪ ﰲ ﺃﻱ‬
‫ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺎﺕ ﺇﺩﺧﺎﻝ ﻭﺇﺧﺮﺍﺝ‪.‬‬
‫♦ ﻳﺒﺪﺃ ﺗﻨﻔﻴﺬ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﻣﻦ ﺍﻟﺪﺍﻟﺔ )(‪.main‬‬
‫♦ ﺍﳌﺘﻐﲑﺍﺕ ﰲ ‪ C++‬ﳚﺐ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ ﻗﺒﻞ ﺍﺳﺘﻌﻤﺎﳍﺎ‪.‬‬
‫♦ ﻳﺘﻢ ﺗﻌﺮﻳﻒ ﺍﳌﺘﻐﲑﺍﺕ ﰲ ‪ C++‬ﺑﺬﻛﺮ ﺍﲰﻬﺎ ﻭﻧﻮﻉ ﺑﻴﺎﻧﺎ‪‬ﺎ ﻭﺗﻜﻮﻥ ﺍﻻﺳﻢ ﻣﻦ ﺃﻱ ﺳﻠﺴﻠﺔ‬
‫ﲢﺘﻮﻯ ﻋﻠﻰ ﺃﺣﺮﻑ ﺃﻭ ﺃﺭﻗﺎﻡ ﺃﻭ ﺧﻄﹰﺎ ﲢﺘﻴﹰﺎ ) _ ( ﻋﻠﻰ ﺃﻥ ﻻ ﻳﺒﺪﺃ ﺍﺳﻢ ﺍﳌﺘﻐﲑ ﺑﺮﻗﻢ‪.‬‬
‫♦ ‪ C++‬ﺣﺴﺎﺳﺔ ﲡﺎﻩ ﺍﻷﺣﺮﻑ ﻭﻧﻌﲎ ﺑﺬﻟﻚ ﺃ‪‬ﺎ ﺗﻔﺮﻕ ﺑﲔ ﺍﳊﺮﻭﻑ ﺍﻷﲜﺪﻳـﺔ ﺍﻟﺼـﻐﲑﺓ‬
‫)‪ (small‬ﻭﺍﻟﻜﺒﲑﺓ )‪.(capital‬‬
‫♦ ﻳﺮﺗﺒﻂ ﻛﺎﺋﻦ ﺍﳋﺮﺝ ‪ cout‬ﻣﻊ ﺍﻟﺸﺎﺷﺔ ﻭﻫﻮ ﻳﺴﺘﺨﺪﻡ ﰲ ﺇﺧﺮﺍﺝ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬

‫‪18‬‬
‫ﺍﻷﺳﺌﻠﺔ‬
‫‪-1‬ﺃﻛﺘﺐ ﻋﺒﺎﺭﺓ ‪ C++‬ﺻﺤﻴﺤﺔ ﺗﻘﻮﻡ ﺑﺎﻵﰐ‪:‬‬
‫ﺗﻮﺿﻴﺢ ﺃﻥ ﺑﺮﻧﺎﳎﹰﺎ ﻣﺎ ﺳﻴﻘﻮﻡ ﲝﺴﺎﺏ ﺣﺎﺻﻞ ﺿﺮﺏ ﺛﻼﺛﺔ ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ‪.‬‬ ‫‬

‫ ﺍﻟﻄﻠﺐ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ ﺛﻼﺛﺔ ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ‪.‬‬


‫ ﺇﺩﺧﺎﻝ ﺛﻼﺛﺔ ﺃﺭﻗﺎﻡ ﻋﻦ ﻃﺮﻳﻖ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﻭﲣﺰﻳﻦ ﻗﻴﻤﻬﺎ ﰲ ﺍﳌﺘﻐﲑﺍﺕ ‪y ،x‬‬
‫ﻭ ‪.z‬‬
‫ ﺣﺴﺎﺏ ﺣﺎﺻﻞ ﺿﺮﺏ ﺍﻷﺭﻗﺎﻡ ﺍﳌﺨﺰﻧﺔ ﰲ ﺍﳌﺘﻐﲑﺍﺕ ‪ y ،x‬ﻭ ‪ z‬ﻭﺗﻌﻴﲔ ﺍﻟﻨﺘﻴﺠﺔ‬
‫ﻟﻠﻤﺘﻐﲑ ‪.result‬‬
‫ ﻃﺒﺎﻋﺔ ﺍﻟﻌﺒﺎﺭﺓ " ‪ “ The product is:‬ﻣﺘﺒﻮﻋﺔ ﺑﻘﻴﻤﺔ ﺍﳌﺘﻐﲑ ‪.result‬‬
‫ ﺇﺭﺟﺎﻉ ﻗﻴﻤﺔ ﻣﻦ ﺍﻟﺪﺍﻟﺔ ‪ main‬ﻟﺘﻮﺿﻴﺢ ﺃﻥ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻧﺘﻬﻰ ﺑﻨﺠﺎﺡ‪.‬‬

‫‪ -2‬ﺇﺳﺘﻌﻤﻞ ﺍﻟﻌﺒﺎﺭﺍﺕ ﰲ ﺍﻟﺴﺆﺍﻝ ﺍﻟﺴﺎﺑﻖ ﻟﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﺑﻠﻐﺔ ‪ C++‬ﻛﺎﻣﻞ ﻳﻘﻮﻡ ﲝﺴـﺎﺏ‬
‫ﺣﺎﺻﻞ ﺿﺮﺏ ﺛﻼﺛﺔ ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ‪.‬‬

‫‪ -3‬ﺣﺪﺩ ﻣﺎ ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻵﺗﻴﺔ ﺻﺤﻴﺤﺔ ﺃﻡ ﺧﻄﺄ‪:‬‬


‫ﺃ‪ .‬ﲤﺘﻠﻚ ﺍﻟﻌﻮﺍﻣﻞ ﺍﳊﺴﺎﺑﻴﺔ ‪ - ، +‬ﻭ ‪ %‬ﻧﻔﺲ ﺩﺭﺟﺔ ﺍﻷﻭﻟﻮﻳﺔ‪.‬‬
‫ﺏ‪ .‬ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﻭﺍﻟﺬﻱ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺛﻼﺙ ﺃﺳﻄﺮ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﳚﺐ ﺃﻥ ﳛﺘﻮﻯ‬
‫ﻋﻠﻰ ﺛﻼﺙ ﻋﺒﺎﺭﺍﺕ ﺗﺴﺘﻌﻤﻞ ‪.cout‬‬

‫‪-4‬ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﺴﺘﻘﺒﻞ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﻋﺪﺩﹰﺍ ﻣﻜﻮﻧﹰﺎ ﻣﻦ ﲬﺴﺔ ﺃﺭﻗﺎﻡ ﰒ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻷﺭﻗﺎﻡ‬
‫ﻼ ﺇﺫﺍ ﺃﺩﺧﻞ ﺍﳌﺴﺘﺨﺪﻡ ﺍﻟﻌﺪﺩ ‪ 13456‬ﻳﻜﻮﻥ ﺍﳋـﺮﺝ ﻣـﻦ‬
‫ﺍﳌﻜﻮﻧﺔ ﻟﻠﻌﺪﺩ ﺗﻔﺼﻠﻬﺎ ﻣﺴﺎﻓﺔ ﻓﻤﺜ ﹰ‬
‫ﺍﻟﱪﻧﺎﻣﺞ‬
‫‪1‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬

‫‪ -5‬ﻣﺎ ﻫﻮ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺬﻱ ﺳﺘﺴﺘﻌﻤﻠﻪ ﻋﻠﻰ ﺍﻷﺭﺟﺢ ﻟﺘﻤﺜﻴﻞ ﺭﻗﻢ ﻣﻮﻇﻒ ﺗﺴﻠﺴﻠﻲ ﻣـﻦ‬
‫‪ 4‬ﺃﻋﺪﺍﺩ‪.‬‬

‫‪19‬‬
‫‪ -6‬ﺃﻱ ﻣﻦ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻵﺗﻴﺔ ﺗﻌﻄﻲ ﺍﳌﺨﺮﺟﺎﺕ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫‪1‬‬ ‫‪2‬‬
‫‪2‬‬ ‫‪4‬‬
‫‪1-‬‬ ‫;”‪cout << “ 1\t2\t\n3\t4\n‬‬
‫‪2-‬‬ ‫;’‪cout <<’1’ << ‘\t’ << ‘2’ << ‘\n’ <<’3’ <<’\t’ <<’4’ <<’\n‬‬
‫‪3-‬‬ ‫;”‪cout << “1 \n 2\t 3\n 4\t‬‬
‫‪4-‬‬ ‫;’‪cout <<1 << ‘\t’ << 2 << ‘\n’ <<3 <<’\t’ <<4 <<’\n‬‬

‫‪ -7‬ﺃﻛﺘﺐ ﺟﺰﺀ ﻣﻦ ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﲟﺎ ﻳﻠﻲ‪:‬‬


‫ﻳﻨﺸﺊ ﻣﺘﻐﲑﻳﻦ ‪ num‬ﻭ ‪ denom‬ﳝﺜﻼﻥ ﺍﻟﺒﺴﻂ ﻭﺍﳌﻘﺎﻡ ﰲ ﻛﺴﺮ‪.‬‬ ‫‬

‫ﻳﻄﻠﺐ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺗﺰﻭﻳﺪ ﻗﻴﻢ ﺍﻟﺒﺴﻂ ﻭﺍﳌﻘﺎﻡ‪.‬‬ ‫‬

‫ﻳﻀﻊ ﻫﺬﻩ ﺍﻟﻘﻴﻢ ﰲ ﻣﺘﻐﲑﺍﺕ‪.‬‬ ‫‬

‫ﺗﻌﺮﺽ ﺍﻟﻜﺴﺮ ﻣﻊ ﺷﺮﻃﺔ )‪ (/‬ﺑﲔ ﺍﻟﺮﻗﻤﲔ‪.‬‬ ‫‬

‫ﻗﺪ ﻳﺒﺪﻭ ﺍﳋﺮﺝ ﻛﺎﻵﰐ‪:‬‬


‫‪Enter the numerator: 2‬‬
‫‪Enter the denominator: 3‬‬
‫‪Fraction = 2/3‬‬

‫‪20‬‬
‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﺜﺎﻧﻴﺔ‬
‫‪22.0‬‬
‫)‪Control Structures(I) - (I‬‬ ‫ﺑﻨﻴﺎﺕ ﺍﻟﺘﺤﻜﻢ‬

‫ ه  اة ‪:‬‬


‫♦   ا ل 
ار ‪.if‬‬
‫♦   ا ل 
ار ‪.if… else‬‬
‫♦   ا ل 
ار ‪.switch‬‬

‫‪21‬‬
‫ﻣﻘﺪﻣﺔ‬ 2.1

)‫ "!
 ا رات   وروده (' ا ﻥ‬#‫&دة ی‬
‫ "" " ض‬.( Sequential Execution) ' ‫ ه ا ﺏ"!
 اﺏ‬,‫وی‬
/
‫ن ا‬1  23 ‫  رة أ ى‬6"‫  ا"!
ی‬7 '‫ وا‬C++ ‫ &رات‬. 
.Transfer of control #9‫ ا‬6"‫ ه ا ﺏ‬,‫ وی‬،)‫('  ا ﻥ‬
‫ و"! د‬/
< =‫ ا‬#9‫ ﺏ"
ت ا‬:
3 ,‫ إ‬C++ '( #9‫ ﺏ"
ت ا‬#6"
'‫ وا‬/‫ ا اری‬#9‫ ﺏ"
ت ا‬1‫ﻥ' وه‬A‫ع ا‬1"‫ وا‬.>9
?1 ‫ة‬21‫ه @ ا‬
.>"& C‫ی‬29 /
‫ة ا‬21‫"! د ا‬

‫ﺑﻨﻴﺎﺕ ﺍﻟﺘﺤﻜﻢ ﺍﻟﺸﺮﻃﻴﺔ‬


2.2
if ‫ﺍﻟﻌﺒـﺎﺭﺓ‬ 2.2.1
. if ‫ ا رة‬/F‫ا‬1‫ ه' ﺏ‬C++ '( ‫ ار‬3 ‫ذ‬E  /6‫أ> < ی‬
-:‫ل‬A
//Program 2-1:
#include <iostream.h>
main ( )
{
int num1 , num2;
cout << " Enter two integers, and I will tell you\n"
<<" the relation ships they satisfy: ";
cin >> num1>> num2;
if (num1== num2)
cout << num1 << " is equal to " << num2 << endl;
if (num1!= num2)
cout << num1 << " is not equal to " << num2 << endl;
if (num1< num2)
cout << num1 << " is less than " << num2 << endl;
if (num1> num2)
cout << num1 << " is greater than " << num2 << endl;

22
if (num1<= num2)
cout << num1 << " is less than or equal to " << num2
<< endl;
if (num1>= num2)
cout << num1 << " is greater than or equal to " << num2
<< endl;
return 0;
}

، num1 =3 ‫م‬3‫ر‬I‫ أد ا‬23 ‫م‬2E‫ ج  ا ﻥ) ﺏ( اض أن ا‬E‫ا‬


.num2= 7

Enter two integers , and I will tell you


The relation ships they satisfy: 3 7
3 is not equal to 7
3 is less than 7
3 is less than or equal to 7


‫ ی
> 
 ار ﺏ‬،if /
I‫ ا‬/‫  ا‬if ‫ ا رة‬KL
‫ة‬2&  ‫ أو‬،‫ة‬2‫ إ  &رة وا‬O‫ ار ا ي ی' ذ‬6‫ ا‬#‫ ﺝ‬KL‫ وی‬،
13
{ } ‫ ة‬P ‫اس‬13‫> أ‬F
9 ‫&رات‬
.if ‫ & ا رة‬/6‫( ی
 < ی‬2-1)=‫ا‬

‫ﺧﻄﺄ‬
‫ﺗﻌﺒﲑ ﺇﺧﺘﺒﺎﺭ‬

‫ﺻﺤﻴﺢ‬

if ‫ﺟﺴﻢ‬

‫ﺎﺀ‬‫ﺇ‬

if ‫( ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ‬2-1) ‫ﺷﻜﻞ‬

23
if…else ‫ﺍﻟﻌﺒـﺎﺭﺓ‬ 2.2.2
 ،ً9
9P ‫ إذا آن ا= ط‬U‫ث ﺵ‬29‫ ی‬/F
‫ ا‬if ‫(' ا رة‬
‫وث‬2 2‫  "! ض أﻥ" ﻥ ی‬.‫ ا<[ق‬,& U‫ث ﺵ‬29‫  ی‬O ‫ ی آ‬# ‫إذا‬
O‫
\ ذ‬69 ،O ‫ ی آ‬# ‫ ً و] إذا‬9
9P ‫
 إذا آن ا= ط‬9‫ (' ا‬U‫ﺵ‬
if... else ‫م ا رة‬2E‫ﻥ‬
-:‫ل‬A
//Program 2-2:
#include <iostream.h>
main ( )
{
int grade ;
cout << " Enter the grade";
cin >>grade;
if(grade>= 50)
cout<<"pass" <<endl;
else
cout <<"fail"<<endl;
return 0;
}

grade = 90 ‫ أد‬23 ‫م‬2E‫ ج  ا ﻥ) ﺏ( اض أن ا‬E‫ا‬

Enter the grade 90


Pass

‫ة &رات‬2&  else ‫ أو‬if #‫ ﺝ‬KL‫أی^ ً ه" ی أن ی‬


.if…else ‫ & ا رة‬/6‫( ی
 < ی‬2-2)=‫ ا‬.‫ ة‬P ‫اس‬13‫> أ‬F
9
,‫ام  ی‬2E‫ ﺏ‬O‫ل اﺏ\ وذ‬A‫ أ ى  
 & ا‬/6‫ < ی‬O"‫ه‬
:‫ﺏ  ا= وط‬
cout<<(grade>= 50 ? ''pass'' :''fail'') << endl;
,&  ‫ ا ي ی‬C++ '( 2
1‫ ا  ا‬1‫ا  ا= وط ه‬
. 
F6‫ ا!>م وﻥ‬/[& ‫  ر_ی‬KL‫ وی‬#
3 /‫ﺙ[ﺙ‬

24
‫ ی‪
 ' L‬ار‪ ،‬ﺙ‪ /[& #‬ا!>م‪ ،‬ﺙ‪
3 #‬ن !‪>a‬‬ ‫أو ً‬
‫ﻥ‪F6‬ن‪ .‬إذا آن 
ار ‪ ً 9
9P‬ی") ا 
 ﺏ‪L‬آ‪ b‬ا‪ /
6‬ا‪1‬ﺝ‪1‬دة‬
‫‪ 3‬ا"‪ 
F6‬وإذا آن 
 ار ‪ LF‬ی") ا 
 ﺏ‪L‬آ‪ b‬ا‪ /
6‬ا'‬
‫ ' ا"‪.
F6‬‬
‫ا‪A‬ل ا' ی‪ 9‬ا‪ /
6‬ا‪ (Absolute value) /6F‬وه'‬
‫ وي  ا ‪2‬د إذا آن ا ‪2‬د أ‪  3‬ا‪ !a‬و وي ‪1‬ﺝ ا ‪2‬د إذا‬
‫آن ا ‪2‬د أآ  ا‪. !a‬‬
‫;‪Abs_value =(n<0) ? -n:n‬‬
‫ا"
‪ /7‬ه' ‪ -n‬إذا آن ‪ n‬أ‪ 0  3‬و ‪ '( n‬ا‪ /9‬ا‪ I‬ى‪.‬‬

‫ﺧﻄﺄ‬
‫ﺗﻌﺒﲑ ﺍﺧﺘﺒﺎﺭ‬

‫ﺻﺤﻴﺢ‬
‫ﺟﺴﻢ ‪else‬‬

‫ﺟﺴﻢ ‪if‬‬

‫ﺇ‪‬ﺎﺀ‬

‫ﺷﻜﻞ )‪ (2-2‬ﻃﺮﻳﻘﺔ ﻋﻤﻞ ‪if…else‬‬

‫ﻣﺎ ﻫﻮ ﺍﳋﻄﺄ ﰲ ﺍﻵﰐ ؟‬


‫)‪if (gender==1‬‬
‫;‪cout<<women <<endl‬‬
‫‪else‬‬
‫;‪cout <<man<<endl‬‬

‫‪25‬‬
-:/‫ا‬2‫ ا‬if ... else ‫ا رات‬
، . ‫ ? ﺏ ^> ا‬if ......else ‫ ا رات‬c?‫ی و‬
:O‫ ذ‬d?1‫ا ﻥ) ا' ی‬
//Program 2-3:
#include <iostream.h>
main ( )
{
int grade;
cout <<"Enter the grade:" ;
cin >> grade;
if(grade>= 75)
cout<<'A'<< endl;
else
if(grade>= 65)
cout<<'B'<< endl;
else
if(grade>= 55)
cout<<'C'<< endl;
else
if(grade>= 40)
cout<<'D'<< endl;
else
cout<<"fail"<<endl;
return 0;
}

، if #7‫ (' ا‬e


‫ و‬else #7‫ (' ا‬/‫ا‬2‫ ">' ا رات ا‬
>^ ‫ ? ﺏ‬if ……else ‫ ا رات‬c^‫ ﻥ‬2"& /= ‫ث‬29 ‫ی أن‬
infant /‫ أن  ض ا‬/
‫[ ا! وض  ا رات ا‬
ً A( .. ‫ا‬
-:2 ‫ أو یوى‬3‫ أ‬fE=‫ن & ا‬1‫ ی‬2"&
if (age >2)
if (age<18)
cout <<"\n child”;
else

26
cout <<"\n infant";

 ‫ آ آن ا‬infant /‫> ا‬g ، ‫ث‬29‫و ه"  ی‬


'‫ وا‬b
‫ إ‬if ‫ ب &رة‬3‫ أ‬c‫ ی‬else ‫_ء‬7‫ن ا‬I O‫ وذ‬18 ‫أآ أو یوى‬
if ‫  رة‬c‫ ﺏ‬else ‫ ﺝ_ء‬2‫  ا إذا آ" ﻥ ی‬.>‫ ص ﺏ‬else ‫ > ﺝ_ء‬e

‫اس‬13L‫دة ﺏ
"> ﺏ‬1‫ﺝ‬1‫ ا‬if ‫ ا رة‬a "
& ‫ ﺵ ة‬b3 ‫دة‬1‫ﺝ‬1
k
. ‫ ة‬P
if (age >2)
{
if (age<18)
cout <<"\n child”;
} else
cout <<"\n infant";

27
switch ‫ﺍﻟﻌﺒـﺎﺭﺓ‬ 2.2.3
-:'‫ ا= ا م ا‬C++ '( switch /‫ ﺝ‬L
Switch (Variable name)
{
case constant1 : statement1; break;
case constant2 : statement2; break;
.
.
case constant n : statement n; break;
default : last statement;
}
#‫ ی
> ا‬switch /
I‫ ا‬/‫  ا‬switch ‫ ا رة‬KL
switch ‫ ا رة‬f9! ، ‫ ة‬P ‫اس‬13‫ ﺝ> ﺏ
 أ‬#‫ ﺙ‬،
13 

ﺏ‬l
.
l‫ ا‬O‫ ذ‬#
6 ً 6(‫ و‬/!E ‫م‬3‫ أ‬19‫ ا ﻥ) ﻥ‬b‫ﺝ‬1 ‫
و‬l‫ا‬
>
 ‫م وه' أء‬11‫دًا  ا‬2& switch ‫ ا رة‬#‫ی^ ﺝ‬
.
F6‫ ﻥ‬#‫ ﺙ‬m‫ ﺙﺏ‬#‫ ﺙ‬case /
I‫ ا‬/‫م  ا‬11‫ ه @ ا‬KL .‫ن‬F6‫ﻥ‬
‫ر‬1‫ ا آ‬m‫ﺏ‬A /‫ وی‬switch ‫
ا رة‬l /
3 ‫ن‬1 2"&
‫دى‬n ‫ و‬#1‫ ا‬O‫ ا رات ا' ' ذ‬,‫ ا"!
إ‬6"‫ ی‬case ‫م‬1‫ و‬2‫(' أ‬
/
3 \‫ﺏ‬F # ‫ وإذا‬،switch ‫ ا رة‬/
6‫ "!
 ﺏ‬c" ,‫ إ‬break ‫ا رة‬
'?‫ ا( ا‬#1‫ ا‬,‫ ا"!
 إ‬6"‫ ی‬#‫ أي و‬c switch ‫
 ا رة‬l
. default
(vowels / ‫د  وف ا‬2& ‫ب‬9 )‫ ﺏ ﻥ‬/‫م ﺏﺏ‬16"
‫م‬16‫ ی‬. d
!‫ ا‬/1  2 f‫( (' ﻥ‬a, e, i, u, o) '‫ وه‬letters)
,‫ إ‬1 /(?‫ إ‬# a ‫ ف‬9‫ذا آن ا‬p( 2‫ ف ا‬9‫ ا‬f9!‫ا ﻥ) ﺏ‬
#( e 2‫ ف ا‬9‫ أ إذا آن ا‬. 0 2"& @2
> # ‫ وا  ي‬acounter
‫ ف‬9‫ ی ا‬# ‫ إذا‬، o ‫ و‬i ‫ و‬u ‫ ـ‬/"‫ وه ا ﺏ‬ecounter ,‫ إ‬1 /(?‫إ‬
‫ ـ‬1 /(?p‫م ﺏ‬16‫ ا( ا?' وا  ي ی‬#1‫ "!
 ا‬#‫ ی‬/& ‫  ف‬2‫ا‬
.OtherLettersCounter

.switch ‫ & ا رة‬/6‫ < ی‬d


?1‫م ﺏ‬16‫( ی‬2-3) =‫ا‬

28
‫ﺻﺤﻴﺢ‬
‫ﻣﺘﻐﲑ ‪ switch‬ﻳﺴﺎﻭﻯ‬
‫ﺟﺴﻢ ﺍﻟﻮﺳﻢ ﺍﻷﻭﻝ‬
‫ﺛﺎﺑﺖ ﺍﻟﻮﺳﻢ ﺍﻷﻭﻝ‬

‫ﺧﻄﺄ‬

‫ﻣﺘﻐﲑ ‪ switch‬ﻳﺴﺎﻭﻯ‬ ‫ﺻﺤﻴﺢ‬


‫ﺟﺴﻢ ﺍﻟﻮﺳﻢ ﺍﻟﺜﺎﱏ‬
‫ﺛﺎﺑﺖ ﺍﻟﻮﺳﻢ ﺍﻟﺜﺎﱏ‬

‫ﺧ‬

‫ﻣﺘﻐﲑ ‪ switch‬ﻳﺴﺎﻭﻯ‬
‫ﺛﺎﺑﺖ ﺍﻟﻮﺳﻢ ﺍﻟﺜﺎﻟﺚ‬ ‫ﺻ‬ ‫ﺟﺴﻢ ﺍﻟﻮﺳﻢ ﺍﻟﺜﺎﻟﺚ‬

‫ﺧ‬ ‫ﺍﳉﺴﻢ ﺍﻻﻓﺘﺮﺍﺿﻲ‬

‫ﺇ‪‬ﺎﺀ‬

‫ﺷﻜﻞ )‪ – (2-3‬ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ ‪switch‬‬

‫‪29‬‬
//Program 2-4:
#include <iostream.h>
enum vowels{a='a',u='u',i='i',o='o',e='e'};
main( )
{
char ch ;
int acounter=0,ecounter=0,icounter=0;
int ucounter=0,ocounter=0,otherletterscounter=0;
while(cin>>ch)
switch(ch) {
case a:
++acounter;
break;
case e:
++ecounter;
break;
case i :
++icounter;
break;
case o:
++ocounter;
break;
case u:
++ucounter;
break;
default:
++ otherletterscounter;
};
cout<<endl;
cout<<endl;
cout<<endl;
cout <<"acounter: \t"<<acounter<<" \n";
cout<< "ecounter: \t"<<ecounter<<" \n";

30
cout<< "icounter: \t"<<icounter<<" \n";
cout<< "ocounter: \t"<<ocounter<<" \n";
cout<< "ucounter: \t"<<ucounter<<" \n";
cout<<"otherletterscounter: \t"<<otherletterscounter
<<" \n";
return 0;
}

2‫ ا‬f"‫ ج  ا ﻥ) ﺏ( اض أن ا‬E‫ا‬


"youareverypunctional"
acounter: 2
ecounter: 2
icounter: 1
ocounter: 2
ucounter: 2
OtherLettersCounter: 11

31
:‫ﺍﳌﻠﺨﺺ‬

:'‫ ا= ا م ا‬if ‫ ا رة‬L ♦


if (Condition)
statement;
:'‫ ا= ا‬Statement L ‫  &رة‬A‫ن  أآ‬1‫ ی‬if #‫إذا آن ﺝ‬
{ Statement 1;
Statement 2;
.
.
Statement n}
‫ة &رات إذا‬2& ‫ "!
&رة أو‬C++ /l '( if ‫♦   ا رة‬
. ً 9
9P >
‫آن ا= ط ا ي ی‬
:'‫ ا= ا م ا‬if…else ‫ ا رة‬L ♦
if(Condition) Statement 1;
else
Statement 2;
‫ ا رات‬O s
9‫ﻥ" ﻥ‬p( ‫  &رة‬A‫ن  أآ‬1‫ ی‬else ‫ و‬if #‫إذا آن ﺝ‬
.{ } ‫ ة‬P ‫اس‬13L‫ﺏ‬
‫ة &رات إذا آن‬2& ‫ "!
&رة أو‬if …else ‫♦   ا رة‬
‫ة‬2& ‫ و "!
&رة أ ى أو‬، ً 9
9P if ‫ا= ط ا ي ی' ا رة‬
.O ‫ ی آ‬# ‫&رات إذا‬
. if…else ‫♦ ﺍﻟﻌﺎﻣﻞ ﺍﳌﺸﺮﻭﻁ ﻫﻮ ﻭﺳﻴﻠﺔ ﻟﻠﺘﻌﺒﲑ ﻋﻦ ﺍﻟﻌﺒﺎﺭﺓ‬
:‫ ﺗﺄﺧﺬ ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﺍﻟﺘﺎﱄ‬switch ‫♦ ﺍﻟﻌﺒﺎﺭﺓ‬
switch (Variable name)
{
case constant 1: statement 1;
. break;
.
.
case constant n: statement n;
break;

default: last statement;


}

32
‫ﺍﻷﺳﺌﻠﺔ‬

: ‫ ﺕدى ا‬C++ ‫ أآ  رة‬/1


. >> ‫ و‬cin ‫ ﺏ ل‬x d
9P
l /
3 ‫ إدل‬
.>> ‫ و‬cin ‫ ﺏ ل‬y d
9P
l /
3 ‫ إدل‬
.1 2"& i d
9P
l /
3 2
> 
.1 2"& power d
9P
l /
3 2
> 

l /7
"‫ ا‬2
‫ و‬power
l‫ (' ا‬x
l‫ ا‬/
3 ‫ ? ب‬
.power
.1 ‫ ﺏـ‬y
l‫ ا‬/
3 ‫ زیدة‬
.x ‫  أو وي‬3‫ أ‬y
l‫ ا‬/
3 m‫ ار  إذا آﻥ‬
.power
l‫ ا‬/
3 /&< 

$%  ‫!* ت ا('ء ا‬+% ‫ ه‬% y = 11 ‫ و‬x = 9 ‫  "!اض أن‬/2


:,% ‫ا!ﻥ‬
if ( x < 10)
if ( y > 10)
cout << “* * * * *” << endl;
else
cout << “# # # # #” << endl;
cout << “$ $ $ $ $” << endl;

33
‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﺜﺎﻟﺜﺔ‬
‫‪3 .0‬‬
‫)‪Control Structures(II‬‬ ‫ﺑﻨﻴﺎﺕ ﺍﻟﺘﺤﻜﻢ)‪- (II‬‬

‫ﺍﻷﻫــﺪﺍﻑ‪:‬‬
‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪:‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻋﻮﺍﻣﻞ ﺍﻟﺘﺰﺍﻳﺪ ‪ Increment‬ﻭﺍﻟﺘﻨﺎﻗﺺ ‪Decrement‬‬
‫ﻭﺍﻟﻌﻮﺍﻣﻞ ﺍﳌﻨﻄﻘﻴﺔ ‪. Logical operators‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﺣﻠﻘﺎﺕ ﺍﻟﺘﻜﺮﺍﺭ ‪ while‬ﻭ ‪ do‬ﻭ ‪ for‬ﻟﺘﻜﺮﺍﺭ ﺗﻨﻔﻴﺬ ﻋﺒﺎﺭﺍﺕ‬
‫ﰲ ﺑﺮﻧﺎﳎﻚ‪.‬‬

‫‪34‬‬
‫ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﻴﲔ ﺍﳊﺴﺎﰊ‬ 3.1
:‫ﺑﺎﺳﺘﻌﻤﺎﻝ ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﲔ ﺍﳊﺴﺎﰊ ﳝﻜﻦ ﺇﻋﺎﺩﺓ ﻛﺘﺎﺑﺔ ﺗﻌﺒﲑ ﻣﺜﻞ‬
x=x+2
‫ﻋﻠﻰ ﺍﻟﻨﺤﻮ‬
x+=2
‫ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻮﺟﻮﺩﺓ ﻋﻠﻰ ﳝﻴﻨﻪ ﻭﻳﻀﻴﻔﻬﺎ ﺇﱃ ﺍﳌـﺘﻐﲑ‬+= ‫ﻳﺄﺧﺬ ﻋﺎﻣﻞ ﺍﻟﺘﻌﲔ ﺍﳊﺴﺎﰊ‬
-:‫ ﻫﻨﺎﻟﻚ ﺗﻌﲔ ﺣﺴﺎﰊ ﻟﻜﻞ ﻣﻦ ﺍﻟﻌﻮﺍﻣﻞ ﺍﳊﺴﺎﺑﻴﺔ‬.‫ﺍﳌﻮﺟﻮﺩ ﻋﻠﻰ ﻳﺴﺎﺭﻩ‬

a+= b a= a+ b

a-= b a= a- b

a*= b a= a* b

a/= b a= a/ b

a%= b a= a% b
:‫ﻣﺜﺎﻝ‬

//Program 3-1:
#include<iostream.h>
main ( )
{
int n;
cin >> n;
cout<< “ n after adding 2 = “ << a+= 2 <<endl;
cout<< “ n after a subtracting 2 = “ << a-= 2 <<endl;
cout<< “ n after dividing by 2 = “ << a/= 2 <<endl;
cout<< “ n after multiplying by 2 = “ << a*= 2 <<endl;
cout<< “ n mod 2 = “ << a %= 2 <<endl;
return 0;
}

35
‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺇﺫﺍ ﺃﺩﺧﻠﻨﺎ ‪n =10‬‬
‫‪10‬‬
‫‪n after adding 2 = 12‬‬
‫‪n after a subtracting 2 = 8‬‬
‫‪n after dividing by 2 = 5‬‬
‫‪n after multiplying by 2 = 20‬‬
‫‪n mod 2 = 0‬‬

‫ﻋﻮﺍﻣﻞ ﺍﻟﺘﺰﺍﻳﺪ ﻭﺍﻟﺘﻨﺎﻗﺺ‬ ‫‪3.2‬‬


‫ﻫﻨﺎﻙ ﺩﺍﺋﻤﹰﺎ ﺣﺎﺟﺔ ﰲ ﺍﻟﱪﳎﺔ ﺇﱃ ﺯﻳﺎﺩﺓ ‪ 1‬ﺃﻭ ﻃﺮﺡ ‪ .1‬ﻫﺬﻩ ﺍﳊـﺎﻻﺕ ﺷـﺎﺋﻌﺔ‬
‫ﻟﺪﺭﺟﺔ ﺃﻥ ‪ C++‬ﺗﺘﻀﻤﻦ ﻋﺎﻣﻠﲔ ﺧﺎﺻﲔ ﻳﻨﻔﺬﺍﻥ ﻫﺬﻩ ﺍﳌﻬﻤﺔ‪ ،‬ﻳﻘﻮﻡ ﻋﺎﻣﻞ ﺍﻟﺘﻨﺎﻗﺺ )‪ (--‬ﺑﻄﺮﺡ‬
‫‪ 1‬ﻣﻦ ﺍﳌﺘﻐﲑ ﻭﻳﻀﻴﻒ ﻋﺎﻣﻞ ﺍﻟﺘﺰﺍﻳﺪ )‪ 1 (++‬ﺇﻟﻴﻪ ‪ ،‬ﺍﳌﺜﺎﻝ ﺍﻵﰐ ﻳﺒﲔ ﻃﺮﻳﻘﺔ ﺍﻻﺳﺘﻌﻤﺎﻝ‪-:‬‬
‫‪++a‬‬
‫‪a++‬‬
‫ﻣﻌﻨﺎﻩ ﺇﺿﺎﻓﺔ ‪ 1‬ﺇﱃ ‪ ، a‬ﻭﳝﻜﻦ ﻛﺘﺎﺑﺘﻪ ﺑﺼﻮﺭﺓ ﻣﻜﺎﻓﺌـﺔ ﻋﻠـﻰ ﺍﻟﻨﺤـﻮ ‪a=a+1‬‬
‫ﻭﺑﺎﻟﻄﺮﻳﻘﺔ ﻧﻔﺴﻬﺎ ﳝﻜﻦ ﺇﻧﻘﺎﺹ ‪ 1‬ﻣﻦ ﻗﻴﻤﺔ ‪ a‬ﻋﻠﻰ ﺍﻟﻨﺤﻮ ‪ --a‬ﺃﻭ ‪ a--‬ﻭﻫﻮ ﻳﻜﺎﻓﺊ ‪.a=a-1‬‬
‫ﻭﳑﺎ ﳚﺐ ﺍﻟﺘﻨﺒﻴﻪ ﺇﻟﻴﻪ ﻫﻨﺎ ﺃﻥ ﻫﻨﺎﻟﻚ ﻓﺮﻕ ﺑﲔ ‪ ++ a‬ﺃﻭ ‪ a++‬ﻓﻌﻠﻰ ﺍﻟﺮﻏﻢ ﻣـﻦ‬
‫ﻛﻠﻴﻬﻤﺎ ﳚﻤﻊ ‪ 1‬ﺇﱃ ‪ a‬ﺇﻻ ﺃﻧﻪ ﻋﻨﺪ ﺍﺳﺘﻌﻤﺎﻝ ‪ ++a‬ﺗﺴﺘﺨﺮﺝ ﻗﻴﻤﺔ ﺍﻟﺘﻌﺒﲑ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻗﻴﻤـﺔ ‪a‬‬
‫ﺍﳊﺎﻟﻴﺔ ﻗﺒﻞ ﺯﻳﺎﺩ‪‬ﺎ ﻭﻳﻨﻄﺒﻖ ﻫﺬﺍ ﺃﻳﻀﹰﺎ ﻋﻠﻰ ‪ --a‬ﻭ‪. a--‬‬
‫‪//Program 3-2:‬‬
‫>‪#include<iostream.h‬‬
‫) ( ‪main‬‬
‫{‬
‫;‪int c‬‬
‫;‪c = 5‬‬
‫;‪cout << c << endl‬‬
‫;‪cout << c++ <<endl‬‬
‫;‪cout << c <<endl‬‬
‫;‪c=5‬‬
‫;‪cout << c << endl << endl‬‬
‫;‪cout << ++c << endl‬‬

‫‪36‬‬
‫;‪cout << c << endl‬‬
‫;‪return 0‬‬
‫‪//Continued‬‬
‫}‬
‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬
‫‪5‬‬
‫‪5‬‬
‫‪6‬‬

‫‪5‬‬
‫‪6‬‬
‫‪6‬‬

‫ﺍﻟﻌﻮﺍﻣﻞ ﺍﳌﻨﻄﻘﻴﺔ‬
‫‪3.3‬‬
‫ﳝﻜﻦ ﺍﻟﻌﻤﻞ ﻋﻠﻰ ﺍﻟﻘﻴﻢ ﺻﺤﻴﺢ‪/‬ﺧﻄﺄ ﺑﻮﺍﺳﻄﺔ ﺍﻟﻌﻮﺍﻣﻞ ﺍﳌﻨﻄﻘﻴﺔ ‪ ،‬ﻫﻨﺎﻟﻚ ﺛﻼﺛـﺔ‬
‫ﻋﻮﺍﻣﻞ ﻣﻨﻄﻘﻴﺔ ﰲ ‪ C++‬ﻫﻲ ‪ Not,Or,And‬ﻛﻤﺎ ﻣﻮﺿﺢ ﰲ ﺍﳉﺪﻭﻝ ﺃﺩﻧﺎﻩ‪-:‬‬
‫ﻣﺜﺎﻝ‬ ‫ﻣﻌﻨﺎﻩ‬ ‫ﺍﻟﻌﺎﻣﻞ ﺍﳌﻨﻄﻘﻲ‬
‫‪x>0 &&x<10‬‬ ‫)‪) (and‬ﻭ(‬ ‫&&‬
‫‪x= = ||x= = 0‬‬ ‫)‪) (or‬ﺃﻭ(‬ ‫||‬
‫‪1‬‬
‫‪!x‬‬ ‫) ‪) (not‬ﻧﻔﻰ(‬ ‫!‬
‫ﻳﻜﻮﻥ ﺍﻟﺘﻌﺒﲑ ‪ and‬ﺻﺤﻴﺤﹰﺎ ﻓﻘﻂ ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﺘﻌﺒﲑﻳﻦ ﺍﳌﻮﺟﻮﺩﺍﻥ ﻋﻠـﻰ ﺟـﺎﻧﱯ‬
‫ﺍﻟﻌﺎﻣﻞ && ﺻﺤﻴﺤﲔ ﺑﻴﻨﻤﺎ ﻳﺆﺩﻯ ﺍﻟﻌﺎﻣﻞ ‪ or‬ﺇﱃ ﻧﺘﻴﺠﺔ ﺻﺤﻴﺤﺔ ﺇﺫﺍ ﻛﺎﻥ ﺃﺣﺪ ﺍﻟﺘﻌﺒﲑﻳﻦ ﺃﻭ‬
‫ﻛﻠﻴﻬﻤﺎ ﺻﺤﻴﺤﹰﺎ‪ .‬ﺍﻟﻌﺎﻣﻞ ‪ (!) not‬ﻳﺒﻄﻞ ﺗﺄﺛﲑ ﺍﳌﺘﻐﲑ ﺍﻟﺬﻱ ﻳﻠﻴﻪ ﻟﺬﺍ ﺍﻟﺘﻌﺒﲑ ‪ !x‬ﺻـﺤﻴﺢ ﺇﺫﺍ‬
‫ﻛﺎﻥ ﺍﳌﺘﻐﲑ ‪ x‬ﺧﻄﺄ ﻭﺧﻄﺄ ﺇﺫﺍ ﻛﺎﻥ ‪ x‬ﺻﺤﻴﺤﹰﺎ‪.‬‬
‫ﺃﻭﻟﻮﻳﺔ ﺍﻟﻌﻮﺍﻣﻞ )‪-:(Operator Precedence‬‬
‫ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻋﻤﻠﻴﺎﺕ ﺍﻟﻀﺮﺏ ﻭﺍﻟﻘﺴﻤﺔ ﰲ ﺍﻟﺘﻌﺎﺑﲑ ﺍﻟﺮﻳﺎﺿﻴﺔ ﻗﺒﻞ ﻋﻤﻠﻴـﺎﺕ ﺍﳉﻤـﻊ‬
‫ﻼ‪:‬‬
‫ﻭﺍﻟﻄﺮﺡ ‪ .‬ﰲ ﺍﻟﺘﻌﺒﲑ ﺍﻟﺘﺎﱄ ﻣﺜ ﹰ‬
‫‪10*10+2*3‬‬

‫‪37‬‬
‫ﻳﺘﻢ ﺿﺮﺏ ‪ 10*10‬ﰒ ﻳﺘﻢ ﺿﺮﺏ ‪ 2*3‬ﻭﺑﻌﺪﻫﺎ ﻳﺘﻢ ﲨﻊ ﻧﺘﻴﺠﱵ ﺍﻟﻀﺮﺏ ﳑﺎ ﻳﺆﺩﻯ ﺇﱃ ﺍﻟﻘﻴﻤﺔ‬
‫‪100+6=106.‬‬
‫ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻋﻤﻠﻴﺎﺕ ﺍﻟﻀﺮﺏ ﻗﺒﻞ ﺍﳉﻤﻊ ﻷﻥ ﺍﻟﻌﺎﻣﻞ * ﻟﻪ ﺃﻭﻟﻮﻳﺔ ﺃﻋﻠﻰ ﻣﻦ ﺃﻭﻟﻮﻳﺔ ﺍﻟﻌﺎﻣﻞ ‪. +‬‬
‫ﳒﺪ ﺃﻥ ﺃﻭﻟﻮﻳﺔ ﺍﻟﻌﻮﺍﻣﻞ ﻣﻬﻤﺔ ﰲ ﺍﻟﺘﻌﺎﺑﲑ ﺍﻟﺮﻳﺎﺿﻴﺔ ﺍﻟﻌﺎﺩﻳﺔ ﻛﻤﺎ ﺃ‪‬ﺎ ﻣﻬﻤﺔ ﺃﻳﻀﹰﺎ ﻋﻨـﺪ ﺍﺳـﺘﻌﻤﺎﻝ‬
‫ﻋﻮﺍﻣﻞ ‪ C++‬ﺍﳌﺨﺘﻠﻔﺔ ‪ ،‬ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﺗﺮﺗﻴﺐ ﺃﻭﻟﻮﻳﺎﺕ ﺍﻟﻌﻮﺍﻣﻞ ﰲ ‪ C++‬ﻣﻦ ﺍﻷﻋﻠـﻰ‬
‫ﺇﱃ ﺍﻷﺩﱏ‪.‬‬
‫ﺍﻷﻭﻟﻮﻳﺔ‬ ‫ﺃﻧﻮﺍﻉ ﺍﻟﻌﻮﺍﻣﻞ‬ ‫ﺍﻟﻌﻮﺍﻣﻞ‬
‫ﺃﻋﻠﻰ‬ ‫ﻣﻀﺎﻋﻔﺔ‬ ‫‪%‬‬ ‫‪, /‬‬ ‫‪,‬‬ ‫*‬
‫ﲨﻌﻴﺔ‬ ‫‪-‬‬ ‫‪,‬‬ ‫‪+‬‬
‫<‪ != ,== ,>= ,<= , > ,‬ﻋﻼﺋﻘﻴﺔ‬
‫ﻣﻨﻄﻘﻴﺔ‬ ‫&& || !‬
‫ﺃﺩﱏ‬ ‫ﺗﻌﻴﲔ‬ ‫=‬
‫ﺑﻨﻴﺎﺕ ﺍﻟﺘﺤﻜﻢ ﺍﻟﺘﻜﺮﺍﺭﻳﺔ‬
‫‪3.4‬‬

‫)‪(LOOPS‬‬ ‫ﺍﳊﻠﻘﺎﺕ‬ ‫‪3.4.1‬‬


‫ﺗﻮﻓﺮ ‪ C++‬ﻋﺪﺩﹰﺍ ﻣﻦ ﺃﺳﺎﻟﻴﺐ ﺍﻟﺘﻜﺮﺍﺭ )ﺣﻠﻘﺎﺕ( ﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ ﻟﺘﻜﺮﺍﺭ ﺃﺟﺰﺍﺀ ﻣﻦ‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﻗﺪﺭ ﻣﺎ ﺗﺪﻋﻮ ﺍﳊﺎﺟﺔ‪ ،‬ﻟﺘﺤﺪﻳﺪ ﻋﺪﺩ ﻣﺮﺍﺕ ﺗﻜﺮﺍﺭ ﺍﳊﻠﻘﺔ ﺗﻔﺤﺺ ﻛﻞ ﺣﻠﻘﺎﺕ ‪ C++‬ﻣﺎ‬
‫ﺇﺫﺍ ﻛﺎﻥ ﺗﻌﺒﲑ ﻣﺎ ﻳﺴﺎﻭﻯ ﺻﺤﻴﺢ )‪ (true‬ﺃﻭ ﺧﻄﺄ )‪ (false‬ﻳﺒﻠﻐﻬﺎ ﻫﺬﺍ ﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﻋﻠﻴﻬﺎ‬
‫ﺍﻟﺘﻜﺮﺍﺭ ﻣﺮﺓ ﺇﺿﺎﻓﻴﺔ ﺃﺧﺮﻯ ﺃﻭ ﺍﻟﺘﻮﻗﻒ ﻓﻮﺭﹰﺍ‪.‬‬
‫ﻫﻨﺎﻟﻚ ﺛﻼﺛﺔ ﺃﻧﻮﺍﻉ ﻣﻦ ﺍﳊﻠﻘﺎﺕ ﰲ ‪-:C+ +‬‬

‫ﺍﳊﻠﻘﺔ ‪while‬‬ ‫‪3.4.2‬‬

‫ﺗﺘﻴﺢ ﺍﳊﻠﻘﺔ ‪ while‬ﺗﻜﺮﺍﺭ ﻓﻌﻞ ﺟﺰﺀ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺇﱃ ﺃﻥ ﻳﺘﻐﲑ ﺷﺮﻁ ﻣﺎ ‪.‬‬


‫ﻼ‪- :‬‬
‫ﻓﻤﺜ ﹰ‬
‫)‪while (n<100‬‬
‫‪n=n*2‬‬

‫‪38‬‬
‫ﺳﺘﺴﺘﻤﺮ ﻫﺬﻩ ﺍﳊﻠﻘﺔ ﰲ ﻣﻀﺎﻋﻔﺔ ﺍﳌﺘﻐﲑ ‪ n‬ﺇﱃ ﺃﻥ ﺗﺼﺒﺢ ﻗﻴﻤﺔ ‪ n‬ﺃﻛـﱪ ﻣـﻦ‬
‫‪ 100‬ﻋﻨﺪﻫﺎ ﺗﺘﻮﻗﻒ‪ .‬ﺗﺘﻜﻮﻥ ﺍﳊﻠﻘﺔ ﻣﻦ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ while‬ﻳﻠﻴﻬﺎ ﺗﻌﺒﲑ ﺍﺧﺘﺒﺎﺭ ﺑـﲔ‬
‫ﺃﻗﻮﺍﺱ ﻭﻳﻜﻮﻥ ﺟﺴﻢ ﺍﳊﻠﻘﺔ ﳏﺼﻮﺭﹰﺍ ﺑﲔ ﺃﻗﻮﺍﺱ ﺣﺎﺻﺮﺓ } { ﺇﻻ ﺇﺫﺍ ﻛﺎﻥ ﻳﺘﺄﻟﻒ ﻣﻦ ﻋﺒـﺎﺭﺓ‬
‫ﻭﺍﺣﺪﺓ‪ .‬ﺍﻟﺸﻜﻞ )‪ (3-1‬ﻳﺒﲔ ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﳊﻠﻘﺔ ‪-:while‬‬

‫ﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ‬ ‫ﺧﻄﺄ‬


‫ﺇ‪‬ﺎﺀ‬

‫ﺻﺤﻴﺢ‬
‫ﺟﺴﻢ ﺍﳊﻠﻘﺔ‬

‫ﺷﻜﻞ )‪ – (3-1‬ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﳊﻠﻘﺔ ‪while‬‬

‫ﳑﺎ ﳚﺪﺭ ﺍﻟﺘﻨﻮﻳﻪ ﺇﻟﻴﻪ ﻫﻨﺎ ﺃﻧﻪ ﻳﺘﻢ ﻓﺤﺺ ﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ ﻗﺒﻞ ﺗﻨﻔﻴﺬ ﺟﺴﻢ ﺍﳊﻠﻘـﺔ‪،‬‬
‫ﻭﻋﻠﻴﻪ ﻟﻦ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺟﺴﻢ ﺍﳊﻠﻘﺔ ﺃﺑﺪﹰﺍ ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﺸﺮﻁ ﺧﻄﺄ ﻋﻨﺪ ﺩﺧﻮﻝ ﺍﳊﻠﻘﺔ ﻭﻋﻠﻴﻪ ﺍﳌﺘﻐﲑ ‪n‬‬
‫ﰲ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ ﳚﺐ ﲤﻬﻴﺪﻩ ﻋﻨﺪ ﻗﻴﻤﺔ ﺃﻗﻞ ﻣﻦ ‪. 100‬‬
‫ﻣﺜﺎﻝ ‪:‬‬

‫‪//Program 3-3:‬‬
‫>‪#include<iostream.h‬‬
‫) ( ‪main‬‬
‫{‬
‫;‪int counter, grade, total ,average‬‬
‫;‪total = 0‬‬
‫;‪counter = 1‬‬
‫{ )‪while (counter <= 0‬‬
‫;“ ‪cout<< “ Enter grade :‬‬
‫;‪cin >>grade‬‬
‫;‪total = total + grade‬‬

‫‪39‬‬
counter = counter + 1;
}
cout<<endl;
average = total /10;
//Continued
cout << “ Class average is: “ << average <<endl;
return 0;

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

Enter grade: 75 65 50 89 71 54 86 79 81 90
Class average is : 74

:‫ﻣﺎ ﻫﻮ ﺍﳋﻄﺄ ﰲ ﺍﳊﻠﻘﺔ ﺍﻵﺗﻴﺔ‬


while(c<5) {
product *=c;
++c;

40
‫ﺍﳊﻠﻘﺔ ‪do‬‬ ‫‪3.4.3‬‬

‫ﺗﻌﻤﻞ ﺍﳊﻠﻘﺔ ‪) do‬ﻏﺎﻟﺒﹰﺎ ﺗﺴﻤﻰ …‪ (do…while‬ﻛﺎﳊﻠﻘـﺔ ‪ ،while‬ﺇﻻ ﺃ‪‬ـﺎ‬


‫ﺗﻔﺤﺺ ﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺟﺴﻢ ﺍﳊﻠﻘﺔ‪ .‬ﻭﺗﺴﺘﺨﺪﻡ ﺃﻳﻀﹰﺎ ﻋﻨﺪﻣﺎ ﻧﺮﻳﺪ ﺍﻟﻘﻴﺎﻡ ﲜـﺰﺀ ﻣـﻦ‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﻣﺮﺓ ﻭﺍﺣﺪﺓ ﻋﻠﻰ ﺍﻷﻗﻞ‪.‬‬
‫ﺍﻟﺸﻜﻞ)‪ (2-5‬ﻳﺒﲔ ﻛﻴﻔﻴﺔ ﻋﻤﻞ ﺍﳊﻠﻘﺔ ‪.do‬‬

‫ﺟﺴﻢ ﺍﳊﻠﻘﺔ‬

‫ﺧﻄﺄ‬
‫ﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ‬ ‫ﺇ‪‬ﺎﺀ‬

‫ﺻﺤﻴﺢ‬

‫ﺷﻜﻞ )‪ – (3-2‬ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﳊﻠﻘﺔ ‪do‬‬

‫ﺗﺒﺪﺃ ﺍﳊﻠﻘﺔ ‪ do‬ﺑﺎﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ do‬ﻳﻠﻴﻬﺎ ﺟﺴﻢ ﺍﳊﻠﻘﺔ ﺑﲔ ﺃﻗﻮﺍﺱ ﺣﺎﺻﺮﺓ {‬


‫} ﰒ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ while‬ﰒ ﺗﻌﺒﲑ ﺍﺧﺘﺒﺎﺭ ﺑﲔ ﺃﻗﻮﺍﺱ ﰒ ﻓﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ‪.‬‬
‫ﻣﺜﺎﻝ‪-:‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻷﻋﺪﺍﺩ ﻣﻦ ‪ 1‬ﺇﱃ ‪. 10‬‬

‫‪//Program 3-4:‬‬
‫‪// using do repetition structure‬‬
‫>‪#include<iostream.h‬‬
‫) ( ‪main‬‬
‫;‪{ int counter = 1‬‬
‫‪do‬‬
‫; '' ''<< ‪cout << counter‬‬

‫‪41‬‬
‫;)‪while (+ + counter <= 10‬‬
‫‪//Continued‬‬
‫;‪return 0‬‬
‫}‬

‫ﺗﻘﻮﻡ ;“ “ <<‪ cout‬ﺑﻄﺒﺎﻋﺔ ﻣﺴﺎﻓﺔ ﺧﺎﻟﻴﺔ ﺑﲔ ﻛﻞ ﺭﻗﻢ ﻭﺍﻵﺧﺮ ﻭﻋﻠﻴﻪ ﺍﳋﺮﺝ‬


‫ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻜﻮﻥ ﻛﺎﻟﺘﺎﱄ‪:‬‬

‫‪1 2 3 4 5 6 7 8 9 10‬‬

‫‪42‬‬
‫ﺍﳊﻠﻘﺔ ‪for‬‬ ‫‪3.4.5‬‬

‫ﻋﺎﺩﺓ ﻻ ﺗﻌﺮﻑ ﺍﳊﻠﻘﺎﺕ ‪ do‬ﻭ ‪ while‬ﻋﺪﺩ ﻣﺮﺍﺕ ﺗﻜﺮﺍﺭ ﺍﳊﻠﻘﺔ‪ .‬ﻟﻜﻦ ﰲ‬


‫ﺍﳊﻠﻘﺔ ‪ for‬ﻳﻜﻮﻥ ﻋﺪﺩ ﻣﺮﺍﺕ ﺗﻨﻔﻴﺬ ﺍﳊﻠﻘﺔ ﻣﺬﻛﻮﺭﹰﺍ ﻋﺎﺩﺓ ﰲ ﺑﺪﺍﻳﺘﻬﺎ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﻗﻴﻢ ﺍﳌﺘﻐﲑ ‪ counter‬ﻣﻦ ‪ 1‬ﺇﱃ ‪. 10‬‬

‫‪//Program 3-5:‬‬
‫‪// using the for repetition structure‬‬
‫>‪#include<iostream.h‬‬
‫) (‪main‬‬
‫{‬
‫)‪for ( int counter = 1; counter<= 10; counter++‬‬
‫; ‪cout << counter <<endl‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪8‬‬
‫‪9‬‬
‫‪10‬‬

‫‪43‬‬
‫ﲢﺘﻮﻯ ﺍﻷﻗﻮﺍﺱ ﺍﻟﱵ ﺗﻠﻲ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ for‬ﻋﻠﻰ ﺛﻼﺛﺔ ﺗﻌﺎﺑﲑ ﳐﺘﻠﻔﺔ‬
‫ﺗﻔﺼﻠﻬﺎ ﻓﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ‪ .‬ﺗﻌﻤﻞ ﻫﺬﻩ ﺍﻟﺘﻌﺎﺑﲑ ﺍﻟﺜﻼﺛﺔ ﰲ ﺃﻏﻠﺐ ﺍﻷﻭﻗﺎﺕ ﻋﻠﻰ ﻣﺘﻐﲑ ﻳﺪﻋﻰ ﻣﺘﻐﲑ‬
‫ﺍﳊﻠﻘﺔ ‪ ،‬ﻭﻫﻮ ﺍﳌﺘﻐﲑ ‪ counter‬ﰲ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ‪.‬‬
‫ﻫﺬﻩ ﺍﻟﺘﻌﺎﺑﲑ ﻫﻲ‪-:‬‬
‫ﺗﻌﺒﲑ ﺍﻟﺘﻤﻬﻴﺪ‪ ،‬ﺍﻟﺬﻱ ﳝﻬﺪ ﻗﻴﻤﺔ ﻣﺘﻐﲑ ﺍﳊﻠﻘﺔ ﻋﺎﺩﺓ ;‪. int counter = 1‬‬
‫ﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ‪ ،‬ﺍﻟﺬﻱ ﻳﻔﺤﺺ ﻋﺎﺩﺓ ﻗﻴﻤﺔ ﻣﺘﻐﲑ ﺍﳊﻠﻘﺔ ﻟﲑﻯ ﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﳚﺐ ﺗﻜﺮﺍﺭ ﺍﳊﻠﻘﺔ‬
‫ﻣﺮﺓ ﺃﺧﺮﻯ ﺃﻭ ﺇﻳﻘﺎﻓﻬﺎ ;‪.counter <= 10‬‬
‫ﺗﻌﺒﲑ ﺍﻟﺘﺰﺍﻳﺪ‪ ،‬ﺍﻟﺬﻱ ﻳﻘﻮﻡ ﻋﺎﺩﺓ ﺑﺰﻳﺎﺩﺓ )ﺃﻭ ﺇﻧﻘﺎﺹ( ﻗﻴﻤﺔ ﻣﺘﻐﲑ ﺍﳊﻠﻘﺔ ‪. counter++‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺈﻧﻘﺎﺹ ﻣﺘﻐﲑ ﺍﳊﻠﻘﺔ ﺑـ ‪ 1‬ﻛﻠﻤﺎ ﺗﻜﺮﺭﺕ ﺍﳊﻠﻘﺔ‬

‫‪//Program 3-6:‬‬
‫>‪#include <iostream.h‬‬
‫) ( ‪main‬‬
‫{‬
‫)‪for ( int j=10; j>0; -- j‬‬
‫;' '<<‪cout <<j‬‬
‫;‪return 0‬‬
‫{‬

‫ﺳﺘﻌﺮﺽ ﻫﺬﻩ ﺍﳊﻠﻘﺔ‬

‫‪1 2 3 4 5 6 7 8 9 10‬‬

‫ﻭﳝﻜﻦ ﺃﻳﻀﹰﺎ ﺯﻳﺎﺩﺓ ﺃﻭ ﺇﻧﻘﺎﺹ ﻣﺘﻐﲑ ﺍﳊﻠﻘﺔ ﺑﻘﻴﻤﺔ ﺃﺧﺮﻯ ‪.‬‬


‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺫﻟﻚ ‪:‬‬
‫‪//Program 3-7:‬‬
‫>‪#include<iostream.h‬‬
‫) ( ‪main‬‬
‫{‬

‫‪44‬‬
‫)‪for (int j=10; j<100; j+=10‬‬
‫;' '<<‪cout <<j‬‬
‫;‪return 0‬‬
‫{‬

‫ﺳﺘﻌﺮﺽ ‪-:‬‬

‫‪10 20 30 40 50 60 70 80 90 100‬‬

‫ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻋﺪﺓ ﻋﺒﺎﺭﺍﺕ ﰲ ﺗﻌﺒﲑ ﺍﻟﺘﻤﻬﻴﺪ ﻭﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ ﻛﻤﺎ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ‪-:‬‬

‫‪//Program 3-8:‬‬
‫>‪#include<iostream.h‬‬
‫) ( ‪main‬‬
‫{‬
‫)‪for ( int j=0;int total=0; j<10; ++ j;total+=j‬‬
‫;' '<<‪cout <<total‬‬
‫; ‪return 0‬‬
‫}‬

‫ﺗﻌﺮﺽ‪-:‬‬

‫‪0 1 3 6 10 15 21 28 36 45‬‬

‫ﺃﻳﻀﹰﺎ ﳝﻜﻦ ﰲ ﺍﳊﻠﻘﺔ ‪ for‬ﲡﺎﻫﻞ ﺃﺣﺪ ﺍﻟﺘﻌﺎﺑﲑ ﺃﻭ ﺛﻼﺛﺘﻬﺎ ﻛﻠﻴﹰﺎ ﻣﻊ ﺍﶈﺎﻓﻈﺔ ﻋﻠﻰ‬
‫ﺍﻟﻔﻮﺍﺻﻞ ﺍﳌﻨﻘﻮﻃﺔ ﻓﻘﻂ‪.‬‬
‫ﺍﻟﺸﻜﻞ)‪ (2-6‬ﻳﺒﲔ ﻛﻴﻔﻴﺔ ﻋﻤﻞ ﺍﳊﻠﻘﺔ ‪.for‬‬

‫‪45‬‬
‫ﺗﻌﺒﲑ ﺍﻟﺘﻤﻬﻴﺪ‬

‫ﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ‬ ‫ﺧﻄﺄ‬ ‫ﺇ‪‬ﺎﺀ‬

‫ﺻﺤ‬
‫ﺟﺴﻢ ﺍﳊﻠﻘﺔ‬

‫ﺗﻌﺒﲑ ﺍﻟﺘﺰﺍﻳﺪ‬

‫ﺷﻜﻞ )‪ – (3-3‬ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﳊﻠﻘﺔ ‪for‬‬

‫‪46‬‬
‫ﺍﳊﻠﻘﺎﺕ ﺍﳌﺘﺪﺍﺧﻠﺔ‬ ‫‪3.4.6‬‬

‫ﺗﺄﺧﺬ ﺍﳊﻠﻘﺎﺕ ‪ for‬ﺍﳌﺘﺪﺍﺧﻠﺔ ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﺍﻟﺘﺎﱄ ‪-:‬‬


‫)‪for (..........‬‬
‫)‪for (..........‬‬
‫)‪for (..........‬‬

‫;‪statements‬‬
‫ﻣﺜﺎﻝ‪:‬‬
‫‪//Program 3-9:‬‬
‫‪// An Example of 2 nested loops‬‬
‫>‪#include<iostream.h‬‬
‫) (‪main‬‬
‫{‬
‫;‪int i,j‬‬
‫)‪for (i=1 ; i<3;++i‬‬
‫{‬
‫)‪for (j=1 ; j<4;++j‬‬
‫;‪cout << i*j<<’ ‘ <<endl‬‬
‫}‬
‫;‪return 0‬‬
‫}‬

‫ﻧﻼﺣﻆ ﻫﻨﺎ ﺃﻥ ﺍﳊﻠﻘﺔ ﺍﻟﺪﺍﺧﻠﻴﺔ ﺗﺘﻜﺮﺭ ‪ 4‬ﻣﺮﺍﺕ ﻟﻜﻞ ﻗﻴﻤﺔ ﻣﻦ ﻗﻴﻢ ‪) i‬ﻋﺪﺍﺩ ﺍﳊﻠﻘﺔ‬
‫ﺍﳋﺎﺭﺟﻴﺔ(‪.‬‬
‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪1 2 3 4‬‬
‫‪2 4 6 8‬‬
‫‪6 9 12‬‬

‫‪47‬‬
‫ﳝﻜﻨﻨﺎ ﻭﺿﻊ ﺃﻱ ﻧﻮﻉ ﻣﻦ ﺍﳊﻠﻘﺎﺕ ﺿﻤﻦ ﺃﻱ ﻧﻮﻉ ﺁﺧﺮ‪ ،‬ﻭﳝﻜﻦ ﻣﺪﺍﺧﻠﺔ ﺍﳊﻠﻘﺎﺕ‬
‫ﰲ ﺣﻠﻘﺎﺕ ﻣﺘﺪﺍﺧﻠﺔ ﰲ ﺣﻠﻘﺎﺕ ﺃﺧﺮﻯ ﻭﻫﻜﺬﺍ‪.‬‬

‫ﺍﻟﺘﺤﻜﻢ ﺑﺎﳊﻠﻘﺎﺕ‬ ‫‪3.4.7‬‬


‫ﺗﻌﻤﻞ ﺍﳊﻠﻘﺎﺕ ﻋﺎﺩﺓ ﺑﺸﻜﻞ ﺟﻴﺪ ﺇﻻ ﺃﻧﻨﺎ ﰲ ﺑﻌﺾ ﺍﻷﻭﻗﺎﺕ ﳓﺘﺎﺝ ﻟﻠﺘﺤﻜﻢ ﺑﻌﻤﻞ‬
‫ﺍﳊﻠﻘﺎﺕ ‪ ،‬ﺍﻟﻌﺒﺎﺭﺗﲔ ‪ break‬ﻭ‪ continue‬ﺗﻮﻓﺮﺍﻥ ﻫﺬﻩ ﺍﳌﺮﻭﻧﺔ ﺍﳌﻄﻠﻮﺑﺔ‪.‬‬
‫ﺍﻟﻌﺒﺎﺭﺓ ‪-: break‬‬
‫ﺗﺘﻴﺢ ﻟﻨﺎ ﺍﻟﻌﺒﺎﺭﺓ ‪ break‬ﺍﳋﺮﻭﺝ ﻣﻦ ﺍﳊﻠﻘﺔ ﰲ ﺃﻱ ﻭﻗﺖ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﻟﻨﺎ ﻛﻴﻔﻴﺔ ﻋﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ ‪: break‬‬

‫‪//Program 3-10:‬‬
‫‪//An Example on break as a loop exit‬‬
‫>‪#include<iostream.h‬‬
‫) (‪main‬‬
‫{‬
‫;‪int isprime ,j ,n‬‬
‫;‪isprime = 1‬‬
‫;‪cin>>n‬‬
‫)‪for (j=2,j<n;++j‬‬
‫{‬
‫)‪if (n%j== 0‬‬
‫{‬
‫;‪isprime =0‬‬
‫;‪break‬‬
‫}‬
‫}‬
‫}‬

‫‪48‬‬
‫ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﳚﻌﻞ ﻗﻴﻤﺔ ﺍﳌﺘﻐﲑ ‪ isprime‬ﻋﻨﺪ ‪ 1‬ﺇﺫﺍ ﻛﺎﻥ ‪ n‬ﻋﺪﺩ ﺃﻭﱃ‬
‫‪ prime‬ﳚﻌﻞ ﻗﻴﻤﺘﻪ‪ 0‬ﺇﺫﺍ ﱂ ﻳﻜﻦ ﻛﺬﻟﻚ ) ﺍﻟﺮﻗﻢ ﺍﻷﻭﱄ ﻫﻮ ﺭﻗﻢ ﻳﻘﺒﻞ ﺍﻟﻘﺴﻤﺔ ﻋﻠﻰ ﻧﻔﺴﻪ‬
‫ﻭﻋﻠﻰ ﺍﻟﺮﻗﻢ ﻭﺍﺣﺪ ﻓﻘﻂ(‪.‬ﳌﻌﺮﻓﺔ ﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﺮﻗﻢ ﺃﻭﻟﻴﹰﺎ ﺃﻡ ﻻ ﺗﺘﻢ ﻗﺴﻤﺘﻪ ﻋﻠﻰ ﻛﻞ ﺍﻷﺭﻗﺎﻡ‬
‫ﻭﺻﻮ ﹰﻻ ﺇﱃ ‪ ، n-1‬ﺇﺫﺍ ﻗﺒﻞ ﺍﻟﺮﻗﻢ ‪ n‬ﺍﻟﻘﺴﻤﺔ ﻋﻠﻰ ﺃﺣﺪ ﻫﺬﻩ ﺍﻟﻘﻴﻢ ﻣﻦ ﺩﻭﻥ ﺑﺎﻗﻲ ﻓﺈﻧﻪ ﻻ ﻳﻜﻮﻥ‬
‫ﺃﻭﻟﻴﹰﺎ ﻟﻜﻦ ﺇﺫﺍ ﻗﺒﻞ ﺍﻟﺮﻗﻢ ‪ n‬ﺍﻟﻘﺴﻤﺔ ﻋﻠﻰ ﺃﺣﺪ ﻫﺬﻩ ﺍﻟﻘﻴﻢ ﺑﺸﻜﻞ ﺻﺤﻴﺢ ﻻ ﺩﺍﻋﻲ ﻹﻛﻤﺎﻝ‬
‫ﺍﳊﻠﻘﺔ ﻓﺤﺎﳌﺎ ﳚﺪ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺮﻗﻢ ﺍﻷﻭﻝ ﺍﻟﺬﻱ ﻳﻘﺴﻢ ‪ n‬ﺑﺸﻜﻞ ﺻﺤﻴﺢ ﳚﺐ ﺃﻥ ﻳﻀﺒﻂ ﻗﻴﻤﺔ‬
‫ﺍﳌﺘﻐﲑ ‪ isprime‬ﻋﻨﺪ ‪ 0‬ﻭﳜﺮﺝ ﻓﻮﺭﹰﺍ ﻣﻦ ﺍﳊﻠﻘﺔ‪.‬‬
‫ﺍﻟﺸﻜﻞ)‪ (3-4‬ﻳﺒﲔ ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ ‪-:break‬‬

‫ﺻﺤﻴﺢ‬
‫ﺍﻟﺼﻮﺭﺓ ﺍﻟﻌﺎﺩﻳﺔ‬ ‫ﺍﻟﺸﺮﻁ ﺿﻤﻦ‬ ‫‪break‬‬
‫ﻟﻠﺤﻠﻘﺔ‬ ‫ﺍﳊﻠﻘﺔ‬

‫ﺧﻄﺄ‬
‫‪‬ﺎﻳﺔ ﺍﳊﻠﻘﺔ‬

‫ﺷﻜﻞ )‪ – (3-4‬ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ ‪break‬‬

‫ﺍﻟﻌﺒﺎﺭﺓ ‪-: continue‬‬


‫ﺗﻌﻴﺪ ﺍﻟﻌﺒﺎﺭﺓ ‪ continue‬ﺍﻟﺘﻨﻔﻴﺬ ﺇﱃ ﺃﻋﻠﻰ ﺍﳊﻠﻘﺔ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﻋﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ ‪-:continue‬‬

‫‪//Program 3-11:‬‬
‫‪//An Example on continue statement‬‬
‫>‪#include<iostream.h‬‬
‫) (‪main‬‬
‫{‬
‫;‪int dividend , divisor‬‬

‫‪49‬‬
do
//Continued
{
cout << ''Enter dividend: '';
cin>>dividend;
cout<< ''Enter divisor: '';
//Continued
cin>>divisor;
if( divisor == 0)
{
cout<<" divisor can't be zero\n" ;
continue;
}
cout <<"Quotient is "<< dividend/divisor;
cout<<" do another (y/n)?";
cin>>ch
}
while (ch! = 'n');
}

‫ ﻋﻠﻰ ﺃﻧﻪ ﺍﻟﻘﺎﺳﻢ‬0 ‫ ﺃﻣﺮ ﻏﲑ ﻣﺮﻏﻮﺏ ﻓﻴﻪ ﻟﺬﺍ ﺇﺫﺍ ﻛﺘﺐ ﺍﳌﺴﺘﺨﺪﻡ‬0 ‫ﺍﻟﻘﺴﻤﺔ ﻋﻠﻰ‬
.‫ﻳﻌﻮﺩ ﺍﻟﺘﻨﻔﻴﺬ ﺇﱃ ﺃﻋﻠﻰ ﺍﳊﻠﻘﺔ ﻭﻳﻄﻠﺐ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺇﺩﺧﺎﻝ ﻗﺎﺳﻢ ﻭﻣﻘﺴﻮﻡ ﺟﺪﻳﺪﻳﻦ‬

If ( divisor == 0)
{
cout << “divisor can’t be zero\n”;
continue;
}
. n ‫ﻳﺴﺘﻤﺮ ﺗﻨﻔﻴﺬ ﺍﳊﻠﻘﺔ ﺇﱃ ﺃﻥ ﻳﺪﺧﻞ ﺍﳌﺴﺘﺨﺪﻡ ﺍﳊﺮﻑ‬
while( ch ! =’n’ ) ;
.continue ‫( ﻳﺒﲔ ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ‬3-5) ‫ﺍﻟﺸﻜﻞ‬

50
‫ﺑﺪﺍﻳﺔ ﺍﳊﻠﻘﺔ‬

‫ﺍﻟﺸﺮﻁ ﺿﻤﻦ‬ ‫‪continue‬‬


‫ﺍﳊﻠﻘﺔ‬

‫ﺍﻟﻌﻮﺩﺓ ﻟﻠﺤﻠﻘﺔ ﺍﻟﻌﺎﺩﻳﺔ‬

‫ﺷﻜﻞ )‪ (3-5‬ﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ ‪continue‬‬

‫‪51‬‬
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﺗﻮﻓﺮ ﻟﻐﺔ ‪ C++‬ﻋﻮﺍﻣﻞ ﺗﺴﻤﻰ ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﻴﲔ ﺍﳊﺴﺎﰊ ﻭﻫﻲ =‪،*= ، - = ، +‬‬
‫=‪ /‬ﻭ =‪.%‬‬
‫♦ ﺗﻮﻓﺮ ‪ C++‬ﻋﺎﻣﻠﻲ ﺍﻟﺘﺰﺍﻳﺪ ‪ ++‬ﻭﺍﻟﺘﻨﺎﻗﺺ – ﻭﺍﻟﻠﺬﻳﻦ ﻳﻘﻮﻣﺎﻥ ﺑﺰﻳﺎﺩﺓ ﻭﺇﻧﻘـﺎﺹ‬
‫ﻗﻴﻤﺔ ﻣﺘﻐﲑ ﻣﺎ ﲟﻘﺪﺍﺭ ‪. 1‬‬
‫♦ ﺗﺄﺧﺬ ﺍﳊﻠﻘﺔ ‪ for‬ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﺍﻟﺘﺎﱄ‪:‬‬
‫)‪for( expression1; expression2; expression3‬‬
‫‪statement‬‬
‫ﺣﻴﺚ ﳝﺜﻞ‪:‬‬
‫‪ expression1‬ﺗﻌﺒﲑ ﺍﻟﺘﻤﻬﻴﺪ ﺍﻟﺬﻱ ﳝﻬﺪ ﻗﻴﻤﺔ ﻣﺘﻐﲑ ﺍﳊﻠﻘﺔ‪.‬‬
‫‪ expression2‬ﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ ﺍﻟﺬﻱ ﻳﻔﺤﺺ ﻗﻴﻤﺔ ﻣﺘﻐﲑ ﺍﳊﻠﻘﺔ ﻭﳛﺪﺩ ﻣـﺎ ﺇﺫﺍ ﻛـﺎﻥ‬
‫ﳚﺐ ﺗﻜﺮﺍﺭ ﺍﳊﻠﻘﺔ ﻣﺮﺓ ﺃﺧﺮﻯ ﺃﻡ ﻻ‪.‬‬
‫‪ expression3‬ﳝﺜﻞ ﺗﻌﺒﲑ ﺍﻟﺘﺰﺍﻳﺪ ﺍﻟﺬﻱ ﻳﻘﻮﻡ ﺑﺰﻳﺎﺩﺓ ﺃﻭ ﺇﻧﻘﺎﺹ ﻗﻴﻤﺔ ﻣﺘﻐﲑ ﺍﳊﻠﻘﺔ‪.‬‬
‫♦ ﺗﺄﺧﺬ ﺍﳊﻠﻘﺔ ‪ while‬ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﺍﻟﺘﺎﱄ‪:‬‬
‫)‪while( condition‬‬
‫‪statement‬‬
‫♦ ﺗﺄﺧﺬ ﺍﳊﻠﻘﺔ ‪ do‬ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ ‪:‬‬
‫‪do‬‬
‫‪statement‬‬
‫)‪while( condition‬‬
‫♦ ﺍﳊﻠﻘﺔ ‪ do‬ﺗﻔﺤﺺ ﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺟﺴﻢ ﺍﳊﻠﻘﺔ ‪ ،‬ﻭﻋﻠﻴﻪ ﻳﺘﻢ ﺗﻜﺮﺍﺭ ﺟﺴـﻢ‬
‫ﺍﳊﻠﻘﺔ ‪ do‬ﻣﺮﺓ ﻭﺍﺣﺪﺓ ﻋﻠﻰ ﺍﻷﻗﻞ‪.‬‬
‫ﺗﺴﺘﻌﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ ‪ break‬ﻟﻠﺨﺮﻭﺝ ﻣﻦ ﺍﳊﻠﻘﺔ ﰲ ﺃﻱ ﻭﻗﺖ‪.‬‬ ‫♦‬
‫ﺗﻌﻴﺪ ﺍﻟﻌﺒﺎﺭﺓ ‪ continue‬ﺍﻟﺘﻨﻔﻴﺬ ﺇﱃ ﺑﺪﺍﻳﺔ ﺍﳊﻠﻘﺔ‪.‬‬ ‫♦‬
‫ﺗﺴﺘﻌﻤﻞ ﺍﻟﻌﺒﺎﺭﺓ ‪ switch‬ﻟﻼﺧﺘﻴﺎﺭ ﺑﲔ ﻋﺪﺓ ﺧﻴﺎﺭﺍﺕ ﳐﺘﻠﻔﺔ ﺑﻨﺎﺀﹰﺍ ﻋﻠﻰ ﻗﻴﻤﺔ ﻣﺘﻐﲑ ﻣﺎ‪.‬‬ ‫♦‬
‫ﺗﺴﺘﻌﻤﻞ ﺍﻟﻌﻮﺍﻣﻞ ﺍﳌﻨﻄﻘﻴﺔ ﻟﻜﺘﺎﺑﺔ ﺗﻌﺎﺑﲑ ﻣﺮﻛﺒﺔ ﻭﻫﻲ &&‪ || ،‬ﻭ ! ﻭﺍﻟﱵ ﺗﻌﲏ ‪،and‬‬ ‫♦‬
‫‪ or‬ﻭ ‪ not‬ﻋﻠﻰ ﺍﻟﺘﻮﺍﱄ‪.‬‬

‫‪52‬‬
‫ﺍﻷﺳﺌﻠﺔ‬
‫‪/1‬ﺍﺳﺘﻌﻤﻞ ﺍﻟﻌﺒﺎﺭﺍﺕ ﰲ ﺍﻟﺴﺆﺍﻝ ﺍﻷﻭﻝ ﻣﻦ ﺍﻟﻮﺣﺪﺓ ﺍﻟﺴﺎﺑﻘﺔ ﻟﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﻳﻘﻮﻡ‬
‫ﺑﺮﻓﻊ ﺍﳌﺘﻐﲑ ‪ x‬ﻟﻸﺱ ‪ y‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﳊﻠﻘﺔ ‪.while‬‬
‫‪ /2‬ﻣﺎ ﻫﻮ ﺍﳋﻄﺄ ﰲ ﺍﻵﰐ‪:‬‬
‫;‪cin << value‬‬
‫‪ /3‬ﻣﺎ ﻫﻮ ﺍﳋﻄﺄ ﰲ ﺍﳊﻠﻘﺔ ‪ while‬ﺍﻟﺘﺎﻟﻴﺔ‪-:‬‬
‫)‪while (z>= 0‬‬
‫;‪sum += z‬‬

‫‪/4‬ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﺴﺘﻘﺒﻞ ﻋﺪﺩ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﰒ ﳛﺪﺩ ﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﺮﻗﻢ ﺯﻭﺟﻴﹰﺎ ﺃﻡ ﻓﺮﺩﻳﹰﺎ‪.‬‬
‫)ﺗﻠﻤﻴﺢ‪ :‬ﺍﺳﺘﺨﺪﻡ ﺍﻟﻌﺎﻣﻞ )‪.((%‬‬
‫‪ /5‬ﻣﺎ ﻫﻲ ﳐﺮﺟﺎﺕ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ‪:‬‬
‫>‪#include <iostream.h‬‬
‫) ( ‪main‬‬
‫{‬
‫;‪int y, x = 1, total =0‬‬
‫{ )‪while (x<= 10‬‬
‫;‪y = x+x‬‬
‫;‪cout <<y << endl‬‬
‫;‪total +=y‬‬
‫;‪++x‬‬
‫}‬
‫;‪cout << “ total is: “ << total << endl‬‬
‫;‪return 0‬‬
‫}‬
‫‪ /6‬ﻣﻀﺮﻭﺏ ﺍﻟﻌﺪﺩ ﺍﳌﻮﺟﺐ ‪ n‬ﻳﻌﺮﻑ ﻛﺎﻵﰐ‪:‬‬
‫‪n! = n. (n –1). (n –2) …. 1‬‬
‫ﺃﻛﺘﺐ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﻳﻘﻮﻡ ﺑﺎﺳﺘﻘﺒﺎﻝ ﺭﻗﻢ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ‪ .‬ﻭﻳﻘﻮﻡ ﲝﺴﺎﺏ ﻭﻃﺒﺎﻋﺔ ﻣﻀﺮﻭﺑﻪ‪.‬‬
‫‪ /7‬ﺃﻭﺟﺪ ﺍﳋﻄﺄ ﰲ ﺍﳉﺰﺀ ﺍﻟﺘﺎﱄ‪:‬‬
‫‬ ‫)‪for ( x = 100, x >= 1, x++‬‬

‫‪53‬‬
cout << x << endl;

1 ‫ ﺇﱃ‬19 ‫ﺍﳉﺰﺀ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺰﻭﺟﻴﺔ ﻣﻦ‬ 

for ( x = 19 ; x >= 1 , x+=2)


cout << x << endl;
:‫ ﻣﺎ ﻫﻮ ﺍﻟﻐﺮﺽ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ‬/8

#include <iostream.h>
main ( )
{
int x ,y ;
cout << “Enter two integers in the range 1-20”;
cin >> x>> y;
for (int I = 1; I < = y ; I++) {
for ( int j = 1; j <= x; j++)
cout << “ “;
cout << endl;
}
return 0;
}

54
‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﺮﺍﺑﻌﺔ‬
‫‪4.0‬‬
‫ﺍﻟﺪﻭﺍﻝ ‪Functions‬‬

‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ ‪:‬‬


‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺗﻘﺴﻴﻢ ﺑﺮﻧﺎﳎﻚ ﺇﱃ ﺃﺟﺰﺍﺀ ﺻﻐﲑﺓ ﺗﺴﻤﻰ ﺩﻭﺍﻝ )‪. (Functions‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺃﻏﻠﺐ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ ﺍﳉﺎﻫﺰﺓ ﻭﺍﳌﻌﺮﻓﺔ ﰲ ﺍﳌﻠﻒ ‪ math.h‬ﻭﺍﻟﱵ ﺗﻘﻮﻡ‬
‫ﺑﺎﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺮﻳﺎﺿﻴﺔ‪.‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ ﺍﻟﺪﻭﺍﻝ ﰲ ‪. C++‬‬

‫‪55‬‬
‫ﺍﳌﻘﺪﻣﺔ‬ ‫‪4. 1‬‬

‫ﻭﺭﺛﺖ ﺍﻟﻠﻐﺔ ‪ C++‬ﻣﻦ ﺍﻟﻠﻐﺔ ‪ C‬ﻣﻜﺘﺒﺔ ﺿﺨﻤﺔ ﻭﻏﻨﻴﺔ ﺑﺪﻭﺍﻝ ﺗﻘﻮﻡ ﺑﺘﻨﻔﻴـﺬ ﺍﻟﻌﻤﻠﻴـﺎﺕ‬
‫ﺍﻟﺮﻳﺎﺿﻴﺔ‪ ،‬ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺴﻼﺳﻞ ﻭﺍﻷﺣﺮﻑ‪ ،‬ﺍﻹﺩﺧﺎﻝ ﻭﺍﻹﺧﺮﺍﺝ‪ ،‬ﺍﻛﺘﺸﺎﻑ ﺍﻷﺧﻄﺎﺀ ﻭﺍﻟﻌﺪﻳـﺪ‬
‫ﻣﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻷﺧﺮﻯ ﺍﳌﻔﻴﺪﺓ ﳑﺎ ﻳﺴﻬﻞ ﻣﻬﻤﺔ ﺍﳌﱪﻣﺞ ﺍﻟﺬﻱ ﳚﺪ ﰲ ﻫﺬﻩ ﺍﻟﺪﻭﺍﻝ ﻣﻌﻴﻨﹰﺎ ﻛﺒﲑﹰﺍ ﻟـﻪ‬
‫ﰲ ﻋﻤﻠﻴﺔ ﺍﻟﱪﳎﺔ‪.‬‬
‫ﳝﻜﻦ ﻟﻠﻤﱪﻣﺞ ﻛﺘﺎﺑﺔ ﺩﻭﺍﻝ ﺗﻘﻮﻡ ﺑﺄﺩﺍﺀ ﻋﻤﻠﻴﺎﺕ ﳛﺘﺎﺝ ﳍﺎ ﰲ ﺑﺮﺍﳎﻪ ﻭﺗﺴﻤﻰ ﻣﺜﻞ ﻫـﺬﻩ‬
‫ﺍﻟﺪﻭﺍﻝ‬
‫‪Programmer- defined functions‬‬

‫ﻓﻮﺍﺋﺪ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺪﻭﺍﻝ ﰲ ﺍﻟﱪﳎﺔ‬ ‫‪4.2‬‬

‫‪ /1‬ﺗﺴﺎﻋﺪ ﺍﻟﺪﻭﺍﻝ ﺍﳌﺨﺰﻧﺔ ﰲ ﺫﺍﻛﺮﺓ ﺍﳊﺎﺳﺐ ﻋﻠﻰ ﺍﺧﺘﺼﺎﺭ ﺍﻟﱪﻧﺎﻣﺞ ﺇﺫ ﻳﻜﺘﻔﻲ ﺑﺎﺳﺘﺪﻋﺎﺋﻬﺎ ﺑﺎﲰﻬﺎ‬
‫ﻓﻘﻂ ﻟﺘﻘﻮﻡ ﺑﺎﻟﻌﻤﻞ ﺍﳌﻄﻠﻮﺏ ‪.‬‬
‫‪ /2‬ﺗﺴﺎﻋﺪ ﺍﻟﱪﺍﻣﺞ ﺍﳌﺨﺰﻧﺔ ﰲ ﺫﺍﻛﺮﺓ ﺍﳊﺎﺳﺐ ﺃﻭ ﺍﻟﱵ ﻳﻜﺘﺒﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ ﻋﻠﻰ ﺗﻼﰱ ﻋﻤﻠﻴﺎﺕ‬
‫ﻼ ﻣﺸﺎ‪‬ﹰﺎ ﻟﻌﻤﻞ ﺗﻠﻚ ﺍﻟﺪﻭﺍﻝ‪.‬‬‫ﺍﻟﺘﻜﺮﺍﺭ ﰲ ﺧﻄﻮﺍﺕ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﱵ ﺗﺘﻄﻠﺐ ﻋﻤ ﹰ‬
‫‪ /3‬ﺗﺴﺎﻋﺪ ﺍﻟﺪﻭﺍﻝ ﺍﳉﺎﻫﺰﺓ ﰲ ﺗﺴﻬﻴﻞ ﻋﻤﻠﻴﺔ ﺍﻟﱪﳎﺔ‪.‬‬
‫‪ /4‬ﻳﻮﻓﺮ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﻣﻦ ﺍﳌﺴﺎﺣﺎﺕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬
‫‪ /5‬ﻛﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﺍﻟـ ‪ C+ +‬ﰲ ﺷﻜﻞ ﺩﻭﺍﻝ ﻭﺍﺿﺤﺔ ﺍﳌﻌﺎﱂ ﳚﻌﻞ ﺍﻟﱪﻧﺎﻣﺞ ﻭﺍﺿﺤﹰﺎ ﻟﻜﻞ ﻣﻦ‬
‫ﺍﳌﱪﻣﺞ ﻭﺍﻟﻘﺎﺭﺉ ﻋﻠﻰ ﺣﺪ ﺳﻮﺍﺀ‪.‬‬

‫ﻣﻜﺘﺒﺔ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ‬


‫‪4.3‬‬
‫)‪( Math Library Functions‬‬

‫ﲢﺘﻮﻯ ﻣﻜﺘﺒﺔ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ ﻋﻠﻰ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺪﻭﺍﻝ ﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ ﰲ ﺗﻨﻔﻴﺬ ﺍﻟﻌﻤﻠﻴﺎﺕ‬
‫ﻼ ﺍﳌﱪﻣﺞ ﺍﻟﺬﻱ ﻳﺮﻏﺐ ﰲ ﺣﺴﺎﺏ ﻭﻃﺒﺎﻋﺔ ﺍﳉﺬﺭ ﺍﻟﺘﺮﺑﻴﻌﻲ ﻟﻠﻌﺪﺩ ‪900‬‬ ‫ﺍﻟﺮﻳﺎﺿﻴﺔ ﺍﳊﺴﺎﺑﻴﺔ‪ .‬ﻓﻤﺜ ﹰ‬
‫ﻗﺪ ﻳﻜﺘﺐ ﻋﺒﺎﺭﺓ ﻛﺎﻟﺘﺎﻟﻴﺔ‪:‬‬
‫;)‪cout << sqrt ( 900‬‬

‫‪56‬‬
‫ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﺍﳌﻜﺘﺒﻴﺔ ‪ sqrt‬ﳊﺴﺎﺏ ﺍﳉـﺬﺭ ﺍﻟﺘﺮﺑﻴﻌـﻲ‬
‫ﻟﻠﻌﺪﺩ ﺑﲔ ﺍﻟﻘﻮﺳﲔ )‪ .(900‬ﻳﺴﻤﻰ ﺍﻟﻌﺪﺩ ﺑﲔ ﺍﻟﻘﻮﺳﲔ ﻭﺳﻴﻄﺔ ﺍﻟﺪﺍﻟﺔ ‪ argument‬ﻭﻋﻠﻴﻪ‬
‫ﻓﺎﻟﻌﺒﺎﺭﺓ ﺍﻟﺴﺎﺑﻘﺔ ﺗﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻟﻌﺪﺩ ‪ ، 30‬ﺗﺄﺧﺬ ﺍﻟﺪﺍﻟﺔ ‪ sqrt‬ﻭﺳﻴﻄﺔ ﻣﻦ ﺍﻟﻨـﻮﻉ ‪double‬‬
‫ﻭﺗﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻗﻴﻤﺔ ﻣﻦ ﻧﻔﺲ ﺍﻟﻨﻮﻉ ﻭﻳﻨﻄﺒﻖ ﻫﺬﺍ ﻋﻠﻰ ﲨﻴﻊ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ‪.‬‬
‫ﻋﻨﺪ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ ﰲ ﺃﻱ ﺑﺮﻧﺎﻣﺞ ﺑﻠﻐﺔ ‪ C++‬ﳚـﺐ ﺗﻀـﻤﲔ ﺍﳌﻠـﻒ ‪math.h‬‬
‫ﻭﺍﻟﺬﻱ ﳛﺘﻮﻯ ﻋﻠﻰ ﻫﺬﻩ ﺍﻟﺪﻭﺍﻝ‪.‬‬
‫ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﻠﺨﺺ ﺑﻌﺾ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ‪:‬‬
‫‪Function‬‬ ‫‪Description‬‬ ‫‪Example‬‬
‫)‪sqrt(x‬‬ ‫‪ sqrt (9.0) is 3‬ﺍﳉﺬﺭ ﺍﻟﺘﺮﺑﻴﻌﻲ ﻟـ ‪x‬‬
‫)‪exp(x‬‬ ‫‪exp(1.0) is 2.718282‬‬ ‫‪ex‬‬
‫)‪fabs(x‬‬ ‫‪ if x > 0 fabs(x) = x‬ﺍﻟﻘﻴﻤﺔ ﺍﳌﻄﻠﻘﺔ ﻟـ ‪x‬‬
‫‪= 0 fabs(x) = 0‬‬
‫‪< 0 fabs(x) = -x‬‬
‫)‪ceil(x‬‬ ‫‪ ceil(9.2) is 10.0‬ﺗﻘﺮﺏ ‪ x‬ﻷﺻﻐﺮ ﻋﺪﺩ ﺻﺤﻴﺢ ﺃﻛﱪ ﻣﻦ ‪x‬‬
‫‪ceil(-9.8) is 9.0‬‬
‫)‪floor(x‬‬ ‫‪ floor(9.2) is 9‬ﺗﻘﺮﺏ ‪ x‬ﻷﻛﱪ ﻋﺪﺩ ﺻﺤﻴﺢ ﺃﺻﻐﺮ ﻣﻦ ‪x‬‬
‫‪floor(-9.8) is –10.0‬‬

‫‪57‬‬
‫ﺍﻟﺪﻭﺍﻝ ﺍﳌﻌﺮﻓﺔ ﺑﻮﺍﺳﻄﺔ ﺍﳌﺴﺘﺨﺪﻡ‬
‫‪4.4‬‬
‫‪Programmer-defined Functions‬‬

‫ﺍﻟﺪﻭﺍﻝ ﲤﻜﻦ ﺍﳌﱪﻣﺞ ﻣﻦ ﺗﻘﺴﻴﻢ ﺍﻟﱪﻧﺎﻣﺞ ﺇﱃ ﻭﺣﺪﺍﺕ ‪ ،modules‬ﻛـﻞ ﺩﺍﻟـﺔ ﰲ‬


‫ﺍﻟﱪﻧﺎﻣﺞ ﲤﺜﻞ ﻭﺣﺪﺓ ﻗﺎﺋﻤﺔ ﺑﺬﺍ‪‬ﺎ‪ ،‬ﻭﻟﺬﺍ ﳒﺪ ﺃﻥ ﺍﳌﺘﻐﲑﺍﺕ ﺍﳌﻌﺮﻓﺔ ﰲ ﺍﻟﺪﺍﻟﺔ ﺗﻜﻮﻥ ﻣﺘﻐﲑﺍﺕ ﳏﻠﻴـﺔ‬
‫)‪ (Local‬ﻭﻧﻌﲎ ﺑﺬﻟﻚ ﺃﻥ ﺍﳌﺘﻐﲑﺍﺕ ﺗﻜﻮﻥ ﻣﻌﺮﻭﻓﺔ ﻓﻘﻂ ﺩﺍﺧﻞ ﺍﻟﺪﺍﻟﺔ‪.‬‬
‫ﺃﻏﻠﺐ ﺍﻟﺪﻭﺍﻝ ﲤﺘﻠﻚ ﻻﺋﺤﺔ ﻣﻦ ﺍﻟﻮﺳﺎﺋﻂ )‪ (Parameters‬ﻭﺍﻟـﱵ ﻫـﻲ ﺃﻳﻀـﹰﺎ‬
‫ﻣﺘﻐﲑﺍﺕ ﳏﻠﻴﺔ‪.‬‬
‫ﻫﻨﺎﻟﻚ ﻋﺪﺓ ﺃﺳﺒﺎﺏ ﺩﻋﺖ ﺇﱃ ﺗﻘﺴﻴﻢ ﺍﻟﱪﻧﺎﻣﺞ ﺇﱃ ﺩﺍﻻﺕ ﻭﺗﺴﻤﻰ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ‬
‫)‪ (Functionalizing a program‬ﻭﻫﻲ‪:‬‬
‫‪ /1‬ﺗﺴﺎﻋﺪ ﺍﻟﺪﻭﺍﻝ ﺍﳌﺨﺰﻧﺔ ﰲ ﺫﺍﻛﺮﺓ ﺍﳊﺎﺳﺐ ﻋﻠﻰ ﺍﺧﺘﺼﺎﺭ ﺍﻟﱪﻧﺎﻣﺞ ﺇﺫ ﻳﻜﺘﻔـﻲ ﺑﺎﺳـﺘﺪﻋﺎﺋﻬﺎ‬
‫ﺑﺎﲰﻬﺎ ﻓﻘﻂ ﻟﺘﻘﻮﻡ ﺑﺎﻟﻌﻤﻞ ﺍﳌﻄﻠﻮﺏ ‪.‬‬
‫‪ /2‬ﺗﺴﺎﻋﺪ ﺍﻟﱪﺍﻣﺞ ﺍﳌﺨﺰﻧﺔ ﰲ ﺫﺍﻛﺮﺓ ﺍﳊﺎﺳﺐ ﺃﻭ ﺍﻟﱵ ﻳﻜﺘﺒﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ ﻋﻠﻰ ﺗـﻼﰱ ﻋﻤﻠﻴـﺎﺕ‬
‫ﻼ ﻣﺸﺎ‪‬ﹰﺎ ﻟﻌﻤﻞ ﺗﻠﻚ ﺍﻟﺪﻭﺍﻝ‪.‬‬
‫ﺍﻟﺘﻜﺮﺍﺭ ﰲ ﺧﻄﻮﺍﺕ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﱵ ﺗﺘﻄﻠﺐ ﻋﻤ ﹰ‬
‫‪ /3‬ﺗﺴﺎﻋﺪ ﺍﻟﺪﻭﺍﻝ ﺍﳉﺎﻫﺰﺓ ﰲ ﺗﺴﻬﻴﻞ ﻋﻤﻠﻴﺔ ﺍﻟﱪﳎﺔ‪.‬‬
‫‪ /4‬ﻳﻮﻓﺮ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﻣﻦ ﺍﳌﺴﺎﺣﺎﺕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬
‫‪ /5‬ﻛﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ‪ C+ +‬ﰲ ﺷﻜﻞ ﺩﻭﺍﻝ ﻭﺍﺿﺤﺔ ﺍﳌﻌﺎﱂ ﳚﻌﻞ ﺍﻟﱪﻧﺎﻣﺞ ﻭﺍﺿﺤﹰﺎ ﻟﻜﻞ ﻣﻦ ﺍﳌﱪﻣﺞ‬
‫ﻭﺍﻟﻘﺎﺭﺉ ﻋﻠﻰ ﺣﺪ ﺳﻮﺍﺀ‪.‬‬
‫ﻛﻞ ﺍﻟﱪﺍﻣﺞ ﺍﻟﱵ ﺭﺃﻳﻨﺎﻫﺎ ﺣﱴ ﺍﻵﻥ ﲢﺘﻮﻯ ﻋﻠﻰ ﺍﻟﺪﺍﻟﺔ ‪ main‬ﻭﻫـﻲ ﺍﻟـﱵ ﺗﻨـﺎﺩﻯ‬
‫ﺍﻟﺪﻭﺍﻝ ﺍﳌﻜﺘﺒﻴﺔ ﻟﺘﻨﻔﻴﺬ ﻣﻬﺎﻣﻬﺎ‪ .‬ﺳﻨﺮﻯ ﺍﻵﻥ ﻛﻴﻒ ﻳﺴﺘﻄﻴﻊ ﺍﳌﱪﻣﺞ ﺑﻠﻐﺔ ﺍﻟـ ‪ C++‬ﻛﺘﺎﺑـﺔ ﺩﻭﺍﻝ‬
‫ﺧﺎﺻﺔ ﺑﻪ‪.‬‬

‫ﳕﻮﺫﺝ ﺍﻟﺪﺍﻟﺔ‬
‫‪4.5‬‬
‫‪Function Prototype‬‬

‫ﻋﻨﺪﻣﺎ ﻳﻮﻟﺪ ﺍﳌﺼﺮﻑ ﺗﻌﻠﻴﻤﺎﺕ ﻻﺳﺘﺪﻋﺎﺀ ﺩﺍﻟﺔ‪ ،‬ﻣﺎ ﻓﺈﻧﻪ ﳛﺘﺎﺝ ﺇﱃ ﻣﻌﺮﻓﺔ ﺍﺳـﻢ ﺍﻟﺪﺍﻟـﺔ‬
‫ﻭﻋﺪﺩ ﻭﺳﻴﻄﺎ‪‬ﺎ ﻭﺃﻧﻮﺍﻋﻬﺎ ﻭﻧﻮﻉ ﻗﻴﻤﺔ ﺍﻹﻋﺎﺩﺓ‪ ،‬ﻟﺬﺍ ﻋﻠﻴﻨﺎ ﻛﺘﺎﺑﺔ ﳕﻮﺫﺝ ﺃﻭ )ﺗﺼﺮﻳﺢ( ﻟﻠﺪﺍﻟﺔ ﻗﺒـﻞ‬
‫ﺇﺟﺮﺍﺀ ﺃﻱ ﺍﺳﺘﺪﻋﺎﺀ ﳍﺎ ﻭﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ ﻫﻮ ﺳﻄﺮ ﻭﺍﺣﺪ ﻳﺒﻠﻎ ﺍﳌﺼﺮﻑ ﻋﻦ ﺍﺳﻢ ﺍﻟﺪﺍﻟـﺔ ﻭﻋـﺪﺩ‬

‫‪58‬‬
‫ﻭﺳﻴﻄﺎ‪‬ﺎ ﻭﺃﻧﻮﺍﻋﻬﺎ ﻭﻧﻮﻉ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻌﺎﺩﺓ ﺑﻮﺍﺳﻄﺔ ﺍﻟﺪﺍﻟﺔ‪ .‬ﻳﺸﺒﻪ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ‪ ،‬ﺍﻟﺴـﻄﺮ ﺍﻷﻭﻝ ﰲ‬
‫ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ‪ ،‬ﻟﻜﻦ ﺗﻠﻴﻪ ﻓﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ‪.‬‬
‫ﻓﻤﺜﻼ ﰲ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺘﺎﱄ‪-:‬‬
‫;)‪int anyfunc(int‬‬
‫ﺍﻟﻨﻮﻉ ‪ int‬ﺑﲔ ﺍﻟﻘﻮﺳﲔ ﳜﱪ ﺍﳌﺼﺮﻑ ﺑﺄﻥ ﺍﻟﻮﺳﻴﻂ ﺍﻟﺬﻱ ﺳـﻴﺘﻢ ﲤﺮﻳـﺮﻩ ﺇﱃ ﺍﻟﺪﺍﻟـﺔ‬
‫ﺳﻴﻜﻮﻥ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ int‬ﻭ ‪ int‬ﺍﻟﱵ ﺗﺴﺒﻖ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﺗﺸﲑ ﺇﱃ ﻧﻮﻉ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻌـﺎﺩﺓ ﺑﻮﺍﺳـﻄﺔ‬
‫ﺍﻟﺪﺍﻟﺔ‪.‬‬

‫ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ‬
‫‪4.6‬‬
‫‪Function Definition‬‬
‫ﻳﺄﺧﺬ ﺗﻌﺮﻳﻒ ﺍﻟﺪﻭﺍﻝ ﰲ ‪ C++‬ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﺍﻟﺘﺎﱄ‪:‬‬
‫)‪return-value-type function-name (parameter list‬‬
‫{‬
‫‪declarations and statements‬‬
‫}‬
‫ﺣﻴﺚ‪:‬‬
‫‪ :return-value-type‬ﻧﻮﻉ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻌﺎﺩﺓ ﺑﻮﺍﺳﻄﺔ ﺍﻟﺪﺍﻟﺔ ﻭﺍﻟﺬﻱ ﳝﻜﻦ ﺃﻥ ﻳﻜـﻮﻥ ﺃﻱ‬
‫ﻧﻮﻉ ﻣﻦ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ‪ .C++‬ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﺪﺍﻟﺔ ﻻ ﺗﺮﺟﻊ ﺃﻱ ﻗﻴﻤﺔ ﻳﻜﻮﻥ ﻧﻮﻉ ﺇﻋﺎﺩ‪‬ﺎ ‪.void‬‬
‫‪ :function-name‬ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﻭﺍﻟﺬﻱ ﻳﺘﺒـﻊ ﰲ ﺗﺴـﻤﻴﺘﻪ ﻗﻮﺍﻋـﺪ ﺗﺴـﻤﻴﺔ ﺍﳌﻌﺮﻓـﺎﺕ‬
‫)‪.(identefiers‬‬
‫‪ :parameter list‬ﻫﻲ ﻻﺋﺤﺔ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﳌﻤﺮﺓ ﺇﱃ ﺍﻟﺪﺍﻟﺔ ﻭﻫﻲ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺧﺎﻟﻴـﺔ‬
‫)‪ (void‬ﺃﻭ ﲢﺘﻮﻯ ﻋﻠﻰ ﻭﺳﻴﻄﺔ ﻭﺍﺣﺪﺓ ﺃﻭ ﻋﺪﺓ ﻭﺳﺎﺋﻂ ﺗﻔﺼﻞ ﺑﻴﻨﻬﺎ ﻓﺎﺻﻠﺔ ﻭﳚﺐ ﺫﻛﺮ ﻛـﻞ‬
‫ﻭﺳﻴﻄﺔ ﻋﻠﻰ ﺣﺪﺓ‪.‬‬
‫‪ :declarations and statements‬ﲤﺜﻞ ﺟﺴﻢ ﺍﻟﺪﺍﻟﺔ ﻭﺍﻟﺬﻱ ﻳﻄﻠﻖ ﻋﻠﻴﻪ ﰲ ﺑﻌـﺾ‬
‫ﺍﻷﺣﻴﺎﻥ ‪ . block‬ﳝﻜﻦ ﺃﻥ ﳛﺘﻮﻯ ﺍﻟـ ‪ block‬ﻋﻠﻰ ﺇﻋﻼﻧﺎﺕ ﺍﳌﺘﻐﲑﺍﺕ ﻭﻟﻜـﻦ ﲢـﺖ ﺃﻱ‬
‫ﻇﺮﻑ ﻻ ﳝﻜﻦ ﺃﻥ ﻳﺘﻢ ﺗﻌﺮﻳﻒ ﺩﺍﻟﺔ ﺩﺍﺧﻞ ﺟﺴﻢ ﺩﺍﻟﺔ ﺃﺧﺮﻯ‪ .‬ﺍﻟﺴﻄﺮ ﺍﻷﻭﻝ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟـﺔ‬
‫ﻳﺪﻋﻰ ﺍﳌﺼﺮﺡ ‪ declarator‬ﻭﺍﻟﺬﻱ ﳛﺪﺩ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﻭﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﺗﻌﻴـﺪﻫﺎ ﺍﻟﺪﺍﻟـﺔ‬
‫ﻭﺃﲰﺎﺀ ﻭﺃﻧﻮﺍﻉ ﻭﺳﻴﻄﺎ‪‬ﺎ‪.‬‬

‫‪59‬‬
‫ﺇﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ‬
‫‪4.7‬‬
‫‪Function Call‬‬

‫ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ )ﺍﻟﺘﺴﺒﺐ ﺑﺘﻨﻔﻴﺬﻫﺎ ﻣﻦ ﺟﺰﺀ ﺁﺧﺮ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟـﱵ‬
‫ﺗﻔﻌﻞ ﺫﻟﻚ ﻫﻲ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ( ﻳﺆﺩﻯ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﺇﱄ ﺍﻧﺘﻘﺎﻝ ﺍﻟﺘﻨﻔﻴﺬ ﺇﱄ ﺑﺪﺍﻳﺔ ﺍﻟﺪﺍﻟﺔ‪.‬‬
‫ﳝﻜﻦ ﲤﺮﻳﺮ ﺑﻌﺾ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺇﱃ ﺍﻟﺪﺍﻟﺔ ﻋﻨﺪ ﺍﺳﺘﺪﻋﺎﺋﻬﺎ ﻭﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻟﺪﺍﻟﺔ ﻳﻌﻮﺩ ﺍﻟﺘﻨﻔﻴﺬ ﻟﻠﻌﺒـﺎﺭﺓ‬
‫ﺍﻟﱵ ﺗﻠﻲ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ‪.‬‬
‫ﻗﻴﻢ ﺍﻹﻋﺎﺩﺓ‬
‫‪4.8‬‬
‫‪Returned Values‬‬

‫ﺑﺈﻣﻜﺎﻥ ﺍﻟﺪﺍﻟﺔ ﺃﻥ ﺗﻌﻴﺪ ﻗﻴﻢ ﺇﱄ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟﱵ ﺍﺳﺘﺪﻋﺘﻬﺎ‪ .‬ﻭﳚﺐ ﺃﻥ ﻳﺴﺒﻖ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ‬
‫ﰲ ﻣﻌﺮﻓﻬﺎ ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﺪﺍﻟﺔ ﻻ ﺗﻌﻴﺪ ﺷﻴﺌﹰﺎ ﳚﺐ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳـﻴﺔ ‪ void‬ﻛﻨـﻮﻉ‬
‫ﺇﻋﺎﺩﺓ ﳍﺎ ﻟﻺﺷﺎﺭﺓ ﺇﱄ ﺫﻟﻚ ‪.‬‬
‫ﻫﻨﺎﻟﻚ ﺛﻼﺙ ﻃﺮﻕ ﳝﻜﻦ ‪‬ﺎ ﺇﺭﺟﺎﻉ ﺍﻟﺘﺤﻜﻢ ﺇﱃ ﺍﻟﻨﻘﻄﺔ ﺍﻟﱵ ﰎ ﻓﻴﻬﺎ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ‪:‬‬
‫‪ / 1‬ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﺪﺍﻟﺔ ﻻ ﺗﺮﺟﻊ ﻗﻴﻤﺔ ﻳﺮﺟﻊ ﺍﻟﺘﺤﻜﻢ ﺗﻠﻘﺎﺋﻴﹰﺎ ﻋﻨﺪ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ‪‬ﺎﻳﺔ ﺍﻟﺪﺍﻟﺔ‬
‫‪ / 2‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﺒﺎﺭﺓ ;‪return‬‬
‫‪ / 3‬ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﺪﺍﻟﺔ ﺗﺮﺟﻊ ﻗﻴﻤﺔ ﻓﺎﻟﻌﺒﺎﺭﺓ ;‪ return expression‬ﺗﻘﻮﻡ ﺑﺈﺭﺟﺎﻉ ﻗﻴﻤﺔ‬
‫ﺍﻟﺘﻌﺒﲑ ‪ expression‬ﺇﱃ ﺍﻟﻨﻘﻄﺔ ﺍﻟﱵ ﺍﺳﺘﺪﻋﺘﻬﺎ ‪.‬‬
‫ﺧﺬ ﺑﺮﻧﺎﳎﹰﺎ ﻳﺴﺘﺨﺪﻡ ﺩﺍﻟﺔ ﺗﺪﻋﻰ ‪ square‬ﳊﺴﺎﺏ ﻣﺮﺑﻌﺎﺕ ﺍﻷﻋﺪﺍﺩ ﻣﻦ ‪ 1‬ﺇﱃ ‪.10‬‬
‫ﻣﺜﺎﻝ‪:‬‬
‫‪//Program 4-1:‬‬
‫>‪#include<iostream.h‬‬
‫‪int square(int);//function prototype‬‬
‫)(‪main‬‬
‫{‬
‫)‪for(int x=1;x<=10;x++‬‬
‫;" "<<)‪cout<<square(x‬‬
‫;‪cout<<endl‬‬
‫}‬
‫‪//now function definition‬‬
‫)‪int square(int y‬‬

‫‪60‬‬
‫{‬
‫;‪return y*y‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻜﻮﻥ ﻛﺎﻵﰐ‪:‬‬

‫‪1‬‬ ‫‪4‬‬ ‫‪9‬‬ ‫‪16‬‬ ‫‪25‬‬ ‫‪36‬‬ ‫‪49‬‬ ‫‪64‬‬ ‫‪81‬‬ ‫‪100‬‬

‫ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ‪ square‬ﺩﺍﺧﻞ ﺍﻟﺪﺍﻟﺔ ‪ main‬ﻭﺫﻟﻚ ﺑﻜﺘﺎﺑـﺔ )‪.square(x‬‬


‫ﺗﻘﻮﻡ ﺍﻟﺪﺍﻟﺔ ‪ square‬ﺑﻨﺴﺦ ﻗﻴﻤﺔ ‪ x‬ﰲ ﺍﻟﻮﺳﻴﻂ ‪ . y‬ﰒ ﺗﻘﻮﻡ ﲝﺴﺎﺏ ‪ y*y‬ﻭﻳـﺘﻢ ﺇﺭﺟـﺎﻉ‬
‫ﺍﻟﻨﺘﻴﺠﺔ ﺇﱃ ﺍﻟﺪﺍﻟﺔ ‪ main‬ﻣﻜﺎﻥ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ‪ ،square‬ﺣﻴﺚ ﻳﺘﻢ ﻋﺮﺽ ﺍﻟﻨﺘﻴﺠﺔ ﻭﺗﺘﻜـﺮﺭ‬
‫ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﻋﺸﺮ ﻣﺮﺍﺕ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺣﻠﻘﺔ ﺍﻟﺘﻜﺮﺍﺭ ‪. for‬‬
‫ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ) (‪ square‬ﻳﺪﻝ ﻋﻠﻰ ﺃ‪‬ﺎ ﺗﺘﻮﻗﻊ ﻭﺳﻴﻄﺔ ﻣﻦ ﺍﻟﻨـﻮﻉ ‪ . int‬ﻭ ‪int‬‬
‫ﺍﻟﱵ ﺗﺴﺒﻖ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﺗﺪﻝ ﻋﻠﻰ ﺃﻥ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻌﺎﺩﺓ ﻣﻦ ﺍﻟﺪﺍﻟﺔ ‪ square‬ﻫﻲ ﻣـﻦ ﺍﻟﻨـﻮﻉ ‪int‬‬
‫ﺃﻳﻀﹰﺎ ‪ .‬ﺍﻟﻌﺒﺎﺭﺓ ‪ return‬ﺗﻘﻮﻡ ﺑﺈﺭﺟﺎﻉ ﻧﺎﺗﺞ ﺍﻟﺪﺍﻟﺔ ﺇﱃ ﺍﻟﺪﺍﻟﺔ ‪.main‬‬
‫ﺍﻟﺴﻄﺮ‪:‬‬
‫)‪int square (int‬‬
‫ﻫﻮ ﳕﻮﺫﺝ ﺃﻭ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ )‪. (function prototype‬‬

‫ﺍﻟﻮﺳﻴﻄﺎﺕ‬
‫‪4.9‬‬
‫‪Parameters‬‬

‫ﺍﻟﻮﺳﻴﻄﺎﺕ ﻫﻲ ﺍﻵﻟﻴﺔ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻟﺘﻤﺮﻳﺮ ﺍﳌﻌﻠﻮﻣﺎﺕ ﻣﻦ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﺇﱄ ﺍﻟﺪﺍﻟﺔ‬


‫ﻧﻔﺴﻬﺎ ﺣﻴﺚ ﻳﺘﻢ ﻧﺴﺦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﲣﺰﻥ ﺍﻟﻘﻴﻢ ﰲ ﻣﺘﻐﲑﺍﺕ ﻣﻨﻔﺼﻠﺔ ﰲ ﺍﻟﺪﺍﻟﺔ ﺗﺘﻢ ﺗﺴـﻤﻴﺔ ﻫـﺬﻩ‬
‫ﻼ ﰲ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ ﺗﺆﺩﻯ ﺍﻟﻌﺒـﺎﺭﺓ ;)‪cout<< square(a‬‬ ‫ﺍﳌﺘﻐﲑﺍﺕ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ‪.‬ﻓﻤﺜ ﹰ‬
‫ﰲ ) (‪ main‬ﺇﱃ ﻧﺴﺦ ﺍﻟﻘﻴﻤﺔ ‪ a‬ﺇﱃ ﺍﻟﺒﺎﺭﻣﺘﺮ ‪ y‬ﺍﳌﻌﺮﻑ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ‪.‬‬

‫‪61‬‬
‫ﺍﳌﺼﻄﻠﺢ ﻭﺳﻴﻄﺎﺕ ‪ Argument‬ﻳﻌﲎ ﺍﻟﻘﻴﻢ ﺍﶈﺪﺩﺓ ﰲ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﺑﻴﻨﻤﺎ‬
‫ﻳﻌﲎ ﺍﳌﺼﻄﻠﺢ ﺑﺎﺭﻣﺘﺮﺍﺕ ‪ parameters‬ﺍﳌﺘﻐﲑﺍﺕ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﻭﺍﻟﱵ ﰎ ﻧﺴـﺦ ﺗﻠـﻚ‬
‫ﺍﻟﻘﻴﻢ ﺇﻟﻴﻬﺎ‪ ،‬ﻭﻟﻜﻦ ﻏﺎﻟﺒﹰﺎ ﻣﺎ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﳌﺼﻄﻠﺢ ﻭﺳﻴﻄﺎﺕ ﻟﻘﺼﺪ ﺍﳌﻌﻨﻴﲔ‪.‬‬
‫ﺍﻟﺸﻜﻞ )‪ (4-1‬ﻳﻮﺿﺢ ﻫﺬﺍ‪.‬‬

‫‪62‬‬
‫‪main‬‬
‫) (‪Square‬‬

‫‪i‬‬ ‫‪y‬‬
‫ﻭﺳﻴﻂ‬ ‫‪a‬‬ ‫ﺑﺎﺭﻣﺘﺮ‬
‫‪a‬‬

‫ﺷﻜﻞ )‪ (4-1‬ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﲤﺮﻳﺮ ﺍﻟﻮﺳﺎﺋﻂ ‪.‬‬

‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺴﺘﺨﺪﻡ ﺩﺍﻟﺔ ﺗﺪﻋﻰ ‪ maximum‬ﻭﺍﻟﱵ ﻧﺮﺟﻊ ﺍﻟﻌﺪﺩ ﺍﻷﻛﱪ ﺑﲔ ﺛﻼﺛﺔ‬
‫ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ‪.‬‬
‫ﻳﺘﻢ ﲤﺮﻳﺮ ﺍﻷﻋﺪﺍﺩ ﻛﻮﺳﺎﺋﻂ ﻟﻠﺪﺍﻟﺔ ﺍﻟﱵ ﲢﺪﺩ ﺍﻷﻛﱪ ﺑﻴﻨﻬﺎ ﻭﺗﺮﺟﻌﻪ ﻟﻠﺪﺍﻟﺔ ‪main‬‬
‫ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﺒﺎﺭﺓ ‪ return‬ﻭﻳﺘﻢ ﺗﻌﻴﲔ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﲤﺖ ﺇﻋﺎﺩ‪‬ﺎ ﺇﱃ ﺍﳌﺘﻐﲑ ‪ largest‬ﺍﻟﺬﻱ‬
‫ﺗﺘﻢ ﻃﺒﺎﻋﺘﻪ‪.‬‬

‫‪//Program 4-2:‬‬
‫>‪#include <iostream.h‬‬
‫;)‪int maximum (int, int, int‬‬
‫) (‪main‬‬
‫{‬
‫;‪int a, b, c‬‬
‫; " ‪cout << "Enter three integers:‬‬
‫; ‪cin >> a >> b >> c‬‬
‫;‪cout << " maximum is : " << maximum (a, b, c) << endl‬‬
‫;‪return 0‬‬
‫}‬
‫)‪int maximum (int x, int y, int z‬‬
‫{‬
‫;‪int max = x‬‬
‫)‪if (y > x‬‬
‫;‪max = y‬‬

‫‪63‬‬
if (z > max)
max = z;
//Continued
return max;
}

.17 ،85 ،22 ‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺎﻓﺘﺮﺍﺽ ﺃﻥ ﺍﳌﺴﺘﺨﺪﻡ ﻗﺪ ﺃﺩﺧﻞ ﺍﻷﺭﻗﺎﻡ‬

Enter three integers: 22 85 17


Maximum is: 85

64
‫♦ ﺭﻏﻢ ﺃ‪‬ﺎ ﻏﲑ ﺿﺮﻭﺭﻳﺔ ﺇﻻ ﺃﻧﻪ ﻳﺘﻢ ﺫﻛﺮ ﺃﲰﺎﺀ ﺍﻟﻮﺳﻴﻄﺎﺕ ﰲ ﺍﻟﺘﺼﺮﻳﺢ ﻭﻣﻦ ﻏﲑ‬
‫ﺍﻟﻀﺮﻭﺭﻱ ﺃﻥ ﺗﻜﻮﻥ ﻫﺬﻩ ﺍﻷﲰﺎﺀ ﻫﻲ ﻧﻔﺴﻬﺎ ﺍﳌﺴﺘﻌﻤﻠﺔ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ‪ .‬ﰲ ﺍﻟﻮﺍﻗﻊ‪،‬‬
‫ﻼ ﻟﻨﻔﺘﺮﺽ‬‫ﺍﳌﺼﺮﻑ ﻳﺘﺠﺎﻫﻠﻬﺎ ﻟﻜﻨﻬﺎ ﺗﻜﻮﻥ ﻣﻔﻴﺪﺓ ﺃﺣﻴﺎﻧﹰﺎ ﻟﻠﺬﻳﻦ ﻳﻘﺮﺃﻭﻥ ﺍﻟﱪﻧﺎﻣﺞ ‪ .‬ﻓﻤﺜ ﹰ‬
‫ﺃﻥ ﺍﻟﻮﺳﻴﻄﲔ ‪ x‬ﻭ ‪ y‬ﲤﺜﻼﻥ ﺇﺣﺪﺍﺛﻴﺎﺕ ﺍﻟﺸﺎﺷﺔ ﰲ ﺩﺍﻟﺔ ﺗﻔﺮﺽ ﻧﻘﻄﺔ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪.‬‬
‫]ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ[ ;)‪♦ void draw_dot (int,int‬‬
‫ﻫﺬﺍ ﺍﻟﺘﺼﺮﻳﺢ ﻛﺎﰲ ﻟﻠﻤﻌﺮﻑ ﻟﻜﻦ ﺍﳌﱪﻣﺞ ﻗﺪ ﻻ ﻳﻌﺮﻑ ﺃﻳﻬﻤﺎ ﺍﻹﺣﺪﺍﺛﻲ‬
‫ﺍﻟﺴﻴﲏ ﻭﺃﻳﻬﻤﺎ ﺍﻹﺣﺪﺍﺛﻲ ﺍﻟﺼﺎﺩﻱ‪ .‬ﻟﺬﺍ ﺳﻴﻜﻮﻥ ﻣﻔﻴﺪﹰﺍ ﻟﻮ ﻛﺘﺒﻨﺎ ‪:‬‬
‫;)‪void draw_dot (int x,int y‬‬

‫♦ ﺇﺫﺍ ﱂ ﻳﺬﻛﺮ ﺍﳌﱪﻣﺞ ﻧﻮﻉ ﺇﻋﺎﺩﺓ ﺍﻟﺪﺍﻟﺔ ﰲ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ ﻳﻔﺘﺮﺽ ﺍﳌﺼﺮﻑ ﺃﻥ ﻧﻮﻉ‬
‫ﺍﻟﺪﺍﻟﺔ ﻫﻮ ‪.int‬‬

‫♦ ﻋﺪﻡ ﻛﺘﺎﺑﺔ ﻧﻮﻉ ﺇﻋﺎﺩﺓ ﺍﻟﺪﺍﻟﺔ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺇﺫﺍ ﻛﺎﻥ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻟﺪﺍﻟﺔ ﻳﺘﻄﻠﺐ‬ ‫ﺧﻄﺄ‬
‫ﻧﻮﻉ ﺇﻋﺎﺩﺓ ﻏﲑ ‪.int‬‬
‫♦ ﺇﺭﺟﺎﻉ ﻗﻴﻤﺔ ﻣﻦ ﺩﺍﻟﺔ ﰎ ﺍﻹﻋﻼﻥ ﻋﻦ ﻧﻮﻉ ﺇﻋﺎﺩ‪‬ﺎ ‪.void‬‬

‫ﺩﻭﺍﻝ ﺑﺪﻭﻥ ﻭﺳﻴﻄﺎﺕ‬


‫‪4.10‬‬
‫‪Functions with Empty Pararmeter Lists‬‬
‫ﰲ ﻟﻐﺔ ﺍﻟـ ‪ C++‬ﺗﻜﺘﺐ ﺍﻟﺪﺍﻟﺔ ﺍﻟﱵ ﻻ ﲤﺘﻠﻚ ﻭﺳﻴﻄﺎﺕ ﺇﻣﺎ ﺑﻜﺘﺎﺑﺔ ‪ void‬ﺑﲔ‬
‫ﻼ ﺍﻹﻋﻼﻥ‬
‫ﺍﻟﻘﻮﺳﲔ ﺍﻟﺬﻳﻦ ﻳﺘﺒﻌﺎﻥ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﺃﻭ ﺗﺮﻛﻬﻤﺎ ﻓﺎﺭﻏﲔ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫;) ( ‪void print‬‬
‫ﻳﺸﲑ ﺇﱃ ﺃﻥ ﺍﻟﺪﺍﻟﺔ ‪ print‬ﻻ ﺗﺄﺧﺬ ﺃﻱ ﻭﺳﻴﻄﺎﺕ ﻭﻫﻲ ﻻ ﺗﺮﺟﻊ ﻗﻴﻤﺔ ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﺍﻟﻄﺮﻳﻘﺘﲔ ﺍﻟﻠﺘﲔ ﺗﻜﺘﺐ ‪‬ﻤﺎ ﺍﻟﺪﻭﺍﻝ ﺍﻟﱵ ﻻ ﺗﺄﺧﺬ ﻭﺳﻴﻄﺎﺕ‪:‬‬

‫‪//Program 4-3:‬‬
‫‪// Functions that take no arguments‬‬
‫>‪#include <iostream.h‬‬
‫;) ( ‪void f1‬‬

‫‪65‬‬
‫;)‪void f2 (void‬‬
‫‪//Continued‬‬
‫) (‪main‬‬
‫{‬
‫;) ( ‪f1‬‬
‫;) ( ‪f2‬‬
‫;‪return 0‬‬
‫}‬

‫) ( ‪void f1‬‬
‫{‬
‫;‪cout << "Function f1 takes no arguments" << endl‬‬
‫}‬
‫)‪void f2 (void‬‬
‫{‬
‫<< "‪cout << "Function f2 also takes no arguments‬‬
‫;‪endl‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪Function f1 takes no arguments‬‬


‫‪Function f2 also takes no arguments‬‬

‫ﺍﻟﺪﻭﺍﻝ ﺍﻟﺴﻴﺎﻗﻴﺔ‬
‫‪4.11‬‬
‫‪Inline Functions‬‬

‫ﲢﺘﺎﺝ ﺑﻌﺾ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺍﻟﱵ ﻳﻌﺘﱪ ﻓﻴﻬﺎ ﻭﻗﺖ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻣﺮﹰﺍ ﺣﻴﻮﻳﹰﺎ ﻭﺣﺎﲰـﺎﹰ‪،‬‬
‫ﻹﺑﺪﺍﻝ ﻋﻤﻠﻴﺔ ﺍﺳﺘﺪﻋﺎﺀ ﻭﺍﺳﺘﺨﺪﺍﻡ ﺩﺍﻟﺔ ﲟﺎ ﻳﺴﻤﻰ ﺩﺍﻟﺔ ﺳﻴﺎﻗﻴﺔ‪ .‬ﻭﻫﻰ ﻋﺒﺎﺭﺓ ﻋﻦ ﺷـﻔﺮﺓ ﺗﻘـﻮﻡ‬
‫ﺑﺎﻟﻌﻤﻞ ﺍﳌﻄﻠﻮﺏ ﻧﻔﺴﻪ‪ ،‬ﻳﺘﻢ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺴﻴﺎﻗﻴﺔ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻧﻔﺲ ﺍﻟﺘﺮﻛﻴﺐ ﺍﻟﻨﺤﻮﻱ ﺍﳌﺴﺘﺨﺪﻡ‬
‫ﻟﺘﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻻﻋﺘﻴﺎﺩﻳﺔ ‪ ،‬ﻟﻜﻦ ﺑﺪ ﹰﻻ ﻣﻦ ﻭﺿﻊ ﺷﻔﺮﺓ ﺍﻟﺪﺍﻟﺔ ﰲ ﻣﻜﺎﻥ ﻣﺴﺘﻘﻞ ﻳﻀﻌﻬﺎ ﺍﳌﺼـﺮﻑ‬

‫‪66‬‬
‫ ﻳﺘﻢ ﺟﻌﻞ ﺍﻟﺪﺍﻟﺔ ﺳﻴﺎﻗﻴﺔ ﻋﻦ ﻃﺮﻳـﻖ‬.‫ﰲ ﺍﻟﺴﻴﺎﻕ ﺍﻟﻄﺒﻴﻌﻲ ﻟﻠﱪﻧﺎﻣﺞ ﻣﻜﺎﻥ ﻇﻬﻮﺭ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ‬
.‫ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ‬inline ‫ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ‬

inline void func1( )


{
statements
}
‫ﺗﺴﺘﺨﺪﻡ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺴﻴﺎﻗﻴﺔ ﻓﻘﻂ ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﺪﺍﻟﺔ ﻗﺼﲑﺓ ﻭﺗﺴﺘﺨﺪﻡ ﻣﺮﺍﺕ ﻋﺪﻳﺪﺓ ﰲ‬
.‫ﺍﻟﱪﻧﺎﻣﺞ‬
:‫ﻣﺜﺎﻝ‬

//Program 4-4:
#include<iostream.h>
inline float cube(float s){return s*s*s;}
main()
{
cout<<"\nEnter the side length of your cube : ";
float side;
cin>>side;
cout<<"volume of cube is "
<<cube(side)
<<endl;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

Enter the side length of your cube : 5


volume of cube is 125

: ‫ﻣﺜﺎﻝ ﺁﺧﺮ ﻋﻠﻰ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺴﻴﺎﻗﻴﺔ‬


// Program 4-5:

67
‫>‪#include <iostream.h‬‬
‫)‪inline int mult( int a, int b‬‬
‫{‬
‫;)‪return (a*b‬‬
‫}‬
‫‪//Continued‬‬
‫) (‪main‬‬
‫{‬
‫;‪int x, y, z‬‬
‫;‪cin >> x >> y >> z‬‬
‫;‪cout << "x = " << x << " y = " << y << " z = " << z << endl‬‬
‫;‪cout << "product1" << mult (x ,y) << endl‬‬
‫;‪cout << "product2" << mult (x +2, y) << endl‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺇﺫﺍ ﺃﺩﺧﻠﻨﺎ )‪:(x = 3, y =4, z = 5‬‬

‫‪x=3‬‬ ‫‪y =4‬‬ ‫‪z=5‬‬


‫‪product1 12‬‬
‫‪product2 32‬‬

‫ﲢﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‬


‫‪4.12‬‬
‫‪Overloading Functions‬‬

‫ﲢﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻳﻌﲎ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻻﺳﻢ ﻟﻌﺪﺓ ﺩﺍﻻﺕ ﻟﻜﻦ ﻛﻞ ﺩﺍﻟـﺔ‬
‫ﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﳍﺎ ﺗﻌﺮﻳﻒ ﻣﺴﺘﻘﻞ‪ .‬ﻋﻨﺪ ﺍﺳﺘﺪﻋﺎﺀ ﺩﺍﻟﺔ ﻳﺒﺤﺚ ﺍﳌﺼﺮﻑ ﻋﻦ ﻧـﻮﻉ ﻭﺳـﻴﻄﺎﺕ‬
‫ﺍﻟﺪﺍﻟﺔ ﻭﻋﺪﺩﻫﺎ ﳌﻌﺮﻓﺔ ﺍﻟﺪﺍﻟﺔ ﺍﳌﻘﺼﻮﺩﺓ‪ .‬ﻭﻟﻜﻲ ﳝﻴﺰ ﺍﳌﺼﺮﻑ ﺑﲔ ﺩﺍﻟﺔ ﻭﺃﺧﺮﻯ ﲢﻤﻞ ﻧﻔﺲ ﺍﻻﺳﻢ‪،‬‬
‫ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺗﻌﺮﻑ ﺑﺘﺸﻮﻳﻪ ﺍﻷﲰﺎﺀ )‪ ،(names mangling‬ﺗﺘﺄﻟﻒ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﻣﻦ ﺇﻧﺸﺎﺀ‬
‫ﺍﺳﻢ ﺟﺪﻳﺪ ﺧﺎﺹ ﺑﺎﳌﺼﺮﻑ ﻋﻦ ﻃﺮﻳﻖ ﺩﻣﺞ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﻣﻊ ﺃﻧﻮﺍﻉ ﻭﺳﻴﻄﺎ‪‬ﺎ‪.‬‬

‫‪68‬‬
:‫ﻣﺜﺎﻝ‬
int ‫ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﳊﺴﺎﺏ ﺍﳉﺬﺭ ﺍﻟﺘﺮﺑﻴﻌﻲ ﻟﻠﻨﻮﻉ‬square ‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﺍﻟﺪﺍﻟﺔ‬
-: double ‫ﻭﻟﻠﻨﻮﻉ‬
//Program 4-6:
#include <iostream.h>
int square(int x){return x*x;}
//Continued
double square(double y){return y*y;}
main ()
{
cout<< " The square of integer 7 is"
<<" "<<square(7)<< endl
<<"The square of double 7.5 is"
<<" "<<square(7.5)<< endl;
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

The square of integer 7 is 49


The square of double 7.5 is 56.25

int ‫ ﳊﺴﺎﺏ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻄﻠﻘﺔ ﻷﻋﺪﺍﺩ ﻣﻦ ﺍﻟﻨﻮﻉ‬abs ‫ﺇﻟﻴﻚ ﺍﻵﻥ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﺩﺍﻟﺔ ﺗﺪﻋﻰ‬
.long ‫ ﻭ‬double ،

//Program 4-7:
#include <iostream.h>
// abs is overloaded three ways
int abs (int i);
double abs(double d);
long abs(long l);

69
int main( )
{
cout<< abs (-10)<<"\n";
cout<< abs (-11.0)<<"\n";
cout<< abs (-9L)<<"\n";
return 0;
}
int abs (int i)
//Continued
{
cout<<"using integer abs( )\n";
return i<0 ? -i :i ;
}
double abs (double d)
{
cout<<" using double abs( )\n";
return d<0.0 ? -d : d ;
}
long abs(long l)
{
cout<<" using long abs( )\n";
return l<0.0 ? -l : l ;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬
using integer abs( )
10
using double abs( )
11.0
using long abs( )
9L

70
‫ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ‬
‫‪4.13‬‬
‫‪Default Arguments‬‬

‫ﺗﺘﻴﺢ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﲡﺎﻫﻞ ﻭﺳﻴﻄﺔ ﺃﻭ ﺃﻛﺜﺮ ﻋﻨﺪ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ‪ ،‬ﻭﻋﻨﺪ‬
‫ﻭﺟﻮﺩ ﻭﺳﻴﻄﺔ ﻧﺎﻗﺼﺔ ﻳﺰﻭﺩ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ ﻗﻴﻤﹰﺎ ﺛﺎﺑﺘﺔ ﻟﺘﻠﻚ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﳌﻔﻘﻮﺩﺓ ‪.‬‬
‫ﻣﺜﺎﻝ‪-:‬‬

‫‪//Program 4-8:‬‬
‫>‪#include <iostream.h‬‬
‫)‪inline box_volume (int length=1,int width=1,int height=1‬‬
‫};‪{return length*width*height‬‬
‫)(‪main‬‬
‫{‬
‫" ‪cout<<"The default box volume is‬‬
‫‪<<box_volume() <<endl‬‬
‫" ‪<<"width 1 and height 1 is‬‬
‫;‪<<box_volume(10)<<endl‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬
‫‪The default box volume is 1‬‬
‫‪Width 1 and height1 is 10‬‬

‫ﰎ ﺍﺳﺘﻌﻤﺎﻝ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ ﻟﺘﺰﻭﻳﺪ ﺍﻟﺪﺍﻟﺔ ‪ box_volume‬ﺑﺜﻼﺙ ﻭﺳﻴﻄﺎﺕ ﺍﻓﺘﺮﺍﺿﻴﺔ‬


‫ﻭﲢﺪﺩ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﺗﻠﻲ ﻋﻼﻣﺔ ﺍﳌﺴﺎﻭﺍﺓ ﻗﻴﻤﺔ ﻫﺬﻩ ﺍﻟﻮﺳﻴﻄﺎﺕ ﻭﻫﻰ ‪ 1‬ﻟﻜﻞ ﻭﺳﻴﻄﺔ ‪.‬‬
‫ﻳﺴﺘﺪﻋﻰ ﺍﻟﱪﻧﺎﻣﺞ ﰲ ‪ main‬ﺍﻟﺪﺍﻟﺔ ‪ box_volume‬ﺑﻄﺮﻳﻘﺘﲔ‪-:‬‬
‫ﺃﻭ ﹰﻻ‪ :‬ﺑﺪﻭﻥ ﻭﺳﻴﻄﺎﺕ ﻟﺬﺍ ﰎ ﺍﺣﺘﺴﺎﺏ ‪ box_volume‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻘﻴﻢ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ‬
‫ﻟﻠﻮﺳﻴﻄﺎﺕ ﻟﺘﻌﻴﺪ ﺍﻟﺪﺍﻟﺔ ﺍﻟﻘﻴﻤﺔ ‪ 1‬ﻛﺤﺠﻢ ﻟﻠﻤﺮﺑﻊ‪.‬‬
‫ﺛﺎﻧﻴﹰﺎ ‪ :‬ﺑﻮﺳﻴﻄﺔ ﻭﺍﺣﺪﺓ ﻭﻫﻰ ‪ 10‬ﻟﺘﻌﻴﺪ ﺍﻟﺪﺍﻟﺔ ‪ 10‬ﺣﺠﻢ ﻟﻠﻤﺮﺑﻊ ‪ ،‬ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ = ‪length‬‬
‫‪.10‬‬

‫‪71‬‬
‫ﺍﻟﺸﻜﻞ )‪ (4-2‬ﻳﺒﲔ ﻛﻴﻒ ﻳﺰﻭﺩ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ‪:‬‬

‫;)‪Box volume(int length=1, int width=1,int height=1‬‬

‫)‪Box volume(10,1,1‬‬

‫;)‪cout << box volume(10‬‬

‫ﺷﻜﻞ )‪ (4-2‬ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﺗﺰﻭﻳﺪ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ‬

‫ﻓﻘﻂ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ‪‬ﺎﻳﺔ ﻻﺋﺤﺔ ﺍﻟﻮﺳﻴﻄﺎﺕ ﳝﻜﻦ ﺇﻋﻄﺎﺅﻫﺎ ﻭﺳﻴﻄﺎﺕ ﺍﻓﺘﺮﺍﺿﻴﺔ ‪،‬ﻓﺈﺫﺍ ﻛﺎﻧﺖ ﻫﻨﺎﻟﻚ ﻭﺳﻴﻄﺔ‬

‫ﻭﺍﺣﺪﺓ ﻓﻘﻂ ﳍﺎ ﻭﺳﻴﻄﺔ ﺍﻓﺘﺮﺍﺿﻴﺔ ﳚﺐ ﺃﻥ ﺗﻜﻮﻥ ﺍﻷﺧﲑﺓ ﻭﻻ ﳝﻜﻨﻨﺎ ﻭﺿﻊ ﻭﺳﻴﻄﺔ ﺍﻓﺘﺮﺍﺿﻴﺔ ﰲ ﻭﺳﻂ ﻻﺋﺤﺔ ﻭﺳﻴﻄﺎﺕ ﻋﺎﺩﻳـﺔ‬

‫ﲟﻌﲎ ﺁﺧﺮ ﻻ ﳝﻜﻨﻨﺎ ﻛﺘﺎﺑﺔ‬

‫;)‪int box_volume(int length, int width=1,int height‬‬


‫ﻷﻥ ﺍﻟﻮﺳﻴﻄﺔ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﻟﻴﺴﺖ ﺍﻟﻮﺳﻴﻄﺔ ﺍﻷﺧﲑﺓ‪.‬‬

‫ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﻟﻘﻴﻤﺔ ﻭﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﳌﺮﺟﻊ‬ ‫‪4.14‬‬

‫ﻟﻨﻔﺮﺽ ﺃﻧﻨﺎ ﻟﺪﻳﻨﺎ ﻣﺘﻐﲑﻳﻦ ﺻﺤﻴﺤﲔ ﰲ ﺑﺮﻧﺎﻣﺞ ﻭﻧﺮﻳﺪ ﺍﺳﺘﺪﻋﺎﺀ ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﺑﺘﺒﺪﻳﻞ ﻗﻴﻤﱵ‬
‫ﺍﻟﺮﻗﻤﲔ ‪،‬ﻟﻨﻔﺮﺽ ﺃﻧﻨﺎ ﻋﺮﻓﻨﺎ ﺍﻟﺮﻗﻤﲔ ﻛﺎﻵﰐ‪:‬‬
‫;‪int x=1‬‬
‫;‪int y=2‬‬

‫ﺃ‪ /‬ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﻟﻘﻴﻤﺔ)‪-:( pass-by-value‬‬


‫ﺗﺮﻯ ﻫﻞ ﺗﻘﻮﻡ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺘﺎﻟﻴﺔ ﺑﺘﺒﺪﻳﻞ ﺍﻟﻘﻴﻤﺘﲔ‪:‬‬
‫)‪void swap (int a, int b‬‬
‫{‬

‫‪72‬‬
‫;‪int temp =a‬‬
‫‪a=b.‬‬
‫;‪b=temp‬‬
‫}‬
‫ﺗﻘﻮﻡ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺑﺘﺒﺪﻳﻞ ﻗﻴﻤﱵ ‪ a‬ﻭ ‪ ، b‬ﻟﻜﻦ ﺇﺫﺍ ﺍﺳﺘﺪﻋﻴﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻛﺎﻵﰐ‪:‬‬
‫;)‪swap( x,y‬‬
‫ﺳﻨﺠﺪ ﺃﻥ ﻗﻴﻤﱵ ‪ x‬ﻭ ‪ y‬ﱂ ﺗﺘﻐﲑ ﻭﺫﻟﻚ ﻷﻥ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﻻﻋﺘﻴﺎﺩﻳﺔ ﻟﻠﺪﺍﻟﺔ ﻳﺘﻢ ﲤﺮﻳﺮﻫﺎ‬
‫ﺑﺎﻟﻘﻴﻤﺔ ﻭﺗﻨﺸﺊ ﺍﻟﺪﺍﻟﺔ ﻣﺘﻐﲑﺍﺕ ﺟﺪﻳﺪﺓ ﻛﻠﻴﹰﺎ ﻫﻲ ‪ a‬ﻭ ‪ b‬ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﻟﺘﺨﺰﻳﻦ ﺍﻟﻘـﻴﻢ ﺍﳌﻤـﺮﺭﺓ‬
‫ﺇﻟﻴﻬﺎ ﻭﻫﻲ )‪ (1,2‬ﰒ ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﻠﻚ ﺍﳌﺘﻐﲑﺍﺕ ﺍﳉﺪﻳﺪﺓ ﻭﻋﻠﻴﻪ ﻋﻨﺪﻣﺎ ﺗﻨﺘﻬﻲ ﺍﻟﺪﺍﻟﺔ ﻭﺭﻏﻢ ﺃ‪‬ـﺎ‬
‫ﻗﺎﻣﺖ ﺑﺘﻐﻴﲑ ‪ a‬ﺇﱃ ‪ 2‬ﻭ ‪ b‬ﺇﱃ ‪ 1‬ﻟﻜﻦ ﺍﳌﺘﻐﲑﺍﺕ ‪ x‬ﻭ ‪ y‬ﰲ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﱂ ﺗﺘﻐﲑ‪.‬‬
‫ﺏ‪ /‬ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﳌﺮﺟﻊ)‪:(pass-by-refrence‬‬
‫ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﳌﺮﺟﻊ ﻫﻮ ﻃﺮﻳﻘﺔ ﲤﻜﻦ ﺍﻟﺪﺍﻟﺔ ) (‪ swap‬ﻣﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﳌﺘﻐﲑﺍﺕ ﺍﻷﺻﻠﻴﺔ‬
‫‪ x‬ﻭ ‪ y‬ﻭﺍﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ﺑﺪ ﹰﻻ ﻣﻦ ﺇﻧﺸﺎﺀ ﻣﺘﻐﲑﺍﺕ ﺟﺪﻳﺪﺓ ‪ .‬ﻭﻹﺟﺒﺎﺭ ﲤﺮﻳﺮ ﺍﻟﻮﺳـﻴﻄﺔ ﺑـﺎﳌﺮﺟﻊ‬
‫ﻧﻀﻴﻒ ﺍﳊﺮﻑ & ﺇﱃ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﺍﻟﻮﺳﻴﻄﺔ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﻭﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ ‪.‬‬
‫ﺍﳌﺜﺎﻝ )‪ (4-3‬ﻳﺒﲔ ﻛﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ ﺍﻟﺪﺍﻟﺔ ‪ swap‬ﻭﲤﺮﻳﺮ ﻭﺳﻴﻄﺎ‪‬ﺎ ﺑﺎﳌﺮﺟﻊ‪:‬‬

‫‪//Program 4-9:‬‬
‫>‪#include <iostream.h‬‬
‫;)&‪void swap (int & , int‬‬
‫) ( ‪main‬‬
‫{‬
‫;‪int x= 1‬‬
‫;‪int y= 2‬‬
‫;)‪swap (x, y‬‬
‫;‪return 0‬‬
‫}‬
‫)‪void swap (int& a, int & b‬‬
‫{‬
‫;‪cout <<"Original value of a is " << a<<endl‬‬
‫;‪int temp =a‬‬
‫;‪a=b‬‬
‫;‪b=temp‬‬

‫‪73‬‬
‫;‪cout <<"swapped value of a is " << a<<endl‬‬
‫}‬

‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺗﺘﻐﲑ ﻗﻴﻤﺔ ‪ x‬ﺇﱃ ‪ 2‬ﻭ ‪ y‬ﺇﱃ ‪ . 1‬ﻭﻳﻜﻮﻥ ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬
‫ﻛﺎﻟﺘﺎﱄ‪:‬‬

‫‪Original value of a is 1‬‬


‫‪Swapped value of a is 2‬‬

‫ﺍﳊﺮﻑ & ﻳﻠﻲ ‪ int‬ﰲ ﺍﻟﺘﺼﺮﻳﺢ ﻭﺍﻟﺘﻌﺮﻳﻒ ﻭﻫﻮ ﻳﺒﻠﻎ ﺍﳌﺼﺮﻑ ﺃﻥ ﳝﺮﺭ ﻫﺬﻩ‬
‫ﺍﻟﻮﺳﻴﻄﺎﺕ ﺑﺎﳌﺮﺟﻊ‪ ،‬ﺃﻱ ﺃﻥ ﺍﻟﻮﺳﻴﻄﺔ ‪ a‬ﻫﻲ ﻣﺮﺟﻊ ﺇﱃ ‪ x‬ﻭ ‪ b‬ﻫﻲ ﻣﺮﺟﻊ ﺇﱃ ‪ y‬ﻭﻻ‬
‫ﻳﺴﺘﻌﻤﻞ & ﰲ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ‪.‬‬

‫ﺍﻟﺸﻜﻞ )‪(4-3‬ﻳﺒﲔ ﺍﻟﻔﺮﻕ ﺑﲔ ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﳌﺮﺟﻊ ﻭﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﻟﻘﻴﻤﺔ‪.‬‬

‫ﺑﻌﺪ ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﻟﻘﻴﻤﺔ‬ ‫ﻗﺒﻞ ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﻟﻘﻴﻤﺔ‬


‫‪b‬‬ ‫‪a‬‬ ‫‪b‬‬ ‫‪a‬‬

‫‪1‬‬ ‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬


‫‪y‬‬ ‫‪x‬‬ ‫‪y‬‬ ‫‪x‬‬
‫‪2‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪1‬‬

‫ﺑﻌﺪ ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﳌﺮﺟﻊ‬ ‫ﻗﺒﻞ ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﳌﺮﺟﻊ‬


‫‪b‬‬ ‫‪a‬‬ ‫‪b‬‬ ‫‪a‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬
‫‪x‬‬ ‫‪y‬‬ ‫‪y‬‬ ‫‪x‬‬

‫ﺷﻜﻞ )‪ (4-3‬ﻳﻮﺿﺢ ﻃﺮﻳﻘﱵ ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﳌﺮﺟﻊ ﻭﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﻟﻘﻴﻤﺔ‪.‬‬

‫‪74‬‬
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﺃﻓﻀﻞ ﻃﺮﻳﻘﺔ ﻟﺘﻄﻮﻳﺮ ﻭﺻﻴﺎﻧﺔ ﺍﻟﱪﺍﻣﺞ ﺍﻟﻜﺒﲑﺓ ﻫﻮ ﺗﻘﺴﻴﻤﻬﺎ ﻟﻮﺣﺪﺍﺕ ﺻﻐﲑﺓ ﺗﺴﻤﻰ‬
‫ﺩﻭﺍﻝ‪.‬‬
‫♦ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻟﺪﻭﺍﻝ ﻋﻦ ﻃﺮﻳﻖ ﺍﺳﺘﺪﻋﺎﺋﻬﺎ ‪.‬‬
‫♦ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﻳﻜﻮﻥ ﺑﻜﺘﺎﺑﺔ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﻣﺘﺒﻮﻋﹰﺎ ﺑﻮﺳﻴﻄﺎ‪‬ﺎ ﻭﺃﻧﻮﺍﻉ ﺗﻠﻚ ﺍﻟﻮﺳﺎﺋﻂ‪.‬‬
‫♦ ﺍﻟﺼﻮﺭﺓ ﺍﻟﻌﺎﻣﺔ ﻟﺘﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﻫﻮ‪-:‬‬
‫)‪return-value-type function-name( parameters-list‬‬
‫{‬
‫‪declarations and statements‬‬
‫}‬
‫ﺣﻴﺚ‪-:‬‬
‫‪ type-value-return‬ﳝﺜﻞ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺬﻱ ﺗﻌﻴﺪﻩ ﺍﻟﺪﺍﻟﺔ ‪ ،‬ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﺪﻻﻟﺔ ﻻ‬
‫ﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻳﻜﻮﻥ ‪.void‬‬
‫‪ function name‬ﳝﺜﻞ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﻭﻳﺘﺒﻊ ﰲ ﺗﺴﻤﻴﺘﻪ ﻗﻮﺍﻋﺪ ﺗﺴﻤﻴﺔ ﺍﳌﺘﻐﲑﺍﺕ ‪.‬‬
‫‪ parameters_list‬ﻫﻲ ﻻﺋﺤﺔ ﻣﻦ ﺍﳌﺘﻐﲑﺍﺕ ﺗﻔﺼﻠﻬﺎ ﻓﺎﺻﻠﺔ ﻭﲤﺜﻞ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﻟﱵ‬
‫ﺳﻴﺘﻢ ﲤﺮﻳﺮﻫﺎ ﺇﱃ ﺍﻟﺪﺍﻟﺔ‪.‬‬
‫♦ ﳕﻮﺫﺝ ﺃﻭ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ )‪ (function prototype‬ﳝﻜﻦ ﺍﳌﺼﺮﻑ ﻣﻦ‬
‫ﻣﻌﺮﻓﺔ ﻣﺎ ﺇﺫﺍ ﰎ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﺑﺎﻟﺼﻮﺭﺓ ﺍﻟﺼﺤﻴﺤﺔ‪.‬‬
‫♦ ﻳﺘﺠﺎﻫﻞ ﺍﳌﺼﺮﻑ ﺃﲰﺎﺀ ﺍﳌﺘﻐﲑﺍﺕ ﺍﳌﺬﻛﻮﺭﺓ ﰲ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ‪.‬‬
‫♦ ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻧﻔﺲ ﺍﻻﺳﻢ ﻟﻌﺪﺓ ﺩﺍﻻﺕ ‪ ،‬ﻟﻜﻦ ﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﻟﻜﻞ ﺩﺍﻟﺔ ﺗﻌﺮﻳﻒ‬
‫ﻣﺴﺘﻘﻞ ﻭﻳﺴﻤﻰ ﻫﺬﺍ ﺑﺘﺤﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ‪(function‬‬
‫)‪.overloading‬‬
‫♦ ﺗﺴﻤﺢ ‪ C++‬ﺑﺘﻤﺮﻳﺮ ﻭﺳﻴﻄﺎﺕ ﺍﻓﺘﺮﺍﺿﻴﺔ ﻭﻋﻠﻴﻪ ﻋﻨﺪ ﲡﺎﻫﻞ ﻭﺳﻴﻄﺔ ﺃﻭ ﺃﻛﺜﺮ ﰲ‬
‫ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﻳﺰﻭﺩ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ ﻗﻴﻢ ﺗﻠﻚ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﳌﻔﻘﻮﺩﺓ‪.‬‬

‫‪75‬‬
‫‪1‬‬
‫ﺍﻷﺳﺌﻠﺔ‬
‫‪ /1‬ﺃﻛﺘﺐ ﺗﺼﺮﳛﹰﺎ )‪ (prototype‬ﻟﺪﺍﻟﺔ ‪ smallest‬ﻭﺍﻟﱵ ﺗﺄﺧﺬ ﺛﻼﺙ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ‬
‫‪ y ، x‬ﻭ ‪ z‬ﻛﻮﺳﻴﻄﺎﺕ ﳍﺎ ﻭﺗﺮﺟﻊ ﻗﻴﻤﺔ ﻣﻦ ﺍﻟﻨﻮﻉ ‪.int‬‬

‫‪ /2‬ﺃﻛﺘﺐ ﺗﻌﺮﻳﻔﹰﺎ ﻟﺪﺍﻟﺔ ﺗﺮﺟﻊ ﺍﻷﻛﱪ ﻣﻦ ﺑﲔ ﺛﻼﺛﺔ ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ‪.‬‬

‫‪ /3‬ﺃﻛﺘﺐ ﺗﻌﺮﻳﻔﹰﺎ ﻟﺪﺍﻟﺔ ﲢﺪﺩ ﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﺮﻗﻢ ﺭﻗﻤﹰﺎ ﺃﻭﻟﻴﹰﺎ ﺃﻡ ﻻ‪.‬‬
‫ﺗﻠﻤﻴﺢ‪ :‬ﺍﻟﺮﻗﻢ ﺍﻷﻭﱃ ﻫﻮ ﺍﻟﺬﻱ ﻻ ﻳﻘﺒﻞ ﺍﻟﻘﺴﻤﺔ ﺇﻻ ﻋﻠﻰ ﻧﻔﺴﻪ ﻭﺍﻟﺮﻗﻢ ‪.1‬‬

‫‪ /4‬ﺟﺪ ﺍﳋﻄﺄ ﰲ ﺍﻟﺪﺍﻟﺔ ﺍﻵﺗﻴﺔ‪:‬‬


‫( ‪void product‬‬ ‫{ )‬
‫;‪int a, b, c, result‬‬
‫;“ ‪cout << “ Enter three integers:‬‬
‫;‪cin >> a>> b >>c‬‬
‫;‪result = a*b*c‬‬
‫;‪cout << “Result is : “ << result‬‬
‫;‪return result‬‬
‫}‬
‫‪ /5‬ﺟﺪ ﺍﳋﻄﺄ ﰲ ﺍﻟﺪﺍﻟﺔ ﺍﻵﺗﻴﺔ‪-:‬‬
‫{ ;)‪void f(float a‬‬

‫;‪cout << a << endl‬‬


‫}‬

‫‪ /6‬ﺃﻛﺘﺐ ﺗﺼﺮﳛﹰﺎ ﻟﺪﺍﻟﺔ ﺗﺪﻋﻰ ‪ instructions‬ﻭﺍﻟﱵ ﻻ ﺗﺄﺧﺬ ﺃﻱ ﻭﺳﻴﻄﺎﺕ ﻭﻻ ﺗﺮﺟﻊ‬


‫ﺃﻱ ﻗﻴﻤﺔ‪.‬‬

‫ﻼ ﺇﺫﺍ‬
‫‪ /7‬ﺃﻛﺘﺐ ﺗﻌﺮﻳﻔﹰﺎ ﻟﺪﺍﻟﺔ ﺗﺴﺘﻘﺒﻞ ﻋﺪﺩﹰﺍ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﰒ ﺗﺮﺟﻊ ﺍﻟﻌﺪﺩ ﻣﻌﻜﻮﺳﹰﺎ ﻓﻤﺜ ﹰ‬
‫ﺃﺩﺧﻞ ﺍﳌﺴﺘﺨﺪﻡ ﺍﻟﻌﺪﺩ ‪ 1234‬ﺗﺮﺟﻊ ﺍﻟﺪﺍﻟﺔ ﺍﻟﻌﺪﺩ ‪.4321‬‬

‫‪76‬‬
‫ﺍﻟﻮﺣﺪﺓ ﺍﳋﺎﻣﺴﺔ‬
‫‪5.0‬‬
‫ﺍﳌﺼﻔﻮﻓﺎﺕ ﻭﺍﳌﺆﺷﺮﺍﺕ ‪Arrays & Pointers‬‬

‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪:‬‬


‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺑﻨﻴﺔ ﺍﳌﺼﻔﻮﻓﺎﺕ )‪. (Arrays‬‬
‫ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﻹﻋﻼﻥ ﻋﻦ ﻭﲤﻬﻴﺪ ﻭﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺃﻱ ﻋﻨﺼﺮ ﻣﻦ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ ‪.‬‬ ‫♦‬
‫ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺍﳌﺼﻔﻮﻓﺎﺕ ﻣﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ‪.‬‬ ‫♦‬
‫ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﺍﳌﺆﺷﺮﺍﺕ )‪. (Pointers‬‬ ‫♦‬
‫ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻣﺼﻔﻮﻓﺎﺕ ﺍﻟﺴﻼﺳﻞ‪.‬‬ ‫♦‬

‫‪77‬‬
‫ﻣﻘﺪﻣﺔ‬ ‫‪5.1‬‬

‫ﺍﳌﺼﻔﻮﻓﺔ ﻫﻲ ﻧﻮﻉ ﻣﻦ ﺃﻧﻮﺍﻉ ﺑﻨﻴﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﳍﺎ ﻋﺪﺩ ﳏﺪﻭﺩ ﻭﻣﺮﺗﺐ ﻣـﻦ ﺍﻟﻌﻨﺎﺻـﺮ‬
‫ﻼ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﲨﻴﻌﻬﺎ ﺻﺤﻴﺤﺔ ‪ int‬ﺃﻭ ﻋﺎﺋﻤﺔ‬‫ﺍﻟﱵ ﺗﻜﻮﻥ ﲨﻴﻌﻬﺎ ﻣﻦ ﻧﻔﺲ ﺍﻟﻨﻮﻉ ‪ ،type‬ﻓﻤﺜ ﹰ‬
‫‪ float‬ﻭﻟﻜﻦ ﻻ ﳝﻜﻦ ﺍﳉﻤﻊ ﺑﲔ ﻧﻮﻋﲔ ﳐﺘﻠﻔﲔ ﰲ ﻧﻔﺲ ﺍﳌﺼﻔﻮﻓﺔ ‪.‬‬
‫ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﻣﺼﻔﻮﻓﺔ ‪ C‬ﲢﺘﻮﻯ ﻋﻠﻰ ‪ 13‬ﻋﻨﺼﺮ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ ،int‬ﻭﳝﻜﻦ ﺍﻟﻮﺻـﻮﻝ‬
‫ﺇﱄ ﺃﻱ ﻣﻦ ﻫﺬﻩ ﺍﻟﻌﻨﺎﺻﺮ ﺑﺬﻛﺮ ﺍﺳﻢ ﺍﳌﺼﻔﻮﻓﺔ ﻣﺘﺒﻮﻋﹰﺎ ﺑﺮﻗﻢ ﻣﻮﻗﻊ ﺍﻟﻌﻨﺼـﺮ ﰲ ﺍﳌﺼـﻔﻮﻓﺔ ﳏﺎﻃـﹰﺎ‬
‫ﺑﺎﻷﻗﻮﺍﺱ ] [ ‪.‬‬
‫ﻳﺮﻣﺰ ﻟﺮﻗﻢ ﺍﻟﻌﻨﺼﺮ ﰲ ﺍﳌﺼﻔﻮﻓﺔ ﺑﻔﻬﺮﺱ ﺍﻟﻌﻨﺼﺮ ‪ . index‬ﻓﻬﺮﺱ ﺍﻟﻌﻨﺼﺮ ﺍﻷﻭﻝ ﰲ‬
‫ﺍﳌﺼﻔﻮﻓﺔ ﻫﻮ ‪ 0‬ﻭﳍﺬﺍ ﻳﺸﺎﺭ ﺇﱄ ﺍﻟﻌﻨﺼﺮ ﺍﻷﻭﻝ ﰲ ﺍﳌﺼﻔﻮﻓﺔ ‪ C‬ﺑـ ]‪ C[0‬ﻭﺍﻟﺜﺎﱐ ]‪ C[1‬ﻭﺍﻟﺴﺎﺑﻊ‬
‫]‪ C[6‬ﻭﻋﻤﻮﻣﹰﺎ ﳛﻤﻞ ﺍﻟﻌﻨﺼﺮ ‪ i‬ﰲ ﺍﳌﺼﻔﻮﻓﺔ ‪ C‬ﺍﻟﻔﻬﺮﺱ ]‪. C[i-1‬‬
‫ﺗﺘﺒﻊ ﺗﺴﻤﻴﺔ ﺍﳌﺼﻔﻮﻓﺎﺕ ﻧﻔﺲ ﻗﻮﺍﻋﺪ ﺗﺴﻤﻴﺔ ﺍﳌﺘﻐﲑﺍﺕ‪.‬‬
‫]‪C[0‬‬ ‫‪-45‬‬
‫]‪C[1‬‬ ‫‪6‬‬
‫]‪C[2‬‬ ‫‪0‬‬
‫]‪C[3‬‬ ‫‪72‬‬
‫]‪C[4‬‬ ‫‪1543‬‬
‫]‪C[5‬‬ ‫‪-89‬‬
‫]‪C[6‬‬ ‫‪0‬‬
‫]‪C[7‬‬ ‫‪62‬‬
‫]‪C[8‬‬ ‫‪-3‬‬
‫]‪C[9‬‬ ‫‪1‬‬
‫]‪C[10‬‬ ‫‪6453‬‬
‫]‪C[11‬‬ ‫‪78‬‬
‫]‪C[12‬‬ ‫‪15‬‬

‫ﺃﺣﻴﺎﻧﹰﺎ ﻳﺴﻤﻰ ﻓﻬﺮﺱ ﺍﻟﻌﻨﺼﺮ ﺑﺮﻣﺰ ﻣﻨﺨﻔﺾ ‪ subcript‬ﻭﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﺍﻟﻔﻬﺮﺱ‬


‫ﻼ ﺇﺫﺍ ﻛﺎﻧـﺖ ‪ a=5‬ﻭ‪b=6‬‬ ‫‪ integer‬ﺃﻭ ﺗﻌﺒﲑ ﺟﱪﻱ ﺗﻜﻮﻥ ﻧﺘﻴﺠﺘـﻪ ‪ . integer‬ﻓﻤـﺜ ﹰ‬
‫ﻓﺎﻟﻌﺒﺎﺭﺓ‪:‬‬
‫‪C[a+b]+=2,‬‬

‫‪78‬‬
‫♦ ﺗﻘﻮﻡ ﺑﺈﺿﺎﻓﺔ ‪ 2‬ﺇﱄ ﺍﻟﻌﻨﺼﺮ ﺍﻟﺜﺎﱐ ﻋﺸﺮ ]‪ C[11‬ﰲ ﺍﳌﺼﻔﻮﻓﺔ ‪. C‬‬
‫♦ ﳛﻤﻞ ﺍﻟﻌﻨﺼﺮ ‪ 0‬ﰲ ﺍﳌﺼﻔﻮﻓﺔ ‪ C‬ﺍﻟﻘﻴﻤﺔ ‪ -45‬ﻭﺍﻟﻌﻨﺼﺮ ‪ 1‬ﺍﻟﻘﻴﻤﺔ ‪.6‬‬
‫ﻟﻄﺒﺎﻋﺔ ﳎﻤﻮﻉ ﺍﻟﺜﻼﺛﺔ ﻋﻨﺎﺻﺮ ﺍﻷﻭﱃ ﰲ ﺍﳌﺼﻔﻮﻓﺔ ‪ C‬ﳝﻜﻦ ﻛﺘﺎﺑﺔ‪:‬‬
‫;‪cout<<C[0]+C[1]+C[2]<<endl‬‬

‫‪79‬‬
‫‪Arrays‬‬ ‫ﺍﳌﺼﻔﻮﻓﺎﺕ‬ ‫‪5.2‬‬

‫ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﳌﺼﻔﻮﻓﺎﺕ‪-:‬‬
‫ﲢﺘﻞ ﺍﳌﺼﻔﻮﻓﺎﺕ ﺣﻴﺰﹰﺍ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻟﺬﺍ ﳚﺐ ﻋﻠﻰ ﺍﳌﱪﻣﺞ ﲢﺪﻳـﺪ ﻧـﻮﻉ ﻋﻨﺎﺻـﺮ‬
‫ﺍﳌﺼﻔﻮﻓﺔ ﻭﻋﺪﺩﻫﺎ ﺣﱴ ﻳﺘﺴﲎ ﻟﻠﻤﻌﺮﻑ ﲣﺼﻴﺺ ﺍﳊﻴﺰ ﺍﻟﻼﺯﻡ ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ ﳊﻔﻆ ﺍﳌﺼﻔﻮﻓﺔ‪ ،‬ﻭﺣﱴ‬
‫ﲣﱪ ﺍﳌﺼﺮﻑ ﺑﺄﻥ ﳜﺼﺺ ﺣﻴﺰﹰﺍ ﻟـ ‪ 12‬ﻋﻨﺼﺮ ﻣﻦ ﺍﻟﻨـﻮﻉ ‪ int‬ﰲ ﻣﺼـﻔﻮﻓﺔ ‪ ، C‬ﺍﺳـﺘﺨﺪﻡ‬
‫ﺍﻹﻋﻼﻥ‪:‬‬
‫;]‪int C[12‬‬
‫ﳝﻜﻦ ﲣﺼﻴﺺ ﺍﻟﺬﺍﻛﺮﺓ ﻟﻌﺪﺓ ﻣﺼﻔﻮﻓﺎﺕ ﺑﺎﺳﺘﺨﺪﺍﻡ ﻧﻔﺲ ﺍﻹﻋﻼﻥ ﻭﺫﻟﻚ ﻛﺎﻷﰐ‪:‬‬
‫;]‪int b[100], x[20‬‬
‫ﻼ ﻟﻺﻋﻼﻥ ﻋﻦ‬
‫ﺃﻳﻀﹰﺎ ﳝﻜﻦ ﺍﻹﻋﻼﻥ ﻋﻦ ﻣﺼﻔﻮﻓﺎﺕ ﻣﻦ ﺃﻱ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﺁﺧﺮ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﻣﺼﻔﻮﻓﺔ ﻋﻨﺎﺻﺮﻫﺎ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ char‬ﻧﻜﺘﺐ‪:‬‬
‫;]‪char ch[20‬‬
‫ﻣﺜﺎﻝ ﻋﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳌﺼﻔﻮﻓﺎﺕ‪:‬‬
‫ﻳﺴﺘﺨﺪﻡ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﺣﻠﻘﺔ ‪ for‬ﻟﺘﻤﻬﻴﺪ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ ‪ n‬ﻋﻨﺪ ‪ 0‬ﻭﻃﺒﺎﻋﺔ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ‪.‬‬

‫‪//Program 5-1:‬‬
‫‪//initializing an array‬‬
‫>‪#include <iostream.h‬‬
‫>‪#include <iomanip.h‬‬
‫) (‪main‬‬
‫{‬
‫;]‪int n[10‬‬
‫‪for (int i=0; i<10;i++) // initialize array‬‬
‫;‪n[i] = 0‬‬
‫;‪cout << “Element” << setw(13) << “ value” << endl‬‬
‫‪for (i=0 ; i< 10; i++) // print array‬‬
‫;‪cout << setw(7) <<i<<setw(13) <<n[i]<<endl‬‬
‫;‪return 0‬‬
‫}‬

‫‪80‬‬
‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬
‫‪Element‬‬ ‫‪Value‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪9‬‬ ‫‪0‬‬

‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﰎ ﺗﻀﻤﲔ ﺍﳌﻠﻒ ‪ iomanip.h‬ﻭﺫﻟﻚ ﻷﻧﻨﺎ ﺍﺳﺘﺨﺪﻣﻨﺎ ﺍﳌﻨﺎﻭﺭ‬


‫)‪ setw(13‬ﻭﺍﻟﺬﻱ ﻳﻌﲏ ﺿﺒﻂ ﻋﺮﺽ ﺍﳊﻘﻞ ﻋﻨﺪ ‪ ) 13‬ﺃﻱ ﺃﻥ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﺳـﺘﺘﻢ ﻃﺒﺎﻋﺘـﻬﺎ‬
‫ﺳﺘﻜﻮﻥ ﻋﻠﻰ ﺑﻌﺪ ‪ 13‬ﻣﺴﺎﻓﺔ ﻣﻦ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﲤﺖ ﻃﺒﺎﻋﺘﻬﺎ ﻗﺒﻠﻬﺎ ( ‪.‬‬
‫ﳝﻜﻦ ﲤﻬﻴﺪ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ ﺑﺎﺗﺒﺎﻉ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﳌﺼﻔﻮﻓﺔ ﺑﻌﻼﻣﺔ ﺍﳌﺴﺎﻭﺍﺓ )=( ﺗﻠﻴﻬﺎ‬
‫ﻻﺋﺤﺔ ﻣﻦ ﺍﻟﻘﻴﻢ ﺍﳌﻄﻠﻮﺏ ﲤﻬﻴﺪ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ ﻋﻨﺪﻫﺎ‪ ،‬ﻭﻳﺘﻢ ﺍﻟﻔﺼﻞ ﺑﲔ ﺍﻟﻘﻴﻢ ﺑﻔﻮﺍﺻﻞ‪ ،‬ﻭﲢـﻴﻂ‬
‫ﻫﺬﻩ ﺍﻟﻼﺋﺤﺔ ﺍﻷﻗﻮﺍﺱ ﺍﳊﺎﺻﺮﺓ } {‪ .‬ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺘﻤﻬﻴﺪ ﻋﻨﺎﺻﺮ ﻣﻦ ﺍﻟﻨﻮﻉ ‪integer‬‬
‫ﻟﺘﺤﺘﻮﻱ ﻗﻴﻢ ﳏﺪﺩﺓ ﻋﻨﺪ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﳌﺼﻔﻮﻓﺔ‪ ،‬ﻭﻃﺒﺎﻋﺔ ﻫﺬﻩ ﺍﻟﻘﻴﻢ‪.‬‬

‫‪//Program 5-2:‬‬
‫‪//initializing an array with a declaration‬‬
‫>‪#include <iostream.h‬‬
‫>‪#include <iomanip.h‬‬
‫) (‪main‬‬
‫{‬
‫;}‪int n[10] = {32,27,64,18,95,14,90,70,60,37‬‬
‫;‪cout << “Element” << setw(13) << “ value” << endl‬‬
‫‪for (i=0 ; i< 10; i++) // print array‬‬

‫‪81‬‬
‫;‪cout << setw(7) <<i<<setw(13) <<n[i]<<endl‬‬
‫;‪return 0‬‬
‫}‬

‫ﻣﺎﺫﺍ ﳛﺪﺙ ﺇﺫﺍ ﰎ ﲢﺪﻳﺪ ﺣﺠﻢ ﻣﺼﻔﻮﻓﺔ ﻻ ﻳﺘﻮﺍﻓﻖ ﻣﻊ ﻋﺪﺩ ﻗﻴﻢ ﺍﻟﺘﻤﻬﻴﺪ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﻟﻼﺋﺤﺔ؟‬

‫ﺇﺫﺍ ﻛﺎﻧﺖ ﻗﻴﻢ ﺍﻟﺘﻤﻬﻴﺪ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﻟﻼﺋﺤﺔ ﺃﻛﺜﺮ ﻣﻦ ﺣﺠﻢ ﺍﳌﺼﻔﻮﻓﺔ ﺍﶈﺪﺩ‬
‫ﺳﻴﻌﺘﺮﺽ ﺍﳌﺼﺮﻑ‪ ،‬ﻭﺇﺫﺍ ﻛﺎﻧﺖ ﺃﻗﻞ ﺳﻴﻤﻸ ﺍﳌﺼﺮﻑ ﺑﻘﻴﺔ ﺍﻟﻌﻨﺎﺻﺮ ﺃﺻﻔﺎﺭ‪ ،‬ﻟﺬﺍ ﺇﺫﺍ ﻛﻨﺎ ﻧﺮﻳﺪ ﲤﻬﻴﺪ‬
‫ﻋﻨﺎﺻﺮ ﻣﺼﻔﻮﻓﺔ ﻣﻬﻤﺎ ﻛﺎﻥ ﺣﺠﻤﻬﺎ ﺑﺄﺻﻔﺎﺭ ﻛﻞ ﻣﺎ ﻋﻠﻴﻨﺎ ﻓﻌﻠﻪ ﻫﻮ ﻛﺘﺎﺑﺔ ﺇﻋﻼﻥ ﻛﺎﻵﰐ‪-:‬‬
‫;}‪int anyarray[10]={0‬‬
‫ﺳﻴﺘﻢ ﲤﻬﻴﺪ ﺍﻟﻌﻨﺼﺮ ﺍﻷﻭﻝ ﻋﻨﺪ ﺍﻟﻘﻴﻤﺔ ‪ 0‬ﺍﻟﺘﺎﱄ ﻛﺘﺒﻨﺎﻫﺎ ﻭﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﺘﺒﻘﻴﺔ ﻋﻨﺪ ‪0‬‬
‫ﻛﻮﻧﻨﺎ ﱂ ﳓﺪﺩ ﻗﻴﻤﺔ ﳍﺎ‪.‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﲜﻤﻊ ‪ 12‬ﻋﻨﺼﺮ ﰲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ ﺍﻟﻨﻮﻉ ‪. int‬‬

‫‪//Program‬‬ ‫‪5-3:‬‬
‫‪// compute the sum of the elements of the array‬‬
‫>‪#include <iostream.h‬‬
‫) (‪main‬‬
‫{‬
‫;‪const int arraysize =12‬‬
‫;}‪int a[arraysize] = {1, 3, 5, 4, 7, 2, 99, 16, 45, 67, 89, 45‬‬
‫;‪int total = 0‬‬
‫)‪for (int i= 0; i<arraysize ; i++‬‬
‫;]‪total += a[i‬‬
‫;‪cout <<” total of array element values is “ << total << endl‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪82‬‬
‫‪total of array element values is 383‬‬

‫ﻧﻼﺣﻆ ﺃﻧﻨﺎ ﰲ ﺍﻟﻌﺒﺎﺭﺓ‪:‬‬


‫;‪const int arraysize = 12‬‬
‫ﺍﺳﺘﻌﻤﻠﻨﺎ ﻛﻠﻤﺔ ﺟﺪﻳﺪﺓ ﻫﻲ ‪ . const‬ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﻫﺬﻩ ﺍﻟﻜﻠﻤـﺔ ﺍﻷﺳﺎﺳـﻴﺔ ﰲ‬
‫ﺗﻌﺮﻳﻒ ﺍﳌﺘﻐﲑ ﺍﻟﺬﻱ ﻻ ﳝﻜﻦ ﺗﻐﻴﲑ ﻗﻴﻤﺘﻪ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﻭﻟﺬﻟﻚ ﳚﺐ ﲤﻬﻴﺪﻩ ﻋﻨﺪ ﻗﻴﻤﺔ ﺃﻭﻟﻴـﺔ ﻋﻨـﺪ‬
‫ﺗﻌﺮﻳﻔﻪ ) ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﰎ ﲤﻬﻴﺪﻩ ﻟﻴﺴﺎﻭﻯ ‪(12‬‬

‫‪83‬‬
‫‪Strings‬‬ ‫ﺍﻟﺴﻼﺳﻞ‬ ‫‪5.3‬‬

‫ﻛﻤﺎ ﺫﻛﺮﻧﺎ ﺃﻧﻪ ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﻣﺼﻔﻮﻓﺎﺕ ﻣﻦ ﺃﻱ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﺁﺧﺮ‪ ،‬ﺳـﻨﻘﻮﻡ ﺍﻵﻥ‬
‫ﺑﺘﺨﺰﻳﻦ ﺳﻠﺴﻠﺔ ﺣﺮﻭﻑ ﰲ ﻣﺼﻔﻮﻓﺔ ﻣﻦ ﺍﻟﻨﻮﻉ ‪.char‬‬
‫ﻳﺘﻢ ﲤﻬﻴﺪ ﺍﳌﺼﻔﻮﻓﺔ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ char‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﻣﺎ ﻳﺴـﻤﻰ ﺑﺎﻟﺜﺎﺑـﺖ ﺍﻟﺴﻠﺴـﻠﻲ‬
‫)‪(string literal‬‬
‫;"‪char string1[ ]="first‬‬
‫ﺣﺠﻢ ﺍﳌﺼﻔﻮﻓﺔ ‪ string1‬ﻫﻨﺎ ﻳﺘﻢ ﲢﺪﻳﺪﻩ ﺑﻮﺍﺳﻄﺔ ﺍﳌﺼﺮﻑ ﺑﻨﺎﺀﹰﺍ ﻋﻠـﻰ ﻃـﻮﻝ‬
‫ﺍﻟﺜﺎﺑﺖ ﺍﻟﺴﻠﺴﻠﻲ "‪."first‬‬
‫ﻣﻦ ﺍﳌﻬﻢ ﻫﻨﺎ ﺃﻥ ﻧﺬﻛﺮ ﺃﻥ ﺍﻟﺴﻠﺴﻠﺔ "‪ "first‬ﲢﺘﻮﻯ ﻋﻠﻰ ﲬﺴﺔ ﻋﻨﺎﺻـﺮ ﺯﺍﺋـﺪﹰﺍ‬
‫ﺣﺮﻓﹰﺎ ﺧﺎﻣﺪﹰﺍ ﻳﺸﲑ ﺇﱃ ‪‬ﺎﻳﺔ ﺍﻟﺴﻠﺴﻠﺔ ﻭﻳﺴﻤﻰ ﺍﳊﺮﻑ ﺍﳋﺎﻣﺪ ‪ null character‬ﻭﻳﺘﻢ ﲤﺜﻴﻠـﻪ‬
‫ﺑﺎﺳﺘﺨﺪﺍﻡ ﺗﺘﺎﺑﻊ ﺍﳍﺮﻭﺏ '‪ '\o‬ﻭﺗﻨﺘﻬﻲ ﻛﻞ ﺍﻟﺴﻼﺳﻞ ‪‬ﺬﺍ ﺍﳊﺮﻑ ﺍﳋﺎﻣﺪ ﻭﻋﻠﻴﻪ ﻓـﺈﻥ ﺍﳌﺼـﻔﻮﻓﺔ‬
‫‪ string1‬ﲢﺘﻮﻯ ﻋﻠﻰ ﺳﺘﺔ ﻋﻨﺎﺻﺮ‪.‬‬

‫ﳚﺐ ﺃﻥ ﻧﺘﺬﻛﺮ ﺩﺍﺋﻤﹰﺎ ﺃﻥ ﺍﳌﺼﻔﻮﻓﺔ ﺍﻟﺘﺎﻟﻴﺔ ﺗﻌﻠﻦ ﻋﻨﻬﺎ ﺛﻮﺍﺑﺖ ﺳﻠﺴﻠﻴﺔ ﳚﺐ ﺃﻥ ﺗﻜﻮﻥ ﻛﺒﲑﺓ‬
‫ﳌﺎ ﻳﻜﻔﻰ ﻟﺘﺨﺰﻳﻦ ﺣﺮﻭﻑ ﺍﻟﺴﻠﺴﻠﺔ ﺇﺿﺎﻓﺔ ﺇﱃ ﺍﳊﺮﻑ ﺍﳋﺎﻣﺪ‪.‬‬

‫ﳝﻜﻦ ﺃﻳﻀﹰﺎ ﲤﻬﻴﺪ ﺍﻟﺴﻠﺴﻠﺔ "‪ "first‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﻻﺋﺤﺔ ﻗﻴﻢ ﺗﻔﺼﻠﻬﺎ ﻓﻮﺍﺻﻞ ﻟﺬﺍ‬
‫ﺍﻹﻋﻼﻥ‪-:‬‬
‫;"‪char string1[ ]="first‬‬
‫ﻳﻜﺎﻓﺊ‪:‬‬
‫}'‪char string1[ ]={'f','i','r','s','t','\o‬‬
‫ﻭﲟﺎ ﺃﻥ ﺍﻟﺴﻠﺴﻠﺔ ﰲ ﺍﻟﻮﺍﻗﻊ ﻫﻲ ﻣﺼﻔﻮﻓﺔ ﺃﺣﺮﻑ ‪ ،‬ﻋﻠﻴﻪ ﳝﻜـﻦ ﺍﻟﻮﺻـﻮﻝ ﺇﱃ ﺃﻱ‬
‫ﻼ‬
‫ﺣﺮﻑ ﻣﻦ ﺣـﺮﻭﻑ ﺍﻟﺴﻠﺴـﻠﺔ ﻣﺒﺎﺷـﺮﺓ ﺑﺎﺳـﺘﺨﺪﺍﻡ ﺍﻟﻔﻬـﺮﺱ ﻭﺍﺳـﻢ ﺍﳌﺼـﻔﻮﻓﺔ ‪،‬ﻓﻤـﺜ ﹰ‬
‫'‪ .string1[0]='f‬ﻭﻣﺜﻠﻤﺎ ﳝﻜﻦ ﲤﻬﻴﺪ ﺍﻟﺴﻠﺴﻠﺔ ﻋﻨﺪ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ‪ ،‬ﳝﻜﻦ ﺃﻳﻀـﹰﺎ ﺇﺩﺧـﺎﻝ‬
‫ﻼ ﺍﻹﻋﻼﻥ ‪-:‬‬
‫ﺍﻟﺴﻼﺳﻞ ﻋﻦ ﻃﺮﻳﻖ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﺑﺎﺳﺘﻌﻤﺎﻝ ‪ cin‬ﻭ>> ﻓﻤﺜ ﹰ‬
‫;]‪char string2[20‬‬
‫ﻳﻨﺸﺊ ﻣﺼﻔﻮﻓﺔ ﺃﺣﺮﻑ ﺗﺴﻤﺢ ﺑﺘﺨﺰﻳﻦ ‪ 19‬ﺣﺮﻓﹰﺎ ﺇﺿﺎﻓﺔ ﺇﱃ ﺍﳊﺮﻑ ﺍﳋﺎﻣﺪ ﻭﺍﻟﻌﺒﺎﺭﺓ‬
‫;‪cin>>string2‬‬

‫‪84‬‬
‫ﺗﻘﻮﻡ ﺑﺘﺨﺰﻳﻦ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﺪﺧﻠﺔ ﻋﻦ ﻃﺮﻳﻖ ﻟﻮﺣﺔ ﺍﳌﻔـﺎﺗﻴﺢ ﻭﲣﺰﻳﻨـﻬﺎ ﰲ ﺍﳌﺼـﻔﻮﻓﺔ‬
‫‪.string2‬‬
‫ﳝﻜﻦ ﺧﺮﺝ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﺨﺰﻧﺔ ﰲ ﻣﺼﻔﻮﻓﺔ ﺍﻷﺣﺮﻑ ﺑﺎﺳﺘﺨﺪﺍﻡ ‪ cout‬ﻭ<< ﻭﻋﻠﻴـﻪ‬
‫ﳝﻜﻦ ﻃﺒﺎﻋﺔ ﺍﳌﺼﻔﻮﻓﺔ ‪ string2‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﺒﺎﺭﺓ‪-:‬‬
‫;‪cout << string2 << endl‬‬

‫‪ cin‬ﻣﻊ ﺍﻟﺴﻼﺳﻞ ﻳﺘﻢ ﻓﻘﻂ ﺫﻛﺮ ﺍﺳﻢ ﺍﳌﺼﻔﻮﻓﺔ ﺍﻟﱵ ﺳﻴﺘﻢ ﻓﻴﻬﺎ ﲣـﺰﻳﻦ‬ ‫ﻋﻨﺪ ﺍﺳﺘﻌﻤﺎﻝ‬
‫ﺣﺮﻭﻑ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﺪﺧﻠﺔ ﺩﻭﻥ ﺫﻛﺮ ﺣﺠﻤﻬﺎ ﻫﻨﺎ ﺗﺄﺗﻰ ﻣﺴﺌﻮﻟﻴﺔ ﺍﳌﱪﻣﺞ ﰲ ﺃﻣﺜﻠﺔ ﺍﳌﺼـﻔﻮﻓﺔ‬
‫ﺍﻟﱵ ﺳﻴﺘﻢ ﺗﻌﺮﻳﻔﻬﺎ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺴﻠﺴﻠﺔ ﳚﺐ ﺃﻥ ﺗﻜﻮﻥ ﻛﺒﲑﺓ ﳌﺎ ﻳﻜﻔﻰ ﲣﺰﻳﻦ ﺍﻟﺴﻠﺴﻠﺔ ﺍﻟـﱵ‬
‫‪ cin‬ﺣﺎﳌﺎ ﳚﺪ ﻓﺮﺍﻏﹰﺎ‬ ‫ﻳﺪﺧﻠﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ ﻋﻦ ﻃﺮﻳﻖ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﻭﳚﺐ ﺃﻥ ﻧﺬﻛﺮ ﻫﻨﺎ ﺃﻥ‬
‫ﻳﺘﻮﻗﻒ ﻋﻦ ﻗﺮﺍﺀﺓ ﺍﻟﺪﺧﻞ ﻭﻳﻘﻮﻡ ﺑﺘﺨﺰﻳﻦ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﺪﺧﻠﺔ ﰲ ﺍﳌﺼـﻔﻮﻓﺔ ﺍﳌﻌﻠـﻦ ﻋﻨـﻬﺎ‬
‫ﻟﺘﺨﺰﻳﻨﻬﺎ‪.‬‬

‫‪ cout‬ﻣﺜﻞ ‪ cin‬ﻻ ‪‬ﺘﻢ ﲝﺠﻢ ﺍﳌﺼﻔﻮﻓﺔ ﺣﻴﺚ ﺗﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺣـﺮﻭﻑ ﺍﻟﺴﻠﺴـﻠﺔ‬
‫ﺣﱴ ﺗﺼﻞ ﺇﱃ ﺍﳊﺮﻑ ﺍﳋﺎﻣﺪ ﺍﻟﺬﻱ ﳛﺪﺩ ‪‬ﺎﻳﺔ ﺍﻟﺴﻠﺴﻠﺔ‪.‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺘﻤﻬﻴﺪ ﻣﺼﻔﻮﻓﺔ ﺃﺣﺮﻑ ﻋﻨﺪ ﺛﺎﺑﺖ ﺳﻠﺴﻠﻲ ﻭﻳﻘﻮﻡ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺣﻠﻘﺔ ﺍﻟﺘﻜـﺮﺍﺭ‬
‫‪ for‬ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ ﻭﻃﺒﺎﻋﺘﻬﺎ ‪.‬‬

‫‪//Program 5-4:‬‬
‫‪//Treating character arrays as strings‬‬
‫>‪#include<iostream.h‬‬
‫) (‪main‬‬
‫{‬
‫; ”‪char string1[20], string2[ ] = “ stringliteral‬‬
‫;“ ‪cout << “Enter a string:‬‬
‫;‪cin>> string1‬‬
‫‪cout << “string1 is : “ << string1<<endl‬‬
‫‪<< “string2 is : “ << string2<<endl‬‬
‫“ ‪<< “string1 with spaces between characters is:‬‬

‫‪85‬‬
‫;‪<< endl‬‬
‫)‪for (int i= 0; string1[i] ; = ‘\0’ ; i++‬‬
‫;‘ ‘ <<]‪cout << string1[i‬‬
‫;‪cout << endl‬‬
‫‪//Continued‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬
‫ﺑﺎﻓﺘﺮﺍﺽ ﺃﻥ ﺍﳌﺴﺘﺨﺪﻡ ﻗﺪ ﺃﺩﺧﻞ ﺍﻟﺴﻠﺴﻠﺔ ‪Hello there‬‬

‫‪Enter a string: Hello there‬‬


‫‪string1 is : Hello‬‬
‫‪string2 is : string Literal‬‬
‫‪string1 with spaces between characters is : H e l l o‬‬

‫ﺍﺳﺘﺨﺪﻣﺖ ﺣﻠﻘﺔ ﺍﻟﺘﻜﺮﺍﺭ ‪ for‬ﻟﻮﺻﻮﻝ ﺇﱃ ﺣﺮﻭﻑ ﺍﻟﺴﻠﺴﻠﺔ ‪string1‬‬


‫ﻭﻃﺒﺎﻋﺘﻬﺎ ﻣﻊ ﻃﺒﺎﻋﺔ ﻣﺴﺎﻓﺔ ﺑﲔ ﻛﻞ ﺣﺮﻑ ﻭﺍﻵﺧﺮ ﺣﱴ ﺗﺼﻞ ﺇﱃ ﺍﳊﺮﻑ ﺍﳋﺎﻣﺪ ’‪( ‘\o‬‬
‫) ;’‪string1[i] != ‘\o‬ﻭﺍﻟﺬﻱ ﳛﺪﺩ ‪‬ﺎﻳﺔ ﺍﻟﺴﻠﺴﻠﺔ‪.‬‬
‫ﻣﻜﺘﺒﺔ ﺩﺍﻻﺕ ﺍﻟﺴﻼﺳﻞ‬
‫‪5.4‬‬

‫ﺗﻮﺟﺪ ﻋﺪﺓ ﺩﺍﻻﺕ ﺗﻌﻤﻞ ﻋﻠﻰ ﺍﻟﺴﻼﺳﻞ‪ ،‬ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺍﺳﺘﻌﻤﺎﻝ ﺃﻱ ﻣﻦ ﻫﺬﻩ ﺍﻟﺪﻭﺍﻝ ﰲ‬
‫ﺑﺮﻧﺎﻣﺞ ﳚﺐ ﺃﻥ ﻧﻘﻮﻡ ﺑﺘﻀﻤﲔ ﻣﻠﻒ ﺍﻟﺘﺮﻭﻳﺴﺔ ‪ . string.h‬ﻣﻦ ﻫﺬﻩ ﺍﻟﺪﺍﻻﺕ ‪:‬‬
‫‪-:strlen( )/1‬‬
‫ﺗﻌﻴﺪ ﺍﻟﺪﺍﻟﺔ ) (‪ strlen‬ﻃﻮﻝ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﻤﺮﺭﺓ ﻛﻮﺳﻴﻄﺔ ﳍﺎ ‪،‬ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ‬
‫ﻳﻮﺿﺢ ﺫﻟﻚ ‪-:‬‬

‫‪//Program 5-5:‬‬
‫‪// using strlen‬‬
‫>‪#include<iostream.h‬‬
‫>‪#include<string.h‬‬

‫‪86‬‬
main ( )
{
char *string1= “ abcdefghijklmnopqrstuvwxyz”;
//Continued
char *string2 = “four”;
char *string3 = “Boston”;
cout << “ The length of \ “ “ << string1
<< “ \” is << strlen (string1) <<endl
<< “ The length of \” << string2
<<” \” is << strlen (string2) << endl
<< “The length of\ “ “<< string3
<< “ \” is << strlen( string3) <<endl;
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

The length of “abcdefghijklmnopqrstuvwxyz” is 26


The length of “four” is 4
The length of “Boston” is 6

‫ ﻋﻠﻰ‬strlen ‫ ﻏﲑ ﳏﺴﻮﺏ ﰲ ﺍﻟﻄﻮﻝ ﺍﻟﺬﻱ ﺗﻌﻴﺪﻩ ﺍﻟﺪﺍﻟﺔ‬0\ ‫ﻻﺣﻆ ﺃﻥ ﺍﳊﺮﻑ‬


.‫ ﻭﳛﺘﻞ ﻣﻜﺎﻧﹰﺎ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‬s1 ‫ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻧﻪ ﻣﻮﺟﻮﺩ ﰲ‬

-:strcpy( ) /2
‫ ﻟﻨﺴﺦ ﺳﻠﺴﻠﺔ ﺇﱃ ﺳﻠﺴﻠﺔ ﺃﺧﺮﻯ‬strcpy ‫ﺗﺴﺘﻌﻤﻞ ﺍﻟﺪﺍﻟﺔ‬

//Program 5-6:
// using strcpy
#include<iostream.h>

87
#include<string.h>
main ( )
{
char x[ ] = “Happy Birthday to you”;
//Continued
char y[25];
cout<<” The string in array x is : “<< x << endl;
cout<<” The string in array y is : “<< strcpy(y, x)
<< endl;
return 0;
}

Happy ‫ ﻋﻠـﻰ‬y ‫ ﺳﺘﺤﺘﻮﻯ ﺍﻟﺴﻠﺴـﻠﺔ‬strcpy(y, x) ‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻟﻌﺒﺎﺭﺓ‬


‫ ﺗﻨﺴﺦ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﻤﺮﺭﺓ ﻛﺎﻟﻮﺳـﻴﻄﺔ‬strcpy ‫ ﻻﺣﻆ ﻫﻨﺎ ﺃﻥ ﺍﻟﺪﺍﻟﺔ‬.Birthday to you
.‫ﺍﻟﺜﺎﻧﻴﺔ ﺇﱃ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﻤﺮﺭﺓ ﻛﺎﻟﻮﺳﻴﻄﺔ ﺍﻷﻭﱃ‬

:‫ﻭﻋﻠﻴﻪ ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

The string in array x is : Happy Birthday to you


The string in array y is : Happy Birthday to you

-:strcat( ) /3
‫ ﺍﻟﺬﻱ ﳝﻜﻦ ﺃﻥ ﻳﺴﻤﻰ ﲨﻊ ﺍﻟﺴﻼﺳﻞ‬، ‫ ﺑﺈﳊﺎﻕ ﺍﻟﺴﻼﺳﻞ‬strcat( ) ‫ﺗﻘﻮﻡ ﺍﻟﺪﺍﻟﺔ‬
‫ ﺳـﺘﻜﻮﻥ ﻧﺘﻴﺠـﺔ ﺍﻟﺴﻠﺴـﻠﺔ‬computer ‫ ﺑﺎﻟﺴﻠﺴـﻠﺔ‬science ‫ﻼ ﺇﺫﺍ ﺃﳊﻘﻨﺎ ﺍﻟﺴﻠﺴﻠﺔ‬
‫ﻓﻤﺜ ﹰ‬
-:computer science

//Program 5-7:
// using strcat
#include<iostream.h>
#include<string.h>
int main ( )

88
{
char s1[20]=”computer” ;
char s2[ ]=”science” ;
cout<<”s1= “ <<s1 << endl << “s2= “ << s2 <<endl;
cout<< “strcat(s1, s2) = “ << strcat (s1, s2) << endl;
//Continued
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

s1= computer
s2 = science
strcat(s1, s2)= computerscience

-:strcmp( ) /4
‫ ﺗﻘﺎﺭﻥ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﻤﺮﺓ ﺇﻟﻴﻬﺎ ﻛﻮﺳﻴﻄﺔ ﺃﻭﱃ ﻣﻊ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﻤـﺮﺓ‬strcmp ‫ﺍﻟﺪﺍﻟﺔ‬
‫ ﺇﺫﺍ ﻛﺎﻧﺘﺎ ﻣﺘﻄﺎﺑﻘﺘﲔ ﻭﻗﻴﻤﺔ ﺳﺎﻟﺒﺔ ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﺴﻠﺴﻠﺔ ﺍﻷﻭﱃ ﺃﺻﻐﺮ‬0 ‫ ﻭﺗﺮﺟﻊ‬،‫ﺇﻟﻴﻬﺎ ﻛﻮﺳﻴﻄﺔ ﺛﺎﻧﻴﺔ‬
.‫ﻣﻦ ﺍﻟﺴﻠﺴﻠﺔ ﺍﻟﺜﺎﻧﻴﺔ ﻭﻗﻴﻤﺔ ﻣﻮﺟﺒﺔ ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﺴﻠﺴﻠﺔ ﺍﻷﻭﱃ ﺃﻛﱪ ﻣﻦ ﺍﻟﺴﻠﺴﻠﺔ ﺍﻟﺜﺎﻧﻴﺔ‬
:‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺫﻟﻚ‬

//Program 5-8:
// using strcmp
#include<iostream.h>
#include<string.h>
int main ( )
{
char *s1 = “ Happy New Year”;
char *s2 = “ Happy New Year”;
char *s3 = “ Happy Holidays”;
cout << “s1= “ << s1<< endl<< “s2= “ <<s2<<endl

89
<< “s3= “ << s3<< endl<< endl<< ”strcmp(s1, s2)= “
<< strcmp(s1, s2) <<endl<< ”strcmp(s1, s3)= “
<< strcmp(s1, s3) <<endl<< ”strcmp(s3, s1)= “
<< strcmp(s3, s1) <<endl<< endl;
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬
s1= Happy New Year
s2= Happy New Year
s3 = Happy Holidays

strcmp (s1, s2) = 0


strcmp (s1, s3) = 6
strcmp (s3, s1) = 6

‫ﲤﺮﻳﺮ ﺍﳌﺼﻔﻮﻓﺎﺕ ﻛﻮﺳﺎﺋﻂ ﻟﻠﺪﻭﺍﻝ‬


Passing Arrays to Functions
5.5

.‫ﳝﻜﻦ ﲤﺮﻳﺮ ﻣﺼﻔﻮﻓﺔ ﻛﻮﺳﻴﻄﺔ ﻟﺪﺍﻟﺔ ﻭﺫﻟﻚ ﺑﺬﻛﺮ ﺍﺳﻢ ﺍﳌﺼﻔﻮﻓﺔ‬


-:‫ ﻛﺎﻵﰐ‬hourlyTemperature ‫ﻼ ﺇﺫﺍ ﰎ ﺍﻹﻋﻼﻥ ﻋﻦ ﻣﺼﻔﻮﻓﺔ‬ ‫ﻣﺜ ﹰ‬
int hourlyTemperatures[24];
-:‫ﻋﺒﺎﺭﺓ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ‬
modify_Array(Int hourlyTemperatures,24);

‫ ﻭﺣﺠﻤﻬـﺎ ﻛﻮﺳـﺎﺋﻂ ﻟﻠﺪﺍﻟـﺔ‬hourlyTemperature ‫ﲤﺮﺭ ﺍﳌﺼﻔﻮﻓﺔ‬


‫ ﻭﺗﺬﻛﺮ ﺩﺍﺋﻤﹰﺎ ﺃﻧﻪ ﻋﻨﺪ ﲤﺮﻳﺮ ﻣﺼﻔﻮﻓﺔ ﻣﺎ ﻛﻮﺳﻴﻄﺔ ﻟﺪﺍﻟﺔ ﳚﺐ ﲤﺮﻳﺮ ﺣﺠـﻢ‬modify Array
.‫ﺍﳌﺼﻔﻮﻓﺔ ﺣﱴ ﻳﺘﺴﲎ ﻟﻠﺪﺍﻟﺔ ﻣﻌﺎﳉﺔ ﻛﻞ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ‬

‫ﺍﳌﺼﻔﻮﻓﺎﺕ ﻣﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ‬


Multidimensional Arrays
5.6

90
‫ﳝﻜﻦ ﻟﻠﻤﺼﻔﻮﻓﺎﺕ ﰲ ‪ C+ +‬ﺃﻥ ﺗﻜﻮﻥ ﻣﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ ﻭﳝﻜﻦ ﻛﺬﻟﻚ ﺃﻥ ﻳﻜـﻮﻥ‬
‫ﻛﻞ ﺑﻌﺪ ﲝﺠﻢ ﳐﺘﻠﻒ ‪ ،‬ﺍﻻﺳﺘﻌﻤﺎﻝ ﺍﻟﺸﺎﺋﻊ ﻟﻠﻤﺼﻔﻮﻓﺎﺕ ﻣﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ ﻫـﻮ ﲤﺜﻴـﻞ ﺍﳉـﺪﺍﻭﻝ‬
‫‪ Tables‬ﺍﻟﺘﺎﱄ ﲢﺘﻮﻱ ﻋﻠﻰ ﺑﻴﺎﻧﺎﺕ ﻣﺮﺗﺒﺔ ﰲ ﺻﻮﺭﺓ ﺻﻔﻮﻑ ﻭﺃﻋﻤﺪﺓ ﻭﻟﺘﻤﺜﻴﻞ ﺍﳉﺪﻭﻝ ﳓﺘـﺎﺝ‬
‫ﻟﺒﻌﺪﻳﻦ ﺍﻷﻭﻝ ﳝﺜﻞ ﺍﻟﺼﻔﻮﻑ ﻭﺍﻟﺜﺎﱐ ﳝﺜﻞ ﺍﻷﻋﻤﺪﺓ‪.‬‬
‫ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﻣﺼﻔﻮﻓﺔ ‪ A‬ﲢﺘﻮﻯ ﻋﻠﻰ ﺛﻼﺛﺔ ﺻﻔﻮﻑ ﻭﺃﺭﺑﻊ ﺃﻋﻤﺪﺓ‪.‬‬

‫‪Column 0‬‬ ‫‪Column1‬‬ ‫‪Column2‬‬ ‫‪Column 3‬‬


‫‪Row 0‬‬ ‫]‪A[0][0‬‬ ‫]‪A[0][1‬‬ ‫]‪A[0][2‬‬ ‫]‪A[0][3‬‬
‫‪Row 1‬‬ ‫]‪A[1][0‬‬ ‫]‪A[1][1‬‬ ‫]‪A[1][2‬‬ ‫]‪A[1][3‬‬
‫‪Row 2‬‬ ‫]‪A[2][0‬‬ ‫]‪A[2][1‬‬ ‫]‪A[2][2‬‬ ‫]‪A[2][3‬‬

‫ﻳﺘﻢ ﲤﺜﻴﻞ ﺃﻱ ﻋﻨﺼﺮ ﰲ ﺍﳌﺼﻔﻮﻓﺔ ‪ A‬ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ ]‪ A[i][j‬ﺣﻴﺚ‪-:‬‬


‫‪ : A‬ﺍﺳﻢ ﺍﳌﺼﻔﻮﻓﺔ‪.‬‬
‫‪ : i‬ﺭﻗﻢ ﺍﻟﺼﻒ ﺍﻟﺬﻱ ﻳﻨﺘﻤﻲ ﺇﻟﻴﻪ ﺍﻟﻌﻨﺼﺮ‪.‬‬
‫‪ : j‬ﺭﻗﻢ ﺍﻟﻌﻤﻮﺩ ﺍﻟﺬﻱ ﻳﻨﺘﻤﻲ ﺇﻟﻴﻪ ﺍﻟﻌﻨﺼﺮ‪.‬‬
‫ﻼ ﻳﻜﻮﻥ ﺍﻟﻔﻬﺮﺱ ﺍﻷﻭﻝ ﳍﺎ ﻫﻮ ‪ 0‬ﻭﻛﻞ‬
‫ﻻﺣﻆ ﺃﻥ ﻛﻞ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﻟﺼﻒ ﺍﻷﻭﻝ ﻣﺜ ﹰ‬
‫ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﻟﻌﻤﻮﺩ ﺍﻟﺮﺍﺑﻊ ﻳﻜﻮﻥ ﺍﻟﻔﻬﺮﺱ ﺍﻟﺜﺎﱐ ﳍﺎ ﻫﻮ ‪.3‬‬
‫ﻳﺘﻢ ﺍﻹﻋﻼﻥ ﻋﻦ ﻣﺼﻔﻮﻓﺔ ‪ a‬ﲢﺘﻮﻯ ﻋﻠﻰ ‪ x‬ﺻﻒ ﻭ ‪ y‬ﻋﻤﻮﺩ ﻫﻜﺬﺍ‪:‬‬
‫;]‪int a[x][y‬‬
‫ﳝﻜﻦ ﲤﻬﻴﺪ ﻗﻴﻤﺔ ﺍﳌﺼﻔﻮﻓﺔ ﺍﳌﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ ﻋﻨﺪ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ ﻭﺫﻟﻚ ﻛﺎﻵﰐ‪:‬‬
‫;}}‪int b[2][2]={{1,2},{3,4‬‬
‫ﺣﻴﺚ‪:‬‬
‫‪b[1][1]=4,‬‬ ‫‪b[1][0]=3,‬‬ ‫‪b[0][1]=2,‬‬ ‫‪b[0][0]=1‬‬
‫ﺃﻳﻀﹰﺎ ﻫﻨﺎ ﰲ ﺍﳌﺼﻔﻮﻓﺔ ﻣﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ ﺇﺫﺍ ﰎ ﲤﻬﻴﺪﻫﺎ ﻋﻨﺪ ﻗﻴﻢ ﻻ ﻳﺘﻮﺍﻓﻖ ﻋﺪﺩﻫﺎ ﻣﻊ ﺣﺠﻢ ﺍﳌﺼﻔﻮﻓﺔ‬
‫ﻓﺈﻥ ﺍﳌﺼﺮﻑ ﺳﻴﻤﻸ ﺑﻘﻴﺔ ﺍﻟﻌﻨﺎﺻﺮ ﺃﺻﻔﺎﺭ‪.‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﲤﻬﻴﺪ ﻣﺼﻔﻮﻓﺎﺕ ﻣﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ ﻋﻨﺪ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ‪:‬‬

‫‪//Program 5-9:‬‬
‫‪// initializing multidimensional arrays‬‬
‫>‪#include<iostream.h‬‬
‫;)]‪void printarray(int [ ] [3‬‬

‫‪91‬‬
int main( )
//continued
{
int array1[2] [3] = { {1, 2, 3}, {4, 5, 6}},
array2[2] [3] = {1, 2, 3, 4, 5},
array3[2] [3] = { {1, 2}, {4} };
cout << “values in array1 by row are : “ << endl;
printArray(array1);
//Continued
cout << “values in array2 by row are : “ << endl;
printArray(array2);
cout << “values in array3 by row are : “ << endl;
printArray(array3);
return 0;
}
void printArray(int a[ ][3])
{
for (int i=0; i<1; i++) {
for (int j=0; j<2; j++)
cout << a[i][j] <<’ ‘;
cout << endl;
}
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

values in array 1 by row are:


1 2 3
4 5 6
values in array 2 by row are:
1 2 3
4 5 0
values in array 3 by row are:
1 2 0

92
4 0 0

93
‫‪Pointers‬‬ ‫ﺍﳌﺆﺷﺮﺍﺕ‬ ‫‪5.7‬‬

‫ﻳﺴﺘﺨﺪﻡ ﺍﳌﺆﺷﺮ ﰲ ﻟﻐﺔ ‪ C+ +‬ﻛﻌﻨﻮﺍﻥ ﳌﺘﻐﲑ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ‪ ،‬ﺃﺣـﺪ ﺍﻻﺳـﺘﻌﻤﺎﻻﺕ‬


‫ﺍﳌﻬﻤﺔ ﻟﻠﻤﺆﺷﺮﺍﺕ ﻫﻮ ﺍﻟﺘﺨﺼﻴﺺ ﺍﻟﺪﻳﻨﺎﻣﻴﻜﻲ ﻟﻠﺬﺍﻛﺮﺓ ﺣﻴﺚ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﳌﺆﺷﺮﺍﺕ ﻹﻧﺸﺎﺀ ﺑﻨﻴـﺔ‬
‫ﻼ‬
‫ﺑﻴﺎﻧﺎﺕ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪.‬ﻳﺘﻢ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﳌﺆﺷﺮﺍﺕ ﻗﺒﻞ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﻓﻤﺜ ﹰ‬
‫ﺍﻟﻌﺒﺎﺭﺓ ‪:‬‬
‫;‪int *countptr‬‬
‫ﺗﻌﻠﻦ ﻋﻦ ﻣﺆﺷﺮ ‪ countptr‬ﻟﻴﺸﲑ ﺇﱃ ﻣﺘﻐﲑ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ *) int‬ﺍﳌﺬﻛﻮﺭﺓ ﻗﺒـﻞ‬
‫ﺍﺳﻢ ﺍﳌﺆﺷﺮ ﺗﺸﲑ ﻟﺬﻟﻚ( ﻭﻛﻞ ﻣﺘﻐﲑ ﻳﻌﻠﻦ ﻋﻨﻪ ﻛﻤﺆﺷﺮ ﳚﺐ ﺃﻥ ﻳﻜﺘﺐ ﰲ ﺍﻹﻋﻼﻥ ﻣﺴﺒﻮﻗﹰﺎ ﺑـ*‬
‫ﻼ ﺍﻹﻋﻼﻥ ‪:‬‬
‫ﻓﻤﺜ ﹰ‬
‫;‪float *xptr, *yptr‬‬
‫ﻼ ﻣﻦ ‪ xptr‬ﻭ ‪ yptr‬ﻣﻮﻗﻌﻲ ﻣﺆﺷﺮﺍﺕ ﻟﻘﻴﻢ ﻣﻦ ﺍﻟﻨـﻮﻉ ‪float‬‬
‫ﻳﺸﲑ ﻷﻥ ﻛ ﹰ‬
‫ﻭﳝﻜﻦ ﺃﻥ ﺗﺴﺘﺨﺪﻡ ﺍﳌﺆﺷﺮﺍﺕ ﻟﺘﺸﲑ ﻷﻱ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﺁﺧﺮ‪.‬‬
‫ﻼ ﺍﻹﻋﻼﻥ ‪:‬‬
‫ﺗﺬﻛﺮ ﺩﺍﺋﻤﹰﺎ ﻋﻨﺪ ﺍﻹﻋﻼﻥ ﻋﻦ ﺃﻱ ﻣﺆﺷﺮ ﺃﻥ ﺗﺴﺒﻖ * ﻛﻞ ﻣﺆﺷﺮ ﻋﻠﻰ ﺣﺪﺓ ﻓﻤﺜ ﹰ‬
‫;‪ Int *xptr, yptr‬ﻟﻴﺲ ﺻﺤﻴﺤﹰﺎ‪.‬‬
‫ﳚﺐ ﺃﻥ ﺗﻌﻠﻦ ﻋﻦ ﻫﺬﻩ ﺍﳌﺆﺷﺮﺍﺕ ﻛﺎﻵﰐ‪:‬‬
‫;‪int *xptr, *yptr‬‬
‫ﳝﻜﻦ ﲤﻬﻴﺪ ﺍﳌﺆﺷﺮﺍﺕ ﻋﻨﺪ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ ﻋﻨﺪ ﻗﻴﻤﺔ ‪ 0‬ﺃﻭ ‪ null‬ﺃﻭ ﻋﻨﺪ ﻗﻴﻤﺔ ﻋﻨﻮﺍﻥ‬
‫ﰲ ﺍﻟﺬﺍﻛﺮﺓ ‪ .‬ﺍﳌﺆﺷﺮ ﺍﻟﺬﻱ ﳛﻤﻞ ﺍﻟﻘﻴﻤﺔ ‪ 0‬ﺃﻭ ‪ null‬ﻻ ﻳﺸﲑ ﻷﻱ ﻣﺘﻐﲑ ‪ .‬ﲤﻬﻴﺪ ﺍﳌﺆﺷﺮ ﻋﻨـﺪ ‪0‬‬
‫ﻳﻜﺎﻓﺊ ﲤﻬﻴﺪﻩ ﻋﻨﺪ ‪ null‬ﻭﻟﻜﻦ ﰲ ‪ C+ +‬ﻳﻔﻀﻞ ﲤﻬﻴﺪ ﺍﳌﺆﺷﺮ ﻋﻨﺪ ﺍﻟﻘﻴﻤﺔ ‪.0‬‬
‫ﻋﻮﺍﻣﻞ ﺍﳌﺆﺷﺮﺍﺕ‪-:‬‬
‫‪ /1‬ﻋﺎﻣﻞ ﺍﻟﻌﻨﻮﺍﻥ &‪-:‬‬
‫ﺍﻟﻌﺎﻣﻞ & ﻳﺴﻤﻰ ﻋﺎﻣﻞ ﺍﻟﻌﻨﻮﺍﻥ ﻭﻫﻮ ﻋﺎﻣﻞ ﺃﺣﺎﺩﻯ ﻳﺴﺘﻌﻤﻞ ﳌﻌﺮﻓﺔ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟـﺬﻱ‬
‫ﻼ ﺇﺫﺍ ﺍﺳﺘﻌﻤﻠﻨﺎ ﺍﻹﻋﻼﻥ‪:‬‬
‫ﳛﺘﻠﻪ ﻣﺘﻐﲑ ﻣﺎ ]ﻳﺮﺟﻊ ﻋﻨﻮﺍﻥ ﻣﻌﺎﻣﻠﻪ[ ﻓﻤﺜ ﹰ‬
‫;‪int y= 5‬‬
‫;‪int *yptr‬‬
‫ﺍﻟﻌﺒﺎﺭﺓ‪yptr =&y; :‬‬
‫ﺗﻘﻮﻡ ﺑﺘﻌﻴﲔ ﻋﻨﻮﺍﻥ ﺍﳌﺘﻐﲑ ‪ y‬ﻟﻠﻤﺆﺷﺮ ‪ yptr‬ﻭﻳﻘﺎﻝ ﺃﻥ ‪ yptr‬ﻳﺸﲑ ﻟـ ‪. y‬‬

‫‪94‬‬
‫ﺇﻧﺘﺒﻪ ﻟﻠﻔﺮﻕ ﺑﲔ ﻋﺎﻣﻞ ﺍﻟﻌﻨﻮﺍﻥ & ﺍﻟﺬﻱ ﻳﺴﺒﻖ ﺍﺳﻢ ﺍﳌﺘﻐﲑ‪ ،‬ﻭﺑﲔ ﻋﺎﻣﻞ ﺍﳌﺮﺟﻊ ﺍﻟﺬﻱ ﻳﻠﻲ‬
‫ﺍﺳﻢ ﺍﻟﻨﻮﻉ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ‪.‬‬

‫‪ /2‬ﺍﻟﻌﺎﻣﻞ * ‪:‬‬
‫ﺍﻟﻌﺎﻣﻞ * ﺃﻳﻀﹰﺎ ﻋﺎﻣﻞ ﺃﺣﺎﺩﻯ ﻭﻫﻮ ﻳﺮﺟﻊ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﳛﻤﻠﻬﺎ ﻣﻌﺎﻣﻠﻪ ‪ ،‬ﻭﻋﻠﻴﻪ ﺍﻟﻌﺒﺎﺭﺓ‬
‫; ‪cout << * yptr << endl‬‬
‫ﺗﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﻗﻴﻤﺔ ﺍﳌﺘﻐﲑ ‪ y‬ﻭﺍﻟﱵ ﻫﻲ ‪. 5‬‬
‫ﻭﺍﻟﻌﺒﺎﺭﺓ‪ cout<<yptr; :‬ﺗﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻟﻘﻴﻤﺔ ‪ 314,701‬ﻭﺍﻟﱵ ﻫﻲ ﻋﻨﻮﺍﻥ ﺍﳌﺘﻐﲑ ‪ ، y‬ﺑﻌﺪ ﺃﻥ‬
‫ﰎ ﺗﻌﻴﲔ ﺍﳌﺘﻐﲑ ‪ y‬ﺇﱃ ‪. yptr‬‬
‫ﺍﻟﺸﻜﻞ)‪ (5-1‬ﻳﺒﲔ ﻫﺬﺍ‪:‬‬

‫‪314,700‬‬
‫‪yptr‬‬
‫ﺟﺰﺀ ﻣﻦ‬
‫‪314,701‬‬
‫‪5‬‬ ‫ﺍﻟﺬﺍﻛﺮﺓ‬
‫‪314,702‬‬ ‫‪5‬‬ ‫‪y‬‬
‫ﺍﻟﱵ ﳛﺘﻠﻬﺎ‬
‫‪314,703‬‬ ‫ﺍﻟﱪﻧﺎﻣﺞ‬
‫‪ *yptr‬ﻳﺴﺎﻭﻯ ‪5‬‬

‫ﺷﻜﻞ )‪ (5-1‬ﻳﻮﺿﺢ ﺍﳌﺨﺮﺝ ﻣﻦ ‪*yptr‬‬

‫ﻭﻋﻨﺪﻣﺎ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ * ﻋﻠﻰ ﻳﺴﺎﺭ ﺍﺳﻢ ﺍﳌﺘﻐﲑ ﻛﻤﺎ ﺣﺼﻞ ﰲ ﺍﻟﺘﻌﺒﲑ ‪ *yptr‬ﻓﺈﻧﻪ ﻳﺴﻤﻰ‬
‫ﻋﺎﻣﻞ ﺍﳌﻮﺍﺭﺑﺔ ‪.indirection‬‬

‫ﺍﻟﻌﺎﻣﻞ * ﻋﻨﺪ ﺍﺳﺘﻌﻤﺎﻟﻪ ﻛﻌﺎﻣﻞ ﻣﻮﺍﺭﺑﺔ ﻟﻪ ﻣﻌﲎ ﳐﺘﻠﻒ ﻋﻦ ﻣﻌﻨﺎﻩ ﻋﻨﺪ ﺍﺳﺘﻌﻤﺎﻟﻪ ﻟﻺﻋﻼﻥ‬
‫ﻋﻦ ﺍﳌﺘﻐﲑﺍﺕ ﺍﳌﺆﺷﺮﺓ‪ .‬ﻳﺴﺒﻖ ﻋﺎﻣﻞ ﺍﳌﻮﺍﺭﺑﺔ ﺍﺳﻢ ﺍﳌﺘﻐﲑ ﻭﻳﻌﲎ ﻗﻴﻤﺔ ﺍﳌﺘﻐﲑ ﺍﳌﺸﺎﺭ ﺇﻟﻴﻪ‪ .‬ﺃﻣﺎ‬
‫* ﺍﳌﺴﺘﻌﻤﻠﺔ ﰲ ﺍﻹﻋﻼﻥ ﻓﺘﻌﲎ ﻣﺆﺷﺮ ﺇﱃ‪.‬‬

‫‪95‬‬
Int *yptr ; ( ‫)ﺇﻋﻼﻥ‬
*yptr=5; (‫)ﻣﻮﺍﺭﺑﺔ‬
. * ‫ﺍﻟﱪﻧﺎﻣﺞ ﻳﻮﺿﺢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ & ﻭﺍﻟﻌﺎﻣﻞ‬

//Program 5-10:
// using the & and * operators
#include<iostream.h>
main ( )
{
int a ; //a is an integer
int *aptr; // aptr is apointer to an integer
a = 7;
aptr = &a; // aptr set to address of a
cout <<” The address of a is “ << &a <<endl
<< “The value of aptr is “ << aptr<< endl<< endl;

cout << “The value of a is “ << a<< endl


<< “The value of *aptr is “ << *aptr<< endl<<endl;
cout<<” Proving that * and & are complement of “
<< “each other.” <<endl<< “ & *ptr = “<< & *aptr
<< endl<< “ *&aptr = “ << *&aptr <<endl;
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

96
‫‪The address of a is oxfff4‬‬
‫‪The value of aptr is oxfff4‬‬

‫‪The value of a is 7‬‬


‫‪The value of *aptr is 7‬‬

‫‪Proving that * and & are complements of each other‬‬


‫‪&* aptr = oxfff4‬‬
‫‪*& aptr = oxfff4‬‬

‫ﻣﺆﺷﺮﺍﺕ ﺇﱃ ‪-:void‬‬
‫ﻼﻻ‬
‫ﻋﺎﺩﺓ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﺬﻱ ﻧﻀﻌﻪ ﰲ ﺍﳌﺆﺷﺮ ﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﻣﻦ ﻧﻔﺲ ﻧﻮﻉ ﺍﳌﺆﺷﺮ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﳝﻜﻨﻨﺎ ﺗﻌﻴﲔ ﻋﻨﻮﺍﻥ ﻣﺘﻐﲑ ‪ float‬ﺇﱃ ﻣﺆﺷﺮ ‪ ، int‬ﻟﻜﻦ ﻫﻨﺎﻟﻚ ﻧﻮﻉ ﻣﻦ ﺍﳌﺆﺷﺮﺍﺕ ﳝﻜﻨﻬﺎ ﺃﻥ‬
‫ﺗﺸﲑ ﺇﱃ ﺃﻱ ﻧﻮﻉ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺗﺴﻤﻰ ﻣﺆﺷﺮﺍﺕ ﺇﱃ ‪ void‬ﻭﻳﺘﻢ ﺗﻌﺮﻳﻔﻬﺎ ﻛﺎﻵﰐ‪-:‬‬
‫;‪void * ptr‬‬
‫ﻼ ﻟﺘﻤﺮﻳﺮ ﺍﳌﺆﺷﺮﺍﺕ ﺇﱃ ﺩﺍﻻﺕ‬ ‫ﳍﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﳌﺆﺷﺮﺍﺕ ﺍﺳﺘﻌﻤﺎﻻﺕ ﺧﺎﺻﺔ ﻓﻬﻮ ﻳﺴﺘﺨﺪﻡ ﻣﺜ ﹰ‬
‫ﺗﻌﻤﻞ ﻋﻠﻰ ﻋﺪﺓ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﺃﻧﻪ ﺇﺫﺍ ﱂ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﻣﺆﺷﺮﺍﺕ ﺇﱃ ‪ void‬ﳚﺐ ﺃﻥ ﻧﻌﲔ ﻟﻠﻤﺆﺷﺮ ﻋﻨﻮﺍﻧﹰﺎ ﻣﻦ‬
‫ﻧﻔﺲ ﻧﻮﻋﻬﺎ‪:‬‬

‫‪//Program 5-11:‬‬
‫>‪#include<iostream.h‬‬
‫) (‪void main‬‬
‫;‪int intvar‬‬
‫;‪float flovar‬‬
‫;‪int* ptrint‬‬
‫;‪void* ptrvoid‬‬
‫;‪ptr* ptrflovar‬‬
‫;‪ptrint=&intvar‬‬
‫‪// ptr int = &flovar; //Error‬‬
‫‪// ptr flo = &intvar; //Error‬‬

‫‪97‬‬
‫;‪ptrvoid=&intvar‬‬
‫;‪ptrvoid=&flovar‬‬
‫}‬

‫ﰲ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ ﳝﻜﻦ ﺗﻌﻴﲔ ﻋﻨﻮﺍﻥ ﺍﳌﺘﻐﲑ ‪ intvar‬ﺇﱄ ﺍﳌﺆﺷﺮ ‪ ptr int‬ﻷ‪‬ﻤﺎ‬
‫ﻣﻦ ﺍﻟﻨﻮﻉ *‪ int‬ﻟﻜﻦ ﻻ ﳝﻜﻨﻨﺎ ﺗﻌﻴﲔ ﻋﻨﻮﺍﻥ ﺍﳌﺘﻐﲑ ‪ flovar‬ﺇﱃ ﺍﳌﺆﺷﺮ ‪ ptrint‬ﻷﻥ ﺍﻷﻭﻝ‬
‫ﻣﻦ ﺍﻟﻨﻮﻉ *‪ float‬ﻭﺍﻟﺜﺎﱏ ﻣﻦ ﺍﻟﻨﻮﻉ *‪ . int‬ﻟﻜﻦ ﳝﻜﻦ ﺗﻌﻴﲔ ﺃﻱ ﻧﻮﻉ ﻣﺆﺷﺮﺍﺕ ﺇﱃ ﺍﳌﺆﺷﺮ‬
‫‪ ptrvoid‬ﻷﻧﻪ ﻣﺆﺷﺮ ﺇﱃ ‪.void‬‬

‫‪98‬‬
‫ﺍﳌﺆﺷﺮﺍﺕ ﰲ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﻭﺍﻝ‬ ‫‪5.8‬‬

‫ﻫﻨﺎﻟﻚ ﺛﻼﺙ ﻃﺮﻕ ﻟﺘﻤﺮﻳﺮ ﺍﻟﻮﺳﺎﺋﻂ ﻟﻠﺪﻭﺍﻝ ‪-:‬‬


‫‪ -1‬ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﻟﻘﻴﻤﺔ ‪. call-by-value‬‬
‫‪ -2‬ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﳌﺮﺟﻊ ‪. call-by-reference‬‬
‫ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﳌﺮﺟﻊ ﻣﻊ ﻣﺆﺷﺮ ‪call by reference with pointer‬‬ ‫‪-3‬‬

‫‪.arguments‬‬
‫ﻛﻤﺎ ﺫﻛﺮﻧﺎ ﺳﺎﺑﻘﹰﺎ ﺃﻥ ﺍﻟﻌﺒﺎﺭﺓ ‪ return‬ﺗﺴﺘﻌﻤﻞ ﻹﻋﺎﺩﺓ ﻗﻴﻤﺔ ﻣﻦ ﺩﺍﻟﺔ ﻣﺴـﺘﺪﻋﺎﺓ‬
‫ﻭﺭﺃﻳﻨﺎ ﺃﻳﻀﹰﺎ ﺃﻧﻪ ﳝﻜﻦ ﲤﺮﻳﺮ ﺍﻟﻮﺳﺎﺋﻂ ﻟﻠﺪﻭﺍﻝ ﺑﺎﳌﺮﺟﻊ ﺣﱴ ﻳﺘﺴﲎ ﻟﻠﺪﺍﻟﺔ ﺍﻟﺘﻌﺪﻳﻞ ﰲ ﺍﻟﺒﻴﺎﻧـﺎﺕ‬
‫ﺍﻷﺻﻠﻴﺔ ﻟﻠﻮﺳﺎﺋﻂ ‪،‬ﻳﺴﺘﺨﺪﻡ ﻣﱪﳎﻮ ‪ C++‬ﺍﳌﺆﺷﺮﺍﺕ ﶈﺎﻛﺎﺓ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﻭﺍﻝ ﺑﺎﳌﺮﺟﻊ ‪ .‬ﻋﻨـﺪ‬
‫ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﻳﺘﻢ ﲤﺮﻳﺮ ﻋﻨﻮﺍﻥ ﺍﻟﻮﺳﻴﻄﺔ ﻭﻳﺘﻢ ﺫﻟﻚ ﺑﻜﺘﺎﺑﺔ ﻋﺎﻣﻞ ﺍﻟﻌﻨﻮﺍﻥ ﻟﻠﻮﺳﻴﻄﺔ ﺍﳌﻄﻠـﻮﺏ‬
‫ﻣﻌﺎﳉﺘﻬﺎ ‪ .‬ﻋﻨﺪﻣﺎ ﻳﺘﻢ ﲤﺮﻳﺮ ﻋﻨﻮﺍﻥ ﺍﻟﻮﺳﻴﻄﺔ ﻟﻠﺪﺍﻟﺔ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ * ﻟﻠﻮﺻـﻮﻝ ﻟﻘﻴﻤـﺔ‬
‫ﺍﳌﺘﻐﲑ ‪.‬‬
‫ﺍﻟﱪﻧﺎﳎﺎﻥ ﺃﺩﻧﺎﻩ ﳛﺘﻮﻳﺎﻥ ﻋﻠﻰ ﺇﺻﺪﺍﺭﻳﻦ ﻣﻦ ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﺑﺘﻜﻌﻴﺐ ﻋﺪﺩ ﺻﺤﻴﺢ‪.‬‬

‫‪//Program 5-12:‬‬
‫‪// Cube a variable using call-by-value‬‬
‫>‪#include<iostream.h‬‬
‫;)‪int cubeByValue(int‬‬ ‫‪// prototype‬‬
‫) (‪int main‬‬
‫{‬
‫;‪int number = 5‬‬
‫“ ‪cout <<” The original value of number is‬‬
‫;‪<<number<<endl‬‬
‫;)‪number = cubeByValue(number‬‬
‫;‪cout << “ The new value of number is “ << number<< endl‬‬
‫;‪return 0‬‬
‫}‬
‫)‪int cubeByValue(int n‬‬
‫{‬

‫‪99‬‬
return n*n*n; // cube local variable n
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

The original value of number is 5


The new value of number is 125

‫ﻳﻘﻮﻡ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺘﻤﺮﻳﺮ ﺍﳌﺘﻐﲑ ﻛﻮﺳﻴﻄﺔ ﻟﻠﺪﺍﻟﺔ ﻣﺴﺘﺨﺪﻣﹰﺎ ﻃﺮﻳﻘﺔ ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﻟﻘﻴﻤـﺔ‬
‫ ﻭﺗﻘﻮﻡ ﺑﺈﺭﺟﺎﻉ ﺍﻟﻨﺘﻴﺠـﺔ‬number ‫ ﺑﺘﻜﻌﻴﺐ ﺍﳌﺘﻐﲑ‬cubebyvalue ‫ﺣﻴﺚ ﺗﻘﻮﻡ ﺍﻟﺪﺍﻟﺔ‬
. return ‫ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﺒﺎﺭﺓ‬main ‫ﻟﻠﺪﺍﻟﺔ‬
cube by ‫ ﻛﻮﺳﻴﻄﺔ ﻟﻠﺪﺍﻟﺔ‬number ‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺘﻢ ﲤﺮﻳﺮ ﻋﻨﻮﺍﻥ ﺍﳌﺘﻐﲑ‬
.nptr ‫ ﺣﻴﺚ ﺗﻘﻮﻡ ﺍﻟﺪﺍﻟﺔ ﺑﺘﻜﻌﻴﺐ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﻳﺸﲑ ﺇﱄ ﺍﳌﺆﺷﺮ‬reference

//Program 5-13:
// cube a variable using call-by-reference with a
pointer argument
#include<iostream.h>
void cubeByReference (int *); // prototype
main( )
{
int number = 5;
cout<< “ The original value of number is “ << number
<<endl;
cubeByReference(&number);
cout<< “ The new value of number is “ << number <<endl;
return 0;
}
void cubeByReference (int *nPtr)
{
*nPtr = *nPtr * *nPtr * *nPtr; // cube number in
main
}

100
‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪The original value of number is 5‬‬


‫‪The new value of number is 125‬‬

‫ﻧﺬﻛﺮ ﻫﻨﺎ ﺃﻥ ﺍﻟﺪﺍﻟﺔ ﺍﻟﱵ ﻳﺘﻢ ﲤﺮﻳﺮ ﻋﻨﻮﺍﻥ ﻣﺘﻐﲑ ﻛﻮﺳﻴﻄﺔ ﳍﺎ ﳚـﺐ ﺃﻥ ﻳـﺘﻢ ﻓﻴﻬـﺎ‬
‫ﻼ ﰲ ﺍﻟﺪﺍﻟﺔ ‪-:cubeByReference‬‬ ‫ﺗﻌﺮﻳﻒ ﻣﺆﺷﺮ ﳛﻤﻞ ﻗﻴﻤﺔ ﺍﻟﻌﻨﻮﺍﻥ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫)‪void cubeByReference (int *nptr‬‬
‫‪ cubeByReference‬ﻳﺸﲑ ﺇﱃ ﺃﻧﻪ ﺳﻴﺘﻢ ﲤﺮﻳﺮ ﻋﻨـﻮﺍﻥ‬ ‫ﺍﳌﺼﺮﺡ ﰲ ﺍﻟﺪﺍﻟﺔ‬
‫ﳌﺘﻐﲑ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ integer‬ﻛﻮﺳﻴﻄﺔ ﳍﺎ ﻭﻳﺘﻢ ﲣﺰﻳﻦ ﺍﻟﻌﻨﻮﺍﻥ ﰲ ﺍﳌﺆﺷـﺮ ‪ nptr‬ﻭﻫـﻰ ﻻ‬
‫ﺗﺮﺟﻊ ﻗﻴﻤﺔ ﻟﻠﺪﺍﻟﺔ ‪.main‬‬
‫ﻭﻛﻤﺎ ﺫﻛﺮﻧﺎ ﺳﺎﺑﻘﹰﺎ ﺃﻧﻪ ﰲ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻟﺪﺍﻟﺔ ﻳﻜﻔﻰ ﻓﻘﻂ ﺫﻛﺮ ﻧﻮﻉ ﺍﳌﺘﻐﲑ ﺍﻟـﺬﻱ‬
‫ﺳﻴﺘﻢ ﲤﺮﻳﺮﻩ ﻛﻮﺳﻴﻄﺔ ﻟﻠﺪﺍﻟﺔ ﺩﻭﻥ ﺫﻛﺮ ﺍﺳﻢ ﺍﳌﺘﻐﲑ ﰒ ﺍﻹﻋـﻼﻥ ﻋـﻦ ﺍﻟﺪﺍﻟـﺔ ‪cube by‬‬
‫‪ reference‬ﻛﺎﻵﰐ‪-:‬‬
‫)* ‪void cubeByReference (int‬‬

‫‪101‬‬
‫ﺍﳌﺆﺷﺮﺍﺕ ﻭﺍﳌﺼﻔﻮﻓﺎﺕ‬ ‫‪5.9‬‬

‫ﻋﺮﻓﻨﺎ ﺳﺎﺑﻘﹰﺎ ﻛﻴﻒ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﺨﺰﻧﺔ ﰲ ﺍﳌﺼﻔﻮﻓﺎﺕ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﺳﻢ‬
‫ﺍﳌﺼﻔﻮﻓﺔ ﻭﻓﻬﺮﺱ ﺍﻟﻌﻨﺼﺮ‪ .‬ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻫﺬﺍ‪:‬‬
‫;}‪int array1[3]={1,2,3‬‬
‫)‪for (int j=0;j<3;j++‬‬
‫;]‪cout<<endl<<array1[j‬‬
‫ﻳﻌﺮﺽ ﺍﳉﺰﺀ ﺍﻟﺴﺎﺑﻖ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ ‪ array1‬ﻛﺎﻵﰐ‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱄ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺎﺕ ﺃﻳﻀﹰﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﳌﺆﺷﺮﺍﺕ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻛﻴﻒ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﻋﻨﺎﺻﺮ ﻧﻔﺲ ﺍﳌﺼﻔﻮﻓﺔ ﺍﻟﺴﺎﺑﻘﺔ ﺑﺎﺳﺘﻌﻤﺎﻝ‬
‫ﺍﳌﺆﺷﺮﺍﺕ‪:‬‬
‫;}‪int array1[3]={1,2,3‬‬
‫)‪for (int j=0;j<3;j++‬‬
‫;)‪cout<<endl<< *(array1+j‬‬
‫ﺃﻳﻀﹰﺎ ﻳﻌﺮﺽ ﻫﺬﺍ ﺍﳉﺰﺀ‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫ﺍﻟﺘﻌﺒﲑ ;)‪ *(array1+j‬ﻟﻪ ﻧﻔﺲ ﺗﺄﺛﲑ ﺍﻟﺘﻌﺒﲑ ]‪ array1[j‬ﻭﺫﻟﻚ ﻟﻶﰐ‪:‬‬
‫ﺍﻓﺮﺽ ﺃﻥ ‪ j=1‬ﻟﺬﺍ ﻳﻜﻮﻥ ﺍﻟﺘﻌﺒﲑ )‪ *(array1+j‬ﻣﺮﺍﺩﻓﹰﺎ ﻟﻠﺘﻌﺒﲑ )‪ *(array1+1‬ﻭﳝﺜﻞ ﻫﺬﺍ‬
‫ﳏﺘﻮﻳﺎﺕ ﺍﻟﻌﻨﺼﺮ ﺍﻟﺜﺎﱐ ﰲ ﺍﳌﺼﻔﻮﻓﺔ ‪ array1‬ﻭﺇﻥ ﺍﺳﻢ ﺍﳌﺼﻔﻮﻓﺔ ﳝﺜﻞ ﻋﻨﻮﺍ‪‬ﺎﻭﻫﻮ ﻋﻨـﻮﺍﻥ ﺃﻭﻝ‬
‫ﻋﻨﺼﺮ ﰲ ﺍﳌﺼﻔﻮﻓﺔ‪ ،‬ﻭﳍﺬﺍ ﻓﺎﻟﺘﻌﺒﲑ ‪ array+1‬ﻳﻌﲎ ﻋﻨـﻮﺍﻥ ﺍﻟﻌﻨﺼـﺮ ﺍﻟﺜـﺎﱐ ﰲ ﺍﳌﺼـﻔﻮﻓﺔ ﻭ‬
‫‪ array1+2‬ﻳﻌﲎ ﻋﻨﻮﺍﻥ ﺍﻟﻌﻨﺼﺮ ﺍﻟﺜﺎﻟﺚ ﰲ ﺍﳌﺼﻔﻮﻓﺔ ‪ ،‬ﻭﻟﻜﻨﻨﺎ ﻧﺮﻳﺪ ﻃﺒﺎﻋﺔ ﻗﻴﻢ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ‬
‫‪ array‬ﻭﻟﻴﺲ ﻋﻨﺎﻭﻳﻨﻬﺎ‪ ،‬ﳍﺬﺍ ﺍﺳﺘﻌﻤﻠﻨﺎ ﻋﺎﻣﻞ ﺍﳌﻮﺍﺭﺑﺔ ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﻗﻴﻢ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ‪.‬‬

‫‪102‬‬
‫ﺍﳌﺆﺷﺮﺍﺕ ﻭﺍﻟﺴﻼﺳﻞ‬ ‫‪5.10‬‬

‫ﻛﻤﺎ ﺫﻛﺮﻧﺎ ﺳﺎﺑﻘﹰﺎ ﺍﻟﺴﻼﺳﻞ ﻫﻲ ﳎﺮﺩ ﻣﺼﻔﻮﻓﺎﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ char‬ﻟﺬﺍ ﳝﻜﻨﻨﺎ ﺍﺳﺘﺨﺪﺍﻡ‬
‫ﺍﳌﺆﺷﺮﺍﺕ ﻣﻊ ﺃﺣﺮﻑ ﺍﻟﺴﻼﺳﻞ ﻣﺜﻠﻤﺎ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻪ ﻋﻠﻰ ﻋﻨﺎﺻﺮ ﺃﻱ ﻣﺼﻔﻮﻓﺔ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﺘﻢ ﻓﻴﻪ ﺗﻌﺮﻳﻒ ﺳﻠﺴﻠﺘﲔ ﻭﺍﺣﺪﺓ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﳌﺼﻔﻮﻓﺎﺕ ﻛﻤﺎ ﰲ ﺃﻣﺜﻠﺔ‬
‫ﺍﻟﺴﻼﺳﻞ ﺍﻟﺴﺎﺑﻘﺔ ﻭﺍﻷﺧﺮﻯ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﳌﺆﺷﺮﺍﺕ‪:‬‬
‫;"‪char str1[ ] =”with array‬‬
‫;"‪char str2[ ] =”with pointer‬‬
‫;‪cout <<endl<<str1‬‬
‫;‪cout <<endl<<str2‬‬
‫;‪str2++‬‬
‫;‪cout <<endl<<str2‬‬
‫ﺗﺘﺸﺎﺑﻪ ﺍﻟﺴﻠﺴﻠﺘﺎﻥ ﺍﻟﺴﺎﺑﻘﺘﺎﻥ ﰲ ﻋﺪﺓ ﻧﻮﺍﺣﻲ ﺇﻻ ﺃﻥ ﻫﻨﺎﻟﻚ ﻓﺮﻕ ﻣﻬﻢ ‪ str1 :‬ﻫﻮ‬
‫ﻋﻨﻮﺍﻥ ﺃﻱ ﺛﺎﺑﺖ ﻣﺆﺷﺮ ﺑﻴﻨﻤﺎ ‪ str2‬ﻫﻮ ﻣﺘﻐﲑ ﻣﺆﺷﺮ‪.‬‬
‫ﺍﻟﺸﻜﻞ )‪ (5-2‬ﻳﺒﲔ ﻛﻴﻒ ﻳﺒﺪﻭ ﻫﺬﺍﻥ ﺍﻟﻨﻮﻋﺎﻥ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪:‬‬

‫‪W‬‬ ‫‪W‬‬
‫‪Str1‬‬

‫‪I‬‬ ‫‪I‬‬

‫‪T‬‬ ‫‪T‬‬
‫‪Str2‬‬
‫‪H‬‬ ‫‪H‬‬

‫‪A‬‬ ‫‪A‬‬

‫‪R‬‬ ‫‪R‬‬

‫ﺳﻠﺴﻠﺔ ﻣﻌﺮﻓﺔ ﻛﻤﺼﻔﻮﻓﺔ‬ ‫ﺳﻠﺴﻠﺔ ﻣﻌﺮﻓﺔ ﻛﻤﺆﺷﺮ‬


‫”‪char str1 = "with array‬‬ ‫”‪char* str2 = "with pointer‬‬
‫ﺷﻜﻞ )‪( 5-2‬ﻳﻮﺿﺢ ﳏﺘﻮﻯ ﺍﻟﺬﺍﻛﺮﺓ ﰲ ﺣﺎﻟﱵ ﺍﻟﺘﻌﺮﻳﻒ ﻛﺴﻠﺴﻠﺔ ﻭﺍﻟﺘﻌﺮﻳﻒ ﻛﻤﺆﺷﺮ‬

‫‪103‬‬
‫ﻟﺬﺍ ﳝﻜﻨﻨﺎ ﺯﻳﺎﺩﺓ ‪ str2‬ﻷﻧﻪ ﻣﺆﺷﺮ ﻭﻟﻜﻦ ﺑﺰﻳﺎﺩﺗﻪ ﺳﻴﺸﲑ ﺇﱃ ﺍﳊﺮﻑ ﺍﻟﺜﺎﱐ ﰲ ﺍﻟﺴﻠﺴﻠﺔ‬
‫ﻭﻋﻠﻴﻪ ﺍﳋﺮﺝ ﻣﻦ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ‪-:‬‬
‫‪with array‬‬
‫‪with pointer‬‬
‫‪ith pointer‬‬

‫ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﻮﺍﻣﻞ ﺍﳊﺴﺎﺑﻴﺔ ﻣﻊ ﺍﳌﺆﺷﺮﺍﺕ‬


‫‪5.11‬‬
‫ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺍﳌﺆﺷﺮﺍﺕ ﻣﻌﺎﻣﻼﺕ ﰲ ﺍﻟﺘﻌﺎﺑﲑ ﺍﳊﺴﺎﺑﻴﺔ ﻭﰱ ﺗﻌﺎﺑﲑ ﺍﻟﺘﻌﻴﲔ ﻭﺍﻟﺘﻌﺎﺑﲑ‬
‫ﺍﻟﻌﻼﺋﻘﻴﺔ ‪ .‬ﺳﻨﺘﻄﺮﻕ ﻫﻨﺎ ﻟﻠﻌﻮﺍﻣﻞ ﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺍﳌﺆﺷﺮﺍﺕ ﻣﻌﺎﻣﻼﺕ ﳍﺎ ﻭﻛﻴﻔﻴﺔ‬
‫ﺍﺳﺘﻌﻤﺎﻝ ﻫﺬﻩ ﺍﻟﻌﻮﺍﻣﻞ ﻣﻊ ﺍﳌﺆﺷﺮﺍﺕ ‪.‬‬
‫ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﻝ )‪ (++‬ﺃﻭ )‪ (--‬ﻟﺰﻳﺎﺩﺓ ﺃﻭ ﻧﻘﺼﺎﻥ ﺍﳌﺆﺷﺮﺍﺕ ﲟﻘﺪﺍﺭ ﻭﺍﺣﺪ ﻛﻤﺎ ﳝﻜﻦ ﺃﻳﻀﹰﺎ‬
‫ﺇﺿﺎﻓﺔ ﻣﺘﻐﲑ ﺻﺤﻴﺢ ﻟﻠﻤﺆﺷﺮ ﻋﻦ ﻃﺮﻳﻖ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ )‪ (+‬ﺃﻭ ﺍﻟﻌﺎﻣﻞ )=‪ (+‬ﻭﳝﻜﻦ ﻧﻘﺼﺎﻥ‬
‫ﻣﺘﻐﲑ ﺻﺤﻴﺢ ﻣﻦ ﻣﺆﺷﺮ ﻋﻦ ﻃﺮﻳﻖ ﺍﺳﺘﻌﻤﺎﻝ )‪ (-‬ﺃﻭ )=‪ (-‬ﻛﻤﺎ ﳝﻜﻦ ﺃﻳﻀﹰﺎ ﻧﻘﺼﺎﻥ ﺃﻭ ﺯﻳﺎﺩﺓ‬
‫ﻣﺆﺷﺮ ﳌﺆﺷﺮ ﺁﺧﺮ‪.‬‬
‫ﺍﻓﺘﺮﺽ ﺃﻧﻪ ﰎ ﺍﻹﻋﻼﻥ ﻋﻦ ﻣﺼﻔﻮﻓﺔ ]‪ ، int v[10‬ﳛﻤﻞ ﺍﻟﻌﻨﺼﺮ ﺍﻷﻭﻝ ﰲ‬
‫ﺍﳌﺼﻔﻮﻓﺔ ﺍﻟﻌﻨﻮﺍﻥ ‪ 3000‬ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬
‫ﺍﻓﺘﺮﺽ ﺃﻳﻀﹰﺎ ﺃﻧﻪ ﰎ ﲤﻬﻴﺪ ﻣﺆﺷﺮ ‪ vptr‬ﻟﻴﺸﲑ ﻟﻠﻌﻨﺼﺮ ﺍﻷﻭﻝ ﰲ ﺍﳌﺼﻔﻮﻓﺔ ]‪v[0‬‬
‫ﻭﻋﻠﻴﻪ ﻗﻴﻤﺔ ﺍﳌﺆﺷﺮ ‪ vptr‬ﻫﻲ ‪ ، 3000‬ﺍﻟﺸﻜﻞ )‪ (5-3‬ﻳﺒﲔ ﻫﺬﺍ‪-:‬‬

‫‪3000‬‬ ‫‪3004‬‬ ‫‪3008‬‬ ‫‪3012‬‬

‫‪.‬‬ ‫]‪V[0‬‬ ‫]‪V[1‬‬ ‫]‪V[2‬‬ ‫]‪V[3‬‬ ‫‪……….‬‬


‫‪vptr‬‬

‫ﺷﻜﻞ )‪ (5-3‬ﲤﻬﻴﺪ ‪ vptr‬ﻟﻴﺸﲑ ﻟﻠﻌﻨﺼﺮ ﺍﻷﻭﻝ ﰲ ﺍﳌﺼﻔﻮﻓﺔ‬

‫‪104‬‬
‫ﳝﻜﻦ ﲤﻬﻴﺪ ﺍﳌﺆﺷﺮ ‪ vptr‬ﻟﻴﺸﲑ ﻟﻠﻤﺼﻔﻮﻓﺔ ‪ v‬ﺑﺈﺣﺪﻯ ﺍﻟﻌﺒﺎﺭﺗﲔ ﺍﻟﺘﺎﻟﻴﺘﲔ‪:‬‬
‫;‪vptr = v‬‬
‫;]‪vptr = & v[0‬‬
‫‪ v‬ﻫﻮ ‪ 3000‬ﻭﻋﻨﻮﺍﻥ ﺍﻟﻌﻨﺼـﺮ ]‪ v[1‬ﻫـﻮ‬ ‫ﻋﻨﻮﺍﻥ ﺍﻟﻌﻨﺼﺮ ]‪ v[0‬ﰲ ﺍﳌﺼﻔﻮﻓﺔ‬
‫‪ 3004‬ﻭﺫﻟﻚ ﻷﻥ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ ‪ v‬ﻫﻲ ﻋﺒﺎﺭﺓ ﻋـﻦ ﻣـﺘﻐﲑﺍﺕ ﺻـﺤﻴﺤﺔ ‪integer‬‬
‫ﻭﺍﺳﺘﺨﺪﺍﻡ ﲤﺜﻞ ‪ 4bytes‬ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ‪ ،‬ﻭﻋﻠﻴﻪ ﻋﻨﺪ ﺇﺿـﺎﻓﺔ ﺃﻭ ﻃـﺮﺡ ﻣـﺘﻐﲑ ﺻـﺤﻴﺢ‬
‫‪ integer‬ﻣﻦ ﻣﺆﺷﺮ ﺗﺘﻢ ﺇﺿﺎﻓﺔ ﺍﳌﺘﻐﲑ ﻣﻀﺮﻭﺑﹰﺎ ﰲ ﺣﺠﻢ ﺍﳌﺘﻐﲑ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻭﺍﻟﺜﺎﱐ ﻳﻌﺘﻤـﺪ‬
‫ﻋﻠﻰ ﻧﻮﻉ ﺍﳌﺘﻐﲑ ﺣﻴﺚ ﳛﺘﻞ ﺍﳌﺘﻐﲑ ﺍﻟﺼﺤﻴﺢ ﻛﻤﺎ ﺫﻛﺮﻧﺎ ‪ 4bytes‬ﻭﺍﳌﺘﻐﲑ ﺍﳊـﺮﰲ ‪char‬‬
‫ﻼ‬
‫ﳛﺘﻞ ‪ 1byte‬ﻭﻋﻤﻮﻣﹰﺎ ﻳﻌﺘﻤﺪ ﺫﻟﻚ ﻋﻠﻰ ﻋﺪﺩ ﺍﻟـ‪ bytes‬ﺍﻟﺘﺎﱄ ﳛﺘﻠﻬﺎ ﺍﳌـﺘﻐﲑ ‪ ،‬ﻓﻤـﺜ ﹰ‬
‫ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ ‪:‬‬
‫;‪vptr +=2‬‬
‫ﺗﺆﺩﻯ ﻹﺿﺎﻓﺔ ‪ 8‬ﻟﻠﻤﺆﺷﺮ ‪ vptr‬ﺑﺎﻓﺘﺮﺍﺽ ﺃﻥ ﺍﳌﺘﻐﲑ ﺍﻟﺼﺤﻴﺢ ﳛﺘﻞ ‪4bytes‬‬
‫ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬
‫ﺇﺩﺍﺭﺓ ﺍﻟﺬﺍﻛﺮﺓ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﻮﺍﻣﻞ ‪ new‬ﻭ ‪-:delete‬‬
‫ﺗﺴﺘﻌﻤﻞ ﺍﳌﺼﻔﻮﻓﺔ ﻟﺘﺨﺰﻳﻦ ﻋﺪﺩ ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺃﻭ ﺍﳌﺘﻐﲑﺍﺕ ﻓﺎﻟﻌﺒﺎﺭﺓ‪:‬‬
‫;]‪int ar1[50‬‬
‫ﲢﺠﺰ ﺍﻟﺬﺍﻛﺮﺓ ﻝ‪ 50‬ﻋﺪﺩ ﺻﺤﻴﺢ ﻓﺎﳌﺼﻔﻮﻓﺎﺕ ﻫﻲ ﺃﺳﻠﻮﺏ ﻣﻔﻴﺪ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻟﻜﻦ ﳍـﺎ‬
‫ﻋﺎﺋﻖ ﻣﻬﻢ ‪ :‬ﻋﻠﻴﻨﺎ ﻣﻌﺮﻓﺔ ﺣﺠﻢ ﺍﳌﺼﻔﻮﻓﺔ ﰲ ﻭﻗﺖ ﻛﺘﺎﺑﺔ ﺍﻟﱪﻧﺎﻣﺞ ‪ .‬ﰲ ﻣﻌﻈﻢ ﺍﳊﺎﻻﺕ ﻗـﺪ ﻻ‬
‫ﻧﻌﺮﻑ ﻛﻤﻴﺔ ﺍﻟﺬﺍﻛﺮﺓ ﺍﻟﺘﺎﱄ ﺳﻨﺤﺘﺎﺝ ﺇﱄ ﺃﺛﻨﺎﺀ ﺗﺸﻐﻴﻞ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫ﺗﺰﻭﺩ ‪ C++‬ﺃﺳﻠﻮﺑﹰﺎ ﺧﺎﺻﹰﺎ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﻛﺘﻞ ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ ‪:‬‬
‫ﺍﻟﻌﺎﻣﻞ ‪-:new‬‬
‫ﳜﺼﺺ ﺍﻟﻌﺎﻣﻞ ‪ new‬ﻛﺘﻞ ﺫﺍﻛﺮﺓ ﺫﺍﺕ ﺣﺠﻢ ﻣﻌﲔ ﻭﻳﻌﻴﺪ ﻣﺆﺷﺮﹰﺍ ﻟﻨﻘﻄﺔ ﺑﺪﺍﻳﺔ ﻛﺘﻠﺔ ﺍﻟﺬﺍﻛﺮﺓ‬
‫ﺗﻠﻚ‪ ،‬ﳛﺼﻞ ﺍﻟﻌﺎﻣﻞ ‪ new‬ﻋﻠﻰ ﺍﻟﺬﺍﻛﺮﺓ ﺩﻳﻨﺎﻣﻴﻜﻴﹰﺎ ﺃﺛﻨﺎﺀ ﺗﺸﻐﻴﻞ ﺍﻟﱪﻧﺎﻣﺞ ‪.‬‬
‫ﺍﻟﺼﻮﺭﺓ ﺍﻟﻌﺎﻣﺔ ﻟﻜﺘﺎﺑﺔ ﺍﻟﻌﺎﻣﻞ ‪ new‬ﻫﻲ‪:‬‬
‫;‪p-var = new type‬‬
‫ﺣﻴﺚ‪-:‬‬
‫‪ :p-var‬ﻣﺘﻐﲑ ﻣﺆﺷﺮ ﻳﺘﻢ ﻓﻴﻪ ﲣﺰﻳﻦ ﻋﻨﻮﺍﻥ ﺑﺪﺍﻳﺔ ﻛﺘﻠﺔ ﺍﻟﺬﺍﻛﺮﺓ ﺍﳌﺨﺼﺼﺔ ﺑﻮﺍﺳﻄﺔ‬
‫ﺍﻟﻌﺎﻣﻞ ‪ new‬ﺗﺴﻤﺢ ﺑﺘﺨﺰﻳﻦ ﻣﺘﻐﲑ ﻣﻦ ﺍﻟﻨﻮﻉ ‪. type‬‬
‫ﺍﻟﻌﺎﻣﻞ ‪-:delete‬‬

‫‪105‬‬
‫ﺇﺫﺍ ﰎ ﺣﺠﺰ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﻛﺘﻞ ﺍﻟﺬﺍﻛﺮﺓ ﺑﻮﺍﺳﻄﺔ ﺍﻟﻌﺎﻣﻞ ‪ new‬ﺳﻴﺘﻢ ﰲ ﺍﻟﻨﻬﺎﻳﺔ ﺣﺠﺰ‬
‫ﻛﻞ ﺍﻟﺬﺍﻛﺮﺓ ﺍﳌﺘﻮﻓﺮﺓ ﻭﺳﻴﺘﻮﻗﻒ ﺍﳊﺎﺳﻮﺏ ﻋﻦ ﺍﻟﻌﻤﻞ ‪ .‬ﻟﻀﻤﺎﻥ ﺍﺳﺘﻌﻤﺎﻝ ﺁﻣﻦ ﻭﻓﻌﺎﻝ ﻟﻠﺬﺍﻛﺮﺓ‬
‫ﻳﺮﺍﻓﻖ ﺍﻟﻌﺎﻣﻞ ‪ new‬ﻋﺎﻣﻞ ﻳﺴﻤﻰ ‪ delete‬ﻳﻌﻴﺪ ﲢﺮﻳﺮ ﺍﻟﺬﺍﻛﺮﺓ ﻟﻨﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ‪.‬‬
‫ﺍﳉﺰﺀ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﻛﻴﻒ ﻳﺘﻢ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺫﺍﻛﺮﺓ ﻟﺴﻠﺴﻠﺔ ‪:‬‬
‫;”‪char * str=” It is the best.‬‬
‫;)‪int len = strlen(str‬‬
‫;‪char*ptr‬‬
‫;]‪ptr= new char[len+1‬‬
‫;)‪strcpy(ptr,str‬‬
‫;‪cout<<”ptr=”<<ptr‬‬
‫; ‪delete[ ] ptr‬‬

‫ﰎ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ new‬ﻳﻠﻴﻬﺎ ﻧﻮﻉ ﺍﳌﺘﻐﲑﺍﺕ ﺍﻟﱵ ﺳﻴﺘﻢ ﲣﺼﻴﺼﻬﺎ ﻭﻋـﺪﺩ‬
‫ﺗﻠﻚ ﺍﳌﺘﻐﲑﺍﺕ ‪ ،‬ﻳﻘﻮﻡ ﺍﳌﺜﺎﻝ ﺑﺘﺨﺼﻴﺺ ﻣﺘﻐﲑﺍﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ char‬ﻭﳛﺘـﺎﺝ ﺇﱃ ‪ len+1‬ﻣﻨـﻬﺎ‬
‫ﺣﻴﺚ ﺗﺴﺎﻭﻱ ‪ len‬ﻃﻮﻝ ﺍﻟﺴﻠﺴﻠﺔ ‪ ، str‬ﺍﻟﺮﻗﻢ ‪ 1‬ﻳﻨﺸﺊ ﺑﺎﻳﺘﹰﺎ ﺇﺿﺎﻓﻴﹰﺎ ﻟﻠﺤﺮﻑ ﺍﳋﺎﻣﺪ ﺍﻟـﺬﻱ‬
‫ﻳﻨﻬﻲ ﺍﻟﺴﻠﺴﻠﺔ ﻭﻳﻌﻴﺪ ﺍﻟﻌﺎﻣﻞ ‪ new‬ﻣﺆﺷﺮﹰﺍ ﻳﺸﲑ ﺇﱃ ﺑﺪﺍﻳﺔ ﻗﻄﻌﺔ ﺍﻟﺬﺍﻛﺮﺓ ﺍﻟـﱵ ﰎ ﲣﺼﻴﺼـﻬﺎ‪.‬ﰎ‬
‫ﺍﺳﺘﻌﻤﺎﻝ ﺍﳌﻌﻘﻔﺎﺕ ﻟﻠﺪﻻﻟﺔ ﻋﻠﻰ ﺃﻧﻨﺎ ﳔﺼﺺ ﺫﺍﻛﺮﺓ ﳌﺼﻔﻮﻓﺔ ‪.‬‬
‫;]‪ptr =new char[len+1‬‬
‫ﺍﻟﻌﺒﺎﺭﺓ‪:‬‬
‫;‪delete [ ] ptr‬‬
‫ﺗﻌﻴﺪ ﻟﻠﻨﻈﺎﻡ ﻛﻤﻴﺔ ﺍﻟﺬﺍﻛﺮﺓ ﺍﻟﱵ ﻳﺸﲑ ﺇﻟﻴﻬﺎ ﺍﳌﺆﺷﺮ ‪.ptr‬‬
‫ﺍﳌﻌﻘﻔﺎﺕ ] [ ﺍﻟﱵ ﺗﻠﻲ ﺍﻟﻌﺎﻣﻞ ‪ delete‬ﺗﺸﲑ ﻷﻧﻨﺎ ﻧﻘﻮﻡ ﲝﺬﻑ ﻣﺼﻔﻮﻓﺔ‪ ،‬ﻻ ﳓﺘـﺎﺝ‬
‫ﻻﺳﺘﻌﻤﺎﳍﺎ ﺇﺫﺍ ﻛﻨﺎ ﻧﻘﻮﻡ ﲝﺬﻑ ﻣﺘﻐﲑ ﻭﺍﺣﺪ ﺑﻮﺍﺳﻄﺔ ﺍﻟﻌﺎﻣﻞ ‪.delete‬‬

‫ﺍﳌﺆﺷﺮ ‪:This‬‬
‫ﳝﺘﻠﻚ ﻛﻞ ﻛﺎﺋﻦ ﰲ ﻓﺌﺔ ﻣﺆﺷﺮﹰﺍ ﺧﺎﺻﹰﺎ ﻳﺴﻤﻰ ‪ this‬ﻳﺸﲑ ﺇﻟﻴﻪ‪ ،‬ﻭﺑﺎﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ ﺍﳌﺆﺷـﺮ‬
‫ﻳﺴﺘﻄﻴﻊ ﺃﻱ ﻋﻀﻮ ﺩﺍﱄ ﰲ ﺍﻟﻔﺌﺔ ﻣﻌﺮﻓﺔ ﻋﻨﻮﺍﻥ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﺍﺳﺘﺪﻋﺎﻩ ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻫﺬﺍ ‪-:‬‬

‫‪//Program 5-14:‬‬
‫>‪#include<iostream.h‬‬

‫‪106‬‬
‫‪class where‬‬
‫{‬
‫‪private:‬‬
‫;]‪char chararray[10‬‬
‫‪public:‬‬
‫‪//Continued‬‬
‫) (‪void reveal‬‬
‫;‪{ cout <<”My Objects address is “<<this‬‬
‫;}‬

‫) (‪main‬‬
‫{‬
‫;‪where w1,w2‬‬
‫;) (‪w1.reveal‬‬
‫;) (‪w2.reveal‬‬
‫}‬

‫ﻳﻨﺸﺊ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﻛﺎﺋﻨﺎﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ ،where‬ﻭﻳﻄﻠﺐ ﻣﻦ ﻛﻞ ﻣﻨﻬﺎ ﻋﺮﺽ ﻋﻨﻮﺍﻧـﻪ‬


‫ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﺍﻟﺔ ) (‪ ،reveal‬ﻭﺍﻟﱵ ﺗﻌﺮﺽ ﻗﻴﻤﺔ ﺍﳌﺆﺷﺮ ‪.this‬‬
‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﻳﺒﺪﻭ ﻛﺎﻟﺘﺎﱄ‪:‬‬

‫‪My object’s address is ox8f4effec‬‬


‫‪My object’s address us ox8f4effe2‬‬

‫ﻧﻼﺣﻆ ﺇﻥ ﻋﻨﻮﺍﻥ ﺍﻟﻜﺎﺋﻦ ‪ w2‬ﻳﺒﺘﻌﺪ ‪ 10 Bytes‬ﻋـﻦ ﻋﻨـﻮﺍﻥ ‪ ،w1‬ﻭﺫﻟـﻚ ﻷﻥ‬


‫ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﻛﻞ ﻛﺎﺋﻦ ﺗﺘﺄﻟﻒ ﻣﻦ ﻣﺼﻔﻮﻓﺔ ﻣﻦ ‪.10 Bytes‬‬
‫ﳝﻜﻦ ﻣﻌﺎﻣﻠﺔ ﺍﳌﺆﺷﺮ ‪ this‬ﻛﺄﻱ ﻣﺆﺷﺮ ﻛﺎﺋﻨﺎﺕ ﺁﺧﺮ‪ ،‬ﻟﺬﺍ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻪ ﻟﻠﻮﺻﻮﻝ ﺇﱃ‬
‫ﺑﻴﺎﻧﺎﺕ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﻳﺸﲑ ﺇﻟﻴﻪ ﻛﻤﺎ ﻫﻮ ﻣﺒﲔ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺃﺩﻧﺎﻩ‪.‬‬

‫‪//Program 5-15:‬‬
‫>‪#include<iostream.h‬‬
‫{ ‪class test‬‬
‫‪public:‬‬

‫‪107‬‬
‫;)‪test(int=0‬‬
‫;‪void print( ) const‬‬
‫‪private:‬‬
‫;‪int x‬‬
‫;}‬
‫‪void test::print( ) const‬‬
‫‪//Continued‬‬
‫{‬
‫‪cout <<” X=”<<x<<endl‬‬
‫;‪<<”this-> x= “<<this->x<<endl‬‬
‫;‪<<”(*this).x=”<<(*this).x<<endl‬‬
‫}‬
‫) ( ‪main‬‬
‫{‬
‫;)‪test a(12‬‬
‫;) (‪a.print‬‬
‫;‪return 0‬‬
‫}‬

‫ﻭﻟﻠﺘﻮﺿﻴﺢ ﻓﺈﻥ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ‪ print‬ﻳﻘﻮﻡ ﺃﻭ ﹰﻻ ﺑﻄﺒﺎﻋﺔ ‪ x‬ﻣﺒﺎﺷﺮﺓ‪ ،‬ﰒ ﻳﺴﺘﻌﻤﻞ ﻃﺮﻳﻘﺘﲔ‬
‫ﻟﻠﻮﺻﻮﻝ ﺇﱃ ‪ x‬ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﳌﺆﺷﺮ ‪-:this‬‬
‫ﺍﻷﻭﱃ‪ :‬ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ )>‪.(-‬‬
‫ﺍﻟﺜﺎﻧﻴﺔ‪ :‬ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ )‪.(.‬‬
‫ﻻﺣﻆ ﺍﻷﻗﻮﺍﺱ ﺍﻟﱵ ﲢﻴﻂ ﺑـ ‪ ،*this‬ﻋﻨﺪﻣﺎ ﻧﻘﻮﻡ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﺎﻣﻞ )‪ (.‬ﻟﻠﻮﺻﻮﻝ ﺇﱃ‬
‫ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ ﻧﺴﺘﻌﻤﻞ ﺍﻷﻗﻮﺍﺱ‪ ،‬ﻭﺫﻟﻚ ﻷﻥ ﺍﻟﻌﺎﻣﻞ )‪ (.‬ﻟﻪ ﺃﻭﻟﻮﻳﺔ ﺃﻋﻠﻰ ﻣﻦ ﺍﻟﻌﺎﻣﻞ *‪ ،‬ﻭﻋﻠﻴﻪ ﺑﺪﻭﻥ‬
‫ﺍﻷﻗﻮﺍﺱ ﻳﺘﻢ ﺗﻘﻴﻴﻢ ﺍﻟﺘﻌﺒﲑ ‪ *this.x‬ﻛﺎﻵﰐ‪:‬‬
‫)‪*(this.x‬‬
‫ﻭﺍﻟﺬﻱ ﻳﻨﺘﺞ ﻋﺮﺽ ﺭﺳﺎﻟﺔ ﺧﻄﺄ ﻣﻦ ﺍﳌﺼﺮﻑ ﻷﻥ ﺍﻟﻌﺎﻣﻞ )‪ (.‬ﻻ ﻳﺴﺘﺨﺪﻡ ﻣﻊ ﺍﳌﺆﺷﺮﺍﺕ‪.‬‬
‫ﻫﻨﺎﻟﻚ ﺍﺳﺘﻌﻤﺎﻻﺕ ﺃﺧﺮﻯ ﻟﻠﻤﺆﺷﺮ ‪ this‬ﺳﻨﺘﻄﺮﻕ ﳍﺎ ﻋﻨﺪ ﲢﻤﻴﻠﻨﺎ ﻟﻠﻌﻮﺍﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‪.‬‬

‫‪108‬‬
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﺍﳌﺼﻔﻮﻓﺔ ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﻣﺘﺘﺎﺑﻌﺔ ﻣﻦ ﺍﻟﻌﻨﺎﺻﺮ ﺍﶈﺪﻭﺩﺓ ﺍﻟﱵ ﺗﻜﻮﻥ ﲨﻴﻌﻬﺎ ﻣـﻦ‬
‫ﻧﻔﺲ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬
‫♦ ﻳﻌﻠﻦ ﻋﻦ ﺍﳌﺼﻔﻮﻓﺎﺕ ﲢﺪﻳﺪ ﻧﻮﻉ ﻋﻨﺎﺻﺮ ﺍﳌﺼﻔﻮﻓﺔ ﰒ ﺍﺳﻢ ﺍﳌﺼـﻔﻮﻓﺔ ﻣﺘﺒﻮﻋـﹰﺎ ﺑﻌـﺪﺩ‬
‫ﻼ ﻟﺘﺨﺰﻳﻦ ﻣﺎﺋﺔ ﻋﻨﺼﺮ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ int‬ﰲ ﻣﺼـﻔﻮﻓﺔ ‪b‬‬‫ﺍﻟﻌﻨﺎﺻﺮ ﻓﻴﻬﺎ ﺑﲔ ﻗﻮﺳﲔ ] [‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﻧﻜﺘﺐ ‪:‬‬
‫;]‪int b[100‬‬
‫♦ ﺗﺴﺘﺨﺪﻡ ﺍﳌﺼﻔﻮﻓﺎﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ char‬ﻟﺘﺨﺰﻳﻦ ﺳﻼﺳﻞ ﺍﻷﺣﺮﻑ‪.‬‬
‫♦ ﳝﻜﻦ ﲤﻬﻴﺪ ﻣﺼﻔﻮﻓﺔ ﺃﺣﺮﻑ ﻋﻨﺪ ﺛﺎﺑﺖ ﺳﻠﺴﻠﻲ ﻛﺎﻵﰐ‪:‬‬
‫;”‪char a[10] = “computer‬‬
‫♦ ﺗﻨﺘﻬﻲ ﻛﻞ ﺍﻟﺴﻼﺳﻞ ﲝﺮﻓﹰﺎ ﺧﺎﺻﹰﺎ ﻳﺴﻤﻰ ﺑﺎﳊﺮﻑ ﺍﳋﺎﻣﺪ ﻭﺍﻟﺬﻱ ﻳـﺘﻢ ﲤﺜﻴﻠـﻪ ﺑﺘﺘـﺎﺑﻊ‬
‫ﺍﳍﺮﻭﺏ )’‪.(‘\0‬‬
‫♦ ﳝﻜﻦ ﲤﻬﻴﺪ ﺍﻟﺴﻼﺳﻞ ﺑﺎﺳﺘﺨﺪﺍﻡ ﻻﺋﺤﺔ ﻗﻴﻢ ﻛﺎﻵﰐ‪:‬‬
‫;}’‪char a[10] = {‘c’, ‘o’, ‘m’, ‘p’, ‘u’, ‘t’, ‘e’, ‘r’ , ‘\0‬‬
‫♦ ﺗﻌﻴﺪ ﺍﻟﺪﺍﻟﺔ ) (‪ strlen‬ﻃﻮﻝ ﺍﻟﺴﻠﺴﻠﺔ ﺍﳌﻤﺮﺓ ﻛﻮﺳﻴﻄﺔ ﳍﺎ‪.‬‬
‫♦ ﺗﺴﺘﺨﺪﻡ ﺍﻟﺪﺍﻟﺔ ) (‪ strcpy‬ﻟﻨﺴﺦ ﺳﻠﺴﻠﺔ ﺇﱃ ﺳﻠﺴﻠﺔ ﺃﺧﺮﻯ‪.‬‬
‫♦ ﺗﻘﻮﻡ ﺍﻟﺪﺍﻟﺔ ) (‪ strcat‬ﺑﺈﳊﺎﻕ ﺍﻟﺴﻼﺳﻞ‪.‬‬
‫♦ ﺗﻘﺎﺭﻥ ﺍﻟﺪﺍﻟﺔ ) (‪ strcmp‬ﺑﲔ ﺳﻠﺴﻠﺘﲔ‪.‬‬
‫♦ ﺍﳌﺆﺷﺮﺍﺕ ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﻣﺘﻐﲑﺍﺕ ﺗﺴﺘﺨﺪﻡ ﻛﻌﻨﺎﻭﻳﻦ ﻟﻠﻤﺘﻐﲑﺍﺕ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬

‫‪109‬‬
1
‫ﺍﻷﺳﺌﻠﺔ‬
:‫ ﺗﻘﻮﻡ ﺑﺎﻵﰐ‬C++ ‫ ﺃﻛﺘﺐ ﻋﺒﺎﺭﺍﺕ‬/1
.f ‫ﻃﺒﺎﻋﺔ ﺍﻟﻌﻨﺼﺮ ﺍﻟﺴﺎﺑﻊ ﰲ ﻣﺼﻔﻮﻓﺔ ﺃﺣﺮﻑ ﺗﺪﻋﻰ‬ -1
.b ‫ﺇﺩﺧﺎﻝ ﻗﻴﻤﺔ ﺍﻟﻌﻨﺼﺮ ﺍﻟﺮﺍﺑﻊ ﰲ ﻣﺼﻔﻮﻓﺔ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ‬ -2

:‫ ﻣﺎ ﻫﻮ ﺍﳋﻄﺄ ﰲ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ‬/2


a\ char str [5];
cin >>str; // user types hello
b\ int a[3];
cout <<a[1] << “ “ << a[2]<<“ “<< a[3] <<endl;
c\ float f[3] = { 1.1 , 10.01, 100,001, 1000.0001 } ;
d\ double d[2][10];
d[1, 9] = 2.345;
:‫ ﻣﺎ ﺍﻟﻐﺮﺽ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ‬/3
#include <iostream.h>
int WhatIsThis (int[ ] ,int);
main
{
const int arraysize = 10;
int a[arraysize] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int result = WhatIsThis (q, arraysize);
cout << “ Result is: “ << result << endl;
return 0;
}
int WhatIsThis (int b[ ], int size)
{
if (size == 1)
return b[0];
else
return b[size –1] +WhatIsThis[b, size –1];
}

110
‫‪ /4‬ﺃﻛﺘﺐ ﺇﻋﻼﻧﹰﺎ ﳌﺼﻔﻮﻓﺔ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﺗﺪﻋﻰ ‪ intArray‬ﻭﺍﻟﱵ ﲢﺘﻮﻱ ﻋﻠـﻰ ﺛﻼﺛـﺔ‬
‫ﺻﻔﻮﻑ ﻭﻋﻤﻮﺩﻳﻦ‪.‬‬
‫‪ /5‬ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻟﻌﻨﺼﺮ ﺍﻷﺻﻐﺮ ﻣﻦ ﻋﻨﺎﺻﺮ ﻣﺼﻔﻮﻓﺔ ﲢﺘـﻮﻱ ﻋﻠـﻰ ﺛﻼﺛـﺔ‬
‫ﺻﻔﻮﻑ ﻭﺛﻼﺛﺔ ﺃﻋﻤﺪﺓ‪.‬‬
‫‪ /6‬ﺃﻛﺘﺐ ﻋﺒﺎﺭﺓ ‪ C++‬ﺻﺤﻴﺤﺔ ﻟﻜﻞ ﻣﻦ ﺍﻵﰐ )ﺇﻓﺘﺮﺽ ﺃﻧﻪ ﰎ ﺍﻹﻋـﻼﻥ ﻋـﻦ ﻋـﺪﺩﻳﻦ‬
‫ﺻﺤﻴﺤﲔ ‪ Value1‬ﻭ ‪ Value2‬ﻭﰎ ﲤﻬﻴﺪ ﻗﻴﻤﺔ ﺍﳌﺘﻐﲑ ‪ value1‬ﻋﻨﺪ ‪: (200000‬‬
‫ﺍﻹﻋﻼﻥ ﻋﻦ ﻣﺆﺷﺮ ‪ iptr‬ﻟﻴﺸﲑ ﺇﱃ ﻣﺘﻐﲑ ﻣﻦ ﺍﻟﻨﻮﻉ ‪.int‬‬ ‫‬

‫ﺗﻌﻴﲔ ﻋﻨﻮﺍﻥ ﺍﳌﺘﻐﲑ ‪ value1‬ﺇﱃ ﺍﳌﺆﺷﺮ ‪.iptr‬‬ ‫‬

‫ﻃﺒﺎﻋﺔ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﻳﺸﲑ ﺇﻟﻴﻬﺎ ﺍﳌﺆﺷﺮ ‪.iptr‬‬ ‫‬

‫ﺗﻌﻴﲔ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﻳﺸﲑ ﺇﻟﻴﻬﺎ ﺍﳌﺆﺷﺮ ‪ iptr‬ﺇﱃ ﺍﳌﺘﻐﲑ ‪.value2‬‬ ‫‬

‫ﻃﺒﺎﻋﺔ ﻗﻴﻤﺔ ﺍﳌﺘﻐﲑ ‪.value2‬‬ ‫‬

‫ ﻃﺒﺎﻋﺔ ﻋﻨﻮﺍﻥ ﺍﳌﺘﻐﲑ ‪.value1‬‬


‫ ﻃﺒﺎﻋﺔ ﺍﻟﻌﻨﻮﺍﻥ ﺍﳌﺨﺰﻥ ﰲ ﺍﳌﺆﺷﺮ ‪) .iptr‬ﻫﻞ ﺗﺘﺴﺎﻭﻯ ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ ﻣﻊ ﻋﻨﻮﺍﻥ ﺍﳌـﺘﻐﲑ‬
‫‪value1‬؟(‬

‫‪111‬‬
‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﺴﺎﺩﺳﺔ‬
‫‪6.0‬‬
‫)‪Classes (I‬‬ ‫ﺍﻟﻔﺌﺎﺕ)‪- (I‬‬

‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪:‬‬


‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﺇﻧﺸﺎﺀ ﺍﻟﻔﺌﺎﺕ ﰲ ﻟﻐﺔ ‪.C++‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﺇﻧﺸﺎﺀ ﻭﺍﺳﺘﻌﻤﺎﻝ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺎﺕ‪.‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﻭﺍﻟﺪﺍﻟﻴﺔ ﰲ ﺍﻟﻔﺌﺔ‪.‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻣﻔﻬﻮﻡ ﺍﻟﺒﻨﻴﺎﺕ ﰲ ﻟﻐﺔ ‪.C++‬‬

‫‪112‬‬
‫ﻣﻘﺪﻣﺔ‬ ‫‪6.1‬‬

‫ﺃﺳﺎﺱ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻜﺘﻮﺑﺔ ﺑﺎﻟﻠﻐﺔ ‪ C++‬ﻫﻮ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﱵ ﻳﺘﻢ ﺇﻧﺸـﺎﺅﻫﺎ ﺑﻮﺍﺳـﻄﺔ ﻓﺌـﺔ‬
‫ﺗﺴﺘﻌﻤﻞ ﻛﻘﺎﻟﺐ ﻓﻌﻨﺪﻣﺎ ﻳﻜﻮﻥ ﻫﻨﺎﻟﻚ ﺍﻟﻜﺜﲑ ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﳌﺘﻄﺎﺑﻘﺔ ﰲ ﺍﻟﱪﻧـﺎﻣﺞ ﻻ ﻳﻜـﻮﻥ‬
‫ﻣﻨﻄﻘﻴﹰﺎ ﻭﺻﻒ ﻛﻞ ﻭﺍﺣﺪ ﻣﻨﻬﺎ ﻋﻠﻰ ﺣﺪﺓ ‪ ،‬ﻣﻦ ﺍﻷﻓﻀﻞ ﺗﻄﻮﻳﺮ ﻣﻮﺍﺻﻔﺎﺕ ﻭﺍﺣﺪﺓ ﻟﻜﻞ ﻣﻦ ﻫﺬﻩ‬
‫ﺍﻟﻜﺎﺋﻨﺎﺕ ﻭﺑﻌﺪ ﲢﺪﻳﺪ ﺗﻠﻚ ﺍﳌﻮﺍﺻﻔﺎﺕ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻹﻧﺸﺎﺀ ﻗﺪﺭ ﻣﺎ ﳓﺘـﺎﺝ ﺇﻟﻴـﻪ ﻣـﻦ‬
‫ﺍﻟﻜﺎﺋﻨﺎﺕ ﺗﺴﻤﻰ ﻣﻮﺍﺻﻔﺎﺕ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻫﺬﻩ ﰲ ‪ OOP‬ﻓﺌﺔ )‪ . (Class‬ﺗﺘﻤﻴﺰ ﺍﻟﻔﺌـﺔ ﰲ‬
‫‪ C++‬ﺑﺎﳌﻼﻣﺢ ﺍﻷﺭﺑﻌﺔ ﺍﻟﺘﺎﻟﻴﺔ ‪-:‬‬
‫‪/1‬ﺍﺳﻢ ﺍﻟﻔﺌﺔ ﻭﺍﻟﺬﻱ ﻳﻌﻤﻞ ﻛﻨﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺬﻱ ﺳﺘﻤﺜﻠﻪ ﺍﻟﻔﺌﺔ‪.‬‬
‫‪/2‬ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﰲ ﺍﻟﻔﺌﺔ )‪ (data members‬ﺣﻴﺚ ﳝﻜﻦ ﺃﻥ ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ‬
‫ﻋﻠﻰ ﺻﻔﺮ ﺃﻭ ﺃﻛﺜﺮ ﻣﻦ ﺃﻱ ﻧﻮﻉ ﻣﻦ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ‪. C++‬‬
‫‪/3‬ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ )‪ (member functions‬ﻣﻌﺮﻓﺔ ﺩﺍﺧﻞ ﺍﻟﻔﺌﺔ ﻭﻫﻲ ﲤﺜـﻞ‬
‫ﳎﻤﻮﻋﺔ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﱵ ﺳﻴﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ ﻋﻠﻰ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ‪.‬‬
‫‪ /4‬ﳏﺪﺩﺍﺕ ﻭﺻﻮﻝ )‪ (access specifiers‬ﻭﺗﻜﺘﺐ ﻗﺒﻞ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﻭﺍﻷﻋﻀـﺎﺀ‬
‫ﺍﻟﺪﺍﻟﻴﺔ ﻟﺘﺤﺪﺩ ﺇﻣﻜﺎﻧﻴﺔ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﻫﺬﻩ ﺍﻷﺟﺰﺍﺀ ﻣﻦ ﺍﻷﺟﺰﺍﺀ ﺍﻷﺧﺮﻯ ﰲ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬

‫‪113‬‬
‫ﺗﻌﺮﻳﻒ ﺍﻟﻔﺌﺔ‬
6.2
The Class Definition

‫ ﻳﻠﻴﻬﺎ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ﰒ ﺟﺴﻢ ﺍﻟﻔﺌﺔ ﺑـﲔ‬class ‫ﻳﺘﺄﻟﻒ ﺗﻌﺮﻳﻒ ﺍﻟﻔﺌﺔ ﻣﻦ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ‬
‫ﻗﻮﺳﲔ ﺣﺎﺻﺮﻳﻦ } { ﻭﳚﺐ ﺃﻥ ﻳﻨﻬﻲ ﺗﻌﺮﻳﻒ ﺍﻟﻔﺌﺔ ﻓﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ ﺃﻭ ﻋﺒـﺎﺭﺓ ﺇﻋـﻼﻥ ﻋـﻦ‬
:‫ﻼ‬
‫ﻛﺎﺋﻨﺎﺕ ﺗﻨﺘﻤﻲ ﺇﱃ ﺍﻟﻔﺌﺔ ﻓﻤﺜ ﹰ‬
class anyclass { /* class body*/ };
‫ﺃﻭ‬
class anyclass { /* class body */ } obj1, obj2;
: ‫ ﻋﻠﻰ ﺍﻟﻨﺤﻮ ﺍﻟﺘﺎﱄ ﰲ ﺍﻟﱪﻧﺎﻣﺞ‬C++ ‫ﻏﺎﻟﺒﹰﺎ ﻣﺎ ﺗﻜﺘﺐ ﺍﻟﻔﺌﺔ ﰲ‬
class class_name{
private:
data members
public:
member functions
};
-: stack ‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﺗﻌﺮﻳﻒ ﻓﺌﺔ ﺗﺪﻋﻰ‬
// This creates the class stack >
class stack {
private:
int stck[SIZE];
int tos;
public:
void init ( );
void push(int i);
int pop ( );
};

114
‫ﻛﻤﺎ ﻋﺮﻓﻨﺎ ﺳﺎﺑﻘﹰﺎ ﺃﻥ ﺍﳌﺼﻔﻮﻓﺔ ﻫﻲ ﻃﺮﻳﻘﺔ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﻟﻜﻨﻬﺎ ﻏﲑ ﻣﻨﺎﺳـﺒﺔ ﰲ‬
‫ﺍﻟﻜﺜﲑ ﻣﻦ ﺍﳊﺎﻻﺕ ‪.‬‬
‫ﳝﻜﻦ ﺇﻧﺸﺎﺀ ﺑﻨﻴﺎﺕ ﲣﺰﻳﻦ ﺃﺧﺮﻯ ﻛـﺎﻟﻠﻮﺍﺋﺢ ﺍﳌﺮﺗﺒﻄـﺔ )‪ (linked lists‬ﻭﺍﳌﻜﺪﺳـﺎﺕ‬
‫)‪ (stacks‬ﻭﺍﻟﺼﻔﻮﻑ )‪ . (queues‬ﻛﻞ ﻣﻦ ﺑﻨﻴﺎﺕ ﺍﻟﺘﺨﺰﻳﻦ ﻫﺬﻩ ﳍﺎ ﺣﺴﻨﺎ‪‬ﺎ ﻭﻣﺴﺎﻭﺋﻬﺎ‬
‫ﻭﲣﺘﻠﻒ ﻓﻴﻬﺎ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﱵ ﻳﺘﻢ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺨﺰﻧﺔ ﻓﻴﻬﺎ ‪.‬‬
‫ﺍﳌﻜﺪﺱ )‪ (stack‬ﻫﻮ ﻧﻮﻉ ﻣﻦ ﺑﻨﻴﺎﺕ ﺍﻟﺘﺨﺰﻳﻦ ﻳﺴﺘﺨﺪﻡ ﻋﻨﺪﻣﺎ ﻧﺮﻳﺪ ﺍﻟﻮﺻﻮﻝ ﺇﱃ‬
‫ﺁﺧﺮ ﻋﻨﺼﺮ ﰎ ﲣﺰﻳﻨﻪ ‪ .‬ﻳﺸﺎﺭ ﺇﱃ ﻫﺬﻩ ﺍﻟﺒﻨﻴﺔ ﻋﺎﺩﺓ ‪ lifo‬ﺍﺧﺘﺼﺎﺭﹰﺍ ﻟـ ‪last in first‬‬
‫‪ out‬ﻭﺍﻟﱵ ﺗﻌﲎ )ﺍﳌﺪﺧﻞ ﺁﺧﺮﹰﺍ ﻫﻮ ﺍﳌﺨﺮﺝ ﺃﻭ ﹰﻻ(‪.‬‬
‫ﺗﺴﺘﻄﻴﻊ ﺍﳌﻜﺪﺳﺎﺕ )‪ (stacks‬ﲣﺰﻳﻦ ﺃﻱ ﻧﻮﻉ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ .‬ﻟﻜﻦ ﻛﻤـﺎ ﻫـﻮ‬
‫ﺍﳊﺎﻝ ﻣﻊ ﺍﳌﺼﻔﻮﻓﺎﺕ ﳜﺰﻥ ﻛﻞ ﻣﻜﺪﺱ ﻧﻮﻋﹰﺎ ﻭﺍﺣﺪﹰﺍ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ ،‬ﻭﻟﻜﻦ ﻟﻴﺲ ﺧﻠﻴﻄﹰﺎ ﻣـﻦ‬
‫ﺍﻷﻧﻮﺍﻉ‪.‬‬
‫ﻋﻨﺪﻣﺎ ﻧﻀﻊ ﻗﻴﻤﺔ ﰲ ﺍﳌﻜﺪﺱ ‪ ،‬ﻳﻘﺎﻝ ﺃﻧﻨﺎ ﺩﻓﻌﻨﺎﻫﺎ )‪ (push‬ﰲ ﺍﳌﻜﺪﺱ ‪ ،‬ﻭﻋﻨـﺪﻣﺎ ﳔـﺮﺝ‬
‫ﺍﻟﻘﻴﻤﺔ ﻣﻨﻪ ﻳﻘﺎﻝ ﺃﻧﻨﺎ ﺳﺤﺒﻨﺎﻫﺎ )‪ .(pop‬ﻳﺒﲔ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ ﻛﻴﻒ ﻳﺒﺪﻭ ﻫﺬﺍ‪:‬‬

‫ﺩﻓﻊ ‪push‬‬ ‫‪4‬‬

‫ﺳﺤﺐ ‪pop‬‬

‫‪3‬‬
‫‪2‬‬
‫‪1‬‬

‫ﺗﺴﺘﻌﻤﻞ ﻋﺎﺩﺓ ﻟﺘﻤﺜﻴﻞ ﺍﳌﻜﺪﺱ ﻣﺼﻔﻮﻓﺔ ﻳﺘﻢ ﻓﻴﻬﺎ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ ،‬ﻭﻣﺆﺷﺮ ﻳﺸﲑ ﺇﱃ ﺃﻋﻠـﻰ‬
‫ﺍﳌﻜﺪﺱ )ﺁﺧﺮ ﻋﻨﺼﺮ ﰲ ﺍﳌﻜﺪﺱ ( ‪.‬‬

‫ﺇﻥ ﻣﻮﺍﺻﻔﺎﺕ ﺍﻟﻔﺌﺔ ﻻ ﺗﺆﺩﻯ ﺇﱃ ﺇﻧﺸﺎﺀ ﺃﻱ ﻛﺎﺋﻦ ‪ ،stack‬ﺑﻞ ﺳﺘﻘﻮﻡ ﻓﻘـﻂ‬


‫ﺑﺘﺤﺪﻳﺪ ﻛﻴﻒ ﺳﻴﺒﺪﻭ ﺍﻟﻜﺎﺋﻦ ﻋﻨﺪ ﺇﻧﺸﺎﺀﻩ‪.‬‬

‫‪115‬‬
‫ﺩﺍﺧﻞ ﺟﺴﻢ ﺍﻟﻔﺌﺔ ﻳﺘﻢ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﻭﺍﻷﻋﻀـﺎﺀ ﺍﻟﺪﺍﻟﻴـﺔ ﻭﳏـﺪﺩﺍﺕ‬
‫ﺍﻟﻮﺻﻮﻝ ﳍﺎ ﻭﻓﻴﻤﺎ ﻳﻠﻲ ﺳﻨﺘﻌﺮﻑ ﻋﻠﻰ ﻫﺬﻩ ﺍﻷﺟﺰﺍﺀ ‪.‬‬

‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ‬
‫‪6.3‬‬
‫‪Data Members‬‬
‫ﻳﺘﻢ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﱵ ﻳﺘﻢ ‪‬ﺎ ﺍﻹﻋـﻼﻥ ﻋـﻦ‬
‫ﺍﳌﺘﻐﲑﺍﺕ ﺑﺎﺳﺘﺜﻨﺎﺀ ﺃﻧﻪ ﻻ ﳝﻜﻨﻨﺎ ﲤﻬﻴﺪ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﻋﻨﺪ ﺍﻹﻋﻼﻥ ﻋﻨـﻬﺎ‪ ،‬ﳝﻜـﻦ ﺃﻥ ﺗﻜـﻮﻥ‬
‫ﻼ ﰲ ﺍﻟﻔﺌﺔ ‪ stack‬ﰎ ﺍﻹﻋـﻼﻥ ﻋـﻦ‬
‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﻣﻦ ﺃﻱ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﰲ ﺍﻟـ ‪ C++‬ﻓﻤﺜ ﹰ‬
‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﻛﻤﺎ ﻳﻠﻲ ‪:‬‬
‫;]‪int stck[SIZE‬‬
‫;‪int tos‬‬
‫‪ stack‬ﻋﻠﻰ ﺑﻨﺪﻯ ﺑﻴﺎﻧﺎﺕ ﳘﺎ ﻣﺼﻔﻮﻓﺔ ‪ stck‬ﻋﻨﺎﺻﺮﻫﺎ ﻣﻦ ﺍﻟﻨـﻮﻉ‬ ‫ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ‬
‫‪ int‬ﻭﻣﺘﻐﲑ ‪ tos‬ﻣﻦ ﺍﻟﻨﻮﻉ ‪ int‬ﺃﻳﻀﹰﺎ ‪ .‬ﻻﺣﻆ ﺃﻥ ﻫﺬﻩ ﺍﻟﺘﻌﺮﻳﻔﺎﺕ ﻻ ﺗﻌﻄﻰ ﺍﳌـﺘﻐﲑﺍﺕ ﺃﻱ‬
‫ﻗﻴﻤﺔ ﻫﻲ ﻓﻘﻂ ﺗﻌﻄﻴﻬﺎ ﺍﲰﹰﺎ ﻭﲢﺪﺩ ﺃ‪‬ﺎ ﺗﺘﻄﻠﺐ ﻣﺴﺎﺣﺔ ﻣﻌﻴﻨﺔ ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ ﺣﻴﺚ ﻳﺘﻢ ﲣﺼـﻴﺺ‬
‫ﻣﺴﺎﺣﺔ ﺍﻟﺬﺍﻛﺮﺓ ﺑﻌﺪ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ‪.‬‬

‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ‬
‫‪6.4‬‬
‫‪Member Functions‬‬

‫ﳝﻜﻦ ﳌﺴﺘﺨﺪﻣﻲ ﺍﻟﻔﺌﺔ ‪ stack‬ﺇﳒﺎﺯ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﺘﺎﺑﻌﺔ ﳍﺎ ‪،‬‬
‫ﻳﺘﻢ ﺍﻹﻋﻼﻥ ﻋﻦ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺩﺍﺧﻞ ﺟﺴﻢ ﺍﻟﻔﺌﺔ ﻭﻳﻄﻠﻖ ﻋﻠﻴﻬﺎ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺃﻭ‪:‬‬
‫ﻼ ﰲ ﺍﻟﻔﺌﺔ ‪ stack‬ﰎ‬ ‫)‪ (member functions‬ﻭﻳﺘﻢ ﺗﺼﺮﳛﻬﺎ ﺩﺍﺧﻞ ﺟﺴﻢ ﺍﻟﻔﺌﺔ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﺗﺼﺮﻳﺢ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻛﺎﻵﰐ ‪:‬‬
‫;) ( ‪void init‬‬
‫;)‪void push (int i‬‬
‫;) ( ‪int pop‬‬

‫‪116‬‬
‫ﻫﻨﺎﻟﻚ ﺛﻼﺙ ﺩﺍﻻﺕ ﰲ ﻣﻮﺍﺻﻔﺎﺕ ﺍﻟﻔﺌﺔ ‪Pop( ) ، stack‬ﻭ ) (‪ Push‬ﻭ (‪int‬‬
‫)‪ .‬ﻻ ﺗﻌﻴﺪ ﺍﻟﺪﻭﺍﻝ ) (‪ Push( ) ، int‬ﺃﻱ ﻗﻴﻤﺔ ﺑﻴﻨﻤﺎ ﺗﻌﻴﺪ ﺍﻟﺪﺍﻟﺔ ) (‪ Pop‬ﻗﻴﻤﺔ ﻣﻦ ﺍﻟﻨﻮﻉ‬
‫‪ . int‬ﺗﺴﻤﻰ ﺍﻟﺪﻭﺍﻝ ﺍﳌﻌﺮﻓﺔ ﺩﺍﺧﻞ ﺍﻟﻔﺌﺔ ﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ ‪. member functions‬‬

‫ﳏﺪﺩﺍﺕ ﺍﻟﻮﺻﻮﻝ‬
‫‪6.5‬‬
‫‪Access Specifiers‬‬

‫ﻳﺘﻢ ﲢﺪﻳﺪ ﺇﻣﻜﺎﻧﻴﺔ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ )ﺑﻴﺎﻧﺎﺕ ‪ ،‬ﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ( ﺑﺎﺳﺘﺨﺪﺍﻡ ﺛﻼﺙ‬
‫ﻛﻠﻤﺎﺕ ﺃﺳﺎﺳﻴﺔ ﰲ ‪ C++‬ﻭﻫﻲ ‪) public‬ﻋﺎﻡ( ﻭ ‪) private‬ﺧـﺎﺹ( ﻭ‪protected‬‬
‫)ﳏﻤﻲ( ﻭﺍﻟﱵ ﺗﺘﻢ ﻛﺘﺎﺑﺘﻬﺎ ﺩﺍﺧﻞ ﺟﺴﻢ ﺍﻟﻔﺌﺔ ﺗﻠﻴﻬﺎ ﻧﻘﻄﺘﺎﻥ) ‪.( :‬‬
‫• ﺍﻟﻌﻀﻮ ﺍﻟﻌﺎﻡ ‪public‬ﰲ ﺍﻟﻔﺌﺔ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻪ ﻣﻦ ﺃﻱ ﻣﻜﺎﻥ ﺩﺍﺧﻞ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫• ﺍﻟﻌﻀﻮ ﺍﶈﻤﻰ ‪ protected‬ﰲ ﺍﻟﻔﺌﺔ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻪ ﻓﻘﻂ ﻣـﻦ ﻓﺌﺘـﻪ ﺃﻭ‬
‫ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ ﻣﻨﻬﺎ ﻛﻤﺎ ﺳﻨﺮﻯ ﻻﺣﻘﹰﺎ ‪.‬‬
‫• ﺍﻟﻌﻀﻮ ﺍﳋﺎﺹ ‪ private‬ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻪ ﻓﻘﻂ ﻣﻦ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﰲ ﻓﺌﺘـﻪ‬
‫ﻭﺍﻟﻔﺌﺎﺕ ﺍﻟﺼﺪﻳﻘﺔ ﳍﺎ ﻛﻤﺎ ﺳﻨﺮﻯ ﻻﺣﻘﹰﺎ‪.‬‬

‫ﺇﺫﺍ ﱂ ﻳﺘﻢ ﺫﻛﺮ ﳏﺪﺩ ﻭﺻﻮﻝ ﻟﻌﻀﻮ ﰲ ﻓﺌﺔ ﻣﺎ ﺳﻴﻔﺘﺮﺽ ﺍﳌﺼـﺮﻑ ﺃﻥ ﳏـﺪﺩ‬
‫ﺍﻟﻮﺻﻮﻝ ﳍﺬﺍ ﺍﻟﻌﻀﻮ ﻫﻮ ‪.private‬‬

‫ﰲ ﺍﻟﻔﺌﺔ ‪ stack‬ﻛﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺧﺎﺻﺔ ﻭﻛﻞ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻋﺎﻣﺔ ﻭﻫﺬﻩ ﻫﻲ ﺍﳊﺎﻟـﺔ‬
‫ﺍﻟﻌﺎﻣﺔ ﰱ ‪ c++‬ﻷﻧﻨﺎ ﻧﺮﻳﺪ ﺃﻥ ﳔﻔﻰ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻦ ﺍﻟﻌﺎﱂ ﺍﳋﺎﺭﺟﻲ ﻻ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﳏﻤﻴﺔ ﺑﻴﻨﻤﺎ‬
‫ﻧﺮﻳﺪ ﺃﻥ ﺗﻜﻮﻥ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻋﺎﻣﺔ ﺣﱴ ﺗﺴﺘﻄﻴﻊ ﺍﻷﺟﺰﺍﺀ ﺍﻷﺧﺮﻯ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺍﺳﺘﺪﻋﺎﺋﻬﺎ‪.‬‬

‫ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻭﺍﻟﺘﻔﺎﻋﻞ ﻣﻌﻬﺎ‬ ‫‪6.6‬‬

‫ﻋﺮﻓﻨﺎ ﺃﻥ ﺍﳍﺪﻑ ﺍﻷﺳﺎﺳﻲ ﻣﻦ ﺍﻟﻔﺌﺔ ﻫﻮ ﺍﺳﺘﻌﻤﺎﳍﺎ ﻛﺄﺳﺎﺱ ﻹﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ‪ .‬ﻭﻟﻜـﻦ‬


‫ﻛﻴﻒ ﻳﺘﻢ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ؟‬

‫‪117‬‬
‫ﳝﻜﻦ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻧﻔﺲ ﺍﻟﺘﺮﻛﻴﺐ ﺍﳌﺴﺘﺨﺪﻡ ﻹﻧﺸﺎﺀ ﻣﺘﻐﲑ ﻣـﻦ ﻧـﻮﻉ‬
‫ﻼ ﻭﺫﻟﻚ ﺃﻥ ﺍﻟﻜﺎﺋﻨﺎﺕ ﰲ ‪ C++‬ﺗﺘﻢ ﻣﻌﺎﻣﻠﺘﻬﺎ ﻛﺄﻧﻮﺍﻉ ﻣﺘﻐﲑﺍﺕ ﻛﻤﺎ ﺗﺘﻢ‬
‫ﺃﺳﺎﺳﻲ ﻛـ ‪ int‬ﻣﺜ ﹰ‬
‫ﻣﻌﺎﻣﻠﺔ ﺍﻟﻔﺌﺎﺕ ﻛﺄﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﻭﻋﻠﻴﻪ ﻹﻧﺸﺎﺀ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪ stack‬ﻧﻜﺘﺐ‪-:‬‬
‫;‪stack stack1‬‬
‫ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﺍﻟﻌﺒﺎﺭﺓ ﳛﺴﺐ ﺍﻟﱪﻧﺎﻣﺞ ﺣﺠﻢ ﺍﻟﻜﺎﺋﻦ ﻭﳜﺼﺺ ﻣﺴﺎﺣﺔ ﻛﺎﻓﻴﺔ ﻟﻪ ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ‬
‫ﻭﻳﻌﻄﻰ ﻣﺴﺎﺣﺔ ﺍﻟﺬﺍﻛﺮﺓ ﻫﺬﻩ ﺍﲰﹰﺎ ‪ . stack1‬ﻭﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ ﳝﻜﻨﻨﺎ ﺇﻧﺸﺎﺀ ﻗﺪﺭ ﻣﺎ ﻧﺸﺎﺀ ﻣـﻦ‬
‫ﺍﻟﻜﺎﺋﻨﺎﺕ ‪-:‬‬
‫;‪stack stack1, stack2 ,stack3‬‬
‫ﺍﻟﺘﻔﺎﻋﻞ ﻣﻊ ﺍﻟﻜﺎﺋﻨﺎﺕ‪-:‬‬
‫ﻳﺘﻢ ﺍﻟﺘﻔﺎﻋﻞ ﻣﻊ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻣﻦ ﺧﻼﻝ ﺍﺳﺘﺪﻋﺎﺀ ﺃﺣﺪ ﺃﻋﻀﺎﺀﻫﺎ ﺍﻟﺪﺍﻟﻴـﺔ ﻭﺍﻟﺜـﺎﱐ ﻳﺒـﺪﻭ‬
‫ﻛﺈﺭﺳﺎﻝ ﺭﺳﺎﻟﺔ ﺇﱃ ﺍﻟﻜﺎﺋﻦ‪ .‬ﳓﺘﺎﺝ ﺇﱃ ﺗﺮﻛﻴﺐ ﻣﺆﻟﻒ ﻣﻦ ﻗﺴﻤﲔ ‪ :‬ﺍﺳﻢ ﺍﻟﻜﺎﺋﻦ ﻭﺍﺳﻢ ﺍﻟﻌﻀﻮ‬
‫ﺍﻟﺪﺍﱄ ﻭﻳﺘﻢ ﺭﺑﻂ ﺍﺳﻢ ﺍﻟﻜﺎﺋﻦ ﻭﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﺑﻮﺍﺳﻄﺔ ﻧﻘﻄﺔ)‪ (.‬ﺗﺴﻤﻰ ﻋﺎﻣﻞ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺃﻋﻀـﺎﺀ‬
‫ﺍﻟﻔﺌﺔ‪.‬‬

‫‪scope resolution operator‬‬ ‫ﻋﺎﻣﻞ ﺩﻗﺔ ﺍﳌﺪﻯ‪-:‬‬


‫ﻳﺘﻢ ﺗﺼﺮﻳﺢ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺩﺍﺧﻞ ﺟﺴﻢ ﺍﻟﻔﺌﺔ ﻭﻟﻜﻦ ﻗﺪ ﲢﺘـﺎﺝ ﺇﱃ ﺗﻌﺮﻳـﻒ ﺃﺣـﺪ‬
‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺧﺎﺭﺝ ﺟﺴﻢ ﺍﻟﻔﺌﺔ‪ ،‬ﻋﻨﺪﻫﺎ ﳚﺐ ﺃﻥ ﻳﺘﻀﻤﻦ ﺍﲰﻪ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ﺍﻟﱵ ﻳﺘﺒﻊ ﳍﺎ ﻭﺇﻻ ﻟﻦ‬
‫ﺗﻜﻮﻥ ﻫﻨﺎﻟﻚ ﻃﺮﻳﻘﺔ ﻟﻜﻲ ﻳﺘﻤﻜﻦ ﺍﳌﺼﺮﻑ ﻣﻦ ﻣﻌﺮﻓﺔ ﺍﻟﻔﺌﺔ ﺍﻟﱵ ﻳﻨﺘﻤﻲ ﺇﻟﻴﻬﺎ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ‪ .‬ﻳﺘﻢ‬
‫ﺭﺑﻂ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﻣﻊ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻣﺎ ﻳﺴﻤﻰ ﺑﻌﺎﻣﻞ ﺩﻗﺔ ﺍﳌﺪﻯ‪ .‬ﻳﺘﺄﻟﻒ ﻫﺬﺍ ﺍﻟﻌﺎﻣﻞ ﻣـﻦ‬
‫ﻧﻘﻄﺘﲔ ﻣﺰﺩﻭﺟﺘﲔ ‪ ، ::‬ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ‪ Push‬ﺍﻟﱵ ﺗﻨﺘﻤﻲ ﺇﱃ ﺍﻟﻔﺌﺔ ‪stack‬‬
‫‪.‬‬
‫)‪void stack::push(int i‬‬
‫{‬
‫{ )‪if(tos==SIZE‬‬
‫;”‪cout << “stack is full.\n‬‬
‫;‪return‬‬
‫}‬
‫;‪stck[tos] = i‬‬
‫;‪tos++‬‬

‫‪118‬‬
}

.‫ ﺍﻟﱵ ﻗﻤﻨﺎ ﺑﺘﻌﺮﻳﻔﻬﺎ‬stack ‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻔﺌﺔ‬

//Program 6-1:
#include<iostream.h>
const int SIZE= 100;
// This creates the class stack.
//Continued
class stack {
private:
int stck[SIZE];
int tos;
public:
void init ( );
void push (int i);
int pop ( );
};

void stack:: init ( )


{
tos = 0;
}
void stack::push (int i)
{
if (tos == SIZE ) {
cout << “Stack is full.\n”;
return;
}
stck[ tos] = I;
tos++;
}

int stack::pop( )

119
{
if(tos == 0) {

cout << “Stack underflow.\n” ;


return 0;
}
tos--;
return stck[tos];
}
//Continued
int main ( )
{
stack stack1, stack2; // create two stack objects

stack1.init ( );
stack2.init ( );

stack1.push (1);

stack2.push (2);

stack1.push (3);
stack2.push (4);

cout << stack1.pop( ) << “ “;


cout << stack1.pop( ) << “ “;
cout << stack2.pop( ) << “ “;
cout << stack2.pop( ) << “\n“;

return 0;
}

‫ﻋﻨﺪﻣﺎ ﻧﺴﺤﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﻗﻤﻨﺎ ﺑﺪﻓﻌﻬﺎ ﰲ ﺍﳌﻜﺪﺱ ﺗﻈﻬﺮ ﺑﺘﺮﺗﻴﺐ ﻣﻌﻜـﻮﺱ ﻭﻋﻠﻴـﻪ‬
: ‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

120
‫‪3 1 4 2‬‬

‫ﻻﺣﻆ ﺃﻧﻨﺎ ﺍﺳﺘﻌﻤﻠﻨﺎ ﺍﻟﻌﺎﻣﻠﲔ ﺍﳌﺘﺼﺪﺭ )‪ (++tos‬ﻭﺍﻟﻼﺣﻖ )‪ (tos--‬ﳌﻌﺎﳉﺔ ﻓﻬـﺮﺱ‬


‫ﺍﳌﺼﻔﻮﻓﺔ ‪ . stck‬ﳝﺜﻞ ﺍﳌﺘﻐﲑ ‪ tos‬ﺃﻋﻠﻰ ﺍﳌﻜﺪﺱ ﻭﻗﺪ ﰎ ﲤﻬﻴﺪﻩ ﻋﻨﺪ ‪. 0‬‬
‫ﻋﻨﺪ ﺩﻓﻊ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺍﳌﻜﺪﺱ ﺗﺘﻢ ﺯﻳﺎﺩﺓ ‪ tos‬ﺃﻭ ﹰﻻ ﰒ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﻛﻔﻬﺮﺱ ﻟﺬﺍ ﳒـﺪ‬
‫ﺃﻥ ‪ tos‬ﻳﺸﲑ ﺩﺍﺋﻤﺎﹰ ﺇﱃ ﻣﻜﺎﻥ ﻭﺍﺣﺪ ﻗﺒﻞ ﺑﻨﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻷﺧﲑ ﺍﳌﺪﻓﻮﻉ ﰲ ﺍﳌﻜﺪﺱ‪.‬‬
‫ﻋﻨﺪ ﺳﺤﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻳﺘﻢ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﺃﻭ ﹰﻻ ﰒ ﻳﺘﻢ ﺇﻧﻘﺎﺹ ﺍﻟﻔﻬﺮﺱ )‪ (tos--‬ﻟﺬﺍ ﻓﺈﻥ‬
‫‪ tos‬ﻳﺸﲑ ﻣﺒﺎﺷﺮﺓ ﺇﱃ ﺃﻋﻠﻰ ﺍﳌﻜﺪﺱ‪.‬‬

‫ﺗﺬﻛﺮ ﺃﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳋﺎﺻﺔ ﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﺇﻻ ﻣﻦ ﻗﺒﻞ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺘﺎﺑﻌـﺔ‬
‫ﻟﻠﻔﺌﺔ ﻭﻋﻠﻴﻪ ﻋﺒﺎﺭﺓ ﻛﺎﻟﺘﺎﻟﻴﺔ ﻏﲑ ﻣﻘﺒﻮﻟﺔ ﰲ ‪-:C++‬‬
‫‪stack1.tos=0 // Error tos is private‬‬

‫ﻛﻴﻔﻴﺔ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﻌﺎﻣﺔ ﰲ ﺍﻟﻔﺌﺔ‪:‬‬


‫ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﻌﺎﻣﺔ ﰲ ﻓﺌﺔ ﻣﺎ‪ ،‬ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ‪:‬‬

‫ﺇﺳﻢ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ﻭﻋﺎﻣﻞ ﺍﻟﻨﻘﻄﺔ )‪. (.‬‬ ‫‪-1‬‬


‫ﻣﺮﺟﻊ ﺇﱃ ﻛﺎﺋﻦ ﰲ ﺍﻟﻔﺌﺔ ﻭﻋﺎﻣﻞ ﺍﻟﻨﻘﻄﺔ‪.‬‬ ‫‪-2‬‬
‫ﻣﺆﺷﺮ ﺇﱃ ﻛﺎﺋﻦ ﰲ ﺍﻟﻔﺌﺔ ﻭﺍﻟﻌﺎﻣﻞ )>‪.(-‬‬ ‫‪-3‬‬

‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻫﺬﺍ‪:‬‬

‫‪//Program 6-2:‬‬
‫>‪#include<iostream.h‬‬
‫{ ‪class count‬‬
‫‪public:‬‬

‫‪121‬‬
int x;
void print( ) { cout <<x<<endl;}
};
main( )
{
count counter;
//Continued
*countrptr=&counter;
cout<<”assign 7 to x and pring using the object’s name: “;
counter.x=z;
counter.print( );
cout<<”assign 8 to x and print using a reference: “;
countref-x=9;
cout <<countref.print( );
cout<<”assign 10 to x and print using a pointer: “;
counterptr->x=10;
counterptr->print( );
return 0;

122
‫ﺍﻟﺒﻨﻴــﺎﺕ‬
‫‪6.7‬‬
‫‪structures‬‬
‫ﺍﻟﺒﻨﻴﺔ ﰲ ‪ C++‬ﻫﻲ ﻃﺮﻳﻘﺔ ﻟﺘﺠﻤﻴﻊ ﻋﺪﺓ ﺑﻨﻮﺩ ﺑﻴﺎﻧﺎﺕ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﻣﻦ ﺃﻧﻮﺍﻉ ﳐﺘﻠﻔﺔ‬
‫‪ .‬ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺒﻨﻴﺎﺕ ﻋﺎﺩﺓ ﻋﻨﺪﻣﺎ ﺗﺸﻜﻞ ﻋﺪﺓ ﺑﻨﻮﺩ ﺑﻴﺎﻧﺎﺕ ﻭﺣﺪﺓ ﻣﺘﻤﻴﺰﺓ ﻟﻜﻨﻬﺎ ﻏﲑ ﻣﻬﻤـﺔ‬
‫ﻟﺘﺼﺒﺢ ﻓﺌﺔ ‪ .‬ﻭﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ ﺍﻟﻔﺌﺔ ﰲ ‪ C++‬ﺗﻨﻔﺬ ﻛﻞ ﺍﳌﻬﺎﻡ ﺍﻟﱵ ﺗﻘﻮﻡ ‪‬ﺎ ﺍﻟﺒﻨﻴﺎﺕ ﻟﻜـﻦ ﻻ‬
‫ﻳﺰﺍﻝ ﻫﻨﺎﻟﻚ ﺍﻟﻜﺜﲑ ﻣﻦ ﺍﳊﺎﻻﺕ ﺍﻟﱵ ﺗﻜﻮﻥ ﻓﻴﻬﺎ ﺍﻟﺒﻨﻴﺎﺕ ﻣﻔﻴﺪﺓ ‪ .‬ﻭﻛﻤﺜﺎﻝ ﻋﻠﻰ ﺑﻨﻴﺔ‪-:‬‬
‫‪struct part‬‬
‫{‬
‫;‪int modelnumber‬‬
‫;‪int partnumber‬‬
‫;‪float cost‬‬
‫;}‬

‫ﺗﺘﺄﻟﻒ ﺍﻟﺒﻨﻴﺔ ﻣﻦ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ struct‬ﻳﻠﻴﻬﺎ ﺍﺳﻢ ﺍﻟﺒﻨﻴﺔ ﻭﺃﻗﻮﺍﺱ ﺣﺎﺻﺮﺓ ﲢـﻴﻂ‬
‫ﲜﺴﻢ ﺍﻟﺒﻨﻴﺔ‪ .‬ﺗﻨﻬﻰ ﺍﻟﺒﻨﻴﺔ ﻓﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ‪.‬‬
‫ﻳﺘﺄﻟﻒ ﺟﺴﻢ ﺍﻟﺒﻨﻴﺔ ﻋﺎﺩﺓ ﻣﻦ ﻋﺪﺓ ﺑﻨﻮﺩ ﺑﻴﺎﻧﺎﺕ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﻣﻦ ﺃﻧﻮﺍﻉ ﳐﺘﻠﻔﺔ ﺗﺴﻤﻰ‬
‫ﻫﺬﻩ ﺍﻟﺒﻨﻮﺩ ﺃﻋﻀﺎﺀ ‪. members‬‬
‫♦ ﺍﻟﺒﻨﻴﺔ ﺷﺒﻴﻬﺔ ﺟﺪﹰﺍ ﺑﺎﻟﻔﺌﺔ ﻣﻦ ﻧﺎﺣﻴﺔ ﺍﻟﺘﺮﻛﻴﺐ ﺍﳌﻨﻄﻘﻲ ﻟﻜﻦ ﺍﻟﻔﺌﺎﺕ ﻭﺍﻟﺒﻨﻴﺎﺕ ﺗﺴﺘﻌﻤﻞ ﺑﻄﺮﻕ ﳐﺘﻠﻔﺔ ﺟﺪﹰﺍ ‪ ،‬ﻋـﺎﺩﺓ‬
‫ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ ﻋﻠﻰ ﺑﻴﺎﻧﺎﺕ ﻭﺩﺍﻻﺕ ﺑﻴﻨﻤﺎ ﲢﺘﻮﻯ ﺍﻟﺒﻨﻴﺔ ﻋﻠﻰ ﺑﻴﺎﻧﺎﺕ ﻓﻘﻂ‪.‬‬
‫♦ ﻻ ﺗﺆﺩﻯ ﻣﻮﺍﺻﻔﺎﺕ ﺍﻟﺒﻨﻴﺔ ﺇﱃ ﺇﻧﺸﺎﺀ ﺃﻱ ﺑﻨﻴﺔ ﻛﻤﺎ ﻫﻮ ﺍﳊﺎﻝ ﻣﻊ ﺍﻟﻔﺌﺎﺕ ‪،‬ﺇ‪‬ﺎ ﳎﺮﺩ ﻣﻮﺍﺻﻔﺎﺕ ﻟﺸـﻜﻞ ﺍﻟﺒﻨﻴـﺔ‬
‫ﻋﻨﺪﻣﺎ ﻳﺘﻢ ﺇﻧﺸﺎﺅﻫﺎ‪.‬‬

‫ﻟﺘﻌﺮﻳﻒ ﻣﺘﻐﲑﺍﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ﺍﻟﺒﻨﻴﻮﻱ ‪ part‬ﻧﻜﺘﺐ‪:‬‬


‫;‪part cp1,cp2‬‬
‫ﻫﻨﺎﻟﻚ ﺃﻳﻀﹰﺎ ﻃﺮﻳﻘﺔ ﳐﺘﺼﺮﺓ ﻟﺘﻌﺮﻳﻒ ﺍﳌﺘﻐﲑﺍﺕ ﺍﻟﺒﻨﻴﻮﻳﺔ ﺣﻴﺚ ﻳﺘﻢ ﻭﺿـﻊ ﺃﲰـﺎﺀ ﺍﳌـﺘﻐﲑﺍﺕ ﰲ‬
‫ﻣﻮﺍﺻﻔﺎﺕ ﺍﻟﺒﻨﻴﺔ ﻛﺎﻵﰐ‪:‬‬
‫‪struct part‬‬
‫{‬

‫‪123‬‬
‫;‪int modelnumber‬‬
‫;‪int partnumber‬‬
‫;‪float cost‬‬
‫;‪}cp1,cp2‬‬

‫ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺃﻋﻀﺎﺀ ﺍﻟﺒﻨﻴﺔ‬


‫‪Accessing structs‬‬
‫‪6.8‬‬

‫ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﻋﺎﻣﻞ ﺍﻟﻨﻘﻄﺔ ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﺃﻋﻀﺎﺀ ﺍﻟﺒﻨﻴﺔ ﲤﺎﻣﹰﺎ ﻣﺜﻠﻤﺎ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﻟﻠﻮﺻﻮﻝ‬
‫ﻼ ﳝﻜﻨﻨﺎ ﺃﻥ ﻧﻜﺘﺐ‪-:‬‬‫ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ ‪،‬ﻓﻤﺜ ﹰ‬
‫;‪cin>> cp1.part number‬‬
‫ﻭﻳﻜﻮﻥ ﺍﺳﻢ ﺍﳌﺘﻐﲑ ﻗﺒﻞ ﺍﻟﻨﻘﻄﺔ ﺑﻴﻨﻤﺎ ﻳﻜﻮﻥ ﺍﺳﻢ ﺍﻟﻌﻀﻮ ﺍﻟﺒﻴﺎﱐ ﺑﻌﺪﻫﺎ‪.‬‬

‫ﲤﻬﻴﺪ ﺍﳌﺘﻐﲑﺍﺕ ﺍﻟﺒﻨﻴﻮﻳﺔ‪:‬‬


‫ﻼ‬
‫ﳝﻜﻦ ﺗﺰﻭﻳﺪ ﻗﻴﻢ ﺃﻭﻟﻴﺔ ﻟﻠﻤﺘﻐﲑﺍﺕ ﺍﻟﺒﻨﻴﻮﻳﺔ ﲤﺎﻣﹰﺎ ﻛﻤﺎ ﻧﻔﻌﻞ ﻣﻊ ﺍﳌﺼـﻔﻮﻓﺎﺕ ‪ ،‬ﻓﻤـﺜ ﹰ‬
‫ﻟﺘﻤﻬﻴﺪ ﻣﺘﻐﲑ ﺑﻨﻴﻮﻱ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ part‬ﻧﻜﺘﺐ‪:‬‬
‫;}‪part cp1 = {6244,15,217.1‬‬

‫ﺗﺆﺩﻯ ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ ﺇﱃ ﲤﻬﻴـﺪ ‪ cp1.modelnumber‬ﻋﻨـﺪ ﺍﻟﻘﻴﻤـﺔ ‪6244‬‬


‫ﻭ ‪ cp1.partnumber‬ﻋﻨﺪ ﺍﻟﻘﻴﻤﺔ ‪ 15‬ﻭﲤﻬﻴﺪ ‪ cp1.cost‬ﻋﻨﺪ ﺍﻟﻘﻴﻤﺔ ‪. 217.1‬‬

‫ﺇﺳﺘﻌﻤﺎﻝ ﺍﻟﺒﻨﻴﺔ‪:‬‬
‫ﰲ ﺍﻟﻔﺌﺔ ‪ stack‬ﺍﻟﱵ ﻗﻤﻨﺎ ﺑﺘﻌﺮﻳﻔﻬﺎ ﰲ ﺍﻷﻣﺜﻠﺔ ﺍﻟﺴﺎﺑﻘﺔ ﳒﺪ ﺃﻥ ﺍﳌﺼﻔﻮﻓﺔ ﺍﻟﱵ ﻳﺘﻢ ﻓﻴﻬﺎ‬
‫ﲣﺰﻳﻦ ﺑﻨﻮﺩ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺍﳌﺘﻐﲑ ‪ tos‬ﺍﻟﺬﻱ ﻳﺸﲑ ﺇﱃ ﺃﻋﻠﻰ ﺍﳌﻜﺪﺱ ‪ stack‬ﻣﺮﺗﺒﻄﺎﻥ ﺑﺒﻌﻀـﻬﻤﺎ‬
‫ﺇﱃ ﺣﺪ ﻛﺒﲑ ﻟﺬﻟﻚ ﻣﻦ ﺍﻷﻧﺴﺐ ﺩﳎﻬﻤﺎ ﰲ ﺑﻨﻴﺔ ‪ ،‬ﻭﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﻫﺬﻩ ﺍﻟﺒﻨﻴﺔ ﻛﻌﻀﻮ ﺑﻴﺎﱐ ﻭﺍﺣﺪ‬
‫ﰲ ﺍﻟﻔﺌﺔ ‪ stack‬ﻓﻴﻤﺎ ﻳﻠﻲ ﺳﻨﻮﺿﺢ ﻛﻴﻒ ﻳﻜﻮﻥ ﻫﺬﺍ‪:‬‬

‫‪//Program 6-3:‬‬
‫>‪# include<iostream.h‬‬
‫‪# define size 100‬‬

‫‪124‬‬
sruct stackette
//Continued
{
int stck[size];
int tos;
};
class stack
{
private:
stackette st;
public:
void init( );
void push( int i);
int pop( );
};
void stack :: init( )
{
st.tos=0;
}
void stack:: push(int i );
{
if(st.tos== size){
cout <<”stack is full.\n”;
return;
}
st.stck[st.tos] = i;
st.tos ++;
}
int stack:: pop( )
{
if(st.tos== 0) {
cout <<”stack under flow.\n”;
return 0;
}

125
‫;‪st.tos--‬‬
‫;]‪return st.stck[st.tos‬‬
‫‪//Continued‬‬
‫}‬
‫) (‪int main‬‬
‫{‬
‫;‪stack stack1‬‬
‫;) (‪stack1.init‬‬
‫;)‪stack1.push(1‬‬
‫;)‪stack1.push(2‬‬
‫;)‪stack1.push(10‬‬
‫; “ “ <<) (‪cout<< stack1.pop‬‬

‫; “ “ <<) (‪cout<< stack1.pop‬‬


‫;‪return 0‬‬

‫ﺍﳋﺮﺝ ﻣﻦ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ‪:‬‬

‫‪2‬‬

‫ﲣﺰﻥ ﺍﻟﺒﻨﻴﺔ ‪ stackette‬ﻫﻨﺎ ﻣﺼﻔﻮﻓﺔ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﻭﻣـﺘﻐﲑ ﻳﺸـﲑ ﺇﱃ ﺃﻋﻠـﻰ‬


‫ﺍﳌﻜﺪﺱ‪ .‬ﺍﻟﻌﻀﻮ ﺍﻟﺒﻴﺎﱐ ﺍﻟﻮﺣﻴﺪ ﰲ ﺍﻟﻔﺌﺔ ‪ stack‬ﺍﻵﻥ ﻫﻮ ﻣﺘﻐﲑ ﺗﺎﺑﻊ ﻟﻠﺒﻨﻴـﺔ ‪stackette‬‬
‫ﻭﺗﺸﲑ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻟﻠﻔﺌﺔ ‪ stack‬ﺍﻵﻥ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﰲ ‪ st‬ﺑﺎﺳﺘﻌﻤﺎﻝ ﻋﺎﻣﻞ ﺍﻟﻨﻘﻄﺔ‬
‫‪st.tos=0‬‬

‫ﺍﻟﺒﻨﻴﺎﺕ ﻣﻘﺎﺑﻞ ﺍﻟﻔﺌﺎﺕ‬


‫‪6.9‬‬
‫‪Structs vs. Classes‬‬
‫ﳝﻜﻦ ﺍﻟﻘﻮﻝ ﺃﻥ ﺍﻟﺒﻨﻴﺔ ﻫﻲ ﲡﻤﻴﻊ ﻫﺎﻣﺪ ﻟﺒﻨﻮﺩ ﺍﻟﺒﻨﻴﺎﺕ ﺑﻴﻨﻤﺎ ﺍﻟﻔﺌﺔ ﻫﻲ ﺁﻟﻴﺔ ﻧﺸﻄﺔ ﻟﻠﺒﻴﺎﻧﺎﺕ‬
‫ﻭﺍﻟﺪﺍﻻﺕ ‪ ،‬ﻓﺎﻟﻔﺌﺎﺕ ﺗﺸﻜﻞ ﺃﺳﺎﺱ ﺍﻟﱪﳎﺔ ﺍﻟﻜﺎﺋﻨﻴﺔ ﺍﳌﻨﺤﻰ ﺑﻴﻨﻤﺎ ﺍﻟﺒﻨﻴﺎﺕ ﻫﻲ ﺟﺰﺀ ﺻﻐﲑ ﰲ‬
‫ﺍﺳﺘﻌﻤﺎﻻﺕ ‪ . C++‬ﳒﺪ ﺃﻥ ﺍﻟﺘﺮﻛﻴﺐ ﺍﳌﻨﻄﻘﻲ ﻟﻠﻔﺌﺎﺕ ﻭﺍﻟﺒﻨﻴﺎﺕ ﻣﺘﻄـﺎﺑﻖ ﺗﻘﺮﻳﺒـﹰﺎ ‪،‬ﺇﻻ ﺃﻥ‬

‫‪126‬‬
‫ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ ﺗﻜﻮﻥ ﺃﻋﻀﺎﺀ ﺧﺎﺻﺔ ﺑﺸﻜﻞ ﺍﻓﺘﺮﺍﺿﻲ ‪ .‬ﺃﻱ ﺇﺫﺍ ﱂ ﻳﺘﻢ ﺍﺳـﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤـﺎﺕ‬
‫ﺍﻷﺳﺎﺳﻴﺔ ‪ public‬ﺃﻭ ‪ private‬ﺗﻜﻮﻥ ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ ﺧﺎﺻﺔ‪.‬‬

‫‪127‬‬
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﺃﺳﺎﺱ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻜﺘﻮﺑﺔ ﺑﺎﻟﻠﻐﺔ ‪ C++‬ﻫﻮ ﺍﻟﻜﺎﺋﻨﺎﺕ‪.‬‬


‫♦ ﺗﺄﺧﺬ ﺍﻟﻔﺌﺔ ﰲ ‪ C++‬ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﺍﻟﺘﺎﱄ‪:‬‬
‫{ ‪class classname‬‬
‫♦ ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ ﻋﻠﻰ ﺑﻴﺎﻧﺎﺕ ﻣﻌﺮﻓﺔ ﺩﺍﺧﻠﻪ ﻭﺗﺴﻤﻰ ﺃﻋﻀﺎﺀ ﺑﻴﺎﻧﻴﺔ )‪(data members‬‬
‫ﻭﻋﻠﻰ ﺩﺍﻻﺕ ﺗﺴﻤﻰ ﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ )‪. (function members‬‬
‫♦ ﻳﺘﻢ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻧﻔﺲ ﺍﻟﺘﺮﻛﻴﺐ ﺍﳌﺴﺘﺨﺪﻡ ﻹﻧﺸﺎﺀ ﻣﺘﻐﲑ ﻣﻦ ﻧﻮﻉ ﺃﺳﺎﺳﻲ‬
‫‪.‬‬
‫♦ ﺗﻌﺎﻣﻞ ﺍﻟﻜﺎﺋﻨﺎﺕ ﰲ ‪ C++‬ﻛﺄﻧﻮﺍﻉ ﻣﺘﻐﲑﺍﺕ ﻛﻤﺎ ﺗﺘﻢ ﻣﻌﺎﻣﻠﺔ ﺍﻟﻔﺌﺎﺕ ﻛﺄﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ‪.‬‬
‫♦ ﻹﻧﺸﺎﺀ ﻛﺎﺋﻦ ‪ anyobj‬ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪ anyclass‬ﻧﻜﺘﺐ‪:‬‬
‫;‪anyclass anyobj‬‬
‫♦ ﻳﺘﻢ ﺍﻟﺘﻔﺎﻋﻞ ﻣﻊ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺑﺎﺳﺘﺪﻋﺎﺀ ﺃﺣﺪ ﺃﻋﻀﺎﺋﻬﺎ ﺍﻟﺪﺍﻟﻴﺔ ﻭﺍﻟﺬﻱ ﻳﺒﺪﻭ ﻛﺈﺭﺳﺎﻝ ﺭﺳﺎﻟﺔ‬
‫ﺇﱃ ﺍﻟﻜﺎﺋﻦ‪.‬‬
‫♦ ﻟﻠﺘﻔﺎﻋﻞ ﻣﻊ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺗﺘﻢ ﻛﺘﺎﺑﺔ ﺍﺳﻢ ﺍﻟﻜﺎﺋﻦ ﻭﺍﺳﻢ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﻭﻳﺘﻢ ﺭﺑﻂ ﺍﲰﻴﻬﻤـﺎ‬
‫ﺑﻮﺍﺳﻄﺔ ﻧﻘﻄﺔ ) ‪ ( .‬ﺗﺴﻤﻰ ﻋﺎﻣﻞ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ‪.‬‬
‫♦ ﺇﺫﺍ ﰎ ﺗﻌﺮﻳﻒ ﻋﻀﻮ ﺩﺍﱄ ﺧﺎﺭﺝ ﻓﺌﺘﻪ ﻳﺘﻢ ﺭﺑﻂ ﺍﺳﻢ ﻓﺌﺘﻪ ﺑﻮﺍﺳﻄﺔ ﺍﻟﻌﺎﻣﻞ ) ‪ ( ::‬ﻭﺍﻟـﺬﻱ‬
‫ﻳﺴﻤﻰ ﺑﻌﺎﻣﻞ ﺩﻗﺔ ﺍﳌﺪﻯ‪.‬‬
‫♦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳋﺎﺻﺔ ﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﺇﻻ ﻣﻦ ﻗﺒﻞ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺘﺎﺑﻌﺔ ﻟﻠﻔﺌﺔ‪.‬‬
‫♦ ﺍﻟﺒﻨﻴﺔ ﰲ ‪ C++‬ﻫﻲ ﻃﺮﻳﻘﺔ ﻟﺘﺠﻤﻴﻊ ﻋﺪﺓ ﺑﻨﻮﺩ ﺑﻴﺎﻧﺎﺕ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﻣﻦ ﺃﻧﻮﺍﻉ ﳐﺘﻠﻔﺔ‪.‬‬
‫♦ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺒﻨﻴﺎﺕ ﻋﻨﺪﻣﺎ ﺗﺸﻜﻞ ﻋﺪﺓ ﺑﻨﻮﺩ ﺑﻴﺎﻧﺎﺕ ﻭﺣﺪﺓ ﻣﺘﻤﻴﺰﺓ ﻟﻜﻨﻬﺎ ﻏﲑ ﻣﻬﻤـﺔ‬
‫ﻟﺘﺼﺒﺢ ﻓﺌﺔ‪.‬‬
‫♦ ﺗﺘﺄﻟﻒ ﺍﻟﺒﻨﻴﺔ ﻣﻦ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ struct‬ﻳﻠﻴﻬﺎ ﺍﺳﻢ ﺍﻟﺒﻨﻴﺔ ﻭﺃﻗﻮﺍﺱ ﺣﺎﺻﺮﺓ ﲢـﻴﻂ‬
‫ﲜﺴﻢ ﺍﻟﺒﻨﻴﺔ ﻭﺗﻨﻬﻰ ﺍﻟﺒﻨﻴﺔ ﻓﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ‪.‬‬
‫♦ ﻳﺘﺄﻟﻒ ﺟﺴﻢ ﺍﻟﺒﻨﻴﺔ ﻣﻦ ﻋﺪﺓ ﺑﻨﻮﺩ ﺑﻴﺎﻧﺎﺕ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﻣﻦ ﺃﻧﻮﺍﻉ ﳐﺘﻠﻔﺔ ﻭﺗﺴﻤﻰ ﺗﻠﻚ‬
‫ﺍﻟﺒﻨﻮﺩ ﺃﻋﻀﺎﺀ‪.‬‬
‫♦ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﻋﺎﻣﻞ ﺍﻟﻨﻘﻄﺔ ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﺃﻋﻀﺎﺀ ﺍﻟﺒﻨﻴﺔ ﲤﺎﻣﹰﺎ ﻣﺜﻠﻤﺎ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﻟﻠﻮﺻﻮﻝ‬
‫ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ‪.‬‬

‫‪128‬‬
‫ﺍﻷﺳﺌﻠﺔ‬
‫‪ /1‬ﺃﻧﺸﺊ ﻓﺌﺔ ﺗﺪﻋﻰ ‪ complex‬ﺗﻘﻮﻡ ﺑﺈﺟﺮﺍﺀ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﻋﻠﻰ ﺍﻷﻋﺪﺍﺩ ﺍﳌﺮﻛﺒﺔ‪.‬‬
‫ﺍﻟﻌﺪﺩ ﺍﳌﺮﻛﺐ ﻳﻜﻮﻥ ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ ‪:‬‬
‫‪real part + imaginary part*i‬‬
‫ﺣﻴﺚ ‪i= √-1‬‬
‫ﺍﺳﺘﺨﺪﻡ ﻣﺘﻐﲑﺍﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ float‬ﻟﺘﻤﺜﻴﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳋﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ‪ ،‬ﻋﻠـﻰ ﺃﻥ ﲢﺘـﻮﻯ‬
‫ﺍﻟﻔﺌﺔ ‪complex‬ﻋﻠﻰ ﺍﻟﺪﻭﺍﻝ ﺍﻵﺗﻴﺔ‪:‬‬
‫ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﲜﻤﻊ ﻋﺪﺩﻳﻦ ﻣﺮﻛﺒﲔ‪.‬‬ ‫‬

‫ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﺑﻄﺮﺡ ﻋﺪﺩﻳﻦ ﻣﺮﻛﺒﲔ‪.‬‬ ‫‬

‫ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻷﻋﺪﺍﺩ ﺍﳌﺮﻛﺒﺔ ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ )‪ (a, b‬ﺣﻴـﺚ ‪ a‬ﳝﺜـﻞ ﺍﳉـﺰﺀ‬ ‫‬

‫ﺍﳊﻘﻴﻘﻲ ‪ b ،‬ﲤﺜﻞ ﺍﳉﺰﺀ ﺍﻟﺘﺨﻴﻠﻲ‪.‬‬


‫ﻼ ﻻﺧﺘﺒﺎﺭ ﺍﻟﻔﺌﺔ ﺍﻟﱵ ﻗﻤﺖ ﺑﺈﻧﺸﺎﺋﻬﺎ‪.‬‬
‫ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﻛﺎﻣ ﹰ‬

‫‪ /2‬ﺃﻧﺸﺊ ﻓﺌﺔ ﺗﺪﻋﻰ ‪ Rational‬ﻭﺍﻟﱵ ﲡـﺮﻯ ﺍﻟﻌﻤﻠﻴـﺎﺕ ﺍﳊﺴـﺎﺑﻴﺔ ﻋﻠـﻰ ﺍﻟﻜﺴـﻮﺭ‬


‫‪.fractions‬‬
‫ﺍﺳﺘﺨﺪﻡ ﻣﺘﻐﲑﺍﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ int‬ﻟﺘﻤﺜﻴﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳋﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ) ﺍﻟﺒﺴﻂ ﻭﺍﳌﻘﺎﻡ (‪.‬‬
‫ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ ‪ Rational‬ﻋﻠﻰ ﺩﻭﺍﻝ ﺗﻘﻮﻡ ﺑﺎﻟﻌﻤﻠﻴﺎﺕ ﺍﻵﺗﻴﺔ‪-:‬‬
‫ﲨﻊ ﻋﺪﺩﻳﻦ ﻣﻦ ﺍﻟﻨﻮﻉ ‪.Rational‬‬ ‫‬

‫ﻃﺮﺡ ﻋﺪﺩﻳﻦ ﻣﻦ ﺍﻟﻨﻮﻉ ‪.Rational‬‬ ‫‬

‫ﺿﺮﺏ ﻋﺪﺩﻳﻦ ﻣﻦ ﺍﻟﻨﻮﻉ ‪.Rational‬‬ ‫‬

‫ﻗﺴﻤﺔ ﻋﺪﺩﻳﻦ ﻣﻦ ﺍﻟﻨﻮﻉ ‪.Rational‬‬ ‫‬

‫ﻃﺒﺎﻋﺔ ﺍﻟﻜﺴﻮﺭ ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ ‪ a/b‬ﺣﻴﺚ ﳝﺜﻞ ‪ a‬ﺍﻟﺒﺴﻂ ﻭ ‪ b‬ﺍﳌﻘﺎﻡ‪.‬‬ ‫‬

‫‪ /3‬ﺃﻭﺟﺪ ﺍﳋﻄﺄ ﰲ ﺍﻵﰐ‪-:‬‬


‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻫﻮ ﺟﺰﺀ ﻣﻦ ﺗﻌﺮﻳﻒ ﻓﺌﺔ ﺗﺪﻋﻰ ‪:Time‬‬
‫{ ‪class Time‬‬
‫‪public:‬‬

‫‪129‬‬
// function prototypes
private:
int hour = 0;
int minute = 0;
int second = 0;
};
scope resolution operator .:: ‫ ﻣﺎ ﻫﻮ ﺍﻟﻐﺮﺽ ﻣﻦ ﻋﺎﻣﻞ ﺩﻗﺔ ﺍﳌﺪﻯ‬/4

.C++ ‫ ﻗﺎﺭﻥ ﺑﲔ ﻣﻔﻬﻮﻣﻲ ﺍﻟﺒﻨﻴﺎﺕ ﻭﺍﻟﻔﺌﺎﺕ ﰲ‬/5

130
‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﺴﺎﺑﻌﺔ‬
‫‪7.0‬‬
‫)‪Classes (II) - (II‬‬ ‫ﺍﻟﻔﺌﺎﺕ‬

‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪:‬‬


‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺍﳌﺸﻴﺪﺍﺕ ‪.constructors‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺍﳌﻬﺪﻣﺎﺕ ‪. destructors‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺇﻧﺸﺎﺀ ﻛﺎﺋﻨﺎﺕ ﺛﺎﺑﺘﺔ ‪ Constant objects‬ﻭﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ ﺛﺎﺑﺘﺔ‬
‫‪.Constant member functions‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﺃﻋﻀﺎﺀ ﺑﻴﺎﻧﻴﺔ ﺳﺎﻛﻨﺔ ‪Static data members‬‬
‫ﻭﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ ﺳﺎﻛﻨﺔ ‪.Static member functions‬‬

‫‪131‬‬
‫ﺍﳌﺸﻴﺪﺍﺕ‬ ‫‪7.1‬‬
‫‪Constructors‬‬

‫ﰲ ﺑﻌﺾ ﺍﻷﺣﻴﺎﻥ ﳓﺘﺎﺝ ﻟﺘﻤﻬﻴﺪ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻋﻨﺪ ﻗﻴﻢ ﻣﻌﻴﻨﺔ ﻗﺒﻞ ﺍﺳﺘﻌﻤﺎﳍﺎ ﰲ ﺍﻟﱪﻧـﺎﻣﺞ‬
‫ﻼ ﰲ ﺍﻟﻔﺌﺔ ‪ stack‬ﻭﺍﻟﱵ ﰎ ﺗﻌﺮﻳﻔﻬﺎ ﺳﺎﺑﻘﹰﺎ ﺍﳌﺘﻐﲑ ‪ tos‬ﰎ ﲤﻬﻴﺪ ﻗﻴﻤﺘﻪ ﻋﻨـﺪ ‪ 0‬ﻭﺫﻟـﻚ‬ ‫‪،‬ﻓﻤﺜ ﹰ‬
‫ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﺍﻟﺔ ) (‪. int‬‬
‫ﻼ‬
‫ﻼ ﻟﻴﺲ ﺃﺳﻠﻮﺑﹰﺎ ﻣﻔﻀـ ﹰ‬
‫ﺇﻥ ﲤﻬﻴﺪ ﺍﳌﺘﻐﲑ ‪ tos‬ﻋﻨﺪ ‪ 0‬ﺑﺎﺳﺘﻌﻤﺎﻝ ﺩﺍﻟﺔ ﻛـ ) (‪ int‬ﻣﺜ ﹰ‬
‫ﰲ ‪ ، OOP‬ﺃﺣﺪ ﺃﺳﺒﺎﺏ ﻫﺬﺍ ﺃﻥ ﺍﳌﱪﻣﺞ ﺍﻟﺬﻱ ﻳﻜﺘﺐ ﺍﻟﺪﺍﻟﺔ ) (‪ main‬ﳚـﺐ ﺃﻥ ﻳﺘـﺬﻛﺮ‬
‫ﺿﺮﻭﺭﺓ ﺍﺳﺘﺪﻋﺎﺀ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻛﻠﻤﺎ ﰎ ﺍﺳﺘﺪﻋﺎﺀ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪ ، stack‬ﻟﺬﻟﻚ ﺗﺴﻤﺢ ‪C++‬‬
‫ﻟﻠﻜﺎﺋﻨﺎﺕ ﺑﺘﻤﻬﻴﺪ ﻧﻔﺴﻬﺎ ﻋﻨﺪ ﺇﻧﺸﺎﺋﻬﺎ ﻫﺬﺍ ﺍﻟﺘﻤﻬﻴﺪ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺩﻭﺍﻝ ﺧﺎﺻﺔ ﺗﺴﻤﻰ ﺍﳌﺸﻴﺪﺍﺕ‪.‬‬
‫ﺍﳌﺸﻴﺪ‪ :‬ﻫﻮ ﻋﻀﻮ ﺩﺍﱄ ﺧﺎﺹ ﳛﻤﻞ ﻧﻔﺲ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ﻭﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﻟﺘﻤﻬﻴﺪ ﺍﻟﻜﺎﺋﻨﺎﺕ ‪.‬‬
‫ﺍﻟﻨﻤﻮﺫﺝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻛﻴﻒ ﺗﺒﺪﻭ ﻓﺌﺔ ‪ stack‬ﻋﻨﺪ ﺍﺳﺘﻌﻤﺎﻝ ﻣﺸﻴﺪ ﻟﺘﻤﻬﻴﺪ ﺍﳌﺘﻐﲑ ‪.tos‬‬

‫‪//Program 7-1:‬‬
‫‪// This creates the class stack.‬‬
‫;‪const int SIZE= 100‬‬
‫{ ‪class stack‬‬
‫;]‪int stck[size‬‬
‫;‪int tos‬‬
‫‪public:‬‬
‫;) (‪stack‬‬ ‫‪//constructor‬‬
‫;)‪void push (int i‬‬
‫;) (‪int pop‬‬
‫;}‬

‫ﻻﺣﻆ ﺃﻥ ﺍﳌﺸﻴﺪ ‪ stack‬ﻻ ﳛﻤﻞ ﺃﻱ ﻗﻴﻤﺔ ﺇﻋﺎﺩﺓ‪ .‬ﰲ ‪ C++‬ﻻ ﺗﺮﺟﻊ ﺍﳌﺸـﻴﺪﺍﺕ‬
‫ﺃﻱ ﻗﻴﻢ ﻋﻨﺪ ﺍﺳﺘﺪﻋﺎﺋﻬﺎ ﻫﻲ ﻓﻘﻂ ﺗﻘﻮﻡ ﺑﺘﻤﻬﻴﺪ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻋﻨﺪ ﻗﻴﻢ ﻣﻌﻴﻨﺔ‪.‬‬

‫‪132‬‬
‫ﺍﳌﻬﺪﻣﺎﺕ‬
Destructors 7.2

‫ ﺑﺈﻣﻜﺎﻥ ﻛﺎﺗﺐ ﺍﻟﻔﺌـﺔ‬C++ ‫ﺇﻥ ﻛﻞ ﻛﺎﺋﻦ ﻳﺘﻢ ﺇﻧﺸﺎﺅﻩ ﺳﻴﺘﻢ ﺗﺪﻣﲑﻩ ﰲ ﻭﻗﺖ ﻣﺎ ﻟﺬﺍ ﰲ‬
‫ ﻳﻌﻤﻞ ﻫﺬﺍ ﺍﳌﻬﺪﻡ ﻋﻠﻰ ﺇﻟﻐﺎﺀ ﲣﺼﻴﺺ ﺍﻟﺬﺍﻛﺮﺓ ﺍﻟﱵ ﻛﺎﻥ ﺍﳌﻬﺪﻡ ﻗﺪ ﺧﺼﺼﻬﺎ‬،‫ﻛﺘﺎﺑﺔ ﻣﻬﺪﻡ ﺑﻨﻔﺴﻪ‬
‫ﺃﻳﻀﹰﺎ ﻻ ﳝﻠﻚ ﺍﳌﻬﺪﻡ ﻗﻴﻤﺔ‬. ~ ‫ ﳛﻤﻞ ﺍﳌﻬﺪﻡ ﺃﻳﻀﹰﺎ ﻧﻔﺲ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ﻟﻜﻦ ﺗﺴﺒﻘﻪ ﺍﻟﻌﻼﻣﺔ‬. ‫ﻟﻠﻜﺎﺋﻦ‬
.‫ﺇﻋﺎﺩﺓ‬
‫ ﺍﳌﺜﺎﻝ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻮﺿﺢ ﺇﺻﺪﺍﺭ ﺟﺪﻳـﺪ‬. ‫ﻟﻨﺮﻯ ﻛﻴﻔﻴﺔ ﻋﻤﻞ ﺩﻭﺍﻝ ﺍﳌﺸﻴﺪﺍﺕ ﻭﺍﳌﻬﺪﻣﺎﺕ‬
stack ‫ﻣﻦ ﺍﻟﻔﺌﺔ‬

//Program 7-2:
// using a constructor and destructor.
#include<iostream.h>
const int SIZE=100;
//This creates the class stack.
class stack {
int stck[SIZE];
int tos;
public:
stack( ); // constructor
~stack( ); //destructor
void push(int i);
int pop( );
};
// stack’s constructor function
stack::stack( )
{
tos=0;
cout<<”stack Initialized\n”;
}
// stack’s destructor function
stack::~stack( )

133
{
cout << “stack Destroyed\n”;
//Continued
}
void stack :: push(int i)
{
if(tos == SIZE) {
cout << “stack is full.\n”;
return;
}
stack[tos] = i;
tos++;
}
int stack::pop( )
{
if(tos== 0) {
cout<<”stack underflow.\n”;
return 0;
}
tos--;
return stck[tos];
}
int main( )
{
stack a, b; // create two stack objects
a.push(1);
b.push(2);
a.push(3);
b.push(4);
cout <<a.pop( )<<" ";
cout <<a.pop( )<<" ";
cout <<b.pop( )<<" ";
cout <<b.pop( )<<"\n ";
return 0;

134
}

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

Stack Initialized
Stack Initialized
3 1 4 2
Stack Destroyed
Stack Destroyed

-:Parameterized constructor ‫ﻭﺳﺎﺋﻂ ﺍﳌﺸﻴﺪﺍﺕ‬


‫ ﺗﺴـﻤﻰ‬stack ‫ﺍﳌﺸﻴﺪﺍﺕ ﺍﻟﱵ ﻻ ﺗﺄﺧﺬ ﻭﺳﻴﻄﺎﺕ ﻛﺎﳌﺸﻴﺪ ﺍﳌﺴـﺘﺨﺪﻡ ﰲ ﺍﻟﻔﺌـﺔ‬
‫ﺎ ﺇﱃ‬ ‫ﻣﺸﻴﺪﺍﺕ ﺍﺷﺘﻘﺎﻕ ﻭﻟﻜﻦ ﻣﻦ ﺍﳌﻤﻜﻦ ﲤﺮﻳﺮ ﻭﺳﺎﺋﻂ ﺇﱃ ﺍﳌﺸﻴﺪﺍﺕ ﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﱵ ﲤﺮﺭ‬
.‫ﺍﻟﺪﻭﺍﻝ ﺍﻷﺧﺮﻯ‬
.‫ﺍﳌﺜﺎﻝ ﺍﻟﱪﻧﺎﻣﺞ ﳛﺘﻮﻯ ﻋﻠﻰ ﻣﺸﻴﺪ ﻣﻊ ﻭﺳﻴﻄﺎﺕ‬

//Program 7-3:
#include <iostream.h>
class myclass {
int a, b;
public:
myclass(int i,int j) {a=i; b=j;}
void show ( ) {cout <<a<<" " <<b;}
};
int main( )
{
myclass ob(3, 5);
ob.show( );
return 0;
}

135
‫ﻻﺣﻆ ﰲ ﺗﻌﺮﻳﻒ ﺍﳌﺸﻴﺪ ) ( ‪ myclass‬ﰎ ﲤﺮﻳﺮ ﻭﺳﻴﻄﺘﲔ ﳘﺎ ‪ i‬ﻭ ‪ j‬ﻭﺍﺳـﺘﻌﻤﻠﺖ‬
‫ﻫﺎﺗﲔ ﺍﻟﻮﺳﻴﻄﺘﲔ ﻟﺘﻤﻬﻴﺪ ﺍﻟﻘﻴﻢ ‪ a‬ﻭ ‪. b‬‬
‫ﻳﻮﺿﺢ ﺍﳌﺜﺎﻝ ﻛﻴﻔﻴﺔ ﲤﺮﻳﺮ ﺍﻟﻮﺳﺎﺋﻂ ﻋﻨﺪ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻦ ﻓﺎﻟﻌﺒﺎﺭﺓ ‪-:‬‬
‫;)‪myclass ob(3,4‬‬
‫ﺗﺘﺴﺒﺐ ﰲ ﺇﻧﺸﺎﺀ ﻛﺎﺋﻦ ﻳﺪﻋﻰ ‪ ob‬ﻭﺗﻘﻮﻡ ﺑﺘﻤﺮﻳﺮ ﺍﻟﻘﻴﻢ ‪ 3‬ﻭ ‪ 4‬ﻛﻮﺳﺎﺋﻂ‪ .‬ﳝﻜﻨﻨﺎ ﺃﻳﻀﹰﺎ‬
‫ﲤﺮﻳﺮ ﻗﻴﻢ ﺍﻟﻮﺳﺎﺋﻂ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫;)‪myclass ob= myclass (3,4‬‬
‫ﻭﻟﻜﻦ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻷﻭﱃ ﻫﻲ ﺍﻷﻛﺜﺮ ﺍﺳﺘﺨﺪﺍﻣﹰﺎ ‪.‬‬

‫‪Constructor with one‬‬ ‫ـﻴﻄﺎﺕ ‪-:‬‬


‫ـﺎﺩﻯ ﺍﻟﻮﺳـ‬
‫ـﻴﺪ ﺃﺣـ‬
‫ﺍﳌﺸـ‬
‫‪parameter‬‬
‫ﰲ ﺍﳌﺸﻴﺪ ﺃﺣﺎﺩﻯ ﺍﻟﻮﺳﻴﻄﺎﺕ ﻫﻨﺎﻟﻚ ﻃﺮﻳﻘﺔ ﺛﺎﻟﺜﺔ ﻟﺘﻤﺮﻳﺮ ﺍﻟﻮﺳﻴﻄﺔ ﺇﻟﻴﻪ‪ .‬ﺍﳌﺜـﺎﻝ ﺍﻟﺘـﺎﱄ‬
‫ﻳﻮﺿﺢ ﻛﻴﻒ ﻳﻜﻮﻥ ﻫﺬﺍ‪:‬‬

‫‪//Program 7-4:‬‬
‫>‪#include<iostream.h‬‬
‫{ ‪class X‬‬
‫;‪int a‬‬
‫‪public:‬‬
‫};‪X(int j) {a= j‬‬
‫} ;‪Int geta( ) {return a‬‬
‫;}‬
‫) (‪int main‬‬
‫{‬
‫‪X ob = 99; //passes 99 to j‬‬
‫‪cout<<ob.geta( ); // outputs 99‬‬
‫;‪return 0‬‬
‫}‬

‫ﻫﻨﺎ ﺍﳌﺸﻴﺪ ‪ x‬ﻳﺄﺧﺬ ﻭﺳﻴﻄﺔ ﻭﺍﺣﺪﺓ ‪ .‬ﻻﺣﻆ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﱵ ﰎ ‪‬ﺎ ﺗﻌﺮﻳﻒ ﺍﻟﻜـﺎﺋﻦ ‪ob‬‬
‫ﺩﺍﺧﻞ ﺍﻟﺪﺍﻟﺔ ) (‪ . main‬ﰎ ﲤﻬﻴﺪ ﻗﻴﻤﺔ ﻭﺳﻴﻄﺔ ﺍﳌﺸﻴﺪ ‪ x‬ﻋﻨﺪ ‪ 99‬ﻭﺫﻟﻚ ﺑﻜﺘﺎﺑﺔ ‪-:‬‬
‫‪x ob= 99‬‬

‫‪136‬‬
‫ﻭﻋﻤﻮﻣﹰﺎ ﺇﺫﺍ ﻛﻨﺎ ﻧﺘﻌﺎﻣﻞ ﻣﻊ ﻣﺸﻴﺪ ﺫﻭ ﻭﺳﻴﻄﺔ ﻭﺍﺣﺪﺓ ﳝﻜﻨﻨﺎ ﲤﺮﻳﺮ ﺍﻟﻮﺳﻴﻄﺔ ﺇﻣﺎ ﺑﻜﺘﺎﺑﺔ‬
‫‪ ob=i.‬ﺃﻭ )‪ob(i‬‬
‫ﻳﻠﻌﺐ ﺍﳌﺸﻴﺪ ﺃﺣﺎﺩﻯ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺩﻭﺭﹰﺍ ﳑﻴﺰﹰﺍ ﰲ ﺍﻟﱪﳎﺔ ﻛﺎﺋﻨﻴﺔ ﺍﳌﻨﺤﻰ ﺣﻴـﺚ ﳝﻜـﻦ‬
‫ﺍﺳﺘﻌﻤﺎﻟﻪ ﻟﺘﺤﻮﻳﻞ ﻛﺎﺋﻦ ﻣﻨﺤﻰ ﻣﻦ ﻓﺌﺔ ﺇﱃ ﻓﺌﺔ ﺃﺧﺮﻯ ﻭﺫﻟﻚ ﺑﺘﻤﺮﻳﺮ ﺍﻟﻜﺎﺋﻦ ﻛﻮﺳﻴﻄﺔ ﻟﻠﻤﺸـﻴﺪ‬
‫ﻳﻄﻠﻖ ﻋﻠﻰ ﻫﺬﻩ ﻣﺸﻴﺪﺍﺕ ﺩﺍﻟﺔ ﲢﻮﻳﻞ‪.‬‬
‫ﻣﱴ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺍﳌﺸﻴﺪﺍﺕ ﻭﺍﳌﻬﺪﻣﺎﺕ ‪-:‬‬
‫ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﳌﺸﻴﺪﺍﺕ ﻛﻠﻤﺎ ﰎ ﺇﻧﺸﺎﺀ ﻛﺎﺋﻦ ‪ ،‬ﻭﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﳌﻬﺪﻡ ﻟﻜﻞ ﻛﺎﺋﻦ ﻗﺒـﻞ‬
‫ﺗﺪﻣﲑﻩ ‪ ،‬ﻭﳌﻌﺮﻓﺔ ﻣﱴ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺍﳌﺸﻴﺪﺍﺕ ﻭﺍﳌﻬﺪﻣﺎﺕ ﺃﺩﺭﺱ ﺍﻟﱪﻧﺎﻣﺞ ‪:‬‬

‫‪//Program 7-5:‬‬
‫>‪#include<iostream.h‬‬
‫{ ‪class myclass‬‬
‫‪public:‬‬
‫;‪int who‬‬
‫;)‪myclass(int id‬‬
‫;) (‪~myclass‬‬
‫;)‪} glob_ob1(1), glob_ob2(2‬‬

‫)‪myclass::myclass(int id‬‬
‫{‬
‫;”‪cout<<”Initializing”<<id<<”\n‬‬
‫‪who = id‬‬
‫}‬
‫) (‪myclass::~myclass‬‬
‫‪//Continued‬‬
‫{‬
‫;”‪cout<<”Destructing”<<who<<”\n‬‬
‫}‬
‫) (‪int main‬‬
‫{‬
‫;)‪myclass local_ob1(3‬‬
‫;”‪cout <<"this will not be first line displayed.\n‬‬

‫‪137‬‬
‫;)‪myclass local_ob2(4‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪Initializing 1‬‬
‫‪Initializing 2‬‬
‫‪Initializing 3‬‬
‫‪This will not be first line displayed.‬‬
‫‪Initializing 4‬‬
‫‪Destructing4‬‬
‫‪Destructing3‬‬
‫‪Destructing2‬‬
‫‪Destructing1‬‬

‫ﻛﻤﺎ ﺭﺃﻳﻨﺎ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﳌﻌﺮﻓﺔ ﺩﺍﺧﻞ ﺍﻟﺪﺍﻟﺔ ) (‪ main‬ﻳـﺘﻢ ﺗﻨﻔﻴـﺬ‬
‫ﻣﺸﻴﺪﺍ‪‬ﺎ ﺑﺘﺮﺗﻴﺐ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺑﻴﻨﻤﺎ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻣﻬﺪﻣﺎ‪‬ﺎ ﺑﻌﻜﺲ ﺗﺮﺗﻴﺐ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻭﻋﻠﻴﻪ‬
‫ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻣﺸﻴﺪ ﺍﻟﻜﺎﺋﻦ ‪ local ob 1‬ﻳﻠﻴﻪ ﺍﻟﻜﺎﺋﻦ ‪ local ob 2‬ﺑﻴﻨﻤﺎ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻣﻬـﺪﻡ‬
‫ﺍﻟﻜﺎﺋﻦ ‪ local ob 2‬ﻗﺒﻞ ﻣﻬﺪﻡ ﺍﻟﻜﺎﺋﻦ ‪. local ob 1‬‬
‫ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻣﺸﻴﺪﺍﺕ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﳌﻌﺮﻓﺔ ﺩﺍﺧﻞ ﺍﻟﻔﺌﺔ ﻗﺒﻞ ﺗﻨﻔﻴﺬ ﺍﻟﺪﺍﻟﺔ ) ( ‪ main‬ﻭﺃﻳﻀﹰﺎ ﻳﺘﻢ ﺗﻨﻔﻴﺬ‬
‫ﻣﻬﺪﻣﺎ‪‬ﺎ ﺑﺘﺮﺗﻴﺐ ﻣﻌﻜﻮﺱ ﻭﻟﻜﻦ ﺑﻌﺪ ‪‬ﺎﻳﺔ ﺗﻨﻔﻴﺬ ﺍﻟﺪﺍﻟﺔ ) (‪. main‬‬
‫ﻟﻨﱪﻫﻦ ﻋﻠﻰ ﻣﺪﻯ ﺗﻨﻮﻉ ﺍﺳﺘﻌﻤﺎﻻﺕ ﻓﺌﺎﺕ ﻟﻐﺔ ‪ C++‬ﺳﻨﻘﻮﻡ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﺑﺘﻌﺮﻳﻒ ﻓﺌـﺔ‬
‫ﻟﺸﻲﺀ ﳐﺘﻠﻒ ‪ :‬ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪ ﳝﺜﻞ ﺍﻟﻮﻗﺖ )‪ ، (Time‬ﻳﺘﺄﻟﻒ ﻫﺬﺍ ﺍﻟﻮﻗﺖ ﻣـﻦ ﺛـﻼﺙ‬
‫ﺑﻴﺎﻧﺎﺕ ﺍﻟﺴﺎﻋﺎﺕ‪ ،‬ﺍﻟﺪﻗﺎﺋﻖ ﻭﺍﻟﺜﻮﺍﱐ‪ ،‬ﻭﺳﻨﺴﻤﻰ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳉﺪﻳﺪ ﻫﺬﺍ ‪Time‬‬

‫‪//Program 7-6:‬‬
‫‪// Time class.‬‬

‫‪138‬‬
#include<iostream.h>
// Time abstract data type (ADT) definition
class Time {
public:
//Continued
Time( );
void setTime (int, int, int)
void printMilitery( );
void printStandard( );
private:
int hour;
int minute;
int second;
};
Time::Time ( ) { hour = minute = second = 0; }
void Time::setTime (int h, int m, int s)
{
hour = (h >= 0 && h < 24) ? h : 0;
minute = (m >= 0 && m < 60) ? m : 0;
second = (s >= 0 && s < 60) ? s : 0;
}
void Time::printMilitary( )
{
cout << (hour < 10 ? “0” : “ “ ) << hour << “:”
<< (minute < 10 ? “0” : “ “) << minute << “:”
<< (second < 10 ? “0” : “ “ )<< second;
}
void Time::printStandard( )
{
cout<< ((hour ==0 | | hour == 12 )? 12 : hour % 12)
<< “:” <<(minute < 10 ? “0” : “ “) << minute
<< “:” <<(second < 10 ? “0” : “ “ )<< second
<< (hour < 12 ? “ AM” : “PM”);
}

139
int main ( )
{
Time t;
cout<< “The initial military time is: “;
t.printMilitary( );
//Continued
cout<< endl <<“The initial standard time is: “;
t.printStandard( );
t.setTime(13, 27, 6) ;
cout<< endl << endl << “Military time after setTime is “;
t.printMilitary( );
cout<< endl << “Standard time after setTime is “;
t.printStandard( );
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

The initial military time is 00:00:00


The initial standard time is 12:00:00 AM

Military time after setTime is 13:27:06


Standard time after setTime is 1:27:06 PM

‫ ﻳﺘﻢ‬t ‫ ﻋﻨﺪﻣﺎ ﻳﺘﻢ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻦ‬.t ‫ ﻫﻮ‬Time ‫ﻳﻨﺸﺊ ﺍﻟﱪﻧﺎﻣﺞ ﻛﺎﺋﻨﹰﺎ ﻭﺍﺣﺪﹰﺍ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ‬
‫ ﻳﺘﻢ ﻃﺒﺎﻋـﺔ ﻗﻴﻤـﺔ‬. 0 ‫ ﻋﻨﺪ‬t ‫ ﻭﺍﻟﺬﻱ ﻳﻘﻮﻡ ﺑﺘﻤﻬﻴﺪ ﺑﻴﺎﻧﺎﺕ ﺍﻟﻜﺎﺋﻦ‬Time ‫ﺍﺳﺘﺪﻋﺎﺀ ﺍﳌﺸﻴﺪ‬
: ‫ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺗﻨﺴﻴﻘﲔ‬t ‫ﺍﻟﻜﺎﺋﻦ‬
.‫ﺳﺎﻋﺔ‬-24 ‫ ﻭﺍﻟﺬﻱ ﻳﺴﺘﻌﻤﻞ ﺍﻟﺘﻨﺴﻴﻖ‬:Standard •
.‫ﺳﺎﻋﺔ‬-12 ‫ ﻭﺍﻟﺬﻱ ﻳﺴﺘﻌﻤﻞ ﺍﻟﺘﻨﺴﻴﻖ‬:Military •

140
‫ﰒ ﻳﺴﺘﻌﻤﻞ ﺍﻟﺪﺍﻟﺔ ‪ setTime‬ﻭﻃﺒﺎﻋﺔ ﺍﻟﻜﺎﺋﻦ ‪ t‬ﻣﺮﺓ ﺃﺧﺮﻯ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻨﺴﻴﻘﲔ‪.‬‬

‫ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﺜﺎﺑﺘﺔ‬
‫‪7.3‬‬
‫‪Constant Objects‬‬

‫ﻟﻘﺪ ﺭﺃﻳﻨﺎ ﻛﻴﻒ ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻣﺘﻐﲑﺍﺕ ﺛﺎﺑﺘﺔ ﺫﺍﺕ ﺃﻧﻮﺍﻉ ﺃﺳﺎﺳﻴﺔ ‪ ،‬ﺣﻴﺚ ﰎ ﺍﺳﺘﻌﻤﺎﳍﺎ‬
‫ﻟﺘﻌﺮﻳﻒ ﺛﺎﺑﺖ ﻛﺤﺠﻢ ﻣﺼﻔﻮﻓﺔ ‪ ،‬ﳝﻜﻦ ﺟﻌﻞ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻔﺌﺔ ﻣﺎ ﺛﺎﺑﺘﹰﺎ ﺇﺫﺍ ﻛﻨﺎ ﻧﺮﻳﺪ ﺿﻤﺎﻥ ﻋﺪﻡ‬
‫ﺗﻐﲑ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺍﻟﻜﺎﺋﻦ ﻭﻛﻤﺜﺎﻝ ﻋﻠﻰ ﺫﻟﻚ ﰲ ﺍﻟﻔﺌﺔ ‪ Time‬ﻭﺍﻟﱵ ﺭﺃﻳﻨﺎﻫﺎ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ‪،‬‬
‫ﻟﻨﻔﺘﺮﺽ ﺃﻧﻨﺎ ﻧﺮﻳﺪ ﺇﻧﺸﺎﺀ ﻛﺎﺋﻦ ﻳﺪﻋﻰ ‪ (12, 0, 0) noon‬ﺳﻴﻜﻮﻥ ﻣﻦ ﺍﳉﻴﺪ ﺿﻤﺎﻥ ﻋـﺪﻡ‬
‫ﺗﻐﻴﲑ ﻗﻴﻤﺔ ﻫﺬﺍ ﺍﻟﻜﺎﺋﻦ ﻟﺘﺤﻘﻴﻖ ﻫﺬﺍ ﻧﻜﺘﺐ ﺍﻟﻌﺒﺎﺭﺓ‬
‫;)‪const Time noon( 12, 0, 0‬‬
‫ﻭﺍﻟﱵ ﺗﻌﻠﻦ ﻋﻦ ﻛﺎﺋﻦ ﺛﺎﺑﺖ ‪ noon‬ﰲ ﺍﻟﻔﺌﺔ ‪ Time‬ﻭﲤﻬﺪ ﻗﻴﻤﺘﻪ ﻋﻨﺪ ‪. 12‬‬
‫ﻻ ﺗﺴﻤﺢ ﻣﺼﺮﻓﺎﺕ ‪ C++‬ﺑﺎﺳﺘﺪﻋﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﺜﺎﺑﺘﺔ ﻣﻦ ﻗﺒﻞ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﻟﻀـﻤﺎﻥ‬
‫ﻋﺪﻡ ﺗﻌﺪﻳﻞ ﺑﻴﺎﻧﺎﺕ ﻫﺬﻩ ﺍﻟﻜﺎﺋﻨﺎﺕ ‪ ،‬ﻭﻟﻜﻦ ﻗﺪ ﻧﺮﻏﺐ ﰲ ﺑﻌﺾ ﺍﻷﺣﻴﺎﻥ ﰲ ﻋﺮﺽ ﻗﻴﻤﺔ ﻫـﺬﻩ‬
‫ﺍﻟﻜﺎﺋﻨﺎﺕ ﻭﺍﻟﱵ ﻻ ﺗﺆﺛﺮ ﺑﺄﻱ ﺣﺎﻝ ﻣﻦ ﺍﻷﺣﻮﺍﻝ ﻋﻠﻰ ﺑﻴﺎﻧﺎ‪‬ﺎ ‪ ،‬ﳊﻞ ﻫﺬﻩ ﺍﳌﺸﻜﻠﺔ ﳝﻜﻦ ﻟﻠﻤﱪﻣﺞ‬
‫ﺍﻹﻋﻼﻥ ﻋﻦ ﺩﺍﻻﺕ ﺛﺎﺑﺘﺔ )‪ (const‬ﻭﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻦ ﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ ﺗﻀﻤﻦ ﺃﻧﻪ ﻟﻦ ﻳـﺘﻢ ﺗﻐـﻴﲑ‬
‫ﺑﻴﺎﻧﺎﺕ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﺍﺳﺘﺪﻋﻲ ﻣﻦ ﺃﺟﻠﻬﺎ ‪ ،‬ﻭﳉﻌﻞ ﻋﻀﻮ ﺩﺍﱄ ﺛﺎﺑﺘﹰﺎ ﺗﺘﻢ ﻛﺘﺎﺑﺔ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳـﻴﺔ‬
‫‪ const‬ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﻭﺗﺼﺮﳛﻪ ﻣﺒﺎﺷﺮﺓ ﺑﻌﺪ ﺍﻷﻗﻮﺍﺱ ﺍﻟﱵ ﺗﻠﻲ ﺍﲰﻪ ‪.‬‬
‫ﺃﺩﻧﺎﻩ ﻳﺒﺪﻭ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ‪ printMilitary‬ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪-: Time‬‬
‫‪void Time::printMilitary( ) const‬‬
‫{‬
‫”‪cout<< (hour < 10 ? “0” : “ “ ) << hour << “:‬‬
‫”‪<< (minute < 10 ? “0” : “ “) << minute << “:‬‬
‫;‪<< (second < 10 ? “0” : “ “ )<< second‬‬
‫}‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻭﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺜﺎﺑﺘﺔ‪:‬‬

‫‪//Program 7-7:‬‬
‫{ ‪class Time‬‬
‫‪public:‬‬
‫;) (‪Time‬‬

‫‪141‬‬
void setTime ( int, int, int);
void printMilitary( ) const;
void printStandard( )const;
private:
int hour;
int minute;
int second;
};
void Time:: setTime (int h, int m, int s)
{
//Continued
hour = (h >=0 && h<24) ? h : 0;
minute = (m >= 0 && m<60 ) ? m : 0;
second = (s >= 0 && s<60) ? s : 0;
}
void Time::printMilitary( ) const
{
cout << (hour < 10 ? “0” : “ “ ) << hour << “:”
<< (minute < 10 ? “0” : “ “) << minute << “:”
<< (second < 10 ? “0” : “ “ )<< second;
}

void Time::printStandard( ) const


{
cout << ((hour ==0 | | hour == 12 )? 12 : hour % 12)
<< “:” <<(minute < 10 ? “0” : “ “) << minute
<< “:” <<(second < 10 ? “0” : “ “ )<< second
<< (hour < 12 ? “ AM” : “PM”);
}
int main ( )
{
const Time noon(12, 0, 0);
cout <<” noon = “ ;
noon.printStandard;

142
‫;‪Time t‬‬
‫;)‪t.setTime (13, 27, 6‬‬
‫;“ ‪cout<< endl << “military time after setTime is‬‬
‫;) ( ‪t.printMilitary‬‬
‫;‪cout<< endl‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪noon = 12:00:00 AM‬‬


‫‪military time after setTime is 13:27:06‬‬

‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﰎ ﺗﻌﺮﻳﻒ ﻛﺎﺋﻨﲔ ﰲ ﺍﻟﻔﺌﺔ ‪ Time‬ﺃﺣﺪﳘﺎ ﺛﺎﺑﺖ ﻫـﻮ ‪noon‬‬


‫ﻋﻠــﻰ ﻋﻜــﺲ ﺍﻵﺧــﺮ ﻭﻫــﻮ ‪ .t‬ﺍﻟﻌﻀــﻮﺍﻥ ﺍﻟــﺪﺍﻟﻴﺎﻥ ) (‪ printStandard‬ﻭ‬
‫) (‪ printMilitary‬ﺛﺎﺑﺘﺎﻥ ﻻ ﻳﻌﺪﻻﻥ ﻛﺎﺋﻨﻬﻤﺎ ﻟﻜﻦ ﺍﻟﻌﻀﻮ ﺍﻟـﺪﺍﱄ ‪ setTime‬ﻳﻌـﺪﻝ‬
‫ﻛﺎﺋﻨﻪ ﻟﺬﺍ ﱂ ﳚﻌﻞ ﺛﺎﺑﺘﹰﺎ‪ .‬ﳝﻜﻨﻨﺎ ﺍﺳﺘﺪﻋﺎﺀ ) (‪ setTime‬ﻟﻠﻜﺎﺋﻦ ‪ t‬ﻟﻜﻦ ﻟﻴﺲ ﻟﻠﻜﺎﺋﻦ ‪.noon‬‬

‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﺴﺎﻛﻨﺔ ﰲ ﺍﻟﻔﺌﺎﺕ‬


‫‪7.4‬‬
‫‪Static class member‬‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺴﺎﻛﻨﺔ ‪-:‬‬ ‫) ﺃ(‬


‫ﺍﺳﺘﻌﻤﻠﻨﺎ ﺣﱴ ﺍﻵﻥ ﺃﻋﻀﺎﺀ ﺑﻴﺎﻧﻴﺔ ﻣﺜﻴﻠﻴﺔ )‪ (instant‬ﺃﻱ ﺃﻥ ﻫﻨﺎﻟـﻚ ﻧﺴـﺨﺔ‬
‫ﻭﺍﺣﺪﺓ ﻣﻨﻬﺎ ﻟﻜﻞ ﻛﺎﺋﻦ ﻳﺘﻢ ﺇﻧﺸﺎﺅﻩ ﻭﻟﻜﻦ ﻗﺪ ﳓﺘﺎﺝ ﳌﺘﻐﲑ ﻳﻨﻄﺒﻖ ﻋﻠﻰ ﻛﻞ ﻛﺎﺋﻨـﺎﺕ ﺍﻟﻔﺌـﺔ ‪،‬‬
‫ﻟﺘﺤﻘﻴﻖ ﺫﻟﻚ ﻧﺴﺘﻌﻤﻞ ﻋﻀﻮﹰﺍ ﺑﻴﺎﻧﻴﹰﺎ ﺳﺎﻛﻨﹰﺎ ‪ static data member‬ﻓﻌﻨﺪﻣﺎ ﻧﻌﻠﻦ ﻋـﻦ‬
‫ﻣﺘﻐﲑ ﰲ ﺑﻴﺎﻧﺎﺕ ﻓﺌﺔ ﻣﺎ ﻋﻠﻰ ﺃﻧﻪ ﺳﺎﻛﻦ ‪ static‬ﻧﻌﲎ ﺑﺬﻟﻚ ﺃﻧﻪ ﺳﺘﻜﻮﻥ ﻫﻨﺎﻟﻚ ﻧﺴﺨﺔ ﻭﺍﺣﺪﺓ‬
‫ﻓﻘﻂ ﻣﻦ ﻫﺬﺍ ﺍﳌﺘﻐﲑ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻭﺳﺘﺘﺸﺎﺭﻙ ﻛﻞ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﺘﺎﺑﻌﺔ ﳍﺬﻩ ﺍﻟﻔﺌﺔ ﰲ ﻫﺬﺍ ﺍﳌﺘﻐﲑ ﺑﻐﺾ‬
‫ﺍﻟﻨﻈﺮ ﻋﻦ ﻋﺪﺩ ﻫﺬﻩ ﺍﻟﻜﺎﺋﻨﺎﺕ ‪ .‬ﻳﺘﻢ ﲤﻬﻴﺪ ﻛﻞ ﺍﳌﺘﻐﲑﺍﺕ ﺍﻟﺴﺎﻛﻨﺔ ﻋﻨﺪ ‪ 0‬ﻗﺒﻞ ﺇﻧﺸﺎﺀ ﺃﻱ ﻛﺎﺋﻦ ‪.‬‬

‫‪143‬‬
‫ ﻭﻳـﺘﻢ‬static ‫ﻳﺘﻢ ﺗﺼﺮﻳﺢ ﺍﳌﺘﻐﲑ ﺍﻟﺴﺎﻛﻦ ﺿﻤﻦ ﺍﻟﻔﺌﺔ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ‬
‫ ﻭﺫﻟﻚ ﻷﻧﻪ ﺇﺫﺍ ﺍﻓﺘﺮﺿﻨﺎ ﺃﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﻌﺮﻓﺔ ﺩﺍﺧﻞ ﺍﻟﻔﺌﺔ ﻫﻲ ﺑﻴﺎﻧـﺎﺕ ﻣﺜﻴﻠﻴـﺔ‬، ‫ﺗﻌﺮﻳﻔﻪ ﺧﺎﺭﺟﻬﺎ‬
‫ ﺇﺫﻥ ﻟﺘﻌﺮﻳﻒ ﻣﺘﻐﲑ ﻳﺘﻮﺍﺟﺪ ﻣﺮﺓ ﻟﻜﻞ ﺍﻟﻔﺌﺔ ﻋﻠﻴﻨﺎ ﺗﻌﺮﻳﻔـﻪ ﺧـﺎﺭﺝ ﺍﻟﻔﺌـﺔ‬، ‫ﻣﻜﺮﺭﺓ ﻟﻜﻞ ﻛﺎﺋﻦ‬
.‫ﻭﺗﺼﺮﳛﻪ ﺩﺍﺧﻠﻬﺎ ﻟﻴﻜﻮﻥ ﻣﻌﺮﻭﻓﹰﺎ ﻟﺒﻘﻴﺔ ﺃﻋﻀﺎﺋﻬﺎ‬
:‫ﻟﺘﻮﺿﻴﺢ ﺍﺳﺘﻌﻤﺎﻝ ﻭﺗﺄﺛﲑ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺴﺎﻛﻨﺔ ﺍﺩﺭﺱ ﺍﳌﺜﺎﻝ ﺍﻟﱪﻧﺎﻣﺞ‬

//Program 7-8:
#include<iostream.h>
class shared {
static int a;
int b;
//Continued
public:
void set(int i,int j) { a=i; b=j;}
void show( );
};
int shared :: a; // define a
void shared :: show( )
{
cout <<” This is static a: "<< a;
cout<<”\nThis is non_static b: " << b;
cout << "\n";
}
int main( )
{
shared x, y;
x.set(1, 1); //set a to 1
x.show( );
y.set(2, 2); //change a to 1
y.show( );
x.show( ); /* Here, a has been changed for both x and y
because a is shared by both objects.*/
return 0;

144
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪This is static a: 1‬‬


‫‪This is non_static b: 1‬‬
‫‪This is static a: 2‬‬
‫‪This is non_static b: 2‬‬
‫‪This is static a: 2‬‬
‫‪This is non_static b: 1‬‬

‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺴﺎﻛﻨﺔ ‪-:Static member functions‬‬ ‫)ﺏ(‬


‫ﳝﻜﻨﻨﺎ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺴﺎﻛﻨﺔ ﻣﻦ ﺃﻱ ﻋﻀﻮ ﺩﺍﱄ ﰲ ﺍﻟﻔﺌﺔ ﻭﻟﻜﻦ ﻣﻦ ﺍﻟﻄﺒﻴﻌـﻲ‬
‫ﺍﺳﺘﻌﻤﺎﻝ ﻧﻮﻉ ﺧﺎﺹ ﻣﻦ ﺍﻟﺪﺍﻻﺕ ﻳﻨﻄﺒﻖ ﻋﻠﻰ ﺍﻟﻔﺌﺔ ﺑﺄﻛﻤﻠﻬﺎ ﻭﻟﻴﺲ ﻋﻠﻰ ﻛﺎﺋﻦ ﻣﺎ ﻭﻫﻮ ﺍﻟﺪﺍﻻﺕ‬
‫ﺍﻟﺴﺎﻛﻨﺔ ‪ .‬ﻳﺘﻢ ﺗﻌﺮﻳﻒ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﺍﻟﺴﺎﻛﻦ ﺑﻮﺍﺳﻄﺔ ﺍﻟﻜﻠﻤـﺔ ﺍﻷﺳﺎﺳـﻴﺔ ‪ static‬ﻟﻜـﻦ‬
‫ﺍﺳﺘﺪﻋﺎﺀﺍﺕ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺗﺘﻢ ﻣﻦ ﺩﻭﻥ ﺍﺳﺘﻌﻤﺎﻝ ﻛﺎﺋﻦ ﻣﻌﲔ ﺑﻞ ﻳﺸﺎﺭ ﺇﱃ ﺍﻟﺪﺍﻟﺔ ﻣﻦ ﺧﻼﻝ ﺭﺑـﻂ‬
‫ﺍﲰﻬﺎ ﺑﺎﺳﻢ ﺍﻟﻔﺌﺔ ﺑﻮﺍﺳﻄﺔ ﻋﺎﻣﻞ ﺩﻗﺔ ﺍﳌﺪﻯ‪ . ::‬ﻻ ﻳﺴﺘﻄﻴﻊ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﺍﻟﺴﺎﻛﻦ ﺍﻹﺷـﺎﺭﺓ ﺇﱃ‬
‫ﺃﻱ ﻋﻀﻮ ﺩﺍﱄ ﻏﲑ ﺳﺎﻛﻦ ﻷﻥ ﺍﻟﺪﺍﻻﺕ ﻻ ﺗﻌﺮﻑ ﺃﻱ ﺷﺊ ﻋﻦ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ﻭﻛﻞ ﻣﺎ ﺗﺴﺘﻄﻴﻊ‬
‫ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻪ ﻫﻮ ﺑﻴﺎﻧﺎﺕ ﺳﺎﻛﻨﺔ ﺗﺮﺗﺒﻂ ﺑﺎﻟﻔﺌﺔ ﻛﻜﻞ ‪ ،‬ﻟﺬﺍ ﳝﻜﻨﻨﺎ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺴﺎﻛﻨﺔ ﺣـﱴ‬
‫ﻗﺒﻞ ﺇﻧﺸﺎﺀ ﺃﻱ ﻛﺎﺋﻦ ‪ .‬ﻭﻟﻜﻦ ﻋﻨﺪ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺴﺎﻛﻨﺔ ﳚﺐ ﻭﺿـﻊ ﺍﻟﻘﻴـﻮﺩ ﺍﻟﺘﺎﻟﻴـﺔ ﰲ‬
‫ﺍﻻﻋﺘﺒﺎﺭ‪-:‬‬
‫‪ /1‬ﻻ ﲤﺘﻠﻚ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺴﺎﻛﻨﺔ ﺍﳌﺆﺷﺮ ‪. this‬‬
‫‪/2‬ﻻ ﳝﻜﻦ ﺃﻥ ﻳﻜﻮﻥ ﻫﻨﺎﻟﻚ ﺇﺻﺪﺍﺭﻳﻦ ﻣﻦ ﻧﻔﺲ ﺍﻟﺪﺍﻟﺔ ﺃﺣﺪﳘﺎ ﺳﺎﻛﻦ ﻭﺍﻵﺧﺮ ﻏﲑ ﺳﺎﻛﻦ ‪.‬‬
‫‪ /3‬ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﺍﻟﺴﺎﻛﻦ ﻛﻤﺎ ﺳﻨﺮﻯ ﻓﻴﻤﺎ ﺑﻌﺪ ﻻ ﳝﻜﻦ ﺃﻥ ﻳﻜﻮﻥ ﺍﻓﺘﺮﺍﺿﻴﺎ ‪.virtual‬‬
‫‪ /4‬ﻻ ﳝﻜﻦ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺴﺎﻛﻨﺔ ﻋﻠﻰ ﺃ‪‬ﺎ ‪.const‬‬
‫ﻓﻔﻲ ﺍﻟﱪﻧﺎﻣﺞ ﰎ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ‪ get-resource‬ﻋﻠﻰ ﺃ‪‬ﺎ ﺳﺎﻛﻨﺔ‪ .‬ﳝﻜﻦ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟـﺔ‬
‫‪ get-resource‬ﺑﺬﻛﺮ ﺍﲰﻬﺎ ﻓﻘﻂ ﺩﻭﻥ ﺃﻱ ﻛﺎﺋﻦ‪.‬‬

‫‪145‬‬
//Program 7-9:
#include<iostream>
class cl {
static int resource;
public:
static int get_resource( );
void free_resource( ) {resource = 0;}
};
int cl :: resource; //define resource
int cl:: get_resource( )
{
if(resource) return 0 ; // resource alreay in use
else {
resource = 1;
return 1; //resource allocated to this object
//Continued
}
}
int main( )
{
cl ob1, ob2;
/* get_resource( ) is static so may be called independent
of any object.*/
if( c1 :: get_resource( )) cout << "ob1 has resource\n ";
if( ! c1 :: get_resource( )) cout << "ob2 denied resource\n
";
ob1.free_resource( );
if(ob2.get_resource( )) // can still call using object
syntax
cout<<" ob2 can now use resource\n ";
return 0;
}

146
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﺍﳌﺸﻴﺪ ﻫﻮ ﻋﻀﻮ ﺩﺍﱄ ﺧﺎﺹ ﳛﻤﻞ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ﻳﺴﺘﻌﻤﻞ ﻟﺘﻤﻬﻴﺪ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻋﻨﺪ ﻗﻴﻢ ﻣﻌﻴﻨﺔ‬
‫ﻋﻨﺪ ﺇﻧﺸﺎﺅﻫﺎ ‪.‬‬
‫ﻻ ﳛﻤﻞ ﺍﳌﺸﻴﺪ ﺃﻱ ﻗﻴﻤﺔ ﺇﻋﺎﺩﺓ‪.‬‬ ‫♦‬
‫ﺍﳌﻬﺪﻡ ﻫﻮ ﻋﻀﻮ ﺩﺍﱄ ﻳﻌﻤﻞ ﻋﻠﻰ ﺇﻟﻘﺎﺀ ﲣﺼﻴﺺ ﺍﻟﺬﺍﻛﺮﺓ ﺍﻟﱵ ﺧﺼﺼﻬﺎ ﺍﳌﺸﻴﺪ ﻟﻠﻜﺎﺋﻦ‪.‬‬ ‫♦‬
‫ﳛﻤﻞ ﺍﳌﻬﺪﻡ ﻧﻔﺲ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ﻟﻜﻦ ﺗﺴﺒﻘﻪ ﺍﻟﻌﻼﻣﺔ ~ ‪.‬‬ ‫♦‬
‫ﻻ ﳛﻤﻞ ﺍﳌﻬﺪﻡ ﺃﻱ ﻗﻴﻤﺔ ﺇﻋﺎﺩﺓ‪.‬‬ ‫♦‬
‫♦ ﻣﻦ ﺍﳌﻤﻜﻦ ﲤﺮﻳﺮ ﻭﺳﺎﺋﻂ ﺇﱃ ﺍﳌﺸﻴﺪﺍﺕ ﻭﻳﺘﻢ ﺫﻟﻚ ﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﱵ ﲤﺮﺭ ‪‬ﺎ ﺇﱃ‬
‫ﺍﻟﺪﻭﺍﻝ ﺍﻷﺧﺮﻯ‪.‬‬
‫♦ ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﳌﺸﻴﺪﺍﺕ ﻛﻠﻤﺎ ﰎ ﺇﻧﺸﺎﺀ ﻛﺎﺋﻦ‪ ،‬ﻭﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﳌﻬﺪﻡ ﻟﻜﻞ ﻛﺎﺋﻦ ﻗﺒﻞ‬
‫ﺗﺪﻣﲑﻩ‪.‬‬
‫♦ ﺍﻟﻌﻀﻮ ﺍﻟﺒﻴﺎﱐ ﺍﻟﺴﺎﻛﻦ ﻫﻮ ﻣﺘﻐﲑ ﻳﻜﻮﻥ ﻣﻨﻄﺒﻘﹰﺎ ﻟﻜﻞ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ‪.‬‬
‫♦ ﰎ ﲤﻬﻴﺪ ﺍﳌﺘﻐﲑﺍﺕ ﺍﻟﺴﺎﻛﻨﺔ ﻋﻨﺪ ‪.0‬‬
‫♦ ﻳﺘﻢ ﺗﺼﺮﻳﺢ ﺍﳌﺘﻐﲑ ﺍﻟﺴﺎﻛﻦ ﺩﺍﺧﻞ ﺍﻟﻔﺌﺔ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ static‬ﻭﻳﺘﻢ‬
‫ﺗﻌﺮﻳﻔﻪ ﺧﺎﺭﺟﻬﺎ‪.‬‬
‫♦ ﳝﻜﻦ ﺃﻳﻀﹰﺎ ﺗﻌﺮﻳﻒ ﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ ﺳﺎﻛﻨﺔ‪.‬‬
‫♦ ﻳﺘﻢ ﺗﻌﺮﻳﻒ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﺍﻟﺴﺎﻛﻦ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪.static‬‬
‫♦ ﺍﺳﺘﺪﻋﺎﺀﺍﺕ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺴﺎﻛﻨﺔ ﺗﺘﻢ ﻣﻦ ﺩﻭﻥ ﺍﺳﺘﻌﻤﺎﻝ ﻛﺎﺋﻦ ﻣﻌﲔ‪.‬‬
‫♦ ﻳﺸﺎﺭ ﻟﻠﺪﺍﻟﺔ ﻣﻦ ﺧﻼﻝ ﺭﺑﻂ ﺍﲰﻬﺎ ﺑﺎﺳﻢ ﺍﻟﻔﺌﺔ ﻣﻦ ﻋﱪ ﻋﺎﻣﻞ ﺩﻗﺔ ﺍﳌﺪﻯ ‪. ::‬‬
‫♦ ﻻ ﻳﺴﺘﻄﻴﻊ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﺍﻟﺴﺎﻛﻦ ﺍﻹﺷﺎﺭﺓ ﺇﱃ ﺃﻱ ﻋﻀﻮ ﺩﺍﱄ ﻏﲑ ﺳﺎﻛﻦ‪.‬ﳝﻜﻦ ﺟﻌﻞ‬
‫ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻔﺌﺔ ﻣﺎ ﺛﺎﺑﺘﹰﺎ ﺇﺫﺍ ﻛﻨﺎ ﻧﺮﻳﺪ ﺿﻤﺎﻥ ﻋﺪﻡ ﺗﻐﲑ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺒﻴﺎﻧﻴﺔ ﻟﻠﻜﺎﺋﻦ‪.‬‬
‫♦ ﻟﻺﻋﻼﻥ ﻋﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﺜﺎﺑﺘﺔ ﻧﺴﺘﺨﺪﻡ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪.const‬‬
‫♦ ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ ﺳﺎﻛﻨﺔ ﻻ ﺗﻐﲑ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﺃﺳﺘﺪﻋﻲ ﻣﻦ ﺃﺟﻠﻬﺎ‪.‬‬
‫♦ ﳉﻌﻞ ﻋﻀﻮ ﺩﺍﱄ ﺛﺎﺑﺘﹰﺎ ﺗﺘﻢ ﻛﺘﺎﺑﺔ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ const‬ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ‬
‫ﻭﺗﺼﺮﳛﻪ ﻣﺒﺎﺷﺮﺓ ﺑﻌﺪ ﺍﻷﻗﻮﺍﺱ ﺍﻟﱵ ﻧﻠﻲ ﺍﲰﻪ‪.‬‬

‫‪147‬‬
‫ﺍﻷﺳﺌﻠﺔ‬

‫‪ /‬ﻣﺎ ﻫﻮ ﺍﳋﻄﺄ ﰲ ﺍﳉﺰﺀ ﺍﻟﺘﺎﱄ ﻣﻦ ﺑﺮﻧﺎﻣﺞ ﺍﻓﺘﺮﺽ ﺍﻟﺘﺼﺮﻳﺢ ﺍﻵﰐ ﰲ ﻓﺌﺔ ﺗﺪﻋﻰ ‪:Time‬‬
‫; )‪void ~Time (int‬‬
‫‪ /7‬ﻧﺎﻗﺶ ﻣﻔﻬﻮﻡ ﺍﻟﺼﺪﺍﻗﺔ ‪ Friend ship‬ﰲ ‪ C++‬ﻣﻊ ﺑﻴﺎﻥ ﺍﻷﻭﺟﻪ ﺍﻟﺴﺎﻟﺒﺔ ﻓﻴﻬﺎ‪.‬‬
‫‪ /8‬ﻫﻞ ﳝﻜﻦ ﺃﻥ ﳛﺘﻮﻯ ﺗﻌﺮﻳﻔﹰﺎ ﺻﺤﻴﺤﹰﺎ ﻟﻔﺌﺔ ﺗﺪﻋﻰ ‪ Time‬ﻋﻠﻰ ﻛﻼ ﺍﳌﺸﻴﺪﻳﻦ ﺃﺩﻧﺎﻩ‪-:‬‬
‫;)‪Time ( int h = 0, int m = 0, int s = 0‬‬
‫;) (‪Time‬‬
‫‪ /9‬ﺃﻭﺟﺪ ﺍﳋﻄﺄ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﻔﺌﺔ ﺍﻟﺘﺎﱄ‪:‬‬
‫{ ‪class Example‬‬
‫‪public:‬‬
‫} ; ‪example ( int y = 10) { data = y‬‬
‫{ ‪int get Incrementdata ( ) const‬‬
‫} ;‪return ++ data‬‬
‫) ( ‪static get count‬‬
‫{‬
‫;‪cout << “ data is “ << data << endl‬‬
‫;‪return count‬‬
‫}‬
‫‪private:‬‬
‫;‪int data‬‬
‫;‪static int count‬‬
‫;}‬
‫‪ /10‬ﻣﺎﺫﺍ ﳛﺪﺙ ﺇﺫﺍ ﰎ ﲢﺪﻳﺪ ﻗﻴﻤﺔ ﺇﻋﺎﺩﺓ ﻟﻜﻞ ﻣﻦ ﺍﳌﺸﻴﺪﺍﺕ ﻭﺍﳌﻬﺪﻣﺎﺕ ﺣﱴ ﻭﻟﻮ ﻛﺎﻧﺖ‬
‫‪.void‬‬

‫‪148‬‬
‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﺜﺎﻣﻨﺔ‬
‫‪8.0‬‬
‫)‪Classes(III) - (III‬‬ ‫ﺍﻟﻔﺌﺎﺕ‬

‫ﺍﻷﻫﺪﺍﻑ‪:‬‬
‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪:‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺍﻟﻐﺮﺽ ﻣﻦ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺼﺪﻳﻘﺔ‪.‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺍﻟﻔﺌﺎﺕ ﺍﻟﺼﺪﻳﻘﺔ‪.‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﺇﻋﺎﺩﺓ ﺗﻌﺮﻳﻒ ﺍﻟﻌﻮﺍﻣﻞ ﻟﺘﻌﻤﻞ ﻣﻊ ﺍﻷﻧﻮﺍﻉ ﺍﳉﺪﻳﺪﺓ‪.‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺍﻟﻘﻴﻮﺩ ﺍﻟﱵ ﺗﻮﺍﺟﻪ ﲢﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‪.‬‬

‫‪149‬‬
‫ﺍﻟﺪﻭﺍﻝ ﺍﻟﺼﺪﻳﻘﺔ‬
‫‪8.1‬‬
‫‪Friend Functions‬‬

‫ﳝﻜﻦ ﻟﺪﺍﻟﺔ ﻟﻴﺴﺖ ﻋﻀﻮﹰﺍ ﰲ ﻓﺌﺔ ﻣﺎ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﳋﺎﺻﺔ ﺑﺘﻠﻚ ﺍﻟﻔﺌﺔ ﻭﺫﻟـﻚ‬
‫ﲜﻌﻞ ﺍﻟﺪﺍﻟﺔ ﺻﺪﻳﻘﺔ ‪ friend‬ﻟﺪﻭﺍﻝ ﺗﻠﻚ ﺍﻟﻔﺌﺔ ‪.‬ﻋﺎﺩﺓ ﺗﻔﺘﺮﺽ ﺃﻋﻤﺎﻝ ﺍﻟﺘﻐﻠﻴﻒ ﻭﺇﺧﻔﺎﺀ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫ﻗﺎﻋﺪﺓ ﺃﻧﻪ ﳚﺐ ﺃﻥ ﻻ ﺗﻜﻮﻥ ﺍﻟﺪﺍﻻﺕ ﺍﻟﱵ ﻟﻴﺴﺖ ﻋﻀﻮﺍﹰ ﰲ ﺍﻟﻔﺌﺔ ﻗﺎﺩﺭﺓ ﻋﻠﻰ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺑﻴﺎﻧﺎﺕ‬
‫ﺍﻟﻜﺎﺋﻦ ﺍﳋﺎﺻﺔ ﻭﺍﶈﻤﻴﺔ ‪ ،‬ﻟﻜﻦ ﻫﻨﺎﻟﻚ ﺣﺎﻻﺕ ﻳﺆﺩﻯ ﻓﻴﻬﺎ ﻫﺬﺍ ﺇﱃ ﺑﻌـﺾ ﺍﻟﺼـﻌﻮﺑﺎﺕ ﻟـﺬﺍ‬
‫ﻓﺎﻟﺪﺍﻻﺕ ﺍﻟﺼﺪﻳﻘﺔ ﻫﻲ ﻭﺳﻴﻠﺔ ﻟﻼﻟﺘﻔﺎﻑ ﺣﻮﻝ ﻫﺬﻩ ﺍﻟﻘﺎﻋﺪﺓ ‪.‬ﳉﻌﻞ ﺩﺍﻟﺔ ﻣﺎ ﺻـﺪﻳﻘﺔ ﻧﻜﺘـﺐ‬
‫ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ ﺩﺍﺧﻞ ﺍﻟﻔﺌﺔ ﻣﺴﺒﻮﻗﹰﺎ ﺑﺎﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ . friend‬ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱃ ﻳﺒﲔ ﻛﻴﻒ ﻳﻜـﻮﻥ‬
‫ﻫﺬﺍ‪:‬‬
‫‪//Program 8-1:‬‬

‫>‪#include<iostream.h‬‬
‫{ ‪class myclass‬‬
‫;‪int a, b‬‬
‫‪public:‬‬
‫;)‪friend int sum(myclass x‬‬
‫;)‪void set_ab(int i,int j‬‬
‫;}‬
‫)‪void myclass :: set_ab(int i, int j‬‬
‫{‬
‫;‪a = i‬‬
‫;‪b =j‬‬
‫}‬
‫‪// Note: sum( ) is not a member function of any class.‬‬
‫)‪int sum(myclass x‬‬
‫{‬
‫‪/* Because sum( ) is a friend of myclass, it can directly‬‬
‫‪access a and b. */‬‬
‫;‪return x.a + x.b‬‬
‫}‬
‫) (‪int main‬‬
‫{‬
‫;‪myclass n‬‬
‫;)‪n.set_ab(3, 4‬‬
‫;)‪cout<<sum(n‬‬
‫;‪return 0‬‬
‫}‬

‫‪150‬‬
‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪7‬‬

‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﺍﻟﺪﺍﻟﺔ ) (‪ sum‬ﻫﻲ ﻟﻴﺴﺖ ﻋﻀﻮﹰﺍ ﰲ ﺍﻟﻔﺌﺔ ‪myclass‬‬


‫ﻭﻟﻜﻦ ﺑﺎﻟﺮﻏﻢ ﻣﻦ ﺫﻟﻚ ﳝﻜﻨﻬﺎ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﳋﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ‪. my class‬‬

‫ﻭﻣﻦ ﺍﳉﺪﻳﺮ ﺑﺎﻟﺬﻛﺮ ﺃﻧﻪ ﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺼﺪﻳﻘﺔ ﺗﺰﻳﺪ ﻣﻦ ﻣﺮﻭﻧﺔ ﺍﻟﻠﻐـﺔ ‪C++‬‬
‫ﺇﻻ ﺃﻥ ﺫﻟﻚ ﻻ ﻳﺘﻤﺎﺷﻰ ﻣﻊ ﻓﻠﺴﻔﺔ ﻭﺟﻮﺏ ﺍﻟﺴﻤﺎﺡ ﻟﻸﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺘﺎﺑﻌﺔ ﻟﻠﻔﺌﺔ ﻓﻘﻂ ﺍﻟﻮﺻﻮﻝ‬
‫ﺇﱃ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳋﺎﺻﺔ ﺑﺎﻟﻔﺌﺔ ‪،‬ﻭﻣﻦ ﻫﻨﺎ ﻳﱪﺯ ﺍﻟﺴﺆﺍﻝ ﻣﺎ ﻫﻮ ﻣﺪﻯ ﺍﳋﻄﻮﺭﺓ ﺍﻟﱵ ﺗﺘﻌﺮﺽ ﳍﺎ ﺳﻼﻣﺔ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻨﺪ ﺍﺳﺘﻌﻤﺎﻝ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ؟‬
‫ﳚﺐ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ ﻋﻠﻰ ﺃ‪‬ﺎ ﺻﺪﻳﻘﺔ ﻣﻦ ﺩﺍﺧﻞ ﺍﻟﻔﺌﺔ ﺍﻟﱵ ﺳﺘﺼﻞ ﺇﻟﻴﻬﺎ ﺑﻴﺎﻧﺎ‪‬ـﺎ ‪،‬ﻟـﺬﺍ‬
‫ﻓﺎﳌﱪﻣﺞ ﺍﻟﺬﻱ ﻻ ﻳﺴﺘﻄﻴﻊ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﺸﻴﻔﺮﺓ ﺍﳌﺼﺪﺭ ﻟﻠﻔﺌﺔ ﻻ ﻳﺴﺘﻄﻴﻊ ﺟﻌﻞ ﺍﻟﺪﺍﻟﺔ ﺻـﺪﻳﻘﺔ‬
‫‪،‬ﻭﻋﻠﻴﻪ ﺳﺘﺒﻘﻰ ﺳﻼﻣﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﳏﺎﻓﻆ ﻋﻠﻴﻬﺎ ﻭﻋﻠﻴﻪ ﺍﻟﺪﺍﻻﺕ ﺍﻟﺼﺪﻳﻘﺔ ﻻ ﺗﺸﻜﻞ ‪‬ﺪﻳﺪﹰﺍ ﺧﻄـﲑﹰﺍ‬
‫ﻋﻠﻰ ﺳﻼﻣﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪.‬‬

‫ﺍﺳﺘﻌﻤﻞ ﺩﺍﺋﻤﹰﺎ ﻋﻀﻮﹰﺍ ﺩﺍﻟﻴﹰﺎ ﻭﻟﻴﺲ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ ﺇﻻ ﺇﺫﺍ ﻛﺎﻥ ﻫﻨﺎﻟﻚ ﺳﺒﺐ ﻗﻮﻯ ﻳﺪﻓﻊ ﺇﱃ‬
‫ﺍﺳﺘﻌﻤﺎﻝ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ ﻛﻤﺎ ﺳﻨﺮﻯ ﻻﺣﻘﹰﺎ‪.‬‬

‫ﺍﻟﻔﺌﺎﺕ ﺍﻟﺼﺪﻳﻘﺔ‬
‫‪8.2‬‬
‫‪Friend Classes‬‬

‫ﺍﻟﻔﺌﺎﺕ ﻛﻤﺎ ﺍﻟﺪﺍﻻﺕ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺻﺪﻳﻘﺔ ﻭﺍﻟﺴﺒﺐ ﰲ ﺍﺳﺘﻌﻤﺎﻝ ﺩﺍﻻﺕ ﺻﺪﻳﻘﺔ ﻫﻮ‬
‫ﺗﺴﻬﻴﻞ ﺍﻻﺗﺼﺎﻝ ﺑﲔ ﺍﻟﻔﺌﺎﺕ ﺣﻴﺚ ﳝﻜﻦ ﻟﻔﺌﺔ ﺻﺪﻳﻘﺔ ﻟﻔﺌﺔ ﺃﺧﺮﻯ ﺍﻟﻮﺻـﻮﻝ ﻟﻜـﻞ ﺍﻷﻋﻀـﺎﺀ‬
‫ﺍﳋﺎﺻﺔ ﺍﳌﻌﺮﻓﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻷﺧﺮﻯ ‪ .‬ﺍﳌﺜﺎﻝ ﺍﻟﱪﻧﺎﻣﺞ ﻳﺒﲔ ﻫﺬﺍ‪:‬‬
‫‪//Program 8-2:‬‬
‫‪//using a friend class.‬‬
‫>‪#include<iostream.h‬‬

‫‪151‬‬
class TwoValues {
//continue
int a;
int b;
public:
TwoValues(int i, int j) {a = i, b= j;}
friend class Min;
};
class Min {
public:
int min(TwoValues x);
};
int Min::min (TwoValues x)
{
return x.a< x.b? x.a: x.b;
}
int main( )
{
TwoValues ob(10, 20);
Min m;
cout<< m.min(ob);
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

10

:‫ ﰲ ﺍﻟﺴﻄﺮﺍﻟﺘﺎﱄ‬TwoValues ‫ ﻛﻔﺌﺔ ﺻﺪﻳﻘﺔ ﻟﻠﻔﺌﺔ‬Min ‫ﰎ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻟﻔﺌﺔ‬


friend class Min;

‫ ﻣﻦ ﻗﺒﻞ ﺍﻟﻔﺌﺔ‬TowValues ‫ ﰲ ﺍﻟﻔﺌﺔ‬b‫ ﻭ‬a ‫ﻟﺬﻟﻚ ﰎ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﳋﺎﺻﺔ‬


.Min
int Min::min (TwoValues x)
{
return x.a< x.b? x.a: x.b;
}

152
‫ﺗﺴﺘﻌﻤﻞ ﺍﻟﻔﺌﺎﺕ ﺍﻟﺼﺪﻳﻘﺔ ﺇﺫﺍ ﻛﺎﻥ ﻫﻨﺎﻟﻚ ﻓﺌﺘﲔ ﻣﺮﺗﺒﻄﺘﲔ ﺑﺒﻌﻀﻬﻤﺎ ﻛﺜﲑﹰﺍ ﻟﺪﺭﺟﺔ ﺃﻥ ﺃﺣﺪﳘﺎ ﲢﺘﺎﺝ ﺇﱃ ﺍﻟﻮﺻﻮﻝ ﺇﱃ‬

‫ﺑﻴﺎﻧﺎﺕ ﺍﻷﺧﺮﻯ ﺍﳋﺎﺻﺔ ﺑﺸﻜﻞ ﻣﺒﺎﺷﺮ ‪ .‬ﺃﻧﻨﺎ ﻻ ﻧﺮﻳﺪ ﺃﻥ ﳒﻌﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﺎﻣﺔ ﻷﻥ ﻫﺬﺍ ﺳﻴﺘﻴﺢ ﻷﻱ ﺷﺨﺺ ﺗﻌﺪﻳﻠﻬﺎ ﺑﻄﺮﻳﻖ‬

‫ﺍﳋﻄﺄ‪ .‬ﻛﻤﺎ ﺃﻥ ﺍﻟﻔﺌﺔ ﻫﻲ ﻟﻴﺴﺖ ﻣﺸﺘﺮﻛﺔ ﰲ ﺻﻔﺎﺕ ﻣﻊ ﺍﻟﻔﺌﺔ ﺍﻷﺧﺮﻯ ﻭﻋﻠﻴﻪ ﻻ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻮﺭﺍﺛﺔ ﻟﺬﺍ ﻓﺈﻥ ﺍﺳﺘﻌﻤﺎﻝ‬

‫ﺍﻟﻔﺌﺎﺕ ﺍﻟﺼﺪﻳﻘﺔ ﻫﻮ ﺍﻷﺳﻠﻮﺏ ﺍﻟﻮﺣﻴﺪ ﳉﻌﻞ ﺇﺣﺪﻯ ﺍﻟﻔﺌﺘﲔ ﺗﺼﻞ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﳋﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻷﺧﺮﻯ‪.‬‬

‫ﺗﻌﻴﲔ ﺍﻟﻜﺎﺋﻨﺎﺕ‬
‫‪Object assignment‬‬
‫‪8.3‬‬
‫ﳝﻜﻦ ﺗﻌﻴﲔ ﻗﻴﻤﺔ ﻛﺎﺋﻦ ﺇﱃ ﻛﺎﺋﻦ ﺁﺧﺮ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻋﻼﻣﺔ ﺍﳌﺴﺎﻭﺍﺓ = ﺷﺮﻳﻄﺔ ﺃﻥ ﺗﻨﺘﻤـﻲ‬
‫ﻫﺬﻩ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺇﱃ ﻧﻔﺲ ﺍﻟﻔﺌﺔ ﻭﻳﺆﺩﻯ ﻫﺬﺍ ﺇﱃ ﺃﻥ ﳛﻤﻞ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﻋﻠﻰ ﻳﺴﺎﺭ ﻋﻼﻣﺔ ﺍﳌﺴﺎﻭﺍﺓ‬
‫ﻗﻴﻤﺔ ﺍﻟﻜﺎﺋﻦ ﻋﻠﻰ ﳝﻴﻨﻬﺎ‪.‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺫﻟﻚ‪:‬‬

‫‪//Program -3:‬‬ ‫‪8‬‬


‫‪// Assigning objects.‬‬
‫>‪#include<iostream.h‬‬
‫{ ‪class myclass‬‬
‫;‪int i‬‬
‫‪public:‬‬
‫} ;‪void set_i(int n) {i=n‬‬
‫}; ‪int get_i( ) {return i‬‬
‫;}‬
‫) (‪int main‬‬
‫{‬
‫;‪myclass ob1, ob2‬‬
‫;)‪ob1.set_i(99‬‬
‫‪ob2=ob1; // Assign data from ob1 to ob2‬‬
‫; ) (‪cout << " This is ob2’s i: " << ob2.get_i‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

‫‪153‬‬
‫‪This is ob2’s i: 99‬‬

‫ﲢﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‬


‫‪8.4‬‬
‫‪Operators Overloading‬‬
‫ﻻ ﺗﻀﻴﻒ ‪ C++‬ﻓﻘﻂ ﺇﻣﻜﺎﻧﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻔﺌﺎﺕ ﻹﻧﺸﺎﺀ ﺃﻧﻮﺍﻉ ﺟﺪﻳﺪﺓ ﻣـﻦ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﻞ ﻭﺗﺘﻴﺢ ﺃﻳﻀﹰﺎ ﻟﻠﻤﺴﺘﺨﺪﻡ ﺍﻟﻌﻤﻞ ﻋﻠﻰ ﻫﺬﻩ ﺍﻷﻧـﻮﺍﻉ ﺑﺎﺳـﺘﺨﺪﺍﻡ ﻧﻔـﺲ‬
‫ﻼ‬
‫ﺍﻟﻌﻮﺍﻣﻞ ﺍﻟﱵ ﺗﺴﺘﺨﺪﻣﻬﺎ ﺍﻷﻧﻮﺍﻉ ﺍﻷﺳﺎﺳﻴﺔ ‪ .‬ﻭﻋﻨﺪﻣﺎ ﻳﻌﻄﻲ ﻋﺎﻣﻞ ﻣﻮﺟـﻮﺩ ﺃﺻـ ﹰ‬
‫ﻛـ ‪ +‬ﺃﻭ – ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﺍﻟﻌﻤﻞ ﻋﻠﻰ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪﺓ ﻳﻘﺎﻝ ﺃﻧـﻪ ﰎ ﲢﻤﻴﻠـﻪ‬
‫ﺑﺸﻜﻞ ﺯﺍﺋﺪ ‪ .overloaded‬ﻳﺘﻢ ﲢﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺑﻜﺘﺎﺑﺔ ﺩﻭﺍﻝ ﲢﻤـﻞ‬
‫ﺍﲰﹰﺎ ﺧﺎﺻﺎﹰ‪ ،‬ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ operator‬ﻣﺘﺒﻮﻋﺔ ﺑﺎﻟﻌﺎﻣﻞ ﺍﳌﺮﺍﺩ ﲢﻤﻴﻠﻪ ﺑﺸـﻜﻞ‬
‫ﻼ ﻟﺘﺤﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ ‪ +‬ﺑﺸـﻜﻞ ﺯﺍﺋـﺪ ﻧﻌـﺮﻑ ﺩﺍﻟـﺔ ﲢﻤـﻞ ﺍﻻﺳـﻢ‬ ‫ﺯﺍﺋﺪ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫) (‪.operator+‬‬

‫ﻋﻨﺪ ﲢﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﳚﺐ ﻣﺮﺍﻋﺎﺓ ﺍﻵﰐ‪:‬‬


‫ﺧﻄﺄ‬

‫ﻼ ﺍﻟﻌﻮﺍﻣﻞ ﺍﻟﺘﺎﻟﻴﺔ ﻻ ﳝﻜﻨﻨـﺎ‬


‫‪ /1‬ﻻ ﳝﻜﻦ ﲢﻤﻴﻞ ﻛﻞ ﻋﻮﺍﻣﻞ ‪ C++‬ﺑﺸﻜﻞ ﺯﺍﺋﺪ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﲢﻤﻴﻠﻬﺎ ‪:‬‬
‫‪.‬‬ ‫‪*.‬‬ ‫‪::‬‬ ‫؟‪:‬‬
‫‪ /2‬ﻻ ﳝﻜﻦ ﺗﻐﻴﲑ ﻋﺪﺩ ﺍﳌﻌﺎﻣﻼﺕ ﺍﻟﱵ ﻳﺄﺧﺬﻫﺎ ﺍﻟﻌﺎﻣﻞ‪.‬‬
‫ﻼ ﰲ ‪ C++‬ﻛﺎﻟﻌﺎﻣـﻞ ** ﺍﻟـﺬﻱ‬
‫‪ /3‬ﻻ ﳝﻜﻦ ﺇﻧﺸﺎﺀ ﻋﻮﺍﻣﻞ ﺟﺪﻳﺪﺓ ﻏﲑ ﻣﻮﺟﻮﺩﺓ ﺃﺻ ﹰ‬
‫ﻳﺴﺘﺨﺪﻡ ﰲ ﺑﻌﺾ ﺍﻟﻠﻐﺎﺕ ﻟﻠﺮﻓﻊ ﺍﻷﺳﻰ‪.‬‬
‫‪ /4‬ﻻ ﺗﺘﻐﲑ ﺃﻭﻟﻮﻳﺔ ‪ precedence‬ﺍﻟﻌﺎﻣﻞ ﺍﶈﻤﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‪.‬‬

‫‪154‬‬
‫‪ /5‬ﺑﺈﻣﻜﺎﻥ ﺍﻟﻌﺎﻣﻞ ﺍﶈﻤﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻋﻨﺪ ﺗﻄﺒﻴﻘﻪ ﻋﻠﻰ ﺍﻟﻜﺎﺋﻨﺎﺕ )ﻟﻴﺲ ﻋﻠﻰ ﺍﻻﻧﻮﺍﻉ‬
‫ﻼ ﺑﺈﻣﻜـﺎﻥ ﺍﻟﻌﺎﻣـﻞ ‪ +‬ﺍﶈﻤـﻞ‬
‫ﺍﻷﺳﺎﺳﻴﺔ( ﺗﻨﻔﻴﺬ ﺃﻱ ﻋﻤﻠﻴﺔ ﻳﺮﻳﺪﻫﺎ ﻣﻨﺸﺊ ﺍﻟﻔﺌﺔ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺃﻥ ﻳﻌﺮﺽ ﻧﺼﹰﺎ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﺃﻭ ﺣﱴ ﻳﻘﻮﻡ ﺑﻄﺮﺡ ﻛـﺎﺋﻨﲔ ﻭﻟﻜـﻦ ﻣـﻦ‬
‫ﺍﳌﺴﺘﺤﺴﻦ ﺃﻥ ﺗﻜﻮﻥ ﺍﻟﻌﻤﻠﻴﺔ ﺍﳌﺮﺍﺩ ﻟﻠﻌﺎﻣﻞ ﺍﶈﻤﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺗﻨﻔﻴﺬﻫﺎ ﺃﻥ ﺗﻜﻮﻥ ﳍـﺎ‬
‫ﻼ‪.‬‬
‫ﻋﻼﻗﺔ ﺑﻄﺒﻴﻌﺔ ﺍﻟﻌﺎﻣﻞ ﺃﺻ ﹰ‬
‫‪ /6‬ﺑﻌﺾ ﺍﻟﻔﺌﺎﺕ ﻣﻼﺋﻤﺔ ﻻﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻮﺍﻣﻞ ﺍﶈﻤﻠﺔ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻋﻠﻰ ﻋﻜﺲ ﺍﻟـﺒﻌﺾ‬
‫ﺍﻵﺧﺮ ‪،‬ﻭﺑﺸﻜﻞ ﻋﺎﻡ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﻮﺍﻣﻞ ﺍﶈﻤﻠﺔ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻣﻊ ﺍﻟﻔﺌﺎﺕ ﺍﻟﱵ ﲤﺜـﻞ‬
‫ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﺭﻗﻤﻴﺔ ﻛﺎﻷﻭﻗﺎﺕ ﻭﺍﻟﺘﻮﺍﺭﻳﺦ ﻭﺍﻷﺭﻗﺎﻡ ﺍﳌﺮﻛﺒﺔ )‪ (x+iy‬ﻛﻤﺎ ﳝﻜـﻦ ﺃﻥ‬
‫ﺗﺴﺘﻔﻴﺪ ﻓﺌﺎﺕ ﺍﻟﺴﻼﺳﻞ ﺃﻳﻀﹰﺎ ﻣﻦ ﺍﻟﻌﻮﺍﻣﻞ ﺍﶈﻤﻠﺔ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‪.‬‬

‫ﻛﻴﻔﻴﺔ ﺗﻌﺮﻳﻒ ﺩﺍﻟﺔ ﺍﻟﻌﺎﻣﻞ‬


‫‪Operator function‬‬
‫‪8.5‬‬
‫ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻟﱵ ﺗﻌﻤﻞ ﻋﻠﻰ ﲢﻤﻴﻞ ﻋﺎﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﰲ ﻓﺌﺔ ﻣﺎ ﻛﻌﻀﻮ ﰲ ﺍﻟﻔﺌﺔ ﺃﻭ ﻛﺪﺍﻟﺔ ﺻﺪﻳﻘﺔ ﻟﻠﻔﺌﺔ‪.‬‬

‫ﺗﺄﺧﺬ ﺩﺍﻟﺔ ﺍﻟﻌﺎﻣﻞ ‪ operator function‬ﻋﻨﺪﻣﺎ ﺗﻜﻮﻥ ﻋﻀﻮﹰﺍ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﺸـﻜﻞ‬


‫ﺍﻟﻌﺎﻡ ﺍﻵﰐ‪:‬‬
‫)‪return_type operator#(arg_list‬‬
‫{‬
‫‪//operations‬‬
‫}‬

‫‪155‬‬
‫ﺣﻴﺚ ‪-:‬‬
‫‪ : return_type‬ﻫﻮ ﻗﻴﻤﺔ ﺇﻋﺎﺩﺓ ﺍﻟﺪﺍﻟﺔ ‪ operator#‬ﻭﺍﻟﱵ ﻏﺎﻟﺒﹰﺎ ﻣـﺎ ﺗﺮﺟـﻊ‬
‫ﻛﺎﺋﻨﹰﺎ ﺗﺎﺑﻌﹰﺎ ﻟﻠﻔﺌﺔ ﺍﻟﱵ ﺗﻌﻤﻞ ﻋﻠﻰ ﻛﺎﺋﻨﺎ‪‬ﺎ ﻭﻟﻜﻦ ﳝﻜﻦ ﺃﻥ ﻳﻜـﻮﻥ ‪return_type‬‬
‫ﻣﻦ ﺃﻱ ﻧﻮﻉ ﺁﺧﺮ‪.‬‬
‫‪ -: Operator‬ﻛﻠﻤﺔ ﺃﺳﺎﺳﻴﺔ ﰲ ‪.C++‬‬
‫ﻼ ﺇﺫﺍ ﻛﻨﺎ ﻧﻘـﻮﻡ ﺑﺘﺤﻤﻴـﻞ‬
‫‪ -: #‬ﺗﺴﺘﺒﺪﻝ ﺑﺎﻟﻌﺎﻣﻞ ﺍﳌﺮﺍﺩ ﲢﻤﻴﻠﻪ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﺍﻟﻌﺎﻣﻞ ‪ +‬ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻧﻜﺘﺐ ‪.operator‬‬
‫‪ -:Arg_list‬ﻭﻫﻰ ﻻﺋﺤﺔ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﳌﻤﺮﺓ ﺇﱃ ﺍﻟﺪﺍﻟـﺔ ‪ operator#‬ﻭﺍﻟـﱵ‬
‫ﲢﺘﻮﻯ ﻋﻠﻰ ﻋﻨﺼﺮ ﻭﺍﺣﺪ ﺇﺫﺍ ﻛﻨﺎ ﻧﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣـﻞ ﺛﻨـﺎﺋﻲ )‪(.... ،/ ،- ،+‬‬
‫ﻭﺗﻜﻮﻥ ﻓﺎﺭﻏﺔ ﺇﺫﺍ ﻛﻨﺎ ﻧﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣﻞ‪ C ++‬ﺃﺣﺎﺩﻯ )‪.(.... ، -- ،++‬‬
‫‪ -:Operations‬ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳌﺮﺍﺩ ﻣﻦ ﺍﻟﻌﺎﻣﻞ ﺍﶈﻤﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺗﻨﻔﻴﺬﻫﺎ‪.‬‬
‫ﻭﺍﻵﻥ ﻭﺑﻌﺪ ﺍﻥ ﺗﻌﺮﻓﻨﺎ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ‪ ،‬ﺇﻟﻴﻚ‬
‫ﻣﺜﺎ ﹰﻻ ﻣﺒﺴﻄﹰﺎ ﻳﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻓﺌﺔ ﺗﺪﻋﻰ ‪ loc‬ﻭﻳﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ ‪ +‬ﻟﻴﻌﻤـﻞ ﻋﻠـﻰ‬
‫ﻛﺎﺋﻨﺎﺕ ﻫﺬﻩ ﺍﻟﻔﺌﺔ‪ ،‬ﺃﺩﺭﺱ ﺍﻟﱪﻧﺎﻣﺞ ﻭﺍﻧﺘﺒـﻪ ﺟﻴـﺪﹰﺍ ﺇﱃ ﻛﻴﻔﻴـﺔ ﺗﻌﺮﻳـﻒ ﺍﻟﺪﺍﻟـﺔ‬
‫) (‪.operator+‬‬

‫‪//Program 8-4:‬‬
‫>‪#include <iostream.h‬‬
‫{ ‪class loc‬‬
‫؛‪int longitude, latitude‬‬
‫‪public:‬‬
‫} { )(‪loc‬‬
‫{ )‪loc(int lg, int lt‬‬
‫؛‪longitude = lg‬‬
‫؛‪latitude =lt‬‬
‫}‬
‫{ ) (‪void show‬‬

‫‪156‬‬
cout << longitude <<” ”;
cout<< latitude<< "\n "‫؛‬
}
loc operator+ (loc op2)‫؛‬
}‫؛‬

//Continued
//Overload +for loc.
Loc loc::operator+(loc op2)
{
loc temp‫؛‬
temp.longitude = op2.longitude+ longitude‫؛‬
temp.latitude = op2.latitude+ latitude‫؛‬
return temp‫؛‬
}
int main( )
}
loc ob1(10, 20), ob2(5,30)‫؛‬
ob1.show( )‫؛‬
ob2.show( )‫؛‬
ob1= ob1+ ob2‫؛‬
ob1.show( ) ‫؛‬
return 0‫؛‬
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

157
‫‪20 10‬‬
‫‪30 5‬‬
‫‪15 50‬‬

‫ﻻﺣﻆ ﰲ ﺍﻟﺪﺍﻟﺔ ) (‪ main‬ﺇﻥ ﺍﻟﻌﺎﻣﻞ ‪ +‬ﺍﶈﻤﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﳚﻌﻞ ﻋﻤﻠﻴـﺔ‬


‫ﺍﳉﻤﻊ ﺗﺒﺪﻭ ﻭﻛﺄ‪‬ﺎ ﺗﺘﻢ ﻋﻠﻰ ﺃﻧﻮﺍﻉ ﺃﺳﺎﺳﻴﺔ ‪.‬‬
‫؛‪ob1= ob1+ ob2‬‬
‫ﻭﻛﻤﺎ ﺭﺃﻳﻨﺎ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺪﺍﻟﺔ ) (‪ operator+‬ﳍﺎ ﻭﺳﻴﻄﺔ ﻭﺍﺣﺪﺓ ﻋﻠـﻰ‬
‫ﺍﻟﺮﻏﻢ ﻣﻦ ﺃ‪‬ﺎ ﺗﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣﻞ ﺍﳉﻤﻊ ‪ +‬ﺍﻟﺜﻨﺎﺋﻲ ﺍﻟﺬﻱ ﻳﻌﻤﻞ ﻋﻠﻰ ﻗﻴﻤﺘﲔ ﻭﺍﻟﺴﺒﺐ‬
‫ﰲ ﺫﻟﻚ ﺃﻥ ﺍﳌﻌﺎﻣﻞ ﻋﻠﻰ ﻳﺴﺎﺭ ﺍﻟﻌﻼﻣﺔ ‪ +‬ﻳﺘﻢ ﲤﺮﻳﺮﻩ ﺇﱃ ﺍﻟﺪﺍﻟﺔ ﺑﻮﺍﺳﻄﺔ ﺍﳌﺆﺷﺮ ‪this‬‬
‫ﻭﺍﳌﻌﺎﻣﻞ ﻋﻠﻰ ﳝﲔ ﺍﻟﻌﻼﻣﺔ ﻫﻮ ﺍﻟﺬﻱ ﻳﺘﻢ ﲤﺮﻳﺮﻩ ﻛﻮﺳﻴﻄﺔ ﻟﻠﺪﺍﻟﺔ ﻭﻟﺬﻟﻚ ﻳﺘﻢ ﺍﻹﻋﻼﻥ‬
‫ﻋﻦ ﺍﻟﺪﺍﻟﺔ ﻛﺎﻵﰐ‪:‬‬
‫؛)‪loc operator + (loc op 2‬‬
‫ﻳﺘﻢ ﰲ ﺍﻟﺪﺍﻟﺔ ) (‪ main‬ﺗﻌﻴﲔ ﻗﻴﻤﺔ ﺍﻹﻋﺎﺩﺓ ﻣﻦ ﺍﳉﻤﻊ ﺇﱃ ﺍﻟﻜـﺎﺋﻦ ‪ob1‬‬
‫ﻭﻳﺘﻢ ﻫﺬﺍ ﺍﻷﻣﺮ ﰲ ﺍﻟﺪﺍﻟﺔ ) (‪ operator+‬ﻋﻦ ﻃﺮﻳﻖ ﺇﻋﺎﺩﺓ ﻛﺎﺋﻦ ﻳـﺪﻋﻰ ‪temp‬‬
‫ﺑﺎﻟﻘﻴﻤﺔ ﺣﻴﺚ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﺎﺋﻦ ‪ temp‬ﻟﺘﺨﺰﻳﻦ ﻧﺘﺎﺋﺞ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﻭﻫـﻮ‬
‫ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﺗﺘﻢ ﺇﻋﺎﺩﺗﻪ‪.‬ﻭﺑﻄﺮﻕ ﻣﺘﺸﺎ‪‬ﺔ ﳝﻜﻨﻨﺎ ﲢﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ ﺍﳊﺴـﺎﺑﻴﺔ ﺍﻟﺜﻨﺎﺋﻴـﺔ‬
‫ﺍﻷﺧﺮﻯ ﻛـ – ﻭ * ﻭ ‪ /‬ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺃﻳﻀﹰﺎ ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﺛﻼﺙ ﻋﻮﺍﻣﻞ ﺇﺿﺎﻓﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ‪ : loc‬ﺍﻟﻌﺎﻣﻞ – ﻭﺍﻟﻌﺎﻣﻞ =‬
‫ﻭﺍﻟﻌﺎﻣﻞ ‪.++‬‬

‫‪//Program 8-5:‬‬
‫<‪#include<iostream.h‬‬
‫{ ‪class loc‬‬
‫؛‪int longitude, latitude‬‬
‫‪public:‬‬
‫‪loc( ) { }// needed to construct temporaries‬‬

‫‪158‬‬
loc(int lg, int lt){
longitude = lg‫؛‬
latitude =lt‫؛‬
}
void show( )
cout << longitude‫>> " "؛‬
cout<< latitude<< "\n"‫؛‬

//Continued
}
loc operator+(loc op2)
loc operator- (loc op2)‫؛‬
loc operator= (loc op2)‫؛‬
loc operator++‫؛‬
}
//Overload + for loc.
Loc loc:: operator+ (loc op2)
{
loc temp‫؛‬
temp.longitude = op2.longitude+ longitude‫؛‬
temp.latitude = op2.latitude+ latitude‫؛‬
return temp‫؛‬
}
//Overload - for loc.
Loc loc:: operator- (loc op2)
{
loc temp‫؛‬
//notice order of operands
temp.longitude = longitude- op2.longitude‫؛‬

159
temp.latitude = latitude- op2.latitude‫؛‬
return temp‫؛‬
}
//overload asignment for loc.
Loc loc:: operator= (loc op2)
{
temp.longitude = op2.longitude‫؛‬
//Continued
temp.latitude = op2.latitude‫؛‬
return *this; // i.e., return object that
//generated call
}
//overload prefix ++ for loc.
Loc loc:: operator( ) ++
{
longitude++‫؛‬
latitude++‫؛‬
return *this ‫؛‬
}
int main( )
{
loc ob1(10, 20), ob2(5,30) , ob3(90, 90)‫؛‬
ob1.show( )‫؛‬
ob2.show( )‫؛‬
++ob1‫؛‬
ob1.show( ) ‫؛‬
ob2 = ++ob1‫؛‬
ob1.show( ) ‫؛‬

160
‫؛ ) (‪ob2.show‬‬
‫؛ ‪ob1=ob2=ob3‬‬
‫؛) (‪ob1.show‬‬
‫؛) (‪ob2.show‬‬
‫؛‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬
‫‪21 11‬‬
‫‪22 12‬‬
‫‪22 13‬‬
‫‪90 90‬‬
‫‪90 90‬‬
‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ‪:‬‬
‫ﺍﻟﺪﺍﻟﺔ ) (‪-:operator-‬‬
‫)‪Loc loc:: operator- (loc op2‬‬
‫{‬
‫؛‪loc temp‬‬
‫‪//notice order of operands‬‬
‫؛‪temp.longitude = longitude- op2.longitude‬‬
‫؛‪temp.latitude = latitude- op2.latitude‬‬
‫؛‪return temp‬‬
‫}‬

‫ﻻﺣﻆ ﰲ ﺍﻟﺪﺍﻟﺔ ‪ ( ) - operator‬ﺗﺮﺗﻴﺐ ﺍﳌﻌﺎﻣﻼﺕ ﰲ ﻋﻤﻠﻴﺔ ﺍﻟﻄـﺮﺡ‪.‬‬


‫ﺍﳌﻌﺎﻣﻞ ﻋﻠﻰ ﳝﲔ ﻋﻼﻣﺔ ﺍﻟﻄﺮﺡ ﻳﺘﻢ ﻃﺮﺣﻪ ﻣﻦ ﺍﳌﻌﺎﻣﻞ ﻋﻠﻰ ﻳﺴﺎﺭ ﻋﻼﻣـﺔ ﺍﻟﻄـﺮﺡ‬
‫ﻭﺫﻟﻚ ﻷﻥ ﺍﳌﻌﺎﻣﻞ ﻋﻠﻰ ﻳﺴﺎﺭ ﻋﻼﻣﺔ ﺍﻟﻄﺮﺡ ﻫﻮ ﺍﻟﺬﻱ ﻳﻘـﻮﻡ ﺑﺎﺳـﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟـﺔ‬

‫‪161‬‬
‫‪ ( ) - operator‬ﻭﻋﻠﻴﻪ ﺑﻴﺎﻧﺎﺕ ﺍﻟﻜﺎﺋﻦ ‪ ob2‬ﻳﺘﻢ ﻃﺮﺣﻬﺎ ﻣﻦ ﺑﻴﺎﻧﺎﺕ ﺍﻟﻜـﺎﺋﻦ‬
‫ﺍﳌﺸﺎﺭ ﺇﻟﻴﻪ ﺑﺎﳌﺆﺷﺮ ‪.this‬‬
‫ﺍﻟﺪﺍﻟﺔ ) (=‪-:operator‬‬
‫)‪Loc loc:: operator= (loc op2‬‬
‫{‬
‫؛‪temp.longitude = op2.longitude‬‬
‫؛‪temp.latitude = op2.latitude‬‬
‫;‪return *this‬‬ ‫‪// i.e., return object that‬‬
‫‪//generated call‬‬
‫}‬
‫ﻼ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﰲ ﻛـﻞ ﺍﻟﻔﺌـﺎﺕ ﺑﺸـﻜﻞ‬ ‫ﰲ ‪ ++C‬ﻳﻜﻮﻥ ﺍﻟﻌﺎﻣﻞ = ﳏﻤ ﹰ‬
‫ﺍﻓﺘﺮﺍﺿﻲ ﺣﱵ ﻟﻮ ﱂ ﺗﺘﻢ ﻛﺘﺎﺑﺔ ﺩﺍﻟﺔ ﻟﺘﺤﻤﻴﻠﻪ ‪ .‬ﰲ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ ﺍﻟﺪﺍﻟـﺔ ‪operator‬‬
‫=) ( ﺗﻘﻮﻡ ﺑﻨﻔﺲ ﻣﻬﻤﺔ ﺍﻟﻌﺎﻣﻞ = ﺍﻻﻓﺘﺮﺍﺿﻲ ﻭﻟﻜﻦ ﰲ ﺑﻌﺾ ﺍﻷﺣﻴﺎﻥ ﳝﻜﻦ ﻟﻠﻌﺎﻣﻞ‬
‫= ﺍﶈﻤﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺗﻨﻔﻴﺬ ﻣﻬﺎﻡ ﺃﺧﺮﻯ‪.‬‬
‫ﺗﻌﻴﺪ ﺍﻟﺪﺍﻟﺔ *‪ this‬ﻭﻫﻮ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﺍﺳﺘﺪﻋﻰ ﺍﻟﺪﺍﻟﺔ‪.‬‬
‫ﺍﻟﺪﺍﻟﺔ ) (‪:operator++‬‬
‫) (‪loc loc:: operator++‬‬
‫{‬
‫؛‪longitude++‬‬
‫؛‪latitude++‬‬
‫‪return *this‬‬ ‫؛‬
‫{‬

‫ﻛﻤﺎ ﻻﺣﻈﺖ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﻻ ﺗﺄﺧﺬ ﺍﻟﺪﺍﻟﺔ ) (‪ operator++‬ﺃﻱ ﻭﺳﻴﻄﺎﺕ‬


‫ﻭﺫﻟﻚ ﻷﻥ ﺍﻟﻌﺎﻣﻞ ‪ ++‬ﺃﺣﺎﺩﻯ ‪ .‬ﻳﺘﻢ ﲤﺮﻳﺮ ﺍﳌﻌﺎﻣﻞ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﳌﺆﺷﺮ ‪.this‬‬
‫ﻻﺣﻆ ﺃﻥ ﻛﻼ ﺍﻟـﺪﺍﻟﺘﲔ ) (=‪ operator‬ﻭ ) (‪ operator++‬ﺗﻘـﻮﻡ‬
‫ﺑﺘﻐﻴﲑ ﻗﻴﻤﺔ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﺍﺳﺘﺪﻋﻰ ﺍﻟﺪﺍﻟﺔ ﻓﻔﻲ ﺍﻟﺪﺍﻟﺔ ) (=‪ operator‬ﻳﺘﻢ ﺗﻌـﻴﲔ‬

‫‪162‬‬
‫ﻗﻴﻤﺔ ﺟﺪﻳﺪﺓ ﻟﻠﻜﺎﺋﻦ ﻋﻠﻰ ﻳﺴﺎﺭ ﺍﻟﻌﻼﻣﺔ = ﻭﺍﻟﺬﻱ ﻗﺎﻡ ﺑﺎﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟـﺔ ﻭﰲ ﺍﻟﺪﺍﻟـﺔ‬
‫) (‪ operator++‬ﻳﺘﻢ ﺯﻳﺎﺩﺓ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﺍﺳﺘﺪﻋﻰ ﺍﻟﺪﺍﻟﺔ ﲟﻘﺪﺍﺭ ‪. 1‬‬

‫ﲢﻤﻴﻞ ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﻴﲔ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‬


‫‪8.6‬‬

‫ﻼ‬
‫ﻼ ﺯﺍﺋﺪﹰﺍ ‪ .‬ﻓﻤﺜ ﹰ‬
‫ﳝﻜﻨﻨﺎ ﲢﻤﻴﻞ ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﻴﲔ ﰲ ‪ ++C‬ﻛـ =‪ -‬ﺃﻭ =‪ +‬ﲢﻤﻴ ﹰ‬
‫ﻼ ﺯﺍﺋﺪﹰﺍ ﰲ ﺍﻟﻔﺌﺔ ‪.loc‬‬
‫ﺍﻟﺪﺍﻟﺔ ﺍﻟﺘﺎﻟﻴﺔ ﺗﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ =‪ +‬ﲢﻤﻴ ﹰ‬
‫)‪loc loc:: operator+= (loc op2‬‬
‫{‬
‫؛‪loc temp‬‬
‫؛‪longitude = op2.longitude+ longitude‬‬
‫؛‪latitude = op2.latitude+ latitude‬‬
‫؛‪return *this‬‬
‫}‬
‫ﺍﻟﻔﺮﻕ ﺑﲔ ﺍﻟﻌﻮﺍﻣﻞ ﺍﻟﺜﻨﺎﺋﻴﺔ ﺍﻟﻌﺎﺩﻳﺔ ﻛـ ‪ +‬ﻭﺑﲔ ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﻴﲔ ﻛــ =‪ +‬ﻫـﻮ ﺃﻥ‬
‫ﻼ ﺇﺫﺍ ﻛﺘﺒﻨﺎ‪:‬‬
‫ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﻴﲔ ﺗﻌﺪﻝ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﰎ ﺍﺳﺘﺪﻋﺎﺅﻫﺎ ﻣﻦ ﺃﺟﻠﻪ ﻓﻤﺜ ﹰ‬
‫؛‪ob1 += ob2‬‬
‫ﺳﻴﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ) (‪ operator=+‬ﻟﻠﻜﺎﺋﻦ ‪ ob1‬ﻭﻳﺘﻢ ﺗﻌﺪﻳﻠﻪ ﲜﻤﻊ‬
‫‪ ob2‬ﺇﻟﻴﻪ‪.‬‬

‫ﲢﻤﻴﻞ ﻋﺎﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ‬


‫‪8.7‬‬

‫ﳝﻜﻨﻨﺎ ﲢﻤﻴﻞ ﻋﺎﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ ﻟﺪﻭﺍﻝ ﺍﻟﻔﺌﺔ ﺍﳌـﺮﺍﺩ‬
‫ﲢﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ ﻟﻴﻌﻤﻞ ﻋﻠﻰ ﻛﺎﺋﻨﺎ‪‬ﺎ ﻭﲟﺎ ﺃﻥ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺼﺪﻳﻘﺔ ﻫﻲ ﻟﻴﺴﺖ ﻋﻀﻮﹰﺍ ﰲ ﺍﻟﻔﺌﺔ‬
‫ﻟﺬﺍ ﻓﻬﻲ ﻻ ﲤﺘﻠﻚ ﺍﳌﺆﺷﺮ ‪ this‬ﻭﻋﻠﻴﻪ ﻳﺘﻢ ﲤﺮﻳﺮ ﻭﺳﻴﻄﺎ‪‬ﺎ ﻇﺎﻫﺮﻳﹰﺎ ﻭﻧﻌﲎ ﺑﺬﻟﻚ ﺃﻥ‬

‫‪163‬‬
‫ﺍﻟﺪﺍﻟﺔ ﺍﻟﺼﺪﻳﻘﺔ ﺍﻟﱵ ﺗﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣﻞ ﺛﻨﺎﺋﻲ ﻳﺘﻢ ﲤﺮﻳﺮ ﻭﺳﻴﻄﺘﲔ ﳍﺎ ﺑﻴﻨﻤﺎ ﻳﺘﻢ ﲤﺮﻳﺮ‬
‫ﻭﺳﻴﻄﺔ ﻭﺍﺣﺪﺓ ﻟﻠﺪﺍﻟﺔ ﺍﻟﺼﺪﻳﻘﺔ ﺍﻟﱵ ﺗﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣﻞ ﺃﺣﺎﺩﻯ ‪.‬‬
‫ﻋﻨﺪﻣﺎ ﻧﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣﻞ ﺛﻨﺎﺋﻲ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ ﻳﺘﻢ ﲤﺮﻳﺮ ﺍﳌﻌﺎﻣﻞ ﻋﻠﻰ ﺍﻟﻴﺴﺎﺭ‬
‫ﰲ ﺍﻟﻮﺳﻴﻄﺔ ﺍﻷﻭﱃ ﺑﻴﻨﻤﺎ ﻳﺘﻢ ﲤﺮﻳﺮ ﺍﳌﻌﺎﻣﻞ ﻋﻠﻰ ﺍﻟﻴﻤﲔ ﰲ ﻭﺳﻴﻄﺔ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺜﺎﻧﻴﺔ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﺗﻌﺮﻳﻒ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ ﻟﺘﺤﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ ‪+‬‬

‫‪//Program 8-6:‬‬
‫<‪#include <iostream.h‬‬
‫{‪class loc‬‬

‫‪//Continued‬‬
‫؛‪int longitude, latitude‬‬
‫‪public:‬‬
‫‪loc( ) { }// needed to construct temporaries‬‬
‫{ )‪loc(int lg, int lt‬‬
‫؛‪longitude = lg‬‬
‫؛‪latitude =lt‬‬
‫}‬
‫{ ) (‪void show‬‬
‫>>" ؛"‪cout << longitude‬‬
‫؛ "‪cout<< latitude<< "\n‬‬
‫}‬
‫‪friend loc operator+ (loc op1, loc op2); // now a‬‬
‫؛)‪friend loc operator- (loc op2‬‬
‫(؛‪loc operator= (loc op2‬‬
‫‪( )++‬؛‪loc operator‬‬
‫؛}‬
‫‪//now , + is overloaded using friend function.‬‬

‫‪164‬‬
loc operator+ (loc op1, loc op2)‫؛‬
{
loc temp‫؛‬
temp.longitude =op1.longitude+ op2.longitude‫؛‬
temp.latitude = op1.latitude+ op2.latitude‫؛‬
return temp‫؛‬
}
//overload - for loc.
Loc loc:: operator - (loc op2)
{
loc temp‫؛‬
//notice order of operands
temp.longitude = longitude - op2.longitude‫؛‬
temp.latitude = latitude- op2.latitude‫؛‬
return temp‫؛‬
}
//overload assignment for loc.
Loc loc:: operator = (loc op2)
{
longitude = op2.longitude‫؛‬
latitude = op2.latitude‫؛‬
return *this; // i.e., return object that generated
call
}
//overload ++ for loc.
Loc loc:: operator++( )
{
longitude‫ ؛‬++

165
‫‪ ++‬؛‪latitude‬‬
‫‪return *this‬‬ ‫؛‬
‫}‬
‫) (‪int main‬‬
‫{‬
‫(؛‪loc ob1(10, 20), ob2(5,30‬‬
‫؛‪ob1 = ob1+ ob2‬‬
‫) (؛ ‪ob1.show‬‬
‫؛‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪50 15‬‬

‫• ﻫﻨﺎﻟﻚ ﺑﻌﺾ ﻋﻮﺍﻣﻞ ‪ C++‬ﻻ ﳝﻜﻦ ﲢﻤﻴﻠﻬﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ ﻭﻫﻲ ‪:‬‬
‫= ‪.->،[]،()،‬‬

‫* ﻳﻀﻴﻒ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺼﺪﻳﻘﺔ ﻣﺮﻭﻧﺔ ﺇﱃ ﲢﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻭﺫﻟـﻚ‬
‫ﻟﻶﰐ‪:‬‬
‫ﺃﻓﺮﺽ ﺃﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺘﺤﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ ‪ +‬ﳉﻤﻊ ﻛﺎﺋﻨﺎﺕ ﻓﺌﺔ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ ﻻ ﺗﻌﻤﻞ‪:‬‬
‫؛‪ob1=3+ ob2‬‬
‫ﻭﺫﻟﻚ ﻷﻧﻪ ﻭﻛﻤﺎ ﺫﻛﺮﻧﺎ ﺳﺎﺑﻘﹰﺎ ﺍﻟﺪﺍﻟﺔ ) (‪ operator+‬ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺅﻫﺎ ﻣﻦ‬
‫ﻗﺒﻞ ﺍﻟﻜﺎﺋﻦ ﺍﳌﻮﺟﻮﺩ ﻋﻠﻰ ﻳﺴﺎﺭ ﺍﻟﻌﻼﻣﺔ ‪ +‬ﻭﺗﺄﺧﺬ ﺍﻟﻜﺎﺋﻦ ﻋﻠﻰ ﳝﲔ ‪ +‬ﻛﻮﺳﻴﻄﺔ ﳍﺎ ‪،‬‬

‫‪166‬‬
‫ﻭﲟﺎ ﺃﻥ ﻩ ﳚﺐ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﻭﺍﻝ ﻣﻦ ﻗﺒﻞ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻭ ‪ 3‬ﻟﻴﺴﺖ ﻋﻀﻮﹰﺍ ﰲ ﺍﻟﻔﺌﺔ ﻟﺬﻟﻚ‬
‫ﻻ ﳝﻜﻨﻨﺎ ﻛﺘﺎﺑﺔ ﻋﺒﺎﺭﺓ ﻛﺎﻟﻌﺒﺎﺭﺓ ﺍﻟﺴﺎﺑﻘﺔ‪.‬‬
‫ﻟﺬﻟﻚ ﻭﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻧﻪ ﳝﻜﻦ ﲨﻊ ﻋﺪﺩ ﺻﺤﻴﺢ ﺇﱃ ﻛﺎﺋﻦ ﺗـﺎﺑﻊ ﻟﻔﺌـﺔ ﻻ‬
‫ﳝﻜﻨﻨﺎ ﲨﻊ ﻛﺎﺋﻦ ﺇﱃ ﺭﻗﻢ ﺻﺤﻴﺢ ﺇﻻ ﺇﺫﺍ ﺍﺳﺘﺨﺪﻣﻨﺎ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻫﺬﺍ ﺣﻴﺚ ﻧﻘﻮﻡ ﰲ ﺍﳌﺜﺎﻝ ﺑﺘﻌﺮﻳﻒ ﺇﺻﺪﺍﺭﻳﻦ ﻟﺪﺍﻟﺔ ﺻﺪﻳﻘﺔ ﻭﺑﺎﻟﺘﺎﱄ‬
‫ﳝﻜﻦ ﻟﻠﻜﺎﺋﻦ ﺃﻥ ﻳﻈﻬﺮ ﻋﻠﻰ ﳝﲔ ﺃﻭ ﻳﺴﺎﺭ ﺍﻟﻌﺎﻣﻞ‪.‬‬

‫‪//Program 8-7:‬‬
‫>‪#include <iostream.h‬‬
‫{ ‪class loc‬‬
‫؛‪int longitude, latitude‬‬
‫‪public:‬‬
‫} {) (‪loc‬‬
‫{ )‪loc(int lg, int lt‬‬
‫؛‪longitude = lg‬‬
‫؛‪latitude =lt‬‬
‫}‬
‫{ ) (‪void show‬‬
‫؛ " "<<‪cout << longitude‬‬
‫" ؛‪cout<< latitude<< "\n‬‬
‫}‬
‫؛)‪friend loc operator+ (loc op1, loc op2‬‬
‫؛ )‪friend loc operator+ (int op1, loc op2‬‬
‫}‬
‫‪+ //is overloaded for loc + int.‬‬
‫؛)‪loc operator+ (loc op1, loc op2‬‬
‫{‬
‫؛‪loc temp‬‬

‫‪167‬‬
temp.longitude =op1.longitude+ op2‫؛‬
temp.latitude = op1.latitude+ op2‫؛‬
return temp‫؛‬
}
+ //is overload for int + loc.
loc operator+ (int op1, loc op2)‫؛‬
{
loc temp‫؛‬
temp.longitude =op1 + op2.longitude‫؛‬
temp.latitude = op1 + op2.latitude‫؛‬
return temp‫؛‬
{
int main( )
{
loc ob1(10, 20), ob2(5,30) , ob3(7, 14)‫؛‬
ob1.show( ) ‫؛‬
ob2.show( )‫؛‬
ob3.show( )‫؛‬
ob1= ob2 +10; //both of these
ob3=10 + ob2; // are valid
ob1.show( )‫؛‬
ob3.show( )‫؛‬

return 0‫؛‬
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

168
20 10
30 5
14 7
40 15
40 15

169
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺼﺪﻳﻘﺔ ﻫﻲ ﺩﺍﻟﺔ ﻟﻴﺴﺖ ﻋﻀﻮﹰﺍ ﰲ ﺍﻟﻔﺌﺔ ﻭﻟﻜﻨﻬﺎ ﺗﺴﺘﻄﻴﻊ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ‬
‫ﺍﳋﺎﺻﺔ ﺑﺘﻠﻚ ﺍﻟﻔﺌﺔ‪.‬‬
‫♦ ﳉﻌﻞ ﺩﺍﻟﺔ ﻣﺎ ﺻﺪﻳﻘﺔ ﻧﻜﺘﺐ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ ﻣﺴﺒﻮﻗﹰﺎ ﺑﺎﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪. friend‬‬
‫♦ ﳝﻜﻦ ﺟﻌﻞ ﺍﻟﻔﺌﺔ ﺻﺪﻳﻘﺔ ﻟﻔﺌﺔ ﺃﺧﺮﻯ ﻭﺫﻟﻚ ﻟﺘﺴﻬﻴﻞ ﺍﻻﺗﺼﺎﻝ ﺑﲔ ﺍﻟﻔﺌﺎﺕ‪.‬‬
‫♦ ﳝﻜﻦ ﺗﻌﻴﲔ ﻗﻴﻤﺔ ﻛﺎﺋﻦ ﺇﱃ ﻛﺎﺋﻦ ﺁﺧﺮ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻋﻼﻣﺔ ﺍﳌﺴﺎﻭﺍﺓ‪ ،‬ﺷﺮﻳﻄﺔ ﺃﻥ ﺗﻨﺘﻤﻲ ﻫﺬﻩ‬
‫ﺍﻟﻜﺎﺋﻨﺎﺕ ﻟﻨﻔﺲ ﺍﻟﻔﺌﺔ‪.‬‬
‫ﻼ ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﺍﻟﻌﻤﻞ ﻋﻠﻰ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪﺓ ﻳﻘﺎﻝ‬
‫♦ ﻋﻨﺪﻣﺎ ﻳﻌﻄﻰ ﻋﺎﻣﻞ ﻣﻮﺟﻮﺩ ﺃﺻ ﹰ‬
‫ﺃﻧﻪ ﰎ ﲢﻤﻴﻠﻪ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‪.‬‬
‫♦ ﻳﺘﻢ ﲢﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺑﻜﺘﺎﺑﺔ ﺩﻭﺍﻝ ﲢﻤﻞ ﺍﻻﺳﻢ ‪ operator‬ﻣﺘﺒﻮﻋﺔ ﺑﺎﻟﻌﺎﻣﻞ‬
‫ﻼ ﻟﺘﺤﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ ‪ +‬ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻧﻌﺮﻑ ﺩﺍﻟﺔ ﲢﻤﻞ ﺍﻻﺳﻢ‬ ‫ﺍﳌﺮﺍﺩ ﲢﻤﻴﻠﻪ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‪ ،‬ﻓﻤﺜ ﹰ‬
‫) (‪. operator+‬‬
‫♦ ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻟﱵ ﺗﻌﻤﻞ ﻋﻠﻰ ﲢﻤﻴﻞ ﻋﺎﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﰲ ﻓﺌﺔ ﻣﺎ ﻛﻌﻀﻮ ﰲ ﺍﻟﻔﺌﺔ‬
‫ﺃﻭ ﻛﺪﺍﻟﺔ ﺻﺪﻳﻘﺔ ﻟﻠﻔﺌﺔ‪.‬‬
‫♦ ﺗﺄﺧﺬ ﺩﺍﻟﺔ ﺍﻟﻌﺎﻣﻞ ‪ operator function‬ﻋﻨﺪﻣﺎ ﺗﻜﻮﻥ ﻋﻀﻮﹰﺍ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ‬
‫ﺍﻟﺘﺎﱄ‪:‬‬
‫)‪return_type operator#(arg_list‬‬
‫{‬
‫‪//operations‬‬
‫}‬
‫ﺣﻴﺚ ‪-:‬‬
‫‪ : return_type‬ﻫﻮ ﻗﻴﻤﺔ ﺇﻋﺎﺩﺓ ﺍﻟﺪﺍﻟﺔ ‪ operator#‬ﻭﺍﻟﱵ ﻏﺎﻟﺒﹰﺎ ﻣـﺎ ﺗﺮﺟـﻊ‬
‫ﻛﺎﺋﻨﹰﺎ ﺗﺎﺑﻌﹰﺎ ﻟﻠﻔﺌﺔ ﺍﻟﱵ ﺗﻌﻤﻞ ﻋﻠﻰ ﻛﺎﺋﻨﺎ‪‬ﺎ ﻭﻟﻜﻦ ﳝﻜﻦ ﺃﻥ ﻳﻜـﻮﻥ ‪return_type‬‬
‫ﻣﻦ ﺃﻱ ﻧﻮﻉ ﺁﺧﺮ‪.‬‬
‫‪ -: Operator‬ﻛﻠﻤﺔ ﺃﺳﺎﺳﻴﺔ ﰲ ‪.C++‬‬
‫ﻼ ﺇﺫﺍ ﻛﻨﺎ ﻧﻘـﻮﻡ ﺑﺘﺤﻤﻴـﻞ‬
‫‪ -: #‬ﺗﺴﺘﺒﺪﻝ ﺑﺎﻟﻌﺎﻣﻞ ﺍﳌﺮﺍﺩ ﲢﻤﻴﻠﻪ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﺍﻟﻌﺎﻣﻞ ‪ +‬ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻧﻜﺘﺐ ‪.operator‬‬

‫‪170‬‬
‫‪ -:Arg_list‬ﻭﻫﻰ ﻻﺋﺤﺔ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﳌﻤﺮﺓ ﺇﱃ ﺍﻟﺪﺍﻟـﺔ ‪ operator#‬ﻭﺍﻟـﱵ‬
‫ﲢﺘﻮﻯ ﻋﻠﻰ ﻋﻨﺼﺮ ﻭﺍﺣﺪ ﺇﺫﺍ ﻛﻨﺎ ﻧﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣـﻞ ﺛﻨـﺎﺋﻲ )‪(.... ،/ ،- ،+‬‬
‫ﻭﺗﻜﻮﻥ ﻓﺎﺭﻏﺔ ﺇﺫﺍ ﻛﻨﺎ ﻧﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣﻞ‪ C ++‬ﺃﺣﺎﺩﻯ )‪.(.... ، -- ،++‬‬
‫‪ -:Operations‬ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳌﺮﺍﺩ ﻣﻦ ﺍﻟﻌﺎﻣﻞ ﺍﶈﻤﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺗﻨﻔﻴﺬﻫﺎ‪.‬‬

‫ﺍﻷﺳﺌﻠﺔ‬
‫ﻧﺎﻗﺶ ﻣﻔﻬﻮﻡ ﺍﻟﺼﺪﺍﻗﺔ ‪ Friend ship‬ﰲ ‪ C++‬ﻣﻊ ﺑﻴﺎﻥ ﺍﻷﻭﺟﻪ ﺍﻟﺴﺎﻟﺒﺔ ﻓﻴﻬﺎ‪.‬‬ ‫‪-1‬‬
‫ﲪﻞ ﺍﻟﻌﻮﺍﻣﻞ ‪ ++ &--‬ﰲ ﺍﻟﻔﺌﺔ ‪ stack‬ﻭﺍﻟﱵ ﺭﺃﻳﻨﺎﻫﺎ ﰲ ﺍﻷﻣﺜﻠﺔ ﺍﻟﺴﺎﺑﻘﺔ ﲝﻴﺚ ﺗﻌﻤﻞ‬ ‫‪-2‬‬
‫ﺍﻟﺪﺍﻟﺘﺎﻥ ‪ ( )- - operator‬ﻭ ‪ ( ) ++ operator‬ﲤﺎﻣﹰﺎ ﻣﺜﻠﻤﺎ ﺗﻌﻤﻞ ﺍﻟﺪﺍﻟﺘﺎﻥ‬
‫‪ ( )pop‬ﻭ ‪ push‬ﻋﻠﻰ ﺍﻟﺘﻮﺍﱄ؟‬
‫ﻗﻢ ﺑﺘﺤﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ ‪ * ، - ، +‬ﻭ ‪ /‬ﲝﻴﺚ ﺗﻘﻮﻡ ﺑﺈﺟﺮﺍﺀ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﰲ ﻓﺌﺔ‬ ‫‪-3‬‬
‫ﺗﺪﻋﻰ ‪ complex‬ﲤﺜﻞ ﺍﻷﻋﺪﺍﺩ ﺍﳌﺮﻛﺒﺔ )‪ (complex number‬ﺍﻟﱵ ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ‬
‫‪real part + imaginary part *I‬‬
‫ﺣﻴﺚ ‪1√ = i‬‬

‫‪171‬‬
‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﺘﺎﺳﻌﺔ‬
‫‪9.0‬‬
‫‪Inheritance & Polymorphism‬‬ ‫ﺍﻟﻮﺭﺍﺛﺔ ﻭﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ‬

‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪:‬‬

‫ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻣﻔﻬﻮﻡ ﺍﻟﻮﺭﺍﺛﺔ ﰲ ﻟﻐﺔ ‪.C++‬‬


‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﺗﻮﻓﲑ ﺍﻟﻮﺭﺍﺛﺔ ﻟﻘﺎﺑﻠﻴﺔ ﺇﻋﺎﺩﺓ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻔﺌﺎﺕ‪.‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻣﻔﻬﻮﻡ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ )‪ (base class‬ﻭﺍﻟﻔﺌﺔ‬
‫ﺍﳌﺸﺘﻘﺔ)‪.(derived class‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻮﺭﺍﺛﺔ ﺍﳌﺘﻌﺪﺩﺓ ﻻﺷﺘﻘﺎﻕ ﻓﺌﺔ ﻣﻦ ﻓﺌﺘﲔ ﻗﺎﻋﺪﺗﲔ ﺃﻭ‬
‫ﺃﻛﺜﺮ‪.‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻣﻔﻬﻮﻡ ﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ)‪ (polymorphism‬ﰲ ﻟﻐﺔ ‪. C++‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ‪(virtual‬‬
‫)‪. functions‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﺍﻟﻨﻘﻴﺔ ‪(pure‬‬
‫)‪ virtual functions‬ﻹﻧﺸﺎﺀ ﻓﺌﺎﺕ ﲡﺮﻳﺪﻳﺔ )‪.(abstract classes‬‬

‫‪172‬‬
‫ﻣﻘﺪﻣﺔ‬ ‫‪9.1‬‬

‫ﺍﻟﻮﺭﺍﺛﺔ ﻫﻲ ﺍﳌﻔﻬﻮﻡ ﺍﻟﺮﺋﻴﺴﻲ ﺑﻌﺪ ﺍﻟﻔﺌﺎﺕ ﰲ ‪ OOP‬ﺇﻻ ﺃ‪‬ﺎ ﻋﻤﻠﻴﹰﺎ ﺗﺸﻜﻞ ﺍﻟﻘﻮﺓ ﺍﻟﺪﺍﻓﻌﺔ‬
‫ﳌﺒﺪﺃ ﺍﻟﱪﳎﺔ ﻛﺎﺋﻨﻴﺔ ﺍﳌﻨﺤﻰ ﻭﺗﻌﺘﻤﺪ ﻓﻜﺮﺓ ﺍﻟﻮﺭﺍﺛﺔ ﻋﻠﻰ ﺇﻣﻜﺎﻧﻴﺔ ﺇﻧﺸﺎﺀ ﻓﺌـﺎﺕ ﺟﺪﻳـﺪﺓ ﺗﻜـﻮﻥ‬
‫ﻼ ﻭﺫﻟﻚ ﲜﻌﻞ ﺍﻟﻔﺌﺔ ﺍﳉﺪﻳﺪﺓ ﺗﺮﺙ ﻛﻞ ﺻﻔﺎﺕ ﺍﻟﻔﺌﺔ‬ ‫ﻣﺸﺘﺮﻛﺔ ﰲ ﺻﻔﺎﺕ ﻣﻊ ﻓﺌﺎﺕ ﻣﻮﺟﻮﺩﺓ ﺃﺻ ﹰ‬
‫ﺍﻟﻘﺪﳝﺔ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺻﻔﺎ‪‬ﺎ ﺍﳋﺎﺻﺔ ‪‬ﺎ ﻓﺒﺪ ﹰﻻ ﻣﻦ ﻛﺘﺎﺑﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﳌﺸﺘﺮﻛﺔ ﻣﺮﺓ‬
‫ﺃﺧﺮﻯ ﰲ ﺍﻟﻔﺌﺔ ﺍﳉﺪﻳﺪﺓ ﺗﺮﺙ ﺍﻟﻔﺌﺔ ﺍﳉﺪﻳﺪﺓ ﻭﺍﻟﱵ ﺗﺴﻤﻰ ﺑﺎﻟﻔﺌﺔ ﺍﳌﺸـﺘﻘﺔ ‪derived class‬‬
‫ﻼ ﻭﺍﻟﱵ ﻳﺮﻣﺰ ﳍﺎ ﺑﺎﻟﻔﺌـﺔ ﺍﻟﻘﺎﻋـﺪﺓ ‪base‬‬ ‫ﻛﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻣﻦ ﺍﻟﻔﺌﺔ ﺍﳌﻌﺮﻓﺔ ﺃﺻ ﹰ‬
‫‪.class‬‬
‫ﻋﺎﺩﺓ ﺗﻀﻴﻒ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﺑﻴﺎﻧﺎﺕ ﻭﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ ﺧﺎﺻﺔ ‪‬ﺎ ﻭﻋﻠﻴﻪ ﺗﻜﻮﻥ ﺍﻟﻔﺌﺔ ﺍﳌﺸـﺘﻘﺔ‬
‫ﺃﻛﱪ ﻣﻦ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ‪.‬‬
‫ﳒﺪ ﺃﻥ ﻛﻞ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻫﻮ ﺑﺎﻟﻀﺮﻭﺭﺓ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻭﻟﻜﻦ ﺍﻟﻌﻜـﺲ‬
‫ﻼ ﻓﺌـﺔ‬
‫ﻏﲑ ﺻﺤﻴﺢ ﻓﻜﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﲢﻤﻞ ﺻﻔﺎﺕ ﺃﻛﺜﺮ ﻣﻦ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﺍﳌﺴﺘﻄﻴﻞ ﻫﻲ ﻓﺌﺔ ﻣﺸﺘﻘﺔ ﻣﻦ ﻓﺌﺔ ﺍﻷﺷﻜﺎﻝ ﺍﻟﺮﺑﺎﻋﻴﺔ ﻭﻋﻠﻴﻪ ﳝﻜﻦ ﺍﻟﻘﻮﻝ ﺃﻥ ﺃﻱ ﻣﺴـﺘﻄﻴﻞ ﻫـﻮ‬
‫ﺷﻜﻞ ﺭﺑﺎﻋﻲ ﻭﻻ ﳝﻜﻨﻨﺎ ﺍﻟﻘﻮﻝ ﺃﻥ ﺃﻱ ﺷﻜﻞ ﺭﺑﺎﻋﻲ ﻫﻮ ﻣﺴﺘﻄﻴﻞ‪.‬‬
‫ﺍﻟﺸﻜﻞ )‪ (8-1‬ﻳﻮﺿﺢ ﺍﻟﻌﻼﻗﺔ ﺑﲔ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻭﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ‪.‬‬

‫ﻓﺌﺔ ﺍﻷﺷﻜﺎﻝ‬

‫ﻓﺌﺔ ﺍﻷﺷﻜﺎﻝ ﺛﻨﺎﺋﻴﺔ ﺍﻷﺑﻌﺎﺩ‬ ‫ﻓﺌﺔ ﺍﻷﺷﻜﺎﻝ ﺛﻼﺛﻴﺔ ﺍﻷﺑﻌﺎﺩ‬

‫ﻓﺌﺔ ﺍﻟﺪﺍﺋﺮﺓ‬ ‫ﻓﺌﺔ ﺍﳌﺴﺘﻄﻴﻞ‬ ‫ﻓﺌﺔ ﺍﳌﺮﺑﻊ‬ ‫ﻓﺌﺔ ﺍﻟﺸﻜﻞ ﺍﻟﻜﺮﻭﻱ‬ ‫ﻓﺌﺔ ﺍﳌﻜﻌﺐ‬

‫ﺷﻜﻞ )‪ (8-1‬ﻳﻮﺿﺢ ﺍﻟﻌﻼﻗﺔ ﺑﲔ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻭﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ‬

‫‪173‬‬
‫ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﻻﺷﺘﻘﺎﻕ ﻓﺌﺔ ﻣﻦ ﻓﺌﺔ ﻗﺎﻋﺪﺓ ﻫﻮ‪:‬‬
‫‪class derived-class-name : access base-class-name‬‬
‫{‬
‫‪body of class‬‬
‫;}‬
‫ﲢﺪﺩ ‪ access‬ﻭ ﺗﺴﻤﻰ ﳏﺪﺩ ﻭﺻﻮﻝ ﺇﻣﻜﺎﻧﻴﺔ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋـﺪﺓ‬
‫‪،‬ﻭﻫﻰ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺇﻣﺎ ‪ public‬ﺃﻭ ‪ private‬ﺃﻭ ‪ protected‬ﻭﺇﺫﺍ ﱂ ﻳﺘﻢ ﲢﺪﻳـﺪﻫﺎ‬
‫ﻓﺴﻴﻔﺘﺮﺽ ﺍﳌﺼﺮﻑ ﺃﻥ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﻫﻮ ‪. private‬‬
‫ﻋﻨﺪﻣﺎ ﻳﺴﺘﺨﺪﻡ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ‪ public‬ﺗﺴﻤﻰ ﺍﻟﻮﺭﺍﺛﺔ ﻋﺎﻣـﺔ‪ ،‬ﻋﻨـﺪﻣﺎ ﻳﺴـﺘﺨﺪﻡ ﺍﶈـﺪﺩ‬
‫‪ private‬ﺗﺴﻤﻰ ﺍﻟﻮﺭﺍﺛﺔ ﺧﺎﺻﺔ ﻭﻋﻨﺪﻣﺎ ﻳﺴﺘﺨﺪﻡ ﳏﺪﺩ ﺍﻟﻮﺻـﻮﻝ ‪ protected‬ﺗﺴـﻤﻰ‬
‫ﺍﻟﻮﺭﺍﺛﺔ ﳏﻤﻴﺔ‪.‬‬

‫ﺇﺫﺍ ﻛﺎﻥ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﻋﺎﻡ ‪ public‬ﺗﺴﻤﻰ ﺍﻟﻮﺭﺍﺛﺔ ﻭﺭﺍﺛﺔ ﻋﺎﻣﺔ ﻭﻓﻴﻬﺎ ﺗـﺘﻢ ﻭﺭﺍﺛـﺔ‬
‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﻌﺎﻣﺔ ﻭﺍﶈﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻛﺄﻋﻀﺎﺀ ﻋﺎﻣﺔ ﻭﳏﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻭﻟﻜﻦ ﰲ ﻛـﻞ‬
‫ﺍﻷﺣﻮﺍﻝ ﺍﻷﻋﻀﺎﺀ ﺍﳋﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺗﺒﻘﻰ ﺧﺎﺻﺔ ﺑﺎﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻭﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ‬
‫ﻣﻦ ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ‪ .‬ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺘﻀﺢ ﻟﻨﺎ ﺃﻥ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﺘﺎﺑﻌﺔ ﻟﻠﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﳝﻜﻨـﻬﺎ‬
‫ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﻌﺎﻣﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﻟﻮﺭﺍﺛﺔ ﻋﺎﻣﺔ‪ .‬ﻟﻨﺘﺎﺑﻊ ﻫـﺬﺍ ﺍﻟﱪﻧـﺎﻣﺞ‬
‫ﺟﻴﺪﹰﺍ‪.‬‬

‫‪174‬‬
//Program 9-1:
#include <iostream.h>
class base {
int i , j;
public:
void set( int a , int b) { i= a; j= b; }
void show( ) { cout<<i << " " << j << "\n"; }
};
class derived : public base {
int k;
public:
derived (int x) { k=x; }
void showk( ) { cout << k << "\n" ; }
};
int main( )
{
derived ob(3);
ob.set(1 ,2); // access member of base
ob.show( ); // access member of base

ob.showk( ); //uses member of derived class


return 0;
}

: ‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

1 2
3

175
‫ ﺇﻻ ﺃﻧـﻪ‬derived ‫ ﻫﻮ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ‬ob ‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ‬
‫ ﻭﺫﻟـﻚ‬base ‫ ﰲ ﺍﻟﻔﺌﺔ‬show( ) ‫ ﻭ‬set( ) ‫ﺍﺳﺘﻄﺎﻉ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﻌﺎﻣﺔ‬
.‫ﻷﻥ ﺍﻟﻮﺭﺍﺛﺔ ﻋﺎﻣﺔ‬
‫ ﺗﺴﻤﻰ ﺍﻟﻮﺭﺍﺛﺔ ﺧﺎﺻﺔ ﻭﻋﻠﻴﻪ ﻛﻞ ﺍﻷﻋﻀـﺎﺀ‬private ‫ﺇﺫﺍ ﻛﺎﻥ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﺧﺎﺹ‬
. ‫ﺍﻟﻌﺎﻣﺔ ﻭﺍﶈﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺗﺼﺒﺢ ﺃﻋﻀﺎﺀ ﺧﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ‬

‫ ﻫـﻲ ﺍﻵﻥ‬show( )‫ ﻭ‬set( ) ‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻟﻦ ﻳﻌﻤﻞ ﻭﺫﻟﻚ ﻷﻥ ﻛﻞ ﻣﻦ ﺍﻟﺪﻭﺍﻝ‬


.‫ﺧﺎﺻﺔ ﺑﺎﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ‬

//Program 9-2:
// This program won't compile.
#include<iostream.h>
class base {
//Continued
int i , j;
public:
void set( int a , int b) { i= a; j= b; }
void show( ) { cout<<i << " " << j << " \n "; }
};
// Public elements of base are private in derived.
Class derived : private base {
Int k;
Public:
derived (int x) { k=x; }
void showk( ) { cout << k << " \n " ; }
};
int main( )
{
derived ob(3);
ob.set(1 ,2); // error, can’t access set( )
ob.show( ); // error, can’t access show( )
return 0;
}

176
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻻ ﻳﻌﻤﻞ ﻷﻥ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ) (‪ set‬ﻭ ) (‪ show‬ﻫﻲ ﺍﻵﻥ ﺧﺎﺻﺔ ﺑﺎﻟﻔﺌﺔ ‪ base‬ﻷﻥ‬
‫ﺍﻟﻮﺭﺍﺛﺔ ﺧﺎﺻﺔ ﻭﺑﺎﻟﺘﺎﱄ ﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻣﻦ ﻛﺎﺋﻦ ﺍﻟﻔﺌﺔ ‪ derived‬ﺍﳌﺴـﻤﻰ ‪ ، ob‬ﻭﻋﻠﻴـﻪ‬
‫ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ ﻟﻴﺴﺖ ﺻﺤﻴﺤﺔ‪.‬‬
‫;)‪ob.set(1 ,2‬‬
‫;) (‪ob.show‬‬

‫ﰲ ﺍﻟﻮﺭﺍﺛﺔ ﺍﳋﺎﺻﺔ ﺍﻷﻋﻀﺎﺀ ﺍﻟﻌﺎﻣﺔ ﻭﺍﶈﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺗﺼﺒﺢ ﺃﻋﻀﺎﺀ ﺧﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻭﻋﻠﻴﻪ ﳝﻜﻦ‬

‫ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻣﻦ ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻭﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻓﻘﻂ ﻭﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻣﻦ ﻗﺒﻞ ﺍﻷﻋﻀﺎﺀ ﰲ ﺍﻟﻔﺌﺎﺕ‬

‫ﺍﻷﺧﺮﻯ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬

‫‪177‬‬
‫ﺍﻟﻮﺭﺍﺛﺔ ﺍﶈﻤﻴﺔ‬
9.2
Protected Inheritance

‫( ﺗﺴﻤﻰ ﺍﻟﻮﺭﺍﺛﺔ ﳏﻤﻴﺔ ﻭﻋﻨﺪﻫﺎ ﻛـﻞ‬protected) ‫ﺇﺫﺍ ﻛﺎﻥ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﳏﻤﻰ‬
‫ ﺃﻱ ﳝﻜـﻦ‬،‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﻌﺎﻣﺔ ﻭﺍﶈﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺗﺼﺒﺢ ﺃﻋﻀﺎﺀ ﳏﻤﻴﺔ ﰲ ﺍﻟﻔﺌـﺔ ﺍﳌﺸـﺘﻘﺔ‬
:‫ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺫﻟﻚ‬،‫ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ‬
//Program 9-3:
#include <iostream.h>
#include <conio.h>
class base {
protected:
int i ,j ; //private to base , but accessible by derived
public:
void setij( int a , int b) { i= a; j= b; }
void showij( ) { cout<<i << " " << j << "\n"; }
};
// Inherit base as protected.
class derived : protected base {
int k;
public:
// derived may access base's i and j and setij( ).
void setk( ) { setij( 10, 12) ; k = i*j; }
//may access showij( ) here
void showall( ) { cout << k<< " "<<endl ; showij( ) ; }
};
int main ( )
{
derived ob ;
// ob.setij(2, 3) ; // illegal, setij( ) is
// protected member of derived
ob.setk( ) ; // ok , public member of derived
ob.showall( ) ; // ok , public member of derived
//ob.showij( ); // illegal, showij( ) is protected

178
‫‪// member of derived‬‬
‫‪//Continued‬‬
‫; ‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ‪:‬‬

‫‪120‬‬
‫‪10‬‬ ‫‪12‬‬

‫ﻛﻤﺎ ﺭﺃﻳﺖ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﺑﺎﻟﺮﻏﻢ ﻣﻦ ﺃﻥ ﺍﻟﺪﻭﺍﻝ ) (‪ setij‬ﻭ ) (‪ showij‬ﻫﻲ‬


‫ﺃﻋﻀﺎﺀ ﻋﺎﻣﺔ ﰲ ﺍﻟﻔﺌﺔ ‪ base‬ﺇﻻ ﺃ‪‬ﺎ ﺃﺻﺒﺤﺖ ﳏﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻷﻧﻨﺎ ﺍﺳﺘﺨﺪﻣﻨﺎ ﺍﻟﻮﺭﺍﺛـﺔ‬
‫ﺍﶈﻤﻴﺔ ﻭﻋﻠﻴﻪ ﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﻫﺬﻩ ﺍﻷﻋﻀﺎﺀ ﻣﻦ ﻗﺒﻞ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ‪.derived‬‬

‫ﺍﻟﻮﺭﺍﺛﺔ ﻭﺍﻷﻋﻀﺎﺀ ﺍﶈﻤﻴﺔ‬ ‫‪9.3‬‬


‫‪Inheritance and protected members‬‬
‫ﻋﻨﺪﻣﺎ ﻳﺘﻢ ﺍﻹﻋﻼﻥ ﻋﻦ ﻋﻀﻮ ﰲ ﻓﺌﺔ ﻣﺎ ﻋﻠﻰ ﺍﻧﻪ ﳏﻤـﻰ ‪ protected‬ﻻ ﳝﻜـﻦ‬
‫ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﻫﺬﺍ ﺍﻟﻌﻀﻮ ﻣﻦ ﻗﺒﻞ ﺍﻷﻋﻀﺎﺀ ﺧﺎﺭﺝ ﺍﻟﻔﺌﺔ ﲤﺎﻣﹰﺎ ﻛﺎﻟﻌﻀﻮ ﺍﳋﺎﺹ ‪ private‬ﻭﻟﻜﻦ‬
‫ﻫﻨﺎﻟﻚ ﺍﺳﺘﺜﻨﺎﺀ ﻫﺎﻡ ‪ ،‬ﻓﻔﻲ ﺍﻟﻮﺭﺍﺛﺔ ﺍﻟﻌﺎﻣﺔ ﰲ ﺣﲔ ﺃﻥ ﺍﻟﻌﻀﻮ ﺍﳋﺎﺹ ﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻪ ﺣـﱴ‬
‫ﻣﻦ ﺍﻷﻋﻀﺎﺀ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ‪ ،‬ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﻌﻀﻮ ﺍﶈﻤﻰ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋـﺪﺓ ﻣـﻦ ﻗﺒـﻞ‬
‫ﺍﻷﻋﻀﺎﺀ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ‪ .‬ﻭﻋﻠﻴﻪ ﺑﺎﺳﺘﺨﺪﺍﻡ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ‪ protected‬ﳝﻜﻨـﻚ ﺗﻌﺮﻳـﻒ‬
‫ﺃﻋﻀﺎﺀ ﺧﺎﺻﺔ ﺑﺎﻟﻔﺌﺔ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ ﰲ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ ﻭﺇﻟﻴﻚ ﺍﻟﱪﻧـﺎﻣﺞ‬
‫ﺍﻟﺬﻱ ﻳﻮﺿﺢ ﺫﻟﻚ‪:‬‬

‫‪//Program 9-4:‬‬
‫>‪#include <iostream.h‬‬
‫{ ‪class base‬‬
‫‪protected:‬‬
‫‪int i ,j ; //private to base , but accessible by derived‬‬
‫‪public:‬‬

‫‪179‬‬
void set ( int a , int b) { i= a; j= b; }
//Continued
void show( ) { cout<<i << " " << j << "\n"; }
};
class derived : public base {
int k;
public:
// derived may access base's i and j
void setk( ) {k=i*j ;}
void showk( ) { cout <<k << " \n " ;}
};
int main( )
{
derived ob;
ob.set(2, 3) ; // ok, known to derived
ob.show( ) ; // ok, known to derived
ob.setk( );
ob.showk( );
int d;
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

2 3
6

‫ ﻭﺭﺍﺛﺔ ﻋﺎﻣﺔ ﻭ ﰎ ﺍﻹﻋﻼﻥ‬base ‫ ﻣﻦ ﺍﻟﻔﺌﺔ‬derived ‫ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﲤﺖ ﻭﺭﺍﺛﺔ ﺍﻟﻔﺌﺔ‬


‫ ﻭﻟـﺬﻟﻚ‬derived ‫ ﰲ ﺍﻟﻔﺌﺔ‬setk( ) ‫ﺎ ﳏﻤﻴﺔ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ‬‫ ﻋﻠﻰ ﺃ‬j ‫ ﻭ‬i ‫ﻋﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
. ‫ﳝﻜﻦ ﻟﻠﻌﻀﻮ ﺍﻟﺪﺍﱄ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﻫﺬﻩ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

180
‫ﺍﳌﺸﻴﺪﺍﺕ ﻭﺍﳌﻬﺪﻣﺎﺕ ﻭﺍﻟﻮﺭﺍﺛﺔ‬ 9.4

‫ﻣﻦ ﺍﳌﻬﻢ ﺃﻥ ﻧﻌﺮﻑ ﺗﺮﺗﻴﺐ ﺗﻨﻔﻴﺬ ﺩﻭﺍﻝ ﺍﳌﺸﻴﺪﺍﺕ ﻭﺍﳌﻬﺪﻣﺎﺕ ﻋﻨﺪ ﺇﻧﺸﺎﺀ ﻛﺎﺋﻦ ﺗـﺎﺑﻊ‬
:‫ ﻟﻨﺒﺪﺃ ﺑﺪﺭﺍﺳﺔ ﺍﻟﱪﻧﺎﻣﺞ‬، ‫ﻟﻠﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ‬

//Program 9-5:
#include <iostream.h>
class base {
public:
base ( ) { cout << "Constructing base \n";}
~ base( ) { cout << "Destructing base\n" ; }
};
class derived : public base {
public:
derived( ) { cout <<"Constructing derived\n" ; }
~derived( ) { cout<< "Destructing derived\n" ; }
};
int main ( )
{
derived ob;
// do nothing but construct and destruct ob
return 0;
}

‫ ﻳﺘﻀﺢ ﻟﻨﺎ ﺃﻥ ﺍﻟﱪﻧﺎﻣﺞ ﻳﺸﻴﺪ ﰒ ﻳﻬﺪﻡ ﻛﺎﺋﻨـﹰﺎ‬main( ) ‫ﻣﻦ ﺍﻟﺘﻌﻠﻴﻖ ﺍﳌﻜﺘﻮﺏ ﰲ ﺍﻟﺪﺍﻟﺔ‬
. derived ‫ ﺗﺎﺑﻊ ﻟﻠﻤﺸﺘﻘﺔ‬ob ‫ﻳﺪﻋﻰ‬
:‫ﻓﺎﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻜﻮﻥ ﻛﺎﻟﺘﺎﱄ‬
Constructing base
Constructing derived
Destructing derived
Destructing base

181
‫ﻛﻤﺎ ﺗﺮﻯ ﻣﻦ ﺧﺮﺝ ﺍﻟﱪﻧﺎﻣﺞ ﰎ ﺗﻨﻔﻴﺬ ﻣﺸﻴﺪ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻳﻠﻴﻪ ﻣﺸﻴﺪ ﺍﻟﻔﺌـﺔ ﺍﳌﺸـﺘﻘﺔ‬
.‫ﻭﻟﻜﻦ ﰎ ﺗﻨﻔﻴﺬ ﻣﻬﺪﻡ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻗﺒﻞ ﻣﻬﺪﻡ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ‬،
‫ ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﳌﺸﻴﺪﺍﺕ ﺑﺘﺮﺗﻴﺐ ﺍﺷﺘﻘﺎﻕ ﺍﻟﻔﺌﺎﺕ ) ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ‬-:‫ﻭﻋﻤﻮﻣﹰﺎ ﺍﻟﻘﺎﻋﺪﺓ ﻫﻲ‬
، ‫ﰒ ﺍﳌﺸﺘﻘﺔ ﰒ ﺍﳌﺸﺘﻘﺔ ﻣﻨﻬﺎ ﻭﻫﻜﺬﺍ( ﺑﻴﻨﻤﺎ ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﳌﻬﺪﻣﺎﺕ ﺑﻌﻜﺲ ﺗﺮﺗﻴـﺐ ﺍﻻﺷـﺘﻘﺎﻕ‬
:‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺫﻟﻚ‬

//Program 9-6:
#include<iostream.h>
class base {
public:
base ( ) { cout << " Constructing base \n ";}
~base( ) { cout << " Destructing base\n " ; }
};
class derived1 : public base {
public:
derived1 ( ) { cout " Constructing derived1\n " ; }
~derived1 ( ) { cout " Destructing derived1\n " ; }
};
class derived2 : public derived1 {
public:
derived2 ( ) { cout " Constructing derived2\n " ; }
~derived2 ( ) { cout " Destructing derived2\n " ; }
};
int main ( )
{
derived2 ob;
// construct and destruct ob
return 0;
}

182
:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

Constructing base
Constructing derived1
Constructing derived2
Destructing derived2
Destructing derived1
Destructing base

‫ﺍﻟﻮﺭﺍﺛﺔ ﺍﳌﺘﻌﺪﺩﺓ‬
Multiple Inheritance
9.5

:‫ﲢﺪﺙ ﺍﻟﻮﺭﺍﺛﺔ ﺍﳌﺘﻌﺪﺩﺓ ﻋﻨﺪﻣﺎ ﺗﺮﺙ ﻓﺌﺔ ﻣﺎ ﻣﻦ ﻓﺌﺘﲔ ﻗﺎﻋﺪﺗﲔ ﺃﻭ ﺃﻛﺜﺮ ﻛﺎﻟﺘﺎﱄ‬
class base1
{ };
class base2
{ };
class derived: public base1, public base2
{ };
‫ ﻳﺘﻢ ﰲ ﻣﻮﺍﺻﻔﺎﺕ ﺍﻟﻔﺌﺔ‬. base2‫ ﻭ‬base1 ‫ ﻣﺸﺘﻘﺔ ﻣﻦ ﺍﻟﻔﺌﺘﲔ‬derived ‫ﺍﻟﻔﺌﺔ‬
‫ ﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﻫﻨﺎﻟﻚ ﳏﺪﺩ‬. ‫ﺍﳌﺸﺘﻘﺔ ﻓﺼﻞ ﺍﻟﻔﺌﺎﺕ ﺍﻟﻘﺎﻋﺪﺓ ﻋﻦ ﺑﻌﻀﻬﺎ ﺍﻟﺒﻌﺾ ﺑﻮﺍﺳﻄﺔ ﻓﺎﺻﻠﺔ‬
.‫ﻭﺻﻮﻝ ﻟﻜﻞ ﻓﺌﺔ ﻗﺎﻋﺪﺓ‬
.‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﻛﻴﻔﻴﺔ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻮﺭﺍﺛﺔ ﺍﳌﺘﻌﺪﺩﺓ‬

//Program 9-7:
// An example of multiple base classes.
#include<iostream.h>
class base1 {
protected:
int x;

183
public:
//Continued
void showx( ) { cout << x<< " \n " ; }
};
class base2 {
protected:
int y;
public:
void showy( ) { cout << y<< " \n " ; }
} ;
// Inherit multiple base classes .
class derived: public base1 , public base2 {
public:
void set (int i , int j ) { x=i; y=j ; }
};
int main ( )
{
derived ob ;
ob.set(10, 20) ; // provided by derived
ob.showx( ) ; // from base1
ob.showy( ) ; //from base2
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬
10
20

base2 ‫ ﻭ‬base1 ‫ ﺍﻟﻔﺌـﺘﲔ‬derived ‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻭﺭﺛﺖ ﺍﻟﻔﺌﺔ‬


‫ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ‬derived ‫ ﺍﻟﺬﻱ ﻳﺘﺒﻊ ﻟﻠﻔﺌﺔ‬ob ‫ ﻟﺬﻟﻚ ﳝﻜﻦ ﻟﻠﻜﺎﺋﻦ‬،‫ﻭﺭﺍﺛﺔ ﻋﺎﻣﺔ‬
. base2 ‫ ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﺌﺔ‬showy( ) ‫ ﻭ‬base1 ‫ ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﺌﺔ‬showx( ) ‫ﺍﻟﻌﺎﻣﺔ‬

184
‫ﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ‬ ‫‪9.6‬‬
‫‪Polymorphism‬‬
‫ﻫﻨﺎﻟﻚ ﺛﻼﺛﺔ ﻣﻔﺎﻫﻴﻢ ﺭﺋﻴﺴﻴﺔ ﰲ ﺍﻟﱪﳎﺔ ﺍﻟﻜﺎﺋﻨﻴﺔ ﺍﳌﻨﺤﻰ ‪ .‬ﺍﻷﻭﻝ ﻫﻮ ﺍﻟﻔﺌـﺎﺕ ﻭﺍﻟﺜـﺎﱐ‬
‫ﺍﻟﻮﺭﺍﺛﺔ ﺳﻨﻨﺎﻗﺶ ﻫﻨﺎ ﺍﳌﻔﻬﻮﻡ ﺍﻟﺜﺎﻟﺚ ‪ :‬ﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ ﺍﳊﻘﻴﻘﻲ ﻳﺘﻢ ﺗﻄﺒﻴﻘﻪ ﰲ ‪ C++‬ﻣﻦ ﺧـﻼﻝ‬
‫ﺍﻟﺪﺍﻻﺕ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ‪.virtual functions‬‬
‫ﻳﻮﺟﺪ ﰲ ﺍﳊﻴﺎﺓ ﺍﻟﻔﻌﻠﻴﺔ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻧﻮﺍﻉ ﺍﳌﺨﺘﻠﻔﺔ ﻣﻦ ﺍﻷﺷﻴﺎﺀ ﻭﺍﻟﱵ ﻋﻨﺪ ﺇﻋﻄﺎﺋﻬـﺎ‬
‫ﺗﻌﻠﻴﻤﺎﺕ ﻣﺘﻄﺎﺑﻘﺔ ﺗﺘﺼﺮﻑ ﺑﻄﺮﻕ ﳐﺘﻠﻔﺔ ‪ ،‬ﰲ ‪ C++‬ﻋﺎﺩﺓ ﳛﺪﺙ ﺗﻌﺪﺩ ﺍﻷﺷـﻜﺎﻝ ﰲ ﺍﻟﻔﺌـﺎﺕ‬
‫ﺍﳌﺮﺗﺒﻄﺔ ﺑﺒﻌﻀﻬﺎ ﺍﻟﺒﻌﺾ ﺑﺴﺒﺐ ﺍﻟﻮﺭﺍﺛﺔ ﻭﻫﺬﺍ ﻳﻌﲎ ﺃﻥ ﺍﺳﺘﺪﻋﺎﺀ ﻋﻀﻮ ﺩﺍﱄ ﺳﻴﺆﺩﻯ ﺇﱃ ﺗﻨﻔﻴﺬ ﺩﺍﻟﺔ‬
‫ﳐﺘﻠﻔﺔ ﻭﻓﻘﹰﺎ ﻟﻨﻮﻉ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﺍﺳﺘﺪﻋﻰ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ‪.‬‬
‫ﻳﺒﺪﻭ ﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ ﺷﺒﻴﻬﹰﺎ ﺑﺘﺤﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ‪ ،‬ﻟﻜﻦ ﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ ﺁﻟﻴـﺔ‬
‫ﳐﺘﻠﻔﺔ ﻭﺃﻛﺜﺮ ﻓﻌﺎﻟﻴﺔ ﻓﻌﻨﺪ ﲢﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺍﳌﺼﺮﻑ ﻫﻮ ﺍﻟﺬﻱ ﳛﺪﺩ ﺍﻟﺪﺍﻟﺔ ﺍﻟﱵ ﺳﻴﺘﻢ‬
‫ﺗﻨﻔﻴﺬﻫﺎ ﺑﻴﻨﻤﺎ ﰲ ﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ ﻳﺘﻢ ﺍﺧﺘﻴﺎﺭ ﺍﻟﺪﺍﻟﺔ ﺍﳌﻄﻠﻮﺏ ﺗﻨﻔﻴﺬﻫﺎ ﺃﺛﻨﺎﺀ ﺗﺸﻐﻴﻞ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬

‫ﺍﻟﺪﺍﻻﺕ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ‬
‫‪9.7‬‬
‫‪Virtual Functions‬‬

‫ﻫﻲ ﺩﻭﺍﻝ ﻳﺘﻢ ﺗﻌﺮﻳﻔﻬﺎ ﺿﻤﻦ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﰲ ﻓﺌﺔ ﻗﺎﻋﺪﺓ ‪ base‬ﻭﻳﻌﺎﺩ ﺗﻌﺮﻳﻔﻬـﺎ ﰲ‬
‫ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ‪ .‬ﻹﻧﺸﺎﺀ ‪ virtual function‬ﺗﻘﻮﻡ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﺑﺈﻋﺎﺩﺓ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﲟـﺎ‬
‫ﻳﺘﻮﺍﻓﻖ ﻣﻊ ﻣﺘﻄﻠﺒﺎ‪‬ﺎ ‪.‬‬
‫*** ﻋﻨﺪﻣﺎ ﻳﻌﻠﻦ ﻋﻦ ﻣﺆﺷﺮ ﻟﻴﺸﲑ ﺇﱃ ﻛﺎﺋﻨﺎﺕ ﻓﺌﺔ ﻗﺎﻋﺪﺓ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﻧﻔﺲ ﺍﳌﺆﺷﺮ ﻟﻴﺸـﲑ‬
‫ﺇﱃ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ ﻭﻋﻠﻴﻪ ﻋﻨﺪﻣﺎ ﻳﺸﲑ ﻣﺆﺷﺮ ﻓﺌﺔ ﻗﺎﻋﺪﺓ ﺇﱃ ﻛﺎﺋﻦ ﰲ ﻓﺌﺔ ﻣﺸﺘﻘﺔ ﻣﻨـﻬﺎ‬
‫ﲢﺘﻮﻯ ﻋﻠﻰ ‪ virtual function‬ﲢﺪﺩ ‪ C++‬ﺍﻟﺪﺍﻟﺔ ﺍﳌﻄﻠﻮﺏ ﺗﻨﻔﻴﺬﻫﺎ ﻭﻓﻘﹰﺎ ﶈﺘﻮﻳﺎﺕ ﺍﳌﺆﺷﺮ‬
‫)ﻧﻮﻉ ﺍﻟﻜﺎﺋﻦ ﺍﳌﺸﺎﺭ ﺇﻟﻴﻪ ﺑﻮﺍﺳﻄﺔ ﺍﳌﺆﺷﺮ( ﻭﻳﺘﻢ ﻫﺬﺍ ﺍﻟﺘﺤﺪﻳﺪ ﺃﺛﻨﺎﺀ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﻭﻋﻠﻴﻪ ﻋﻨـﺪﻣﺎ‬
‫ﻳﺴﺘﻌﻤﻞ ﻣﺆﺷﺮ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻟﻴﺸﲑ ﺇﱃ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻋﺪﺓ ﺇﺻﺪﺍﺭﺍﺕ ﻣـﻦ‬
‫ﺍﻟﺪﺍﻟﺔ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﺑﻨﺎﺀﹰﺍ ﻋﻠﻰ ﳏﺘﻮﻳﺎﺕ ﺍﳌﺆﺷﺮ‪.‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺫﻟﻚ‪:‬‬

‫‪185‬‬
Program 9-8:
#include<iostream.h>
class base {
//Continued
public:
virtual void vfunc( ) {
cout << " This is base’s vfunc( ) .\n ";
}
};
class derived1 : public base {
public :
void vfunc( ) {
cout << " This is derived1’s vfunc( ) .\n ";
}
};
class derived2 : public base {
public :
void vfunc( ) {
cout << " This is derived2’s vfunc( ) .\n ";
}
};
int main( )
{
base *p, b;
derived1 d1;
derived2 d2;

// point to base
p= &b;
p->vfunc( ) ; // access base's vfunc( )
// point to derived1
p= &d1;
p->vfunc( ) ; // access derived1's vfunc( )
// point to derived2

186
‫;‪p= &d2‬‬
‫) (‪p->vfunc( ) ; // access derived2's vfunc‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪This is base’s vfunc( ).‬‬

‫‪This is derived’s vfunc( ).‬‬


‫‪This is derived’s vfunc( ).‬‬

‫ﺩﺍﺧﻞ ﺍﻟﻔﺌﺔ ‪ base‬ﰎ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ) (‪ . vfunc‬ﻻﺣـﻆ ﺃﻥ ﺍﻟﻜﻠﻤـﺔ‬


‫ﺍﻷﺳﺎﺳﻴﺔ ‪ virtual‬ﺗﺴﺒﻖ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﰲ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ ‪ .‬ﰎ ﺇﻋﺎﺩﺓ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ) (‪vfunc‬‬
‫ﰲ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ ‪ derived1‬ﻭ ‪. derived2‬‬
‫ﺩﺍﺧﻞ ﺍﻟﺪﺍﻟﺔ ‪ main‬ﰎ ﺍﻹﻋﻼﻥ ﻋﻦ ﺃﺭﺑﻌﺔ ﻣﺘﻐﲑﺍﺕ‪-:‬‬
‫ﻧﻮﻋﻪ‬ ‫ﺍﺳﻢ ﺍﳌﺘﻐﲑ‬
‫ﻣﺆﺷﺮ ﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ‪base‬‬ ‫‪p‬‬
‫ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪base‬‬ ‫‪b‬‬
‫ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪derived1‬‬ ‫‪d1‬‬
‫ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪derived2‬‬ ‫‪d2‬‬

‫ﰎ ﺗﻌﻴﲔ ﻋﻨﻮﺍﻥ ﺍﻟﻜﺎﺋﻦ ‪ b‬ﺇﱃ ﺍﳌﺆﺷﺮ ‪ p‬ﻭﰎ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟـﺔ ) (‪ vfunc‬ﺑﻮﺍﺳـﻄﺔ‬


‫ﺍﳌﺆﺷﺮ ‪ p‬ﻭﲟﺎ ﺃﻥ ﺍﳌﺆﺷﺮ ﺍﻵﻥ ﳛﻤﻞ ﻋﻨﻮﺍﻥ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪ base‬ﰎ ﺗﻨﻔﻴﺬ ﺇﺻﺪﺍﺭ ﺍﻟﺪﺍﻟـﺔ‬
‫) (‪ vfunc‬ﺍﳌﻌﺮﻑ ﰲ ﺍﻟﻔﺌﺔ ‪. base‬ﺑﻌﺪﻫﺎ ﰎ ﺗﻐﻴﲑ ﻗﻴﻤﺔ ﺍﳌﺆﺷﺮ ‪ p‬ﺇﱃ ﻋﻨﻮﺍﻥ ﺍﻟﻜـﺎﺋﻦ ‪d1‬‬
‫ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ‪ derived1‬ﺍﻵﻥ ﺳﻴﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻟﺪﺍﻟﺔ‬
‫) (‪derived1:: vfunc‬‬
‫ﺃﺧﲑﹰﺍ ﰎ ﺗﻌﻴﲔ ﻋﻨﻮﺍﻥ ﺍﻟﻜﺎﺋﻦ ‪ d2‬ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪ derived2‬ﺇﱃ ﺍﳌﺆﺷﺮ ‪ p‬ﻭﻋﻠﻴﻪ ﺍﻟﻌﺒﺎﺭﺓ‪:‬‬
‫;) (‪p -> func‬‬

‫‪187‬‬
‫ﺃﺩﺕ ﺇﱃ ﺗﻨﻔﻴﺬ ﺍﻟﺪﺍﻟﺔ‬
‫) (‪derived2:: vfunc‬‬
‫ﻣﻦ ﺍﻟﻨﻈﺮﺓ ﺍﻷﻭﱃ ﻗﺪ ﺗﺒﺪﻭ ﺍﻟﺪﻭﺍﻝ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﺷﺒﻴﻬﺔ ﺑﺘﺤﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋـﺪ ‪.‬‬
‫ﻭﻟﻜﻦ ﻋﻨﺪ ﲢﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﳚﺐ ﺃﻥ ﳜﺘﻠﻒ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻟﺪﺍﻟﺔ ﻣﻦ ﺩﺍﻟﺔ ﺇﱃ ﺃﺧﺮﻯ‬
‫ﰲ ﻧﻮﻉ ﺃﻭ ﻋﺪﺩ ﺍﻟﻮﺳﺎﺋﻂ ﺍﳌﻤﺮﺭﺓ ﺇﱃ ﺍﻟﺪﺍﻟﺔ ﺣﱴ ﻳﺴﺘﻄﻴﻊ ﺍﳌﺼﺮﻑ ﲢﺪﻳـﺪ ﺍﻟﺪﺍﻟـﺔ ﺍﳌﻄﻠـﻮﺏ‬
‫ﺗﻨﻔﻴﺬﻫﺎ ‪ ،‬ﺑﻴﻨﻤﺎ ﰲ ﺍﻟﺪﻭﺍﻝ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﳚﺐ ﺃﻥ ﻳﻄﺎﺑﻖ ﺇﻋﻼﻥ ﺍﻟﺪﺍﻟﺔ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﺍﳌﻌﺮﻓﺔ ﰲ ﺍﻟﻔﺌـﺔ‬
‫ﺍﻟﻘﺎﻋﺪﺓ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ ﰲ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ‪.‬‬

‫ﺗﺬﻛﺮ ﺩﺍﺋﻤﹰﺎ ﺃﻥ ﺍﻟﺪﺍﻟﺔ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ‪:‬‬


‫‪ /1‬ﻻ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﻋﻀﻮﹰﺍ ﺳﺎﻛﻨﹰﺎ ﰲ ﺍﻟﻔﺌﺔ ‪.static member‬‬ ‫‬

‫‪/2‬ﻻ ﳝﻜﻦ ﺃﻥ ﺗﻌﺮﻑ ﻛﺪﺍﻟﺔ ﺻﺪﻳﻘﺔ ‪.friend function‬‬ ‫‬

‫‪ /3‬ﻻ ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﳍﺎ ﻛﻤﺸﻴﺪ ‪.constructor‬‬ ‫‬

‫ﺍﻟﻔﺌﺎﺕ ﺍﻟﺘﺠﺮﻳﺪﻳﺔ‬
‫‪9.8‬‬
‫‪Abstract Classes‬‬

‫ﺗﺸﻜﻞ ﺍﻟﻔﺌﺎﺕ ﺍﻟﺘﺠﺮﻳﺪﻳﺔ ﻣﻔﻬﻮﻣﹰﺎ ﻗﻮﻳﹰﺎ ﰲ ‪ . OOP‬ﺍﻟﻔﺌﺔ ﺍﻟـﱵ ﻻ ﻳـﺘﻢ ﺇﻧﺸـﺎﺀ ﺃﻱ‬
‫ﻛﺎﺋﻨﺎﺕ ﻣﻨﻬﺎ ﺗﺴﻤﻰ ﻓﺌﺔ ﲡﺮﻳﺪﻳﺔ ‪ .‬ﺍﳍﺪﻑ ﺍﻟﻮﺣﻴﺪ ﳍﺬﻩ ﺍﻟﻔﺌﺔ ﻫﻮ ﺃﻥ ﺗﻠﻌﺐ ﺩﻭﺭ ﻓﺌﺔ ﻋﺎﻣﺔ ﻳـﺘﻢ‬
‫ﺍﺷﺘﻘﺎﻕ ﻓﺌﺎﺕ ﺃﺧﺮﻯ ﻣﻨﻬﺎ‪.‬‬

‫ﺍﻟﺪﺍﻻﺕ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﺍﻟﻨﻘﻴﺔ‬ ‫‪9.9‬‬


‫‪Pure virtual functions‬‬
‫ﺳﻴﻜﻮﻥ ﻣﻦ ﺍﳉﻴﺪ ﻟﻮ ﺍﺳﺘﻄﻌﻨﺎ ﰲ ﺣﺎﻝ ﺇﻧﺸﺎﺀ ﻓﺌﺔ ﻗﺎﻋﺪﺓ ﲡﺮﻳﺪﻳﺔ ﺃﻥ ﻧﺒﻠﻎ ﺍﳌﺼـﺮﻑ ﺃﻥ‬
‫ﳝﻨﻊ ﺃﻱ ﻣﺴﺘﺨﺪﻡ ﻟﻠﻔﺌﺔ ﻣﻦ ﺇﻧﺸﺎﺀ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﳍﺎ ‪ ،‬ﻳﺘﻢ ﺫﻟﻚ ﻣﻦ ﺧﻼﻝ ﺗﻌﺮﻳﻒ ﺩﺍﻟﺔ ﺇﻓﺘﺮﺍﺿـﻴﺔ‬
‫ﻧﻘﻴﺔ ﻭﺍﺣﺪﺓ ﻋﻠﻰ ﺍﻷﻗﻞ ﰲ ﺍﻟﻔﺌﺔ‪.‬‬
‫ﺍﻟﺪﺍﻟﺔ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﺍﻟﻨﻘﻴﺔ ﻫﻲ ﺩﺍﻟﺔ ﻟﻴﺲ ﳍﺎ ﺟﺴﻢ ‪ ،‬ﻳﺘﻢ ﺇﺯﺍﻟﺔ ﺟﺴﻢ ﺍﻟﺪﺍﻟﺔ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﰲ‬
‫ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ‪.‬‬
‫ﺍﻟﺼﻮﺭﺓ ﺍﻟﻌﺎﻣﺔ ﳍﺎ‪:‬‬

‫‪188‬‬
virtual type functionname (parameter-list) = 0;
‫=( ﻫﻮ ﻓﻘﻂ ﺇﺑﻼﻍ‬0) ‫ﻋﻼﻣﺔ ﺍﳌﺴﺎﻭﺍﺓ ﻟﻴﺲ ﳍﺎ ﺃﻱ ﻋﻼﻗﺔ ﺑﺎﻟﺘﻌﻴﲔ ﻓﺎﻟﺘﺮﻛﻴﺐ ﺍﳌﻨﻄﻘﻲ‬
.‫ﺍﳌﺼﺮﻑ ﺃﻥ ﺍﻟﺪﺍﻟﺔ ﺳﺘﻜﻮﻥ ﻧﻘﻴﺔ ﺃﻱ ﻟﻦ ﻳﻜﻮﻥ ﳍﺎ ﺟﺴﻢ‬
number ‫ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ‬.‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﳛﺘﻮﻯ ﻋﻠﻰ ﻣﺜﺎﻝ ﺑﺴﻴﻂ ﻟﺪﺍﻟﺔ ﺇﻓﺘﺮﺍﺿﻴﺔ ﻧﻘﻴﺔ‬
setval ( ) ‫ ﺍﻟﺪﺍﻟﺔ‬، val ‫ ﻳﺪﻋﻰ‬int ‫ﻫﻲ ﻓﺌﺔ ﲡﺮﻳﺪﻳﺔ ﲢﺘﻮﻯ ﻋﻠﻰ ﻋﻀﻮ ﳏﻤﻰ ﻣﻦ ﺍﻟﻨﻮﻉ‬
‫ ﰎ ﺇﻋـﺎﺩﺓ‬oct type ، hextype ‫ ﰲ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸـﺘﻘﺔ‬. show( ) ‫ ﺍﻟﺪﺍﻟﺔ ﺍﻟﻨﻘﻴﺔ‬،
.show( ) ‫ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ‬

//Program 9-9:
#include <iostream.h>
//Continued
class number {
protected :
int val ;
//Continued
public :
void setval (int i) { val = i ; }
// show( ) is a pure virtual function
virtual void show( ) = 0 ;
};
class hextype : public number {
public :
void show ( ) {
cout << hex << val << "\n " ;
}
};
class dectype : public number {
public :
void show ( ) {
cout << val << "\n " ;
}
};
class octtype : public number {
public :

189
void show ( ) {
cout << oct << val << "\n " ;
}
};
int main ( )
{
dectype d;
hextype h;
octtype 0;

d.setval(20) ;
d.show( ) ;
h.setval(20) ;
h.show( ) ;
0.setval(20) ;
0.show( ) ;

return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

20
14
24

190
‫ﺍﳌﻠﺨﺺ‪:‬‬
‫♦ ﺍﻟﺸﻜﻞ ﺍﻟﻌﺎﻡ ﻻﺷﺘﻘﺎﻕ ﻓﺌﺔ ﻣﻦ ﻓﺌﺔ ﻗﺎﻋﺪﺓ ﻫﻮ‪:‬‬
‫{ ‪class derived-class-name : access base-class-name‬‬
‫‪body of class‬‬
‫;}‬
‫♦ ﺗﺴﻤﻰ ‪ access‬ﳏﺪﺩ ﻭﺻﻮﻝ ‪ ،‬ﻭﻫﻲ ﺗﺘﺤﻜﻢ ﰲ ﻛﻴﻔﻴﺔ ﻃﺮﻳﻘﺔ ﻭﺭﺍﺛﺔ ﺍﻟﻔﺌﺎﺕ ﺣﻴﺚ‬
‫ﳝﻜﻦ ﺃﻥ ﺗﻜـﻮﻥ ﺍﻟﻮﺭﺍﺛـﺔ ﻋﺎﻣـﺔ )‪ (public‬ﺃﻭ ﺧﺎﺻـﺔ )‪ (private‬ﺃﻭ ﳏﻤﻴـﺔ‬
‫)‪ (protected‬ﻋﻠﻰ ﺣﺴﺐ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﺍﳌﺴﺘﺨﺪﻡ‪.‬‬
‫♦ ﺇﺫﺍ ﻛﺎﻥ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﻋﺎﻡ ﺗﺴﻤﻰ ﺍﻟﻮﺭﺍﺛﺔ ﻋﺎﻣﺔ ﻭﻓﻴﻬﺎ ﺗﺘﻢ ﻭﺭﺍﺛﺔ ﺍﻷﻋﻀـﺎﺀ ﺍﻟﻌﺎﻣـﺔ‬
‫ﻭﺍﶈﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻛﺄﻋﻀﺎﺀ ﻋﺎﻣﺔ ﻭﳏﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻭﻟﻜﻦ ﺗﺒﻘـﻰ ﺍﻷﻋﻀـﺎﺀ‬
‫ﺍﳋﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺧﺎﺻﺔ ﺑﺎﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ‪ ،‬ﻭﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﻣﻦ ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ‬
‫ﺍﳌﺸﺘﻘﺔ‪.‬‬
‫♦ ﺇﺫﺍ ﻛﺎﻥ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﺧﺎﺹ ﺗﺴﻤﻰ ﺍﻟﻮﺭﺍﺛﺔ ﺧﺎﺻﺔ ﻭﻋﻨﺪﻫﺎ ﻛﻞ ﺍﻷﻋﻀـﺎﺀ ﺍﻟﻌﺎﻣـﺔ‬
‫ﻭﺍﶈﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺗﺼﺒﺢ ﺃﻋﻀﺎﺀ ﺧﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ‪.‬‬
‫♦ ﺇﺫﺍ ﻛﺎﻥ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﳏﻤﻰ ﺗﺴﻤﻰ ﺍﻟﻮﺭﺍﺛﺔ ﳏﻤﻴﺔ ﻭﻋﻨﺪﻫﺎ ﻛﻞ ﺍﻷﻋﻀـﺎﺀ ﺍﻟﻌﺎﻣـﺔ‬
‫ﻭﺍﶈﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺗﺼﺒﺢ ﺃﻋﻀﺎﺀ ﳏﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ‪.‬‬
‫♦ ﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﻌﻀﻮ ﺍﶈﻤﻰ ﻣﻦ ﻗﺒﻞ ﺍﻷﻋﻀﺎﺀ ﺧﺎﺭﺝ ﺍﻟﻔﺌﺔ ﺇﻻ ﺃﻧﻪ ﰲ ﺍﻟﻮﺭﺍﺛـﺔ‬
‫ﺍﻟﻌﺎﻣﺔ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﻌﻀﻮ ﺍﶈﻤﻰ ﻣﻦ ﺍﻷﻋﻀﺎﺀ ﰲ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ‪.‬‬
‫♦ ﻋﺎﺩﺓ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻣﺸﻴﺪ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﰒ ﻣﺸﻴﺪ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻭﻟﻜﻦ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﻣﻬﺪﻡ ﺍﻟﻔﺌﺔ‬
‫ﺍﳌﺸﺘﻘﺔ ﺃﻭ ﹰﻻ ﻗﺒﻞ ﻣﻬﺪﻡ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ‪.‬‬
‫♦ ﲢﺪﺙ ﺍﻟﻮﺭﺍﺛﺔ ﺍﳌﺘﻌﺪﺩﺓ ﻋﻨﺪﻣﺎ ﺗﺮﺙ ﻓﺌﺔ ﻣﺎ ﻣﻦ ﻓﺌﺘﲔ ﻗﺎﻋﺪﺗﲔ ﺃﻭ ﺃﻛﺜﺮ‪.‬‬
‫♦ ﳛﺪﺙ ﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ ﻋﺎﺩﺓ ﰲ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺮﺗﺒﻄﺔ ﺑﺒﻌﻀﻬﺎ ﺑﺴﺒﺐ ﺍﻟﻮﺭﺍﺛﺔ‪.‬‬
‫♦ ﺍﻟﺪﻭﺍﻝ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﻫﻲ ﺩﻭﺍﻝ ﻳﺘﻢ ﺗﻌﺮﻳﻔﻬﺎ ﺿﻤﻦ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﰲ ﺍﻟﻔﺌـﺔ ﺍﻟﻘﺎﻋـﺪﺓ‬
‫ﻭﻳﻌﺎﺩ ﺗﻌﺮﻳﻔﻬﺎ ﰲ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ‪.‬‬
‫♦ ﻋﻨﺪﻣﺎ ﻳﺸﲑ ﻣﺆﺷﺮ ﻓﺌﺔ ﻗﺎﻋﺪﺓ ﺇﱃ ﻛﺎﺋﻦ ﰲ ﻓﺌﺔ ﻣﺸﺘﻘﺔ ﻣﻨﻬﺎ ﲢﺘﻮﻯ ﻋﻠﻰ ﺩﺍﻟﺔ ﺍﻓﺘﺮﺍﺿـﻴﺔ‪،‬‬
‫ﲢﺪﺩ ‪ C++‬ﺍﻟﺪﺍﻟﺔ ﺍﳌﻄﻠﻮﺏ ﺗﻨﻔﻴﺬﻫﺎ ﻭﻓﻘﹰﺎ ﶈﺘﻮﻳﺎﺕ ﺍﳌﺆﺷﺮ ﻭﻳﺘﻢ ﺫﻟﻚ ﺃﺛﻨﺎﺀ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫♦ ﳚﺐ ﺃﻥ ﻧﻄﺎﺑﻖ ﺇﻋﻼﻥ ﺍﻟﺪﺍﻟﺔ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺑﺎﻹﻋﻼﻥ ﻋﻨـﻬﺎ ﰲ ﺍﻟﻔﺌـﺎﺕ‬
‫ﺍﳌﺸﺘﻘﺔ‪.‬‬

‫‪191‬‬
‫♦ ﺍﻟﻔﺌﺔ ﺍﻟﺘﺠﺮﻳﺪﻳﺔ )‪ (abstract class‬ﻫﻲ ﺍﻟﻔﺌﺔ ﺍﻟﱵ ﻻ ﻳﺘﻢ ﺇﻧﺸـﺎﺀ ﺃﻱ ﻛﺎﺋﻨـﺎﺕ‬
‫ﻣﻨﻬﺎ‪.‬‬
‫♦ ﺍﻟﺪﺍﻟﺔ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﺍﻟﻨﻘﻴﺔ ﻫﻲ ﺩﺍﻟﺔ ﻟﻴﺲ ﳍﺎ ﺟﺴﻢ ﻳﺘﻢ ﺗﻌﺮﻳﻔﻬﺎ ﰲ ﺍﻟﻔﺌﺎﺕ ﺍﻟﺘﺠﺮﻳﺪﻳﺔ‪.‬‬

‫ﺍﻷﺳﺌﻠﺔ‬
‫‪ /1‬ﺃﻛﺘﺐ ﺗﻌﺮﻳﻔﹰﺎ ﳐﺘﺼﺮﹰﺍ ﻟﻜﻞ ﻣﻦ ﺍﻵﰐ‪:‬‬
‫ﺍﻟﻮﺭﺍﺛﺔ )‪.(Inheritance‬‬ ‫‬

‫ﺍﻟﻮﺭﺍﺛﺔ ﺍﳌﺘﻌﺪﺩﺓ )‪.(multiple inheritance‬‬ ‫‬

‫ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ )‪.(base class‬‬ ‫‬

‫ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ )‪.(derived class‬‬ ‫‬

‫‪ ) /2‬ﺻﺤﻴﺢ ‪ /‬ﺧﻄﺄ( ‪ :‬ﻛﺎﺋﻦ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻫﻮ ﺃﻳﻀﹰﺎ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﳍﺎ‪.‬‬

‫‪ /3‬ﻳﻔﻀﻞ ﺑﻌﺾ ﺍﳌﱪﳎﲔ ﻋﺪﻡ ﺍﺳﺘﻌﻤﺎﻝ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﺍﶈﻤﻰ )‪ (protected‬ﻷﻧﻪ‬


‫ﻳﻬﺪﺩ ﺳﻼﻣﺔ ﺑﻴﺎﻧﺎﺕ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ‪ .‬ﻧﺎﻗﺶ ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ ﻭﺑﲔ ﻣﺎ ﻣﺪﻯ ﺻﺤﺘﻬﺎ ‪.‬‬

‫‪ /4‬ﻣﺎ ﻫﻲ ﺍﻟﺪﻭﺍﻝ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ؟ ﺻﻒ ﺍﻷﺣﻮﺍﻝ ﺍﻟﱵ ﺗﻜﻮﻥ ﻓﻴﻬﺎ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﻣﻨﺎﺳﺒﺎﹰ؟‬

‫)‪. (pure‬‬ ‫‪ /5‬ﻭﺿﺢ ﺍﻟﻔﺮﻕ ﺑﲔ ﺍﻟﺪﻭﺍﻝ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﻭﺍﻟﺪﻭﺍﻝ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﺍﻟﻨﻘﻴﺔ‬

‫‪) /6‬ﺻﺤﻴﺢ ‪ /‬ﺧﻄﺄ( ﻛﻞ ﺍﻟﺪﻭﺍﻝ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﰲ ﺍﻟﻔﺌـﺎﺕ ﺍﻟﻘﺎﻋـﺪﺓ ﺍﻟﺘﺠﺮﻳﺪﻳـﺔ‬


‫)‪ (abstract base classes‬ﳚــﺐ ﺃﻥ ﺗﻜــﻮﻥ ﺩﻭﺍﻝ ﺍﻓﺘﺮﺍﺿــﻴﺔ ﻧﻘﻴــﺔ‪.‬‬

‫‪192‬‬
‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﻌﺎﺷﺮﺓ‬
‫‪9.0‬‬
‫ﺍﻟﻘﻮﺍﻟﺐ ﻭﺍﻹﺳﺘﺜﻨﺎﺀﺍﺕ‬

‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻗﻮﺍﻟﺐ ﺩﺍﻻﺕ ﻹﻧﺸﺎﺀ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺪﻭﺍﻝ ﺍﳌﺮﺗﺒﻄﺔ ﺑﺒﻌﻀﻬﺎ‪.‬‬


‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻗﻮﺍﻟﺐ ﺍﻟﻔﺌﺎﺕ )‪.(Templates Classes‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻣﻔﻬﻮﻡ ﺍﻻﺳﺘﺜﻨﺎﺀﺍﺕ ﰲ ﻟﻐﺔ ‪.C++‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻛﺘﻞ ﺍﶈﺎﻭﻟﺔ ‪ try blocks‬ﻭﺍﻟﱵ ﲢﺼﺮ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻟﱵ‬
‫ﳝﻜﻦ ﺃﻥ ﺗﺆﺩﻯ ﺇﱃ ﺣﺪﻭﺙ ﺍﺳﺘﺜﻨﺎﺀ‪.‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺭﻣﻰ ﺍﻻﺳﺘﺜﻨﺎﺀ‪.‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻛﺘﻞ ﺍﻟﺘﻘﺎﻁ ‪ catch blocks‬ﻭﺍﻟﱵ ﺗﻘﻮﻡ ﲟﻌﺎﳉﺔ‬
‫ﺍﻻﺳﺘﺜﻨﺎﺀ‪.‬‬

‫‪193‬‬
‫ﻗﻮﺍﻟﺐ ﺍﻟﺪﺍﻻﺕ‬
‫‪9.1‬‬
‫‪Template Functions‬‬
‫ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﻛﺘﺎﺑﺔ ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﺑﺎﺳﺘﺒﺪﺍﻝ ﺭﻗﻤﲔ ﺗﺘﻢ ﻛﺘﺎﺑﺔ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻟﻨﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻣﻌـﲔ‬
‫ﻛﺎﻵﰐ‪:‬‬
‫)‪int swap (int &a,int &b‬‬
‫{‬
‫;‪int temp‬‬
‫;‪temp=a‬‬
‫;‪a=b‬‬
‫;‪b=temp‬‬
‫}‬
‫ﻳﺘﻢ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ int‬ﻭﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻣﻦ ﻧﻔﺲ ﺍﻟﻨﻮﻉ ‪ .‬ﻟﻜﻦ ﻟﻨﻔﺘﺮﺽ ﺃﻧﻨـﺎ‬
‫ﻧﺮﻳﺪ ﺍﺳﺘﺒﺪﺍﻝ ﺭﻗﻤﲔ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ long‬ﺳﻨﻀﻄﺮ ﻟﻜﺘﺎﺑﺔ ﺩﺍﻟﺔ ﺟﺪﻳﺪﺓ ﻛﻠﻴﹰﺎ‪.‬‬
‫)‪Long swap (long &a, long &b‬‬
‫{‬
‫;‪long temp‬‬
‫;‪temp=a‬‬
‫;‪a=b‬‬
‫;‪b=temp‬‬
‫}‬
‫ﻭﺳﻨﻀﻄﺮ ﻟﻜﺘﺎﺑﺔ ﺩﺍﻟﺔ ﺃﺧﺮﻯ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺍﺳﺘﺒﺪﺍﻝ ﺭﻗﻤﲔ ﻣﻦ ﺍﻟﻨﻮﻉ ‪. float‬‬
‫ﺇﻥ ﺟﺴﻢ ﺍﻟﺪﺍﻟﺔ ﻫﻮ ﻧﻔﺴﻪ ﰲ ﻛﻞ ﺍﳊﺎﻻﺕ ﻟﻜﻦ ﳚﺐ ﺃﻥ ﺗﻜﻮﻥ ﺩﺍﻻﺕ ﻣﻨﻔﺼﻠﺔ ﻷﻧﻨـﺎ‬
‫ﻧﺘﻌﺎﻣﻞ ﻣﻊ ﻣﺘﻐﲑﺍﺕ ﺫﺍﺕ ﺃﻧﻮﺍﻉ ﳐﺘﻠﻔﺔ ﻭﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻧﻪ ﳝﻜﻦ ﲢﻤﻴﻞ ﻫﺬﻩ ﺍﻟﺪﺍﻻﺕ ﺑﺸـﻜﻞ‬
‫ﺯﺍﺋﺪ ﲝﻴﺚ ﲢﻤﻞ ﻧﻔﺲ ﺍﻻﺳﻢ ﻟﻜﻨﻨﺎ ﺃﻳﻀﹰﺎ ﻧﻀﻄﺮ ﺇﱃ ﻛﺘﺎﺑﺔ ﺩﺍﻻﺕ ﻣﻨﻔﺼﻠﺔ ﻟﻜﻞ ﻧـﻮﻉ ﻭﻫـﺬﻩ‬
‫ﺍﻟﻄﺮﻳﻘﺔ ‪‬ﺎ ﻋﺪﺓ ﻋﻴﻮﺏ ‪-:‬‬
‫‪ /1‬ﻛﺘﺎﺑﺔ ﻧﻔﺲ ﺟﺴﻢ ﺍﻟﺪﺍﻟﺔ ﻣﺮﺍﺭﹰﺍ ﻭﺗﻜﺮﺍﺭﹰﺍ ﻷﻧﻮﺍﻉ ﳐﺘﻠﻔﺔ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻳﻀﻴﻊ ﺍﻟﻮﻗـﺖ‬
‫ﻭﻳﺰﻳﺪ ﺣﺠﻢ ﺍﻟﱪﻧﺎﻣﺞ ‪.‬‬
‫‪ /2‬ﺇﺫﺍ ﺍﺭﺗﻜﺒﻨﺎ ﺃﻱ ﺧﻄﺄ ﰲ ﺇﺣﺪﻯ ﻫﺬﻩ ﺍﻟﺪﺍﻻﺕ ﳚﺐ ﺗﺼﺤﻴﺢ ﻫﺬﺍ ﺍﳋﻄـﺄ ﰲ ﺑﻘﻴـﺔ‬
‫ﺍﻟﺪﺍﻻﺕ‪.‬‬

‫‪194‬‬
‫ﻛﺎﻧﺖ ﻫﻨﺎﻟﻚ ﻃﺮﻳﻘﺔ ﻟﻜﺘﺎﺑﺔ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻣﺮﺓ ﻭﺍﺣﺪﺓ ﻓﻘﻂ ﻟﻜﻲ ﺗﻌﻤﻞ ﻋﻠﻰ ﺃﻱ ﻧـﻮﻉ‬
Functions ‫ﻣﻦ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺨﺘﻠﻔﺔ ﻭﻳﺘﻢ ﻫﺬﺍ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻣﺎ ﻳﺴﻤﻰ ﺑﻘﺎﻟﺐ ﺍﻟـﺪﺍﻻﺕ‬
. template ‫ ﻭﺍﻟﺬﻱ ﻳﺘﻢ ﺇﻧﺸﺎﺅﻫﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ‬Templates
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﻛﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﺑﺎﺳﺘﺒﺪﺍﻝ ﻗﻴﻤﱵ ﻣﺘﻐﲑﻳﻦ ﻛﻘﺎﻟﺐ ﻟﻜﻲ ﺗﻌﻤﻞ‬
‫ ﰒ ﻳﺴﺘﺪﻋﻰ ﻫـﺬﻩ‬swapargs( ) ‫ﻳﻌﺮﻑ ﺍﻟﱪﻧﺎﻣﺞ ﺇﺻﺪﺍﺭ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻟﺔ‬. ‫ﻣﻊ ﺃﻱ ﻧﻮﻉ ﺃﺳﺎﺳﻲ‬
.‫ ﺛﻼﺙ ﻣﺮﺍﺕ ﻣﻊ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﳐﺘﻠﻔﺔ‬main( )‫ﺍﻟﺪﺍﻟﺔ ﰲ‬
//Program 9-1:
// Function template example.
// Function template example.
#include <iostream.h>
// This is a function template.
template <class x> void swapargs(x &a, x &b)
{
x temp;
temp = a;
a = b;
b = temp;
}
int main( )
{
int i=10 , j=20;
double x=10.1, y=23.3;
char a= 'x' ,b= 'z' ;
cout << " original i, j: ";
cout<<i<<" "<<j<< "\n " ;
cout << " original x, y:" <<x<<" "<<y<< "\n " ;
cout << " original a, b: " << a <<" "<< b << "\n " ;
swapargs(i, j) ; // swap integers
swapargs(x, y) ; // swap floats
swapargs(a, b) ; // swap chars
cout << " Swapped i, j: "<<i<<" "<<j<< "\n " ;
cout << " Swapped x, y: "<<x<<" "<<y<< "\n " ;

195
‫; " ‪cout << " Swapped a, b: " <<a<<" "<<b<< "\n‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪original i, j: 10 20‬‬
‫‪original x, y: 10.1 23.3‬‬
‫‪original a, b: x z‬‬
‫‪Swapped i, j: 20‬‬ ‫‪10‬‬
‫‪Swapped x, y: 23.3 10.1‬‬
‫‪Swapped a, b: z‬‬ ‫‪x‬‬

‫ﻛﻤﺎ ﺭﺃﻳﺖ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻋﻼﻩ ﺗﻌﻤﻞ ﺍﻟﺪﺍﻟﺔ ) (‪ swapargs‬ﺍﻵﻥ ﻣﻊ ﻛـﻞ ﺃﻧـﻮﺍﻉ‬


‫ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ char ،double ،int‬ﻭﺍﺳﺘﺨﺪﺍﻡ ﺍﺳﺘﻌﻤﻠﺘﻬﺎ ﻛﻮﺳﺎﺋﻂ ﳍﺎ ﻭﳝﻜﻦ ﺃﻥ ﺗﻌﻤﻞ ﺃﻳﻀـﹰﺎ‬
‫ﻣﻊ ﺃﻧﻮﺍﻉ ﺃﺳﺎﺳﻴﺔ ﺃﺧﺮﻯ ﻭﺣﱴ ﻣﻊ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﻌﺮﻓﺔ ﻣﻦ ﻗﺒﻞ ﺍﳌﺴﺘﺨﺪﻡ ‪ ،‬ﻭﳉﻌﻞ ﺍﻟﺪﺍﻟـﺔ‬
‫ﺗﻘﻮﻡ ﺑﻜﻞ ﻫﺬﺍ ﻛﺘﺒﻨﺎ‪:‬‬
‫)‪template< class x> void swapargs (x& a, x&b‬‬
‫{‬
‫;‪x temp‬‬
‫;‪temp = a‬‬
‫;‪a = b‬‬
‫;‪b = temp‬‬
‫}‬
‫ﺍﻻﺑﺘﻜﺎﺭ ﰲ ﻗﻮﺍﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻫﻮ ﻋﺪﻡ ﲤﺜﻴﻞ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺬﻱ ﺗﺴﺘﻌﻤﻠﻪ ﺍﻟﺪﺍﻟﺔ ﻛﻨﻮﻉ‬
‫ﻼ ‪ ،‬ﺑﻞ ﺑﺎﺳﻢ ﳝﻜﻨﻪ ﺃﻥ ﻳﺸﲑ ﺇﱃ ﺃﻱ ﻧﻮﻉ ﻣﻦ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﰲ ﺍﳌﺜﺎﻝ ﺍﻟﺴـﺎﺑﻖ ‪،‬‬ ‫ﻣﻌﲔ ‪ int‬ﻣﺜ ﹰ‬
‫ﻫﺬﺍ ﺍﻻﺳﻢ ﻫﻮ ‪ x‬ﻭﻫﻮ ﻳﺴﻤﻰ ﻭﺳﻴﻄﺔ ﻗﺎﻟﺐ‪.‬‬

‫ﺍﳌﺼﺮﻑ ﻭﻗﻮﺍﻟﺐ ﺍﻟﺪﺍﻻﺕ‬ ‫‪9.2‬‬

‫‪196‬‬
‫ﻋﻨﺪﻣﺎ ﻳﺮﻯ ﺍﳌﺼﺮﻑ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ template‬ﻭﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺬﻱ ﻳﻠﻴﻬـﺎ ﻻ‬
‫ﻳﻘﻮﻡ ﺑﺘﻮﻟﻴﺪ ﺃﻱ ﺷﻔﺮﺓ ﻷﻧﻪ ﻻ ﻳﻌﺮﻑ ﺑﻌﺪ ﻣﺎ ﻫﻮ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺬﻱ ﺳﻴﺴﺘﻌﻤﻞ ﻣﻊ ﺍﻟﺪﺍﻟﺔ ‪ .‬ﻳﺘﻢ‬
‫ﺗﻮﻟﻴﺪ ﺍﻟﺸﻔﺮﺓ ﺑﻌﺪ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﰲ ﻋﺒﺎﺭﺓ ﻣﺎ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ‪ ،‬ﳛﺼﻞ ﻫـﺬﺍ ﺍﻷﻣـﺮ ﰲ ﺍﻟﱪﻧـﺎﻣﺞ‬
‫ﻼ‪.‬‬
‫ﺍﻟﺴﺎﺑﻖ ﰲ ﺍﻟﻌﺒﺎﺭﺓ ;)‪ swapargs(i,j‬ﻣﺜ ﹰ‬
‫ﻋﻨﺪﻣﺎ ﻳﺮﻯ ﺍﳌﺼﺮﻑ ﻣﺜﻞ ﻫﺬﺍ ﺍﻻﺳﺘﺪﻋﺎﺀ‪ ،‬ﻓﺎﻧﻪ ﻳﻌﺮﻑ ﺃﻥ ﺍﻟﻨﻮﻉ ﺍﻟﺬﻱ ﺳﻴﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ‬
‫ﻫﻮ ‪ int‬ﻛﻮﻧﻨﺎ ﻋﺮﻓﻨﺎ ﺍﳌﺘﻐﲑﺍﺕ ‪ i‬ﻭ ‪ j‬ﻋﻠﻰ ﺃ‪‬ﺎ ﻣﻦ ﺍﻟﻨﻮﻉ ‪.int‬ﻟﺬﺍ ﻳﻘﻮﻡ ﺑﺘﻮﻟﻴﺪ ﺇﺻﺪﺍﺭﹰﺍ ﻟﻠﺪﺍﻟـﺔ‬
‫) (‪ swapargs‬ﺧﺎﺻﹰﺎ ﺑﺎﻟﻨﻮﻉ ‪ int‬ﻣﺴﺘﺒﺪ ﹰﻻ ﺍﻻﺳﻢ ‪ x‬ﰲ ﻛﻞ ﻇﻬﻮﺭ ﻟﻪ ﰲ ﺍﻟﻘﺎﻟﺐ ﺑـﺎﻟﻨﻮﻉ‬
‫‪ int‬ﻭﻳﺴﻤﻰ ﻫﺬﺍ ﺍﺳﺘﻨﺒﺎﻁ )‪ (instantiating‬ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ‪ .‬ﻛﻞ ﺇﺻـﺪﺍﺭ ﻣﺴـﺘﻨﺒﻂ‬
‫ﻟﻠﺪﺍﻟﺔ ﻳﺴﻤﻰ ﺩﺍﻟﺔ ﻗﻮﺍﻟﺒﻴﺔ‪.‬‬
‫ﺑﺸﻜﻞ ﳑﺎﺛﻞ ﻳﺆﺩﻯ ﺍﻻﺳﺘﺪﻋﺎﺀ )‪ swapargs( x,y‬ﺇﱃ ﺟﻌﻞ ﺍﳌﺼﺮﻑ ﻳﻮﻟﺪ ﺇﺻﺪﺍﺭﹰﺍ‬
‫ﻟﻠﺪﺍﻟـﺔ ) (‪ swapargs‬ﻳﻌﻤـﻞ ﻋﻠـﻰ ﺍﻟﻨـﻮﻉ ‪ double‬ﺑﻴﻨﻤـﺎ ﻳـﺆﺩﻯ ﺍﻻﺳـﺘﺪﻋﺎﺀ‬
‫)‪ swapargs(a,b‬ﺇﱃ ﺗﻮﻟﻴﺪ ﺩﺍﻟﺔ ﺗﻌﻤﻞ ﻋﻠﻰ ﺍﻟﻨﻮﻉ ‪.char‬‬
‫ﻳﻘﺮﺭ ﺍﳌﺼﺮﻑ ﻛﻴﻔﻴﺔ ﺗﺼﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﻋﻠﻰ ﺃﺳﺎﺱ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺴﺘﻌﻤﻞ ﰲ ﻭﺳﻴﻄﺎﺕ‬
‫ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ‪ .‬ﳑﺎ ﺳﺒﻖ ﻳﺘﻀﺢ ﻟﻨﺎ ﺃﻥ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻫﻮ ﻟﻴﺲ ﰲ ﺍﻟﻮﺍﻗﻊ ﺩﺍﻟـﺔ‪ ،‬ﺇﻧـﻪ ﳐﻄـﻂ‬
‫ﻹﻧﺸﺎﺀ ﻋﺪﺓ ﺩﺍﻻﺕ ﻭﻳﺘﻼﺋﻢ ﻫﺬﺍ ﻣﻊ ﻓﻠﺴﻔﺔ ‪ OOP‬ﻭﻫﻮ ﻣﺘﺸﺎﺑﻪ ﻟﻠﻔﺌﺔ ﻛﻮ‪‬ﺎ ﳕﻮﺫﺝ ﻹﻧﺸﺎﺀ ﻋﺪﺓ‬
‫ﻛﺎﺋﻨﺎﺕ ﻣﺘﺸﺎ‪‬ﺔ‪.‬‬

‫ﻗﺎﻟﺐ ﺩﺍﻻﺕ ﻣﻊ ﻭﺳﻴﻄﱵ ﻗﺎﻟﺐ‬


‫‪9.3‬‬

‫ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﺃﻛﺜﺮ ﻣﻦ ﻭﺳﻴﻄﺔ ﻗﺎﻟﺐ ﰲ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻭﺫﻟﻚ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻓﺎﺻـﻠﺔ )‪(،‬‬
‫ﺗﻔﺼﻞ ﺑﲔ ﺍﻟﻮﺳﺎﺋﻂ‪ .‬ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻗﺎﻟﺐ ﺩﺍﻻﺕ ﻟﻪ ﻭﺳﻴﻄﺘﲔ‬

‫‪//Program 9-2:‬‬
‫>‪#include <iostream.h‬‬
‫>‪template <class type1,class type2‬‬
‫)‪void myfunc(type1 x, type2 y‬‬
‫{‬
‫; '‪cout <<x<< y << '\n‬‬
‫}‬
‫) (‪int main‬‬

‫‪197‬‬
‫{‬
‫;)"‪myfunc ( 10, " I like C++‬‬
‫;)‪myfunc(98.6, 19L‬‬
‫;‪return 0‬‬
‫}‬

‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﰎ ﺍﺳﺘﺒﺪﺍﻝ ‪ type1‬ﻭ‪ type2‬ﺑﺄﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪char* ،int‬‬


‫‪ long ،double ،‬ﻋﻠﻰ ﺍﻟﺘﻮﺍﱄ‪.‬‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪10 I like C++‬‬


‫‪98.6 19L‬‬

‫ﻗﻮﺍﻟﺐ ﺍﻟﻔﺌﺎﺕ‬
‫‪9.4‬‬
‫‪Templates Classes‬‬

‫ﺍﻟﻔﺌﺔ ‪ stack‬ﻭﺍﻟﱵ ﺳﺒﻖ ﺃﻥ ﺭﺃﻳﻨﺎﻫﺎ ﰲ ﺍﻷﻣﺜﻠﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻛﺎﻥ ﺑﺈﻣﻜﺎ‪‬ﺎ ﲣﺰﻳﻦ ﺑﻴﺎﻧـﺎﺕ‬
‫ﻣﻦ ﻧﻮﻉ ﺃﺳﺎﺳﻲ ﻭﺍﺣﺪ ﻓﻘﻂ ﻫﻮ ﺍﻟﻨﻮﻉ ‪ int‬ﻭﻟﺬﻟﻚ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﲣﺰﻳﻦ ﺑﻴﺎﻧﺎﺕ ﻣﻦ ﺍﻟﻨﻮﻉ ‪float‬‬
‫ﰲ ﻓﺌﺔ ‪ stack‬ﺳﻨﺤﺘﺎﺝ ﺇﱃ ﺗﻌﺮﻳﻒ ﻓﺌﺔ ﺟﺪﻳﺪﺓ ﻛﻠﻴﹰﺎ ﻭﺑﺸﻜﻞ ﳑﺎﺛﻞ ﺳﻨﺤﺘﺎﺝ ﺇﱃ ﺇﻧﺸﺎﺀ ﻓﺌﺔ‬
‫ﺟﺪﻳﺪﺓ ﻟﻜﻞ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻧﺮﻳﺪ ﲣﺰﻳﻨﻪ ‪ ،‬ﻟﺬﺍ ﻋﻠﻴﻨﺎ ﻛﺘﺎﺑﺔ ﻣﻮﺍﺻﻔﺎﺕ ﻓﺌﺔ ﻭﺍﺣـﺪﺓ ﺗﻌﻤـﻞ ﻣـﻊ‬
‫ﻣﺘﻐﲑﺍﺕ ﻣﻦ ﻛﻞ ﺍﻷﻧﻮﺍﻉ ﻭﻟﻴﺲ ﻣﻊ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻭﺍﺣﺪ‪ ،‬ﺑﺈﻣﻜﺎﻥ ﻗﻮﺍﻟﺐ ﺍﻟﻔﺌﺎﺕ ﲢﻘﻴﻖ ﺫﻟﻚ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﻳﻘﻮﻡ ﺑﺘﻌﺮﻳﻒ ﺍﻟﻔﺌﺔ ‪ stack‬ﺑﺎﺳﺘﻌﻤﺎﻝ ﻗﺎﻟﺐ ﺩﺍﻻﺕ‪:‬‬

‫‪//Program 9-3:‬‬
‫‪// This function demonstrates a generic stack.‬‬
‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬

‫;‪const int SIZE = 10‬‬

‫‪198‬‬
// Create a generic stack class
template <class StackType> class stack {
StackType stck[SIZE]; // holds the stack
int tos ; // index of top_of_stack

public:
stack( ) { tos =0; } // initialize stack
//Continued
void push(StackType ob) ; // push object on stack
StackType pop( ) ; // pop object from stack
};

//push an object.
template <class StackType> void stack <StackType> ::
push(StackType ob)
{
if (tos== SIZE) {
cout << "Stack is full.\n" ;
return ;
}
stck[tos] = ob;
tos++;
}
//pop an object.
template <class StackType> StackType stack <StackType>
:: pop( )
{
if (tos== 0) {
cout << "Stack is empty.\n" ;
return 0; //return null on empty stack
}
tos--;
return stck[tos];
}

199
int main( )
{
// Demonstrate character stacks.
stack<char> s1, s2; // create two character stacks
int i;

s1.push( 'a' );
s2.push( 'x' );
//Continued
s1.push( 'b' );
s2.push( 'y' );
s1.push( 'c' );
s2.push( 'z' );
for (i=0; i<3; i++ ) cout<<" " <<s1.pop( ) ;
cout <<endl;
for (i=0; i<3; i++ ) cout<< " " <<s2.pop( ) ;
cout<<endl;
// demonstrate double stacks
stack<double> ds1, ds2; // create two double stacks
ds1.push( 1.1 );
ds2.push( 2.2 );
ds1.push( 3.3 );
ds2.push( 4.4 );
ds1.push( 5.5);
ds2.push( 6.6 );
for (i=0; i<3; i++ ) cout <<" "<<ds1.pop( ) ;
cout<<endl;
for (i=0; i<3; i++ ) cout<<" " <<ds2.pop( ) ;
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

c b a

200
‫‪z‬‬ ‫‪y‬‬ ‫‪x‬‬
‫‪5.5‬‬ ‫‪3.3‬‬ ‫‪1.1‬‬
‫‪6.6‬‬ ‫‪4.4‬‬ ‫‪2.2‬‬

‫ﰎ ﲤﺜﻴﻞ ﺍﻟﻔﺌﺔ ‪ stack‬ﻫﻨﺎ ﻛﻘﺎﻟﺐ ﻓﺌﺎﺕ‪ ،‬ﻫﺬﺍ ﺍﻷﺳﻠﻮﺏ ﻣﺸﺎﺑﻪ ﻟﻸﺳﻠﻮﺏ ﺍﳌﺴـﺘﻌﻤﻞ‬
‫ﻣﻊ ﻗﻮﺍﻟﺐ ﺍﻟﺪﺍﻻﺕ ‪ .‬ﺗﺸﲑ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ template‬ﺇﱃ ﺃﻥ ﺍﻟﻔﺌﺔ ﺑﺄﻛﻤﻠـﻬﺎ ﺳـﺘﻜﻮﻥ‬
‫ﻗﺎﻟﺒﹰﺎ ﻭﻳﺘﻢ ﻋﻨﺪﻫﺎ ﺍﺳﺘﻌﻤﺎﻝ ﻭﺳﻴﻄﺔ ﻗﺎﻟﺐ ﺗﺪﻋﻰ ‪. StackType‬‬

‫ﲣﺘﻠﻒ ﻗﻮﺍﻟﺐ ﺍﻟﻔﺌﺎﺕ ﻋﻦ ﻗﻮﺍﻟﺐ ﺍﻟﺪﺍﻻﺕ ﰲ ﻃﺮﻳﻘﺔ ﺍﺳﺘﻨﺒﺎﻃﻬﺎ‪ .‬ﻹﻧﺸﺎﺀ ﺩﺍﻟﺔ ﻓﻌﻠﻴﺔ‬
‫ﻣﻦ ﻗﺎﻟﺐ ﺩﺍﻻﺕ ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺋﻬﺎ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻭﺳﻴﻄﺎﺕ ﻣﻦ ﻧﻮﻉ ﻣﻌﲔ ‪،‬ﻟﻜﻦ ﺍﻟﻔﺌـﺎﺕ ﻳـﺘﻢ‬
‫ﺍﺳﺘﻨﺒﺎﻃﻬﺎ ﺑﺘﻌﺮﻳﻒ ﻛﺎﺋﻦ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻭﺳﻴﻄﺔ ﺍﻟﻘﺎﻟﺐ ‪-:‬‬
‫;‪stack <char> s1, s2‬‬
‫ﺗﻨﺸﺊ ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ ﻛﺎﺋﻨﲔ ‪ s2 ،s1‬ﺗﺎﺑﻌﲔ ﻟﻠﻔﺌﺔ ‪ stack‬ﻭﻳﺰﻭﺩ ﺍﳌﺼﺮﻑ ﻣﺴـﺎﺣﺔ ﻣـﻦ‬
‫ﺍﻟﺬﺍﻛﺮﺓ ﻟﺒﻴﺎﻧﺎﺕ ﻫﺬﻳﻦ ﺍﻟﻜﺎﺋﻨﲔ ﻭﺍﻟﱵ ﻫﻲ ﻣﻦ ﺍﻟﻨﻮﻉ ‪ char‬ﻟﻴﺲ ﻫﺬﺍ ﻓﻘﻂ ﺑﻞ ﻭﻳﻨﺸـﺊ‬
‫ﺃﻳﻀﹰﺎ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺘﺎﱄ ﺗﻌﻤﻞ ﻋﻠﻰ ﺍﻟﻨﻮﻉ ‪.char‬‬

‫ﻻﺣﻆ ﻫﻨﺎ ﺃﻥ ﺍﺳﻢ ﺍﻟﻜﺎﺋﻨﲔ ﻳﺘﻜﻮﻥ ﻣﻦ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ‪ stack‬ﺇﺿﺎﻓﺔ ﺇﱃ ﻭﺳﻴﻄﺔ ﺍﻟﻘﺎﻟﺐ‬
‫>‪ <char‬ﳑﺎ ﳝﻴﺰﻫﺎ ﻋﻦ ﻛﺎﺋﻨﺎﺕ ﺑﻘﻴﺔ ﺍﻟﻔﺌﺎﺕ ﺍﻟﱵ ﻗﺪ ﻳﺘﻢ ﺍﺳﺘﻨﺒﺎﻃﻬﺎ ﻣﻦ ﻧﻔﺲ ﺍﻟﻘﺎﻟـﺐ ﻛــ‬
‫ﻼ‪.‬‬
‫>‪ stack <double‬ﻣﺜ ﹰ‬

‫‪201‬‬
‫ﺍﻹﺳﺘﺜﻨﺎﺀﺍﺕ‬
‫‪9.5‬‬
‫)‪(Exceptions‬‬

‫ﺗﺰﻭﺩ ﺍﻹﺳﺘﺜﻨﺎﺀﺍﺕ ﺃﺳﻠﻮﺑﹰﺎ ﻛﺎﺋﲏ ﺍﳌﻨﺤﻰ ﳌﻌﺎﳉﺔ ﺃﺧﻄﺎﺀ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﱵ ﺗﻮﻟﺪﻫﺎ ﻓﺌﺎﺕ ‪C++‬‬
‫‪ ،‬ﻭﻟﻜﻲ ﺗﻜﻮﻥ ﺇﺳﺘﺜﻨﺎﺀﹰﺍ ﳚﺐ ﺃﻥ ﲢﺪﺙ ﺗﻠﻚ ﺍﻷﺧﻄﺎﺀ ﻛﻨﺘﻴﺠﺔ ﻟﻌﻤﻞ ﻣﺎ ﺟﺮﻯ ﺿﻤﻦ ﺍﻟﱪﻧـﺎﻣﺞ‬
‫ﻛﻤﺎ ﳚﺐ ﺃﻥ ﺗﻜﻮﻥ ﺃﺧﻄﺎﺀ ﻳﺴﺘﻄﻴﻊ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻛﺘﺸﺎﻓﻬﺎ ﺑﻨﻔﺴﻪ ‪.‬‬
‫ﺍﻟﺘﺮﻛﻴﺐ ﺍﻟﻨﺤﻮﻱ ﻟﻼﺳﺘﺜﻨﺎﺀ‪-:‬‬
‫ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﺑﺮﻧﺎﳎﹰﺎ ﻣﺎ ﻳﻨﺸﺊ ﻛﺎﺋﻨﺎﺕ ﺗﺎﺑﻌﺔ ﻟﻔﺌﺔ ﻣﻌﻴﻨﺔ ﻭﻳﺘﻔﺎﻋﻞ ﻣﻌﻬـﺎ ‪ ،‬ﻻ ﺗﺴـﺒﺐ‬
‫ﺍﺳﺘﺪﻋﺎﺀﺍﺕ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺃﻱ ﻣﺸﺎﻛﻞ ﻟﻜﻦ ﻗﺪ ﻳﺮﺗﻜﺐ ﺍﻟﱪﻧﺎﻣﺞ ﰲ ﺑﻌﺾ ﺍﻷﺣﻴﺎﻥ ﺃﺧﻄﺎﺀ ﳑﺎ‬
‫ﻳﺆﺩﻯ ﺇﱃ ﺍﻛﺘﺸﺎﻑ ﺧﻄﺄ ﰲ ﻋﻀﻮ ﺩﺍﱄ ﻣﺎ‪.‬‬
‫ﻳﻘﻮﻡ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﻋﻨﺪﻫﺎ ﺑﺈﺑﻼﻍ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻥ ﺧﻄﺄ ﻣﺎ ﻗﺪ ﺣﺼﻞ‪ ،‬ﻳﺴﻤﻰ ﻫﺬﺍ ﺍﻷﻣـﺮ‬
‫ﺭﻣﻰ ﺍﺳﺘﺜﻨﺎﺀ ﻭﳛﺘﻮﻯ ﺍﻟﱪﻧﺎﻣﺞ ﻋﻠﻰ ﺟﺰﺀ ﻣﻨﻔﺼﻞ ﳌﻌﺎﳉﺔ ﺍﳋﻄﺄ‪ ،‬ﻳﺴﻤﻰ ﻫـﺬﺍ ﺍﳉـﺰﺀ ﻣﻌـﺎﰿ‬
‫ﺍﻻﺳﺘﺜﻨﺎﺀ ﺃﻭ ﻛﺘﻠﺔ ﺍﻻﻟﺘﻘﺎﻁ ﻷ‪‬ﺎ ﺗﻠﺘﻘﻂ ﺍﻹﺳﺘﺜﻨﺎﺀﺍﺕ ﺍﻟﱵ ﺗﺮﻣﻴﻬﺎ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ‪ .‬ﻭﺃﻱ ﻋﺒـﺎﺭﺍﺕ‬
‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺗﺴﺘﻌﻤﻞ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ﺗﻜﻮﻥ ﻣﻮﺟﻮﺩﺓ ﺩﺍﺧﻞ ﻛﺘﻠﺔ ﺗﺴﻤﻰ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟـﺔ ﻭﻋﻠﻴـﻪ‬
‫ﺍﻷﺧﻄﺎﺀ ﺍﳌﻮﻟﺪﺓ ﰲ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ ﺳﻴﺘﻢ ﺍﻟﺘﻘﺎﻃﻬﺎ ﰲ ﻛﺘﻠﺔ ﺍﻻﻟﺘﻘﺎﻁ ‪.‬‬
‫ﻳﺴﺘﻌﻤﻞ ﺍﻻﺳﺘﺜﻨﺎﺀ ﺛﻼﺙ ﻛﻠﻤﺎﺕ ﺃﺳﺎﺳـﻴﺔ ﺟﺪﻳـﺪﺓ ‪. try ،catch ،throw‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﻳﻮﺿﺢ ﻣﻴﺰﺍﺕ ﺁﻟﻴﺔ ﺍﻻﺳﺘﺜﻨﺎﺀ ﻫﺬﻩ ) ﻫﻮ ﻓﻘﻂ ﲣﻄﻴﻂ ﻋﺎﻡ ﻹﻇﻬﺎﺭ ﺍﻟﺘﺮﻛﻴـﺐ ﺍﳌﻨﻄﻘـﻲ‬
‫ﻟﻼﺳﺘﺜﻨﺎﺀ(‪-:‬‬

‫‪//Program 9-4:‬‬
‫‪class any class‬‬
‫{‬
‫‪public:‬‬
‫‪class an error‬‬
‫{‬
‫;}‬
‫) (‪void func‬‬
‫{‬
‫)‪if ( /* Error condition*/‬‬
‫;) (‪throw an Error‬‬
‫}‬

‫‪202‬‬
‫;}‬
‫) (‪void main‬‬
‫‪//Continued‬‬
‫{‬
‫‪try‬‬
‫{‬
‫;‪any class obj1‬‬
‫;) (‪obj1.func‬‬
‫}‬
‫)‪catch(any class:: An Error‬‬
‫{‬
‫‪// tell user about the Error‬‬
‫}‬
‫}‬

‫ﻳﺒﺪﺃ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﺑﻔﺌﺔ ﺗﺪﻋﻰ ‪ anyclass‬ﻭﻫﻰ ﲤﺜﻞ ﺃﻱ ﻓﺌﺔ ﳝﻜﻦ ﺃﻥ ﲢﺪﺙ ﻓﻴﻬـﺎ‬
‫ﺃﻱ ﺃﺧﻄﺎﺀ‪ .‬ﻳﺘﻢ ﲢﺪﻳﺪ ﻓﺌﺔ ﺍﻻﺳﺘﺜﻨﺎﺀ ﰲ ﺍﳉﺰﺀ ﺍﻟﻌﺎﻡ ﻣﻦ ﺍﻟﻔﺌﺔ ‪ .any class‬ﺗﻘـﻮﻡ ﺍﻷﻋﻀـﺎﺀ‬
‫ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺘﺎﺑﻌﺔ ﻟﻠﻔﺌﺔ ‪ any class‬ﺑﺎﻟﺘﺪﻗﻴﻖ ﲝﺜﹰﺎ ﻋﻦ ﺃﻱ ﺧﻄﺄ ‪ .‬ﺇﺫﺍ ﻭﺟﺪ ﺗﻘﻮﻡ ﺑﺮﻣﻲ ﺍﺳـﺘﺜﻨﺎﺀ‬
‫ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪ throw‬ﻳﻠﻴﻬﺎ ﺍﳌﺸﻴﺪ ﺍﻟﺘﺎﺑﻊ ﻟﻔﺌﺔ ﺍﳋﻄﺄ (‪throw AnError‬‬
‫)‪.‬‬
‫ﻗﻤﻨﺎ ﰲ ) (‪ main‬ﲝﺼﺮ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻟﱵ ﺗﺘﻔﺎﻋﻞ ﻣﻊ ﺍﻟﻔﺌـﺔ ‪ any class‬ﰲ ﻛﺘﻠـﺔ‬
‫ﳏﺎﻭﻟﺔ ﺇﺫﺍ ﺳﺒﺒﺖ ﺃﻱ ﻭﺍﺣﺪﺓ ﻣﻦ ﺗﻠﻚ ﺍﻟﻌﺒﺎﺭﺍﺕ ﺍﻛﺘﺸﺎﻑ ﺧﻄﺄ ﰲ ﻋﻀﻮ ﺩﺍﱄ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪any‬‬
‫‪ class‬ﺳﻴﺘﻢ ﺭﻣﻰ ﺍﺳﺘﺜﻨﺎﺀ ﻭﻳﻨﺘﻘﻞ ﺍﻟﺘﺤﻜﻢ ﺇﱄ ﻛﺘﻠﺔ ﺍﻻﻟﺘﻘﺎﻁ ﺍﻟﱵ ﺗﻠﻲ ﺍﶈﺎﻭﻟﺔ ﻣﺒﺎﺷﺮﺓ‪.‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺴﺘﻌﻤﻞ ﺍﻻﺳﺘﺜﻨﺎﺀﺍﺕ ‪-:‬‬
‫‪//Program 9-5:‬‬
‫‪// Demonstrated Exceptions‬‬
‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬
‫;‪const int SIZE =3‬‬
‫‪class stack‬‬
‫{‬
‫‪private:‬‬

‫‪203‬‬
int tos;
int stck[SIZE];
public:
class Range { };
//Continued
stack( ) { tos = 0; }
~stack( ){ };
void push (int i);
int pop( );
};
void stack::push(int i)
{
if( tos >= SIZE)
throw Range ( );
else
{ stck[tos] = i;
tos ++;
}}
stack :: pop( )
{ if( tos == 0)
throw Range( );
else {
tos --;
return stck[tos];
}}
main ( )
{ stack s1;
try
{ s1.push(1);
s1.push(2);
//Continued
s1.push(3);
cout << s1.pop ( )<< endl;
cout << s1.pop ( )<< endl;

204
‫;‪cout << s1.pop ( )<< endl‬‬
‫;‪cout << s1.pop ( )<< endl‬‬
‫}‬
‫)‪catch (stack::Range‬‬
‫{‬
‫;‪cout << "Stack Full or Empty" << endl‬‬
‫}‬
‫;‪return 0‬‬
‫}‬

‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻋﺒﺎﺭﺗﲔ ﺗﺘﺴﺒﺒﺎﻥ ﰲ ﺭﻣﻲ ﺍﺳﺘﺜﻨﺎﺀ ﺇﺫﺍ ﺣﺬﻓﻨﺎ ﺭﻣﺰ ﺍﻟﺘﻌﻠﻴﻖ ﺍﻟﺬﻱ ﻳﺴﺒﻘﻬﻤﺎ‪ ،‬ﺍﺧﺘﱪ ﺍﳊﺎﻟﺘﲔ‪ .‬ﺳﺘﺮﻯ ﰲ ﻛﻼﳘﺎ ﺭﺳﺎﻟﺔ ﺍﳋﻄﺄ ﺍﻟﺘﺎﻟﻴﺔ‪-:‬‬

‫‪Stack Full or Empty‬‬


‫ﳛﺪﺩ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻭ ﹰﻻ ﺟﺴﻢ ﻓﺎﺭﻍ ﺍﻟﺪﺍﻟﺔ ﻷﻥ ﻛﻞ ﻣﺎ ﳓﺘﺎﺝ ﺇﻟﻴﻪ ﻫﻮ ﻓﻘﻂ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ﺍﻟﺬﻱ‬
‫ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﻟﺮﺑﻂ ﻋﺒﺎﺭﺓ ﺍﻟﺮﻣﻲ ‪ throw‬ﺑﻜﺘﻠﺔ ﺍﻻﻟﺘﻘﺎﻁ‪.‬‬
‫ﳛﺪﺙ ﺍﻻﺳﺘﺜﻨﺎﺀ ﰲ ﺍﻟﻔﺌﺔ ‪ stack‬ﺇﺫﺍ ﺣﺎﻭﻝ ﺍﻟﱪﻧﺎﻣﺞ ﺳﺤﺐ ﻗﻴﻤﺔ ﻋﻨﺪﻣﺎ ﻳﻜﻮﻥ ﺍﻟـ ‪stack‬‬
‫ﻓﺎﺭﻏﹰﺎ ﺃﻭ ﺣﺎﻭﻝ ﺩﻓﻊ ﻗﻴﻤﺔ ﻋﻨﺪﻣﺎ ﻳﻜﻮﻥ ﳑﺘﻠﺌﹰﺎ ‪.‬‬
‫ﻭﻹﺑﻼﻍ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻧﻪ ﻗﺪ ﺍﺭﺗﻜﺐ ﺧﻄﺄ ﻋﻨﺪ ﻋﻤﻠﻪ ﻣﻊ ﻛﺎﺋﻦ ‪ stack‬ﺗﺪﻗﻖ ﺍﻷﻋﻀـﺎﺀ‬
‫ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺘﺎﺑﻌﺔ ﻟﻠﻔﺌﺔ ‪ stack‬ﲝﺜﹰﺎ ﻋﻦ ﺧﻄﺄ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻋﺒﺎﺭﺍﺕ ‪ if‬ﻭﺗﺮﻣﻲ ﺍﺳﺘﺜﻨﺎﺀﹰﺍ ﺇﺫﺍ ﺣـﺪﺛﺖ‬
‫ﺇﺣﺪﻯ ﺗﻠﻚ ﺍﳊﺎﻻﺕ ‪ .‬ﻳﺘﻢ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﺭﻣﻲ ﺍﺳﺘﺜﻨﺎﺀ ﰲ ﻣﻜﺎﻧﲔ ﻛﻼﳘـﺎ ﺑﺎﺳـﺘﻌﻤﺎﻝ‬
‫ﺍﻟﻌﺒﺎﺭﺓ‪:‬‬
‫;) (‪throw range‬‬
‫ﺗﻘﻮﻡ ) (‪ range‬ﺑﺎﺳﺘﺤﻀﺎﺭ ﺍﳌﺸﻴﺪ )ﺍﻟﻀﻤﲏ( ﺍﻟﺘﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪ range‬ﺍﻟـﺬﻱ ﻳﻨﺸـﺊ‬
‫ﻛﺎﺋﻨﹰﺎ ﺗﺎﺑﻊ ﳍﺬﻩ ﺍﻟﻔﺌﺔ ﺑﻴﻨﻤﺎ ﺗﻘﻮﻡ ‪ throw‬ﺑﻨﻘﻞ ﲢﻜﻢ ﺍﻟﱪﻧﺎﻣﺞ ﺇﱃ ﻣﻌﺎﰿ ﺍﻻﺳﺘﺜﻨﺎﺀﺍﺕ‪ ،‬ﻛـﻞ‬
‫ﺍﻟﻌﺒﺎﺭﺍﺕ ﰲ ‪ main‬ﻭﺍﻟﱵ ﻗﺪ ﺗﺘﺴﺒﺐ ﰲ ﻫﺬﺍ ﺍﻻﺳﺘﺜﻨﺎﺀ ﳏﺼﻮﺭﺓ ﺑﲔ ﺃﻗﻮﺍﺱ ﺣﺎﺻﺮﺓ ﻭﺗﺴﺒﻘﻬﺎ‬
‫ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪. try‬‬
‫ﺍﳉﺰﺀ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﻭﺍﻟﺬﻱ ﻳﻌﺎﰿ ﺍﻻﺳﺘﺜﻨﺎﺀ ﻣﻮﺟﻮﺩ ﺑﲔ ﺃﻗﻮﺍﺱ ﺣﺎﺻﺮﺓ ﻭﺗﺴﺒﻘﻪ ﺍﻟﻜﻠﻤـﺔ‬
‫ﺍﻷﺳﺎﺳﻴﺔ ‪ catch‬ﻣﻊ ﻭﺟﻮﺩ ﺍﺳﻢ ﻓﺌﺔ ﺍﻻﺳﺘﺜﻨﺎﺀ ﰲ ﺃﻗﻮﺍﺱ ‪.‬‬
‫ﳚﺐ ﺃﻥ ﻳﺸﺘﻤﻞ ﺍﺳﻢ ﻓﺌﺔ ﺍﻻﺳﺘﺜﻨﺎﺀ ﻋﻠﻰ ﺍﻟﻔﺌﺔ ﺍﻟﱵ ﻳﺘﻮﺍﺟﺪ ﻓﻴﻬﺎ‪.‬‬
‫)‪catch(stack:: range‬‬

‫‪205‬‬
‫ﻳﺪﻋﻰ ﻫﺬﺍ ﺍﳌﺸﻴﺪ ﻣﻌﺎﰿ ﺍﺳﺘﺜﻨﺎﺀ ﻭﳚﺐ ﺃﻥ ﻳﻠﻲ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ ﻣﺒﺎﺷﺮﺓ ﻭﻫـﻮ ﻳﻘـﻮﻡ ﰲ‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﺑﻌﺮﺽ ﺭﺳﺎﻟﺔ ﺧﻄﺄ ﻓﻘﻂ ﻟﻜﻲ ﻳﻌﻠﻢ ﺍﳌﺴﺘﺨﺪﻡ ﻋﻦ ﺳﺒﺐ ﺗﻮﻗﻒ ﺍﻟﱪﻧﺎﻣﺞ ﻋـﻦ‬
‫ﺍﻟﻌﻤﻞ ‪.‬‬
‫ﻳﻨﺘﻘﻞ ﺍﻟﺘﺤﻜﻢ ﺑﻌﺪﻫﺎ ﺇﱄ ﻣﺎ ﺑﻌﺪ ﻣﻌﺎﰿ ﺍﻻﺳﺘﺜﻨﺎﺀ ﻟﻜﻲ ﻳﺴﺘﻄﻴﻊ ﻣﺘﺎﺑﻌﺔ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻭ ﻳﺮﺳﻞ ﺍﻟﺘﺤﻜﻢ‬
‫ﺇﱃ ﻣﻜﺎﻥ ﺁﺧﺮ ﺃﻭ ﻳﻨﻬﻰ ﺍﻟﱪﻧﺎﻣﺞ ﺇﺫﺍ ﱂ ﺗﻜﻦ ﻫﻨﺎﻟﻚ ﻃﺮﻳﻘﺔ ﺃﺧﺮﻯ ‪.‬‬
‫ﺍﳋﻄﻮﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ ﺗﻠﺨﺺ ﻋﻤﻠﻴﺔ ﺍﻻﺳﺘﺜﻨﺎﺀ‪-:‬‬
‫‪ /1‬ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺸﻜﻞ ﻃﺒﻴﻌﻲ ﺧﺎﺭﺝ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ ‪.‬‬
‫‪ /2‬ﻳﻨﺘﻘﻞ ﺍﻟﺘﺤﻜﻢ ﺇﱃ ﻛﺘﻠﺔ ﺍﳌﻌﺎﳉﺔ‪.‬‬
‫‪ /3‬ﻋﺒﺎﺭﺓ ﻣﺎ ﰲ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ ﺗﺴﺒﺐ ﺧﻄﺄ ﺩﺍﱄ ‪.‬‬
‫‪ /4‬ﻳﺮﻣﻲ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﺍﺳﺘﺜﻨﺎﺀ‪.‬‬
‫‪ /5‬ﻳﻨﺘﻘﻞ ﺍﻟﺘﺤﻜﻢ ﺇﱃ ﻛﺘﻠﺔ ﺍﻻﻟﺘﻘﺎﻁ ﺍﻟﱵ ﺗﻠﻲ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ‪.‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﺃﻳﻀﹰﺎ ﻳﻘﻮﻡ ﺑﺮﻣﻲ ﺍﺳﺘﺜﻨﺎﺀ ﺇﺫﺍ ﺣﺎﻭﻝ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ ﺭﻗﻢ ﺳﺎﻟﺐ ‪.negative‬‬

‫‪//Program 9-6:‬‬
‫‪// Catching class type exeptions.‬‬
‫>‪# include <iostream.h‬‬
‫>‪# include <string.h‬‬
‫>‪#include <conio.h‬‬
‫{ ‪class MyException‬‬
‫‪public:‬‬
‫;]‪char str_what[80‬‬
‫;‪int what‬‬
‫} ;‪MyException( ) { *str_what =0 ; what = 0‬‬
‫{ ) ‪MyException(char *s, int e‬‬
‫;)‪strcpy (str_what, s‬‬
‫;‪what = e‬‬
‫}‬
‫;}‬
‫) (‪int main‬‬
‫{‬
‫;‪int i‬‬
‫{ ‪try‬‬

‫‪206‬‬
cout << " Enter a positive number: " ;
cin >> i ;
if (i<0)
throw MyException ("Not Positive" ,i) ;
}
catch (MyException e) { // catch an error
cout <<e.str_what << ": " ;
cout << e.what << "\n" ;
}
getch();
return 0;
}

:i= -4 ‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺎﻓﺘﺮﺍﺽ ﺃﻥ ﺍﳌﺴﺘﺨﺪﻡ ﻗﺪ ﺃﺩﺧﻞ‬

Enter a positive number: -4


Not Positive: -4

‫ ﻭﻟﻜـﻦ ﺇﺫﺍ ﰎ‬،‫ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻳﻄﻠﺐ ﺍﻟﱪﻧﺎﻣﺞ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ ﺭﻗﻢ ﻣﻮﺟﺐ‬
‫ ﻟﻮﺻﻒ ﻫـﺬﺍ‬My Exception ‫ﺇﺩﺧﺎﻝ ﺭﻗﻢ ﺳﺎﻟﺐ ﻳﻘﻮﻡ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺈﻧﺸﺎﺀ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ‬
.‫ﺍﳋﻄﺄ‬

207
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﻗﻮﺍﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻫﻮ ﻭﺳﻴﻠﺔ ﳉﻌﻞ ﺍﻟﺪﺍﻟﺔ ﺗﻌﻤﻞ ﻋﻠﻰ ﺃﻱ ﻧﻮﻉ ﻣﻦ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧـﺎﺕ‬
‫ﺍﳌﺨﺘﻠﻔﺔ‪.‬‬
‫♦ ﻳﺘﻢ ﺇﻧﺸﺎﺀ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ ‪.Template‬‬
‫ﻼ ﺑـﻞ‬
‫♦ ﰲ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻻ ﻳﺘﻢ ﲤﺜﻴﻞ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻣﻌﲔ ﰲ ﺍﻟﺪﺍﻟﺔ ﻛـ ‪ int‬ﻣﺜ ﹰ‬
‫ﺑﺎﺳﻢ ﳝﻜﻦ ﺃﻥ ﻳﺸﲑ ﺇﱃ ﺃﻱ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻭﻳﺴﻤﻰ ﻫﺬﺍ ﺍﻻﺳﻢ ﻭﺳﻴﻄﺔ ﻗﺎﻟﺐ‪.‬‬
‫♦ ﳛﺪﺩ ﺍﳌﺼﺮﻑ ﻛﻴﻔﻴﺔ ﺗﺼﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﻋﻠﻰ ﺃﺳﺎﺱ ﻧﻮﻉ ﺍﻟﺒﻨﻴـﺎﺕ ﺍﳌﺴـﺘﻌﻤﻞ ﰲ‬
‫ﻭﺳﻴﻄﺎﺕ ﺍﺳﺘﺪﻋﺎﺋﻬﺎ‪.‬‬
‫ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻫﻮ ﻟﻴﺲ ﰲ ﺍﻟﻮﺍﻗﻊ ﺩﺍﻟﺔ‪ ،‬ﻫﻮ ﳐﻄﻂ ﻹﻧﺸﺎﺀ ﻋﺪﺓ ﺩﺍﻻﺕ‪.‬‬ ‫♦‬
‫ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﺃﻛﺜﺮ ﻣﻦ ﻭﺳﻴﻄﺔ ﻗﺎﻟﺐ ﰲ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ‪.‬‬ ‫♦‬
‫ﻗﺎﻟﺐ ﺍﻟﻔﺌﺎﺕ ﻫﻮ ﻓﺌﺔ ﺗﻌﻤﻞ ﻋﻠﻰ ﻣﺘﻐﲑﺍﺕ ﰲ ﻛﻞ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬ ‫♦‬
‫ﺗﺘﺒﻊ ﺍﻻﺳﺘﺜﻨﺎﺀﺍﺕ ﺃﺳﻠﻮﺑﹰﺎ ﻛﺎﺋﲏ ﺍﳌﻨﺤﻰ ﳌﻌﺎﳉﺔ ﺃﺧﻄﺎﺀ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﱵ ﺗﻮﻟﺪﻫﺎ ﺍﻟﻔﺌﺎﺕ ﰲ‬ ‫♦‬
‫‪.C++‬‬
‫♦ ﻋﻨﺪ ﺣﺪﻭﺙ ﺧﻄﺄ ﰲ ﺇﺣﺪﻯ ﺍﻟﻔﺌﺎﺕ ﺗﻘﻮﻡ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺑﺈﺑﻼﻍ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻥ ﺧﻄﺄ ﻣﺎ‬
‫ﻗﺪ ﺣﺪﺙ ﻭﻳﺴﻤﻰ ﻫﺬﺍ ﺍﻷﻣﺮ ﺭﻣﻰ ﺍﺳﺘﺜﻨﺎﺀ‪.‬‬
‫♦ ﳛﺘﻮﻯ ﺑﺮﻧﺎﻣﺞ ‪ C++‬ﻋﻠﻰ ﺟﺰﺀ ﻣﻨﻔﺼﻞ ﳌﻌﺎﳉﺔ ﺍﻷﺧﻄﺎﺀ ﻳﺴﻤﻰ ﻣﻌﺎﰿ ﺍﻻﺳﺘﺜﻨﺎﺀ ﺃﻭ ﻛﺘﻠﺔ‬
‫ﺍﻻﻟﺘﻘﺎﻁ‪.‬‬
‫♦ ﺃﻱ ﻋﺒﺎﺭﺍﺕ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺗﺴﺘﻌﻤﻞ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ﺗﻜﻮﻥ ﻣﻮﺟﻮﺩﺓ ﺩﺍﺧﻞ ﻛﺘﻠﺔ ﺗﺴﻤﻰ ﻛﺘﻠﺔ‬
‫ﺍﶈﺎﻭﻟﺔ‪.‬‬
‫♦ ﻳﺴﺘﻌﻤﻞ ﺍﻻﺳﺘﺜﻨﺎﺀ ﺛﻼﺙ ﻛﻠﻤﺎﺕ ﺃﺳﺎﺳﻴﺔ ﻫﻲ‪.try, catch, throw :‬‬
‫♦ ﺍﳋﻄﻮﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ ﺗﻠﺨﺺ ﻋﻤﻠﻴﺔ ﺍﻻﺳﺘﺜﻨﺎﺀ‪-:‬‬
‫ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺸﻜﻞ ﻃﺒﻴﻌﻲ ﺧﺎﺭﺝ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ‪.‬‬
‫ﻳﻨﺘﻘﻞ ﺍﻟﺘﺤﻜﻢ ﺇﱃ ﻛﺘﻠﺔ ﺍﳌﻌﺎﳉﺔ‪.‬‬ ‫‬

‫ﻗﺪ ﺗﺆﺩﻯ ﻋﺒﺎﺭﺓ ﻣﺎ ﰲ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ ؟؟؟ ﺧﻄﺄ ﰲ ﻋﻀﻮ ﺩﺍﱄ‪.‬‬ ‫‬

‫ﻳﺮﻣﻰ ﺍﻟﻌﻀﻮ ﺍﻟﺪﺍﱄ ﺍﺳﺘﺜﻨﺎﺀ‪.‬‬ ‫‬

‫ﻳﻨﺘﻘﻞ ﺍﻟﺘﺤﻜﻢ ﺇﱃ ﻛﺘﻠﺔ ﺍﻻﻟﺘﻘﺎﻁ ﺍﻟﱵ ﺗﻠﻲ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ‪.‬‬ ‫‬

‫‪208‬‬
‫ﺍﻷﺳﺌﻠﺔ‬
‫‪ /1‬ﺃﻛﺘﺐ ﺩﺍﻟﺔ ﻗﺎﻟﺐ ﺗﺪﻋﻰ ‪ IsEqualTo‬ﻭﺍﻟﱵ ﺗﻘﺎﺭﻥ ﺑﲔ ﻭﺳﻴﻄﲔ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ‬
‫== ﻭﺗﺮﺟﻊ ‪ 1‬ﺇﺫﺍ ﻛﺎﻧﺘﺎ ﻣﺘﻄﺎﺑﻘﺘﲔ ﻭ ‪ 0‬ﺇﺫﺍ ﻛﺎﻧﺘﺎ ﻏﲑ ﺫﻟﻚ‪.‬‬
‫ﰒ ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻻﺧﺘﺒﺎﺭ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻣﻊ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ‪ C++‬ﺍﻷﺳﺎﺳﻴﺔ‪.‬‬
‫ﻗﻢ ﺑﺘﺤﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ == ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻭﺍﺧﺘﱪﻫﺎ ﻣﻊ ﻛﺎﺋﻨﺎﺕ‪.‬‬

‫‪ /2‬ﻣﺎ ﻫﻲ ﺍﻟﻌﻼﻗﺔ ﺑﲔ ﻗﻮﺍﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻭﲢﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‪.‬‬

‫‪ /3‬ﻭﺿﺢ ﺍﻟﻌﻼﻗﺔ ﺑﲔ ﻗﺎﻟﺐ ﺍﻟﻔﺌﺎﺕ ﻭﺍﻟﻮﺭﺍﺛﺔ‪.‬‬

‫‪ /4‬ﻋﺮﻑ ﺍﻹﺳﺘﺜﻨﺎﺀ‪.‬‬

‫‪ /5‬ﺃﻛﺘﺐ ﺍﳋﻄﻮﺍﺕ ﺍﻟﱵ ﺗﻮﺿﺢ ﻋﻤﻠﻴﺔ ﺍﻹﺳﺘﺜﻨﺎﺀ‪.‬‬

‫‪ /6‬ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﺗﺴﺘﺨﺪﻡ ﻓﻴﻪ ﺁﻟﻴﺔ ﺍﻹﺳﺘﺜﻨﺎﺀﺍﺕ‪.‬‬

‫‪209‬‬
‫ﺍﻟﻮﺣﺪﺓ ﺍﳊﺎﺩﻳﺔ ﻋﺸﺮﺓ‬
‫‪11.0‬‬
‫ﺩﺧﻞ‪/‬ﺧﺮﺝ ‪C++‬‬ ‫ﺩﻓﻖ‬

‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪:‬‬


‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﺨﺪﺍﻡ )ﺩﻓﻖ ﺩﺧﻞ‪ /‬ﺧﺮﺝ( )‪(Input/Output Stream‬‬
‫ﰲ ﻟﻐﺔ ‪.C++‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺗﻨﺴﻴﻖ ﺍﻟﺪﺧﻞ ‪/‬ﺍﳋﺮﺝ‪.‬‬
‫♦ ﺳﺘﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻴﻔﻴﺔ ﺇﺩﺧﺎﻝ ﻭﺇﺧﺮﺍﺝ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﱵ ﺗﻨﺸﺌﻬﺎ ﺑﻨﻔﺴﻚ‪.‬‬
‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺇﻧﺸﺎﺀ ﻣﻨﺎﻭﺭﺍﺕ ﺧﺎﺻﺔ ﺑﻚ‪.‬‬

‫‪210‬‬
‫ﻣﻘﺪﻣﺔ‬ ‫‪11.1‬‬

‫ﺍﻟﺪﻓﻖ ﻫﻮ ﺍﺳﻢ ﻋﺎﻡ ﻳﻄﻠﻖ ﻟﺴﻴﻞ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺣﺎﻟﺔ ﺩﺧﻞ‪/‬ﺧﺮﺝ ‪ .‬ﻳﺘﻢ ﲤﺜﻴـﻞ ﺩﻓـﻖ‬
‫ﻼ ﺭﺃﻳﻨﺎ ﰲ ﲨﻴﻊ ﺍﻷﻣﺜﻠﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻛﺎﺋﻨﺎﺕ ﺍﻟـﺪﻓﻖ‬
‫)ﺍﻟﺪﺧﻞ‪ /‬ﺍﳋﺮﺝ( ﺑﻜﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻔﺌﺔ ﻣﻌﻴﻨﺔ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫‪ cout ،cin‬ﻭﺍﻟﱵ ﺍﺳﺘﻌﻤﻠﻨﺎﻫﺎ ﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺪﺧﻞ ﻭﺍﳋﺮﺝ‪.‬‬

‫ﻫﺮﻣﻴﺔ ﻓﺌﺎﺕ ﺍﻟﺪﻓﻖ‬ ‫‪11.2‬‬

‫ﺗﺎﺑﻊ ﺍﻟﺸﻜﻞ )‪ (11-1‬ﺍﻟﺘﺎﱄ‪:‬‬

‫‪ios‬‬

‫‪istream‬‬ ‫‪ostream‬‬

‫‪iostream‬‬

‫ﺍﻟﺸﻜﻞ ‪ 11-1‬ﻳﻮﺿﺢ ﻫﺮﻣﻴﺔ ﻓﺌﺎﺕ ﺍﻟﺪﻓﻖ‬


‫ﻛﻤﺎ ﻧﺮﻯ ﻣﻦ ﺍﻟﺸﻜﻞ ﺍﻟﻔﺌﺔ ‪ ios‬ﻫﻲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﳍﺮﻣﻴﺔ ﺩﻓﻖ ﺍﻟﺪﺧﻞ ﻭﺍﳋﺮﺝ ﻭﻫـﻰ‬
‫ﲢﺘﻮﻯ ﻋﻠﻰ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺜﻮﺍﺑﺖ ﻭﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﳌﺸﺘﺮﻛﺔ ﺑﲔ ﳐﺘﻠﻒ ﺍﻷﻧﻮﺍﻉ ﻣﻦ ﻓﺌﺎﺕ ﺍﻟﺪﺧﻞ‬
‫ﻭﺍﳋﺮﺝ‪ .‬ﺍﻟﻔﺌﺘﺎﻥ ‪ istream‬ﻭ ‪ ostream‬ﻣﺸﺘﻘﺎﺕ ﻣﻦ ﺍﻟﻔﺌﺔ ‪ ios‬ﻭﳘـﺎ ﻣﺘﺨﺼﺼـﺘﺎﻥ‬
‫ﺑﺄﻋﻤﺎﻝ ﺍﻟﺪﺧﻞ ﻭﺍﳋﺮﺝ ‪ .‬ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ ‪ istream‬ﻋﻠﻰ ﺃﻋﻀـﺎﺀ ﺩﺍﻟﻴـﺔ ﻟــ ) (‪، get‬‬
‫) (‪ getline‬ﻭﻋﺎﻣﻞ ﺍﻟﺪﺧﻞ)>>( ﺑﻴﻨﻤﺎ ﲢﺘـﻮﻯ ﺍﻟﻔﺌـﺔ ‪ ostream‬ﻋﻠـﻰ ) (‪ put‬ﻭ‬
‫) (‪ write‬ﻭﻋﺎﻣﻞ ﺍﳋﺮﺝ )<<(‪.‬‬
‫ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ ‪ ios‬ﻋﻠﻰ ﺃﻏﻠﺒﻴﺔ ﺍﳌﻴﺰﺍﺕ ﺍﻟﱵ ﲢﺘﺎﺝ ﺇﻟﻴﻬﺎ ﻻﺳﺘﺨﺪﺍﻡ ﺍﻟﺪﻓﻖ ﰲ ‪ C++‬ﻭﻣﻦ‬
‫ﺃﻫﻢ ﻫﺬﻩ ﺍﳌﻴﺰﺍﺕ ﺃﻋﻼﻡ ﺍﻟﺘﻨﺴﻴﻖ‪.‬‬

‫‪211‬‬
‫ﺃﻋﻼﻡ ﺍﻟﺘﻨﺴﻴﻖ‬
‫‪11.3‬‬
‫‪Format state flags‬‬

‫ﻫﻲ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻋﻀﺎﺀ ﰲ ﺍﻟﻔﺌﺔ ‪ ios‬ﺗﻌﻤﻞ ﻟﺘﺤﺪﻳﺪ ﺧﻴﺎﺭﺍﺕ ﰲ ﻋﻤـﻞ ﻭﺗﻨﺴـﻴﻖ‬


‫ﺍﻟﺪﺧﻞ ﻭﺍﳋﺮﺝ‪.‬‬
‫ﻫﻨﺎﻟﻚ ﻋﺪﺓ ﻃﺮﻕ ﻟﻀﺒﻂ ﺃﻋﻼﻡ ﺍﻟﺘﻨﺴﻴﻖ ‪ ،‬ﻭﲟﺎ ﺃﻥ ﺍﻷﻋﻼﻡ ﻫﻲ ﺃﻋﻀﺎﺀ ﰲ ﺍﻟﻔﺌـﺔ ‪ios‬‬
‫ﳚﺐ ﻋﺎﺩﺓ ﻭﺿﻊ ﺍﺳﻢ ﺍﻟﻔﺌﺔ ‪ ios‬ﻭﻋﺎﻣﻞ ﺩﻗﺔ ﺍﳌﺪﻯ ﻗﺒﻠﻬﺎ ‪ .‬ﳝﻜﻦ ﺿﺒﻂ ﻛﻞ ﺍﻷﻋﻼﻡ ﺑﺎﺳﺘﻌﻤﺎﻝ‬
‫ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ) (‪ setf‬ﻭ) (‪ unsetf‬ﺍﻟﺘﺎﺑﻌﺔ ﻟﻠﻔﺌﺔ ‪-:ios‬‬
‫ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﺑﻌﺾ ﻷﻋﻼﻡ ﺗﻨﺴﻴﻖ ﺍﻟﻔﺌﺔ ‪-:ios‬‬
‫ﻣﻌﻨﺎﻩ‬ ‫ﺍﻟﻌﻠﻢ‬
‫ﲡﺎﻫﻞ ﺍﳌﺴﺎﻓﺎﺕ ﺍﻟﺒﻴﻀﺎﺀ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﻟﺪﺧﻞ‬ ‫‪skipws‬‬
‫ﳏﺎﺫﺍﺓ ﺍﳋﺮﺝ ﺇﱃ ﺍﻟﻴﺴﺎﺭ‬ ‫‪left‬‬
‫ﳏﺎﺫﺍﺓ ﺍﳋﺮﺝ ﺇﱃ ﺍﻟﻴﻤﲔ‬ ‫‪right‬‬
‫ﲢﻮﻳﻞ ﺇﱃ ﻋﺸﺮﻱ‬ ‫‪dec‬‬
‫ﺍﺳﺘﻌﻤﺎﻝ ﻣﺆﺷﺮ ﺍﻟﻘﺎﻋﺪﺓ ﰲ ﺍﳋﺮﺝ‬ ‫‪showbase‬‬
‫ﺇﻇﻬﺎﺭ ﺍﻟﻨﻘﻄﺔ ﺍﻟﻌﺸﺮﻳﺔ ﰲ ﺍﳋﺮﺝ‬ ‫‪showpoint‬‬
‫ﺍﺳﺘﻌﻤﺎﻝ ﺍﻷﺣﺮﻑ ﺍﻟﻜﺒﲑﺓ ﰲ ﺍﳋﺮﺝ‬ ‫‪uppercase‬‬
‫ﻋﺮﺽ )‪ (+‬ﻗﺒﻞ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺼﺤﻴﺤﺔ ﺍﳌﻮﺟﺒﺔ‬ ‫‪showpos‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﺍﺳﺘﻌﻤﺎﻝ ﻋﻠﻤﻲ ﺍﻟﺘﻨﺴﻴﻖ ‪ showpos‬ﻭ‬
‫‪-:showpoint‬‬

‫‪//Program 11-1:‬‬
‫>‪#include <iostream.h‬‬
‫) (‪int main‬‬
‫{‬
‫;)‪cout.setf(ios:: showpoint‬‬
‫;)‪cout.setf(ios:: showpos‬‬

‫‪cout<< 100.0; // displays + 100.0‬‬


‫; ‪return 0‬‬

‫‪212‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪+100.00‬‬

‫ﺍﳌﻨﺎﻭﺭﺍﺕ‬
‫‪11.4‬‬
‫‪Manipulators‬‬

‫ﺍﳌﻨﺎﻭﺭﺍﺕ ﻫﻲ ﺗﻌﻠﻴﻤﺎﺕ ﺗﻨﺴﻴﻖ ﺗﺪﺭﺝ ﰲ ﺍﻟﺪﻓﻖ ﻣﺒﺎﺷﺮﺓ ‪ ،‬ﺭﺃﻳﻨﺎ ﻣﻨﻬﺎ ﺣﱴ ﺍﻵﻥ ﺍﳌﻨﺎﻭﺭ‬
‫‪ endl‬ﻭﺍﻟﺜﺎﱐ ﻳﺮﺳﻞ ﺳﻄﺮﹰﺍ ﺟﺪﻳﺪﹰﺍ ﺇﱃ ﺍﻟﺪﻓﻖ‪.‬‬
‫ﻫﻨﺎﻟﻚ ﻧﻮﻋﺎﻥ ﻣﻦ ﺍﳌﻨﺎﻭﺭﺍﺕ ‪ ،‬ﻧﻮﻉ ﻳﺄﺧﺬ ﻭﺳﻴﻄﺔ ﻭﺍﻵﺧﺮ ﻻ ﻳﺄﺧﺬ ﺃﻱ ﻭﺳﻴﻄﺔ‪،‬‬
‫ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺑﻌﺾ ﺍﳌﻨﺎﻭﺭﺍﺕ ﺍﻟﱵ ﻻ ﺗﺄﺧﺬ ﺃﻱ ﻭﺳﻴﻄﺎﺕ‪-:‬‬
‫ﻫﺪﻓﻪ‬ ‫ﺍﳌﻨﺎﻭﺭ‬
‫ﺗﻨﺸﻴﻂ ﻣﻴﺰﺓ ﲣﻄﻰ ﺍﳌﺴﺎﻓﺎﺕ ﺍﻟﺒﻴﻀﺎﺀ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﻟﺪﺍﺧﻞ‬ ‫‪ws‬‬
‫ﺍﻟﺘﺤﻮﻳﻞ ﺇﱃ ﻋﺸﺮﻱ‬ ‫‪dec‬‬
‫ﺍﻟﺘﺤﻮﻳﻞ ﺇﱃ ﲦﺎﱐ‬ ‫‪oct‬‬
‫ﺍﻟﺘﺤﻮﻳﻞ ﺇﱃ ﺳﺖ ﻋﺸﺮﻱ‬ ‫‪hex‬‬
‫ﺇﺩﺭﺍﺝ ﺳﻄﺮ ﺟﺪﻳﺪ‬ ‫‪endl‬‬
‫ﺇﺩﺭﺍﺝ ﺣﺮﻑ ﺧﺎﻣﺪ ﻹ‪‬ﺎﺀ ﺳﻠﺴﻠﺔ ﺧﺮﺝ‬ ‫‪ends‬‬
‫ﻼ ﳋـﺮﺝ ﺍﳌـﺘﻐﲑ ‪ var‬ﰲ ﺍﻟﺘﻨﺴـﻴﻖ‬
‫ﺗﺪﺭﺝ ﻫﺬﻩ ﺍﳌﻨﺎﻭﺭﺍﺕ ﰲ ﺍﻟﺪﻓﻖ ﻣﺒﺎﺷﺮﺓ ‪ ،‬ﻓﻤﺜ ﹰ‬
‫ﺍﻟﺴﺘﻌﺸﺮﻯ ﻧﻜﺘﺐ‪:‬‬
‫;‪cout<<hex<<var‬‬
‫ﺇﻥ ﺍﳊﺎﻟﺔ ﺍﻟﱵ ﺗﻀﺒﻄﻬﺎ ﺍﳌﻨﺎﻭﺭﺍﺕ ﻟﻴﺲ ﳍﺎ ﻭﺳﻴﻄﺎﺕ ﺗﺒﻘﻰ ﻧﺸﻄﺔ ﺇﱃ ﺃﻥ ﻳـﺘﻢ ﺗـﺪﻣﲑ‬
‫ﺍﻟﺪﻓﻖ ﻭﻋﻠﻴﻪ ﳝﻜﻨﻨﺎ ﺧﺮﺝ ﻋﺪﺓ ﺃﺭﻗﺎﻡ ﰲ ﺍﻟﺘﻨﺴﻴﻖ ﺍﻟﺴﺘﻌﺸﺮﻯ ﻣﻦ ﺧـﻼﻝ ﺇﺩﺭﺍﺝ ﻣﻨـﺎﻭﺭ ‪hex‬‬
‫ﻭﺍﺣﺪ ﻓﻘﻂ‪.‬‬
‫ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﻠﺨﺺ ﺑﻌﺾ ﺍﳌﻨﺎﻭﺭﺍﺕ ﺍﻟﱵ ﺗﺄﺧﺬ ﻭﺳﻴﻄﺎﺕ ﻭﳓﺘﺎﺝ ﺇﱃ ﺇﺩﺭﺍﺝ ﻣﻠﻒ ﺍﻟﺘﺮﻭﻳﺴـﺔ‬
‫‪ iomanip.h‬ﻟﻜﻲ ﻧﺴﺘﻌﻤﻞ ﻫﺬﻩ ﺍﳌﻨﺎﻭﺭﺍﺕ‪-:‬‬

‫‪213‬‬
‫ﻫﺪﻓﻪ‬ ‫ﺍﻟﻮﺳﻴﻄﺔ‬ ‫ﺍﳌﻨﺎﻭﺭ‬
‫ﺿﺒﻂ ﻋﺮﺽ ﺍﳊﻘﻞ ﺍﳌﻄﻠﻮﺏ ﻋﺮﺿﻪ‬ ‫ﻋﺮﺽ ﺍﳊﻘﻞ )‪(int‬‬ ‫)(‪setw‬‬
‫ﺿﺒﻂ ﺣﺮﻑ ﺍﳊﺸﻮ ﰲ ﺍﳋﺮﺝ)ﺍﳊﺮﻑ ﺍﻻﻓﺘﺮﺍﺿﻲ ﻫﻮ ﺍﳌﺴﺎﻓﺔ‬ ‫ﺣﺮﻑ ﺍﳊﺸﻮ )‪(int‬‬ ‫)(‪setfill‬‬
‫ﺿﺒﻂ ﺍﻟﺪﻗﺔ)ﻛﻤﻴﺔ ﺍﻷﺭﻗﺎﻡ ﺍﳌﻌﺮﻭﺿﺔ(‬ ‫ﺍﻟﺪﻗﺔ )‪(int‬‬ ‫)(‪setprecision‬‬
‫ﺿﺒﻂ ﺍﻷﻋﻼﻡ ﺍﶈﺪﺩﺓ‬ ‫ﺃﻋﻼﻡ ﺗﻨﺴﻴﻖ )‪(long‬‬ ‫)(‪set iosflags‬‬
‫ﻣﺴﺢ ﺍﻷﻋﻼﻡ ﺍﶈﺪﺩﺓ‬ ‫)(‪ Resetiosflags‬ﺃﻋﻼﻡ ﺗﻨﺴﻴﻖ )‪(long‬‬
‫ﻼ ﺇﺫﺍ‬
‫ﺇﻥ ﺍﳌﻨﺎﻭﺭﺍﺕ ﺍﻟﱵ ﺗﺄﺧﺬ ﻭﺳﻴﻄﺎﺕ ﺗﺆﺛﺮ ﻓﻘﻂ ﻋﻠﻰ ﺍﻟﺒﻨﺪ ﺍﻟﺘﺎﱄ ﰲ ﺍﻟـﺪﻓﻖ ﻓﻤـﺜ ﹰ‬
‫ﺍﺳﺘﻌﻤﻠﻨﺎ ﺍﳌﻨﺎﻭﺭ ) (‪ setw‬ﻟﻀﺒﻂ ﻋﺮﺽ ﺍﳊﻘﻞ ﺍﻟﺬﻱ ﻳﺘﻢ ﺇﻇﻬﺎﺭ ﺭﻗﻢ ﻣﺎ ﻓﻴـﻪ ﺳـﻨﺤﺘﺎﺝ ﺇﱃ‬
‫ﺍﺳﺘﻌﻤﺎﻟﻪ ﳎﺪﺩﹰﺍ ﻣﻊ ﺍﻟﺮﻗﻢ ﺍﻟﺘﺎﱄ‪.‬‬
‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﺴﺘﻌﻤﻞ ﺑﻌﺾ ﻫﺬﻩ ﺍﳌﻨﺎﻭﺭﺍﺕ ‪:‬‬

‫‪//Program 11-2:‬‬
‫>‪#include <iostream.h‬‬
‫>‪#include <iomanip.h‬‬

‫) (‪int main‬‬
‫{‬
‫;‪cout << hex << 100 << endl‬‬
‫;‪cout << setfill('?') << setw(10) << 2343.0‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪64‬‬
‫‪??????2343‬‬

‫‪214‬‬
‫ﺩﻭﺍﻝ ﺍﻟﺪﻓﻖ‬
‫‪11.5‬‬
‫‪Stream Functions‬‬

‫ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ ‪ ios‬ﻋﻠﻰ ﻋﺪﺩ ﻣﻦ ﺍﻟﺪﺍﻻﺕ ﺍﻟﱵ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻟﻀﺒﻂ ﺃﻋﻼﻡ ﺍﻟﺘﻨﺴﻴﻖ‬
‫ﻭﺗﻨﻔﻴﺬ ﻣﻬﺎﻡ ﺃﺧﺮﻯ ‪ .‬ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﻣﻌﻈﻢ ﻫﺬﻩ ﺍﻟﺪﺍﻻﺕ ‪.‬‬

‫ﻫﺪﻓﻬﺎ‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺇﻋﺎﺩﺓ ﺣﺮﻑ ﺍﳊﺸﻮ)ﺍﻟﻔﺮﺍﻍ ﻫﻮ ﺍﻻﻓﺘﺮﺍﺿﻲ(‬ ‫;) (‪ch=fill‬‬
‫ﺿﺒﻂ ﺣﺮﻑ ﺍﳊﺸﻮ‬ ‫;)‪fill(ch‬‬
‫ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺍﻟﺪﻗﺔ‬ ‫;) (‪p=precision‬‬
‫ﺿﺒﻂ ﺍﻟﺪﻗﺔ‬ ‫;)‪precision(p‬‬
‫ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻋﺮﺽ ﺍﳊﻘﻞ ﺍﻟﺘﺎﱄ‬ ‫;) (‪w=width‬‬
‫ﺿﺒﻂ ﺃﻋﻼﻡ ﺍﻟﺘﻨﺴﻴﻖ ﺍﶈﺪﺩﺓ‬ ‫;)‪setf(flags‬‬
‫ﺇﻟﻐﺎﺀ ﺿﺒﻂ ﺃﻋﻼﻡ ﺍﻟﺘﻨﺴﻴﻖ ﺍﶈﺪﺩﺓ‬ ‫;)‪unsetf (flags‬‬
‫ﻣﺴﺢ ﺍﳊﻘﻞ ﺃﻭ ﹰﻻ ﰒ ﺿﺒﻂ ﺍﻷﻋﻼﻡ‬ ‫;)‪setf(flags,field‬‬
‫ﻼ‬
‫ﻳﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﻫﺬﻩ ﺍﻟﺪﺍﻻﺕ ﺑﻮﺍﺳﻄﺔ ﻛﺎﺋﻨﺎﺕ ﺍﻟﺪﻓﻖ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻋﺎﻣﻞ ﺍﻟﻨﻘﻄـﺔ ‪،‬ﻓﻤـﺜ ﹰ‬
‫ﻟﻀﺒﻂ ﻋﺮﺽ ﺍﳊﻘﻞ ﻋﻨﺪ ‪ 5‬ﳝﻜﻨﻨﺎ ﻛﺘﺎﺑﺔ ‪:‬‬
‫;)‪cout.Width(5‬‬
‫ﺃﻳﻀﹰﺎ ﺗﻀﺒﻂ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ ﺣﺮﻑ ﺍﳊﺸﻮ ﻋﻨﺪ * ‪-:‬‬
‫;)’*‘(‪cout.fill‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺴﺘﺨﺪﻡ ﺍﻟﺪﻭﺍﻝ ) (‪ width‬ﻭ) (‪ precision‬ﻭ) (‪. fill‬‬
‫‪//Program 11-3:‬‬
‫>‪#include <iostream.h‬‬
‫>‪#include <iomanip.h‬‬
‫) (‪int main‬‬
‫{‬
‫; )‪cout.precision (4‬‬
‫;)‪cout.width(10‬‬
‫; "‪cout<< 10.12345 <<"\n‬‬
‫;)'?'(‪cout<<setfill‬‬
‫;)‪cout.width(10‬‬

‫‪215‬‬
‫; "‪cout<< 10.12345 <<"\n‬‬
‫‪//Continued‬‬
‫‪// field width applies to strings, too‬‬
‫;)‪cout.width(10‬‬
‫; "‪cout<< " Hi!" <<"\n‬‬
‫;)‪cout.width(10‬‬
‫;)‪cout.setf(ios::left‬‬
‫; ‪cout<< 10.12345‬‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪10.12‬‬
‫‪*****10.12‬‬
‫!‪*******Hi‬‬
‫*****‪10.12‬‬

‫‪istream‬‬ ‫ﺍﻟﻔﺌﺔ‬ ‫‪11.6‬‬

‫ﺗﻨﻔﺬ ﺍﻟﻔﺌﺔ ‪ istream‬ﺍﳌﺸﺘﻘﺔ ﻣﻦ ﺍﻟﻔﺌﺔ ‪ ios‬ﻧﺸﺎﻃﺎﺕ ﺧﺎﺻﺔ ﺑﺎﻟﺪﺧﻞ ﻭﻧﺸﺎﻃﺎﺕ‬


‫ﺇﺿﺎﻓﻴﺔ‪ .‬ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺑﻌﺾ ﺩﺍﻻﺕ ﺍﻟﻔﺌﺔ ‪. istream‬‬
‫ﻫﺪﻓﻬﺎ‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺇﺩﺧﺎﻝ ﻣﻨﺴﻖ ﻟﻜﻞ ﺍﻷﻧﻮﺍﻉ ﺍﻷﺳﺎﺳﻴﺔ ﻭﺍﶈﻤﻠﺔ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‬ ‫>>‬
‫ﺇﺩﺧﺎﻝ ﺣﺮﻑ ﻭﺍﺣﺪ‬ ‫)‪get(ch‬‬
‫ﻻ ﺇﱃ ’‪‘\o‬‬
‫ﺇﺩﺧﺎﻝ ﺃﺣﺮﻑ ﺇﱃ ﻣﺼﻔﻮﻓﺔ ﻭﺻﻮ ﹰ‬ ‫)‪get(str‬‬
‫ﺇﺩﺧﺎﻝ ﺣﱴ ‪ max‬ﺃﺣﺮﻑ ﺇﱃ ﺍﳌﺼﻔﻮﻓﺔ‬ ‫)‪get(str,max‬‬
‫ﻗﺮﺍﺀﺓ ﺣﺮﻑ ﻭﺍﺣﺪ ﻭﺗﺮﻛﻪ ﰲ ﺍﻟﺪﻓﻖ‬ ‫)‪peek(ch‬‬

‫‪216‬‬
‫ﺇﻋﺎﺩﺓ ﺇﺩﺭﺍﺝ ﺍﳊﺮﻑ ﺍﻷﺧﲑ ﺍﳌﻘﺮﻭﺀ ﰲ ﺩﻓﻖ ﺍﻟﺪﺧﻞ‬ ‫)‪putpack(ch‬‬
‫ﺇﻋﺎﺩﺓ ﻋﺪﺩ ﺍﻷﺣﺮﻑ ﺍﻟﱵ ﻗﺮﺃﻫﺎ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ )(‪ get‬ﻭ )(‪getline‬‬ ‫‪count=gcount‬‬
‫ﻼ ‪.‬ﻣﻌﻈﻤﻬﺎ ﻳﻌﻤﻞ ﻋﻠﻰ‬
‫ﻟﻘﺪ ﺭﺃﻳﻨﺎ ﺣﱴ ﺍﻵﻥ ﺑﻌﻀﹰﺎ ﻣﻦ ﻫﺬﻩ ﺍﻟﺪﺍﻻﺕ ﻛـ ) (‪ get‬ﻣﺜ ﹰ‬
‫ﺍﻟﻜﺎﺋﻦ ‪ cin‬ﺍﳊﻘﻴﻘﻲ ﳝﺜﻞ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‪.‬‬

‫‪217‬‬
‫‪ostream‬‬ ‫ﺍﻟﻔﺌﺔ‬ ‫‪11.7‬‬

‫ﺗﻌﺎﰿ ﺍﻟﻔﺌﺔ ‪ ostream‬ﻧﺸﺎﻃﺎﺕ ﺍﳋﺮﺝ‪ ،‬ﻳﺒﲔ ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﺃﻏﻠﺐ ﺍﻟﺪﺍﻻﺕ ﺍﻟﱵ‬
‫ﺗﺴﺘﻌﻤﻠﻬﺎ ﻫﺬﻩ ﺍﻟﻔﺌﺔ‪-:‬‬
‫ﻫﺪﻓﻬﺎ‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺇﺧﺮﺍﺝ ﻣﻨﺴﻖ ﻟﻜﻞ ﺍﻷﻧﻮﺍﻉ ﺍﻷﺳﺎﺳﻴﺔ ﻭﺍﶈﻤﻠﺔ ﺑﺸﻜﻞ ﺯﺍﺋﺪ‬ ‫<<‬
‫ﺇﺧﺮﺍﺝ ﺍﳊﺮﻑ ‪ ch‬ﰲ ﺍﻟﺪﻓﻖ‬ ‫)‪put(ch‬‬
‫ﻣﺴﺢ ﳏﺘﻮﻳﺎﺕ ﺍﻟﺪﺍﺭﺉ )‪ (Buffer‬ﻭﺇﺩﺭﺍﺝ ﺳﻄﺮ ﺟﺪﻳﺪ‬ ‫) (‪flush‬‬
‫ﺇﺧﺮﺍﺝ ‪ size‬ﺃﺣﺮﻑ ﻣﻦ ﺍﳌﺼﻔﻮﻓﺔ ‪str‬‬ ‫)‪write(str,size‬‬

‫ﻟﻘﺪ ﺍﺳﺘﻌﻤﻠﻨﺎ ﺣﱴ ﺍﻵﻥ ﻛﺎﺋﲏ ﺩﻓﻖ ‪cin‬ﻭ ‪ . cout‬ﻳﺮﺗﺒﻂ ﻫﺬﺍﻥ ﺍﻟﻜﺎﺋﻨـﺎﻥ ﻋـﺎﺩﺓ‬
‫ﺑﻠﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﻭﺍﻟﺸﺎﺷﺔ ﻋﻠﻰ ﺍﻟﺘﻮﺍﱄ ‪ .‬ﻫﻨﺎﻙ ﻛﺎﺋﻨﺎﻥ ﺁﺧﺮﺍﻥ ﳘﺎ ‪ cerr‬ﻭ ‪. clog‬‬
‫ﻏﺎﻟﺒﹰﺎ ﻣﺎ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﺎﺋﻦ ‪ cerr‬ﻟﺮﺳﺎﺋﻞ ﺍﳋﻄﺄ‪ .‬ﺍﳋﺮﺝ ﺍﳌﺮﺳﻞ ﺇﱃ ‪ cerr‬ﻳـﺘﻢ‬
‫ﻋﺮﺿﻪ ﻓﻮﺭﹰﺍ ﻭﻻ ﳝﻜﻦ ﺗﻐﻴﲑ ﻭﺟﻬﺘﻪ ﻟﺬﺍ ﺗﺮﻯ ﺭﺳﺎﻟﺔ ﺍﳋﺮﺝ ﻣﻦ ‪ cerr‬ﰲ ﺣﺎﻝ ﺗﻌﻄﻞ ﺍﻟﱪﻧـﺎﻣﺞ‬
‫ﻼ ﻟـ ‪ cerr‬ﻫﻮ ‪ clog‬ﻟﻜﻦ ﻳﺘﻢ ﻭﺿﻊ ﺧﺮﺝ ﺍﻟﻜﺎﺋﻦ ﰲ ﺍﻟﺪﺍﺭﺉ ﻋﻠﻰ‬
‫ﻛﻠﻴﹰﺎ‪ .‬ﻫﻨﺎﻟﻚ ﻛﺎﺋﻨﹰﺎ ﳑﺎﺛ ﹰ‬
‫ﻋﻜﺲ ‪.cerr‬‬
‫ﲢﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ << ﻭ >> ﺑﺸﻜﻞ ﺯﺍﺋﺪ‬ ‫‪11.8‬‬

‫<< ﻭ >> ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻹﺩﺧﺎﻝ ﻭﺇﺧﺮﺍﺝ ﻛﺎﺋﻨﺎﺕ ﺗﺎﺑﻌﺔ ﻟﻔﺌﺎﺕ‬ ‫ﳝﻜﻦ ﲢﻤﻴﻞ ﺍﻟﻌﻮﺍﻣﻞ‬
‫<<ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻭﺫﻟﻚ ﻹﺧﺮﺍﺝ‬ ‫ﻋﺮﻓﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ ‪.‬ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﻋﺎﻣﻞ ﺍﻹﺧﺮﺍﺝ‬
‫ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪.phonebook‬‬
‫‪//Program 11-4:‬‬
‫>‪#include <iostream‬‬
‫>‪#include <cstring‬‬

‫{ ‪class phonebook‬‬
‫‪// now private‬‬

‫‪218‬‬
char name[80];
int areacode;
//Continued
int prefix;
int num;
public:
phonebook(char *n, int a, int p, int nm)
{
strcpy(name, n) ;
areacode = a;
prefix =p;
num = nm;
}
friend ostream & operator <<(ostream &stream, phonebook
o);
};
// Display name and phone number.
ostream & operator << (ostream &stream, phonebook o)
{
stream<< o.name <<" ";
stream << "(" << o.areacode << ") " ;
stream <<o.prefix<< "-" << o.num <<"\n" ;
return stream; // must return stream
}
int main( )
{
phonebook a("Mohammed", 011, 011, 123456);
phonebook b("Omer" , 031, 011, 576890);
phonebook c("Ali" , 261, 011, 999009);
cout<<a<<b<<c;
return 0;
}

219
‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪Mohammed (011) 011 –123456‬‬


‫‪Omer (031) 011–576890‬‬
‫‪Ali (261) 011– 999009‬‬

‫ﻻﺣﻆ ﰲ ﺍﻟﺪﺍﻟﺔ ) (‪ main‬ﻣﺪﻯ ﺳﻬﻮﻟﺔ ﻣﻌﺎﻣﻠﺔ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ‪ phonebook‬ﻛﺄﻱ‬


‫ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﺃﺳﺎﺳﻲ ﺁﺧﺮ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺒﺎﺭﺓ‪-:‬‬
‫;‪cout<<a<<b<<c‬‬
‫ﰎ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ) ( <<‪ operator‬ﻋﻠﻰ ﺃ‪‬ﺎ ﺻﺪﻳﻘﺔ ﻟﻠﻔﺌﺔ ‪ phonebook‬ﻭﺫﻟﻚ‬
‫ﻷﻥ ﻛﺎﺋﻨﺎﺕ ‪ ostream‬ﺗﻈﻬﺮ ﰲ ﺍﳉﻬﺔ ﺍﻟﻴﺴـﺮﻯ ﻟﻠﻌﺎﻣـﻞ ﻭﻫـﻰ ﺗﻔﻴـﺪ ﻛﺎﺋﻨـﹰﺎ ﺗﺎﺑﻌـﹰﺎ‬
‫ﻟﻠﻔﺌﺔ ‪) ostream‬ﺍﻟﻌﺎﻣﻞ << (‪ ،‬ﺗﺴﻤﺢ ﻗﻴﻢ ﺍﻹﻋﺎﺩﺓ ﻫﺬﻩ ﺧﺮﺝ ﺃﻛﺜﺮ ﻣﻦ ﻗﻴﻤﺔ ﻭﺍﺣـﺪﺓ ﰲ‬
‫ﺍﻟﻌﺒﺎﺭﺓ ‪ .‬ﻳﻨﺴﺦ ﺍﻟﻌﺎﻣﻞ << ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺍﻟﻜﺎﺋﻦ ﺍﶈﺪﺩ ﻛﺎﻟﻮﺳﻴﻄﺔ ﺍﻟﺜﺎﻧﻴﺔ ﻭﻳﺮﺳـﻠﻬﺎ ﺇﱃ ﺍﻟـﺪﻓﻖ‬
‫ﺍﶈﺪﺩ ﻛﺎﻟﻮﺳﻴﻄﺔ ﺍﻷﻭﱃ‪.‬‬
‫ﲢﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ >> ﺑﺸﻜﻞ ﺯﺍﺋﺪ‪-:‬‬
‫ﻭﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ ﳝﻜﻨﻨﺎ ﲢﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ >> ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻹﺩﺧﺎﻝ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺍﻟﱵ ﻳﻌﺮﻓﻬـﺎ‬
‫ﺍﳌﺴﺘﺨﺪﻡ ﺑﻨﻔﺴﻪ‪ .‬ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺴﻤﺢ ﻟﻠﻤﺴﺘﺨﺪﻡ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ >> ﻹﺩﺧﺎﻝ ﻛﺎﺋﻨﺎﺕ ﺗﺎﺑﻌﺔ‬
‫ﻟﻠﻔﺌﺔ ‪. phonebook‬‬

‫‪//Program 11-5:‬‬
‫>‪#include <iostream.h‬‬
‫>‪#include <cstring.h‬‬

‫{ ‪class phonebook‬‬
‫;]‪char name[80‬‬
‫;‪int areacode‬‬
‫;‪int prefix‬‬
‫;‪int num‬‬

‫‪220‬‬
public:
phonebook( ) { };
phonebook(char *n, int a, int p, int nm)
{
strcpy(name, n) ;
areacode = a;
//Continued
prefix =p;
num = nm;
}
friend ostream & operator<<(ostream &stream, phonebook
o);
friend istream & operator>>(istream &stream, phonebook
&o);

};
// Display name and phone number.
ostream & operator << (ostream &stream, phonebook o)
{
stream<< o.name <<" ";
stream << "(" << o.areacode << ") " ;
stream <<o.prefix<< "-" << o.num <<"\n" ;
return stream; // must return stream
}
// Input name and telephone number.
istream & operator>> (istream &stream, phonebook &o)
{
cout << " Enter name: ";
stream>> o.name;
cout << " Enter area code: ";
stream>> o.areacode;
cout << " Enter prefix: ";
stream>> o.prefix;
cout << " Enter number: ";

221
stream>> o.num;
cout<<"\n" ;
return stream;
}
int main( )
{
phonebook b;
cin>> b;
cout << b;
//Continued
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

Enter name: Ahmed


Enter area code: 111
Enter prefix: 555
Enter number: 1010

Ahmed(111)555 –1010

‫ﻛﻴﻔﻴﺔ ﺇﻧﺸﺎﺀ ﻣﻨﺎﻭﺭﺍﺕ ﺧﺎﺻﺔ ﺑﻨﺎ‬ 11.9


. ‫ﳝﻜﻦ ﺃﻳﻀﹰﺎ ﻟﻠﻤﺴﺘﺨﺪﻡ ﺇﻧﺸﺎﺀ ﻣﻨﺎﻭﺭﺍﺕ ﺗﻘﻮﻡ ﺑﺘﻨﺴﻴﻖ ﺧﺎﺹ ﺑﺎﳌﺴﺘﺨﺪﻡ‬
-:‫ﺍﻟﺼﻮﺭﺓ ﺍﻟﻌﺎﻣﺔ ﻹﻧﺸﺎﺀ ﻣﻨﺎﻭﺭ ﺧﺮﺝ ﻫﻲ‬
ostream & mani-name( ostream & stream)
{
//your code here
return stream;
}
.(←) ‫ ﻳﻘﻮﻣﺎﻥ ﺑﺈﺧﺮﺍﺝ )→( ﻭ‬ra( )‫ ﻭ‬la( ) ‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻣﻨﺎﻭﺭﻳﻦ‬

222
//Program 11-6:
#include <iostream>
#include <iomanip>
#include <conio.h>

// Right Arrow
ostream &ra(ostream &stream)
{
stream << "-> " ;
return stream;
}
// Left Arrow
ostream &la(ostream &stream)
{
stream << "<- " ;
return stream;
}
int main( )
{
cout << "High balance" <<ra<< 1233.23<<"\n";
cout <<"Over draft" << ra<<567.66<< la;
getch();
return 0;
}
:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

High balance  1233.23


Over draft  567.66 

-:‫ﺍﻟﺼﻮﺭﺓ ﺍﻟﻌﺎﻣﺔ ﻹﻧﺸﺎﺀ ﻣﻨﺎﻭﺭ ﺩﺧﻞ ﻫﻲ‬


istream & mani-name(istream & stream)
{
//your code here
return stream;

223
}
‫ ﻭﺍﻟﺜﺎﱐ ﻳﻘﻮﻡ ﺑﺈﺧﺮﺍﺝ ﺻﻮﺕ‬getpass( ) ‫ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻣﻨﺎﻭﺭ ﺩﺧﻞ‬
. password ‫\‘ ﻭﻳﻄﻠﺐ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ‬a’ ‫ﺟﺮﺱ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺗﺘﺎﺑﻊ ﺍﳍﺮﻭﺏ‬
//Program 11-7:
#include <iostream>
#include <cstring>

// Asimple input manipulator.


istream &getpass (istream &stream)
{
cout << '\a' ; // sound bell
cout << "Enter password: ";
return stream;
}
int main( )
{
char pw[80];

do cin>> getpass >>pw;


while (strcmp (pw, "password"));
cout <<"logon complete\n";
return 0;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

Enter password: password


Login complete

224
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﺍﻟﺪﻓﻖ ﻫﻮ ﺍﺳﻢ ﻋﺎﻡ ﻳﻄﻠﻖ ﻟﺴﻴﻞ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺣﺎﻟﺔ ﺩﺧﻞ ‪/‬ﺧﺮﺝ‪.‬‬


‫♦ ﺍﻟﻔﺌﺔ ‪ ios‬ﻫﻲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﳍﺮﻣﻴﺔ ﺩﻓﻖ ﺍﻟﺪﺧﻞ ‪ /‬ﺍﳋﺮﺝ‪.‬‬
‫♦ ﺍﻟﻔﺌﺎﺕ ‪ ostream ،istream‬ﻣﺸﺘﻘﺘﺎﻥ ﻣﻦ ﺍﻟﻔﺌﺔ ‪ ios‬ﻭﳘﺎ ﳐﺘﺼﺘﺎﻥ ﺑﺄﻋﻤﺎﻝ‬
‫ﺍﻟﺪﺧﻞ ﻭﺍﳋﺮﺝ‪.‬‬
‫♦ ﺃﻋﻼﻡ ﺍﻟﺘﻨﺴﻴﻖ ﻫﻲ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻋﻀﺎﺀ ﰲ ﺍﻟﻔﺌﺔ ‪ ios‬ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﻨﺴﻴﻖ ﺍﻟﺪﺧﻞ‬
‫ﻭﺍﳋﺮﺝ‪.‬‬
‫♦ ﺍﳌﻨﺎﻭﺭﺍﺕ ﻫﻲ ﺗﻌﻠﻴﻤﺎﺕ ﺗﻨﺴﻴﻖ ﺗﺪﺭﺝ ﰲ ﺍﻟﺪﻓﻖ ﻣﺒﺎﺷﺮﺓ‪.‬‬
‫♦ ﻫﻨﺎﻟﻚ ﻧﻮﻋﺎﻥ ﻣﻦ ﺍﳌﻨﺎﻭﺭﺍﺕ‪ ،‬ﻧﻮﻉ ﻳﺄﺧﺬ ﻭﺳﻴﻄﺔ ﻭﺍﻵﺧﺮ ﻻ ﻳﺄﺧﺬ ﺃﻱ ﻭﺳﻴﻄﺔ‪.‬‬
‫ﺍﳊﺎﻟﺔ ﺍﻟﱵ ﺗﻀﺒﻄﻬﺎ ﺍﳌﻨﺎﻭﺭﺍﺕ ﺍﻟﱵ ﻟﻴﺲ ﳍﺎ ﻭﺳﻴﻄﺎﺕ ﺗﺒﻘﻰ ﻧﺸﻄﺔ ﺇﱃ ﺃﻥ ﻳﺘﻢ ﺍﻟﺪﻓﻖ‪.‬‬ ‫♦‬
‫ﻋﻨﺪ ﺍﺳﺘﻌﻤﺎﻝ ﺍﳌﻨﺎﻭﺭﺍﺕ ﳚﺐ ﺇﺧﺮﺍﺝ ﻣﻠﻒ ﺍﻟﺘﺮﻭﻳﺴﺔ ‪.iomanip.h‬‬ ‫♦‬
‫ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ ‪ ios‬ﻋﻠﻰ ﻋﺪﺩ ﻣﻦ ﺍﻟﺪﺍﻻﺕ ﺍﻟﱵ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻟﻀﺒﻂ ﺃﻋﻼﻡ ﺍﻟﺘﻨﺴﻴﻖ‪.‬‬ ‫♦‬
‫ﺗﻨﻔﺬ ﺍﻟﻔﺌﺔ ‪ ostream‬ﺍﳌﺸﺘﻘﺔ ﻣﻦ ﺍﻟﻔﺌﺔ ‪ ios‬ﻧﺸﺎﻃﺎﺕ ﺧﺎﺻﺔ ﺑﺎﻟﺪﺧﻞ‪.‬‬ ‫♦‬
‫♦ ﺗﻌﺎﰿ ﺍﻟﻔﺌﺔ ‪ ostream‬ﻧﺸﺎﻃﺎﺕ ﺍﳋﺮﺝ‪.‬‬
‫♦ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﺎﺋﻦ ‪ cerr‬ﻟﻌﺮﺽ ﺭﺳﺎﺋﻞ ﺍﳋﻄﺄ‪.‬‬
‫♦ ﳝﻜﻦ ﲢﻤﻴﻞ << ﻭ >> ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻹﺩﺧﺎﻝ ﻭ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻹﺩﺧﺎﻝ ﻭﺇﺧﺮﺍﺝ ﻛﺎﺋﻨﺎﺕ‬
‫ﺗﺎﺑﻌﺔ ﻟﻔﺌﺎﺕ ﻋﺮﻓﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ‪.‬‬
‫♦ ﳝﻜﻦ ﺇﻧﺸﺎﺀ ﻣﻨﺎﻭﺭﺍﺕ ﺗﻘﻮﻡ ﺑﺘﻨﺴﻴﻖ ﺧﺎﺹ ﺑﺎﳌﺴﺘﺨﺪﻡ‪.‬‬

‫‪225‬‬
‫ﺍﻷﺳﺌﻠﺔ‬
‫ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﻨﻔﺬ ﺍﻵﰐ‪:‬‬ ‫‪-1‬‬
‫ ﻃﺒﺎﻋﺔ ﺍﻟﻌﺪﺩ ﺍﻟﺼﺤﻴﺢ ‪ 40000‬ﻣﻊ ﳏﺎﺫﺍﺗﻪ ﻋﻠﻰ ﺍﻟﻴﺴﺎﺭ ﻋﻠﻰ ﺃﻥ ﻳﻜﻮﻥ ﻋﺮﺽ ﺍﳊﻘـﻞ‬
‫‪.15‬‬
‫ ﻗﺮﺍﺀﺓ ﺳﻠﺴﻠﺔ ﻭﲣﺰﻳﻨﻬﺎ ﰲ ﻣﺼﻔﻮﻓﺔ ﺃﺣﺮﻑ ‪.state‬‬
‫ﻃﺒﺎﻋﺔ ‪ 200‬ﺑﻌﻼﻣﺔ ﻭﺑﺪﻭﻥ ﻋﻼﻣﺔ‪.‬‬ ‫‬

‫ﻃﺒﺎﻋﺔ ﺍﻟﻌﺪﺩ ‪ 100‬ﺑﺎﻟﻨﻈﺎﻡ ﺍﻟﺴﺎﺩﺱ ﻋﺸﺮ‪.‬‬ ‫‬

‫‪ /2‬ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻟﺪﺧﻞ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﺑﺎﻟﻨﻈﺎﻡ ﺍﻟﻌﺸﺮﻱ ﻭﺍﻟﺜﻤﺎﱐ ﻭﺍﻟﺴﺎﺩﺱ ﻋﺸﺮ ﻭﺧﺮﺝ ﻫﺬﻩ ﺍﻷﻋﺪﺍﺩ‪ .‬ﺍﺧﺘﱪ ﺍﻟﱪﻧﺎﻣﺞ‬

‫ﺑﺎﻟﺒﻴﺎﻧﺎﺕ ﺍﻵﺗﻴﺔ‪:‬‬

‫×‪0‬‬
‫‪×10 ,‬‬ ‫‪010 ,‬‬ ‫‪10‬‬

‫‪226‬‬
‫ﺍﻟﻮﺣﺪﺓ ﺍﻟﺜﺎﻧﻴﺔ ﻋﺸﺮﺓ‬
‫‪12.0‬‬
‫ﻣﻌﺎﳉﺔ ﺍﳌﻠﻔﺎﺕ ‪File Processing‬‬

‫ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪:‬‬


‫♦ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺪﻓﻖ ﻭﺗﺘﻌﺮﻑ ﻋﻠﻰ ﺍﳌﻠﻔﺎﺕ ﺍﻟﺘﺘﺎﺑﻌﻴﺔ‪.‬‬
‫ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺇﻧﺸﺎﺀ ﻣﻠﻔﺎﺕ ﺗﺘﺎﺑﻌﻴﺔ‪ ،‬ﻭﺍﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ‪.‬‬ ‫♦‬

‫ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﺴﺠﻼﺕ ﺍﳌﺨﺘﻠﻔﺔ ﺗﺘﺎﺑﻌﻴﹰﺎ‪.‬‬ ‫♦‬

‫ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﺴﺠﻼﺕ ﺍﳌﺨﺘﻠﻔﺔ ﻋﺸﻮﺍﺋﻴﹰﺎ‪.‬‬ ‫♦‬

‫‪227‬‬
‫ﻣﻘﺪﻣﺔ‬ ‫‪12.1‬‬
‫ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺍﳌﺘﻐﲑﺍﺕ ﺃﻭ ﺍﳌﺼﻔﻮﻓﺎﺕ ﻫﻮ ﲣﺰﻳﻦ ﻣﺆﻗﺖ‪ ،‬ﻟﺬﻟﻚ ﳓﺘﺎﺝ ﺍﱃ ﻭﺳﻴﻠﺔ‬
‫ﲣﺰﻳﻦ ﺩﺍﺋﻤﺔ‪ .‬ﻭﺗﻮﻓﺮ ﺍﳌﻠﻔﺎﺕ ‪ Files‬ﻫﺬﻩ ﺍﻟﻮﺳﻴﻠﺔ‪.‬‬
‫ﳜﺰﻥ ﺍﳊﺎﺳﻮﺏ ﺍﳌﻠﻔﺎﺕ ﰲ ﻭﺳﺎﺋﻂ ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺜﺎﻧﻮﻳﺔ ﻣﺜﻞ ﺍﻷﻗﺮﺍﺹ‪.‬‬
‫ﰲ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ‪ ،‬ﺳﻨﻮﺿﺢ ﻛﻴﻔﻴﺔ ﺇﻧﺸﺎﺀ ﻭﻣﻌﺎﳉﺔ ﺍﳌﻠﻔﺎﺕ ﻣﻦ ﺧﻼﻝ ﺑﺮﺍﻣﺞ ﻟﻐﺔ ‪.C++‬‬
‫ﻋﺎﺩﺓ ﺗﺘﻜﻮﻥ ﺍﳌﻔﺎﺕ ﻣﻦ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺴﺠﻼﺕ ‪ Records‬ﻭﺍﻟﱵ ﺗﺘﻜﻮﻥ ﺑﺪﻭﺭﻫﺎ ﻣﻦ‬
‫ﻼ ﻋﻠﻰ ﳎﻤﻮﻋﺔ ﻣـﻦ ﺍﻟﺴـﺠﻼﺕ‬ ‫ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳊﻘﻮﻝ ‪ .Fields‬ﻳﺘﻜﻮﻥ ﻣﻠﻒ ﻟﻠﻤﻮﻇﻔﲔ ﻣﺜ ﹰ‬
‫ﻼ ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫)ﺳﺠﻞ ﻟﻜﻞ ﻣﻮﻇﻒ(‪ ،‬ﻭﻗﺪ ﳛﺘﻮﻱ ﺍﻟﺴﺠﻞ ﻣﺜ ﹰ‬
‫‪ .1‬ﺭﻗﻢ ﺍﳌﻮﻇﻒ‪.‬‬
‫‪ .2‬ﺇﺳﻢ ﺍﳌﻮﻇﻒ‪.‬‬
‫‪ .3‬ﺍﻟﻌﻨﻮﺍﻥ‪.‬‬
‫‪ .4‬ﺍﳌﺮﺗﺐ‪.‬‬
‫ﻟﺘﺴﻬﻴﻞ ﺍﻟﻮﺻﻮﻝ ﺍﱃ ﺳﺠﻞ ﻣﺎ ﰲ ﻣﻠﻒ‪ ،‬ﻳﺘﻢ ﺍﺧﺘﻴـﺎﺭ ﺣﻘـﻞ ﻣﻔﺘـﺎﺣﻲ ﻟﻠﺴـﺠﻞ‬
‫‪ .Record Key‬ﻭﺍﻟﺬﻱ ﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﻓﺮﻳﺪﹰﺍ ‪ Unique‬ﰲ ﺍﳌﻠﻒ‪.‬‬
‫ﰲ ﻣﻠﻒ ﺍﳌﻮﻇﻔﲔ ﺍﻋﻼﻩ‪ ،‬ﳝﻜﻦ ﺍﺧﺘﻴﺎﺭ ﺭﻗﻢ ﺍﳌﻮﻇﻒ ﻛﺤﻘﻞ ﻣﻔﺘﺎﺣﻲ ﻟﻠﻤﻠﻒ‪.‬‬
‫ﻫﻨﺎﻙ ﻋﺪﺓ ﻃﺮﻕ ﻟﺘﻨﻈﻴﻢ ﺍﻟﺴﺠﻼﺕ ﺩﺍﺧﻞ ﺍﳌﻠﻒ‪ ،‬ﺃﺷﻬﺮ ﺍﻟﻄﺮﻕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻫﻲ ﺍﳌﻠﻔﺎﺕ‬
‫ﺍﻟﺘﺘﺎﺑﻌﻴﺔ ‪ Sequential Files‬ﻭﺍﻟﱵ ﻳﺘﻢ ﻓﻴﻬﺎ ﲣﺰﻳﻦ ﺍﻟﺴﺠﻼﺕ ﺑﺘﺮﺗﻴﺐ ﺣﻘﻮﳍﺎ ﺍﳌﻔﺘﺎﺣﻴﺔ‪،‬‬
‫ﻼ ﰲ ﻣﻠﻒ ﺍﳌﻮﻇﻔﲔ‪ ،‬ﻳﻜﻮﻥ ﺃﻭﻝ ﺳﺠﻞ ﻫﻮ ﺍﻟﺴﺠﻞ ﺍﻟﺬﻱ ﳛﻤﻞ ﺃﻗﻞ ﺭﻗﻢ ﻣﻮﻇﻒ‪.‬‬
‫ﻓﻤﺜ ﹰ‬

‫ﺍﳌﻠﻔﺎﺕ ﻭﺍﻟﺪﻓﻖ‬
‫‪Files and Stream‬‬
‫‪12.2‬‬
‫ﺗﻌﺎﻣﻞ ‪ C++‬ﺍﳌﻠﻔﺎﺕ ﻛﻔﻴﺾ ﻣﺘﺘﺎﺑﻊ ﻣﻦ ﺍﻟﺜﻤﺎﻧﻴﺎﺕ ‪ .Bytes‬ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ ﻳﻮﺿـﺢ‬
‫ﻣﻠﻒ ﻳﺘﻜﻮﻥ ﻣﻦ ‪n Byte‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫‪9‬‬ ‫‪n-1‬‬

‫………………‬ ‫‪end‬‬

‫ﻋﻨﺪ ﻓﺘﺢ ﻣﻠﻒ ﻳﺘﻢ ﺇﻧﺸﺎﺀ ﻛﺎﺋﻦ ﻳﻘﺘﺮﻥ ﻣﻌﻪ ﺍﻟﺪﻓﻖ‪ .‬ﻟﻘﺪ ﺭﺃﻳﻨﺎ ﻣﻦ ﻗﺒﻞ ﺃﺭﺑﻌـﺔ ﻛﺎﺋﻨـﺎﺕ‬
‫ﻣﻨﺸﺄﺓ ﺃﺗﻮﻣﺎﺗﻴﻜﻴﺎﹰ‪ ،‬ﻭﻫﻲ ‪ cerr ، cin ،cout‬ﻭ ‪.clog‬‬

‫‪228‬‬
‫ﻳﺴﺘﺨﺪﻡ ﺍﻟﻜﺎﺋﻦ ‪ cin‬ﻹﺩﺧﺎﻝ ﺑﻴﺎﻧﺎﺕ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‪ ،‬ﻭﺍﻟﻜﺎﺋﻦ ‪ cout‬ﻳﺴـﺘﺨﺪﻡ‬
‫ﻹﺧﺮﺍﺝ ﺑﻴﺎﻧﺎﺕ ﺇﱃ ﺍﻟﺸﺎﺷﺔ‪ ،‬ﻭﺍﻟﻜﺎﺋﻨﺎﻥ ‪cerr‬ﻭ ‪ clog‬ﻳﺴﺘﺨﺪﻣﺎﻥ ﻹﺧﺮﺍﺝ ﺭﺳﺎﺋﻞ ﺍﻷﺧﻄﺎﺀ‬
‫ﺇﱃ ﺍﻟﺸﺎﺷﺔ‪.‬‬
‫ﻋﻨﺪ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﳌﻠﻔﺎﺕ‪ ،‬ﳚـﺐ ﺗﻀـﻤﲔ ﻣﻠﻔـﻲ ﺍﻟﺘﺮﻭﻳﺴـﺔ ‪ iostream.h‬ﻭ‬
‫‪ fstream.h‬ﺣﻴﺚ ﳛﺘﻮﻱ ﺍﳌﻠﻒ ‪ fstream.h‬ﻋﻠﻰ ﻓﺌﺎﺕ ﺍﻟﺪﻓﻖ ‪ ) ifstream‬ﻭﺍﻟﱵ‬
‫ﺗﺴﺘﺨﺪﻡ ﰲ ﺇﺩﺧﺎﻝ ﺑﻴﺎﻧﺎﺕ ﺇﱃ ﺍﳌﻠﻔﺎﺕ( ﻭ ‪) ofstream‬ﻭﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ ﻹﺧﺮﺍﺝ ﺑﻴﺎﺕ ﻣـﻦ‬
‫ﺍﳌﻔﺎﺕ(‪ ،‬ﻭ ‪) fstream‬ﻹﺩﺧﺎﻝ ﻭﺇﺧﺮﺍﺝ ﺑﻴﺎﻧﺎﺕ ﻣﻦ ﺍﳌﻠﻔﺎﺕ(‪.‬‬
‫ﻟﻔﺘﺢ ﻣﻠﻒ‪ ،‬ﳓﺘﺎﺝ ﻹﻧﺸﺎﺀ ﻛﺎﺋﻦ ﻳﺘﺒﻊ ﻹﺣﺪﻯ ﻫﺬﻩ ﺍﻟﻔﺌﺎﺕ‪.‬‬

‫ﺇﻧﺸﺎﺀ ﻣﻠﻒ ﺗﺘﺎﺑﻌﻲ‬


‫‪12.3‬‬
‫‪Creating a Sequential file‬‬
‫ﻻ ﺗﺘﻄﻠﺐ ‪ C++‬ﺃﻱ ﻫﻴﻜﻠﻴﺔ ﻣﻌﻴﻨﺔ ﻟﻠﻤﻠﻒ‪ ،‬ﻭﻋﻠﻴﻪ ﻻ ﻳﻮﺟﺪ ﻣﺼـﻄﻠﺢ ﺳـﺠﻼﺕ ﰲ‬
‫ﻣﻠﻔﺎﺕ ‪ C++‬ﻟﺬﺍ ﳚﺐ ﻋﻠﻰ ﺍﳌﱪﻣﺞ ﲢﺪﻳﺪ ﺍﻟﻜﻴﻔﻴﺔ ﺍﻟﱵ ﻳﺘﻢ ‪‬ﺎ ﺗﻨﻈﻴﻢ ﺍﳌﻠﻒ‪.‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﺇﻧﺸﺎﺀ ﻣﻠﻒ ﺗﺘﺎﺑﻌﻲ‪:‬‬

‫‪//Program 12-1‬‬
‫‪//Creating a sequential file‬‬
‫>‪#include<iostream.h‬‬
‫>‪#include<fstream.h‬‬
‫>‪#include<stdlib.h‬‬
‫) (‪main‬‬
‫{‬
‫;)‪ofstream outclientfile(“clients.dat”,ios::out‬‬
‫{)‪if (!outclientfile‬‬
‫;‪cerr<<”File could not be opened”<<endl‬‬
‫;)‪exit (1‬‬
‫}‬
‫”‪cout<<”Enter the account, name, and balance.‬‬
‫‪<<endl‬‬
‫‪<<”(Enter EOF to end input)”<<endl‬‬
‫;“ ?”<<‬
‫;‪int account‬‬

‫‪229‬‬
‫;]‪char name[10‬‬
‫‪//Continued‬‬
‫;‪float balance‬‬
‫{)‪while(cin>>account>>name>>balance‬‬
‫‪outclientfile<<account<<” “<<name<<” “<<balance‬‬
‫;‪<<endl‬‬
‫;“ ?”<<‪cout‬‬
‫}‬
‫;‪return 0‬‬
‫}‬

‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪Enter the account, name, and balance.‬‬


‫)‪(Enter EOF to end input‬‬
‫‪? 100 Ahmed 24.98‬‬
‫‪? 200 Ali 345.67‬‬
‫‪? 300 Hassan 0.00‬‬
‫‪? 400 Omer –42.16‬‬
‫‪? 500 Abbas 224.62‬‬
‫‪? ^Z‬‬

‫ﻼ‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻳﻨﺸﺊ ﻣﻠﻔﹰﺎ ﺗﺘﺎﺑﻌﻴﺎﹰ‪ ،‬ﺣﻴﺚ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻪ ﰲ ﻧﻈﺎﻡ ﺣﺴﺎﺑﺎﺕ ﻣﺜ ﹰ‬
‫ﻟﻴﺴﺎﻋﺪ ﰲ ﺇﺩﺍﺭﺓ ﺣﺴﺎﺑﺎﺕ ﺍﻟﻌﻤﻼﺀ‪.‬‬
‫ﻟﻜﻞ ﻋﻤﻴﻞ ﻣﻦ ﺍﻟﻌﻤﻼﺀ‪ ،‬ﻳﺘﺤﺼﻞ ﺍﻟﱪﻧﺎﻣﺞ ﻋﻠﻰ ﺭﻗﻢ ﺣﺴـﺎﺏ ﺍﻟﻌﻤﻴـﻞ ‪account‬‬
‫ﻭﺇﺳﻢ ﺍﻟﻌﻤﻴﻞ ‪ name‬ﻭﺭﺻﻴﺪ ﺍﻟﻌﻤﻴﻞ ‪ .balance‬ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﻳﺘﺤﺼﻞ ﻋﻠﻴﻬﺎ ﺍﻟﱪﻧﺎﻣﺞ ﻟﻜﻞ‬
‫ﻋﻤﻴﻞ ﲤﺜﻞ ﺳﺠﻞ ﺫﻟﻚ ﺍﻟﻌﻤﻴﻞ‪.‬‬

‫‪230‬‬
‫ﻳﺴﺘﺨﺪﻡ ﺭﻗﻢ ﺣﺴﺎﺏ ﺍﻟﻌﻤﻴﻞ ﻛﺤﻘﻞ ﻣﻔﺘﺎﺣﻲ‪ ،‬ﻭﻋﻠﻴﻪ ﻳﻜﻮﻥ ﺍﳌﻠﻒ ﻣﺮﺗﺒﹰﺎ ﺑﺘﺮﺗﻴﺐ ﺃﺭﻗﺎﻡ‬
‫ﺣﺴﺎﺑﺎﺕ ﺍﻟﻌﻤﻼﺀ‪.‬‬
‫ﰎ ﻓﺘﺢ ﺍﳌﻠﻒ ﻟﻠﻜﺘﺎﺑﺔ ﻓﻴﻪ‪ ،‬ﻟﺬﻟﻚ ﻳﻨﺸﺊ ﺍﻟﱪﻧﺎﻣﺞ ﻛﺎﺋﻦ ﺧﺮﺝ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪ofstream‬‬
‫ﻳﺪﻋﻰ ‪ ،outclientfile‬ﻭﰎ ﲤﺮﻳﺮ ﻭﺳﻴﻄﺘﲔ ﳌﺸﻴﺪ ﺫﻟﻚ ﺍﻟﻜـﺎﺋﻦ ﻭﳘـﺎ ﺇﺳـﻢ ﺍﳌﻠـﻒ‬
‫‪ ،Clients.dat‬ﻃﺮﻳﻘﺔ ﻓﺘﺢ ﺍﳌﻠﻒ )‪ios::out (File open mode‬‬
‫ﻳﻘﻮﻡ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﺑﺎﺳﺘﻘﺒﺎﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺪﺧﻠﺔ ﻭﺣﻔﻈﻬﺎ ﰲ ﺍﳌﻠﻒ‪ ،‬ﺇﱃ ﺃﻥ ﻳﺘﻢ ﺇﺩﺧﺎﻝ ﺭﻣـﺰ‬
‫‪‬ﺎﻳﺔ ﺍﳌﻠﻒ )‪.(<ctrl> Z‬‬
‫ﺧﺮﺝ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻔﺘﺮﺽ ﺃﻧﻪ ﰎ ﺇﺩﺧﺎﻝ ﺑﻴﺎﻧﺎﺕ ﲬﺴﺔ ﻋﻤﻼﺀ‪ ،‬ﰒ ﰎ ﺇﺩﺧﺎﻝ ﺭﻣـﺰ ‪‬ﺎﻳـﺔ‬
‫ﺍﳌﻠﻒ ‪.^Z‬‬
‫ﻧﻼﺣﻆ ﺃﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺘﻀﻤﲔ ﻣﻠﻒ ﺍﻟﺘﺮﻭﻳﺴﺔ ‪ stdlib.h‬ﺍﻟﺬﻱ ﳛﺘﻮﻱ ﻋﻠﻰ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ‬
‫‪ ،exit‬ﻭﺍﻟﱵ ﺗﻨﻬﻲ ﺍﻟﱪﻧﺎﻣﺞ ﰲ ﺣﺎﻟﺔ ﻋﺪﻡ ﻓﺘﺢ ﺍﳌﻠﻒ ﺑﺼﻮﺭﺓ ﺻﺤﻴﺤﺔ‪.‬‬

‫ﻗﺮﺍﺀﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻣﻠﻒ ﺗﺘﺎﺑﻌﻲ‬


‫‪Reading Data from a Sequential file‬‬
‫‪12.4‬‬

‫ﺳﻨﻘﻮﻡ ﺍﻵﻥ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﺑﻘﺮﺍﺀﺓ ﺍﳌﻠﻒ ﺍﻟﺴﺎﺑﻖ‪ ،‬ﻭﻃﺒﺎﻋﺔ ﳏﺘﻮﻳﺎﺗﻪ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪:‬‬

‫‪Program 12-2:‬‬
‫‪//Reading and printing a Sequential file‬‬
‫>‪#include<iostream.h‬‬
‫>‪#include<fstream.h‬‬
‫>‪#include<iomanip.h‬‬
‫>‪#include<stdlib.h‬‬

‫;)‪void outputline(int, char *, float‬‬


‫) (‪main‬‬
‫{‬
‫;)‪ifstream inClientFile(“clients.dat”,ios::in‬‬

‫{ )‪if (!inClientFile‬‬
‫;‪cerr << “File could not be opened” <<endl‬‬

‫‪231‬‬
exit(1);
}
int account;
char name[10];

//Continued
float balance;
cout <<setiosflags(ios::left) <<setw(10) <<”Account”
<<setw(13) <<”Name” <<”Balance”<<endl;

while(inClientFile >> account >.name >>balance)


outputline(account, name, balance);
return 0;
}
void outputline(int acct, char *name, float bal)
{
cout << setiosflags(ios::left) << setw(10)<< acct
<< setw(13) << name<< setw(7)
<< setprecision(2)
<< setiosflags(ios::showpoint | ios::right)
<< bal << endl;
}

:‫ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ‬

Account Name Balance


100 Ahmed 24.98
200 Ali 345.67
300 Hassan 0.00
400 Omer -42.16
500 Abbas 224.62

232
‫ﻳﺘﻢ ﻓﺘﺢ ﺍﳌﻠﻔﺎﺕ ﻟﻘﺮﺍﺀﺓ ﺑﻴﺎﻧﺎﺕ ﻣﻨﻬﺎ ﺑﺈﻧﺸﺎﺀ ﻛﺎﺋﻦ ﻳﺘﺒﻊ ﻟﻠﻔﺌﺔ ‪ ifstream‬ﻭﺍﻟﺬﻱ ﻳﺘﻢ‬
‫ﲤﺮﻳﺮ ﻭﺳﻴﻄﺘﲔ ﻟﻪ ﳘﺎ ﺇﺳﻢ ﺍﳌﻠﻒ ‪ clients.dat‬ﻭﻃﺮﻳﻘـﺔ ﻓـﺘﺢ ﺍﳌﻠـﻒ ‪File Open‬‬
‫‪ .mode‬ﻓﺎﻹﻋﻼﻥ‪:‬‬
‫;)‪ifstream inClientFile(“clients.dat”,ios::in‬‬
‫ﻳﻨﺸﺊ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪ ifstream‬ﻳﺪﻋﻰ ‪ ،inClientFile‬ﻟﻴﻘﻮﻡ ﺑﻔﺘﺢ ﺍﳌﻠﻒ‬
‫‪ clients.dat‬ﻟﻠﻘﺮﺍﺀﺓ ﻣﻨﻪ‪.‬‬
‫ﺍﻟﻮﺻﻮﻝ ﺍﻟﻌﺸﻮﺍﺋﻲ ﶈﺘﻮﻳﺎﺕ ﻣﻠﻒ ﺗﺘﺎﺑﻌﻲ‬
‫‪12.5‬‬
‫‪Random Access to a Sequential file‬‬

‫ﳝﻠﻚ ﻛﻞ ﻛﺎﺋﻦ ﻣﻠﻒ‪ ،‬ﻣﺆﺷﺮﻳﻦ ﻣﻘﺘﺮﻧﲔ ﺑﻪ ﻳﺴﻤﻴﺎﻥ ﻣﺆﺷﺮ ﺍﳊﺼﻮﻝ ‪get‬‬


‫‪ pointer‬ﻭﻣﺆﺷﺮ ﺍﻟﻮﺿﻊ ‪ ،put pointer‬ﻭﻳﺴﻤﻴﺎﻥ ﺃﻳﻀﹰﺎ ﻣﺆﺷﺮ ﺍﳊﺼﻮﻝ ﺍﳊﺎﱄ ﻭﻣﺆﺷﺮ‬
‫ﺍﻟﻮﺿﻊ ﺍﳊﺎﱄ‪.‬‬
‫ﰲ ﺑﻌﺾ ﺍﻷﺣﻴﺎﻥ‪ ،‬ﻗﺪ ﻧﺮﻏﺐ ﰲ ﺑﺪﺀ ﻗﺮﺍﺀﺓ ﺍﳌﻠﻒ ﻣﻦ ﺑﺪﺍﻳﺘﻪ ﻭﻣﺘﺎﺑﻌﺘﻪ ﺇﱃ ‪‬ﺎﻳﺘﻪ‪ ،‬ﻭﻗﺪ‬
‫ﺗﺮﻏﺐ ﻋﻨﺪ ﺍﻟﻜﺘﺎﺑﺔ ﺍﻟﺒﺪﺀ ﻣﻦ ﺍﻟﺒﺪﺍﻳﺔ ﻭﺣﺬﻑ ﺃﻱ ﳏﺘﻮﻳﺎﺕ ﻣﻮﺟﻮﺩﺓ ‪،‬ﻟﻜﻦ ﻫﻨﺎﻟﻚ ﺃﻭﻗﺎﺕ ﳓﺘﺎﺝ‬
‫ﻓﻴﻬﺎ ﺇﱃ ﺍﻟﺘﺤﻜﻢ ﲟﺆﺷﺮﺍﺕ ﺍﳌﻠﻔﺎﺕ‪ .‬ﻟﻜﻲ ﻧﺘﻤﻜﻦ ﻣﻦ ﺍﻟﻘﺮﺍﺀﺓ ﺃﻭ ﺍﻟﻜﺘﺎﺑﺔ ﰲ ﻣﻮﺍﻗﻊ ﻋﺸﻮﺍﺋﻴﺔ ﻣﻦ‬
‫ﺍﳌﻠﻒ‪.‬‬
‫ﺗﺘﻴﺢ ﺍﻟﺪﺍﻟﺘﺎﻥ ‪ seekg‬ﻭ ‪ seekp‬ﺿﺒﻂ ﻣﺆﺷﺮﻱ ﺍﳊﺼﻮﻝ ﻭﺍﻟﻮﺿﻊ ﻋﻠﻰ ﺍﻟﺘﻮﺍﱄ‪.‬‬
‫ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺪﻭﺍﻝ ) (‪ seekg‬ﻭ ) (‪ seekp‬ﺑﻄﺮﻳﻘﺘﲔ ‪-:‬‬
‫‪ /1‬ﻣﻊ ﻭﺳﻴﻄﺔ ﻭﺍﺣﺪﺓ ﻫﻲ ﻣﻮﻗﻊ ﺍﻟﺒﺎﻳﺖ ﺍﳌﻄﻠﻖ ﰲ ﺍﳌﻠﻒ ) ﺑﺪﺍﻳﺔ ﺍﳌﻠﻒ ﻫﻲ ﺍﻟﺒﺎﻳﺖ ‪.( 0‬‬
‫‪ /2‬ﻣﻊ ﻭﺳﻴﻄﺘﲔ ﺍﻷﻭﱃ ﺇﺯﺍﺣﺔ ﻣﻦ ﻣﻮﻗﻊ ﻣﻌﲔ ﰲ ﺍﳌﻠﻒ ﻭﺍﻟﺜﺎﻧﻴﺔ ﺍﳌﻮﻗﻊ ﺍﻟﺬﻱ ﰎ ﻗﻴﺎﺱ ﺍﻹﺯﺍﺣﺔ‬
‫ﻣﻨﻪ‪.‬‬
‫ﻫﻨﺎﻟﻚ ﺛﻼﺛﺔ ﺍﺣﺘﻤﺎﻻﺕ ﻟﻠﻮﺳﻴﻄﺔ ﺍﻟﺜﺎﻧﻴﺔ‪-:‬‬
‫‪ beg‬ﻭﻫﻰ ﺑﺪﺍﻳﺔ ﺍﳌﻠﻒ‪.‬‬ ‫)ﺃ(‬
‫)ﺏ( ‪ Cur‬ﻭﺗﻌﲎ ﺍﳌﻮﻗﻊ ﺍﳊﺎﱄ ﻟﻠﻤﺆﺷﺮ‪.‬‬
‫)ﺕ( ‪ End‬ﻭﺗﻌﲎ ‪‬ﺎﻳﺔ ﺍﳌﻠﻒ‪.‬‬
‫ﻼ ﺍﻟﻌﺒﺎﺭﺓ ‪-:‬‬
‫ﻓﻤﺜ ﹰ‬
‫;)‪seekp( -10,ios:: end‬‬
‫ﺳﺘﻀﻊ ﻣﺆﺷﺮ ﺍﻟﻮﺿﻊ ‪ 10‬ﺑﺎﻳﺘﺎﺕ ﻗﺒﻞ ‪‬ﺎﻳﺔ ﺍﳌﻠﻒ‪.‬‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺴﺘﺨﺪﻡ ﺍﻟﺪﺍﻟﺔ ‪ seekg‬ﻣﻊ ﻭﺳﻴﻄﺔ ﻭﺍﺣﺪﺓ‪:‬‬

‫‪233‬‬
Program 12-3:
#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<stdlib.h>
void outputline(int, char *, float);
main( )
{
//Continued
ifstream inClientFile(“clients.dat”, ios::in);
if (!inClientFile){
cerr<< “File could not be opened” <<endl;
exit(1);
}
cout <<”Enter request “<<endl
<<” 1 – List accounts with zero balances” << endl
<<” 2 – List accounts with credit balances”<<endl
<<” 3 – List accounts with debit balances”<<endl
<<” 4 – End of run” <<endl<<”?”;
int request;
//Continued
cin>> request;
while(request !=4) {
int account;
char name[10];
float balance;
inClientFile >>account >>nam>>balance;
switch (request) {
case 1:
cout <<endl <<”Account with zero balances:”
<<endl;
while(!inClientFile.eof()) {
if (balance==0)
outputline(account, name, balance);

234
inClientFile >>account >>name >>balance;
}
break;
case 2:
cout<<endl<<”Accounts with credit balance:”
<<endl;
while(!inClientFile.eof()) {

if (balance <0)
outputline(account, name, balance);
//Continued
inClientFile>>account >>name >>balance;
}
break;
case 3:
cout<<endl<<”Accounts with debit balances:”
<<endl;
while(!inClientFile.eof()) {
if (balance > 0)
outputline(account, name, balance);
inClientFile >>account>>name>>balance;
}
break;
}
inClientFile.clear( ); //reset eof for next input
inClientfile.seekg(0); //position to beginning of file
cout<<endl <<”? “;
cin>>request;
}

cout << “End of run.” <<endl;

return 0;
}

235
cout << setiosflags(ioa::left) << setw(10) << acct
<< setw(13) << name <<setw(7) <<setprecision(2)
<< setiosflags(ios::showpoint | ios::right)
<<bal <<endl;
}

:‫ﺍﻟﱪﻧﺎﻣﺞ‬ ‫ﺍﳋﺮﺝ ﻣﻦ‬

Enter request
1 – List accounts with zero balances
2 – List accounts with credit balances
3 – List accounts with debit balances
4 – End of run
?1
Accounts with zero balances:
300 Hassan 0.00

?2

Accounts with credit balances:


400 Omer -42.16

?3
Accounts with debit balances:
100 Ahmed 24.98
200 Ali 345.67
500 Abbas 224.62

?4

236
End of run.

237
‫ﺍﳌﻠﺨﺺ‪:‬‬

‫♦ ﺍﳌﻠﻔﺎﺕ ﻫﻲ ﻭﺳﻴﻠﺔ ﺩﺍﺋﻤﺔ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬


‫♦ ﺗﺘﻜﻮﻥ ﺍﳌﻠﻔﺎﺕ ﻋﺎﺩﺓ ﻣﻦ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺴﺠﻼﺕ‪.‬‬
‫♦ ﺗﺘﻜﻮﻥ ﺍﻟﺴﺠﻼﺕ ﻣﻦ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳊﻘﻮﻝ‪.‬‬
‫♦ ﻳﻜﻮﻥ ﻟﻜﻞ ﺳﺠﻞ ﺣﻘﻞ ﻣﻔﺘﺎﺣﻲ‪.‬‬
‫ﰲ ﺍﳌﻠﻔﺎﺕ ﺍﻟﺘﺘﺎﺑﻌﻴﺔ ﻳﺘﻢ ﲣﺰﻳﻦ ﺍﻟﺴﺠﻼﺕ ﺑﺘﺮﺗﻴﺐ ﺣﻘﻮﳍﺎ ﺍﳌﻔﺘﺎﺣﻴﺔ‪.‬‬ ‫♦‬
‫ﻋﻨﺪ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﳌﻠﻔﺎﺕ ﳚﺐ ﺗﻀﻤﲔ ﺍﳌﻠﻒ ‪.fstream.h‬‬ ‫♦‬
‫ﻋﻨﺪ ﻓﺘﺢ ﻣﻠﻒ ﻟﻠﻜﺘﺎﺑﺔ ﻓﻴﻪ ﳚﺐ ﺇﻧﺸﺎﺀ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ‪.ofstream‬‬ ‫♦‬
‫ﻳﺘﻢ ﻓﺘﺢ ﺍﳌﻠﻔﺎﺕ ﻟﻘﺮﺍﺀﺓ ﺑﻴﺎﻧﺎﺕ ﻣﻨﻬﺎ ﺑﺈﻧﺸﺎﺀ ﻛﺎﺋﻦ ﻳﺘﺒﻊ ﺍﻟﻔﺌﺔ ‪.ifstream‬‬ ‫♦‬
‫♦ ﻹﺳﺘﺮﺟﺎﻉ ﺑﻴﺎﻧﺎﺕ ﻣﻦ ﻣﻠﻒ ﺗﺘﻢ ﻗﺮﺍﺀﺓ ﺍﳌﻠﻒ ﻣﻦ ﺑﺪﺍﻳﺘﻪ ﻭﻗﺮﺍﺀﺓ ﻛﻞ ﳏﺘﻮﻳﺎﺕ ﺍﳌﻠﻒ‬
‫ﺑﺎﻟﺘﺘﺎﺑﻊ ﺣﱴ ﻧﺼﻞ ﺇﱃ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﻄﻠﻮﺑﺔ‪.‬‬
‫♦ ﳝﻠﻚ ﻛﻞ ﻛﺎﺋﻦ ﻣﻠﻒ ﻣﺆﺷﺮﻳﻦ ﻣﻘﺘﺮﻧﲔ ﺑﻪ ﻳﺴﻤﻴﺎﻥ ﻣﺆﺷﺮ ﺍﳊﺼﻮﻝ ‪get pointer‬‬
‫ﻭﻣﺆﺷﺮ ﺍﻟﻮﺿﻊ ‪.Put pointer‬‬
‫♦ ﺗﻀﺒﻂ ﺍﻟﺪﺍﻟﺘﺎﻥ ) (‪ seekg‬ﻭ ) (‪ seekp‬ﻣﺆﺷﺮﻱ ﺍﳊﺼﻮﻝ ﻭﺍﻟﻮﺿﻊ ﻋﻠﻰ ﺍﻟﺘﻮﺍﱄ‪.‬‬

‫‪238‬‬
‫ﺍﻷﺳﺌﻠﺔ‬
‫ﺃﻧﺸﺊ ﻣﻠﻒ ﻟﻠﻤﻮﻇﻔﲔ ﻳﺪﻋﻰ ‪ Employee‬ﻋﻠﻰ ﺃﻥ ﳛﺘﻮﻱ ﻛﻞ ﺳﺠﻞ ﰲ ﺍﳌﻠﻒ‬ ‫‪-1‬‬
‫ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻟﺘﺎﻟﻴﺔ‪-:‬‬
‫♦ ﺭﻗﻢ ﺍﳌﻮﻇﻒ‪.‬‬
‫♦ ﺇﺳﻢ ﺍﳌﻮﻇﻒ‪.‬‬
‫♦ ﺍﻟﻌﻨﻮﺍﻥ‪.‬‬
‫ﰒ ﻗﻢ ﺑﺈﺩﺧﺎﻝ ﺑﻴﺎﻧﺎﺕ ﲬﺴﺔ ﻣﻮﻇﻔﲔ‪.‬‬

‫ﺗﺄﻛﺪ ﻣﻦ ﺇﺩﺧﺎﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺍﻟﺴﺆﺍﻝ ﺍﻟﺴﺎﺑﻖ ﺑﺼﻮﺭﺓ ﺻﺤﻴﺤﺔ ﻭﺫﻟﻚ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ‬ ‫‪-2‬‬
‫ﻟﻘﺮﺍﺀﺓ ﳏﺘﻮﻳﺎﺕ ﺍﳌﻠﻒ‪.‬‬

‫ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﺑﺎﺳﺘﻘﺒﺎﻝ ﻣﻌﻠﻮﻣﺎﺕ ﻋﻦ ﻃﻼﺏ ﻛﻠﻴﺔ ﻭﻳﻀﻌﻬﺎ ﰲ ﻣﻠﻒ‬ ‫‪-3‬‬
‫ﻳﺴﻤﻰ ‪ ،Students‬ﲝﻴﺚ ﳛﺘﻮﻱ ﻣﻠﻒ ﺍﻟﻄﻼﺏ ﻋﻠﻰ ﺍﻵﰐ‪:‬‬
‫♦ ﺭﻗﻢ ﺍﻟﻄﺎﻟﺐ‪.‬‬
‫♦ ﺇﺳﻢ ﺍﻟﻄﺎﻟﺐ‪.‬‬
‫♦ ﲣﺼﺺ ﺍﻟﻄﺎﻟﺐ‪.‬‬
‫♦ ﺩﺭﺟﺔ ﺍﻟﻄﺎﻟﺐ‪.‬‬
‫♦ ﻭﻣﻦ ﰒ ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﺑﻘﺮﺍﺀﺓ ﻫﺬﺍ ﺍﳌﻠﻒ‪.‬‬

‫‪239‬‬
‫ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬‫ﺑﺴﻢ ﺍ‬

‫ﺃﻛﻮﺍﺩ ﻭﺑﺮﺍﻣﺞ ﺟﺎﻫﺰﺓ ﺧﺎﺻﺔ ﺑﻠﻐﺔ‬

C++

(‫ﺕ‬‫ )ﺘﻘﺭﺃ ﺴﻲ ﺁﻭ‬cout ‫ ﺍﻟﻁﺒﺎﻋﺔ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
cout << "Hello";

getch ();
}

(‫ )ﺘﻘﺭﺃ ﺴﻲ ﺇﻥ‬cin ‫ ﺍﻹﺩﺨﺎل‬3

:‫ وﺿﻌﻔﻪ‬،‫ﺑﺮﻧﺎﻣﺞ ﻟﻄﺒﺎﻋﺔ اﻟﺮﻗﻢ اﻟﻤُﺪﺧﻞ‬

#include <iostream.h>
#include <conio.h>

void main ()
{
int i;
cout << "Please enter an integer value: ";
cin >> i;
cout << "The value you entered is: " << i;
cout << "\nand its double is: " << i*2;

getch ();
}

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


‫‪ 3‬ﻟﻁﺒﺎﻋﺔ ﺍﻷﺤﺭﻑ ﺍﻟﻜﺒﻴﺭﺓ ﺍﻟﻤﻜﺎﻓﺌﺔ ﻟﻸﺭﻗﺎﻡ ﻤﻥ ‪) 90 – 65‬ﺃﺴﻜﻲ ﻜﻭﺩ(‪.‬‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬

‫)( ‪void main‬‬


‫{‬
‫)‪for (char x=65;x<=90;x++‬‬
‫;‪cout << " " << x‬‬

‫;)( ‪getch‬‬
‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬

‫‪ 3‬ﻟﻁﺒﺎﻋﺔ ﺍﻷﺭﻗﺎﻡ ﺍﻟﻤﻜﺎﻓﺌﺔ ﻟﻸﺤﺭﻑ ﻤﻥ ‪) A-Z‬ﺃﺴﻜﻲ ﻜﻭﺩ(‪.‬‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬

‫)( ‪void main‬‬


‫{‬
‫)‪for (int x='A' ;x<='Z' ;x++‬‬
‫;‪cout << " " << x‬‬

‫;)( ‪getch‬‬
‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬

‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ ‪ -‬ﻗﻠﻘﻴﻠﻴﺔ‬ ‫ﻡ‪ .‬ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬


.‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﺈﺩﺨﺎل ﻋﺩﺩﻴﻥ ﻭﻤﻥ ﺜﻡ ﺇﺠﺭﺍﺀ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺠﻤﻊ ﻭﺍﻟﻁﺭﺡ ﻭﺍﻟﻀﺭﺏ ﻭﺍﻟﻘﺴﻤﺔ ﻋﻠﻴﻬﻤﺎ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
int x, y;
cout << "x= ";
cin >> x;
cout << "y= ";
cin >> y;

cout << "x+y= " << x+y << endl;


cout << "x-y= " << x-y << endl;
cout << "x*y= " << x*y << endl;

if (y != 0)
cout << "x/y= " << (float)x/y << endl;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﺈﺩﺨﺎل ﻋﺩﺩﻴﻥ ﻭﻤﻥ ﺜﻡ ﺇﺠﺭﺍﺀ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺠﻤﻊ ﻭﺍﻟﻁﺭﺡ ﻭﺍﻟﻀﺭﺏ ﻭﺍﻟﻘﺴﻤﺔ ﻋﻠﻴﻬﻤﺎ )ﻟﻌﺩﺩ‬3
.(‫ﻤﻥ ﺍﻟﻤﺭﺍﺕ ﻴﺘﺭﻙ ﺘﺤﺩﻴﺩﻩ ﻟﺭﻏﺒﺔ ﺍﻟﻤﺴﺘﺨﺩﻡ‬

#include <iostream.h>
#include <conio.h>

void main ()
{
float L, M;
char ch;

do
{
cout << "\nEnter L: ";
cin >> L;
cout << "Enter M: ";
cin >> M;

cout << "\nL+M= " << L+M;


cout << "\nL-M= " << L-M;
cout << "\nL*M= " << L*M;
if (M != 0)
cout << "\nL/M= " << L/M;

cout << " \n Do Again (y/n): ";


cin >> ch;
}
while (ch != 'n');

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.‫ ﻭﺫﻟﻙ ﺒﺘﻜﺭﺍﺭﻩ‬x ‫ ﻋﻠﻰ ﺍﻟﺸﺎﺸﺔ ﻤﺘﻜﻭﻥ ﻤﻥ ﺤﺭﻑ‬E ‫ ﺒﺭﻨﺎﻤﺞ ﻴﻅﻬﺭ ﺤﺭﻑ‬3

#include <iostream.h>
#include <conio.h>

void main ( )
{
cout << "xxxxxxxx" << endl;
cout << "x" << endl;
cout << "x" << endl;
cout << "xxxxxxxx" << endl;
cout << "x" << endl;
cout << "x" << endl;
cout << "xxxxxxxx" << endl;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

14 - 0 ‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﺈﻅﻬﺎﺭ ﻤﺭﺒﻌﺎﺕ ﺍﻷﺭﻗﺎﻡ ﻤﻥ‬3

#include <iostream.h>
#include <conio.h>

void main ( )
{
for (int i = 0; i < 15; i++)
cout << i * i << " ";

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.‫ ﺒﺩﻻﻟﺔ ﻨﺼﻑ ﺍﻟﻘﻁﺭ ﺍﻟﺩﺍﺌﺭﺓ‬area ‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﺤﺴﺎﺏ ﻤﺴﺎﺤﺔ ﺍﻟﺩﺍﺌﺭﺓ‬3

#include <iostream.h>
#include <conio.h>

void main ( )
{
float R, Area;
float p1 = 3.14159 ;

cout << " Enter radius of circle: " ;


cin >> R;
Area = p1 * R * R;
cout << " Area is: " << Area << endl;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

.‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﺤﺴﺎﺏ ﺍﻟﺠﺫﺭ ﺍﻟﺘﺭﺒﻴﻌﻲ ﻟﻠﺭﻗﻡ ﺍﻟﻤﺩﺨل‬3

#include <iostream.h>
#include <math.h>
#include <conio.h>

void main ( )
{
float num, ans;
cout << " Enter a number: ";
cin >> num;
ans = sqrt(num) ;
cout << " square root is: " << ans << endl;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


:‫ ﺒﺭﻨﺎﻤﺞ ﻟﺒﻴﺎﻥ ﺍﻟﺘﺯﺍﻴﺩ ﻭﺍﻟﺘﻨﺎﻗﺹ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
int x = 10;

cout << " x = " << x << endl;


cout << "\n ++x = " << ++x << endl;
cout << " x++ = " << x++ << endl;
cout << "\n x = " << x << endl ;
cout << "\n --x = " << --x << endl;
cout << " x-- = " << x-- << endl;
cout << "\n x = " << x << endl ;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﺤﺴﺎﺏ ﻨﺎﺘﺞ ﺍﻟﻌﺩﺩ ﻤﺭﻓﻭﻉ ﻷﺱ ﻤﻌﻴﻥ‬3

#include <iostream.h>
#include <math.h>
#include <conio.h>

void main ()
{
int x, y, P ;

cout << " Enter a number: " ;


cin >> x ;
cout << " Enter a power : " ;
cin >> y ;

P = pow (x,y) ;

cout << " The result is : " << P << endl ;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.‫ﺩﺨﻠﺔ ﺇﻥ ﻜﺎﻨﺕ ﺃﻜﺒﺭ ﻤﻥ ﻤﺌﺔ ﺃﻭ ﻻ‬‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﻔﺤﺹ ﺃﻋﺩﺍﺩ ﻤ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
int x ;
L: cout << " Enter a number: ";
cin >> x;
if (x > 100)
cout << " Number is greater than 100\n";
else
cout << " Number is less than than 100\n";
goto L;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﻔﺤﺹ ﺍﻷﻋﺩﺍﺩ ﺍﻟﻤﺩﺨﻠﺔ ﺯﻭﺠﻴﺔ ﺃﻡ ﻓﺭﺩﻴﺔ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
int x, y;
L: cout << "\n Enter a number: " ;
cin >> x;
y=x%2;
if (y==0)
cout << " The number is even\n" << endl;
else
cout << " The number is odd\n" << endl;
goto L;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.(‫ﺩﺨل ﻋﺩﺩ ﻤﻌﻴﻥ ﻤﻥ ﺍﻟﻤﺭﺍﺕ ﻴﺤﺩﺩﻩ ﺍﻟﻤﺴﺘﺨﺩﻡ )ﺒﻁﺭﻴﻘﺔ ﺍﻻﺴﺘﺩﻋﺎﺀ‬‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﺘﻜﺭﺍﺭ ﺭﻤﺯ ﻤ‬3

#include <iostream.h>
#include <conio.h>

void T(char ,int);

void main ()
{
char L;
int M;

L: cout << "\nEnter a character: ";


cin >> L;
cout << "Enter number of times to repeat it: " ;
cin >> M;
T(L,M);
goto L;
getch();
}

void T(char ch, int n)


{
for (int j = 0; j < n; j++)
cout << ch ;
cout << endl;
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.(‫ﺩﺨل ﻋﺩﺩ ﻤﻌﻴﻥ ﻤﻥ ﺍﻟﻤﺭﺍﺕ ﻴﺤﺩﺩﻩ ﺍﻟﻤﺴﺘﺨﺩﻡ )ﺩﻭﻥ ﺍﺴﺘﺩﻋﺎﺀ‬‫ ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﺘﻜﺭﺍﺭ ﺭﻤﺯ ﻤ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
char L;
int M;

L: cout << "\n\nEnter a character: ";


cin >> L;
cout << "Enter number of times to repeat it: " ;
cin >> M;
for (int j=0 ; j < M; j++)
cout << L;
goto L;

getch();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


‫‪ 3‬ﺍﻟﻤﺼﻔﻭﻓﺎﺕ )ﺃﺴﻁﺭ ﻭﺃﻋﻤﺩﺓ(‪.‬‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬

‫) (‪void main‬‬
‫{‬
‫;]‪int b[3][3‬‬
‫;‪int i,j‬‬

‫;"‪cout << "Enter numbers: \n‬‬

‫)‪for (i=0; i<3; i++‬‬


‫)‪{for (j=0; j<3; j++‬‬
‫};]‪cin >> b[i][j‬‬

‫)‪for (i=0; i<3; i++‬‬


‫)‪{for (j=0; j<3; j++‬‬
‫;]‪cout << b[i][j‬‬
‫};"‪cout << "\n‬‬

‫;)( ‪getch‬‬
‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬

‫• ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﻁﺒﺎﻋﺘﻬﺎ ﺒﺸﻜل ﻋﻜﺴﻲ ﺘﺒﻘﻰ ﺠﻤﻠﺔ ﺍﻟﻘﺭﺍﺀﺓ ﻜﻤﺎ ﻫﻲ ﻭﻴﺼﺒﺢ ﺩﻭﺭﺍﻥ ﺍﻟﻁﺒﺎﻋﺔ ﻤﻥ ‪ 2‬ﺇﻟﻰ ‪0‬‬
‫• ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﺍﻟﻁﺒﺎﻋﺔ ﻓﻘﻁ ﻨﻌﺭﻑ ﺍﻟﻘِﻴ‪‬ﻡ ﻓﻲ ﺍﻷﻋﻠﻰ ﺜﻡ ﺠﻤﻠﺔ ﺩﻭﺭﺍﻥ ﺍﻟﻁﺒﺎﻋﺔ‪.‬‬
‫;}}‪int b[3][3] = {{1,2,3},{4,5,6},{7,8,9‬‬ ‫• ﺘﻌﺭﻴﻑ ﺍﻟﻘِﻴ‪‬ﻡ ﻫﻜﺫﺍ‬
‫• ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﻁﺒﺎﻋﺔ ﺍﻟﻘﻁﺭ ﻓﻘﻁ‪ ،‬ﻨﻀﻊ ﺸﺭﻁ ﻗﺒل ﺍﻟﻁﺒﺎﻋﺔ )‪ if (i = =j‬ﻭﺒﺎﺴﺘﺜﻨﺎﺀ ﺍﻟﻘﻁﺭ )‪if (i ! =j‬‬
‫• ﻟﻁﺒﺎﻋﺔ ﺍﻟﻤﺜﻠﺜﻴﺔ ﺍﻟﻌﻠﻭﻴﺔ ﻨﻀﻊ ﺍﻟﺸﺭﻁ )‪ if (i<j‬ﻭﻟﻁﺒﺎﻋﺔ ﺍﻟﻤﺜﻠﺜﻴﺔ ﺍﻟﺴﻔﻠﻴﺔ )‪if (i>j‬‬
‫• ﻟﻁﺒﺎﻋﺔ ﻤﺼﻔﻭﻓﺔ ﺍﻟﻭﺤﺩﺓ ﻨﻀﻊ ﺍﻟﺸﺭﻁ )‪ if (i = =j‬ﻨﻁﺒﻊ ‪ ، 1‬ﻭ‪ else‬ﻨﻁﺒﻊ ‪0‬‬
‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ ‪ -‬ﻗﻠﻘﻴﻠﻴﺔ‬ ‫ﻡ‪ .‬ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬
:‫ ﻁﺒﺎﻋﺔ ﺃﻗل ﺭﻗﻡ ﻓﻲ ﺍﻟﻤﺼﻔﻭﻓﺔ‬3

#include <iostream.h>
#include <conio.h>

void main( )
{
int t[3][3],m,i,j;

cout << "Enter numbers: \n";

for (i=0; i<3; i++)


{for (j=0; j<3; j++)
cin >> t[i][j];}

m = t[0][0];

for (i=0; i<3; i++)


{for (j=0; j<3; j++)
if (m > t[i][j])
m = t[i][j];}

cout << "min= " << m;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

if (m < t[i]) ‫• ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﻁﺒﺎﻋﺔ ﺃﻜﺒﺭ ﺭﻗﻡ ﻴﻜﻭﻥ ﺍﻟﺸﺭﻁ‬

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


‫ ﺒﺤﻴـﺙ ﺒﻘـﻭﻡ‬.. ‫ ﺒﺭﻨﺎﻤﺞ ﻟﻤﺤﺎﻜﺎﺓ ﺁﻟﺔ ﺤﺎﺴﺒﺔ ﺒﺴﻴﻁﺔ ﺘﻘﻭﻡ ﺒﺠﻤﻊ ﺃﻭ ﻁﺭﺡ ﺃﻭ ﻀﺭﺏ ﺃﻭ ﻗﺴﻤﺔ ﺭﻗﻤـﻴﻥ‬3
.‫ﺍﻟﻤﺴﺘﺨﺩﻡ ﺒﻀﻐﻁ ﺍﻟﻌﺩﺩ ﺍﻷﻭل ﺜﻡ ﻀﻐﻁ ﺭﻤﺯ ﺍﻟﻌﻤﻠﻴﺔ ﺍﻟﻤﻁﻠﻭﺒﺔ ﺜﻡ ﺍﻟﻌﺩﺩ ﺍﻟﺜﺎﻨﻲ‬

#include <iostream.h>
#include <conio.h>

void main ( )
{
float x , y , z;
char a , oper ;
do
{
cout << "\nEnter First number,Operator,Second number: ";
cin >> x >> oper >> y ;

switch (oper)
{
case '+' : z=x+y ; break;
case '-' : z=x-y ; break;
case '*' : z=x*y ; break;
case '/' : z=x/y ; break;
default : z=0;
}
cout << "The answer is: " << z;
cout << "\nDo another (y/n)?";
cin >> a ;
}
while (a != 'n');

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


:‫ ﺒﺭﻨﺎﻤﺞ ﻟﺤﺴﺎﺏ ﺘﻘﺩﻴﺭ ﺍﻟﻁﺎﻟﺏ ﺤﻴﺙ ﺃﻥ ﺍﻟﺘﻘﺩﻴﺭﺍﺕ ﺘﻌﻁﻰ ﻜﺎﻟﺘﺎﻟﻲ‬3
90 ≤ 'A' ≤ 100
80 ≤ 'B' < 90
70 ≤ 'C' < 80
60 ≤ 'D' < 70
'F' < 60

#include <iostream.h>
#include <conio.h>

void main ( )
{
float mark ;
char grade ;
L: cout << "Enter a mark : " ;
cin >> mark ;
if (mark > 100 || mark < 0)
cout << "rong mark .. try again " ;
else if (mark >= 90)
grade = 'A' ;
else if (mark >= 80)
grade = 'B' ;
else if (mark >= 70)
grade = 'C' ;
else if (mark >= 60)
grade = 'D' ;
else
grade = 'F' ;
cout << grade << endl ;
goto L;
getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


‫‪ 3‬ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﻁﺒﺎﻋﺔ ﻤﺠﻤﻭﻉ ﺍﻷﻋﺩﺍﺩ ﺍﻟﺯﻭﺠﻴﺔ ﺍﻟﻤﺤﺼﻭﺭﺓ ﻤﺎ ﺒﻴﻥ ‪ 100‬ﻭ‪1‬‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬

‫)( ‪void main‬‬


‫{‬
‫;‪int i, sum = 0‬‬

‫)‪for (i = 100; i > 1; i=i-2‬‬


‫;‪sum += i‬‬

‫" = ‪cout << " SUM‬‬ ‫‪<< sum << endl‬‬ ‫;‬

‫;)( ‪getch‬‬
‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬

‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ ‪ -‬ﻗﻠﻘﻴﻠﻴﺔ‬ ‫ﻡ‪ .‬ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬


‫‪ 3‬ﺒﺭﻨﺎﻤﺞ ﻴﻘﻭﻡ ﺒﺈﺩﺨﺎل ﺍﻷﺭﻗﺎﻡ ﻭﻁﺒﺎﻋﺘﻬﺎ ﻁﺎﻟﻤﺎ ﺃﻨﻪ ﻟﻡ ﻴﺘﻡ ﺇﺩﺨﺎل ﺍﻟﺼﻔﺭ )ﺒﻌﺩ ﺇﺩﺨﺎل ﺍﻟﺼﻔﺭ ﻴﺘﻭﻗﻑ(‪.‬‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬

‫)( ‪void main‬‬


‫{‬
‫;‪int n‬‬

‫) ‪while ( n != 0‬‬
‫{‬
‫;" ‪cout << "Enter a number:‬‬
‫;‪cin >> n‬‬
‫‪cout << "n= " << n << endl‬‬ ‫;‬
‫}‬

‫;)( ‪getch‬‬
‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬

‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ ‪ -‬ﻗﻠﻘﻴﻠﻴﺔ‬ ‫ﻡ‪ .‬ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬


.‫ ﺒﺭﻨﺎﻤﺞ ﺍﻟﺘﺤﻠﻴل ﺇﻟﻰ ﺍﻟﻌﻭﺍﻤل‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
int j, n;
char ch;

do
{
cout << "Enter a numbers: ";
cin >> n;
for (j = 2 ; j <= n/2; j++)
if ( n % j == 0 )
cout << n << " divisible by: " << j << endl ;

cout << "again (y/n)?";


cin >> ch;
}
while (ch != n);

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.(‫ ﺍﻟﺭﻗﻡ ﺍﻷﻜﺒﺭ ﺒﻴﻥ ﺜﻼﺜﺔ ﺃﺭﻗﺎﻡ )ﺒﺎﻟﻁﺭﻴﻘﺔ ﺍﻟﻤﺨﺘﺼﺭﺓ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
float a , b , c , max ;
char ch;

do
{
cout << "\nEnter three numbers: \n" ;
cin >> a >> b >> c;

max = (a > b ) ? ((a > c) ? a:c ): ((b > c) ? b:c );


cout << max << " is the grater.\n" ;

cout << "\nagain (y/n)?";


cin >> ch;
}
while (ch != 'n');

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


‫‪ 3‬ﺒﺭﻨﺎﻤﺞ ﺒﺎﻟﻁﺭﻴﻘﺔ ﺍﻟﻤﺨﺘﺼﺭﺓ ﻟﺤﺴﺎﺏ ﺼﺎﻓﻲ ﺭﺍﺘﺏ ﻤﻭﻅﻑ ﺒﻌﺩ ﺨﺼﻡ ﺍﻟﻀﺭﻴﺒﺔ ﺒﺤﺴﺏ ﺍﻟﺸﺭﻭﻁ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫ﻴﺨﺼﻡ ‪ %2‬ﻟﻠﺭﺍﺘﺏ ﺃﻗل ﻤﻥ ﺃﻭ ﻴﺴـﺎﻭﻱ ‪1000‬‬
‫ﻴﺨﺼﻡ ‪ %3‬ﻟﻠﺭﺍﺘﺏ ﺒﻴﻥ ﺍﻟـ ‪ 1000‬ﻭﺍﻟـ ‪2000‬‬
‫ﻭﻴﺨﺼﻡ ‪ %4‬ﻟﻠﺭﺍﺘﺏ ﺃﻜﺒﺭ ﻤﻥ ﺃﻭ ﻴﺴﺎﻭﻱ ‪2000‬‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬

‫)( ‪void main‬‬


‫{‬
‫;‪float S, N‬‬

‫; " ‪L: cout << "\nEnter your salary:‬‬


‫;‪cin >> S‬‬

‫;)‪N =(S <= 1000) ? S-S*.02:((S>=2000) ? S-S*.04 : S-S*.03‬‬


‫;‪cout << "Net salary after tax is: " << N << endl‬‬

‫;‪goto L‬‬

‫;)( ‪getch‬‬
‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬

‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ ‪ -‬ﻗﻠﻘﻴﻠﻴﺔ‬ ‫ﻡ‪ .‬ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬


‫‪ 3‬ﻁﺒﺎﻋﺔ ﺍﻷﺭﻗﺎﻡ ﻤﻥ ‪ 10-1‬ﺩﻭﻥ ﺍﺴﺘﺨﺩﺍﻡ ﺠﻤل ﺍﻟﺩﻭﺭﺍﻥ )ﺒﺎﺴﺘﺨﺩﺍﻡ ﻓﻜﺭﺓ ﺍﻻﺴﺘﺩﻋﺎﺀ ﺍﻟﺫﺍﺘﻲ(‪.‬‬

‫>‪#include <iostream.h‬‬
‫>‪#include <conio.h‬‬

‫;)‪int num (int‬‬

‫)( ‪void main‬‬


‫{‬
‫;‪int i=1‬‬
‫;)‪cout << num (i‬‬

‫;)( ‪getch‬‬
‫}‬

‫)‪int num (int i‬‬


‫{‬
‫)‪if (i<10‬‬
‫;"‪cout << num (i+1)<< "\n‬‬

‫;‪return i‬‬
‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬

‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ ‪ -‬ﻗﻠﻘﻴﻠﻴﺔ‬ ‫ﻡ‪ .‬ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬


.(‫ ﺍﻟﻤﻀﺭﻭﺏ )ﺒﺎﺴﺘﺨﺩﺍﻡ ﻓﻜﺭﺓ ﺍﻻﺴﺘﺩﻋﺎﺀ ﺍﻟﺫﺍﺘﻲ‬3

#include <iostream.h>
#include <conio.h>

int fact (int);

void main ()
{
int y;
cout << "Enter number: ";
cin >> y;
cout << "fact= " << fact(y);

getch();
}

int fact (int y)


{
if (y>1)
y = y * fact(y-1);

else
y=1;

return y;
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.(‫ ﺍﻟﻤﻀﺭﻭﺏ )ﺩﻭﻥ ﺍﻻﺴﺘﺩﻋﺎﺀ ﺍﻟﺫﺍﺘﻲ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
int c,n,f=1;
cout << "Enter number: ";
cin >> n;
if (n>0)
{for (c=1; c<=n; c++)
f=f*c;
cout << "fact= " << f;}
else if (n == 0)
cout << "factorial=1";

else
cout << "the number < 0 !! try again";

getch();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.‫ ﺠﺩﻭل ﺍﻟﻀﺭﺏ ﻷﻱ ﻋﺩﺩ ﻨﺨﺘﺎﺭﻩ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
int i,b;
cout << "Enter number: ";
cin >> b;

for (i=0; i<=10; i++)


cout << "\n" << b * i;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.(‫ ﺒﺭﻨﺎﻤﺞ ﻟﻔﺤﺹ ﻋﻼﻤﺔ ﻁﺎﻟﺏ )ﻨﺠﺢ ﺃﻡ ﻻ‬3

#include <iostream.h>
#include <conio.h>

void main ()
{
int a,b;

cout << "Enter your mark: ";


cin >> a;

cout << "Enter the lowest mark: ";


cin >> b;

if (a>b)
cout << "pass";

else
cout << "not pass";

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


.‫ ﺍﺴﺘﺩﻋﺎﺀ ﺩﺍﻟﺔ ﻻ ﺘﻘﻭﻡ ﺒﺈﺭﺠﺎﻉ ﻗﻴﻡ ﻭﻻ ﺒﺘﻤﺭﻴﺭ ﻤﻌﺎﻤﻼﺕ‬3

#include <iostream.h>
#include <conio.h>

void starline( );

void main( )
{
starline( );
cout << " Safa2 Jaidi\n";
starline( );
cout << " from Qalqilia " << endl;
cout << " Palestine " << endl;
starline( );

getch ();
}

void starline( )
{
for ( int j = 0; j < 17 ; j++)
cout << '*' ;
cout << endl ;
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

‫ ﻗﻠﻘﻴﻠﻴﺔ‬- ‫ﺠﺎﻤﻌﺔ ﺍﻟﻘﺩﺱ ﺍﻟﻤﻔﺘﻭﺤﺔ‬ ‫ ﺼﻔﺎﺀ ﺠﻌﻴﺩﻱ‬.‫ﻡ‬


‫ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ‬
‫ﻛﻠﻳﺔ ﻟﺗﻛﻧوﻟوﺟﻳﺎ واﻟﻌﻠوم اﻟﺗطﺑﻳﻘﻳﺔ‬

‫اﻟدﻟﻳﻝ اﻟﻌﻣﻠﻲ ﻟﻣﻘرر‬


‫ﺑرﻣﺟﺔ )‪ (1‬رﻗم ‪1291‬‬

‫إﻋداد‬
‫أ‪ .‬ﻋﻳﺳﻰ أﺳﻌد‬ ‫د‪ .‬ﻳوﺳف اﺑو زر‬

‫‪2013‬‬
‫اﻟﻣﺣﺗوﻳﺎت‬
‫‪.1‬ااﻟﻣﺧﺗﺑر اﻟﻌﻣﻠﻲ اﻻوﻝ‪ :‬اﻟﺗراﻛﻳب واﻷﺻﻧﺎف‬
‫اﻟﺗراﻛﻳب ‪ :‬اﻟﺷﺧص ‪Person‬‬ ‫‪‬‬
‫اﻟﺗراﻛﻳب ‪ :‬اﻟﻧﻘطﺔ ‪Point‬‬ ‫‪‬‬
‫اﻟﺻﻧف ‪ :‬اﻟﻧﻘطﺔ ‪Point‬‬ ‫‪‬‬
‫اﻟﺑﻧﺎء ‪Constructor‬‬ ‫‪‬‬
‫‪ -2‬اﻟﻣﺧﺗﺑر اﻟﺛﺎﻧﻲ اﻟﻣﺻﻔوﻓﺎت واﻻﺻﻧﺎف ‪Arrays and Classes‬‬
‫اﻟﻣؤﺷرات و ﻣﺻﻔوﻓﺔ ﻣن اﻟﻛﺎﺋﻧﺎت‬ ‫‪‬‬
‫اﻟﻘواﺋم اﻟﻣﺗﺻﻠﺔ‬ ‫‪‬‬
‫‪ -3‬اﻟﻣﺧﺗﺑر اﻟﺛﺎﻟث اﻟدواﻝ واﻷﺻﻧﺎف اﻟﺻدﻳﻘﺔ‪Friend Functions and Operators‬‬
‫اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻟﺗﻣرﻳر اﻟﻌواﻣﻝ‬ ‫‪‬‬
‫اﻟدواﻝ اﻟﺻدﻳﻘﺔ ‪Friend Functions‬‬ ‫‪‬‬
‫اﻷﺻﻧﺎف اﻟﺻدﻳﻘﺔ‬ ‫‪‬‬
‫‪ -4‬اﻟﻣﺧﺗﺑر اﻟراﺑﻊ اﻷﺻﻧﺎف اﻟﻣﺷﺗﻘﺔ واﻟﻘواﻟب‪Derived Classes and Templates‬‬
‫اﻟوراﺛﺔ اﻟﻣﻧﻔردة ‪Single Inheritance‬‬ ‫‪‬‬
‫اﻟوراﺛﺔ اﻟﻣﺗﻌددة ‪Multiple Inheritance‬‬ ‫‪‬‬
‫ﺗﻌدد اﻻوﺟﻪ ‪Polymorphism‬‬ ‫‪‬‬
‫اﻟﻘواﻟب ‪Templates‬‬ ‫‪‬‬
‫‪ -5‬اﻟﻣﺧﺗﺑر اﻟﺧﺎﻣس ﻣﻌﺎﻟﺟﺔ اﻟﻣﻠﻔﺎت ﺑﻠﻐﺔ ‪File Processing with C++ C++‬‬

‫‪-6‬اﻟﻣﻼﺣق ﻣﺗرﺟﻣﺎت ﻟﻐﺔ‪C++‬‬


‫‪ ‬إعداد بيئة تطوير ضمن برنامج ‪Code::Blocks‬‬
‫‪ -‬مقدمة‬
‫‪ -‬إعداد بيئة تطوير ضمن برنامج ‪.Code::Blocks‬‬
‫‪ -‬تحميل برنامج ‪.Code::Blocks‬‬
‫‪ -‬تنصيب برنامج ‪ Code::Blocks‬على الحاسوب‪.‬‬
‫‪ -‬شرح واجھة التطبيق‬
‫‪ -‬تشغيل برنامج ‪ Code::Blocks‬من خالل إنشاء مشروع جديد و تطبيق مثال بسيط‬

‫‪ ‬إعداد بيئة تطوير ضمن برنامج ‪.Visual C++‬‬


‫اﻟﻮﺣﺪة اﻟﺜﺎﻧﻴﺔ‬
‫التراكيب واألصناف‬
‫‪Structures and Classes‬‬
‫ﻓﻲ ﻫذا اﻟﻣﺧﺗﺑر ‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺳ ـ ـﻳﻌرض ﻋﺿـ ــو ﻫﻳﺋﺔ اﻟﺗدرﻳس ﻓﻲ ﻓرع اﻟﺟﺎﻣﻌﺔ ﺑﻌض اﻟﺗدرﻳﺑﺎت‬
‫اﻟﻌﻣﻠﻳﺔ ﻟﻣﻔﻬوﻣﻳن ﻣﻬﻣﻳن وﻫﻣﺎ اﻟﺗراﻛﻳب واﻷﺻ ــﻧﺎف‪ .‬ﺗﻘﺎﺑﻝ اﻟﺗراﻛﻳب ‪ Structures‬اﻟﺳ ــﺟﻼت ‪Records‬‬
‫ﻓﻬﻲ اﻟﻔﻛرة اﻟرﺋﻳﺳ ـ ـ ـ ـ ـ ــﺔ ﻓﻲ ﻟﻐﺎت اﻟﺑرﻣﺟﺔ اﻟﻛﻳﻧوﻧﻳﺔ‬ ‫ﻓﻲ ﻟﻐﺎت ﺑرﻣﺟﺔ أﺧرى‪ .‬أﻣﺎ اﻷﺻ ـ ـ ـ ـ ـ ــﻧﺎف ‪Classes‬‬
‫‪ Object Oriented Languages‬وﻫﻲ ﺟزء ﻣن ﻟﻐﺔ ‪ C++‬وﻟﻳﺳت ﺟزءا ﻣن ﻟﻐﺔ ‪ C‬اﻷﺻﻠﻳﺔ‪.‬‬
‫ﻛﻣـﺎ ﺳـ ـ ـ ـ ـ ـ ـﻳﻌرض ﺑراﻣﺞ ﺑﻠﻐــﺔ ‪ C++‬ﺗﻧـﺎﻗش ﻣﻔــﺎﻫﻳم رﺋﻳﺳ ـ ـ ـ ـ ـ ــﺔ أﺧرى ﻓﻲ ﻟﻐـﺎت اﻟﺑرﻣﺟـﺔ اﻟﻛﻳﻧوﻧﻳـﺔ‪ ،‬ﻣﺛــﻝ‬
‫اﻟﻛــﺎﺋﻧــﺎت واﻟﻣﺗﻐﻳرات واﻟــدواﻝ اﻟﻣﻧﺗﻣﻳــﺔ وﻛﻳﻔﻳــﺔ ﺗﻌرﻳﻔﻬــﺎ واﺳ ـ ـ ـ ـ ـ ــﺗﺧــداﻣﻬــﺎ ﻓﻲ ﻟﻐــﺔ ‪ .C++‬وﺗﻌﺗﺑر ﻫــذﻩ اﻟﻣﻔــﺎﻫﻳم‬
‫أﺳـ ـ ـ ـ ــﺎﺳـ ـ ـ ـ ــﻳﺔ ﻟﻔﻬم ﺑﻘﻳﺔ اﻟﺗدرﻳﺑﺎت ﻓﻲ ﻫذا اﻟﻣﻘرر‪ ،‬ﻟذا ﻧرﺟو ﻣﻧك‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬اﻟﺗﺄﻛد ﻣن ﺗﻧﻔﻳذ وﻓﻬم ﻫذﻩ‬
‫اﻟﺑرﻣﺟﻳﺎت ﻓﻲ اﻟﻣﺧﺗﺑر ﺑﺈﺷـ ـ ـراف ﻋﺿ ـ ــو ﻫﻳﺋﺔ اﻟﺗدرﻳس ﻗﺑﻝ اﻻﻧﺗﻘﺎﻝ إﻟﻰ ﺑﻘﻳﺔ اﻟوﺣدات‪ .‬وﻗد ﺗم ﺗزوﻳدك ﻓﻲ‬
‫ﺗـدرﻳﺑـﺎت ﻫـذﻩ اﻟوﺣـدة ﺑـﺎﻟﻌـدﻳـد ﻣن اﻷﻣﺛﻠـﺔ واﻟﺗﻣـﺎرﻳن اﻟﺗﻲ ﻧرﺟو ﻣﻧـك إﻋطﺎءﻫﺎ اﻟوﻗت واﻟﺟﻬد اﻟﻼزﻣﻳن ﻟﺣﻠﻬﺎ‬
‫وﺗﻧﻔﻳــذﻫــﺎ‪ .‬ﺗــذﻛر‪ ،‬ﻋزﻳزي اﻟطــﺎﻟــب‪ ،‬أن أﺟوﺑــﺔ ﻫــذﻩ اﻟﺗﻣــﺎرﻳن ﻣوﺟودة ﻓﻲ ﻧﻬــﺎﻳــﺔ ﻫــذﻩ اﻟوﺣــدة‪ ،‬وﻟﻛن وﺣﺗﻰ‬
‫ﺗﺗﺣﻘق اﻟﻔــﺎﺋــدة اﻟﻘﺻ ـ ـ ـ ـ ـ ــوى ﻋﻠﻳــك‪ ،‬ﻋزﻳزي اﻟطــﺎﻟــب ‪ ،‬أن ﺗﺣــﺎوﻝ ﺑﻛــﻝ ﺟــد ﺣــﻝ ﻫــذﻩ اﻟﺗﻣــﺎرﻳن وﺗﻧﻔﻳــذﻫــﺎ ﻋﻠﻰ‬
‫اﻟﺣﺎﺳوب ﻗﺑﻝ اﻟﻧظر إﻟﻰ اﻟﺣﻝ‪.‬‬

‫أﻫداف اﻟﺗدرﻳﺑﺎت‬
‫ﻳﻧﺗظر ﻣﻧك‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺑﻌد ﻓراﻏك ﻣن ﺗﻧﻔﻳذ ﻫذﻩ اﻟﺗدرﻳﺑﺎت أن ﺗﻛون ﻗﺎد ار ﻋﻠﻰ أن‪:‬‬
‫‪ .1‬ﺗﻌرﻳف واﺳﺗﺧدام اﻟﺗراﻛﻳب ‪.structures‬‬
‫‪ .2‬اﺳﺗﺧدام ﻣﺻﻔوﻓﺎت ﻣن اﻟﺗراﻛﻳب ‪.arrays of structures‬‬
‫‪ .3‬ﺗﻌرﻳف واﺳﺗﺧدام اﻷﺻﻧﺎف ‪.classes‬‬
‫‪ .4‬اﻟﺗﻣﻳﻳز ﺑﻳن اﻟﺗراﻛﻳب واﻷﺻﻧﺎف‪.‬‬
‫‪ .5‬إﻧﺷﺎء اﻟﻛﺎﺋﻧﺎت واﺳﺗﺧداﻣﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ‪.‬‬
‫‪ .6‬ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﻣﻧﺗﻣﻳﺔ واﺳﺗدﻋﺎﺋﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ‪.‬‬
‫‪ .7‬ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﺳطرﻳﺔ ‪.‬‬
‫‪ .8‬ﺗﺣﻣﻳﻝ اﻟدواﻝ أﻛﺛر ﻣن ﺗﻌرﻳف واﺣد‪.‬‬
‫‪ .9‬إدﺧﺎﻝ اﻟﺑﻳﺎﻧﺎت ٕواﺧراﺟﻬﺎ ﺑوﺳﺎطﺔ ‪ cin‬و ‪.cout‬‬

‫اﻟﺗدرﻳب رﻗم )‪(1‬‬


‫ﻋرف ﺗرﻛﻳب ﻳﺻف اﻟﺷﺧص ‪ Person‬ﻳﺗﻛون ﻣن اﻟﺣﻘوﻝ اﻟﺗﺎﻟﻳﺔ‪ name :‬اﻻﺳم ‪ age ،‬اﻟﻌﻣر ‪gender ،‬‬
‫اﻟﺟﻧس‪ ،‬واﻛﺗب اﻟﺑرﻧﺎﻣﺞ اﻟرﺋﻳﺳﻲ اﻟذي ﻳﻌرف ﻣﺗﻐﻳر ﻣن اﻟﻧوع ﺷﺧص وﻳﻘوم ﺑﺈﺳﻧﺎد ﻗﻳم ﻟﻠﻣﺗﻐﻳرات وطﺑﺎﻋﺔ‬
‫اﻟﻧﺗﺎﺋﺞ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫>‪#include <iostream‬‬
‫>‪#include <string‬‬
‫{‪struct Person‬‬
‫;‪string name‬‬
‫;‪int age‬‬
‫;‪char gender‬‬
‫;}‬
‫{)(‪int main‬‬
‫;‪Person p‬‬
‫;"‪p.name = "Christopher‬‬
‫;‪p.age = 34‬‬
‫;'‪p.gender = 'M‬‬
‫;‪cout << "Name: " << p.name << endl‬‬
‫;‪cout << "Age: " << p.age << endl‬‬
‫;‪cout << "Gender: " << p.gender << endl‬‬
‫;‪return 0‬‬
‫}‬
‫اﻟﺗدرﻳب رﻗم )‪(2‬‬
‫ﻋرف ﺗرﻛﻳب ﻳﺻف اﻟﻧﻘطﺔ ‪ Point‬ﺗﺗﻛون إﺣداﺛﻳﺎت ‪ x‬و ‪ ،y‬واﻛﺗب اﻟﺑرﻧﺎﻣﺞ اﻟرﺋﻳﺳﻲ اﻟذي ﻳﻌرف ﻣﺗﻐﻳر‬
‫ﻣؤﺷري ﻣن اﻟﻧوع ﻧﻘطﺔ وﻳﻘوم ﺑﺈﺳﻧﺎد ﻗﻳم ﻟﻠﻣﺗﻐﻳرات وطﺑﺎﻋﺔ اﻟﻧﺗﺎﺋﺞ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫>‪include <iostream‬‬
‫{‪struct Point‬‬
‫;‪int x‬‬
‫;‪int y‬‬
‫;}‬
‫{)(‪int main‬‬
‫;‪Point* p = new Point‬‬
‫;‪p->x = 9‬‬
‫;‪p->y = 4‬‬
‫;‪cout << p->x << " " << p->y << endl‬‬
‫;‪return 0‬‬
‫}‬

‫اﺳﺋﻠﺔ ﻟﻠﺣﻝ ﻋﻠﻰ اﻟﺣﺎﺳوب )‪(1‬‬


‫‪‬‬
‫ﻋزﻳزي اﻟطـﺎﻟـب اﻋـد ﻛﺗـﺎﺑﺔ اﻟﺗدرﻳب اﻟﺳ ـ ـ ـ ـ ـ ــﺎﺑق ﺑﺣﻳث ﻧﻌرف ﻣﺻ ـ ـ ـ ـ ـ ــﻔوﻓﺔ ﺗﺗﻛون ﻣن ‪ 6‬ﻧﻘﺎط ٕواﻳﺟﺎد‬
‫اﻟﻣﺳﺎﻓﺔ ﺑﻳن ﻛﻝ ﻧﻘطﺗﻳن ﺣﺳب اﻟﻌﻼﻗﺔ اﻟﺗﺎﻟﻳﺔ‪:‬‬
‫اﻟﻣﺳﺎﻓﺔ = ‪(x2 + y2)0.5‬‬

‫ﻣﺳﺎﻋدة اﻟﺣﻝ‪:‬‬

‫‪-1‬ﺗﻌرﻳف اﻟﻣﺻﻔوﻓﺔ‬

‫‪.Point pts[6]; // array to hold up to 6 points‬‬

‫‪-2‬اﻻﻗﺗران ﻹﻳﺟﺎد اﻟﻣﺳﺎﻓﺔ ﺑﻳن اﻟﻧﻘﺎط‪:‬‬

‫{ )‪float dist(Point p‬‬


‫‪// Compute the distance from the origin‬‬
‫;)‪return sqrt(p.x*p.x + p.y*p.y‬‬

‫ﺟﻣﻠﺔ اﻻﺳﺗدﻋﺎء )]‪dist(pt[i‬‬


‫اﻟﺗدرﻳب رﻗم )‪(3‬‬
‫اﻋد ﻛﺗﺎﺑﺔ اﻟﺗدرﻳب اﻟﺳﺎﺑق اﻟﻧﻘطﺔ ‪ Point‬ﺗﺗﻛون إﺣداﺛﻳﺎت ‪ x‬و ‪ y‬ﺑﺎﺳﺗﺧدام اﻷﺻﻧﺎف ‪ ، class‬واﻛﺗب‬
‫اﻟﺑرﻧﺎﻣﺞ اﻟرﺋﻳﺳﻲ اﻟذي ﻳﻌرف ﻣﺗﻐﻳر ﻣؤﺷري ﻣن اﻟﻧوع ﻧﻘطﺔ وﻳﻘوم ﺑﺈﺳﻧﺎد ﻗﻳم ﻟﻠﻣﺗﻐﻳرات وطﺑﺎﻋﺔ اﻟﻧﺗﺎﺋﺞ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫>‪#include <iostream‬‬
‫{‪class Point‬‬
‫‪public:‬‬
‫;‪int x, y‬‬
‫{)(‪Point‬‬
‫;‪x = 0; y = 0‬‬
‫}‬
‫;}‬
‫{)(‪int main‬‬
‫;‪Point* p = new Point‬‬
‫;‪p->x = 9‬‬
‫;‪p->y = 4‬‬
‫;‪cout << p->x << " " << p->y << endl‬‬
‫;‪return 0‬‬
‫}‬

‫اﻟﺗدرﻳب رﻗم )‪(4‬‬


‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﺟﻳدا واﻟذي ﻳﺻف ﺻﻧف ﻣن ﻧوع ﻣﺳﺗطﻳﻝ ‪ Rectangle‬وﻳﻘوم ﺑﺈﻋطﺎء إﺑﻌﺎد اﻟﻣﺳﺗطﻳﻝ‬
‫ٕواﻳﺟﺎد ﻣﺳﺎﺣﺗﻪ ﺑﺎﺳﺗﺧدام داﻟﺔ ﺳطرﻳﻪ وطﺑﺎﻋﺔ اﻟﻧﺗﺎﺋﺞ‪ .‬اﻋد ﻛﺗﺎﺑﺔ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﺑﺎﺳﺗﺧدام اﻟﺑﻧﺎء ‪constructor‬‬

‫>‪#include <iostream‬‬
‫{ ‪class CRectangle‬‬
‫;‪int x, y‬‬
‫‪public:‬‬
‫;)‪void set_values (int,int‬‬
‫};)‪int area () {return (x*y‬‬
‫;}‬

‫{ )‪void CRectangle::set_values (int a, int b‬‬


‫;‪x = a‬‬
‫;‪y = b‬‬
‫}‬

‫{ )( ‪int main‬‬
‫;‪CRectangle rect, rectb‬‬
‫;)‪rect.set_values (3,4‬‬
‫;)‪rectb.set_values (5,6‬‬
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}

:‫اﻟﺣﻝ‬

// ‫ باستخدام‬constructor
#include <iostream>
class CRectangle {
int width, height;
public:
CRectangle (int,int);
int area () {return (width*height);}
};

CRectangle::CRectangle (int a, int b) {


width = a;
height = b;
}

int main () {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}

(2) ‫اﺳﺋﻠﺔ ﻟﻠﺣﻝ ﻋﻠﻰ اﻟﺣﺎﺳوب‬



‫ﻋزﻳزي اﻟطﺎﻟب اﻋد ﻛﺗﺎﺑﺔ اﻟﺗدرﻳب اﻟﺳﺎﺑق ﺑﺣﻳث ﻧﻌرف اﻟﻬدام‬
:‫ﻣﺳﺎﻋدة اﻟﺣﻝ‬
~CRectangle (); : ‫اﻟﻬدام‬

(3) ‫اﺳﺋﻠﺔ ﻟﻠﺣﻝ ﻋﻠﻰ اﻟﺣﺎﺳوب‬



‫ﻋزﻳزي اﻟطــﺎﻟــب‪ ،‬اﻛﺗــب ﺑرﻧــﺎﻣﺞ ﺑﻠﻐــﺔ ‪ C++‬ﻟﺗﻌرﻳف ﺻ ـ ـ ـ ـ ـ ــﻧف طــﺎﻟــب ‪ STUDENT‬ﻳﺗﻛون ﻣن‬
‫اﻟﻣﺗﻐﻳرات اﻟﻣﻧﺗﻣﻳﺔ اﻟﺗﺎﻟﻳﺔ ‪ :‬اﻟرﻗم اﻟﺟﺎﻣﻲ ﻟﻠطﺎﻟب ‪ ، USN‬اﻻﺳــم ‪ ،name‬وﻋﻼﻣﺎت ‪ m‬ﻓﻲ ‪ 3‬اﺧﺗﺑﺎرات ﻓﻲ‬
‫ﻣوﺿـوع ﻣﺎ‪. ,‬واﻟﻣﻌدﻝ ‪ . avg‬ﻋرف ﻣﺻـﻔوﻓﺔ ﺗﻣﺛﻝ ﻣﺟﻣوﻋﺔ ﻣن ‪ 10‬ﻛﺎﺋﻧﺎت ﻣن اﻟﺻﻧف‪. STUDENT.‬‬
‫ﺑﺎﺳ ـ ــﺗﺧدام اﻗﺗراﻧﺎت ﻣﻧﺗﻣﻳﺔ ﻣﻧﺎﺳ ـ ــﺑﺔ‪ ،‬اوﺟد ﻣﺗوﺳ ـ ــط اﻋﻠﻰ ﻋﻼﻣﺗﻳن ﻋﻼﻣﺎت ﻟﻛﻝ طﺎﻟب ‪ .‬وأطﺑﻊ اﻟﻧﺗﺎﺋﺞ ﻣﺛﻝ‪:‬‬
‫‪ ،USN‬واﻻﺳم وﻣﻌدﻝ ﻋﻼﻣﺎت اﻟطﻼب ﻛﺎﻓﺔ‪.‬‬

‫اﻟﺗدرﻳب رﻗم )‪(5‬‬


‫ادرس اﻟﺗدرﻳب رﻗم )‪ (4‬واﻋد ﻛﺗﺎﺑﺔ اﻟﺑﻧﺎء ﻣن ﺧﻼﻝ ﻣﻔﻬوم اﻋﺎدة اﻟﺗﺣﻣﻳﻝ‪.‬‬
‫اﻟﺣﻝ‪:‬‬
‫‪// overloading class constructors‬‬
‫>‪#include <iostream‬‬

‫{ ‪class CRectangle‬‬
‫;‪int width, height‬‬
‫‪public:‬‬
‫;)( ‪CRectangle‬‬
‫;)‪CRectangle (int,int‬‬
‫};)‪int area (void) {return (width*height‬‬
‫;}‬

‫{ )( ‪CRectangle::CRectangle‬‬
‫;‪width = 5‬‬
‫;‪height = 5‬‬
‫}‬

‫{ )‪CRectangle::CRectangle (int a, int b‬‬


‫;‪width = a‬‬
‫;‪height = b‬‬
‫}‬

‫{ )( ‪int main‬‬
‫;)‪CRectangle rect (3,4‬‬
‫;‪CRectangle rectb‬‬
‫;‪cout << "rect area: " << rect.area() << endl‬‬
‫;‪cout << "rectb area: " << rectb.area() << endl‬‬
‫;‪return 0‬‬
‫}‬
‫إﺟﺎﺑﺎت اﻷﺳﺋﻠﺔ‬
(1) ‫ﺳؤاﻝ‬
struct Point {
float x; // x coordinate
float y; // y coordinate
};

Point pts[6]; // array to hold up to 6 points.


int n = 0; // number of points in the array.

while (cin >> pts[n].x >> pts[n].y) {


n++;
}

float dist(Point p) {
// Compute the distance from the origin
return sqrt(p.x*p.x + p.y*p.y);
}

void findDistance(Point pt[], int size) {


for (int i=0; i<size-1; i++) {
cout<< dist(pt[i
}
}

(2) ‫ﺳؤاﻝ‬

// Solution on constructors and destructors


#include <iostream>
class CRectangle {
int *width, *height;
public:
CRectangle (int,int);
~CRectangle ();
int area () {return (*width * *height);}
};

CRectangle::CRectangle (int a, int b) {


width = new int;
height = new int;
*width = a;
*height = b;
}

CRectangle::~CRectangle () {
delete width;
delete height;
}

int main () {
CRectangle rect (3,4), rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
‫ﻧﺗﻳﺟﺔ اﻟﺗﻧﻔﻳذ‬
rect area: 12
rectb area: 30
(3) ‫ﺳؤاﻝ‬

#include<iostream.h>
#include<conio.h>
class student
{
private :
int usn,m[4];
char name[20];
float avg;
public :
void read();
void avgm();
void print();
};
void student :: read()
{
cout<<"Enter the USA no. :";
cin>>usn;
cout<<"Enter the name of the student :";
cin>>name;
cout<<name<<endl;
cout<<"Enter the marks of 3 subjects :";
cin>>m[1]>>m[2]>>m[3];
avgm();
}

void student :: avgm()


{
if(m[1]<=m[2] && m[1]<=m[3])
avg=(float)(m[2]+m[3])/2;
if(m[2]<=m[1] && m[2]<=m[3])
avg=(float)(m[1]+m[3])/2;
if(m[3]<=m[1] && m[3]<=m[2])
avg=(float)(m[1]+m[2])/2;
}
void student :: print()
{

cout<<"\n"<<usn<<"\t"<<name<<"\t\t"<<avg;

/* cout<<"USA No.:"<<usn<<"\n";
cout<<"Name :"<<name<<endl;
cout<<"Average marks :"<<avg<<"\n"; */
}
void main()
{
int n,i;
student s[10];
clrscr();
cout<<"Enter the no of students :";
cin>>n;
for(i=0;i<n;i++)
s[i].read();
cout<<"USN\tNAME\t\tAVVEAGE MARKS\n";
for(i=0;i<n;i++)
s[i].print();
getch();
}
‫اﻟﻮﺣﺪة اﻟﺜﺎﻟﺜﺔ‬
‫المصفوفات واألصناف‬
‫‪Arrays and Classes‬‬

‫إن ﻣﻌظم اﻟﺗطﺑﻳﻘﺎت اﻟﻌﻣﻠﻳﺔ ﺗﺗطﻠب اﺳ ـ ـ ــﺗﺧدام ﻗواﺋم ﻣن اﻟﻛﺎﺋﻧﺎت ‪ ،list of objects‬وﻏﺎﻟﺑﺎ ﻣﺎ ﺗﻧﻔذ ﻫذﻩ‬
‫اﻟﻘواﺋم ﺑﺎﺳ ـ ـ ــﺗﺧدام ﻣﺻ ـ ـ ــﻔوﻓﺎت ﻣن اﻟﻛﺎﺋﻧﺎت ‪ Arrays of objects‬أو ﺑﺎﺳ ـ ـ ــﺗﺧدام ﻗواﺋم ﻣﺗﺻ ـ ـ ــﻠﺔ ﻣن اﻟﻛﺎﺋﻧﺎت‬
‫‪ .linked lists of objects‬ﻓﻲ ﻫذﻩ اﻟوﺣدة‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺳـ ـ ــﻧﻧﺎﻗش ﻛﻳﻔﻳﺔ إﻧﺷ ـ ــﺎء واﺳـ ـ ــﺗﺧدام ﻣﺻـ ـ ــﻔوﻓﺎت‬
‫وﻗواﺋم ﻣﺗﺻﻠﺔ ﻣن اﻟﻛﺎﺋﻧﺎت ﻣن ﺧﻼﻝ أﻣﺛﻠﺔ ﻋﻣﻠﻳﺔ وﺗدرﻳﺑﺎت ﻣﺧﺗﻠﻔﺔ‪.‬‬

‫أﻫداف اﻟوﺣدة‬
‫ﻳﻧﺗظر ﻣﻧك‪ ،‬ﻋزﻳزي اﻟطﺎﻟب‪ ،‬ﺑﻌد ﻓراﻏك ﻣن ﺗﻧﻔﻳذ اﻟﺑراﻣﺞ ﻓﻲ ﻫذﻩ اﻟوﺣدة‪ ،‬أن ﺗﻛون ﻗﺎد ار ﻋﻠﻰ أن‪:‬‬

‫‪ .1‬ﺗﻌرف ﻣﺻﻔوﻓﺎت ﻣن اﻟﻛﺎﺋﻧﺎت ﺑﻠﻐﺔ ‪.C++‬‬

‫‪ .2‬ﺗﻣرر اﻟﻣﺻﻔوﻓﺎت ﻛﻌواﻣﻝ إﻟﻰ دواﻝ ﻣﺧﺗﻠﻔﺔ‪.‬‬

‫‪ .3‬ﺗﺳﺗﺧدم ﻫذﻩ اﻟﻣﺻﻔوﻓﺎت ﻓﻲ ﺗطﺑﻳﻘﺎت ﻣﺧﺗﻠﻔﺔ ﻣﺛﻝ ﻋﻣﻠﻳﺎت اﻟﻔرز واﻟﺑﺣث‪.‬‬

‫‪ .4‬ﺗﻧﺷﺊ اﻟﻛﺎﺋﻧﺎت ﺑطرﻳﻘﺔ دﻳﻧﺎﻣﻳﻛﻳﺔ‪.‬‬

‫‪ .5‬ﺗﺗﻌﺎﻣﻝ ﻣﻊ اﻟﻛﺎﺋﻧﺎت ﻣن ﺧﻼﻝ ﻋﻧﺎوﻳﻧﻬﺎ وﻣﺗﻐﻳرات ﻣؤﺷرة ‪.pointer variables‬‬


.‫ أن ﺗﻧﺷﺊ ﻗواﺋم ﻣﺗﺻﻠﺔ ﻣن اﻟﻛﺎﺋﻧﺎت وﺗﺳﺗﺧدﻣﻬﺎ ﻓﻲ ﺗطﺑﻳﻘﺎت ﻣﺧﺗﻠﻔﺔ‬.6

(1) ‫اﻟﺗدرﻳب‬
.‫اﻋد ﻛﺗﺎﺑﺔ ﻣﺛﺎﻝ اﻟﻣﺳﺗطﻳﻝ ﻣن ﺧﻼﻝ ﻓﻛرة ﻣؤﺷر اﻟﻰ اﻟﺻﻧف وﻣؤﺷر اﻟﻰ ﻣﺻﻔوﻓﺔ ﻣن اﻟﻛﺎﺋﻧﺎت‬

:‫اﻟﺣﻝ‬

// pointer to classes example


#include <iostream>

class CRectangle {
int width, height;
public:
void set_values (int, int);
int area (void) {return (width * height);}
};

void CRectangle::set_values (int a, int b) {


width = a;
height = b;
}

int main () {
CRectangle a, *b, *c;
CRectangle * d = new CRectangle[2];
b= new CRectangle;
c= &a;
a.set_values (1,2);
b->set_values (3,4);
d->set_values (5,6);
d[1].set_values (7,8);
cout << "a area: " << a.area() << endl;
cout << "*b area: " << b->area() << endl;
cout << "*c area: " << c->area() << endl;
cout << "d[0] area: " << d[0].area() << endl;
cout << "d[1] area: " << d[1].area() << endl;
delete[] d;
delete b;
return 0;
}
(2) ‫اﻟﺗدرﻳب‬
‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﺟﻳدا وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب اﺟب ﻋن اﻷﺳﺋﻠﺔ اﻟﺗﺎﻟﻳﺔ ﺑﺎﻟﺗﻌﺎون ﻣﻊ ﻋﺿو ﻫﻳﺋﺔ اﻟﺗدرﻳس ﻓﻲ‬
‫اﻟﻣﺧﺗﺑر‬
#include <iostream.h>

class CAT
{
public:
CAT() { itsAge = 1; itsWeight=5; }
~CAT() {} // destructor
int GetAge() const { return itsAge; }
int GetWeight() const { return itsWeight; }
void SetAge(int age) { itsAge = age; }

private:
int itsAge;
int itsWeight;
};

int main()
{
CAT * Family[500];
int i;
CAT * pCat;
for (i = 0; i < 10; i++)
{
pCat = new CAT;
pCat->SetAge(2*i +1);
Family[i] = pCat;
}

for (i = 0; i < 10; i++)


{
cout << "Cat #" << i+1 << ": ";
cout << Family[i]->GetAge() << endl;
}
return 0;
}

__________________________________________________ ‫ ﻣﺎ اﺳم اﻟﺻﻧف‬.1


______________________ CAT() { itsAge = 1; itsWeight=5; } :‫ ﻣﺎ وظﻳﻔﺔ اﻟداﻟﺔ اﻟﺗﺎﻟﻳﺔ‬.2
___________________________________________________________ ‫ ﻣﺎ اﺳم اﻟﺑﻧﺎء‬.3
‫‪ .4‬ﻫﻝ ﻳوﺟد ﻫدام ‪ ،‬واذا ﻛﺎﻧت اﺟﺎﺑﺗك ﺑﻧﻌم ﻓﻣﺎ ﻫﻲ اﻟداﻟﺔ اﻟﻬدام‪______________________________ .‬‬
‫‪ .5‬ﻣﺎ ﻫﻲ اﻟﻣﺗﻐﻳرات اﻟﻣﻧﺗﻣﻳﺔ ﻓﻲ اﻟﺻﻧف _____________________________________________‬
‫‪ .6‬أﻋطﻲ أﻣﺛﻠﺔ ﻋﻠﻰ اﻟدواﻝ اﻟﻣﻧﺗﻣﻳﺔ ___________________________________________‬
‫‪ .7‬اﻛﺗب اﻟﺟﻣﻠﺔ اﻟﺗﻲ ﺗﻌرف ﻣﺻﻔوﻓﺔ ﻣن اﻟﻣؤﺷرات ﻟﻠﺻﻧف ‪_______________________ CAT‬‬
‫‪ .8‬ﻣﺎ اﻟﻬدف ﻣن اﺳﺗﺧدام اﻟﺟﻣﻝ اﻟﺗﺎﻟﻳﺔ‪___________________________________ :‬‬
‫;‪pCat = new CAT‬‬
‫;)‪pCat->SetAge(2*i +1‬‬
‫‪ .9‬ﻣﺎ ﻫو ‪____________________________________________ pCat‬‬
‫‪ .10‬ﻣﺎ وظﻳﻔﺔ ‪__________________________________________ new‬‬
‫‪ .11‬ﻟﻣﺎذا اﺳﺗﺧدﻣﻧﺎ اﻟرﻣز >‪ -‬ﻓﻲ اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﻳﺔ ________________________________‬
‫‪ .12‬أﻋطﻲ ﻣﺛﺎﻝ ﻋﻠﻰ داﻟﺔ ﺳطرﻳﺔ _______________________________________________‬
‫‪ .13‬ﻫﻝ اﻟﻧﺗﻳﺟﺔ اﻟﺗﻲ ﺣﺻﻠت ﻋﻠﻳﻬﺎ ﺑﻌد اﻟﺗﻧﻔﻳذ ﻫﻲ‪:‬‬
‫‪Output: Cat #1: 1‬‬
‫‪Cat #2: 3‬‬
‫‪Cat #3: 5‬‬

‫اﻟﺗدرﻳب )‪(3‬‬
‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳوﺿﺢ ﻣﺛﺎﻝ اﻟﻧﻘطﺔ ﺑﺣﻳث ﻳﻘدم ﻓﻛرة اﺳﺗﺧدام ﺧوارزﻣﻳﺎت اﻟﻔرز ‪ bubbleSort‬ﻟﺗرﺗﻳب اﻟﻧﻘط‬
‫ﺗﺻﺎﻋدﻳﺎ ﺣﺳب اﻟﻣﺳﺎﻓﺔ ﻣن ﻧﻘطﺔ اﻷﺳﺎس‪ .‬اﻛﺗب اﻟداﻟﺔ اﻟرﺋﻳﺳﻳﺔ ﻟﻠﺑرﻧﺎﻣﺞ‬
‫>‪include <iostream‬‬
‫{ ‪struct Point‬‬
‫‪float x; // x coordinate‬‬
‫‪float y; // y coordinate‬‬
‫‪char name[20]; // name of the point‬‬
‫;}‬

‫‪Point pts[10]; // array to hold up to 10 points.‬‬


‫‪int n = 0; // number of points in the array.‬‬

‫{ )‪while (cin >> pts[n].name >> pts[n].x >> pts[n].y‬‬


‫;‪n++‬‬
‫}‬

‫{ )‪float dist(Point p‬‬


‫‪// Compute the distance from the origin‬‬
‫;)‪return sqrt(p.x*p.x + p.y*p.y‬‬
‫}‬
void bubbleSort(Point pt[], int size) {
bool doMore = true;
while (doMore) {
doMore = false; // Assume no more passes unless exchange made.
for (int i=0; i<size-1; i++) {
if (dist(pt[i]) > dist(pt[i+1])) {
// Exchange elements
Point temp = pt[i]; pt[i] = pt[i+1]; pt[i+1] = temp;
doMore = true; // Exchange requires another pass.
}
}
}
}

‫( ﻣﺛﺎﻝ ﻋﻠﻰ اﻟﻘواﺋم اﻟﻣﺗﺻﻠﺔ‬4) ‫ﺗدرﻳب‬


‫ واالقترانات المنتمية التي تدخل عمر‬itsAge ‫ ﻳﺣﺗوي ﻋﻠﻰ ﻣﺗﻐﻳر ﻣﻧﺗﻣﻲ‬CAT ‫ ﻳﻌرف ﺻﻧف ﻣن ﻧوع‬C++ ‫اﻛﺗب ﺑرﻧﺎﻣﺞ ﺑﻠﻐﺔ‬
‫ تحتوي على‬Node ‫القطة وترجع عمر ألقطة استخدم القوائم المتصلة لتمثيل المشكلة عن طريق تعريف عقدة من نوع‬
. ‫ الى القائمة المتصلة‬CAT ‫االقترانات الالزمة إلضافة معلومات القطة‬
// Linked list simple implementation

#include <iostream.h>

// object to add to list


class CAT
{
public:
CAT() { itsAge = 1;}
CAT(int age):itsAge(age){}
~CAT(){};
int GetAge() const { return itsAge; }
private:
int itsAge;
};

// manages list, orders by cat's age!


class Node
{
public:
Node (CAT*);
~Node();
void SetNext(Node * node) { itsNext = node; }
Node * GetNext() const { return itsNext; }
CAT * GetCat() const { return itsCat; }
void Insert(Node *);
void Display();
private:
CAT *itsCat;
Node * itsNext;
};

Node::Node(CAT* pCat):
itsCat(pCat),
itsNext(0)
{}

Node::~Node()
{
cout << "Deleting node...\n";
delete itsCat;
itsCat = 0;
delete itsNext;
itsNext = 0;
}

// ************************************
// Insert
// Orders cats based on their ages
// Algorithim: If you are last in line, add the cat
// Otherwise, if the new cat is older than you
// and also younger than next in line, insert it after
// this one. Otherwise call insert on the next in line
// ************************************
void Node::Insert(Node* newNode)
{
if (!itsNext)
itsNext = newNode;
else
{
int NextCatsAge = itsNext->GetCat()->GetAge();
int NewAge = newNode->GetCat()->GetAge();
int ThisNodeAge = itsCat->GetAge();

if ( NewAge >= ThisNodeAge && NewAge < NextCatsAge )


{
newNode->SetNext(itsNext);
itsNext = newNode;
}
else
itsNext->Insert(newNode);
}
}

void Node::Display()
{
if (itsCat->GetAge() > 0)
{
cout << "My cat is ";
cout << itsCat->GetAge() << " years old\n";
}
if (itsNext)
itsNext->Display();
}

int main()
{

Node *pNode = 0;
CAT * pCat = new CAT(0);
int age;

Node *pHead = new Node(pCat);

while (1)
{
cout << "New Cat's age? (0 to quit): ";
cin >> age;
if (!age)
break;
pCat = new CAT(age);
pNode = new Node(pCat);
pHead->Insert(pNode);
}
pHead->Display();
delete pHead;
cout << "Exiting...\n\n";
return 0;
}
‫‪ ‬‬
‫‪ ‬‬
‫الوحدة الرابعة‬
‫الدوال الصديقة والعمليات ‪ ‬‬
‫‪Friend Functions and Operators‬‬
‫‪ ‬‬
‫في ھذه الوحدة‪ ،‬عزيزي الطالب‪ ،‬سندرس الدوال واألصناف الصديقة‪ ،‬وكيفية تعريفھا واستخدامھا‪ .‬ثم سندرس‬
‫كيفية تعريف العمليات مثل) ‪ +‬و * و ‪ (-‬بحيث نجعلھا تتصرف كما نريد حسب نوعية العوامل‪ .‬وفي‬
‫القسم األخير سوف نتحدث عن المجموعات‬

‫‪ 2.1‬أھداف الوحدة‬
‫ينتظر منك‪ ،‬عزيزي الطالب‪ ،‬بعد تنفيذ البرامج أن تكون قادرا على أن‪:‬‬

‫تكتب وتستخدم الدوال التي تستقبل العوامل باإلشارة ‪.Reference Parameters.‬‬ ‫‪.1‬‬
‫تكتب الدوال الصديقة وتستدعيھا بشكل صحيح‪.‬‬ ‫‪.2‬‬
‫تعرف األصناف الصديقة‪.‬‬ ‫‪.3‬‬
‫تكتب تعريفات جديدة للعمليات المختلفة‪.‬‬ ‫‪.4‬‬
‫تعرف وتستخدم ‪. this‬‬ ‫‪.5‬‬

‫ﺗدرﻳب )‪(1‬‬
‫اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻟﺗﻣرﻳر اﻟﻌواﻣﻝ‪ ،‬اﻛﺗب اﻟﺑراﻣﺞ اﻟﺗﺎﻟﻳﺔ وﻧﻔذﻫﺎ ﻋﻠﻰ اﻟﺣﺎﺳوب ‪ ،‬وﻋﻠﻝ ﻧﺗﺎﺋﺞ اﻟﺗﻧﻔﻳذ‪.‬‬

‫تمرير العوامل باإلشارة ‪ parameter passing by reference.‬تمرير العوامل بالقيمة ‪parameter‬‬


‫‪passing by value.‬‬
void swap1(int X, int Y) void swap2(int* X,int* Y) void swap3(int
{ int T=X; { int T=*X; &X, int &Y)
X=Y; *X=*Y; { int
Y=T; *Y=T; T=X;
} }
X=Y;

Y=X;
}

main() main() main()


{int A=10; {int A=10; {int A=10;
int B=20; int B=20; int B=20;

cout<<"A="<<A<<" cout<<"A="<<A<<" cout<<"A="<<A


B="<<B<<endl; B="<<B<<endl; <<"
swap1(A,B); swap2(&A,&B);
B="<<B<<endl;
swap3(A,B);
cout<<"A="<<A<<" cout<<"A=‫<<ط‬A<<"
B="<<B<<endl; B="<<B<<endl;
} } cout<<"A="<<A
<<"

B="<<B<<endl;
}

A=10 B=20 A=10 B=20 A=10


A=10 B=20 A=20 B=10 B=20
A=20
B=10

(2) ‫ﺗدرﻳب‬
Friend Functions ‫الدوال الصديقة‬
‫ لھذه الدالة داخل تعريف الصنف‬prototype ‫تعرف الدالة على أنھا دالة صديقة لصنف ما بوضع نموذج‬
‫ مما يعني أن الدالة الصديقة لھا الحق في معالجة األجزاء الخاصة للصنف كما لو‬. friend ‫مسبوقا بالكلمة‬
.‫ وتختلف طريقة استدعاء الدالة الصديقة عن طريقة استدعاء الدالة المنتمية‬.‫كانت دالة منتمية للصنف‬
‫ إليجاد مربع المسافة‬Distance ‫ حيث يقوم البرنامج بتعريف صنف اسمه مسافة‬،‫ادرس البرنامج التالي جيدا‬
:‫ ثم اجب عن األسئلة التالية‬،‫المعطاة بالقدم والبوصة بالقياس قدم مربع‬

// friend square() function for Distance


#include <iostream>
////////////////////////////////////////////////////////////////
class Distance //English Distance class
{
private:
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0) //constructor (no args)
{ }
//constructor (two args)
Distance(int ft, float in) : feet(ft), inches(in)
{ }
void showdist() //display distance
{ cout << feet << "\'-" << inches << '\"'; }
friend float square(Distance); //friend function
};
//--------------------------------------------------------------
float square(Distance d) //return square of
{ //this Distance
float fltfeet = d.feet + d.inches/12; //convert to float
float feetsqrd = fltfeet * fltfeet; //find the square
return feetsqrd; //return square feet
}
////////////////////////////////////////////////////////////////
int main()
{
Distance dist(3, 6.0); //two-arg constructor (3'-6")
float sqft;

sqft = square(dist); //return square of dist


//display distance and square
cout << "\nDistance = "; dist.showdist();
cout << "\nSquare = " << sqft << " square feet\n";
return 0;
}

......................................................... ‫ ما ھي الدالة الصديقة من البرنامج‬.1


‫‪ .2‬ھل نستخدم اسم الصنف او عملية تقرير المجال ‪ ::‬في ترويسة ھذه الدالة ‪.............................‬‬
‫‪ .3‬كيف يتم استدعاء الدالة الصديقة ) اكتب جملة االستدعاء من البرنامج السابق( ‪............................‬‬
‫‪ .4‬كيف تستخدم المتغيرات المنتمية داخل الدوال الصديقة اعطي مثال على ذلك ‪..............................‬‬
‫‪ .5‬نفذ البرنامج واكتب نتيجة التنفيذ ‪..............................................................................‬‬

‫ﺗدرﻳب )‪ (3‬اﻷﺻﻧﺎف اﻟﺻدﻳﻘﺔ‬


‫لتجنب وضع عدد كبير من الدوال المنتمية إلى صنف كدوال صديقة إلى صنف آخر‪ ،‬نستطيع تعريف الصنف‬
‫بأكمله كصنف صديق للصنف اآلخر‪ .‬مما يعطي جميع الدوال المنتمية إلى الصنف األول القدرة على معالجة‬
‫األجزاء الخاصة في الصنف اآلخر‪ .‬على سبيل المثال لنفرض أن لدينا الصنفين ‪ beta‬والصنف ‪ alpha‬وأننا‬
‫نود إعطاء جميع الدوال المنتمية للصنف ‪ beta‬إمكانية معالجة جميع المتغيرات والدوال الخاصة بالصنف‬
‫‪ employee‬فبدال من أن نعرف كل من ھذه الدوال كدالة صديقة نستطيع تعريف الصنف ‪ beta‬كصديق‬
‫للصنف ‪ alpha‬مما يحقق نفس الغاية‪.‬‬
‫ادرس اﻟﺑرﻧﺎﻣﺞ اﻟﺗﺎﻟﻲ ﺟﻳدا وﻧﻔذة ﻋﻠﻰ اﻟﺣﺎﺳوب واطﺑﻊ ﻧﺗﻳﺟﺔ اﻟﺗﻧﻔﺑذ‪:‬‬
‫‪// friend classes‬‬
‫>‪#include <iostream‬‬
‫‪////////////////////////////////////////////////////////////////‬‬
‫‪class alpha‬‬
‫{‬
‫‪private:‬‬
‫;‪int data1‬‬
‫‪public:‬‬
‫‪alpha() : data1(99) { } //constructor‬‬
‫;‪friend class beta‬‬ ‫‪//beta is a friend class‬‬
‫;}‬
‫‪////////////////////////////////////////////////////////////////‬‬
‫‪class beta‬‬
‫{‬ ‫‪//all member functions can‬‬
‫‪public:‬‬ ‫‪//access private alpha data‬‬
‫} ;‪void func1(alpha a) { cout << "\ndata1=" << a.data1‬‬
‫} ;‪void func2(alpha a) { cout << "\ndata1=" << a.data1‬‬
‫;}‬
‫‪////////////////////////////////////////////////////////////////‬‬
‫)(‪int main‬‬
‫{‬
‫;‪alpha a‬‬
‫;‪beta b‬‬

‫;)‪b.func1(a‬‬
‫;)‪b.func2(a‬‬
‫;‪cout << endl‬‬
‫;‪return 0‬‬
‫}‬
( 4) ‫تدريب‬
‫إعادة تحميل عملية اإلسناد المساواة‬
‫ المختلفة بما يتناسب مع‬operator ‫ أنھا تمكننا من إعادة تعريف العمليات‬C++ ‫من المميزات الجميلة للغة‬
‫ لتعني اسناد – لتعني اسناد كائن الى‬alpha ‫ فمثال نستطيع تعريف العملية = كعملية منتمية للصنف‬.‫تطبيقاتنا‬
.‫اخر‬
// overloads assignment operator (=)
#include <iostream>
////////////////////////////////////////////////////////////////
class alpha
{
private:
int data;
public:
alpha() //no-arg constructor
{}
alpha(int d) //one-arg constructor
{ data = d; }
void display() //display data
{ cout << data; }
alpha operator = (alpha& a) //overloaded = operator
{
data = a.data; //not done automatically
cout << "\nAssignment operator invoked";
return alpha(data); //return copy of this alpha
}
};
////////////////////////////////////////////////////////////////
int main()
{
alpha a1(37);
alpha a2;

a2 = a1; //invoke overloaded =


cout << "\na2="; a2.display(); //display a2

alpha a3 = a2; //does NOT invoke =


cout << "\na3="; a3.display(); //display a3
cout << endl;
return 0;
}
(5) ‫تدريب‬
‫إعادة تحميل عملية اإلسناد المساواة‬
2 ‫استخدم فكرة إعادة التحميل إلسناد المساواة في التدريب‬
// friend overloaded + operator
#include <iostream>
////////////////////////////////////////////////////////////////
class Distance //English Distance class
{
private:
int feet;
float inches;
public:
Distance() //constructor (no args)
{ feet = 0; inches = 0.0; }
Distance( float fltfeet ) //constructor (one arg)
{ //convert float to Distance
feet = int(fltfeet); //feet is integer part
inches = 12*(fltfeet-feet); //inches is what's left
}
Distance(int ft, float in) //constructor (two args)
{ feet = ft; inches = in; }
void showdist() //display distance
{ cout << feet << "\'-" << inches << '\"'; }
friend Distance operator + (Distance, Distance); //friend
};
//--------------------------------------------------------------
Distance operator + (Distance d1, Distance d2) //add D1 to d2
{
int f = d1.feet + d2.feet; //add the feet
float i = d1.inches + d2.inches; //add the inches
if(i >= 12.0) //if inches exceeds 12.0,
{ i -= 12.0; f++; } //less 12 inches, plus 1 foot
return Distance(f,i); //return new Distance with sum
}
//--------------------------------------------------------------
int main()
{
Distance d1 = 2.5; //constructor converts
Distance d2 = 1.25; //float-feet to Distance
Distance d3;
cout << "\nd1 = "; d1.showdist();
cout << "\nd2 = "; d2.showdist();

d3 = d1 + 10.0; //distance + float: OK


cout << "\nd3 = "; d3.showdist();
‫;‪d3 = 10.0 + d1‬‬ ‫‪//float + Distance: OK‬‬
‫;)(‪cout << "\nd3 = "; d3.showdist‬‬
‫;‪cout << endl‬‬
‫;‪return 0‬‬
‫}‬

‫ﺗدرﻳب )‪(6‬‬
‫في ك ّل مرة يتم فيھا استدعاء الدوال المنتمية ‪ ،‬فانه يمرر بصورة اتوماتيكية مؤشر يدعى ‪ ، this‬إلى‬
‫الكينونة التي تم استدعائھا‪ .‬ھذا المؤشر يدعى ‪ this‬ويعتبر معامل ضمني لجميع الدوال المنتمية‪ .‬لذا ‪،‬في‬
‫داخل اي دوال منتمية‪ ،‬المؤشر ‪ this‬قد يستعمل لإلشارة إلى الكينونة المستدعاة‪.‬‬

‫نفذ البرنامج التالي وبين النتيجة التي حصلت عليھا ‪ ،‬ونقاش النتيجة التي حصلت عليھا‬

‫‪// this‬‬
‫>‪#include <iostream‬‬

‫{ ‪class CDummy‬‬
‫‪public:‬‬
‫;)‪int isitme (CDummy& param‬‬
‫;}‬

‫)‪int CDummy::isitme (CDummy& param‬‬


‫{‬
‫;‪if (&param == this) return true‬‬
‫;‪else return false‬‬
‫}‬

‫{ )( ‪int main‬‬
‫;‪CDummy a‬‬
‫;‪CDummy* b = &a‬‬
‫) )‪if ( b->isitme(a‬‬
‫;"‪cout << "yes, &a is b‬‬
‫;‪return 0‬‬
‫}‬
‫اﻟﻮﺣﺪة اﻟﺨﺎﻣﺴﺔ‬
‫األصناف المشتقة والقوالب‬
‫‪Derived Classes and Templates‬‬

‫ﻓﻲ ﻫـذﻩ اﻟوﺣـدة‪ ،‬ﻋزﻳزي اﻟـدارس‪ ،‬ﺳ ـ ـ ـ ـ ـ ــﻧﻧـﺎﻗش أﺳ ـ ـ ـ ـ ـ ــﺎﻟﻳـب ﻣﺧﺗﻠﻔـﺔ ﻟﺗﺣﻘﻳق اﻟﻬـدف اﻷﻫم ﻟﻠﻐـﺎت اﻟﺑرﻣﺟﺔ‬
‫اﻟﻛﻳﻧوﻧﻳﺔ وﻫو ﺗﻘﻠﻳﻝ اﻟﺣﺎﺟﺔ إﻟﻰ ﻛﺗﺎﺑﺔ دواﻝ ﺟدﻳدة ﻋن طرﻳق إﻋﺎدة اﺳـ ــﺗﺧدام اﻟدواﻝ اﻟﻘدﻳﻣﺔ ‪.Code Reuse‬‬
‫إذ ﺳ ـ ــﻧﻧﺎﻗش ﻓﻲ ﻫذﻩ اﻟوﺣدة ﻛﻳﻔﻳﺔ اﺷ ـ ــﺗﻘﺎق ﺻ ـ ــﻧف ﺟدﻳد‪ ،‬ﻳدﻋﻰ ﺑﺎﻟﺻ ـ ــﻧف اﻟﻣﺷ ـ ــﺗق ‪ ، Derived Class‬ﻣن‬
‫ﺻــﻧف )أو أﻛﺛر( آﺧر ﻳدﻋﻰ ﺑﺎﻟﺻــﻧف اﻷﺳــﺎس ‪ Base Class‬؛ ﻣﻣﺎ ﻳﺳــﻣﺢ ﻟﻧﺎ‪ ،‬إذا أﺣﺳــﻧﺎ ﺗﺻــﻣﻳم اﻟﻧظﺎم‪،‬‬
‫اﺳـ ــﺗﺧدام اﻟﻛﺛﻳر ﻣن اﻟدواﻝ اﻟﺧﺎﺻـ ــﺔ ﺑﺎﻟﺻـ ــﻧف اﻷﺳـ ــﺎس ﻟﻠﺻـ ــﻧف اﻟﻣﺷـ ــﺗق دون اﻟﺣﺎﺟﺔ إﻟﻰ إﻋﺎدة ﻛﺗﺎﺑﺗﻬﺎ ﻣن‬
‫ﺗورث إﻟﻰ اﻟﺻ ــﻧف اﻟﻣﺷ ــﺗق‪ .‬ﻻﺣظ‪ ،‬ﻋزﻳزي‬
‫ﺟدﻳد‪ .‬وذﻟك ﻷن اﻟﻣﺗﻐﻳرات واﻟدواﻝ اﻟﺧﺎﺻ ــﺔ ﺑﺎﻟﺻ ــﻧف اﻷﺳ ــﺎس ّ‬
‫اﻟدارس‪ ،‬أن إﻋﺎدة اﺳﺗﺧدام اﻟدواﻝ ‪ Code Reuse‬ﻻ ﻳﻘﻠﻝ‪ ،‬ﻓﻘط‪ ،‬ﻣن اﻟﺟﻬد واﻟوﻗت اﻟﻼزﻣﻳن ﻟﺗطوﻳر اﻟﺑراﻣﺞ‪،‬‬
‫إﻧﻣﺎ أﻳﺿـ ـ ـ ـ ـ ـﺎً ﻳﻘﻠﻝ ﻣن اﻟوﻗت واﻟﺟﻬد اﻟﻼزﻣﻳن ﻟﺻ ـ ـ ـ ـ ــﻳﺎﻧﺗﻬﺎ‪ .‬وﻳﺳ ـ ـ ـ ـ ــﺎﻋدﻧﺎ أﻳﺿـ ـ ـ ـ ـ ـﺎً ﻋﻠﻰ إﻧﺗﺎج ﺑراﻣﺞ ﻳﻌﺗﻣد ﻋﻠﻳﻬﺎ‬
‫‪ ،reliable‬إذ إن اﺳﺗﺧدام داﻟﺔ ﻣﺟرﺑﺔ ﺧﻳر ﻣن ﻛﺗﺎﺑﺔ داﻟﺔ ﺟدﻳدة ﻗد ﺗﺣوي أﺧطﺎء ﺧﻔﻳﺔ‪.‬‬

‫وﻣن اﻟطرق اﻷﺧرى اﻟﺗﻲ ﺗزودﻧﺎ ﺑﻬﺎ ﻟﻐﺔ ‪ C ++‬ﻟﺗﺳــﺎﻋدﻧﺎ ﻓﻲ ﺗﺣﻘﻳق ﻫدﻓﻧﺎ ﻓﻲ إﻋﺎدة اﺳــﺗﺧدام اﻟﺑراﻣﺞ‬
‫ﻫو ﻣﺎ ﻳﺳ ــﻣﻰ ﺑﺎﻟدواﻝ اﻟﻘﺎﻟﺑﻳﺔ ‪ Template Functions‬وﻫﻲ دواﻝ ﺗﻛﺗب ﺑطرﻳﻘﺔ ﺗﺳ ــﻣﺢ ﻟﻧﺎ ﺑﺎﺳ ــﺗﺧداﻣﻬﺎ ﻋﻠﻰ‬
‫أﻧواع ﻣﺧﺗﻠﻔـﺔ ﻣن اﻟﺑﻳـﺎﻧـﺎت دون اﻟﺣـﺎﺟﺔ إﻟﻰ ﻛﺗﺎﺑﺔ ﻧﺳ ـ ـ ـ ـ ـ ــﺧﺔ ﻣن ﻫذﻩ اﻟدواﻝ ﻟﻛﻝ ﻧوع ﻣن أﻧواع اﻟﺑﻳﺎﻧﺎت‪ .‬ﻛذﻟك‬
‫ﺗﺳ ـ ـ ــﻣﺢ ﻟﻧﺎ ﻟﻐﺔ ‪ C ++‬ﺑﺗﻌرﻳف أﺻ ـ ـ ــﻧﺎف ﻗﺎﻟﺑﻳﺔ وﻫﻲ أﺻ ـ ـ ــﻧﺎف ﻋﺎﻣﺔ ﺗﺳ ـ ـ ــﻣﺢ ﻟﻧﺎ ﺑﺗﺄﺟﻳﻝ ﺗﺣدﻳد ﻧوع اﻟﻣﺗﻐﻳرات‬
‫اﻟﻣﻧﺗﻣﻳﺔ إﻟﻰ ﺣﻳن اﺳــﺗﺧداﻣﻬﺎ‪ ،‬وﺑذﻟك ﻓﻬﻲ ﺗﻣﻧﺣﻧﺎ اﻟﻘدرة ﻋﻠﻰ ﺗﻌرﻳف أﺻــﻧﺎف ﺧﺎﺻــﺔ ﺗﻌﻣﻝ ﻋﻠﻰ أﻧواع ﺑﻳﺎﻧﺎت‬
‫ﻣﺧﺗﻠﻔﺔ دون اﻟﺣﺎﺟﺔ إﻟﻰ ﻛﺗﺎﺑﺔ ﻫذﻩ اﻷﺻﻧﺎف اﻟﻣﺧﺗﻠﻔﺔ وﺗﻌرﻳف دواﻟﻬﺎ‪.‬‬

‫وﻣﻣن اﻟﻣﻣﻳزات اﻟﻬﺎﻣﺔ ﻟﻠﻐﺔ ‪ C ++‬ﻣﺎ ﻳدﻋﻰ ﺑﺗﻌدد اﻷوﺟﻪ ‪ ،polymorphism‬ﺣﻳث ﺗﺳـ ـ ـ ـ ــﻣﺢ ﻟﻧﺎ ﻟﻐﺔ‬
‫‪ C ++‬ﺑﺗﺄﺧﻳر ﺗﺣدﻳد ﻫوﻳﺔ اﻟداﻟﺔ اﻟﺗﻲ ﺳﺗﺳﺗدﻋﻰ إﻟﻰ وﻗت ﺗﻧﻔﻳذ اﻟﺑرﻧﺎﻣﺞ )وﻟﻳس وﻗت ﺗرﺟﻣﺗﻪ ﻛﻣﺎ ﻫﻲ اﻟﻌﺎدة(‬
‫ﻣﻣﺎ ﻳﻣﻧﺣﻧﺎ اﻟﻘدرة ﻋﻠﻰ ﻛﺗﺎﺑﺔ ﺑراﻣﺞ ﺗﻘوم ﺑﻣﻬﺎم ﻣن اﻟﺻ ـ ـ ـ ـ ـ ــﻌب ﻛﺗﺎﺑﺗﻬﺎ ﺑﻠﻐﺎت اﻟﺑرﻣﺟﺔ اﻟﺗﻘﻠﻳدﻳﺔ أو ﻣﺎ ﻳﺳ ـ ـ ـ ـ ـ ــﻣﻰ‬
‫ﺑﻠﻐﺎت اﻟﺑرﻣﺟﺔ اﻹﺟراﺋﻳﺔ ﻛﺎﻟﺑﺎﺳﻛﺎﻝ‪ ،‬ﻋﻠﻰ ﺳﺑﻳﻝ اﻟﻣﺛﺎﻝ‪.‬‬

‫أﻫداف اﻟوﺣدة‬
‫ﻳﺗوﻗﻊ ﻣﻧك‪ ،‬ﻋزﻳزي اﻟدارس‪ ،‬ﻋﻧد ﻓراﻏك ﻣن دراﺳﺔ ﻫذﻩ اﻟوﺣدة‪ ،‬أن ﺗﻛون ﻗﺎد اًر ﻋﻠﻰ أن ‪:‬‬
‫‪ .1‬ﺗﺻﻣم ﻣﺎ ﻳﺳﻣﻰ ﺑﺷﺟرة اﻷﺻﻧﺎف اﻟﻬرﻣﻳﺔ ﺑﺣﻳث ﺗﻘﻠﻝ اﻟﺣﺎﺟﺔ إﻟﻰ إﻋﺎدة ﻛﺗﺎﺑﺔ دواﻝ ﺟدﻳدة ﻗدر اﻹﻣﻛﺎن‪.‬‬
‫‪ .2‬ﺗﻌرف أﺻﻧﺎﻓًﺎ ﺟدﻳدة ﻣﺷﺗﻘﺔ ﻣن أﺻﻧﺎف أﺧرى ﻣﻔردة أو ﻣﺗﻌددة‪.‬‬
‫‪ .3‬ﺗﺑﻳن أﻧواع اﻟوراﺛﺔ اﻟﻣﺧﺗﻠﻔﺔ وﻛﻳف ﺗﺳﺗﺧدﻣﻬﺎ‪.‬‬
‫‪ .4‬ﺗﻌرف دواﻝ ﻗﺎﻟﺑﻳﺔ ‪ Template Functions‬وﺗﺳﺗﺧدﻣﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ‪.‬‬
‫‪ .5‬ﺗﻌرف ﺻﻧﻔﺎً ﻗﺎﻟﺑﻳﺎً ‪ Template Class‬وﺗﻌرف ﻛﻳف ﺗﺳﺗﺧدﻣﻪ ﻟﻌﻣﻝ أﺻﻧﺎف ﺟدﻳدة‪.‬‬
‫‪ .6‬ﺗﻌرف ﻛﻳف وﻣﺗﻰ ﺗﺳﺗﺧدم ﺧﺎﺻﻳﺔ ﺗﻌدد اﻷوﺟﻪ ‪ polymorphism‬اﻟﻣﻬﻣﺔ‪.‬‬

‫اﻟوراﺛﺔ اﻟﻣﻧﻔردة ‪:Single Inheritance‬‬


‫ﻟو ﻓرﺿﻧﺎ ان ﻟدﻳﻧﺎ اﻟﺻﻧف ‪ Shape‬واﻟذي ﻳﻌﺗﺑر اﻟﺻﻧف اﻷﺳﺎس ﻷي ﺷﻛﻝ ﻫﻧدﺳﻲ ﻓﺈﻧﻪ ﻳﻣﻛﻧﻧﺎ أن ﻧﻛﺗب‬
‫اﻟﺻﻧف ‪ Rectangle‬واﻟذي ﻳﻣﺛﻝ اﻟﻣﺳﺗطﻳﻝ ﺑﺄن ﻳﻛون ﻣﺷﺗﻘﺎ )أن ﻳرث( ﻣن اﻟﺻﻧف ‪ ،Shape‬أدرس اﻟﻣﺛﺎﻝ‬
‫اﻟﺗﺎﻟﻲ وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب‪:‬‬

‫>‪#include <iostream‬‬
‫>‪#include <conio.h‬‬

‫‪// Base class‬‬


‫‪class Shape‬‬
‫{‬
‫‪public:‬‬
‫)‪void setWidth(int w‬‬
‫{‬
‫;‪width = w‬‬
‫}‬
‫)‪void setHeight(int h‬‬
‫{‬
‫;‪height = h‬‬
‫}‬
‫‪protected:‬‬
int width;
int height;
};

// Derived class
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};

int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);

// Print the area of the object.


cout << "Total area: " << Rect.getArea() << endl;
getch();
}

:‫ﻧﺎﺗﺞ ﺗﻧﻔﻳذ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻫو‬


Total area: 35

:Multiple Inheritance ‫اﻟوراﺛﺔ اﻟﻣﺗﻌددة‬


.‫أدرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳوﺿﺢ ﻣﻔﻬوم اﻟوراﺛﺔ اﻟﻣﺗﻌددة وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب‬
#include <iostream>
#include <conio.h>

// Base class Shape


class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};

// Base class PaintCost


class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};

// Derived class
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};

int main(void)
{
Rectangle Rect;
int area;

Rect.setWidth(5);
Rect.setHeight(7);

area = Rect.getArea();

// Print the area of the object.


cout << "Total area: " << Rect.getArea() << endl;

// Print the total cost of painting


cout << "Total paint cost: $" << Rect.getCost(area) << endl;

getch();
}

:‫ﻧﺎﺗﺞ ﺗﻧﻔﻳذ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻫو‬


‫‪Total area: 35‬‬
‫‪Total paint cost: $2450‬‬

‫ﺗﻣرﻳن)‪ :(1‬اﻛﺗب اﻟﻧص اﻟﺑرﻣﺟﻲ اﻟذي ﻳﺣﻘق اﻟوراﺛﺔ اﻟﻣﻧﻔردة اﻟﻣوﺿﺣﺔ ﻓﻲ اﻟﺷﻛﻝ اﻟﺗﺎﻟﻲ ﻋﻠﻣﺎ ﺑﺎن اﻟﺻﻧﻔﺎن‬
‫اﻟﻣﺷﺗﻘﺎن ﻳﺣﺗوﻳﺎن دواﻝ ﺣﺳﺎب اﻟﻣﺳﺎﺣﺔ‪.‬‬

‫‪CPolygon‬‬
‫‪width : Integer‬‬
‫‪height : Integer‬‬

‫)(‪set_values‬‬

‫‪CRectangle‬‬ ‫‪CTriangle‬‬

‫)( ‪area‬‬ ‫)( ‪area‬‬

‫ﻣﺳﺎﻋدة‪ :‬اﻟﻧص اﻟﺑرﻣﺟﻲ ﻟﻠﺻﻧف ‪ CPolygon‬ﻫو‪:‬‬

‫‪// derived classes‬‬


‫>‪#include <iostream‬‬
‫>‪#include <conio.h‬‬
‫{ ‪class CPolygon‬‬
‫‪protected:‬‬
‫;‪int width, height‬‬
‫‪public:‬‬
‫)‪void set_values (int a, int b‬‬
‫};‪{ width=a; height=b‬‬
‫;}‬

‫ﻋرﻓﻧﺎ ﺻﻧﻔﺎ أﺳﺎﺳﻳﺎ اﺳﻣﻪ ‪ COutput‬وأردﻧﺎ ﻣن اﻟﺻﻧﻔﻳن ‪CTriangle, CRectangle‬‬


‫ﺗﻣرﻳن)‪ :(2‬ﻟو ّ‬
‫أن ﻳرﺛﺎ ﻣن ﻫذا اﻟﺻﻧف ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ اﻟوراﺛﺔ ﻣن اﻟﺻﻧف ‪ CPolygon‬اﻟﺳﺎﺑق‪ .‬اﻋﻣﻝ اﻟﺗﻌدﻳﻝ اﻟﻼزم‬
‫ﻋﻠﻰ اﻟﺑرﻧﺎﻣﺞ اﻟﺳﺎﺑق ﻟﺗﺣﻘﻳق ﻣﻔﻬوم اﻟوراﺛﺔ اﻟﻣﺗﻌددة‪.‬‬
‫ﻣﺳﺎﻋدة‪ :‬ﺗﻌرﻳف اﻟﺻﻧف ‪ COutput‬ﻫو‪:‬‬

‫{ ‪class COutput‬‬
‫‪public:‬‬
void output (int i);
};

Polymorphism ‫ﺗﻌدد اﻻوﺟﻪ‬


‫ ﻻﺣظ ﻧﺎﺗﺞ اﻟﺗﻧﻔﻳذ ﺛم‬.C++ ‫ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳﺑﻳن ﻣﻔﻬوم اﻟوراﺛﺔ اﻟﻣﺗﻌددة وﻧﻔذﻩ ﺑﺎﺳﺗﺧدام ﻣﺗرﺟم‬
.‫أﺟب ﻋن اﻟﺳؤاﻝ اﻟذي ﻳﻠﻳﻪ‬
#include <iostream>
#include <conio.h>
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height / 2);
}
};
// Main function for the program
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);

// store the address of Rectangle


shape = &rec;
// call rectangle area.
shape->area();

// store the address of Triangle


shape = &tri;
// call triangle area.
shape->area();
getch();
}
‫ﻧﺎﺗﺞ ﺗﻧﻔﻳذ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻫو‬
Parent class area
Parent class area

‫ وﻳﻌطﻲ‬Polymorphism ‫ أﻋﻣﻝ اﻟﺗﻌدﻳﻝ اﻟﻼزم ﻋﻠﻰ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻟﻳﺣﻘق ﻣﻔﻬوم ﺗﻌدد اﻻوﺟﻪ‬:(3) ‫ﺗﻣرﻳن‬
:‫اﻟﻧﺗﻳﺟﺔ اﻟﺗﺎﻟﻳﺔ‬
Rectangle class area
Triangle class area

:‫اﻟﻘواﻟب‬

.‫ واﻟﺗﻲ ﺗﻌﻣﻝ ﻋﻠﻰ ﺗﺑدﻳﻝ ﻣﺗﻐﻳران ﻣن ﻧوع ﻛﺎﺋن ﻣن ﻧﻔس اﻟﺻﻧف‬Swap ‫اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﻳﻌرف ﻗﺎﻟﺑﺎ ﻟﻠداﻟﺔ‬

template <class Type>


void Swap (Type &x, Type &y)
{
Type tmp = x;
x = y;
y = tmp;
}
‫ﺗﻣرﻳن)‪ :(4‬اﻛﺗب ﻗﺎﻟﺑﺎ ﻟﻠداﻟﺔ ‪ GetMax‬واﻟﺗﻲ ﺗﻌﻳد أﻛﺑر ﻛﺎﺋن ﻣن اﻟﻛﺎﺋﻧﻳن اﻟﻣﻣررﻳن إﻟﻳﻬﺎ‪ ،‬ﺛم اﺳﺗدع ﻫذﻩ‬
‫اﻟداﻟﺔ ﻣرﺗﻳن‪ ،‬اﻷوﻟﻰ ﻟﻣﻘﺎرﻧﺔ ﻋددﻳن ﺻﺣﻳﺣﻳن ‪ ،‬وﻣرة أﺧرى ﻟﺗﻘﺎرن ﻋددﻳن ﻣن ﻧوع ‪.float‬‬

‫ﺗﻣرﻳن)‪ :(5‬اﻛﺗب اﻟﻘﺎﻟب ‪ GetMin‬واﻟذي ﻳﻘﺑﻝ ﻧوﻋﻳن ﻣﺧﺗﻠﻔﻳن ﻣن اﻟﺑﻳﺎﻧﺎت‪ .‬وﻗم ﺑﺗﻧﻔﻳذﻩ‪.‬‬

‫ﺗﻣرﻳن)‪ :(6‬اﻛﺗب ﺻﻧﻔﺎ ﻳﻘﺑﻝ أﻋﺿﺎء ﻣن أﻧواع ﻋﺎﻣﺔ وﻳﺳطﻳﻊ أن ﻳﺧزن ﻋﻧﺻرﻳن ﻣن أي ﻧوع ﻣﻘﺑوﻝ وﻳﺣﺗوي‬
‫داﻟﺔ ﺗﻌﻳد أﻛﺑر ﻗﻳﻣﺔ‪.‬‬
‫ﺣﻠوﻝ ﺗﻣرﻳﻧﺎت اﻟوﺣدة اﻟﺧﺎﻣﺳﺔ‬
:(1) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// derived classes
#include <iostream>
#include <conio.h>
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};

class CRectangle: public CPolygon {


public:
int area (void)
{ return (width * height); }
};
class CTriangle: public CPolygon {
public:
int area (void)
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
cout << rect.area() << endl;
cout << trgl.area() << endl;
getch();
}

:(2) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// multiple inheritance
#include <iostream>
#include <conio.h>
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};
class COutput {
public:
void output (int i);
};
void COutput::output (int i) {
cout << i << endl;
}
class CRectangle: public CPolygon, public
COutput {
public:
int area (void)
{ return (width * height); }
};
class CTriangle: public CPolygon, public
COutput {
public:
int area (void)
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
rect.output (rect.area());
trgl.output (trgl.area());
getch();
}

‫ ﺑﺄن ﻳﺳﺑق ﺗﻌرﻳﻔﻬﺎ اﻟﻛﻠﻣﺔ‬Shape ‫ ﻓﻲ اﻟﺻﻧف‬area ‫ اﻟﺗﻌدﻳﻝ ﻫو ﻋﻠﻰ ﺗﻌرﻳف اﻟداﻟﺔ‬:(3) ‫ﺣﻝ اﻟﺗﻣرﻳن‬
.Polymorphism ‫ ﻣن أﺟﻝ ﺗﺣﻘﻳق ﻣﻔﻬوم ﺗﻌدد اﻷﺷﻛﺎﻝ‬virtual

class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
virtual int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};

:(4) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// function template
#include <iostream>
#include <conio.h>
template <class S>
S GetMax (S a, S b) {
S result;
return ( result = (a>b)? a : b );
}
int main () {
int i=5, j=6, k;
float l=10.0, m=5.0, n;
k=GetMax<int>(i,j);
n=GetMax<float>(l,m);
cout << k << "\n" << n << endl;
getch();
}

:(5) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// function template
#include <iostream>
#include <conio.h>
template <class T, class U>
T GetMin (T a, U b) {
return ( a < b ? a : b ) ;
}
int main () {
int i=5, j=6, k;
float l=10.0, m=5.0, n;
k = GetMin<int,float> (j,l);
n = GetMin (j,l);
cout << k << "\n" << n << endl;
getch();
}

:(6) ‫ﺣﻝ اﻟﺗﻣرﻳن‬

// class templates
#include <iostream>
#include <conio.h>
template <class T>
class mypair {
T a, b;
public:
mypair (T first, T second)
{a=first; b=second;}
T getmax ();
};
template <class T>
T mypair<T>::getmax ()
{
T retval;
retval = a>b? a : b;
return retval;
}
int main () {
mypair <int> myobject (100, 75);
cout << myobject.getmax()<<endl;
getch();
}
‫اﻟﻮﺣﺪة اﻟﺴﺎدﺳﺔ‬
‫معالجة الملفات بلغة ‪C++‬‬
‫‪File Processing with C++‬‬

‫ﻋﻣﺎ ﻳﺗﻌﻠق ﺑﻣﻌﺎﻟﺟﺔ اﻟﻣﻠﻔﺎت ﻓﻲ‬


‫ﻋزﻳزي اﻟدارس‪ ،‬ﺗﻬدف ﻫذﻩ اﻟوﺣدة إﻟﻰ إﻋطﺎﺋك ﻣﻌﻠوﻣﺎت أﺳ ـ ــﺎﺳ ـ ــﻳﺔ ّ‬
‫ﻟﻐﺔ ‪ C ++‬وﺗوﺿﻳﺢ ﺑﻌض اﻟﻌﻣﻠﻳﺎت اﻷﺳﺎﺳﻳﺔ ﻋﻠﻰ اﻟﻣﻠﻔﺎت ﺑﺄﻧواﻋﻬﺎ اﻟﻣﺧﺗﻠﻔﺔ‪.‬‬

‫ﺗﺗﻧــﺎوﻝ ﻫــذﻩ اﻟوﺣــدة ﺗﻌرﻳف ﻣﻔﻬوم ﻫﻳﻛــﻝ اﻟﺑﻳــﺎﻧــﺎت وﻣوﻗﻊ اﻟﻣﻠﻔــﺎت ﺑﻳﻧﻬــﺎ ٕواﻋطــﺎء ﻟﻣﺣــﺔ ﻣﺧﺗﺻ ـ ـ ـ ـ ـ ــرة ﻋن‬
‫اﻷﻧواع اﻟﻣﺧﺗﻠﻔﺔ ﻣن اﻟﺑﻳﺎﻧﺎت‪ .‬وﻳﺗﻠو ذﻟك ﻣﻧﺎﻗﺷﺔ اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻓﻲ ﺗﻧظﻳم اﻟﻣﻠﻔﺎت وﺗﻌرﻳف اﻟﻣﻠﻔﺎت واﻟﻳﻧﺎﺑﻳﻊ‪،‬‬
‫وﻣن ﺛم ﺗوﺿــﻳﺢ ﻛﻳﻔﻳﺔ إﻧﺷــﺎء اﻟﻣﻠﻔﺎت اﻟﺗﺗﺎﺑﻌﻳﺔ واﻟﻌﺷ ـواﺋﻳﺔ وﻗراءﺗﻬﺎ وﺗﺣدﻳﺛﻬﺎ‪ ،‬وأﺧﻳ اًر ﺗم ﺗوﺿ ــﻳﺢ ﻛﻳﻔﻳﺔ اﻟﺗﻌﺎﻣﻝ‬
‫ﻣﻊ اﻟﻛﺎﺋﻧﺎت ﻣن ﺣﻳث اﻹدﺧﺎﻝ واﻹﺧراج ﻓﻲ اﻟﻣﻠﻔﺎت‪.‬‬

‫أﻫداف اﻟوﺣدة‬
‫ﻳﻧﺗظر ﻣﻧك‪ ،‬ﻋزﻳزي اﻟدارس‪ ،‬ﺑﻌد ﻓراﻏك ﻣن دراﺳﺔ ﻫذﻩ اﻟوﺣدة‪ ،‬أن ﺗﻛون ﻗﺎد اًر ﻋﻠﻰ أن‪:‬‬

‫ﺗﻌرف ﻫﻳﻛﻝ اﻟﺑﻳﺎﻧﺎت وﻣوﻗﻊ اﻟﻣﻠﻔﺎت ﺑﻳﻧﻬﺎ‪.‬‬


‫‪ّ .1‬‬

‫ﺗﻌرف اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻓﻲ ﺗﻧظﻳم اﻟﻣﻠﻔﺎت )‪  .(File Organization‬‬


‫‪ّ .2‬‬

‫ﺗﻌرف اﻟﻣﻠﻔﺎت واﻟﻳﻧﺎﺑﻳﻊ )‪  (Files and Streams‬‬


‫‪ّ .3‬‬

‫‪ .4‬ﺗﻧﺷﺊ اﻟﻣﻠﻔﺎت اﻟﺗﺗﺎﺑﻌﻳﺔ وﺗﻘرؤﻫﺎ وﺗﺣدﺛﻬﺎ‪  .‬‬

‫‪ .5‬ﺗﻧﺷﺊ اﻟﻣﻠﻔﺎت اﻟﻌﺷواﺋﻳﺔ وﺗﻘرؤﻫﺎ وﺗﺣدﺛﻬﺎ‪  .‬‬

‫‪ .6‬ﺗدﺧﻝ اﻟﻛﺎﺋﻧﺎت وﺗﺧرﺟﻬﺎ )‪.(Input/Output of Objects‬‬


‫ أدرس اﻟﻣﺛﺎﻝ اﻟﻣﻛﺗوب وﻧﻔذﻩ ﻋﻠﻰ اﻟﺣﺎﺳوب ﺛم ﻗم ﺑﻣﺎ‬،‫اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﻳوﺿﺢ ﻛﻳﻔﻳﺔ اﻟﻘراءة واﻟﻛﺗﺎﺑﺔ ﻓﻲ ﻣﻠف‬
:‫ﻳﻠﻲ‬
.‫ أدﺧﻝ اﻟﺑﻳﺎﻧﺎت اﻟﻣطﻠوﺑﺔ أﺛﻧﺎء اﻟﺗﻧﻔﻳذ‬-1
.(‫ أﻧظر ﻧﺎﺗﺞ اﻟﺗﻧﻔﻳذ ﻋﻠﻰ اﻟﺷﺎﺷﺔ )ﺳﻳظﻬر ﻣن ﺿﻣﻧﻬﺎ اﻟﻣﻌﻠوﻣﺎت اﻟﺗﻲ ﻗﻣت ﺑﺈدﺧﺎﻟﻬﺎ‬-2
.‫ ﻋﻠﻰ ﻣﺟﻠد اﻟﻌﻣﻝ‬afile.dat ‫ ﺑﻌد ﺗﻧﻔﻳذ اﻟﺑرﻧﺎﻣﺞ ﺳﻳﺗم اﻧﺷﺎء ﻣﻠف ﺑﺎﺳم‬-3
‫ ﻣﺎ ﻣﺣﺗوﻳﺎت اﻟﻣﻠف؟‬،‫ ﻣﺛﻼ‬notepad ‫ ﺑواﺳطﺔ ﻣﺣرر ﻧﺻوص ﻣﺛﻝ ﺑرﻧﺎﻣﺞ‬afile.dat ‫اﻓﺗﺢ اﻟﻣﻠف‬-4

#include <fstream>
#include <iostream>
#include <conio.h>
int main ()
{
char data[100];
// open a file in write mode.
ofstream outfile;
outfile.open("afile.dat");

cout << "Writing to the file" << endl;


cout << "Enter your name: ";
cin.getline(data, 100);

// write inputted data into the file.


outfile << data << endl;

cout << "Enter your age: ";


cin >> data;
cin.ignore();

// again write inputted data into the file.


outfile << data << endl;

// close the opened file.


outfile.close();

// open a file in read mode.


ifstream infile;
infile.open("afile.dat");

cout << "Reading from the file" << endl;


infile >> data;
‫‪// write the data at the screen.‬‬
‫;‪cout << data << endl‬‬

‫‪// again read the data from the file and display it.‬‬
‫;‪infile >> data‬‬
‫;‪cout << data << endl‬‬

‫‪// close the opened file.‬‬


‫;)(‪infile.close‬‬

‫;)(‪getch‬‬
‫}‬

‫ﺗﻣرﻳن )‪ :(1‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻟﻛﺗﺎﺑﺔ ﻧﺻﺎ ﻓﻲ ﺳطرﻳن داﺧﻝ ﻣﻠف ‪ .example.txt‬ﻣوﺿﺣﺎ ﻛﻳﻔﻳﺔ ﻓﺗﺢ اﻟﻣﻠف‬
‫ﻟﻠﻛﺗﺎﺑﺔ دون ﻣﺳﺢ ﻣﺣﺗوﻳﺎت اﻟﻣﻠف إن ﻛﺎن ﻣوﺟودا ﻣن ﻗﺑﻝ‪.‬‬

‫ﺗﻣرﻳن )‪ :(2‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻘراءة ﻣﺣﺗوﻳﺎت اﻟﻣﻠف اﻟﻣذﻛور ﻓﻲ اﻟﺗﻣرﻳن اﻟﺳﺎﺑق وطﺑﺎﻋﺔ ﻣﺣﺗوﻳﺎﺗﻪ ﻋﻠﻰ‬
‫اﻟﺷﺎﺷﺔ‪ٕ .‬وان ﻛﺎن اﻟﻣﻠف ﻏﻳر ﻣوﺟود ﻓﺈﻧﻪ ﻳطﺑﻊ رﺳﺎﻟﺔ ﺗﺑﻳن ذﻟك‪.‬‬

‫ﺗﻣرﻳن )‪ :(3‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻟﺣﺳﺎب ﺣﺟم اﻟﻣﻠف ‪example.txt‬‬

‫ﺗﻣرﻳن )‪ :(4‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻛﺗﺎﺑﺔ ﻋدد ﻣن ﺳﺟﻼت طﻠﺑﺔ ﻓﻲ ﻣﻠف ﻋﺷواﺋﻲ‪ ،‬ﺣﻳث ﻳﺗوﻗف اﻟﺑرﻧﺎﻣﺞ‬
‫ﻋﻧدﻣﺎ ﻳﻘوم اﻟﻣﺳﺗﺧدم ﺑﺈدﺧﺎﻝ رﻗم طﺎﻟب أﻗﻝ ﻣن ‪ 0‬أو أﻛﺑر ﻣن ‪ ، 100‬وﻫﻲ ﻣﺟﻣوﻋﺔ أرﻗﺎم اﻟطﻠﺑﺔ اﻟﻣراد‬
‫اﻧﺷﺎء ﺳﺟﻼت ﻟﻬم‪.‬‬
‫ﻣﻼﺣظﺔ‪ :‬ﺑﻌد ﻛﺗﺎﺑﺔ اﻟﺑرﻧﺎﻣﺞ وﺗﻧﻔﻳذﻩ ﺑﻧﺟﺎح‪ ،‬ﺣﺎوﻝ ﻓﺗﺢ اﻟﻣﻠف اﻟﻣﻧﺷﺄ ﺑواﺳطﺔ ﻣﺣرر ﻧﺻوص ﺛم ﻻﺣظ ﻛﻳف‬
‫ﺗظﻬر ﻣﺣﺗوﺑﺎت اﻟﻣﻠف!!‬

‫ﺗﻣرﻳن )‪ :(5‬اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻘراءة ﻋدد ﻣن اﻟﺳﺟﻼت ﻣن ﻣﻠف اﻟﺗﻣرﻳن اﻟﺳﺎﺑق ﺑﺎﺳﺗﺧدام اﻟداﻟﺔ ‪read‬‬
‫واﻟداﻟﺔ ‪. seekg‬‬
‫ﺣﻠوﻝ ﺗﻣرﻳﻧﺎت اﻟوﺣدة اﻟﺳﺎدﺳﺔ‬
:(1) ‫ﺣﻝ ﺗﻣرﻳن‬
// writing on a text file
#include <iostream>
#include <fstream>
int main () {
ofstream myfile ("example.txt", ios::app);
if (myfile.is_open())
{
myfile << "This is a line.\n";
myfile << "This is another line.\n";
myfile.close();
}
else cout << "Unable to open file";
return 0;
}

:(2) ‫ﺣﻝ اﻟﺗﻣرﻳن‬


// reading a text file
#include <iostream>
#include <fstream>
#include <string>

int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}

else cout << "Unable to open file";


return 0;
}
:(3) ‫ﺣﻝ اﻟﺗﻣرﻳن‬
// obtaining file size
#include <iostream>
#include <fstream>

int main () {
long begin, end;
ifstream myfile ("example.txt");
begin = myfile.tellg();
myfile.seekg (0, ios::end);
end = myfile.tellg();
myfile.close();
cout << "size is: " << (end-begin) << " bytes.\n";
return 0;
}

:(4) ‫ﺣﻝ ﺗﻣرﻳن‬


#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>

//using namespace std;


const int No_Of_Records =100;
struct student
{
int no;
char name[32];
float average;
};

int main(void)
{
student studentrecord;
int sno;
char sname[32];
float saverage;
ofstream outStudentFile("studrf.dat",ios::in|ios::out|ios::binary);
if(!outStudentFile)
{
cerr << "File could not be opened" << endl;
exit(1);
}
cout <<"\nEnter student no (1 to 100), any number else to end input: ";
cin >> sno;
while(sno >0 && sno<=No_Of_Records)
{
cout << "\nEnter student name: ";
cin >> sname;
cout << "\nEnter student average: ";
cin >> saverage;
studentrecord.no=sno;
strcpy(studentrecord.name,sname);
studentrecord.average=saverage;
outStudentFile.seekp((studentrecord.no-1)* sizeof(struct student));
outStudentFile.write(reinterpret_cast <const char *>
(&studentrecord),sizeof(struct student));
cout <<"\n\nEnter student no (1 to 100), any number else to end input: ";
cin >> sno;
} // end while
outStudentFile.close();
return 0;
}

:(5) ‫ﺣﻝ اﻟﺗﻣرﻳن‬


#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
const int No_Of_Records =100;
int main(void)
{
struct student
{
int no;
char name[32];
float average;
};
student studentrecord;
int sno;
ifstream inStudentFile("studrf.dat",ios::in);
if(!inStudentFile)
{
cerr << "File could not be opened" << endl;
exit(1);
}
cout <<"\nEnter student no (1 to 100), any number else to end displaying records: ";
cin >> sno;
while (sno >0 && sno<=No_Of_Records)
{
inStudentFile.seekg((sno-1)* sizeof(struct student));
inStudentFile.read(reinterpret_cast <char *>
(&studentrecord),sizeof(struct student));
cout << "\nStudent Data for student no " << studentrecord.no;
cout << "\nName: " << studentrecord.name;
cout << "\nAverage: " << studentrecord.average;
cout <<"\n\nEnter student no (1 to 100), any number else to end displaying records: ";
cin >> sno;
} // end while
inStudentFile.close();
return 0;
}
‫اﻟﻤﻼﺣﻖ‬
‫إعداد بيئة التطوير‬
‫‪Preparing Integrated Development‬‬
‫‪Environment‬‬
‫ﻣﻘدﻣﺔ‪:‬‬
‫عزيزي الطالب‪ ،‬إن أھم ما تحتاجه قبل الدخول في عالم البرمجة ھو‪ :‬برنامج تحرير النصوص‪ :‬لتكتب فيه‬
‫برنامج بلغة الـ ‪ C‬أو الـ ‪ ،C++‬المصنف من أن يح ّول المصدر للغة مزدوجة‪ .‬المكتشف و الذي يحدد لك‬
‫أخطائك التي تقع فيھا أثناء كتابتك للبرنامج‪ .‬يمكننا ‪ -‬عزيزي الطالب – أن نحصل على برنامج "‪ 3‬في واحد"‬
‫يقوم باألعمال الثالثة في آن واحد‪ ،‬و ھذا النوع من البرامج نسميھا الـ ‪ IDE‬أو ما يعرف ببيئات التطوير‪.‬‬

‫عزيزي الطالب‪ ،‬توجد الكثير من بيئات التطوير)‪ (IDEs‬المعتمدة ومنھا برنامج ‪ Code::Blocks‬و برنامج‬
‫‪ Visual C++ Express‬ويعتبران من البرامج المجانية‪ ،‬كما يوجد برامج أخرى مثل ‪Borland C++‬‬
‫وبرنامج ‪ Visual C++‬وأخرى عديدة غير مجانية‪.‬‬

‫في ھذه الوحدة – عزيزي الطالب – سنتطرق إلى شرح كيفية إعداد واستخدام بيئات التطوير التالية‪:‬‬
‫‪) Code::Blocks -‬مجاني ومفتوح المصدر(‬
‫‪ Visual C++ -‬من شركة ميكروسوفت وھو غير مجاني‪ ،‬ولكن الشركة أصدرت نسخة مجانية منه اسمھا‬
‫‪.Visual C++ Express‬‬

‫اﻟﻘﺳم اﻷوﻝ‪ :‬ﺗﺣﻣﻳﻝ وﺗﻧﺻﻳب وﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ ‪Code::Blocks‬‬

‫في ھذا القسم –عزيزي الطالب‪ -‬إن شاء ﷲ سنتطرق لشرح مصور لبرنامج ‪. Code::Blocks‬‬
‫البعض يعتبره البرنامج االكثر سھولة في االستخدام والسالسة‪ ،‬كما أنه يعمل جيدا على وندوز‪ 7‬على عكس‬
‫بعض من البرامج األخرى‪.‬‬
‫برنامج الـ ‪ :Code::Blocks‬ھو ‪ IDE‬مالئم جدا‪ ،‬مجاني و يعمل على الـ‪ ،Windows‬و الـ‪،Mac OS‬‬
‫والـ‪ .Linux‬لغته المتوفرة حاليا ھي االنجليزية‪.‬‬

‫يحتوي ھذا القسم على المواضيع التالية‪:‬‬


‫‪ -‬تحميل ملف التنصيب‪.‬‬
‫‪ -‬شرح عملية تنصيب البرنامج‬
‫‪ -‬شرح واجھة البرنامج‬
‫‪ -‬تشغيل البرنامج من خالل إنشاء مشروع جديد و تطبيق مثال بسيط‬
‫‪ .1‬تحميل ملف التنصيب‪:‬‬
‫يمكنك تحميل ملف تنصيب البرنامج إلى جھازك من خالل النقر على الرابط التالي‪:‬‬
‫‪http://www.codeblocks.org/downloads/binaries‬‬

‫‪ .2‬شرح عملية التنصيب‪:‬‬


‫بعد تحميل ملف التنصيب‪ ،‬انقر عليه لتشغيله‪.‬‬

‫صورة ‪ :1‬الملف الذي قمنا بتحميله‬


‫ھنا أنھى التنصيب ويسألك بأن يقوم بتشغيل البرنامج؟ انقر ‪.NO‬‬

‫تم تنصيب البرنامج بنجاح‪ ،‬نقوم بفتح البرنامج‪.‬‬


‫ستجده في قائمة ابدأ‪.‬‬
‫‪ .3‬شرح واجھة التطبيق‬
‫شرح دالالت االرقام‪:‬‬

‫‪ -1‬شريط األدوات‬

‫‪ -2‬قائمة ملفات المشروع ‪ :‬توجد بيسار النافذة‪ ،‬تحتوى على كل ملفات السورس المتعلقة بالبرنامج الذي‬
‫تعمل عليه‪ .‬و بما أنھا فارغة حسب ما يظھر في الصورة ھذا دليل على عدم وجود مصادر سورس‬
‫في الالئحة حتى ھذه اللحظة‪.‬‬

‫‪ -3‬المنطقة الرئيسية ‪ :‬ھنا المساحة التي تكتب فيھا الكودسورس للغتك الـ ‪.C++‬‬

‫‪ -4‬منطقة البيان‪ :‬و يسميھا المبرمجون منطقة الموت‪ ،‬و ھي المنطقة التي تعرض لك األخطاء التي‬
‫وقعت فيھا أثناء كتابتك للكود سورس‪ ،‬طبعا متسلسلة بانتظام‪.‬‬
‫ما يھمنا اآلن ھو منطقة معينة خاصة من شريط األدوات‬

‫‪1-Compile :‬‬

‫كل الكود سورس الخاصة ببرنامجكم ستبعث لمصنف يقوم بالترجمة ثم يستخرج لنا الـ ‪ Code::Blocks‬ملفا‬
‫قابل للتنفيذ أو باألحرى ملف تنفيذي‪ .‬لكن إن اقترفت خطأ في الكتابة لن يترجم لك المصنف شيئا و ستظھر‬
‫األخطاء في منطقة البيان‪.‬‬

‫‪2- Execute :‬‬

‫تقوم بتشغيل آخر ملف تنفيذي قمت بكتابة الكود السورس الخاص به‪ .‬و ھذا عندما تريد تجريب البرنامج قبل‬
‫االنتھاء منه‪ .‬وستعرف بنفسك أنه قبل التشغيل ‪ Execute‬يجب الترجمة ‪ Compile‬ولكى نجرب ما توصلنا‬
‫إليه نضغط على األيقونة ‪.3‬‬

‫‪3- Compile & Execute:‬‬


‫لن تحتاج عبقرية زائدة لتعرف ماذا يمثل جمع وظيفتي األيقونتين السابقتين‪ ،‬أضف لمعلوماتك ‪-‬عزيزي‬
‫الطالب‪ -‬أنھا األيقونة التي سنكثر من استخدامھا أكثر من باقيھا‪ ،‬و أكرر ثانية بأنه إذا اقترفت خطأ في وضع‬
‫الكود سورس لن يتم ترجمة األكواد و ال تشغيل البرنامج! بل سيكون عليك تصحيح قائمة من األكواد التي‬
‫سبق و أخطأت فيھا‪.‬‬

‫‪4- Recompile everything:‬‬

‫عندما نقوم بالـ"ترجمة" فإن ‪ Code::Blocks‬لن يقوم بتشغيل سوى الملفات التي ّعدلت عليھا أو أضفتھا‪.‬‬
‫أحيانا فقط‪ ،‬تضطر بأن تأمر الـ ‪ Code::Blocks‬بترجمة و تشغيل كل شيء ‪.Recompile everything‬‬

‫اآلن سنتطرق للمرحلة األھم في البرنامج وھي تشغيل البرنامج‪.‬‬

‫‪ .4‬ﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ ‪ :Code blocks‬ﺑداﻳﺔ ﻣﺷروع ﺟدﻳد‬

‫على المستخدم انشاء مشروع جديد خاص به‬


‫الشرح كالتالي‪:‬‬

‫كي تبدأ مشروعا جديدا‪ ،‬توجه نحو ‪ ، : File / New / Project‬ستظھر لك نافذة اختر منھا ‪"Console‬‬
‫"‪application‬‬
‫كما تالحظ‪-‬عزيزي الطالب‪ ،‬برنامج الـ ‪ Code::Blocks‬يسمح بالعمل على أنماط كثيرة من البرامج‬
‫المختلفة‪ ،‬منھا التي تعمل بمكتبات مشھورة كالـ ‪ SDL‬للـ ‪ 2D‬و ألـ ‪ OpenGL‬للـ ‪ 3D‬و الـ ‪Qt‬‬
‫و ‪ wxWidgets‬للـ نوافذ ‪ ..‬إلخ‪ ،‬ھذه المكتبات غير مثبتة على جھازكم بعد‪ ،‬و بھذا ال يمكنكم جعلھا تعمل‪.‬‬

‫سنبدأ أ ّوال بالـ "‪:"Console‬‬

‫أنقر على "‪ "Go‬للشروع في المشروع الجديد‪.‬‬

‫بعدھا سيأتيك اختيار بين لغتي الـ ‪ C‬أو الـ ‪ ،C++‬اختر الـ ‪.C++‬‬
‫سيطلب منك اآلن أن تدخل اسم المشروع‪ ،‬و كذا المسار الذي تختاره كي يحفظ فيه‪.‬‬
‫آخر خطوة تطلب منك ھي ‪ ،‬كيف ينبغى أن يترجم البرنامج‪ ،‬يمكنك ترك االختيارات على حالھا‪ ،‬لن يكون‬
‫لھذا أي تأثير على ما سنقوم به اآلن‪ ،‬قم بتحديد زر‪"Release" .‬‬

‫إظغط على ‪ ، Finish‬إنتھى ! ‪ .‬ماالذي قمنا به اآلن يا ترى ؟‬


‫لقد قام البرنامج ‪ Code::Blocks‬بفتح مشروع جديد لنا مع احتواءه بعض الكود سورس التي سنحتاجھا‪.‬‬

‫في الخانة الخاصة بالمشاريع على اليسار‪ ،‬إضغط على '‪ '+‬لتوسيعھا قليال‪ ،‬و تظھر قائمة الملفات في‬
‫المشروع‪.‬‬
‫اآلن تم فتح مشروع خاص بك وما عليك اال بكتابة الكود والباقي على البرنامج‪،‬‬
‫سيقوم بفتح ملف تنفيذي يفتح بواسطة ال‪: MsDos‬‬
‫تشغيل مثال بسيط‪:‬‬

‫النتيجة‪:‬‬
‫اﻟﻘﺳم اﻟﺛﺎﻧﻲ‪ :‬ﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ ‪Microsoft Visual C++‬‬

‫ﻳﻣﻛﻧك ﻋزﻳزي اﻟطﺎﻟب ﺗﻧﻔﻳذ ﺑراﻣﺞ ﻟﻐﺔ ﺳﻲ ﺑﻠص ﺑﻠص ﺑﺎﺳﺗﺧدام اﻟﻌدﻳد ﻣن اﻟﻣﺗرﺟﻣﺎت ﻣﺛﻝ‪، Borland :‬‬
‫‪ Microsoft Visual Studio 6.0 ،Turbo c++‬ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو ﻧﻣط ‪ 6‬او اﺣدث ﻣن ذﻟك‪.‬‬

‫ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو‪Microsoft Visual Studio‬‬


‫ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو )ﺑﺎﻹﻧﺟﻠﻳزﻳﺔ ‪ : (Microsoft Visual Studio‬ﻫﻲ ﺑﻳﺋﺔ اﻟﺗطوﻳر اﻟﻣﺗﻛﺎﻣﻠﺔ‬
‫اﻟرﺋﻳﺳﻳﺔ ﻣن ﻣﺎﻳﻛروﺳوﻓت‪ .‬ﺗﺗﻳﺢ ﺑرﻣﺟﺔ واﺟﻬﺔ اﻟﻣﺳﺗﺧدم اﻟرﺳوﻣﻳﺔ واﻟﺑراﻣﺞ اﻟﻧﺻﻳﺔ إﻟﻰ ﺟﺎﻧب وﻳﻧدوز ﻓورم‬
‫وﻣواﻗﻊ وﻳب وﺗطﺑﻳﻘﺎت وﻳب وﺧدﻣﺎت اﻟوﻳب ﻣدﻋوﻣﺔ ب ﻣﺎﻳﻛروﺳوﻓت وﻳﻧدوز ووﻳﻧدوز ﻣوﺑﺎﻳﻝ ٕواطﺎر ﻋﻣﻝ‬
‫دوت ﻧت وﻣﺎﻳﻛروﺳوﻓت ﺳﻳﻠﻔرﻻﻳت‪.‬‬
‫ﻳﺣﺗوى ﻓﻳﺟواﻝ اﺳﺗودﻳو ﻋﻠﻰ ﻣﺣرر أﻛواد ﻳدﻋم ﺗﻘﻧﻳﺔ اﻧﺗﻠﻳﺳﻧس واﻋﺎدة ﻛﺗﺎﺑﺔ اﻟﻛود‪ ,‬وﻳﺣﺗوى أﻳﺿﺎ ﻋﻠﻰ ﻣﺗرﺟم‬
‫ﻳﻛﺷف أﺧطﺎء وﻗت اﻟﺗﺷﻐﻳﻝ وﻣﻔﺳر ﻳﻛﺷف اﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ ﻓﻲ اﻷﻛواد وﻳﺣﺗوى أﻳﺿﺎ ﻋﻠﻰ ﻣﺻﻣم ﻧﻣﺎذج‬
‫ﻟﺑﻧﺎء واﺟﻬﺔ ﻣﺳﺗﺧدم رﺳوﻣﻳﺔ وﻏﻳرﻫﺎ‪.‬‬
‫ﻳدﻋم ﻓﻳﺟواﻝ اﺳﺗودﻳو اﻟﻌدﻳد ﻣن ﻟﻐﺎت اﻟﺑرﻣﺟﺔ ﻣﺛﻝ ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟواﻝ ﺳﻲ‪ ++‬وﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟواﻝ ﺳﻲ‪#‬‬
‫وﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟواﻝ ﺑﻳﺳك وﺟﺎﻓﺎ ﺳﻛرﻳﺑت واﻟﻌدﻳد أﻳﺿﺎ ﻣن ﻟﻐﺎت اﻟﺗرﻣﻳز ﻣﺛﻝ ‪ html‬و‪ xml‬و ‪xhtml‬‬
‫و‪. xsl‬‬

‫ﻣﺣرر اﻷﻛواد‬
‫ﻣﺛﻝ ﺑﺎﻗﻰ ﺑﻳﺋﺎت اﻟﺗطوﻳر ﻳﺣﺗوى اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو ﻋﻠﻰ ﻣﺣرر أﻛواد ﻳدﻋم ﺗﻌﻠﻳم اﻟﺻﻳﻐﺔ واﻻﻛﻣﺎﻝ اﻟﺗﻠﻘﺎﺋﻰ‬
‫وﻳﺳﺗﺧدم أﻳﺿﺎ ﺗﻘﻧﻳﺔ اﻧﺗﻠﻳﺳﻧس ﻟﺗﺳﺎﻋد اﻟﻣﺑرﻣﺞ ﻓﻲ ﻛﺗﺎﺑﺔ اﻟﻣﺗﻐﻳرات واﻟدواﻝ واﻟوﺳﺎﺋﻝ واﻟدورات ﺑﺳرﻋﺔ‪ ،‬وﻳدﻋﻣﻬﺎ‬
‫اﻟﻣﺣرر ﻓﻲ ﻛﺗﺎﺑﺔ ﺟﻣﻳﻊ ﻟﻐﺎت اﻟﺑرﻣﺟﺔ واﻟﺗرﻣﻳز اﻟﺗﻲ ﻳﺣﺗوى ﻋﻠﻳﻬﺎ اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو‪.‬‬
‫ﻳدﻋم ﻣﺣرر أﻛواد ﻓﻳﺟواﻝ اﺳﺗودﻳو أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ وﺿﻊ ﻋﻼﻣﺎت ﻣرﺟﻌﻳﺔ ﻓﻲ اﻟﻛود ﻟﻠﻣﺳﺎﻋدة ﻓﻲ اﻟﺗﺻﻔﺢ اﻟﺳرﻳﻊ‪،‬‬
‫ﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ ‪ collapsing and expanding‬ﻣﺟﻣوﻋﺎت اﻷﻛواد واﻟﺑﺣث واﻻﺳﺗﺑداﻝ ﻓﻲ اﻟﻛود‪ ,‬وﻳدﻋم‬
‫أﻳﺿﺎ ‪ code snippets‬وﻫﻰ ﻗواﻟب ﺟﺎﻫزة ﻣن اﻟﻛود ﻳﻛﻣن ادراﺟﻬﺎ وادﺧﺎﻝ ﺗﻐﻳﻳرات ﻋﻠﻳﻬﺎ داﺧﻝ اﻟﻣﺷروﻋﺎت‬
‫اﻟﺟﺎرى اﻟﻌﻣﻝ ﻋﻠﻳﻬﺎ وﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ اﻋﺎدة ﻛﺗﺎﺑﺔ اﻟﻛود‪.‬‬
‫ﻳﻘوم ﻣﺣرر اﻷﻛواد أﻳﺿﺎ ﺑوﺿﻊ ﺧطوط ﺣﻣراء أﺳﻔﻝ اﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﺧطوط ﺧﺿراء أﺳﻔﻝ اﻻﻧذرات‪.‬‬
‫ﻣﺗﻌﻘب اﻷﺧطﺎء‬
‫ﻳﺣﺗوى ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻋﻠﻰ ﻣﺗﻌﻘب أﺧطﺎء ﺗدﻋﻣﻪ ﺟﻣﻳﻊ اﻟﻠﻐﺎت اﻟﻣدﻋوﻣﺔ ﻳﻛﺷف أﺧطﺎء وﻗت اﻟﺗﺷﻐﻳﻝ‬
‫واﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﻳﺳﻣﺢ ﺑوﺿﻊ ﻧﻘﺎط ﺗوﻗف ﻋﻧد ﺳطور اﻟﻛود واﻟﺗﻲ ﻳﺗوﻗف اﻟﺑرﻧﺎﻣﺞ ﻋن اﻟﻌﻣﻝ ﻋﻧدﻣﺎ‬
‫ﻳﺻﻝ ﻟﻬذا اﻟﺳطر‪.‬‬
‫ﻳوﺟد أﻳﺿﺎ ﻓﻲ ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻧﺎﻓذة ‪ immediate window‬واﻟﺗﻲ ﺗﺳﻣﺢ ﺑﺗﺟرﻳب اﻟدواﻝ أﺛﻧﺎء ﻛﺗﺎﺑﺗﻬﺎ‪.‬‬

‫ﻣﺎﻫﻲ اﻟﻣراﺣﻝ اﻟﺗﻲ ﻳﻣر ﺑﻬﺎ اﻟﺑرﻧﺎﻣﺞ ﺑﻠﻐﺔ ‪ ++C‬ﻗﺑﻝ ﺗﻧﻔﻳذﻩ؟‬


‫ﻳﻣر اﻟﺑرﻧﺎﻣﺞ ﺑﻠﻐﺔ ﺳﻲ ‪ ++‬ﺑﺳت ﻣراﺣﻝ ﻗﺑﻝ ﺗﻧﻔﻳذﻩ وﻫﻲ‪:‬‬
‫‪ .1‬ﻛﺗﺎﺑﺔ اﻟﺑرﻧﺎﻣﺞ‪Edit .‬‬
‫‪ .2‬ﻣرﺣﻠﺔ ﻣﺎ ﻗﺑﻝ اﻟﺗرﺟﻣﺔ او اﻟﻣﻌﺎﻟﺟﺔ ‪Preprocess‬‬
‫‪ .3‬اﻟﺗرﺟﻣﺔ ‪Compile‬‬
‫‪ .4‬اﻟرﺑط ‪Link‬‬
‫‪ .5‬اﻟﺗﺣﻣﻳﻝ ‪Load‬‬
‫‪ .6‬اﻟﺗﻧﻔﻳذ ‪Execute‬‬

‫في ھذا القسم – عزيزي الطالب – سوف نشرح كيفية كتابة أول برنامج لك بلغة الـ ‪ C++‬وباستخدام ‪Microsoft ‬‬
‫‪ Visual C++‬وھي بيئة تطويرية أخرى يمكن أن تتعامل معھا من أجل التمكن من االنتقال إلى برمجة تطبيقات ويندوز‬
‫باستخدامھا‪.‬‬

‫‪ -‬من أجل البدء بأي مشروع قم بالخطوات التالية‪:‬‬

‫‪ -1‬اختر ‪ New‬من القائمة ‪  File‬‬


‫‪ ‬‬

‫‪ -2‬تحصل على النافذة كما في الشكل التالي‪ ،‬من الصفحة ‪ Workspaces‬سيظھر ‪ Blank Workspace‬وھو‬
‫مكان العمل الذي سوف توضع فيه مشاريعك‪  .‬‬

‫‪ -3‬عند خانة ‪ Workspace name‬أدخل اسم ) مثالً اسمك(‪ ،‬يمكنك تغيير مكان التخزين عن طريق الخانة‬
‫‪  .Location‬‬
‫‪ -4‬اآلن ولنقوم بتشكيل أول مشروع يحب علينا اختيار األمر ‪ New‬من القائمة ‪ File‬لتحصل على نفس الشاشة‬
‫التي حصلت عليھا مسبقا ً ولكن الصفحة ‪ Projects‬ھي التي ستظھر أمامك بدالً عن ‪  .Workspaces‬‬
‫‪ -5‬اختر ‪ ،Win32 Console Application‬على يمين النافذة وعند خانة ‪ Project Name‬اكتب اسم‬
‫مشروعك وليكن ‪ ،Prog1‬بشكل افتراضي سوف يقوم الفيجول سي‪ ++‬بإنشاء دليل بنفس اسم المشروع‬
‫ويضع فيه جميع الملفات التي سوف تضيفھا الحقا ً لمشروعك‪  .‬‬

‫‪ -6‬يجب اختيار ‪ Add to current workspace‬ليتم إضافة مشروعك ‪ Prog1‬إلى الـ ‪ Workspace‬الذي‬


‫قمت بإنشائه في الخطوتين ‪  .3-2‬‬
‫‪ -7‬اضغط على زر ‪ OK‬لتحصل على النافذة التالية ‪ ‬‬
‫‪ -8‬تأكد من اختيار ‪ An empty Project‬ومن ثم اضغط على زر ‪  .Finish‬‬
‫‪ -9‬اآلن ولنقوم بكتابة أول برنامج يحب علينا إنشاء ملف جديد باختيار األمر ‪ New‬من القائمة ‪ File‬لتحصل‬
‫على نفس الشاشة التي حصلت عليھا مسبقا ً ولكن الصفحة ‪ Files‬ھي التي ستظھر أمامك بدالً عن‬
‫‪  .Projects‬‬
‫‪ -10‬اختر ‪ C++ Source file‬واكتب اسم ملفك عند خانة ‪ File Name‬وليكن ‪ test‬واضغط زر ‪  .Ok‬‬

‫‪ -11‬الحظ أن في مجلد ‪ Source files‬تم إضافة اسم الملف ‪  .test.cpp‬‬


‫‪ -12‬ابدأ بكتابة البرنامج التالي‪  :‬‬
‫‪#include <iostream.h> ‬‬
‫)(‪void main‬‬
‫{‬
‫‪int x; ‬‬
‫‪cout<<"Please enter a number: "; ‬‬
‫‪cin>>x; ‬‬
‫‪cout<<"The number is: "; ‬‬
‫‪cout<<x<<endl; ‬‬
‫‪} ‬‬
‫يجب االنتباه إلى حالة األحرف الكبيرة والصغيرة ألن لغة الـ ‪ C++‬تفرق بينھما‪ .‬‬

‫‪ -13‬لتنفيذ البرنامج السابق وبناء ملف تنفيذي قابل للتنفيذ بأي وقت قم بالخطوات التالية‪:‬‬
‫من القائمة ‪ Build‬اختر األمر ‪ compile test.cpp‬سوف يتم ترجمة الملف وتحويله من اللغة‬ ‫أ‪-‬‬
‫المقروءة إلى لغة اآللة وذلك بعد فحصه من األخطاء وتصحيحھا‪  .‬‬
‫ب‪ -‬من القائمة ‪ Build‬اختر األمر ‪ Build‬ليتم تشكيل الملف التنفيذي ‪  .test.exe‬‬
‫ت‪ -‬من القائمة ‪ Build‬اختر األمر ‪ Execute test.exe‬لتنفيذه‪  .‬‬
‫ث‪ -‬إذا كان كل شيء صحيح سوف تظھر نافذة مثل نافذة نظام التشغيل دوس في أعالھا اسم الملف‬
‫‪  test.exe‬‬
‫ج‪ -‬ظھرت لك عبارة ‪ Please enter a number‬واآلن ھو في حالة انتظار إدخال العدد ‪  .‬‬
‫ح‪ -‬أدخل العدد واضغط ‪  .Enter‬‬
‫خ‪ -‬سوف تجد العبارة ‪ The number is‬والعدد الذي قمت بإدخاله‪  .‬‬

‫‪ -‬عليك اآلن إكمال كتابة البرنامج التالي ليقوم بإضافة العدد ‪ 2‬إلى العدد المدخل وطباعة الناتج‪  .‬‬
‫استخدم الخطوات ‪ 4‬حتى ‪ 10‬إلضافة مشروع جديد إلى نفس الـ ‪ Workspace‬وليكن اسمه‬
‫‪  .prog2‬‬
‫قم بكتابة البرنامج بعد أن تكمل الفراغات‪:‬‬
‫‪#include <iostream.h> ‬‬
‫‪void main() ‬‬
‫{‬
‫‪const int s=2 ; ‬‬
‫‪int  n , sum ; ‬‬
‫‪cout<<" Enter a number: " ; ‬‬
‫‪cin>>n ; ‬‬
‫‪sum = n + s ; ‬‬
‫;‪cout<<"plus 2= "<<sum<<endl‬‬
‫‪} ‬‬
‫‪ ‬‬

‫انتقل إلى مرحلة تنفيذ البرنامج ) انتبه أنه سيقوم بتنفيذ المشروع الثاني وذلك بضغط زر اليمين‬
‫على ‪ prog2‬وتفعيل ھذا المشروع باختيار ‪ .(Set as Active project‬‬
‫ﺗدرﻳب‪ :‬ﺑﺎﻻﺳﺗﻔﺎدة ﻣن اﻟﻣﻌﻠوﻣﺎت اﻟﺗﻲ ﻗدﻣت ﻟك ﻓﻲ اﻟﻘﺳﻣﻳن اﻟﺳﺎﺑﻘﻳن‪ ،‬ﺣﺎوﻝ – ﻋزﻳزي اﻟدارس– أن ﺗﻧﺷﻲء ﻣﺷروﻋﺎ ﺟدﻳد‬

‫‪ prog3‬ﺿﻣن أﺣد ﺑﻳﺋﺎت اﻟﺗطوﻳر اﻟﺳﺎﺑﻘﺔ ﻟﻳﻘوم ﺑﺣﺳﺎب ﻣﺳﺎﺣﺔ داﺋرة ﺣﺳب اﻟﻧﺻف ﻗطر اﻟﻣدﺧﻝ وطﺑﺎﻋﺔ اﻟﻧﺎﺗﺞ‪.‬‬
‫ﺣﺼﺮﯾﺎً‪ :‬ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ ‪www.stqou.com‬‬
‫ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ ‪ :‬ﺑﺮﻣﺠﺔ ‪1‬‬
‫ﺑﺴﻢ ﺍ‪ ‬ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬

‫‪ sizeof‬ﻟﻤﻌﺮﻓﺔ ﺳﻌﺔ أي ﻣﺘﻐﯿﺮ‪:‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪int x‬‬
‫;))‪printf ("%d",sizeof (x‬‬
‫;)( ‪getch‬‬
‫}‬

‫أو‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪char x‬‬
‫;))‪printf ("%d",sizeof (x‬‬
‫;)( ‪getch‬‬
‫}‬

‫ﻣﻼﺣﻈﺔ‪ sizeof :‬ﺗﺮﺟﻊ ﻗﯿﻤﺔ ﺻﺤﯿﺤﺔ )ﺳﻌﺔ اﻟﻤﺘﻐﯿﺮ(‬


‫ﻟﺬﻟﻚ ‪ d‬ﻻ ﺗﺘﻐﯿﺮ ﻓﻲ ﻛﻞ اﻟﺤﺎﻻت‬
‫***‬

‫اﻷﺳﻜﻲ ﻛﻮد ‪ASCII‬‬


‫اﻷﻋﺪاد اﻟﺼﺤﯿﺤﺔ اﻟﻤﻜﺎﻓﺌﺔ ﻟﻠﺮﻣﻮز‬
‫‪A = 65‬‬
‫‪Z = 90‬‬
‫‪a = 97‬‬
‫‪z = 122‬‬
‫ﻟﻄﺒﺎﻋﺔ ﺣﺮف ﺑﺎﺳﺘﺨﺪام اﻟﻌﺪد اﻟﺼﺤﯿﺢ اﻟﻤﻜﺎﻓﺊ ﻟﮫ‪:‬‬
‫اﻟﺤﺮف ‪ L‬ﯾﻜﺎﻓﺊ اﻟﻌﺪد ‪ 76‬ﻓﻨﻜﺘﺐ اﻟﻜﻮد اﻟﺘﺎﻟﻲ ﻟﻄﺒﺎﻋﺔ ﺣﺮف‪L‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪int d‬‬
‫;‪d = 76‬‬
‫;)‪printf ("%c",d‬‬
‫;)( ‪getch‬‬
‫}‬
‫ﺣﺼﺮﯾﺎً‪ :‬ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ ‪www.stqou.com‬‬
‫ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ ‪ :‬ﺑﺮﻣﺠﺔ ‪1‬‬

‫أو‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪char d‬‬
‫;‪d = 76‬‬
‫;)‪printf ("%c",d‬‬
‫;)( ‪getch‬‬
‫}‬

‫ﻣﻼﺣﻈﺔ ‪:‬إذا أردﻧﺎ اﻟﺮﻣﺰ ﻧﻌﺘﻤﺪ ‪ c‬وإذا أردﻧﺎ اﻟﻌﺪد اﻟﺼﺤﯿﺢ ﻧﻌﺘﻤﺪ ‪d‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪char d‬‬
‫;'‪d = 'L‬‬
‫;)‪printf ("%c %d",d,d‬‬
‫;)( ‪getch‬‬
‫}‬

‫اﻟﻨﺘﺎﺋﺞ‪L 76 :‬‬

‫اﻟﻔﺮق ﺑﯿﻦ اﻷﺣﺮف اﻟﻜﺒﯿﺮة واﻟﺼﻐﯿﺮة = ‪32‬‬


‫* ﻟﻠﺘﺤﻮﯾﻞ ﻣﻦ ﻛﺒﯿﺮ إﻟ ﻰ ﺻ ﻐﯿﺮ ﻧ ﻀﯿﻒ ‪ 32‬وﯾﻮﺟ ﺪ اﻗﺘ ﺮان ﺟ ﺎھﺰ ﯾﻘ ﻮم ﺑﺎﻟﺘﺤﻮﯾ ﻞ ھ ﻮ ‪، toupper‬‬
‫وﻟﻠﺘﺤﻮﯾﻞ ﻣﻦ ﺻﻐﯿﺮ إﻟﻰ ﻛﺒﯿﺮ ﻧﻄﺮح ‪ 32‬واﻗﺘﺮان ‪ tolower‬ﯾﻘﻮم ﺑﮭﺬه اﻟﻤﮭﻤﺔ‪.‬‬

‫‪A = a - 32‬‬
‫‪a = A + 32‬‬

‫وھﻜﺬا ﺑﻘﯿﺔ اﻟﺤﺮوف‪...‬‬

‫اﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎً ﺑﺎﺳﺘﺨﺪام ﺟﻤﻠﺔ اﻟﺪوران ﻟﻄﺒﺎﻋﺔ اﻷﻋ ﺪاد اﻟ ﺼﺤﯿﺤﺔ ﻣ ﻦ ‪ 122 - 65‬وﻣ ﺎ ﯾﻜﺎﻓﺆھ ﺎ ﻣ ﻦ‬
‫اﻟﺮﻣﻮز )اﻷﺳﻜﻲ ﻛﻮد(‪.‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫)‪for (int x=65;x<=122;x++‬‬
‫;)‪printf ("%d %c \n" ,x,x‬‬
‫;)( ‪getch‬‬
‫}‬
‫ﺣﺼﺮﯾﺎً‪ :‬ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ ‪www.stqou.com‬‬
‫ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ ‪ :‬ﺑﺮﻣﺠﺔ ‪1‬‬

‫ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺔ اﻟﺮﻣﻮز ﻣﻦ ‪ 90-65‬وﻣﻦ ‪122-97‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫)‪for (int x=65;x<=90;x++‬‬
‫;)‪printf ("%d %c \n" ,x,x‬‬
‫)‪for (int x=97;x<=122;x++‬‬
‫;)‪printf ("%d %c \n" ,x,x‬‬
‫;)( ‪getch‬‬
‫}‬

‫اﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎً ﯾﻘﻮم ﺑﻘﺮاءة أﺣﺮف ﻛﺒﯿﺮة وﻃﺒﺎﻋﺔ اﻷﺣﺮف اﻟﺼﻐﯿﺮة اﻟﻤﻘﺎﺑﻠﺔ ﻟﮭﺎ‪.‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬
‫)‪void main (void‬‬
‫{‬
‫;‪char X‬‬
‫;)"‪printf ("Enter the uppercase letter: \n‬‬
‫;)‪L: scanf ("%c",&X‬‬
‫;)‪printf ("%c\n",X+32‬‬
‫;‪goto L‬‬
‫;)( ‪getch‬‬
‫}‬

‫وﺑﺈﻣﻜﺎﻧﻨﺎ ﺗﻌﺮﯾﻒ ‪ x‬ﺻﻐﯿﺮة ﺑﺤﺴﺐ اﻟﻤﻌﺎدﻟﺔ ‪ x=X+32‬وﻃﺒﺎﻋﺔ ‪x‬‬


‫ﺳﯿﺘﻢ اﻹﺿﺎﻓﺔ ﻟﻠﻤﻠﻒ وﺗﺠﺪﯾﺪ رﻓﻌﮫ ﺑﺈذن اﷲ ﺗﻌﺎﻟﻰ‬

‫ﻣﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ‬


‫‪www.stqou.com‬‬
‫ ‪ – ١‬ا
ة ا و

‫ ا
‪ +#, :‬او ا ب )(‪ # $% &' (#‬ا"ا! وا  ا    ل اآ   ا  ت او ات‬
‫' ‪  ( 6‬اآ   ا ‪ 45‬ا ‪  3‬ا& ‪  2/#‬ه‪ 01‬ا  ا ‪/‬زه‬
‫ا
ت او ا
ت‪   / 7"% :‬ا>‪ =:‬ا& ‪(%‬د  ل ‪   /‬ا; ات ا& ‪ 4:%‬ﺡ‪ 8‬و‪ /‬‬
‫ ا‪ E‬ت ا& ‪ D $3#‬ا ‪/‬زه وان آ‪ C‬آ ‪ 8‬ﺡ ‪ #‬ان ‪  ;%‬ا‪A‬ء ‪ 1 ?%‬ا" !‬
‫ا ﺹف‪ E: (E% :‬ت ﺡ ‪(>3% H‬م ‪F‬ء ات ا& ‪ %‬ي  ; ات ودوال   وه ‪ J‬ا‪ 2+‬ا‪1‬ي ‬
‫ا‪ D $3% 8‬ا>اج ا‪L‬ء وآت ‪F%‬ك '& ا‪?:‬ت وا‪ 3‬آ ت‬

‫ات ا
 ا
‪:‬‬
‫‪ .١‬ا ‪ P‬ا‪ .٢ ( /‬ا >(ام ا‪(E‬د ‪ .٣‬ا‪ D,+‬ا"‪  /‬ا ‪ (E% .٤‬ا  )(‪(#‬ا '& ا?  و'& ء ا"ا!‬
‫* ‪(6%‬ف ا"‪ /‬ا   ا اﺽ'  ات ا‪ P :% ( P E‬ا  ن ا  ا‪1‬ي ‪   / (#(% 2$#‬ا‪ E‬ت ‬
‫ا  ن و‪ 6?#E%‬وه& ا& ‪ (3%‬ا‪(>3‬م  ‪86 1 ?%‬‬
‫ا
&‪%‬ت ‪ $‬ا
ن ه!‪:‬‬
‫‪ .١‬ء ا  ن و‪ (#(%‬ا‪ $E‬ت ا و  ‪ (#(% .٢‬ا‪ P‬ا ‪ 45‬واد‪   E% .٣ 0‬ا"  ت ا>ﺹ  ‪ .٤ 45‬ﺡ‪3‬ب‬
‫ﺹ'& اا‪ .٥ 2%‬ا‪65‬ر ا! ‪ .٦‬ا ‪6‬ء و) د ا  ن‬
‫* ان ا‪6‬م ا& ‪ +#‬م ‪ 6‬آ‪ C‬آ  ن ‪ CF%‬ا>(ت ا& ‪ 6(+#‬ا  ن   ت ا ى‬

‫ا
)(' ا
!‪:‬‬
‫ا
‪+‬ف *‪ :‬ان ‪ 'E  ]":%‬اآ" ‪"$‬ت ا" ! او ام وا"(ء '&   ء  ذج او& " !  ل اآ ‬
‫ ات ا   وی‪ 2%‬ﺕ‪ /0‬ه‪ -.‬ا
&‪% %‬ی!‪:‬‬
‫‪ (#(% .١‬ات '& ا ذج ا و&‬
‫‪ .٢‬وﺹ‪ =: 4‬ات‬
‫‪ .٣‬ر‪ 7‬ات ا>? ‪6LE D‬‬
‫‪ D /% .٤‬ات ا>?‬

‫ااع ا
&‪34‬ت ‪ 2‬ا
ت‪:‬‬
‫‪E# ^ .١‬ف ‪  2/# J :knows‬ا(ارس ان ‪E#‬ف ا‪+‬ر ا‪1‬ي  (ر‪ 8‬وان ‪ #‬ن ‪+‬ر ‪  ^  E‬ا(ار ‬
‫ا‪(  #1‬ر ‪8‬‬
‫‪ HAS ^ .٢‬ا& ‪ 4:%‬ﺡ‪ + +‬ان آ ‪   E‬ن  أ)اء أى ﺡ ‪ H‬أن آ‪) C‬ء ‪ CJ#‬آ ‪ CJ a‬ان )‪6‬ز‬
‫ا ب ‪ #‬ن  ﺵﺵ و ﺡ ا?‪ ] %‬و'‪d‬رة‪.‬‬
‫‪ # ^ .٣‬ن ‪ IS‬ا& ‪ 4:%‬ﺡ‪ + +‬أن آ ‪ #  E‬ن ‪F#  =: 8‬ك ‪ D 6‬أﺹف أى ﺡ ‪ P# H‬وﺹ‪4‬‬
‫ا>‪ =:‬ا‪  E‬ل ﺹ‪ 4‬ر ‪ CJ f‬ان ا‪ 3‬رات وا(را)ت وا‪$+‬رات ‪F =: 6‬آ ‪ CJ‬ا‪3‬‬
‫وا زن ﺡ ‪ &' 6 E% # H‬ﺹ‪ 4‬ر ‪ 3# f‬ا‪.E‬‬

‫* ?‪ 6‬م ا را‪  % A‬ا>(ام آت '‪ + g‬و‪  6#(E%‬ﺽ'  ‪"$ D 2#  6‬ت ا! )(‪(#‬ة‬
‫* ; ء اذج ا ﺡ(ة ا‪ ; (E% uml: unified modeling language 03‬ﺵ"‪ &'   ^ 8‬ء اذج ا>ﺹ ‪# $‬‬
‫ا"ا! وا  ا  ‬

‫ا' ا
)‪ 6%‬ا
!‪:‬‬
‫‪ .١‬ء ا‪ E‬ت ‪ .٢‬ا ر ; ا"‪ /‬ا  ‬

‫ا
‪8‬ق ‪ 2‬ا
)(' ا
! وا
)‪ 6%‬ا
!‬
‫ا
)(' ا
!‪ :‬ه ا ‪ C‬ا‪1‬ي ‪ (3#‬ا ا ت ا"‪ /‬ا   و‪(>3#‬م ا  ن ا  ‪ C‬ام‬
‫ا
)‪ 6%‬ا
!‪ :‬ه ا‪ P :‬ا‪1‬ي ‪ (3#‬ا ا ت ا"‪ /‬ا   و‪(>3#‬م ا  ن ا ‪ P :‬ام‬
‫'& ا‪ P :‬ا  & ‪ P#‬ا‪A‬ءه ‪ C‬ا ت واذج ا>ﺹ " ! ا  & واآل واﺽ' ‪ hE‬ا‪ E‬ت ﺹف‬
‫ ل اآ   آ ?  ‪ C‬ا ﺵ ء و ‪ f‬اآ   ‪ (#(%‬ه‪ 01‬ا ﺵ ء‬
‫  '& ا ‪ C‬ا  & 'ن ا‪(6‬ف ‪ :8‬ارﺝ‪ :‬ول ا
‪/0%‬‬

‫ا
‪8‬ة ‪ 2‬ا@)‪0‬ام
>  آ
)‪ .8‬ا
)‪ 6%‬ا
!‪:‬‬
‫ادة ا>(ام ‪ hE‬ا ﺹف وا را‪ A‬وا?ء ا‪ E‬ت و‪ i‬ه  ا ات ا‪( /‬ة ‪ # $‬ا"ا! ا  ‬
‫ﺥ‪ /‬ا
ا‪ A‬ا
 ا
ة‪:‬‬
‫‪ .١‬ان ‪ #‬ن ا" ! ﺹ ً  ‪ +# H‬م داء ا ‪ ? 5‬ا(دة '& ﺡ ا ‪ C‬وا‪  P :‬دون ا‪$‬ء‬
‫‪ .٢‬ان ‪ #‬ن  ‪ :ً E' /‬اذا ^م داء ا ‪ ? 5‬ا‪   $‬ل ا ;ل ا ‪ CJ‬م ا ب و ‪ 8%‬وآ‪ k1‬‬
‫ﺡ ‪ H‬ا^‪ C‬و^‪g‬‬
‫‪ .٣‬ان ‪ #‬ن ا" ! ^ دة ا >(ام‪ :‬اذا &   ت ‪ #‬ا ?دة ‪ &' 6‬ء ا! اى‬
‫‪ .٤‬ان ‪ #‬ن ا" !   و^  ‪ D 4‬اوف وا" ‪l‬ت ا&  ‪6 CE‬‬
‫‪ .٥‬ان ‪ %‬ن ‪ ?%‬ﺹ  ‪L?> 8‬‬

‫ا
‪ /0‬ا @@ ‪>
!C‬ت ا
 ا
‪:‬‬
‫‪ .١‬ﺹ  ا?ء ا‪ E‬ت‪ :‬ان ‪ %‬ي ه‪ 01‬ا;  ‪%‬آ ‪ =: 4#E%  #  E 2‬ا ووﺽ‪ 8E‬‬
‫; ات ودوال   '& ن واﺡ( '& ا" !  ‪ % H‬ات ا ى  ا ﺹ ل ا ه‪ 01‬ا>‪=:‬‬
‫‪ .٢‬ﺹ  ا را‪ :A‬ان ‪ %‬ي ه‪ 01‬ا;  ‪%‬آ ‪  #  E 2‬ادة ا>(ام آت '‪ + g‬و‪ 6#(E%‬وا ﺽ'‬
‫ ‪"$ D 2#  6‬ت ا" ! ا‪ (#(/‬وه& ‪ # ^E $"%‬ن‬
‫‪ .٣‬ان و) د ا  ء ا! '   ه&  ا>‪ =:‬ا‪ ; &' 6‬ا"‪/‬‬

‫ا
‪ DD‬ا
‪ :DD‬ه& ا"‪ /‬ا& ‪(>3%‬م ا  ن ا "ء ا"ا! ﺡ ‪ CE% H‬ا  ت ‪ m + 6EL D‬اه(اف‬
‫ا"‪/‬‬
‫ﺥﺹ اﺥ‪8‬ء ا
‪&%‬ت‪   :‬وﺽ‪ ^ D‬د  ا ﺹ ل ا ا‪ E‬ت ا   ‪ 2‬وا‪:‬ﺡ ت ا(دة‬
‫ﺥﺹ ا
را‪ :F‬ا>(ام ا‪3‬ت وا] ?‪ 63‬ا ) دة (ى آ  ن  ا‪ $‬آ  ن ا ﺡ ‪ # H‬ان ‪#‬ث آ  ن  ‪hE‬‬
‫‪ 8%‬و‪  8::‬آ  ن ا‬

‫ا
ة ا
‪G‬‬
‫‪D+8‬م ا
)آ‪ :HDD‬ه ا ب ‪ P‬ﺡ?ظ ‪ E‬ت ا‪ :‬ﺡ( ا ﺵ ء وه ‪   /‬ا‪ +‬ل ا‪ E  +E‬‬
‫‪ 6E/#‬ا‪% P‬آ ‪( 2‬د‬
‫ان
' ﺹ‪ I‬ار& ‪)K‬یت
ﺹل ا
‪J‬ل ا
‪ I‬ه!‪:‬‬
‫‪ .١‬ا(د ا>ص ‪  i :private‬ح ا‪ D CE‬ه‪ 01‬ا; ات ا  وا(وال ا  ا " ا‪L‬ء ا‪ 4:‬ا ‬
‫‪ 8‬ا‪( 'E‬ا‪8‬‬
‫‪ .٢‬ا(د ا‪E‬م ‪ :public‬ح ا‪ D CE‬ه‪ 01‬ا; ات ا  وا(وال ا  " ) ‪ D‬ا ﺹف ا ى‬
‫‪ .٣‬ا(د ا‪  i :friend m#(:‬ح ا‪ D CE‬ه‪ 01‬ا; ات ا  وا(وال ا  ا " ا‪L‬ء ا‪ 4:‬ا ‬
‫‪ 8‬او ا‪L‬ء ا‪ 4:‬ا‪ 4: m#(:‬ا  ‪8‬‬
‫‪ .٤‬ا(د ا& ‪  i :protected‬ح ا‪ D CE‬ه‪ 01‬ا; ات ا  وا(وال ا  ا " ا‪L‬ء ا‪4:‬‬
‫ا  ‪ 8‬و( ‪ %‬ر‪ H#‬ا‪ 4:‬ورا‪'  A‬ن ه‪ 01‬ا; ات ا  وا(وال ا  ‪#‬ح ا‪,  6E CE‬ف‬
‫ا ﺹف ا‪ 6‬‬
‫ﺥ‪ /‬دا
 ا
ء‪:‬‬
‫‪ .١‬ان  ‪ +#‬م ‪ 8‬ا"ء ه ا‪$‬ء ا; ات ^ ‪ P‬ا(ا  " ﺡ‪ P ^ 23‬ا‪ E‬ا‪C‬‬
‫‪ .٢‬ان ا‪ P‬ا(ا ا"ءة ه ا‪ P‬ا‪83? 4:‬‬
‫‪ .٣‬ان ا(ا ا"ءة ‪E%‬ف  ‪  +‬ا)‪ E‬وذ‪ k‬ن ا"ء ‪ ^ D)#‬‬
‫‪ .٤‬ان ا"ء ‪ (  +% (3#‬ا ‪F‬ء آ  ا‪ 4:‬ا‪ $‬ب ‪% 2/# k1‬و‪ E 0(#‬ا‪ C‬ا‪L‬ور‪#‬‬
‫‪O‬ی‪ J‬ا )‪N‬ر ا
‪K‬ي‪ :‬ﺡ ‪("3% H‬ل آ‪ ) C‬ا(ء ‪16‬ا ا ع  ا(وال ‪  /‬ا‪ C/‬ا& ‪ P3) CF%‬ا(ا ‪ (E‬ا)اء‬
‫‪ hE‬ا‪L# E‬ت ‪$‬ء ا‪ E‬ا‪ C‬ا‪ P +‬ا‪ :‬‬
‫ا
ء‪ :‬ه دا   ‪ 1% 4:‬ا‪ P‬ا‪ 83? 4:‬ا‪1‬ي ‪ 8 D"#‬و‪( E%‬ون ^  ‪E‬دة و‪ (  +% (3%‬ا ‪F‬ء آ ‬
‫ﺹ?‪   6‬ا
‪+‬ام‪(>3# :‬م ( ا ‪6‬ء ا) ا ا ا‪F‬‬

‫ا
ة ا
‪G
G‬‬
‫‪O‬ق ﺕ‪ 2 %3 'G%‬ا
ت‪ m#,  .١ :‬ا‪' ?:‬ت ‪ m#,  .٢‬ا‪ +‬ا‪ P‬ا‪:‬‬
‫‪O‬ق ‪ P‬ا
‪.‬اآة‪:‬‬
‫• ا‪ +#$‬ا ‪ :  %‬وه& ا‪ +#$‬ا آ‪ J‬ا>(ا ﺡ ‪ /% H‬ا‪1‬اآة  ) ‪ 2‬ا)‪ P‬و‪ / +"%‬زة ا‪A‬ء ا? ‪1‬‬
‫ﺡ وان ‪(>3% P‬م‬
‫• ا‪ +#$‬ا(‪  % :  #‬ا>(ام ا‪1‬اآة ‪ CF‬ا'‪ CL‬ﺡ ‪ /% H‬ا‪1‬اآة ا‪A‬ء ‪ 1 ?%‬ا" ! و ‪L f‬ورة‬
‫ﺡ‪ /‬ذاآة اآ"  ج وآ‪ #% D $3 k1‬ا‪1‬اآة ( ا ‪6‬ء ا) ‪ 6‬ا‪A‬ء ‪ 1 ?%‬ا" ! و‪   P%‬ا‪/‬‬
‫ ل ا>(ام دا ‪ new‬و  ار  ل دا ‪delete‬‬
‫ﺑﺴﻢ ﺍ‪ ‬ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬
‫ﻃﺒﺎﻋﺔ ﳏﺘﻮﻳﺎﺕ ﻣﺼﻔﻮﻓﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻻﺳﺘﺪﻋﺎء ﺍﻟﺬﺍﺗﻲ‬

‫‪ 3‬ﺘﻤﺭﻴﺭ ﻤﻌﺎﻤﻼﺕ‪ ،‬ﻭﻋﺩﻡ ﺇﺭﺠﺎﻉ ﻗﻴﻤﺔ‪:‬‬


‫)ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺼﻔﻭﻓﺔ ﻓﻲ ﺍﻟـ ‪ ، main‬ﻭﻁﺒﺎﻋﺘﻬﺎ ﻓﻲ ﺍﻟﺩﺍﻟﺔ ﺍﻟﻔﺭﻋﻴﺔ(‪.‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬

‫;)‪void a(int b[],int i‬‬

‫)( ‪void main‬‬


‫{‬
‫;‪int x=0‬‬
‫;}‪int m[10] = {3,2,1,6,5,4,9,8,7,0‬‬
‫;)‪a(m,x‬‬

‫;)( ‪getch‬‬
‫}‬

‫)‪void a(int b[],int i‬‬


‫{‬
‫)‪if (i<10‬‬
‫;)]‪printf ("%d\n" , b[i‬‬
‫;)‪a(b,i+1‬‬

‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬
:‫ ﻭﺇﺭﺠﺎﻉ ﻗﻴﻤﺔ‬،‫ ﺘﻤﺭﻴﺭ ﻤﻌﺎﻤﻼﺕ‬3
.(main ‫)ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺼﻔﻭﻓﺔ ﻭﻁﺒﺎﻋﺘﻬﺎ ﺃﻴﻀﺎﹰ ﻓﻲ ﺍﻟـ‬

#include <stdio.h>
#include <conio.h>

int a(int b[],int i);

void main ()
{
int x=9;
int m[10] = {3,2,1,6,5,4,9,8,7,0};
printf ("%d\n" , a(m,x));

getch ();
}

int a(int b[],int i)


{
if (i>0)
printf ("%d\n" , a(b,i-1));

return b[i];
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3
‫ﺑﺴﻢ ﺍ‪ ‬ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬

‫ﺣﻠﻮﻝ ﻭﺍﺟﺒﺎﺕ ﻣﺎﺩﺓ ﺑﺮﳎﺔ ‪1‬‬

‫ﺍﻜﺘﺏ ﺒﺭﻨﺎﻤﺠﺎﹰ ﺒـ )ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻻﺴﺘﺩﻋﺎﺀ ﺍﻟﺫﺍﺘﻲ( ﻴﻘﻭﻡ ﺒﻁﺒﺎﻋﺔ ﻤﺤﺘﻭﻴﺎﺕ ﻤﺼﻔﻭﻓﺔ ﻁﻭﻟﻬﺎ ‪10‬‬

‫>‪#include <stdio.h‬‬
‫>‪#include <conio.h‬‬

‫;)‪void a(int b[],int i‬‬

‫)( ‪void main‬‬


‫{‬
‫;‪int x=0‬‬
‫;}‪int m[10] = {3,2,1,6,5,4,9,8,7,0‬‬
‫;)‪a(m,x‬‬

‫;)( ‪getch‬‬
‫}‬

‫)‪void a(int b[],int i‬‬


‫{‬
‫)‪if (i<10‬‬
‫;)]‪printf ("%d\n" , b[i‬‬
‫;)‪a(b,i+1‬‬

‫}‬

‫‪ 3‬ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‪:‬‬
‫ ﺍﻜﺘﺏ ﺒﺭﻨﺎﻤﺠﺎﹰ ﺒـ )ﺠﻤل ﺍﻟﺸﺭﻁ ﺍﻟﻤﺨﺘﺼﺭﺓ( ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﻤﺎﻜﺭﻭ ﻟﺤﺴﺎﺏ ﺍﻟﺭﻗﻡ ﺍﻷﻜﺒـﺭ ﺒـﻴﻥ‬3
:‫ ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﺍﻟﻁﺒﺎﻋﺔ ﻓﻘﻁ‬،‫ﺜﻼﺜﺔ ﺃﺭﻗﺎﻡ‬
n1 = 2 , n2 = 3 , n3 = 5

#include <stdio.h>
#include <conio.h>
#define max(x,y,z)((x>y)?((x>z)?x:z):(y>z)?y:z)
void main (void)
{
int n1=2,n2=3,n3=5;
printf ("The max number = %d",max(n1,n2,n3));

getch ();
}

:‫ﺃﻭ‬

#include <stdio.h>
#include <conio.h>
#define max(x,y,z)((x>y)?((x>z)?x:z):(y>z)?y:z)
void main (void)
{

printf ("The max number = %d",max(2,3,5));

getch ();
}

:‫ ﻴﻜﻭﻥ ﺍﻟﺒﺭﻨﺎﻤﺞ ﻜﺎﻟﺘﺎﻟﻲ‬،‫ﻭﺇﺫﺍ ﺃﺭﺩﻨﺎ ﺇﺩﺨﺎل ﺍﻷﺭﻗﺎﻡ ﻤﻥ ﻟﻭﺤﺔ ﺍﻟﻤﻔﺎﺘﻴﺢ‬

#include <stdio.h>
#include <conio.h>
#define max(x,y,z)((x>y)?((x>z)?x:z):(y>z)?y:z)

void main ()
{
int n1,n2,n3;
printf ("Enter Three numbers:\n");
scanf ("%d", &n1);
scanf ("%d", &n2);
scanf ("%d", &n3);
printf ("The max number = %d",max(n1,n2,n3));

getch ();
}
:‫ ﺍﻜﺘﺏ ﺒﺭﻨﺎﻤﺠﺎﹰ ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺘﺭﻜﻴﺏ ﺒﻴﺎﻨﺎﺕ ﻟﻁﺎﻟﺏ ﺒﻪ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ‬3
.(cin ‫ ﺒﺩﻭﻥ ﻓﺭﺍﻏﺎﺕ )ﺍﺴﺘﺨﺩﻡ‬10 ‫ ﻁﻭﻟﻪ‬،‫ ﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ‬-
.(int ‫ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ )ﻋﺩﺩ ﺼﺤﻴﺢ‬-
.(float ‫ ﻤﻌﺩﻟﻪ )ﻋﺩﺩ ﺤﻘﻴﻘﻲ‬-
.‫ ﺜﻡ ﻗﻡ ﺒﻘﺭﺍﺀﺓ ﺒﻴﺎﻨﺎﺕ ﺍﻟﺘﺭﻜﻴﺏ ﻭﻁﺒﺎﻋﺘﻬﺎ‬،5 ‫ﺜﻡ ﻗﻡ ﺒﺘﻌﺭﻴﻑ ﻤﺼﻔﻭﻓﺔ ﻁﻭﻟﻬﺎ‬

#include <iostream.h>
#include <conio.h>

struct student
{
char stName[10];
int stNum;
float stGrade;
};

void main ()
{
student CS[5];
for (int i=0; i<5; i++)
{
cout << "Enter student name: ";
cin >> CS[i].stName;
cout << "Enter student number: ";
cin >> CS[i].stNum;
cout << "Enter student grade: ";
cin >> CS[i].stGrade;}

for (int i=0; i<5; i++)


cout << CS[i].stName << " : "
<< CS[i].stNum << " : "
<< CS[i].stGrade << endl;

getch ();
}

:‫ ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ‬3

You might also like