软件工程第三作业
目录
1. 题目
GITHUB代码地址:
GITHUB代码地址:https://github.com/wuxuezeproject/-
最大连续子数组和(最大子段和)
问题描述: 给定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. 程序设计及代码编辑
2.1程序设计
程序的主要方程为Sum = (Sum + array[i]) > (array[i]) ? (Sum + array[i]) : (array[i]);
最大和要么是前面所求最大和加下一项,要么是下一项。具体程序流程图如下:
2.2代码编辑
int GetSum(int* array, int num)
{
if (array == NULL) return 0;
int i;
int Max{ array[0] };
int Sum{ array[0] };
for (i = 1; i < num; i++)
{
Sum = (Sum + array[i]) > (array[i]) ? (Sum + array[i]) : (array[i]);
if (Sum > Max)
{
Max = Sum;
}
}
if (Max < 0)
{
Max = 0;
}
return Max;
}
3. 测试分析及结果
本次测试,我采用的是条件组合测试。本次测试中涉及到的条件选择共有四个,一共有九种组合方式。
3.1测试分析
3.2测试案例设计
针对上面的九种条件组合,对应的设计案例如下:
array==NULL? | sum取值 | sum>max? | max<0? | 测试用例 | 结果 |
---|---|---|---|---|---|
array==NULL | {} | 0 | |||
array!=NULL | sum=(sum+array[[i]) | sum>max | max>0 | {2,2,2} | 6 |
array!=NULL | sum=(sum+array[[i]) | sum>max | max<0 | 不存在 | 无 |
array!=NULL | sum=(sum+array[[i]) | sum<max | max>0 | {5,,-2,3} | 6 |
array!=NULL | sum=(sum+array[[i]) | sum<max | max<0 | 不存在 | 无 |
array!=NULL | sum= array[[i]) | sum>max | max>0 | {-2,5,3} | 8 |
array!=NULL | sum= array[[i]) | sum>max | max<0 | {-2,-1,-3} | 0 |
array!=NULL | sum= array[[i]) | sum<max | max>0 | 不存在 | 无 |
array!=NULL | sum= array[[i]) | sum<max | max<0 | {-2,-3,-5} | 0 |
测试代码如下:
TEST_METHOD(TestMethod1) //array==NULL
{
int *array = {};
int num = sizeof(array) / sizeof(array[0]);
int Max = GetSum(array, num);
Assert::AreEqual(Max, 0);
}
TEST_METHOD(TestMethod2) //(sum=sum+array)&&(sum>max)&&(max>0)
{
int array[] = { 2,2,2 };
int num = sizeof(array) / sizeof(array[0]);
int Max = GetSum(array, num);
Assert::AreEqual(Max, 6);
}
TEST_METHOD(TestMethod3) //(sum=sum+array)&&(sum<max)&&(max>0)
{
int array[] = { 5,-2,3 };
int num = sizeof(array) / sizeof(array[0]);
int Max = GetSum(array, num);
Assert::AreEqual(Max, 6);
}
TEST_METHOD(TestMethod4) //(sum=array)&&(sum>max)&&(max>0)
{
int array[] = { -2,5,3 };
int num = sizeof(array) / sizeof(array[0]);
int Max = GetSum(array, num);
Assert::AreEqual(Max, 8);
}
TEST_METHOD(TestMethod5) //(sum=array)&&(sum>max)&&(max<0)
{
int array[] = { -2,-1,-3 };
int num = sizeof(array) / sizeof(array[0]);
int Max = GetSum(array, num);
Assert::AreEqual(Max, 0);
}
TEST_METHOD(TestMethod6) //(sum=array)&&(sum<max)&&(max<0)
{
int array[] = { -2,-3,-5 };
int num = sizeof(array) / sizeof(array[0]);
int Max = GetSum(array, num);
Assert::AreEqual(Max, 0);
}
3.3测试结果
3.总结
本次作业,学到了简单的个人项目的开发,也更加熟悉了单元测试,能够对不同类型的条件进行单元测试,收获满满。
每一次作业都会有新的收获,我也会在学习的道路上一直走下去,屏幕前的你,也要加油啊!

更多精彩