recent
أخبار ساخنة

الحلقات التكرارية المتداخلة في لغة السي C الدرس|11|

الصفحة الرئيسية
Nested Loops

حلقات التكرار المتداخلة Loops Nested في لغة السي

الحلقات التكرارية المتداخلة, في اللغة الإنجليزية Loops Nested وهذا يعني إستعمال for loop بداخل حلقة ثانية for أو أي حلقة تكرارية ثانية.

وهذا الدرس نوعاً ما صعب لأنه سوف نعرف حلقات بداخل حلقات أخرى و سيكون الأمر أكثر تعقيدأ لذا يجب التركيز في هذا الدرس لأنه مهم جداًُ.

و إذا اتقنت التعامل مع الحلقات التكرارية المتداخلة Loops Nested سوف تنمي قدراتك في التحليل بشكل أكبر

ماذا نتوقع أن يحدث إذا كررّنا سطراً برمجياً ثلاث مرات ثم ثلاث مرات؟.

for (int j = 0; j < 3 j++ )
{
    for (int j = 0; j < 3 j++ )
    {
        printf("* ");
    }
    printf("\n");
}

إذا كانت لدينا جملة for تُكرر لنا طباعة النجمة ثلاثة مرات و كانت هذه الجملة بداخل جملة for تتكرر ثلاثة مرات و تقوم بطباعة سطراً جديداً بعد إنتهاء حلقة for الداخلية.

تبدأ اولاً قيمة i بالصفر و تمر على for loop الداخلية و ستبدأ قيمة المتغير j بالصفر كذلك و ستبدأ for الداخلية بطباعة ما بداخلها و التكرار حتى تنتهي for loop الداخلية.

وتطبَع سطراً جديداً ثم تَزيد قيمة i للوب الخارجية و تبدأ بالدوران مجدداً و ستدخُل اللوب الداخلية.

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

 

مثال 1

قُم بعمل برنامج لطباعة مربع من النجوم يطلُب من المُستخدم أن يكتُب عرض و طول المربع لهذا العرض.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(int argc, char** argv)
{
    int h;
    printf("ادخل طول المربع \n");
    scanf("%d", &h);
    for(int j = 0 ; j < h; j++)
    {
        for(int i = 0 ; i < h; i++)
        {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

في البداية قُمنا بإنشاء متغير عددي int و هو h من أجل الطول لهذا المربع ثم عن طريق الدالة scanf التي تطلب من المستخدم إدخال رقم.

طلبنا من المستخدم عبرها بأن يكتب طول المربع الذي يُريده عبر كتابة %d أي يطلب رقم و h يعني متغير الطول و بعد ذلك قُمنا بإنشاء حلقة for أن يبدأ بها j من الصفر ثم وضعنا أن j تكون اصغر من h أي الرقم الذي يُدخِلهُ المستخدم و j++ زيادة واحد في كل دورة.

و قُمنا بإنشاء حلقه تكرارية for ثانية بداخل الحلقة الأولى و وضعنا المُتغير i يساوي 0 و عندما يكون i اصغر من h يقوُم بعمل دورة و زيادة عليها بمقدار واحد و الطباعة على الشاشة * أي يطبَع عدد من النجوم من الرقم الذي ادخله المستخدم على شكل مربع ثم يقوم بطباعة سطراً جديداً.

عند تشغيل البرنامج و إدخال رقم 6 من قبل المستخدم سيكون.

نتيجة حلقة تكرارية متداخلة سداسية

عند إدخال المستخدم رقم 3 ستكون النتيجة هي

نتيجة حلقة تكرارية متداخلة ثلاثية


مثال 2

قُم بعمل برنامج يطبَع مستطيل من النجوم بحيث يطلُب من المُستخدِم أن يُدخِل الطول ثم العرض ثم يطبع المستطيل.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(int argc, char** argv)
{
    int h;
    int w;
    printf("ادخل طول المستطيل\n");
    scanf("%d", &h);
    printf("ادخل عرض المستطيل \n");
    scanf("%d", &w);
    for(int j = 0 ; j < h; j++)
    {
        for(int i = 0 ; i < w; i++)
        {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

في بداية هذا البرنامج قُمنا بإنشاء متغيرين عدديان و هما المتغير h من أجل طول المستطيل و المُتغير w من أجل عرض المُستطيل.

ثم طَلبنا من المُستخدِم عبر دالة scanf أولاً أن يقوم بإدخال طول المُستطيل h.

و بعد ذلك يقوم بالطلب منه أن يُدخِل عرض المستطيل w و دخلنا لحلقة تكرارية خارجية و كان بها مُتغير عددي j و قيمته 0 ثم وضعنا أن j اصغر من طول المستطيل h.

ثم يقوُم بالزيادة بمقدار 1 عليها و كان هناك ايضاً حلقه تكرارية ثانية صغيرة بداخل الحلقة السابقة و كان المُتغير بها i يساوي 0.

و ثم وضعنا له أن i تكون اصغر من العرض w و يقوم بالزيادة بمقدار 1 في دورة, ثم يقوم بطباعة النجوم بالأعداد التي قام المُستخدِم بإدخالها و طباعة سطراً جديداً.

و عند تشغيل هذا الكود و إدخال المُستخدِم الطول 6 و العرض 8 ستكون النتيجة كالتالي.

نتيجة حلقة تكرارية متداخلة ثمانية

 

مثال 3

اُكتُب برنامج يقوم ببناء مثلث من الرقم 7 و يقوم بالنزول رقم رقم إلى أن يَصِل إلى الرقم 1 و ينتج مثلث قائم الزاوية.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(int argc, char** argv)
{
    for(int i = 7; i >= 1; i--)
    {
        for(int j = 0; j < i; j++)
            printf("%d", i);
        printf("\n");
    }
    return 0;
}

أنشأنا حلقة for loop خارجية و بها مُتغَير عددي و هو i و قيمته 7 أي هي نقطة البداية.

ثم قُلنا له أن i اصغر أو يساوي 1 ثم وضعنا i-- أي تكون عملية إنقاص بمقدار واحد.

و بعدها أنشأنا حلقة ثانية بداخلها و كان المُتغير بها هو j و قيمته 0 ثم وضعنا أن j تكون اصغر من i و يقوم بالزيادة بمقدار واحد في كل دورة.

و i تمثل نقطة البداية التي هي 7 ثم طَلَبنا منه أن يطبَع قيمة i في كل دورة و النزول سطراً جديداً بعدها.

و عند تشغيل هذا البرنامج سوف تكون نتيجته هي كالآتي.

مثلث الارقام

 

إذا اتقنت التعامل مع الحلقات التكرارية المتداخلة Loops Nested سوف تنمي قدراتك في التحليل بشكل أكبر
google-playkhamsatmostaqltradent