JavaRush /Java Blogu /Random-AZ /Java-da isə dövrə

Java-da isə dövrə

Qrupda dərc edilmişdir

Giriş

İlk proqramlarımız bir-birinin ardınca yerinə yetirilən əmrlər ardıcıllığı idi. Çəngəl yoxdur. Bu, salamlama ifadəsi və arifmetik hesablamaları konsola çıxaran HelloWorld-dir. İlk proqramlardan sonra biz budaqlanmağı öyrəndik, yəni proqram şərtlərdən asılı olaraq müəyyən hərəkətləri yerinə yetirirdi. Kondisioneri isitmə və soyutma üçün yandırmaq üçün necə kodlaşdıra bilərsiniz:
if (tempRoom>tempComfort)
    airConditionerOn();
if (tempRoom<tempComfort
    heaterOn();
Gəlin növbəti addımı ataq. Gündəlik həyatda tez-tez monoton, təkrarlanan hərəkətlər edirik, məsələn, bir pasta üçün alma qabığı. Bu maraqlı prosesi belə təsvir etmək olar:
  1. Hövzədə alma varsa, 1.1-1.4 addımlarını yerinə yetirin:

    1. 1.1. Bir alma götürün
    2. 1.2. Təmizləyin və dilimlərə kəsin
    3. 1.3. Bir qızartma qabda pasta pastasının əsasına qoyun
    4. 1.4. 1-ci addıma qayıdaq.
Operator isə - 2
Tutaq ki, 10 alma, 2 əl və bir bıçaq var. Həyatda eyni alqoritmi rəhbər tutaraq bütün onluğu ardıcıl olaraq təmizləyirsiniz. Proqramı hər bir alma ilə təkrarlanan hərəkəti necə etmək olar?
  • Gəlin özümüzü almaların sayına bağlayaq, amma onların sayı az olsa, bəzi əmrlər “faydalı” olmadan əbəs yerə yerinə yetirilərdi (və ola bilsin ki, olmayan almanın qabığını soyarkən özümüzü kəsərdik).
  • Əgər bizim emal qruplarımızdan daha çox alma olsaydı, məhsulların bir hissəsi emal olunmaz.
  • Belə “kod”u oxumaq çətindir, çoxlu təkrarları ehtiva edir və dəyişdirilməsi çətindir.

Döngələr bir neçə dəfə hərəkətləri yerinə yetirmək üçün operatorlardır.

Bizim vəziyyətimizdə Java while döngəsi (pis döngə) yaxşı işləyir. Bu dizayn bir çox hərəkətləri qısa və başa düşülən bir quruluşda təşkil edir. Java-da pasta üçün alma dilimləmək üçün bir müddət alqoritm belə görünə bilər:
while(числоЯблокВТазике>0) {
    яблоко = тазик.взятьОчередноеЯблоко();
    положитьВПирог(яблоко.чистить().нарезать());
    числоЯблокВТазике--;//-- this is a decrement, reduces the number of apples by one
}
System.out.println('Apples for the pie are processed.');

Komanda Sintaksisi

while ifadəsini təsvir etməyin ilk yolu aşağıdakı kimidir:
while(Логическое выражение) {
	// Loop body - periodically executed statement(s)
}
Bu aşağıdakı kimi edilir (addım-addım):
  1. Mötərizədə müddətdən sonra gələn Boolean şərtini qiymətləndiririk.
  2. Əgər məntiqi şərt doğrudursa, onda dövrə gövdəsindəki ifadələr yerinə yetirilir, döngənin gövdəsində sonuncu ifadəni yerinə yetirdikdən sonra 1-ci addıma keçin.
  3. Məntiqi şərt yalnışdırsa, while dövrəsindən kənar ilk ifadəyə keçin.

Ön şərtlə döngə

Döngənin gövdəsini yerinə yetirməzdən əvvəl biz həmişə məntiqi ifadəni (döngüyə daxil olmaq şərtini) əvvəlcədən hesabladığımız üçün bu tip while tez-tez ilkin şərti olan dövrə adlanır. Ədədin ilk on tam, müsbət dərəcələrinin cədvəlini quraq:
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++;
    }
}
Konsol çıxışı nəticəsi:
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

Postşart ilə döngə

İkinci növ dövr:
do {
    // Loop body - periodically executed statement(s)
}while (Логическое выражение);
Aşağıdakı kimi həyata keçirilir (addımlar):
  1. Döngənin gövdəsi icra olunur (do açar sözündən dərhal sonra).
  2. Mötərizədə müddətdən sonra gələn Boolean şərtini qiymətləndiririk.
  3. Məntiqi şərt doğrudursa, 1-ci addıma keçin
  4. Məntiqi şərt yalnışdırsa, while dövrəsindən kənar ilk ifadəyə keçin.
Əvvəlki döngə növündən iki əsas fərq: döngənin gövdəsi ən azı bir dəfə yerinə yetirilir və dövrənin gövdəsi yerinə yetirildikdən sonra məntiqi şərt yoxlanılır. Buna görə də bu növ while dövrəsinə postşərt dövrəsi deyilir. Bu dəfə biz 10000-dən çox olmayan güc cədvəlini göstərəcəyik:
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
Konsol çıxışı nəticəsi:
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
Koddakı dəyişikliklərə diqqət yetirin, onu ilkin şərtlə döngənin versiyası ilə müqayisə edin.

Döngələrlə işləmək haqqında maraqlı faktlar

Döngənin gövdəsində idarəetmə əmrləri

Döngənin gedişatına təsir edən iki əmr var: xüsusiyyətlərini növbəti fəsildə göstərəcəyimiz fasilə və davam et.
  • davam – cari dövrənin gövdəsinin icrasını dayandırır və while operatorunun məntiqi ifadəsinə keçir. Hesablanmış ifadə doğrudursa, dövrənin icrası davam edəcək.
  • fasilə – cari dövrənin icrasını dərhal dayandırır və ondan kənarda olan birinci əmrə keçir. Beləliklə, cari dövrənin icrası kəsilir. Növbəti mövzuda daha ətraflı baxacağıq.
Meyvə nümunəmizi xatırlayaq. Təklif olunan almaların keyfiyyətinə əmin deyiliksə, əmrdən istifadə edərək kodu dəyişə bilərik 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
    }
    положитьВПирог(яблоко.чистить().нарезать());
}
Konstruksiya continuetez-tez bir döngənin gövdəsində müəyyən bir vəziyyət yarandıqda əmrləri yerinə yetirmək lazım olduqda istifadə olunur, məsələn, avadanlıqdakı bir sensor işə salındıqda hərəkətləri yerinə yetirmək (əks halda onun göstəricilərini oxumaq dövrünə davam edin) və ya yalnız dövrün müəyyən addımlarında ifadəni hesablamaq. Sonuncu vəziyyətə misal olaraq kvadratı onların sayından kiçik olan natural ədədlərin kublarının cəminin while dövrəsində hesablanmasıdır:
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
}

Sonsuz dövr

Bu idarəetmə əmrləri ən çox sonsuz döngədə istifadə olunur. Məntiqi çıxış şərti heç vaxt təmin olunmadığı üçün bu adlanır. Kodda belə görünür:
while(true) {
    // Loop body
}
breakBu vəziyyətdə, ondan çıxış təşkil etmək üçün bir əmrdən istifadə etmək faydalı olacaq . Bu tip döngə, döngə gövdəsinin məntiqindən kənarda formalaşan xarici şərtləri gözləyərkən baş verir. Məsələn, qəhrəmanın ətrafındakı virtual dünyanı təqlid edən oyunlarda (döngüdən çıxmaq = oyundan çıxmaq), əməliyyat sistemləri. Və ya alqoritmlərdən istifadə edərkən, ola bilsin ki, dövrədə hər bir sonrakı zənglə nəticəni yaxşılaşdırın, lakin onları vaxt və ya xarici hadisənin baş verməsi (dama, şahmat və ya hava proqnozu) ilə məhdudlaşdırın. Yadda saxlamaq lazımdır ki, normal şəraitdə sonsuz döngələr proqramın qeyri-sabitliyi problemlərindən biridir. Nümayiş etmək üçün rəqəmlərin səlahiyyətlərinə qayıdaq:
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
    }
}
Konsol çıxışı nəticəsi:
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

İç-içə döngələr

Burada dövrümüzlə bağlı son mövzuya gəlirik. Gəlin alma piroqu (inşallah hazırda ac deyilsiniz) və "döngü" haqqında düşünək:
  1. Hövzədə alma varsa, 1.1-1.4 addımlarını yerinə yetirin:

    1. 1.1. Bir alma götürün
    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-х видели на обложках тетрадей в младших классах.
Operator isə - 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, вы изучите все их разнообразие, разберёте тонкости функционирования и получите практические навыки их применения.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION