نبدا الدرس الثاني
الدوال :
واليوم بإذن الله سوف نتطرق إلى C# بدأنا معكم في الدرس الأول بلمحة سريعة عن المتغيرات وطرق تعريفھا في الدوال وأنواعھا.
ماھي الدوال:
الدوال ھي كتل من الشيفرة نستطيع استخدامھا في أماكن متعددة في البرنامج ولكن بدون إعادة كتابتھا في كل
مرة.
ما الفرق بين الاجراءات والدوال ؟
الدوال تقوم بارجاع قيمة معينة
أما الأجراءات فھي دوال لا ترجع قيمة.
مثال للإجراء:
كود:
void ShowMessage()
{
MessageBox.Show("Hello") ;
}
المثال السابق ھو اجراء لأنه لا يرجع قيمة ونعرفه بكلمة void ھذه الكلمة تشير إلى أن ھذه الدالة لا ترجع قيمة
ولھذا تسمى بالإجراء.
أما المثال على الدالة:
كود:
int ShowNumber()
{
MessageBox.Show("Hello") ;
return 10 ;
}
تلاحظ ھنا أننا قمنا بتعريف الدالة بكلمة int وھذه تعني أن ھذه الدالة تقوم بارجاع قيمة من نوع عدد صحيح وفي آخر
الدالة تجد الكلمة 10 return ھذه الكلمة تعني أن الدلة سوف ترجع القيمة 10
نستطيع استخدام كلمة return . في الاجراء لكن بدون وضع قيمة بعد كلمة. return
كود:
void ShowMessage()
{
MessageBox.Show("Hello World") ;
return ;
}
وكلمة return في كل من الاجراءات والدوال تعني انھاء الإجراء او الدالة..
انواع الدوال:
نستطيع تصنيف الدوال كالمتغيرات .. فكل نوع من انواع المتغيرات نستطيع ان نعرف به دالة.
مثلا: لو أردنا تعريف دالة من نوع عدد صحيح طويل long فإننا نضع الآتي:
كود:
long GetNum()
{
return عدد صحيح طويل//; 1111111111111111
}
فلذلك نقول أن قيمة الإرجاع لا بد أن تكون من نفس النوع الذي عرفت به الدالة ، أي لو عرفنا الدالة من نوع float
. ھي من نوع فتكون القيمة التي بعد كلمة return ھي من نوع .float
مثال:
كود:
float GetFloatNumber()
{
return الذي عرفنا به الدالة هنا نوع قيمة الارجاع هو نفسه النوع // ; 125.23
}
وقد تكون القيمة التي بعد return ھي عملية حسابية . كما في الآتي:
كود:
int GetSum()
{
return 10 + 52 + 98 ;
}
ھنا الدالة سوف تقوم بإرجاع مجموع القيم 10 + 52 + 98 .
طريقة تعريف الدوال:
كود:
[( الدالة] [اسم الدالة] [( متغيرات الدالة نوع]
{
هنا تكتب الدالة//
return [ ; [قيمة من نفس نوع الدالة
}
نوع الدالة:
الأنواع التي توضع في تعريف الدالة ھي نفسھا الأنواع التي توضع لتعريف المتغيرات.
اسم الدالة:
ضع الاسم الذي تريد
متغيرات الدالة:
سوف نناقشھا لاحقا.
تمرير القيم إلى الدوال أو الاجراءات:
تكمن الفائدة الفعلية للدوال ھي أننا نستطيع نستطيع تمرير المتغيرات إليھا .. كيف؟
مثلاً : لو كان لدينا دالة من نوع integer تقوم بحساب عددين وإرجاع القيمة.
كود:
int GetSum()
{
return 10 + 25 ;
}
ھذه الدالة ھي غير مفيدة إطلاقا ! لماذا؟
لأن القيمة التي سوف نحصل عليھا من الدالة ھي قيمة ثابتة دائما وتساوي 35 أي كلما قمنا باستدعاء الدالة فسوف
نحصل على القيمة 35 كقيمة مرجعة لھذه الدالة .
كيف نجعل ھذه الدالة تجمع لنا رقمين متغيرين ؟
نستطيع ذلك عن طريق تمرير القيم للدالة .. كيف يتم ذلك ؟
ھناك ثلاث طرق في #C لتمرير القيم للدالة .
كود:
int GetSum ( int num1, int num صحيح قمنا هنا بوضع متغيرات للدالة من نوع عدد // ( 2
هذه المتغيرات هي عبارة عن الأعداد التي نريد جمعها //
{
return num1+num2 ;
}
ولو أردنا استدعاء الدالة السابقة فاننا نكتب التالي:
كود:
int Sum ;
Sum = GetSum( 10, التي نريد جمعها قمنا هنا باستدعاء الدالة ووضع قيم للمتغيرات // ( 20
Console.WriteLine( Sum.ToString() ) ;
وعندما نقول أن ھذا التمرير ھو تمرير بالقيمة فھذا يعني أن قيمة المتغير الذي نريد تمريره تنسخ إلى المتغير الموجود في الدالة.
مثال:
نريد تمرير متغير من نوع عدد صحيح إلى الدالة السابقة فنعمل كالآتي:
كود:
int Sum , MyNumber1 = 20, MyNumber2 = 10 ;
Sum = GetSum( MyNumber1, MyNumber2 ) ;
Console.WriteLine( Sum.ToString() ) ;
ھنا المتغير MyNumber1 و المتغير MyNumber2 قمنا بتمرير قيمھما إلى الدالة GetSum فقط ! ما معنى ذلك ؟
معنى ذلك ان المتغير المسمى num1 في الدالة السابقة سوف يأخذ نسخة من قيمة المتغير MyNumber1 ، ھكذا المتغير num2 مع المتغير MyNumber2
أي لو قمنا بتعديل في الدالة السابقة بحيث تقوم بتغيير في قيم أحد متغيراتھا.
كود:
int GetSum( int num1, int num2 )
{
int Sum ;
Sum = num1 + num2 ;
num1 = لاحظ هنا قمنا بتغيير قيمة المتغير // ; 50 num1
return Sum ;
}
ھذه الدالة تقوم بتغيير في قيمة المتغير num1 لكن مع ھذا قيمة ھذا المتغير لن تتغير لأننا قد مررناھا بالقيمة . انظر المثال التالي:
في ھذا المثال نقوم باستدعاء الدالة . GetSum
كود:
int Sum, MyNumber1 = 30, MyNumber2 = 50 ;
Console.WriteLine( MyNumber1.ToString() ) ; // هنا نقوم بطباعة المتغير قبل تمريره للدالة
للدالة نقوم بتمرير المتغير //
Sum = GetSum( MyNumber1, MyNumer2 ) ;
Console.WriteLine( MyNumber1.ToString() ) ; // هنا نقوم بطباعة المتغير مرة أخرى بعد
للدالة التمرير
عندما قمنا بطباعة المتغير MyNumber1 في المرة الأولى فستكون القيمة 30 ثم قمنا بتمرير المتغير MyNumber1 إلى الدالة GetSum
وھذه الدالة تقوم بتغيير في قيمة المتغير لكن بما ان التمرير ھو بالقيمة فإن المتغير MyNumber1 سوف لن يتأثر ، لذلك فإنه قيمة المتغير MyNumber1
عندما قمنا بطباعته مرة أخرى ھي نفسھا لم تتغير 30 . (أرجو أن تكون الفكرة قد اتضحت)
الطريقة الثانية التمرير بالإشارة:
معنى ذلك ھو أن تقوم يتمرير عنوان المتغير في الذاكرة إلى الدالة.
أي لو أردنا القيام بتغيير في قيمة المتغير MyNumber1 في المثال السابق فلا بد من كتابة المتغيرات في الدالة GetSum بصورة أخرى .
كود:
int GetSum( ref int num1, int num2 )
{
int Sum ;
Sum = num1 + num2 ;
num1 = 50 ;
return Sum ;
}
قمنا ھنا بزيادة كلمة في تعريف المتغير الأول (ref) من متغيرات الدالة ھذه الكلمة تعني أن نوع التمرير ھو بالاشارة.
ولو أردنا أن نقوم باستدعا الدالة السابقة فسنكتب شيئا كالتالي.
كود:
int Sum, MyNumber1 = 30, MyNumber2 = 20 ;
Console.WriteLine( MyNumber1.ToString() ) ;
Sum = GetSum( ref MyNumber1, MyNumber2 ) ;
Console.WriteLine( MyNumber1.ToString() ) ;
لاحظ ھنا أننا حينما نريد تمرير متغير بالاشارة فلابد من كتابة كلمة ref لكي تخبر المترجم بأن ھذا التمرير ھو بالاشارة .
ھنا الحال يختلف عما ھو عليه في طريقة التمرير بالقيمة فقيمة المتغير MyNumber1 قبل التمرير إلى الدالة تختلف عن قيمته بعد التمرير إلى الدالة..
أي أن قيمة المتغيرMyNumber1 قبل التمرير إلى الدالة ھي 30 لكن بعد التمرير إلى الدالة أصحبت 50. وبھذا يظھر الفرق بين التمرير بالقيمة والتمرير بالإشارة.
الطريقة الثالثة التمرير بالاشارة لكن بدون قيم أولية:
في الطريقتين السابقتين كان لا بد من وضع قيم أولية في المتغير قبل تمرير إلى الدالة .. أي أنه لا يمكن لنا فعل شيئا كالتالي:
كود:
int MyNumber1, MyNumber2 , Sum ;
Sum = GetSum( MyNumber1, MyNumber العملية غير مسموح بها لأننا لم نقم بوضع قيم هذه// ( 2
اولية للمتغيرين
والحل أن نضع كلمة out عندما تعرف متغيرات الدالة وعند تمرير القيمة إليھا.
كود:
int GetSum( out num1, num2 )
{
return num1 + num2 ;
}
وعندما نريد استدعائھا نقوم بالتالي
كود:
int Sum, MyNumber1, MyNumber2 = 10 ;
Sum = GetSum( out MyNumber1, MyNumber ) ;
كما قلنا سابقا فإن التمرير ب out ھو في الحقيقة تمرير بالاشارة لكنه لا يحتاج إلى وضع قيم أولية.
وبھذا نكون قد انتھينا من المبادئ الأساسية بمرور سريع على المتغيرات والدوال وطرق تعريفھا وحلقات التكرار والشرط
التحميل الزائد للدوال : ( Functions Overloading )
مامعنى ذلك ؟
معنى التحميل الزائد للدوال ھو أن يكون ھناك دالتين بنفس الاسم ويختلفان في نوع البارامترات (متغيرات الدالة)
ما الفائدة منه ؟
لو فرضنا أن لدينا دالة تقوم بتحويل عدد صحيح إلى نص .. وھناك دالة تقوم بتحويل عدد حقيقي إلى نص ودالة ...
أي جميع ھذه الدوال لھا العمل نفسه لكن المتغير ھو نوع متغير الدالة ..
مثال:
كود:
void ConvertIntToString( int number ) // نص هذه دالة تحول عدد صحيح إلى
{
...
..
}
void ConvertFloatToString( float number ) // هذه دالة تحول عدد حقيقي إلى نص
{
..
..
}
نلاحظ من السابق أن كلا الدالتين لھما اسم مختلف مع أن عمل الدالتين واحد .. ماذا لو قمنا بتوحد الأسماء وجعل
المترجم يتعرف عليھا لوحده ؟.
نستطيع أن نعمل الآتي:
كود:
void ConvertToString( int number ) // هذه الدالة تقوم بتحويل رقم صحيح إلى نص
{
..
.
}
void ConvertToString( float number ) // بتحويل عدد حقيقي إلى نص هذه الدالة تقوم
{
..
.
}
لاحظ في المثالين السابقين أن اسم الدالتين واحد ولكن الذي يختلف ھو متغير الدالة أو ما يسمى ) البارامتر ) ففي
الدالة الأولى نجده من النوع int والثانية نجده من النوع ..float أي عندما نريد استدعاء الدالة فإن المترجم ينظر إلى نوع البارامتر الذي وضعناه في الدالة ويستدعي الدالة المناسبة ..
كود:
int intNum = 123 ;
float floatNum = 147.25 ;
ConverToString( floatNum ) ; // هنا قمنا باستدعاء الدالة السابقة ووضعنا البارامتر من نوع float
المترجم سوف يستدعي لنا الدالة التي تقوم بتحويل عدد حقيقي إلى نص فهنا //
أي أن التحميل الزائد للدوال ھو أن يكون في البرنامج دالتين أو أكثر لھما نفس الاسم لكنھما يختلفان في أنواع
البارامترات ( متغيرات الدالة )
كتابة أول برنامج في #C :
أظنكم في شوق إلى كتابة أول برنامج في #C لكنني أخرت ذلك لمناقشة بعض المفاھيم الأساسية في اللغة.
البرنامج التي سوف نقوم بكتابتھا من الآن وختى الانتھاء من الفئات ھي برامج من نوع Console Aplication
وبعد اتقان مفھوم الفئات سوف ننتقل بإذن الله إلى البرمجة في بي ******s .
اتجه إلى Microsoft Visual Studio .NET ثم اعمل الآتي:
كود:
New - > Project - > Visual C# - > ConsoleApplication .
بعد ذلك قم بالضغط على زر موافق وانتظر لحظات حتى تفتح امامك نافذة فيھا بعض الكتابات قم بمسحھا وألصق الكود التالي:
كود:
using System ;
public class HelloWorldProgram
{
static void Main()
{
Console.WriteLine("Hello World") ;
}
}
بعد ذلك قم بتشغيل البرنامج بالضغط على الزر الأزرق الموجود بالأعلى والذي يرمز إلى التشغيل.
انتهت الدرس الثاني
