درس اول : آغاز کار با C#
در این درس با ارائه چند برنامه و مثال ساده به طرز کار زبان C# میپردازیم.
اهداف این درس عبارتند از :
• فهم ساختار پایهای یک برنامه C#
• آشنایی با Namespace
• آشنایی با کلاس (Class)
• آشنایی با عملکرد متد Main()
• آشنایی با ورودی/خروجی یا I/O
لیست 1-1، یک برنامه ساده با عنوان Welcome در زبان C#
// Namespace اعلان
using System;
// کلاس آغازین برنامه
class WelcomeCSS
{
// آغاز کار اجرای برنامه
public static void Main()
{
// نوشتن متن در خروجی
Console.WriteLine(Welcome to the C# Persian Tutorial!);
}
}
برنامه لیست 1-1 دارای 4 پارامتر اصلی است، اعلان Namespace، کلاس، متد Main() و یک دستور زبان C#.
در همین جا باید به یک نکته اشاره کنم، برای زبان C# همانند بیشتر زبانهای برنامهسازی دو نوع کامپایلر وجود دارد.
یک نوع کامپایلر که به کامپایلر Command Line معروف است و نوع دیگر کامپایلر Visual است.
کامپایلرهای Command Line محیطی شبیه به محیط DOS دارند و با دادن یک سری دستورات به اجرا در میآیند.
کامپایلرهای Visual محیطی همانند ویندوز دارند که با دارا بودن محیط گرافیکی و ابزارهای خاص، برنامهنویس را در امر برنامهسازی کمک میکنند.
از نمونههای هر یک از کامپایلرها، میتوان به Microsoft C# Command Line Compiler که یک کامپایلر Command Line و Microsoft Visual C# که یک کامپایلر Visual است، اشاره کرد.
البته در حال حاضر بیشتر از کامپایلرهای ویژوال استفاده میشود.
من سعی میکنم در آینده به توضیح محیط Visual C# و Visual Studio.Net بپردازم.
اما فعلاً برای اجرای برنامهها میتوانید از Visual Studio.Net استفاده کنید.
پس از نصب آن، وارد محیط C# شده و در قسمت انتخاب برنامه جدید گزینه Console را جهت اجرای برنامهها انتخاب نمایید.
برای این درس، فعلاً به توضیحات بیشتر درباره محیط ویژوال نمیپردازم اما در آینده به توضیح کامل محیط Visual Studio.Net خواهم پرداخت.
برای اجرای کد بالا در صورتیکه از محیط ویژوال استفاده میکنید باید بر روی دکمه Run کلیک کنید و در صورتیکه کامپایلر Command Line دارید با دستور زیر میتوانید برنامه را اجرا کنید : csc Welcome.cs
پس از اجرای برنامه، کامپایلر برای شما یک فایل قابل اجرا(Executable) تحت نام Welcome.exe تولید میکند.
نکته : در صورتیکه از Visual Studio.Net(VS.Net) استفاده کنید، پس از اجرای برنامه، یک صفحه برای نمایش خروجی به سرعت باز شده و بسته میشود و شما قادر به دیدن خروخی نخواهید بود.
برای اینکه بتوانید خروجی برنامه را ببینید، در انتهای برنامه دستور زیر را وارد نمایید :
Console.ReadLine();
استفاده از این دستور باعث میشود تا برنامه منتظر دریافت یک ورودی از کاربر بماند، که در این حالت شما میتوانید خروجی برنامه خود را دیده و سپس با زدن کلید Enter برنامه را خاتمه دهید.
نکته دیگری که در مورد زبان برنامهنویسی C# باید مورد توجه قرار دهید اینست که این زبان Case Sensitive است، بدین معنا که به حروف کوچک و بزرگ حساس است یعنی برای مثال ReadLine با readLine متفاوت است به طوریکه اولی جزو دستورات زبان C# و دومی به عنوان یک نام برای متغیر یا یک تابع که از طرف کاربر تعریف شده است در نظر گرفته میشود.
اعلان Namespace به سیستم اعلان مینماید که شما از توابع کتابخانهای System جهت اجرای برنامهها خود استفاده مینمایید.
دستوراتی مانند WriteLine و ReadLine جزو توابع کتابخانهای System میباشند.
اغلب دستورات و توابع مهم و کلیدی استفاده از کنسول ورودی/خروجی در این کتابخانه میباشد.
در صورتیکه در ابتدای برنامه از using System استفاده نکنید، یابد در ابتدای هر یک از دستورات برنامه که مربوط این کتابخانه است، از کلمه System استفاده نمایید.
بعنوان مثال در صورت عدم استفاده از using System باید از دستور System.Console.WriteLine() به جای Console.WriteLine() استفاده نمایید.
تعریف کلاس،Class Welcome CSS، شامل تعریف دادهها(متغیرها) و متدها جهت اجرای برنامه است.
یک کلاس، جزو معدود عناصر زبان C# است که بوسیله آن میتوان به ایجاد یک شی (Object) از قبیل واسط ها (Interfaces) و ساختارها(Structures)، پرداخت.
توضیحات بیشتر در این زمینه در درسهای آینده ذکر میشوند.
در این برنامه کلاس هیچ داده و متغیری ندارد و تنها شامل یک متد است.
این متد، رفتار(Behavior) این کلاس را مشخص میکند.
متد درون این کلاس بیان میکند که این کلاس چه کاری را پس از اجرا شدن انجام خواهد داد.
کلمه کلیدی Main() که نام متد این کلاس نیز میباشد جزو کلمات رزرو شده زبان C# است که مشخص میکند برنامه از کجا باید آغاز به کار نماید.
وجود متد Main() در تمامی برنامههای اجرایی ضروری است.
در صورتیکه یک برنامه حاوی متد Main() نباشد بعنوان توابع سیستمی همانند dll های ویندوز در نظر گرفته میشود.
قبل از کلمه Main() کلمه دیگری با عنوان static آورده شده است.
این کلمه در اصطلاح Modifier میگویند.
استفاده از static برای متد Main() بیان میدارد که این متد تنها در در همین کلاس قابل اجراست و هیچ نمونهای (Instance) دیگری از روی آن قابل اجرا نمیباشد.
استفاده از static برای متد Main() الزامی است زیرا در ابتدای آغاز برنامه هیچ نمونهای از هیچ کلاس و شیای موجود نمیباشد و تنها متد Main() است که اجرا میشود.
(در صورتیکه با برخی اصطلاحات این متن از قبیل کلاس، شی، متد و نمونه آشنایی ندارید، این به دلیل آنست که این مفاهیم جزو مفاهیم اولیه برنامهنویسی شیگرا (OOP) هستند.
سعی میکنم در درسهای آینده به توضیح این مفاهیم نیز بپردازم، ولی فعلاً در همین حد کافی میباشد.)
هر متد باید دارای یک مقدار بازگشتی باشد، یعنی باید مقداری را به سیستم بازگرداند، در این مثال نوع بازگشتی void تعزیف شده است که نشان دهنده آنست که این متد هیچ مقداری را باز نمیگرداند یا به عبارت بهتر خروجی ندارد.
همچنین هر متد میتواند دارای پارامترهایی نیز باشد که لیست پارامترهای آن در داخل پرانتزهای جلوی آن قرار میگیرد.
برای سادگی کار در این برنامه متد ما دارای هیچ پارامتری نیست ولی در ادامه همین درس به معرفی پارامترها نیز میپردازم.
متد Main() رفتار و عمل خود را بوسیله Console.WriteLine(…) مشخص مینماید.
Console کلاسی در System است و WriteLine() متدی در کلاس Console.
در زبان C# از اپراتور .
(نقطه dot) جهت جداسازی زیرروتینها و زیرقسمتها استفاده میکنیم.
همانطور که ملاحظه میکنید چون WriteLine() یک متد درون کلاس Console است به همین جهت از .
جهت جداسازی آن استفاده کردهایم.
متد Main() رفتار و عمل خود را بوسیله Console.WriteLine(…) مشخص مینماید.
در زبان C# از اپراتور "." (نقطه dot) جهت جداسازی زیرروتینها و زیرقسمتها استفاده میکنیم.
همانطور که ملاحظه میکنید چون WriteLine() یک متد درون کلاس Console است به همین جهت از "." جهت جداسازی آن استفاده کردهایم.
در زبان C#، برای قرار دادن توضیحات در کد برنامه از // استفاده میکنیم.
بدین معنا که کامپایلر در هنگام اجرای برنامه توجهی به این توضیحات نمیکند و این توضیحات تنها به منظور بالا بردن خوانایی متن و جهت و کمک به فهم بهتر برنامه قرار میگیرند.
استفاده از // تنها در مواردی کاربرد دارد که توضیحات شما بیش از یک خط نباشد.
در صورت تمایل برای استفاده از توضیحات چند خطی باید در ابتدای شروع توضیحات از /* و در انتها آن از */ استفاده نمایید.
در این حالت تمامی مطالبی که بین /* */ قرار میگیرند به عنوان توضیحات (Comments) در نظر گرفته میشوند.
تمامی دستورات (Statements) با ";"، سمی کولون، پایان مییابند.
کلاسها و متدها با } آغاز شده و با { خاتمه مییابند.
تمامی دستورات بین { } یک بلوک را میسازند.
بسیاری از برنامهها از کاربر ورودی دریافت میکنند.
انواع گوناگونی از این ورودیها میتوانند به عنوان پارامتری برای متد Main() در نظر گرفته شوند.
لیست 2-1 برنامهای را نشان میدهد نام کاربر را از ورودی دریافت کرده و آن را بر روی صفحه نمایش میدهد.
این ورودی به صورت پارامتری برای متد Main() در نظر گرفته شده است.
لیست 2-1 : برنامهای که ورودی را از کاربر، بعنوان پارامتر Main()، دریافت میکند.
// Namespace اعلان using System; // کلاس آغازین برنامه class NamedWelcome { // آغاز اجرا برنامه public static void Main(string[] args) { // نمایش بر روی صفحه Console.WriteLine("Hello, {0}!", args[0]); Console.WriteLine("Welcome to the C# Persian Tutorial!"); } } توجه داشته باشید که این برنامه، ورودی را به صورت Command-Line دریافت میکند و در هنگام اجرای برنامه باید ورودی را در Command-Line وارد نمایید.
در صورتیکه ورودی را وارد ننمایید برنامه دچار مشکل شده و متوقف خواهد شد.
همان طور که در لیست 2-1 مشاهده مینمایید، پارامتر متد Main() با عنوان args مشخص شده است.
با استفاده از این نام در داخل متد میتوان آن استفاده نمود.
نوع این پارامتر از نوع آرایهای از نوع رشته (string[]) در نظر گرفته شده است.
انواع(types) و آرایهها را در درسهای بعدی بررسی میکنیم.
فعلاً بدانید که آرایه رشتهای جهت نگهداری چندین کاراکتر مورد استفاده قرار میگیرد.
[] مشخص کننده آرایه هستند که مانند یک لیست عمل میکند.
همانطور که ملاحظه میکنید در این برنامه دو دستور Console.WriteLine(…) وجود دارد که اولین دستور مقداری با دستور دوم متفاوت است.
همانطور که مشاهده میکنید داخل دستور Console.WriteLine(…) عبارتی به شکل {0} وجود دارد.
این آرگومان، نشان میدهد که به جای آن چه مقداری باید نمایش داده شود که در این جا args[0] نشان داده میشود.
عبارتی که داخل " " قرار دارد عیناً در خروجی نمایش داده میشود، به جای آرگومان {0}، مقداری که پس از " قرار دارد، قرار میگیرد.
حال به آرگومان بعدی یعنی args[0] توجه کنید.
مقدار صفر داخل [] نشان میدهد که کدام عنصر از آرایه مورد استفاده است.
در C# اندیس آرایه از صفر شروع میشود به همین جهت برای دسترسی به اولین عنصر آرایه باید از اندیس صفر استفاده کنیم.(همانطور که قبلاً نیز کفتم آرایهها را در درسهای آینده توضیح خواهم داد، هدف از این درس تنها آشنایی با C# است.!) مجدداً به آرگومان {0} بازگردیم.
این آرگومان نشان می دهد که یک مقدار باید در رشته خروجی قرار گیرد، این مقدار همان args[0] است.
اگر شما این برنامه را از طریق Command-Line اجرا نمایید خروجی شبیه به زیر خواهید گرفت : >Hello!, Meysam!
>Welcome to C# Persian Tutorial!
همان گونه که میبینید، پس از اجرای برنامه نام شما که از طریق Command-Line آنرا وارد نمودهاید در خروجی ظاهر میشود.
استفاده از آرگومان {n}، که در آن n یک مقدار عددی است، جهت فرمت دادن به متن خروجی است که بر روی صفحه به نمایش در میآید.
مقدار n از صفر آغاز شده و به ترتیب افزایش میباید.
به مثال زیر توجه کنید : Console.WriteLine("Hello!
,{0} ,{1}, {2}",args[0],args[1],args[2]); این خط از برنامه سه مقدار args[0],args[1],args[2] را در خروجی به ترتیب نمایش میدهد.
ملاحظه مینمایید که چون 3 مقدار را میخواهیم نمایش دهیم، سه بار از آرگومان {n} استفاده کردهایم و هر بار یک واحد به مقدار قبلی افزودهایم.
در آینده بیشتر با این مفاهیم آشنا میشویم.
مطلبی که باید در مورد لیست 2-1 به آن توجه شود آنست که این برنامه تنها از طریق Command-Lineقابل اجراست و در صورتیکه کاربر از این مطلب که برنامه باید دارای ورودی به صورت Command-Line باشد، بی اطلاع باشد و ورودی را در Command-Line وارد نکند، برنامه متوقف شده و اجرا نمیشود.
پس برای رفع چنین مشکلی باید از روش بهتری جهت دریافت ورودی از کاربر استفاده کرد.
لیست 3-1 : یک برنامه که قابلیت محاوره با کاربر را دارد.
// Namespace اعلان using System; // کلاس آغازین برنامه class InteractiveWelcome { //آغاز اجرای برنامه public static void Main() { // متنی بر روی صفحه نمایش داده میشود Console.Write("What is your name?: "); //متنی نمایش داده شده و برنامه منتظر دریافت ورودی میماند Console.Write("Hello, {0}!
", Console.ReadLine()); Console.WriteLine("Welcome to the C# Persian Tutorial!"); } } همانطوریکه در این برنامه دیده می شود، متد Main() دارای پارامتر نیست.
در عوض یک خط به متن برنامه لیست 2-1 اضافه شده است.
در اولین خط از این برنامه، متنی با عنوان اینکه نام شما چیست؟
بر روی صفحه ظاهر میشود.
سپس در خط بعدی پس از نوشتن کلمه Hello, ، برنامه منتظر دریافت ورودی از کاربر میشود.
بدین معنی که این بار تا زمانیکه کاربر متنی را به عنوان نام خود وارد نکند اجرای برنامه به پیش نخواهد رفت و خط بعدی اجرا نمیشود.
این برنامه روش ایجاد ارتباط از طریق برنامه با کاربر را نمایش میدهد.
در این مثال کاربر دقیقاً متوجه میشود که چه زمانی باید اطلاعات را وارد نماید و این اطلاعات چه باید باشد در حالیکه در مثال قبل چنین نبود.
همانگونه که میبینید در این برنامه آرگومان {0} مستقیماً از طریق دستور Console.ReadLine() دریافت میشود و بلافاصله در خروجی نمایش داده میشود.
دستور ReadLine() نیز یکی از متدهای کلاس Console است که بوسیله آن رشته ورودی خوانده میشود.
خروجی برنامه فوق به شکل زیر است : What is your name?: (سپس برنامه منتظر دریافت متنی از ورودی توسط کاربر میماند) (پس از اینکه کاربر رشتهای را وارد کرد و کلیدEnter را فشار داد، متن زیر نمایش داده میشود.) Hello, Meysam!
(سپس اجرای برنامه به دستور بعدی منتقل میشود) Welcome to the C# Persian Tutorial!
خروجی کامل برنامه : What is your name?: Hello, Meysam!
Welcome to the C# Persian Tutorial!
توجه کنید که ReadLine() به عنوان یک متد، مقداری را به سیستم بازمیگرداند.
این مقدار در این برنامه به آرگومان {0} برگردانده میشود.
این خط از برنامه را میتوان طور دیگری هم نوشت : string myName=Console.ReadLine(); Console.WriteLine("Hello, {0}!",myName); در این حالت ما یک متغیر از نوع رشته با نام myName تعریف کردهایم که مقدار ورودی در آن ذخیره میشود و سپس از این مقدار به عنوان مقداری که {0} میپذیرد استفاده کردهایم.
در این درس آموختید که ساختار کلی یک برنامه C# چگونه است.
هر برنامه C# از یک کلاس اصلی تشکیل میشود که این کلاس شامل دادهها و متغیرها و متدهایی میباشد.
متد آغازین برنامه که برنامه با آن شروع به اجرا میکند، متد Main() است.
با استفاده از توابع کتابخانهای مینوان به کلاسها و متدهای C# دسترسی پیدا کرد.
از جمله این توابع System بود که یکی از کلاسهای آن Console و چند متد این کلاس، متدهای WriteLine() و ReadLine() بودند.
درس دوم – عبارات، انواع و متغیرها در C# در این درس به معرفی عبارات، انواع و متغیرها در زبان C# میپردازیم.
هدف از این درس بررسی موارد زیر است : آشنایی با متغیرها فراگیری انواع(Types) ابتدایی در C# فراگیری و درک عبارات(Expressions) در C# فراگیری نوع رشتهای(String) در زبان C# فراگیری چگونگی استفاده از آرایهها(Arrays) در زبان C# متغیرها، به بیان بسیار ساده، مکانهایی جهت ذخیره اطلاعات هستند.
شما اطلاعاتی را در یک متغیر قرار میدهید و از این اطلاعات بوسیله متغیر در عبارات C# استفاده مینمایید.
کنترل نوع اطلاعات ذخیره شده در متغیرها بوسیله تعیین کردن نوع برای هر متغیر صورت میپذیرد.
C# زبانی بسیار وابسته به انواع است، بطوریکه تمامی عملیاتی که بر روی دادهها و متغیرها در این زبان انجام میگیرد با دانستن نوع آن متغیر میسر میباشد.
قوانینی نیز برای تعیین اینکه چه عملیاتی بر روی چه متغیری انجام شود نیز وجود دارد.(بسته به نوع متغیر) انوع ابتدایی زبان C# شامل : یک نوع منطقی(Boolean) و سه نوع عددی اعداد صحیح(integer)، اعداد اعشاری(Floating points) و اعداد دسیمال(Decimal) میباشد.(به انواع Boolean از اینرو منطقی میگوییم که تنها دارای دو حالت منطقی صحیح(True) و یا غلط(False) میباشند.) مثال 1 – نشان دادن مقادیر منطقی (Boolean) using System; class Booleans { public static void Main() { bool content = true; bool noContent = false; Console.WriteLine("It is {0} that C# Persian provides C# programming language content.", content); Console.WriteLine("The statement above is not {0}.", noContent); } } در این مثال، مقادیر منطقی متغیرهای Boolean به عنوان قسمتی از جمله در خروجی نمایش داده میشوند.
متغیرهای bool تنها میتوانند یکی از دو مقدار true یا false را داشته باشند، یعنی همانند برخی از زبانهای برنامهسازی مشابه، مانند C و یا C++، مقدار عددی نمیپذیرند، زیرا همانگونه که میدانید در این دو زبان هر مقدار عددی صحیح مثبت بغیر از صفر به عنوان true و عدد صفر به عنوان false در نظر گرفته میشود و در حقیقت نوع bool در این دو زبان نوعی integer میباشند.
اما در زبان C# انواع bool یکی از دو مقدار true یا false را میپذیرند.
خروجی برنامه بالا به صورت زیر است : It is True that C# Persian provides C# programming language content.
The statement above is not False.
جدول زیر تمامی انواع عددی صحیح C#، اندازه آنها و رنج قابل قبول آنها را نشان میدهد.
از این انواع برای محاسبات عددی استفاده میگردد.
یک نوع دیگر را نیز میتوان در این جدول اضافه نمود و آن نوع char است.
هر چند شاید از نظر بسیاری از دوستانی که با زبانهای دیگر برنامهسازی کار کردهاند این تقسیم بندی غلط به نظر آید، اما باید گفت که در زبان C# نوع char نیز نوع خاصی از انواع عددی است که رنجی بین صفر تا 65535 دارد و اندازه آن نیز 16 بیتی است، اما به جای نمایش دادن مقادیر عددی تنها میتواند بیان کننده یک کاراکتر باشد.
در آینده در این مورد بیشتر توضیح خواهم داد.
جدول زیر تمامی انواع عددی اعشاری زبان C# را نمایش میدهد.
انواعی از نوع floating point هنگامی استفاده میشوند که محاسبات عددی به دقتهای اعشاری نیاز داشته باشند.
همچنین برای منظورهای تجاری استفاده از نوع decimal بهترین گزینه است.
این نوع تنها در زبان C# وجود دارد و در زبانهای مشابه به آن نظیر Java چنین نوعی در نظر گرفته نشده است.
در یک زبان برنامهسازی نتایج بوسیله ایجاد یک سری عبارت تولید میگردند.
عبارات از ترکیب متغیرها و عملگرها در دستورالعملهای یک زبان ایجاد میگردند.(توجه نمایید که عبارت معادل expression و دستورالعمل معادل statement میباشد که ایندو با یکدیگر متفاوت میباشند.) جدول زیر عملگرهای موجود در زبان C#، حق تقدم آنها و شرکتپذیری آنها را نشان میدهد.
شرکتپذیری از چپ بدین معناست که عملیات از چپ به راست محاسبه میشوند.
شرکتپذیری از راست بدین معناست که تمامی محاسبات از راست به چپ صورت میگیرند.
به عنوان مثال در یک عمل تساوی، ابتدا عبارات سمت راست تساوی محاسبه شده و سپس نتیجه به متغیر سمت چپ تساوی تخصیص داده میشود.
مثال 2- عملگرهای یکانی (Unary) using System; class Unary { public static void Main() { int unary = 0; int preIncrement; int preDecrement; int postIncrement; int postDecrement; int positive; int negative; sbyte bitNot; bool logNot; preIncrement = ++unary; Console.WriteLine("Pre-Increment: {0}", preIncrement); preDecrement = --unary; Console.WriteLine("Pre-Decrement: {0}", preDecrement); postDecrement = unary--; Console.WriteLine("Post-Decrement: {0}", postDecrement); postIncrement = unary++; Console.WriteLine("Post-Increment: {0}", postIncrement); Console.WriteLine("Final Value of Unary: {0}", unary); positive = -postIncrement; Console.WriteLine("Positive: {0}", positive); negative = +postIncrement; Console.WriteLine("Negative: {0}", negative); bitNot = 0; bitNot = (sbyte)(~bitNot); Console.WriteLine("Bitwise Not: {0}", bitNot); logNot = false; logNot = !logNot; Console.WriteLine("Logical Not: {0}", logNot); } } به هنگام محاسبه عبارات، دو عملگر x++ و x—(که در اینجا کاراکتر x بیان کننده آن است که عملگرهای ++ و – در جلوی عملوند قرار میگیرند post-increment و post-decrement) ابتدا مقدار فعلی عملوند (operand) خود را باز میگرداند و سپس به عملوند خود یک واحد اضافه کرده یا از آن یک واحد میکاهند.
عملگر ++ یک واحد به عملوند خود اضافه میکند و عملگر – یک واحد از عملوند خود میکاهد.
بدین ترتیب عبارت x++ معادل است با عبارت x=x+1 و یا x+=1 اما همانطور که گفته شد باید توجه داشته باشید که این عملگرها(++ و --) ابتدا مقدار فعلی عملوند خود را برگشت میدهند و سپس عمل خود را روی آنها انجام میدهند.
بدین معنی که در عبارت x=y++ در صورتیکه در ابتدای اجرای برنامه مقدار x=0 و y=1 باشد، در اولین اجرای برنامه مقدار x برابر با 1 یعنی مقدار y میشود و سپس به متغیر y یک واحد افزوده میشود، در صورتیکه اگر این عبارت را بصورت x=++y بنویسیم در اولین اجرای برنامه، ابتدا به مقدار متغیر y یک واحد افزوده میشود و سپس این مقدار به متغیر x تخصیص داده میشود که در این حالت مقدار متغیر x برابر با 2 میشود.(در مورد عملگر – نیز چنین است.) پس با این توضیح میتوان گفت که دو عملگر ++x و –x ابتدا به عملوند خود یک واحد اضافه یا یک واحد از آن کم میکنند و سپس مقدار آنها را باز میگردانند.
در مثال 2، مقدار متغیر unary در قسمت اعلان برابر با 0 قرار گرفته است.
هنگامیکه از عملگر ++x استفاده میکنیم، به مقدار متغیر unary یک واحد افزوده میشود و مقدارش برابر با 1 میگردد و سپس این مقدار، یعنی 1، به متغیر preIncrement تخصیص داده میشود.
عملگر –x مقدار متغیر unary را به 0 باز میگرداند و سپس این مقدار را به متغیر preDecrement نسبت میدهد.
هنگامیکه از عملگر x-- استفاده میشود، مقدار متغیر unary، یا همان مقدار صفر، به متغیر postDecrement تخصیص داده میشود و سپس از مقدار متغیر unary یک واحد کم شده و مقدار این متغیر به 1- تغییر میکند.
سپس عملگر x++ مقدار متغیر unary، یعنی همان 1-، را به متغیر postIncrement تخصیص میدهد و سپس یک واحد به مقدار متغیر unary میافزاید تا مقدار این متغیر برابر با 0 (صفر) شود.
مقدار متغیر bitNot در هنگام اعلان برابر با صفر است.
با استفاده از عملگر نقیض بیتی (~) (یا عملگر مکملگیری) متغیر bitNot بعنوان یک بایت در نظر گرفته میشود و مقدار آن منفی یا نقیض میشود.
در عملیات بیتی نقیض بدین معناست که تمامی یکها به صفر و تمامی صفرها به یک تبدیل شوند.
در این حالت نمایش باینری عدد صفر یا همان 00000000 به نقیض آن یعنی 11111111 تبدیل میگردد.
در این مثال به عبارت (sbyte)(~bitNot) توجه نمایید.
هر عملی که بر روی انواع short،unshort ، byte و sbyte انجام شود، مقداری از نوع int را باز میگرداند.
بمنظور اینکه بتوانیم نتیجه دلخواه را به متغیر bitNot تخصیص دهیم باید از فرمت (Type) operator استفاده نماییم که در آن Type نوعی است میخواهیم نتیجه ما به آن نوع تبدیل شود و operator عملی است که بر روی متغیر صورت میپذیرد.
به بیان دیگر چون میخواهیم مقدار متغیر bitNot بصورت بیتی در نظر گرفته شود، پس باید نتیجه عمل ما بصورت بیتی در آن ذخیره شود که استفاده از نوع sbyte باعث میشود تا نتیجه به فرم بیتی (یا بایتی) در متغیر ما ذخیره شود.
باید توجه نمایید که استفاده از فرمت (Type) یا در اصطلاح عمل Casting، در مواقعی که میخواهیم تغییری از یک نوع بزرگتر به نوع کوچکتر ایجاد نماییم، مورد استفاده قرار گیرد، چرا که در این حالات ممکن است با از دست دادن اطلاعات مواجه باشیم.
در این مثال چون میخواهیم نوع بزرگتر int را به(32 بیتی) به نوع کوچکتر sbyte (8 بیتی) تبدیل نماییم، بدین منظور باید بطور صریح از عمل Casting استفاده نماییم تا اطلاعاتی در این تبدیل از بین نرود.
در مورد تبدیل انواع کوچکتر به انواع بزرگتر(مثلا تبدیل sbyte به int) نیازی به استفاده از عمل Casting نیست چرا که امکان از بین رفتن اطلاعات وجود ندارد.
در ضمن باید به یک نکته مهم توجه نمایید و آن تبدیل انواع علامتدار(Signed) و بدون علامت(Unsigned) به یکدیگر است.
در این حالت خطر بسیار مهمی دادههای شما را تهدید مینماید.
بحث در مورد مسائل پیچیدهتر در مورد تبدیل انواع علامتدار و و بدون علامت به یکدیگر در اینجا نمیگنجد و سعی میکنم تا آنها را در مطالب بعدی و در جای لازم مورد بحث و بررسی قرار دهم.(در صورتیکه برخی از مطالب این قسمتها برای شما به خوبی قابل درک نیست، نگران نباشید چراکه در آینده در مثالهایی که خواهید دید تمامی این مطالب را در عمل نیز حس کرده و با آنها آشنا خواهید شد.) عملگر بعدی که در این برنامه مورد استفاده قرار گرفته است، عملگر نقیض منطقی یا همان "!" است که امکان تغییر مقدار یک متغیر Boolean را از true به false و بالعکس را فراهم میآورد.
در مثال بالا(مثال شماره 2) مقدار متغیر logNot پس از استفاده از عملگر "!" از false به true تغییر کرده است.
با توجه به توضیحات اخیر خروجی زیر از برنامه مثال 2 مورد انتظار است : Pre-Increment: 1 Pre-Decrement 0 Post-Decrement: 0 Post-Increment -1 Final Value of Unary: 0 Positive: 1 Negative: -1 Bitwise Not: -1 Logical Not: True مثال 3 – عملگرهای دوتایی using System; class Binary { public static void Main() { int x, y, result; float floatResult; x = 7; y = 5; result = x+y; Console.WriteLine("x+y: {0}", result); result = x-y; Console.WriteLine("x-y: {0}", result); result = x*y; Console.WriteLine("x*y: {0}", result); result = x/y; Console.WriteLine("x/y: {0}", result); floatResult = (float)x/(float)y; Console.WriteLine("x/y: {0}", floatResult); result = x%y; Console.WriteLine("x%y: {0}", result); result += x; Console.WriteLine("result+=x: {0}", result); } } خروجی این برنامه به فرم زیر است : x+y: 12 x-y: 2 x*y: 35 x/y: 1 x/y: 1.4 x%y: 2 result+=x: 9 مثال 3 استفادههای متفاوتی از عملگرهای دوتایی را نشان میدهد.(منظور از عملگر دوتایی، عملگری است که دارای دو عملوند میباشد مانند عملگر جمع "+").
بسیاری از عملگرهای مورد استفاده در این مثال عملگرهای ریاضی هستند و نتیجه عمل آنها مشابه عملی است که از آنها در ریاضیات دیدهاید.
از نمونه این عملگرها میتوان به عملگرهای جمع "+"، تفریق "-"، ضرب "*" و تقسیم "/" اشاره نمود.
متغیر floatResult از نوع اعشاری یا float تعریف شده است.
در این مثال نیز صریحاً از عمل Casting جهت اسفاده از دو متغیر x و y که از نوع int هستند، برای انجام عملی که نتیجهاش از نوع float است، استفاده کردهایم.
در این مثال از عملگر "%" نیز استفاده کردهایم.
این عملگر در عملیات تقسیم کاربرد دارد و باقیمانده تقسیم را برمیگرداند.
یعنی دو عملوند خود را بر یکدیگر تقسیم میکند و باقیمانده این تقسیم را برمیگرداند.
در این مثال همچنین فرم جدیدی از عمل انتساب را بصورت result+=x مشاهده مینمایید.
استفاده از عملگرهای انتسابی که خود ترکیبی از دو عملگر هستند، جهت سهولت در امر برنامهنویسی مورد استفاده قرار میگیرند.
عبارت فوق معادل result = result+x میباشد.
یعنی مقدار قبلی متغیر result با مقدار متغیر x جمع میشود و نتیجه در متغیر result قرار میگیرد.
یکی دیگر از انواعی که تا کنون با آن سر و کار داشتهایم نوع رشتهای (string) است.
یک رشته، از قرار گرفتن تعدادی کاراکتر در کنار یکدیگر که داخل یک زوج کوتیشن " " قرار گرفتهاند، ایجاد میگردد.
بعنوان مثال "Hi This is a string type".
در اعلان متغیرها نیز در صورت تعریف متغیری از نوع رشتهای، در صورت نیاز به تخصیص مقدار به آن، حتماً کاراکترهایی که میخواهیم بعنوان یک رشته به متغیرمان نسبت دهیم را باید داخل یک زوج کوتیشن " " قرار دهیم.
به مثال زیر توجه نمایید.
string Name; … Name = "My name is Meysam"; همانطور که در این مثال مشاهده مینمایید، متغیری از نوع رشتهای تحت نام Name تعریف شده است و سپس در جایی از برنامه که نیاز به تخصیص مقدار برای این متغیر وجود دارد، عبارت مورد نظر را داخل دو کوتیشن قرار داده و به متغیر خود تخصیص دادهایم.
رشتهها از پر کاربرد ترین انواع در زبانهای برنامهسازی جهت ایجاد ارتباط با کاربر و دریافت اطلاعات از کاربر میباشند.(همانطور که در درس قبل اول نیز گفته شد، دستور Console.ReadLine() یک رشته را از ورودی دریافت مینماید.) در مثالهایی که در طی درسهای این سایت خواهید دید، نمونههای بسیاری از کاربرد انواع مختلف و نیز نوع رشتهای را خواهید دید.
آرایهها(Arrays) یکی دیگر از انواع دادهای در زبان C#، آرایهها (Arrays) میباشند.
یک آرایه را به عنوان مخزنی برای نگهداری اطلاعات در نظر میگیریم که دارای لیستی از محلهایی است که در آنها اطلاعات ذخیره شده است و از طریق این لیست میتوان به اطلاعات آنها دسترسی پیدا نمود.
به هنگام اعلان آرایهها باید نوع، اندازه و تعداد بعد آنها را نیز معین نمود.
مثال 4- آرایهها و عملیات بر روی آنها using System; class Array { public static void Main() { int[] myInts = { 5, 10, 15 }; bool[][] myBools = new bool[2][]; myBools[0] = new bool[2]; myBools[1] = new bool[1]; double[,] myDoubles = new double[2, 2]; string[] myStrings = new string[3]; Console.WriteLine("myInts[0]: {0}, myInts[1]: {1}, myInts[2]: {2}", myInts[0], myInts[1], myInts[2]); myBools[0][0] = true; myBools[0][1] = false; myBools[1][0] = true; Console.WriteLine("myBools[0][0]: {0}, myBools[1][0]: {1}", myBools[0][0], myBools[1][0]); myDoubles[0, 0] = 3.147; myDoubles[0, 1] = 7.157; myDoubles[1, 1] = 2.117; myDoubles[1, 0] = 56.00138917; Console.WriteLine("myDoubles[0, 0]: {0}, myDoubles[1, 0]: {1}", myDoubles[0, 0], myDoubles[1, 0]); myStrings[0] = "Joe"; myStrings[1] = "Matt"; myStrings[2] = "Robert"; Console.WriteLine("myStrings[0]: {0}, myStrings[1]: {1}, myStrings[2]: {2}", myStrings[0], myStrings[1], myStrings[2]); } } خروجی مثال 4 بصورت زیر است : myInts[0]: 5, myInts[1]: 10, myInts[2]: 15 myBools[0][0]: True, myBools[1][0]: True myDoubles[0, 0]: 3.147, myDoubles[1, 0]: 56.00138917 myStrings[0]: Joe, myStrings[1]: Matt, myStrings[2]: Robert در این مثال انواع مختلفی از آرایهها اعلان شدهاند.
در ابتدا یک آرایه تک بعدی، سپس آرایهای دندانهدار و در نهایت نیز یک آرایه دو بعدی در این مثال اعلان شدهاند.
اولین اعلان در این برنامه مربوط به اعلان آرایه تک بعدی myInts میباشد که از نوع int بوده و دارای 3 عضو میباشد که تعداد این اعضا با اعلان چند مقدار در داخل { } معین شده است.
همانطور که از این اعلان دریافت میشود، آرایه تک بعدی بصورت زیر تعریف میشود : type[] arrayName; که در آن type نوع آرایه و arrayName نام آرایه ایست که تعریف مینمائیم.
اما در ابتدا گفته شد که به هنگام اعلان آرایهها اندازه آنها نیز باید مشخص شود.
برای تعیین اندازه آرایه، یعنی تعدا عناصری که آرایه در خود جای میدهد، میتوان به چند روش عمل نمود.
اولین و سادهترین روش که در این مثال نیز آورده شده است، تخصیص مقادیری به آرایه در داخل یک زوج { } است.
بسته به نوع آرایه، تعداد عناصری که داخل این زوج { } قرار میگیرند، تعداد عناصر آرایه میباشند و مقادیر عناصر آرایه نیز همان مقادیری است که داخل { } قرار گرفته است.
به عنوان مثال در مثال 4، اولین آرایه ما دارای 3 عنصر است که مقادیر آنها به ترتیب برابر با 5، 10 و 15 میباشد.
روش دیگر جهت تعیین اندازه آرایه استفاده از روش تعریف کامل آرایه است که به فرم کلی زیر میباشد.
type[] arrayName = new type[n]; که در این تعریف، استفاده از کلمه کلیدی new باعث ایجاد نمونهای جدید از نوع مورد نظر، میشود.
n نیز تعداد عناصر آرایه است که میخواهیم آنرا تولید نماییم.
در این حالت باید توجه داشت که آرایهای تهی را تولید نمودهایم و هیچ عنصری را در آرایه جای ندادهایم و در برنامه باید آرایه را مقدار دهی نماییم.
به مثال زیر توجه کنید.
int[] myArray = new int[15]; این مثال آرایهای تک بعدی از نوع int را با اندازه 15 عنصر تولید مینماید.
یعنی این آرایه قادر است تا 15 عنصر از نوع int را در خود ذخیره نماید.
گونه دیگری از آرایهها، آرایههای چند بعدی (Multi Dimensional Arrays) هستند که برای نگهداری اطلاعات از چندین بعد استفاده میکنند و بیشتر برای نگداری جداول و ماتریسها مورد استفاده قرار میگیرند.
فرم کلی اعلان این آرایهها بصورت زیر است : type[ , , … , ] arrayName = new type[n1, n2, ….
, nm]; که در آن تعداد ابعاد آرایه با ویرگول مشخص شده و n1 تا nm نیز تعداد عناصر هر یک از ابعاد است.
بعنوان مثال تعریف یک آرایه سه بعدی به فرم زیر است : char[ , , ] charArray = new char[3,5,7]; در این مثال یک آرایه سه بعدی از نوع char تولید کردهایم که ابعاد آن به ترتیب دارای 3، 5 و 7 عنصر میباشند.
نوع دیگری از آرایهها، آرایههای دندانهدار (Jagged Arrays) هستند.
این نوع آرایهها تنها در زبان C# وجود دارند و در صرفهجویی حافظه بسیار موثر میباسند.
یک آرایه دندانهدار، در حقیقت یک آرایه تک بعدی است که هر یک از اعضای آن خود یک آرایه تک بعدی میباشند.
اندازه این عناصر میتواند متفاوت باشد و تفاوت این آرایهها با آرایههای چند بعدی در همین جا نمایان میشود.
استفاده از این آرایهها در مواردی کاربرد دارد که نیازی نیست تا تمامی ابعاد آرایه دارای تعداد عناصر مساوی باشند.
بعنوان مثال فرض کنید میخواهید آرایهای جهت نگهداری تعداد روزهای ماههای مختلف سال تهیه کنید.
در صورتیکه بخواهید از آرایه چند بعدی استفاده نمایید، چون تعداد روزهای تمامی ماههای سال یکسان نیست، مجبورید تا تعداد عناصر تمام بعدهای آرایه را برابر با بزرگترین تعداد روز ماهها، یعنی 31، تعریف نمایید.
ولی چون تنها 6 ماه دارای 31 روز میباشند، برای 6 ماه دیگر تعدادی از عناصر آرایه هیچگاه مورد استفاده قرار نمیگیرند و حافظه را به هدر دادهایم.
اما در صورتیکه برای این مثال از آرایههای دندانهدار استفاده نماییم، میتوانیم یک آرایه دندانهدار 12 عنصری تعریف نماییم و سپس تعداد عناصر هر یک از اعضای آنرا برابر با تعداد روزهای ماه مورد نظر تعریف کنیم :