Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

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.

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

Anônimo disse...

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

Kel disse...

#include
#include

int main()
{
int mes;

printf("digite o mes\n");
scanf("%i", &mes);

switch(mes)
{
case 1:
printf("mes 1 tem 31 dias\n");

case 2:
printf("mes 2 tem 29 dias\n");

case 3:
printf("mes 3 tem 31 dias\n");

case 4:
printf("mes 4 tem 30 dias\n");

case 5:
printf("mes 5 tem 31 dias\n");

case 6:
printf("mes 6 tem 30 dias\n");

case 7:
printf("mes 7 tem 30 dias\n");

case 8:
printf("mes 8 tem 31 dias\n");

case 9:
printf("mes 9 tem 30 dias\n");

case 10:
printf("mes 10 tem 31 dias\n");

case 11:
printf("mes 11 tem 30 dias\n");

case 12:
printf("mes 12 tem 31 dias\n\n");

default:
printf("Digite um mes valido!!\n");
break;
}

return 0;
}

Unknown disse...

#include
#include
int main()
{
int mes=1;
while(mes!=0)
{
printf("Informe um numero de 1 a 12: ");
scanf("%d", &mes);
switch (mes)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
printf("O mês tem 31 dias\n"); break;
case 4: case 6: case 9: case 11:
printf("O mês tem 30 dias\n"); break;
case 2:
printf("o mes tem 28 dias\n"); break;
}
}
system("pause");
}

Anônimo disse...

Sem sombra de dúvidas que você pode colocar ele na forma crescente!

Unknown disse...

segue o exercício:

#include
#include
int main (void){
setlocale(LC_ALL , "portuguese");
char opcao;
float num1,num2;
printf("\t\t\nCalculadora Básica\n");
printf("\t\t\n As operações matemáticas , são :");

printf("*. Multiplicação\n");
printf("/. Divisão\n");
printf("+. Adição\n");
printf("-. Subtração\n");

printf("\t\t\n Insira a operação matemática: ");
scanf("%c",&opcao);

switch (opcao){
case '*':
printf("digite o primeiro numero");
scanf("%f", &num1);
printf("digite o segundo numero");
scanf("%f", &num2);
printf("%.1f * %.1f = %f",num1 ,num2 ,num1 * num2);
break;
case '/':
printf("digite o primeiro numero");
scanf("%f", &num1);
printf("digite o segundo numero");
scanf("%f", &num2);
printf("%.1f / %.1f = %.1f",num1 ,num2 ,num1/num2);
break;
case '+':
printf("digite o primeiro numero");
scanf("%f", &num1);
printf("digite o segundo numero");
scanf("%f", &num2);
printf("%.1f + %.1f = %.1f", num1,num2 ,(num1 + num2) );
break;
case '-':
printf("digite o primeiro numero");
scanf("%f", &num1);
printf("digite o segundo numero");
scanf("%f", &num2);

printf("%.1f - %.1f = %.1f" ,num1,num2 ,(num1 - num2));
break;
default:
printf("você digitou a operação errada");
break;

}

}

Anônimo disse...

Me ajudem!
Faça um programa que dado o valor de uma divida que cresce a juros 2,5% ao mês e o valor de uma aplicação com rendimento de 4% ao mês, escrever um algoritimo que determina o número de meses necessários para pagar a divida.

Unknown disse...

#include
#include
#include
#include

using namespace std;
int main (void)
{
setlocale(LC_ALL, "Portuguese");
int mes, dias = 29;
cout << "Digite o número do mês que deseja saber a quantia de dias: ";
cin >> mes;

if (mes < 13){
switch (mes){
case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:
dias ++;
case 4:

case 6:

case 9:

case 11:
dias ++;
case 2:
;
}
cout << "O mês " << mes << " tem " << dias << " dias!\n";
}else{
cout << "Este número não representa um mês.\n";
}
getch();
}

Lucas Barboza disse...

Não consigo compilar o exemplo que limpa a tela (system("clear")), o GCC diz que é uma função com declaração implícita!

Anônimo disse...

Respondendo a pergunta do amigo ali em cima, seu mês só da 31 porque não tem break no meio, coloque break depois de dias e vai dar certo.

Anônimo disse...

#include
#include
int main()
{
setlocale(LC_ALL,"portuguese");

int iNum,iDias=28;
printf("Escolha um número de 1 á 12: ");
scanf("%d",&iNum);
if((iNum<=0)||(iNum>=13))
{
printf("Sabe ler não?");
}
else
{
switch(iNum)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
iDias++;

case 4:
case 6:
case 9:
case 11:
iDias++;

case 2:
if(iNum==2)
{
printf("Por padrão decidimos representar fevereiro com 29 dias\n");
}
iDias++;
printf("%d dias\n",iDias);
break;
}

}

return 0;

}

Anônimo disse...

#include

using namespace std;
//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.

int main(){

int a, soma, b;
float subtracao, multiplicacao, divisao;
int operacao;

cout << "Qual operacao deseja fazer? 1 para Soma | 2 para Subtracao | 3 para divisao | 4 para multiplicacao " << endl;
cin >> operacao;

cout << "qual primeiro numero" << endl;
cin >> a;
cout << "qual segundo numero" << endl;
cin >> b;


switch ( operacao ){
case 1:
cout << "A soma he: " << endl;
soma=a+b;
cout << soma << endl;
break;

case 2:
cout << "A subtracao he: " << endl;
subtracao=a-b;
cout << subtracao << endl;
break;

case 3:
cout << "A multiplicacao he: " << endl;
multiplicacao=a*b;
cout << multiplicacao << endl;
break;

case 4:
cout << "A divisao he: " << endl;
divisao=a/b;
cout << divisao << endl;
break;

default:
cout << "Escolha a opcao correta" << endl;

}




return 0;
}

Murilo Silva disse...

Por favor me Ajudem, urgente, estou fazendo um sistema de locação de veiculos que já tem valores definidos que são 80, 150 e 300 RS, e na tela do meu programa tem a opção de escolher um dos 3 para passar a tela seguinte, porém quando eu por exemplo escolho o plano de 80 Reais, aparece que deu erro, não passa para a tela seguinte, poderiam me ajudar por favor

float val, produto ;
int valor;
int x=0, opc=0, car=0 , esc, sn,a;
char y,n;

system ("color 8");
do
{
system ("color 3f");
system ("cls");
printf ("\t=============================================================\n");
printf ("\t====================LOCACAO AUTOMOTIVA====================\n");
printf ("\t=============================================================\n\n");


printf ("Sua frota de carros possui 3 Categorias\n\n");
printf ("\n1 - Basico : R$ 80,00\n");
printf("\n2 - Intermediario : R$ 150,00\n");
printf("\n3 - Executivo : R$ 300,00\n");
printf("Escolha uma das opcoes acima: ");
scanf ("%d", &opc);

switch (opc)
{
case'1':
printf ("Voce escolheu a frota basica de 80 Reais");
break;

case'2':
printf ("Voce escolheu a frota intermediario de 150 Reais");
break;

case'3':
printf ("Voce escolheu a frota executiva de 300 Reais");
break;

default:
printf("\nOpcao Invalida, tente outra vez\n.");
}

Esse aí é o código que está no meu compilador, Obrigado!!!

Unknown disse...

Pessoal, eu estava praticando funcoes de repeticao.
Fiz uma tabuada com while, do while e for. Bem simples fui tentar utilizar o switch e nao me veio nenhuma forma interessante fazer o codigo. Alguem me fala se da e qual logica eu uso.

Unknown disse...

Para o exercício dos dias do mês:

#include

int main(void)
{
int mes, dias=28;

printf("Qual mes voce deseja saber a quantidade de dias? ");
scanf("%d", &mes);

switch(mes)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dias+=1;
case 4:
case 6:
case 9:
case 11:
dias+=2;
case 2:
default:
if (mes<=0 || mes>12)
printf("\nMes invalido!");
else
{
printf("O mes %d tem %d dias.",mes, dias);
}
return 0;

}
}

Unknown disse...

Me ajudem por favor com essa programa em linguagem c.
Um vendedor quer um programa que lhe ajuda calcular o montante que cliente deve pagar na compra de 6 maçãs com desconto de 10% por cada maçã e na compra de mais de 6 ate 12 sera descontado 20% por cada maçã e mais do que 12 sera descontado 30% em toda compra.

Anônimo disse...

Na questao de juros,pq na formula de tem +1?alguem me explica por favor!