الدرس الثاني في fuction الدوال
ذكرنا فيما سبق عن كيفية كتابة الدالة وطرق صيغتها وذكرنا مثلاً علي ذلك وهي دالة Exchange التي تقوم بتبديل قيمة متغيران مع بعضهم البعض
وكتبناها كالاتي
كود:
void exchange(int x , int y)
{
int z = y;
y = x ;
x = z ;
}
ويبقي لنا ان نشير الي موضوعان من الموضوعات المهمة وهما:
1- طرق ارسال المتغيرات الي الدوال
2- اماكن كتابة الدوال ومميزات كتابتها اسفل دالة ال main ((البرنامج))
1- في المثال السابق إذا استخدمت هذه الدالة ففي البرنامج الرئيسي main ستجد قيمة x و y لم تتغير
بمعني
اذا كتبت هذه الدالة وفي ال main()
مثل هذا البرنامج
كود:
#include<iostream.h>
void exchange(int x , int y)
{
int z = y;
y = x ;
x = z ;
}
void main()
{
int a = 8;
int b = 9 ;
cout<< a <<b<<endl;
exchange(a,b);
cout<<a<<b<<endl;
}
سيكون ناتج البرنامج
8 9
8 9
نجد ان قيمة a و b لم تتغير
واذا كتبت نفس البرنامج وكتبت cout في الدالة exchange كالاتي
كود:
#include<iostream.h>
void exchange(int x , int y)
{
int z = y;
y = x ;
x = z ;
cout<<x<<y<<endl;
}
void main()
{
int a = 8;
int b = 9 ;
cout<< a <<b<<endl;
exchange(a,b);
cout<<a<<b<<endl;
}
نجد ان تاتح البرنامج كالاتي
8 9
9 8
8 9
ومن هنا نستطيع ان نقول انه تم تبديل قيمتا x و y أو بمعني أصح قيمتا a و b
في الدالة exchange فقط وعند عودة المترجم الي الmain نجد ان قيمتهما رجعت الي اصلهما
فما سبب ذلك؟؟
يرجع ذلك الي وجود طرق لارسال المتغيرات من ال main الي الدالة function
ففي المثال السابق كنا قد ارسلنا المتغيرات بما يسمي ارسال بالقيمة byvalue حيث يقوم المترجم بارسال قيمة نسخة من قيمة المتغيرات ولا يرسلها ذاتها
وبالتالي عندما نعود الي الmain نجد ان قيمة المتغيرات الاصلية كما هي
ونستخدم هذه الطريقة في البرامج التي نحتاج الي قيمة هذه المتغيرات دون الحاجة الي التغير في البرنامج الاصلي في ال main مثلأً
ولكي نستخدم هذه الطريقة لا نزيد اي شيء عند المتغيرات التي سوف نرسلها كما في المثال السابق.
** أما بالنسبة للطريقة تسمي ارسال بالاصل byreference وواضح اننا نرسل المتغيرات نفسها وليس نسخة منها وإذا تم أي تغير في قيمة المتغير في الدالة سيتم التغير في قيمة المتغير الأصلي وحتي عند العودة من الدالة الي البرنامج الذي تم استدعاء الدالة عنده.
ولكي نستخدم هذه الطريقة يجب اضافة علامة & قبل اسم المتغير في تعريف الدالة فقط
وهذه النوع من الارسال هو الذي نحتاجة في المثال السابق حتي يحدث التغير المطلوب في البرنامج الرئيسي
ونعيد كتابة البرنامج كما ياتي
ونزيد فقط & قبل كلاً من x و y في تعريف الدالة فقط.
كود:
#include<iostream.h>
void exchange(int & x , int& y)
{
int z = y;
y = x ;
x = z ;
cout<<x<<y<<endl;
}
void main()
{
int a = 8;
int b = 9 ;
cout<< a <<b<<endl;
exchange(a,b);
cout<<a<<b<<endl;
}
ويكون ناتج البرنامج كما يأتي
8 9
9 8
9 8
ونلاجظ انه قد تم بالفعل تغير قيمة كلاً من a and b في ال main
انتبة::
((لا تكتب & عند استدعاء الدالة كما هو ملاحظ في المثال السابق اننا لم نكتبها عند الاستدعاء وكتبناها فقط في التعريف))
يوجد طريقة ثالثو من اراسال المتغيرات وهي ارسال بالعنوان حيث نرسل عنوان المتغير ولكن لن ندرسة الان وانما بعد دراسة المؤشرات
ملحوظة :: يمكن ان يكون نوع احد المتغيرات يرسل بالقيمة والاخر بالاصل اي ان تخلط بينهم مثل
int MyFunction( char & x , int y , float & z)
2- اماكن كتابة الدوال ومميزات كتابتها اسفل دالة ال main ((البرنامج))
كما ذكرنا من قبل انه يمكنك كتابةتعريف الداله اعلي أو أسفل الmain واشترطنا عند كتابتها أسفل الـmain أن نعرف اسمها أعلي الmain
ويوضح البرنامج السابق كتابتها أعلي الـmain
ونعيد الان كتابة البرنامج بكتابة تعريف الدالة exchange أسفل الmain
كود:
#include<iostream.h>
void exchange(int & , int& ); // يشترط كتابة هذا السطر ولكن دون اسماء المتغيرات ونكتب نوعا فقط وطريقة الارسال
void main()
{
int a = 8;
int b = 9 ;
cout<< a <<b<<endl;
exchange(a,b);
cout<<a<<b<<endl;
}
void exchange(int & x , int& y)
{
int z = y;
y = x ;
x = z ;
cout<<x<<y<<endl;
}
كما هو موضح اننا يجب ان نعرف اسم الدالة والقيكة التي ترجعها(( التي هي في المثال void )) ويتم كتابة نوع المتغيرات التي سوف يتم ارسالها دون كتابة اسمائها كما هو موضح ونكتب ايضاً & إذا أردنا ان نرسل المتغيرات بالقيمة by reference
<إنتبه>
(((
* يجب ان يتوافق نوع المتغيرات في تعريف الدالة في الاعلي وكتابة اوامرها في الاسفل اذا كان المتغير الاول int يجب ان يتوافق في الاعلي والاسفل
* ويتوافق ايضاً نوع ارسال المتغير اذا كان با لقيمةby value أو بالأصل by referance
*وأيضاً نوع القيمة التي سترجعها الداله أو انها لا ترجع قيمة والتي هي في المثال السابق void
*نلاحظ انه بعد كتابة تعريف الدالة أعلي الmain يجب وضع الفصلة المنقوطة ;
)))
ميزة كتابة الدوال اسفل الـmain بإمكننا كتابة قيمة افتراضيه لاي من المتغيرات التي سوف نرسلها للدالة بحيث اننا يمكن لنا ان لا نرسل قيمة لهذه المتغير
مثلاً
كود:
void myfunction(int x)
لكي نجعل قيمة افتراضية ل x مثلاً 6 بحيث اذا لم يتم ارسال متغير او قيمة للدالة لx تعتبر قيمة x تتعامل الدالة مع x بالقيمة الافتراضية ولا يحدث اي خطأ برمجي
ولكي نحدد هذه القيمة الافتراضية
نأتي في تعريف الدالة أعلي الـmain
ونكتب
كود:
void myfunction(int x = 5);
نلاحظ ان في هذه الحالة نكتب اسم المتغير ويجب ان يتوافق أيضاً مع اسمه في كتابة الدالة أسفل الـmain
تمارين
1)) أكتب برنامج يحسب المعادلة x= x^2 + 3y^2 + 78z^4 باستخدام دالة تحسب مربع العدد الذي سوف نرسله لها فقط((نستخدم داله واحدة فقط))
العلامة^ تعني أس أي س^2 تعني س أس 2
2)) أكتب نفس البرنامج السابق ولكن الدالة لا تحسب مربع عدد فقط وانما نرسل لها العدد و قيمة الاس اي انها تحسب س^ص - س أس ص -
ونرسل لها س و ص أي x وy مثلاً