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
letra
com ochar
‘a’. É como se estivéssemos fazendo:if (letra == 'a') ...
Caso esse condicional funcione, tudo escrito após os dois pontos (:
) até o primeirobreak
ou o fim do escopo serão executados. - Linha 11: caso o condicional anterior (comparação de letra com ‘a’) dê verdadeiro, esse
break
fará 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
default
dentro de cadaswitch
utilizado no programa. Ele que determina o caso geral, ou seja, se não casar com nenhum caso antes dele, ele será executado. Odefault
sempre 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!!