حلقه های for، while، do while، switch و حلقه های تو در تو در جاوا

ساختار های کنترلی در جاوا

در حالت عادی دستورات برنامه از اولین دستور به آخرین دستور اجرا می شوند.

اگر بخواهیم بعضی از دستورات چندین بار و بعضی دیگر از دستورات اصلا اجرا نشوند از ساختار های کنترلی یا control structure استفاده می کنیم.

ساختار های کنترلی دو دسته اند:

ساختار های تصمیم selection structure

ساختار های تکرار loop structure

به طور کلی می توان گفت کامپیوتر به چهار طریق می تواند دستورات را پردازش کند.

به طور ترتیبی ، از اولین دستور تا آخرین دستور.

انتخاب یک یا چند مسیر اجرا با استفاده از ساختار های تصمیم.

تکرار مجموعه ایی از دستورات با استفاده از ساختار های تکرار.

فرخوانی متد ( در ادامه بحث خواهد شد )

ساختار های تکرار

ساختار های تکرار تحت شرایط خاصی یک یا چند دستور را چندین بار اجرا می کند. در بسیاری از برنامه های کامپیوتری نیاز به تکرار مجموعه ای از دستورات است. برای تکرار اجرای دستورات از ساختار های تکرار استفاده می شود.

مثال: برای خواندن 100 عدد از ورودی و محاسبه میانگین آن ها باید 100 بار عمل خواندن ورودی تکرار شود و در آخر میانگین آنها محاسبه شود.

ساختار های تکرار که در جاوا مورد استفاده قرار می گیرند عبارت اند از :

Java

for

while

do ... while

ساختار تکرار For

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

یکی دیگر از اجزای حلقه شرط حلقه است. شرط حلقه مشخص می کند که دستورات حلقه تکرار تا کی باید اجرا شوند. اگر این شرط ارزش درستی داشته باشد دستورات  داخل حلقه اجرا می شوند وگرنه کنترل برنامه از حلقه تکرار خارج می شود. دستور for به صورت زیر قابل استفاده است.

Java

for(مقدار اولیه شمارنده; شرط حلقه; گام حرکت) {
    دستور 1;
    دستور 2;
    . . .
    دستور n;
}

به مجموعه دستورات در آکولاد دستورات مرکب گویند.

اگر حلقه فقط سامل یک دستور می شود می توان از آکولاد باز و بسته استفاده نکرد

Java

for(مقدار اولیه شمارنده; شرط حلقه; گام حرکت) 
    دستور;

مثالی ساده برای آشنایی با نحوه کارکرد حلقه for :

Java

for (int i = 0; i < 5; i++) {
    System.out,println(i);
}

متغیر i را با مقدار اولیه 0 تعریف کرده ایم. شرط حلقه این است که مقدار i باید از 5 کمتر باشد. اگر i کوچکتر از 5 باشد، دستورات داخل حلقه اجرا می شود و بعد از اجرا i++ که همان گام حرکت است انجام می گیرد و همین روال دوباره انجام می گیرد تا شرط حلقه نادرست شود و از حلقه بیرون بیاید.

خودت بنویس : برنامه ایی که کاراکتر های 'A' تا 'F' را به همراه کد آنها به خروجی می برد.

Java

public class example_1 {
    public static void main(String[] args) {
        for(char ch = 'A'; ch <= 'F'; ch++)
            System.out.println(ch + &quot = &quot + (int) ch);
    }
}

از مباحث قبلی آموزش جاوا در این مثال استفاده شده. برای دسترسی به فهرست مطالب آموزش جاوا از این لینک استفاده کنید.

خودت بنویس : حلقه for برای چاپ اعداد 15.0 تا 18.0 با گام حرکت 0.5

Java

public class example_2 {
    public static void main(String[] args) {
        for(float f = 15; f <= 18; f += 0.5) {
            System.out.println(&quotf = &quot + f);
        }
    }
}

حلقه های تو در تو for

در داخل حلقه های تکرار می توان حلقه های تکرار دیگری را قرار داد. اگر دو حلقه تکرار تو در تو داشته باشیم به ازای هر بار اجرای حلقه خارجی، حلقه داخلی به طور کامل انجام می شود تا شرط حلقه اش نقص شود. انتهای حلقه  تکرار داخلی، زودتر از انتهای حلقه تکرار خارجی ظاهر می شود. کد زیر را در نظر بگیرید

Java

for (int i = 0; i < 5; i++) {
    ...
    for(int j = 0; j < 10; j++) {
        ...
    }
     ...
}

حلقه تکرار خارجی 5 بار تکرار می شود. حلقه تکرار داخلی 10 بار اجرا می شود.

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

Markup

5 * 10 = 50

ساختار تکرار while

برای تکرار اجرای دستورات با داشتن شرط به کار می رود. نحوه استفاده آن به صورت زیر است

Java

while (شرط) {
    دستور 1;
    دستور 2;
    . . .
    دستور n;
}

اگر تعداد دستورات حلقه یک باشد می توان بدون آکولاد نوشت.

نکات :

چنانچه شرط درست باشد، دستورات n تا 1 اجرا می شود.

شرط حلقه تکرار باید در بدنه حلقه، ارزش نادرستی پیدا کند تا از حلقه خارج شویم. وگرنه حلقه برای همیشه ادامه پیدا می کند. چنین حلقه ایی راحلقه بی نهایت گویند.

خودت بنویس : مثال قبلی را با استفاده از while پیاده سازی کن

Java

public class example_3 {
    public static void main(String[] args) {
        float f = 15;
        while (f < 18.0) {
            System.out.println(&quotf = &quot + f);
            f += 0.5;
        }
    }
}

ساختار تکرار do ... while

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

Java

do {
    دستور 1;
    دستور 2;
    ...
    دستور n;
} while (شرط);

در صورت وجود یک دستور در بدنه do می توان از آکولاد باز و بسته استفاده نکرد.

مثال :

Java

public class example_4 {
    public static void main(String[] args) {
       boolean b = true;
       int i = 0;
       do {
            i++;
            if (i < 5) {
                b = false;
            }
        }  while (b);
    }
}

توجه : در این مثال از ساختار تصمیم if استفاده شد که در ادامه این بحث به آن خواهیم پرداخت...

سوال : از کدام ساختار استفاده کنیم ؟؟

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

برای جاهایی که تعداد تکرار و گام ها مشخص است از for استفاده می کنیم.

در موارد دیگر و با توجه به تفاوت while و do .. while از آنها بسته به نیاز استفاده می کنیم.

ساختار های تصمیم selection structure

ساختار های تصمیم عبارت اند از :

Java

if

if ... else

switch

اگر بخواهیم تحت شرایطی تعدادی از دستورات را اجرا کنیم یا تعدادی از دستورات را اجرا نکنیم، از این ساختار استفاده می شود.

ساختار تصمیم if

شرطی را تست می کند، در صورتی که شرط ارزش درستی داشته باشد مجموعه ای از دستورات را اجرا می کند. سینتکس آن به صورت زیر است :

Java

if (شرط) {
    دستور 1;
    دستور 2;
    ...
    دستور n;
}

در این حالت شرط بررسی می شود و اگر درست باشد، دستورات داخل آکولاد اجرا می شوند در غیر اینصورت کاری انجام نمی شود. کد زیر را ببینید :

Java

int i = 10;
if(i == 10)
    System.out.println(i);

در اینجا شرط موجود در if این است که آیا مقدار متغیر i برابر با مقدار 10 است یا خیر. چون مقدار i برابر با 10 است بنابراین دستور موجود در if اجرا می شود. اما اگر i برابر با 10 نبود آنگاه دستور موجود در بدنه if نادیده گرفته می شد.

حالت دیگری که می توان برای if در نظر گرفت به شکل زیر است:

Java

if (شرط) {
    دستور 1;
    دستور 2;
    ...
    دستور n;
} else {
   دستور n1;
   دستور n2;
    ...
   دستور n;
}

در حالت اول if اگر ارزش نادرستی داشت دستوری اجرا نمی شد. گاهی اوقات باید در صورت درست نبودن شرط دستوری انجام شود که با دستورات در حالت درستی شرط، متفاوت است. مثلا عددی داریم اگر عدد از 10 کوچکتر بود با عدد 10 آن را جمع بزن در غیر اینصورت عدد را با 10 تفریق کن. پیاده سازی آن با if .. else به صورت زیر امکان پذیر است :

Java

int number = 5;
if (number < 10) {
    number += 10; // number = number + 10;
} else {
   number -= 10;
}

دستور break در جاوا

دستور break موجب خاتمه یافتن داخلی ترین حلقه تکرار می شود و کاربرد دیگر آن در ساختار switch است. کد زیر را ببینید :

Java

for (int i = 0; i < 5; i++) {
    if(i == 3) {
        break;
    }
    System.out.println(i);
}

ساختار switch در جاوا

از این ساختار برای تصمیم گیری های چندگانه بر اساس مقادیر مختلف یک متغیر (یا یک عبارت) استفاده می شود. به طور کلی در تصمیم گیری هایی که بیش از سه انتخاب وجود داشته باشد، بهتر است از ساختار switch استفاده شود. ساختار switch به صورت زیر به کار می رود :

Java

switch (عبارت) {
   case <مقدار 1>:
       دستور 1;
        break;
   case <مقدار 2>:
        دستور 2;
        break;
    case <مقدار 3>:
        دستور 3;
        break;
 
    . . .
 
    default:
        دستور n;
}

نکات:

ساختار switch می تواند فاقد بخش default باشد.

مقادیر case ها نمی توانند با هم برابر باشند.

اگر ثوابت کاراکتری در switch بررسی شوند، به مقادیر صحیح تبدیل می شوند.

چنانچه مقدار عبارت با هیچکدام از case ها برابر نبود، دستورات موجود در default اجرا می شوند.

در ساختار if می توان عبارت های منطقی یا رابطه ایی را بررسی نمود اما در switch فقط مساوی بودن بررسی می شود.

چند ساختار switch را می توان تو در تو مورد استفاده قرار داد.

اگر در یک case از دستور break استفاده نشود با مقدار case بعدی or می شود. بدین ترتیب می توان یک یا چند case را بدون قرار دادن break در آنها (به صورت پشته سر هم در case ها) به هم or کرد.

Java

public class example_5 {
    public static void main(String[] args) {
       int code = 10;
       switch (code) {
            case 10 :
                System.out.println(&quotcode &quot + code + &quot ---> exit&quot);
                break;
            case 20 :
                System.out.println(&quotcode &quot + code + &quot ---> restart&quot);
                break;
            case 30 :
                System.out.println(&quotcode &quot + code + &quot ---> strat&quot);
                break;
            default :
                System.out.println(&quotcode &quot + code + &quot ---> default&quot);
       }
    }
}