ساختار های کنترلی در برنامه نویسی

ساختارهای کنترلی در برنامه نویسی

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

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


برنامه ها چطور ساخته میشوند؟

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

نرم افزار ها چطور ساخته میشوند ساختارهای کنترلی

همانطور که یکی از بزرگان حوزه هوش مصنوعی، Marvin Minsky، در کتاب The Society of Mind توضیح میدهد: همه موضوعات پیچیده را میتوانیم به عنوان یک مجموعه از موضوعات ساده تر در نظر گرفت. همین موضوعات ساده را هم میتوان کوچکتر کرد تا به یک فهم کامل از موضوع رسید. وقتی که اینطور به موضوعات نگاه کنید، همه مسائل را میتوانیم به مجموعه ای از کاربرد های ساده تر تبدیل کنیم که هرکدام مسئولیت خاص خودشان را دارند.

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

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


ساختار کنترلی چیست؟

ساختارهای کنترلی چی هستن

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

ساختارهای کنترلی تکه کدهایی هستند که متغیرها را بررسی کرده و با توجه به پارامترهای مشخص شده، مسیر اجرای نرم‌افزار را تعیین میکنند.

پایه ای ترین ساختارهای کنترلی در برنامه نویسی این ها هستند:

  1. شرطی (انتخاب کننده): از این ساختارها برای اجرای یک یا چند دستور مختلف وقتی که شرط خاصی اتفاق افتاده باشد استفاده میشود.
  2. حلقه ها (یا شمارنده ها): از حلقه ها برای تکرار دستورات به تعداد خاص یا تا زمانی که شرط خاصی اتفاق بیفتد استفاده میکنیم.

در ادامه با هم نگاهی دقیق تر به همه ساختارهای کنترلی موجود در برنامه نویسی خواهیم داشت.


ساختارهای کنترلی شرطی

ساختارهای کنترلی شرطی

ساختارهای Conditional (شرطی) یکی از هسته ای ترین قسمت های برنامه نویسی هستند. ایده پشت این ساختارها این است که شما میتوانید با استفاده از آنها جریان اجرای نرم‌افزار را طبق شروط خاصی که تعریف میکنید، تغییر بدهید (شرط هایی مثل دریافت یک ورودی از کاربر، یا اتفاقاتی که درون خود نرم‌افزار رخ میدهد). ساختارهای کنترلی شرطی را میتوانیم به دو دسته “دستورات If” و “دستورات If-Else” تقسیم کنیم.


If Statement

دستور If میتواند یک یا چند دستور را بر اساس اینکه آیا شرط خاصی محقق میشود یا نه، اجرا کند. یعنی وقتی که میخواهیم این ساختار کنترلی را به کار ببریم باید یک عبارت شرطی هم برای آن تعیین کنیم. این عبارت شرطی میتواند طبق اتفاقاتی که رخ میدهد دو مقدار TRUE و FALSE را داشته باشد.

دستور if در ساختارهای کنترلی

دستور If بر اساس مقدار عبارت شرطی تصمیم گیری میکند. اگر مقدار این عبارت TRUE باشد، دستورات درون خودش را اجرا میکند. اما اگر مقدار FALSE داشته باشد، کدهای داخل if نادیده گرفته میشوند. به همین ترتیب روند اجرای نرم‌افزار میتواند توسط دستور If تغییر کند. سینتکس کلی ساختار شرطی if را میتوانید در باکس زیر ببینید:

دیاگرام if
if (statement){
	// Some Statements to run
}

در سینتکس بالا مشاهده می‌کنید که چطور می‌توانیم یک دستور if را درون کد استفاده کنیم. در قسمت statement باید عبارت شرطی مورد نیاز خودمان را بنویسیم و هروقت مقدار این عبارت TRUE بود، دستورات درون بلوک شرط اجرا خواهند شد.


دستورات If-Else

دستور if-else ساختارهای کنترلی

دستور If-Else حالت کامل شده دستور If است. یعنی دقیقا همان رفتار را دارد ولی برای عبارت های شرطی که مقداری برابر با FALSE دارند نیز میتواند دستوراتی را اجرا کند. یعنی اگر مقدار عبارت شرطی که جلوی if نوشته ایم برابر با TRUE باشد، دستورات درون بلوک if اجرا میشوند و اگر مقدار عبارت شرطی FALSE باشد، دستورات درون بلوک else اجرا خواهند شد. برای درک بهتر این ساختار کنترلی، ابتدا سینتکس و الگوریتم آن را معرفی کرده و بعد چند مثال از کاربرد های آن را با هم بررسی میکنیم:

دیاگرام if-else

مثال اول

اگر به این مثال توجه کنید متوجه میشوید که یک بلوک به نام else به مثال قبلی اضافه کرده ایم. وقتی که مقدار عبارت شرطی ما FALSE باشد، دستوراتی که درون این بلوک نوشته ایم اجرا خواهند شد.

int x=-4
if (x>0){
	console.log("variable x is a positive number");
} else {
	console.log("variable x is a negative number");
}

برای توضیح مثال بالا فرض کنید که مقدار -4 را درون متغیر x ریخته ایم. عبارت شرطی ما فقط برای x هایی که بزرگتر یا مساوی صفر باشند برابر TRUE میشود. پس در این سناریو مقدار FALSE تولید میشود. در این حالت کامپایلر از کدهای درون بلوک if چشم پوشی میکند و مستقیما دستورات درون else اجرا خواهند شد. پس خروجی ما عبارت “variable x is a negative number” خواهد بود.

مثال دوم

برای مثال دوم فرض کنید که بیشتر از یک شرط را پشت سر هم بنویسیم. در این مثال نمره های کلاس را بررسی میکنیم و به هر کدام از دانش آموزان امتیاز های A، B، C، D یا F می‌دهیم. میخواهیم برای این کار ساختار کنترلی if else را مقداری گسترش بدهیم. برای مثال:

int score=75
if (score>=90){
	console.log("A");
} else if(score>=80){
	console.log("B");
} else if(score>=70){
	console.log("C");
} else if(score>=60){
	console.log("D");
} else {
	console.log("F");
}

شما همیشه میتوانید ساختارهای کنترلی دیگری را به جای if else به کار ببرید. اما در این مثال به منظور آموزش، دسته بندی دانش آموزان را با استفاده از همین ساختار کنترلی پیاده سازی کردیم. در این فرآیند متغیر score چهار بار مورد ارزیابی قرار میگیرد و هر بار با یکی از شرط ها منطبق باشد، دستورات درون همان بلوک اجرا خواهند شد. (در این مثال خروجی ما حرف C خواهد بود).


حلقه ها (Loops)

دستورات حلقه چیزی بیشتر از اتوماتیک سازی فرآیندهای چند مرحله ای نیست و برای مواقعی استفاده میشوند که میخواهیم یک سری دستورات را چندین بار پشت سر هم اجرا کنیم. علاوه بر این‌ها، بخش عمده ای از قدرت کامپیوتر ها به دلیل وجود ساختار کنترلی حلقه در نرم‌افزار ها می باشد. این مدل از ساختارهای کنترلی میتوانند تعدادی از دستورات را به هر تعدادی که نیاز داشته باشیم، تکرار کنند و همین تکرار های ساده میتوانند راه حل مسائل بزرگ و پیچیده باشند.

حلقه ها در ساختارهای کنترلی

بصورت کلی دو مدل تکنیک ساخت حلقه در زبان‌های برنامه نویسی وجود دارند که میخواهیم هر دو را با هم بررسی کنیم:

  1. حلقه های For: نوعی از حلقه ها هستند که عبارت های درون خودش را به مقدار دفعاتی که از قبل تعریف میکنیم تکرار میکنند.
  2. حلقه های While و حلقه های تکرار: این حلقه ها بر اساس درست بودن عبارت های شرطی کار میکنند. این عبارت شرطی در ابتدا و انتهای ساختار حلقه بررسی میشود.

حلقه های FOR

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

حلقه for

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

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

حلقه for در ساختارهای کنترلی
for (let i=0; i<90; i++){
	// some statements to run
}

مثال

برای درک بهتر نحوه کار حلقه های For میخواهیم یک لیست از نام میوه ها را بسازیم و با استفاده از این ساختار کنترلی همه آنها را نمایش بدهیم.

int[] fruits = ['Apple','Kiwi','Orange','Banana'];
for(let i=0; i<fruits.length ; i++){
	console.log(fruit[i]);
}

خروجی مثال بالا عبارت های زیر میشود.

Apple
Kiwi
Orange
Banana

حلقه های While

در روند اجرای حلقه های While یک تفاوت با حلقه های For وجود دارد. در این ساختار کنترلی، شرط حلقه در ابتدای کار بررسی میشود و اگر مقدار آن TRUE باشد، دستورات درون حلقه اجرا شده و تکرار میشوند تا زمانی که عبارت شرطی FALSE شود.

حلقه while

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

while (statement){
	// some statements to run
}

 مثال اول

برای مثال: ابتدا یک متغیر به نام x میسازیم و مقدار 1 را به آن میدهیم. سپس یک حلقه While میسازیم که هربار یک شرط را روی این متغیر بررسی میکند تا زمانی که مقدار این شرط FALSE شود.

int x=1;
while (x<10){
	console.log(x);
	x=x+1;
}

نحوه کار مثال بالا به این صورت است: مقدار اولیه متغیر X برابر با 1 است و شرط حلقه را بررسی میکند که آیا مقدار این متغیر کمتر از 10 میباشد یا نه. پس در اولین اجرا مقدار عبارت شرطی برابر TRUE است و کدهای درون آن اجرا میشوند. درون حلقه هم دستوراتی را نوشته ایم که ابتدا مقدار متغیر X را پرینت کرده و سپس آن را به اندازه یک واحد اضافه میکند. بنابراین در دومین تکرار حلقه، مقدار متغیر X برابر با 2 خواهد بود.

دقت کنید که افزایش مقدار متغیر یک بخش مهم از این ساختار کنترلی می باشد. زیرا اگر این مقدار افزایش پیدا نکند، مقدار عبارت شرطی همیشه برابر TRUE خواهد ماند و اجرای حلقه هیچوقت متوقف نمیشود. به خاطر داشته باشید که در حلقه های While همیشه باید شرایط اولیه متغیر ها را تغییر بدهیم. این کار از به وجود آمدن یک حلقه بی نهایت و کرش کردن نرم‌افزار ما جلوگیری میکند.

خروجی مثال اول

1
2
3
4
5
6
7
8
9

مثال دوم

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

int a=0;
int b=1;
console.log(a);
while (b<100){
	console.log(b);
	int temp = a+b;
	a=b;
	b=temp
}

خروجی مثال دوم

در این مثال ما یک مقدار ماکزیمم به عنوان شرط حلقه در نظر گرفتیم که تعداد اعداد تولید شده را محدود کنیم. یعنی این حلقه تا جایی که مقدار b کمتر از 100 باشند به تولید اعداد ادامه میدهد. اگر هرکدام از عدد های دنباله بیشتر از 100 بشوند، حلقه متوقف میشود.

0
1
1
2
3
5
8
13
21
34
55
89

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

حلقه های تکرار در ساختارهای کنترلی

دقیقا مشابه حلقه های While که در مورد آنها صحبت کردیم، حلقه های تکرار یا Repeat Loops همه دستورات درون خود را تا زمانی که شرط توقف آنها اتفاق بیفتد، از اول تا آخر اجرا میکنند. در این حلقه ها بدون توجه به اینکه شرط محقق شده است یا نه، دستورات درون حلقه حداقل یکبار اجرا میشوند و حلقه فقط زمانی متوقف میشود که مقدار عبارت شرطی آن برابر با TRUE شود.

حلقه repeat

از این سینتکس برای نوشتن این حلقه استفاده میکنیم:

repeat{
	//some statements to run
}

حلقه های Repeat از دستور break برای متوقف کردن حلقه استفاده میکنند. دستور break را باید درون یک عبارت شرطی بنویسیم که هر وقت به آن نیاز داشتیم اجرا شده و از تکرار دوباره حلقه جلوگیری کند. زمانی که برنامه به دستور break برسد، حلقه را تا انتها اجرا میکند و از اجرا شدن دفعه بعدی حلقه جلوگیری میکند. به همین دلیل دستورات داخل حلقه حداقل یکبار اجرا میشوند تا زمانی که به عبارت شرطی ما برسند و break خوانده شود.

دقت داشته باشید که اگر دستور break اجرا نشود، حلقه Repeat بی نهایت بار اجرا خواهد شد.

مثال اول

در این مثال یک متغیر به اسم x تعریف میکنیم و مقدار اولیه 5 به آن میدهیم. بعد یک حلقه Repeat تعریف میکنیم که مقدار x را در خروجی به ما نشان بدهد و بعد مقدار x را یک عدد اضافه کند. بعد از این مرحله ها، یک دستور if نوشتیم با شرط اینکه هروقت مقدار x مساوی با 10 شد، دستور break اجرا شود و حلقه را متوقف کند.

int x=5;
repeat{
	console.log(x);
	x=x+1;
	if (x == 10){
		break;
	}
}

خروجی مثال اول

5
6
7
8
9

سخن پایانی

سخن پایانی

در این مقاله درباره ساختارهای کنترلی در برنامه نویسی صحبت کردیم. نکته ای که باید در ذهن داشته باشید این است که میتوانید این ساختارها را در کنار هم و با هم استفاده کنید و هیچ محدودیتی برای به کار بردن آنها وجود ندارد. باید با توجه به کاربرد ها و محدودیت های نرم‌افزار، خودتان ساختارهای مورد نیاز را انتخاب کنید.

اگر هر سوالی در مورد ساختارهای شرطی برنامه نویسی دارید، در قسمت کامنت ها بنویسید تا به آنها پاسخ بدهیم. همچنین میتوانید از منابع زیر برای مطالعه بیشتر در زمینه ساختارهای شرطی استفاده کنید.


منابع

برای مطالعه بیشتر درباره ساختار های کنترلی میتوانید از لینک های زیر استفاده کنید:

درباره نویسنده

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اسکرول به بالا