Existem basicamente dois tipos de ciclos:
Ambos são possíveis em Julia, embora o segundo seja provavelmente mais comum.
while
Para problemas em aberto, em que o número de repetições do ciclo é desconhecido à partida, Julia tem o ciclo while.
A forma básica é bastante simples:
while condition
do_something()
end
Neste caso, o programa continua a repetir o ciclo até que condition deixe de ser true.
Existem duas formas de sair do ciclo mais cedo:
break faz com que o ciclo termine, e a execução continua na linha seguinte ao end do ciclo.return x interrompe a execução da função atual e devolve o valor x a quem a chamou.Com estas opções disponíveis, por vezes é prático criar um ciclo "infinito" com while true ... end e depois contar com uma condição de paragem dentro do corpo do ciclo para acionar um break ou um return.
O exemplo mais simples é iterar sobre um intervalo.
Se quisermos fazer algo 10 vezes:
for n in 1:10
do_something(n)
end
Se a iteração atual não satisfizer determinada condição, é possível saltar imediatamente para a iteração seguinte com um continue:
for n in 1:10
if is_useless(n)
continue
end
# we decided this iteration could be useful
do_something_slow(n)
end
Numa forma mais curta, o bloco if pode ser substituído por is_useless(n) && continue.
Podes iterar sobre muitos outros tipos de coleção: elementos de um array, carateres de uma string, chaves de um dicionário...
Os exemplos até agora iteram sobre o intervalo 1:10, em que o valor é também o índice do ciclo.
De forma mais geral, podemos precisar do índice e não apenas do valor.
Para isso, usa-se a função eachindex(), por exemplo for i in eachindex(my_array) ... end.
A tua amiga Li Mei tem um bar de sumos onde vende deliciosos sumos de fruta misturada. És um cliente frequente na loja dela e percebeste que podias facilitar a vida à tua amiga. Decides usar as tuas competências de programação para ajudar a Li Mei no seu trabalho.
A Li Mei gosta de dizer aos clientes, com antecedência, quanto tempo têm de esperar por um sumo do menu que encomendaram.
Tem dificuldade em lembrar-se dos números exatos, porque o tempo que cada sumo leva a misturar varia.
O "Pure Strawberry Joy" demora 0,5 minutos, o "Energizer" e o "Green Garden" demoram 1,5 minutos cada, o "Tropical Island" demora 3 minutos e o "All or Nothing" demora 5 minutos.
Para todas as outras bebidas (por exemplo, ofertas especiais) podes assumir um tempo de preparação de 2,5 minutos.
Para ajudares a tua amiga, escreve uma função time_to_mix_juice que recebe um sumo do menu como argumento e devolve o número de minutos que demora a misturar essa bebida.
julia> time_to_mix_juice("Tropical Island")
3
julia> time_to_mix_juice("Berries & Lime")
2.5
Muitas das criações da Li Mei incluem gomos de lima, tanto como ingrediente como para decoração. Por isso, quando começa o turno de manhã, tem de se certificar de que a caixa de gomos de lima está cheia para o resto do dia.
Implementa a função limes_to_cut, que recebe o número de gomos de lima que a Li Mei precisa de cortar e um array que representa as limas inteiras que tem à mão.
Consegue obter 6 gomos de uma lima "small", 8 gomos de uma lima "medium" e 10 de uma lima "large".
Corta sempre as limas pela ordem em que aparecem na lista, começando pelo primeiro item.
Continua até atingir o número de gomos de que precisa ou até ficar sem limas.
A Li Mei gostaria de saber com antecedência quantas limas precisa de cortar.
A função limes_to_cut deve devolver o número de limas a cortar.
julia> limes_to_cut(25, ["small", "small", "large", "medium", "small"])
4
A Li Mei gosta de saber quanto tempo vai demorar a misturar os pedidos pelos quais os clientes estão à espera.
Implementa a função order_times, que recebe uma fila de pedidos e devolve um vetor de tempos de mistura.
julia> order_times(["Energizer", "Tropical Island"])
[1.5, 3.0]
A Li Mei trabalha sempre até às 15 horas. Depois, o empregado dela, o Dmitry, assume o turno. Muitas vezes há bebidas que já foram encomendadas mas que ainda não estão preparadas quando o turno da Li Mei termina. O Dmitry prepara então os sumos que faltam.
Para facilitar a passagem de turno, implementa uma função remaining_orders que recebe o número de minutos que faltam para o turno da Li Mei terminar e um array de sumos que já foram encomendados mas que ainda não estão preparados.
A função deve devolver os pedidos que a Li Mei não consegue começar a preparar antes do fim do seu dia de trabalho.
O tempo que falta para o turno terminar será sempre maior do que 0. O array de sumos a preparar nunca estará vazio. Além disso, os pedidos são preparados pela ordem em que aparecem no array. Se a Li Mei começar a misturar um determinado sumo, acaba-o sempre, mesmo que tenha de trabalhar um pouco mais. Se não houver pedidos restantes de que o Dmitry tenha de tratar, deve ser devolvido um vetor vazio.
julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
Inscreve-te no Exercism para aprenderes e dominares Julia com 35 conceitos128 exercícios, e mentoria humana real, tudo grátis.