Aula 7 - Mais sobre o comando condicional if
  • Resumo
  • Exercício 1
  • Exercício 2
  • Exercício 3
  • Exercício 4
  • Exercício 5
  • Soluções
Avalie esta aula

Operadores lógicos

Muitas vezes a condição de um comando condicional if envolve mais de uma comparação.

Por exemplo, considere que uma disciplina tenha duas provas, P1 e P2, e o aluno é aprovado se:

  • Média das notas das duas provas é maior do que ou igual a 6.0; E
  • Nota da P2 é maior do que ou igual a 7.0

Um outro exemplo de condição que envolve mais de uma comparação é se quisermos escrever palavra "Parabéns" se:

  • Nota da P1 é igual a 10; OU
  • Nota da P2 é igual a 10.

Quando a condição envolve mais do que uma comparação podemos usar operadores lógicos para construir a expressão condicional do comando if.

Os seguintes operadores lógicos são disponíveis em Javascript:

SímboloOperaçãoExemplo
&&e-lógicomedia >= 6.0 && nota_p1 >= 7.0
||ou-lógiconota_p1 >= 10.0 || nota_p1 >= 10.0

Podemos também usar parênteses para construir expressões condicionais mais complexas, como por exemplo:

if ( (media >= 6.0 && nota_p2 >= 7.0) || 
     (nota_p2 === 10.0 && nota_p1 !== 0.0) ) {
   printf(“Aprovado\n”);
}
else {
   printf(“Reprovado\n”);
}

 

 

Avalie este exercício

Tira-teima

Uma quadra de tênis tem o formato de um retângulo, cujos lados medem 36 pés por 78 pés, que correspondem a um retângulo de 432 polegadas por 936 polegadas. No último Grand Slam da Austrália, Rafael Nadal perdeu para Novak Djoković, num dos jogos mais bonitos de tênis dos últimos tempos. Muitas vezes, uma jogada é tão rápida, e a bola tão próxima da borda da quadra, que o juiz pode tomar uma decisão que pode ser contestada por um dos jogadores. Para isso, existe o tira-teima, que utiliza a imagem gravada do jogo para decidir se a bola estava dentro ou fora da metade da quadra correspondente a um dos jogadores. Considere que a semi-quadra de Rafael Nadal corresponde a um retângulo em que dois vértices têm coordenadas (0,0) e (432, 468), onde todos os números são em polegadas. Você deve escrever um programa para, dadas as coordenadas (X, Y) do ponto de contato da bola com o solo, determinar se uma bola bateu no solo dentro ou fora da semi-quadra. Note que se a bola bate na linha divisória ela é considerada uma bola dentro.

Entrada

A entrada é dada em uma única linha, que contém dois inteiros X e Y, que correspondem às coordenadas do ponto (X, Y) de contato da bola com o solo, em polegadas.

Saída

Seu programa deve imprimir uma única linha, contendo a palavra dentro se a bola bateu dentro da semi-quadra, e a palavra fora caso contrário.

Restrições

  • -500 ≤ X, Y ≤ 500

Exemplos

Entrada
-2 200
Saída
fora

Entrada
432 10
Saída
dentro

Tarefa da OBI2012, Modalidade Programação Júnior, Fase 2

 

 

Avalie este exercício

Zerinho ou Um

Todos devem conhecer o jogo Zerinho ou Um (em algumas regiões também conhecido como Dois ou Um), utilizado para determinar um ganhador entre três ou mais jogadores. Para quem não conhece, o jogo funciona da seguinte maneira. Cada jogador escolhe um valor entre zero ou um; a um comando (geralmente um dos competidores anuncia em voz alta "Zerinho ou... Um!"), todos os participantes mostram o valor escolhido, utilizando uma das mãos: se o valor escolhido foi um, o competidor mostra o dedo indicador estendido; se o valor escolhido foi zero, mostra a mão com todos os dedos fechados. O ganhador é aquele que tiver escolhido um valor diferente de todos os outros; se não há um jogador com valor diferente de todos os outros (por exemplo todos os jogadores escolhem zero, ou um grupo de jogadores escolhe zero e outro grupo escolhe um), não há ganhador. Alice, Beto e Clara são grandes amigos e jogam Zerinho a toda hora: para determinar quem vai comprar a pipoca durante a sessão de cinema, quem vai entrar na piscina primeiro, etc. Jogam tanto que resolveram fazem um plugin no Facebook para jogar Zerinho. Como não sabem programar, dividiram as tarefas entre amigos que sabem, inclusive você.

Dados os três valores escolhidos por Alice, Beto e Clara, cada valor zero ou um, escreva um programa que determina se há um ganhador, e nesse caso determina quem é o ganhador.

Entrada

A entrada é composta de uma única linha, que contém três inteiros A, B e C, indicando respectivamente os valores escolhidos por Alice, Beto e Clara.

Saída

Seu programa deve produzir uma única linha, contendo um único caractere. Se o vencedor é Alice o caractere deve ser 'A', se o vencedor é Beto o caractere deve ser 'B', se o vencedor é Clara o caractere deve ser 'C' e se não há vencedor o caractere deve ser '*' (asterisco).

Restrições

  • 0 ≤ A ≤ 1
  • 0 ≤ B ≤ 1
  • 0 ≤ C ≤ 1

Exemplos

Entrada
1 1 0
Saída
C
      

Entrada
0 0 0
Saída
*

Entrada
1 0 0
Saída
A

Tarefa da Maratona de Programação da SBC 2013, Fase Local

 

 

Avalie este exercício

Detectando colisões

Detecção de colisão é uma das operações mais comuns (e importantes) em jogos eletrônicos. O objetivo, basicamente, é verificar se dois objetos quaisquer colidiram, ou seja, se a interseção entre eles é diferente de vazio. Isso pode ser usado para saber se duas naves colidiram, se um monstro bateu numa parede, se um personagem pegou um item, etc.

Para facilitar as coisas, muitas vezes os objetos são aproximados por figuras geométricas simples (esferas, paralelepípedos, triângulos etc). Neste problema, os objetos são aproximados por retângulos num plano.

Um retângulo é definido pelas coordenadas de dois pontos no plano: o canto inferior esquerdo tem coordenadas (x0,y0) e o canto superior direito tem coordenadas (x1,y1), como mostra a figura abaixo.

figura colisões

Escreva um programa que, dados dois retângulos, determine se eles se interceptam ou não.

Entrada

A entrada contém duas linhas. Cada linha contém quatro inteiros X0, Y0, X1 e Y1, representando as coordenadas do canto inferior esquerdo e do canto superior direito de um retângulo. Os lados do retângulo são sempre paralelos aos eixos X e Y.

Saída

Seu programa deve escrever uma única linha, contendo o número 1 (um) caso haja interseção entre os retângulos dados ou o número 0 (zero) não caso haja interseção.

Restrições

  • 0 ≤ X0 < X1 ≤ 1.000.000
  • 0 ≤ Y0 < Y1 ≤ 1.000.000

Exemplos

Entrada
0 0 1 1
1 1 2 2
Saída
1
      

Entrada
0 0 2 2
1 1 3 3
Saída
1

Entrada
0 0 1 1
2 2 3 3
Saída
0

Tarefa da OBI2007, Modalidade Programação Nível 1, Fase 1

 

 

Avalie este exercício

Álbum de fotos

Clara está organizando as fotos da sua última viagem num álbum de fotos. Como ela tem muitas fotos, para economizar páginas do álbum ela quer colar duas fotos por página do álbum.

Como as fotos são retangulares, as fotos podem ser coladas giradas (mas sempre com lados paralelos aos da página do álbum, para preservar o equilíbrio estético do álbum), mas elas devem sempre ficar inteiramente contidas no interior da página, e não devem se sobrepor.

Em geral, das muitas formas de posicionar as fotos do álbum só algumas (ou nenhuma) satisfazem estas restrições, então pode ser difícil decidir se é possível colar as duas fotos em uma mesma página do álbum, e por isso Clara pediu a sua ajuda para escrever um programa que, dadas as dimensões da página e de duas fotos, decide se é possível colar as duas fotos na página.

Por exemplo, cada página pode ser 5 x 7, e duas fotos são 3 x 4. Nesse caso, é possível colar as duas fotos:

Entrada

A primeira linha da entrada contém dois inteiros X e Y , indicando a largura e a altura da página do álbum. Cada uma das duas linhas seguintes contém dois inteiros L e A, indicando a largura e a altura das fotos.

Saída

Seu programa deve escrever uma única linha, contendo um único caractere: 'S', se é possível colar as duas fotos na página do álbum, e 'N', caso contrário.

Restrições

  • 1 ≤ X ≤ 1000
  • 1 ≤ Y ≤ 1000
  • 1 ≤ L ≤ 1000
  • 1 ≤ A ≤ 1000

Exemplos

Entrada
7 5
3 4
3 4
Saída
S

Entrada
10 10
6 6
6 6
Saída
N

Entrada
13 8
4 9
6 5
Saída
N

Tarefa da OBI2012, Modalidade Programação Nível 2, Fase 2

 

 

Avalie este exercício

Vice-líder

A OBI (Organização de Bocha Internacional) é responsável por organizar a competição mundial de bocha. Infelizmente esse esporte não é muito popular, e numa tentativa de aumentar a sua popularidade, ficou decidido que seriam chamados, para a Grande Final Mundial, o campeão e o vice-campeão de cada sede nacional, ao invés de apenas o primeiro lugar.

Tumbólia é um país pequeno que já havia realizado a sua competição nacional quando a nova regra foi instituída, e o comitê local não armazenou quem foi o segundo classificado. Felizmente eles armazenaram a pontuação de todos competidores - que foram apenas três, devido ao tamanho diminuto do país. Sabe-se também que as pontuações de todos jogadores foram diferentes, de forma que não ocorreu empate entre nenhum deles.

Resta agora descobrir quem foi o vice-campeão e para isso o comitê precisa de ajuda.

Entrada

A primeira e única linha da entrada consiste de três inteiros separados por espaços, A, B e C, as pontuações dos 3 competidores.

Saída

Imprima uma única linha na saída, contendo apenas um número inteiro, a pontuação do vice-campeão.

Restrições

  • 1 ≤ A ≤ 100
  • 1 ≤ B ≤ 100
  • 1 ≤ C ≤ 100

Exemplos

Entrada
4 5 6
	
Saída
5
	

Entrada
10 5 9
Saída
9

Tarefa da OBI2012, Modalidade Programação Nível 1, Fase 1

 

Avalie esta aula

Soluções para os exercícios

Nesta seção você encontra exemplos de soluções para os exercícios. Mas antes de ver a solução para um exercício tente resolvê-lo, criando a sua própria solução.

Solução do Exercício 1
Solução do Exercício 1
Há várias maneiras de verificar se a bola foi dentro ou fora. O problema se traduz em determinar se um ponto de coordenadas (x,y) está dentro ou fora de um retângulo cujo canto inferior esquerdo tem coordenadas (0,0) e cujo canto superior direito tem coordenadas (432,468).
figura

Note que temos que testar se

  • o valor de x está dentro dos limites 0 e 432, e
  • o valor de y está dentro dos limites 0 e 468.

A expressão lógica que verifica se a variável x está dentro dos limites é

x >= 0 && x <= 432

Note que em Javascript NÃO é correto escrever a expressão como

0 >= x => 432

A expressão lógica que verifica se a variável y está dentro dos limites é

y >= 0 && y <= 468

A bola é dentro quando a variável x está dentro dos limites E a variável y está dentro dos limites. Ou seja, a expressão completa que deve ser usada no comando condicional é formada pelo E-lógico das duas expressões mostradas anteriormente:

x >= 0 && x <= 432 && y >= 0 && y <= 468

A solução abaixo usa essa abordagem para resolver a tarefa.

// Solução para o exercício 1, Aula 7
// Tira-teima

var x, y;

// lê a entrada
scanf("%d%d", "x", "y");

// calcula e escreve o resultado
if (x >= 0 && x <= 432 && y >= 0 && y <= 468) {
  printf("dentro\n");
}
else {
  printf("fora\n");
}

 

Solução do Exercício 2
Solução do Exercício 2

Um jogador é vencedor se escolheu 0 e os outros escolheram 1; ou então se o jogador escolheu 1 e os outros escolheram zero. Mas isso pode ser simplificado, re-escrevendo a condição de outra forma: um jogador é vencedor se o seu valor é diferente dos outros valores. A expressão lógica que verifica se uma variável a tem valor diferente de outras duas variáveis b e c pode ser escrita como

b===c && a!==c

Note que não é preciso testar se a é diferente de b, já que b tem o mesmo valor que c.

A solução abaixo usa essa abordagem para resolver a tarefa.

// Solução para o exercício 2, Aula 7
// Zerinho ou Um

// lê a entrada
scanf("%d%d%d", "a", "b", "c");

// calcula e escreve o resultado
if (a===b && c!==b)
    printf("C\n");
else if (a===c && b!==c)
    printf("B\n");
else if (b===c && a!==c)
    printf("A\n");
else
    printf("*\n");

 

Solução do Exercício 3
Solução do Exercício 3

Esse problema é um exemplo de que, se um problema nos parece difícil, devemos procurar mudar a abordagem para a solução. No caso, podemos por exemplo pensar em determinar se os retângulos NÃO têm interseção, pois com essa abordagem pode ser mais fácil de enxergar a solução do que com a abordagem direta de determinar se os retângulos têm interseção.

Considere dois os retângulos R1 e R2 quaisquer. Existem quatro situações que determinam que R1 e R2 não têm interseção:

  • R1 está mais abaixo do que R2
  • R1 está mais acima do que R2
  • R1 está mais à esquerda do que R2
  • R1 está mais à direita do que R2

Essas situações são mostradas na figura abaixo:

figura2

A solução abaixo implementa essa abordagem.

// Solução para o exercício 3, Aula 7
// Detectando colisões

var x_inf_esq_r1, y_inf_esq_r1, x_sup_dir_r1, y_sup_dir_r1; // coordenadas do primeiro retângulo
var x_inf_esq_r2, y_inf_esq_r2, x_sup_dir_r2, y_sup_dir_r2; // coordenadas do segundo retângulo

// lê o primeiro retângulo
scanf("%d%d%d%d","x_inf_esq_r1", "y_inf_esq_r1", "x_sup_dir_r1", "y_sup_dir_r1");
// lê o segundo retângulo
scanf("%d%d%d%d","x_inf_esq_r2", "y_inf_esq_r2", "x_sup_dir_r2", "y_sup_dir_r2");

// calcula e escreve o resultado
// é mais fácil verificar se os retângulao NÃO se interceptam

if (y_inf_esq_r2 > y_sup_dir_r1 ||     // R1 abaixo de R2
    y_inf_esq_r1 > y_sup_dir_r2 ||     // R1 acima de R2
    x_sup_dir_r1 < x_inf_esq_r2 ||     // R1 à esquerda de R2
    x_sup_dir_r2 < x_inf_esq_r1) {     // R1 à direita de R2
    // não se interceptam
    printf("0\n");
}
else {
    // se interceptam
    printf("1\n");
}

Mas também é possível resolver o problema determinando diretamente se os retângulos têm interseção. Para isso, observe as figuras abaixo, que mostram o retângulo R2 "deslizando" por sobre o retângulo R1, na direção do eixo x e na direção do eixo y.

figura2

Note que, no eixo x, ocorre interseção enquanto a coordenada x do lado esquerdo de R2 for menor do que a coordenada x do lado direito de R1, e (ao mesmo tempo) a coordenada x do lado direito de R2 for maior ou igual à coodenada x do lado esquerdo de de R1.

Já no eixo y, a interseção ocorre enquanto a coordenada y do lado inferior de R2 for menor do que a coordenada y do lado superior de R1, e (ao mesmo tempo) a coordenada y do lado superior de R2 for maior ou igual à coordenada y do lado inferior de R1.

Basta agora notar que R1 e R2 têm interseção quando as duas condições acima são verdadeiras (e-lógico das duas condições, no eixo x e no eixo y).

A solução abaixo implementa essa abordagem.

// Solução para o exercício 3, Aula 7
// Detectando colisões
var x_inf_esq_r1, y_inf_esq_r1, x_sup_dir_r1, y_sup_dir_r1; // coordenadas do primeiro retângulo
var x_inf_esq_r2, y_inf_esq_r2, x_sup_dir_r2, y_sup_dir_r2; // coordenadas do segundo retângulo

// lê o primeiro retângulo

scanf("%d%d%d%d","x_inf_esq_r1", "y_inf_esq_r1", "x_sup_dir_r1", "y_sup_dir_r1");
// lê o segundo retângulo
scanf("%d%d%d%d","x_inf_esq_r2", "y_inf_esq_r2", "x_sup_dir_r2", "y_sup_dir_r2");

// calcula e escreve o resultado
// verifica se os retângulos se interceptam
if ((x_inf_esq_r2 <= x_sup_dir_r1 && x_sup_dir_r2 >= x_inf_esq_r1) &&
    (y_inf_esq_r2 <= y_sup_dir_r1 && y_sup_dir_r2 >= y_inf_esq_r1))	{
    // se interceptam
    printf("1\n");
}
else {
    // não se interceptam
    printf("0\n");
}

 

Solução do Exercício 4
Solução do Exercício 4

Para saber se as duas fotos cabem na página, é necessário analisar se existe uma configuração de fotos em que as restrições do problema são obedecidas, entre as várias possíveis maneiras de colocar as fotos.

Uma das possibilidades é colocar as duas fotos sem rotação, lado a lado. Nesse caso a soma das larguras das fotos tem que ser menor do que a largura da página do álbum. Além disso, a altura de cada foto tem que ser menor do que a altura da página do álbum. Ou seja, essa primeira possibilidade é viável se as três condições abaixo são satisfeitas (simultâneamente):

  • Largura Foto1 + Largura da Foto 2 ≤ Largura do Álbum
  • Altura da Foto1 ≤ Altura do Álbum
  • Altura da Foto2 ≤ Altura do Álbum

Mas essa é apenas uma possibilidade. Podemos girar cada uma das fotos, e podemos ainda girar o álbum. Assim, existem no total oito possibilidades:

  • Foto1 sem rotação, Foto2 sem rotação, Álbum sem rotação
  • Foto1 sem rotação, Foto2 com rotação, Álbum sem rotação
  • Foto1 com rotação, Foto2 sem rotação, Álbum sem rotação
  • Foto1 com rotação, Foto2 com rotação, Álbum sem rotação
  • Foto1 sem rotação, Foto2 sem rotação, Álbum com rotação
  • Foto1 sem rotação, Foto2 com rotação, Álbum com rotação
  • Foto1 com rotação, Foto2 sem rotação, Álbum com rotação
  • Foto1 com rotação, Foto2 com rotação, Álbum com rotação

O programa abaixo implementa essa solução.

// Solução para o exercício 4, Aula 7
// Álbum de fotos

var L, A;           // largura e altura do álbum
var L1, A1, L2, A2; // largura e altura das duas fotos

// lê a entrada  
scanf ("%d%d%d%d%d%d", "L", "A", "L1", "A1", "L2", "A2");

// calcula e escreve o resultado
if ( ((L >= L1 + L2) && (A >= A1) && (A >= A2)) ||  // Foto1 sem rotação, Foto2 sem rotação, Álbum sem rotação
     ((L >= L1 + A2) && (A >= A1) && (A >= L2)) ||  // Foto1 sem rotação, Foto2 com rotação, Álbum sem rotação
     ((L >= A1 + L2) && (A >= L1) && (A >= A2)) ||  // Foto1 com rotação, Foto2 sem rotação, Álbum sem rotação
     ((L >= A1 + A2) && (A >= L1) && (A >= L2)) ||  // Foto1 com rotação, Foto2 com rotação, Álbum sem rotação
     ((A >= L1 + L2) && (L >= A1) && (L >= A2)) ||  // Foto1 sem rotação, Foto2 sem rotação, Álbum com rotação
     ((A >= L1 + A2) && (L >= A1) && (L >= L2)) ||  // Foto1 sem rotação, Foto2 com rotação, Álbum com rotação
     ((A >= A1 + L2) && (L >= L1) && (L >= A2)) ||  // Foto1 com rotação, Foto2 sem rotação, Álbum com rotação
     ((A >= A1 + A2) && (L >= L1) && (L >= L2)) ) { // Foto1 com rotação, Foto2 com rotação, Álbum com rotação
   printf("S\n");
}
else {
    printf("N\n");
}

 

Solução do Exercício 5
Solução do Exercício 5

Considere que os nomes das variáveis que armazenam os valores A, B e C descritos no enunciado são a, b e c.

O jogador A é o vice-campeão se o valor de a está entre o valor de b e o valor de c. Ou seja, A é vice-campeão se uma das duas seguintes condições for verdadeira (OU-lógico):

  • a > b && a < c
  • a > c && a < b

O jogador B é o vice-campeão se o valor de b está entre o valor de a e o valor de c. Ou seja, B é vice-campeão se uma das duas seguintes condições for verdadeira (OU-lógico):

  • b > a && b < c
  • b > c && b < a

Note que não é necessário escrever a expressão lógica que determina que o vice-campeão é o jogador com pontuação C, pois se o vice-campeão não é A e não é B, só pode ser C.

O programa abaixo implementa a solução descrita acima.

// Solução para o exercício 5, Aula 7
// Vice-campeão

var a, b, c;  // pontos dos jogadores
var vice;     // variável para armazenar o resultado

// lê a entrada
scanf("%d%d%d", "a", "b", "c");

// calcula o resultado
if ( (a > b && a < c) || (a > c && a < b) )
    vice = a;
else if ( (b > a && b < c) || (b > c && b < a) )
    vice = b;
else
    vice = c;

// escreve o resultado
printf("%d\n", vice);

 

 

 
Área de Trabalho
Entrada
Programa
Saída