📘 شرح الدرس الوحدة 4: الدوال واستراتيجيات الحل · الدرس 9 من 17
الدرس 9
📋 في الخطة: الوحدة 7. الدوال والبرمجة الوظيفية

الدوال

كتلة من الأوامر لها اسم ووظيفة، نكتبها مرة واحدة ونستدعيها كلما احتجنا إليها.

4, 98 sum(a, b, c)return s; 21 argumentsreturn int z = sum(4, 9, 8);
بعد هذا الدرس ستستطيع أن:
  • تشرح مفهوم الدالة وفوائد استخدامها في تنظيم البرنامج.
  • تعرّف دالة وتستدعيها، بمعاملات أو بدونها.
  • تكتب دالة تعيد قيمة باستخدام return.
  • تستدعي دوال جاهزة من المكتبات مثل Math و String.

١ما هي الدالة؟

تُسمّى دالة function أو طريقة method: كتلة من التعليمات البرمجية لها اسم ووظيفة، تُستدعى باسمها، وقد تُمرَّر لها بيانات لتعمل عليها. وتُعرَّف دائمًا داخل كلاس.

أجزاء رأس الدالة (توقيعها signature)

publicمحدد الوصول
staticثابتة
intنوع القيمة الراجعة
sumاسم الدالة
(int x, int y)المعاملات
الصيغة العامة
access static return_type method_name(parameters){    statement1;    statement2;}
الجزءمعناه
public / private / protectedمحدد الوصول: من يستطيع استدعاء الدالة. إن لم يُكتب يكون default.
staticتُستدعى مباشرة دون إنشاء كائن (نحتاجها الآن لأننا نستدعي من main الثابتة).
void / int / String …نوع القيمة التي تعيدها الدالة، و void تعني «لا تعيد شيئًا».
الاسميتبع قواعد تسمية المتغيرات.
المعاملاتمتغيرات تستقبل البيانات المرسلة عند الاستدعاء، وتُعامل كمتغيرات محلية.

٢لماذا نكتب دوالًّا؟

♻️ إعادة الاستخدامتُكتب مرة واحدة وتُستدعى مرات عديدة.
🧩 فرّق تسُدتقسيم المسألة الكبيرة إلى وحدات صغيرة يسهل كتابتها وتتبّعها وصيانتها.
✂️ أسطر أقلتفادي تكرار الأوامر التي تؤدي المهمة نفسها.
🎁 التجريدتستدعي الدالة بالطريقة الصحيحة دون أن تهتم بتفاصيل عملها الداخلية.

٣إنشاء الدالة واستدعاؤها

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

🔎 تتبّع: كيف ينتقل التنفيذ إلى الدالة ويعود؟
Methods.java
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");    }}
Variables · المتغيّرات في الذاكرة
Output×

ويمكن استدعاء الدالة نفسها عدة مرات: write_msg(); write_msg(); write_msg();

٤المعاملات parameters والوسيطات arguments

Methods.java
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);    }}
Output – JavaApplication (run)×
run:
15
11
BUILD SUCCESSFUL (total time: 0 seconds)
المعامل parameterالوسيطة argument
أين؟في رأس الدالة عند تعريفهافي جملة الاستدعاء
ما هو؟متغير يستقبل القيمةالقيمة الحقيقية المرسلة
في المثالa , b في الدالة sum8 , 3 عند الاستدعاء في السطر 5

شروط الاستدعاء الصحيح

٥دالة تعيد قيمة

نضع نوع القيمة بدل void، ونعيد النتيجة بالكلمة return.

Methods.java
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;    }}
Output – JavaApplication (run)×
run:
11
15
21
BUILD SUCCESSFUL (total time: 0 seconds)

٦الدوال الرقمية: كلاس 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 أُس bMath.pow(2, 3) → 8.0
Math.random()عدد عشوائي من 0 إلى أقل من 1Math.random() → 0.42…
Math.sqrt(x)الجذر التربيعيMath.sqrt(25) → 5.0
Math.abs(x)القيمة المطلقة (بلا إشارة سالبة)Math.abs(-7) → 7
مختبر Math
,,;

تحويل نصّ إلى رقم: Integer.parseInt

إذا كان الرقم مخزّنًا نصًّا مثل "25" فلا يمكن جمعه حسابيًّا؛ نحوّله أولًا بـ Integer.parseInt (ولعشري: Double.parseDouble).

Main.java
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
Output – JavaApplication (run)×
run:
30
5.0
7
BUILD SUCCESSFUL (total time: 0 seconds)

٧الدوال النصية: String

تُستدعى على المتغيّر النصّي نفسه: s.اسم_الدالة(...)

مستكشف النصوص

اكتب أي نصّ، وحرّك المؤشّرات. المربّع المحاط هو charAt، والمظلَّل هو substring.

String";
charAtsubstring منإلى (لا يشمله)

٨مثال شامل

Functions.java
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    }}
Output – JavaApplication (run)×
run:
9
42.17093318705812
8.0
10
HELLO JAVA
Hello
true
BUILD SUCCESSFUL (total time: 0 seconds)

السطر الثاني في الناتج يتغيّر في كل تشغيل لأنه عشوائي (عدد من 0 إلى أقل من 100).

توقّع وتحقّق

اختر الإجابة الصحيحة:
لدينا تعريف الدالة

snippet
static void myFunction() { }

الاستدعاء الصحيح لها من داخل دالة main هو:

نكتب اسم الدالة ثم قوسين ثم فاصلة منقوطة.

دالة تستقبل ثلاثة أعداد وتعيد أكبرها، ما نوع القيمة المرجعة لها؟

تعيد عددًا صحيحًا، وتنتهي بـ return max;

تأمل الكود التالي،
ماذا سيكون الناتج عند تنفيذه؟

snippet
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);}
استُدعيت الدالة بالقيمة 2 للمعامل x، فتتكرر الحلقة مرتين.

ما ناتج "Java".charAt(1)؟

الترقيم يبدأ من 0: J=0, a=1.

ما ناتج "Programming".substring(0, 3)؟

من 0 حتى 3 دون أن يشمل 3: المواضع 0 و1 و2.

ما ناتج Math.round(2.4)؟

لمقارنة محتوى نصّين نستخدم:

الخلاصة

تحدٍّ برمجي: محلّل النصوص

متوسط

حلّل النص "Java Programming" باستخدام الدوال الجاهزة، واحسب جذرًا تربيعيًّا.

المطلوب:
  • اطبع طول النص، ثم النص بأحرف كبيرة.
  • اطبع أوّل حرف وآخر حرف (استخدم length() لمعرفة موضع الآخر).
  • اطبع الجذر التربيعي لـ 144.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

Analyzer.java
public class Analyzer{    public static void main(String[] args)    {        String s = "Java Programming";         // اكتب أوامر التحليل هنا     }}
Output – المطلوب×
الطول: 16
JAVA PROGRAMMING
أول حرف: J
آخر حرف: g
الجذر: 12.0
💡 تلميح 1
آخر حرف موضعه s.length() - 1 لأن الترقيم يبدأ من 0.
💡 تلميح 2
Math.sqrt تعيد عددًا عشريًّا (double).

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

Analyzer.java
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));    }}

🧪 تدريبات المذكرة العملية

التدريب العملي 34: الدوال النصيةمن مذكرة العملي: المسألة، والخوارزمية، والمخرجات، والحل.افتح التدريب ←التدريب العملي 35: إنشاء دوال واستدعاؤهامن مذكرة العملي: المسألة، والخوارزمية، والمخرجات، والحل.افتح التدريب ←التدريب العملي 36: دالة تعيد قيمة ودالة بمعاملينمن مذكرة العملي: المسألة، والخوارزمية، والمخرجات، والحل.افتح التدريب ←انتقل إلى تقييم الدرسأسئلة الاختيار، وصح وخطأ، وأكمل الفراغات، والأسئلة العملية.ابدأ التقييم ←