Conteúdo da Aula - 10/06 (switch)
Por favor, estudem o Capítulo 2 do livro texto.
Adicionalmente, esses são os comentários da aula:
Em C, para trabalharmos com condições no seu programa, utilizamos a instrução if. Com ele, podemos ter várias condições em nosso programa, como:
#include <stdio.h>
int main()
{
char letra;
printf("Digite uma letra: ");
scanf("%c", &letra);
if (letra == 'a')
printf("Você digitou uma vogal\n");
if (letra == 'e')
printf("Você digitou uma vogal\n");
if (letra == 'i')
printf("Você digitou uma vogal\n");
if (letra == 'o')
printf("Você digitou uma vogal\n");
if (letra == 'u')
printf("Você digitou uma vogal\n");
}Porém, em programas maiores, tal utilização do if não é adequada, tanto logicamente quanto computacionalmente.
Explicação: se a letra digitada for a, o condicional do primeiro if será verdadeiro, executando assim seu escopo. Da mesma forma, os outros condicionais serão falsos e o computador vai perder processamento ao tentar fazer cada um deles.
Por isso, torna-se necessário fazer os condicionais (if) aninhados, como no exemplo abaixo:
#include <stdio.h>
int main()
{
char letra;
printf("Digite uma letra: ");
scanf("%c", &letra);
if (letra == 'a')
printf("Você digitou uma vogal\n");
else if (letra == 'e')
printf("Você digitou uma vogal\n");
else if (letra == 'i')
printf("Você digitou uma vogal\n");
else if (letra == 'o')
printf("Você digitou uma vogal\n");
else if (letra == 'u')
printf("Você digitou uma vogal\n");
else
printf("Você não digitou uma vogal\n");
}Nesse caso, pode-se notar que sempre comparamos a variável letra com uma constante (‘a’, ‘e’, ‘i’, ‘o’, ‘u’). Para esses casos, a linguagem C possui uma instrução que facilita essa escrita e também o trabalho com sequências de constantes, que é o switch:
switch (variavel)
{
case constante1:
instrucao_1;
instrucao_2;
...
break;
case constante2:
instrucao_1;
instrucao_2;
...
break;
...
default
instrucao_1;
instrucao_2;
...
}Utilizando o switch, o último exemplo pode ser reescrito assim:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
int main()
{
char letra;
printf("Digite uma letra: ");
scanf("%c", &letra);
switch (letra)
{
case 'a':
printf("Você digitou uma vogal\n");
break;
case 'e':
printf("Você digitou uma vogal\n");
break;
case 'i':
printf("Você digitou uma vogal\n");
break;
case 'o':
printf("Você digitou uma vogal\n");
break;
case 'u':
printf("Você digitou uma vogal\n");
break;
default:
printf("Você não digitou uma vogal\n");
}
}
Explicação:
- Linha 7: instrução
switch, que vai colocar em evidência, ou seja, vai obter o valor da variável que está entre parênteses (nesse caso,letra) e vai comparar com todos oscase(s) dentro de seu escopo (código dentro de suas chaves). - Linha 9: é nosso primeiro condicional do switch, comparando
letracom ochar‘a’. É como se estivéssemos fazendo:if (letra == 'a') ...
Caso esse condicional funcione, tudo escrito após os dois pontos (:) até o primeirobreakou o fim do escopo serão executados. - Linha 11: caso o condicional anterior (comparação de letra com ‘a’) dê verdadeiro, esse
breakfará com que o código abaixo não seja executado. - Outros case e break: seguem o mesmo padrão explicado acima.
- Linha 24: só pode existir um
defaultdentro de cadaswitchutilizado no programa. Ele que determina o caso geral, ou seja, se não casar com nenhum caso antes dele, ele será executado. Odefaultsempre deve ser colocado no final doswitch, ou seja, depois de todos oscase` existentes nesse escopo.
O código acima ainda possui muita repetição de código. Notem que o printf("Você digitou uma vogal\n"); é repetido 5 vezes. Por isso (e também utilizando o que o switch permite), o código pode ser reescrito melhor da seguinte forma:
#include <stdio.h>
int main()
{
char letra;
printf("Digite uma letra: ");
scanf("%c", &letra);
switch (letra)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
printf("Você digitou uma vogal\n");
break;
default:
printf("Você não digitou uma vogal\n");
}
}E agora, sabendo disso, podemos melhorar ainda mais nosso programa, tomando cuidado com letras maiúsculas e minúsculas:
#include <stdio.h>
int main()
{
char letra;
printf("Digite uma letra: ");
scanf("%c", &letra);
switch (letra)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
printf("Você digitou uma vogal\n");
break;
default:
printf("Você não digitou uma vogal\n");
}
}O switch também permite trabalhar com faixas de valores, desde que eles sejam sequenciais. Leia e estude o exemplo abaixo:
#include <stdio.h>
int main()
{
int idade;
printf("Digite sua idade: ");
scanf("%d", &idade);
switch (idade)
{
case 0 ... 17:
printf("Você é menor de idade\n");
break;
case 18 ... 59:
printf("Você é adulto\n");
break;
case 60 ... 120:
printf("Você é um adulto com experiência\n");
break;
default:
printf("Idade diferente.. você digitou certo?\n");
}
}Ele também é muito utilizado em menu de opções:
#include <stdio.h>
int main()
{
int opt, num1, num2;
printf("Digite a opção desejada:\n");
printf("1 - Mostrar uma frase engraçada.\n");
printf("2 - Dizer bom dia.\n");
printf("3 - Mostrar a soma de dois números.\n");
printf(":: ");
scanf("%d", &opt);
switch (opt)
{
case 1:
printf("O que o pato disse para a pata?\nR.: Vem Quá!\n");
break;
case 2:
printf("Bom diaaaaa!!!!!!!\n");
break;
case 3:
printf("Digite dois números: ");
scanf("%d %d", &num1, &num2);
printf("Soma: %d\n", num1+num2);
break;
default:
printf("Opção inválida\n");
}
}Have fun!!