دوشنبه , ۳۰ اردیبهشت ۱۳۹۸
آخرین مطالب
LINK TABLES
خانه | برنامه‌نویسی | زبان C – حلقه‌های تکرار (جلسه ۱۰)

زبان C – حلقه‌های تکرار (جلسه ۱۰)

کم‌کم داریم به جمع حرفه‌ای های زبان سی می‌رسیم. امروز جلسه ۱۰ ام را می‌خوایم شروع کنیم. پس با یه سلام خیلی خیلی گرم به شما می‌ریم سراغ معرفی حلقه‌ های تکرار در زبان C.

سایر جلسات زبان C که تا کنون تدریس شده

جلسه اول = مقدمه                                      جلسه دوم = انواع داده

جلسه سوم = اشاره گر                                 جلسه چهارم = آرایه

جلسه پنجم = رشته                                     جلسه ششم = آرایه و اشاره گر

جلسه هفتم = ساختار (structure)                   جلسه هشتم = عملگرها

جلسه نهم = ساختارهای شرطی                   معرفی چند مفهوم مهم در برنامه نویسی

 

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

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

  1. حلقه while
  2. حلقه do while
  3. حلقه for

 

حلقه  while

یکی از حلقه های تکرار در زبان C، حلقه while است. هدف کلمه ی کلیدی while چندین بار تکرار اجرای یک حکم می باشد البته تا زمانی که شرط دارای ارزش منطقی (درست) باشد. هنگامی که شرط حلقه‌ی while دارای ارزش منطقی ((درست)) نباشد، حلقه متوقف می شود و اجرای برنامه از دستور بعدی حلقه از سر گرفته می شود.

قالب حلقه while به شکل زیر است:

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

حلقه while

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

به یک مثال ساده از حلقه while دقت کنید:

  • در خط یک متغیر a با مقدار اولیه صفر تعریف شده است.
  • در خط دو حلقه while با شرط کوچکتر بودن a از ۱۶ مشخص می شود.
  • در صورت صحیح بودن شرط مقدار a روی PORTD میکروکنترلر قرار گرفته و a یک واحد افزایش می یابد.
  • مشخص است که این حلقه یک شمارنده داشته و ۱۶ بار اجرا می شود.

حلقه ها می توانند به صورت تودر تو نیز ایجاد شوند. به مثال زیر توجه کنید:

  • حلقه اول تا وقتی که متغیر x کوچکتر از ۸ است، کد های داخل خود را تکرار می کند.
  • در حلقه اول حلقه دیگری قرار دارد که شرط آن این طور است: تا وقتی متغیر y  مخالف ۱ است، کد های مربوط به خود را تکرار می کند.
  • حلقه داخلی در مثال بالا دارای {  } نمی باشد، زیرا تنها یک دستور مربوط به حلقه داخلی است و آن دستور  PORTD=~PORTD   است که هر بار مقدار رجیستر PORTD  را معکوس ( not ) مقدار قبلی خود قرار می دهد.
  • دستور  x++ جزو حلقه اول می باشد.
  • وقتی شرط حلقه اول برقرار باشد، برنامه وارد حلقه اول می شود و اگر شرط حلقه داخلی برقرار باشد، تا وقتی که شرط حلقه داخلی برقرار است، فقط حلقه داخلی اجرا می شود.
  • مانند دستور if اگر تنها یک دستور در حلقه وجود داشته باشد، نیاز به {  } نمی باشد.

 

یک مثال کاملتر در مورد حلقه while بررسی می کنیم.

پس از کامپایل و اجرای برنامه نتایج زیر حاصل می شود:

  • در این مثال a مقدار اولیه ۱۰ می گیرد.
  • سپس در حلقه while شرط روی a تعیین می شود.
  • حلقه در هر بار اجرا مقدار فعلی a را چاپ کرده و یکی به مقدار a اضافه می کند.
  • پس این حلقه ۱۰ مرتبه تکرار می شود.
  • اگر شرط حلقه while یک مقدار ثابت غیر صفر باشد، آن را حلقه نامتناهی می گویند. حلقه نامتناهی هرگز به پایان نمی رسد.
  • تذکر یک نکته کاربردی: برنامه اصلی میکروکنترلر باید در یک حلقه نامتناهی نوشته شود تا به صورت نامحدود تکرار شود. معمولا هم از (while(1 استفاده می شود.

 

حلقه  do . . . while

این حلقه کاملا شبیه حلقه While است ، با یک تفاوت کوچک. در حلقه  do…while شرط حلقه در انتهای آن بررسی می شود و این امر باعث می شود که همیشه کدهای داخل حلقه do…while  حداقل یک مرتبه اجرا شود.(حتی اگر شرط از اول غلط باشد)

اگر شرط برقرار باشد، تکرار کدها ادامه پیدا می کند، اما اگر شرط برقرار نباشد برنامه از حلقه خارج می شود.

قالب این حلقه به صورت زیر است :

فلوچارت این حلقه هم بدین صورت خواهد بود:

حلقه do while

به مثال توجه کنید :

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

یک مثال کاملتر در مورد حلقه do while را که دقیقا مشابه مثال حلقه while است بررسی می کنیم:

پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می شود:

تنها تفاوت استفاده ا زحلقه do while است. سعی کنید کد را برای خودتان تفسیر کنید و اگر سوالی داشتید در بخش نظرات مطرح کنید.

حلقه  for

حلقه for را می توان مهم ترین حلقه در زبان برنامه نویسی  C دانست. معمولا در حالتی که تعداد دفعات تکرار حلقه از قبل مشخص باشد، به کار می رود و نسبت به حلقه های while و do while قابلیت های بیشتری دارد. حلقه for سه پارامتر قابل تغییر دارد که به ترتیب زیر است:

  1. در این حلقه متغیری با نام شمارنده حلقه وجود دارد. شمارنده حلقه تعداد دفعات تکرار را می شمارد و دارای یک مقدار اولیه است. نسبت به تعداد تکرار حلقه، طول شمارنده مشخص می شود.برای مثال اگر تعداد تکرار حلقه ایی ۲۰۰ مرتبه باشد، می توان متغیر شمارشی از نوع  unsigned char معرفی کرد، اما اگر تعداد تکرار حلقه ۱۰۰۰ مرتبه باشد، باید متغیری با طول بیشتر مثل نوع int انتخاب کرد.
  2. میزان تغییر شمارنده در هر بار تکرار حلقه توسط گام حرکت حلقه تعیین می شود. گام حرکت می تواند عددی صحیح یا اعشاری، مثبت یا منفی ویا کاراکتری باشد.
  3. آخرین پارامتر حلقه  for شرط حلقه است. شرط حلقه تعداد دفعات تکرار دستورات داخل حلقه را کنترل می کند. اگر این شرط برقرار باشد، دستورات داخل حلقه اجرا می شوند وگرنه کنترل برنامه از حلقه خارج می شود.

قالب حلقه for به شکل زیر است:

فلوچارت حلقه for نیز به صورت زیر است:

حلقه for

به مثال زیر توجه کنید:

  • در خط یک متغیر i تعریف شده است.
  • مقدار اولیه متغیر i برابر با صفر است.
  • شرط حلقه تا وقتی برقرار است که مقدار متغیر i کوچکتر از عدد ۸ باشد. پس حلقه ۸ مرتبه تکرار می شود.
  • گام حلقه به شکلی تنظیم شده که با هر بار اجرای حلقه، یک واحد به i اضافه شود.
  • از تغییرات متوالی مقدار متغیر i می توان در حلقه استفاده کرد. یک آرایه با نام a قبلا معرفی شده است، به جای اندیس آرایه a، متغیر i قرار گرفته است.
  • بنابراین با هر بار تکرار حلقه و تغییر مقدار متغیر i، اندیس آرایه نیز تغییر می کند و هر بار مقدار i به عضو  i ام آرایه a انتساب داده می شود.
  • برای مثال اگر حلقه در تکرار سوم قرار گیرد، یعنی مقدار i برابر با عدد ۲ است. در این حالت کد داخل حلقه به صورت a[2]=2 می شود.
  • مثال بالا شامل {  } نمی باشد، زیرا تنها یک دستور در بدنه حلقه قرار دارد. اگر دستورات بیش از یک دستور باشد، حتما باید از { } استفاده شود.

 

حلقه for نیز می تواند به صورت یک حلقه تو در تو باشد. به مثال توجه کنید:

  • حلقه بیرونی ۸ مرتبه تکرار و حلقه داخلی ۲۵۶ مرتبه تکرار می شود. یعنی با هر مرتبه تکرار حلقه بیرونی، حلقه داخلی ۲۵۶ مرتبه تکرار می شود. بنابر این تکرار کل ۲۰۴۸ مرتبه است.
  • از این روش برای مقدار دهی به آرایه های دو بعدی نیز استفاده می شود ، حلقه بیرونی سطر ها را کنترل می کنید . حلقه داخلی ستون های هر سطر را مقدار دهی می کنید. اگر نیاز به مطالعه درباره آرایه ها دارید پست آرایه ها را بررسی کنید.

 

به مثال زیر دقت کنید:

  • حلقه بیرونی فقط یک دستور در داخل خود دارد و آن هم حلقه داخلی است و حلقه داخلی نیز تنها یک دستور داخل خود دارد.
  • حلقه بیرونی ۱۰ بار تکرار می شود و در هر بار تکرار آن، حلقه داخلی ۲۰ بار تکرار می شود. این گونه می توان با هر بار تکرار حلقه اول یک سطر را انتخاب کرده و با تکرار های حلقه دوم ستون های سطر مورد نظر را پر کرد.
  • این برنامه درون تمام اعضای آرایه دو بعدی a مقدار ۱ را قرار می دهد.
  • برای کار کردن با آرایه های یک بعدی چگونه می توان از حلقه for استفاده کرد؟

 

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

پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می شود:

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

دستور break  و  continue در حلقه ها

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

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

درباره ی احسان عبداللهی

احسان عبداللهی هستم | کارشناسی الکترونیک خوندم و کارشناسی ارشد مخابرات |در سال 94 وب سایت میکرولرن را راه اندازی کردم | سعی کردم هر چیزی را به صورت کاربردی دنبال کنم، برای همین از کارشناسی کار با میکروکنترلرهای AVR و ARM، برنامه نویسی C و طراحی PCB را به صورت تخصصی کار کردم و از کارشناسی ارشد برنامه نویسی پایتون ، Computer vision و deep learning را به صورت تخصصی و کاربردی شروع کردم | الان هم سعی میکنم همیشه خودم را به روز نگه دارم و لذت کار کردن با دنیای برنامه نویسی و امبدد سیستم ها را به دیگران انتقال بدم

۲ دیدگاه

  1. سلام
    در بعضی برنامه های avr بعد از ()while یک ; قرار داده شود این به چه معناست؟؟
    با تشکر.

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

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