软件工程课堂练习--结对开发

一、题目要求

题目:返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思路
这次的题目设计思路沿用的是上次一位数组的设计思想,把二维数组中的每一行看作是一位数组,然后做出扩展,程序依然用的是二维数组的那个,在这个基础上做出稍稍改变就行了
三、源代码
  1 //程序开发者:曹美娜 盖相庚
  2 //   开发时间:2015/3/31
  3 
  4 #include "stdafx.h"
  5 #include "fstream.h"
  6 #include "iostream.h"
  7 #include "stdio.h"
  8 #define N 50
  9 #define M 50
 10 
 11 void readarry(int arry[][N],int &line,int &row)            //读取txt文件中的二维数组
 12 {
 13     ifstream infile("a.txt");
 14     if(!infile)
 15         cout<<"读取失败!"<<endl;
 16     else
 17     {
 18         infile>>line>>row;
 19         for(int i=0;i<line;i++)
 20         {
 21             for(int j=0;j<row;j++)
 22             {
 23                 infile>>arry[i][j];
 24             }
 25         }
 26     }
 27 }
 28 
 29 int maxarry(int arry[][N],int line,int row)       //找到二维数组中子矩阵中元素和的最大值
 30 {
 31     int max[N];
 32     printf("以上数组经变形后:\n");
 33     for(int l=0;l<line;l++)                
 34     {
 35         int max1=-1000;
 36          for(int j=0;j<(row+1)/2;j++)
 37         {
 38             int sum=0;        
 39             for(int i=j;i<(row+1)/2;i++)
 40            {
 41                 sum=sum+arry[l][i];
 42                 if(sum>=max1)
 43                 {
 44                     max1=sum;
 45                 }
 46            }
 47                         
 48          }
 49              max[l]=max1;
 50              
 51             printf("第%d集合所有子数组的和的最大值为:%d\n",l+1,max1);
 52     }
 53     int fmax=max[0];
 54     for(int q=0;q<line;q++)
 55     {
 56         if(max[q]>fmax)
 57           fmax=max[q];
 58     }
 59      printf("所以次二位数字中子数组中各元素的和的最大值为:%d\n",fmax);
 60         
 61         return 0;
 62 }
 63 
 64 void reacharry(int arry[][N],int line,int row)      //组成一个新数组
 65 {
 66     int sumarry[M][N];
 67     int sumline,sumrow;
 68     int z;
 69     for(int r=0;r<row;r++)
 70     {
 71         z=0;
 72         for(int i=0;i<line;i++)
 73         {
 74             for(int q=line;q>0;q--)
 75             {
 76                 int sum=0;
 77                 for(int j=i;j<=line-q+i;j++)
 78                 {
 79                     sum=sum+arry[j][r];
 80                 }            
 81                 sumarry[z][r]=sum;
 82                 z++;            
 83             }
 84         }
 85     }
 86     sumline=z-1;
 87     sumrow=r;    
 88     maxarry(sumarry,sumline,sumrow);      //将得到的新数组交给maxsrry(),找到最后结果
 89 
 90 }
 91 
 92 int expand(int arry[][N],int &line,int &row)     //对二维数组进行拓展
 93 {
 94     int arry1[N][N];
 95     for(int i=0;i<line;i++)
 96     {
 97         for(int j=0;j<row;j++)
 98         {
 99             arry1[i][j]=arry[i][j];
100         }
101     }
102     int num=0;
103     for(i=0;i<line;i++)
104     {
105         for(int q=row;q<2*row-1;q++)
106         {
107             arry[i][q]=arry[i][num];
108             num++;
109         }
110     }
111     reacharry(arry1,line,2*row-1);
112 
113     return 0;
114 
115 }
116 
117 
118 
119 void show(int arry[][N],int line,int row)      //显示数组
120 {
121     printf("从“a.txt”文件中读取的数组为:\n");
122     for(int i=0;i<line;i++)
123     {
124         for(int j=0;j<row;j++)
125         {
126             printf("\t%d\t",arry[i][j]);
127         }
128         printf("\n");
129     }
130 }
131 
132 
133 
134 
135 int main(int argc, char* argv[])
136 {
137     int arry[M][N];
138     int line,row;                 //行,列
139     readarry(arry,line,row);
140     show(arry,line,row);
141     expand(arry,line,row);
142     
143    return 0;
144 }

四、截图

可能由于我没有讲拓展后的数组输出,所以读者可能看不太出来设计思路,其实设计思路在我上几篇博客中都有提到,这几个的程序设计思路都有所相同

五、心得体会

本次结对开发用时最短,因为是在上一次二维数组上做的拓展,所以思路捋起来很清晰,所以完成的也就快了,这次放假前老师说要要我们小小的放松一下,所以会有一下段时间不会在和我的小伙伴结对编程了,总结一下这几次的结对开发的想法吧,我的小伙伴还是很给力的,只不过是比较自谦,不太信任自己的能力,有时候想东西他也是要比我快的,思维要比我更活跃,希望盖盖同学好好努力,不要太早的为自己盖上标签。

结对开发就是要2个人把自己的想法、热情都交给对方,一开始老师叫我们这样练习的目的大家都认为太形式化,可是几次下来我想大家或多或少都会有自己的收获,都能从对方身上学到些东西,我想大家也会在这段时间里慢慢成长起来。

posted @ 2015-03-31 20:13  。泡沫。。  阅读(143)  评论(0编辑  收藏  举报