软件工程第二次作业
博客信息 | 沈阳航空航天大学计算机学院2020软件工程作业 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/10583 |
课程目标 | 熟悉一个“高质量”软件的开发过程 |
作业目标 | 单元测试练习 |
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. 算法思想及代码
利用动态规划的思想,当我们令proSum为当前最大子数组的和,maxSum为最后要返回的最大子数组的和
1.重要的思想是要继承“前人的遗产”,当我们往后扫描时,对第i+1个元素有两种选择——要么放入前面找到的子数组,
要么作为新子数组的第一个元素:
1.1 如果proSum+当前元素a[i]>=a[i],则令proSum加上a[i]
1.2 否则proSum重新赋值,置为下一个元素,即proSum=a[i]。
2.比较当前最大子数组和与最大子数组的和:
2.1 当proSum>maxSum,更新maxSum=proSum
2.2 否则保持原值,不更新。
即
proSum = max(a[i], proSum + a[i])
maxSum = max(maxSum, proSum)
举个例子,当输入数组是1, -2, 3, 10, -4, 7, 2, -5,那么,proSum和maxSum相应的变化为:
proSum : 0 | 1 -1 3 13 9 16 18 13
maxSum : 1 | 1 1 3 13 13 16 18 18
3.代码
#include<stdio.h>
#include<stdlib.h>
int Max(int a[], int n) {
int maxSum = 0;
int proSum = 0;
for (int i = 0; i < n; i++) {
if (proSum < 0)
proSum = a[i];
else
proSum = proSum + a[i];
if (maxSum < proSum)
maxSum = proSum;
}
return maxSum;
}
int main() {
int n;
int a[100];
int maxSum;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
maxSum = Max(a, n);
printf("%d", maxSum);
system("pause");
return 0;
}
4.代码连接
5.程序运行截图
选择用例:(1,-2,3,10,-4,7,2,-5)
3.流程图及判定/条件覆盖
需满足以下覆盖情况:
判定条件覆盖是设计足够的测试用例,得使判断中每个条件的所有可能取值至少执行一次,同时每个判断本身所有可能结果也至少执行一次。
选择用例:(1,-2,3,10,-4,7,2,-5),(-2,11,-4,13,-5,-2),(-1,-2,-3,-4,-5)。
4.单元测试
1.测试代码
#include "stdafx.h"
#include "CppUnitTest.h"
#include"../软件工程作业/test.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest2
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
int n = 8;
int a[8] = { 1,-2,3,10,-4,7,2,-5 };
int right = 18;
Assert::AreEqual(right, Max(a, n));
}
};
TEST_CLASS(UnitTest2)
{
public:
TEST_METHOD(TestMethod1)
{
int n = 6;
int a[6] = { -2,11,-4,13,-5,-2 };
int right = 20;
Assert::AreEqual(right, Max(a, n));
}
};
TEST_CLASS(UnitTest3)
{
public:
TEST_METHOD(TestMethod1)
{
int n = 5;
int a[5] = { -1,-2,-3,-4,-5 };
int right = 0;
Assert::AreEqual(right, Max(a, n));
}
};
}
2.测试结果截图
可见程序正确。
5.工作记录
项目 | 记录结果 |
---|---|
日期 | 2020年4月8日 |
开始时间 | 13:30 |
结束时间 | 17:30 |
编码行数 | 80 |
错误数量 | 1 |
错误1 | 单元测试忘了引入头文件 |
错误修改时间 | 10分钟 |
6.总结
通过本次作业,学习了在Visual Studio中编写C/C++的单元测试,靠着自学一点点摸索学到了新知识,认识到了软件开发的严谨性,学会了通过设计测试用例来覆盖在函数执行过程中出现的各种可能的错误,学会了覆盖路径的考虑,继续努力!