دستورهای شرطی، کنترلی و حلقه‌ها در C#

09 تیر 1396
درسنامه درس 4 از سری آموزش سی شارپ (C#)
csharp-conditional-statements-loops

با مطالعه‌ی فصل گذشته انواع عملگرهای زبان برنامه‌نویسی سی شارپ را به تفصیل مورد بررسی قرار دادیم. حال این عملگرها علاوه بر اینکه در تمام طول برنامه مورد استفاده قرار می‌گیرند، در بخش مربوط به دستورهای تصمیم گیری به میزان فراوانی از آنها بهره می‌بریم. در این فصل به توضیح کامل دستورهای تصمیم گیری و حلقه‌ها پرداخته و تصور ذهنی دقیقی از آنها را برای شما عزیزان ایجاد می‌کنیم:

مقدمه

دستورهای تصمیم گیری همواره دارای ساختاری هستند که به برنامه‌نویس کمک می‌کنند تا با استفاده از شروطی که می‌گذارد سمت و سوی برنامه را تغییر داده و در صورت برقرار بودن شروط عملیات متفاوتی اجرا شود.

در تصویر زیر یک فرم کلی از دستور تصمیم گیری در اختیار شما قرار گرفته است که در بسیاری از زبان‌های برنامه‌نویسی مورد استفاده قرار می‌گیرد.

فلوچارت Yes و No برای دستورهای تصمیم گیری

همانطور که مشاهده می‌کنید با اعمال یک سری شروط در فلوچارت فوق می‌توانیم مسیر را تغییر داده تا برنامه در انتها خاتمه (ٍEnd) پیدا کند.

دستورهای تصمیم‌گیری در زبان برنامه‌نویسی سی شارپ به شرح زیر می‌باشند:

دستور شرطی if

این دستور بر اساس یک عبارت شرطی اجرا می‌شود و چنانچه آن عبارت برقرار باشد، شرط اعمال شده صحیح است و سپس کدهای درون آن اجرا می شود و ساختار نوشتاری آن به صورت زیر می‌باشد:

int a = 10;
int b = 10;

if( a == b){
    Console.WriteLine("Condition is TRUE");
}

همانطور که ملاحظه می‌کنید در مجموعه‌ی کد بالا دستور شرطی if استفاده شده است و چون مقدار a برابر با مقدار b است پاسخ به صورت Condition is TRUE در صفحه نمایش و داخل پنل کنسول چاپ می‌شود.

دستور شرطی if ... else

در زبان برنامه‌‎نویسی 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 if

این دستور تحت عنوان دستور 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");
}

دستور شرطی Switch

این دستور به گونه‌ای مشابه دستور 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 اجرا خواهد شد.

حلقه‌های تکرار

در برخی از موارد یک برنامه‌نویس نیاز دارد که یک عملیات را به صورت مرتب تکرار کند، اگر اینکار را بدون استفاده از حلقه‌های تکرار انجام دهد باید ده‌ها بار یک کد را تکرار کند. این کار علاوه بر افزایش حجم برنامه‌، باعث افزایش خطا در کدها خواهد شد. در تصویر زیر یک حلقه‌ی تکرار را در فرم کلی مشاهده می‌کنید:

فلوجارت for

همانطور که ملاحظه می‌کنید پس از تکرار متوالی در یک حلقه و با به اتمام رسیدن شرط تکرار، برنامه خاتمه (End) پیدا می‌کند.

حلقه‌ی while

از این حلقه برای تکرار یک مجموعه‌ی کد تا زمانیکه شرط درون آرگومان آن برقرار باشد استفاده می‌شود

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

حلقه‌ی for

این حلقه مشابه حلقه‌ی 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

حلقه‌ی do...while

این حلقه دقیقا مشابه حلقه‌ی 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
  • دستور continue

دستور break

از این دستور برای خروج از حلقه‌ها و شروط استفاده می‌شود. یعنی هرگاه برنامه به خط 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 اتفاق می‌افتد و ادامه‌ی برنامه پس از حلقه اجرا می‌شود.

دستور continue

این دستور مشابه دستور 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# فرا گرفتید و این مواردی که خدمت شما ارائه کردیم به عنوان اصول مقدماتی و اصلی یادگیری هر زبانی‌ست که معمولا در ۹۰ درصد زبان‌های برنامه‌نویسی یکسان هستند. این سری آموزش‌ها ادامه دارد. با ما همراه باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش سی شارپ (C#) توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.