計算與軟件工程
作業要求 | https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454 |
---|---|
課程目標 | 在學習過程中加強實踐能力的培養與軟件工程思想的思考 |
該次作業在程序效能方面實現我的目標 | 設計單元測試,運行單元測試 |
參考文獻 | https://www.cnblogs.com/SivilTaram/p/software_pretraining_cpp.html https://www.cnblogs.com/winscoder/p/3373241.html https://jingyan.baidu.com/article/d8072ac47c6701ec95cefd82.html https://www.cnblogs.com/tianguook/p/3998135.html |
本次作業 | https:////www.cnblogs.com/Rachelee/p/12446846.html |
作業一
數組中最大子數組的和
用類/函數來實現
需求:希望返回 3 種信息
最大子數組的和
最大子數組開始的下標
最大子數組結束的下標
單元測試
a)創建單元測試函數的主要步驟:
(1)設置數據(一個假想的正確的E-mail地址);
(2)使用被測試類型的功能(用E-mail地址來創建一個User類的實體);
(3)比較實際結果和預期的結果(Assert.IsTrue(target!= null);)。
b)單元測試應該准確、快速地保證程序基本模塊的正確性。下面是驗證單元測試好壞的一系列標准:
單元測試應該在最低的功能/參數上驗證程序的正確性。
單元測試必須由最熟悉代碼的人(程序的作者)來寫。
單元測試過后,機器狀態保持不變。
單元測試要快(一個測試運行時間是幾秒鍾,而不是幾分鍾)。
單元測試應該產生可重復、一致的結果。
獨立性,單元測試的運行/通過/失敗不依賴於別的測試,可以人為構造數據,以保持單元測試的獨立性。
單元測試應該覆蓋所有代碼路徑,包括錯誤處理路徑,為了保證單元測試的代碼覆蓋率,單元測試必須測試公開的和私有的函數/方法。
單元測試應該集成到自動測試的框架中。
單元測試必須和產品代碼一起保存和維護。
//返回一個整數數組中最大子數組的和(數組首尾相連)
#include<iostream>
#include<cstdlib>
#define N 100
using namespace std;
//構造子數組結構
typedef struct SArray
{
int Sdata; //子數組中的數
int start; //子數組的起始位置
int end; //子數組的終止位置
}SArray;
//構造鏈表的存儲結構
typedef struct LNode
{
int data; //數
int position; //數所在數組中的位置
struct LNode *next; //指針
}LNode, *LinkList;
//創建循環鏈表
void CreateList(LinkList &L, int Group[], int n)
{
L = new LNode;
L->next = NULL;
LNode *r;
r = L;
for (int i = 0; i < n - 1; i++)
{
LNode *p;
p = new LNode;
p->data = Group[i];
p->position = i + 1;
p->next = NULL;
r->next = p;
r = p;
}
LNode *p;
p = new LNode;
p->data = Group[n - 1];
p->position = n;
p->next = L->next;
r->next = p;
}
//返回最大子數組
SArray Compare(LinkList L, int Length)
{
SArray MaxSum[N][2];
//MaxSum[N][0].Sdata表示前N-1個數中,最大的子數組
//MaxSum[N][1].Sdata表示前N-1個數的最大的子數組和加第N個數的和與第N個數相比的最大值
LNode *r;
r = L->next;
MaxSum[0][0].Sdata = MaxSum[0][1].Sdata = r->data;
MaxSum[0][0].start = MaxSum[0][1].start = r->position;
MaxSum[0][0].end = MaxSum[0][1].end = r->position;
for (int i = 1; i < Length; i++)
{
if (MaxSum[i - 1][0].Sdata > MaxSum[i - 1][1].Sdata)
{
MaxSum[i][0].Sdata = MaxSum[i - 1][0].Sdata;
MaxSum[i][0].start = MaxSum[i - 1][0].start;
MaxSum[i][0].end = MaxSum[i - 1][0].end;
}
else
{
MaxSum[i][0].Sdata = MaxSum[i - 1][1].Sdata;
MaxSum[i][0].start = MaxSum[i - 1][1].start;
MaxSum[i][0].end = MaxSum[i - 1][1].end;
}
if (MaxSum[i - 1][1].Sdata + r->next->data > r->next->data)
{
MaxSum[i][1].Sdata = MaxSum[i - 1][1].Sdata + r->next->data;
MaxSum[i][1].start = MaxSum[i - 1][1].start;
MaxSum[i][1].end = r->next->position;
}
else
{
MaxSum[i][1].Sdata = r->next->data;
MaxSum[i][1].start = r->next->position;
MaxSum[i][1].end = r->next->position;
}
r = r->next;
}
if (MaxSum[Length - 1][0].Sdata > MaxSum[Length - 1][1].Sdata)
{
return MaxSum[Length - 1][0];
}
else
{
return MaxSum[Length - 1][1];
}
}
//將含n個數的循環數組依次從各個點斷開,產生n個含n個數組的單鏈數組
SArray Divide(LinkList L, int length)
{
LinkList LGroup[N]; //頭節點集合
LNode *r;
r = L;
for (int i = 0; i < length; i++)
{
LGroup[i] = r;
r = r->next;
}
SArray MaxGroup[N]; //分成的各個數組的最大子數組的集合
for (int i = 0; i < length; i++)
{
MaxGroup[i].Sdata = Compare(LGroup[i], length).Sdata;
MaxGroup[i].start = Compare(LGroup[i], length).start;
MaxGroup[i].end = Compare(LGroup[i], length).end;
}
SArray Max = MaxGroup[0]; //各個數組的最大子數組和的最大值
for (int i = 1; i < length; i++)
{
if (Max.Sdata < MaxGroup[i].Sdata)
{
Max.Sdata = MaxGroup[i].Sdata;
Max.start = MaxGroup[i].start;
Max.end = MaxGroup[i].end;
}
}
return Max;
}
int main()
{
int Number[N]; //整數數組
int length; //數組長度
cout << "請輸入一個整型數組:" << endl;
cin >> Number[0];
length = 1;
while (getchar() != '\n')
{
cin >> Number[length++];
}
LinkList L;
CreateList(L, Number, length);
cout << "該數組中的最大的子數組和為:";
cout << Divide(L, length).Sdata << endl;
cout << "該最大子數組的起始位置為:";
cout << Divide(L, length).start << endl;
cout << "該最大子數組的終止位置為:";
cout << Divide(L, length).end << endl;
system("pause");
return 0;
}
void TestMethod1()
{
//
// TODO: 在此處添加測試邏輯
//
int array[]={-32,16,-3,27,-1,4,12,11,10,-9,18};
Assert::AreEqual(85,Divide(L, length).Sdata);
Assert::AreEqual(2,Divide(L, length).start);
Assert::AreEqual(11,Divide(L, length).end);
};
運行結果截圖
碼雲的鏈接
https://gitee.com/Rachelee/firstwarehouse
作業二
三年學習回顧
信息與計算科學專業主要課程包括數學分析、高等代數、幾何、概率統計、數學模型、離散數學、實變函數、復變函數、微分方程、c/c++語言、java語言、數據庫應用技術、軟件系統、操作系統等。
作為一名大三的學生,已經大概熟悉了高等代數、數學分析、java語言等基礎課程,學習到了數學學科的專業知識以及計算機學科的一些基礎的小技能,深刻認識到數學思維的邏輯性、嚴密性、靈活性,能夠簡單地使用C++、JAVA以及Matlab等軟件進行一些小程序的編寫和基本的數學計算。
信息與計算科學專業要求能熟練的操作計算機並且有一定的數學基礎,初步具備在信息與計算科學領域的某個方向上從事科學研究,具備設計開發有關軟件的能力能解決實際問題。自身在程序設計和代碼編寫上下的功夫不夠,花費的時間精力都較少,所以能力欠缺不足,有待提升。
日后學習方向主要是數學技能的學習,計算機為輔,與此同時不斷重視自己解決科學計算,信息處理與編碼、建立數學模型能力的培養。在教育教學的相關知識和實踐能力上也要查漏補缺,不斷去學習,抓住機會實踐。
預習作業
代碼規范與代碼復審
-代碼風格的原則是:簡明,易讀,無二義性。
(1)代碼風格規范:可以從縮進、行寬、括號、斷行和空白的{}行、分行、命名、下划線問題、大小寫問題和注釋方面來改進。
(2)代碼設計規范:代碼設計規范不光是程序書寫的格式問題,而且牽涉到程序設計、模塊之間的關系、設計模式等方方面面,這里有不少與具體程序設計語言息息相關的內容(如C、C++、Java、C#),但是也有通用的原則,這里主要討論通用的原則。這里有函數、goto、錯誤處理、如何處理C++中的類。
(3)代碼復審的正確定義:看代碼是否在“代碼規范”的框架內正確地解決了問題
目的:找出代碼的錯誤;發現邏輯錯誤;發現算法錯誤;發現潛在的錯誤和回歸性錯誤;發現可能改進的地方;教育(互相教育)開發人員,傳授經驗,讓更多的成員熟悉項目各部分的代碼,同時熟悉和應用領域相關的實際知識。