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:
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.