الدوال
كتلة من الأوامر لها اسم ووظيفة، نكتبها مرة واحدة ونستدعيها كلما احتجنا إليها.
- تشرح مفهوم الدالة وفوائد استخدامها في تنظيم البرنامج.
- تعرّف دالة وتستدعيها، بمعاملات أو بدونها.
- تكتب دالة تعيد قيمة باستخدام return.
- تستدعي دوال جاهزة من المكتبات مثل Math و String.
١ما هي الدالة؟
أجزاء رأس الدالة (توقيعها signature)
access static return_type method_name(parameters){ statement1; statement2;}
| الجزء | معناه |
|---|---|
public / private / protected | محدد الوصول: من يستطيع استدعاء الدالة. إن لم يُكتب يكون default. |
static | تُستدعى مباشرة دون إنشاء كائن (نحتاجها الآن لأننا نستدعي من main الثابتة). |
void / int / String … | نوع القيمة التي تعيدها الدالة، و void تعني «لا تعيد شيئًا». |
| الاسم | يتبع قواعد تسمية المتغيرات. |
| المعاملات | متغيرات تستقبل البيانات المرسلة عند الاستدعاء، وتُعامل كمتغيرات محلية. |
٢لماذا نكتب دوالًّا؟
٣إنشاء الدالة واستدعاؤها
لاستدعاء دالة نكتب اسمها ثم قوسين ثم فاصلة منقوطة. ينتقل التنفيذ إلى جسمها، ثم يعود إلى السطر التالي.
package methods;public class Methods { public static void main(String[] args) { write_msg(); System.out.println("Hi. I am the main () function"); write_msg(); write_msg(); } static void write_msg(){ System.out.println("Hello. This is the write_msg() function"); }}
ويمكن استدعاء الدالة نفسها عدة مرات: write_msg(); write_msg(); write_msg();
٤المعاملات parameters والوسيطات arguments
package methods;public class Methods { public static void main(String[] args) { sum(2, 4, 9); sum(8, 3); } static void sum(int a, int b){ System.out.println(a + b); } static void sum(int a, int b, int c){ int s = a + b + c; System.out.println(s); }}
| المعامل parameter | الوسيطة argument | |
|---|---|---|
| أين؟ | في رأس الدالة عند تعريفها | في جملة الاستدعاء |
| ما هو؟ | متغير يستقبل القيمة | القيمة الحقيقية المرسلة |
| في المثال | a , b في الدالة sum | 8 , 3 عند الاستدعاء في السطر 5 |
شروط الاستدعاء الصحيح
- عدد الوسيطات يساوي عدد معاملات الدالة.
- تتوافق (تتطابق) أنواع البيانات بين الوسيطات والمعاملات.
٥دالة تعيد قيمة
نضع نوع القيمة بدل void، ونعيد النتيجة بالكلمة return.
package methods;public class Methods { public static void main(String[] args) { sum(8, 3); System.out.println( sum(2, 4, 9) ); int z = sum(4, 9, 8); System.out.println(z); } static void sum(int a, int b){ System.out.println(a + b); } static int sum(int a, int b, int c){ int s = a + b + c; return s; }}
- إذا كانت الدالة تعيد قيمة فاستقبلها في متغير من النوع نفسه (السطر 6)، أو أرسلها إلى دالة الطباعة (السطر 5).
- إذا كانت لا تعيد قيمة (void) فلا يمكنك استقبال قيمة منها.
٦الدوال الرقمية: كلاس Math
تُستدعى باسم الكلاس مباشرة: Math.اسم_الدالة(...)
| الدالة | الوظيفة | مثال ← الناتج |
|---|---|---|
Math.max(a, b) | الأكبر بين رقمين | Math.max(5, 9) → 9 |
Math.min(a, b) | الأصغر بين رقمين | Math.min(5, 9) → 5 |
Math.round(x) | التقريب لأقرب عدد صحيح | Math.round(3.6) → 4 |
Math.pow(a, b) | الأُسّ: a أُس b | Math.pow(2, 3) → 8.0 |
Math.random() | عدد عشوائي من 0 إلى أقل من 1 | Math.random() → 0.42… |
Math.sqrt(x) | الجذر التربيعي | Math.sqrt(25) → 5.0 |
Math.abs(x) | القيمة المطلقة (بلا إشارة سالبة) | Math.abs(-7) → 7 |
تحويل نصّ إلى رقم: Integer.parseInt
إذا كان الرقم مخزّنًا نصًّا مثل "25" فلا يمكن جمعه حسابيًّا؛ نحوّله أولًا بـ Integer.parseInt (ولعشري: Double.parseDouble).
int n = Integer.parseInt("25"); // من نصّ إلى عدد صحيحSystem.out.println(n + 5); // 30 (جمع حسابي)System.out.println(Math.sqrt(n)); // 5.0System.out.println(Math.abs(-7)); // 7
٧الدوال النصية: String
تُستدعى على المتغيّر النصّي نفسه: s.اسم_الدالة(...)
اكتب أي نصّ، وحرّك المؤشّرات. المربّع المحاط هو charAt، والمظلَّل هو substring.
٨مثال شامل
public class Functions{ public static void main(String[] args) { // دوال رقمية System.out.println(Math.max(5, 9)); // 9 System.out.println(Math.random() * 100); // عشوائي System.out.println(Math.pow(2, 3)); // 8.0 // دوال نصية String s = "Hello Java"; System.out.println(s.length()); // 10 System.out.println(s.toUpperCase()); // HELLO JAVA System.out.println(s.substring(0, 5)); // Hello System.out.println(s.contains("Java")); // true }}
السطر الثاني في الناتج يتغيّر في كل تشغيل لأنه عشوائي (عدد من 0 إلى أقل من 100).
توقّع وتحقّق
اختر الإجابة الصحيحة:
لدينا تعريف الدالة
static void myFunction() { }
الاستدعاء الصحيح لها من داخل دالة main هو:
دالة تستقبل ثلاثة أعداد وتعيد أكبرها، ما نوع القيمة المرجعة لها؟
تأمل الكود التالي،
ماذا سيكون الناتج عند تنفيذه؟
static void p(String name, int x) { for (int i = 1; i <= x; i++) System.out.println(i + ". " + name);} public static void main(String[] args) { p("Ali", 2);}
ما ناتج "Java".charAt(1)؟
ما ناتج "Programming".substring(0, 3)؟
ما ناتج Math.round(2.4)؟
لمقارنة محتوى نصّين نستخدم:
الخلاصة
- الدالة مجموعة أوامر لها اسم، نكتبها مرة ونستدعيها مرات.
- الدوال تنظّم البرنامج وتمنع تكرار الكود وتسهّل التصحيح.
- المعاملات parameters تستقبل القيم، والوسيطات arguments تُرسل عند الاستدعاء.
- الدالة التي تعيد قيمة تحدد نوعها وتستخدم return، و void لا تعيد شيئًا.
- مكتبات جافا فيها دوال جاهزة مثل Math.sqrt و length و toUpperCase.
تحدٍّ برمجي: محلّل النصوص
متوسطحلّل النص "Java Programming" باستخدام الدوال الجاهزة، واحسب جذرًا تربيعيًّا.
- اطبع طول النص، ثم النص بأحرف كبيرة.
- اطبع أوّل حرف وآخر حرف (استخدم length() لمعرفة موضع الآخر).
- اطبع الجذر التربيعي لـ 144.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
public class Analyzer{ public static void main(String[] args) { String s = "Java Programming"; // اكتب أوامر التحليل هنا }}
💡 تلميح 1
💡 تلميح 2
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
public class Analyzer{ public static void main(String[] args) { String s = "Java Programming"; System.out.println("الطول: " + s.length()); System.out.println(s.toUpperCase()); System.out.println("أول حرف: " + s.charAt(0)); System.out.println("آخر حرف: " + s.charAt(s.length() - 1)); System.out.println("الجذر: " + Math.sqrt(144)); }}