در آموزشهای گذشته با کاربرد دستورات if
و else
آشنا شدیم و گفتیم که استفاده از این دستورات در برنامههایی مناسب است که دو احتمال در آنها مطرح باشد. حال در این آموزش به معرفی دستور دیگری تحت عنوان switch
میپردازیم که عملکردی مشابه دستور if
دارا است با این تفاوت که استفاده از آن در برنامههایی مناسب میباشد که نیاز به بررسی شرایط مختلف بوده و در فرآیند توسعۀ برنامۀ مد نظر احتمالاتی بیش از دو حالت مد نظر قرار داده میشود.
به طور مثال، برای نوشتن برنامهای به منظور چک کردن سن کاربر دو احتمال پیش رو داریم بدین ترتیب که سن فرد بیشتر از 30 سال یا کمتر از آن میباشد و این در حالی است که در صورت تمایل به افزایش تعداد احتمالات، پیادهسازی برنامۀ مذکور با بهکارگیری دستور switch
راهکار مناسبتری به نظر میرسد.
به خاطر داشته باشید |
برای پیادهسازی برنامههایی که بیش از دو احتمال نیز در آنها مطرح میشود میتوان دستورات if و else را به کار گرفت اما چنین روشی در مقایسه با پیادهسازی با استفاده از دستور 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
همانطور که مشاهده میکنیم، با وارد کردن عددی غیر از اعداد مد نظر برای هر یک از کِیسهای برنامه، هیچ استرینگی در کنسول نمایش داده نمیشود چرا که دستوری برای اجرا در چنین شرایطی تعریف نشده است.