判定/條件覆蓋


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、程序

Coding地址

用JAVA編寫設計代碼,完成上述題目要求。

public class Array {
	 public int AArray(int[] arr,int length)
	 {
		 int MAXSUM=0;
		 int low=0;
		 int height=0;
		 int i;
		 int SUM=0;
		 for(i=0;i<length;i++)
		 {
			 SUM+=arr[i];
			 if(SUM>MAXSUM)
			 {
				 MAXSUM=SUM;
				 height=i;
			 }
			 else if(SUM<0)
			 {
				 SUM=0;
				 low=i+1;
			 }
		 }
		 System.out.println("最低位:"+low);
		 System.out.println("最高位:"+height);
		 return MAXSUM;
	 }
}

3、判定/條件覆蓋

判定/條件覆蓋:選擇足夠多的測試用例,使程序中每個判定的"真"和"假"至少執行一次,並且每個判定的每個條件取得各種可能的結果。
畫出上述程序的流程圖,如下所示。

根據流程圖設計測試樣例。
判定一(i =length)
判定二(SUM>MAXSUM,SUM<=MAXSUM)
判定三(SUM>=0,SUM<0)
i處於累加的狀態,可以不用考慮,所以判定一不用考慮真假

序號 SUM>MAXSUM SUM<0 路徑 樣例
數組 長度
1 T   a->c->a->c->...->end {2,6,5,8,7,9} 6
2 F T a->b->e->a->b->e->...->end {-2,-6,-5,-8,-7,-9} 6
3 F F a->b->d->a->b->d->...->end {} 0
4 在循環中T與F交替進行 a->c->a->b->e->a->...->end {-2,8,-9,5,-4,6} 6
#4、測試與結果

測試代碼如下

``` class ArrayTest {
@Test
void testAArray1() {
	int[] arr= {2,6,5,8,7,9};
	int length=arr.length;
	assertEquals(37,new Array().AArray(arr,length));
}

@Test
void testAArray2() {
	int[] arr= {-2,-6,-5,-8,-7,-9};
	int length=arr.length;
	assertEquals(0,new Array().AArray(arr,length));
}

@Test
void testAArray3() {
	int[] arr= {};
	int length=arr.length;
	assertEquals(0,new Array().AArray(arr,length));
}

@Test
void testAArray4() {
	int[] arr= {-2,8,-9,5,-4,6};
	int length=arr.length;
	assertEquals(8,new Array().AArray(arr,length));
}

}

<p>運行結果圖如下圖所示</p>
![](https://img2018.cnblogs.com/blog/1644765/201904/1644765-20190419193003659-857691667.png)
<p>測試結果如圖所示</p>
![](https://img2018.cnblogs.com/blog/1644765/201904/1644765-20190419184806288-1041425077.jpg)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM