Subsecções

4 Ordem sequencial de execução de sentenças
o comando condicional: if e if - else

A execução de um programa C++ começa com a função main(). Em todos os exemplos que vimos até este momento, sentenças são executadas sequencialmente. A ordem sequencial de execução de senteças pode ser alterada se certas condições forem satisfeitas durante a execução do programa. Isto é chamado desvio condicional.

Todas as linguagens de programação oferecem comandos para o desvio condicional. O mais simples é a senteça if. Em C++ , ele tem o formato:

if ($expressao$)

$corpo do desvio$

O corpo do desvio, por sua vez, pode ser uma sentença simples ou composta (veja Seção 1.1).

Quando uma sentença if é encontrada em um programa,

  1. O teste na $expressao$ em parênteses é avaliada.
  2. Se o valor da expressão de teste for DIFERENTE de zero, as sentenças que compõem o corpo do desvio que segue a expressão de teste são executadas.

Figura 1: O comando if
\includegraphics[scale=1.0]{if}

Considere o seguinte exemplo que converte uma fração digitada pelo usuário (numerador e denominador) em decimal e imprime o resultado:

#include <iostream>
using namespace std;

int main( ){

  int a, b;
  
  cout << "Entre com uma  fracao (numerador and denominador): ";
  cin >> a >> b;
  
  cout << "A fracao em decimal eh " << 1.0 * a / b << endl;
}

No exemplo acima, escrevemos 1.0 * a / b, já que a e b são do tipo int, e portanto a / b é uma divisão de inteiros e a parte fracional do resultado seria truncado, o que certamente não é o que desejamos.

Voce vê algo errado neste programa ? Uma coisa a ser notada é que se o usuário digitar um denominador igual a 0, nós teremos um erro de execução, já que o programa tentaria executar uma divisão por zero. O que é necessário fazer é testar se o denominador é igual a zero e dividir só no caso dele for diferente de zero. Poderíamos reescrever o programa acima da seguinte forma:

Exemplo 1:

#include <iostream>
using namespace std;

int main( ){

  int a, b;
  
  cout << "Entre com uma  fracao (numerador e denominador): ";
  cin >> a >> b;
  
  if (b != 0)
    cout << "A fracao em decimal eh " << 1.0 * a / b << endl;
}

Exemplo 2:

Programa que lê dois números e ordena o par caso o primeiro número digitado for maior que o segundo.

#include <iostream>
using namespace std;

int main( ){

  int num1, num2, aux;
  
  cout << "Entre com dois numeros inteiros: ";
  cin >> num1 >> num2;

  if (num1 > num2) {
    aux = num1;
    num1 = num2;
    num2 = aux;
    cout << "Trocou \n";
  }

  cout << "Os numeros ordenados: " << num1 << " " << num2 << endl;

}

O programa do Exemplo 1 acima ficaria ainda melhor se ao invés de não fazer nada no caso do denominador ser zero, imprimirmos uma mensagem de erro ao usuário, explicando o que há de errado.

A sentença em C++ que permite fazermos isso é o if - else. O formato do if-else é:

if ($expressao$)

$sentenca_{1}$

else

$sentenca_{2}$

Figura 2: O comando if-else
\includegraphics[scale=1.0]{if-else}

Primeiro, a $expressao$ (que usualmente chamamos de condição) é avaliada. Caso a condição seja verdadeira (o que é equivalente a dizer que o valor é diferente de zero), entao a $sentenca_{1}$ é executada. Caso contrário, a $sentenca_{2}$ é executada.

Note que uma sentença pode ser simples ou composta. Se você quiser agrupar diversas sentenças para serem executadas, você pode colocá-las entre chaves ({ e }).

Por hora, vamos continuar com nosso exemplo simples e torná-lo mais explicativo:

Exemplo 3:

#include <iostream>
using namespace std;

int main( ){

  int a, b;
  
  cout << "Entre com uma fracao (numerador and denominador): ";
  cin >> a >> b;
  
  if (b != 0) 
    cout << "A fracao decimal eh " << 1.0 * a / b << endl;
  else 
    cout << "Erro: denominador zero!\n";
}

Exemplo 4:

Considere agora o exemplo já visto que pede que um usuário entre com um número e verifique se o número é par. Porém agora, queremos que o programa imprima “o numero e par” ou “o numero e impar”.

#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 par ou impar
  if (num % 2 == 0)
    cout << "O numero eh par.\n";
  else
    cout << "O numero eh impar.\n";      

}

4.1 Um erro comum

É muito frequente utilizar o operador relacional == em expressões condicionais da sentença if. Por exemplo:

    int  saldo = 2000;

    if (saldo == 1)
       cout << "Voce esta quebrado! " << endl;
    else 
       cout << "Seu saldo eh " << saldo << endl;

Como a sentença saldo = 2000 inicializa o valor da variável saldo com 2000, a expressão saldo == 1 tem valor 0. Portanto, a senteça que segue o else será executada, e a mensagem

Seu saldo e 2000

será impressa.

Agora, suponha que, devido a um erro, você tenha colocado = ao invés de ==:

    int saldo = 2000;

    if (saldo = 1)
       cout << "Voce esta quebrado! " << endl;
    else 
       cout << "Seu saldo eh " << saldo << endl;

Agora, a expressão saldo = 1 tem valor 1. Portanto, a sentença que segue o if será executada, e a mensagem

Voce esta quebrado!

será impressa. Além disso, a atribuição causará um efeito colateral, e alterará o valor de saldo para 1.

Tal uso do operador de atribuição não é ilegal, e não será detectado pelo compilador como erro. Portanto, tome cuidado com o uso de atribuição no lugar de igualdade. Tal erro é muito comum, e não é fácil de achar.

Como regra geral, NÃO utilize atribuições dentro de outras sentenças.


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