软件工程第二次作业

(1)请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中(条件组合覆盖难度较大,鼓励尝试,但请谨慎选择),任选一个标准设计测试用例
(1)对于给定的代码,我们可以分析出以下决策点:

  1. maxEndingHere + arr[i] > 0
  2. 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;
}

posted @ 2024-04-10 12:05  duqianrui  阅读(7)  评论(0)    收藏  举报