軟體工程-單人任務
任務描述:
請閱讀鄒欣老師的這篇博文(地址: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值。之後,我用測試驗證了我的想法的正確性。透過這次實驗,我已經可以熟練進行程式碼測試,對測試的思想以及測試工具都有了更深一步的掌握。我會在日後學習中大量練習這種測試方法,為我日後的工作學習做好準備。