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

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

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

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

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

حال برای پیاده‌سازی سناریوی فوق پروژه‌ای تحت عنوان CharInSwitch ایجاد کرده و کلاسی به نام MySwitchClass داخل آن می‌سازیم که در ابتدا کدی به صورت زیر خواهیم داشت:

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

    }
}

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

    نکته
Hard Code به معنای تعریف کردن برخی مقادیر به صورت دستی توسط دولوپر می‌باشد که انجام چنین کاری توصیه نمی‌شود چرا که در نرم‌افزارهای حرفه‌ای و بزرگ دست کاربر نهایی به منظور وارد کردن داده‌هایی از مقادیر مختلف را بسته و منجر بدین می‌گردد تا کاربران نرم‌افزار کنترل کاملی روی آن نداشته باشند به طوری که تغییر مقادیر هارد کد در پروژه صرفاً با تغییر سورس‌کد آن امکان‌پذیر می‌باشد. 

بنابراین در مرحلۀ اول به منظور نمایش استرینگی در قالب عبارت «انتخاب روش مورد نظر جهت ارسال بسته» در بخش کنسول، کد فوق را به صورت زیر تکمیل می‌کنیم:

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String args[]) {
        System.out.print("Please choose which type of mail would you like? ");  
    }
}

با اجرای کد فوق استرینگی مبنی بر «انتخاب روش مورد نظر به منظور ارسال بسته» در کنسول نمایش داده می‌شود و در ادامه می‌باید امکان دسترسی برنامه به بخش ورودی آی‌دی‌ای را فراهم کنیم که برای این منظور خواهیم داشت:

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String args[]) {
        System.out.print("Please choose which type of mail would you like? ");
        Scanner typeSelection = new Scanner(System.in);
    }
}

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

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String args[]) {
        System.out.print("Please choose which type of mail would you like? ");
        Scanner typeSelection = new Scanner(System.in);
        char typeChosen = typeSelection.next().charAt(0);
    }
}

در کد فوق، پس از نمایش استرینگی مبنی بر وارد کردن روش مورد نظر جهت دریافت بستۀ خریداری‌شده، امکان دسترسی به بخش ورودی را برای برنامه فراهم نمودیم و در ادامه با استفاده از دیتا تایپ char متغیری به نام typeChosen ایجاد کرده‌ایم که قرار است تا دیتای خوانده‌شده از ورودی را در آن نگهداری کنیم.

حال جهت خواندن دیتای ورودیِ کاربر متدی تحت عنوان ()next از کلاس Scanner فراخونی کرده‌ایم که در آموزش نحوۀ تعریف نوع ورودی کلاس Scanner در زبان برنامه‌نویسی جاوا این کلاس را معرفی کرده و گفتیم که هر نوع دادۀ ورودی را تا رسیدن به اولین کاراکتر اِسپیس خوانده و در خروجی ریترن می‌کند. به علاوه، در برنامۀ خود نیاز به خواندن تنها یک کاراکتر از دیتای ورودی داریم که برای این منظور به همراه متد ()next متد دیگری تحت عنوان ()charAt را فراخوانی می‌نماییم. نحوۀ عملکرد متد ()charAt بدین صورت است که یک آرگومان ورودی از نوع دادۀ int گرفته و کاراکتر مربوط به ایندکس مشخص‌شده در آرگومان ورودی را از استرینگ خوانده‌شده از ورودی دریافت کرده و آن را در خروجی ریترن می‌کند.

    هشدار 
در دنیای برنامه‌نویسی در حین شمارش مقادیر لیست، آرایه، کاراکترهای استرینگ و غیره همواره اولین جایگاه به عدد 0 تعلق می‌گیرد. 
برای مثال، چنانچه استرینگی همچون «ABCD» را از ورودی بخوانیم، فرخوانی متد (2)charAt منجر به ریترن شدن کاراکتر «C» و فراخوانی متد (0)charAt منجر به ریترن شدن کاراکتر «A» در خروجی می‌گردد.
حال با توجه به آنچه در بالا بدان اشاره کردیم، به منظور خواندن اولین کاراکتر از تمامی استرینگ‌های ورودی از سمت کاربر می‌باید متد ()charAt را با آرگومان ورودی 0 فراخوانی نماییم تا کاراکتر قرارگرفته در ایندکس 0 که مربوط به جایگاه کاراکتر اول است در خروجی ریترن شود و همان‌طور که در کد فوق می‌بینیم، متد ()charAt با آرگومان ورودی 0 به همراه متد ()next فراخوانی شده تا از میان تمامی استرینگ‌های خوانده‌شده توسط متد ()next اولین کاراکتر هر یک از استرینگ‌های مذکور در خروجی ریترن شده و در متغیر typeChosen نگهداری شود.

در این مرحله با توجه به اصطلاحاً Case Sensitive بودن زبان برنامه‌نویسی جاوا و همچنین به منظور جلوگیری از بروز مشکلات احتمالی مبنی بر بزرگ یا کوچک بودن کاراکترهای ورودی از سمت کاربر، نیاز به فراخوانی متدی تحت عنوان ()toUpperCase داریم که متعلق به کلاس String است که در آموزش آشنایی با متدهای مرتبط با کلاس String در زبان برنامه‌نویسی جاوا با این متد و نحوۀ کارکرد آن آشنا شدیم. در واقع، فراخوانی متد ()toUpperCase روی آبجکت مربوط به استرینگ ورودی منجر بدین می‌شود تا تمامی کاراکترهای استرینگ ورودی به حروف بزرگ تبدیل شده و در خروجی ریترن شوند. بنابراین متد مذکور را به صورت زیر در کد خود فراخوانی می‌نماییم:

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String args[]) {
        System.out.print("Please choose which type of mail would you like? ");
        Scanner typeSelection = new Scanner(System.in);
        char typeChosen = typeSelection.next().charAt(0);
        char toUpperCase = Character.toUpperCase(typeChosen);
    }
}

همان‌طور که پیش‌تر اشاره کردیم، با اجرای سطر ششم کاراکتر اول از تمامی استرینگ‌های ورودیِ کاربر در متغیر typeChosen نگهداری می‌شود. در ادامه، با استفاده از دیتا تایپ char متغیری تحت عنوان toUpperCase تعریف کرده‌ایم تا دیتای ریترن‌شده در نتیجۀ فراخوانی متد ()toUpperCase را در آن ذخیره کنیم.

در این مرحله به منظور تبدیل کاراکترهای خوانده‌شده از استرینگ‌های ورودیِ کاربر مجاز به استفاده از متد ()Character.toUpperCase متعلق به کلاس String هستیم که با دریافت یک آرگومان ورودی، کاراکتر منتسب به آرگومان ورودی را به حروف بزرگ تبدیل کرده و در خروجی ریترن می‌کند. بنابراین متد مذکور را با آرگومان ورودی معادل متغیر typeChosen فراخوانی کرده و آن را به متغیر toUpperCase اختصاص می‌دهیم تا کاراکترهای ذخیره‌شده در متغیر typeChosen به کاراکترهایی با حروف بزرگ تبدیل شده و در ادامه کاراکترهای ریترن‌شده از این متد به متغیر toUpperCase منتسب گردند.

تا به این مرحله از کار توانسته‌ایم تا دیتای ورودی از کاربر را دریافت کرده،‌ اولین کاراکتر از استرینگ ورودی را استخراج کرده، تمامی کاراکترها را به حروف بزرگ تبدیل کرده و در نهایت کاراکتر مذکور به متغیر toUpperCase منتسب شده است. در ادامه، با استفاده از دستور switch کاراکتر ورودی از کاربر و منتسب به متغیر toUpperCase را بررسی می‌نماییم تا شروط احتمالی به ازای هر یک از کاراکترهای مد نظر را تعریف کرده و دستورات مربوط به هر یک از شرایط پیش آمده را تعریف نماییم:

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String args[]) {
        System.out.print("Please choose which type of mail would you like? ");
        Scanner typeSelection = new Scanner(System.in);
        char typeChosen = typeSelection.next().charAt(0);
        char toUpperCase = Character.toUpperCase(typeChosen);
        switch (toUpperCase) {
            case 'A':
            	System.out.println("You will get your package via express mail and you have to pay to the postman.");
                break;
            case 'B':
            	System.out.println("You will get your package via ordinary mail and you have to pay to the postman.");
                break;
            case 'C':
                System.out.println("You have to pay via Internet bank and download your software via Internet.");
                break;
        }
        typeSelection.close();
    }
}

همان‌طور که مشاهده می‌کنیم، متغیر toUpperCase را به عنوان اِلِمان مد نظر جهت بررسی کاراکترهای مختلف منتسب به آن در دستور switch داخل علائم ( ) تعریف کرده‌ایم و در ادامه دستورات شرطی case را بدین صورت تعریف کرده‌ایم که کاراکترهای مختلف منتسب به متغیر toUpperCase را در مقابل هر یک از دستورات case نوشته و یک علامت : قرار داده و در ادامه دستوراتی را نوشته‌ايم كه قصد داريم تا در صورت برقرار بودن case مربوطه اجرا گردند (توجه داشته باشیم که مقدار اختصاص داده‌شده به متغیر toUpperCase از نوع كاراكتر بوده و می‌باید مابین علائم ' ' قرار گیرد و از همین روی هر یک از کاراکترهای مد نظر را مابین علائم ' ' در مقابل دستورهای case می‌نویسیم.)

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

در واقع، هر یک از کِیس‌های برنامه را بدین صورت تعریف کرده‌ایم که در صورت وارد کردن هر یک از کاراکترهای «B» ،«A» و «C» به ترتیب دستوراتی مبنی بر چاپ استرینگ‌های متناظر در کنسول اجرا شوند. بنابراین با اجرای برنامۀ فوق در خروجی خواهیم داشت:

Please choose which type of mail would you like? cbnMFS
You have to pay via Internet bank and download your software via Internet.

همان‌طور که می‌بینیم، استرینگی فرضی به صورت «cbnMFS» وارد کرده‌ایم که کاراکتر اول از این استرینگ به صورت «c» در ابتدا به متغیر typeChosen اختصاص داده می‌شود و در ادامه مقدار منتسب به متغیر مذکور به عنوان آرگومان ورودی به متد ()Character.toUpperCase داده شده و در نتیجه کاراکتری با حروف بزرگ به صورت «C» در خروجی ریترن شده و به متغیر toUpperCase منتسب می‌گردد. در مرحلۀ بعد دستور switch اجرا شده و هر یک از دستورات شرطی case بررسی می‌شوند تا اینکه مقدار منتسب به متغیر toUpperCase با مقدار درج‌شده در کِیس سوم برابر بوده و از همین روی دستورات مرتبط با آن اجرا شده و در نهایت استرینگ فوق در کنسول نمایش داده می‌شود. حال برنامۀ فوق را مجدداً اجرا کرده و استرینگی به صورت زیر را به عنوان ورودی به آن می‌دهیم و در خروجی خواهیم داشت:

Please choose which type of mail would you like? kSFMnb

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

import java.util.Scanner;
public class MySwitchClass {
    public static void main(String args[]) {
        System.out.print("Please choose which type of mail would you like? ");
        Scanner typeSelection = new Scanner(System.in);
        char typeChosen = typeSelection.next().charAt(0);
        char toUpperCase = Character.toUpperCase(typeChosen);
        switch (toUpperCase) {
            case 'A':
            	System.out.println("You will get your package via express mail and you have to pay to the postman.");
                break;
            case 'B':
            	System.out.println("You will get your package via ordinary mail and you have to pay to the postman.");
                break;
            case 'C':
                System.out.println("You have to pay via Internet bank and download your software via Internet.");
                break;
            default:
                System.out.println("Sorry, It seems that there is a problem, please give it another try!");
        }
        typeSelection.close();
    }
}

حال برنامۀ فوق را اجرا کرده و استرینگ «kSFMnb» را مجدداً به عنوان ورودی به برنامه می‌دهیم و در خروجی خواهیم داشت:

Please choose which type of mail would you like? kSFMnb
Sorry, It seems that there is a problem, please give it another try!

در واقع، کاراکتر «k» از استرینگ فوق به حرف بزرگ تبدیل شده سپس به متغیر toUpperCase منتسب می‌شود و در ادامه هر یک از کِیس‌های برنامه به ترتیب بررسی می‌شوند که کاراکتر درج‌شده در مقابل هیچ یک از آن‌ها برابر با کاراکتر «k» نبوده و از همین روی برابر با مقدار بولین false ارزیابی می‌شوند که در چنین شرایطی دستور مرتبط با default اجرا شده و استرینگ فوق در کنسول چاپ می‌گردد.

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

online-support-icon