PDA

عرض كامل الموضوع : أمر الدوائر المغلقة Loop



البرق
22-08-2003, 03:00 PM
بسم الله الرحمن الرحيم و بعد

سنشرح اليوم أمر الدوائر المغلقة loop

فكرة الأمر
دينماكية هذه الوظيفة مثل العداد فنطلب من الاسكريبت أن يعد لنا من عدد معين الى عدد معين لكي نقوم بما نريد

أدوات الأمر
var while inc
بالاضافة الى الامرا لمراد تنفيذه



صيغة الأمر

[code:1]var %i = 1
while (%i <= 10) {
echo -a Now %i
inc %i
}[/code:1]

شرح الأمر
طلبت من الاسكريبت العد من رقم واحد ومن ثم طلبت لو كان الرقم أقل من أو يساوي عشرة فلينفذ الأمر الاتي بعده وإلا فليتوقف نهائياً عمل هذه الدالة
سيجد الاسكريبت قيمة 1 أقل من رقم 10 اذا
سيقوم بعرض الأمر المطلوبة و الأتي بعده و هي إظهار رسالة
Now 1

بعدها سيتم اضافة رقم الى قيمة i الحالية لتصبح قيمة i تساوي اثنين
سيذهب الاسكريبت مره أخرى إلى الاستفسار : هل ال 2 أقل من عشرة
الإجابة نعم
سيعطينا رسالة : Now 2
بعدها سيضاف الى 2 واحدا
لتصبح ثلاثه
و ستُختبر هل قيمة i أقل من عشرة
لتكون الرسالة : Now 3
و هكذا إلى ان تصل قيمة i إلى عشرة
وبعدها لن يتحقق الشرط

وسينتهي عمل الدالة

انتهى

السلطان
29-10-2003, 08:56 AM
البرق,

ألف شكر لك اخوي البرق على مجهودك المميز. .

تقبل تحياتي

Dns
28-09-2004, 07:42 AM
الف شكر اخي البرق على شروحك المميزة والسهله

ولكن عندي سؤالين في هذا الأمر وهو

هل يمكن استبدال while بـ if ?

واذا كان الجواب بـلا فلماذا ؟

السؤال الثاني ماهي فائدة الأمر var بالظبط ؟ وهل يمكن صياغة نفس هذا الأمر بالطريقة هذه

[code:1]:reinc
inc %i = 1
while (%i <= 10) {
echo -a Now %i
goto reinc
}[/code:1]

وشكرا لك مقدماً

البرق
28-09-2004, 04:20 PM
بسم الله الرحمن الرحيم

أخي Dns

أشكرك على حضورك و اضافتك .

وجهت إلي سؤالين ، كان السؤال الأول منهما من شقين :

هل يمكن استبدال while بـ if ?

واذا كان الجواب بـلا فلماذا

حقيقة لست اعرف سبب طلبك باستبدال while ب if

قد اطلب منك التوضيح لماذا طلب الاستبدال ..

ف while تختلف في بناءها و نهجها عن if

و ربما يكون استفسارك ... هل بامكاننا الاستغناء عن while للدوران .. ان استخدمنا اداة goto ؟!! كما سيأتي لاحقاً .


انتظر منك توضيحاً ..



اما السؤال الثاني فكان من شقين ايضا .

السؤال الثاني ماهي فائدة الأمر var بالظبط ؟ وهل يمكن صياغة نفس هذا الأمر بالطريقة هذه

جـ - 1- أداة var تستخدم في الميرك ، لاضافة قيمة ما إلى متغير، و من ثم استخدام هذا المتغير أثناء كتابة اسكريبتك .

اذا ما هو الفرق بين var و أمر set ؟
الفرق بينهما أن أمر set أكثر عمومية ، حيث ستسجل قيمته في خانة Variables ، و عند استدعاءه باي مكان في الاسكريبت سيتم التعرف على قيمته .

بينما var فانه سيتم التعرف عليه فقط بين نطاق أقواس الامرالذي تقوم بتصنيعه ، او الحدث الذي تقوم بمعالجته .


اذا قد يتكرر السؤال ، ما الفائدة من استخدام هذه المتغيرات ، و لماذا لا نستغني عنها مطلقا؟ ..
هناك حالات ما ، نحتاج الى اسناد قيمتها الى متغير ثم التعامل مع هذه المتغيرات ، و حالات اخرى لا نحتاج ذلك

ساذكر حالتين تحضرني و هي :
1- للتقليل من جهد الاسكريبت اثناء معالجة الاحداث .
مثلا

إن قيمة متغير ما تساوي حاصل جمع (3،4) .

فعند استخدام المتغيرات سيقوم الاسكريبت بحساب الجمع مرة واحدة فقط، ومن ثم سيحصل على الناتج 7 و سيسندها الى قيمة المتغير المحدد، و بالتالي
سيستخدم هذا المتغير طوال الوقت .

لكن ان اردنا الاستغناء عن هذه المتغيرات ، فان العمل سيتم بنجاح بلا شك، لكن سيكون على حساب سرعة الاداء و العمل، فكل مرة سيحتاج الاسكريبت
الى حساب نفس المعادلة (3 + 4) و استخراج قيمة 7 و هكذا .

و حتى أقرب لك الصورة في الشرح ، سأذكر مثالا أخر :

قلنا أن أمر AlbarqXNu

سيقوم باختبار الاسماء أولاً ثم تحويلها و اخراج قيمة اخرى للاسكريبت ليتعامل معاها .

فعندما أريد ان اكتب مجموعة أسطر تتعلق باسم ما فأني سأكون بين خيارين .
الخيار الأول :

[code:1]/mode # +q $albarqXNu($nick)
/msg $albarqXNu($nick) hellow
/msg # welcome to $albarqXNu($nick)[/code:1]

وهو حساب نفس القيمة التي اريدها ثلاث مرات لتعطيني نفس النتيجة في كل مرة .
(حيث في كل مرة سنقوم باستدعاء تعريب الاسم من دالة albarqxNu و من ثم التعامل معها)

الخيار الثاني /

[code:1]var %nickname = $albarqXNu($nick)
/mode # +q %nickname
/msg %nickname hellow
/msg # welcome to %nickname
[/code:1]

سنقوم باستدعاء تعريب الاسم من دالة albarqxNu مره واحدة فقط و اسناد قيمتها الى متغير و من ثم استخدام هذا المتغير .

* ستلاحظ هذا الفرق في السرعة ، عند الاكثار من عمليات الاستدعاء ، و ستتلمس فرقا واضحا لذلك .



2- لاضافة قيمة جديدة الى قيم سابقة .
فمثلا عند صنع أمر احتلال غرفة ما ، فهذا الرابط
http://www.yabdoo.com/board/showthread.php?t=866
احتوى على مثالا لجمع مجموعة من الاسماء واضافتها الى قيمة واحدة ،
[code:1]set %massnick %massnick $nick($1,%i,q)[/code:1]

و اعتقد انه سيتعقد علينا القيام بنفس العمل ان لم تتوفر لنا اسلوب اسناد القيم الى متغيرات .




2- الحالة التي قمت بذكرها صحيحة وهي تعمل بشكل صحيح ، اشكرك على اضافتك الجميلة و تقديم ما هو نافع .


و اود الاضافة أنه عند القيام بمراجعة أعمال المبرمجين ، بين فترة واخرى ، ستجد انها تتراوح بين اساليب و انماط عدة، و ذلك لعدد من الاعتبارات :
1- الخلفية البرمجية لهذا المبرمج حيث قد يكون أتى من بيئة برمجية اكاديمية مثلا، او انه يتقن لغة برمجية أخرى أو اكثر، و بالتالي سيتبع نهجا تقليديا
في برمجته، قد تكون باستخدام أدوات و أمور لا حاجة اليها في اللغة التي يبرمج فيها .

2- تطور اللغة البرمجية ، و بالتالي ستجد أن كثيراَ من الاسكريبتات والبرمجيات القديمة ، قد كتبت بصورة بدائية أو تقليدية الى حد بعيد، و ذلك تبعا لامكانيات هذه اللغة في تلك الفترة .

3- تعود المبرمج نفسه اثناء برمجته على نمط معين عند كتابته الأوامر ، حيث يسعى ان يكتب بالصورة التي تسهل له المراجعة و التدقيق (أيا كانت) .


نأتي لمشاهدة الكود الذي قمت بوضعه :

[code:1]:reinc
inc %i = 1
while (%i <= 10) {
echo -a Now %i
goto reinc
}[/code:1]


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

و بالتالي بحاجة الى وضع الأمر : unset %i

ليصبح كالتالي (مثال للتصفير في اخر الأمر) :

[code:1] :reinc
inc %i = 1
while (%i <= 10) {
echo -a Now %i
goto reinc
}
unset %i[/code:1]



و عليه سأتفهم من سؤالك الاول بالاستغناء عن while و وضع أمر if ان قمت باستخدام نهج goto و استخدامها للدوران ..

و بالتالي سيصبح بهذا الشكل .

[code:1] :reinc
inc %i = 1
if (%i <= 10) {
echo -a Now %i
goto reinc
}
unset %i[/code:1]


و لا أخفيك أني افضل الطريقة الأولى التي قمت بوضعها، فاجدها اكثر بساطة و اقرب الى التطبيق . و طريقتك صحيحة و تؤدي نفس النتيجة أيضاً ، علما ان استخدام شرط if في حالتك اولى من استخدام while (لأن while شرطية دورانية، و عليه تكون أنت فضلت استخدام أداة منفصلة للدوران و هي goto، و أداة أخرى للشرط و هي if) .



أشكرك Dns على حضورك و اضافتك


انتهى

Dns
29-09-2004, 12:05 PM
السلام عليكم




هل يمكن استبدال while بـ if ?

واذا كان الجواب بـلا فلماذا

حقيقة لست اعرف سبب طلبك باستبدال while ب if

قد اطلب منك التوضيح لماذا طلب الاستبدال ..

ف while تختلف في بناءها و نهجها عن if

و ربما يكون استفسارك ... هل بامكاننا الاستغناء عن while للدوران .. ان استخدمنا اداة goto ؟!! كما سيأتي لاحقاً .


انتظر منك توضيحاً ..



في البداية أشكرك بشدة على توضيحك الكافي و الأكثر من رائع

اما بالنسبة لسؤالي هذا فقط أردت ماهو الفرق بين while و if ووجدت ضالتي في اجابتك اللاحقه فشكرا لك

وقد اجبت في ردك ايضا على سؤال كنت ناوي اسألك وهو عن ( ألا يوجد تصفير لما بعد var )

وقد اوضحت هذا في ردك

وأشكر لك أيضا معلوماتك القيمة التي ذكرتها جميعها عن البرمجة والمبرمجين واسناد القيمة الى متغير والتي كانت تخفى عني

أشكرك مرة اخرى