结对开发4
2015-03-27 16:28 奔波儿灞 阅读(161) 评论(2) 编辑 收藏 举报题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组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;
}
三、运行结果
四、工作体会
通过这次结对开发,我们明白了一个人的思维很容易被原来的接触过的熟悉的解决方法所束缚,对于熟悉的问题,很难想出新的解决方案,所以需要一个合作伙伴来帮助自己解决思维定式,不再因为不知道如何用旧方法解决新问题而寸步难行。
五、工作照