O comando SWITCH em C++

Neste tutorial de nossa apostila de C++, vamos aprender a usar mais um comando bem interessante, a instrução switch, também chamada instrução switch case. Vamos ver para que serve, como funciona, quando e como usar ela.

Tomando caminhos diferentes - Ramificações

Durante nossos estudos de testes condicionais em C++, aprendemos na prática que os comandos IF e ELSE são usados para dar rumos diferentes aos nossos códigos.

Se você digita algo, uma coisa acontece.
Se digita outra, outra coisa diferente acontece.
E por ai vai. O computador reage aos seus comandos.

Ocorrem as chamadas ramificações (branches) de um programa.
Isso tudo foi feito com os testes condicionais IF e ELSE.
Porém, existe uma outra possibilidade de trabalharmos com ramificações, que é usando a instrução switch em C++.

Comandos SWITCH e CASE em C++

O switch é uma instrução de opção múltipla, usada para tomar ações diferentes dependendo do valor fornecido. Vamos ver o escopo do comando switch:
switch (expressão)
{
   case value1:
        // código caso expressão
        // seja igual a value1

   case value2:
        // código caso expressão
        // seja igual a value2

   case value3:
        // código caso expressão
        // seja igual a value3

   default:
        // código caso expressão
        // não seja nenhum case acima
}
Funciona assim...
Primeiro, o switch vai testar a expressão.
Depois ela vai comparar com cada um dos case (ramificações).

Se expressão for igual a value1, todo o código daquele case em diante será executado.
Se expressão for igual a value2, tudo que vier depois daquele case em diante será executado (o primeiro case vai ser ignorado).
E assim por diante.

Se o valor de expressão (que deve ser sempre um inteiro) não 'bater' com nenhum case, o que está no default é que será executado.

Criando um menu com o comando SWITCH

Sem dúvidas, a maior utilidade da instrução switch é criar menus.
Vamos criar um menu simples, de um sistema bancário.

Vamos exibir alguns couts com as opções:
1. Saque
2. Extrato
3. Transferência
4. Depósito.

Em cada case do switch, dizemos que opção ela escolheu.
Caso a pessoa digite qualquer coisa que não seja essa opção, cai no default que avisa que a opção é inválida.

Nosso código fica:
#include <iostream>
using namespace std;

int main()
{
    int op;

    cout << "1. Saque" << endl;
    cout << "2. Extrato" << endl;
    cout << "3. Transferência" << endl;
    cout << "4. Depósito" << endl;
    cout << "Digite sua opção: ";
    cin >> op;

    switch(op)
    {
        case 1:
            cout << "Opção selecionada: Saque"<<endl;
        case 2:
            cout << "Opção selecionada: Extrato"<<endl;
        case 3:
            cout << "Opção selecionada: Transferência"<<endl;
        case 4:
            cout << "Opção selecionada: Depósito"<<endl;
        default:
            cout << "Opção inválida"<<endl;
    }


    return 0;
}
Agora teste...digite 1, por exemplo.
Ou 2...notou algo de estranho? Algo de errado?

Veja:
Instrução switch case em C++

Não era pra aparecer as opções debaixo, é como se tivesse executado os cases de baixo também.
Até o default está sempre sendo selecionado pelo switch! Não é assim que a gente queria nosso programa!
Por que isso ocorreu?

O comando BREAK no Switch

Note uma coisa interessante na nossa definição e explicação sobre a instrução switch case: ela executa o case que bater com o valor a ser comparado, dali pra baixo. Ou seja, executa aquele case em questão, e todos os outros que estiverem abaixo! Inclusive o default.

Para que somente o código de cada case seja executado, basta adicionar ao final de cada case o seguinte comando:
break;

Veja como fica nosso código:
#include <iostream>
using namespace std;

int main()
{
    int op;

    cout << "1. Saque" << endl;
    cout << "2. Extrato" << endl;
    cout << "3. Transferência" << endl;
    cout << "4. Depósito" << endl;
    cout << "Digite sua opção: ";
    cin >> op;

    switch(op)
    {
        case 1:
            cout << "Opção selecionada: Saque"<<endl;
            break;

        case 2:
            cout << "Opção selecionada: Extrato"<<endl;
            break;

        case 3:
            cout << "Opção selecionada: Transferência"<<endl;
            break;

        case 4:
            cout << "Opção selecionada: Depósito"<<endl;
            break;

        default:
            cout << "Opção inválida"<<endl;
    }


    return 0;
}
Agora rode e veja que menu bonitinho e bacana! Você seleciona a opção, e ele executa o código correto, com o case correto!

Exemplo de uso do SWITCH CASE

Crie um programa que recebe um valor numérico do usuário, de 1 até 7, e diga que dia da semana é. Por exemplo, domingo é 1, segunda é 2, terça é 3... Diga que ele digitou um valor errado também, caso o faça.

A título de curiosidade, veja como ficaria usando IF e ELSE:
#include <iostream>
using namespace std;

int main()
{
    int day;

    cout << "Dia da semana: ";
    cin >> day;

    if(day==1)
        cout <<"Domingo \n";
    else if(day==2)
        cout <<"Segunda \n";
    else if(day==3)
        cout <<"Terça \n";
    else if(day==4)
        cout <<"Quarta \n";
    else if(day==5)
        cout <<"Quinta \n";
    else if(day==6)
        cout <<"Sexta \n";
    else if(day==7)
        cout <<"Sábado \n";
    else
        cout <<"Dia inválido \n";

    return 0;
}
Veja que coisa medonha, feia e imoral.
Agora vamos ver como isso fica bem bonito e arrumadinho com SWITCH case:
#include <iostream>
using namespace std;

int main()
{
    int day;

    cout << "Dia da semana: ";
    cin >> day;

    switch(day)
    {
        case 1:
            cout <<"Domingo \n";
            break;
        case 2:
            cout <<"Segunda \n";
            break;
        case 3:
            cout <<"Terça \n";
            break;
        case 4:
            cout <<"Quarta \n";
            break;
        case 5:
            cout <<"Quinta \n";
            break;
        case 6:
            cout <<"Sexta \n";
            break;
        case 7:
            cout <<"Sábado \n";
            break;
        default:
            cout <<"Dia inválido";
    }

    return 0;
}
Beeeem melhor, não acha?

Cases acumulados

Uma técnica muito conhecida e usada é a de acumular cases, fazendo o programa executar vários de uma vez. Vamos para um exemplo:

Escreva um programa, usando switch case, que solicita uma letra ao usuário: A, B ou C, e diga que letra foi digitada. Certifique-se que ele escreveu tanto A como a, por exemplo, é a mesma coisa.

Pessoal, por mais que você diga: digite 'B' para o usuário, alguns vão digitar 'b' outros 'bê', o limite da criatividade do usuário é infinito, e você tem que imaginar as besteiras que eles podem fazer e tratar esses casos.

Veja como fica a solução usando cases acumulados:
#include <iostream>
using namespace std;

int main()
{
    char let;

    cout << "Digite uma letra: ";
    cin >> let;

    switch(let)
    {
        case 'a':
        case 'A':
            cout <<"Você digitou A\n";
            break;

        case 'b':
        case 'B':
            cout <<"Você digitou B\n";
            break;

        case 'c':
        case 'C':
            cout <<"Você digitou C\n";
            break;

        default:
            cout <<"Letra inválida";
    }

    return 0;
}
Note que se digitar 'a', cai no case 'a': que também executa o case 'A', pois não tem break ali.
Ou seja, aquele case é selecionado e roda o debaixo.

char é um tipo de dado, caractere. Caracteres são representados por letras entre aspas simples.
Aprenderemos mais sobre isso na seção de strings em C++.


Exercício de SWITCH CASE massa

Usando os conceitos de switch case, faça um programa que pergunte o mês ao usuário (número de 1 até 12), e diga quantos dias aquele mês possui. Fevereiro tem 28 dias (não é bissexto).

No tutorial de exercícios propostos de teste condicionais, vamos propor e resolver esse exercício. Veja a solução lá, mas não antes de tentar bastante resolver.

Nenhum comentário:

Postar um comentário