Chapter (4) : Loops
في شابتر 4 هنتكلم عن ال Loops و هي مجموعة جمل بتمكنا من اننا نتحكم فى عملية التكرار بالعدد اللى احنا عاوزينة.
و فى لغة الجافا هندرس 3 طرق لل Loops وهم (While, do–while, for)
4.1 The while Loop:
طريقة كتابة جملة while فى لغة الجافا
While نقدر بيها نكرر الكود اللى احنا عاوزينة اي عدد
و هنلاحظ ان while (نكتب بعدها بين الاقواس شرط الااستمرار لو كان true يبقى عملية التكرار هتتكمل لو false يبقى هنخرج برا ال loop) انما الاقواس التانية اللى بالشكل دة {} بنكتب الاوامر اللى عايزين نكررها فيها و المفروض نحط فيها حاجة تغير شرط الاستمرار بعد فترة ل false علشان يخرج من ال loop.
و هنقول مثال نوضح بنستخدم while ازاي بفرض اننا عايزين نطبع 100 مرة جملة !Welcome to Java على الشاشة قبل كدة كنا هنكتب الامر بتاع الطباعة على الشاشة 100 مرة دلوقتى ممكن نكتبة مرة واحدة و while هتنفذة 100 مرة بالطريقة دى
فى الكود المكتوب عرفنا متغير اسمة count من النوع integer و حطينا لة قيمة ابتدائية صفر و شرط الاستمرار انة اصغر من 100 و الكود اللى المفروض يتكرر هو امر الطباعة على الشاشة ومننساش اننا زودنا امر count++; و هو دة المسؤل عن زيادة المتغير كل مرة بواحد.
ملحوظة: الكود المكتوب مش كامل يعنى مينفعش يشتغل لوحدة كدة لازم الاول نحطة فى ال main method و نحطها فى Class و كل دة فى file نسمية باسم الكلاس ClassName.java علشان نتمكن من اننا نعملة compile.و دة شكل الFlow Chart لطريقة عمل ال Loops:
نفهم من الرسم ان لو شرط الاستمرار كان True هيتنفذ جسم ال loop لحد نهايتة بعد كدة يتحقق من شرط الاستمرار مرة تانية و هكذا لحد ما يتغير شرط الاستمرار الى False فهيخرج من الloop و هنكمل بقية الكود.
المفروض نحط شرط الاستمرار بين قوسين بعد كلمة while انما ممكن نهمل الاقواس فى باقى ال loop فى حالة ان جسم ال loop مكون من جملة واحدة او مفيهوش جمل خالص و الكود دة يوضح مثال ل loop مفيهاش الا جملة واحدة بس.
• يجب نتأكد من ان شرط الاستمرار هيتحول لـ false بعد عدد معين من التكرار و الا هتتنفذ ال loop الى ما لا نهاية و لو دة حصل ممكن تضغط CTRL+C لتوقف التشغيل و تعالج الخطأ.
• فى خطأ بيتكرر هو وضع علامة ; بعد جملة while و دة معناه اننا اهملنا جسم ال loop و فى الحالة دى هيعتبر ان جسم ال loop فارغ و هيتكرر التحقق من شرط الاستمرار لحد ما يتحول لـ false و بما اننا فى معظم الاحيان بنحط الجملة اللى بتغير الشرط فى جسم ال loop فهيتحقق من شرط الاستمرار اللى مش هيتحول لـ false الى ما لا نهاية ,انما لو كان شرط الاستمرار مش معتمد على جسم ال loop فهيتحقق من الشرط لحد ما يتحول لـ false و بعد كدة هينزل ينفذ جسم ال loop مرة واحدة بس و كأنة كود خارج ال loop.
وده مثال هيوضحلنا ازاي نستفيد من while البرنامج ده عبارة عن 10 اسئلة طرح المستخدم هيجاوب عليهم وفي الاخر نعرفه الوقت اللي قدر يحل فيه الاسئلة ونتيجة كل سؤال ..
و دة شكل عرض البيانات على الشاشة
System.currentTimeMillis()
ال method دى بترجع قيمة الوقت الحالى بالملى ثانية و هنشرح ال method فى شابتر 5 ان شاء الله.
Math.random()
ال method دى بترجع رقم قيمتة عشوائية (غير محددة) اصغر من الواحد و اكبر من الصفر.
4.3. The do-while Loop
do-while هي شبة while بالظبط مع اختلاف بسيط ان جسم ال loop بيتنفذ على الاقل مرة واحدة بس و ان التحقق من شرط الاستمرار بيكون فى الاخر مش فى الاول.
طريقة كتابة do-while
و دة شكل ال Flow Chart
و نفهم من الرسم دة ان الاول بينفذ الكود اللى جوه ال Loop بعد كدة بيشوف شرط التحقق true ولا false لو true بيرجع ينفذ الكود اللى جوه اللوب تانى لو false بينزل تحت ال loop ينفذ الاوامر التانية, و علشان كدة احنا بنستخدم do-while لو الكود اللى عاوزينة يتكرر فية جملة لازم تتنفذ على الاقل مرة واحدة.
احنا ممكن نستخدم while زي do-while بالظبط بس احنا بنختار الطريقة الانسب للكود بتاعنا و نستخدمها.
و دة مثال على طريقة استخدام do-while
4.4. The for Loop
طريقة كتابة ال for
بعد كلمة for جوه الاقواس فى 3 اجزاء بنفصل بينهم بعلامة ; و هنشرح كل جزء لوحدة
الجزء الاول دة بيتنفذ مرة واحدة بس فى بداية الloop و المبرمجين متعودين ان يتحط فية القيمة الابتدائية بتاعة المتغير مع العلم اننا ممكن نزود حاجات تانية فية
الجزء التانى دة شرط التحقق بيتحقق منة فى بداية كل دورة
الجزء الثالث دة بيتنفذ فى نهاية كل دورة و المبرمجين اتعودوا ان بيتحط فية الجملة اللى بتغير شرط الاستمرار بعد فترة و ممكن نزود بردو حاجات تانية
بعد كدة بنلاقى جسم ال loop
هنشوف دلوقتى مثلا يفهمنا اكتر استخدام ال for
فى المثال دة فى الاول حط قيمة ابتدائية للمتغير i بصفر و قال ان شرط التحقق ان i اصغر من 100 فهيبدأ يتحقق من الشرط هيلاقى ان i فعلا اصغر من 100 فهيبدأ ينفذ امر الطباعةو بعد كدة هيزود i بواحد و يقارنة بـ 100 تانى و هكذا.
و دة شرح ال for و المثال باستخدام ال Flow Chart
فى خطأ بيتكرر هو وضع علامة ; بعد جملة for و دة معناه اننا اهملنا جسم ال loop و فى الحالة دى هيعتبر ان جسم ال loop فارغ و هيتكرار التحقق من شرط الاستمرار لحد ما يتحول لـ false و بعد كدة هينزل ينفذ جسم ال loop مرة واحدة بس و كأنة كود خارج ال loop.
زي ما قولنا ان الجزء الاول و الثالث بين الاقواس بعد for ممكن نحط فية اكتر من جملة و هتكون فى الاخر بالشكل دة
علشان يبقى شكل البرنامج منظم ممكن لو الكود اللى هنكررة مكون من امر واحد بس ممكن ندمجة مع for فى نفس الجملة بالشكل دة.
جملة for ممكن نشوفها باكتر من شكل يعنى ممكن نستغنى عن جزء من اجزائها التلاتة و نحطة فى جسم الloop نفسة بس دة بيبقى لحالات خاصة الكود اللى بنكتبة فرضها علينا.
ممكن نسيب التلت اجزاء فاضيين و بكدة يبقى عملنا loop هتكرر الى ما لا نهاية
(infinite loop)
و هتكون بالشكل دة.
4.5. Which Loop to Use?
لازم نعرف ان for و while بيتقال عليهم اسم pre-test و دة علشان هما بيتأكدوا من شرط الاستمرار قبل ما ينفذ جسم ال loop انما do-while بيتقال عليها اسم post-test و دة علشان بتتحقق من الشرط بعد ما ينفذ جسم ال loop. ولاكن الثلاث انواع متكافئين و ممكن نستخدم كل واحدة منهم بدل التانية بس احنا بنحاول نستخدم اكتر واحدة تفيد الكود اللى بنعملة.
4.6. Nested Loops
ال nested loops هي ان فى loop خارجية (outer loop) و جواها loop تانية او اكتر من(loop (inner loop, فى كل مرة الloop الخارجية بتتكرر ال loops اللى جوة بيبدأوا من الاول و يتكرروا لحد ما ينتهوا.
و المثال دة هيوضح معنى ال nested loops اكتر لانشاء جدول الضرب زي الشكل دة.
و هيكون دة شكل الناتج
الجزء اللى فى الكود من السطر رقم 22 لـلسطر رقم 25 دة اللى بنظبط بية شكل الجدول علشان حاصل ضرب الرقمين فى بعض لحد الرقم 9*9 مكونين من رقم واحد او رقمين فاحنا هنا قلنا ان لو حاصل الضرب مكون من رقم واحد هنسيب قبلة مكانين فاضيين لو مكون من رقمين هنسيب قبلة مكان واحد.
4.7. Minimizing Numerical Errors
فى الجزء دة هنتكلم عن الاخطاء فى الاعداد بسبب العلامة العشرية و ازاي نقلل الاخطاء.
دة مثال بيبين الاخطاء بسبب العلامة العشرية بفرض اننا عاوزين نجمع مجموعة ارقام تبدأ من 0.01 و الارقام بتزيد بـ 0.01 فى سلسلة الارقام و تنتهى ب 1.0
و هيكون الناتج بالشكل دة
الناتج كان المفروض يكون 50.5 و لاكن بعد ما عملنا run للكود لقينا ان الناتج اللى طلعلنا كان 50.499985 فكدة الاجابة مش دقيقة اوى و دة علشان ان الكمبيوتر بيستخدم عدد ثابت من ال bits لتمثيل العلامة العشرية فطبعاً كلنا هنا هنقول اننا لو استخدما double بدل float الاجابة هتتحسن لان ال double بيتمثل فى 64-bits و ال float بيتمثل فى 32-bits.
بس لو استخدمنا double فى المثال دة هنلاقى ان الناتج بقى 49.50000000000003 فطبعاً هنستغرب لان بكدة الخطأ زاد مش قل و لو حاولنا نشوف السبب فى كدة هنلاقى ان ال i فى اخر مرة المفروض تتجمع فيها هتكون اكبر من 1 بحاجة بسيطة اوى و علشان كدة هيخرج من ال loop و مش هيجمعها.
علشان نتغلب على الخطأ دة فى طريقتين :
1.ممكن نعكس ال loop يعنى هنبدأ نجمع ال 1 الاول و نجمع بعدها رقم 0.99 و بعدها 0.98 و هكذا لحد ما نوصل لـ 0.01. و هتكون ال loop بالشكل دة
2. ممكن نستخدم ال count فى ال loop على انها integer و نغير طريقة الجمع نفسها
4.9. Keywords break and continue
Break و continue ممكن نستخدمهم فى ال loops كادوات تحكم
break بتنهى عمل اقرب loop هي جواها يعنى لو فى nested loop و كتبنا break فى ال inner loop ال inner loop هي اللى هتنتهى من غير ما تأثر على ال outer loop .
continue بتنهى الدورة اللى احنا فيها او بمعنى تانى انها بتنقلنا لنهاية جسم ال loop و تكمل ال loop من الدورة اللى بعدها عادى.
هنقول مثال يوضحلنا ازاي نستخدم break فى المثال دة هنجمع الارقم من 1 الى 20 و نتوقف فى حالة ان ناتج الجمع كان اكبر من 100 و فى الشكل فى الصورة b هو ناتج جمع الارقام من 1 الى 20 انما فى الصورة a ناتج الجمع باستخدام break
و هنقول مثال كمان علشان نوضح عمل continue فى المثال دة هنجمع الارقام من 1 الى 20 بس مش هنجمع الارقام 10 و 11 و فى الشكل فى الصورة b هنشوف الناتج الطبيعى لجمع كل الارقام انما فى الصورة a هنشوف جمع كل الارقام ماعدا 10 و 11
4.9.1. Statement Labels and Breaking with Labels
كل جملة فى الجافا ممكن نعملها عنوان و عموما العناوين بنستخدمها اكتر مع ال loops و بكدة ممكن لو عندنا nested loop ممكن نتحكم فى ال outer loop باننا نعملها label و نستخدم break و continue .
و دة مثال لاستخدام break للخروج من ال labeled loop
و دة مثال تانى لاستخدام continue لانهاء دورة من ال outer loop
ملحوظة: استخدام break و continue مع ال labeled loops مختلف عن استخدام الامر goto.
وبكده نكون خلصنا شابتر 4 واتكلمنا عن الجمل التكرارية loops في الجافا.
معادنا في شابتر 5 ان شاء الله عشان نتكلم عن الmethods بالتفصيل..
أي استفسارات انا موجود
Thanks a lot, CATazine.
Thanks a lot, CATReloaded.
om4rezzs