Buscar

13. Instrução de Desvio Switch

Prévia do material em texto

Ju
d
so
n
 S
an
to
s 
S
an
ti
ag
o
A INSTRUÇÃO DE DESVIO 
SWITCH
Programação de Computadores
Objetivos da Aula
Aprender a usar instruções de desvio 
sozinhas e combinadas com instruções de 
repetição
A biblioteca cctype
O operador ?:
A instrução switch
Switch versus if else
Break e continue
Introdução
 Uma tarefa muito comum em um programa é 
a verificação da entrada do usuário:
 Classificar o dado que o usuário digitou:
 Letras
 Números
 Pontuação
 Etc.
 Esta verificação utiliza instruções de desvio 
para corrigir uma entrada errada
A Biblioteca cctype
 C++ herdou de C um pacote de funções que 
facilita a tarefa de saber se um caractere é 
uma letra, dígito ou pontuação
 isalpha(ch) retorna true se ch é uma letra e false
caso contrário
 ispunct(ch) retorna true apenas se ch é um 
caractere de pontuação
 Estas funções retornam um valor inteiro, mas 
a conversão para bool permite usá-las como 
se retornassem valores booleanos
A Biblioteca cctype
Função Valor de retorno é verdadeiro se o argumento é
isalnum() alfanumérico (letra ou dígito)
isalpha() uma letra do alfabeto
isblank() um espaço ou tabulação
iscntrl() um caractere de controle
isdigit() um dígito decimal (0-9)
islower() uma letra minúscula
ispunct() um caractere de pontuação
isspace() um espaço, tabulação ou nova linha
isupper() uma letra maiúscula
tolower() Se o argumento é um caractere maiúsculo, retorna o 
caractere minúsculo correspondente 
toupper() Se o argumento é um caractere minúsculo, retorna o 
caractere maiúsculo correspondente 
A Biblioteca cctype
 Usar funções da biblioteca cctype é mais 
conveniente do que usar os operadores 
lógicos
 O uso da cctype torna o código mais geral 
porque os operadores lógicos assumem que 
as letras têm códigos seqüenciais (ASCII)
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
if (isalpha(ch))
A Biblioteca cctype
#include <iostream>
#include <cctype>
using namespace std;
int main()
{
cout << "Entre com o texto para análise (@ para sair):\n";
int brancos = 0, digitos = 0, chars = 0, pont = 0, outros = 0;
char ch;
cin.get(ch); // lê o primeiro caractere
while (ch != '@') // testa o caractere sentinela
{
if (isalpha(ch)) chars++; // é uma letra do alfabeto?
else if (isspace(ch)) brancos++; // é um caractere de espaço?
else if (isdigit(ch)) digitos++; // é um dígito?
else if (ispunct(ch)) pont++; // é uma pontuação?
else outros++;
cin.get(ch); // lê o próximo caractere
}
cout << chars << " letras, " << digitos << " digitos "
<< brancos << " espaços, " << pont << " pontuações e "
<< outros << " outros.\n";
return 0;
}
A Biblioteca cctype
 Saída do Programa:
 A contagem de espaços inclui os caracteres 
de nova linha
 Hífens, aspas, vírgulas e pontos contam como 
caracteres de pontuação
Entre com o texto para análise (@ para sair):
Jody "Java-Java" Joystone, renomado crítico de restaurante,
celebrou seu 39o aniversário com uma garrafa de 
Chateau Panda 1982.@
98 letras, 6 dígitos, 17 espaços, 6 pontuações e 0 outros.
O Operador ?:
 O operador condicional ternário ?: pode 
substituir uma instrução if else
 Se a expressão 1 é verdadeira, toda a expressão 
condicional tem o valor da expressão 2, caso 
contrário ela tem o valor da expressão 3
 Exemplos:
Expressão1 ? Expressão2 : Expressão3
5 > 3 ? 10 : 12 // se 5 > 3, a expressão tem valor 10
3 == 9 ? 25 : 18 // se 3 != 9, a expressão tem valor 18
O Operador ?:
#include <iostream>
using namespace std;
int main()
{ 
cout << "Entre com dois inteiros: ";
int a, b;
cin >> a >> b;
cout << "O maior entre " << a << " e " << b;
int c = a > b ? a : b;
cout << " é " << c << endl;
system("pause");
return 0;
}
O Operador ?:
 Saída do Programa:
 A principal parte do programa é a instrução
 Ela produz o mesmo resultado que:
Entre com dois inteiros: 25 28
O maior entre 25 e 28 é 28.
int c = a > b ? a : b;
int c;
if (a > b)
c = a;
else
c = b;
 O operador ?: pode ser usado para construir 
expressões completamente ilegíveis
 O operador condicional é mais adequado 
para expressões simples
 Para expressões complexas use o if else
O Operador ?:
const char x[2][20] = {"Jason ", " a seu serviço"};
const char * y = "Quillstone";
for (int i = 0; i < 3; i++)
cout << ((i < 2) ? !i ? x[i] : y : x[1]);
cout << char( isupper(ch) ? ch : toupper(ch) );
A Instrução switch
 Em muitas aplicações se faz necessário 
escolher uma opção entre uma lista de 
opções
Como você qualifica os preços dessa loja?
1. Barato
2. Moderado
3. Caro
4. Extravagante
5. Excessivo
Digite o número correspondente: [ ]
A Instrução switch
 O problema da seleção pode ser resolvido 
usando uma sequencia de if else's:
cout << "Digite o número correspondente: [ ]\b\b";
int escolha;
cin >> escolha;
if (escolha == 1) 
cout << "Os preços são baratos!";
else if (escolha == 2)
cout << "Os preços são moderados!";
else if (escolha == 3)
cout << "Os preços são caros!";
else if (escolha == 4)
cout << "Os preços são extravagantes!";
else if (escolha == 5)
cout << "Os preços são excessivos!";
else
cout << "Opção inválida!";
A Instrução switch
 A instrução switch permite selecionar mais 
facilmente uma escolha de uma lista extensa
 Ele substitui uma seqüência de if else's
switch (escolha)
{ 
case 1: cout << "Os preços são baratos!";
break;
case 2: cout << "Os preços são moderados!";
break;
case 3: cout << "Os preços são caros!";
break;
case 4: cout << "Os preços são extravagantes!";
break;
case 5: cout << "Os preços são excessivos!";
break;
default: cout << "Opção inválida!";
}
A Instrução switch
 A forma geral de uma instrução switch:
switch(expressão-inteira)
{
case val1: instruções
case val2: instruções
...
default: instruções
}
A expressão deve se reduzir a um valor inteiro 
Se nenhum caso for válido, o caso default é selecionado
Os rótulos val1, val2, etc. 
devem ser constantes 
inteiras.
Tipicamente são 
valores int ou char ou 
constantes de uma 
enumeração
A Instrução switch
 Se a expressão-inteira é igual a um rótulo, a 
execução do programa pula para o rótulo 
selecionado
switch (num)
{
case 1 : instruções 
break;
case 2 : instruções
break;
case 3 : instruções 
break;
case 4 : instruções 
break;
default : instruções
}
se num é 2
A Instrução switch
 Se a expressão-inteira não é igual a nenhum 
dos rótulos, a execução do programa pula
para o rótulo default (opcional)
switch (num)
{
case 1 : instruções 
break;
case 2 : instruções
break;
case 3 : instruções 
break;
case 4 : instruções 
break;
default : instruções
}
se num é 5
#include <iostream>
using namespace std;
void motramenu();
void relatorio();
void bajular();
int main()
{
mostramenu();
int escolha;
cin >> escolha;
while (escolha != 5)
{
mostramenu();
cin >> escolha;
}
system("pause");
return 0;
}
A Instrução switch
switch (escolha)
{
case 1 : cout << "\a\n\n"; 
break;
case 2 : relatorio(); 
break;
case 3 : cout << "Eu estava doente.\n\n"; 
break;
case 4 : bajular(); 
break;
default : cout << "opção inválida.\n\n";
}
Continua 
A Instrução switch
void motramenu()
{
cout << "1) Alarme 2) Relatório\n"
"3) Desculpa 4) Bajulação"
"5) Sair\n"
"Por favor, entre com uma opção: "
}
void relatorio()
{
cout << "Tem sido uma excelente semana para negócios.\n"
"As vendas subiram 120%. Os gastos cairam 35%.\n\n";
}
void bajular()
{
cout << "Seus empregados acham você o melhorchefe\n"
" da indústria. Os seus sócios o consideram\n"
"o melhor empresário do mercado.\n\n";
}
A Instrução switch
 Saída do Programa:
1) Alarme 2) Relatório
3) Desculpa 4) Bajulação
5) Sair
Por favor, entre com uma opção: 4
Seus empregados acham você o melhor chefe
da indústria. Os seus sócios o consideram
o melhor empresário do mercado.
1) Alarme 2) Relatório
3) Desculpa 4) Bajulação
5) Sair
Por favor, entre com uma opção : 6
Opção inválida.
1) Alarme 2) Relatório
3) Desculpa 4) Babação
5) Sair
Por favor, entre com uma opção : 5
A Instrução switch
 Para fazer a execução parar ao final de um 
caso é preciso usar a instrução break
 A instrução break faz com que a execução pule 
para a primeira instrução fora do switch
switch (num)
{
case 1 : instruções
case 2 : instruções
case 3 : instruções 
break;
case 4 : instruções 
break;
default : instruções
}
se num é 2
As instruções dos 
casos 2 e 3 são 
executadas
A Instrução switch
 C++ exige a presença do break para encerrar a 
execução de um caso porque omitir um break 
pode ser útil
char escolha;
cin >> escolha;
switch (escolha)
{
case 'a' : 
case 'A' : cout << "Você escolheu a letra A\n"; 
break;
case 'b' : 
case 'B' : cout << "Você escolheu a letra B\n"; 
break;
default : cout << "Letra inválida.\n";
}
Usando Enumerações
#include <iostream>
using namespace std;
enum {red, orange, yellow, green};
int main()
{
cout << "Entre com o código da cor (0-3): ";
int cor;
cin >> cor;
while (cor >= red && cor <= green)
{
switch (cor)
{
case red : cout << "Seus lábios eram vermelhos.\n"; break;
case orange: cout << "Sua roupa era laranja.\n"; break;
case yellow: cout << "Seus sapatos eram amarelos.\n"; break;
case green : cout << "Seus olhos eram verdes.\n"; break;
}
cout << "Entre com o código da cor (0-3): ";
cin >> cor;
}
cout << "Tchau!\n";
system("pause");
return 0;
}
Usando Enumerações
 Saída do Programa:
 O cin não reconhece os tipos enumerações 
por isso o programa precisa ler a cor como 
um valor inteiro
Entre com o código da cor (0-3): 3
Seus olhos eram verdes.
Entre com o código da cor (0-3): 0
Seus lábios eram vermelhos.
Entre com o código da cor (0-3): 8
Tchau!
switch versus if else
 Ambos permitem fazer uma seleção a partir 
de uma lista de alternativas, porém:
 Faixas de valores 
 O if else pode tratar faixas de valores formadas por 
inteiros ou pontos-flutuantes
 Cada caso do switch deve ser um único valor e este 
valor não pode ser ponto-flutuante
 Lista de valores
 O switch produz código menor e de execução mais 
rápida quando a lista de alternativas é extensa
break e continue
 As instruções break e continue permitem ao 
programa pular partes de código
 break:
 Pode ser usado em loops ou no switch
 Faz com que o programa saia do loop ou switch
 continue:
 É usado em loops e faz o programa pular o resto 
do corpo do loop e iniciar um novo ciclo
break e continue
 A estrutura da instrução break e continue:
while (ch != '@')
{ 
instrução1
if (ch == '\n')
instrução2
}
break;
instrução3
while (ch != '@')
{ 
instrução1
if (ch == '\n')
instrução2
}
continue;
instrução3
break e continue
#include <iostream>
using namespace std;
const int VetTam = 80;
int main()
{
char linha[VetTam];
int espacos = 0;
cout << "Entre com uma linha de texto:\n";
cin.getline(linha, VetTam);
cout << "Linha completa:\n" << linha << endl;
cout << "Linha até o primeiro ponto:\n";
for (int i = 0; linha[i] != '\0'; i++)
{
cout << linha[i]; // mostra caractere
if (linha[i] == '.')
break; // encerra loop se for um ponto
if (linha[i] != ' ')
continue; // pula o resto do loop se não for um espaço
espacos++;
}
cout << "\n" << espacos << " espaços\n";
system("pause");
return 0;
}
break e continue
 Saída do Programa:
 Este programa não precisava usar continue, 
ele poderia ter usado:
Entre com uma linha de texto:
Vamos lanchar agora. Você paga!
Linha Completa:
Vamos lanchar agora. Você paga!
Linha até o primeiro ponto:
Vamos lanchar agora.
2 espaços
if (linha[i] == ' ')
espacos++;
Erros de Leitura
 O que acontece se o usuário digitar um 
caractere em resposta ao código abaixo?
 O valor de n não é modificado
 A entrada inválida é deixada no buffer do teclado
 Uma marca de erro é ligada no objeto cin
 A chamada a cin retorna falso
int n;
cin >> n;
// entrada inválida termina o loop
#include <iostream>
using namespace std;
const int Max = 5;
int main()
{
double peixe[Max];
cout << "Entre com o peso dos peixes.\n";
cout << "Você pode digitar no máximo " << Max 
<< " peixes <s para sair>\n";
cout << "Peixe #1: ";
int i = 0;
while (i < Max && cin >> peixe[i])
{
if (++i < Max) 
cout << "Peixe #" << i+1 << ": ";
}
Erros de Leitura
Continua 
Erros de Leitura
// calcula média
double total = 0.0;
for (int j=0; j < i; j++)
total += peixe[j];
// mostra resultados
if (i == 0)
cout << "Nenhum peixe\n";
else
cout << total / i 
<< " = peso médio de " 
<< i 
<< " peixe(s)\n";
cout << "Tchau!\n";
system("pause");
return 0;
}
Erros de Leitura
 Saída do Programa:
 Quando cin é usado em uma expressão 
condicional ele é convertido para bool
Entre com o peso dos peixes.
Você pode digitar no máximo 5 peixes <s para sair>
Peixe #1: 30
Peixe #2: 35
Peixe #3: 25
Peixe #4: 40
Peixe #5: s
32.5 = peso médio de 4 peixe(s)
while (i < Max && cin >> peixe[i])
Erros de Leitura
 E se quisermos continuar tentando ler um 
valor após uma entrada inválida?
 É necessário executar os seguintes passos:
 Restaurar cin para receber novas entradas
 Retirar a entrada inválida do buffer do teclado
 Pedir ao usuário para digitar novamente
cout << "Digite um número: ";
int n;
if (!(cin >> n))
cout << "Inválido, digite outro: ";
// tratando erros de leitura
#include <iostream>
using namespace std;
const int Max = 5;
int main()
{
double golf[Max];
cout << "Entre com o placar do jogo.\n";
cout << "Você deve digitar " << Max << " rodadas\n";
for (int i = 0; i < Max; ++i)
{
cout << "Rodada #" << i+1 << ": ";
while (!(cin >> golf[i]))
{
cin.clear(); // restaura cin
while (cin.get() != '\n') // remove entrada inválida
continue; 
cout << "Digite um número: "; // digite novamente
}
}
Erros de Leitura
Continua 
Erros de Leitura
// calcula média
double total = 0.0;
for (int j=0; j < Max; j++)
total += golf[j];
// mostra resultados
cout << total / Max 
<< " = placar médio de " 
<< Max 
<< " rodadas\n";
cout << "Tchau!\n";
system("pause");
return 0;
}
Erros de Leitura
 Saída do Programa:
 Quando cin é verdadeiro o código do while é 
saltado e o programa pede a próxima rodada
Entre com o placar do jogo.
Você deve digitar 5 rodadas
Rodada #1: 88
Rodada #2: 87
Rodada #3: E se eu?
Digite um número: 103
Rodada #4: 94
Rodada #5: 86
91.6 = placar médio de 5 rodadas
while (!(cin >> golf[i]))
{
...
}
Conclusão
 Existem duas instruções principais para o 
desvio da execução de um programa:
 if
 switch
 Em expressões simples o operador ?: 
pode ser usado no lugar de um if else 
 As instruções break e continue permitem 
fazer desvios dentro de loops

Outros materiais

Materiais relacionados

Perguntas relacionadas

Perguntas Recentes