المصفوفات متعددة الأبعاد في ++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
// definitioncout << 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 تمثل مبيعات شهر ما تكتب أعدادها داخل قوسين حلزونين , ويفصل بينهما فواصل ثم تحاط كلها بقوسين حلزونين , باعتبارها عنصرا في المصفوفة الأصلية .
تعليقات
إرسال تعليق