計算與軟件工程課程 作業三


這個作業要求在哪里 第三周作業
我在這個課程的目標是 通過練習單元測試鞏固所學的“兩人合作”這章內容
此作業在哪個具體方面幫我實現目標 代碼編寫更加規范專業
其他參考文獻 《構建之法》和 參考代碼
作業正文 https://i-beta.cnblogs.com/posts/edit;postId=12461182)

一、單元測試(數組中最大子數組的和)

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

二、具體代碼

#include<iostream>
#include<cstdlib>
using namespace std;
int getmax(int array[],int length)
{
    int sum = 0;    //記錄當前連續子數組的最大和
    int max = 0;   //記錄當前數組連續幾個元素的和(當其值小於0時,重新對其賦值;【即:拋棄前面的所有元素】)
    int startIndex = 0; //記錄子數組(和最大)的起始位置
    int endIndex = 0;   //記錄子數組(和最大)的終止位置
    int newStartIndex = 0;  //記錄子數組(和最大)的新的起始位置
    for (int i = 0; i < length; i++)    //遍歷整個目標數組
    {
        if (max < 0)   //如果max < 0;則要對max重新賦值
        {
            max = array[i];    //對max重新賦值
            newStartIndex = i;  //暫時記錄子數組(和最大)的新的起始位置(要看后續的sum 和 max是否發生交換)
        }
        else
        {
            max += array[i];   //如果max >= 0;則要繼續將此時的數組元素(array[i])加入到max中
        }
        if (sum < max) //如果此時 sum < max;則表示此時的子數組和大於之前的子數組和
        {
            sum = max; //將大的子數組和max賦值給sum
            startIndex = newStartIndex; //子數組(和最大)的新的起始位置起作用了
            endIndex = i;   //子數組(和最大)的終止位置(只要發生交換就說明endIndex發生變化)
        }
    }
    return max;
}

int getstartIndex(int array[],int length)
{
    int sum = 0;    //記錄當前連續子數組的最大和
    int max = 0;   //記錄當前數組連續幾個元素的和(當其值小於0時,重新對其賦值;【即:拋棄前面的所有元素】)
    int startIndex = 0; //記錄子數組(和最大)的起始位置
    int endIndex = 0;   //記錄子數組(和最大)的終止位置
    int newStartIndex = 0;  //記錄子數組(和最大)的新的起始位置
    for (int i = 0; i < length; i++)    //遍歷整個目標數組
    {
        if (max < 0)   //如果temp < 0;則要對temp重新賦值
        {
            max = array[i];    //對max重新賦值
            newStartIndex = i;  //暫時記錄子數組(和最大)的新的起始位置(要看后續的sum 和 max是否發生交換)
        }
        else
        {
            max += array[i];   //如果max >= 0;則要繼續將此時的數組元素(array[i])加入到max中
        }
        if (sum < max) //如果此時 sum < max;則表示此時的子數組和大於之前的子數組和
        {
            sum = max; //將大的子數組和max賦值給sum
            startIndex = newStartIndex; //子數組(和最大)的新的起始位置起作用了
            endIndex = i;   //子數組(和最大)的終止位置(只要發生交換就說明endIndex發生變化)
        }
    }
    return startIndex;
}
int getendIndex(int array[],int length)
{
    int sum = 0;    //記錄當前連續子數組的最大和
    int max = 0;   //記錄當前數組連續幾個元素的和(當其值小於0時,重新對其賦值;【即:拋棄前面的所有元素】)
    int startIndex = 0; //記錄子數組(和最大)的起始位置
    int endIndex = 0;   //記錄子數組(和最大)的終止位置
    int newStartIndex = 0;  //記錄子數組(和最大)的新的起始位置
    for (int i = 0; i < length; i++)    //遍歷整個目標數組
    {
        if (max < 0)   //如果max < 0;則要對max重新賦值
        {
            max = array[i];    //對max重新賦值
            newStartIndex = i;  //暫時記錄子數組(和最大)的新的起始位置(要看后續的sum 和 max是否發生交換)
        }
        else
        {
            max += array[i];   //如果max >= 0;則要繼續將此時的數組元素(array[i])加入到max中
        }
        if (sum < max) //如果此時 sum < max;則表示此時的子數組和大於之前的子數組和
        {
            sum = max; //將大的子數組和max賦值給sum
            startIndex = newStartIndex; //子數組(和最大)的新的起始位置起作用了
            endIndex = i;   //子數組(和最大)的終止位置(只要發生交換就說明endIndex發生變化)
        }
    }
    return endIndex;
}


int main()
{
    int length,i=0;
    cout<<"請輸入個數:";
    cin>>length;
    cout<<"請輸入數組:";
    int array[1000]={0};
    for(i=0;i<length;i++)
    {
        cin>>array[i];
    }
        cout<<"最大子數組的和為:"<<getmax(array,length)<<endl;
    cout<<"最大子數組起始下標:"<<getstartIndex(array,length)<<endl;
    cout<<"最大子數組結束下標:"<<getendIndex(array,length)<<endl;
    system("pause");
    return 0;
}

三、代碼運行結果

運行結果圖

四、碼雲鏈接

(https://gitee.com/sun_si_jiao/secondwarehouse/tree/master/)

五、《構建之法》第三章讀后感

這一部分主要講的是兩人合作的重要性,第一小節介紹的是代碼規范和復審,復審的意思是看代碼是否在“代碼規范”的框架內正確地解決了問題,第二小節就如何復審引入了結對編程模式,因為每人在各自獨立設計、實現軟件的過程中不免要犯這樣那樣的錯誤,所以通過結對編程,兩位程序員可以隨時復審和交流,降低程序錯誤率,這樣就省下了很多修改和測試的時間,進而提高了軟件開發的總體效率,但作者也提出結對編程並不適用於所有情況,比如處於探索階段的項目、驗證測試需要運行很長時間等等一些特殊情況。


免責聲明!

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



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