📘 بطاقة الدرس
| المادة | الإعلام الآلي |
|---|---|
| المستوى | الثانية ثانوي (شعبة تقني رياضي) |
| الوحدة | الخوارزميات والبرمجة — الدوال والإجراءات في لغة 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): عنوان المتغير — التعديلات تؤثر على الأصل. - البرمجة المعيارية: تقسيم البرنامج إلى دوال وإجراءات يسهل القراءة والصيانة وإعادة الاستخدام.
- التطبيق في البكالوريا: تمرين الخوارزميات يتطلب غالباً كتابة دوال وإجراءات — أتقن الصيغة جيداً.
📍 دروس مشابهة
- هياكل التحكم في لغة Pascal (If, Case, For, While, Repeat) — الثانية ثانوي (شعبة تقني رياضي) — الإعلام الآلي
- المصفوفات (Tableaux) في لغة Pascal — أحادية وثنائية البعد — الثانية ثانوي (شعبة تقني رياضي) — الإعلام الآلي
- البرمجة الهيكلية والدوال في لغة C++ — الثالثة ثانوي (بكالوريا) إعلام آلي
مدونة التربية و التعليم في الجزائر – دروس، فروض، نتائج امتحانات مدونة التربية والتعليم في الجزائر | تحضير الدروس، فروض واختبارات، نتائج البكالوريا وBEM، مسابقات التوظيف، والتوجيه المدرسي للطلاب وأولياء الأمور.