软件工程(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。

(三)源代码

#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));
		}		
	};
}

(五)测试结果

posted @ 2019-04-18 18:59  菠萝Pie  阅读(315)  评论(0编辑  收藏  举报