PDA

نسخه کامل مشاهده نسخه کامل : هم جالب و هم اعصاب خرد كن ! يه باگ جالب



hossein2kk
03-11-2009, 23:10
سلام
من امسال تازه وارد رشته نرم افزار شدم . دو سالي بود كه php‌كار مي كردم اولش برنامه نويسي تحت كلاينت يكم به نظرم سخت مي اومد ولي ديدم كه خيلي راحت هست !
بيخيال امروز طبق نمونه سوالاتي كه استادمون داده بود تمرين كنيم رسيدم به تابع فاكتوريل .
قبلا نمونه اون رو با جاوا اسريپت نوشته بودم پس با همون الگوريتم اين كد رو نوشتم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و براي خودم 6 رو مثال زدم و از شانس ما كار كرد .
رفتم جلوتر و رسيدم به يه برنامه براي جايگشت r شئ از n شئ .همي اين كد را نوشتم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
از شانس باز من جايگشت 2 شئ از 4 شئ رو مثال زدم كه بازم جواب درست در اومد.كلي شاد و خندون داشتم براي دست گرمي يك چند تا عدد مي زدم يهو حالم گرفته شد ! زدم جايگشت 3 شئ از 10 شئ جواب نرم افزار اومد 4 ! ولي روي كاغذ جواب بايد مي شد 720 !
مثل عادت قبلي برنامه رو تكه تكه كردم و اجرا كردم ديدم خروجي خروجي فكتوريل 10 رو داده 24320 درست بود!
داشتم ديوونه مي شدم كه بردم تابع رو تو حلقه ببينم چه مرگشه .
اين كدم بود :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و وقتي خروجي رو ديدم شاخ در اوردم !!!
خروجي فاكتوريل 8 و 9 و 12 و 13 منفي بود!!!
در هر صورت من هر كاري كردم حتي تابع رو از حالت بازگشتي به حالت حلقه اي تبديل كردم ولي بازم افاقه اي نكرد . مي دونم ممكن يه سوتي داده باشم گنده ! ولي واقعا يه بزرگواري ژيدا مي شه ما رو از اين سردرگمي دربياره ؟
ممنون پيشاپيش !
سرافراز باشيد

omidrb
04-11-2009, 00:04
با سلام دوست عزیز شما الگوریتم برامتون مشکلی نداره اما به نکته در کامپیوتر هیچ وقت توجه نداشته اید
در برنامه نویسی داده های شما در متغییر هایی ذخیره میشوند این متعیرها ظرفیت محدودی دارند در مثال شما همانطور که در کدتان دیدم متغیر اصلی شما که خروچی تابعتون هست در یک متغیر int که دوبایتی از نوع علامتدار است ذخیره میشود
با توجه به این نوع انتخابی شما حداکثر 32767 را میتوانید در آن ذخیره کنید (1-15^2) بنابراین فاکتوریل 8 که عددی حدود 40000 میشود در این متغیر جا نمیشود و باعث سرریز میشود
و نتیجه منفی کاملا طبیعی است
برای رفع این مشکل باید بجای نوع int از longint استفاده کنید
البته این هم بدین معنی نیست که تا بینهایت میتونید فاکتوریل بگیرید
امیدوارم مشکلتون را حل کرده باشم
موفق باشید

CppBuilder2006
04-11-2009, 03:04
سلام
compiler شما بسیار قدیمی است.
به جای int از long استفاده کنید.

hossein2kk
04-11-2009, 05:46
من turbo c++ نسخه 4.5 رو نصب كردم .
يعني مشكل از اونجاست ؟

hossein2kk
04-11-2009, 05:58
من turbo c++ نسخه 4.5 رو نصب كردم .
يعني مشكل از اونجاست ؟

milad222
04-11-2009, 11:34
بجای "Turbo C++" از "Borland C++" (بورلند سی پلاس پلاس) استفاده کنید .

CppBuilder2006
08-11-2009, 00:08
من turbo c++ نسخه 4.5 رو نصب كردم .
يعني مشكل از اونجاست ؟
مشکل که نه.
compiler های قدیمی برای int دو بایت در نظر می گیرن که برای کار شما کافی نیست.