بک لینک

ایجاد یک شماره تصادفی در پروژه ای تحت عنوان برادر بد شانس!

oracle_java-100026145-whole-100039776-gallery

به نام خدا
آموزش بیست و ششم
در این جلسه قصد داریم تا نحوه به کار گیری کالس Random در زبان برنامه نویسی جاوا را
مورد بررسی قرار دهیم. در واقع در این آموزش عالوه بر نحوه تولید یک عدد تصادفی توسط
کالس Random به استفاده از مباحث if و همچنین Loop یی از جنس for هم خواهیم
پرداخت.
در این جلسه هم همچون برخی جلسات گذشته نیاز به یک سناریو داریم:
فرض کنیم که ما برادری داریم که همواره بر سر این مسئله که چه کسی امروز برود و نان
خریداری کند با او مشاجره می کنیم و هر دفعه هم که شیر یا خط می اندازیم تا اینکه ببینیم قرعه
به چه کسی می افتد او بهانه می آورد که تو سکه را از قصد طوری انداختی که قرعه به نامت
نیفتد. از آنجا که ما یک برنامه نویس جاوا هستیم این پیشنهاد را به او می دهیم که می توانیم
برنامه ای طراحی کنیم که به صورت کامالً تصادفی شماره ای را به یکی از ما دو نفر اختصاص
خواهد داد. حال هر کس که از نفر دیگری امتیاز کمتری کسب کرد می بایست این کار را انجام
دهد. در نهایت این پیشنهاد مورد قبول طرفین واقع می شود و شروع به نوشتن برنامه می کنیم)البته
از آنجا که نگارنده این آموزش تنها پسر خانواده است، این وظیفه خطیر در هر صورت به عهده
خودش است!(.
st Unlucky Brother 26 پروژه ای جدید در محیط اکلیپس ایجاد می کنیم تحت عنوان
Session به معنی “برادر بد شانس جلسه بیست و ششم” ایجاد کرده سپس کالسی تحت
عنوان RandomNumber به معنی “شماره تصادفی” ایجاد می کنیم. اولین مرحله برای
ایجاد این برنامه دسترسی به عددی تصادفی است. برای همین منظور از کالسی که در API جاوا
توسط طراحان این زبان برنامه نویسی تحت عنوان Random گنجانده شده استفاده خواهیم
کرد. در حقیقت نحوه به کار گیری این کالس تا حدودی مشابه کالس Scanner است که در
آموزش های قبلی به تفصیل مورد بررسی قرار گرفته است. حال کد خود را به شکل زیر تکمیل
می کنیم:
public class RandomNumber {
public static void main(String[] args) {
Random randomNumber = new Random();
}
}
در کد فوق با نوشتن کلمه Random این کالس را از API زبان برنامه نویسی جاوا فرا خواهیم
خواند. حال بایستی مانند دیگر کالس ها و یا متغیر ها نامی برای آن در نظر بگیریم که در این مثال
نام randomNumber به معنی “شماره تصادفی” را در نظر می گیریم. پس از عالمت
مساوی کلید واژه new را نوشته و سپس مجدداً نام کالس Random را می نویسیم. در واقع ما
با این کار اقدام به ایجاد Instance یا نمونه ای از این کالس در برنامه خود می کنیم. حال
همانطور که مشاهده می شود دور دو واژه Random نقطه چین قرار گرفته است به این معنی که
برای نرم افزارم اکلیپس ناشناخته هستند. برای رفع این مشکل همانند روشی که در آموزش های
پیشین استفاده شد، نشانگر موس خود را روی یکی از آن ها قرار داده و پس از آنکه اکلیپس
پنجره ای زرد رنگ باز کرد که حاوی تعدادی پیشنهاد برای رفع این مشکل بود گزینه Import
(Random’(java.util’ را انتخاب می کنیم:
به محض اینکه روی این گزینه کلیک کنیم خطی از کد به شکل import
;java.util.Random به اول برنامه اضافه خواهد شد .
)الزم به ذکر است دو روش دیگر نیز برای وارد کردن یک کالس به برنامه وجود دارد. روش
اول به این شکل است که خط اول از کدی که در باال مشاهده می شود را به صورت دستی وارد
کنیم که این کار تا حدودی وقت گیر خواهد بود. راه دوم این است که از کلید های میانبر
استفاده کنیم که برای این منظور می توان از ترکیب کلید های Ctrl + Shift + O استفاده کرد
البته به خاطر داشته باشیم که احتمال دارد این کلید های میانبر در نسخه های متفاوت اکلیپس تغییر
کرده باشند(. اکنون کد خود را به شکل زیر تکمیل می کنیم:
import java.util.Random;
public class RandomNumber {
public static void main(String[] args) {
Random randomNumber = new Random();
randomNumber.nextInt();
}
}
حال همانطور که در کد فوق مشاهده می شود در خط بعدی نیاز است تا نوع داده ورودی این
کالس تصادفی را تعریف کنیم که در اینجا از متدی به اسم ()nextInt استفاده خواهیم کردکه
ایجاد کننده یک عدد صحیح است. حال برای آنکه بتوانیم روی برنامه خود تسلط بیشتری داشته
باشیم می بایست یک Range یا طیفی از اعداد را برای برنامه خود مشخص کنیم که از میان آنها
یک عدد به صورت تصادفی انتخاب گردد. برای همین منظور داخل پرانتز مقابل ()nextInt
عدد 101 را وارد می کنیم به این معنی که کامپیوتر یک عدد تصادفی از صفر تا صد را انتخاب
خواهد کرد. در حقیقت علت اینکه عدد 101 را به عنوان Range تعریف کردیم این است که در
این متد آخرین عدد که خود عدد 101 است جزو طیف محسوب نمی شود از این رو طیف ما در
برگیرنده اعدادی از صفر تا صد خواهد بود.
حال نیاز است تا دو متغیر از جنس int به نام هر دو برادر تعریف کنیم. در این مثال نام های
hesamNumber و hadiNumber را در نظر می گیریم. تا اینجای کار کد ما به شکل زیر
خواهد بود:
import java.util.Random;
public class RandomNumber {
public static void main(String[] args) {
Random randomNumber = new Random();
randomNumber.nextInt(101);
int hesamNumber;
int hadiNumber;
}
}
حال همانطور که در آموزش های پیشین فرا گرفتیم، می بایست تا یک Loop از جنس for وارد
برنامه خود کنیم. در واقع وظیفه ای که این Loop بر عهده دارد این است که اعداد تصادفی را
که ما وارد آن می کنیم را بارها و بارها تکرار کند تا در نهایت عدد مرتبط به یکی از برادران به
نقطه پایانی برسد و بازنده معلوم گردد. در این مرحله کد ما به شکل زیر خواهد بود:
import java.util.Random;
public class RandomNumber {
public static void main(String[] args) {
Random randomNumber = new Random();
randomNumber.nextInt(101);
int hesamNumber;
int hadiNumber;
for(){
}
}
}
همانطور که می دانیم داخل پرانتز مقابل for می بایست سه پارامتر قرار گیرد، به این شکل که
پارامتر اول مقدار اولیه متغیرها است، پارامتر دوم نقطه پایانی متغیرهاست و پارامتر سوم تعیین
کننده مقداری است که در هر بار Loop شدن می بایست به متغیر ها اضافه گردد. حال کد خود
را به شکل زیر تکمیل می کنیم:
import java.util.Random;
public class RandomNumber {
public static void main(String[] args) {
Random randomNumber = new Random();
randomNumber.nextInt(101);
int hesamNumber;
int hadiNumber;
for (hesamNumber = randomNumber.nextInt(101), hadiNumber =
randomNumber.nextInt(101)) {
}
}
}
به طور خالصه، عبارت = hesamNumber
(randomNumber.nextInt(101 به منزله نشان دادن نقطه آغازین متغیر است و از
آنجا که می خواهیم این برنامه کالً بر پایه شانس یا بهتر بگوییم بد شانسی باشد، تعیین مقدار اولیه
متغیرهای مرتبط به هر دو برادر را به عهده کالس Random می گذاریم. از همین رو
Instance یا نمونه ای از کالس Random را که قبالً ایجاد کرده بودیم را به متغیر برادر
اول نسبت می دهیم. از آنجا که در این برنامه ما دو متغیر داریم، پس نیاز است تا نقطه آغازین هر
دو متغیر را در داخل for تعیین کنیم از این رو یک کاما پس از اولین متغیر قرار داده سپس نام
متغیر دوم و همچنین مقدار اولیه آن را نیز مشخص می کنیم و در نهایت یک عالمت ; قرار می
دهیم. در این مرحله نوبت به نوشتن کدی مربوط به نقطه پایانی Loop می رسد که در اینجا ما
عدد 1000 را در نظر می گیریم. برای این منظور کد خود را به شکل زیر تکمیل می کنیم:
import java.util.Random;
public class RandomNumber {
public static void main(String[] args) {
Random randomNumber = new Random();
randomNumber.nextInt(101);
int hesamNumber;
int hadiNumber;
for (hesamNumber = randomNumber.nextInt(101), hadiNumber =
randomNumber.nextInt(101); hesamNumber <= 1000 || hadiNumber <= 1000;)
{
}
}
}
به طور خالصه عبارت => hesamNumber <= 1000 || hadiNumber
;1000 به این معنی است که اگر Value مرتبط با متغیر ما تحت عنوان hesamNumber
کوچکتر یا مساوی با 1000 بود و یا Value مرتبط با متغیر ما تحت عنوان hadiNumber
کوچکتر یا مساوی با 1000 بود برنامه از Loop خارج شود)در واقع عالمت || به معنی “یا”
است(. این قسمت از کد نیز همچون قسمت قبل با یک عالمت ; به پایان می رسد. حال می بایست

پارامتر سوم را تعریف کنیم که عبارت است از تعیین مقدار افزایشی هر متغیر در هر بار
Loop شدن برنامهو برای این منظور کد فوق را به شکل زیر تکمیل می کنیم:
import java.util.Random;
public class RandomNumber {
public static void main(String[] args) {
Random randomNumber = new Random();
randomNumber.nextInt(101);
int hesamNumber;
int hadiNumber;
for (hesamNumber = randomNumber.nextInt(101), hadiNumber =
randomNumber.nextInt(101); hesamNumber <= 1000 || hadiNumber <= 1000;
hesamNumber += randomNumber.nextInt(11), hadiNumber +=
randomNumber.nextInt(11)) {
}
}
}
به طور خالصه، عبارت =+ hesamNumber
(randomNumber.nextInt(11 به این معنی است که در هر بار Loop شدن مقدار
متغیر ما تحت عنوان hesamNumber به مقدار عددی کامالً تصادفی از صفر تا 10 افزایش
یابد. سپس یک عالمت کاما قرار داده و مقداری که می بایست متغیر دوم ما هم در هر بار Loop
شدن افزایش یابد را تعیین می کنیم که همانند متغیر پیشین می باشد)همانطور که پیش از این
آموزش دادیم خود عدد 11 جزو اعداد محسوب نخواهد شد(. تا اینجای کار کلیه شروطی که
برنامه در حین اجرا می بایست از آن طبعیت کند را تعریف کرده ایم و اکنون می بایست به
کامپیوتر دستور دهیم تا خروجی برنامه را روی صفحه مانیتور نمایش دهد. برای همین منظور کد
فوق را به شکل زیر تکمیل می کنیم:
import java.util.Random;
public class RandomNumber {
public static void main(String[] args) {
Random randomNumber = new Random();
randomNumber.nextInt(101);
int hesamNumber;
int hadiNumber;
for (hesamNumber = randomNumber.nextInt(101), hadiNumber =
randomNumber.nextInt(101); hesamNumber <= 1000 || hadiNumber <= 1000;
hesamNumber += randomNumber.nextInt(11), hadiNumber +=
randomNumber.nextInt(11)) {
System.out.println(“Hesam` number is ” + hesamNumber + ” and ”
+ “Hadi`s number is ” + hadiNumber);
}
}
}
در حقیقت هر آنچه در دستور ;()System.out.println قرار گیرد، در پنجره Console به
نمایش در خواهد آمد. حال ما می خواهیم نشان دهیم که شماره حسام … است و شماره هادی …
است که برای همین منظور اولین عبارتی که می نویسیم Hesam`s number is است یعنی
“شماره حسام هست…” سپس یک عالمت + قرار داده و نام متغیر مرتبط با حسام را می
نویسیم. تا اینجای کار عبارت مربوط به حسام تکمیل می شود. حال می خواهیم عبارت مربوط به
هادی را نیز اضافه کنیم که برای این کار یک عالمت + قرار داده و عبارت ” and ” را می
نویسیم. اگر توجه کرده باشید هر دو طرف واژه and فضای خالی قرار داده ایم برای آنکه
خروجی برنامه خوانا تر باشد. سپس یک عالمت + دیگر قرار داده و عبارت Hadi`s number
is به معنی “شماره هادی هست …” به عالوه نام متغیر مرتبط با هادی را می نویسیم. اکنون
زمان اجرای برنامه رسیده است که با Run کردن برنامه خروجی زیر را مشاهده خواهیم کرد:
اگر به فلش قرمز رنگ داخل تصویر توجه کنیم، خواهیم فهمید که لیست بلندی از اعداد تصادفی
توسط نرم افزار برای هر یک از دو برادر ایجاد شده است. نکته ای که در این برنامه از اهمیت
بسزایی برخوردار است این است که به هر حال یکی از این دو برادر زودتر از دیگری به عدد
1000 خواهد رسید که همین مسئله فرد برنده و بازنده را مشخص خواهد کرد. در یک Run از
برنامه که در تصویر فوق مشاهده می شود، هادی امتیاز کمتری نسبت به برادر خود کسب کرده
است پس وی باید خرید نان را بر عهده گیرد.
در حقیقت برنامه ما در اینجا تکمیل شده است اما برای آنکه خود برنامه نفر برنده را مشخص کند
می توانیم از دستور if نیز کمک بگیریم. برای همین منظور کد فوق را به شکل زیر تکمیل می
کنیم:
import java.util.Random;
public class RandomNumber {
public static void main(String[] args) {
Random randomNumber = new Random();
randomNumber.nextInt(101);
int hesamNumber;
int hadiNumber;
for (hesamNumber = randomNumber.nextInt(101), hadiNumber =
randomNumber.nextInt(101); hesamNumber <= 1000 || hadiNumber <= 1000;
hesamNumber += randomNumber.nextInt(11), hadiNumber +=
randomNumber.nextInt(11)) {
System.out.println(“Hesam` number is ” + hesamNumber + ” and ”
+ “Hadi`s number is ” + hadiNumber);
}
if (hesamNumber > hadiNumber) {
System.out.println(“Hesam won the game and Hadi has to buy it.”);
} else if (hesamNumber < hadiNumber) {
System.out.println(“Hadi won the game and Hesam has to buy it.”);
} else {
System.out.println(“Now they have to think about a third solution!”);
}
}
}
در واقع خارج از 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 بود و همچنین اگر
Now they have to think about a دستور ،بود false با معادل else if شرط به جواب
!third solution به معنی” حاال هر دو برادر می بایست به دنبال یک راه کار سومی
بگردند!” اجرا خواهد شد. مجدد برنامه را اجرا می کنیم:
در خروجی برنامه که پس از تکمیل نهایی آن به دست آمد می بینیم که امتیاز هادی بیشتر از
برادرش است و برنامه هم برنده را اعالم می کند.
به عنوان سخن پایانی شاید بتوان گفت که می توانستیم این برنامه را به روشی حتی به مراتب کوتاه
تر از این نیز بنویسیم و یا حتی راه کارهای منطقی تر به کار بریم، اما از آنجا که قصد ما در این
آموزش تلفیق مطالب جدید با مطالب پیشین بود چنین راه کاری اتخاذ گردید.

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

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