Professional Documents
Culture Documents
C
C
•التنظيم الجيد.
•االستخدام المتعدد.
•التوارث.
•المقاطع البرمجية المتكاملة.
تطوير البرامج الكينونية
ففي هذه المرحلة نبدأ بتحديد كيفية انجاز العمليات المختلفة على
الكائنات التي تم تحديدها في المرحلة السابقة ،وتحديد المعلمات
) (Parametersالتي تلزم لتنفيذ هذه العمليات.
التصميم الكينوني /بناء العمليات
لحسابًمساحةًالمستطيلًالذيًيعتبرًصنفاًاساسياًضمنً
مجموعةًاالصنافًالرئيسيةًعندًالتعاملًمعًاالشكالًالهندسيةً،
فانهًيلزمنا:
العرض معرفةًالمعلماتًوهي:
الطول
لغة جافا؟؟؟
لغة C++؟؟
نعم ،يمكن ان تتم عملية تنفيذ التصميم الكينوني بلغة غير كينونية،
وذلك من خالل التعامل مع االصناف وكأنها تراكيب تجريدية.
إال ان ذلك غير محبذ ألننا سنفقد الخصائص والحسنات االساسية
المرتبطة بتطوير البرامج الكينونية وخاصة الفائدة من اعادة استخدام
بعض االصناف والوراثة واخفاء المعلومات وغيرها من الميزات الجيدة
للغات البرمجة الكينونية.
البرمجة الكينونية
ان الهدف من مرحلة البرمجة هو تنفيذ النظم التي تم تحليلها
وتصميمها في مراحل سابقة والوصول الى برامج قابلة للتنفيذ.
انتبه:
كون البرنامج قابالً للتنفيذ ال يعني بالضرورة ان البرنامج جيد ،اذ
يوجد مجموعة من الخصائص الجيدة للبرامج ،وهناك خصائص
اساسية للغات البرمجة الكينونية.
البرمجة الكينونية
تعريف التراكيب
مثال:
;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
تمهيد
الفرق بين التركيب والمصفوفة :
مثال:
;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
التعامل مع حقول مصفوفة التركيب
يعد الفرق الرئيسي بين األصناف والتراكيب هو أن األول ال يعرف فقط حزمة
يعرف الدوال الالزمة لمعالجة هذه
من الحقول مثل التراكيب ولكن أيضا ّ
الحقول.
تعريف الصنف Class
يتألف تعريف الصنف من الكلمة األساسية classيليها اسم الصنف ثم جسم
الصنف بين قوسين حاصرين } { ويجب أن ينهي تعريف الصنف بفاصلة
منقوطة أو عبارة إعالن عن كائنات تنتمي إلى الفئة كما في المثال التالي:
إن مواصفففات الصففنف ال تففىدي إلففى إنشففاء أي كففائن ،بففل سففتقوم فقففط بتحديففد كي فف سففيبدو
الكائن عند إنشاءه.
Class تعريف الصنف
: 1 مثال
، ،يقففال أننففا دفعناهففا ) (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>
• class Box
• {
• public:
• };
• int main( )
• {
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
مثال:
;)stack1.push (100
المثال التالي يوضح تعريف الدالة 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
ألننا نريد أن نخفى البيانات عن العالم الخارجي ال يمكن أن تكون محمية ،بينما نريد
أن تكون األعضاء الدوال عامة حتى تستطيع األجزاء األخرى من البرنامج استدعائها.
األهداف
يوضح المثال التالي كيفية اإلعالن عن صنف يدعى 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وذلك بعد اإلعالن عنها في مقطع تعريف الصنف:
public:
void setValues( int, int );
int area(){ return ( x * y ); }
};
كيف يمكن إعطاء قيمة ابتدائية initial valuesللمتغيرات المنتمية إلى كائن
معين؟
أننا نستطيع إعطاء المتغير MonthRentValالخاص بالكائن p1القيمة
200.0بكتابة الجملة :
;p1.MonthRentVal=200.0
مالحظة :
private •أن المتغير المنتمي MonthRentValمعرف في القسم الخاص
للصنف ،propertyوعليه فإننا ال نستطيع معالجته والتعامل معه في داخل mainإال من
خالل الدوال المنتمية.
• يمكن التعامل معها داخل mainلو كانت المتغيرات المنتمية إلى propertyمعرفة في
الجزء العام publicللصنف .property
البناؤون
•في الصنف stackوالتي تم تعريفها سابقا ،المتغير tosتم تمهيد قيمته عند 0
وذلك باستعمال الدالة ) (.int
• ال يرجع الهدامون قيمة وبالتالي ال نعرف نوعا لهذه القيمة .ويحمل الهدام نفس اسم
الصنف الذي ينتمي إليه مسبوقا بالرمز ~ .والدالة التالية تمثل مثاال على هدام بسيط
)(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();
};
الطريقة الثانية لتعريف الدوال السطرية
:التعريف األول
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
هذه العبارة تخزن الرقم الذي يكتبه المستخدم من لوحة المفاتيح في
متغير يدعي . integer1ويأخذ عامل الحصول )>>( get from
األشياء الموضوعة على يساره ويضعها في المتغير الموجود على
يمينه ،عند تنفيذ هذه العبارة ينتظر البرنامج أن يكتب المستخدم رقما ً من
النوع integerويضغط على مفتاح ، Enterيتم تعيين القيمة التي
أدخلها المستخدم إلى المتغير . integer1
اإلدخال في لغة C++
يمكن استعمال عامل الحصول عدة مرات في نف العبارة:
cin >> integer1>>integer2
متغير
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++
المصفوفات والنصناف
مصفوفات من الكائنات
مصفوفة من الكائنات وبناءات
الصنف
ع ند تعر يف م صفوفة من الكائنات 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
الدهداف
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لقراءة العدد المطلوب من العلمات لكل طالب.
الدهداف
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
}
الدهداف
}
شرح مفصييل لتعريييف عنانصر
الصنف 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);
}
الدهداف
p
{struct Book
;]char author[20
;]char title[20
;int pages
;float price
;}
المؤشرات والتراكيب
مثا ل:
على سبيل المثا ل لحجز موقع لعدد صحيح نستخدم الدالة new
كما يلي:
;int *p
;p=new int
تقوم الجمل ة الول ى بتعري ف pكمتغي ر مؤش ر لقيم ة صحيحة.
وتقوم الجملة الثانية بحجز موقع في الذاكرة لعدد صحيح وتخزن
عنوان هذا الموقع في المتغير المؤشر .p
حجز الذاكرة بطريقة ديناميكية
*p
p
وعند انتهاء الحاجة لهذه المصفوفة نس تطيع تحرير الذاكرة المحجوزة لها
بوساطة الدالة deleteكما يلي:
;delete p
الدهداف
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
:
:
الدهداف
;*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 A=10
;int B=100
;max(A,B)=5
إن نتي جة تنف يذ هذ ه الجم لة هي تخز ين القي مة 5في
المتغير صاحب أكبر قيمة وهو المتغير .B
جامعة القدس المفتوحة
مركز التعليم المفتوح OLC
الدوال الصديقة
مثال:
لتعريف الدالة averageوالتي تجد معدل علمات طالب ما
كدالة صديقة للصنف studentنضع النموذج:
;)friend double average(student s
• 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
النصناف الصديقة
مثال:
ع لى سبيل المثال لنفرض أن لدي نا الصنفين 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; }
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؟
تذكر عزيزي الطالب:
للصنف . 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;
}
العملية >> معرفة كعملية نصديقة
للصنف
لحظ ،عزيزي الدارس ،أن للعملية >> عاملين هما:
#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
الخرج من البرنامج يبدو كالتالي:
) ( main
{
;)test a(12
;) (a.print
;return 0
}
الكلمة المفتاحية This
وللتوضيح فإن العضو الدالي printيقوم أول ل بطباعة x
مباشرة ،ثم يستعمل طريقتين للوصول إلى xباستعمال
المؤشر : this
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
{
cout<< (hour < 10 ? “0” : “ “ ) << hour << “:”
<< (minute < 10 ? “0” : “ “) << minute << “:”
<< (second < 10 ? “0” : “ “ )<< second;
}
المعامل ت الساكنة
نفترض ان نا نر غب في تمر ير احدى المعاملت كمرجع
لزيادة كفاءة البرنامج مع عدم تمكين الدوال في العبث
في قيمة هذا المعامل ،فماذا نفعل؟؟؟؟
الوراثة
ولحل هذ ه المشكلة تزودنا لغة ++ 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;}
};
الصنف المشتق
حيث يحتوي هذا الصنف،house وكمثال على ذلك اسنعرف الن أول صنف مشتق وهو الصنف
مساحةBArea يمثل المتغير.GArea وBArea على متغيرين منتميين جديدين خاصين به هما
. مساحة الحديقةGArea البناء بينما يمثل المتغير
لنعرف الن الدوال المنتمية للصنف المشتق houseولنبدأ بالبناء .لحظ ،عزيزي الدارس ،أن لهذا البناء قيما
تلقائية.
إن كل ما يفعله هذا البناء هو ااستدعاء البناء الخاص بالصنف الاساس وذلك حتى يتم إعطاء قيم ابتدائية للمتغيرات
المعرفة في الصنف الاساس وهي Priceو Monthly_Rentفي مثالنا .لحظ أننا واضعنا العبارة
): property(P,Rent
في نهاية ترويسة البناء حتى تتم عملية ااستدعاء البناء propertyالخاص بالصنف الاساس .وبالطبع ليس من
الضروري واضع هذ ه العبارة على اسطر جديد .بعد ااستدعاء البناء propertyيتم تنفيذ الجمل الموجودة داخل
البناء houseوالتي تقوم بإعطاء المتغيرين BAreaو GAreaقيما ابتدائية .أن هذا شكل آخر لعادة ااستخدام
الدوال عن طريق ااستدعائها في الموقع المنااسب.
الصنف المشتق
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;
};
الصنف المشتق
لظحظ ،عزيزي الدارس ،أ ن هذا الصنف يضم بالاضافة إلى المتغيرين priceو Monthly_Rentالمتغير Areaوالذي يمثل مساظحة الشقة .ولذا فإ ن البناء
الخاص بهذا الصنف يقوم بعد استدعاء البناء الخاص بالصنف الساس بإعطاء هذا المتغير قيمة ابتدائية.
واسنعرف هذا الصنف كصنف. والذي يمثل عمارة متعددة الطوابقMulti_Building واسنعرف الن الصنف
)والذي يمثل مساحة كل شقة لهذا الصنف( بالاضافة إلىArea وذلك حتى نور ث المتغيرflat مشتق من الصنف
.Monthly_Rent وPrice المتغيران
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 في الحقيقة نحن لم نستفد في مثالنا أعل ه من جميع المزايا التي تمنحنا إياها لغة
انواع الوراثة
• الوراثة الخاصة:
• إذا اسبق ااسم الصنف الاساس بالكلمة privateفهذا يعني أن نوع الوراثة
هي وراثة خاصة .وفي هذ ه الحالة تور ث جميع المتغيرات والدوال المعرفة
في القسم المحمي protectedوالعام publicمن الصنف الاساس بحيث
تصبح خاصة في الصنف المشتق )كما لو كانت معرفة في القسم الخاص
من الصنف المشتق(.
• أم ا بالنس بة للمتغيرات والدوال المعرف ة ف ي القس م الخاص م ن الصنف
الاساس فإن الدوال المنتمية للصنف المشتق ل تستطيع معالجتها .ويقال في
هذ ه الحالة أنها غير قابلة للمعالجة inaccessible.وهي عبارة غير دقيقة
تماما إذ يمكن معالجتها في الصنف المشتق لكن بااستخدام الدوال المنتمية
للصنف الاساس فقط والمعرفة )أي الدوال( في القسم العام أو المحمي.
انواع الوراثة
الوراثة المحمية:
أما إذا اسبق ااسم الصنف الاساس بالكلمة protectedفإن الوراثة في هذ ه
الحالة وراثة محمية . protectedوفي هذ ه الحالة فإن المتغيرات والدوال
المعرف ة ف ي القس م المحم ي protectedوالعام publicم ن الصنف
الاساس تصبح محمية في الصنف المشتق )كما لو كانت معرفة في القسم
المحمي من الصنف المشتق(.
أم ا بالنس بة للمتغيرات والدوال المعرف ة ف ي القس م الخاص م ن الصنف
الاساس فإن الدوال المنتمية للصنف المشتق ل تستطيع معالجتها .ويقال في
هذ ه الحالة أنها غير قابلة للمعالجة inaccessible؛ إذ ل يمكن معالجتها
ف ي الص نف المشت ق إل بااس تخدام الدوال المنتمي ة للص نف الاس اس فقط
والمعرفة )أي الدوال( في القسم العام أو المحمي.
جامعة القدس المفتوحة
مركز التعليم المفتوح OLC
القوالب
أما بالنسبة لطريقة ااستدعاء الدالة القالبية فل تختلف عن طريقة ااستدعاء الدالة
العتيادية ،والمثال التالي يواضح كيفية ااستدعاء الدالية القالبية أعل ه للمقارنة بين
رقمين صحيحين.
)(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 هو عامل من عوامل هذا الصنف القالبي كما اسنستخدم عامل آخر لهذا الصنف
.عدد عناصر الشعبة
عند إنشاء كائن من هذا الصنف القالبي يجب تزويد هذ ه العوامل ) 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؛ بحيث تقوم هذ ه العملية بطباعة البيانات المطلوبة لكل نوع من الطلبة.
راجع ،عزيزي الدارس ،الوحدة السابقة لمعرفة كيف تعرف العمليات.
الوحدة الخامسة
الوراثة
Inheritance
AbdulRahman M.Baraka
2012
الوراثة
هي عملية اشتقاق صنف من صنف آخر.
Student
: (. Super ) (Base ) القاعدة صنف
Student
عند تعريف كائن مشتق :
;<<private>> string name يتم امستدعاء البناء الخاص بالصنف المورث
Student
اذا كان لدينا اكثر من بناء في الصنف
.المورث
<<public>> Student(). : في بناء الصنف المشتق
<<public>> Student(int يمكن تحديد البناء المراد تنفيذه في الصنف
x).
<<public>> ~Student().
.المورث
GraduatedStudent
<<public
GraduatedStudent().
<<public>> ~ Inheritance3.cp
GraduatedStudent().
مستوى الوصول )Access
(Modifier
خاص ):(Private
Type of Inheritance
Access Control
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 الصناف والدوال القالبية
.هي المقدرة على تأجيل تحديد نوع البيانات المستخدمة
:الصيغة العامة
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
• هي عملية اشتقاق صنف من صنف آخر.
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
.• اذا كان لدينا عملية في الصنف المورث والصنف المشتق ويحمالن نفس االسم
GraduatedStudent
<<private>> int GradYear:int
<<public>> string getName().
<<public>> void changeYear().
• يتم استدعاء الهدام الخاص بالصنف المشتق أوال بشكل تلقائي ثم يتم استدعاء الهدام
الخاص بالصنف المورث ثانيا وبشكل تلقائي.
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 •
Class Human
{string name;
protected:
int ID;
};
Constructor
3 1 2
Destructor
)AbdulRahman M.Baraka (2017 15
AbdulRahman M.Baraka (2017) 16
.• هي المقدرة على تأجيل تحديد نوع البيانات المستخدمة
int main()
{
cout<<Max(10,50)<<endl;
system ("pause");
return 0;
}
• أنواعه:
• الديناميكي.
الوحدة السادسة
التعامل مع الملفات
AbdulRahman M.Baraka
2012
هيكلية البيانات
. . . . . 14/2/1998 محمد غزة
1/5/2000 رفح علي ملف
محمد حقل
11011101 بايت
بايت
1
تنظيم الملفات
التنظيم التتابعي:
يتم تخزين السجلت بشكل تسلسلي.
للوصول الى السجل رقم ) (nيجب المرور على العدد ) (n-1من
السجلت.
template.cpp
تنظيم الملفات
التنظيم العشوائي:
يتم تخزين السجلت بشكل عشوائي.
عند فتح ملف يتم فتح ) (streamمعه يستقبل البايتات الخاصة بهذا
الملف.
while(cin>>sno>>sname)
{ StudentFile<<sno<<","<<sname<<endl; }
StudentFile.close();} seqFiles1.cpp
Files and Stream
ملحظة هامة:
أما اذا كان موجودا فإنه يقوم بحذفه جميع البيانات الموجودة بدارخله.
أما اذا كان موجودا فإنه يبدأ بإدرخال البيانات الجديدة من نهاية الملف.
أي تتم اضافة البيانات الجديدة في نهاية الملف وتبقى البيانات القديمة كما هي ول تحذف.
>#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) ل تفرض لغة
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 رفح علي ملف
محمد حقل
11011101 بايت
بت
1
)AbdulRahman M.Baraka (2017 2
• التنظيم التتابعي:
. . 14/2/1998 غزة محمد 1
يتم تخزين السجالت بشكل تسلسلي. •
1/5/2000 رفح علي 2
11/12/1997 خانيونس منى 3 • أول سجل يحمل أصغر رقم وهكذا..
• للوصول الى السجل رقم ( (nيجب المرور على العدد n- 1من السجالت.
• عند فتح ملف يتم فتح ) )streamمعه يستقبل البايتات الخاصة بهذا الملف.
• عند فتح ملف يجب تحديد الغرض من فتحه (قراء/كتابة) وال يجوز فتحه للقراءة
والكتابة معا.
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();
oأما اذا كان موجودا فإنه يقوم بحذفه جميع البيانات الموجودة بداخله.
oأما اذا كان موجودا فإنه يبدأ بإدخال البيانات الجديدة من نهاية الملف.
oأي تتم اضافة البيانات الجديدة في نهاية الملف وتبقى البيانات القديمة كما هي وال تحذف.
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();
}
• الدالة (:)seekp
• البحث في الملف:
مثال: •
• اذا علمت أن موقع تخزين بداية ملف ( )1000وأن حجم السجالت التي سوف تخزن
( )100لكل سجل .فاحسب موقع تخزين السجل الثامن.
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
لقد أاشرنا سابقا ،عزيزي الدارس ،إلى أن الدوال المنتمية للصنف هي فقط
التي يحق لها معالجة الجزاء الخانصة للصنف) المعرفة في الجزء
الخاص 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 لتعني إضافة طالب
معين إلى الشعبة والعملية – لتعني اشطب طالب معين من الشعبة.
ان هذه التعريفات الجديدة لـ + و – ما هي إل تعريفات إضافية لهذه العمليات ،أي
عامل واحد ،وتعني عملية جمع نصحيحة وعملية جمع حقيقية وغير
ذلك .ويقوم مترجم ++Cبتحديد التعريف المطلوب من عدد و نوع العوامل.
23
مثال
إن تعريف العمليات ل يختلف كثير عن تعريف الدوال
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
تكون النتيجة عرض الوقت كما يلي
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 لحظ ،عزيزي الدارس ،أن للعملية >> عاملين هما
{ خلل العامل الرسمي 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+
وتقوم هذه العملية بإضافة عنصر جديد للمجموعة ،وذلك بتخزين الرقم 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 في ترويسة
العملية فتصبح العملية كما يلي
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 الفرع
ال نعم ال نعم ال الصحيحة نعم ال نعم نعم ال
-10طرق معينه لربط البرامج لثناء تنفيذها مع أدوات اإلدخال واإلخراج نعني
دreturn- جـ Data dictionary - بstreams - اfile -
1
10 9 8 7 6 5 4 3 2 1 الفرع
ب ب د ج ب ا ب ا ج اإلجابة د
-2اكتب دالة قالبية لتبديل قيم متغيرين بغض النظر عن نوعهما (مثال :إذا أدخلنا قيمة b=6و a=3تصبح b=3و 8( )a=6
عالمة ص236
-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 الفرع
ال نعم نعم نعم ال نعم ال نعم نعم الصحيحه ال
.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
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++عالمات)
انتهت االجابة
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عالمات)
.2وضح الفرق األساسي بين التنظيم التتابعي والتنظيم العشوائي للملفات من حيث كيفية الوصول للبيانات (سجالت الملف) ،ثم
بين كيف يتم بناء الملفات العشوائية؟( 7عالمات)
Employee Student
Manager
انتهت االسئلة
2
ﺍﺳﻢ ﺍﻟﻄﺎﻟﺐ........................... : ﺑﺴﻢ ﷲ ﺍﻟﺮﺣﻤﻦ ﺍﻟﺮﺣﻴﻢ ﺍﺳﻢ ﺍﻟﻤﻘﺮﺭ :ﺑﺮﻣﺠﺔ 1
ﺭﻗﻢ ﺍﻟﻄﺎﻟﺐ........................... : ﺭﻗﻢ ﺍﻟﻤﻘﺮﺭ1291 :
ﺗﺎﺭﻳﺦ ﺍﻻﻣﺘﺤﺎﻥ……./......../......... : ﻣﺪﺓ ﺍﻻﻣﺘﺤﺎﻥ :ﺳﺎﻋﺔ ﻭﻧﺼﻒ
ﺟﺎﻣﻌﺔ ﺍﻟﻘﺪﺱ ﺍﻟﻤﻔﺘﻮﺣﺔ
ﻋﺪﺩ ﺍﻷﺳﺌﻠﺔ :ﺳﺘﺔ
--ﻧﻈﺮﻱ-- ﺍﻻﻣﺘﺤﺎﻥ ﺍﻟﻨﻬﺎﺋﻲ ﻟﻠﻔﺼﻞ ﺍﻷﻭﻝ ""1141
2015/2014
.1ﻋﺒﻰء ﻛﺎﻓﺔ ﺍﻟﻤﻌﻠﻮﻣﺎﺕ ﺍﻟﻤﻄﻠﻮﺑﺔ ﻋﻨﻚ ﻓﻲ ﺩﻓﺘﺮ ﺍﻻﺟﺎﺑﺔ ﻭﻋﻠﻰ ﻭﺭﻗﺔ ﺍﻻﺳﺌﻠﺔ. ﻋﺰﻳﺰﻱ ﺍﻟﻄﺎﻟﺐ:
.2ﺿﻊ ﺭﻗﻢ ﺍﻟﺴﺆﺍﻝ ﻭﺭﻣﻮﺯ ﺍﻻﺟﺎﺑﺔ ﺍﻟﺼﺤﻴﺤﺔ ﻟﻼﺳﺌﻠﺔ ﺍﻟﻤﻮﺿﻮﻋﻴﺔ )ﺍﻥ ﻭﺟﺪﺕ( ﻋﻠﻰ ﺍﻟﺠﺪﻭﻝ ﺍﻟﻤﺨﺼﺺ ﻓﻲ ﺩﻓﺘﺮ ﺍﻻﺟﺎﺑﺔ
.3ﺿﻊ ﺭﻗﻢ ﺍﻟﺴﺆﺍﻝ ﻟﻼﺳﺌﻠﺔ ﺍﻟﻤﻘﺎﻟﻴﺔ ﻭﺍﺟﺐ ﻋﻠﻰ ﺩﻓﺘﺮ ﺍﻻﺟﺎﺑﺔ.
-10ﻁﺮﻕ ﻣﻌﻴﻨﻪ ﻟﺮﺑﻂ ﺍﻟﺒﺮﺍﻣﺞ ﻟﺜﻨﺎء ﺗﻨﻔﻴﺬﻫﺎ ﻣﻊ ﺃﺩﻭﺍﺕ ﺍﻹﺩﺧﺎﻝ ﻭﺍﻹﺧﺮﺍﺝ ﻧﻌﻨﻲ
ﺩreturn- ﺟـ Data dictionary - ﺏstreams - ﺍfile -
1
) 16ﻋﻼﻣﺔ( ﺍﻟﺴﺆﺍﻝ ﺍﻟﺜﺎﻟﺚ:
) 8ﻋﻼﻣﺎﺕ( .1ﻓﺮﻕ ﺑﻴﻦ ﺗﻤﺮﻳﺮ ﺍﻟﻤﻌﺎﻣﻼﺕ ﺑﺎﻟﻘﻴﻤﺔ ﻭﺗﻤﺮﻳﺮﻫﺎ ﺑﺎﻹﺷﺎﺭﺓ.
.2ﺍﻛﺘﺐ ﺩﺍﻟﺔ ﻗﺎﻟﺒﻴﺔ ﻟﺘﺒﺪﻳﻞ ﻗﻴﻢ ﻣﺘﻐﻴﺮﻳﻦ ﺑﻐﺾ ﺍﻟﻨﻈﺮ ﻋﻦ ﻧﻮﻋﻬﻤﺎ )ﻣﺜﻼ :ﺇﺫﺍ ﺃﺩﺧﻠﻨﺎ ﻗﻴﻤﺔ =6ﻭ a=3ﺗﺼﺒﺢ b=3ﻭ 8) . (a=6ﻋﻼﻣﺎﺕ(
ﺍﻧﺘﻬﺖ ﺍﻷﺳﺌﻠﺔ
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
1
(9ﺗﻣرﻳر اﻟﻌواﻣﻝ ﺑﺎﻟﻘﻳم:
(Bاي ﺗﻐﻳﻳر ﻋﻠﻰ اﻟﻘﻳم ﻓﻲ اﻟداﻟﺔ ﻳؤﺛر ﻋﻠﻰ ﻗﻳم اﻟﻌواﻣﻝ (Aاي ﺗﻐﻳﻳر ﻋﻠﻰ اﻟﻘﻳم ﻓﻲ اﻟداﻟﺔ ﻳؤﺛر ﻋﻠﻰ ﻗﻳم اﻟﻌواﻣﻝ
اﻟﺣﻘﻳﻘﻳﺔ ﻓﻲ ﺣﺎﻟﺔ وﺟود ﻗﻳﻣﺔ اﻓﺗراﺿﻳﺔ ﻟﻠﻌواﻣﻝ اﻟﺣﻘﻳﻘﻳﺔ
(Dﺟﻣﻳﻊ ﻣﺎ ذﻛر. (Cاي ﺗﻐﻳﻳر ﻋﻠﻰ اﻟﻘﻳم ﻓﻲ اﻟداﻟﺔ ﻻﻳؤﺛر ﻋﻠﻰ ﻗﻳم اﻟﻌواﻣﻝ
اﻟﺣﻘﻳﻘﻳﺔ.
(10ﻳﻔﺿﻝ اﺳﺗﺧدام اﻟداﻟﺔ اﻟﺻدﻳﻘﺔ:
(Bﺗﺣﻣﻳﻝ اﻟداﻟﺔ اﻛﺛر ﻣن ﺗﻌرﻳف وﺗﺗﺣدد اﻟداﻟﺔ ﻣن (Aاﻟداﻟﺔ ﺗﺣﺗوي ﻋﻠﻰ اﻛﺛر ﻣن ﻣﻌﺎﻣﻝ وﻛﻝ ﻋﺎﻣﻝ ﻳﻧﺗﻣﻲ
ﺧﻼﻝ ﻋدد اﻟﻌواﻣﻝ وﻧوﻋﻬﺎ. اﻟﻰ ﺻﻧف
(Dﻏﻳر ذﻟك. .A+B (C
15عالمة السؤال الرابع :اكتب برامج بلغة C++يقابل الشكل التالي):(Class Diagram
L
B3
B2 o : L
x : Integer
)(printx
D
)(printd
انتھت االسئلة
2
........................... اسم الطالب: بسم ﷲ الرحمن الرحيم م المقرر....... :برمجة ...........1
رقم الطالب........................... : رقم المقرر..............1291..........:
تاريخ االمتحان……/......../......... : مدة االمتحان...... :ساعة ونصف.......
عدد األسئلة ................6........... :
جامعة القدس المفتوحة
اكتب برنامجا ً بلغة c++يحتوي على دالة قالبية باسم AbsoluteValueتعيد القيمة المطلقة للرقم )من أي نوع(؟ افحص البرنامج على
أنواع مختلفة من البيانات.
انتھت األسئلة
اسم الطالب........................... : بسم ﷲ الرحمن الرحيم اسم المقرر :برمجة 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من أجل إجبار المترجم على تحديد ھوية الدالة وقت الترجمة وليس وقت التنفيذ.
1
(14عند التعامل مع الملفات التتابعبة تستخدم الدالة ;) seekg(nمن أجل:
ج( البحث عن الحرف nداخل الملف. أ( وضع مؤشر بداية القراءة عند البايت رقم nمن الملف.
د( ال شيء مما ذكر ب( إرجاع قيمة البايت المخزن في الموقع رقم .n
(15المعامالت ios::out|ios::binaryتستخدم من اجل فتح ملف:
د( تتابعي للكتابة ج( تتابعي للقراءة ب( عشوائي للكتابة أ( عشوائي للقراءة
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
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
}
3
جامعة القدس المفتوحة
كلية التكنولوجيا والعلوم التطبيقية
إعداد وتقديم:
أ .عيسى أسعد /منسق المقرر
فرع رام ال والبيرة
الخميس 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
: فتح الملف
فتح باستخدام البناء
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
الخميس 3/12/2015
مواضيع اللقاء
الفرع 1 2 3 4 5 6 7 8 9 10 11 12
الصحيح ل نع ل ل نع نع نع ل نع نع نع ل
ه م م م م م م م
اختر رمز الجابة الصحيحة وضعه في الجدول
رقم 2في دفتر الجابة.
(1إذا سبق اسم الصنف الساس بالكلمة ,protectedفهذا يعني بأن الوراثة هي وراثة............
د -مجردة. ج -خاصة. ب -عامة . أ -محمية
(4دالة منتمية تستخدم لعادة وضع مؤشر بداية القراءة عند رقم بايت معين في الملف:
دseek- جseekg - بseekp- أBeg-
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.
الصنف الاساس ييرورث الخصائص والعمليات الى الصنف المشتق (C ليس مما ذكر (D
Employee Student
Manager
AbdulRahman M.Baraka
2017
AbdulRahman M.Baraka (2017) 1
اشرح باختصار الخصائص االساسية للغات البرمجة الكينونية
int main(){
employee E1;
E1->eno=100;
E1->ename=”Mohamed”;
E1->esalary=1550;
return 0;
} AbdulRahman M.Baraka (2017) 3
ال تنسى الصيغة العامة للدالة::
أمثلة:
} { )int getNumber ( string name
مالحظة هاااامة: } { )void printName (int Number
البناء والھداء هما الدالتان اللتان ال } { ) (string getName
يكتب في بدايتھما نوع القيمة
} { ) (void printReport
المرجعة
void main()
{ CAT c[30];}
تمرير = في المعامالت.
ادخال أو قراءة = cin
ارجاع = return
طباعة = cout
:الحل
70
70
20
20
: )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
10 9 8 7 6 5 4 3 2 الفرع 1
نعم نعم ال نعم ال نعم ال ال ال ال ج
: )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++
}
}
.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
.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 -
~
1
~ W;l1.J.wa (.p ~i
(~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
مفهوم البرمجة الكينونية
الكينون:
المزايا:
.(Hiding
التوارث ).(Inheritance
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
}
• Object declaration:
o class_name obj1;
o class_name obj2,obj3;
o class class_name{……}obj1,obj2,obj3;
ال يسمح بالتعامل معه إال اعضاء نفس الصنف (.)Class o
ال يسمح بالتعامل معه إال اعضاء نفس الصنف ( .)Classأو اعضاء الصنف o
الصديق معه.
الصنف ال يسمح بالتعامل معه إال اعضاء نفس الصنف ( .)Classأو اعضاء
)AbdulRahman M.Baraka (2017
o 7
دالة منتمية لصنف تحمل نفس اسم الصنف. •
اذا كان هناك معامالت لها فانه ال يجوز انشاء كائن من الصنف إال بتمرير قيمة لهذه •
المعامالت.
اذا تم االستدعاء بمعامالت جديدة يتم اعتمادها واال فانه يتم استخدام القيم االولية. •
}{return x+y+z
الخصائص
class Circle
{ قيم اولية
private:
double radius;
public:
Circle() { radius = 0.0;}
Circle(int r)
{ radius = r;}
هدام
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
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الستاتيكية:
يقوم مترجم اللغة بحجز الذاكرة لجميع المتغيرات عند ترجمة البرنامج.
تبقى الذاكرة محجوزة طوال فترة التنفيذ حتى وان لم تستخدم.
-2الديناميكية:
يتم الحجز وقت تنفيذ البرنامج.
يتم حجز الذاكرة التي نحتاج لها فقط وقت التنفيذ.
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
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
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
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;
void main(){
int x[3];
for (int i = 0; i < 3; i++)
cin >> x[i];
cout << getMax(x,3);
system("pause");
}
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
8
}
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
.يمكن تمرير العوامل بالقيمة مع تغيير القيم الحقيقية للعوامل
مثال:
اذا كانت الدالة ) (Addهي دالة منتمية فإنها تستدعى كالتالي
).(Calc.Add
اذا كانت الدالة ) (Addهي دالة نصديقة فإنها تستدعى كالتالي )).(Add(C
Friends.cpp
الدوال والنصناف الصديقة
& Friend Functions
Classes
الدوال الصديقة يحق لها معالجة النصناف الخانصة بالصنف
).(Private
مثال:
اذا كانت الدالة ) (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( التمرير بالقيم •
.يتم تمرير العوامل بالقيمة الى الدوال وأي تغيير على القيم داخل الدالة ال يغير القيم الحقيقية للعوامل •
{ )(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 •
اذا كانت الدالة 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
;}
إذا كانت الدالة تحتاج ‘لى عاملين أو أكثر .وانتمى كل واحد منهما الى صنف مختلف. .1
إذا أردنا تحميل الدالة أكثر من تعريف من خالل عدد العوامل ونوعهم. .2
• ال يمكن تعريف أكثر من دالة لها نفس المعامالت ونفس القيمة المرجعة.
)(sizeof
.1عدد العوامل.
.2األسبقية (األولوية).
.3رتيب التنفيذ:
oإذا كانت من اليمين الى اليسار فال يجوز تغييرها للعكس.
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
• نستخدم الدوال الثابتة لضمان عدم تعديل هذه الدوال الي قيمة الي متغير منتمي.
Class T1
{
;Private: int x
Public :
;};void print() const {cout <<y
;}
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:
AbdulRahman M.Baraka
2017
AbdulRahman M.Baraka (2017) 1
/* Simple hello world program*/
# include <iostream>
int main()
{
cout << “Hello World!”; //C++ statement
return 0;
}
)if (condition
} ;{statement1
مجموعة من الجمل تنفذ في حال تحقق الشرط. True False
condition
else
};{statement2
مجموعة من الجمل تنفذ في حال عدم تحقق الشرط. S1 S2
S3
Boolean operators
&& and
|| or
! not
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
:• هناك ثالثة أنواع مختلفة لجمل الدوران
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;
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
• يتم تقسيم البرنامج الرئيسي إلى مجموعة من البرامج الفرعية (دوال).
)(void printReport
} { …..
cin>>x>>y;
sum=x+y;
return 0 ;
}
cin>>x>>y;
return 0 ;
}
sum1=sum(x,y)
printSum(sum1);
return 0 ;
AbdulRahman M.Baraka (2017)
} 27
AbdulRahman M.Baraka (2017) 28
• مجموعة من العناصر مشتركة في نوع البيانات.
• إذا تم كتابة عنوان للعنصر أكبر من العناصر المحجوزة فإنه يتم اصدار رسالة خطأ.
;]int x[4
;int i
• /* 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:";
}
2 Qou
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) تستخدم
/* 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];
}
class class_name
{
private:
variable declarations;//class
function declarations;//members
public:
variable declarations;//class
function declarations;//members
} Object_Name;
Access Modifier
رخاص ):(Private
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
خدالة منتمية لصنف تحمل نفس اسمه.
اذا تم الستدعاء بمعاملت جديدة يتم اعتماخدها وال فانه يتم
استخدام القيم الولية.
ترتيب قيم اسناخد المعاملت مهم جدا.
الوحدة الثالثة
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
The
process w aapp
SSw th
continue wwi ith t
nt
frfroon
...s
The
process
continue
...s
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
low
البحث الثنائي
يجب أن تكون المصفوفة مرتبة تصاعديا.
تنبحث عن الرقم .11
Step 2: high
mid
low
البحث الثنائي
يجب أن تكون المصفوفة مرتبة تصاعديا.
تنبحث عن الرقم .11
Step 2: high
mid
low
البحث الثنائي
يجب أن تكون المصفوفة مرتبة تصاعديا.
تنبحث عن الرقم .11
Step 2: high
mid
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
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
}
تنهاية
الوحدة
من أسئلة سنوت سابقة:
>#include<iostream.h
)(void main
{
;int x,y,z,f
;cin>>y
;cin>>z
;cin>>f
;x=y+z+f
;cout<<x<<endl
}
وان . PI=31415926
الحل :
نعرف المتغيرات
#include <iostream.h>
main()
float r, PI;
r = 5.2;
PI = 3.1415926;
cout<<"circumference = "<< 2 * PI * r;
: الحل
#include <iostream.h>
main()
cout<<"perimeter = "<<2*(length+width)<<"\n";
cout<<"area = "<<length*width;
.)avg = (m1+m2+m3+m4)/4(
: الحل
#include <iostream.h>
main()
cin>>m1>>m2>>m3>>m4;
وعنوانك فً وسط، اكتب برنامج لطباعة اسمك فً السطر األول من الجهة الٌسرى:5س
. والجنسٌة فً الجهة الٌمنى،السطر الثالث
: الحل
#include <iostream.h>
main()
. ) وٌطبعهاc= (f-32)*5/9 (
: الحل
#include <iostream.h>
main()
{
float f;
4.5( x 2.3 y ) 2 5 x y
b و a اكتب برنامج الٌجاد: 7س
zw 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;
ثم ٌحسب وٌطبع المسافة، (t)( والزمنa) اكتب برنامج ٌقرأ العجلة الثابتة: 8س
#include <math.h>
main()
{
float a, t;
( إذا كان العدد موجبPositive)( ثم ٌطبع كلمةn)ً اكتب برنامج ٌقرأ عدد حقٌق:9س
: الحل
#include <iostream.h>
main()
float n;
if(n>=0) cout<<"Positive"<<endl;
else cout<<"Negative"<<endl;
main()
int a, b, t;
cout<<"a = "; cin>>a;
if(a>b)
cout<<a<<" "<<b<<endl;
(n%2!=0) اذا كان فرديodd ( ثم ٌطبع كلمةn) اكتب برنامج ٌقرأ عدد صحٌح:11س
: الحل
#include <iostream.h>
main()
int n;
if(n % 2 != 0) cout<<"Odd"<<endl;
else cout<<"Even"<<endl;
main()
{
;int a, b
;if(a>b) cout<<a
;else cout<<b<<endl
}
%3 .bمن الراتب األساسً ،إذا كانت المبٌعات أكثر من ثالثة أضعاف الراتب األساسً
))(comm=0.03*bsalary, if(sales>3*bsalary
%5 .cمن الراتب األساسً ،إذا زادت المبٌعات على خمسة أضعاف الراتب األساسً
))(comm=0.05*bsalary, if(sales>5*bsalary
الحل:
>#include <iostream.h
)(main
{
;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;
. )f = n*(n-1)*(n-2) ...( المضروب ( وٌحسب وٌطبعn) أكتب برنامج ٌقرأ عدد صحٌح: 14س
: الحل
#include <iostream.h>
main()
int n, f=1;
f *= (n-i);
main()
do {
sum += n;
n += 0.5;
} while(n<=10);
.(n) ( لمجموعة من األعداد الصحٌحة عددهاavg) أكتب برنامج لحساب وطباعة المعدل: 16س
#include <iostream.h>
main()
int n, sum = 0, x;
sum += x;
ثم.5 اكتب برنامج لقراءة عناصر مصفوفتٌن ذات أعداد صحٌحة عددها. باستخدام الدوال: 17س
.( مصفوفةOdd)( والفردٌةEven)طباعة العناصر الزوجٌة
#include <iostream.h>
read(int ar[]) {
cout<<"Enter 5 numbers:";
isEven(int x) {
if(x % 2 == 0) return 1;
return 0;
isOdd(int x) {
return (!isEven(x));
printEven(int ar[]) {
cout<<endl;
printOdd(int ar[]) {
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:";
cin>>ar[i];
isPositive(int x) {
isNegative(int x) {
return (!isPositive(x));
printPositive(int ar[]) {
cout<<endl;
printNegative(int ar[]) {
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:";
cin>>ar[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];
}
cout<<msg;
cout<<ar[i]<<" ";
cout<<endl;
main() {
read(a);
read(b);
print("Addition: ",c);
print("Subtraction: ",c);
print("Multiply: ",c);
calc(a, '/', b, c);
print("Diving: ",c);
.) صنف حد أقصى50( اكتب برنامج لحساب كمٌات اصناف مخزن. باستخدام الدوال:21س
( وذلك بادخال اسم الصنفin)إذا علمت انه ٌتم زٌادة كمٌة الصنف باختٌار عملٌة التورٌد
#include<string.h>
struct ITEM {
char name[20];
int qty;
} ar[50];
int cnt=0;
read(ITEM &val) {
cin>>val.name;
cout<<"Enter qty:";
cin>>val.qty;
r = -1;
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') {
else {
ar[cnt] = val;
cnt++;
if(t=='o') {
print() {
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:
;)(void print_book_info
{
;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 main()
Book book[5];
search(book);
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)
if (i<5)
book[i].print_book_info();
reserve_book(&book[i]);
cout<<”-----------------------------------------------------------------------“<<endl;
cout<<”please insert book number to see its info. Please type 0 to exit”<<endl;
char r = ‘ ‘;
if(book->GetStatus())
cin>> r;
if(r==’r’)
return_book (book);
else
cout<<”book is avialable”<<endl;
cin>> r;
if(r==’r’)
book->SetStatus(1);
{
;)book->SetStatus(0
}
Belal janajreh
ﺑﺴﻢ ﺍ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ
>#include <stdio.h
>#include <conio.h
;)( getch
}
#include <stdio.h>
#include <conio.h>
void main ()
{
int f=5,e=4;
sum(f,e);
getch ();
}
9 : ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3
3ﺍﺴﺘﺩﻋﺎﺀ ﺩﺍﻟﺔ ﺩﻭﻥ ﺘﻤﺭﻴﺭ ﻤﻌﺎﻤﻼﺕ ﻭﻤﻊ ﺇﺭﺠﺎﻉ ﻗﻴﻤﺔ ﻟﻠـmain
ﺍﻟﺘﻌﺭﻴﻑ ﺩﺍﺨل ﺍﻟﺩﺍﻟﺔ ﺍﻟﻔﺭﻋﻴﺔ ﻭﺍﻟﻁﺒﺎﻋﺔ ﻓﻲ ﺍﻟـ) mainﻭﺠﻭﺩ ﻜﻠﻤﺔ (return
>#include <stdio.h
>#include <conio.h
;)( getch
}
;return s
}
#include <stdio.h>
#include <conio.h>
void main ()
{
int f=5,e=4;
printf ("%d" , sum(f,e));
getch ();
}
return s;
}
9 : ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3
التراكيب والنصناف
برمجة 1
منطقة طولكرم
التركيب
يتكون من مجموعة من العناصر )البيانات(المختلفة من حيث النوع
بحيث يتم التعامل معها كوحدة واحدة
الحقول(( يمكن تصور التركيب على انه سجل من البيانات
:مثال1
يمكن ان ننشا تركيبا)سجل( للموظف في الشركة بحيث يتكون من
البيانات)الحقول( التالية :اسم الموظف ,رقم الموظف ,راتب الموظف
.......رقم هاتف الموظف
:مثال 2
يمكن ان ننشا تركيبا لجهاز الحاسوب بحيث يتكون من نوع
......الجهاز,سعر الجهاز ,نوع نظام التشغيل فيه
الشكل العام للتركيب في لغة C++
اسم التركيب Struct
{
اسم المتغير نوع المتغير
اسم المتغير نوع المتغير
.
. ;}
قمنا من خلل المثال السابق بتعريف متغيرمركب واحد بمعنى اخر لموظف
واحد,لكن بالتاكيد يوجد في المؤسسة او الشركة اكثر من موظف ,وكل
.موظف له نفس الحقول السابقة .لذا نقوم باستخدام مصفوفة التراكيب
تتشابه مصفوفة التراكيب مع غيرها من المصفوفات الخرى ال ان النوع
:يختلف فمثل
تعني هذة الجملة تعريف مصفوفة من 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
} }
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);
}
:لحظ ما يلي
اننا لم نضع الكلمة 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(); };
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
{
اسم المتغير نوع المتغير
اسم المتغير نوع المتغير
.
. ;}
قمنا من خلل المثال السابق بتعريف متغيرمركب واحد بمعنى اخر لموظف
واحد,لكن بالتاكيد يوجد في المؤسسة او الشركة اكثر من موظف ,وكل
.موظف له نفس الحقول السابقة .لذا نقوم باستخدام مصفوفة التراكيب
تتشابه مصفوفة التراكيب مع غيرها من المصفوفات الخرى ال ان النوع
:يختلف فمثل
تعني هذة الجملة تعريف مصفوفة من 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
} }
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);
}
:لظحظ ما يلي
اننا لم نضع الكلمة 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(); };
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; }
ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ
ﻛﻠﻳﺔ ﻟﺗﻛﻧوﻟوﺟﻳﺎ واﻟﻌﻠوم اﻟﺗطﺑﻳﻘﻳﺔ
إﻋداد
أ .ﻋﻳﺳﻰ أﺳﻌد د .ﻳوﺳف اﺑو زر
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++
أﻫداف اﻟﺗدرﻳﺑﺎت
ﻳﻧﺗظر ﻣﻧك ،ﻋزﻳزي اﻟطﺎﻟب ،ﺑﻌد ﻓراﻏك ﻣن ﺗﻧﻔﻳذ ﻫذﻩ اﻟﺗدرﻳﺑﺎت أن ﺗﻛون ﻗﺎد ار ﻋﻠﻰ أن:
.1ﺗﻌرﻳف واﺳﺗﺧدام اﻟﺗراﻛﻳب .structures
.2اﺳﺗﺧدام ﻣﺻﻔوﻓﺎت ﻣن اﻟﺗراﻛﻳب .arrays of structures
.3ﺗﻌرﻳف واﺳﺗﺧدام اﻷﺻﻧﺎف .classes
.4اﻟﺗﻣﻳﻳز ﺑﻳن اﻟﺗراﻛﻳب واﻷﺻﻧﺎف.
.5إﻧﺷﺎء اﻟﻛﺎﺋﻧﺎت واﺳﺗﺧداﻣﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ.
.6ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﻣﻧﺗﻣﻳﺔ واﺳﺗدﻋﺎﺋﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ.
.7ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﺳطرﻳﺔ .
.8ﺗﺣﻣﻳﻝ اﻟدواﻝ أﻛﺛر ﻣن ﺗﻌرﻳف واﺣد.
.9إدﺧﺎﻝ اﻟﺑﻳﺎﻧﺎت ٕواﺧراﺟﻬﺎ ﺑوﺳﺎطﺔ cinو .cout
ﻣﺳﺎﻋدة اﻟﺣﻝ:
-1ﺗﻌرﻳف اﻟﻣﺻﻔوﻓﺔ
>#include <iostream
{ class CRectangle
;int x, y
public:
;)void set_values (int,int
};)int area () {return (x*y
;}
{ )( 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);}
};
int main () {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
{ class CRectangle
;int width, height
public:
;)( CRectangle
;)CRectangle (int,int
};)int area (void) {return (width*height
;}
{ )( CRectangle::CRectangle
;width = 5
;height = 5
}
{ )( 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
};
float dist(Point p) {
// Compute the distance from the origin
return sqrt(p.x*p.x + p.y*p.y);
}
(2) ﺳؤاﻝ
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();
}
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) اﻟﺗدرﻳب
.اﻋد ﻛﺗﺎﺑﺔ ﻣﺛﺎﻝ اﻟﻣﺳﺗطﻳﻝ ﻣن ﺧﻼﻝ ﻓﻛرة ﻣؤﺷر اﻟﻰ اﻟﺻﻧف وﻣؤﺷر اﻟﻰ ﻣﺻﻔوﻓﺔ ﻣن اﻟﻛﺎﺋﻧﺎت
:اﻟﺣﻝ
class CRectangle {
int width, height;
public:
void set_values (int, int);
int area (void) {return (width * height);}
};
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;
}
اﻟﺗدرﻳب )(3
ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳوﺿﺢ ﻣﺛﺎﻝ اﻟﻧﻘطﺔ ﺑﺣﻳث ﻳﻘدم ﻓﻛرة اﺳﺗﺧدام ﺧوارزﻣﻳﺎت اﻟﻔرز bubbleSortﻟﺗرﺗﻳب اﻟﻧﻘط
ﺗﺻﺎﻋدﻳﺎ ﺣﺳب اﻟﻣﺳﺎﻓﺔ ﻣن ﻧﻘطﺔ اﻷﺳﺎس .اﻛﺗب اﻟداﻟﺔ اﻟرﺋﻳﺳﻳﺔ ﻟﻠﺑرﻧﺎﻣﺞ
>include <iostream
{ struct Point
float x; // x coordinate
float y; // y coordinate
char name[20]; // name of the point
;}
#include <iostream.h>
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();
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;
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
اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻟﺗﻣرﻳر اﻟﻌواﻣﻝ ،اﻛﺗب اﻟﺑراﻣﺞ اﻟﺗﺎﻟﻳﺔ وﻧﻔذﻫﺎ ﻋﻠﻰ اﻟﺣﺎﺳوب ،وﻋﻠﻝ ﻧﺗﺎﺋﺞ اﻟﺗﻧﻔﻳذ.
Y=X;
}
B="<<B<<endl;
}
(2) ﺗدرﻳب
Friend Functions الدوال الصديقة
لھذه الدالة داخل تعريف الصنفprototype تعرف الدالة على أنھا دالة صديقة لصنف ما بوضع نموذج
مما يعني أن الدالة الصديقة لھا الحق في معالجة األجزاء الخاصة للصنف كما لو. friend مسبوقا بالكلمة
. وتختلف طريقة استدعاء الدالة الصديقة عن طريقة استدعاء الدالة المنتمية.كانت دالة منتمية للصنف
إليجاد مربع المسافةDistance حيث يقوم البرنامج بتعريف صنف اسمه مسافة،ادرس البرنامج التالي جيدا
: ثم اجب عن األسئلة التالية،المعطاة بالقدم والبوصة بالقياس قدم مربع
;)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;
ﺗدرﻳب )(6
في ك ّل مرة يتم فيھا استدعاء الدوال المنتمية ،فانه يمرر بصورة اتوماتيكية مؤشر يدعى ، thisإلى
الكينونة التي تم استدعائھا .ھذا المؤشر يدعى thisويعتبر معامل ضمني لجميع الدوال المنتمية .لذا ،في
داخل اي دوال منتمية ،المؤشر thisقد يستعمل لإلشارة إلى الكينونة المستدعاة.
نفذ البرنامج التالي وبين النتيجة التي حصلت عليھا ،ونقاش النتيجة التي حصلت عليھا
// this
>#include <iostream
{ class CDummy
public:
;)int isitme (CDummy& param
;}
{ )( 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اﻟﻣﻬﻣﺔ.
>#include <iostream
>#include <conio.h
// Derived class
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// 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();
getch();
}
ﺗﻣرﻳن) :(1اﻛﺗب اﻟﻧص اﻟﺑرﻣﺟﻲ اﻟذي ﻳﺣﻘق اﻟوراﺛﺔ اﻟﻣﻧﻔردة اﻟﻣوﺿﺣﺔ ﻓﻲ اﻟﺷﻛﻝ اﻟﺗﺎﻟﻲ ﻋﻠﻣﺎ ﺑﺎن اﻟﺻﻧﻔﺎن
اﻟﻣﺷﺗﻘﺎن ﻳﺣﺗوﻳﺎن دواﻝ ﺣﺳﺎب اﻟﻣﺳﺎﺣﺔ.
CPolygon
width : Integer
height : Integer
)(set_values
CRectangle CTriangle
{ class COutput
public:
void output (int i);
};
وﻳﻌطﻲPolymorphism أﻋﻣﻝ اﻟﺗﻌدﻳﻝ اﻟﻼزم ﻋﻠﻰ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻟﻳﺣﻘق ﻣﻔﻬوم ﺗﻌدد اﻻوﺟﻪ:(3) ﺗﻣرﻳن
:اﻟﻧﺗﻳﺟﺔ اﻟﺗﺎﻟﻳﺔ
Rectangle class area
Triangle class area
:اﻟﻘواﻟب
. واﻟﺗﻲ ﺗﻌﻣﻝ ﻋﻠﻰ ﺗﺑدﻳﻝ ﻣﺗﻐﻳران ﻣن ﻧوع ﻛﺎﺋن ﻣن ﻧﻔس اﻟﺻﻧفSwap اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﻳﻌرف ﻗﺎﻟﺑﺎ ﻟﻠداﻟﺔ
ﺗﻣرﻳن) :(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;}
};
// 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;
}
};
// 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();
}
// 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();
}
// 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++
ﺗﺗﻧــﺎوﻝ ﻫــذﻩ اﻟوﺣــدة ﺗﻌرﻳف ﻣﻔﻬوم ﻫﻳﻛــﻝ اﻟﺑﻳــﺎﻧــﺎت وﻣوﻗﻊ اﻟﻣﻠﻔــﺎت ﺑﻳﻧﻬــﺎ ٕواﻋطــﺎء ﻟﻣﺣــﺔ ﻣﺧﺗﺻ ـ ـ ـ ـ ـ ــرة ﻋن
اﻷﻧواع اﻟﻣﺧﺗﻠﻔﺔ ﻣن اﻟﺑﻳﺎﻧﺎت .وﻳﺗﻠو ذﻟك ﻣﻧﺎﻗﺷﺔ اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻓﻲ ﺗﻧظﻳم اﻟﻣﻠﻔﺎت وﺗﻌرﻳف اﻟﻣﻠﻔﺎت واﻟﻳﻧﺎﺑﻳﻊ،
وﻣن ﺛم ﺗوﺿــﻳﺢ ﻛﻳﻔﻳﺔ إﻧﺷــﺎء اﻟﻣﻠﻔﺎت اﻟﺗﺗﺎﺑﻌﻳﺔ واﻟﻌﺷ ـواﺋﻳﺔ وﻗراءﺗﻬﺎ وﺗﺣدﻳﺛﻬﺎ ،وأﺧﻳ اًر ﺗم ﺗوﺿ ــﻳﺢ ﻛﻳﻔﻳﺔ اﻟﺗﻌﺎﻣﻝ
ﻣﻊ اﻟﻛﺎﺋﻧﺎت ﻣن ﺣﻳث اﻹدﺧﺎﻝ واﻹﺧراج ﻓﻲ اﻟﻣﻠﻔﺎت.
أﻫداف اﻟوﺣدة
ﻳﻧﺗظر ﻣﻧك ،ﻋزﻳزي اﻟدارس ،ﺑﻌد ﻓراﻏك ﻣن دراﺳﺔ ﻫذﻩ اﻟوﺣدة ،أن ﺗﻛون ﻗﺎد اًر ﻋﻠﻰ أن:
#include <fstream>
#include <iostream>
#include <conio.h>
int main ()
{
char data[100];
// open a file in write mode.
ofstream outfile;
outfile.open("afile.dat");
// again read the data from the file and display it.
;infile >> data
;cout << data << endl
;)(getch
}
ﺗﻣرﻳن ) :(1اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻟﻛﺗﺎﺑﺔ ﻧﺻﺎ ﻓﻲ ﺳطرﻳن داﺧﻝ ﻣﻠف .example.txtﻣوﺿﺣﺎ ﻛﻳﻔﻳﺔ ﻓﺗﺢ اﻟﻣﻠف
ﻟﻠﻛﺗﺎﺑﺔ دون ﻣﺳﺢ ﻣﺣﺗوﻳﺎت اﻟﻣﻠف إن ﻛﺎن ﻣوﺟودا ﻣن ﻗﺑﻝ.
ﺗﻣرﻳن ) :(2اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻘراءة ﻣﺣﺗوﻳﺎت اﻟﻣﻠف اﻟﻣذﻛور ﻓﻲ اﻟﺗﻣرﻳن اﻟﺳﺎﺑق وطﺑﺎﻋﺔ ﻣﺣﺗوﻳﺎﺗﻪ ﻋﻠﻰ
اﻟﺷﺎﺷﺔٕ .وان ﻛﺎن اﻟﻣﻠف ﻏﻳر ﻣوﺟود ﻓﺈﻧﻪ ﻳطﺑﻊ رﺳﺎﻟﺔ ﺗﺑﻳن ذﻟك.
ﺗﻣرﻳن ) :(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;
}
int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}
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;
}
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;
}
عزيزي الطالب ،توجد الكثير من بيئات التطوير) (IDEsالمعتمدة ومنھا برنامج Code::Blocksو برنامج
Visual C++ Expressويعتبران من البرامج المجانية ،كما يوجد برامج أخرى مثل Borland C++
وبرنامج Visual C++وأخرى عديدة غير مجانية.
في ھذه الوحدة – عزيزي الطالب – سنتطرق إلى شرح كيفية إعداد واستخدام بيئات التطوير التالية:
) Code::Blocks -مجاني ومفتوح المصدر(
Visual C++ -من شركة ميكروسوفت وھو غير مجاني ،ولكن الشركة أصدرت نسخة مجانية منه اسمھا
.Visual C++ Express
في ھذا القسم –عزيزي الطالب -إن شاء ﷲ سنتطرق لشرح مصور لبرنامج . Code::Blocks
البعض يعتبره البرنامج االكثر سھولة في االستخدام والسالسة ،كما أنه يعمل جيدا على وندوز 7على عكس
بعض من البرامج األخرى.
برنامج الـ :Code::Blocksھو IDEمالئم جدا ،مجاني و يعمل على الـ ،Windowsو الـ،Mac OS
والـ .Linuxلغته المتوفرة حاليا ھي االنجليزية.
-1شريط األدوات
-2قائمة ملفات المشروع :توجد بيسار النافذة ،تحتوى على كل ملفات السورس المتعلقة بالبرنامج الذي
تعمل عليه .و بما أنھا فارغة حسب ما يظھر في الصورة ھذا دليل على عدم وجود مصادر سورس
في الالئحة حتى ھذه اللحظة.
-3المنطقة الرئيسية :ھنا المساحة التي تكتب فيھا الكودسورس للغتك الـ .C++
-4منطقة البيان :و يسميھا المبرمجون منطقة الموت ،و ھي المنطقة التي تعرض لك األخطاء التي
وقعت فيھا أثناء كتابتك للكود سورس ،طبعا متسلسلة بانتظام.
ما يھمنا اآلن ھو منطقة معينة خاصة من شريط األدوات
1-Compile :
كل الكود سورس الخاصة ببرنامجكم ستبعث لمصنف يقوم بالترجمة ثم يستخرج لنا الـ Code::Blocksملفا
قابل للتنفيذ أو باألحرى ملف تنفيذي .لكن إن اقترفت خطأ في الكتابة لن يترجم لك المصنف شيئا و ستظھر
األخطاء في منطقة البيان.
تقوم بتشغيل آخر ملف تنفيذي قمت بكتابة الكود السورس الخاص به .و ھذا عندما تريد تجريب البرنامج قبل
االنتھاء منه .وستعرف بنفسك أنه قبل التشغيل Executeيجب الترجمة Compileولكى نجرب ما توصلنا
إليه نضغط على األيقونة .3
عندما نقوم بالـ"ترجمة" فإن Code::Blocksلن يقوم بتشغيل سوى الملفات التي ّعدلت عليھا أو أضفتھا.
أحيانا فقط ،تضطر بأن تأمر الـ Code::Blocksبترجمة و تشغيل كل شيء .Recompile everything
كي تبدأ مشروعا جديدا ،توجه نحو ، : File / New / Projectستظھر لك نافذة اختر منھا "Console
"application
كما تالحظ-عزيزي الطالب ،برنامج الـ Code::Blocksيسمح بالعمل على أنماط كثيرة من البرامج
المختلفة ،منھا التي تعمل بمكتبات مشھورة كالـ SDLللـ 2Dو ألـ OpenGLللـ 3Dو الـ Qt
و wxWidgetsللـ نوافذ ..إلخ ،ھذه المكتبات غير مثبتة على جھازكم بعد ،و بھذا ال يمكنكم جعلھا تعمل.
بعدھا سيأتيك اختيار بين لغتي الـ Cأو الـ ،C++اختر الـ .C++
سيطلب منك اآلن أن تدخل اسم المشروع ،و كذا المسار الذي تختاره كي يحفظ فيه.
آخر خطوة تطلب منك ھي ،كيف ينبغى أن يترجم البرنامج ،يمكنك ترك االختيارات على حالھا ،لن يكون
لھذا أي تأثير على ما سنقوم به اآلن ،قم بتحديد زر"Release" .
في الخانة الخاصة بالمشاريع على اليسار ،إضغط على ' '+لتوسيعھا قليال ،و تظھر قائمة الملفات في
المشروع.
اآلن تم فتح مشروع خاص بك وما عليك اال بكتابة الكود والباقي على البرنامج،
سيقوم بفتح ملف تنفيذي يفتح بواسطة ال: MsDos
تشغيل مثال بسيط:
النتيجة:
اﻟﻘﺳم اﻟﺛﺎﻧﻲ :ﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ Microsoft Visual C++
ﻳﻣﻛﻧك ﻋزﻳزي اﻟطﺎﻟب ﺗﻧﻔﻳذ ﺑراﻣﺞ ﻟﻐﺔ ﺳﻲ ﺑﻠص ﺑﻠص ﺑﺎﺳﺗﺧدام اﻟﻌدﻳد ﻣن اﻟﻣﺗرﺟﻣﺎت ﻣﺛﻝ، Borland :
Microsoft Visual Studio 6.0 ،Turbo c++ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو ﻧﻣط 6او اﺣدث ﻣن ذﻟك.
ﻣﺣرر اﻷﻛواد
ﻣﺛﻝ ﺑﺎﻗﻰ ﺑﻳﺋﺎت اﻟﺗطوﻳر ﻳﺣﺗوى اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو ﻋﻠﻰ ﻣﺣرر أﻛواد ﻳدﻋم ﺗﻌﻠﻳم اﻟﺻﻳﻐﺔ واﻻﻛﻣﺎﻝ اﻟﺗﻠﻘﺎﺋﻰ
وﻳﺳﺗﺧدم أﻳﺿﺎ ﺗﻘﻧﻳﺔ اﻧﺗﻠﻳﺳﻧس ﻟﺗﺳﺎﻋد اﻟﻣﺑرﻣﺞ ﻓﻲ ﻛﺗﺎﺑﺔ اﻟﻣﺗﻐﻳرات واﻟدواﻝ واﻟوﺳﺎﺋﻝ واﻟدورات ﺑﺳرﻋﺔ ،وﻳدﻋﻣﻬﺎ
اﻟﻣﺣرر ﻓﻲ ﻛﺗﺎﺑﺔ ﺟﻣﻳﻊ ﻟﻐﺎت اﻟﺑرﻣﺟﺔ واﻟﺗرﻣﻳز اﻟﺗﻲ ﻳﺣﺗوى ﻋﻠﻳﻬﺎ اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو.
ﻳدﻋم ﻣﺣرر أﻛواد ﻓﻳﺟواﻝ اﺳﺗودﻳو أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ وﺿﻊ ﻋﻼﻣﺎت ﻣرﺟﻌﻳﺔ ﻓﻲ اﻟﻛود ﻟﻠﻣﺳﺎﻋدة ﻓﻲ اﻟﺗﺻﻔﺢ اﻟﺳرﻳﻊ،
ﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ collapsing and expandingﻣﺟﻣوﻋﺎت اﻷﻛواد واﻟﺑﺣث واﻻﺳﺗﺑداﻝ ﻓﻲ اﻟﻛود ,وﻳدﻋم
أﻳﺿﺎ code snippetsوﻫﻰ ﻗواﻟب ﺟﺎﻫزة ﻣن اﻟﻛود ﻳﻛﻣن ادراﺟﻬﺎ وادﺧﺎﻝ ﺗﻐﻳﻳرات ﻋﻠﻳﻬﺎ داﺧﻝ اﻟﻣﺷروﻋﺎت
اﻟﺟﺎرى اﻟﻌﻣﻝ ﻋﻠﻳﻬﺎ وﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ اﻋﺎدة ﻛﺗﺎﺑﺔ اﻟﻛود.
ﻳﻘوم ﻣﺣرر اﻷﻛواد أﻳﺿﺎ ﺑوﺿﻊ ﺧطوط ﺣﻣراء أﺳﻔﻝ اﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﺧطوط ﺧﺿراء أﺳﻔﻝ اﻻﻧذرات.
ﻣﺗﻌﻘب اﻷﺧطﺎء
ﻳﺣﺗوى ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻋﻠﻰ ﻣﺗﻌﻘب أﺧطﺎء ﺗدﻋﻣﻪ ﺟﻣﻳﻊ اﻟﻠﻐﺎت اﻟﻣدﻋوﻣﺔ ﻳﻛﺷف أﺧطﺎء وﻗت اﻟﺗﺷﻐﻳﻝ
واﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﻳﺳﻣﺢ ﺑوﺿﻊ ﻧﻘﺎط ﺗوﻗف ﻋﻧد ﺳطور اﻟﻛود واﻟﺗﻲ ﻳﺗوﻗف اﻟﺑرﻧﺎﻣﺞ ﻋن اﻟﻌﻣﻝ ﻋﻧدﻣﺎ
ﻳﺻﻝ ﻟﻬذا اﻟﺳطر.
ﻳوﺟد أﻳﺿﺎ ﻓﻲ ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻧﺎﻓذة immediate windowواﻟﺗﻲ ﺗﺳﻣﺢ ﺑﺗﺟرﻳب اﻟدواﻝ أﺛﻧﺎء ﻛﺗﺎﺑﺗﻬﺎ.
في ھذا القسم – عزيزي الطالب – سوف نشرح كيفية كتابة أول برنامج لك بلغة الـ C++وباستخدام Microsoft
Visual C++وھي بيئة تطويرية أخرى يمكن أن تتعامل معھا من أجل التمكن من االنتقال إلى برمجة تطبيقات ويندوز
باستخدامھا.
-2تحصل على النافذة كما في الشكل التالي ،من الصفحة Workspacesسيظھر Blank Workspaceوھو
مكان العمل الذي سوف توضع فيه مشاريعك .
-3عند خانة Workspace nameأدخل اسم ) مثالً اسمك( ،يمكنك تغيير مكان التخزين عن طريق الخانة
.Location
-4اآلن ولنقوم بتشكيل أول مشروع يحب علينا اختيار األمر Newمن القائمة Fileلتحصل على نفس الشاشة
التي حصلت عليھا مسبقا ً ولكن الصفحة Projectsھي التي ستظھر أمامك بدالً عن .Workspaces
-5اختر ،Win32 Console Applicationعلى يمين النافذة وعند خانة Project Nameاكتب اسم
مشروعك وليكن ،Prog1بشكل افتراضي سوف يقوم الفيجول سي ++بإنشاء دليل بنفس اسم المشروع
ويضع فيه جميع الملفات التي سوف تضيفھا الحقا ً لمشروعك .
-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
;*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 A=10
;int B=100
;max(A,B)=5
إن نتي جة تنف يذ هذه الجم لة هي تخز ين القي مة 5في
المتغير صاحب أكبر قيمة وهو المتغير .B
جامعة القدس المفتوحة
مركز التعليم المفتوح OLC
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؟
تذكر عزيزي الطالب:
للصنف . 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);
};
العملية >> معرفة كعملية صديقة
للصنف
:أما العملية نفسها فتعرف كما يلي
#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
الخرج من البرنامج يبدو كالتالي:
) ( main
{
;)test a(12
;) (a.print
;return 0
}
الكلمة المفتاحية This
وللتوضيح فإن العضو الدالي printيقوم أول ا بطباعة x
مباشرة ،ثم يستعمل طريقتين للوصول إلى xباستعمال
المؤشر : this
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
{
cout<< (hour < 10 ? “0” : “ “ ) << hour << “:”
<< (minute < 10 ? “0” : “ “) << minute << “:”
<< (second < 10 ? “0” : “ “ )<< second;
}
المعاملت الساكنة
نفترض ان نا نر غب في تمر ير احدى المعاملت كمرجع
لزيادة كفاءة البرنامج مع عدم تمكين الدوال في العبث
في قيمة هذا المعامل ،فماذا نفعل؟؟؟؟
الدوال الصديقة
مثال:
لتعريف الدالة averageوالتي تجد معدل علمات طالب ما
كدالة صديقة للصنف studentنضع النموذج:
;)friend double average(student s
• 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
النصناف الصديقة
مثال:
ع لى سبيل المثال لنفرض أن لدي نا الصنفين 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; }
إعداد وتقديم:
أ .عيسى المصري /منسق المقرر
فرع الخلي
الربعاء 23/12/2017
يحتوي اللقاء على شرح أمثلة تتعلق
بالمواضيع التالية:
تمرير
الوراثة):(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
#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
int main() {
;surgeon s
s.setdata(“mehak",123);
)(;s.showData
s.operate();
s.treat();
}
:Multiple Inheritance
Multiple Inheritance:Syntax
Class A {….};
Class B {…};
#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
)(set_values
CRectangle CTriangle
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
: فتح الملف
فتح باستخدام البناء
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
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;
sizeof( clientData ) );
return 0;
}
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;
return 0;
}
clientData client;
if ( client.accountNumber != 0 )
outputLine( cout, client );
return 0;
}
#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بعد النتهاء من الحاجة الى الكائن
الذي حجزت له هذه الذاكرة
اكتب برنامج بلغة ++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> أواﻣﺮ اﻟﺴﻼﺳﻞ
#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 ();
#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>
strcpy (A1,A3);
strcpy (A2,A3);
printf ("%s\n\n%s", A1 , A2 );
getch ();
}
#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 ();
}
#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);
#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);
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);
getch ();
}
gets :ﻗﺮاءة ﺳﻠﺴﻠﺔ
#include <stdio.h>
#include <conio.h>
#include <string.h>
getch ();
}
#include <stdio.h>
#include <conio.h>
#include <string.h>
getch ();
}
:أواﻣﺮ اﻟﺴﻼﺳﻞ
#include<iostream.h>
}
ﺣﺼﺮﯾﺎً :ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ www.stqou.com
ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ :ﺑﺮﻣﺠﺔ 1
ﺑﺴﻢ ﺍ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ
>#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
}
>#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 :
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 ﺑﺮﻣﺠﺔ: ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ
#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 ();
}
: اﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎً ﺑـ )ﺟﻤﻞ اﻟﺸﺮط اﻟﻤﺨﺘﺼﺮة( ﻟﺤﺴﺎب اﻟﺮﻗﻢ اﻷﻛﺒﺮ ﺑﯿﻦ ﺛﻼﺛﺔ أرﻗﺎم.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;
#include <stdio.h>
#include <conio.h>
scanf ("%d\n%d\n%d",&a,&b,&c);
max1 = (a > b ) ? a:b;
max2 = (max1>c) ? max1:c;
getch ();
}
ﺣﺼﺮﯾﺎً :ﻟﻤﻨﺘﺪﯾﺎت ﻃﻼب اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ www.stqou.com
ﻣﻠﺨﺺ اﻟﻤﺤﺎﺿﺮات اﻟﻌﻤﻠﯿﺔ :ﺑﺮﻣﺠﺔ 1
.2اﻛﺘ ﺐ ﺑﺎﻟﻄﺮﯾﻘ ﺔ اﻟﻤﺨﺘ ﺼﺮة ﺑﺮﻧﺎﻣﺠ ﺎً ﻟﺤ ﺴﺎب ﺻ ﺎﻓﻲ راﺗ ﺐ ﻣﻮﻇ ﻒ ﺑﻌ ﺪ ﺧ ﺼﻢ
اﻟﻀﺮﯾﺒﺔ ﺑﺤﺴﺐ اﻟﺸﺮوط اﻟﺘﺎﻟﯿﺔ:
>#include <stdio.h
>#include <conio.h
;)scanf ("%f",&s
;)(getch
}
) 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من أجل إجبار المترجم على تحديد ھوية الدالة وقت الترجمة وليس وقت التنفيذ.
1
(14عند التعامل مع الملفات التتابعبة تستخدم الدالة ;) seekg(nمن أجل:
ج( البحث عن الحرف nداخل الملف. أ( وضع مؤشر بداية القراءة عند البايت رقم nمن الملف.
د( ال شيء مما ذكر ب( إرجاع قيمة البايت المخزن في الموقع رقم .n
(15المعامالت ios::out|ios::binaryتستخدم من اجل فتح ملف:
د( تتابعي للكتابة ج( تتابعي للقراءة ب( عشوائي للكتابة أ( عشوائي للقراءة
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
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
}
3
التمرير بالقيم والتمرير بالاشارة
النصناف والدوال الصديقة +
: 1سؤال
10151015
لماذا؟
تذكر تمرير المعاملت بالقيم هنا فالعمليات التي تجري على العوامل
A,bمستقلة عن x,y
تذكر العبارة انه يتم عمل نسخة مستقلة
10152233
لماذا؟
تذكر تمرير المعاملت بالاشارة هنا فالمعاملت تمرر من خلل
عناوينها فالعمليات التي تجري على العوامل
A,bليست مستقلة عن x,y
تذكر العبارة انه يتم عمل نسخة متصلة بالنصل او بمعنى اخر
y x انصبح اسمين للخلية
b a
: 3سؤال
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سؤال
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: الجواب
لحظ ان سبب الختلف هو ان البرنامج الول يمرر المعاملت بالقيم
في حين هذا البرنامج الثاني هو نفسه لكن واجود ااشارة & اجعلت المعاملت تمرر بالعنوان
نصنف نصديق لصنف
;)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) {no=no+w.no
ولو كان المر ) w.add(bbفان }{no=no+bb.no
#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();
getch();
}
tﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ:
ﻧﺺ اﻟﺴﺆال:
ﻋﺰﻳﺰي اﻟﺪارس\ة:
ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﺤﺘﻮي ﻋﻠﻰ ﺻﻨﻒ اﺳﻤﻪ ) (accountﻳﻤﺜـﻞ ﺣـﺴﺎب ﺑﻨﻜـﻲ ﻷﺣـﺪ اﻟﺰﺑـﺎﺋﻦ وﺑـﻪ اﻟﻤﺘﻐﯿـﺮات
واﻟﺪوال اﻟﻤﻨﺘﻤﯿﺔ اﻟﺘﺎﻟﻲ:
اﻟﻘﺴﻢ اﻟﺨﺎص:
اﻟﻘﺴﻢ اﻟﻌﺎم:
-داﻟﺔ ﻹﺟﺮاء ﻋﻤﻠﯿﺔ إﻳﺪاع ﻋﻠﻰ اﻟﺮﺻﯿﺪ ) (depositeﻟﻘﺮاءة ﻗﯿﻤﺔ ﻣﺒﻠﻎ ﻣﻌﯿﻦ وﺗﻌﺪﻳﻞ ﻗﯿﻤﺔ اﻟﺮﺻﯿﺪ.
-داﻟﺔ ﻹﺟﺮاء ﻋﻤﻠﯿﺔ ﺳﺤﺐ ﻣﻦ اﻟﺮﺻﯿﺪ ) (withdrawﻟﺘﻌﺪﻳﻞ ﻗﯿﻤـﺔ اﻟﺮﺻـﯿﺪ ﺣـﺴﺐ اﻟﻘﯿﻤـﺔ اﻟﻤﻘـﺮوءة اﻟﻤـﺮاد
ﺳﺤﺒﮫﺎ ﻣﻦ اﻟﺮﺻﯿﺪ.
أﻛﺘﺐ اﻟﺪاﻟﺔ اﻟﺮﺋﯿﺴﯿﺔ ﺛﻢ ﻋﺮف ﻛﯿﺎن ﻣﻦ اﻟﺼﻨﻒ accountﺛﻢ اﺳﺘﺪﻋﻲ داﻟﺔ اﻹﻳﺪاع وداﻟﺔ اﻟﺴﺤﺐ ﺛـﻢ اﻃﺒـﻊ
اﺳﻢ ﺻﺎﺣﺐ اﻟﺤﺴﺎب وﻗﯿﻤﺔ اﻟﺮﺻﯿﺪ.
ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢﺑﺴﻢ ﺍ
: اﻛﺘﺐ ﺑﺮﻧﺎﻣﺠﺎً ﺑـ )ﺟﻤﻞ اﻟﺸﺮط اﻟﻤﺨﺘﺼﺮة( ﻟﺤﺴﺎب اﻟﺮﻗﻢ اﻷﻛﺒﺮ ﺑﯿﻦ ﺛﻼﺛﺔ أرﻗﺎم.1
a=2,b=3,c=5
#include <stdio.h>
#include <conio.h>
#include <stdio.h>
#include <conio.h>
scanf ("%d\n%d\n%d",&a,&b,&c);
max1 = (a > b ) ? a:b;
max2 = (max1>c) ? max1:c;
getch ();
}
.2اﻛﺘ ﺐ ﺑﺎﻟﻄﺮﯾﻘ ﺔ اﻟﻤﺨﺘ ﺼﺮة ﺑﺮﻧﺎﻣﺠ ﺎً ﻟﺤ ﺴﺎب ﺻ ﺎﻓﻲ راﺗ ﺐ ﻣﻮﻇ ﻒ ﺑﻌ ﺪ ﺧ ﺼﻢ
اﻟﻀﺮﯾﺒﺔ ﺑﺤﺴﺐ اﻟﺸﺮوط اﻟﺘﺎﻟﯿﺔ:
>#include <stdio.h
>#include <conio.h
;)scanf ("%f",&s
;)(getch
}
إﻋداد
أ .ﻋﻳﺳﻰ أﺳﻌد د .ﻳوﺳف اﺑو زر
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++
أﻫداف اﻟﺗدرﻳﺑﺎت
ﻳﻧﺗظر ﻣﻧك ،ﻋزﻳزي اﻟطﺎﻟب ،ﺑﻌد ﻓراﻏك ﻣن ﺗﻧﻔﻳذ ﻫذﻩ اﻟﺗدرﻳﺑﺎت أن ﺗﻛون ﻗﺎد ار ﻋﻠﻰ أن:
.1ﺗﻌرﻳف واﺳﺗﺧدام اﻟﺗراﻛﻳب .structures
.2اﺳﺗﺧدام ﻣﺻﻔوﻓﺎت ﻣن اﻟﺗراﻛﻳب .arrays of structures
.3ﺗﻌرﻳف واﺳﺗﺧدام اﻷﺻﻧﺎف .classes
.4اﻟﺗﻣﻳﻳز ﺑﻳن اﻟﺗراﻛﻳب واﻷﺻﻧﺎف.
.5إﻧﺷﺎء اﻟﻛﺎﺋﻧﺎت واﺳﺗﺧداﻣﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ.
.6ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﻣﻧﺗﻣﻳﺔ واﺳﺗدﻋﺎﺋﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ.
.7ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﺳطرﻳﺔ .
.8ﺗﺣﻣﻳﻝ اﻟدواﻝ أﻛﺛر ﻣن ﺗﻌرﻳف واﺣد.
.9إدﺧﺎﻝ اﻟﺑﻳﺎﻧﺎت ٕواﺧراﺟﻬﺎ ﺑوﺳﺎطﺔ cinو .cout
ﻣﺳﺎﻋدة اﻟﺣﻝ:
-1ﺗﻌرﻳف اﻟﻣﺻﻔوﻓﺔ
>#include <iostream
{ class CRectangle
;int x, y
public:
;)void set_values (int,int
};)int area () {return (x*y
;}
{ )( 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);}
};
int main () {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
{ class CRectangle
;int width, height
public:
;)( CRectangle
;)CRectangle (int,int
};)int area (void) {return (width*height
;}
{ )( CRectangle::CRectangle
;width = 5
;height = 5
}
{ )( 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
};
float dist(Point p) {
// Compute the distance from the origin
return sqrt(p.x*p.x + p.y*p.y);
}
(2) ﺳؤاﻝ
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();
}
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) اﻟﺗدرﻳب
.اﻋد ﻛﺗﺎﺑﺔ ﻣﺛﺎﻝ اﻟﻣﺳﺗطﻳﻝ ﻣن ﺧﻼﻝ ﻓﻛرة ﻣؤﺷر اﻟﻰ اﻟﺻﻧف وﻣؤﺷر اﻟﻰ ﻣﺻﻔوﻓﺔ ﻣن اﻟﻛﺎﺋﻧﺎت
:اﻟﺣﻝ
class CRectangle {
int width, height;
public:
void set_values (int, int);
int area (void) {return (width * height);}
};
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;
}
اﻟﺗدرﻳب )(3
ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳوﺿﺢ ﻣﺛﺎﻝ اﻟﻧﻘطﺔ ﺑﺣﻳث ﻳﻘدم ﻓﻛرة اﺳﺗﺧدام ﺧوارزﻣﻳﺎت اﻟﻔرز bubbleSortﻟﺗرﺗﻳب اﻟﻧﻘط
ﺗﺻﺎﻋدﻳﺎ ﺣﺳب اﻟﻣﺳﺎﻓﺔ ﻣن ﻧﻘطﺔ اﻷﺳﺎس .اﻛﺗب اﻟداﻟﺔ اﻟرﺋﻳﺳﻳﺔ ﻟﻠﺑرﻧﺎﻣﺞ
>include <iostream
{ struct Point
float x; // x coordinate
float y; // y coordinate
char name[20]; // name of the point
;}
#include <iostream.h>
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();
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;
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
اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻟﺗﻣرﻳر اﻟﻌواﻣﻝ ،اﻛﺗب اﻟﺑراﻣﺞ اﻟﺗﺎﻟﻳﺔ وﻧﻔذﻫﺎ ﻋﻠﻰ اﻟﺣﺎﺳوب ،وﻋﻠﻝ ﻧﺗﺎﺋﺞ اﻟﺗﻧﻔﻳذ.
Y=X;
}
B="<<B<<endl;
}
(2) ﺗدرﻳب
Friend Functions الدوال الصديقة
لھذه الدالة داخل تعريف الصنفprototype تعرف الدالة على أنھا دالة صديقة لصنف ما بوضع نموذج
مما يعني أن الدالة الصديقة لھا الحق في معالجة األجزاء الخاصة للصنف كما لو. friend مسبوقا بالكلمة
. وتختلف طريقة استدعاء الدالة الصديقة عن طريقة استدعاء الدالة المنتمية.كانت دالة منتمية للصنف
إليجاد مربع المسافةDistance حيث يقوم البرنامج بتعريف صنف اسمه مسافة،ادرس البرنامج التالي جيدا
: ثم اجب عن األسئلة التالية،المعطاة بالقدم والبوصة بالقياس قدم مربع
;)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;
ﺗدرﻳب )(6
في ك ّل مرة يتم فيھا استدعاء الدوال المنتمية ،فانه يمرر بصورة اتوماتيكية مؤشر يدعى ، thisإلى
الكينونة التي تم استدعائھا .ھذا المؤشر يدعى thisويعتبر معامل ضمني لجميع الدوال المنتمية .لذا ،في
داخل اي دوال منتمية ،المؤشر thisقد يستعمل لإلشارة إلى الكينونة المستدعاة.
نفذ البرنامج التالي وبين النتيجة التي حصلت عليھا ،ونقاش النتيجة التي حصلت عليھا
// this
>#include <iostream
{ class CDummy
public:
;)int isitme (CDummy& param
;}
{ )( 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اﻟﻣﻬﻣﺔ.
>#include <iostream
>#include <conio.h
// Derived class
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// 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();
getch();
}
ﺗﻣرﻳن) :(1اﻛﺗب اﻟﻧص اﻟﺑرﻣﺟﻲ اﻟذي ﻳﺣﻘق اﻟوراﺛﺔ اﻟﻣﻧﻔردة اﻟﻣوﺿﺣﺔ ﻓﻲ اﻟﺷﻛﻝ اﻟﺗﺎﻟﻲ ﻋﻠﻣﺎ ﺑﺎن اﻟﺻﻧﻔﺎن
اﻟﻣﺷﺗﻘﺎن ﻳﺣﺗوﻳﺎن دواﻝ ﺣﺳﺎب اﻟﻣﺳﺎﺣﺔ.
CPolygon
width : Integer
height : Integer
)(set_values
CRectangle CTriangle
{ class COutput
public:
void output (int i);
};
وﻳﻌطﻲPolymorphism أﻋﻣﻝ اﻟﺗﻌدﻳﻝ اﻟﻼزم ﻋﻠﻰ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻟﻳﺣﻘق ﻣﻔﻬوم ﺗﻌدد اﻻوﺟﻪ:(3) ﺗﻣرﻳن
:اﻟﻧﺗﻳﺟﺔ اﻟﺗﺎﻟﻳﺔ
Rectangle class area
Triangle class area
:اﻟﻘواﻟب
. واﻟﺗﻲ ﺗﻌﻣﻝ ﻋﻠﻰ ﺗﺑدﻳﻝ ﻣﺗﻐﻳران ﻣن ﻧوع ﻛﺎﺋن ﻣن ﻧﻔس اﻟﺻﻧفSwap اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﻳﻌرف ﻗﺎﻟﺑﺎ ﻟﻠداﻟﺔ
ﺗﻣرﻳن) :(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;}
};
// 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;
}
};
// 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();
}
// 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();
}
// 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++
ﺗﺗﻧــﺎوﻝ ﻫــذﻩ اﻟوﺣــدة ﺗﻌرﻳف ﻣﻔﻬوم ﻫﻳﻛــﻝ اﻟﺑﻳــﺎﻧــﺎت وﻣوﻗﻊ اﻟﻣﻠﻔــﺎت ﺑﻳﻧﻬــﺎ ٕواﻋطــﺎء ﻟﻣﺣــﺔ ﻣﺧﺗﺻ ـ ـ ـ ـ ـ ــرة ﻋن
اﻷﻧواع اﻟﻣﺧﺗﻠﻔﺔ ﻣن اﻟﺑﻳﺎﻧﺎت .وﻳﺗﻠو ذﻟك ﻣﻧﺎﻗﺷﺔ اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻓﻲ ﺗﻧظﻳم اﻟﻣﻠﻔﺎت وﺗﻌرﻳف اﻟﻣﻠﻔﺎت واﻟﻳﻧﺎﺑﻳﻊ،
وﻣن ﺛم ﺗوﺿــﻳﺢ ﻛﻳﻔﻳﺔ إﻧﺷــﺎء اﻟﻣﻠﻔﺎت اﻟﺗﺗﺎﺑﻌﻳﺔ واﻟﻌﺷ ـواﺋﻳﺔ وﻗراءﺗﻬﺎ وﺗﺣدﻳﺛﻬﺎ ،وأﺧﻳ اًر ﺗم ﺗوﺿ ــﻳﺢ ﻛﻳﻔﻳﺔ اﻟﺗﻌﺎﻣﻝ
ﻣﻊ اﻟﻛﺎﺋﻧﺎت ﻣن ﺣﻳث اﻹدﺧﺎﻝ واﻹﺧراج ﻓﻲ اﻟﻣﻠﻔﺎت.
أﻫداف اﻟوﺣدة
ﻳﻧﺗظر ﻣﻧك ،ﻋزﻳزي اﻟدارس ،ﺑﻌد ﻓراﻏك ﻣن دراﺳﺔ ﻫذﻩ اﻟوﺣدة ،أن ﺗﻛون ﻗﺎد اًر ﻋﻠﻰ أن:
#include <fstream>
#include <iostream>
#include <conio.h>
int main ()
{
char data[100];
// open a file in write mode.
ofstream outfile;
outfile.open("afile.dat");
// again read the data from the file and display it.
;infile >> data
;cout << data << endl
;)(getch
}
ﺗﻣرﻳن ) :(1اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻟﻛﺗﺎﺑﺔ ﻧﺻﺎ ﻓﻲ ﺳطرﻳن داﺧﻝ ﻣﻠف .example.txtﻣوﺿﺣﺎ ﻛﻳﻔﻳﺔ ﻓﺗﺢ اﻟﻣﻠف
ﻟﻠﻛﺗﺎﺑﺔ دون ﻣﺳﺢ ﻣﺣﺗوﻳﺎت اﻟﻣﻠف إن ﻛﺎن ﻣوﺟودا ﻣن ﻗﺑﻝ.
ﺗﻣرﻳن ) :(2اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻘراءة ﻣﺣﺗوﻳﺎت اﻟﻣﻠف اﻟﻣذﻛور ﻓﻲ اﻟﺗﻣرﻳن اﻟﺳﺎﺑق وطﺑﺎﻋﺔ ﻣﺣﺗوﻳﺎﺗﻪ ﻋﻠﻰ
اﻟﺷﺎﺷﺔٕ .وان ﻛﺎن اﻟﻣﻠف ﻏﻳر ﻣوﺟود ﻓﺈﻧﻪ ﻳطﺑﻊ رﺳﺎﻟﺔ ﺗﺑﻳن ذﻟك.
ﺗﻣرﻳن ) :(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;
}
int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}
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;
}
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;
}
عزيزي الطالب ،توجد الكثير من بيئات التطوير) (IDEsالمعتمدة ومنھا برنامج Code::Blocksو برنامج
Visual C++ Expressويعتبران من البرامج المجانية ،كما يوجد برامج أخرى مثل Borland C++
وبرنامج Visual C++وأخرى عديدة غير مجانية.
في ھذه الوحدة – عزيزي الطالب – سنتطرق إلى شرح كيفية إعداد واستخدام بيئات التطوير التالية:
) Code::Blocks -مجاني ومفتوح المصدر(
Visual C++ -من شركة ميكروسوفت وھو غير مجاني ،ولكن الشركة أصدرت نسخة مجانية منه اسمھا
.Visual C++ Express
في ھذا القسم –عزيزي الطالب -إن شاء ﷲ سنتطرق لشرح مصور لبرنامج . Code::Blocks
البعض يعتبره البرنامج االكثر سھولة في االستخدام والسالسة ،كما أنه يعمل جيدا على وندوز 7على عكس
بعض من البرامج األخرى.
برنامج الـ :Code::Blocksھو IDEمالئم جدا ،مجاني و يعمل على الـ ،Windowsو الـ،Mac OS
والـ .Linuxلغته المتوفرة حاليا ھي االنجليزية.
-1شريط األدوات
-2قائمة ملفات المشروع :توجد بيسار النافذة ،تحتوى على كل ملفات السورس المتعلقة بالبرنامج الذي
تعمل عليه .و بما أنھا فارغة حسب ما يظھر في الصورة ھذا دليل على عدم وجود مصادر سورس
في الالئحة حتى ھذه اللحظة.
-3المنطقة الرئيسية :ھنا المساحة التي تكتب فيھا الكودسورس للغتك الـ .C++
-4منطقة البيان :و يسميھا المبرمجون منطقة الموت ،و ھي المنطقة التي تعرض لك األخطاء التي
وقعت فيھا أثناء كتابتك للكود سورس ،طبعا متسلسلة بانتظام.
ما يھمنا اآلن ھو منطقة معينة خاصة من شريط األدوات
1-Compile :
كل الكود سورس الخاصة ببرنامجكم ستبعث لمصنف يقوم بالترجمة ثم يستخرج لنا الـ Code::Blocksملفا
قابل للتنفيذ أو باألحرى ملف تنفيذي .لكن إن اقترفت خطأ في الكتابة لن يترجم لك المصنف شيئا و ستظھر
األخطاء في منطقة البيان.
تقوم بتشغيل آخر ملف تنفيذي قمت بكتابة الكود السورس الخاص به .و ھذا عندما تريد تجريب البرنامج قبل
االنتھاء منه .وستعرف بنفسك أنه قبل التشغيل Executeيجب الترجمة Compileولكى نجرب ما توصلنا
إليه نضغط على األيقونة .3
عندما نقوم بالـ"ترجمة" فإن Code::Blocksلن يقوم بتشغيل سوى الملفات التي ّعدلت عليھا أو أضفتھا.
أحيانا فقط ،تضطر بأن تأمر الـ Code::Blocksبترجمة و تشغيل كل شيء .Recompile everything
كي تبدأ مشروعا جديدا ،توجه نحو ، : File / New / Projectستظھر لك نافذة اختر منھا "Console
"application
كما تالحظ-عزيزي الطالب ،برنامج الـ Code::Blocksيسمح بالعمل على أنماط كثيرة من البرامج
المختلفة ،منھا التي تعمل بمكتبات مشھورة كالـ SDLللـ 2Dو ألـ OpenGLللـ 3Dو الـ Qt
و wxWidgetsللـ نوافذ ..إلخ ،ھذه المكتبات غير مثبتة على جھازكم بعد ،و بھذا ال يمكنكم جعلھا تعمل.
بعدھا سيأتيك اختيار بين لغتي الـ Cأو الـ ،C++اختر الـ .C++
سيطلب منك اآلن أن تدخل اسم المشروع ،و كذا المسار الذي تختاره كي يحفظ فيه.
آخر خطوة تطلب منك ھي ،كيف ينبغى أن يترجم البرنامج ،يمكنك ترك االختيارات على حالھا ،لن يكون
لھذا أي تأثير على ما سنقوم به اآلن ،قم بتحديد زر"Release" .
في الخانة الخاصة بالمشاريع على اليسار ،إضغط على ' '+لتوسيعھا قليال ،و تظھر قائمة الملفات في
المشروع.
اآلن تم فتح مشروع خاص بك وما عليك اال بكتابة الكود والباقي على البرنامج،
سيقوم بفتح ملف تنفيذي يفتح بواسطة ال: MsDos
تشغيل مثال بسيط:
النتيجة:
اﻟﻘﺳم اﻟﺛﺎﻧﻲ :ﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ Microsoft Visual C++
ﻳﻣﻛﻧك ﻋزﻳزي اﻟطﺎﻟب ﺗﻧﻔﻳذ ﺑراﻣﺞ ﻟﻐﺔ ﺳﻲ ﺑﻠص ﺑﻠص ﺑﺎﺳﺗﺧدام اﻟﻌدﻳد ﻣن اﻟﻣﺗرﺟﻣﺎت ﻣﺛﻝ، Borland :
Microsoft Visual Studio 6.0 ،Turbo c++ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو ﻧﻣط 6او اﺣدث ﻣن ذﻟك.
ﻣﺣرر اﻷﻛواد
ﻣﺛﻝ ﺑﺎﻗﻰ ﺑﻳﺋﺎت اﻟﺗطوﻳر ﻳﺣﺗوى اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو ﻋﻠﻰ ﻣﺣرر أﻛواد ﻳدﻋم ﺗﻌﻠﻳم اﻟﺻﻳﻐﺔ واﻻﻛﻣﺎﻝ اﻟﺗﻠﻘﺎﺋﻰ
وﻳﺳﺗﺧدم أﻳﺿﺎ ﺗﻘﻧﻳﺔ اﻧﺗﻠﻳﺳﻧس ﻟﺗﺳﺎﻋد اﻟﻣﺑرﻣﺞ ﻓﻲ ﻛﺗﺎﺑﺔ اﻟﻣﺗﻐﻳرات واﻟدواﻝ واﻟوﺳﺎﺋﻝ واﻟدورات ﺑﺳرﻋﺔ ،وﻳدﻋﻣﻬﺎ
اﻟﻣﺣرر ﻓﻲ ﻛﺗﺎﺑﺔ ﺟﻣﻳﻊ ﻟﻐﺎت اﻟﺑرﻣﺟﺔ واﻟﺗرﻣﻳز اﻟﺗﻲ ﻳﺣﺗوى ﻋﻠﻳﻬﺎ اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو.
ﻳدﻋم ﻣﺣرر أﻛواد ﻓﻳﺟواﻝ اﺳﺗودﻳو أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ وﺿﻊ ﻋﻼﻣﺎت ﻣرﺟﻌﻳﺔ ﻓﻲ اﻟﻛود ﻟﻠﻣﺳﺎﻋدة ﻓﻲ اﻟﺗﺻﻔﺢ اﻟﺳرﻳﻊ،
ﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ collapsing and expandingﻣﺟﻣوﻋﺎت اﻷﻛواد واﻟﺑﺣث واﻻﺳﺗﺑداﻝ ﻓﻲ اﻟﻛود ,وﻳدﻋم
أﻳﺿﺎ code snippetsوﻫﻰ ﻗواﻟب ﺟﺎﻫزة ﻣن اﻟﻛود ﻳﻛﻣن ادراﺟﻬﺎ وادﺧﺎﻝ ﺗﻐﻳﻳرات ﻋﻠﻳﻬﺎ داﺧﻝ اﻟﻣﺷروﻋﺎت
اﻟﺟﺎرى اﻟﻌﻣﻝ ﻋﻠﻳﻬﺎ وﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ اﻋﺎدة ﻛﺗﺎﺑﺔ اﻟﻛود.
ﻳﻘوم ﻣﺣرر اﻷﻛواد أﻳﺿﺎ ﺑوﺿﻊ ﺧطوط ﺣﻣراء أﺳﻔﻝ اﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﺧطوط ﺧﺿراء أﺳﻔﻝ اﻻﻧذرات.
ﻣﺗﻌﻘب اﻷﺧطﺎء
ﻳﺣﺗوى ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻋﻠﻰ ﻣﺗﻌﻘب أﺧطﺎء ﺗدﻋﻣﻪ ﺟﻣﻳﻊ اﻟﻠﻐﺎت اﻟﻣدﻋوﻣﺔ ﻳﻛﺷف أﺧطﺎء وﻗت اﻟﺗﺷﻐﻳﻝ
واﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﻳﺳﻣﺢ ﺑوﺿﻊ ﻧﻘﺎط ﺗوﻗف ﻋﻧد ﺳطور اﻟﻛود واﻟﺗﻲ ﻳﺗوﻗف اﻟﺑرﻧﺎﻣﺞ ﻋن اﻟﻌﻣﻝ ﻋﻧدﻣﺎ
ﻳﺻﻝ ﻟﻬذا اﻟﺳطر.
ﻳوﺟد أﻳﺿﺎ ﻓﻲ ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻧﺎﻓذة immediate windowواﻟﺗﻲ ﺗﺳﻣﺢ ﺑﺗﺟرﻳب اﻟدواﻝ أﺛﻧﺎء ﻛﺗﺎﺑﺗﻬﺎ.
في ھذا القسم – عزيزي الطالب – سوف نشرح كيفية كتابة أول برنامج لك بلغة الـ C++وباستخدام Microsoft
Visual C++وھي بيئة تطويرية أخرى يمكن أن تتعامل معھا من أجل التمكن من االنتقال إلى برمجة تطبيقات ويندوز
باستخدامھا.
-2تحصل على النافذة كما في الشكل التالي ،من الصفحة Workspacesسيظھر Blank Workspaceوھو
مكان العمل الذي سوف توضع فيه مشاريعك .
-3عند خانة Workspace nameأدخل اسم ) مثالً اسمك( ،يمكنك تغيير مكان التخزين عن طريق الخانة
.Location
-4اآلن ولنقوم بتشكيل أول مشروع يحب علينا اختيار األمر Newمن القائمة Fileلتحصل على نفس الشاشة
التي حصلت عليھا مسبقا ً ولكن الصفحة Projectsھي التي ستظھر أمامك بدالً عن .Workspaces
-5اختر ،Win32 Console Applicationعلى يمين النافذة وعند خانة Project Nameاكتب اسم
مشروعك وليكن ،Prog1بشكل افتراضي سوف يقوم الفيجول سي ++بإنشاء دليل بنفس اسم المشروع
ويضع فيه جميع الملفات التي سوف تضيفھا الحقا ً لمشروعك .
-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
مواضيع اللقاء
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:
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
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
مواضيع اللقاء
Students
<<public>> id : Integer
<<private>> name : String
<<protected>> birthdata : Date
الجابة
class Students {
private:
char name[30];
protected:
Date birthdata;
public:
int id;
int age(){ return now -birthdata;}
};
اذكر ثلثة من الخصائص الساسية للغات البرمجة
الكينونية الجيدة.
• الجابة:
– أن يكون يرنامجا صحيحا :وذلك بان يقوم بأداء الوظيفة
المحددة في مرحلة التحليل و التصميم دون وجود أخطاء.
– أن يكون برنامجا فعال :يقوم بوظيفته من خلل الستغلل
المثل لنظام الحاسوب ومكوناته.
– قابل لعادة الستخدام :وذلك بان يبنى من مكونات يمكن
الستفادة منها في بناء برامج أخرى.
– أن يكون برنامجا مرنا وقابل للتكيف مع الظروف والبيئات
التي سيعمل بها.
– أن تكون تكلفة صيانته منخفضة.
هناك طريقتان لحجز الذاكرة
لكائن ما ،اشرحهما مدعما الجابة
بجمل لغة ++Cالمستخدمة لكل
طريقة.
هناك طريقتان لحجز الذاكرة لكائن ما ،اشرحهما مدعما
الجابة بجمل لغة ++Cالمستخدمة لكل طريقة.
الطريقة الديناميكية :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) :علمات(
>#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للشارة إلى انتهاء
القائمة المتصلة.
اكتب ببنائين لهذا الصنف بحيث نستطيع إنشاء كائنات من هذا الصنف
بطريقتين:
الولى مع إعطاء قيم ابتدائية للكائن –
والخرى بدون إعطاء قيم حيث يتم إعطاء قيمة تلقائية تساوي صفر لرقم الطالب. –
)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];
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
مواضيع اللقاء
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;}
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. }
جامعة القدس المفتوحة
كلية التكنولوجيا والعلوم التطبيقية
السبت 2017-10-14
مواضيع اللقاء
النصناف والتراكيب
الدوال
المؤشرات
السؤال :+++++
(1نصنف السيارة التي لها الخصائص " السرعة) (sو اللون ) (cو الوزن ) "(wوالعملية " تغيير
السرعة)"(changeاجب على ما يلي:
(1مثل نصنف السيارة باستخدام الرمز الخاص بذلك .
(2اكتب المقطع البرمجي لصنف السيارة مستخدما مفهوم التركيب.
( 3اكتب المقطع البرمجي لصنف السيارة مستخدما مفهوم الصنف.
(4عرف مصفوفة بحجم 40عنصرا من نوع التركيب السابق ،ثم خزن القيمة 100للسرعة
للعنصر السادس.
السؤال :+++++
قبل الجابة على هذا السؤال يجب ان يمتلك معرفة بــ :
قبل الجابة على هذا السؤال يجب ان يمتلك معرفة بــ :
;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;}
يلي:
}
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;
أنظر الشكل المجاور والذي يمثل قائمة متصلة ثم أجب عن السئلة التي أدناه:
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. }
انتهى اللقاء
جامعة القدس المفتوحة
كلية التكنولوجيا والعلوم التطبيقية
إعداد وتقديم:
أ .عيسى أسعد /منسق المقرر
فرع رام ال والبيرة
السبت 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
: فتح الملف
فتح باستخدام البناء
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
إعداد وتقديم:
أ .عيسى أسعد /منسق المقرر
فرع رام ال والبيرة
السبت 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
: فتح الملف
فتح باستخدام البناء
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
الثلثاء 21/10/2014
مواضيع اللقاء
Students
<<public>> id : Integer
<<private>> name : String
<<protected>> birthdata : Date
الجابة
class Students {
private:
char name[30];
protected:
Date birthdata;
public:
int id;
int age(){ return now -birthdata;}
};
اذكر ثلثة من الخصائص الساسية للغات البرمجة
الكينونية الجيدة.
• الجابة:
– أن يكون يرنامجا صحيحا :وذلك بان يقوم بأداء الوظيفة
المحددة في مرحلة التحليل و التصميم دون وجود أخطاء.
– أن يكون برنامجا فعال :يقوم بوظيفته من خلل الستغلل
المثل لنظام الحاسوب ومكوناته.
– قابل لعادة الستخدام :وذلك بان يبنى من مكونات يمكن
الستفادة منها في بناء برامج أخرى.
– أن يكون برنامجا مرنا وقابل للتكيف مع الظروف والبيئات
التي سيعمل بها.
– أن تكون تكلفة صيانته منخفضة.
هناك طريقتان لحجز الذاكرة
لكائن ما ،اشرحهما مدعما الجابة
بجمل لغة ++Cالمستخدمة لكل
طريقة.
هناك طريقتان لحجز الذاكرة لكائن ما ،اشرحهما مدعما
الجابة بجمل لغة ++Cالمستخدمة لكل طريقة.
الطريقة الديناميكية :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) :علمات(
>#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للشارة إلى انتهاء
القائمة المتصلة.
اكتب ببنائين لهذا الصنف بحيث نستطيع إنشاء كائنات من هذا الصنف
بطريقتين:
الولى مع إعطاء قيم ابتدائية للكائن –
والخرى بدون إعطاء قيم حيث يتم إعطاء قيمة تلقائية تساوي صفر لرقم الطالب. –
)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];
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
لمعالجة أي حقل في التركيب نذكر السم المتغير ثم نقطة
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
تعريف الصنف هو تعريف لنوع جديد من البيانات،
;)P1.increaseRent(100.0
10
الدلوال المنتمية
كتابة الدالة المنتمية تشبه الدالة العادية بالاضافة الى تحديد
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
من خلل البناء نقوم بإعطاء القيم اللولية للمتغيرات عند انشاء أي كائن
جديد
السم البناء هو نفس السم الصنف
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
ما يعرف الدالة ليس السمها فقط بل عدد العوامل لونوعها.
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
30
الدلوال لومصفوفات الكائنات
يمكن ارلسال مصفوفة من الكائنات الى دالة كما في المصفوفات
العادية لولكن التعامل داخل الكائن يكون من خلل الدلوال المنتمية
فقط
مثل نريد كتابة دالة لحساب معدل معدلت كل الشعبة
اذا كان الرقم المطلوب نفس الرقم الذي في المنتصف فقد لونصلنا
اما اذا كان الرقم اكبر من القيمة في المنتصف نبحث في القسم الخير
32
احتواء مصفوفة من الكائنات في نصنف
الن نريد تعريف نصنف،كنا نعرف نصنف مكون من متغيرات لودلوال منتمية
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;}
36
المؤشرات
هي متغيرات تحتوي قيم تسمى عنالوين لوتستخدم للشارة
37
اذا اردنا لواضع قيمة في المتغير الذي يشير اليه المؤشر yنكتبه
كالتالي
; *y=4
أي اننا لواضعنا 4في المتغير الذي يشير اليه yلوهو xأي ان
*Y=4 Y=&x
38
عنوان المتغير:&
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
x1 x2 t p
X2=t; z A A 1293
41
مؤشر الى مؤشر
مؤشر يؤشر على مؤشر اخر
;’Char p1=‘a
;Char *p2
;Char **p3
42
المؤشرات لوالنصناف
يمكن الستخدام المؤشرات للتاشير على كائن الو تركيب كما هو الحال في المتغيرات العادية
43
كذلك نتعامل مع الكائنات بنفس الطريقة
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
حجز المصفوفات بطريقة ديناميكية
في السابق عندما كنا نعرف مصفوفة كنا نحدد حجمها
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
كل عقدة تحوي مؤشر يؤشر على العقدة التالية ،لذلك كل
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
متى تستخدم الدلوال الصديقة
اذا كانت الدالة تتعامل مع كائنات من انصناف مختلفة في
نفس الوقت
اذا اردنا تحميل الدالة اكثر من تعريف
64
النصناف الصديقة
من الممكن ان يكون هناك عدد كبير من الدلوال المنتمية الى
نصنف معين لوفي نفس الوقت نصديقة لصنف آخر ،هذا يؤدي الى
لواضع عدد كبير من النماذج داخل النصناف.
لذلك نضع الصنف نفسه نصديق لصنف آخر ،هذا يمكن الدلوال
المنتمية للصنف اللول قادرة على التعامل مع القسم الخاص في
الصنف الثاني
{Class node
;student data
;node *next
};friend linkedList
65
العمليات 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
تمثيل المجموعات لوالعمليات عليها على شكل نصنف
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
النصناف المشتقة لوالوراثة
مثال موظفي الجامعة
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();};
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
الدلوال لوالنصناف القالبية
الدلوال القالبية :تعريف دالة بحيث تقبل أي نوع من البيانات ،أي تأجيل تحديد
80
النصناف القالبية
بناء نصنف عامم بحيث يكون نوع المتغيرات فيه غير محددة أي
81
template <class T, int maxSize>
class section{
T sec [maxSize];
….};
لوقيمةT لتعريف كائن من هذا الصنف يجب ان نحدد نوع
maxSize
section<student, 50>cs90;
section<postGrade, 50>cs90;
82
اما عند تعريف دالة منتمية لصنف قالبي يجب ان تسبق
83
تعدد اللوجه polymorphism
لو عرفنا مصفوفة من النوع propertyتحتوي
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
الوراثة
ولحل هذ ه المشكلة تزودنا لغة ++ 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;}
};
الصنف المشتق
حيث يحتوي هذا الصنف،house وكمثال على ذلك اسنعرف الن أول صنف مشتق وهو الصنف
مساحةBArea يمثل المتغير.GArea وBArea على متغيرين منتميين جديدين خاصين به هما
. مساحة الحديقةGArea البناء بينما يمثل المتغير
لنعرف الن الدوال المنتمية للصنف المشتق houseولنبدأ بالبناء .لحظ ،عزيزي الدارس ،أن لهذا البناء قيما
تلقائية.
إن كل ما يفعله هذا البناء هو ااستدعاء البناء الخاص بالصنف الاساس وذلك حتى يتم إعطاء قيم ابتدائية للمتغيرات
المعرفة في الصنف الاساس وهي Priceو Monthly_Rentفي مثالنا .لحظ أننا واضعنا العبارة
): property(P,Rent
في نهاية ترويسة البناء حتى تتم عملية ااستدعاء البناء propertyالخاص بالصنف الاساس .وبالطبع ليس من
الضروري واضع هذ ه العبارة على اسطر جديد .بعد ااستدعاء البناء propertyيتم تنفيذ الجمل الموجودة داخل
البناء houseوالتي تقوم بإعطاء المتغيرين BAreaو GAreaقيما ابتدائية .أن هذا شكل آخر لعادة ااستخدام
الدوال عن طريق ااستدعائها في الموقع المنااسب.
الصنف المشتق
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;
};
الصنف المشتق
لظحظ ،عزيزي الدارس ،أ ن هذا الصنف يضم بالاضافة إلى المتغيرين priceو Monthly_Rentالمتغير Areaوالذي يمثل مساظحة الشقة .ولذا فإ ن البناء
الخاص بهذا الصنف يقوم بعد استدعاء البناء الخاص بالصنف الساس بإعطاء هذا المتغير قيمة ابتدائية.
واسنعرف هذا الصنف كصنف. والذي يمثل عمارة متعددة الطوابقMulti_Building واسنعرف الن الصنف
)والذي يمثل مساحة كل شقة لهذا الصنف( بالاضافة إلىArea وذلك حتى نور ث المتغيرflat مشتق من الصنف
.Monthly_Rent وPrice المتغيران
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 في الحقيقة نحن لم نستفد في مثالنا أعل ه من جميع المزايا التي تمنحنا إياها لغة
انواع الوراثة
• الوراثة الخاصة:
• إذا اسبق ااسم الصنف الاساس بالكلمة privateفهذا يعني أن نوع الوراثة
هي وراثة خاصة .وفي هذ ه الحالة تور ث جميع المتغيرات والدوال المعرفة
في القسم المحمي protectedوالعام publicمن الصنف الاساس بحيث
تصبح خاصة في الصنف المشتق )كما لو كانت معرفة في القسم الخاص
من الصنف المشتق(.
• أم ا بالنس بة للمتغيرات والدوال المعرف ة ف ي القس م الخاص م ن الصنف
الاساس فإن الدوال المنتمية للصنف المشتق ل تستطيع معالجتها .ويقال في
هذ ه الحالة أنها غير قابلة للمعالجة inaccessible.وهي عبارة غير دقيقة
تماما إذ يمكن معالجتها في الصنف المشتق لكن بااستخدام الدوال المنتمية
للصنف الاساس فقط والمعرفة )أي الدوال( في القسم العام أو المحمي.
انواع الوراثة
الوراثة المحمية:
أما إذا اسبق ااسم الصنف الاساس بالكلمة protectedفإن الوراثة في هذ ه
الحالة وراثة محمية . protectedوفي هذ ه الحالة فإن المتغيرات والدوال
المعرف ة ف ي القس م المحم ي protectedوالعام publicم ن الصنف
الاساس تصبح محمية في الصنف المشتق )كما لو كانت معرفة في القسم
المحمي من الصنف المشتق(.
أم ا بالنس بة للمتغيرات والدوال المعرف ة ف ي القس م الخاص م ن الصنف
الاساس فإن الدوال المنتمية للصنف المشتق ل تستطيع معالجتها .ويقال في
هذ ه الحالة أنها غير قابلة للمعالجة inaccessible؛ إذ ل يمكن معالجتها
ف ي الص نف المشت ق إل بااس تخدام الدوال المنتمي ة للص نف الاس اس فقط
والمعرفة )أي الدوال( في القسم العام أو المحمي.
جامعة القدس المفتوحة
مركز التعليم المفتوح OLC
القوالب
أما بالنسبة لطريقة ااستدعاء الدالة القالبية فل تختلف عن طريقة ااستدعاء الدالة
العتيادية ،والمثال التالي يواضح كيفية ااستدعاء الدالية القالبية أعل ه للمقارنة بين
رقمين صحيحين.
)(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 هو عامل من عوامل هذا الصنف القالبي كما اسنستخدم عامل آخر لهذا الصنف
.عدد عناصر الشعبة
عند إنشاء كائن من هذا الصنف القالبي يجب تزويد هذ ه العوامل ) 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؛ بحيث تقوم هذ ه العملية بطباعة البيانات المطلوبة لكل نوع من الطلبة.
راجع ،عزيزي الدارس ،الوحدة السابقة لمعرفة كيف تعرف العمليات.
;*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 A=10
;int B=100
;max(A,B)=5
إن نتي جة تنف يذ هذ ه الجم لة هي تخز ين القي مة 5في
المتغير صاحب أكبر قيمة وهو المتغير .B
جامعة القدس المفتوحة
مركز التعليم المفتوح OLC
الدوال الصديقة
مثال:
لتعريف الدالة averageوالتي تجد معدل علمات طالب ما
كدالة صديقة للصنف studentنضع النموذج:
;)friend double average(student s
• 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
النصناف الصديقة
مثال:
ع لى سبيل المثال لنفرض أن لدي نا الصنفين 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; }
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؟
تذكر عزيزي الطالب:
للصنف . 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;
}
العملية >> معرفة كعملية نصديقة
للصنف
لحظ ،عزيزي الدارس ،أن للعملية >> عاملين هما:
#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
الخرج من البرنامج يبدو كالتالي:
) ( main
{
;)test a(12
;) (a.print
;return 0
}
الكلمة المفتاحية This
وللتوضيح فإن العضو الدالي printيقوم أول ل بطباعة x
مباشرة ،ثم يستعمل طريقتين للوصول إلى xباستعمال
المؤشر : this
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
{
cout<< (hour < 10 ? “0” : “ “ ) << hour << “:”
<< (minute < 10 ? “0” : “ “) << minute << “:”
<< (second < 10 ? “0” : “ “ )<< second;
}
المعامل ت الساكنة
نفترض ان نا نر غب في تمر ير احدى المعاملت كمرجع
لزيادة كفاءة البرنامج مع عدم تمكين الدوال في العبث
في قيمة هذا المعامل ،فماذا نفعل؟؟؟؟
جطضةػاضطبارةػcout
د د س د ما د
د سد ي د س د ما ، د د د coutإ خ د د س د ما
د )( printfأ ا س م ف ذ غم ، م ذ ض
: ص م ، %d …. ا
; "cout << "yousef anaya
: ص م ي س ي ، ض سس س ز أ أس ذ ي
; cout << x
صد ا ذ ض ص أ ما ا زز اس ا
د دم ي د د د د ،د يد ص "" ،ذ ز
. ء ،ا ص س ،ذ ض مي س
: س ما م خ ذ م ،ي ذ م ،أ س ي
; cout << &x
د د يد دم س د دذ د سد د يد دس د د دم د فس س
. مي ا م م خم ذ ، م
سد ما ضد د دم د د س س م م ي س ما ذ س ا يم
: ص ا
; "cout << "yousef" << "anaya
د دم س أ دم د دم سد ما << ،د د ا خد د د اس زز سا
م يد ساس م ز ض ا ،
: ا
;int x=5
; cout << "yousef" << "anaya" << x
دم y=5.8 دذ دم x=4 د د د دم د ضد ي سد ي ي سغد د اس زز ا
: س ذ يس
4 5.8
د ما ةح ي س م س ذ م ض ا ، ص
ذ : س م اا yousef anaya
yousef
anaya
: أ م س ما س
;"cout << "yousef
;"cout << "anaya
ا ج حم ةح ، أ ا زز اس سا
دا ا د مد ف يد ذ د ة حد سد د دا صد ةح ، ، 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. }
ػ
طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػادطكػسيػدطرغنػ ػ
: س ا
;cout << i << endl
اضداضةػ) ( 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ػبادتخدامػعذهػاضداضةػثمػاطبدػطعاطضةػباادصيػ .ػ
تدرغبػ:ػػاصتبػبضغةػاضديػادخالػاضرشمػ5ػبادتخدامػعذهػاضداضةػثمػاطبعهػصرشمػرضىػاضذاذةػػ .ػ
اضداضةػ) ( putchar
مس ا ي خذ ذ ةح ، اي م ذ ا س ما
ذ ا ا س م ز اس ي مم ةح ا س ،ذ ص ا
ا ذ ا ي ، م اس ص ا ا ذ ا ةح ذ
stdio.h
: ص
)int putchar ( int x
. اس ةح س م مز :x
طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػاظكارػاضرطزػ(ػaػ)ػرضىىػاضذاذىةػبادىتخدامػعىذهػاضداضىةػثىمػاطبىدػاضقغطىةػ
اضطصاسئةػضهػباادصيػ ػ
تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػ،ػضتطوغرػبرظاطجػاضرشمػاضدريػاضدابقػ،ػبحغثػغظكرػظجطهػرظدػادخالػ
أيػرطزػطنػرطوزػاضبادوردػبادتخدامػاضداضةػ) ( putcharػ،ػثمػاطبدػاضرشمػاضدريػرضىػاضذاذةػ ػ
اضداضةػ) ( putsػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
طاػعيػاضداضهػ؟ ػ
خدم خد د سد ء د د د د مء م س ا
صد مد د زء أ م خذ ذ ا س
ي ، م سخصي ء ا س س س س
. اا مج س main ،ي ا ء ا ذ ا . م
اعطغةػاضدوالػ :ػ
ضضدوالػاعطغةػصبغرةػطظكاػ :ػ
. ذم س ي سا ء ا ذ م خصس .س ا
دا د دم ةد س " ا ح ،ي ا ذ م مسي خ .اي
ة ء" . سا ي
م خ ا ي ذ م يم م م س .يم
مي ذ م ذ س ا . ئ يذ
. سم ذ م م .خصس
د دا دز ء أ د سد م د ،أ ا ص مي م .س
م اا ا ذ أ خ مص ا
ا. يم خم
اظواعػاضدوالػسيػضغةػاضديػبضسػبضسػ :ػ
. مم س م ق خذ .
. س مم ا ا ا م ق ا خذ .
. مم ا س ا م ق خذ .
. س مم ا ا ا م ق ا خذ .
د خدذ د سد دم سد ا ج ي د ، د يد د سد د د ذد د د سد ا ء ا د د
. حم ذ ا س ا س ا
نوع القيمه المرجعه )…… , ………..,اسم المعامل الممر نوع المعامل ( اسم الداله -
.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,
{
}
طثالػ:ػاصتبػبرظاطجػبادتخدامػاضديػبضسػبضسػادخالػرشمػطنػاضطدتخدمػطنػاضظوعػاضعدديػاضصحغحػسيػداضةػ
سررغةػثمػشمػبحدابػتصعغبهػثمػارجدػاضقغطهػاضطربعهػواطبعكاػسيػاضداضةػاضرئغدغةػ .ػ
ػ
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. }
ة ة ة ثة قة ة ة صةف ف ة ة ج غ ج : ث
ا اصغ
ػ
تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػااردادػاضزوجغةػاضطحصورهػبغنػ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. } ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
،أ دا د م د د د أد د ،د صف ح ء م س اضترصغب
دا ، د ي م ، ،غم ز ساس م ز م أ أ ص
ة حة صةف ف ة دم ،ة دم د د د أ س م أ
س س س. س م ي م م ،ذ ف ص
ذ د ذ ف،ي فس أ س ص م أس زز اس م
دذ د مدز د أ سد ما صد ي ة ظجة غ ة ،ي د صد صة رة (
أ دم ،د د دذ م ء ، م أ أ ص ي ا ،ا
د :سد م دذ صد ف أ دم د خ صد دف د " ةد " د ا د ا صف د د أخذ ا
،د سد د " خد م د دذ صد ف " ةد دف سد ذ ،ي ذ سد اس
،ي ذ صفح ا ا ي م ،ذ م م اس سم س م
دذ د د ، ذ صف اا م مف س صف ،س ةم أ ا
د س د ا ا ا ، م ،ا سص ف خم ،أ ا ا
د د سد د ،د يدم د احد اسد ما يد م م د ا صد ا د حد ،ذ ذ ص
د صد د دم يد دذ م س ، م ء م م م س س سي
ج " ة ". م م
اضفرقػبغنػاضبرطجةػاإجرائغةػواضبرطجةػاضذغئغةػ"ػاضصغظوظغة" ػ
ػ
ذ : صفح س إ مج م س ما م اس زز
اضبرطجةػاضذغئغةػاوػاضبرطجةػاضصائظغة ػ
بظاءػاضترصغب ػ
ػ
> #include < ___________ .h د ز د د د م ددا م ددف أ م د ددا
> #include < ___________ .h
> #include < ___________ .h م صد م " " struct مص
م د ددذ م ددا ج د حددم س د ددا د ددم د دس
ئ 1. struct م د يد ذ د حدم أ س م د ةدم
{ 2. : م ، مف
3. …………………. ; س ج م دم د س اسد ي ا س م د سد ا .
4. …………………. ; م . مف م
5. …………………. ;
6. …………………. ; م ذ س م سي ا ذ .
7. …………………. ; ددم دداس سدد س " _ " د دد دد ي دد د
8. …………………. ; س ج م ا ا . ا أ سي ا
; } 9. د د د ز د ددا ا د سد م د .
) ( void main س ما دس ....... delete newغ م ،ذ س
{ دد حددم دد دد ز دد newدد ا دد
خم . س ا اس س س
}
- - ر
دم أ س دز خد ص حد س سد ي س ا .
. س ، + ، ! ، @ ، # ( :ط .... ، . ، / ، = ،خ ،ا ح س ا اس س س ي
اس د ا د د سد ا د أ د ددم د م د سد ا د سد م د د ددا سد ء .
س ما س .
} ; car ( ) { a = 0
; 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.
ذ : اس
ة ة صة ة ( :ة شة ة غة TVظ ث ف ف :
ة ة ثة ة ة صح ح ،ثة شةئ ة ئ ص 2ظ ف،
ج. ث ئ ث ا ئ ا ث أ ا ئ ش
strcpy ج .س ج م ‘ " ج م خ سم ما " ;
ضد د ة ، ةئ ة غ ح خ ما ا
د دج دم د خد سدم د م دا م زد س سد د د د ، ص ا
: ا سي س n -1 م
سدخ حدم م د د – د م د دج yا د دج xد د
. م ي مز ساس
. - م ي Officer م ج y
>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. د حد ء ذ ح ء م خ ا مج س أ
خم .
م ا أ ذ اس م ج م س زز ا
: خذ ذ س ما خ أ م ذ س ،ي ذ م خ
ظة ف ة ة ة ة ة ج ة ة ة laptobح ة ة ا ة ة :ة ف ثة
ة 2ظة ف ثة ة ف ة ئ ة ة ة ة ة float ظ غ خ
؟ ح ج ئ خ xحث
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. }
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. }
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. }
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 ;
23. getch();
24. }
اظذاءػطصفوسهػطنػاضصائظات ػ
؟ ج د ،د ذ سد دم د ا ، م س خص ج س زز اس م
ةدئ جد ،ي دذ د س د د دا د اخم ؟ ذ يد د د دا ا ج مف ذ س
د د د سد ،ي دذ دج د ةد ء د د دا دا اسسد يدا د د ج د ا 555د ج 55
د د د ةد ،سد صد ي ج د ي د جد م ف ا دم د ا ،ا ص ص م
ص ي . م ج ةء اا م
د د د جد مددز س د ي ددف س د صددم د د صد ي د د د سد
د سد صدم د ص ي س أ س ج مز م ، م
أ س ج . ج
24. cout << "name" <<"\t" << "tel_number" << "\t" << "person_number" << "\t" << "person_address" << endl;
cout << "------------------------------------------------------";
ردةػتراصغبػسيػبرظاطجػواحد ػ
ة 2 ة ة ة ة ة (: غ boyح ف ث :8
ثة ة ف ة ة ة ة خة ة فة ة ة ف ةئ صح ح ،ث ظ ف ،ق
ة 2 ة ة ة شة ص ة ة ة (: ة غة ة personح ة خ
ثة ئ ا boyخ ئ خ ح صح ح ،ث ظ ف ،ق
person؟
م س اخ م ج س ا يstudent م ج w ج
. ذ ما
صغفغهػاضوصولػوطعاضجةػطتغغراتػاضترصغبػاضداخضيػ :ػ
A, صا ا س ا ذ ة اخ م ،ي اس زز
صد ا A د صا Bاا خ صا Aي ا ما Bصا B
د د م د B د A اخ ي ي م ذ صا ،B ص ا
د " دذ ج " ا ص ج ي ذ ص
ذ . ذ ا صا اا ي ا ما ص
د ددا د ددم أ د م د د سد د ج ا د م د ددا خ د د د ي ددا
صد ا اخدم د د دج د د ص د صا ، م صا
س ص م صا اي ذ اخ م م ج ذ س
س . مء اخ م ا ص ذ م ذ ما
ي ص ي ج **
مصص س س student س م م
اضداضةػحدابػطولػاضطصفوسةػ)( strlen
ػاضداضةػ) ( getline
بعدػاضظصفيػ ػ
غم د ، د د اصد س يم ا خم صا ا
دا صد ف سد ،أ د د خ م ف صد ف د ا زز اس ا
سد مد ص ، privateي م د خد د د م د دا دذ صد ف دذ ا س
سد د دمف د د د صد ف د س ا أ م صف ةم ا زز اس
دا د يد دا صد اس ء ا ،أ س س ،ص ف خم س
د يد صد ف دذ ا د مف دء ي س م ،ي ا ما ةء ص س س
د خ م اخم اص ،يم ج ي صف م ا
م ء ذ ا ي م خذ ج ، س اص م ،ي ي س
د س دذ ؟ ي دا يدم د د د اصد دا ذ د يد ذ ا ي د سد مءص ا س
دذ د ي م سد مد سم ي د ء ذ س ا ذ ة اس ا س
د ،ي د د د د اص ذ ا صا صا أ ا س ،ي ء ي ذ م
ذ : خذ ا . خ اص ذ ا ي ، ء س ا م ي
ة ة ة (:ا غ personح ث ح صف ث :
ثة ة ف ة صة غة خ ص ف ،ث ظ 2ظ ف،
صف. ث شئ ئ ظ خ
تضخغصػ :ػ
.1ػاضداضهػاضصدغقهػرظدػادتدرائكاػغجبػانػظطررػضكاػصائنػطنػظفسػاضصظفػاضتىيػتصىونػصىدغقهػضىهػ،ػحغىثػانػاضداضىهػ
اضصدغقهػعيػداضهػزغرػػػػطظتطغهػأيػاػتدتطغدػاضوصولػاضىػاضطتغغراتػاضطظتطغهػضضصظفػبذصلػطباذرػااػرىنػطرغىقػ
صائنػ .ػ
.2ػرظىىدػاظذىىاءػداضىىهػشىىراءهػصىىدغقه ػايػصىىظفػغجىىبػانػغصىىونػتطرغىىرػاضصىىائنػػبااذىىارهػوذضىىكػضحفىىظػاضقىىغمػداخىىلػ
اضطتغغراتػاضطظتطغهػضضصظفػ .ػ
. 3ػسيػحالػوجودػاصثرػطنػداضهػصدغقهػسإدمػاضصائنػاضططررػضكاػضىغسػضىهػأيػراشىهػ،ػباضىدوالػااخىرىػوانػتذىابهػ،ػأيػ
باطصاظظاػادتخدامػظفسػادمػاضصائنػاوػاضعاطلػاضططرػسيػجطغدػاضدوالػحتىػاضداضهػاضرئغدغهػ .ػ
.4ػغطظدػطظعاػباتاػاعاسهػاضصضطهػfriendػسيػظطوذجػاضبظاءػاضخارجيػضضداضهػاضصدغقهػأيػاضذيػظبظغهػخارجػاضصظفػ .ػ
.5ػشضبػاضبرظاطجػعوػاضداضىهػاضرئغدىغهػ) ( mainػ ،ػأيػانػتظفغىذػاضصىودػاضبرطجىيػغبىداػطىنػاولػجطضىهػسىيػعىذهػاضداضىهػ
وغظتكيػباخرػجطضهػسغكاػ .ػ
ػ
تطرغنػ:ررفػصظفػادطهػTVػ،ػبحغثػغحتويػرضىػاضطتغغراتػاضطظتطغهػاضتاضغىهػ:ػ(ػادىمػاضتضفزغىونػوػصىذضكػ
دعرهػبحغثػغصونػادمػاضتضفزغونػعوػsonyػوصذضكػدعرهػ5111ػسيػداضهػصدغقهػوضغسػرىنػطرغىقػبظىػاءػ،ػأيػارغىدػ
انػتدظدػعذهػاضعواطلػاضتضقائهػرنػطرغقػداضهػصىدغقهػ،ػ ثىمػاظذىكػصىائنػواحىدػسقىطػسىيػاضداضىهػاضرئغدىغهػ،ػواطبىدػ
اضقغمػرنػطرغقػداضهػصدغقهػاغعاػ .ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
د د دا د د دم د صد ف ، ا د يد د ا د م زز اس ،ي
د د ،ي دذ دا س ا خص صف س ،ذ
د ا د ةد م دم د صد ف م ص ص ف س ،د يد د د دا صا يا
دف دا م د د د س دذ دا يد دا صد ام اأ س س ف ذ س س
د أ خ ص ء ا ي يم ا ص صا ةء ي س أ
صف ذ د ج ذ ا س مس أ خ ا ص م ا ء س ا م
خد د ذ ا د صدا دم ةء صف ا ا مي حم س
ذ د ا دذ ا د ذ د خد صد ف د ج د صد ف ا د د ج د صد ف د دم صف ا
د دا دا م د د دذ ةد يد م د ،د ي ا صد س ص
ا د ا د ذ ا د صدا سد ا د ا د ا ص س مي ا ي
دا دذ ةد د د خ د دذ ذ ج أ ح ء ا صفغم م أ س ج
سد صف ا ، ذ ص ف اخم ا أ ة سس
دا د د دج داخ م ف ا صدا ا خ د د س ي دم ا د ا د أ د د ي صف
م . صف صف ا
صورةػتوعغحغهػ :ػ
ػ
ػ
طاػارجوهػطظكػعوػانػتتطعنػجغداػسيػاضصودػاضبرطجيػوتفكطهػجغداػواػتقمػبحفظهػبلػاسكمػصغفغهػبظاءهػ .ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
#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;
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);
getch();
}
اصتبػترصغبػضتضفزغونػ:ػاضدؤالػشبلػااخغرػباضظصفيػ :ػ
م د م د ا د اا ا ، م خم ح ا
حد ء د د د د د ا د د م دم أ د ،أ ذ م س سا ج
م د د سد ،د د ذ د د د يد د دم د س د ز ز ذ
د دء د د س ا د س دم م د د س يا ا م اس ا ء ؟ اا
ء م سد ا د د ذ ي س ، ا ص ذ م مس
ة :
د د ي م ضد د سد دم 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
}
ﻠﻜﻤﺒﻴﻮﺗﺮ واﻻﻧﺘﺮﻧ ﺖ
اﻟﻤﻮﺳﻮﻋ ﺔ اﻟﻌﺮﺑﻴ ﺔﻟ- ٢٠٠٠-٢٠٠٢ © ﻔﻮ ﻇ ﺔ
ﺟﻤﻴ ﻊ اﻟﺤﻘﻮ ق ﻣﺤ
http://www.c4arab.com/
،ﺍﻟﺒﻴﺎﻨﺎ ﺕﺍﻟﺘﻲ
ﺍﺨﻠﻲﻟﻠﻜﺎﺌ ﻥﺍﺍﻟﺘﻌﻘﻴﺩ؟ ﻴﻤﻜ ﻥﺍﻟﻘﻭلﺃ ﻥﺍﻟ ﺼﻨ ﻑ ﻴ ﺼ ﻑﺍﻟﻬﻴﻜلﺍﻟﺩ ﺍ ﻫﺫﻟﻤﺎﺫ
،ﺍﻷﻨﺸ ﻁﺔﺍﻟﺘﻲ ﻴﻘﺩﺭ ﺘ ﺤﻘﻴﻘﻬﺎ ﻋﻠﻰ ﻫﺫﻩﺍﻟﺒﻴﺎﻨﺎ ﺕ.ﺍﻟﻜﺎﺌ ﻥ ﻫﻭ ﺤﺎﻟﺔﻟ ﺼﻨﻔﻪ. ﻴ ﺤﻭﻴﻬﺎ
ﺍﺍﻟﺘ ﺼﻤﻴﻡ.
،ﻜﻤﺎ ﻴﻤﺜﻠﻬﺎ ﻫﺫ
ﻟﻨﻌﺘﺒﺭ ﻤﺜﻼ ﻨﻤﻭﺫﺝ ﻤ ﺭﻜﺒﺔ
#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
ﻤ ﺭﻜﺒﺔ اﺳﻢ اﻟ ﺼﻨ ﻒ
،ﻭﻗﻴﻤﺘﻴ ﻥ ﺼ ﺤﻴ ﺤﺘﻴ ﻥ:ﺍﻟﻨﻭﻉ(ﻤ ﺕ ﻋﻠﻰ ﺸﻜل ﺤ ﺯﻤﺔ ﺭﻤﻭ ﺯ ) ،ﻤ ﺭﻜﺒﺔ ﻗ ﺩ
ﺍﺍﻟﻤﺜﺎل
ﻓﻲ ﻫﺫ
،ﻜل ،ﺒﻤﻌﻨﻰ ﺁﺨﺭ ﺍﻟﺴﺭﻋﺔﺍﻟﺩﻨﻴﺎ .ﻜل ﻫﺫﻩﺍﻟﺒﻴﺎﻨﺎ ﺕ ﺘﺨ ﺹ ﻤﺭﻜﺒﺔﺃﻴﺎ ﻜﺎﻨ ﺕ،ﻭ ﺍﻟﺴﺭﻋﺔﺍﻟﻘ ﺼﻭﻯ
ﺍﻉﺍﻟﻘﻴﻡ
ﺍﺃﻨﻭ
،ﻭﻜﺫ
ﺍﺘﻬﺎ ) ﺤﺠﺠﻬﺎ( vﺍﻟﻘﺴﻡﺍﻟﺴﻔﻠﻲ ﻴﻘﺩﻡﺍﻟﻤﻨﺎ ﻫﺞ ﻤﺭﻓﻘﺔ ﺒﺒﺎﺭ
ﺍﻤﺘﺭ
ﺍﻟﻤﻌﺎﺩﺓ.
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
+ﺘﻘﺩﻡ )(
ﺍﺠﻊ )( +ﺘﺭ
ﻋﻤﻠﻴﺔ ﺨﻠﻕ ﻤﺜﻴﻠﻴﻥﻟ ﺼﻨ ﻑ ﻭﺍﺤﺩ
،ﻭﺘﻭﻓﻴﺭﺃﺩﻨﻰ
ﺍﻜﺭ ﻱ ﻤ ﻥ ﻗﺒلﺍﻟ ﺼﻨ ﻑ ﻟﻠﻜﺎﺌ ﻥﺍﻟﺠﺩﻴﺩ
،ﻭ ﻫﻲ ﺤﺠ ﺯ ﻤﻜﺎ ﻥ ﺫ ﻤﺭ ﺤﻠﺔﺃﻭﻟﻰ
ﺍﻟﻤﻌﻠﻭﻤﺎ ﺕﻟﺠﻌلﺍﻟﻜﺎﺌ ﻥ ﻴﻨﻔﺫ.
vﺇﺴﻡ
ﺍ ﺕﺍﻟﺩﺨﻭل vﻗﺎﺌﻤﺔ ﺒﺎﺭ
ﺍﻤﺘﺭ
ﺍ ﺕﺍﻟﺨﺭﻭﺝ vﻗﺎﺌﻤﺔ ﺒﺎﺭ
ﺍﻤﺘﺭ
،ﺇﻨﻬﺎ
ﺍﺠﻬﺘﻪ interface ﻗﺎﺌﻤ ﺔﺍﻟﺭﺴﺎﺌلﺍﻟﺘﻲ ﻴﻘﺩﺭ ﺒﻔ ﻀﻠﻬﺎﺍﻟﻜﺎﺌ ﻥ ﻤ ﻥﺍﻻﺴﺘﺠﺎﺒﺔ ﺘﻤﺜل ﻭ
،ﻓﻴﺠ ﺏﺃ ﻥ ﻴﺒﻘﻰ ﻤﺨﻔﻴﺎ ﻋ ﻥ ﺍﻟﻘﺴﻡﺍﻟﻌﺎﻡ publicﻤ ﻥﺍﻟﻜﺎﺌ ﻥ.ﺃﻤﺎ ﻜل ﻤﺎ ﻴﺨ ﺹﺍﻟﻤﻌﺎﻟﺠﺔ
،ﻜلﺍﻟﻜﺎﺌﻨﺎ ﺕ ،ﺘﻤﺎﻤﺎﺍ ﻤﺎ ﻴﻤﺜلﺍﻟﻘﺴﻡﺍﻟﺨﺎ ﺹ privateﻤ ﻥﺍﻟﻜﺎﺌ ﻥ ﺍﻟﻤﺴﺘﺨﺩﻡﺍﻟﻨﻬﺎﺌﻲ :ﻭ ﻫﺫ
ﺍﻥ ،ﻴﻘﺩﺭ ،ﺒﺎﻟﻤﻘﺎﺒل ﻜﺎﺌﻨﻴ ﻥ ﻴﻨﺘﻤﻴﺎ ﻥﻟ ﺼﻨﻔﻴ ﻥ ﻤﺨﺘﻠﻔﻴ ﻥ
ﺍﺠﻬﺔ
ﺍ ﺕﺍﻟﻭﺍﻟﻤﻨﺘﻤﻴﺔ ﻟﻨﻔ ﺱﺍﻟ ﺼﻨ ﻑ ﺘﺘﻤﺘﻊ ﺒﺫ
ﺍﺠﻬﺔ ﻴﻤﻜ ﻥ ﺘﻤﺜﻴﻠﻬﺎ ﻋﻠﻰ ﺸﻜل ﺨﺎ ﺼﻴﺔ ،ﺍﻟﻭﺍﺠﻬﺔ .ﻤ ﻥ ﻭﺠﻬﺎ ﺕ ﻨ ﻅﺭ ﻤﺨﺘﻠﻔﺔ ﻋﻠﻰ ﺘﻘﺩﻴﻡ ﻨﻔ ﺱﺍﻟﻭ
ﻤﺘﻤﻴﺯﺓﻟﻠ ﺼﻨ ﻑ.
،ﺒ ﺤﻴﺙ ﻴﺴﻤﺢ ﺫﻟ ﻙ ﻤ ﻥﺍﻟﻤﺴﺘ ﺤﺴ ﻥ ﺇﺨﻔﺎﺀ ﺘﻔﺎ ﺼﻴل ﻤﻌﺎﻟﺠﺔﺍﻟﻜﺎﺌﻨﺎ ﺕ ﻋ ﻥﺃﻋﻴ ﻥﺍﻟﻤﺴﺘﺨﺩﻡ
ﺍﺨﻠﻲﻟﺒﻴﺎﻨﺎ ﺕﺍﻟ ﺼﻨ ﻑ )ﺘﺒﺩﻴل ﺠﺩﻭل ﺒ ﺤ ﺯﻤﺔ ﺭﻤﻭ ﺯ( ﻤ ﻥ ﺩﻭ ﻥﺍﻟﻠﺠﻭﺀ ﺇﻟﻰ ﺒﺘﻐﻴﻴﺭ ﻤﺜﻼﺍﻟﻬﻴﻜلﺍﻟﺩ
،ﺍﺜﻴﺘﻴ ﻥ )ﺒﻌﺩﻴ ﻥ(
ﺘﻌﺩﻴل ﻜﻭﺩﺍﻟﻤﺴﺘﺨﺩﻡ.ﺃﻭ ﻜﻤﺜﺎل ﺁﺨﺭ:ﻟﻨﻌﺘﺒﺭﺃ ﻥ ﺼﻨﻔﺎ ﻤﺎ ﻴﺸﻜلﻟﻨﺎ ﻨﻘ ﻁﺔ ﺒﺈ ﺤﺩ
ﺍﺘﻴ ﺏﺍﻟﺘﺭﺍ ﺼل ﻭ ﺍﻟﻲ ﻤﻭﻗﻊﺍﻟﻨﻘ ﻁﺔ ﻤ ﻥ ﻤ ﺤﻭﺭ ﻱﺍﻟﻔﻭﺍ ﻥ ﻋﻠﻰﺍﻟﺘﻭﺍﻟﺘﻲ ﺘﻌ ﻁﻴﻨﺎ ﻤﻨﻬﺎﺠﻴ ﻥ ﻴ ﺤﺩﺩ
ﻭ
ﺍﺨل ﺍ ﻜﺎﻨ ﺕﺍﻟﻨﻘ ﻁﺔ ﻤﻤﺜﻠﺔ ﺩ ﺍﻋﻲ ﺇﻋﻼﻡﺍﻟﻤﺴﺘﺨﺩﻡ ﻤﺎ ﺇﺫ ،ﻭﺒﺎﻟﺘﺎﻟﻲﻟﻴ ﺱ ﻤ ﻥﺍﻟﺩ ﺍﻟﻌﻤﻭﺩ(ﺍﻟﺴ ﻁﺭ ﻭ)
ﺍﻟ ﺼﻨ ﻑ ﻋﻠﻰ ﺸﻜل ﻗ ﻁﺒﻲﺃﻭ ﺨ ﻁﻲ.
،ﺇﺫ ﻥ ﻫﻭ ﻤ ﻥ
ﺍﻹﺨﻔﺎﺀ(
ﺍﻡ ﺒﻤﺒﺩﺃﺍﻟﻜﺒﺴﻠﺔ )
ﻜلﺍﻟﻠﻐﺎ ﺕﺍﻟﻜﺎﺌﻨﻴﺔﺍﻟﺘﻭﺠﻪ ﻻ ﺘﺸﺘﺭ ﻁﺍﻻﻟﺘ ﺯ
ﺨ ﺼﻭ ﺼﻴﺎ ﺕ ﻭ ﻁﺭﻴﻘﺔ ﺘﻔﻜﻴﺭﺍﻟﻤ ﺼﻤﻡ.
ﻟ ﻭﺭﺍﺜﺔHeritage :
٣ﺍ
،ﺃ ﻏﻠ ﺏﺍﻷﻨ ﻅﻤﺔﺍﻟ ﺤﻘﻴﻘﻴﺔ ﺘﺴﻌﻰ ﺇﻟﻰ ﺠﻌلﺍﻟﻌﻨﺎ ﺼﺭﺍﻟﺘﻲ ﺘﺭﻜﺒﻬﺎ ﻋﻠﻰ ﺸﻜل ﺘﺴﻠﺴﻠﻲ ﺇﺫ ﻥ
،ﻭﺒﺎﻟﺘﻔ ﺼﻴل
ﺍﺍﻟﻤﻭ ﻀﻭﻉ ﻜﺎﻨ ﺕ ﻋﻠﻰ ﻋﻼﻗﺔ ﺒﻌﻠﻡﺍﻷ ﺤﻴﺎﺀ) ﻫﻴﺎﺭﺸ ﻲ(.ﺍﻟﻔﻜﺭﺓﺍﻷﻭﻟﻰ ﺤﻭل ﻫﺫ
ﺍ ﻋﻠﻰ ﻤﻌﺎﻴﻴﺭ ﻤﺨﺘﻠﻔﺔ.
ﺍ ﺕﺍﻋﺘﻤﺎﺩ
ﻜﺎﻨ ﺕ ﺒﺨ ﺼﻭ ﺹ ﺘﻘﻨﻴﺔ ﺘﺭﺘﻴ ﺏﺍﻟ ﺤﺸﺭ
ﺍﺜﻴﺔ
،ﻭﺒﺎﻟﺘﺎﻟﻲ ﻴﻤﻜﻨﻨﺎ ﺘﺭﺠﻤﺔ ﻜل ﻋﻼﻗﺔ ﻭﺭ
ﺍﺜﺔ ﺘﻌﺒﺭ ﻋ ﻥ ﻋﻼﻗﺔ ﺘﻌﻤﻴﻡ /ﺘﺨ ﺼﻴ ﺹ
ﺍﻟﻭﺭ
ﺒﺎﻟﺠﻤﻠﺔﺍﻵﺘﻴﺔ:
ﻟﻘﺎ ﻋﺩ ﻱ
ﻟ ﻤﺸﺘﻕ ﻫﻭﺇ ﺼﺩﺍ ﺭ ﺨﺎ ﺹ ﻤﻥ ﺼﻨﻔ ﻪﺍ
ﻟ ﺼﻨ ﻑﺍ
ﺍ
ﺍﺜﺔ:
ﺴﻨﻘﺩﻡ ﻤﺜﺎﻟﻴ ﻥ ﻜﻼﺴﻴﻜﻴﻴ ﻥﻟﺘﻤﺜﻴل ﻓﻜﺭﺓﺍﻟﻭﺭ
،ﻭ ﻫﺫﻩﺍﻷﺨﻴﺭﺓ ،ﻜل ﻜﺎﺌ ﻥ ﺒﻴﺎﻨﻲ ﻴﻤﻜ ﻥﺍﻟﺘﻌﺒﻴﺭ ﻋﻨﻪ ﺒﻨﻘ ﻁﺔ
ﻟﻨﻌﺘﺒﺭ ﻤﺠﻤﻭﻋﺔ ﻜﺎﺌﻨﺎ ﺕ ﺒﻴﺎﻨﻴﺔ
،ﺴﻭ ﻑﺍ ﺨﻠﻕ ﻭ ﻫﺩﻡﺍﻟﻜﺎﺌ ﻥ ،ﻭﻨ ﺤﺩﺩﻟﻬﺎﻟﻭﻨﻬﺎ .ﻤﺎﻋﺩ ﺍﺜﻴﺘﻴ ﻥﺍﻟﺨ ﻁﻴﺘﻴ ﻥ XﻭY ﻴﺘﻡ ﺘﻤﺜﻴﻠﻬﺎ ﺒﺎﻹ ﺤﺩ
ﺍﺍﻟﻜﺎﺌ ﻥﺍﻟﺒﻴﺎﻨﻲ: ﻨﻌﻴ ﻥﺍﻟﻤﻨﺎ ﻫﺞﺍﻵﺘﻴﺔﻟﻬﺫ
ﺍﻟﺒﻴﺎﻨﺎ ﺕ(
ﺍﺀﺓ ﺇﻟﻰﺍﻟﺨ ﺼﺎﺌ ﺹ )
ﺍﻟﻘﺭ
ﺃﻨﻔﺫ ﺒﺎﻟﻜﺘﺎﺒﺔ ﻭ v
ﺃﻨﺸﺭ v
ﺃﻤ ﺤﻭ v
ﺤﺭ ﻙﺍﻟﻜﺎﺌ ﻥ. v
،ﻓﺈﻨﻨﺎ ﺴﻨﻼ ﺤ ﻅﺃ ﻥ ﻜﻼﺍﻟ ﺼﻨﻔﻴ ﻥﺍ ﻓﻲﺍﻟﺘ ﺼﻤﻴﻡﺍ ﻤﺎ ﻗﻤﻨﺎ ﺒﺎﻟﺘﻤﻌ ﻥ ﺠﻴﺩ ،ﺇﺫ
ﺒﺎﻹ ﻅﺎﻓﺔ ﺇﻟﻰ ﺫﻟ ﻙ
،ﺒ ﺤﻴﺙﺃ ﻥ ﻁﺭﻴﻘﺔ ﺍﺍﻟﻤﻨﻬﺎﺝ Clear ﺍﺌﺭﺓ ﻗﺩ ﻗﺎﻡ ﺒﺈﻋﺎﺩﺓ ﺘﻌﺭﻴ ﻑﺍﻟﻤﻨﻬﺎﺝ Displayﻭﻜﺫ ﺴ ﻁﺭ ﻭﺩ
،ﻭﻨﻔ ﺱﺍﻟﻔﻜﺭﺓ ﺘﻨ ﻁﺒﻕ ﻋﻠﻰ ﻁﺭﻴﻘﺔﺍﻟﻤ ﺤﻭ :ﺇﻨﻪ ﺍﺌﺭﺓﻨﺸﺭﺍﻟﺴ ﻁﺭ ﻤﺜﻼ ﺘﺨﺘﻠ ﻑ ﻋ ﻥ ﻁﺭﻴﻘﺔ ﻨﺸﺭ ﺩ
ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ Polymorphismﺍﻟﻤ ﻁﺒﻕ ﻋﻠﻰﺍﻟﻤﻨﻬﺎﺠﻴ ﻥ Displayﻭ Clearﻓﻲ ﺇ ﻁﺎﺭ
ﺍﻟ ﺼﻨﻔﻴ ﻥ ﺴﻁ ﺭ ﻭﺩﺍﺌ ﺭﺓ.
،ﻭﻟﻜ ﻥ ﻓﻲﺍﻟﻭﻗ ﺕﺍﻟ ﺤﺎﻟﻲ ﻴﻜﻔﻴ ﻙ ﻤﻌﺭﻓﺔ
ﺴﻨﻌﻭﺩ ﺒﺎﻟﺘﻔ ﺼﻴل ﺤﻭل ﻤﻔﻬﻭﻡ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ
ﺍﻟﺔ( ﻴﻤﻜﻨﻪﺍﺘﺨﺎﺫ ﻋﺩﺓﺃﺸﻜﺎل: ﺍﺀ /ﺍﻟﺩﺃ ﻥﺍﻟﻤﻨﻬﺎﺝ )ﺃﻭﺍﻹﺠﺭ
#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 ()
ﻜﺎﺌﻥ ﺒﻴﺎﻨﻲ
ﻟ ﺼﻨ ﻑ GraphicObject ﺘ ﺴﻠ ﺴلﺍ
،ﻭ ﺤﻴﺙ
ﺍﺜﺔ ﻴﺘﻡﺍﻹﺸﺎﺭﺓ ﺇﻟﻴﻬﺎ ﺒﺴﻬﻡ ﺫﻭ ﻨﻬﺎﻴﺔ ﻤﺜﻠﺜﻴﺔ
،ﻋﻼﻗﺔﺍﻟﻭﺭ ﺤﺴ ﺏﺍﻟ ـ UML
ﺍﻻﺘﺠﺎﻩ ﻴﻜﻭ ﻥ ﻨ ﺤﻭﺍﻟ ﺼﻨ ﻑﺍﻷ ﺏ.
ﺍ ﺕﺍﻹﺴﻡ
ﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﻤﻜﺘﻭﺒﺔ ﺒﺨ ﻁ ﻤﺎﺌل ﻫﻲ ﻤﺠﺭﺩﺓ .ﻓﻨﺴﺘﻨﺘﺞ ﻤﺒﺎﺸﺭﺓﺃ ﻥﺍﻷ ﺼﻨﺎ ﻑ ﺫ
،ﻭﺒﺎﻟﺘﺎﻟﻲ ﻻ ﻴﻤﻜﻨﻨﺎ ﺨﻠﻕ ﻤﺜﻴﻼ ﺕ ﻋﻨﻬﺎ ﻤﺒﺎﺸﺭﺓ.
ﺍﻟﻤﺎﺌل ) (italicﻫﻲﺃﻴ ﻀﺎ ﻤﺠﺭﺩﺓ
ﺍﺍﻟﺘﺭﻜﻴ ﺏ ﺴﻠﻴﻡ ﻤ ﻥ ﺤﻴﺙﺃ ﻥ ﻤﻨﻬﺎﺝ ﻤ ﺤﻭﺍﻟﺴ ﻁﺭ 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
ﺇﺫ ﻥ ﻨ ﺤ ﺼل ﻋﻠﻰﺍﻟﻨﻤﻭﺫﺝﺍﻵﺘﻲ:
Vehicle
Car Truck
ﺍﺭﺓ
ﻋﺭﺒﺔ ﺩ ﻭ ﻁﻭﺍﻓﺔ ﺴﻔﻴﻨﺔ
ﺍﺝﺃ ﺼﻨﺎ ﻑ ﺠﺩﻴﺩﺓ ﻀﻤ ﻥ ﻨ ﻅﺎﻡ ﺍ ﺘﻌﻠﻕﺍﻷﻤﺭ ﺒﺈﺩﺭﺃﺴﻠﻭ ﺏﺍﻟﺘﺨ ﺼﻴ ﺹ ﻴﺴﺘﺨﺩﻡ ﺒﻜﺜﺭﺓ ﺇﺫ
،ﻓﺈﻨﻪ ﻴﻜﻭ ﻥ ﺒﺎﻹﻤﻜﺎ ﻥ
ﺍﺕﺍﺭﺓ ﺇﻟﻰﺍﻗﺘﻨﺎﺀ ﺒﻌ ﺽﺍﻟ ﻁﺎﺌﺭ
ﺍ ﺴﻌ ﺕﺍﻹﺩ ،ﺇﺫ
ﻤﻭﺠﻭﺩ ﻤﺴﺒﻘﺎ .ﻋﻠﻰ ﻜل
،
ﺍﻟﺘﻲ ﻨﺸﺘﻕ ﻤﻨﻬﺎ ﻁﺎﺌ ﺭﺓ ﻭ ﻁﻭﺍﻓﺔ ،ﻭ ﺇ ﻀﺎﻓﺔ ﺼﻨ ﻑ ﺠﺩﻴﺩ )ﻤ ﻥ ﺨﻼلﺍﻟﺘﻌﻤﻴﻡ( AerialVehicle
ﻓﻨ ﺤ ﺼل ﺇﺫ ﻥ ﻋﻠﻰﺍﻟﺘ ﺼﻤﻴﻡﺍﻵﺘﻲ:
Vehicle
ﺍﺭﺓ
ﻋﺭﺒﺔ ﺩ ﻭ ﻋﺭﺒﺔ ﻁﻴﺎﺭﺓ ﺴﻔﻴﻨﺔ
،ﻓﻤ ﻥﺃﺠل ﻭ ﻀﻊ ﺘﻘﺩﻴﻡ ﻟﻬﺫﻩ ﺍﺍﻟﻨﻭﻉ ﻤ ﻥﺍﻟﺘﺭﺘﻴ ﺏ ﻴﺄﺨﺫﺃ ﺤﻴﺎﻨﺎ ﺇﺴﻡ taxonomy ﻫﺫ
ﺍﺒ ﻁﺔﻟﺠﻌل ﺘ ﺼﻨﻴ ﻑ ﺍ ﺕ ﺩﻭﻤﺎ ﻋ ﻥ ﻭﺴﺎﺌل ﺘ ﻁﺒﻴﻘﻴﺔ ﻤﺘﺭ
ﺍﻟﻤﺒﺎﺩﺭﺓ :ﻴﺒ ﺤﺙﺍﻟﻤﺘﺨ ﺼ ﺼﻭ ﻥ ﻓﻲﺍﻟ ﺤﺸﺭ
ﺍ ﺕ ﻴﺴﻴﺭ ﻓﻲﺃ ﺤﺴ ﻥ ﻤﺎ ﻴﻤﻜ ﻥ.
ﺍﻟ ﺤﺸﺭ
ﻟﻤﺠﺭﺩﺓabstract :
.٣ .٣ﺍﻷ ﺼﻨﺎ ﻑﺍ
ﺍ ﻜﺎﻨ ﺕ ﻻ ﺘﻤﻨﺢ ﻋﻤﻼ ﺒﺭﻤﺠﻴﺎ implementation ﻨﻘﻭل ﻋ ﻥﺃ ﺼﻨﺎ ﻑﺃﻨﻬﺎ ﻤﺠﺭﺩﺓ ﺇﺫ
،ﻻ
،ﺍﻟ ﺼﻨ ﻑﺍﻟﻤﺠﺭﺩ ﺍلﺍﻟﻐﻤﻭ ﺽ؟ ﻋﻠﻰ ﻜل ،ﻭﻤﻨﺎ ﻫﺠﻬﺎ ﺘ ﺼﻴﺭﺃﻴ ﻀﺎ ﻤﺠﺭﺩﺓ .ﺭﺒﻤﺎ ﻤﺎ ﺯ ﻟﻤﻨﺎ ﻫﺠﻬﺎ
،ﻴﻤﻜ ﻥ ﺫﻟ ﻙﻟﻸ ﺼﻨﺎ ﻑﺍﻟﻤﺸﺘﻘﺔ ﻤﻨﻪ ﻤ ﻥ ﺨﻼل ﺘﻭﻓﻴﺭﺍﻟﻜﻭﺩﻟﻜل ﻴﻤﻜﻨﻪﺃ ﻥ ﻴﺨﻠﻕ ﻤﺜﻴﻼ ﺕ )ﻜﺎﺌﻨﺎ ﺕ(
،ﻭﺒﺎﻟﺘﺎﻟﻲ ﻴ ﺯﻭل ﻋﻨﻬﺎﺍﻟﺘﺠﺭﻴﺩ ﻭﺘ ﺼﻴﺭ ﻗﺎﺩﺭﺓ ﻋﻠﻰﺍﻟﻘﻴﺎﻡ ﺒﻌﻤلﻤ ﻥﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﺘﻲ ﻜﺎﻨ ﺕ ﻤﺠﺭﺩﺓ
،ﻨﺘﻜﻠﻡ ﺇﺫ ﻥ ﻋﻡﺃ ﺼﻨﺎ ﻑ ﺤﺴﻴﺔ .concreteﺍﻷ ﺼﻨﺎ ﻑﺍﻟ ﺤﺴﻴﺔ ﻫﻲﺍﻟﻭ ﺤﻴﺩﺓﺍﻟﻘﺎﺩﺭﺓ ﻋﻠﻰ ﺒﺭﻤﺠﻲ
ﺨﻠﻕ ﻤﺜﻴﻼ ﺕ.
ﻤﺎ ﻫﻭ ﻫﺩ ﻑﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺠﺭﺩﺓ؟ ﻫﻭ ﺨﻠﻕ ﺇ ﻁﺎﺭ ﻋﻤلﻟﻸ ﺼﻨﺎ ﻑﺍﻟﻤﺸﺘﻘﺔ ﻤ ﻥ ﺨﻼل
ﺍﻟﺘﺴﻠﺴل ﻓﻲﺍﻷ ﺼﻨﺎ ﻑﺘﻘﺩﻴﻡ ﻤﺠﻤﻭﻋﺔ ﻤ ﻥﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﺘﻲ ﻨﺠﺩ ﻫﺎ ﻋﻠﻰ ﻁﻭلﺍﻟﺘﻔﺭﻉ )
ﺍﺴﺔ
ﺍ ﻴﺘﻌﻠﻕ ﻏﺎﻟﺒﺎ ﺒﺩﻓﺘﺭ ﺤﻤﻭﻟﺔﺍﻟﺒﺭﻨﺎﻤﺞ .ﺒﺩﺭ
،ﻫﺫ ﺍﺍﻟﻜﺎﺌ ﻥ ﺤﺴﻲﺃﻭ ﻤﺠﺭﺩ ﺘ ﺤﺩﻴﺩ ﻤﺎ ﺇﺫ
،ﻴﻤﻜ ﻥ ﺘ ﺤﺩﻴﺩ ﻤﺎ ﻫﻲﺍﻷ ﺼﻨﺎ ﻑﺍﻟ ﺤﺴﻴﺔ:ﺍﻟﺘﻲ ﺘﻤﺘﻠ ﻙ ﻤﺜﻴﻼ ﺕ .ﻭﻤ ﻥ ﺨﻼلﺍﺍﻷﺨﻴﺭ ﻤﺘﻌﻤﻘﺔ ﻟﻬﺫ
ﺍﻟﺘﻲ ﺘﺴﻤﺢﺒﺎﻻﺴﺘﻔﺎﺩﺓ ﻤ ﻥ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ﻫﺫﻩﺍﻷﺨﻴﺭﺓ ﻴﻤﻜ ﻥ ﺘ ﺤﺩﻴﺩﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺠﺭﺩﺓ ﻭ
ﺍﺒﺎﺘﺒﺎﻉﺃﺴﻠﻭ ﺏﺍﻟﺘﻌﻤﻴﻡ.
،polymorphismﻭ ﻫﺫ
ﻟ ﻭﺭﺍﺜﺔ:
ﻟﻤﺭﺘﺒﻁﺔ ﺒﺎ ﺴﺘﺨﺩﺍ ﻡﺍ
ﻟ ﺼﻌ ﻭﺒﺎﺕﺍ
.٤ﺍ .٣
ﺪا:
.٠ ١ .٤ﺗﺴﻠﺴ ﻞ ﻣ ﻜﺜ ﻒ ﺟ .٣
ﻴﺠ ﺏﺍﻻﻨﺘﺒﺎﻩ ﺇﻟﻰ ﻋﺩﻡ ﺘﻜﺜﻴ ﻑ ﻭﺇﺜﻘﺎلﺍﻟﺘﺴﻠﺴل ﺒﺎﻻﺸﺘﻘﺎﻕﺍﻟﻐﻴﺭ ﻤﻨ ﻅﻡ .ﻓﻠﻨﻌﺘﺒﺭ ﻤﺜﻼ
،ﻷﻨﻨﺎ ﻨﻔﻬﻡ ،ﻻ ﻴﻤﻜﻨﻨﺎﺍﻟﺘﻌﻠﻴﻕ ﺍﻟﺫ ﻱ ﻤﻨﻪ ﻨﺸﺘﻕﺍﻟ ﺼﻨﻔﻴ ﻥ ﻗﻁ ﻭ ﻜﻠﺏ .ﻓﻠ ﺤﺩﺍﻵ ﻥ ،ﻭ ﺍﻟ ﺼﻨ ﻑ ﺤﻴﻭﺍﻥ
،ﻴﻌﺘﺒﺭ ﺒﺄ ﻥﺍﻻﺨﺘﻼ ﻑﺍﻟﻤﻭﺠﻭﺩ ﺒﻴ ﻥ ﻫﺫﻴ ﻥﺍﻟﻨﻭﻋﻴ ﻥ ﻴﺘ ﻁﻠ ﺏ ﻤﻨﺎ ﺨﻠﻕ ﺼﻨﻔﻴ ﻥ ﻤﺨﺘﻠﻔﻴ ﻥ .ﺒﺎﻟﻤﻘﺎﺒل
،
،ﻓﺒﺴﺒ ﺏﻟﻭ ﻥﺍﻟﺸﻌﺭ ،ﺴﻭﺀﻟﻠﺘﻘﺩﻴﺭ ﺃ ﺼﻔ ﺭ ﻤ ﻥﺍﻟ ﺼﻨ ﻑ ﻜﻠﺏ ﺃﺴﻭﺩ ﻭ ﻜﻠﺏ_ ﺍﺸﺘﻘﺎﻕﺍﻟ ﺼﻨﻔﻴ ﻥ ﻜﻠﺏ_
،ﻤﻤﺎ ﺴﻴﺜﻘلﺍﻟﺘﺴﻠﺴل ﻷﺴﺒﺎ ﺏ ﺒﺴﻴ ﻁﺔ .ﻜﺎ ﻥ ﻤ ﻥﺍﻷ ﺤﺴ ﻥ ﺩﻤﺞ ،ﺃﻭ ﻋﺩﺓﺃ ﺼﻨﺎ ﻑ ﺘﻡ ﺨﻠﻕ ﺼﻨﻔﻴ ﻥ
ﺼﻔﺔﺍﻟﻠﻭ ﻥ )ﺃﻭ ﺒﻌ ﺽﺍﻟ ﺼﻔﺎ ﺕﺍﻟﺒﺴﻴ ﻁﺔ( ﻀﻤ ﻥ ﺨ ﺼﺎﺌ ﺹ )ﺒﻴﺎﻨﺎ ﺕ(ﺍﻟ ﺼﻨ ﻑﺍﻷﺴﺎﺴﻲ ﻜﻠﺏ.
،ﻓﺎﻟﺘ ﺼﻤﻴﻡﺍﻵﺘﻲ
،ﻴﺠ ﺏﺍﻟ ﺤﺭ ﺱ ﻋﻠﻰ ﻋﺩﻡ ﺩﻤﺞﺃ ﺼﻨﺎ ﻑ ﻭﺴﻴ ﻁﺔ ﻜﺜﻴﺭﺓ
ﺒﻨﻔ ﺱﺍﻷﺴﻠﻭ ﺏ
ﺍ ﻴﺠ ﺏ ﺤﺫﻓﻪ.،ﻟﺫ ﻴﺒﻴ ﻥﺃ ﻥ ﻫﻨﺎ ﻙ ﺼﻨ ﻑ ﻭﺴﻴ ﻁ ﻏﻴﺭ ﻀﺭﻭﺭ ﻱ ﻭﻻ ﻴﻤﻠ ﻙﺃ ﻱﺍﺸﺘﻘﺎﻕ ﺤﻘﻴﻘﻲ
base
ﻭﺴﻴﻁ٢
ﻭ ﺭﻗﺔ٢ ﻭ ﺭﻗﺔ٣
،ﺍﻟ ﺼﻨ ﻑ ﻭﺴﻴﻁ ١ﻻ ﻴﻌﻤل ﺇﻻ ﻋﻠﻰ ﺍ ﻜﺎ ﻥﺍﻟ ﺼﻨ ﻑ ﻗﺎﻋﺩ ﻱ ﻴﻤﺘﻠ ﻙ ﺼﻨﻔﻴ ﻥﺍﺒﻨﻴ ﻥ ،ﺇﺫ ﺇﺫ ﻥ
ﺇﺜﻘﺎل ﻏﻴﺭ ﻀﺭﻭﺭ ﻱﻟﻠﺘﺴﻠﺴل .ﺇﺫ ﻥ ﻫﻭ ﺼﻨ ﻑ ﻤﺠﺭﺩ )ﻜﻤﺎ ﻨﺸﻴﺭ ﺇﻟﻰ ﺨ ﻁﻪ ﺒﻨﻭﻉ ﻤﺎﺌل( ﻭﻻ
ﺍ ﺤﺩﺓ .ﻴﻤﻜﻨﻨﺎ ﺇﺫ ﻥ ﺤﺫﻓﻪ
،ﻭﻓﻲ ﻨﻔ ﺱﺍﻟﻭﻗ ﺕ ﻻ ﻴﺸﺘﻕ ﺇﻻ ﻤﺭﺓ ﻭ ﻴﻤﻜﻨﻪﺃ ﻥ ﻴﻤﺘﻠ ﻙ ﻤﺜﻴﻼ ﺕ )ﻜﺎﺌﻨﺎ ﺕ(
ﺍﺍﻟﻤﺜﺎلﻴﺴﻤﺢ ﺒ ﺯﻴﺎﺩﺓ ﻗﺎﻋﺩﺓﻟﻐﻭﻴﺔ :ﻨﺴ ﻤﻲ ﻭ ﺭﻗﺔ ﻤﻊ ﺇ ﻀﺎﻓﺔ ﺨ ﺼﺎﺌ ﺼﻪ ﻓﻲﺍﻟ ﺼﻨ ﻑ ﻭﺴﻴﻁ .٢ﻫﺫ
ﺫ ﻱ ﻻ ﻴ ﻤﻠﻙ ﻤﺸﺘﻘﺎ ﺕ. ﻟﻟ ﺼﻨ ﻑﺍﺍ
ﺪconstruction inheritance :
.٠ ٢ .٤وراﺛﺔاﻟﺘﺸﻴﻴ .٣
ﺍ ﺕ ﻀﺎﻟﺔ .ﻓﻠﻨﻌﺘﺒﺭ ﻤﺜﻼﺍﻟ ﺼﻨ ﻑ ﻁﺎﺌ ﺭﺍﻟﻤ ﺯﻭﺩ ﺍﺜﺔ ﺒﻌ ﺽﺍﻷ ﺤﻴﺎ ﻥ ﺇﻟﻰ ﺘ ﺼﻭﺭ ﺘﺅﺩ ﻱﺍﻟﻭﺭ
ﺍﺀ ،ﺴﻭ ،ﻨﺴﺘ ﻁﻴﻊ ﻤﺜﻼﺍﺸﺘﻘﺎﻕﺍﻟ ﺼﻨ ﻑ ﺩﺠﺎﺠﺔﺍﻟﺘﻲ ﻫﻲ ﻤ ﻥ ﻓ ﺼﻴﻠﺔﺍﻟ ﻁﻴﻭﺭ ﺒﺎﻟﻤﻨﻬﺎﺝﻴﻁﻴ ﺭ
،ﻭﻟﻜ ﻥ ﻜل ﻤﻨﺎ ﻴﻌﻠﻡﺃ ﻥﺍﻟﺩﺠﺎﺠﺔ ﻻ ﺘ ﻁﻴﺭ ﺭ ﻏﻡ ﺍﺜﺔﺃﻭ ﻋ ﻥ ﻁﺭﻴﻕ ﺇﻋﺎﺩﺓﺍﻟﺘﻌﺭﻴ ﻑ ﺒﺄﺴﻠﻭ ﺏﺍﻟﻭﺭ
ﺃﻨﻬﺎ ﻤ ﻥ ﻓ ﺼﻴﻠﺔﺍﻟ ﻁﻴﻭﺭ .ﺇﺫ ﻥ ﻓﻲ ﻫﺫﻩﺍﻟ ﺤﺎﻟﺔ ﻨﺴﺘ ﻁﻴﻊﺃ ﻥ ﻨﻘﻭل " ﺩﺠﺎﺠﺔ ﻫﻲ ﻁﺎﺌﺭ ﻤﺘﺨ ﺼ ﺹ".
ﺍﺜﺔﺍﻻﺨﺘﻴﺎﺭﻴﺔ:ﺍﻟﻤﺒﺭﻤﺞ ﻤﺩﻋﻭ ﻻﺨﺘﻴﺎﺭ ﻤﺎ ﻫﻲﺍﻟﻤﻨﺎ ﻫﺞ ،ﺘ ﻁﺭ ﺡ ﺒﻌ ﺽﺍﻟﻠﻐﺎ ﺕﺍﻟﻭﺭ ﻜﺫﻟ ﻙ
،ﻓﺈﻨﻪﺍ ﻥ ﻤ ﻥ ﺘﺴﻠﺴل ﻁﺎﺌ ﺭ ﺍﻟﺨ ﺼﺎﺌ ﺹﺍﻟﺘﻲ ﻴﻤﻜﻨﻬﺎﺃ ﻥ ﺘﻭﺭﺙ .ﻭﺇ ﻥﻟ ﺯﻡﺍﻷﻤﺭ ﻤ ﺤﻭ ﻤﻨﻬﺎﺝﺍﻟ ﻁﻴﺭ ﻭ
ﺍ ﻴﻌﺘﻡ ﻜﻠﻴﺔ ﻤﻔﻬﻭﻡ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ polymorphismﺍﻟﺫ ﻱ ،ﻫﺫﻻ ﻴ ﻁﺭ ﺡﺃ ﻱ ﻤﺸﻜﻠﺔ .ﺒﺎﻟﻤﻘﺎﺒل
ﺍ ﻓﻲﺍﻷ ﺼﻨﺎ ﻑ ﺍ ﻓﻲﺍﻟ ﺼﻨ ﻑﺍﻟﻘﺎﻋﺩ ﻱ ﻴﻤﻜ ﻥﺃ ﻥ ﻴﻜﻭ ﻥ ﻤﻭﺠﻭﺩ ﻴﻨ ﺹ ﻋﻠﻰﺃ ﻥ ﻤﻨﻬﺎﺠﺎ ﻤﻭﺠﻭﺩ
ﺍﻟﻭﺭﻴﺜﺔ.
Hovercraft
ﻫﻭﻓ ﺭﻜﺭﺍﻓ ﺕ
ﻟﻤﺘﻌﺩﺩﺓ
ﻟ ﻭﺭﺍﺜﺔﺍ
ﻤﺜﺎل ﻋ ﻥﺍ ﺴﺘﻌﻤﺎلﺍ
B C
D
ﺍﺠﻬﺔ ﻗﻴﺩ ،ﻓﺈﻨﻪ ﻴﻘﺩﺭ ﻋﻠﻰ ﻭ ﻀﻊﺍﻟﻭ ﺍﺜﺔﺍﻟﺘﻲ ﻴﺘﻤﺘﻊ ﺒﻬﺎﺍﻟ ﺼﻨ ﻑ ﺍ ﺕﺍﻟﻭﺭ ﺯﻴﺎﺩﺓ ﻋﻠﻰ ﻤﻤﻴ ﺯ
ﺍﻟﻜلﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻴﻬﺎ .ﻫﺫﻩﺍﻵﻟﻴﺔ ﻗﻭﻴﺔﻟﻠﻐﺎﻴﺔ ﺍ ﻜﺎﻨ ﺕ ﺘﻤﻠ ﻙ ﺘﻨﻔﻴﺫﺍﻟﺘﻨﻔﻴﺫ Implementﺇﺫ
ﺍﺠﻬﺎ ﺕ ﻤ ﻥ ﺩﻭ ﻥﺃ ﻥ ﺘﻜﻭ ﻥﻟﻬﺎ ﻷﻨﻬﺎ ﺘﺨﻠﻕ ﻋﻼﻗﺎ ﺕ ﻗﻭﻴﺔ ﺒﻴ ﻥ ﻤﺨﺘﻠ ﻑﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﻨﻔﹼﺫﺓﻟﻨﻔ ﺱﺍﻟﻭ
ﺍﺠﻬﺎ ﺕ ﻫﻲ ﻤﺘﻌﺩﺩﺓﺍﻟ ﺼﻔﺎ ﺕ،ﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﻤﻭﺠﻭﺩﺓ ﻀﻤ ﻥﺍﻟﻭ ﻋﻼﻗﺔﺃﺒﻭﻴﺔ .ﻋﻠﻰﺍﻟﺨ ﺼﻭ ﺹ
ﺍﺠﻬﺔ. ،ﻷﻨﻬﺎ ﺘﻨﻔﺫ ﺒ ﺼﻔﺔ ﻤ ﺤﺎﻴﺩﺓ ﻓﻲ ﻜل ﺼﻨ ﻑ ﻴﺴﺘﺨﺩﻡ ﻨﻔ ﺱﺍﻟﻭ polymorphs
ﺍﺠﻬﺎ ﺕ .ﻫﺫﻩﺍﻵﻟﻴﺔﺍﻟ ﺼﺎﺩﺭﺓ ﻋ ﻥ ،ﻜل ﺼﻨ ﻑ ﻴﻤﻜﻨﻪ ﺘﻨﻔﻴﺫ ﻤﺎ ﻴ ﺤﻠﻭﻟﻪ ﻤ ﻥﺍﻟﻭ ﺒﺎﻟﻤﻘﺎﺒل
ﺍﻟﺠﺎﻓﺎ.
Smalltalkﺘﻡ ﺘﺒﻨﻴﻬﺎ ﻤ ﻥ ﻗﺒل ﻟﻐﺔﺍﻟﺴﻲﺍﻟﻜﺎﺌﻨﻴﺔ )ﺃﻭ ﻜﻤﺎ ﻴﺴﻤﻴﻬﺎﺍﻟﺒﻌ ﺽ:ﺍﻟﺸﻴﺌﻴﺔ( ﻭ
، ﺍ ﺼﺔﻨﻭﻭﻴﺔ ،ﻟﻨﻔﺭ ﺽ ﻤﺜﻼﺃ ﻥ ﻨ ﻅﺎﻡ ﻜﺎﺌﻨﺎ ﺕ ﻴﺭﻴﺩ ﻗﻭﻟﺒﺔ ﻏﻭ ﻤ ﻥﺃﺠل ﺘﺜﺒﻴ ﺕﺍﻷﻓﻜﺎﺭ
ﺍﺠﺩ ﻋﻠﻰﺍﻟﺘ ﺼﻤﻴﻡ .ﻓﺒﺩلﺍﺸﺘﻘﺎﻕ ﻜل ﻭ ﺤﻴﺙ ﺒﻌ ﺽ ﻤﺭﻜﺒﺎﺘﻬﺎ ﺘﺎﺒﻌﺔﻟﻔﺭﻭﻉ ﺘﺴﻠﺴﻠﻴﺔ ﻴﺠ ﺏﺃ ﻥ ﺘﺘﻭ
ﺍﻟﺘﻲ ﺘﻘﺘﺭ ﺡ ﻋﺭ ﻀﻬﺎ ﻋﻠﻰﺍﻟﺘ ﺼﻤﻴﻡ )ﺒﻌ ﺽﺍﻷ ﺼﻨﺎ ﻑ ﻻ ﻴﺠ ﺏﺃ ﻥ ،ﻭ ﺍﻷ ﺼﻨﺎ ﻑ ﻟﻨﻔ ﺱﺍﻟﻌﺎﺌﻠﺔ
ﺍﺠﻬﺔ ﻗﺎﺒﻠﺔﻟﻠﻌﺭ ﺽ ﺇﻟﻰﺍﻟﺘﻲ ،ﻴﺴﺘ ﺤﺴ ﻥ ﺭﺒ ﻁ ﻭ ،ﻓﺒﺩل ﺫﻟ ﻙ
ﺍ ﺴﻴﺌﺎ
ﺍ ﻤﺎ ﻴﻌﺘﺒﺭ ﺘ ﺼﻭﺭ ،ﻭ ﻫﺫﺘﻌﺭ ﺽ(
ﻴﺠ ﺏﺃ ﻥ ﺘ ﻅﻬﺭ ﻓﻲﺍﻟﺘ ﺼﻤﻴﻡ .ﻨﺸﻴﺭﺃﻴ ﻀﺎ ﺇﻟﻰﺃﻨﻪ ﻟﻭ ﻜﺎﻨ ﺕ ﻜلﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻤﺸﺘﻘﺔ ﻤ ﻥ ﺼﻨ ﻑ
،ﻓﺈ ﻥ ﻜلﺍﻷ ﺼﻨﺎ ﻑﺍﻟﻐﻴﺭ ﺒﻴﺎﻨﻴﺔ ﺴﺘﺜﻘل ﺒﺎﻟﻌﺩﻴﺩ ﻤ ﻥﺍﻟﻤﻨﺎ ﻫﺞﺍﻟﻐﻴﺭ ﻗﺎﻋﺩ ﻱ ﻴﻘﺘﺭ ﺡ ﻤﻨﺎ ﻫﺞﻟﻠﺭﺴﻡ
ﻀﺭﻭﺭﻴﺔ.
ﻟﺘﺭﻜﻴﺏ :aggregation
٤ﺍ
ﻥ
ﺍﻟﺘﻲﻴﺘﺭﺠﻡ ﻫﺫﻩﺍﻟﻤﺭﺓﺍﻟﻌﻼﻗﺔ "ﻤﻜ ﻭ ،ﻭ ﺍﻟﺘﺭﻜﻴ ﺏ ﻫﻭ ﻨﻭﻉ ﺁﺨﺭ ﻤ ﻥﺍﻟﻌﻼﻗﺔ ﺒﻴ ﻥ ﺼﻨﻔﻴ ﻥ
،ﻴﻤﻜﻨﻨﺎﺃ ﻥ ﻨﻘﻭلﺃ ﻥﺍﻟ ﺼﻨ ﻑ
،ﻓﻲ ﻨ ﻅﺎﻡ ﻤﻴﻜﺎﻨﻴﻜﻲﻟﻪ ."...ﻓﻤﺜﻼ
ﻤ ﻥ"...ﺃﻭ "ﻴﻤﻠﻙ"...ﺃﻭﺃﻴ ﻀﺎ "
،ﻭ ﺼﻨ ﻑ ﻤ ﻥ ﺇﻁﺎ ﺭ .ﺨﻠﻕ ﻤﺜﻴﻼ ﺕ
،ﺃﺭﺒﻌﺔﺃ ﺼﻨﺎ ﻑ ﻤ ﻥ ﻋﺠﻠﺔ
ﺴﻴﺎ ﺭﺓ ﻤﻜﻭ ﻥ ﻤ ﻥ ﺼﻨ ﻑ ﻤ ﻥ ﻤﺤ ﺭﻙ
ﺍ ﺤﺩﺓ(. vﻜﺎﺭﺩﻴﻨﺎﻟﻴﺔﺍﻟﻤﺭﻜِ
ّ ﺏ ﺘﻜﻭ ﻥ ﺒﺠﺎﻨ ﺏﺍﻟﻤﻌﻴ ﻥ )ﻓﻲﺍﻟﺒﻴﺎ ﻥ :ﻋﺠﻠﺔ ﺘﻨﺘﻤﻲﻟﺴﻴﺎﺭﺓ ﻭ
ﻜ ﺏ ﺘﻜﻭ ﻥ ﺒﺠﺎﻨ ﺏﺍﻟﺨ ﻁ )ﻓﻲﺍﻟﺒﻴﺎ ﻥ :ﺴﻴﺎﺭﺓ ﺘﻤﺘﻠ ﻙﺃﺭﺒﻊ ﻋﺠﻼ ﺕ(. vﻜﺎﺭﺩﻴﻨﺎﻟﻴﺔﺍﻟﻤﺭﱠ
ﻟﻭﺍﺠ ﻬﺎﺕ:
ﻟﻤﺘﻌﺩﺩﺓﺃ ﻭﺍ
ﻟﺘﺭﻜﻴﺏ ﻜﺘﻨﺎ ﻭﺏﻟﻠ ﻭﺭﺍﺜﺔﺍ
.٢ﺍ .٤
ﺍﺜﺔﺍﻟﻤﺘﻌﺩﺩﺓﺃﻭ ﻓﻲﺃ ﺤﻴﺎﻨﺎ ﻴﻜﻭ ﻥ ﺒﺎﻹﻤﻜﺎ ﻥ ﺘﺭﺠﻤﺔ ﺒﻤﻔﻬﻭﻡﺍﻟﺘﺭﻜﻴ ﺏ ﻤﻔﺎ ﻫﻴﻡ ﺘ ﻅﻬﺭ ﻓﻲﺍﻟﻭﺭ
ﺍ ﺕ .ﻭﻓﺠﺄﺓ ﻨﺭﻴﺩ ﺩﻤﺞﺃﻭﺍﻜ ﺱﺍﺭﺍﺩﺍ ﺕ ﻭﺭ ﺍﺠﻬﺎ ﺕ .ﻓﻠﻨﻔﺭ ﺽ ﻤﺜﻼ ﻨ ﻅﺎﻡ ﻋﺴﻜﺭ ﻱ ﻴﺠﻤﻊ ﻁﺎﺌﺭ ﺍﻟﻭ
ﺍ .ﻓﻜﻴ ﻑ ﻨﻘﻭﻟ ﺏ )ﻨ ﺼﻨﻊ ﻨﻤﻭﺫﺝﺃﻭ ﻗﺎﻟ ﺏ( ﻫﺫﻩﺍﺭﺍﺩﺍﻟﺘﻲ ﻫﻲ ﻁﺎﺌﺭﺓ ﺘﻤﺘﻠ ﻙ ﺭ،ﻭ AWACS
ﺍﻟﻭ ﻀﻌﻴﺔ؟
ﺍﺠﻬﺎ ﺕ:
ﻨﺴﺘﻌﻤلﺍﻟﻭ ٢
ﺍﺴﺘﻌﻤﺎلﺍﻟﺘﺭﻜﻴ ﺏ:
،ﻭﻨ ﻅﻴ ﻑﻟﻬﺎ ﺨﺎ ﺼﻴﺔ ﺭﺍﺩﺍ ﺭ.
ﻨﺸﺘﻕﺃﻭﺍﻜ ﺱ ﻤ ﻥ ﻁﺎﺌ ﺭﺓ
ﻨﺸﺘﻕﺃﻭﺍﻜ ﺱ ﻤ ﻥ ﺭﺍﺩﺍ ﺭﻟﻬﺎ ﺨﺎ ﺼﻴﺔ ﻁﺎﺌ ﺭﺓ
ﻨﺨﻠﻕ ﺼﻨ ﻑﺃﻭﺍﻜ ﺱ ﺠﺩﻴﺩ ﻭﻨ ﺯﻭﺩﻩ ﺒﺨﺎ ﺼﻴﺘﻴ ﻥ :ﺭﺍﺩﺍ ﺭ ﻭ ﻁﺎﺌ ﺭﺓ.
...
ﺍﻟﺘ ﺼﻤﻴﻤﺎ ﺕﺍﻵﺘﻴﺔ ﺘﺒﻴ ﻥ ﻤﺨﺘﻠ ﻑﺍﻟ ﺤﺎﻻ ﺕﺍﻟﺘﻲ ﻴﻤﻜﻨﻨﺎ ﺘ ﺤﻘﻴﻘﻬﺎ.
AWACS 2.3
AWACS 2.2
AWACS 2.1
AWACS 1
ﻟﻭﺍﺠ ﻬﺎﺕ
ﻟﺒﺔﺃﻭﺍﻜ ﺱ ﺒﺎ ﺴﺘﺨﺩﺍ ﻡﺍ
ﻗﻭ
واﻛ ﺲ ٣٫٢
أ
واﻛ ﺲ ٢ ٫٢
أ
واﻛ ﺲ ١ ٫٢
أ
واﻛ ﺲ ١
أ
ﻟ ﻰ ﺇﺩﺭﺍﺝ
ﻟﻤﺘﻘﻁﻌﺔﺘﺸﻴ ﺭ ﺇ
ﺍﻷﺴﻬﻡﺍ
ﻟ ﺼﻨ ﻑ.
ﻭﺍﺠﻬﺔ ﻀﻤﻥﺍ
ﺍﺠﻬﺎ ﺕ ﻓﻲ ﻟﻐﺔﺃﻨ ﻅﻤﺔ ،ﻻ ﻴﻭﺠﺩ ﻤﺒﺩﺃ ﺜﺎﺒ ﺕ ﻓﻴﻡ ﻴﺨ ﺹ ﺘﻘﺩﻴﻡ ﻭﺘﻤﺜﻴلﺍﻟﻭ
ﻓﻲﺍﻟﻭﻗ ﺕﺍﻟ ﺤﺎﻟﻲ
،ﺍﻟﻭﺴﻴﻠﺔﺍﻷﻜﺜﺭ ﺒﺴﺎ ﻁﺔ ﺘﺘﻤﺜل ﻓﻲﺍﻟﺘ ﺼﺭﻴﺢ ﺒ ﺼﻨ ﻑ ﻤﺠﺭﺩ )ﻤ ﻥ ﺩﻭ ﻥ ﺍﻟﻜﺎﺌ ﻥ .UMLﺃﻴ ﻀﺎ
ﺨ ﺼﺎﺌ ﺹ( ﻭ ﺤﻴﺙﺍﻹﺴﻡ ﻴﻜﻭ ﻥ ﻤﺴﺒﻭﻗﺎ ﺒﺎﻟﻤ ﺼ ﻁﻠﺢ .Interface
AWACS 3.3
ﺃﻭﺍﻜ ﺱ ٣,٣
ﻟ ﻭﺭﺍﺜﺔ
ﻟﺘﺭﻜﻴﺏ ﻭﺍ
ﻟﺒﺔﺃﻭﺍﻜ ﺱ ﺒﺎ ﺴﺘﺨﺩﺍ ﻡﺍ
ﻗﻭ
ﻟ ﺼﻔﺎﺕ : Polymorphisme
ﺘﻌﺩﺩﺍ ٥
ﺴﻭ ﻑ ﻨﺒﻴ ﻥ ﻗﻭﺓ ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ ﻤ ﻥ ﺨﻼل ﻤﻌﺎﻟﺠﺔﻟﻤﺜﺎل ﻜﺎﺌﻥ ﺒﻴﺎﻨﻲ GraphicObject
ﺍﺌﺭ ﻭﺃﺸﻴﺎﺀ
،ﺩﻭ ،ﻤﺜﻠﺜﺎ ﺕ
.ﺃ ﻱ ﺼﻭﺭﺓ ﻴﻤﻜ ﻥ ﺭﺅﻴﺘﻬﺎ ﻜﻤ ﺯﻴﺞ ﻤ ﻥﺍﻷﺸﻜﺎلﺍﻟﻬﻨﺩﺴﻴﺔ :ﻤﺭﺒﻌﺎ ﺕ
ﺍﺍﻟﺸﻜل ﻤﻤﻜ ﻥ ﻤ ﻥ ﺨﻼل ﻤﺒﺩﺃ ﺃﺨﺭﻯ ﻴﻤﻜ ﻥﺍﺸﺘﻘﺎﻗﻬﺎ ﻤ ﻥﺍﻟ ﺼﻨ ﻑ ﻜﺎﺌﻥ ﺒﻴﺎﻨﻲ .ﺘﺭﻜﻴ ﺏ ﻋﻠﻰ ﻫﺫ
ﺍ ﺕ ) .(notion of pointers downward compatibilityﻋﻠﻰ ﺍﻓﻕﺍﻟﺘﻨﺎ ﺯﻟﻲﻟﻠﻤﺅﺸﺭ
ﺍﻟﺘﻭ
ﻟ ﻤ ﺭﺠﻊ ("Referenceﻋﻠﻰ ﻜﺎﺌ ﻥﻟ ﺼﻨ ﻑ ﻤﺘﺨ ﺼ ﺹ ﻴﻤﻜ ﻥ ،ﻤﺅﺸﺭ )ﺃﻭ ﻓﻲ ﺒﻌ ﺽﺍﻟﻠﻐﺎ ﺕ "ﺍ ﻜل
ﺍﺌﻤﺎﺃ ﻥ ﻴﺅﺸﺭ ﻋﻠﻰ ﻜﺎﺌ ﻥ ﻤ ﻥ ﺼﻨ ﻑ ﻋﺎﻡ.ﺩ
ﻟﻰ ،ﻭﻴﺘﻌﻠﻕﺍﻷﻤﺭ ﺒﺎﻟﻤﻨﻬﺎﺝﺘﺤ ﺭﻙ ﺇ ،ﻓﻠﻨﻔﺭ ﺽ ﻤﺜﺎﻻ ﺁﺨﺭ ﺍﺍﻟﻤﺜﺎل ﻤﺒﻬﻤﺎﻗﺩ ﻴﻜﻭ ﻥ ﻫﺫ
ﺍﻉﺍﻟﻜﺎﺌ ﻥﺍﻟﺒﻴﺎﻨﻲﺍﺍﻟﻜﻭ ﺩ ﻴﻌﺩ ﺼﺎﻟ ﺤﺎ ﻷ ﻱ ﻨﻭﻉ ﻤ ﻥﺃﻨﻭﺍﻟﺫ ﻱ ﺸﺭ ﺤﻨﺎﻩ ﺴﺎﺒﻘﺎ .ﺇﺫ ﻥ ﻫﺫ،ﻭMoveTo
ﺍﺜﻴﺎ ﺕ ﺜﻡ ﻨﺸﺭ .ﻤﺭﺓ ،ﺘﻐﻴﻴﺭﻟ ﻺ ﺤﺩﺍ ﺼلﺍﺌﻤﺎ ﻋﻠﻰ ﻤ ﺤﻭ ﻤﺘﻭﺍﻟﺫ ﻱ ﻨ ﻁﺒﻘﻪ ﻋﻠﻴﻪ:ﺍﻟﺘ ﺤﺭﻴ ﻙ ﻴﻌﺘﻤﺩ ﺩ
ﺍﺍﻟﻜﻭﺩ ﺒﻔ ﻀل ﺘﻌﺩﺩﺍﻟ ﺼﻔﺎ ﺕ polymorphismﻷﻨﻪ ﻤ ﻁﻠﻭ ﺏﺃ ﻥ ﺘﻜﻭ ﻥ ﻤﻨﺎ ﻫﺞ ،ﻴﻌﻤل ﻫﺫﺃﺨﺭﻯ
ﺍﺩ ﻫﻲﺍﻟﺘﻲ ﺘﻡ ﻁﻠﺒﻬﺎ. ﺍﻟﻨﺸﺭﺍﻟﻤﻨﺎﺴﺒﺔ ﻟﻠﻜﺎﺌ ﻥﺍﻟﻤﺭ ﺍﻟﻤ ﺤﻭ ﻭ
،
ﺍﺍﻋﺘﺒﺭﻨﺎﺃ ﻥﺍﻟﻤ ﺤﻭ ﻴﺘﻠﺨ ﺹ ﻓﻲ ﺇﻋﺎﺩﺓ ﺭﺴﻡﺍﻟﻜﺎﺌ ﻥ ﻭﻟﻜ ﻥ ﺒﻠﻭ ﻥﺍﻟﺨﻠﻔﻴﺔ ،ﺇﺫ
ﻨﻔ ﺱﺍﻟﺸﻲ ﺀ
ﺍﺍﻟﺸﻜل: ﻓﺈﻨﻪ ﻴﻤﻜﻨﻨﺎ ﺘﻌﺭﻴ ﻑ ﻤﻨﻬﺎﺝﺍﻟﻤ ﺤﻭ ﺒﻬﺫ
method GraphicObject :: Delete
{
][Object SetColor: BackgroundColor
][Object Display
}
اﺋﺪ Overloading
ﺷﻜﻞ ﻧﺎﺟﻊﻟﺘﻌﺪداﻟ ﺼﻔﺎ ت:اﻟﺘﺤﻤﻴﻞاﻟﺰ .٣ .٥
ﺍﻟﺫ ﻱ ﻴﺴﻤﺢ
،ﻭﺍﺌﺩ ﻫﻭ ﺁﻟﻴﺔ ﻤﻘﺘﺭ ﺤﺔ ﺒﻜﺜﺭﺓ ﻤ ﻥ ﻗﺒلﻟﻐﺎ ﺕﺍﻟﺘﻭﺠﻪﺍﻟﻜﺎﺌﻨﻲ
ﺍﻟﺘ ﺤﻤﻴلﺍﻟ ﺯ
ﺍ ﺕ ﺘ ﺤﻤل ﻨﻔ ﺱﺍﻹﺴﻡ.ﺍﺀﺍل /ﺇﺠﺭﺒﺘﺨ ﺼﻴ ﺹ ﺘﻭﻗﻴﻌﺎ ﺕ ﻤﺨﺘﻠﻔﺔﻟﻤﻨﺎ ﻫﺞ /ﺩﻭ
ﺍﻨﺎ ﺕ.
،ﻓﻠﻨﻔﺭ ﺽ ﻤﺜﺎﻻ ﻜﻼﺴﻴﻜﻴﺎ ،ﻭﻴﺘﻌﻠﻕﺍﻷﻤﺭ ﺒ ﺤﺩﻴﻘﺔﺍﻟ ﺤﻴﻭ
ﻤ ﻥﺃﺠل ﺘﺜﺒﻴ ﺕﺍﻟﻤﻔﺎ ﻫﻴﻡ
،ﻭﻴﺘﺠﺎﻭ ﺏ ﻤﻊ ﺘﻔﻜﻴﺭﺍﻟﻤ ﺼﻤﻡ.
ﻓﻤ ﻥ ﺠﻬﺔ ﻨﺫﻜﹼﺭﺃ ﻥ ﻤﺒﺩﺃﺍﻟﻜﺒﺴﻠﺔ ﺸﺨ ﺼﻲ
vﻤﺠﻤﻭﻉﺃﻗﻔﺎ ﺹ
vﻤﺠﻤﻭﻋﺔ ﺤﻴﻭ
ﺍﻨﺎ ﺕ
ﺍﺱ vﻤﺠﻤﻭﻋﺔ ﺤﺭ
ﺍﺭﺓﺍﻨﻴ ﻥ ﺇﺩ
ﺍﻨﺎ ﺕ ) ﺤﺴ ﺏ ﻗﻭ
ﺍ ﻤﻌﻴﻨﺎ ﻤ ﻥﺍﻟ ﺤﻴﻭﺍﻗ ﺏ ﻋﺩﺩ
،ﺃ ﻱ ﺤﺎﺭ ﺱ ﻴﺠ ﺏﺃ ﻥ ﻴﺭ ﻋﻭ ﺽ ﺫﻟ ﻙ
ﺍ ﻤﻌﻴﻨﺎ ﻤ ﻥ
،ﺃ ﻱ ﻗﻔ ﺹ ﻴ ﺤﻭ ﻱ ﻋﺩﺩ ﺍل ﺍ ﺁﺨﺭ ﻤ ﻥﺍﻷﻗﻔﺎ ﺹ .ﻋﻠﻰ ﻨﻔ ﺱﺍﻟﻤﻨﻭ ،ﻭﻴﻨ ﻅ ﻑ ﻋﺩﺩﺍﻟ ﺤﺩﻴﻘﺔ(
ﺍﺭﺓﺍﻟ ﺤﺩﻴﻘﺔ(.
ﺍﺌﻤﺎ ﺤﺴ ﺏ ﺇﺩﺍﻨﺎ ﺕ ) ﺩ
ﺍﻟ ﺤﻴﻭ
ﱠ ﻑ ﻤﻥ ﻗﺒل ﺤﺎ ﺭ ﺱ ﻭﺍ ﺤﺩﻓﻘﻁ"
ﻨﻅ
ﻟﻰ ﻥ ﻗﻔ ﺹ /ﺃ ﻱ ﻗﻔ ﺹ ﻴ
ّ ﻑ ﻤﻥ ٠ﺇ
ﻨﻅ
ِ "ﺃ ﻱ ﺤﺎ ﺭ ﺱ ﻴ
* *
is cleaned by ١
Guardian Cage
clean *
feeds١ ١ containing
n *
Animal
is fed by is contained
ﺤﺩﻴﻘﺔ ﺤﻴﻭﺍﻨﺎ ﺕ
* *
ﻳُﻨ ﻈَ ﻒ ﻣ ﻦ ﻗﺒﻞ ١
ﺤﺎ ﺭ ﺱ ﻗﻔ ﺹ
* ِﻒ
ﻳﻨ ﻈ
ﻳﻄﻌﻢ ١ ١ ﻳﺤﻮ ي
*
n ﺤﻴﻭﺍﻥ
ﻳُﻄﻌﻢ ﻣ ﻦ ﻗﺒﻞ ﻣﺤﺘﻮ ى ﻣ ﻦ ﻗﺒﻞ
ﻟﺸﺭﺍﻜﺔ
ﻟﺘﺭﻜﻴﺏ ﻭﺍ
ﻟﺒﺔ ﺤﺩﻴﻘﺔ ﺤﻴﻭﺍﻨﺎﺕ ﺒﺎ
ﻗﻭ
ﺍﺍﻟﺸﻜل:
ﻫﺫﻩﺍﻟ ﺤﺎﻟﺔ ﺘ ﺼﻤﻡ ﺒﻬﺫ
١ ١
n n
١ is cleaned by
Guardian Cage
clean 0..n
feeds١ ١
0..n Animal
is fed by ٠
ﺤﺩﻴﻘﺔ ﺤﻴﻭﺍﻨﺎ ﺕ
١ ١
n n
١ ﹶ ﻑ ﻤ ﻥ ﻗﺒل
ﻴﻨ ﻅ
ﺤﺎ ﺭ ﺱ ﻗﻔ ﺹ
ﻴﻨ ﻅِ ﻑ 0..n
ِﻢ
ﻳُﻄﻌ ١ ١
0..n ﺤﻴﻭﺍﻥ
ﻳُﻄﻌﻢ ﻣ ﻦ ﻗﺒﻞ ٠
ﻟﺸﺭﺍﻜﺔ
ﻟﺘﺭﻜﻴﺏ ﻭﺍ
ﻟﺏﺁﺨﺭﻟﺤﺩﻴﻘﺔ ﺤﻴﻭﺍﻨﺎﺕ ﺒﺎ
ﻗﺎ
ذجاﻟﻜﺎﺋﻦ:
٧ﺧﺘﺎم ﻧﻤﻮ
ﺍﺭ ،ﻭﻟﻜ ﻥﺍﻟﻤﺸﻭﺍﺴﺔ ﻤﺒﺴ ﻁﺔﻟﺠ ﺯﺀ ﻗﻠﻴل ﻤ ﻥﺍﻟﻤﻔﺎ ﻫﻴﻡﺍﻟﻤﺘﻌﻠﻘﺔ ﺒﻤﻔﻬﻭﻡﺍﻟﻜﺎﺌ ﻥ ﻟﻘﺩ ﺭﺃﻴﻨﺎ ﺩﺭ
ﺍﻜﺔ ﻫﻲ ﺍﻟﺸﺭ،ﺍﻟﺘﺭﻜﻴ ﺏ ﻭ ﺍﺜﺔ
ﺍﺴﻌﺔ .ﻋﻼﻗﺎ ﺕﺍﻟﻭﺭ ﺍﺘﻬﺎ ﻭ
،ﻷ ﻥﺍﻟﻤﻔﺎ ﻫﻴﻡ ﻜﺜﻴﺭﺓ ﻭﻤﻤﻴ ﺯ ﺍل ﻁﻭﻴﻼ ﻤﺎ ﺯ
ﺍﻷﺴﺎﺴﻴﺔ ﻓﻲﺍﻟﻜﺎﺌﻨﺎ ﺕ .ﻓﺒﻌ ﺽﺍﻟﻤﺒﺭﻤﺠﻴ ﻥ ﻴﺭﻯﺃﻨﻪ ﻤ ﻥ ﺨﻼل ﻫﺫﻩﺍﻟﻌﻨﺎ ﺼﺭﺍﻟﺜﻼﺜﺔ ﻴﻤﻜ ﻥ ﻓﻌل
ﺍﺠ ﺏ ،ﻭﻴﻌﻤﻠﻭ ﻥ ﺒﻬﺎ.ﺍﻟﻨﻘ ﻁﺔﺍﻷﺴﺎﺴﻴﺔﺍﻟﻭ ﺍﻉﺃﺨﺭﻯ ﻤ ﻥﺍﻟﻌﻼﻗﺎ ﺕ ،ﺁﺨﺭﻭ ﻥ ﻴﺘﻨﺎﻭﻟﻭ ﻥﺃﻨﻭ ﻜل ﺸﻲﺀ
،ﻭﺒ ﺤﺎﻟﺔﺍﻟﻤﺭﺘﺒ ﻁ ﺒﺘﻔﻜﻴﺭﺍﻟﻤ ﺼﻤﻡ
ﺍ ﻜﻠﻴﺎ ﻋﻠﻰ ﻤﻔﻬﻭﻡﺍﻟﻜﺒﺴﻠﺔ ﻭ ﺤﻔ ﻅﻬﺎ ﻫﻲﺃ ﻥﺍﻟﻘﻭﻟﺒﺔ ﺘﻌﺘﻤﺩﺍﻋﺘﻤﺎﺩ
ﺍﺩ ﺇﻨﺠﺎ ﺯﻩ.ﺍﻟﺘ ﻁﺒﻴﻕﺍﻟﻤﺭ
رقٍّذ سبثمب فز٠ز ٞاٌدااس يدِ ٟمدمس ِقبٌغدخ اٌج١بٔدبد اٌغم٠مدخ اٌزد ٟرمد َٛثئؽٙدبس ٔزدبجظ اٌج١بٔدبد فٍد ٝاٌةبحدخ ؽ١دش وٕدذ
رسددزماَ عٍّددخ اٌغجبفددخ )( ، 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. }
ػ
طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضطبارةػادطكػسيػدطرغنػ ػ
ٍيخص :ال رْغ ٚاُ رضـ اىفبصيخ اىَْق٘عٔ ثقذ أ ٛجَيخ عجبفخ ٗ ،مزىل اٝضب إُ ٍقبٍو جَيخ اىغجبفةخ ٕة٘ ارةبسح االمجةش
اىَضدٗجٔ فال رخغئ فٖٞب .
ٍٗب اسٝذٓ ٍْل فضٝض ٛاىذاسط ٕٗ ٍِ ٜاالٍ٘س اىََٖٔ جذا اىزشرٞت فْذ مزبثخ أ ٛم٘د ثشٍجة ٜالظةؼ جَٞةـ االمة٘د اىغةبثقخ
ظٞث فْذ ٗضـ ظبصشٓ اىجذاٝخ ٗمزىل اىْٖبٝخ فٖ ٜفي ٚاعزقبٍٔ ٗاظذٓ أ ٛاّْةب ثقةذٕب اثقةذّب ٍغةبفخ ٕٗة tab ٜفية ٚى٘ظةخ
اىَفبرٞح ٗ ،مزىل فْذ اعزخذاً أ ٛجَيخ مبىذٗساُ ٍثال فَب اسٝةذٓ ٍْةل اُ رضةـ اىجَةو اىزبثقةٔ ىٖةب اٝضةب فيةٍ ٚغةبفخ tab
ىنٝ ٜنُ٘ رشرٞت رزبثـ اىجَو ٗاضح .
اٍب اىَنزجخ ٗ conio.hاىذاىخ )( getchعٞزٌ رشظٖب الظقب .
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
جطضةػاالدخالػ cinػ
رسزماَ عٍّخ اال خبي cinال خبي اٌج١بٔبد ِٓ اٌّسزماَ ٚ ،رٍفؼ س ٟإْ ؽ١ش ّ٠ىٓ ثبسدزمااَ ٘دذٖ اٌغٍّدخ ا خدبي اٌسالسدً
اٌمِزٚ ٗ٠وذٌه ا خبي ل ُ١اٌّز ١ماد ٟ٘ٚربثقخ ٌٍّىزجخ ٚ iostream.hربخذ اٌةىً اٌزبٌ: ٟ
>> cin
الؽددؼ فز٠ددز ٞاٌدداسا اْ حددىً ِقبِددً اال خددبي ٘ددِ ٛقبِددً احددبسح االص د م اٌّز ٚعددٗ ،ؽ١ددش ثبِىبٔدده ثقدداٖ وزبثددخ اسددّبء
اٌّز ١ماد اٌز ٟرم٠ا ا خبٌٙب ِٓ اٌّسزماَ ،أ ٞوّب : ٍٟ٠
; int x
; cin >> x
ِٚب اس٠ان اْ رقٍّٗ ا٠ضب أٗ ثبِىبٔه ا خبي ل ُ١الوضم ِٓ ِز ١م ثٕفس اٌص ١خ وّب : ٍٟ٠
; cin >> x >> y
طثالػاصتبػبرظاطجػالدخالػاضرشمػاضعدديػاضصحغحػ5ػػ،ػثمػشمػبطبارتهػرضىػاضذاذةػ ػ
الؽؼ فز٠ز ٞاٌدااس اْ ٘دذا اٌجمٔدبِظ لدبَ ثؾدً اٌّسدبٌخ ٘ٚدذا ٘د ٛاٌّغٍدٛة يد ٟاٌسدؤاي ٌٚىدٓ ٘دذا اٌجمٔدبِظ ثؾبعدٗ ٌدجق
اٌزقا٠الد ٌ١صجؼ اوضدم ؽ٠ٛ١دٗ ،ؽ١دش أدٗ ال ٠ؾزد ٞٛفٍد ٝأ ٞعٍّدخ رٛضد١ؾ١خ ،أ ٞاْ فٕدا رةد ٍٗ١ال ٔقٍدُ ِدب ٘د ٛاٌّغٍدٛة
ثبٌضجظ ،يال رمٛي ٌ ٟثبٔ ِٓ ٟوزت اٌسؤاي ٚافٍُ ِب ٠م٠ا ٘ ،ذا ِٓ ٚعٙخ ٔؾمن أذ ٌٚىٓ ٌ ٛلبَ أ ٞحم اخم ثبسزماِٗ
ال ٠قٍُ ِب ٘ ٛاٌّغٍٛة ٘ٚذا ِب اس٠اٖ اْ ٠ى ْٛساسمب ئ ٟفسه فٕا وزبثخ أ ٞثمٔبِظ اِ ٚمغـ ثمِغ ٟاْ ال رٕؾم ٌالِٛس ِٓ
زا٠ٚزه أذ ٚرذوم اجّب اْ االٔسبْ ٕ٠سٚ ٝال ٠زذوم ِدـ ِدمٚس اٌدزِٓ ،يّدب رزدذومٖ االْ سزٕسدبٖ ثقدا يزدمٖ ٌدذٌه اوزدت عّدً
رٛض١ؾ١خ ٌزىٚ ْٛاضؾٗ ٌه ١ ٌٚمن ،ؽ١ش ٠صجؼ اٌّمغـ اٌجمِغ ٟوّب : ٍٟ٠
٘ىذا اٌصجؼ إٌزبط اوضم ٚضٛػ فٓ سبثمٗ ٌه ١ ٌٚمن . الؽؼ فز٠ز ٞاٌااس
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ا ٚلد ُ١اٌّز ١دماد فٍدٝ ٕ٘بن اٌقا٠ا ِٓ اٌاٚاي اٌّٛع ٖ ٛاخً ِىزجدبد يد ٌ ٟدخ اٌسدٌٍ ٟزقبِدً ِدـ ا خدبي ا ٚاخدماط اٌؾدمٚ
حبحخ اٌّسزماَ ِٕٙٚ ،ب :
اضداضةػ) ( 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ػبادتخدامػعذهػاضداضةػثمػاطبدػطعاطضةػباالدصيػ .ػ
الظؼ فضٝض ٛاىذاه اُ اىقَٞخ اىز ٜؽٖشد في ٚاىشبرخ ثقذ رْفٞز ٕزا اىجشّبٍج ٕ ٜٕٗ 53 ٜاىقَٞخ اىَنبفئخ ىشقٌ 5ثْؾبً
االعن ٜم٘د .
تدرغبػ:ػػاصتبػبضغةػاضديػالدخالػاضرشمػ5ػبادتخدامػعذهػاضداضةػثمػاطبعهػصرشمػرضىػاضذاذةػػ .ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اضداضةػ) ( putchar
ؽ١ش رسزماَ ٘ذٖ اٌااٌخ ٌغجبفخ ؽم ٚاؽا يمظ فٍ ٝاٌةبحخ ٚ ،وذٌه ربخذ لّ١خ ٚاؽاٖ يمظ وّقبًِ ِّمس ٌٙب ِٓ ٛ٘ٚإٌٛؿ
اٌقا ٞاٌصؾ١ؼ ٚ ،ذٌه الؽٙبسٖ فٍ ٝاٌةبحخ ؽ١ش ٠زُ رّم٠م اٌمّ١خ اٌّىبيئخ ٌٍمِز ثبالسى ٟو ٛاٌ٘ ٝذٖ اٌااٌخ الؽٙبسٖ فٍٝ
اٌةبحخ ٚوذٌه ا٠ضب رق١ا ٘ذٖ اٌااٌخ لّ١خ ِٓ إٌٛؿ اٌقا ٞاٌصؾ١ؼ ٟ٘ٚاٌّ١خ اٌّّمٖ ثبالسى ، ٟؽ١ش رٛعا ٘ذٖ اٌااٌخ يٟ
اٌّىزجخ stdio.h
ٟ٘ٚفٍ ٝاٌص ١خ اٌزبٌ١خ :
)int putchar ( int x
ؽ ٛ٘ : x ٟلّ١خ اٌمِز اٌّما اؽٙبسٖ فٍ ٝاٌةبحخ ثبالسى ٟو. ٛ
طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالظكارػاضرطزػ(ػaػ)ػرضىىػاضذاذىةػبادىتخدامػعىذهػاضداضىةػثىمػاطبىدػاضقغطىةػ
اضطصاسئةػضهػباالدصيػ ػ
aئ ٟؾبَ الؽؼ فز٠ز ٞاٌااس لّٕب ثزّم٠م اٌملُ ِٓ ٛ٘ٚ 97إٌٛؿ اٌقا ٞاٌصؾ١ؼ اٌ٘ ٝذٖ اٌااٌخ ٠ٚىبيئ اٌؾم
االسى ٟصُ اؽزفؾٕب ثبٌمّ١خ اٌّمعقٗ 97 ٟ٘ٚثبٌّز م . x
ثبالسى. ٟ ؽ١ش اْ اٌااٌخ )( putchسزم َٛثبؽٙبس اٌؾم aفٍ ٝاٌةبحخ عٍّخ اٌغجبفخ coutسزم َٛثغجبفخ لّ١خ اٌؾم
تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػ،ػضتطوغرػبرظاطجػاضرشمػاضدريػاضدابقػ،ػبحغثػغظكرػظجطهػرظدػادخالػ
أيػرطزػطنػرطوزػاضبادوردػبادتخدامػاضداضةػ) ( putcharػ،ػثمػاطبدػاضرشمػاضدريػرضىػاضذاذةػ ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اضداضةػ) ( putsػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
طاػعيػاضداضهػ؟ ػ
اٌااٌٗ ٘ ٟفجبسح فٓ ِمغـ ثمِغ ٠ ٟم َٛثبعماء فٍّ١دٗ اِ ٚغّٛفدٗ ِدٓ اٌقٍّ١دبد سدٛاء فٍّ١دبد ا خدبي ا ٚاخدماط اٚ
فٍّ١بد ؽسبث١خ إِ ٚغمٚ ٗ١ربخذ ٘ذٖ اٌااٌٗ ِٛلـ ِٓ اٌجمٔبِظ أ ٞرى ْٛعزء ِٕٗ ؽ١ش ّ٠ىٕٕب اٌمٛي ٕ٘دب اْ اٌجمٔدبِظ اٌّصدُّ
ثٍ خ اٌس ٟثٍس ثٍس ٘ ٛفجبسح فٓ ِغّٛفخ ِٓ اٌاٚاي اٌز ٟرم َٛوً ِٕٙب ثب اء ٚس خبص ي ٟاٌجمٔبِظ ،ثؾ١ش رقًّ ِقب يٟ
ثمٔبِظ ِزىبًِ .صُ رٕز٘ ٟٙذٖ اٌااٌٗ ثقا أزٙبء فٍّٙب ،يبٌااٌٗ اٌمج١سٗ ٟ٘ mainاٌٗ ا٠ضب رم َٛثبٌقا٠ا ِٓ اٌقٍّ١بد .
اعطغةػاضدوالػ :ػ
ضضدوالػاعطغةػصبغرةػطظكاػ :ػ
.1رسبفأب فٍ ٝاخزصبس وزبثخ و ٛاٌجمٔبِظ اذ ٠ىزف ٟثبسزافبء اٌااٌخ اٌّغٍٛثٗ ثذوم اسّٙب يمظ ٌزم َٛثبٌقًّ اٌّغٍٛة .
.2رالي ٟفٍّ ٗ١اٌزىماس ي ٟخغٛاد اٌجمٔبِظ اٌذ٠ ٞزغٍت فّال ع٠ٛال ٚحبلب ،يٍٕب اٌىٍّخ اٌّةدٛٙسٖ "وزجٙدب ِدمٖ ٚاؽداٖ
يمظ ٚاسزافٙ١ب ِز ٝرةبء" .
.3رٛيم ٌٕب ِسبؽٗ وج١مٖ ِٓ اٌجمٔبِظ يزم ٌٛ ً١إٔب ٔم َٛثىزبثٗ ٘ذٖ اٌمغٛاد اٌّٛع ٖ ٛاخً اٌااٌٗ ي ٟوً ِمٖ ٔؾزبعٙب
يٙذا ٠ؤ ٞاٌ ٝفجئ ٚؽغُ وج١م ي ٟاٌذاومٖ ٘ٚذا ٌ١س ع١اا .
.4اخزصبس فٍّ ٗ١اٌجمِغٗ ٚرٕف١ذ اٌجمٔبِظ ثبسمؿ ٚلذ ِّىٓ .
.5رس ًٙفٍ ٕ١ب اٌىض١م يِ ٟماعقٗ ٚرصؾ١ؼ اٌىٚ ٛاٌزقا ً٠فٍ ، ٗ١أ٠ ٞزُ رمسدُ اٌجمٔدبِظ فٍد ٝاعدزاء أ ٞفداٖ ٚاي ٌىدً
اٌٗ فٍّٙب اٌمبص ٚفٕا ٚع ٛأ ٞخًٍ ٔمٔ َٛذ٘ت اٌ ٝاٌااٌٗ اٌّقٕٔٚ ٗ١قبٌغٗ ثاال ِٓ اٌجؾش ثغّ١ـ و ٛاٌجمٔبِظ ِٓ
ا ٌٗٚؽز ٝاخمٖ ِّب ٚيم فٍٕ١ب اٌٛلذ ٚاٌغٙا .
اظواعػاضدوالػسيػضغةػاضديػبضسػبضسػ :ػ
رّم٠م ٚاسعبؿ . ربخذ لٚ ُ١رمعـ قَٔٞ .1
ثا ْٚرّم٠م ٚثا ْٚاسعبؿ . ال ربخذ لٚ ُ١ال رمعـ قَٔٞ .2
رّم٠م ٚثا ْٚاسعبؿ . ربخذ لٚ ُ١ال رمعـ قَٔٞ .3
ثا ْٚرّم٠م ٚثا ْٚاسعبؿ . ال ربخذ لٚ ُ١ال رمعـ قَٔٞ .4
ؽ١دش ٠دزُ اسددزافبء اٌااٌدٗ ٚلددذ اٌؾبعدٗ ٌٙدب ٚذٌدده ثىزبثدخ اسددّٙب يد ٟاٌّىددبْ اٌّدما اسدزافبجٙب ي١ددٗ ٚ ،ثؾسدت ِددب ربخدذ ِددٓ
ِقبِالد ؽست إٌٛؿ ٚاٌقا ؽ١ش س١زُ حمػ ذٌه الؽمب .
ٍالظؾٔ ٍَٖٔ ٍب ٝجت فيٞل اُ رقئَ ْٕب أّ ثبٍنبّْةب رَشٝةش قة ٌٞمَةب رشةب ىيذاىةخ ٗ ،ىنةِ ال َٝنةِ اُ ّقٞةذ امثةش ٍةِ قَٞةٔ
ٗاظذٓ ثشنو ٍجبرش.
ػ
ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ػ
صغفغهػبظاءػاضداضةػ :ػ
اٚال ٠غت اْ رقٍُ فز٠ز ٞاٌااس اْ ٌىً اٌٗ ح١ئب اصٕبْ ال صبٌش ٌّٙب ٛٔ ٛ٘ٚؿ اٌم ُ١اٌز ٟسزّمس ٌٍااٌٗ " أٔ ٞمسدٍٙب
ٌٙب " ٛٔٚؿ إٌبرظ اٌذ ٞسزم َٛاٌااٌٗ ثؾسبثٗ أ ٞاٌمّ١خ اٌّمعقخ ،يقٕا ثٕبء أ ٞاٌٗ ِٓ اٌداٚاي ٠غدت اٚال اْ ٔضدـ ٔدٛؿ اٌمّ١دٗ
اٌز ٟسزق١ا٘ب اٌااٌٗ ثقا أزٙبء فٍّٙب ِضً ٚ int , float , char …voidا٘ ِٓ ٞذٖ االٔدٛاؿ ٠ىزدت ثاا٠دخ اٌسدغم اٌزد ٟرٕدٞٛ
صدُ ٔضدـ ٔدٛؿ اٌمد ُ١اٌزدٟ ثٕبء اٌااٌٗ فٍ ٗ١صُ ٔم َٛثٛضـ أ ٞاسُ ٌٍااٌٗ ِٓ اعً رقم٠فٙب ٌٍجمٔبِظ صُ ٔضـ ل ٛسدبْ ٘الٌ١دبْ
سزّمس ٌٙذٖ اٌااٌٗ ِـ أِ ٞز ١م السزمجبي اٌم ّٗ١اٌّّمسٖ ٌٙب ٌؾفؾٙب ي٠ٚ ٗ١ى ْٛحىٍٙب ٘ىذا :
ثٌ ّبر ٜاالُ ىجْب جغٌ اىذاىخ ٗٝنُ٘ ثبىشنو اىزبى: ٜ
نوع القيمه المرجعه )…… , ………..,اسم المعامل الممر نوع المعامل ( اسم الداله -
الؽؼ فز٠ز ٞاٌااس و١ف ٠ى ْٛعسُ اٌااٌخ ٛ٘ٚاٌغًّ اٌز ٟرىِ ْٛؾصٛسٖ اخً اٌؾٛاصم } { صُ ٠غدت اْ ٠زجدـ
ٔٙب ٗ٠اٌغٍّٗ اخً عسُ اٌااٌٗ اٌفبصدٍٗ إٌّمٛعدٗ ٠ٚغدت اْ ٕٔزجدٗ ع١داا اْ اٌغّدً اٌزد ٟال رزجدـ ثفبصدٍٗ ِٕمٛعدٗ رٕغجدك ا٠ضدب
اخً اٌااٌٗ ِضً عًّ اٌاٚساْ ٚ ... 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اضدوالػاضجاعزةػ
ٚرى ْٛاخً ِزمعُ اٌس ٟثٍس ثٍس ؽ١ش ٠زُ اسزافبجٙب ِجبحمح ثىزبثٗ اسّٙب ٌٚىٓ ثقا اْ ٔسزاف ٟاٌّىزجٗ اٌمبصٗ ثٙب.
ٍثبه في ٚاىذٗاه اىجبٕضح :
فٕاِب ٔم٠ا اْ ٔؾست سلُ ٌٗ ا ا ٚل ٖٛثبِىبٕٔب اْ ٔسزاف ٟاٌااٌٗ اٌغب٘زٖ اٌمبصٗ ثٙذٖ اٌقٍّ pow ٟ٘ٚ ٗ١صُ ٔىزت اٌمّٗ١
ِميٛفٗ ثبال وّب : ٍٟ٠
pow ( 4 , )2
اسُ اٌااٌٗ ،اٌملُ اٌم ٖٛا ٚاال
اٌٗ اخم ٜعب٘زٖ ٟ٘ٚاٌٗ اٌغذس اٌزمث١ق sqrt ) ٟيقٕاِب ٔم٠ا اْ ٔؾست عذس أ ٞسلُ ٔسزاف٘ ٟذٖ اٌااٌٗ صُ ٔىزت اٌمّٗ١
اٌزٔ ٟم٠ا اْ ٔؾست عذس٘ب وّب : ٍٟ٠
( sqrt ) 4
اسُ اٌااٌٗ اٌملُ
ٕ٘ٚب ٠غت اْ ال ٕٔس ٝاْ ٔضّٓ اٌّىزجٗ اٌز ٟرزجـ ٌٙب ٘ذٖ اٌاٚاي ي ٟثاا ٗ٠اٌجمٔبِظ ٚفٕاِب ٔسزماَ اٌااٌز ٓ١اٌسبثمزٔ ٓ١سزافٟ
اٌّىزجٗ math.hاٌمبصٗ ثبٌقٍّ١بد اٌم٠بضٕ٘ٚ ٗ١بن اٌقا٠ا ِٓ اٌّىزجبد اٌغب٘زٖ اٌزٌ ٟىً ِٕٙب فٍّٗ اٌمبص .
> #include < math . h
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىغجبفخ اعَل ف ٜداىخ اعَٖب . name
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
.1ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػادطكػرضىػاضذاذةػبادتخدامػداضةػادطكاػ readػثمػاطبدػطحتوغىاتػطىاػتىمػ
ادخاضهػبظفسػاضداضةػ .ػ
ػ
.2ػتدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرشطغنػطنػاضطدتخدمػثمػاطبدػاضرشمػاالصبرػبغظكمػبادتخدامػداضةػادىطكاػ
maxػ .ػ
ػ
.3ػتدرغبػاصتبػبرظاطجػبضغىةػاضدىيػبضىسػبضىسػالدخىالػ8ػ رالطىاتػضطاضىبػثىمػادخىالػاالدىمػوشىمػبحدىابػاضطعىدلػثىمػاطبىدػاالدىمػ
واضطعدلػرضىػاضذاذةػ .ػ
ػ
.4ػتىىدرغبػاصتىىبػبرظىىاطجػبضغىىةػاضدىىيػبضىىسػبضىىسػالدخىىالػطصىىفوسهػطىىنػاضظىىوعػاضعىىدديػاضصىىحغحػطوضكىاػػ5ػارشىىامػغىىتمػادخاضكىىاػطىىنػ
اضطدتخدمػثمػشمػبطبارةػطجطوركاػرضىػاضذاذةػبادتخدامػداضةػسررغهػادطكاػ sumػ
ػ
.5ػ تدرغبػاصتبػبرظىاطجػبضغىةػاضدىيػبضىسػبضىسػالدخىالػرشىمػرىدديػصىحغحػبداضىةػسررغىهػواعىربهػبظفدىهػرىددػطىنػاضطىراتػغىتمػ
تحدغدعاػبادخالػرشمػاخرػطنػاضظوعػاضعدديػاضصحغحػثمػاطبدػاضظاتجػرضىػاضذاذةػ .ػ
ػ
.6ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػضحدابػطعروبػرددػغتمػادخالػطنػاضطدتخدمػثمػاطبعهػرضىػاضذاذةػ .ػ
ػ
.7ػ تدرغبػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػطعدلػطاضبػطنػاضظوعػاضحقغقيػثمػاطبدػتقدغرهػاذاػصانػاصبرػطنػ51ػغىتمػ
طبارةػظاجحػواذاػاشلػغتمػطبارةػرادبػ .ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ب.ػداضةػتاخذػشغمػوالػتعغدػأيػشغطةػ:ػ ػ
ٌٙٚب اٌص ١خ اٌزب٠خ :
)……void function_name (type x, type y,
{
}
ؽ١ش اْ ٘ذا إٌٛؿ ِٓ اٌاٚاي ٠بخذ ل ُ١وّقبِالد ِّمٖ اٌ٘ ٝذٖ اٌااٌدخ ٚ ،ال ٠ق١دا أ ٞلّ١دخ ٌٚزقج١دم فدٓ اٌااٌدخ اٌزد ٟال
رق١ا أ ٞلّ١خ ٔ ،ضـ اٌىٍّخ اٌّؾغٛزح ي ٌ ٟخ اٌسٚ ٟاٌس ٟثٍس ثٍس void ٟ٘ٚأ ٞاْ ٘ذٖ اٌااٌخ ال رق١ا لّ١خ .
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ الدخبه سقٌ فذد ٛصحٞح داخو اىذاىخ اىشئٞغٞخ ثٌ قٌ
ثزَشٝشٓ في ٚداىخ فشفٞخ ثٌ اعجـ ٕزا اىقذد في ٚاىشبرخ ثقذد ٍشاد قَٞزٔ ف ٜمو عغش .
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرشطغنػطنػاضطدتخدمػسىيػاضداضىةػاضرئغدىغةػثىمػشىمػبتطرغرعىاػاضىىػ
داضهػسررغةػضطبارةػاضرشمػاالصبرػبغظكمػ .ػ
رذسٝت :امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ الدخبه فالٍز ِٞىغبىت ٍِ ّ٘ؿ ظقٞق ٜف ٜاىذاىخ اىشئٞغٞخ ثٌ
ٍشسٕب في ٚداىخ فشفٞخ اعَٖب 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افذ ادخبىٔ ثٌ افذ قَٞخ ٍضشٗة اىقذد اىخ اىذاىخ
اىشئٞغٞخ ٗاعجقٖب ٍـ جَو ر٘ضٞحٞخ .
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
د.ػداضةػتاخذػشغمػوتعغدػشغطةػ :ػ
طثالػاصتبػبرظاطجػبضغةػاضديػبضسػبضسػالدخالػرشطغنػطنػاضطدتخدمػسيػاضداضةػاضرئغدغةػثمػشمػبتطرغرػاضرشطغنػ
اضىػداضةػسررغةػضحدابػطجطوركطاػثمػارجدػاضطجطوعػاضىػاضداضةػاضرئغدغةػوشمػبطبارتةػ .ػ
ػ
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. } ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اضترصغب ٘ ٛفجبسح فٓ ِمغـ ثمِغ٠ ٟصف حٟء ِق ، ٓ١ؽ١دش ٠زىدِ ْٛدٓ أٔدٛاؿ ِمزٍفدخ ِدٓ اٌج١بٔدبد ،وبألفداا
اٌصؾ١ؾخ أ ٚاٌؾم١م١خ أ ٚاٌؾم ٚا ٚاٌسالسً اٌمِز٠خ اِ ٚز٠ظ ِّٕٙب ٚ ،غ١م٘ب ِٓ أٛاؿ اٌّز ١ماد ،وٍٙب ي ٟلبٌدت ٚاؽدا ،
أ ٞاْ اٌزمو١ت ٘ ٛفجبسح فٓ لبٌت ٠ؾز ٞٛفٍٔ ٝدٛؿ أ ٚاوضدم ِدٓ أدٛاؿ اٌّز ١دماد ،فية ٚفنةظ اىَصةف٘فبد اىزة ٜرحزة٘ٛ
في ٚفْبصش ٍِ ّفظ اىْ٘ؿ ٘ٚ ،ذا ا ٜاٌ ٝاٌىض١م ِٓ اٌّمٔٚخ ي ٟاٌجمِغخ ثٍ خ اٌسٚ ٟاٌس ٟثٍس ثٍس .
رم ً١فز٠ز ٞاٌااس ٌ ٛأس د رصّ ُ١ثمٔبِظ ؽبسٛثٌّ ٟؾً أ ٚاد رٕؾ١ف ،يى١ف سززقبًِ ِـ ٘ذٖ اٌّٛا إذا ودبْ
ٌىً ِب ح ( اعٌ ٗرةشمخ ٍصةْقٔ ٗعةقش ٗظجةٌ ٗغٞشٕةب ،يّدٓ اٌصدقت فٍٕ١دب أْ ٔسدزماَ اٌّصدفٛيبد ٌزمدز ٓ٠ث١بٔدبد ٘دذٖ
اٌّٛا ،الْ اٌّصفٛيخ ال ّ٠ىٓ أْ رؾز ٞٛفٍ ٝأٔٛاؿ ِمزٍفخ ِٓ اٌج١بٔبد ٕ٘ٚ ،ب عبءد اٌزماو١ت ٌزقبٌظ ٌٕدب ٘دذا األِدم ،فٕدب
ٔأخذ ِضبال ٌ ٛوبْ ٌا٠ه صٕف ِدٓ ِدٛا اٌزٕؾ١دف ٘ٚد" ٛاٌةدبِجِ "ٛدضال ٚودبْ ٌٙدذا اٌصدٕف أوضدم ِدٓ خبصد١خ ِضدً :اٌسدقم
ٚاٌؾغُ ٚاالسُ ٔٚىزف ٟثذٌه ،يّبذا سدٕفقً ٚو١دف سدٕزقبًِ ِدـ ٘دذا اٌصدٕف " اٌةدبِج " ٛاخدً ثمٔبِغٕدب اٌؾبسدٛث٘ ، ٟدً
سٕقم وً ِٓ اٌسقم وّز ١م ٚاالسُ وّز ١م ٚاٌؾغُ وّز ١م ٘ ،ذا ٌ ٛوبْ ٌإ٠ب يمظ ٔٛؿ ٚاؽا ِٓ اٌصٕف حبِج ، ٛيّبذا ٌٛ
وبْ ٌإ٠ب فةمح أٔٛاؿ ِٓ ٔفس اٌصٕف ً٘ ،سٕم َٛثزقم٠ف ِز ١ماد عا٠اح ٌىً ٔٛؿ ِٓ ٘ذا اٌصٕف ُِّّّ ِٚ ،دبذا ٌد ٛودبْ
ٌإ٠ب ِٛا رٕؾ١ف اخمٚ ، ٜثأفاا ٚأٛاؿ ا٠ضب ،فٕا٘ب س١صجؼ اٌى ٛاٌجمِغِ ٟقما عاا ،ؽ١ش ال ّ٠ىٓ رزجقٗ ٚسثّدب ا٠ضدب
٠صقت وزبثزٗ ،اذا ٘ذٖ اٌغم٠مدخ ال رصدٍؼ ٚال ثدب ٞحدىً ِدٓ االحدىبي السدزمااِٙب يد ٟثمٔبِغٕدب ٕ٘ٚ ،دب ٚيدمد ٌٕدب ٌ دخ اٌسدٟ
ٚاٌس ٟثٍس ثٍس يٌ ٗ١اوضم ِمٔٚخ ٌجٕبء اٌجمٔبِظ ٟ٘ٚاٌزماو١ت ِّ ،ب س ًٙفٍٕ١ب اٌىض١م اٌىض١دم يد٘ ٟدذا اٌّغدبي ؽ١دش اصدجؾذ
اٌجمِغخ رزغٗ ٔؾ ٛاٌجمِغخ اٌىبجٕ١خ " اٌة١ئ١خ ".
أ ٞاْ ٔغقً وً حٟء اخً اٌجمٔبِظ فجبسح فٓ وبجٓ ٠ ،ؾًّ وً اٌمصبج اٌمبصخ ثبٌةٟء ٔفسٗ يد ٟلبٌدت ٚاؽدا ،
أ ٞاْ ٠ؾز٘ ٞٛذا اٌىبجٓ فٍ ٝأٛاؿ ِمزٍفخ ِٓ اٌج١بٔبد وبٌسالسدً اٌمِز٠دخ ٚاالفداا اٌصدؾ١ؾخ ٚغ١م٘دب ٚ ،اٌىدبجٓ وّدب رقٍدُ
فز٠ز ٞاٌااس ٘ ٛوً حٟء ؽم١م ٌٗ ٟخصبج يبٌس١بسح ِضال ٘ ٟفجبسح فٓ وبجٓ ِٓٚخصبجصٙب إٌدٛؿ ٚاٌّ٠ ٛدً ٚاٌٍدْٛ
اٌ ٝيخمٖ ٚ ،اٌؾبسٛة ا٠ضب ٘ ٛفجبسح فٓ وبجٓ ِٓٚخصبجصٗ اٌسمفخ ٚإٌٛؿ ٚاٌسدقٗ ٚاٌةدموخ اٌّصدٕقخ .....اٌدخ ٕ٘ٚ ،دب
ي ٟثمٔبِغٕب اٌمبص ثّؾً ا ٚاد اٌزٕؾ١ف ّ٠ىٓ اْ ٔغقً اٌةبِج ٛفجدبسح فدٓ ودبجٓ ،الْ ٌدٗ خصدبج فبِدٗ ِضدً :االسدُ
ٚاٌسقم ٚاٌؾغُ ٚغ١م٘ب ،ؽ١ش اْ ٘دذا اٌمصدبج ِةدزموٗ يد ٟعّ١دـ أدٛاؿ اٌةدبِجٚ ٛودذٌه ا٠ضدب ٌد ٛودبْ ٌدإ٠ب ِٕؾفدبد
اخم ٜسٕزجـ ٔفس اٌغم٠مخ .
اضفرقػبغنػاضبرطجةػاإلجرائغةػواضبرطجةػاضذغئغةػ"ػاضصغظوظغة" ػ
ػ
ٔىزت و ٛثمِغ ٟثبسزمااَ اٌجمِغخ اإلعماج١خ وّب رقٍّذ سبثمب ٌٍصٕف حبِج٠ٚ ٛى٘ ْٛىذا : فٕب فز٠ز ٞاٌااس
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
الؽؼ فز٠ز ٞاٌااس اْ إٌٛؿ االٚي ِٓ اٌصدٕف حدبِج ٛاؽزدبط اٌدِ 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اْ ال ٠ى ْٛي ٟاسُ اٌّز ١دم أ ٞسِدز خدبص ا ٚاحدبسح ؽسدبثٗ١
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
صُ ٔم َٛثفزؼ ؽٛاصم } { ٌٍزقج١م فٓ ثاا٠خ اٌزمو١ت ٙٔٚب٠زٗ وّدب يد ٟخغدٛح ٚ ، 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 ٖٛال ٕٔس ٝاٌفبصٍخ إٌّمٛعخ ثقا ٔٙب٠خ اٌؾبصمح ٌٍاالٌخ فٍ ٝأزٙبء اٌزمو١ت .
ِب لّٕب ثئفاا ٖ فز٠ز ٞاٌااس ٘ ٛثٕبء رمو١ت ٠غّـ أٛاؿ ِمزٍفخ ِٓ اٌج١بٔبد يٚ ٟلذ ٚاؽا اِب االْ سٕم َٛثئٔةبء اٌىبجٕبد
ِٓ ٘ذا اٌزمو١ت
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اظذاءػاضصائظاتػطنػاضتراصغب ػ
ػ
صغفغهػتورغثػطحتوغاتػاضترصغبػضضصائظاتػ:ػ ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اٌزمو١دت ٘ٚىذا ٔى ْٛلا أزٕ١ٙب ِٓ حمػ عمق أةبء اٌىبجٕبد ِٓ اٌزمو١دت ،يدافٕب االْ ٔٛضدؼ و١دف ٠دزُ رٛس٠دش خصدبج
ٌٍىبجٕبد ٚاٌ١ه اٌةىً اٌزبٌ: ٟ
سعٌ ر٘ضٞح ٜىجٞبُ مٞفٞخ ر٘سٝث اىنبئْبد اىَْزَٞخ ىيزشمٞت أ ٛاىزبثقخ ىٔ ّفظ اىصفبد :
ٕ٘ٚب رُ رٛس٠ش ٔفس اٌّؾز ِٓ ٜٛاٌزمو١ت اٌ ٝعّ١ـ اٌىبجٕبد إٌّزّ١خ ٌٗ ٟ٘ٚثٕفس اٌمصبج ٌٚ ،ىٓ ودً ودبجٓ ٌدٗ
ِؾز ٜٛخبص ثٗ ٠مزٍف فٓ االخم ،ؽ١ش ٠زةبثٗ ثٕفس إٌٛؿ ٔٚفس االسُ ٚاٌذ١ّ٠ ٞز ذٌه ٘ ٛاسُ اٌىبجٓ فٕا ِقبٌغزٗ .
يالؽؼ فز٠ز ٞاْ وً اٌّز ١ماد اٌز ٟرُ رٛس٠ضٙب اٌ ٝاٌىبجٕبد ِ٘ ٟز ١ماد ِٕزّ١خ ٌٙذا اٌزمو١دت أ ٞخبصدٗ ثدٗ ٚودً
وبجٓ ٌٗ ِز ١مارٗ إٌّزّ١خ اٌمبصخ ثٗ ا٠ضب ٚ ،ثٕفس االسّبء ٚاالٔٛاؿ ِٚ ،ب ١ّ٠ز٘ب فٕا ِقبٌغزٙب ٘ ٛاسُ اٌىبجٓ ٔفسٗ ،أ ٞاْ
ِز ١ماد اٌىبجٓ ٔ ٟ٘ 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.
االسٍٛة ٘ ٟ٘ٚىذا :
ٟ٘ٚثٕفس االسٍٛة اٌسبثك ِ ،ـ اٌقٍُ اْ اٌزمر١دت سدٛاء اال خدبي ا ٚاالخدماط ٌد١س ٌدٗ أ ٞفاللدٗ يد ٟذٌده يجئِىبٔده
ا خبي اٌّز ١ماد عّ١قٙب ا ٚؽز ٝعزء ِٕٙب ٚوذٌه اٌغجبفخ ا٠ضب فٍ ٝاخزال اٌزمر١ت .
ٍٗةةب اسٝةةذٓ ٍْةةل فضٝةةض ٛاىةةذاسط ْٕةةب ٍٗةةب ارةةذد فيٞةةٔ ثشةةذٓ ٕةة٘ اُ ظ٘اصةةش اىجذاٝةةخ ٗاىْٖبٝةةخ ٝجةةت اُ رنةةُ٘ فيةةٚ
اعزقبٍخ ٗاظذح ثٌ ّجقذ ٍغبفخ tapىَب ف ٜداخيٖب مَب ف ٜاىخغ٘اد . 13 -12
رذسٝت :فشف رشمٞت ىزيفض ُ٘ٝاعَٔ TVظٞث ٝزنُ٘ ٍِ اىَزغٞةشاد اىَْزَٞةخ اىزبىٞةخ ( :اعةٌ اىشةشمخ اىَصةْقخ ٍةِ ّة٘ؿ
عيغئ سٍض ٔٝع٘ىٖب 22ظشف ٗ ،عْخ اىزصْٞـ ٍِ ّ٘ؿ فذد صحٞح ،ثةٌ اّشةئ مةبئْ ِٞاثْةٍ ِٞةِ ٕةزا اىزشمٞةت ثغشٝقةٔ
اّشب اىنبئْبد االٗىٗ ٚاىثبّٞخ أ ٛاُ اىنبئِ االٗه ٕ٘ ثبىغشٝقخ االٗىٗ ٚاىنبئِ اىثبّ ٕ٘ ٜثبىغشٝقخ اىثبّٞخ ٗاعجـ اىْبرج .
رذسٝت :فشف رشمٞت اعَٔ ٝ studentحز٘ ٛفي ٚاعٌ اىغبىت ثغ٘ه 12عالعو 8ٗ ،فالٍبد ىٔ ثَصف٘فخ ٍِ ّ٘ؿ فذد
ظقٞقٗ ، ٜفشف ٍزغٞش ىيَقذه ٍِ ّ٘ؿ فذد ظقٞق ، ٜثٌ قٌ ثبدخبه االعٌ ٗاىقالٍبد ثٌ اعجـ اعٌ اىغبىت ٍٗقذىٔ ثقذ ظغبثٔ.
اعْبد عيغئ سٍض ٔٝىَزغٞش ٍْزَ ٜىنبئِ ربثـ ىزشمٞت ٍق: ِٞ
فٕا اسٕب سٍسٍٗ سِز ٗ٠اٌ ٝوبجٓ ِٕزٌٍّ ٟزمو١ت اخً اٌااٌخ اٌمج١س١خ ، mainال ٠غٛز اْ ٔزجدـ اٌغم٠مدخ اٌسدبثمخ أٞ
أٗ ال ٠غٛز اسٕب سٍسٍٗ اٌِ ٝز ١م ثغم٠مٗ اٌّسبٚاح يٙذا خغب ٌّٚ ،قبٌغخ ذٌه ٠غت اْ ٔسزماَ اٌىٍّخ اٌّؾغٛزح strcpy
اٌزبثقخ ٌٍّىزجخ ٟ٘ٚ iostream.hثبٌؾم ٚاٌص ١مح ٚ ،ذٌه ثٛضـ اٌىٍّخ وّب : ٍٟ٠
strcpy ِز ١م اٌىبجٓ .اسُ اٌىبجٓ ‘ " اٌغٍّٗ اٌزٔ ٟم٠ا اْ ٕٔسمٙب اخً ِز ١م اٌىبجٓ " ;
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ٌٚىٓ ِـ االٔزجبٖ اٌ ٝاْ اٌىٍّخ اٌزٔ ٟم٠ا اْ ّْغخٖب داخو ٍحز٘ ٙاىَزغٞش اىزةبثـ ىينةبئِ اىَْزَة٠ ، ٜغدت اْ رٛضدـ
ث ٓ١فالِز ٟاٌزٕص٠ٚ ، ١غدت اْ ٠ىد ْٛعدٛي اٌسٍسدٍخ اٌمِز٠دخ اٌزدٔ ٟم٠دا اْ ٕٔسدمٙب اخدً اٌّز ١دم اٌزدبثـ ٌٍىدبجٓ إٌّزّدٟ
ٌٍزمو١ت ة ِ n -1ـ ؽسجبْ اٌّسبيخ ا٠ضب الؽؼ اٌّضبي اٌزبٌ: ٟ
ٕ٘ب فا اٌسٍسٍخ اٌمِز٠خ اٌّؾصٛسح ث ٓ١فالِز ٟاٌزٕصِ 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
ؽغّٗ وّقبًِ اٌ٘ ٝذٖ اٌااٌخ . ؽغُ اٌّز ١م ٚذٌه ثزّم٠م ٘ذا اٌّز ١م اٌّما يؾ رسزماَ ٘ذٖ اٌااٌخ ٌفؾ
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىغجبفخ ظجٌ ٍزغٞش ٍِ اىْ٘ؿ اىقذد ٛاىصحٞح .
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىغجبفخ ظجٌ ٍزغٞش ٍِ اىْ٘ؿ اىقذد ٛاىحقٞق. ٜ
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىغجبفخ ظجٌ ٍزغٞش ٍِ اىْ٘ؿ اىقذد ٛاىحقٞق ٜاىَضبفف .
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىغجبفخ ظجٌ ٍزغٞش ٍِ اىْ٘ؿ اىقذد ٛاىصحٞح اىَضبفف .
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىغجبفخ ظجٌ ٍزغٞش ٍِ اىْ٘ؿ اىَْغق. ٜ
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىغجبفخ ظجٌ ٍزغٞش ٍِ اىْ٘ؿ . short
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىغجبفخ ظجٌ ٍزغٞش ٍِ اىْ٘ؿ اىحشف. char ٜ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ٍثبه امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىغجبفخ ظجٌ ٍزغٞش ٍِ اىْ٘ؿ اىغيغخ اىشٍضٝخ . string
رذسٝت امزت ثشّبٍج ثيغخ اىغ ٜثيظ ثيظ ىزقشٝف ٍصف٘فخ رزنُ٘ ٍِ 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 ;
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 ;
24. cout << "name" <<"\t" << "tel_number" << "\t" << "person_number" << "\t" << "person_address" << endl;
cout << "------------------------------------------------------";
. ٗاضؾٚ ْٛف رى١ و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؟
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ترصغبػغحتويػرضىػطتغغرػعوػصائنػطنػترصغبػاخرػ ػ
أ ٞاْ ٠ىٕ٘ ْٛبن رمو١ت ٠ؾز ٞٛفٍِ ٝز ١م ٠ى٘ ْٛذا اٌّز ١م ٘ ٛوبجٓ ِٓ رمو١ت اخم ا٠ضب .
ً٘ ثبِىبٕٔب اْ ٔم َٛثزقم٠دف ودبجٓ ِدٓ رمو١دت اخدً رمو١دت اخدم ،ثؾ١دش ٠دزُ
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د ٟرماو١دت اِدب
ِفبر١ؼ وً ِٓ ٘ذ ٓ٠اٌصٕب ٠ك ي ٟٙاٌىبجٕبد ٚاثٛاة اٌصٕب ٠ك ٕ٘ب ٘ ٟإٌمغٗ اٌزٔ ٟضقٙب ثقا اٌّفزبػ " اٌىبجٓ " ٘ٚدذا اٌقّدً
ِٕغم١ب يقٕاِب ٔم٠ا اْ ٔصً ٌّؾز ٜٛاٌصٕاٚق الثا اْ ٠ىٌ ْٛإ٠ب ِفزبػ ٌذٌه ٘ٚىذا .
يقٕددا ِقبٌغددٗ ث١بٔددبد ربثقددٗ ٌٍزمو١ددت اٌددااخٍ ٟاٚال ٔمدد َٛثىزبثددٗ اسددُ اٌىددبجٓ إٌّزّددٌٍ ٟزمو١ددت اٌىج١ددم أ ٞإٔددب ٔجدداا ثفددزؼ
اٌصٕاٚق اٌىج١م صُ ٔضـ إٌمغٗ ٟ٘ٚثّضبثٗ اثٛاة اٌصٕاٚق ،صُ ٔؾصً فٍد ٝاٌّفزدبػ ٘ٚد ٛاٌىدبجٓ ٌفدزؼ اٌصدٕاٚق االخدم صدُ
ٔضـ اسُ اٌىبجٓ اٌذ ٞلّٕب ثزقم٠فٗ ٠ٚى ْٛربثـ ٌٍزمو١ت اٌااخٍ ٟصُ ٔمغٗ ٘ٚىذا ٔى ْٛلا يزؾٕب اٌصٕاٚق اٌص ١م صُ ٔضـ اسُ
اٌّز ١م اٌذٔ ٞم٠ا ِقبٌغزٗ ٘ٚىذا ٔى ْٛلا ٚصٍٕب اٌ ٝاٌزمو١ت اٌااخٍٚ ٟثبِىبٕٔب اعماء اٌقٍّ١بد وّب رقٍّٕب سبثمب .
ِالؽؾٗ ال ٠غٛز ٚضـ اٌزمو١ت اٌااخٍ ٟثقا اٌزمو١ت اٌىج١م أ ٞاٌمبسع ٟالْ ِزمعُ اٌٍ ٗ وّب ارفمٕب سبثمب ٠م َٛثبٌزمعّٗ ِدٓ
افٍ ٝالسفً يٍ ٛوبْ اٌزمو١ت اٌااخٍ ٟاسفً اٌزمو١ت اٌمبسع ٟس٠ ٛم َٛثزمعّٗ اٌزمو١ت اٌمدبسع ٟي١غدا ثااخٍدٗ رمو١دت ٌدُ
٠قٍُ ثٗ يٙذا خغب .
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اضداضةػحدابػطولػاضطصفوسةػ)( strlen
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ػاضداضةػ) ( getline
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
بعدػاضظصفيػ ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اٌاٚاي اٌصا٠مٗ ٘ٛٔ ٟؿ اخم ِٓ أٛاؿ اٌاٚاي اٌزٚ ٟيمرٙب ٌٕب ٌ خ اٌس ٟثٍ ثٍ ٌٍزقبِدً ِدـ االصدٕب ٚغ١م٘دب ،
الؽؼ فز٠ز ٞاٌااس اْ اٌاٚاي إٌّزّ ٗ١اٌز ٟرى ْٛاخً رقم٠ف اٌصدٕف ٘دٚ ٟاي ِٕزّ١دٗ ٌٍصدٕف ٔفسدٗ ،أ٘ ٞد ٟاٌٛؽ١داٖ
اٌمب سٖ فٍ ٝرقاِ ً٠ؾز٠ٛبد ٘دذا اٌصدٕف ٚودذٌه رقداِ ً٠ز ١ماردٗ إٌّزّ١دٗ اٌّٛعد ٖ ٛاخدً اٌمسدُ اٌمدبص ، privateيزم١دً
فز٠ز ٞاٌااس ٌ ٛوبْ ٌإ٠ب اوضم ِٓ صٕف ٠ةزموبْ ثٕفس اٌااٌٗ أ ٞاْ ٠ؾزد ٞٛصدٕف فٍد ٝاٌدٗ ٔفدمف أٙدب رمد َٛثؾسدبة
سارت اٌّٛؽفٚ ، ٓ١صٕف اخم ٠ؾز ٞٛفٍ ٝاٌٗ ِٕزّ ٗ١رم َٛثؾسبة سارت اٌّاساء ِضال ،أ ٞاْ يد ٟودال اٌصدٕفٛ٠ ٓ١عدا اٌدٗ
رم َٛثٕفس اٌقًّ ٟ٘ٚؽسبة اٌمارت ،يقٕاِب ٔم٠ا أةبء اٌصٕف ٓ١يبٕٔب سٕم َٛثزقم٠ف ٚثٕدبء ٘دذٖ اٌااٌدٗ إٌّزّ١دٗ يد ٟاٌصدٕف
االٚي صُ ٔم َٛثزقم٠فٙب ٚثٕبجٙب ي ٟاٌصٕف اٌضبٔ ، ٟيزم ً١ا٠ضب ٚع ٛثق االصٕب االخم ٜاخً اٌجمٔبِظ رؾزبط اٌ ٝاٌدٗ
ٌؾسبة اٌمارت ،يبٕٔب ي ٟوً االصٕب سٕم َٛثجٕبجٙب ِّ ،ب ٠بخذ اٌىض١م ِٓ اٌٛلذ ٚاٌؾغُ ي ٟثٕبء ٘ذٖ اٌاٚاي ٚرم ً١ا٠ضب إٔب
اس ٔب رقا ً٠ا ٚاعماء ص١بٔخ فٍ٘ ٝذٖ اٌاٚاي يبٕٔدب سدٕم َٛثزقدا ً٠ذٌده يد ٟعّ١دـ االصدٕب اٌد١س ودذٌه ؟ يمدا ٚيدمد ٌٕدب ٌ دخ
اٌس ٟثٍ ثٍ اٌؾً االِضً ٚاالسٌ ًٙقالط ٘ذٖ اٌّةىٍٗ ٚوذٌه اٌسٚ ٌٗٛٙاٌسمفٗ ي ٟثٕدبء اٌجمٔدبِظ ٚودذٌه ردٛي١م اٌّسدبؽٗ
ي ٟذاومٖ اٌؾبسٛة ،يغبءد ٌٕب ثبٌاٚاي اٌصا٠مٗ أ ٞاْ ٔغقً ٘ذٖ اٌااٌٗ صا٠مٗ ٌغّ١ـ االصٕب اٌزد ٟرؾزبعٙدب ،يٕٙدب ودً ِدب
ٔم َٛثٗ ٘ ٛيمظ ثٕبء عسُ اٌااٌٗ ِمٖ ٚاؽاٖ يمظ ٔٚ ،ضـ ّٔٛذط ٌٙب اخً االصٕب اٌز ٟرؾزبعٙب .فٕب ٔبخذ ِضال فٍ ٝذٌه :
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ٍثبه :امزت صْف اعَٔ personثحٞث ٝحز٘ ٛفي ٚاىَزغٞشاد اىَْزَ ٔٞاىزبى ( : ٔٞاالعٌ ٍِ ّة٘ؿ عيغةئ سٍضٝةٔ
ع٘ىٖب 22ظشف ٗ ،اىَقذه ٍِ ّ٘ؿ فذد ظقٞق ، ٜثٌ فشف داىٔ صذٝقٔ رقً٘ ثبدخبه ٕزٓ اىَزغٞةشاد ثةٌ فةشف داىةٔ صةذٝقٔ
اخش ٙىغجبفٔ ٕزٓ اىق ٌٞثٌ اّشئ مبئِ ٗاظذ ٍِ ٕزا اىصْف .
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
ٚأب افٍُ أٗ س١مغم ثجبٌه اِم ٘ٚدٌّ ٛدبذا لّٕدب ثٛضدـ احدبسٖ & لجدً اٌىدبجٓ يد ٟاٌدٗ اٌمدماءٖ ٌٚدُ ٔمدُ ثدذٌه يد ٟاٌدٗ
اٌغجبفٗ ٔٚ ،ؾٓ ِزفمبْ ٕ٘ب اْ اٌزّم٠م ي ٟاٌٗ اٌمماءٖ ) ( ٛ٘ readثبالحبسٖ ،يسدبلٛي ٌده يد ٟاٌدٗ اال خدبي ٠غدت اْ ٠ىدْٛ
اٌىبجٓ ثبالحبسٖ ٚذٌه ٌىٔ ٟمزْ اٌمد ُ١اٌّاخٍدٗ اخدً اٌّز ١دماد إٌّزّ١دٗ ،أ ٞإٔدب ٌدٌ ٛدُ ٔمدُ ثزّم٠دم اٌىدبجٓ ثبالحدبسٖ يٕٙدب ال
رمزْ اٌم ُ١اٌز ٟراخٍٙب فجم اٌٗ اال خبي اٌِ ٝز ١ماد اٌصٕف ،اذا ٌسذ ِزبوا ِٓ ذٌده يغدمة ثٕفسده اؽدذ احدبسٖ & ِدٓ
إٌّٛذط اخً اٌصٕف ي ٟخغٚ 8 ٖٛوذٌه ِٓ ّٔٛذط عسُ اٌااٌٗ ي ٟخغٚ 11 ٖٛلُ ثب خبي ل ُ١صدُ اعجقٙدب سدزم ٜاْ اال خدبي
رُ ٌٚ ،ىٓ ي ٟاٌغجبفٗ ٠ى ْٛإٌبرظ ٌد١س ِدب ردُ ا خبٌدٗ ،أ ٞرىد ْٛلد ُ١فةدٛاجِ ٗ١دٓ اٌدذاومٖ ٘ٚ ،دذا ٠قٕد ٟاْ اٌمد ُ١اٌّاخٍدٗ ٌدُ
رمزْ يِ ٟز ١مارٙب ي ٟاٌصٕف ،اِب ٌٍغجبفٗ يال افٌ ٟذٌه .
ٌٚىٓ ٚثقا أةبء ّٔٛذط ٌٍااٌٗ اٌصا٠مٗ ،سزسبٌٕٚ ٟو١ف ال َٛثبٔةبء عسّٙب ُِّّّّّ ،اْ ثٕبء عسُ اٌااٌدٗ ٘دٔ ٛفدس
ثٕبء عسُ اٌااٌٗ اٌقب ، ٗ٠فٕب ٔم ٜو١ف لّٕب ثجٕبء عسُ اٌٗ اٌمدماءٖ ،الؽدؼ اٌمغدٛاد ِدٓ ، 17 – 11يفد ٟخغد 11 ٖٛلّٕدب
ثٛضددـ ٔفددس إٌّددٛذط اٌددذٚ ٞضددقٕبٖ اخددً اٌصددٕف ِٚددب اخزٍددف ٕ٘ددب أددٗ ال ٠غددٛز اْ ٔضددـ لجددً إٌددٛذط وٍّددٗ ٚ friendاذا
ٚضقٕب٘ب يٙذا خغب ،صُ لّٕب ثغجبفٗ عٍّٗ رٛض١ؾ ٗ١ي ٟخغد ، 13 ٖٛاِدب يد ٟخغد 14 ٖٛيمّٕدب ثٛضدـ اسدُ اٌىدبجٓ اٌدذ ٞلّٕدب
ثزّم٠مٖ ٕ٘ٚب اٌزّم٠م ثبالحبسٖ وّب ارفمٕب سبثمب ،فقظ ف ٜاالدخبه ،صدُ ٚضدقٕب ٔمغدٗ صدُ اسدُ اٌّز ١دم اٌدذٕٔ ٞدِ ٞٛقبٌغزدٗ ِدٓ
اٌصٕف .
اِب ثبٌٕسجٗ ٌااٌٗ اٌغجبفٗ يجٕبء عسّٙب ٘ ٛثٕفس يىمٖ اٌٗ اال خبي وّب ي ٟاٌمغٛاد ٌٚ 22 – 18ىدٓ اٌىدبجٓ يٙ١دب ال
٠ى ْٛثبالحبسٖ .
ٚثقا اْ أزٕ١ٙب ِٓ حمػ ٘ذا اٌّضبي فٕ ٟاسبٌه سؤاال اال ً٘ ٛ٘ٚثبِىبٕٔب أٔ ٟسّ ٟاٌىبجٓ اٌذ ٞلّٕب ثبٔةبءٖ اخدً
اٌااٌددٗ اٌمج١سدد٘ٚ ٗ١دد opj ٛثبسددُ x؟ يىددم ع١دداا يدد ٟذٌدده ٕ٘ٚددب اٌغددٛاة ثبٌزبو١ددا ٔقددُ يبرفٕددب سددبثمب اْ وددً اٌددٗ ٌٙددب خصٛصدد١زٙب
ٚؽّب٠زٙب اٌمبصٗ ي ٟعسّٙب ِٚ ،ب ٠غت فٍ١ه اْ رقٍّٗ ٕ٘ اُ اعبط رْفٞز اىجشّبٍج ٕة٘ ٍةِ اىذاىةٔ اىشئٞغة ، ٔٞأ ٞاْ اٌااٌدٗ
اٌمج١س ٟ٘ ٗ١لٍت اٌجمٔبِظ ِٕٙٚب ٠جاا اٌجمٔبِظ ثبٌقًّ ٕ٠ٚز ٟٙفٕا رٕف١ذ اخم عٍّٗ ي ٟعسّٙب ٗ ،ىنِ اعزذفب اىذاىٔ اىصذٝقٔ
ٝخزيف فِ اعزذفب اىذاىٔ اىَْزَٞةٔ ،الؽدؼ اٌمغدٛاد ، 27 ٚ 26يفد ٟاٌااٌدٗ اٌصدا٠مٗ ٠غدت اْ ّٔدمس ودبجٓ ٌٍااٌدٗ ٘ٚدِ ٛدب
أةأٔبٖ ي ٟاٌااٌٗ اٌمج١س ٛ٘ٚ ٗ١ثبسُ . opj
ٍالظؾٔ ٍَٖةٔ :فة ٜاىذاىةٔ اىصةذٝقٔ فْةذٍب قَْةب ثجْبئٖةب خةبسص جغةٌ اىصةْف ّفغةٔ ىةٌ ّقةٌ ث٘ضةـ ::ىيذالىةٔ فيةٚ
االّزَب أ ٛاُ اىذٗاه اىصذٝقٔ ىٞغذ ٍْزَ ٔٞىيصْف فقظ ٍب قَْب ثٔ ْٕب ٕ٘ رقشٝف اىذاىٔ ٍجبرشٓ مب ٛداىٔ فبدٗ ٔٝاّ٘ٓ ْٕب
اٝضب أّ ال ٝج٘ص اُ ّضةـ فة ٜثذاٝةٔ َّة٘رص اىذاىةٔ ارا مةبُ خةبسص اىصةْف اىقجةبسٓ friendفقةظ ّضةقٖب فة ٜداخةو اىصةْف
ٗٝجت اُ رنزت قجو ّ٘ؿ اىق َٔٞاىَشجقٔ ٍِ اىذاىٔ داخو اىصْف ٕٗزا ٍب الظؾزٔ عبثقب .
ٍالظؾٔ ٍَٖٔ ٍ :شٓ اخش ٙفْذٍب ّشٝةذ ادخةبه أ ٛقَٞةٔ فةِ عشٝةق داىةٔ صةذٝقٔ ٝجةت اُ ٝنةُ٘ اىزَشٝةش ثبالرةبسٓ
ٗمزىل اىحبه فْذٍب ّشٝذ اعْبد أ ٛق َٔٞىيَزغٞشاد اىَْزَْٕٗ ٔٞب ٍب اقصذٓ ىٞظ اىجْب ٗارشك ىل رَش ِٝىزىل .
تضخغصػ :ػ
.1ػاضداضهػاضصدغق هػرظدػادتدرائكاػغجبػانػظطررػضكاػصائنػطنػظفسػاضصظفػاضتىيػتصىونػصىدغقهػضىهػ،ػحغىثػانػاضداضىهػ
اضصدغقهػعيػداضهػزغرػػػػطظتطغهػأيػالػتدتطغدػاضوصولػاضىػاضطتغغراتػاضطظتطغهػضضصظفػبذصلػطباذرػاالػرىنػطرغىقػ
صائنػ .ػ
.2ػرظىىدػاظذىىاءػداضىىهػشىىراءهػصىىدغقه ػاليػصىىظفػغجىىبػانػغصىىونػتطرغىىرػاضصىىائنػػباالذىىارهػوذضىىكػضحفىىظػاضقىىغمػداخىىلػ
اضطتغغراتػاضطظتطغهػضضصظفػ .ػ
. 3ػسيػحالػوجودػاصثرػطنػداضهػصدغقهػسإدمػاضصائنػاضططررػضكاػضىغسػضىهػأيػرالشىهػ،ػباضىدوالػاالخىرىػوانػتذىابهػ،ػأيػ
باطصاظظاػادتخدامػظفسػادمػاضصائنػاوػاضعاطلػاضططرػسيػجطغدػاضدوالػحتىػاضداضهػاضرئغدغهػ .ػ
.4ػغطظدػطظعاػباتاػاعاسهػاضصضطهػfriendػسيػظطوذجػاضبظاءػاضخارجيػضضداضهػاضصدغقهػأيػاضذيػظبظغهػخارجػاضصظفػ .ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
فز٠ز ٞاٌااس ،ي ٟوض١م ِٓ االؽ١دبْ ٔؾزدبط ٌااٌدٗ يد ٟاوضدم ِدٓ صدٕف ٔٚ ،ؾدٓ ٔقٍدُ اْ اٌداٚاي إٌّزّ١دٗ ٘دٚ ٟاي
خبصٗ ثبٌصٕف ٔفسٗ ٚ ،وذٌه اٌؾبي ثبٌٕسجٗ ٌٍاٚاي اٌقب ٗ٠اٌز ٟوٕب ٔجٕٙ١ب ٌّقبٌغٗ ث١بٔبد ِق ، ٕٗ١يبْ ٘دذٖ اٌداٚاي اْ ٌدُ رىدٓ
صا٠مٗ يال ٠ؾك ٌٙب ِقبٌغٗ اٌج١بٔبد اٌمبصٗ ثبٌصٕف ٔفسٗ ٕ٘ٚ ،دب يد ٟؽدبي ودبْ ٌدإ٠ب اوضدم ِدٓ صدٕف ثؾبعدٗ ٌااٌدٗ ِةدزموٗ
وؾسبة سارت ِٛؽف ٚوذٌه ؽسبة سارت ِا٠م ِضال أ ٞاْ ٘دذٖ اٌداٚاي يد ٟودال اٌصدٕف ٓ١اٌّٛؽدف ٚاٌّدا٠م ٘د ٟرمد َٛثدٕفس
اٌقًّ أٌٙ ٞب ٔفس اٌجٕ ٗ١يٕٙب ٔم َٛثبٔةبء اٌٗ صا٠مٗ ٌىال اٌصٕفِّ ٓ١ب ٛ٠يم فٍٕ١ب اٌٛلذ ي ٟثٕبء اٌااٌٗ اخً اٌصٕف ٓ١أ ٞإٔدب
ٔم َٛثجٕبء عسُ اٌااٌٗ ِمٖ ٚاؽا ٔٚم َٛثزقم٠فٙب اخً وال اٌصٕف ٓ١أ ٞاْ ٘ذٖ اٌااٌٗ سّ١مس فٍٙ١ب وبجٓ ِٓ وً صٕف ٘ٚذا ِدب
حمؽٕب سبثمب ٌٚىٓ ٕ٘ب ِب ٠غت فٍ١ه اْ رقميٗ ٘ ٛإٔب فٕاِب ٔم َٛثبٔةبء اٌصٕف االٚي صُ ٔقدم ّٔدٛذط ٌااٌدٗ صدا٠مٗ اخدً
اٌصٕف االٚي صُ ٔقدم ثّٕٛذعٙدب اخدً اٌصدٕف ودبجٓ ِدٓ اٌصدٕف االٚي صدُ ودبجٓ ِدٓ اٌصدٕف اٌضدبٔٚ ٟذٌده الْ ٘دذٖ اٌااٌدٗ
ٌصٕف ٓ١اصٕٚ ٓ١سزم َٛثّقبٌغٗ ث١بٔبد ي ٟوال اٌصدٕفٕ٘ٚ ، ٓ١دب رىّدٓ اٌّةدىٍٗ يدبٌّزمعُ فٕداِب ٠جداا ثزمعّدٗ اٌىد ٛاٌدذ ٞلّدذ
ثىزبثزٗ ي٠ ٛٙجاا ِٓ اٚي وٍّٗ ثبٚي سغم ي ٟافٍ ٝاٌىٚ ٛفٕاِب ٠صً فٕا ٔدٛذط اٌااٌدٗ اٌصدا٠مٗ سد١غا ثد ٓ١االلدٛا اٌٙالٌ١دٗ
اسُ وبجٓ ِٓ صٕف غ١م ِقم أ ٞأٗ ال ٠قٍُ فٓ ٘ذا اٌىبجٓ أ ٞحٟء ٕ٘ٚب ٠قغٕ١دب خغدب ٘ٚدذا ِٕغم١دب ٌٚقدالط ٘دذٖ اٌّةدىٍٗ
٠غت اْ ٠ى ْٛرسٍسً اٌقٍّ١بد ثةىً ِٕغم ٟأ ٞإٔب ٠غت اْ ٔضـ ّٔٛذط ٌٍصٕف االخم ثقا لجً اٌصٕف االٚي ،اِب ثبٌٕسدجٗ
ٌٍصٕف اٌضبٔ ٟيٕم َٛثزقم٠ف اٌااٌٗ اٌصدا٠مٗ ثااخٍدٗ ثدٕفس يىدمٖ اٌااٌدٗ االٌٚد ٝأ ٞأدٗ ٠غدت اْ ٠داخً فٍٙ١دب ودبجٕٚ ٓ١اؽدا ِدٓ
اٌصٕف االٚي ٚاٌضبٔ ِٓ ٟاٌصٕف اٌضبٔ ٟفٍ ٝاٌزمر١ت .
صورةػتوعغحغهػ :ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اِب ي ٟاٌااٌٗ اٌمج١س ٗ١يمّٕب ثبٔةبء وبجٓ ِٓ وً صٕف ٚلّٕب ثزّم٠مٖ فٍ ٝاٌاٚاي اٌّقٕٚ ٟ٘ٚ ٗ١اي صدا٠مٗ ٌدذا ٠غدت
رّم٠م اٌىبجٓ ٌٚىٓ ٕ٘ب ا ٚاْ اٌفذ أزجب٘ه الِم ِ ُٙعاا ِ ٛ٘ٚب رم َٛثبسسدبٌٗ يد ٟاٌااٌدٗ اٌمج١سد٠ ٗ١غدت اْ رسدزفجٍٗ ثبٌزمر١دت
ي ٟوً ِىبْ رسزماِٗ ٚوذٌه اٌؾبي ئّ ٟبذط اٌاٚاي اٌصا٠مٗ ي ٟوً صٕف الؽؼ اٌداٚاي اٌصدا٠مٗ يد ٟاٌةدىً اٌّغدبٚس يدبٚي
وبجٓ ٘ ِٓ ٛاٌصٕف ٛ٘ٚ 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;
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);
getch();
}
ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ:اردادػوتقدغمػاضطاضبػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اصتبػترصغبػضتضفزغونػ:ػاضدؤالػشبلػاالخغرػباضظصفيػ :ػ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اٌااٌٗ اٌمبٌج ٟ٘ ٗ١حىً ا ٚعم٠مٗ اخمٌ ٜىزبثٗ اٌااٌٗ ،ؽ١ش إٔب ٔم َٛثزبع ً١رؾا٠ا ٔٛؿ اٌج١بٔبد اٌّّمٖ اٌد ٝاٌااٌدٗ ا ٚاٌّمعقدٗ
ِٕٙب اٌ ٝؽ ٓ١اسزافبجٙب ١ٌٚس ٚلذ رٕف١ذ اٌجمٔبِظ ،أ ٞثبِىبٕٔدب رّم٠دم أٔ ٞدٛؿ ِدٓ اٌمد ُ١اٌد ٝاٌااٌدٗ ٌّقبٌغدٗ فٍّ١دٗ ا ٚحدٟء
ِق٘ٚ ٓ١ذٖ ِ١زٖ ِٓ ِ١زاد ٌ خ اٌس ٟثٍد ثٍد ا ٌ ١دم ِٛعد ٖ ٛيد ٟثقد ٌ دبد اٌجمِغدٗ ِضدً ثبسدىبي ٌٚ ،ىدٓ ٌّدبذا ٔبعدً
رؾا٠ا ٔٛؿ اٌج١بٔبد فٍٚ ٝلذ االسزافبء ؟ ٕ٘ٚب اال ِم اٌّ ُٙيافٕب ثسظ االِدٛس اوضدم رم١دً أده اس د ثٕدبء اٌدٗ رمد َٛثفؾد
اوجم سلُ ِٓ اصٕٔ ٓ١م َٛثزّم ُٙ٠اٌٙ١ب ثؾ١ش رى٘ ْٛذٖ اٌمٛٔ ِٓ ُ١ؿ فا صؾ١ؼ ٕ٘ٚ ،ب يبٔه سزم َٛثجٕبء رم٠ٚسدخ اٌااٌدٗ ثٙدبذا
اٌةىً :
الؽؼ فز٠ز ٞاٌااس ٕ٘ب اْ ٔٛؿ اٌم ّٗ١اٌّمعقٗ ٟ٘ٚثبٌٍ ْٛاالؽّم ِٓ ٟ٘ ،إٌٛؿ اٌقدا ٞاٌصدؾ١ؼ ٚذٌده الْ اٌمد ُ١اٌزدٟ
ِمسٔب٘ب اٌ ٝاٌااٌٗ ٘ ِٓ ٟإٌٛؿ اٌقا ٞاٌصؾ١ؼ ا٠ضب ٟ٘ٚثبٌ ْٛاٌجمرمبٌٚ ٟاالزسق ،يدبْ ٘دذا اٌىد ٛال ٠صدٍؼ اال ٌالفداا
اٌصؾ١ؾٗ ، ( intأ ٞاْ ٘ذٖ اٌااٌٗ ِؾا ، ٖ ٚيبذا لّٕب ثزّم٠م ل ِٓ ّٗ١إٌٛؿ اٌقا اٌؾم١مِ float ٟضال يبْ ٘ذا خغب ،الْ
ِقبِالد اٌااٌٗ اٌز ٟسّٕمس اٌم ُ١اٌٙ١ب ِقميٗ ِٓ إٌٛؿ ٚ intوذٌه اٌم ّٗ١اٌّمعقٗ ٌٚ ،ىٓ اس ٔب ا٠ضب ثٕفس ثمٔبِغٕدب اْ ٔمدَٛ
ثفؾ افاا وسم ٗ٠أ ٞأٙب ِٓ ٔٛؿ اٌقا اٌؾم١م٠ٚ ، float ٟغدب اٌدملُ االوجدم ث١دٕ ، ُٙيبٕٔدب سدٕم َٛرٍمبج١دب ثجٕدبء اٌدٗ اخدمٜ
ٌذٌه ،اٌ١س وذٌه ؟ ٘ٚىذا س١ى ْٛحىٍٙب :
الؽددؼ فز٠ددز ٞاٌددااس ٕ٘ددب إٔددب لّٕددب ثز ١ددم أددٛاؿ اٌّقددبِالد ِددٓ إٌددٛؿ intاٌدد ٝإٌددٛؿ ٚ floatذٌدده الْ اٌمدد ُ١اٌزدد ٟسددٕمَٛ
ثزّم٠م٘ب ٘ ٟافاا ؽم١مٚ ٗ١ثّب اْ اٌااٌٗ رم َٛثّمبسٔٗ فا ٓ٠يبو١ا اٌم ّٗ١اٌّمعقٗ سػ رىِ ْٛدٓ ٔفدس ٔدٛؿ اٌّقبٌّدبد الؽدؼ
ثاا ٗ٠اٌااٌٗ ثبٌٍ ْٛاالؽّم ي ِٓ ٟٙإٌٛؿ اٌقا ٞاٌؾم١مٚ ، float ، ٟرم ً١إٔب اس ٔب ا٠ضدب ِمبسٔدٗ اٌؾدمِ ٚدضال يبٕٔدب سدٕمَٛ
ثىزبثٗ اٌٗ اخمٌٍ ٜؾم ، ٚيف ٌ ٟدخ اٌسد ٟثٍد ثٍد عم٠مدٗ اوضدم فٍّ١دٗ ِدٓ ذٌده ٘ٚد ٟاْ ٔمد َٛثزقم٠دف اٌدٗ ِدٓ إٌدٛؿ
اٌمبٌج ٟأ ٞاْ ٔغقٍُ ِزمعُ اٌٍ خ ٠بعً رقم٠ف أٛاؿ اٌّقدبِالد اٌدٚ ٝلدذ اسدزافبجٙب ي١مد َٛثزؾا٠دا ٘دذٖ االٔدٛاؿ ٌٍااٌدٗ ؽسدت
اٌم ُ١اٌّّمٖ اٌٙ١ب ٕ٘ٚ ،ب اخزصبس وج١م ي ٟاٌٛلذ ٚوذٌه اٌىفبجٗ يٙذا ِضبي ثس١ظ ٌذٌه .
ٌٚىٓ و١ف ٠ى ْٛحىً ٚعسُ ٘ذٖ اٌااٌدٗ ،يدبْ عسدُ اٌااٌدٗ ٘دٔ ٛفدس اٌغسدُ ٌٍااٌدٗ اٌّؾداٌٚ ٖ ٚىدٓ ِدب ٠مزٍدف ٕ٘دب فدٓ اٌداٚاي
اٌقب ٛ٘ ٗ٠يمظ رم٠ٚس ٗ١اٌااٌٗ فٕب ٔم ٜو١ف ٠ى ْٛحىٍٙب :
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
٘ ٟوٍّخ ِؾغٛزح يد ٌ ٟدخ اٌسد ٟثٍد ثٍد templeatالؽؼ فز٠ز ٞاٌااس اٌةىً اٌّغبٚس يف ٟاٌمغ ٖٛسلُ 1اٌىٍّخ
٘ٚدد ٟثّقٕدد ٝلددبٌج ، ٟيقٕدا ثٕددبء اٌددخ لبٌج١ددخ ٠غددت اْ ٔىزددت اٌىٍّددخ وّددب ٘دد ٟثددبٌؾم ٚاٌصد ١مٖ ،صددُ ٠غددت ثقددا٘ب اْ ٔزجقٙددب
اٌّؾغٛزح classي ٟاٌمغٛح سلُ ٚ ، 2ي ٟاخً ٘ذٖ االحبسار٠ ٓ١غت اْ ٔىزت اٌىٍّخ > <ثبالحبسر ٓ١االص م ٚاالوجم وّب
ٟ٘ٚثبالؽم اٌص ١مح صُ يماك ٔٚمزبس أ ٞاسُ ا ٚؽم ٌّز ١م ٘ٚدذا اٌّز ١د م ٘د ٛثّضبثدخ لبٌدت فدبَ ٌ١ؾزد ٞٛفٍد ٝاالٔدٛاؿ
اٌز ٟرم َٛثزّم٠م٘ب اٌ٘ ٝذٖ اٌااٌٗ .
يبٌمغٛاد ٟ٘ 4 ٚ 3ٚ 2 ٚ 1خغٛاد اسبس١خ ي ٟثٕبء ّٔٛذط اٌااٌٗ اٌمبٌج١خ
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
اِب ي ٟاٌمغ ٖٛسلُ 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
}
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
االولػوعوػسيػاضخطوهػ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 :
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
طثالػ:ػررفػصظفػادطهػstudentػ بحغىثػغحتىويػرضىىػاضطتغغىراتػاضطظتطغىهػاضتاضغىةػ:ػ(ػاالدىمػواضطعىدلػ)ػ،ػثىمػرىرفػ
صائظانػطنػعذاػاضصظفػوطررعمػرضىػداضهػاضترتغبػضترتغبكمػحدىبػاضطعىدلػطىنػاالرضىىػاضىىػاالصىغرػػثىمػاطبىدػاضظىاتجػ
شبلػوبعدػاضترتغبػ؟ ػ
ػ
ػ
ػ
___
/ \
o o
******====================******
\\//----------------------------------------------------------------------------------------------------------
\\//------------------------------------------------------------------------------------------------------------
\\//--------------------------------------------------------------------------------------------------------------
\\//----------------------------------------------------------------------------------------------------------------
\\//--------------------------------------------------------------------------------------------------------------
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
طبدأػطاضبػبرطجهػ:ػاظاػالػارغدػدَطَصاَػ،ػبلػارغدػانػاصبحػصغاداػ ػ
.1ػتطرغرػاضعواطلػباضقغطةػ :ػ
طثالػاحدبػطجطوعػرالطتغنػسيػداضهػواطبدػاضظاتجػسيػاضداضهػاضرئغدغةػ ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
ػ
___
\/
)(oo
******====================******
\\//--------------------------------------------------------------------------------------------------------------------
\\//----------------------------------------------------------------------------------------------------------------------
\\//------------------------------------------------------------------------------------------------------------------------
\\//--------------------------------------------------------------------------------------------------------------------------
\\//----------------------------------------------------------------------------------------------------------------------------
اردادػوتقدغمػاضطاضبػ:ػغودفػرظاغةػ–ػتخصصػاظظطةػطعضوطاتػحادوبغةػ–ػجاطعةػاضقدسػاضطفتوحةػ ػ
ﺍﻟﻮﺣﺪﺓ ﺍﻷﻭﱃ 1.0
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++ﺇﻣﻜﺎﻧﻴﺔ ﺇﻧﺸﺎﺀ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪﺓ ﻓﻘﻂ ،ﺑﻞ ﻭﺗﺘـﻴﺢ
ﺃﻳﻀﹰﺎ ﻟﻠﻤﱪﻣﺞ ﺍﻟﻘﺪﺭﺓ ﻋﻠﻰ ﺍﻟﻌﻤﻞ ﻋﻠﻰ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳉﺪﻳﺪﺓ ﺗﻠﻚ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻧﻔﺲ ﺍﻟﻌﻮﺍﻣـﻞ
ﺍﻟﱵ ﺗﺴﺘﺨﺪﻣﻬﺎ ﺍﻷﻧﻮﺍﻉ ﺍﻷﺳﺎﺳﻴﺔ ﻛـ +ﺃﻭ = ﻭﻳﻘﺎﻝ ﻋﻨﺪﻫﺎ ﺃﻧﻪ ﰎ ﲢﻤﻴﻞ ﻫﺬﻩ ﺍﻟﻌﻮﺍﻣﻞ ﺑﺸﻜﻞ
ﺯﺍﺋﺪ ﻟﺘﻌﻤﻞ ﻣﻊ ﺍﻷﻧﻮﺍﻉ ﺍﳉﺪﻳﺪﺓ.
//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++
ﺍﻟﺘﻌﻠﻴﻘﺎﺕ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 << 7 << " is an integer.\n
;"cout << 'a' << "is a character.\n
}
ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ:
7 is an integer.
a is a character
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++
ﺇﻟﻴﻚ ﺍﻵﻥ ﻣﺜﺎ ﹰﻻ ﻟﱪﻧﺎﻣﺞ ﻳﺴﺘﻘﺒﻞ ﺭﻗﻤﲔ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﻭﳚﻤﻌﻬﻤﺎ ﻭﻳﻌﺮﺽ ﻧﺎﺗﺞ ﺍﳉﻤﻊ-:
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 ،ﻃﻮﻳﻞ ﻭﻫﻲ ﲢﺘﻞ ﻣﺴﺎﺣﺎﺕ ﳐﺘﻠﻔﺔ ﰲ ﺍﻟﺬﺍﻛﺮﺓ .ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳـﺒﲔ ﻫـﺬﻩ
ﺍﻷﻧﻮﺍﻉ ﻭﺍﳌﺴﺎﺣﺔ ﺍﻟﱵ ﺗﺄﺧﺬﻫﺎ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻭﻧﻄﺎﻕ ﺍﻷﺭﻗﺎﻡ ﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﺗﺄﺧﺬﻫﺎ:
13
ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻷﺭﻗﺎﻡ ﺍﻟﻌﺎﺋﻤﺔ ﻟﺘﻤﺜﻴﻞ ﻗﻴﻢ ﳝﻜﻦ ﻗﻴﺎﺳـﻬﺎ ﻛـﺎﻷﻃﻮﺍﻝ ﺃﻭ ﺍﻷﻭﺯﺍﻥ.
ﻭﻳﺘﻢ ﲤﺜﻴﻞ ﺍﻷﺭﻗﺎﻡ ﺍﻟﻌﺎﺋﻤﺔ ﻋﺎﺩﺓ ﺑﺮﻗﻢ ﻛﺎﻣﻞ ﻋﻠﻰ ﺍﻟﻴﺴﺎﺭ ﻣﻊ ﻧﻘﻄﺔ ﻋﺸﺮﻳﺔ ﻭﻛﺴﺮ ﻋﻠﻰ ﺍﻟﻴﻤﲔ.
ﻫﻨﺎﻟﻚ ﺛﻼﺛﺔ ﺃﻧﻮﺍﻉ ﻣﻦ ﺍﻷﺭﻗﺎﻡ ﺍﻟﻌﺎﺋﻤﺔ ﰲ ﺃﻧﻈﻤﺔ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﺸﺎﺋﻌﺔ ﺍﻻﺳﺘﻌﻤﺎﻝ .ﻭﺃﺷـﻬﺮ
ﻧﻮﻉ ﺃﺭﻗﺎﻡ ﻋﺎﺋﻤﺔ ﻫﻮ ﺍﻟﻨﻮﻉ doubleﻭﺍﻟﺬﻱ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﳌﻌﻈـﻢ ﺩﺍﻻﺕ C++ﺍﻟﺮﻳﺎﺿـﻴﺔ.
ﻳﺘﻄﻠﺐ ﺍﻟﻨﻮﻉ floatﺫﺍﻛﺮﺓ ﺃﻗﻞ ﻣﻦ ﺍﻟﻨﻮﻉ . doubleﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﻫﺬﻩ ﺍﻷﻧـﻮﺍﻉ
ﻭﺍﳊﺠﻢ ﺍﻟﺬﻱ ﺗﺄﺧﺬﻩ ﰲ ﺍﻟﺬﺍﻛﺮﺓ.
ﺍﳊﺠﻢ ﺍﺳﻢ ﺍﻟﻨﻮﻉ
4byte float
8byte double
10byte long double
14
ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ ﲣﺰﻥ ﺍﻟﺮﻗﻢ ﺍﻟﺬﻱ ﻳﻜﺘﺒﻪ ﺍﳌﺴﺘﺨﺪﻡ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ﰲ ﻣﺘﻐﲑ ﻳﺪﻋﻲ
.integer1ﳝﺜﻞ ﺍﻟﻜﺎﺋﻦ - cinﻭﺍﻟﺬﻱ ﻳﻠﻔﻆ ﻛـ -C inﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ ،ﻭﻳﺄﺧﺬ ﻋﺎﻣﻞ
ﺍﳊﺼﻮﻝ (>>) get fromﺍﻷﺷﻴﺎﺀ ﺍﳌﻮﺿﻮﻋﺔ ﻋﻠﻰ ﻳﺴﺎﺭﻩ ﻭﻳﻀﻌﻬﺎ ﰲ ﺍﳌﺘﻐﲑ ﺍﳌﻮﺟﻮﺩ ﻋﻠـﻰ
ﳝﻴﻨﻪ ،ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﻫﺬﻩ ﺍﻟﻌﺒﺎﺭﺓ ﻳﻨﺘﻈﺮ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻥ ﻳﻜﺘﺐ ﺍﳌﺴﺘﺨﺪﻡ ﺭﻗﻤﹰﺎ ﻣﻦ ﺍﻟﻨـﻮﻉ integer
ﻭﻳﻀﻐﻂ ﻋﻠﻰ ﻣﻔﺘﺎﺡ ، Enterﻳﺘﻢ ﺗﻌﻴﲔ ﺍﻟﻘﻴﻤـﺔ ﺍﻟـﱵ ﺃﺩﺧﻠـﻬﺎ ﺍﳌﺴـﺘﺨﺪﻡ ﺇﱃ ﺍﳌـﺘﻐﲑ
. integer1
ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﻝ ﻋﺎﻣﻞ ﺍﳊﺼﻮﻝ ﻋﺪﺓ ﻣﺮﺍﺕ ﰲ ﻧﻔﺲ ﺍﻟﻌﺒﺎﺭﺓ:
cin >> integer1>>integer2
ﻳﻀﻐﻂ ﺍﳌﺴﺘﺨﺪﻡ ﻫﻨﺎ ،Enterﺃﻭ ﻣﻔﺘﺎﺡ ﺍﳌﺴﺎﻓﺔ ،Spaceﺃﻭ ﻣﻔﺘﺎﺡ Tab
ﺑﻌﺪ ﻛﻞ ﻗﻴﻤﺔ ،ﻗﺒﻞ ﺃﻥ ﻳﻜﺘﺐ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺘﺎﻟﻴﺔ ،ﻭﻟﻜﻨﻪ ﻣﻦ ﺍﻷﻓﻀﻞ ﻋﺎﺩﺓ ﺇﺩﺧﺎﻝ ﻗﻴﻤﺔ ﻭﺍﺣـﺪﺓ ﰲ
ﻛﻞ ﻣﺮﺓ ﻟﺘﺠﻨﺐ ﺍﳋﻄﺄ.
ﺍﻟﺸﻜﻞ) (1-2ﻳﻮﺿﺢ ﺍﻟﺪﺧﻞ ﺑﻮﺍﺳﻄﺔ .cin
ﺍﳌﻨﺎﻭﺭ -:endl
ﺍﻟﻌﺒﺎﺭﺓ:
cout<<''sum= ''<<sum<<endl
ﺗﻄﺒﻊ ﺍﻟﻨﺺ = sumﻣﺘﺒﻮﻋﹰﺎ ﺑﻘﻴﻤﺔ ، sumﻧﻼﺣﻆ ﺃﻧﻨﺎ ﺍﺳﺘﺨﺪﻣﻨﺎ endlﻭﻫـﻮ
ﻭﺳﻴﻠﺔ ﺃﺧﺮﻯ ﰲ C++ﻟﻼﻧﺘﻘﺎﻝ ﺇﱃ ﺳﻄﺮ ﺟﺪﻳﺪ ،ﻭﻳﺴﻤﻰ ﻣﻨـﺎﻭﺭ manipulatorﻭendl
ﺍﺧﺘﺼﺎﺭﹰﺍ ﻟـ ،end lineﻭﻫﻮ ﻳﻌﻤﻞ ﲤﺎﻣﹰﺎ ﻛﻤﺎ ﻳﻌﻤﻞ ﺗﺘﺎﺑﻊ ﺍﳍﺮﻭﺏ. \n
ﺍﻟﻌﻮﺍﻣﻞ ﺍﻷﺭﺑﻌﺔ ﺍﻷﻭﱃ ﺗﻨﺠﺰ ﺃﻋﻤﺎ ﹰﻻ ﻣﺄﻟﻮﻓﺔ ﻟﺪﻳﻨﺎ ،ﺃﻣﺎ ﻋﺎﻣﻞ ﺍﻟﺒﺎﻗﻲ %ﺍﳌﺴـﻤﻰ
ﺃﻳﻀﹰﺎ ﺍﳌﻌﺎﻣﻞ ،modulusﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﳊﺴﺎﺏ ﺑﺎﻗﻲ ﺍﻟﻘﺴﻤﺔ ﻟﻌﺪﺩ ﺻﺤﻴﺢ ﻋﻠﻰ ﻋﺪﺩ ﺁﺧﺮ،
ﻟﺬﻟﻚ ﻓﺎﻟﺘﻌﺒﲑ 20%3ﻳﺴﺎﻭﻯ . 2ﺗﺴﻤﻰ ﻫﺬﻩ ﺍﻟﻌﻮﺍﻣﻞ ﺍﳊﺴﺎﺑﻴﺔ ﺑﺎﻟﻌﻮﺍﻣﻞ ﺍﻟﺜﻨﺎﺋﻴـﺔ ﻷـﺎ
ﺗﻌﻤﻞ ﻋﻠﻰ ﻗﻴﻤﺘﲔ.
ﻼ ﺍﻟﺘﻌﺒﲑ:
ﳝﻜﻦ ﺍﺳﺘﻌﻤﺎﻝ ﺃﻛﺜﺮ ﻣﻦ ﻋﺎﻣﻞ ﰲ ﺗﻌﺒﲑ ﺭﻳﺎﺿﻲ ﻭﺍﺣﺪ ،ﻓﻤﺜ ﹰ
;C=(f-32)*5/9
ﳛﻮﻝ ﺩﺭﺟﺔ ﺍﳊﺮﺍﺭﺓ ﻣﻦ ﻣﺌﻮﻳﺔ ﺇﱃ ﻓﻬﺮﺎﻳﺖ ).ﺍﺳﺘﻌﻤﻠﺖ ﺍﻷﻗﻮﺍﺱ ﻟﻜﻲ ﻳﺘﻢ ﺗﻨﻔﻴﺬ
ﺍﻟﻄﺮﺡ ﺃﻭ ﹰﻻ ﺑﺎﻟﺮﻏﻢ ﻣﻦ ﺃﻭﻟﻮﻳﺘﻪ ﺍﳌﺘﺪﻧﻴﺔ ،ﻳﺸﲑ ﺍﳌﺼﻄﻠﺢ ﺃﻭﻟﻮﻳﺔ Precedenceﺇﱃ ﺗﺮﺗﻴـﺐ
ﺗﻨﻔﻴﺬ ﺍﻟﻌﻮﺍﻣﻞ ،ﺍﻟﻌﺎﻣﻼﻥ * ﻭ /ﳍﻤﺎ ﺃﻭﻟﻮﻳﺔ ﺃﻋﻠﻰ ﻣﻦ +ﻭ.( -ﻭﻫﺬﺍ ﻣﺎ ﺳﻨﺮﺍﻩ ﻻﺣﻘـﹰﺎ ﺑﻌـﺪ ﺃﻥ
ﻧﺘﻌﺮﻑ ﻋﻠﻰ ﺑﻘﻴﺔ ﻋﻮﺍﻣﻞ . C++
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
ﺍﳌﻠﺨﺺ:
18
ﺍﻷﺳﺌﻠﺔ
-1ﺃﻛﺘﺐ ﻋﺒﺎﺭﺓ C++ﺻﺤﻴﺤﺔ ﺗﻘﻮﻡ ﺑﺎﻵﰐ:
ﺗﻮﺿﻴﺢ ﺃﻥ ﺑﺮﻧﺎﳎﹰﺎ ﻣﺎ ﺳﻴﻘﻮﻡ ﲝﺴﺎﺏ ﺣﺎﺻﻞ ﺿﺮﺏ ﺛﻼﺛﺔ ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ.
-2ﺇﺳﺘﻌﻤﻞ ﺍﻟﻌﺒﺎﺭﺍﺕ ﰲ ﺍﻟﺴﺆﺍﻝ ﺍﻟﺴﺎﺑﻖ ﻟﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﺑﻠﻐﺔ C++ﻛﺎﻣﻞ ﻳﻘﻮﻡ ﲝﺴـﺎﺏ
ﺣﺎﺻﻞ ﺿﺮﺏ ﺛﻼﺛﺔ ﺃﺭﻗﺎﻡ ﺻﺤﻴﺤﺔ.
-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
20
ﺍﻟﻮﺣﺪﺓ ﺍﻟﺜﺎﻧﻴﺔ
22.0
)Control Structures(I) - (I ﺑﻨﻴﺎﺕ ﺍﻟﺘﺤﻜﻢ
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"! د ا
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;
}
ی
>
ار ﺏ،if /
I ا/ اif ارةKL
ة2& أو،ة2 إ &رة واO ار ا ي ی' ذ6 ا# ﺝKL وی،
13
{ } ةP اس13> أF
9 &رات
.if & ارة/6( ی
< ی2-1)=ا
ﺧﻄﺄ
ﺗﻌﺒﲑ ﺇﺧﺘﺒﺎﺭ
ﺻﺤﻴﺢ
if ﺟﺴﻢ
ﺎﺀﺇ
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;
}
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
ﺇﺎﺀ
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;
}
26
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
28
ﺻﺤﻴﺢ
ﻣﺘﻐﲑ switchﻳﺴﺎﻭﻯ
ﺟﺴﻢ ﺍﻟﻮﺳﻢ ﺍﻷﻭﻝ
ﺛﺎﺑﺖ ﺍﻟﻮﺳﻢ ﺍﻷﻭﻝ
ﺧﻄﺄ
ﺧ
ﻣﺘﻐﲑ 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;
}
31
:ﺍﳌﻠﺨﺺ
32
ﺍﻷﺳﺌﻠﺔ
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
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
38
ﺳﺘﺴﺘﻤﺮ ﻫﺬﻩ ﺍﳊﻠﻘﺔ ﰲ ﻣﻀﺎﻋﻔﺔ ﺍﳌﺘﻐﲑ nﺇﱃ ﺃﻥ ﺗﺼﺒﺢ ﻗﻴﻤﺔ nﺃﻛـﱪ ﻣـﻦ
100ﻋﻨﺪﻫﺎ ﺗﺘﻮﻗﻒ .ﺗﺘﻜﻮﻥ ﺍﳊﻠﻘﺔ ﻣﻦ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ 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
40
ﺍﳊﻠﻘﺔ do 3.4.3
ﺟﺴﻢ ﺍﳊﻠﻘﺔ
ﺧﻄﺄ
ﺗﻌﺒﲑ ﺍﻻﺧﺘﺒﺎﺭ ﺇﺎﺀ
ﺻﺤﻴﺢ
//Program 3-4:
// using do repetition structure
>#include<iostream.h
) ( main
;{ int counter = 1
do
; '' ''<< cout << counter
41
;)while (+ + counter <= 10
//Continued
;return 0
}
1 2 3 4 5 6 7 8 9 10
42
ﺍﳊﻠﻘﺔ for 3.4.5
//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
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
ﺗﻌﺒﲑ ﺍﻟﺘﻤﻬﻴﺪ
ﺻﺤ
ﺟﺴﻢ ﺍﳊﻠﻘﺔ
ﺗﻌﺒﲑ ﺍﻟﺘﺰﺍﻳﺪ
46
ﺍﳊﻠﻘﺎﺕ ﺍﳌﺘﺪﺍﺧﻠﺔ 3.4.6
;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
ﳝﻜﻨﻨﺎ ﻭﺿﻊ ﺃﻱ ﻧﻮﻉ ﻣﻦ ﺍﳊﻠﻘﺎﺕ ﺿﻤﻦ ﺃﻱ ﻧﻮﻉ ﺁﺧﺮ ،ﻭﳝﻜﻦ ﻣﺪﺍﺧﻠﺔ ﺍﳊﻠﻘﺎﺕ
ﰲ ﺣﻠﻘﺎﺕ ﻣﺘﺪﺍﺧﻠﺔ ﰲ ﺣﻠﻘﺎﺕ ﺃﺧﺮﻯ ﻭﻫﻜﺬﺍ.
//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
ﻟﻠﺤﻠﻘﺔ ﺍﳊﻠﻘﺔ
ﺧﻄﺄ
ﺎﻳﺔ ﺍﳊﻠﻘﺔ
//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
ﺑﺪﺍﻳﺔ ﺍﳊﻠﻘﺔ
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;
#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
55
ﺍﳌﻘﺪﻣﺔ 4. 1
ﻭﺭﺛﺖ ﺍﻟﻠﻐﺔ C++ﻣﻦ ﺍﻟﻠﻐﺔ Cﻣﻜﺘﺒﺔ ﺿﺨﻤﺔ ﻭﻏﻨﻴﺔ ﺑﺪﻭﺍﻝ ﺗﻘﻮﻡ ﺑﺘﻨﻔﻴـﺬ ﺍﻟﻌﻤﻠﻴـﺎﺕ
ﺍﻟﺮﻳﺎﺿﻴﺔ ،ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺴﻼﺳﻞ ﻭﺍﻷﺣﺮﻑ ،ﺍﻹﺩﺧﺎﻝ ﻭﺍﻹﺧﺮﺍﺝ ،ﺍﻛﺘﺸﺎﻑ ﺍﻷﺧﻄﺎﺀ ﻭﺍﻟﻌﺪﻳـﺪ
ﻣﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻷﺧﺮﻯ ﺍﳌﻔﻴﺪﺓ ﳑﺎ ﻳﺴﻬﻞ ﻣﻬﻤﺔ ﺍﳌﱪﻣﺞ ﺍﻟﺬﻱ ﳚﺪ ﰲ ﻫﺬﻩ ﺍﻟﺪﻭﺍﻝ ﻣﻌﻴﻨﹰﺎ ﻛﺒﲑﹰﺍ ﻟـﻪ
ﰲ ﻋﻤﻠﻴﺔ ﺍﻟﱪﳎﺔ.
ﳝﻜﻦ ﻟﻠﻤﱪﻣﺞ ﻛﺘﺎﺑﺔ ﺩﻭﺍﻝ ﺗﻘﻮﻡ ﺑﺄﺩﺍﺀ ﻋﻤﻠﻴﺎﺕ ﳛﺘﺎﺝ ﳍﺎ ﰲ ﺑﺮﺍﳎﻪ ﻭﺗﺴﻤﻰ ﻣﺜﻞ ﻫـﺬﻩ
ﺍﻟﺪﻭﺍﻝ
Programmer- defined functions
/1ﺗﺴﺎﻋﺪ ﺍﻟﺪﻭﺍﻝ ﺍﳌﺨﺰﻧﺔ ﰲ ﺫﺍﻛﺮﺓ ﺍﳊﺎﺳﺐ ﻋﻠﻰ ﺍﺧﺘﺼﺎﺭ ﺍﻟﱪﻧﺎﻣﺞ ﺇﺫ ﻳﻜﺘﻔﻲ ﺑﺎﺳﺘﺪﻋﺎﺋﻬﺎ ﺑﺎﲰﻬﺎ
ﻓﻘﻂ ﻟﺘﻘﻮﻡ ﺑﺎﻟﻌﻤﻞ ﺍﳌﻄﻠﻮﺏ .
/2ﺗﺴﺎﻋﺪ ﺍﻟﱪﺍﻣﺞ ﺍﳌﺨﺰﻧﺔ ﰲ ﺫﺍﻛﺮﺓ ﺍﳊﺎﺳﺐ ﺃﻭ ﺍﻟﱵ ﻳﻜﺘﺒﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ ﻋﻠﻰ ﺗﻼﰱ ﻋﻤﻠﻴﺎﺕ
ﻼ ﻣﺸﺎﹰﺎ ﻟﻌﻤﻞ ﺗﻠﻚ ﺍﻟﺪﻭﺍﻝ.ﺍﻟﺘﻜﺮﺍﺭ ﰲ ﺧﻄﻮﺍﺕ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﱵ ﺗﺘﻄﻠﺐ ﻋﻤ ﹰ
/3ﺗﺴﺎﻋﺪ ﺍﻟﺪﻭﺍﻝ ﺍﳉﺎﻫﺰﺓ ﰲ ﺗﺴﻬﻴﻞ ﻋﻤﻠﻴﺔ ﺍﻟﱪﳎﺔ.
/4ﻳﻮﻓﺮ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﻣﻦ ﺍﳌﺴﺎﺣﺎﺕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﰲ ﺍﻟﺬﺍﻛﺮﺓ.
/5ﻛﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﺍﻟـ C+ +ﰲ ﺷﻜﻞ ﺩﻭﺍﻝ ﻭﺍﺿﺤﺔ ﺍﳌﻌﺎﱂ ﳚﻌﻞ ﺍﻟﱪﻧﺎﻣﺞ ﻭﺍﺿﺤﹰﺎ ﻟﻜﻞ ﻣﻦ
ﺍﳌﱪﻣﺞ ﻭﺍﻟﻘﺎﺭﺉ ﻋﻠﻰ ﺣﺪ ﺳﻮﺍﺀ.
ﲢﺘﻮﻯ ﻣﻜﺘﺒﺔ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ ﻋﻠﻰ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺪﻭﺍﻝ ﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ ﰲ ﺗﻨﻔﻴﺬ ﺍﻟﻌﻤﻠﻴﺎﺕ
ﻼ ﺍﳌﱪﻣﺞ ﺍﻟﺬﻱ ﻳﺮﻏﺐ ﰲ ﺣﺴﺎﺏ ﻭﻃﺒﺎﻋﺔ ﺍﳉﺬﺭ ﺍﻟﺘﺮﺑﻴﻌﻲ ﻟﻠﻌﺪﺩ 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
ﳕﻮﺫﺝ ﺍﻟﺪﺍﻟﺔ
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
ﺍﻟﻮﺳﻴﻄﺎﺕ
4.9
Parameters
61
ﺍﳌﺼﻄﻠﺢ ﻭﺳﻴﻄﺎﺕ Argumentﻳﻌﲎ ﺍﻟﻘﻴﻢ ﺍﶈﺪﺩﺓ ﰲ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﺑﻴﻨﻤﺎ
ﻳﻌﲎ ﺍﳌﺼﻄﻠﺢ ﺑﺎﺭﻣﺘﺮﺍﺕ parametersﺍﳌﺘﻐﲑﺍﺕ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﻭﺍﻟﱵ ﰎ ﻧﺴـﺦ ﺗﻠـﻚ
ﺍﻟﻘﻴﻢ ﺇﻟﻴﻬﺎ ،ﻭﻟﻜﻦ ﻏﺎﻟﺒﹰﺎ ﻣﺎ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﳌﺼﻄﻠﺢ ﻭﺳﻴﻄﺎﺕ ﻟﻘﺼﺪ ﺍﳌﻌﻨﻴﲔ.
ﺍﻟﺸﻜﻞ ) (4-1ﻳﻮﺿﺢ ﻫﺬﺍ.
62
main
) (Square
i y
ﻭﺳﻴﻂ a ﺑﺎﺭﻣﺘﺮ
a
ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﺴﺘﺨﺪﻡ ﺩﺍﻟﺔ ﺗﺪﻋﻰ 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;
}
64
♦ ﺭﻏﻢ ﺃﺎ ﻏﲑ ﺿﺮﻭﺭﻳﺔ ﺇﻻ ﺃﻧﻪ ﻳﺘﻢ ﺫﻛﺮ ﺃﲰﺎﺀ ﺍﻟﻮﺳﻴﻄﺎﺕ ﰲ ﺍﻟﺘﺼﺮﻳﺢ ﻭﻣﻦ ﻏﲑ
ﺍﻟﻀﺮﻭﺭﻱ ﺃﻥ ﺗﻜﻮﻥ ﻫﺬﻩ ﺍﻷﲰﺎﺀ ﻫﻲ ﻧﻔﺴﻬﺎ ﺍﳌﺴﺘﻌﻤﻠﺔ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ .ﰲ ﺍﻟﻮﺍﻗﻊ،
ﻼ ﻟﻨﻔﺘﺮﺽﺍﳌﺼﺮﻑ ﻳﺘﺠﺎﻫﻠﻬﺎ ﻟﻜﻨﻬﺎ ﺗﻜﻮﻥ ﻣﻔﻴﺪﺓ ﺃﺣﻴﺎﻧﹰﺎ ﻟﻠﺬﻳﻦ ﻳﻘﺮﺃﻭﻥ ﺍﻟﱪﻧﺎﻣﺞ .ﻓﻤﺜ ﹰ
ﺃﻥ ﺍﻟﻮﺳﻴﻄﲔ xﻭ yﲤﺜﻼﻥ ﺇﺣﺪﺍﺛﻴﺎﺕ ﺍﻟﺸﺎﺷﺔ ﰲ ﺩﺍﻟﺔ ﺗﻔﺮﺽ ﻧﻘﻄﺔ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ.
]ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ[ ;)♦ void draw_dot (int,int
ﻫﺬﺍ ﺍﻟﺘﺼﺮﻳﺢ ﻛﺎﰲ ﻟﻠﻤﻌﺮﻑ ﻟﻜﻦ ﺍﳌﱪﻣﺞ ﻗﺪ ﻻ ﻳﻌﺮﻑ ﺃﻳﻬﻤﺎ ﺍﻹﺣﺪﺍﺛﻲ
ﺍﻟﺴﻴﲏ ﻭﺃﻳﻬﻤﺎ ﺍﻹﺣﺪﺍﺛﻲ ﺍﻟﺼﺎﺩﻱ .ﻟﺬﺍ ﺳﻴﻜﻮﻥ ﻣﻔﻴﺪﹰﺍ ﻟﻮ ﻛﺘﺒﻨﺎ :
;)void draw_dot (int x,int y
♦ ﺇﺫﺍ ﱂ ﻳﺬﻛﺮ ﺍﳌﱪﻣﺞ ﻧﻮﻉ ﺇﻋﺎﺩﺓ ﺍﻟﺪﺍﻟﺔ ﰲ ﺗﺼﺮﻳﺢ ﺍﻟﺪﺍﻟﺔ ﻳﻔﺘﺮﺽ ﺍﳌﺼﺮﻑ ﺃﻥ ﻧﻮﻉ
ﺍﻟﺪﺍﻟﺔ ﻫﻮ .int
♦ ﻋﺪﻡ ﻛﺘﺎﺑﺔ ﻧﻮﻉ ﺇﻋﺎﺩﺓ ﺍﻟﺪﺍﻟﺔ ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺇﺫﺍ ﻛﺎﻥ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻟﺪﺍﻟﺔ ﻳﺘﻄﻠﺐ ﺧﻄﺄ
ﻧﻮﻉ ﺇﻋﺎﺩﺓ ﻏﲑ .int
♦ ﺇﺭﺟﺎﻉ ﻗﻴﻤﺔ ﻣﻦ ﺩﺍﻟﺔ ﰎ ﺍﻹﻋﻼﻥ ﻋﻦ ﻧﻮﻉ ﺇﻋﺎﺩﺎ .void
//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
}
ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ:
ﺍﻟﺪﻭﺍﻝ ﺍﻟﺴﻴﺎﻗﻴﺔ
4.11
Inline Functions
ﲢﺘﺎﺝ ﺑﻌﺾ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺍﻟﱵ ﻳﻌﺘﱪ ﻓﻴﻬﺎ ﻭﻗﺖ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻣﺮﹰﺍ ﺣﻴﻮﻳﹰﺎ ﻭﺣﺎﲰـﺎﹰ،
ﻹﺑﺪﺍﻝ ﻋﻤﻠﻴﺔ ﺍﺳﺘﺪﻋﺎﺀ ﻭﺍﺳﺘﺨﺪﺍﻡ ﺩﺍﻟﺔ ﲟﺎ ﻳﺴﻤﻰ ﺩﺍﻟﺔ ﺳﻴﺎﻗﻴﺔ .ﻭﻫﻰ ﻋﺒﺎﺭﺓ ﻋﻦ ﺷـﻔﺮﺓ ﺗﻘـﻮﻡ
ﺑﺎﻟﻌﻤﻞ ﺍﳌﻄﻠﻮﺏ ﻧﻔﺴﻪ ،ﻳﺘﻢ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺴﻴﺎﻗﻴﺔ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻧﻔﺲ ﺍﻟﺘﺮﻛﻴﺐ ﺍﻟﻨﺤﻮﻱ ﺍﳌﺴﺘﺨﺪﻡ
ﻟﺘﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻻﻋﺘﻴﺎﺩﻳﺔ ،ﻟﻜﻦ ﺑﺪ ﹰﻻ ﻣﻦ ﻭﺿﻊ ﺷﻔﺮﺓ ﺍﻟﺪﺍﻟﺔ ﰲ ﻣﻜﺎﻥ ﻣﺴﺘﻘﻞ ﻳﻀﻌﻬﺎ ﺍﳌﺼـﺮﻑ
66
ﻳﺘﻢ ﺟﻌﻞ ﺍﻟﺪﺍﻟﺔ ﺳﻴﺎﻗﻴﺔ ﻋﻦ ﻃﺮﻳـﻖ.ﰲ ﺍﻟﺴﻴﺎﻕ ﺍﻟﻄﺒﻴﻌﻲ ﻟﻠﱪﻧﺎﻣﺞ ﻣﻜﺎﻥ ﻇﻬﻮﺭ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ
. ﰲ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔinline ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ
//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;
}
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
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
}
ﲢﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻳﻌﲎ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻻﺳﻢ ﻟﻌﺪﺓ ﺩﺍﻻﺕ ﻟﻜﻦ ﻛﻞ ﺩﺍﻟـﺔ
ﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﳍﺎ ﺗﻌﺮﻳﻒ ﻣﺴﺘﻘﻞ .ﻋﻨﺪ ﺍﺳﺘﺪﻋﺎﺀ ﺩﺍﻟﺔ ﻳﺒﺤﺚ ﺍﳌﺼﺮﻑ ﻋﻦ ﻧـﻮﻉ ﻭﺳـﻴﻄﺎﺕ
ﺍﻟﺪﺍﻟﺔ ﻭﻋﺪﺩﻫﺎ ﳌﻌﺮﻓﺔ ﺍﻟﺪﺍﻟﺔ ﺍﳌﻘﺼﻮﺩﺓ .ﻭﻟﻜﻲ ﳝﻴﺰ ﺍﳌﺼﺮﻑ ﺑﲔ ﺩﺍﻟﺔ ﻭﺃﺧﺮﻯ ﲢﻤﻞ ﻧﻔﺲ ﺍﻻﺳﻢ،
ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺗﻌﺮﻑ ﺑﺘﺸﻮﻳﻪ ﺍﻷﲰﺎﺀ ) ،(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;
}
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
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
71
ﺍﻟﺸﻜﻞ ) (4-2ﻳﺒﲔ ﻛﻴﻒ ﻳﺰﻭﺩ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ:
)Box volume(10,1,1
ﻓﻘﻂ ﺍﻟﻮﺳﻴﻄﺎﺕ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺎﻳﺔ ﻻﺋﺤﺔ ﺍﻟﻮﺳﻴﻄﺎﺕ ﳝﻜﻦ ﺇﻋﻄﺎﺅﻫﺎ ﻭﺳﻴﻄﺎﺕ ﺍﻓﺘﺮﺍﺿﻴﺔ ،ﻓﺈﺫﺍ ﻛﺎﻧﺖ ﻫﻨﺎﻟﻚ ﻭﺳﻴﻄﺔ
ﻭﺍﺣﺪﺓ ﻓﻘﻂ ﳍﺎ ﻭﺳﻴﻄﺔ ﺍﻓﺘﺮﺍﺿﻴﺔ ﳚﺐ ﺃﻥ ﺗﻜﻮﻥ ﺍﻷﺧﲑﺓ ﻭﻻ ﳝﻜﻨﻨﺎ ﻭﺿﻊ ﻭﺳﻴﻄﺔ ﺍﻓﺘﺮﺍﺿﻴﺔ ﰲ ﻭﺳﻂ ﻻﺋﺤﺔ ﻭﺳﻴﻄﺎﺕ ﻋﺎﺩﻳـﺔ
ﻟﻨﻔﺮﺽ ﺃﻧﻨﺎ ﻟﺪﻳﻨﺎ ﻣﺘﻐﲑﻳﻦ ﺻﺤﻴﺤﲔ ﰲ ﺑﺮﻧﺎﻣﺞ ﻭﻧﺮﻳﺪ ﺍﺳﺘﺪﻋﺎﺀ ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﺑﺘﺒﺪﻳﻞ ﻗﻴﻤﱵ
ﺍﻟﺮﻗﻤﲔ ،ﻟﻨﻔﺮﺽ ﺃﻧﻨﺎ ﻋﺮﻓﻨﺎ ﺍﻟﺮﻗﻤﲔ ﻛﺎﻵﰐ:
;int x=1
;int y=2
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ﻭﻳﻜﻮﻥ ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
ﻛﺎﻟﺘﺎﱄ:
ﺍﳊﺮﻑ & ﻳﻠﻲ intﰲ ﺍﻟﺘﺼﺮﻳﺢ ﻭﺍﻟﺘﻌﺮﻳﻒ ﻭﻫﻮ ﻳﺒﻠﻎ ﺍﳌﺼﺮﻑ ﺃﻥ ﳝﺮﺭ ﻫﺬﻩ
ﺍﻟﻮﺳﻴﻄﺎﺕ ﺑﺎﳌﺮﺟﻊ ،ﺃﻱ ﺃﻥ ﺍﻟﻮﺳﻴﻄﺔ aﻫﻲ ﻣﺮﺟﻊ ﺇﱃ xﻭ bﻫﻲ ﻣﺮﺟﻊ ﺇﱃ yﻭﻻ
ﻳﺴﺘﻌﻤﻞ & ﰲ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ.
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
/3ﺃﻛﺘﺐ ﺗﻌﺮﻳﻔﹰﺎ ﻟﺪﺍﻟﺔ ﲢﺪﺩ ﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﺮﻗﻢ ﺭﻗﻤﹰﺎ ﺃﻭﻟﻴﹰﺎ ﺃﻡ ﻻ.
ﺗﻠﻤﻴﺢ :ﺍﻟﺮﻗﻢ ﺍﻷﻭﱃ ﻫﻮ ﺍﻟﺬﻱ ﻻ ﻳﻘﺒﻞ ﺍﻟﻘﺴﻤﺔ ﺇﻻ ﻋﻠﻰ ﻧﻔﺴﻪ ﻭﺍﻟﺮﻗﻢ .1
ﻼ ﺇﺫﺍ
/7ﺃﻛﺘﺐ ﺗﻌﺮﻳﻔﹰﺎ ﻟﺪﺍﻟﺔ ﺗﺴﺘﻘﺒﻞ ﻋﺪﺩﹰﺍ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﰒ ﺗﺮﺟﻊ ﺍﻟﻌﺪﺩ ﻣﻌﻜﻮﺳﹰﺎ ﻓﻤﺜ ﹰ
ﺃﺩﺧﻞ ﺍﳌﺴﺘﺨﺪﻡ ﺍﻟﻌﺪﺩ 1234ﺗﺮﺟﻊ ﺍﻟﺪﺍﻟﺔ ﺍﻟﻌﺪﺩ .4321
76
ﺍﻟﻮﺣﺪﺓ ﺍﳋﺎﻣﺴﺔ
5.0
ﺍﳌﺼﻔﻮﻓﺎﺕ ﻭﺍﳌﺆﺷﺮﺍﺕ 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
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
//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
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
ﺗﻮﺟﺪ ﻋﺪﺓ ﺩﺍﻻﺕ ﺗﻌﻤﻞ ﻋﻠﻰ ﺍﻟﺴﻼﺳﻞ ،ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺍﺳﺘﻌﻤﺎﻝ ﺃﻱ ﻣﻦ ﻫﺬﻩ ﺍﻟﺪﻭﺍﻝ ﰲ
ﺑﺮﻧﺎﻣﺞ ﳚﺐ ﺃﻥ ﻧﻘﻮﻡ ﺑﺘﻀﻤﲔ ﻣﻠﻒ ﺍﻟﺘﺮﻭﻳﺴﺔ . 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;
}
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
-: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;
}
-: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
90
ﳝﻜﻦ ﻟﻠﻤﺼﻔﻮﻓﺎﺕ ﰲ C+ +ﺃﻥ ﺗﻜﻮﻥ ﻣﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ ﻭﳝﻜﻦ ﻛﺬﻟﻚ ﺃﻥ ﻳﻜـﻮﻥ
ﻛﻞ ﺑﻌﺪ ﲝﺠﻢ ﳐﺘﻠﻒ ،ﺍﻻﺳﺘﻌﻤﺎﻝ ﺍﻟﺸﺎﺋﻊ ﻟﻠﻤﺼﻔﻮﻓﺎﺕ ﻣﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ ﻫـﻮ ﲤﺜﻴـﻞ ﺍﳉـﺪﺍﻭﻝ
Tablesﺍﻟﺘﺎﱄ ﲢﺘﻮﻱ ﻋﻠﻰ ﺑﻴﺎﻧﺎﺕ ﻣﺮﺗﺒﺔ ﰲ ﺻﻮﺭﺓ ﺻﻔﻮﻑ ﻭﺃﻋﻤﺪﺓ ﻭﻟﺘﻤﺜﻴﻞ ﺍﳉﺪﻭﻝ ﳓﺘـﺎﺝ
ﻟﺒﻌﺪﻳﻦ ﺍﻷﻭﻝ ﳝﺜﻞ ﺍﻟﺼﻔﻮﻑ ﻭﺍﻟﺜﺎﱐ ﳝﺜﻞ ﺍﻷﻋﻤﺪﺓ.
ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ ﻳﺒﲔ ﻣﺼﻔﻮﻓﺔ Aﲢﺘﻮﻯ ﻋﻠﻰ ﺛﻼﺛﺔ ﺻﻔﻮﻑ ﻭﺃﺭﺑﻊ ﺃﻋﻤﺪﺓ.
//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;
}
}
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
92
4 0 0
93
Pointers ﺍﳌﺆﺷﺮﺍﺕ 5.7
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
ﻭﻋﻨﺪﻣﺎ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ * ﻋﻠﻰ ﻳﺴﺎﺭ ﺍﺳﻢ ﺍﳌﺘﻐﲑ ﻛﻤﺎ ﺣﺼﻞ ﰲ ﺍﻟﺘﻌﺒﲑ *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;
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
96
The address of a is oxfff4
The value of aptr is 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
.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
}
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
ﻳﻘﻮﻡ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺘﻤﺮﻳﺮ ﺍﳌﺘﻐﲑ ﻛﻮﺳﻴﻄﺔ ﻟﻠﺪﺍﻟﺔ ﻣﺴﺘﺨﺪﻣﹰﺎ ﻃﺮﻳﻘﺔ ﺍﻟﺘﻤﺮﻳﺮ ﺑﺎﻟﻘﻴﻤـﺔ
ﻭﺗﻘﻮﻡ ﺑﺈﺭﺟﺎﻉ ﺍﻟﻨﺘﻴﺠـﺔ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
ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ:
ﻧﺬﻛﺮ ﻫﻨﺎ ﺃﻥ ﺍﻟﺪﺍﻟﺔ ﺍﻟﱵ ﻳﺘﻢ ﲤﺮﻳﺮ ﻋﻨﻮﺍﻥ ﻣﺘﻐﲑ ﻛﻮﺳﻴﻄﺔ ﳍﺎ ﳚـﺐ ﺃﻥ ﻳـﺘﻢ ﻓﻴﻬـﺎ
ﻼ ﰲ ﺍﻟﺪﺍﻟﺔ -: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
103
ﻟﺬﺍ ﳝﻜﻨﻨﺎ ﺯﻳﺎﺩﺓ str2ﻷﻧﻪ ﻣﺆﺷﺮ ﻭﻟﻜﻦ ﺑﺰﻳﺎﺩﺗﻪ ﺳﻴﺸﲑ ﺇﱃ ﺍﳊﺮﻑ ﺍﻟﺜﺎﱐ ﰲ ﺍﻟﺴﻠﺴﻠﺔ
ﻭﻋﻠﻴﻪ ﺍﳋﺮﺝ ﻣﻦ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ-:
with array
with pointer
ith pointer
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
}
//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
110
/4ﺃﻛﺘﺐ ﺇﻋﻼﻧﹰﺎ ﳌﺼﻔﻮﻓﺔ ﺃﻋﺪﺍﺩ ﺻﺤﻴﺤﺔ ﺗﺪﻋﻰ intArrayﻭﺍﻟﱵ ﲢﺘﻮﻱ ﻋﻠـﻰ ﺛﻼﺛـﺔ
ﺻﻔﻮﻑ ﻭﻋﻤﻮﺩﻳﻦ.
/5ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻳﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻟﻌﻨﺼﺮ ﺍﻷﺻﻐﺮ ﻣﻦ ﻋﻨﺎﺻﺮ ﻣﺼﻔﻮﻓﺔ ﲢﺘـﻮﻱ ﻋﻠـﻰ ﺛﻼﺛـﺔ
ﺻﻔﻮﻑ ﻭﺛﻼﺛﺔ ﺃﻋﻤﺪﺓ.
/6ﺃﻛﺘﺐ ﻋﺒﺎﺭﺓ C++ﺻﺤﻴﺤﺔ ﻟﻜﻞ ﻣﻦ ﺍﻵﰐ )ﺇﻓﺘﺮﺽ ﺃﻧﻪ ﰎ ﺍﻹﻋـﻼﻥ ﻋـﻦ ﻋـﺪﺩﻳﻦ
ﺻﺤﻴﺤﲔ Value1ﻭ Value2ﻭﰎ ﲤﻬﻴﺪ ﻗﻴﻤﺔ ﺍﳌﺘﻐﲑ value1ﻋﻨﺪ : (200000
ﺍﻹﻋﻼﻥ ﻋﻦ ﻣﺆﺷﺮ iptrﻟﻴﺸﲑ ﺇﱃ ﻣﺘﻐﲑ ﻣﻦ ﺍﻟﻨﻮﻉ .int
ﺗﻌﻴﲔ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﻳﺸﲑ ﺇﻟﻴﻬﺎ ﺍﳌﺆﺷﺮ iptrﺇﱃ ﺍﳌﺘﻐﲑ .value2
111
ﺍﻟﻮﺣﺪﺓ ﺍﻟﺴﺎﺩﺳﺔ
6.0
)Classes (I ﺍﻟﻔﺌﺎﺕ)- (I
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ﻳﺒﲔ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ ﻛﻴﻒ ﻳﺒﺪﻭ ﻫﺬﺍ:
ﺳﺤﺐ pop
3
2
1
ﺗﺴﺘﻌﻤﻞ ﻋﺎﺩﺓ ﻟﺘﻤﺜﻴﻞ ﺍﳌﻜﺪﺱ ﻣﺼﻔﻮﻓﺔ ﻳﺘﻢ ﻓﻴﻬﺎ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﻭﻣﺆﺷﺮ ﻳﺸﲑ ﺇﱃ ﺃﻋﻠـﻰ
ﺍﳌﻜﺪﺱ )ﺁﺧﺮ ﻋﻨﺼﺮ ﰲ ﺍﳌﻜﺪﺱ ( .
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++ﻷﻧﻨﺎ ﻧﺮﻳﺪ ﺃﻥ ﳔﻔﻰ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻦ ﺍﻟﻌﺎﱂ ﺍﳋﺎﺭﺟﻲ ﻻ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﳏﻤﻴﺔ ﺑﻴﻨﻤﺎ
ﻧﺮﻳﺪ ﺃﻥ ﺗﻜﻮﻥ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻋﺎﻣﺔ ﺣﱴ ﺗﺴﺘﻄﻴﻊ ﺍﻷﺟﺰﺍﺀ ﺍﻷﺧﺮﻯ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ ﺍﺳﺘﺪﻋﺎﺋﻬﺎ.
117
ﳝﻜﻦ ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻧﻔﺲ ﺍﻟﺘﺮﻛﻴﺐ ﺍﳌﺴﺘﺨﺪﻡ ﻹﻧﺸﺎﺀ ﻣﺘﻐﲑ ﻣـﻦ ﻧـﻮﻉ
ﻼ ﻭﺫﻟﻚ ﺃﻥ ﺍﻟﻜﺎﺋﻨﺎﺕ ﰲ C++ﺗﺘﻢ ﻣﻌﺎﻣﻠﺘﻬﺎ ﻛﺄﻧﻮﺍﻉ ﻣﺘﻐﲑﺍﺕ ﻛﻤﺎ ﺗﺘﻢ
ﺃﺳﺎﺳﻲ ﻛـ intﻣﺜ ﹰ
ﻣﻌﺎﻣﻠﺔ ﺍﻟﻔﺌﺎﺕ ﻛﺄﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﻭﻋﻠﻴﻪ ﻹﻧﺸﺎﺀ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ stackﻧﻜﺘﺐ-:
;stack stack1
ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﺍﻟﻌﺒﺎﺭﺓ ﳛﺴﺐ ﺍﻟﱪﻧﺎﻣﺞ ﺣﺠﻢ ﺍﻟﻜﺎﺋﻦ ﻭﳜﺼﺺ ﻣﺴﺎﺣﺔ ﻛﺎﻓﻴﺔ ﻟﻪ ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ
ﻭﻳﻌﻄﻰ ﻣﺴﺎﺣﺔ ﺍﻟﺬﺍﻛﺮﺓ ﻫﺬﻩ ﺍﲰﹰﺎ . stack1ﻭﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ ﳝﻜﻨﻨﺎ ﺇﻧﺸﺎﺀ ﻗﺪﺭ ﻣﺎ ﻧﺸﺎﺀ ﻣـﻦ
ﺍﻟﻜﺎﺋﻨﺎﺕ -:
;stack stack1, stack2 ,stack3
ﺍﻟﺘﻔﺎﻋﻞ ﻣﻊ ﺍﻟﻜﺎﺋﻨﺎﺕ-:
ﻳﺘﻢ ﺍﻟﺘﻔﺎﻋﻞ ﻣﻊ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻣﻦ ﺧﻼﻝ ﺍﺳﺘﺪﻋﺎﺀ ﺃﺣﺪ ﺃﻋﻀﺎﺀﻫﺎ ﺍﻟﺪﺍﻟﻴـﺔ ﻭﺍﻟﺜـﺎﱐ ﻳﺒـﺪﻭ
ﻛﺈﺭﺳﺎﻝ ﺭﺳﺎﻟﺔ ﺇﱃ ﺍﻟﻜﺎﺋﻦ .ﳓﺘﺎﺝ ﺇﱃ ﺗﺮﻛﻴﺐ ﻣﺆﻟﻒ ﻣﻦ ﻗﺴﻤﲔ :ﺍﺳﻢ ﺍﻟﻜﺎﺋﻦ ﻭﺍﺳﻢ ﺍﻟﻌﻀﻮ
ﺍﻟﺪﺍﱄ ﻭﻳﺘﻢ ﺭﺑﻂ ﺍﺳﻢ ﺍﻟﻜﺎﺋﻦ ﻭﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ﺑﻮﺍﺳﻄﺔ ﻧﻘﻄﺔ) (.ﺗﺴﻤﻰ ﻋﺎﻣﻞ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺃﻋﻀـﺎﺀ
ﺍﻟﻔﺌﺔ.
118
}
//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 ( );
};
int stack::pop( )
119
{
if(tos == 0) {
stack1.init ( );
stack2.init ( );
stack1.push (1);
stack2.push (2);
stack1.push (3);
stack2.push (4);
return 0;
}
ﻋﻨﺪﻣﺎ ﻧﺴﺤﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﻗﻤﻨﺎ ﺑﺪﻓﻌﻬﺎ ﰲ ﺍﳌﻜﺪﺱ ﺗﻈﻬﺮ ﺑﺘﺮﺗﻴﺐ ﻣﻌﻜـﻮﺱ ﻭﻋﻠﻴـﻪ
: ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
120
3 1 4 2
ﺗﺬﻛﺮ ﺃﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳋﺎﺻﺔ ﻻ ﳝﻜﻦ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﺇﻻ ﻣﻦ ﻗﺒﻞ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﺘﺎﺑﻌـﺔ
ﻟﻠﻔﺌﺔ ﻭﻋﻠﻴﻪ ﻋﺒﺎﺭﺓ ﻛﺎﻟﺘﺎﻟﻴﺔ ﻏﲑ ﻣﻘﺒﻮﻟﺔ ﰲ -:C++
stack1.tos=0 // Error tos is private
//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
♦ ﺍﻟﺒﻨﻴﺔ ﺷﺒﻴﻬﺔ ﺟﺪﹰﺍ ﺑﺎﻟﻔﺌﺔ ﻣﻦ ﻧﺎﺣﻴﺔ ﺍﻟﺘﺮﻛﻴﺐ ﺍﳌﻨﻄﻘﻲ ﻟﻜﻦ ﺍﻟﻔﺌﺎﺕ ﻭﺍﻟﺒﻨﻴﺎﺕ ﺗﺴﺘﻌﻤﻞ ﺑﻄﺮﻕ ﳐﺘﻠﻔﺔ ﺟﺪﹰﺍ ،ﻋـﺎﺩﺓ
ﲢﺘﻮﻯ ﺍﻟﻔﺌﺔ ﻋﻠﻰ ﺑﻴﺎﻧﺎﺕ ﻭﺩﺍﻻﺕ ﺑﻴﻨﻤﺎ ﲢﺘﻮﻯ ﺍﻟﺒﻨﻴﺔ ﻋﻠﻰ ﺑﻴﺎﻧﺎﺕ ﻓﻘﻂ.
♦ ﻻ ﺗﺆﺩﻯ ﻣﻮﺍﺻﻔﺎﺕ ﺍﻟﺒﻨﻴﺔ ﺇﱃ ﺇﻧﺸﺎﺀ ﺃﻱ ﺑﻨﻴﺔ ﻛﻤﺎ ﻫﻮ ﺍﳊﺎﻝ ﻣﻊ ﺍﻟﻔﺌﺎﺕ ،ﺇﺎ ﳎﺮﺩ ﻣﻮﺍﺻﻔﺎﺕ ﻟﺸـﻜﻞ ﺍﻟﺒﻨﻴـﺔ
ﻋﻨﺪﻣﺎ ﻳﺘﻢ ﺇﻧﺸﺎﺅﻫﺎ.
123
;int modelnumber
;int partnumber
;float cost
;}cp1,cp2
ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﻋﺎﻣﻞ ﺍﻟﻨﻘﻄﺔ ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﺃﻋﻀﺎﺀ ﺍﻟﺒﻨﻴﺔ ﲤﺎﻣﹰﺎ ﻣﺜﻠﻤﺎ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ ﻟﻠﻮﺻﻮﻝ
ﻼ ﳝﻜﻨﻨﺎ ﺃﻥ ﻧﻜﺘﺐ-:ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻣﻦ ﺍﻟﻜﺎﺋﻨﺎﺕ ،ﻓﻤﺜ ﹰ
;cin>> cp1.part number
ﻭﻳﻜﻮﻥ ﺍﺳﻢ ﺍﳌﺘﻐﲑ ﻗﺒﻞ ﺍﻟﻨﻘﻄﺔ ﺑﻴﻨﻤﺎ ﻳﻜﻮﻥ ﺍﺳﻢ ﺍﻟﻌﻀﻮ ﺍﻟﺒﻴﺎﱐ ﺑﻌﺪﻫﺎ.
ﺇﺳﺘﻌﻤﺎﻝ ﺍﻟﺒﻨﻴﺔ:
ﰲ ﺍﻟﻔﺌﺔ 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
2
126
ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ ﺗﻜﻮﻥ ﺃﻋﻀﺎﺀ ﺧﺎﺻﺔ ﺑﺸﻜﻞ ﺍﻓﺘﺮﺍﺿﻲ .ﺃﻱ ﺇﺫﺍ ﱂ ﻳﺘﻢ ﺍﺳـﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤـﺎﺕ
ﺍﻷﺳﺎﺳﻴﺔ publicﺃﻭ privateﺗﻜﻮﻥ ﺃﻋﻀﺎﺀ ﺍﻟﻔﺌﺔ ﺧﺎﺻﺔ.
127
ﺍﳌﻠﺨﺺ:
128
ﺍﻷﺳﺌﻠﺔ
/1ﺃﻧﺸﺊ ﻓﺌﺔ ﺗﺪﻋﻰ complexﺗﻘﻮﻡ ﺑﺈﺟﺮﺍﺀ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ ﻋﻠﻰ ﺍﻷﻋﺪﺍﺩ ﺍﳌﺮﻛﺒﺔ.
ﺍﻟﻌﺪﺩ ﺍﳌﺮﻛﺐ ﻳﻜﻮﻥ ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ :
real part + imaginary part*i
ﺣﻴﺚ i= √-1
ﺍﺳﺘﺨﺪﻡ ﻣﺘﻐﲑﺍﺕ ﻣﻦ ﺍﻟﻨﻮﻉ floatﻟﺘﻤﺜﻴﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳋﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ،ﻋﻠـﻰ ﺃﻥ ﲢﺘـﻮﻯ
ﺍﻟﻔﺌﺔ complexﻋﻠﻰ ﺍﻟﺪﻭﺍﻝ ﺍﻵﺗﻴﺔ:
ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﲜﻤﻊ ﻋﺪﺩﻳﻦ ﻣﺮﻛﺒﲔ.
ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﺑﻄﺒﺎﻋﺔ ﺍﻷﻋﺪﺍﺩ ﺍﳌﺮﻛﺒﺔ ﻋﻠﻰ ﺍﻟﺼﻮﺭﺓ ) (a, bﺣﻴـﺚ aﳝﺜـﻞ ﺍﳉـﺰﺀ
129
// function prototypes
private:
int hour = 0;
int minute = 0;
int second = 0;
};
scope resolution operator .:: ﻣﺎ ﻫﻮ ﺍﻟﻐﺮﺽ ﻣﻦ ﻋﺎﻣﻞ ﺩﻗﺔ ﺍﳌﺪﻯ/4
130
ﺍﻟﻮﺣﺪﺓ ﺍﻟﺴﺎﺑﻌﺔ
7.0
)Classes (II) - (II ﺍﻟﻔﺌﺎﺕ
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
//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
ﻭﻟﻜﻦ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻷﻭﱃ ﻫﻲ ﺍﻷﻛﺜﺮ ﺍﺳﺘﺨﺪﺍﻣﹰﺎ .
//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;
}
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
ﻳﺘﻢ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;
}
142
;Time t
;)t.setTime (13, 27, 6
;“ cout<< endl << “military time after setTime is
;) ( t.printMilitary
;cout<< endl
;return 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
}
ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ:
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
ﻭﻣﻦ ﺍﳉﺪﻳﺮ ﺑﺎﻟﺬﻛﺮ ﺃﻧﻪ ﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺼﺪﻳﻘﺔ ﺗﺰﻳﺪ ﻣﻦ ﻣﺮﻭﻧﺔ ﺍﻟﻠﻐـﺔ 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
152
ﺗﺴﺘﻌﻤﻞ ﺍﻟﻔﺌﺎﺕ ﺍﻟﺼﺪﻳﻘﺔ ﺇﺫﺍ ﻛﺎﻥ ﻫﻨﺎﻟﻚ ﻓﺌﺘﲔ ﻣﺮﺗﺒﻄﺘﲔ ﺑﺒﻌﻀﻬﻤﺎ ﻛﺜﲑﹰﺍ ﻟﺪﺭﺟﺔ ﺃﻥ ﺃﺣﺪﳘﺎ ﲢﺘﺎﺝ ﺇﱃ ﺍﻟﻮﺻﻮﻝ ﺇﱃ
ﺑﻴﺎﻧﺎﺕ ﺍﻷﺧﺮﻯ ﺍﳋﺎﺻﺔ ﺑﺸﻜﻞ ﻣﺒﺎﺷﺮ .ﺃﻧﻨﺎ ﻻ ﻧﺮﻳﺪ ﺃﻥ ﳒﻌﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﺎﻣﺔ ﻷﻥ ﻫﺬﺍ ﺳﻴﺘﻴﺢ ﻷﻱ ﺷﺨﺺ ﺗﻌﺪﻳﻠﻬﺎ ﺑﻄﺮﻳﻖ
ﺍﳋﻄﺄ .ﻛﻤﺎ ﺃﻥ ﺍﻟﻔﺌﺔ ﻫﻲ ﻟﻴﺴﺖ ﻣﺸﺘﺮﻛﺔ ﰲ ﺻﻔﺎﺕ ﻣﻊ ﺍﻟﻔﺌﺔ ﺍﻷﺧﺮﻯ ﻭﻋﻠﻴﻪ ﻻ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻮﺭﺍﺛﺔ ﻟﺬﺍ ﻓﺈﻥ ﺍﺳﺘﻌﻤﺎﻝ
ﺍﻟﻔﺌﺎﺕ ﺍﻟﺼﺪﻳﻘﺔ ﻫﻮ ﺍﻷﺳﻠﻮﺏ ﺍﻟﻮﺣﻴﺪ ﳉﻌﻞ ﺇﺣﺪﻯ ﺍﻟﻔﺌﺘﲔ ﺗﺼﻞ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﳋﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻷﺧﺮﻯ.
ﺗﻌﻴﲔ ﺍﻟﻜﺎﺋﻨﺎﺕ
Object assignment
8.3
ﳝﻜﻦ ﺗﻌﻴﲔ ﻗﻴﻤﺔ ﻛﺎﺋﻦ ﺇﱃ ﻛﺎﺋﻦ ﺁﺧﺮ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻋﻼﻣﺔ ﺍﳌﺴﺎﻭﺍﺓ = ﺷﺮﻳﻄﺔ ﺃﻥ ﺗﻨﺘﻤـﻲ
ﻫﺬﻩ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺇﱃ ﻧﻔﺲ ﺍﻟﻔﺌﺔ ﻭﻳﺆﺩﻯ ﻫﺬﺍ ﺇﱃ ﺃﻥ ﳛﻤﻞ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﻋﻠﻰ ﻳﺴﺎﺭ ﻋﻼﻣﺔ ﺍﳌﺴﺎﻭﺍﺓ
ﻗﻴﻤﺔ ﺍﻟﻜﺎﺋﻦ ﻋﻠﻰ ﳝﻴﻨﻬﺎ.
ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻮﺿﺢ ﺫﻟﻚ:
ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
153
This is ob2’s i: 99
154
/5ﺑﺈﻣﻜﺎﻥ ﺍﻟﻌﺎﻣﻞ ﺍﶈﻤﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻋﻨﺪ ﺗﻄﺒﻴﻘﻪ ﻋﻠﻰ ﺍﻟﻜﺎﺋﻨﺎﺕ )ﻟﻴﺲ ﻋﻠﻰ ﺍﻻﻧﻮﺍﻉ
ﻼ ﺑﺈﻣﻜـﺎﻥ ﺍﻟﻌﺎﻣـﻞ +ﺍﶈﻤـﻞ
ﺍﻷﺳﺎﺳﻴﺔ( ﺗﻨﻔﻴﺬ ﺃﻱ ﻋﻤﻠﻴﺔ ﻳﺮﻳﺪﻫﺎ ﻣﻨﺸﺊ ﺍﻟﻔﺌﺔ ،ﻓﻤﺜ ﹰ
ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺃﻥ ﻳﻌﺮﺽ ﻧﺼﹰﺎ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ﺃﻭ ﺣﱴ ﻳﻘﻮﻡ ﺑﻄﺮﺡ ﻛـﺎﺋﻨﲔ ﻭﻟﻜـﻦ ﻣـﻦ
ﺍﳌﺴﺘﺤﺴﻦ ﺃﻥ ﺗﻜﻮﻥ ﺍﻟﻌﻤﻠﻴﺔ ﺍﳌﺮﺍﺩ ﻟﻠﻌﺎﻣﻞ ﺍﶈﻤﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺗﻨﻔﻴﺬﻫﺎ ﺃﻥ ﺗﻜﻮﻥ ﳍـﺎ
ﻼ.
ﻋﻼﻗﺔ ﺑﻄﺒﻴﻌﺔ ﺍﻟﻌﺎﻣﻞ ﺃﺻ ﹰ
/6ﺑﻌﺾ ﺍﻟﻔﺌﺎﺕ ﻣﻼﺋﻤﺔ ﻻﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻮﺍﻣﻞ ﺍﶈﻤﻠﺔ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻋﻠﻰ ﻋﻜﺲ ﺍﻟـﺒﻌﺾ
ﺍﻵﺧﺮ ،ﻭﺑﺸﻜﻞ ﻋﺎﻡ ﻳﺘﻢ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﻮﺍﻣﻞ ﺍﶈﻤﻠﺔ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻣﻊ ﺍﻟﻔﺌﺎﺕ ﺍﻟﱵ ﲤﺜـﻞ
ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ ﺭﻗﻤﻴﺔ ﻛﺎﻷﻭﻗﺎﺕ ﻭﺍﻟﺘﻮﺍﺭﻳﺦ ﻭﺍﻷﺭﻗﺎﻡ ﺍﳌﺮﻛﺒﺔ ) (x+iyﻛﻤﺎ ﳝﻜـﻦ ﺃﻥ
ﺗﺴﺘﻔﻴﺪ ﻓﺌﺎﺕ ﺍﻟﺴﻼﺳﻞ ﺃﻳﻀﹰﺎ ﻣﻦ ﺍﻟﻌﻮﺍﻣﻞ ﺍﶈﻤﻠﺔ ﺑﺸﻜﻞ ﺯﺍﺋﺪ.
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
//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
}
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 ؛
{
162
ﻗﻴﻤﺔ ﺟﺪﻳﺪﺓ ﻟﻠﻜﺎﺋﻦ ﻋﻠﻰ ﻳﺴﺎﺭ ﺍﻟﻌﻼﻣﺔ = ﻭﺍﻟﺬﻱ ﻗﺎﻡ ﺑﺎﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟـﺔ ﻭﰲ ﺍﻟﺪﺍﻟـﺔ
) ( operator++ﻳﺘﻢ ﺯﻳﺎﺩﺓ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﺍﺳﺘﺪﻋﻰ ﺍﻟﺪﺍﻟﺔ ﲟﻘﺪﺍﺭ . 1
ﻼ
ﻼ ﺯﺍﺋﺪﹰﺍ .ﻓﻤﺜ ﹰ
ﳝﻜﻨﻨﺎ ﲢﻤﻴﻞ ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﻴﲔ ﰲ ++Cﻛـ = -ﺃﻭ = +ﲢﻤﻴ ﹰ
ﻼ ﺯﺍﺋﺪﹰﺍ ﰲ ﺍﻟﻔﺌﺔ .loc
ﺍﻟﺪﺍﻟﺔ ﺍﻟﺘﺎﻟﻴﺔ ﺗﻘﻮﻡ ﺑﺘﺤﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ = +ﲢﻤﻴ ﹰ
)loc loc:: operator+= (loc op2
{
؛loc temp
؛longitude = op2.longitude+ longitude
؛latitude = op2.latitude+ latitude
؛return *this
}
ﺍﻟﻔﺮﻕ ﺑﲔ ﺍﻟﻌﻮﺍﻣﻞ ﺍﻟﺜﻨﺎﺋﻴﺔ ﺍﻟﻌﺎﺩﻳﺔ ﻛـ +ﻭﺑﲔ ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﻴﲔ ﻛــ = +ﻫـﻮ ﺃﻥ
ﻼ ﺇﺫﺍ ﻛﺘﺒﻨﺎ:
ﻋﻮﺍﻣﻞ ﺍﻟﺘﻌﻴﲔ ﺗﻌﺪﻝ ﺍﻟﻜﺎﺋﻦ ﺍﻟﺬﻱ ﰎ ﺍﺳﺘﺪﻋﺎﺅﻫﺎ ﻣﻦ ﺃﺟﻠﻪ ﻓﻤﺜ ﹰ
؛ob1 += ob2
ﺳﻴﺘﻢ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ) ( operator=+ﻟﻠﻜﺎﺋﻦ ob1ﻭﻳﺘﻢ ﺗﻌﺪﻳﻠﻪ ﲜﻤﻊ
ob2ﺇﻟﻴﻪ.
ﳝﻜﻨﻨﺎ ﲢﻤﻴﻞ ﻋﺎﻣﻞ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺩﺍﻟﺔ ﺻﺪﻳﻘﺔ ﻟﺪﻭﺍﻝ ﺍﻟﻔﺌﺔ ﺍﳌـﺮﺍﺩ
ﲢﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ ﻟﻴﻌﻤﻞ ﻋﻠﻰ ﻛﺎﺋﻨﺎﺎ ﻭﲟﺎ ﺃﻥ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺼﺪﻳﻘﺔ ﻫﻲ ﻟﻴﺴﺖ ﻋﻀﻮﹰﺍ ﰲ ﺍﻟﻔﺌﺔ
ﻟﺬﺍ ﻓﻬﻲ ﻻ ﲤﺘﻠﻚ ﺍﳌﺆﺷﺮ 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 ﺍﻟﻮﺭﺍﺛﺔ ﻭﺗﻌﺪﺩ ﺍﻷﺷﻜﺎﻝ
172
ﻣﻘﺪﻣﺔ 9.1
ﺍﻟﻮﺭﺍﺛﺔ ﻫﻲ ﺍﳌﻔﻬﻮﻡ ﺍﻟﺮﺋﻴﺴﻲ ﺑﻌﺪ ﺍﻟﻔﺌﺎﺕ ﰲ OOPﺇﻻ ﺃﺎ ﻋﻤﻠﻴﹰﺎ ﺗﺸﻜﻞ ﺍﻟﻘﻮﺓ ﺍﻟﺪﺍﻓﻌﺔ
ﳌﺒﺪﺃ ﺍﻟﱪﳎﺔ ﻛﺎﺋﻨﻴﺔ ﺍﳌﻨﺤﻰ ﻭﺗﻌﺘﻤﺪ ﻓﻜﺮﺓ ﺍﻟﻮﺭﺍﺛﺔ ﻋﻠﻰ ﺇﻣﻜﺎﻧﻴﺔ ﺇﻧﺸﺎﺀ ﻓﺌـﺎﺕ ﺟﺪﻳـﺪﺓ ﺗﻜـﻮﻥ
ﻼ ﻭﺫﻟﻚ ﲜﻌﻞ ﺍﻟﻔﺌﺔ ﺍﳉﺪﻳﺪﺓ ﺗﺮﺙ ﻛﻞ ﺻﻔﺎﺕ ﺍﻟﻔﺌﺔ ﻣﺸﺘﺮﻛﺔ ﰲ ﺻﻔﺎﺕ ﻣﻊ ﻓﺌﺎﺕ ﻣﻮﺟﻮﺩﺓ ﺃﺻ ﹰ
ﺍﻟﻘﺪﳝﺔ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺻﻔﺎﺎ ﺍﳋﺎﺻﺔ ﺎ ﻓﺒﺪ ﹰﻻ ﻣﻦ ﻛﺘﺎﺑﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﳌﺸﺘﺮﻛﺔ ﻣﺮﺓ
ﺃﺧﺮﻯ ﰲ ﺍﻟﻔﺌﺔ ﺍﳉﺪﻳﺪﺓ ﺗﺮﺙ ﺍﻟﻔﺌﺔ ﺍﳉﺪﻳﺪﺓ ﻭﺍﻟﱵ ﺗﺴﻤﻰ ﺑﺎﻟﻔﺌﺔ ﺍﳌﺸـﺘﻘﺔ derived class
ﻼ ﻭﺍﻟﱵ ﻳﺮﻣﺰ ﳍﺎ ﺑﺎﻟﻔﺌـﺔ ﺍﻟﻘﺎﻋـﺪﺓ base ﻛﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﻣﻦ ﺍﻟﻔﺌﺔ ﺍﳌﻌﺮﻓﺔ ﺃﺻ ﹰ
.class
ﻋﺎﺩﺓ ﺗﻀﻴﻒ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﺑﻴﺎﻧﺎﺕ ﻭﺃﻋﻀﺎﺀ ﺩﺍﻟﻴﺔ ﺧﺎﺻﺔ ﺎ ﻭﻋﻠﻴﻪ ﺗﻜﻮﻥ ﺍﻟﻔﺌﺔ ﺍﳌﺸـﺘﻘﺔ
ﺃﻛﱪ ﻣﻦ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ.
ﳒﺪ ﺃﻥ ﻛﻞ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻫﻮ ﺑﺎﻟﻀﺮﻭﺭﺓ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﻭﻟﻜﻦ ﺍﻟﻌﻜـﺲ
ﻼ ﻓﺌـﺔ
ﻏﲑ ﺻﺤﻴﺢ ﻓﻜﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﲢﻤﻞ ﺻﻔﺎﺕ ﺃﻛﺜﺮ ﻣﻦ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ،ﻓﻤﺜ ﹰ
ﺍﳌﺴﺘﻄﻴﻞ ﻫﻲ ﻓﺌﺔ ﻣﺸﺘﻘﺔ ﻣﻦ ﻓﺌﺔ ﺍﻷﺷﻜﺎﻝ ﺍﻟﺮﺑﺎﻋﻴﺔ ﻭﻋﻠﻴﻪ ﳝﻜﻦ ﺍﻟﻘﻮﻝ ﺃﻥ ﺃﻱ ﻣﺴـﺘﻄﻴﻞ ﻫـﻮ
ﺷﻜﻞ ﺭﺑﺎﻋﻲ ﻭﻻ ﳝﻜﻨﻨﺎ ﺍﻟﻘﻮﻝ ﺃﻥ ﺃﻱ ﺷﻜﻞ ﺭﺑﺎﻋﻲ ﻫﻮ ﻣﺴﺘﻄﻴﻞ.
ﺍﻟﺸﻜﻞ ) (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
: ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
1 2
3
175
ﺇﻻ ﺃﻧـﻪderived ﻫﻮ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔob ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ
ﻭﺫﻟـﻚbase ﰲ ﺍﻟﻔﺌﺔshow( ) ﻭset( ) ﺍﺳﺘﻄﺎﻉ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺍﻟﻌﺎﻣﺔ
.ﻷﻥ ﺍﻟﻮﺭﺍﺛﺔ ﻋﺎﻣﺔ
ﺗﺴﻤﻰ ﺍﻟﻮﺭﺍﺛﺔ ﺧﺎﺻﺔ ﻭﻋﻠﻴﻪ ﻛﻞ ﺍﻷﻋﻀـﺎﺀprivate ﺇﺫﺍ ﻛﺎﻥ ﳏﺪﺩ ﺍﻟﻮﺻﻮﻝ ﺧﺎﺹ
. ﺍﻟﻌﺎﻣﺔ ﻭﺍﶈﻤﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﺗﺼﺒﺢ ﺃﻋﻀﺎﺀ ﺧﺎﺻﺔ ﰲ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ
//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
//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
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
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
}
ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ:
187
ﺃﺩﺕ ﺇﱃ ﺗﻨﻔﻴﺬ ﺍﻟﺪﺍﻟﺔ
) (derived2:: vfunc
ﻣﻦ ﺍﻟﻨﻈﺮﺓ ﺍﻷﻭﱃ ﻗﺪ ﺗﺒﺪﻭ ﺍﻟﺪﻭﺍﻝ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﺷﺒﻴﻬﺔ ﺑﺘﺤﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋـﺪ .
ﻭﻟﻜﻦ ﻋﻨﺪ ﲢﻤﻴﻞ ﺍﻟﺪﺍﻻﺕ ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﳚﺐ ﺃﻥ ﳜﺘﻠﻒ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﻟﺪﺍﻟﺔ ﻣﻦ ﺩﺍﻟﺔ ﺇﱃ ﺃﺧﺮﻯ
ﰲ ﻧﻮﻉ ﺃﻭ ﻋﺪﺩ ﺍﻟﻮﺳﺎﺋﻂ ﺍﳌﻤﺮﺭﺓ ﺇﱃ ﺍﻟﺪﺍﻟﺔ ﺣﱴ ﻳﺴﺘﻄﻴﻊ ﺍﳌﺼﺮﻑ ﲢﺪﻳـﺪ ﺍﻟﺪﺍﻟـﺔ ﺍﳌﻄﻠـﻮﺏ
ﺗﻨﻔﻴﺬﻫﺎ ،ﺑﻴﻨﻤﺎ ﰲ ﺍﻟﺪﻭﺍﻝ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﳚﺐ ﺃﻥ ﻳﻄﺎﺑﻖ ﺇﻋﻼﻥ ﺍﻟﺪﺍﻟﺔ ﺍﻹﻓﺘﺮﺍﺿﻴﺔ ﺍﳌﻌﺮﻓﺔ ﰲ ﺍﻟﻔﺌـﺔ
ﺍﻟﻘﺎﻋﺪﺓ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ ﰲ ﺍﻟﻔﺌﺎﺕ ﺍﳌﺸﺘﻘﺔ.
ﺍﻟﻔﺌﺎﺕ ﺍﻟﺘﺠﺮﻳﺪﻳﺔ
9.8
Abstract Classes
ﺗﺸﻜﻞ ﺍﻟﻔﺌﺎﺕ ﺍﻟﺘﺠﺮﻳﺪﻳﺔ ﻣﻔﻬﻮﻣﹰﺎ ﻗﻮﻳﹰﺎ ﰲ . OOPﺍﻟﻔﺌﺔ ﺍﻟـﱵ ﻻ ﻳـﺘﻢ ﺇﻧﺸـﺎﺀ ﺃﻱ
ﻛﺎﺋﻨﺎﺕ ﻣﻨﻬﺎ ﺗﺴﻤﻰ ﻓﺌﺔ ﲡﺮﻳﺪﻳﺔ .ﺍﳍﺪﻑ ﺍﻟﻮﺣﻴﺪ ﳍﺬﻩ ﺍﻟﻔﺌﺔ ﻫﻮ ﺃﻥ ﺗﻠﻌﺐ ﺩﻭﺭ ﻓﺌﺔ ﻋﺎﻣﺔ ﻳـﺘﻢ
ﺍﺷﺘﻘﺎﻕ ﻓﺌﺎﺕ ﺃﺧﺮﻯ ﻣﻨﻬﺎ.
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
) /2ﺻﺤﻴﺢ /ﺧﻄﺄ( :ﻛﺎﺋﻦ ﺍﻟﻔﺌﺔ ﺍﳌﺸﺘﻘﺔ ﻫﻮ ﺃﻳﻀﹰﺎ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ﺍﻟﻘﺎﻋﺪﺓ ﳍﺎ.
/4ﻣﺎ ﻫﻲ ﺍﻟﺪﻭﺍﻝ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ؟ ﺻﻒ ﺍﻷﺣﻮﺍﻝ ﺍﻟﱵ ﺗﻜﻮﻥ ﻓﻴﻬﺎ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﻭﺍﻝ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﻣﻨﺎﺳﺒﺎﹰ؟
192
ﺍﻟﻮﺣﺪﺓ ﺍﻟﻌﺎﺷﺮﺓ
9.0
ﺍﻟﻘﻮﺍﻟﺐ ﻭﺍﻹﺳﺘﺜﻨﺎﺀﺍﺕ
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
196
ﻋﻨﺪﻣﺎ ﻳﺮﻯ ﺍﳌﺼﺮﻑ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ templateﻭﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺬﻱ ﻳﻠﻴﻬـﺎ ﻻ
ﻳﻘﻮﻡ ﺑﺘﻮﻟﻴﺪ ﺃﻱ ﺷﻔﺮﺓ ﻷﻧﻪ ﻻ ﻳﻌﺮﻑ ﺑﻌﺪ ﻣﺎ ﻫﻮ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺬﻱ ﺳﻴﺴﺘﻌﻤﻞ ﻣﻊ ﺍﻟﺪﺍﻟﺔ .ﻳﺘﻢ
ﺗﻮﻟﻴﺪ ﺍﻟﺸﻔﺮﺓ ﺑﻌﺪ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ ﰲ ﻋﺒﺎﺭﺓ ﻣﺎ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ،ﳛﺼﻞ ﻫـﺬﺍ ﺍﻷﻣـﺮ ﰲ ﺍﻟﱪﻧـﺎﻣﺞ
ﻼ.
ﺍﻟﺴﺎﺑﻖ ﰲ ﺍﻟﻌﺒﺎﺭﺓ ;) swapargs(i,jﻣﺜ ﹰ
ﻋﻨﺪﻣﺎ ﻳﺮﻯ ﺍﳌﺼﺮﻑ ﻣﺜﻞ ﻫﺬﺍ ﺍﻻﺳﺘﺪﻋﺎﺀ ،ﻓﺎﻧﻪ ﻳﻌﺮﻑ ﺃﻥ ﺍﻟﻨﻮﻉ ﺍﻟﺬﻱ ﺳﻴﺘﻢ ﺍﺳﺘﻌﻤﺎﻟﻪ
ﻫﻮ intﻛﻮﻧﻨﺎ ﻋﺮﻓﻨﺎ ﺍﳌﺘﻐﲑﺍﺕ iﻭ jﻋﻠﻰ ﺃﺎ ﻣﻦ ﺍﻟﻨﻮﻉ .intﻟﺬﺍ ﻳﻘﻮﻡ ﺑﺘﻮﻟﻴﺪ ﺇﺻﺪﺍﺭﹰﺍ ﻟﻠﺪﺍﻟـﺔ
) ( swapargsﺧﺎﺻﹰﺎ ﺑﺎﻟﻨﻮﻉ intﻣﺴﺘﺒﺪ ﹰﻻ ﺍﻻﺳﻢ xﰲ ﻛﻞ ﻇﻬﻮﺭ ﻟﻪ ﰲ ﺍﻟﻘﺎﻟﺐ ﺑـﺎﻟﻨﻮﻉ
intﻭﻳﺴﻤﻰ ﻫﺬﺍ ﺍﺳﺘﻨﺒﺎﻁ ) (instantiatingﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ .ﻛﻞ ﺇﺻـﺪﺍﺭ ﻣﺴـﺘﻨﺒﻂ
ﻟﻠﺪﺍﻟﺔ ﻳﺴﻤﻰ ﺩﺍﻟﺔ ﻗﻮﺍﻟﺒﻴﺔ.
ﺑﺸﻜﻞ ﳑﺎﺛﻞ ﻳﺆﺩﻯ ﺍﻻﺳﺘﺪﻋﺎﺀ ) swapargs( x,yﺇﱃ ﺟﻌﻞ ﺍﳌﺼﺮﻑ ﻳﻮﻟﺪ ﺇﺻﺪﺍﺭﹰﺍ
ﻟﻠﺪﺍﻟـﺔ ) ( swapargsﻳﻌﻤـﻞ ﻋﻠـﻰ ﺍﻟﻨـﻮﻉ doubleﺑﻴﻨﻤـﺎ ﻳـﺆﺩﻯ ﺍﻻﺳـﺘﺪﻋﺎﺀ
) swapargs(a,bﺇﱃ ﺗﻮﻟﻴﺪ ﺩﺍﻟﺔ ﺗﻌﻤﻞ ﻋﻠﻰ ﺍﻟﻨﻮﻉ .char
ﻳﻘﺮﺭ ﺍﳌﺼﺮﻑ ﻛﻴﻔﻴﺔ ﺗﺼﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﻋﻠﻰ ﺃﺳﺎﺱ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺴﺘﻌﻤﻞ ﰲ ﻭﺳﻴﻄﺎﺕ
ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺪﺍﻟﺔ .ﳑﺎ ﺳﺒﻖ ﻳﺘﻀﺢ ﻟﻨﺎ ﺃﻥ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻫﻮ ﻟﻴﺲ ﰲ ﺍﻟﻮﺍﻗﻊ ﺩﺍﻟـﺔ ،ﺇﻧـﻪ ﳐﻄـﻂ
ﻹﻧﺸﺎﺀ ﻋﺪﺓ ﺩﺍﻻﺕ ﻭﻳﺘﻼﺋﻢ ﻫﺬﺍ ﻣﻊ ﻓﻠﺴﻔﺔ OOPﻭﻫﻮ ﻣﺘﺸﺎﺑﻪ ﻟﻠﻔﺌﺔ ﻛﻮﺎ ﳕﻮﺫﺝ ﻹﻧﺸﺎﺀ ﻋﺪﺓ
ﻛﺎﺋﻨﺎﺕ ﻣﺘﺸﺎﺔ.
ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﺃﻛﺜﺮ ﻣﻦ ﻭﺳﻴﻄﺔ ﻗﺎﻟﺐ ﰲ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻭﺫﻟﻚ ﺑﺎﺳﺘﻌﻤﺎﻝ ﻓﺎﺻـﻠﺔ )(،
ﺗﻔﺼﻞ ﺑﲔ ﺍﻟﻮﺳﺎﺋﻂ .ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻗﺎﻟﺐ ﺩﺍﻻﺕ ﻟﻪ ﻭﺳﻴﻄﺘﲔ
//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
}
ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ:
ﻗﻮﺍﻟﺐ ﺍﻟﻔﺌﺎﺕ
9.4
Templates Classes
ﺍﻟﻔﺌﺔ stackﻭﺍﻟﱵ ﺳﺒﻖ ﺃﻥ ﺭﺃﻳﻨﺎﻫﺎ ﰲ ﺍﻷﻣﺜﻠﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻛﺎﻥ ﺑﺈﻣﻜﺎﺎ ﲣﺰﻳﻦ ﺑﻴﺎﻧـﺎﺕ
ﻣﻦ ﻧﻮﻉ ﺃﺳﺎﺳﻲ ﻭﺍﺣﺪ ﻓﻘﻂ ﻫﻮ ﺍﻟﻨﻮﻉ intﻭﻟﺬﻟﻚ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﲣﺰﻳﻦ ﺑﻴﺎﻧﺎﺕ ﻣﻦ ﺍﻟﻨﻮﻉ float
ﰲ ﻓﺌﺔ stackﺳﻨﺤﺘﺎﺝ ﺇﱃ ﺗﻌﺮﻳﻒ ﻓﺌﺔ ﺟﺪﻳﺪﺓ ﻛﻠﻴﹰﺎ ﻭﺑﺸﻜﻞ ﳑﺎﺛﻞ ﺳﻨﺤﺘﺎﺝ ﺇﱃ ﺇﻧﺸﺎﺀ ﻓﺌﺔ
ﺟﺪﻳﺪﺓ ﻟﻜﻞ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻧﺮﻳﺪ ﲣﺰﻳﻨﻪ ،ﻟﺬﺍ ﻋﻠﻴﻨﺎ ﻛﺘﺎﺑﺔ ﻣﻮﺍﺻﻔﺎﺕ ﻓﺌﺔ ﻭﺍﺣـﺪﺓ ﺗﻌﻤـﻞ ﻣـﻊ
ﻣﺘﻐﲑﺍﺕ ﻣﻦ ﻛﻞ ﺍﻷﻧﻮﺍﻉ ﻭﻟﻴﺲ ﻣﻊ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻭﺍﺣﺪ ،ﺑﺈﻣﻜﺎﻥ ﻗﻮﺍﻟﺐ ﺍﻟﻔﺌﺎﺕ ﲢﻘﻴﻖ ﺫﻟﻚ.
ﺍﳌﺜﺎﻝ ﻳﻘﻮﻡ ﺑﺘﻌﺮﻳﻒ ﺍﻟﻔﺌﺔ stackﺑﺎﺳﺘﻌﻤﺎﻝ ﻗﺎﻟﺐ ﺩﺍﻻﺕ:
//Program 9-3:
// This function demonstrates a generic stack.
>#include <iostream.h
>#include <conio.h
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
}
ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻋﺒﺎﺭﺗﲔ ﺗﺘﺴﺒﺒﺎﻥ ﰲ ﺭﻣﻲ ﺍﺳﺘﺜﻨﺎﺀ ﺇﺫﺍ ﺣﺬﻓﻨﺎ ﺭﻣﺰ ﺍﻟﺘﻌﻠﻴﻖ ﺍﻟﺬﻱ ﻳﺴﺒﻘﻬﻤﺎ ،ﺍﺧﺘﱪ ﺍﳊﺎﻟﺘﲔ .ﺳﺘﺮﻯ ﰲ ﻛﻼﳘﺎ ﺭﺳﺎﻟﺔ ﺍﳋﻄﺄ ﺍﻟﺘﺎﻟﻴﺔ-:
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;
}
ﻭﻟﻜـﻦ ﺇﺫﺍ ﰎ،ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻳﻄﻠﺐ ﺍﻟﱪﻧﺎﻣﺞ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝ ﺭﻗﻢ ﻣﻮﺟﺐ
ﻟﻮﺻﻒ ﻫـﺬﺍMy Exception ﺇﺩﺧﺎﻝ ﺭﻗﻢ ﺳﺎﻟﺐ ﻳﻘﻮﻡ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺈﻧﺸﺎﺀ ﻛﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ
.ﺍﳋﻄﺄ
207
ﺍﳌﻠﺨﺺ:
♦ ﻗﻮﺍﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻫﻮ ﻭﺳﻴﻠﺔ ﳉﻌﻞ ﺍﻟﺪﺍﻟﺔ ﺗﻌﻤﻞ ﻋﻠﻰ ﺃﻱ ﻧﻮﻉ ﻣﻦ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧـﺎﺕ
ﺍﳌﺨﺘﻠﻔﺔ.
♦ ﻳﺘﻢ ﺇﻧﺸﺎﺀ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ ﺍﻷﺳﺎﺳﻴﺔ .Template
ﻼ ﺑـﻞ
♦ ﰲ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻻ ﻳﺘﻢ ﲤﺜﻴﻞ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻣﻌﲔ ﰲ ﺍﻟﺪﺍﻟﺔ ﻛـ intﻣﺜ ﹰ
ﺑﺎﺳﻢ ﳝﻜﻦ ﺃﻥ ﻳﺸﲑ ﺇﱃ ﺃﻱ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻭﻳﺴﻤﻰ ﻫﺬﺍ ﺍﻻﺳﻢ ﻭﺳﻴﻄﺔ ﻗﺎﻟﺐ.
♦ ﳛﺪﺩ ﺍﳌﺼﺮﻑ ﻛﻴﻔﻴﺔ ﺗﺼﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ ﻋﻠﻰ ﺃﺳﺎﺱ ﻧﻮﻉ ﺍﻟﺒﻨﻴـﺎﺕ ﺍﳌﺴـﺘﻌﻤﻞ ﰲ
ﻭﺳﻴﻄﺎﺕ ﺍﺳﺘﺪﻋﺎﺋﻬﺎ.
ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ ﻫﻮ ﻟﻴﺲ ﰲ ﺍﻟﻮﺍﻗﻊ ﺩﺍﻟﺔ ،ﻫﻮ ﳐﻄﻂ ﻹﻧﺸﺎﺀ ﻋﺪﺓ ﺩﺍﻻﺕ. ♦
ﳝﻜﻦ ﺗﻌﺮﻳﻒ ﺃﻛﺜﺮ ﻣﻦ ﻭﺳﻴﻄﺔ ﻗﺎﻟﺐ ﰲ ﻗﺎﻟﺐ ﺍﻟﺪﺍﻻﺕ. ♦
ﻗﺎﻟﺐ ﺍﻟﻔﺌﺎﺕ ﻫﻮ ﻓﺌﺔ ﺗﻌﻤﻞ ﻋﻠﻰ ﻣﺘﻐﲑﺍﺕ ﰲ ﻛﻞ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ. ♦
ﺗﺘﺒﻊ ﺍﻻﺳﺘﺜﻨﺎﺀﺍﺕ ﺃﺳﻠﻮﺑﹰﺎ ﻛﺎﺋﲏ ﺍﳌﻨﺤﻰ ﳌﻌﺎﳉﺔ ﺃﺧﻄﺎﺀ ﺍﻟﺘﺸﻐﻴﻞ ﺍﻟﱵ ﺗﻮﻟﺪﻫﺎ ﺍﻟﻔﺌﺎﺕ ﰲ ♦
.C++
♦ ﻋﻨﺪ ﺣﺪﻭﺙ ﺧﻄﺄ ﰲ ﺇﺣﺪﻯ ﺍﻟﻔﺌﺎﺕ ﺗﻘﻮﻡ ﺍﻷﻋﻀﺎﺀ ﺍﻟﺪﺍﻟﻴﺔ ﺑﺈﺑﻼﻍ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻥ ﺧﻄﺄ ﻣﺎ
ﻗﺪ ﺣﺪﺙ ﻭﻳﺴﻤﻰ ﻫﺬﺍ ﺍﻷﻣﺮ ﺭﻣﻰ ﺍﺳﺘﺜﻨﺎﺀ.
♦ ﳛﺘﻮﻯ ﺑﺮﻧﺎﻣﺞ C++ﻋﻠﻰ ﺟﺰﺀ ﻣﻨﻔﺼﻞ ﳌﻌﺎﳉﺔ ﺍﻷﺧﻄﺎﺀ ﻳﺴﻤﻰ ﻣﻌﺎﰿ ﺍﻻﺳﺘﺜﻨﺎﺀ ﺃﻭ ﻛﺘﻠﺔ
ﺍﻻﻟﺘﻘﺎﻁ.
♦ ﺃﻱ ﻋﺒﺎﺭﺍﺕ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺗﺴﺘﻌﻤﻞ ﻛﺎﺋﻨﺎﺕ ﺍﻟﻔﺌﺔ ﺗﻜﻮﻥ ﻣﻮﺟﻮﺩﺓ ﺩﺍﺧﻞ ﻛﺘﻠﺔ ﺗﺴﻤﻰ ﻛﺘﻠﺔ
ﺍﶈﺎﻭﻟﺔ.
♦ ﻳﺴﺘﻌﻤﻞ ﺍﻻﺳﺘﺜﻨﺎﺀ ﺛﻼﺙ ﻛﻠﻤﺎﺕ ﺃﺳﺎﺳﻴﺔ ﻫﻲ.try, catch, throw :
♦ ﺍﳋﻄﻮﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ ﺗﻠﺨﺺ ﻋﻤﻠﻴﺔ ﺍﻻﺳﺘﺜﻨﺎﺀ-:
ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺸﻜﻞ ﻃﺒﻴﻌﻲ ﺧﺎﺭﺝ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ.
ﻳﻨﺘﻘﻞ ﺍﻟﺘﺤﻜﻢ ﺇﱃ ﻛﺘﻠﺔ ﺍﳌﻌﺎﳉﺔ.
ﻗﺪ ﺗﺆﺩﻯ ﻋﺒﺎﺭﺓ ﻣﺎ ﰲ ﻛﺘﻠﺔ ﺍﶈﺎﻭﻟﺔ ؟؟؟ ﺧﻄﺄ ﰲ ﻋﻀﻮ ﺩﺍﱄ.
208
ﺍﻷﺳﺌﻠﺔ
/1ﺃﻛﺘﺐ ﺩﺍﻟﺔ ﻗﺎﻟﺐ ﺗﺪﻋﻰ IsEqualToﻭﺍﻟﱵ ﺗﻘﺎﺭﻥ ﺑﲔ ﻭﺳﻴﻄﲔ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻌﺎﻣﻞ
== ﻭﺗﺮﺟﻊ 1ﺇﺫﺍ ﻛﺎﻧﺘﺎ ﻣﺘﻄﺎﺑﻘﺘﲔ ﻭ 0ﺇﺫﺍ ﻛﺎﻧﺘﺎ ﻏﲑ ﺫﻟﻚ.
ﰒ ﺃﻛﺘﺐ ﺑﺮﻧﺎﳎﹰﺎ ﻻﺧﺘﺒﺎﺭ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻣﻊ ﺃﻧﻮﺍﻉ ﺑﻴﺎﻧﺎﺕ C++ﺍﻷﺳﺎﺳﻴﺔ.
ﻗﻢ ﺑﺘﺤﻤﻴﻞ ﺍﻟﻌﺎﻣﻞ == ﺑﺸﻜﻞ ﺯﺍﺋﺪ ﻭﺍﺧﺘﱪﻫﺎ ﻣﻊ ﻛﺎﺋﻨﺎﺕ.
/4ﻋﺮﻑ ﺍﻹﺳﺘﺜﻨﺎﺀ.
209
ﺍﻟﻮﺣﺪﺓ ﺍﳊﺎﺩﻳﺔ ﻋﺸﺮﺓ
11.0
ﺩﺧﻞ/ﺧﺮﺝ C++ ﺩﻓﻖ
210
ﻣﻘﺪﻣﺔ 11.1
ﺍﻟﺪﻓﻖ ﻫﻮ ﺍﺳﻢ ﻋﺎﻡ ﻳﻄﻠﻖ ﻟﺴﻴﻞ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺣﺎﻟﺔ ﺩﺧﻞ/ﺧﺮﺝ .ﻳﺘﻢ ﲤﺜﻴـﻞ ﺩﻓـﻖ
ﻼ ﺭﺃﻳﻨﺎ ﰲ ﲨﻴﻊ ﺍﻷﻣﺜﻠﺔ ﺍﻟﺴﺎﺑﻘﺔ ﻛﺎﺋﻨﺎﺕ ﺍﻟـﺪﻓﻖ
)ﺍﻟﺪﺧﻞ /ﺍﳋﺮﺝ( ﺑﻜﺎﺋﻦ ﺗﺎﺑﻊ ﻟﻔﺌﺔ ﻣﻌﻴﻨﺔ ،ﻓﻤﺜ ﹰ
cout ،cinﻭﺍﻟﱵ ﺍﺳﺘﻌﻤﻠﻨﺎﻫﺎ ﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺪﺧﻞ ﻭﺍﳋﺮﺝ.
ios
istream ostream
iostream
211
ﺃﻋﻼﻡ ﺍﻟﺘﻨﺴﻴﻖ
11.3
Format state flags
//Program 11-1:
>#include <iostream.h
) (int main
{
;)cout.setf(ios:: showpoint
;)cout.setf(ios:: showpos
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
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
ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ:
//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;
}
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
Ahmed(111)555 –1010
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;
}
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
223
}
ﻭﺍﻟﺜﺎﱐ ﻳﻘﻮﻡ ﺑﺈﺧﺮﺍﺝ ﺻﻮﺕgetpass( ) ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﻳﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻣﻨﺎﻭﺭ ﺩﺧﻞ
. password \‘ ﻭﻳﻄﻠﺐ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻡ ﺇﺩﺧﺎﻝa’ ﺟﺮﺱ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺗﺘﺎﺑﻊ ﺍﳍﺮﻭﺏ
//Program 11-7:
#include <iostream>
#include <cstring>
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
224
ﺍﳌﻠﺨﺺ:
225
ﺍﻷﺳﺌﻠﺔ
ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﻨﻔﺬ ﺍﻵﰐ: -1
ﻃﺒﺎﻋﺔ ﺍﻟﻌﺪﺩ ﺍﻟﺼﺤﻴﺢ 40000ﻣﻊ ﳏﺎﺫﺍﺗﻪ ﻋﻠﻰ ﺍﻟﻴﺴﺎﺭ ﻋﻠﻰ ﺃﻥ ﻳﻜﻮﻥ ﻋﺮﺽ ﺍﳊﻘـﻞ
.15
ﻗﺮﺍﺀﺓ ﺳﻠﺴﻠﺔ ﻭﲣﺰﻳﻨﻬﺎ ﰲ ﻣﺼﻔﻮﻓﺔ ﺃﺣﺮﻑ .state
ﻃﺒﺎﻋﺔ 200ﺑﻌﻼﻣﺔ ﻭﺑﺪﻭﻥ ﻋﻼﻣﺔ.
/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ﻹﺩﺧﺎﻝ ﻭﺇﺧﺮﺍﺝ ﺑﻴﺎﻧﺎﺕ ﻣﻦ ﺍﳌﻠﻔﺎﺕ(.
ﻟﻔﺘﺢ ﻣﻠﻒ ،ﳓﺘﺎﺝ ﻹﻧﺸﺎﺀ ﻛﺎﺋﻦ ﻳﺘﺒﻊ ﻹﺣﺪﻯ ﻫﺬﻩ ﺍﻟﻔﺌﺎﺕ.
//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
}
ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ:
ﻼ
ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺴﺎﺑﻖ ﻳﻨﺸﺊ ﻣﻠﻔﹰﺎ ﺗﺘﺎﺑﻌﻴﺎﹰ ،ﺣﻴﺚ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻪ ﰲ ﻧﻈﺎﻡ ﺣﺴﺎﺑﺎﺕ ﻣﺜ ﹰ
ﻟﻴﺴﺎﻋﺪ ﰲ ﺇﺩﺍﺭﺓ ﺣﺴﺎﺑﺎﺕ ﺍﻟﻌﻤﻼﺀ.
ﻟﻜﻞ ﻋﻤﻴﻞ ﻣﻦ ﺍﻟﻌﻤﻼﺀ ،ﻳﺘﺤﺼﻞ ﺍﻟﱪﻧﺎﻣﺞ ﻋﻠﻰ ﺭﻗﻢ ﺣﺴـﺎﺏ ﺍﻟﻌﻤﻴـﻞ account
ﻭﺇﺳﻢ ﺍﻟﻌﻤﻴﻞ nameﻭﺭﺻﻴﺪ ﺍﻟﻌﻤﻴﻞ .balanceﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﻳﺘﺤﺼﻞ ﻋﻠﻴﻬﺎ ﺍﻟﱪﻧﺎﻣﺞ ﻟﻜﻞ
ﻋﻤﻴﻞ ﲤﺜﻞ ﺳﺠﻞ ﺫﻟﻚ ﺍﻟﻌﻤﻴﻞ.
230
ﻳﺴﺘﺨﺪﻡ ﺭﻗﻢ ﺣﺴﺎﺏ ﺍﻟﻌﻤﻴﻞ ﻛﺤﻘﻞ ﻣﻔﺘﺎﺣﻲ ،ﻭﻋﻠﻴﻪ ﻳﻜﻮﻥ ﺍﳌﻠﻒ ﻣﺮﺗﺒﹰﺎ ﺑﺘﺮﺗﻴﺐ ﺃﺭﻗﺎﻡ
ﺣﺴﺎﺑﺎﺕ ﺍﻟﻌﻤﻼﺀ.
ﰎ ﻓﺘﺢ ﺍﳌﻠﻒ ﻟﻠﻜﺘﺎﺑﺔ ﻓﻴﻪ ،ﻟﺬﻟﻚ ﻳﻨﺸﺊ ﺍﻟﱪﻧﺎﻣﺞ ﻛﺎﺋﻦ ﺧﺮﺝ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ ofstream
ﻳﺪﻋﻰ ،outclientfileﻭﰎ ﲤﺮﻳﺮ ﻭﺳﻴﻄﺘﲔ ﳌﺸﻴﺪ ﺫﻟﻚ ﺍﻟﻜـﺎﺋﻦ ﻭﳘـﺎ ﺇﺳـﻢ ﺍﳌﻠـﻒ
،Clients.datﻃﺮﻳﻘﺔ ﻓﺘﺢ ﺍﳌﻠﻒ )ios::out (File open mode
ﻳﻘﻮﻡ ﺍﻟﱪﻧﺎﻣﺞ ،ﺑﺎﺳﺘﻘﺒﺎﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺪﺧﻠﺔ ﻭﺣﻔﻈﻬﺎ ﰲ ﺍﳌﻠﻒ ،ﺇﱃ ﺃﻥ ﻳﺘﻢ ﺇﺩﺧﺎﻝ ﺭﻣـﺰ
ﺎﻳﺔ ﺍﳌﻠﻒ ).(<ctrl> Z
ﺧﺮﺝ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻔﺘﺮﺽ ﺃﻧﻪ ﰎ ﺇﺩﺧﺎﻝ ﺑﻴﺎﻧﺎﺕ ﲬﺴﺔ ﻋﻤﻼﺀ ،ﰒ ﰎ ﺇﺩﺧﺎﻝ ﺭﻣـﺰ ﺎﻳـﺔ
ﺍﳌﻠﻒ .^Z
ﻧﻼﺣﻆ ﺃﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺘﻀﻤﲔ ﻣﻠﻒ ﺍﻟﺘﺮﻭﻳﺴﺔ stdlib.hﺍﻟﺬﻱ ﳛﺘﻮﻱ ﻋﻠﻰ ﺗﻌﺮﻳﻒ ﺍﻟﺪﺍﻟﺔ
،exitﻭﺍﻟﱵ ﺗﻨﻬﻲ ﺍﻟﱪﻧﺎﻣﺞ ﰲ ﺣﺎﻟﺔ ﻋﺪﻡ ﻓﺘﺢ ﺍﳌﻠﻒ ﺑﺼﻮﺭﺓ ﺻﺤﻴﺤﺔ.
ﺳﻨﻘﻮﻡ ﺍﻵﻥ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﺑﻘﺮﺍﺀﺓ ﺍﳌﻠﻒ ﺍﻟﺴﺎﺑﻖ ،ﻭﻃﺒﺎﻋﺔ ﳏﺘﻮﻳﺎﺗﻪ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ:
Program 12-2:
//Reading and printing a Sequential file
>#include<iostream.h
>#include<fstream.h
>#include<iomanip.h
>#include<stdlib.h
{ )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;
:ﺍﳋﺮﺝ ﻣﻦ ﺍﻟﱪﻧﺎﻣﺞ
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
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;
}
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
?3
Accounts with debit balances:
100 Ahmed 24.98
200 Ali 345.67
500 Abbas 224.62
?4
236
End of run.
237
ﺍﳌﻠﺨﺺ:
238
ﺍﻷﺳﺌﻠﺔ
ﺃﻧﺸﺊ ﻣﻠﻒ ﻟﻠﻤﻮﻇﻔﲔ ﻳﺪﻋﻰ Employeeﻋﻠﻰ ﺃﻥ ﳛﺘﻮﻱ ﻛﻞ ﺳﺠﻞ ﰲ ﺍﳌﻠﻒ -1
ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻟﺘﺎﻟﻴﺔ-:
♦ ﺭﻗﻢ ﺍﳌﻮﻇﻒ.
♦ ﺇﺳﻢ ﺍﳌﻮﻇﻒ.
♦ ﺍﻟﻌﻨﻮﺍﻥ.
ﰒ ﻗﻢ ﺑﺈﺩﺧﺎﻝ ﺑﻴﺎﻧﺎﺕ ﲬﺴﺔ ﻣﻮﻇﻔﲔ.
ﺗﺄﻛﺪ ﻣﻦ ﺇﺩﺧﺎﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺍﻟﺴﺆﺍﻝ ﺍﻟﺴﺎﺑﻖ ﺑﺼﻮﺭﺓ ﺻﺤﻴﺤﺔ ﻭﺫﻟﻚ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ -2
ﻟﻘﺮﺍﺀﺓ ﳏﺘﻮﻳﺎﺕ ﺍﳌﻠﻒ.
ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﺑﺎﺳﺘﻘﺒﺎﻝ ﻣﻌﻠﻮﻣﺎﺕ ﻋﻦ ﻃﻼﺏ ﻛﻠﻴﺔ ﻭﻳﻀﻌﻬﺎ ﰲ ﻣﻠﻒ -3
ﻳﺴﻤﻰ ،Studentsﲝﻴﺚ ﳛﺘﻮﻱ ﻣﻠﻒ ﺍﻟﻄﻼﺏ ﻋﻠﻰ ﺍﻵﰐ:
♦ ﺭﻗﻢ ﺍﻟﻄﺎﻟﺐ.
♦ ﺇﺳﻢ ﺍﻟﻄﺎﻟﺐ.
♦ ﲣﺼﺺ ﺍﻟﻄﺎﻟﺐ.
♦ ﺩﺭﺟﺔ ﺍﻟﻄﺎﻟﺐ.
♦ ﻭﻣﻦ ﰒ ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻳﻘﻮﻡ ﺑﻘﺮﺍﺀﺓ ﻫﺬﺍ ﺍﳌﻠﻒ.
239
ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢﺑﺴﻢ ﺍ
C++
#include <iostream.h>
#include <conio.h>
void main ()
{
cout << "Hello";
getch ();
}
#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 ();
}
>#include <iostream.h
>#include <conio.h
;)( getch
}
3ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ:
>#include <iostream.h
>#include <conio.h
;)( getch
}
3ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ:
#include <iostream.h>
#include <conio.h>
void main ()
{
int x, y;
cout << "x= ";
cin >> x;
cout << "y= ";
cin >> y;
if (y != 0)
cout << "x/y= " << (float)x/y << endl;
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ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;
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ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
#include <iostream.h>
#include <conio.h>
void main ( )
{
for (int i = 0; i < 15; i++)
cout << i * i << " ";
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3
#include <iostream.h>
#include <conio.h>
void main ( )
{
float R, Area;
float p1 = 3.14159 ;
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ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
#include <iostream.h>
#include <conio.h>
void main ()
{
int x = 10;
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3
#include <iostream.h>
#include <math.h>
#include <conio.h>
void main ()
{
int x, y, P ;
P = pow (x,y) ;
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ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
#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
#include <iostream.h>
#include <conio.h>
void main ()
{
char L;
int M;
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3
#include <iostream.h>
#include <conio.h>
void main ()
{
char L;
int M;
getch();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3
>#include <iostream.h
>#include <conio.h
) (void main
{
;]int b[3][3
;int i,j
;)( 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;
m = t[0][0];
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ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
#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
>#include <iostream.h
>#include <conio.h
" = cout << " SUM << sum << endl ;
;)( getch
}
3ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ:
>#include <iostream.h
>#include <conio.h
) while ( n != 0
{
;" cout << "Enter a number:
;cin >> n
cout << "n= " << n << endl ;
}
;)( getch
}
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 ;
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ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;
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3
>#include <iostream.h
>#include <conio.h
;goto L
;)( getch
}
3ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ:
>#include <iostream.h
>#include <conio.h
;)( getch
}
;return i
}
3ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ:
#include <iostream.h>
#include <conio.h>
void main ()
{
int y;
cout << "Enter number: ";
cin >> y;
cout << "fact= " << fact(y);
getch();
}
else
y=1;
return y;
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ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
#include <iostream.h>
#include <conio.h>
void main ()
{
int i,b;
cout << "Enter number: ";
cin >> b;
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3
#include <iostream.h>
#include <conio.h>
void main ()
{
int a,b;
if (a>b)
cout << "pass";
else
cout << "not pass";
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ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
إﻋداد
أ .ﻋﻳﺳﻰ أﺳﻌد د .ﻳوﺳف اﺑو زر
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++
أﻫداف اﻟﺗدرﻳﺑﺎت
ﻳﻧﺗظر ﻣﻧك ،ﻋزﻳزي اﻟطﺎﻟب ،ﺑﻌد ﻓراﻏك ﻣن ﺗﻧﻔﻳذ ﻫذﻩ اﻟﺗدرﻳﺑﺎت أن ﺗﻛون ﻗﺎد ار ﻋﻠﻰ أن:
.1ﺗﻌرﻳف واﺳﺗﺧدام اﻟﺗراﻛﻳب .structures
.2اﺳﺗﺧدام ﻣﺻﻔوﻓﺎت ﻣن اﻟﺗراﻛﻳب .arrays of structures
.3ﺗﻌرﻳف واﺳﺗﺧدام اﻷﺻﻧﺎف .classes
.4اﻟﺗﻣﻳﻳز ﺑﻳن اﻟﺗراﻛﻳب واﻷﺻﻧﺎف.
.5إﻧﺷﺎء اﻟﻛﺎﺋﻧﺎت واﺳﺗﺧداﻣﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ.
.6ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﻣﻧﺗﻣﻳﺔ واﺳﺗدﻋﺎﺋﻬﺎ ﺑطرﻳﻘﺔ ﺻﺣﻳﺣﺔ.
.7ﻛﺗﺎﺑﺔ اﻟدواﻝ اﻟﺳطرﻳﺔ .
.8ﺗﺣﻣﻳﻝ اﻟدواﻝ أﻛﺛر ﻣن ﺗﻌرﻳف واﺣد.
.9إدﺧﺎﻝ اﻟﺑﻳﺎﻧﺎت ٕواﺧراﺟﻬﺎ ﺑوﺳﺎطﺔ cinو .cout
ﻣﺳﺎﻋدة اﻟﺣﻝ:
-1ﺗﻌرﻳف اﻟﻣﺻﻔوﻓﺔ
>#include <iostream
{ class CRectangle
;int x, y
public:
;)void set_values (int,int
};)int area () {return (x*y
;}
{ )( 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);}
};
int main () {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
{ class CRectangle
;int width, height
public:
;)( CRectangle
;)CRectangle (int,int
};)int area (void) {return (width*height
;}
{ )( CRectangle::CRectangle
;width = 5
;height = 5
}
{ )( 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
};
float dist(Point p) {
// Compute the distance from the origin
return sqrt(p.x*p.x + p.y*p.y);
}
(2) ﺳؤاﻝ
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();
}
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) اﻟﺗدرﻳب
.اﻋد ﻛﺗﺎﺑﺔ ﻣﺛﺎﻝ اﻟﻣﺳﺗطﻳﻝ ﻣن ﺧﻼﻝ ﻓﻛرة ﻣؤﺷر اﻟﻰ اﻟﺻﻧف وﻣؤﺷر اﻟﻰ ﻣﺻﻔوﻓﺔ ﻣن اﻟﻛﺎﺋﻧﺎت
:اﻟﺣﻝ
class CRectangle {
int width, height;
public:
void set_values (int, int);
int area (void) {return (width * height);}
};
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;
}
اﻟﺗدرﻳب )(3
ادرس اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ واﻟذي ﻳوﺿﺢ ﻣﺛﺎﻝ اﻟﻧﻘطﺔ ﺑﺣﻳث ﻳﻘدم ﻓﻛرة اﺳﺗﺧدام ﺧوارزﻣﻳﺎت اﻟﻔرز bubbleSortﻟﺗرﺗﻳب اﻟﻧﻘط
ﺗﺻﺎﻋدﻳﺎ ﺣﺳب اﻟﻣﺳﺎﻓﺔ ﻣن ﻧﻘطﺔ اﻷﺳﺎس .اﻛﺗب اﻟداﻟﺔ اﻟرﺋﻳﺳﻳﺔ ﻟﻠﺑرﻧﺎﻣﺞ
>include <iostream
{ struct Point
float x; // x coordinate
float y; // y coordinate
char name[20]; // name of the point
;}
#include <iostream.h>
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();
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;
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
اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻟﺗﻣرﻳر اﻟﻌواﻣﻝ ،اﻛﺗب اﻟﺑراﻣﺞ اﻟﺗﺎﻟﻳﺔ وﻧﻔذﻫﺎ ﻋﻠﻰ اﻟﺣﺎﺳوب ،وﻋﻠﻝ ﻧﺗﺎﺋﺞ اﻟﺗﻧﻔﻳذ.
Y=X;
}
B="<<B<<endl;
}
(2) ﺗدرﻳب
Friend Functions الدوال الصديقة
لھذه الدالة داخل تعريف الصنفprototype تعرف الدالة على أنھا دالة صديقة لصنف ما بوضع نموذج
مما يعني أن الدالة الصديقة لھا الحق في معالجة األجزاء الخاصة للصنف كما لو. friend مسبوقا بالكلمة
. وتختلف طريقة استدعاء الدالة الصديقة عن طريقة استدعاء الدالة المنتمية.كانت دالة منتمية للصنف
إليجاد مربع المسافةDistance حيث يقوم البرنامج بتعريف صنف اسمه مسافة،ادرس البرنامج التالي جيدا
: ثم اجب عن األسئلة التالية،المعطاة بالقدم والبوصة بالقياس قدم مربع
;)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;
ﺗدرﻳب )(6
في ك ّل مرة يتم فيھا استدعاء الدوال المنتمية ،فانه يمرر بصورة اتوماتيكية مؤشر يدعى ، thisإلى
الكينونة التي تم استدعائھا .ھذا المؤشر يدعى thisويعتبر معامل ضمني لجميع الدوال المنتمية .لذا ،في
داخل اي دوال منتمية ،المؤشر thisقد يستعمل لإلشارة إلى الكينونة المستدعاة.
نفذ البرنامج التالي وبين النتيجة التي حصلت عليھا ،ونقاش النتيجة التي حصلت عليھا
// this
>#include <iostream
{ class CDummy
public:
;)int isitme (CDummy& param
;}
{ )( 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اﻟﻣﻬﻣﺔ.
>#include <iostream
>#include <conio.h
// Derived class
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// 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();
getch();
}
ﺗﻣرﻳن) :(1اﻛﺗب اﻟﻧص اﻟﺑرﻣﺟﻲ اﻟذي ﻳﺣﻘق اﻟوراﺛﺔ اﻟﻣﻧﻔردة اﻟﻣوﺿﺣﺔ ﻓﻲ اﻟﺷﻛﻝ اﻟﺗﺎﻟﻲ ﻋﻠﻣﺎ ﺑﺎن اﻟﺻﻧﻔﺎن
اﻟﻣﺷﺗﻘﺎن ﻳﺣﺗوﻳﺎن دواﻝ ﺣﺳﺎب اﻟﻣﺳﺎﺣﺔ.
CPolygon
width : Integer
height : Integer
)(set_values
CRectangle CTriangle
{ class COutput
public:
void output (int i);
};
وﻳﻌطﻲPolymorphism أﻋﻣﻝ اﻟﺗﻌدﻳﻝ اﻟﻼزم ﻋﻠﻰ اﻟﻣﺛﺎﻝ اﻟﺳﺎﺑق ﻟﻳﺣﻘق ﻣﻔﻬوم ﺗﻌدد اﻻوﺟﻪ:(3) ﺗﻣرﻳن
:اﻟﻧﺗﻳﺟﺔ اﻟﺗﺎﻟﻳﺔ
Rectangle class area
Triangle class area
:اﻟﻘواﻟب
. واﻟﺗﻲ ﺗﻌﻣﻝ ﻋﻠﻰ ﺗﺑدﻳﻝ ﻣﺗﻐﻳران ﻣن ﻧوع ﻛﺎﺋن ﻣن ﻧﻔس اﻟﺻﻧفSwap اﻟﻣﺛﺎﻝ اﻟﺗﺎﻟﻲ ﻳﻌرف ﻗﺎﻟﺑﺎ ﻟﻠداﻟﺔ
ﺗﻣرﻳن) :(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;}
};
// 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;
}
};
// 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();
}
// 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();
}
// 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++
ﺗﺗﻧــﺎوﻝ ﻫــذﻩ اﻟوﺣــدة ﺗﻌرﻳف ﻣﻔﻬوم ﻫﻳﻛــﻝ اﻟﺑﻳــﺎﻧــﺎت وﻣوﻗﻊ اﻟﻣﻠﻔــﺎت ﺑﻳﻧﻬــﺎ ٕواﻋطــﺎء ﻟﻣﺣــﺔ ﻣﺧﺗﺻ ـ ـ ـ ـ ـ ــرة ﻋن
اﻷﻧواع اﻟﻣﺧﺗﻠﻔﺔ ﻣن اﻟﺑﻳﺎﻧﺎت .وﻳﺗﻠو ذﻟك ﻣﻧﺎﻗﺷﺔ اﻟطرق اﻟﻣﺧﺗﻠﻔﺔ ﻓﻲ ﺗﻧظﻳم اﻟﻣﻠﻔﺎت وﺗﻌرﻳف اﻟﻣﻠﻔﺎت واﻟﻳﻧﺎﺑﻳﻊ،
وﻣن ﺛم ﺗوﺿــﻳﺢ ﻛﻳﻔﻳﺔ إﻧﺷــﺎء اﻟﻣﻠﻔﺎت اﻟﺗﺗﺎﺑﻌﻳﺔ واﻟﻌﺷ ـواﺋﻳﺔ وﻗراءﺗﻬﺎ وﺗﺣدﻳﺛﻬﺎ ،وأﺧﻳ اًر ﺗم ﺗوﺿ ــﻳﺢ ﻛﻳﻔﻳﺔ اﻟﺗﻌﺎﻣﻝ
ﻣﻊ اﻟﻛﺎﺋﻧﺎت ﻣن ﺣﻳث اﻹدﺧﺎﻝ واﻹﺧراج ﻓﻲ اﻟﻣﻠﻔﺎت.
أﻫداف اﻟوﺣدة
ﻳﻧﺗظر ﻣﻧك ،ﻋزﻳزي اﻟدارس ،ﺑﻌد ﻓراﻏك ﻣن دراﺳﺔ ﻫذﻩ اﻟوﺣدة ،أن ﺗﻛون ﻗﺎد اًر ﻋﻠﻰ أن:
#include <fstream>
#include <iostream>
#include <conio.h>
int main ()
{
char data[100];
// open a file in write mode.
ofstream outfile;
outfile.open("afile.dat");
// again read the data from the file and display it.
;infile >> data
;cout << data << endl
;)(getch
}
ﺗﻣرﻳن ) :(1اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻟﻛﺗﺎﺑﺔ ﻧﺻﺎ ﻓﻲ ﺳطرﻳن داﺧﻝ ﻣﻠف .example.txtﻣوﺿﺣﺎ ﻛﻳﻔﻳﺔ ﻓﺗﺢ اﻟﻣﻠف
ﻟﻠﻛﺗﺎﺑﺔ دون ﻣﺳﺢ ﻣﺣﺗوﻳﺎت اﻟﻣﻠف إن ﻛﺎن ﻣوﺟودا ﻣن ﻗﺑﻝ.
ﺗﻣرﻳن ) :(2اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ﻳﻘوم ﺑﻘراءة ﻣﺣﺗوﻳﺎت اﻟﻣﻠف اﻟﻣذﻛور ﻓﻲ اﻟﺗﻣرﻳن اﻟﺳﺎﺑق وطﺑﺎﻋﺔ ﻣﺣﺗوﻳﺎﺗﻪ ﻋﻠﻰ
اﻟﺷﺎﺷﺔٕ .وان ﻛﺎن اﻟﻣﻠف ﻏﻳر ﻣوﺟود ﻓﺈﻧﻪ ﻳطﺑﻊ رﺳﺎﻟﺔ ﺗﺑﻳن ذﻟك.
ﺗﻣرﻳن ) :(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;
}
int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}
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;
}
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;
}
عزيزي الطالب ،توجد الكثير من بيئات التطوير) (IDEsالمعتمدة ومنھا برنامج Code::Blocksو برنامج
Visual C++ Expressويعتبران من البرامج المجانية ،كما يوجد برامج أخرى مثل Borland C++
وبرنامج Visual C++وأخرى عديدة غير مجانية.
في ھذه الوحدة – عزيزي الطالب – سنتطرق إلى شرح كيفية إعداد واستخدام بيئات التطوير التالية:
) Code::Blocks -مجاني ومفتوح المصدر(
Visual C++ -من شركة ميكروسوفت وھو غير مجاني ،ولكن الشركة أصدرت نسخة مجانية منه اسمھا
.Visual C++ Express
في ھذا القسم –عزيزي الطالب -إن شاء ﷲ سنتطرق لشرح مصور لبرنامج . Code::Blocks
البعض يعتبره البرنامج االكثر سھولة في االستخدام والسالسة ،كما أنه يعمل جيدا على وندوز 7على عكس
بعض من البرامج األخرى.
برنامج الـ :Code::Blocksھو IDEمالئم جدا ،مجاني و يعمل على الـ ،Windowsو الـ،Mac OS
والـ .Linuxلغته المتوفرة حاليا ھي االنجليزية.
-1شريط األدوات
-2قائمة ملفات المشروع :توجد بيسار النافذة ،تحتوى على كل ملفات السورس المتعلقة بالبرنامج الذي
تعمل عليه .و بما أنھا فارغة حسب ما يظھر في الصورة ھذا دليل على عدم وجود مصادر سورس
في الالئحة حتى ھذه اللحظة.
-3المنطقة الرئيسية :ھنا المساحة التي تكتب فيھا الكودسورس للغتك الـ .C++
-4منطقة البيان :و يسميھا المبرمجون منطقة الموت ،و ھي المنطقة التي تعرض لك األخطاء التي
وقعت فيھا أثناء كتابتك للكود سورس ،طبعا متسلسلة بانتظام.
ما يھمنا اآلن ھو منطقة معينة خاصة من شريط األدوات
1-Compile :
كل الكود سورس الخاصة ببرنامجكم ستبعث لمصنف يقوم بالترجمة ثم يستخرج لنا الـ Code::Blocksملفا
قابل للتنفيذ أو باألحرى ملف تنفيذي .لكن إن اقترفت خطأ في الكتابة لن يترجم لك المصنف شيئا و ستظھر
األخطاء في منطقة البيان.
تقوم بتشغيل آخر ملف تنفيذي قمت بكتابة الكود السورس الخاص به .و ھذا عندما تريد تجريب البرنامج قبل
االنتھاء منه .وستعرف بنفسك أنه قبل التشغيل Executeيجب الترجمة Compileولكى نجرب ما توصلنا
إليه نضغط على األيقونة .3
عندما نقوم بالـ"ترجمة" فإن Code::Blocksلن يقوم بتشغيل سوى الملفات التي ّعدلت عليھا أو أضفتھا.
أحيانا فقط ،تضطر بأن تأمر الـ Code::Blocksبترجمة و تشغيل كل شيء .Recompile everything
كي تبدأ مشروعا جديدا ،توجه نحو ، : File / New / Projectستظھر لك نافذة اختر منھا "Console
"application
كما تالحظ-عزيزي الطالب ،برنامج الـ Code::Blocksيسمح بالعمل على أنماط كثيرة من البرامج
المختلفة ،منھا التي تعمل بمكتبات مشھورة كالـ SDLللـ 2Dو ألـ OpenGLللـ 3Dو الـ Qt
و wxWidgetsللـ نوافذ ..إلخ ،ھذه المكتبات غير مثبتة على جھازكم بعد ،و بھذا ال يمكنكم جعلھا تعمل.
بعدھا سيأتيك اختيار بين لغتي الـ Cأو الـ ،C++اختر الـ .C++
سيطلب منك اآلن أن تدخل اسم المشروع ،و كذا المسار الذي تختاره كي يحفظ فيه.
آخر خطوة تطلب منك ھي ،كيف ينبغى أن يترجم البرنامج ،يمكنك ترك االختيارات على حالھا ،لن يكون
لھذا أي تأثير على ما سنقوم به اآلن ،قم بتحديد زر"Release" .
في الخانة الخاصة بالمشاريع على اليسار ،إضغط على ' '+لتوسيعھا قليال ،و تظھر قائمة الملفات في
المشروع.
اآلن تم فتح مشروع خاص بك وما عليك اال بكتابة الكود والباقي على البرنامج،
سيقوم بفتح ملف تنفيذي يفتح بواسطة ال: MsDos
تشغيل مثال بسيط:
النتيجة:
اﻟﻘﺳم اﻟﺛﺎﻧﻲ :ﺗﺷﻐﻳﻝ ﺑرﻧﺎﻣﺞ Microsoft Visual C++
ﻳﻣﻛﻧك ﻋزﻳزي اﻟطﺎﻟب ﺗﻧﻔﻳذ ﺑراﻣﺞ ﻟﻐﺔ ﺳﻲ ﺑﻠص ﺑﻠص ﺑﺎﺳﺗﺧدام اﻟﻌدﻳد ﻣن اﻟﻣﺗرﺟﻣﺎت ﻣﺛﻝ، Borland :
Microsoft Visual Studio 6.0 ،Turbo c++ﻣﺎﻳﻛروﺳوﻓت ﻓﻳﺟﻳواﻝ ﺳﺗودﻳو ﻧﻣط 6او اﺣدث ﻣن ذﻟك.
ﻣﺣرر اﻷﻛواد
ﻣﺛﻝ ﺑﺎﻗﻰ ﺑﻳﺋﺎت اﻟﺗطوﻳر ﻳﺣﺗوى اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو ﻋﻠﻰ ﻣﺣرر أﻛواد ﻳدﻋم ﺗﻌﻠﻳم اﻟﺻﻳﻐﺔ واﻻﻛﻣﺎﻝ اﻟﺗﻠﻘﺎﺋﻰ
وﻳﺳﺗﺧدم أﻳﺿﺎ ﺗﻘﻧﻳﺔ اﻧﺗﻠﻳﺳﻧس ﻟﺗﺳﺎﻋد اﻟﻣﺑرﻣﺞ ﻓﻲ ﻛﺗﺎﺑﺔ اﻟﻣﺗﻐﻳرات واﻟدواﻝ واﻟوﺳﺎﺋﻝ واﻟدورات ﺑﺳرﻋﺔ ،وﻳدﻋﻣﻬﺎ
اﻟﻣﺣرر ﻓﻲ ﻛﺗﺎﺑﺔ ﺟﻣﻳﻊ ﻟﻐﺎت اﻟﺑرﻣﺟﺔ واﻟﺗرﻣﻳز اﻟﺗﻲ ﻳﺣﺗوى ﻋﻠﻳﻬﺎ اﻟﻔﻳﺟواﻝ اﺳﺗودﻳو.
ﻳدﻋم ﻣﺣرر أﻛواد ﻓﻳﺟواﻝ اﺳﺗودﻳو أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ وﺿﻊ ﻋﻼﻣﺎت ﻣرﺟﻌﻳﺔ ﻓﻲ اﻟﻛود ﻟﻠﻣﺳﺎﻋدة ﻓﻲ اﻟﺗﺻﻔﺢ اﻟﺳرﻳﻊ،
ﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ collapsing and expandingﻣﺟﻣوﻋﺎت اﻷﻛواد واﻟﺑﺣث واﻻﺳﺗﺑداﻝ ﻓﻲ اﻟﻛود ,وﻳدﻋم
أﻳﺿﺎ code snippetsوﻫﻰ ﻗواﻟب ﺟﺎﻫزة ﻣن اﻟﻛود ﻳﻛﻣن ادراﺟﻬﺎ وادﺧﺎﻝ ﺗﻐﻳﻳرات ﻋﻠﻳﻬﺎ داﺧﻝ اﻟﻣﺷروﻋﺎت
اﻟﺟﺎرى اﻟﻌﻣﻝ ﻋﻠﻳﻬﺎ وﻳدﻋم أﻳﺿﺎ إﻣﻛﺎﻧﻳﺔ اﻋﺎدة ﻛﺗﺎﺑﺔ اﻟﻛود.
ﻳﻘوم ﻣﺣرر اﻷﻛواد أﻳﺿﺎ ﺑوﺿﻊ ﺧطوط ﺣﻣراء أﺳﻔﻝ اﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﺧطوط ﺧﺿراء أﺳﻔﻝ اﻻﻧذرات.
ﻣﺗﻌﻘب اﻷﺧطﺎء
ﻳﺣﺗوى ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻋﻠﻰ ﻣﺗﻌﻘب أﺧطﺎء ﺗدﻋﻣﻪ ﺟﻣﻳﻊ اﻟﻠﻐﺎت اﻟﻣدﻋوﻣﺔ ﻳﻛﺷف أﺧطﺎء وﻗت اﻟﺗﺷﻐﻳﻝ
واﻷﺧطﺎء اﻻﻣﻼﺋﻳﺔ وﻳﺳﻣﺢ ﺑوﺿﻊ ﻧﻘﺎط ﺗوﻗف ﻋﻧد ﺳطور اﻟﻛود واﻟﺗﻲ ﻳﺗوﻗف اﻟﺑرﻧﺎﻣﺞ ﻋن اﻟﻌﻣﻝ ﻋﻧدﻣﺎ
ﻳﺻﻝ ﻟﻬذا اﻟﺳطر.
ﻳوﺟد أﻳﺿﺎ ﻓﻲ ﻓﻳﺟواﻝ ﺳﺗودﻳو ﻧﺎﻓذة immediate windowواﻟﺗﻲ ﺗﺳﻣﺢ ﺑﺗﺟرﻳب اﻟدواﻝ أﺛﻧﺎء ﻛﺗﺎﺑﺗﻬﺎ.
في ھذا القسم – عزيزي الطالب – سوف نشرح كيفية كتابة أول برنامج لك بلغة الـ C++وباستخدام Microsoft
Visual C++وھي بيئة تطويرية أخرى يمكن أن تتعامل معھا من أجل التمكن من االنتقال إلى برمجة تطبيقات ويندوز
باستخدامھا.
-2تحصل على النافذة كما في الشكل التالي ،من الصفحة Workspacesسيظھر Blank Workspaceوھو
مكان العمل الذي سوف توضع فيه مشاريعك .
-3عند خانة Workspace nameأدخل اسم ) مثالً اسمك( ،يمكنك تغيير مكان التخزين عن طريق الخانة
.Location
-4اآلن ولنقوم بتشكيل أول مشروع يحب علينا اختيار األمر Newمن القائمة Fileلتحصل على نفس الشاشة
التي حصلت عليھا مسبقا ً ولكن الصفحة Projectsھي التي ستظھر أمامك بدالً عن .Workspaces
-5اختر ،Win32 Console Applicationعلى يمين النافذة وعند خانة Project Nameاكتب اسم
مشروعك وليكن ،Prog1بشكل افتراضي سوف يقوم الفيجول سي ++بإنشاء دليل بنفس اسم المشروع
ويضع فيه جميع الملفات التي سوف تضيفھا الحقا ً لمشروعك .
-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
ﺑﺴﻢ ﺍ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ
>#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
}
>#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 :
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
>#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
}
ات ا
ا
:
.١ا
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
ﺑﺴﻢ ﺍ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ
ﻃﺒﺎﻋﺔ ﳏﺘﻮﻳﺎﺕ ﻣﺼﻔﻮﻓﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻻﺳﺘﺪﻋﺎء ﺍﻟﺬﺍﺗﻲ
>#include <stdio.h
>#include <conio.h
;)( getch
}
}
3ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ:
: ﻭﺇﺭﺠﺎﻉ ﻗﻴﻤﺔ، ﺘﻤﺭﻴﺭ ﻤﻌﺎﻤﻼﺕ3
.(main )ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺼﻔﻭﻓﺔ ﻭﻁﺒﺎﻋﺘﻬﺎ ﺃﻴﻀﺎﹰ ﻓﻲ ﺍﻟـ
#include <stdio.h>
#include <conio.h>
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 ();
}
return b[i];
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3
ﺑﺴﻢ ﺍ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ
ﺍﻜﺘﺏ ﺒﺭﻨﺎﻤﺠﺎﹰ ﺒـ )ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻻﺴﺘﺩﻋﺎﺀ ﺍﻟﺫﺍﺘﻲ( ﻴﻘﻭﻡ ﺒﻁﺒﺎﻋﺔ ﻤﺤﺘﻭﻴﺎﺕ ﻤﺼﻔﻭﻓﺔ ﻁﻭﻟﻬﺎ 10
>#include <stdio.h
>#include <conio.h
;)( getch
}
}
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)
{
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;}
getch ();
}
: ﻨﺎﺘﺞ ﺍﻟﺘﻨﻔﻴﺫ3