2020软件工程第二次作业

博客信息 沈阳航空航天大学计算机学院2020软件工程作业
作业要求 https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/10583
课程目标 熟悉一个“高质量”软件开发的过程
作业目标 单元测试练习

一、题目信息

问题:给定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。

二、具体要求

1.要求写出可运行的完整代码提交至GitHub系统中,并将代码地址附到博客内。

2.请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中(条件组合覆盖难度较大,鼓励尝试,但请谨慎选择),任选一个标准设计测试用例,请利用自动测试工具对程序进行测试请将程序运行结果和自动测试分析结果截图附到博客中。

三、代码编写

1.解题思路

根据题目要求,需要输出一组整数中最大的一段数字之和。如下面代码所示,如果数组长度为0,则定义最大子段和也为0,否则遍历数组元素,每循环一次执行sum+=arr[i],并将sum和max相比较,这样就保证最大值在当前max和sum中,如果sum>max,则将sum的值赋给max。在循环过程中如果sum<0,则重新赋值sum=0,直至循环结束,也就求出了最大子段和max。

void maxsub(int arr[], int length)
{
int sum = 0, max = 0;
if (length <= 0)
	max = 0;
else for (int i = 0; i < length; i++)
{
	sum += arr[i];
	if (sum < 0)
		sum = 0;
	else if (sum > max)
		max = sum;
}
for (int i = 0; i < length; i++)
{
	cout << arr[i] << ' ';
}
cout << endl << max <<endl;
}
2.代码链接

求最大子段和

3.程序运行结果截图

测试用例分别为
length=6,arr={-2,11,-4,13,-5,-2}
length=6,arr={-2,-3,-6,-7,-5,-4}
length=0,arr={1,2,-5,7,-4,6}

四、流程图设计与判定条件覆盖

1.流程图

2.判定条件覆盖

判定条件覆盖是设计足够的测试用例,得使判断中每个条件的所有可能取值至少执行一次,同时每个判断本身所有可能结果也至少执行一次。
选择测试用例:
测试用例1:length=0,arr={1,2,-5,7,-4,6},执行路径为BK。
测试用例2:length=6,arr={-2,-3,-6,-7,-5,-4},执行路径覆盖 ACDFH和EK
测试用例3:length=6,arr={-2,11,-4,13,-5,-2},执行路径覆盖 ACDFH、ACDFGJ、ACDFJI和EK

五、单元测试

1.在Visual Studio中编写C / C ++的单元测试

2.单元测试代码
3.测试函数代码

六 工作记录

项目 记录结果
日期 2020年4月7日
开始时间 19:10
结束时间 23:30
编码行数 60
错误数量 1
错误1 当输入数组长度为0时,输出结果不为0
错误修改时间 3分钟

七、总结

通过本次作业,我学会了使用在Visual Studio中编写C / C ++的单元测试,对于比较简单的函数还是能够胜任的,能够进行测试来解决问题,也学会了进行单元测试的几种方法,通过设计测试用例来覆盖在函数执行过程中出现的各种可能,覆盖路径较齐全。除此之外,对GitHub的使用也更加熟练。
原文地址:https://www.cnblogs.com/chenjr/p/12627522.html