در آموزشهای قبل با نحوۀ بهکارگیری دستور 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
را تشریح خواهیم کرد.