CodeGym /Blog Java /Random-PL /Oświadczenie while
Autor
Artem Divertitto
Senior Android Developer at United Tech

Oświadczenie while

Opublikowano w grupie Random-PL
Nasze pierwsze programy były sekwencją instrukcji wykonywanych jedna po drugiej. Bez widelców. Obejmuje to HelloWorld, który wyświetla powitanie. Zawiera obliczenia arytmetyczne. Po naszych pierwszych programach nauczyliśmy się rozgałęziać, czyli jak sprawić, by program wykonywał różne akcje w zależności od konkretnych warunków. Oto kod do sterowania systemem centralnego ogrzewania i klimatyzacji:

if (tempRoom>tempComfort)
    airConditionerOn();
if (tempRoom<tempComfort)
    heaterOn();
Zrób następny krok. W życiu codziennym często wykonujemy jednolite, powtarzalne czynności, na przykład obieranie jabłek na placek. Ten fascynujący proces można opisać jako:
  1. Jeśli w misce znajdują się jabłka, wykonujemy kroki od 1.1 do 1.4:

    1. 1.1. Weź jabłko
    2. 1.2. Obierz go i pokrój w plasterki
    3. 1.3. Ułóż plasterki jabłka w cieście na patelni
    4. 1.4. Wróć do kroku 1.
Instrukcja while - 2Powiedzmy, że masz dziesięć jabłek, dwie ręce i jeden nóż. W prawdziwym życiu kolejno obierasz cały tuzin, postępując zgodnie z tym samym algorytmem dla każdego jabłka. Ale jak zmusić program do powtarzania akcji dla każdego jabłka?
  • Przywiązujemy się do liczby jabłek, ale jeśli mamy ich za mało, to niektóre polecenia zostałyby wykonane bez „ładunku” (i moglibyśmy się skaleczyć, próbując obrać nieistniejące jabłko).
  • Jeśli jest więcej jabłek niż nakazów obierania, to część jabłek pozostanie nieobrana.
  • Taki kod jest trudny do odczytania. Ma wiele powtórzeń i jest trudny do modyfikacji.

Pętle to instrukcje umożliwiające wielokrotne wykonywanie akcji

Pętla while w Javie będzie działać dobrze w naszym przypadku. Ta konstrukcja umieszcza wiele działań w zwięzłej i zrozumiałej strukturze. Korzystając z pętli while , algorytm krojenia jabłek dla ciasta może wyglądać tak w Javie:

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.");

Składnia polecenia

Pierwszy wariant instrukcji while wygląda następująco:

while (Boolean expression) {
	// Loop body — the statement(s) that are repeatedly executed
}
Oto wyjaśnienie krok po kroku, co się dzieje, gdy ten kod jest wykonywany:
  1. Oceniamy wyrażenie logiczne znajdujące się w nawiasach po słowie kluczowym while .
  2. Jeśli wyrażenie boolowskie ma wartość true, wówczas wykonywane są instrukcje w treści pętli . Po wykonaniu ostatniej instrukcji w ciele pętli przechodzimy do kroku 1
  3. Jeśli wyrażenie boolowskie ma wartość false, wówczas przeskakujemy do pierwszej instrukcji po pętli while .

Pętla z warunkiem wstępnym

Ponieważ zawsze oceniamy wyrażenie boolowskie (warunek wejścia do pętli) przed wykonaniem ciała pętli, ta forma pętli while jest często nazywana pętlą z warunkiem wstępnym . Zbudujmy tabelę pierwszych dziesięciu potęg liczby:

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++;
    }
}
Wyjście konsoli:

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

Pętla z warunkiem końcowym

Oto drugi wariant tej pętli:

do {
    // Loop body — the statement(s) that are repeatedly executed
} while (Boolean expression);
Oto wyjaśnienie, co się dzieje, gdy ten kod jest wykonywany:
  1. Treść pętli jest wykonywana (bezpośrednio po słowie kluczowym do ).
  2. Oceniamy wyrażenie logiczne znajdujące się w nawiasach po słowie kluczowym while .
  3. Jeśli wyrażenie boolowskie ma wartość true, przechodzimy do kroku 1
  4. Jeśli wyrażenie boolowskie ma wartość false, wówczas przeskakujemy do pierwszej instrukcji po pętli while .
Dwie główne różnice w stosunku do poprzedniej pętli to: 1) treść pętli jest wykonywana co najmniej raz i 2) wyrażenie boolowskie jest oceniane po wykonaniu treści pętli. W związku z tym ten rodzaj pętli while jest nazywany pętlą z warunkiem końcowym . Tym razem wyświetlimy tablicę potęg liczby nieprzekraczającej 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
}
Wyjście konsoli:

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
Zwróć uwagę na zmiany w kodzie. Porównaj to z pętlą z warunkiem wstępnym.

Interesujące fakty dotyczące pracy z pętlami

Instrukcje rozgałęziające w ciele pętli

Istnieją dwie instrukcje, które wpływają na wykonanie pętli: break (omówimy to bardziej szczegółowo w następnym rozdziale) i Kontynuować.
  • Kontynuuj — pomija wykonanie reszty ciała pętli w bieżącej iteracji i przeskakuje do oceny wyrażenia boolowskiego instrukcji while. Jeśli wyrażenie ma wartość true, pętla jest kontynuowana.
  • break — natychmiast kończy wykonywanie bieżącej iteracji i przekazuje sterowanie do pierwszej instrukcji po pętli. Zatem ta instrukcja kończy wykonywanie bieżącej pętli. Rozważymy to bardziej szczegółowo w następnym artykule.
Przypomnij sobie nasz owocowy przykład. Jeśli nie jesteśmy pewni jakości jabłek, możemy zmienić kod za pomocą instrukcji 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());
}
Instrukcja continue jest często używana, gdy instrukcje w ciele pętli muszą zostać wykonane, jeśli spełniony jest określony warunek. Na przykład możemy chcieć wykonać akcje, gdy czujnik sprzętowy zostanie wyzwolony (w przeciwnym razie po prostu kontynuujmy pętlę, w której dokonujemy odczytów czujnika) lub możemy chcieć obliczyć wyrażenie tylko na określonych iteracjach pętli. Przykład tego ostatniego przypadku można zobaczyć w naszym użyciu pętli while do obliczenia sumy sześcianów liczb naturalnych, których kwadrat jest mniejszy od liczby liczb. Zdezorientowany? Sprawdź następujący kod:

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
}

Nieskończona pętla

Te instrukcje rozgałęziające są najczęściej używane w nieskończonych pętlach. Pętlę nazywamy nieskończoną, jeśli warunek logiczny wyjścia z pętli nigdy nie jest spełniony. W kodzie wygląda to mniej więcej tak:

while (true) {
    // Loop body 
}
W tym przypadku instrukcja break pomaga nam wyjść z pętli. Ten typ pętli jest odpowiedni do oczekiwania na warunki zewnętrzne określone poza ciałem pętli. Na przykład w systemach operacyjnych lub grach (wyjście z pętli oznacza wyjście z gry). Lub gdy używasz algorytmów, które z każdą iteracją pętli próbują poprawić jakiś wynik, ale ograniczają liczbę iteracji na podstawie czasu, który upłynął lub wystąpienia zdarzenia zewnętrznego (np. warcaby, szachy lub prognoza pogody). Pamiętaj, że w normalnych warunkach nieskończone pętle nie są pożądane. Aby zademonstrować, wróćmy do potęgowania:

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
    }
}
Wyjście konsoli:

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

Pętle zagnieżdżone

A teraz dochodzimy do ostatniego tematu dotyczącego pętli. Przypomnij sobie tę szarlotkę (mam nadzieję, że nie jesteś w tej chwili głodny) i naszą pętlę obierania jabłek:
  1. Jeśli w misce znajdują się jabłka, wykonujemy kroki od 1.1 do 1.4:

    1. 1.1. Weź jabłko
    2. 1.2. Obierz go i pokrój w plasterki
    3. 1.3. Ułóż plasterki jabłka w cieście na patelni
    4. 1.4. Wróć do kroku 1.
Opiszmy bardziej szczegółowo proces krojenia:
  1. Liczba plasterków = 0
  2. Jeśli liczba warstw wynosi < 12, wykonaj kroki od 2.1 do 2.3

    1. 2.1. Odetnij kolejny plasterek jabłka
    2. 2.2. Liczba plasterków++
    3. 2.3. Wróć do kroku 2
I dodamy to do naszego algorytmu tworzenia ciasta:
  1. Jeśli w misce znajdują się jabłka, wykonujemy kroki od 1.1 do 1.6:

    1. 1.1. Weź jabłko
    2. 1.2. Obierz to
    3. 1.3. Liczba plasterków = 0
    4. 1.4. Dopóki liczba warstw wynosi < 12, wykonaj kroki od 1.4.1 do 1.4.3
      1. 1.4.1. Odetnij kolejny plasterek jabłka
      2. 1.4.2. Liczba plasterków++
      3. 1.4.3. Wróć do kroku 1.4
    5. 1.5. Ułóż plasterki jabłka w cieście na patelni
    6. 1.6. Wróć do kroku 1.
Teraz mamy pętlę w pętli. Konstrukcje takie jak ta są bardzo powszechne. Jako ostatni przykład zbudujmy jedną z tabliczek mnożenia, które polubiliśmy w szkole podstawowej.

 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)"
}
Wyjście konsoli:

    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
Pętle (w szczególności instrukcja while ) są jednym z podstawowych elementów składowych oprogramowania. Rozwiązując zadania w CodeGym, nauczysz się różnych rodzajów pętli, zrozumiesz ich zawiłości i zdobędziesz praktyczne umiejętności ich używania.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION