结对开发4
题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。求所有子数组的和的最大值。
结对编程要求:两人结对完成编程任务。
一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
一、设计思路
首先,我们还是先进行分工,郭庆樑编写程序代码和主要构思,我负责代码复审和代码测试。
解决方法是,对于这种数组,我们想到结果会是两种情况,一种是和原先的一样,不需要首尾连接即产生最大子数组,比如,全是正数,或者第一个元素是负数,这种情况下,我们就按照原来的代码实现;第二种情况,即首尾连接可产生更大的子数组,这种情况下,只需求得数组所有元素之和,再减去最小子数组之和,就可求得最大子数组。判断这两种情况,则通过比较这两种子数组的最大值,取较大值即可。
二、源代码
#include<iostream.h>
int Sum(int a[],int num,int count) //求不同情况下的子数组之和
{
int plus=0;
int i=num;
while(count!=0)
{
plus=plus+a[num];
num++;
count--;
}
return plus;
}
int ForMax(int n) //求出最大子数组的值
{
int i,j,t=0;
int a[100];
int sum;
int Max1,Max2;
int max[100]={0};
int Min,min;
int Count=n;
cout<<"请输入数组元素:"<<endl;
for(i=0;i<n;i++) //输入数组中的元素
{
cin>>a[i];
}
for(i=0;i<n;i++) //先给max[]数组赋值
{
for(j=0;j<i+1;j++)
{
max[i]=max[i]+a[j];
}
}
Max1=max[0];
for(i=0;i<n;i++) //比较同长度下子数组的大小
{
for(j=0;j<Count;j++)
{
if(max[i]<Sum(a,j,i+1))
{
max[i]=Sum(a,j,i+1);
}
}
Count--;
}
for(i=1;i<n;i++) //比较获得同长度最大值下的最大值
{
if(Max1<max[i])
{
Max1=max[i];
}
}
sum=Min=min=a[0];
for(i=1;i<n;++i) //求出最小子数组
{
if(min>0)
min=a[i];
else
{
min+=a[i];
}
if(min<Min)
Min=min;
sum+=a[i];
}
Max2=sum-Min; //数组之和减去最小子数组即是环形数组的最大值
return Max1>Max2?Max1:Max2; //比较两种情况下的最大值,返回较大的值
}
int main()
{
int n;
cout<<"请输入数组长度:"<<endl;//n<=100
cin>>n;
cout<<"子数组最大值为:"<<ForMax(n)<<endl;
return 0;
}
三、截图
四、总结
这次实验我们本来是准备用指针的,但后来发现不适合此次实验,经过讨论,我们换了一种方法。
五、工作照