软件工程第三次作业
作业要求
题目:最大连续子数组和(最大子段和)
背景
问题: 给定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。
--引用自《百度百科》
程序代码
源文件代码
#include "stdafx.h"
#include"iostream"
using namespace std;
int Max(int n,int a[])
{
int i, sum=0,max=0,t=0;
for (i = 0; i < n; i++)
{
if (a[i] < 0)
t++;
sum = sum + a[i];
if (sum < 0)
sum = 0;
if (max < sum)
max = sum;
}
return max;
}
int main()
{
int a[100],n,i,max;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> a[i];
}
max=Max(n,a);
cout << max;
return 0;
}
头文件代码
#pragma once
int Max(int n, int a[])
{
int i, sum = 0, max = 0, t = 0;
for (i = 0; i < n; i++)
{
if (a[i] < 0)
t++;
sum = sum + a[i];
if (sum < 0)
sum = 0;
if (max < sum)
max = sum;
}
return max;
}
代码流程图
测试代码及结果
判定-条件覆盖
判定中所有可能的条件组合
(1)i>=n
(2)i<n&&sum>max
(3)i<n&&sum<=max&&sum>=0
(4)i<n&&sum<=max&&sum<0
共有4种
测试用例2为整数全为负数的情况
测试用例1,3,4测试了条件(2)(3)(4)在连续整数的不同位置
TEST_METHOD(TestMethod1)
{
// TODO: 在此输入测试代码
int k;
int a[8] = { 10,6,-5,4,-6,-2,3,5 };
k = Max(8,a);
Assert::AreEqual(k, 16);
}
TEST_METHOD(TestMethod2)
{
// TODO: 在此输入测试代码
int k;
int a[8] = { -3,-2,-1,-7,-5,-1,-6,-7 };
k = Max(8, a);
Assert::AreEqual(k, 0);
}
TEST_METHOD(TestMethod3)
{
// TODO: 在此输入测试代码
int k;
int a[8] = { 1,-2,3,-4,5,-6,7,9 };
k = Max(8, a);
Assert::AreEqual(k, 16);
}
TEST_METHOD(TestMethod4)
{
// TODO: 在此输入测试代码
int k;
int a[8] = { -1,-2,3,4,-5,6,-3,-3 };
k = Max(8, a);
Assert::AreEqual(k, 8);
}