ساختارهای کنترلی در برنامه نویسی C++ (Control Structures)
بطور کلی، در هر برنامه نویسی اجرای دستورات از اولین سطر شروع شده و به ترتیب تا آخرین سطر ادامه میابد.
اما گاهی وقتها لازم است که یک دستور چندین بار تکرار شود و یا اینکه تحت شرایط خاصی اجرا گردد و یا از اجرای آن جلوگیری شود.
ساختارهای کنترلی به برنامه نویس این اجازه را می دهند که بر روی دستورات کنترل داشته باشد و آنها را تکرار، اجرا و متوقف سازد. در این فصل به بررسی این ساختارها می پردازیم که به دو دسته تقسیم می شوند :
- ساختارهای کنترل
- ساختارهای تصمیم
ساختارهای کنترل :
در برنامه نویسی C++ از ساختار حلقه for برای تکرار یک سری از دستورات استفاده می شود و شکل کلی ایجاد حلقه تکرار بصورت زیر است :
for( مقدار اولیه حلقه ; شرط حلقه ; گام حرکت )
{
Line Command 1;
Line Command 2;
Line Command n;
}
مثال) با استفاده از حلقه تکرار for کدی بنویسید که اعداد 1 تا 10 را چاپ کند.
1 2 3 4
| |
for ( int i = 1; i <= 10; i++ )
{
cout << i << " ";
}
|
1 2 3 4 5 6 7 8 9 10
در کد بالا متغیر i از نوع int تعریف شده و شرط خاتمه حلقه for تا زمانی است که i کوچکتر یا مساوی 10 باشد. گام حرکت حلقه یک است و با هر بار تکرار حلقه یک واحد به متغیر اضافه خواهد شد. متغیر i در پایان حلقه و با خروج از آن یک واحد اضافه خواهد شد. زمانیکه i برابر با 11 می شود برنامه با رسیدن به شرط حلقه و عدم برقرار بودن شرط، از حلقه خارج می شود. برای چاپ اعداد باید در درون خود حلقه، دستور خروجی را نوشت.
در برنامه نویسی، برای تست دستورات روشی به نام Trace وجود دارد که در این مورد از دستورات بسیار مفید است:
عملیات | i<=10 | i |
چاپ 1 | yes | 1 |
چاپ 2 | yes | 2 |
چاپ 3 | yes | 3 |
چاپ 4 | yes | 4 |
چاپ 5 | yes | 5 |
چاپ 6 | yes | 6 |
چاپ 7 | yes | 7 |
چاپ 8 | yes | 8 |
چاپ 9 | yes | 9 |
چاپ 10 | yes | 10 |
خروج از حلقه | no | 11 |
شما با ترسیم چنین جدولی بر روی کاغذ و ردگیری گام به گام حلقه قادر به نوشتن حلقه های پیچیده تر در C++ خواهید بود، با کمی تمرین به راحتی به این مهم خواهید رسید.
مثال) با استفاده از حلقه تکرار for کدی بنویسید که در آن کاربر جمله ای را وارد کرده و در انتهای جمله Enter را فشار دهد و برنامه تعداد حروف جمله را نمایش دهد:
1 2 3 4 5
| |
int count;
cout << "Enter a statement with enter in end:" << endl;
for ( count = 0; cin.get()!='\r' ; count++ );
cout << "Lenght of statement is: " << count;
getch();
|
Enter a statement with enter in end:
I like C++ programming!
Lenght of statement is: 23
در برنامه بالا چند نکته مهم وجود دارد که به بررسی آنها می پردازیم:
الف) به شرط حلقه توجه کنید. تابع cin.get() برای تشخیص ورود Enter بکار می رود. تابع دانه دانه حروف ورودی را بررسی می کند و به محض Enter کردن کاربر از حلقه خارج می شود.
شرط حلقه به این معنی است که : تا زمانیکه حرف وارد شده کاربر مخالف Enter (\r) است حلقه را ادامه بده و به count هر بار یک واحد اضافه کن.
ب) برای حلقه هیچ بلوکی از دستورات وجود ندارد و در انتهای آن هم از سمی کالن استفاده کردیم. در واقع با اینکار ما فقط خواستیم که تعداد حروف جمله را شمارش کنیم.
حلقه های تودرتو
گاهی اوقات لازم است که در یک حلقه، یک یا چند حلقه دیگر هم استفاده نمود.
معروفترین مثال برنامه نویسی در مورد حلقه های تودرتو، نمایش جدول ضرب اعداد است:
1 2 3 4 5 6 7 8
| |
int i,j;
for ( i = 0; i<=10 ; i++ )
{
for ( j = 0; j<=10 ; j++ )
cout << i*j << "\t";
cout << endl;
}
|
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
در ابتدا، برنامه وارد حلقه اول شده و شرط را بررسی می کند و با درستی آن به اجرای دستورات حلقه می پردازد. اینجا برای حلقه آکولاد وجود دارد پس تمامی دستورات درون بلوک به ترتیب اجرا می شوند.
سطر بعدی هم یک حلقه است یعنی حلقه جاری به ازای تعداد تکرار حلقه اول باید تکرار شود و در هر تکرار از حلقه بالا به تعداد تکرار خود نیز تکرار می شود، شرط آن بررسی شده و با درستی شرط به انجام دستورات حلقه می پردازد. به دلیل عدم وجود آکولاد برای این حلقه، تنها سطر بعدی دستور حلقه داخلی است و تا نقیض شدن شرط حلقه آن سطر اجرا می شود. در این مثال 10 بار حلقه درونی تکرار می شود و با هر بار تکرار فاصله ای بعد از نمایش عدد مورد نظر هم قرار می دهد.
سپس برنامه با اجرای دستور بعدی به خط جدید می رود. از حلقه اول 9 بار تکرار دیگر مانده، پس این رویه تکرار شده تا برنامه کامل گردد. در آخر وقتی i برابر با 11 می شود از حلقه بیرونی خارج شده و برنامه به پایان می رسد.
مثال مهم) قصد داریم با استفاده از حلقه های تکرار تودرتو شکل زیر را ایجاد نماییم :
*****
****
***
**
*
روش کلی کار به این صورت است که به ازای تعداد سطرها به یک حلقه تکرار for بیرونی و به ازای تعداد ستونها به یک حلقه for درونی نیاز داریم. چون از ابتدا به انتها از تعداد ستاره ها کم می شود پس باید حلقه های خود را کاهشی بنویسیم :
1 2 3 4 5 6
| |
for ( int i = 5; i>0 ; i-- )
{
for ( int j = i; j>0 ; j-- )
cout << "*";
cout << "\n";
}
|
با شروع حلقه for اول، برنامه وارد بلوکی می شود که دارای حلقه for دیگری است و دو دستور cout، که اولین دستور مربوط به حلقه درونی است و دومی مربوط به حلقه بیرونی.
متغیر i از 5 شروع شده با هر بار اجرای حلقه یک واحد کاهش میابد. به این دلیل متغیر j را برابر با متغیر i گرفته ایم چون با کاهش i آنهم باید کاهش یابد یعنی در هر بار چرخش حلقه بیرونی (هر سطر ).
در ابتدا i برابر با 5 است و شرط حلقه هم درست است پس وارد دستورات حلقه for بیرونی می شود و به حلقه for درونی برخورد می کند که j برابر با i یعنی 5 است و شرطش هم درست است پس 5 بار ستاره چاپ می کند و با نقیض شدن شرط حلقه (وقتی که j برابر صفر می شود ) از حلقه درونی خارج می شود و ادامه دستورات حلقه for بیرونی را انجام میدهد یعنی یک سطر پایین می رود .
این بار یک واحد از i کم شده و برابر با 4 می شود که باز هم شرط حلقه بیرونی درست است و دستورات آنرا دوباره اجرا می کند. در درون حلقه for درونی j برابر با i یعنی 4 شده و شرطش هم درست است پس اینبار چهار ستاره چاپ می کند و به همان ترتیب قبل دستورات ادامه میابد تا شکل بالا حاصل می شود .
مثال) می خواهیم شکل زیر را با استفاده از دستور حلقه تکرار for تودرتو در برنامه نویسی C++ رسم نماییم :
*
***
*****
*******
*********
***********
*************
***********
*********
*******
*****
***
*
برای رسم این شکل ما ابتدا شکل را به 2 قسمت تقسیم کرده و برای رسم هر قسمت از دستور حلقه تکرار for تودرتو استفاده می کنیم :
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 26 27 28 29 30 31 32 33
| |
for ( int i = 6; i>0 ; i-- )
{
for ( int j = i; j>0 ; j-- )
cout << " ";
for ( j = i; j<6 ; j++ )
cout << "*";
for ( j = i; j<=6 ; j++ )
cout << "*";
for ( int j = i; j>0 ; j-- )
cout << " ";
cout << "\n";
}
for ( i = 6; i>=0 ; i-- )
{
for ( j = i; j<6 ; j++ )
cout << " ";
for ( j = i; j>0 ; j-- )
cout << "*";
for ( j = i; j>=0 ; j-- )
cout << "*";
for ( int j = i; j<6 ; j-- )
cout << " ";
cout << "\n";
}
|
عزیزان اگر کمی دقت کنید و با حوصله کد بالا را بررسی نمایید حتما مطلب را یاد گرفته و با کمی تمرین براحتی می توانند در C++ دستورات حلقه تکرار for تو در توی پیچیده را براحتی حل نمایید .