软件工程第三次作业

题目(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。
-- 引用自《百度百科

[coding地址](https://dev.tencent.com/u/zhoucysw)<-----代码在这里_;


算法设计以及实现过程:


  • 算法设计描述:在输入数组以及数组个数之后,定义了数组和与最大子段和都为0,循环计算,如果数组和大于最大子段和,就把数组和赋值给最大子段和,反之,最大子段和不变。

  • 流程图:

  • 源代码:

    #include<iostream>
    using namespace std;
    int max(int a[], int n)
    {
    	int maxsum,sum = maxsum = 0;
    	int i;
    	for (i = 0; i < n; i++)
    	{
    		sum += a[i];
    		if (sum > maxsum)
    			maxsum = sum;
    		else if (sum < 0)
    			sum = 0;
    	}
    	return maxsum;
    }
    int main()
    {
    	int i, n;
    	int num[100];
    	cin >> n;
    	for (i = 0; i < n; i++) {
    		cin >> num[i];
    	}
    	int maxsum = max(num, n);
    	cout << maxsum<< endl;
    	system("pause");
    }
    
  • 源代码编译:

  • 测试代码:

    #include "stdafx.h"
    #include "CppUnitTest.h"
    #include"..work31.h"
    
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;
    
    namespace UnitTest3
    {		
    	TEST_CLASS(UnitTest1)
    	{
    	public:
    
    		TEST_METHOD(TestMethod1)
    		{
    			int a[] = { 2,11,4,13,5,-2 };
    			int b = max(a, 6);
    			Assert::AreEqual(33, b);
    			// TODO: 在此输入测试代码
    		}
    	
    	};
    }
    
  • 测试代码编译:

  • 条件判定测试:

    1. 数组为空:当数组为空时,最大子段和应该为0;

    2. 数组全为负数:当数组全为负数时,最大子段和为0;

    3. 数组全为正数:当数组全为正数时,最大子段和为数组和;

    4. sum>maxsum:当数组和大于最大子段和时,最大子段和等于数组和;

    5. sum<maxsum:当数组和小于最大子段和时,最大子段和保持不变;


  • 总结:在这次的个人作业中,是一个完整的代码实现过程,在测试代码的过程中用到了单元测试,经过上一次的练习,这次再使用起来得心应手多了。单元测试是一个软件测试必经之路,虽然这次测试的代码不算很难,测试起来很容易覆盖到,但是这是一个培养思维方式的过程,相信经过不断强化的练习,会慢慢的积累不少的经验。
原文地址:https://www.cnblogs.com/zhoucysw/p/10732276.html