PDA

View Full Version : سوال: سوال در نوشتن برنامه اعداد اول لطفا جواب بدیییین



mehrad10
یک شنبه 16 مهر 1396, 21:29 عصر
سلام من دارم فیلمای اموزشی جاوا رو میبینم تا الان دو ساعتشو دیدم
الان به یه مشکل خیلی خیلییی جدی خوردم سه روزه درگیرشم ولی واقعا نمیفهمم چیه جریانش لطفا یکی کمکم کنه
سوالم اینه توی این فیلمه این برنامه رو مینویسه
public class Mehrad{ public static void main(String[] args) {
for(int num=0;num<20;num++)
if(isPrime(num))
System.out.println(num);
}
static boolean isPrime(int number) {
if(number<2)
return false;
for(int i=2;i<number;i++)
if(number%i==0)
return false;
return true;

}
}
بعدش توی نمونه بالا من از عدد 2 شروع میکنم خب
حالا حلقه ی for اولی رو توی نمونه پایینی پاک میکنم بجاش int میزارم و مقدارشم 2 میزارم حالا باید توی متد پایین isprime جوابش false بشه ولی اخر سر نشون میده 2 رو یعنی true میده جواب رو اخه مگه ننوشته number<2 کوچکتر از 2 باید باشه ولی 2<2 نیست و 2=2 هست!!!!
این رفته توی مخم نمیدونم دیگه چیکار کنم!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

public class Mehrad{ public static void main(String[] args) {
int num=2;
if(isPrime(num))
System.out.println(num);
}
static boolean isPrime(int number) {
if(number<2)
return false;
for(int i=2;i<number;i++)
if(number%i==0)
return false;
return true;

}
}
این هم نمونه ی بالایی و هردوشون 2 رو شامل میشن در صورتی که به طور منطقی و ریاضی نباید 2 رو نشون بده146645

mehrad10
دوشنبه 17 مهر 1396, 06:37 صبح
uppppppppppppppppppppp

vahid-p
دوشنبه 17 مهر 1396, 11:19 صبح
گاهی اوقات آدم تو عبارات منطقی ممکنه یکم گیج بشه. ولی همیشه اول به برداشت خودتون شک کنید بعد الگوریتم (های معروف) و بعد به کامپیوتر (که ممکنه به خاطر برداشت اشتباه از عملکرد کامپیوتر کد رو اشتباه نوشته باشیم که مثالش رو در آخر میزنم)

ببینید عدد 2 از نظر ریاضی هم یک عدد اول هست (به جز خودش عدد یک مقسوم علیه اش هست)
پس اگر الگوریتم عدد 2 رو خروجی میده به عنوان isPrime پس تا اینجاش درسته. حالا ما کار نداریم عدد 2 عدد اول هست یا نه. کلا مشکل شما اون if هست که نوشته number<2.
خب ببینید دقیقا 2>2 نیست پس مقدار این عبارت false هست. وقتی بدنه if اجرا میشه که عبارت condition برابر true باشه. اما اینجا false هست پس بدنه اجرای نمیشه و return false اجرا نمیشه.
به همین صورت حلقه for هم اجرا نمیشه چون وقتی اجرا میشه که قسمت condition اش یعنی i<number برابر true باشه که هیچ وقت نمیشه.
در نتیجه عبارت return true رو بر میگردونه. پس در تابع isPrime(2) مقدار true خواهد داشت و System.out.... اجرا میشه.


if(condition){
اجرای این بدنه وقتی condition برابر true شود
}else{
اجرای این بدنه وقتی condition برابر false شود

تا اینجا بحث پست شما تموم میشه.
اما بعضی اوقات هست ما به علت عدم اطلاع دقیق از عملکرد کامپیوتر ممکنه برنامه هایی بنویسیم که نه برداشت ما اشتباه است و نه الگوریتم. ولی نمیتونیم بگیم کامپیوتر داره اشتباه میکنه (تقریبا محاله اشتباه کنه) و همچنین احتمال اینکه زبان برنامه نویسی رو بد طراحی کرده باشن و باگ داشته باشه هم در این سطح خیلی خیلی کمه.
از جمله عباراتی که ممکنه واقعا اشتباه شاید نشه بهش گفت اما محدودیت های معماری کامپیوتر رو باید در نظر بگیریم مثال هایی شبیه به عبارت زیر هست:
if(2.2-2.2>0)
شاید بگید خب دو طرف صفر هست پس میشه false. اما از اونجایی که عبارات استفاده شده اعشار هستند و اعشار در کامپیوتر به صورت ممیز شناور هست مقدار عبارت حاصل با اینکه صفر هست ولی با یک مقدار دقیقا صفر متفاوته و یک عدد خیلی کوچک رو نماینده صفر میگیرن. هر چند فکر کنم در جاوا تا حدی جلو بعضی از این اشتباهات رو بگیره ولی در عمل در زبانهایی که فقط به معماری کامپیوتر اتکا دارند (مثل C یا C++‎‎‎‎)، عبارت هایی شبیه به این رو احتمالا اشتباه جواب میدن. پس برای متغیرهای double و float حواستون به این مسائل باشه. int و متغیرهای عدد صحیح این مشکل رو نداره. این مثال شاید مشکلی نداشته باشه ولی مثال شبیه به این رو دیدم که به مشکل بر میخوره.
یا مثال زیر:
double x=0.000000000000000001;
if((1/x)*x==1){
System.out.println("Correct");
}
که اگر اجرا کنید خروجی چاپ نخواهد شد!

babak_b_c
سه شنبه 14 آذر 1396, 00:30 صبح
مهراد عزیز این برنامه اعداد اول را چاپ میکنه و 2 عدد اول هست.
اشتباهت اینه که فکر میکنی وقتی عدد 2 هست میره داخل حلقه for در حالیکه حلقه تکرار for مربوط به متد isPrime اصلا انجام نمیشه چون در دستور for(int i=2;i<number;i++) زمانیکه حلقه شروع میشود i=2 است ولی شرط حلقه که 2>2 است برقرار نیست و حلقه اصلا اجرا نمیشود.
در اصل برای مقدار 2 فقط خط آخر متد که return true; است اجرا میشود.