作業三要求鏈接 | 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、代碼規范與代碼復審
問:為什么要代碼規范?
答:做一個有商業價值的項目,或者在團隊里工作,代碼規范相當重要。
問:為什么要做代碼復審?
答:首先,在代碼復審中發現的問題,絕大多數都可以由開發者獨立發現。從這一意義上說,復審者是在替開發者干開發者本應干的事情。
問:這么說如果開發者做到完美,復審者的時間和精力是一種浪費了?
答:不對,即使是完美,代碼復審還有“教育”和“傳播知識”的作用。更重要的是,不管多么厲害的開發者都會或多或少地犯一些錯誤,有欠考慮的地方,如果有問題的代碼已簽入到產品代碼中,再要把所有的問題找出來就更困難了。大家學習軟件工程都知道越是項目后期發現的問題,修復的代價越大。代碼復審正是要在早期發現,並修復這些問題。