代码改变世界

结对开发2

2015-03-22 12:48  奔波儿灞  阅读(184)  评论(1编辑  收藏  举报

题目:

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

要求:

输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为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;
}

三、运行结果

四、结对开发体会

        结对开发能减少寻找代码错误的时间,使我们能够有更多的时间来优化代码的功能。

五、工作照