软件工程第二次作业
(1)请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中(条件组合覆盖难度较大,鼓励尝试,但请谨慎选择),任选一个标准设计测试用例
(1)对于给定的代码,我们可以分析出以下决策点:
- maxEndingHere + arr[i] > 0
- maxEndingHere > maxSoFar
针对第一个决策点:
- 当maxEndingHere + arr[i] > 0时,即maxEndingHere + arr[i]为正数时,该条件为真;
- 当maxEndingHere + arr[i] <= 0时,即maxEndingHere + arr[i]为负数或零时,该条件为假。
针对第二个决策点
- 当maxEndingHere > maxSoFar时,即当前子段的和大于之前的最大子段和时,该条件为真;
- 当maxEndingHere <= maxSoFar时,即当前子段的和小于等于之前的最大子段和时,该条件为假。
测试用例1:
输入数组:{-2, 11, -4, 13, -5, -2}
预期输出:最大子段和为: 20
解释:最大子段和出现在索引1到3之间,即子数组{11, -4, 13}的和为20。
测试用例2:
输入数组:{-2, -3, -4, -1, -2}
预期输出:最大子段和为: 0
解释:最大子段和为0,因为所有元素都是负数,所以最大子段和为0。
测试用例3:
输入数组:{1, 2, 3, 4, 5}
预期输出:最大子段和为: 15
解释:整个数组都是正数,所以最大子段和为整个数组的和。
测试用例4:
输入数组:{-1, -2, -3, -4, -5}
预期输出:最大子段和为: 0
解释:所有元素都是负数,所以最大子段和为0。
测试用例5:
输入数组:{5, -6, 3, 4, -2, 7, -8, 9, -1}
预期输出:最大子段和为: 15
解释:最大子段和出现在索引2到6之间,即子数组{3, 4, -2, 7, -8, 9}的和为15。
(2)请利用自动测试工具对程序进行测试
include <stdio.h>
include <assert.h>
int maxSubArraySum(int arr[], int n) {
int maxEndingHere = 0;
int maxSoFar = 0;
for (int i = 0; i < n; i++) {
maxEndingHere = (maxEndingHere + arr[i] > 0) ? maxEndingHere + arr[i] : 0;
maxSoFar = (maxEndingHere > maxSoFar) ? maxEndingHere : maxSoFar;
}
return maxSoFar;
}
void test_maxSubArraySum() {
int arr1[] = {-2, 11, -4, 13, -5, -2};
int arr2[] = {-2, -3, -4, -1, -2};
int arr3[] = {1, 2, 3, 4, 5};
int arr4[] = {-1, -2, -3, -4, -5};
int arr5[] = {-1, -2, -3, -4, -5};
assert(maxSubArraySum(arr1, sizeof(arr1)/sizeof(arr1[0])) == 20);
assert(maxSubArraySum(arr2, sizeof(arr2)/sizeof(arr2[0])) == 0);
assert(maxSubArraySum(arr3, sizeof(arr3)/sizeof(arr3[0])) == 15);
assert(maxSubArraySum(arr4, sizeof(arr4)/sizeof(arr4[0])) == 0);
assert(maxSubArraySum(arr5, sizeof(arr5)/sizeof(arr5[0])) == 0);
printf("%s:all done");
}
int main() {
test_maxSubArraySum();
return 0;
}

浙公网安备 33010602011771号