الحلقات التكرارية لغة سي
الحلقات التكرارية ( Loops ) نقوم بإستخدام الحلقات في البرمجة لتسهل علينا عدم كتابة نفس الكود عدة مرات, في حال أردنا إستخدامه لمرات عديدة نقوم بوضعه بداخل حلقة و هي سوف تقوم بدوره في إعادة تكراره على حسب طلبنا و شروط الكود. هناك ثلاث حلقات تكرارية في لغة السي وهي:
- حلقة for loop.
- حلقة while loop.
- حلقة do while loop.
كل حلقه من هذه نقوم بإستخدامها في عمل معين في البرنامج, سنتعرف في الأمثلة على أهمية الحلقات و إستخدامها. هذا الدرس هو أحد اهم دروس بلغة السي C و هو الحلقات التكرارية, سنتعرف على كل نوع من انواع حلقات تكرار و كيفيه بنائها.
حلقة For Loop في لغة سي
تستخدم حلقة for التكرارية لتكرار تنفيذ عملية محددة عدة مرات و تأخذ الصيغة الآتية
For(initial-value ; condition ; increment)
Statements;
حيث أن:
- initial-value هي القيمة المبدئية.
- condition الشرط انهاء التكرار.
- increment القيمة الزيادة في التكرارية.
مثال 1
اكتب برنامج يقوم بطباعة كلمة Nusur tech عشر مرات عن طريق إستخدام الأمر printf طباعة فقط بدون إستخدام الحلقات التكرارية.
#include<stdio.h>
main()
{
printf("Nusur tech \n");
printf("Nusur tech \n");
printf("Nusur tech \n");
printf("Nusur tech \n");
printf("Nusur tech \n");
printf("Nusur tech \n");
printf("Nusur tech \n");
printf("Nusur tech \n");
printf("Nusur tech \n");
printf("Nusur tech \n");
}
عندما نقوم بتشغيل هذا الكود سنحصل على نتيجته وهي طباعتها عشر مرات
Nusur tech
Nusur tech
Nusur tech
Nusur tech
Nusur tech
Nusur tech
Nusur tech
Nusur tech
Nusur tech
Nusur tech
نلاحظ اننا قمنا بتكرار امر الطباعة عدة مرات و تكبَّد الكثير من العناء في كتابته و حجم الكود, ماذا إذا كنت اريد طباعة "1000" سطر من هذه الجملة لكن هنالك حل و هو إستخدام حلقة for التكرارية و هي كتابة كود صغير جداً.
مثال 2
اكتب برنامج يقوم بطباعة كلمة Nusur tech عشر مرات عن طريق مستخدماً حلقة for التكرارية في لغة سي.
#include<stdio.h>
main()
{
Int a;
For(a=0;a<10;a++)
printf("Nusur tech \n");
}
وضعنا متغير عددي وهو a ثم دخلنا لحلقة تكرارية ووضعنا شرط a تساوي 0 و في حال. قيمة a اضغر من 10 قم بطباعة كلمة Nusur tech وفي كل دورة قم بزيادة العداد 1 إلى أن تصل 10 دورات. عند تنفيذ الكود سوف تكون نفس النتيجة في المثال الأول لكن هنا بشكل مختصر بإستخدام حلقة for.
مثال 3
اكتب برنامج كرر به مجموعة من النصوص و هي CS و DB و AMVIIP مستخدماً الحلقة for و دع البرنامج يطبعهم عشرة مرات و يتوقف.
#include<stdio.h>
main()
{
int a;
for(a=0;a<10;a++)
{
printf("cs \n");
printf("DB \n");
printf("AMVIIP\n");
}
}
من الملاحظ بأننا قمنا بفتح قوسين مجمعة بعد حلقة for لأنه قمنا بعمل عدة statements.
cs
DB
AMVIIP
cs
DB
AMVIIP
cs
DB
AMVIIP
cs
DB
AMVIIP
cs
DB
AMVIIP
cs
DB
AMVIIP
cs
DB
AMVIIP
cs
DB
AMVIIP
cs
DB
AMVIIP
cs
DB
AMVIIP
دعونا الآن لا نستخدم تلك الأقواس التي بعد الحلقة السابقة
#include<stdio.h>
main()
{
int a;
for(a=0;a<10;a++)
printf("cs \n");
printf("DB \n");
printf("AMVIIP\n");
}
و تنفيذ هذا الكود سوف يطبع لنا فقط cs عشر مرات بالشكل.
cs
cs
cs
cs
cs
cs
cs
cs
cs
cs
DB
AMVIIP
الآن الفكرة اصبحت واضحة لنا, عند إستخدام الأقواس في الكود الأول و عدم إستخدامهما في الكود الثاني حدث ما يلي:
- في حالة إستخدام الأقواس في التكرار سيكون كل الـ statement التي بداخل الحلقة "تنفيذ مجموعه من الجمل".
- في حالة عدم إستخدام الأقواس فإن التكرار سيكون لأول statement "تنفيذ اول جملة".
مثال 4
اكتب برنامج يقوم بطباعة الأعداد من 0 إلى 9.
#include<stdio.h>
main()
{
int a;
for(a=0;a<10;a++)
printf("\n a= %d \n" , a) ;
}
عند تشغيل هذا الكود ستكون النتيجة هي من 0 حتى 9 كما يلي
a= 0
a= 1
a= 2
a= 3
a= 4
a= 5
a= 6
a= 7
a= 8
a= 9
مثال 5
اكتب برنامج يقوم بطباعة مجموعة اعداد و زيادة بمعدل 2 فارق بين كل عدد.
#include<stdio.h>
main()
{
int a;
for(a=0;a<10;a+=2)
printf("\n a= %d \n" , a) ;
}
عندما نقوم بتشغيل الكود سوف تكون نتيجته
a= 0
a= 2
a= 4
a= 6
a= 8
مثال 6
اكتب برنامج يقوم بطباعة الأعداد بشكل تنازلي أي من 10 إلى 1.
#include<stdio.h>
main()
{
int a;
for(a=10;a>0;a--)
printf("\n a= %d \n" , a) ;
}
نتيجة تنفيذ هذا الكود هي
a= 10
a= 9
a= 8
a= 7
a= 6
a= 5
a= 4
a= 3
a= 2
a= 1
مثال 7
اكتب برنامج يقوم بطباعة اعداد من 1 إلى 5 تصاعدياً ثم يقوم بطباعة اعداد من 5 إلى 1 تنازلياً.
#include<stdio.h>
main()
{
int a , b;
for(a=0;a<5;a++)
{
printf("\n a= %d \n" , a);
}
for(b=5;b>=0;b--)
{
printf("\n b= %d \n" , b);
}
}
هذا الكود عند الضغط على run به سوف تكون النتيجة من 1 حتى 5 ثم من 5 حتى واحد كما يلي
a= 1
a= 2
a= 3
a= 4
b= 5
b= 4
b= 3
b= 2
b= 1
b= 0
حلقة while Loop في لغة سي
حلقة while التكرارية في لغة سي تستخدم لتكرار تنفيذ جملة معينة او مجموعة من الجمل و يتوقف التكرار عند تنفيذ العدد الموجود في الشرط. وتكون الصيغة العامة لحلقة while loop في سي هي
while(condition)
Statements;
هذا يعني أن طالما الشرط صحيح قم بتنفيذ الجملة و إذا كان الشرط غير صحيح توقف عن التكرار.
مثال 8
أكتب برنامج يقوم بطباعة CS عشر مرات بإستخدام حلقة while و يتوقف في المرة الحادي عشر.
#include<stdio.h>
main()
{
int a=0;
while(a<10(
{
printf(" \n CS ");
a++;
}
}
حيث أن Int a=0 تمثل القيمة المبدئية لـ a, وعند تشغيل الكود سيطبعه عشر مرات بالشكل
CS
CS
CS
CS
CS
CS
CS
CS
CS
CS
مثال 9
برنامج يقوم بتكرار اكثر من جملة saja ,doha ,ahmed.
#include<stdio.h>
main()
{
int a=0;
while(a<2)
{
printf(" \n Saja ");
printf(" \n Doha ");
printf(" \n Ahmed \n");
a++;
}
}
لأن القيمة المبدئية هي صفر و إن الحلقة ستقوم بتكرار مرتين فقط بالشكل
Saja
Doha
Ahmed
Saja
Doha
Ahmed
الفرق بين حلقتي for و while في لغة سي
- حلقة for عددية تعتمد على عدد معين و ينتهي التكرار فيها بإنتهاء عدد مرات التكرار.
- حلقة while هي حلقة تكرر الجمل التي تليها طالما أن الشرط صحيح و تنتهي بكسر الشرط أي حتى يصبح الشرط غير صحيح.
حلقة do while Loop في لغة سي
الحلقة do while loop في السي تستخدم لتكرار تنفيذ جملة أو مجموعة من الجمل اكثر من مرة بناءً على شرط معين كما عند إستخدام while. ولكن الفرق بينهما هو أن while تختبر إذا كان الشرط صحيح ام لا أما do - while تنفذ الجملة التالية لها اولاً ثم تختبر الشرط, فإذا كان صحيح تعيد تنفيذ الا تتوقف التكرار. وتكون الصيغة العامة لحلقة do while loop في لغة سي كما يلي
Do{
Statements;}While(condition)
مثال 10
اكتب برنامج إسمه CS يقوم بطباعة الأعداد من 1 حتى 15 بإستخدام حلقة do - whlie التكرارية.
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 1;
do{
printf("\n%d",i);
i++;
}while(i<16);
}
عند تشغيل هذا الكود سوف يقوم بطباعة جميع الأعداد من الرقم 1 حتى الرقم 15.
مثال 11
اكتب برنامج يقوم بطباعة كلمة Nusur Tech عشر مرات مستخدما حلقة do-while في لغة سي C.
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x = 0;
do{
printf("\n Nusur Tech");
x++;
}while(x<10);
}
سيقوم بطباعة Nusur Tech عشر مرات و يتوقف.
مثال 12
اكتب برنامج يقوم بالطلب من المستخدم أن يكتب عدد N و يقوم البرنامج بجمع الرقم مع الأرقام الذي اقل منه إلى أن يصل إلى الـ 0 مستخدماً حلقة do-while مستخدماً في هذا لغة C.
#include<stdio.h>
#include<stdlib.h>
int main()
{
int N;
printf("enter the number: ");
scanf("%d", &N);
int s = 0; int i=1;
do{
s = s+ i;
i++;
}while(i<N+1);
printf("sum: %d",s);
}
فإذا قام المستخدم بإدخال الرقم 5 سوف تكون نتيجة الكود بالشكل
enter the number: 5
sum: 15
نلاحظ أنه عندما المستخدم بإدخال الرقم 5 فالبرنامج اعطانا رقم 15 يعني انه قام بجمع الرقم نفسه 5 مع الرقم الذي اقل منه 4 ثم مع الرقم 3 ثم الرقم 2 ثم 1 و المجموع كان 15.
الحلقات التكرارية المتداخلة
الحلقات المتداخلة ( 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 من الصفر مرة اُخرى و ستقوم بنفس العمل حتى نحصل على مربع بعرض ثلاثة نجمات. و طول ثلاثة نجمات و هذا جواب ما يحصل إذا كان لدينا سطر برمجي يٌكرر سطر برمجي ثلاث مرات.
مثال 13
قُم بعمل برنامج لطباعة مربع من النجوم يطلُب من المُستخدم أن يكتُب عرض و طول المربع لهذا العرض.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(int argc, char** argv)
{
int h;
printf("Enter the length of the square \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 من قبل المستخدم سيكون.
Enter the length of the square
6
* * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * * * *
عند إدخال المستخدم رقم 3 ستكون النتيجة هي
Enter the length of the square
3
* * *
* * *
* * *
مثال 14
قُم بعمل برنامج يطبَع مستطيل من النجوم بحيث يطلُب من المُستخدِم أن يُدخِل الطول ثم العرض ثم يطبع المستطيل.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(int argc, char** argv)
{
int h;
int w;
printf("Enter the length of the rectangle\n");
scanf("%d", &h);
printf("Enter the width of the rectangle \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 ستكون النتيجة كالتالي.
Enter the length of the rectangle
6
Enter the width of the rectangle
8
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
مثال 15
اُكتُب برنامج يقوم ببناء مثلث من الرقم 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 في كل دورة و النزول سطراً جديداً بعدها.
و عند تشغيل هذا البرنامج سوف تكون نتيجته هي كالآتي.
7 7 7 7 7 7 7
6 6 6 6 6 6
5 5 5 5 5
4 4 4 4
3 3 3
2 2
1
إذا اتقنت التعامل مع الحلقات التكرارية المتداخلة Loops Nested سوف تنمي قدراتك في التحليل بشكل أكبر.