آموزش دستور if else در جاوا
دستورات زیر را در نظر بگیرید:
if(quizScore == 10)
System.out.println("The score is perfect");
گاهی اوقات به دستورات بالا، دستور if یک جمله ای، گفته می شود؛ زیرا در این دستور if، تنها از یک جمله استفاده شده است. در این مثال، اگر که متغیر quizScore برابر با 10 شود، عبارت بین پرانتزهای دستور println نمایش داده می شود. اما اغلب برای دستور if، دو جمله در نظر گرفته می شود و می گوییم این دستور if، دو جمله ای است.از یک دستور if دو جمله ای وقتی استفاده می کنیم که بخواهیم دو کار را مورد بررسی قرار دهیم. به عنوان مثال، متغیر quizScore را در نظر بگیرید. می خواهیم که اگر این متغیر برابر با 10 باشد، یک پیغام نمایش داده شود، و اگر برابر با 10 نیست، یک پیغام دیگر نشان داده شود. برای انجام این کار، می توانیم از دستور if else استفاده کنیم؛ برای انجام این کار، یک شرط که مقادیر بولین تولید می کند را بین پرانتزهای این دستور قرار می دهیم. به این ترتیب، اگر ارزش شرط برابر با true شود، جمله ی اول اجرا می شود و اگر ارزش شرط برابر با false شود، جمله ی دوم اجرا می شود.
به تصویر 5.5 توجه کنید؛ در داخل کدهای مذکور، دو دستور که هرکدام پیامی را چاپ می کنند وجود دارد. در کدهای این تصویر، وقتی که متغیر quizScore برابر با 10 شود، پیام "The score is perfect" نمایش داده می شود. و در صورتی که مقداری دیگری در این متغیر قرار گرفته باشد، پیام "No, it's not" نشان داده می شود.
ما می توانیم در دستور if از دستور else استفاده نکنیم، اما نمی توانیم یک دستور else بدون if داشته باشیم.
فرو رفتگی کدهای درون تصویر 5.5 ضروری نیست؛ اما برای رعایت استاندارد و فهم بهتر کدها بهتر است آنها را ایجاد کنیم. برای انجام این کار، ابتدا کلمه های if و else را به طور عمودی تراز کنید، سپس برای جمله ها، نسبت به این کلمات، تو رفتگی ایجاد کنید.
وقتی که یک دستور if else را اجرا می کنیم، بر اساس ارزیابی عبارت بولین، که در بین پرانتزهای if قرار می گیرد، یکی از جمله ها اجرا می شود. به یاد داشته باشید که باید در پایان جمله های دستور if از یک سمی کالن(;) استفاده کنید.
استفاده از چندین جمله یا عبارت در دستور if یا if else
اغلب در برنامه نویسی نیاز پیدا می کنیم که به هنگام ارزیابی یک عبارت بولین(یعنی شرط داخل پرانتز if) چندین دستور مورد بررسی قرار بگیرند. به عنوان مثال، ممکن است بخواهیم چند عبارت را در یک دستور if چاپ کنیم، و یا اینکه چند محاسبه ی ریاضی انجام دهیم. به منظور اجرای بیش از یک دستور از طریق ارزیابی یک شرط بولین(یعنی true و false) در یک دستور if، می توانیم از یک جفت آکولاد در جلو یا زیر این دستور استفاده کنیم، که به آن یک بلوک گفته می شود؛ سپس می توانیم دستورات خود را، به هر تعداد که باشند، در داخل آکولادها قرار دهیم.
به عنوان مثال قطعه کد نشان داده شده در تصویر 5.6 بررسی می شود که آیا ساعات کار یک کارمند، بیش از یک مقدار ثابت به نام FULL_WEEK است یا نه. سپس با توجه به این، حقوق اصلی(regularPay) و حقوق دورکاری(overtimePay) او را محاسبه می کند.
در تصویر 5.6 مشاهده می کنید که، اگر که متغیر hoursWorked که ساعات کار را در خود نگهداری می کند، کمتر از مقدار FULL_WEEK باشد، هیچ اتفاقی نمی افتد؛ زیرا هیچ دستوری برای آن تعریف نکرده ایم.
وقتی که ما در داخل یک دستور if، یک بلوک(یک جفت آکولاد) قرار می دهیم، حتما باید دقت کنیم که این آکولاد ها را به درستی قرار دهیم. به عنوان مثال، در تصویر 5.7 هیچ آکولادی برای دستور if قرار داده نشده است. از این رو، وقتی که در کدهای تصویر 5.7، ارزش عبارت hoursWorked > FULL_WEEK برابر با true شود، مقدار regularPay مورد محاسبه قرار می گیرد و دستور if پایان می یابد.و هر بار که برنامه اجرا می شود، عبارت دومی که مقدار overtimePay را محاسبه می کند، بدون توجه به اینکه چه مقداری در hoursWorked ذخیره شده است، اجرا می شود. این عبارت(یعنی عبارت دومی)، به دستور if هیچ وابستگی ندارد و یک عبارت مستقل محسوب می شود.
همان طور که در تصویر 5.7 مشاهده می کنید، تو رفتگی های کدها، ممکن است فریب دهنده باشد. این طور به نظر می رسد که هردوی عبارت ها به دستور if وابسته هستند؛ اما تو رفتگی ها فقط جنبه ی نمایشی دارند و تاثیری در وابستگی به دستور if ندارند. پس اگر که بخواهیم این مشکل را حل کنیم، می توانیم از آکولادها استفاده کنیم؛ به منظور استفاده از چندین دستور در داخل دستور if، حتما باید از یک جفت آکولاد استفاده کنیم. وقتی که ما یک بلوک(یک جفت آکولاد) ایجاد می کنیم، حتما مجبور نیستیم که در داخل آن چندین دستور قرار دهیم. استفاده از یک جفت آکولاد، که در داخل آن فقط یک دستور قرار گیرد، کاملا قانونی و مرسوم است.
توضح شماره های تصویر 5.7:
- شماره 1: این کار صحیح نیست، زیرا دستور if در اینجا پایان می یابد.
- شماره 2: این تو رفتگی، توسط کامپایلر نادیده گرفته می شود.
- شماره 3: این کار صحیح نیست. زیرا متغیر hoursWorked هر مقداری داشته باشد، محاسبه ی دور کاری(overtime)، همواره انجام می شود.
به دلیل اینکه در دستور if در تصویر 5.7 از هیچ آکولادی استفاده نکرده ایم، آخرین عبارت در این تصویر، یک عبارت مستقل محسوب می شود و جزوی از if نمی باشد و به همین دلیل، همواره (با اجرای برنامه) اجرا می شود؛ و به اینکه متغیر hoursWorked بیشتر از FULL_WEEK است یا نه، بستگی ندارد. به عنوان مثال، اگر متغیر hoursWorked برابر با 30 و متغیر FULL_WEEK برابر با 40 باشد، برنامه ی ما مقدار متغیر overtimePay را به صورت یک عدد منفی محاسبه می کند(زیرا 30 منهای 40 می شود، منفی 10). بنابراین خروجی ما اشتباه به دست می آید. از این رو، برای به دست آوردن خروجی صحیح، باید از آکولادها استفاده کنیم.
همان طور که می توانیم برای دستور if، از یک جفت آکولاد استفاده کنیم، می توانیم در جلوی دستور else هم یک جفت آکولاد باز کنیم. تصویر 5.8 برنامه ای را نشان می دهد که یک دستور if و else دارد، به طوری در داخل آکولادهای هرکدام از آنها، دو دستور اجرایی وجود دارد. دستوری که تقریبا در انتهای تصویر 5.8 قرار گرفته است، یعنی عبارت حاوی تابع ()println است، بدون توجه به مقدار متغیر hoursWorked، اجرا می شود و به دستور if تعلق ندارد. در تصویر 5.9، این برنامه دو بار اجرا شده است و خروجی آن نشان داده شده است. در اجرای اول، کاربر برای متغیر hoursWorked مقدار 39 و برای متغیر rate مقدار 20.00 را وارد کرده است. در اجرای دوم برنامه، کاربر برای متغیر hoursWorked مقدار 42 و برای متغیر rate مقدار 20.00 را وارد کرده است.
وقتی که ما عبارت های دستوری را در داخل بلوک ها یعنی همان آکولادها قرار می دهیم، باید به خاطر داشته باشیم که، هر متغیری که در داخل یک بلوک قرار گیرد، متغیر محلیِ آن بلوک محسوب می شود. به عنوان مثال، در کدهای زیر، یک متغیر به نام sum وجود دارد که یک متغیر محلیِ بلوک جلوی if محسوب می شود. از این رو، به دلیل اینکه عبارت آخر که حاوی متد ()println است، جزو بلوک if نیست، یک خطا یا error ایجاد می شود. زیرا در این خط کد، متغیری به نام sum تعریف نشده است.
- نوشته شده توسط احسان عباسی
- بازدید: 3268
دیدگاهها
واقعا ممنونم بابت ادامه این آموزش عالی. خیلی حیف بود که همچین کتابی توسط تیم خوب بیاموز ترجمه نشه.
آقای عباسی عزیز تشکر.
خواهش می کنم. باعث خوشحالی بنده هست که این آموزش ها مفید واقع شده.