軟件工程第三次做業

選擇題目

題目一:最大連續子數組和(最大子段和)

背景:html

問題: 給定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。-- 引用自《百度百科java

題目二:下表爲某商場每日營業額與應收稅率的對照表,請編寫一小程序根據該商場每日營業額計算其實際應繳納稅費。

本次做業選擇題目一(最大連續子數組和(最大子段和))完成git

測試要求

1.請從語句覆蓋、斷定覆蓋、條件覆蓋、斷定/條件覆蓋、>條件組合覆蓋五個覆蓋標準中(條件組合覆蓋難度較大,鼓勵嘗試,但請謹慎選擇),任選一個標準設計測試用例。
2.請利用自動測試工具對程序進行測試。
3.請將程序運行結果和自動測試分析結果截圖附到博客中。github

算法分析

根據分治法:
若是將所給的序列a[1:n]分爲長度相等的兩段a[1:n/2]和a[n/2+1:n],分別求出這兩段的最大子段和,則a[1:n]的最大子段和有三種狀況:算法

(1) a[1:n]的最大子段和與a[1:n/2]的最大子段和相同
(2) a[1:n]的最大子段和與a[n/2+1:n]的最大子段和相同
(3) a[1:n]的最大子段和爲a[i]+…+a[j],而且1<=i<=n/2,n/2+1<=j<=n。小程序

在對於上述分治算法的分析中咱們注意到,若記b[j]=max(a[i]+a[i+1]+..+a[j]),其中1<=i<=j,而且1<=j<=n。則所求的最大子段和爲max b[j],1<=j<=n。
由b[j]的定義可易知,當b[j-1]>0時b[j]=b[j-1]+a[j],不然b[j]=a[j]。故b[j]的動態規劃遞歸式爲:數組

b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n。

算法代碼:函數

b[0]=a[0];max=b[0];
        for(i=1; i<k; i++) {
        if(b[i-1]>0)
            b[i]=b[i-1]+a[i];
        else
            b[i]=a[i];
        if(b[i]>max)
            max=b[i];}

gihub代碼地址:這裏~工具

根據算法畫出程序框圖以下:
單元測試

單元測試

本次單元測試採用條件覆蓋:

根據設計要求生成出符合單元測試的隨機數,將隨機數送入絕對正確的函數中計算,再與本程序對比。如單元測試經過,則證實程序正確。
其中,本次單元測試中絕對正確的函數採用至博文:秦川德利齊
生成不一樣條件隨機數代碼以下:

測試結果

最後通過多輪測試,全部樣例均經過測試。

相關文章
相關標籤/搜索