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 IF Programação de Computadores Objetivos da Aula Aprender a usar a instrução de desvio if, if else e suas variantes A instrução if A instrução if else Encadeando if else's Operadores Lógicos Introdução Computadores fazem mais que armazenar dados e repetir instruções Eles agem de forma inteligente Uma das formas de prover inteligência a um programa é permiti-lo tomar decisões C++ possui duas instruções de tomada de decisão: A instrução if A instrução switch A Instrução if Utiliza-se a instrução if quando um programa deve decidir se ele faz uma determinada ação Se a nota for maior que 7 o aluno está aprovado Se o sensor detectar movimento dispare o alarme Se os objetos colidirem emita o som de explosão Se o nível do rio exceder o limite abra a comporta A instrução if possui duas formas: if if else A Instrução if A instrução if executa uma instrução ou bloco de instruções se a condição for satisfeita if (condição) instrução Testa se a condição é verdadeira Instrução (ou bloco de instruções) a ser executada A Instrução if instrução1; if (condição) instrução2; instrução3; instrução 1 instrução 3 instrução 2teste if falso verdadeiro A Instrução if A condição é freqüentemente uma expressão relacional, como aquelas usadas nos loops Da mesma forma que nos testes dos loops, a expressão de teste é convertida para um valor booleano: Zero é convertido para false Qualquer valor não nulo é convertido para true Se a condição é falsa a instrução (ou bloco de instruções) é simplesmente saltada A Instrução if #include <iostream> using namespace std; int main() { char ch; int espacos = 0; int total = 0; cin.get(ch); while (ch != '.') // encerra no final da frase { if (ch == ' ') // verifica se ch é um espaço ++espacos; ++total; // total de caracteres cin.get(ch); } cout << espacos << " espaços e " << total; cout << " caracteres na frase.\n"; system("pause"); return 0; } A Instrução if Saída do Programa: ++espacos é executado apenas quando o caractere é um espaço ++total é executado para cada ciclo do loop while O desenhista era um visionário. 3 espaços e 30 caracteres na frase. A Instrução if else O if else decide qual de duas instruções ou dois blocos de instruções é executado if (condição) instrução1 else instrução2 Testa se a condição é verdadeira Instrução executada se a condição é falsa Instrução executada se a condição é verdadeira A Instrução if else instrução1; if (condição) instrução2; else instrução3; instrução4; instrução 1 instrução 4 instrução 2teste if else falso verdadeiro instrução 3 A Instrução if else #include <iostream> using namespace std; int main() { char ch; cout << "Digite, que eu repito.\n"; cin.get(ch); while (ch != '.') // encerra no final da frase { if (ch == '\n') cout << ch; // imprime a nova linha else cout << ++ch; // imprime outro caractere cin.get(ch); } cout << "\nPor favor desculpe a confusão\n"; system("pause"); return 0; } A Instrução if else Saída do Programa: Tente usar ch + 1 no lugar de ++ch para ver um efeito interessante O segredo está em como cout trata tipos diferentes Digite, que eu repito. Eu estou muito satisfeito Fv!ftupv!nvjup!tbujtgfjup em usar esse maravilhoso computador. fn!vtbs!fttf!nbsbwjmiptp!dpnqvubeps Por favor desculpe a confusão Formatando if else Se o programador desejar executar mais de uma instrução num if ou if else é preciso delimitar blocos com o uso de chaves if (ch == 'S') { afavor++; cout << "Mais um usuário a favor.\n"; } else { contra++; cout << "Esse usuário é contra.\n"; } Formatando if else A primeira formatação enfatiza a estrutura de blocos, enquanto esta aproxima mais o bloco das palavras if e else if (ch == 'S') { afavor++; cout << "Mais um usuário a favor.\n"; } else { contra++; cout << "Esse usuário é contra.\n"; } Formatando if else Enquanto o anterior aproxima mais o bloco das palavras if e else, esta formatação aproxima mais os blocos um do outro if (ch == 'S') { afavor++; cout << "Mais um usuário a favor.\n"; } else { contra++; cout << "Esse usuário é contra.\n"; } A instrução if else pode ser estendida se for necessário escolher entre mais de duas opções if (ch == 'A') letraA++; else if (ch == 'B') letraB++; else outra++; Aninhando if else Um if (ou if else) é tratado como uma única instrução Aninhando if else A construção if else pode ser reorganizada com a formatação abaixo Porém não existe uma instrução chamada else if, como essa formatação faz parecer if (ch == 'A') letraA++; else if (ch == 'B') letraB++; else if (ch == 'C') letraC++; Aninhando if else #include <iostream> using namespace std; const int Fav = 27; int main() { int n; cout << "Digite um número entre 0 e 100 para "; cout << "descobrir meu favorito: "; do { cin >> n; if (n < Fav) cout << "Muito baixo, tente novamente: "; else if (n > Fav) cout << "Muito alto, tente novamente: "; else cout << Fav << " é o meu favorito!\n"; } while (n != Fav); system("pause"); return 0; } Aninhando if else Saída do Programa: Reverta a expressão de comparação de igualdade para prevenir erros Digite um número entre 0 e 100 para descobrir meu favorito: 50 Muito alto, tente novamente: 25 Muito baixo, tente novamente: 37 Muita alto, tente novamente: 31 Muito alto, tente novamente: 27 27 é meu favorito! if (num = 3) // atribuição indesejada if (3 == num) // mesmo que if (num == 3) if (3 = num) // erro na compilação Expressões Lógicas Freqüentemente é necessário testar mais que uma condição: Para um caractere ser minúsculo ele deve ser maior ou igual a 'a' e menor ou igual a 'z' Um aluno está reprovado direto se ele tiver média final inferior a 3.5 ou mais de 15 faltas Para suprir essa necessidade C++ oferece três operadores lógicos: OU (||), E (&&) e NÃO (!) Operador Lógico OU A expressão com OU lógico é verdadeira quando uma ou ambas as condições são verdadeiras, de acordo com a tabela verdade abaixo: A B A OU B 0 0 0 1 0 1 0 1 1 1 1 1 Operador Lógico OU O operador C++ equivalente ao OU Lógico é o operador || O operador || tem uma precedência menor que os operadores relacionais, por isso os parênteses não são necessários neste exemplo 5 > 3 || 5 > 10 // true || false = true 5 > 8 || 5 < 10 // false || true = true 5 < 8 || 5 > 2 // true || true = true 5 > 8 || 5 < 2 // false || false = false Operador Lógico OU O operador || é um ponto de seqüência, qualquer mudança feita do lado esquerdo ocorre antes da avaliação da expressão do lado direito Se a variável i tem inicialmente o valor 10, ela terá o valor 11 no momento da comparação com j Além disso, C++ não avaliará a expressão a direita se a expressão a esquerda é verdadeira i++ < 6 || i == j Operador Lógico OU #include <iostream> using namespace std; int main() { cout << "Este programa pode formatar seu disco rígido\n" "e destruir todos os seus dados.\n" "Você deseja continuar? <s/n> "; char ch; cin >> ch; if (ch == 's' || ch == 'S') cout << "Você foi avisado!\a\a\n"; else if (ch == 'n' || ch == 'N') cout << "Uma escolha sábia... Tchau!\n"; else cout << "Você não respondeu corretamente," "eu devia apagar seu disco!\n"; system("pause"); return 0; } Operador Lógico OU Saída do Programa: O programa lê apenas um caractere, mesmo que o usuário responda NÃO, apenas o N será lido pelo programa Este programa pode formatar seu disco rígido e destruir todos os seus dados. Você deseja continuar? <s/n> N Uma escolha sábia...Tchau! Operador Lógico E A expressão com E lógico é verdadeira apenas quando ambas as condições são verdadeiras, de acordo com a tabela verdade abaixo: A B A E B 0 0 0 1 0 0 0 1 0 1 1 1 Operador Lógico E O operador C++ equivalente ao E Lógico é o operador && O operador && tem uma precedência menor que os operadores relacionais, por isso os parênteses não são necessários neste exemplo 5 == 3 && 4 == 4 // false && true = false 5 > 3 && 5 > 10 // true && false = false 5 < 8 && 5 < 10 // true && true = true 5 > 8 && 5 < 2 // false && false = false Operador Lógico E O operador && é um ponto de seqüência, qualquer mudança feita do lado esquerdo ocorre antes da avaliação da expressão do lado direito Se a variável i tem inicialmente o valor 10, ela terá o valor 11 no momento da comparação com j Além disso, C++ não avaliará a expressão a direita se a expressão a esquerda é falsa i++ < 6 && i == j Operador Lógico E #include <iostream> using namespace std; const int VetTam = 6; int main() { float idades[VetTam]; cout << "Entre com a idade dos seus vizinhos.\n" "O programa termina quando você tiver " << VetTam << " entradas ou digitar um " "valor negativo.\n"; cout << "Primeiro valor: "; int temp; cin >> temp; int i = 0; while (i < VetTam && temp >= 0) { idades[i++] = temp; cout << "Próximo valor: "; cin >> temp; } continua Operador Lógico E if (i == 0) cout << "Sem dados, tchau!\n"; else { cout << "Entre com sua idade: "; int voce; cin >> voce; int cont = 0; for (int j = 0; j < i; j++) if (idades[j] > voce) ++cont; cout << cont; cout << " dos seus vizinhos são mais velhos que você."; } system("pause"); return 0; } Operador Lógico E Saída do Programa: O programa usa um contador para guardar quantos valores obedecem a uma condição Entre com a idade dos seus vizinhos. O programa termina quando você tiver 6 entradas ou digitar um valor negativo. Primeiro valor: 39 Próximo valor: 45 Próximo valor: 19 Próximo valor: 28 Próximo valor: -1 Entre com sua idade: 20 3 dos seus vizinho são mais velhos que você. Operador Lógico E #include <iostream> using namespace std; const char * qualifica[4] = // vetor de ponteiros para char { "jovem.\n", "adulto.\n", "velho.\n", "bebê.\n" }; int main() { int idade, indice; cout << "Entre com sua idade em anos: "; cin >> idade; if (idade > 17 && idade < 35) indice = 0; else if (idade >= 35 && idade < 50) indice = 1; else if (idade >= 50 && idade < 65) indice = 2; else indice = 3; cout << "Você se qualifica na categoria " << qualifica[indice]; return 0; system("pause") } Operador Lógico E Saída do Programa: Observe que para o teste da faixa de valores o operador && deve unir duas expressões relacionais Entre com sua idade em anos: 87 Você se qualifica na categoria bebê. if (idade > 17 && idade < 35) // OK if (17 < idade < 35) // Não faça isso if ((17 < idade) < 35) // Sempre verdadeiro Operador Lógico NÃO O operador lógico de negação inverte o valor verdade da expressão, tornando-a falsa se ela é verdadeira, e verdadeira se ela é falsa O operador C++ equivalente a negação é o operador ! A NÃO A 0 1 1 0 Operador Lógico NÃO Muitas vezes uma relação pode ser expressa de forma mais clara sem o operador de negação Porém ele é muito útil para usar com funções que retornam zero em caso de sucesso A função strcmp(s1, s2) retorna zero se as strings s1 e s2 são iguais if (!(x > 5)) // a mesma coisa que if (x <= 5) if (!strcmp(s1,s2)) // se as strings são iguais... Operador Lógico NÃO #include <iostream> #include <climits> using namespace std; bool is_int(double); int main() { cout << "Entre com um valor inteiro: "; double num; cin >> num; while (!is_int(num)) // repete enquanto não é um inteiro { cout << "Fora da faixa, tente novamente: "; cin >> num; } int val = int (num); // type cast cout << "Você digitou o inteiro " << val << "\nTchau!\n"; return 0; system("pause") } Operador Lógico NÃO Saída do Programa: bool is_int(double x) { if (x <= INT_MAX && x >= INT_MIN) return true; else return false; } Entre com um valor inteiro: 6234128679 Fora da faixa, tente novamente: -8000222333 Fora da faixa, tente novamente: 99999 Você digitou o inteiro 99999 Tchau! Operadores Lógicos Os operadores lógicos E e OU tem uma precedência menor que os relacionais O operador lógico NÃO tem uma precedência maior que os operadores relacionais ou aritméticos x > 5 && x < 10 // equivalente a (x > 5) && (x < 10) !(x > 5) // falso se x maior que 5 !x > 5 // sempre falso, !x é convertido para 1 ou 0 Operadores Lógicos O operador lógico E tem uma precedência maior que o operador lógico OU Recomenda-se o uso de parênteses para aumentar a legibilidade e clareza do código // equivalente a (x > 30 && x < 45) || y > 300 x > 30 && x < 45 || y > 300 (idade > 50) || ((peso > 80) && (donativo > 1000)) Conclusão A instrução if e if else permitem executar desvios na execução de um programa if if else If else's aninhados Os operadores lógicos podem ser usados para construir condições complexas para o desvio da execução &&, || e !
Compartilhar