GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Comparação entre triângulos


#1

Sou iniciante em Java e autodidata. Vi o enunciado de um exercício na Internet pedindo para criar um programa para comparação de tipos de triângulos e fiz o código abaixo. Usei o Netbeans e Notepad++. Está funcionando, mas não tenho certeza se é o correto a se fazer. Agradeço opiniões e sugestões.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

        double v1 = Double.parseDouble(txtv1.getText());
        double v2 = Double.parseDouble(txtv2.getText());         
        double v3 = Double.parseDouble(txtv3.getText());
        
        if ((v1<v2+v3) && (v2<v1+v3) && (v3<v1+v2)){
  
        if ((v1==v2) && (v2==v3)){
        txtfinal.setText("TRIANGULO EQUILATERO");
        txtfinal1.setText("Três lados são iguais");
}
        else{
        if ((v1==v2) || (v1==v3) || (v2==v3)){
        txtfinal.setText("TRIANGULO ISOSCELES");
        txtfinal1.setText("Dois lados são iguais");}
        else
        {
        txtfinal.setText("TRIANGULO ESCALENO");  
        txtfinal1.setText("Três lados são diferentes");    
     }
   }
}
        else{
        txtfinal.setText("VALORES NÃO FORMAM UM TRIANGULO");  
        txtfinal1.setText("DIGITE OUTROS VALORES");
   }
}

#2

Tem algo errado com seus blocos de comando. Ficaria assim:

if ((v1 < v2 + v3) & & (v2 < v1 + v3) & & (v3 < v1 + v2)){

if ((v1 == v2) & & (v2 == v3)){
txtfinal.setText("TRIANGULO EQUILATERO");
txtfinal1.setText("Três lados são iguais");
}

else if ((v1 == v2) | | (v1 == v3) | | (v2 == v3)){
txtfinal.setText("TRIANGULO ISOSCELES");
txtfinal1.setText("Dois lados são iguais");
}
else {
txtfinal.setText("TRIANGULO ESCALENO");
txtfinal1.setText("Três lados são diferentes");
}
}
else {
txtfinal.setText("VALORES NÃO FORMAM UM TRIANGULO");
txtfinal1.setText("DIGITE OUTROS VALORES");
}

Fique atento a quando abrir e quando fechar os {}, se não você perde o controle do fluxo do código e vai ter erros tanto de compilação quanto de resultados. xD


#3

Obrigado FearX.
Vou estudar mais sobre as condicionais.
Vi na internet que dá para usar “case” ao invés dos “ifs”.Vou tentar também.
Valeu.


#4

Eu também criaria uma classe Triangulo, com três atributos, um para cada lado, aí deixaria essa lógica de comparação dentro dessa classe.

public class Triangulo {

    public static enum Tipo {
        EQUILATERO, ISOCELES, ESCALENO;
    }

    public final double a;
    public final double b;
    public final double c;

    public Triangulo(double a, double b, double c) {
        if ((a < b + c) && (b < a + c) && (c < a + b)) {
            this.a = a;
            this.b = b;
            this.c = c;
        } else {
            String mensagem = String.format("Valores (a=%f, b=%f, c=%f) não formam um triangulo", a, b, c);
            throw new IllegalArgumentException(mensagem);
        }
    }

    public Tipo getTipo() {
        if (tresLadosIguais()) {
            return Tipo.EQUILATERO;
        }
        if (doisLadosIguais()) {
            return Tipo.ISOCELES;
        }
        return Tipo.ESCALENO;
    }

    private boolean doisLadosIguais() {
        return a == b || a == c || b == c;
    }

    private boolean tresLadosIguais() {
        return a == b && b == c;
    }

    public String getDescricao() {
        switch (getTipo()) {
            case EQUILATERO:
                return "Três lados são iguais";
            case ISOCELES:
                return "Dois lados são iguais";
            case ESCALENO:
            default:
                return "Três lados são diferentes";
        }
    }
}

Exemplo:

double v1 = Double.parseDouble(txtv1.getText());
double v2 = Double.parseDouble(txtv2.getText());
double v3 = Double.parseDouble(txtv3.getText());

try {
    Triangulo triangulo = new Triangulo(v1, v2, v3);
    txtfinal.setText("TRIANGULO " + triangulo.getTipo());
    txtfinal1.setText(triangulo.getDescricao());
} catch (Exception e) {
    txtfinal.setText(e.getMessage());
    txtfinal1.setText("DIGITE OUTROS VALORES");
}

#5

Obrigado staroski,

Eu ainda não entendo bem esses códigos que envolvem POO, mas estou estudando.
Vou aproveitar sua sugestão para estudar e tentar entender um pouco mais.
Valeu.