أخبار الموقع

الدوال والإجراءات في لغة Pascal (Functions et Procedures) — الثانية ثانوي (شعبة تقني رياضي) — الإعلام الآلي

📘 بطاقة الدرس

المادة الإعلام الآلي
المستوى الثانية ثانوي (شعبة تقني رياضي)
الوحدة الخوارزميات والبرمجة — الدوال والإجراءات في لغة Pascal
المدة الزمنية حصتان (ساعتان)

🎯 أهداف التعلم

  • فهم مفهوم الدوال (Functions) والإجراءات (Procedures) في لغة Pascal
  • التفريق بين Function و Procedure ومتى نستخدم كل منهما
  • تعلم كيفية تعريف دالة وإجراء بمعاملات مختلفة
  • فهم آلية تمرير المعاملات بالقيمة (Value) وبالمرجع (Var)
  • كتابة برامج معيارية (Modular) باستخدام الدوال والإجراءات
  • حل تمارين بكالوريا باستخدام الدوال والإجراءات

🔍 تمهيد

في الدروس السابقة تعلمنا كتابة هياكل التحكم (If, Case, For, While) في لغة Pascal، وتعلمنا التعامل مع المصفوفات. لكن ماذا لو كان لدينا برنامج كبير يحتوي على 500 سطر؟ سيكون من الصعب قراءته وتصحيح أخطائه. هنا يأتي مفهوم البرمجة المعيارية (Programmation modulaire) التي تقسم البرنامج إلى وحدات صغيرة تسمى الدوال (Functions) و الإجراءات (Procedures). هذه الوحدات يمكن إعادة استخدامها عدة مرات داخل البرنامج، مما يسهل الصيانة والتطوير. في هذا الدرس سنتعلم كيفية إنشاء واستخدام الدوال والإجراءات في لغة Pascal مع أمثلة تطبيقية وتمارين بكالوريا محلولة.

📦 أولاً: مفهوم الدوال والإجراءات

الدوال والإجراءات هما وحدات برمجية مستقلة تؤدي مهمة محددة. الفرق الأساسي بينهما:

الخاصية الدالة (Function) الإجراء (Procedure)
قيمة الإرجاع ترجع قيمة واحدة (نتيجة) لا يرجع قيمة (مجرد تنفيذ أوامر)
الكلمة المفتاحية Function Procedure
الاستخدام لحساب قيمة (جمع، ضرب، حساب) لتنفيذ عملية (طباعة، ترتيب، إدخال)
كيفية الاستدعاء ضمن تعبير (مثل المتغيرات) كأمر مستقل
مثال Somme := Add(a, b); AfficherResultat(x);

🔧 ثانياً: تعريف الإجراءات (Procedures)

الإجراء هو مجموعة من الأوامر تؤدي مهمة معينة ولا ترجع قيمة. صيغة تعريف الإجراء:

📝 الصيغة العامة للإجراء

Procedure NomProcedure(ListeParamètres);
Var
  { متغيرات محلية }
Begin
  { أوامر الإجراء }
End;

مثال: إجراء لطباعة عنوان البرنامج:

📝 مثال 1: إجراء بدون معاملات

Procedure AfficherTitre;
Begin
  Writeln('═══════════════════════════════');
  Writeln('    برنامج حساب المجموع        ');
  Writeln('═══════════════════════════════');
  Writeln;
End;

// البرنامج الرئيسي
Program TestProcedure;
Begin
  AfficherTitre;  // استدعاء الإجراء
  Writeln('مرحباً بك في البرنامج');
  ReadLn;
End.

مثال: إجراء بمعاملات لحساب مجموع عددين وطباعة النتيجة:

📝 مثال 2: إجراء بمعاملات

Procedure CalculerEtAfficherSomme(a, b: Integer);
Var
  s: Integer;
Begin
  s := a + b;
  Writeln(a, ' + ', b, ' = ', s);
End;

// البرنامج الرئيسي
Program TestSomme;
Var
  x, y: Integer;
Begin
  Write('أدخل العدد الأول: ');
  ReadLn(x);
  Write('أدخل العدد الثاني: ');
  ReadLn(y);
  CalculerEtAfficherSomme(x, y);  // استدعاء الإجراء
  ReadLn;
End.

⚙️ ثالثاً: تعريف الدوال (Functions)

الدالة تشبه الإجراء لكنها ترجع قيمة واحدة (نتيجة). صيغة تعريف الدالة:

📝 الصيغة العامة للدالة

Function NomFonction(ListeParamètres): TypeRetour;
Var
  { متغيرات محلية }
Begin
  { أوامر الدالة }
  NomFonction := ValeurRetour;  // تحديد قيمة الإرجاع
End;

ملاحظة مهمة: يتم تحديد قيمة الإرجاع عن طريق تعيين اسم الدالة نفسه للقيمة المطلوبة (مثل NomFonction := Valeur).

مثال: دالة لحساب مجموع عددين:

📝 مثال 3: دالة بسيطة

Function Somme(a, b: Integer): Integer;
Begin
  Somme := a + b;  // تعيين القيمة المعادة
End;

// البرنامج الرئيسي
Program TestFonction;
Var
  x, y, resultat: Integer;
Begin
  Write('أدخل العدد الأول: ');
  ReadLn(x);
  Write('أدخل العدد الثاني: ');
  ReadLn(y);
  resultat := Somme(x, y);  // استدعاء الدالة وحفظ النتيجة
  Writeln('المجموع = ', resultat);
  ReadLn;
End.

🔄 رابعاً: تمرير المعاملات بالقيمة وبالمرجع

في لغة Pascal يمكن تمرير المعاملات بطريقتين:

النوع الكلمة المفتاحية الوصف مثال
بالقيمة (Passage par valeur) بدون كلمة إضافية ترسل نسخة من المتغير، والتعديلات داخل الدالة/الإجراء لا تؤثر على المتغير الأصلي Procedure Test(x: Integer);
بالمرجع (Passage par référence) Var ترسل عنوان المتغير الأصلي، والتعديلات تؤثر عليه مباشرة Procedure Test(Var x: Integer);

📝 مثال 4: تمرير بالقيمة مقابل تمرير بالمرجع

Procedure ParValeur(x: Integer);
Begin
  x := x * 2;
  Writeln('داخل ParValeur: x = ', x);  // ستظهر القيمة مضاعفة
End;

Procedure ParReference(Var x: Integer);
Begin
  x := x * 2;
  Writeln('داخل ParReference: x = ', x);  // ستظهر القيمة مضاعفة
End;

Program TestPassage;
Var
  a: Integer;
Begin
  a := 5;

  Writeln('قبل ParValeur: a = ', a);  // a = 5
  ParValeur(a);
  Writeln('بعد ParValeur: a = ', a);  // a = 5 (لم يتغير)

  Writeln;
  Writeln('قبل ParReference: a = ', a);  // a = 5
  ParReference(a);
  Writeln('بعد ParReference: a = ', a);  // a = 10 (تغير!)

  ReadLn;
End.

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

💡 خامساً: أمثلة تطبيقية متقدمة

📝 مثال 5: دالة للتحقق من كون العدد أولياً (Premier)

Function EstPremier(n: Integer): Boolean;
Var
  i: Integer;
Begin
  If n < 2 Then
    EstPremier := False
  Else
  Begin
    EstPremier := True;
    For i := 2 To Trunc(Sqrt(n)) Do
      If n Mod i = 0 Then
      Begin
        EstPremier := False;
        Break;
      End;
  End;
End;

Program TestPremier;
Var
  nombre: Integer;
Begin
  Write('أدخل عدداً صحيحاً موجباً: ');
  ReadLn(nombre);
  If EstPremier(nombre) Then
    Writeln(nombre, ' عدد أولي ✅')
  Else
    Writeln(nombre, ' ليس عدداً أولياً ❌');
  ReadLn;
End.

📝 مثال 6: إجراء لتبديل قيمتين (باستخدام Var)

Procedure Echanger(Var a, b: Integer);
Var
  temp: Integer;
Begin
  temp := a;
  a := b;
  b := temp;
End;

Program TestEchange;
Var
  x, y: Integer;
Begin
  x := 10;
  y := 20;
  Writeln('قبل التبديل: x = ', x, ', y = ', y);
  Echanger(x, y);
  Writeln('بعد التبديل: x = ', x, ', y = ', y);
  ReadLn;
End.

📝 مثال 7: دالة لحساب المضروب (Factoriel)

Function Factoriel(n: Integer): LongInt;
Var
  i: Integer;
  f: LongInt;
Begin
  f := 1;
  For i := 1 To n Do
    f := f * i;
  Factoriel := f;
End;

Program TestFactoriel;
Var
  n: Integer;
Begin
  Write('أدخل عدداً لحساب مضروبه: ');
  ReadLn(n);
  Writeln(n, '! = ', Factoriel(n));
  ReadLn;
End.

✏️ سادساً: تمارين بكالوريا محلولة

✏️ تمرين بكالوريا 1: حساب القوة (Puissance)

المطلوب: كتابة دالة في Pascal تحسب قيمة xⁿ (x مرفوع للقوة n) باستخدام حلقة تكرارية، حيث x عدد حقيقي و n عدد صحيح طبيعي.

🟢 انقر هنا لرؤية الحل
Function Puissance(x: Real; n: Integer): Real;
Var
  i: Integer;
  p: Real;
Begin
  p := 1;
  For i := 1 To n Do
    p := p * x;
  Puissance := p;
End;

Program TestPuissance;
Var
  base: Real;
  exposant: Integer;
Begin
  Write('أدخل الأساس (عدد حقيقي): ');
  ReadLn(base);
  Write('أدخل الأس (عدد صحيح موجب): ');
  ReadLn(exposant);
  Writeln(base:0:2, ' ^ ', exposant, ' = ', Puissance(base, exposant):0:2);
  ReadLn;
End.

الشرح: استخدمنا دالة تأخذ معاملين: x من نوع Real و n من نوع Integer. داخل الدالة نكرر الضرب n مرة في حلقة For، ثم نعيد القيمة المحسوبة.

✏️ تمرين بكالوريا 2: إجراء لملء وعرض مصفوفة

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

🟢 انقر هنا لرؤية الحل
Const
  TailleMax = 100;

Type
  Tab = Array[1..TailleMax] Of Integer;

Procedure RemplirTableau(Var T: Tab; n: Integer);
Var
  i: Integer;
Begin
  For i := 1 To n Do
  Begin
    Write('أدخل العنصر ', i, ': ');
    ReadLn(T[i]);
  End;
End;

Procedure AfficherTableau(T: Tab; n: Integer);
Var
  i: Integer;
Begin
  Writeln('عناصر المصفوفة:');
  For i := 1 To n Do
    Write(T[i], ' ');
  Writeln;
End;

Program TestTableau;
Var
  Tableau: Tab;
  taille: Integer;
Begin
  Write('أدخل حجم المصفوفة: ');
  ReadLn(taille);
  RemplirTableau(Tableau, taille);
  AfficherTableau(Tableau, taille);
  ReadLn;
End.

الملاحظات: في إجراء RemplirTableau استخدمنا Var T: Tab (تمرير بالمرجع) لأننا نريد تعديل المصفوفة الأصلية. أما في AfficherTableau فلا حاجة لـ Var لأننا نريد القراءة فقط.

✏️ تمرين بكالوريا 3: دالة للبحث عن عنصر في مصفوفة

المطلوب: كتابة دالة في Pascal تبحث عن قيمة معينة في مصفوفة أحادية البعد، وترجع الموضع (Index) إذا وجدت، وإلا ترجع 0.

🟢 انقر هنا لرؤية الحل
Const
  TailleMax = 100;

Type
  Tab = Array[1..TailleMax] Of Integer;

Function RechercherSeq(T: Tab; n, valeur: Integer): Integer;
Var
  i: Integer;
Begin
  RechercherSeq := 0;  // القيمة الافتراضية: غير موجود
  For i := 1 To n Do
    If T[i] = valeur Then
    Begin
      RechercherSeq := i;
      Break;  // نوقف البحث عند أول وجود
    End;
End;

Program TestRecherche;
Var
  Tableau: Tab;
  taille, valeurCherchee, position: Integer;
Begin
  Write('أدخل حجم المصفوفة: ');
  ReadLn(taille);

  // ملء المصفوفة يدوياً للتبسيط
  For taille := 1 To taille Do
  Begin
    Write('أدخل العنصر ', taille, ': ');
    ReadLn(Tableau[taille]);
  End;

  Write('أدخل القيمة المراد البحث عنها: ');
  ReadLn(valeurCherchee);

  position := RechercherSeq(Tableau, taille, valeurCherchee);

  If position <> 0 Then
    Writeln('العنصر موجود في الموضع: ', position)
  Else
    Writeln('العنصر غير موجود في المصفوفة');

  ReadLn;
End.

✅ سابعاً: نصائح مهمة للبكالوريا

  • تذكر كتابة End; بعد كل دالة/إجراء — هذا خطأ شائع يسبب أخطاء ترجمة.
  • في الدوال: لا تنس تعيين اسم الدالة لقيمة الإرجاع NomFonction := Valeur; قبل نهاية الدالة.
  • في الإجراءات: استخدم Var عندما تريد تعديل قيمة المتغير الأصلي (مثل تبديل قيمتين).
  • المتغيرات المحلية: عرّف المتغيرات داخل الدالة/الإجراء (وليس في البرنامج الرئيسي) لتجنب التداخل.
  • في البكالوريا: تطلب أسئلة الدوال والإجراءات غالباً في التمارين 3 و 4 من موضوع الامتحان — تدرب جيداً عليها.

📋 ملخص الدرس

  • الإجراء (Procedure): وحدة برمجية تنفذ أوامر ولا ترجع قيمة — تستخدم Procedure.
  • الدالة (Function): وحدة برمجية ترجع قيمة واحدة — تستخدم Function وتُعيّن القيمة باسم الدالة.
  • تمرير بالقيمة: نسخة من المتغير — لا تؤثر التعديلات على الأصل.
  • تمرير بالمرجع (Var): عنوان المتغير — التعديلات تؤثر على الأصل.
  • البرمجة المعيارية: تقسيم البرنامج إلى دوال وإجراءات يسهل القراءة والصيانة وإعادة الاستخدام.
  • التطبيق في البكالوريا: تمرين الخوارزميات يتطلب غالباً كتابة دوال وإجراءات — أتقن الصيغة جيداً.

📍 دروس مشابهة

شاهد أيضا

التربية الإسلامية — سورة الانشقاق (تفسير وحفظ للأطفال) — السنة الخامسة ابتدائي — المنهاج الجزائري

📖 سورة الانشقاق — تفسير وحفظ للأطفال المادة: التربية الإسلامية | السنة: الخامسة ابتدائي | …

الضمائر في اللغة العربية — الضمائر المنفصلة والمتصلة — اللغة العربية — السنة الأولى متوسط — المنهاج الجزائري

الضمائر هي كلمات تُستخدم بدلاً من الأسماء للدلالة على متكلم أو مخاطب أو غائب، وتُعتبر …

التكاثر عند النباتات الزهرية — الزهرة والتلقيح والإخصاب وتكوين البذور والثمار — علوم الطبيعة والحياة — السنة الثالثة متوسط — المنهاج الجزائري

تُشكل النباتات الزهرية (مغطاة البذور) المجموعة الأكثر انتشاراً وتنوعاً في المملكة النباتية. تتكاثر هذه النباتات …

الإزاحة (الانسحاب) في المستوى — مفهومها وتمثيلها — الرياضيات — السنة الرابعة متوسط — المنهاج الجزائري

الإزاحة أو الانسحاب هو أحد التحويلات الهندسية الأساسية التي نستخدمها في حياتنا اليومية، مثل تحريك …

اترك تعليقاً

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