软件工程课后作业:返回一个整数数组中最大子数组的和
1、题目:返回一个整数数组中最大子数组的和。
2、要求:
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
3、设计思路:
将数组大小定义为1000,对于每个元素定义为int32类型,将求和函数设置为int 类型,这样可以方便观测数据的溢出,让数组元素可以超出范围。
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
3、设计思路:
将数组大小定义为1000,对于每个元素定义为int32类型,将求和函数设置为int 类型,这样可以方便观测数据的溢出,让数组元素可以超出范围。
4、程序代码:
#include<iostream>
#include<time.h>
#include<conio.h>
#define N 1000
using namespace std;
void RandIn(int IntNum,int A[]) //随机生成数组
{
cout<<"整数内容"<<endl;
for(int i=0;i<IntNum;i++)
{
A[i]=rand()-rand();
cout<<A[i];
if(i%15==4)
cout<<endl;
else
cout<<'\t';
}
}
void SelMax(int IntNum,int A[],auto &sum)
{
int buffer=0;
int count1=0; //求和的数值个数
int count2=0; //进行的运算次数
for(int j=0;j<=IntNum;j++)
{
if(j==IntNum)
{
j=0;
}
buffer+=A[j];
count1++;
count2++;
if(buffer<0)
{
buffer=0;
count1=0;
}
if(sum<buffer)//sum始终记录下存在的最大和
{
sum=buffer;
}
{
break;
}
}
}
void main()
{
int IntNum;
int A[N];
int q=0;
while(q==0)
{
auto sum=0;
srand((unsigned)time(NULL));
cout<<"请输入数组元素的个数:";
cin>>IntNum;
RandIn(IntNum,A);
SelMax(IntNum,A,sum);
cout<<endl;
cout<<sum<<endl;
cout<<"是否继续测试(输入0则继续否则停止)";
cin>>q;
system("cls");
}
}
#include<time.h>
#include<conio.h>
#define N 1000
using namespace std;
void RandIn(int IntNum,int A[]) //随机生成数组
{
cout<<"整数内容"<<endl;
for(int i=0;i<IntNum;i++)
{
A[i]=rand()-rand();
cout<<A[i];
if(i%15==4)
cout<<endl;
else
cout<<'\t';
}
}
void SelMax(int IntNum,int A[],auto &sum)
{
int buffer=0;
int count1=0; //求和的数值个数
int count2=0; //进行的运算次数
for(int j=0;j<=IntNum;j++)
{
if(j==IntNum)
{
j=0;
}
buffer+=A[j];
count1++;
count2++;
if(buffer<0)
{
buffer=0;
count1=0;
}
if(sum<buffer)//sum始终记录下存在的最大和
{
sum=buffer;
}
{
break;
}
}
}
void main()
{
int IntNum;
int A[N];
int q=0;
while(q==0)
{
auto sum=0;
srand((unsigned)time(NULL));
cout<<"请输入数组元素的个数:";
cin>>IntNum;
RandIn(IntNum,A);
SelMax(IntNum,A,sum);
cout<<endl;
cout<<sum<<endl;
cout<<"是否继续测试(输入0则继续否则停止)";
cin>>q;
system("cls");
}
}
5.运行结果
无溢出时:
溢出时:对代码进行改动,在求和代码函数中*4294967296(也就是2的32次方) 这样在运行程序之后就会溢出,截图如下:
6、实验感想: 通过这次实验,我对程序分析和代码编程有了稍微深刻的印象,更加熟悉了这些流程,同时对上一课课堂老师讲的单元测试、代码测试有了进一步的认识,在进行不算短的代码编程时,应用代码测试看起来费力气,其实在后续工作中能够非常的方便检查错误,并且及时改正。否则代码一旦过长,根本找不到其中的错误出在哪儿。以后我会在编写较长的代码时每次应用单元测试。
7、小组合照: