作業要求 | https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454 |
---|---|
課程目標 | 了解熟悉軟件開發過程中的每一個步驟,為以后的學習工作打下堅實的基礎; 學習科學的測試方法,為以后寫出更完美的代碼做准備; 學會需求分析說明書和規格說明書的書寫。 |
實現目標的方面 | 用C++編寫用類/函數來實現數組中最大子數組的和,並將所寫代碼進行單元測試,為代碼的編寫與綜合測試提供了經驗 |
其他參考文獻 | https://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html https://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html https://www.cnblogs.com/SivilTaram/p/software_pretraining_cpp.html https://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html |
作業正文 | https:////www.cnblogs.com/youmine/p/12451670.html 碼雲鏈接:https://gitee.com/yang_li_na/test |
單元測試
數組中最大子數組的和
(```
#include<iostream>
#include<cstdlib>
using namespace std;
bool g_InvalidInput = false;
int getMaxSum(int *a, int len, int start, int end)
{
if (a == NULL || len <= 0)
{
g_InvalidInput = true;
return 0;
}
g_InvalidInput = false;
start = 0;
end = 0;
if (1 == len)
return a[0];
int curSum = a[0]; //當前子數組和
int maxSum = curSum; //子數組最大和
for (int i = 1; i < len; i++)
{
if (curSum > 0)
curSum += a[i];
else
if (a[i] > curSum) //確定子數組起始位置
{
start = i;
curSum = a[i]; //即使數組全為負,也能得到最大值
}
if (curSum > maxSum)
{
maxSum = curSum;
end = i;
}
}
return maxSum;
}
int getstart(int *a, int len, int start, int end)
{
if (a == NULL || len <= 0)
{
g_InvalidInput = true;
return 0;
}
g_InvalidInput = false;
start = 0;
end = 0;
if (1 == len)
return a[0];
int curSum = a[0]; //當前子數組和
int maxSum = curSum; //子數組最大和
for (int i = 1; i < len; i++)
{
if (curSum > 0)
curSum += a[i];
else
if (a[i] > curSum) //確定子數組起始位置
{
start = i;
curSum = a[i]; //即使數組全為負,也能得到最大值
}
if (curSum > maxSum)
{
maxSum = curSum;
end = i;
}
}
return start;
}
int getend(int *a, int len, int start, int end)
{
if (a == NULL || len <= 0)
{
g_InvalidInput = true;
return 0;
}
g_InvalidInput = false;
start = 0;
end = 0;
if (1 == len)
return a[0];
int curSum = a[0]; //當前子數組和
int maxSum = curSum; //子數組最大和
for (int i = 1; i < len; i++)
{
if (curSum > 0)
curSum += a[i];
else
if (a[i] > curSum) //確定子數組起始位置
{
start = i;
curSum = a[i]; //即使數組全為負,也能得到最大值
}
if (curSum > maxSum)
{
maxSum = curSum;
end = i;
}
}
return end;
}
int main(){
int smax,start,send;
int a[]={-32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61};
smax=getMaxSum(a,17,0,16);
cout<<"最大的子數組和為:"<<smax<<endl;
start=getstart(a,17,0,16);
cout<<"最大的子數組開始下標為:"<<start<<endl;
send=getend(a,17,0,16);
cout<<"最大的子數組結束下標為:"<<send<<endl;
system("pause");
return 0;
}

### **設計單元測試,運行單元測試**
(```
#include "stdafx.h"
#include "CppUnitTest.h"
#include"array.cpp"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: 在此輸入測試代碼
int a[]={-32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61};
Assert::AreEqual(111,getMaxSum(a,17,0,16));
}
TEST_METHOD(TestMethod2)
{
// TODO: 在此輸入測試代碼
int a[]={-32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61};
Assert::AreEqual(12,getstart(a,17,0,16));
}
TEST_METHOD(TestMethod3)
{
// TODO: 在此輸入測試代碼
int a[]={-32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61};
Assert::AreEqual(16,getend(a,17,0,16));
}
};
}
```)



#博客園作業
學習計算機相關知識也有兩年了,所以將所學的語言進行匯總總結:
語言類別|技能評價
-------|--------
MS Office|掌握還是初級,生活中簡單的操作沒有問題。但是二級考試時,較細的知識點沒有掌握,尤其是Excel部分
C++|簡單的一些程序代碼,較多是有公式的一類,如:求正方形或長方形的面積等
Java|對於循環類的程序代碼處理比C++要好一些,並且通過了Java二級考試
matlab|對於一些簡單的運算程序可以編寫出來,常常在數學建模中根據模型計算出結果;也可以在老師講出部分代碼的基礎上再根據公式進行修改得出。但是對於用matlab畫圖是比較困難的
Asp.net(C#)|了解比較初級,對於表面操作比較好,比如鏈接數據庫,做出登錄,注冊頁面等等。但是如果要通過代碼實現一些操作時比較困難,比如用三層架構鏈接數據庫等
對於現在所學的語言技能,都處於半懵半懂的狀態,掌握不是很好。
除了IT行業,現在所學的軟件對其他職業來說比較少用,但是在平常工作中matlab可以幫忙計算畫圖等等,C++或者Java可以編出簡單的程序,做出動畫等等與眾不同,類似於之前做的四則運算的題目,減少了不少的找題目以及計算出結果的工作量……我現在所學的語言技能能在我的工作中減輕我的工作量,也提高了效率。
寫出程序代碼並實現,且光靠一個人的力量是不夠的,團隊力量比較重要,在之前的學習中,與個人單獨實現程序相比,和同學合作完成程序代碼的效率更高,而且集思廣益代碼更豐富更全能,從中我明白合作的力量,與同事、同學的合作將事倍功半。
為了工作時能夠更出色,所以在之后的學習中,我要將基礎的語言掌握,並且跟着老師的指導,提高自己編寫代碼的能力,可以將語言運用到中等程度。
#預習
###兩人合作
*代碼規范與代碼復審*
·“代碼規范”可以分成兩個部分。
(1)代碼風格規范。主要是文字上的規定。
(2)代碼設計規范。牽涉到程序設計、模塊之間的關系、設計模式等方方面面。
1.1 代碼風格的原則是:簡明,易讀,無二義性。
代碼風格|具體要求
-------|-------
縮進|4個空格,在VS2005和其他的一些編輯工具中都可以定義Tab鍵擴展成為幾個空格鍵。不用 Tab鍵的理由是Tab鍵在不同的情況下會顯示不同的長度。
行寬|行寬必須限制,但是以前有些文檔規定的80字符行寬太小了(以前的計算機/打字機顯示行寬為80字符),現在時代不同了,可為100字符。
括號|在復雜的條件表達式中,用括號清楚地表示邏輯優先級。
斷行與空白的{ }行|格式A:if (condition)<br>DoSomething(); <br>else<br>DoSomethingElse();<br>格式B:if (condition)<br>DoSomething(); <br>else <br>DoSomethingElse();<br>格式C:if ( condition) {<br>DoSomething(); <br>} else {<br>DoSomethingElse();<br>}<br>格式D:if ( condition) <br>{<br>DoSomething(); <br>}<br>else <br>{<br>DoSomethingElse();<br>}
分行|不要把多行語句放在一行上。<br>a = 1; b = 2; // bogus<br>if (fFoo) Bar(); // bogus<br>更嚴格地說,不要把不同的變量定義在一行上。<br>Foo foo1, foo2; // bogus
命名|命名的目的是讓程序員一眼就能看出變量的類型,int、byte、char、bool
下划線問題|下划線用來分隔變量名字中的作用域標注和變量的語義,如:一個類型的成員變量通常用m_來表示。<br>大小寫問題|Pascal——所有單詞的第一個字母都大寫;<br>Camel——第一個單詞全部小寫,隨后單詞隨Pascal格式,這種方式也叫lowerCamel。<br>一個通用的做法是:所有的類型/類/函數名都用Pascal形式,所有的變量都用Camel形式。<br>類/類型/變量:名詞或組合名詞,如Member、ProductInfo等。<br>函數則用動詞或動賓組合詞來表示,如get/set; RenderPage()。
注釋|復雜的注釋應該放在函數頭,很多函數頭的注釋都是解釋參數的類型等的,注釋(包括所有源代碼)應只用ASCII字符,不要用中文或其他特殊字符,它們會極大地影響程序的可移植性。
1.2 代碼設計規范
代碼設計|具體要求
-------|--------
函數|現代程序設計語言中的絕大部分功能,都在程序的函數(Function, Method)中實現,關於函數最重要的原則是:只做一件事,但是要做好。
goto|函數最好有單一的出口,為了達到這一目的,可以使用goto。只要有助於程序邏輯的清晰體現,什么方法都可以使用,包括goto。
錯誤處理|1、參數處理:在DeBug版本中,所有的參數都要驗證其正確性。在正式版本中,從外部(用戶或別的模塊)傳遞過來的參數要驗證其正確性。<br>2、斷言:Assert (p != NULL)
如何處理C++中的類|1.類<br>2.Class vs. Struct<br>3.公共/保護/私有成員Public、Private和Protected<br>4.數據成員<br>5.虛函數Virtual Functions<br>6.構造函數Constructors<br>7.析構函數<br>8.New和Delete<br>9.運算符(Operators)<br>10.異常(Exceptions)<br>11.類型繼承(Class Inheritance)
·代碼復審
定義:看代碼是否在“代碼規范”的框架內正確地解決了問題。
名稱|形式|目的
---|---|---
自我復審|自己 vs. 自己|用同伴復審的標准來要求自己。不一定最有效,因為開發者對自己總是過於自信。如果能持之以恆,則對個人有很大好處
同伴復審|復審者 vs. 開發者|簡便易行
團隊復審|團隊 vs. 開發者|有比較嚴格的規定和流程,用於關鍵的代碼,以及復審后不再更新的代碼。<br>覆蓋率高——有很多雙眼睛盯着程序。但是有可能效率不高(全體人員都要到會)
代碼復審的核查表:
1.概要部分
2.設計規范部分
3.代碼規范部分
4.具體代碼部分
5.效能
6.可讀性
7.可測試性