C# .Netالبرمجةتطوير الألعاب

#14 الدوال Methods – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : OXW

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  الدوال Methods

 

السلام عليكم و رحمة الله و بركاته ، و أهلا بكم في درس جديد من دروس سلسلة تعلم البرمجة لمبتدئين كلياً بواسطة السي شارب

درس اليوم ” الدوال الـ Method “

و هي من أساسيات البرمجة و هي التي أعطت للمطورين إمكانية أن يقوم بتنفيذ مشروعه دون أن يقوم بتكرار الأسطر البرمجية أكثر من مرة

سابقاً لم يكن هناك دوال و كان المطور مجبراً على كتابة أسطر برمجية متتالية ، فتجد أن البرنامج عبارة عن 1000 سطر على سبيل المثال ، كلها متتالية حيث ينفذ السطر الأول ثم الثاني فالثالث و هكذا ….. مما كان يجعل الأمر صعباً

و خصوصاً في حال وجود أي خطأ في البرنامج فيجب أن يقوم بتتبع للبرنامج ليصل إلى مكان الخطأ

 

كما تعلمنا في كل الدروس السابقة نقوم بإنشاء مشروع جديد و نختار Visual C# ثم Console Application و سنكتب اسم البرنامج هذه المرة ” Methods ”
و تكلمنا أنه يجب أن نقوم بالبدء بالكتابة بين قوسي الدالة void Main

لكن في هذا الدرس سنتعرف إلى طريقة جديدة و مفهوم جديد يمكننا بواسطته إنشاء دوال .

و الدالة يمكن شرحها بأنها قطعة برمجية  Block of Code تبدأ بقوس و تنتهي بقوس آخر ، و تحمل اسم , حيث يتم استدعاء هذا الاسم لتقوم بالعمل الخاص بها .

لاحظو الدالة الرئيسية void Main و هي الدالة التي يبدأ بها الـبرنامج

سنقوم الآن بكتابة دالة رئيسية و سنقوم بشرحها و شرح التركيبة الخاصة بها

هذه الدالة يمكن استخدامها و استدعاؤها في الدوال الأخرى كالتالي :

أخذ اسم الدالة (PrintMessage) ثم فتح القوس الخاص بها و اغلاقه و كتابة الفاصلة المنقوطة .

و لا ننسى أن نقوم بكتابة الدالة ReadLine

عند تشغيل التطبيق سيقوم بطباعة Hello World !

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

شرح الدالة

في البداية يجب أن تقوم بكتابة الدالة خارج الـ void Main  لأنه لا يمكن كتابة دالة داخل دالة

لذلك إذا أردت كتابة دالة فيجب كتابتها خارج الدوال الأخرى

الترتيب غير مهم هنا و هذا يعني أنه بإمكانك كتابتها قبل أو بعد الـ void Main

و عند الحاجة إليها أقوم بكتابة اسمها دون كتابة الأسطر البرمجية الموجودة بداخلها

 

فوائد الدوال :

(1) : استدعاء أسطر برمجية يتم كتابتها أكثر من مرة ، بحيث تقوم بكتابتها مرة واحدة داخل الدالة ثم تقوم باستدعاء الدالة في كل مرة تحتاج إلها .

(2) : عدم تكرار الأسطر البرمجية نفسها

(3) : تقوم بتنظيم المشروع

(4) : في حال حصول أي مشكلة يمكن تعديلها بشكل بسيط في مكان واحد دون تتبع التطبيق بشكل كامل

 

هذه القضايا سنتكلم عنها في الدروس القادمة و سنتحدث الآن عن الدالة void

 

 

الـ void هي نوع من أنواع البيانات أو أنواع الـ Data مثل integer  و  string

لكنها لا تعود بقيمة و سنتعرف عليها بعد قليل

يمكننا نقل السطر ;()Console.ReadLine إلى الدالة التي قمنا بإنشائها

 

هذا التطبيق يعد بسيطاً ، لذلك سنأخذ برنامجاً قمت بكتابته سابقاً ، و هو يحتوي على تكرار للاسطر البرمجية و سنقوم بإضافة الدوال  لتحسينه و ترتيبه بشكل أفضل

 

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

لدينا الآن أسطر برمجية مكررة في هذا التطبيق ، حيث يقوم بطباعة جملة ثم يقوم بمطالبة المستخدم بعملية إدخال و يكرر هذا الأمر

ثم يقوم بتعريف Array من النوع char  ثم يأمر بتحويلها إلى مصفوفة ثم يقوم بعملية عكس لهذه المصفوفة

إذا لدينا ثلاث أسئلة و لكل سؤال 4 عمليات

و بالتالي لدينا تقريباً 12 سطر

و في النهاية يقوم بتعريف متغير جديد باسم result

و يقوم باستخدام الحلقة foreach ليقوم بأخذ هذه الأحرف و يجمعها ليعطي هذه النتيجة

نلاحظ عند تشغيل التطبيق أنه أخذ كلمة كلمة و لم يعكس الجملة كاملة ، حيث قمت بإدخال Osama  ثم  Deep ثم amman

فأخذ الاسم الأول و قام بعكسه ، ثم أضاف مسافة قبل الاسم الثاني ثم تابع أخذ الاسم الثاني و المدينة ،

عندها قام بإعطاء النتيجة كالتالي

Result : amaso peed namma

لنرى كيف نكتب دالة توفر علينا هذا الكم من الكتابة ، فبدلاً من كتابة 16 سطر سنقوم بكتابة 4 اسطر فقط و استدعاء هذه الدالة

 

الآن نقوم بتعريف دالة جديدة

ثم نكتب التالي ضم قوسي الدالة {   }

كما في المثال التالي :

 

في البداية سنقوم بالتطبيق على الـ firstName فقط ، سنستدعي الدالة ليقوم بعرض الموجود داخلها .

المتغير الأول هو السؤال و المتغير الثاني هو ناتج المدخل

الآن سيقوم بطباعة السؤال و ثم يكون بعملية عكس للأحرف المدخلة في الجواب

حيث يقوم بتحويله لمجموعة من character  و اسنادها في متغير جديد ثم يقوم بعكسها باستخدام الدالة Array.Reverse

و في النهاية سيقوم بطباعة firstNameArray

الآن لدينا الجزء المتكرر في كل المراحل السابقة و قد أصبح ضمن الدالة التي قمنا بإنشائها

الآن نقوم بعملية استدعاء للدالة التي قمنا بإنشائها

عندها سيسأل عن الاسم الأول و يطلب إدخاله ، و سيأخذ القيمة من المستخدم و يدخلها في متغير نصي  و يتابع

عند تشغيل التطبيق سيسأل عن الاسم و عند ادخال osama  يقوم بطباعة osama لكن بالشكل المعكوس … أي  amaso

 

الآن لنلاحظ أن هذه الدالة هي من النوع void و تقوم بتنفيذ الاسطر الموجودة بدون ارجاع أي قيمة أخرى

لاحظوا أنه سيكون لدينا مشكلة إذا قمنا بكتابة هذه الدالة للاسم الثاني و اسم المدينة

المشكلة هي أنه إذا قمت باستدعاء اسم الدالة فعندها سيقوم بطباعة الاسم الأول لوحده ، و نحن لا نريد هذا

نحن نريد أن يقوم بإرجاع القيمة الناتجة و استخدامها لاحقا

 

فقد تكلمنا أن الـ void لا يرجع أي قيمة ، لكن بإمكاننا استبدال هذا النوع بـ string

أي أن هذه الدالة ستقوم بعمليات معينة ثم ستعيد نصاً إلى مكان استدعائها

 

بما أن هذه الدالة أصبحت من النوع string  و ليس void  فيجب أن ترجع قيمة و بالتالي ستحتوي على return لشيء ما في نهايتها

و القيمة التي نريد ارجاعها هي النص الموجود لدينا  فيصبح السطر الأخير :

;Return string.concat(firstNameArray)

عندها سيكون هذا السطر راجعاً من الدالة DisplayResult

أي أنني في الأعلى يمكنني أن أقوم بتعريف

;()string firstName = DisplayResult

و النوع الموجود قبل إشارة المساواة من النوع string وبالتالي DisplayResult ذات الأمر ، لأن الدالة الموجودة في الأسفل من النوع string و النتيجة الراجعة من النوع string

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

 

فعلا قام التطبيق بطباعة osama  بشكل معكوس

سنلاحظ بعد قليل أن هذه الدالة قامت باختصار كاف الاسطر السابقة

 

و نتذكر أن الدوال من الممكن أن تكون int , string أو أي نوع من أنواع البيانات و يمكن أن تكون دالة لا ترجع قيمة مثل void

الشرط الأساسي أنه إذا لم تكن من النوع void فيجب عليك أن تقوم بإرجاع قيمة و هذه الدالة قامت بعمليات معينة و قامت بإرجاع الناتج النهائي
يمكننا الحصول على القيمة المرجعة عن طريق وضعها على الجانب الأيمن لإشارة المساواة في السطر الذي قمنا به باستدعاء الدالة و سيتم تخزينها مباشرة في firstName

الآن أريد استخدام هذه الدالة ليس فقط لطباعة الاسم الأول
بل لطباعة الاسم الأول و الأخير و السؤال عن المدينة التي ولد فيها

إذا في الدالة يمكنك أن تقوم بإرسال قيمة
لذلك سنقوم بتعريف متغير جديد

عندما نقوم باستدعاء الدالة يجب أن نرسل قيمة يتم ارسالها إلى الدالة

 

لذلك سنقوم بحذف السؤال في الدالة و نجعله قادماً من مكان استدعائها

إذا سنأخذ المتغير question و نضعه بعد string  بين قوسي الدالة (  )

الناتج كالتالي

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

 

الآن قمنا بإرسال هذا النص إلى الدالة و قام بطباعته و استخدام القيمة المرسالة مع هذه الدالة

نقوم بتعريف متغير جديد اسمه lastName ، و سأسأله سؤال ” ما هو اسمك الأخير” و القيمة الراجعة من الدالة سيقوم بإسناده للمتغير lastName
ثم نسأله عن مكان الولادة

لاحظو أن هذه الثلاث أسطر هي فعليا 12 سطر
لنتأكد أن القيمة الراجعة صحيحة

ثم نقوم بطباعة الناتج النهائي

بتشغيل التطبيق سيسأل عن الاسم الأول و الأخير و المدينة ، و سيقوم بعرض ذات النتيجة التي عرضها في التجربة الأولى

في حال حدوث مشكلة لا يجب تتبع الأسطر كلها ، بل نقوم بتتبع أسطر الدالة القليلة
حيث استخدمناها لتقليل عدد الأسطر

 

نصل الآن لنهاية هذا الدرس ، ألقاك في الدرس التالي إن شاء الله

 

ملخص الدرس :

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الرابع عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على  الدوال Methods أو ما يسمى Function في لغات أخرى، والتي تعتبر العصب الرئيسي الذي يقوم عليه أي تطبيق ولا يخلو منها.

الدوال Methods :

يمكن تعريف الدالة على أنها قطعة برمجية Code Block تبدأ بجملة تعريفية بإسمها ونوعها سواء كانت نصية string أو رقمية int أو لا ترجع أي قيمة void أو أي نوع آخر. والدوال لها العديد من الميزات أهمها:
– تقليل عدد التكرارات الموجودة في التطبيق، وبالتالي قلة عدد الأسطر الإجمالي.
– تنظم المشروع، بحيث تكون الأسطر البرمجية الخاصة بعملية معينة في مكان واحد.
– سهولة إيجاد المشاكل المنطقية في حال وجودها لاحقاً.
و طريقة كتابة الدالة هكذا :
Method_Type Method_Name ()
}
{

خصائص الدوال :

كما ذكرنا قبل قليل، إن كانت الدالة غير النوع void ( لا ترجع أي قيمة)، أي أنها من النوع int أو string أو float أو أي نوع آخر، فيجب أن تقوم بإضافة سطر return value في نهايتها ويمكن الحصول على العائد من الدالة بعملية الإسناد، أيضاً يمكن إرسال قيم عند مناداة الدالة لإستخدامها داخل الدالة وهي ما تدعى arguments أو parameters ، وهي متغيرات يتم إستخدامها داخل الدالة للقيام بالمهمة الموكلة لها.

مصطلحات الدرس :

Methods :

Block of Code :

return :

float :

arguments :

parameters :

الأسطر البرمجية التي تم إستخدامها في الدرس :

مقالات ذات صلة

‫11 تعليقات

  1. السلام عليكم كل الشكر استاذ اسامة
    بصراحة تابعت الدورس معك وكان واضح لالي انو هدفي رح يتحقق عالمدى البعيد واثناء انشغالك توقفت وعندما رجعت لاتمام الدروس طلب مني البرنامج product key
    المشكلة في سورية من الصعب والمكلف شراء البرنامج اذا الحل كراك ..وبصراحة لم اجد كراك يعمل هل يمكنك المساعدة ؟

    1. وعليكم السلام ورحمة الله وبركاته
      البرنامج يحتوي على نسخة مجانية إسمها visual studio community حاول تنزيلها

  2. السلام عليكم
    كل الشكر يا ا / اسامة على كل هذا المجهود الرائع , ولى سؤال اذا سمحت لى : لا استطيع فهم معنى ان تكون الدالة void لا ترجع قيمة والاخريات يرجعن قيمة
    ولك جزيل الشكر

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

  3. يعطيك العافية
    ماهو عمل الدالة CONCAT
    وماهو عم الدالة FORMAT في غير مثال
    ولو سمحت مازال شرح VOID و STRING في METHOD غير مفهوم
    هل من مثال يوضح الاختلاف او الخطأ الذي يظهر

    1. concat تقوم بربط شيئين ببعض، و Format تقوم بتهيئة النص في شكل تختاره أنت. بالنسلة للباقي قم بإعادة الدروس لتفهمها أكثر.

    1. لا يوجد فائدة سوى معرفة كيفية القيام بذلك لإستخداماتها في موضوع الترتيب في المستقبل

    1. يمكن عملها من خلال المصفوفات.

      public static string Reverse( string s )
      {
      char[] charArray = s.ToCharArray();
      Array.Reverse( charArray );
      return new string( charArray );
      }

  4. سلام عليكم
    اخي كيف اعمل هذه الدالة لو سمحت
    private void btnTafels_Click(object sender, EventArgs e)
    {

    /*int iBaseNr = Convert.ToInt32(txtBaseNr.Text);
    string sText = “”;
    for (int i = 1; i <= 10; i++)
    {
    sText += iBaseNr + " x " + i + " = " + iBaseNr*i + "\r\n";
    }

    {
    txtResult.Text = sText.Trim();

    }*/

    }
    private string Tafels()
    {
    txtResult.Text = Tafels().Trim();

    {
    return sText;
    }

    }

    }
    }

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى