软件工程(2019)第三次作业
最大连续子数和
(一)问题背景
>问题: 给定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。
-- 引用自《百度百科》
(二)问题分析
根据题目分析可知,本题是要求出一个数组中最大的子段和,除了设置需要输入的数组a外,还需要设置一个数组b,来记录子段和,根据题目要求,设置数组第一项为a[1]与b[1],初始化变量max=b[1],用作最终的输出。
既然所求子段要求最大,那么要与下一个数字相加的子段b[j]的一定是正数,此时选择与下一个数字相加,如果该子段为负数,则将j++,同时将下一个要相加的数字赋值给b[j]。将变量max与b[j]相比较,max=max{max,b[j]}。
不断重复以上过程直到a中所有数字被遍历,最终判断max是否小于0,小于0则将max赋值为0,并输出结果max。
注:根据题目要求,当数组a中的数字均为负数时,最终输出结果为0,所以最终判断max是否小于0,小于0则将max赋值为0,使该程序的最小输出结果定为0。
(三)源代码
- coding.net
- 源.cpp代码内容如下:
#include<stdio.h>
#include<stdlib.h>
#include"Max.h"
int main()
{
int a[100];
int count;
int i;
scanf("%d",&count);
for(i = 1;i <= count;i++)
{
scanf("%d",&a[i]);
}
printf("%d",MaxNumber(count,a));
system("pause");
return 0;
}
- Max.h代码内容如下:
#pragma once
int MaxNumber(int count,int a[])
{
int b[100];
int i;
int j=1;
int max=0;
b[1] = a[1];
for(i = 2;i <= count;i++)
{
if(b[j]<0)
{
j++;
b[j]=a[i];
}
else
{
b[j]+=a[i];
}
if(max<b[j])
{
max=b[j];
}
}
return max;
}
- 算法流程图如下图所示:
(四)判定/条件覆盖测试
根据流程图,可知测试需要覆盖的条件及判定为:a.i<=count b.i>count ; c.b[j]<0 d.b[j]>=0 ; e.max<b[j] f.max>=b[j] ; g.max<0 h.max>=0
- count=6 a[6]={-2,11,-4,13,-5,-2} acfdebh
- count=5 a[5]={-1,-2,-5,-6,-9} acf
- count=5 a[5]={3,-5,-9,10,7,-5} adefbh
- count=1 a[5]={-2,-3,-5,16,-2} bg
- 测试单元代码如下:
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../最大子段和/Max.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: 在此输入测试代码
int a[]={-2,11,-4,13,-5,-2};
Assert::AreEqual(20,MaxNumber(6,a));
}
TEST_METHOD(TestMethod2)
{
// TODO: 在此输入测试代码
int a[]={-1,-2,-5,-6,-9};
Assert::AreEqual(0,MaxNumber(5,a));
}
TEST_METHOD(TestMethod3)
{
// TODO: 在此输入测试代码
int a[]={3,-5,-9,10,7,-5};
Assert::AreEqual(17,MaxNumber(6,a));
}
TEST_METHOD(TestMethod4)
{
// TODO: 在此输入测试代码
int a[]={-2,-3,-5,16,-2};
Assert::AreEqual(0,MaxNumber(1,a));
}
};
}