【问题标题】:Java: issue when comparing 3 positive integersJava:比较 3 个正整数时的问题
【发布时间】:2012-08-27 00:58:15
【问题描述】:

我已经为此寻求帮助几个小时了,但找不到任何东西,或者我只是没有找到正确的地方。

我正在尝试用 Java 创建一个简单的程序,它将三个正整数作为命令行参数,如果其中任何一个大于或等于其他两个的总和,则打印 TRUE,否则打印 FALSE。

public class Triangle {

    public static void main(String[] args){
        int a = Integer.parseInt(args[0]);
        int b = Integer.parseInt(args[1]);
        int c = Integer.parseInt(args[2]);
        boolean isTriangle;

        isTriangle = (a + b >= c);
        isTriangle = (b + c >= a);
        isTriangle = (a + c >= b);
        System.out.println(isTriangle);
    }

}

希望其中一些人可以给我一个答案或指出我正确方向的东西,以便我能做到这一点。

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 这是家庭作业吗?如果是,请添加Homework 标签。您的问题仍将被评估,只需要正确标记即可。此外,您是否在编写实际 Java 代码时遇到问题,或者您是否正在寻找用于比较数字的正确算法?
  • 不是真正的家庭作业,因为我不在学校学习这个,但它是 Java 编程简介一书中的一个练习,但我在编写代码时遇到问题,这就是我需要帮助的地方跨度>
  • public class Triangle { public static void main(String[] args){ int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); int c = Integer.parseInt(args[2]);布尔是三角形; isTriangle = (a + b >= c); isTriangle = (b + c >= a); isTriangle = (a + c >= b); System.out.println(isTriangle);
  • 您的方法不起作用的原因是您不断重新分配 isTriangle 布尔值。例如,如果 a + b >= c,那么 isTriangle 将为真(并且应该适用于程序的其余部分),但您在下一行将其重新分配给可能为真或不为真的东西。 **编辑:不应该是“c >= a + b”而不是相反(其他两个相同)?

标签: java algorithm boolean command-line-arguments


【解决方案1】:
public class Triangle {

    public static void main(String[] args){
        int a = Integer.parseInt(args[0]);
        int b = Integer.parseInt(args[1]);
        int c = Integer.parseInt(args[2]);
        boolean isTriangle;

        isTriangle = (a + b >= c) || (b + c >= a) || (a + c >= b);
        System.out.println(isTriangle);
    }

}

【讨论】:

    【解决方案2】:

    我会单独测试每个整数,因为它们只有 3 个。

    public static boolean test(int a, int b, int c) {
        return (a >= b + c || b >= a + c || c >= a + b);
    }
    

    至于 IO,您可以使用 Scanner 类。

    Scanner sc = new Scanner(System.in);
    int a = sc.nextInt();
    int b = sc.nextInt();
    int c = sc.nextInt();
    

    记住:import java.util.Scanner

    编辑: 我刚刚看到您想将整数作为命令行参数,在这种情况下,您只需使用 Integer.parseInt(..) 来转换 String 参数(@987654327 的组件@ 即 main 方法的参数)转换为整数。

    【讨论】:

    • 这三个条件必须为真,即你需要使用&&而不是||
    • 问题问“是否其中任何一个大于或等于其他两个之和”。
    【解决方案3】:

    由于您正在学习 Java,因此开始尝试它的一些面向对象方面可能是一个好主意。您可以执行以下操作:

    public class Triangle{
        private int side1;
        private int side2;
        private int side3;
    
        public Triangle(int side1, int side2, int side3){
            this.side1=side1;
            this.side2=side2;
            this.side3=side3;
        }
    
        public boolean isValid(){
            return side1>0 && side2>0 && side3>0;
        }
    
        public boolean isTriangle(){
            return (side1+side2<=side3) 
                || (side1+side3<=side2) 
                || (side2+side3<=side1);
        }
    
        public static void main(String[] args){
            try{
                side1=Integer.parseInt(args[0]);
                side1=Integer.parseInt(args[0]);
                side1=Integer.parseInt(args[0]);
    
                Triangle t=new Triangle(side1,side2,side3);     
                    if(t.isValid() && t.isTriangle())
                        System.out.println("Yes this makes a valid triangle");  
    
                    else System.out.println("Sorry this is not a valid triangle");
            }
            catch(NumberFormatException e){
                System.out.println("Please make sure all arguments are numeric.");
            }            
        }
    }
    

    更进一步,您还可以扩展此类以创建 RightTriangle 类。由于三角形边的字段是私有的,因此您需要在 Triangle 类中为每个边添加 getter 方法 (public int getSide1(){return side1;})。

    public class RightTriangle extends Triangle{
    
        public RightTriangle(int side1, int side2, int side3){
            super(side1,side2,side3);
        }
    
        @Override
        public boolean isValid(){
            int a=getSide1();
            int b=getSide2();
            int c=getSide3();
    
            return super.isValid()
                && ((a*a + b*b = c*c)
                    || (a*a + c*c = b*b)
                    || (b*b + c*c = a*a));
        }
    
        public static void main(String[] args){
            //this is basically the same as the triangle class only now 
            //instantiate the RightTriangle class
            RightTriangle rt=new RightTriangle(side1,side2,side3);
                if(rt.isTriangle() && rt.isValid())
                    System.out.println("Yes this is a valid right triangle");
    
                else System.out.println("sorry, this is not a right triangle");
    
    
        }
    
    }
    

    【讨论】:

    • 更好的办法是在构造函数中或在某些工厂方法/类中强制验证。从Triangle 的对象调用创建方法isTriangle() 似乎不是一个好主意:)。
    • 我不会将验证放在构造函数中,除非绝对必要,否则最好不要这样做。不过我同意,如果这是一个工厂会更有意义,但我认为这可能会增加不必要的复杂性(我只是想展示一种更面向对象的方法来处理它)。我也同意那个方法的命名,我只是不知道还能叫什么。使用 isValid() 会更有意义,但我添加了一个扩展它的类以显示覆盖方法。 (它只是一个例子)。您还可以使用 isValid、getPerimeter() 和 getArea() 等创建形状接口。
    猜你喜欢
    • 2023-03-13
    • 2010-12-03
    • 2013-05-30
    • 1970-01-01
    • 2021-11-18
    • 2021-02-04
    • 1970-01-01
    • 2013-01-31
    相关资源
    最近更新 更多