آموزش برنامه نویسی جاوا - قسمت ۲۶: ایجاد یک شماره تصادفی در پروژه برادر بد شانس
سه شنبه 1 بهمن 1392 8:15 AM
در این جلسه قصد داریم تا نحوه به کار گیری کلاس Random در زبان برنامه نویسی جاوا را مورد بررسی قرار دهیم. در واقع در این آموزش علاوه بر نحوه تولید یک عدد تصادفی توسط کلاس Random به استفاده از مباحث if و همچنین Loop یی از جنس for هم خواهیم پرداخت.
در این جلسه هم همچون برخی جلسات گذشته نیاز به یک سناریو داریم:
فرض کنیم که ما برادری داریم که همواره بر سر این مسئله که چه کسی امروز برود و نان خریداری کند با او مشاجره می کنیم و هر دفعه هم که شیر یا خط می اندازیم تا اینکه ببینیم قرعه به چه کسی می افتد او بهانه می آورد که تو سکه را از قصد طوری انداختی که قرعه به نامت نیفتد. از آنجا که ما یک برنامه نویس جاوا هستیم این پیشنهاد را به او می دهیم که می توانیم برنامه ای طراحی کنیم که به صورت کاملاً تصادفی شماره ای را به یکی از ما دو نفر اختصاص خواهد داد. حال هر کس که از نفر دیگری امتیاز کمتری کسب کرد می بایست این کار را انجام دهد. در نهایت این پیشنهاد مورد قبول طرفین واقع می شود و شروع به نوشتن برنامه می کنیم (البته از آنجا که نگارنده این آموزش تنها پسر خانواده است، این وظیفه خطیر در هر صورت به عهده خودش است!).
شما هم سعی کنید با برادرتان دعوا نکنید و به جای آن به ادامه مطلب رفته و جاوای خودتان را قوی کنید...
پروژه ای جدید در محیط اکلیپس ایجاد می کنیم تحت عنوان Unlucky Brother 26st Session به معنی "برادر بد شانس جلسه بیست و ششم" ایجاد کرده سپس کلاسی تحت عنوان RandomNumber به معنی "شماره تصادفی" ایجاد می کنیم. اولین مرحله برای ایجاد این برنامه دسترسی به عددی تصادفی است.
برای همین منظور از کلاسی که در API جاوا توسط طراحان این زبان برنامه نویسی تحت عنوان Random گنجانده شده استفاده خواهیم کرد. در حقیقت نحوه به کار گیری این کلاس تا حدودی مشابه کلاس Scanner است که در آموزش های قبلی به تفصیل مورد بررسی قرار گرفته است. حال کد خود را به شکل زیر تکمیل می کنیم:
در کد فوق با نوشتن کلمه Random این کلاس را از API زبان برنامه نویسی جاوا فرا خواهیم خواند. حال بایستی مانند دیگر کلاس ها و یا متغیر ها نامی برای آن در نظر بگیریم که در این مثال نام randomNumber به معنی "شماره تصادفی" را در نظر می گیریم. پس از علامت مساوی کلید واژه new را نوشته و سپس مجدداً نام کلاس Random را می نویسیم. در واقع ما با این کار اقدام به ایجاد Instance یا نمونه ای از این کلاس در برنامه خود می کنیم. حال همانطور که مشاهده می شود دور دو واژه Random نقطه چین قرار گرفته است به این معنی که برای نرم افزارم اکلیپس ناشناخته هستند. برای رفع این مشکل همانند روشی که در آموزش های پیشین استفاده شد، نشانگر موس خود را روی یکی از آن ها قرار داده و پس از آنکه اکلیپس پنجره ای زرد رنگ باز کرد که حاوی تعدادی پیشنهاد برای رفع این مشکل بود گزینه Import ‘Random’(java.util) را انتخاب می کنیم:
به محض اینکه روی این گزینه کلیک کنیم خطی از کد به شکل import java.util.Random; به اول برنامه اضافه خواهد شد. (لازم به ذکر است دو روش دیگر نیز برای وارد کردن یک کلاس به برنامه وجود دارد. روش اول به این شکل است که خط اول از کدی که در بالا مشاهده می شود را به صورت دستی وارد کنیم که این کار تا حدودی وقت گیر خواهد بود. راه دوم این است که از کلید های میانبر استفاده کنیم که برای این منظور می توان از ترکیب کلید های Ctrl + Shift + O استفاده کرد البته به خاطر داشته باشیم که احتمال دارد این کلید های میانبر در نسخه های متفاوت اکلیپس تغییر کرده باشند). اکنون کد خود را به شکل زیر تکمیل می کنیم:
حال همانطور که در کد فوق مشاهده می شود در خط بعدی نیاز است تا نوع داده ورودی این کلاس تصادفی را تعریف کنیم که در اینجا از متدی به اسم nextInt() استفاده خواهیم کردکه ایجاد کننده یک عدد صحیح است. حال برای آنکه بتوانیم روی برنامه خود تسلط بیشتری داشته باشیم می بایست یک Range یا طیفی از اعداد را برای برنامه خود مشخص کنیم که از میان آنها یک عدد به صورت تصادفی انتخاب گردد. برای همین منظور داخل پرانتز مقابل nextInt() عدد 101 را وارد می کنیم به این معنی که کامپیوتر یک عدد تصادفی از صفر تا صد را انتخاب خواهد کرد. در حقیقت علت اینکه عدد 101 را به عنوان Range تعریف کردیم این است که در این متد آخرین عدد که خود عدد 101 است جزو طیف محسوب نمی شود از این رو طیف ما در برگیرنده اعدادی از صفر تا صد خواهد بود. حال نیاز است تا دو متغیر از جنس int به نام هر دو برادر تعریف کنیم. در این مثال نام های hesamNumber و hadiNumber را در نظر می گیریم. تا اینجای کار کد ما به شکل زیر خواهد بود:
حال همانطور که در آموزش های پیشین فرا گرفتیم، می بایست تا یک Loop از جنس for وارد برنامه خود کنیم. در واقع وظیفه ای که این Loop بر عهده دارد این است که اعداد تصادفی را که ما وارد آن می کنیم را بارها و بارها تکرار کند تا در نهایت عدد مرتبط به یکی از برادران به نقطه پایانی برسد و بازنده معلوم گردد. در این مرحله کد ما به شکل زیر خواهد بود:
همانطور که می دانیم داخل پرانتز مقابل for می بایست سه پارامتر قرار گیرد، به این شکل که پارامتر اول مقدار اولیه متغیرها است، پارامتر دوم نقطه پایانی متغیرهاست و پارامتر سوم تعیین کننده مقداری است که در هر بار Loop شدن می بایست به متغیر ها اضافه گردد. حال کد خود را به شکل زیر تکمیل می کنیم:
به طور خلاصه، عبارت hesamNumber = randomNumber.nextInt(101) به منزله نشان دادن نقطه آغازین متغیر است و از آنجا که می خواهیم این برنامه کلاً بر پایه شانس یا بهتر بگوییم بد شانسی باشد، تعیین مقدار اولیه متغیرهای مرتبط به هر دو برادر را به عهده کلاس Random می گذاریم. از همین رو Instance یا نمونه ای از کلاس Random را که قبلاً ایجاد کرده بودیم را به متغیر برادر اول نسبت می دهیم. از آنجا که در این برنامه ما دو متغیر داریم، پس نیاز است تا نقطه آغازین هر دو متغیر را در داخل for تعیین کنیم از این رو یک کاما پس از اولین متغیر قرار داده سپس نام متغیر دوم و همچنین مقدار اولیه آن را نیز مشخص می کنیم و در نهایت یک علامت ; قرار می دهیم. در این مرحله نوبت به نوشتن کدی مربوط به نقطه پایانی Loop می رسد که در اینجا ما عدد 1000 را در نظر می گیریم. برای این منظور کد خود را به شکل زیر تکمیل می کنیم:
به طور خلاصه عبارت hesamNumber <= 1000 || hadiNumber <= 1000; به این معنی است که اگر Value مرتبط با متغیر ما تحت عنوان hesamNumber کوچکتر یا مساوی با 1000 بود و یا Value مرتبط با متغیر ما تحت عنوان hadiNumber کوچکتر یا مساوی با 1000 بود برنامه از Loop خارج شود(در واقع علامت || به معنی "یا" است). این قسمت از کد نیز همچون قسمت قبل با یک علامت ; به پایان می رسد. حال می بایست پارامتر سوم را تعریف کنیم که عبارت است از تعیین مقدار افزایشی هر متغیر در هر بار Loop شدن برنامه و برای این منظور کد فوق را به شکل زیر تکمیل می کنیم:
به طور خلاصه، عبارت hesamNumber += randomNumber.nextInt(11) به این معنی است که در هر بار Loop شدن مقدار متغیر ما تحت عنوان hesamNumber به مقدار عددی کاملاً تصادفی از صفر تا 10 افزایش یابد. سپس یک علامت کاما قرار داده و مقداری که می بایست متغیر دوم ما هم در هر بار Loop شدن افزایش یابد را تعیین می کنیم که همانند متغیر پیشین می باشد(همانطور که پیش از این آموزش دادیم خود عدد 11 جزو اعداد محسوب نخواهد شد). تا اینجای کار کلیه شروطی که برنامه در حین اجرا می بایست از آن طبعیت کند را تعریف کرده ایم و اکنون می بایست به کامپیوتر دستور دهیم تا خروجی برنامه را روی صفحه مانیتور نمایش دهد. برای همین منظور کد فوق را به شکل زیر تکمیل می کنیم:
در حقیقت هر آنچه در دستور System.out.println(); قرار گیرد، در پنجره Console به نمایش در خواهد آمد. حال ما می خواهیم نشان دهیم که شماره حسام ... است و شماره هادی ... است که برای همین منظور اولین عبارتی که می نویسیم Hesam`s number is است یعنی "شماره حسام هست..." سپس یک علامت + قرار داده و نام متغیر مرتبط با حسام را می نویسیم. تا اینجای کار عبارت مربوط به حسام تکمیل می شود. حال می خواهیم عبارت مربوط به هادی را نیز اضافه کنیم که برای این کار یک علامت + قرار داده و عبارت “ and “ را می نویسیم. اگر توجه کرده باشید هر دو طرف واژه and فضای خالی قرار داده ایم برای آنکه خروجی برنامه خوانا تر باشد. سپس یک علامت + دیگر قرار داده و عبارت Hadi`s number is به معنی "شماره هادی هست ..." به علاوه نام متغیر مرتبط با هادی را می نویسیم. اکنون زمان اجرای برنامه رسیده است که با Run کردن برنامه خروجی زیر را مشاهده خواهیم کرد:
اگر به فلش قرمز رنگ داخل تصویر توجه کنیم، خواهیم فهمید که لیست بلندی از اعداد تصادفی توسط نرم افزار برای هر یک از دو برادر ایجاد شده است. نکته ای که در این برنامه از اهمیت بسزایی برخوردار است این است که به هر حال یکی از این دو برادر زودتر از دیگری به عدد 1000 خواهد رسید که همین مسئله فرد برنده و بازنده را مشخص خواهد کرد. در یک Run از برنامه که در تصویر فوق مشاهده می شود، هادی امتیاز کمتری نسبت به برادر خود کسب کرده است پس وی باید خرید نان را بر عهده گیرد. در حقیقت برنامه ما در اینجا تکمیل شده است اما برای آنکه خود برنامه نفر برنده را مشخص کند می توانیم از دستور if نیز کمک بگیریم. برای همین منظور کد فوق را به شکل زیر تکمیل می کنیم:
در واقع خارج از Block مربوط به Loop مرتبط با for عبارات شرطی if را خواهیم نوشت(علت آنکه این عبارات شرطی را خارج از Block مرتبط با for می نویسیم این است که می خواهیم از تکرار عبارات شرطی در هر بار Loop شدن خودداری کرده و صرفاً زمانیکه برنامه از Loop خارج شد آنها را به نمایش در آوریم). حال به بررسی تک تک عبارات شرطی می پردازیم. در عبارت اول به برنامه خود دستور داده ایم که اگر مقدار متغیر مرتبط با حسام بیشتر از مقدار متغیر هادی بود جمله Hesam won the game and Hadi has to buy it. را به معنی "حسام بازی را برد و هادی باید به خرید برود." به نمایش در آید. حال اگر این تنها شرط برنامه ما بود می بایست یک دستور else برای زمانیکه جواب به شرط فوق false بود تعریف کنیم اما از آنجا که ما یک شرط دیگر هم داریم از عبارت else if استفاده می کنیم و در آن تعیین می کنیم که اگر مقدار متغیر هادی بیش از مقدار متغیر حسام بود پس جمله Hadi won the game and Hesam has to but it. به معنی "هادی بازی را برد و حسام باید به خرید برود." می بایست روی صفحه مانیتور به نمایش در آید. یک فرض محال هم ممکن است اتفاق افتد و آن اینکه مقدار متغیر هر دو برادر معادل با یک عدد شود و نفر برنده و بازنده بازی مشخص نشود که در این صورت در دستور else از برنامه خواسته ایم که چنانچه جواب به شرط if معادل با false بود و همچنین اگر جواب به شرط else if معادل با false بود، دستور Now they have to think about a third solution! به معنی" حالا هر دو برادر می بایست به دنبال یک راه کار سومی بگردند!" اجرا خواهد شد. مجدد برنامه را اجرا می کنیم:
در خروجی برنامه که پس از تکمیل نهایی آن به دست آمد می بینیم که امتیاز هادی بیشتر از برادرش است و برنامه هم برنده را اعلام می کند. به عنوان سخن پایانی شاید بتوان گفت که می توانستیم این برنامه را به روشی حتی به مراتب کوتاه تر از این نیز بنویسیم و یا حتی راه کارهای منطقی تر به کار بریم، اما از آنجا که قصد ما در این آموزش تلفیق مطالب جدید با مطالب پیشین بود چنین راه کاری اتخاذ گردید.
مدیر تالار های: