به کاری گیری متغیر char در فرمان switch


در دو آموزش قبل، با نحوه ی به کاری گیری دستور switch آشنا شدیم. در این آموزش قصد داریم تا با به کاری گیری متغیر char در فرمان switch آشنا شویم. در واقع همان طور که در آموزش های پیشین عددی را وارد برنامه کردیم و بر اساس آن عدد جمله ای را در بخش کنسول به نمایش در آوردیم، در این آموزش قصد داریم تا با وارد کردن یک حرف یا کاراکتر این دستور را به برنامه خود بدهیم تا دستور خاصی را اجرا کند. در آموزش های پیشین ذکر شد که یکی از انواع متغیرها از نوع Primitive Type متغیر char می باشد که برای ذخیره سازی مقادیری همانند کاراکترها، علائم و غیره مورد استفاده قرار می گیرد. برای شروع کار پروژه ای تحت عنوان CharInSwitch ایجاد کرده و کلاسی به نام MySwitchClass می سازیم و به این شکل کار خود را آغاز می کنیم:

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

    }
}

توجه داشته باشیم که مقدار اختصاص داده شده به متغیر char بر خلاف کلاس String که مابین دو علامت " " قرار می گیرد، می بایست مابین دو علامت ' ' قرار گیرد. از سوی دیگر، برای مقدار این متغیر می توانیم از حروفی مثل G, b, z و یا علائمی همچون @, $ وغیره نیز استفاده کنیم (به خاطر داشته باشیم که به جای تعریف کردن مقدار متغیر char در خود برنامه، می توانیم از کلاس Scanner که در آموزش های پیشین به طور مفصل مورد بررسی قرار گرفت نیز استفاده کنیم تا از آن طریق بتوانیم به طور دینامیک مقدار متغیر را وارد برنامه کنیم اما در این آموزش به منظور جلوگیری از طولانی شدن بحث، از توضیح پیرامون جزئیات این کلاس خودداری خواهد شد و به علاقمندان برای کسب اطلاعات بیشتر پیرامون کلاس Scanner پیشنهاد می شود به آموزش معرفی کلاس اسکنر در زبان برنامه نویسی جاوا مراجعه نمایند.)

نکته

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

حال ببینیم که به کارگیری ترکیب دستوراتی همچون switch به همراه متغیری از جنس char چه کاربردی دارد. شاید بارها و بارها برای خیلی از ما پیش آمده باشد که خواسته باشیم به صورت آنلاین چیزی همچون یک بسته ی نرم افزاری خریداری نماییم. در واقع، جایی در فرمی که می بایست اطلاعات خود را تکمیل کنیم به منظور انتخاب نحوه ارسال کالا در نظر گرفته شده است که از شما می خواهد نحوه پست بسته سفارشی و همچنین نحوه پرداخت را مشخص کنید. به طور مثال می توان سه گزینه را در نظر گرفت که عبارتند از گزینه A و گزینه B و گزینه C. در حقیقت در توضیحات خرید آنلاین آمده است که اگر شما گزینه A را انتخاب کنید این بدان معنا است که "بسته پستی شما از طریق پست پیشتاز برای شما ارسال خواهد شد و مبلغ هم پس از تحویل کالا توسط پستچی دریافت خواهد شد". گزینه B بدان معنا است که "بسته پستی شما از طریق پست عادی ارسال خواهد شد و مبلغ هم پس از تحویل کالا توسط پستچی دریافت خواهد شد". در نهایت در توضیحات گزینه C آمده است که "شما می توانید به صورت آنلاین هزینه را پرداخت کرده و با دریافت لینک، نرم افزار مد نظر را دانلود نمایید".

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

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 \nand you have to pay to the postman.");
            break;
            case 'B' :
            System.out.println("You will get your package via ordinary mail \nand you have to pay to the postman.");
            break;
            case 'C' :
            System.out.println("You have to pay via Internet bank and \ndownload your software via Internet");
            break;
            default :
            System.out.println("Sorry, It seems that there is a problem,\nplease give it another try!");
            break;
        }
    }
}

اولین دستوری که در کد بالا به کامپیوتر می دهیم این است که

جمله ی ?Please choose which type of main would you like به معنی "لطفا مشخص کنید چه نوع پستی را تمایل دارید استفاده کنید؟" را در کنسول نمایش دهد. سپس یک Instance یا "نمونه ای" از کلاس Scanner تحت عنوان typeSelection به معنی "انتخاب نوع ارسال" ایجاد می کنیم. برای این که بتوانیم از طریق کیبورد سه حرف A, B, C را دریافت کنیم نیاز داریم تا متغیری از جنس char ایجاد کنیم. نام متغیر char را typeChosen به معنی "نوع انتخاب شده" می گذاریم و به جای آن که مقداری برای آن تعریف کنیم، دستور می دهیم تا هرآنچه کلاس Scanner از طریق کیبورد دریافت می دارد به متغیر ما به عنوان مقدار اختصاص یابد. برای این منظور پس از علامت = که مقابل نام متغیر char قرار دارد، نام شیئ از کلاس Scanner که قبلا ایجاد کرده بودیم را می نویسیم.

در ادامه، مقابل نام کلاس Scanner می بایست از دو متد دیگر استفاده کنیم. متد اول ()next نام دارد که این دستور را به برنامه می دهد تا ورودی از هر جنس را از کیبورد را دریافت کند. سپس نوبت به نوشتن متد دوم می رسد که ()charAt می باشد. در واقع کاری که این متد انجام می دهد این است که کاراکتری را در موقعیت مشخصی را دریافت کند. مثلاً اگر ورودی از کیبورد کاراکترهای ABCD باشد و متد (charAt(2 فرا خوانده شود، نرم افزار کاراکتر C را از میان دیگر کاراکترها برمی گزیند.

 هشدار
لازم به ذکر است که در دنیای برنامه نویسی همواره در حین شمارش -بر خلاف دنیای واقعی- اولین جایگاه به عدد "0" تعلق دارد و از همین رو است که وقتی عدد 2 را فرا می خوانیم به جای آن که کاراکتر B دریافت شود، کاراکتر C دریافت می شود چرا که جایگاه حرف اول که A می باشد 0 بوده، جایگاه حرف دوم که B می باشد 1 بوده، جایگاه حرف سوم که C می باشد 2 می باشد و الی آخر. خیلی از برنامه نویسان مبتدی در ابتدای راه برنامه نویسی گاها این اشتباه را می کنند که شمارش خود را در مواردی این چنین از عدد 1 آغاز می کنند و این مسئله در انجام پروژه ها برای ایشان مشکل زا می گردد.

در این برنامه که ما طراحی می کنیم می بایست متد (charAt(0 فرا خوانده شود چرا که ما نیاز داریم تا کاربر یک کاراکتر را وارد سازد و بالتبع اولین کاراکتری که کاربر وارد می سازد را کامپیوتر مد نظر قرار خواهد داد که جایگاهش برابر با 0 است. نکته ای که در اینجا می بایست مد نظر قرار داد این است که چنانچه کاربر کاراکتر مد نظر خود را با حرف بزرگ و یا کوچک بنویسد، برنامه حروف کوچک و بزرگ را به معانی مختلفی برای خود تفسیر می کند. به عبارت دیگر معنای کاراکتر A با معنا کاراکتر a فرق خواهد کرد و این در حالی است که برخی از کاربران ممکن است نوع سفارش خود را با حرف مثلاً B مشخص کنند و برخی دیگر با حرف b که در این صورت برنامه ما با مشکل مواجه خواهد شد (قبلا توضیح داده ایم که زبان برنامه نویسی جاوا Case Sensitive است یعنی به حروف بزرگ و کوچک حساس می باشد. پس باید این مشکل را با راه کاری حل کنیم.)

برای رفع این مشکل یک متغیر دیگر از جنس char تعریف کرده و نام آن را toUpperCase به معنی "تبدیل به حروف بزرگ" می گذاریم. در واقع با این کار، هر کاراکتری که کاربران وارد کنند چه حرف بزرگ باشد و چه حرف کوچک به حروف بزرگ تبدیل خواهند شد. برای تعیین مقدار این متغیر جدید از متد دیگری تحت عنوان ()Character.toUpperCase استفاده می کنیم. کاری که این متد انجام می دهد این است که هر پارامتری را که برای این متد داخل پرانتز قرار دهیم را به حرف بزرگ تبدیل می کند. برای ادامه نام متغیر اول خود که typeChosen بود را داخل پرانتز نوشته و متد ما به شکل (Character.toUpperCase(typeChosen در خواهد آمد (لازم به ذکر است متدی که کلیه کاراکتر ها را به حروف کوچک تبدیل می کند نیز ()Character.toLowerCase می باشد.)

به طور خلاصه، متغیر اول ما مقدار خود را از طریق کیبورد و با استفاده از کلاس Scanner دریافت می دارد سپس مقدار دریافتی خود را به متغیر دوم منتقل می کند که وظیفه آن تبدیل کاراکتر ها به حروف بزرگ می باشد. از این پس متغیر مورد استفاده ما در ادامه این برنامه متغیر دوم خواهد بود. در ادامه ی کدنویی این پروژه، یک switch تعریف کرده و پارامتر ورودی آن را متغیر دومی که ایجاد کردیم یا همان toUpperCase قرار می دهیم. از اینجای کار به بعد همانند آموزش پیشین خواهد بود یعنی به هر تعداد که بخواهیم شرط از نوع case ایجاد می کنیم و مقدار آن را داخل دو علامت ' ' قرار می دهیم سپس بعد از آن یک علامت : قرار می دهیم و در نهایت دستوری که می خواهیم در صورت true بودن شرط اجرا شود را نوشته و در نهایت دستور break را می نویسیم. سورس کد پروژه ی ما تا این مرحله، به شکل زیر خواهد بود:

case 'A':
System.out.println("Some action");
break;

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

عناوین :'case 'A و :'case 'B و :'case 'C ایجاد می کنیم. اکنون به برنامه ی خود دستور می دهیم که اگر شرط A صحیح بود جمله ی .You will get your package via express mail \nand you have to pay to the postman به معنی "شما بسته پستی خود را از طریق پست پیشتاز دریافت خواهید کرد و می بایست هزینه را به پستجی تحویل دهید." نمایش داده شود. اگر شرط B صحیح بود جمله ی .You will get your package via ordinary mail \nand you have to pay to the postman به معنی "شما بسته پستی خود را از طریق پست معمولی دریافت خواهید کرد و می بایست هزینه را به پستچی تحویل دهید."نمایش داده خواهد شد. در نهایت کاربر اگر گزینه C را انتخاب نماید جمله ی .You have to pay via Internet bank and \ndownload your software via Internet به معنی "شما می بایست از طریق اینترنت بانک پرداخت خود را انجام دهید و نرم افزار خود را نیز از طریق اینترنت دانلود نمایید." نمایش داده خواهد شد. همان طور که در  آموزش قبل توضیح داده شد، زمان هایی وجود دارد که کاربر گزینه ای نادرست وارد می کند مثلا به جای کاراکتر های تعریف شده A, B, C کاراکتر F را وارد می سازد و یا این بخش را کلاً خالی می گذارد که در این حالت می بایست دستور default را نیز مورد استفاده قرار داد تا در چنین مواقعی به کاربر اخطاری که تمایل داریم را منعکس کنیم برای همین منظور در بخش default جمله ی !Sorry, It seems that there is a problem,\nplease give it another try به معنی "ببخشید، به نظر می رسد که مشکلی رخ داده است، لطفاً مجدداً سعی نمایید!" به نمایش در آید. حال پس از اجرای برنامه تصویر زیر مشاهده خواهد شد:

با کلیک کردن در بخش کنسول و وارد کردن یکی از سه گزینه A, B, C برنامه دستور مناسب را اجرا خواهد کرد. به طور نمونه در این جا کاراکتر C را وارد می کنیم و نتیجه زیر مشاهده خواهد شد:

اگر به تصویر فوق با دقت نگاه کنید، مشاهده خواهید کرد که کاراکتر c به صورت کوچک نوشته شده است و این در حالی است که در شرط 'case 'C به برنامه خود دستور داده ایم که اگر کاراکتر ورودی حرف C بزرگ بود دستور مرتبط را اجرا کند. در اینجا است که به اهمیت متغیر دوم char که تعریف کردیم پی می بریم چرا که وظیفه این متغیر است تا کلیه ی کاراکتر ها را به حروف بزرگ تبدیل کند تا در این مرحله از برنامه ما به هیچ مشکلی بر نخوریم. ببینیم اگر کاراکتر تعریف نشده ای را وارد برنامه کنیم چه خروجی دریافت خواهیم کرد:

در واقع برنامه ما در این موقع به این شکل عمل می کند که اول سراغ شرط A می رود و می بیند که این شرط false است، سپس سراغ شرط B می رود و می بیند که باز هم نتیجه false است و در آخر به سراغ شرط C می رود که باز هم نتیجه false است. در این مرحله ما از قبل به برنامه خود دستور داده ایم که اگر هیچ کدام از شروط برآورده نشد به سراغ شرط default برود و آن را اجرا کند.

به عنوان آخرین نکته به این مطلب اشاره می کنیم که در کد خود در جملاتی که به عنوان خروجی شروط تعریف کردیم از عبارت n\ استفاده کردیم که همان طور که در جلسات پیشین توضیح داده شد وظیفه این دستور آن است که از جایی که قرار می گیرد به بعد را به خط بعد منتقل می کند و علت استفاده از این دستور صرفاً سهولت در مشاهده کل متن می باشد. در آموزش بعدی پیرامون ارتباط String با دستور switch بحث خواهیم کرد.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
majidمن یک کاربر مهمان هستم
تو این برنامه اگر بجای a از جمله abg یا از هر جمله که حرف اول مشابه باشد قبول میکند
چرا؟
alone rango
alone rango اندکی پایتون بلدم و در حال یادگیری جاوا برای اندروید
سلام و خسته نباشید
ببخشید این Character رو چرا در قسمت اپرکیس استفاده کردید؟ کارش چیه؟؟؟؟
hooman
hooman
واقعا ممنون بابت آموزشهاتون واقعا حرفه اییه ، اینکه در حین بعضی چیزها رو یاد آوری میکنین فوق العادس واقعا ممنونم.
کاربر میهمان
mahdighghمن یک کاربر مهمان هستم
با سلام، یه سوال فکرمو مشغول کرده...ا چرا در ادامه یcharای که ساختیم یه نقطه نزدیم و character.toUper() نزدیم و اومدیم یه char دیگه ساختیم؟اینی که گفتم امکانش هست؟چون کد رو هم کوتاه میکنه
کاربر میهمان
foroughمن یک کاربر مهمان هستم
tooye in barname charAt che karbordi dasht?
کاربر میهمان
aliمن یک کاربر مهمان هستم
با سلام . خسته نباشید.
من تونستم پرژه هایی که توی اموزش هاتون مثال زدید(مثل پرژه اسانسور-محاسبه ی وزن بر روی سایر سیارات-محاسبه ی در امد ماهیانه) رو بسازم.
و وقتی من این پرژه ها رو run میکنم فقط یه سری نوشته ها روی کنسول نمایش داده میشن .
ولی من نمیخام نوشته نمایش داده بشه من میخام نرم افزاری بسازم که بتونم توی گوشی خودم هم
تست بکنم.( مثل همه ی نرم افزار های دیگه).
منظور کلی من اینه که چرا نرم افزار هایی که توی محیط برنامه نویسی اکلیپس میسازم شبیه نرم افزار های دیگه نیست؟؟؟
کاربر میهمان
aliمن یک کاربر مهمان هستم
با سلام خسته نباشید.
آموزش های شما فوق العاده عالی هستند و ازتون بابت زحماتتون سپاس گذارم.
یه سوال داشتم:اگه ما تو محیط اکلیپس نرم افزار آندرویدی میسازیم پس چرا من نرم افزاری نمیبینم که ساخته باشم؟؟؟
Amin
Amin
با سلام ، تو خط ۶ : تا حالا همیشه از nextline استفاده کردیم اما اینجا از next !!
من هر ۲تا کد بالا آزمایش کردم و مشکلی هم نداشت
فرقشون چیه ؟
کاربر میهمان
puyaمن یک کاربر مهمان هستم
سلام. لطفاً در مورد هارد کودینگ توضیحات بیش تری ارائه بفرمایید. مطلب چندان واضح نیست.
bijan9
bijan9
مرسی