المصفوفات متعددة الأبعاد في ++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];



ويمكن تصور مصفوفة كهذه علي أنها " مصفوفة لمصفوفة " , ويبين الشكل هذا التصور



Object-Oriented Programming in C   _Page_0298_Image_0001





























شكل مصفوفة ثنائية الأبعاد



ويكون لكل عنصر من عناصر المصفوفة دليلان ؛ الأول ( المعبر عن المنطقة ) يوضع في أول قوسين , والثاني ( المعبر عن الشهر ) في القوسين التاليين , والعنصر العام في المصفوفة يأخذ الشكل 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 تمثل مبيعات شهر ما تكتب أعدادها داخل قوسين حلزونين , ويفصل بينهما فواصل ثم تحاط كلها بقوسين حلزونين , باعتبارها عنصرا في المصفوفة الأصلية .

التسميات: