دستگرمی پنجم

دستگرمی این هفته:
برنامهی زیر چند حالت خروجی متفاوت میتواند داشته باشد؟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class Generator { private static final Random random = new Random(); public static void main(String[] args) { if (random.nextBoolean()) { Integer r1 = new Integer((int) (rand() * 100 - random.nextDouble())); if (r1 >= -1) { System.out.println(1); } else { System.out.println(2); } } else { double rand = 10 + rand() * 10; long r1 = (int) rand; long r2 = Math.round(rand); if (r2 > r1 && r2 <= 20) System.out.println(3); else System.out.println(4); } } private static double rand() { return Math.random(); } } |
برنامه فوق، چند خروجی متفاوت میتواند داشته باشد؟
- 3 (43%, 3 رای)
- 4 (43%, 3 رای)
- 1 (14%, 1 رای)
- 2 (0%, 0 رای)
مجموع رای ها: 7

پاسخ:
پاسخ صحیح: ۳
برای رسیدن به پاسخ، متد main را خط به خط بررسی میکنیم.
خط ۴: یک مقدار boolean به صورت تصادفی تولید میشود و اگر مقدار تصادفیِ تولیدشده، true باشد، بلاک if و اگر false باشد، بلاک else اجرا میشود.
فرض کنید، مقدار تصادفی، true باشد. پس اجرای برنامه به خط ۵ میرود.
خط ۵: متغیر r1 ایجاد شده و مقداردهی میشود. در مقداردهی r1 باید به این نکته توجه داشت که متد ()rand و ()nextDouble، یک عدد تصادفی اعشاری بین ۰ و ۱ تولید میکنند.
خط ۶: با توجه به توضیح فوق، مقدار r1 همواره مثبت خواهد بود و خط ۷ اجرا خواهد شد.
خط ۷: در خروجی، مقدار ۱ نوشته میشود.
حال فرض کنید که مقدار تصادفیِ اولیه در خط ۴، برابر با false باشد. در این صورت اجرای برنامه به خط ۱۲ میرود.
خط ۱۲: از آنجا که متد ()rand عددی بین ۰ و ۱ تولید میکند، مقدار متغیر rand، عددی اعشاری بین ۱۰ تا ۲۰ خواهد بود. مثلا ۱۴٫۶ یا ۱۶٫۳ یا …
خط ۱۳: متغیر rand به int تبدیل میشود. در این فرآیند، عدد اعشار همواره به پایین گرد میشود. پس متغیر r1 برابر با ۱۴ یا ۱۶ یا … خواهد بود.
خط ۱۴: با متد Math.round، عدد اعشار به نزدیکترین عدد صحیح گرد میشود. پس متغیر r2 برابر با ۱۵ یا ۱۶ یا … خواهد بود.
خط ۱۵: r2 همواره کوچکرمساوی ۲۰ است و همانطور که دیدیم، ممکن است گاهی r2 بزرگتر از r1 و گاهی هم برابر با r1 شود. بنابراین بسته به عدد تصادفیِ تولیدشده، هم بلاک if و هم بلاک else احتمال اجرا دارند. پس عدد ۳ یا ۴ هر دو ممکن است به عنوان خروجی در کنسول چاپ شوند.
پس سه مقدار ۱، ۲ و ۳ ممکن است در خروجی چاپ شوند.
.
.
.
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers