學習軌道
/
C++
C++
/
練習
/
利息真有趣
利息真有趣

利息真有趣

學習練習

簡介

迴圈

迴圈用來重複執行某段邏輯。 最常見的兩種是 while loop(不確定次數的迴圈)與 for loop(確定次數,也就是計數迴圈)。 另外還有 for each 迴圈,之後的某個概念會再提到。

一般語法

for loop 由一個標頭和一段程式區塊組成,程式區塊裡是用大括號包住的迴圈主體。 標頭由 3 個以分號;分隔的元件組成:初始化敘述、條件,以及另一個運算式。 這三個元件都可以是空的。

for (init_statement; condition; expression) {
  some_statement;
}
  • 初始化敘述這個元件是一段只會在迴圈開始前執行一次的程式碼。
  • 條件這個元件必須是一段會求值為boolean的運算式,用來控制迴圈何時該停止。 只要這個條件的求值結果是true,迴圈內的程式碼就會持續執行。 一旦這個運算式求值為false,迴圈就不會再進行任何疊代。
  • 運算式這個元件是一段會在每次疊代結束時執行的程式碼。

while loop 只要它的條件檢查結果為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 迴圈:範例

_初始化元件_通常用來設定計數變數,_條件_用來檢查迴圈該繼續還是停止,而_後置元件_則通常在每次重複結束時遞增計數器。

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美元:3.213%(餘額會變得更負)。
  • 餘額大於或等於0美元且小於1000美元:0.5%。
  • 餘額大於或等於1000美元且小於5000美元:1.621%。
  • 餘額大於或等於5000美元:2.475%。

這個練習共有四個任務,每個任務都會運用到餘額和它的利率。

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,透過 19 個概念100 個練習 和真人引導來學習並精通 C++,全部免費。