الدرس التاسع: المصفوفات متعددة الأبعاد (Multi-Dimensional Arrays)
المصفوفات متعددة الأبعاد هي نوع من المصفوفات التي تحتوي على أكثر من بُعد واحد. المصفوفة الثنائية (2D Array) هي النوع الأكثر شيوعًا من المصفوفات متعددة الأبعاد، حيث تحتوي على صفوف وأعمدة.
1. تعريف المصفوفات الثنائية (2D Arrays)
المصفوفة الثنائية هي مصفوفة تحتوي على مجموعة من المصفوفات الأحادية (1D Arrays)، بحيث كل عنصر من عناصر المصفوفة الثنائية هو مصفوفة أحادية أخرى.
بنية المصفوفة الثنائية:
نوع_البيانات اسم_المصفوفة[عدد_الصفوف][عدد_الأعمدة];
- نوع_البيانات: هو نوع البيانات الذي سيتم تخزينه في المصفوفة.
- اسم_المصفوفة: هو اسم المصفوفة.
- عدد_الصفوف: هو عدد الصفوف في المصفوفة.
- عدد_الأعمدة: هو عدد الأعمدة في المصفوفة.
مثال على تعريف مصفوفة ثنائية:
int matrix[3][3]; // مصفوفة ثنائية من 3 صفوف و3 أعمدة
2. إدخال القيم إلى المصفوفة الثنائية
يمكن إدخال القيم إلى المصفوفة الثنائية باستخدام التكرار (loops) لإدخال القيم عبر الصفوف والأعمدة.
مثال على إدخال القيم باستخدام حلقة for مزدوجة:
#include <iostream>
using namespace std;
int main() {
int matrix[3][3]; // مصفوفة 3x3
// إدخال القيم باستخدام حلقة for مزدوجة
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << "أدخل العنصر في الصف " << i + 1 << " والعمود " << j + 1 << ": ";
cin >> matrix[i][j];
}
}
// إخراج القيم المدخلة
cout << "المصفوفة المدخلة هي:\n";
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
return 0;
}
الشرح:
- في هذا المثال، نُعرّف مصفوفة ثنائية من 3 صفوف و3 أعمدة.
- ثم نستخدم حلقة
forمزدوجة (nestedforloops) لإدخال القيم في المصفوفة. - بعد إدخال القيم، نستخدم نفس الحلقات لإخراج المصفوفة.
3. العمليات الحسابية على المصفوفات الثنائية
يمكن إجراء العديد من العمليات الحسابية على المصفوفات الثنائية مثل جمع القيم، ضرب المصفوفات، أو حساب المجموع الكلي.
مثال على حساب مجموع جميع عناصر المصفوفة:
#include <iostream>
using namespace std;
int main() {
int matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // مصفوفة 3x3
int sum = 0;
// جمع جميع العناصر في المصفوفة
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
sum += matrix[i][j]; // إضافة كل عنصر للمجموع
}
}
cout << "مجموع جميع العناصر في المصفوفة هو: " << sum << endl;
return 0;
}
النتيجة:
مجموع جميع العناصر في المصفوفة هو: 45
مثال على ضرب مصفوفة بأخرى (Multiplication of 2D Matrices):
#include <iostream>
using namespace std;
int main() {
int matrix1[2][2] = {{1, 2}, {3, 4}};
int matrix2[2][2] = {{5, 6}, {7, 8}};
int result[2][2]; // مصفوفة لتخزين النتيجة
// ضرب المصفوفات
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
result[i][j] = 0;
for (int k = 0; k < 2; k++) {
result[i][j] += matrix1[i][k] * matrix2[k][j];
}
}
}
// إخراج النتيجة
cout << "نتيجة ضرب المصفوفات هي:\n";
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
cout << result[i][j] << " ";
}
cout << endl;
}
return 0;
}
النتيجة:
نتيجة ضرب المصفوفات هي:
19 22
43 50
4. المصفوفات الثنائية مع حجم غير ثابت (Dynamic 2D Arrays)
يمكنك أيضًا إنشاء مصفوفات ثنائية ذات حجم غير ثابت باستخدام المؤشرات (pointers) والمصفوفات الديناميكية. هذه الطريقة مفيدة عندما لا تعرف حجم المصفوفة مسبقًا.
مثال على مصفوفة ثنائية ديناميكية:
#include <iostream>
using namespace std;
int main() {
int rows = 3, cols = 3;
// تخصيص ذاكرة للمصفوفة الديناميكية
int** matrix = new int*[rows]; // تخصيص الصفوف
for (int i = 0; i < rows; i++) {
matrix[i] = new int[cols]; // تخصيص الأعمدة
}
// إدخال القيم للمصفوفة
cout << "أدخل القيم للمصفوفة:\n";
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << "أدخل العنصر في الصف " << i + 1 << " والعمود " << j + 1 << ": ";
cin >> matrix[i][j];
}
}
// إخراج القيم
cout << "المصفوفة المدخلة هي:\n";
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
// تحرير الذاكرة
for (int i = 0; i < rows; i++) {
delete[] matrix[i];
}
delete[] matrix;
return 0;
}
الشرح:
- يتم تخصيص الذاكرة للمصفوفة الثنائية باستخدام المؤشرات.
- بعد استخدام المصفوفة، يجب تحرير الذاكرة باستخدام
delete[].
الخلاصة
- المصفوفات الثنائية (2D Arrays) هي مصفوفات تحتوي على صفوف وأعمدة. يمكن استخدامها لتمثيل البيانات في شكل جداول أو شبكات.
- إدخال القيم في المصفوفات الثنائية يتم عبر الحلقات المتداخلة (
nested loops). - يمكن إجراء العمليات الحسابية على المصفوفات الثنائية مثل الجمع والضرب.
- يمكن أيضًا إنشاء مصفوفات ثنائية ديناميكية باستخدام المؤشرات.
المصفوفات الثنائية مهمة لتخزين البيانات في شكل هيكلي يسهل التعامل معه في العديد من التطبيقات البرمجية مثل معالجة الصور أو التمثيل الرياضي.
اكتشاف المزيد من كود التطور
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.


