計算與軟件工程 做業三

本次做業簡介:

這個做業要求在哪裏 做業三的連接見:第三週做業
我在這個課程的目標是 編程能力和思惟靈活性的提升;代碼量和編程實戰能力的提高
此做業在哪一個具體方面幫我實現目標 編程能力的提升
其餘參考文獻 參考1:求最大子數組
參考2:VS C++單元測試的實現1
參考:3:VS C++單元測試的實現2
參考4:C++的文件操做
做業正文 做業三

正文

單元測試

題目要求
用類/函數來實現html

  • 需求:但願返回 3 種信息
    最大子數組的和
    最大子數組開始的下標
    最大子數組結束的下標
  • 從文本文件中讀輸入的數據,熟悉文件操做, 文件有兩種數據
    第一個數字:此次測試中有多少個數據, 數字後面是冒號。
    後續數字:每一個數據的值,用逗號隔開
    好比
    文件內容:
    17: -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61
    輸出
    sum = 71

問題分析
  最大連續子數組的定義爲:一個整數數組中的元素有正有負,在該數組中找出一 個連續子數組,要求該連續子數組中各元素的和最大,這個連續子數組便被稱做最大連續子數組。查閱相關博客和網頁資料,瞭解到求解最大連續子數組的經常使用方法有:1.暴力求解法;2.分治法;3.貪心算法。它們的複雜度分別爲:1.O(n^2);2.O(nlog(n));3.O(n)。本次做業採用的就是分治法來求解,後再經過3個單元測試驗證程序的正確性。
  由於本次做業使用的編程語言是C++,先前VS2010等版本很難實現C++的單元測試,故下載了vs2017版本。有三個程序文件:詳情見文末的代碼附錄,同時也將其託管到了遠程倉庫中。
  碼雲上倉庫的連接地址爲倉庫單元測試
函數測試結果分析
  單元測試添加後:

  要想成功進行單元測試,首先須要將函數的編寫正確,即能經過編譯,不然運行單與測試時會顯示單元測試未運行。若是函數編寫沒有問題,可是單元測試仍就沒法運行,根據參考的相關博客,須要在測試項目右擊,點擊的屬性->清單工具->輸入->附加依賴項->編輯,以後將.obj文件附加進去。(詳細過程能夠參考文章開頭列出的博文:參考2和參考3)

附加過程:

添加成功後,測試文件成功運行,以下:
單元測試運行成功:
ios

將程序push到遠程倉庫中

git

博客做業

  回顧本專業前兩年半的學習經歷,學習了不少與計算機和編程相關的課程。第一年接觸了基礎的一些課程:大學計算機基礎(主要適合MS Office相關)、C++(與編程的初次接觸,學習了一些較爲基礎的編程知識);第二年學習了:數據結構(對編程和算法的認識獲得了進一步的提升,代碼的編寫量也有相應地增長,對編程的思想有了更進一步的學習)、Java(這是接觸的第二個語言,在NetBeans進行編程時,十分方便,比C++更爲方便簡單些);第三年:MATLAB(首先是經過數值分析的學習,對MATLAB進行了一些使用,後用經過MATLAB與科學計算這門課程進行了系統的學習,它是一款強大的數學軟件,使用方便,功能很強大)、數據庫操做系統(經過這兩門課程的學習,對數據庫以及計算機操做系統的相關理論有了必定的學習瞭解,可以經過計算機終端進行操做)、ASP.Net(經過這門課程的學習,對網頁設計以及一些控件管理、前臺操做與後臺數據庫的連接進行了初步學習)。在學習C++,數據結構、數據庫和ASP.Net時都作了相應的課程設計,大部分是經過團隊合做進行完成的。
  本人目前會C++,MATLAB、JAVA和ASP.Net的一些基本操做。對C++和MATLAB較爲熟悉些,對已有程序的閱讀,首先是看相關的說明文件和註釋,若是代碼的這兩部分不夠清晰,則先看看主函數的實現過程,根據主函數閱讀其使用到的函數。關於編程的技能方面,後面須要增強的主要是算法

預習

代碼的規範和複審
  這一部分主要是闡述了代碼的規範的重要性,一個重要的原則就是:簡明,易讀,無二義性。一個簡明易讀的代碼,不只可以提升我的對代碼的檢查分析,也有利於後期的代碼複審和多人合做。
  代碼複審主要目的是:1.找出代碼錯誤;2.發現邏輯錯誤(程序能夠編譯經過,可是代碼的邏輯是錯的);3.發現算法錯誤(好比使用的算法不夠優化等);4.發現潛在的錯誤和迴歸性錯誤(當前的修改是否會致使之前修復的缺陷又從新出現);5.發現可能改進的地方;6.教育(互相教育)開發人員,傳授經驗,讓更多的成員熟悉項目各部分的代碼,同時熟悉和應用領域相關的實際知識。其通常形式有:自我複審、同伴複審、團隊複審。其中最基本的就是同伴複審,團隊複審是最嚴格的。
結對編程
  其實剛開始,我的也以爲結對編程會讓人很不適應,通讀了文章再想一想,若是兩我的可以很好的配合的話,那結對編程的確可以提升編程的效率,避免一些錯誤,正如講義中所說結對編程的兩我的就像駕駛員和領航員的做用,若是配合得當,兩我的會互相影響提升,可以獲得更高的投入產出比。在團隊合做中, 處於平等地位的團隊成員通常是經過 「影響 + 反饋」 的方式來影響同伴數據庫

代碼附錄

//分治法實現查找最大連續子數組的.cpp文件:Array_Cal.cpp
// Array_Cal.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
//用類/函數來實現:
//1、需求:但願返回 3 種信息: 最大子數組的和,最大子數組開始的下標,最大子數組結束的下標
//2、從文本文件中讀輸入的數據,熟悉文件操做, 文件有兩種數據。第一個數字:此次測試中有多少個數據, 數字後面是冒號。後續數字: 每一個數據的值,用逗號隔開
#include<iostream>
#include"Array_Cal.h"
#include<cstdlib>

#define N 1000
#define Max 5000

using namespace std;

//分治法
R Max_Sum(int A[], int low, int mid, int high)
{
    R b;
    int Max_L = mid;//左邊最大值位置
    int Max_SL = -Max;//左邊最大和
    int SL = 0;
    //左邊
    for (int i = mid;i >= low;i--)
    {
        SL += A[i];
        if (SL > Max_SL)
        {
            Max_SL = SL;
            Max_L = i;
        }
    }
    //右邊    
    int Max_R = mid + 1;//右邊最大值位置
    int Max_SR = -Max;//右邊最大和
    int SR = 0;
    for (int i = mid+1;i <= high;i++)
    {
        SR += A[i];
        if (SR > Max_SR)
        {
            Max_SR = SR;
            Max_R = i;
        }
    }
    b.l = Max_L;
    b.r = Max_R;
    b.s = Max_SR + Max_SL;
    return b;
}


int main()
{
    int a[] = {-1,1,2,6,5,4,3};
    R t=Max_subArray(a,0,6);
    cout << t.l<<"  "<<t.r<<"  "<<t.s;

}
//分治法實現查找最大數組
R Max_subArray(int A[], int start, int end)//A表示所分析的數組
{
    R b,t1,t2,t3;
    if (start == end)
    {
        b.l = start;
        b.r = end;
        b.s = A[start];
        return b;
    }
    else
    {
        int mid = (start + end) / 2;
        t1 = Max_subArray(A, start, mid);
        t2 = Max_subArray(A, mid + 1, end);
        t3 = Max_Sum(A, start, mid, end);
    }
    if (t1.s < t2.s || t1.s < t3.s)
    {
        if (t2.s < t3.s) return t3;
        else return t2;
    }
    else return t1;
}


//頭文件Array_Cal.h
#pragma once

struct R//結構體,返回最大子數組的左側下標/右側下標/元素和
{
    int l, r, s;
};
R Max_subArray(int A[], int start, int end);

//測試文件UnitTest1.cpp
#include "pch.h"
#include "CppUnitTest.h"
#include "..\Array_Cal\Array_Cal.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{
    TEST_CLASS(UnitTest1)
    {
    public:
        
        TEST_METHOD(TestMethod1)
        {
            int a[] = { 4,3,2,1,5 };
            R t=Max_subArray(a,0,5);
            Assert::AreEqual(t.l,0);
            Assert::AreEqual(t.r,4);
            Assert::AreEqual(t.s,15);
        }
        TEST_METHOD(TestMethod2)
        {
            int a[] = { -4,-2,-3,-7 };
            R t = Max_subArray(a, 0, 3);
            Assert::AreEqual(t.l, 1);
            Assert::AreEqual(t.r, 1);
            Assert::AreEqual(t.s, -2);
        }
        TEST_METHOD(TestMethod3)
        {
            int a[] = { -5,5,-3,2,-1,0,4 };
            R t = Max_subArray(a, 0, 6);
            Assert::AreEqual(t.l, 1);
            Assert::AreEqual(t.r, 6);
            Assert::AreEqual(t.s,7);
        }
    };
}
相關文章
相關標籤/搜索