软件工程第三次作业

作业要求
题目:最大连续子数组和(最大子段和)
背景

问题: 给定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);
		}

代码的coding链接

posted @ 2019-04-20 22:23  harunosuke  阅读(108)  评论(0编辑  收藏  举报