CodeGym /مدونة جافا /Random-AR /بيان بينما
John Squirrels
مستوى
San Francisco

بيان بينما

نشرت في المجموعة
كانت برامجنا الأولى عبارة عن سلسلة من التعليمات التي يتم تنفيذها واحدة تلو الأخرى. لا الشوك. يتضمن ذلك 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لنفترض أن لديك عشر تفاحات، ويدان، وسكينًا واحدًا. في الحياة الواقعية، تقوم بتقشير العشرات بأكملها بالتسلسل، باتباع نفس الخوارزمية لكل تفاحة. ولكن كيف نجعل البرنامج يقوم بإجراء متكرر لكل تفاحة؟
  • نحن نربط أنفسنا بعدد التفاحات، ولكن إذا لم يكن لدينا ما يكفي منها، فسيتم تنفيذ بعض الأوامر دون "حمولة" (وقد نجرح أنفسنا أثناء محاولتنا تقشير تفاحة غير موجودة).
  • إذا كان عدد التفاحات أكبر من عدد الأوامر التي يجب تقشيرها، فسيتم ترك بعض التفاحات دون تقشيرها.
  • من الصعب قراءة مثل هذا الرمز. يحتوي على الكثير من التكرارات ويصعب تعديله.

الحلقات هي عبارات تسمح بتنفيذ الإجراءات بشكل متكرر

ستعمل حلقة Java بشكل جيد في حالتنا. يضع هذا البناء إجراءات متعددة في بنية موجزة ومفهومة. باستخدام حلقة while ، قد تبدو خوارزمية تقطيع التفاح للفطيرة كما يلي في Java:
while (numberOfApplesInBowl > 0) {
    apple = bowl.grabNextApple();
    arrangeInPie(apple.peel().slice());
    numberOfApplesInBow--; // "--" is the decrement operator, which reduces the number of apples by one
}
System.out.println("The apples for the pie have been processed.");

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

البديل الأول من عبارة while هو كما يلي:
while (Boolean expression) {
	// Loop body — the statement(s) that are repeatedly executed
}
فيما يلي شرح خطوة بخطوة لما يحدث عند تنفيذ هذا الرمز:
  1. نقوم بتقييم التعبير المنطقي الموجود بين قوسين بعد الكلمة الأساسية while .
  2. إذا تم تقييم التعبير المنطقي إلى صواب، فسيتم تنفيذ العبارات الموجودة في نص الحلقة . بعد تنفيذ العبارة الأخيرة في نص الحلقة، ننتقل إلى الخطوة 1
  3. إذا تم تقييم التعبير المنطقي إلى خطأ، فإننا ننتقل إلى العبارة الأولى بعد حلقة while .

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

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

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

إليك الإصدار الثاني من هذه الحلقة:
do {
    // Loop body — the statement(s) that are repeatedly executed
} while (Boolean expression);
فيما يلي شرح لما يحدث عند تنفيذ هذا الكود:
  1. يتم تنفيذ نص الحلقة (مباشرة بعد الكلمة الأساسية do ).
  2. نقوم بتقييم التعبير المنطقي الموجود بين قوسين بعد الكلمة الأساسية while .
  3. إذا تم تقييم التعبير المنطقي على أنه صحيح، فإننا ننتقل إلى الخطوة 1
  4. إذا تم تقييم التعبير المنطقي إلى خطأ، فإننا ننتقل إلى العبارة الأولى بعد حلقة while .
الاختلافان الرئيسيان عن الحلقة السابقة هما: 1) يتم تنفيذ نص الحلقة مرة واحدة على الأقل و2) يتم تقييم التعبير المنطقي بعد تنفيذ نص الحلقة. وفقًا لذلك، يُسمى هذا النوع من حلقات while حلقة ذات شرط لاحق . سنعرض هذه المرة جدول قوى الرقم الذي لا يتجاوز 10000:
public static void main(String[] args) {
    int base = 3; // The number that will be exponentiated
    int result = base; // The result of exponentiation
    int exponent = 1; // The initial exponent
    do {
        System.out.println(base + " raised to the power of " + exponent + " = " + result);
        exponent++;
        result = result * base;
    } while (result < 10000); // The condition for exiting the loop
}
إخراج وحدة التحكم:
3 raised to the power of 1 = 3
3 raised to the power of 2 = 9
3 raised to the power of 3 = 27
3 raised to the power of 4 = 81
3 raised to the power of 5 = 243
3 raised to the power of 6 = 729
3 raised to the power of 7 = 2187
3 raised to the power of 8 = 6561
Process finished with exit code 0
انتبه إلى التغييرات في الكود. قارن هذا بالحلقة ذات الشرط المسبق.

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

البيانات المتفرعة داخل نص الحلقة

هناك عبارتان تؤثران على التنفيذ داخل الحلقة: Break (والتي سنناقشها بمزيد من التفصيل في الفصل التالي) و يكمل.
  • متابعة — يتخطى تنفيذ بقية نص الحلقة في التكرار الحالي وينتقل إلى تقييم التعبير المنطقي لعبارة while. إذا تم تقييم التعبير إلى صحيح، فستستمر الحلقة.
  • فاصل - ينهي على الفور تنفيذ التكرار الحالي وينقل التحكم إلى العبارة الأولى بعد الحلقة. وبالتالي، ينهي هذا البيان تنفيذ الحلقة الحالية. سننظر في الأمر بمزيد من التفصيل في المقالة التالية.
تذكر مثال الفاكهة لدينا. إذا لم نكن متأكدين من جودة التفاح، فيمكننا تغيير الكود باستخدام عبارة continue :
while (numberOfApplesInBowl > 0) {
    apple = bowl.grabNextApple();
    numberOfApplesInBow--; // "--" is the decrement operator, which reduces the number of apples by one
    if (apple.isBad()) { // This method returns true for rotten apples
        apple.throwInGarbage();
        continue; // Continue the loop. Jump to evaluation of numberOfApplesInBowl > 0
    }
    arrangeInPie(apple.peel().slice());
}
غالبًا ما يتم استخدام عبارة المتابعة عندما يلزم تنفيذ العبارات الموجودة في نص الحلقة إذا تم استيفاء شرط معين. على سبيل المثال، قد نرغب في تنفيذ إجراءات عند تشغيل مستشعر الجهاز (وإلا، فما عليك سوى متابعة الحلقة التي نأخذ فيها قراءات المستشعر) أو قد نرغب في حساب تعبير فقط على تكرارات معينة للحلقة. يمكن رؤية مثال على الحالة الأخيرة في استخدامنا للحلقة while لحساب مجموع مكعبات الأعداد الطبيعية التي يكون مربعها أقل من عدد الأرقام. مشوش؟ تحقق من الكود التالي:
public static void main(String[] args) {
    int sum = 0;  // Total amount
    int i = 0;  // Initial number in the series
    int count = 20;  // Number of numbers
    while (i <= count) {
        i++;  // Get the next number — "i++" is equivalent to "i = i + 1"
        if (i * i <= count)  // If the square of the number is less than
            continue;  // the number of numbers, then we won't calculate the sum
                            // Jump to the next number in the loop
        sum += i * i * i;  // Otherwise, we calculate the sum of the cubes of numbers
    }  // "sum += i * i * i" is notation that is equivalent to "sum = sum + i * i * i"
    System.out.println(sum);  // Print the result
}

حلقة لا نهائية

تُستخدم عبارات التفرع هذه في أغلب الأحيان في حلقات لا نهائية. نحن نسمي الحلقة لا نهائية إذا لم يتم استيفاء الشرط المنطقي للخروج من الحلقة. في الكود، يبدو الأمر كالتالي:
while (true) {
    // Loop body
}
في هذه الحالة، تساعدنا عبارة Break على الخروج من الحلقة. هذا النوع من الحلقات مناسب عند انتظار الظروف الخارجية المحددة خارج جسم الحلقة. على سبيل المثال، في أنظمة التشغيل أو الألعاب (الخروج من الحلقة يعني الخروج من اللعبة). أو عند استخدام الخوارزميات التي تحاول، مع كل تكرار للحلقة، تحسين بعض النتائج، ولكن مع تحديد عدد التكرارات بناءً على الوقت المنقضي أو حدوث حدث خارجي (مثل لعبة الداما أو الشطرنج أو التنبؤ بالطقس). تذكر أنه في ظل الظروف العادية، فإن الحلقات اللانهائية ليست مرغوبة. للتوضيح، دعونا نعود إلى الأس:
public static void main(String[] args) {
    int base = 3; // The number that will be exponentiated
    int result = 1; // The result of exponentiation
    int exponent = 1; // The initial exponent
    while (true) {
        result = result * base;
        System.out.println(base + " raised to the power of " + exponent + " = " + result);
        exponent++;
        if (exponent > 10)
            break; // Exit the loop
    }
}
إخراج وحدة التحكم:
3 raised to the power of 1 = 3
3 raised to the power of 2 = 9
3 raised to the power of 3 = 27
3 raised to the power of 4 = 81
3 raised to the power of 5 = 243
3 raised to the power of 6 = 729
3 raised to the power of 7 = 2187
3 raised to the power of 8 = 6561
3 raised to the power of 9 = 19683
3 raised to the power of 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.
الآن لدينا حلقة داخل حلقة. إنشاءات مثل هذه شائعة جدًا. وكمثال أخير، دعونا نبني أحد جداول الضرب التي تعلمنا أن نحبها في المدرسة الابتدائية.
public static void main(String[] args) {
    // Print the second factors in a row
    System.out.println("    2  3  4  5  6  7  8  9");
    int i = 2;  // Assign the first factor to the variable
    while (i < 10) {  // First loop: execute as long as the first factor is less than 10
        System.out.print(i + " | ");  // Print the first factor at the beginning of the line
        int j = 2;  // The starting value of the second factor
        while (j < 10) { // Second loop: execute as long as the second factor is less than 10
            int product = i * j;  // Calculate the product of the factors
            if (product < 10)  // If the product is a single digit, then we print two spaces after the product
                System.out.print(product + "  ");
            else  // Otherwise, print the product and one space after it
                System.out.print(product + " ");
            j++;  // Increment the second factor by one
        }  // Go to the beginning of the second loop, i.e. "while (j < 10)"
        System.out.println();  // Move to the next line on the console
        i++;  // Increment the first factor by one
    } // Go to the beginning of the first loop, i.e. "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 ) إحدى وحدات البناء الأساسية للبرمجيات. من خلال حل المهام على CodeGym، ستتعلم جميع أنواع الحلقات المختلفة، وستفهم تعقيداتها، وتكتسب مهارات عملية في استخدامها.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION