recent
أخبار ساخنة

المصفوفات arrays في لغة C

AM VIIP
الصفحة الرئيسية
المصفوفات في لغة سي

المصفوفات في لغة سي

المصفوفات ( arrays ) هي مجموعة من البيانات التي تتشابه في النوع سواء كانت نصوص أو أرقام عددية صحيحة أو أرقام عشرية و أرقام كسرية و حرف واحد و يكون لها إسم مشترك أن يكون لها إسم مشترك يُعبّر عن هذه البيانات بإسم المصفوفة Array و في المصفوفات نستطيع أن ننسيق الكود الخاص بنا و وضع به كم كبير من المُتغيرات بدون أي تعقيد و نستطيع الوصول لأي عنصر في هذه المصفوفة و تمييزه عن طريق مناداته بالـ index الخاص به.

 

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

المصفوفات احادية الأبعاد ( one dimensional array ) تحدثنا عن المُتغيرات في الدروس السابقة و قُلنا أن المُتغير يحمل قيمة عدد أو حرف أو غيرها, لكن ماذا عن عدة قيم؟ هل يُمكن تعريف عدة قيم متسلسلة في متغير واحد؟. نعم فإن المصفوفات Array هي الطريقة الأمثل لتعريف متغير يحمل عدة قيم, لنتذكر مشروع لحساب معدل طالب.

الشيئ الذي سوف يصعُب علينا تخزين القيم و إستخدامها, ماذا لو كان العدد للمواد هو 20 مادة, هل سوف نقوم بتعريف 20 متغير مختلف؟. بالطبع لا لهذا وٌجدت المصفوفات Arrays و التي تسهِّل علينا بشكل كبير مثل هذه الحالات.

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

فإنها من الممكن أنها تتسع لثلاث قيم مختلفة, فلو كانت مصفوفة من نوع int سعتها 3 على سبيل المثال. فإنها من الممكن أن تتسع لثلاث قيم مختلفة من نوع int ايضاً و طبعاً بإمكاننا إسترجاع القيم منها أو تعديل القيم الموجودة فيها.

الصيغة العامة لتعريف مصفوفة

int myArray[size];

حيث أن :

الـ int هو تحديد نوع المصفوفة و هنا كان نوعها عدد صحيح integer فهي نفس الطريقة التي نعرّّف بها المتغيرات.

الـ myArray هو إسم المصفوفة, تماماً كما نتعامل مع المتغيرات و بنفس الشروط.

الـ [size] هو سعة المصفوفة نكتُبه عدد صحيح موجب و هذا هو الإختلاف بينها و بين المُتغير العادي و هذا العدد هو سوف يمثِّل سعة المصفوفة و حجمها, و بالنهاية يجب وضع فاصلة منقوطة ;.

 

تحديد قيم اولية للمصفوفة Array في لغة سي

يمكن ايضاً تحديد قيم اولية للمصفوفة بوضع إشارة مساواة قبل الفاصلة المنقوطة ثم نقوم بفتح قوس معكوف {. ثم نقوم بتحديد قيم اولية بحيث تكون مفصولة بفاصلة و في النهاية نقوم بإغلاق القوس المعكوف و نضع الفاصلة المنقوطة semicolon.

int myArray[size] = {4, 3, 7, ....etc};

في هذا المثال ستكون القيمة الأولى للمصفوفة هي 4 و الثانية 3 و الثالثة 7 و هكذا....الخ, و في حال تحديد قيم اولية للمصفوفة. لا داعي لتحديد حجمها فالمحول أو المفسر البرمجي هو سوف يقوم بتحديده تبعاً للقيم الأولية.

مثال 1

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
    int x[] = {1, 2, 3, 4, 5};
    return 0;
}

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

 

إسترجاع القيم من المصفوفة في لغة سي C

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

int myArray[3];
myArray[0]

الآن اصبحت العملية أشبه بتحديد مُتغير عادي فنقوم بكتابة رمز مساواة متبوعاً بالقيمة التي نُريدها و من ثم الفاصلة المنقوطة. على سبيل المثال 16 أي القيمة الأولى هي 16 و القيمة الثانية نحن لا نعلم ما هي لأنه لم نقم بتحديدها. فقد تحتوي على أي قيمة عشوائية بحسب ما تجده في المكان التي تم حجزه في الذاكرة.

int myArray[3];
myArray[0] = 23;

إذا أردنا تعديل القيمة بعد ذلك فنقوم بنفس الطريقة

int myArray[3];
myArray[0] = 23;
myArray[0] = 27;

هنا تم تعديل القيمة الأولى من 23 الى 27.

 

كيفية إسترجاع قيمة من مصفوفة في لغة السي

نقوم اولاً بكتابة إسم المصفوفة و فتح قوس مربع بعد ذلك نقوم بكتابة موقع القيمة التي نُريد قرائتها. من المصفوفة بحيث يبدأ العد من الصفر 0،. فلو وضعنا صفر فنقوم بقراءة القيمة الأولى من المصفوفة ثم نقوم بإغلاق القوس المربع.

int myArray[3];
myArray[0]=16;
myArray[0];

بالطبع للآن لم نستفيد من القيمة التي قُمنا بقرائتها، نضعها في متغير لكي نستفيد منها

int myArray[3]; 
myArray[0]=16; 
int x =myArray[0];

الآن تم نسخ القيمة 16 إلى المُتغير x فيمكننا إستخدام القيم الموجودة في المصفوفة بأي طريقة نُريد (طباعتها على الشاشة أو قراءة القيم و تخزينها فيها).

 

كيفية التعامل مع المصفوفات أُحادية الأبعاد

لنقم بتخيل الشكل الآتي لمصفوفة

int myArray[7]  = {2, 27, -26, -24, 0, 15, 12};

المطلوب:

  1. إقرأ القيمة التالية int x =myArray[0] فما هي القيمة المخزنة في x؟.
  2. ما هي القيمة المخزنة في int x =myArray[4]؟.
  3. ما هي القيمة المخزنة في int x =myArray[8]؟.
  4. ما هي القيمة في ما يلي :
myArray[2]=60;
int x = myArray[2];

حل السؤال السابق

1- هنا سوف تكون القيمة المخزنة هي 2.

2- القيمة المخزنة هي 0.

3- في هذه الحالة سوف نقَع في مشكلة ذات نتيجتين متوقعتين و كلتاهما سيئتين, إما أن يتم إرجاع قيمة عشوائية من الذاكرة. بحسب المكان الذي قُمنا بمحاولة القراءة منه x=-342354236. أو سيتوقف البرنامج عن العمل عند تشغيله سيظهر رسالة للمستخدم Error يبين له أنه قُمنا بمحاولة الدخول إلى الذاكرة بشكل خاطئ. و ذلك لأننا حاولنا القراءة من مكان لم نقم بحجزه, إذاً أن المصفوفة حجمها 7 و قُمنا بمحاولة الوصول للقيمة التاسعه فيها و هي ليست معرَّفة و لن يتم حجزها.

4- هنا سوف تكون القيمة هي 60 لأننا قُمنا بتعديل القيمة بعد تعريف المصفوفة و هي x=60 .

 

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

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

مثال

لنقُم بتعريف مصفوفة تتكوَّن من اربع مصفوفات في كل من هذه المصفوفات ثلاث قيم من نوع 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;
}

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

قمنا بإختيار القيمة رقم 2 منها و بنفس الأمر على المصفوفتين الباقية و عند الطباعة ستكون النتيجة هي abcd كما يلي

abcd

 

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

لقد تعرَّفنا في درس 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 و إستخدامه داخل الدالة.

مثال

#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);
}

قمنا بتعريف دالة نوعها void و أسميناها adder و هذه الدالة تقوم بإستقبال مصفوفة من نوع int و إسم المصفوفة اسميناها numbers. و لأنها مصفوفة وضعنا قوسين مربعين [] في الباراميترس. و قُمنا بإرسال حجم المصفوفة و قد قمنا بجعل نوع الدالة void لأن دالتنا لن تُرجع أي قيمة. و قُمنا بتعريف مُتغير في داخل هذه الدالة إسمه sum و بدايته هي 0 و سوف يحتوي هذا المُتغير على جميع قيم هذه المصفوفة و قيمته الأولية هي 0 ليكون ناتج الجمع صحيحاً.

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

ووضعنا حجم المصفوفة, و عند تشغيل الكود ستكون نتيجته 100 كما يلي

The sum of the values of the matrix=100

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

void function(int y[][3], unsigned int arrarSiz)
{
.
}
google-playkhamsatmostaqltradent