الدرس السادس: الحلقات التكرارية Loops
قد تحتاج في برنامجك تنفيذ مهمة معينة لعدد ما من المرات، لا شك انه يمكنك كتابة
هذه الأوامر بشكل متسلسل ولكن هذه الطريقة غير عمليه لأنك قد تحتاج مثلا إلى إسناد
قيم لألف عنصر من مصفوفة ... وهنا يتجلى دور الحلقات التكرارية في إنجاز المهمة
بطريقة سهلة وكود مختصر.....
توفر لغة VBScript إمكانية تطبيق فكرة الحلقات التكرارية بصورتين، فيمكنك تنفيذ
مهمة ما عدد معين من المرات أو تنفيذ المهمة حتى يتحقق شرط معين... الحلقة For .... Next تمكنك الحلقة السابقة من تنفيذ أمر معين لعدد من المرات ... والصيغة العامة لهذه
الحلقة على الشكل التالي: كود--------------------------------------------------------------------------------
For (counter) = (Start) To (End) Step (Num)
‘مجموعة الأوامر
‘
Next
--------------------------------------------------------------------------------
حيث counter متغير يمثل العداد و start قيمة ابتدائية للعداد و End القيمة
النهائية، أما الكلمة المفتاحية Step فهي اختيارية ويمكن استعمالها لزيادة قيمة
العداد بقيم مختلفة ويقتضي حذفها أن تكون الزيادة بمعدل واحد ... وهذا مثال
توضيحي.. كود :--------------------------------------------------------------------------------
Dim I
For I = 1 To 10
document.write "VBScript مرحبا بكم معنا في دروس" & "< BR>"
Next
--------------------------------------------------------------------------------
في المثال السابق قمنا بكتابة عبارة الترحيب عشر مرات، لاحظ انه يمكننا التعامل مع
رموز HTML عند وضعها بين علامتي تنصيص.
ويمكن إدخال حلقة تكرارية داخل أخرى بحيث يتم تنفيذ الأمر الذي بداخل الحلقة
الداخلية بمقدار حاصل ضرب التكرارين وهذا ما يسمى بالحلقات المتداخلة Nest loop..
لاحظ المثال.. كود: --------------------------------------------------------------------------------
For I = 10 To 1 Step -1
For K = 1 To 10
'كتابة العددين المراد ضربهما
document.write I & " * " & K & " = "
'كتابة نتيجة الضرب
document.write I*K & "< BR>"
'نهاية الحلقة الداخلية
Next
'وضع خط أفقي بعد نهاية كل جدول
document.write "< HR>"
'نهاية الحلقة الخارجية
Next
--------------------------------------------------------------------------------
عند تطبيقك للمثال السابق ستلاحظ كتابة جدول الضرب
للأعداد من 10 إلى 1 تنازليا..
الآن تأمل الشيفرة السابقة، تلاحظ في السطر الأول الحلقة الأولى والتي تحوي عداد
تنازلي، وقد استعملنا القيمة –1 مع الكلمة المفتاحية Step لكي نجعل الزيادة في قيمة
التكرار تكون بمعدل تناقصي من 10 إلى 1 وهذه الحلقة تستخدم لتحديد الجدول مثلا في
المرة الأولى الجدول رقم 10 ثم 9 ثم 8 وهكذا... وفي الحلقة الداخلية نقوم بطباعة
جدول العشرة كاملا ونعود لجدول التسعة وهكذا.. الحلقة Do .... loop تستخدم هذه الحلقة لتكرار تنفيذ أوامر معينة حتى يتحقق شرط معين .. ولهذه الحلقة
أربعة أشكال متقاربة ... وهذه هي الصيغ العامة لها أولا: اختبار الشرط عند بداية الحلقة..
- الحلقة Do ... While كود: --------------------------------------------------------------------------------
Do While (Condition)
الأوامر التي تريد تكرارها طالما أن الشرط متحقق
loop
--------------------------------------------------------------------------------
- الحلقة Do ... Until كود: --------------------------------------------------------------------------------
Do Until (Condition)
الأوامر التي تريد تكرارها حتى يتحقق الشرط.
loop
--------------------------------------------------------------------------------
وهذا مثال توضيحي كود:--------------------------------------------------------------------------------
Dim Counter
Counter =0
Do While Counter <> 4
Counter = Counter + 1
document.write Counter & "< BR>"
Loop
--------------------------------------------------------------------------------
تلاحظ في المثال السابق كتابة الأرقام من 1 إلى 4، حيث في المرة الأولى تزيد
قيمة العداد لتصبح 1 ويتم كتابة العدد ثم 2 ... 3 وهكذا حتى تصبح قيمة العداد 4 فلا
يمكننا بعدها تكرار الدخول إلى الحلقة...
ثانيا: اختبار الشرط عند نهاية الحلقة... والشرط
الموجود بنهاية الحلقة هو الذي يحدد هل يتم إعادة تكرار الحلقة أم لا...
- الحلقة Loop ... While كود: --------------------------------------------------------------------------------
Do
الأوامر التي تريد تكرارها
loop While (Condition)
--------------------------------------------------------------------------------
- الحلقة Loop ... Until كود: --------------------------------------------------------------------------------
Do
الأوامر التي تريد تكرارها
loop Until (Condition)
--------------------------------------------------------------------------------
وهذا مثال توضيحي... كود: --------------------------------------------------------------------------------
Do
Counter = Counter + 1
document.write Counter & "< BR>"
Loop Until Counter = 4
--------------------------------------------------------------------------------
الحلقة While ... Wend هذه الحلقة كانت مستخدمة في لغة بيسك القديمة و فيما يبدو أن مايكروسوفت تركتها
لمسألة التوافقية بين الإصدارات فقط ويمكن تنفيذ مهمتها باستخدام الحلقة Do While
... loop وبمرونة اكثر.... كود: --------------------------------------------------------------------------------
Dim SiteName
'سيتم التكرار طالما انك لم تدخل العنوان بشكل صحيح
'Not لاحظ استعمالنا للمعامل
While Not SiteName = "www.c4arab.com"
SiteName = InputBox("ادخل عنوان موقع الموسوعة")
Wend
--------------------------------------------------------------------------------
المجموعات والحلقة For Each .... Next الحلقة For Each .... Next هي نوع خاص من التكرار ويستخدم عند التعامل مع
المجموعات... والمجموعة تتكون من عدة كتل من البيانات ويمكن التعامل مع المصفوفات
كمبدأ شبيه بالمجموعات وتستخدم المجموعات غالبا عند التعامل مع الكائنات والتي
سنتطرق إليها لاحقا...
وسنتعامل هنا مع المصفوفات لتوضيح طريقة التعامل مع الحلقة For Each .... Next ....
تستخدم العبارة السابقة لإنشاء تكرار يمر على كافة العناصر في المجموعة بغض النظر
عن عددها والصيغة العامة لها على الشكل التالي .. كود: --------------------------------------------------------------------------------
For Each (Variable) In (Collection)
‘الأوامر التي سيتم تنفيذها
Next
--------------------------------------------------------------------------------
وهذا مثال توضيحي... كود: --------------------------------------------------------------------------------
Dim MyCol,Counter,SiteName(3)
Dim Prompt,Title
'For...Next إسناد قيم إلى المصفوفة من خلال حلقة
For Counter = 1 To 3
Prompt = "ادخل موقعا من مفضلتك"
Title ="الموقع رقم " & I
SiteName(Counter) =InputBox(Prompt,Title) & "< BR>"
Next
'For Each...Next قراءة القيم من المصفوفة من خلال حلقة
For Each MyCol In SiteName
'كتابة العنصر الحالي
document.write MyCol
Next
--------------------------------------------------------------------------------
ملاحظات عامة: 1) يمكن الخروج من الحلقة التكرارية قبل إنهاءها وذلك باستخدام العبارة Exit Do
للحلقة Do ... loop و Exit For للحلقة For ... Next ... كود: --------------------------------------------------------------------------------
Dim sSiteName,iCounter
For iCounter = 1 To 10
sSiteName =InputBox("ادخل موقعا من مفضلتك")
'إذا لم تدخل أي عنوان سيتم الخروج من الحلقة
If sSiteName = "" Then Exit For
document.write sSiteName & "< BR>"
Next
--------------------------------------------------------------------------------
2) تجنب الحلقات الغير منتهية... لاحظ المثال... كود: --------------------------------------------------------------------------------
Dim iNum
Do Until A <> 0
iNum = InputBox("ادخل رقما")
iNum = iNum * 0
Loop
--------------------------------------------------------------------------------
تلاحظ في المثال أن الحلقة ستستمر إلى ما لانهاية لأن القيمة لن تتغير عن الصفر،
وهذا يعد علة bug في شيفرتك يجب عليك اجتنابها.