زبان C – حلقههای تکرار (جلسه ۹)
زمان تقریبی مطالعه این مقاله: ۸ دقیقه
سلام به میکرولرنیهای عزیز 🙂 🙂 🙂
این مقاله در ۳۰ اردیبهشت ۱۴۰۰ به روز رسانی شده.
کمکم داریم به جمع حرفهای های زبان سی میرسیم. تا این جلسه مفاهیم مهمی را با هم بررسی کردیم که اگه در اونها احساس ضعف میکنید از بخش زیر میتونید مطالعه کنید و خودتون را قوی کنید.
اما این جلسه نوبت به انجام کارهایی در برنامه نویسی C میرسه که لازمه پشت سر هم تکرار بشن. برای این کار از حلقه در زبان C استفاده میکنیم. در این جلسه تمرکز زیادی روی حلقه for و حلقه while خواهیم داشت. پس بریم برای آموزش حلقههای زبان C. با میکرولرن، مرجع برنامه نویسی C همراه باشید.
فهرست مطالب
حلقه در زبان C
یکی دیگر از اجزای اصلی زبانهای برنامه نویسی حلقهها هستند. حلقههای تکرار تحت شرایط خاصی، یک یا چند دستور را چندین بار اجرا میکنند. به عنوان مثال، اگر بخواهیم تعداد ۱۰۰ عدد را از ورودی بخوانیم و آنها را با هم جمع کنیم؛ باید عمل خواندن عدد را ۱۰۰ بار تکرار کنیم.
عملکرد یک حلقه به این صورت است که کد مربوط به حلقه تا زمانی که شرط حلقه برقرار باشد، تکرار میشود و تا زمانی که حلقه در حال اجرا است، برنامه در محل حلقه میماند. ساختارهای تکرار در زبانهای برنامه نویسی مختلف به شکلهای گوناگونی استفاده میشوند. اکنون میخواهیم این ساختارها را در زبان C مورد بررسی قرار دهیم. زبان C سه نوع حلقه دارد:
- حلقه while
- حلقه do while
- حلقه for
حلقه while
یکی از حلقههای تکرار در زبان C، حلقه while است. هدف کلمهی کلیدی while چندین بار تکرار دستورات میباشد. البته تا زمانی که شرط حلقه دارای ارزش منطقی (درست) باشد.
هنگامی که شرط حلقهی while دارای ارزش منطقی (درست) نباشد، حلقه متوقف میشود و اجرای برنامه از دستور بعدی حلقه از سر گرفته میشود.
قالب حلقه while به شکل زیر است:
while(شرط حلقه)
{
//کد هایی که در زمان برقراری شرط حلقه تکرار می شوند
}
فلوچارت این حلقه به صورت نشان داده شده در تصویر زیر است:
اگر به فلوچارت دقت کنید، متوجه میشوید که اگر شرط صحیح نباشد حتی یک بار هم دستورات داخل حلقه اجرا نخواهند شد.
به یک مثال ساده از حلقه while دقت کنید:
int a = 1;
while(a < 16){
PORTD = a;
a++;
}
- در خط یک متغیر a با مقدار اولیه یک تعریف شده است.
- در خط دو حلقه while با شرط کوچکتر بودن a از ۱۶ مشخص میشود.
- در صورت صحیح بودن شرط، مقدار a روی PORTD میکروکنترلر AVR قرار گرفته و a یک واحد افزایش مییابد.
- مشخص است که این حلقه یک شمارنده داشته و ۱۵ بار اجرا میشود.
حلقهها میتوانند به صورت تو در تو نیز ایجاد شوند. به مثال زیر توجه کنید:
while(x < 8){
while(y != 1)
PORTD = ~PORTD;
x++;
}
- حلقه اول تا وقتی که متغیر x کوچکتر از ۸ است، کدهای داخل خود(خطوط ۲ تا ۴) را تکرار میکند.
- در حلقه اول حلقه دیگری قرار دارد که شرط آن این طور است: تا وقتی متغیر y مخالف ۱ است، کد های مربوط به خود را تکرار میکند.
- حلقه داخلی در مثال بالا دارای { } نمی باشد، زیرا تنها یک دستور مربوط به حلقه داخلی است و آن دستور PORTD = ~PORTD است که هر بار مقدار رجیستر PORTD را معکوس ( not ) مقدار قبلی خود قرار میدهد.
- دستور ++x جزء حلقه اول است.
- وقتی شرط حلقه اول برقرار باشد، برنامه وارد حلقه اول میشود و اگر شرط حلقه داخلی برقرار باشد، تا وقتی که شرط حلقه داخلی برقرار است، فقط حلقه داخلی اجرا میشود.
- مانند دستور if اگر تنها یک دستور در حلقه وجود داشته باشد، نیاز به { } نمیباشد.
- چون این برنامه یک قطعه کد است میتوانید قبل از آن مقادیر دلخواه برای x و y در نظر بگیرید.
یک مثال کاملتر در مورد حلقه while بررسی میکنیم:
#include <stdio.h>
int main(){
int a = 10;
while( a < 20 )
{
printf("value of a: %d\n", a);
a++;
}
return 0;
}
پس از کامپایل و اجرای برنامه نتایج زیر حاصل می شود:
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
- در این مثال a مقدار اولیه ۱۰ میگیرد.
- سپس در حلقه while شرط روی a تعیین میشود.
- حلقه در هر بار اجرا مقدار فعلی a را چاپ کرده و یکی به مقدار a اضافه میکند.
- پس این حلقه ۱۰ مرتبه تکرار میشود.
- اگر شرط حلقه while یک مقدار ثابت غیر صفر باشد، آن را حلقه نامتناهی می گویند. حلقه نامتناهی هرگز به پایان نمیرسد.
- تذکر یک نکته کاربردی: برنامه اصلی میکروکنترلر باید در یک حلقه نامتناهی نوشته شود تا به صورت نامحدود تکرار شود. معمولا هم از (while(1 استفاده میشود.
حلقه do / while
این حلقه کاملا شبیه حلقه While است، با یک تفاوت کوچک. در حلقه do…while شرط حلقه در انتهای آن بررسی میشود و این امر باعث میشود که همیشه کدهای داخل حلقه do…while حداقل یک مرتبه اجرا شود.(حتی اگر شرط از اول غلط باشد)
اگر شرط برقرار باشد، تکرار کدها ادامه پیدا میکند، اما اگر شرط برقرار نباشد برنامه از حلقه خارج میشود.
قالب این حلقه به صورت زیر است :
do
{
//کد هایی که در زمان برقراری شرط حلقه تکرار می شوند
}
while(شرط حلقه);
فلوچارت این حلقه هم بدین صورت خواهد بود:
به مثال توجه کنید :
int a = 1;
do{
PORTD = a;
a++;
}While( a < 16 );
- دقیقا مانند مثال حلقه while است اما یک تفاوت دارد.
- بار اول بدون بررسی شرط، یک بار دستورات حلقه اجرا میشوند.
- در انتهای حلقه شرط بررسی میشود. اگر شرط برقرار بود دوباره حلقه تکرار میشود و این روال تا زمانی که شرط حلقه برقرار باشد تکرار خواهد شد.
یک مثال کاملتر در مورد حلقه do while را که دقیقا مشابه مثال حلقه while است بررسی می کنیم:
#include <stdio.h>
int main(){
int a = 10;
do
{
printf("value of a: %d\n", a);
a = a + 1;
}while( a < 20 );
return 0;
}
پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می شود:
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 است. سعی کنید کد را برای خودتان تفسیر کنید و اگر سوالی داشتید در بخش نظرات مطرح کنید.
حلقه for
حلقه for را میتوان مهمترین حلقه در زبان برنامه نویسی C دانست. معمولا این حلقه در حالتی که تعداد دفعات تکرار حلقه از قبل مشخص باشد، به کار میرود و نسبت به حلقه های while و do while قابلیت های بیشتری دارد.
قالب تعریف حلقه for به شکل زیر است:
for(گام حرکت حلقه ; شرط حلقه ;مقدار اولیه شمارنده حلقه)
{
//کد هایی که تا زمان برقراری شرط حلقه تکرار می شوند
}
در ادامه اجزای حقله for را بررسی میکنیم:
- در این حلقه متغیری با نام شمارنده حلقه وجود دارد. شمارنده حلقه تعداد دفعات تکرار را میشمارد و دارای یک مقدار اولیه است. طول شمارنده نسبت به تعداد تکرار حلقه، مشخص میشود.
برای مثال اگر تعداد تکرار حلقهای ۲۰۰ مرتبه باشد، میتوان متغیر شمارشی از نوع unsigned char معرفی کرد، اما اگر تعداد تکرار حلقه ۱۰۰۰ مرتبه باشد، باید متغیری با طول بیشتر مثل نوع int انتخاب کرد. - میزان تغییر شمارنده در هر بار تکرار حلقه توسط گام حرکت حلقه تعیین میشود. گام حرکت میتواند عددی صحیح یا اعشاری، مثبت یا منفی و یا کاراکتری باشد.
- آخرین پارامتر حلقه for شرط حلقه است. شرط حلقه تعداد دفعات تکرار دستورات داخل حلقه را کنترل میکند. اگر این شرط برقرار باشد، دستورات داخل حلقه اجرا میشوند وگرنه کنترل برنامه از حلقه خارج میشود.
فلوچارت حلقه for نیز به صورت زیر است:
به مثال زیر توجه کنید:
int i;
for(i = 1; i < 8; i++)
a[i] = i;
- در خط یک متغیر i تعریف شده است.
- مقدار اولیه متغیر i برابر با یک است.
- شرط حلقه تا وقتی برقرار است که مقدار متغیر i کوچکتر از عدد ۸ باشد. پس حلقه ۷ مرتبه تکرار میشود.
- گام حلقه به شکلی تنظیم شده که با هر بار اجرای حلقه، یک واحد به i اضافه شود.
- از تغییرات متوالی مقدار متغیر i می توان در حلقه استفاده کرد. یک آرایه با نام a قبلا معرفی شده است، به جای اندیس آرایه a، متغیر i قرار گرفته است.
- بنابراین با هر بار تکرار حلقه و تغییر مقدار متغیر i، اندیس آرایه نیز تغییر میکند و هر بار مقدار i به عضو i ام آرایه a نسبت داده میشود.
- برای مثال اگر حلقه در تکرار دوم قرار گیرد، یعنی مقدار i برابر با عدد ۲ است. در این حالت کد داخل حلقه به صورت a[2] = 2 میشود.
- حلقه بالا شامل { } نمیباشد، زیرا تنها یک دستور در بدنه حلقه قرار دارد. اگر بدنه حلقه بیشتر از یک دستور داشته باشد، حتما باید از { } استفاده شود.
حلقه for نیز میتواند به صورت تو در تو به کار رود. به مثال توجه کنید:
for(i = 1; i < 8; i++){
PORTB = i;
for(j = 1;j < 256; j++ )
PORTD = j;
}
- حلقه بیرونی ۷ مرتبه و حلقه داخلی ۲۵۵ مرتبه تکرار میشود. یعنی با هر مرتبه تکرار حلقه بیرونی، حلقه داخلی ۲۵۵ مرتبه تکرار میشود. بنابراین تکرار کل ۷*۲۵۵ مرتبه است.
- در این مثال، مقادیری روی پورتهای B و D میکروکنترلر AVR قرار داده شده است.
به یک مثال دیگر دقت کنید:
int a[10][20];
int i, j;
for(i = 1; i <= 10; i++)
for(j = 1; j <= 20; j++)
a[i-1][j-1] = 1;
- در این مثال به آرایه دو بعدی مقدار دهی شده است. حلقه بیرونی سطرها را کنترل میکند. حلقه داخلی ستونهای هر سطر را مقدار دهی میکند. اگر نیاز به مطالعه درباره آرایهها دارید مقاله آرایه ها را بررسی کنید.
- حلقه بیرونی فقط یک دستور در داخل خود دارد و آن هم حلقه داخلی است و حلقه داخلی نیز تنها یک دستور داخل خود دارد.
- حلقه بیرونی ۱۰ بار تکرار میشود و در هر بار تکرار آن، حلقه داخلی ۲۰ بار تکرار میشود.
- میتوان با هر بار تکرار حلقه اول یک سطر را انتخاب کرده و با تکرارهای حلقه دوم ستونهای سطر مورد نظر را پر کرد.
- این برنامه درون تمام اعضای آرایه دو بعدی a مقدار ۱ را قرار میدهد.
در مثال آخر از حلقه for، آن را در یک تابع استفاده کرده و شمارنده حلقه را روی صفحه نمایش چاپ می کنیم.
#include <stdio.h>
int main(){
int a;
for( a = 10; a < 20; a = a + 1)
{
printf("value of a: %d\n", a);
}
return 0;
}
پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می شود:
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
به دلیل توضیحات کامل مثالهای قبل، این مثال توضیح داده نمی شود. اگر برام فهم تابع استفاده شده نیاز به مطالعه دارید، میتوانید از مقاله تابع استفاده کنید.
دستور continue
برنامه با دیدن دستور continue در هر نقطه از حلقه، کدهای زیر دستور continue را رها کرده و به ابتدای حلقه باز میگردد.
برای درک بهتر این دستور مثال زیر را در نظر بگیرید:
#include <stdio.h>
int main(){
for (int j = 1; j <= 10; j++)
{
if (j == 6)
continue;
printf("%d ", j);
}
return 0;
}
پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می شود:
۱ ۲ ۳ ۴ ۵ ۷ ۸ ۹ ۱۰
دستور break
برنامه با دیدن دستور break در هر نقطه از حلقه، از حلقه خارج شده و کدهای بعد از حلقه را اجرا میکند. دستور break، باعث خروج بدون شرط از حلقه میشود.
برای درک بهتر این دستور مثال زیر را در نظر بگیرید:
#include <stdio.h>
int main(){
int i;
for (i = 20; i>= 10; i--)
{
printf("i: %d\n", i);
if (i == 18)
break;
}
printf("Exit for loop");
return 0;
}
پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می شود:
i: 20
i: 19
Exit for loop
سخن آخر
امیدوارم که از خوندن این مقاله لذت برده باشید 🙂
توی این جلسه حلقه در زبان C را بررسی کردیم. وقتی که می خواید برای میکرو کد بزنید حتما خیلی ازشون استفاده میکنید. جلسه بعد سراغ تابع میریم و یکی دیگه از ابزارهای کارمون را معرفی می کنیم. فراموش نکنید که هر سوالی داشتید زیر همین پست بپرسید. و از طریق لینک شبکه های اجتماعی که زیر این پست می بینیدشون ما رو به دوستاتون معرفی کنید.
به عنوان آخرین حرف، یه پیشنهاد ویژه دارم برای اون دسته از دوستانی که علاقه دارند خیلی عمیقتر زبان C را یاد بگیرن و برای میکروکنترلرها یا کارهای نرم افزاری ازش استفاده کنند.دوره جامع زبان C را براتون تهیه کردم که فوق العاده پروژه محور و کاربردیه. خوش حال میشم در اون دوره شما رو ببینم. برای دسترسی به دوره میتونید روی عکس زیر کلیک کنید.
درباره احسان عبداللهی
مدیر و موسس میکرولرن | برنامه نویسی پاسخی ظریف به یک نیاز در دنیای واقعی هست.
نوشته های بیشتر از احسان عبداللهیمطالب زیر را حتما مطالعه کنید
دوره های آموزشی مرتبط
آموزش جنگو
آموزش پایتون
آموزش الگوریتم و فلوچارت – تفکر برنامه نویسی
آموزش برنامه نویسی C برای میکروکنترلر
آموزش الکترونیک دیجیتال
7 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام جناب عبداللهی عزیز و بزرگوار
سایتتون واقعا مفید و کارآمده
در پناه حق باشید
سلام و درود
خوشحالم که براتون مفید بوده.
سلام
در بعضی برنامه های avr بعد از ()while یک ; قرار داده شود این به چه معناست؟؟
با تشکر.
سلام
معمولا وقتی دستورات حلقه تک خطی هستند یک نقطه ویرگول(;) به معنای پایان دستور قرار می دهند. البته در پایان تمام دستورات زبان سی باید ; قرار دهیم.
سلام،چطور میشه که وقتی دو تا حلقه تو در تو داریم و هر دو دارن هر بار یک واحد رو اضافه میکنن،یکی هربار یک واحد افزایش پیدا کنه و یکی دیگه ۲۵۶؟ در صورتی که تو حلقه اول وقتی به هشت رسید اتوماتیک برنامه از حلقه خارج میشه و دیگه حلقه دوم اجرا نمیشه،که بخواد ۲۵۶ واحد برسه،این در حالی هستش که هر دو متغیر از صفر شمارش میشن،مگه اینکه برنامه اینطور اجرا بشه که وقتی حلقه اول یک بار اجرا میشه و میره داخل حلقه دوم،تو شرط دوم اونقدر میمونه که برسه به ۲۵۶ و بعد از حلقه دوم خارج میشه و میره ادامه برنامه حلقه اول،
سلام. الان این سوال بود یا چیزی را توضیح دادید؟ متوجه منظورتون نشدم. اگه سوالی داری بدون حاشیه رفتن شفاف بپرسید.
در حقیقت سوالی بود،ولی قسمت آخر جواب بود که گفتم شاید اینجوری حل میشه،حاشیه نرفتم،میخواستم منظورم رو خوب برسونم