دستگرمی پنجم
دستگرمی این هفته:
برنامهی زیر چند حالت خروجی متفاوت میتواند داشته باشد؟
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
پاسخ:
پاسخ صحیح: 3
برای رسیدن به پاسخ، متد main را خط به خط بررسی میکنیم.
خط 4: یک مقدار boolean به صورت تصادفی تولید میشود و اگر مقدار تصادفیِ تولیدشده، true باشد، بلاک if و اگر false باشد، بلاک else اجرا میشود.
فرض کنید، مقدار تصادفی، true باشد. پس اجرای برنامه به خط 5 میرود.
خط 5: متغیر r1 ایجاد شده و مقداردهی میشود. در مقداردهی r1 باید به این نکته توجه داشت که متد ()rand و ()nextDouble، یک عدد تصادفی اعشاری بین 0 و 1 تولید میکنند.
خط 6: با توجه به توضیح فوق، مقدار r1 همواره مثبت خواهد بود و خط 7 اجرا خواهد شد.
خط 7: در خروجی، مقدار 1 نوشته میشود.
حال فرض کنید که مقدار تصادفیِ اولیه در خط 4، برابر با false باشد. در این صورت اجرای برنامه به خط 12 میرود.
خط 12: از آنجا که متد ()rand عددی بین 0 و 1 تولید میکند، مقدار متغیر rand، عددی اعشاری بین 10 تا 20 خواهد بود. مثلا 14.6 یا 16.3 یا …
خط 13: متغیر rand به int تبدیل میشود. در این فرآیند، عدد اعشار همواره به پایین گرد میشود. پس متغیر r1 برابر با 14 یا 16 یا … خواهد بود.
خط 14: با متد Math.round، عدد اعشار به نزدیکترین عدد صحیح گرد میشود. پس متغیر r2 برابر با 15 یا 16 یا … خواهد بود.
خط 15: r2 همواره کوچکرمساوی 20 است و همانطور که دیدیم، ممکن است گاهی r2 بزرگتر از r1 و گاهی هم برابر با r1 شود. بنابراین بسته به عدد تصادفیِ تولیدشده، هم بلاک if و هم بلاک else احتمال اجرا دارند. پس عدد 3 یا 4 هر دو ممکن است به عنوان خروجی در کنسول چاپ شوند.
پس سه مقدار 1، 2 و 3 ممکن است در خروجی چاپ شوند.
.
.
.
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers