گفتگو هایی در باب سی شارپ

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام سجاد جان

1- من تو قسمت 4 با گفته های شما به این نتیجه رسیدم (خودم تایپ کردم)

عکس

اما تو قسمت 5 شما گفتی اون اشتباهه لطف می کنی عکس اول رو اصلاح کنی که به هرکدوم دقیقا چی میگن

عکس

2- کدوم راه حل درسته نوشتن byte یا Byte و یا نوشتن short یا Int16 یا نوشتن float یا single شما کدوم رو اصولی تر می دونی یا تو نسخه های اینده مایکروسافت کدوم رو توصیه می کنه
من خودم موندم که با این همه نوع متغیر که حفظ کردنشون سخته چرا مایکروسافت برای هر نوع دو اسم تعیین کرده

سلام آقا رامین
این نکته رو بگم که البته چیزهایی که میگم ، طبق دانسته های خودمه و اگه اشتباه میکنم ، استاد علی همیشه زحمت اصلاح شو کشیدن که ازشون خیلی ممنونم
-------------------------
1) عکس دوم اصولی تره
2) فرقی ندارن . یکی کلمه ی کلیدی هست ، یکی دیگه ، فضای نامی که همون استراکچر و کلاس پیاده سازی شده . کلا از هر کدوم از روش ها برین ، هیچ فرقی با هم ندارن . اصولی تر شاید اونی باشه که با کلمه ی کلیدی برین یعنی byte و short و ... . ولی کلا هیچ فرقی ندارن
اوایل یک کم سخته . آروم آروم که فیلم رو پیگیری کنین ، اتوماتیک توی ذهن میشینه چون خیلی با این انواع داده ای کار شد
 

SU-57

Active Member
سلام آقا رامین
این نکته رو بگم که البته چیزهایی که میگم ، طبق دانسته های خودمه و اگه اشتباه میکنم ، استاد علی همیشه زحمت اصلاح شو کشیدن که ازشون خیلی ممنونم

سجاد جان من که C# رو بلد نیستم بنابراین هرچی شما بگی من همون رو یاد می گیرم و نمی دونم که درسته یا نه ولی تا اینجا هر چی شما گفتی تو ویژوال تست کردم درست بوده
این سوالاتی هم که می کنم شاید تو کدها فرقی نداشته باشه مثلا اینکه int کلاسه یا شی فکر نمی کنم مهم باشه ولی من دوست دارم بدونم (زیادی کنجکاو هستم)

این رو هم اضافه کنم اگه می بینی من هنوز تو قسمت 5 گیر کردم برای اینه که من هر قسمت رو دوبار می بینم و بعد توی ویژوال تست می کنم و نکات مهمش رو هم یادداشت می کنم برای همین نمی تونم سریع پیش برم

بعد اگه می بینی من سوال می پرسم باید همون موقع بدونم که این مطلب چیه ولی شاید شما تو قسمت های دیگه اون رو گفته باشی ولی من برای اینکه بفهمم باید همون موقع معنیش رو بدونم

******

الان عکس زیر رو نگاه کن من می خوام بدونم چرا decimal اعشاری محسوب می شه مگه ده دهی نیست و اینکه چرا باید جلوی مقدار float حرف f و جلوی decimal حرف m بذاریم. مگه نباید اینا توسط مایکروسافت تفکیک شده باشن تو ویژوال
بعد اینکه چرا شما وقتی decimal نوشتی 10.5 قرار دادی مثلا من می گم اگه decimal رو برای اعداد رند مثلا 1000 یا 1100 بکار ببریم بهتر باشه و حالا نمی دونم اگه مقدار متغیر decimal رو 1000 قرار بدیم باز هم باید جلوش m بذاریم

عکس
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سجاد جان من که C# رو بلد نیستم بنابراین هرچی شما بگی من همون رو یاد می گیرم و نمی دونم که درسته یا نه ولی تا اینجا هر چی شما گفتی تو ویژوال تست کردم درست بوده
این سوالاتی هم که می کنم شاید تو کدها فرقی نداشته باشه مثلا اینکه int کلاسه یا شی فکر نمی کنم مهم باشه ولی من دوست دارم بدونم (زیادی کنجکاو هستم)

این رو هم اضافه کنم اگه می بینی من هنوز تو قسمت 5 گیر کردم برای اینه که من هر قسمت رو دوبار می بینم و بعد توی ویژوال تست می کنم و نکات مهمش رو هم یادداشت می کنم برای همین نمی تونم سریع پیش برم

بعد اگه می بینی من سوال می پرسم باید همون موقع بدونم که این مطلب چیه ولی شاید شما تو قسمت های دیگه اون رو گفته باشی ولی من برای اینکه بفهمم باید همون موقع معنیش رو بدونم

******

الان عکس زیر رو نگاه کن من می خوام بدونم چرا decimal اعشاری محسوب می شه مگه ده دهی نیست و اینکه چرا باید جلوی مقدار float حرف f و جلوی decimal حرف m بذاریم. مگه نباید اینا توسط مایکروسافت تفکیک شده باشن تو ویژوال
بعد اینکه چرا شما وقتی decimal نوشتی 10.5 قرار دادی مثلا من می گم اگه decimal رو برای اعداد رند مثلا 1000 یا 1100 بکار ببریم بهتر باشه و حالا نمی دونم اگه مقدار متغیر decimal رو 1000 قرار بدیم باز هم باید جلوش m بذاریم

عکس

کلا گفتم . ربطی به موضوع این پست نداره . همونطور که گفتم ، در سی شارپ مبتدی هستم و امکان اشتباه هست ولی سعی میکنم قبل اش تحقیق کنم که اشتباهی وجود نداشته باشه .
به نظرم اون قدر کنجکاوی نکنی که فراتر از اون جلسه رو خیلی بخوای زیادتر یاد بگیری ، بهتره چون همونطور که قبلا گفتم ، برنامه نویسی مخصوصا شی گراش ، بصورت زنجیروار مانند به هم متصل اند مباحث اش . این کاملا طبیعی هست که در 50 حلسه ی اول ، مدام سئوالات مبهم برات پیش بیاد که هر چی به جلوتر بری ، ابهام (ابهام کلی) ، کمتر و کمتر میشه بنابراین توصیه ام اینه که در هر جلسه ، فقط در همون حد (یا تهش اندکی بیشتر) ، اکتفا و تمرین کنی ، کافی هست و خیلی لازم نیست جلوتر بری چون خیلی از سئوالات رو در جلسات بعدی (تا حدودا پایان 50 قسمت اول) ، جواب میگیری
البته نکات مهم رو یا تاکید میکنم یا توی paint مینویسم و فقط کافیه همونا رو یادداشت کنی
-------------------------
int کلاس هه . شی ، چیزی هست که سمت راست اش (عدد) مینویسیم . یعنی عدد ، شی هست و int کلاس هست . اتفاقا اینا مهم هستن که آروم آروم این مباحث ، بصورت کامل گفته شد
decimal رو مایکروسافت جزء اعداد اعشاری طراحی کرد . مثل float و ...
هر مقداری ، یک نوع داده ای پیش فرض داره . مثلا اعداد رند ، بصورت پیش فرض int هستن . اعداد اعشاری هم بصورت پیش فرض double هستن . منتها اعداد اعشاری اگه در نوع داده ای غیر پیش فرض ( مثل float و decimal) بخوایم ذخیره کنیم ، باید حرف مربوط بهش (برای float کلمه ی f و ...) رو آخر مقدارش قرار بدیم . البته اگه فراموش کنیم هم خود ویژال استودیو توی خطاهاش به ما پیام میده که راحت یادمون میاد
توی decimal و هر نوع داده ای ، هر مقداری (تا سقف مجازش که از روی تعداد بایت هایی که نوع داده اشغال میکنه ، متوجه میشیم) میتونیم بریزیم . البته شی و مقداری که میریزیم ، باید مقدار مجاز هم برای اون نوع بااشه . حالا من 10.5 توش گذاشتم . هر مقدار مجاز دیگه ای میشه توش گذاشت و مقداری که قرار میدیم ، بهتر و بدتر نداره . هر مقداری هم قرار بدیم ، برای نوع decimal ، باید جلوش M رو بذاریم
 

SU-57

Active Member
توی decimal و هر نوع داده ای ، هر مقداری (تا سقف مجازش که از روی تعداد بایت هایی که نوع داده اشغال میکنه ، متوجه میشیم) میتونیم بریزیم . البته شی و مقداری که میریزیم ، باید مقدار مجاز هم برای اون نوع بااشه . حالا من 10.5 توش گذاشتم . هر مقدار مجاز دیگه ای میشه توش گذاشت و مقداری که قرار میدیم ، بهتر و بدتر نداره . هر مقداری هم قرار بدیم ، برای نوع decimal ، باید جلوش M رو بذاریم

کد:
decimal a = 1000;
MessageBox.Show(a.ToString());
من امتحان کردم اگه عدد رند قرار بدیم نیازی نیست جلوش M بذاریم اما اگه عدد اعشاری قرار بدیم باید M بذاریم
بعد این M مخفف چه کلمه ای است
 

the_king

مدیرکل انجمن
2- کدوم راه حل درسته نوشتن byte یا Byte و یا نوشتن short یا Int16 یا نوشتن float یا single شما کدوم رو اصولی تر می دونی یا تو نسخه های اینده مایکروسافت کدوم رو توصیه می کنه
من خودم موندم که با این همه نوع متغیر که حفظ کردنشون سخته چرا مایکروسافت برای هر نوع دو اسم تعیین کرده
دلیلش اینه که یه زبان برنامه نویسی #C داریم و یه NET Framework. که مستقل از #C ئه و برای استفاده همه زبان های NET. ای است، نه فقط #C
موقعی که NET Framework. رو طراحی می کردن الزامی نبوده که دقیقا با #C تطبیق اش بدن، دو چیز مجزا هستند که با هم کار می کنند.
توی زبان #C کلمه کلیدی byte هست ولی Byte نیست، Byte یا همون System.Byte یک مورد جداست و مربوط به NET Framework. ئه. ممکنه کسی برای #C یک کامپایلر جدید بنویسه و بجای System.Byte یک نوع داده دیگه رو برای byte بکار ببره. این مساله مربوط به زبان #C نیست، مایکروسافت در پیاده سازی NET. ئه زبان #C اینکار رو کرده.

الان عکس زیر رو نگاه کن من می خوام بدونم چرا decimal اعشاری محسوب می شه مگه ده دهی نیست و اینکه چرا باید جلوی مقدار float حرف f و جلوی decimal حرف m بذاریم. مگه نباید اینا توسط مایکروسافت تفکیک شده باشن تو ویژوال
بعد اینکه چرا شما وقتی decimal نوشتی 10.5 قرار دادی مثلا من می گم اگه decimal رو برای اعداد رند مثلا 1000 یا 1100 بکار ببریم بهتر باشه و حالا نمی دونم اگه مقدار متغیر decimal رو 1000 قرار بدیم باز هم باید جلوش m بذاریم
تو مباحثی که به کامپیوتر واگذار میشه قطعیت خیلی مهمه، فرضا با حدس زدن نمیتونه کدی رو کامپایل کنه، باید قاطعانه نوع داده قابل تشخیص باشه. هر مقداری که اعشاری باشه پیشفرض اش double ئه مگر اینکه به دلیلی امکانش نباشه. هر مقدار صحیح بدون اعشاری هم پیشفرضش int ئه. و بین float و double و decimal و int خیلی تفاوتهای محاسباتی هست، کلا ساختار decimal با double/float و کاربردشون فرق داره. decimal ممیز ثابت داره، float و double ممیز شناور دارن. تو محاسبات کسری این نوع ممیز تاثیر مهمی میذاره. به همین جهت کامپایلر نمیتونه و نباید با حدس زدن کاری انجام بده، مخصوصا تو محاسبات حساس علمی و مالی که یه ریزه اعشار هم نباید خطا باشه یه تغییر نوع داده نتیجه رو میتونه به کلی تغییر بده.
کد:
            int i = (1 / 3) * 3;
            float f = (1F / 3) * 3;
            double d = (1D / 3) * 3;
            decimal m = (1M / 3) * 3;
            MessageBox.Show(string.Format("{0} {1} {2} {3}", i, f, d, m));
وقتی یک مقدار محاسبه میشه و در یک متغیر قرار میگیره اول بخش محاسباتش انجام میشه، در بخش محاسبات هم کاری ندارن که قراره بعدا داخل چه متغیری قرار بگیره، اگر محاسبه (3 / 1) باشه، هم 1 و هم 3 عدد int فرض می شوند چون مقدار پیشفرض مقادیر صحیح بدون اعشاره، کامپایلر به این فکر نمی کنه که چون بعدا میخواد این مقدار رو داخل یک متغیر فرضا float قرار بده پس از الان 1 و 3 رو اعداد float در نظر بگیرم. همچین منطقی نداره، برای همین اون suffix هایی مثل F و M اهمیت پیدا می کنند. و در نظر بگیرید که از نظر فنی کسری مثل 1/3 که تقریبا میشه 0.33333 همیشه خرده اعشار نادیده گرفته شده داره، مقدار float و double و decimal اش هم هیچوقت دقیقا با هم برابر نیستند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
دلیلش اینه که یه زبان برنامه نویسی #C داریم و یه NET Framework. که مستقل از #C ئه و برای استفاده همه زبان های NET. ای است، نه فقط #C
موقعی که NET Framework. رو طراحی می کردن الزامی نبوده که دقیقا با #C تطبیق اش بدن، دو چیز مجزا هستند که با هم کار می کنند.
توی زبان #C کلمه کلیدی byte هست ولی Byte نیست، Byte یا همون System.Byte یک مورد جداست و مربوط به NET Framework. ئه. ممکنه کسی برای #C یک کامپایلر جدید بنویسه و بجای System.Byte یک نوع داده دیگه رو برای byte بکار ببره. این مساله مربوط به زبان #C نیست، مایکروسافت در پیاده سازی NET. ئه زبان #C اینکار رو کرده.


تو مباحثی که به کامپیوتر واگذار میشه قطعیت خیلی مهمه، فرضا با حدس زدن نمیتونه کدی رو کامپایل کنه، باید قاطعانه نوع داده قابل تشخیص باشه. هر مقداری که اعشاری باشه پیشفرض اش double ئه مگر اینکه به دلیلی امکانش نباشه. هر مقدار صحیح بدون اعشاری هم پیشفرضش int ئه. و بین float و double و decimal و int خیلی تفاوتهای محاسباتی هست، کلا ساختار decimal با double/float و کاربردشون فرق داره. decimal ممیز ثابت داره، float و double ممیز شناور دارن. تو محاسبات کسری این نوع ممیز تاثیر مهمی میذاره. به همین جهت کامپایلر نمیتونه و نباید با حدس زدن کاری انجام بده، مخصوصا تو محاسبات حساس علمی و مالی که یه ریزه اعشار هم نباید خطا باشه یه تغییر نوع داده نتیجه رو میتونه به کلی تغییر بده.
کد:
            int i = (1 / 3) * 3;
            float f = (1F / 3) * 3;
            double d = (1D / 3) * 3;
            decimal m = (1M / 3) * 3;
            MessageBox.Show(string.Format("{0} {1} {2} {3}", i, f, d, m));
وقتی یک مقدار محاسبه میشه و در یک متغیر قرار میگیره اول بخش محاسباتش انجام میشه، در بخش محاسبات هم کاری ندارن که قراره بعدا داخل چه متغیری قرار بگیره، اگر محاسبه (3 / 1) باشه، هم 1 و هم 3 عدد int فرض می شوند چون مقدار پیشفرض مقادیر صحیح بدون اعشاره، کامپایلر به این فکر نمی کنه که چون بعدا میخواد این مقدار رو داخل یک متغیر فرضا float قرار بده پس از الان 1 و 3 رو اعداد float در نظر بگیرم. همچین منطقی نداره، برای همین اون suffix هایی مثل F و M اهمیت پیدا می کنند. و در نظر بگیرید که از نظر فنی کسری مثل 1/3 که تقریبا میشه 0.33333 همیشه خرده اعشار نادیده گرفته شده داره، مقدار float و double و decimal اش هم هیچوقت دقیقا با هم برابر نیستند.

سلام
ممنون استاد علی
هر چند مباحث پست قبلی موند (میخواستم تحقیق بیشتر کنم و سئوال تونو جواب بدم و پرسش هایی بپرسم وقتی توی آموزش به اون قسمت ها برسم) ولی درباره ی اینی که گفتید ، هر چند ممیز شناور و غیر شناور رو نمیدونم چیه اما پس decimal دقتش بیشتره ؟
یا سئوال رو به این نحو بپرسم که یه عدد (عدد یک) تقسیم بر عدد دیگه بشه (در بالا که تقسیم بر 3 رو مثال زدید) و دوباره ضربدر همون عدد بشه (بازم 3) ، جوابش همون عدد (عدد یک) نمیشه؟ یعنی الان جواب درست تر، عدد 1 هست یا عدد 0.99999999999 ؟!!
از دو روش و دو منطق ، انگار هر دو باید درست بشه . هم عدد 1 و هم عدد 0.999999999
 

the_king

مدیرکل انجمن
کد:
decimal a = 1000;
MessageBox.Show(a.ToString());
من امتحان کردم اگه عدد رند قرار بدیم نیازی نیست جلوش M بذاریم اما اگه عدد اعشاری قرار بدیم باید M بذاریم
بعد این M مخفف چه کلمه ای است
بله، به این دلیل که محدوده ارقام int در decimal بطور کامل جا میشه و مشکلی پیش نمیاد و برای همین دلیلی برای خطا وجود نداره.
اما این به این معنی نیست که M برای اعداد صحیح بدون اعشار اصلا بدرد نمیخوره یا کاربردی نداره. به عنوان مثال عدد 80000000000000000000 نه در int جا میشه و حتی در long جا نمیشه، اما در decimal جا میشه، همچین رقمی رو باید بصورت 80000000000000000000M نوشت.
تبدیل بعضی از انواع داده به یکسری انواع دیگه همیشه بدون اشکال انجام میشه و در بعضی انواع دیگه ممکنه معادل دقیقی وجود نداشته باشه و بعضی انواع داده هم به انواع مشخص دیگری قابل تبدیل نباشه.
M مخفف Money ئه. اینکه به پول ربطش دادن بخاطر کاربردش در محاسبات مالی ئه. در محاسبات ممیز شناور ماهیت ارقام تقریبی ئه و الزاما دقیق ثبت نمیشن مثلا 12345678 رو ممکنه 12345680 ثبت کنه. برای همین نتیجه محاسبات در انواع داده float و double الزاما دقیق نیست و مقداری اینور و اونور میشه، گو اینکه بازه رقم خیلی بزرگی دارند. انواع داده int و long هم با وجود دقت بالاشون ارقام اعشاری رو قبول نمی کنند و در ضمن بازه رقم خیلی بزرگی ندارند. در محاسبات مالی که یک ریال هم یک ریال ئه و بازه رقم ممکنه خیلی بالا باشه، از نوع داده decimal استفاده می کنند که هم محدوده رقم و دقت قابل توجهی داره و هم قابلیت نگهداری ارقام اعشاری رو داره.
 

the_king

مدیرکل انجمن
سلام
ممنون استاد علی
هر چند مباحث پست قبلی موند (میخواستم تحقیق بیشتر کنم و سئوال تونو جواب بدم و پرسش هایی بپرسم وقتی توی آموزش به اون قسمت ها برسم) ولی درباره ی اینی که گفتید ، هر چند ممیز شناور و غیر شناور رو نمیدونم چیه اما پس decimal دقتش بیشتره ؟
بله، دقت decimal بیشتره، خیلی بیشتر از float و double.
یک دیدگاه اینچنینی رو در نظر بگیرید که بگه عددی مثل 12300000000000 یا 0.0000000000123 یا 12.3 فقط سه رقم با ارزش دارند، فقط ارقام 123 با ارزش اند، بقیه اش صرفا رقم های 0 ئه که بی ارزش هستند.
در عددی مثل 1002400000 یا 10.024 یا 0.0000100240 صرفا 10024 اش با ارزش ئه و بقیه اش صرفا رقم های بی ارزش 0 ئه. ممیز شناور دقیقا همین دید رو به ارقام داره، صرفا یک تعداد محدود و مشخصی ارقام با ارزش رو به همراه تعداد صفر های اینور و اونور ممیز شناور ثبت می کنه، خود 0 های بی ارزش رو ثبت نمی کنه، صرفا تعدادشون. مزیتش به اینه که با وجود فضای محدود حافظه اش تعداد صفر ها میتونه خیلی زیاد بشه و رقم رو خیلی بزرگ یا کوچیک کنه، عیبش هم به اینه که دقتش در همون حد ارقام با ارزشی ئه که ثبت کرده. اگه تعداد رقم های با ارزش بیشتر از حافظه اش باشه بناچار یک قسمتی از ارقام رو حذف می کنه و بجاشون صفر می نویسه، پس الزاما دقیق نیست، ولی بازه ارقامش میتونه خیلی بزرگ باشه.
اما ممیز ثابت همچین دیدی نداره، یک فضا با طول مشخص برای ارقام صحیح و یک فضا با طول مشخص برای ارقام اعشاری داره و دیگه از صفر های اینور و اونور خبری نیست. مزیتش به اینه که دقت محاسباتش بالا است چون اگه فرضا جا برای ذخیره کردن 10 رقم اعشاری داشته باشه در هر حال اون 10 رقم رو بدون خطا ثبت می کنه، حتی اگه رقم های باارزشی در بین ارقام صحیح داشته باشه، اما در عوض بازه ای که میتونه ثبت کنه به اندازه ممیز شناور بزرگ نیست چون هیچ صفری رو بی ارزش فرض نمی کنه و اینور و اونور عدد نمیتونه صفر بی ارزش اضافه کنه.
نوع داده decimal یک چیزی میان این دو شیوه است، یک فضای اشتراکی با طول مشخص برای ارقام صحیح و اعشاری داره که ممیز اعشار رو میتونه در هر موقعیتی از این فضا قرار بده و از صفر های اینور و اونور هم خبری نیست.

یا سئوال رو به این نحو بپرسم که یه عدد (عدد یک) تقسیم بر عدد دیگه بشه (در بالا که تقسیم بر 3 رو مثال زدید) و دوباره ضربدر همون عدد بشه (بازم 3) ، جوابش همون عدد (عدد یک) نمیشه؟ یعنی الان جواب درست تر، عدد 1 هست یا عدد 0.99999999999 ؟!!
از دو روش و دو منطق ، انگار هر دو باید درست بشه . هم عدد 1 و هم عدد 0.999999999

اگه عدد 1 رو بر 3 تقسیم کنید حاصل بصورت تقریبی میشه 1.3333 یا 1.3333333333 که تعداد 3 ها تا بی نهایت ادامه داره، این کسر رو نمیشه بصورت دقیق در هیچکدوم از انواع داده عمومی نوشت و ذخیره کرد. پس نباید انتظار داشته باشیم که با ضرب کردن حاصل غیر دقیقش در 3 به همون مقدار اولیه برسیم. اگر float و double به مقدار 1 می رسند به این دلیله که خودشون ذاتا دقیق نیستند وگرنه اگر محاسباتشون دقیق بود به همون جواب 1.9999999 میرسیدیم. از نظر منطق ریاضی باید به 1 برسیم اما از نظر فنی نه. دقیقا بهمین دلیل در محاسبات اعشاری از شرطی مثل (f == 3.14159) نباید استفاده کرد، چون ممکنه 3.14159000001 باشه که بخاطر همون اختلاف کم شرط برقرار نیست. باید یک ضریب خطا در نظر گرفت، مثلا (Math.Abs(f - 3.14159) < 0.00001)
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
چیزی به معنی رد کردن که وجود نداره. من در کدتون new ای نمیبینم، کجا شیء میسازید؟

ممنون استاد علی
در یکی از رویدادهای دکمه :

کد:
    public partial class Form1: Form
    {
public Form1()
        {
            InitializeComponent();
           
        }

private void btnAbstract1_Click(object sender, EventArgs e)
        {
            Page2Class.AbstractChildClass absrtObj = new Page2Class.AbstractChildClass();

        }

    }

فرض کنید که یک کلاس کارمند داریم که وارث کلاس انسان ئه و کلاس انسان وارث کلاس مهره داران.
حالا وقتی شی فرهاد از کلاس کارمند ساخته میشه یک شیء ساخته میشه که هم کارمند ئه و هم انسان و هم مهره داران. این شیء از نوع کارمند ئه و سازگار با انسان و مهره داران. برای ساختن فرهاد سه تا شیء ساخته نمیشه، فقط یک شیء ساخته میشه. وقتی فرهاد ایجاد شد سه تا شی از نوع کارمند و انسان و مهره داران ایجاد نمیشه، تنها فرهاد ایجاد شده. شیء فرهاد هم کارمند ئه و هم انسان ئه و هم مهره دار.
در خلال ساختن شیء فرهاد متد سازنده کلاس های انسان و مهره داران اجرا میشه ولی سه تا شیء مجزا که ساخته نمیشه. نمیشه که بگیم فرهاد یک شیء ئه و بجز اون یک شیء انسان و یک شیء مهره داران هم هست که کنار دست فرهاد هستن.
شما تو کدتون جایی ندارید که شی ساخته بشه، متد سازنده ای هم پیاده سازی نشده که بگید رویش breakpoint گذاشتم ولی متوقف نشد.

بله درسته
تقریبا متوجه شدم
آره ، متد سازنده ، چیزی نذاشته بودم که ایست کنه
ممنون
 

SU-57

Active Member
سلام
ممنون استاد علی
هر چند مباحث پست قبلی موند (میخواستم تحقیق بیشتر کنم و سئوال تونو جواب بدم و پرسش هایی بپرسم وقتی توی آموزش به اون قسمت ها برسم) ولی درباره ی اینی که گفتید ، هر چند ممیز شناور و غیر شناور رو نمیدونم چیه اما پس decimal دقتش بیشتره ؟
یا سئوال رو به این نحو بپرسم که یه عدد (عدد یک) تقسیم بر عدد دیگه بشه (در بالا که تقسیم بر 3 رو مثال زدید) و دوباره ضربدر همون عدد بشه (بازم 3) ، جوابش همون عدد (عدد یک) نمیشه؟ یعنی الان جواب درست تر، عدد 1 هست یا عدد 0.99999999999 ؟!!
از دو روش و دو منطق ، انگار هر دو باید درست بشه . هم عدد 1 و هم عدد 0.999999999

این طور که به نظر میاد توی float و double عدد گرد می شه اما تو decimal گرد نمی شه به خاطر همون نکته ای که استاد علی فرمودن برای محاسبات مالی. مثلا توی محاسبات مالی 2 ریال رو هم حساب می کنن
-----------

آقا سجاد من این برنامه رو می خواستم دانلود کنم که متاسفانه دانلودش رو نذاشتن اما کدش رو گذاشتن روش کار کردم و بیشتر جاهاش رو خودم درست کردم و همه کدهاش رو هم داخلش قرار دادم اما کار نمی کنه اگه وقت داشتی و زحمتی نیست کدش رو درست کن و به صورت solution برام قرار بده (اگه وقت نداری اصلا راضی به زحمتت نیستم)

یک متغیری داره به نام timer1.Interval = 1000 که دکمه اون رو قرار نداده تا کدش رو داخلش کپی کنم فقط این کد مونده که اگه بشه جاش رو پیدا کرد

کد:
 private void timer1_Tick(object sender, EventArgs e)
        {
            if (timeLeft > 0)
            {
                timeLeft = timeLeft - 1;
                // Display time remaining as mm:ss
                var timespan = TimeSpan.FromSeconds(timeLeft);
                txtTimer.Text = timespan.ToString(@"mm\:ss");
                // Alternate method
                //int secondsLeft = timeLeft % 60;
                //int minutesLeft = timeLeft / 60;
            }
            else
            {
                timer1.Stop();
                SystemSounds.Exclamation.Play();
                MessageBox.Show("Time's up!", "Time has elapsed", MessageBoxButtons.OK);
            }
        }

Read more at http://www.geoffstratton.com/cnet-countdown-timer#imbjks0CXOGwFjZr.99

*****

لینک برنامه

*******

لینک solution
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
این طور که به نظر میاد توی float و double عدد گرد می شه اما تو decimal گرد نمی شه به خاطر همون نکته ای که استاد علی فرمودن برای محاسبات مالی. مثلا توی محاسبات مالی 2 ریال رو هم حساب می کنن
-----------

آقا سجاد من این برنامه رو می خواستم دانلود کنم که متاسفانه دانلودش رو نذاشتن اما کدش رو گذاشتن روش کار کردم و بیشتر جاهاش رو خودم درست کردم و همه کدهاش رو هم داخلش قرار دادم اما کار نمی کنه اگه وقت داشتی و زحمتی نیست کدش رو درست کن و به صورت solution برام قرار بده (اگه وقت نداری اصلا راضی به زحمتت نیستم)

یک متغیری داره به نام timer1.Interval = 1000 که دکمه اون رو قرار نداده تا کدش رو داخلش کپی کنم فقط این کد مونده که اگه بشه جاش رو پیدا کرد

کد:
 private void timer1_Tick(object sender, EventArgs e)
        {
            if (timeLeft > 0)
            {
                timeLeft = timeLeft - 1;
                // Display time remaining as mm:ss
                var timespan = TimeSpan.FromSeconds(timeLeft);
                txtTimer.Text = timespan.ToString(@"mm\:ss");
                // Alternate method
                //int secondsLeft = timeLeft % 60;
                //int minutesLeft = timeLeft / 60;
            }
            else
            {
                timer1.Stop();
                SystemSounds.Exclamation.Play();
                MessageBox.Show("Time's up!", "Time has elapsed", MessageBoxButtons.OK);
            }
        }

Read more at http://www.geoffstratton.com/cnet-countdown-timer#imbjks0CXOGwFjZr.99

*****

لینک برنامه

*******

لینک solution

آقا رامین ، من زیاد کد و پروژه نمیدم چون به قدر کافی آموزش داده میشه که هر چی میدونم (ولو اندک) رو بگم
بیشتر قطعه کدی که طرف مشکل داره رو اگه بلد باشم ، روش تمرکز میکنم
منتها این بار ؛ اول 3 تا دکمه و یه لیبل اضافه کنید به فرم و رویدادهای دکمه ها رو به توابع btnStart_Click و btnStop_Click و btnClear_Click در کد زیر متصل کنید . نام دکمه ها هم به ترتیب باید btnStart و btnStop و btnClear باشه . نام لیبل هم txtTimer
حالا کل کدهای کلاس Form1 تون رو پاک و کدهای زیر رو جایگزین اش کنید :

کد:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Media;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CountdownTimer
{
    public partial class Form1 : Form
    {
        private int timeLeft;
        private Timer timer1;
        public Form1()
        {
            InitializeComponent();
            this.timer1 = new Timer { Enabled = false, Interval = 1000 };
            this.timer1.Tick += new EventHandler(this.timer1_Tick);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (txtTimer.Text == "00:00")
            {
                MessageBox.Show("Please enter the time to start!", "Enter the Time", MessageBoxButtons.OK);
            }
            else
            {
                // Convert text to seconds as int for timer
                string[] totalSeconds = txtTimer.Text.Split(':');
                int minutes = Convert.ToInt32(totalSeconds[0]);
                int seconds = Convert.ToInt32(totalSeconds[1]);
                timeLeft = (minutes * 60) + seconds;

                // Lock Start and Clear buttons and text box
                btnStart.Enabled = false;
                btnClear.Enabled = false;
                txtTimer.ReadOnly = true;

                // Define Tick eventhandler and start timer
                timer1.Tick += new EventHandler(timer1_Tick);
                timer1.Start();
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            timeLeft = 0;
            btnStart.Enabled = true;
            btnClear.Enabled = true;
            txtTimer.ReadOnly = false;
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            txtTimer.Text = "00:00";
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (timeLeft > 0)
            {
                timeLeft = timeLeft - 1;
                // Display time remaining as mm:ss
                var timespan = TimeSpan.FromSeconds(timeLeft);
                txtTimer.Text = timespan.ToString(@"mm\:ss");
                // Alternate method
                //int secondsLeft = timeLeft % 60;
                //int minutesLeft = timeLeft / 60;
            }
            else
            {
                timer1.Stop();
                SystemSounds.Exclamation.Play();
                MessageBox.Show("Time's up!", "Time has elapsed", MessageBoxButtons.OK);
            }
        }
    }
}
 

SU-57

Active Member
آقا رامین ، من زیاد کد و پروژه نمیدم چون به قدر کافی آموزش داده میشه که هر چی میدونم (ولو اندک) رو بگم
بیشتر قطعه کدی که طرف مشکل داره رو اگه بلد باشم ، روش تمرکز میکنم
منتها این بار ؛ اول 3 تا دکمه و یه لیبل اضافه کنید به فرم و رویدادهای دکمه ها رو به توابع btnStart_Click و btnStop_Click و btnClear_Click در کد زیر متصل کنید . نام دکمه ها هم به ترتیب باید btnStart و btnStop و btnClear باشه . نام لیبل هم txtTimer
حالا کل کدهای کلاس Form1 تون رو پاک و کدهای زیر رو جایگزین اش کنید :

کد:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Media;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CountdownTimer
{
    public partial class Form1 : Form
    {
        private int timeLeft;
        private Timer timer1;
        public Form1()
        {
            InitializeComponent();
            this.timer1 = new Timer { Enabled = false, Interval = 1000 };
            this.timer1.Tick += new EventHandler(this.timer1_Tick);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (txtTimer.Text == "00:00")
            {
                MessageBox.Show("Please enter the time to start!", "Enter the Time", MessageBoxButtons.OK);
            }
            else
            {
                // Convert text to seconds as int for timer
                string[] totalSeconds = txtTimer.Text.Split(':');
                int minutes = Convert.ToInt32(totalSeconds[0]);
                int seconds = Convert.ToInt32(totalSeconds[1]);
                timeLeft = (minutes * 60) + seconds;

                // Lock Start and Clear buttons and text box
                btnStart.Enabled = false;
                btnClear.Enabled = false;
                txtTimer.ReadOnly = true;

                // Define Tick eventhandler and start timer
                timer1.Tick += new EventHandler(timer1_Tick);
                timer1.Start();
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            timeLeft = 0;
            btnStart.Enabled = true;
            btnClear.Enabled = true;
            txtTimer.ReadOnly = false;
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            txtTimer.Text = "00:00";
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (timeLeft > 0)
            {
                timeLeft = timeLeft - 1;
                // Display time remaining as mm:ss
                var timespan = TimeSpan.FromSeconds(timeLeft);
                txtTimer.Text = timespan.ToString(@"mm\:ss");
                // Alternate method
                //int secondsLeft = timeLeft % 60;
                //int minutesLeft = timeLeft / 60;
            }
            else
            {
                timer1.Stop();
                SystemSounds.Exclamation.Play();
                MessageBox.Show("Time's up!", "Time has elapsed", MessageBoxButtons.OK);
            }
        }
    }
}

خیلی ممنونم آقا سجاد

من گفتم که اگه زحمتی نیست یا اگه وقت داری. به قول معروف میگن آدم باید نه گفتن رو بلد باشه و اگه شما این کار رو هم انجام نمیدادی تو قلب ما جا داری و یک میلیونم از احساس خوب من به شما کم نمی شه. یعنی شما بیکار نیستی که وقت با ارزشت رو بزاری برای من برنامه درست کنی ولی چون دیدم شکل برنامه و کدهای این برنامه هست و من خودم نشستم باهاش ور رفتم و بیشتر جاهاش رو درست کردم تا 70 درصد زحمت رو از روی دوش شما بر دارم و شما زحمت بقیش رو بکشی (فقط کدهای timer1 ). پروژه رو هم قرار دادم تا دوباره کاری نشه

فقط این رو هم بگم که من 3 روز این کدها رو بالا پایین کردم و اخلاقم اینجوریه که تا جایی که می تونم خودم کارم رو انجام بدم و تمام سعیم رو کردم ولی همین ارورهایی که در زیر می بینی برای من هم میومد

الان وقتی کدها رو کپی می کنم به جای فرم این صفحه میاد

لینک

کد ها رو هم تک تک داخل رویداد ها قرار میدم ارور زیر رو میده

لینک

اگه این رو خودت ساختی به نظرم پروژه رو zip شده قرار بدی بهتره
 

the_king

مدیرکل انجمن
این طور که به نظر میاد توی float و double عدد گرد می شه اما تو decimal گرد نمی شه به خاطر همون نکته ای که استاد علی فرمودن برای محاسبات مالی. مثلا توی محاسبات مالی 2 ریال رو هم حساب می کنن
تو اون مثال نتیجه شبیه عمل گرد شدن عدد ئه اما اینو به عنوان یک قاعده در نظر نگیرید. شما اگه 1000f * 0.0001f رو محاسبه کنید بجای 0.1 بهتون 0.09999999 جواب میده در حالی که float ئه، توقع نداشته باشید گرد اش کنه.
یا هزار تا 0.001f رو با هم جمع کنید، حاصل باید 1 بشه، ولی 0.9999907 جواب میده :
کد:
            float x = 0.001f;
            float y = 0.0f;
            for (int i = 0; i < 1000; i++)
            {
                y += x;
            }
            Text = y.ToString();
 

SU-57

Active Member
تو اون مثال نتیجه شبیه عمل گرد شدن عدد ئه اما اینو به عنوان یک قاعده در نظر نگیرید. شما اگه 1000f * 0.0001f رو محاسبه کنید بجای 0.1 بهتون 0.09999999 جواب میده در حالی که float ئه، توقع نداشته باشید گرد اش کنه.
یا هزار تا 0.001f رو با هم جمع کنید، حاصل باید 1 بشه، ولی 0.9999907 جواب میده :
کد:
            float x = 0.001f;
            float y = 0.0f;
            for (int i = 0; i < 1000; i++)
            {
                y += x;
            }
            Text = y.ToString();

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

کد1

کد:
  float x = 20;
            float y = 6;
            float z = x / y;
           
            MessageBox.Show(z.ToString());

کد2

کد:
 float x = 20;
            float y = 6;
            float z = (x / y) * 3;
           
            MessageBox.Show(z.ToString());

کد3

کد:
   float x = 3;
            float y = 20/6;
            float z = x * y;
           
            MessageBox.Show(z.ToString());
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنونم آقا سجاد

من گفتم که اگه زحمتی نیست یا اگه وقت داری. به قول معروف میگن آدم باید نه گفتن رو بلد باشه و اگه شما این کار رو هم انجام نمیدادی تو قلب ما جا داری و یک میلیونم از احساس خوب من به شما کم نمی شه. یعنی شما بیکار نیستی که وقت با ارزشت رو بزاری برای من برنامه درست کنی ولی چون دیدم شکل برنامه و کدهای این برنامه هست و من خودم نشستم باهاش ور رفتم و بیشتر جاهاش رو درست کردم تا 70 درصد زحمت رو از روی دوش شما بر دارم و شما زحمت بقیش رو بکشی (فقط کدهای timer1 ). پروژه رو هم قرار دادم تا دوباره کاری نشه

فقط این رو هم بگم که من 3 روز این کدها رو بالا پایین کردم و اخلاقم اینجوریه که تا جایی که می تونم خودم کارم رو انجام بدم و تمام سعیم رو کردم ولی همین ارورهایی که در زیر می بینی برای من هم میومد

الان وقتی کدها رو کپی می کنم به جای فرم این صفحه میاد

لینک

کد ها رو هم تک تک داخل رویداد ها قرار میدم ارور زیر رو میده

لینک

اگه این رو خودت ساختی به نظرم پروژه رو zip شده قرار بدی بهتره

بر عکس تو ، من آدم فعالی نیستم . قضیه ی وقت داشتن و تلف کردن یا نکردن نیست
توی انجمن های دیگه برای اتوپلی ، هر کس میومد و کد آماده تحویل میگرفت . به هر کی که کد میدادیم ، هر روز درخواست ها اضافه تر میشد تا جایی که کلافه شدم و قید هر نوع کد دادن برای هر کس در هر سطحی رو زدم . و این شد که به همه میگم اگه قراره یاد بگیرن ، اول آموزش رو ببینن و بعد فقط اون قسمت از کد رو که مشکل دارن بپرسن نه اینکه کل کد آماده بخوان
-------------------------------
فایل رو پیوست میکنم . اما شی txtTimer ، از نوع Label نباید باشه . واسه همین در پروژه ، 2 تا ارور وجود داره . نوع شو از استاد علی سئوال کن . پروژه رو پیوست میکنم
 

پیوست ها

  • CounterDown.rar
    42.5 کیلوبایت · بازدیدها: 3

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد علی ، فایل های dll ای که توی سی شارپ میسازیم ، بعد توی برنامه ای که ازش استفاده میکنیم ، اون برنامه باید اون نسخه ی دات نت فریم وورک رو توی سیستم کاربر نصب کنه تا بتونه ازش استفاده کنه یا فایل های dll وابسته به دات نت فریم وورک نیستن؟
 

the_king

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

the_king

مدیرکل انجمن
سلام
استاد علی ، فایل های dll ای که توی سی شارپ میسازیم ، بعد توی برنامه ای که ازش استفاده میکنیم ، اون برنامه باید اون نسخه ی دات نت فریم وورک رو توی سیستم کاربر نصب کنه تا بتونه ازش استفاده کنه یا فایل های dll وابسته به دات نت فریم وورک نیستن؟
وابسته که قطعا هستند، نمیشه یک DLL ای یک کد ماشین مجازی داشته باشه ولی برای اجرا شدن نیاز به خود ماشین مجازی نداشته باشه. اون اوایل که NET Framework. اومده بود یکسری شرکت ها سعی کردن یک ابزار برای ترکیبش با DLL یا EXE طراحی کنن تا نیازی به نصب نداشته باشه چند تا محصول هم بود، ولی بعدا متوقف شدن. حالا نمیدونم مشکلات قانونی مانع شون بود، مشتری شون به مرور کم شد، در نسخه های بعدی NET. به مشکل برخوردند یا هر دلیل دیگه ای. اما اگه یک DLL ای به هر طریقی فاقد کد اجرایی ئه و چیزی برای محیط Managed نداره و از کتابخانه NET. هم استفاده نمی کنه شرایط فرق می کنه.
 

SU-57

Active Member
من تو همون پست قبلیم براتون عمل ضرب با نتیجه گرد نشده مثال زدم. کلا آزمون و خطا و روش های تجربی برای شناخت موارد اینچنینی کاربردی نداره.

استاد گرامی، من همین رو می خوام بدونم این قانونی که برای داده های float و double طراحی کردن چیه یعنی چرا دو عملکرد داره یک جا عدد رو گرد می کنه و یک جا نمی کنه. و منِ برنامه نویس (مبتدی) گیج می شم که باید چیکار کنم و از عملکرد برنامه ای که نوشتم نمی تونم مطمئن باشم.

مثلا تو ماشین حساب ویندوز 7 من 10 رو بر 3 تقسیم می کنم که می شه 3.3333 تا بی نهایت و دوباره ضربدر 3 می کنم می شه 10 در حالی که باید 9.999 بشه اون طور که من تو مطالبی خوندم به اینا میگن باگ. شاید ویژوال باگ داشته باشه

سوال بعدی من که ربطی به موضوع نداره اینه که چرا باید آخر داده های float و double و decimal از حروف F و D و M استفاده کنیم. به نظرم اینجا مایکروسافت راه رو اشتباه رفته. خوب وقتی نوع رو مشخص کردیم float دیگه نباید نیازی باشه آخرش F اضافه کنیم چون اولش نوشتیم که نوع داده ما float است و double نیست یعنی منطق پشت اینو متوجه نشدم
 

the_king

مدیرکل انجمن
استاد گرامی، من همین رو می خوام بدونم این قانونی که برای داده های float و double طراحی کردن چیه یعنی چرا دو عملکرد داره یک جا عدد رو گرد می کنه و یک جا نمی کنه. و منِ برنامه نویس (مبتدی) گیج می شم که باید چیکار کنم و از عملکرد برنامه ای که نوشتم نمی تونم مطمئن باشم.
گرد نمی کنه، دلیلی نداره بخواد گرد کنه. تعداد ارقام با ارزشی که می تونه ذخیره کنه محدوده، از یه مقداری بیشتر بشه بقیه شو ذخیره نمی کنه، به همین سادگی یعنی شما به عنوان برنامه نویس باید برای محاسبات اعشاری با ممیز شناور توقع نتیجه تقریبی داشته باشید، محاسباتش همینه تخمینی و تقریبی ئه. یعنی شما اگر برنامه ای می نویسید که قراره باهاش موشک هوا بشه، با نوع داده های float و double یک ضریب خطایی باید در نظر بگیرید یا اصلا ازشون استفاده نکنید.

مثلا تو ماشین حساب ویندوز 7 من 10 رو بر 3 تقسیم می کنم که می شه 3.3333 تا بی نهایت و دوباره ضربدر 3 می کنم می شه 10 در حالی که باید 9.999 بشه اون طور که من تو مطالبی خوندم به اینا میگن باگ.
این باگ نیست، باگ نرم افزاری یعنی یک ایرادی که منجر به ایجاد کردن خروجی نادرست یا یه رفتار ناخواسته بشه. ماشین حساب ویندوز از یک نوع داده مخصوص محاسبات bignum (اعداد با تعداد رقم زیاد) استفاده می کنه، نه float و نه double که بر پایه ممیز شناور هم نیست. و تعداد ارقام در محاسباتش از تعدادی که در صفحه میتونه نشون بده بیشتر ئه. توقع نداشته باشید که همه 3 ها رو در صفحه ببینید. شما اون چیزی که در حافظه محاسباتش قرار داره رو در 3 ضرب می کنید، نه الزاما چیزی که روی صفحه می بینید. یعنی چیزی که روی صفحه نشون میده با اون چیزی که در حافظه اش داره کار می کنه الزاما یکی نیست. امتحان کنید، 10 رو بر 3 تقسیم کنید، با Ctrl + C از اون مقدار 3.3333 اش کپی بگیرید و مجددا با Ctrl + V اون عدد رو قرار بدید و بعد در 3 ضرب کنید، نتیجه 9.9999 میشه.

سوال بعدی من که ربطی به موضوع نداره اینه که چرا باید آخر داده های float و double و decimal از حروف F و D و M استفاده کنیم. به نظرم اینجا مایکروسافت راه رو اشتباه رفته. خوب وقتی نوع رو مشخص کردیم float دیگه نباید نیازی باشه آخرش F اضافه کنیم چون اولش نوشتیم که نوع داده ما float است و double نیست یعنی منطق پشت اینو متوجه نشدم
شما یک متغیر در سمت چپ دارید ولی در سمت راست ممکنه یک عالمه عملیات و محاسبات انجام بشه، این خیلی محدودیت بزرگیه که بخاطر نوع داده متغیر سمت چپ تمامی محاسبات سمت راست در یک نوع داده خاص انجام بشه.
در نظر بگیرید که هر تابعی یک نوع داده خروجی داره که ممکنه int باشه، یا double باشه، decimal باشه.ممکنه برای رسیدن به یک مقدار float یک عالمه توابع و محاسبات انجام بدید که خیلی هاشون نه با float سر و کار داشته باشن و نه محاسبات float براشون مناسب باشه. طراح زبان که نباید بخاطر یک نوع داده کل محاسبات رو از اول تا آخر محدود به یک نوع داده خاص بکنه، فرضا ممکنه شما لازم باشه محاسبات مالی رو با decimal انجام بدید ولی سود درصدی (مثلا 15.5 درصد) رو در یک متغیر float قرار بدید. نباید بخاطر اون float محاسبات مالی هم در float انجام بشه. وقتی درگیر کد نویسی بشید مثال های اینطوری زیاد می بینید.
 

جدیدترین ارسال ها

بالا