calculator

پروژه ماشین حساب با عملیات روی اعداد ۱۰۰۰ رقمی با c

calculator

calculator

امروز با یک برنامه پیچیده تر آمده  ایم که جنبه آموزشی بالایی دارد و هدف آن آموزش ایجاد الگوریتم و توابعی برای جمع و تفریق و ضرب اعداد بزرگ تا ۱۰۰۰ رقم است. داستان این برنامه این است که ۴ ماشین حساب داریم و برای هر ماشین حساب  یک سری عدد تصادفی صحیح و مثبت حداقل ۱۰۰ رقمی و حداکثر ۱۰۰۰ رقمی تولید می کنیم همچنین به صورت تصادفی  یک سری عملگر ایجاد می کنیم و آن ها را به ۴ ماشین حساب می دهیم تا هر ماشین حساب  ورودی های خود  را پردازش کند.ما زمان پردازش محاسبات را برای هر ماشین حساب  در نظر می گیریم و در آخر بر اساس زمان محاسبات آن ها را رتبه بندی می کنیم و در خروجی چاپ می کنیم .فقط توجه داشته باشید الگوریتم محاسبه ماین حساب ها با هم فرق نمی کند تفاوت در اعداد تصادفی است .این برنامه جواب حاصل از هر ماشین حساب را در فایلی به همان اسم قرار می دهد نکته این سوال توابعی برای ضرب جمع و تفریق اعداد با طول بلند و فراخوانی تایم و ایجاد عدد تصادفی با طول زیاد است.

در این نمونه بیشتر سعی شده است که به تابع های جمع و منها و ضرب پرداخته شود به خصوص ضرب چون خیلی ها ضرب را بر اساس جمع های متوالی می نویسند که زمان زیادی را می برد و الگوریتم مناسبی نیست تابع ضرب ما دقیقا همان کاری را می کند که  انسان ها می کنند .البته تابع تقسیم در پست بعد نوشته خواهد شد ولی چون از تفریقهای متوالی استفاده شده همیشه سرعت خوبی ندارد پس استفاده نشده.

یکی از سوالات متداول این است که چگونه اعداد تصادفی با طول حداقل ۱۰۰و حداکثر ۱۰۰۰ کاراکتر به وجود بیاوریم .ساده ترین را این است که به صورت تصادفی طول رشته را تعیین کنیم و بعد خانه های رشته را تک تک پر کنیم(ولی این روش درست نیست زیرا تصادفی بودن ۱۰۰% نیست ولی ساده ترین روش است).که این کار را تابع getRandomNumber انجام می دهد.

تابع compare دو رشته را مقایسه می کند و می گوید ارزش کدام از لحاط ریاضی بزرگ تر است.

تابع Sub هم همان تابع تفریق است با نگاه کردن به کد می توانید به الگوریتم آن پی ببرید.

تابع add همان تابع جمع است که الگوریتم ساده ای دارد ولی باید به این نکته توجه شود که وقتی دو عدد ۱۰۰۰ رقمی را باهم جمع می کنید ممکن است عدد ۱۰۰۱ رقمی شود.

تابع big_sum تابع جمع برای اعداد ۲۰۰۰ رقمی است که در function ضرب به کار رفته تا اعداد حاصل شده در آن تابع را جمع نماید.

تابع mul همان تابع ضرب است فقط توجه داشته باشید وقتی دو عدد ۱۰۰۰ رقمی  را ضرب می کنید حداکثر عددی که به دست می آید عددی ۲۰۰۰ رقمی است (تابع big_sum  برای همین جاست)الگوریتم آن دقیقا مثل روش دستی خودتان برای ضرب کردن است.

نکته دیگر این است که برنامه محاسبات انجام شده توسط هر ماشین حساب را در فایلی به همان نام ذخیره می کند و نکته دیگر آن است که اعداد ذخیره شده در فایل طبق فرمت عدد است یعنی اگر فرمت عدد ۱۰۰۰ رقمی است و جواب ما ۱۵۰ رقمی است سمت چپ عدد ۸۵۰ صفر قرار دارد که از لحاظ ریاضی فرقی نمی کند.

سرعت محاسبات را می توانید در عکس زیر ببینید:

calculator-run

calculator-run



 

 

 

 

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

۱۲ comments

  • محمد واحدی

    سلام من یه مشکل دارم توروخدا کمکم کنید..
    یه ماشین حساب میخوام که یک رشته بگیره مثه: ۲+۳*۴-۲
    و بعد بر اساس اولویت عملگرها اونو محاسبه و جوابشو بده..
    میدونم سرتون شلوغه نمیشه بنویسید و به ایمیلم بفرستید..میشه لااقل الگوریتمشو بگید؟
    فوری لطفا

  • میشه این مسئله رو واسم حل کنید بعد برام بفرستیدش

    ماشین حساب: #C

    برنامه ای بنویسید که دو عدد از کاربر دریافت کند و یک علامت(بصورت رشته) با توجه به علامت اعمال + و- و* و/ و % و اگر نبود علامت را دوباره دریافت کنید.
    لطفا خیلی احتیاجش دارم خواهش می کنم

  • سلام برنامه جالبی بود با اجازتون من برای پروژه درس دانشگاه از تابع compareتون استفاده می کنم

  • سلام
    متشکرم بابت برنامه.
    توی DEV c++ اجرا نمیشه ؟

  • سلام.ببخشید کد تفریق شما فقط در حالتی که دو عدد با تعداد ارقام برابر و هرکدام فقط ۵۰ رقم باشند جواب میده.اگه ما دو تا string داشته باشیم که عدد ها هم معلوم نیست که تعداد ارقامشون برابر باشه یا نه اونوقت چطوری میشه؟
    ممنون

    • فرهاد دلیرانی

      سوالی که من اینجا حل کردم مربوط به اعداد هزار رقمی .ولی شما فکر کن یک عدد داری دیوست رقم است اون موقع شما می تونی هشتصد تا صفر پشتش بذاری و بفرستی به تابع.

Leave a Reply

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