نحوه ی استفاده از حلقه هایی از جنس do-while در زبان جاوا


پس از آشنایی با نحوه عمکرد Loop هایی از جنس for و while در دو قسمت آموزشی پیشین، حال نوبت به بررسی نوع دیگری از Loop ها تحت عنوان do-while می رسد. وجه تمایز Loop یی از جنس do-while با Loop یی از جنس while در این است که در do-while حتی اگر جواب به شرط داخل while معادل با false باشد، باز هم دستورات داخل { } حداقل یک بار اجرا می شود و این در حالی است که اگر ما Loop یی از جنس while داشته باشیم و پاسخ به شرط داخل حلقه ی while معادل با false باشد، اجرای هیچ گونه دستوری را نباید از برنامه انتظار داشته باشیم. برای روشن تر شدن این وجه تمایز پروژه ای جدید تحت عنوان DoWhileLoop به همراه کلاسی به همین نام ایجاد می کنیم و آن را به شکل زیر تکمیل می کنیم:

public class DoWhileLoop {
    public static void main(String[] args) {
        int number = 12;
        while (number <= 10) {
            System.out.println("My Number Is: " + number);
            number++;
        }
    }
}

در این کد به برنامه دستور داده ایم مادامی که مقدار متغیر number کوچکتر یا مساوی با عدد ده است این Loop ادامه پیدا کند اما نکته در اینجا است که مقدار اولیه متغیر معادل با عدد دوازده است و از آنجا که جواب به شرط داخل پرانتز از ابتدا false است، برنامه در پنجره کنسول هیچ چیز نمایش نخواهد داد و خروجی برنامه به شکل زیر خواهد بود:

حال کد فوق را می خواهیم به Loop یی از جنس do-while تبدیل نماییم. برای این منظور کد خود را به شکل زیر بازنویسی می کنیم:

public class DoWhileLoop {
    public static void main(String[] args) {
        int number = 1;
        do {
            System.out.println("My Number Is:" + number);
            number++;
        } while (number <= 10);
    }
}

در این کد یک متغیر از جنس int تحت عنوان number با مقدار اولیه ی یک تعریف کرده ایم. سپس یک Block به شکل { }do ایجاد می کنیم (همان طور که در آموزش های پیشین گفته شد Block به یک قسمت کد در برنامه نویسی گفته می شود.) حال مابین دوعلامت { } مرتبط با do دستوری که می خواهیم روی صفحه مانیتور به نمایش در آید را می نویسیم و سپس دستور می دهیم که در هر بار Loop شدن یک واحد به متغیر number اضافه شود. پس از پایان Block مرتبط با do حال نوبت به نوشتن شرط Loop است که به صورت ;(while(number<=10 آن را می نویسیم. به عبارت دیگر به برنامه دستور می دهیم که مادامی که مقدار متغیر number کوچکتر یا حداکثر مساوی با عدد ده است این کار ادامه یابد. پس از اجرای برنامه خروجی زیر مشاهده خواهد شد:

می بینیم که در برنامه فوق Loop یی از جنس do-while عملکردی همانند Loop یی از جنس while دارد. حال با تغییری که در کد خود خواهیم داد وجه تمایز این دو نوع Loop به خوبی مشخص خواهد شد. برای همین منظور کد خود را به شکل زیر بازنویسی می کنیم:

public class DoWhileLoop {
	public static void main(String[] args) {
		int number = 12;
		do {
			System.out.println("My Number Is:" + number);
			number++;
		} while (number <= 10);
	}
}

در واقع تنها تغییری که در کد انجام داده ایم این است که مقدار اولیه متغیر number را دوازده تعیین کرده ایم. حال برنامه را اجرا می کنیم:

اگر ما در برنامه خود از Loop یی از جنس while استفاده کرده بودیم، برنامه به ما هیچ خروجی نمی داد اما از آنجا که ما از یک do-while استفاده کرده ایم، علیرغم این که پاسخ به شرط ;(while(number <= 10 معادل با false است، اما Loop یک بار اجرا می شود (به این دلیل پاسخ false است که مقدار اولیه متغیر number معادل با عدد دوازده است.)

اما از آنجا که دستور ;()System.out.println در Block مرتبط با do نوشته شده است، برنامه ما حداقل یک بار این دستور را اجرا خواهد کرد چرا که محل قرار گرفتن این دستور در do است و پیش از آن که برنامه به شرط قرار گرفته داخل پرانتز برسد، این دستور یک بار اجرا شده است.

خارج شدن از یک Loop
به طور معمول زمانی که جواب به شرط قرار گرفته در Loop معادل با false شود، برنامه به طور خودکار از Loop خارج خواهد شد اما زمان هایی برای ما پیش می آید که خودمان عمداً می خواهیم برنامه از Loop خارج شود که برای این منظور از دستور ;break استفاده می کنیم. برای روشن شدن این مطلب می توانیم در همان پروژه قبلی که ایجاد کرده بودیم یک کلاس جدید تحت عنوان ExitALoop به معنی "خروج از یک Loop " ایجاد کنیم و یک Loop از جنس while در آن بسازیم. کد ما به شکل زیر خواهد بود:

public class ExitALoop {
    public static void main(String[] args) {
        int number = 0;
        while (number < 1000) {
            number += 100;
            System.out.println("My Number Is: " + number);
        }
    }
}

حال پس از اجرای برنامه، خروجی به شکل زیر خواهد بود:

در کد فوق ما دستور داده ایم که مقدار اولیه متغیر برابر با صفر باشد و مادامی که متغیر کوچکتر از هزار است Loop تکرار شده و هر دفعه به میزان صد واحد به آن اضافه شود. حال فرض کنیم که می خواهیم Loop ما پس از آن که مقدار متغیر به عدد هفتصد رسید متوقف شده و برنامه از Loop خارج شود. برای این منظور کد خود را به شکل زیر تکمیل می کنیم:

public class ExitALoop {
    public static void main(String[] args) {
        int number = 0;
        while (number < 1000) {
            number += 100;
            System.out.println("My Number Is: " + number);
            if (number == 700) {
                break;
            }
        }
    }
} 

کاری که در کد فوق انجام داده ایم این است که یک شرط داخل Block مرتبط با while از جنس if گذاشته ایم مبنی بر این که اگر مقدار متغیر number معادل با عدد هفتصد بود برنامه می بایست با استفاده از دستور ;break از داخل Loop خارج شده و بالتبع Loop ادامه نخواهد یافت

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

در این مرحله از کار، خروجی برنامه به شکل زیر خواهد بود:

ادامه دادن یک Loop یا استفاده از دستور ;continue
زمان هایی در برنامه نویسی برای ما پیش خواهد آمد که نیاز داریم اگر مقدار متغیر به مقدار خاصی رسید، به برنامه دستور دهیم که کار خود را ادامه دهد که برای این منظور از دستور ;continue استفاده می کنیم. برای روشن شدن مطلب کد خود را به شکل زیر بازنویسی می کنیم:

public class ExitALoop {
    public static void main(String[] args) {
        int number = 0;
        while (number < 1000) {
            number += 100;
            if (number == 700) {
                continue;
            }
            System.out.println("My Number Is: " + number);
        }
    }
}

در کد فوق دستور داده ایم مادامی که مقدار متغیر number کوچکتر از هزار است، تعداد صد واحد به مقدار متغیر اضافه شود و در نهایت خروجی در بخش کنسول به نمایش در آید. اضافه بر این، شرطی گذاشته ایم به این صورت که اگر مقدار متغیر برابر با عدد هفتصد شد Loop ما ادامه یابد. به عبارت دیگر زمانی که Loop به عدد هفتصد رسید به جای آن که برنامه ادامه یابد و عبارت My Number Is: 700 در پنجره کنسول به نمایش درآید، برنامه به ابتدای Loop رفته و کار خود را "ادامه" می دهد. در واقع خروجی برنامه به شکل زیر خواهد بود:

همان طور که مشاهده می شود عدد هفتصد در خروجی برنامه وجود ندارد چرا که خودمان به برنامه دستور داده ایم به محض این که مقدار متغیر معادل با عدد هفتصد شد به جای نمایش آن به ابتدای Loop رفته و کار خود را ادامه دهد.

در آموزش آینده با نحوه استفاده از دو متغیر داخل یک دستور Loop از جنس for تحت پروژه ای عملی به اسم Helping My Sibling به معنی "کمک به خواهر/برادرم" آشنا خواهیم شد.

دانلود فایل‌های تمرین


بهزاد مرادی

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
Mrj
Mrj
۱۳۹۵/۰۸/۱۰
باعرض سلام و خسته نباشید.
برای من هم سوال "مهدی" آقا مبنی بر :
یه سوال: اگه تو همون while ما خطِ:number++ رو قبل از دستور پرینت بنویسیم همین do-while حاصل میشه..دیگه چه نیازی به این هست؟"
پیش اومده ولی من نفهمیدم که فرق این دو چیه .
اگه ممکنه توضیح بدید فرق بینشون رو.
Mr.Fox
Mr.Fox
۱۳۹۵/۰۷/۳۰
سلام خسته نباشید ببخشید من واقعا سردرگم شدم تو این قسمت. میشه یه توضیح کامل یا یه لینک بدین راجع به loop ها بیشتر مطالعه کنیم؟ ممنونم
کاربر میهمان
مهرسامن یک کاربر مهمان هستم
۱۳۹۵/۰۶/۲۸
خیلی عالیه
M-Yall
M-Yall
۱۳۹۵/۰۴/۱۸
خسته نباشید و واقعا ممنونم.
کاربر میهمان
معینمن یک کاربر مهمان هستم
۱۳۹۴/۰۹/۲۰
خسته نباشید توضیحاتتون کاملا مفهوم و جامع اند واقعا دستتون درد نکنه
کاربر میهمان
علیمن یک کاربر مهمان هستم
۱۳۹۴/۰۹/۱۳
سپاس فراوان
کاربر میهمان
مهدیمن یک کاربر مهمان هستم
۱۳۹۴/۰۹/۱۲
ببخشید خودم متوجه شدم..پاک کنید شرمنده
کاربر میهمان
مهدیمن یک کاربر مهمان هستم
۱۳۹۴/۰۹/۱۲
سلام..خسته نباشید
یه سوال: اگه تو همون while ما خطِ:number++ رو قبل از دستور پرینت بنویسیم همین do-while حاصل میشه..دیگه چه نیازی به این هست؟
**خیلی خوبید..واقعا عالی آموزش داده شده
محمد عقبائی فرهنگ
محمد عقبائی فرهنگ
۱۳۹۴/۰۸/۱۶
کارتون عالیه امیدوارم همیشه در مراحل زندگیتون موفق باشین.
AliJCVD
AliJCVD
۱۳۹۴/۰۷/۲۲
واقعا خسته نباشید با این آموزش خوب و مفهومیتون...من آموزش این دوره رو شروع کردم و تا اینجا که رسیدم همه ی مطالب رو به خوبی متوجه شدم و دنبال هیچ ریفرنس دیگه ای نرفتم...تشکر