O teste condicional SWITCH: o que é, para que serve e como usar o switch em C

Provavelmente você nunca notou mas, a todo instante, estamos fazendo escolhas quando usamos um computador ou outro dispositivo digital qualquer.

Escolhemos ícones, teclas do teclado, que botão vamos clicar, que menus vamos abrir, que opção do menu vamos selecionar etc.

O curso C Progressivo vai ensinar, agora, uma ferramenta importantíssima em programação: o uso do switch para escolhas.

Clique aqui e saiba como obter seu certificado de programação C! Entre já no Mercado de Trabalho!


SWITCH em C: o que é e como usar o comando

SWITCH é um comando em C que serve para fazer testes condicionais, testando igualdades, onde podemos usar várias opções de comparações.

Assim como o nosso conhecido par IF ELSE, o comando switch também serve para fazer testes condicionais.

Imagine que você quer testar um valor digitado pelo usuário com 10 números.
Você poderia fazer com IF, tranquilamento.
Porém, seu código iria ficar enorme e você teria que digitar várias vezes IF (...), IF(...)

Visando reduzir isso, vamos aprender como usar o comando switch, que iremos usar várias vezes durante nossa apostila de C, para criar menus, por exemplo, onde iremos exibir uma série de opções, o usuário vai escolher uma e vamos saber qual opção ele escolheu através de um comando switch.

A sintaxe do switch é a seguinte:

switch( opção )
{
    case opção1:
            comandos caso a opção 1 tenha sido escolhida
            break;
    
    case opção2:
            comandos caso a opção 2 tenha sido escolhida
            break;
    
    case opção3:
            comandos caso a opção 3 tenha sido escolhida
            break;
    
    default:
            comandos caso nenhuma das opções anteriores tenha sido escolhida
}


O switch vai comparar a variável 'opção' com os 'case'. Se ele achar uma opção (case) que seja igual, ele vai rodar o código que vem após esse case, e antes do próximo case.
Caso nenhum case seja igual a 'opção', o código que está default é o que será rodado.

Caso a 'opção' seja um char, coloque entre aspas simples ' ', caso seja string coloque entre aspas duplas " " e caso seja um número, não é necessário colocar nenhum tipo de aspas.





Exemplo de código:

Crie uma calculadora usando a instrução SWITCH, que pergunte qual das operações básicas quer fazer (+, -, * e /), em seguida peça os dois números e mostre o resultado da operação matemática entre eles.

#include <stdio.h>

int main()
{
        char operacao;
        float num1,
              num2;

        printf("Escolha sua operação [+ - * / ]: ");
        scanf("%c",&operacao);

        printf("Entre com o primeiro número: ");
        scanf("%f",&num1);

        printf("Entre com o segundo número: ");
        scanf("%f",&num2);

        switch( operacao )
        {
            case '+':
                printf("%.2f + %.2f = %.2f", num1, num2, num1 + num2);
                break;

            case '-':
                printf("%.2f - %.2f = %.2f", num1, num2, num1 - num2);
                break;

            case '*':
                printf("%.2f * %.2f = %.2f", num1, num2, num1 * num2);
                break;

            case '/':
                printf("%.2f / %.2f = %.2f", num1, num2, num1 / num2);
                break;

            default:
                printf("Você digitou uma operacao invalida.");

        }

}


O switch sem o break

No exemplo passado, você viu que somente um dos case era selecionado para cada operação que efetuamos.

Porém, isso só ocorre por conta do break em cada case.

Se você tirar o break, o switch identifica o case que é igual a 'operacao', executa ele e TODOS OS QUE ESTÃO ABAIXO até o fim, ou até encontrar um break!

É como se os case se acumulassem.

Rode o exemplo a seguir:

#include <stdio.h>

int main(void)
{
        int continuar=1;
        char opcao;

        while(continuar)
        {
            system("clear || cls");
            printf("Repetir? (S/s)im (N/n)ao\n");
            scanf(" %c",&opcao);

            switch(opcao)
            {
                case 's':
                case 'S':
                    break;

                case 'n':
                case 'N':
                    continuar = 0;
            }

        }

}


O comando system("clear") serve para limpar a tela em sistemas operacionais do tipo Linux, e system("cls") limpa a tela caso você use Windows. Então system("clear || cls") limpa a tela, independente de qual sistema você esteja usando.

Nota-se que, enquanto continuar=1, o laço WHILE continua a ocorrer e só termina quando 'continuar' receber valor 0.

Se digitarmos 's' o primeiro case é selecionado. Como ele não tem break, o próximo também ocorre, que é o case caso opcao='S'.
Esse tem break. Ou seja, pra continuar a repetir basta digitar 'S' ou 's'.

Se digitar 'n', vai cair no case onde opcao='n' e onde opcao='N', pois não tem break no opcao='n'.
Então, 'continuar' recebe valor 0 e o laço WHILE termina.


Exemplo:
Suponha que você atrasou uma conta. A cada mês que você deixa de pagar, será cobrado 1% de juros no valor inicial.
Ou seja, se você atrasar um mês, irá pagar 1%. Se atrasar 3 meses, irá pagar 3% etc.
Vamos supor que você pode atrasar, no máximo, 5 meses.

O programa pede, como entrada, dois valores:
- um float: com o valor de sua dívida inicial (valor_i)
- um inteiro: de 0 até 5, que são os meses de atraso.

Faça um programa em C que calculo o juros de atraso. Use switch e case acumulados.

#include <stdio.h>

int main(void)
{
        float valor_i,
              valor_f;
        int   juros=0;

        int meses;

        printf("Qual o valor inicial da dívida: ");
        scanf("%f", &valor_i);

        printf("Você vai atrasar quantos meses [1-5]?: ");
        scanf("%d", &meses);

        switch( meses )
        {
            case 5:
                juros++;
            case 4:
                juros++;
            case 3:
                juros++;
            case 2:
                juros++;
            case 1:
                juros++;
                break;
            default:
                printf("Você não digitou um valor válido de meses\n");

        }
        printf("Juros: %d%\n",juros);
        valor_f=( (1 + (juros/100.0))*valor_i);
        printf("Valor final da dívida: R$ %.2f\n", valor_f);

}


Caso tenha atrasado 5 meses, o valor da variável 'juros' é incrementado 5 vezes.
Se atrasou 4 meses, o 'juros' é incrementado 4 vezes, e assim por diante.


Exercício:
Crie um programa que receba um inteiro, de 1 até 12, representando os meses do ano e retorne o número de dias do mês.
Use switch e não use break. Acumule os case.

6 comentários:

Lucas Rosimo disse...

O código está correto, porém para aparecer o % no juros, deve-se modificar a linha
printf("Juros: %d%\n",juros);
por
printf("Juros: %d%%\n",juros);
com %% pois assim ele aparecerá na tela do usuario.

O código completo ficará assim:
#include

int main(void)
{
float valor_i,
valor_f;
int juros=0;

int meses;

printf("Qual o valor inicial da dívida: ");
scanf("%f", &valor_i);

printf("Você vai atrasar quantos meses [1-5]?: ");
scanf("%d", &meses);

switch( meses )
{
case 5:
juros++;
case 4:
juros++;
case 3:
juros++;
case 2:
juros++;
case 1:
juros++;
break;
default:
printf("Você não digitou um valor válido de meses\n");

}
printf("Juros: %d%\n",juros);
valor_f=( (1 + (juros/100.0))*valor_i);
printf("Valor final da dívida: R$ %.2f\n", valor_f);

}

Anônimo disse...

Eu gostaria de ajuda com o último exercício:

#include

int
main()
{
int mes, dias;

printf("Digite o numero de um mes? ");
scanf("%d", &mes);

switch(mes)
{
case 1:
dias = 31;
case 2:
dias = 28;
case 3:
dias = 31;
case 4:
dias = 30;
case 5:
dias = 31;
case 6:
dias = 30;
case 7:
dias = 31;
case 8:
dias = 31;
case 9:
dias = 30;
case 10:
dias = 31;
case 11:
dias = 30;
case 12:
dias = 31;
default:
printf("Voce nao digitou mes valido!\n");
break;
}

printf("O mes %d tem %d dias\n", mes, dias);

return 0;
}

Sempre mostra 31 dias e sempre mostra a mensagem padrão.

Anônimo disse...

Eu gostaria de tirar uma duvida...

Não entendi o segundo exercicio feito.
Os cases estão numerados em ordem descrecentes tipo isto aqui:

case 5
case 4
case 3
case 2
case 1

Eu não entendi porque tem que se fazer desse jeito...
Não poderia ter feito em ordem creceste?

Tipo isto:
case 1
case 2
case 3
case 4
case 5

Me tirem essa duvida! Ficarei grato.

Anônimo disse...

Não pode, perceba que a partir do primeiro 'case' que entra os demais também são executados(isso ocorre por não haver o break). Se o case 5 for o ultimo por exemplo quando você digitasse 5 o único caso que entraria seria o último acrescentando só um a juros e devolvendo um valor errado de juros = 1.

Rafael Fernandes disse...

Se fizesse na ordem crescente os "Case" não acumulariam no case 5 e sim no case 1. E o resultado seria ao contrário.

Quando você digita 5 o valor acrescenta no case 5, case 4, case 3, case 2 e case 1. Sem parar, pois não tem Break entra eles, resultando em 5 acréscimos ou 5% de juros.

Mateus Souza disse...

Anônimo, Sim, você pode colocar eles em ordem crescente.

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.