Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

أساسيات البرمجةتعريف دوال جديدة

  • مفهوم الدوال
  • أهمية الدوال في المشاريع
  • طريقة تعريف دالة جديدة
  • وضع باراميترات في الدالة
  • الدوال التي ترجع قيمة
  • تمارين شاملة حول الدوال

مفهوم الدوال

فكرة الدالة ( Function ) أنك إذا أردت أن تنفّذ نفس الكود عدة مرات في البرنامج تقوم بكتابة هذا الكود مرة واحدة فقط و تنادي له فقط كلما أردت تنفيذه.

إذاً الدالة عبارة عن كود مجهّز، يتنفّذ فقط عندما تقوم بإستدعائه.


أمثلة على الدوال

الأوامر write() و read() و array() التي كنت تستخدمها في الدروس السابقة عبارة عن دوال قمنا نحن ببرمجتها.

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

أهمية الدوال في المشاريع

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


1- سهولة الصيانة و التطوير

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


2- عدم تكرار الكود نفسه

من أهم أسباب استخدام الدوال في المشروع هو عدم كتابة الكود نفسه مرّتين. ببساطة أي كود تجد أنك تحتاج أن تكتبه نفسه في أكثر من مكان في المشروع الأفضل لك أن تكتبه مرّة واحدة بداخل دالة و تنادي له كلما أردته أن يتنفذ.


3- تقليل الجهد على المبرمج

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

طريقة تعريف دالة جديدة

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

الشكل العام لتعريف دالة في محرر الكود:

function name (parameters)
{
    // statements
}
  • name :  هنا تضع أي إسم تريده للدالة بشرط أن يكون هذا الإسم متاح.
  • parameters :   هنا يمكنك وضع متغيرات، هذه المتغيرات تمرر لها قيم عند استدعاء الدالة.
  • statements :   هنا تضع الأوامر التي تريدها أن تتنفذ عندما يتم استدعاء الدالة.

في المثال التالي قمنا بتعريف دالة إسمها greetings مهمتها طباعة جملة ترحيب.
بعدها قمنا باستدعائها حتى تتنفذ.

مثال

// هنا قمنا بتعريف الدالة
function greetings()
{
write("Hello my friend");
}
// هنا قمنا باستدعاء الدالة حتى تتنفذ
greetings();
// هنا قمنا بتعريف الدالة function greetings() { write("Hello my friend"); } // هنا قمنا باستدعاء الدالة حتى تتنفذ greetings();

سنحصل على النتيجة التالية عند التشغيل.

Hello my friend

تجربة الكود


إذا لم تقم باستدعاء الدالة فإنها لن تتنفذ أبداً.

في المثال السابق، إذا قمت بحذف السطر الأخير الذي قمنا فيه باستدعاء الدالة greetings() فإنه لن يظهر أي شيء في نتيجة التشغيل لأن الدالة لن تتنفذ.

وضع باراميترات في الدالة

الباراميتر ( Parameter ) عبارة عن متغير أو مصفوفة يتم تعريفها بين أقواس الدالة و بالطبع يمكنك وضع أكثر من باراميتر مع الإشارة إلى أنه يجب وضع فاصلة بين كل بارميترَين.

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


إضافة أول باراميتر

في المثال التالي قمنا بتعريف دالة إسمها greetings وضعنا فيها باراميتر إسمه name.
مهمة هذه الدالة طباعة جملة ترحيب لإسم الشخص الذي نمرره لها مكان الباراميتر name.

بعدها قمنا باستدعاء الدالة مرتين مع تمرير إسم مختلف لها في كل مرة.

المثال الأول

function greetings(name)
{
write("Hello " + name + "\n");
}
greetings("Ramy");
greetings("Sandy");
function greetings(name) { write("Hello " + name + "\n"); } greetings("Ramy"); greetings("Sandy");

سنحصل على النتيجة التالية عند التشغيل.

Hello Ramy
Hello Sandy

تجربة الكود


شرح الكود

الفيديو التالي يشرح طريقة عمل الكود خطوة خطوة.



إضافة ثاني باراميتر

هنا قمنا بإعادة المثال السابق مع إضافة باراميتر ثاني على الدالة greetings إسمه isMale.

الدالة greetings أصبحت تقوم بالتالي:

  • إذا كانت قيمة isMale تساوي true فإنها تطبع رسالة ترحيب للإسم المدخل في المتغير name بصيغة المذكر.
  • إذا كانت قيمة isMale تساوي false فإنها تطبع رسالة ترحيب للإسم المدخل في المتغير name بصيغة المؤنث.

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

المثال الثاني

function greetings(name, isMale)
{
if (isMale == true)
{
write("Hello mr." + name + "\n");
}
else if (isMale == false)
{
write("Hello ms." + name + "\n");
}
}
greetings("Ramy", true);
greetings("Sandy", false);
function greetings(name, isMale) { if (isMale == true) { write("Hello mr." + name + "\n"); } else if (isMale == false) { write("Hello ms." + name + "\n"); } } greetings("Ramy", true); greetings("Sandy", false);

سنحصل على النتيجة التالية عند التشغيل.

Hello mr.Ramy
Hello ms.Sandy

تجربة الكود


شرح الكود

الفيديو التالي يشرح طريقة عمل الكود خطوة خطوة.



وضع قيمة إفتراضية في الباراميتر

هنا قمنا بإعادة المثال مع جعل قيمة الباراميتر isMale إفتراضياً هي true و هذا يعني أنك إن قمت باستدعاء الدالة و لم نمرر لها قيمة فسيتم إعتبار أننا مررنا له القيمة true.

بعدها قمنا باستدعاء الدالة ثلاث مرات مع تمرير قيم مختلفة لها في كل مرة. و لاحظ أننا في المرة الثالثة لم نمرر لها قيمة مكان الباراميتر isMale فتم تمرير القيمة الإفتراضية true بشكل تلقائي.

المثال الثالث

function greetings(name, isMale=true)
{
if (isMale == true)
{
write("Hello mr." + name + "\n");
}
else if (isMale == false)
{
write("Hello ms." + name + "\n");
}
}
greetings("Ramy", true);
greetings("Sandy", false);
greetings("Saleh");
function greetings(name, isMale=true) { if (isMale == true) { write("Hello mr." + name + "\n"); } else if (isMale == false) { write("Hello ms." + name + "\n"); } } greetings("Ramy", true); greetings("Sandy", false); greetings("Saleh");

سنحصل على النتيجة التالية عند التشغيل.

Hello mr.Ramy
Hello ms.Sandy
Hello mr.Saleh

تجربة الكود


شرح الكود

الفيديو التالي يشرح طريقة عمل الكود خطوة خطوة.


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

الدوال التي ترجع قيمة

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


الفرق بين النوعين

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

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


الكلمة return

لإرجاع قيمة من الدالة نستخدم الكلمة return.

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

مثال

function toMeter(num)
{
var result = num / 100;
return (result);
}
var cm = 156;
var m = toMeter(cm);
write(cm + "cm = " + m + "m");
function toMeter(num) { var result = num / 100; return (result); } var cm = 156; var m = toMeter(cm); write(cm + "cm = " + m + "m");

سنحصل على النتيجة التالية عند التشغيل.

156cm = 1.56m

تجربة الكود


شرح الكود

الفيديو التالي يشرح طريقة عمل الكود خطوة خطوة.

تمارين شاملة حول الدوال


التمرين الأول

أكتب دالة إسمها printSum، تعطيها عددين صحيحين عند إستدعائها، فتقوم بطباعة ناتج جمع هذين العددين فقط.
بعدها أطلب من المستخدم إدخال عددين, ثم قم باستدعائها لطباعة ناتج جمع هذين العددين.

الحل و التفسير


التمرين الثاني

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

الحل و التفسير


في حال كان الباراميتر عبارة عن مصفوفة فإن مفسر الكود يتعامل بشكل مباشر مع المصفوفة الأصلية التي يتم تمريرها للدالة و ليس مع نسخة منها كما يفعل مع البارميترات التي نضع فيها قيم عادية.

إذاّ الباراميتر في هذه الحالة يصبح بمثابة مرجع ( Reference ) للمصفوفة الأصلية، أي كأنه إسم ثاني يمكن من خلاله التعامل مع المصفوفة الأصلية.

لا تقلق إن لم تفهم المقصد من هذه الملاحظة لأنك ستفهمها من خلال مشاهدة الفيديوهات الموضوعة في التمارين التالية.


التمرين الثالث

أكتب دالة إسمها printAvg، يعطيها المستخدم علاماته المدرسية، فتحسب له معدله، ثم تطبع له نتيجته كالتالي:

  • إذا كان معدله بين 10 و 20 ستطبع أنه ناجح.
  • إذا كان معدله أقل من 10 ستطبع أنه راسب.

بعدها قم بتخزين أسماء المواد التي ستطلب من المستخدم إدخال علامات لها في مصفوفة إسمها methods.
ثم أطلب من المستخدم إدخال علامة بين 0 و 20 لكل مادة منهم و خزّن العلامات التي سيدخلها المستخدم في مصفوفة إسمها notes.
في الأخير قم باستدعاء الدالة printAvg() لطباعة معدل و نتيجة المستخدم.

الحل و التفسير


التمرين الرابع

أكتب دالة إسمها findFirst و فيها باراميترين، الأول عبارة عن مصفوفة أعداد و الثاني عبارة عن عدد عادي.
مهمة الدالة هي معرفة إذا كان هذا العدد موجود في المصفوفة و لو مرة واحدة فقط.
إذاً ستستمر الدالة بفحص قيم عناصر المصفوفة إلى أن تجد عنصر واحد يحتوي على نفس قيمة المتغير.
في حال وجدت الدالة عنصر في المصفوفة يملك قيمة تساوي قيمة المتغير ستوقف عملية البحث, و ستعرض رقم فهرس ( index ) أول عنصر وجدت فيه القيمة المطلوبة.

بعدها قم بإنشاء مصفوفة ذات بعد واحد إسمها numbers تحتوي على قيم أولية.
ثم أطلب من المستخدم إدخال أي عدد.
في الأخير قم باستدعاء الدالة findFirst() لطباعة ما إذا كان الرقم الذي أدخله المستخدم موجود في المصفوفة أم لا.

الحل و التفسير


التمرين الخامس

أكتب دالة إسمها findAll و فيها باراميترين, الأول عبارة عن مصفوفة أعداد و الثاني عبارة عن عدد عادي.
مهمة الدالة هي معرفة كم عنصر في المصفوفة يملك نفس قيمة هذا العدد.
إذاً ستقوم الدالة بمقارنة جميع قيم عناصر المصفوفة مع قيمة هذا العدد. و كل عنصر تجد قيمته تساوي قيمة هذا العدد, ستعرض رقم فهرس ( index ) العنصر الذي وجدت فيه القيمة.

بعدها قم بإنشاء مصفوفة ذات بعد واحد إسمها numbers تحتوي على قيم أولية.
ثم أطلب من المستخدم إدخال أي عدد.
في الأخير قم باستدعاء الدالة findAll() لطباعة رقم فهرس ( index ) كل عنصر في المصفوفة يحتوي على نفس قيمة هذا العدد.

الحل و التفسير