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(); }
优化说明
- 避免数组越界:枚举组合或取模运算的方式,彻底解决索引超出范围的问题。
- 浮点数精度处理:用
Math.abs(差值) < EPSILON替代==,允许微小计算误差,保证判断准确性。 - 逻辑清晰:通过布尔变量统一管理结果,代码可读性更强。
- 资源回收:添加
myObj.close()关闭输入流,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Leandro Zárate
相关产品推荐
相关产品推荐

