از حلقهها برای اجرای مکرر بخشی از منطق استفاده میشود.
دو نوع رایجترین آنها while loop (تکرار نامعین) و for loop (تکرار معین یا شمارشی) هستند.
حلقهی for each هم وجود دارد که در مفهوم بعدی به آن میپردازیم.
for loop از یک سرآیند و یک بلوک کد تشکیل میشود که بدنهی حلقه را در آکولادها در بر میگیرد.
سرآیند از ۳ بخش تشکیل میشود که با نقطهویرگول ; از هم جدا میشوند: دستور اولیه، شرط و یک عبارت دیگر.
هر کدام از اینها میتواند خالی باشد.
for (init_statement; condition; expression) {
some_statement;
}
boolean ارزیابی میشود و تعیین میکند حلقه چه زمانی باید متوقف شود.
کد داخل حلقه تا زمانی که این شرط به true ارزیابی شود، اجرا خواهد شد.
بهمحض اینکه این عبارت به false ارزیابی شود، دیگر هیچ تکرار دیگری از حلقه اجرا نمیشود.while loop تا زمانی بدنهاش را اجرا میکند که بررسی condition آن true باشد.
قطعهکد زیر نشان میدهد چگونه یک for را به یک while loop تبدیل کنید.
init_statement;
while(condition) {
some_statement;
expression;
}
هنگام کار با حلقهها، اغلب لازم است به یک متغیر شمارنده که تعداد تکرارها را دنبال میکند، ۱ افزوده یا از آن ۱ کم شود.
این کار آنقدر رایج است که برای عملهای افزایش/کاهش، عملگرهای ویژهای وجود دارد: ++ و --.
این عملگرها دو شکل prefix و postfix دارند. شکل prefix متغیر را پیش از استفاده در دستور تغییر میدهد و شکل postfix آن را پس از آن. احتمالاً در بیشتر مواقع شکل prefix را میخواهید.
int a{3};
int b{--a};
// b is 2, a is now 2
int c{a++};
// c is 2, a is now 3
معمولاً init component یک متغیر شمارنده را مقداردهی میکند، condition بررسی میکند که حلقه باید ادامه یابد یا متوقف شود، و post component معمولاً شمارنده را در پایان هر تکرار افزایش میدهد.
int sum{0};
for (int i{1}; i < 10; ++i) {
sum += i;
}
این حلقه اعداد از 1 تا 9 را با هم جمع میکند (شامل خود 9).
داخل بدنهی حلقه، میتوانید از کلیدواژهی break استفاده کنید تا اجرای حلقه را کاملاً متوقف کنید:
int sum{2};
while(true) {
sum *= 2;
if (sum > 1000)
break;
}
// sum is now 1024
در مقابل، کلیدواژهی continue فقط اجرای تکرار جاری را متوقف میکند و با تکرار بعدی ادامه میدهد:
int equal_sum{0};
for (int i{1}; i < 7; ++i) {
if (i%2 == 1) {
continue;
}
equal_sum += i;
}
// equal_sum is now 12
وقتی استفاده از break و continue به کمترین حد رسیده باشد یا کاملاً کنار گذاشته شود، معمولاً درک منطق حلقه آسانتر است.
هر دو کلیدواژه بخشهایی از کد را رد میکنند و اغلب دنبال کردن کد را دشوارتر میکنند.
در این تمرین با حسابهای پسانداز کار میکنید. هر سال، موجودی حساب پساندازتان بر اساس نرخ سود آن بهروزرسانی میشود. نرخ سودی که بانک به شما میدهد به مقدار پول موجود در حساب شما (یعنی موجودی آن) بستگی دارد:
0 دلار (موجودی منفیتر میشود).0 دلار و کمتر از 1000 دلار.1000 دلار و کمتر از 5000 دلار.5000 دلار.چهار وظیفه دارید که هر یک به موجودی و نرخ سود آن میپردازد.
تابع interest_rate را پیادهسازی کنید تا نرخ سود را بر اساس موجودی دادهشده محاسبه کند:
interest_rate(200.75);
// => 0.5
تابع yearly_interest را پیادهسازی کنید تا سود را بر اساس موجودی دادهشده محاسبه کند:
yearly_interest(200.75):
// => 1.003750
تابع annual_balance_update را پیادهسازی کنید تا بهروزرسانی سالانهی موجودی را با در نظر گرفتن نرخ سود محاسبه کند:
annual_balance_update(200.75);
// => 201.75375
تابع years_until_desired_balance را پیادهسازی کنید تا کمترین تعداد سال لازم برای رسیدن به موجودی مطلوب را محاسبه کند، با در نظر گرفتن این که هر سال سود به موجودی اضافه میشود.
یعنی موجودی پس از یک سال برابر است با: موجودی آغازین + سود موجودی آغازین.
موجودی پس از سال دوم برابر است با موجودی پس از یک سال + سود موجودی پس از یک سال.
و به همین ترتیب، تا وقتی که موجودی سال جاری بزرگتر یا مساوی موجودی هدف شود.
double balance {200.75};
double targetBalance {214.88};
years_until_desired_balance(balance, targetBalance)
// => 14
توجه کنید که مقدار برگرداندهشده از نوع int است.