13- المصفوفات Arrays :
13-1 المصفوقات الرقمية :
أثناء تطوير (إنشاء) البرنامج ، عادة ما يكون هناك حاجة (ضرورة) لمعالجة العديد من "بنود البيانات من نفس النوع" . على سبيل المثال ، برنامج مصمم لقراءة أعمار 50 طالب فى حجرة صف ، فقد يتبادر للذهن من أول وهلة أننا بحاجة لاستخدام 50 متغير منفصل من نوع الأعداد الصحيحة . لكن ، مثل هذا النهج يجعل من الصعب معالجة البيانات ، حيث أنه علينا الوصول لكل عدد صحيح بشكل منفصل . علاوة على ذلك ، إذا زاد عدد الصف إلى 70 طالب ، على سبيل المثال ، عنئذ علينا إدخال 20 عدد صحيح أخرى و20 عبارة أخرى لمعالجة المدخلات الجديدة .
الحل لهذه المشكلة هو استخدام المصفوفة array كوسيلة سهلة لجمع البنود ذات الصلة تحت اسم متغير واحد . يتم إعلان (تعريف) المصفوفة عن طريق " تحديد اسمها ، ونوع وعدد عناصرها " التى عليها تخزينها . على سبيل المثال ، فيما يلى مصفوفة "أعداد صحيحة بدون إشارة" ، تسمى Average ، وبها خمس عناصر :
كود:
unsigned int Average[5];
يتم حفظ المصفوفة فى أماكن (مواقع) ذاكرة متتابعة (متسلسلة) كما هو موضح بالشكل التالى :
فى هذا المثال ، أول عنصر "رقمه المسلسل صفر " index 0 ، وآخر عنصر رقمه المسلسل (4) . يتم عنونة عناصر المصفوفة عن طريق "كتابة اسم المصفوفة متبوعا بقوسين مربعين ( […] ) بداخلهما الرقم المسلسل للعنصر المحدد" . على سبيل المثال ، لتحديد "العنصر الثالث" بالمصفوفة بالقيمة "120" يمكن كتابة مايلى :
بالمثل ، على سبيل المثال ، لنسخ محتويات العنصر الثالت من المصفوفة إلى متغير يسمى MyValue يمكننا كتابة ما يلى :
كود:
MyValue = Average[2];
كلما واجه المترجم تعريف لمصفوفة ، يتم تنفيذ عملية حسابية لتحديد متطلبات تخزين كل عنصر . يمكن "تهيئة البداية" لمحتويات المصفوفة خلال إعلان المصفوفة عن طريق تحديد عناصر المصفوفة ، مفصولة بفواصل ، ومحاطة بأقواس مجعدة ( {..,..,..} ) . فيما يلى مثال لمصفوفة تسمى numbers ، بها 10 عناصر ، وفيها العنصر الأول numbers[0] = 0 ، والعنصر الثانى numbers[1] = وهلم جرا :
كود:
unsigned int numbers[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
يمكن إعلان نفس المصفوفة ، بدون تحديد "حجم المصفوفة" كما يلى . هنا ، "يحدد المترجم" حجم المصفوفة و "يخصص" عدد البايتات المطلوبة بالذاكرة :
كود:
unsigned int numbers[ ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
لاحظ أنه ليس من الضرورى "التهيئة الابتدائية" لجميع عناصر المصفوفة . على سبيل المثال ، يمكننا التهيئة الابتدائية للعناصر الثلاثة الأولى فقط من المصفوفة وترك باقى العناصر بدون تهيئة ابتدائية ليكون التعريف كما يلى :
كود:
int MyNumbers[10] = {0, 2, 5};
فى هذه الحالة تم التهيئة الابتدائية للعناصر [0] , [1] , [2] ، على الرغم من أنه سوف يتم حجز تخزين لعشر عناصر . هنا ، أى عناصر متبقية بدون تهيئة ابتدائية يتم تهيئتها ضمنيا بصفر .
ملحوظة :
من الخطأ أن يكون هناك عناصر أكثر من تعريف حجم المصفوفة . على سبيل المثال ، التعريف التالى سوف يولد خطأ للمترجم :
كود:
int numbers[2] = {0, 3, 7, 8, 9};
كلما تم تهيئة مصفوفة ، فإن المترجم ينسخ البيانات المحددة إلى عناصر المصفوفة . فإذا حدث وكانت المصفوفة داخل دالة ، عندئذ فى كل مرة يتم استدعاء الدالة ، سوف يتم إعادة تحميل عناصر المصفوفة ، مما يتسبب فى تأخير لا لزوم له . لهذا السبب ، يجب أن يتم الكلمة الخاصة static لإجبار عناصر المصفوفة ليتم تحميلها مرة واحدة فقط عند بداية البرنامج ، كما يلى :
كود:
static int numbers[2] = {0, 5};
المصفوفات ذات الأبعاد المتعددة :
فى المترجم ميكروسى برو ، يمكننا أيضا إعلان المصفوفة ذات الأبعاد المتعددة . تستخدم مثل هذه المصفوفات عادة فى العمليات الحسابية ، مثل حسابات المتجه والمصفوفات .
يتم إعلان المصفوفات ذات الأبعاد المتعددة عن طريق تحديد "نوع البيانات" ، و "اسم المصفوفة" و "حجم كل بعد بالمصفوفة" . فى المثال التالى ، يتم تعريف مصفوفة ذات بعدين باسم MyMatrix ، بها "ثلاثة صفوف" و "عمودين" :
هذه المصفوفة لها الناء التالى : المصفوفة بها أجمالى 6 عناصر . العنصر الأول من المصفوفة هو
MyMatrix[0][0] ، والعنصر الأخير هو MyMatrix[2][1] ، كما فى الجدول التالى :
يمكن التهيئة الابتدائية للمصفوفة ذات الأبعاد المتعددة كما سبق ، عن طريق تحديد العناصر داخل أقواس مجعدة ومفصولة بفواصل ، كما فى المثال التالى :
كود:
int numbers[2][3] = { {0, 2, 5}, {6, 8, 5} };
فى المثال السابق لدينا "2 صف" و "3 عامود" . قيمة كل عنصر يمكن بيانها كما يلى :
حجم "البعد الأول" اختيارى ويمكن أن يترك فارغا ، كما هو مبين فيما بعد للمثال أعلاه . يقوم المترجم بالملىء بالحجم الصحيح خلال الترجمة :
كود:
int numbers[ ][3] = { { 0, 2, 5}, {6, 8, 5} };
13-2 مصفوفات الحروف Character Arrays :