المسارات
/
C++
C++
/
التمارين
/
الفائدة مثيرة للاهتمام
الفائدة مثيرة للاهتمام

الفائدة مثيرة للاهتمام

تمرين تعلّمي

مقدمة

الحلقات

تُستخدم الحلقات لتنفيذ بعض المنطق بشكل متكرر. النوعان الأكثر شيوعًا هما while loop (تكرار غير محدود) و for loop (تكرار محدد أو معدود). وهناك أيضًا حلقة for each، التي ستظهر في مفهوم لاحق.

الصيغة العامة

تتكوّن for loop من ترويسة ومن كتلة كود تحتوي على جسم الحلقة محاطًا بالأقواس المعقوفة. تتكوّن الترويسة من 3 مكوّنات تفصل بينها الفواصل المنقوطة ;: عبارة التهيئة، والشرط، وتعبير آخر. ويمكن أن يكون كل منها فارغًا.

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;
}

فاصل: الزيادة والنقصان

عند العمل مع الحلقات، غالبًا ما نحتاج إلى إضافة 1 أو طرح 1 من متغير عدّاد يتتبع التكرارات. هذا أمر شائع جدًا، حتى إن عمليتي الزيادة والنقصان لهما عاملان خاصان: ++ و --.

وهما يأتيان في صيغة 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 في حده الأدنى أو مُتجنَّبًا تمامًا. فكلتا الكلمتين المفتاحيتين تتخطيان أجزاء معينة من الكود، مما يجعل متابعته أصعب في كثير من الأحيان.

التعليمات

في هذا التمرين، ستعمل مع حسابات التوفير. في كل سنة، يُحدَّث رصيد حساب التوفير الخاص بك بناءً على سعر الفائدة. ويعتمد سعر الفائدة الذي يمنحك إياه البنك على مقدار المال الموجود في حسابك (أي رصيده):

  • 3.213% لرصيد أقل من 0 دولار (يصبح الرصيد أكثر سلبية).
  • 0.5% لرصيد أكبر من أو يساوي 0 دولار، وأقل من 1000 دولار.
  • 1.621% لرصيد أكبر من أو يساوي 1000 دولار، وأقل من 5000 دولار.
  • 2.475% لرصيد أكبر من أو يساوي 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 تمرين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.