ایشون درست گفتن اما وقتی دوتا عدد صحیح به هم تقسیم میشن حاصل یه عدد صحیح بعد شما اونو داخل یه متغیر اعشاری میبرید که اعشارش 0 میشه متوجه شدین؟نقل قول:
نوشته شده توسط hanymg [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]ولی متغیر double شامل اعشاری هم میشه(البته دبیر کامپیوترمون اینجوری گفته) خواهشا برنامش رو می تونین برام بنویسین؟؟؟؟؟
الببه خیلی ممنون که جواب دادین:n01:
مثال
4/3=1 خب شما فقط متغییری که حاصل توش ذخیره میشه رو اعشاری تعریف کردین بهخاطر همین فرقی نمیکنه درستش اینه که
4.0/3.0=1.3333333333
که حالا اینجا متغییرهای که حاوی 4 و 3 هستن هم اعشاری هستن(i,sum) توجه کنید اگه حالا متغییر میانگین رو صحیح در نظر بگیرین بازم جواب 1 میشه چون قابلیت ذخیره اعشار رو نداره
برای اطلاعات بیشتر این متن رو بخونید
محتوای مخفی: اینجا
تبدیل (cast) انواع داده ای
در ++C انواع مختلفی برای داده ها وجود دارد، مثل int و float و ... و گاهی پیش می آید که بخواهیم این انواع را تبدیل کنیم. مثلاً دو عدد اعشاری را داریم اما مجموع آنها را فقط بطور صحیح لازم داریم (و میخواهیم به یک متغیر int انتساب دهیم)، پس باید مثلاً نوع float به int تبدیل شود تا حاصل جمع در یک متغیر int ریخته شود. این تبدیل ها میتواند برای انواع داده ای تعریف شده توسط برنامه نویس هم انجام شود که در جای خود توضیح داده میشود. به انواعی که از ابتدا درون زبان وجود دارند (بدون تعریف برنامه نویس) انواع درونی (integral) میگویند. در اینجا بر اساس انواع درونی مثال می آوریم که برای انواع تعریف شده توسط کاربر هم همینگونه است اما به کار اضافی نیاز دارد.
دو نوع تبدیل وجود دارد: (ضمنی)implicit و (صریح)explicit
اساس عمل تبدیل: هرجا که کامپایلر انتظار استفاده از نوعی را داشته باشد اما نوع دیگری استفاده شود، اگر امکان داشته باشد خودش تبدیل میکند (implicit) وگرنه باید برنامه نویس خودش تبدیل کند (explicit).
نکته: برنامه نویس میتواند هر کجا که مجاز باشد از تبدیل صریح استفاده کند (حتی جایی که نیازی نباشد). مثلاً برای چاپ (با cout) کد اسکی یک متغیر از نوع char میتوان char را بطور صریح به int تبدیل کرد و سپس به خروجی فرستاد.
تبدیل implicit
قسمتی از تبدیل ها را خود کامپایلر برای شما انجام میدهد. مثلاً اگر f از نوع float با مقدار 2.3 باشد و i از نوع int باشد، حالا با انتساب f به i مقدار 2.3 به 2 تبدیل میشود و درون i ریخته میشود (البته مقدار f بدون تغییر خواهد ماند).
از دست رفتن داده ها (loss of data)
در اینجا کامپایلر یک warning میدهد که تبدیل float به int احتمال از دست رفتن داده ها را در پی دارد. مثلاً در اینجا سه دهم از 2.3 حذف خواهد شد، یعنی از دست میرود، اما اگر f مقدار 2 داشت (قسمت اعشاری نداشت) هیچ داده ای از دست نخواهد رفت و همان 2 در i ریخته میشود. پس باید در تبدیل ها به احتمال از دست رفتن داده ها توجه داشت، حتی ممکن است یک کامپایلر هشدار هم ندهد و ما از دست رفتن داده ها را متوجه نشویم. بهرحال با تبدیل انواعی که میتوانند مقادیری را نگه دارند که نوع تبدیل شده (مقصد) نمیتواند نگه دارد، احتمال از دست رفتن داده ها وجود دارد. مثلاً تبدیل float یا double به int یا تبدیل int به short int یا char (حتی در تبدیل int به float هم هشدار دریافت میکنید، چون int مقادیر صحیح بزرگتری نسبت به float نگه میدارد، در چنین جایی برای نگه داری تمام مقادیر ممکن میتوان از double بجای float استفاده کرد).
کوچک سازی (truncation)
حتی هنگام تعریف f بصورت float f = 2.3 شما یک هشدار truncation (کوتاه سازی) از double به float را دریافت میکنید، چراکه خود 2.3 هم یک نوع دارد (literal ها هم نوع دارند) و نوعش double است و هنگام ریخته شدن در f به float تبدیل میشود و چون float مقادیر کوچکتری را نگه میدارد پس ممکن است قسمتی از داده ها از دست برود (مثلاً دقت اعشاری کاهش یابد).
پس جایی که خود زبان تشخیص دهد که باید به چه نوعی تبدیل صورت گیرد خودش اینکار را انجام میدهد وگرنه خطا میدهد و باید از تبدیل نوع صریح استفاده کنیم.
تبدیل explicit
این تبدیل توسط خود برنامه نویس با نوشتن دستوراتی درون کد برنامه انجام میشود. مثلاً وقتی هنگام انتساب f از نوع float به i از نوع int بنویسید
i = (int)f دیگر هشداری دریافت نمیکنید چون گذاشتن (int) قبل از f آنرا به صراحت به int تبدیل میکند و سپس در i میریزد. میتوان تبدیلات صریح را بگونه ای مثل (int(f هم نوشت که f را به int تبدیل میکند.
عملگرهای تبدیل صریح
تبدیل صریح را میتوان با عملگرهای خاصی که در ++C وجود دارد هم انجام داد تا وضوح نوع تبدیل بالاتر رود. برای تبدیل یک نوع به دیگری از (static_cast (expression استفاده میشود که در آن type نوع مقصد و expression عبارتی است که میخواهیم نوعش تبدیل شود. مثلاً (static_cast (f نوع مقدار متغیر f را به int تبدیل میکند و برمیگرداند (البته نوع مقداری که برمیگرداند int میشود و f بدون تغییر میماند).
برای یک تبدیل که نوع تفسیر بیت ها را تغییر میدهد از (reinterpret_cast (expression استفاده کنید، مثلاً
(reinterpret_cast(p اگر p از نوع *void باشد به unsigned int تبدیل میکند، یعنی تفسیری که از بیت ها میشد یک اشاره گر بود اما مقدار برگشتی یک متغیر غیر اشاره گر از نوع unsigned int در نظر گرفته میشود.
برای تبدیل یک اشاره گر به متغیر const (که نمیتواند مقدار آنرا تغییر دهد) به همان نوع اشاره گر اما به متغیر غیر const (که بتواند مقدار متغیر را تغییر دهد) از (const_cast (expression استفاده میشود. مثلاً (const_cast (ptr ، اگر ptr از نوع *const int باشد، اشاره گر برگشتی همان مقدار ptr را دارد اما با آن میتوان مقدار متغیری که اشاره میشود را تغییر داد.