2012-04-19 4 views
0

私はソフトウェアテスト試験のために改訂しています。問題の1つは、この方法を示し、障害を特定し、障害を実行しないテストケース(存在する場合)を生成するよう求めます。ここでこのメソッドのフォルトまたはエラー

は、コードは次のとおりです。

public static int oddOrPos(int[] x) { 
    //Effects: if x==null throw NullPointerException 
    // else return the number of elements in x that 
    // are either odd or positive (or both) 
    int count = 0; 
    for (int i = 1; i < x.length; i++) 
    { 
    if (x[i]%2 == 0 || x[i] > 0) 
    { 
     count++; 
    } 
    } 
    return count; 
} 

私は二つの問題を特定しました。 1つはforループで1に初期化されるため、x [0]はテストされません。またx[i] % 2 == 0x[i] != 0

である必要があります。これらの問題は障害ですか?私はこの質問が、ただ一つの欠陥があるように見えるので、これを尋ねます。

また、私は、forループが常に実行されるため、フォルトを実行しないテストケースは存在しないと仮定します。 (私たちはポジティブなものと一緒に奇数値を検出したい場合。既存のコードではなくでも値を検出します)実際に

+0

x [i]%2 == 0は他の回答を参照してください。しかし、条件を 'x [i]%2 == 1'に変更したとしても、' i = 1'は1要素配列に対して '0'を返します。 – Thomas

答えて

0

あなたは奇数負値を検出したい場合は、それが今行うのよう0ため-1なく探しする必要があります。

奇数プラスの値は1です。だから基本的には以外には0が必要です。

class Test1 { 
    public static void main(String[] args) { 
     int a = 5 % 3; // 2 
     int b = 5/3; // 1 
     System.out.println("5%3 produces " + a + 
       " (note that 5/3 produces " + b + ")"); 

     int c = 5 % (-3); // 2 
     int d = 5/(-3); // -1 
     System.out.println("5%(-3) produces " + c + 
       " (note that 5/(-3) produces " + d + ")"); 

     int e = (-5) % 3; // -2 
     int f = (-5)/3; // -1 
     System.out.println("(-5)%3 produces " + e + 
       " (note that (-5)/3 produces " + f + ")"); 

     int g = (-5) % (-3); // -2 
     int h = (-5)/(-3); // 1 
     System.out.println("(-5)%(-3) produces " + g + 
       " (note that (-5)/(-3) produces " + h + ")"); 
    } 
} 

もう一つの「小さな」障害が道である:最初に与えられた数が負の場合

%オペレータは剰余演算子ではなく、実際にはモジュロ演算子である、それは負の数を返します。条件が成立します。代わりにまたはを探して、奇数またはをチェックするの奇数が少し速くなります。数字が肯定的であるか否かを確認することがより簡単になるのは、それが唯一の理由です。


資源:

4

x[i] % 2 == 0x[i] % 2 != 0でなければなりません。

テストケースはちょうど{ -2 }です。この要素は偶数とネガティブなので、カウントされません。このメソッドはエラーがあっても0を返します。 { 1 }0となりますが、これは間違っています。

+0

いいえ、残った演算子ではそれほどうまくいきません。私の答えを見てください。 –

+0

正解、ネガを忘れました。修正する。 –

+0

しかし、あなたのテストケース{2}ではそれもそれで、カウントされるべきではありませんが、メソッドが1を返すようにカウントを増やすべきです。 – sam

0

私はそれを理解し、あなたの仮定で正しいです。配列の最初の位置をテストする必要があります。したがって、i[0]を指摘してください。

しかし、x[i]%2 == 0は、奇数の代わりにx[i]%2 == 1である必要があります。

0

ここで重要なのは、forループが1から始まり、0から始まることです。配列の最初の要素は常に失われます。また、x [i]%2 == 0は、奇数ではなく偶数に対して真を返します。したがって、x [i]%2!= 0に変更してください。

public class test{ 

public static void main(String[] args){ 
int[] x = {3, 5, -1, -14} 

if(3 == oddOrPos(x)){ 
    System.out.println("Working"); 
else 
    System.out.println("Test Fail"); 

} 
public static int oddOrPos(int[] x) { 
    //Effects: if x==null throw NullPointerException 
    // else return the number of elements in x that 
// are either odd or positive (or both) 
int count = 0; 
for (int i = 0; i < x.length; i++) 
{ 
    if (x[i]%2 != 0 || x[i] > 0) 
{ 
    count++; 
} 
} 
     return count; 
} 
} 
関連する問題