CodeGym /Java блог /Случаен /Изявлението While
John Squirrels
Ниво
San Francisco

Изявлението While

Публикувано в групата
Първите ни програми бяха поредица от инструкции, които се изпълняват една след друга. Без вorци. Това включва HelloWorld, който показва поздрав. Включва аритметични изчисления. След първите ни програми се научихме How да се разклоняваме, т.е. How да накараме една програма да изпълнява различни действия в зависимост от конкретни условия. Ето code за управление на система за централно отопление и климатизация:

if (tempRoom>tempComfort)
    airConditionerOn();
if (tempRoom<tempComfort)
    heaterOn();
Направете следващата стъпка. В ежедневието често извършваме еднакви повтарящи се действия, например белене на ябълки за пай. Този завладяващ процес може да бъде описан така:
  1. Ако в купата има ябълки, тогава изпълняваме стъпки от 1.1 до 1.4:

    1. 1.1. Вземете ябълка
    2. 1.2. Обелете го и го нарежете на фorйки
    3. 1.3. Подредете резенчетата ябълка в кората за пай в тава
    4. 1.4. Върнете се към стъпка 1.
Операторът while - 2Да кажем, че имате десет ябълки, две ръце и един нож. В реалния живот вие последователно обелвате цялата дузина, като следвате същия алгоритъм за всяка ябълка. Но How да накараме програма да извърши повтарящо се действие за всяка ябълка?
  • Ние се обвързваме с броя на ябълките, но ако нямаме достатъчно от тях, тогава някои от командите ще бъдат изпълнени без "полезен товар" (и може да се порежем, докато се опитваме да обелим несъществуваща ябълка).
  • Ако има повече ябълки, отколкото командите за обелване, тогава някои от ябълките ще останат необелени.
  • Такъв code е труден за четене. Има много повторения и трудно се променя.

Циклите са инструкции, които позволяват действията да се изпълняват многократно

Цикълът while на 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
}
Ето стъпка по стъпка обяснение Howво се случва, когато този code се изпълни:
  1. Ние оценяваме булевия израз, намиращ се в скобите след ключовата дума while .
  2. Ако булевият израз се изчисли като true, тогава операторите в тялото на цикъла се изпълняват. След като бъде изпълнен последният оператор в тялото на цикъла, преминаваме към стъпка 1
  3. Ако булевият израз се изчисли като false, тогава преминаваме към първия оператор след цикъла while .

Цикъл с предпоставка

Тъй като винаги оценяваме булевия израз (conditionто за влизане в цикъла) преди да изпълним тялото на цикъла, тази форма на цикъла while често се нарича цикъл с предварително condition . Нека съставим table на първите десет степени на число:

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

Цикъл с постcondition

Ето втория вариант на този цикъл:

do {
    // Loop body — the statement(s) that are repeatedly executed
} while (Boolean expression);
Ето обяснение Howво се случва, когато този code се изпълни:
  1. Тялото на цикъла се изпълнява (веднага след ключовата дума do ).
  2. Ние оценяваме булевия израз, намиращ се в скобите след ключовата дума while .
  3. Ако булевият израз се изчисли като true, тогава преминаваме към стъпка 1
  4. Ако булевият израз се изчисли като false, тогава преминаваме към първия оператор след цикъла while .
Двете основни разлики от предишния цикъл са: 1) тялото на цикъла се изпълнява поне веднъж и 2) булевият израз се изчислява след изпълнение на тялото на цикъла. Съответно, този вид while цикъл се нарича цикъл с постcondition . Този път ще покажем table със степените на число, които не надвишават 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
Обърнете внимание на промените в codeа. Сравнете това с цикъла с предварително condition.

Интересни факти за работата с цикли

Изявления за разклоняване в тялото на цикъла

Има две инструкции, които влияят на изпълнението в рамките на цикъл: break (което ще обсъдим по-подробно в следващата глава) и продължи.
  • продължи — пропуска изпълнението на останалата част от тялото на цикъла в текущата итерация и преминава към оценката на булевия израз на оператора while. Ако изразът се изчисли като true, тогава цикълът продължава.
  • break — незабавно прекратява изпълнението на текущата итерация и прехвърля контрола към първия оператор след цикъла. По този начин този оператор завършва изпълнението на текущия цикъл. Ще го разгледаме по-подробно в следващата статия.
Спомнете си нашия пример с плодове. Ако не сме сигурни в качеството на ябълките, можем да променим codeа с помощта на оператор за продължаване :

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());
}
Операторът continue често се използва, когато операторите в тялото на цикъла трябва да бъдат изпълнени, ако определено condition е изпълнено. Например, може да искаме да извършим действия, когато се задейства хардуерен сензор (в противен случай просто продължете цикъла, в който вземаме показания на сензора) or може да искаме да изчислим израз само на определени повторения на цикъл. Пример за последния случай може да се види в нашата употреба на цикъл while за изчисляване на сумата от кубове на естествени числа, чийто квадрат е по-малък от броя на числата. объркани? Вижте следния code:

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
}

Безкраен цикъл

Тези инструкции за разклоняване се използват най-често в безкрайни цикли. Ние наричаме цикъл безкраен, ако булевото condition за излизане от цикъла никога не е изпълнено. В codeа изглежда нещо подобно:

while (true) {
    // Loop body 
}
В този случай командата break ни помага да излезем от цикъла. Този тип цикъл е подходящ, когато се чакат външни условия, определени извън тялото на цикъла. Например в операционни системи or игри (излизането от цикъла означава излизане от играта). Или когато използвате алгоритми, които се опитват с всяка итерация на цикъл да подобрят няHowъв резултат, но ограничават броя на итерациите въз основа на изминало време or настъпване на външно събитие (напр. пулове, шах or прогноза за времето). Не забравяйте, че при нормални условия безкрайните цикли не са желателни. За да демонстрираме, нека се върнем към степенуването:

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. Обелете го и го нарежете на фorйки
    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
И ще добавим това към нашия алгоритъм за пequalsе на пай:
  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ще.

 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