计算机与软件工程作业三
计算机与软件工程作业三
作业要求|第三周作业
--|:--😐--😐--:
课程要求|按照作业要求完成作业并进行自我总结
参考文献| 参考文献
作业正文| [作业](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