در قسمت سوم زنگ سی شارپ توضیحات مختصری در مورد value type، متغیر (variable) و عملگرها (operators) داده شد. در این قسمت با چند مثال به تشریح کاملتر آنها خواهیم پرداخت. همانطور که در قسمت قبل گفته شد، data types به دو دسته ی value types و reference types تقسیم میشوند و دانستید که سیزده value types داریم.
در مجموع به این سیزده ولیو تایپ، simple types میگویند و دلیل این نامگذاری این است که اینها شامل مقدار تکی (singleValue) هستند و به عبارت دیگر، ترکیبی از دو یا بیشتر از دو مقدار نیستند.
Float و Double
به مثال زیر توجه کنید:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ExFloat { class Program { static void Main(string[] args) { int i = 25; float f = 16.8F; float result = i / f; Console.WriteLine("Result is: " + result); } } }
همانطور که مشاهده میکنید متغیر i مقدار ۲۵ را در خود ذخیره کرده است و متغیر f که از جنس float است مقدار ۱۶.۸ را در خود نگهداری میکند. نکته ی float اینجاست که باید بعد از آن از پسوند F یا f استفاده کنید:
float f = 16.8F;
دلیل اینکار این است که اعداد اعشاری به صورت پیش فرض double هستند و برای اینکه یک مقدار را به صورت float ذخیره کنید باید حتماً از پسوند F یا f استفاده کنید، در غیر این صورت کامپایلر به شما پیغام خطا میدهد و به شما میگوید که نمیتوانید یک مقدار از جنس double را در متغیری از جنس float ذخیره کنید.
float result = i / f;
در اینجا مقدار متغیر i را بر مقدار متغیر f تقسیم کردیم و نتیجه ی آنرا در متغیری به اسم result که از جنس float است ذخیره کردیم.
Console.WriteLine("Result is: " + result);
در نهایت مقدار result را در خروجی نمایش دادیم:
Result is: 1.488095
اگر همین مثال را برای double انجام دهیم همانطور که در قسمت قبل گفته شد، خواهیم دید که دقت دابل بیشتر از float است:
static void Main(string[] args) { int i = 25; double d = 16.8; double result = i / d; Console.WriteLine("Result is: " + result); }
خروجی:
Result is: 1.48809523809254
Decimal
یکی از موارد خیلی عالی در سی شارپ، تدارک دیدن نوع Decimal برای محاسبات مالی است. نوع دسیمال با بهره گیری از ۱۲۸ بیت برای نشان دادن مقادیر در محدودهی 28-10 * 1.0 و 1028 * 7.9 استفاده میکند. در محاسبات معمولی ممیز شناور، خطاهای گرد کردن گوناگونی رخ میدهد. نوع دسیمال این خطاها را از بین میبرد و دقیقاً تا ۲۸ رقم اعشار (در بعضی موارد ۲۹ رقم اعشار) را نشان میدهد. این توانایی نشان دادن مقادیر اعشاری بدون خطای گرد کردن، نوع Decimal را برای محاسبات پولی و مالی بسیار مناسب میکند. به دلیل اینکه مقادیر پولی در اپلیکیشن های تجاری بسیار با اهمیت هستند، بسیاری از برنامه نویسان سی شارپ اغلب برای این منظور از نوع Decimal استفاده میکنند. برای مشخص کردن اینکه عدد شما از نوع Decimal است، باید به عدد خود کاراکتر M (یا m) را اضافه کنید:
decimal d = 12.30M;
اینکار ضروری است چرا که در غیر این صورت مقدار متغیر به عنوان double تفسیر میشود (مقادیر اعشاری به صورت پیشفرض double هستند).
در اینجا یک مثال برای شما در نظر گرفته ایم که با استفاده از نوع Decimal بتوانید قیمت نهایی را همراه با تخفیف، با توجه به قیمت اصلی و درصد تخفیف به دست آورید:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace test { class Program { static void Main(string[] args) { decimal price; decimal discount; decimal discountedPrice; // Compute discounted price. price = 19.95m; discount = 0.15m; // discount rate is 15% discountedPrice = price - (price * discount); Console.WriteLine("Discounted price: $" + discountedPrice); } } }
خروجی این برنامه:
Discounted price: $16.9575
در این برنامه، در قسمتی که محاسبه تخفیف انجام میشود، الویت اول با پرانتزها است به طوری که ابتدا متغیر price در discount ضرب میشود، سپس حاصل آن از متغیر price کم میشود و در نهایت مقدار محاسبه شده ی نهایی در متغیر discountedPrice قرار میگیرد.
دریافت ورودی از کاربر
به مثال زیر که برای دریافت مقدار از ورودی است توجه کنید:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace test { class Program { static void Main(string[] args) { Console.Write("Please enter your name: "); string userName = Console.ReadLine(); Console.Write("Please enter your surname: "); string userSurname = Console.ReadLine(); Console.WriteLine("Hi there, {0} {1}!", userName, userSurname); Console.WriteLine(); } } }
و خروجی با توجه به اسم و فامیل شما اینچنین است:
در این مثال ما نام و نام خانوادگی کاربر را دریافت میکنیم و در نهایت یک پیغام خوش آمد گویی به کاربر نمایش میدهیم. هدف از این مثال این است که شما بیاموزید چگونه یک مقدار (ورودی) را از کاربر دریافت کنید و چگونه آن را نمایش دهید و در صورت نیاز چه تغییراتی روی آن اعمال کنید.
به توضیحات برنامه بالا توجه کنید:
Console.Write("Please enter your name: ");
با این خط کد شما به کاربر یک پیغام را نمایش میدهید که نام خودش را وارد کند. کاربر نام خودش را وارد میکند ولی این نام وارد شده که مسلماً string (رشته ای از کاراکترها) است در کجا ذخیره میشود؟! پس شما باید یک مکان را برای گرفتن این مقدار آماده کنید. کامپیوتر در نهایت همه ی اطلاعات را در خانه های حافظه (Ram) ثبت میکند که به صورت باینری هستند. حتی برنامه نویسان کارکشته و باتجربه هم ترجیح میدهند به جای استفاده از باینری، مستقیماً از اعداد، متن و نوشته استفاده کنند. زبانهای برنامه نویسی به شما اجازه میدهند که مکانهای خاصی را برای نگهداری اطلاعات در حافظه بوجود بیاورید، این مکانهای خاص همان متغیرها هستند که در قسمت قبل به شما معرفی کردیم.
شما تا اینجا یک پیغام را به کاربر نمایش دادید که نام خودش را وارد کند و اکنون میخواهیم نام کاربر را دریافت و ذخیره کنیم، خط کد بعدی این کار را برای ما انجام میدهد:
string userName = Console.ReadLine();
در اینجا برای دریافت نام کاربر یک متغیر به اسم userName از جنس string تعریف کردیم تا نام کاربر را در آن ذخیره کنیم. اکنون ما نیاز داریم که این مقدار را از کاربر دریافت کنیم. دستور ()Console.ReadLine این کار را برای ما انجام میدهد و به این صورت عمل میکند که منتظر میماند تا کاربر مقداری را در پنجره کنسول تایپ کند و بهمحض اینکه کاربر کلید Enter را فشرد، هرچه را که تایپ کرده در متغیر userName ذخیره میکند. در اینجا ما هم زمان هم متغیر را تعریف کردیم هم مقدار ورودی را در آن قرار دادیم، ولی میتوانستیم ابتدا متغیر را تعریف کنیم، سپس مقدار ورودی را در آن قرار دهیم، بدین صورت:
string userName; userName = Console.ReadLine();
برای دریافت نام خانوادگی هم طبق همین روال پیش میرویم. همینطور که میبینید ما برای انتخاب نام متغیرها از userName برای اسم کاربر و از userSurname برای نام خانوادگی کاربر استفاده کردیم.
یکسری قرارداد و راهنمایی برای نام گذاری وجود دارد که به شما کمک میکند چگونه یک نام بسیار مناسب را انتخاب کنید تا اگر در زمان آینده به برنامه ی خود برگشتید دچار سردرگمی نشوید و علاوه بر آن از یک خوشنویسی در زبان سی شارپ بهره ببرید، به چند نمونه از این قراردادها و راهنمایی ها توجه کنید:
- از space و نقطه گذاری نمیتوانید در انتخاب نام استفاده کنید.
- از نام های ساده، خوانا و با معنی استفاده کنید.
- خوانایی و با معنی بودن یک اسم را قربانی یک اسم کوتاه و عجیب و غریب نکنید.
- از زیرخط، خط فاصله یا هر کاراکتری غیر از کارکترهای الفبایی استفاده نکنید.
- از انتخاب اسم هایی که با کلمات کلیدی زبان برنامه نویسی تداخل دارند پرهیز کنید.
- سی شارپ یک زبان case-sensitive است و اکثر برنامه نویسان به طور عمده از حروف کوچک برای نامگذاری متغیرها استفاده میکنند ولی اگر نام متغیر چند قسمتی باشد برای تمایز بین کلمات از حروف بزرگ استفاده میکنند برای مثال userName و userSurname که برای نام گذاری آنها را انتخاب کردیم، دو قسمتی (دو کلمه ای) هستند و userName از دو کلمهی user و name تشکیل شده است که برای تمایز بین آنها حرف N را بزرگ نوشته ایم و هر کلمه ای که به این اسم بخواهد اضافه شود حرف اول آن باید بزرگ باشد.
Console.WriteLine("Hi there, {0} {1}!", userName, userSurname);
اگر شما این خط کد را با خروجی مقایسه کنید متوجه خواهید شد که چه اتفاقی افتاده است. رشتهی ” ,Hi there” در خروجی نمایش داده میشود و نام کاربر به جای {0} قرار میگیرد و نام خانوادگی کاربر در قسمت {1} واقع میشود. اگر شما بخواهید مقدار یک متغیر را در خروجی همراه یک پیغام نمایش دهید میتوانید متغیر را با یک عدد در کروشه جایگزین کنید. کامپیوتر شمارش را از عدد صفر شروع میکند بنابراین userName متغیر شماره صفر میشود و مقدار آن در خروجی چاپ میشود همچنین userSurname متغیر شماره یک است. همانطور که میبینید بعد از string نام متغیرهایی را که میخواهیم مقدار آنها همراه با پیغام خوش آمد گویی نمایش داده شود، مینویسیم و به ترتیب userName به جای {0} و userSurname به جای {1} قرار گرفته میشود. اگر توجه کرده باشید همین کار را با استفاده از علامت + هم میتوانستیم انجام دهیم که بدین صورت میشد:
Console.WriteLine("Hi there, " + userName + " " + userSurname + "!" );
همانطور که میبینید توسط علامت + متغیرها را به رشته ها متصل کردیم.
دستور آشنای آخر:
Console.WriteLine();
این دستور وقتی به این صورت و بدون هیچ ورودی استفاده شود تنها یک خط خالی را چاپ میکند و معمولاً برای اینکه خروجی ها خواناتر باشند استفاده میشود.
مجتبی
19 September 2012
ممنون
یه سوال!
مزیت کروشه نسبت به + چیه؟ جای خاصی کاربرد داره؟
مسعود درویشیان
19 September 2012
سلام، سوال خوبی پرسیدین
به روش اول میگن string formatting:
و به روش دوم میگن string concatenation:
هر دوی اینها خروجی یکسانی رو چاپ میکنن ولی روش string formatting مزیتهای بیشتری نسبت به روش string concatenation داره، از جمله اینکه:
۱. فرم سادهتر و خواناتری داره
۲. با این روش میتونی الگوی خروجی خودت رو که از جنس استرینگ هست مشخص کنی
۳. میتونی به متغیرهایی هم که توی این روش نمایش میدی یه فرم خاص و دلخواه بدی، یهعنوان مثال میتونی بگی که یکی از خروجیهات با دو رقم اعشار نمایش داده بشه یا اینکه زمان رو با نمایش سال، ماه و یا روز نشون بدی
۴. دادهها رو از استرینگت کاملاً جدا میکنه
۵. از زیاده نویسی جلوگیری میکنه
و…
البته سرعت string concatenation یه خورده بیشتر هست ولی حافظهی بیشتری رو هم اشغال میکنه. درکل استفاده از روش string formatting که یه حالت ایدهآل هست پیشنهاد میشه و با توجه به نیازت و ویژگیهایی که string formatting در اختیارت قرار میده باید خودت انتخاب کنی
سعی میکنیم توی مقالات آینده روش string formatting و ویژگیهاش رو در مثالها پوشش بدیم.
برای اطلاعات بیشتر میتونی سرچ کنی:
string formatting vs. string concatenation
علی حیدرزاده
20 September 2012
من برنامه ویژوال استودیویی که نصب کردم تا برنامه قبل همه چیز رو درست نشون میداد ولی الان وقتی میخوام یه تیکه کد رو احرا کنم همین که پنجره سیاه رنگ باز میشه سریع بسته میشه.
مسعود درویشیان
20 September 2012
دوست عزیز، اگه یادتون باشه گفته شد که Ctrl + F5 رو با هم بگیرید یا اینکه از منوی Debug گزینهی Start without debugging رو انتخاب کنید.
علی حیدرزاده
20 September 2012
ممنون مشکل همین بود من f5 خالی میزدم
داوود
24 September 2012
ممنون؛ عالی بود
سمیرا
1 November 2012
خسته نباشید
خدا قوت
ممنون
مهدی
16 November 2012
ممنونم داداش گل .اما چرا این Console.WriteLine آخرو که برمیداری هیچ اتفاق خاصی نمیفته نکنه منظور Redkey بوده
مسعود درویشیان
16 November 2012
این دستور وقتی به این صورت و بدون هیچ ورودی استفاده شود تنها یک خط خالی را چاپ میکند و معمولاً برای اینکه خروجی ها خواناتر باشند استفاده میشود.
nilgoon
26 February 2013
خیلی عالیه ممنون
حانی
4 March 2013
سلام خسته نباشید . در پاسخ به اولین سوال درباره مزیت کروشه به + نوشته بودید که می تونیم متغیر ها رو با دو رقم اعشار یا خصوصیت های دیگه ای بگیریم. اما مگه متغیر ها همون داده هایی نیستند که ما بهشون دادیم ؟ خروجی نهایی ممکنه تغییر کنه ، اما داده ها که ثابت هستند! چه جوری می شه؟
مسعود درویشیان
4 March 2013
سلام مرسی. نه دادهها عوض نمیشن! اینکه میگیم تا دو رقم اعشار، مثلاً اگه یه عددی 2.52673157 باشه تا دو رقم اعشارش میشه 2.52
فرم و شکلشون رو میتونیم تغییر بدیم…
کوثر
14 April 2013
مثل مقاله ی قبلی خوب بود
موفق باشید
علیرضا اسکندرپور شوفری
17 April 2013
خیلی مخلصیم آقا. بسیار عالی داری پیش میری. دنبالت میام ;) موفق باشی.
مسعود درویشیان
17 April 2013
امیدوارم براتون مفید باشه، موفق باشید
علیرضا اسکندرپور شوفری
19 April 2013
مسعود جان یه سوال دارم. من اومدم برای خودم کد ساده ای نوشتم که عددی از کاربر بگیرم و در متغیری با نوع ushort ذخیره کنم. ظاهرا نباید مشکلی داشته باشه اما…
دستور ReadLine() باید در متغیری با نوع string ذخیره بشه. و دستور Read() هم در متغیری با نوع int.
خطایی که من دریافت میکردم حاکی از عدم توانایی در تبدیل string یا int (بسته به دستور دریافت ورودی) به ushort .
سوالم اینجاست که چرا این اتفاق میوفته؟ و چطوری ورودی ushort بگیرم؟
سپاس فراوان
مسعود درویشیان
19 April 2013
()ReadLine یه string برمیگردونه، واسه اینکه توی ushort ذخیرهاش کنی باید تبدیلش کنی
علیرضا اسکندرپور شوفری
19 April 2013
چیزی که خودم فکر میکردم این بود که بخاطر اون کاراکتر Enter پایانی هست که string بر میگردونه. درسته؟
ما تو PHP برای تبدیل نوع ها میگیم type juggling اینجا بهش چی میگن؟
بابت پاسخ بسیار سریعتون ممنونم. هر شب در حال خوندن 5 نوشته از سری زنگ سی شارپ هستم.
کوثر
11 September 2013
خیلی خوب بود ممنون
پاسخ ها هم جنبه ی آموزشی دارند
محمد
20 December 2013
دستتون درد نکنه عالیه
Arash
27 May 2014
سلام.اقا دمت گرم خیلی استفاده کردم اما یه مشکلی.اینجا من نمیدونم مثلا قسمت 14 خوندم چجوری باید 15 بیارم.این پایین یه چیزایی هستش اما درهمه و ترتیب نداره.
سعید
1 June 2014
آقا مسعود خیلی عالیه بیانت
esysss
15 July 2014
hi
بسیار عالی
فقط میخواستم بدونم این راه باینری رو دیگه چه جاهایی میتونیم به کار ببریم؟
مهدی
15 July 2014
سلام
استاد یک سوال دارم .
عددی که نوع دسیمال ذخیره میکنه بیشتره یا نوع دابل ؟
منظورم مقدار ععد صحیحی است ک در خود ذخیره میکنند نه اعشاری .
با تشکر
mehri
7 November 2014
وای دستت درد نکنه من داشتم ناامید میشدم ولی با خوندن مقالاتت خیلی خوشم اومد الان بهتر میفهمم
حیدر
2 January 2015
با سلام و عرض ادب و احترام،
یه سوال داشتم اگر یه وقت بی ربط بود ببخشید.
چطوری میتونیم جای عدد اعشاری و صحیح رو در شرایطی که عدد میتونه هر عچیزی باشه عوض کنیم. مثلاً یه ماشین حساب داریم مینویسیم که اگه کاربر عدد اعشاری داد قسمت صحیح و اعشاری رو بتونه جا به جا کنه.
مثلاً 14.34454 رو به 34454.14 تغییر بده یا بتونه 112.5482
حیدر
2 January 2015
با سلام و عرض ادب و احترام،
یه سوال داشتم اگر یه وقت بی ربط بود ببخشید.
چطوری میتونیم جای عدد اعشاری و صحیح رو در شرایطی که عدد میتونه هر عچیزی باشه عوض کنیم. مثلاً یه ماشین حساب داریم مینویسیم که اگه کاربر عدد اعشاری داد قسمت صحیح و اعشاری رو بتونه جا به جا کنه.
مثلاً 14.34454 رو به 34454.14 تغییر بده یا بتونه 125.656636 رو به 656636 که یک عدد صحیحه تغییر بده.
با تشکّر
حیدر
2 January 2015
با سلام، سوال ننوشتم فقط تایید بشه ، بلکه اگه لطف کنید جواب میخوام.
mansoreh
4 May 2015
سلام من سوال برنامه نویسی دارم نمیتونم حلش کنم لدفن کمک کنید هر چه سریع تر
سوال : برنامه ای بنویسید که بدون استفاده از متغییر سوم محتوای متغییر دوم را جا به جا کند و در خروجی نمایش دهد؟؟؟؟؟؟؟/
omid
3 February 2017
سلام جناب ببخشید اگه بخواییم دو عدد اعشاری از ورودی بگیریم بدون استفاده از متغیرهای اعشاری مثل float.double باید چیکار کنیم؟
mani
27 February 2017
سلام ممنون از آموزشتون من درس 4 هستم وتمام تمرین هارو با خودتون حل میکنم.امیدوارم همیشه موفق باشید و من هم بتونم روزی مثل شما به هر کس که به نرم افزار علاقه داره ولی امکاناتشو نداره کمک کنم تا یاد بگیره .اصلا فکر نمیکردم کد نویسی اینقدر شیرین باشه.از بس که کتاب های آموزشی سخت وپیچیده توضیح میدن آدم کلا زده میشه.بازم ممنون
امیرمهدی
24 July 2017
سلام ببخشید من توی مطلب دریافت ورودی از کاربر برام یه سوال پیش اومده که ما اینو فقط یه برنامه ساده نویشتیم که یه شخصی یه چیزی بنویسه و هرچی که نوشته به خودش برگرده ولی برای مثلا ساخت اکانت یا ورود به اکانت دقیقا باید چیکار کنیم ؟
محمد
20 January 2018
ببخشید یه سوال .؟ اول اینکه بسیار اموزشا عالیه واقعا 0 تا 100 که میگن اینه ایشالا همیشه موفق باشید .
سوالم اینه double.float/decimal اینا خودشون چی هستن یعنی مثلا جزو type value هستن
محمد کبیری
12 May 2018
سلام با تشکر از سایت خوبتون
میخواستم بپرسم که چجور میشه یه متقیر رو جلوی if در پرانتز گذاشت؟
مثلا اگر بخواییم برنامه سه تا عدد دریافت کنه و بگه ایا این میتونه یه مثلث قایم الزاویه باشه یانه (از طریق اندازه ضلع ها باید از روش فیثاغورس پیش بریم) دمیشه راهنماییم کنید؟ممنون
علیرضا
2 October 2018
با سلام و احترام
با وجود اینکه مدت زیادی از تهیه و انتشار این آموزش گذشته و این روزها آموزش های زیادی برای سی شارپ وجود داره اما ترجیح بنده این دوره هست چرا که آموزش های متنی کامل هستند. متشکرم از آقای درویشیان بابت زحمتی که کشیدند و با بیانی ساده این دوره آموزشی رو لذت بخش کردند .
استاد عزیز ، همچنان پشتیبانی میکنید از این دوره ؟ و به پرسش ها پاسخ می دین ؟
yaghoob
21 December 2018
سلام
چرا وقتی عدد اعشاری واردappها می کنم(app هایی که خودم نوشتم)
خطای زیررا میدهد
Input string was not in a correct format
لطفن کمکم کنید
کارون
23 September 2021
با تشکر از زحمات شما.
اگر ترتیب دروس رو زیر هر صفحه ساماندهی کنید ممنون میشم، البته پیدا کردن درس بعدی کار سختی نیست.
موفق باشید