用if语句覆盖所有场景

时间:2014-12-27 15:27:48

标签: java if-statement

我正在做以下的家庭作业:

  

给定2个大于0的int值,返回最接近21的值而不经过。如果它们都结束则返回0。

我已经制作了以下代码:

public static void main(String[] args) {
    System.out.println(blackjack(22,22));
    System.out.println(blackjack(25,25));
    System.out.println(blackjack(19,25));
    System.out.println(blackjack(25,19));
    System.out.println(blackjack(10,10));
    System.out.println(blackjack(19,10));
    System.out.println(blackjack(1,19));
}

// Create a method like:
public static int blackjack(int a, int b) {
    if (a > 21 && b > 21) {
        return 0;
    }
    else if (a <= 21 || b > 21) {
        return a;
    }
    else if (a > 21 || b <= 21) {
        return b;
    }
    else if (a >= b) {
        return a;
    }
    else {
        return b;
    }
}

除了我的主要输出的最后一行之外,所有这些都有效。我一直在&#34; a&#34;或者,&#34; 1&#34;在这种情况下,所以我不确定我的方法声明中的最后一行有什么问题。我感觉有些不对劲,但我不知道该改变什么。

7 个答案:

答案 0 :(得分:4)

如果您依赖某些数学运算,也可以避免使用其中一些if语句:

private static final int TARGET = 21;
public static void main (String[] args) throws java.lang.Exception {
    System.out.println(blackjack(22,22)); //  0
    System.out.println(blackjack(25,25)); //  0
    System.out.println(blackjack(19,25)); // 19
    System.out.println(blackjack(25,19)); // 19
    System.out.println(blackjack(10,10)); // 10
    System.out.println(blackjack(19,10)); // 19
    System.out.println(blackjack(1,19));  // 19
}

public static int blackjack(int a, int b) {
    if ( a > TARGET && b > TARGET) {
        return 0;
    }

    return Math.abs(a - TARGET) < Math.abs(b - TARGET) 
       ? a 
       : b;
}

注意:这可以在这里工作,因为21与MAX_INT边界无关;如果它溢出将是一个问题。如果您有兴趣,请参阅本文subtraction is not comparison,了解更多信息。

Working example on Ideone

答案 1 :(得分:3)

问题在于第二个条件 - a <= 21 || b > 21。因为您正在使用逻辑&#34;或&#34; operator(||),如果第一部分为true,则该表达式将评估为true,而不管第二部分如何。也就是说,如果a小于21,它将返回a 的值,无论值是否为b。第三种情况也存在同样的问题。

您应该使用||

,而不是使用&&
if ( a > 21 && b > 21) {
    return 0;
}
else if ( a <= 21 && b > 21){
    return a;
}
else if ( a > 21 && b <= 21){
    return b;
}
else if ( a >= b){
    return a;
}
else {
    return b;
}

答案 2 :(得分:2)

您需要||的{​​{1}}:

&&

如果没有这个改变,你将返回&#34; a&#34;当a和b都是&lt; 22

答案 3 :(得分:1)

试试这个:

public static int blackjack(int a, int b){
    if ( a > 21 && b > 21){
        return 0;
    }
    else if ( a <= 21 && b > 21){
        return a;
    }
    else if ( a > 21 && b <= 21){
        return b;
    }
    else if ( a >= b){
        return a;
    }
    else {
        return b;
    }

}

答案 4 :(得分:1)

你使用|| (或)你应该使用&amp;&amp; (AND)在a <= 21 || b > 21行和a > 21 || b <= 21

注意:您已经测试过两者都不是> 21,所以您可以测试这两行的b > 21a > 21

答案 5 :(得分:0)

另一种方法是先对两个数字进行排序。你不需要所有那些if语句。

public static int blackjack(int a, int b){
    int min = Math.min(a, b);
    int max = Math.max(a, b);
    if (max <= 21) {
        return max;
    } else {
        return min <= 21? min: 0;
    }
}

答案 6 :(得分:0)

试试这个

    public static int blackjack(int a,int b){
      if(a>21){return (b<21)?b:0;}else{
      if(b>21){return a;}else{return (a<b)?b:a;} 
      }
      }

主要

public static void main(String[] args) {

      System.out.println(blackjack(21, 21));    
      System.out.println(blackjack(28, 28));    
      System.out.println(blackjack(17, 18));    

}