استفاده از عملگرهای رياضياتی و کلاس Math
درس “استفاده از اپراتورهای ریاضی و کلاس Math در جاوا” به شما میآموزد که چگونه در زبان برنامهنویسی Java از انواع اپراتورهای ریاضی برای انجام عملیات مختلف مانند جمع، تفریق، ضرب و تقسیم استفاده کنید. همچنین، با مفاهیم پیشرفتهتر مانند اپراتور مدولوس آشنا میشوید و یاد میگیرید چگونه از کلاس Math برای انجام محاسبات پیچیدهتر و دقیقتر مانند رادیکالها، توابع مثلثاتی و محاسبات نمایی استفاده کنید. در این درس، علاوه بر آشنایی با این مفاهیم، نحوه استفاده از متغیرهای مختلف برای ذخیره و مدیریت دادهها در برنامههای کاربردی جاوا نیز بررسی میشود، که این مهارتها برای توسعهدهندگان و مهندسان نرمافزار در پروژههای عملی و پیچیده بسیار حائز اهمیت است.
یکی از ضروریترین کارها در کدنویسی اجرا یکسری عملیات ریاضی روی مقادیر عددی است. در این بخش میخواهم نحوه استفاده از عملگرهای ریاضی را به شما آموزش بدهم. و همینطور شما را با کلاس math و متدها و توابع آن که با استفاده از آنها قادر به انجام عملیات پیچیده ریاضی هستیم، آشنا میکنم.
زبان جاوا عملیات ریاضی استاندارد را پشتیبانی میکند، البته این عملیاتی است که انتظارش را دارید آنها را در همه زبانهای برنامه نویسی ببینید و جاوا از این مقوله مستثنی نیست. همچنین جاوا با استفاده از کلاس خاصی به نام Math سایرعملیات پیچیده را هم پشتیبانی میکند.
در حال حاضر من دارم روی پروژه Math کار میکنم.
و با اعلان دو متغیر integer کارم را شروع کردم.
با نامهای intValue1 و intValue2. و مقدار اولیه 56 و 42 را برای آنها اختصاص میدهم. حالا میخواهم با استفاده از یک کد معروف این دو متغیر را با هم جمع کنم.
پس یک متغیر integer دیگر اعلان میکنم و نام آنرا میگذارم result1 و مقدارش را میخواهم جمع دو مقدار intValue1 و intValue2 بگذارم.
پس تایپ میکنم intValue1 بعلاوه intValue2.
همانطور که میبینید خیلی ساده از علامت جمع برای جمع این دو مقدار استفاده کردم.
خب؛ حالا با استفاده از دستور معروف system.out.println و برچسب “Addition: ” و بعد هم اضافه کردن متغیر result1 ام، نتیجه را در خروجی کنسولی چاپ میکنم.
و از کدم اجرا میگیرم.
و میبینیم که خروجیای که انتظارش را داشتیم یعنی جمع دو مقدار 56 و 42 که میشود 98 را بدرستی نمایش میدهد.
حالا میخواهم این دو خط کد مربوط به متغیر result و چاپ در خروجی را کپی کنم و چهار بار آنرا پاست و تکرار کنم، به این شکل.
برای اینکه میخواهم چهار عملیات دیگر را هم تعریف کنم و در خروجی چاپ کنم. پس فقط میآیم عملگری را که میخواهم بین intValue1 و intValue2 جایگذاری میکنم.
اول عملگر منها را استفاده میکنم، بعد عملگر ضرب، که در جاوا با علامت ستاره مشخص میشود و بعد عملگر تقسیم که این علامت اسلش است را اضافه میکنم. و در نهایت عملگر باقیمانده تقسیم که کاراکتر درصد برای آن استفاده میشود، را میآیم و اضافه میکنم.
حالا میآیم برچسبهای آنها را تغییر میدهم که با عملگری که استفاده کردم مچ شوند.
به ترتیب subtraction و multiplication و division و remainder.
و از کدم اجرا میگیرم.
خب؛ همانطور که میبینید برای سه عملیات اول و همینطور عملیات آخر جوابی که انتظار داشتیم نمایش داده شده و خروجی دقیقاً همان چیزی است که انتظار داشتیم. یعنی عملگرهای جمع، منها، ضرب و همینطور عملگر باقیمانده تقسیم همگی جواب درستی نشان میدهند. ولی عملگر تقسیم به طور کامل جوابش درست نیست.
حالا دلیلش را میگویم.
ببینید؛ در جاوا هر موقع که بین چند داده یا مقدار عملیات ریاضیای انجام میدهید، نوع داده نتیجهای که به ما برگردانده میشود، برابر بزرگترین یا وسیعترین نوع دادهای است که در هر قسمت آن وجود دارد. مثلاً اگر دو داده int و byte را با هم جمع کنید نوع داده نتیجه، میشود از نوع اینت، که بزرگتر است و به همین ترتیب اگر سه داده اینت و دابل و بایت را با هم جمع کنید نوع داده نتیجه میشود دابل که از بین این سه تا نوع داده بزرگتر است.
پس اینجا که من با دو تا متغیر اینت کار میکنم، مقدار اینت هم به من برگردانده میشود و اگر با دو تا دابل کار میکردم دابل میگرفتم. ولی اگر با یک دابل و یک اینت کار کنم، باز هم نوع داده نتیجه دابل خواهد بود. برای انجام عملیاتهایی که مقدار اعشاری دارند و جاهایی که انتظار میرود نتیجه عملیات اعشاری برگردانده شود، مجبوریم که با مقدار دابل یا float کار کنیم.
پس الان میآیم از دستور نحوی casting برای تبدیل نوع استفاده میکنم و با گذاشتن دابل داخل پرانتز قبل از انجام عملیات میگویم که خروجی این عبارت، نتیجه این عبارت یک مقدار دابل است نه یک اینت. ولی یک ارور به وجود میآید.
کلیدهای میانبر آلت یا آپشن و اینتر یاreturn را فشار میدهم و لیست پیشنهادی برای من باز میشود.
در این لیست میبینیم که گزینه Cast to ‘int’ را داریم، ولی این چیزی نیست که من میخواهم یعنی نمیخواهم چیزی را به اینت تبدیل کنم، و در واقع نوع داده مبدأ من اینت است.
گزینه بعدی میگوید Change variable ‘result4’ type to ‘double’ یعنی نوع داده ‘result’ تبدیل به دابل بشود، و این چیزی است که من میخواهم.
پس آنرا انتخاب میکنم.
بنابراین چون میخواهم که مقدار بازگشتی من یک مقدار اعشاری باشد، پس با این عملکرد نوع داده نتیجه را از ابتدا یک نوع داده مناسب تعیین میکنم. در واقع نوع داده متغیر result4 من باید از نوع دابل و اعشاری باشد.
پس یکبار دیگر کدم را اجرا میکنم، و اینبار میبینیم که نتیجهای که انتظارش را داشتیم به ما میدهد.
معمولاً، این کار را برای عملگر باقیمانده هم انجام میدهند.
یعنی همان عملیات قبلی را میآیم مجدد برای باقیمانده هم انجام میدهم و نوع داده int برای result5 را هم به دابل تبدیل میکنم.
و اجرا میگیرم.
میبینیم که هنوز نتیجه همان 14 است، با این تفاوت که اینبار 14.0 را نشان میدهد.
خب؛ تا اینجا کار عملگرها و تنظیمات مربوط به نوع دادههای مختلف و نحوه نمایش درست نتیجه را در خروجی را یاد گرفتید.
همانطور که در ابتدا اشاره کردم، شما میتوانید عملیات پیچیدهتری هم با استفاده از این کلاس Math انجام بدهید.
کلاس Math عضوی از پکیجِ Java.lang است، بنابراین برای استفاده از آن نیازی به هیچ ایمپورت یا کد خاصی نیست. میتوانید به راحتی با کلمه Math شروع کنید، البته با یک M بزرگ چونکه این اسم مربوط به شناسه کلاس است، و بعد هر متدی که میخواهید استفاده کنید را فراخونی کنید. مثلاً برای یک نمونه میخواهم یک مقدار را گرد کنم.
پس یک متغیر دیگر اعلان میکنم، اینبار از نوع دابل با نام doubleValue و مقدار آنرا میگذارم منفی 3.99999.
حالا میخواهم این مقدار را گرد کنم.
یک متدی در کلاس Math است با نام round که نوع بازگشتی آن long است.
پس میآیم یک متغیر از جنس long اعلان میکنم و نام آنرا میگذارم rounded و کلاس Math را فراخونی میکنم و با گذاشتن یک دات، یک لیست از همه متدهای مختلفی که از این کلاس در دسترس ما هستند باز میشود.
شروع میکنم به تایپ کلمه round و میبینیم که دو نسخه از این متد اینجا است، یکی برای گرد کردن نوع دابل و یکی هم برای گرد کردن نوع float است.
من از نسخه دابل استفاده میکنم و متغیر double value خود را به آن میدهم.
و نتیجه را در خروجی کنسولی نمایش میدهم.
با دستور system.out.println، برچسب آنرا میگذارم “Rounded: ” و بعد هم متغیر rounded را به آن اضافه میکنم.
وقتی کدم را اجرا میکنم، میبینم که مقدار گرد شده rounded من -4 است.
در واقع متد round میآید عددی که گرفته را به نزدیکترین عدد صحیح گرد میکند. که در اینجا 4- است.
ولی حالا میخواهم از تابعی استفاده کنم که این مقدار را بگیرد و قدر مطلق آنرا بدهد. یعنی همیشه مقدار مثبت را برگرداند.
اینبار یک متغیر دابل اعلان میکنم و اسم آنرا میگذارم absValue و Math.abs را برای آن صدا میزنم.
توجه داشته باشید که نسخههای مختلفی از این متد برای نوع دادههای عددی مختلف وجود دارد.
من نسخهای را که یک مقدار دابل میگیرد را انتخاب میکنم و متغیر doubleValue خود را به آن میدهم.
و با دستور system.out.println آنرا در خروجی چاپ میکنم.
و برچسب آنرا میگذارم “Absolute: ” و متغیر absValue هم به آن اضافه میکنم.
و بعد اجرا کد. اینبار به کمک میانبرهای شیفت و F10 میبینیم که مقدار مثبت 3.99999 را نشان میدهد.
کلاس Math از بسیاری از عملگرهای دیگر هم پشتیبانی میکند. برای اطلاعات بیشتر میتوانید به راهنما Help آن بروید و سرچ کنید و ببینید که چه توابع دیگری در این کلاس وجود دارند و این کلاس قادر به انجام چه عملیات دیگری است.
من کرسرم را روی نام این کلاس قرار میدهم و شیفت و f1 را فشار میدهم تا اطلاعات مربوط به این کلاس برای من باز شود.
ممکن است یک منو بازشو شامل منابع مختلف help برای شما باز شود، میتوانید یکی از آنها را بدلخواه انتخاب کنید.
بعد من روی قسمت METHOD میروم و کلیک میکنم و یک لیست از همه متدهای مختلف که اعضا این کلاس هستند برای من باز میشود.
توجه داشته باشید که متدهای مختلف، بسته به نوع عملیاتی که میخواهند انجام دهند نوع بازگشتیشان متفاوت است.
ولی همه آنها static هستند.
یعنی اینکه شما میتوانید به صورت مستقیم و بدون ایجاد یک شیء از جنس این کلاس این متدها را از کلاس Math فراخونی کنید.
مثل Math.round و Math.abs که من در اینجا بکارشان بردم.
در واقع متدهای غیر استاتیک به این شکل هستند که برای فراخونی آنها اول باید یک شیء از جنس کلاسشان ایجاد کنیم و بعد از آن شیء متد مورد نظر را فراخونی کنیم، در صورتی که برای متدهای استاتیک میشود بصورت مستقیم از کلاسشان آنها را فراخونی کنید.
یعنی شما نیازی به ایجاد یک نمونه از کلاس Math برای فراخونی متدهای این کلاس ندارید. کلاس Math و عملگرهای ریاضی موجود در آن به شما این امکان را میدهند که هر عملیات ریاضیای که بخواهید را روی متغیرهایتان انجام بدهید.