مسیرها
/
C++
C++
/
تمرین‌ها
/
بهره جالب است
بهره جالب است

بهره جالب است

تمرین یادگیری

مقدمه

حلقه

از حلقه‌ها برای اجرای مکرر بخشی از منطق استفاده می‌شود. دو نوع رایج‌ترین آن‌ها while loop (تکرار نامعین) و for loop (تکرار معین یا شمارشی) هستند. حلقه‌ی for each هم وجود دارد که در مفهوم بعدی به آن می‌پردازیم.

نحوه‌ی نگارش کلی

for loop از یک سرآیند و یک بلوک کد تشکیل می‌شود که بدنه‌ی حلقه را در آکولادها در بر می‌گیرد. سرآیند از ۳ بخش تشکیل می‌شود که با نقطه‌ویرگول ; از هم جدا می‌شوند: دستور اولیه، شرط و یک عبارت دیگر. هر کدام از این‌ها می‌تواند خالی باشد.

for (init_statement; condition; expression) {
  some_statement;
}
  • بخش init_statement کدی است که فقط یک بار، پیش از شروع حلقه، اجرا می‌شود.
  • بخش condition باید عبارتی باشد که به یک boolean ارزیابی می‌شود و تعیین می‌کند حلقه چه زمانی باید متوقف شود. کد داخل حلقه تا زمانی که این شرط به true ارزیابی شود، اجرا خواهد شد. به‌محض اینکه این عبارت به false ارزیابی شود، دیگر هیچ تکرار دیگری از حلقه اجرا نمی‌شود.
  • بخش expression کدی است که در پایان هر تکرار اجرا می‌شود.

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

حلقه‌های For: یک مثال

معمولاً init component یک متغیر شمارنده را مقداردهی می‌کند، condition بررسی می‌کند که حلقه باید ادامه یابد یا متوقف شود، و post component معمولاً شمارنده را در پایان هر تکرار افزایش می‌دهد.

int sum{0};
for (int i{1}; i < 10; ++i) {
  sum += i;
}

این حلقه اعداد از 1 تا 9 را با هم جمع می‌کند (شامل خود 9).

break و continue

داخل بدنه‌ی حلقه، می‌توانید از کلیدواژه‌ی 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
Note

وقتی استفاده از break و continue به کمترین حد رسیده باشد یا کاملاً کنار گذاشته شود، معمولاً درک منطق حلقه آسان‌تر است. هر دو کلیدواژه بخش‌هایی از کد را رد می‌کنند و اغلب دنبال کردن کد را دشوارتر می‌کنند.

دستورالعمل‌ها

در این تمرین با حساب‌های پس‌انداز کار می‌کنید. هر سال، موجودی حساب پس‌اندازتان بر اساس نرخ سود آن به‌روزرسانی می‌شود. نرخ سودی که بانک به شما می‌دهد به مقدار پول موجود در حساب شما (یعنی موجودی آن) بستگی دارد:

  • ۳٫۲۱۳٪ برای موجودی کمتر از 0 دلار (موجودی منفی‌تر می‌شود).
  • ۰٫۵٪ برای موجودی بزرگ‌تر یا مساوی 0 دلار و کمتر از 1000 دلار.
  • ۱٫۶۲۱٪ برای موجودی بزرگ‌تر یا مساوی 1000 دلار و کمتر از 5000 دلار.
  • ۲٫۴۷۵٪ برای موجودی بزرگ‌تر یا مساوی 5000 دلار.

چهار وظیفه دارید که هر یک به موجودی و نرخ سود آن می‌پردازد.

1. محاسبه‌ی نرخ سود

تابع interest_rate را پیاده‌سازی کنید تا نرخ سود را بر اساس موجودی داده‌شده محاسبه کند:

interest_rate(200.75);
// => 0.5

2. محاسبه‌ی سود

تابع yearly_interest را پیاده‌سازی کنید تا سود را بر اساس موجودی داده‌شده محاسبه کند:

yearly_interest(200.75):
// => 1.003750

3. محاسبه‌ی به‌روزرسانی سالانه‌ی موجودی

تابع annual_balance_update را پیاده‌سازی کنید تا به‌روزرسانی سالانه‌ی موجودی را با در نظر گرفتن نرخ سود محاسبه کند:

annual_balance_update(200.75);
// => 201.75375

4. محاسبه‌ی تعداد سال‌های لازم برای رسیدن به موجودی مطلوب

تابع years_until_desired_balance را پیاده‌سازی کنید تا کمترین تعداد سال لازم برای رسیدن به موجودی مطلوب را محاسبه کند، با در نظر گرفتن این که هر سال سود به موجودی اضافه می‌شود. یعنی موجودی پس از یک سال برابر است با: موجودی آغازین + سود موجودی آغازین. موجودی پس از سال دوم برابر است با موجودی پس از یک سال + سود موجودی پس از یک سال. و به همین ترتیب، تا وقتی که موجودی سال جاری بزرگ‌تر یا مساوی موجودی هدف شود.

double balance {200.75};
double targetBalance {214.88};
years_until_desired_balance(balance, targetBalance)
// => 14

توجه کنید که مقدار برگردانده‌شده از نوع int است.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
C++ Exercism

آماده‌اید بهره جالب است را شروع کنید؟

در Exercism ثبت‌نام کنید تا C++ را همراه با 19 مفهوم100 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.