Um ciclo é uma estrutura de controlo que permite executar código repetidamente com base numa determinada condição.
Um ciclo while é uma estrutura de controlo que permite executar código repetidamente com base numa determinada condição. O código dentro de um ciclo while continua a ser executado enquanto a condição for avaliada como verdadeira. Os ciclos while são frequentemente usados quando o número de iterações é desconhecido à partida; no entanto, podem ser usados em qualquer situação em que seja necessário um ciclo.
A condição é avaliada antes de o código dentro do ciclo ser executado. Isto significa que, se a condição for falsa, o código dentro do ciclo nunca será executado.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Quando queres iterar sobre uma string, podes percorrer o comprimento da string.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
Os ciclos until funcionam da mesma forma que os ciclos while, exceto que o código dentro do ciclo continua a ser executado até a condição ser avaliada como verdadeira.
É a mesma diferença que existe entre if e unless.
i = 0
until i == 3
puts i
i += 1
end
Um erro comum com os ciclos while é entrar num "ciclo infinito", que nunca termina. Um ciclo infinito pode ser causado por uma condição que nunca é avaliada como verdadeira nem como falsa. Isto deve-se muitas vezes a um erro do programador; por exemplo, esquecer-se de incrementar a variável do ciclo. Mas, por vezes, um ciclo infinito é a forma mais clara de implementar a lógica do programa. Ou então é vital repetir indefinidamente; por exemplo, um servidor HTTP espera por uma ligação de entrada, trata-a e depois espera pela ligação seguinte.
A palavra-chave break pode ser usada para sair de um ciclo mais cedo.
Isto pode ser útil quando queres sair de um ciclo mais cedo em determinadas condições.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
A palavra-chave next pode ser usada para saltar para a iteração seguinte de um ciclo.
Isto pode ser útil quando queres saltar iterações específicas de um ciclo.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
O tipo da variável pode ser diferente durante os ciclos.
No exemplo seguinte, o tipo de a é Int32 | String, porque pode ser Int32 ou String na primeira parte do ciclo.
A variável a só terá o tipo Int32 | String na primeira parte do ciclo, uma vez que, quando o ciclo começa, contém Int32 e, na segunda iteração, contém uma String.
Este sistema de tipos múltiplos será explicado em detalhe mais adiante.
Mas, como temos a certeza de que a segunda parte do ciclo só conterá String, o tipo de a é String na segunda parte do ciclo.
Em tempo de execução, nunca conterá Int32 e String em simultâneo.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
Em Crystal, a última expressão de um método devolve o seu valor.
No entanto, por vezes precisas de devolver um valor antes da última expressão.
Para isso, podes usar a palavra-chave return, que devolve o valor da expressão seguinte.
O código escrito depois de uma palavra-chave return não é executado.
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
A palavra-chave return deve ser omitida quando a última expressão de um método é o valor que deve ser devolvido.
Neste exercício vais trabalhar com contas poupança. Todos os anos, o saldo da tua conta poupança é atualizado com base na taxa de juro. A taxa de juro que o teu banco te dá depende da quantidade de dinheiro na tua conta (o seu saldo):
1000 dólares.1000 dólares e inferior a 5000 dólares.5000 dólares.Tens quatro tarefas, cada uma delas relacionada com o teu saldo e a sua taxa de juro.
Implementa o método SavingsAccount.interest_rate(), que recebe um saldo como argumento.
O método deve devolver a taxa de juro para o saldo indicado.
SavingsAccount.interest_rate(200.75)
# => 0.5
Implementa o método SavingsAccount.interest(), que recebe um saldo como argumento.
O método deve devolver o juro para o saldo indicado.
SavingsAccount.interest(200.75)
# => 1.00375
Implementa o método SavingsAccount.annual_balance_update(), que recebe um saldo como argumento.
O método deve devolver o saldo ao fim de um ano.
SavingsAccount.annual_balance_update(200.75)
# => 201.75375
Implementa o método SavingsAccount.years_before_desired_balance(), que recebe um saldo e um saldo objetivo como argumentos.
O método deve devolver o número de anos necessários para atingir o saldo objetivo.
balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
Quando aplicas juro simples a um saldo principal, o saldo é multiplicado pela taxa de juro e o produto dos dois é o valor do juro.
O juro composto, por outro lado, é aplicado de forma recorrente. Em cada aplicação, o valor do juro é calculado e adicionado ao saldo principal, para que os cálculos de juro seguintes incidam sobre um saldo principal maior.
Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.