最大連續子陣列和求解問題(C語言)

kangjiamu發表於2024-04-10

軟體工程-單人任務

任務描述:

請閱讀鄒欣老師的這篇博文(地址:https://www.cnblogs.com/xinz/archive/2011/10/22/2220872.html)和構建之法第1~3章內容,尤其是第2章效能分析和第3章程式碼規範部分。

回顧和複習課堂講授的單元測試部分內容。

任務目的:

熟悉一個“高質量”軟體的開發過程。

任務要求:

(1) 請從語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、條件組合覆蓋五個覆蓋標準中(條件組合覆蓋難度較大,鼓勵嘗試,但請謹慎選擇),任選一個標準設計測試用例 。
(2) 請利用自動測試工具對程式進行測試 。
(3) 請下載《第二次作業.doc》模板將程式執行結果和自動測試分析結果截圖儲存到文件中,提交。

【題目內容】

使用C語言完成: 給定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】

輸入:

-2 11 -4 13 -5 -2

輸出:

20

【測試用例2】

輸入:

6 -3 -2 7 -15 1 2 2

輸出:

8

【測試用例3】

輸入:

-5 -3 -7 -10 -6 -8 -2

輸出:

0

程式碼實現:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, i, j;
    scanf_s("%d", &n);
    int *array = (int*)malloc(sizeof(int) * n);
    int max = 0, number = 0;//max用來輸出最大子列和,number是統計子列中負數的個數
    int sum;
    for (i = 0; i < n; i++)
    {
        scanf_s("%d", &array[i]);
        //scanf("%d",array+i);兩種寫法等價
        max += array[i];
        if (array[i] < 0) number++;
    }
    if (number == n)
    {
        printf("0");
        return 0;
    }//如果都是負數,則返回0
    for (i = 0; i < n; i++)
    {
        if (array[i] <= 0) continue;
        sum = 0;
        for (j = i; j < n; j++)
        {
            sum += array[j];
            if (sum > max)
            {
                max = sum;
            }
        }
    }
    printf("%d", max);
    return 0;
}

測試程式碼:

#include "stdafx.h"
#include "CppUnitTest.h"
#include "..\Max\標頭.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
    TEST_CLASS(UnitTest1)
    {
    public:
        TEST_METHOD(TestMethod1)
        {
            int arr[6] = { -2,11,-4,13,-5,-2 }, max;
            max = Max(arr, 6);
            Assert::AreEqual(max, 20);
        }
        TEST_METHOD(TestMethod2)
        {
            int arr[5] = { -1,2,3,-6,9}, max;
            max = Max(arr, 5);
            Assert::AreEqual(max, 9);
        }

        TEST_METHOD(TestMethod3)
        {
            int arr[6] = { -2,-11,-4,-13,-6,-2 }, max;
            max = Max(arr, 6);
            Assert::AreEqual(max, 0);
        }
        TEST_METHOD(TestMethod4)
        {
            int  arr[6] = { 3,5,6,7,8,9}, max;
            max = Max(arr, 6);
            Assert::AreEqual(max, 38);
        }
    };
}

總結與反思:

經過一段時間的學習,我對最大連續子陣列和求解問題有了深入的瞭解。在實驗中,對於如何求最大連續子陣列和,我的思路是先把所有子列和作為初始最大值max,再遍歷整個逐步求sum,不斷更新max的值,最後得到最大的max值。之後,我用測試驗證了我的想法的正確性。透過這次實驗,我已經可以熟練進行程式碼測試,對測試的思想以及測試工具都有了更深一步的掌握。我會在日後學習中大量練習這種測試方法,為我日後的工作學習做好準備。

相關文章