دستورات حلقه و تکرار در ++C

دستورات حلقه و تکرار در ++C

در این جلسه از سری آموزش های برنامه نویسی ++C در مورد دستورات حلقه و تکرار در ++C صحبت خواهیم کرد. تكرار، اجرای پی در پی يك دستور يا بلوكی از دستورالعمل‌ها در يك برنامه است. با استفاده از تکرار می‌توانيم کنترل برنامه را مجبور کنيم تا به خطوط قبلي برگردد و آن‌ها را دوباره اجرا نمايد. C++ دارای سه دستور تكرار است: دستور while، دستور do_while و دستور for. دستور‌های تکرار به علت طبيعت چرخه‌مانندشان‌، حلقه‌ نيز ناميده می‌شوند.

رئوس مطالب این جلسه

  • دستور while
  • خاتمه دادن به يك حلقه
  • دستور do..while
  • دستور for
  • دستور break
  • دستور continue
  • دستور goto
  • توليد اعداد شبه تصادفی

دستور while

در ابتدای جلسه دستورات حلقه و تکرار در ++C ، نحو یا syntax دستور while بیان می شود:

while (condition) statement;

به جاي condition، يك شرط قرار مي‌گيرد و به جاي statement دستوری که بايد تکرار شود قرار می‌گيرد. اگر مقدار شرط، صفر (يعني نادرست) باشد، statement ناديده گرفته می‌شود و برنامه به اولين دستور بعد از while پرش می‌كند. اگر مقدار شرط ناصفر (يعني‌ درست) باشد، statement اجرا ‌شده و دوباره مقدار شرط بررسي می‌شود. اين تکرار آن قدر ادامه مي‌يابد تا اين که مقدار شرط صفر شود.

مثال: محاسبۀ حاصل جمع اعداد صحيح متوالي با حلقۀ while : اين برنامه مقدار 1 + 2 + 3 + … + n را برای عدد ورودي n محاسبه می‌كند:

این دستور با استفاده از حلقه while تا زمانی که شرط توقف برآورده نشده ادامه پیدا می کند. در مثال بالا با اجرای برنامه متوجه خواید شد که با ورودی عدد 10 جمع اعداد 1 تا 10 یعنی 55 را برای ما محاسبه می کند.

خاتمه دادن به يك حلقه

قبلا‌ ديديم كه چگونه دستور break براي كنترل دستورالعمل switch استفاده مي‌شود (جلسه سوم : دستورات شرطی). از دستور break براي پايان دادن به حلقه‌ها نيز می‌توان استفاده کرد. يكي از‌ مزيت‌هاي دستور break اين است كه فوراً حلقه را خاتمه می‌دهد بدون اين که مابقی دستورهای درون حلقه اجرا شوند.

مثال: 

مثال اعداد فيبوناچی

در ادامه دستورات حلقه و تکرار در ++C مثال اعداد فیبوناچی را داریم. اعداد فيبوناچی …, F0, F1, F2, F3 به شکل بازگشتي توسط معادله‌هاي زير تعريف می‌شوند:

F0 = 0 , F1 = 1 , Fn = Fn-1 + Fn-2

مثلا براي n=2 داريم:

F2 = F2-1 + F2-2 = F1 + F0 = 0 + 1 = 1

يا براي n=3 داريم:

F3 = F3-1 + F3-2 = F2 + F1 = 1 + 1 = 2

و براي n=4 داريم:

F4 = F4-1 + F4-2 = F3 + F2 = 2 + 1 = 3

برنامۀ زير، همۀ اعداد فيبوناچي را تا يك محدودۀ مشخص که از ورودی دريافت می‌شود، محاسبه و چاپ می‌كند:

مثال استفاده از تابع (exit(0

تابع (exit(0 روش ديگري برای خاتمه دادن به يك حلقه‌ است. هرچند که اين تابع بلافاصله اجرای کل برنامه را پايان می‌دهد:

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

متوقف کردن يك حلقۀ نامتناهی

با فشردن کليدهاي Ctrl+C سيستم عامل يک برنامه را به اجبار خاتمه مي‌دهد. كليد Ctrl را پايين نگه داشته و كليد C روي صفحه‌كليد خود را فشار دهيد تا برنامۀ فعلي خاتمه پيدا کند.

دستور do..while

ساختار do..while روش ديگري براي ساختن دستورات حلقه و تکرار در ++C است نحو آن به صورت زير است:

do statement while (condition);

به جاي condition يك شرط قرار مي‌گيرد و به جاي statement‌ دستور يا بلوکي قرار مي‌گيرد که قرار است تکرار شود. اين دستور ابتدا statement‌ را اجرا مي‌كند و سپس شرط condition را بررسي مي‌كند. اگر شرط درست بود حلقه دوباره تکرار مي‌شود وگرنه حلقه پايان مي‌يابد.

دستور‌ do..while مانند دستور while است. با اين فرق كه شرط کنترل حلقه به جاي اين که در ابتداي حلقه ارزيابي گردد، در انتهاي حلقه ارزيابي مي‌شود.
يعني هر متغير كنترلي به جاي اين كه قبل از شروع حلقه تنظيم شود، مي‌تواند درون آن تنظيم گردد. نتيجۀ ديگر اين است كه حلقۀ do..while هميشه بدون توجه به مقدار شرط كنترل، لااقل يك بار اجرا مي‌شود اما حلقۀ while مي‌تواند اصلا اجرا نشود.

مثال: محاسبۀ حاصل جمع اعداد صحيح ‌متوالي با حلقۀ do..while‌

مثال: اعداد فاكتوریل

اعداد فاكتوریل 0! و 1! و 2! و 3! و … با استفاده از رابطه‌هاي بازگشتي زير تعريف مي‌شوند:

0! = 1 , n! = n(n-1)!

براي مثال، به ازاي n = 1 در معادلۀ دوم داريم:

1! = 1((1-1)!) = 1(0!) = 1(1) = 1

همچنين براي n = 2 داريم:

2! = 2((2-1)!) = 2(1!) = 2(1) = 2

و به ازاي n = 3 داريم:

3! = 3((3-1)!) = 3(2!) = 3(2) = 6

برنامۀ زير همۀ‌ اعداد فاكتوریل را که از عدد داده شده کوچک‌ترند، چاپ می‌کند:

دستور for

نحو یا syntax دستورالعمل for در دستورات حلقه و تکرار در ++C به صورت زير است:

for (initialization; condition; update) statement;

سه قسمت داخل پرانتز، حلقه را کنترل می‌کنند.

  • عبارت initialization براي اعلان يا مقداردهی اوليه به متغير کنترل حلقه استفاده می‌شود.اين عبارت اولين عبارتی است که ارزيابی می‌شود پيش از اين که نوبت به تکرارها برسد.
  • عبارت condition براي تعيين اين که آيا حلقه بايد تکرار شود يا خير به کار می‌رود. يعني اين عبارت، شرط کنترل حلقه است. اگر اين شرط درست باشد دستور statement اجرا می‌شود.
  • عبارت updateبراي پيش‌بردن متغير کنترل حلقه به کار می‌رود. اين عبارت پس از اجراي statement ارزيابی می‌گردد.

بنابراين زنجيرۀ وقايعي که تکرار را ايجاد می‌کنند عبارتند از:

  1. ارزيابي عبارت initialization
  2. بررسي شرط condition . اگر نادرست باشد، حلقه خاتمه می‌يابد.
  3. اجراي statement
  4. ارزيابي عبارت update
  5. تکرار گام‌هاي 2 تا 4

عبارت‌هاي initialization و condition و update عبارت‌های اختياری هستند. يعني می‌توانيم آن‌ها را در حلقه ذکر نکنيم.

مثال: استفاده از حلقۀ for براي محاسبۀ مجموع اعداد صحيح متوالی

در ++C استاندارد وقتي يك متغير كنترل درون يك حلقۀ for اعلان می‌شود (مانند i در مثال بالا) حوزۀ آن متغير به همان حلقۀ for محدود می‌گردد. يعني آن متغير نمی‌تواند بيرون از آن حلقه استفاده شود. نتيجۀ ديگر اين است که می‌توان از نام مشابهی در خارج از حلقۀ for براي يك متغير ديگر استفاده نمود.

مثال: يك حلقۀ for نزولی – برنامۀ زير‌ ده عدد صحيح مثبت را به ترتيب نزولی چاپ می‌كند:

مثال: بيشتر از يك متغير كنترل در حلقۀ for – حلقۀ for در برنامۀ زير دو متغير كنترل دارد:

مثال: حلقه‌های for تودرتو – برنامۀ زير يك جدول ضرب چاپ می‌كند:

دستور break

دستور break يک دستور آشناست. قبلاً از آن براي خاتمه دادن به دستور switch و همچنين حلقه‌هاي while و do..while استفاده کرده‌ايم. از اين دستور براي خاتمه دادن به حلقۀ for نيز مي‌توانيم استفاده کنيم. دستور break در هر جايي درون حلقه می‌تواند جا بگيرد و در همان جا حلقه را خاتمه دهد.
وقتي دستور break درون حلقه‌هاي تودرتو استفاده شود، فقط روی حلقه‌اي که مستقيماً درون آن قرار گرفته تاثير می‌گذارد. حلقه‌هاي بيرونی بدون هيچ تغييری ادامه مي‌يابند.

دستور continue

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

مثال: استفاده از دستورهاي break و continue – اين برنامۀ كوچك،‌ دستورهاي break و continue را شرح می‌دهد:

دستور goto

دستور goto نوع ديگري از دستورات حلقه و تکرار در ++C است. مقصد اين پرش توسط يك برچسب معين مي‌شود. برچسب شناسه‌اي است كه جلوي آن علامت كولن ( : ) می‌آيد و جلوي يك دستور ديگر قرار مي‌گيرد. يک مزيت دستور goto اين است که با استفاده از آن می‌توان از همۀ حلقه‌های تودرتو خارج شد و به مکان دلخواهی در برنامه پرش نمود.

مثال: استفاده از دستور goto براي خارج شدن از حلقه‌هاي تودرتو

توليد اعداد شبه تصادفی

يكی از كاربردهای بسيار مهم کامپیوترها، «شبيه‌سازی»‌ سيستم‌های دنياي واقعی است. تحقيقات و توسعه‌های بسيار پيشرفته به اين راهکار خيلی وابسته است. به وسيلۀ شبيه‌سازی می‌توانيم رفتار سيستم‌های مختلف را مطالعه کنيم بدون اين که لازم باشد واقعا آن‌ها را پياده‌سازی نماييم. در شبيه‌سازی نياز است «اعداد تصادفی» توسط کامپیوتر‌ها توليد شود تا نادانسته‌های دنياي واقعی مدل‌سازی شود.

کامپیوتر‌ها «ثابت‌کار» هستند يعنی با دادن داده‌های مشابه به کامپیوتر‌های مشابه، هميشه خروجی يکسان توليد می‌شود. با وجود اين می توان اعدادی توليد کرد که به ظاهر تصادفی هستند؛ اعدادي که به طور يکنواخت در يک محدودۀ خاص گسترده‌اند و برای هيچ‌کدام الگوی مشخصی وجود ندارد. چنين اعدادی را «اعداد شبه‌تصادفی» می‌ناميم.

مثال: توليد اعداد شبه تصادفی – اين برنامه از تابع rand() براي توليد اعداد شبه‌تصادفی استفاده می‌كند:

هر بار که برنامۀ بالا اجرا شود، کامپایلر هشت عدد صحيح unsigned‌ توليد می‌کند که به طور يکنواخت‌ در فاصلۀ 0 تا RAND_MAX گسترده شده‌اند.‌ AND_MAX در اين کامپایلر برابر با 2,147,483,647 است.  هر عدد شبه‌تصادفی از روي عدد قبلی خود ساخته می‌شود. اولين عدد شبه‌تصادفي از روي يك مقدار داخلی که «هسته» گفته می‌شود ايجاد می‌گردد.
هر دفعه که برنامه اجرا شود، هسته با يک مقدار پيش‌فرض بارگذاري می‌شود. براي حذف اين اثر نامطلوب که از تصادفی بودن اعداد می‌کاهد، می‌توانيم با استفاده از تابع ()srand خودمان مقدار هسته را انتخاب کنيم.

مثال بالا كارگذاری هسته به طور محاوره‌ای است. اين برنامه مانند برنامۀ قبلی است بجز اين كه می‌توان هستۀ توليدکنندۀ اعداد تصادفي را به شکل محاوره‌ای وارد نمود.

مطالب زیر را حتما بخوانید

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

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

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