القائمة الرئيسية

الصفحات

دروس في سي بلس بلس ++C - الإجراءات الفرعية التوابع Function

دروس في سي بلس بلس ++C - الإجراءات الفرعية التوابع Function

function,functions,الاجراءات و الدوال,البرامج الفرعية والدوال,الدوال البرمجية function,شرح الاجراءات و الدوال,المجموعات الفرعية للدوال التجميعية في الـsql,الدوال البرمجية function وتعريفها,basic function,function in c++,functions in c,function in java,function example,fonction,built in functions,introduction to function,functions in visual basic,passing arrays to functions,passing array as function argument in c++ arabic شرح بالعربى


السلام عليكم ورحمة الله وبركاتة مرحبا بكم احبتي الكرام: اليوم سوف نقدم لكم كورس الإجراءات الفرعية التوابع Function في سي بلس بلاس ++C شرح function في لغة C++ وسوف نجيب على أسئلة شائعة لدعلى function في C++ .

تعريف ال function في لغة C++

الـ function في C ++ تُعرف بـ الدالة وهى عبارة عن مجموعة من الأوامر التي تأخذ المدخلات وتعالجها وتنتج  المخرجات، وتعد الفكرة من وراء الـ function هى الجمع بين المهام الشائعة التي تتم بشكل متكرر، فإذا كان لديك مدخلات مختلفة لن تكتب نفس الرمز مرة أخرى فسوف تقوم باستدعاء الدالة بمجموعة مختلفة من البيانات تسمى المعلمات.

يحتوي كل برنامج C ++ على دالة واحدة على الأقل وتكون وظيفتها الرئيسية () حيث يمكنك تقسيم التعليمات البرمجية إلى وظائف مختلفة بحيث تقوم كل دالة بمهمة محددة، وهناك العديد من الدوال “functions” في لغة C ++ القياسية لذلك تتيح لك استدعاء هذه الدوال داخل البرنامج الخاص بك.

لماذا تستخدم الـ function

هناك العديد من الفوائد المرتبطة باستخدام الـ function أو الدوال تتمثل في :
  • تضع كل دالة التعليمات البرمجية ذات الصلة معًا مما يجعل من السهل على المبرمجين فهم الكود.
  • تجعل الدوال عملية البرمجة أسهل وذلك عن طريق إلغاء تكرار الكود.
  • تسهل إعادة استخدام الكود، حيث يمكنك استدعاء نفس الدالة لأداء مهمة ما في أقسام مختلفة من البرنامج أو خارج البرنامج.
  • استدعاء الوظائف المدمجة في وظائف C ++ فليس عليك كتابة الوظائف بنفسك.

أنواع function في C++


  • لغة C ++
  • لغة C.
  • لغة باسكال “Pascal”
  • لغة فورتران “Fortran”
  • لغة جافا “Java”
  • لغة بيرل “Perl”
  • لغة LISP.
  • لغة Scheme.

أهمية التصريح عن الإجراءات الفرعية

تعتبر عملية التصريح Declaration عن الإجراءات الفرعية التوابع Function من أهم معالم وخصائص لغة ++C ، حيث يكاد يكون من المستحيل التعامل مع أي إجراء فرعي دون أن تسبقه عملية إعلان مباشرة ، وتحديداً في بداية البرنامج و  الاقتران الرئيسي main  عملية التصريح ستطلع المترجم وتوجهه على شكل الارتباط ونوع البيانات المقدمة له وكذلك نوع الحجج المتعددة ، حيث توضح عملية التصريح نوع هذا الارتباط ، هل هو النوع الذي  إرجاع قيمة أم لا

يقوم المترجم بتسجيل بنية إعلان الارتباط في الذاكرة ، وبمجرد استدعاء الارتباط داخل البرنامج الرئيسي ، يتم إجراء مقارنة بين صيغة الاستدعاء وصيغة الإعلان المخزنة في الذاكرة يحصل المترجم على ذلك ويخبرك بعدم التطابق لذلك لن يتم تنفيذ أي برمجي .

جسم الاقتران وبنيته البرمجية Function Body

يتطلب مترجم C ++ أن نعلن عن الارتباط في بداية البرنامج ولكن إلى أين سنكتب هيكل الكتلة والاقتران؟  يمكننا كتابة كتلة البرمجة للرابطة الفرعية باستخدام أكثر من طريقة ولعل أشهر هذه الطرق وأبسطها تتم بكتابة كتلة الارتباط بعد انتهاء البرنامج الرئيسي ، بحيث تنقسم الرابطة إلى قسمين:

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

طريقة كتابة جسم الاقتران

يتم كتابة نص الرابطة وفقًا لنموذج ثابت مشابه جدًا لعملية الإعلان ، متبوعًا بأقواس البداية الخاصة بلوك الكود {ثم return ، وفي نهاية الارتباط نستخدم بيان الإرجاع إذا كان الاقتران هو من النوع الذي يرجع قيمة وأخيرا قوس الإغلاق لكتلة الكود} ، ثم اتبع الشكل التالي الذي يوضح الصورة العامة لاقتران الجسم:

Return_Data_Type Function_Name(Passing_Data)
{

Statment 1;
Statment 2;
Statment 3;
return Val;
}

في الصيغة السابقة لاحظ إننا استخدمنا تعليمة برمجية لم يسبق وان استخدمنها من قبل إلا وهي تعليمة return والتي تستخدم لإرجاع قيمة محددة للبرنامج العام في حالة عدم قيام الارتباط بإرجاع أي قيمة void ، فلا داعي لاستخدام بيان return ،  نتأكد عند استخدام تعليمة return إن القيمة المرجعة متطابقة من حيث نوع البيانات من نوع الاقتران المصرح عنه.

كيف يتم استدعاء الاقتران Calling a Function

يتم استدعاء الاقتران الفرعي وفقًا لنوع الارتباط يمكن استدعاء بعض الجمعيات مباشرة باسم الجمعية دون تحديد الحجج وأنواع أخرى من الارتباطات تتطلب منا تحديد القيم المرسلة "الوسائط" أثناء عملية الاستدعاء ، وهناك بعض الجمعيات الفرعية التي يتم استدعاؤها فقط في عملية الطباعة أو أي تخصيص قيمة أو عملية مقارنة منطقية.

ما هي الطريقة التي تميّز بها طريقة الاحتجاج؟

الإجابة في بناء الجملة وهيكل إعلان الارتباط وهنا
يمكننا تحديد النقاط التالية لنكون مرجعنا في عملية الاحتجاج:

1 - إذا كان الاقتران من النوع الذي لا يستقبل قيم "وسائط" ولا يرجع قيمة void فعندها نستطيع استدعاء الاقتران داخل الاقتران الرئيسي main بالاسم فقط وأينما نشاء بالنص التالي ()Function_Name وكان الاقتران الفرعي أصبح تعليمة برمجية محددة تشبه الكلمات المحجوزة, ووضع الأقواس المفرغة ليس إلا دلالة على انه اقتران ولا يستقبل وسائط.
2 - إذا مكان الاقتران من النوع الذي يستقبل قيم " وسائط" ولا يرجع قيمة void فعندها نستطيع استدعاء الاقتران داخل الاقتران الرئيسي main بالاسم بشرط تحديد قيمة الوسائط الممررة كما في النص التالي: Function_Name(val1,val2,val3….).

3 - تجدر الإشارة إلى إن القيم الممررة من الاقتران الرئيسي للاقتران الفرعي تعتبر قيم حقيقية سيستقبلها الاقتران الفرعي بمتغيرات وهمية وافتراضية تكون مؤقتة داخل الذاكرة ولا تتعدى دورة حياتها فترة معالجة الاقتران الفرعي فقط.
4 - الاقتران الذي يرجع قيمة ولا يستقبل أي وسيط, وهنا لا يمكن استدعاء الاقتران إلا في حالتين وهما:
الحالة الاولى : تعليمة الطباعة cout وعندها يعامل الاقتران على انه قيمة عددية أو قيمة نصية بحسب القيمة العائدة منه.
الحالة الثانية : التعليمات البرمجية التي تتعامل مع المتغيرات بصورة مباشرة مثل تعليمة الإسناد أو عمليات المقارنة المنطقية
في كلتا الحالتين تتم عملية الاستدعاء باسم الاقتران.
5 - الاقتران الذي يرجع قيمة ويستقبل وسائط التمرير وهذا النوع لا يختلف عن السابق إلا في نقطة واحدة وهي انه يشترط علينا أثناء عملية الاستدعاء تحديد قيم وسائط التمرير.

مثال بسيط على الاقترانات الفرعية: برنامج يستخدم اقتران فرعي Print ليطبع عند استدعائه النص "Arabic SEO"؟
 
أولا: يجب علينا التصريح عن الاقتران الفرعي, ويمكننا تحديد خصائص الاقتران على النحو التالي: اقتران لا يرجع ولا يستقبل أي قيمة, لذلك نصرح عنه بالطريقة التالية:
void print();

ثانيا: جسم الاقتران وهنا سنعيد كتابة التصريح السابق بدون الفاصلة لمنقوطة ونتبعه بقوس وبداية الكتلة ثم نكتب تعليمة الطباعة وننهي جسم الاقتران النهاية كما في الشكل التالي:
void print()
{ // بداية الاقتران

cout<<"Arabic SEO"<

ثالثا: بعد إن أصبح الاقتران جاهز
كيف سنستدعي هذا الاقتران من اجل تنفيذ تعليمة الطباعة؟ 
بما إن الاقتران من النوع الذي لا يستقبل ولا يرجع أية قيمة, إذ يمكننا استدعائه مباشرة وبكتابة الاسم داخل الاقتران الرئيسي في النهاية ستكون الصورة الكاملة للبرنامج على النحو التالي:
#include void print();//تصريح عن الاقتران الفرعي  void main()//بداية الاقتران الرئيسي  { print();  }// نهاية الاقتران الرئيسي   void print()//بداية الاقتران الفرعي { cout<<"Arabic SEO"<

طريقة تعامل المترجم مع البرنامج السابق

عندما يقرا المترجم التصريح عن الاقتران , فانه سيعمل على تسجيل صفات ونموذج الاقتران في الذاكرة وعندما يصل المترجم لأمر الاستدعاء عندها سيقارن أمر الاستدعاء مع النموذج المخزن في الذاكرة وفي حالة التطابق سينتقل مسار تنفيذ البرنامج إلى الاقتران الفرعي Print وبعد تنفيذ كافة تعليمته سيعود التنفيذ مرة أخرى للبرنامج الرئيسي ومن الجملة التي تلي جملة الاستدعاء مباشرة.
مثال: لنكتب اقتران فرعي الهدف منه إيجاد ناتج جمع عددين؟ الحل أولا: نصرح عن الاقتران sum بالخصائص التالية:
int Sum(int A,int B);



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

ثانيًا: جسم الاقتران ، والذي سيحتوي على تجميع بسيط بين وسيطات اللفافة كما في الشكل هنا.

int Sum(int X,int Y)
{//بداية الاقتران

return X+Y;
}//نهاية الاقتران الفرعي


 كما ترى في الشكل السابق ، إذا لم نحصر أسماء المتغيرات الموجودة داخل هيكل التصريح وقمنا باستبدالها بأسماء المتغيرات داخل هيكل التصريح واستبدلناها بأسماء جديدة هي x و مع العلم أنه من الممكن الاحتفاظ بالأسماء السابقتين B و A ولن يكون هناك خطأ في جميع الحالات ، فهي لا تشكل أكثر من مجرد أوضاع تمرير ولكن من المطلوب بشكل قاطع تحديد أسماء الوسائط داخل نص الرابطة ولا يمكن الاستغناء عنها كما هو الحال في عملية الإعلان ، ولكن إذا نظرت إلى تعليمة Return ، ستجد أنها تعليمات بسيطة تُرجع  نتيجة جميع المتغيرات X و Y للارتباط الرئيسي.

ثالثا: استدعاء الاقتران داخل الاقتران الرئيسي سيتم داخل تعليمة الطباعة وبمجرد كتابة اسم الاقتران sum ، ستلاحظ ظهور رسالة إرشادية صفراء لم ترها من قبل انظر الشكل التالي:
void main()
{
cout<

ويعود سبب ظهور هذه الرسالة إلى كون الاقتران sum أصبح معرف بالنسبة لمترجم C++ لذا تظهر هذه الرسالة لإرشادك حول نوع وعدد الوسائط التي يجب أن تمررها إلى الاقتران حسنًا ، دعنا نمرر القيمة 20 والقيمة 30 لتكون تعليمة الاستدعاء على النحو التالي:
cout<

أخيرًا وليس آخرًا ، ستكون الصورة النهائية للبرنامج كما يلي:

#include int sum(int A, int B);
void main()

{


cout<





 وفي الختام : نشكركم على مروركم الكريم زوار و متابعين موقع الاندرويد تيك التقنية ونتمنى ان نكون قد وفقنا في هذا المقال , كما نرحب بعودتكم مرة اخرى لموقعنا ومتابعة كل جديد او يمكنكم متابعتنا والانضمام الى القناة الخاصة بلموقع على التلجرام من هنا.

تعليقات

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