計算與軟件工程 作業三


作業要求 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;
 }
![運行結果](https://images.cnblogs.com/cnblogs_com/youmine/1659514/t_200309132604%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C.PNG)

### **設計單元測試,運行單元測試**
(```

     #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));
		}
	};
     }
```)

![創建單元測試](https://images.cnblogs.com/cnblogs_com/youmine/1659514/t_200309132630%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%951.PNG)
![測試代碼](https://images.cnblogs.com/cnblogs_com/youmine/1659514/t_200309132618%E6%B5%8B%E8%AF%95cpp.PNG)
![測試成功](https://images.cnblogs.com/cnblogs_com/youmine/1659514/o_200309132643%E8%BF%90%E8%A1%8C%E6%88%90%E5%8A%9F.PNG)

#博客園作業
學習計算機相關知識也有兩年了,所以將所學的語言進行匯總總結:

語言類別|技能評價
-------|--------
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.可測試性


免責聲明!

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



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