شاید شرایطی پیش بیاید که نیاز داشته باشید مجموعه دستوراتی را به صورت مداوم تکرار کنید. در این شرایط یکی از بهترین گزینهها استفاده از حلقهها در برنامه نویسی است. در این قسمت از دوره آموزشی رایگان متلب فنولوژی، در مورد حلقه در متلب به صورت کامل توضیح میدهیم و انواع حلقه در متلب و دستورات آن را معرفی میکنیم. با ما همراه باشید.
بلوک دیاگرام حلقه در متلب
همانطور که گفته شد، در مواقعی که میخواهید یک بلوک کد را دفعات زیادی اجرا کنید، از حلقهها استفاده میشود. در کل این جملات به ترتیب اجرا خواهند شد؛ ابتدا اولین جمله در تابع اجرا میشود و سپس جملهی دوم و به همین ترتیب تا انتها. انواع زبانهای برنامه نویسی، از ساختارهای کنترلی متفاوتی بهره میبرند تا مسیرهای اجرایی کدهای پیشرفتهتر را انجام دهند. معمولا در حلقهها برای چک کردن ادامهی حلقه، از عبارات شرطی در متلب استفاده میشود.
در اکثر زبانهای برنامه نویسی از بلوک دیاگرام زیر برای نشان دادن حلقهها استفاده میشود. در این بلوک دیاگرام مشاهده میکنید که مجموعه دستوراتی همواره در یک حلقه اجرا میشوند و تا وقتی یک شرط درست باشد ادامه پیدا میکند. اگر شرط نا درست شد،حلقه به اتمام میرسد.
انواع حلقهها در متلب
حلقه در متلب انواع مختلف دارد که در سه نوع آن را به طور مختصر توضیح میدهیم. در ادامهی همین نوشته کاملتر به هریک از آنها میپردازیم.
- While: تا وقتی شرط درست باشد، حلقه را تکرار میکند؛ این ساختار قبل از ورود به حلقه شرط را چک میکند.
- for: برای اجرای مجموعه دستورات با تعداد زیاد، که شرایط کنترلی حلقه به صورت خلاصه در ورودی تابع مشخص میشوند.
- nested loops: میتوانید یک یا چند حلقه، درون حلقههای دیگر قرار دهید.
جملات کنترلی حلقه در متلب
جملات کنترلی حلقه اجرای دستورات را از حالت طبیعی خارج میکنند. وقتی اجرای یک دستور از یک اسکوپ (scope) خارج میشود، همهی اشیای ایجاد شده در آن اسکوپ از بین میروند. متلب از دستورات کنترلی زیر پشتیبانی میکند. در ادامه بلوک دیاگرام آنها را نیز مشاهده میکنید.
- break: حلقه را تمام میکند، از حلقه خارج شده و عملیات را به اولین دستور بعد ازحلقه انتقال میدهد.
- continue: این دستور ادامهی دستورات بدنهی حلقه را رد میکند و به شرط اولیه برمیگردد.
حلقه while در متلب
این نوع حلقه ابتدا شرط را چک میکند و تا وقتی که شرط درست باشد در حلقه میماند. در ادامه به سینتکس while در متلب توجه کنید:
1 2 3 |
while <expression> <statements> end |
این حلقه تا وقتی که عبارت شرط یا expression درست باشد، ادامه پیدا میکند. اگر عبارت صفر باشد یا تهی باشد، غلط و در غیر اینصورت درست است.
مثال: یک فایل اسکریپ ایجاد کرده و کد زیر را در آن قرار دهید:
1 2 3 4 5 |
a = 10; while( a < 20 ) fprintf('value of a: %d\n', a); a = a + 1; end |
با اجرای فایل بالا نتایج زیر را خواهید یافت:
تا هنگامی که a کمتر از ۲۰ باشد آن را چاپ میکند.
1 2 3 4 5 6 7 8 9 10 |
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 میتوانید به صورت کارامد یک حلقه با ساختارهای کنترلی قابل تکرار بنویسید که به تعداد مشخصی تکرار شود. در ادامه به سینتکس این حلقه در متلب اشاره میکنیم:
1 2 3 4 |
for index = values <program statements> ... end |
مقادیر (values) یکی موارد زیر میتواند باشد:
- initval:endval : متغییر index را از مقدار initval تا مقدار endval یکی یکی افزایش میدهد و عملیات را تا جایی ادامه میدهد که ایندکس از endval بیشتر شود.
- initval:step:endval : مانند حالت قبل است با این تفاوت که به جای افزایش یکی یکی ایندکس، به اندازهی گامهای step ایندکس را افزایش میدهد. (یا در صورت منفی بودن step ایندکس را کاهش میدهد.)
- valArray : یک بردار از ایندکسها ایجاد میکند که هر تکرار حلقه به ترتیب روی یکی از عناصر این بردار انجام میشود. این برداد میتواند شامل انواع دیتا تایپ در متلب مانند رشته، آرایه سلولی یا struct باشد.
مثال initval:endval
یک فایل اسکریپ ایجاد کرده و کد زیر را در آن قرار دهید:
1 2 3 |
for a = 10:20 fprintf('value of a: %d\n', a); end |
با اجرای فایل بالا نتایج زیر را خواهید یافت:
مقادیر a از ۱۰ تا ۲۰ یکی یکی افزایش یافته و نمایش داده میشود.
1 2 3 4 5 6 7 8 9 10 11 |
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 value of a: 20 |
مثال initval:step:endval
یک فایل اسکریپ ایجاد کرده و کد زیر را در آن قرار دهید:
1 2 3 |
for a = 1.0:-0.1:0.0 fprintf('value of a: %d\n', a); end |
با اجرای فایل بالا نتایج زیر را خواهید یافت:
مقادیر a از ۱ تا منفی ۰.۱ یک دهم یک دهم کاهش یافته و نمایش داده میشود.
1 2 3 4 5 6 7 8 9 10 11 |
1 0.90000 0.80000 0.70000 0.60000 0.50000 0.40000 0.30000 0.20000 0.10000 0 |
مثال valArray
یک فایل اسکریپ ایجاد کرده و کد زیر را در آن قرار دهید:
1 2 3 |
for a = [24,18,17,23,28] disp(a) end |
با اجرای فایل بالا نتایج زیر را خواهید یافت:
مقادیر a از با توجه به بردار آن و به ترتیب نمایش داده میشود.
1 2 3 4 5 6 7 8 9 |
24 18 17 23 28 |
حلقه تو در تو (nested loops) در متلب
متلب به شما اجازه میدهد از حلقهای درون حلقهی دیگر استفاده کنید. در ادامه به دو نوع سینتکس حلقه تو در تو در متلب و مثالهای آن اشاره میکنیم.
حلقه تو در توی for در متلب مطابق سینتکس زیر است:
1 2 3 4 5 |
for m = 1:j for n = 1:k <statements>; end end |
حلقه تو در توی while در متلب مطابق سینتکس زیر است:
1 2 3 4 5 |
while <expression1> while <expression2> <statements> end end |
مثال: در این مثال با استفاده از حلقههای تو در تو در متلب میخواهیم اعداد اول بین ۱ تا ۱۰۰ را نمایش دهیم. یک فایل اسکریپ ایجاد کرده و کد زیر را در آن قرار دهید:
1 2 3 4 5 6 7 8 9 10 |
for i = 2:100 for j = 2:100 if(~mod(i,j)) break; % اگر عاملی پیدا شد، یعنی عدد اول نیست. end end if(j > (i/j)) fprintf('%d is prime\n', i); end end |
با اجرای فایل بالا نتایج زیر را خواهید یافت:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
2 is prime 3 is prime 5 is prime 7 is prime 11 is prime 13 is prime 17 is prime 19 is prime 23 is prime 29 is prime 31 is prime 37 is prime 41 is prime 43 is prime 47 is prime 53 is prime 59 is prime 61 is prime 67 is prime 71 is prime 73 is prime 79 is prime 83 is prime 89 is prime 97 is prime |
دستور break در حلقه
دستور break اجرای حلقههای while یا for را متوقف میکند. جملاتی که پس از این دستور در حلقه باشند، دیگر اجرا نخواهند شد. در حلقههای تو در تو، دستور break فقط در حلقهای که در آن وجود دارد اجرا میشود (نه حلقههای بزرگتر) به این صورت که مسیر کنترلی از آن پس به جملات پس از اتمام حلقه منتقل میشود.
مثال: یک فایل اسکریپ ایجاد کرده و کد زیر را در آن قرار دهید:
1 2 3 4 5 6 7 8 |
a = 10; while (a < 20 ) fprintf('value of a: %d\n', a); a = a + 1; if( a > 15) break; end end |
با اجرای کد به نتایج زیر میرسیم. اگر a بزرگتر از ۱۵ باشد از حلقه خارج میشویم.
1 2 3 4 5 6 |
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 |
دستور continue در حلقه
از دستور continue برای انتقال کنترل حلقهها به تکرار بعدی (و گذشتن از ادامه بدنهی دستورات شرط) استفاده میشود. به عبارتی دستور continue مانند دستور break عمل میکند با این تفاوت که به جای گذشتن از همهی تکرارها و اتمام حلقه، دستور continue فقط از یک تکرار رد میشود و کدهای بین آن را اجرا نمیکند و به سراغ تکرارهای بعدی میرود.
مثال: یک فایل اسکریپت مانند زیر اجرا کنید:
1 2 3 4 5 6 7 8 |
a = 9; while a < 20 a = a + 1; if a == 15 continue; end fprintf('value of a: %d\n', a); end |
1 2 3 4 5 6 7 8 9 10 |
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 value of a: 20 |