简介
循环
循环用于重复执行某段逻辑。最常见的是 while 循环,通常用于次数不确定的重复,以及 for 循环,通常用于次数明确的重复。还有一种逐元素循环,后续概念会介绍。
基本语法
for 循环由循环头和花括号包围的循环体组成。循环头有三部分,以分号 ; 分隔:初始化语句、条件和另一条表达式。每部分都可以为空。
for (init_statement; condition; expression) {
some_statement;
}
- 初始化语句:在循环开始前执行一次。
- 条件:求值结果可以转换为布尔值,用来决定何时停止。只要为
true就执行循环体;变为false后不再进入下一次循环。 - 表达式:在每次循环结束时执行。
while 在条件为 true 时执行循环体。下面的示例展示了如何把一个 for 循环改写为 while。
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
注意 少用或不用
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。