Para ilustrar a utilidade das estruturas de controle de repetição quantificadas, também conhecidas como laços, iremos usar o exercício proposto na Atividade 8.1. Tente resolver esse exercício com os conhecimentos que você já possui.
Crie um script em Ruby que lê um número inteiro e mostra a tabuada de multiplicação desse número de 1 a 10.
puts "Digite um número: "
numero = gets.chomp.to_i
puts "#{numero} x 1 = #{numero * 1}"
puts "#{numero} x 2 = #{numero * 2}"
puts "#{numero} x 3 = #{numero * 3}"
puts "#{numero} x 4 = #{numero * 4}"
puts "#{numero} x 5 = #{numero * 5}"
puts "#{numero} x 6 = #{numero * 6}"
puts "#{numero} x 7 = #{numero * 7}"
puts "#{numero} x 8 = #{numero * 8}"
puts "#{numero} x 9 = #{numero * 9}"
puts "#{numero} x 10 = #{numero * 10}"
Observe que, para resolver esse problema usando apenas os conhecimentos que temos atualmente, precisamos escrever repetidas vezes uma ação específica: multiplicar o número informado pelo usuário por um outro número (linhas 4 a 13). Para esse problema específico, precisamos realizar essa ação apenas 10 vezes, mas e se o problema exigisse que executássemos a ação 100 vezes? Ou 1000 vezes? Iríamos escrever a mesma linha de código várias vezes? E pior: o problema pode exigir que a ação seja executada um número variável de vezes.
Para resolver problemas como esse, em que ações precisam ser feitas repetidas vezes, é que devemos utilizar as estruturas de controle de repetição quantificadas. Essas estruturas são ditas quantificadas porque elas executam um número determinado de vezes.
A linguagem Ruby possui três estruturas de controle de repetição quantificadas: o for
, o each
e o times
.
for
O for
(para) é uma estrutura de repetição muito comum e presente em quase todas as linguagens de programação. O Exemplo de código 2 ilustra a sintaxe do for
.
for variavel in expressao
# Código a ser executado repetidamente
end
O Exemplo de código 3 ilustra um exemplo de uso do for
.
for i in 1..10
puts "O valor de i é #{i}"
end
Conforme explicamos anteriormente, o for
é uma estrutura de repetição que executa um trecho de código várias vezes. Cada execução do for
é chamada de iteração. Portanto dizemos que um for
que executa 10 vezes possui 10 iterações. Observe, no Exemplo de código 3, que declaramos a variável i
. Essa variável só existe dentro do for
e ela assume um valor entre 1 e 10 a cada iteração. Na primeira execução do for
, o valor de i
é 1; na segunda execução do for
, o valor de i
é 2; na terceira execução do for
, o valor de i
é 3, e assim sucessivamente. O último valor que a variável i
vai receber é 10.
Ao executar o código apresentado no Exemplo de código 3, você deverá observar o resultado abaixo.
O valor de i é 1
O valor de i é 2
O valor de i é 3
O valor de i é 4
O valor de i é 5
O valor de i é 6
O valor de i é 7
O valor de i é 8
O valor de i é 9
O valor de i é 10
Observe que o trecho de código dentro do for
foi executado 10 vezes, e a cada iteração foi apresentado o valor da variável i
.
Resolva o problema proposto na Atividade 8.1 utilizando o for
.
O Exemplo de código 4 ilustra uma solução para o problema proposto na Atividade 8.2.
puts "Digite um número: "
numero = gets.chomp.to_i
for i in 1..10
puts "#{numero} x #{i} = #{numero * i}"
end
Observe, no Exemplo de código 4, que a linha de código que se repetia no Exemplo de código 1 foi usada apenas uma vez dentro do for
. O for
vai se encarregar de executar o que está dentro dele 10 vezes, conforme o intervalo definido na linha 4 (1..10
).
Crie um script em Ruby que leia um número inteiro X e mostre os números pares entre 1 e X.
each
O each
(cada), na realidade, não é uma estrutura de repetição, mas sim um método. Os métodos serão abordados na Unidade II - Programação Orientada a Objetos, mas, como o método each
se assemelha muito e pode ser usado como uma estrutura de repetição, ele será apresentado nessa seção.
O each
se parece muito com o for
, contudo, existem duas formas de se escrever o each
, apresentadas no Exemplo de código 5 e no Exemplo de código 6.
expressao.each do |variavel|
# Trecho de código executado repetidamente
end
expressao.each { |variavel|
# Trecho de código executado repetidamente
}
Não há diferença de comportamento entre as duas formas de construir o each
, portanto, escolha aquela que preferir. O Exemplo de código 7 ilustra um exemplo de uso do each
: uma contagem de 1 a 10.
(1..10).each do |i|
puts "O valor de i é #{i}"
end
Ao executar o Exemplo de código 7, você vai observar uma contagem de 1 a 10, pois esse foi o intervalo definido na linha 1 (1..10
). O Exemplo de código 8 ilustra uma solução da Atividade 8.1 usando o each
.
puts "Digite um número: "
numero = gets.chomp.to_i
(1..10).each do |i|
puts "#{numero} x #{i} = #{numero * i}"
end
Observe que, novamente, não há repetição de linhas de código, pois o each
vai se encarregar de executar a linha 5 repetidamente (10 vezes).
Crie um script em Ruby que leia um número inteiro X e mostre todos os números entre 1 e X que são divisíveis por 3 ou por 5.
times
O times
(vezes) também não é uma estrutura de controle de repetição, mas sim um método da classe Integer, conforme vamos estudar mais à frente, quando estivermos aprendendo sobre Programação Orientada a Objetos. Contudo, o método times
também é muito utilizado para executar trechos de código repetidamente. Assim como o each
, também existem duas formas de se construir o times
. Observe a sintaxe do times no Exemplo de código 9 e no Exemplo de código 10.
expressao.times do
# Trecho de código executado repetidamente
end
expressao.times { |variavel|
# Trecho de código executado repetidamente
}
Uma diferença entre as duas formas de construir o times
é que a primeira forma, ilustrada no Exemplo de código 9, dispensa o uso de uma variável auxiliar. Para ilustrar o exemplo da contagem usando o times
, observe o Exemplo de código 11.
10.times { |i|
puts "O valor de i é #{i}"
}
Ao executar o Exemplo de código 11, você deverá observar o seguinte resultado.
O valor de i é 0
O valor de i é 1
O valor de i é 2
O valor de i é 3
O valor de i é 4
O valor de i é 5
O valor de i é 6
O valor de i é 7
O valor de i é 8
O valor de i é 9
Observe que, diferentemente das estruturas for
e each
, o times
iniciou o valor da variável auxiliar em 0 (zero). Isso ocorre porque, no for
e no each
, nós podemos configurar o valor inicial e final da variável auxiliar, contudo não podemos fazer o mesmo no times
. A variável auxiliar do times
sempre irá começar com o valor 0 (zero).
O Exemplo de código 12 ilustra uma solução da Atividade 8.1 usando o times
.
puts "Digite um número: "
numero = gets.chomp.to_i
11.times { |i|
puts "#{numero} x #{i} = #{numero * i}"
}
Observe, na linha 4, que precisamos usar 11.times
para que o valor da variável auxiliar varie entre 0 e 10. Ao executar o Exemplo de código 12, você deverá observar algo parecido com o seguinte.
Digite um número:
2
2 x 0 = 0
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
2 x 10 = 20
As execuções dos laços podem ser controladas através dos comandos break
, next
e redo
. Cada uma tem uma utilidade específica para controle de execução das estruturas de repetição, conforme será apresentado a seguir (RANGEL, 2014).
break
O comando break
(quebrar/romper) interrompe a execução do laço. O Exemplo de código 13 ilustra um exemplo de uso do comando break
.
for i in 1..10
if i == 7
break
end
puts "O valor de i é #{i}"
end
Observe, no Exemplo de código 13, que o each
está configurado para executar 10 vezes. Dentro do each
há um if
para verificar se o valor da variável i
é igual a 7. Se for, o break
é executado, interrompendo a execução do each
. O resultado da execução do Exemplo de código 13 é apresentado abaixo.
O valor de i é 1
O valor de i é 2
O valor de i é 3
O valor de i é 4
O valor de i é 5
O valor de i é 6
Observe que o laço é executado 6 vezes. Na 7ª execução do laço, na qual o valor de i
é 7, a execução é interrompida com a execução do break
. Vale salientar que, se houverem dois laços aninhados (um laço dentro do outro), o break
irá interromper apenas a execução do laço interno. Observe o Exemplo de código 14, que ilustra esse cenário.
for i in 1..10
puts "i = #{i}"
for j in 1..10
puts "j = #{j}"
if j > 5
break
end
end
end
O código apresentado no Exemplo de código 14 possui dois for
, um externo (no qual a variável auxiliar é i
) e um interno (no qual a variável auxiliar é j
). Quando o break
for executado na linha 6, ele irá interromper apenas a execução do for interno, mas não do externo.
next
O comando next
(próximo) é usado para pular a execução de uma iteração. O Exemplo de código 15 ilustra um exemplo de uso do comando next
.
for i in 1..10
if i == 7
next
end
puts "O valor de i é #{i}"
end
Observe, no Exemplo de código 15, que o for
está configurado para executar 10 vezes. Na 7ª iteração, na qual o valor de i
é 7, o comando next
é executado, interrompendo a execução da 7ª iteração e pulando para a próxima. Abaixo é apresentado o resultado da execução do Exemplo de código 15. Observe a ausência do "O valor de i é 7".
O valor de i é 1
O valor de i é 2
O valor de i é 3
O valor de i é 4
O valor de i é 5
O valor de i é 6
O valor de i é 8
O valor de i é 9
O valor de i é 10
Vale salientar que, quando o comando next
é executado dentro de um laço aninhado (um laço dentro de outro), ele irá pular a iteração apenas do laço interno, assim como ocorre com o break
.
redo
O comando redo
(refazer) reexecuta a iteração atual. Observe o comportamento do redo
no Exemplo de código 16
for i in 1..10
puts "O valor de i é #{i}"
if i == 3
redo
end
end
O for
está configurado para executar 10 vezes (linha 1). Contudo, quando o valor de i
for igual a 3, o redo
será executado (linha 4). Isso fará com que a 3ª iteração seja executada infinitamente. Isso é chamado de loop infinito: um laço que nunca para de executar. Portanto, ao executar o Exemplo de código 16, não espere a execução terminar, apenas feche a janela. Abaixo é apresentado o resultado da execução do Exemplo de código 16.
O valor de i é 1
O valor de i é 2
O valor de i é 3
O valor de i é 3
O valor de i é 3
O valor de i é 3
O valor de i é 3
O valor de i é 3
...
Observe que as duas primeiras iterações são executadas normalmente, e ao chegar na 3ª iteração, o laço for
fica preso num loop infinito.
POINT, T. Ruby Tutorial. Tutorials Point. 2015. Disponivel em: http://www.tutorialspoint.com/ruby/. Acesso em: 12 nov. 2015.
RANGEL, E. Conhecendo Ruby. [S.l.]: Leanpub, 2014.
SOUZA, L. Ruby: aprenda a programar na linguagem mais divertida. 1. ed. São Paulo: Casa do Código, 2012. v. I.