软件工程第三次作业
1.最大连续子数组和(最大子段和)
- 问题: 给定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。
2.代码单元测试
-
条件组合覆盖
判定所有条件中可能的情况,例如当n<=0,时返回0,之后考虑B和C的情况组合
2. ###流程图
Coding.net地址:点我就知道
-
测试代码
int a[100];
int Maxshu(int a[],int n)
{
int b=0,i,c=0;
if (n <= 0)
{
return -1;
}
else
{
for (i = 0; i < n; i++)
{
b = b + a[i];
if (b > c)
{
c = b;
}
else if (b < 0)
{
b = 0;
}
}
return c;
}
}
int main()
{
int n,maxx,i;
scanf_s("%d", &n);
for (i = 0; i < n; i++)
{
scanf_s("%d", &a[i]);
}
maxx = Maxshu(a, n);
printf("%d", maxx);
system("pause");
return 0;
}
3.测试代码和结果
1.组合的条件
条件1 | 条件2 |
---|---|
B>c | B>0 |
B>c | B<=0 |
B<=c | B>0 |
B>c | B<=0 |
2.单元测试代码
TEST_METHOD(TestMethod1)
{
int a[] = { 0 };
int n = -1;
Assert::AreEqual(Maxshu(a, n), 0);
}
TEST_METHOD(TestMethod2)
{
int a[] = {1,2,3,1};
int n = 4;
Assert::AreEqual(Maxshu(a, n), 7);
//b>c,b>0
}
TEST_METHOD(TestMethod3)
{
int a[] = { 1,2,3,-1,-2,-3 };
int n = 6;
Assert::AreEqual(Maxshu(a, n), 6);
//b>c,b<=0
}
TEST_METHOD(TestMethod4)
{
int a[] = { 1,2,3,-1};
int n = 4;
Assert::AreEqual(Maxshu(a, n), 6);
//b<=c,b>0
}
TEST_METHOD(TestMethod5)
{
int a[] = { 1,2,-10,-1};
int n = 4;
Assert::AreEqual(Maxshu(a, n), 3);
//b<=c,b<=0
}