Resumo da Aula 6

Sumário

1  As instruções if e if else

1.1  Sintaxe

Instrução de selecção (if else):

if(expressão_booleana) {
    // ... instruções a executar se a expressão booleana for verdadeira.
} else {
    // ... instruções a executar se a expressão booleana for falsa.
}
Instrução condicional (if): if(expressão_booleana) {
    // ... instruções a executar se a expressão booleana for verdadeira.
}
// Se a expressão booleana for falsa continua o programa
Nota:  Quando existe apenas uma instrução dentro de um dos blocos a executar podem ser omitidas as chavetas. 

1.2  Exemplos

Instrução de selecção (if else):

if(0 < x)
    cout << "x é positivo." << endl;
else
    cout << "x é negativo ou zero (não-positivo)." << endl;

Instrução condicional (if):

if(0 < x)
    cout << "x é positivo." << endl;

Nota:  O else pode não existir, caso não se pretenda executar nenhuma instrução quando a expressão booleana for falsa, como é o caso no segundo exemplo.

As instruções if else podem ser encadeadas.  Por exemplo,

if(0 < x)
    cout << "x é positivo." << endl;
else
    if(x < 0)
        cout << "x é negativo." << endl;
    else
        cout << "x é zero." << endl;

Mas nesse caso é usual usar uma indentação diferente para o código C++ de modo a deixar mais clara a sequência de instruções alternativas,

if(0 < x)
    cout << "x é positivo." << endl;
else if(x < 0)
    cout << "x é negativo." << endl;
else
    cout << "x é zero." << endl;

Importante:  Por vezes pode ser ambíguo a que if diz respeito um dado else.  A regra é que o else pertence ao if mais interior (mais "próximo").  A indentação utilizada não influencia a interpretação do compilador, embora possa induzir o programador em erro.  Por exemplo, o código

if(0 <= x)
    if(0 < x)
        cout << "x é positivo." << endl;
else
    cout << "x é negativo." << endl;

não faz o que é suposto, pois é equivalente a

if(0 <= x) {
    if(0 < x)
        cout << "x é positivo." << endl;
    else
        cout << "x é negativo." << endl;
}

Para que o código faça o que se pretendia é necessário envolver o if mais interior em chavetas de modo a impossibilitar a sua associação com o else, i.e.,

if(0 <= x) {
    if(0 < x)
       cout << "x é positivo." << endl;
} else
    cout << "x é negativo." << endl;

Nota:  Uma instrução if sem else é sempre equivalente a uma instrução if else em que a instrução controlada pelo else é a instrução nula (que só possui o terminador ;).  Ou seja,

if(0 < x)
    cout << "x é positivo" << endl;

é equivalente a

if(0 < x)
    cout << "x é positivo" << endl;
else
    ;

2  O operador ?:

O operador ?: é uma forma abreviada de expressar um tipo muito usual de instruções alternativas.

2.1  Sintaxe

condição ? expressão_caso_verdadeira : expressão_caso_falsa

2.2  Exemplo

int x;

// ...

int z = 0 < x ? x : -x;

i.e., z é inicializada com o valor absoluto (módulo) de x.

Nota:  Se a condição for verdadeira a segunda expressão não chega a ser calculada e vice-versa.

3  A instrução switch

3.1  Sintaxe

switch(expressão_de_controlo) {
  case valor_1:
    // ... instruções.
    break;
  case valor_2:
    // ... instruções.
    break;

  ...

  default:
    // ... instruções.
}

3.2  Exemplo

int dígito;
cin >> dígito;

switch(dígito) {
  case 0:
    cout << "zero";
    break;
  case 1:
    cout << "um";
    break;
  case 2:
    cout << "dois";
    break;
  case 3:
    cout << "três";
    break;
  case 4:
    cout << "quatro";
    break;
  case 5:
    cout << "cinco";
    break;
  case 6:
    cout << "seis";
    break;
  case 7:
    cout << "sete";
    break;
  case 8:
    cout << "oito";
    break;
  case 9:
    cout << "nove";
    break;
}

Importante:  A instrução switch não permite a especificação de gamas de valores nem de desigualdades.  Construções como case 1..10: ou case < 10: são inválidas.  Assim, é possível usar como expressão de controlo do switch apenas expressões de um dos tipos inteiros ou de um tipo enumerado (a ver em aulas posteriores), devendo os valores colocados nos case respectivos ser do mesmo tipo.

Importante:  Cada caso corresponde a um ponto de entrada no bloco de instruções do switch.  Se se eliminarem os break e o valor introduzido pelo utilizador for 7, o exemplo escreve no ecrã

seteoitonove

Coloque sempre as instruções break!  São elas que terminam abruptamente a execução do bloco de instruções do switch, levando ao resultado pretendido, que é que as instruções em cada caso sejam alternativas.

Pode usar um caso de nome default: para capturar todos os casos não previstos pelos casos "normais" (case valor:).