آغاز کار با 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() نباشد بعنوان توابع سیستمی همانند dll های ویندوز در نظر گرفته میشود.
قبل از کلمه Main() کلمه دیگری با عنوان static آورده شده است.
این کلمه در اصطلاح Modifier میگویند.
استفاده از static برای متد Main() بیان میدارد که این متد تنها در در همین کلاس قابل اجراست و هیچ نمونهای (Instance) دیگری از روی آن قابل اجرا نمیباشد.
استفاده از static برای متد Main() الزامی است زیرا در ابتدای آغاز برنامه هیچ نمونهای از هیچ کلاس و شیای موجود نمیباشد و تنها متد Main() است که اجرا میشود.
(در صورتیکه با برخی اصطلاحات این متن از قبیل کلاس، شی، متد و نمونه آشنایی ندارید، این به دلیل آنست که این مفاهیم جزو مفاهیم اولیه برنامهنویسی شیگرا (OOP) هستند.
سعی میکنم در درسهای آینده به توضیح این مفاهیم نیز بپردازم، ولی فعلاً در همین حد کافی میباشد.) هر متد باید دارای یک مقدار بازگشتی باشد، یعنی باید مقداری را به سیستم بازگرداند، در این مثال نوع بازگشتی void تعزیف شده است که نشان دهنده آنست که این متد هیچ مقداری را باز نمیگرداند یا به عبارت بهتر خروجی ندارد.
همچنین هر متد میتواند دارای پارامترهایی نیز باشد که لیست پارامترهای آن در داخل پرانتزهای جلوی آن قرار میگیرد.
برای سادگی کار در این برنامه متد ما دارای هیچ پارامتری نیست ولی در ادامه همین درس به معرفی پارامترها نیز میپردازم.
متد Main() رفتار و عمل خود را بوسیله Console.WriteLine(…) مشخص مینماید.
Console کلاسی در System است و WriteLine() متدی در کلاس Console.
در زبان 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 : فهم ساختار پایهای یک برنامه در #C، آشنایی با Namespace، آشنایی با کلاس و ....
متغیرها، عبارات و عملگرها : آشنایی با متغیرها، آشنایی با انواع پیش فرض زبان، آشنایی با عبارات، آشنایی با رشتهها، آشنایی با آرایهها و ....
دستورالعملهای کنترلی - شرطی : آشنایی با دستور if ، آشنایی با دستور switch و break ، آشنایی با دستور goto و ....
دستورالعملهای کنترلی - حلقهها : آشنایی کلی با حلقهها - حلقه while - حلقه do while - حلقه for و foreach و ....
متدها : ساختار یک متد، انواع متدها، ایجاد نمونه جدید از اشیاء، انواع پارامترهای متد، فراخوانی متد، آشنایی با کلمه کلیدی this و ....
Namespaces : آشنایی با Namespace - هدایتگر using - هدایتگر alias - اعضای یک Namespace و ....
کلاسها : درک کاملتر کلاسها، سازنده و تخریب کننده در کلاسها ، اعضای کلاس و ....
ارثبری کلاسها : پیادهسازی کلاس پایه ، کلاسهای مشتق شده، مقدار دهی کلاس پایه، فراخوانی اعضای کلاس پایه، پنهان سازی اعضای کلاس چند ریختی Polymorphism : آشنایی با مفهوم چند ریختی، متدهای مجازی، Override کردن متدها، استفاده از چندریختی در برنامهها و ....
ویژگیها (Properties) : موارد استفاده، پیادهسازی و ایجاد property، ایجاد property های فقط خواندنی و فقط نوشتنی و ....
اندیکسر (Indexer) : پیادهسازی اندیکسر، سرریزی اندیکسر، اندیکسرهای چند پارامتری، نکات پیشرفته درباره اندیکسرها و ....
ساختارها (Structures) : ساختار چیست؟، پیادهسازی و استفاده از یک ساختار، تفاوت ساختار و کلاس و ....
واسطها و رابطها (Interfaces) : مفهوم کلی واسطها، تعریف یک واسط، استفاده از interface، پیادهسازی ارثبری در واسطها و ....
رخداد (Event) و delegate : درک مفهوم delegate، رخداد چیست؟
پیادهسازی رخدادها و delegate ها و ....
Exception Handling : درک مفهوم استثناء و چگونگی برخورد با آن، بررسی بلوکهای try/catch برای مقابله با استثناء و بلوک finally ....
صفتها (Attribute) : صفتها چه هستند و چگونه از آنها استفاده میکنیم، پارامترهای صفتها و انواع آنها، ساخت صفتهای شخصی و ....
انواع شمارشی (Enum) : انواع شمارشی چه هستند، چگونه تولید شده و چگونه مورد استفاده قرار می گیرند، موارد استفاده از آنها و ....
Overload کردن عملگرها : در این بحث با نحوه Overload کردن عملگرها آشنا خواهید شد.
ساختمان دادهها در سی شارپ (1) : در این بحث با مفاهیم اولیه ساختمان داده آشنا میشوید.
همچنین به معرفی ساختمان دادههای مهم و رایج نظیر آرایه و لیست نیز پرداخته شده است.
دستورالعملهای کنترلی و شرطی در این درس با دستورالعملهای کنترل و انتخاب در C# آشنا میشوید.
هدف این درس عبارتست از : یادگیری دستور if یادگیری دستور switch نحوه بکارگیری دستور break در دستور switch درک صحیح از نحوه بکارگیری دستور goto بررسی دستور if و انواع مختلف آن در درسهای گذشته، برنامههایی که مشاهده میکردید از چندین خط دستور تشکیل شده بودند که یکی پس از دیگری اجرا میشدند و سپس برنامه خاتمه مییافت.
در این برنامهها هیچ عمل تصمیمگیری صورت نمیگرفت و تنها دستورات برنامه به ترتیب اجرا میشدند.
مطالب این درس نحوه تصمیمگیری در یک برنامه را به شما نشان میدهد.
اولین دستور تصمیمگیری که ما آنرا بررسی مینماییم، دستورالعمل if است.
این دستور دارای سه فرم کلی : تصمیمگیری ساده، تصمیمگیری دوگانه، تصمیمگیری چندگانه میباشد.
مثال 1-3 – فرمهای دستورالعمل if using System; class IfSelect { public static void Main() { string myInput; int myInt; Console.Write("Please enter a number: "); myInput = Console.ReadLine(); myInt = Int32.Parse(myInput); //تصمیمگیری ساده و اجرای عمل داخل دو کروشه if (myInt > 0) { Console.WriteLine("Your number {0} is greater than zero.", myInt); } //تصمیمگیری ساده و اجرای عمل بدون استفاده از دو کروشه if (myInt Console.WriteLine("Your number {0} is less than zero.", myInt); // تصمیمگیری دوگانه if (myInt != 0) { Console.WriteLine("Your number {0} is not equal to zero.", myInt); } else { Console.WriteLine("Your number {0} is equal to zero.", myInt); } // تصمیمگیری چندگانه if (myInt { Console.WriteLine("Your number {0} is less than or equal to zero.", myInt); } else if (myInt > 0 && myInt { Console.WriteLine("Your number {0} is between 1 and 10.", myInt); } else if (myInt > 10 && myInt { Console.WriteLine("Your number {0} is between 11 and 20.", myInt); } else if (myInt > 20 && myInt { Console.WriteLine("Your number {0} is between 21 and 30.", myInt); } else { Console.WriteLine("Your number {0} is greater than 30.", myInt); } } //Main()پایان متد } //IfSelectپایان کلاس برنامه 1-3 از یک متغیر myInt برای دریافت ورودی از کاربر استفاده مینماید، سپس با استفاده از یک سری دستورات کنترلی، که همان دستور if در اینجاست، عملیات خاصی را بسته به نوع ورودی انجام میدهد.
در ابتدای این برنامه عبارت Please enter a umber: در خروجی چاپ میشود.
دستور Console.ReadLine() منتظر میماند تا کاربر ورودی وارد کرده و سپس کلید Enter را فشار دهد.
همانطور که در قبل نیز اشاره کردهایم، دستور Console.ReadLine() عبارت ورودی را به فرم رشته دریافت مینماید پس مقدار ورودی کاربر در اینجا که یک عدد است به فرم رشتهای در متغیر myInput که از نوع رشتهای تعریف شده است قرار میگیرد.
اما میدانیم که برای اجرای محاسبات و یا تصمیمگیری بر روی اعداد نمیتوان از آنها در فرم رشتهای استفاده کرد و باید آنها را بصورت عددی مورد استفاده قرار داد.
به همین منظور باید متغیر myInput را به نحوی به مقدار عددی تبدیل نماییم.
برای این منظور از عبارت Int32.Parse() استفاده مینماییم.
این دستور مقدار رشتهای متغیر داخل پرانتزش را به مقدار عددی تبدیل کرده و آنرا به متغیر دیگری از نوع عددی تخصیص میدهد.
در این مثال نیز همانطور که دیده میشود، myInput که تز نوع رشتهای است در داخل پرانتز قرار گرفته و این مقدار برابر با myInt که از نوع int است قرار گرفته است.
با این کار مقدار عددی رشته ورودی کاربر به متغیر myInt تخصیص داده میشود.
(توضیح کاملتری در مورد Int32 و سایر تبدیلات مشابه به آن در درسهای آینده و در قسمت نوعهای پیشرفته مورد بررسی قرار میگیرند.)حال ما متغیری از نوع مورد نظر در دست داریم و میتوانیم با استفاده از دستور if بر روی آن پردازش انجام داده و تصمیمگیری نماییم.
دستور if اولین دستور بصورت if (boolean expression) {statements} آورده شده است.
دستور if با استفاده از کلمه کلیدی if آغاز میشود.
سپس یک عبارت منطقی درون یک زوج پرانتز قرار میگیرد .
پس از بررسی این عبارات منطقی دستورالعمل/دستورالعملهای داخل کروشه اجرا میشوند.
همانطور که مشاهده مینمایید، دستور if یک عبارت منطقی را بررسی میکند.
در صورتیکه مقدار این عبارات true باشد دستورهای داخل بلوک خود را اجرا مینماید(قبلا توضیح داده شد که دستورهایی که داخل یک زوج کروشه {} قرار میگیرند در اصطلاح یک بلوک نامیده میشوند.) و در صورتیکه مقدار آن برابر با false باشد اجرای برنامه به بعد از بلوک if منتقل میشود.
در این مثال همانطور که ملاحظه مینمایید، عبارت منطقی دستور if بشکل if(myInt > 0) است.
در صورتیکه مقدار myInt بزرگتر از عدد صفر باشد، دستور داخل بلوک if اجرا میشود و در غیر اینصورت اجرای برنامه به بعد از بلوک if منتقل میگردد.
دومین دستور if دراین برنامه بسیار شبیه به دستور اول است، با این تفاوت که در این دستور، دستور اجرایی if درون یک بلوک قرار نگرفته است.
در صورتیکه بخواهیم با استفاده از دستور if تنها یک دستورالعمل اجرا شود، نیازی به استفاده از بلوک برای آن دستورالعمل نمیباشد.
استفاده از بلوک تنها زمانی ضروری است که بخواهیم از چندین دستور استفاده نماییم.
دستور if-else در بیشتر موارد از تصمیمگیریهای دوگانه یا چندگانه استفاده میشود.
در این نوع تصمیمگیریها، دو یا چند شرط مختلف بررسی میشوند و در صورت true بودن یکی از آنها عمل مربوط به آن اجرا میگردد.
سومین دستور if در این برنامه نشان دهنده یک تصمیمگیری دوگانه است.
در این حالت درصورتیکه عبارت منطقی دستور if برابر با true باشد دستور بعد از if اجرا میشود و در غیر اینصورت دستور بعد از else به اجرا در میآید.
در حقیقت در این حالت میگوئیم " اگر شرط if صحیح است دستورات مربوط به if را انجام بده و درغیر اینصورت دستورات else را اجرا کن".
فرم کلی دستور if-else بصورت زیر است : if (boolean expression) {statements} else {statements} که در آن boolean expression عبارت منطقی است که صحت آن مورد بررسی قرار میگیرد و statements دستور یا دستوراتی است که اجرا میگردند.
دستور if-else if … else یا if تودرتو در صورتیکه نیاز باشد تا چندین حالت منطقی مورد بررسی قرار گیرد و دستورات مربوط به یکی از آنها اجرا شود، از فرم تصمیمگیری چندگانه استفاده مینماییم.
این نوع استفاده از دستور if در اصطلاح به if تودرتو (Nested If) معروف است چراکه در آن از چندین دستور if مرتبط به یکدیگر استفاده شده است.
چهارمین دستور if در مثال 1-3 استفاده از if تودرتو را نشان میدهد.
در این حالت نیز دستور با کلمه کلیدی if آغاز میگردد.
شرطی بررسی شده و در صورت true بودن دستورات مربوط به آن اجرا میگردد.
اما اگر مقدار این عبارت منطقی false بود آنگاه شرطهای فرعی دیگری بررسی میشوند.این شرطهای فرعی با استفاده از else if مورد بررسی قرار میگیرند.
هر یک از این شرطها دارای عبارات منطقی مربوط به خود هستند که در صورت true بودن عبارت منطقی دستورات مربوط به آنها اجرا میگردد و در غیر اینصورت شرط بعدی مورد بررسی قرار میگیرد.
باید توجه کنید که در ساختار if تودرتو تنها یکی از حالتها اتفاق میافتد و تنها یکی از شرطها مقدار true را بازمیگرداند.
فرم کلی if تودرتو بشکل زیر است : if (boolean expression) {statements} else if (boolean expression) {statements} … else {statements} عملگرهای OR و AND (|| و &&) نکته دیگری که باید در اینجا بدان اشاره کرد، نوع شرطی است که در عبارت منطقی دستور if آخر مورد استفاده قرار گرفته است.
در این عبارت منطقی از عملگر || استفاده شده است که بیانگر OR منطقی است.
عملگر OR زمانی مقدار true بازمیگرداند که حداقل یکی از عملوندهای آن دارای مقدار true باشد.
بعنوان مثال در عبارت (myInt عبارت منطقی (myInt > 0 && myInt بررسی دستور switch همانند دستور if، دستور switch نیز امکان تصمیمگیری را در یک برنامه فراهم مینماید.
مثال 2-3 – دستورالعمل switch using System; class SwitchSelect { public static void Main() { string myInput; int myInt; begin: Console.Write("Please enter a number between 1 and 3: "); myInput = Console.ReadLine(); myInt = Int32.Parse(myInput); // بهمراه متغیری از نوع صحیح switch دستور switch (myInt) { case 1: Console.WriteLine("Your number is {0}.", myInt); break; case 2: Console.WriteLine("Your number is {0}.", myInt); break; case 3: Console.WriteLine("Your number is {0}.", myInt); break; default: Console.WriteLine("Your number {0} is not between 1 and 3.", myInt); break; } //switchپایان بلوک decide: Console.Write("Type \"continue\" to go on or \"quit\" to stop: "); myInput = Console.ReadLine(); // بهمراه متغیری از نوع رشتهای switch دستور switch (myInput) { case "continue": goto begin; case "quit": Console.WriteLine("Bye."); break; default: Console.WriteLine("Your input {0} is incorrect.", myInput); goto decide; } //switchپایان بلوک } //Main()پایان متد } //SwitchSelectپایان کلاس مثال 2-3 دو مورد استفاده از دستور switch را نشان میدهد.
دستور switch بوسیله کلمه کلیدی switch آغاز شده و به دنبال آن عبارت دستور switch قرار میگیرد.
عبارت دستور switch میتواند یکی از انواع زیر باشد : sbyte, byte, short, ushort, int, uint, long, ulong, char, string, enum .(نوع enum در مبحث جداگانهای مورد بررسی قرار خواهد گرفت.) در اولین دستور switch در مثال 2-3، عبارت دستور switch از نوع عددی صحیح (int) میباشد.
به دنبال دستور و عبارت switch، بلوک switch قرار میگیرد که در آن گزینههایی قرار دارند که جهت منطبق بودن با مقدار عبارت switch مورد بررسی قرار میگیرند.
هر یک از این گزینهها با استفاده از کلمه کلیدی case مشخص میشوند.
پس از کلمه کلیدی case خود گزینه قرار میگیرد و به دنبال آن ":" و سپس دستوری که باید اجرا شود.
بعنوان مثال به اولین دستور switch در این برنامه توجه نمایید.
در اینجا عبارت دستور switch از نوع int است.
هدف از استفاده از دستور switch آنست که از بین گزینههای موجود در بلوک switch، گزینهای را که مقدارش با مقدار عبارت switch برابر است پیدا شده و عمل مرتبط با آن گزینه اجرا شود.
در این مثال مقدار متغیر myInt بررسی میشود.
سپس اگر این مقدار با یکی از مقادیر گزینههای داخل بلوک switch برابر بود، دستور یا عمل مربوط به آن گزینه اجرا میگردد.
توجه نمایید که در این مثال منظور ما از گزینه همان عدد پس از case است و منظور از دستور عبارتی است که پس از ":" قرار گرفته است.
بعنوان مثال، در دستور زیر : case 1: Console.WriteLine("Your number is {0}.", myInt); عدد 1، گزینه مورد نظر ما و دستور Console.WriteLine(…)، عمل مورد نظر است.
در صورتیکه مقدار myInt برابر با عدد 1 باشد آنگاه دستور مربوط به case 1 اجرا میشود که همان Console.WriteLine("Your number is {0}.", myInt); است.
پس از منطبق شدن مقدار عبارت switch با یکی از case ها، بلوک switch باید خاتمه یابد که این عمل بوسیله استفاده از کلمه کلیدی break، اجرای برنامه را به اولین خط بعد از بلوک switch منتقل مینماید.
همانطور که در ساختار دستور switch مشاهده مینمایید، علاوه بر case و break، دستور دیگری نیز در داخل بلوک وجود دارد.
این دستور یعنی default، برای زمانی مورد استفاده قرار میگیرد که هیچ یک از گزینههای بلوک switch با عبارت دستور switch منطبق نباشند.
به عبارت دیگر درصورتیکه مقدار عبارت switch با هیچ یک از گزینههای case برابر نباشد، دستور مربوط به default اجرا میگردد.
استفاده از این دستور در ساختار بلوک switch اختیاری است.
همچنین قرار دادن دستور break پس از دستور default نیز اختیاری میباشد.
همانطور که قبلاً نیز گفته شد پس از هر دستور case، به منظور خاتمه دادن اجرای بلوک switch باید از یک break استفاده نمود.
دو استثنا برای این موضوع وجود دارد.
اول اینکه دو دستور case بدون وجود کد و دستورالعملی در بین آنها، پشت سر هم قرار گیرند و دیگری در زمانیکه از دستور goto استفاده شده باشد.
در صورتیکه دو دستور case بدون وجود کدی در بین آنها، پشت سر یکدیگر قرار گیرند، بدین معناست که برای هر دو case مورد نظر یک عمل خاص در نظر گرفته شده است.
به مثال زیر توجه نمایید.
switch (myInt) { case 1: case 2: case 3: Console.WriteLine("Your number is {0}.", myInt); break; default: Console.WriteLine("Your number {0} is not between 1 and 3.", myInt); break; } در این مثال، همانطور که مشاهده میکنید، سه دستور case بدون وجود کدی در بین آنها پشت سر یکدیگر قرار گرفتهاند.
این عمل بدین معناست که برای تمامی گزینههای 1، 2 و 3 دستور ;(Console.WriteLine("Your number is {0}.", myInt اجرا خواهد شد.
یعنی اگر مقدار myInt برابر با هر یک از مقادیر 1، 2 و 3 باشد، یک دستور برای آن اجرا میشود.
نکته قابل توجه دیگر در مورد بلوک switch آنست که، دستورات case حتماً نباید یک دستور باشد بلکه میتوان از یک بلوک دستور برای case استفاده نمود.
دومین استفاده از دستور switch در مثال 2-3، دارای عبارتی از نوع رشتهایست.
در این بلوک switch چگونگی استفاده از دستور goto نیز نشان داده شده است.
دستور goto اجرای برنامه را به برچسبی (label) که معین شده هدایت مینماید.
در حین اجرای این برنامه، اگر کاربر رشته continue وارد نماید، این رشته با یکی از گزینههای دومین switch منطبق میشود.
چون دستور case مربوط به این گزینه دارای دستور goto است، اجرای برنامه به برچسبی که این دستور مشخص کرده فرستاده میشود، بدین معنی که اجرای برنامه به ابتدای جایی میرود که عبارت begin: در آنجا قرار دارد (در اوایل متد Main()).
بدین صورت اجرای برنامه از بلوک switch خارج شده و به ابتدای برنامه و در جائیکه برچسب begin: قرار گرفته ارسال میشود.
در این برنامه، استفاده از چنین حالتی استفاده از goto باعث ایجاد یک حلقه شده است که با وارد کردن عبارت quit اجرای آن به پایان میرسد.
در صورتیکه هیچ یک از عبارات continue و یا quit وارد نشوند، اجرای switch به گزینه default میرود و در این گزینه ابتدا پیغام خطایی بر کنسول چاپ شده و سپس با استفاده از دستور goto پرشی به برچسب decide صورت میگیرد.
پس از پرش به برچسب decide، از کاربر پرسیده میشود که آیا میخواهد اجرای برنامه را ادامه دهد یا خیر.( با وارد کردن گزینههای continue یا quit) همانطور که میبینید در اینجا نیز حلقهای تولید شده است.
استفاده از دستور goto در بلوک switch میتواند موثر باشد اما باید توجه نمایید که استفادههای بی مورد از دستور goto باعث ناخوانا شدن برنامه شده و عیبیابی (Debug) برنامه را بسیار دشوار مینماید.
در برنامهنویسیهای امروزی استفاده از دستور goto بغیر از موارد بسیار لازم و ضروری منسوخ شده و به هیچ عنوان توصیه نمیشود.
برای تولید و ساخت حلقه نیز دستورات مفید و سودمندی در زبان تعبیه شدهاند که استفاده از goto را به حداقل میرسانند.
دستورات حلقه در مبحث آینده مورد بررسی قرار خواهند گرفت.
نکته پایانی این مبحث آنست که توجه نمایید که به جای استفاده از دستور switch میتوانید از چندین دستور if-else استفاده نماید.
دو قطعه برنامه زیر معادل یکدیگر میباشند.
switch(myChar) { case 'A' : Console.WriteLine("Add operation\n"); break; case 'M' : Console.WriteLine("Multiple operation\n"); break; case 'S' : Console.WriteLine("Subtraction operation\n"); break; default : Console.WriteLine("Error, Unknown operation\n");