Olá pessoal! Nos últimos artigos desta série eu tenho falado sobre os comandos de controle de programa. Hoje é a vez de estudarmos o Switch Case. Vamos lá!
O comando Switch Case é do tipo Seleção/Condição, como o IF: diante de uma condição ele seleciona o que será feito. Este comando é muito utilizado para a construção de menus de opções ao usuário, a sua sintaxe em pseudocódigo (VISUALG) é a seguinte:
escolha expressao
caso 1
comandos
caso 2
comandos
caso 3
comandos
.......
fimescolha
Listagem 1: Sintaxe Switch Case no VisuAlg
A palavra chave ESCOLHA é o comando que conhecemos como SWITCH em várias linguagens de programação. Switch em inglês quer dizer (entre outros significados) chave, então, um comando Switch funciona como uma chave de seleção. Caso é uma palavra-chave reservada que em inglês é Case, o qual é selecionado de acordo com o valor da expressão.
Cada CASO é um bloco de comandos específico que será executado somente se for selecionado. Então, Switch seleciona um CASO e CASO é a seleção de um bloco de comandos específico. Em alguma situações você pode usar o IF/ELSE ou o SWITCH CASE para resolver o mesmo problema. Apesar de serem comandos parecidos, funcionam de formas diferentes. Antes de explicar mais detalhes, vamos ver a sintaxe desse comando em algumas linguagens:
C
switch (expressão) {
case valor1:
comandos;
break;
case valor2:
comandos;
break;
...
default:
comandos;
}
Listagem 2: Sintaxe Switch Case Linguagem C
JAVA
switch (expressao) {
case valor1:
comandos;
break;
case valor2:
comandos;
break;
.........
default:
comandos;
}
Listagem 3: Sintaxe Switch Case em Linguagem Java
Sintaxe Switch Case em Linguagem C++
switch (expressao)
{
case valor1:
comandos;
break;
case valor2:
comandos;
break;
........
default:
comandos;
}
Listagem 4: Sintaxe Switch Case em Linguagem C++
Sintaxe Switch Case em Linguagem PASCAL
CASE expressao OF
valor1:
begin
comandos;
end;
valor2:
begin
comandos;
end;
else
comandos;
END
Listagem 5: Sintaxe Switch Case em Linguagem Pascal
Observamos claramente que todas as implementações do comando apresentadas aqui tem uma sintaxe muito parecida, isto é, a forma de codificar o comando é semelhante. Sempre teremos uma EXPRESSÃO que será avaliada, que pode ser uma única variável que conterá um valor, ou pode ser uma CONDIÇÃO ou, ainda, uma EXPRESSÃO (expressão matemática) e o resultado obtido dessa avaliação de condição ou expressão é que será o valor utilizado em seguida.
Valor1, valor2, valor3 e assim por diante, contém um valor especifico constante que será comparado ao resultado da EXPRESSÃO. Normalmente esse valor pode ser um tipo inteiro ou um tipo caractere. Se for um tipo inteiro, então, a EXPRESSÃO também tem de ser um tipo inteiro e, é claro que se for um tipo caractere, a EXPRESSÃO deverá ser um tipo caractere também. Preste atenção nesse detalhe pois, muitas vezes, na hora de sentar e codificar, você pode se confundir e ter dificuldades que serão geradas apenas por um erro de lógica seu.
Cada caso com seu respectivo valor é um bloco de comando que executará instruções específicas, algumas vezes parecidas, mas são direcionadas para SITUAÇÕES diferentes. Lembre-se, é uma chave de seleção então o usuário escolherá uma OPÇÃO e o programa será direcionado para essa OPÇÃO (caso). Portanto, só serão executados os comandos do caso selecionado, os outros blocos não serão executados.
Mas o que acontece se o usuário digitar um valor que não corresponda a nenhum dos casos? Bem, é pra isso que temos o DEFAULT na maioria das linguagens, ou o ELSE no caso do pascal. DEFAULT é uma palavra-chave reservada que podemos utilizar no Switch Case para direcionar o programa no caso de ser digitado um valor inválido. Nesse bloco de comando podemos colocar uma mensagem de erro, ou de alerta, aviso para o usuário como, por exemplo: “Você digitou um valor inválido, tente novamente”. Temos de ter em mente que essa mensagem que aparecerá para o usuário deve ser o mais clara e objetiva possível, direcionando as ações dele para o que deve ser feito.
O comando funciona basicamente da seguinte forma: o valor de ESCOLHA (Switch) é normalmente uma variável que contém um valor que foi digitado pelo usuário anteriormente. Esse valor será comparado a cada um dos casos, até chegar no caso igual a esse valor e, se o valor não existir nos casos, será direcionado para default. Reforço que o programa é executado de forma sequencial, isto é, o programa é executado linha a linha. Se tivermos 10 casos e o usuário digitar a opção 8, ficará assim:
Caso1 = 8? Falso, não executa nada evai pro próximo caso.
Caso2 = 8 ? Falso, não executa nada e vai pro próximo caso, e assim por diante até que:
Caso8 = 8? Verdadeiro, entra no bloco de comandos executa todas as instruções e depois retorna o comando pro programa principal.
A Figura 1 apresenta o Fluxograma para Switch Case:

Vamos codificar uma calculadora que permite ao usuário escolher a operação matemática que ele deseja.
algoritmo "calculadora"
var
x,y,op: inteiro
inicio
escreval(" == CALCULADORA == ")
escreva(" Digite o primeiro número: ")
leia(x)
escreva(" Digite o segundo número: ")
leia(y)
escreval(" Escolha uma das opções abaixo: " )
limpatela
escreval("1 - Soma")
escreval("2 - Subtração")
escreval("3 - Multiplicação")
escreval("4 - Divisão")
escreva("Digite o número da operação desejada: ")
leia(op)
escolha op
caso 1
escreval(" Opção Selecionada: 1. SOMA")
escreval(" A soma dos dois números é: ", x ," + ", y," = ", x+y)
caso 2
escreval(" Opção Selecionada: 2. SUBTRAÇÃO")
escreval(" A subtração dos dois números é: ", x ," - ", y," = ", x-y)
caso 3
escreval(" Opção Selecionada: 3. MULTIPLICAÇÃO")
escreval(" A multiplicação dos dois números é: ", x ," * ", y," = ", x*y)
caso 4
escreval(" Opção Selecionada: 4. DIVISÃO")
se (y = 0) entao
escreval ("Não existe divisão por 0.")
senao
escreval(" A divisão dos dois números é: ", x ," / ", y," = ", x/y)
fimse
fimescolha
fimalgoritmo
Listagem 6: Pseudocódigo para a Calculadora
Vamos analisar o pseudocódigo:
Linha 3 e 4: são declaradas as variáveis que utilizaremos no programa. X e Y são as variáveis responsáveis por armazenar os valores dos números (operandos). OP é o valor da opção que o usuário selecionará.
Linha 14: LIMPATELA é um comando utilizado para limpar a tela do CONSOLE no momento em que o programa está sendo executado.
Linhas de 16 a 19: Nestas linhas apenas escrevemos na tela do console mensagens que apresentam as opções ao usuário. São mensagens claras e objetivas.
Linhas de 21 a 23: Nestas linhas pedimos ao usuário que escolha a opção que ele deseja e fazemos a LEITURA do valor digitado pelo usuário. OP armazena esse valor para que ele seja usado em seguida, na comparação do caso até encontrar o caso desejado.
Linhas 25 a 27: Este é o CASO 1. Aqui é executada a operação de SOMA. Observe que todos os comandos aqui são utilizados pra isso, para calcular a SOMA e apresentar ao usuário o resultado da soma.
Linhas 29 a 31: Aqui estão os comandos correspondentes ao CASO 2, que é a SUBTRAÇÃO, bem parecido com o CASO1.
Linhas 33 a 35: Aqui estão os comandos correspondentes ao CASO 3, que é a MULTIPLICAÇÃO, bem parecido com o CASO1.
Linhas 37 a 43: Aqui estão os comandos correspondentes ao CASO 4, que é a DIVISÃO. Aqui foi feito o tratamento da divisão por zero, nunca podemos nos esquecer disso quando formos usar a DIVISÃO. Se o divisor for zero, não existe divisão por zero e isso gera um erro! Então, quando o divisor for zero, enviamos uma mensagem pro usuário alertando-o sobre isso. Caso contrário, a divisão ocorre normalmente.
Linha 45: FIMESCOLHA é o comando para finalizar o ESCOLHA/CASO.
Vamos agora fazer o teste de mesa deste algoritmo. Observe a Tabela 1:
Tabela 1: Teste de Mesa
| iteração | x | y | op | caso1 | caso2 | caso3 | caso4 |
| 1 | 10 | 2 | 1 |
1 = 1 V Executa | Não executa | Não executa | Não executa |
| 2 | 10 | 2 | 2 |
2 = 1 F Não Executa |
2 = 2 V Executa | Não Executa | Não Executa |
| 3 | 10 | 2 | 3 |
3 = 1 F Não Executa |
3 = 2 F Não Executa |
3 = 3 V Executa | Não Executa |
| 4 | 10 | 2 | 4 |
4 = 1 F Não Executa |
4 = 2 F Não Executa |
4 = 3 F Não Executa |
4 = 4 V Executa |
Neste teste de mesa eu simulei quatro iterações da execução do programa. Em todas elas eu digitei o mesmo valor para X e Y, portanto, os valores resultantes para as operações matemáticas não se alteram, a única coisa que varia é a OPÇÃO selecionada. Na primeira iteração seleciono a opção 1 (valor 1 – caso 1). Assim que digito o valor 1, esse valor é comparado com o caso1, portanto, 1 = 1? Sim, verdadeiro, então, execute este bloco de comandos. Assim, é feita a adição e os outros casos são PULADOS, não são executados e o controle volta para o programa principal ao FIMESCOLHA.
Na segunda iteração eu selecionei a opção 2. Esse valor será comparado com o caso1, 2 = 1 é F, então pula esse bloco de comandos e vai para o próximo Caso. No caso 2, 2 = 2 é V, então entra e executa este bloco. Os outros blocos são pulados já que o Caso2 foi executado.
Na terceira iteração selecionei a opção 3. 3 = 1 é F, pula o bloco de comando e vai para o próximo. 3 = 2 é F, pula e vai para o próximo. 3 = 3 é V, entra no bloco, executa e retorna para o programa principal.
Na quarta e última iteração selecionei a opção 4. 4 = 1 é F, pula este bloco e vai para o próximo. 4 = 2 é F, pula e vai para o próximo. 4 = 3 é F, pula e vai para o próximo. 4 = 4 é V, entra neste bloco, executa e retorna ao programa principal.
E assim terminamos nosso teste de mesa com o código apresentado na Listagem 6. Agora vamos ver como fica esse mesmo código implementado em outras linguagens?
C
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x, y, resultado, op;
x=0;
y=0;
resultado=0;
op=0;
printf(" \n Digite o valor do primeiro operando: ");
scanf("%d", &x);
printf(" \n Digite o valor do segundo operando: ");
scanf("%d", &y);
printf(" \n Escolha uma das opções abaixo: ");
printf(" \n 1. Soma ");
printf(" \n 2. Subtração ");
printf(" \n 3. Multiplicação ");
printf(" \n 4. Divisão ");
printf(" \n Digite o número da opção desejada: ");
scanf("%d", &op);
switch (op)
{
case 1:
printf(" \n Opção selecionada: 1. Soma ");
resultado = x + y;
printf(" \n A soma dos dois números é: %d ", resultado);
break;
case 2:
printf(" \n Opção selecionada: 2. Subtração ");
resultado = x - y;
printf(" \n A subtração dos dois números é: %d", resultado);
break;
case 3:
printf(" \n Opção selecionada: 3. Multiplicação ");
resultado = x * y;
printf(" \n A multiplicação dos dois números é: %d", resultado);
break;
case 4:
printf(" \n Opção selecionada: 4. Divisão ");
if(y=0)
{
printf(" \n Não existe divisão por zero ");
}
else
{
resultado = x / y;
printf(" \n A divisão dos dois números é: %d", resultado);
}
break;
default:
printf(" \n Você digitou uma opção inválida!");
}
return 0;
}
Listagem 7
Java
package calculadora;
import java.util.Scanner;
public class Calculadora {
public static void main(String[] args) {
int x, y, op;
Scanner s = new Scanner(System.in);
System.out.println(" \n Digite o valor do primeiro operando: ");
x = s.nextInt();
System.out.println(" \n Digite o valor do segundo operando: ");
y = s.nextInt();
System.out.println(" \n Escolha uma as opções abaixo: ");
System.out.println(" \n 1. Soma ");
System.out.println(" \n 2. Subtração ");
System.out.println(" \n 3. Multiplicação ");
System.out.println(" \n 4. Divisão ");
System.out.println(" \n Digite a opção desejada: ");
op = s.nextInt();
switch (op) {
case 1:
System.out.println(" \n Opção Selecionada: 1. Soma");
System.out.println(" \n A soma dos dois valores é: " + (x + y));
break; //fim caso 1
case 2:
System.out.println(" \n Opção Selecionada: 1. Subtração");
System.out.println(" \n A subtração dos dois valores é: " + (x - y));
break; //fim caso 2
case 3:
System.out.println(" \n Opção Selecionada: 1. Multiplicação");
System.out.println(" \n A multiplicação dos dois valores é: " + (x * y));
break; //fim caso 3
case 4:
System.out.println(" \n Opção Selecionada: 1. Divisão");
if (y == 0) {
System.out.println(" \n Não existe divisão por zero. ");
} else {
System.out.println(" \n A divisão dos dois valores é: " + (x / y));
}//fim IF/ELSE
break; //fim caso 4
default:
System.out.println(" \n Opção Inválida. ");
} //fim switch case
} // fim programa principal
} // fim classe calculadora
Listagem 8
C++
#include <iostream>
using namespace std;
int main(void)
{
int x=0, y=0, op=0;
cout << " \n Digite o valor do primeiro operando: ";
cin >> x;
cout << " \n Digite o valor do segundo operando: ";
cin >> y;
cout << " \n Escolha uma das opções abaixo: ";
cout << " \n 1. Soma ";
cout << " \n 2. Subtração ";
cout << " \n 3. Multiplicação ";
cout << " \n 4. Divisão ";
cout << " \n Digite a opção desejada: ";
cin >> op;
switch (op)
{
case 1:
cout << " \n Opção Desejada: 1. Soma ";
cout << " \n A soma dos dois números é: " << (x+y);
break; //fim caso 1
case 2:
cout << " \n Opção Desejada: 2. Subtração ";
cout << " \n A subtração dos dois números é: " << (x-y);
break; //fim caso 2
case 3:
cout << " \n Opção Desejada: 3. Multiplicação ";
cout << " \n A multiplicação dos dois números é: " << (x*y);
break; //fim caso 3
case 4:
cout << " \n Opção Desejada: 4. Divisão ";
if(y==0){
cout << " \n Não existe divisão por zero. ";
}else{
cout << " \n A divisão dos dois números é: " << (x/y);
}
break; //fim caso 4
default:
cout << " \n Opção Inválida! ";
} //fim switch case
return 0;
} //fim programa principal
Listagem 9
Pascal
program calculadora;
var
x,y,op: integer;
begin
write(' Digite o valor do primeiro operando ');
readln(x);
write(' Digite o valor do segundo operando ');
readln(y);
writeln(' Escolha uma das opções abaixo: ');
writeln(' 1. Soma ');
writeln(' 2. Soma ');
writeln(' 3. Soma ');
writeln(' 4. Soma ');
write(' Digite a opção desejada: ');
readln(op);
CASE op OF
1:
begin
writeln(' Opção Selecionada: 1. Soma ');
writeln(' A soma dos dois números é: ', (x+y));
end; //fim caso 1
2:
begin
writeln(' Opção Selecionada: 2. Subtração ');
writeln(' A subtração dos dois números é: ', (x-y));
end; //fim caso 2
3:
begin
writeln(' Opção Selecionada: 3. Multiplicação ');
writeln(' A multiplicação dos dois números é: ', (x*y));
end; //fim caso 3
4:
begin
writeln(' Opção Selecionada: 4. Divisão ');
if(y=0)then
begin
writeln(' Não existe divisão por zero. ');
end //fim IF
else
begin
writeln(' A divisão dos dois números é: ', (x/y):3:2);
end; //fim else
end;//fim caso 4
else
writeln(' Opção Inválida. ');
end; //fim switch case
readln();
end. //fim programa principal
Listagem 10
Como vocês podem notar a implementação do VisuAlg é um pouco diferente das implementações das linguagens de programação, entretanto todas seguem o mesmo padrão de funcionamento.
Conclusão
Espero que esse artigo seja muito útil a todos vocês. Eu quis mostrar um exemplo bem simples e prático, inclusive em outras linguagens, para que vocês possam usar este artigo como fonte de consulta sempre que precisarem. Se houver dúvidas, por favor, deixem nos comentários.
Exercícios – Switch Case
- Faça um programa que receba o preço, a categoria (1 – limpeza; 2 – alimentação; ou 3 – vestuário) e a situação (R – produtos que necessitam de refrigeração; e N – produtos que não necessitam de refrigeração). Calcule e mostre:
- O valor do aumento, usando as regras que se seguem.
|
PREÇO |
CATEGORIA |
PERCENTUAL DE AUMENTO |
|
< = 25 |
1 |
5% |
|
2 |
8% | |
|
3 |
10% | |
|
> 25 |
1 |
12% |
|
2 |
15% | |
|
3 |
18% |
- O valor do imposto, usando as regras a seguir.
O produto que preencher pelo menos um dos seguintes requisitos pagará imposto equivalente a 5% do preço; caso contrário, pagará 8%. Os requisitos são:
Categoria: 2
Situação: R
- O novo preço, ou seja, o preço mais aumento menos imposto.
- A classificação, usando as regras a seguir.
|
NOVO PREÇO |
CLASSIFICAÇÃO |
|
< = R$50,00 |
Barato |
|
Entre R$50,00 e R$120,00 |
Normal |
|
> = R$120,00 |
Caro |
- Faça um programa que receba:
- O código do produto comprado; e
- A quantidade comprada do produto.
Calcule e mostre:
- O preço unitário do produto comprado, seguindo a Tabela 1;
- O preço total da nota;
- O valor do desconto, seguindo a Tabela 2 e aplicado sobre o preço total da nota; e
- O preço final da nota depois do desconto.
|
TABELA 1 |
TABELA 2 | ||
|
CÓDIGO |
PREÇO |
PREÇO TOTAL DA NOTA |
% DE DESCONTO |
|
1 a 10 |
R$10,00 |
Até R$250,00 |
5% |
|
11 a 20 |
R$15,00 |
Entre R$250,00 e R$500,00 |
10% |
|
21 a 30 |
R$20,00 |
Acima de R$50,00 |
15% |
|
31 a 40 |
R$30,00 |
|
|
- Faça um programa que receba o preço de um produto e seu código de origem e mostre sua procedência. A procedência obedece à tabela a seguir.
|
CÓDIGO DE ORIGEM |
PROCEDÊNCIA |
|
1 |
Sul |
|
2 |
Norte |
|
3 |
Leste |
|
4 |
Oeste |
|
5 ou 6 |
Nordeste |
|
7 ou 8 ou 9 |
Sudeste |
|
10 a 20 |
Centro-Oeste |
|
21 a 30 |
Nordeste |
- Faça um programa que receba dois números e execute as operações listadas a seguir, de acordo com a escolha do usuário.
|
ESCOLHA DO USUÁRIO |
OPERAÇÃO |
|
1 |
Média entre os números digitados |
|
2 |
Diferença do maior pelo menor |
|
3 |
Produto entre os números digitados |
|
4 |
Divisão do primeiro pelo segundo |
Confira mais textos da série Introdução a Algoritmos no Embarcados.










pq esse código não compila com gcc no linux?
case (NAO_ACHOU && (numero != ZERO)):
// compilador não aceita && no case. Aceita ||. pq?
Não sei te dizer com certeza … eu sei que tem algumas diferenças entre um compilador e outro. Vc consegue mandar um print do erro? OU até mesmo um vídeo curto ajudaria a entender melhor. Qual linux vc ta usando e qual compilador exatamente. Obrigada
error: case label does not reduce to an integer constant
case NAO_ACHOU && numero != ZERO:
A mensagem do compilador pode estar errada. O erro está no operador “&&”. Se vc troca por “||” o programa executa normalmente. A plataforma é (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4).
Obrigado!
vou precisar testar aqui novamente ok! mas precisarei de uns dias, então, por favor aguarde! obrigada por enqto
no if do case 4, falta um =
if(y==0)
opa! obrigada por avisar Juliana!!!
Dei aquele copia e cola, pois esses fontes são muito interessantes. E comparar um como o outro faz muito bem para o aprendizado.
exato!
Muito bom. Estou só dando uma olhada pelo celular. Amanhã vou dar uma caprichada.
=)
Bom artigo! So acho que faltou frisaro uso do “break” vejo que muitos alunos meus esquecem e o erro passa despercebido… inckuindo tanbem o break no caso default como uma boa pratica e nao faltar quando ele nao estiver como ultima opcao. Eu por exemplo costumo coloca-lo antes.
Pra fechar podemos tambem colocar dois ou mais case’s seguidos para denotar a mesma acao para vaioscasos desejados!
Isso ae! Parabens pela escrita… espero em breve poder comecar a contribuir tambem!
Muito Obrigada Mateus!!!!