结对开发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;

}

 

三、截图

四、总结

经过上一回的合作,这次实验比较顺利,有了一定的默契。

五、工作照

 

posted @ 2015-03-22 17:13  一叶落秋  阅读(108)  评论(0编辑  收藏  举报