計算機與軟件工程作業三
作業要求 | 第三周作業 |
---|---|
課程要求 | 按照作業要求完成作業並進行自我總結 |
參考文獻 | 參考文獻 |
作業正文 | [作業](https://i-beta.cnblogs.com/posts/edit) |
正文
https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454
單元測試
數組中最大子數組的和。
用類/函數來實現
需求:希望返回 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
using namespace std;
int getMax(int a,int b){
return a>b?a:b;
}
int maxSum(int arr[],int n){
int sum=arr[0];
int max=arr[0];
int newstart=0;
int start=0;
int end=0;
for(int i=1;i<n;i++){
sum=getMax(sum+arr[i],arr[i]);
if(arr[i]>(sum+arr[i]))
newstart=i;
if(sum>max){
max=sum;
start=newstart;
end=i;
}
}
return max;
}
int start(int arr[],int n){
int sum=arr[0];
int max=arr[0];
int newstart=0;
int start=0;
int end=0;
for(int i=1;i<n;i++){
sum=getMax(sum+arr[i],arr[i]);
if(arr[i]>sum+arr[i])
newstart=i;
if(sum>max)
max=sum;
start=newstart;
end=i;
}
return start;
}
int end(int arr[],int n){
int sum=arr[0];
int max=arr[0];
int newstart=0;
int start=0;
int end=0;
for(int i=1;i<n;i++){
sum=getMax(sum+arr[i],arr[i]);
if(arr[i]>(sum+arr[i]))
newstart=i;
if(sum>max)
max=sum;
start=newstart;
end=i;
}
return end;
}
int main(){
int arr[]={-32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61};
int length=17;
cout<<"數組最大子數組和:"<<maxSum(arr,length)<<endl;
cout<<"數組最大子數組起始下標:"<<start(arr,length)<<endl;
cout<<"數組最大子數組結束下標:"<<end(arr,length)<<endl;
return 0;
}
碼雲鏈接
https://gitee.com/lazycat777/Test/commit/6d7595ebea26b086adb38006f4f5e861c5eb5882