Java 用if语句覆盖所有场景
我正在做下面的家庭作业练习: 给定2个大于0的整数值,返回最接近21的数值,无需重复。如果两者都超过,则返回0 我编写了以下代码:Java 用if语句覆盖所有场景,java,if-statement,Java,If Statement,我正在做下面的家庭作业练习: 给定2个大于0的整数值,返回最接近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.pr
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;
}
}
publicstaticvoidmain(字符串[]args){
系统输出println(21点(22,22));
System.out.println(21点(25,25));
系统输出打印LN(21点(19,25));
系统输出println(21点(25,19));
System.out.println(21点(10,10));
系统输出println(21点(19,10));
系统输出println(21点(1,19));
}
//创建如下方法:
公共静态整数21点(整数a、整数b){
如果(a>21&&b>21){
返回0;
}
若否(a 21){
返回a;
}
如果(a>21 | | b=b),则为else{
返回a;
}
否则{
返回b;
}
}
除了main中的最后一行输出之外,所有这些都可以工作。在这种情况下,我一直得到“a”或“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;
}
}
publicstaticintblackjack(inta,intb){
如果(a>21&&b>21){
返回0;
}
若否(a 21){
返回a;
}
否则如果(a>21&&b=b){
返回a;
}
否则{
返回b;
}
}
您的问题在于第二个条件-a 21
。由于您使用的是逻辑“or”运算符(|
),因此如果第一部分为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;
}
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){
if(a>21&&b>21){
返回0;
}
若否(a 21){
返回a;
}
否则如果(a>21&&b=b){
返回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;
}
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){
if(a>21&&b>21){
返回0;
}
若否(a 21){
返回a;
}
否则如果(a>21&&b=b){
如果不进行此更改,当a和b都小于22时,您将返回“a”。您可以在应该使用&(和)的位置使用| |(或)在
a21
和a21 | b21行,因此您可以对这两行测试:b21
和a21
。如果依赖一些数学运算,您还可以避免一些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;
}
private static final int TARGET=21;
公共静态void main(字符串[]args)引发java.lang.Exception{
System.out.println(21点(22,22));//0
System.out.println(21点(25,25));//0
System.out.println(21点(19,25));//19
System.out.println(21点(25,19));//19
System.out.println(21点(10,10));//10
System.out.println(21点(19,10));//19
System.out.println(21点(1,19));//19
}
公共静态整数21点(整数a、整数b){
如果(a>目标(&b>目标){
返回0;
}
返回Math.abs(a-TARGET)
注意:这在这里是有效的,因为21不接近MAX_INT边界;如果它是溢出的,将是一个问题
另一种方法是先对两个数字进行排序。您不需要所有的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;
}
}
publicstaticintblackjack(inta,intb){
int min=Math.min(a,b);
int max=数学最大值(a,b);
如果(最大值试试这个
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;}
}
}
如果(a 21){/code>和如果(a>21 | | b),你需要将| |更改为&&in-else if(a 21){/code>和else if(a>21 | | | b)谢谢!我要强调的是,当a=20和b=22时,该方法不起作用。在进一步测试后,我发现当atarget
目标
或反之亦然,该方法返回大于21的值(a或b)<30