轨道
/
Crystal
Crystal
/
练习
/
利息很有趣
利息很有趣

利息很有趣

学习练习

简介

循环是一种控制结构,可以让代码根据给定的条件重复执行。

while循环

while循环是一种控制结构,可以让代码根据给定的条件重复执行。 只要条件为真,while循环中的代码就会继续执行。 当迭代次数事先未知时,通常会用while循环;不过只要需要循环,任何场合都可以用它。

条件会在循环中的代码执行之前先求值,也就是说,如果条件为假,循环中的代码就永远不会执行。

i = 0
while i < 3
  puts i
  i += 1
end

# Output:
# 0
# 1
# 2

如果想迭代一个字符串,可以按照字符串的长度来循环。

str = "Hello"
i = 0
while i < str.size
  puts str[i]
  i += 1
end

# Output:
# H
# e
# l
# l
# o

until循环

until循环的工作方式和while循环相同,只是循环中的代码会一直执行,直到条件为真为止。 这和if与unless之间的区别是一样的。

i = 0
until i == 3
  puts i
  i += 1
end

无限循环

使用while循环时,一个常见的错误是进入“无限循环”,从此再也退不出来。 无限循环可能是由于条件永远不为真也不为假造成的。 这通常是程序员的失误造成的,比如忘记让循环变量自增。 但有时候,无限循环是实现程序逻辑最清晰的方式。 有时候又必须让循环一直运行下去,比如 HTTP 服务器会等待一个连接进来,处理它,然后再等待下一个连接。

break

用break关键字可以提前跳出循环。 当你想在特定条件下提前跳出循环时,它会很方便。

i = 0
while i <= 3
  puts i
  i += 1
  if i == 2
    break
  end
end

# Output:
# 0
# 1

next

用next关键字可以跳到循环的下一次迭代。 当你想跳过循环中的某几次迭代时,它会很方便。

i = 0
while i <= 3
  i += 1
  if i == 2
    next
  end
  puts i
end

# Output:
# 1
# 3

循环中的类型

循环中变量的类型可能会发生变化。 在下面的例子中,a的类型是Int32 | String,因为在循环的前半部分,它既可能是Int32,也可能是String。 变量a只在循环的前半部分具有Int32 | String类型,因为循环开始时它保存的是Int32,而到第二次迭代时,它保存的是String。 这种多类型系统会在后面详细讲解。 不过,由于我们确信循环的后半部分只会保存String,所以在循环的后半部分,a的类型是String。 在运行时,它绝不会同时保存Int32和String。

i = 0
a = 4
while i < 3
  p typeof(a)
  # => Int32 | String
  a = "4"
  p typeof(a)
  # => String
  i += 1
end

在 Crystal 中,方法会返回最后一个表达式的值。 不过,有时候你需要在最后一个表达式之前就返回一个值。 为此,可以使用return关键字,它会返回紧随其后的那个表达式的值。 写在return关键字后面的代码不会被执行。

def speed_limit(road_number)
    if road_number == 1
        return 50
        puts "This will not be executed"
    elsif road_number == 2
        return 80
        puts "This will not be executed"
    end
    100
end

p speed_limit(1) # => 50
p speed_limit(2) # => 80
p speed_limit(3) # => 100
Note

当方法中最后一个表达式就是要返回的值时,应省略return关键字。

说明

在本练习中,你将处理储蓄账户。 每年,储蓄账户的余额都会根据其利率更新。 银行给你的利率取决于你账户里的金额(即余额):

  • 余额为负时,利率为 3.213%(余额会变得更负)。
  • 余额为正且小于1000美元时,利率为 0.5%。
  • 余额为正且大于等于1000美元且小于5000美元时,利率为 1.621%。
  • 余额为正且大于等于5000美元时,利率为 2.475%。

本练习有四个任务,每个任务都会涉及你的余额及其利率。

1. 计算利率

实现方法SavingsAccount.interest_rate(),它接收一个余额作为实参。 该方法应返回给定余额对应的利率。

SavingsAccount.interest_rate(200.75)
# => 0.5

2. 计算利息

实现方法SavingsAccount.interest(),它接收一个余额作为实参。 该方法应返回给定余额对应的利息。

SavingsAccount.interest(200.75)
# => 1.00375

3. 计算年度余额更新

实现方法SavingsAccount.annual_balance_update(),它接收一个余额作为实参。 该方法应返回一年后的余额。

SavingsAccount.annual_balance_update(200.75)
# => 201.75375

4. 计算达到目标余额所需的年数

实现方法SavingsAccount.years_before_desired_balance(),它接收余额和目标余额作为实参。 该方法应返回达到目标余额所需的年数。

balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
Note

计算本金余额的单利时,将余额乘以利率,两者的乘积就是利息金额。

而复利则是定期计息。 每次计息时,先算出利息金额并加到本金余额上,这样后续的利息计算就会基于更大的本金余额。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Crystal Exercism

准备好开始 利息很有趣 了吗?

注册 Exercism,借助 26 个概念142 个练习 和真人导师指导,学习并掌握 Crystal,全部免费。