软件工程课堂练习——结队开发二

结队人员:信1201-1班 曹美娜 盖相庚

这次的题目要求是在将上次实现的一位数组变成二维数组,然后找到所有子矩阵中各元素和的最大值。

一、设计思路

 我们是在上次实现一维数组的基础上做的更改,难点是怎么将所有二维子数组都遍历到,并找到他们和的最大值。所以我们的设计思路如下:

应题目要求首先从“xx.txt”中读取出二维数组比如:

   1   2   3

   4   5   6

   1   2  3

我们将数组第一行取出放到一个新的数组sumarry[][]中,然后第一行和第二行的和取出放到sumarry[][]中,然后是第一、二、三行的和放入,接着将第二行放入,和上次相同将二三行的行放入,最后再将第三行放入sumarry[][]中,形成一个新的数组,如下

1  2  3

5  7  9

6  9  12

4  5  6

5  7  9

1  2  3

然后和上次做的找到一位数组中和的最大值相同,把每一行看成一个一位数组找到最大的和,依次比较每一行的最大值,最后找到他们中的最大值即为我们要找到的二维数组中所有子矩阵中各元素和的最大值。

二、源代码

//程序开发者:曹美娜 盖相庚
//   开发时间:2015/3/23

#include "stdafx.h"
#include "fstream.h"
#include "iostream.h"
#include "stdio.h"
#define N 50
#define M 50

void readarry(int arry[][N],int &line,int &row)            //读取txt文件中的二维数组
{
    ifstream infile("a.txt");
    if(!infile)
        cout<<"读取失败!"<<endl;
    else
    {
        infile>>line>>row;
        for(int i=0;i<line;i++)
        {
            for(int j=0;j<row;j++)
            {
                infile>>arry[i][j];
            }
        }
    }
}

int maxarry(int arry[][N],int line,int row)       //找到二维数组中子矩阵中元素和的最大值
{
    int max[N];
    printf("以上数组经变形后:\n");
    for(int l=0;l<line;l++)                
    {
        int max1=-1000;
         for(int j=0;j<row;j++)
        {
            int sum=0;        
            for(int i=j;i<row;i++)
           {
                sum=sum+arry[l][i];
                if(sum>=max1)
                {
                    max1=sum;
                }
           }
                        
         }
             max[l]=max1;
             
            printf("第%d集合所有子数组的和的最大值为:%d\n",l+1,max1);
    }
    int fmax=max[0];
    for(int q=0;q<line;q++)
    {
        if(max[q]>fmax)
          fmax=max[q];
    }
     printf("所以次二位数字中子数组中各元素的和的最大值为:%d\n",fmax);
        
        return 0;
}

void show(int arry[][N],int line,int row)      //显示数组
{
    printf("从“a.txt”文件中读取的数组为:\n");
    for(int i=0;i<line;i++)
    {
        for(int j=0;j<row;j++)
        {
            printf("\t%d\t",arry[i][j]);
        }
        printf("\n");
    }
}

void reacharry(int arry[][N],int line,int row)      //组成一个新数组
{
    int sumarry[M][N];
    int sumline,sumrow;
    int z;
    for(int r=0;r<row;r++)
    {
        z=0;
        for(int i=0;i<line;i++)
        {
            for(int q=line;q>0;q--)
            {
                int sum=0;
                for(int j=i;j<=line-q+i;j++)
                {
                    sum=sum+arry[j][r];
                }            
                sumarry[z][r]=sum;
                z++;            
            }
        }
    }
    sumline=z-1;
    sumrow=r;    
    maxarry(sumarry,sumline,sumrow);      //将得到的新数组交给maxsrry(),找到最后结果

}


int main(int argc, char* argv[])
{
    int arry[M][N];
    int line,row;                 //行,列
    readarr(arry,line,row);
    show(arry,line,row);
    reacharry(arry,line,row);
    
   return 0;
}

三、实验心得

  由于这次是在一位数组的基础上改的题目,所以再和小伙伴讨论时思维总是在在一位数组那里,受到了限制,想着用类似上道题目的方法来实现,不过遇到了麻烦,就是如何将所有子矩阵都包含在内,不过在上课期间曹坤同学得想法给了我们思路,最后我们的小程序在我和盖盖同学的努力下完成,程序还有很多不足的地方,比如只是返回子矩阵的和的最大值,而没能返回对应的这个子矩阵,表示比较遗憾,以后我们有机会会完善的。再编程过程中我也有遇到麻烦,比如上面的那几个for循环嵌套,就一度把我整蒙,想了好长时间,最后还是在小伙伴的帮助下缕清楚。结队开发还是给了我很大帮助的,平实都是自己闷头敲代码,一旦出现逻辑上的错误自己是很难找到的,而且两个人都全身心的投入进去,把自己的想法和观点摆出来,会发现问题很容易解决,而且效率会更高。

四、工作照

  

posted @ 2015-03-25 21:03  。泡沫。。  阅读(167)  评论(1编辑  收藏  举报