تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[مثال] شرح مثال عن Overloading Function التحميل الزائد للدوال
#1
Lightbulb 
السلام عليكم ورحمة الله وبركاته
Overloading_Function#





 ” أليس هذا رائع حيث يساعدك في تصميم البرامج والأنظمة على فرز وتجميع المهام في دالة واحدة وكل مهمة تنفذ عدة عمليات وتستقبل بيانات(براميترات) مختلفة عن الاخرى ….”

* #التعريف_أو_ألتحميل_الزائد_للدوال :- هو تعريف عدة دوال برمجية بداخل الكلاس (class) ،

بنفس الاسم والنوع (#_void – #_int – #_string -…) ،

ويشترط أن تختلف في عدد البراميترات التي تستقبلها او أنواع البراميترات التي تستقبلها ،

أو عدد البراميترات وانواعها معا.

يعني كيف لم أفهم بعد ، أعطي أمثله 

* حاضر يابش مهندس سأبداء بمثال بسيط بص بقى فلنفرض أنني مبتداء في البرمجة وبتعلم كيفية تعريف الدوال بلغة C++ ،

وطلب مني في التمرين تصميم برنامج بإستخدام الدوال يطبع عدة رسائل وهي :-

* اولا يطبع كلمة مرحبا

* ثانيا يطبع كلمة مرحبا ومن ثم يطبع الاسم الاول من المستخدم

* ثالثا يطبع كلمة مرحبا ومن ثم يطبع الاسم الاول من المستخدم والاسم الاخير

*…

 بعد قرائة التمرين سأقوم بتحليل وتصميم البرنامج وعمل خوارزمية بأي طريقة من طرق التحليل والتصميم

كما تم عرضها في المنشور التالي >> أضغط هنا

 

وسأقوم بسرد أو كتابة او رسم (1- مدخلات البرنامج، 2- عمليات البرنامج، 3- مخرجات البرنامج)

وبما أن التمرين طلب أستخدام الدوال سأفكر بكتابة لكل عملية دالة تنفذ المهام المطلوبه فرضا في مهمه طباعه كلمة مرحبا سأكتب الدالة بالشكل التالي >>




كود :
void messge_hello()
{
cout<<“hello”<<endl;
}


ومن ثم أستدعي الدالة في الـ (main) بالشكل التالي >>




كود :
messge_hello();


ودالة طباعه كلمة مرحبا ومن ثم اسم المستخدم سأكتب الدالة بالشكل التالي >>




كود :
void messge_hello_and_fname(string fname)
{
cout<< “hello” << “\t” << fname <<endl;
}


وسأقوم أولا بالطلب من المستخدم ان يدخل أسمة الاول ومن ثم أستدعي الدالة في الـ (main()) بالشكل التالي >>




كود :
cin>> Fname;
messge_hello_and_fname(Fname);


ودالة طباعه كلمة مرحبا ومن ثم اسم المستخدم الاول ومن ثم الاخير سأكتب الدالة بالشكل التالي >>




كود :
void messge_hello_and_fname_lname(string fname , string lname)
{
cout<< “hello” << “\t” << fname <<“\t” << lname <<endl;
}


وسأقوم أولا بالطلب من المستخدم ان يدخل أسمة الاول ومن ثم الاخير ومن ثم أستدعي الدالة في الـ (main()) بالشكل التالي >>




كود :
cin>> Fname;
cin>> Lname;
messge_hello_and_fname_lname(Fname , Lname);


ألا تلاحض أنني كتبت لكل دالة أسم مختلف وذالك لأن كل دالة تنفذ اكواد مختلفة عن الاخرى وكذالك يوجد دوال بها براميترات وأخرى لا يوجد بها براميترات ما رأيك أنت بذالك

* هل يمكنني تعريف دالة واحدة تقوم بتنفيذ واحدة من الثلاث العمليات ,وكيف سيعرف المترجم او النظام اي واحدة اريد ان ينفذها …

نعم بمفهوم التعريف الزائد للدوال في البرمجة الكائنية التوجة OOP يمكنك تعريف الثلاث الدوال بنفس الاسم ما دام أن الدوال من نفس النوع (Void) وهو الشرط الاول الأساسي أن يكون الدوال من نفس النوع

أما الشرط الثاني الاساسي هو أن تختلف في عدد البراميترات التي تستقبلها او أنواع البراميترات التي تستقبلها ،

أو عدد البراميترات وانواعها معا.

وسيتم كتابة الثلاث الدوال بالشكل التالي >>




كود :
void messge_()
{
cout<<“hello” << endl;
}
void messge_(string fname)
{
cout<< “hello” << “\t” << fname <<endl;
}
void messge_(string fname , string lname)
{
cout<< “hello” << “\t” << fname <<“\t” << lname <<endl;
}


ومن ثم أستدعي الدوال في الـ (main()) بالشكل التالي >>



كود :
//طباعه كلمة مرحبا
messge_();
//طلب من المستخدم ان يدخل أسمة الاول ومن ثم طباعه كلمة مرحبا و الاسم الاول
cin>> Fname;
messge_(Fname);
//طلب من المستخدم ان يدخل أسمة الاول ومن ثم طباعه كلمة مرحبا و الاسم الاول والاخير
cin>> Fname;
cin>> Lname;
messge_(Fname , Lname);


بهاذا الشكل سوف يتعرف المترجم او النظام على اي دالة اريد ان ينفذها وذالك بسبب انني استدعيت الدالة الاولى ولم اكتب بها براميترات

لذالك سوف ينفذ الدالة التي لا توجد بها براميترات وهي >>




كود :
void messge_()
{
cout<<“hello”<<endl;
}


وعندما استدعيتها مرة ثانية وكتبت باراميتر واحد فقط فإنة سوف ينفذ الدالة التي بها براميتر واحد فقط وهي >>




كود :
void messge_(string fname)
{
cout<< “hello” << “\t” << fname <<endl;
}


وكذالك عندما استدعيتها مرة ثالثة وكتبت بها اثنين براميترات فسوف ينفذ الدالة التي بها اثنين باراميترات وهي >>




كود :
void messge_(string fname,string lname)
{
cout<< “hello” << “\t” << fname <<“\t” << lname <<endl;
}


أليس هذا رائع حيث يساعدك في تصميم البرامج والأنظمة على فرز وتجميع المهام في دالة واحدة وكل مهمة تنفذ عدة عمليات وتستقبل بيانات(براميترات) مختلفة عن الاخرى

*طبعا التعريف الزائد للدوال لا يجب أن يزداد عدد البراميترات في كل دالة ،

*يمكن أن يكون نفس عدد البراميترات في كل دالة ولكن يشترط ان يكون أنواع البراميترات مختلفة في كل دالة .

كيف ذالك ؟ ممكن تشرح لي مثال

*حاضر يابش مندس بص بقى فلنفرض انك تقوم بتصميم أداة ألة حاسبة لترفقها مع نظامك المحاسبي الاحترافي

وعملت دالة تجمع عددين بالشكل التالي >>




كود :
double sum_(int x , int y)
{
return x+y;
}


*في هذه الدالة ستقوم بجمع عددين صحيحين وأرجاع لك ناتج الجمع

وستستدعيها بالشكل التالي >>




كود :
cout<<sum_(2 , 2)<<endl;


وسيطبع في الشاشة ناتج الجمع وهو 4

*ولكن أذا أردت ان تجمع عددين عشريين سيكون الناتج في الاغلب عشري ,فهل ستستدعي نفس الدالة ،

أذا نعم، فأن الناتج التي ترجعه الدالة سيكون عدد صحيح على الرغم ان نوع الدالة هو double ،

والناتج التي ترجعه الدالة من نفس نوع الدالة

*ولكن المشكلة هي في نوع البراميترات التي في الدالة حيث أنك عندما تكتب القيم العشرية في البراميترات عند استدعاء الدالة ،

*سوف تخزن البراميترات القيم الصحيحه فقط وتستبعد القيم العشرية. بالشكل التالي >>




كود :
cout<<sum_(2.5 , 2.5)<<endl;


وسيطبع في الشاشة ناتج الجمع وهو 4

*كما ذكرت تخزن البراميترات القيم الصحيحه فقط وتستبعد القيم العشرية

*ولحل ذالك سوف تقوم بكتابة دالة أخرى تقوم بجمع عددين عشريين ، * فهل ستكتب دالة بأسم مختلف أو ستقوم بتعريف الدالة sum تعريف زائد بالشكل التالي >>




كود :
double sum_(float x , float y)
{
return x+y;
}


ستستدعيهما بالشكل التالي >>


كود :
cout << sum_ (3 , 4) << endl;
// سينفذ الدالى الاولى وسيطبع في الشاشة ناتج الجمع وهو 7
cout << sum_ (2.5 , 4.3) << endl;
// سينفذ الدالة الثانية وسيطبع في الشاشة ناتج الجمع وهو 6.8


 سينفذ الدالى الاولى وسيطبع في الشاشة ناتج الجمع وهو 7
 سينفذ الدالة الثانية وسيطبع في الشاشة ناتج الجمع وهو 6.8
وهكذا ،

*لاحظ هنا في الدالتين لهما نفس أسم الدالة ونوعها وعدد البراميتر التي تستقبلها

*ولكن الاختلاف في نوع البراميترات في كل دالة >>



كود :
double sum_ (int x , int y)
{
return x+y;
}
double sum_(float x , float y)
{
return x+y;
}


*إلى هنا أعزائنا الكرام أنتهى شرحنا عن التعريف أو التحميل الزائد للدوال وهو من أحد مفاهيم البرمجة الشيئية او البرمجة الكائنية التوجة (#OOP)



مصدر المعلومات :-






اسأل المولى ان قد وفقني في افادتكم في هذا الدرس و المعلومات

وفق الله الجميع
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  مثال عن الشجرة المحاسبية بأداة TreeListView asemshahen5 2 3,414 04-03-24, 09:31 PM
آخر رد: alnagi
  [مثال] مثال انشاء زر دائري Kamil 0 223 08-01-24, 07:39 PM
آخر رد: Kamil
Lightbulb [مثال] شرح مثال عن إستخدام تقنية Static في الأنظمة البرمجية rabia al hamdani 0 782 11-01-23, 11:02 PM
آخر رد: rabia al hamdani
Lightbulb [مثال] شرح مثال عن المسارات المتعددة (MultiThreading) rabia al hamdani 0 771 11-01-23, 10:53 PM
آخر رد: rabia al hamdani
Lightbulb [مثال] شرح مثال عن المفوضات (Delegate) rabia al hamdani 0 866 11-01-23, 10:40 PM
آخر رد: rabia al hamdani
Lightbulb [مثال] شرح مثال عن (Try-Catch) أقتناص الاخطاء Catching Exceptions rabia al hamdani 0 793 11-01-23, 10:34 PM
آخر رد: rabia al hamdani
  مثال عن شاشة طلبات المطبخ . asemshahen5 0 1,351 21-11-21, 03:46 PM
آخر رد: asemshahen5
  مثال عن إضافة خصائص و أحداث للادوات . asemshahen5 3 2,439 24-10-21, 10:11 PM
آخر رد: zageteh
  السلام عليكم ورحمة الله و بركاته هذا مثال عن تنشيط المنتج و تشفير السيريال . asemshahen5 5 3,856 15-08-21, 01:05 PM
آخر رد: devante.celvin
  مثال عن الداتا غريد فيو [منقول]. asemshahen5 0 1,701 23-12-20, 08:11 PM
آخر رد: asemshahen5

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم