Subsecções

5 Aninhando senteças if e if-else

Como era de se esperar, é possível colocar uma sentença condicional dentro de outra. Por exemplo, se quisermos imprimir uma mensagem apropriada caso um número seja positivo ou negativo e par ou ímpar, nós poderíamos escrever o seguinte:

#include <iostream>
using namespace std;

int main( ){

  int num;
  
  // Obtem um numero do usuario
  cout << "Entre com um inteiro: ";
  cin >> num;
  
  // Imprime uma mensagem dizendo se o numero e positivo ou negativo,
  // positivo ou negativo.
  if (num >= 0) {
    if (num % 2 == 0)
      cout << "O numero e par e positivo\n";
    else
      cout << "O numero e impar e positivo\n";      
  }
  else {
    if (num % 2 == 0)
      cout << "O numero e par e negativo\n";
    else
      cout << "O numero e impar e negativo\n";      
  }
}

5.1 A ambigüidade do else

O aninhamento de sentenças if-else sem usar chaves ({ e }) para delimitar o bloco de senteças a ser executado pode trazer efeitos indesejados.

Há uma regra simples para determinar qual if está associado a qual else.

Regra de associação:

Um else está associado com a última ocorrência do if sem else.

O exemplo seguinte está errado porque associa o else ao if "incorreto":

#include <iostream>
using namespace std;

int main( ){

  int num;
  
  // Obtem um numero do usuario
  cout << "Entre com o numero de peras: ";
  cin >> num;
  
  // Imprime uma mensagem dizendo se o numero de peras e 0 ou 1
  //  (*** isto esta' errado !!  ***)
  if (num != 0)
    if (num == 1)
      cout << "Voce tem uma pera.\n";
  else
    cout << "Voce nao tem nenhuma pera.\n";
}

Neste exemplo, o if tem o seguinte significado, segundo a regra de associação:

#include <iostream>
using namespace std;

int main( ){

  int num;
  
  // Obtem um numero do usuario
  cout << "Entre com o numero de peras: ";
  cin >> num;
  
  // Como a sentenca if e' vista pelo compilador
  if (num != 0)
    if (num == 1)
      cout << "Voce tem uma pera.\n";
    else
      cout << "Voce nao tem nenhuma pera.\n";
}

Para evitar este problema, chaves ({ e }) devem ser usadas para tirar a ambiguidade. O exemplo abaixo mostra como as chaves podem ser inseridas para corrigir o programa acima.

#include <iostream>
using namespace std;

int main( ){

  int num;
  
  // Obtem um numero do usuario
  cout << "Entre com o numero de peras: ";
  cin >> num;
  
  // Como corrigir o problema (este programa funciona)
  if (num != 0) {
    if (num == 1)
      cout << "Voce tem uma pera.\n";
  }
  else
    cout << "Voce nao tem nenhuma pera.\n";
}

Exercício 1:

Faça um programa que leia 3 números e imprima o maior.


Créditos: Documento produzido pelo Prof. Armando L.N. Delgado (DINF/ET/UFPR), baseado em revisão sobre material de Prof. Carmem Hara e Prof. Wagner Zola (DINF/ET/UFPR).

Esta obra está licenciada com uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional.  Licença Creative Commons

Armando Luiz Nicolini Delgado
2020-10-20