زنگ سیشارپ – قسمت چهارم
نوشته مسعود درویشیان • 06 خرداد 1391
در قسمت سوم زنگ سیشارپ توضیحات مختصری در مورد 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 که از جنس flaot است مقدار ۱۶.۸ را در خود نگهداری میکند. نکتهی 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();
این دستور وقتی بهاین صورت و بدون هیچ ورودی استفاده شود تنها یک خط خالی را چاپ میکند و معمولاً برای اینکه خروجیها خواناتر باشند استفاده میشود.
توجه: زین پس انتشار مقالات زنگ سیشارپ در وبلاگینا متوقف و از ابتدا در وبتارگت منتشر میشود و حدوداً تا صد قسمت همراه با دانلود مقالات در قالب فایل پیدیاف پیش خواهد رفت.
ماهان
mrC
hamzeh
salam hanooz hamasho nakhondam ama, mr30vase amozeshaton omidvaram edame dashte
bashe ta akhar
کالارنا
ممنون مسعود جان بازم گل کاشتی
آرش
بسیار دارم از آموزشتون لذت میبرم. ادامه بدبن. در نهایت اگر کل آموزشهارو در قالب یک فایل جمع کنید عالی میشه. باز هم ممنون
عمران
سلام
خیلی خیلی ممنون. خدا قوت!
یه پیشنهاد: یه مقدار که کار جلو رفت (حالا دقیقا تا کجاش رو شما بهتر میدونید!) بیاید یه پروژه تعریف کنید و بگید میخوایم برای فلان موضوع یه برنامه بنویسیم. یه پروژه ای که خیلی ساده نباشه و خیلی زیاد هم سخت نباشه. بعد شروع کنید اول نحوۀ تقسیم بندی پروژه به برنامه های کوچیک تر رو شرح بدید و بعدش هم تو هر پست چیزایی که باید برای اون بلد باشیم رو یاد بدید.
ای کاش میشد یه تشکر اساسی تر هم از شما کرد!
مسعود درویشیان
سلام
خواهش میکنم، مرسی که دنبال میکنید
بله حتماً، اینچنین برنامهای رو مد نظر داشتیم و یک سری مباحث رو که مطرح کردیم، در قالب تمرین به دوستان یه پروژه خواهیم داد و وقتی زمان حل پروژه تمام شد، نحوهی انجام و حل پروژه رو کامل در قالب یک یا چند مقاله توضیح میدیم.
amir
امیدوارم این برنامه آموزشی ، ادامه دار و خوب باشه و در جا نزنه …… در ضمن بابت محتوای خوبی که ارائه میدید تشکر می کنم ….
یا حق
mohammad AJ
main()
{
agha dameton garm kheili khobe;
ma ta tahe term hastim;
MrC;
}
محمدی
یه سوال:
مگه اولش مشخص نمیکنیم که چه متغیری تعریف کردیم؟ پس چرا تو مقدار دهی هم باید بهش بفهمونیم؟
مسعود درویشیان
سلام
شما ابتدا یک متغیر رو تعریف میکنید، مثلاً میگید:
int i
تا اینجا شما متغیر i رو تعریف کردید ولی هنوز متغیر i هیچ مقداری رو نداره و برای مقداردهی به i میگید:
i = 10
محمدی
منظورم اینه وقتی float مشخص کردیم چرا باید تو مقدار دهی هم بگیم 16.8F ؟
مسعود درویشیان
همینطور که تو مقاله ذکر شد، چون مقادیر اعشاری بهصورت پیشفرض double هستند و زمانیکه شما میخواهید مثلاً بگید float example = 16.5 وقتی میخواهید برنامه رو اجرا کنید کامپایلر به شما یک پیغام خطا میده و میگه که: “عدد 16.5 که شما نوشتهاید از جنس double هست، من نمیتونم عددی از جنس double رو توی متغیری از جنس float بریزم! کاراکتر F یا f رو به عددتون اضافه کنید تا این مشکل برطرف بشه”
به همین دلیل شما باید بنویسید: float example = 16.5F
و به همین دلایلی که گفته شد از m یا M برای دسیمال استفاده میشه
البته برای اینکارها از کانورت (cast) استقاده میشه که توی مقالات آینده توضیح میدیم.
پدرام
تشکر آقای درویشیان ….. تمام منابع آموزشی بسیار سخت و مستقیما از محیط فرم شروع کردن که به نظرم روش شما خیلی بهتره…
راستی دیگه از آموزش ASP.NET خبری نیست آقای حقی….؟
مهدیه
سلام اگه موقع استفاده از این دستور نوع داده هامون یکی نبود مثلا یکی رشته بود و یکی اعشاری چجوری قرار میدیم؟براساس تعداد بایت هایی که میگیرن؟Console.WriteLine(“Hi there, {0} {1}!”, userName, userSurname);منظورم داخل آکولادا چی میذارین؟
مسعود درویشیان
اگر منظورتون این دستور هست:
Console.WriteLine(“Hi there, {0} {1}!”, userName, userSurname);
داخل آکولاد، شمارههایی که قرار داده میشه، بهترتیب نشاندهندهی متغیرهایی هست که بعد از string اسمشون رو میاریم، و اینکه این متغیرها از چه جنسی هستند هیچ فرقی نمیکنه چون فقط قرار با این دستور نمایش داده بشن. {0} متغیر اولی رو نشون میده، {1} متغیر دومی و الا آخر…
پاسختون رو گرفتید ؟!
یا من اشتباه سوالتون رو برداشت کردم؟!
مهدیه
سلام بله منظورم همین بود خیلی ممنون .
milad
خیلی ممنون این قسمت هم مثل قسمتای قبل مفید و عالی بود
مرسی مرسی
amini
عالی بود… دستتون درد نکنه
آریا
سلام
در آخرین آموزش بهتر است
Console.ReadKey();
اضافه کنیم چونکه بدون readkey صفحه زود تموم میشه
و وقتی Console.ReadKey(); بذاریم صفحه بسته نمیشه و باز میمونه
ابی
با سلام من یه برنامه با سی شارپ دارم که این ارور میده کسی ههست بتونه کمکم کنه cannot open database “grocery” requested by the login.the login failed.login failed for user ‘ebikazem’.
tina
slm va khoda ghovat age mishe y tozihi dar bareye nahveye daryaft add v shomaresh on va maghlob kardane hamon add v majmoo add ha baham bedin ba tashakor
دانشگاههای ترکیه
very thanks