المصفوفات متعددة الأبعاد في ++C
المصفوفات متعددة الأبعاد
يقال عن المصفوفات التي تعرضنا لها للأن وحيدة البعد . ويمكن للمصفوفة أن تكون بأكثر من بعد , وفي المثال التالي نعرض لك مصفوفة من بعدين , حيث يجمع بها اسم مناطق البيع , وعدد وحدات البضاعة المباعة في كل منطقة علي مدي ثلاثة أشهر .
salemon.cpp
// salemon.cpp
// displays sales chart using 2-d array
// UCS Laboratories
#include <iostream.h>
#include <iomanip.h> // for setprecision, etc.
#include <conio.h>
const int DISTRICTS = 4; // array dimensions
const int MONTHS = 3;
void main()
{
int d, m;
float sales[DISTRICTS][MONTHS]; // two-dimensional array
// definition
cout << endl;
for(d=0; d<DISTRICTS; d++) // get array values
for(m=0; m<MONTHS; m++)
{
cout << "Enter sales for district " << d+1;
cout << ", month " << m+1 << ": ";
cin >> sales[d][m]; // put number in array
}
cout << "\n\n";
cout << " Month\n";
cout << " 1 2 3";
for(d=0; d<DISTRICTS; d++)
{
cout <<"\nDistrict " << d+1;
for(m=0; m<MONTHS; m++) // display array values
cout << setiosflags(ios::fixed) // not exponential
<< setiosflags(ios::showpoint) // always use point
<< setprecision(2) // digits to right
<< setw(10) // field width
<< sales[d][m]; // get number from array
} // end for(d)
getche();
} // end main
ولما كان عدد المناطق 4 , وعدد الأشهر 3 , فقد كان تعريف المصفوفة ثنائية الأبعاد كالتالي :
Float sales[DISTRICT][MONTHS];
ويمكن تصور مصفوفة كهذه علي أنها " مصفوفة لمصفوفة " , ويبين الشكل هذا التصور
شكل مصفوفة ثنائية الأبعاد
ويكون لكل عنصر من عناصر المصفوفة دليلان ؛ الأول ( المعبر عن المنطقة ) يوضع في أول قوسين , والثاني ( المعبر عن الشهر ) في القوسين التاليين , والعنصر العام في المصفوفة يأخذ الشكل sales[d][m] , فيكون إدخال العناصر مثلا بالأمر :
Cin >> sales[d, m]
(لاحظ أن كل دليل يوضع في قوس منفصل , فالصيغة sales[d][m] المتبعة في بعض اللغات لا تصلح في لغة السي .)
وإليك نموذجا للحوار بين المستخدم والبرنامج , وخرج البرنامج :
Enter sales for district 1, month 1: 3964.23
Enter sales for district 1, month 2: 4135.87
Enter sales for district 1, month 3: 4397.98
Enter sales for district 1, month 1: 867.75
Enter sales for district 1, month 2: 923.59
Enter sales for district 1, month 3: 1037.01
Enter sales for district 1, month 1: 12.77
Enter sales for district 1, month 2: 378.32
Enter sales for district 1, month 3: 798.22
Enter sales for district 1, month 4, month 1: 2983.53
Enter sales for district 1, month 4, month 2: 3983.73
Enter sales for district 1, month 4, month 3: 9494.98
Month | |||
3 4397.98 1037.01 798.22 9494.98 | 2 4135.87 923.59 378.32 3983.73 | 1 3964.23 867.75 12.77 2983.53 | District 1 District 2 District 3 District 4 |
|
|
|
|
أكثر من بعدين :
بنفس المنطق يمكن صياغة مصفوفات بأبعاد أكثر , فالمصفوفة الثلاثية الأبعاد مثلا تعرف ويشار لعناصرها (بإفتراض أنه لأعداد صحيحة ) كالتالي :
Int dimen3[i][j][k];
Elem = dimen3[i][j][k];
تشكيل الأعداد
يتطلب إظهار الأعداد في المثال السابق تنسيقها ووضعها في صورة معينة , علي الوجه التالي :
· أن تكون كافة الأعداد علي الصورة الكسور العشرية المعتادة , وليس علي الصورة العلمية .
· أن تظهر العلامة العشرية دائما , بمعني أنه إذا لم يكن هناك كسر , يحفظ مكانه أصفارا , العدد 28 يكتب 28.00 .
· أن يكون الكسر العشري من عددين (درجة دقة الكسر العشري خانتين )
· أن توضع الأعداد غي حقول , عرض الحقل 10 مسافات .
وقد توجد مجموعة من الدوال التي تستخدم في كافة هذه الأغراض , مر بك منها في الفصل الثالث الدالة setw لتحديد عرض الحقول , أما بقية الدوال التي استخدمت في البرنامج فهي :
Setiosflags(ios::fixed) لوضع الأعداد علي الصورة غير الأسية .
Setiosflags(ios::showpoint) لإظهار العلامة العشرية .
Setprecision(2) لتحديد الدقة بعددين عشريين .
ويأتي بعد هذه الدوال العدد المطلوب إظهاره . وسوف نزيدك إيضاحا عن هذه دوال تشكيل الأعداد في مقالات قادمة .
استهلال المصفوفات متعددة الأبعاد
لا يتطلب استهلال المصفوفات متعددة الأبعاد إلا الاستعداد والصبر علي كتابة العديد من الأقواس الحلزونية والفواصل , والانتباه الجيد لترتيب العناصر . وسوف نصوغ البرنامج السابق بحيث ندخل الأعداد كقيم استهلالية بدلا من المستخدم .
saleinit.cpp
// saleinit.cpp
// displays sales chart, initializes 2-d array
#include <iostream.h>
#include <iomanip.h> // for setprecision, etc.
#include <conio.h>
const int DISTRICTS = 4; // array dimensions
const int MONTHS = 3;
void main()
{
int d, m;
// initialize array elements
float sales[DISTRICTS][MONTHS]
= { { 1432.07, 234.50, 654.01 },
{ 322.00, 13838.32, 17589.88 },
{ 9328.34, 934.00, 4492.30 },
{ 12838.29, 2332.63, 32.93 } };
cout << "\n\n";
cout << " Month\n";
cout << " 1 2 3";
for(d=0; d<DISTRICTS; d++)
{
cout <<"\nDistrict " << d+1;
for(m=0; m<MONTHS; m++)
cout << setw(10) << setiosflags(ios::fixed)
<< setiosflags(ios::showpoint) << setprecision(2)
<< sales[d][m]; // access array element
}
getche();
}
ولنتذكر أن المصفوفة ذات البعدين هي في الحقيقة مصفوفة لمصفوفة , فأسلوب استهلالها مبني علي هذا الأساس . فكل مصفوفة فرعية subarray تمثل مبيعات شهر ما تكتب أعدادها داخل قوسين حلزونين , ويفصل بينهما فواصل ثم تحاط كلها بقوسين حلزونين , باعتبارها عنصرا في المصفوفة الأصلية .
تعليقات
إرسال تعليق