您的位置:首页 > 其它

结对开发之求二维数组的子数组的和的最大值2

2015-03-22 21:44 260 查看
小组成员:信1201-1班 黄亚萍

信1201-1班 袁亚姣

一、题目要求

程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:

数组的行数,

数组的列数,

每一行的元素, (用逗号分开)

每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数。

二、设计思路

在结对开发之体验中一维数组的子数组的和的最大值的基础上加以拓展:

(1)当子数组的维数为1时,在M*N的数组中有M个子数组,直接用一维数组的处理办法求出其最大值;

(2)当子数组的维数不为1时,第i行和第i+1行元素对应求和的方式,重新得到新的数组,重复(1)的操作,直到子数组就是原来的数组本身为止。

三、程序源代码

#include"stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
# define M 100
# define N 100
int hang1=0;
int hang2=0;
int lie1=0;
int lie2=0;
int maxx = -100;
int sum1(int k,int a[],int number)    //一维数组行数元素求和
{
int x=0;
for(int i=k;i<=number+k-1;i++)    //数组元素的个数为number
{
x=x+a[i];
}
return x;
}
int sum2(int k,int a[M]
,int number,int num)   //二维数组列数元素求和
{
int x=0;
for(int i=k;i<=number+k-1;i++)
{
x=x+a[i][num];
}
return x;
}
int Largest1(int list[],int length)         //一维数组求数组的子数组的和的最大值
{
int sum
;
int i,j,max=-100;
for(i=1;i<=length;i++)       //元素个数为i
{
for(j=1;j<=length-i+1;j++)   //子数组的第j个元素,求最大值
{
sum[j]=sum1(j,list,i);
if(sum[j]>=max)
{
max=sum[j];
}
}
}
return max;
}

void Largest3(int list[],int length)
{
int sum
;
int i,j;
for(i=1;i<=length;i++)
{
for(j=1;j<=length-i+1;j++)
{
sum[j]=sum1(j,list,i);
if(sum[j]>= maxx)
{
maxx=sum[j];
lie1 = j;
lie2 = j+i-1;
}
}
}
}

int Largest2(int list[M]
,int number_x,int number_y)   //二维数组求数组的子数组的和的最大值
{
int max,m;
int max2
;
int sum[M]
;
int max3
;
for(int i=1;i<=number_x;i++)   //数组行数为i
{
cout<<"子数组行数为"<<i<<","<<endl;

for(m=1;m<=number_x-i+1;m++)    //子数组的第一行为原数组的第m行
{
cout<<"    第"<< m <<"行的最大值为:";
for(int j=1;j<=number_y;j++)    //子数组第j列元素
{
sum[i][j]=sum2(m,list,i,j);
}
Largest3(sum[i],number_y);
max2[m]=Largest1(sum[i],number_y);    //数行数为i时子数组第m行的最大值
cout<<max2[m]<<endl;
max3[i]=max2[1];
for(int k=1;k<=i;k++)
{
if(max2[k]>=max3[i])
{
max3[i]=max2[k];
hang1=m;
}
}
}
}
max=max3[1];
for(int n=1;n<=number_x;n++)
{
if(max3
>=max)
{
max=max3
;
hang1=m;
hang2=n;      //子数组的行数为第m行到第m+n行

}
}
return max;
}
void show(int arry

,int length1,int length2)   //输出矩阵
{
for(int i=1;i<=length1;i++)
{
for(int j=1;j<=length2;j++)
{
cout<<arry[i][j]<<"\t";
}
cout<<endl;
}
}
int main(int argc, char* argv[])
{
int i,number_hang,number_lie;
int list[M]
;

ifstream infile("input.txt");
if(!infile)
cout<<"读取失败!"<<endl;
else
{
infile>>number_hang>>number_lie;
for(int i=1;i<=number_hang;i++)
{
for(int j=1;j<=number_lie;j++)
{
infile>>list[i][j];
}
}
}

cout<<"以矩阵形式展示为:"<<endl;
show(list,number_hang,number_lie);
cout<<endl;
cout<<"最大值为:"<<Largest2(list,number_hang,number_lie)<<endl;
cout<<endl;
cout<<"对应的最大值的子数组为:"<<endl;

for(i=hang1-1;i<hang2+hang1-1;i++)
{
for(int j=lie1;j<=lie2;j++)
{
cout<<list[i][j]<<"\t";
}
cout<<endl;
}
cout<<endl;
return 0;
}


四、结果截图





五、实验总结

本次实验是在上次结对开发的实验基础上进一步加工完善的,在完成的过程中,和队员一起构思完成设计思路与过程,让我了解到完成一个项目,只有先缕清思路,有一个清晰明白的流程,才能顺利的完成代码的编辑,调试,测试与结尾,才能达到事半功倍的效果;以前学习的过程中,拿到一个题目就开始敲代码,往往忽略了最重要的构思与设计部分,提示我们做事之前一定要有条理,不可盲目。

附件:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: