软件工程第三次作业

一、题目概述

最大连续子数组和(最大子段和)

背景
问题: 给定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。

二、源代码

https://github.com/hanserx/hanfeng.git

#include<stdio.h>

int Maxsum(int a[], int n)
{
   int sum, Maxsum;
   sum = Maxsum = 0;
   int i, j;
   for (i=0; i<n; i++)
   {
   	sum = 0;
   	for (j=i; j<n; j++)
   	{
   		sum+=a[j];
   		if (sum > Maxsum)
   			Maxsum=sum;
   	}
   }
   return Maxsum;
}
int main()
{
   int a[100], number;
   scanf_s("%d", &number);
   for (int i=0; i<number; i++)
   {
   	scanf_s("%d", &a[i]);
   }
   printf("%d", Maxsum(a, number));
   return 0;
}

三、流程图

四、单元测试

采用如下四组数据

5,10,15,20
-5,-10,-15
-10,-20,10,15,20,-10,15,-5
0
结果如下:

测试代码如下:

#include "stdafx.h"
#include "CppUnitTest.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
extern int Maxsum(int a[], int n);

namespace UnitTest1
{		
   TEST_CLASS(UnitTest1)
   {
   public:
   	
   	TEST_METHOD(TestMethod1)
   	{
   		int a[] = { 5,10,15,20 };
   		Assert::AreEqual( 50,Maxsum(a, 4));
   	}
   	TEST_METHOD(TestMethod2)
   	{
   		int a[] = { -5,-10,-15 };
   		Assert::AreEqual(0,Maxsum(a, 3));
   	}
   	TEST_METHOD(TestMethod3)
   	{
   		int a[] = { -10,-20,10,15,20,-10,15,-5 };
   		Assert::AreEqual(50,Maxsum(a, 8));
   	}
   	TEST_METHOD(TestMethod4)
   	{
   		int* a = 0;
   		Assert::AreEqual(0,Maxsum(a, 0));
   	}

   };
}

posted on 2019-04-21 19:29  yuqici  阅读(91)  评论(0编辑  收藏  举报

导航