الاثنين، 24 أغسطس 2015

الدوال Function في ++C

فوائد استخدام الدوال في البرمجة

1- تساعد الدوال المخزنة في ذاكرة الحاسب على اختصار البرنامج إذ يكتفي باستدعائها باسمها فقط لتقوم بالعمل المطلوب .
2- تساعد البرامج المخزنة في ذاكرة الحاسب أو التي يكتبها المستخدم على تلافى عمليات التكرار في خطوات البرنامج التي تتطلب عملاً مشابهاً لعمل تلك الدوال.
3- تساعد الدوال الجاهزة في تسهيل عملية البرمجة.
4-يوفر استعمال الدوال من المساحات المستخدمة في الذاكرة.
5-كتابة برنامج الـ ++C في شكل دوال واضحة المعالم يجعل البرنامج واضحاً لكل من المبرمج والقارئ على حد سواء.


مكتبة الدوال الرياضية
 ( Math Library Functions)
     تحتوى مكتبة الدوال الرياضية على العديد من الدوال التي تستخدم في تنفيذ العمليات الرياضية الحسابية. فمثلاً المبرمج الذي يرغب في حساب وطباعة الجذر التربيعي للعدد 900 قد يكتب عبارة كالتالية:

cout << sqrt ( 900);
عند تنفيذ هذه العبارة يتم استدعاء الدالة المكتبية sqrt لحساب الجذر التربيعي للعدد بين القوسين (900). يسمى العدد بين القوسين وسيطة الدالة argument وعليه فالعبارة السابقة تقوم بطباعة العدد 30 ، تأخذ الدالة sqrt وسيطة من النوع double وتكون النتيجة قيمة من نفس النوع وينطبق هذا على جميع الدوال الرياضية.
عند استعمال الدوال الرياضية في أي برنامج بلغة C++ يجب تضمين الملف math.h والذي يحتوى على هذه الدوال.

الجدول التالي يلخص بعض الدوال الرياضية:

Function

Description
Example
sqrt(x)
الجذر التربيعي لـ x
sqrt (9.0)  is 3
exp(x)
exp(1.0) is 2.718282      
ex
fabs(x)
القيمة المطلقة لـ x
if x > 0  fabs(x) = x
     = 0  fabs(x) = 0
     < 0  fabs(x) = -x
ceil(x)
تقرب x لأصغر عدد صحيح أكبر من x
ceil(9.2) is 10.0
ceil(-9.8) is 9.0
floor(x)
تقرب x لأكبر عدد صحيح أصغر من x
floor(9.2) is 9
floor(-9.8) is –10.0


الدوال المعرفة بواسطة المستخدم
 Programmer-defined Functions


الدوال تمكن المبرمج من تقسيم البرنامج إلى وحدات modules، كل دالة في البرنامج تمثل وحدة قائمة بذاتها، ولذا نجد أن المتغيرات المعرفة في الدالة تكون متغيرات محلية (Local) ونعنى بذلك أن المتغيرات تكون معروفة فقط داخل الدالة.
أغلب الدوال تمتلك لائحة من الوسائط (Parameters) والتي هي أيضاً متغيرات محلية.
هنالك عدة أسباب دعت إلى تقسيم البرنامج إلى دالات وتسمى هذه العملية
(Functionalizing a program) وهي:

1- تساعد الدوال المخزنة في ذاكرة الحاسب على اختصار البرنامج إذ يكتفي باستدعائها باسمها فقط لتقوم بالعمل المطلوب .
2- تساعد البرامج المخزنة في ذاكرة الحاسب أو التي يكتبها المستخدم على تلافى عمليات التكرار في خطوات البرنامج التي تتطلب عملاً مشابهاً لعمل تلك الدوال.
3- تساعد الدوال الجاهزة في تسهيل عملية البرمجة.
4- يوفر استعمال الدوال من المساحات المستخدمة في الذاكرة.
5-كتابة برنامج C+ + في شكل دوال واضحة المعالم يجعل البرنامج واضحاً لكل من المبرمج والقارئ على حد سواء.
كل البرامج التي رأيناها حتى الآن تحتوى على الدالة main وهي التي تنادى الدوال المكتبية لتنفيذ مهامها. سنرى الآن كيف يستطيع المبرمج بلغة الـ C++ كتابة دوال خاصة به.

نموذج الدالة
Function Prototype

عندما يولد المصرف تعليمات لاستدعاء دالة، ما فإنه يحتاج إلى معرفة اسم الدالة وعدد وسيطاتها وأنواعها ونوع قيمة الإعادة، لذا علينا كتابة نموذج أو (تصريح) للدالة قبل إجراء أي استدعاء لها وتصريح الدالة هو سطر واحد يبلغ المصرف عن اسم الدالة وعدد وسيطاتها وأنواعها ونوع القيمة المعادة بواسطة الدالة. يشبه تصريح الدالة، السطر الأول في تعريف الدالة، لكن تليه فاصلة منقوطة.
فمثلا في تصريح الدالة التالي:-

int anyfunc(int);

النوع int بين القوسين يخبر المصرف بأن الوسيط الذي سيتم تمريره إلى الدالة سيكون من النوع int و int التي تسبق اسم الدالة تشير إلى نوع القيمة المعادة بواسطة الدالة.
يأخذ تعريف الدوال في 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 والذي يحدد اسم الدالة ونوع البيانات التي تعيدها الدالة وأسماء وأنواع وسيطاتها.


إستدعاء الدالة 
Function Call

يتم استدعاء الدالة (التسبب بتنفيذها من جزء آخر من البرنامج، العبارة التي تفعل ذلك هي استدعاء الدالة) يؤدى استدعاء الدالة إلي انتقال التنفيذ إلي بداية الدالة. يمكن تمرير بعض الوسيطات إلى الدالة عند استدعائها وبعد تنفيذ الدالة يعود التنفيذ للعبارة التي تلي استدعاء الدالة.


قيم الإعادة

 Returned Values

بإمكان الدالة أن تعيد قيم إلي العبارة التي استدعتها. ويجب أن يسبق اسم الدالة في معرفها وإذا كانت الدالة لا تعيد شيئاً يجب استعمال الكلمة الأساسية void كنوع إعادة لها للإشارة إلي ذلك .
هنالك ثلاث طرق يمكن بها إرجاع التحكم إلى النقطة التي تم فيها استدعاء الدالة:
1 - إذا كانت الدالة لا ترجع قيمة يرجع التحكم تلقائياً عند الوصول إلى نهاية الدالة
2 - باستخدام العبارة return;
3 - إذا كانت الدالة ترجع قيمة فالعبارة return expression; تقوم بإرجاع قيمة التعبير expression إلى النقطة التي استدعتها .
خذ برنامجاً يستخدم دالة تدعى square لحساب مربعات الأعداد من 1 إلى 10.
مثال:
//Program :
#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)
{
          return y*y;
}
الخرج من البرنامج يكون كالآتي:

1      4      9      16      25      36      49      64      81      100



يتم استدعاء الدالة square داخل الدالة main وذلك بكتابة .square(x) تقوم الدالة square بنسخ قيمة x في الوسيط y . ثم تقوم بحساب y*y ويتم إرجاع النتيجة إلى الدالة main مكان استدعاء الدالة square، حيث يتم عرض النتيجة وتتكرر هذه العملية عشر مرات باستخدام حلقة التكرار for .
تعريف الدالة square( ) يدل على أنها تتوقع وسيطة من النوع int . و int التي تسبق اسم الدالة تدل على أن القيمة المعادة من الدالة square هي من النوع int أيضاً . العبارة return تقوم بإرجاع ناتج الدالة إلى الدالة main.
السطر:



int square (int)
هو نموذج أو تصريح الدالة (function prototype) .


يتبع...






هناك 7 تعليقات:

  1. ما الفرق بين التصريح عن الدالة مع كتابة تعليماتها مباشرة أو التصريح المبدئي عن الدالة أولا ثم كتابة جسم الدالة في مرحلة أخرى ؟
    وشكرا

    ردحذف
  2. هل يلزم دائما كتابة the function definition

    int square(int y)
    {
    return y*y;
    }
    بعد ال ()main

    ردحذف
  3. ماهو المطلوب من الصيغه التاليه function, for,do while and 1D matrix ارجو الرد بسرعه

    ردحذف
  4. داله فيها متغيرات والشرط بيه أرقام

    ردحذف
  5. أكتب برنامج يقوم بتمثيل بيانات الكتاب كسجل في مكتبة تحتوي على عدد n من الكتب. علما أن بيانات الكتاب
    كالتالي:
    رقم الكتاب – عنوان الكتاب – اسماء المؤلفين – رقم الطبعة – سنة النشر.

    حيث يقوم البرنامج بـــــ :
    - تعريف دالة تقوم بإدخال بيانات الكتب.
    - تعريف دالة تقوم بطباعة وعرض بيانات جميع الكتب بالمكتبة
    - تعريف دالة تقوم بالبحث عن الكتاب بناء على اسم المؤلف، وفي حال وجوده تقوم بطباعة عنوان
    الكتاب.

    ملاحظة:
    على الرغم أنه قد يكون للكتاب أكثر من مؤلف، ولكن اعتبر في هذا البرنامج أن يكون للكتاب مؤلف واحد فقط

    ردحذف