软件工程第三次作业
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.解题思路
若数组为空则返回0。
若不为空,则从数组左边开始,依次遍历。并定义最大子段和变量max记录最大值并不断更新。当此字段和大于先前记录的最大字段和时,则最大字段和更改为此字段和,直到遍历结束。
3.程序设计
主要代码如下所示。
int MAX::GetMaxAddOfArray(int a[], int n)
{
int sum = 0;
int max = 0;
if (a == NULL||n==0)
{
return 0;
}
for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
sum = sum+a[j];
if (sum > max)
{
max = sum;
}
}
sum = 0;
}
return max;
}
4.程序流程图
5.单元测试
-
本次测试选用判定/条件覆盖。
即没个判定真假各一次,每个判定中条件各一次。
1 | 2 | 3 | 4 |
---|---|---|---|
数组为NULL | i<=n | j<=n | sum<=max |
数组不为NULL | i>n | j>n | sum>max |
-
测试用例
测试用例 结果 n=0;a[]= 0 n=6;a[6]= 0 n=6;a[6]= 20 n=5;a[5]= 5 n=5;a[5]= 5 -
测试代码
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../Project2/P2.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
MAX m;
int max, a[] = { 0 };
max = m.GetMaxAddOfArray(a, 0);
Assert::AreEqual(max, 0);
}
TEST_METHOD(TestMethod2)
{
MAX m;
int max, a[6] = { -1,-2,-3,-4,-5,-6 };
max = m.GetMaxAddOfArray(a, 6);
Assert::AreEqual(max, 0);
}
TEST_METHOD(TestMethod3)
{
MAX m;
int max, a[6] = { -2,11,-4,13,-5,-2 };
max = m.GetMaxAddOfArray(a, 6);
Assert::AreEqual(max, 20);
}
TEST_METHOD(TestMethod4)
{
MAX m;
int max, a[5] = { -1,2,-3,-4,5 };
max = m.GetMaxAddOfArray(a, 5);
Assert::AreEqual(max, 5);
}
TEST_METHOD(TestMethod5)
{
MAX m;
int max, a[5] = { 1,2,3,4,5};
max = m.GetMaxAddOfArray(a, 5);
Assert::AreEqual(max, 15);
}
};
}
-
测试结果如下。
5.遇到的问题及解决方法
这个题目有多种解题方法,刚看到题目时自然想到了以上算法。但以上算法时间复杂度为O(n^2),并不是很好的算法。由此经过思考和网上查询资料,得到了相对更好的方法。其主要代码如下。
int MAX::GetMaxAddOfArray(int a[], int n)
{
int sum = 0;
int max = 0;
if (a == NULL || n == 0)
{
return 0;
}
for (int i = 0; i < n; i++)
{
sum = sum + a[i];
if (sum < 0)
{
sum = 0;
}
if (sum > max)
{
max = sum;
}
}
return max;
}
流程图如下所示。
结果如下
完整代码及测试代码:https://git.dev.tencent.com/shy163401010204/zuida.git
参考资料:https://blog.csdn.net/m0_37925202/article/details/80816684
6.总结
本次作业中,涉及到了代码编程规范,并学习了五大覆盖标准,明白了各个标准之间的区别与联系。同时,也复习了之前的单元测试的内容。在学习的过程中,我发现自己编写的代码过于暴力解题,并没有深层次考虑更加有效率的办法,在今后的编程中还要多加改进。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 我干了两个月的大项目,开源了!
· 推荐一款非常好用的在线 SSH 管理工具
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 千万级的大表,如何做性能调优?
· .NET周刊【1月第1期 2025-01-05】