با مطالعهی فصل گذشته انواع عملگرهای زبان برنامهنویسی سی شارپ را به تفصیل مورد بررسی قرار دادیم. حال این عملگرها علاوه بر اینکه در تمام طول برنامه مورد استفاده قرار میگیرند، در بخش مربوط به دستورهای تصمیم گیری به میزان فراوانی از آنها بهره میبریم. در این فصل به توضیح کامل دستورهای تصمیم گیری و حلقهها پرداخته و تصور ذهنی دقیقی از آنها را برای شما عزیزان ایجاد میکنیم:
دستورهای تصمیم گیری همواره دارای ساختاری هستند که به برنامهنویس کمک میکنند تا با استفاده از شروطی که میگذارد سمت و سوی برنامه را تغییر داده و در صورت برقرار بودن شروط عملیات متفاوتی اجرا شود.
در تصویر زیر یک فرم کلی از دستور تصمیم گیری در اختیار شما قرار گرفته است که در بسیاری از زبانهای برنامهنویسی مورد استفاده قرار میگیرد.
همانطور که مشاهده میکنید با اعمال یک سری شروط در فلوچارت فوق میتوانیم مسیر را تغییر داده تا برنامه در انتها خاتمه (ٍEnd) پیدا کند.
دستورهای تصمیمگیری در زبان برنامهنویسی سی شارپ به شرح زیر میباشند:
این دستور بر اساس یک عبارت شرطی اجرا میشود و چنانچه آن عبارت برقرار باشد، شرط اعمال شده صحیح است و سپس کدهای درون آن اجرا می شود و ساختار نوشتاری آن به صورت زیر میباشد:
int a = 10; int b = 10; if( a == b){ Console.WriteLine("Condition is TRUE"); }
همانطور که ملاحظه میکنید در مجموعهی کد بالا دستور شرطی if استفاده شده است و چون مقدار a برابر با مقدار b است پاسخ به صورت Condition is TRUE در صفحه نمایش و داخل پنل کنسول چاپ میشود.
در زبان برنامهنویسی C# این دستور دقیقا مشابه دستور شرطی if بوده با این تفاوت که در این دستور اگر شرطی برقرار نباشید کدهای موجود در بلوک else اجرا میشود. به مثال زیر توجه کنید:
int a = 10; int b = 10; if( a == b){ Console.WriteLine("Condition is TRUE"); } else { Console.WriteLine("Condition is FALSE"); }
این دستور تحت عنوان دستور if تو در تو مورد استفاده قرار میگیرد. یعنی اگر شرط اول برقرار نبود بررسی میکند که شرط دوم برقرار باشد و اگر آن نیز برقرار نبود، در انتها کدهای درون else را اجرا میکند:
int a = 10; int b = 10; if( a == b){ Console.WriteLine("Condition is TRUE"); } else if( a != b) { Console.WriteLine("Condition is FALSE"); } else { Console.WriteLine("Do Nothing"); }
این دستور به گونهای مشابه دستور if میباشد اما از تکرار if جلوگیری کرده و در برخی مواقع میتواند جایگزین بسیار مناسبی برای آن باشد:
/* local variable definition */ char grade = 'B'; switch (grade) { case 'A': Console.WriteLine("Excellent!"); break; case 'B': case 'C': Console.WriteLine("Well done"); break; case 'D': Console.WriteLine("You passed"); break; case 'F': Console.WriteLine("Better try again"); break; default: Console.WriteLine("Invalid grade"); break; } Console.WriteLine("Your grade is {0}", grade); Console.ReadLine();
در این مثال ابتدا یک متغییر به نام grade از نوع char تعریف و سپس آن را به عنوان یک عبارت به دستور switch معرفی کردهایم (عبارتی که مدام در حال تغییر است تا شرط متناسب با آن پیدا شود) در نهایت درون کد switch یک سری case (خانهی انتخابی) قرار دادهایم که مقادیر متفاوت دارد.
حال به ازای هر مقدار درون این خانهها یک عبارت مشخص چاپ میشود و اگر آن مقدار چاپ شد (مثلا مقدار A عبارت Excellent را نمایش میدهد) با دستور break برنامه از شرط خارج شده و سپس عبارت Your grade is Excellent نمایش داده میشود. نوشتن دستور break برای خارج شدن از شروط میباشد که قرار دادن آن الزامی نیست.
از طرفی در انتهای دستور switch یک کلمه به نام default وجود دارد که بیان میکند اگر هر یک از case های فوق برابر با شرط نبود، دستور نهایی درون بلاک default را چاپ کن.
با اجرای مثال فوق خروجی به صورت زیر میباشد:
Well done Your grade is B
همچنین گاهی پیش میآید که دستور switch به صورت تو در تو مورد استفاده قرار گیرد به مثال زیر توجه کنید:
int a = 100; int b = 200; switch (a) { case 100: Console.WriteLine("This is part of outer switch "); switch (b) { case 200: Console.WriteLine("This is part of inner switch "); break; } break; } Console.WriteLine("Exact value of a is : {0}", a); Console.WriteLine("Exact value of b is : {0}", b); Console.ReadLine(); }
در نهایت خروجی این مثال به صورت زیر میباشد:
This is part of outer switch This is part of inner switch Exact value of a is : 100 Exact value of b is : 200
اما در فصل گذشته که عملگرها را توضیح میدادیم با یک عملگر به نام ? : آشنا شدید که در آنجا توضیحی بابت آن ارائه نکردیم و تحت عنوان عملگر شرطی if از آن یاد کردیم. این دستور شامل یک دستور شرطی if است که تنها یکی از دو عبارت بعد از علامت سوال جواب آن خواهد بود. ساختار کلی این دستور به صورت زیر میباشد:
Exp1 ? Exp2 : Exp3;
یعنی عبارت Exp1 در ابتدا بررسی میشود و اگر شرط برقرار و حاصل عبارت Exp1 معادل True بود، آنگاه دستور Exp2 محاسبه میشود در غیر این صورت دستور Exp3 اجرا خواهد شد.
در برخی از موارد یک برنامهنویس نیاز دارد که یک عملیات را به صورت مرتب تکرار کند، اگر اینکار را بدون استفاده از حلقههای تکرار انجام دهد باید دهها بار یک کد را تکرار کند. این کار علاوه بر افزایش حجم برنامه، باعث افزایش خطا در کدها خواهد شد. در تصویر زیر یک حلقهی تکرار را در فرم کلی مشاهده میکنید:
همانطور که ملاحظه میکنید پس از تکرار متوالی در یک حلقه و با به اتمام رسیدن شرط تکرار، برنامه خاتمه (End) پیدا میکند.
از این حلقه برای تکرار یک مجموعهی کد تا زمانیکه شرط درون آرگومان آن برقرار باشد استفاده میشود
while(condition) { statement(s); }
یعنی تا زمانیکه condition یا همان شرط برقرار باشد کدهای درون بلاک یا statementها اجرا میشوند. به مثال زیر توجه کنید:
int a = 10; /* while loop execution */ while (a < 20) { Console.WriteLine("value of a: {0}", a); a++; } Console.ReadLine();
ابتدا یک متغییر به نام a تعریف کردهایم سپس شرط درون حلقه را به گونهای قرار دادهایم که تا زمانیکه a کمتر از ۲۰ است عبارت درون حلقه یعنی value of a اجرا شود و سپس با استفاده از عملگر «یک واحد افزایش» مقدار متغییر را افزایش دادهایم. این عملیات تکرار میشود و با مقدار a از ۱۰ تا ۱۹ درون حلقه عبارت چاپ می گردد ولی هنگامیکه a = 20، برنامه از حلقه خارج میشود. در نهایت خروجی مجموعه کد بالا به صورت زیر میباشد:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19
این حلقه مشابه حلقهی while میباشد با این تفاوت که شروط و واحد افزایشی یا کاهشی آن درون آرگومان تعریف میشوند:
for ( init; condition; increment ) { statement(s); }
با بررسی حلقه بالا متوجه میشویم که مقدار دهی اولیه شمارنده و شرط و همچنین واحد افزایشی یا کاهشی درون آرگومان for صورت میپذیرد. به مثال زیر توجه کنید:
/* for loop execution */ for (int a = 10; a < 20; a = a + 1) { Console.WriteLine("value of a: {0}", a); } Console.ReadLine();
این کد دقیقا مشابه کد حلقهی while است با این تفاوت که مقدار دهی اولیه a = 10 و شرط حلقه a < 20 و همچنین واحد افزایشی a = a +1 درون یک خط خلاصه شدهاند. بنابراین خروجی این مثال هم برابر خروجی حلقه while است:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19
این حلقه دقیقا مشابه حلقهی while بوده با این تفاوت که ابتدا یکبار مجموعهی کدهای درون بلوک اجرا شده و سپس بررسی شرط صورت میپذیرد.
do { statement(s); }while( condition );
به مثال زیر توجه کنید:
int a = 10; /* do loop execution */ do { Console.WriteLine("value of a: {0}", a); a = a + 1; } while (a < 20);
در این مثال ابتدا بدون ورود به شرط یکبار مقدار a چاپ میشود و سپس شرط درون while مورد بررسی قرار میگیرد. و در نهایت خروجی آن به صورت زیر است:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19
گاهی پیش میآید که نیاز داریم تا حلقههای تو در تویی ایجاد کنیم و تکرارها را به صورت تو در تو انجام دهیم. در این حالت میتوان به صورت زیر عمل کرد:
// for for ( init; condition; increment ) { for ( init; condition; increment ) { statement(s); } statement(s); } // while while(condition) { while(condition) { statement(s); } statement(s); } // do while do { statement(s); do { statement(s); } while( condition ); } while( condition );
معمولا برای کنترل حلقهها از دو دستور بهره میگیرند:
از این دستور برای خروج از حلقهها و شروط استفاده میشود. یعنی هرگاه برنامه به خط break برسد از حلقه خارج شده و کدهای بعد از حلقه اجرا میشوند. به مثال زیر توجه کنید:
/* local variable definition */ int a = 10; /* while loop execution */ while (a < 20) { Console.WriteLine("value of a: {0}", a); a++; if (a > 15) { /* terminate the loop using break statement */ break; } }
خروجی این دستور به صورت زیر است:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15
یعنی درون حلقه وقتی مقدار a برابر ۱۵ میشود وارد شرط if شده و در نهایت دستور break اتفاق میافتد و ادامهی برنامه پس از حلقه اجرا میشود.
این دستور مشابه دستور break میباشد با این تفاوت که به جای خارج کردن برنامه از حلقه اجبار میکند که تکرار بعدی اتفاق بیافتد و کدهای درون شرط برای آن یک مقدار انجام نشود. به مثال زیر توجه کنید:
/* local variable definition */ int a = 10; /* do loop execution */ do { if (a == 15) { /* skip the iteration */ a = a + 1; continue; } Console.WriteLine("value of a: {0}", a); a++; } while (a < 20);
وقتی a برابر مقدار ۱۵ میشود مقدار a یک واحد افزایش پیدا کرده و ادامه برنامه دیگر اجرا نمیشود و بدون درنظر گرفتن کدهای بعد از دستور continue وارد تکرار بعدی (یعنی a=16) میشود. در نهایت خروجی این مثال برابر است با:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 16 value of a: 17 value of a: 18 value of a: 19
گاهی یک حلقه به صورت بی نهایت میتواند تکرار شود یعنی هیچگاه برنامه از حلقه خارج نشود آنگاه داریم:
// for for (; ; ) { Console.WriteLine("Hey! I am Trapped"); } // while while (true) { Console.WriteLine("Hey! I am Trapped"); }
به شما عزیزان تبریک میگوییم. تا به اینجای کار مطالب بسیاری را در ارتباط با زبان C# فرا گرفتید و این مواردی که خدمت شما ارائه کردیم به عنوان اصول مقدماتی و اصلی یادگیری هر زبانیست که معمولا در ۹۰ درصد زبانهای برنامهنویسی یکسان هستند. این سری آموزشها ادامه دارد. با ما همراه باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.