keyvan

مشکل با loop از جنس for و نیز مقدار داده یک متغیر در جاوا

keyvan ۱۳۹۷/۰۶/۱۲ 75 زبان برنامه‌نویسی جاوا

سلام دوستان

من در حال یادگیری زبان برنامه نویسی جاوا هستم

در فصل شش آموزش یادگیری جاوا و در بخش

استفاده از کلاس رندوم جاوا در حلقه ها در قالب پروژه ی برادر بدشانس

من یک مشکل با مقدار متغیر keyvanNumber و abolfazlNumber دارم که چند ساعته وقت من را گرفته (این نام ها با نام های استفاده شده در آموزش متفاوت است)

کدی که من نوشته ام به صورت زیر است:

import java.util.Random;
public class hhh {
public static void main(String[] args) {
Random randomNumber = new Random();
// randomNumber.nextInt(101); i think this code is not useful
int keyvanNumber;
int abolfazlNumber;
for (keyvanNumber = randomNumber.nextInt(11) , abolfazlNumber = randomNumber.nextInt(11); keyvanNumber <=20 || abolfazlNumber <=20; keyvanNumber += randomNumber.nextInt(11) , abolfazlNumber += randomNumber.nextInt(11)) {
System.out.println("keyvan number is " + keyvanNumber + " and abolfazl number is " + abolfazlNumber );
}
System.out.println(keyvanNumber); // i think this app have some problem because keyvanNumber in line 11 is different with keyvanNumber in line 9 and 15
System.out.println(abolfazlNumber); 
if (keyvanNumber > abolfazlNumber) {
System.out.println("keyvan won the game and abolfazl has to buy it.");
} else if (keyvanNumber < abolfazlNumber) {
System.out.println("abolfazl won the game and keyvan has to buy it.");
} else {
System.out.println("now they have to think about a third solution!");

}
System.out.println(keyvanNumber);
System.out.println(abolfazlNumber);

}

}

این برنامه قراره برای دو نفر به صورت تصادفی یک عدد از یک تا ده در نظر بگیره و تا زمانی که هر دو عدد زیر 20 هستند اعدادی تصادفی بین یک تا ده بهشون اضافه کنه تا بزرگتر از 20 شوند

خروجی این برنامه در کنسول این است

keyvan number is 8 and abolfazl number is 8
keyvan number is 16 and abolfazl number is 13
keyvan number is 24 and abolfazl number is 19
24
25
abolfazl won the game and keyvan has to buy it.
24
25

البته باید چندین بار این برنامه را اجرا کنید تا جواب غلطی مثل گزینه بالا به شما بدهد

پس از دستور for من پنج جا از متغیر keyvanNumber ( در خط 9 و 11 و 13 و15 و 21 ) استفاده کرده ام در حالی که مقدار این متغیر در خط  9 یک مقدار است ولی در خط 11 و 13 و15 و 21  یک مقدار دیگر است

در بخش کنسول این مشکل خودش را نشان داده  و با اینکه نوشته مقدار کیوان برابر 24 است و مقدار ابوالفضل برابر 19 است اما ابوالفضل را برنده اعلام کرده است در حالی که کیوان باید برنده باشد (در واقع مقدار کیوان  در دستور if با دستور system.out.println... که در لوپ for قرار دارد متفاوت است در حالی که هر دو این دستورات پس از دستور for آمده اند و باید مقدارشان ثابت باشد

آیا این مشکل من با این حرف که کد ها خط به خط اجرا  میشن در تضاد نیست  و آیا نباید وقتی یک متغیر در چند خط بعد فرا خوانده میشه  آخرین وضعیت متغیر (منظورمی آخرین تغیراتی است که روی متغیر شده)فراخوانده بشه

همچنین این مشکل هنگام استفاداه از لوپ while به هیچ وجه وجود ندارد

اینم همون برنامه منتها وقتی از دستور while استفاده کرده ام

import java.util.Random;
public class ccc {
public static void main(String[] args) {
Random randomNumber = new Random();
// randomNumber.nextInt(101); i think this code is not useful
int keyvanNumber = randomNumber.nextInt(11);
int abolfazlNumber = randomNumber.nextInt(11);
while (keyvanNumber <=20 || abolfazlNumber <=20) {
keyvanNumber += randomNumber.nextInt(11);
abolfazlNumber += randomNumber.nextInt(11);
System.out.println("keyvan number is " + keyvanNumber + " and abolfazl number is " + abolfazlNumber );
}

System.out.println(keyvanNumber); // i think this app have some problem because keyvanNumber in line 11 is different with keyvanNumber in line 9 and 15
System.out.println(abolfazlNumber); 
if (keyvanNumber > abolfazlNumber) {
System.out.println("keyvan won the game and abolfazl has to buy it.");
} else if (keyvanNumber < abolfazlNumber) {
System.out.println("abolfazl won the game and keyvan has to buy it.");
} else {
System.out.println("now they have to think about a third solution!");

}
System.out.println(keyvanNumber);
System.out.println(abolfazlNumber);

}

}

ببخشید متنم یکم طولانی شد

امیدوارم متوجه مشکل من شده باشید

ممنون

پاسخ‌ها به این تاپیک
علی رضا کامکار
علی رضا کامکاربرنامه نویس وب و موبایل
۱۳۹۷/۰۶/۱۲

سلام دوست عزیز

کد شما در واقع داره درست کار میکنه و چیزی که شمارو به شک انداخته اینه که 'مقدار امتیاز ها زمانی که داخل حلقه for هستن و در مقابل اون امتیاز ها بعد از خارج شدن از حلقه for با هم تفاوت دارند'.

توی مثالی هم که خودتون زدید توی لاگ های کنسول مشخصه که اول پیغام 

keyvan number is 24 and abolfazl number is 19

نمایش داده شده و بعد از اون به ترتیب اعداد 24 و 25 نمایش داده شدند که اولی امتیاز کیوان و دومی امتیاز ابوالفضل هستش.

دلیل این تغییر هم اینه که ما اگر حلقه for رو سه بخش به شکل زیر تقسیم کنیم

for (Section1; Section2; Section3) { }

مشکل از جایی هستش در هنگام اجرا بخش دوم (Section2) که مربوط به شرط ما هست 'بعد از' بخش سوم (Section3) که عملیات اضافه کردن امتیاز ها هست انجام میشه.

و در واقع آخرین باری که Section3 اجرا میشه و امتیاز ها به هر دوتا بازیکن اختصاص داده میشن، پس از اون شرط (یا همون Section2) چک میشن و چون امتیاز هر دو نفر بالای ۲۰ هست دیگه وارد بلاک حلقه نمیشه و برای همینه که شما توی اخرین print یه عدد میبینید و بیرون حلقه یه عدد دیگه.

همونطور که گفتم کد شما درست داره کار میکنه اما به نظرم اگه میخواید اخرین مقدار ها هم توی کنسول چاپ بشن باید Section3 رو داخل حلقه بنویسید و برای تمیز تر شدن کد Section1 رو هم قبل از حلقه بنوسید یعنی کل کد برنامه میشه به این شکل:

public static void main(String[] args) {

  Random random = new Random();

  int abolfazlScore = random.nextInt(11);
  int keyvanScore = random.nextInt(11);
      
  for (/* empty */; keyvanScore <=20 || abolfazlScore <=20 ;/* empty */) {
    abolfazlScore += random.nextInt(11);
    keyvanScore += random.nextInt(11);
    System.out.println("keyvan number is " + keyvanScore + " and abolfazl number is " + abolfazlScore );
  }

	System.out.println("AbolfazlScore: " + abolfazlScore);
  System.out.println("KeyvanScore: " + keyvanScore);

  if (abolfazlScore > keyvanScore) {
    System.out.println("Abolfazl won the game and Keyvan has to buy it.");
  } 
  else if (abolfazlScore < keyvanScore) {
    System.out.println("Keyvan won the game and Abolfazl has to buy it.");
  } 
  else {
    System.out.println("Now they have to think about a third solution!");
  }
}

یه مقدار ممکنه گیج کننده باشه چون توی متن خیلی خوب نمیشه توضیح داد :) اما با چند بار خوندن فکر کنم متوجه بشید.

امیدوارم تونسته باشم منظورم رو برسونم.