Na aula passada, demos início ao estudo das estruturas de repetição, que são estruturas de controle de fluxo que permitem a execução de trechos de código de forma repetida e é composta por dois grandes grupos: as estruturas de repetição quantificadas e as estruturas de repetição condicionais. As estruturas de controle quantificadas executam um trecho de código um determinado número de vezes, enquanto as estruturas de repetição condicionais executam um trecho de código dependendo de uma condição.
Nesta aula, abordaremos as estruturas de controle de repetição condicionais, também conhecidas como laços condicionais, que também executam um trecho de código de forma repetida, contudo, a sua execução depende de uma condição.
Para ilustrar a utilidade das estruturas de repetição condicionais, observe a Atividade 9.1.
Crie um script em Ruby que leia um número inteiro repetidas vezes. A repetição deve terminar quando o usuário digitar um número par.
Observe que, nesse caso, não é indicado utilizar uma estrutura de repetição quantificada, pois não é possível determinar, com antecedência, quantas vezes o script deverá solicitar o número para o usuário. Nesse caso, a execução da estrutura depende de uma condição (o usuário digitar um número par), portanto, a estrutura de repetição indicada para esse tipo de situação é a condicional.
Observe o Exemplo de código 1, que ilustra uma solução para a Atividade 9.1.
begin
puts "Digite um número par: "
numero = gets.chomp.to_i
end while numero % 2 != 0
puts "#{numero} é par!"
O while
é uma estrutura de repetição condicional que executa enquanto a condição for verdadeira. Nesse caso, a condição é numero % 2 != 0
, que será falsa quando o usuário digitar um número par. O trecho de código a ser executado repetidamente se localiza entre o begin
(linha 1) e o end
(linha 4).
A linguagem Ruby possui duas estruturas de repetição condicionais que funcionam de forma semelhante: o while
e o until
, que podem ser escritas de três formas diferentes (SOUZA, 2012).
while
A estrutura de repetição while
(enquanto) pode ser escrita de três formas distintas, a primeira delas está ilustrada no Exemplo de código 2.
while condicao
# Trecho de código executado repetidamente
end
O trecho de código a ser executado repetidamente, localizado entre o while
(linha 1) e o end
(linha 3), será executado enquanto a condicao
for verdadeira. Tente resolver o exercício proposto na Atividade 9.2 utilizando o while
.
Crie um script em Ruby que leia um número inteiro repetidas vezes. A repetição deve terminar quando o usuário digitar um número múltiplo de 5.
Observe o Exemplo de código 3, que apresenta uma solução do exercício proposto na Atividade 9.2.
condicao = true
while condicao
puts "Digite um número múltiplo de 5: "
numero = gets.chomp.to_i
if numero % 5 == 0
condicao = false
end
end
puts "#{numero} é múltiplo de 5!"
No Exemplo de código 3, utilizamos a variável condicao
para indicar se o while
deve ser executado ou não. A variável condicao
inicia com o valor true
(linha 1), para que o while
seja executado. Dentro do while
(linhas 3 a 7), o script solicita que o usuário digite um número múltiplo de 5 (linha 3), e o valor é guardado na variável numero
(linha 4). Em seguida, um if
(linha 5) é usado para testar se o valor guardado na variável numero
é, de fato, múltiplo de 5, e caso seja, o valor da variável condicao
é alterado para false
(linha 6) para que o while
pare de executar.
A segunda forma de escrever o while
é aquela apresentada no Exemplo de código 1. A sintaxe dessa segunda forma é apresentada no Exemplo de código 4.
begin
# Código a ser executado repetidamente
end while condicao
A diferença entre essa sintaxe e aquela apresentada anteriormente (Exemplo de código 2) é que, utilizando-o dessa forma, o while
executará pelo menos uma vez, independente da condicao
ser verdadeira ou falsa. Isso ocorre porque a avaliação da condição só ocorre no final (linha 3). Utilizando a sintaxe apresentada no Exemplo de código 2, caso a condição seja falsa no início da execução do while
, ele não executará nenhuma vez.
Para melhor ilustrar a diferença entre as duas formas de escrita do while
, observe e execute o Exemplo de código 5.
condicao = false
while condicao
puts "Executando o primeiro while..."
end
begin
puts "Executando o segundo while..."
end while condicao
Na linha 1, a variável condicao
foi iniciada com false
. Observe que o primeiro while
(linhas 3 a 5) não executa nenhuma iteração pois condicao
é false
. O segundo while
(linhas 7 a 9) executa uma vez mesmo com a variável condicao
sendo false
.
Por fim, o Exemplo de código 6 apresenta a sintaxe da terceira e última forma de se construir o while
.
codigo while condicao
Vale salientar que, usando a sintaxe apresentada no Exemplo de código 6, o trecho de código a ser executado repetidamente se limita a uma única linha de código.
until
A segunda estrutura de repetição condicional disponível em Ruby é o until
(até). Assim como o while
, o until
também possui três formas distintas de se construir. Contudo, diferentemente do while
, o until
irá executar repetidamente enquanto a condição for falsa, e não verdadeira, como ocorre no while
.
Observe a primeira forma de se escrever o until
no Exemplo de código 7.
until condicao
# Trecho de código a ser executado repetidamente
end
Para melhor ilustrar o until
, observe o Exemplo de código 8, que apresenta uma solução para a Atividade 9.2 utilizando o until
ao invés do while
.
condicao = false
until condicao
puts "Digite um número múltiplo de 5: "
numero = gets.chomp.to_i
if numero % 5 == 0
condicao = true
end
end
puts "#{numero} é múltiplo de 5!"
Observe que o Exemplo de código 8 é bem similar ao Exemplo de código 3. Foram feitas apenas algumas mudanças no Exemplo de código 8 para que a solução utilizasse o until
ao invés do while
: na linha 1, o valor da variável condicao
foi alterado para false
para que o until
seja executado; na linha 2, o while
foi substituído pelo until
; na linha 6, a variável condicao
recebe true
para que, quando isso ocorrer, o until
pare de executar.
A segunda forma de se construir o until
é ilustrada no Exemplo de código 9.
begin
# Código a ser executado repetidamente
end until condicao
Observe que a segunda forma, apresentada no Exemplo de código 9, é bem semelhante à estrutura apresentada no Exemplo de código 4 com o while
. A diferença entre elas é que o while
executa enquanto a condição for verdadeira, e o until
executa enquanto a condição for falsa.
Para melhor ilustrar essa segunda forma de construção do until
, observe o Exemplo de código 10, que apresenta uma solução para a Atividade 9.1 utilizando o until
.
begin
puts "Digite um número par: "
numero = gets.chomp.to_i
end until numero % 2 == 0
puts "#{numero} é par!"
Observe que, para resolver o problema proposto na Atividade 9.1 usando o until
, bastaram duas mudanças na linha 4 do Exemplo de código 1: substituir o while
pelo until
e !=
por ==
na condição, pois usando o until
, o laço para de executar quando a condição for verdadeira.
A terceira e última forma de se escrever o until
é a mais simples, pois só permite que uma única linha de código execute repetidamente. Confira a sintaxe dessa terceira forma no Exemplo de código 11.
codigo until condicao
Novamente, a única diferença entre usar o until
ou while
é que, com o while
o código será executado enquanto a condição for verdadeira, e com o until
o código será executado enquanto a condição for falsa.
Vale salientar também que os comandos break
, next
e redo
, apresentados na aula passada, também funcionam com os laços condicionais.
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.