2016-07-16 122 views
0

这是我在CodingBat看到了这样的问题:问题上,如果和else语句

鉴于2阳性int类型,返回较大值的范围是10..20包容性,或返回0,如果没有在该范围。

这是我写的代码:

public int max1020(int a, int b) { 
    if (a>=10 && a<=20 && b>=10 && b<=20 && a>b) 
    return a; 
    if (a>=10 && a<=20 && b>=10 && b<=20 && b>a) 
    return b; 
    if (a>=10 && a<=20 && b<=10 || b>=20) 
    return a; 
    if (a<=10 || a>=20 && b>=10 && b<=20) 
    return b; 

    else return 0; 
} 

我相当有信心,这是正确的,但仍然后我点击运行,该网站说:max1020(9,21)→0,但我代码返回9.有人可以帮助我检查我的代码有什么问题吗? :)

+0

对不起,它的Java! –

+0

为什么不简化代码,只需检查'a'是否在第一个范围内?与'b'同上然后找到最大的 –

+1

'&&'与'||'具有相同的优先级,因此您的if子句从左到右读取。你需要围绕“内部”子句使用括号。 – Evert

回答

3
public int max1020(int a, int b) { 
    if (a>=10 && a<=20 && b>=10 && b<=20 && a>b) 
    return a; 
    if (a>=10 && a<=20 && b>=10 && b<=20 && b>a) 
    return b; 
    if ((a>=10 && a<=20) && (b<=10 || b>=20)) 
    return a; 
    if ((a<=10 || a>=20) && (b>=10 && b<=20)) 
    return b; 

    else return 0; 
} 

在第3行和第4行添加括号可以解决问题。

我建议你改变if声明和使用else if。只要有可能,使用else if语句而不是几个if只是一种良好的编码习惯。

+0

Omgosh对我太不在意了!非常感谢:) –

+0

如果'a'和'b'在范围内,'a = b'会怎么样? –

+0

@Ed Heal 0将在这种情况下返回。 –

0

你的代码是在第三if条件,那就是你有破|| B> = 20。第三和第四个条件应该更具体,如下所示:

if (a>=10 && a<=20 && (b<=10 || b>=20)) 
     return a; 
    if ((a<=10 || a>=20) && b>=10 && b<=20) 
     return b; 

添加这些括号会起到一定作用。

0

我宁愿到检查分配给一个变量以具有更多的“可读的”代码。但这取决于个人喜好。

public int max1020(int a, int b) { 
    final boolean aInRange = a>=10 && a<=20; 
    final boolean bInRange = b>=10 && b<=20; 

    if (aInRange && bInRange) { 
     if (a > b) { 
      return a; 
     } else if (a < b) { 
      return b; 
     } else { 
      return 0; 
     } 
    } else if (aInRange) { 
     return a; 
    } else if (bInRange) { 
     return b; 
    } else { 
     return 0; 
    } 
} 
0

当然Varun的回答是正确的。另外,我想详细说明一些意见,并展示解决问题的另一种方法,该方法更简单,不太可能包含错误。

在阅读问题的陈述,你可能会注意到,该方法返回一个值,如果满足一定条件,或返回0其他。因此,您可以使用默认值0初始化结果,如果条件满足,则更改结果,然后返回结果。这将减少代码:

public int max1020(int a, int b) { 
    int result = 0; 

    if (a >= 10 && a <= 20) result = a; 
    if (b >= 10 && b <= 20 && b > result) result = b; 

    return result; 
} 

不能让它更简单,我想。 (但是,如果可以的话,请评论,我爱KISS!:))

该解决方案产生略有不同的结果,如果两个ab在范围和a=b,它将返回a。如果这种情况发生,问题陈述并不是很清楚,Varun的回答也表明了这一点。巧合(或不)Codingbat不检查这种情况。在这种情况下,网站上提出的解决方案也会返回a

如果你认为它应该返回0a=b,它很容易调整,

public int max1020(int a, int b) { 
    int result = 0; 

    if (a != b) { 
     if (a >= 10 && a <= 20) result = a; 
     if (b >= 10 && b <= 20 && b > result) result = b; 
    } 

    return result; 
} 

还是蛮简单的:)

为了解释TJCrowder的约压痕评论:如果你把身体的if声明在下一行,你应该使用大括号和缩进行。否则,很容易误读它,或者在更改代码时出错。

// this can be error prone and harder to read, 
// especially if you have multiple if statements, 
// or add a statement to the body of the if statement in the future 
// (shouldn't do this) 
if (condition) 
statement; 

// Personally I think this is totally fine for a simple statement. 
// But I know not everybody will agree 
if (condition) statement; 

// Usually, you'll see this formatting. 
// Even without reading anything, the formatting makes it instantly clear 
// which statements belong to the body of the if 
if (condition) { 
    statement; 
} 

边注:在代码中else声明属于最后if。你的格式可以通过在这些之间不加空格来表示清楚,例如

if (condition) statement; 
else statement; 

if (condition) { 
    statement; 
} else { 
    statement; 
} 

在代码中else声明实际上是过时的,你可以简单地return 0;在最后一行。

Varun建议您可以使用else if s是正确的。理论上,如果第一个if声明的条件为真,则使用else if将使代码跳过其他if的测试,并且效率更高一些。此外,它会显示只有在前面的if语句错误时才会达到后续的if语句。

然而,实际上,在你的代码中,它并不重要,因为如果条件为true,并且后续的if语句永远无法到达,则该方法将完成并返回一个值。