Aula 07 - Estruturas de controle de fluxo condicionais

Introdução

Daremos início ao estudo das estruturas de controle de fluxo, que são comandos e instruções que nos permitem controlar como a execução do código será realizada. Os códigos que produzimos até o presente momento não incluíram nenhuma estrutura de controle de fluxo, e, portanto, a execução deles é simplesmente linear, ou seja, inicia na primeira linha, segue a execução das linhas seguintes e termina na última, sem nenhum trecho de código condicional ou repetição.

Nesta aula, iremos estudar apenas uma categoria das estruturas de controle de fluxo: as estruturas condicionais. Essas estruturas permitem que trechos de código sejam executados dependendo de uma condição (expressão lógica). Essa condição normalmente é construída utilizando operadores lógicos e relacionais.

Para ilustrar como funciona uma das estruturas de controle de fluxo condicionais, vamos usar um exemplo do cotidiano: uma receita de brigadeiro adaptada do site Como Fazer Brigadeiro (http://www.comofazerbrigadeiro.com.br). Confira a receita abaixo.

  1. Aqueça a panela em fogo médio;
  2. Acrescente 1 colher de sopa de manteiga;
  3. Acrescente todo o leite condensado;
  4. Se desejar fazer brigadeiro de chocolate, acrescente 4 colheres de sopa de chocolate em pó;
  5. Mexa sem parar até que o brigadeiro esteja desgrudando da panela;
  6. Unte um recipiente na qual a mistura será despejada;
  7. Molde os brigadeiros com as mãos, passando-os no chocolate granulado.

Observe que a receita é uma sequência simples de instruções, mas o passo 4 é uma estrutura de controle condicional, pois você só irá acrescentar 4 colheres de sopa de chocolate em pó se desejar fazer brigadeiro de chocolate. Numa linguagem de programação, essa estrutura poderia ser reescrita da seguinte forma.

  
    se desejar fazer brigadeiro de chocolate
      acrescente 4 colheres de sopa de chocolate em pó
    fim
  

Observe que, na primeira linha, escrevemos a condição (se desejar fazer brigadeiro de chocolate), e, na segunda linha, escrevemos a instrução que deverá ser "executada" apenas se a condição da primeira linha for verdadeira. Na última linha escrevemos "fim" para marcar o fim da estrutura condicional. Observe que a estrutura condicional segue o formato apresentado abaixo.

  
    se <condição>
      <instruções a serem executadas caso a condição seja verdadeira>
    fim
  

Um outro detalhe a ser observado nos exemplos de código acima é o espaçamento dado antes da segunda linha, de forma que a linha de código fica deslocada para a direita. Essa técnica é chamada de indentação de código e visa melhorar a legibilidade, ou seja, a facilidade de leitura e compreensão.

A indentação permite identificar visualmente que um trecho de código está dentro de uma estrutura. Nos exemplos apresentados anteriormente, é possível identificar que a segunda linha está dentro da estrutura do "se". Vale salientar, contudo, que a indentação de código é opcional em Ruby, portanto, seu código terá o mesmo comportamento se você usar a indentação ou não. Contudo, indentar seu código é altamente recomendado, tendo em vista que essa técnica melhora muito a facilidade de leitura, especialmente em scripts complexos e longos.

Estruturas de Controle Condicionais em Ruby

Estruturas condicionais: if e else

A primeira estrutura condicional que vamos estudar é o if, que significa "se" em inglês. Na linguagem Ruby, o if é construído conforme a sintaxe ilustrada no Exemplo de código 1.

  
    if condicao
      # trecho de código a ser executado quando a condição for verdadeira
    end
  

Exemplo de código 1 - Sintaxe do if

Vale salientar que devemos sempre substituir o código que aparece entre < e > pelo que desejamos. Confira o [Exemplo de código 02](#aula07-codigo02) que ilustra um exemplo de uso do if.

  
    puts "Digite a sua idade:"
    idade = gets.chomp.to_i

    if idade >= 18
      puts "Você é maior de idade!"
    end
  

Exemplo de código 2 - Exemplo de uso do if

Na linha 4 do Exemplo de código 2 escrevemos a instrução if seguida da condição idade >= 18. A linha 5 só será executada caso essa condição seja verdadeira, ou seja, caso o valor da variável idade seja maior ou igual a 18. Na linha 6 escrevemos a instrução end que marca o fim da estrutura condicional. Caso seja dada uma idade inferior a 18 anos, a execução do código irá literalmente pular a linha 5.

Atividade 7.1

Crie um script em Ruby, digite o código apresentado no Exemplo de código 2 e execute-o.

Ao realizar a Atividade 7.1, você deve ter percebido que, ao digitar uma idade inferior a 18 anos, o script não apresenta resposta. Idealmente ele deveria apresentar uma mensagem informando que o usuário é menor de idade. Para fazer isso, vamos utilizar uma outra instrução chamada else, que significa "senão" em inglês. Confira a sintaxe do else no Exemplo de código 3.

  
    if condicao
      # trecho de código a ser executado quando a condição for verdadeira
    else
      # trecho de código a ser executado quando a condição for falsa
    end
  

Exemplo de código 3 - Sintaxe do else

O primeiro trecho de código será executado quando a condição for verdadeira e o segundo será executado quando a condição for falsa. Vale salientar que o else só pode ser usado acompanhado de um if, porque o else depende da condição do if. Agora, confira o Exemplo de código 4, que ilustra o exemplo apresentado anteriormente usando o else.

  
    puts "Digite a sua idade:"
    idade = gets.chomp.to_i

    if idade >= 18
      puts "Você é maior de idade!"
    else
      puts "Você é menor de idade!"
    end
  

Exemplo de código 4 - Exemplo da maioridade usando o else

No Exemplo de código 4, se atribuirmos uma idade inferior a 18 à variável idade, o script irá apresentar a mensagem "Você é maior de idade!", caso contrário, o script irá apresentar "Você é menor de idade!". Observe que as duas mensagens nunca serão apresentadas ao mesmo tempo, porque a condição só pode dar um resultado lógico: verdadeiro ou falso.

Observe novamente que a indentação de código nos permite identificar facilmente que o comando puts (linha 5) está dentro da estrutura do if e, portanto, só será executado se a condição for verdadeira. Além disso, é fácil ver que o outro puts (linha 7) está dentro da estrutura do else, e, portanto, será executado quando a condição for falsa.

Atividade 7.2

Crie um script em Ruby que permita que o usuário digite um número inteiro e verifique se esse número é par ou ímpar.

Uma forma mais simples de escrever o if é ilustrada Exemplo de código 5.

  
    trecho_de_codigo if condicao
  

Exemplo de código 5 - Sintaxe do if inline

Apesar da estrutura simplificada, o funcionamento permanece o mesmo: o trecho de código só será executado se a condição for verdadeira. Observe um exemplo de uso no Exemplo de código 6.

  
    puts "Digite a sua idade:"
    idade = gets.chomp.to_i

    puts "Você é maior de idade!" if idade >= 18
  

Exemplo de código 6 - Exemplo de uso com if inline

Estrutura Condicional: elsif

Outra estrutura de controle condicional é o elsif, que é uma combinação de um if com um else. Para melhor ilustrar a utilidade do elsif, tente resolver o exercício proposto na Atividade 7.3.

Atividade 7.3

Crie um script em Ruby que permita que o usuário digite uma nota de 0 a 100 (número inteiro) e calcule o conceito relativo à nota. Se a nota for entre 0 e 20, o conceito é "E"; entre 21 e 40, conceito "D"; entre 41 e 60, conceito "C"; entre 61 e 80, conceito "B"; entre 81 e 100, conceito "A".

Uma das soluções possíveis para o exercício proposto na Atividade 7.3 é o código ilustrado no Exemplo de código 7.

  
    puts "Digite uma nota de 0 a 100:"
    nota = gets.chomp.to_i

    if nota < 0 or nota > 100
      puts "Nota inválida! Digite uma nota entre 0 e 100!"
    else
      if nota <= 20
        puts "Conceito E"
      else
        if nota <= 40
          puts "Conceito D"
        else
          if nota <= 60
            puts "Conceito C"
          else
            if nota <= 80
              puts "Conceito B"
            else
              puts "Conceito A"
            end
          end
        end
      end
    end
  

Exemplo de código 7 - Solução da Atividade 7.3

Observe, no Exemplo de código 7, que o código se desloca para a direita por causa da indentação. Uma opção para melhorar a legibilidade é usar o elsif, conforme ilustra o Exemplo de código 8.

  
    puts "Digite uma nota de 0 a 100:"
    nota = gets.chomp.to_i

    if nota < 0 or nota > 100
      puts "Nota inválida! Digite uma nota entre 0 e 100!"
    elsif nota <= 20
      puts "Conceito E"
    elsif nota <= 40
      puts "Conceito D"
    elsif nota <= 60
      puts "Conceito C"
    elsif nota <= 80
      puts "Conceito B"
    else
      puts "Conceito A"
    end
  

Exemplo de código 8 - Exemplo de uso do elsif

Observe que o código ficou mais curto pois com o uso do elsif foi possível eliminar a repetição de vários if e else.

Atividade 7.4

Crie um script em Ruby, digite o código apresentado no Exemplo de código 8 e execute-o.

A construção do elsif sempre segue o formato apresentado no Exemplo de código 9.

  
    if condicao_1
      # trecho código a ser executado quando a condição_1 for verdadeira
    elsif condicao_2
      # trecho de código a ser executado quando a condição_2 for verdadeira
    elsif condicao_3
      # trecho de código a ser executado quando a condição_3 for verdadeira
    end
  

Exemplo de código 9 - Sintaxe do elsif

Atividade 7.5

Crie um script em Ruby que calcule o IMC (Índice de Massa Corporal) de uma pessoa. O script deve ler dois números reais. O primeiro número é o peso de uma pessoa em Kg, e o segundo é a altura de uma pessoa em metros. A fórmula para calcular o IMC é a seguinte:

IMC = peso / altura²

  • Se o IMC for abaixo de 17: apresentar "Muito abaixo do peso";
  • Se o IMC for entre 17 e 18,49: apresentar "Abaixo do peso";
  • Se o IMC for entre 18,5 e 24,99: apresentar "Peso normal";
  • Se o IMC for entre 25 e 29,99: apresentar "Um pouco acima do peso";
  • Se o IMC for entre 30 e 34,99: apresentar "Obeso";
  • Se o IMC for entre 35 e 39,99: apresentar "Obesidade severa".

Estrutura condicional: unless

O unless, que em inglês significa "a menos que", tem um comportamento inverso ao do if. O trecho de código abaixo do if é executado quando a condição é verdadeira. O trecho de código abaixo do unless é executado quando a condição for falsa. Observe a sintaxe do unless no Exemplo de código 10.

  
    unless condicao
      # trecho de código a ser executado quando a condição for falsa
    end
  

Exemplo de código 10 - Sintaxe do unless

No Exemplo de código 10, o trecho de código da linha 2 só será executado quando a condição do unless for falsa. Para exemplificar o uso do unless, vamos usar um método chamado empty?. O método empty? é executado sobre uma variável que guarda uma string e verifica se ela está vazia ou não, portanto, seria o equivalente a testar variavel == "". Esse método retorna true quando a string está vazia, e false caso contrário.

  
    puts "Digite o seu nome:"
    nome = gets.chomp

    if nome.empty?
      puts "Você não digitou seu nome."
    end
  

Exemplo de código 11 - Exemplo de uso do empty?

O Exemplo de código 11 permite que o usuário digite o seu nome (string), que será guardado na variável nome. Em seguida, o script verifica, usando o método empty?, se o usuário de fato digitou algo. Mas, e se quiséssemos executar um trecho de código apenas quando o usuário digitar algo? É nesse tipo de situação que o unless pode ser útil, conforme ilustra Exemplo de código 12.

  
    puts "Digite o seu nome:"
    nome = gets.chomp

    unless nome.empty?
      puts "Olá #{noem} Seja bem-vindo(a)!"
    end
  

Exemplo de código 12 - Exemplo de uso do unless

É claro que, ao invés de ter usado o unless, nós poderíamos ter usado apenas if nome != "" na condição da linha 4, mas a intenção aqui era apenas ilustrar um exemplo do unless.

Atividade 7.6

Crie um script em Ruby, digite o código apresentado no Exemplo de código 12 e execute-o.

Assim como o if, o unless também tem uma forma mais simples de ser escrita, conforme ilustra o Exemplo de código 13.

  
    trecho_de_codigo unless condicao
  

Exemplo de código 13 - Sintaxe do unless inline

O trecho de código só será executado caso a condição seja falsa. Observe um exemplo de uso do unless inline no Exemplo de código 14.

  
    trecho_de_codigo unless condicao
  

Exemplo de código 14 - Exemplo de uso do unless inline

Estrutura condicional: case

O case é uma estrutura condicional interessante que nos permite substituir vários testes com if. Observe a sintaxe do case no Exemplo de código 15.

  
    case variavel
      when valor1
        # trecho de código 1
      when valor2
        # trecho de código 2
      else
        # trecho de código 3
    end
  

Exemplo de código 15 - Sintaxe do case

O case funciona da seguinte forma: uma variável é colocada ao lado do case (linha 1). O valor dessa variável é comparado com os valores que aparecem ao lado dos when (linhas 2 e 4). Caso o valor da variável seja igual ao valor que aparece no when, o trecho de código correspondente é executado. Caso o valor da variável não combine com nenhum dos valores, o trecho de código do else é executado. Vale salientar, contudo, que o else é opcional.

Vamos a alguns exemplos para melhor ilustrar o uso do case.

Atividade 7.7

Crie um script em Ruby que permita ao usuário digitar um número inteiro que representa um mês do ano (1 para janeiro, 2 para fevereiro, 3 para março, etc.). O script deve apresentar o nome do mês e quantos dias ele tem.

Uma solução para o exercício proposto na Atividade 7.7 é ilustrado no Exemplo de código 16.


Exemplo de código 16 - Solução do exercício proposto na Atividade 7.7

Quando o valor da variável mes for igual a 1, a linha 6 será executada. Quando o valor da variável mes for igual a 2, a linha 8 será executada, e assim sucessivamente. Caso o valor da variável não seja igual ao valor de nenhum when, o trecho de código do else será executado, nesse caso, a linha 30.

Atividade 7.8

Resolva o exercício proposto na Atividade 7.3 usando a estrutura condicional case.

O Exemplo de código 17 apresenta uma solução para o exercício proposto na Atividade 7.8.

  
    puts "Digite uma nota de 0 a 100:"
    nota = gets.chomp.to_i

    case nota
    when 0..20
      puts "Conceito E"
    when 21..40
      puts "Conceito D"
    when 41..60
      puts "Conceito C"
    when 61..80
      puts "Conceito B"
    when 81..100
      puts "Conceito A"
    else
      puts "Digite uma nota de 0 a 100!"
    end
  

Exemplo de código 17 - Solução do exercício proposto na Atividade 7.3 usando case

Observe, no Exemplo de código 17, que também é possível usar faixas de valores ao lado do when. Dessa forma, se o valor da variável nota estiver entre 0 e 20, a linha 6 será executada; se estiver entre 21 e 40, a linha 8 será executada; se estiver entre 41 e 60, a linha 10 será executada, e assim sucessivamente. Se a nota não estiver entre 0 e 100, a linha 16 será executada.

Atividade 7.9

Resolva o exercício proposto na Atividade 7.5 usando a estrutura condicional case.

Referências

RANGEL, E. Conhecendo Ruby. [S.l.]: Leanpub, 2014.

SOUZA, L. Ruby - Ruby: Aprenda a programar na linguagem mais divertida. 1. ed. São Paulo: Casa do Código, 2012. v. I.

WIKIPÉDIA. Identação. 2015. Disponivel em: https://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o. Acesso em: 24 nov. 2015.