第三次作业

1.题目要求:

给定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。

2.编写代码

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

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 100
int maxsub(int left, int right,int a[])
{
	int center, i;
	int sum, left_sum, right_sum;
	int left_max, right_max;
	center = (left + right) / 2;
	if (left == right)
		return a[left]>0 ? a[left] : 0;
	else
	{
		left_sum = maxsub(left, center,a);
		right_sum = maxsub(center + 1, right,a);
		sum = 0;
		left_max = 0;
		for (i = center; i >= left; i--)
		{
			sum += a[i];
			if (sum>left_max)
				left_max = sum;
		}
		sum = 0;
		right_max = 0;
		for (i = center + 1; i <= right; i++)
		{
			sum += a[i];
			if (sum>right_max)
				right_max = sum;
		}
		sum = right_max + left_max;
		if (sum<left_sum)
			sum = left_sum;
		if (sum<right_sum)
			sum = right_sum;
	}
	return sum;
}
namespace UnitTest1
{		
	TEST_CLASS(UnitTest1)
	{
	public:
		
		TEST_METHOD(TestMethod1)
		{
			// TODO:  在此输入测试代码
			int a[6] = { -1,-6,-3,-5,-7,-2 };
			int sum = maxsub(0, 5,a);
			Assert::AreEqual(0, sum);
		}
		TEST_METHOD(TestMethod2)
		{
			// TODO:  在此输入测试代码
			int a[6] = { -3,5,-8,9,-2,6 };
			int sum = maxsub(0, 5, a);
			Assert::AreEqual(13, sum);
		}
		TEST_METHOD(TestMethod3)
		{
			// TODO:  在此输入测试代码
			int a[6] = { 8,-3,5,6,-9,7 };
			int sum = maxsub(0, 5, a);
			Assert::AreEqual(16, sum);
		}
	};
}

3.单元测试

覆盖方法

(1)语句覆盖
(2)判定覆盖
(3)条件覆盖
(4)判定/条件覆盖
(5)条件组合覆盖

代码如下:

#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 100
int maxsub(int left, int right);
int a[MAX];
int main()
{
	int i;
	int count;
	//scanf("%d", &count);
	cin >> count;
	for (i = 0; i<count; i++)
	{
		//scanf("%d", &a[i]);
		cin >> a[i];
	}
	printf("%d/n", maxsub(0, count - 1));
	system("pause");
	return 0;
}
int maxsub(int left, int right)
{
	int center, i;
	int sum, left_sum, right_sum;
	int left_max, right_max;
	center = (left + right) / 2;
	if (left == right)
		return a[left]>0 ? a[left] : 0;
	else
	{
		left_sum = maxsub(left, center);
		right_sum = maxsub(center + 1, right);
		sum = 0;
		left_max = 0;
		for (i = center; i >= left; i--)
		{
			sum += a[i];
			if (sum>left_max)
				left_max = sum;
		}
		sum = 0;
		right_max = 0;
		for (i = center + 1; i <= right; i++)
		{
			sum += a[i];
			if (sum>right_max)
				right_max = sum;
		}
		sum = right_max + left_max;
		if (sum<left_sum)
			sum = left_sum;
		if (sum<right_sum)
			sum = right_sum;
	}
	return sum;
}

测试结果:

4.心得体会

在这一次的实际操作中,为我们以后打下了坚实的基础,除此之外我们还学会了几种单元测试的覆盖情况,我成长了很多,希望我可以更进一步。

posted @ 2018-04-01 15:57  我,代福琳,打钱  阅读(119)  评论(0编辑  收藏  举报