PDA

View Full Version : نمایش یک آرایه دابل توسط حلقه for



mahdi2elve
پنج شنبه 08 مرداد 1394, 22:00 عصر
سلام دوستان و همکاران گرامی

بنده میخاستم حاصل یک معادله را در یک ارایه بریزم و توسط حلقه for تمامی مقادیر اعشاری داخل آرایه رو چاپ کنم!

double[] numbers=new double[5];

for (double N=0; N < 5; N++) {
numbers[N] =(1/((N+1)*(N+1)));

System.out.println(numbers[N]);


ولی متاسفانه برنامه در خط 4 از من ارور میگیره.
و بهم میگه کدهاتو به این شکل تغییر بده


double[] numbers=new double[5];

for (double N=0; N < 5; N++) {
numbers[(int) N] =(1/((N+1)*(N+1)));

System.out.println(numbers[(int) N]);

}


مشکل من با پیشنهاد برنامه حل شد ولی!
سوال من اینجاست که ایا روش پیشنهادی برنامه درسته؟ ایا راه منطقی تر و اصولی تری نیز هست؟

و در اخر میخاستم راه پیشنهادی برنامه رو بهم توضیح بدین که این خط به چه معناست ؟
numbers[(int) N]
اصلا متوجه نمیشم یعنی چی این خط؟

پ.ن : میخام خط کدها رو درک کنم! تنها حل مشکل به هر روشی منو ارضا نمیکنه!

محمد فدوی
جمعه 09 مرداد 1394, 09:48 صبح
اندیس یه آرایه (Index) یه عدد صحیحه. یعنی شما برای دسترسی به هرکدوم از المان‌های داخل یه آرایه باید بهش یه عدد صحبح (int) تحویل بدی و المان مورد نظرت رو تحویل بگیری. اینکه آرایه‌ی شما المان‌هایی از جنس double یا long یا String یا هرچیز دیگه‌ای داشته باشه روی نوع اندیسش تاثیری نمی‌ذاره و اندیس همواره باید یه عدد صحیح باشه. راه حل اینه که از اول شمارنده رو از نوع int می‌ساختی، در عوض توی محاسبه‌ای که انجام دادی تاکید می‌کردی که عدد ۱ از نوع اعشاریه تا به عدد صحیح تبدیل نشه بعد از تقسیم:
double[] numbers = new double[5];

for(int i = 0; i < numbers.length; i++) {
numbers[i] = 1.0 / ((i + 1) * (i + 1));
System.out.println(numbers[i]);
}
راه دیگه برای محاسبه استفاده از تابع Math.pow هست:
numbers[i] = Math.pow(i + 1, -2);

اگه جاوا ۸ داری می‌تونستی از Stream‌ها هم استفاده کنی...

mahdi2elve
جمعه 09 مرداد 1394, 10:11 صبح
اندیس یه آرایه (Index) یه عدد صحیحه. یعنی شما برای دسترسی به هرکدوم از المان‌های داخل یه آرایه باید بهش یه عدد صحبح (int) تحویل بدی و المان مورد نظرت رو تحویل بگیری. اینکه آرایه‌ی شما المان‌هایی از جنس double یا long یا String یا هرچیز دیگه‌ای داشته باشه روی نوع اندیسش تاثیری نمی‌ذاره و اندیس همواره باید یه عدد صحیح باشه. راه حل اینه که از اول شمارنده رو از نوع int می‌ساختی، در عوض توی محاسبه‌ای که انجام دادی تاکید می‌کردی که عدد ۱ از نوع اعشاریه تا به عدد صحیح تبدیل نشه بعد از تقسیم:
double[] numbers = new double[5];

for(int i = 0; i < numbers.length; i++) {
numbers[i] = 1.0 / ((i + 1) * (i + 1));
System.out.println(numbers[i]);
}
راه دیگه برای محاسبه استفاده از تابع Math.pow هست:
numbers[i] = Math.pow(i + 1, -2);

اگه جاوا ۸ داری می‌تونستی از Stream‌ها هم استفاده کنی...

متشکرم جناب فدوی
راه حل شما منطقی تر از راه حل برنامه بود.
مخصوصا 1.0 که گفتین
و همینطور استفاده از کلاس math هم جالب بود!

mahdi2elve
جمعه 09 مرداد 1394, 10:25 صبح
اما نتیجه تحقیقات من
در این خط
numbers[N] =(1/((N+1)*(N+1)));

من میخاستم N که از جنس double بود double N=0 رو به عنوان اندیس آرایه در نظر بگیرم که خلاف قانون نام گذاری اندیس ها بود!عدد داخل اندیس آرایه فقط میتونه یک عدد صحیح غیر منفی باشه!

نکته :اندیس آرایه باید یک عدد صحیح غیر منفی (NONNEGATIVE INTEGER) یا یک عبارت صحیح باشد به عنوان مثال فرض کنید متغیر a برابر 5 و متغیر b برابر با 6 است انگاه دستور
c[a+b] += 2
2 را به عضو c[11] آرایه جمع میکند. نام اندیس دار یک آرایه یک عبارت دسترسی به آرایه است.

(منبع : از کتاب هاروی ام دیتل "چگونه با جاوا برنامه بنویسیم" فصل 7 آرایه ها و Arraylist ها صفحه 384)


برنامه به من این خط کد رو پیشنهاد داد

numbers[(int) N] =(1.0/((N+1)*(N+1)));

که من N رو که یک عدد double بود رو به یک عدد صحیح تبدیل کنم. یعنی N من نقش یک int رو بازی کنه ویا بهتر بگم قسمت صحیح اعداد double رو به عنوان اندیس آرایه numbers در نظر بگیره! و قسمت اعشاری اون رو حذف کنه البته فقط در نام اندیس حذفش کنه.