這個作業要求在哪里 | https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454 |
---|---|
我在這個課程的目標是 | 熟悉軟件開發過程的步驟;實現簡單的軟件開發,對軟件進行測試、維護和管理。 |
此作業在哪個具體方面幫我實現目標 | 本次作業是運用c++編寫一個簡單的求數組最大值,並進行測試。軟件工程與單純編寫代碼是不同的。 |
其他參考文獻 | 參見 《構建之法》第二章單元測試的內容 以及 https://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html https://www.cnblogs.com/SivilTaram/p/software_pretraining_cpp.html |
作業正文 | 碼雲 |
單元測試
題目:數組中最大子數組的和。
具體要求:
用類/函數來實現
需求:希望返回 3 種信息
最大子數組的和
最大子數組開始的下標
最大子數組結束的下標
從文本文件中讀輸入的數據,熟悉文件操作, 文件有兩種數據
第一個數字:這次測試中有多少個數據, 數字后面是冒號。
后續數字: 每個數據的值,用逗號隔開
比如
文件內容:
17: -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61
輸出
sum = 71
實現這個類 (MSA)
可以用 C++, Java, C#,Python class 等
類開始是空的,返回都是簡單的數值,例如 0.
測試包括測試文件讀入與計算(測試過程通過程序新建一個文件,內容可以為上述數字,測試完后得刪除文件)
設計單元測試,運行單元測試
求最大子數組代碼如下
#include<iostream>
#include<cstdlib>
using namespace std;
bool m = false;
int MaxSum(int *a, int len, int start, int end){
if (a == NULL || len <= 0){
m = true;
return 0;
}
m = 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 Start(int *a, int len, int start, int end){
if (a == NULL || len <= 0){
m = true;
return 0;
}
m = 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 End(int *a, int len, int start, int end){
if (a == NULL || len <= 0){
m = true;
return 0;
}
m = 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 maxsum,start,end;
int a[]={-32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61};
maxsum=MaxSum(a,17,0,16);
cout<<"最大的子數組和為:"<<maxsum<<endl;
start=Start(a,17,0,16);
cout<<"最大的子數組開始下標為:"<<start<<endl;
end=End(a,17,0,16);
cout<<"最大的子數組結束下標為:"<<end<<endl;
system("pause");
return 0;
}
單元測試:對軟件設計的最小單元進行正確性檢測的測試,將可能存在的錯誤在最小范圍內發現解決。
單元測試目的:發現模塊內部邏輯,語法,算法,功能等錯誤。
單元測試代碼如下:
#include "1.1.h"
#include "pch.h"
#include "CppUnitTest.h"
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, MaxSum(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, Start(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, End(a, 17, 0, 16));
}
};
}
博客作業
前兩年在老師的帶領下學習了C++,Java,asp.net(c#),MATLAB,MS Office,數據庫mysql。大一學習了基本的MS Office的知識,后來在考計算機二級時又再次加深額鞏固基本的Excel和Word等的操作以及一些基礎的計算機方面的綜合知識。學習的第一門語言是C++,能夠編寫一些小型的簡單程序,大二的時候基於C++學習了數據結構,代碼的結構和認知僅有加深。第二門語言的學習是Java,了解到Java的一些簡單語法,定義等,大致了解到其與C++在內存分配、函數、運行方式等方面不同。數值分析、數學建模等課程使用到MATLAB,用於計算數學,。關於數據庫能構建表格並且簡單與asp.net前端操作相結合。
目前所掌握的語言中,掌握的相對熟悉一點的是C++,目前最大的編寫行數是400行,其他的編寫熟練度不是很高,代碼相對簡單。目前只是能編寫一些C++的代碼,但離一個完整的軟件等差距較大,所需了解、掌握、操作練習的還有很多,如果以現在的能力如果加入計算機行業,將會被餓死。接下來一年將在老師的帶領下,繼續加強C++的大規模編寫並與團隊合作,以及本專業的特色:MATLAB的學習。
預習
兩人合作:
. 代碼規范
. 代碼風格規范。主要是文字上的規定,看似表面文章,實際上非常重要。
.代碼設計規范。牽涉到程序設計、模塊之間的關系、設計模式等方方面面,這里有不少與具體程序設計語言息息相關的內容(如C/C++/Java/C#),但是也有通用的原則,這里主要討論通用的原則。
. 代碼審復
名 稱 | 形 式 | 目 的 |
---|---|---|
自我復審 | 自己 vs. 自己 | 用同伴復審的標准來要求自己。不一定最有效,因為開發者對自己總是過於自信。如果能持之以恆,則對個人有很大好處 |
同伴復審 | 復審者 vs. 開發者 | 簡便易行 |
團隊復審 | 團隊 vs. 開發者 | 有比較嚴格的規定和流程,用於關鍵的代碼,以及復審后不再更新的代碼。 |