ループは、ある処理を繰り返し実行するために使います。
よく使われるのは、while loop(回数が決まっていないループ)とfor loop(回数が決まっている、カウントするループ)の2つです。
さらに、あとで別の概念で登場するfor eachループというものもあります。
for loopは、ヘッダーと、ループの本体を波括弧で囲んだブロックから成ります。
ヘッダーは、セミコロン;で区切られた3つの要素から成ります。初期化文、条件、そしてもう1つの式です。
これらはそれぞれ空でもかまいません。
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を引いたりすることがよくあります。
これはあまりに一般的なので、インクリメントとデクリメントには専用の演算子++と--が用意されています。
これらには前置と後置の形があります。 前置は、文の中で変数を使う前に値を変え、後置は使ったあとに変えます。 ほとんどの場面では、前置を使いたくなるはずです。
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ドル未満の場合は3.213%(残高はさらにマイナスになります)。0ドル以上1000ドル未満の場合は0.5%。1000ドル以上5000ドル未満の場合は1.621%。5000ドル以上の場合は2.475%。タスクは4つあり、それぞれで残高とその利率を扱います。
指定された残高に基づいて利率を計算する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関数を実装します。
このとき、毎年、利息が残高に加算されることを考慮します。
つまり、1年後の残高は「開始時の残高+開始時の残高に対する利息」です。
2年後の残高は「1年後の残高+1年後の残高に対する利息」です。
これを、その年の残高が目標の残高以上になるまで繰り返します。
double balance {200.75};
double targetBalance {214.88};
years_until_desired_balance(balance, targetBalance)
// => 14
戻り値はintであることに注意してください。