返回一个整数数组中最大的子数组的和

人员:侯志龙  李杰

设计思路:通过第一次求一个一维数组中最大子数组的和,在此基础上我们做了扩展。前面在程序中我们固定了数组的长度,默认为5,而这次则按题目要求扩展到1000,定义数值类型为int32。让程序随机产生1000个数,用同样的方法求子数组和的最大值。修改代码,通过随机产生0和1,来控制正数和负数的产生,避免只出现正数或者只出现负数的情况。完善程序,将子数组的位置找出来,再进行校验。之前做的数组长度我们在测试时一般都填得很小,并且给每个元素的赋值也不超过两位数,甚至是固定了,都是为了方便直接找到一个和是最大的子数组,这都不能测试出程序哪里有不足,无论是数量还是数值的大小。通过随机产生的1000个数据我们发现了问题。因为已经把时间复杂度的概念给彻底忘了,这个程序也就没有考虑。

源代码:

#include<iostream.h>
#include<stdlib.h>
#define AMOUNT 1500

int main()
{
long int arr[AMOUNT];
long int arrCopy[AMOUNT];
long int max[AMOUNT];
int i,a;
int b;
int start,rear;
int mount=AMOUNT;
for(i=0;i<mount;i++)
{
try
{
b=rand()%4;
if(b==0)
{
arr[i]=rand();
arrCopy[i]=arr[i];
max[i]=arr[i];
}
else
{
arr[i]=-rand();
arrCopy[i]=arr[i];
max[i]=arr[i];
}
}
catch(long int e)
{
cout<<"Long Inter=ger Exception!"<<endl;
}
}
cout<<"Array :"<<endl;
for(i=0;i<mount;i++)
{
cout<<arr[i]<<" ";
if((i+1)%10==0)
{
cout<<endl;
}
}
for(a=0;a<mount-1;a++)
{
for(i=a+1;i<mount;i++)
{
try
{
arr[a]=arr[a]+arr[i];
if(max[a]<arr[a])
{
max[a]=arr[a];
rear=i+1;
}
}
catch(long int e)
{
cout<<"Long Inter=ger Exception!"<<endl;
}
}
}
for(i=0;i<mount;i++)
{
if(max[0]<max[i])
{
max[0]=max[i];
start=i+1;
}
}
cout<<endl;
cout<<"从第"<<start<<"个数"<<arrCopy[start-1]<<"开始"<<endl;
cout<<"到第"<<rear<<"个数"<<arrCopy[rear-1]<<"结束"<<endl;
cout<<"子数组和的最大值为: "<<max[0]<<endl;
return 0;
}

总结;

在调试中我和李杰的收获很大,以上截图都是调了很多次才改好了一个缺陷,因为数据很多,循环和嵌套就比较复杂,start和rear两个参数在开始添加时频繁出错,就先把数量改小,后运用单步调试到底看出错在哪一步,并且用异常处理来提示我们是否有数值越界等一些软件调试时不考虑的缺陷。此次结对开发没有第一次合作得好,因为觉得改动不大所以讨论得还是比较少,个人的主观看法比较多,以后还是多交流吧。

猜你喜欢

转载自www.cnblogs.com/zhilongHou1214/p/9785684.html
今日推荐