تُستخدم الحلقات لتنفيذ بعض المنطق بشكل متكرر.
النوعان الأكثر شيوعًا هما while loop (تكرار غير محدود) و for loop (تكرار محدد أو معدود).
وهناك أيضًا حلقة for each، التي ستظهر في مفهوم لاحق.
تتكوّن for loop من ترويسة ومن كتلة كود تحتوي على جسم الحلقة محاطًا بالأقواس المعقوفة.
تتكوّن الترويسة من 3 مكوّنات تفصل بينها الفواصل المنقوطة ;: عبارة التهيئة، والشرط، وتعبير آخر.
ويمكن أن يكون كل منها فارغًا.
for (init_statement; condition; expression) {
some_statement;
}
boolean ويتحكم في الوقت الذي ينبغي أن تتوقف فيه الحلقة.
سيُنفَّذ الكود داخل الحلقة طالما أن هذا الشرط يُقيَّم إلى true.
وبمجرد أن يُقيَّم هذا التعبير إلى false، لن تُنفَّذ أي تكرارات أخرى للحلقة.تُنفِّذ 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
عادةً ما يكون فهم منطق الحلقة أسهل عندما يكون استخدام 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.
سجّل في Exercism لتتعلّم وتتقن C++ عبر 19 مفهومًا100 تمرين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.