دستگرمی

دستگرمی پنجم

دستگرمی این هفته:

برنامه‌ی زیر چند حالت خروجی متفاوت می‎تواند داشته باشد؟

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

Loading ... Loading ...

پاسخ:

پاسخ صحیح:  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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا