يوجد هناك الكثير منا قد قام بدراسة كافة التعريفات المتنوعة في دالة C ++ ، ومنها طرق دراسة المتغيرات ووحدات التخزين والعوامل والبيانات والسلاسل وغيرهم من الدراسات الأخرى، وهناك ما يعرف بالإجراءات وما هي أنواع تلك الدوال والأمثلة على كل نوع.
كيفية تحديد الدالة
الدالة هي عبارة عن عدد معين من البيانات والعبارات التي قد تم جمعها والعمل على تعديلها من أجل التنفيذ أو القيام بمهمة محددة ، حيث أن هذه الدالة من المحتمل أن تتمثل في عبارات تقوم بعمل جزء من المهام والوظائف التي تكن متكررة أو بعضا من العبارات التي تقوم بتأديه بعض المسئوليات الخاصة مثل الطباعة وغيرها من المهام كما أن الدوال يكون لها إستخدامات متعددة منها :
- القيام بتبسيط أو تسهيل الكود من خلال أن يتم تقسيمه أو تجزئته إلى وحدات أصغر تسمى الدوال.
- استخدام أخر لتلك الدوال وهي تساعد على الحفاظ من أن نقوم بكتابة رمز واحد بصورة متكررة في مختلف مستويات لغات البرمجة ، ويتم ذلك من خلال كتابة دالة واحدة ثم بعد ذلك يتم اللجوء إليها أو نقوم باستدعائها عند الحاجة إليها من غير ما نحتاج إلى كتابة تلك العبارات نفسها عدة مرات .
اهم أنواع الدوال في C ++
يوجد هناك نوعين من الدوال [1] :
الدوال المدمجة built in functions
كما يطلق على تلك الدوال اسم دوال المكتبة أو الدوال المضمنة ، حيث أنها تكون الدوال التي يقوم بتوفيرها السي بلس بلس C ++ ولا نكن في حاجة إلى أن نكتبها بأنفسنا ، ونستطيع أن نستخدم تلك الدوال بطريقة مباشرة من خلال مراجعتها من الكود الذي يخصنا .
كما أنه يتم حفظ هذه الدوال من خلال القيام بوضعها في ملفات رأس C ++مثل ملفات ، وتلك الملفات عبارة عن رؤوس تكن مشتملة على دالات رياضية مضمنة ودوال السلسلة المتتالي وسنذكر مثال لاستخدام الدوال المضمنة في البرنامج.
المثال:-
{ #include <iostream>
#include <string>
using namespace std;
int main ()
{string name;
cout << “Enter the input string:”;
getline (std :: cin, name);
cout << “String entered:” << name << “! \ n”;
int size = name.size ();
cout << “Size of string:” << size << endl; }
الناتج
هنا يتم استخدام الرؤوس و يتم تعريف أنواع البيانات ووظائف الإدخال / الإخراج الأخرى في مكتبة وتعد وظائف السلسلة المستخدمة مثل getline والحجم جزءا من رأس .
دوال معرفة من قبل المستخدم User defined functions
كما أن C ++ تتيح لكل من يستخدمها أن يعمل على تحديد الدوال التي تكن خاصة بهم، فتكون هذه هي الدوال المعرفة من قبل المستخدم بحيث نستطيع أن نتمكن من تحديد تلك الدوال في أي وقت ومن أي مكان يكن موجودا في البرنامج .
ثم بعد ذلك يتم طلب أو استدعاء هذه الدوال من أي مستوي من مستويات لغات البرمجة التعليمية كما يوجد في المتغيرات .
فمن الضروري أن يتم الإعلان عن هذه الدوال قبل أن يتم استخدامها ، وكذلك يتم الإعلان عن تلك الدوال قبل أن نقوم بعملية الاستدعاء أو الطلب له .
كما أن الصيغة المعروفة لهذا النوع من الدوال (الدوال المعرفة من قبل المستخدم) تكون كالتالي:-
return_type functionName (param1, param2, … .param3
{ ;Function body }
فكل واحدة من هذه الدوال المذكورة يكون لها عدة أساسيات هي كالآتي:
- نوع الإرجاع: وهو يتمثل في القيمة الناتجة عن الدوال إلى دالة الاستدعاء حينما يتم الانتهاء من القيام بالمهمة المحددة
- تعريف function Name : وهو المعرف المستخدم للقيام بتسمية الدالة .
- قائمة المعلمات: للإشارة إلى param1 ، param2 ،… paramn ، تعتبر هذه المعلومات هي الوسيطات التي من خلالها يتم الاستدلال على الدالة أثناء استدعاء أو طلب هذه الدالة .
- قائمة المعلمات الاختيارية : بمعنى أن نمتلك دوال لم يكن لها معلومات.
- نص الدالة: هذا الجانب يتمثل في عدد من العبارات التي من خلالها يتم القيام بمهمة تكن محددة من قبل .
كيفية تعريف الدالة
إن تعريف الدالة يشتمل على كل شيء يكون في إعلان الدالة ، كما أنه يشتمل على نص الدالة المضمنة بين الأقواس هذه ({}).
ومع كل هذا لابد أن يحتوي التعريف على معلمات تكون مسماة ، وأثناء مرحلة استدعاء الدالة ، يتم انتقال عملية التحكم التي تكن في البرنامج إلى تعريف الدال، لكي يتم القيام بعمل رمز الدالة ، وأثناء الانتهاء من أمر تنفيذ الدالة يقوم عنصر التحكم بالرجوع إلى نفس النقطة التي قد استدعت الدالة إليها [2].
void swap (int a, int b) {
b = a + b;
a = b – a;
b = b – a;}
حيث أن كلا من الإعلان عن الدالة وتعريفها من الممكن أن يقوموا بالسير معا في اتجاه واحد ، إذا تم تحديد الدالة قبل عملية الانتقال إلى تلك الدالة ، فلم يكن من الضروري أن يتم الإعلان بطريقة تكن منفصلة .
وهذا مثال برمجة كامل يتم من خلاله إثبات الدالة.
#include <iostream>
using namespace std;
void swap (int a, int b) {// here a and b are formal parameters
b = a + b;
a = b – a;
b = b – a;
cout << “\ nAfter swapping:”;
cout << “a =” << a;
cout << “\ tb =” << b;
return;
}
int main ()
{
int a, b;
cout << “Enter the two numbers to be swapped:”; cin >> a >> b;
cout << “a =” << a;
cout << “\ tb =” << b;
swap (a, b); // here a and b are actual parameters
}
الناتج :
أدخل الرقميين المطلوب تبديلهما:
5 / 3
a = 5 . b = 3
بعد التبديل
: a = 3 b = 5
من خلال هذا المثال نلاحظ أنه يوجد هناك تبادل دالة يكون لها معلمتين من النوع int ولا تحدد شيء ، ويكون نوع الإرجاع هنا باطل عندما قمنا بتحديد هذه الدالة قبل الدالة الأساسية ، وهي تعتبر دالة من دوال الاستدعاء لم يتم الإعلان عنها بطريقة منفصلة .
في الدالة الأساسية main نستطيع أن نقرأ رقمين من الأعداد الصحيحة ثم بعد ذلك يتم استدعاء دالة المبادلة ، من خلال تمرير الرقمين الصحيحين المحددين إلي تلك الدالة.
كما أنه في دالة المبادلة يتم تبادل الرقمين الصحيحين السابقين عن طريق استخدام المنطق القياسي ، وحينها يتم القيام بطباعة أو تدوين القيم المتبادل .
قيم الإرجاع
عندما تتمكن الدالة من الانتهاء من القيام بعملية تنفيذ المهمة المطلوبة منها ، من الواجب أن تقوم بارجاع النتيجة إلى دالة الاستدعاء ، لذلك الشئ، هناك ضرورة إلى وجود نوع الإرجاع للدالة ، بحيث يمكن أن يتم رجوع الدالة قيمة واحدة إلى دالة الاستدعاء ، كما أن عملية الإعلان تكون عن نوع الإرجاع للدالة مع هذا النموذج الأولى للدالة .
ويوضح ذلك بمثال عن طريق إضافة رقمين من اجل شرح ما هي أنواع الإرجاع؟
#include <iostream>
using namespace std;
int sum (int a, int b) {
return (a + b);
}
int main ()
{
int a, b, result;
cout << “Enter the two numbers to be added:”; cin >> a >> b;
result = sum (a, b);
cout << “\ nSum of the two numbers:” << result;
}
الناتج :
أدخل الرقميين المطلوب إضافتهما: 11 11 ، مجموع الرقمين: 22