Aula 09 - Estruturas de Controle de Repetição Condicionais

Introdução

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.

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!"
  

Exemplo de código 1 - Solução da Atividade 9.1

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).

Estruturas de repetição condicionais em Ruby

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).

Estrutura de repetição: 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
  

Exemplo de código 2 - Sintaxe do while

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.

Atividade 9.2

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!"
  

Exemplo de código 3 - Solução da Atividade 9.2

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
  

Exemplo de código 4 - Sintaxe do while

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
  

Exemplo de código 5 - Diferenças entre as duas formas de escrever o while

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
  

Exemplo de código 6 - Sintaxe do while

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.

Estrutura de repetição: 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
  

Exemplo de código 7 - Sintaxe do until

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!"
  

Exemplo de código 8 - Solução da Atividade 9.2 com o until

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
  

Exemplo de código 9 - Sintaxe do until

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!"
  

Exemplo de código 10 - Solução da Atividade 9.1 com o until

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
  

Exemplo de código 11 - Sintaxe do until

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.

Referências

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.