背景
- 问题:给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],......,a[n],求该序列如a[i]+a[i+1]+...+a[j]子段和的最大值。当所给的整数均为负数时定义子段和为0,依次定义,所求的最优值为:Max{0,a[i]+a[i+1]+...+a[j]},1<=i<=j<=n,例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
-- 引用自《百度百科》 - 要求:请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中任选一个标准设计测试用例,并利用自动测试工具对程序进行测试。
- 问题:给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],......,a[n],求该序列如a[i]+a[i+1]+...+a[j]子段和的最大值。当所给的整数均为负数时定义子段和为0,依次定义,所求的最优值为:Max{0,a[i]+a[i+1]+...+a[j]},1<=i<=j<=n,例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
程序代码
通过参考百度百科,结合自己的理解,用C语言编写了如下代码:
#include<stdio.h> #include<stdlib.h> int Max(int arr[],int m) { int sum=arr[0]; for(int i=0;i<m;i++) { int othersum=0; for(int j=i;j<m;j++) { othersum=arr[j]+othersum; if(othersum>sum) sum=othersum; } } if(sum<=0) sum=0; return(sum); } int main() { int n,i,a[100]; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("%d\n",Max(a,n)); system("pause"); main(); return 0; }
运行结果如图:
覆盖标准的选择
五种逻辑覆盖测试
- 语句覆盖:设计足够多的测试用例,使得被测试程序中的每条可执行语句至少被执行一次。
- 条件覆盖:设计足够多的测试用例,使得被测试的每个判断语句中的每个逻辑条件的可能值至少被满足一次。
- 判定覆盖:设计足够多的测试用例使得被测试程序的每个判断的真、假分支至少被执行一次。
- 判定条件覆盖:设计足够多的测试用例,使得判定本身的判定结果至少满足一次,同时每个逻辑条件的可能值也至少被满足一次。
- 条件组合覆盖:设计足够多的测试用例,使得被测试程序的每个判断的所有可能条件取值的组合至少被满足一次。
此次我选择的是条件覆盖,对每个判断条件的可能值各取一次,然后测试程序是否有错。
程序流程图
测试用例
- 四组测试用例为 {1,2,3,4},{-1,-2,-3,-4,-9},{-6,1,2}, {10,-1,-2,-3,1,0}
需要被测试的JAVA类
编写的测试类
测试结果
总结
这次作业让我学到了好多之前不了解的东西,更加熟悉了Eclipse的功能,了解了一门新的语言,除此之外我更深刻的体会到自己动手能力的欠缺,想的多不如做的多。
附:程序已上传至GItHUB