📘 بطاقة الدرس
| المادة | الإعلام الآلي |
|---|---|
| المستوى | الثانية ثانوي (شعبة تقني رياضي) |
| الوحدة | البرمجة بلغة Pascal — المصفوفات (Tableaux) |
| المدة الزمنية | 3 حصص (4 ساعات) |
| الأسبقيات | هياكل التحكم (If, For, While, Repeat) |
🎯 أهداف التعلم
- التعرف على مفهوم المصفوفة (Tableau) في لغة Pascal
- التصريح عن مصفوفة أحادية البعد وتعبئتها ومعالجتها
- التصريح عن مصفوفة ثنائية البعد وتعبئتها ومعالجتها
- استخدام الحلقات التكرارية في التعامل مع المصفوفات
- حل تمارين بكالوريا باستخدام المصفوفات
💡 تمهيد
في الدروس السابقة تعلمنا كيفية التعامل مع المتغيرات البسيطة (Integer, Real, Char, Boolean)، حيث يمكن لكل متغير أن يخزّن قيمة واحدة فقط. ولكن ماذا لو أردنا تخزين 100 درجة لـ 100 طالب؟ هل سنصرّح عن 100 متغير منفصل؟ هذا غير عملي أبداً! هنا تأتي أهمية المصفوفات (Tableaux) التي تسمح بتخزين مجموعة من القيم من نفس النوع تحت اسم واحد، والوصول إليها باستخدام مؤشر (Index).
1. مفهوم المصفوفة (Tableau)
المصفوفة هي بنية بيانات (Structure de données) تتكون من مجموعة من العناصر من نفس النوع (Integer, Real, Char…)، تخزّن في أماكن متجاورة في الذاكرة ويتم الوصول إلى كل عنصر بواسطة مؤشر رقمي (Index).
| الخاصية | الوصف |
|---|---|
| النوع | جميع العناصر من نفس النوع (متجانسة — Homogène) |
| الحجم | عدد ثابت من العناصر يُحدّد عند التصريح |
| الترقيم | يبدأ من 1 في Pascal (بعكس C/C++ حيث يبدأ من 0) |
| الوصول | عبر اسم المصفوفة + المؤشر: NomTableau[Index] |
2. المصفوفة أحادية البعد (Tableau à une dimension)
هي مصفوفة خطية تشبه قائمة (Liste) من العناصر. كل عنصر يُعرف بمؤشر واحد.
أ. التصريح عن مصفوفة أحادية البعد
يتم التصريح عن المصفوفة في قسم Var باستخدام الكلمة المفتاحية Array:
📝 الصيغة العامة للتصريح
Var
NomTableau : Array[1..N] Of TypeElement;
حيث:
N: عدد العناصر (الحجم الأقصى للمصفوفة)TypeElement: نوع العناصر (Integer, Real, Char, Boolean, String)
مثال عملي — التصريح عن مصفوفة من 10 أعداد صحيحة:
Program ExempleTableau;
Var
Notes : Array[1..10] Of Integer; { مصفوفة من 10 أعداد صحيحة }
i : Integer; { متغير الحلقة }
Begin
{ تعبئة المصفوفة }
For i := 1 To 10 Do
Begin
Write('أدخل العنصر ', i, ': ');
ReadLn(Notes[i]);
End;
{ طباعة المصفوفة }
WriteLn('عناصر المصفوفة:');
For i := 1 To 10 Do
Write(Notes[i], ' ');
ReadLn;
End.
ب. العمليات الأساسية على المصفوفة أحادية البعد
1. التعبئة (Remplissage) — يدوياً من المستخدم:
For i := 1 To N Do
Begin
Write('T[', i, '] = ');
ReadLn(T[i]);
End;
2. التعبئة — بقيم عشوائية باستخدام Random:
Randomize;
For i := 1 To N Do
T[i] := Random(100); { قيم عشوائية بين 0 و 99 }
3. طباعة عناصر المصفوفة (Affichage):
For i := 1 To N Do
Write(T[i], ' ');
4. البحث عن أكبر قيمة (Maximum):
Max := T[1];
For i := 2 To N Do
If T[i] > Max Then
Max := T[i];
WriteLn('أكبر قيمة هي: ', Max);
5. حساب مجموع العناصر (Somme):
Somme := 0;
For i := 1 To N Do
Somme := Somme + T[i];
WriteLn('مجموع العناصر = ', Somme);
WriteLn('المعدل = ', Somme / N:0:2);
3. المصفوفة ثنائية البعد (Tableau à deux dimensions)
المصفوفة ثنائية البعد تشبه جدولاً (Tableau / Matrice) يتكون من صفوف (Lignes) وأعمدة (Colonnes). كل عنصر يُعرف بمؤشرين: T[Ligne, Colonne].
📝 الصيغة العامة للتصريح عن مصفوفة ثنائية البعد
Var
NomMatrice : Array[1..L, 1..C] Of TypeElement;
حيث:
L: عدد الصفوف (Lignes)C: عدد الأعمدة (Colonnes)TypeElement: نوع العناصر
مثال عملي — مصفوفة 3×4 (3 صفوف و 4 أعمدة):
Program Matrice3x4;
Const
L = 3;
C = 4;
Var
M : Array[1..L, 1..C] Of Integer;
i, j : Integer;
Begin
{ تعبئة المصفوفة — حلقتان متداخلتان }
For i := 1 To L Do
For j := 1 To C Do
Begin
Write('M[', i, ',', j, '] = ');
ReadLn(M[i, j]);
End;
{ طباعة المصفوفة — على شكل جدول }
WriteLn('المصفوفة:');
For i := 1 To L Do
Begin
For j := 1 To C Do
Write(M[i, j]:4);
WriteLn; { سطر جديد بعد كل صف }
End;
ReadLn;
End.
أ. العمليات الأساسية على المصفوفة ثنائية البعد
1. ملء المصفوفة بقيم عشوائية بين 10 و 50:
Randomize;
For i := 1 To L Do
For j := 1 To C Do
M[i, j] := 10 + Random(41); { قيم بين 10 و 50 }
2. حساب مجموع عناصر مصفوفة:
Somme := 0;
For i := 1 To L Do
For j := 1 To C Do
Somme := Somme + M[i, j];
WriteLn('مجموع كل العناصر = ', Somme);
3. إيجاد أكبر قيمة في مصفوفة:
Max := M[1, 1];
For i := 1 To L Do
For j := 1 To C Do
If M[i, j] > Max Then
Max := M[i, j];
WriteLn('أكبر قيمة في المصفوفة = ', Max);
4. ✏️ تمرين بكالوريا محلول — المصفوفات أحادية البعد
📌 التمرين (من مواضيع بكالوريا تقني رياضي)
المعطيات: لديك مصفوفة T من N عدداً صحيحاً (1 < N ≤ 100).
المطلوب: كتابة برنامج Pascal يقوم بما يلي:
- إدخال عدد العناصر
Nوعناصر المصفوفةT. - حساب وعرض مجموع العناصر الزوجية في المصفوفة.
- حساب وعرض عدد العناصر الفردية (الأعداد التي لا تقبل القسمة على 2).
- عرض المصفوفة بعد ترتيبها تصاعدياً (اختياري: استخدم خوارزمية الفرز الفقاعي).
🟢 انقر هنا لرؤية الحل الكامل
Program ExerciceBac;
Var
T : Array[1..100] Of Integer;
N, i, j, SommePair, NbImpair, Temp : Integer;
Begin
{ 1. إدخال عدد العناصر }
Repeat
Write('أدخل عدد العناصر (2 إلى 100): ');
ReadLn(N);
Until (N > 1) And (N <= 100);
{ 2. إدخال عناصر المصفوفة }
For i := 1 To N Do
Begin
Write('T[', i, '] = ');
ReadLn(T[i]);
End;
{ 3. حساب مجموع العناصر الزوجية }
SommePair := 0;
For i := 1 To N Do
If T[i] Mod 2 = 0 Then
SommePair := SommePair + T[i];
WriteLn('مجموع العناصر الزوجية = ', SommePair);
{ 4. حساب عدد العناصر الفردية }
NbImpair := 0;
For i := 1 To N Do
If T[i] Mod 2 <> 0 Then
NbImpair := NbImpair + 1;
WriteLn('عدد العناصر الفردية = ', NbImpair);
{ 5. ترتيب المصفوفة تصاعدياً — Bubble Sort }
For i := 1 To N - 1 Do
For j := 1 To N - i Do
If T[j] > T[j + 1] Then
Begin
Temp := T[j];
T[j] := T[j + 1];
T[j + 1] := Temp;
End;
{ 6. عرض المصفوفة مرتبة }
Write('المصفوفة بعد الترتيب: ');
For i := 1 To N Do
Write(T[i], ' ');
WriteLn;
ReadLn;
End.
🔍 الشرح:
- استخدمنا
Repeat..Untilللتحقق من أنNبين 2 و 100. - استخدمنا العملية
Modللتحقق من الزوجية (T[i] Mod 2 = 0يعني أن العدد زوجي). - طبقنا خوارزمية الفرز الفقاعي (Bubble Sort) لحلقة مزدوجة لترتيب العناصر.
- قمنا بتبديل قيمتين باستخدام متغير مؤقت
Temp.
📌 التمرين 2 — المصفوفات ثنائية البعد (بكالوريا)
أكتب برنامج Pascal يُنشئ مصفوفة ثنائية البعد M من L صفوفاً و C أعمدة (3 ≤ L,C ≤ 10)، يملؤها بقيم عشوائية بين 1 و 100، ثم يقوم بما يلي:
- عرض المصفوفة على شكل جدول.
- حساب وعرض مجموع عناصر كل صف على حدة.
- إيجاد وعرض أكبر قيمة في المصفوفة وموقعها (رقم الصف ورقم العمود).
🟢 انقر هنا لرؤية الحل
Program MatriceAleatoire;
Const
L = 4;
C = 5;
Var
M : Array[1..L, 1..C] Of Integer;
i, j, Max, LigneMax, ColMax : Integer;
Begin
Randomize;
{ تعبئة المصفوفة بقيم عشوائية }
For i := 1 To L Do
For j := 1 To C Do
M[i, j] := 1 + Random(100);
{ 1. عرض المصفوفة }
WriteLn('المصفوفة:');
For i := 1 To L Do
Begin
For j := 1 To C Do
Write(M[i, j]:4);
WriteLn;
End;
{ 2. مجموع كل صف }
WriteLn;
For i := 1 To L Do
Begin
Max := 0; { نستخدم Max مؤقتاً كمجموع }
For j := 1 To C Do
Max := Max + M[i, j];
WriteLn('مجموع الصف ', i, ' = ', Max);
End;
{ 3. أكبر قيمة وموقعها }
Max := M[1, 1];
LigneMax := 1;
ColMax := 1;
For i := 1 To L Do
For j := 1 To C Do
If M[i, j] > Max Then
Begin
Max := M[i, j];
LigneMax := i;
ColMax := j;
End;
WriteLn;
WriteLn('أكبر قيمة = ', Max, ' في الصف ', LigneMax, ' والعمود ', ColMax);
ReadLn;
End.
📋 ملخص الدرس — المصفوفات في Pascal
- المصفوفة أحادية البعد (Tableau 1D): تُصرّح بـ
Array[1..N] Of Type، وتُعامل كقائمة خطية. - المصفوفة ثنائية البعد (Tableau 2D): تُصرّح بـ
Array[1..L, 1..C] Of Type، وتُعامل كجدول بصفوف وأعمدة. - الوصول إلى العناصر يتم باستخدام المؤشر:
Nom[Index]للمصفوفة أحادية البعد، وNom[L, C]لثنائية البعد. - للمعالجة نستخدم حلقة واحدة مع المصفوفات أحادية البعد، و حلقتين متداخلتين مع المصفوفات ثنائية البعد.
- المصفوفات أساسية في خوارزميات الفرز والبحث ومعالجة البيانات في البكالوريا.
📍 دروس مشابهة:
- هياكل التحكم في لغة Pascal (If, Case, For, While, Repeat) — الثانية ثانوي (شعبة تقني رياضي) — الإعلام الآلي
- الشبكات — مفاهيم أساسية وأنواع الشبكات (LAN, MAN, WAN) — الثانية ثانوي (شعبة تقني رياضي) — الإعلام الآلي
مدونة التربية و التعليم في الجزائر – دروس، فروض، نتائج امتحانات مدونة التربية والتعليم في الجزائر | تحضير الدروس، فروض واختبارات، نتائج البكالوريا وBEM، مسابقات التوظيف، والتوجيه المدرسي للطلاب وأولياء الأمور.