Baixe o app para aproveitar ainda mais
Prévia do material em texto
A6:Seleção dupla (if-else) e Aninhamento Julio Toss jtoss@inf.ufrgs.br Algoritmos e Programação 1 INF01202 – Algoritmos e Programação, 2018/01, Turmas G, H , K e L *adaptado do material da prof. Mariana e do prof. Marcelo Walter Atenção: O material aqui contido não substitui a leitura do livro texto e é incompleto sem a apresentação do professor em aula. 2 Última Aula Operadores lógicos Operadores relacionais Expressões lógicas Seleção simples && V F V V F F F F || V F V V V F V F ! V F F V Ordem Operador 1 (maior) ! funções 2 * / % 3 + - 4 < > <= >= 5 == != 6 && 7 || 3 Última aula: localização do ponto Dados um par de valores x e y, que representam as coordenadas de um ponto no plano, determinar a localização do ponto: se em um quadrante, em um dos eixos ou na origem. if ( expressão lógica ) instrução; if ( expressão lógica ) { instrução 1; instrução 2; ...; } 4 Última aula: localização do ponto Dados um par de valores x e y, que representam as coordenadas de um ponto no plano, determinar a localização do ponto: se em um quadrante, em um dos eixos ou na origem. if ( expressão lógica ) instrução; if ( expressão lógica ) { instrução 1; instrução 2; ...; } 5 Entrada: coordenadas x e y Saída: mensagem indicando localização da coordenada no plano Objetivo: dadas as coordenadas, avaliar seus valores e determinar onde o ponto se encontra: se em um quadrante (e qual, especificamente), se em um eixo ou se na origem Última aula: localização do ponto /* Obtem coordenadas e informa localização */ #include <stdio.h> int main() { float x , y; // pontos são valores reais printf("\n Coordenadas: x = "); scanf("%f", &x); printf(" e y = "); scanf("%f", &y); if ( x == 0 && y == 0 ) printf("\n Ponto na origem"); if ( x > 0 && y > 0 ) printf("\n Ponto no quadrante 1"); if ( x < 0 && y > 0 ) printf("\n Ponto no quadrante 2"); // continua... 6 // continuacao… if ( x < 0 && y < 0 ) printf("\n Ponto no quadrante 3"); if ( x > 0 && y < 0 ) printf("\n Ponto no quadrante 4"); if ( x == 0 && y != 0 ) printf("\n Ponto no eixo dos y"); if ( x != 0 && y == 0 ) printf("\n Ponto no eixo dos x"); printf("\n"); return 0; } Última aula: localização do ponto /* Obtem coordenadas e informa localização */ #include <stdio.h> int main() { float x , y; // pontos são valores reais printf("\n Coordenadas: x = "); scanf("%f", &x); printf(" e y = "); scanf("%f", &y); if ( x == 0 && y == 0 ) printf("\n Ponto na origem"); if ( x > 0 && y > 0 ) printf("\n Ponto no quadrante 1"); if ( x < 0 && y > 0 ) printf("\n Ponto no quadrante 2"); // continua... 7 // continuacao… if ( x < 0 && y < 0 ) printf("\n Ponto no quadrante 3"); if ( x > 0 && y < 0 ) printf("\n Ponto no quadrante 4"); if ( x == 0 && y != 0 ) printf("\n Ponto no eixo dos y"); if ( x != 0 && y == 0 ) printf("\n Ponto no eixo dos x"); printf("\n"); return 0; } Podemos melhorar? Veremos nesta aula como evitar testes desnecessários... Seleção (desvio condicional) Seleção simples: 1 decisão, 1 ação (agir ou não agir?) 1 decisão, múltiplas ações Seleção dupla: 1 decisão, 2 possíveis caminhos Aninhamento 8 Seleção (desvio condicional) Seleção simples: 1 decisão, 1 ação (agir ou não agir?) 1 decisão, múltiplas ações Seleção dupla: 1 decisão, 2 possíveis caminhos Aninhamento 9 Seleção dupla: se (condição) então (A1) senão (A2) Definição: Permite definir um entre dois comportamentos possíveis, baseando-se no resultado da expressão lógica Sintaxe: if ( expressão lógica ) instrução; else instrução; if ( expressão lógica ) { instrução 1; ...; instrução n; } else { instrução 1; ...; instrução n; } 10 Seleção dupla: exemplo, números negativos #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( num < 0 ) printf("numero negativo\n"); if ( num >= 0) printf("numero positivo\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( num < 0 ) printf("numero negativo\n"); else printf("numero positivo\n"); return 0; } 11 Dado um número inteiro, indicar se o mesmo é positivo ou negativo. Duas versões: seleção simples e seleção dupla Seleção dupla: como encontrar múltiplos de 5? #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( ) printf("multiplo de 5\n"); if ( ) printf("nao multiplo de 5\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( ) printf("multiplo de 5\n"); else printf("nao multiplo de 5\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( (num % 5) == 0 ) printf("multiplo de 5\n"); if ( (num % 5) != 0 ) printf("nao multiplo de 5\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( (num % 5) == 0 ) printf("multiplo de 5\n"); else printf("nao multiplo de 5\n"); return 0; } 12 Seleção dupla: como encontrar números pares? #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( ) printf("numero par\n"); if ( ) printf("numero impar\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( ) printf("numero par\n"); else printf("numero impar\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( !(num % 2) ) printf("numero par\n"); if ( num % 2 ) printf("numero impar\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( !(num % 2) ) printf("numero par\n"); else printf("numero impar\n"); return 0; } 13 Seleção dupla: problema, triângulos Dados três valores inteiros indicando comprimentos, verifique se eles formam um triângulo. Caso positivo, calcule a área e o perímetro do triângulo. Caso negativo, exiba a mensagem: “os lados não formam um triângulo”. *Considere que os valores estão ordenados de maior a menor! 14 Seleção dupla: problema, triângulos Dados três valores inteiros indicando comprimentos, verifique se eles formam um triângulo. Caso positivo, calcule a área e o perímetro do triângulo. Caso negativo, exiba a mensagem: “os lados não formam um triângulo”. *Considere que os valores estão ordenados de maior a menor! 15 Lembrando: condição de existência de um triângulo. Supondo que as medidas dos lados sejam a, b e c, a condição de existência é: a < b + c b < a + c c < a + b Ou, de forma simplificada, a existência do triângulo é garantida quando a soma dos dois lados menores do triângulo for maior que o comprimento do maior lado. Seleção dupla: problema, triângulos /* Dados 3 valores inteiros indicar se formam um triangulo e em caso positivo imprimir area e o perimetro.*/ #include <stdio.h> #include <math.h> int main() { int a, b, c, p; //p = perimetro floatsp,area; //sp = semiperimetro, usado no calculo da area printf("Digite os tres valores, ordenados de maior para menor: "); scanf("%d%d%d", &a, &b, &c); //assumimos que o usuario digitara corretamente if ((b+c) > a){ p = a + b + c; sp = p/2.0; area = sqrt(sp*(sp - a)*(sp - b)*(sp - c)); //usando formula de Heron (A = √(sp.(sp-a).(sp-b).(sp-c)) ) printf("Os lados formam um triangulo de area %.2f e perimetro %d\n",area, p); } else printf("Os lados nao formam um triangulo!\n"); return 0; } 16 Seleção dupla: números negativos v2 #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( num < 0 ) printf("numero negativo\n"); if ( num > 0) printf("numero positivo\n"); if ( num == 0) printf("zero\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( num < 0 ) printf("numero negativo\n"); else printf("numero positivo\n"); if ( num == 0) printf("zero\n"); return 0; } 17 Dado um número inteiro, indicar se o mesmo é zero, positivo ou negativo. Estes códigos funcionam como esperado? Seleção dupla: números negativos v2 #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( num < 0 ) printf("numero negativo\n"); if ( num > 0) printf("numero positivo\n"); if ( num == 0) printf("zero\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( num < 0 ) printf("numero negativo\n"); else printf("numero positivo\n"); if ( num == 0) printf("zero\n"); return 0; } 18 Digite um numero: 0 numero positivo zeroMANTRA: “O Computador faz exatamente o que eu mando ele fazer” Digite um numero: 0 zero Dado um número inteiro, indicar se o mesmo é zero, positivo ou negativo. Estes códigos funcionam como esperado? Seleção (desvio condicional) Seleção simples: 1 decisão, 1 ação (agir ou não agir?) 1 decisão, múltiplas ações Seleção dupla: 1 decisão, 2 possíveis caminhos Aninhamento 19 Aninhamento: se (condição) então se (condição) ... Definição: Permite encadear uma série de seleções, criando lógicas mais complexas. Sintaxe: if ( expressão lógica ) if ( expressão lógica ) if ( expressão lógica ) (...) else (...) else (...) else if ( expressão lógica ) (...) 20 Aninhamento: se (condição) então se (condição) ... Para comandos compostos, é obrigatório o uso de ‘{ }’ para delimitar o bloco de código correspondente a cada if / else Exemplo: if ( expressão lógica ) { if ( expressão lógica ) { (...) (...) } else { (...) (...) } } else { if ( expressão lógica ) (...) (...) } 21 Aninhamento: números negativos v2 #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( num < 0 ) printf("numero negativo\n"); if ( num > 0) printf("numero positivo\n"); if ( num == 0) printf("zero\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( num < 0 ) printf("numero negativo\n"); else if ( num != 0) printf("numero positivo\n"); else printf("zero\n"); return 0; } 22 Aninhamento: calculadora (versão alpha) #include <stdio.h> int main() { int n1, n2; char op; printf("Digite um operador e dois numeros inteiros"); scanf("%c %d %d", &op, &n1, &n2); if ( op == '+' ) printf("soma: %d\n", n1 + n2); if ( op == '-' ) printf("subtracao: %d\n", n1 - n2); if ( op == '*' ) printf("multiplicacao: %d\n", n1 * n2); if ( op == '/' ) printf("divisao: %d\n", n1 / n2); return 0; } O que ocorre quando o usuário digita um operador inválido? 23 Aninhamento: calculadora (versão beta) #include <stdio.h> int main() { int n1, n2; char op; printf("Digite um operador e dois numeros inteiros"); scanf("%c %d %d", &op, &n1, &n2); if ( op == '+' ) printf("soma: %d\n", n1 + n2); else if ( op == '-' ) printf("subtracao: %d\n", n1 - n2); else if ( op == '*' ) printf("multiplicacao: %d\n", n1 * n2); else if ( op == '/' ) printf("divisao: %d\n", n1 / n2); else printf("operador invalido"); return 0; } O que ocorre quando o usuário digita 0 (zero) para a variável n2? 24 Aninhamento: calculadora (versão lançamento) #include <stdio.h> int main() { int n1, n2; char op; printf("Digite um operador e dois numeros inteiros"); scanf("%c %d %d", &op, &n1, &n2); if ( op == '+' ) printf("soma: %d\n", n1 + n2); else if ( op == '-' ) printf("subtracao: %d\n", n1 - n2); else if ( op == '*' ) printf("multiplicacao: %d\n", n1 * n2); else if ( op == '/' ) if ( n2 != 0 ) printf("divisao: %d\n", n1 / n2); else printf("divisao por zero!"); else printf("operador invalido"); return 0; } 25 Aninhamento: o que faz o seguinte código? #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( !(num % 2) ) printf("o numero e' par\n"); if ( num == 0 ) printf("o numero e' zero\n"); else printf("o numero e' impar\n"); return 0; } Digite um numero: 0 o numero e' par o numero e' zero Digite um numero: 1 o numero e' impar Digite um numero: 2 o numero e' par o numero e' impar 26 Qual a saída para as entradas 0, 1 e 2? Aninhamento: o que faz o seguinte código? #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( !(num % 2) ) printf("o numero e' par\n"); if ( num == 0 ) printf("o numero e' zero\n"); else printf("o numero e' impar\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( !(num % 2) ) printf("o numero e' par\n"); if ( num == 0 ) printf("o numero e' zero\n"); else printf("o numero e' impar\n"); return 0; } Digite um numero: 0 o numero e' par o numero e' zero Digite um numero: 1 o numero e' impar Digite um numero: 2 o numero e' par o numero e' impar Os trechos em verde e amarelo são independentes. (ou seja, o verde não depende do resultado do if em amarelo.) O else em verde depende do if em verde. 27 Qual a saída para as entradas 0, 1 e 2? Aninhamento: o que faz o seguinte código? #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( !(num % 2) ) printf("o numero e' par\n"); if ( num == 0 ) printf("o numero e' zero\n"); else printf("o numero e' impar\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( !(num % 2) ) printf("o numero e' par\n"); if ( num == 0 )printf("o numero e' zero\n"); else printf("o numero e' impar\n"); return 0; } Digite um numero: 0 o numero e' par o numero e' zero Digite um numero: 1 o numero e' impar Digite um numero: 2 o numero e' par o numero e' impar Os trechos em verde e amarelo são independentes. (ou seja, o verde não depende do resultado do if em amarelo.) O else em verde depende do if em verde. MANTRA: “O Computador faz exatamente o que eu mando ele fazer” 28 Qual a saída para as entradas 0, 1 e 2? Aninhamento: corrigindo #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( !(num % 2) ) printf("o numero e' par\n"); if ( num == 0 ) printf("o numero e' zero\n"); else printf("o numero e' impar\n"); return 0; } #include <stdio.h> int main() { int num; printf("Digite um numero:\n"); scanf("%d", &num); if ( !(num % 2) ) { printf("o numero e' par\n"); if ( num == 0 ) printf("o numero e' zero\n"); } else printf("o numero e' impar\n"); return 0; } 29 Versão correta! Última aula: localização do ponto /* Obtem coordenadas e informa localização */ #include <stdio.h> int main() { float x , y; // pontos são valores reais printf("\n Coordenadas: x = "); scanf("%f", &x); printf(" e y = "); scanf("%f", &y); if ( x == 0 && y == 0 ) printf("\n Ponto na origem"); if ( x > 0 && y > 0 ) printf("\n Ponto no quadrante 1"); if ( x < 0 && y > 0 ) printf("\n Ponto no quadrante 2"); // continua... 30 // continuacao… if ( x < 0 && y < 0 ) printf("\n Ponto no quadrante 3"); if ( x > 0 && y < 0 ) printf("\n Ponto no quadrante 4"); if ( x == 0 && y != 0 ) printf("\n Ponto no eixo dos y"); if ( x != 0 && y == 0 ) printf("\n Ponto no eixo dos x"); printf("\n"); return 0; } Podemos melhorar? Veremos nesta aula como evitar testes desnecessários… Utilizando if-else aninhados! Última aula: localização do ponto/* Obtem coordenadas e informa localização com if-else aninhados - solução 1 */ #include <stdio.h> int main() { float x , y; // pontos são valores reais // solução avalia 2 condições a cada vez – 2 testes lógicos printf("\n Coordenadas: x = "); scanf("%f", &x); printf(" e y = "); scanf("%f", &y); if ( x == 0 && y == 0 ) // identifica a origem printf("\n Ponto na origem"); else if ( x > 0 && y > 0 ) // na sequência, localiza quadrantes printf("\n Ponto no quadrante 1"); else if ( x < 0 && y > 0 ) printf("\n Ponto no quadrante 2"); else if ( x < 0 && y < 0 ) printf("\n Ponto no quadrante 3"); else if ( x > 0 && y < 0 ) printf("\n Ponto no quadrante 4"); else if ( x == 0 && y != 0 ) // eixo y printf("\n Ponto no eixo dos y"); else // sobrou x != 0 && y == 0 , nem precisa testar! printf("\n Ponto no eixo dos x"); printf("\n"); } 31 Última aula: localização do ponto/* Obtem coordenadas e informa localização com if-else aninhados - solução 2 */#include <stdio.h> int main() { float x , y; // pontos são valores reais printf("\n Coordenadas: x = "); scanf("%f", &x); printf(" e y = "); scanf("%f", &y); if ( x == 0 ) // x = 0: possibilidade de origem ou eixo y if (y == 0 ) // y também = 0: localizou origem printf("\n Ponto na origem"); else printf("\n Ponto no eixo dos y"); // só pode ser eixo y else // x certamente é diferente de zero: não testa mais! if ( y == 0 ) // localizou eixo x printf("\n Ponto no eixo dos x"); else // só sobraram os quadrantes!!! if ( x > 0 ) // quadrantes 1 ou 4, dependendo de y if ( y > 0 ) printf("\n Ponto no quadrante 1"); else printf("\n Ponto no quadrante 4"); else // x é < 0: sobraram quadrantes 2 e 3, dependendo de y if ( y > 0 ) printf("\n Ponto no quadrante 2"); else // sobrou x < 0 e y < 0: não precisa testar printf("\n Ponto no quadrante 3"); printf("\n"); } 32
Compartilhar