循环用于重复执行某些逻辑。
最常见的两种是 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
_初始化部分_通常用来设置一个计数变量,_条件部分_检查循环应该继续还是停止,_后置部分_则在每次重复结束时对计数器自增。
int sum{0};
for (int i{1}; i < 10; ++i) {
sum += i;
}
这个循环会把从 1 到 9 的数字相加(包括 9)。
在循环体内部,可以用 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%。本练习共有四个任务,每个任务都涉及余额及其利率。
实现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类型。