JavaRush /مدونة جافا /Random-AR /أثناء الحلقة في Java

أثناء الحلقة في Java

نشرت في المجموعة

مقدمة

كانت برامجنا الأولى عبارة عن سلسلة من التعليمات التي تم تنفيذها واحدة تلو الأخرى. لا الشوك. هذا هو HelloWorld، الذي يقوم بإخراج عبارة ترحيب وحسابات حسابية إلى وحدة التحكم. بعد البرامج الأولى، تعلمنا التفرع، أي أن البرنامج يقوم بإجراءات معينة حسب الظروف. إليك كيفية ترميز مكيف الهواء لتشغيله للتدفئة والتبريد:
if (tempRoom>tempComfort)
    airConditionerOn();
if (tempRoom<tempComfort
    heaterOn();
لنأخذ الخطوة التالية. في الحياة اليومية، غالبًا ما نقوم بإجراءات رتيبة ومتكررة، على سبيل المثال، تقشير التفاح للحصول على فطيرة. ويمكن وصف هذه العملية الرائعة على النحو التالي:
  1. إذا كان هناك تفاح في الحوض، فاتبع الخطوات من 1.1 إلى 1.4:

    1. 1.1. خذ تفاحة
    2. 1.2. تنظيفها وقطعها إلى شرائح
    3. 1.3. ضعيها على قاعدة فطيرة المعجنات في مقلاة
    4. 1.4. دعنا نعود إلى الخطوة 1.
المشغل بينما - 2
لنفترض أن لديك 10 تفاحات ويدين وسكينًا واحدًا. في الحياة، تقوم دائمًا بتنظيف العشرة بأكملها، مسترشدًا بنفس الخوارزمية. كيف يمكنك جعل البرنامج يقوم بإجراء متكرر مع كل تفاحة؟
  • دعونا نلزم أنفسنا بعدد التفاح، ولكن إذا كان لدينا عدد قليل منها، فسيتم تنفيذ بعض الأوامر عبثًا دون "حمولة" (وربما نجرح أنفسنا أثناء تقشير تفاحة غير موجودة).
  • إذا كان عدد التفاح أكبر من عدد فرق المعالجة لدينا، فلن تتم معالجة بعض المنتجات.
  • يصعب قراءة مثل هذا "الكود" ويحتوي على الكثير من التكرار ويصعب تعديله.

الحلقات هي عوامل تنفيذ الإجراءات عدة مرات.

تعمل حلقة Java while (الحلقة الدنيئة) بشكل جيد في حالتنا. ينظم هذا التصميم إجراءات متعددة في بنية موجزة ومفهومة. قد تبدو خوارزمية تقطيع التفاح لعمل فطيرة في Java كما يلي:
while(числоЯблокВТазике>0) {
    яблоко = тазик.взятьОчередноеЯблоко();
    положитьВПирог(яблоко.чистить().нарезать());
    числоЯблокВТазике--;//-- this is a decrement, reduces the number of apples by one
}
System.out.println('Apples for the pie are processed.');

بناء جملة الأمر

الطريقة الأولى لوصف بيان while هي كما يلي:
while(Логическое выражение) {
	// Loop body - periodically executed statement(s)
}
ويتم ذلك على النحو التالي (خطوة بخطوة):
  1. نقوم بتقييم الشرط المنطقي الذي يتبع الوقت بين قوسين.
  2. إذا كان الشرط المنطقي صحيحًا، فسيتم تنفيذ العوامل في نص الحلقة، بعد تنفيذ العامل الأخير في نص الحلقة، انتقل إلى الخطوة 1
  3. إذا كان الشرط المنطقي خاطئًا، فانتقل إلى العبارة الأولى خارج الحلقة while.

حلقة مع شرط مسبق

نظرًا لأنه قبل تنفيذ جسم الحلقة، فإننا دائمًا نحسب مسبقًا تعبيرًا منطقيًا (شرط الدخول إلى الحلقة)، وغالبًا ما يُطلق على هذا النوع من الوقت حلقة ذات شرط مسبق. دعونا نبني جدولًا للأعداد الصحيحة العشرة الأولى، والقوى الإيجابية لعدد ما:
public static void main(String[] args) {
    int number = 3; // Number to be raised to a power
    int result = 1; // Result of exponentiation
    int power = 1; // Initial exponent
    while(power <= 10) { // loop entry condition
        result = result * number;
        System.out.println(number + "to the extent" + power + " = " + result);
        power++;
    }
}
نتيجة إخراج وحدة التحكم:
3 в степени 1 = 3
3 в степени 2 = 9
3 в степени 3 = 27
3 в степени 4 = 81
3 в степени 5 = 243
3 в степени 6 = 729
3 в степени 7 = 2187
3 в степени 8 = 6561
3 в степени 9 = 19683
3 в степени 10 = 59049
Process finished with exit code 0

حلقة مع الشرط اللاحق

النوع الثاني من الدورة:
do {
    // Loop body - periodically executed statement(s)
}while (Логическое выражение);
يتم تنفيذه على النحو التالي (الخطوات):
  1. يتم تنفيذ نص الحلقة (مباشرة بعد الكلمة الأساسية do).
  2. نقوم بتقييم الشرط المنطقي الذي يتبع الوقت بين قوسين.
  3. إذا كان الشرط المنطقي صحيحا، فانتقل إلى الخطوة 1
  4. إذا كان الشرط المنطقي خاطئًا، فانتقل إلى العبارة الأولى خارج الحلقة while.
هناك اختلافان رئيسيان عن النوع السابق من الحلقة: يتم تنفيذ نص الحلقة مرة واحدة على الأقل ويتم التحقق من الحالة المنطقية بعد تنفيذ نص الحلقة. ولذلك، يسمى هذا النوع من حلقة while حلقة الشرط اللاحق. سنعرض هذه المرة جدول صلاحيات لعدد لا يتجاوز 10000:
public static void main(String[] args) {
    int number = 3;// Number to be raised to a power
    int result = number;// Result of exponentiation
    int power = 1;// Initial exponent
    do {
        System.out.println(number + "to the extent" + power + " = " + result);
        power++;
        result = result * number;
    }while (result < 10000); // loop exit condition
نتيجة إخراج وحدة التحكم:
3 в степени 1 = 3
3 в степени 2 = 9
3 в степени 3 = 27
3 в степени 4 = 81
3 в степени 5 = 243
3 в степени 6 = 729
3 в степени 7 = 2187
3 в степени 8 = 6561
Process finished with exit code 0
انتبه إلى التغييرات في الكود، ومقارنتها بإصدار الحلقة بشرط مسبق.

حقائق مثيرة للاهتمام حول العمل مع الحلقات

أوامر التحكم في نص الحلقة

هناك أمران يؤثران على تقدم الحلقة: Break، والذي سنعرض ميزاته في الفصل التالي، و يكمل.
  • متابعة - يوقف تنفيذ نص الحلقة الحالية وينتقل إلى التعبير المنطقي لعامل التشغيل while. إذا كان التعبير المحسوب صحيحًا، فسيستمر تنفيذ الحلقة.
  • فاصل - يوقف تنفيذ الحلقة الحالية فورًا وينتقل إلى الأمر الأول خارجها. وبالتالي، يتم مقاطعة تنفيذ الحلقة الحالية. وسوف ننظر في ذلك بمزيد من التفصيل في الموضوع التالي.
دعونا نتذكر مثال الفاكهة لدينا. إذا لم نكن متأكدين من جودة التفاح المعروض، فيمكننا تغيير الكود باستخدام الأمر continue:
while(числоЯблокВТазике>0) {
    яблоко = тазик.взятьОчередноеЯблоко();
    числоЯблокВТазике--;//-- this is a decrement, reduces the number of apples by one
    if (яблоко.плохое()) {  // method will return true for rotten, etc. apples
        яблоко.выкинутьВМусор();
        continue; // continue the loop, go to the condition number ofApplesIn the Basin>0
    }
    положитьВПирог(яблоко.чистить().нарезать());
}
غالبًا ما يتم استخدام البناء continueعندما يكون من الضروري في جسم الحلقة تنفيذ الأوامر عند حدوث حالة معينة، على سبيل المثال، لتنفيذ إجراءات عند تشغيل جهاز استشعار في الجهاز (وإلا فما عليك سوى مواصلة دورة قراءة مؤشراته) أو لحساب تعبير فقط في خطوات معينة من الدورة. مثال على الحالة الأخيرة هو الحساب في حلقة زمنية لمجموع مكعبات الأعداد الطبيعية التي يكون مربعها أقل من عددها:
public static void main(String[] args) {
    int sum = 0;    // total amount
    int i = 0;      // starting number of the row
    int count = 20; // amount of numbers
    while(i<=count) {
        i++;        // take the next number, i++ is equivalent to i=i+1
        if (i*i<=count)  // if the square of the number is less
            continue;   // number of numbers - do not count the sum
                        // move on to the next number in the loop
        sum += i*i*i; // otherwise, we calculate the sum of cubes of numbers
    } // sum += i*i*i - notation similar to sum = sum + i*i*i
    System.out.println(sum);// print result
}

دورة لا نهاية لها

غالبًا ما يتم استخدام أوامر التحكم هذه في حلقة لا نهائية. ويسمى هذا لأن شرط الخروج المنطقي لم يتم استيفاءه أبدًا. في الكود يبدو شيء مثل:
while(true) {
    // Loop body
}
في هذه الحالة، سيكون من المفيد استخدام أمر breakلتنظيم الخروج منه . يحدث هذا النوع من الحلقات عند انتظار الظروف الخارجية التي تتشكل خارج منطق جسم الحلقة. على سبيل المثال، في الألعاب التي تحاكي العالم الافتراضي حول البطل (الخروج من الحلقة = الخروج من اللعبة)، أنظمة التشغيل. أو عند استخدام الخوارزميات، ربما تحسين النتيجة مع كل استدعاء لاحق في الحلقة، ولكن مع تقييدها بالوقت أو حدوث حدث خارجي (لعبة الداما أو الشطرنج أو التنبؤ بالطقس). يجب أن نتذكر أنه في ظل الظروف العادية، تعد الحلقات التي لا نهاية لها إحدى مشاكل عدم استقرار البرنامج. للتوضيح، دعونا نعود إلى قوى الأعداد:
public static void main(String[] args) {
    int number = 3; // Number to be raised to a power
    int result = 1; // Result of exponentiation
    int power = 1; // Initial exponent
    while(true) {
        result = result * number;
        System.out.println(number + "to the extent" + power + " = " + result);
        power++;
        if (power>10)
            break; // exit from the loop
    }
}
نتيجة إخراج وحدة التحكم:
3 в степени 1 = 3
3 в степени 2 = 9
3 в степени 3 = 27
3 в степени 4 = 81
3 в степени 5 = 243
3 в степени 6 = 729
3 в степени 7 = 2187
3 в степени 8 = 6561
3 в степени 9 = 19683
3 в степени 10 = 59049
Process finished with exit code 0

حلقات متداخلة

هنا نأتي إلى الموضوع الأخير حول دوراتنا. دعونا نفكر في فطيرة التفاح (نأمل ألا تكون جائعًا في الوقت الحالي) و"الحلقة" الخاصة بنا:
  1. إذا كان هناك تفاح في الحوض، اتبع الخطوات من 1.1 إلى 1.4:

    1. 1.1. خذ تفاحة
    2. 1.2. تنظيفها وقطعها إلى شرائح
    3. 1.3. ضعيها على قاعدة فطيرة المعجنات في مقلاة
    4. 1.4. دعنا نعود إلى الخطوة 1.
دعونا نصف بمزيد من التفصيل عملية التقطيع إلى شرائح:
  1. عدد الشرائح = 0
  2. بينما يكون عدد الشرائح < 12، اتبع الخطوات من 2.1 إلى 2.3

    1. 2.1. قطع شريحة أخرى من التفاح
    2. 2.2. عدد الشرائح ++
    3. 2.3. العودة إلى الخطوة 2
وأدخله في خوارزمية الحلويات لدينا:
  1. إذا كان هناك تفاح في الحوض، فاتبع الخطوات من 1.1 إلى 1.6:

    1. 1.1. خذ تفاحة
    2. 1.2. قشر تشغيله
    3. 1.3. عدد الشرائح = 0
    4. 1.4. Пока число долек < 12, выполнить шаги с 1.4.1 по 1.4.3
      1. 1.4.1. Отрезать очередную дольку от яблока
      2. 1.4.2. Кол-во долек ++
      3. 1.4.3. Возвращаемся на шаг 1.4
    5. 1.5. Помещаем дольки на тестовое основание пирога из теста на сковороде
    6. 1.6. Возвращаемся на шаг 1.
Получor цикл в цикле. Подобные конструкции весьма частые. Для завершающего примера построим таблицу умножения, которые школьники 90-х видели на обложках тетрадей в младших классах.
المشغل بينما - 3
public static void main(String[] args) {
    // Display the values ​​of the second multiplier in the line
    System.out.println("    2  3  4  5  6  7  8  9");
    int i = 2;      // first multiplier, assign starting value
    while(i<10) {   // First loop, execute while the first multiplier is less than 10
        System.out.print(i + " | ");// Display the first multiplier at the beginning of the string
        int j = 2;                  // second multiplier, starting value
        while (j<10) { // Second loop, execute while the second multiplier is less than 10
            int mul=i*j; // Calculate the product of factors
            if (mul<10)  // If it contains one digit, print two spaces after it
                System.out.print(mul + "  ");
            else   // otherwise output the product and after it - one space
                System.out.print(mul + " ");
            j++;     // Increase the second multiplier by one,
        }            // Go to the beginning of the second loop (while (j<10 ).... )
        System.out.println(); // Move to the next line of output
        i++;                  // Increase the first multiplier by one,
    }                         // Go to the beginning of the first loop (while ( i<10 ) ....
}
Результат вывода на консоль:
2  3  4  5  6  7  8  9
2 | 4 6 8 10 12 14 16 18
3 | 6 9 12 15 18 21 24 27
4 | 8 12 16 20 24 28 32 36
5 | 10 15 20 25 30 35 40 45
6 | 12 18 24 30 36 42 48 54
7 | 14 21 28 35 42 49 56 63
8 | 16 24 32 40 48 56 64 72
9 | 18 27 36 45 54 63 72 81
Process finished with exit code 0
Циклы (в частности, оператор while) – один из фундаментальных кирпичиков построения программ. Решая задачи на JavaRush, вы изучите все их разнообразие, разберёте тонкости функционирования и получите практические навыки их применения.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION