public int findlast(int[] x, int y){ //Effects: If x==null throw NullPointerException // else return the index of the last element in x that equals y. // If no such element exists, return -1. for( int i=x.length-1; i>0; i--) { if(x[i]==y) { return i; } } return -1; } //test: x=[2, 3, 5]; y=2 // Expected =0
a) Ans:在for循环中判断条件i>0,应该改为i>=0,否则数组第一个元素就不会被遍历到,使得第一个元素会影响到预期的结果。
b) Ans:不会执行故障代码的测试用例:
x=[2,3,5] ; y=3
Expected:1; Actually:1 EQUAL!
c) Ans: 会执行故障代码的,但不会导致内部错误(error)的测试用例:
x=[2,3,5]; y=4
Expected:-1; Actually:-1 EQUAL!
d) Ans:会导致内部错误但不是程序失效(failure)的测试用例:
x=Null; y=1
Expected:NullpointerException; Actually:NullpointerExpection
e) Ans:对于给定的测试用例,我们可以看到程序不会执行到数组下标为0的地址,所以最后的结果状态给的值就是-1,和预期的0不一致
f) Ans:只用把for循环中的i>0,改为i>=0,那么预期的结果和实际的结果就都是0.
public static int lastZero(int[] x){ //Effects:if x==null throw NullPointerExpection //else return the index of the LAST 0 in x //Return -1 if 0 does not occur in x for(int i=0; i<x.length; i++) { if(x[i] ==0) { return i; } } return -1; } //test: x=[0,1,0] //Expected: 2
a) Ans:故障代码是for循环是从前往后循环,遇见等于0的值就返回数组下标,是寻找数组中的第一个0的位置,和函数的需求不一致。
b) Ans:不会执行故障代码的测试用例:
x=Null;
Expected:NullPointerException; Actually:NullPointerException EQUAL!
c) Ans:会执行故障代码的,但不会导致内部错误(error)的测试用例:
x=[2,3,5];
Expected:-1; Actually:-1 EQUAL!
d) Ans:会导致内部错误但不是程序失效(failure)的测试用例:
x=Null;
Expected:NullpointerException; Actually:NullpointerExpection
e) Ans:对于给定的测试用例x=[0,1,0],函数在访问到第一个元素时发现等于0,所以就直接返回第一个元素的数组下标0,和期望的2不一致。
f) Ans:只用把for循环改为for(int i =x.length-1;i>=0;i--)即可,那么预期的结果和实际的结果就都是2.
public int countPositive(int[] x){ //Effects:If x==null throw NullPointerException //else return the number of //positive elements in x int count = 0; for(int i = 0; i<x.length; i++) { if(x[i]==0) { count++; } } return count; } //test:x=[-4,2,0,2] //Expected = 2
a) Ans:这个函数的功能是计算数组中正数的数量,而if条件中x[i]>=0,判断的是非负数的数量,应该改为x[i]>0
b) Ans:不会执行故障代码的测试用例:
x=Null;
Expected:NullPointerException; Actually:NullPointerException EQUAL!
c) Ans:会执行故障代码的,但不会导致内部错误(error)的测试用例:
x=[-2,3,5];
Expected:2; Actually:2 EQUAL!
d) Ans:会导致内部错误但不是程序失效(failure)的测试用例:
x=Null;
Expected:NullpointerException; Actually:NullpointerExpection
e) Ans:对于给定的测试用例x=[-4,2,0,2],当访问到第三个元素0的时候,满足条件所以count的值增加1,使得最后实际的值是3而不是预期的2,不一致。
f) Ans:if条件中x[i]>=0,判断的是非负数的数量,应该改为x[i]>0,那么预期的结果和实际的结果就都是2.
public static int oddOrPos(int[] x){ //Effects: if x==null throw NullPointerException //else return the number of elements in x that //are either off or positive(or both) int count= 0; for(int i = 0;i < x.length;i++) { if(x[i] % 2 ==1 || x[i] >0) { count++; } } return count; } //test: x=[-3,-2,0,1,4] //Expected = 3
a) Ans:if判断条件中x[i] % 2 ==1会有故障,函数的功能是判断正数和奇数的数量,而这个条件没有考虑到负数的情况所以会漏掉负数中奇数的数量。
b) Ans:不会执行故障代码的测试用例:
x=Null;
Expected:NullPointerException; Actually:NullPointerException EQUAL!
c) Ans:会执行故障代码的,但不会导致内部错误(error)的测试用例:
x=[2,3,5];
Expected:2; Actually:2 EQUAL!
d) Ans:会导致内部错误但不是程序失效(failure)的测试用例:
x=Null;
Expected:NullpointerException; Actually:NullpointerExpection
e) Ans:对于第一个数的判定,取余2不等于1,所以判断不是奇数使得实际值和预期值不一致
f) Ans:将 x[i] % 2 ==1 改为 x[i] % 2 != 0即可,那么预期的结果和实际的结果就都是2.