关于分支嵌套的例题

以下是我在练习Java例题中遇到的一个相对有趣的例题,接下来我把它分享给大家看一看。

1.题目

2.代码示例

import java.util.Scanner;
 
public class TC {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double a, b, c;
 
        // 输入三条边的值
        System.out.print("请输入三角形的第一条边长a:");
        a = scanner.nextDouble();
        System.out.print("请输入三角形的第二条边长b:");
        b = scanner.nextDouble();
        System.out.print("请输入三角形的第三条边长c:");
        c = scanner.nextDouble();
 
        // 判断是否能构成三角形
        if (a + b > c && a + c > b && b + c > a && a > 0 && b > 0 && c > 0) {
            System.out.println("这三条边能构成三角形。");
 
            // 判断三角形的性质
            if (a == b && b == c) {
                System.out.println("这是一个等边三角形。");
            } else if (a == b || a == c || b == c) {
                System.out.println("这是一个等腰三角形。");
            } else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
                System.out.println("这是一个直角三角形。");
            } else {
                System.out.println("这是一个任意三角形。");
            }
        } else {
            System.out.println("这三条边不能构成三角形。");
        }
 
        scanner.close();
    }
}

3.问题解释

这段Java代码实现了一个简单的程序,用于判断用户输入的三条边是否能构成一个三角形,并进一步判断这个三角形的类型。下面是对代码中用到的知识点的详细解释:

1.导入Scanner类

import java.util.Scanner;

这行代码导入了Java的Scanner类,它位于java.util包中。Scanner类用于从标准输入(如键盘)读取数据。

2.定义主类和主方法

public class TC {
    public static void main(String[] args) {
        // ...
    }
}

这里定义了一个名为TC的公共类,其中包含一个main方法。main方法是Java程序的入口点,程序从这里开始执行。

3.创建Scanner对象

Scanner scanner = new Scanner(System.in);

这行代码创建了一个Scanner对象,用于从标准输入(System.in)读取数据。

4.定义变量

double a, b, c;

这里定义了三个double类型的变量abc,用于存储用户输入的三条边的长度。

5.读取用户输入

System.out.print("请输入三角形的第一条边长a:");
a = scanner.nextDouble();
System.out.print("请输入三角形的第二条边长b:");
b = scanner.nextDouble();
System.out.print("请输入三角形的第三条边长c:");
c = scanner.nextDouble();

这段代码通过Scanner对象读取用户输入的三条边的长度,并将它们分别赋值给变量abc

6.判断是否能构成三角形

if (a + b > c && a + c > b && b + c > a && a > 0 && b > 0 && c > 0) {
    // ...
} else {
    System.out.println("这三条边不能构成三角形。");
}

这里使用了逻辑与运算符&&来判断三条边是否满足三角形的构成条件:任意两边之和大于第三边。同时,还检查了边长是否为正数。

7.判断三角形的类型

if (a == b && b == c) {
    System.out.println("这是一个等边三角形。");
} else if (a == b || a == c || b == c) {
    System.out.println("这是一个等腰三角形。");
} else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
    System.out.println("这是一个直角三角形。");
} else {
    System.out.println("这是一个任意三角形。");
}

这部分代码根据边长的关系判断三角形的类型:

  • 如果三条边都相等,则是等边三角形。
  • 如果有两条边相等,则是等腰三角形。
  • 如果满足勾股定理(即a^2 + b^2 = c^2,其中c是斜边),则是一个直角三角形。
  • 如果以上条件都不满足,则是任意三角形。

8.关闭Scanner对象

scanner.close();

最后,程序关闭了Scanner对象,释放了与之关联的系统资源。

整个程序的执行流程是:首先提示用户输入三条边的长度,然后判断这些边是否能构成三角形,如果可以,则进一步判断三角形的类型,并输出结果;如果不能构成三角形,则输出相应的提示信息。最后,关闭Scanner对象以释放资源。

以上就是我对这个问题的大致解释。

4.修较良好的

在某一次的代码回顾复习中,我发现了这段代码还不是很好。以下是我对我的源代码做出了一些我认为比较良好的修改。

以下这个示例将扩展之前的三角形判断程序,以确保用户输入的是有效的数字,并且在输入无效时提供更详细的错误信息。

import java.util.Scanner;
import java.util.InputMismatchException;

public class TriangleChecker {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double a, b, c;
        boolean validInput = false;

        while (!validInput) {
            try {
                System.out.print("请输入三角形的第一条边长a:");
                a = scanner.nextDouble();
                System.out.print("请输入三角形的第二条边长b:");
                b = scanner.nextDouble();
                System.out.print("请输入三角形的第三条边长c:");
                c = scanner.nextDouble();

                // 检查输入是否为正数且不为零
                if (a <= 0 || b <= 0 || c <= 0) {
                    throw new IllegalArgumentException("边长必须为正数且不为零。");
                }

                // 检查是否能构成三角形
                if (a + b > c && a + c > b && b + c > a) {
                    validInput = true;
                    System.out.println("这三条边能构成三角形。");

                    // 判断三角形的性质
                    if (a == b && b == c) {
                        System.out.println("这是一个等边三角形。");
                    } else if (a == b || a == c || b == c) {
                        System.out.println("这是一个等腰三角形。");
                    } else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
                        System.out.println("这是一个直角三角形。");
                    } else {
                        System.out.println("这是一个任意三角形。");
                    }
                } else {
                    throw new IllegalArgumentException("这三条边不能构成三角形。");
                }
            } catch (InputMismatchException ime) {
                System.out.println("输入错误,请输入有效的数字。");
                scanner.next(); // 清除错误输入
            } catch (IllegalArgumentException iae) {
                System.out.println(iae.getMessage());
            }
        }

        scanner.close();
    }
}

在这个示例中,我们使用了try-catch块来捕获InputMismatchException异常,这是当用户输入非数字时Scanner抛出的异常。此外,我们还捕获了IllegalArgumentException异常,用于处理用户输入的边长不满足三角形构成条件或不是正数的情况。

通过这种方式,程序不仅能够处理无效输入,还能提供更具体的错误信息,帮助用户理解问题所在并进行更正。

4.1注:关于对try-catch块的解释

在Java中,try-catch块是一种异常处理机制,用于捕获和处理程序运行时可能出现的异常情况。异常是程序执行过程中发生的不正常或意外的事件,如果不加以处理,可能会导致程序中断执行或产生错误的结果。

try-catch块的基本结构如下:

try {
    // 可能抛出异常的代码块
} catch (ExceptionType1 e1) {
    // 处理ExceptionType1类型的异常
} catch (ExceptionType2 e2) {
    // 处理ExceptionType2类型的异常
} catch (ExceptionTypeN eN) {
    // 处理ExceptionTypeN类型的异常
}
  • try块:包含可能会抛出异常的代码。如果在try块中的代码执行过程中发生了异常,那么异常会被抛出,控制权会转移到catch块。
  • catch块:用于捕获并处理特定类型的异常。每个catch块可以处理一种类型的异常。如果try块中的代码抛出了异常,catch块会根据异常类型来匹配,执行相应的异常处理代码。

4.1.1在上面的代码示例中,try-catch块用于处理以下两种情况:

1.输入错误

当用户输入的不是预期的数字时,Scanner类会抛出InputMismatchException异常。catch块捕获这个异常,并提示用户输入有效的数字。

2.非法输入

如果用户输入的边长不满足三角形的构成条件(例如,边长为负数或零,或者三条边长不能构成三角形),程序会抛出IllegalArgumentException异常。catch块捕获这个异常,并向用户显示错误信息。

通过使用try-catch块,程序能够优雅地处理异常情况,避免程序因异常而突然终止,同时向用户提供有用的反馈信息,从而提高程序的健壮性和用户体验。

5.建议

除了上述的解释之外,我还想补充一些关于代码优化和异常处理的建议,以提高程序的健壮性和用户体验:

1.异常处理

在实际应用中,用户输入可能不是有效的数字,例如输入非数字字符。为了处理这种情况,可以在读取输入时添加异常处理机制。例如,可以使用try-catch块来捕获InputMismatchException异常,这是Scanner类在遇到非预期输入时抛出的异常。

2.输入验证

除了检查三角形的边长是否满足构成三角形的条件外,还可以添加额外的验证来确保用户输入的是有效的数字。例如,可以检查输入是否为正数,以及是否为非零值。

3.代码优化

虽然代码已经很清晰,但可以进一步优化,例如将重复的输入提示合并为一个循环,减少代码重复。

4.用户友好性

为了提高用户体验,可以提供更详细的错误信息,例如当输入的边长不能构成三角形时,可以告诉用户哪条边长不满足条件。

5.代码注释

虽然代码已经比较清晰,但添加一些注释可以帮助其他开发者理解代码的意图和逻辑。

6.代码风格

遵循Java的编码规范,例如使用驼峰命名法命名变量和方法,保持代码的一致性和可读性。

7.资源管理

虽然在main方法结束时Scanner对象会被垃圾回收,但显式关闭资源是一种良好的编程习惯,可以避免潜在的资源泄露。

8.测试

在实际部署前,应该对程序进行充分的测试,确保在各种输入情况下都能正确运行。

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值