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.
#include
ResponderExcluir#include
using namespace std;
int main() {
setlocale(LC_ALL, "");
int monthly;
cout << "Digite o mês (1 a 12): ";
cin >> monthly;
switch (monthly) {
case 1:
cout << "Janeiro tem 31 dias";
break;
case 2:
cout << "Fevereiro tem 28 dias";
break;
case 3:
cout << "Março tem 31 dias";
case 4:
cout << "Abril tem 30 dias";
break;
case 5:
cout << "Maio tem 31 dias";
break;
case 6:
cout << "Junho tem 30 dias";
break;
case 7:
cout << "Julho tem 31 dias";
break;
case 8:
cout << "Agosto tem 31 dias";
break;
case 9:
cout << "Setembro tem 30 dias";
break;
case 10:
cout << "Outubro tem 31 dias";
break;
case 11:
cout << "Novembro tem 30 dias";
break;
case 12:
cout << "Dezembro tem 31";
break;
default:
cout << "Numero inválido";
}
return 0;
}
É possível utilizar "switch case" pra fazer um menu com apenas duas opções de escolha e que exiba uma mensagem de erro caso o usuário digite algo difere dessas duas opções? Ou então não há como fazer essa comparação no switch e eu teria que usar o "else if"?
ResponderExcluirbom se vc olhar no inicio o Defalt serve para isso caso a pessoa não digite o numero de case ele coloca um erro falando que o comando foi invalido
Excluir