Buscar

Aula 06 - if - else e aninhamento

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

Continue navegando