المقدمة
A two-dimensional array in C++ is the simplest form of a multi-dimensional array. It can be visualized as an array of arrays. The image below depicts a two-dimensional array.

A two-dimensional array is also called a matrix. It can be of any type like integer, character, float, etc. depending on the initialization. In the next section, we are going to discuss how we can initialize 2D arrays.
تهيئة مصفوفة ثنائية الأبعاد في C++
إذن، كيف يمكننا تهيئة مصفوفة ثنائية الأبعاد في C++؟ ببساطة كهذا:
int arr[4][2] = {
{1234, 56},
{1212, 33},
{1434, 80},
{1312, 78}
} ;
لذا، كما يمكنك رؤية، نقوم بتهيئة مصفوفة ثنائية الأبعاد arr
، بـ4 صفوف و 2 أعمدة كمصفوفة من المصفوفات. كل عنصر من المصفوفة هو مجددًا مصفوفة من الأعداد الصحيحة.
يمكننا أيضًا تهيئة مصفوفة ثنائية الأبعاد بالطريقة التالية.
int arr[4][2] = {1234, 56, 1212, 33, 1434, 80, 1312, 78};
في هذه الحالة أيضًا، arr
هي مصفوفة ثنائية الأبعاد بـ 4 صفوف و 2 أعمدة.
طباعة مصفوفة ثنائية الأبعاد في C++
لقد انتهينا من تهيئة مصفوفة ثنائية الأبعاد، الآن بدون طباعتها فعليًا، لا يمكننا التأكد من أنها تمت بشكل صحيح.
أيضًا، في العديد من الحالات، قد نحتاج إلى طباعة مصفوفة ثنائية الأبعاد الناتجة بعد القيام ببعض العمليات عليها. فكيف يمكننا فعل ذلك؟
الكود أدناه يوضح لنا كيف يمكننا فعل ذلك.
#include<iostream>
using namespace std;
main( )
{
int arr[4][2] = {
{ 10, 11 },
{ 20, 21 },
{ 30, 31 },
{ 40, 41 }
} ;
int i,j;
cout<<"Printing a 2D Array:\n";
for(i=0;i<4;i++)
{
for(j=0;j<2;j++)
{
cout<<"\t"<<arr[i][j];
}
cout<<endl;
}
}
الإخراج:

في الكود أعلاه،
- نقوم في البداية بتهيئة مصفوفة ثنائية الأبعاد،
arr[4][2]
بقيم معينة، - بعد ذلك، نحاول طباعة المصفوفة ذات الصلة باستخدام حلقتي for،
- حيث تكرر الحلقة الخارجية على الصفوف، في حين تكرر الحلقة الداخلية على أعمدة المصفوفة ثنائية الأبعاد،
- لذلك، في كل تكرار للحلقة الخارجية، يزيد
i
ويأخذنا إلى المصفوفة ثنائية الأبعاد التالية. أيضًا، تمر الحلقة الداخلية على الوقت الكامل للمصفوفة ذات الأبعاد الفردية، - وبناءً على ذلك، نقوم بطباعة العنصر الفردي
arr[ i ][ j ]
.
أخذ عناصر المصفوفة ثنائية الأبعاد كإدخال من المستخدم
سابقًا، رأينا كيف يمكننا تهيئة مصفوفة ثنائية الأبعاد بقيم محددة مسبقًا. ولكن يمكننا أيضًا جعلها إدخال من المستخدم أيضًا. دعونا نرى كيف
#include<iostream>
using namespace std;
main( )
{
int s[2][2];
int i, j;
cout<<"\n2D Array Input:\n";
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
cout<<"\ns["<<i<<"]["<<j<<"]= ";
cin>>s[i][j];
}
}
cout<<"\nThe 2-D Array is:\n";
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
cout<<"\t"<<s[i][j];
}
cout<<endl;
}
}
الناتج:

بالنسبة للكود أعلاه، نعلن عن مصفوفة ثنائية الأبعاد s
بحجم 2X2. باستخدام حلقتي for متداخلتين، نتنقل من خلال كل عنصر في المصفوفة ونأخذ إدخالات المستخدم المتناظرة. بهذه الطريقة، تمت ملء المصفوفة بأكملها، ونقوم بطباعة النتائج لنرى النتائج.
جمع المصفوفات ثنائية الأبعاد باستخدام لغة C++
كمثال دعونا نرى كيف يمكننا استخدام المصفوفات ثنائية الأبعاد لأداء جمع المصفوفات وطباعة النتيجة.
#include<iostream>
using namespace std;
main()
{
int m1[5][5], m2[5][5], m3[5][5];
int i, j, r, c;
cout<<"Enter the no.of rows of the matrices to be added(max 5):";
cin>>r;
cout<<"Enter the no.of columns of the matrices to be added(max 5):";
cin>>c;
cout<<"\n1st Matrix Input:\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cout<<"\nmatrix1["<<i<<"]["<<j<<"]= ";
cin>>m1[i][j];
}
}
cout<<"\n2nd Matrix Input:\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cout<<"\nmatrix2["<<i<<"]["<<j<<"]= ";
cin>>m2[i][j];
}
}
cout<<"\nAdding Matrices...\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
m3[i][j]=m1[i][j]+m2[i][j];
}
}
cout<<"\nThe resultant Matrix is:\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cout<<"\t"<<m3[i][j];
}
cout<<endl;
}
}
الناتج:

هنا،
- نأخذ مصفوفتين
m1
وm2
كل منهما بحد أقصى 5 صفوف و 5 أعمدة. ومصفوفة أخرىm3
نقوم بتخزين النتيجة فيها، - كإدخالات للمستخدم، نأخذ عدد الصفوف والأعمدة لكلا المصفوفتين. نظرًا لأننا نقوم بإجراء جمع المصفوفات، يجب أن يكون عدد الصفوف والأعمدة متساويًا لكلا المصفوفتين،
- بعد ذلك، نأخذ كلتا المصفوفتين كإدخالات للمستخدم مرة أخرى باستخدام حلقات تكرار متداخلة،
- في هذه النقطة، لدينا كل من المصفوفتين m1 و m2,
- ثم نتجول في المصفوفة m3 باستخدام حلقتين تكراريتين ونحدث العناصر المقابلة
m3[ i ][ j ]
بقيمةm1[i][j]+m2[i][j]
. بهذه الطريقة، بنهاية الحلقة الخارجية، نحصل على المصفوفة المطلوبة، - أخيرًا، نقوم بطباعة المصفوفة الناتجة m3.
مؤشر إلى مصفوفة ثنائية الأبعاد في C++
إذا كان بإمكاننا الحصول على مؤشر إلى عدد صحيح، ومؤشر إلى عدد عائم، ومؤشر إلى حرف، فهل لا يمكننا الحصول على مؤشر إلى مصفوفة؟ بالتأكيد يمكننا. يظهر البرنامج التالي كيفية بنائه واستخدامه.
#include<iostream>
using namespace std;
/* استخدام مؤشر إلى مصفوفة */
main( )
{
int s[5][2] = {
{1, 2},
{1, 2},
{1, 2},
{1, 2}
} ;
int (*p)[2] ;
int i, j;
for (i = 0 ; i <= 3 ; i++)
{
p=&s[i];
cout<<"Row"<<i<<":";
for (j = 0; j <= 1; j++)
cout<<"\t"<<*(*p+j);
cout<<endl;
}
}
الناتج:

هنا،
- في الكود أعلاه، نحاول طباعة مصفوفة ثنائية الأبعاد باستخدام المؤشرات،
- كما فعلنا سابقًا، في البداية نقوم بتهيئة المصفوفة ثنائية الأبعاد،
s[5][2]
. وأيضًا مؤشرًا(*p)[2]
، حيث p هو مؤشر يخزن عنوان مصفوفة تحتوي على 2 عنصر، - كما ذكرنا بالفعل، يمكننا تفكيك مصفوفة ثنائية الأبعاد إلى مصفوفة من المصفوفات. لذا في هذه الحالة، s في الواقع مصفوفة بها 5 عناصر، والتي في الواقع هي مصفوفات تحتوي على 2 عنصر لكل صف،
- نستخدم حلقة
for
للانتقال عبر هذه العناصر الخمسة في المصفوفة، s. في كل تكرار، نقوم بتعيين p بعنوانs[i]
، - بالإضافة إلى ذلك، تقوم الحلقة الداخلية بطباعة العناصر الفردية في المصفوفة s[i] باستخدام المؤشر p. هنا،
(*p + j)
يعطينا عنوان العنصر الفردي s[i][j]، لذلك باستخدام*(*p+j)
يمكننا الوصول إلى القيمة المقابلة،
تمرير مصفوفة ثنائية الأبعاد إلى دالة
في هذا القسم، سنتعلم كيفية تمرير مصفوفة ثنائية الأبعاد إلى أي دالة والوصول إلى العناصر المقابلة. في الكود أدناه، نقوم بتمرير المصفوفة a إلى دالتين show()
و print()
التي تقوم بطباعة المصفوفة ثنائية الأبعاد الممررة.
#include<iostream>
using namespace std;
void show(int (*q)[4], int row, int col)
{
int i, j ;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
cout<<"\t"<<*(*(q + i)+j);
cout<<"\n";
}
cout<<"\n";
}
void print(int q[][4], int row, int col)
{
int i, j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
cout<<"\t"<<q[i][j];
cout<<"\n";
}
cout<<"\n";
}
int main()
{
int a[3][4] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21} ;
show (a, 3, 4);
print (a, 3, 4);
return 0;
}
الناتج:

هنا،
- في الدالة
show()
قمنا بتعريف q ليكون مؤشرًا إلى مصفوفة من 4 أعداد صحيحة من خلال التعريفint (*q)[4]
. - q holds the base address of the zeroth 1-D array
- ثم تم تعيين هذا العنوان إلى q، مؤشر int، ومن ثم باستخدام هذا المؤشر يتم الوصول إلى جميع عناصر المصفوفة 1D الصفراء.
- في المرة القادمة عبر الحلقة عندما يأخذ
i
قيمة 1، تحصل التعبير q+i على عنوان المصفوفة 1-D الأولى. هذا لأن q هو مؤشر إلى المصفوفة 1-D الصفراء وإضافة 1 إليه سيمنحنا عنوان المصفوفة 1-D التالية. يتم تعيين هذا العنوان مرة أخرى إلى q وباستخدامه يتم الوصول إلى جميع عناصر المصفوفة 1-D التالية - في الدالة الثانية
print()
، يبدو تعريف q مثل هذا:int q[][4]
، - هذا هو نفسه int (*q )[4]، حيث q هو مؤشر إلى مصفوفة من 4 أعداد صحيحة. الميزة الوحيدة هي أنه يمكننا الآن استخدام التعبير المألوف أكثر
q[i][j]
للوصول إلى عناصر المصفوفة. يمكننا أن نستخدم نفس التعبير فيshow()
أيضًا ولكن لفهم أفضل لاستخدام المؤشرات، نستخدم المؤشرات للوصول إلى كل عنصر
الاستنتاج
في هذا المقال، تناولنا المصفوفات ثنائية الأبعاد في لغة c++، وكيف يمكننا أداء عدة عمليات وتطبيقاتها في جمع المصفوفات. لأي أسئلة إضافية، لا تتردد في استخدام التعليقات.
المراجع
Source:
https://www.digitalocean.com/community/tutorials/two-dimensional-array-in-c-plus-plus