دستور تکرار while
از while برای تکرار یک عمل براساس یک شرط استفاده میشود. شکل کلی while چنین است:
( while( condition
statement
برای تکرار چند دستور باید آنها را با آکولاد محصور کنید.
برای مثالی از دستور while میخواهیم یک رمز ورود را از کاربر دریافت کنیم و تا وقتی که مقدار صحیح (در این مثال 23 فرض شده) یا 1- (برای خاتمه پرسش) را وارد نکرده این عمل را تکرار کنیم:
کد قالب بندی شده:
کد:
#include <iostream>
#include <cstdlib> // system()
using namespace std;
int main()
**
int pass = 0;
cout << "Please enter the password or -1 to exit : ";
cin >> pass;
while (pass != -1 && pass != 23)
**
system("cls"); // clear screen
cout << "Please enter the password or -1 to exit : ";
cin >> pass;
**
return 0;
**
به دستور تکرار، حلقه(loop) هم گفته میشود، چراکه مانند یک حلقه وقتی به آخر آن میرسیم دوباره به اول آن رسیده ایم و تکرار میشود.
اصطلاحاتی که در دستورات تکرار بکار میروند (توجه کنید که مفهوم جدیدی نیستند):
مقدار نگهبان(sentinel)
مقدار ویژه ای است که کاربر برای پایان تکرار(خروج از حلقه) وارد میکند، در مثال قبل این مقدار 1- است.
شمارنده (counter)
اگر یک متغیر صحیح را قبل از حلقه تعریف کنید و آن را در هر تکرار حلقه یک یا چند تا افزایش یاکاهش دهید و در شرط حلقه چک کنید که اگر به مقدار خاصی رسیده باشد حلقه پایان یابد، این متغیر را شمارنده میگویند. مثلاً برای چاپ اعداد زوج کمتر از 100 باید متغیر شمارنده را در هر تکرار حلقه دوتا افزایش دهیم و در شرط حلقه کوچکتر از 100 بودن آنرا چک کنیم.
حلقه بی پایان (endless loop)
حلقه ای است که هیچگاه پایان نیابد، بنابراین برنامه هرگز پایان نمی یابد مگر اینکه کاربر این کار را بکند. در اصل حلقه بی پایان یک مشکل برنامه است که باید از آن اجتناب شود.
دستور break در حلقه ها
قبلاً دستور break را برای خاتمه دادن به یک قسمت case در دستور switch بکار بردیم، در اینجا هم برای خاتمه دادن فوری به یک حلقه از break استفاده میشود، یعنی این دستور موجب میشود برنامه به بیرون حلقه پرش کند. مثلاً دستور while مثال قبل را میتوان اینگونه هم نوشت:
کد قالب بندی شده:
کد:
**
if (pass == -1)
break;
system("cls"); // clear screen
cout << "Please enter the password or -1 to exit : ";
cin >> pass;
**
while (pass != 23)
بنابراین اگر شرط یک حلقه همیشه صحیح باشد نمیتوان نتیجه گرفت که حلقه بی پایان است، چراکه میتوان با break به حلقه پایان داد.
نکته: اگر بخواهیم شرط یک حلقه همیشه صحیح باشد از true بعنوان شرط آن استفاده میکنیم.
نکته: وقتی که از break استفاده میکنیم معمولاً براساس یک شرط خواهد بود که میتوان آنرا در شرط حلقه ادغام کرد و این بهتر است، اما وقتی بخواهیم در قسمتی از حلقه با برقراری یک شرط فوراً حلقه پایان یابد و بقیه آن تا پایان اجرا نشود، باید از break استفاده کنیم.
دستور continue
این دستور که در حلقه ها استفاده میشود، در هرجای حلقه آورده شود دستورات بعد از آن اجرا نمیشوند. معمولاً در یک دستور شرطی در حلقه آورده میشود تا در یک تکرار حلقه دستورات بعد از continue اجرا نشوند. بنابراین برنامه در یک تکرار حلقه هرجا به دستور continue برسد دستورات بعد از آن که در حلقه آمده اند را اجرا نمیکند و تکرار بعدی حلقه را دنبال میکند. یک مثال بهتر عملکرد این دستور را نشان میدهد:
کد قالب بندی شده:
کد:
#include <iostream>
#include <cstdlib> // system()
using namespace std;
int main()
**
int input = 0;
while (true)
**
cout << "If you want to see a message, enter 1; to exit enter -1 : ";
cin >> input;
system("cls");
if (input == -1)
break;
if (input != 1)
continue;
cout << "This is the message.\n";
**
return 0;
**
توضیح
یک مقدار را از کاربر درون input دریافت میکنیم، سپس اگر مقدار آن 1- بود حلقه را خاتمه میدهیم که پس از آن برنامه هم خانمه می یابد، اگر مقدار 1 داشت یک پیغام چاپ میشود وگرنه دستور continue اجرا میشود که موجب اجرا نشدن دستورات بعد از آن میشود که در اینجا دستور cout هست، بنابراین پیغام چاپ نمیشود و تکرار بعدی حلقه دنبال میشود.
دستور تکرار do while
این دستور همان عملکرد while را دارد بجز اینکه یکبار حتماً اجرا میشود. شکل کلی آن:
کد قالب بندی شده:
statement
while( condition );
do
اگر دستورات (بخش statement) بیش از یکی باشند باید در آکولاد محصور شوند.
در اولین مثال برای دستور while، ما باید ابتدا pass را از کاربر میگرفتیم تا وقتی در شرط while استفاده میشود مقدار دریافتی را داشته باشد. اما با دستور do while نیاز به نوشتن دستورات کمتری است:
کد قالب بندی شده:
کد:
#include <iostream>
#include <cstdlib> // system()
using namespace std;
int main()
**
int pass = 0;
do
**
cout << "Please enter the password or -1 to exit : ";
cin >> pass;
system("cls"); // clear screen
** while (pass != -1 && pass != 23);
return 0;
**
همانطور که میبینید نیازی به گرفتن مقدار pass از کاربر قبل از شروع حلقه نیست، چراکه do while ابتدا یکبار اجرا میشود سپس شرط آن چک میشود. برای چنین موقعیت هایی که نیاز داریم یکبار دستورات حلقه در ابتدا و بدون توجه به شرط حلقه اجرا شوند، از do while استفاده میکنیم.
توجه: فراموشی در قرار دادن ; در انتهای قسمت while از دستور do while سبب بروز خطای زمان کامپایل میشود.
علاقه مندی ها (Bookmarks)