Baixe o app para aproveitar ainda mais
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
Compartilhar