質問

2016-07-16 1 views
0

これは私がCodingBatで見た質問です:質問

が2つの正の整数値を考えると、範囲内の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を使用することをお勧めします。可能であれば、ifの代わりにelse ifステートメントを使用するのは、良いコーディング方法です。

+0

私はとても不注意なOmgosh!ありがとうございます:) –

+0

'a'と' b'が範囲にあり、 'a = b'の場合はどうなりますか? –

+0

@Ed Heal 0が返されます。 –

0

コードは3番目の条件が壊れています。 b = 20。 3番目と4番目の条件は以下のようにより具体的である必要があります。

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

もちろん、ヴァーランの答えは正しいです。さらに、私はいくつかのコメントを詳しく説明し、問題をはるかに単純で間違いのないようにする別のアプローチを示したいと思います。

問題文を読んでいるときに、いくつかの条件が満たされている場合に値を返し、そうでない場合は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を返します。

あなたはそれが0ときa=bを返さなければならないと思うなら、それはインデントについてTJCrowderさんのコメントを説明するために:)

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; 
} 

まだかなりシンプル、調整するのは非常に簡単です:あなたがのボディを置く場合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;最後の行に、実際に廃止された可能性があります。

else ifを使用できるというVarunの提案が正しいです。理論的には、最初のifステートメントの条件が真である場合、else ifを使用すると、コードはもう一方のifのテストをスキップし、少し効率的になります。さらに、前のifステートメントが偽であった場合にのみ、次のifステートメントに到達することが示されます。

実際には、条件がtrueで、その後のifステートメントに決して到達しない場合、メソッドは終了し値を返すので、実際にはコードでは問題にはなりません。