المصفوفات متعددة الأبعاد في لغة السي C الدرس|17| - Programmer Tech

Programmer Tech

تعلم البرمجة - علوم الكمبيوتر - أمن المعلومات - القرصنة الأخلاقية

إعلان اعلى المقالة

الأحد، 9 مايو 2021

المصفوفات متعددة الأبعاد في لغة السي C الدرس|17|


المصفوفات متعددة الأبعاد في لغة C

سوف نتحدث اليوم عن المصفوفات متعددة الأبعاد و هي عبارة عن مصفوفات يُمكن أن تأخذ قيم في اكثر من بُعد, على سبيل المثال المصفوفات ثنائية الأبعاد تتكوَّن من صفوف و أعمده فيمكن تخيلها على أنها شبيهة بجدول, و المصفوفات ثنائية الأبعاد هي التي سوف نغطيها في هذا الدرس.

 

مثال 1

لنقُم بتعريف مصفوفة تتكوَّن من اربع مصفوفات في كل من هذه المصفوفات ثلاث قيم من نوع char و قم بالوصول إلى عناصر بعض القيم من المصفوفات ليطبع abcd.

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
    char characters[4][3] = {{'a', 'g', 'c'},
                            {-2, 200, 'z'},
                            {'G', 'd', 'K'},
                            {-90, -1, 'b'}};
    printf("%c", characters[0][0]);
    printf("%c", characters[3][2]);
    printf("%c", characters[0][2]);
    printf("%c", characters[2][1]);

    return 0;
} 

 

شرح المثال السابق 1

قمنا بإنشاء مصفوفة بإسم characters تحتوي بداخلها أربعة مصفوفات و كل مصفوفة تحتوي على ثلاثة قيم مختلفة ووضعنا ضمن هذه القيم احرف على انها char لكي نقوم بطباعتها, و بعدها قمنا بكتابة امر الطباعة printf و حددنا انه نريد طباعة char عبر الرمز %c و قمنا بكتابة اسم المصفوفة و موقع الحرف الذي نريد طباعته عبر الاندكس, و الرقم 0 يعني المصفوفة الأولى و الصفر 0 الآخر يعني القيمة الأولى منها, و بنفس الأمر ذهبنا للمصفوفة الرابعه الذي الاندكس لها 3 قمنا بإختيار القيمة رقم 2 منها و بنفس الأمر على المصفوفتين الباقية و عند الطباعة ستكون النتيجة هي abcd كما يلي


إستخدام المصفوفة في دالة

لقد تعرَّفنا في درس functions على كيفية تمرير قيم إلى الدالة عن طريق ما يُسمى بالمُعاملات, فهل يُمكننا تمرير مصفوفة كاملة إلى دالة؟ نعم يُمكننا ذلك طبعاً, يتم تمرير المصفوفات بنفس الطريقة التي نقوم بها بتمرير مُتغير عادي لكن الفرق هنا أننا نقوم بوضع قوس مربع فارغ بعد إسم المُعامل و ذلك لإبلاغ الدالة أننا نُريد أن نمرر مصفوفة كاملة و ليست قيمة عادية.

void function(int y[])
{
    printf("%d", y[0]);
}

 

المشكلة هي أنَّ لغة سي ليست كـ لغات البرمجة الأُخرى التي تقوم بتمرير سعة المصفوفة مع المصفوفة لذا فإننا لا نستطيع معرفة سعة المصفوفة داخل الدالة.

void function(int y[], int arraySize)
{
for(int i = 0; i < arraySize; i++)
    printf("%d", y[i]);
}

 

فلو أردنا طباعة قيم المصفوفة جميعها فكيف لنا أن نعرف عدد هذه القيم اصلاً, فيمكن أن تكون قيم المصفوفة أي شيئ و لحل هذه المشكلة يجب علينا أن نُمرر سعة المصفوفة يدوياً كنوع int و إستخدامه داخل الدالة.

مثال 2

#include <stdio.h>
#include <stdlib.h>
void adder(int numbers[], int size)
{
    int sum = 0;
    for(int i = 0 ; i < size; i++)
    {
        sum = sum + numbers[i];
    }
    printf("The sum of the values of the matrix= %d", sum);
}

int main(int argc, char** argv)
{
    int array[4] = {10, 20, 30, 40};
    adder(array, 4);
}

 


شرح المثال السابق 2

قمنا بتعريف دالة نوعها void و أسميناها adder و هذه الدالة تقوم بإستقبال مصفوفة من نوع int و إسم المصفوفة اسميناها numbers و لأنها مصفوفة وضعنا قوسين مربعين [] في الباراميترس و قُمنا بإرسال حجم المصفوفة و قد قمنا بجعل نوع الدالة void لأن دالتنا لن تُرجع أي قيمة, و قُمنا بتعريف مُتغير في داخل هذه الدالة إسمه sum و بدايته هي 0 و سوف يحتوي هذا المُتغير على جميع قيم هذه المصفوفة و قيمته الأولية هي 0 ليكون ناتج الجمع صحيحاً, و قُمنا بإنشاء حلقة for للمرور على جميع قيم المصفوفة, ووضعنا i=0 و i اصغر من حجم المصفوفة و لذلك قُمنا بتمريرها في المعاملات, و قمنا بجمع قيمة sum مع نفسها مع القيمة الموجودة بداخل المصفوفة و قُمنا بطباعة الناتج بداخل هذه الدالة عبر printf و بداخل الدالة main قُمنا بتعريف مصفوفة int array و حجمها 4 ووضعنا بها عدة قيم ثم إستدعينا الدالة adder و تمرير المصفوفة التي قُمنا بإنشاءها و تمرير حجمها من دون أي اقواس مربعة ووضعنا حجم المصفوفة, و عند تشغيل الكود ستكون نتيجته 100 كما يلي

 

في حال أردنا تمرير مصفوفة ثنائية الأبعاد فيجب علينا تحديد سعة المصفوفة الفرعية عن طريق كتابتها في قوس مربع و من الجدير بالذكر أن هذا إجباري في هذه الحالة.

void function(int y[][3], unsigned int arrarSiz)
{

}

 إضغط هنا للرجوع للدرس السابق

ليست هناك تعليقات:

إرسال تعليق

facebook

نموذج الاتصال

الاسم

بريد إلكتروني *

رسالة *