

شرح الحلقات التكرارية
ما هو التكرار ولماذا نستخدمه وكيف يتم ؟
التكرار هو وسيلة لإختصار العمليات المتشابه عن طريق كتابة أو الإعلان عن كلمة محجوزة فى محرر الأكشن فى البرنامج تفيد إعلام البرنامج عن آداء مكرر لعدد معين أو عند الوصول إلى نتيجة معينة ثم وضع معطيات لهذا التكرار ليعمل بناءا علية ثم إعطاء أمر التنفيذ وهو أيضا كلمة محجوزة ويتبع أمر أو كلمة نفذ أو إفعل ما يريد المبرمج تنفيذه من أكواد يتم وضعها ويتم غلق التكرار بإعطاء أمر آخر وهو عبارة عن كلمة محجوزة مفادها هو التوقف :
قد تكون الكلمة المعبرة عن التكرار كالتالى :
for أو repeat أو while
الجزء الأول : الكلمة المحجوزة for :
أولا : يمكن أن يكون التكرار Numeric رقمية أو عددية ويكون بناء هذه الحلقة كالتالى :
كود:
-- for var=exp1,exp2,exp3 do something end

فى الكود السابق تم وضع متغير إفتراضى " يمكن تغييره بآخر كما تريد " كان المتغير هو "var" يوضع لهذا المتغير من وإلى ومقدار خطوة أو خطوات تنفيذية إما المقدار يكون بالإيجاب أو بالسلب أى زيادة أو نقصان بمعنى إجمالى تم وضع معطيات للتكرار " رسم طريق له "
فإذا أخذنا على سبيل المثال الكود التالى :
كود:
-- for var=1,15,2 do Dialog.Message("Notice", var, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end
وكان المعطى الثانى هو نهاية العملية التكرارية عند القيمة العددية أو الرقمية 15
وكان المعطى الثالث هو مقدار تحرك أو خطوات التكرار عند القيمة العددية أو الرقمية التقديرية 2 أى مقدار خطوتين فى المرة الواحدة أثناء التكرار
إذن التكرار السابق بدأ من 1 ثم يزيد رقمين إلى هذا الرقم الذى بدأ منه فيكون الناتج هو 3 فى المرة التالية للمرة الأولى
ثم يزيد رقمين على المرة الثانية فيكون الناتج هو 5 فى المرة الثالثة
ثم يزيد رقمين على المرة الثالثة فيكون الناتج هو 7 فى المرة الرابعة
ثم يزيد رقمين على المرة الرابعة فيكون الناتج هو 9 فى المرة الخامسة
ثم يزيد رقمين على المرة الخامسة فيكون الناتج هو 11 فى المرة السادسة
ثم يزيد رقمين على المرة السادسة فيكون الناتج هو 13 فى المرة السابعة
ثم يزيد رقمين على المرة السابعة فيكون الناتج هو 15 فى المرة الثامنة
عندما يصل الناتج إلى الحد أو القيمة التى وضعناها وهى 15 يكون هو نهاية إجبارية للدالة التكرارية .
إذن التكرار تم على ثمانى مراحل نتيجة إعطاء مقدار تحرك للدالة وهو 2
إذن إذا تم تغيير عدد الخطوات أو مقدار تحرك 3 بدلا من 2 سوف تبدأ النتيجة من 1 ثم يتم زيادة 3 للنتيجة فى كل مرة
حتى يصل إلى النتيجة النهائية 13 فيتوقف التكرار عندها لآنة إذا تم زيادة 3 إلى 13 ستكون النتيجة 16 ولكننا وضعنا الحد هو 15 فقط وعلى ذلك لن يتم تنفيذ هذة الخطوة .
ما سبق يمكن تسميتة تكرار تصاعدى بمقدار معين .
كما يمكن أن يكون التكرار من تنازلى أى يكون بداية التكرار هو من الحد الأقصى ونهاية التكرار هو الحد الأدنى وأيضا يمكن إستعمال مقدار خطوة تكرارى سالب
كما يوضح المثال التالى المشابة للمثال الأول ولكنة تنازلى :
كود:
-- for var=15,1,-2 do Dialog.Message("Notice", var, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end
إذن فى الكود السابق نطلب تكرارا لمعطيات متغير إسمه "var" كان المعطى الأول هو بداية العملية التكرارية من القيمة العددية أو الرقمية 15
وكان المعطى الثانى هو نهاية العملية التكرارية عند القيمة العددية أو الرقمية 1
وكان المعطى الثالث هو مقدار تحرك أو خطوات التكرار عند القيمة العددية أو الرقمية التقديرية سالبة 2- أى مقدار خطوتين سالبتين فى المرة الواحدة أثناء التكرار التنازلى
إذن التكرار السابق بدأ من 15 ثم ينقص رقمين من هذا الرقم الذى بدأ منه فيكون الناتج هو 13 فى المرة التالية للمرة الأولى
ثم ينقص رقمين على المرة الثانية فيكون الناتج هو 11 فى المرة الثالثة
ثم ينقص رقمين على المرة الثالثة فيكون الناتج هو 9 فى المرة الرابعة
ثم ينقص رقمين على المرة الرابعة فيكون الناتج هو 7 فى المرة الخامسة
ثم ينقص رقمين على المرة الخامسة فيكون الناتج هو 5 فى المرة السادسة
ثم ينقص رقمين على المرة السادسة فيكون الناتج هو 3 فى المرة السابعة
ثم ينقص رقمين على المرة السابعة فيكون الناتج هو 1 فى المرة الثامنة
عندما يصل الناتج إلى الحد أو القيمة التى وضعناها وهى 1 يكون هو نهاية إجبارية للدالة التكرارية .
إذن التكرار تم على ثمانى مراحل نتيجة إعطاء مقدار تحرك للدالة وهو 2- وهو مقدار سالب لتكرار تنازلى .
إذن إذا تم تغيير عدد الخطوات أو مقدار تحرك 3- بدلا من 2- سوف تبدأ النتيجة من 15 ثم يتم إنقاص 3 للنتيجة فى كل مرة
حتى يصل إلى النتيجة النهائية 3 فيتوقف التكرار عندها لآنة إذا تم نقصان 3 من 3 ستكون النتيجة "صفر" ولكننا وضعنا الحد هو 1 فقط وعلى ذلك لن يتم تنفيذ هذة الخطوة .
إذن فى المجمل العام هذا التكرار هو تكرار تنازلى .
وفى العموم أو الإتجاه العام أنت عزيزى المبرمج تقرر هل تريد إستخدام مقدار خطوة أثناء التكرار أم لا تريد ذلك حسب الإحتياج البرمجى لما تريد تنفيذة ففى بعض الأحيان قد يستخدم المقدار هذا كــــ قفزات تكرارية على حسب ما يحتاجة المشروع أى أنه ليس ضروريا كتابة هذا المقدار الخطوى التكرارى إلا إذا كنت بحاجة لفكرة ما .
إذن يمكن أن يكون التكرار لة بداية ونهاية فقط كما توضح الصورة التالية :

أيضا يمكن أن يكون التكرار بهذا الشكل تصاعدى أوتنازلى حسب رغبة المبرمج وإحتياج العملية البرمجية وأيضا رغم أننا لم نكتب خطور مقدارية أو مقدار خطوة لهذا التكرار فإنها تحسب أوتوماتيكيا كـــــ خطوة واحدة 1 إما خطوة إيجابية أى موجبة أو خطوة سلبية أى سالبة ودون أن يتدخل المبرمج لكتابة ذلك .
إذا أخذنا مثالا على ذلك نكتب هذا الكود لتكرار ظهور ديالوج يوضح الرقم الذى يتم تخزينة أثناء التكرار المحدد من حيث البداية والنهاية والتصاعدى كالتالى :
كود:
-- for var=1,15 do Dialog.Message("Notice", var, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end
وكان المعطى الثانى هو نهاية العملية التكرارية عند القيمة العددية أو الرقمية 15
إذن التكرار السابق بدأ من 1 ثم يزيد رقم واحد فقط إلى هذا الرقم الذى بدأ منه فيكون الناتج هو 2 فى المرة التالية للمرة الأولى
ثم يزيد رقم على المرة الثانية فيكون الناتج هو 3 فى المرة الثالثة
ثم يزيد رقم على المرة الثالثة فيكون الناتج هو 4 فى المرة الرابعة
ثم يزيد رقم على المرة الرابعة فيكون الناتج هو 5 فى المرة الخامسة
ثم يزيد رقم على المرة الخامسة فيكون الناتج هو 6 فى المرة السادسة
ثم يزيد رقم على المرة السادسة فيكون الناتج هو 7 فى المرة السابعة
ثم يزيد رقم على المرة السابعة فيكون الناتج هو 8 فى المرة الثامنة
ثم يزيد رقم على المرة الثامنة فيكون الناتج هو 9 فى المرة التاسعة
ثم يزيد رقم على المرة التاسعة فيكون الناتج هو 10 فى المرة العاشرة
ثم يزيد رقم على المرة العاشرة فيكون الناتج هو 11 فى المرة الحادية عشر
ثم يزيد رقم على المرة الحادية عشر فيكون الناتج هو 12 فى الثانية عشر
ثم يزيد رقم على المرة الثانية عشر فيكون الناتج هو 13 فى المرة الثالثة عشر
ثم يزيد رقم على المرة الثالثة عشر فيكون الناتج هو 14 فى المرة الرابعة عشر
ثم يزيد رقم على المرة الرابعة عشر فيكون الناتج هو 15 فى المرة الخامسة عشر
عندما يصل الناتج إلى الحد أو القيمة التى وضعناها وهى 15 يكون هو نهاية إجبارية للدالة التكرارية .
إذن التكرار تم على خمسة عشر مرحلة نتيجة عدم إعطاء مقدار تحرك للدالة وكان الإفتراضى الأتوماتيكى وهو 1 فيكون التكرار هو تصاعدى موجب بخطوة واحدة ودون كتابتها من قبل المبرمج ووضع 100 خط تحت تصاعدى خطوة موجبة واحدة فقط .
أما إذا أردناه تنازليا لابد من كتابة المقدار للخطوة ويتم كتابتة قيمة سالبة حتى يفهم أن التكرار هو تنازليا وليس تصاعديا كما تم توضيحة بالشرح سابقا .

ثانيا : يمكن أن يكون التكرار Generic عام ويستخدم هذا النوع من التكرار بواسطة الكلمة المحجوزة for مع الدوال الوظيفية functions والتى يكون لها ريتيرن على شكل مصفوفة أو جدول فيسمح هذا النوع من التكرار بإستخدام مفتاح وقيمة لتصفح أو إستطلاع محتويات الجدول أو المصفوفة .

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

نأخذ مثال للتكرار مع ()pairs يكون كالتالى :
كود:
-- a = {"one", "two", "three"} for i, v in pairs(a) do Dialog.Message("Notice", i.." = "..v, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end

كود:
-- a = {"one", "two", "three"} for i, v in next , a do Dialog.Message("Notice", i.." = "..v, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end
إذن بطبيق أى من الكودين السابقين سيكون النتيجة متطابقة تماما ولا يوجد فرق بينهما ويكون الناتج هو ظهور ديالوج بمحتويات الجدول على مرات متتالية كمفتاح وقيمة .


الجزء الثانى : الكلمة المحجوزة repeat :
فى هذا النوع من التكرار بواسطة الكلمة repeat كأننا نصرح للبرنامج بتكرار تنفيذ كود أو عملية معينة مع التأكد من أن الحد الأقصى للتكرار عندما يحدث شيئ معين نريدة .
مثال بسيط على ذلك نريد البرنامج أن يعمل عداد تصاعدى لقيمة متغير على سبيل المثال إسم المتغير هو i
فنقوم بالإعلان عن المتغير وقيمتة الإفتراضية أولا وذلك بأن نكتب :
i=1
إذن إفترضنا للبرنامج أن قيمة i تساوى واحد
ثم نقوم بكتابة التصريح أو الكلمة المعبرة عن التكرار فى هذه الحالة هى repeat ثم محتوى الكود المراد تكراره وهو على سبيل المثال تكرار زيادة 1 إلى قيمة المتغير i الإفتراضية مع كل مرة أو فى كل مرة ثم كتابة الحد الأقصى للتكرار ويكون بإستخدام الكلمة المحجوزة والتى تستخدم مع التكرار repeat وهى كلمة until وأيضا هى النهاية التى يقف أو يتوقف عندها هذا النوع من التكرار فعندما يقرأها البرنامج أثناء تنفيذ الحلقة التكرارية فى كل دورة للحلقة يعمل على مطابقة النتيجة التى يصل لها كقيمة المتغير i مع القيمة المرار الوصول إليها كحد أقصى .
مثال لبناء الكود كما فى الشرح السابق :
كود:
-- i = 1 ; repeat i = i + 1 ; until i ==10

كود:
-- i = 1 ; repeat Dialog.Message("Notice", i, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); i = i + 1 ; until i == 10
بالمعاينة تظهر رسالة تكرارية بها قيمة i تساوى 1
ثم تظهر رسالة بها قيمة i تساوى 2 لأن أثناء التكرار وضعنا قيمة جديدة للمتغير i وهى قيمتة السابقة بزيادة 1 إليها
ثم تظهر رسالة بها قيمة i تساوى 3 لأن أثناء التكرار وضعنا قيمة جديدة للمتغير i وهى قيمتة السابقة بزيادة 1 إليها
ثم تظهر رسالة بها قيمة i تساوى 4 لأن أثناء التكرار وضعنا قيمة جديدة للمتغير i وهى قيمتة السابقة بزيادة 1 إليها
ثم تظهر رسالة بها قيمة i تساوى 5 لأن أثناء التكرار وضعنا قيمة جديدة للمتغير i وهى قيمتة السابقة بزيادة 1 إليها
ثم تظهر رسالة بها قيمة i تساوى 6 لأن أثناء التكرار وضعنا قيمة جديدة للمتغير i وهى قيمتة السابقة بزيادة 1 إليها
ثم تظهر رسالة بها قيمة i تساوى 7 لأن أثناء التكرار وضعنا قيمة جديدة للمتغير i وهى قيمتة السابقة بزيادة 1 إليها
ثم تظهر رسالة بها قيمة i تساوى 8 لأن أثناء التكرار وضعنا قيمة جديدة للمتغير i وهى قيمتة السابقة بزيادة 1 إليها
ثم تظهر رسالة بها قيمة i تساوى 9 لأن أثناء التكرار وضعنا قيمة جديدة للمتغير i وهى قيمتة السابقة بزيادة 1 إليها
إذن يمكن أن نسمى الكلمة until بأنها نهاية التكرار repeat أو شرط نهاية التكرار repeat .

الجزء الثالث : الكلمة المحجوزة while :
هو بينما أو إذا كان الشرط قابل للتحقيق يتم تنفيذ الأكواد حتى يتم التأكد من عدم قابلية الشرط للتحقق أى يكون ناتج الشرط false فعند ذلك الحد يتوقف التكرار .
مثال على ذلك :
يتم الإعلان عن متغير مثلا إسمة i ونعطى لة القيمة مثلا 1
ثم نكتب التكرار الشرطى بواسطة while ونجعل الشرط مثلا بأن يتحقق من كون قيمة المتغير i أقل من 10 على سبيل المثال فيكون الشكل حتى الآن كالتالى :
كود:
-- i = 1; while i<10
ثم نكتب أمر التنفيذ do حتى يتم تنفيذ الأكواد التالية له تنفيذا تكراريا حيث نستخدمة مع التكرار while فيكون شكل الكود كالتالى :
كود:
-- i = 1; while i<10 do
إذن ماذا نريدة أن يتكرر ؟ هذا هو المتبقى وهو الغرض الذى من أجلة يبنى دالة التكرار while
فنأخذ على سبيل المثال نريد إظهار رسالة بقيمة المتغير i فى كل مرة تكرارية أو فى كل دورة للتكرار الذى يتم وفيكون شكل الكود كالتالى :
كود:
-- i = 1; while i<10 do Dialog.Message("Notice", i, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end
بهذا الشكل إذا تم إغلاق الكود بالكلمة المحجوزة الخاصة بالإنهاء وهى end سوف تعمل الحلقة بشكل مستمر بدون نهاية أو بلا نهاية حيث أن فى هذه الحالة لن يتغير قيمة المتغير i وسوف يستمر يساوى 1 وسوف يكون الشرط بالفعل محقق فى كل دورة تكرارية حيث فى كل دورة سوف تعمل الحلقة على التحقق من أن قيمة المتغير i أقل من 10 وبالتالى تستمر بلا نهاية
والسببب أننا لم نضع تغيير أو زيادة دورية لقيمة المتغير فى كل دورة للتكرار
وعلى ذلك إذا وضعنا تغيير بزيادة فى قيمة المتغير i بقيمة زيادة عن قيمتها الأصلية فيكون الشكل النهائى للكود كالتالى :
كود:
-- i = 1; while i<10 do Dialog.Message("Notice", i, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); i = i+1 ; end
إذن سوف تكون نتيجة معاينة الكود هو ظهور رسالة بشكل متكرر تعرض قيمة المتغير i ثم يتم زيادة قيمة 1 إلى المتغير i فى كل مرة أو فى كل دورة
وفى كل دورة يعمل على التحقق من كون المتغير i بعد الزيادة أقل من 10 فإذا كان فعلا مازال أقل من 10 يكمل العملية التكرارية حتى يصبح قيمة المتغير i
تساوى 10 عندها يتم التحقق من أن قيمة i ليست أقل من 10 إذن النتيجة الشرطية التى وضعناها " i < 10 " هى false غير محققة .
فنرى أثناء المعاينة رسالة تظهر قيمة i تساوى 1
ثم رسالة بقيمة i تساوى 2
ثم رسالة بقيمة i تساوى 3
ثم رسالة بقيمة i تساوى 4
ثم رسالة بقيمة i تساوى 5
ثم رسالة بقيمة i تساوى 6
ثم رسالة بقيمة i تساوى 7
ثم رسالة بقيمة i تساوى 8
ثم رسالة بقيمة i تساوى 9
وتتوقف الدالة التكرارية بعد ذلك حيث وصلت الحد الأقصى وهو أن يكون الناتج أقل من 10

فى النهاية يتبقى لنا أن نعلم أنه يمكن إيقاف أو كسر العملية التكرارية لأى نوع من التكرار بواسطة الكلمة المحجوزة break ويمكن أن نضع لها شرط قبلها كأن نقول إذا حدث كذا أوقف التكرار وهذة النقطة أعتقد أنها واضحة فإن لم تكن واضحة أترك لمن قرأ الموضوع أن يطرح تساؤلة عنها إذا كان يريد ذلك والأمر صعب علية أو لم يستوعب هذا الكلام ويمكن أن يكون السؤال حول موضوع التكرار هنا فى نفس الموضوع
تحياتى عبود

تعليق