软件工程第三次作业
所选题目
我所选择的题目为求最大连续子数组和。写博客不是写教程,所以我只给出了一些关键部分的截图。
使用的算法
使用了Kadane算法,这个算法的时间复杂度为O(n),对于解决这种问题十分有效。我使用C++进行了实现。
代码如下
# include <iostream>
using namespace std;
class Maxsub
{
public:
Maxsub();
Maxsub(int * p,int position);
~Maxsub();
int max_sub();
private:
int * arr;
int positon;
int max(int fir, int sec);
};
Maxsub::Maxsub()
{
}
//position is the length of the array.
Maxsub::Maxsub(int * p, int position)
{
Maxsub::arr = p;
Maxsub::positon = --position;
}
Maxsub::~Maxsub()
{
}
int Maxsub::max_sub()
{
int max_pre = Maxsub::arr[0];
int max = Maxsub::arr[0];
for (int i = 1; i <= positon; i++)
{
max_pre = Maxsub::max(Maxsub::arr[i],(Maxsub::arr[i]+max_pre));
max = Maxsub::max(max_pre,max);
}
return max;
}
int Maxsub::max(int fir, int sec)
{
return (fir > sec) ? fir : sec;
}
推送到远程仓库
通过git推送到远程仓库,仓库地址为仓库地址链接,在homework3文件夹下。
设计测试用例
我准备使用判定/条件覆盖标准,进行测试。
判定/条件覆盖:是设计足够的测试用例,得使判断中每个条件的所有可能取值至少执行一次,同时每个判断本身所有可能结果也至少执行一次。
首先分析算法,算法中重复使用了两个数中取最大值这个方法,因此每一次循环,就是进行了两次判断。所以可以据此进行设计,我准备使用四组测试用例,这样就可以达到判定/条件覆盖的标准。
这四组数据,覆盖了4条分支路径,并且同时满足了条件覆盖的标准。
测试数据编号 | 要输入的数组 | 预期结果 |
---|---|---|
1 | -5,10,20,-5 | 30 |
2 | 10, 5 ,-5 ,5 | 15 |
3 | 10, 5 , -5 ,10 | 20 |
4 | 10,-15 ,6 ,10 | 16 |
自动单元测试结果
测试部分的代码如下
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../homework3/source.cpp"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: 在此输入测试代码
int ara1[4] = {-5,10,20,-5};
int ara2[4] = { 10,-15 ,6 ,10 };
int ara3[4] = { 10, 5 , -5 ,10 };
int ara4[4] = { 10, 5 ,-5 ,5 };
Maxsub mymaxsub1(ara1, 4);
Maxsub mymaxsub2(ara2, 4);
Maxsub mymaxsub3(ara3, 4);
Maxsub mymaxsub4(ara4, 4);
Assert::AreEqual(mymaxsub1.max_sub(), 30);
Assert::AreEqual(mymaxsub2.max_sub(), 16);
Assert::AreEqual(mymaxsub3.max_sub(), 20);
Assert::AreEqual(mymaxsub4.max_sub(), 15);
}
};
}
测试结果如下