計算與軟件工程 作業三


作業三要求鏈接 https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454
課程目標 軟件功能開發,單元測試
此作業在哪個具體方面幫我實現目標 代碼測試
其他參考文獻 https://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html
作業正文 https://i-beta.cnblogs.com/posts/edit;postId=12443639

一、單元測試

要求:
求數組中最大子數組的和。
用類/函數來實現
需求:希望返回 3 種信息
最大子數組的和
最大子數組開始的下標
最大子數組結束的下標
代碼:

//計算數組中任何連續子數組的最大和,並打印最大子數組(求開始和結束下標)
//思路:1:當數組元素全為0時,輸出最大的那個負數
//      2:當數組有正有負時,i=0遍歷數組,從大於0的那個元素開始,記錄此時的下標為shart(最大子數組起始下標),從start開始遍歷剩下的元素,若元素和num大於max的值則更新max,
//    且將此時的下標賦值給end(最大子數組終止下標),當num小於0則說明后面出現的(如果出現)最大子數組不可能包含這些元素,所以退出內層循環,繼續外層循環,找下一個大於
//    0的數組元素,且外層循環的i變量此時變為temp+1,繼續下面的循環。注意內層循環當temp>=length時,說明內層循環已經把所有數組元素都遍歷結束,所以外層循環可以直接break。
//         
#include <stdio.h>
#include<iostream>
#include<vector>
#include<cstdlib>
using namespace std;
 
int getmax(int data[],int length)
{
    int temp=0,start=0,end=0,i=0,num=0,max=0,flag=0;
    while(i<length)
    {
        if(data[i]>0)
        {
            temp=i;
            while(temp<length)
            {
                num+=data[temp];
                
                if(num<0)   //當num<0時退出這個循環
                {
                    num=0;
                    i=temp+1;
                    break;
                }
                
                if(num>max) //不加=說明若存在多個最大子數組時取第一個,加上=說明取最后一個
                {
                    start = i;
                    max=num;
                    end = temp;
                    //cout<<i<<" "<<temp<<endl;
                    
                }
                temp++;
            }
            if(temp>=length) //當temp已經循環到數組最后一位,則結束整個外層循環
                break;  
        }
        else
        {
            i++;
            flag++;  //用來記錄負數出現的次數
        }
    }
    if(flag==length) //數組全為負數的情況
    {
        int max=data[0];
        for(i=1;i<length;i++)
        {
            if(data[i]>max)
            {    
                max=data[i];
            }    
        }
        return max;
    }
    
  cout<<"最大子數組的起始下標:"<<start<<" "<<endl;
	cout<<"最大子數組的結束下標:"<<end<<" "<<endl;;
     cout<<"最大子數組的和為:";
    return max;
}
//更簡單的寫法,沒有輸出下標
int findmax(vector<int> ve)
{
	if (ve.size() == 0)
		return 0;
	int i = 0,sum=0,great=INT_MIN;
	for (i = 0; i < ve.size(); i++)
	{
		if (sum <= 0)
			sum = ve[i];
		else
			sum += ve[i];
		if (sum > great)
			great = sum;
	}
	
	return great;
}
 
int main()
{
    
    int data[] = {-32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61};
    int length = sizeof(data) / sizeof(int);
    cout<<getmax(data,length)<<endl;
	system("pause");
}

結果:

單元測試:
代碼:

#include "pch.h"
#include "CppUnitTest.h"
#include"max.cpp"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{
	TEST_CLASS(UnitTest1)
	{
	public:
		
		TEST_METHOD(getmax_Test)
		{
			//TODO: 在此輸入測試代碼
		
			int data[] = { -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61 };
			Assert::AreEqual(111, getmax(a, 17));
		}


	};
}

Gitee鏈接:https://gitee.com/li_zi_ye/learngit/blob/master/max.cpp

二、博客作業

在信息與計算科學的前兩年我學習了不少的計算機語言,其中最先接觸了0ffice,經過學習,對office的掌握較為熟練。接着學習了C++,C++是C語言的繼承,它既可以進行C語言的過程化程序設計,又可以進行以抽象數據類型為特點的基於對象的程序設計,還可以進行以繼承和多態為特點的面向對象的程序設計。C++擅長面向對象程序設計的同時,還可以進行基於過程的程序設計。但我對於C ++的學習並不能達到滿意的水平,后來又學習了Java、ASP等一系列計算機語言,通過后來的學習,也加深了對以前所學語言的了解。自己的代碼編寫能力還有待加強。

三、預習

a、代碼規范與代碼復審
問:為什么要代碼規范?
答:做一個有商業價值的項目,或者在團隊里工作,代碼規范相當重要。
問:為什么要做代碼復審?

答:首先,在代碼復審中發現的問題,絕大多數都可以由開發者獨立發現。從這一意義上說,復審者是在替開發者干開發者本應干的事情。

問:這么說如果開發者做到完美,復審者的時間和精力是一種浪費了?

答:不對,即使是完美,代碼復審還有“教育”和“傳播知識”的作用。更重要的是,不管多么厲害的開發者都會或多或少地犯一些錯誤,有欠考慮的地方,如果有問題的代碼已簽入到產品代碼中,再要把所有的問題找出來就更困難了。大家學習軟件工程都知道越是項目后期發現的問題,修復的代價越大。代碼復審正是要在早期發現,並修復這些問題。


免責聲明!

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



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