软件工程第三次作业
题目要求
题目(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。
-- 引用自《百度百科》
本次作业,我选择题目一作为作业题目
解题思路
- 采用最简单的方法列举出所有子数组集,然后求和。
#include<iostream>
#include"Max.h"
using namespace std;
//暴力法求最大子数组和问题
int maxsum::Maxsum(int* a,int num)
{
int sum = -10000;//记录子数组的和
for (int i = 0; i < num; i++)
{
int subarraysum = 0;
for (int j = i; j < num; j++)
{
//所遍历出来的子数组的和
//计算遍历的子数组之和
subarraysum += a[j];
//找出最大的子数组
if (subarraysum>sum)
{
sum = subarraysum;
}
}
}
if (sum < 0)
sum = 0;
return sum;
}
- 程序框图
- 判断覆盖原理
程序测试
- 首先创建一个C++控制台程序
工程名为Maxsum空的工程就可以,然后在工程中添加Max.h、Maxsum.cpp、main.cpp文件
头文件中代码
#ifndef __MAX_H__
#define __MAX_H__
#include<stdio.h>
class maxsum{
public:
int Maxsum(int* a, int n);
};
#endif //!__MAX_H__
主函数中代码
#include<iostream>
#include"Max.h"
using namespace std;
int main()
{
return 0;
}
- 已经写好的程序工程如图所示
- 现在在工程中新建一个测试工程
右键单击解决方案添加单元测试项目
在测试的源文件中添加#include "../Maxsum/Max.h"
- 根据判断覆盖设计测试数据
测试程序如下:
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../Maxsum/Max.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: 在此输入测试代码
maxsum ziduan;
int n = 6, a[6] = { -2, 11, -4, 13, -5, -2 };
Assert::AreEqual(20,ziduan.Maxsum(a,n));
}
TEST_METHOD(TestMethod2)
{
// TODO: 在此输入测试代码
maxsum ziduan;
int n = 6, a[6] = { -1, -2, -3, -4, -5, -6 };
Assert::AreEqual(0, ziduan.Maxsum(a, n));
}
TEST_METHOD(TestMethod3)
{
// TODO: 在此输入测试代码
maxsum ziduan;
int n = 5, a[6] = { 1, 2, 3, 4, 5 };
Assert::AreEqual(15, ziduan.Maxsum(a, n));
}
TEST_METHOD(TestMethod4)
{
// TODO: 在此输入测试代码
maxsum ziduan;
int n = 5, a[6] = { 2, 3, 4, -1, 2 };
Assert::AreEqual(10, ziduan.Maxsum(a, n));
}
}
}
这里我们直接运行测试是不会正常运行的需要在修改测试工程的链接器中的输入的附加依赖项
然后在运行测试得到测试结果
源代码:https://coding.net/u/renyanyong/p/maxsum/git/tree/master/Maxsum?public=true