آموزش جاوا (فصل ۵)

معرفی دستور 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

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

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


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

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 بدین صورت است که مقدار منتسب به متغیر مرتبط با دستورswitch به ترتیب با مقدار درج‌شده در مقابل هر یک از دستورهای case مقایسه شده و دستور مرتبط با اولین کِیسی اجرا می‌شود که مقدار درج‌شده در مقابل آن با مقدار منتسب به متغیر مرتبط با دستور switch برابری داشته باشد و بدین ترتیب دستور break مربوط به case متناظر نیز اجرا شده و برنامه از دستور شرطی switch خارج می‌گردد.

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

حال فرض کنیم که عدد 7 را به عنوان ورودی به برنامه می‌دهیم که در این صورت اولین کِیس بررسی می‌شود که آیا عدد درج‌شده در مقابل آن با عدد 7 برابر است یا خیر که شرط برقرار نبوده و بدین ترتیب هر یک از کِیس‌های بعدی نیز چک می‌شوند تا زمانی که عدد نوشته‌شده در مقابل کِیس هفتم با مقدار منتسب به متغیر monthNumber برابر بوده و بدین ترتیب دستور مرتبط با آن مبنی بر چاپ استرینگ «.You were born in Mehr» اجرا می‌گردد. بنابراین می‌توان گفت که به‌کارگیری دستور break در پایان هر case منجر بدین می‌شود تا در صورت برقرار بودن یکی از کِیس‌ها، از اجرای سایر کِیس‌های مطرح‌شده جلوگیری به عمل آید.

اکنون دستورات break در پایان هر case را کامنت کرده و مجدد برنامه را اجرا می‌کنیم تا ببینیم خروجی حاصل از اجرای چنین برنامه‌ای چه خواهد بود:

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();
    }
}

همان‌طور که در آموزش‌های پیشین توضیح داده شد، برای کامنت کردن بخشی از کد نشانگر ماوس را روی خط مد نظر قرار داده و دکمه‌های / + Ctrl را به صورت هم‌زمان فشار می‌دهیم. در این مرحله مجدداً برنامه را اجرا می‌کنیم و عددی دلخواه را از میان اعداد 1 تا 12 وارد برنامه می‌نماییم که نتیجۀ حاصل از آن به صورت زیر خواهد بود:

Please enter the number of your birth month: 1
You were born in Farvardin.
You were born in Ordibehesht.
You were born in Khordad.
You were born in Tir.
You were born in Mordad.
You were born in Shahrivar.
You were born in Mehr.
You were born in Aban.
You were born in Azar.
You were born in Day.
You were born in Bahman.
You were born in Esfand.

در واقع، بدون استفاده از دستورات break برنامه هیچ مانعی برای اجرای دستورات مرتبط با تمامی کِیس‌ها نداشته و از همین روی دستورات مربوط به تمامی موارد یکی پس از دیگری اجرا می‌شوند. برای مثال، اگر عدد 12 را به عنوان ورودی به برنامه بدهیم تمامی دستورات بعد از آن نیز اجرا می‌شوند اما case مرتبط با عدد 12 آخرین مورد مطرح‌شده در برنامه بوده و صرفاً دستور مربوط به آن اجرا می‌گردد. به عنوان مثالی دیگر، اگر فرض کنیم مقدار ورودی را معادل عدد 10 در نظر بگیریم، برنامه مستقیماً به سراغ case 10 رفته و دستورات مرتبط با کِیس مذکور و همچنین کلیۀ دستورات پس از آن را نیز اجرا می‌کند به طوری که در خروجی خواهیم داشت:

You were born in Day.
You were born in Bahman.
You were born in Esfand.

همان‌طور که مشاهده می‌کنیم، دستور مرتبط با case 10 و همچنین تمامی کِیس‌های نوشته‌شده پس از آن اجرا شده و استرینگ‌های مربوطه در کنسول چاپ شده‌اند.

آشنایی با کاربرد دستور default

در آموزش گذشته اشاره کردیم که وارد کردن عددی همچون 13 به برنامه منجر به چاپ هیچ استرینگی در خروجی نمی‌گردد چرا که چنین شرایطی در سورس‌کد مربوطه پیاده‌سازی نشده و از همین روی دستوری به ازای مقدار ورودی 13 اجرا نمی‌شود که برای رفع این مشکل دستوری تحت عنوان default را در ادامه معرفی می‌نماییم.

دستور default حاکی از آن است که در صورت بروز شرایطی به غیر از شروط مطرح‌شده در تمامی کِیس‌های برنامه، می‌باید دستور مرتبط با default اجرا شود. بنابراین با آگاهی از کاربرد این دستور، به تکمیل کد فوق می‌پردازیم تا بدین طریق برنامۀ مذکور در صورت دریافت اعدادی به غیر از 1 تا 12 بتواند دستوری پیش‌فرض را اجرا کند و استرینگی با مضمون «اشتباه بودن عدد ورودی» در کنسول نمایش داده شود که برای این منظور کدی مانند زیر خواهیم داشت:

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;
	        default:
	        	System.out.println("You made a mistake!");
	    }
        keyboardInput.close();
    }
}

پس از اجرای کد فوق و وارد کردن عددی به غیر از اعداد 1 تا 12، هیچ یک از شروط مرتبط با کِیس‌های برنامه برقرار نبوده و از همین روی دستور مرتبط با default اجرا می‌شود و توجه داشته باشیم که دستور break در انتهای دستورdefault نوشته نمی‌شود چرا که به هر حال default آخرین دستور نوشته‌شده در برنامه بوده و پس از اجرای آن نیز مفسر از دستور switch خارج می‌گردد. حال برنامۀ فوق را اجرا کرده و خروجی حاصل از آن به صورت زیر خواهد بود:

Please enter the number of your birth month: 13
You made a mistake!

به عنوان نکتهٔ پایانی، به دانشجویان پیشنهاد می‌کنیم که تا حد ممکن از کپی کردن کدها از داخل آموزش خودداری نموده و سعی کنند تا برنامه را به صورت دستی در محیط اکلیپس بنویسند چرا که با این کار هم مهارت سریع تایپ کردن خود را بهبود بخشیده و در ضمن راحت‌تر به منطق پشت هر خط از کد پی می‌برند.
 آموزش قبلآموزش بعد 

به‌کارگیری دستور switch در پروژۀ دریافت دیتایی با دیتا تایپ char در زبان جاوا


در آموزش‌های قبل با نحوۀ به‌کارگیری دستور switch آشنا شدیم و دیدیم که چگونه می‌توان مقداری با نوع دادۀ intیا عدد صحیح را به عنوان شروط برنامه تعریف کرده و به ازای هر یک از مقادیر مختلفِ منتسب به متغیر مد نظر، دستورات خاصی را اجرا نمود. حال در این آموزش قصد داریم تا با به‌کارگیری دستور switch پروژه‌ای به منظور دریافت دیتایی از جنس char تعریف کرده و بدین طریق برنامۀ مد نظر به ازای هر یک از کاراکترهای مختلفِ ورودی از سمت کاربر دستورات خاصی را اجرا کرده و در خروجی چاپ کند.

در آموزش آشنایی با روش‌های نام‌گذاری متغیرها در زبان برنامه‌نویسی جاوا برخی دیتا تایپ‌های رایج در این زبان را معرفی کرده و گفتیم که یکی از انواع دادۀ به اصطلاح Primitive Type دیتا تایپ char می‌باشد که به منظور ذخیره‌سازی مقادیری همچون کاراکترها، علائم و غیره مورد استفاده قرار می‌گیرد و از همین روی نوع دادۀ char را جهت پیاده‌سازی برنامۀ خود انتخاب کرده و سناریویی بدین صورت تعریف می‌نماییم که در آن قصد داریم تا یک بستۀ نرم‌افزاری را به صورت آنلاین خریداری کنیم و در ادامه جهت پرداخت هزینۀ بسته و همچنین نحوۀ ارسال کالا سه گزینه را در فرم مربوط به وب‌سایت مد نظر پیش رو داریم که عبارتند از:

– گزینۀ A: انتخاب این گزینه بدین معنا است که بستۀ مربوطه از طریق پست پیشتاز ارسال شده و پرداخت مبلغ آن نیز توسط پست‌چی پس از تحویل کالا انجام می‌شود.
– گزینۀ B: انتخاب این گزینه بدین معنا است که بستۀ مربوطه از طریق پست عادی ارسال شده و پرداخت مبلغ آن نیز توسط پست‌چی پس از تحویل کالا انجام می‌شود.
– گزینۀ C: انتخاب این گزینه نیز به معنای تمایل به دانلود نرم‌افزار مد نظر و پرداخت هزینۀ آن به صورت آنلاین می‌باشد.این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

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

به‌کارگیری دستور switch در پروژۀ دریافت دیتایی با دیتا تایپ String در زبان جاوا


در آموزش گذشته به پیاده‌سازی پروژه‌ای به منظور دریافت دیتایی از نوع دادۀ char پرداختیم و با استفاده از دستورswitch دستورات مختلفی را به ازای دریافت کاراکترهای متفاوتی تعریف نمودیم اما در این آموزش قصد داریم تا پروژۀ جدیدی جهت دریافت دیتایی از نوع استرینگ تعریف کرده و ببینیم که چگونه می‌توان با به‌کارگیری دستور switchشرایط متفاوتی را در برنامه تعریف کرد تا به ازای دریافت استرینگ‌های مد نظر، دستورات خاصی در برنامه اجرا شوند.

در همین راستا و به منظور درک بهتر مطالب آموزشی، سناریویی را مد نظر قرار می‌دهیم که طی آن استرینگ مربوط به نام شهر را از ورودی دریافت کرده و با بررسی نام شهرهای تعریف‌شده، دستوری متناسب با نام شهر مذکور مبنی بر نمایش پیش‌شمارۀ آن شهر در کنسول را اجرا کند.

نکته‌ای که پیش از شروع آموزش می‌باید حتماً مد نظر قرار دهیم این است که به‌کارگیری داده‌ای از جنس استرینگ‌ در دستور switch از نسخۀ 7 به بعد در زبان برنامه‌نویسی جاوا امکان‌پذیر شده است و از همین روی برای پیاده‌سازی پروژۀ مورد نظر ابتدا نیاز داریم تا نسخۀ جاوای نصب‌شده روی سیستم خود را چک کنیم که برای این منظور دستور زیر را در ترمینال وارد می‌کنیم:

$ java -version

حال اگر شمارۀ مربوط به نسخۀ جاوای نصب‌شده روی سیستم پایین‌تر از 7 بود، می‌توانیم آخرین نسخۀ ارائه‌شده از جاوا را دانلود کرده و با مراجعه به آموزش ابزارهای برنامه‌نویسی با زبان جاوا آن را روی سیستم خود نصب نماییم.

برای شروع، پروژه‌ای به نام StrInSwitch ساخته و کلاسی تحت عنوان CityCode در آن ایجاد می‌کنیم. حال برای آنکه بتوانیم به صورت دینامیک مقادیر استرینگ را وارد برنامه کنیم، می‌باید از کلاس Scanner استفاده نماییم که از همین روی کلاس مذکور را به صورت زیر در برنامۀ خود ایمپورت کرده و با به‌کارگیریِ کیورد new آبجکتی جدید از روی آن می‌سازیم:

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

در کد فوق، یک آبجکت از روی کلاس Scanner تحت عنوان keyboardInput ایجاد کرده و با استفاده از دستورSystem.in امکان دسترسی برنامه به بخش ورودی آی‌دی‌ای را فراهم کرده‌ایم و در ادامه متد از پیش تعریف‌شدۀ()next که متعلق به کلاس Scanner است را روی آبجکت ساخته‌شده فراخوانی می‌کنیم تا بتوانیم دیتای ورودی از کاربر را بخوانیم. در سطر بعد، با استفاده از کلاس String آبجکتی جدید تحت عنوان cityName ساخته و نتیجۀ حاصل از فراخوانی متد ()next روی متغیر keyboardInput را بدان منتسب می‌کنیم تا دیتای ریترن‌شده در نتیجۀ این فراخوانی در آبجکت cityName نگهداری شود.

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

import java.util.Scanner;
public class CityCode {
    public static void main(String[] args) {
        System.out.print("Please Type the Name of the City: ");
        Scanner keyboardInput = new Scanner(System.in);
        String cityName = keyboardInput.next();
        switch (cityName) {
            case "mashhad":
                System.out.println("Mashhad Code Is 051");
                break;
            case "arak":
                System.out.println("Arak Code Is 086");
                break;
            case "abadan":
                System.out.println("Abadan Code Is 061");
                break;
            case "tehran":
                System.out.println("Tehran Code Is 021");
                break;
            case "amol":
                System.out.println("Amol Code Is 011");
                break;
            case "chabahar":
                System.out.println("Chabahar Code Is 054");
                break;
            case "sanandaj":
                System.out.println("Sanandaj Code Is 087");
                break;
            default:
                System.out.println("Sorry, This City Is Not Defined!");
        }
        keyboardInput.close();
    }
}

در حقیقت، از آنجایی که می‌خواهیم تا دستور switch مقدار منتسب به آبجکت ساخته‌شده از روی کلاس String را مورد سنجش قرار دهد، می‌باید داخل پرانتز مقابل switch نام متغیر مذکور یا cityName را وارد کنیم و بدین ترتیب هر یک از کِیس‌های مطرح‌شده در برنامه بررسی شده و اولین کِیسی که استرینگ درج‌شده در مقابل آن با استرینگ منتسب به cityName برابر باشد، معادل مقدار بولین true ارزیابی شده و دستور مرتبط با آن اجرا می‌گردد (توجه داشته باشیم که برخلاف نوع دادۀ char مقادیری با دیتا تایپ String داخل علائم " " در مقابل دستور caseنوشته شده‌اند.)

در عین حال، چنانچه هیچ یک از کِیس‌ها برابر با مقدار بولین true ارزیابی نشوند (مقدار استرینگ منتسب به متغیر cityName با هیچ یک از استرینگ‌های نوشته‌شده در مقابل دستورهای case برابر نباشد.)‌ دستور defaultاجرا شده و استرینگی مبنی بر «تعریف‌نشده بودن شهر مورد نظر» در کنسول چاپ می‌شود. حال برنامۀ فوق را اجرا می‌کنیم به طوری که در خروجی خواهیم داشت:

Please Type the Name of the City: arak
Arak Code Is 086

با اجرای برنامۀ فوق و وارد کردن استرینگی به صورت «arak» با حروف کوچک، استرینگ مذکور به cityName اختصاص داده شده و در ادامه هر یک از دستورهای case بررسی می‌شوند تا اینکه استرینگ نوشته‌شده در مقابل کِیس دوم با استرینگ منتسب به آبجکت مذکور برابر بوده و دستور شرطی "case "arak برابر با مقدار بولین true ارزیابی شده و از همین روی دستورات داخلی آن اجرا می‌شوند که در نتیجه استرینگ فوق در خروجی چاپ می‌شود و با اجرای دستورbreak نیز مفسر از دستور switch خارج می‌گردد. حال استرینگ مربوط به نام این شهر را به صورت «Arak» با حرف اول بزرگ وارد برنامه می‌کنیم و در خروجی خواهیم داشت:

Please Type the Name of the City: Arak
Sorry, This City Is Not Defined!

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

در همین راستا، متد ()toLowerCase را روی آبجکت ساخته‌شده از کلاس String به نام cityName فراخوانی می‌کنیم چرا که آبجکت cityName استرینگ مربوط به نام شهر دریافت‌شده از ورودی را نگهداری کرده و فراخوانی این متد روی آبجکت مذکور منجر بدین می‌گردد تا تمامی کاراکترهای مربوط به استرینگ نام شهر به حروف کوچک تبدیل شوند. برای پیاده‌سازی این فیچر، کد فوق را به صورت زیر ریفکتور می‌کنیم:

import java.util.Scanner;
public class CityCode {
    public static void main(String[] args) {
        System.out.print("Please Type the Name of the City: ");
        Scanner keyboardInput = new Scanner(System.in);
        String cityName = keyboardInput.next();
        cityName = cityName.toLowerCase();
        switch (cityName) {
            case "mashhad":
                System.out.println("Mashhad Code Is 051");
                break;
            case "arak":
                System.out.println("Arak Code Is 086");
                break;
            case "abadan":
                System.out.println("Abadan Code Is 061");
                break;
            case "tehran":
                System.out.println("Tehran Code Is 021");
                break;
            case "amol":
                System.out.println("Amol Code Is 011");
                break;
            case "chabahar":
                System.out.println("Chabahar Code Is 054");
                break;
            case "sanandaj":
                System.out.println("Sanandaj Code Is 087");
                break;
            default:
                System.out.println("Sorry, This City Is Not Defined!");
        }
        keyboardInput.close();
    }
}

در کد فوق، متد ()toLowerCase را روی آبجکت cityName فراخوانی کرده و استرینگ ذخیره‌شده در آن را به استرینگی با کاراکترهای کوچک تبدیل کرده و در سطر بعد نتیجۀ ریترن‌شده از فراخوانی متد مذکور را مجدداً به آبجکت cityName منتسب می‌کنیم و بدین ترتیب مقدار جدید (استرینگی با کاراکترهای کوچک) جایگزین مقدار قبلیِ منتسب به آبجکت مذکور می‌شود. در ادامه مشابه آنچه که پیش‌تر توضیح دادیم، هر یک از کِیس‌های مطرح‌شده در برنامه بررسی شده و کِیسی که استرینگ درج‌شده در مقابل آن با استرینگ منتسب به آبجکت cityName برابر باشد، برقرار بوده و دستور مرتبط با آن اجرا می‌شود. به عنوان مثالی دیگر، استرینگ مربوط به نام شهر «chaBaHaR» را وارد برنامه می‌کنیم و در خروجی خواهیم داشت:

Please Type the Name of the City: chaBaHaR
Chabahar Code Is 054

با اجرای برنامۀ فوق، استرینگ «chaBaHaR» به آبجکت cityName منتسب شده و فراخوانی متد ()toLowerCaseروی این آبجکت منجر بدین می‌گردد تا استرینگ جدیدی به صورت «chabahar» به آبجکت cityName منتسب شده و مقدار قبلی آن پاک شود. در ادامه، هر یک از شرط‌های case بررسی شده و کِیس ششم برابر با مقدار بولین trueارزیابی شده و دستورات داخلی آن اجرا می‌گردد که در نتیجه استرینگ مربوط به پیش‌شمارۀ شهر چابهار در خروجی چاپ شده و با اجرای دستور break در پایان این کِیس نیز مفسر از دستور switch خارج می‌گردد.

حال برنامۀ فوق را مجدداً اجرا می‌کنیم و این بار استرینگ مربوط به نام شهری به غیر از استرینگ‌های تعریف‌شده در شروط case را وارد برنامه می‌نماییم که در خروجی خواهیم داشت:

Please Type the Name of the City: yazd
Sorry, This City Is Not Defined!

همان‌طور که مشاهده می‌کنیم، با اجرای برنامۀ فوق هیچ یک از کِیس‌های تعریف‌شده در برنامه برقرار نبوده و از همین روی دستور default اجرا شده و منجر به چاپ استرینگ فوق در بخش کنسول می‌گردد. دانلود فایل‌های تمرین

مطالب مرتبط

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *