مدونة علم البرمجة والحاسوب
من حقك ان تتعلم اكثر

الحلقات والتكرارات سي بلس بلس - C++ Loops

سندخل في الموضوع مباشرة بدون لف أو دوران مع ان الموضوع يتعلق بالدوران والتكرار لقد تحدثنا عن فكرة الحلقات التكرارية او Loops في المقال العام عن البرمجة
طريقتين لعمل هذه الحلقات الاسلوب الاول بلامر for  والثاني بالامر while
لنأخذ جزئية البرنامج التالي  
 
#include <iostream.h>            
int main()         
 {   
  int x;       
  for(x=0;x<100;x++)
  {          
             
    cout<<x<<endl;     
 }
    return 0; 
  }
 
 
السطور ذات اللون الازرق تناولنا شرحها بالدرس الاول أما السطور ذات اللون الاحمر فهي موضوع دراستنا اليوم
تقوم الحلقات التكرارية بتنفيذ عدة اوامر موضوعة داخل بلوك ونقصد ببلوك مابين القوسين } مجموعة اوامر{ الى ان تنتهي الحلقات او عدد الحلقات المحددة منك وعددها في مثالنا السابق 100 حلقة تكرارية وبدقة تبدء الحلقات من رقم صفر الى رقم 99 ومعنى ذلك ان العدد الاجمالي 100 حلقة بعد حساب الصفر من ضمن الارقام انتبه لذلك وتذكر ان المتغير x  يجب الاعلان عنه قبل استخدامه وذلك حسب نوع استخدامك له وهنا استخدمنا نوعه كعدد صحيح بالطبع يمكنك استخدامه كعدد عشري واليك صيغة الامر بالتفصيل
 
   
الصيغة
التفسير
for
امر اللغة لعملية التكرار
(
قوس مفتوح يوضح بداخله بارامترات الامر
x=0;
المتغير = رقم بداية الحلقات
x<100;
شرط نهاية الحلقات
x++
المتغير يزيد بمقدار واحد مع بداية كل حلقة – لاتضع بعده فاصلة منقوطة
)
قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة
{
قوس بداية بلوك الاوامر المطلوب تكرارها
بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها
}
قوس نهاية بلوك الاوامر المطلوب تكرارها
 
بداخل بلوك الاوامر تم تنفيذ الامر
    cout<<x<<endl
 
وهو امر يقوم بطبع قيمة x  التي تتغير في كل مرة ابتداء من صفر حسب ماذكرت ان
X=0  وتزيد في كل مرة بمقدار 1 حسبما ذكرت ان x++  وذلك حتى يصل الى 99 حسبما ذكرت ان x<100  
وendl  تعني end of line  اي انتقل الى سطر جديد كلما طبعت قيمة حتى لا يسرد طبع الارقام متجاورة بل يطبع على كل سطر قيمة المتغير وبالتالي ستكون مخراجات البرنامج كما يلي
0
1
2
3
4
.
.
.
99
 
لنستفيد اكثر من قوة الحلقات التكرارية وايضا نرى امكانات اخرى لها بوضع حلقة داخل حلقة كما يلى   في البرنامج الذي يطبع جدول الضرب  من جدول واحد حتى جدول 12
   
#include <iostream.h>            
int main()         
 {   
  int x , y , z;       
  for(x=1;x<13;x++)
  {          
  for(y=1;y<13;y++)
  { 
     z = x * y;        
    cout<<x<<”*”<<y<<”=”<<z<<endl;     
 }
 }
 
  return 0; 
 
}
كما تعلم ان السطور الزرقاء سبق دراستها ولكن ننوه فقط اننا اعلنا عن ثلاث متغيرات لاعداد صحيحة الاول للحلقة الاولى والثاني للحلقة الثانية والثالث لاحتواء حاصل الضرب وهو الهدف من البرنامج.
بنفس ماسبق شرحه وضعنا حلقة تكرارية تبدء من رقم واحد وتنتهي برقم 12 وتزيد بمقدار واحد واوامر هذه الحلقة مكتوبة للتوضيح بخلفية صفراء حيث بدأت الحلقة بالصيغة السابق شرحها ثم قوس بداية البلوك وقوس نهاية البلوك حيث يوضع مابين القوسين سلسلة اوامر لتنفيذها كما سبق واتفقنا عليه
 
  for(x=1;x<13;x++)
  {          
 
اوامر مطلوب تنفيذها
}
 
وبداخل اقواس البلوك للحلقة الاولى مطلوب وضع اوامر للتنفيذ فكانت اوامر التنفيذ داخل البلوك عبارة عن حلقة اخرى وما المانع فالحلقات وغيرها هي نفسها اوامر والحلقه الاخرى كانت عبارة عن عداد يعد من الرقم 1 الى الرقم 12 وهي ايضا تحتاج الى صيغة معينة واقواس بلوك للتنفيذ وهي موضوعة في البرنامج بخلفية خضراء كما يلي
for(y=1;y<13;y++)
  { 
     z = x * y;        
    cout<<x<<"*"<<y<<"="<<z<<endl;     
 }
وبداخل بلوك الاوامر للحلقة الثانية وضعنا عدة اوامر لتفى بالغرض الذي من اجله تم عمل البرنامج وهو جدول الضرب – عبارة عن معادلة لحساب حاصل ضرب المتغيرين x و y
ويوضع الناتج في المتغير z  كما يلي
 
z = x * y;   
بالطبع تلى ذلك صيغة لطبع مخرجات البرنامج والا ما الفائدة منه اذا لم ارى نتيجة عملى وهذه الصيغة سأشرح لك فيما بعد وفي هذا الدرس لماذا اخترت هذه الصيغة بالتحديد فهو ليس موضوعنا الآن ودعني اشرح لك الاهم من ذلك وهو ميكانيكية عمل الحلقتين
 
·        يبدء البرنامج بالدخول الى الحلقه الاولى ويخصص للمتغير اكس القيمة واحد حيث انها قيمة عداد البداية ثم يدخل الى داخل اقواس بلوكه لتنفيذ ما بداخله فيجد حلقه اخرى فيبدء بتنفيذها وطلبت الحلقة ان يكون متغيرها واي يبدء بالقيمة واحد وينتهي بالقيمة 12 ثم تدخل الحلقة الثانية الى بلوك اوامرها فتجد معادلة يضرب فيها قيمة اكس التي هي واحد الآن وتتغير قيمة واي فيها ثم طبع النتائج وتظل الحلقة الداخلية تنفذ بتغير واي مع ثبات اكس بالطبع وتكون النتائج كما يلى
 
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
.
.
.
1 * 12 = 12
وعند وصول نهاية عداد الحلقة الداخلية الى 12 وهو نهاية الحلقة ينتهي تنفيذ الحلقة فيستمر البرنامج فيجد امامه قوس نهاية الحلقه الخارجية ذو الخلفية الصفراء فيعود الى الحلقة الخارجيه حيث تزيد قيمة اكس بمقدار واحد وتصبح قيمتها = 2 فيدخل الى بلوك اوامره كما سبق فيجد حلقة اخرى تبدء من واحد وتنتهي ب 12 وبداخلها معادلة وامر طبع فيكون التنفيذ كما يلي
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
.
.
.
2 * 12 = 24
 
وهكذا يستمر التنفيذ الى ان تصل الحلقة الخارجية الى نهايتها بالرقم 12 واثناء ذلك تنفذ الحلقة الداخلية من بدايتها الى نهايتها اي من 1 الى 12 وتطبق المعادلة وامر الطبع ليكون اخر تنفيذ كما يلي
12 * 1 = 12
12 * 2 = 24
12 * 3 = 36
.
.
.
12 * 12 = 144
 
شرح صياغة امر الطبع بالصورة التالية
 
 
cout<<x<<"*"<<y<<"="<<z<<endl;
 
مابداخل علامات الاقتباس دائما يطبع كما هو وهو مميز اعلاه بالخلفية الخضراء وكل مايوضع داخل علامة الاقتباس يطبع نصه كما هو اما ماهو خارج علامات الاقتباس بين ازواج الاقواس >>متغير>> فيطبع قيمة المتغير وليس اسم المتغير فمثلا x  لاتطبع x  ولكن تطبع قيمتها فمثلا 1 – 2 – 3    ----- 12 حيث انها متغيرات وتميز اعلاه بالخلفية الصفراء وذلك للحصول على شكل مقبول يوضح العملية المطلوبة لتظهر النتائج بالصورة
 
12 * 12 = 144
 
والآن الى النوع الثاني من الحلقات وهو ابسط من السابق ولكن السابق اكثر استخداما واكثر قوة
 
While
 
#include <iostream.h>  
 
int main()              
{
 int x=0;           
 while(x<100)     
 {
    cout<<x<<endl;
    x++;     
               
  }            
 return 0;
}
 
سوف اشرحها لك في سطور قليلة لبساطتها الاوامر باللون الازرق سبق شرحها اما الحلقة موضع النقاش فهي باللون الاحمر وصيغتها
 
while(x<100)
 
وبعد الاعلان عن المتغير اكس خلاصة شرح الامر السابق (أعد تنفيذ ما بداخل البلوك طالما اكس او المتغير اقل من 100 ثم اقواس بلوك تضع ماشئت بداخله من اوامر وقوس نهاية البلوك ويزيد معنا فقط عداد للمتغير ليزيده بالمقدار الذي تريده ويوضع في اي مكان داخل الحلقة او حسب افكارك عن البرنامج المهم لاتنساه والا سوف يدور البرنامج داخل الحلقة الى الابد حيث ان شرط نهايتها ان تزيد اكس عن 100 وطالما لم تضع عداد زياده للمتغير فلن يتحقق الشرط وبالتالى لن تنتهي الحلقه الى الابد ويظل يعمل الكومبيوتر بلا نهاية للبرنامج ويميز العداد بالخلفية الصفراء واليك جدول صياغة الامر الذي تعودنا عليه.
 
الصيغة
التفسير
while
امر اللغة لعملية التكرار
(
قوس مفتوح يوضح بداخله بارامترات الامر
X<100
المتغير مع شرط لنهاية الحلقة
)
قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة
{
قوس بداية بلوك الاوامر المطلوب تكرارها
بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها
x++;
ولا تنسى عداد الزياده او النقصان ليتحقق الشرط لانهاء تنفيذ الحلقة
}
قوس نهاية بلوك الاوامر المطلوب تكرارها
 
 
لقد ذكرت لك كلمة عداد الزيادة او النقصان نعم يمكن ان يتناقص العداد اذا كانت صيغة البرنامج كما يلي وذلك لطبع قيمة المتغير تناقصيا من 99 الى صفر بعد ان كان في البرنامج السابق تصاعديا من صفر الى 99 ويكون التعديل كما يلي
 
#include <iostream.h>  
 
int main()              
{
 int x=99;          
 while(x>0)       
 {
    cout<<x<<endl;
    x--;     
               
  }            
 return 0;
}
 
بدء هنا تخصيص المتغير مع الاعلان بالقيمة 99 ثم شرط التكرار ان يكون متى كانت قيمة المتغير اكبر من الصفر ثم عداد تناقصي يظل يطرح واحد من القيمة الى ان يصل الى الصفر ثم يطرح من الصفر 1 فتصبح قيمته –1 وبالتالي لايتحقق الشرط حيث ان قيمة –1 ليست اكبر من الصفر وتنتهي الحلقه كما نريد لاحظ العداد التناقصي بالخلفية الصفراء

أرشيف المدونة الإلكترونية

من انا ؟