مشخصات مقاله
-
1627
-
0.0
-
2690
-
0
-
0
آموزش دستورهای کنترلی-گزینش(selection)
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
دستورهای کنترلی - گزینش
درس 3 : دستورهای کنترلی-گزینش ((selection
اهداف این مبحث
آموزش دستورهای if
آموزش دستورهای switch
آموزش نحوه ی استفاده از break در دستورهای switch
آموزش شیوه ی استفاده درست از دستورهای goto
دستورهای if
دستورهای if به شما اجازه می دهد بسته به وضعیت معلوم از مسیرهای مختلف منطق استفاده کنید. هنگامی که وضعیت به true، Boolean ارزیابی شود، بلوکی از کُد برای آن وضعیت اجرا می شود. گزینه های پیش روی شما یک دستور if، چند دستور else if و یک دستور اختیاری else می باشد. Listing3-1نحوه ی کارکرد دستورهای if را نشان می دهد.
Listing 3-1.فرم های دستور if : IfSelection.cs
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); // Single Decision and Action with braces if (myInt > 0) { Console.WriteLine("Your number {0} is greater than zero.", myInt); } // Single Decision and Action without brackets if (myInt < 0) Console.WriteLine("Your number {0} is less than zero.", myInt); // Either/Or Decision 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); } // Multiple Case Decision if (myInt < 0 || myInt == 0) { Console.WriteLine("Your number {0} is less than or equal to zero.", myInt); }
else if (myInt > 0 && myInt <= 10) { Console.WriteLine("Your number {0} is in the range from 1 to 10.", myInt); } else if (myInt > 10 && myInt <= 20) { Console.WriteLine("Your number {0} is in the range from 11 to 20.", myInt); } else if (myInt > 20 && myInt <= 30) { Console.WriteLine("Your number {0} is in the range from 21 to 30.", myInt); }
else { Console.WriteLine("Your number {0} is greater than 30."، myInt); } } }
دستورهای listing 3-1 همان متغیر ورودی (variable input)، myIntرا به عنوان جزئی از ارزیابی کار می برد. این راه شیوه ی دیگری برای کسب ورودی فعل و انفعالی (interactive input) از کاربر می باشد. کد مربوط به شکل زیر است.
Console.Write("Please enter a number: "); myInput = Console.ReadLine(); myInt = Int32.Parse(myInput);
ابتدا خط "Please enter a number: " را وارد کنسول می کنیم.دستور Console.ReadLine() برنامه را مجبور می کند که منتظر ورودی از جانب کاربر بماند. کاربر هم ابتدا عدد مورد نظر را تایپ می کند و بعد enter را می زند. این رقم به صورت رشته به متغیر myInput که خود یک نوع رشته (string type) است بازگردانده می شود. به این خاطر که ما مجبوریم ورودی کاربر را به صورت int ارزیابی کنیم، myInputهم باید تبدیل شود. این کار را می توانیم با فرمان Int32.Parse(myInput) انجام دهیم. نتیجه در متغیر myInt که از نوع int است گنجانده می شود.
حال که یک متغیر در نوع مورد نظر داریم، آن را با دستورهای if ارزیابی می کنیم. دستور اول از نوع (boolean expression) { statements }، if است همان طور که پایین به نمایش گذاشته شده.
// Single Decision and Action with braces if (myInt > 0) { Console.WriteLine("Your number {0} is greater than zero.", myInt); }
کار را با کلید واژه ی if آغاز کنید. مرحله ی بعد عبارت Boolean بین پرانتز است. عبارت Boolean باید یا به مقدار true و یا به مقدار false ارزیابی شود. در این مثال، ورودی کاربر را بررسی می کنیم تا مشخص شود آیا بزرگتر از صفر (>) 0 هست یا نه. چناچه عبارت به true ارزیابی شد، باید آن را داخل علامت {} اجرا کرد. (به ساختار داخل {} "block" می گویند) ممکن است داخل این بلوک یک یا چند دستور باشد. چناچه عبارت Boolean به false ارزیابی شد، ما دستورهای داخل بلوک نادیده می گیریم و به ادامه ی اجرا برنامه با دستور بعدی پس از بلوک می پردازیم.
توجه
در زبان های برنامه نویسی دیگر از جمله C ++ و C، وضعیت زمانی ارزیابی می شود که نتیجه ی 0 false و هر عدد دیگری true محسوب شود. در C# وضعیت باید به مقدار Boolean ،true یا false ارزیابی شود. چناچه قصد دارید با C# وضعیت عددی ای شبیه سازی کنید، می توانید این کار را با نوشتن آن وضعیت به صورت (myInt != 0) انجام دهید که معنی آن این است که اگر myInt صفر نبود، عبارت به true ارزیابی می شود.
دستور دوم بسیار شبیه به دستور اول است با این تفاوت که هیچ بلوکی ندارد، همان گونه که زیر به نمایش گذاشته شده.
// Single Decision and Action without braces if (myInt < 0) Console.WriteLine("Your number {0} is less than zero.", myInt);
چناچه عبارت Boolean به true ارزیابی شد، اولین دستور پس از عبارت Boolean اجرا می گردد. اگر عبارت Boolean به false ارزیابی شد، اولین دستور پس از عبارت Boolean نادیده گرفته شده و دستور بعدی اجرا می شود. در صورتی که شما باید تنها یک دستور را اجرا کنید، استفاده از دستور if بسیار مناسب و کافی است. اما چنانچه عبارت Boolean به true ارزیابی شد و شما قصد داشتید دو یا چند دستور را با هم اجرا کنید، باید آن ها را درون یک بلوک قرار دهید.
بهتر است ازتصمیم either/or (یا این یا اون) استفاده کنید. به این نوع تصمیم گیری دستور if/else گفته می شود. دستور سوم if در listing 3-1 این کاربرد را نشان می دهد.
// Either/Or Decision 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); }
هنگامی که عبارت Boolean به true ارزیابی می شود، دستورهای درون بلوک که بلافاصله پس ازدستور if می آیند اجرا می شوند. اما، چنانچه عبارت Boolean به false ارزیابی شد، دستورهای داخل بلوک که پس از کلید واژه ی else می ایند اجرا می شوند.
هر زمان که باید چند عبارت را با هم ارزیابی کنید، می توانید از فرم های if/else if/else دستور if استفاده کنید. این نمونه در دستور چهارم if،listing 3-1 قابل مشاهده است.
// Multiple Case Decision if (myInt < 0 || myInt == 0) { Console.WriteLine("Your number {0} is less than or equal to zero.", myInt); } else if (myInt > 0 && myInt <= 10) { Console.WriteLine("Your number {0} is in the range from 1 to 10.", myInt); } else if (myInt > 10 && myInt <= 20) { Console.WriteLine("Your number {0} is in the range from 11 to 20.", myInt); } else if (myInt > 20 && myInt <= 30) { Console.WriteLine("Your number {0} is in the range from 21 to 30.", myInt); } else { Console.WriteLine("Your number {0} is greater than 30.", myInt); }
این مثال با کلید واژه ی if آغاز می شود و چناچه عبارت Boolean به true ارزیابی شد، بلوک بعدی اجرا می شود.اما، این بار می توانید با ترکیب کلیدواژه ی else if چند وضعیت پسین را ارزیابی کنید. دستور else if نیز همانند دستور if با عبارت Boolean کار می کند. همان قوانین هم درباره ی آن صادق است، برای مثال اگر عبارت Boolean دستور else if به true ارزیابی شود، بلوک بلافاصله پس از عبارت Boolean اجرا می شود.چناچه هیچ یک از else if و if های دیگرِعبارت های Boolean، به true ارزیابی نشود، بلوک بلافاصله پس از کلید واژه ی else اجرا می شود. فقط یک بخش از دستور if/else if/else اجرا می شود.
تفاوت دستور آخر با دیگر دستورها در عبارت Boolean است. عبارت Boolean، (myInt < 0 || myInt == 0) ، حاوی عملگر شرطی OR (||) است. در هر دو عملگر شرطی (||) و عادی (|) OR، در صورتی که هر دو زیر-عبارتِ هر دو طرف عملگر به true ارزیابی شود، عبارت Booleanنیز به true ارزیابی می شود. تفاوت اصلی بین این دو نوع OR، اول در نوع عادی عملگر OR است که هردو زیر- عبارت را هر دفعه ارزیابی می کند. دوم در نوع شرطی آن است که زیر-عبارت دومی را تنها درصورت به false ارزیابی شدن زیر- عبارت اولی evaluate می کند.
عبارت Boolean،(myInt > 0 && myInt <= 10) ، عملگر شرطی AND را دربر دارد. هر دو نوع عادی (&) و شرطی (&&) عملگر AND، در صورتی که زیر- عبارت های هر دو طرف عملگر به true ارزیابی شود، true بازمی گرداند. نوع عادی (&) عملگر AND، هر دو عبارت را هر دفعه ارزیابی می کند. اما، نوع شرطی عملگر AND، زیر- عبارت دومی را تنها درصورتی ارزیابی می کند که زیر-عبارت اولی به به true ارزیابی شود.
عملگرهای شرطی (&& و ||) را عملگرهای short-circuit (کوته مدار) می خوانند زیرا، همیشه تمام یک عبارت را ارزیابی نمی کنند. بنابراین، از آن ها برای تولید کدهای کارامدتر استفاده می شود، زیرا آن ها منطق های غیر ضروری را نادیده می گیرند.
دستور switch
نوع دیگر دستور گزینش (selection statement)، دستور switch هست که یک مجموعه منطق را بسته به مقدار یک پارامتر معلوم اجرا می کند. نوع هایی که دستور switch با آن ها کار می کند عبارت است از: booleans،enums ، integralو string.listing 3-2 نحوه ی استفاده از دستور switch را نشان می دهد.
Listing 3-2.دستورهای switch : SwitchSelection.cs
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 with integer type 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; } decide: Console.Write("Type \"continue\" to go on or \"quit\" to stop: "); myInput = Console.ReadLine(); // switch with string type switch (myInput) { case "continue": goto begin; case "quit": Console.WriteLine("Press Enter To Bye."); break; default: Console.WriteLine("Your input {0} is incorrect.", myInput); goto decide; } } }
توجه
اگر شما هر مقدار دیگری به جز int وارد کنید، listing 3-2 پیغام استثنا صادر(throw) می کند. برای مثال حرف 'a' یک خطا تلقی می گردد.
listing 3-2 چند تا دستور switch نشان می دهد. دستور switch با کلیدواژه ی سویچ آغاز می شود و به دنبال آن عبارت switch می آید. در دستور اول switch،listing 3-2، عبارت switch به نوع int ارزیابی می شود، به ترتیب زیر
// switch with integer type 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; }
زمانی که یک یا چند گزینه برای کشف مطابقت (match) احتمالی با عبارت switch ارزیابی می شوند، بلوک switch به دنبال عبارت switch می آید. تک تک گزینه ها با کلیدواژه ی case نشانه گذاری (lable) می شوند، و به دنبال آن مثالی می آید که با عبارت switch همنوع است و پس از آن علامت (:) می آید. در مثال مذکور case 1:، case 2:، and case 3: داریم. هنگامی که نتیجه ی ارزیابی شده در عبارت switch با یکی از این گزینه ها مطابقت داشته باشد، دستورهایی که بلافاصله پس از گزینه ی همخوان قرار دارند اجرا می شوند از جمله دستورهای انشعابی (braching statements) که ممکن است هر یک از دستورهای break،continue ، goto ،return ، throw باشد.
جدول 1-3 دستورهای انشعابی را به صورت خلاصه در اختیار شما قرار می دهد.
|
ranching statement |
Description(توصیف کاربرد) |
|
Break(توقف) |
بلوک switch را ترک می کند. |
|
Continue(ادامه) |
بلوک switch را ترک می کند، منطق باقی مانده در حلقه ی دربرگیرنده را نادیده می گیرد، سپس برای این که ببیند آیا نیاز است حلقه را دوباره از اول اجرا کند یا نه به وضعیت حلقه باز می گردد. فقط زمانی که دستور switch در خود حلقه باشد کارگر واقع می شود. |
|
goto |
بلوک switch را ترک می کند و به طور مستقیم به برچسب فرم می رود " |
|
Return(بازگشت) |
عملیات (method) جاری را ترک می کند. |
|
Throw(پرتاب) |
استثنا پرتاب می کند. |
همچنین می توانید یک default choice(گزینه ی پیش فرض) را علاه بر تمام گزینه های دیگر ضمیمه کند. چنانچه هیچ یک از گزینه های دیگر مطابقت matchنداشت، گزینه ی پیش فرض انتخاب شده و دستورها اجرا می شوند. اگرچه استفاده از گزینه ی پیش فرض اختیاری است، به شما اکیداً توصیه می شود که از استفاده کنید. این گزینه برنامه ی شما را قابل اطمینان تر می کند و به شما کمک می کند تا با شرایط پیش بینی نشده را بهتر برخورد کنید.
تک تک برچسب های case باید همان طوری که در جدول 1-3 تشریح شده به یک دستور انشعابی ختم شود که معمولاً هم break statement منظور است. دستور break باعث می شود که برنامه از switch statement خارج شود و اجرای دستور بعدی که پس از switch block قرار دارد را شروع کند. دو استثنا در این مورد وجود دارد :دستورهای مجاورcase که هیچ کدی بین آن ها وجود ندارد و دیگری استفاده از دستور goto. مثال زیر نحوه ی ادغام دستورهای 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 کنارهم دیگر، به صورتی که هیچ کدی بین آن ها وجود نداشته باشد، شما یک case برای چند مقدار می سازید. case ای که هیچ کدی نداشته باشد، خودکار به اجرای کدهای case های بعدی می پردازد. مثال بالا دقیقاً این فرآیند را به نمایش می گذارد.
دستور case حتماً باید تطبیق دقیق باشد، نمی توان از شرایط منطقی در این زمینه کمک گرفت. اگر مجبور هستید از شرایط منطقی کمک بگیرید، باید از دستورهای if/else if/else استفاده کنید.
راه دیگری که می توانید از آن برای کنترل جریان منطق در دستور switch استفاده کنید، دستور goto هست. یا باید به طور مستقیم به یک دستور case دیگر بروید و یا به طور کلی از دستور switch بیرون بیایید.
دستور switch لسیتینگ 2-3، نحوه ی استفاده از دستور goto را نشان می دهد.
// switch with string type
switch (myInput)
{
case "continue":
goto begin;
case "quit":
Console.WriteLine("Press Enter To Bye.");
break;
default:
Console.WriteLine("Your input {0} is incorrect."، myInput);
goto decide;
}
توجه
در این مثال، "continue"،،case مختص دستور switch هست — نه کلید واژه.
دستور goto برنامه را مجبور می کند که به برچسب پس از کلیدواژه ی goto بپرد. چناچه کاربر هنگام اجرا، "continue" را تایپ و وارد کند، دستور switch این ورودی (نوع string) را با برچسب case، "continue" تطبیق می دهد و دستور "goto begin:" را اجرا می کند. سپس برنامه switch statement را ترک می کند و اولین دستور برنامه پس از برچسب begin را اجرا می کند. این در واقع یک حلقه است که به شما اجازه می دهد یک کد را چند بار اجرا کنید. حلقه زمانی پایان می یابد که کاربرstring "quit" را تایپ کند. این پروسه با گزینه ی case "quit": ارزیابی می شود، سپس "Bye." را در نتیجه ی کار برای کنسول تایپ می کند، از دستور switch بیرون آمده و برنامه را خاتمه می دهد.
هشدار
شما نباید حلقه ها را نیز به این شیوه بسازید زیرا نحوه ی غیراستاندار برنامه نویسی محسوب می شود. تنها به منظور روشن سازی دستور نحوی در این مبحث به آن پرداخته شده.برای این کار باید حتماً از دستور حلقه ای ساختاریافته استفاده کنید.
چناچه هیچ یک از دو رشته ی "continue" و "break" وارد نشود، case پیش فرض "default" خودکار وارد می شود. پیغام خطایی به کنسول می فرستد، سپس فرمان goto decide: را اجرا می کند. این پروسه (اجرای) برنامه را وادار می کند به دستور اول که پس از برچسب decide: قرار دارد بپرد، که در نتیجه از کاربر می پرسد ایا قصد دارد برنامه را ادامه دهد یا از بیرون بیاید. این خودش یک حلقه ی دیگر حساب می شود.
Goto به وضوح دستور بسیار قدرتمندی است و تحت شریاط مناسب و کنترل شده می تواند فوق العاده مفید واقع شود. با این وجود، باید در استفاده از آن نهایت دقت را به خرج داد و ممکن است استفاده های بسیار نادرستی از آن صورت گیرد. ممکن است با آن برنامه ای بنویسید که اشکال زدایی و استفاده از آن بسیار دشوار باشد. کد spaghetti را در نظر بگیرد که ممکن است توسط دستورات تصادفی goto سرتاسر برنامه به وجود بیایند و ایجاد مشکل کنند.
چکیده
می توان برای پیاده سازی شاخه های مختلف منطق دستور if را به شیوه های مختلف نوشت. دستور switch به شما حق انتخاب از میان نوع های bool، enum، integral، string می دهد. می توانید برای ترک دستور case از دستورهای break، continue، goto، return، throw استفاده کنید. سعی کنید تا زمانی که نیاز جدی ندارید از دستور goto پرهیز کنید.
علاوه بر انشعاب سازی بر اساس وضعیت، خوب است که بتوان یک گروه (block) دستور را چند بار اجرا کرد. البته دستور goto برای چنین منطقی مناسب نیست.