فاكه له تى زانسته مروفايه تيه كان و وه ر زشى خانقين
 
الرئيسيةاليوميةس .و .جبحـثالأعضاءالمجموعاتالتسجيلدخول

شاطر | 
 

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

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل 
كاتب الموضوعرسالة
Admin
Admin


المساهمات : 191
تاريخ التسجيل : 21/02/2012

مُساهمةموضوع: دروس في سي بلس بلس ++C - الإجراءات الفرعية التوابع Function   الخميس مارس 29, 2012 7:25 pm

أهمية التصريح عن الإجراءات الفرعية
تعتبر عملية التصريح Declaration عن الإجراءات الفرعية من أهم معالم وخصائص لغة ++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
يتم استدعاء الاقتران الفرعي بحسب نوع الاقتران فبعض الاقترانات يمكننا استدعائهما مباشرة باسم الاقتران فقط دون تحديد الوسائط. . وأنواع أخرى من الاقترانات تشترط علينا تحديد القيم المرسلة " الوسائط" أثناء عملية الاستدعاء كما توجد بعض الاقترانات الفرعية لا تستدعي إلا في عملية الطباعة أو أي عملية إسناد قيمة أو عملية مقارنة منطقية. فما هي الطريقة التي تستطيع من خلالها تميز طريقة الاستدعاء؟ الجواب يكمن في صيغة وبنية التصريح عن الاقتران وهنا يمكننا تحديد النقاط التالية لتكون مرجعنا في عملية الاستدعاء:

إذا كان الاقتران من النوع الذي لا يستقبل قيم "وسائط" ولا يرجع قيمة void فعندها نستطيع استدعاء الاقتران داخل الاقتران الرئيسي main بالاسم فقط وأينما نشاء بالنص التالي ()Function_Name وكان الاقتران الفرعي أصبح تعليمة برمجية محددة تشبه الكلمات المحجوزة, ووضع الأقواس المفرغة ليس إلا دلالة على انه اقتران ولا يستقبل وسائط.
إذا مكان الاقتران من النوع الذي يستقبل قيم " وسائط" ولا يرجع قيمة void فعندها نستطيع استدعاء الاقتران داخل الاقتران الرئيسي main بالاسم بشرط تحديد قيمة الوسائط الممررة كما في النص التالي Function_Name(val1,val2,val3….)
تجدر الإشارة إلى إن القيم الممررة من الاقتران الرئيسي للاقتران الفرعي تعتبر قيم حقيقية سيستقبلها الاقتران الفرعي بمتغيرات وهمية وافتراضية تكون مؤقتة داخل الذاكرة ولا تتعدى دورة حياتها فترة معالجة الاقتران الفرعي فقط.
الاقتران الذي يرجع قيمة ولا يستقبل أي وسيط, وهنا لا يمكن استدعاء الاقتران إلا في حالتين وهما.
تعليمة الطباعة cout وعندها يعامل الاقتران على انه قيمة عددية أو قيمة نصية بحسب القيمة العائدة منه.
التعليمات البرمجية التي تتعامل مع المتغيرات بصورة مباشرة مثل تعليمة الإسناد أو عمليات المقارنة المنطقية.
في كلتا الحالتين تتم عملية الاستدعاء باسم الاقتران.
الاقتران الذي يرجع قيمة ويستقبل وسائط التمرير وهذا النوع لا يختلف عن السابق إلا في نقطة واحدة وهي انه يشترط علينا أثناء عملية الاستدعاء تحديد قيم وسائط التمرير. مثال بسيط على الاقترانات الفرعية: برنامج يستخدم اقتران فرعي 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 و Y علما انه من الممكن الإبقاء على الأسماء السابقة B و A ولن يكون هنالك أي خطا ففي جميع الحالات فهي لا تشكل أكثر من وسائط تمرير فقط. لكن يشترط وبصورة قطعية تحديد أسماء للوسائط داخل جسم الاقتران ولا يمكن الاستغناء عمها كما في عملية التصريح, أما إذا نظرت لتعليمة Return ستجد أنها تعليمة بسيطة تعمل على إرجاع ناتج جميع المتغيرات X و Y إلى الاقتران الرئيس.

ثالثا: استدعاء الاقتران داخل الاقتران الرئيسي سيتم داخل تعليمة الطباعة وبمجرد كتابة اسم الاقتران sum ستلاحظ ظهور رسالة إرشادية صفراء اللون لم يسبق وان شاهدت مثلها. انظر الشكل التالي.

void main()
{

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

cout<
أخيرا وليس آخرا ستكون الصورة النهائية للبرنامج على النحو التالي:

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


cout<
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://elkh.yoo7.com
 
دروس في سي بلس بلس ++C - الإجراءات الفرعية التوابع Function
استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
elkh :: وحدة الحاسبة والانترنيت-
انتقل الى: