结对开发2
题目:返回一个二维整数数组中最大子数组的和。
要求:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
结对编程要求:两人结对完成编程任务。
一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
程序要使用的数组放在一个叫 input.txt 的文件中,
文件格式是:数组的行数,数组的列数,每一行的元素, (用逗号分开)
每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数。
一、设计思路
由郭庆樑负责程序分析,代码编程,我负责代码复审和代码测试。
程序解决思路是,先比较数组中单个元素的最大值,之后,再比较行相邻两个数相加的最大值,再比较列相邻两个数相加的最大值,即以第一行,第一列元素为中心,逐渐向整个矩阵扩展。最后,比较各个情况最大值,得出最终结果,同时,用数组记录各情况下最大值的初始坐标,最后获得最大值的坐标,根据情况输出组成元素。
二、代码
#include<stdio.h>
int max[100]={0};//存储最大值
int b[100]={1,1,1,1,1,1};//存储最大值的行坐标
int c[100]={1,1,1,1,1,1};//存储最大值的列坐标
int a[10][10];//存储文件中的数据
int line; //读取文件中的行
int row; //读取文件中的列
void Compare()//进行比较
{
int i,j;
int k=0;
int Max;
max[0]=a[0][0];
for(i=1;i<line;i++)
{
for(j=0;j<row;j++)
{
if(max[0]<a[i][j])
{
max[0]=a[i][j];
b[0]=i+1;
c[0]=j+1;
}
}
}
max[1]=a[0][0]+a[0][1];
for(i=0;i<line;i++)
{
for(j=0;j+1<row;j++)
{
if(max[1]<(a[i][j]+a[i][j+1]))
{
max[1]=a[i][j]+a[i][j+1];
b[1]=i+1;
c[1]=j+1;
}
}
}
max[2]=a[0][0]+a[1][0];
for(j=0;j<row;j++)
{
for(i=0;i+1<line;i++)
{
if(max[2]<(a[i][j]+a[i+1][j]))
{
max[2]=a[i][j]+a[i+1][j];
b[2]=i+1;
c[2]=j+1;
}
}
}
max[3]=a[0][0]+a[0][1]+a[0][2];
for(i=0;i<line;i++)
{
for(j=0;j+2<row;j++)
{
if(max[3]<(a[i][j]+a[i][j+1]+a[i][j+2]))
{
max[3]=a[i][j]+a[i][j+1]+a[i][j+2];
b[3]=i+1;
c[3]=j+1;
}
}
}
max[4]=a[0][0]+a[0][1]+a[1][0]+a[1][1];
for(i=0;i+1<line;i++)
{
for(j=0;j+1<row;j++)
{
if(max[4]<(a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1]))
{
max[4]=a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1];
b[4]=i+1;
c[4]=i+1;
}
}
}
for(i=0;i<line;i++)
{
for(j=0;j<row;j++)
{
max[5]=max[5]+a[i][j];
}
}
b[5]=1;
c[5]=1;
Max=max[0];
for(i=1;i<6;i++)
{
if(Max<max[i])
{
Max=max[i];
k=i;
}
}
printf("最大值为:%d\n",Max);
printf("最大值起始位置为%d行,%d列\n",b[k],c[k]);
switch(k)
{
case 0:printf("最大值由1个元素组成\n");break;
case 1:printf("最大值由2个同行元素组成\n");break;
case 2:printf("最大值由2个同列元素组成\n");break;
case 3:printf("最大值由3个同行元素组成\n");break;
case 4:printf("最大值由2行2列元素组成\n");break;
case 5:printf("最大值由全体元素组成\n");break;
default:break;
}
}
int main()
{
int i,j;
FILE *fp;
fp=fopen("input.txt","r");
if(fp==NULL)
{
printf("File open failed!\n");
return 0;
}
fscanf(fp,"%d",&line);
fscanf(fp,"%d",&row);
for(i=0;i<line;i++)
{
for(j=0;j<row;j++)
{
fscanf(fp,"%d",&a[i][j]);
}
}
printf("数组元素为:\n");
for(i=0;i<line;i++)
{
for(j=0;j<row;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
fclose(fp);
Compare();
return 0;
}
三、截图
四、总结
经过上一回的合作,这次实验比较顺利,有了一定的默契。
五、工作照