CodeGym /وبلاگ جاوا /Random-FA /بیانیه while
John Squirrels
مرحله
San Francisco

بیانیه while

در گروه منتشر شد
اولین برنامه های ما دنباله ای از دستورالعمل ها بودند که یکی پس از دیگری اجرا می شدند. بدون چنگال این شامل 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 برگردید.
بیانیه while - 2فرض کنید ده سیب، دو دست و یک چاقو دارید. در زندگی واقعی، شما به طور متوالی کل دوجین را پوست می‌کنید و از الگوریتم یکسانی برای هر سیب پیروی می‌کنید. اما چگونه می‌توانیم برنامه‌ای را وادار کنیم که یک عمل تکراری برای هر سیب انجام دهد؟
  • ما خودمان را به تعداد سیب‌ها می‌بندیم، اما اگر تعداد کافی از آنها را نداشته باشیم، برخی از دستورات بدون «بارگذاری» اجرا می‌شوند (و ممکن است در حالی که سعی می‌کنیم یک سیب موجود را پوست کنیم، خودمان را قطع کنیم).
  • اگر تعداد سیب‌ها بیشتر از دستور پوست‌گیری باشد، برخی از سیب‌ها بدون پوست باقی می‌مانند.
  • خواندن چنین کدی سخت است. تکرارهای زیادی دارد و اصلاح آن دشوار است.

حلقه ها عباراتی هستند که اجازه می دهند اقدامات به طور مکرر انجام شوند

حلقه while جاوا در مورد ما به خوبی کار خواهد کرد. این ساختار اقدامات متعدد را در یک ساختار مختصر و قابل درک قرار می دهد. با استفاده از حلقه while ، یک الگوریتم برش سیب برای یک پای ممکن است در جاوا شبیه به این باشد:

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. ما عبارت Boolean موجود در پرانتز را بعد از کلمه کلیدی while ارزیابی می کنیم .
  2. اگر عبارت بولی به درستی ارزیابی شود، دستورات موجود در بدنه حلقه اجرا می شوند. پس از اجرای آخرین دستور در بدنه حلقه، به مرحله 1 می رویم
  3. اگر عبارت Boolean به غلط ارزیابی شود، پس از حلقه while به اولین عبارت می پریم .

حلقه با یک پیش شرط

از آنجایی که ما همیشه عبارت Boolean (شرط ورود به حلقه) را قبل از اجرای بدنه حلقه ارزیابی می کنیم، این شکل از حلقه 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. ما عبارت Boolean موجود در پرانتز را بعد از کلمه کلیدی while ارزیابی می کنیم .
  3. اگر عبارت Boolean برابر با true باشد، به مرحله 1 می رویم
  4. اگر عبارت Boolean به غلط ارزیابی شود، پس از حلقه while به اولین عبارت می پریم .
دو تفاوت اصلی با حلقه قبلی عبارتند از: 1) بدنه حلقه حداقل یک بار اجرا می شود و 2) عبارت Boolean پس از اجرای بدنه حلقه ارزیابی می شود. بر این اساس، به این نوع حلقه 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 می رود. اگر عبارت درست ارزیابی شود، حلقه ادامه می یابد.
  • break - بلافاصله اجرای تکرار فعلی را خاتمه می دهد و کنترل را به اولین عبارت بعد از حلقه منتقل می کند. بنابراین، این عبارت اجرای حلقه جاری را پایان می دهد. در مقاله بعدی آن را با جزئیات بیشتری بررسی خواهیم کرد.
نمونه میوه ما را به یاد بیاورید. اگر از کیفیت سیب‌ها مطمئن نیستیم، می‌توانیم کد را با استفاده از عبارت 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());
}
دستور continue اغلب زمانی استفاده می شود که دستورات موجود در بدنه حلقه در صورت برآورده شدن یک شرط خاص باید اجرا شوند. برای مثال، ممکن است بخواهیم زمانی که یک حسگر سخت‌افزاری راه‌اندازی می‌شود، اقداماتی را انجام دهیم (در غیر این صورت، به سادگی حلقه‌ای را که در آن خوانش حسگر را انجام می‌دهیم ادامه دهیم) یا ممکن است بخواهیم یک عبارت را فقط بر روی تکرارهای خاصی از یک حلقه محاسبه کنیم. نمونه ای از مورد دوم را می توان در استفاده ما از حلقه 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