كتبه: karwanpro / بتاريخ: 2013-08-21 , چوار شه‌ممه‌
تخيل انك تريد ادخال اسماء الآلاف الطلبة ودرجاتهم ومعرفة اعلى درجة وادنى درجة ومعدل النجاح أو انك تريد برنامج لحساب الآلاف الاعداد أو اي برنامج اخر ينعامل مع الالاف البيانات انك تظطر الى كتابة كود لكل طالب او عدد أو جزء وبذلك لا يكتمل برنامج الا بكتابة عشرات الالاف من الاكواد ( لولا ) حلقات التكرار العجيبة, أذا لنتعلم واحدة منها


سندخل في الموضوع مباشرة بدون لف أو دوران مع ان الموضوع يتعلق بالدوران والتكرار لنأخذ جزئية البرنامج التالي
Code

#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++:المتغير يزيد بمقدار واحد مع بداية كل حلقة – لاتضع بعده فاصلة منقوطة
):قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة
{:قوس بداية بلوك الاوامر المطلوب تكرارها بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها
}:قوس نهاية بلوك الاوامر المطلوب تكرارها

بداخل بلوك الاوامر تم تنفيذ الامر

Code

  cout<<x<<endl
  

وهو امر يقوم بطبع قيمة x التي تتغير في كل مرة ابتداء من صفر حسب ماذكرت ان
X=0 وتزيد في كل مرة بمقدار 1 حسبما ذكرت ان x++ وذلك حتى يصل الى 99 حسبما ذكرت ان x<100
وendl تعني end of line اي انتقل الى سطر جديد كلما طبعت قيمة حتى لا يسرد طبع الارقام متجاورة بل يطبع على كل سطر قيمة المتغير وبالتالي ستكون مخراجات البرنامج كما يلي
0|1|2|3|4|...|99

لنستفيد اكثر من قوة الحلقات التكرارية وايضا نرى امكانات اخرى لها بوضع حلقة داخل حلقة كما يلى في البرنامج الذي يطبع جدول الضرب من جدول واحد حتى جدول 12
Code
  
#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 وتزيد بمقدار واحد واوامر هذه الحلقة مكتوبة للتوضيح بخلفية صفراء حيث بدأت الحلقة بالصيغة السابق شرحها ثم قوس بداية البلوك وقوس نهاية البلوك حيث يوضع مابين القوسين سلسلة اوامر لتنفيذها كما سبق واتفقنا عليه
Code

  for(x=1;x<13;x++)
  {  
   
اوامر مطلوب تنفيذها
}
  

وبداخل اقواس البلوك للحلقة الاولى مطلوب وضع اوامر للتنفيذ فكانت اوامر التنفيذ داخل البلوك عبارة عن حلقة اخرى وما المانع فالحلقات وغيرها هي نفسها اوامر والحلقه الاخرى كانت عبارة عن عداد يعد من الرقم 1 الى الرقم 12 وهي ايضا تحتاج الى صيغة معينة واقواس بلوك للتنفيذ وهي موضوعة في البرنامج بخلفية خضراء كما يلي
Code

for(y=1;y<13;y++)
  {  
  z = x * y;  
  cout<<x<<"*"<<y<<"="<<z<<endl;  
  }

وبداخل بلوك الاوامر للحلقة الثانية وضعنا عدة اوامر لتفى بالغرض الذي من اجله تم عمل البرنامج وهو جدول الضرب – عبارة عن معادلة لحساب حاصل ضرب المتغيرين x و y
ويوضع الناتج في المتغير z كما يلي
Code

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

شرح صياغة امر الطبع بالصورة التالية

Code

cout<<x<<"*"<<y<<"="<<z<<endl;
   

مابداخل علامات الاقتباس دائما يطبع وكل مايوضع داخل علامة الاقتباس يطبع نصه كما هو اما ماهو خارج علامات الاقتباس بين ازواج الاقواس >>متغير>> فيطبع قيمة المتغير وليس اسم المتغير فمثلا x لاتطبع x ولكن تطبع قيمتها فمثلا 1 – 2 – 3 ----- 12 حيث انها متغيرات وتميز اعلاه بالخلفية الصفراء وذلك للحصول على شكل مقبول يوضح العملية المطلوبة لتظهر النتائج بالصورة

12 * 12 = 144

والآن الى النوع الثاني من الحلقات وهو ابسط من السابق ولكن السابق اكثر استخداما واكثر قوة
Code

While
   
#include <iostream.h>  
   
int main()  
{
  int x=0;  
  while(x<100)  
  {
  cout<<x<<endl;
  x++;  
   
  }  
  return 0;
}
  

سوف اشرحها لك في سطور قليلة لبساطتها الاوامر باللون الازرق سبق شرحها اما الحلقة موضع النقاش فهي باللون الاحمر وصيغتها
Code

while(x<100)
  

وبعد الاعلان عن المتغير اكس خلاصة شرح الامر السابق (أعد تنفيذ ما بداخل البلوك طالما اكس او المتغير اقل من 100 ثم اقواس بلوك تضع ماشئت بداخله من اوامر وقوس نهاية البلوك ويزيد معنا فقط عداد للمتغير ليزيده بالمقدار الذي تريده ويوضع في اي مكان داخل الحلقة او حسب افكارك عن البرنامج المهم لاتنساه والا سوف يدور البرنامج داخل الحلقة الى الابد حيث ان شرط نهايتها ان تزيد اكس عن 100 وطالما لم تضع عداد زياده للمتغير فلن يتحقق الشرط وبالتالى لن تنتهي الحلقه الى الابد ويظل يعمل الكومبيوتر بلا نهاية للبرنامج ويميز العداد بالخلفية الصفراء واليك جدول صياغة الامر الذي تعودنا عليه.

while:امر اللغة لعملية التكرار
(: قوس مفتوح يوضح بداخله بارامترات الامر
X<100: المتغير مع شرط لنهاية الحلقة
): قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة
{: قوس بداية بلوك الاوامر المطلوب تكرارها بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها
x++;: ولا تنسى عداد الزياده او النقصان ليتحقق الشرط لانهاء تنفيذ الحلقة
}: قوس نهاية بلوك الاوامر المطلوب تكرارها

لقد ذكرت لك كلمة عداد الزيادة او النقصان نعم يمكن ان يتناقص العداد اذا كانت صيغة البرنامج كما يلي وذلك لطبع قيمة المتغير تناقصيا من 99 الى صفر بعد ان كان في البرنامج السابق تصاعديا من صفر الى 99 ويكون التعديل كما يلي
Code

#include <iostream.h>  
   
int main()  
{
  int x=99;  
  while(x>0)  
  {
  cout<<x<<endl;
  x--;  
   
  }  
  return 0;
}
  

بدء هنا تخصيص المتغير مع الاعلان بالقيمة 99 ثم شرط التكرار ان يكون متى كانت قيمة المتغير اكبر من الصفر ثم عداد تناقصي يظل يطرح واحد من القيمة الى ان يصل الى الصفر ثم يطرح من الصفر 1 فتصبح قيمته –1 وبالتالي لايتحقق الشرط حيث ان قيمة –1 ليست اكبر من الصفر وتنتهي الحلقه كما نريد لاحظ العداد التناقصي بالخلفية الصفراء
Share

rss facebooki twitter google plus
فیسبوك
نصيحة برمجية
أصحاب المواقع
مواضيع اخرى
آخر كتاب قرأته