You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java遍历数组时调用其余元素,判断三角形是否为直角三角形

问题分析与代码修正

你的思路是通过遍历数组,每次取另外两个元素计算平方和的平方根,判断是否等于第三个元素来验证直角三角形,但代码存在几个关键问题:

主要问题点

  • 数组越界异常:当contador为1时,contador+2=3,超出了数组lados的索引范围(0-2),运行时会抛出ArrayIndexOutOfBoundsException。
  • 浮点数直接用==比较:浮点数计算存在精度误差(比如Math.sqrt(2*2+3*3)和5.0的计算可能有微小偏差),直接用==会导致判断失误。
  • 遍历逻辑不完整:当前代码只尝试了两种组合,遗漏了“以第三个元素为直角边,另外两个元素的平方和等于第一个元素平方”的情况。
  • 冗余变量:for循环中的x变量完全未被使用,逻辑上可以简化。

修正后的代码(直接枚举组合)

import java.util.Scanner;

static void miEjercicio11() {
    Scanner myObj = new Scanner(System.in);
    Double lados[] = new Double[3];
    
    System.out.println("Ingrese un lado de su triangulo:");
    lados[0] = myObj.nextDouble();
    System.out.println("Ingrese otro lado de su triangulo:");
    lados[1] = myObj.nextDouble();
    System.out.println("Ingrese otro lado de su triangulo:");
    lados[2] = myObj.nextDouble();
    
    boolean esRectangulo = false;
    final double EPSILON = 1e-9; // 处理浮点数精度的极小值
    
    // 检查三种可能的直角三角形组合
    if (Math.abs(Math.pow(lados[0], 2) + Math.pow(lados[1], 2) - Math.pow(lados[2], 2)) < EPSILON) {
        esRectangulo = true;
    } else if (Math.abs(Math.pow(lados[1], 2) + Math.pow(lados[2], 2) - Math.pow(lados[0], 2)) < EPSILON) {
        esRectangulo = true;
    } else if (Math.abs(Math.pow(lados[2], 2) + Math.pow(lados[0], 2) - Math.pow(lados[1], 2)) < EPSILON) {
        esRectangulo = true;
    }
    
    System.out.println(esRectangulo ? "Es un triangulo rectangulo" : "No es un triangulo rectangulo");
    myObj.close(); // 关闭输入流避免资源泄漏
}

遍历实现版本(匹配你的初始思路)

如果坚持要用遍历方式实现,可通过取模运算避免数组越界,完美契合“每次迭代使用另外两个元素”的需求:

import java.util.Scanner;

static void miEjercicio11() {
    Scanner myObj = new Scanner(System.in);
    Double lados[] = new Double[3];
    
    System.out.println("Ingrese un lado de su triangulo:");
    lados[0] = myObj.nextDouble();
    System.out.println("Ingrese otro lado de su triangulo:");
    lados[1] = myObj.nextDouble();
    System.out.println("Ingrese otro lado de su triangulo:");
    lados[2] = myObj.nextDouble();
    
    boolean esRectangulo = false;
    final double EPSILON = 1e-9;
    
    for (int x = 0; x < lados.length; x++) {
        // 用取模获取另外两个元素的索引,避免越界
        int idx1 = (x + 1) % 3;
        int idx2 = (x + 2) % 3;
        double sumCuadrados = Math.pow(lados[idx1], 2) + Math.pow(lados[idx2], 2);
        double cuadradoHip = Math.pow(lados[x], 2);
        
        if (Math.abs(sumCuadrados - cuadradoHip) < EPSILON) {
            esRectangulo = true;
            break;
        }
    }
    
    System.out.println(esRectangulo ? "Es un triangulo rectangulo" : "No es un triangulo rectangulo");
    myObj.close();
}

优化说明

  1. 避免数组越界:枚举组合或取模运算的方式,彻底解决索引超出范围的问题。
  2. 浮点数精度处理:用Math.abs(差值) < EPSILON替代==,允许微小计算误差,保证判断准确性。
  3. 逻辑清晰:通过布尔变量统一管理结果,代码可读性更强。
  4. 资源回收:添加myObj.close()关闭输入流,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Leandro Zárate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:55:40