Exercício Triângulo - Dúvida Iniciante

Olá pessoal,
Eu sou iniciante em java e estou com muitas dúvidas, mas neste exercício apenas não estou entendendo a lógica, olhando em alguns exemplos aqui fiz o meu código, está funcionando perfeitamente, mas eu não entendi a validação do Triângulo Isóceles.

Meu código ficou assim:

public class Triangulo {
public static void main(String[] args) {
      // Triângulo Equilátero Lado1=Lado2=Lado3
      // Triângulo Isóceles Lado1=Lado2 ≠ Lado3 ou Lado1=Lado3 ≠ Lado2 ou Lado1 ≠ Lado2=Lado3
          int lado1, lado2, lado3;
          lado1 = Teclado.lerInteiro("Entre com o 1º lado"); 
          lado2 = Teclado.lerInteiro("Entre com o 2º lado");
          lado3 = Teclado.lerInteiro("Entre com o 3º lado");
        if (lado1 == lado2 && lado1 == lado3){
          System.out.println("Três lados iguais . Trata-se de um Triangulo Equilátero");
          System.out.println("-------------------------------------------------------");
        **}else if(lado1 == lado2 || lado1 == lado3 || lado2 == lado3){**
          System.out.println("Dois lados iguais . Trata-se de um Triangulo Isósceles");
          System.out.println("-------------------------------------------------------");
        }else
          System.out.println("Três lados diferentes.");
          System.out.println("-------------------------------------------------------");
        }
    }
else if(lado1 == lado2 || lado1 == lado3 || lado2 == lado3){**
       System.out.println("Dois lados iguais . Trata-se de um Triangulo Isósceles");
       System.out.println("-------------------------------------------------------");

Mas você entende o else if certo? Ele funciona como um “se senão”, caso o if anterior seja falso ele avança para o próximo, que nesse caso é o else if, caso este também seja falso ele pula para o próximo.

Um triângulo Isósceles possui dois lados iguais, não importante qual seja, lado 1 e 2, ou 1 e 3, ou 2 e 3. É isso que esse trecho do código faz, o dois traços || significa “ou”, pelo menos uma dessas condições deve ser verdadeira para o triângulo ser Isósceles, o código só irá testa-los até encontrar o verdadeiro, por exemplo se o lado1 for igual ao lado2 ele não testa mais as outras condições e já entre dentro do bloco, se não forem iguais ele testa a segunda condição se lado1 é igual a lado3 e assim por diante.

Acho que é isso. :+1:

2 curtidas

Achei que teria algo errado, pois eu vi um exercício com mesmo resultado, porém o código muito maior

> if ((x < y + z) && (y < x + z) && (z < x+y)){
>         if (x == y && x == z){
>           System.out.println("Três lados iguais . Trata-se de um Triangulo Equilatero");
>         }else if((x == y) || (x == z)){
>           System.out.println("Dois lados iguais . Trata-se de um Triangulo Isosceles");
>         }else

Não existe código errado quando se encontra o resultado que procura, apenas muda a lógica de quem cria o algoritmo, alguns podem fazer o código maior, ou menor, alguns mais fáceis de entender, outros mais difíceis.

if ((x < y + z) && (y < x + z) && (z < x+y))

Essa primeira parte do código mesmo não entendi muito bem, acredito que seja para definir se é um triângulo mesmo.

else if((x == y) || (x == z))

Já esse achei meio confuso, e se por acaso y == z, e x diferente, ele não tratará o triângulo como isósceles, parece errado. :no_mouth:

1 curtida

if(lado1 == lado2 || lado1 == lado3 || lado2 == lado3)
A instrução acima é provida de um curto circuito (não necessita validar tudo).

O if -> else if, também se comporta como um short circuit, pois a primeira proposição que for verdadeira encerra as demais estruturas condicionais sem as testar.

Como o primeiro if valida se é equilátero e encerra o fluxo, sobra o teste para isóceles e escaleno.

Então a validação do isóceles depende da do equilátero, a lógica possui dependência.
Se não for equilátero, nem isóceles, sobra apenas o escaleno.

O maior problema que vejo, é a necessidade de verificar a condição de existência do triângulo, conforme feito a seguir:

Ressalva, o código deve filtrar valores menores ou iguais a 0, pois os lados do triângulo devem ser positivos.

Obs.: o curto circuito também ocorre com o operador &&.

Não cheguei a fazer muitos testes, mas outra forma de verificação vai ai:

package teste;

import java.util.Arrays;
import java.util.stream.DoubleStream;

public class Triangulo {

    
    private final double[] lados;

    public Triangulo(double ladoA, double ladoB, double ladoC) {
        lados = new double[]{ladoA, ladoB, ladoC};
    }

    private static double maiorLado(double... lados) {
        return DoubleStream.of(lados).max().orElse(0);
    }

    public double maiorLado() {
        return maiorLado(lados);
    }

    public double somaLados() {
        return somaLados(lados);
    }

    private static double somaLados(double... lados) {
        return DoubleStream.of(lados).sum();
    }

    public static boolean isTrianguloPossivel(double ladoA, double ladoB, double ladoC) {
        if (Arrays.asList(ladoA, ladoB, ladoC).stream().anyMatch(lado -> lado <= 0)) {
            return false;
        }
        double maiorLado = maiorLado(ladoA, ladoB, ladoC);
        return maiorLado < somaLados(ladoA, ladoB, ladoC) - maiorLado;
    }

    public TipoTriangulo getTipoTriangulo() {

        int totalMedidas = (int) DoubleStream.of(lados).distinct().count();

        return Arrays.stream(TipoTriangulo.values())
                .filter(tipo -> tipo.totalMedidas == totalMedidas)
                .findFirst().get();
    }

    public double[] getLados() {
        return lados;
    }
    
}

.

package teste;
/*Avaliei pelas medidas iguais e não pela quantidade de lados iguais,
Ex.: equilatero tem uma medida para todos os lados*/
public enum TipoTriangulo {
    EQUILATERO(1), ISOCELES(2), ESCALENO(3),;
    int totalMedidas;

    private TipoTriangulo(int totalMedidas) {
        this.totalMedidas = totalMedidas;
    }

}

.
package teste;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Efemera {

    public static void main(String[] args) {
        int[][] matrizTeste = {
            {5, 5, 5},
            {5, 6, 5},
            {3, 7, 2},
            {5, 4, 11},
            {0, 1, 2},
            {-3, 4, 5},
            {8, 6, 13}
        };
        
        List<Triangulo> triangulos = new ArrayList<>();
        List<String> descartado = new ArrayList<>();
        
        Arrays.stream(matrizTeste).forEach(lado -> {
            if (Triangulo.isTrianguloPossivel(lado[0], lado[1], lado[2])) {
                triangulos.add(new Triangulo(lado[0], lado[1], lado[2]));
            } else {
                descartado.add("Não é possivel formar um triângulo: " + Arrays.toString(lado));
            }
        });

        triangulos.forEach(triangulo -> 
                System.out.println(Arrays.toString(triangulo.getLados()) + triangulo.getTipoTriangulo())
        );
        descartado.forEach(System.out::println);
    }
}

Me lembrou a 3ª ou 4ª série, quando a professora falou sobre a condição de existência dos triângulos.

1 curtida

Obrigado pela explicação, comecei Java há menos de um mês, ainda estou muito perdido.