Linguagem C Básico Aula 11: Alternativas ao If

Imagem meramente ilustrativa

Múltiplas escolhas

    Até momento a única estrutura de controle de fluxo que vimos foi o if/else. Ele é muito útil diante da necessidade de se fazer um teste e tomar uma decisão escolhendo um de dois caminhos possíveis. Vimos também que é possível encadear vários ifs abrindo o leque de opções quando um caminho é escolhido.

    No entanto, haverá situações onde teremos múltiplas escolhas possíveis e não apenas duas opções. Para isso podemos fazer uso de uma série de ifs tratando cada uma das possibilidades, mas existe uma estrutura de controle mais apropriada para esses casos chamada de switch case.

Entendendo o Switch Case

    A forma genérica dessa estrutura geralmente tem essa aparência:

int variável;
switch (variável) {
  case 0:
    // instruções caso a variável seja 0
    break;
  case 1:
    // instruções caso a variável seja 1
    break;
  case 2:
    // instruções caso a variável seja 2 
    break;
  default:
    // instruções caso a variável seja outro valor não listado
}

    Repare que você faz uso de uma variável que pode ser um inteiro ou um char e ao falar switch (variável), você poderá testar uma série de possibilidade de valores para ela. Caso a variável não seja nenhum desses valores listados entre as possibilidades, o programa executará o fluxo determinado pelo comando default. 

    Note também que cada um dos case de possibilidade possui um break para encerrar o switch e permitir que o fluxo programa siga normalmente após a chave }.

Situações de uso e limitações

    O switch case pode ser usado para se criar um menu de opções onde o usuário digita  uma opção desejada. Exemplo:

  1. #include <stdio.h>
  2. int main() {
  3.     char opcao;
  4.     int laco;
  5.     laco=1;
  6.     while(laco){
  7.         printf("\n********************");
  8.         printf("\n* MENU*");
  9.         printf("\n********************");
  10.         printf("\n0 Cadastrar Aluno");
  11.         printf("\n1 Consultar Aluno");
  12.         printf("\n2 Imprimir Nota");
  13.         printf("\n3 Sair do Sistema");
  14.         printf("\nDigite sua opção: ");
  15.         scanf(" %c",&opcao);
  16.         switch(opcao){
  17.         case '0':
  18.             printf("\nEscolheu cadastrar");
  19.             break;
  20.         case '1':
  21.             printf("\nEscolheu consultar");
  22.             break;
  23.         case '2':
  24.             printf("\nEscolheu Imprimir");      
  25.             break;
  26.         case '3':
  27.             printf("\nEscolheu sair");
  28.             laco=0;
  29.             break;            
  30.         default:
  31.             printf("\nOpção invalida!");
  32.         }        
  33.     }
  34.     return 0;
  35. }

    No exemplo acima um while() faz com que o menu seja oferecido indefinidamente até que o usuário digite a opção de sair do sistema. Quando ele escolhe uma opção eu estou simplesmente escrevendo na tela a opção que ele escolheu, mas poderia ter vários outros comandos. Isso ficará mais claro quando eu explicar funções.

    Repare que nesse caso eu optei por usar uma variável char apesar das opções serem em números, pois assim ficou mais fácil para eliminar o buffer de teclado no scanf() com aquele especificador de formato " %c" que já explicamos. Também optei por usar uma variável laco ao invés de usar while(1) para controlar melhor a saída do menu.

    Em sistemas embarcados dificilmente teremos um menu de opções para o usuário digitar a opção desejada, mas poderíamos ter no lugar disso um valor de leitura de um sensor e de acordo com esse valor promover instruções específicas. 

    O grande problema do switch case é que ele foi feito para testar uma variável, mas e se eu tiver uma condição mais complexa seria interessante usar vários ifs.

Exemplo, digamos que eu tenha que imprimir uma mensagem de acordo com uma leitura de umidade do ar:

  1. #include <stdio.h>
  2. int main() {
  3. int umidade;
  4. umidade=60;
  5. if (umidade>70){
  6. printf("\nAr muito umido!");
  7. }
  8. if (umidade>=60 && umidade<70){
  9. printf("\nUmidade do Ar adequada!");
  10. }
  11. if (umidade>=30 && umidade<60){
  12. printf("\nAr seco!");
  13. }
  14. if (umidade<30){
  15. printf("\nAr muito seco!");
  16. }
  17.     return 0;
  18. }

    Na próxima aula trabalharemos funções. 


Próxima Aula                                                                                                                        Aula Anterior

Referências

DAMAS, L. Linguagem C. Rio de Janeiro: LTC Editora, 2007.

GBD ONLINE. C for Beginners. Disponível em: <https://learn.onlinegdb.com/c_for_beginners> Acesso em 05 ago. 2024.

GBD ONLINE. C Programming Examples Disponível em: <https://learn.onlinegdb.com/c_program_examples> Acesso em 05 ago. 2024.

W3SCHOOLS. C Tutorial. Disponível em: <https://www.w3schools.com/c/index.php> Acesso em 05 ago. 2024.