معرفی دستور switch در زبان برنامه‌نویسی جاوا


در آموزش‌های گذشته با کاربرد دستورات if و else آشنا شدیم و گفتیم که استفاده از این دستورات در برنامه‌هایی مناسب است که دو احتمال در آن‌ها مطرح باشد. حال در این آموزش به معرفی دستور دیگری تحت عنوان switch می‌پردازیم که عملکردی مشابه دستور if دارا است با این تفاوت که استفاده از آن در برنامه‌هایی مناسب می‌باشد که نیاز به بررسی شرایط مختلف بوده و در فرآیند توسعۀ برنامۀ مد نظر احتمالاتی بیش از دو حالت مد نظر قرار داده می‌شود.

به طور مثال، برای نوشتن برنامه‌ای به منظور چک کردن سن کاربر دو احتمال پیش رو داریم بدین ترتیب که سن فرد بیشتر از 30 سال یا کمتر از آن می‌باشد و این در حالی است که در صورت تمایل به افزایش تعداد احتمالات، پیاده‌سازی برنامۀ مذکور با به‌کارگیری دستور switch راه‌کار مناسب‌تری به نظر می‌رسد.

به خاطر داشته باشید
برای پیاده‌سازی برنامه‌هایی که بیش از دو احتمال نیز در آن‌ها مطرح می‌شود می‌توان دستورات if و else را به کار گرفت اما چنین روشی در مقایسه با پیاده‌سازی با استفاده از دستور switch نیاز به کدنویسی بیشتری دارد و این در حالی است که یکی از وظایف برنامه‌نویسان حرفه‌ای انجام تَسک‌ها با تعداد خطوط کد کمتر می‌باشد.

اکنون برای درک بهتر کاربرد دستور switch سناریویی تعریف می‌کنیم که در آن می‌خواهیم برنامه‌ای بنویسیم تا عدد مربوط به ماه تولد کاربر را گرفته سپس نام ماه انتخابیِ وی را در خروجی نمایش دهد (برای مثال، در برخی از ثبت‌نام‌های اینترنتی نیاز است تا اطلاعاتی همچون تاریخ تولد و کد مربوط به شهر محل تولد خود را در فرمی وارد کنیم به طوری که در این فرم صرفاً مجاز به واردن کردن عدد مربوط به یکی از 12 ماه سال و انتخاب کد شهر مورد نظر هستیم که پس از پر کردن کلیۀ موارد مذکور، دکمۀ تأیید را زده و در نتیجه صفحه‌ای دیگر برای‌مان نمایش داده می‌شود که در آن نام ماه تولد و همچنین شهر محل تولد خود را مشاهده می‌کنیم.)

حال برای پیاده‌سازی سناریوی فوق، پروژۀ جدیدی به نام SwitchIntro در محیط برنامه‌نویسی اکلیپس ایجاد کرده و کلاسی تحت عنوان دلخواه MySwitchClass در آن می‌سازیم (به خاطر داشته باشیم که نام کلاس می‌باید با حرف اول بزرگ نوشته شود و اجازه نداریم تا از کاما، خط تیره و علائم مشابه دیگری در نام‌گذاری کلاس استفاده کنیم اما استفاده از _ بلامانع است. به علاوه، توجه داشته باشیم که در حین ساخت کلاس تیک گزینۀ public static void main را بزنیم.) پس از باز کردن فایل کلاسی که ایجاد کرده‌ایم، کلیۀ کامنت‌های پیش‌فرض را حذف کرده و در نهایت کدی مشابه کد زیر خواهیم داشت:

public class MySwitchClass {
    public static void main(String[] args) {
	
    }
}

در این مرحله به منظور فراهم کردن قابلیت دریافت دیتای ورودی از سمت کاربر نیاز است تا کلاسی تحت عنوان Scanner را در برنامۀ خود ایمپورت کنیم (جهت آشنایی بیشتر با این کلاس به آموزش معرفی کلاس Scanner در زبان برنامه‌نویسی جاوا مراجعه نمایید.) کد تکمیل‌شده در این مرحله از کار به شکل زیر خواهد بود:

import java.util.Scanner;
public class MySwitchClass {
	public static void main(String[] args) {
    	Scanner keyboardInput = new Scanner(System.in);
    }
}

در کد فوق، ابتدا کلاس Scanner را ایمپورت کرده و در سطر چهارم با به‌کارگیری کیورد new آبجکتی از روی کلاس مذکور ساخته و آن را به متغیری تحت عنوان keyboardInput منتسب می‌کنیم که با استفاده از دستور System.in نیز امکان دسترسی برنامه به بخش ورودی سیستم (محیط کنسول در آی‌دی‌ای اکلیپس) و همچنین دریافت ورودی از سمت کاربر را فراهم می‌کنیم. در ادامه استرینگی در کنسول چاپ می‌کنیم تا بدین طریق به کاربر اطلاع دهیم تا دیتای مد نظر را وارد برنامه کند و برای این منظور کد خود را به شکل زیر تکمیل می‌کنیم:

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter the number of your birth month: ");
    }
}

همان‌طور که مشاهده می‌کنیم، استرینگ «:Please enter the number of your birth month» را به عنوان ورودی به متد ()println داده‌ایم و با اجرای کد فوق استرینگ مربوطه در کنسول نمایش داده می‌شود. در ادامه، یکی از متدهای کلاس اسکنر که در آموزش نحوۀ تعریف نوع ورودی کلاس Scanner در زبان برنامه‌نویسی جاوا با آن‌ها آشنا شدیم را فرخوانی می‌نماییم تا متد مد نظر دیتای ورودیِ کاربر را خوانده و در خروجی ریترن کند سپس دیتای ریترن‌شده را به متغیری اختصاص می‌دهیم تا بدین ترتیب دستورات مورد نظر را روی دیتای دریافتی از کاربر اجرا نماییم.

بنابراین در این مرحله با استفاده از دیتا تایپ int متغیری تحت عنوان monthNumber تعریف کرده و متد ()nextInt را روی آبجکت ساخته‌شده از روی کلاس Scanner فراخوانی کرده و نتیجه را به متغیر مذکور منتسب می‌نماییم که بدین طریق امکان دریافت دیتای ورودی را به صورت دینامیک برای برنامه فراهم می‌کنیم و همچنین دیتای خوانده‌شده از ورودی نیز در متغیر monthNumber نگهداری می‌شود که برای این منظور کد فوق را به شکل زیر تکمیل می‌کنیم:

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter the number of your birth month: ");
        int monthNumber = keyboardInput.nextInt();
    }
}

نکتۀ قابل‌توجه هنگام فراخوانی متد ()nextInt روی آبجکت ساخته‌شده از روی کلاس Scanner تحت عنوان keyboardInput این است که پس از نام آبجکت با قرار دادن یک علامت . می‌بینیم که آی‌دی‌ای مورد نظر (در این آموزش آی‌دی‌ای اکلیپس) برخی از متدهای متعلق به کلاس Scanner را به منظور فراخوانی در برنامه پیشنهاد می‌دهد که بدین طریق می‌توانیم از میان متدهای پیشنهادی، متد مورد نیاز خود به نام ()nextInt را انتخاب نماییم (در صورت نیاز به وارد کردن دیتایی از جنس عدد اعشاری می‌باید از نوع دادۀ double برای تعریف متغیر مربوطه استفاده کرده و همچنین از میان گزینه‌های پیشنهادی در این مرحله متد ()nextDouble را انتخاب نماییم.)

حال نیاز به بررسی شرایط مختلف موجود در سناریوی خود داریم که برای این منظور دستور switch را مورد استفاده قرار می‌دهیم. در واقع، دستور switch ساختاری مشابه دستور if دارا است بدین صورت که در مقابل دستور switch علائم ( ) قرار داده شده و داخل آن‌ها نیز اِلِمانی نوشته می‌شود که به ازای هر یک از مقادیر منتسب به آن شرایط مختلفی در برنامه به وجود می‌آید سپس علامت‌های { } نوشته شده و در آن‌ها  دستوراتی پیاده‌سازی می‌گردند که به ازای هر یک از شرایط مختلف می‌باید اجرا شوند. بنابراین در این مرحله به منظور بررسی موارد مربوط به هر یک از ماه‌های سال، متغیر monthNumber را به عنوان اِلِمان مورد نظر داخل دستور switch می‌نویسیم چرا که این متغیر دیتای مربوط به عدد ورودی از سمت کاربر مبنی بر عدد ماه تولد وی را نگهداری می‌کند و از همین روی کد فوق را به صورت زیر تکمیل می‌نماییم:

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter the number of your birth month: ");
        int monthNumber = keyboardInput.nextInt();
        switch(monthNumber) {
        
        }
    }
}

حال مابین علامت‌های { } نوشته‌شده در مقابل دستور switch می‌باید مواردی را تعریف کنیم که بر اساس هر یک از آن‌ها نام ماه انتخابی مشخص‌ شده و در کنسول نمایش داده شود که برای این منظور از دستور case استفاده می‌کنیم. در واقع، نحوۀ عملکرد دستور case بدین صورت است که هر یک از شرایط احتمالی به وجود آمده در برنامه به ازای اِلِمان مرتبط با دستور switch را در مقابل آن نوشته و یک علامت : قرار داده سپس دستوراتی را می‌نویسیم که قصد داریم تا در صورت برقرار بودن شرط مورد نظر اجرا شوند و از همین روی کد فوق را به شکل زیر تکمیل می‌کنیم:

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter the number of your birth month: ");
        int monthNumber = keyboardInput.nextInt();
        switch (monthNumber) {
            case 1:
                System.out.println("You were born in Farvardin.");
                break;
        }
        keyboardInput.close();
    }
}

در کد فوق، مقداری معادل عدد 1 را در مقابل دستور case نوشته‌ و در آن  گفته‌ایم به ازای عدد 1 و منتسب به متغیر مذکور دستوری مبنی بر چاپ استرینگ «.You were born in Farvardin» اجرا شود بدین معنی که چنانچه مقدار منتسب به متغیر monthNumber برابر با عدد 1 باشد، استرینگ فوق در کنسول چاپ می‌گردد. همچنین در پایان هر یک از دستورات case نیز می‌باید از دستور break استفاده کنیم که در آموزش آتی با نحوۀ عملکرد آن آشنا خواهیم شد (توجه داشته باشیم که پس از کیورد case علامت : و پس از کیورد break نیز از علامت ; استفاده نموده‌ایم.)

در این مرحله به منظور بررسی کلیۀ ماه‌های سال، دستورات case برنامه را افزایش داده و در مقابل هر یک اعداد مختلفِ منتسب به متغیر monthNumber را قرار داده و در ادامه دستورات مرتبط با چاپ استرینگی به منظور نمایش نام ماه متناظر را درج می‌نماییم و در نهایت هم کدی به صورت زیر خواهیم داشت:

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter the number of your birth month: ");
	    int monthNumber = keyboardInput.nextInt();
	    switch (monthNumber) {
	        case 1:
	            System.out.println("You were born in Farvardin.");
	            break;
	        case 2:
	    	    System.out.println("You were born in Ordibehesht.");
	            break;
	        case 3:
	            System.out.println("You were born in Khordad.");
	            break;
	        case 4:
	    	    System.out.println("You were born in Tir.");
	            break;
	        case 5:
	            System.out.println("You were born in Mordad.");
	            break;
	        case 6:
	            System.out.println("You were born in Shahrivar.");
	            break;
	        case 7:
	            System.out.println("You were born in Mehr.");
	            break;
	        case 8:
	            System.out.println("You were born in Aban.");
	            break;
	        case 9:
	            System.out.println("You were born in Azar.");
	            break;
	        case 10:
                    System.out.println("You were born in Day.");
	            break;
	        case 11:
	    	    System.out.println("You were born in Bahman.");
	            break;
	        case 12:
	    	    System.out.println("You were born in Esfand.");
	            break;
	    }
        keyboardInput.close();
    }
}

همان‌طور که می‌بینیم، دستورات case را به تعداد ماه‌های سال نوشته و در ادامه دستوری را نوشته‌ایم که در صورت انتساب عدد متناظر به متغیر monthNumber اجرا می‌گردد و پس از هر case نیز یک دستور break قرار داده‌ایم. اکنون پروژۀ خود را اجرا کرده و عددی همچون 1 را به عنوان ورودی به آن می‌دهیم و در خروجی خواهیم داشت:

Please enter the number of your birth month: 1
You were born in Farvardin.

در واقع، با وارد کردن عدد 1 مقدار عددی مذکور به متغیر monthNumber منتسب شده و بدین ترتیب case 1 برقرار بوده و دستور مرتبط با آن اجرا می‌شود که از همین روی استرینگ فوق در کنسول به نمایش در می‌آید. حال برنامه را مجدداً اجرا کرده و این بار عدد 13 را به عنوان ورودی به آن می‌دهیم که در خروجی خواهیم داشت:

Please enter the number of your birth month: 13

همان‌طور که مشاهده می‌کنیم، با وارد کردن عددی غیر از اعداد مد نظر برای هر یک از کِیس‌های برنامه، هیچ استرینگی در کنسول نمایش داده نمی‌شود چرا که دستوری برای اجرا در چنین شرایطی تعریف نشده است.

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

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
Alireza nvمن یک کاربر مهمان هستم
۱۳۹۸/۰۴/۱۶
عالی بود ایشالا همیشه زنده باشید .
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۶/۰۹/۱۹
عالی بود
mahdis1994
mahdis1994
۱۳۹۵/۰۸/۲۶
سلام
ممنون از زحماتتون برای این آموزش
من یه سوالی داشتم ، من باید یک پروژه ای را انجام بدهم که در آن یک پایگاه داده در PL/SQL ساخته ام و باید با زبان جاوا UI بسازم و از طریق آن در پایگاه داده ذخیره کنم ؟ شما میتوانید منو راهنمایی کنید ؟
باتشکر
کاربر میهمان
سعیدمن یک کاربر مهمان هستم
۱۳۹۵/۰۸/۱۰
سلام. ممنون از اموزشتون.
در این برنامه ای که نوشتیم اگر کاربر عدد اعشاری یا کاراکتری وارد کنه برنامه crash میکنه؟ چطور میتونیم طوری بنویسیم که اگر اینطوری شد هم یک جوابی به کاربر بده جای اینکه crash کنه؟
javad
javad
۱۳۹۵/۰۳/۱۳
درود خداوند بر شما

واقعا خیلی کار درستین،خدا قوت
کاربر میهمان
مازیارمن یک کاربر مهمان هستم
۱۳۹۵/۰۳/۰۳
سلام میشه از این پروژه ها خروجی jar. گرفت یا exe. ممنون میشم اگه جواب بدید
javad
javad
۱۳۹۵/۰۲/۰۸
معذرت میخوام منظورم فایل های تمرین بود
تا یه جایی دانلود میشه بعد اخطار میده دوباره از اول شروع به دانلود میکنه
کاربر میهمان
mozhhمن یک کاربر مهمان هستم
۱۳۹۴/۱۲/۱۲
ممنون بابت توضیح خوبتان. من یه برنامه ای رو از یه سایت بردم توی netbeans اما این برنامه دارای چند تا import هستش چطور میتونم اون ها رو توی برنامه بیارم .ممنون از صبر ش شکیباییتون در خوندن و تو صبح سوال ها
کاربر میهمان
رضا شیخ زادهمن یک کاربر مهمان هستم
۱۳۹۴/۱۱/۱۹
سلام
بسیار عالی و مفید،امیدوارم همیشه موفق و پیروز باشید.
کاربر میهمان
کیوانمن یک کاربر مهمان هستم
۱۳۹۴/۱۰/۲۹
ممنون بابت پاسخ گویی اما من با فهمیدن این شک کردم که من زبان مد نظرم رو می خونم یا نه من هدفم از یادگیری این زبان استفاده از اون در موتور بازی سازی conturstract 2 هست. می خواستم ببینم شما اطلاعاتی دارین که این زبان درسته اون موتور یا نه یا اصلا از این زبان برای بازی سازی تو متور های دیگه استفاده میشه؟