ممنونم استاد
1- در کدهای زیر:
کد:
int a = 10;
string b = "Ali";
در فیلم گفته شد که عدد 10 و رشته Ali هر دو شی هستند اما شما فرمودین که 10 یک داده است
مثل اینه که بگین پرتقال میوه است یا گیاه. هر دو درسته. 10 هم داده (data) است و هم شیء (object). هر متغیری از هر نوع داده ای که باشه مقداری که داخلش قرار می گیره یک داده است.
در #C هم تمامی انواع داده ای عبارتند از object و بقیه که از object وراثت دارند، نوع داده ای وجود نداره که object نباشه.
2- در کدهای زیر:
کد:
string[] myString = new string[3];
MessageBox.Show(myString[0]);
char[] myString = new char[3];
MessageBox.Show(myString[0].ToString());
الان توی پنجره دیالوگ null نمایش داده می شه یا رشته خالی ""
null نمایش داده میشه چون مقدار پیشفرض string ها و سایر انواع داده ای که null پذیر هستند، null ئه، رشته تهی "" مقدار پیشفرض string ها نیست. می توانید این مورد را در اجرا بررسی کنید :
کد:
string[] myString = new string[3];
if (myString[0] == null)
{
MessageBox.Show("null");
}
else if (myString[0] == "")
{
MessageBox.Show("empty string");
}
3- یک مبحث قدیمی:
شما فرموردین که در نوع decimal ممیز ثابت یک طول مشخص برای ارقام صحیح و یک طول مشخص برای ارقام اعشاری داره. آیا طول این ها مشخص هست که برای هر قسمت مثلا چند بایته؟
نه اشتباه نکنید، طولی که برای ارقام اعشاری و صحیح در نظر گرفته جدا و مستقل از هم نیست، کنار هم و ترکیبی ئه، طول مشخصی برای کلیه ارقام ارزشمند داره، اعم از اینکه رقم ها صحیح یا اعشاری باشند، ممیز رو در هر جایی میان اون رقم ها میتونه قرار بده. اما مثل ممیز شناور گرد کردنی در کار نیست یا حداقل به اون شدت نیست. ارزشمند از این لحاظ که در عدد 120.45000 اون سه 000 رقم های ارزشمندی نیستند و بود و نبودشون موثر نیست.
decimal یک نوع داده 128 بیتی ئه، اما از اونجایی که ما طول رو با رقم های مبنای 10 میسنجیم و نه مبنای 2، طولش در مبنای 10 تخمینی میشه، چیزی بین 28 الی 29 رقم مبنای 10 میشه.
یعنی یک عدد که حداکثر 28 رقم ارزشمند داره، اعم از اینکه رقم ها قبل یا بعد از ممیز باشند به خوبی و بدون کوچکترین گرد شدنی داخل decimal جا میگیره.
همچنین فرمودین که در ممیز شناور اگه مقدار مورد نظر از مقدار حافظه بیشتر باشه اون ارقام رو حذف می کنه و به جاش صفر در نظر می گیره. سوالم اینه که:
الف) اگه اون ارقام رو حذف می کنه چطور به جاش مقدار صفر در نظر می گیره؟
حذف کردن باید به شکلی انجام بشه که عددی که ثبت میشه حداکثر نزدیکی رو به عدد اولیه داشته باشه، برای اینکه رقم هایی که کمترین ارزش رو دارند با صفر شدن فدا میشن، از ارزش می افتند. وقتی صفر شد و دیگه ارزشمند نشد حذف میشه. یک مثال ابتدایی میزنم از نوع داده float که دقت نگهداریش در حد 7 رقمه، نمی تونه اعدادی مثل 123456789 و 0.123456789 و ... رو دقیق ثبت کنه. مجبوره رقم های کم ارزشترش رو صفر کنه تا از ارزش بیافته و قابل ذخیره شدن بشه :
کد:
float a = 123456789F;
float b = 0.123456789F;
float c = a + b;
string format = "0.0###############";
MessageBox.Show(string.Format("a = {0:" + format + "}\n"
+ "b = {1:" + format + "}\n"
+ "c = {2:" + format + "}", a, b, c));
;
حالا ببینید همون ممیز شناور در float که فقط توانایی نگهداری 7 رقم ارزشمند رو داره چقدر خوب میتونه ارقام خیلی بزرگ یا کوچکی رو نگهداری کنه :
کد:
float a = 123000000000000000F;
float b = 0.0000000000000123F;
float c = a + b;
string format = "0.0###############";
MessageBox.Show(string.Format("a = {0:" + format + "}\n"
+ "b = {1:" + format + "}\n"
+ "c = {2:" + format + "}", a, b, c));
;
اون صفر های ابتدا و انتها در رقم های a و b برای ممیز شناور رقم های ارزشمندی نیستند، برای همینه که float میتونه اینقدر محدوده عددی بزرگی رو پوشش بده.
و توجه کنید که در مقدار c اون رقم های 0 میانی ارزشمند ئه، برای همینه که در مورد c ناچار به صفر شدن کلیه رقم های بعد از ممیز میشه و با اینکه c مجموع a و b بوده؛ خبری از رقم های b نیست و مقدارش مثل a میشه و ارقام ارزشمند b با صفر شدن فدا شدن.این مثال نشون میده که شما از float می توانید توقع نگهداری عدد بزرگی مثل 123000000000000 یا عدد کوچکی مثل 0.00000000000123 رو داشته باشید، اما اون صفر ها در ابتدا و انتها برای ممیز شناور رقم های ارزشمندی نیستند.
ب) در نوع داده ای decimal اگه ارقام صحیح و ارقام اعشاری از اون طولی که براش مشخص شده بیشتر بشن مثل ممیز شناور حذف میشن.
الزاما نه، برای رقم های اعشاری میتوانید همچین تصوری داشته باشید ولی وقتی عدد به قدری بزرگ یا کوچک شد که در ظرفیت اش نگنجید با خطا متوقف میشه.
همچنین در صفحه 22 فرمودین که:
"در عددی مثل 1002400000 یا 10.024 یا 0.0000100240 صرفا 10024 اش با ارزش ئه و بقیه اش صرفا رقم های بی ارزش 0 ئه"
ولی به نظر من صفرهای جلوی 1002400000 و همچنین صفرهای پشت 0.0000100240 با ارزش هستند چون با حذف اون ها عدد عوض می شه.
قطعا موثر هستند ولی برای نگهداری رقم با ارزشی نیستند، تعداد اون صفر ها مهمه، به عبارت دیگه محل ممیز مهمه، نه رقم های صفر اینور و اونور. در سیستم محاسبات اعشاری برای نگهداری تعداد اون رقم های صفر جایگاه ویژه و مستقلی هست که بصورت مضرب توانی از 10 نگهداریش می کنه. فرضا 123 رو به همراه 5 نگهداری می کنه که اون 5 یعنی 10 به توان 5 یا 5 تا صفر یا 00000. پس نادیده گرفته نمیشن، اما خود رقم های صفر اینور و اونور ثبت نمیشن.
4- مقدار داده ای که نوع int می گیره مشخصه. من می خوام حفظ بکنم مثلا میگم از منفی 2 میلیارد تا مثبت 2 میلیارد اما مقدار بعضی از انواع داده ای برای من مبهمه مثل float و double. چطوری می شه اینا رو به یک عددی تبدیل کرد که قابل حفظ کردن باشه به صورت تقریبی
خیلی ساده است، گو اینکه حفظ کردنی نیست. به جدول تقریبی محدوده شون یک نگاهی بندازید :
Floating-point types table - C# Reference
در نظر بگیرید که محدودها مثبت و منفی دارند، یعنی بجای دو مرز بزرگ و کوچیک، چهار تا مرز داریم. دلیلش اینه که بین اعدادی که خیلی ریز و کسری هستند و اعداد خیلی بزرگ و درشت تفاوت هست، مثال float رو ببینید :
عدد مثبتی که خیلی خیلی بزرگه مثل 3.4 ضربدر 10 به توان 38 که معادل یک 34 ای میشه که جلوش 37 تا صفر بگذارید.
عدد مثبتی که با وجود مثبت بودن خیلی کسری و کوچیکه و به صفر فوق العاده نزدیکه، مثل 1.5 ضربدر 10 به توان 45- که معادل یک 0.15 ای میشه که میان . و 1 اش 44 تا صفر بگذارید.
عدد منفی ای که خیلی خیلی درشت ئه مثل 3.4- ضربدر 10 به توان 38 که معادل یک 34- ای میشه که جلوش 37 تا صفر بگذارید.
و عدد منفی ای که خیلی خیلی کسری و فوق العاده به صفر نزدیکه، مثل 1.5- ضربدر 10 به توان 45- که معادل یک 0.15- ای میشه که میان . و 1 اش 44 تا صفر بگذارید.